From d6d2f68e3801760646ac02117f2467382a310d61 Mon Sep 17 00:00:00 2001 From: Nick Graves Date: Thu, 13 Mar 2025 20:31:59 +0000 Subject: [PATCH 0001/1172] ArmPkg/Drivers/ArmGicDxe: Add Extended SPI support for GICv3 This commit enables extended SPI support for GicV3. GicV3 must decide, based on the source intid, whether to access the SPI-range registers, PPI-range registers in the redistributor, or the extended SPI-range registers. The protocol interfaces must also support registering an interrupt handler with an extended SPI intid. To save ~24KB of memory, handler allocation and access is delegated to GicV2 and GicV3. GicV2 retains the existing handler mapping scheme using intids literally. GicV3 remaps extended SPI intids to be immediately after the highest SPI intids. Tested on qemu with the BSA test suite. Signed-off-by: Nick Graves --- ArmPkg/Drivers/ArmGicDxe/ArmGicCommonDxe.c | 121 +++-- ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h | 82 +++- ArmPkg/Drivers/ArmGicDxe/GicV2/ArmGicV2Dxe.c | 68 ++- ArmPkg/Drivers/ArmGicDxe/GicV3/ArmGicV3Dxe.c | 445 ++++++++++++++----- ArmPkg/Include/Library/ArmGicLib.h | 68 ++- 5 files changed, 585 insertions(+), 199 deletions(-) diff --git a/ArmPkg/Drivers/ArmGicDxe/ArmGicCommonDxe.c b/ArmPkg/Drivers/ArmGicDxe/ArmGicCommonDxe.c index f40797b734ef..fe0442b4ce12 100644 --- a/ArmPkg/Drivers/ArmGicDxe/ArmGicCommonDxe.c +++ b/ArmPkg/Drivers/ArmGicDxe/ArmGicCommonDxe.c @@ -7,6 +7,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent --*/ #include "ArmGicDxe.h" +#include "Uefi/UefiBaseType.h" // Making this global saves a few bytes in image size EFI_HANDLE gHardwareInterruptHandle = NULL; @@ -14,11 +15,55 @@ EFI_HANDLE gHardwareInterruptHandle = NULL; // Notifications EFI_EVENT EfiExitBootServicesEvent = (EFI_EVENT)NULL; -// Maximum Number of Interrupts -UINTN mGicNumInterrupts = 0; +EFI_CPU_ARCH_PROTOCOL *gCpuArch; -HARDWARE_INTERRUPT_HANDLER *gRegisteredInterruptHandlers = NULL; -EFI_CPU_ARCH_PROTOCOL *gCpuArch; +/** + * + * Return whether the Source interrupt index refers to an extended shared + * interrupt. + * + * @param Source The source intid to test + * + * @return True if Source is an extended SPI intid, false otherwise. + */ +BOOLEAN +GicCommonSourceIsExtSpi ( + IN UINTN Source + ) +{ + return Source >= ARM_GIC_ARCH_EXT_SPI_MIN && Source <= ARM_GIC_ARCH_EXT_SPI_MAX; +} + +/** + * Return whether this is a special interrupt. + * + * @param Source The source intid to test + * + * @return True if Source is a special interrupt intid, false otherwise. + */ +BOOLEAN +GicCommonSourceIsSpecialInterrupt ( + IN UINTN Source + ) +{ + return (Source >= 1020) && (Source <= 1023); +} + +/** + * + * Return whether the Source interrupt index refers to a shared interrupt (SPI) + * + * @param Source The source intid to test + * + * @return True if Source is a SPI intid, false otherwise. + */ +BOOLEAN +GicCommonSourceIsSpi ( + IN UINTN Source + ) +{ + return (Source >= ARM_GIC_ARCH_SPI_MIN) && (Source <= ARM_GIC_ARCH_SPI_MAX); +} /** Calculate GICD_ICFGRn base address and corresponding bit @@ -32,24 +77,26 @@ EFI_CPU_ARCH_PROTOCOL *gCpuArch; @retval EFI_UNSUPPORTED Source interrupt is not supported. **/ EFI_STATUS -GicGetDistributorIcfgBaseAndBit ( +GicCommonGetDistributorIcfgBaseAndBit ( IN HARDWARE_INTERRUPT_SOURCE Source, OUT UINTN *RegAddress, OUT UINTN *Config1Bit ) { - UINTN RegIndex; - UINTN Field; + UINTN RegIndex; + UINTN Field; + UINTN RegOffset; + HARDWARE_INTERRUPT_SOURCE AdjustedSource; - if (Source >= mGicNumInterrupts) { - ASSERT (Source < mGicNumInterrupts); - return EFI_UNSUPPORTED; - } + // Translate ESPI sources into the SPI range for indexing purposes. + AdjustedSource = Source & ~(ARM_GIC_ARCH_EXT_SPI_MIN); + + RegOffset = (GicCommonSourceIsExtSpi (Source)) ? ARM_GIC_ICDICFR_E : ARM_GIC_ICDICFR; - RegIndex = Source / ARM_GIC_ICDICFR_F_STRIDE; // NOTE: truncation is significant - Field = Source % ARM_GIC_ICDICFR_F_STRIDE; + RegIndex = AdjustedSource / ARM_GIC_ICDICFR_F_STRIDE; // NOTE: truncation is significant + Field = AdjustedSource % ARM_GIC_ICDICFR_F_STRIDE; *RegAddress = (UINTN)PcdGet64 (PcdGicDistributorBase) - + ARM_GIC_ICDICFR + + RegOffset + (ARM_GIC_ICDICFR_BYTES * RegIndex); *Config1Bit = ((Field * ARM_GIC_ICDICFR_F_WIDTH) + ARM_GIC_ICDICFR_F_CONFIG1_BIT); @@ -60,9 +107,10 @@ GicGetDistributorIcfgBaseAndBit ( /** Register Handler for the specified interrupt source. - @param This Instance pointer for this protocol - @param Source Hardware source of the interrupt - @param Handler Callback for interrupt. NULL to unregister + @param This Instance pointer for this protocol + @param Source Hardware source of the interrupt + @param Handler Callback for interrupt. NULL to unregister + @param HandlerDest Address of where to store Handler. @retval EFI_SUCCESS Source was updated to support Handler. @retval EFI_DEVICE_ERROR Hardware could not be programmed. @@ -70,58 +118,53 @@ GicGetDistributorIcfgBaseAndBit ( **/ EFI_STATUS EFIAPI -RegisterInterruptSource ( +GicCommonRegisterInterruptSource ( IN EFI_HARDWARE_INTERRUPT_PROTOCOL *This, IN HARDWARE_INTERRUPT_SOURCE Source, - IN HARDWARE_INTERRUPT_HANDLER Handler + IN HARDWARE_INTERRUPT_HANDLER Handler, + IN HARDWARE_INTERRUPT_HANDLER *HandlerDest ) { - if (Source >= mGicNumInterrupts) { - ASSERT (FALSE); - return EFI_UNSUPPORTED; + EFI_STATUS Status; + + if (HandlerDest == NULL) { + return EFI_INVALID_PARAMETER; } - if ((Handler == NULL) && (gRegisteredInterruptHandlers[Source] == NULL)) { + if ((Handler == NULL) && (*HandlerDest == NULL)) { return EFI_INVALID_PARAMETER; } - if ((Handler != NULL) && (gRegisteredInterruptHandlers[Source] != NULL)) { + if ((Handler != NULL) && (*HandlerDest != NULL)) { return EFI_ALREADY_STARTED; } - gRegisteredInterruptHandlers[Source] = Handler; - - // If the interrupt handler is unregistered then disable the interrupt if (NULL == Handler) { - return This->DisableInterruptSource (This, Source); + // Removing the handler - disable the interrupt first. + Status = This->DisableInterruptSource (This, Source); + *HandlerDest = Handler; + return Status; } else { + // Registering a handler - set up the handler before enabling. + *HandlerDest = Handler; return This->EnableInterruptSource (This, Source); } } EFI_STATUS -InstallAndRegisterInterruptService ( +GicCommonInstallAndRegisterInterruptService ( IN EFI_HARDWARE_INTERRUPT_PROTOCOL *InterruptProtocol, IN EFI_HARDWARE_INTERRUPT2_PROTOCOL *Interrupt2Protocol, IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler, IN EFI_EVENT_NOTIFY ExitBootServicesEvent ) { - EFI_STATUS Status; - CONST UINTN RihArraySize = - (sizeof (HARDWARE_INTERRUPT_HANDLER) * mGicNumInterrupts); - - // Initialize the array for the Interrupt Handlers - gRegisteredInterruptHandlers = AllocateZeroPool (RihArraySize); - if (gRegisteredInterruptHandlers == NULL) { - return EFI_OUT_OF_RESOURCES; - } + EFI_STATUS Status; // Register to receive interrupts Status = gCpuArch->RegisterInterruptHandler (gCpuArch, ARM_ARCH_EXCEPTION_IRQ, InterruptHandler); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "%a: Cpu->RegisterInterruptHandler() - %r\n", __func__, Status)); - FreePool (gRegisteredInterruptHandlers); return Status; } diff --git a/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h b/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h index 4ae46e7c9049..dba0d322c7d1 100644 --- a/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h +++ b/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h @@ -21,42 +21,80 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include -extern UINTN mGicNumInterrupts; -extern HARDWARE_INTERRUPT_HANDLER *gRegisteredInterruptHandlers; -extern EFI_CPU_ARCH_PROTOCOL *gCpuArch; +extern EFI_CPU_ARCH_PROTOCOL *gCpuArch; -// Common API +// GicV2 API EFI_STATUS -InstallAndRegisterInterruptService ( - IN EFI_HARDWARE_INTERRUPT_PROTOCOL *InterruptProtocol, - IN EFI_HARDWARE_INTERRUPT2_PROTOCOL *Interrupt2Protocol, - IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler, - IN EFI_EVENT_NOTIFY ExitBootServicesEvent +GicV2DxeInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable ); +// GicV3 API +EFI_STATUS +GicV3DxeInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ); + +// Shared code + EFI_STATUS EFIAPI -RegisterInterruptSource ( +GicCommonRegisterInterruptSource ( IN EFI_HARDWARE_INTERRUPT_PROTOCOL *This, IN HARDWARE_INTERRUPT_SOURCE Source, - IN HARDWARE_INTERRUPT_HANDLER Handler + IN HARDWARE_INTERRUPT_HANDLER Handler, + IN HARDWARE_INTERRUPT_HANDLER *HandlerDest ); -// GicV2 API EFI_STATUS -GicV2DxeInitialize ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +EFIAPI +GicCommonInstallAndRegisterInterruptService ( + IN EFI_HARDWARE_INTERRUPT_PROTOCOL *InterruptProtocol, + IN EFI_HARDWARE_INTERRUPT2_PROTOCOL *Interrupt2Protocol, + IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler, + IN EFI_EVENT_NOTIFY ExitBootServicesEvent ); -// GicV3 API -EFI_STATUS -GicV3DxeInitialize ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +/** + * + * Return whether the Source interrupt index refers to an extended shared + * interrupt. + * + * @param Source The source intid to test + * + * @return True if Source is an extended SPI intid, false otherwise. + */ +BOOLEAN +GicCommonSourceIsExtSpi ( + IN UINTN Source ); -// Shared code +/** + * Return whether this is a special interrupt. + * + * @param Source The source intid to test + * + * @return True if Source is a special interrupt intid, false otherwise. + */ +BOOLEAN +GicCommonSourceIsSpecialInterrupt ( + IN UINTN Source + ); + +/** + * + * Return whether the Source interrupt index refers to a shared interrupt (SPI) + * + * @param Source The source intid to test + * + * @return True if Source is a SPI intid, false otherwise. + */ +BOOLEAN +GicCommonSourceIsSpi ( + IN UINTN Source + ); /** Calculate GICD_ICFGRn base address and corresponding bit @@ -70,7 +108,7 @@ GicV3DxeInitialize ( @retval EFI_UNSUPPORTED Source interrupt is not supported. **/ EFI_STATUS -GicGetDistributorIcfgBaseAndBit ( +GicCommonGetDistributorIcfgBaseAndBit ( IN HARDWARE_INTERRUPT_SOURCE Source, OUT UINTN *RegAddress, OUT UINTN *Config1Bit diff --git a/ArmPkg/Drivers/ArmGicDxe/GicV2/ArmGicV2Dxe.c b/ArmPkg/Drivers/ArmGicDxe/GicV2/ArmGicV2Dxe.c index 6dabece1da55..68f8bdccd24a 100644 --- a/ArmPkg/Drivers/ArmGicDxe/GicV2/ArmGicV2Dxe.c +++ b/ArmPkg/Drivers/ArmGicDxe/GicV2/ArmGicV2Dxe.c @@ -19,23 +19,34 @@ Module Name: #include #include "ArmGicDxe.h" +#include "Protocol/HardwareInterrupt.h" +#include "Uefi/UefiBaseType.h" #define ARM_GIC_DEFAULT_PRIORITY 0x80 #define GICD_V2_SIZE SIZE_4KB #define GICC_V2_SIZE SIZE_8KB -// Interrupts from 1020 to 1023 are considered as special interrupts -// (eg: spurious interrupts) -#define ARM_GIC_IS_SPECIAL_INTERRUPTS(Interrupt) \ - (((Interrupt) >= 1020) && ((Interrupt) <= 1023)) - extern EFI_HARDWARE_INTERRUPT_PROTOCOL gHardwareInterruptV2Protocol; extern EFI_HARDWARE_INTERRUPT2_PROTOCOL gHardwareInterrupt2V2Protocol; STATIC UINTN mGicInterruptInterfaceBase; STATIC UINTN mGicDistributorBase; +// Maximum Number of Interrupts +STATIC UINTN mGicNumInterrupts; +STATIC HARDWARE_INTERRUPT_HANDLER *mRegisteredInterruptHandlers; + +STATIC +BOOLEAN +EFIAPI +GicIsValidSource ( + IN HARDWARE_INTERRUPT_SOURCE Source + ) +{ + return Source < mGicNumInterrupts; +} + STATIC VOID ArmGicEnableInterrupt ( @@ -270,7 +281,7 @@ GicV2IrqInterruptHandler ( return; } - InterruptHandler = gRegisteredInterruptHandlers[GicInterrupt]; + InterruptHandler = mRegisteredInterruptHandlers[GicInterrupt]; if (InterruptHandler != NULL) { // Call the registered interrupt handler. InterruptHandler (GicInterrupt, SystemContext); @@ -280,9 +291,26 @@ GicV2IrqInterruptHandler ( } } +STATIC +EFI_STATUS +EFIAPI +GicV2RegisterInterruptSource ( + IN EFI_HARDWARE_INTERRUPT_PROTOCOL *This, + IN HARDWARE_INTERRUPT_SOURCE Source, + IN HARDWARE_INTERRUPT_HANDLER Handler + ) +{ + return GicCommonRegisterInterruptSource ( + This, + Source, + Handler, + &mRegisteredInterruptHandlers[Source] + ); +} + // The protocol instance produced by this driver EFI_HARDWARE_INTERRUPT_PROTOCOL gHardwareInterruptV2Protocol = { - RegisterInterruptSource, + GicV2RegisterInterruptSource, GicV2EnableInterruptSource, GicV2DisableInterruptSource, GicV2GetInterruptSourceState, @@ -312,7 +340,11 @@ GicV2GetTriggerType ( UINTN Config1Bit; EFI_STATUS Status; - Status = GicGetDistributorIcfgBaseAndBit ( + if (!GicIsValidSource (Source)) { + return EFI_UNSUPPORTED; + } + + Status = GicCommonGetDistributorIcfgBaseAndBit ( Source, &RegAddress, &Config1Bit @@ -368,7 +400,11 @@ GicV2SetTriggerType ( return EFI_UNSUPPORTED; } - Status = GicGetDistributorIcfgBaseAndBit ( + if (!GicIsValidSource (Source)) { + return EFI_UNSUPPORTED; + } + + Status = GicCommonGetDistributorIcfgBaseAndBit ( Source, &RegAddress, &Config1Bit @@ -428,7 +464,7 @@ ArmGicEnableDistributor ( } EFI_HARDWARE_INTERRUPT2_PROTOCOL gHardwareInterrupt2V2Protocol = { - (HARDWARE_INTERRUPT2_REGISTER)RegisterInterruptSource, + (HARDWARE_INTERRUPT2_REGISTER)GicV2RegisterInterruptSource, (HARDWARE_INTERRUPT2_ENABLE)GicV2EnableInterruptSource, (HARDWARE_INTERRUPT2_DISABLE)GicV2DisableInterruptSource, (HARDWARE_INTERRUPT2_INTERRUPT_STATE)GicV2GetInterruptSourceState, @@ -493,7 +529,7 @@ GicV2ExitBootServicesEvent ( if ((GicInterrupt & ARM_GIC_ICCIAR_ACKINTID) < mGicNumInterrupts) { GicV2EndOfInterrupt (&gHardwareInterruptV2Protocol, GicInterrupt); } - } while (!ARM_GIC_IS_SPECIAL_INTERRUPTS (GicInterrupt)); + } while (!GicCommonSourceIsSpecialInterrupt (GicInterrupt)); // Disable Gic Interface ArmGicV2DisableInterruptInterface (mGicInterruptInterfaceBase); @@ -604,12 +640,20 @@ GicV2DxeInitialize ( // Enable gic distributor ArmGicEnableDistributor (mGicDistributorBase); - Status = InstallAndRegisterInterruptService ( + mRegisteredInterruptHandlers = AllocateZeroPool (mGicNumInterrupts * sizeof (HARDWARE_INTERRUPT_HANDLER)); + if (mRegisteredInterruptHandlers == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + Status = GicCommonInstallAndRegisterInterruptService ( &gHardwareInterruptV2Protocol, &gHardwareInterrupt2V2Protocol, GicV2IrqInterruptHandler, GicV2ExitBootServicesEvent ); + if (EFI_ERROR (Status)) { + FreePool (mRegisteredInterruptHandlers); + } return Status; } diff --git a/ArmPkg/Drivers/ArmGicDxe/GicV3/ArmGicV3Dxe.c b/ArmPkg/Drivers/ArmGicDxe/GicV3/ArmGicV3Dxe.c index 798b01d0d6d5..8aed686e3f62 100644 --- a/ArmPkg/Drivers/ArmGicDxe/GicV3/ArmGicV3Dxe.c +++ b/ArmPkg/Drivers/ArmGicDxe/GicV3/ArmGicV3Dxe.c @@ -9,6 +9,9 @@ #include #include "ArmGicDxe.h" +#include "Base.h" +#include "Protocol/HardwareInterrupt.h" +#include "Uefi/UefiBaseType.h" #define ARM_GIC_DEFAULT_PRIORITY 0x80 @@ -25,33 +28,15 @@ #define GICD_V3_SIZE SIZE_64KB -#define ISENABLER_ADDRESS(base, offset) ((base) +\ - ARM_GICR_CTLR_FRAME_SIZE + ARM_GICR_ISENABLER + 4 * (offset)) - -#define ICENABLER_ADDRESS(base, offset) ((base) +\ - ARM_GICR_CTLR_FRAME_SIZE + ARM_GICR_ICENABLER + 4 * (offset)) - -#define IPRIORITY_ADDRESS(base, offset) ((base) +\ - ARM_GICR_CTLR_FRAME_SIZE + ARM_GIC_ICDIPR + 4 * (offset)) - extern EFI_HARDWARE_INTERRUPT_PROTOCOL gHardwareInterruptV3Protocol; extern EFI_HARDWARE_INTERRUPT2_PROTOCOL gHardwareInterrupt2V3Protocol; STATIC UINTN mGicDistributorBase; STATIC UINTN mGicRedistributorBase; -/** - * - * Return whether the Source interrupt index refers to a shared interrupt (SPI) - */ -STATIC -BOOLEAN -SourceIsSpi ( - IN UINTN Source - ) -{ - return Source >= 32 && Source < 1020; -} +STATIC HARDWARE_INTERRUPT_HANDLER *mRegisteredInterruptHandlers; +STATIC UINTN mGicMaxSpiIntId; +STATIC UINTN mGicMaxExtSpiIntId; /** * Return the base address of the GIC redistributor for the current CPU @@ -121,6 +106,109 @@ GicGetCpuRedistributorBase ( return 0; } +typedef enum { + GicOpSetInterruptPriority, + GicOpEnableInterrupt, + GicOpDisableInterrupt, + GicOpIsInterruptEnabled, + GicOpNumOps, +} GIC_REG_OPERATIONS; + +typedef struct { + GIC_REG_OPERATIONS Operation; // Self-referential operation. + UINT16 RegisterWidthBits; // Width of the register. Same for all types. + UINT16 FieldWidthBits; // Bits per IntId within the register. + UINTN DistributorSpiOffset; // Offset from the GIC distributor base for SPIs. + UINTN DistributorExtSpiOffset; // Offset from the GIC distributor base for Extended SPIs. + UINTN RedistributorOffset; // Offset from the GIC redistributor base for non-shared interrupts. +} GIC_REG_OPERATION_CONFIG; + +// Order of the array is important as mGicOperationConfigMap is indexed by +// GIC_REG_OPERATIONS. +STATIC CONST GIC_REG_OPERATION_CONFIG mGicOperationConfigMap[GicOpNumOps] = { + [GicOpSetInterruptPriority] = { + .Operation = GicOpSetInterruptPriority, + .RegisterWidthBits = 32, + .FieldWidthBits = 8, + .DistributorSpiOffset = ARM_GIC_ICDIPR, + .DistributorExtSpiOffset = ARM_GIC_ICDIPR_E, + .RedistributorOffset = ARM_GIC_ICDIPR, + }, + [GicOpEnableInterrupt] = { + .Operation = GicOpEnableInterrupt, + .RegisterWidthBits = 32, + .FieldWidthBits = 1, + .DistributorSpiOffset = ARM_GIC_ICDISER, + .DistributorExtSpiOffset = ARM_GIC_ICDISER_E, + .RedistributorOffset = ARM_GICR_ISENABLER, + }, + [GicOpDisableInterrupt] = { + .Operation = GicOpDisableInterrupt, + .RegisterWidthBits = 32, + .FieldWidthBits = 1, + .DistributorSpiOffset = ARM_GIC_ICDICER, + .DistributorExtSpiOffset = ARM_GIC_ICDICER_E, + .RedistributorOffset = ARM_GICR_ICENABLER, + }, + [GicOpIsInterruptEnabled] = { + .Operation = GicOpIsInterruptEnabled, + .RegisterWidthBits = 32, + .FieldWidthBits = 1, + .DistributorSpiOffset = ARM_GIC_ICDISER, + .DistributorExtSpiOffset = ARM_GIC_ICDISER_E, + .RedistributorOffset = ARM_GICR_ISENABLER, + }, +}; + +// Struct describing a bitwise address in the GIC. +typedef struct { + UINTN Address; // MMIO address for the register. + UINT32 Shift; // Position in the register of the lowest included bit. + UINT32 Mask; // Mask of the included bits stating at the position of Shift. +} GIC_BITWISE_ADDRESS; + +/** + * Gets a bitwise address for the given intid Source and Operation. + * + * A bitwise address contains all of the information to extract the relevant + * field from a MMIO register, such as the position and bitmask for the field. + * + * @param [in] Source Hardware source of the interrupt + * @param [in] Operation GIC_REG_OPERATION requested for this interrupt. + * @param [out] BitwiseAddress Fully-specified address and mask to populate. +**/ +STATIC +VOID +EFIAPI +GicGetBitwiseAddress ( + IN UINTN Source, + GIC_REG_OPERATIONS Operation, + OUT GIC_BITWISE_ADDRESS *BitwiseAddress + ) +{ + UINT32 RegOffset; + UINT32 IntIdsPerRegister; + CONST GIC_REG_OPERATION_CONFIG *OpConfig; + + ASSERT (BitwiseAddress != NULL); + ASSERT (Operation < GicOpNumOps); + + OpConfig = &mGicOperationConfigMap[Operation]; + IntIdsPerRegister = (UINT32)(OpConfig->RegisterWidthBits / OpConfig->FieldWidthBits); + + BitwiseAddress->Shift = (UINT32)((Source & ~ARM_GIC_ARCH_EXT_SPI_MIN) % IntIdsPerRegister) * OpConfig->FieldWidthBits; + BitwiseAddress->Mask = (UINT32)(((UINT64)1 << OpConfig->FieldWidthBits) - 1); + + RegOffset = (UINT32)((Source & ~ARM_GIC_ARCH_EXT_SPI_MIN) / IntIdsPerRegister); + if (GicCommonSourceIsSpi (Source)) { + BitwiseAddress->Address = mGicDistributorBase + OpConfig->DistributorSpiOffset + (4 * RegOffset); + } else if (GicCommonSourceIsExtSpi (Source)) { + BitwiseAddress->Address = mGicDistributorBase + OpConfig->DistributorExtSpiOffset + (4 * RegOffset); + } else { + BitwiseAddress->Address = mGicRedistributorBase + ARM_GICR_CTLR_FRAME_SIZE + OpConfig->RedistributorOffset + (4 * RegOffset); + } +} + STATIC VOID ArmGicSetInterruptPriority ( @@ -128,26 +216,16 @@ ArmGicSetInterruptPriority ( IN UINT32 Priority ) { - UINT32 RegOffset; - UINT8 RegShift; - - // Calculate register offset and bit position - RegOffset = (UINT32)(Source / 4); - RegShift = (UINT8)((Source % 4) * 8); - - if (SourceIsSpi (Source)) { - MmioAndThenOr32 ( - mGicDistributorBase + ARM_GIC_ICDIPR + (4 * RegOffset), - ~(0xff << RegShift), - Priority << RegShift - ); - } else { - MmioAndThenOr32 ( - IPRIORITY_ADDRESS (mGicRedistributorBase, RegOffset), - ~(0xff << RegShift), - Priority << RegShift - ); - } + GIC_BITWISE_ADDRESS BitwiseAddress; + + GicGetBitwiseAddress (Source, GicOpSetInterruptPriority, &BitwiseAddress); + + Priority &= BitwiseAddress.Mask; + MmioAndThenOr32 ( + BitwiseAddress.Address, + ~(BitwiseAddress.Mask << BitwiseAddress.Shift), + Priority << BitwiseAddress.Shift + ); } STATIC @@ -156,26 +234,15 @@ ArmGicEnableInterrupt ( IN UINTN Source ) { - UINT32 RegOffset; - UINT8 RegShift; + GIC_BITWISE_ADDRESS BitwiseAddress; - // Calculate enable register offset and bit position - RegOffset = (UINT32)(Source / 32); - RegShift = (UINT8)(Source % 32); + GicGetBitwiseAddress (Source, GicOpEnableInterrupt, &BitwiseAddress); - if (SourceIsSpi (Source)) { - // Write set-enable register - MmioWrite32 ( - mGicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset), - 1 << RegShift - ); - } else { - // Write set-enable register - MmioWrite32 ( - ISENABLER_ADDRESS (mGicRedistributorBase, RegOffset), - 1 << RegShift - ); - } + // Write set-enable register. + MmioWrite32 ( + BitwiseAddress.Address, + BitwiseAddress.Mask << BitwiseAddress.Shift + ); } STATIC @@ -184,26 +251,15 @@ ArmGicDisableInterrupt ( IN UINTN Source ) { - UINT32 RegOffset; - UINT8 RegShift; + GIC_BITWISE_ADDRESS BitwiseAddress; - // Calculate enable register offset and bit position - RegOffset = (UINT32)(Source / 32); - RegShift = (UINT8)(Source % 32); + GicGetBitwiseAddress (Source, GicOpDisableInterrupt, &BitwiseAddress); - if (SourceIsSpi (Source)) { - // Write clear-enable register - MmioWrite32 ( - mGicDistributorBase + ARM_GIC_ICDICER + (4 * RegOffset), - 1 << RegShift - ); - } else { - // Write clear-enable register - MmioWrite32 ( - ICENABLER_ADDRESS (mGicRedistributorBase, RegOffset), - 1 << RegShift - ); - } + // Write clear-enable register + MmioWrite32 ( + BitwiseAddress.Address, + BitwiseAddress.Mask << BitwiseAddress.Shift + ); } STATIC @@ -212,26 +268,58 @@ ArmGicIsInterruptEnabled ( IN UINTN Source ) { - UINT32 RegOffset; - UINT8 RegShift; - UINT32 Interrupts; - - // Calculate enable register offset and bit position - RegOffset = (UINT32)(Source / 32); - RegShift = (UINT8)(Source % 32); - - if (SourceIsSpi (Source)) { - Interrupts = MmioRead32 ( - mGicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset) - ); + UINT32 Interrupts; + GIC_BITWISE_ADDRESS BitwiseAddress; + + GicGetBitwiseAddress (Source, GicOpIsInterruptEnabled, &BitwiseAddress); + + // Read set-enable register + Interrupts = MmioRead32 (BitwiseAddress.Address); + + return ((Interrupts & (BitwiseAddress.Mask << BitwiseAddress.Shift)) != 0); +} + +STATIC +BOOLEAN +EFIAPI +GicIsValidSource ( + IN HARDWARE_INTERRUPT_SOURCE Source + ) +{ + if (Source <= mGicMaxSpiIntId) { + return TRUE; + } + + return (Source >= ARM_GIC_ARCH_EXT_SPI_MIN && Source <= mGicMaxExtSpiIntId); +} + +STATIC +EFI_STATUS +EFIAPI +GicV3GetValidIntIdRanges ( + IN UINTN GicDistributorBase, + OUT UINTN *GicMaxSpiIntId, + OUT UINTN *GicMaxExtSpiIntId + ) +{ + UINT32 GicTyperReg; + + if ((GicMaxSpiIntId == NULL) || (GicMaxExtSpiIntId == NULL)) { + return EFI_INVALID_PARAMETER; + } + + // Read GIC_TYPER to determine if extended SPI is enabled. If so, get the + // maximum extended SPI INTID. + GicTyperReg = MmioRead32 (GicDistributorBase + ARM_GIC_ICDICTR); + *GicMaxSpiIntId = ARM_GIC_ICDICTR_GET_SPI_MAX_INTID (GicTyperReg); + + if ((GicTyperReg & ARM_GIC_ICDICTR_EXT_SPI_ENABLED) != 0) { + *GicMaxExtSpiIntId = ARM_GIC_ICDICTR_GET_EXT_SPI_MAX_INTID (GicTyperReg); } else { - // Read set-enable register - Interrupts = MmioRead32 ( - ISENABLER_ADDRESS (mGicRedistributorBase, RegOffset) - ); + *GicMaxExtSpiIntId = 0; } - return ((Interrupts & (1 << RegShift)) != 0); + return EFI_SUCCESS; } /** @@ -252,7 +340,7 @@ GicV3EnableInterruptSource ( IN HARDWARE_INTERRUPT_SOURCE Source ) { - if (Source >= mGicNumInterrupts) { + if (!GicIsValidSource (Source)) { ASSERT (FALSE); return EFI_UNSUPPORTED; } @@ -280,7 +368,7 @@ GicV3DisableInterruptSource ( IN HARDWARE_INTERRUPT_SOURCE Source ) { - if (Source >= mGicNumInterrupts) { + if (!GicIsValidSource (Source)) { ASSERT (FALSE); return EFI_UNSUPPORTED; } @@ -310,7 +398,7 @@ GicV3GetInterruptSourceState ( IN BOOLEAN *InterruptState ) { - if (Source >= mGicNumInterrupts) { + if (!GicIsValidSource (Source)) { ASSERT (FALSE); return EFI_UNSUPPORTED; } @@ -339,7 +427,7 @@ GicV3EndOfInterrupt ( IN HARDWARE_INTERRUPT_SOURCE Source ) { - if (Source >= mGicNumInterrupts) { + if (!GicIsValidSource (Source)) { ASSERT (FALSE); return EFI_UNSUPPORTED; } @@ -348,6 +436,34 @@ GicV3EndOfInterrupt ( return EFI_SUCCESS; } +/** + Gets the address of the interrupt callback associated with Source. + + @param Source IntId of the interrupt. + + @return Pointer to the associated handler + NULL if the source is invalid. +**/ +STATIC +HARDWARE_INTERRUPT_HANDLER * +EFIAPI +GicV3GetHandlerAddress ( + IN HARDWARE_INTERRUPT_SOURCE Source + ) +{ + if (!GicIsValidSource (Source)) { + return NULL; + } + + if (GicCommonSourceIsExtSpi (Source)) { + return &mRegisteredInterruptHandlers[ + Source - ARM_GIC_ARCH_EXT_SPI_MIN + mGicMaxSpiIntId + 1 + ]; + } + + return &mRegisteredInterruptHandlers[Source]; +} + /** EFI_CPU_INTERRUPT_HANDLER that is called when a processor interrupt occurs. @@ -369,30 +485,55 @@ GicV3IrqInterruptHandler ( ) { UINTN GicInterrupt; - HARDWARE_INTERRUPT_HANDLER InterruptHandler; + HARDWARE_INTERRUPT_HANDLER *InterruptHandlerPtr; GicInterrupt = ArmGicV3AcknowledgeInterrupt (); - // Special Interrupts (ID1020-ID1023) have an Interrupt ID greater than the - // number of interrupt (ie: Spurious interrupt). - if ((GicInterrupt & ARM_GIC_ICCIAR_ACKINTID) >= mGicNumInterrupts) { - // The special interrupt do not need to be acknowledge + if (GicCommonSourceIsSpecialInterrupt (GicInterrupt)) { + // The special interrupts do not need to be acknowledged. return; } - InterruptHandler = gRegisteredInterruptHandlers[GicInterrupt]; - if (InterruptHandler != NULL) { + InterruptHandlerPtr = GicV3GetHandlerAddress (GicInterrupt); + if (InterruptHandlerPtr == NULL) { + DEBUG ((DEBUG_ERROR, "Interrupt 0x%x out of expected range\n", GicInterrupt)); + return; + } + + if (*InterruptHandlerPtr != NULL) { // Call the registered interrupt handler. - InterruptHandler (GicInterrupt, SystemContext); + (*InterruptHandlerPtr)(GicInterrupt, SystemContext); } else { DEBUG ((DEBUG_ERROR, "Spurious GIC interrupt: 0x%x\n", (UINT32)GicInterrupt)); GicV3EndOfInterrupt (&gHardwareInterruptV3Protocol, GicInterrupt); } } +EFI_STATUS +EFIAPI +GicV3RegisterInterruptSource ( + IN EFI_HARDWARE_INTERRUPT_PROTOCOL *This, + IN HARDWARE_INTERRUPT_SOURCE Source, + IN HARDWARE_INTERRUPT_HANDLER Handler + ) +{ + HARDWARE_INTERRUPT_HANDLER *HandlerDest = GicV3GetHandlerAddress (Source); + + if (HandlerDest == NULL) { + return EFI_UNSUPPORTED; + } + + return GicCommonRegisterInterruptSource ( + This, + Source, + Handler, + HandlerDest + ); +} + // The protocol instance produced by this driver EFI_HARDWARE_INTERRUPT_PROTOCOL gHardwareInterruptV3Protocol = { - RegisterInterruptSource, + GicV3RegisterInterruptSource, GicV3EnableInterruptSource, GicV3DisableInterruptSource, GicV3GetInterruptSourceState, @@ -408,6 +549,8 @@ EFI_HARDWARE_INTERRUPT_PROTOCOL gHardwareInterruptV3Protocol = { @retval EFI_SUCCESS Source interrupt supported. @retval EFI_UNSUPPORTED Source interrupt is not supported. + + **/ STATIC EFI_STATUS @@ -422,7 +565,11 @@ GicV3GetTriggerType ( UINTN Config1Bit; EFI_STATUS Status; - Status = GicGetDistributorIcfgBaseAndBit ( + if (!GicIsValidSource (Source)) { + return EFI_UNSUPPORTED; + } + + Status = GicCommonGetDistributorIcfgBaseAndBit ( Source, &RegAddress, &Config1Bit @@ -478,7 +625,11 @@ GicV3SetTriggerType ( return EFI_UNSUPPORTED; } - Status = GicGetDistributorIcfgBaseAndBit ( + if (!GicIsValidSource (Source)) { + return EFI_UNSUPPORTED; + } + + Status = GicCommonGetDistributorIcfgBaseAndBit ( Source, &RegAddress, &Config1Bit @@ -544,7 +695,7 @@ ArmGicEnableDistributor ( } EFI_HARDWARE_INTERRUPT2_PROTOCOL gHardwareInterrupt2V3Protocol = { - (HARDWARE_INTERRUPT2_REGISTER)RegisterInterruptSource, + (HARDWARE_INTERRUPT2_REGISTER)GicV3RegisterInterruptSource, (HARDWARE_INTERRUPT2_ENABLE)GicV3EnableInterruptSource, (HARDWARE_INTERRUPT2_DISABLE)GicV3DisableInterruptSource, (HARDWARE_INTERRUPT2_INTERRUPT_STATE)GicV3GetInterruptSourceState, @@ -571,8 +722,13 @@ GicV3ExitBootServicesEvent ( { UINTN Index; - // Acknowledge all pending interrupts - for (Index = 0; Index < mGicNumInterrupts; Index++) { + // Acknowledge all pending interrupts in SPI range. + for (Index = 0; Index <= mGicMaxSpiIntId; Index++) { + GicV3DisableInterruptSource (&gHardwareInterruptV3Protocol, Index); + } + + // Acknowledge all pending interrupts in extended SPI range. + for (Index = ARM_GIC_ARCH_EXT_SPI_MIN; Index <= mGicMaxExtSpiIntId; Index++) { GicV3DisableInterruptSource (&gHardwareInterruptV3Protocol, Index); } @@ -605,6 +761,7 @@ GicV3DxeInitialize ( UINT64 MpId; UINT64 CpuTarget; UINT64 RegValue; + UINT64 TotalIntIds; // Make sure the Interrupt Controller Protocol is not already installed in // the system. @@ -624,7 +781,6 @@ GicV3DxeInitialize ( } mGicRedistributorBase = GicGetCpuRedistributorBase (PcdGet64 (PcdGicRedistributorsBase)); - mGicNumInterrupts = ArmGicGetMaxNumInterrupts (mGicDistributorBase); RegValue = ArmGicV3GetControlSystemRegisterEnable (); if ((RegValue & ICC_SRE_EL2_SRE) == 0) { @@ -632,11 +788,30 @@ GicV3DxeInitialize ( ASSERT ((ArmGicV3GetControlSystemRegisterEnable () & ICC_SRE_EL2_SRE) != 0); } + Status = GicV3GetValidIntIdRanges ( + mGicDistributorBase, + &mGicMaxSpiIntId, + &mGicMaxExtSpiIntId + ); + + if (EFI_ERROR (Status)) { + return Status; + } + // We will be driving this GIC in native v3 mode, i.e., with Affinity // Routing enabled. So ensure that the ARE bit is set. MmioOr32 (mGicDistributorBase + ARM_GIC_ICDDCR, ARM_GIC_ICDDCR_ARE); - for (Index = 0; Index < mGicNumInterrupts; Index++) { + // Disable all SPI sources. + for (Index = 0; Index <= mGicMaxSpiIntId; Index++) { + GicV3DisableInterruptSource (&gHardwareInterruptV3Protocol, Index); + + // Set Priority + ArmGicSetInterruptPriority (Index, ARM_GIC_DEFAULT_PRIORITY); + } + + // Disable all extended SPI sources. + for (Index = ARM_GIC_ARCH_EXT_SPI_MIN; Index <= mGicMaxExtSpiIntId; Index++) { GicV3DisableInterruptSource (&gHardwareInterruptV3Protocol, Index); // Set Priority @@ -665,20 +840,37 @@ GicV3DxeInitialize ( 0xffffffff ); - for (Index = 32; Index < mGicNumInterrupts; Index += 32) { + // Configure SPI + for (Index = 32; Index <= mGicMaxSpiIntId; Index += 32) { MmioWrite32 ( mGicDistributorBase + ARM_GIC_ICDISR + Index / 8, 0xffffffff ); } + // Configure extended SPI + for (Index = ARM_GIC_ARCH_EXT_SPI_MIN; Index <= mGicMaxExtSpiIntId; Index += 32) { + MmioWrite32 ( + mGicDistributorBase + ARM_GIC_ICDISR_E + (Index - ARM_GIC_ARCH_EXT_SPI_MIN) / 8, + 0xffffffff + ); + } + // Route the SPIs to the primary CPU. SPIs start at the INTID 32 - for (Index = 0; Index < (mGicNumInterrupts - 32); Index++) { + for (Index = 0; Index < (mGicMaxSpiIntId + 1 - 32); Index++) { MmioWrite64 ( mGicDistributorBase + ARM_GICD_IROUTER + (Index * 8), CpuTarget ); } + + // Route the extended SPIs to the primary CPU. extended SPIs start at the INTID 4096 + for (Index = ARM_GIC_ARCH_EXT_SPI_MIN; Index <= mGicMaxExtSpiIntId; Index++) { + MmioWrite64 ( + mGicDistributorBase + ARM_GICD_IROUTER_E + ((Index - ARM_GIC_ARCH_EXT_SPI_MIN) * 8), + CpuTarget + ); + } } // Set binary point reg to 0x7 (no preemption) @@ -698,12 +890,31 @@ GicV3DxeInitialize ( // Enable gic distributor ArmGicEnableDistributor (mGicDistributorBase); - Status = InstallAndRegisterInterruptService ( + // Allocate contiguous handlers for SPI and extended SPI. extended SPI + // handlers begin immediately after SPI handlers. + TotalIntIds = mGicMaxSpiIntId + 1; + if (mGicMaxExtSpiIntId >= ARM_GIC_ARCH_EXT_SPI_MIN) { + TotalIntIds += (mGicMaxExtSpiIntId - ARM_GIC_ARCH_EXT_SPI_MIN + 1); + } + + mRegisteredInterruptHandlers = AllocateZeroPool ( + sizeof (HARDWARE_INTERRUPT_HANDLER) * + TotalIntIds + ); + if (mRegisteredInterruptHandlers == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + Status = GicCommonInstallAndRegisterInterruptService ( &gHardwareInterruptV3Protocol, &gHardwareInterrupt2V3Protocol, GicV3IrqInterruptHandler, GicV3ExitBootServicesEvent ); + if (EFI_ERROR (Status)) { + FreePool (mRegisteredInterruptHandlers); + } + return Status; } diff --git a/ArmPkg/Include/Library/ArmGicLib.h b/ArmPkg/Include/Library/ArmGicLib.h index de49c59437f0..ab13ad62ab8c 100644 --- a/ArmPkg/Include/Library/ArmGicLib.h +++ b/ArmPkg/Include/Library/ArmGicLib.h @@ -9,11 +9,58 @@ #ifndef ARMGIC_H_ #define ARMGIC_H_ +// +// GIC SPI and extended SPI ranges +// +#define ARM_GIC_ARCH_SPI_MIN 32 +#define ARM_GIC_ARCH_SPI_MAX 1019 +#define ARM_GIC_ARCH_EXT_SPI_MIN 4096 +#define ARM_GIC_ARCH_EXT_SPI_MAX 5119 + // GIC Distributor #define ARM_GIC_ICDDCR 0x000 // Distributor Control Register #define ARM_GIC_ICDICTR 0x004 // Interrupt Controller Type Register #define ARM_GIC_ICDIIDR 0x008 // Implementer Identification Register +// ICDICTR is also called GICD_TYPER. + +// Intids per LSB for EXT_SPI_RANGE and ITLINES. +#define ARM_GIC_ICDICTR_INTID_RANGE_RESOLUTION (32) + +// Converts an register range of IntIds to the maximum IntId using Base as an +// offset. +#define ARM_GIC_ICDICTR_INTID_RANGE_TO_MAX_INTID(Range, Base) \ + (ARM_GIC_ICDICTR_INTID_RANGE_RESOLUTION * ((Range) + 1) - 1 + (Base)) + +#define ARM_GIC_ICDICTR_ITLINES_MASK (0x1F) +#define ARM_GIC_ICDICTR_ITLINES_SHIFT (0) + +// Gets the range for SPI IntIds from TypeReg. +#define ARM_GIC_ICDICTR_GET_SPI_RANGE(TypeReg) \ + (((TypeReg) >> ARM_GIC_ICDICTR_ITLINES_SHIFT) & ARM_GIC_ICDICTR_ITLINES_MASK) + +// Converts a range of SPI IntIds to the maximum SPI IntId. +#define ARM_GIC_ICDICTR_SPI_RANGE_TO_MAX_INTID(SpiRange) \ + (((SpiRange) == ARM_GIC_ICDICTR_ITLINES_MASK) \ + ? ARM_GIC_ARCH_SPI_MAX \ + : ARM_GIC_ICDICTR_INTID_RANGE_TO_MAX_INTID(SpiRange, 0)) + +// Extracts the maximum SPI IntId from TypeReg. +#define ARM_GIC_ICDICTR_GET_SPI_MAX_INTID(TypeReg) \ + ARM_GIC_ICDICTR_SPI_RANGE_TO_MAX_INTID(ARM_GIC_ICDICTR_GET_EXT_SPI_RANGE(TypeReg)) + +#define ARM_GIC_ICDICTR_EXT_SPI_ENABLED (1 << 8) // Extended SPI enabled bit. +#define ARM_GIC_ICDICTR_EXT_SPI_RANGE_SHIFT (27) // Extended SPI range position. +#define ARM_GIC_ICDICTR_EXT_SPI_RANGE_MASK (0x1F) // Extended SPI range mask. +#define ARM_GIC_ICDICTR_GET_EXT_SPI_RANGE(TypeReg) \ + (((TypeReg) >> ARM_GIC_ICDICTR_EXT_SPI_RANGE_SHIFT) & \ + ARM_GIC_ICDICTR_EXT_SPI_RANGE_MASK) + +// Extracts the maximum EXT SPI IntId from TypeReg. +#define ARM_GIC_ICDICTR_GET_EXT_SPI_MAX_INTID(TypeReg) \ + ARM_GIC_ICDICTR_INTID_RANGE_TO_MAX_INTID( \ + ARM_GIC_ICDICTR_GET_EXT_SPI_RANGE(TypeReg), ARM_GIC_ARCH_EXT_SPI_MIN) + // Each reg base below repeats for Number of interrupts / 4 (see GIC spec) #define ARM_GIC_ICDISR 0x080 // Interrupt Security Registers #define ARM_GIC_ICDISER 0x100 // Interrupt Set-Enable Registers @@ -35,7 +82,8 @@ #define ARM_GIC_ICDSGIR 0xF00 // Software Generated Interrupt Register // GICv3 specific registers -#define ARM_GICD_IROUTER 0x6100 // Interrupt Routing Registers +#define ARM_GICD_IROUTER 0x6100 // Interrupt Routing Registers +#define ARM_GICD_IROUTER_E 0x8000 // Interrupt Routing Registers // GICD_CTLR bits #define ARM_GIC_ICDDCR_ARE (1 << 4) // Affinity Routing Enable (ARE) @@ -50,6 +98,16 @@ #define ARM_GIC_ICDICFR_LEVEL_TRIGGERED 0x0 // Level triggered interrupt #define ARM_GIC_ICDICFR_EDGE_TRIGGERED 0x1 // Edge triggered interrupt +// GICD ESPI registers +// These registers follow the same bit pattern as the SPI registers. +#define ARM_GIC_ICDISR_E 0x1000 // Interrupt Security Registers +#define ARM_GIC_ICDISER_E 0x1200 // Interrupt Set-Enable for ESPI +#define ARM_GIC_ICDICER_E 0x1400 // Interrupt Clear-Enable Registers +#define ARM_GIC_ICDSPR_E 0x1600 // Interrupt Set-Pending Registers +#define ARM_GIC_ICDICPR_E 0x1800 // Interrupt Clear-Pending Registers +#define ARM_GIC_ICDIPR_E 0x2000 // Interrupt Priority Registers +#define ARM_GIC_ICDICFR_E 0x3000 // Interrupt Configuration Registers + // GIC Redistributor #define ARM_GICR_CTLR_FRAME_SIZE SIZE_64KB #define ARM_GICR_SGI_PPI_FRAME_SIZE SIZE_64KB @@ -108,14 +166,6 @@ // Bit Mask for #define ARM_GIC_ICCIAR_ACKINTID 0x3FF -// -// GIC SPI and extended SPI ranges -// -#define ARM_GIC_ARCH_SPI_MIN 32 -#define ARM_GIC_ARCH_SPI_MAX 1019 -#define ARM_GIC_ARCH_EXT_SPI_MIN 4096 -#define ARM_GIC_ARCH_EXT_SPI_MAX 5119 - // GIC revision 3 specific declarations #define ICC_SRE_EL2_SRE (1 << 0) From 24a80a59dbe02e4101303ff3acb3ae9fcd8ed7cb Mon Sep 17 00:00:00 2001 From: Ray Ni Date: Fri, 30 May 2025 10:56:21 +0800 Subject: [PATCH 0002/1172] StandaloneMmPkg/Core: Fix FV HOB loop by advancing with GET_NEXT_HOB Previously, MmDispatchFvs could enter an infinite loop if a Firmware Volume HOB with zero length was encountered, because GetNextHob() was called with the same FvHob pointer repeatedly. This patch fixes the issue by passing GET_NEXT_HOB(FvHob) to GetNextHob(), ensuring the loop advances to the next HOB and preventing hangs. Signed-off-by: Ray Ni --- StandaloneMmPkg/Core/FwVol.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/StandaloneMmPkg/Core/FwVol.c b/StandaloneMmPkg/Core/FwVol.c index d5dfdacbf039..b89cb87841dc 100644 --- a/StandaloneMmPkg/Core/FwVol.c +++ b/StandaloneMmPkg/Core/FwVol.c @@ -255,9 +255,12 @@ MmDispatchFvs ( ZeroMem (mMmFv, sizeof (mMmFv)); - Index = 0; - FvHob.Raw = GetHobList (); - while ((FvHob.Raw = GetNextHob (EFI_HOB_TYPE_FV, FvHob.Raw)) != NULL) { + Index = 0; + for ( FvHob.Raw = GetNextHob (EFI_HOB_TYPE_FV, GetHobList ()) + ; FvHob.Raw != NULL + ; FvHob.Raw = GetNextHob (EFI_HOB_TYPE_FV, GET_NEXT_HOB (FvHob)) + ) + { if (Index == ARRAY_SIZE (mMmFv)) { DEBUG (( DEBUG_INFO, @@ -302,8 +305,6 @@ MmDispatchFvs ( MmCoreFfsFindMmDriver (Fv, 0); mMmFv[Index++] = Fv; - - FvHob.Raw = GET_NEXT_HOB (FvHob); } if (Index == 0) { From 97fc789316e73dd37a0c0fcd4ee9bae2bb35bd8f Mon Sep 17 00:00:00 2001 From: Ray Ni Date: Fri, 30 May 2025 13:16:40 +0800 Subject: [PATCH 0003/1172] StandaloneMmPkg/Core: Improve debug messages Refine debug output for better troubleshooting: 1. Consolidate FV address and size into one log message 2. Add function name to error messages for better traceability 3. Use AllocateCopyPool() instead of separate AllocatePool() and CopyMem() Signed-off-by: Ray Ni --- StandaloneMmPkg/Core/FwVol.c | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/StandaloneMmPkg/Core/FwVol.c b/StandaloneMmPkg/Core/FwVol.c index b89cb87841dc..637e4a8d1103 100644 --- a/StandaloneMmPkg/Core/FwVol.c +++ b/StandaloneMmPkg/Core/FwVol.c @@ -264,43 +264,36 @@ MmDispatchFvs ( if (Index == ARRAY_SIZE (mMmFv)) { DEBUG (( DEBUG_INFO, - "%a: The number of FV Hobs exceed the max supported FVs (%d) in StandaloneMmCore\n", + "%a: The number of FV Hobs exceeds the max supported FVs (%d) in StandaloneMmCore\n", __func__, ARRAY_SIZE (mMmFv) )); return; } - DEBUG ((DEBUG_INFO, "%a: FV[%d] address - 0x%x\n", __func__, Index, FvHob.FirmwareVolume->BaseAddress)); - DEBUG ((DEBUG_INFO, "%a: FV[%d] size - 0x%x\n", __func__, Index, FvHob.FirmwareVolume->Length)); + DEBUG (( + DEBUG_INFO, + "%a: FV[%d] address = 0x%x, size = 0x%x\n", + __func__, + Index, + FvHob.FirmwareVolume->BaseAddress, + FvHob.FirmwareVolume->Length + )); if (FvHob.FirmwareVolume->Length == 0x00) { - DEBUG (( - DEBUG_INFO, - "%a: Skip invalid FV[%d]- 0x%x/0x%x\n", - __func__, - Index, - FvHob.FirmwareVolume->BaseAddress, - FvHob.FirmwareVolume->Length - )); + DEBUG ((DEBUG_INFO, "%a: Skip zero-length FV.\n", __func__)); continue; } if (!FixedPcdGetBool (PcdShadowBfv)) { Fv = (EFI_FIRMWARE_VOLUME_HEADER *)((UINTN)FvHob.FirmwareVolume->BaseAddress); } else { - Fv = AllocatePool (FvHob.FirmwareVolume->Length); + Fv = AllocateCopyPool (FvHob.FirmwareVolume->Length, (VOID *)(UINTN)FvHob.FirmwareVolume->BaseAddress); if (Fv == NULL) { - DEBUG ((DEBUG_ERROR, "Fail to allocate memory for Fv\n")); + DEBUG ((DEBUG_ERROR, "%a: Fail to allocate MM memory for Fv!\n", __func__)); CpuDeadLoop (); return; } - - CopyMem ( - (VOID *)Fv, - (VOID *)(UINTN)FvHob.FirmwareVolume->BaseAddress, - FvHob.FirmwareVolume->Length - ); } MmCoreFfsFindMmDriver (Fv, 0); @@ -308,7 +301,7 @@ MmDispatchFvs ( } if (Index == 0) { - DEBUG ((DEBUG_ERROR, "No FV hob is found\n")); + DEBUG ((DEBUG_ERROR, "%a: No FV hob is found\n", __func__)); return; } From 51733a72ca99bd4cd183be242bc234fbfa668ff4 Mon Sep 17 00:00:00 2001 From: Ray Ni Date: Fri, 30 May 2025 13:30:24 +0800 Subject: [PATCH 0004/1172] StandaloneMmPkg/Core: try best to dispatch FVs Original logic skips to call MmDispatcher() when number of FV HOBs exceeds the max supported FVs even for the already-discovered FVs. Original logic skips to call MmDispatcher() and even skips to process other FVs when insufficient MM memory for shadowing a FV. For both cases, replace "return" with "continue" to try best to dispatch more FVs. Signed-off-by: Ray Ni --- StandaloneMmPkg/Core/FwVol.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/StandaloneMmPkg/Core/FwVol.c b/StandaloneMmPkg/Core/FwVol.c index 637e4a8d1103..bb13d88982a9 100644 --- a/StandaloneMmPkg/Core/FwVol.c +++ b/StandaloneMmPkg/Core/FwVol.c @@ -261,16 +261,6 @@ MmDispatchFvs ( ; FvHob.Raw = GetNextHob (EFI_HOB_TYPE_FV, GET_NEXT_HOB (FvHob)) ) { - if (Index == ARRAY_SIZE (mMmFv)) { - DEBUG (( - DEBUG_INFO, - "%a: The number of FV Hobs exceeds the max supported FVs (%d) in StandaloneMmCore\n", - __func__, - ARRAY_SIZE (mMmFv) - )); - return; - } - DEBUG (( DEBUG_INFO, "%a: FV[%d] address = 0x%x, size = 0x%x\n", @@ -285,14 +275,25 @@ MmDispatchFvs ( continue; } + if (Index == ARRAY_SIZE (mMmFv)) { + DEBUG (( + DEBUG_INFO, + "%a: The number of FV Hobs exceeds the max supported FVs (%d) in StandaloneMmCore, skip it.\n", + __func__, + ARRAY_SIZE (mMmFv) + )); + continue; + } + if (!FixedPcdGetBool (PcdShadowBfv)) { Fv = (EFI_FIRMWARE_VOLUME_HEADER *)((UINTN)FvHob.FirmwareVolume->BaseAddress); } else { Fv = AllocateCopyPool (FvHob.FirmwareVolume->Length, (VOID *)(UINTN)FvHob.FirmwareVolume->BaseAddress); + ASSERT (Fv != NULL); if (Fv == NULL) { DEBUG ((DEBUG_ERROR, "%a: Fail to allocate MM memory for Fv!\n", __func__)); CpuDeadLoop (); - return; + continue; } } From 8c04bcc7ed0efbb2e3fde23f787ff0249e62f874 Mon Sep 17 00:00:00 2001 From: Gao Qihang Date: Wed, 4 Jun 2025 09:57:22 +0800 Subject: [PATCH 0005/1172] EmbeddedPkg: Fix a data error in comment KEYBOARD_TIMER_INTERVAL is used as TriggerTime parameter of gBS->SetTimer() function. TriggerTime parameter represents the number of 100ns units, so number 500000 indicates 0.05s. Signed-off-by: Gao Qihang --- EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboard.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboard.h b/EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboard.h index 25063c262721..ed14f20507a5 100644 --- a/EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboard.h +++ b/EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboard.h @@ -43,7 +43,7 @@ extern EFI_COMPONENT_NAME2_PROTOCOL gVirtualKeyboardComponentName2; #define KEYBOARD_TIMEOUT 65536 // 0.07s #define KEYBOARD_WAITFORVALUE_TIMEOUT 1000000 // 1s #define KEYBOARD_BAT_TIMEOUT 4000000 // 4s -#define KEYBOARD_TIMER_INTERVAL 500000 // 0.5s +#define KEYBOARD_TIMER_INTERVAL 500000 // 0.05s #define QUEUE_MAX_COUNT 32 From d81e4121b144743629cf50b7501ddc39a7270302 Mon Sep 17 00:00:00 2001 From: Bret Barkelew Date: Tue, 12 Jun 2018 09:01:05 -0700 Subject: [PATCH 0006/1172] MdeModulePkg/PciBusDxe: Free descriptor buffer in GetResourcePadding() - Updated the PciGetBusRange function signature to use IN OUT for the Descriptors parameter. - Introduced a new DescriptorsBuffer variable in PciLib.c to temporarily hold descriptor data. - Clean up DescriptorsBuffer and set Descriptors to NULL after use. Co-authored-by: Michael Kubacki Signed-off-by: Michael Kubacki --- .../Bus/Pci/PciBusDxe/PciEnumeratorSupport.c | 2 +- .../Bus/Pci/PciBusDxe/PciEnumeratorSupport.h | 2 +- MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c | 29 +++++++++++-------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c index 566ce3d07526..5c4b215f7ac7 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c @@ -2639,7 +2639,7 @@ PciEnumeratorLight ( **/ EFI_STATUS PciGetBusRange ( - IN EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR **Descriptors, + IN OUT EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR **Descriptors, OUT UINT16 *MinBus, OUT UINT16 *MaxBus, OUT UINT16 *BusRange diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.h b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.h index 7daa6e020d09..89df989f58b9 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.h +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.h @@ -409,7 +409,7 @@ PciEnumeratorLight ( **/ EFI_STATUS PciGetBusRange ( - IN EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR **Descriptors, + IN OUT EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR **Descriptors, OUT UINT16 *MinBus, OUT UINT16 *MaxBus, OUT UINT16 *BusRange diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c index 84fc0161a19c..28840deaf314 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c @@ -1100,6 +1100,7 @@ PciScanBus ( EFI_HPC_STATE State; UINT64 PciAddress; EFI_HPC_PADDING_ATTRIBUTES Attributes; + VOID *DescriptorsBuffer; EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptors; EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *NextDescriptors; UINT16 BusRange; @@ -1108,16 +1109,17 @@ PciScanBus ( UINT32 TempReservedBusNum; BOOLEAN IsAriEnabled; - PciRootBridgeIo = Bridge->PciRootBridgeIo; - SecondBus = 0; - Register = 0; - State = 0; - Attributes = (EFI_HPC_PADDING_ATTRIBUTES)0; - BusRange = 0; - BusPadding = FALSE; - PciDevice = NULL; - PciAddress = 0; - IsAriEnabled = FALSE; + PciRootBridgeIo = Bridge->PciRootBridgeIo; + SecondBus = 0; + Register = 0; + State = 0; + Attributes = (EFI_HPC_PADDING_ATTRIBUTES)0; + BusRange = 0; + BusPadding = FALSE; + PciDevice = NULL; + PciAddress = 0; + IsAriEnabled = FALSE; + DescriptorsBuffer = NULL; for (Device = 0; Device <= PCI_MAX_DEVICE; Device++) { if (!IsAriEnabled) { @@ -1257,7 +1259,7 @@ PciScanBus ( PciDevice->DevicePath, PciAddress, &State, - (VOID **)&Descriptors, + &DescriptorsBuffer, &Attributes ); @@ -1265,6 +1267,7 @@ PciScanBus ( return Status; } + Descriptors = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *)DescriptorsBuffer; BusRange = 0; NextDescriptors = Descriptors; Status = PciGetBusRange ( @@ -1274,7 +1277,9 @@ PciScanBus ( &BusRange ); - FreePool (Descriptors); + FreePool (DescriptorsBuffer); + DescriptorsBuffer = NULL; + Descriptors = NULL; if (!EFI_ERROR (Status)) { BusPadding = TRUE; From e10edfe71e37675fc6caceb67df102ca4501782b Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Thu, 22 May 2025 16:53:03 -0400 Subject: [PATCH 0007/1172] MdeModulePkg/TpmMeasurementLibNull: Allow broader linking This is needed in a MM_CORE_STANDALONE module. Since this null instance is so simple, remove individual module types to allow it be integrated more easily. Signed-off-by: Michael Kubacki --- .../Library/TpmMeasurementLibNull/TpmMeasurementLibNull.c | 3 +++ .../Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.c b/MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.c index 880b428d5605..d6853a19129b 100644 --- a/MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.c +++ b/MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.c @@ -6,6 +6,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent **/ +#include +#include + /** Tpm measure and log data, and extend the measurement result into a specific PCR. diff --git a/MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf b/MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf index c3be447d40d7..96d816b88f3f 100644 --- a/MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf +++ b/MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf @@ -10,9 +10,9 @@ INF_VERSION = 0x00010005 BASE_NAME = TpmMeasurementLibNull FILE_GUID = 6DFD6E9F-9278-48D8-8F45-B6CFF2C2B69C - MODULE_TYPE = UEFI_DRIVER + MODULE_TYPE = BASE VERSION_STRING = 1.0 - LIBRARY_CLASS = TpmMeasurementLib|SEC PEIM DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER + LIBRARY_CLASS = TpmMeasurementLib MODULE_UNI_FILE = TpmMeasurementLibNull.uni # From 6ec73a6c95de6473c70661f2a9d8793dc1358777 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Thu, 24 Apr 2025 16:57:44 -0700 Subject: [PATCH 0008/1172] MdePkg: BaseLib: Add UUID-GUID conversion function With interactions between Standalone MM partitions and normal UEFI environment, there is constant need to convert UUID to GUID and back. This change added 2 new interfaces to BaseLib that support such usage. Signed-off-by: Kun Qin --- MdePkg/Include/Library/BaseLib.h | 95 ++++++++++++++++++ MdePkg/Library/BaseLib/BaseLib.inf | 1 + MdePkg/Library/BaseLib/ConvertGuidUuid.c | 121 +++++++++++++++++++++++ 3 files changed, 217 insertions(+) create mode 100644 MdePkg/Library/BaseLib/ConvertGuidUuid.c diff --git a/MdePkg/Include/Library/BaseLib.h b/MdePkg/Include/Library/BaseLib.h index 9658026d9c60..db11732c8b9d 100644 --- a/MdePkg/Include/Library/BaseLib.h +++ b/MdePkg/Include/Library/BaseLib.h @@ -4715,6 +4715,101 @@ BitFieldCountOnes64 ( IN UINTN EndBit ); +/******************************************************************************* + + UUID (Universally Unique IDentifier), as defined in RFC4122 + (https://datatracker.ietf.org/doc/html/rfc4122#section-4.1), is a 128-bit number + used to uniquely identify information in computer systems. + + UUIDs contains 5 fields: + - time_low: 32 bits + - time_mid: 16 bits + - time_hi_and_version: 16 bits + - clock_seq_hi_and_reserved: 8 bits + - clock_seq_low: 8 bits + - node: 8 bits * 6 + + Each field encoded with the Most Significant Byte first (known as network byte + order, or big-endian). + + GUID (Globally Unique Identifier), on the other hand, is a 128-bit number used + in UEFI environments, which is similar to UUID but has a different byte order + in memory. See https://uefi.org/specs/UEFI/2.11/Apx_A_GUID_and_Time_Formats.html + + GUID also contains 5 fields: + - TimeLow: 32 bits + - TimeMid: 16 bits + - TimeHiAndVersion: 16 bits + - ClockSeqHighAndReserved: 16 bits + - ClockSeqLow: 8 bits + - Node: 8 bits * 6 + + TimeLow, TimeMid, TimeHighAndVersion fields in the EFI are encoded with the Least + Significant Byte first (also known as little-endian). + + Example: + Consider the same string representation/registry format for MM communication v2: + "378daedc-f06b-4446-8314-40ab933c87a3" + + In UUID format, it is represented as: + - Data fields: + - time_low: 0x37 0x8d 0xae 0xdc (0x378daedc in big-endian) + - time_mid: 0xf0 0x6b (0xf06b in big-endian) + - time_hi_and_version: 0x44 0x46 (0x4446 in big-endian) + - clock_seq_hi_and_reserved: 0x83 + - clock_seq_low: 0x14 + - node: 0x00, 0xab, 0x93, 0x3c, 0x87, 0xa3 + - Byte representation in memory: + - 37 8d ae dc f0 6b 44 46 83 14 40 ab 93 3c 87 a3 + + However, in GUID format, it is represented as: + - Data fields: + - TimeLow: 0xdc 0xae 0x8d 0x37 (0x378daedc in little-endian) + - TimeMid: 0x6b 0xf0 (0xf06b in little-endian) + - TimeHiAndVersion: 0x46 0x44 (0x4446 in little-endian) + - ClockSeqHighAndReserved: 0x83 + - ClockSeqLow: 0x14 + - Node: 0x00, 0xab, 0x93, 0x3c, 0x87, 0xa3 + - Byte representation in memory: + - dc ae 8d 37 6b f0 46 44 83 14 40 ab 93 3c 87 a3 + +*******************************************************************************/ + +/** + This function converts a GUID in UEFI format to a UUID in RFC4122 format. + + The conversion is done by swapping the byte order of the TimeLow, TimeMid, and + TimeHiAndVersion fields, while keeping the ClockSeq and Node fields unchanged. + + @param [in] FromGuid GUID in format to be converted to UUID RFC4122 format. + @param [out] ToUuid Pointer to a GUID structure that will hold the converted + UUID in RFC4122 format. +**/ +VOID +EFIAPI +ConvertGuidToUuid ( + IN GUID *FromGuid, + OUT GUID *ToUuid + ); + +/** + This function converts a UUID in RFC4122 format to a GUID in UEFI format. + + The conversion is done by swapping the byte order of the time_low, time_mid, and + time_hi_and_version fields, while keeping the ClockSeq and Node fields unchanged. + This function is symmetric to ConvertGuidToUuid. + + @param [in] FromUuid UUID in RFC4122 format to be converted to GUID in UEFI format. + @param [out] ToGuid Pointer to a GUID structure that will hold the converted + GUID in UEFI format. +**/ +VOID +EFIAPI +ConvertUuidToGuid ( + IN GUID *FromUuid, + OUT GUID *ToGuid + ); + // // Base Library Checksum Functions // diff --git a/MdePkg/Library/BaseLib/BaseLib.inf b/MdePkg/Library/BaseLib/BaseLib.inf index 317d32cf68a4..ec40349654b3 100644 --- a/MdePkg/Library/BaseLib/BaseLib.inf +++ b/MdePkg/Library/BaseLib/BaseLib.inf @@ -55,6 +55,7 @@ DivS64x64Remainder.c ARShiftU64.c BitField.c + ConvertGuidUuid.c CpuDeadLoop.c Cpu.c LinkedList.c diff --git a/MdePkg/Library/BaseLib/ConvertGuidUuid.c b/MdePkg/Library/BaseLib/ConvertGuidUuid.c new file mode 100644 index 000000000000..85a3d6340992 --- /dev/null +++ b/MdePkg/Library/BaseLib/ConvertGuidUuid.c @@ -0,0 +1,121 @@ +/** @file + Convert 128 bit unique identifier between GUID and UUID format. + + Copyright (c) 2024, Arm Limited. All rights reserved.
+ Copyright (c) Microsoft Corporation. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include "BaseLibInternals.h" + +/******************************************************************************* + + UUID (Universally Unique IDentifier), as defined in RFC4122 + (https://datatracker.ietf.org/doc/html/rfc4122#section-4.1), is a 128-bit number + used to uniquely identify information in computer systems. + + UUIDs contains 5 fields: + - time_low: 32 bits + - time_mid: 16 bits + - time_hi_and_version: 16 bits + - clock_seq_hi_and_reserved: 8 bits + - clock_seq_low: 8 bits + - node: 8 bits * 6 + + Each field encoded with the Most Significant Byte first (known as network byte + order, or big-endian). + + GUID (Globally Unique Identifier), on the other hand, is a 128-bit number used + in UEFI environments, which is similar to UUID but has a different byte order + in memory. See https://uefi.org/specs/UEFI/2.11/Apx_A_GUID_and_Time_Formats.html + + GUID also contains 5 fields: + - TimeLow: 32 bits + - TimeMid: 16 bits + - TimeHiAndVersion: 16 bits + - ClockSeqHighAndReserved: 16 bits + - ClockSeqLow: 8 bits + - Node: 8 bits * 6 + + TimeLow, TimeMid, TimeHighAndVersion fields in the EFI are encoded with the Least + Significant Byte first (also known as little-endian). + + Example: + Consider the same string representation/registry format for MM communication v2: + "378daedc-f06b-4446-8314-40ab933c87a3" + + In UUID format, it is represented as: + - Data fields: + - time_low: 0x37 0x8d 0xae 0xdc (0x378daedc in big-endian) + - time_mid: 0xf0 0x6b (0xf06b in big-endian) + - time_hi_and_version: 0x44 0x46 (0x4446 in big-endian) + - clock_seq_hi_and_reserved: 0x83 + - clock_seq_low: 0x14 + - node: 0x00, 0xab, 0x93, 0x3c, 0x87, 0xa3 + - Byte representation in memory: + - 37 8d ae dc f0 6b 44 46 83 14 40 ab 93 3c 87 a3 + + However, in GUID format, it is represented as: + - Data fields: + - TimeLow: 0xdc 0xae 0x8d 0x37 (0x378daedc in little-endian) + - TimeMid: 0x6b 0xf0 (0xf06b in little-endian) + - TimeHiAndVersion: 0x46 0x44 (0x4446 in little-endian) + - ClockSeqHighAndReserved: 0x83 + - ClockSeqLow: 0x14 + - Node: 0x00, 0xab, 0x93, 0x3c, 0x87, 0xa3 + - Byte representation in memory: + - dc ae 8d 37 6b f0 46 44 83 14 40 ab 93 3c 87 a3 + +*******************************************************************************/ + +/** + This function converts a GUID in UEFI format to a UUID in RFC4122 format. + + The conversion is done by swapping the byte order of the TimeLow, TimeMid, and + TimeHiAndVersion fields, while keeping the ClockSeq and Node fields unchanged. + + @param [in] FromGuid GUID in format to be converted to UUID RFC4122 format. + @param [out] ToUuid Pointer to a GUID structure that will hold the converted + UUID in RFC4122 format. +**/ +VOID +EFIAPI +ConvertGuidToUuid ( + IN GUID *FromGuid, + OUT GUID *ToUuid + ) +{ + ASSERT (ToUuid != NULL); + ASSERT (FromGuid != NULL); + + CopyGuid (ToUuid, FromGuid); + ToUuid->Data1 = SwapBytes32 (ToUuid->Data1); + ToUuid->Data2 = SwapBytes16 (ToUuid->Data2); + ToUuid->Data3 = SwapBytes16 (ToUuid->Data3); +} + +/** + This function converts a UUID in RFC4122 format to a GUID in UEFI format. + + The conversion is done by swapping the byte order of the time_low, time_mid, and + time_hi_and_version fields, while keeping the ClockSeq and Node fields unchanged. + This function is symmetric to ConvertGuidToUuid. + + @param [in] FromUuid UUID in RFC4122 format to be converted to GUID in UEFI format. + @param [out] ToGuid Pointer to a GUID structure that will hold the converted + GUID in UEFI format. +**/ +VOID +EFIAPI +ConvertUuidToGuid ( + IN GUID *FromUuid, + OUT GUID *ToGuid + ) +{ + // The conversion is symmetric, so we can use the same function. + // The only difference is the order of the parameters. + ConvertGuidToUuid ( + FromUuid, + ToGuid + ); +} From 1d0c037b5496824fd51fed413bebdf5098f8c5f0 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Thu, 24 Apr 2025 16:52:52 -0700 Subject: [PATCH 0009/1172] MdeModulePkg: ArmFfaLib: Support UUID-GUID conversion interfaces This change moves the existing ConvertEfiGuidToUuid function to public interface to support newly defined functions prototypes. This change also adds the `ArmConvertUuidToEfiGuid` function implementation, which is an inverse of the original conversion. Signed-off-by: Kun Qin --- MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c | 47 +------------------ 1 file changed, 2 insertions(+), 45 deletions(-) diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c index 1a2d8985e2e4..34234558132e 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c @@ -32,49 +32,6 @@ BOOLEAN gFfaSupported; UINT16 gPartId; -/** - Convert EFI_GUID to UUID format. - for example, If there is EFI_GUID named - "378daedc-f06b-4446-8314-40ab933c87a3", - - EFI_GUID is saved in memory like: - dc ae 8d 37 - 6b f0 46 44 - 83 14 40 ab - 93 3c 87 a3 - - However, UUID should be saved like: - 37 8d ae dc - f0 6b 44 46 - 83 14 40 ab - 93 3c 87 a3 - - FF-A and other software components (i.e. linux-kernel) - uses below format. - - @param [in] Guid EFI_GUID - @param [out] Uuid Uuid - -**/ -STATIC -VOID -EFIAPI -ConvertEfiGuidToUuid ( - IN EFI_GUID *Guid, - OUT UINT64 *Uuid - ) -{ - UINT32 *Data32; - UINT16 *Data16; - - CopyGuid ((EFI_GUID *)Uuid, Guid); - Data32 = (UINT32 *)Uuid; - Data32[0] = SwapBytes32 (Data32[0]); - Data16 = (UINT16 *)&Data32[1]; - Data16[0] = SwapBytes16 (Data16[0]); - Data16[1] = SwapBytes16 (Data16[1]); -} - /** Convert EFI_STATUS to FFA return code. @@ -525,7 +482,7 @@ ArmFfaLibPartitionInfoGet ( } if (ServiceGuid != NULL) { - ConvertEfiGuidToUuid (ServiceGuid, Uuid); + ConvertGuidToUuid (ServiceGuid, (GUID *)Uuid); } else { ZeroMem (Uuid, sizeof (Uuid)); } @@ -689,7 +646,7 @@ ArmFfaLibMsgSendDirectReq2 ( } if (ServiceGuid != NULL) { - ConvertEfiGuidToUuid (ServiceGuid, Uuid); + ConvertGuidToUuid (ServiceGuid, (GUID *)Uuid); } else { ZeroMem (Uuid, sizeof (Uuid)); } From 215ed375d998b779cece5448dfaa56469b635bc3 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Thu, 24 Apr 2025 17:02:09 -0700 Subject: [PATCH 0010/1172] ArmPkg: ArmStandaloneMmCoreEntryPoint: Use common UUID conversion routine As new interfaces are made available to support UUID-GUID conversion, this change is made to leverage new interfaces and remove the locally duplicated code. Signed-off-by: Kun Qin --- .../ArmStandaloneMmCoreEntryPoint.c | 48 +------------------ 1 file changed, 1 insertion(+), 47 deletions(-) diff --git a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c index 7b78834f7d9e..52194832e2ec 100644 --- a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c +++ b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c @@ -796,52 +796,6 @@ InitializeMiscMmCommunicateBuffer ( CopyGuid (&Buffer->HeaderGuid, ServiceGuid); } -/** - Convert UUID to EFI_GUID format. - for example, If there is EFI_GUID named - "378daedc-f06b-4446-8314-40ab933c87a3", - - EFI_GUID is saved in memory like: - dc ae 8d 37 - 6b f0 46 44 - 83 14 40 ab - 93 3c 87 a3 - - However, UUID should be saved like: - 37 8d ae dc - f0 6b 44 46 - 83 14 40 ab - 93 3c 87 a3 - - FF-A and other software components (i.e. linux-kernel) - uses below format. - - To patch mm-service properly, the passed uuid should be converted to - EFI_GUID format. - - @param [in] Uuid Uuid - @param [out] Guid EFI_GUID - -**/ -STATIC -VOID -EFIAPI -ConvertUuidToEfiGuid ( - IN UINT64 *Uuid, - OUT EFI_GUID *Guid - ) -{ - UINT32 *Data32; - UINT16 *Data16; - - Data32 = (UINT32 *)Uuid; - Data32[0] = SwapBytes32 (Data32[0]); - Data16 = (UINT16 *)&Data32[1]; - Data16[0] = SwapBytes16 (Data16[0]); - Data16[1] = SwapBytes16 (Data16[1]); - CopyGuid (Guid, (EFI_GUID *)Uuid); -} - /** A loop to delegate events from SPMC. DelegatedEventLoop() calls ArmCallSvc() to exit to SPMC. @@ -911,7 +865,7 @@ DelegatedEventLoop ( FfaMsgInfo.DirectMsgVersion = DirectMsgV2; Uuid[0] = EventCompleteSvcArgs->Arg2; Uuid[1] = EventCompleteSvcArgs->Arg3; - ConvertUuidToEfiGuid (Uuid, &ServiceGuid); + ConvertUuidToGuid ((GUID *)Uuid, &ServiceGuid); ServiceType = GetServiceType (&ServiceGuid); } else { Status = EFI_INVALID_PARAMETER; From cce084eb45b779eff05a424b078fe03bdd72dddc Mon Sep 17 00:00:00 2001 From: "levi.yun" Date: Wed, 4 Jun 2025 09:59:11 +0100 Subject: [PATCH 0011/1172] ArmPkg/Include: fix usage of wrong macro in ArmGicv3Dxe To get a SPI_MAX_INTID, interrupt controller type Register should be masked with ARM_GIC_ICDICTR_GET_SPI_RANGE. However, since ARM_GIC_ICDICTR_SPI_RANGE_TO_MAX_INTID macro uses ARM_GIC_ICDICTR_GET_EXT_SPI_RANGE mask, it returns wrong SPI_MAX_INITID. This makes a failure of loading GenericWatchDog in FVP RevC model. Signed-off-by: Yeoreum Yun Fixes: d6d2f68e3801 ("ArmPkg/Drivers/ArmGicDxe: ...") --- ArmPkg/Include/Library/ArmGicLib.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ArmPkg/Include/Library/ArmGicLib.h b/ArmPkg/Include/Library/ArmGicLib.h index ab13ad62ab8c..bf4b28f91f64 100644 --- a/ArmPkg/Include/Library/ArmGicLib.h +++ b/ArmPkg/Include/Library/ArmGicLib.h @@ -47,7 +47,7 @@ // Extracts the maximum SPI IntId from TypeReg. #define ARM_GIC_ICDICTR_GET_SPI_MAX_INTID(TypeReg) \ - ARM_GIC_ICDICTR_SPI_RANGE_TO_MAX_INTID(ARM_GIC_ICDICTR_GET_EXT_SPI_RANGE(TypeReg)) + ARM_GIC_ICDICTR_SPI_RANGE_TO_MAX_INTID(ARM_GIC_ICDICTR_GET_SPI_RANGE(TypeReg)) #define ARM_GIC_ICDICTR_EXT_SPI_ENABLED (1 << 8) // Extended SPI enabled bit. #define ARM_GIC_ICDICTR_EXT_SPI_RANGE_SHIFT (27) // Extended SPI range position. From 431da739a0a45882f2b4e703ba2bca5583914646 Mon Sep 17 00:00:00 2001 From: Gary Beihl Date: Wed, 28 May 2025 12:25:37 -0400 Subject: [PATCH 0012/1172] BaseTools: Add line number to PatchCheck error messages PatchCheck error messages can be improved by adding the line number. The line itself may consist of only whitespace for some errors. Adding the line number can help better locate the error source. Signed-off-by: Gary Beihl --- BaseTools/Scripts/PatchCheck.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BaseTools/Scripts/PatchCheck.py b/BaseTools/Scripts/PatchCheck.py index 83d679518845..d178a6081b1b 100755 --- a/BaseTools/Scripts/PatchCheck.py +++ b/BaseTools/Scripts/PatchCheck.py @@ -485,7 +485,7 @@ def added_line_error(self, msg, line): lines = [ msg ] if self.filename is not None: lines.append('File: ' + self.filename) - lines.append('Line: ' + line) + lines.append('Line ' + str(self.line_num) + ': ' + line) self.error(*lines) @@ -539,7 +539,7 @@ def check_added_line(self, line): def format_error(self, err): self.format_ok = False err = 'Patch format error: ' + err - err2 = 'Line: ' + self.lines[self.line_num].rstrip() + err2 = 'Line ' + str(self.line_num) + ': ' + self.lines[self.line_num].rstrip() self.error(err, err2) def error(self, *err): From a55d933064f75e129eea37bc0bde511736812438 Mon Sep 17 00:00:00 2001 From: Rebecca Cran Date: Wed, 4 Jun 2025 16:00:32 -0600 Subject: [PATCH 0013/1172] MdeModule: Update oniguruma to v6.9.10 Update MdeModulePkg/Universal/RegularExpressionDxe/oniguruma to the last upstream version, v6.9.10. Signed-off-by: Rebecca Cran --- MdeModulePkg/Universal/RegularExpressionDxe/oniguruma | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/oniguruma b/MdeModulePkg/Universal/RegularExpressionDxe/oniguruma index abfc8ff81df4..4ef89209a239 160000 --- a/MdeModulePkg/Universal/RegularExpressionDxe/oniguruma +++ b/MdeModulePkg/Universal/RegularExpressionDxe/oniguruma @@ -1 +1 @@ -Subproject commit abfc8ff81df4067f309032467785e06975678f0d +Subproject commit 4ef89209a239c1aea328cf13c05a2807e5c146d1 From 18fdec11b1ab6475d1c3f328953f225547983dd5 Mon Sep 17 00:00:00 2001 From: Nate DeSimone Date: Fri, 30 May 2025 16:56:03 -0700 Subject: [PATCH 0014/1172] BaseTools: Add Unit Test Support for X64 BaseTools on Windows Fixes a BaseTools Bin directory path detection bug in the the BaseTools Unit Tests. The script incorrectly assumes that sys.platform will be win64 on a 64-bit Python interperter. The "win64" platform string has not been used for 64-bit Python interperters since May 10, 2000: https://github.com/python/cpython/commit/da5cc82d Moreover, this patch was merged before the Python 2.0 release, so there never has been a released Python interperter that used the "win64" string. Signed-off-by: Nate DeSimone --- BaseTools/Tests/TestTools.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BaseTools/Tests/TestTools.py b/BaseTools/Tests/TestTools.py index 545e1e3c133a..042b72e156bb 100644 --- a/BaseTools/Tests/TestTools.py +++ b/BaseTools/Tests/TestTools.py @@ -2,7 +2,7 @@ ## @file # Utility functions and classes for BaseTools unit tests # -# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.
+# Copyright (c) 2008 - 2025, Intel Corporation. All rights reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -45,7 +45,7 @@ def MakeTheTestSuite(localItems): def GetBaseToolsPaths(): if sys.platform in ('win32', 'win64'): - return [ os.path.join(BaseToolsDir, 'Bin', sys.platform.title()) ] + return [ os.path.join(BaseToolsDir, 'Bin', x) for x in ('Win32', 'Win64') ] else: uname = os.popen('uname -sm').read().strip() for char in (' ', '/'): From c0ef2b017855177903d87937ac4cdaec5c7851db Mon Sep 17 00:00:00 2001 From: Nate DeSimone Date: Fri, 6 Jun 2025 16:04:29 -0700 Subject: [PATCH 0015/1172] BaseTools: Add support for mingw-w64 Adds support for building the C language BaseTools for Windows using toolchains based on mingw-w64. Mingw-w64 is a collection of header files, libraries, and tools that when combined with a compiler enable development of Windows software. Mingw-w64 is a fork of the original MinGW (Minimalist GNU for Windows). Most active development on MinGW has ceased and mingw-w64 is now the actively maintained successor. Mingw-w64 provides a libc implementation built on top of Microsoft's UCRT (Universal C Runtime) with all nessesary compiler bindings needed to support the C++11 feature set. Modern mingw-w64 development appears to have coalesced around MSYS2, which produces a distributions of both GCC and LLVM/Clang that use mingw-w64 to target the Windows OS. This MSYS2 Clang distribution has a UNIX-like directory layout and includes Windows binaries of GNU Make. Combined with the open source licensing, MSYS2's Clang distribution is a highly attractive choice as an alternative Windows SDK for open source projects such as TianoCore. If one wishes to use EDK II to build UEFI firmware on the Windows platform, then the C BaseTools need to be compiled as Windows applications. This includes the PcdValueInit.exe program, which needs to be recompiled every time a firmware build is run in order to regenerate the initial values for structured PCDs. Currently, BaseTools only supports the Visual C++ toolchain on the Windows platform. The following new features have been added to enable usage of the toolchains derived from mingw-w64: - Fixes to the BaseTools C source code to support the use of a GCC-style compiler on the Windows OS. - The GNU Make-style Makefiles for the C BaseTools have been modified to support Windows. Both GCC + mingw-w64 and Clang + mingw-w64 have been tested and confirmed to build a working BaseTools. - BaseTools now supports generating GNU Make-style Makefiles on the Windows platform for the purpose of building firmware. - edksetup.bat has been modified to optionally build BaseTools via mingw-w64. There is no impact to the existing support for Visual C++ and Visual C++ remains the default toolchain. Usage Instructions: For the vast majority of users, the only system setup change nessesary to use a mingw-w64 toolchain is to set the BASETOOLS_MINGW_PATH to the directory containing the desired mingw-w64 based toolchain. A new command line argument has been added to edksetup.bat: Mingw-w64 If this command line argument is set, then the script will set the BASETOOLS_MINGW_BUILD environment variable. The user can also opt to set this environment variable manually before running edksetup.bat If BASETOOLS_MINGW_BUILD is defined, then the BASETOOLS_MINGW_PATH environment variable must point to the directory containing the mingw-w64 toolchain. If CLANG_BIN is not defined and %BASETOOLS_MINGW_PATH%\bin\clang.exe exists, then edksetup.bat will set CLANG_BIN=%BASETOOLS_MINGW_PATH%\bin\ This removes the requirement to configure the CLANG_BIN environment variable manually in order to run a CLANGPDB or CLANGDWARF build if one has the MSYS2 Clang distribution installed. If one wishes to use a different copy of Clang (for example official LLVM binaries) to build firmware and only use the MSYS2 Clang to build BaseTools, then one can continue to set the CLANG_BIN environment variable, same as before. I have tested the MSYS2 Clang distribution against the official LLVM distribution and can confirm that if the compiler version is the same the emitted machine code is identical between the two. Interestingly, the MSYS2 Clang distribution emits the path to the PDB file using "/" as the path seperator instead of "\". That appears to be the only difference in output. Therefore, using the MSYS2 Clang distribution to compile firmware seems a reasonable choice. If CLANG_HOST_BIN is not defined and BASETOOLS_MINGW_BUILD is defined and %BASETOOLS_MINGW_PATH%\bin\mingw32-make.exe exists, then edksetup.bat will add %BASETOOLS_MINGW_PATH%\bin\ to the PATH and set CLANG_HOST_BIN=mingw32- This enable usage of the GNU Make included in the mingw-w64 toolchain to build firmware in addition to BaseTools. if BASETOOLS_MINGW_BUILD is not defined, edksetup.bat will continue to set CLANG_HOST_BIN=n, which uses nmake to build firmware. This behavior can be overridden by manually setting the value of CLANG_HOST_BIN before executing edksetup.bat if one wishes to use a specific Make utility for the CLANGPDB/CLANGDWARF toolchains. References: - https://www.mingw-w64.org/ - https://www.msys2.org/ Co-authored-by: Sandesh Jain Signed-off-by: Nate DeSimone --- BaseTools/Makefile | 3 +- .../Source/C/BrotliCompress/BrotliCompress.c | 3 + BaseTools/Source/C/Common/CommonLib.c | 4 +- BaseTools/Source/C/Common/CommonLib.h | 9 +- BaseTools/Source/C/DevicePath/GNUmakefile | 11 +- BaseTools/Source/C/GNUmakefile | 51 +-- BaseTools/Source/C/GenFv/GenFvInternalLib.c | 4 +- BaseTools/Source/C/Makefiles/GnuMakeUtils.py | 291 ++++++++++++++++ BaseTools/Source/C/Makefiles/app.makefile | 12 +- BaseTools/Source/C/Makefiles/footer.makefile | 8 +- BaseTools/Source/C/Makefiles/header.makefile | 132 ++++++-- BaseTools/Source/C/VfrCompile/GNUmakefile | 24 +- .../Source/C/VfrCompile/Pccts/antlr/makefile | 13 +- .../Source/C/VfrCompile/Pccts/dlg/makefile | 12 +- .../Source/Python/Workspace/DscBuildData.py | 50 ++- BaseTools/Tests/GNUmakefile | 52 ++- BaseTools/toolsetup.bat | 315 +++++++++++++----- edksetup.bat | 18 +- 18 files changed, 806 insertions(+), 206 deletions(-) create mode 100644 BaseTools/Source/C/Makefiles/GnuMakeUtils.py diff --git a/BaseTools/Makefile b/BaseTools/Makefile index 10963009e9e2..9597e5d9da5c 100644 --- a/BaseTools/Makefile +++ b/BaseTools/Makefile @@ -1,7 +1,7 @@ ## @file # Windows makefile for Base Tools project build. # -# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
+# Copyright (c) 2007 - 2025, Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -26,6 +26,7 @@ subdirs: $(SUBDIRS) clean: @if defined PYTHON_COMMAND $(PYTHON_COMMAND) $(BASE_TOOLS_PATH)\Source\C\Makefiles\NmakeSubdirs.py clean $(SUBDIRS) @if not defined PYTHON_COMMAND $(PYTHON_HOME)\python.exe $(BASE_TOOLS_PATH)\Source\C\Makefiles\NmakeSubdirs.py clean $(SUBDIRS) + @if exist $(BASE_TOOLS_PATH)\Source\C\libs RMDIR /S /Q libs # For handling the case of the user building with GNU make and then re-building with nmake at a later date. .PHONY: cleanall cleanall: diff --git a/BaseTools/Source/C/BrotliCompress/BrotliCompress.c b/BaseTools/Source/C/BrotliCompress/BrotliCompress.c index 62a6aed3dbd0..c6b018905a5d 100644 --- a/BaseTools/Source/C/BrotliCompress/BrotliCompress.c +++ b/BaseTools/Source/C/BrotliCompress/BrotliCompress.c @@ -2,6 +2,7 @@ BrotliCompress Compress/Decompress tool (BrotliCompress) Copyright (c) 2020, ByoSoft Corporation. All rights reserved.
+ Copyright (c) 2025, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -52,12 +53,14 @@ static FILE* ms_fopen(const char* FileName, const char* Mode) { return Result; } +#if !defined(__MINGW32__) static int ms_open(const char* FileName, int Oflag, int Pmode) { int Result; Result = -1; _sopen_s(&Result, FileName, Oflag | O_BINARY, _SH_DENYNO, Pmode); return Result; } +#endif #endif /* WIN32 */ diff --git a/BaseTools/Source/C/Common/CommonLib.c b/BaseTools/Source/C/Common/CommonLib.c index b2cde6d48167..5830cc147e53 100644 --- a/BaseTools/Source/C/Common/CommonLib.c +++ b/BaseTools/Source/C/Common/CommonLib.c @@ -1,7 +1,7 @@ /** @file Common basic Library Functions -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.
+Copyright (c) 2004 - 2025, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -469,6 +469,7 @@ PrintGuidToBuffer ( #ifdef __GNUC__ +#ifndef _WIN32 size_t _filelength(int fd) { struct stat stat_buf; @@ -487,6 +488,7 @@ char *strlwr(char *s) } #endif #endif +#endif #define WINDOWS_EXTENSION_PATH "\\\\?\\" #define WINDOWS_UNC_EXTENSION_PATH "\\\\?\\UNC" diff --git a/BaseTools/Source/C/Common/CommonLib.h b/BaseTools/Source/C/Common/CommonLib.h index a841029c2aaa..f554de1a4b6a 100644 --- a/BaseTools/Source/C/Common/CommonLib.h +++ b/BaseTools/Source/C/Common/CommonLib.h @@ -1,7 +1,7 @@ /** @file Common library assistance routines. -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.
+Copyright (c) 2004 - 2025, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -450,12 +450,17 @@ Routine Description: #define _stricmp strcasecmp #define strnicmp strncasecmp #define strcmpi strcasecmp -size_t _filelength(int fd); #ifndef __CYGWIN__ char *strlwr(char *s); #endif #endif +#ifdef _WIN32 +#include // io.h provides the declaration of _filelength on Windows +#else +size_t _filelength(int fd); // Only declare this on non-Windows systems +#endif + // // On windows, mkdir only has one parameter. // On unix, it has two parameters diff --git a/BaseTools/Source/C/DevicePath/GNUmakefile b/BaseTools/Source/C/DevicePath/GNUmakefile index 26ae14c468b7..40cf277b34c2 100644 --- a/BaseTools/Source/C/DevicePath/GNUmakefile +++ b/BaseTools/Source/C/DevicePath/GNUmakefile @@ -1,7 +1,7 @@ ## @file # GNU/Linux makefile for 'DevicePath' module build. # -# Copyright (c) 2017, Intel Corporation. All rights reserved.
+# Copyright (c) 2017 - 2025, Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent # ARCH ?= IA32 @@ -13,8 +13,13 @@ OBJECTS = DevicePath.o UefiDevicePathLib.o DevicePathFromText.o DevicePathUtili include $(MAKEROOT)/Makefiles/app.makefile -GCCVERSION = $(shell $(CC) -dumpversion | awk -F'.' '{print $$1}') -CLANG := $(shell $(CC) --version | grep clang) +ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) +GCCVERSION := $(shell for /f "tokens=1 delims=." %%a in ("$(shell $(CC) -dumpversion)") do echo %%a) +else +GCCVERSION := $(shell $(CC) -dumpversion | awk -F'.' '{print $$1}') +endif +CLANG := $(findstring clang,$(shell $(CC) --version)) + ifneq ("$(GCCVERSION)", "5") ifeq ($(CLANG),) ifneq ($(DARWIN),Darwin) diff --git a/BaseTools/Source/C/GNUmakefile b/BaseTools/Source/C/GNUmakefile index 5275f657efe8..0ea314ef9623 100644 --- a/BaseTools/Source/C/GNUmakefile +++ b/BaseTools/Source/C/GNUmakefile @@ -1,50 +1,23 @@ ## @file # GNU/Linux makefile for C tools build. # -# Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.
+# Copyright (c) 2007 - 2025, Intel Corporation. All rights reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # -ifndef HOST_ARCH - # - # If HOST_ARCH is not defined, then we use 'uname -m' to attempt - # try to figure out the appropriate HOST_ARCH. - # - uname_m = $(shell uname -m) - $(info Attempting to detect HOST_ARCH from 'uname -m': $(uname_m)) - ifneq (,$(strip $(filter $(uname_m), x86_64 amd64))) - HOST_ARCH=X64 - endif - ifeq ($(patsubst i%86,IA32,$(uname_m)),IA32) - HOST_ARCH=IA32 - endif - ifneq (,$(findstring aarch64,$(uname_m))) - HOST_ARCH=AARCH64 - else ifneq (,$(findstring arm64,$(uname_m))) - HOST_ARCH=AARCH64 - else ifneq (,$(findstring arm,$(uname_m))) - HOST_ARCH=ARM - endif - ifneq (,$(findstring riscv64,$(uname_m))) - HOST_ARCH=RISCV64 - endif - ifneq (,$(findstring loongarch64,$(uname_m))) - HOST_ARCH=LOONGARCH64 - endif - ifndef HOST_ARCH - $(info Could not detected HOST_ARCH from uname results) - $(error HOST_ARCH is not defined!) - endif - $(info Detected HOST_ARCH of $(HOST_ARCH) using uname.) +ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) + SHELL := cmd.exe + MAKEROOT := $(shell echo %CD%) +else + MAKEROOT := . endif -export HOST_ARCH - -MAKEROOT = . - include Makefiles/header.makefile +export PYTHON_COMMAND +export HOST_ARCH + all: makerootdir subdirs @echo Finished building BaseTools C Tools with HOST_ARCH=$(HOST_ARCH) @@ -71,7 +44,7 @@ $(APPLICATIONS): $(LIBRARIES) $(MAKEROOT)/bin $(VFRAUTOGEN) .PHONY: outputdirs makerootdir: - -mkdir -p $(MAKEROOT) + -$(MD) $(MAKEROOT) .PHONY: subdirs $(SUBDIRS) subdirs: $(SUBDIRS) @@ -90,7 +63,7 @@ clean: $(patsubst %,%-clean,$(sort $(SUBDIRS))) clean: localClean localClean: - rm -f $(MAKEROOT)/bin/* - -rmdir $(MAKEROOT)/libs $(MAKEROOT)/bin + $(RM) $(MAKEROOT)/bin/* + -$(RD) $(MAKEROOT)/libs $(MAKEROOT)/bin include Makefiles/footer.makefile diff --git a/BaseTools/Source/C/GenFv/GenFvInternalLib.c b/BaseTools/Source/C/GenFv/GenFvInternalLib.c index 44be413bda5a..e4f4090ee4c4 100644 --- a/BaseTools/Source/C/GenFv/GenFvInternalLib.c +++ b/BaseTools/Source/C/GenFv/GenFvInternalLib.c @@ -1,7 +1,7 @@ /** @file This file contains the internal functions required to generate a Firmware Volume. -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.
+Copyright (c) 2004 - 2025, Intel Corporation. All rights reserved.
Portions Copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.
Portions Copyright (c) 2016 HP Development Company, L.P.
Portions Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.
@@ -16,7 +16,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #if defined(__FreeBSD__) #include -#elif defined(__GNUC__) +#elif defined(__GNUC__) && !defined(_WIN32) #if !defined(__CROSS_LIB_UUID__) #include #else diff --git a/BaseTools/Source/C/Makefiles/GnuMakeUtils.py b/BaseTools/Source/C/Makefiles/GnuMakeUtils.py new file mode 100644 index 000000000000..3924311f4304 --- /dev/null +++ b/BaseTools/Source/C/Makefiles/GnuMakeUtils.py @@ -0,0 +1,291 @@ +#!/usr/bin/env python3 +# +## @file GnuMakeUtils.py +# +# +# Copyright (c) 2025, Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +# +from collections import namedtuple +import glob +import os +import re +import shutil +import subprocess +import sys +import traceback +if sys.platform == 'win32': + from ctypes import windll, POINTER, byref, GetLastError, Structure, WinError + from ctypes import c_void_p, c_ushort, c_int, c_long, c_ulong, c_wchar, sizeof + +ARCH_UNKNOWN = 'Unknown' +ARCH_IA32 = 'IA32' +ARCH_X64 = 'X64' +ARCH_AARCH64 = 'AARCH64' +ARCH_ARM = 'ARM' +ARCH_RISCV64 = 'RISCV64' +ARCH_LOONGARCH64 = 'LOONGARCH64' +_Process = namedtuple('Process', ['process_id', 'parent_process_id', 'exe_filename']) + +def _get_win32_process_architecture(pid): + IMAGE_FILE_MACHINE_I386 = 0x014c + IMAGE_FILE_MACHINE_AMD64 = 0x8664 + IMAGE_FILE_MACHINE_ARM64 = 0xAA64 + def _get_machine_type(machine_id): + if machine_id == IMAGE_FILE_MACHINE_I386: + return ARCH_IA32 + elif machine_id == IMAGE_FILE_MACHINE_AMD64: + return ARCH_X64 + elif machine_id == IMAGE_FILE_MACHINE_ARM64: + return ARCH_AARCH64 + return ARCH_UNKNOWN + PROCESS_QUERY_LIMITED_INFORMATION = 0x1000 + kernel32 = windll.kernel32 + OpenProcess = kernel32.OpenProcess + OpenProcess.argtypes = [c_ulong, c_int, c_ulong] + OpenProcess.restype = c_void_p + CloseHandle = kernel32.CloseHandle + CloseHandle.argtypes = [c_void_p] + CloseHandle.restype = c_int + + IsWow64Process2 = None + IMAGE_FILE_MACHINE_UNKNOWN = 0 + try: + #IsWow64Process2() is only available on Win10 TH2 or later + IsWow64Process2 = kernel32.IsWow64Process2 + except AttributeError: + IsWow64Process2 = None + if IsWow64Process2 is not None: + IsWow64Process2.argtypes = [c_void_p, POINTER(c_ushort), POINTER(c_ushort)] + IsWow64Process2.restype = c_int + ProcessMachine = c_ushort(1) + NativeMachine = c_ushort(1) + hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, 0, pid) + if hProcess == c_void_p(0): + raise WinError(GetLastError()) + if IsWow64Process2(hProcess, byref(ProcessMachine), byref(NativeMachine)) != 0: + CloseHandle(hProcess) + if ProcessMachine.value == IMAGE_FILE_MACHINE_UNKNOWN: + return _get_machine_type(NativeMachine.value) + else: + return _get_machine_type(ProcessMachine.value) + else: + CloseHandle(hProcess) + raise WinError(GetLastError()) + else: + #Graceful fallback for older OSes + PROCESSOR_ARCHITECTURE_INTEL = 0 + PROCESSOR_ARCHITECTURE_AMD64 = 9 + class _SYSTEM_INFO(Structure): + _fields_ = [('wProcessorArchitecture', c_ushort), + ('wReserved', c_ushort), + ('dwPageSize', c_ulong), + ('lpMinimumApplicationAddress', c_void_p), + ('lpMaximumApplicationAddress', c_void_p), + ('dwActiveProcessorMask', c_void_p), + ('dwNumberOfProcessors', c_ulong), + ('dwProcessorType', c_ulong), + ('dwAllocationGranularity', c_ulong), + ('wProcessorLevel', c_ushort), + ('wProcessorRevision', c_ushort)] + GetNativeSystemInfo = kernel32.GetNativeSystemInfo + GetNativeSystemInfo.argtypes = [POINTER(_SYSTEM_INFO)] + systemInfo = _SYSTEM_INFO() + GetNativeSystemInfo(byref(systemInfo)) + if systemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64: + hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, 0, pid) + if hProcess == c_void_p(0): + raise WinError(GetLastError()) + IsWow64Process = kernel32.IsWow64Process + IsWow64Process.argtypes = [c_void_p, POINTER(c_int)] + IsWow64Process.restype = c_int + is_wow64 = c_int(0) + if IsWow64Process(hProcess, byref(is_wow64)) != 0: + CloseHandle(hProcess) + if is_wow64.value != 0: + return ARCH_IA32 + else: + return ARCH_X64 + else: + CloseHandle(hProcess) + raise WinError(GetLastError()) + elif systemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL: + return ARCH_IA32 + return ARCH_UNKNOWN + +def _get_win32_process_list(): + class _PROCESSENTRY32W(Structure): + _fields_ = [('dwSize', c_ulong), + ('cntUsage', c_ulong), + ('th32ProcessID', c_ulong), + ('th32DefaultHeapID', c_void_p), + ('th32ModuleID', c_ulong), + ('cntThreads', c_ulong), + ('th32ParentProcessID', c_ulong), + ('pcPriClassBase', c_long), + ('dwFlags', c_ulong), + ('szExeFile', (c_wchar * 260))] + INVALID_HANDLE_VALUE = c_void_p(-1) + TH32CS_SNAPPROCESS = 2 + ERROR_NO_MORE_FILES = 18 + kernel32 = windll.kernel32 + CreateToolhelp32Snapshot = kernel32.CreateToolhelp32Snapshot + CreateToolhelp32Snapshot.argtypes = [c_ulong, c_ulong] + CreateToolhelp32Snapshot.restype = c_void_p + Process32First = kernel32.Process32FirstW + Process32First.argtypes = [c_void_p, POINTER(_PROCESSENTRY32W)] + Process32First.restype = c_int + Process32Next = kernel32.Process32NextW + Process32Next.argtypes = [c_void_p, POINTER(_PROCESSENTRY32W)] + Process32Next.restype = c_int + CloseHandle = kernel32.CloseHandle + CloseHandle.argtypes = [c_void_p] + CloseHandle.restype = c_int + + hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) + if hSnapshot == INVALID_HANDLE_VALUE.value: + raise WinError(GetLastError()) + process_list = [] + processEntry = _PROCESSENTRY32W() + processEntry.dwSize = sizeof(processEntry) + more_processes = True + if Process32First(hSnapshot, byref(processEntry)) == 0: + raise WinError(GetLastError()) + while more_processes: + process_list.append(_Process(processEntry.th32ProcessID, processEntry.th32ParentProcessID, processEntry.szExeFile)) + if Process32Next(hSnapshot, byref(processEntry)) == 0: + status = GetLastError() + if status == ERROR_NO_MORE_FILES: + more_processes = False + else: + raise WinError(status) + CloseHandle(hSnapshot) + return process_list + +def _get_win32_parent_processes(): + kernel32 = windll.kernel32 + GetCurrentProcessId = kernel32.GetCurrentProcessId + GetCurrentProcessId.argtypes = [] + GetCurrentProcessId.restype = c_ulong + + process_list = _get_win32_process_list() + pid = GetCurrentProcessId() + parent_processes = [] + found_parent = True + while found_parent: + found_parent = False + for process in process_list: + if process.process_id == pid: + found_parent = True + parent_processes.append(process) + pid = process.parent_process_id + break + return parent_processes + +def _get_mingw_target_architecture(): + parent_processes = _get_win32_parent_processes() + for process in parent_processes: + if 'make' in process.exe_filename.lower(): + return _get_win32_process_architecture(process.process_id) + return ARCH_UNKNOWN + +def get_host_arch(): + if sys.platform == 'win32': + host_arch = _get_mingw_target_architecture() + else: + result = subprocess.run('uname -m', universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True, check=True) + uname_m = result.stdout.strip() + ia32_regex = re.compile(r".*i[8]?[0-9]86.*") + ia32_match = ia32_regex.match(uname_m) + if 'x86_64' in uname_m or 'amd64' in uname_m: + host_arch = ARCH_X64 + elif ia32_match: + host_arch = ARCH_IA32 + elif 'aarch64' in uname_m or 'arm64' in uname_m: + host_arch = ARCH_AARCH64 + elif 'arm' in uname_m: + host_arch = ARCH_ARM + elif 'riscv64' in uname_m: + host_arch = ARCH_RISCV64 + elif 'loongarch64' in uname_m: + host_arch = ARCH_LOONGARCH64 + # There is a corner case for the Raspberry Pi. Sometimes it has a 64-bit + # kernel paired with an exclusively 32-bit user mode. Check for this case. + if shutil.which("lsb_release") is not None: + res = subprocess.run(["lsb_release", "-i"], universal_newlines=True, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + check=True) + distributor = res.stdout.strip() + if distributor == "Distributor ID:\tRaspbian": + host_arch = ARCH_ARM + print(host_arch) + return 0 + +def main(): + if sys.argv[1] == 'get_host_arch': + return get_host_arch() + elif sys.argv[1] == 'cp': + shutil.copy(os.path.normpath(sys.argv[2]), os.path.normpath(sys.argv[3])) + elif sys.argv[1] == 'mv': + shutil.move(os.path.normpath(sys.argv[2]), os.path.normpath(sys.argv[3])) + elif sys.argv[1] == 'rm': + paths = [os.path.normpath(x) for x in sys.argv[2:]] + files = [] + for path in paths: + if '*' in path: + files.extend(glob.glob(path)) + else: + files.append(path) + for file in files: + if os.path.exists(file): + if os.path.isfile(file): + os.remove(file) + else: + sys.stderr.writelines(['{} is not a file.'.format(file)]) + else: + sys.stderr.writelines(['File {} does not exist.'.format(file)]) + elif sys.argv[1] == 'md': + path = os.path.normpath(sys.argv[2]) + if not os.path.exists(path): + os.makedirs(path) + else: + if os.path.isdir(path): + sys.stderr.writelines(['Directory {} already exists.'.format(path)]) + else: + sys.stderr.writelines(['{} is a file.'.format(path)]) + return 1 + elif sys.argv[1] == 'rd': + paths = [os.path.normpath(x) for x in sys.argv[2:]] + for path in paths: + if os.path.exists(path): + if os.path.isdir(path): + shutil.rmtree(path) + else: + sys.stderr.writelines(['{} is not a directory.'.format(path)]) + else: + sys.stderr.writelines(['Directory {} does not exist.'.format(path)]) + elif sys.argv[1] == 'rm_pyc_files': + path = os.path.normpath(sys.argv[2]) + files = glob.glob(os.path.join(path, '*.pyc')) + for file in files: + if os.path.exists(file): + if os.path.isfile(file): + os.remove(file) + else: + sys.stderr.writelines(['{} is not a file.'.format(file)]) + else: + sys.stderr.writelines(['File {} does not exist.'.format(file)]) + py_cache = os.path.join(path, '__pycache__') + if os.path.isdir(py_cache): + shutil.rmtree(py_cache) + else: + sys.stderr.writelines(['Unsupported command.']) + return 1 + return 0 + +if __name__ == '__main__': + try: + sys.exit(main()) + except Exception as e: + traceback.print_exc() + sys.exit(1) diff --git a/BaseTools/Source/C/Makefiles/app.makefile b/BaseTools/Source/C/Makefiles/app.makefile index 506343a6e0b4..0ad1378e3290 100644 --- a/BaseTools/Source/C/Makefiles/app.makefile +++ b/BaseTools/Source/C/Makefiles/app.makefile @@ -1,7 +1,7 @@ ## @file # Makefiles # -# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.
+# Copyright (c) 2007 - 2025, Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -16,7 +16,17 @@ all: $(MAKEROOT)/bin $(APPLICATION) $(APPLICATION): $(OBJECTS) $(LINKER) -o $(APPLICATION) $(LDFLAGS) $(OBJECTS) -L$(MAKEROOT)/libs $(LIBS) +ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) + $(CP) $(APPLICATION).exe $(BIN_PATH) +endif $(OBJECTS): $(MAKEROOT)/Include/Common/BuildVersion.h +clean: appClean + +appClean: +ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) + $(RM) $(BIN_PATH)/$(APPNAME).exe +endif + include $(MAKEROOT)/Makefiles/footer.makefile diff --git a/BaseTools/Source/C/Makefiles/footer.makefile b/BaseTools/Source/C/Makefiles/footer.makefile index 7546da8cf5a0..9a3dfcd49440 100644 --- a/BaseTools/Source/C/Makefiles/footer.makefile +++ b/BaseTools/Source/C/Makefiles/footer.makefile @@ -1,18 +1,18 @@ ## @file # Makefile # -# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.
+# Copyright (c) 2007 - 2025, Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent # DEPFILES = $(OBJECTS:%.o=%.d) $(MAKEROOT)/libs-$(HOST_ARCH): - mkdir -p $(MAKEROOT)/libs-$(HOST_ARCH) + $(MD) $(MAKEROOT)/libs-$(HOST_ARCH) .PHONY: install install: $(MAKEROOT)/libs-$(HOST_ARCH) $(LIBRARY) - cp $(LIBRARY) $(MAKEROOT)/libs-$(HOST_ARCH) + $(CP) $(LIBRARY) $(MAKEROOT)/libs-$(HOST_ARCH) $(LIBRARY): $(OBJECTS) $(AR) crs $@ $^ @@ -25,6 +25,6 @@ $(LIBRARY): $(OBJECTS) .PHONY: clean clean: - @rm -f $(OBJECTS) $(LIBRARY) $(DEPFILES) + $(RM) $(OBJECTS) $(LIBRARY) $(DEPFILES) -include $(DEPFILES) diff --git a/BaseTools/Source/C/Makefiles/header.makefile b/BaseTools/Source/C/Makefiles/header.makefile index f16b3297fc68..55a7307a5ec0 100644 --- a/BaseTools/Source/C/Makefiles/header.makefile +++ b/BaseTools/Source/C/Makefiles/header.makefile @@ -5,48 +5,117 @@ # HOST_ARCH = ia32 or IA32 for IA32 build # HOST_ARCH = Arm or ARM for ARM build # -# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
+# Copyright (c) 2007 - 2025, Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent +# Set SEP to the platform specific path seperator +ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) + SHELL := cmd.exe + SEP:=$(shell echo \) +else + SEP:=/ +endif + EDK2_PATH ?= $(MAKEROOT)/../../.. +ifndef PYTHON_COMMAND + ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) + # + # Try using the Python Launcher for Windows to find an interperter. + # + CHECK_PY := $(shell where py.exe || echo NotFound) + ifeq ($(CHECK_PY),NotFound) + # + # PYTHON_HOME is the old method of specifying a Python interperter on Windows. + # Check if an interperter can be found using PYTHON_HOME. + # + ifdef PYTHON_HOME + ifndef (,$(wildcard $(PYTHON_HOME)$(SEP)python.exe)) # Make sure the file exists + PYTHON_COMMAND := $(PYTHON_HOME)$(SEP)python.exe + else + $(error Unable to find a Python interperter, if one is installed, set the PYTHON_COMMAND environment variable!) + endif + endif + else + PYTHON_COMMAND := $(shell py -3 -c "import sys; print(sys.executable)") + ifdef (,$(wildcard $(PYTHON_COMMAND))) # Make sure the file exists + $(error Unable to find a Python interperter, if one is installed, set the PYTHON_COMMAND environment variable!) + endif + endif + undefine CHECK_PY + else # UNIX + PYTHON_COMMAND := $(shell /usr/bin/env python3 -c "import sys; print(sys.executable)") + ifdef (,$(wildcard $(PYTHON_COMMAND))) # Make sure the file exists + PYTHON_COMMAND := $(shell /usr/bin/env python -c "import sys; print(sys.executable)") + ifdef (,$(wildcard $(PYTHON_COMMAND))) # Make sure the file exists + undefine PYTHON_COMMAND + endif + endif + ifndef PYTHON_COMMAND + $(error Unable to find a Python interpreter, if one is installed, set the PYTHON_COMMAND environment variable!) + endif + endif + export PYTHON_COMMAND +endif + +# GnuMakeUtils.py is able to handle forward slashes in file paths on Windows systems +GNU_MAKE_UTILS_PY := $(PYTHON_COMMAND) $(MAKEROOT)$(SEP)Makefiles$(SEP)GnuMakeUtils.py +CP := $(GNU_MAKE_UTILS_PY) cp +MV := $(GNU_MAKE_UTILS_PY) mv +RM := $(GNU_MAKE_UTILS_PY) rm +MD := $(GNU_MAKE_UTILS_PY) md +RD := $(GNU_MAKE_UTILS_PY) rd ifndef HOST_ARCH # - # If HOST_ARCH is not defined, then we use 'uname -m' to attempt + # If HOST_ARCH is not defined, then we use 'GnuMakeUtils.py' to attempt # try to figure out the appropriate HOST_ARCH. # - uname_m = $(shell uname -m) - $(info Attempting to detect HOST_ARCH from 'uname -m': $(uname_m)) - ifneq (,$(strip $(filter $(uname_m), x86_64 amd64))) - HOST_ARCH=X64 - endif - ifeq ($(patsubst i%86,IA32,$(uname_m)),IA32) - HOST_ARCH=IA32 - endif - ifneq (,$(findstring aarch64,$(uname_m))) - HOST_ARCH=AARCH64 - else ifneq (,$(findstring arm64,$(uname_m))) - HOST_ARCH=AARCH64 - else ifneq (,$(findstring arm,$(uname_m))) - HOST_ARCH=ARM + GET_GNU_HOST_ARCH_PY:=$(MAKEROOT)$(SEP)Makefiles$(SEP)GnuMakeUtils.py get_host_arch + ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) + HOST_ARCH:=$(shell if defined PYTHON_COMMAND $(PYTHON_COMMAND) $(GET_GNU_HOST_ARCH_PY)) + else + HOST_ARCH:=$(shell if command -v $(PYTHON_COMMAND) >/dev/null 1; then $(PYTHON_COMMAND) $(GET_GNU_HOST_ARCH_PY); else python $(GET_GNU_HOST_ARCH_PY); fi) endif - ifneq (,$(findstring riscv64,$(uname_m))) - HOST_ARCH=RISCV64 + ifeq ($(HOST_ARCH),) + $(info HOST_ARCH detection failed.) + undefine HOST_ARCH endif - ifneq (,$(findstring loongarch64,$(uname_m))) - HOST_ARCH=LOONGARCH64 + ifeq ($(HOST_ARCH),Unknown) + $(info HOST_ARCH detection failed.) + undefine HOST_ARCH endif - ifndef HOST_ARCH - $(info Could not detected HOST_ARCH from uname results) - $(error HOST_ARCH is not defined!) +endif +ifndef HOST_ARCH + $(error HOST_ARCH is not defined!) +endif + +#Set up BaseTools binary path for Windows builds +ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) + ifndef BIN_PATH + BIN_PATH_BASE=$(MAKEROOT)/../../Bin + ifeq ($(HOST_ARCH),X64) + BIN_PATH=$(BIN_PATH_BASE)/Win64 + else + ifeq ($(HOST_ARCH),AARCH64) + BIN_PATH=$(BIN_PATH_BASE)/Win64 + else + BIN_PATH=$(BIN_PATH_BASE)/Win32 + endif + endif endif - $(info Detected HOST_ARCH of $(HOST_ARCH) using uname.) endif -CYGWIN:=$(findstring CYGWIN, $(shell uname -s)) -LINUX:=$(findstring Linux, $(shell uname -s)) -DARWIN:=$(findstring Darwin, $(shell uname -s)) -CLANG:=$(shell $(CC) --version | grep clang) +ifneq ($(findstring cmd,$(SHELL)),cmd) + CYGWIN:=$(findstring CYGWIN, $(shell uname -s)) + LINUX:=$(findstring Linux, $(shell uname -s)) + DARWIN:=$(findstring Darwin, $(shell uname -s)) +else + #Don't use uname on Windows + CYGWIN:= + LINUX:= + DARWIN:= +endif +CLANG := $(findstring clang,$(shell $(CC) --version)) ifneq ($(CLANG),) CC ?= $(CLANG_BIN)clang CXX ?= $(CLANG_BIN)clang++ @@ -141,7 +210,10 @@ LDFLAGS += $(EXTRA_LDFLAGS) all: $(MAKEROOT)/libs: - mkdir $(MAKEROOT)/libs + $(MD) $(MAKEROOT)/libs $(MAKEROOT)/bin: - mkdir $(MAKEROOT)/bin + $(MD) $(MAKEROOT)/bin +ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) + $(MD) $(BIN_PATH) +endif diff --git a/BaseTools/Source/C/VfrCompile/GNUmakefile b/BaseTools/Source/C/VfrCompile/GNUmakefile index 7d5976649dba..ad6c3508761f 100644 --- a/BaseTools/Source/C/VfrCompile/GNUmakefile +++ b/BaseTools/Source/C/VfrCompile/GNUmakefile @@ -1,7 +1,7 @@ ## @file # GNU/Linux makefile for 'VfrCompile' module build. # -# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.
+# Copyright (c) 2008 - 2025, Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -16,7 +16,7 @@ TOOL_INCLUDE = -I Pccts/h #OBJECTS = VfrSyntax.o VfrServices.o DLGLexer.o EfiVfrParser.o ATokenBuffer.o DLexerBase.o AParser.o OBJECTS = AParser.o DLexerBase.o ATokenBuffer.o EfiVfrParser.o VfrLexer.o VfrSyntax.o \ VfrFormPkg.o VfrError.o VfrUtilityLib.o VfrCompiler.o -CLANG:=$(shell $(CC) --version | grep clang) +CLANG := $(findstring clang,$(shell $(CC) --version)) ifneq ($(CLANG),) VFR_CPPFLAGS = -Wno-deprecated-register -std=c++14 -DPCCTS_USE_NAMESPACE_STD $(CPPFLAGS) else @@ -38,11 +38,17 @@ include $(MAKEROOT)/Makefiles/header.makefile APPLICATION = $(MAKEROOT)/bin/$(APPNAME) +BIN_DIR=. +export BIN_DIR + .PHONY:all all: $(MAKEROOT)/bin $(APPLICATION) $(APPLICATION): $(OBJECTS) $(LINKER) -o $(APPLICATION) $(VFR_LFLAGS) $(OBJECTS) -L$(MAKEROOT)/libs $(LIBS) +ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) + $(CP) $(APPLICATION).exe $(BIN_PATH) +endif VfrCompiler.o: ../Include/Common/BuildVersion.h @@ -55,10 +61,10 @@ VfrLexer.cpp VfrLexer.h: Pccts/dlg/dlg VfrParser.dlg Pccts/dlg/dlg -C2 -i -CC -cl VfrLexer -o . VfrParser.dlg Pccts/antlr/antlr: - BIN_DIR='.' $(MAKE) -C Pccts/antlr + $(MAKE) -C Pccts/antlr Pccts/dlg/dlg: - BIN_DIR='.' $(MAKE) -C Pccts/dlg + $(MAKE) -C Pccts/dlg ATokenBuffer.o: Pccts/h/ATokenBuffer.cpp $(CXX) -c $(VFR_CPPFLAGS) $(INC) $(VFR_CXXFLAGS) $? -o $@ @@ -75,7 +81,9 @@ VfrSyntax.o: VfrSyntax.cpp clean: localClean localClean: - BIN_DIR='.' $(MAKE) -C Pccts/antlr clean - BIN_DIR='.' $(MAKE) -C Pccts/dlg clean - rm -f $(EXTRA_CLEAN_OBJECTS) - + $(MAKE) -C Pccts/antlr clean + $(MAKE) -C Pccts/dlg clean + $(RM) $(EXTRA_CLEAN_OBJECTS) +ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) + $(RM) $(BIN_PATH)/$(APPNAME).exe +endif diff --git a/BaseTools/Source/C/VfrCompile/Pccts/antlr/makefile b/BaseTools/Source/C/VfrCompile/Pccts/antlr/makefile index b47c8a37afa6..87eedf3cf755 100644 --- a/BaseTools/Source/C/VfrCompile/Pccts/antlr/makefile +++ b/BaseTools/Source/C/VfrCompile/Pccts/antlr/makefile @@ -159,7 +159,14 @@ PCCTS_H=../h #set.$(OBJ_EXT): $(SET)/set.c # $(CC) $(CFLAGS) -c $(OUT_OBJ)set.$(OBJ_EXT) $(SET)/set.c - +ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) + SHELL := cmd.exe + SEP := $(shell echo \) + RM := del /f /q +else + SEP :=/ + RM := rm -f +endif # # UNIX (default) @@ -213,8 +220,8 @@ set.o : $(SET)/set.c #clean up all the intermediate files clean: - rm -f $(BIN_DIR)/antlr *.$(OBJ_EXT) core + $(RM) $(BIN_DIR)$(SEP)antlr *.$(OBJ_EXT) core #remove everything in clean plus the PCCTS files generated scrub: - rm -f $(PCCTS_GEN) *.$(OBJ_EXT) core + $(RM) $(PCCTS_GEN) *.$(OBJ_EXT) core diff --git a/BaseTools/Source/C/VfrCompile/Pccts/dlg/makefile b/BaseTools/Source/C/VfrCompile/Pccts/dlg/makefile index d72bee3d7035..e56b69041ee1 100644 --- a/BaseTools/Source/C/VfrCompile/Pccts/dlg/makefile +++ b/BaseTools/Source/C/VfrCompile/Pccts/dlg/makefile @@ -114,7 +114,15 @@ PCCTS_H=../h # # UNIX # -CLANG:=$(shell $(CC) --version | grep clang) +ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) + SHELL := cmd.exe + SEP := $(shell echo \) + RM := del /f /q +else + SEP :=/ + RM := rm -f +endif +CLANG := $(findstring clang,$(shell $(CC) --version)) ifneq ($(CLANG),) CC?=$(CLANG_BIN)clang else ifeq ($(origin CC),default) @@ -162,4 +170,4 @@ lint: #clean up all the intermediate files clean: - rm -f $(BIN_DIR)/dlg *.$(OBJ_EXT) core + $(RM) $(BIN_DIR)$(SEP)dlg *.$(OBJ_EXT) core diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py index 5df184f9c883..894cf2f3887b 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -1,7 +1,7 @@ ## @file # This file is used to create a database used by build tool # -# Copyright (c) 2008 - 2020, Intel Corporation. All rights reserved.
+# Copyright (c) 2008 - 2025, Intel Corporation. All rights reserved.
# (C) Copyright 2016 Hewlett Packard Enterprise Development LP
# SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -38,7 +38,9 @@ from Workspace.BuildClassObject import PlatformBuildClassObject, StructurePcd, PcdClassObject, ModuleBuildClassObject from collections import OrderedDict, defaultdict import json +import os import shutil +import sys def _IsFieldValueAnArray (Value): Value = Value.strip() @@ -106,9 +108,9 @@ def _IsFieldValueAnArray (Value): ''' PcdGccMakefile = ''' -MAKEROOT ?= $(EDK_TOOLS_PATH)/Source/C +MAKEROOT ?= $(EDK_TOOLS_PATH)%sSource%sC LIBS = -lCommon -''' +'''%(os.sep, os.sep) variablePattern = re.compile(r'[\t\s]*0[xX][a-fA-F0-9]+$') SkuIdPattern = re.compile(r'^[a-zA-Z_][a-zA-Z0-9_]*$') @@ -231,6 +233,21 @@ def __init__(self, FilePath, RawData, BuildDataBase, Arch=TAB_ARCH_COMMON, Targe self._Clear() self.WorkspaceDir = os.getenv("WORKSPACE") if os.getenv("WORKSPACE") else "" self.DefaultStores = None + MingwBaseToolsBuild = None + if sys.platform == 'win32': + MingwBaseToolsBuild = os.getenv("BASETOOLS_MINGW_BUILD") + if MingwBaseToolsBuild is not None: + try: + MingwBaseToolsBuild = int(MingwBaseToolsBuild) + except: + pass + try: + MingwBaseToolsBuild = bool(MingwBaseToolsBuild) + except: + pass + if not isinstance(MingwBaseToolsBuild, bool): + MingwBaseToolsBuild = False + self._MingwBaseToolsBuild = MingwBaseToolsBuild self.SkuIdMgr = SkuClass(self.SkuName, self.SkuIds) self.UpdatePcdTypeDict() @property @@ -2772,7 +2789,7 @@ def GetStructurePcdSet (self, OutputValueFile): def GetBuildOptionsValueList(self): CC_FLAGS = LinuxCFLAGS - if sys.platform == "win32": + if sys.platform == "win32" and not self._MingwBaseToolsBuild: CC_FLAGS = WindowsCFLAGS BuildOptions = OrderedDict() for Options in self.BuildOptions: @@ -2957,12 +2974,13 @@ def GenerateByteArrayValue (self, StructuredPcds): # start generating makefile MakeApp = PcdMakefileHeader - if sys.platform == "win32": + if sys.platform == "win32" and not self._MingwBaseToolsBuild: MakeApp = MakeApp + 'APPFILE = %s\\%s.exe\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\\%s.obj %s.obj\n' % (self.OutputPath, PcdValueInitName, os.path.join(self.OutputPath, PcdValueCommonName)) + 'INC = ' else: + AppSuffix = '.exe' if sys.platform == "win32" else '' MakeApp = MakeApp + PcdGccMakefile - MakeApp = MakeApp + 'APPFILE = %s/%s\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o %s.o\n' % (self.OutputPath, PcdValueInitName, os.path.join(self.OutputPath, PcdValueCommonName)) + \ - 'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'TOOL_INCLUDE +=' + MakeApp = MakeApp + 'APPFILE = %s%s%s%s\n' % (self.OutputPath, os.sep, PcdValueInitName, AppSuffix) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o %s.o\n' % (self.OutputPath, PcdValueInitName, os.path.join(self.OutputPath, PcdValueCommonName)) + \ + 'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'TOOL_INCLUDE +=' IncSearchList = [] PlatformInc = OrderedDict() @@ -3010,11 +3028,12 @@ def GenerateByteArrayValue (self, StructuredPcds): MakeApp += CC_FLAGS - if sys.platform == "win32": + if sys.platform == "win32" and not self._MingwBaseToolsBuild: MakeApp = MakeApp + PcdMakefileEnd MakeApp = MakeApp + AppTarget % ("""\tcopy $(APPLICATION) $(APPFILE) /y """) else: - MakeApp = MakeApp + AppTarget % ("""\tcp -p $(APPLICATION) $(APPFILE) """) + AppSuffix = '.exe' if sys.platform == "win32" else '' + MakeApp = MakeApp + AppTarget % ("""\t$(CP) $(APPLICATION)%s $(APPFILE)"""%(AppSuffix)) MakeApp = MakeApp + '\n' IncludeFileFullPaths = [] for includefile in IncludeFiles: @@ -3057,12 +3076,21 @@ def GenerateByteArrayValue (self, StructuredPcds): #start building the structure pcd value tool Messages = '' - if sys.platform == "win32": + if sys.platform == "win32" and not self._MingwBaseToolsBuild: MakeCommand = 'nmake -f %s' % (MakeFileName) returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (MakeCommand) Messages = StdOut else: - MakeCommand = 'make -f %s' % (MakeFileName) + if sys.platform == "win32" and self._MingwBaseToolsBuild: + if shutil.which('mingw32-make.exe') is not None: + MakeCommand = 'mingw32-make -f %s' % (MakeFileName) + else: + if self._Toolchain in ('CLANGPDB', 'CLANGDWARF') and 'CLANG_HOST_BIN' in os.environ: + MakeCommand = '%smake -f %s' % (os.environ.get('CLANG_HOST_BIN'), MakeFileName) + else: + MakeCommand = 'make -f %s' % (MakeFileName) + else: + MakeCommand = 'make -f %s' % (MakeFileName) returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (MakeCommand) Messages = StdErr diff --git a/BaseTools/Tests/GNUmakefile b/BaseTools/Tests/GNUmakefile index 20b387864f74..e62afe0abda4 100644 --- a/BaseTools/Tests/GNUmakefile +++ b/BaseTools/Tests/GNUmakefile @@ -1,15 +1,57 @@ ## @file # GNU/Linux makefile for 'Tests' module build. # -# Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.
+# Copyright (c) 2009 - 2025, Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent # all: test -test: - @if command -v "${PYTHON_COMMAND}" >/dev/null 2>&1; then ${PYTHON_COMMAND} RunTests.py; else python RunTests.py; fi +ifndef PYTHON_COMMAND + ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) + SHELL := cmd.exe + MAKEROOT := $(shell echo %CD%) + SEP:=$(shell echo \) + # + # Try using the Python Launcher for Windows to find an interperter. + # + CHECK_PY := $(shell where py.exe || echo NotFound) + ifeq ($(CHECK_PY),NotFound) + # + # PYTHON_HOME is the old method of specifying a Python interperter on Windows. + # Check if an interperter can be found using PYTHON_HOME. + # + ifdef PYTHON_HOME + ifndef (,$(wildcard $(PYTHON_HOME)$(SEP)python.exe)) # Make sure the file exists + PYTHON_COMMAND := $(PYTHON_HOME)$(SEP)python.exe + else + $(error Unable to find a Python interperter, if one is installed, set the PYTHON_COMMAND environment variable!) + endif + endif + else + PYTHON_COMMAND := $(shell py -3 -c "import sys; print(sys.executable)") + ifdef (,$(wildcard $(PYTHON_COMMAND))) # Make sure the file exists + $(error Unable to find a Python interperter, if one is installed, set the PYTHON_COMMAND environment variable!) + endif + endif + undefine CHECK_PY + else # UNIX + MAKEROOT := . + SEP:=/ + PYTHON_COMMAND := $(shell /usr/bin/env python3 -c "import sys; print(sys.executable)") + ifdef (,$(wildcard $(PYTHON_COMMAND))) # Make sure the file exists + PYTHON_COMMAND := $(shell /usr/bin/env python -c "import sys; print(sys.executable)") + ifdef (,$(wildcard $(PYTHON_COMMAND))) # Make sure the file exists + undefine PYTHON_COMMAND + endif + endif + ifndef PYTHON_COMMAND + $(error Unable to find a Python interpreter, if one is installed, set the PYTHON_COMMAND environment variable!) + endif + endif +endif +test: + $(PYTHON_COMMAND) RunTests.py clean: - find . -name '*.pyc' -exec rm '{}' ';' - + $(PYTHON_COMMAND) $(MAKEROOT)$(SEP)..$(SEP)Source$(SEP)C$(SEP)Makefiles$(SEP)GnuMakeUtils.py rm_pyc_files . diff --git a/BaseTools/toolsetup.bat b/BaseTools/toolsetup.bat index 8cfca3dc5c6e..ac52f7a8ee1f 100755 --- a/BaseTools/toolsetup.bat +++ b/BaseTools/toolsetup.bat @@ -3,7 +3,7 @@ @REM however it may be executed directly from the BaseTools project folder @REM if the file is not executed within a WORKSPACE\BaseTools folder. @REM -@REM Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
+@REM Copyright (c) 2006 - 2025, Intel Corporation. All rights reserved.
@REM (C) Copyright 2016 Hewlett Packard Enterprise Development LP
@REM @REM SPDX-License-Identifier: BSD-2-Clause-Patent @@ -44,6 +44,11 @@ if /I "%1"=="/?" goto Usage set FORCE_REBUILD=TRUE goto loop ) + if /I "%1"=="Mingw-w64" ( + shift + set BASETOOLS_MINGW_BUILD=TRUE + goto loop + ) if /I "%1"=="VS2022" ( shift set VS2022=TRUE @@ -98,6 +103,18 @@ if /I "%1"=="/?" goto Usage @REM :setup_workspace + REM + REM check the BASETOOLS_MINGW_PATH + REM + if defined BASETOOLS_MINGW_BUILD ( + if not defined BASETOOLS_MINGW_PATH ( + echo. + echo !!! ERROR !!! BASETOOLS_MINGW_PATH must be set to use mingw-w64. !!! + echo. + goto end + ) + ) + REM REM check the EDK_TOOLS_PATH REM @@ -128,15 +145,114 @@ if /I "%1"=="/?" goto Usage ) :set_PATH - if defined WORKSPACE_TOOLS_PATH goto check_PATH - if not defined EDK_TOOLS_BIN ( - set EDK_TOOLS_BIN=%EDK_TOOLS_PATH%\Bin\Win32 - if not exist %EDK_TOOLS_PATH%\Bin\Win32 ( + if not defined BASE_TOOLS_PATH ( + if not exist "Source\C\Makefile" ( + if not exist "%EDK_TOOLS_PATH%\Source\C\Makefile" goto no_source_files + set BASE_TOOLS_PATH=%EDK_TOOLS_PATH% + ) else ( + set BASE_TOOLS_PATH=%CD% + ) + ) + + REM + REM Check Python environment + REM + set PYTHONHASHSEED=1 + if not defined PYTHON_COMMAND ( + set PYTHON_COMMAND=py -3 + py -3 %BASE_TOOLS_PATH%\Tests\PythonTest.py %PYTHON_VER_MAJOR% %PYTHON_VER_MINOR% >NUL 2>NUL + if %ERRORLEVEL% EQU 1 ( echo. - echo !!! ERROR !!! Cannot find BaseTools Bin Win32!!! - echo Please check the directory %EDK_TOOLS_PATH%\Bin\Win32 - echo Or configure EDK_TOOLS_BIN env to point Win32 directory. + echo !!! ERROR !!! Python %PYTHON_VER_MAJOR%.%PYTHON_VER_MINOR% or newer is required. echo. + goto end + ) + if %ERRORLEVEL% NEQ 0 ( + if not defined PYTHON_HOME if not defined PYTHONHOME ( + set PYTHON_COMMAND= + echo. + echo !!! ERROR !!! Binary python tools are missing. + echo PYTHON_COMMAND or PYTHON_HOME + echo Environment variable is not set correctly. + echo They are required to build or execute the python tools. + echo. + goto end + ) + ) + ) + + if not defined PYTHON_COMMAND ( + if defined PYTHON_HOME ( + if EXIST "%PYTHON_HOME%" ( + set PYTHON_COMMAND=%PYTHON_HOME%\python.exe + ) else ( + echo . + echo !!! ERROR !!! PYTHON_HOME="%PYTHON_HOME%" does not exist. + echo . + goto end + ) + ) + ) + if defined WORKSPACE_TOOLS_PATH goto check_PATH + REM If MinGW build, add mingw-w64 tools to the PATH + if defined BASETOOLS_MINGW_BUILD ( + if %BASETOOLS_MINGW_PATH:~-1% EQU \ ( + if not exist "%BASETOOLS_MINGW_PATH%bin\mingw32-make.exe" ( + echo . + echo !!! ERROR !!! mingw32-make is missing. + echo mingw32-make is needed for a mingw32-w64 build. + echo Check that the BASETOOLS_MINGW_BUILD + echo Environment variable is set correctly. + echo . + goto end + ) + set "PATH=%BASETOOLS_MINGW_PATH%bin;%PATH%" + ) else ( + if not exist "%BASETOOLS_MINGW_PATH%\bin\mingw32-make.exe" ( + echo . + echo !!! ERROR !!! mingw32-make is missing. + echo mingw32-make is needed for a mingw32-w64 build. + echo Check that the BASETOOLS_MINGW_BUILD + echo Environment variable is set correctly. + echo . + goto end + ) + set "PATH=%BASETOOLS_MINGW_PATH%\bin;%PATH%" + ) + ) + if not defined EDK_TOOLS_BIN ( + if defined BASETOOLS_MINGW_BUILD ( + pushd . + cd "%BASE_TOOLS_PATH%\Source\C" + for /f %%i in ('mingw32-make -q --eval="$(info $(shell %PYTHON_COMMAND% Makefiles\GnuMakeUtils.py get_host_arch))"') do set MINGW_ARCH=%%i + popd + ) + ) + if not defined EDK_TOOLS_BIN ( + if defined BASETOOLS_MINGW_BUILD ( + if /I "%MINGW_ARCH%"=="X64" ( + set EDK_TOOLS_BIN=%EDK_TOOLS_PATH%\Bin\Win64 + ) else ( + if /I "%MINGW_ARCH%"=="AARCH64" ( + set EDK_TOOLS_BIN=%EDK_TOOLS_PATH%\Bin\Win64 + ) else ( + set EDK_TOOLS_BIN=%EDK_TOOLS_PATH%\Bin\Win32 + ) + ) + set MINGW_ARCH= + ) else ( + set EDK_TOOLS_BIN=%EDK_TOOLS_PATH%\Bin\Win32 + ) + if not defined FORCE_REBUILD ( + if not defined REBUILD ( + if not exist "%EDK_TOOLS_BIN%" ( + echo. + echo !!! ERROR !!! Cannot find BaseTools Bin Win32!!! + echo Please check the directory %EDK_TOOLS_BIN% + echo Or configure EDK_TOOLS_BIN env to point to Bin directory. + echo. + ) + ) ) ) set PATH=%EDK_TOOLS_BIN%;%PATH% @@ -146,13 +262,39 @@ if /I "%1"=="/?" goto Usage :check_PATH if "%EDK_TOOLS_PATH%"=="%WORKSPACE_TOOLS_PATH%" goto PATH_ok if not defined EDK_TOOLS_BIN ( - set EDK_TOOLS_BIN=%EDK_TOOLS_PATH%\Bin\Win32 - if not exist %EDK_TOOLS_PATH%\Bin\Win32 ( - echo. - echo !!! ERROR !!! Cannot find BaseTools Bin Win32!!! - echo Please check the directory %EDK_TOOLS_PATH%\Bin\Win32 - echo Or configure EDK_TOOLS_BIN env to point Win32 directory. - echo. + if defined BASETOOLS_MINGW_BUILD ( + pushd . + cd "%BASE_TOOLS_PATH%\Source\C" + for /f %%i in ('mingw32-make -q --eval="$(info $(shell %PYTHON_COMMAND% Makefiles\GnuMakeUtils.py get_host_arch))"') do set MINGW_ARCH=%%i + popd + ) + ) + if not defined EDK_TOOLS_BIN ( + if defined BASETOOLS_MINGW_BUILD ( + echo MINGW_ARCH=%MINGW_ARCH% + if /I "%MINGW_ARCH%"=="X64" ( + set EDK_TOOLS_BIN=%EDK_TOOLS_PATH%\Bin\Win64 + ) else ( + if /I "%MINGW_ARCH%"=="AARCH64" ( + set EDK_TOOLS_BIN=%EDK_TOOLS_PATH%\Bin\Win64 + ) else ( + set EDK_TOOLS_BIN=%EDK_TOOLS_PATH%\Bin\Win32 + ) + ) + set MINGW_ARCH= + ) else ( + set EDK_TOOLS_BIN=%EDK_TOOLS_PATH%\Bin\Win32 + ) + if not defined FORCE_REBUILD ( + if not defined REBUILD ( + if not exist "%EDK_TOOLS_BIN%" ( + echo. + echo !!! ERROR !!! Cannot find BaseTools Bin Win32!!! + echo Please check the directory %EDK_TOOLS_BIN% + echo Or configure EDK_TOOLS_BIN env to point to Bin directory. + echo. + ) + ) ) ) set PATH=%EDK_TOOLS_BIN%;%PATH% @@ -187,7 +329,7 @@ if defined VS2022 ( ) else if defined VS2015 ( call %EDK_TOOLS_PATH%\set_vsprefix_envs.bat VS2015 call %EDK_TOOLS_PATH%\get_vsvars.bat VS2015 -) else ( +) else if not defined BASETOOLS_MINGW_BUILD ( call %EDK_TOOLS_PATH%\set_vsprefix_envs.bat call %EDK_TOOLS_PATH%\get_vsvars.bat ) @@ -285,54 +427,6 @@ goto check_build_environment echo. :check_build_environment - set PYTHONHASHSEED=1 - - if not defined BASE_TOOLS_PATH ( - if not exist "Source\C\Makefile" ( - if not exist "%EDK_TOOLS_PATH%\Source\C\Makefile" goto no_source_files - set BASE_TOOLS_PATH=%EDK_TOOLS_PATH% - ) else ( - set BASE_TOOLS_PATH=%CD% - ) - ) - -@REM Check Python environment - -if not defined PYTHON_COMMAND ( - set PYTHON_COMMAND=py -3 - py -3 %BASE_TOOLS_PATH%\Tests\PythonTest.py %PYTHON_VER_MAJOR% %PYTHON_VER_MINOR% >NUL 2>NUL - if %ERRORLEVEL% EQU 1 ( - echo. - echo !!! ERROR !!! Python %PYTHON_VER_MAJOR%.%PYTHON_VER_MINOR% or newer is required. - echo. - goto end - ) - if %ERRORLEVEL% NEQ 0 ( - if not defined PYTHON_HOME if not defined PYTHONHOME ( - set PYTHON_COMMAND= - echo. - echo !!! ERROR !!! Binary python tools are missing. - echo PYTHON_COMMAND or PYTHON_HOME - echo Environment variable is not set correctly. - echo They are required to build or execute the python tools. - echo. - goto end - ) - ) -) - -if not defined PYTHON_COMMAND ( - if defined PYTHON_HOME ( - if EXIST "%PYTHON_HOME%" ( - set PYTHON_COMMAND=%PYTHON_HOME%\python.exe - ) else ( - echo . - echo !!! ERROR !!! PYTHON_HOME="%PYTHON_HOME%" does not exist. - echo . - goto end - ) - ) -) %PYTHON_COMMAND% %BASE_TOOLS_PATH%\Tests\PythonTest.py %PYTHON_VER_MAJOR% %PYTHON_VER_MINOR% >NUL 2>NUL if %ERRORLEVEL% EQU 1 ( @@ -377,35 +471,95 @@ endlocal echo PYTHONPATH = %PYTHONPATH% echo. -:VisualStudioAvailable +:CompilerAvailable + if not defined BASETOOLS_MINGW_BUILD ( + if not defined CLANG_HOST_BIN ( + set CLANG_HOST_BIN=n + ) + if not defined CLANG_BIN ( + @echo. + @echo !!! WARNING !!! CLANG_BIN environment variable is not set + @if exist "C:\Program Files\LLVM\bin\clang.exe" ( + @set "CLANG_BIN=C:\Program Files\LLVM\bin\" + @echo Found LLVM, setting CLANG_BIN environment variable to C:\Program Files\LLVM\bin\ + ) + ) + ) else ( + if %BASETOOLS_MINGW_PATH:~-1% EQU \ ( + if exist "%BASETOOLS_MINGW_PATH%bin\clang.exe" ( + if not defined CLANG_BIN ( + set "CLANG_BIN=%BASETOOLS_MINGW_PATH%bin\" + ) + ) + ) else ( + if exist "%BASETOOLS_MINGW_PATH%\bin\clang.exe" ( + if not defined CLANG_BIN ( + set "CLANG_BIN=%BASETOOLS_MINGW_PATH%\bin\" + ) + ) + ) + if not defined CLANG_HOST_BIN ( + set CLANG_HOST_BIN=mingw32- + ) + ) if not defined FORCE_REBUILD ( if not defined REBUILD ( goto end ) ) - if not defined VCINSTALLDIR ( - @echo. - @echo !!! ERROR !!!! Cannot find Visual Studio, required to build C tools !!! - @echo. - goto end + if not defined BASETOOLS_MINGW_BUILD ( + if not defined VCINSTALLDIR ( + @echo. + @echo !!! ERROR !!!! Cannot find Visual Studio, required to build C tools !!! + @echo. + goto end + ) + ) else ( + REM If the Mingw-w64 environment is Clang based, + REM set CC & CXX to use Clang instead of GCC + if %BASETOOLS_MINGW_PATH:~-1% EQU \ ( + if exist "%BASETOOLS_MINGW_PATH%bin\clang.exe" ( + set CC=clang + set CXX=clang++ + ) + ) else ( + if exist "%BASETOOLS_MINGW_PATH%\bin\clang.exe" ( + set CC=clang + set CXX=clang++ + ) + ) ) if not defined FORCE_REBUILD goto IncrementalBuild :CleanAndBuild - pushd . - cd %BASE_TOOLS_PATH% - call nmake cleanall - del /f /q %BASE_TOOLS_PATH%\Bin\Win32\*.* - popd + if defined BASETOOLS_MINGW_BUILD ( + pushd . + cd %BASE_TOOLS_PATH%\Source\C + call mingw32-make clean + popd + ) else ( + pushd . + cd %BASE_TOOLS_PATH% + call nmake cleanall + del /f /q %BASE_TOOLS_PATH%\Bin\Win32\*.* + popd + ) @REM Let CleanAndBuild fall through to IncrementalBuild :IncrementalBuild - pushd . - cd %BASE_TOOLS_PATH% - call nmake c - popd + if defined BASETOOLS_MINGW_BUILD ( + pushd . + cd %BASE_TOOLS_PATH%\Source\C + call mingw32-make + popd + ) else ( + pushd . + cd %BASE_TOOLS_PATH% + call nmake c + popd + ) goto end @@ -417,7 +571,7 @@ endlocal :Usage @echo. - echo Usage: "%0 [-h | -help | --help | /h | /help | /?] [ Rebuild | ForceRebuild ] [Reconfig] [base_tools_path [edk_tools_path]] [VS2022] [VS2019] [VS2017] [VS2015]" + @echo Usage: "%0 [-h | -help | --help | /h | /help | /?] [ Rebuild | ForceRebuild ] [Reconfig] [Mingw-w64] [base_tools_path [edk_tools_path]] [VS2022] [VS2019] [VS2017] [VS2015]" @echo. @echo base_tools_path BaseTools project path, BASE_TOOLS_PATH will be set to this path. @echo edk_tools_path EDK_TOOLS_PATH will be set to this path. @@ -426,6 +580,7 @@ endlocal @echo ForceRebuild If sources are available, rebuild all tools regardless of @echo whether they have been updated or not. @echo Reconfig Reinstall target.txt, tools_def.txt and build_rule.txt. + @echo Mingw-w64 Build BaseTools binaries using mingw-w64. @echo VS2015 Set the env for VS2015 build. @echo VS2017 Set the env for VS2017 build. @echo VS2019 Set the env for VS2019 build. diff --git a/edksetup.bat b/edksetup.bat index 06953888501f..8ee17c112c09 100755 --- a/edksetup.bat +++ b/edksetup.bat @@ -1,7 +1,7 @@ @REM @file @REM Windows batch file to setup a WORKSPACE environment @REM -@REM Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
+@REM Copyright (c) 2006 - 2025, Intel Corporation. All rights reserved.
@REM (C) Copyright 2016 Hewlett Packard Enterprise Development LP
@REM SPDX-License-Identifier: BSD-2-Clause-Patent @REM @@ -114,18 +114,6 @@ if not defined NASM_PREFIX ( @if not exist "C:\nasm\nasm.exe" echo Attempting to build modules that require NASM will fail. ) -:check_CLANGPDB -@REM In Windows, set CLANG_HOST_BIN=n to use nmake command -@set CLANG_HOST_BIN=n -if not defined CLANG_BIN ( - @echo. - @echo !!! WARNING !!! CLANG_BIN environment variable is not set - @if exist "C:\Program Files\LLVM\bin\clang.exe" ( - @set "CLANG_BIN=C:\Program Files\LLVM\bin\" - @echo Found LLVM, setting CLANG_BIN environment variable to C:\Program Files\LLVM\bin\ - ) -) - :check_cygwin if defined CYGWIN_HOME ( if not exist "%CYGWIN_HOME%" ( @@ -146,6 +134,7 @@ if defined CYGWIN_HOME ( :cygwin_done if /I "%1"=="Rebuild" shift if /I "%1"=="ForceRebuild" shift +if /I "%1"=="Mingw-w64" shift if /I "%1"=="VS2022" shift if /I "%1"=="VS2019" shift if /I "%1"=="VS2017" shift @@ -154,11 +143,12 @@ if "%1"=="" goto end :Usage @echo. - @echo Usage: "%0 [-h | -help | --help | /h | /help | /?] [Reconfig] [Rebuild] [ForceRebuild] [VS2019] [VS2017] [VS2015]" + @echo Usage: "%0 [-h | -help | --help | /h | /help | /?] [Reconfig] [Rebuild] [ForceRebuild] [Mingw-w64] [VS2022] [VS2019] [VS2017] [VS2015]" @echo. @echo Reconfig Reinstall target.txt, tools_def.txt and build_rule.txt. @echo Rebuild Perform incremental rebuild of BaseTools binaries. @echo ForceRebuild Force a full rebuild of BaseTools binaries. + @echo Mingw-w64 Build BaseTools binaries using mingw-w64. @echo VS2015 Set the env for VS2015 build. @echo VS2017 Set the env for VS2017 build. @echo VS2019 Set the env for VS2019 build. From a9d304f85845712da1cd17a73cf30b4ca5ad4284 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Fri, 23 May 2025 17:37:18 -0400 Subject: [PATCH 0016/1172] MdeModulePkg: Prevent memcpy intrinsics in VS22 (17.14.2) The latest VS2022 update replaces some code patterns with struct assignments with `memcpy`. This change convert the code to explicitly use `CopyMem`. Signed-off-by: Michael Kubacki --- MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c b/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c index b6dc23476a70..b2a3ef6205a9 100644 --- a/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c +++ b/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c @@ -229,8 +229,8 @@ ReadString ( case CHAR_BACKSPACE: if ((StringPtr[0] != CHAR_NULL) && (CurrentCursor != 0)) { - for (Index = 0; Index < CurrentCursor - 1; Index++) { - TempString[Index] = StringPtr[Index]; + if (CurrentCursor > 1) { + CopyMem (TempString, StringPtr, (CurrentCursor - 1) * sizeof (CHAR16)); } Count = GetStringWidth (StringPtr) / 2 - 1; @@ -261,9 +261,7 @@ ReadString ( KeyPad[1] = CHAR_NULL; Count = GetStringWidth (StringPtr) / 2 - 1; if (CurrentCursor < Count) { - for (Index = 0; Index < CurrentCursor; Index++) { - TempString[Index] = StringPtr[Index]; - } + CopyMem (TempString, StringPtr, CurrentCursor * sizeof (CHAR16)); TempString[Index] = CHAR_NULL; StrCatS (TempString, MaxLen, KeyPad); From dfc8e90fdb5739ca7fa5a3dd3cbd4b74f80b9f73 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Fri, 23 May 2025 17:38:02 -0400 Subject: [PATCH 0017/1172] ShellPkg: Prevent memcpy intrinsics in VS22 (17.14.2) The latest VS2022 update replaces some code patterns with struct assignments with `memcpy`. This change convert the code to explicitly use `CopyMem`. Signed-off-by: Michael Kubacki --- .../Edit/FileBuffer.c | 22 +++++++----------- .../HexEdit/BufferImage.c | 23 ++++++------------- 2 files changed, 15 insertions(+), 30 deletions(-) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Edit/FileBuffer.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Edit/FileBuffer.c index 088030d29f67..119cf373c8ac 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Edit/FileBuffer.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Edit/FileBuffer.c @@ -478,6 +478,7 @@ FileBufferPrintLine ( { CHAR16 *Buffer; UINTN Limit; + UINTN PadLength; CHAR16 *PrintLine; CHAR16 *PrintLine2; UINTN BufLen; @@ -496,8 +497,9 @@ FileBufferPrintLine ( PrintLine = AllocatePool (BufLen); if (PrintLine != NULL) { StrnCpyS (PrintLine, BufLen/sizeof (CHAR16), Buffer, MIN (Limit, MainEditor.ScreenSize.Column)); - for (Limit = StrLen (PrintLine); Limit < MainEditor.ScreenSize.Column; Limit++) { - PrintLine[Limit] = L' '; + if (StrLen (PrintLine) < MainEditor.ScreenSize.Column) { + PadLength = MainEditor.ScreenSize.Column - StrLen (PrintLine); + SetMem16 (&PrintLine[StrLen (PrintLine)], PadLength * sizeof (CHAR16), L' '); } PrintLine[MainEditor.ScreenSize.Column] = CHAR_NULL; @@ -3104,17 +3106,13 @@ FileBufferReplace ( // set replace into it // Buffer = FileBuffer.CurrentLine->Buffer + FileBuffer.FilePosition.Column - 1; - for (Index = 0; Index < ReplaceLen; Index++) { - Buffer[Index] = Replace[Index]; - } + CopyMem (Buffer, Replace, ReplaceLen * sizeof (CHAR16)); } if (ReplaceLen < SearchLen) { Buffer = FileBuffer.CurrentLine->Buffer + FileBuffer.FilePosition.Column - 1; - for (Index = 0; Index < ReplaceLen; Index++) { - Buffer[Index] = Replace[Index]; - } + CopyMem (Buffer, Replace, ReplaceLen * sizeof (CHAR16)); Buffer += ReplaceLen; Gap = SearchLen - ReplaceLen; @@ -3130,9 +3128,7 @@ FileBufferReplace ( if (ReplaceLen == SearchLen) { Buffer = FileBuffer.CurrentLine->Buffer + FileBuffer.FilePosition.Column - 1; - for (Index = 0; Index < ReplaceLen; Index++) { - Buffer[Index] = Replace[Index]; - } + CopyMem (Buffer, Replace, ReplaceLen * sizeof (CHAR16)); } FileBuffer.CurrentLine->Size += (ReplaceLen - SearchLen); @@ -3322,9 +3318,7 @@ FileBufferReplaceAll ( // set replace into it // Buffer = Line->Buffer + Position; - for (Index = 0; Index < ReplaceLen; Index++) { - Buffer[Index] = ReplaceStr[Index]; - } + CopyMem (Buffer, ReplaceStr, ReplaceLen * sizeof (CHAR16)); Line->Size += (ReplaceLen - SearchLen); Column += ReplaceLen; diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/BufferImage.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/BufferImage.c index be77e31a40b7..d38726b6ebcb 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/BufferImage.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/BufferImage.c @@ -142,9 +142,8 @@ HBufferImageBackup ( VOID ) { - HBufferImageBackupVar.MousePosition = HBufferImage.MousePosition; - - HBufferImageBackupVar.BufferPosition = HBufferImage.BufferPosition; + CopyMem (&HBufferImageBackupVar.MousePosition, &HBufferImage.MousePosition, sizeof (HBufferImage.MousePosition)); + CopyMem (&HBufferImageBackupVar.BufferPosition, &HBufferImage.BufferPosition, sizeof (HBufferImage.BufferPosition)); HBufferImageBackupVar.Modified = HBufferImage.Modified; @@ -569,7 +568,7 @@ HBufferImageRestoreMousePosition ( // // backup the old screen attributes // - Orig = HMainEditor.ColorAttributes; + CopyMem (&Orig, &HMainEditor.ColorAttributes, sizeof (Orig)); New.Data = 0; New.Colors.Foreground = Orig.Colors.Background & 0xF; New.Colors.Background = Orig.Colors.Foreground & 0x7; @@ -1955,17 +1954,13 @@ HBufferImageDeleteCharacterFromBuffer ( // pass deleted buffer out // if (DeleteBuffer != NULL) { - for (Index = 0; Index < Count; Index++) { - DeleteBuffer[Index] = BufferPtr[Pos + Index]; - } + CopyMem (&DeleteBuffer[0], &BufferPtr[Pos], Count); } // // delete the part from Pos // - for (Index = Pos; Index < Size - Count; Index++) { - BufferPtr[Index] = BufferPtr[Index + Count]; - } + CopyMem (&BufferPtr[Pos], &BufferPtr[Pos + Count], Size - Count - Pos); Size -= Count; @@ -2069,16 +2064,12 @@ HBufferImageAddCharacterToBuffer ( // // get a place to add // - for (Index = (INTN)(Size + Count - 1); Index >= (INTN)Pos; Index--) { - BufferPtr[Index] = BufferPtr[Index - Count]; - } + CopyMem (&BufferPtr[Pos], &BufferPtr[Pos - Count], Size - Pos + Count); // // add the buffer // - for (Index = (INTN)0; Index < (INTN)Count; Index++) { - BufferPtr[Index + Pos] = AddBuffer[Index]; - } + CopyMem (&BufferPtr[Pos], AddBuffer, Count); Size += Count; From c87ea4751991ecb107d72437f45b70e25734c927 Mon Sep 17 00:00:00 2001 From: DeepakX Singh Date: Wed, 4 Jun 2025 12:54:58 +0530 Subject: [PATCH 0018/1172] MdeModulePkg/HiiDatabaseDxe: Fix NULL Pointer access from EfiVarStore Issue : When user access "Boot Maintenance Manager Menu/Secure Boot Configuration Menu" with PcdNullPointerDetectionPropertyMask|0x03 and PcdHeapGuardPageType|0x7FFF protection policy set, we get X64 Exception Type - 0E(#PF - Page-Fault) Root cause : When user access "Boot Maintenance Manager Menu/Secure Boot Configuration Menu", BIOS calls FindQuestionDefaultSetting function and send EFI VarStore header pointer to AuthFindVariableData function. When header pointer is NULL, it send NULL pointer to AuthFindVariableData function and causes the page fault. Fix : Database.c: In function FindQuestionDefaultSetting, added NULL pointers check, so that when EFI VarStore header argument is passed to AuthFindVariableData function, NULL pointer access will not happen. Test: Cross verified while accessing the "Boot Maintenance Manager Menu/ Secure Boot Configuration Menu" page. Signed-off-by: DeepakX Singh --- MdeModulePkg/Universal/HiiDatabaseDxe/Database.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c b/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c index 09aefc662ad5..314e40815a97 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c @@ -687,6 +687,11 @@ FindQuestionDefaultSetting ( PCD_DATA_DELTA *DeltaData; BOOLEAN VarCheck; + if (EfiVarStore == NULL) { + DEBUG ((DEBUG_ERROR, "EfiVarStore is null\n")); + return EFI_NOT_FOUND; + } + if (gSkuId == 0xFFFFFFFFFFFFFFFF) { gSkuId = LibPcdGetSku (); } From c8c65be3b95f00bc89e377bd29eb08ff82692e5f Mon Sep 17 00:00:00 2001 From: Saloni Kasbekar Date: Tue, 27 May 2025 13:47:42 -0700 Subject: [PATCH 0019/1172] NetworkPkg : Replace hardcoded value with existing #define constant Use IP6_PREFIX_MAX instead of the hardcoded 128 value Signed-off-by: Saloni Kasbekar --- NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c b/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c index 4c1354d26cc1..0186acc85af6 100644 --- a/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c +++ b/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c @@ -989,7 +989,7 @@ Ip6ConfigSetManualAddress ( for (Index1 = 0; Index1 < NewAddressCount; Index1++, NewAddress++) { if (NetIp6IsLinkLocalAddr (&NewAddress->Address) || !NetIp6IsValidUnicast (&NewAddress->Address) || - (NewAddress->PrefixLength > 128) + (NewAddress->PrefixLength > IP6_PREFIX_MAX) ) { // From 0d472346dffdbe40aa2ebac9b84bbd6b3ac7889e Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Wed, 4 Jun 2025 03:59:54 +0200 Subject: [PATCH 0020/1172] OvmfPkg/PlatformBmPrintScLib: hint at Secure Boot verification The UEFI spec 2.11 documents EFI_SECURITY_VIOLATION for both gBS->LoadImage() and gBS->StartImage() as > [Image was loaded and an ImageHandle was created with a valid > EFI_LOADED_IMAGE_PROTOCOL. However,] the current platform policy > specifies that the image should not be started. Additionally, the spec documents EFI_ACCESS_DENIED for gBS->LoadImage() as > Image was not loaded because the platform policy prohibits the image > from being loaded. NULL is returned in ImageHandle. When image loading/starting fails under the above conditions (according to the status code being reported), print a hint about Secure Boot. This should help users diagnose and fix their Secure Boot configuration. Updates: 77874ceebb118cd58f518cbf6bcb63f47c993ec0 Fixes: https://github.com/tianocore/edk2/issues/10901 Signed-off-by: Laszlo Ersek --- .../Library/PlatformBmPrintScLib/StatusCodeHandler.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/OvmfPkg/Library/PlatformBmPrintScLib/StatusCodeHandler.c b/OvmfPkg/Library/PlatformBmPrintScLib/StatusCodeHandler.c index 18091640d12d..2c2695b0ba97 100644 --- a/OvmfPkg/Library/PlatformBmPrintScLib/StatusCodeHandler.c +++ b/OvmfPkg/Library/PlatformBmPrintScLib/StatusCodeHandler.c @@ -214,14 +214,20 @@ HandleStatusCode ( DevPathString ); } else { + EFI_STATUS ReturnStatus; + + ReturnStatus = ((EFI_RETURN_STATUS_EXTENDED_DATA *)Data)->ReturnStatus; Print ( - L"%a: failed to %a %s \"%s\" from %s: %r\n", + L"%a: failed to %a %s \"%s\" from %s: %r%a\n", gEfiCallerBaseName, Value == mLoadFail ? "load" : "start", BootOptionName, BmBootOption.Description, DevPathString, - ((EFI_RETURN_STATUS_EXTENDED_DATA *)Data)->ReturnStatus + ReturnStatus, + ((ReturnStatus == EFI_SECURITY_VIOLATION || + (Value == mLoadFail && ReturnStatus == EFI_ACCESS_DENIED)) ? + " -- rejected probably by Secure Boot" : "") ); } From 8b2c56e63807587cf903d83892f5dee5f5fe3d80 Mon Sep 17 00:00:00 2001 From: Sienski Piotr Date: Wed, 21 May 2025 13:56:24 +0200 Subject: [PATCH 0021/1172] UefiCpuPkg/PiSmmCpuDxeSmm: Modify PcdCpuSmmRestrictedMemoryAccess retrieval Currently if PcdCpuSmmRestrictedMemoryAccess is a DynamicPcd it will be accessed during SMM entry causing an error since code outside of SMM will be called (PcdGetBool). To fix that PcdCpuSmmRestrictedMemoryAccess is retrieved during SMM initialization and cached value is used at runtime Signed-off-by: Sienski Piotr --- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c | 5 +++++ UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmFuncsArchDxeSmm.c | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c index 44972bbb76cb..ca85cc535af6 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c @@ -389,5 +389,10 @@ PiCpuSmmEntry ( ); ASSERT_EFI_ERROR (Status); + // + // Initialize value of mIsRestrictedMemoryAccess + // + IsRestrictedMemoryAccess (); + return Status; } diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmFuncsArchDxeSmm.c b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmFuncsArchDxeSmm.c index e812a433125a..963fe092cff7 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmFuncsArchDxeSmm.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmFuncsArchDxeSmm.c @@ -7,6 +7,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include "PiSmmCpuCommon.h" +BOOLEAN mIsRestrictedMemoryAccess = TRUE; +BOOLEAN mIsRestrictedMemoryAccessInitialized = FALSE; + /** Return whether access to non-SMRAM is restricted. @@ -18,5 +21,10 @@ IsRestrictedMemoryAccess ( VOID ) { - return PcdGetBool (PcdCpuSmmRestrictedMemoryAccess); + if (!mIsRestrictedMemoryAccessInitialized) { + mIsRestrictedMemoryAccess = PcdGetBool (PcdCpuSmmRestrictedMemoryAccess); + mIsRestrictedMemoryAccessInitialized = TRUE; + } + + return mIsRestrictedMemoryAccess; } From 980da7e0eb49bde53c877d172909388cbb72f9bd Mon Sep 17 00:00:00 2001 From: Aaron Li Date: Mon, 9 Jun 2025 10:54:04 +0800 Subject: [PATCH 0022/1172] PrmPkg: Add ACPI Parameter Data Buffer Signature In PRM spec 1.0 section 4.2.2 ACPI Parameter Buffer defines the signature of ACPI Parameter Data Buffer is 'PRMP'. This commit adds the signature of ACPI Parameter Data Buffer. Signed-off-by: Aaron Li --- PrmPkg/Include/PrmDataBuffer.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PrmPkg/Include/PrmDataBuffer.h b/PrmPkg/Include/PrmDataBuffer.h index 3af067a8c9e9..4613f57caef4 100644 --- a/PrmPkg/Include/PrmDataBuffer.h +++ b/PrmPkg/Include/PrmDataBuffer.h @@ -12,7 +12,8 @@ #include -#define PRM_DATA_BUFFER_HEADER_SIGNATURE SIGNATURE_32('P','R','M','S') +#define PRM_DATA_BUFFER_HEADER_SIGNATURE SIGNATURE_32('P','R','M','S') +#define PRM_ACPI_PARAMETER_DATA_BUFFER_HEADER_SIGNATURE SIGNATURE_32('P','R','M','P') #pragma pack(push, 1) From b1e55f561b4f125124304e640fbd823c648de836 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Thu, 24 Apr 2025 15:50:39 +0200 Subject: [PATCH 0023/1172] DynamicTablesPkg: X64SratGenerator: Fix ProximityDomain bits ProximityDomain31To8[0] is overwritten by the ProximityDomain at bits [17-24] and [25-31]. Populate ProximityDomain31To8[1] and ProximityDomain31To8[2] instead. Signed-off-by: Pierre Gondois --- .../Library/Acpi/Common/AcpiSratLib/X64/X64SratGenerator.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/X64/X64SratGenerator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/X64/X64SratGenerator.c index 97a9f953fab4..e6ac60167288 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/X64/X64SratGenerator.c +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/X64/X64SratGenerator.c @@ -224,8 +224,8 @@ AddArchObjects ( ApicAffinity->Flags = CmX2ApicAffinity->Flags; ApicAffinity->LocalSapicEid = 0; ApicAffinity->ProximityDomain31To8[0] = (CmX2ApicAffinity->ProximityDomain >> 8) & MAX_UINT8; - ApicAffinity->ProximityDomain31To8[0] = (CmX2ApicAffinity->ProximityDomain >> 16) & MAX_UINT8; - ApicAffinity->ProximityDomain31To8[0] = (CmX2ApicAffinity->ProximityDomain >> 24) & MAX_UINT8; + ApicAffinity->ProximityDomain31To8[1] = (CmX2ApicAffinity->ProximityDomain >> 16) & MAX_UINT8; + ApicAffinity->ProximityDomain31To8[2] = (CmX2ApicAffinity->ProximityDomain >> 24) & MAX_UINT8; ApicAffinity->ClockDomain = CmX2ApicAffinity->ClockDomain; ApicAffinity++; CmX2ApicAffinity++; From 1b7d687dc6a99b1d70d07934c9872569e0798898 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Tue, 8 Apr 2025 14:27:21 +0200 Subject: [PATCH 0024/1172] DynamicTablesPkg: Add MetaDataObjLib library The DynamicTablesPkg allows to generate firmware tables based on information provided by a user or another source of information (a device tree for instance). Some information might be implicitly generated by generators. For instance, for ACPI tables, AML names or Uids are created by generators, but not provided by the user or another source of information. Some generators might need to cross-reference object/generated data that was previous generated for an object by another generator. For instance, there are three different generators creating serial ports in the AML namespace. These 3 generators must ensure not to use an Id which was not already created by another generator. Another example would be a generator needing to reference the AML path of a serial port. As the AML path is dynamically generated, this is currently not possible to do. Add a MetaDataObjLib library to keep track of the meta-data previously generated for an object. Signed-off-by: Pierre Gondois --- DynamicTablesPkg/DynamicTables.dsc.inc | 1 + DynamicTablesPkg/DynamicTablesPkg.dec | 3 + DynamicTablesPkg/DynamicTablesPkg.dsc | 1 + .../Include/Library/MetadataObjLib.h | 186 ++++++++ .../Common/MetadataObjLib/MetadataObj.c | 423 ++++++++++++++++++ .../Common/MetadataObjLib/MetadataObj.h | 59 +++ .../Common/MetadataObjLib/MetadataObjLib.inf | 26 ++ 7 files changed, 699 insertions(+) create mode 100644 DynamicTablesPkg/Include/Library/MetadataObjLib.h create mode 100644 DynamicTablesPkg/Library/Common/MetadataObjLib/MetadataObj.c create mode 100644 DynamicTablesPkg/Library/Common/MetadataObjLib/MetadataObj.h create mode 100644 DynamicTablesPkg/Library/Common/MetadataObjLib/MetadataObjLib.inf diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc index 3b5362b68c5f..781e8c61c607 100644 --- a/DynamicTablesPkg/DynamicTables.dsc.inc +++ b/DynamicTablesPkg/DynamicTables.dsc.inc @@ -22,6 +22,7 @@ SsdtSerialPortFixupLib|DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf TableHelperLib|DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf SmbiosStringTableLib|DynamicTablesPkg/Library/Common/SmbiosStringTableLib/SmbiosStringTableLib.inf + MetadataObjLib|DynamicTablesPkg/Library/Common/MetadataObjLib/MetadataObjLib.inf [LibraryClasses.AARCH64] DynamicTablesScmiInfoLib|DynamicTablesPkg/Library/DynamicTablesScmiInfoLib/DynamicTablesScmiInfoLib.inf diff --git a/DynamicTablesPkg/DynamicTablesPkg.dec b/DynamicTablesPkg/DynamicTablesPkg.dec index 68624f20e776..3ae95dc6eb89 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dec +++ b/DynamicTablesPkg/DynamicTablesPkg.dec @@ -43,6 +43,9 @@ ## @libraryclass Defines a set of SMBIOS string helper methods. SmbiosStringTableLib|Include/Library/SmbiosStringTableLib.h + ## @libraryclass Defines a set of APIs to a handle Metadata around CmObj. + MetadataObjLib|Include/Library/MetadataObjLib.h + [LibraryClasses.AARCH64] ## @libraryclass Defines a set of APIs to populate CmObj using SCMI. DynamicTablesScmiInfoLib|Include/Library/DynamicTablesScmiInfoLib.h diff --git a/DynamicTablesPkg/DynamicTablesPkg.dsc b/DynamicTablesPkg/DynamicTablesPkg.dsc index e80f19a61f67..8e11a6e0a447 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dsc +++ b/DynamicTablesPkg/DynamicTablesPkg.dsc @@ -48,6 +48,7 @@ DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepoLib.inf DynamicTablesPkg/Library/Common/SmbiosStringTableLib/SmbiosStringTableLib.inf + DynamicTablesPkg/Library/Common/MetadataObjLib/MetadataObjLib.inf [Components.ARM, Components.AARCH64] DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf diff --git a/DynamicTablesPkg/Include/Library/MetadataObjLib.h b/DynamicTablesPkg/Include/Library/MetadataObjLib.h new file mode 100644 index 000000000000..26dc76a5a9be --- /dev/null +++ b/DynamicTablesPkg/Include/Library/MetadataObjLib.h @@ -0,0 +1,186 @@ +/** @file + Metadata Object Library. + + Copyright (c) 2025, Arm Limited. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef METADATA_OBJ_LIB_H_ +#define METADATA_OBJ_LIB_H_ + +/** Metadata Types + + Some general rules: + - + Each Type has an associated strucure. + - + It is possible to Add/Remove/Get the Metadata associated to + a (Type/Token). To modify the Metadata, the object must be removed + then added again. + - + A (Type/Token) pair allows to uniquely identify a Metadata structure. + A Token might have multiple Metadata structures allocated with other Types. + A Type might have multiple entries with different Tokens. +*/ +typedef enum MetadataType { + MetadataTypeUid, + MetadataTypeProximityDomain, + MetadataTypeMax, +} METADATA_TYPE; + +/* Maximal size of a NameId */ +#define METADATA_UID_NAMEID_SIZE 9 + +/** MetadataTypeUid related structure. + */ +typedef struct MetadataObjUid { + /// Uid + UINT32 Uid; + + /// _HID or _CID of the device (NULL-terminated string). + /// This provides a mean to uniquely identify a device type. + /// If not populated, EisaId must be set. + CHAR8 NameId[METADATA_UID_NAMEID_SIZE]; + + /// EisaId of the device. + /// This provides a mean to uniquely identify a device type. + /// If not populated, NameId must be set. + UINT32 EisaId; +} METADATA_OBJ_UID; + +/** MetadataTypeProximityDomain related structure. + */ +typedef struct MetadataObjProximityDomain { + /// Proximity Domain Id + UINT32 Id; +} METADATA_OBJ_PROXIMITY_DOMAIN; + +/* Handle to the structure containing all the the Metadata information + (i.e. all the METADATA_HANDLE). +*/ +typedef VOID *METADATA_ROOT_HANDLE; +/* Handle to an internal Metadata structure, depicting a single Metadata. */ +typedef VOID *METADATA_HANDLE; + +/** Initialize the Metadata Root. + + @param[out] Root If success, Root of the Metadata information. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_OUT_OF_RESOURCES Out of resources. +**/ +EFI_STATUS +EFIAPI +MetadataInitializeHandle ( + OUT METADATA_ROOT_HANDLE *Root + ); + +/** Free the Metadata Root. + + @param[in] Root Root of the Metadata information to free. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_OUT_OF_RESOURCES Out of resources. +**/ +EFI_STATUS +EFIAPI +MetadataFreeHandle ( + IN METADATA_ROOT_HANDLE Root + ); + +/** Attach some Metadata to a (Type/Token) pair. + + @param[in] Root Root of the Metadata information. + @param[in] Type METADATA_TYPE of the entry to allocate. + @param[in] Token Token uniquely identifying an entry among other + objects with the input METADATA_TYPE. + @param[in] Metadata Metadata to associate to the (Type/Token) pair. + The data is copied. + @param[in] MetadataSize Size of the input Metadata. + + @retval EFI_SUCCESS Success. + @retval EFI_ALREADY_STARTED (Type/Token) pair is already present. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. +**/ +EFI_STATUS +EFIAPI +MetadataAdd ( + IN METADATA_ROOT_HANDLE Root, + IN METADATA_TYPE Type, + IN CM_OBJECT_TOKEN Token, + IN VOID *Metadata, + IN UINT32 MetadataSize + ); + +/** Remove a (Type/Token) pair and its associated Metadata. + + @param[in] Root Root of the Metadata information. + @param[in] Type METADATA_TYPE of the entry to remove. + @param[in] Token Token uniquely identifying an entry among other + objects with the input METADATA_TYPE. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. +**/ +EFI_STATUS +EFIAPI +MetadataRemove ( + IN METADATA_ROOT_HANDLE Root, + IN METADATA_TYPE Type, + IN CM_OBJECT_TOKEN Token + ); + +/** Get the Metadata associated with an (Type/Token). + + @param[in] Root Root of the Metadata information. + @param[in] Type METADATA_TYPE of the entry to get. + @param[in] Token Token uniquely identifying an entry among other + objects with the input METADATA_TYPE. + @param[out] Metadata If success, contains the Metadata associated to the + input (Type/Token). + @param[in] MetadataSize Size of the input Metadata. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. +**/ +EFI_STATUS +EFIAPI +MetadataGet ( + IN METADATA_ROOT_HANDLE Root, + IN METADATA_TYPE Type, + IN CM_OBJECT_TOKEN Token, + OUT VOID *Metadata, + IN UINT32 MetadataSize + ); + +/** Iterate over the existing Metadata with the same Type. + + @param[in] Root Root of the Metadata information. + @param[in] Type METADATA_TYPE to iterate over. + @param[in] PrevHandle MetadataIterate () returns the Metadata handle + following PrevHandle. + If PrevHandle==NULL, the first Handle of the type + is returned. + If PrevHandle is the last Handle of the type, + NULL is returned. + @param[out] Metadata Metadata of the current Handle. + @param[in] MetadataSize Size of the input Metadata. + + @return METADATA_HANDLE The Metadata handle following PrevHandle. +**/ +METADATA_HANDLE +EFIAPI +MetadataIterate ( + IN METADATA_ROOT_HANDLE Root, + IN METADATA_TYPE Type, + IN METADATA_HANDLE PrevHandle, + OUT VOID *Metadata, + IN UINT32 MetadataSize + ); + +#endif // METADATA_OBJ_LIB_H_ diff --git a/DynamicTablesPkg/Library/Common/MetadataObjLib/MetadataObj.c b/DynamicTablesPkg/Library/Common/MetadataObjLib/MetadataObj.c new file mode 100644 index 000000000000..20b06099469c --- /dev/null +++ b/DynamicTablesPkg/Library/Common/MetadataObjLib/MetadataObj.c @@ -0,0 +1,423 @@ +/** @file + Metadata Object Library. + + Copyright (c) 2025, Arm Limited. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include +#include + +#include "MetadataObj.h" + +/** Array of METADATA_STATIC_INFO. */ +STATIC METADATA_STATIC_INFO mMetadataStaticInfo[MetadataTypeMax] = { + // MetadataTypeUid + { + sizeof (METADATA_OBJ_UID), + }, + // MetadataTypeProximityDomain + { + sizeof (METADATA_OBJ_PROXIMITY_DOMAIN), + }, +}; + +/** Initialize the Metadata Root. + + @param[out] Root If success, Root of the Metadata information. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_OUT_OF_RESOURCES Out of resources. +**/ +EFI_STATUS +EFIAPI +MetadataInitializeHandle ( + OUT METADATA_ROOT_HANDLE *Root + ) +{ + METADATA_ROOT *OutRoot; + UINT32 Index; + + if (Root == NULL) { + ASSERT (Root != NULL); + return EFI_INVALID_PARAMETER; + } + + OutRoot = AllocateZeroPool (sizeof (*OutRoot)); + if (OutRoot == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + for (Index = 0; Index < MetadataTypeMax; Index++) { + InitializeListHead (&OutRoot->MetadataList[Index].List); + } + + *Root = OutRoot; + return EFI_SUCCESS; +} + +/** Free the Metadata Root. + + @param[in] Root Root of the Metadata information to free. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_OUT_OF_RESOURCES Out of resources. +**/ +EFI_STATUS +EFIAPI +MetadataFreeHandle ( + IN METADATA_ROOT_HANDLE Root + ) +{ + if (Root == NULL) { + ASSERT (Root != NULL); + return EFI_INVALID_PARAMETER; + } + + FreePool (Root); + return EFI_SUCCESS; +} + +/** Allocate a METADATA_ENTRY. + + @param[in] Type METADATA_TYPE of the entry to allocate. + @param[in] Token Token uniquely identifying an entry among other + objects with the input METADATA_TYPE. + @param[in] Metadata Metadata to associate to the (Type/Token) pair. + The data is copied. + @param[in] MetadataSize Size of the input Metadata. + @param[out] OutMdEntry If success, contains the created METADATA_ENTRY. + + @retval EFI_SUCCESS Success. + @retval EFI_OUT_OF_RESOURCES Out of resources. +**/ +STATIC +EFI_STATUS +EFIAPI +AllocateMetadataEntry ( + IN METADATA_TYPE Type, + IN CM_OBJECT_TOKEN Token, + IN VOID *Metadata, + IN UINT32 MetadataSize, + OUT METADATA_ENTRY **OutMdEntry + ) +{ + METADATA_ENTRY *Entry; + + ASSERT (Type < MetadataTypeMax); + ASSERT (Token != CM_NULL_TOKEN); + ASSERT (Metadata != NULL); + ASSERT (MetadataSize == mMetadataStaticInfo[Type].ExpectedSize); + ASSERT (OutMdEntry != NULL); + + Entry = AllocateZeroPool (sizeof (*Entry)); + if (Entry == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + Entry->Type = Type; + Entry->Token = Token; + Entry->Metadata = AllocateCopyPool (MetadataSize, Metadata); + if (Entry->Metadata == NULL) { + FreePool (Entry); + return EFI_OUT_OF_RESOURCES; + } + + InitializeListHead (&Entry->List); + + *OutMdEntry = Entry; + return EFI_SUCCESS; +} + +/** Find a METADATA_ENTRY with a matching (Type/Token). + + @param[in] Root Root of the Metadata information. + @param[in] Type METADATA_TYPE of the entry to allocate. + @param[in] Token Token uniquely identifying an entry among other + objects with the input METADATA_TYPE. + @param[out] OutMdEntry If success, contains the METADATA_ENTRY with + a matching (Type/Token). + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. +**/ +STATIC +EFI_STATUS +EFIAPI +MetadataFindEntry ( + IN METADATA_ROOT *Root, + IN METADATA_TYPE Type, + IN CM_OBJECT_TOKEN Token, + OUT METADATA_ENTRY **OutMdEntry + ) +{ + LIST_ENTRY *ListHead; + LIST_ENTRY *Link; + METADATA_ENTRY *Entry; + + if ((Type >= MetadataTypeMax) || + (Token == CM_NULL_TOKEN) || + (OutMdEntry == NULL)) + { + ASSERT (Type < MetadataTypeMax); + ASSERT (Token != CM_NULL_TOKEN); + ASSERT (OutMdEntry != NULL); + return EFI_INVALID_PARAMETER; + } + + ListHead = &Root->MetadataList[Type].List; + Link = GetFirstNode (ListHead); + + while (Link != ListHead) { + Entry = (METADATA_ENTRY *)Link; + + if (Entry->Token == Token) { + break; + } + + Link = GetNextNode (ListHead, Link); + } + + // No matching token. + if (Link == ListHead) { + return EFI_NOT_FOUND; + } + + *OutMdEntry = Entry; + return EFI_SUCCESS; +} + +/** Attach some Metadata to a (Type/Token) pair. + + @param[in] Root Root of the Metadata information. + @param[in] Type METADATA_TYPE of the entry to allocate. + @param[in] Token Token uniquely identifying an entry among other + objects with the input METADATA_TYPE. + @param[in] Metadata Metadata to associate to the (Type/Token) pair. + The data is copied. + @param[in] MetadataSize Size of the input Metadata. + + @retval EFI_SUCCESS Success. + @retval EFI_ALREADY_STARTED (Type/Token) pair is already present. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. +**/ +EFI_STATUS +EFIAPI +MetadataAdd ( + IN METADATA_ROOT_HANDLE Root, + IN METADATA_TYPE Type, + IN CM_OBJECT_TOKEN Token, + IN VOID *Metadata, + IN UINT32 MetadataSize + ) +{ + EFI_STATUS Status; + METADATA_ENTRY *Entry; + + if ((Root == NULL) || + (Type >= MetadataTypeMax) || + (Token == CM_NULL_TOKEN) || + (Metadata == NULL) || + (MetadataSize != mMetadataStaticInfo[Type].ExpectedSize)) + { + ASSERT (Root != NULL); + ASSERT (Type < MetadataTypeMax); + ASSERT (Token != CM_NULL_TOKEN); + ASSERT (Metadata != NULL); + ASSERT (MetadataSize == mMetadataStaticInfo[Type].ExpectedSize); + return EFI_INVALID_PARAMETER; + } + + Status = MetadataFindEntry (Root, Type, Token, &Entry); + if (Status == EFI_SUCCESS) { + // The (Type/Token) pair already exists. + return EFI_ALREADY_STARTED; + } else if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { + // Error other than not-found. + ASSERT_EFI_ERROR (Status); + return Status; + } + + // If not-found, create an new entry. + Status = AllocateMetadataEntry (Type, Token, Metadata, MetadataSize, &Entry); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + InsertTailList (&((METADATA_ROOT *)Root)->MetadataList[Type].List, &Entry->List); + return Status; +} + +/** Remove a (Type/Token) pair and its associated Metadata. + + @param[in] Root Root of the Metadata information. + @param[in] Type METADATA_TYPE of the entry to remove. + @param[in] Token Token uniquely identifying an entry among other + objects with the input METADATA_TYPE. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. +**/ +EFI_STATUS +EFIAPI +MetadataRemove ( + IN METADATA_ROOT_HANDLE Root, + IN METADATA_TYPE Type, + IN CM_OBJECT_TOKEN Token + ) +{ + EFI_STATUS Status; + METADATA_ENTRY *Entry; + + if ((Root == NULL) || + (Type >= MetadataTypeMax) || + (Token == CM_NULL_TOKEN)) + { + ASSERT (Root != NULL); + ASSERT (Type < MetadataTypeMax); + ASSERT (Token != CM_NULL_TOKEN); + return EFI_INVALID_PARAMETER; + } + + Status = MetadataFindEntry (Root, Type, Token, &Entry); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + RemoveEntryList (&Entry->List); + if (Entry->Metadata != NULL) { + FreePool (Entry->Metadata); + } + + FreePool (Entry); + + return EFI_SUCCESS; +} + +/** Get the Metadata associated with an (Type/Token). + + @param[in] Root Root of the Metadata information. + @param[in] Type METADATA_TYPE of the entry to get. + @param[in] Token Token uniquely identifying an entry among other + objects with the input METADATA_TYPE. + @param[out] Metadata If success, contains the Metadata associated to the + input (Type/Token). + @param[in] MetadataSize Size of the input Metadata. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. +**/ +EFI_STATUS +EFIAPI +MetadataGet ( + IN METADATA_ROOT_HANDLE Root, + IN METADATA_TYPE Type, + IN CM_OBJECT_TOKEN Token, + OUT VOID *Metadata, + IN UINT32 MetadataSize + ) +{ + EFI_STATUS Status; + METADATA_ENTRY *Entry; + + if ((Root == NULL) || + (Type >= MetadataTypeMax) || + (Token == CM_NULL_TOKEN) || + (Metadata == NULL) || + (MetadataSize != mMetadataStaticInfo[Type].ExpectedSize)) + { + ASSERT (Root != NULL); + ASSERT (Type < MetadataTypeMax); + ASSERT (Token != CM_NULL_TOKEN); + ASSERT (Metadata != NULL); + ASSERT (MetadataSize != mMetadataStaticInfo[Type].ExpectedSize); + return EFI_INVALID_PARAMETER; + } + + Status = MetadataFindEntry (Root, Type, Token, &Entry); + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { + // Error other than not-found. + ASSERT_EFI_ERROR (Status); + return Status; + } else if (Status == EFI_NOT_FOUND) { + return Status; + } + + CopyMem (Metadata, Entry->Metadata, MetadataSize); + return EFI_SUCCESS; +} + +/** Iterate over the existing Metadata with the same Type. + + @param[in] Root Root of the Metadata information. + @param[in] Type METADATA_TYPE to iterate over. + @param[in] PrevHandle MetadataIterate () returns the Metadata handle + following PrevHandle. + If PrevHandle==NULL, the first Handle of the type + is returned. + If PrevHandle is the last Handle of the type, + NULL is returned. + @param[out] Metadata Metadata of the current Handle. + @param[in] MetadataSize Size of the input Metadata. + + @return METADATA_HANDLE The Metadata handle following PrevHandle. +**/ +METADATA_HANDLE +EFIAPI +MetadataIterate ( + IN METADATA_ROOT_HANDLE Root, + IN METADATA_TYPE Type, + IN METADATA_HANDLE PrevHandle, + OUT VOID *Metadata, + IN UINT32 MetadataSize + ) +{ + METADATA_ENTRY *Entry; + LIST_ENTRY *ListHead; + LIST_ENTRY *Link; + + if ((Root == NULL) || + (Type >= MetadataTypeMax) || + (Metadata == NULL) || + (MetadataSize != mMetadataStaticInfo[Type].ExpectedSize)) + { + ASSERT (Root != NULL); + ASSERT (Type < MetadataTypeMax); + ASSERT (Metadata != NULL); + ASSERT (MetadataSize == mMetadataStaticInfo[Type].ExpectedSize); + return NULL; + } + + ListHead = &((METADATA_ROOT *)Root)->MetadataList[Type].List; + + if (PrevHandle == NULL) { + Link = GetFirstNode (ListHead); + } else { + Link = GetNextNode (ListHead, (LIST_ENTRY *)PrevHandle); + } + + // End of the list. + if (Link == ListHead) { + Link = NULL; + } + + Entry = (METADATA_ENTRY *)Link; + + if ((Entry != NULL) && (Entry->Metadata != NULL)) { + CopyMem (Metadata, Entry->Metadata, mMetadataStaticInfo[Type].ExpectedSize); + } + + return (METADATA_HANDLE)Link; +} diff --git a/DynamicTablesPkg/Library/Common/MetadataObjLib/MetadataObj.h b/DynamicTablesPkg/Library/Common/MetadataObjLib/MetadataObj.h new file mode 100644 index 000000000000..ad96da7d5829 --- /dev/null +++ b/DynamicTablesPkg/Library/Common/MetadataObjLib/MetadataObj.h @@ -0,0 +1,59 @@ +/** @file + Metadata Object Library. + + Copyright (c) 2025, Arm Limited. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef METADATA_OBJ_H_ +#define METADATA_OBJ_H_ + +#include + +/** Metadata Entry. + + Store the generated Metadata along the associated CmObj/Token + in this structure. +**/ +typedef struct MetadataEntry { + /// List entry + LIST_ENTRY List; + + /// Metadata Type + METADATA_TYPE Type; + + /// Token + CM_OBJECT_TOKEN Token; + + /// Metadata. Must be interpreted per-METADATA_TYPE + VOID *Metadata; +} METADATA_ENTRY; + +/** Metadata Object Type. + + There is one entry for for each METADATA_TYPE. +**/ +typedef struct MetadataList { + /// Per-METADATA_TYPE list of METADATA_ENTRY struct + LIST_ENTRY List; +} METADATA_LIST; + +/** Metadata static information. + + There is one entry for for each METADATA_TYPE. +**/ +typedef struct MetadataStaticInfo { + /// Expected size for this METADATA_TYPE + UINT32 ExpectedSize; +} METADATA_STATIC_INFO; + +/** Metadata Root. + + All the METADATA_ENTRY are attached to a root. +**/ +typedef struct MetadataRoot { + /// Array of METADATA_LIST. One entry for each MetadataType. + METADATA_LIST MetadataList[MetadataTypeMax]; +} METADATA_ROOT; + +#endif // METADATA_OBJ_H_ diff --git a/DynamicTablesPkg/Library/Common/MetadataObjLib/MetadataObjLib.inf b/DynamicTablesPkg/Library/Common/MetadataObjLib/MetadataObjLib.inf new file mode 100644 index 000000000000..d32e08fafb67 --- /dev/null +++ b/DynamicTablesPkg/Library/Common/MetadataObjLib/MetadataObjLib.inf @@ -0,0 +1,26 @@ +## @file +# Metadata Object Library +# +# Copyright (c) 2025, Arm Limited. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = MetadataObjLib + FILE_GUID = 7E8E422A-1A2B-4152-9A14-68C24A57E98A + VERSION_STRING = 1.0 + MODULE_TYPE = DXE_DRIVER + LIBRARY_CLASS = MetadataObjLib + +[Sources] + MetadataObj.c + MetadataObj.h + +[Packages] + DynamicTablesPkg/DynamicTablesPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + BaseLib From d15e48853c6ace628d98dac8b5f905f40c50a887 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Fri, 25 Apr 2025 11:13:05 +0200 Subject: [PATCH 0025/1172] DynamicTablesPkg: Add MetadataHandlerLib library Built on top of the MetadataObjLib, this library aims to provide functions for each METADATA_ID to: - Generate new Metadata on the fly: the caller provides minimal information for a METADATA_ID, and the library generates the missing information. - Validate all the Metadata objects for a METADATA_ID. For instance, _UID must be unique for a _HID/_CID/EISAID. This patch also adds support for generation/validation of: - UIDs: For each EISAID or NameId, UIDs must be unique. The generation if UIDs is done by a per-EISAID/NameId incrementing counter. The validation of the Metadata consists in checking for the uniqueness of the UID per EISAID/NameId. - ProximityDomains: Proximity Domain Ids are generated by a counter, starting from 0. The validation of the Metadata consists in checking for the uniqueness of the proximity domain Ids. Signed-off-by: Pierre Gondois --- DynamicTablesPkg/DynamicTables.dsc.inc | 1 + DynamicTablesPkg/DynamicTablesPkg.dec | 3 + DynamicTablesPkg/DynamicTablesPkg.dsc | 1 + .../Include/Library/MetadataHandlerLib.h | 57 ++++ .../MetadataHandlerLib/MetadataHandler.c | 112 +++++++ .../MetadataHandlerLib/MetadataHandler.h | 144 +++++++++ .../MetadataHandlerLib/MetadataHandlerLib.inf | 29 ++ .../MetadataProximityDomain.c | 154 ++++++++++ .../Common/MetadataHandlerLib/MetadataUid.c | 287 ++++++++++++++++++ 9 files changed, 788 insertions(+) create mode 100644 DynamicTablesPkg/Include/Library/MetadataHandlerLib.h create mode 100644 DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataHandler.c create mode 100644 DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataHandler.h create mode 100644 DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataHandlerLib.inf create mode 100644 DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataProximityDomain.c create mode 100644 DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataUid.c diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc index 781e8c61c607..d5d7c268c71e 100644 --- a/DynamicTablesPkg/DynamicTables.dsc.inc +++ b/DynamicTablesPkg/DynamicTables.dsc.inc @@ -23,6 +23,7 @@ TableHelperLib|DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf SmbiosStringTableLib|DynamicTablesPkg/Library/Common/SmbiosStringTableLib/SmbiosStringTableLib.inf MetadataObjLib|DynamicTablesPkg/Library/Common/MetadataObjLib/MetadataObjLib.inf + MetadataHandlerLib|DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataHandlerLib.inf [LibraryClasses.AARCH64] DynamicTablesScmiInfoLib|DynamicTablesPkg/Library/DynamicTablesScmiInfoLib/DynamicTablesScmiInfoLib.inf diff --git a/DynamicTablesPkg/DynamicTablesPkg.dec b/DynamicTablesPkg/DynamicTablesPkg.dec index 3ae95dc6eb89..babd6130eb29 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dec +++ b/DynamicTablesPkg/DynamicTablesPkg.dec @@ -46,6 +46,9 @@ ## @libraryclass Defines a set of APIs to a handle Metadata around CmObj. MetadataObjLib|Include/Library/MetadataObjLib.h + ## @libraryclass Defines a set of APIs to a handle Metadata generation/validation. + MetadataHandlerLib|Include/Library/MetadataHandlerLib.h + [LibraryClasses.AARCH64] ## @libraryclass Defines a set of APIs to populate CmObj using SCMI. DynamicTablesScmiInfoLib|Include/Library/DynamicTablesScmiInfoLib.h diff --git a/DynamicTablesPkg/DynamicTablesPkg.dsc b/DynamicTablesPkg/DynamicTablesPkg.dsc index 8e11a6e0a447..c2e6f5c454d3 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dsc +++ b/DynamicTablesPkg/DynamicTablesPkg.dsc @@ -49,6 +49,7 @@ DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepoLib.inf DynamicTablesPkg/Library/Common/SmbiosStringTableLib/SmbiosStringTableLib.inf DynamicTablesPkg/Library/Common/MetadataObjLib/MetadataObjLib.inf + DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataHandlerLib.inf [Components.ARM, Components.AARCH64] DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf diff --git a/DynamicTablesPkg/Include/Library/MetadataHandlerLib.h b/DynamicTablesPkg/Include/Library/MetadataHandlerLib.h new file mode 100644 index 000000000000..db210413c96f --- /dev/null +++ b/DynamicTablesPkg/Include/Library/MetadataHandlerLib.h @@ -0,0 +1,57 @@ +/** @file + Metadata Handler Library. + + Copyright (c) 2025, Arm Limited. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef METADATA_HANDLER_LIB_H_ +#define METADATA_HANDLER_LIB_H_ + +#include + +/** Query the MetadataObjLib for metadata matching the input (Type/Token). + If the metadata exists, return it. + Otherwise: + - Generate a new metadata object + - Add it to the MetadataObjLib + - return it + + @param[in] Root Root of the Metadata information. + @param[in] Type METADATA_TYPE of the entry to generate. + @param[in] Token Token uniquely identifying an entry among other + objects with the input METADATA_TYPE. + @param[in] Context Optional context to use during the Metadata generation. + @param[in, out] Metadata On input, can contain METADATA_TYPE-specific information. + On output and if success, contains the generated + Metadata object. + @param[in] MetadataSize Size of the input Metadata. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +EFI_STATUS +EFIAPI +MetadataHandlerGenerate ( + IN METADATA_ROOT_HANDLE Root, + IN METADATA_TYPE Type, + IN CM_OBJECT_TOKEN Token, + IN VOID *Context, + IN OUT VOID *Metadata, + IN UINT32 MetadataSize + ); + +/** Validate the Metadata. + + @param[in] Root Root of the Metadata information. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +EFI_STATUS +EFIAPI +MetadataHandlerValidate ( + IN METADATA_ROOT_HANDLE Root + ); + +#endif // METADATA_HANDLER_LIB_H_ diff --git a/DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataHandler.c b/DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataHandler.c new file mode 100644 index 000000000000..ad2be3a04732 --- /dev/null +++ b/DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataHandler.c @@ -0,0 +1,112 @@ +/** @file + Metadata Handler Library. + + Copyright (c) 2025, Arm Limited. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include +#include + +#include +#include "MetadataHandler.h" + +/* Metadata handlers. */ +STATIC METADATA_HANDLERS mMetadataHandlers[MetadataTypeMax] = { + // MetadataTypeUid + { + MetadataGenerateUid, + MetadataValidateUid, + }, + // MetadataTypeProximityDomain + { + MetadataGenerateProximityDomain, + MetadataValidateProximityDomain, + }, +}; + +/** Query the MetadataObjLib for metadata matching the input (Type/Token). + If the metadata exists, return it. + Otherwise: + - Generate a new metadata object + - Add it to the MetadataObjLib + - return it + + @param[in] Root Root of the Metadata information. + @param[in] Type METADATA_TYPE of the entry to generate. + @param[in] Token Token uniquely identifying an entry among other + objects with the input METADATA_TYPE. + @param[in] Context Optional context to use during the Metadata generation. + @param[in, out] Metadata On input, can contain METADATA_TYPE-specific information. + On output and if success, contains the generated + Metadata object. + @param[in] MetadataSize Size of the input Metadata. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +EFI_STATUS +EFIAPI +MetadataHandlerGenerate ( + IN METADATA_ROOT_HANDLE Root, + IN METADATA_TYPE Type, + IN CM_OBJECT_TOKEN Token, + IN VOID *Context, + IN OUT VOID *Metadata, + IN UINT32 MetadataSize + ) +{ + EFI_STATUS Status; + + if ((Type >= MetadataTypeMax) || + (Token == CM_NULL_TOKEN) || + (Metadata == NULL) || + (MetadataSize == 0)) + { + ASSERT (Type < MetadataTypeMax); + ASSERT (Token != CM_NULL_TOKEN); + ASSERT (Metadata != NULL); + ASSERT (MetadataSize != 0); + return EFI_INVALID_PARAMETER; + } + + Status = mMetadataHandlers[Type].Generate ( + Root, + Type, + Token, + Context, + Metadata, + MetadataSize + ); + ASSERT_EFI_ERROR (Status); + + return Status; +} + +/** Validate the Metadata. + + @param[in] Root Root of the Metadata information. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +EFI_STATUS +EFIAPI +MetadataHandlerValidate ( + IN METADATA_ROOT_HANDLE Root + ) +{ + EFI_STATUS Status; + METADATA_TYPE Type; + + for (Type = 0; Type < MetadataTypeMax; Type++) { + Status = mMetadataHandlers[Type].Validate (Root); + ASSERT_EFI_ERROR (Status); + } + + return Status; +} diff --git a/DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataHandler.h b/DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataHandler.h new file mode 100644 index 000000000000..bdaa7c0695d9 --- /dev/null +++ b/DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataHandler.h @@ -0,0 +1,144 @@ +/** @file + Metadata Handler Library. + + Copyright (c) 2025, Arm Limited. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef METADATA_HANDLER_H_ +#define METADATA_HANDLER_H_ + +/** Query the MetadataObjLib for metadata matching the input (Type/Token). + If the metadata exists, return it. + Otherwise: + - Generate a new metadata object + - Add it to the MetadataObjLib + - return it + + @param[in] Root Root of the Metadata information. + @param[in] Type METADATA_TYPE of the entry to generate. + @param[in] Token Token uniquely identifying an entry among other + objects with the input METADATA_TYPE. + @param[in] Context Optional context to use during the Metadata generation. + @param[in, out] Metadata On input, can contain METADATA_TYPE-specific information. + On output and if success, contains the generated + Metadata object. + @param[in] MetadataSize Size of the input Metadata. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +typedef EFI_STATUS (EFIAPI *METADATA_GENERATOR)( + IN METADATA_ROOT_HANDLE Root, + IN METADATA_TYPE Type, + IN CM_OBJECT_TOKEN Token, + IN VOID *Context, + IN OUT VOID *Metadata, + IN UINT32 MetadataSize + ); + +/** Validate the Metadata. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +typedef EFI_STATUS (EFIAPI *METADATA_VALIDATOR)( + IN METADATA_ROOT_HANDLE Root + ); + +/** Metadata Handlers. + */ +typedef struct MetadataHandlers { + METADATA_GENERATOR Generate; + METADATA_VALIDATOR Validate; +} METADATA_HANDLERS; + +/** Query the MetadataObjLib for metadata matching the input (Type/Token). + If the metadata exists, return it. + Otherwise: + - Generate a new metadata object + - Add it to the MetadataObjLib + - return it + + @param[in] Root Root of the Metadata information. + @param[in] Type METADATA_TYPE of the entry to generate. + @param[in] Token Token uniquely identifying an entry among other + objects with the input METADATA_TYPE. + @param[in] Context Optional context to use during the Metadata generation. + @param[in, out] Metadata On input, can contain METADATA_TYPE-specific information. + On output and if success, contains the generated + Metadata object. + @param[in] MetadataSize Size of the input Metadata. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +EFI_STATUS +EFIAPI +MetadataGenerateUid ( + IN METADATA_ROOT_HANDLE Root, + IN METADATA_TYPE Type, + IN CM_OBJECT_TOKEN Token, + IN VOID *Context, + IN OUT VOID *Metadata, + IN UINT32 MetadataSize + ); + +/** Validate the Metadata. + + @param[in] Root Root of the Metadata information. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +EFI_STATUS +EFIAPI +MetadataValidateUid ( + IN METADATA_ROOT_HANDLE Root + ); + +/** Query the MetadataObjLib for metadata matching the input (Type/Token). + If the metadata exists, return it. + Otherwise: + - Generate a new metadata object + - Add it to the MetadataObjLib + - return it + + @param[in] Root Root of the Metadata information. + @param[in] Type METADATA_TYPE of the entry to generate. + @param[in] Token Token uniquely identifying an entry among other + objects with the input METADATA_TYPE. + @param[in] Context Optional context to use during the Metadata generation. + @param[in, out] Metadata On input, can contain METADATA_TYPE-specific information. + On output and if success, contains the generated + Metadata object. + @param[in] MetadataSize Size of the input Metadata. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +EFI_STATUS +EFIAPI +MetadataGenerateProximityDomain ( + IN METADATA_ROOT_HANDLE Root, + IN METADATA_TYPE Type, + IN CM_OBJECT_TOKEN Token, + IN VOID *Context, + IN OUT VOID *Metadata, + IN UINT32 MetadataSize + ); + +/** Validate the Metadata. + + @param[in] Root Root of the Metadata information. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +EFI_STATUS +EFIAPI +MetadataValidateProximityDomain ( + IN METADATA_ROOT_HANDLE Root + ); + +#endif // METADATA_HANDLER_H_ diff --git a/DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataHandlerLib.inf b/DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataHandlerLib.inf new file mode 100644 index 000000000000..69f0b85fccc4 --- /dev/null +++ b/DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataHandlerLib.inf @@ -0,0 +1,29 @@ +## @file +# Metadata Handler Library +# +# Copyright (c) 2025, Arm Limited. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = MetadataHandlerLib + FILE_GUID = 60E0B01A-94E6-48C6-B21B-F772E58352E9 + VERSION_STRING = 1.0 + MODULE_TYPE = DXE_DRIVER + LIBRARY_CLASS = MetadataHandlerLib + +[Sources] + MetadataHandler.c + MetadataHandler.h + MetadataProximityDomain.c + MetadataUid.c + +[Packages] + MdePkg/MdePkg.dec + DynamicTablesPkg/DynamicTablesPkg.dec + +[LibraryClasses] + BaseLib + MetadataObjLib diff --git a/DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataProximityDomain.c b/DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataProximityDomain.c new file mode 100644 index 000000000000..daa539f1b609 --- /dev/null +++ b/DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataProximityDomain.c @@ -0,0 +1,154 @@ +/** @file + Metadata Proximity Domain handlers. + + Copyright (c) 2025, Arm Limited. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include +#include + +#include +#include "MetadataHandler.h" + +typedef struct ProximityDomainData { + /// Current Id used for the Proximity Domain Id generation. + UINT32 CurrentId; +} PROXIMITY_DOMAIN_DATA; + +STATIC PROXIMITY_DOMAIN_DATA mProximityDomainData = { + 0 +}; + +/** Query the MetadataObjLib for metadata matching the input (Type/Token). + If the metadata exists, return it. + Otherwise: + - Generate a new metadata object + - Add it to the MetadataObjLib + - return it + + @param[in] Root Root of the Metadata information. + @param[in] Type METADATA_TYPE of the entry to generate. + @param[in] Token Token uniquely identifying an entry among other + objects with the input METADATA_TYPE. + @param[in] Context Optional context to use during the Metadata generation. + @param[in, out] Metadata On input, can contain METADATA_TYPE-specific information. + On output and if success, contains the generated + Metadata object. + @param[in] MetadataSize Size of the input Metadata. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +EFI_STATUS +EFIAPI +MetadataGenerateProximityDomain ( + IN METADATA_ROOT_HANDLE Root, + IN METADATA_TYPE Type, + IN CM_OBJECT_TOKEN Token, + IN VOID *Context, + IN OUT VOID *Metadata, + IN UINT32 MetadataSize + ) +{ + EFI_STATUS Status; + METADATA_OBJ_PROXIMITY_DOMAIN *ProximityDomain; + + if ((Type != MetadataTypeProximityDomain) || + (Token == CM_NULL_TOKEN) || + (Metadata == NULL)) + { + ASSERT (Type == MetadataTypeProximityDomain); + ASSERT (Token != CM_NULL_TOKEN); + ASSERT (Metadata != NULL); + return EFI_INVALID_PARAMETER; + } + + Status = MetadataGet (Root, Type, Token, Metadata, MetadataSize); + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { + ASSERT_EFI_ERROR (Status); + return Status; + } else if (Status == EFI_SUCCESS) { + // Metadata for this (Type/Token) already exists. + return EFI_SUCCESS; + } + + // Generate new Metadata (i.e. Status == EFI_NOT_FOUND). + + ProximityDomain = (METADATA_OBJ_PROXIMITY_DOMAIN *)Metadata; + ProximityDomain->Id = mProximityDomainData.CurrentId++; + + Status = MetadataAdd (Root, Type, Token, Metadata, MetadataSize); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + return EFI_SUCCESS; +} + +/** Validate the Metadata. + + @param[in] Root Root of the Metadata information. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +EFI_STATUS +EFIAPI +MetadataValidateProximityDomain ( + IN METADATA_ROOT_HANDLE Root + ) +{ + METADATA_HANDLE Handle0; + METADATA_HANDLE Handle1; + METADATA_OBJ_PROXIMITY_DOMAIN Metadata0; + METADATA_OBJ_PROXIMITY_DOMAIN Metadata1; + + Handle0 = NULL; + + while (TRUE) { + Handle0 = MetadataIterate ( + Root, + MetadataTypeProximityDomain, + Handle0, + &Metadata0, + sizeof (METADATA_OBJ_PROXIMITY_DOMAIN) + ); + if (Handle0 == NULL) { + break; + } + + // Loop starting from Handle0 + Handle1 = Handle0; + + while (TRUE) { + Handle1 = MetadataIterate ( + Root, + MetadataTypeProximityDomain, + Handle1, + &Metadata1, + sizeof (METADATA_OBJ_PROXIMITY_DOMAIN) + ); + + if (Handle1 == NULL) { + break; + } + + if (Metadata0.Id == Metadata1.Id) { + DEBUG (( + DEBUG_ERROR, + "Metadata: ProximityDomain: Same Id: %d\n", + Metadata0.Id + )); + ASSERT (0); + } + } + } + + return EFI_SUCCESS; +} diff --git a/DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataUid.c b/DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataUid.c new file mode 100644 index 000000000000..7183371c93fe --- /dev/null +++ b/DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataUid.c @@ -0,0 +1,287 @@ +/** @file + Metadata Proximity Domain handlers. + + Copyright (c) 2025, Arm Limited. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include +#include + +#include +#include "MetadataHandler.h" + +/** Uid Entry + + One entry is allocated for each HID/CID/EISAID. Each entry + contains a counter used for the generation of UID values. +**/ +typedef struct MetadataUidEntry { + LIST_ENTRY List; + + /// _HID or _CID of the device (NULL-terminated string). + /// This provides a mean to uniquely identify a device type. + /// If not populated, EisaId must be set. + CHAR8 NameId[9]; + + /// EisaId of the device. + /// This provides a mean to uniquely identify a device type. + /// If not populated, NameId must be set. + UINT32 EisaId; + + /// Current Id used for the generation of a HID/CID/EisaId. + UINT32 CurrId; +} METADATA_UID_ENTRY; + +// List of METADATA_UID_ENTRY +STATIC LIST_ENTRY mUidList = INITIALIZE_LIST_HEAD_VARIABLE (mUidList); + +/** Allocate a METADATA_UID_ENTRY. + + @param [in] Metadata Metadata containing the NameId/EisaId to use. + @param [out] OutEntry Allocated Entry. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_OUT_OF_RESOURCES Out of resources. +**/ +STATIC +EFI_STATUS +EFIAPI +AllocateUidEntry ( + IN METADATA_OBJ_UID *Metadata, + OUT METADATA_UID_ENTRY **OutEntry + ) +{ + METADATA_UID_ENTRY *Entry; + + if ((Metadata == NULL) || (OutEntry == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Entry = AllocateZeroPool (sizeof (METADATA_UID_ENTRY)); + if (Entry == NULL) { + ASSERT (Entry != NULL); + return EFI_OUT_OF_RESOURCES; + } + + InitializeListHead (&Entry->List); + Entry->CurrId = 0; + + if (Metadata->NameId[0] != 0) { + AsciiStrCpyS (Entry->NameId, sizeof (Metadata->NameId), Metadata->NameId); + } else { + Entry->EisaId = Metadata->EisaId; + } + + *OutEntry = Entry; + return EFI_SUCCESS; +} + +/** Find a matching METADATA_UID_ENTRY. + If no Entry is found, allocate one. + + @param [in] Metadata Metadata containing the NameId/EisaId to search. + @param [out] OutEntry Matching or allocated Entry. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_OUT_OF_RESOURCES Out of resources. +**/ +STATIC +EFI_STATUS +EFIAPI +FindEntry ( + IN METADATA_OBJ_UID *Metadata, + OUT METADATA_UID_ENTRY **OutEntry + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Link; + METADATA_UID_ENTRY *Entry; + + if ((Metadata == NULL) || (OutEntry == NULL)) { + ASSERT (Metadata != NULL); + ASSERT (OutEntry != NULL); + return EFI_INVALID_PARAMETER; + } + + Link = GetNextNode (&mUidList, &mUidList); + + while (Link != &mUidList) { + Entry = (METADATA_UID_ENTRY *)Link; + + if (Entry->NameId[0] != 0) { + if (AsciiStrnCmp (Entry->NameId, Metadata->NameId, sizeof (Metadata->NameId)) == 0) { + break; + } + } else if (Metadata->EisaId != 0) { + if (Entry->EisaId == Metadata->EisaId) { + break; + } + } else { + DEBUG ((DEBUG_ERROR, "MetadatUid: Empty NameId and EisaId\n")); + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + Link = GetNextNode (&mUidList, Link); + } // while + + // No matching METADATA_UID_ENTRY found. + if (Link == &mUidList) { + Status = AllocateUidEntry (Metadata, &Entry); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + InsertTailList (&mUidList, &Entry->List); + } + + *OutEntry = Entry; + return EFI_SUCCESS; +} + +/** Query the MetadataObjLib for metadata matching the input (Type/Token). + If the metadata exists, return it. + Otherwise: + - Generate a new metadata object + - Add it to the MetadataObjLib + - return it + + @param[in] Root Root of the Metadata information. + @param[in] Type METADATA_TYPE of the entry to generate. + @param[in] Token Token uniquely identifying an entry among other + objects with the input METADATA_TYPE. + @param[in] Context Optional context to use during the Metadata generation. + @param[in, out] Metadata On input, can contain METADATA_TYPE-specific information. + On output and if success, contains the generated + Metadata object. + @param[in] MetadataSize Size of the input Metadata. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +EFI_STATUS +EFIAPI +MetadataGenerateUid ( + IN METADATA_ROOT_HANDLE Root, + IN METADATA_TYPE Type, + IN CM_OBJECT_TOKEN Token, + IN VOID *Context, + IN OUT VOID *Metadata, + IN UINT32 MetadataSize + ) +{ + EFI_STATUS Status; + METADATA_OBJ_UID *Uid; + METADATA_UID_ENTRY *Entry; + + if ((Type != MetadataTypeUid) || + (Token == CM_NULL_TOKEN) || + (Metadata == NULL)) + { + ASSERT (Type == MetadataTypeUid); + ASSERT (Token != CM_NULL_TOKEN); + ASSERT (Metadata != NULL); + return EFI_INVALID_PARAMETER; + } + + Status = MetadataGet (Root, Type, Token, Metadata, MetadataSize); + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { + ASSERT_EFI_ERROR (Status); + return Status; + } else if (Status == EFI_SUCCESS) { + // Metadata for this (Type/Token) already exists. + return EFI_SUCCESS; + } + + // Generate new Metadata (i.e. Status == EFI_NOT_FOUND). + + // Get the Current Type for this HID/CID/EISAID + Status = FindEntry (Metadata, &Entry); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + Uid = (METADATA_OBJ_UID *)Metadata; + Uid->Uid = Entry->CurrId++; + + Status = MetadataAdd (Root, Type, Token, Metadata, MetadataSize); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + return EFI_SUCCESS; +} + +/** Validate the Metadata. + + @param[in] Root Root of the Metadata information. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +EFI_STATUS +EFIAPI +MetadataValidateUid ( + IN METADATA_ROOT_HANDLE Root + ) +{ + METADATA_HANDLE Handle0; + METADATA_HANDLE Handle1; + METADATA_OBJ_UID Metadata0; + METADATA_OBJ_UID Metadata1; + + Handle0 = NULL; + + while (TRUE) { + Handle0 = MetadataIterate ( + Root, + MetadataTypeUid, + Handle0, + &Metadata0, + sizeof (METADATA_OBJ_UID) + ); + if (Handle0 == NULL) { + break; + } + + // Loop starting from Handle0 + Handle1 = Handle0; + + while (TRUE) { + Handle1 = MetadataIterate ( + Root, + MetadataTypeUid, + Handle1, + &Metadata1, + sizeof (METADATA_OBJ_UID) + ); + + if (Handle1 == NULL) { + break; + } + + if (CompareMem (&Metadata0, &Metadata1, sizeof (METADATA_OBJ_UID)) == 0) { + DEBUG (( + DEBUG_ERROR, + "Metadata: Uid: Same Type: EisaId=%d NameId=%a Uid=%d \n", + Metadata0.EisaId, + Metadata0.NameId, + Metadata0.Uid + )); + ASSERT (0); + } + } + } + + return EFI_SUCCESS; +} From 771b45250724c9bee6210f041ec137ff27411c78 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Fri, 25 Apr 2025 13:44:04 +0200 Subject: [PATCH 0026/1172] DynamicTablesPkg: Add GetMetadataRoot() cb to DynamicTableFactory protocol The newly added MetadataObjLib allows to store information either: - generated by the DynamictTablesPkg framework - provided by a ConfigurationManager - parsed from another source of information This information might be subject to validation/verification. This step can only be done once the firmware tables generated by the DynamictTablesPkg have been generated. Add a new GetMetadataRoot() callback to the EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL. This callback allows to fetch the Metadata Root, allowing to access all the Metadata information generated. This Metadata is then validated by the DynamicTableManagerDxe. Signed-off-by: Pierre Gondois --- .../DynamicTableFactoryDxe.c | 27 +++++++++++++++++++ .../DynamicTableFactoryDxe.inf | 1 + .../DynamicTableManagerDxe.c | 14 ++++++++++ .../DynamicTableManagerDxe.inf | 1 + DynamicTablesPkg/Include/MetadataHelpers.h | 27 +++++++++++++++++++ .../Protocol/DynamicTableFactoryProtocol.h | 19 +++++++++++++ 6 files changed, 89 insertions(+) create mode 100644 DynamicTablesPkg/Include/MetadataHelpers.h diff --git a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.c b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.c index 6d6d3fa74670..4f38a062e85b 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.c +++ b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "DynamicTableFactory.h" @@ -29,6 +30,25 @@ */ EDKII_DYNAMIC_TABLE_FACTORY_INFO TableFactoryInfo; +STATIC METADATA_ROOT_HANDLE mMetadataRoot; + +/** Get the Root handle of the MetadataObjLib. + + During the firmware table generation, some Metadata information might be + generated by different generators. This Metadata might be subject to + additional validation. + + @return The Metadata Root handle. +**/ +METADATA_ROOT_HANDLE +EFIAPI +GetMetadataRoot ( + VOID + ) +{ + return mMetadataRoot; +} + /** A structure describing the Dynamic Table Factory protocol. */ STATIC @@ -44,6 +64,7 @@ EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL DynamicTableFactoryProtocol = { GetDtTableGenerator, RegisterDtTableGenerator, DeregisterDtTableGenerator, + GetMetadataRoot, &TableFactoryInfo }; @@ -66,6 +87,12 @@ DynamicTableFactoryDxeInitialize ( { EFI_STATUS Status; + Status = MetadataInitializeHandle (&mMetadataRoot); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + Status = gBS->InstallProtocolInterface ( &ImageHandle, &gEdkiiDynamicTableFactoryProtocolGuid, diff --git a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.inf b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.inf index 29ed3dc2e502..b960b2c69c79 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.inf +++ b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.inf @@ -35,6 +35,7 @@ [LibraryClasses] BaseLib MemoryAllocationLib + MetadataHandlerLib PrintLib TableHelperLib UefiBootServicesTableLib diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.c b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.c index dfccccb83954..ea8b5ba381a7 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.c +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -691,6 +692,7 @@ DynamicTableManagerDxeInitialize ( EDKII_CONFIGURATION_MANAGER_PROTOCOL *CfgMgrProtocol; CM_STD_OBJ_CONFIGURATION_MANAGER_INFO *CfgMfrInfo; EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *TableFactoryProtocol; + METADATA_ROOT_HANDLE Root; // Locate the Dynamic Table Factory Status = gBS->LocateProtocol ( @@ -762,7 +764,19 @@ DynamicTableManagerDxeInitialize ( "ERROR: ACPI Table processing failure. Status = %r\n", Status )); + return Status; + } + + Root = TableFactoryProtocol->GetMetadataRoot (); + + // Validate the collected Metadata. + Status = MetadataHandlerValidate (Root); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; } + MetadataFreeHandle (Root); + return Status; } diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf index c982b24c2a30..30dc2b82914f 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf @@ -37,6 +37,7 @@ DynamicTablesPkg/DynamicTablesPkg.dec [LibraryClasses] + MetadataHandlerLib PrintLib TableHelperLib UefiBootServicesTableLib diff --git a/DynamicTablesPkg/Include/MetadataHelpers.h b/DynamicTablesPkg/Include/MetadataHelpers.h new file mode 100644 index 000000000000..c881fcafc864 --- /dev/null +++ b/DynamicTablesPkg/Include/MetadataHelpers.h @@ -0,0 +1,27 @@ +/** @file + Metadata Helpers + + Copyright (c) 2025, Arm Limited. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef METADATA_HELPER_H_ +#define METADATA_HELPER_H_ + +#include + +/** Get the Root handle of the MetadataObjLib. + + During the firmware table generation, some Metadata information might be + generated by different generators. This Metadata might be subject to + additional validation. + + @return The Metadata Root handle. +**/ +METADATA_ROOT_HANDLE +EFIAPI +GetMetadataRoot ( + VOID + ); + +#endif // METADATA_HELPER_H_ diff --git a/DynamicTablesPkg/Include/Protocol/DynamicTableFactoryProtocol.h b/DynamicTablesPkg/Include/Protocol/DynamicTableFactoryProtocol.h index b11fc0c9f1d6..c601e407dc0c 100644 --- a/DynamicTablesPkg/Include/Protocol/DynamicTableFactoryProtocol.h +++ b/DynamicTablesPkg/Include/Protocol/DynamicTableFactoryProtocol.h @@ -16,6 +16,7 @@ #include #include #include +#include /** This macro defines the Dynamic Table Factory Protocol GUID. @@ -200,6 +201,20 @@ EFI_STATUS IN CONST DT_TABLE_GENERATOR *CONST Generator ); +/** Get the Root handle of the MetadataObjLib. + + During the firmware table generation, some Metadata information might be + generated by different generators. This Metadata might be subject to + additional validation. + + @return The Metadata Root handle. +**/ +typedef +VOID * +(EFIAPI *EDKII_DYNAMIC_TABLE_FACTORY_GET_METADATA_ROOT)( + VOID + ); + /** A structure describing the Dynamic Table Factory Protocol interface. */ typedef struct DynamicTableFactoryProtocol { @@ -239,6 +254,10 @@ typedef struct DynamicTableFactoryProtocol { EDKII_DYNAMIC_TABLE_FACTORY_DEREGISTER_DT_TABLE_GENERATOR DeregisterDtTableGenerator; + /// Finalization step + EDKII_DYNAMIC_TABLE_FACTORY_GET_METADATA_ROOT + GetMetadataRoot; + /** Pointer to the data structure that holds the list of registered table generators */ From 24d89d099f4e1d30e9f91ef2e436efbe76f1f59d Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Tue, 8 Apr 2025 17:38:45 +0200 Subject: [PATCH 0027/1172] DynamicTablesPkg: SsdtCpuTopologyLib: Use MetadataObjLib for cluster _UID The processor containers might have an associated _UID: - in their SSDT topology representation - in their PPTT representation, in the "ACPI Processor ID" field The _UID of the processor containers is independently generated by the PPTT and SSDT CPU topology generators. Make use of the newly created MetadataObjLib to generate a unique and common per-processor container _UID values. Signed-off-by: Pierre Gondois --- .../SsdtCpuTopologyGenerator.c | 34 ++++++++++++------- .../SsdtCpuTopologyLib.inf | 1 + 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyGenerator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyGenerator.c index d4306992c6c3..be91ec4f473d 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyGenerator.c +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyGenerator.c @@ -26,9 +26,11 @@ #include #include #include +#include #include #include #include +#include #include #include "SsdtCpuTopologyGenerator.h" @@ -859,7 +861,7 @@ CreateAmlProcessorContainer ( return Status; } - // Use the ProcContainerIndex for the _UID value as there is no AcpiProcessorUid + // Use the ProcContainerUid for the _UID value as there is no AcpiProcessorUid // and EFI_ACPI_6_3_PPTT_PROCESSOR_ID_INVALID is set for non-Cpus. Status = AmlCodeGenNameInteger ( "_UID", @@ -965,8 +967,6 @@ CheckProcNode ( @param [in] NodeToken Token of the CM_ARCH_COMMON_PROC_HIERARCHY_INFO currently handled. @param [in] ParentNode Parent node to attach the created node to. - @param [in,out] ProcContainerIndex Pointer to the current processor container - index to be used as UID. @param [in] PackageNodeSeen A parent of the ProcNode has the physical package flag set. @retval EFI_SUCCESS Success. @@ -981,7 +981,6 @@ CreateAmlCpuTopologyTree ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, IN CM_OBJECT_TOKEN NodeToken, IN AML_NODE_HANDLE ParentNode, - IN OUT UINT32 *ProcContainerIndex, IN BOOLEAN PackageNodeSeen ) { @@ -993,13 +992,13 @@ CreateAmlCpuTopologyTree ( UINT32 Uid; UINT16 Name; BOOLEAN HasPhysicalPackageBit; + METADATA_OBJ_UID MetadataUid; ASSERT (Generator != NULL); ASSERT (Generator->ProcNodeList != NULL); ASSERT (Generator->ProcNodeCount != 0); ASSERT (CfgMgrProtocol != NULL); ASSERT (ParentNode != NULL); - ASSERT (ProcContainerIndex != NULL); CpuIndex = 0; ProcContainerName = 0; @@ -1064,7 +1063,24 @@ CreateAmlCpuTopologyTree ( } else { ASSERT ((ProcContainerName & ~MAX_UINT16) == 0); Name = (UINT16)ProcContainerName; - Uid = *ProcContainerIndex; + + MetadataUid.EisaId = 0; + AsciiStrCpyS (MetadataUid.NameId, METADATA_UID_NAMEID_SIZE, "ACPI0010"); + + Status = MetadataHandlerGenerate ( + GetMetadataRoot (), + MetadataTypeUid, + (CM_OBJECT_TOKEN)Generator->ProcNodeList[Index].Token, + NULL, + &MetadataUid, + sizeof (METADATA_OBJ_UID) + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + Uid = MetadataUid.Uid; } Status = CreateAmlProcessorContainer ( @@ -1083,7 +1099,6 @@ CreateAmlCpuTopologyTree ( // Nodes must have a unique name in the ASL namespace. // Reset the Cpu index whenever we create a new processor container. - (*ProcContainerIndex)++; CpuIndex = 0; // And reset the cluster name whenever there is a package. @@ -1102,7 +1117,6 @@ CreateAmlCpuTopologyTree ( CfgMgrProtocol, Generator->ProcNodeList[Index].Token, ProcContainerNode, - ProcContainerIndex, (PackageNodeSeen || HasPhysicalPackageBit) ); if (EFI_ERROR (Status)) { @@ -1138,7 +1152,6 @@ CreateTopologyFromProcHierarchy ( ) { EFI_STATUS Status; - UINT32 ProcContainerIndex; ASSERT (Generator != NULL); ASSERT (Generator->ProcNodeCount != 0); @@ -1146,8 +1159,6 @@ CreateTopologyFromProcHierarchy ( ASSERT (CfgMgrProtocol != NULL); ASSERT (ScopeNode != NULL); - ProcContainerIndex = 0; - Status = TokenTableInitialize (Generator, Generator->ProcNodeCount); if (EFI_ERROR (Status)) { ASSERT (0); @@ -1159,7 +1170,6 @@ CreateTopologyFromProcHierarchy ( CfgMgrProtocol, CM_NULL_TOKEN, ScopeNode, - &ProcContainerIndex, FALSE ); if (EFI_ERROR (Status)) { diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf index da228642e2de..6150217922ed 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf @@ -39,3 +39,4 @@ AcpiHelperLib AmlLib BaseLib + MetadataHandlerLib From dbdf94f68ad4301f67fb758f0a4ae41f1f646ede Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Tue, 8 Apr 2025 17:40:41 +0200 Subject: [PATCH 0028/1172] DynamicTablesPkg: AcpiPpttLib: Use MetadataObjLib for cluster _UID The processor containers might have an associated _UID: - in their SSDT topology representation - in their PPTT representation, in the "ACPI Processor ID" field The _UID of the processor containers is independently generated by the PPTT and SSDT CPU topology generators. Make use of the newly created MetadataObjLib to generate a unique and common per-processor container _UID values. Signed-off-by: Pierre Gondois --- .../Acpi/Common/AcpiPpttLib/AcpiPpttLib.inf | 1 + .../Acpi/Common/AcpiPpttLib/PpttGenerator.c | 52 +++++++++++++++---- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiPpttLib/AcpiPpttLib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiPpttLib/AcpiPpttLib.inf index a1c91a6eab74..53c91defc384 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiPpttLib/AcpiPpttLib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiPpttLib/AcpiPpttLib.inf @@ -28,3 +28,4 @@ [LibraryClasses] BaseLib + MetadataHandlerLib diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiPpttLib/PpttGenerator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiPpttLib/PpttGenerator.c index 8e2e1f61ab1f..a7025fa8db80 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiPpttLib/PpttGenerator.c +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiPpttLib/PpttGenerator.c @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -22,7 +23,9 @@ #include #include #include +#include #include +#include #include #include "PpttGenerator.h" @@ -489,6 +492,8 @@ AddProcHierarchyNodes ( UINT32 NodeCount; UINT32 Length; + METADATA_OBJ_UID MetadataUid; + ASSERT ( (Generator != NULL) && (CfgMgrProtocol != NULL) && @@ -605,17 +610,42 @@ AddProcHierarchyNodes ( // Default invalid ACPI Processor ID to 0 ProcStruct->AcpiProcessorId = 0; } else if (ProcInfoNode->AcpiIdObjectToken == CM_NULL_TOKEN) { - Status = EFI_INVALID_PARAMETER; - DEBUG (( - DEBUG_ERROR, - "ERROR: PPTT: The 'ACPI Processor ID valid' flag is set but no " \ - "ACPI ID Reference object token was provided. " \ - "AcpiIdObjectToken = %p. RequestorToken = %p. Status = %r\n", - ProcInfoNode->AcpiIdObjectToken, - ProcInfoNode->Token, - Status - )); - return Status; + if (IS_PROC_NODE_LEAF (ProcInfoNode)) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "ERROR: PPTT: The 'ACPI Processor ID valid' flag is set but no " \ + "ACPI ID Reference object token was provided. " \ + "AcpiIdObjectToken = %p. RequestorToken = %p. Status = %r\n", + ProcInfoNode->AcpiIdObjectToken, + ProcInfoNode->Token, + Status + )); + return Status; + } + + // Node is a ProcContainer with a valid ID + + if (ProcInfoNode->OverrideNameUidEnabled) { + ProcStruct->AcpiProcessorId = ProcInfoNode->OverrideUid; + } else { + MetadataUid.EisaId = 0; + AsciiStrCpyS (MetadataUid.NameId, METADATA_UID_NAMEID_SIZE, "ACPI0010"); + Status = MetadataHandlerGenerate ( + GetMetadataRoot (), + MetadataTypeUid, + (CM_OBJECT_TOKEN)ProcInfoNode->Token, + NULL, + &MetadataUid, + sizeof (METADATA_OBJ_UID) + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + ProcStruct->AcpiProcessorId = MetadataUid.Uid; + } } else { Status = GetEArmObjGicCInfo ( CfgMgrProtocol, From d5a215ce714ef9f3f32052c3133dea99a99ebeb9 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 28 May 2025 10:35:42 +0200 Subject: [PATCH 0029/1172] DynamicTablesPkg: Add CmObjHelperLib Some generators share some logic in how they handle CmObj. In an effort to factorize this code, create a CmObjHelperLib, aiming to host the common CmObj manipulation logic. Start by adding a CheckAcpiTablePresent() function, allowing to check if an ACPI table is in the list of the tables to install. Signed-off-by: Pierre Gondois --- DynamicTablesPkg/DynamicTables.dsc.inc | 1 + DynamicTablesPkg/DynamicTablesPkg.dec | 3 + DynamicTablesPkg/DynamicTablesPkg.dsc | 1 + .../Include/Library/CmObjHelperLib.h | 27 +++++++ .../Common/CmObjHelperLib/CmObjHelperLib.c | 70 +++++++++++++++++++ .../Common/CmObjHelperLib/CmObjHelperLib.inf | 28 ++++++++ 6 files changed, 130 insertions(+) create mode 100644 DynamicTablesPkg/Include/Library/CmObjHelperLib.h create mode 100644 DynamicTablesPkg/Library/Common/CmObjHelperLib/CmObjHelperLib.c create mode 100644 DynamicTablesPkg/Library/Common/CmObjHelperLib/CmObjHelperLib.inf diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc index d5d7c268c71e..6509275a4b1e 100644 --- a/DynamicTablesPkg/DynamicTables.dsc.inc +++ b/DynamicTablesPkg/DynamicTables.dsc.inc @@ -17,6 +17,7 @@ [LibraryClasses.common] AcpiHelperLib|DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelperLib.inf AmlLib|DynamicTablesPkg/Library/Common/AmlLib/AmlLib.inf + CmObjHelperLib|DynamicTablesPkg/Library/Common/CmObjHelperLib/CmObjHelperLib.inf IpmiCommandLib|MdeModulePkg/Library/BaseIpmiCommandLibNull/BaseIpmiCommandLibNull.inf SsdtPcieSupportLib|DynamicTablesPkg/Library/Common/SsdtPcieSupportLib/SsdtPcieSupportLib.inf SsdtSerialPortFixupLib|DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf diff --git a/DynamicTablesPkg/DynamicTablesPkg.dec b/DynamicTablesPkg/DynamicTablesPkg.dec index babd6130eb29..87934c52cf1d 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dec +++ b/DynamicTablesPkg/DynamicTablesPkg.dec @@ -25,6 +25,9 @@ ## @libraryclass Defines a set of APIs for Dynamic AML generation. AmlLib|Include/Library/AmlLib/AmlLib.h + ## @libraryclass Defines a set of APIs to help CmObj handling. + CmObjHelperLib|Include/Library/CmObjHelperLib.h + ## @libraryclass Defines a set of APIs to handle dynamically created CmObj. DynamicPlatRepoLib|Include/Library/DynamicPlatRepoLib.h diff --git a/DynamicTablesPkg/DynamicTablesPkg.dsc b/DynamicTablesPkg/DynamicTablesPkg.dsc index c2e6f5c454d3..823b3fe62414 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dsc +++ b/DynamicTablesPkg/DynamicTablesPkg.dsc @@ -43,6 +43,7 @@ [Components.common] DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelperLib.inf DynamicTablesPkg/Library/Common/AmlLib/AmlLib.inf + DynamicTablesPkg/Library/Common/CmObjHelperLib/CmObjHelperLib.inf DynamicTablesPkg/Library/Common/SsdtPcieSupportLib/SsdtPcieSupportLib.inf DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf diff --git a/DynamicTablesPkg/Include/Library/CmObjHelperLib.h b/DynamicTablesPkg/Include/Library/CmObjHelperLib.h new file mode 100644 index 000000000000..9090bd857be9 --- /dev/null +++ b/DynamicTablesPkg/Include/Library/CmObjHelperLib.h @@ -0,0 +1,27 @@ +/** @file + Configuration Manager Helper Library. + + Copyright (c) 2025, Arm Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef CM_OBJ_HELPER_LIB_H_ +#define CM_OBJ_HELPER_LIB_H_ + +/** Check if an ACPI table is present in the Configuration manager's ACPI table list. + + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] AcpiTableId Acpi Table Id. + + @retval TRUE if the ACPI table is in the list of ACPI tables to install. + FALSE otherwise. +**/ +BOOLEAN +EFIAPI +CheckAcpiTablePresent ( + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN ESTD_ACPI_TABLE_ID AcpiTableId + ); + +#endif // CM_OBJ_HELPER_LIB_H_ diff --git a/DynamicTablesPkg/Library/Common/CmObjHelperLib/CmObjHelperLib.c b/DynamicTablesPkg/Library/Common/CmObjHelperLib/CmObjHelperLib.c new file mode 100644 index 000000000000..2ad7817082e2 --- /dev/null +++ b/DynamicTablesPkg/Library/Common/CmObjHelperLib/CmObjHelperLib.c @@ -0,0 +1,70 @@ +/** @file + Configuration Manager Helper Library. + + Copyright (c) 2025, Arm Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include + +// Module specific include files. +#include +#include +#include +#include +#include +#include + +/** + This macro expands to a function that retrieves the ACPI Table list + information from the Configuration Manager. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceStandard, + EStdObjAcpiTableList, + CM_STD_OBJ_ACPI_TABLE_INFO + ); + +/** Check if an ACPI table is present in the Configuration manager's ACPI table list. + + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] AcpiTableId Acpi Table Id. + + @retval TRUE if the ACPI table is in the list of ACPI tables to install. + FALSE otherwise. +**/ +BOOLEAN +EFIAPI +CheckAcpiTablePresent ( + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN ESTD_ACPI_TABLE_ID AcpiTableId + ) +{ + EFI_STATUS Status; + CM_STD_OBJ_ACPI_TABLE_INFO *AcpiTableList; + UINT32 AcpiTableListCount; + UINT32 Index; + + Status = GetEStdObjAcpiTableList ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &AcpiTableList, + &AcpiTableListCount + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return FALSE; + } + + for (Index = 0; Index < AcpiTableListCount; Index++) { + if (AcpiTableList[Index].TableGeneratorId == + CREATE_STD_ACPI_TABLE_GEN_ID (AcpiTableId)) + { + return TRUE; + } + } + + return FALSE; +} diff --git a/DynamicTablesPkg/Library/Common/CmObjHelperLib/CmObjHelperLib.inf b/DynamicTablesPkg/Library/Common/CmObjHelperLib/CmObjHelperLib.inf new file mode 100644 index 000000000000..89a952b90884 --- /dev/null +++ b/DynamicTablesPkg/Library/Common/CmObjHelperLib/CmObjHelperLib.inf @@ -0,0 +1,28 @@ +## @file +# Table Helper +# +# Copyright (c) 2025, Arm Limited. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = CmObjHelperLib + FILE_GUID = d8749a75-23ad-410e-a41f-9066d1714188 + VERSION_STRING = 1.0 + MODULE_TYPE = DXE_DRIVER + LIBRARY_CLASS = CmObjHelperLib + +[Sources] + CmObjHelperLib.c + +[Packages] + MdePkg/MdePkg.dec + DynamicTablesPkg/DynamicTablesPkg.dec + +[LibraryClasses] + BaseLib + CmObjHelperLib + MetadataObjLib + MetadataHandlerLib From 8375d2ea6073b3d0681b0d043ba2539a46765d6e Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Tue, 8 Apr 2025 17:37:45 +0200 Subject: [PATCH 0030/1172] DynamicTablesPkg: Check cluster's VALID bit based on SSDT Topology table The ACPI specification v6.5, sTable 5.158: Processor Structure Flags states that: """ The processor container will have a matching ID value returned through the _UID method. As not every pro- cessor hierarchy node structure in PPTT may have a matching processor container, this flag indicates whether the ACPI pro- cessor ID points to valid entry. Where a valid entry is possible the ACPI Processor ID and _UID method are mandatory. """ And in: Table 5.157: Processor Hierarchy Node Structure """ If the processor structure rep- resents a group of associated processors, the structure might match a processor container in the name space. In that case this entry will match the value of the _UID method of the as- sociated processor container. Where there is a match it must be represented. The flags field, described in Processor Struc- ture Flags, includes a bit to describe whether the ACPI pro- cessor ID is valid. """ The DynamicTablesPkg currently creates a processor container: - in the SSDT CPU Topology generator, with the _HID=ACPI0010, and with a valid _UID - in the PPTT table for each CM_ARCH_COMMON_PROC_HIERARCHY_INFO structure. Thus: - all the processor containers should have the VALID bit set if the SSDT CPU Topology table is present. - if the SSDT CPU Topology table is present, but there is no PPTT table, then the state of the VALID bit is ignored. A contrario, an example where the VALID bit should not be set would be if: - the SSDT CPU Topology generator is absent - no processor container is created in the SSDT topology, i.e. if a flat hierarchy is created. Signed-off-by: Pierre Gondois --- .../Acpi/Common/AcpiPpttLib/AcpiPpttLib.inf | 1 + .../Acpi/Common/AcpiPpttLib/PpttGenerator.c | 15 ++++++ .../SsdtCpuTopologyGenerator.c | 51 +++++++++++++++---- .../SsdtCpuTopologyGenerator.h | 8 +-- .../SsdtCpuTopologyLib.inf | 1 + 5 files changed, 62 insertions(+), 14 deletions(-) diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiPpttLib/AcpiPpttLib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiPpttLib/AcpiPpttLib.inf index 53c91defc384..92f3a34e1367 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiPpttLib/AcpiPpttLib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiPpttLib/AcpiPpttLib.inf @@ -28,4 +28,5 @@ [LibraryClasses] BaseLib + CmObjHelperLib MetadataHandlerLib diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiPpttLib/PpttGenerator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiPpttLib/PpttGenerator.c index a7025fa8db80..e1d9883747a7 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiPpttLib/PpttGenerator.c +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiPpttLib/PpttGenerator.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -493,6 +494,7 @@ AddProcHierarchyNodes ( UINT32 Length; METADATA_OBJ_UID MetadataUid; + BOOLEAN SsdtCpuTopoPresent; ASSERT ( (Generator != NULL) && @@ -506,6 +508,8 @@ AddProcHierarchyNodes ( ProcNodeIterator = Generator->ProcHierarchyNodeIndexedList; NodeCount = Generator->ProcHierarchyNodeCount; + SsdtCpuTopoPresent = CheckAcpiTablePresent (CfgMgrProtocol, EStdAcpiTableIdSsdtCpuTopology); + // Check if every GICC Object is referenced by onlu one Proc Node IsAcpiIdObjectTokenDuplicated = FindDuplicateValue ( ProcNodeIterator, @@ -622,6 +626,17 @@ AddProcHierarchyNodes ( Status )); return Status; + } else if (!SsdtCpuTopoPresent) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "ERROR: PPTT: The 'ACPI Processor ID valid' flag is for a non-leaf node, " \ + "but no SSDT CPU TOPOLOGY table will be installed, " \ + "Token = %p. Status = %r\n", + ProcInfoNode->Token, + Status + )); + return Status; } // Node is a ProcContainer with a valid ID diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyGenerator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyGenerator.c index be91ec4f473d..311010b97751 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyGenerator.c +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyGenerator.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -923,11 +924,14 @@ CheckProcNode ( BOOLEAN IsLeaf, CM_OBJECT_TOKEN NodeToken, CM_OBJECT_TOKEN ParentNodeToken, - BOOLEAN PackageNodeSeen + BOOLEAN PackageNodeSeen, + BOOLEAN PpttTablePresent ) { BOOLEAN InvalidFlags; BOOLEAN HasPhysicalPackageBit; + UINT32 CheckMask; + UINT32 ExpectedMask; HasPhysicalPackageBit = (NodeFlags & EFI_ACPI_6_3_PPTT_PACKAGE_PHYSICAL) == EFI_ACPI_6_3_PPTT_PACKAGE_PHYSICAL; @@ -935,13 +939,31 @@ CheckProcNode ( // Only one Physical Package flag is allowed in the hierarchy InvalidFlags = HasPhysicalPackageBit && PackageNodeSeen; - // Check Leaf specific flags. + CheckMask = 0; + ExpectedMask = 0; + + // Leaves must also have the VALID bit set. if (IsLeaf) { - InvalidFlags |= ((NodeFlags & PPTT_LEAF_MASK) != PPTT_LEAF_MASK); - // Must have Physical Package flag somewhere in the hierarchy - InvalidFlags |= !(HasPhysicalPackageBit || PackageNodeSeen); + ExpectedMask = (PPTT_LEAF_FLAG_MASK | PPTT_VALID_FLAG_MASK); + CheckMask = (PPTT_LEAF_FLAG_MASK | PPTT_VALID_FLAG_MASK); } else { - InvalidFlags |= ((NodeFlags & PPTT_LEAF_MASK) != 0); + if (PpttTablePresent) { + // If the PPTT table is present, all proc. container nodes will have + // a valid _UID built. + ExpectedMask = PPTT_VALID_FLAG_MASK; + CheckMask = (PPTT_LEAF_FLAG_MASK | PPTT_VALID_FLAG_MASK); + } else { + // If there is no PPTT table, the state of the VALID bit is ignored. + ExpectedMask = 0; + CheckMask = PPTT_LEAF_FLAG_MASK; + } + } + + // Check the flags. + InvalidFlags |= (((NodeFlags ^ ExpectedMask) & CheckMask) != 0); + + if (IsLeaf) { + InvalidFlags |= !(HasPhysicalPackageBit || PackageNodeSeen); } if (InvalidFlags) { @@ -968,6 +990,8 @@ CheckProcNode ( @param [in] ParentNode Parent node to attach the created node to. @param [in] PackageNodeSeen A parent of the ProcNode has the physical package flag set. + @param [in] PpttTablePresent The PPTT table will be installed. + @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER Invalid parameter. @@ -981,7 +1005,8 @@ CreateAmlCpuTopologyTree ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, IN CM_OBJECT_TOKEN NodeToken, IN AML_NODE_HANDLE ParentNode, - IN BOOLEAN PackageNodeSeen + IN BOOLEAN PackageNodeSeen, + IN BOOLEAN PpttTablePresent ) { EFI_STATUS Status; @@ -1015,7 +1040,8 @@ CreateAmlCpuTopologyTree ( TRUE, Generator->ProcNodeList[Index].Token, NodeToken, - PackageNodeSeen + PackageNodeSeen, + PpttTablePresent ); if (EFI_ERROR (Status)) { ASSERT (0); @@ -1050,7 +1076,8 @@ CreateAmlCpuTopologyTree ( FALSE, Generator->ProcNodeList[Index].Token, NodeToken, - PackageNodeSeen + PackageNodeSeen, + PpttTablePresent ); if (EFI_ERROR (Status)) { ASSERT (0); @@ -1117,7 +1144,8 @@ CreateAmlCpuTopologyTree ( CfgMgrProtocol, Generator->ProcNodeList[Index].Token, ProcContainerNode, - (PackageNodeSeen || HasPhysicalPackageBit) + (PackageNodeSeen || HasPhysicalPackageBit), + PpttTablePresent ); if (EFI_ERROR (Status)) { ASSERT (0); @@ -1170,7 +1198,8 @@ CreateTopologyFromProcHierarchy ( CfgMgrProtocol, CM_NULL_TOKEN, ScopeNode, - FALSE + FALSE, + CheckAcpiTablePresent (CfgMgrProtocol, EStdAcpiTableIdPptt) ); if (EFI_ERROR (Status)) { ASSERT (0); diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyGenerator.h b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyGenerator.h index f5415f9fd997..d61887c2df45 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyGenerator.h +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyGenerator.h @@ -41,9 +41,11 @@ (EFI_ACPI_6_3_PPTT_PROCESSOR_ID_INVALID << 1) | \ (EFI_ACPI_6_3_PPTT_NODE_IS_NOT_LEAF << 3)) -// Leaf nodes specific mask. -#define PPTT_LEAF_MASK ((EFI_ACPI_6_3_PPTT_PROCESSOR_ID_VALID << 1) | \ - (EFI_ACPI_6_3_PPTT_NODE_IS_LEAF << 3)) +// Mask for the VALID flag. +#define PPTT_VALID_FLAG_MASK (EFI_ACPI_6_3_PPTT_PROCESSOR_ID_VALID << 1) + +// Mask for the LEAF flag. +#define PPTT_LEAF_FLAG_MASK (EFI_ACPI_6_3_PPTT_NODE_IS_LEAF << 3) /** LPI states are stored in the ASL namespace at '\_SB_.Lxxx', with xxx being the node index of the LPI state. diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf index 6150217922ed..fe0be2362ceb 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf @@ -39,4 +39,5 @@ AcpiHelperLib AmlLib BaseLib + CmObjHelperLib MetadataHandlerLib From 317ef447473a3c8e3e1bc280906779259739e580 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Tue, 15 Apr 2025 16:47:25 +0200 Subject: [PATCH 0031/1172] DynamicTablesPkg: Rework ProximityDomain handling The SRAT/HMAT/SLIT tables describe the relations between ProximityDomain IDs. These proximity domains might represent memory domains, CPUs, IO, etc. ProximityDomain IDs are mere IDs. They don't represent anything and could be generated by the DynamicTablesPkg framework. These IDs are currently hard-coded by the ConfigurationManager developer. In order to: - avoid the developer to keep track of the used ProximityDomain IDs - have a better internal representation of the relation between CPUs sharing the same ProximityDomain ID allow the developer to use Tokens pointing to ProximityDomain structures. Signed-off-by: Pierre Gondois --- .../Include/ArchCommonNameSpaceObjects.h | 20 ++++++++-- .../Include/ArmNameSpaceObjects.h | 30 ++++++++++++-- .../Include/X64NameSpaceObjects.h | 12 ++++++ .../ConfigurationManagerObjectParser.c | 40 +++++++++++-------- 4 files changed, 79 insertions(+), 23 deletions(-) diff --git a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h index 464c595ac442..7638b9305671 100644 --- a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h +++ b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h @@ -262,16 +262,22 @@ typedef struct CmArchCommonPciInterruptMapInfo { */ typedef struct CmArchCommonMemoryAffinityInfo { /// The proximity domain to which the "range of memory" belongs. - UINT32 ProximityDomain; + UINT32 ProximityDomain; /// Base Address - UINT64 BaseAddress; + UINT64 BaseAddress; /// Length - UINT64 Length; + UINT64 Length; /// Flags - UINT32 Flags; + UINT32 Flags; + + /** Optional field: Reference Token to the ProximityDomain this object + belongs to. If set to CM_NULL_TOKEN, the following field is used: + CM_ARCH_COMMON_MEMORY_AFFINITY_INFO.ProximityDomain + */ + CM_OBJECT_TOKEN ProximityDomainToken; } CM_ARCH_COMMON_MEMORY_AFFINITY_INFO; /** A structure that describes the ACPI Device Handle (Type 0) in the @@ -322,6 +328,12 @@ typedef struct CmArchCommonGenericInitiatorAffinityInfo { /// Reference Token for the Device Handle CM_OBJECT_TOKEN DeviceHandleToken; + + /** Optional field: Reference Token to the ProximityDomain this object + belongs to. If set to CM_NULL_TOKEN, the following field is used: + CM_ARCH_COMMON_GENERIC_INITIATOR_AFFINITY_INFO.ProximityDomain + */ + CM_OBJECT_TOKEN ProximityDomainToken; } CM_ARCH_COMMON_GENERIC_INITIATOR_AFFINITY_INFO; /** A structure that describes the Lpi information. diff --git a/DynamicTablesPkg/Include/ArmNameSpaceObjects.h b/DynamicTablesPkg/Include/ArmNameSpaceObjects.h index 958c3dc93cd3..e4f9d96300f7 100644 --- a/DynamicTablesPkg/Include/ArmNameSpaceObjects.h +++ b/DynamicTablesPkg/Include/ArmNameSpaceObjects.h @@ -190,6 +190,18 @@ typedef struct CmArmGicCInfo { i.e. a token referencing a CM_ARCH_COMMON_PSD_INFO object. */ CM_OBJECT_TOKEN PsdToken; + + /** Optional field: Reference Token to the ProximityDomain this object + belongs to. If set to CM_NULL_TOKEN, the following field is used: + CM_ARM_GICC_INFO.ProximityDomain + */ + CM_OBJECT_TOKEN ProximityDomainToken; + + /** Optional field: Reference Token to the ClockDomain this object belongs to. + belongs to. If set to CM_NULL_TOKEN, the following field is used: + CM_ARM_GICC_INFO.ClockDomain + */ + CM_OBJECT_TOKEN ClockDomainToken; } CM_ARM_GICC_INFO; /** A structure that describes the @@ -261,16 +273,22 @@ typedef struct CmArmGicRedistInfo { */ typedef struct CmArmGicItsInfo { /// The GIC ITS ID - UINT32 GicItsId; + UINT32 GicItsId; /// The physical address for the Interrupt Translation Service - UINT64 PhysicalBaseAddress; + UINT64 PhysicalBaseAddress; /** The proximity domain to which the logical processor belongs. This field is used to populate the GIC ITS affinity structure in the SRAT table. */ - UINT32 ProximityDomain; + UINT32 ProximityDomain; + + /** Optional field: Reference Token to the ProximityDomain this object + belongs to. If this field is used, the following field is ignored: + CM_ARM_GIC_ITS_INFO.ProximityDomain + */ + CM_OBJECT_TOKEN ProximityDomainToken; } CM_ARM_GIC_ITS_INFO; /** A structure that describes the @@ -559,6 +577,12 @@ typedef struct CmArmSmmuV3Node { /// Unique identifier for this node. UINT32 Identifier; + + /** Optional field: Reference Token to the ProximityDomain this object + belongs to. If set to CM_NULL_TOKEN, the following field is used: + CM_ARM_SMMUV3_NODE.ProximityDomain + */ + CM_OBJECT_TOKEN ProximityDomainToken; } CM_ARM_SMMUV3_NODE; /** A structure that describes the diff --git a/DynamicTablesPkg/Include/X64NameSpaceObjects.h b/DynamicTablesPkg/Include/X64NameSpaceObjects.h index 1e10e3f28df8..d47716a0d4c6 100644 --- a/DynamicTablesPkg/Include/X64NameSpaceObjects.h +++ b/DynamicTablesPkg/Include/X64NameSpaceObjects.h @@ -333,6 +333,18 @@ typedef struct CmX64LocalApicX2ApicAffinityInfo { UINT32 ProximityDomain; UINT32 Flags; UINT32 ClockDomain; + + /** Optional field: Reference Token to the ProximityDomain this object + belongs to. If set to CM_NULL_TOKEN, the following field is used: + CM_X64_LOCAL_APIC_X2APIC_AFFINITY_INFO.ProximityDomain + */ + CM_OBJECT_TOKEN ProximityDomainToken; + + /** Optional field: Reference Token to the ProximityDomain this object + belongs to. If set to CM_NULL_TOKEN, the following field is used: + CM_X64_LOCAL_APIC_X2APIC_AFFINITY_INFO.ClockDomain + */ + CM_OBJECT_TOKEN ClockDomainToken; } CM_X64_LOCAL_APIC_X2APIC_AFFINITY_INFO; #pragma pack() diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c index 008ab1d080ec..551f7f8c86df 100644 --- a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c +++ b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c @@ -86,6 +86,8 @@ STATIC CONST CM_OBJ_PARSER CmArmGicCInfoParser[] = { { "TRBEInterrupt", 2, "0x%x", NULL }, { "EtToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, { "PsdToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, + { "ProximityDomainToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, + { "ClockDomainToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, }; /** A parser for EArmObjGicDInfo. @@ -116,9 +118,10 @@ STATIC CONST CM_OBJ_PARSER CmArmGicRedistInfoParser[] = { /** A parser for EArmObjGicItsInfo. */ STATIC CONST CM_OBJ_PARSER CmArmGicItsInfoParser[] = { - { "GicItsId", 4, "0x%x", NULL }, - { "PhysicalBaseAddress", 8, "0x%llx", NULL }, - { "ProximityDomain", 4, "0x%x", NULL } + { "GicItsId", 4, "0x%x", NULL }, + { "PhysicalBaseAddress", 8, "0x%llx", NULL }, + { "ProximityDomain", 4, "0x%x", NULL }, + { "ProximityDomainToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, }; /** A parser for EArchCommonObjConsolePortInfo, @@ -283,6 +286,7 @@ STATIC CONST CM_OBJ_PARSER CmArmSmmuV3NodeParser[] = { { "ProximityDomain", 4, "0x%x", NULL }, { "DeviceIdMappingIndex", 4, "0x%x", NULL }, { "Identifier", 4, "0x%x", NULL }, + { "ProximityDomainToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, }; /** A parser for EArmObjPmcg. @@ -358,10 +362,11 @@ STATIC CONST CM_OBJ_PARSER CmArchCommonObjRefParser[] = { /** A parser for EArchCommonObjMemoryAffinityInfo. */ STATIC CONST CM_OBJ_PARSER CmArchCommonMemoryAffinityInfoParser[] = { - { "ProximityDomain", 4, "0x%x", NULL }, - { "BaseAddress", 8, "0x%llx", NULL }, - { "Length", 8, "0x%llx", NULL }, - { "Flags", 4, "0x%x", NULL } + { "ProximityDomain", 4, "0x%x", NULL }, + { "BaseAddress", 8, "0x%llx", NULL }, + { "Length", 8, "0x%llx", NULL }, + { "Flags", 4, "0x%x", NULL }, + { "ProximityDomainToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, }; /** A parser for EArchCommonObjDeviceHandleAcpi. @@ -383,10 +388,11 @@ STATIC CONST CM_OBJ_PARSER CmArchCommonDeviceHandlePciParser[] = { /** A parser for EArchCommonObjGenericInitiatorAffinityInfo. */ STATIC CONST CM_OBJ_PARSER CmArchCommonGenericInitiatorAffinityInfoParser[] = { - { "ProximityDomain", 4, "0x%x", NULL }, - { "Flags", 4, "0x%x", NULL }, - { "DeviceHandleType", 1, "0x%x", NULL }, - { "DeviceHandleToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL } + { "ProximityDomain", 4, "0x%x", NULL }, + { "Flags", 4, "0x%x", NULL }, + { "DeviceHandleType", 1, "0x%x", NULL }, + { "DeviceHandleToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, + { "ProximityDomainToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, }; /** A parser for EArmObjCmn600Info. @@ -1081,11 +1087,13 @@ STATIC CONST CM_OBJ_PARSER CmX64ObjFacsInfoParser[] = { /** A parser for CmX64LocalApicX2ApicAffinityInfo. */ STATIC CONST CM_OBJ_PARSER CmX64LocalApicX2ApicAffinityInfo[] = { - { "ApicMode", sizeof (LOCAL_APIC_MODE), "0x%x", NULL }, - { "ApicId", 4, "0x%x", NULL }, - { "ProximityDomain", 4, "0x%x", NULL }, - { "Flags", 4, "0x%x", NULL }, - { "ClockDomain", 4, "0x%x", NULL } + { "ApicMode", sizeof (LOCAL_APIC_MODE), "0x%x", NULL }, + { "ApicId", 4, "0x%x", NULL }, + { "ProximityDomain", 4, "0x%x", NULL }, + { "Flags", 4, "0x%x", NULL }, + { "ClockDomain", 4, "0x%x", NULL }, + { "ProximityDomainToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, + { "ClockDomainToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, }; /** A parser for X64 namespace objects. From 52531b20d6118ba248add53bc78cc4e877f43a16 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Tue, 15 Apr 2025 16:47:36 +0200 Subject: [PATCH 0032/1172] DynamicTablesPkg: Add HMAT/SLIT related objects Add the following objects: - EArchCommonObjProxDomainInfo - EArchCommonObjProxDomainRelationInfo - EArchCommonObjSystemLocalityInfo - EArchCommonObjMemoryProxDomainAttrInfo - EArchCommonObjMemoryLatBwInfo - EArchCommonObjMemoryCacheInfo allowing to generate HMAT/SLIT tables. Signed-off-by: Pierre Gondois --- .../Include/ArchCommonNameSpaceObjects.h | 129 ++++++++++++++++++ .../ConfigurationManagerObjectParser.c | 129 ++++++++++++------ 2 files changed, 220 insertions(+), 38 deletions(-) diff --git a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h index 7638b9305671..2e0b5ee3884c 100644 --- a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h +++ b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h @@ -64,6 +64,12 @@ typedef enum ArchCommonObjectID { EArchCommonObjGenericDbg2DeviceInfo, ///< 36 - Generic DBG2 Device Info EArchCommonObjCxlHostBridgeInfo, ///< 37 - CXL Host Bridge Info EArchCommonObjCxlFixedMemoryWindowInfo, ///< 38 - CXL Fixed Memory Window Info + EArchCommonObjProximityDomainInfo, ///< 39 - Proximity Domain Info + EArchCommonObjProximityDomainRelationInfo, ///< 40 - Proximity Domain Relation Info + EArchCommonObjSystemLocalityInfo, ///< 41 - System Locality Info + EArchCommonObjMemoryProximityDomainAttrInfo, ///< 42 - Memory Proximity Domain Attribute + EArchCommonObjMemoryLatBwInfo, ///< 43 - Memory Latency Bandwidth Info + EArchCommonObjMemoryCacheInfo, ///< 44 - Memory Cache Info EArchCommonObjMax } EARCH_COMMON_OBJECT_ID; @@ -919,6 +925,129 @@ typedef struct CmArchCommonCxlFixedMemoryWindowInfo { CM_OBJECT_TOKEN InterleaveTargetTokens[CFMWS_MAX_INTERLEAVE_WAYS]; } CM_ARCH_COMMON_CXL_FIXED_MEMORY_WINDOW_INFO; +/** A structure that describes a proximity domain. + + ID: EArchCommonObjProximityDomainInfo +*/ +typedef struct CmArchCommonProximityDomainInfo { + /// GenerateDomainId + /// - TRUE if the DynamicTablesPkg framework should generate DomainId values. + /// - FALSE if CM_ARCH_COMMON_PROXIMITY_DOMAIN_INFO.DomainId should be used instead. + /// If GenerateDomainId is FALSE, user supplied DomainId values should be used. + /// Note: It is the user's responsibility to ensure that the DomainId values + /// are unique. + BOOLEAN GenerateDomainId; + + /// DomainId. + /// Generators will use this DomainId if GenerateDomainId=FALSE. + UINT32 DomainId; +} CM_ARCH_COMMON_PROXIMITY_DOMAIN_INFO; + +/** A structure that describes a relation between two proximity domains. + + ID: EArchCommonObjProximityDomainRelationInfo +*/ +typedef struct CmArchCommonProximityDomainRelationInfo { + /// First Domain Id Token. + /// Token referencing a CM_ARCH_COMMON_PROXIMITY_DOMAIN_INFO. + /// + /// For the HMAT sub-table of type 1 - + /// System Locality Latency and Bandwidth Information Structure + /// the First Domain is an Initiator Domain. + CM_OBJECT_TOKEN FirstDomainToken; + + /// Second Domain Id Token. + /// Token referencing a CM_ARCH_COMMON_PROXIMITY_DOMAIN_INFO. + /// + /// For the HMAT sub-table of type 1 - + /// System Locality Latency and Bandwidth Information Structure + /// the Second Domain is a Target Domain. + CM_OBJECT_TOKEN SecondDomainToken; + + /// Relation. + /// The meaning of this field depends on the object referencing this struct. + /// This could be a bandwidth, latency, relative distance (SLIT)... + UINT64 Relation; +} CM_ARCH_COMMON_PROXIMITY_DOMAIN_RELATION_INFO; + +/** A structure that describes a relation between two proximity domains. + + ID: EArchCommonObjSystemLocalityInfo +*/ +typedef struct CmArchCommonSystemLocalityInfo { + /// Array of relative distances. + /// Token identifying an array of CM_ARCH_COMMON_DOMAIN_RELATION. + /// + /// If a relative distance between two domains is not provided, + /// the default value used is: + /// - 10 for the distance between a domain and itself, cf. the normalized + /// distance in the spec. + /// - 0xFF otherwise, i.e. the domains are unreachable from each other. + /// Relative distances must be > 10 for two different domains. + CM_OBJECT_TOKEN RelativeDistanceArray; +} CM_ARCH_COMMON_SYSTEM_LOCALITY_INFO; + +/** A structure that describes the Memory Proximity Domain Attribute. + + ID: EArchCommonObjMemoryProximityDomainAttrInfo +*/ +typedef struct CmArchCommonMemoryProximityDomainAttrInfo { + /// Flags + UINT16 Flags; + + /// Token referencing an Initiator Proximity Domain + /// I.e. a CM_ARCH_COMMON_PROXIMITY_DOMAIN_INFO + CM_OBJECT_TOKEN InitiatorProximityDomain; + + /// Token referencing an Memory Proximity Domain + /// I.e. a CM_ARCH_COMMON_PROXIMITY_DOMAIN_INFO + CM_OBJECT_TOKEN MemoryProximityDomain; +} CM_ARCH_COMMON_MEMORY_PROXIMITY_DOMAIN_ATTR_INFO; + +/** A structure that describes the Memory Latency Bandwidth Info. + + ID: EArchCommonObjMemoryLatBwInfo +*/ +typedef struct CmArchCommonMemoryLatBwInfo { + /// Flags + UINT8 Flags; + + /// Data Type + UINT8 DataType; + + /// Minimum Transfer Type + UINT8 MinTransferSize; + + /// Entry Base Unit + UINT64 EntryBaseUnit; + + /// Token referencing an array of CM_ARCH_COMMON_DOMAIN_RELATION_INFO + /// From this array, it is possible to retrieve: + /// - the number and Ids of the initiator domains + /// - the number and Ids of the target domains + /// - the latency/bandwidth between each domain + CM_OBJECT_TOKEN RelativeDistanceArray; +} CM_ARCH_COMMON_MEMORY_LAT_BW_INFO; + +/** A structure that describes the Memory Cache Info. + + ID: EArchCommonObjMemoryCacheInfo +*/ +typedef struct CmArchCommonMemoryCacheInfo { + /// Token referencing a memory proximity domain. + CM_OBJECT_TOKEN MemoryProximityDomain; + + /// Memory side cache size. + UINT64 MemorySideCacheSize; + + /// Cache attributes. + UINT32 CacheAttributes; + + /// @todo It is not possible to generate Smbios tables yet. + /// @todo Referencing Smbios tables is not possible for now, + /// @todo but will be in a near future. +} CM_ARCH_COMMON_MEMORY_CACHE_INFO; + #pragma pack() #endif // ARCH_COMMON_NAMESPACE_OBJECTS_H_ diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c index 551f7f8c86df..c61caf80bd68 100644 --- a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c +++ b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c @@ -827,48 +827,101 @@ STATIC CONST CM_OBJ_PARSER CmArchCommonObjCxlFixedMemoryWindowInfo[] = { ARRAY_SIZE (CmArchCommonObjInterleaveTargetTokenParser) }, }; +/** A parser for EArchCommonObjProximityDomainInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArchCommonProximityDomainInfo[] = { + { "GenerateDomainId", 1, "%d", NULL }, + { "DomainId", 4, "%d", NULL,}, +}; + +/** A parser for EArchCommonObjProximityDomainRelationInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArchCommonProximityDomainRelationInfo[] = { + { "FirstDomainToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, + { "SecondDomainToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, + { "Relation", 8, "0x%lld", NULL }, +}; + +/** A parser for EArchCommonObjSystemLocalityInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArchCommonSystemLocalityInfo[] = { + { "RelativeDistanceArray", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, +}; + +/** A parser for EArchCommonObjMemoryProximityDomainAttrInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArchCommonMemoryProximityDomainAttrInfo[] = { + { "Flags", 2, "0x%x", NULL }, + { "InitiatorProximityDomain", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, + { "MemoryProximityDomain", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, +}; + +/** A parser for EArchCommonObjMemoryLatBwInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArchCommonMemoryLatBwInfo[] = { + { "Flags", 1, "0x%x", NULL }, + { "DataType", 1, "%d", NULL }, + { "MinTransferSize", 1, "%d", NULL }, + { "EntryBaseUnit", 8, "%lld", NULL }, + { "RelativeDistanceArray", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, +}; + +/** A parser for EArchCommonObjMemoryCacheInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArchCommonMemoryCacheInfo[] = { + { "MemoryProximityDomain", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, + { "MemorySideCacheSize", 8, "0x%lx", NULL }, + { "CacheAttributes", 4, "0x%x", NULL,}, +}; + /** A parser for Arch Common namespace objects. */ STATIC CONST CM_OBJ_PARSER_ARRAY ArchCommonNamespaceObjectParser[] = { CM_PARSER_ADD_OBJECT_RESERVED (EArchCommonObjReserved), - CM_PARSER_ADD_OBJECT (EArchCommonObjPowerManagementProfileInfo, CmArchCommonPowerManagementProfileInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjSerialPortInfo, CmArchCommonSerialPortInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjConsolePortInfo, CmArchCommonSerialPortInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjSerialDebugPortInfo, CmArchCommonSerialPortInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjHypervisorVendorIdentity, CmArchCommonHypervisorVendorIdentityParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjFixedFeatureFlags, CmArchCommonFixedFeatureFlagsParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjCmRef, CmArchCommonObjRefParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjPciConfigSpaceInfo, CmArchCommonPciConfigSpaceInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjPciAddressMapInfo, CmArchCommonPciAddressMapInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjPciInterruptMapInfo, CmArchCommonPciInterruptMapInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjMemoryAffinityInfo, CmArchCommonMemoryAffinityInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjDeviceHandleAcpi, CmArchCommonDeviceHandleAcpiParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjDeviceHandlePci, CmArchCommonDeviceHandlePciParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjGenericInitiatorAffinityInfo,CmArchCommonGenericInitiatorAffinityInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjLpiInfo, CmArchCommonLpiInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjProcHierarchyInfo, CmArchCommonProcHierarchyInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjCacheInfo, CmArchCommonCacheInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjCpcInfo, CmArchCommonCpcInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjPccSubspaceType0Info, CmArchCommonPccSubspaceType0InfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjPccSubspaceType1Info, CmArchCommonPccSubspaceType1InfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjPccSubspaceType2Info, CmArchCommonPccSubspaceType2InfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjPccSubspaceType3Info, CmArchCommonPccSubspaceType34InfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjPccSubspaceType4Info, CmArchCommonPccSubspaceType34InfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjPccSubspaceType5Info, CmArchCommonPccSubspaceType5InfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjPsdInfo, CmArchCommonPsdInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjTpm2InterfaceInfo, CmArchCommonTpm2InterfaceInfo), - CM_PARSER_ADD_OBJECT (EArchCommonObjSpmiInterfaceInfo, CmArchCommonSpmiInterfaceInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjSpmiInterruptDeviceInfo, CmArchCommonSpmiInterruptDeviceInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjCstInfo, CmArchCommonCstInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjCsdInfo, CmArchCommonCsdInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjPctInfo, CmArchCommonPctInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjPssInfo, CmArchCommonPssInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjPpcInfo, CmArchCommonPpcInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjStaInfo, CmArchCommonStaInfoParser), - CM_PARSER_ADD_OBJECT (EArchCommonObjMemoryRangeDescriptor, CmArchCommonObjMemoryRangeDescriptor), - CM_PARSER_ADD_OBJECT (EArchCommonObjGenericDbg2DeviceInfo, CmArchCommonObjDbg2DeviceInfo), - CM_PARSER_ADD_OBJECT (EArchCommonObjCxlHostBridgeInfo, CmArchCommonObjCxlHostBridgeInfo), - CM_PARSER_ADD_OBJECT (EArchCommonObjCxlFixedMemoryWindowInfo, CmArchCommonObjCxlFixedMemoryWindowInfo), + CM_PARSER_ADD_OBJECT (EArchCommonObjPowerManagementProfileInfo, CmArchCommonPowerManagementProfileInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjSerialPortInfo, CmArchCommonSerialPortInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjConsolePortInfo, CmArchCommonSerialPortInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjSerialDebugPortInfo, CmArchCommonSerialPortInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjHypervisorVendorIdentity, CmArchCommonHypervisorVendorIdentityParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjFixedFeatureFlags, CmArchCommonFixedFeatureFlagsParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjCmRef, CmArchCommonObjRefParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjPciConfigSpaceInfo, CmArchCommonPciConfigSpaceInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjPciAddressMapInfo, CmArchCommonPciAddressMapInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjPciInterruptMapInfo, CmArchCommonPciInterruptMapInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjMemoryAffinityInfo, CmArchCommonMemoryAffinityInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjDeviceHandleAcpi, CmArchCommonDeviceHandleAcpiParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjDeviceHandlePci, CmArchCommonDeviceHandlePciParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjGenericInitiatorAffinityInfo, CmArchCommonGenericInitiatorAffinityInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjLpiInfo, CmArchCommonLpiInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjProcHierarchyInfo, CmArchCommonProcHierarchyInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjCacheInfo, CmArchCommonCacheInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjCpcInfo, CmArchCommonCpcInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjPccSubspaceType0Info, CmArchCommonPccSubspaceType0InfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjPccSubspaceType1Info, CmArchCommonPccSubspaceType1InfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjPccSubspaceType2Info, CmArchCommonPccSubspaceType2InfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjPccSubspaceType3Info, CmArchCommonPccSubspaceType34InfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjPccSubspaceType4Info, CmArchCommonPccSubspaceType34InfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjPccSubspaceType5Info, CmArchCommonPccSubspaceType5InfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjPsdInfo, CmArchCommonPsdInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjTpm2InterfaceInfo, CmArchCommonTpm2InterfaceInfo), + CM_PARSER_ADD_OBJECT (EArchCommonObjSpmiInterfaceInfo, CmArchCommonSpmiInterfaceInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjSpmiInterruptDeviceInfo, CmArchCommonSpmiInterruptDeviceInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjCstInfo, CmArchCommonCstInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjCsdInfo, CmArchCommonCsdInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjPctInfo, CmArchCommonPctInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjPssInfo, CmArchCommonPssInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjPpcInfo, CmArchCommonPpcInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjStaInfo, CmArchCommonStaInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjMemoryRangeDescriptor, CmArchCommonObjMemoryRangeDescriptor), + CM_PARSER_ADD_OBJECT (EArchCommonObjGenericDbg2DeviceInfo, CmArchCommonObjDbg2DeviceInfo), + CM_PARSER_ADD_OBJECT (EArchCommonObjCxlHostBridgeInfo, CmArchCommonObjCxlHostBridgeInfo), + CM_PARSER_ADD_OBJECT (EArchCommonObjCxlFixedMemoryWindowInfo, CmArchCommonObjCxlFixedMemoryWindowInfo), + CM_PARSER_ADD_OBJECT (EArchCommonObjProximityDomainInfo, CmArchCommonProximityDomainInfo), + CM_PARSER_ADD_OBJECT (EArchCommonObjProximityDomainRelationInfo, CmArchCommonProximityDomainRelationInfo), + CM_PARSER_ADD_OBJECT (EArchCommonObjSystemLocalityInfo, CmArchCommonSystemLocalityInfo), + CM_PARSER_ADD_OBJECT (EArchCommonObjMemoryProximityDomainAttrInfo,CmArchCommonMemoryProximityDomainAttrInfo), + CM_PARSER_ADD_OBJECT (EArchCommonObjMemoryLatBwInfo, CmArchCommonMemoryLatBwInfo), + CM_PARSER_ADD_OBJECT (EArchCommonObjMemoryCacheInfo, CmArchCommonMemoryCacheInfo), CM_PARSER_ADD_OBJECT_RESERVED (EArchCommonObjMax) }; From 2ccdb29f9a5c9a69384e6b1ca5f87f85a50e72e8 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 28 May 2025 10:37:27 +0200 Subject: [PATCH 0033/1172] DynamicTablesPkg: Add GetProximityDomainId() to CmObjHelperLib Proximity domains Ids should now be described using the CM_ARCH_COMMON_PROXIMITY_DOMAIN_INFO object. This adds a level of indirection: a Token allows to retrieve a CM_ARCH_COMMON_PROXIMITY_DOMAIN_INFO object, and this object might either have a hard-coded Id, or rely on the MetadataObjLib to generate an Id. Add a GetProximityDomainId () function to the CmObjHelperLib to factorize this level of abstraction and allow other generators to re-use the logic. Signed-off-by: Pierre Gondois --- .../Include/Library/CmObjHelperLib.h | 31 +++++ .../Common/CmObjHelperLib/CmObjHelperLib.c | 129 ++++++++++++++++++ 2 files changed, 160 insertions(+) diff --git a/DynamicTablesPkg/Include/Library/CmObjHelperLib.h b/DynamicTablesPkg/Include/Library/CmObjHelperLib.h index 9090bd857be9..96cc175965e2 100644 --- a/DynamicTablesPkg/Include/Library/CmObjHelperLib.h +++ b/DynamicTablesPkg/Include/Library/CmObjHelperLib.h @@ -24,4 +24,35 @@ CheckAcpiTablePresent ( IN ESTD_ACPI_TABLE_ID AcpiTableId ); +/** Get a Proximity Domain Id. + + Proximity Domain Id are now to be placed in + CM_ARCH_COMMON_PROXIMITY_DOMAIN_INFO objects rather than in the various + CmObj using them. This function handles the logic in the selection + of the ProximityDomainId to use. + + Proximity Domain Id should be preferably placed in + CM_ARCH_COMMON_PROXIMITY_DOMAIN_INFO objects now. + + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] DefaultDomainId Default per-CmObj Proximity Domain Id. + The CM_ARCH_COMMON_PROXIMITY_DOMAIN_INFO + should be preferably used. + @param [in] Token Token referencing a + CM_ARCH_COMMON_PROXIMITY_DOMAIN_INFO object. + @param [out] DomainId If Success, contains DomainId to use. + + @retval EFI_SUCCESS Table generated successfully. + @retval EFI_INVALID_PARAMETER The table pointer is NULL or invalid. +**/ +EFI_STATUS +EFIAPI +GetProximityDomainId ( + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CfgMgrProtocol, + IN UINT32 DefaultDomainId, + IN CM_OBJECT_TOKEN Token, + OUT UINT32 *DomainId + ); + #endif // CM_OBJ_HELPER_LIB_H_ diff --git a/DynamicTablesPkg/Library/Common/CmObjHelperLib/CmObjHelperLib.c b/DynamicTablesPkg/Library/Common/CmObjHelperLib/CmObjHelperLib.c index 2ad7817082e2..3021db65ac03 100644 --- a/DynamicTablesPkg/Library/Common/CmObjHelperLib/CmObjHelperLib.c +++ b/DynamicTablesPkg/Library/Common/CmObjHelperLib/CmObjHelperLib.c @@ -26,6 +26,16 @@ GET_OBJECT_LIST ( CM_STD_OBJ_ACPI_TABLE_INFO ); +/** + This macro expands to a function that retrieves Proximity Domain + information from the Configuration Manager. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceArchCommon, + EArchCommonObjProximityDomainInfo, + CM_ARCH_COMMON_PROXIMITY_DOMAIN_INFO + ); + /** Check if an ACPI table is present in the Configuration manager's ACPI table list. @param [in] CfgMgrProtocol Pointer to the Configuration Manager @@ -68,3 +78,122 @@ CheckAcpiTablePresent ( return FALSE; } + +/** Get a Proximity Domain Id. + + Proximity Domain Id are now to be placed in + CM_ARCH_COMMON_PROXIMITY_DOMAIN_INFO objects rather than in the various + CmObj using them. This function handles the logic in the selection + of the ProximityDomainId to use. + + Proximity Domain Id should be preferably placed in + CM_ARCH_COMMON_PROXIMITY_DOMAIN_INFO objects now. + + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] DefaultDomainId Default per-CmObj Proximity Domain Id. + The CM_ARCH_COMMON_PROXIMITY_DOMAIN_INFO + should be preferably used. + @param [in] Token Token referencing a + CM_ARCH_COMMON_PROXIMITY_DOMAIN_INFO object. + @param [out] DomainId If Success, contains DomainId to use. + + @retval EFI_SUCCESS Table generated successfully. + @retval EFI_INVALID_PARAMETER The table pointer is NULL or invalid. +**/ +EFI_STATUS +EFIAPI +GetProximityDomainId ( + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CfgMgrProtocol, + IN UINT32 DefaultDomainId, + IN CM_OBJECT_TOKEN Token, + OUT UINT32 *DomainId + ) +{ + EFI_STATUS Status; + CM_ARCH_COMMON_PROXIMITY_DOMAIN_INFO *ProximityDomain; + METADATA_OBJ_PROXIMITY_DOMAIN Metadata; + + if ((CfgMgrProtocol == NULL) || + (DomainId == NULL)) + { + ASSERT (CfgMgrProtocol != NULL); + ASSERT (DomainId != NULL); + return EFI_INVALID_PARAMETER; + } + + if (Token != CM_NULL_TOKEN) { + Status = GetEArchCommonObjProximityDomainInfo ( + CfgMgrProtocol, + Token, + &ProximityDomain, + NULL + ); + } else { + // If CM_NULL_TOKEN, cannot found any Proximity Domain + Status = EFI_NOT_FOUND; + } + + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: CM_OBJ_HELPER_LIB: Failed to get Proximity Domain. Status=%r Token=%llx\n", + Status, + Token + )); + return Status; + } else if ((Status == EFI_SUCCESS) && (ProximityDomain->GenerateDomainId)) { + // A Proximity Domain was found and the Id must be generated. + Status = MetadataHandlerGenerate ( + GetMetadataRoot (), + MetadataTypeProximityDomain, + Token, + NULL, + &Metadata, + sizeof (METADATA_OBJ_PROXIMITY_DOMAIN) + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + *DomainId = Metadata.Id; + } else { + // A hard-coded DomainId is used. + + if (Status == EFI_NOT_FOUND) { + // No ProximityDomain CmObj was found. + // Use the default Id. + *DomainId = DefaultDomainId; + + DEBUG (( + DEBUG_WARN, + "CM_OBJ_HELPER_LIB: Proximity Domain Ids should be described using " + "the new EArchCommonObjProximityDomainInfo object. " + "The field currently used will be deprecated.\n" + )); + } else if (!ProximityDomain->GenerateDomainId) { + // A ProximityDomain CmObj was found, but generation is disabled. + // Use the Domain Id. + *DomainId = ProximityDomain->DomainId; + Metadata.Id = *DomainId; + + // Add the Domain Id to the Metadata database to check duplicated values. + Status = MetadataAdd ( + GetMetadataRoot (), + MetadataTypeProximityDomain, + Token, + &Metadata, + sizeof (METADATA_OBJ_PROXIMITY_DOMAIN) + ); + if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + } else { + ASSERT_EFI_ERROR (Status); + } + } + + return EFI_SUCCESS; +} From 5a00ea00e94c3bd6397bc43ee56e67cea789928b Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Thu, 24 Apr 2025 16:31:50 +0200 Subject: [PATCH 0034/1172] DynamicTablesPkg: AcpiSratLib: Handle new ProximityDomainInfo CmObj Following the addition of the CM_ARCH_COMMON_PROXIMITY_DOMAIN_INFO object, rework the Srat Generator. A Warning message is issued when the Original ProximityDomain fields are used. Signed-off-by: Pierre Gondois --- .../Acpi/Common/AcpiSratLib/AcpiSratLib.inf | 3 + .../Common/AcpiSratLib/Arm/ArmSratGenerator.c | 49 ++++++++-- .../Acpi/Common/AcpiSratLib/SratGenerator.c | 32 ++++++- .../Common/AcpiSratLib/X64/X64SratGenerator.c | 92 ++++++++++++++----- 4 files changed, 144 insertions(+), 32 deletions(-) diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf index e447a6ded039..ec2b4ce93507 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf @@ -35,3 +35,6 @@ [LibraryClasses] BaseLib + CmObjHelperLib + MetadataObjLib + MetadataHandlerLib diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/Arm/ArmSratGenerator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/Arm/ArmSratGenerator.c index 3d36b25e1840..b6798b0e7038 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/Arm/ArmSratGenerator.c +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/Arm/ArmSratGenerator.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -172,6 +173,7 @@ AddGICCAffinity ( IN EFI_ACPI_6_3_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER *CONST Srat ) { + EFI_STATUS Status; EFI_ACPI_6_3_GICC_AFFINITY_STRUCTURE *GicCAff; CM_ARM_GICC_INFO *GicCInfo; @@ -184,10 +186,30 @@ AddGICCAffinity ( GicCAff->Type = EFI_ACPI_6_3_GICC_AFFINITY; GicCAff->Length = sizeof (EFI_ACPI_6_3_GICC_AFFINITY_STRUCTURE); - GicCAff->ProximityDomain = GicCInfo->ProximityDomain; GicCAff->AcpiProcessorUid = GicCInfo->AcpiProcessorUid; GicCAff->Flags = GicCInfo->AffinityFlags; - GicCAff->ClockDomain = GicCInfo->ClockDomain; + + Status = GetProximityDomainId ( + CfgMgrProtocol, + GicCInfo->ProximityDomain, + GicCInfo->ProximityDomainToken, + &GicCAff->ProximityDomain + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return; + } + + Status = GetProximityDomainId ( + CfgMgrProtocol, + GicCInfo->ClockDomain, + GicCInfo->ClockDomainToken, + &GicCAff->ClockDomain + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return; + } // Next GicCAff++; @@ -209,6 +231,7 @@ AddGICItsAffinity ( IN EFI_ACPI_6_3_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER *CONST Srat ) { + EFI_STATUS Status; EFI_ACPI_6_3_GIC_ITS_AFFINITY_STRUCTURE *GicItsAff; CM_ARM_GIC_ITS_INFO *GicItsInfo; @@ -219,12 +242,22 @@ AddGICItsAffinity ( while (mSratSubTable[EArmGicItsSubTableType].Count-- != 0) { DEBUG ((DEBUG_INFO, "SRAT: GicItsAff = 0x%p\n", GicItsAff)); - GicItsAff->Type = EFI_ACPI_6_3_GIC_ITS_AFFINITY; - GicItsAff->Length = sizeof (EFI_ACPI_6_3_GIC_ITS_AFFINITY_STRUCTURE); - GicItsAff->ProximityDomain = GicItsInfo->ProximityDomain; - GicItsAff->Reserved[0] = EFI_ACPI_RESERVED_BYTE; - GicItsAff->Reserved[1] = EFI_ACPI_RESERVED_BYTE; - GicItsAff->ItsId = GicItsInfo->GicItsId; + GicItsAff->Type = EFI_ACPI_6_3_GIC_ITS_AFFINITY; + GicItsAff->Length = sizeof (EFI_ACPI_6_3_GIC_ITS_AFFINITY_STRUCTURE); + GicItsAff->Reserved[0] = EFI_ACPI_RESERVED_BYTE; + GicItsAff->Reserved[1] = EFI_ACPI_RESERVED_BYTE; + GicItsAff->ItsId = GicItsInfo->GicItsId; + + Status = GetProximityDomainId ( + CfgMgrProtocol, + GicItsInfo->ProximityDomain, + GicItsInfo->ProximityDomainToken, + &GicItsAff->ProximityDomain + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return; + } // Next GicItsAff++; diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/SratGenerator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/SratGenerator.c index 95c439986f7d..672663b574da 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/SratGenerator.c +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/SratGenerator.c @@ -24,7 +24,10 @@ #include #include #include +#include +#include #include +#include #include #include "SratGenerator.h" @@ -126,7 +129,9 @@ AddMemoryAffinity ( IN UINT32 MemAffCount ) { + EFI_STATUS Status; EFI_ACPI_6_3_MEMORY_AFFINITY_STRUCTURE *MemAff; + UINT32 ProximityDomain; ASSERT (Srat != NULL); ASSERT (MemAffInfo != NULL); @@ -139,7 +144,6 @@ AddMemoryAffinity ( MemAff->Type = EFI_ACPI_6_3_MEMORY_AFFINITY; MemAff->Length = sizeof (EFI_ACPI_6_3_MEMORY_AFFINITY_STRUCTURE); - MemAff->ProximityDomain = MemAffInfo->ProximityDomain; MemAff->Reserved1 = EFI_ACPI_RESERVED_WORD; MemAff->AddressBaseLow = (UINT32)(MemAffInfo->BaseAddress & MAX_UINT32); MemAff->AddressBaseHigh = (UINT32)RShiftU64 (MemAffInfo->BaseAddress, 32); @@ -149,6 +153,20 @@ AddMemoryAffinity ( MemAff->Flags = MemAffInfo->Flags; MemAff->Reserved3 = EFI_ACPI_RESERVED_QWORD; + Status = GetProximityDomainId ( + CfgMgrProtocol, + MemAffInfo->ProximityDomain, + MemAffInfo->ProximityDomainToken, + &ProximityDomain + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + // Needed as the field is not 32-bits aligned. + MemAff->ProximityDomain = ProximityDomain; + // Next MemAff++; MemAffInfo++; @@ -206,7 +224,17 @@ AddGenericInitiatorAffinity ( sizeof (EFI_ACPI_6_3_GENERIC_INITIATOR_AFFINITY_STRUCTURE); GenInitAff->Reserved1 = EFI_ACPI_RESERVED_WORD; GenInitAff->DeviceHandleType = GenInitAffInfo->DeviceHandleType; - GenInitAff->ProximityDomain = GenInitAffInfo->ProximityDomain; + + Status = GetProximityDomainId ( + CfgMgrProtocol, + GenInitAffInfo->ProximityDomain, + GenInitAffInfo->ProximityDomainToken, + &GenInitAff->ProximityDomain + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } if (GenInitAffInfo->DeviceHandleToken == CM_NULL_TOKEN) { DEBUG (( diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/X64/X64SratGenerator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/X64/X64SratGenerator.c index e6ac60167288..194a89abd27b 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/X64/X64SratGenerator.c +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/X64/X64SratGenerator.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -184,6 +185,8 @@ AddArchObjects ( IN EFI_ACPI_6_3_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER *CONST Srat ) { + EFI_STATUS Status; + UINT32 ProximityDomain; CM_X64_LOCAL_APIC_X2APIC_AFFINITY_INFO *CmX2ApicAffinity; EFI_ACPI_6_3_PROCESSOR_LOCAL_APIC_SAPIC_AFFINITY_STRUCTURE *ApicAffinity; EFI_ACPI_6_3_PROCESSOR_LOCAL_X2APIC_AFFINITY_STRUCTURE *X2ApicAffinity; @@ -196,18 +199,39 @@ AddArchObjects ( ((UINT8 *)Srat + mSratSubTable[EX64LocalApicX2ApicAffinityTableType].Offset); while (mSratSubTable[EX64LocalApicX2ApicAffinityTableType].Count-- != 0) { - X2ApicAffinity->Type = EFI_ACPI_6_3_PROCESSOR_LOCAL_X2APIC_AFFINITY; - X2ApicAffinity->Length = sizeof (EFI_ACPI_6_3_PROCESSOR_LOCAL_X2APIC_AFFINITY_STRUCTURE); - X2ApicAffinity->Reserved1[0] = EFI_ACPI_RESERVED_BYTE; - X2ApicAffinity->Reserved1[1] = EFI_ACPI_RESERVED_BYTE; - X2ApicAffinity->ProximityDomain = CmX2ApicAffinity->ProximityDomain; - X2ApicAffinity->X2ApicId = CmX2ApicAffinity->ApicId; - X2ApicAffinity->Flags = CmX2ApicAffinity->Flags; - X2ApicAffinity->ClockDomain = CmX2ApicAffinity->ClockDomain; - X2ApicAffinity->Reserved2[0] = EFI_ACPI_RESERVED_BYTE; - X2ApicAffinity->Reserved2[1] = EFI_ACPI_RESERVED_BYTE; - X2ApicAffinity->Reserved2[2] = EFI_ACPI_RESERVED_BYTE; - X2ApicAffinity->Reserved2[3] = EFI_ACPI_RESERVED_BYTE; + X2ApicAffinity->Type = EFI_ACPI_6_3_PROCESSOR_LOCAL_X2APIC_AFFINITY; + X2ApicAffinity->Length = sizeof (EFI_ACPI_6_3_PROCESSOR_LOCAL_X2APIC_AFFINITY_STRUCTURE); + X2ApicAffinity->Reserved1[0] = EFI_ACPI_RESERVED_BYTE; + X2ApicAffinity->Reserved1[1] = EFI_ACPI_RESERVED_BYTE; + X2ApicAffinity->X2ApicId = CmX2ApicAffinity->ApicId; + X2ApicAffinity->Flags = CmX2ApicAffinity->Flags; + X2ApicAffinity->Reserved2[0] = EFI_ACPI_RESERVED_BYTE; + X2ApicAffinity->Reserved2[1] = EFI_ACPI_RESERVED_BYTE; + X2ApicAffinity->Reserved2[2] = EFI_ACPI_RESERVED_BYTE; + X2ApicAffinity->Reserved2[3] = EFI_ACPI_RESERVED_BYTE; + + Status = GetProximityDomainId ( + CfgMgrProtocol, + CmX2ApicAffinity->ProximityDomain, + CmX2ApicAffinity->ProximityDomainToken, + &X2ApicAffinity->ProximityDomain + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + Status = GetProximityDomainId ( + CfgMgrProtocol, + CmX2ApicAffinity->ClockDomain, + CmX2ApicAffinity->ClockDomainToken, + &X2ApicAffinity->ClockDomain + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + X2ApicAffinity++; // Next CmX2ApicAffinity++; @@ -217,16 +241,40 @@ AddArchObjects ( ((UINT8 *)Srat + mSratSubTable[EX64LocalApicX2ApicAffinityTableType].Offset); while (mSratSubTable[EX64LocalApicX2ApicAffinityTableType].Count-- != 0) { - ApicAffinity->Type = EFI_ACPI_6_3_PROCESSOR_LOCAL_APIC_SAPIC_AFFINITY; - ApicAffinity->Length = sizeof (EFI_ACPI_6_3_PROCESSOR_LOCAL_APIC_SAPIC_AFFINITY_STRUCTURE); - ApicAffinity->ProximityDomain7To0 = (CmX2ApicAffinity->ProximityDomain & MAX_UINT8); - ApicAffinity->ApicId = CmX2ApicAffinity->ApicId & MAX_UINT8; - ApicAffinity->Flags = CmX2ApicAffinity->Flags; - ApicAffinity->LocalSapicEid = 0; - ApicAffinity->ProximityDomain31To8[0] = (CmX2ApicAffinity->ProximityDomain >> 8) & MAX_UINT8; - ApicAffinity->ProximityDomain31To8[1] = (CmX2ApicAffinity->ProximityDomain >> 16) & MAX_UINT8; - ApicAffinity->ProximityDomain31To8[2] = (CmX2ApicAffinity->ProximityDomain >> 24) & MAX_UINT8; - ApicAffinity->ClockDomain = CmX2ApicAffinity->ClockDomain; + ApicAffinity->Type = EFI_ACPI_6_3_PROCESSOR_LOCAL_APIC_SAPIC_AFFINITY; + ApicAffinity->Length = sizeof (EFI_ACPI_6_3_PROCESSOR_LOCAL_APIC_SAPIC_AFFINITY_STRUCTURE); + ApicAffinity->ApicId = CmX2ApicAffinity->ApicId & MAX_UINT8; + ApicAffinity->Flags = CmX2ApicAffinity->Flags; + ApicAffinity->LocalSapicEid = 0; + ApicAffinity->ClockDomain = CmX2ApicAffinity->ClockDomain; + + Status = GetProximityDomainId ( + CfgMgrProtocol, + CmX2ApicAffinity->ProximityDomain, + CmX2ApicAffinity->ProximityDomainToken, + &ProximityDomain + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + ApicAffinity->ProximityDomain7To0 = (ProximityDomain & MAX_UINT8); + ApicAffinity->ProximityDomain31To8[0] = (ProximityDomain >> 8) & MAX_UINT8; + ApicAffinity->ProximityDomain31To8[1] = (ProximityDomain >> 16) & MAX_UINT8; + ApicAffinity->ProximityDomain31To8[2] = (ProximityDomain >> 24) & MAX_UINT8; + + Status = GetProximityDomainId ( + CfgMgrProtocol, + CmX2ApicAffinity->ClockDomain, + CmX2ApicAffinity->ClockDomainToken, + &ApicAffinity->ClockDomain + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + ApicAffinity++; CmX2ApicAffinity++; } // while From b0bc23d1f246dac977b639470a51bcef1bcd6e1d Mon Sep 17 00:00:00 2001 From: Aaron Young Date: Thu, 15 May 2025 09:54:00 -0700 Subject: [PATCH 0035/1172] UefiCpuPkg/MpInitLib: Fix split-lock violation from MP_CPU_EXCHANGE_INFO A split-lock violation in OVMF was discovered due to the NumApsExecuting field of the MP_CPU_EXCHANGE_INFO struct (which is used atomically by the AP Reset Vector assembly code) crossing a cacheline boundary. Since the MP_CPU_EXCHANGE_INFO struct is unaligned and the NumApsExecuting field resides after other non-UINTN aligned fields in the struct (i.e. GdtrProfile/IdtrProfile), the NumApsExecuting field was allocated at a non-UINTN aligned address (crossing a cache-line) resulting in the split-lock violation. Therefore, align the MP_CPU_EXCHANGE_INFO struct (on a UINTN boundary) and move the NumApsExecuting field to before the GdtrProfile/IdtrProfile fields to ensure it is UINTN aligned and thus resides within a single cacheline avoiding the split-lock. Do the same for the ApIndex field as it is also used atomically and thus subject to a split-lock violation. Cc: Ray Ni Cc: Jiaxin Wu Cc: Zhiguang Liu Cc: Dun Tan Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Star Zeng Signed-off-by: Aaron Young --- UefiCpuPkg/Library/MpInitLib/MpEqu.inc | 15 ++++++++++++--- UefiCpuPkg/Library/MpInitLib/MpLib.c | 15 ++++++++++----- UefiCpuPkg/Library/MpInitLib/MpLib.h | 9 +++++++-- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/MpEqu.inc b/UefiCpuPkg/Library/MpInitLib/MpEqu.inc index d8ba9ea1246c..7e4afbcaa5a2 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpEqu.inc +++ b/UefiCpuPkg/Library/MpInitLib/MpEqu.inc @@ -74,18 +74,18 @@ struc MP_CPU_EXCHANGE_INFO .StackStart: CTYPE_UINTN 1 .StackSize: CTYPE_UINTN 1 .CFunction: CTYPE_UINTN 1 + .NumApsExecuting: CTYPE_UINTN 1 + .ApIndex: CTYPE_UINTN 1 .GdtrProfile: CTYPE_UINT8 IA32_DESCRIPTOR_size .IdtrProfile: CTYPE_UINT8 IA32_DESCRIPTOR_size .BufferStart: CTYPE_UINTN 1 .ModeOffset: CTYPE_UINTN 1 - .ApIndex: CTYPE_UINTN 1 .CodeSegment: CTYPE_UINTN 1 .DataSegment: CTYPE_UINTN 1 .EnableExecuteDisable: CTYPE_UINTN 1 .Cr3: CTYPE_UINTN 1 .InitFlag: CTYPE_UINTN 1 .CpuInfo: CTYPE_UINTN 1 - .NumApsExecuting: CTYPE_UINTN 1 .CpuMpData: CTYPE_UINTN 1 .InitializeFloatingPointUnits: CTYPE_UINTN 1 .ModeTransitionMemory: CTYPE_UINT32 1 @@ -100,5 +100,14 @@ struc MP_CPU_EXCHANGE_INFO .SevSnpKnownInitApicId: CTYPE_BOOLEAN 1 endstruc -MP_CPU_EXCHANGE_INFO_OFFSET equ (Flat32Start - RendezvousFunnelProcStart) +; +; Declare a UINTN struct for the purpose of +; of obtaining the size of a UINTN (UINTN_size). +; +struc UINTN + .Data CTYPE_UINTN 1 +endstruc + +; MP_CPU_EXCHANGE_INFO Offset (UINTN aligned) +MP_CPU_EXCHANGE_INFO_OFFSET equ (((Flat32Start - RendezvousFunnelProcStart) + (UINTN_size - 1)) & ~(UINTN_size - 1)) %define MP_CPU_EXCHANGE_INFO_FIELD(Field) (MP_CPU_EXCHANGE_INFO_OFFSET + MP_CPU_EXCHANGE_INFO. %+ Field) diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c index fdcc21d794ac..ffaff1855f93 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -960,7 +960,7 @@ GetApResetVectorSize ( ) { if (SizeBelow1Mb != NULL) { - *SizeBelow1Mb = AddressMap->ModeTransitionOffset + sizeof (MP_CPU_EXCHANGE_INFO); + *SizeBelow1Mb = ALIGN_VALUE (AddressMap->ModeTransitionOffset, sizeof (UINTN)) + sizeof (MP_CPU_EXCHANGE_INFO); } if (SizeAbove1Mb != NULL) { @@ -1092,7 +1092,7 @@ BackupAndPrepareWakeupBuffer ( CopyMem ( (VOID *)CpuMpData->WakeupBuffer, (VOID *)CpuMpData->AddressMap.RendezvousFunnelAddress, - CpuMpData->BackupBufferSize - sizeof (MP_CPU_EXCHANGE_INFO) + CpuMpData->AddressMap.ModeTransitionOffset ); } @@ -1126,17 +1126,22 @@ AllocateResetVectorBelow1Mb ( UINTN ApResetStackSize; if (CpuMpData->WakeupBuffer == (UINTN)-1) { - CpuMpData->WakeupBuffer = GetWakeupBuffer (CpuMpData->BackupBufferSize); + CpuMpData->WakeupBuffer = GetWakeupBuffer (CpuMpData->BackupBufferSize); + // + // Align MpCpuExchangeInfo to avoid split-lock violations. + // CpuMpData->MpCpuExchangeInfo = (MP_CPU_EXCHANGE_INFO *)(UINTN) - (CpuMpData->WakeupBuffer + CpuMpData->BackupBufferSize - sizeof (MP_CPU_EXCHANGE_INFO)); + (CpuMpData->WakeupBuffer + + ALIGN_VALUE (CpuMpData->AddressMap.ModeTransitionOffset, sizeof (UINTN))); DEBUG (( DEBUG_INFO, "AP Vector: 16-bit = %p/%x, ExchangeInfo = %p/%x\n", CpuMpData->WakeupBuffer, - CpuMpData->BackupBufferSize - sizeof (MP_CPU_EXCHANGE_INFO), + CpuMpData->AddressMap.ModeTransitionOffset, CpuMpData->MpCpuExchangeInfo, sizeof (MP_CPU_EXCHANGE_INFO) )); + // // The AP reset stack is only used by SEV-ES guests. Do not allocate it // if SEV-ES is not enabled. An SEV-SNP guest is also considered diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h index a63bb81bef88..b30dcb3828ef 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h @@ -213,18 +213,23 @@ typedef struct { UINTN StackStart; UINTN StackSize; UINTN CFunction; + // + // NumApsExecuting and ApIndex are used atomically (in the + // assembly code). To avoid split-lock violations, keep them + // naturally aligned within a single cacheline. + // + UINTN NumApsExecuting; + UINTN ApIndex; IA32_DESCRIPTOR GdtrProfile; IA32_DESCRIPTOR IdtrProfile; UINTN BufferStart; UINTN ModeOffset; - UINTN ApIndex; UINTN CodeSegment; UINTN DataSegment; UINTN EnableExecuteDisable; UINTN Cr3; UINTN InitFlag; CPU_INFO_IN_HOB *CpuInfo; - UINTN NumApsExecuting; CPU_MP_DATA *CpuMpData; UINTN InitializeFloatingPointUnitsAddress; UINT32 ModeTransitionMemory; From 51a8869907b5f7b303a7e6fe3402eb8d872be1d6 Mon Sep 17 00:00:00 2001 From: Dongyan Qian Date: Thu, 5 Jun 2025 20:49:27 +0800 Subject: [PATCH 0036/1172] MdeModulePkg: Fix definition typos `defintion`->`definition` Signed-off-by: Dongyan Qian --- MdeModulePkg/Bus/Pci/UhciDxe/Uhci.c | 2 +- MdeModulePkg/Include/Library/SecurityManagementLib.h | 2 +- .../Library/BaseSerialPortLib16550/BaseSerialPortLib16550.c | 2 +- .../Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.c | 2 +- MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatOverMngr.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/UhciDxe/Uhci.c b/MdeModulePkg/Bus/Pci/UhciDxe/Uhci.c index 66915cce753e..8e6bd1b514e1 100644 --- a/MdeModulePkg/Bus/Pci/UhciDxe/Uhci.c +++ b/MdeModulePkg/Bus/Pci/UhciDxe/Uhci.c @@ -875,7 +875,7 @@ Uhci2BulkTransfer ( // // Link the TDs to bulk queue head. According to the platfore - // defintion of UHCI_NO_BW_RECLAMATION, BulkQh is either configured + // definition of UHCI_NO_BW_RECLAMATION, BulkQh is either configured // to do full speed bandwidth reclamation or not. // BulkQh = Uhc->BulkQh; diff --git a/MdeModulePkg/Include/Library/SecurityManagementLib.h b/MdeModulePkg/Include/Library/SecurityManagementLib.h index e10a4cdd02b0..5fa1f60c847f 100644 --- a/MdeModulePkg/Include/Library/SecurityManagementLib.h +++ b/MdeModulePkg/Include/Library/SecurityManagementLib.h @@ -12,7 +12,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #define __SECURITY_MANAGEMENT_LIB_H__ // -// Authentication Operation defintions for User Identity (UID), Measured and Secure boot. +// Authentication Operation definitions for User Identity (UID), Measured and Secure boot. // #define EFI_AUTH_OPERATION_NONE 0x00 #define EFI_AUTH_OPERATION_VERIFY_IMAGE 0x01 diff --git a/MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.c b/MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.c index e413cea4b309..373998025564 100644 --- a/MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.c +++ b/MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.c @@ -20,7 +20,7 @@ #include // -// PCI Defintions. +// PCI Definitions. // #define PCI_BRIDGE_32_BIT_IO_SPACE 0x01 diff --git a/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.c b/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.c index 0ea4fb38f908..c7be6c52525c 100644 --- a/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.c +++ b/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.c @@ -20,7 +20,7 @@ #include // -// The protocols, PPI and GUID defintions for this module +// The protocols, PPI and GUID definitions for this module // #include #include diff --git a/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatOverMngr.h b/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatOverMngr.h index 0e200c0d6243..fbc9c8f02fcd 100644 --- a/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatOverMngr.h +++ b/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatOverMngr.h @@ -1,6 +1,6 @@ /** @file - The defintions are required both by Source code and Vfr file. + The definitions are required both by Source code and Vfr file. The PLAT_OVER_MNGR_DATA structure, form guid and Ifr question ID are defined. Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
From 614d5ba3324d37dfdda769837096c91581bd64e4 Mon Sep 17 00:00:00 2001 From: Dongyan Qian Date: Thu, 5 Jun 2025 20:52:40 +0800 Subject: [PATCH 0037/1172] MdePkg: Fix definition typos `defintion`->`definition` Signed-off-by: Dongyan Qian --- MdePkg/Include/IndustryStandard/ArmErrorSourceTable.h | 4 ++-- MdePkg/Include/Pi/PiPeiCis.h | 2 +- MdePkg/Include/Pi/PiS3BootScript.h | 2 +- MdePkg/Include/Protocol/PxeBaseCodeCallBack.h | 2 +- MdePkg/Include/Protocol/RestJsonStructure.h | 2 +- .../BaseUefiDecompressLib/BaseUefiDecompressLibInternals.h | 2 +- MdePkg/MdePkg.dec | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/MdePkg/Include/IndustryStandard/ArmErrorSourceTable.h b/MdePkg/Include/IndustryStandard/ArmErrorSourceTable.h index edc253733dcb..188e07fff40a 100644 --- a/MdePkg/Include/IndustryStandard/ArmErrorSourceTable.h +++ b/MdePkg/Include/IndustryStandard/ArmErrorSourceTable.h @@ -161,11 +161,11 @@ typedef struct { UINT8 Reserved1[3]; } EFI_ACPI_AEST_INTERRUPT_STRUCT; -// AEST Interrupt node - interrupt type defintions. +// AEST Interrupt node - interrupt type definitions. #define EFI_ACPI_AEST_INTERRUPT_TYPE_FAULT_HANDLING 0x0 #define EFI_ACPI_AEST_INTERRUPT_TYPE_ERROR_RECOVERY 0x1 -// AEST Interrupt node - interrupt flag defintions. +// AEST Interrupt node - interrupt flag definitions. #define EFI_ACPI_AEST_INTERRUPT_FLAG_TRIGGER_TYPE_EDGE 0 #define EFI_ACPI_AEST_INTERRUPT_FLAG_TRIGGER_TYPE_LEVEL BIT0 diff --git a/MdePkg/Include/Pi/PiPeiCis.h b/MdePkg/Include/Pi/PiPeiCis.h index ad4be384bc5d..5537f4f85a8a 100644 --- a/MdePkg/Include/Pi/PiPeiCis.h +++ b/MdePkg/Include/Pi/PiPeiCis.h @@ -859,7 +859,7 @@ EFI_STATUS #define PEI_SERVICES_SIGNATURE 0x5652455320494550ULL /// /// Specification inconsistency here: -/// In the PI1.0 specification, there is a typo error in PEI_SERVICES_REVISION. In the specification the defintion is +/// In the PI1.0 specification, there is a typo error in PEI_SERVICES_REVISION. In the specification the definition is /// #define ((PEI_SPECIFICATION_MAJOR_REVISION<<16) |(PEI_SPECIFICATION_MINOR_REVISION)) /// and it should be as follows: /// diff --git a/MdePkg/Include/Pi/PiS3BootScript.h b/MdePkg/Include/Pi/PiS3BootScript.h index 5803ec4a1eff..8554703aa2ea 100644 --- a/MdePkg/Include/Pi/PiS3BootScript.h +++ b/MdePkg/Include/Pi/PiS3BootScript.h @@ -1,5 +1,5 @@ /** @file - This file contains the boot script defintions that are shared between the + This file contains the boot script definitions that are shared between the Boot Script Executor PPI and the Boot Script Save Protocol. Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.
diff --git a/MdePkg/Include/Protocol/PxeBaseCodeCallBack.h b/MdePkg/Include/Protocol/PxeBaseCodeCallBack.h index 65b3220698d7..3b36c5639409 100644 --- a/MdePkg/Include/Protocol/PxeBaseCodeCallBack.h +++ b/MdePkg/Include/Protocol/PxeBaseCodeCallBack.h @@ -27,7 +27,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #define EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_REVISION 0x00010000 /// -/// EFI 1.1 Revision Number defintion. +/// EFI 1.1 Revision Number definition. /// #define EFI_PXE_BASE_CODE_CALLBACK_INTERFACE_REVISION \ EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_REVISION diff --git a/MdePkg/Include/Protocol/RestJsonStructure.h b/MdePkg/Include/Protocol/RestJsonStructure.h index 29d69d62529b..f2bcb88503e3 100644 --- a/MdePkg/Include/Protocol/RestJsonStructure.h +++ b/MdePkg/Include/Protocol/RestJsonStructure.h @@ -25,7 +25,7 @@ typedef struct _EFI_REST_JSON_STRUCTURE_PROTOCOL EFI_REST_JSON_STRUCTURE_PROTOC typedef CHAR8 *EFI_REST_JSON_RESOURCE_TYPE_DATATYPE; /// -/// Structure defintions of resource name space. +/// Structure definitions of resource name space. /// /// The fields declared in this structure define the /// name and revision of payload delievered throught diff --git a/MdePkg/Library/BaseUefiDecompressLib/BaseUefiDecompressLibInternals.h b/MdePkg/Library/BaseUefiDecompressLib/BaseUefiDecompressLibInternals.h index cb08c2b14d96..66b722e40c84 100644 --- a/MdePkg/Library/BaseUefiDecompressLib/BaseUefiDecompressLibInternals.h +++ b/MdePkg/Library/BaseUefiDecompressLib/BaseUefiDecompressLibInternals.h @@ -1,5 +1,5 @@ /** @file - Internal data structure defintions for Base UEFI Decompress Library. + Internal data structure definitions for Base UEFI Decompress Library. Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index 6a6ef0131188..23d315ee32e3 100644 --- a/MdePkg/MdePkg.dec +++ b/MdePkg/MdePkg.dec @@ -75,7 +75,7 @@ ## @libraryclass Module entry point library for UEFI drivers, DXE Drivers, DXE SMM Driver and DXE Runtime Drivers UefiDriverEntryPoint|Include/Library/UefiDriverEntryPoint.h - ## @libraryclass UEFI Decompress Library Functions defintion for UEFI compress algorithm. + ## @libraryclass UEFI Decompress Library Functions definition for UEFI compress algorithm. UefiDecompressLib|Include/Library/UefiDecompressLib.h ## @libraryclass Provides a service to retrieve a pointer to the EFI Boot Services Table. From f9408b7cc160030c3bb9627c8086a792cc2d046c Mon Sep 17 00:00:00 2001 From: "mark.li" Date: Mon, 9 Jun 2025 17:28:10 +0800 Subject: [PATCH 0038/1172] NetworkPkg: Add PCD to control http boot enable or disable. Add PCD to control http boot enable or disable. Signed-off-by: jie.fu --- NetworkPkg/HttpBootDxe/HttpBootDxe.c | 8 ++++++++ NetworkPkg/HttpBootDxe/HttpBootDxe.inf | 2 ++ NetworkPkg/NetworkDynamicPcds.dsc.inc | 5 +++++ NetworkPkg/NetworkPkg.dec | 6 ++++++ 4 files changed, 21 insertions(+) diff --git a/NetworkPkg/HttpBootDxe/HttpBootDxe.c b/NetworkPkg/HttpBootDxe/HttpBootDxe.c index 168d4b7c1004..5b92d772a4c2 100644 --- a/NetworkPkg/HttpBootDxe/HttpBootDxe.c +++ b/NetworkPkg/HttpBootDxe/HttpBootDxe.c @@ -305,6 +305,10 @@ HttpBootIp4DxeDriverBindingSupported ( { EFI_STATUS Status; + if (PcdGetBool (PcdIPv4HttpSupport) == FALSE) { + return EFI_UNSUPPORTED; + } + // // Try to open the DHCP4, HTTP4 and Device Path protocol. // @@ -795,6 +799,10 @@ HttpBootIp6DxeDriverBindingSupported ( { EFI_STATUS Status; + if (PcdGetBool (PcdIPv6HttpSupport) == FALSE) { + return EFI_UNSUPPORTED; + } + // // Try to open the DHCP6, HTTP and Device Path protocol. // diff --git a/NetworkPkg/HttpBootDxe/HttpBootDxe.inf b/NetworkPkg/HttpBootDxe/HttpBootDxe.inf index 3f87e58a14a9..6caa30f2d247 100644 --- a/NetworkPkg/HttpBootDxe/HttpBootDxe.inf +++ b/NetworkPkg/HttpBootDxe/HttpBootDxe.inf @@ -99,6 +99,8 @@ gEfiNetworkPkgTokenSpaceGuid.PcdHttpIoTimeout ## CONSUMES gEfiNetworkPkgTokenSpaceGuid.PcdMaxHttpResumeRetries ## CONSUMES gEfiNetworkPkgTokenSpaceGuid.PcdHttpDelayBetweenResumeRetries ## CONSUMES + gEfiNetworkPkgTokenSpaceGuid.PcdIPv4HttpSupport ## CONSUMES + gEfiNetworkPkgTokenSpaceGuid.PcdIPv6HttpSupport ## CONSUMES [UserExtensions.TianoCore."ExtraFiles"] HttpBootDxeExtra.uni diff --git a/NetworkPkg/NetworkDynamicPcds.dsc.inc b/NetworkPkg/NetworkDynamicPcds.dsc.inc index b26105bd66ad..a3e89e586d7a 100644 --- a/NetworkPkg/NetworkDynamicPcds.dsc.inc +++ b/NetworkPkg/NetworkDynamicPcds.dsc.inc @@ -18,3 +18,8 @@ gEfiNetworkPkgTokenSpaceGuid.PcdIPv4PXESupport|0x01 gEfiNetworkPkgTokenSpaceGuid.PcdIPv6PXESupport|0x01 !endif +# +# IPv4 and IPv6 HTTP Boot support. +# + gEfiNetworkPkgTokenSpaceGuid.PcdIPv4HttpSupport|TRUE + gEfiNetworkPkgTokenSpaceGuid.PcdIPv6HttpSupport|TRUE diff --git a/NetworkPkg/NetworkPkg.dec b/NetworkPkg/NetworkPkg.dec index 2158dc3f8a9c..6ff3848ab16c 100644 --- a/NetworkPkg/NetworkPkg.dec +++ b/NetworkPkg/NetworkPkg.dec @@ -187,6 +187,12 @@ # @Prompt The value of Retry Count, Default value is 0. gEfiNetworkPkgTokenSpaceGuid.PcdHttpDnsRetryCount|0|UINT32|0x00000011 + ## IPv4 HTTP support + gEfiNetworkPkgTokenSpaceGuid.PcdIPv4HttpSupport|TRUE|BOOLEAN|0x10000012 + + ## IPv6 HTTP support + gEfiNetworkPkgTokenSpaceGuid.PcdIPv6HttpSupport|TRUE|BOOLEAN|0x10000013 + ## The default size of the HTTP transfer data buffer in bytes. # This size is used for HTTP transfers, with a default value of 2MB. # Increasing the buffer size can enhance performance for high-bandwidth connections. From 58d3345d8c71ce4ab1c3dbf57a08408f61c1c295 Mon Sep 17 00:00:00 2001 From: Dongyan Qian Date: Wed, 11 Jun 2025 11:56:08 +0800 Subject: [PATCH 0039/1172] MdeModulePkg/SpiBus: Free handle buffers after LocateHandleBuffer Fix memory leaks by adding missing FreePool calls: release SpiHcHandles in SpiBusEntry exit path. REF: https://uefi.org/sites/default/files/resources/UEFI_Spec_Final_2.11.pdf Chapter 7.3.15: "Services - Boot Services.LocateHandleBuffer": It is the caller's responsibility to call the Boot Service.FreePool when the caller no longer requires the contents of Buffer. Signed-off-by: Dongyan Qian --- MdeModulePkg/Bus/Spi/SpiBus/SpiBusDxe.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Bus/Spi/SpiBus/SpiBusDxe.c b/MdeModulePkg/Bus/Spi/SpiBus/SpiBusDxe.c index a2b77e79c611..a38db479be79 100644 --- a/MdeModulePkg/Bus/Spi/SpiBus/SpiBusDxe.c +++ b/MdeModulePkg/Bus/Spi/SpiBus/SpiBusDxe.c @@ -59,8 +59,7 @@ SpiBusEntry ( if (EFI_ERROR (Status)) { DEBUG ((DEBUG_VERBOSE, "No SpiHcProtocol is found\n")); - Status = EFI_NOT_FOUND; - goto Exit; + return EFI_NOT_FOUND; } // Locate the SPI Configuration Protocol @@ -193,6 +192,9 @@ SpiBusEntry ( } Exit: + + gBS->FreePool (SpiHcHandles); + DEBUG ((DEBUG_VERBOSE, "%a - EXIT (Status = %r)\n", __func__, Status)); return Status; } From ef516ea82d42c2ca37d1954262383787b80e1ba7 Mon Sep 17 00:00:00 2001 From: Dongyan Qian Date: Wed, 11 Jun 2025 11:57:01 +0800 Subject: [PATCH 0040/1172] NetworkPkg/HttpUtilitiesDxe: Free handle buffers after LocateHandleBuffer Fix memory leaks by adding missing FreePool calls: free HandleBuffer in HttpUtilitiesDxeUnload. REF: https://uefi.org/sites/default/files/resources/UEFI_Spec_Final_2.11.pdf Chapter 7.3.15: "Services - Boot Services.LocateHandleBuffer": It is the caller's responsibility to call the Boot Service.FreePool when the caller no longer requires the contents of Buffer. Signed-off-by: Dongyan Qian --- NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.c b/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.c index a3e1ea4691ef..38dd8654781b 100644 --- a/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.c +++ b/NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.c @@ -59,7 +59,7 @@ HttpUtilitiesDxeUnload ( EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL ); if (EFI_ERROR (Status)) { - return Status; + goto Exit; } // @@ -72,11 +72,16 @@ HttpUtilitiesDxeUnload ( NULL ); if (EFI_ERROR (Status)) { - return Status; + goto Exit; } } - return EFI_SUCCESS; + Status = EFI_SUCCESS; + +Exit: + gBS->FreePool (HandleBuffer); + + return Status; } /** From ddacfa238aa99399256897df2e193a5a730dee29 Mon Sep 17 00:00:00 2001 From: Dongyan Qian Date: Wed, 11 Jun 2025 11:57:22 +0800 Subject: [PATCH 0041/1172] PrmPkg/DxePrmContextBufferLib: Free handle buffers after LocateHandleBuffer Fix memory leaks by adding missing FreePool calls: cleanup HandleBuffer in GetModuleContextBuffers. REF: https://uefi.org/sites/default/files/resources/UEFI_Spec_Final_2.11.pdf Chapter 7.3.15: "Services - Boot Services.LocateHandleBuffer": It is the caller's responsibility to call the Boot Service.FreePool when the caller no longer requires the contents of Buffer. Signed-off-by: Dongyan Qian --- .../DxePrmContextBufferLib.c | 71 +++++++++++-------- 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/PrmPkg/Library/DxePrmContextBufferLib/DxePrmContextBufferLib.c b/PrmPkg/Library/DxePrmContextBufferLib/DxePrmContextBufferLib.c index a6ad141556a4..b265c193404b 100644 --- a/PrmPkg/Library/DxePrmContextBufferLib/DxePrmContextBufferLib.c +++ b/PrmPkg/Library/DxePrmContextBufferLib/DxePrmContextBufferLib.c @@ -104,37 +104,41 @@ GetModuleContextBuffers ( &HandleCount, &HandleBuffer ); - if (!EFI_ERROR (Status)) { - for (Index = 0; Index < HandleCount; Index++) { - Status = gBS->HandleProtocol ( - HandleBuffer[Index], - &gPrmConfigProtocolGuid, - (VOID **)&PrmConfigProtocol - ); - ASSERT_EFI_ERROR (Status); - if (EFI_ERROR (Status) || (PrmConfigProtocol == NULL)) { - continue; - } + if (EFI_ERROR (Status)) { + return Status; + } - if (GuidSearchType == ByModuleGuid) { - if (CompareGuid (&PrmConfigProtocol->ModuleContextBuffers.ModuleGuid, Guid)) { - DEBUG (( - DEBUG_INFO, - " %a %a: Found a PRM configuration protocol for PRM module %g.\n", - _DBGMSGID_, - __func__, - Guid - )); - - *PrmModuleContextBuffers = &PrmConfigProtocol->ModuleContextBuffers; - return EFI_SUCCESS; - } - } else { - Status = FindContextBufferInModuleBuffers (Guid, &PrmConfigProtocol->ModuleContextBuffers, &PrmContextBuffer); - if (!EFI_ERROR (Status)) { - *PrmModuleContextBuffers = &PrmConfigProtocol->ModuleContextBuffers; - return EFI_SUCCESS; - } + for (Index = 0; Index < HandleCount; Index++) { + Status = gBS->HandleProtocol ( + HandleBuffer[Index], + &gPrmConfigProtocolGuid, + (VOID **)&PrmConfigProtocol + ); + ASSERT_EFI_ERROR (Status); + if (EFI_ERROR (Status) || (PrmConfigProtocol == NULL)) { + continue; + } + + if (GuidSearchType == ByModuleGuid) { + if (CompareGuid (&PrmConfigProtocol->ModuleContextBuffers.ModuleGuid, Guid)) { + DEBUG (( + DEBUG_INFO, + " %a %a: Found a PRM configuration protocol for PRM module %g.\n", + _DBGMSGID_, + __func__, + Guid + )); + + *PrmModuleContextBuffers = &PrmConfigProtocol->ModuleContextBuffers; + Status = EFI_SUCCESS; + goto Exit; + } + } else { + Status = FindContextBufferInModuleBuffers (Guid, &PrmConfigProtocol->ModuleContextBuffers, &PrmContextBuffer); + if (!EFI_ERROR (Status)) { + *PrmModuleContextBuffers = &PrmConfigProtocol->ModuleContextBuffers; + Status = EFI_SUCCESS; + goto Exit; } } } @@ -147,7 +151,12 @@ GetModuleContextBuffers ( Guid )); - return EFI_NOT_FOUND; + Status = EFI_NOT_FOUND; + +Exit: + gBS->FreePool (HandleBuffer); + + return Status; } /** From 108757b613620e8406f32e5aa2e52df8d115d61f Mon Sep 17 00:00:00 2001 From: Dongyan Qian Date: Wed, 11 Jun 2025 11:58:13 +0800 Subject: [PATCH 0042/1172] RedfishPkg/RedfishConfigHandler: Free handle buffers Fix memory leaks by adding missing FreePool calls: free handle buffers in Stop and initialization routines. REF:https://uefi.org/sites/default/files/resources/UEFI_Spec_Final_2.11.pdf Chapter 7.3.15: "Services - Boot Services.LocateHandleBuffer": It is the caller's responsibility to call the Boot Service.FreePool when the caller no longer requires the contents of Buffer. Signed-off-by: Dongyan Qian --- .../RedfishConfigHandler/RedfishConfigHandlerCommon.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/RedfishPkg/RedfishConfigHandler/RedfishConfigHandlerCommon.c b/RedfishPkg/RedfishConfigHandler/RedfishConfigHandlerCommon.c index bc1ba5983590..f6c8c3db36aa 100644 --- a/RedfishPkg/RedfishConfigHandler/RedfishConfigHandlerCommon.c +++ b/RedfishPkg/RedfishConfigHandler/RedfishConfigHandlerCommon.c @@ -188,11 +188,12 @@ RedfishConfigCommonStop ( &NumberOfHandles, &HandleBuffer ); - if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { + if (Status == EFI_NOT_FOUND) { + return EFI_SUCCESS; + } else if (EFI_ERROR (Status)) { return Status; } - Status = EFI_SUCCESS; for (Index = 0; Index < NumberOfHandles; Index++) { Status = gBS->HandleProtocol ( HandleBuffer[Index], @@ -208,6 +209,8 @@ RedfishConfigCommonStop ( } } + gBS->FreePool (HandleBuffer); + return Status; } @@ -272,4 +275,6 @@ RedfishConfigHandlerInitialization ( ); ASSERT_EFI_ERROR (Status); } + + gBS->FreePool (HandleBuffer); } From c4bc60b2b721d4297443db59e2653fb4a4e888cf Mon Sep 17 00:00:00 2001 From: Gao Qihang Date: Fri, 6 Jun 2025 10:42:13 +0800 Subject: [PATCH 0043/1172] MdeModulePkg: Fix EFI_SUCCESS typos EFI_SUCESS -> EFI_SUCCESS EFI_SUCESSS -> EFI_SUCCESS Signed-off-by: Gao Qihang --- .../Bus/Pci/PciBusDxe/PciOptionRomSupport.c | 2 +- .../Bus/Pci/PciBusDxe/PciOptionRomSupport.h | 2 +- MdeModulePkg/Core/DxeIplPeim/DxeLoad.c | 4 ++-- MdeModulePkg/Include/Library/CapsuleLib.h | 4 ++-- MdeModulePkg/Include/Library/FileExplorerLib.h | 2 +- MdeModulePkg/Include/Protocol/FileExplorer.h | 2 +- .../BootMaintenanceManager.h | 2 +- .../BootMaintenanceManagerUiLib/BootOption.c | 4 ++-- .../Library/DxeCapsuleLibFmp/DxeCapsuleLib.c | 14 +++++++------- .../DxeCapsuleLibFmp/DxeCapsuleProcessLib.c | 6 +++--- .../DxeCapsuleLibFmp/DxeCapsuleProcessLibNull.c | 2 +- .../DxeFileExplorerProtocol.c | 2 +- .../Library/FileExplorerLib/FileExplorer.c | 6 +++--- .../Universal/DebugServicePei/DebugServicePei.c | 2 +- .../Universal/DisplayEngineDxe/FormDisplay.c | 4 ++-- .../Universal/DriverSampleDxe/DriverSample.c | 2 +- .../HiiResourcesSampleDxe/HiiResourcesSample.c | 2 +- .../Pei/ReportStatusCodeRouterPei.c | 2 +- .../Universal/SetupBrowserDxe/Presentation.c | 6 +++--- .../StatusCodeHandler/Pei/StatusCodeHandlerPei.c | 2 +- 20 files changed, 36 insertions(+), 36 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c index bd5ace18f6e4..8bb6c1205819 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c @@ -371,7 +371,7 @@ ContainEfiImage ( @param RomBase Base address of Option Rom. @retval EFI_OUT_OF_RESOURCES No enough memory to hold image. - @retval EFI_SUCESS Successfully loaded Option Rom. + @retval EFI_SUCCESS Successfully loaded Option Rom. **/ EFI_STATUS diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.h b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.h index 16998a422e16..0ddad05b8572 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.h +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.h @@ -91,7 +91,7 @@ GetOpRomInfo ( @param RomBase Base address of Option Rom. @retval EFI_OUT_OF_RESOURCES No enough memory to hold image. - @retval EFI_SUCESS Successfully loaded Option Rom. + @retval EFI_SUCCESS Successfully loaded Option Rom. **/ EFI_STATUS diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c b/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c index b9fe70332ea6..0b3a71f289bf 100644 --- a/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c +++ b/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c @@ -59,7 +59,7 @@ CONST EFI_PEI_NOTIFY_DESCRIPTOR mMemoryDiscoveredNotifyList = { @param FileHandle Handle of the file being invoked. @param PeiServices Describes the list of possible PEI Services. - @retval EFI_SUCESS The entry point of DXE IPL PEIM executes successfully. + @retval EFI_SUCCESS The entry point of DXE IPL PEIM executes successfully. @retval Others Some error occurs during the execution of this function. **/ @@ -80,7 +80,7 @@ PeimInitializeDxeIpl ( Status = PeiServicesRegisterForShadow (FileHandle); if (Status == EFI_SUCCESS) { // - // EFI_SUCESS means it is the first time to call register for shadow. + // EFI_SUCCESS means it is the first time to call register for shadow. // return Status; } diff --git a/MdeModulePkg/Include/Library/CapsuleLib.h b/MdeModulePkg/Include/Library/CapsuleLib.h index 92904ebfb699..048ac32b85e4 100644 --- a/MdeModulePkg/Include/Library/CapsuleLib.h +++ b/MdeModulePkg/Include/Library/CapsuleLib.h @@ -24,7 +24,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent @param CapsuleHeader Pointer to the UEFI capsule image to be checked. - @retval EFI_SUCESS Input capsule is supported by firmware. + @retval EFI_SUCCESS Input capsule is supported by firmware. @retval EFI_UNSUPPORTED Input capsule is not supported by the firmware. **/ EFI_STATUS @@ -41,7 +41,7 @@ SupportCapsuleImage ( @param CapsuleHeader Pointer to the UEFI capsule image to be processed. - @retval EFI_SUCESS Capsule Image processed successfully. + @retval EFI_SUCCESS Capsule Image processed successfully. @retval EFI_UNSUPPORTED Capsule image is not supported by the firmware. **/ EFI_STATUS diff --git a/MdeModulePkg/Include/Library/FileExplorerLib.h b/MdeModulePkg/Include/Library/FileExplorerLib.h index 528a3cabb640..9159e7c2732c 100644 --- a/MdeModulePkg/Include/Library/FileExplorerLib.h +++ b/MdeModulePkg/Include/Library/FileExplorerLib.h @@ -26,7 +26,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent after choose one file. @param File Return the device path for the last time chosed file. - @retval EFI_SUCESS Choose the file success. + @retval EFI_SUCCESS Choose the file success. @retval Other errors Choose the file failed. **/ EFI_STATUS diff --git a/MdeModulePkg/Include/Protocol/FileExplorer.h b/MdeModulePkg/Include/Protocol/FileExplorer.h index aa14d27793c8..2662a5ecfb96 100644 --- a/MdeModulePkg/Include/Protocol/FileExplorer.h +++ b/MdeModulePkg/Include/Protocol/FileExplorer.h @@ -48,7 +48,7 @@ BOOLEAN after choose one file. @param File Return the device path for the last time chosed file. - @retval EFI_SUCESS Choose the file success. + @retval EFI_SUCCESS Choose the file success. @retval Other errors Choose the file failed. **/ typedef diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManager.h b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManager.h index 2e9a70dccb5f..f47a563194c6 100644 --- a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManager.h +++ b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManager.h @@ -396,7 +396,7 @@ BOpt_GetBootOptions ( @param CallbackData The BMM context data. - @return EFI_SUCESS The functin completes successfully. + @return EFI_SUCCESS The functin completes successfully. @retval EFI_OUT_OF_RESOURCES Not enough memory to compete the operation. diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootOption.c b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootOption.c index e22aaf3039f1..ced12064c3f3 100644 --- a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootOption.c +++ b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootOption.c @@ -281,7 +281,7 @@ BOpt_FreeMenu ( @param CallbackData The BMM context data. @return EFI_NOT_FOUND Fail to find "BootOrder" variable. - @return EFI_SUCESS Success build boot option menu. + @return EFI_SUCCESS Success build boot option menu. **/ EFI_STATUS @@ -669,7 +669,7 @@ BOpt_GetDriverOptionNumber ( @param CallbackData The BMM context data. - @retval EFI_SUCESS The functin completes successfully. + @retval EFI_SUCCESS The functin completes successfully. @retval EFI_OUT_OF_RESOURCES Not enough memory to compete the operation. @retval EFI_NOT_FOUND Fail to get "DriverOrder" variable. diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c index f072fb4c9838..92813226ad3d 100644 --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c +++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c @@ -104,7 +104,7 @@ RecordFmpCapsuleStatusVariable ( @param[in] Completion A value between 1 and 100 indicating the current completion progress of the firmware update - @retval EFI_SUCESS The capsule update progress was updated. + @retval EFI_SUCCESS The capsule update progress was updated. @retval EFI_INVALID_PARAMETER Completion is greater than 100%. **/ EFI_STATUS @@ -201,7 +201,7 @@ IsValidCapsuleHeader ( @param[in] CapsuleHeader Points to a capsule header. @param[out] EmbeddedDriverCount The EmbeddedDriverCount in the FMP capsule. - @retval EFI_SUCESS Input capsule is a correct FMP capsule. + @retval EFI_SUCCESS Input capsule is a correct FMP capsule. @retval EFI_INVALID_PARAMETER Input capsule is not a correct FMP capsule. **/ EFI_STATUS @@ -345,7 +345,7 @@ ValidateFmpCapsule ( @param[in] CapsuleHeader Points to a capsule header. - @retval EFI_SUCESS Input capsule is supported by firmware. + @retval EFI_SUCCESS Input capsule is supported by firmware. @retval EFI_UNSUPPORTED Input capsule is not supported by the firmware. **/ EFI_STATUS @@ -1198,7 +1198,7 @@ RecordFmpCapsuleStatus ( @param[in] CapFileName Capsule file name. @param[out] ResetRequired Indicates whether reset is required or not. - @retval EFI_SUCESS Process Capsule Image successfully. + @retval EFI_SUCCESS Process Capsule Image successfully. @retval EFI_UNSUPPORTED Capsule image is not supported by the firmware. @retval EFI_VOLUME_CORRUPTED FV volume in the capsule is corrupted. @retval EFI_OUT_OF_RESOURCES Not enough memory. @@ -1496,7 +1496,7 @@ IsFmpCapsule ( @param[in] CapsuleHeader Points to a capsule header. - @retval EFI_SUCESS Input capsule is supported by firmware. + @retval EFI_SUCCESS Input capsule is supported by firmware. @retval EFI_UNSUPPORTED Input capsule is not supported by the firmware. @retval EFI_INVALID_PARAMETER Input capsule layout is not correct **/ @@ -1547,7 +1547,7 @@ SupportCapsuleImage ( @param[in] CapFileName Capsule file name. @param[out] ResetRequired Indicates whether reset is required or not. - @retval EFI_SUCESS Process Capsule Image successfully. + @retval EFI_SUCCESS Process Capsule Image successfully. @retval EFI_UNSUPPORTED Capsule image is not supported by the firmware. @retval EFI_VOLUME_CORRUPTED FV volume in the capsule is corrupted. @retval EFI_OUT_OF_RESOURCES Not enough memory. @@ -1610,7 +1610,7 @@ ProcessThisCapsuleImage ( @param[in] CapsuleHeader Points to a capsule header. - @retval EFI_SUCESS Process Capsule Image successfully. + @retval EFI_SUCCESS Process Capsule Image successfully. @retval EFI_UNSUPPORTED Capsule image is not supported by the firmware. @retval EFI_VOLUME_CORRUPTED FV volume in the capsule is corrupted. @retval EFI_OUT_OF_RESOURCES Not enough memory. diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLib.c b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLib.c index 2a38a3d95bce..8c0023d42fe7 100644 --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLib.c +++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLib.c @@ -65,7 +65,7 @@ IsFmpCapsule ( @param[in] CapsuleHeader Points to a capsule header. @param[out] EmbeddedDriverCount The EmbeddedDriverCount in the FMP capsule. - @retval EFI_SUCESS Input capsule is a correct FMP capsule. + @retval EFI_SUCCESS Input capsule is a correct FMP capsule. @retval EFI_INVALID_PARAMETER Input capsule is not a correct FMP capsule. **/ EFI_STATUS @@ -139,7 +139,7 @@ UINT32 mCapsuleTotalNumber; @param[in] CapFileName Capsule file name. @param[out] ResetRequired Indicates whether reset is required or not. - @retval EFI_SUCESS Process Capsule Image successfully. + @retval EFI_SUCCESS Process Capsule Image successfully. @retval EFI_UNSUPPORTED Capsule image is not supported by the firmware. @retval EFI_VOLUME_CORRUPTED FV volume in the capsule is corrupted. @retval EFI_OUT_OF_RESOURCES Not enough memory. @@ -159,7 +159,7 @@ ProcessThisCapsuleImage ( @param[in] Completion A value between 1 and 100 indicating the current completion progress of the firmware update - @retval EFI_SUCESS The capsule update progress was updated. + @retval EFI_SUCCESS The capsule update progress was updated. @retval EFI_INVALID_PARAMETER Completion is greater than 100%. **/ EFI_STATUS diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLibNull.c b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLibNull.c index 9054ae446ee3..9f45f27dbcfd 100644 --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLibNull.c +++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLibNull.c @@ -18,7 +18,7 @@ @param[in] Completion A value between 1 and 100 indicating the current completion progress of the firmware update - @retval EFI_SUCESS The capsule update progress was updated. + @retval EFI_SUCCESS The capsule update progress was updated. @retval EFI_INVALID_PARAMETER Completion is greater than 100%. **/ EFI_STATUS diff --git a/MdeModulePkg/Library/DxeFileExplorerProtocol/DxeFileExplorerProtocol.c b/MdeModulePkg/Library/DxeFileExplorerProtocol/DxeFileExplorerProtocol.c index a8f07c8996da..28ef4dff04a8 100644 --- a/MdeModulePkg/Library/DxeFileExplorerProtocol/DxeFileExplorerProtocol.c +++ b/MdeModulePkg/Library/DxeFileExplorerProtocol/DxeFileExplorerProtocol.c @@ -68,7 +68,7 @@ FileExplorerConstructor ( after choose one file. @param File Return the device path for the last time chosed file. - @retval EFI_SUCESS Choose file success. + @retval EFI_SUCCESS Choose file success. @retval EFI_INVALID_PARAMETER Both ChooseHandler and return device path are NULL One of them must not NULL. @retval Other errors Choose file failed. diff --git a/MdeModulePkg/Library/FileExplorerLib/FileExplorer.c b/MdeModulePkg/Library/FileExplorerLib/FileExplorer.c index 804a03d868f2..42ad80c2d727 100644 --- a/MdeModulePkg/Library/FileExplorerLib/FileExplorer.c +++ b/MdeModulePkg/Library/FileExplorerLib/FileExplorer.c @@ -870,7 +870,7 @@ LibFindFileSystem ( @param MenuEntry Input Menu info. @param RetFileHandle Return the file handle for the input device path. - @retval EFI_SUCESS Find the file handle success. + @retval EFI_SUCCESS Find the file handle success. @retval Other Find the file handle failure. **/ EFI_STATUS @@ -918,7 +918,7 @@ LibGetFileHandleFromMenu ( @param ParentFileName Parent file name. @param DeviceHandle Driver handle for this partition. - @retval EFI_SUCESS Find the file handle success. + @retval EFI_SUCCESS Find the file handle success. @retval Other Find the file handle failure. **/ EFI_STATUS @@ -1478,7 +1478,7 @@ LibGetDevicePath ( after choose one file. @param File Return the device path for the last time chosed file. - @retval EFI_SUCESS Choose file success. + @retval EFI_SUCCESS Choose file success. @retval EFI_INVALID_PARAMETER Both ChooseHandler and return device path are NULL One of them must not NULL. @retval Other errors Choose file failed. diff --git a/MdeModulePkg/Universal/DebugServicePei/DebugServicePei.c b/MdeModulePkg/Universal/DebugServicePei/DebugServicePei.c index b3407279c821..cc3257e5ae44 100644 --- a/MdeModulePkg/Universal/DebugServicePei/DebugServicePei.c +++ b/MdeModulePkg/Universal/DebugServicePei/DebugServicePei.c @@ -78,7 +78,7 @@ PeiDebugAssert ( @param FileHandle Handle of the file being invoked. @param PeiServices Describes the list of possible PEI Services. - @retval EFI_SUCESS The entry point of Debug Service PEIM executes successfully. + @retval EFI_SUCCESS The entry point of Debug Service PEIM executes successfully. @retval Others Some error occurs during the execution of this function. **/ diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c index a1914f169ad0..81020b2da6f7 100644 --- a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c +++ b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c @@ -2380,7 +2380,7 @@ FxConfirmPopup ( @param Highlight Whether this menu will be highlight. @param UpdateCol Whether need to update the column info for Date/Time. - @retval EFI_SUCESSS Process the user selection success. + @retval EFI_SUCCESS Process the user selection success. **/ EFI_STATUS @@ -2627,7 +2627,7 @@ DisplayOneMenu ( @param FormData The current form data info. - @retval EFI_SUCESSS Process the user selection success. + @retval EFI_SUCCESS Process the user selection success. @retval EFI_NOT_FOUND Process option string for orderedlist/Oneof fail. **/ diff --git a/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c b/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c index 003cb499b5df..b8c903b442b1 100644 --- a/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c +++ b/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c @@ -1746,7 +1746,7 @@ DriverCallback ( @param ImageHandle Image handle this driver. @param SystemTable Pointer to SystemTable. - @retval EFI_SUCESS This function always complete successfully. + @retval EFI_SUCCESS This function always complete successfully. **/ EFI_STATUS diff --git a/MdeModulePkg/Universal/HiiResourcesSampleDxe/HiiResourcesSample.c b/MdeModulePkg/Universal/HiiResourcesSampleDxe/HiiResourcesSample.c index dd0ae5001d94..cbcb7b2627fe 100644 --- a/MdeModulePkg/Universal/HiiResourcesSampleDxe/HiiResourcesSample.c +++ b/MdeModulePkg/Universal/HiiResourcesSampleDxe/HiiResourcesSample.c @@ -57,7 +57,7 @@ HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath = { @param[in] ImageHandle Image handle this driver. @param[in] SystemTable Pointer to SystemTable. - @retval EFI_SUCESS This function always complete successfully. + @retval EFI_SUCCESS This function always complete successfully. **/ EFI_STATUS diff --git a/MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouterPei.c b/MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouterPei.c index b12398345f70..e1b1021b411e 100644 --- a/MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouterPei.c +++ b/MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouterPei.c @@ -275,7 +275,7 @@ ReportDispatcher ( @param FileHandle Handle of the file being invoked. @param PeiServices Describes the list of possible PEI Services. - @retval EFI_SUCESS The entry point of DXE IPL PEIM executes successfully. + @retval EFI_SUCCESS The entry point of DXE IPL PEIM executes successfully. **/ EFI_STATUS diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c b/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c index de7e79e8ab02..e44a70c65e8e 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c @@ -1004,7 +1004,7 @@ UpdateStatementStatus ( @param Action The user input action request info. @param DefaultId The user input default Id info. - @retval EFI_SUCESSS This function always return successfully for now. + @retval EFI_SUCCESS This function always return successfully for now. **/ EFI_STATUS @@ -1557,7 +1557,7 @@ ProcessQuestionConfig ( @param UserInput The user input data. - @retval EFI_SUCESSS This function always return successfully for now. + @retval EFI_SUCCESS This function always return successfully for now. **/ EFI_STATUS @@ -1687,7 +1687,7 @@ ProcessUserInput ( Display form and wait for user to select one menu option, then return it. - @retval EFI_SUCESSS This function always return successfully for now. + @retval EFI_SUCCESS This function always return successfully for now. **/ EFI_STATUS diff --git a/MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCodeHandlerPei.c b/MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCodeHandlerPei.c index d740a624786c..b29b78bebac8 100644 --- a/MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCodeHandlerPei.c +++ b/MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCodeHandlerPei.c @@ -19,7 +19,7 @@ @param FileHandle Handle of the file being invoked. @param PeiServices Describes the list of possible PEI Services. - @retval EFI_SUCESS The entry point of DXE IPL PEIM executes successfully. + @retval EFI_SUCCESS The entry point of DXE IPL PEIM executes successfully. **/ EFI_STATUS From 716563f594d211a247cd5b788f0cce7c185c5a92 Mon Sep 17 00:00:00 2001 From: Gao Qihang Date: Fri, 6 Jun 2025 11:00:15 +0800 Subject: [PATCH 0044/1172] EmulatorPkg: Fix EFI_SUCCESS typos EFI_SUCESS -> EFI_SUCCESS Signed-off-by: Gao Qihang --- .../RedfishPlatformHostInterfaceLib.c | 2 +- EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/EmulatorPkg/Library/RedfishPlatformHostInterfaceLib/RedfishPlatformHostInterfaceLib.c b/EmulatorPkg/Library/RedfishPlatformHostInterfaceLib/RedfishPlatformHostInterfaceLib.c index 2fec935a1d9c..584f7fb07147 100644 --- a/EmulatorPkg/Library/RedfishPlatformHostInterfaceLib/RedfishPlatformHostInterfaceLib.c +++ b/EmulatorPkg/Library/RedfishPlatformHostInterfaceLib/RedfishPlatformHostInterfaceLib.c @@ -350,7 +350,7 @@ DumpRedfishIpProtocolData ( @param[out] RedfishProtocolData Pointer to retrieve REDFISH_OVER_IP_PROTOCOL_DATA. @param[out] RedfishProtocolDataSize Size of REDFISH_OVER_IP_PROTOCOL_DATA. - @retval EFI_SUCESS REDFISH_OVER_IP_PROTOCOL_DATA is returned successfully. + @retval EFI_SUCCESS REDFISH_OVER_IP_PROTOCOL_DATA is returned successfully. **/ EFI_STATUS GetRedfishRecordFromVariable ( diff --git a/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c index 7100abeb913d..a71bc00508bc 100644 --- a/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c +++ b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c @@ -75,7 +75,7 @@ CreatePlatformSmbiosMemoryRecords ( @param ImageHandle Image handle this driver. @param SystemTable Pointer to SystemTable. - @retval EFI_SUCESS This function always complete successfully. + @retval EFI_SUCCESS This function always complete successfully. **/ EFI_STATUS From dcfb898199b10ccd4710a011e5c1079fb3948ecb Mon Sep 17 00:00:00 2001 From: Gao Qihang Date: Fri, 6 Jun 2025 11:02:29 +0800 Subject: [PATCH 0045/1172] MdePkg: Fix EFI_SUCCESS typos EFI_SUCESS -> EFI_SUCCESS Signed-off-by: Gao Qihang --- MdePkg/Include/Protocol/MmMp.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MdePkg/Include/Protocol/MmMp.h b/MdePkg/Include/Protocol/MmMp.h index ad958c84b597..6704d6abcf3f 100644 --- a/MdePkg/Include/Protocol/MmMp.h +++ b/MdePkg/Include/Protocol/MmMp.h @@ -247,14 +247,14 @@ EFI_STATUS via the use of a token, this function can be used to check for completion of the procedure on the AP. The function takes the token that was passed into the DispatchProcedure call. If the procedure is complete, and therefore it is now possible to run another procedure on the same AP, this function - returns EFI_SUCESS. In this case the status returned by the procedure that executed on the AP is + returns EFI_SUCCESS. In this case the status returned by the procedure that executed on the AP is returned in the token's Status field. If the procedure has not yet completed, then this function returns EFI_NOT_READY. When a non-blocking execution of a procedure is invoked with BroadcastProcedure, via the use of a token, this function can be used to check for completion of the procedure on all the broadcast APs. The function takes the token that was passed into the BroadcastProcedure - call. If the procedure is complete on all broadcast APs this function returns EFI_SUCESS. In this + call. If the procedure is complete on all broadcast APs this function returns EFI_SUCCESS. In this case the Status field in the token passed into the function reflects the overall result of the invocation, which may be EFI_SUCCESS, if all executions succeeded, or the first observed failure. If the procedure has not yet completed on the broadcast APs, the function returns From 0a5bdcb63c31b9cdde9541c121e19e9f15bd4843 Mon Sep 17 00:00:00 2001 From: Gao Qihang Date: Fri, 6 Jun 2025 11:04:32 +0800 Subject: [PATCH 0046/1172] OvmfPkg: Fix EFI_SUCCESS typos EFI_SUCESS -> EFI_SUCCESS Signed-off-by: Gao Qihang --- .../IncompatiblePciDeviceSupport.c | 2 +- OvmfPkg/PciHotPlugInitDxe/PciHotPlugInit.c | 2 +- OvmfPkg/PlatformDxe/Platform.c | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/OvmfPkg/IncompatiblePciDeviceSupportDxe/IncompatiblePciDeviceSupport.c b/OvmfPkg/IncompatiblePciDeviceSupportDxe/IncompatiblePciDeviceSupport.c index 3a6f75988220..ebf73d97db5f 100644 --- a/OvmfPkg/IncompatiblePciDeviceSupportDxe/IncompatiblePciDeviceSupport.c +++ b/OvmfPkg/IncompatiblePciDeviceSupportDxe/IncompatiblePciDeviceSupport.c @@ -243,7 +243,7 @@ CheckDevice ( @param[in] ImageHandle Image handle of this driver. @param[in] SystemTable Pointer to SystemTable. - @retval EFI_SUCESS Driver has loaded successfully. + @retval EFI_SUCCESS Driver has loaded successfully. @retval EFI_UNSUPPORTED PCI resource allocation has been disabled. @retval EFI_UNSUPPORTED There is no 64-bit PCI MMIO aperture. @return Error codes from lower level functions. diff --git a/OvmfPkg/PciHotPlugInitDxe/PciHotPlugInit.c b/OvmfPkg/PciHotPlugInitDxe/PciHotPlugInit.c index bb2389d16c70..cdd9d7ec9f02 100644 --- a/OvmfPkg/PciHotPlugInitDxe/PciHotPlugInit.c +++ b/OvmfPkg/PciHotPlugInitDxe/PciHotPlugInit.c @@ -802,7 +802,7 @@ GetResourcePadding ( @param[in] ImageHandle Image handle of this driver. @param[in] SystemTable Pointer to SystemTable. - @retval EFI_SUCESS Driver has loaded successfully. + @retval EFI_SUCCESS Driver has loaded successfully. @return Error codes from lower level functions. **/ diff --git a/OvmfPkg/PlatformDxe/Platform.c b/OvmfPkg/PlatformDxe/Platform.c index 2acb547db9fb..5b3e56682ed2 100644 --- a/OvmfPkg/PlatformDxe/Platform.c +++ b/OvmfPkg/PlatformDxe/Platform.c @@ -620,7 +620,7 @@ QueryGopModes ( @param[in] GopModes Array of resolutions retrieved from the GOP. - @retval EFI_SUCESS Opcodes have been successfully produced. + @retval EFI_SUCCESS Opcodes have been successfully produced. @return Status codes from underlying functions. PackageList may have been extended with new strings. OpCodeBuffer is @@ -697,7 +697,7 @@ CreateResolutionOptions ( The drop down list of video resolutions is generated from (NumGopModes, GopModes). - @retval EFI_SUCESS Form successfully updated. + @retval EFI_SUCCESS Form successfully updated. @return Status codes from underlying functions. **/ @@ -949,7 +949,7 @@ GopInstalled ( @param[in] ImageHandle Image handle of this driver. @param[in] SystemTable Pointer to SystemTable. - @retval EFI_SUCESS Driver has loaded successfully. + @retval EFI_SUCCESS Driver has loaded successfully. @retval EFI_OUT_OF_RESOURCES Failed to install HII packages. @return Error codes from lower level functions. From 9720cccecf3ec366030ebabdcfc3ff23ed7e47a7 Mon Sep 17 00:00:00 2001 From: Gao Qihang Date: Fri, 6 Jun 2025 11:06:21 +0800 Subject: [PATCH 0047/1172] UefiCpuPkg: Fix EFI_SUCCESS typos EFI_SUCESS -> EFI_SUCCESS Signed-off-by: Gao Qihang --- UefiCpuPkg/PiSmmCpuDxeSmm/SmmMp.c | 4 ++-- UefiCpuPkg/PiSmmCpuDxeSmm/SmmMp.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmMp.c b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmMp.c index f839d1a3fd04..cf4aa7dfa51e 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmMp.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmMp.c @@ -260,14 +260,14 @@ SmmMpSetStartupProcedure ( via the use of a token, this function can be used to check for completion of the procedure on the AP. The function takes the token that was passed into the DispatchProcedure call. If the procedure is complete, and therefore it is now possible to run another procedure on the same AP, this function - returns EFI_SUCESS. In this case the status returned by the procedure that executed on the AP is + returns EFI_SUCCESS. In this case the status returned by the procedure that executed on the AP is returned in the token's Status field. If the procedure has not yet completed, then this function returns EFI_NOT_READY. When a non-blocking execution of a procedure is invoked with BroadcastProcedure, via the use of a token, this function can be used to check for completion of the procedure on all the broadcast APs. The function takes the token that was passed into the BroadcastProcedure - call. If the procedure is complete on all broadcast APs this function returns EFI_SUCESS. In this + call. If the procedure is complete on all broadcast APs this function returns EFI_SUCCESS. In this case the Status field in the token passed into the function reflects the overall result of the invocation, which may be EFI_SUCCESS, if all executions succeeded, or the first observed failure. If the procedure has not yet completed on the broadcast APs, the function returns diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmMp.h b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmMp.h index e2dac6c7d4de..e550c002cf15 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmMp.h +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmMp.h @@ -218,14 +218,14 @@ SmmMpSetStartupProcedure ( via the use of a token, this function can be used to check for completion of the procedure on the AP. The function takes the token that was passed into the DispatchProcedure call. If the procedure is complete, and therefore it is now possible to run another procedure on the same AP, this function - returns EFI_SUCESS. In this case the status returned by the procedure that executed on the AP is + returns EFI_SUCCESS. In this case the status returned by the procedure that executed on the AP is returned in the token's Status field. If the procedure has not yet completed, then this function returns EFI_NOT_READY. When a non-blocking execution of a procedure is invoked with BroadcastProcedure, via the use of a token, this function can be used to check for completion of the procedure on all the broadcast APs. The function takes the token that was passed into the BroadcastProcedure - call. If the procedure is complete on all broadcast APs this function returns EFI_SUCESS. In this + call. If the procedure is complete on all broadcast APs this function returns EFI_SUCCESS. In this case the Status field in the token passed into the function reflects the overall result of the invocation, which may be EFI_SUCCESS, if all executions succeeded, or the first observed failure. If the procedure has not yet completed on the broadcast APs, the function returns From dd5ea931ea1fac5903d459c23ec5396f8d7180a1 Mon Sep 17 00:00:00 2001 From: Gao Qihang Date: Fri, 6 Jun 2025 11:07:49 +0800 Subject: [PATCH 0048/1172] UefiPayloadPkg: Fix EFI_SUCCESS typos EFI_SUCESS -> EFI_SUCCESS Signed-off-by: Gao Qihang --- UefiPayloadPkg/FvbRuntimeDxe/FvbServiceSmm.c | 2 +- UefiPayloadPkg/PayloadLoaderPeim/FitPayloadLoaderPeim.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/UefiPayloadPkg/FvbRuntimeDxe/FvbServiceSmm.c b/UefiPayloadPkg/FvbRuntimeDxe/FvbServiceSmm.c index e2b87a74d21a..24cb1bc66d74 100644 --- a/UefiPayloadPkg/FvbRuntimeDxe/FvbServiceSmm.c +++ b/UefiPayloadPkg/FvbRuntimeDxe/FvbServiceSmm.c @@ -20,7 +20,7 @@ @param[in] InstanceNum The instance number which can be used as a ID to locate this FwhInstance in other functions. - @retval EFI_SUCESS Installed successfully. + @retval EFI_SUCCESS Installed successfully. @retval Else Did not install successfully. **/ diff --git a/UefiPayloadPkg/PayloadLoaderPeim/FitPayloadLoaderPeim.c b/UefiPayloadPkg/PayloadLoaderPeim/FitPayloadLoaderPeim.c index 0910eeb4c3e9..5d023474c206 100644 --- a/UefiPayloadPkg/PayloadLoaderPeim/FitPayloadLoaderPeim.c +++ b/UefiPayloadPkg/PayloadLoaderPeim/FitPayloadLoaderPeim.c @@ -375,7 +375,7 @@ FdtPpiNotifyCallback ( Install Pei Load File PPI. @param FileHandle Handle of the file being invoked. @param PeiServices Describes the list of possible PEI Services. - @retval EFI_SUCESS The entry point executes successfully. + @retval EFI_SUCCESS The entry point executes successfully. @retval Others Some error occurs during the execution of this function. **/ EFI_STATUS From a808062890de96d8f816aa920d9b5cf13151a40c Mon Sep 17 00:00:00 2001 From: Gao Qihang Date: Thu, 12 Jun 2025 10:12:34 +0800 Subject: [PATCH 0049/1172] MdeModulePkg: Fix function typos functin -> function Signed-off-by: Gao Qihang --- .../BootMaintenanceManagerUiLib/BootMaintenanceManager.h | 2 +- .../Library/BootMaintenanceManagerUiLib/BootOption.c | 2 +- MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSymbol.c | 6 +++--- .../Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManager.h b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManager.h index f47a563194c6..e9fc4c1bbb91 100644 --- a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManager.h +++ b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManager.h @@ -396,7 +396,7 @@ BOpt_GetBootOptions ( @param CallbackData The BMM context data. - @return EFI_SUCCESS The functin completes successfully. + @return EFI_SUCCESS The function completes successfully. @retval EFI_OUT_OF_RESOURCES Not enough memory to compete the operation. diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootOption.c b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootOption.c index ced12064c3f3..a47106d43b59 100644 --- a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootOption.c +++ b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootOption.c @@ -669,7 +669,7 @@ BOpt_GetDriverOptionNumber ( @param CallbackData The BMM context data. - @retval EFI_SUCCESS The functin completes successfully. + @retval EFI_SUCCESS The function completes successfully. @retval EFI_OUT_OF_RESOURCES Not enough memory to compete the operation. @retval EFI_NOT_FOUND Fail to get "DriverOrder" variable. diff --git a/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSymbol.c b/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSymbol.c index 834c90e32aa4..cc3b3e3eb18b 100644 --- a/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSymbol.c +++ b/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSymbol.c @@ -1773,7 +1773,7 @@ FindSymbolStr ( Get line number and offset from this line in code file. @param Line - Line buffer in code file - @param Offset - Offset to functin entry + @param Offset - Offset to function entry @return Line number @@ -1867,7 +1867,7 @@ typedef enum { Get line number from this code file. @param Entry - Symbol entry - @param FuncOffset - Offset to functin entry + @param FuncOffset - Offset to function entry @param SearchType - Search type for the code @return Line number @@ -2045,7 +2045,7 @@ EdbGetSourceStrFromCodeByLine ( Get source string from this code file. @param Entry - Symbol entry - @param FuncOffset - Offset to functin entry + @param FuncOffset - Offset to function entry @param FuncEnd - Function end @retval Funtion start diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c index 28dedad43d78..8afc4f4b8808 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c @@ -187,7 +187,7 @@ InitCommunicateBuffer ( @param[in] DataSize This size of the function header and the data. - @retval EFI_SUCCESS Success is returned from the functin in SMM. + @retval EFI_SUCCESS Success is returned from the function in SMM. @retval Others Failure is returned from the function in SMM. **/ From 3fe67222b9507a41d50c239731d07d1114cf4279 Mon Sep 17 00:00:00 2001 From: Rithvik Rama Date: Thu, 12 Jun 2025 16:12:43 -0500 Subject: [PATCH 0050/1172] EmulatorPkg: Fix enum type mismatch warning treated as error Issue: While building edk2, the compiler threw a warning that was treated as an eror which halted the build process. Root Cause: The error was due to a comparison between two different enum types. Code Fix: WinGopScreen.c: In function WinNtWndBlt, changed the comparison between an enum type "EFI_UGA_BLT_OPERATION" and "EFI_GRAPHICS_OUTPUT_BLT_OPERATION" to "EFI_UGA_BLT_OPERATION". Test: The compiled image runs successfully on QEMU. Signed-off-by: Rithvik Rama --- EmulatorPkg/Win/Host/WinGopScreen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EmulatorPkg/Win/Host/WinGopScreen.c b/EmulatorPkg/Win/Host/WinGopScreen.c index bcbd153cfdb9..cf27c34f1972 100644 --- a/EmulatorPkg/Win/Host/WinGopScreen.c +++ b/EmulatorPkg/Win/Host/WinGopScreen.c @@ -423,7 +423,7 @@ WinNtWndBlt ( return (EFI_STATUS)RStatus; } - if (BltOperation != EfiBltVideoToBltBuffer) { + if (BltOperation != EfiUgaVideoToBltBuffer) { // // Mark the area we just blted as Invalid so WM_PAINT will update. // From d297c699c9c13d6392637058f96fe37238312566 Mon Sep 17 00:00:00 2001 From: Hongbin1 Zhang Date: Fri, 6 Jun 2025 18:21:44 +0800 Subject: [PATCH 0051/1172] IntelFsp2Pkg: Add Fsp notify phase check This change included following two changes: 1. Add Fsp notify phase check, it will hang if bootloader call FSP with wrong phase 2. Remove FspMode check, due to just API mode will run the code, no need to check Signed-off-by: Hongbin1 Zhang Cc: Ray Ni Cc: Star Zeng Cc: Chasel Chiu Cc: Nate DeSimone Cc: Ted Kuo Cc: Ashraf Ali S --- .../FspNotifyPhase/FspNotifyPhasePeim.c | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.c b/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.c index c3ba9f168c3f..a58d124459f8 100644 --- a/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.c +++ b/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.c @@ -83,20 +83,29 @@ WaitForNotify ( DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP is waiting for NOTIFY\n")); FspSiliconInitDone2 (EFI_SUCCESS); + // + // Fsp notify phase check + // + DEBUG ((DEBUG_INFO | DEBUG_INIT, "Fsp Notify Phase called ...\n")); + ASSERT (GetFspApiCallingIndex () == NotifyPhaseApiIndex); + + while (GetFspApiCallingIndex () != NotifyPhaseApiIndex) { + SetFspApiReturnStatus (EFI_UNSUPPORTED); + Pei2LoaderSwitchStack (); + } + // // BootLoader called FSP again through NotifyPhase // FspWaitForNotify (); - if (GetFspGlobalDataPointer ()->FspMode == FSP_IN_API_MODE) { - // - // Should not come here - // - while (TRUE) { - DEBUG ((DEBUG_ERROR, "No FSP API should be called after FSP is DONE!\n")); - SetFspApiReturnStatus (EFI_UNSUPPORTED); - Pei2LoaderSwitchStack (); - } + // + // Should not come here + // + while (TRUE) { + DEBUG ((DEBUG_ERROR, "No FSP API should be called after FSP is DONE!\n")); + SetFspApiReturnStatus (EFI_UNSUPPORTED); + Pei2LoaderSwitchStack (); } return EFI_SUCCESS; From 1b26c4b73b27386f187fabe37810d3e2c055dc43 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Wed, 28 May 2025 15:58:14 -0400 Subject: [PATCH 0052/1172] MdeModulePkg: Refactor MM Services Tables linked in MM Core Perf Lib The code used a `MmServicesTableLib` dependency for both the Standalone MM and Traditional MM instances and shared code between those. There is not a readily available `MmServicesTable` lib instance for Traditional SMM (that can link to `PiSmmCore`). To ease integration and prevent creating an instance just for this case, this change uses `SmmServicesTableLib` in the Traditional SMM instance and `MmServicesTableLib` in the Standalone MM instance and moves code as necessary to accommodate this. For general reference, there are two available instances of `MmServicesTableLib`: - MdePkg/MmServicesTableLib - only supports DXE_SMM drivers. - MdePkg/StandaloneMmServicesTableLib - supports both MM drivers and MM cores. Signed-off-by: Michael Kubacki --- .../MmCorePerformanceLib.c | 63 ------------------- .../SmmCorePerformanceLib.c | 42 ++++++++++++- .../SmmCorePerformanceLib.inf | 2 +- .../SmmCorePerformanceLibInternal.h | 52 ++++++++++++++- .../StandaloneMmCorePerformanceLib.c | 63 ++++++++++++++++++- 5 files changed, 155 insertions(+), 67 deletions(-) diff --git a/MdeModulePkg/Library/SmmCorePerformanceLib/MmCorePerformanceLib.c b/MdeModulePkg/Library/SmmCorePerformanceLib/MmCorePerformanceLib.c index d335c7ccaa99..8982df0f06c6 100644 --- a/MdeModulePkg/Library/SmmCorePerformanceLib/MmCorePerformanceLib.c +++ b/MdeModulePkg/Library/SmmCorePerformanceLib/MmCorePerformanceLib.c @@ -42,13 +42,6 @@ UINT32 mCachedLength = 0; UINT32 mBootRecordSize = 0; BOOLEAN mPerformanceMeasurementEnabled; -// -// Interfaces for SMM PerformanceMeasurement Protocol. -// -EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL mPerformanceMeasurementInterface = { - CreatePerformanceMeasurement, -}; - /** Return the module name and optionally module GUID for a given handle. @@ -914,62 +907,6 @@ SmmCorePerformanceLibExitBootServicesCallback ( return EFI_SUCCESS; } -/** - Common initialization code for the MM Core Performance Library. - - @param[in] ExitBootServicesProtocolGuid The GUID of the ExitBootServices protocol. - - @retval EFI_SUCCESS The MM Core Performance Library was initialized successfully. - @retval Others The MM Core Performance Library was not initialized successfully. - **/ -EFI_STATUS -InitializeMmCorePerformanceLibCommon ( - IN CONST EFI_GUID *ExitBootServicesProtocolGuid - ) -{ - EFI_STATUS Status; - EFI_HANDLE Handle; - EFI_HANDLE MmiHandle; - VOID *Registration; - - // - // Initialize spin lock - // - InitializeSpinLock (&mSmmFpdtLock); - - // - // Install the protocol interfaces for MM performance library instance. - // - Handle = NULL; - Status = gMmst->MmInstallProtocolInterface ( - &Handle, - &gEdkiiSmmPerformanceMeasurementProtocolGuid, - EFI_NATIVE_INTERFACE, - &mPerformanceMeasurementInterface - ); - ASSERT_EFI_ERROR (Status); - - // - // Register MMI handler. - // - MmiHandle = NULL; - Status = gMmst->MmiHandlerRegister (FpdtSmiHandler, &gEfiFirmwarePerformanceGuid, &MmiHandle); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Register callback function for ExitBootServices event. - // - Status = gMmst->MmRegisterProtocolNotify ( - ExitBootServicesProtocolGuid, - SmmCorePerformanceLibExitBootServicesCallback, - &Registration - ); - - return Status; -} - /** Create performance record with event description and a timestamp. diff --git a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.c b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.c index 20aa250b7343..96bff3056160 100644 --- a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.c +++ b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.c @@ -26,6 +26,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include +#include #include #include #include @@ -33,6 +34,12 @@ SPDX-License-Identifier: BSD-2-Clause-Patent PERFORMANCE_PROPERTY mPerformanceProperty; +extern SPIN_LOCK mSmmFpdtLock; + +EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL mPerformanceMeasurementInterface = { + CreatePerformanceMeasurement, +}; + /** A library internal MM-instance specific implementation to check if a buffer outside MM is valid. @@ -192,10 +199,43 @@ InitializeSmmCorePerformanceLib ( { EFI_STATUS Status; PERFORMANCE_PROPERTY *PerformanceProperty; + EFI_HANDLE Handle; + EFI_HANDLE MmiHandle; + VOID *Registration; + + // + // Initialize spin lock + // + InitializeSpinLock (&mSmmFpdtLock); + + // + // Install the protocol interfaces for MM performance library instance. + // + Handle = NULL; + Status = gSmst->SmmInstallProtocolInterface ( + &Handle, + &gEdkiiSmmPerformanceMeasurementProtocolGuid, + EFI_NATIVE_INTERFACE, + &mPerformanceMeasurementInterface + ); + ASSERT_EFI_ERROR (Status); - Status = InitializeMmCorePerformanceLibCommon (&gEdkiiSmmExitBootServicesProtocolGuid); + // + // Register MMI handler. + // + MmiHandle = NULL; + Status = gSmst->SmiHandlerRegister (FpdtSmiHandler, &gEfiFirmwarePerformanceGuid, &MmiHandle); ASSERT_EFI_ERROR (Status); + // + // Register callback function for ExitBootServices event. + // + Status = gSmst->SmmRegisterProtocolNotify ( + &gEdkiiSmmExitBootServicesProtocolGuid, + SmmCorePerformanceLibExitBootServicesCallback, + &Registration + ); + Status = EfiGetSystemConfigurationTable (&gPerformanceProtocolGuid, (VOID **)&PerformanceProperty); if (EFI_ERROR (Status)) { // diff --git a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.inf b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.inf index d5e6284736a5..b9224637a63e 100644 --- a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.inf +++ b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.inf @@ -47,10 +47,10 @@ DebugLib DxeServicesLib MemoryAllocationLib - MmServicesTableLib PcdLib PeCoffGetEntryPointLib SmmMemLib + SmmServicesTableLib SynchronizationLib TimerLib UefiBootServicesTableLib diff --git a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLibInternal.h b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLibInternal.h index 7ff210520cde..bc1757c9a5e6 100644 --- a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLibInternal.h +++ b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLibInternal.h @@ -24,7 +24,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include -#include #include #include #include @@ -45,6 +44,57 @@ extern BOOLEAN mPerformanceMeasurementEnabled; // Library internal function declarations // +/** + Communication service SMI Handler entry. + + This SMI handler provides services for report MM boot records. + + Caution: This function may receive untrusted input. + Communicate buffer and buffer size are external input, so this function will do basic validation. + + @param[in] DispatchHandle The unique handle assigned to this handler by SmiHandlerRegister(). + @param[in] RegisterContext Points to an optional handler context which was specified when the + handler was registered. + @param[in, out] CommBuffer A pointer to a collection of data in memory that will + be conveyed from a non-MM environment into an MM environment. + @param[in, out] CommBufferSize The size of the CommBuffer. + + @retval EFI_SUCCESS The interrupt was handled and quiesced. No other handlers + should still be called. + @retval EFI_WARN_INTERRUPT_SOURCE_QUIESCED The interrupt has been quiesced but other handlers should + still be called. + @retval EFI_WARN_INTERRUPT_SOURCE_PENDING The interrupt is still pending and other handlers should still + be called. + @retval EFI_INTERRUPT_PENDING The interrupt could not be quiesced. + +**/ +EFI_STATUS +EFIAPI +FpdtSmiHandler ( + IN EFI_HANDLE DispatchHandle, + IN CONST VOID *RegisterContext, + IN OUT VOID *CommBuffer, + IN OUT UINTN *CommBufferSize + ); + +/** + This is the Event call back function is triggered in SMM to notify the Library + the system is entering runtime phase. + + @param[in] Protocol Points to the protocol's unique identifier + @param[in] Interface Points to the interface instance + @param[in] Handle The handle on which the interface was installed + + @retval EFI_SUCCESS SmmAtRuntimeCallBack runs successfully + **/ +EFI_STATUS +EFIAPI +SmmCorePerformanceLibExitBootServicesCallback ( + IN CONST EFI_GUID *Protocol, + IN VOID *Interface, + IN EFI_HANDLE Handle + ); + /** Return a pointer to the loaded image protocol for the given handle. diff --git a/MdeModulePkg/Library/SmmCorePerformanceLib/StandaloneMmCorePerformanceLib.c b/MdeModulePkg/Library/SmmCorePerformanceLib/StandaloneMmCorePerformanceLib.c index d6fae6bb88ab..55ec50713afd 100644 --- a/MdeModulePkg/Library/SmmCorePerformanceLib/StandaloneMmCorePerformanceLib.c +++ b/MdeModulePkg/Library/SmmCorePerformanceLib/StandaloneMmCorePerformanceLib.c @@ -17,8 +17,15 @@ #include "SmmCorePerformanceLibInternal.h" #include +#include #include +extern SPIN_LOCK mSmmFpdtLock; + +EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL mPerformanceMeasurementInterface = { + CreatePerformanceMeasurement, +}; + /** A library internal MM-instance specific implementation to check if a buffer outside MM is valid. @@ -109,6 +116,60 @@ GetNameFromUiSection ( return EFI_NOT_FOUND; } +/** + Initializes the MM Core Performance library. + + @retval EFI_SUCCESS The performance library was initialized successfully. + @retval Other An error occurred during initialization. +**/ +EFI_STATUS +EFIAPI +InitializeStandaloneMmCorePerformanceLib ( + VOID + ) +{ + EFI_STATUS Status; + EFI_HANDLE Handle; + EFI_HANDLE MmiHandle; + VOID *Registration; + + // + // Initialize spin lock + // + InitializeSpinLock (&mSmmFpdtLock); + // + // Install the protocol interfaces for MM performance library instance. + // + Handle = NULL; + Status = gMmst->MmInstallProtocolInterface ( + &Handle, + &gEdkiiSmmPerformanceMeasurementProtocolGuid, + EFI_NATIVE_INTERFACE, + &mPerformanceMeasurementInterface + ); + ASSERT_EFI_ERROR (Status); + + // + // Register MMI handler. + // + MmiHandle = NULL; + Status = gMmst->MmiHandlerRegister (FpdtSmiHandler, &gEfiFirmwarePerformanceGuid, &MmiHandle); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Register callback function for ExitBootServices event. + // + Status = gMmst->MmRegisterProtocolNotify ( + &gEfiEventExitBootServicesGuid, + SmmCorePerformanceLibExitBootServicesCallback, + &Registration + ); + + return Status; +} + /** The constructor function initializes the Standalone MM Core performance library. @@ -140,7 +201,7 @@ StandaloneMmCorePerformanceLibConstructor ( return EFI_SUCCESS; } - Status = InitializeMmCorePerformanceLibCommon (&gEfiEventExitBootServicesGuid); + Status = InitializeStandaloneMmCorePerformanceLib (); ASSERT_EFI_ERROR (Status); return EFI_SUCCESS; From 73ecd7d8b22c3a366bf8ddd834a66d1f0ced6588 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 19 May 2025 11:29:25 -0700 Subject: [PATCH 0053/1172] MdeModulePkg/SpiNorFlashJedecSfdp: Initialize AddressSize Signed-off-by: Michael D Kinney --- MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.c | 1 + 1 file changed, 1 insertion(+) diff --git a/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.c b/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.c index 14202f0ea572..ae8abda73479 100644 --- a/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.c +++ b/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.c @@ -63,6 +63,7 @@ FillWriteBuffer ( // Copy Opcode into Write Buffer Instance->SpiTransactionWriteBuffer[0] = Opcode; Index = 1; + AddressSize = 0; if (UseAddress) { if (AddressBytesSupported == SPI_ADDR_3BYTE_ONLY) { if (SfdpAddressBytes != 0) { From 724394ebe24d619d1f7de1220911e0fb917de0a4 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 19 May 2025 11:30:15 -0700 Subject: [PATCH 0054/1172] MdeModulePkg/DebugSupportDxe: Fix type mismatches The RegisteredCallback field of IdtEntryTable is used to store the address of functions with different function prototypes depending on the ExceptionType. Add local variables with the correct function prototypes and evaluate the ExceptionType to assign correct local variable to the RegisteredCallback value and use local variable to call the registered callback function with the correct arguments for the ExceptionType. Update declaration of InterruptDistrubutionHub() to use the non-CPU specific EFI_SYSTEM_CONTEXT parameter type instead of the IA32 specific EFI_SYSTEM_CONTEXT_IA32 because this function is used for both IA32 and X64. Signed-off-by: Michael D Kinney --- .../DebugSupportDxe/Ia32/PlDebugSupport.c | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/MdeModulePkg/Universal/DebugSupportDxe/Ia32/PlDebugSupport.c b/MdeModulePkg/Universal/DebugSupportDxe/Ia32/PlDebugSupport.c index 40fe74d8c236..2291985bc73b 100644 --- a/MdeModulePkg/Universal/DebugSupportDxe/Ia32/PlDebugSupport.c +++ b/MdeModulePkg/Universal/DebugSupportDxe/Ia32/PlDebugSupport.c @@ -262,17 +262,24 @@ InvalidateInstructionCache ( **/ VOID InterruptDistrubutionHub ( - EFI_EXCEPTION_TYPE ExceptionType, - EFI_SYSTEM_CONTEXT_IA32 *ContextRecord + IN EFI_EXCEPTION_TYPE ExceptionType, + IN EFI_SYSTEM_CONTEXT ContextRecord ) { - if (IdtEntryTable[ExceptionType].RegisteredCallback != NULL) { - if (ExceptionType != SYSTEM_TIMER_VECTOR) { - IdtEntryTable[ExceptionType].RegisteredCallback (ExceptionType, ContextRecord); - } else { - OrigVector = IdtEntryTable[ExceptionType].OrigVector; - IdtEntryTable[ExceptionType].RegisteredCallback (ContextRecord); - } + EFI_EXCEPTION_CALLBACK ExceptionCallback; + EFI_PERIODIC_CALLBACK PeriodicCallback; + + if (IdtEntryTable[ExceptionType].RegisteredCallback == NULL) { + return; + } + + if (ExceptionType == SYSTEM_TIMER_VECTOR) { + OrigVector = IdtEntryTable[ExceptionType].OrigVector; + PeriodicCallback = (EFI_PERIODIC_CALLBACK)IdtEntryTable[ExceptionType].RegisteredCallback; + PeriodicCallback (ContextRecord); + } else { + ExceptionCallback = (EFI_EXCEPTION_CALLBACK)IdtEntryTable[ExceptionType].RegisteredCallback; + ExceptionCallback (ExceptionType, ContextRecord); } } From cbbd0f747f81acabc744d9f5101a018595062fbd Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 19 May 2025 12:19:00 -0700 Subject: [PATCH 0055/1172] SecurityPkg/Spdm: Use spdmlib enums for spdmlib calls Fix CLANG 20.1.0 enum conversion errors Address implied conversion between enum types by using the enum type from spdmlib and remove the enum types that are never used after this update. Signed-off-by: Michael D Kinney --- .../SpdmLib/Include/Stub/SpdmLibStub.h | 195 ------------------ .../SpdmSecurityLib/SpdmAuthentication.c | 12 +- .../SpdmSecurityLib/SpdmConnectionInit.c | 22 +- .../SpdmSecurityLib/SpdmMeasurement.c | 8 +- 4 files changed, 21 insertions(+), 216 deletions(-) diff --git a/SecurityPkg/DeviceSecurity/SpdmLib/Include/Stub/SpdmLibStub.h b/SecurityPkg/DeviceSecurity/SpdmLib/Include/Stub/SpdmLibStub.h index 8ec6e6167573..e79c705f03c9 100644 --- a/SecurityPkg/DeviceSecurity/SpdmLib/Include/Stub/SpdmLibStub.h +++ b/SecurityPkg/DeviceSecurity/SpdmLib/Include/Stub/SpdmLibStub.h @@ -84,201 +84,6 @@ typedef struct { #define SPDM_DATA_PARAMETER libspdm_data_parameter_t -typedef enum { - // - // SPDM parameter - // - SpdmDataSpdmVersion, - SpdmDataSecuredMessageVersion, - // - // SPDM capability - // - SpdmDataCapabilityFlags, - SpdmDataCapabilityCTExponent, - SpdmDataCapabilityRttUs, - SpdmDataCapabilityDataTransferSize, - SpdmDataCapabilityMaxSpdmMsgSize, - SpdmDataCapabilitySenderDataTransferSize, - - // - // SPDM Algorithm setting - // - SpdmDataMeasurementSpec, - SpdmDataMeasurementHashAlgo, - SpdmDataBaseAsymAlgo, - SpdmDataBaseHashAlgo, - SpdmDataDHENameGroup, - SpdmDataAEADCipherSuite, - SpdmDataReqBaseAsymAlg, - SpdmDataKeySchedule, - SpdmDataOtherParamsSupport, - SpdmDataMelSpec, - - // - // Connection State - // - SpdmDataConnectionState, - // - // ResponseState - // - SpdmDataResponseState, - // - // Certificate info - // - SpdmDataLocalPublicCertChain, - SpdmDataPeerPublicRootCert, - SpdmDataPeerPublicKey, - SpdmDataLocalPublicKey, - SpdmDataLocalSupportedSlotMask, - SpdmDataLocalKeyPairId, - SpdmDataLocalCertInfo, - SpdmDataLocalKeyUsageBitMask, - - SpdmDataBasicMutAuthRequested, - SpdmDataMutAuthRequested, - SpdmDataHeartBeatPeriod, - // - // Negotiated result - // - SpdmDataPeerUsedCertChainBuffer, - SpdmDataPeerSlotMask, - SpdmDataPeerProvisionedSlotMask = SpdmDataPeerSlotMask, - SpdmDataPeerSupportedSlotMask, - SpdmDataPeerTotalDigestBuffer, - SpdmDataPeerKeyPairId, - SpdmDataPeerCertInfo, - SpdmDataPeerKeyUsageBitMask, - - // - // Pre-shared Key Hint - // If PSK is present, then PSK_EXCHANGE is used. - // Otherwise, the KEY_EXCHANGE is used. - // - SpdmDataPskHint, - // - // SessionData - // - SpdmDataSessionUsePsk, - SpdmDataSessionMutAuthRequested, - SpdmDataSessionEndSessionAttributes, - SpdmDataSessionPolicy, - - SpdmDataAppContextData, - - SpdmDataHandleErrorReturnPolicy, - - /* VCA cached for CACHE_CAP in 1.2 for transcript.*/ - SpdmDataVcaCache, - - /* if the context is for a requester. It only needs to be set in VCA cache.*/ - SpdmDataIsRequester, - - // If the Responder replies with a Busy `ERROR` response to a request - // then the Requester is free to retry sending the request. - // This value specifies the maximum number of times libspdm will retry - // sending the request before returning an error. - // If its value is 0 then libspdm will not send any retry requests. - SpdmDataRequestRetryTimes, - - // If the Responder replies with a Busy `ERROR` response to a request - // then the Requester is free to retry sending the request. - // This value specifies the delay time in microseconds between each retry requests. - // If its value is 0 then libspdm will send retry request immediately. - SpdmDataRequestRetryDelayTime, - - /* limit the number of DHE session and PSK session separately.*/ - SpdmDataMaxDheSessionConut, - SpdmDataMaxPskSessionConut, - - SpdmDataSessionSequenceNumberRspDir, - SpdmDataSessionSequenceNumberReqDir, - SpdmDataMaxSessionSequenceNumber, - - /* For SPDM 1.0 and 1.1, allow signature verification in big, little, or both endians. */ - SpdmDataSpdmVersion1011VerifySigatureEndian, - - SpdmDataSequenceNumberEndian, - SpdmDataSessionSequenceNumberEndian, - - SpdmDataMultiKeyConnReq, - SpdmDataMultiKeyConnRsp, - // - // MAX - // - SpdmDataMax, -} SPDM_DATA_TYPE; - -typedef enum { - SpdmDataLocationLocal, - SpdmDataLocationConnection, - SpdmDataLocationSession, - SpdmDataLocationMax, -} SPDM_DATA_LOCATION; - -typedef enum { - // - // Before GET_VERSION/VERSION - // - SpdmConnectionStateNotStarted, - // - // After GET_VERSION/VERSION - // - SpdmConnectionStateAfterVersion, - // - // After GET_CAPABILITIES/CAPABILITIES - // - SpdmConnectionStateAfterCapabilities, - // - // After NEGOTIATE_ALGORITHMS/ALGORITHMS - // - SpdmConnectionStateNegotiated, - // - // After GET_DIGESTS/DIGESTS - // - SpdmConnectionStateAfterDigests, - // - // After GET_CERTIFICATE/CERTIFICATE - // - SpdmConnectionStateAfterCertificate, - // - // After CHALLENGE/CHALLENGE_AUTH, and ENCAP CALLENGE/CHALLENG_AUTH if MUT_AUTH is enabled. - // - SpdmConnectionStateAuthenticated, - // - // MAX - // - SpdmConnectionStateMax, -} SPDM_CONNECTION_STATE; - -typedef enum { - // - // Normal response. - // - SpdmResponseStateNormal, - // - // Other component is busy. - // - SpdmResponseStateBusy, - #if LIBSPDM_RESPOND_IF_READY_SUPPORT - // - // Hardware is not ready. - // - SpdmResponseStateNotReady, - #endif /* LIBSPDM_RESPOND_IF_READY_SUPPORT */ - // - // Firmware Update is done. Need resync. - // - SpdmResponseStateNeedResync, - // - // Processing Encapsulated message. - // - SpdmResponseStateProcessingEncap, - // - // MAX - // - SpdmResponseStateMax, -} SPDM_RESPONSE_STATE; - /* DOE header*/ typedef struct { diff --git a/SecurityPkg/DeviceSecurity/SpdmSecurityLib/SpdmAuthentication.c b/SecurityPkg/DeviceSecurity/SpdmSecurityLib/SpdmAuthentication.c index 0b2a90a2bbda..bde71eadabfa 100644 --- a/SecurityPkg/DeviceSecurity/SpdmSecurityLib/SpdmAuthentication.c +++ b/SecurityPkg/DeviceSecurity/SpdmSecurityLib/SpdmAuthentication.c @@ -136,9 +136,9 @@ ExtendCertificate ( EventLog = NULL; ZeroMem (&Parameter, sizeof (Parameter)); - Parameter.location = SpdmDataLocationConnection; + Parameter.location = LIBSPDM_DATA_LOCATION_CONNECTION; DataSize = sizeof (BaseHashAlgo); - Status = SpdmGetData (SpdmContext, SpdmDataBaseHashAlgo, &Parameter, &BaseHashAlgo, &DataSize); + Status = SpdmGetData (SpdmContext, LIBSPDM_DATA_BASE_HASH_ALGO, &Parameter, &BaseHashAlgo, &DataSize); ASSERT_EFI_ERROR (Status); DeviceContextSize = GetDeviceMeasurementContextSize (SpdmDeviceContext); @@ -520,9 +520,9 @@ DoDeviceCertificate ( SpdmContext = SpdmDeviceContext->SpdmContext; ZeroMem (&Parameter, sizeof (Parameter)); - Parameter.location = SpdmDataLocationConnection; + Parameter.location = LIBSPDM_DATA_LOCATION_CONNECTION; DataSize = sizeof (CapabilityFlags); - SpdmReturn = SpdmGetData (SpdmContext, SpdmDataCapabilityFlags, &Parameter, &CapabilityFlags, &DataSize); + SpdmReturn = SpdmGetData (SpdmContext, LIBSPDM_DATA_CAPABILITY_FLAGS, &Parameter, &CapabilityFlags, &DataSize); if (LIBSPDM_STATUS_IS_ERROR (SpdmReturn)) { SecurityState->AuthenticationState = EDKII_DEVICE_SECURITY_STATE_ERROR_DEVICE_ERROR; return EFI_DEVICE_ERROR; @@ -643,9 +643,9 @@ DoDeviceAuthentication ( SpdmContext = SpdmDeviceContext->SpdmContext; ZeroMem (&Parameter, sizeof (Parameter)); - Parameter.location = SpdmDataLocationConnection; + Parameter.location = LIBSPDM_DATA_LOCATION_CONNECTION; DataSize = sizeof (CapabilityFlags); - SpdmReturn = SpdmGetData (SpdmContext, SpdmDataCapabilityFlags, &Parameter, &CapabilityFlags, &DataSize); + SpdmReturn = SpdmGetData (SpdmContext, LIBSPDM_DATA_CAPABILITY_FLAGS, &Parameter, &CapabilityFlags, &DataSize); if (LIBSPDM_STATUS_IS_ERROR (SpdmReturn)) { SecurityState->AuthenticationState = EDKII_DEVICE_SECURITY_STATE_ERROR_DEVICE_ERROR; return EFI_DEVICE_ERROR; diff --git a/SecurityPkg/DeviceSecurity/SpdmSecurityLib/SpdmConnectionInit.c b/SecurityPkg/DeviceSecurity/SpdmSecurityLib/SpdmConnectionInit.c index ad908be9ce3f..4cf86a30197f 100644 --- a/SecurityPkg/DeviceSecurity/SpdmSecurityLib/SpdmConnectionInit.c +++ b/SecurityPkg/DeviceSecurity/SpdmSecurityLib/SpdmConnectionInit.c @@ -338,8 +338,8 @@ CreateSpdmDeviceContext ( DataSize = DbList->SignatureSize - sizeof (EFI_GUID); ZeroMem (&Parameter, sizeof (Parameter)); - Parameter.location = SpdmDataLocationLocal; - SpdmReturn = SpdmSetData (SpdmContext, SpdmDataPeerPublicRootCert, &Parameter, Data, DataSize); + Parameter.location = LIBSPDM_DATA_LOCATION_LOCAL; + SpdmReturn = SpdmSetData (SpdmContext, LIBSPDM_DATA_PEER_PUBLIC_ROOT_CERT, &Parameter, Data, DataSize); if (LIBSPDM_STATUS_IS_ERROR (SpdmReturn)) { if (SpdmReturn == LIBSPDM_STATUS_BUFFER_FULL) { Status = RecordConnectionFailureStatus ( @@ -366,22 +366,22 @@ CreateSpdmDeviceContext ( Data8 = 0; ZeroMem (&Parameter, sizeof (Parameter)); - Parameter.location = SpdmDataLocationLocal; - SpdmReturn = SpdmSetData (SpdmContext, SpdmDataCapabilityCTExponent, &Parameter, &Data8, sizeof (Data8)); + Parameter.location = LIBSPDM_DATA_LOCATION_LOCAL; + SpdmReturn = SpdmSetData (SpdmContext, LIBSPDM_DATA_CAPABILITY_CT_EXPONENT, &Parameter, &Data8, sizeof (Data8)); if (LIBSPDM_STATUS_IS_ERROR (SpdmReturn)) { ASSERT (FALSE); goto Error; } Data32 = 0; - SpdmReturn = SpdmSetData (SpdmContext, SpdmDataCapabilityFlags, &Parameter, &Data32, sizeof (Data32)); + SpdmReturn = SpdmSetData (SpdmContext, LIBSPDM_DATA_CAPABILITY_FLAGS, &Parameter, &Data32, sizeof (Data32)); if (LIBSPDM_STATUS_IS_ERROR (SpdmReturn)) { ASSERT (FALSE); goto Error; } Data8 = SPDM_MEASUREMENT_SPECIFICATION_DMTF; - SpdmReturn = SpdmSetData (SpdmContext, SpdmDataMeasurementSpec, &Parameter, &Data8, sizeof (Data8)); + SpdmReturn = SpdmSetData (SpdmContext, LIBSPDM_DATA_MEASUREMENT_SPEC, &Parameter, &Data8, sizeof (Data8)); if (LIBSPDM_STATUS_IS_ERROR (SpdmReturn)) { ASSERT (FALSE); goto Error; @@ -398,7 +398,7 @@ CreateSpdmDeviceContext ( SPDM_ALGORITHMS_BASE_ASYM_ALGO_TPM_ALG_ECDSA_ECC_NIST_P521; } - SpdmReturn = SpdmSetData (SpdmContext, SpdmDataBaseAsymAlgo, &Parameter, &Data32, sizeof (Data32)); + SpdmReturn = SpdmSetData (SpdmContext, LIBSPDM_DATA_BASE_ASYM_ALGO, &Parameter, &Data32, sizeof (Data32)); if (LIBSPDM_STATUS_IS_ERROR (SpdmReturn)) { ASSERT (FALSE); goto Error; @@ -412,14 +412,14 @@ CreateSpdmDeviceContext ( SPDM_ALGORITHMS_BASE_HASH_ALGO_TPM_ALG_SHA_512; } - SpdmReturn = SpdmSetData (SpdmContext, SpdmDataBaseHashAlgo, &Parameter, &Data32, sizeof (Data32)); + SpdmReturn = SpdmSetData (SpdmContext, LIBSPDM_DATA_BASE_HASH_ALGO, &Parameter, &Data32, sizeof (Data32)); if (LIBSPDM_STATUS_IS_ERROR (SpdmReturn)) { ASSERT (FALSE); goto Error; } Data8 = SPDM_ALGORITHMS_OPAQUE_DATA_FORMAT_1; - SpdmSetData (SpdmContext, SpdmDataOtherParamsSupport, &Parameter, &Data8, sizeof (Data8)); + SpdmSetData (SpdmContext, LIBSPDM_DATA_OTHER_PARAMS_SUPPORT, &Parameter, &Data8, sizeof (Data8)); if (LIBSPDM_STATUS_IS_ERROR (SpdmReturn)) { DEBUG ((DEBUG_ERROR, "SpdmSetDataOtherParamsSupport - %p\n", SpdmReturn)); ASSERT (FALSE); @@ -441,9 +441,9 @@ CreateSpdmDeviceContext ( } ZeroMem (&Parameter, sizeof (Parameter)); - Parameter.location = SpdmDataLocationConnection; + Parameter.location = LIBSPDM_DATA_LOCATION_CONNECTION; DataSize = sizeof (Data16); - SpdmReturn = SpdmGetData (SpdmContext, SpdmDataSpdmVersion, &Parameter, &Data16, &DataSize); + SpdmReturn = SpdmGetData (SpdmContext, LIBSPDM_DATA_SPDM_VERSION, &Parameter, &Data16, &DataSize); if (LIBSPDM_STATUS_IS_ERROR (SpdmReturn)) { DEBUG ((DEBUG_ERROR, "SpdmGetData - %p\n", SpdmReturn)); goto Error; diff --git a/SecurityPkg/DeviceSecurity/SpdmSecurityLib/SpdmMeasurement.c b/SecurityPkg/DeviceSecurity/SpdmSecurityLib/SpdmMeasurement.c index f94ec1e7bf27..63c9ef776c6e 100644 --- a/SecurityPkg/DeviceSecurity/SpdmSecurityLib/SpdmMeasurement.c +++ b/SecurityPkg/DeviceSecurity/SpdmSecurityLib/SpdmMeasurement.c @@ -209,9 +209,9 @@ ExtendMeasurement ( EventLog = NULL; ZeroMem (&Parameter, sizeof (Parameter)); - Parameter.location = SpdmDataLocationConnection; + Parameter.location = LIBSPDM_DATA_LOCATION_CONNECTION; DataSize = sizeof (MeasurementHashAlgo); - Status = SpdmGetData (SpdmContext, SpdmDataMeasurementHashAlgo, &Parameter, &MeasurementHashAlgo, &DataSize); + Status = SpdmGetData (SpdmContext, LIBSPDM_DATA_MEASUREMENT_HASH_ALGO, &Parameter, &MeasurementHashAlgo, &DataSize); ASSERT_EFI_ERROR (Status); if (MeasurementRecord != NULL) { @@ -531,9 +531,9 @@ DoDeviceMeasurement ( SpdmContext = SpdmDeviceContext->SpdmContext; ZeroMem (&Parameter, sizeof (Parameter)); - Parameter.location = SpdmDataLocationConnection; + Parameter.location = LIBSPDM_DATA_LOCATION_CONNECTION; DataSize = sizeof (CapabilityFlags); - SpdmGetData (SpdmContext, SpdmDataCapabilityFlags, &Parameter, &CapabilityFlags, &DataSize); + SpdmGetData (SpdmContext, LIBSPDM_DATA_CAPABILITY_FLAGS, &Parameter, &CapabilityFlags, &DataSize); if ((CapabilityFlags & SPDM_GET_CAPABILITIES_RESPONSE_FLAGS_MEAS_CAP_SIG) == 0) { AuthState = TCG_DEVICE_SECURITY_EVENT_DATA_DEVICE_AUTH_STATE_FAIL_NO_SIG; From 18164e8c697557343092f305fc654de7b7261589 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 19 May 2025 12:22:14 -0700 Subject: [PATCH 0056/1172] SecurityPkg/SpdmCryptLib: Fix CLANG 20.1.0 error Some of the spdmlib crypto functions return 'false' in functions that return a pointer to indicate a null return. false is mapped to FALSE to cover other usages to return a boolean value. Add -Wno-non-literal-null-conversion for CLANGPDB and CLANGDWARF to ignore these types of errors from CLANG builds within this one library build that uses the spdmlib git submodule. Signed-off-by: Michael D Kinney --- SecurityPkg/DeviceSecurity/SpdmLib/SpdmCryptLib.inf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/SecurityPkg/DeviceSecurity/SpdmLib/SpdmCryptLib.inf b/SecurityPkg/DeviceSecurity/SpdmLib/SpdmCryptLib.inf index 5e9196857674..80f6c7273cde 100644 --- a/SecurityPkg/DeviceSecurity/SpdmLib/SpdmCryptLib.inf +++ b/SecurityPkg/DeviceSecurity/SpdmLib/SpdmCryptLib.inf @@ -43,3 +43,7 @@ BaseCryptLib RngLib MemLibWrapper + +[BuildOptions] + *_CLANGPDB_*_CC_FLAGS = -Wno-non-literal-null-conversion + *_CLANGDWARF_*_CC_FLAGS = -Wno-non-literal-null-conversion From 62549edb9f52036dbba5a07a30859a6f590ba90b Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 19 May 2025 12:34:46 -0700 Subject: [PATCH 0057/1172] StandaloneMmPlg/StandaloneMmIpPei: Fix use without initialization Update logic to prevent case where PlatformHobList may be used without being initialized. Check for expected return statuses and values from first call to CreateMmPlatformHob(). Remove use of CpuDeadLoop() and instead make consistent use of DEBUG_ERROR log messages and ASSERT()s to detect unexpected failures determining the size and allocating the platform HOB List for the Standalone MM environment. Fix potential memory leak when the expected allocation size does not match the actual allocation size. Fixes a build error detected with CLANG 20.1.0. Signed-off-by: Michael D Kinney --- .../StandaloneMmIplPei/StandaloneMmIplPei.c | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c index b496c7ce7858..9360d2c756d0 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c @@ -411,24 +411,35 @@ CreatMmHobList ( PlatformHobSize = 0; Status = CreateMmPlatformHob (NULL, &PlatformHobSize); if (Status == RETURN_BUFFER_TOO_SMALL) { - ASSERT (PlatformHobSize != 0); + if (PlatformHobSize == 0) { + DEBUG ((DEBUG_ERROR, "%a: PlatformHobSize is zero, cannot create MM HOBs\n", __func__)); + ASSERT (PlatformHobSize != 0); + return NULL; + } + // // Create platform HOBs for MM foundation to get MMIO HOB data. // PlatformHobList = AllocatePages (EFI_SIZE_TO_PAGES (PlatformHobSize)); - ASSERT (PlatformHobList != NULL); if (PlatformHobList == NULL) { DEBUG ((DEBUG_ERROR, "%a: Out of resource to create platform MM HOBs\n", __func__)); - CpuDeadLoop (); + ASSERT (PlatformHobList != NULL); + return NULL; } BufferSize = PlatformHobSize; Status = CreateMmPlatformHob (PlatformHobList, &PlatformHobSize); - ASSERT_EFI_ERROR (Status); - ASSERT (BufferSize == PlatformHobSize); + if (BufferSize != PlatformHobSize) { + DEBUG ((DEBUG_ERROR, "%a: CreateMmPlatformHob returned unexpected size (%d != %d)\n", __func__, BufferSize, PlatformHobSize)); + FreePages (PlatformHobList, EFI_SIZE_TO_PAGES (PlatformHobSize)); + return NULL; + } } - ASSERT_EFI_ERROR (Status); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: CreateMmPlatformHob failed (%r)\n", __func__, Status)); + return NULL; + } // // Build memory allocation HOB in PEI HOB list for MM profile data. From 6c1fd8d56776ca54c2f43b9c94f297320d6424eb Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 19 May 2025 13:20:14 -0700 Subject: [PATCH 0058/1172] RedfishPkg/RedfishLib: Fix enum type mismatch Fix enum type mismatch between jansson library and JsonLib. Signed-off-by: Michael D Kinney --- .../PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c index 8fb24a5928a3..bb287f2de4c0 100644 --- a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c +++ b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c @@ -525,7 +525,7 @@ getOpResult ( } stringProp = prop->json; - jsonType = JsonGetType (prop->json); + jsonType = (json_type)JsonGetType (prop->json); switch (jsonType) { case JSON_OBJECT: stringProp = json_object_get (prop->json, propName); From 02e967f1e462a540f430b77248516322189e9b63 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 19 May 2025 13:21:15 -0700 Subject: [PATCH 0059/1172] RedfishPkg/JsonLib: Use same defines for MSFT and GCC families CLANGPDB and CLANGDWARF are in GCC family. When CLANGPDB or CLANGDWARF are used from windows host, the same defines and undefines must be applied to GCC family for CLANG builds. This resolves CLANG 20.1.0 build errors. Signed-off-by: Michael D Kinney --- RedfishPkg/Library/JsonLib/JsonLib.inf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RedfishPkg/Library/JsonLib/JsonLib.inf b/RedfishPkg/Library/JsonLib/JsonLib.inf index b0d1bcac7cb3..63997f896812 100644 --- a/RedfishPkg/Library/JsonLib/JsonLib.inf +++ b/RedfishPkg/Library/JsonLib/JsonLib.inf @@ -84,5 +84,5 @@ # MSFT:*_*_X64_CC_FLAGS = /wd4204 /wd4244 /wd4090 /wd4334 /wd4706 /DHAVE_CONFIG_H=1 /U_WIN32 /UWIN64 /U_MSC_VER MSFT:*_*_IA32_CC_FLAGS = /wd4204 /wd4244 /wd4090 /wd4706 /DHAVE_CONFIG_H=1 /U_WIN32 /UWIN64 /U_MSC_VER - GCC:*_*_*_CC_FLAGS = -Wno-unused-function -Wno-unused-but-set-variable + GCC:*_*_*_CC_FLAGS = -Wno-unused-function -Wno-unused-but-set-variable -DHAVE_CONFIG_H=1 -UWIN32 -U_WIN32 -UWIN64 -U_MSC_VER From e83a694c0ff800820b21e5f6ecd3fa8d944674d4 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 22 May 2025 10:22:24 -0700 Subject: [PATCH 0060/1172] UefiCpuPkg/Test/EfiMpServicesPpiProtocol: EFI_AP_PROCEDURE must be EFIAPI Add missing EFIAPI calling convention to all EFI_AP_PROCEDURE functions in the EfiMpServicesPpiProtocol unit tests. Signed-off-by: Michael D Kinney --- .../EfiMpServicesUnitTestCommom.c | 10 ++++++++++ .../EfiMpServicesUnitTestCommom.h | 2 ++ .../EfiPeiMpServices2PpiUnitTest.c | 2 ++ 3 files changed, 14 insertions(+) diff --git a/UefiCpuPkg/Test/UnitTest/EfiMpServicesPpiProtocol/EfiMpServicesUnitTestCommom.c b/UefiCpuPkg/Test/UnitTest/EfiMpServicesPpiProtocol/EfiMpServicesUnitTestCommom.c index 7cd3f48d761f..d7fa06c992da 100644 --- a/UefiCpuPkg/Test/UnitTest/EfiMpServicesPpiProtocol/EfiMpServicesUnitTestCommom.c +++ b/UefiCpuPkg/Test/UnitTest/EfiMpServicesPpiProtocol/EfiMpServicesUnitTestCommom.c @@ -231,6 +231,7 @@ FreeUTContext ( @param[in,out] Buffer The pointer to private data buffer. **/ VOID +EFIAPI StoreCpuNumbers ( IN OUT VOID *Buffer ) @@ -260,6 +261,7 @@ StoreCpuNumbers ( @param[in,out] Buffer The pointer to private data buffer. **/ VOID +EFIAPI StoreAPsExecutionOrder ( IN OUT VOID *Buffer ) @@ -290,6 +292,7 @@ StoreAPsExecutionOrder ( @param[in,out] Buffer The pointer to private data buffer. **/ VOID +EFIAPI InfiniteLoopProcedure ( IN OUT VOID *Buffer ) @@ -308,6 +311,7 @@ InfiniteLoopProcedure ( @param[in,out] Buffer The pointer to private data buffer. **/ VOID +EFIAPI EmptyProcedure ( IN OUT VOID *Buffer ) @@ -320,6 +324,7 @@ EmptyProcedure ( @param[in,out] Buffer The pointer to private data buffer. **/ VOID +EFIAPI RunMpServiceGetNumberOfProcessorsOnAp ( IN OUT VOID *Buffer ) @@ -343,6 +348,7 @@ RunMpServiceGetNumberOfProcessorsOnAp ( @param[in,out] Buffer The pointer to private data buffer. **/ VOID +EFIAPI RunMpServiceGetProcessorInfoOnAp ( IN OUT VOID *Buffer ) @@ -365,6 +371,7 @@ RunMpServiceGetProcessorInfoOnAp ( @param[in,out] Buffer The pointer to private data buffer. **/ VOID +EFIAPI RunMpServiceEnableDisableAPOnAp ( IN OUT VOID *Buffer ) @@ -387,6 +394,7 @@ RunMpServiceEnableDisableAPOnAp ( @param[in,out] Buffer The pointer to private data buffer. **/ VOID +EFIAPI RunMpServiceStartupThisAPOnAp ( IN OUT VOID *Buffer ) @@ -410,6 +418,7 @@ RunMpServiceStartupThisAPOnAp ( @param[in,out] Buffer The pointer to private data buffer. **/ VOID +EFIAPI RunMpServiceStartupAllAPsOnAp ( IN OUT VOID *Buffer ) @@ -433,6 +442,7 @@ RunMpServiceStartupAllAPsOnAp ( @param[in,out] Buffer The pointer to private data buffer. **/ VOID +EFIAPI RunMpServiceSwitchBSPOnAp ( IN OUT VOID *Buffer ) diff --git a/UefiCpuPkg/Test/UnitTest/EfiMpServicesPpiProtocol/EfiMpServicesUnitTestCommom.h b/UefiCpuPkg/Test/UnitTest/EfiMpServicesPpiProtocol/EfiMpServicesUnitTestCommom.h index f6bb7f904f36..0691c81c9dbd 100644 --- a/UefiCpuPkg/Test/UnitTest/EfiMpServicesPpiProtocol/EfiMpServicesUnitTestCommom.h +++ b/UefiCpuPkg/Test/UnitTest/EfiMpServicesPpiProtocol/EfiMpServicesUnitTestCommom.h @@ -191,6 +191,7 @@ MpServicesUnitTestWhoAmI ( @param[in,out] Buffer The pointer to private data buffer. **/ VOID +EFIAPI EmptyProcedure ( IN OUT VOID *Buffer ); @@ -201,6 +202,7 @@ EmptyProcedure ( @param[in,out] Buffer The pointer to private data buffer. **/ VOID +EFIAPI StoreCpuNumbers ( IN OUT VOID *Buffer ); diff --git a/UefiCpuPkg/Test/UnitTest/EfiMpServicesPpiProtocol/EfiPeiMpServices2PpiUnitTest.c b/UefiCpuPkg/Test/UnitTest/EfiMpServicesPpiProtocol/EfiPeiMpServices2PpiUnitTest.c index 85f30b44cad5..b76ed898f8ab 100644 --- a/UefiCpuPkg/Test/UnitTest/EfiMpServicesPpiProtocol/EfiPeiMpServices2PpiUnitTest.c +++ b/UefiCpuPkg/Test/UnitTest/EfiMpServicesPpiProtocol/EfiPeiMpServices2PpiUnitTest.c @@ -215,6 +215,7 @@ MpServicesUnitTestStartupAllCPUs ( @param[in,out] Buffer The pointer to private data buffer. **/ VOID +EFIAPI ApInfiniteLoopProcedure ( IN OUT VOID *Buffer ) @@ -245,6 +246,7 @@ ApInfiniteLoopProcedure ( @param[in,out] Buffer The pointer to private data buffer. **/ VOID +EFIAPI RunMpServiceStartupAllCPUsOnAp ( IN OUT VOID *Buffer ) From 617e061830f6218ef985b599b981bf0ee53ad7da Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Tue, 28 Nov 2023 11:31:24 -0500 Subject: [PATCH 0061/1172] SecurityPkg/Tpm2CommandLib: Add new digest list copy and size functions REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3267 Adds two new helper functions. Currently, a function exists in Tpm2CommandLib to copy a digest list to a buffer. A function to perform the inverse operation - copying from a buffer to a digest list is added. A function is also added to compute the total digest size for a given hash algorithm mask. Cc: Jiewen Yao Cc: Rahul Kumar Signed-off-by: Michael Kubacki --- SecurityPkg/Include/Library/Tpm2CommandLib.h | 34 ++++++++ SecurityPkg/Library/Tpm2CommandLib/Tpm2Help.c | 87 +++++++++++++++++++ 2 files changed, 121 insertions(+) diff --git a/SecurityPkg/Include/Library/Tpm2CommandLib.h b/SecurityPkg/Include/Library/Tpm2CommandLib.h index 70eec84c90f1..7bda02706827 100644 --- a/SecurityPkg/Include/Library/Tpm2CommandLib.h +++ b/SecurityPkg/Include/Library/Tpm2CommandLib.h @@ -1103,6 +1103,27 @@ CopyDigestListToBuffer ( IN UINT32 HashAlgorithmMask ); +/** + Copy a buffer into a TPML_DIGEST_VALUES structure. + + @param[in] Buffer Buffer to hold TPML_DIGEST_VALUES compact binary. + @param[in] BufferSize Size of Buffer. + @param[out] DigestList TPML_DIGEST_VALUES. + + @retval EFI_SUCCESS Buffer was succesfully copied to DigestList. + @retval EFI_BAD_BUFFER_SIZE A bad buffer size passed to the function. + @retval EFI_INVALID_PARAMETER An invalid parameter passed to the function: NULL pointer or + BufferSize bigger than TPML_DIGEST_VALUES. + +**/ +EFI_STATUS +EFIAPI +CopyBufferToDigestList ( + IN CONST VOID *Buffer, + IN UINTN BufferSize, + OUT TPML_DIGEST_VALUES *DigestList + ); + /** Get TPML_DIGEST_VALUES data size. @@ -1116,6 +1137,19 @@ GetDigestListSize ( IN TPML_DIGEST_VALUES *DigestList ); +/** + Get the total digest size from a hash algorithm mask. + + @param[in] HashAlgorithmMask. + + @return Digest size in bytes. +**/ +UINT32 +EFIAPI +GetDigestListSizeFromHashAlgorithmMask ( + IN UINT32 HashAlgorithmMask + ); + /** This function get digest from digest list. diff --git a/SecurityPkg/Library/Tpm2CommandLib/Tpm2Help.c b/SecurityPkg/Library/Tpm2CommandLib/Tpm2Help.c index e7f30b673f0e..ac802733d316 100644 --- a/SecurityPkg/Library/Tpm2CommandLib/Tpm2Help.c +++ b/SecurityPkg/Library/Tpm2CommandLib/Tpm2Help.c @@ -290,6 +290,67 @@ CopyDigestListToBuffer ( return Buffer; } +/** + Copy a buffer into a TPML_DIGEST_VALUES structure. + + @param[in] Buffer Buffer to hold TPML_DIGEST_VALUES compact binary. + @param[in] BufferSize Size of Buffer. + @param[out] DigestList TPML_DIGEST_VALUES. + + @retval EFI_SUCCESS Buffer was succesfully copied to DigestList. + @retval EFI_BAD_BUFFER_SIZE A bad buffer size passed to the function. + @retval EFI_INVALID_PARAMETER An invalid parameter passed to the function: NULL pointer or + BufferSize bigger than TPML_DIGEST_VALUES. +**/ +EFI_STATUS +EFIAPI +CopyBufferToDigestList ( + IN CONST VOID *Buffer, + IN UINTN BufferSize, + OUT TPML_DIGEST_VALUES *DigestList + ) +{ + EFI_STATUS Status; + UINTN Index; + UINT16 DigestSize; + CONST UINT8 *BufferPtr; + + Status = EFI_INVALID_PARAMETER; + + if ((Buffer == NULL) || (DigestList == NULL) || (BufferSize > sizeof (TPML_DIGEST_VALUES))) { + return EFI_INVALID_PARAMETER; + } + + DigestList->count = SwapBytes32 (ReadUnaligned32 ((CONST UINT32 *)Buffer)); + if (DigestList->count > HASH_COUNT) { + return EFI_INVALID_PARAMETER; + } + + BufferPtr = (CONST UINT8 *)Buffer + sizeof (UINT32); + for (Index = 0; Index < DigestList->count; Index++) { + if (BufferPtr - (CONST UINT8 *)Buffer + sizeof (UINT16) > BufferSize) { + Status = EFI_BAD_BUFFER_SIZE; + break; + } else { + DigestList->digests[Index].hashAlg = SwapBytes16 (ReadUnaligned16 ((CONST UINT16 *)BufferPtr)); + } + + BufferPtr += sizeof (UINT16); + DigestSize = GetHashSizeFromAlgo (DigestList->digests[Index].hashAlg); + if (BufferPtr - (CONST UINT8 *)Buffer + (UINTN)DigestSize > BufferSize) { + Status = EFI_BAD_BUFFER_SIZE; + break; + } else { + CopyMem (&DigestList->digests[Index].digest, BufferPtr, DigestSize); + } + + BufferPtr += DigestSize; + Status = EFI_SUCCESS; + } + + return Status; +} + /** Get TPML_DIGEST_VALUES data size. @@ -316,6 +377,32 @@ GetDigestListSize ( return TotalSize; } +/** + Get the total digest size from a hash algorithm mask. + + @param[in] HashAlgorithmMask. + + @return Digest size in bytes. +**/ +UINT32 +EFIAPI +GetDigestListSizeFromHashAlgorithmMask ( + IN UINT32 HashAlgorithmMask + ) +{ + UINTN Index; + UINT32 TotalSize; + + TotalSize = sizeof (UINT32); + for (Index = 0; Index < ARRAY_SIZE (mHashInfo); Index++) { + if ((mHashInfo[Index].HashMask & HashAlgorithmMask) != 0) { + TotalSize += sizeof (TPMI_ALG_HASH) + mHashInfo[Index].HashSize; + } + } + + return TotalSize; +} + /** This function get digest from digest list. From e076d2ab8ca20c3f29420cae2a5b990bddca0d35 Mon Sep 17 00:00:00 2001 From: Brit Chesley Date: Thu, 12 Jun 2025 15:05:49 -0500 Subject: [PATCH 0062/1172] NetworkPkg/DxeNetLib: Fix CodeQl Error Fix possible NULL pointer dereference in NetBuffer.c This was flagged by CodeQl as an error. Github Issue #11190 Signed-off-by: Brit Chesley --- NetworkPkg/Include/Library/NetLib.h | 3 ++- NetworkPkg/Library/DxeNetLib/NetBuffer.c | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/NetworkPkg/Include/Library/NetLib.h b/NetworkPkg/Include/Library/NetLib.h index e8108b79db8f..34e89dad44e2 100644 --- a/NetworkPkg/Include/Library/NetLib.h +++ b/NetworkPkg/Include/Library/NetLib.h @@ -2081,7 +2081,8 @@ NetbufQueAppend ( @param[out] Dest The destination of the data to copy to. @return The length of the actual copied data, or 0 if the offset - specified exceeds the total size of net buffer queue. + specified exceeds the total size of net buffer queue, or + a NetBuf pointer is NULL. **/ UINT32 diff --git a/NetworkPkg/Library/DxeNetLib/NetBuffer.c b/NetworkPkg/Library/DxeNetLib/NetBuffer.c index 4721fbd2708c..3827f5afcf77 100644 --- a/NetworkPkg/Library/DxeNetLib/NetBuffer.c +++ b/NetworkPkg/Library/DxeNetLib/NetBuffer.c @@ -1430,7 +1430,8 @@ NetbufQueRemove ( @param[out] Dest The destination of the data to copy to. @return The length of the actual copied data, or 0 if the offset - specified exceeds the total size of net buffer queue. + specified exceeds the total size of net buffer queue, or + a NetBuf pointer is NULL. **/ UINT32 @@ -1476,7 +1477,10 @@ NetbufQueCopy ( Cur += Nbuf->TotalSize; } - ASSERT (Nbuf != NULL); + if (Nbuf == NULL) { + ASSERT (FALSE); + return 0; + } // // Copy the data in the first buffer. From f242a0e87f1d43094f697265d66cce42a387865e Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Thu, 12 Jun 2025 10:49:30 +0200 Subject: [PATCH 0063/1172] ShellPkg/UefiShellLevel2CommandLib: Free Buffer after use Free the allocated Buffer after use. Reported-by: Ramesh R Signed-off-by: Pierre Gondois --- ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c index 993bcf7cb91d..afa6a502f791 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c @@ -252,6 +252,8 @@ CopySingleFile ( break; } } + + FreePool (Buffer); } SHELL_FREE_NON_NULL (DestVolumeInfo); From c2eb2136b41eb051847ddba68d28de8863a2babd Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Thu, 12 Jun 2025 13:28:13 +0200 Subject: [PATCH 0064/1172] ShellPkg/UefiShellLib: Fix Buffer underflow Having StrLen(Buffer) == 0 results in a Buffer underflow. Also, StrLen iterates over the Buffer elements until finding a NULL character. This results in a quadratic search for '\r' characters in the while loop. Fix these issues. Signed-off-by: Pierre Gondois --- ShellPkg/Library/UefiShellLib/UefiShellLib.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ShellPkg/Library/UefiShellLib/UefiShellLib.c b/ShellPkg/Library/UefiShellLib/UefiShellLib.c index e68c978642ba..349436f6788f 100644 --- a/ShellPkg/Library/UefiShellLib/UefiShellLib.c +++ b/ShellPkg/Library/UefiShellLib/UefiShellLib.c @@ -4379,6 +4379,7 @@ ShellFileHandleReadLine ( { EFI_STATUS Status; CHAR16 CharBuffer; + UINTN BufferLength; UINTN CharSize; UINTN CountSoFar; UINT64 OriginalFilePosition; @@ -4455,8 +4456,9 @@ ShellFileHandleReadLine ( return (EFI_BUFFER_TOO_SMALL); } - while (Buffer[StrLen (Buffer)-1] == L'\r') { - Buffer[StrLen (Buffer)-1] = CHAR_NULL; + BufferLength = StrLen (Buffer); + while ((BufferLength != 0) && (Buffer[--BufferLength] == L'\r')) { + Buffer[BufferLength] = CHAR_NULL; } return (Status); From 9d4eda962aeb74656f399672020e893853e1e5e4 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Thu, 12 Jun 2025 15:17:21 +0200 Subject: [PATCH 0065/1172] ShellPkg: Remove PcdShellSupportOldProtocols PcdShellSupportOldProtocols aimed to force using the following protocols: - gEfiShellEnvironment2Guid - gEfiShellInterfaceGuid over the UEFI Shell 2.0 protocols: - gEfiShellProtocolGuid These 2 protocols seem to originate from the original EDK(1) implementation and are now deprecated. The protocols are not implemented in EDK2. Remove the PcdShellSupportOldProtocols which does not switch to using the original shell protocols. Setting the PCD to TRUE prevents from loading the UEFI Shell. Signed-off-by: Pierre Gondois --- ShellPkg/Application/Shell/Shell.c | 6 +----- ShellPkg/Application/Shell/Shell.inf | 1 - ShellPkg/Application/Shell/ShellProtocol.c | 7 ------- ShellPkg/ShellPkg.dec | 4 ---- 4 files changed, 1 insertion(+), 17 deletions(-) diff --git a/ShellPkg/Application/Shell/Shell.c b/ShellPkg/Application/Shell/Shell.c index 9bacf9d8c761..483fe4df5da3 100644 --- a/ShellPkg/Application/Shell/Shell.c +++ b/ShellPkg/Application/Shell/Shell.c @@ -395,11 +395,7 @@ UefiMain ( // // Check PCDs for optional features that are not implemented yet. // - if ( PcdGetBool (PcdShellSupportOldProtocols) - || !FeaturePcdGet (PcdShellRequireHiiPlatform) - || FeaturePcdGet (PcdShellSupportFrameworkHii) - ) - { + if (!FeaturePcdGet (PcdShellRequireHiiPlatform) || FeaturePcdGet (PcdShellSupportFrameworkHii)) { return (EFI_UNSUPPORTED); } diff --git a/ShellPkg/Application/Shell/Shell.inf b/ShellPkg/Application/Shell/Shell.inf index f1e41de133d1..5a7492ccdbb3 100644 --- a/ShellPkg/Application/Shell/Shell.inf +++ b/ShellPkg/Application/Shell/Shell.inf @@ -93,7 +93,6 @@ [Pcd] gEfiShellPkgTokenSpaceGuid.PcdShellSupportLevel ## CONSUMES - gEfiShellPkgTokenSpaceGuid.PcdShellSupportOldProtocols ## CONSUMES gEfiShellPkgTokenSpaceGuid.PcdShellRequireHiiPlatform ## CONSUMES gEfiShellPkgTokenSpaceGuid.PcdShellSupportFrameworkHii ## CONSUMES gEfiShellPkgTokenSpaceGuid.PcdShellPageBreakDefault ## CONSUMES diff --git a/ShellPkg/Application/Shell/ShellProtocol.c b/ShellPkg/Application/Shell/ShellProtocol.c index ff53f6ba4ff9..3bc62399f89c 100644 --- a/ShellPkg/Application/Shell/ShellProtocol.c +++ b/ShellPkg/Application/Shell/ShellProtocol.c @@ -1624,8 +1624,6 @@ InternalShellExecuteDevicePath ( Status = gBS->InstallProtocolInterface (&NewHandle, &gEfiShellParametersProtocolGuid, EFI_NATIVE_INTERFACE, &ShellParamsProtocol); ASSERT_EFI_ERROR (Status); - /// @todo initialize and install ShellInterface protocol on the new image for compatibility if - PcdGetBool(PcdShellSupportOldProtocols) - // // now start the image and if the caller wanted the return code pass it to them... // @@ -3889,11 +3887,6 @@ CreatePopulateInstallShellProtocol ( ); } - if (PcdGetBool (PcdShellSupportOldProtocols)) { - /// @todo support ShellEnvironment2 - /// @todo do we need to support ShellEnvironment (not ShellEnvironment2) also? - } - if (!EFI_ERROR (Status)) { *NewShell = &mShellProtocol; } diff --git a/ShellPkg/ShellPkg.dec b/ShellPkg/ShellPkg.dec index e11b22f84a13..45954fc43d13 100644 --- a/ShellPkg/ShellPkg.dec +++ b/ShellPkg/ShellPkg.dec @@ -109,10 +109,6 @@ gEfiShellPkgTokenSpaceGuid.PcdShellMaxHistoryCommandCount|0x0020|UINT16|0x00000014 [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx] - ## This flag is used to control the protocols produced by the shell - # If TRUE the shell will produce EFI_SHELL_ENVIRONMENT2 and EFI_SHELL_INTERFACE - gEfiShellPkgTokenSpaceGuid.PcdShellSupportOldProtocols|FALSE|BOOLEAN|0x00000002 - ## this flag determines whether Page Break (-b) defaults to on or off in the shell gEfiShellPkgTokenSpaceGuid.PcdShellPageBreakDefault|FALSE|BOOLEAN|0x00000006 From 26b37a16703b5977727fa1299e5098efa4064d09 Mon Sep 17 00:00:00 2001 From: Aaron Young Date: Mon, 28 Apr 2025 09:13:24 -0700 Subject: [PATCH 0066/1172] OvmfPkg: Add OVMF Memory Debug Logging GUIDs and PCDs The OVMF Memory Debug Logging feature logs DEBUG() messages to a memory buffer allowing for extraction of debug messages directly from a qemu process or core file. Add the GUIDs and PCDs definitions required for the OVMF Memory Debug Logging feature. Cc: Gerd Hoffmann Cc: Ard Biesheuvel Cc: Jiewen Yao Signed-off-by: Aaron Young --- OvmfPkg/OvmfPkg.dec | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec index 10de89916a92..2078cf27a8a2 100644 --- a/OvmfPkg/OvmfPkg.dec +++ b/OvmfPkg/OvmfPkg.dec @@ -156,6 +156,10 @@ # CpuMmuInitLib|Include/Library/CpuMmuInitLib.h + ## @libraryclass MemDebugLogLib + # + MemDebugLogLib|Include/Library/MemDebugLogLib.h + [Guids] gUefiOvmfPkgTokenSpaceGuid = {0x93bb96af, 0xb9f2, 0x4eb8, {0x94, 0x62, 0xe0, 0xba, 0x74, 0x56, 0x42, 0x36}} gEfiXenInfoGuid = {0xd3b46f3b, 0xd441, 0x1244, {0x9a, 0x12, 0x0, 0x12, 0x27, 0x3f, 0xc1, 0x4d}} @@ -179,6 +183,7 @@ gQemuFirmwareResourceHobGuid = {0x3cc47b04, 0x0d3e, 0xaa64, {0x06, 0xa6, 0x4b, 0xdc, 0x9a, 0x2c, 0x61, 0x19}} gRtcRegisterBaseAddressHobGuid = {0x40435d97, 0xeb37, 0x4a4b, {0x7f, 0xad, 0xb7, 0xed, 0x72, 0xa1, 0x43, 0xc5}} gOvmfFwCfgInfoHobGuid = {0xa291ce0e, 0xdc09, 0x11ee, {0x9e, 0xdb, 0x73, 0x49, 0xd7, 0x92, 0xaf, 0x51}} + gMemDebugLogHobGuid = {0x95305139, 0xb20f, 0x4723, {0x84, 0x25, 0x62, 0x7c, 0x88, 0x8f, 0xf1, 0x21}} [Ppis] # PPI whose presence in the PPI database signals that the TPM base address @@ -363,6 +368,19 @@ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecSvsmCaaBase|0|UINT32|0x70 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecSvsmCaaSize|0|UINT32|0x71 + ## The base address and size of the early memory debug log used in SEC + # and early PEI phases - i.e. prior to memory being initialized. + # If this is set in the .fdf, the platform is responsible to + # reserve this area from DXE phase overwrites. + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogBase|0|UINT32|0x7a + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogSize|0|UINT32|0x7b + + ## + # Default size of the memory DEBUG log buffer (in pages). + # The buffer is circular. So, if size is exceeded, older + # messages will be overwritten by more recent messages. + gUefiOvmfPkgTokenSpaceGuid.PcdMemDebugLogPages|32|UINT32|0x7c + [PcdsDynamic, PcdsDynamicEx] gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent|0|UINT64|2 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashVariablesEnable|FALSE|BOOLEAN|0x10 From ba05ea83b7383ea126fbeac812503a9a027f506a Mon Sep 17 00:00:00 2001 From: Aaron Young Date: Mon, 28 Apr 2025 09:18:31 -0700 Subject: [PATCH 0067/1172] OvmfPkg: Add OVMF Memory Debug Logging MemDebugLogLib library Add the Memory Debug Logging feature MemDebugLogLib library which provides the key MemDebugLogWrite() function. Several versions (i.e. SEC, PEIM, DXE, runtime) of the function are included to provide the proper method to write the debug messages to the memory debug log buffer. The library also provides the core functions to maintain the circular memory debug log buffer. Cc: Gerd Hoffmann Cc: Ard Biesheuvel Cc: Jiewen Yao Signed-off-by: Aaron Young --- OvmfPkg/Include/Library/MemDebugLogLib.h | 214 +++++++++++++ .../MemDebugLogLib/MemDebugLogCommon.c | 297 ++++++++++++++++++ .../Library/MemDebugLogLib/MemDebugLogDxe.c | 44 +++ .../MemDebugLogLib/MemDebugLogDxeLib.inf | 37 +++ .../MemDebugLogLib/MemDebugLogLibNull.inf | 31 ++ .../Library/MemDebugLogLib/MemDebugLogNull.c | 40 +++ .../Library/MemDebugLogLib/MemDebugLogPei.c | 89 ++++++ .../MemDebugLogLib/MemDebugLogPeiCore.c | 58 ++++ .../MemDebugLogLib/MemDebugLogPeiCoreLib.inf | 40 +++ .../MemDebugLogLib/MemDebugLogPeiLib.inf | 49 +++ .../Library/MemDebugLogLib/MemDebugLogRt.c | 54 ++++ .../MemDebugLogLib/MemDebugLogRtLib.inf | 38 +++ .../Library/MemDebugLogLib/MemDebugLogSec.c | 48 +++ .../MemDebugLogLib/MemDebugLogSecLib.inf | 39 +++ 14 files changed, 1078 insertions(+) create mode 100644 OvmfPkg/Include/Library/MemDebugLogLib.h create mode 100644 OvmfPkg/Library/MemDebugLogLib/MemDebugLogCommon.c create mode 100644 OvmfPkg/Library/MemDebugLogLib/MemDebugLogDxe.c create mode 100644 OvmfPkg/Library/MemDebugLogLib/MemDebugLogDxeLib.inf create mode 100644 OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf create mode 100644 OvmfPkg/Library/MemDebugLogLib/MemDebugLogNull.c create mode 100644 OvmfPkg/Library/MemDebugLogLib/MemDebugLogPei.c create mode 100644 OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCore.c create mode 100644 OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCoreLib.inf create mode 100644 OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf create mode 100644 OvmfPkg/Library/MemDebugLogLib/MemDebugLogRt.c create mode 100644 OvmfPkg/Library/MemDebugLogLib/MemDebugLogRtLib.inf create mode 100644 OvmfPkg/Library/MemDebugLogLib/MemDebugLogSec.c create mode 100644 OvmfPkg/Library/MemDebugLogLib/MemDebugLogSecLib.inf diff --git a/OvmfPkg/Include/Library/MemDebugLogLib.h b/OvmfPkg/Include/Library/MemDebugLogLib.h new file mode 100644 index 000000000000..6dde5855743c --- /dev/null +++ b/OvmfPkg/Include/Library/MemDebugLogLib.h @@ -0,0 +1,214 @@ +/** @file + Interface functions for the Memory Debug Log Library. + + Copyright (C) 2025, Oracle and/or its affiliates. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef _MEM_DEBUG_LOG_LIB_H_ +#define _MEM_DEBUG_LOG_LIB_H_ + +#include +#include + +// +// Cap max buffer at 2MB (0x200 4K pages) +// +#define MAX_MEM_DEBUG_LOG_PAGES 0x200 + +#define MEM_DEBUG_LOG_MAGIC1 0x3167646d666d766f // "ovmfmdg1" +#define MEM_DEBUG_LOG_MAGIC2 0x3267646d666d766f // "ovmfmdg2" + +#pragma pack(1) +// +// Mem Debug Log buffer header. +// The Log buffer is circular. Only the most +// recent messages are retained. Older messages +// will be discarded if the buffer overflows. +// The Debug Log starts just after the header. +// +typedef struct { + // + // Magic values + // These fields are used by tools to locate the buffer in + // memory. These MUST be the first two fields of the structure. + // Use a 128 bit Magic to vastly reduce the possibility of + // a collision with random data in memory. + UINT64 Magic1; + UINT64 Magic2; + // + // Header Size + // This MUST be the third field of the structure + // + UINT64 HeaderSize; + // + // Debug log size (minus header) + // + UINT64 DebugLogSize; + // + // Protect the log from potential MP access (by APs during + // vCPU init) to maintain integrity of the Head/Tail Offsets. + // NOTE: MemDebugLogLock is used as a SPIN_LOCK (which is type + // UINTN). Thus, we declared it as a UINT64 to ensure a + // consistent structure size. + // + volatile UINT64 MemDebugLogLock; + // + // Debug log head offset + // + UINT64 DebugLogHeadOffset; + // + // Debug log tail offset + // + UINT64 DebugLogTailOffset; + // + // Flag to indicate if the buffer wrapped and was thus truncated. + // + UINT64 Truncated; + // + // Firmware Build Version (PcdFirmwareVersionString) + // + CHAR8 FirmwareVersion[128]; +} MEM_DEBUG_LOG_HDR; + +// +// HOB used to pass the mem debug log buffer addr from PEI to DXE +// +typedef struct { + EFI_PHYSICAL_ADDRESS MemDebugLogBufAddr; +} MEM_DEBUG_LOG_HOB_DATA; + +#pragma pack() + +/** + Write a CHAR8 string to the memory debug log. + This is the interface function used by DebugLib. + There are several versions for each boot + phase (i.e. SEC, PEI, DXE, Runtime). + Each version will obtain the proper memory debug log + buffer address and call MemDebugLogWriteBuffer(). + + @param[in] Buffer The buffer containing the string of CHAR8s + + @param[in] Length The buffer length (number of CHAR8s) + not including the NULL terminator byte. + + @retval RETURN_SUCCESS String succcessfully written to the memory log buffer. + + @retval RETURN_NOT_FOUND Memory log buffer is not properly initialized. + + @retval EFI_INVALID_PARAMETER Invalid input parameters. +**/ +EFI_STATUS +EFIAPI +MemDebugLogWrite ( + IN CHAR8 *Buffer, + IN UINTN Length + ); + +/** + Return the memory debug log buffer size (in pages). + This function is implemented by PEIM version of + MemDebugLogLib only. + + @retval UINT32 Buffer size in pages +**/ +UINT32 +EFIAPI +MemDebugLogPages ( + VOID + ); + +/** + Write a CHAR8 string to a memory debug log circular + buffer located at the given address. + + @param MemDebugLogBufAddr Address of the memory debug log buffer. + + @param Buffer Pointer to a CHAR8 string to write to the + debug log buffer. + + @param Length Length of the CHAR8 string to write to the + debug log buffer. Not including NULL terminator + byte. + + @retval RETURN_SUCCESS String succcessfully written to the memory log buffer. + + @retval RETURN_NOT_FOUND Memory log buffer is not properly initialized. + + @retval EFI_INVALID_PARAMETER Invalid input parameters. +**/ +EFI_STATUS +EFIAPI +MemDebugLogWriteBuffer ( + IN EFI_PHYSICAL_ADDRESS MemDebugLogBufAddr, + IN CHAR8 *Buffer, + IN UINTN Length + ); + +/** + Initialize the memory debug log buffer header + + @param MemDebugLogBufAddr Address of the memory debug log buffer. + + @param MemDebugLogBufSize Size of the memory debug log buffer. + + @retval RETURN_SUCCESS Log buffer successfully initialized. + + @retval EFI_INVALID_PARAMETER Invalid input parameters. +**/ +EFI_STATUS +EFIAPI +MemDebugLogInit ( + IN EFI_PHYSICAL_ADDRESS MemDebugLogBufAddr, + UINT32 MemDebugLogBufSize + ); + +/** + Copy the memory debug log buffer + + @param MemDebugLogBufDestAddr Address of destination memory debug log buffer. + + @param MemDebugLogBufSrcAddr Address of source memory debug log buffer. + + @retval RETURN_SUCCESS Log buffer successfuly copied. + + @retval EFI_INVALID_PARAMETER Invalid input parameters. +**/ +EFI_STATUS +EFIAPI +MemDebugLogCopy ( + IN EFI_PHYSICAL_ADDRESS MemDebugLogBufDestAddr, + IN EFI_PHYSICAL_ADDRESS MemDebugLogBufSrcAddr + ); + +/** + Obtain the Memory Debug Log Buffer Addr from the HOB + + @param MemDebugLogBufAddr Address of memory debug log buffer. + + @retval RETURN_SUCCESS Log buffer address successfuly obtained. + + @retval EFI_NOT_FOUND HOB not found. +**/ +EFI_STATUS +EFIAPI +MemDebugLogAddrFromHOB ( + EFI_PHYSICAL_ADDRESS *MemDebugLogBufAddr + ); + +/** + Return whether the Memory Debug Logging feature is enabled + + @retval TRUE Feature is enabled + + @retval FALSE Feature is not enabled +**/ +BOOLEAN +EFIAPI +MemDebugLogEnabled ( + VOID + ); + +#endif // _MEM_DEBUG_LOG_LIB_H_ diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogCommon.c b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogCommon.c new file mode 100644 index 000000000000..8c9ce61cb6d2 --- /dev/null +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogCommon.c @@ -0,0 +1,297 @@ +/** @file + Memory Debug Log common defs/funcs to access the memory buffer. + + Copyright (C) 2025, Oracle and/or its affiliates. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MEMDEBUGLOG_COPYSIZE 0x200 + +STATIC +VOID +MemDebugLogLockInit ( + IN volatile UINT64 *MemDebugLogLock + ) +{ + InitializeSpinLock ((SPIN_LOCK *)MemDebugLogLock); +} + +STATIC +VOID +MemDebugLogLockAcquire ( + IN volatile UINT64 *MemDebugLogLock + ) +{ + AcquireSpinLock ((SPIN_LOCK *)MemDebugLogLock); +} + +STATIC +VOID +MemDebugLogLockRelease ( + IN volatile UINT64 *MemDebugLogLock + ) +{ + ReleaseSpinLock ((SPIN_LOCK *)MemDebugLogLock); +} + +EFI_STATUS +EFIAPI +MemDebugLogWriteBuffer ( + IN EFI_PHYSICAL_ADDRESS MemDebugLogBufAddr, + IN CHAR8 *Buffer, + IN UINTN Length + ) +{ + volatile UINT64 *MemDebugLogLock; + MEM_DEBUG_LOG_HDR *MemDebugLogHdr; + UINTN BufSpaceLeft; + CHAR8 *BufStart; + CHAR8 *BufHead; + CHAR8 *BufTail; + CHAR8 *BufEnd; + + // + // NOTE: we cannot call DEBUG or ASSERT from this function. + // + + if (!MemDebugLogBufAddr || !Buffer) { + return EFI_INVALID_PARAMETER; + } + + if (Length == 0) { + return EFI_SUCCESS; + } + + MemDebugLogHdr = (MEM_DEBUG_LOG_HDR *)(UINTN)MemDebugLogBufAddr; + MemDebugLogLock = &(MemDebugLogHdr->MemDebugLogLock); + + // + // Validate the header magic before proceeding + // + if ((MemDebugLogHdr->Magic1 != MEM_DEBUG_LOG_MAGIC1) || + (MemDebugLogHdr->Magic2 != MEM_DEBUG_LOG_MAGIC2)) + { + return EFI_NOT_FOUND; + } + + if (Length >= MemDebugLogHdr->DebugLogSize) { + return EFI_INVALID_PARAMETER; + } + + MemDebugLogLockAcquire (MemDebugLogLock); + + BufStart = (CHAR8 *)(UINTN)(MemDebugLogBufAddr + MemDebugLogHdr->HeaderSize); + BufEnd = (CHAR8 *)(UINTN)(MemDebugLogBufAddr + MemDebugLogHdr->HeaderSize + MemDebugLogHdr->DebugLogSize) - 1; + BufHead = BufStart + MemDebugLogHdr->DebugLogHeadOffset; + BufTail = BufStart + MemDebugLogHdr->DebugLogTailOffset; + + // + // Maintain a circular (wrap around) log buffer + // NOTES: + // tail always points to next available slot to populate + // Algorithm to process/display strings from buffer in time order: + // 1. head==tail indicates empty buffer + // 2. if (head < tail), process from head (tail-head) bytes + // 3. if (head > tail), process from head (bufend-head) bytes + // process from bufstart (tail-bufstart) bytes + // + + if ((BufTail + Length) <= BufEnd) { + // + // There's enough room from tail to end of the buffer + // + CopyMem (BufTail, Buffer, Length); + // + // If we have previously wrapped around, need to keep Head updated + // + if (BufHead == (BufTail + 1)) { + BufHead += Length; + // + // Check if we need to wrap Head + // + if (BufHead > BufEnd) { + BufHead = BufStart; + } + } + + BufTail += Length; + } else { + // + // We need to wrap around. + // + // Fill remaining buffer space with initial part of the string + // + BufSpaceLeft = (UINTN)(BufEnd - BufTail + 1); + CopyMem (BufTail, Buffer, BufSpaceLeft); + + // + // Wrap to start of the buffer for the rest of the string + // + BufTail = BufStart; + CopyMem (BufTail, (Buffer + BufSpaceLeft), (Length - BufSpaceLeft)); + BufTail += (Length - BufSpaceLeft); + BufHead = (BufTail + 1); + + MemDebugLogHdr->Truncated = 1; + } + + // + // Write the new buffer offsets back to the header + // + MemDebugLogHdr->DebugLogHeadOffset = BufHead - BufStart; + MemDebugLogHdr->DebugLogTailOffset = BufTail - BufStart; + + MemDebugLogLockRelease (MemDebugLogLock); + + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +MemDebugLogInit ( + IN EFI_PHYSICAL_ADDRESS MemDebugLogBufAddr, + UINT32 MemDebugLogBufSize + ) +{ + MEM_DEBUG_LOG_HDR *MemDebugLogHdr; + + if (MemDebugLogBufAddr == 0) { + return EFI_INVALID_PARAMETER; + } + + ZeroMem ((VOID *)(UINTN)MemDebugLogBufAddr, MemDebugLogBufSize); + + MemDebugLogHdr = (MEM_DEBUG_LOG_HDR *)(UINTN)MemDebugLogBufAddr; + MemDebugLogHdr->Magic1 = MEM_DEBUG_LOG_MAGIC1; + MemDebugLogHdr->Magic2 = MEM_DEBUG_LOG_MAGIC2; + MemDebugLogHdr->HeaderSize = sizeof (MEM_DEBUG_LOG_HDR); + MemDebugLogHdr->DebugLogSize = (MemDebugLogBufSize - MemDebugLogHdr->HeaderSize); + MemDebugLogHdr->DebugLogHeadOffset = 0; + MemDebugLogHdr->DebugLogTailOffset = 0; + MemDebugLogLockInit (&(MemDebugLogHdr->MemDebugLogLock)); + MemDebugLogHdr->Truncated = 0; + AsciiSPrint (MemDebugLogHdr->FirmwareVersion, 128, "%s", (CHAR16 *)PcdGetPtr (PcdFirmwareVersionString)); + + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +MemDebugLogCopy ( + IN EFI_PHYSICAL_ADDRESS MemDebugLogBufDestAddr, + IN EFI_PHYSICAL_ADDRESS MemDebugLogBufSrcAddr + ) +{ + MEM_DEBUG_LOG_HDR *MemDebugLogSrcHdr; + MEM_DEBUG_LOG_HDR *MemDebugLogDestHdr; + CHAR8 *BufStart; + CHAR8 *BufHead; + CHAR8 *BufTail; + CHAR8 *BufEnd; + CHAR8 *BufPtr; + + if ((MemDebugLogBufSrcAddr == 0) || (MemDebugLogBufDestAddr == 0)) { + return EFI_INVALID_PARAMETER; + } + + MemDebugLogSrcHdr = (MEM_DEBUG_LOG_HDR *)(UINTN)MemDebugLogBufSrcAddr; + MemDebugLogDestHdr = (MEM_DEBUG_LOG_HDR *)(UINTN)MemDebugLogBufDestAddr; + + BufStart = (CHAR8 *)(UINTN)(MemDebugLogBufSrcAddr + MemDebugLogSrcHdr->HeaderSize); + BufEnd = (CHAR8 *)(UINTN)(MemDebugLogBufSrcAddr + MemDebugLogSrcHdr->HeaderSize + MemDebugLogSrcHdr->DebugLogSize); + BufHead = BufStart + MemDebugLogSrcHdr->DebugLogHeadOffset; + BufTail = BufStart + MemDebugLogSrcHdr->DebugLogTailOffset; + + MemDebugLogDestHdr->Truncated = MemDebugLogSrcHdr->Truncated; + + if (BufHead == BufTail) { + // + // Source Debug Log empty + // + return EFI_SUCCESS; + } else if (BufHead < BufTail) { + // + // Source buffer didn't wrap, so copy debug messages + // from Source buffer (head to tail) to the Dest buffer + // NOTE: we limit each copy to MEMDEBUGLOG_COPYSIZE + // to ensure to not copy too much at a time and ensure + // the dest buffer head/tail pointers are created properly. + // + for (BufPtr = BufHead; (BufTail - BufPtr) > MEMDEBUGLOG_COPYSIZE; BufPtr += MEMDEBUGLOG_COPYSIZE) { + MemDebugLogWriteBuffer (MemDebugLogBufDestAddr, BufPtr, MEMDEBUGLOG_COPYSIZE); + } + + // + // write remaining bytes + // + MemDebugLogWriteBuffer (MemDebugLogBufDestAddr, BufPtr, (BufTail - BufPtr)); + } else { + // + // Source buffer wrapped. + // First copy (bufend - head) chars from head to Dest buffer + // + for (BufPtr = BufHead; (BufEnd - BufPtr) > MEMDEBUGLOG_COPYSIZE; BufPtr += MEMDEBUGLOG_COPYSIZE) { + MemDebugLogWriteBuffer (MemDebugLogBufDestAddr, BufPtr, MEMDEBUGLOG_COPYSIZE); + } + + // + // write remaining bytes + // + MemDebugLogWriteBuffer (MemDebugLogBufDestAddr, BufPtr, (BufEnd - BufPtr)); + + // + // Next, copy (bufend - head) chars from start to Dest buffer + // + for (BufPtr = BufStart; (BufTail - BufPtr) > MEMDEBUGLOG_COPYSIZE; BufPtr += MEMDEBUGLOG_COPYSIZE) { + MemDebugLogWriteBuffer (MemDebugLogBufDestAddr, BufPtr, MEMDEBUGLOG_COPYSIZE); + } + + // + // write remaining bytes + // + MemDebugLogWriteBuffer (MemDebugLogBufDestAddr, BufPtr, (BufTail - BufPtr)); + } + + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +MemDebugLogAddrFromHOB ( + EFI_PHYSICAL_ADDRESS *MemDebugLogBufAddr + ) +{ + EFI_HOB_GUID_TYPE *GuidHob; + MEM_DEBUG_LOG_HOB_DATA *HobData; + + GuidHob = GetFirstGuidHob (&gMemDebugLogHobGuid); + if (GuidHob == NULL) { + return EFI_NOT_FOUND; + } else { + HobData = (MEM_DEBUG_LOG_HOB_DATA *)GET_GUID_HOB_DATA (GuidHob); + *MemDebugLogBufAddr = HobData->MemDebugLogBufAddr; + } + + return EFI_SUCCESS; +} + +BOOLEAN +EFIAPI +MemDebugLogEnabled ( + VOID + ) +{ + return TRUE; +} diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogDxe.c b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogDxe.c new file mode 100644 index 000000000000..9655257315e0 --- /dev/null +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogDxe.c @@ -0,0 +1,44 @@ +/** @file + * + Memory Debug Log Library - DXE/Smm + + Copyright (C) 2025, Oracle and/or its affiliates. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include + +EFI_PHYSICAL_ADDRESS mMemDebugLogBufAddr; +BOOLEAN mMemDebugLogBufAddrInit; + +EFI_STATUS +EFIAPI +MemDebugLogWrite ( + IN CHAR8 *Buffer, + IN UINTN Length + ) +{ + EFI_STATUS Status; + + if (!mMemDebugLogBufAddrInit) { + // + // Obtain the Memory Debug Log buffer addr from HOB + // + Status = MemDebugLogAddrFromHOB (&mMemDebugLogBufAddr); + if (EFI_ERROR (Status)) { + mMemDebugLogBufAddr = 0; + } + + mMemDebugLogBufAddrInit = TRUE; + } + + if (mMemDebugLogBufAddr) { + Status = MemDebugLogWriteBuffer (mMemDebugLogBufAddr, Buffer, Length); + } else { + Status = EFI_NOT_FOUND; + } + + return Status; +} diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogDxeLib.inf b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogDxeLib.inf new file mode 100644 index 000000000000..edb405dac191 --- /dev/null +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogDxeLib.inf @@ -0,0 +1,37 @@ +## @file +# Instance of MemDebugLog Library for DXE/Smm +# +# Copyright (C) 2025, Oracle and/or its affiliates. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = MemDebugLogLib + FILE_GUID = 4988621E-8EE8-4D27-862F-EB98BD8F17E6 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = MemDebugLogLib|DXE_CORE DXE_DRIVER UEFI_DRIVER UEFI_APPLICATION SMM_CORE DXE_SMM_DRIVER + + +[Sources] + MemDebugLogDxe.c + MemDebugLogCommon.c + +[Packages] + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + HobLib + SynchronizationLib + +[Guids] + gMemDebugLogHobGuid ## CONSUMES + +[FixedPcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString ## CONSUMES diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf new file mode 100644 index 000000000000..33f8dfee9cd4 --- /dev/null +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf @@ -0,0 +1,31 @@ +## @file +# Null Instance of MemDebugLog Library +# +# Copyright (C) 2025, Oracle and/or its affiliates. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = MemDebugLogLibNull + FILE_GUID = 11b4523c-2c30-44f7-9dee-e6d59eef3d04 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = MemDebugLogLib|SEC PEI_CORE PEIM DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_APPLICATION UEFI_DRIVER SMM_CORE DXE_SMM_DRIVER + + +[Sources] + MemDebugLogNull.c + +[Packages] + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + +[FixedPcd] + +[Guids] diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogNull.c b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogNull.c new file mode 100644 index 000000000000..59bb7c87a0bb --- /dev/null +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogNull.c @@ -0,0 +1,40 @@ +/** @file + * + Memory Debug Log Library - Null. + + Copyright (C) 2025, Oracle and/or its affiliates. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +EFI_STATUS +EFIAPI +MemDebugLogWrite ( + IN CHAR8 *Buffer, + IN UINTN Length + ) +{ + // Null Instance - NOP + return EFI_SUCCESS; +} + +UINT32 +EFIAPI +MemDebugLogPages ( + VOID + ) +{ + return 0; +} + +BOOLEAN +EFIAPI +MemDebugLogEnabled ( + VOID + ) +{ + return FALSE; +} diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPei.c b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPei.c new file mode 100644 index 000000000000..cbdab6c22f86 --- /dev/null +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPei.c @@ -0,0 +1,89 @@ +/** @file + * + Memory Debug Log Library - PEI Phase + + Copyright (C) 2025, Oracle and/or its affiliates. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include + +EFI_PHYSICAL_ADDRESS mMemDebugLogBufAddr; +BOOLEAN mMemDebugLogBufAddrInit; + +EFI_STATUS +EFIAPI +MemDebugLogWrite ( + IN CHAR8 *Buffer, + IN UINTN Length + ) +{ + EFI_STATUS Status; + + if (!mMemDebugLogBufAddrInit) { + // + // Obtain the Memory Debug Log buffer addr from HOB + // NOTE: This is expected to fail until the HOB is created. + // + Status = MemDebugLogAddrFromHOB (&mMemDebugLogBufAddr); + if (EFI_ERROR (Status)) { + mMemDebugLogBufAddr = 0; + } else { + mMemDebugLogBufAddrInit = TRUE; + } + } + + if (mMemDebugLogBufAddr) { + Status = MemDebugLogWriteBuffer (mMemDebugLogBufAddr, Buffer, Length); + } else { + // + // HOB has not yet been created, so + // write to the early debug log buffer. + // + if (FixedPcdGet32 (PcdOvmfEarlyMemDebugLogBase) != 0x0) { + Status = MemDebugLogWriteBuffer ( + (EFI_PHYSICAL_ADDRESS)(UINTN)FixedPcdGet32 (PcdOvmfEarlyMemDebugLogBase), + Buffer, + Length + ); + } else { + Status = EFI_NOT_FOUND; + } + } + + return Status; +} + +UINT32 +EFIAPI +MemDebugLogPages ( + VOID + ) +{ + UINT32 FwCfg_MemDebugLogPages; + UINT32 MemDebugLogBufPages; + EFI_STATUS Status; + + // + // Allow FwCfg value to override Pcd. + // + Status = QemuFwCfgParseUint32 ("opt/ovmf/MemDebugLogPages", TRUE, &FwCfg_MemDebugLogPages); + if (Status == EFI_SUCCESS) { + MemDebugLogBufPages = FwCfg_MemDebugLogPages; + } else { + MemDebugLogBufPages = FixedPcdGet32 (PcdMemDebugLogPages); + } + + // + // Cap max memory debug log size at MAX_MEM_DEBUG_LOG_PAGES + // + if (MemDebugLogBufPages > MAX_MEM_DEBUG_LOG_PAGES) { + MemDebugLogBufPages = MAX_MEM_DEBUG_LOG_PAGES; + } + + return MemDebugLogBufPages; +} diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCore.c b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCore.c new file mode 100644 index 000000000000..1e95d65aaadf --- /dev/null +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCore.c @@ -0,0 +1,58 @@ +/** @file + * + Memory Debug Log Library - PEI Core + + Copyright (C) 2025, Oracle and/or its affiliates. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include + +EFI_PHYSICAL_ADDRESS mMemDebugLogBufAddr; +BOOLEAN mMemDebugLogBufAddrInit; + +EFI_STATUS +EFIAPI +MemDebugLogWrite ( + IN CHAR8 *Buffer, + IN UINTN Length + ) +{ + EFI_STATUS Status; + + if (!mMemDebugLogBufAddrInit) { + // + // Obtain the Memory Debug Log buffer addr from HOB + // NOTE: This is expected to fail until the HOB is created. + // + Status = MemDebugLogAddrFromHOB (&mMemDebugLogBufAddr); + if (EFI_ERROR (Status)) { + mMemDebugLogBufAddr = 0; + } else { + mMemDebugLogBufAddrInit = TRUE; + } + } + + if (mMemDebugLogBufAddr) { + Status = MemDebugLogWriteBuffer (mMemDebugLogBufAddr, Buffer, Length); + } else { + // + // HOB has not yet been created, so + // write to the early debug log buffer. + // + if (FixedPcdGet32 (PcdOvmfEarlyMemDebugLogBase) != 0x0) { + Status = MemDebugLogWriteBuffer ( + (EFI_PHYSICAL_ADDRESS)(UINTN)FixedPcdGet32 (PcdOvmfEarlyMemDebugLogBase), + Buffer, + Length + ); + } else { + Status = EFI_NOT_FOUND; + } + } + + return Status; +} diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCoreLib.inf b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCoreLib.inf new file mode 100644 index 000000000000..56908caa5a7f --- /dev/null +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCoreLib.inf @@ -0,0 +1,40 @@ +## @file +# Instance of MemDebugLog Library for PEI phase +# +# Copyright (C) 2025, Oracle and/or its affiliates. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = MemDebugLogLib + FILE_GUID = EEAF8A01-167A-4222-A647-80EB16AEEC69 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = MemDebugLogLib|PEI_CORE + + +[Sources] + MemDebugLogPeiCore.c + MemDebugLogCommon.c + +[Packages] + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + SynchronizationLib + +[Guids] + gMemDebugLogHobGuid + +[Ppis] + +[FixedPcd] + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogSize + gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString ## CONSUMES diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf new file mode 100644 index 000000000000..18f06e45b3ba --- /dev/null +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf @@ -0,0 +1,49 @@ +## @file +# Instance of MemDebugLog Library for PEI phase +# +# Copyright (C) 2025, Oracle and/or its affiliates. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = MemDebugLogLib + FILE_GUID = D473DE36-0D8A-4F6B-9FA0-126185F36D9D + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = MemDebugLogLib|PEIM + + +[Sources] + MemDebugLogPei.c + MemDebugLogCommon.c + +[Packages] + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + SynchronizationLib + PcdLib + +[LibraryClasses.Ia32] + QemuFwCfgSimpleParserLib + +[LibraryClasses.X64] + QemuFwCfgSimpleParserLib + +[Guids] + gMemDebugLogHobGuid + +[Ppis] + +[FixedPcd] + gUefiOvmfPkgTokenSpaceGuid.PcdMemDebugLogPages + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogSize + gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString ## CONSUMES + diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogRt.c b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogRt.c new file mode 100644 index 000000000000..456bb70a8575 --- /dev/null +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogRt.c @@ -0,0 +1,54 @@ +/** @file + * + Memory Debug Log Library - Runtime + + Copyright (C) 2025, Oracle and/or its affiliates. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include + +EFI_PHYSICAL_ADDRESS mMemDebugLogBufAddr; +BOOLEAN mMemDebugLogBufAddrInit; + +EFI_STATUS +EFIAPI +MemDebugLogWrite ( + IN CHAR8 *Buffer, + IN UINTN Length + ) +{ + EFI_STATUS Status; + + // + // Stop logging after we have switched to virtual mode + // to avoid potential problems (such as crashes accessing + // physical pointers). + // + if (EfiGoneVirtual ()) { + return EFI_SUCCESS; + } + + if (!mMemDebugLogBufAddrInit) { + // + // Obtain the Memory Debug Log buffer addr from HOB + // + Status = MemDebugLogAddrFromHOB (&mMemDebugLogBufAddr); + if (EFI_ERROR (Status)) { + mMemDebugLogBufAddr = 0; + } + + mMemDebugLogBufAddrInit = TRUE; + } + + if (mMemDebugLogBufAddr) { + Status = MemDebugLogWriteBuffer (mMemDebugLogBufAddr, Buffer, Length); + } else { + Status = EFI_NOT_FOUND; + } + + return Status; +} diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogRtLib.inf b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogRtLib.inf new file mode 100644 index 000000000000..a2e47295555c --- /dev/null +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogRtLib.inf @@ -0,0 +1,38 @@ +## @file +# Instance of MemDebugLog Library for Runtime +# +# Copyright (C) 2025, Oracle and/or its affiliates. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = MemDebugLogLib + FILE_GUID = BE0D0FFD-206C-48F3-9910-C32467567C44 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = MemDebugLogLib|DXE_RUNTIME_DRIVER + + +[Sources] + MemDebugLogRt.c + MemDebugLogCommon.c + +[Packages] + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + HobLib + UefiRuntimeLib + SynchronizationLib + +[Guids] + gMemDebugLogHobGuid ## CONSUMES + +[FixedPcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString ## CONSUMES diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogSec.c b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogSec.c new file mode 100644 index 000000000000..62905fc17788 --- /dev/null +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogSec.c @@ -0,0 +1,48 @@ +/** @file + * + Memory Debug Log Library - SEC Phase + + Copyright (C) 2025, Oracle and/or its affiliates. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include + +EFI_STATUS +EFIAPI +MemDebugLogWrite ( + IN CHAR8 *Buffer, + IN UINTN Length + ) +{ + EFI_STATUS Status; + + if (FixedPcdGet32 (PcdOvmfEarlyMemDebugLogBase) != 0x0) { + Status = MemDebugLogWriteBuffer ( + (EFI_PHYSICAL_ADDRESS)(UINTN)FixedPcdGet32 (PcdOvmfEarlyMemDebugLogBase), + Buffer, + Length + ); + } else { + Status = EFI_NOT_FOUND; + } + + return Status; +} + +RETURN_STATUS +EFIAPI +MemDebugLogLibConstructor ( + VOID + ) +{ + if (FixedPcdGet32 (PcdOvmfEarlyMemDebugLogSize) != 0) { + MemDebugLogInit ( + (EFI_PHYSICAL_ADDRESS)(UINTN)FixedPcdGet32 (PcdOvmfEarlyMemDebugLogBase), + (UINT32)FixedPcdGet32 (PcdOvmfEarlyMemDebugLogSize) + ); + } + + return RETURN_SUCCESS; +} diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogSecLib.inf b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogSecLib.inf new file mode 100644 index 000000000000..0817e570c568 --- /dev/null +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogSecLib.inf @@ -0,0 +1,39 @@ +## @file +# Instance of MemDebugLog Library for SEC phase +# +# Copyright (C) 2025, Oracle and/or its affiliates. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = MemDebugLogLib + FILE_GUID = 9B3A8F82-CBCE-4E3A-A3E0-DBD7172E9506 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = MemDebugLogLib|SEC + CONSTRUCTOR = MemDebugLogLibConstructor + + +[Sources] + MemDebugLogSec.c + MemDebugLogCommon.c + +[Packages] + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + SynchronizationLib + +[Guids] + gMemDebugLogHobGuid + +[FixedPcd] + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogSize + gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString ## CONSUMES From 57844e4997caf604469ab0aec4d0b3b895426f49 Mon Sep 17 00:00:00 2001 From: Aaron Young Date: Mon, 28 Apr 2025 09:26:03 -0700 Subject: [PATCH 0068/1172] OvmfPkg: Add OVMF Memory Debug Logging MemDebugLogPei PEIM Add the OvmfPkg MemDebugLogPei PEI Module which is responsible for allocating and initializing the main memory log buffer. Cc: Gerd Hoffmann Cc: Ard Biesheuvel Cc: Jiewen Yao Signed-off-by: Aaron Young --- OvmfPkg/MemDebugLogPei/MemDebugLog.c | 150 ++++++++++++++++++++++ OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf | 58 +++++++++ 2 files changed, 208 insertions(+) create mode 100644 OvmfPkg/MemDebugLogPei/MemDebugLog.c create mode 100644 OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf diff --git a/OvmfPkg/MemDebugLogPei/MemDebugLog.c b/OvmfPkg/MemDebugLogPei/MemDebugLog.c new file mode 100644 index 000000000000..e557202c6de8 --- /dev/null +++ b/OvmfPkg/MemDebugLogPei/MemDebugLog.c @@ -0,0 +1,150 @@ +/** @file + + Memory Debug Log PEIM + + Copyright (C) 2025, Oracle and/or its affiliates. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include +#include +#include +#include + +EFI_STATUS +EFIAPI +MemDebugLogMemAvailCB ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, + IN VOID *Ppi + ); + +CONST EFI_PEI_NOTIFY_DESCRIPTOR mMemAvailNotifyList[] = { + { + (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), + &gEfiPeiMemoryDiscoveredPpiGuid, + MemDebugLogMemAvailCB + } +}; + +EFI_STATUS +EFIAPI +MemDebugLogMemAvailCB ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, + IN VOID *Ppi + ) +{ + UINT32 MemDebugLogBufPages; + EFI_PHYSICAL_ADDRESS MemDebugLogBufAddr; + EFI_HOB_GUID_TYPE *GuidHob; + MEM_DEBUG_LOG_HOB_DATA *HobData; + EFI_STATUS Status; + + MemDebugLogBufPages = MemDebugLogPages (); + + // + // Buffer size of 0 disables memory debug logging. + // + if (!MemDebugLogBufPages) { + MemDebugLogBufAddr = 0; + Status = EFI_SUCCESS; + goto done; + } + + // + // Allocate the memory debug log buffer. + // NOTE: We allocate the buffer as type EfiRuntimeServicesData + // as this seems to allow the buffer to persist and be + // accessible/modifiable throughout runtime (i.e. and avoid + // being locked down by the MemoryAttributesTable code). + // + Status = PeiServicesAllocatePages ( + EfiRuntimeServicesData, + MemDebugLogBufPages, + &MemDebugLogBufAddr + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to allocate Memory Debug Log buffer: %r. Logging disabled\n", __func__, Status)); + MemDebugLogBufAddr = 0; + goto done; + } + + // + // Init the debug log buffer + // + Status = MemDebugLogInit (MemDebugLogBufAddr, (UINT32)EFI_PAGES_TO_SIZE ((UINTN)MemDebugLogBufPages)); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to init Memory Debug Log buffer: %r. Logging disabled\n", __func__, Status)); + PeiServicesFreePages (MemDebugLogBufAddr, MemDebugLogBufPages); + MemDebugLogBufAddr = 0; + goto done; + } + + // + // Copy over the messages from the Early Debug Log buffer. + // + if (FixedPcdGet32 (PcdOvmfEarlyMemDebugLogBase) != 0) { + MemDebugLogCopy (MemDebugLogBufAddr, (EFI_PHYSICAL_ADDRESS)(UINTN)FixedPcdGet32 (PcdOvmfEarlyMemDebugLogBase)); + } + +done: + // + // Zero the early buffer if we successfully + // created the main memory log buffer. + // + if ((Status == EFI_SUCCESS) && (FixedPcdGet32 (PcdOvmfEarlyMemDebugLogBase) != 0)) { + ZeroMem ( + (VOID *)(UINTN)FixedPcdGet32 (PcdOvmfEarlyMemDebugLogBase), + (UINT32)FixedPcdGet32 (PcdOvmfEarlyMemDebugLogSize) + ); + } + + // + // Create HOB to pass mem debug log buffer addr + // + Status = PeiServicesCreateHob ( + EFI_HOB_TYPE_GUID_EXTENSION, + (UINT16)(sizeof (EFI_HOB_GUID_TYPE) + sizeof (MEM_DEBUG_LOG_HOB_DATA)), + (VOID **)&GuidHob + ); + if (EFI_ERROR (Status)) { + if (MemDebugLogBufAddr) { + PeiServicesFreePages (MemDebugLogBufAddr, MemDebugLogBufPages); + } + } else { + // + // Populate the HOB + // + CopyGuid (&GuidHob->Name, &gMemDebugLogHobGuid); + HobData = (MEM_DEBUG_LOG_HOB_DATA *)GET_GUID_HOB_DATA (GuidHob); + HobData->MemDebugLogBufAddr = MemDebugLogBufAddr; + } + + return Status; +} + +EFI_STATUS +EFIAPI +MemDebugLogEntry ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + EFI_STATUS Status; + + // + // Setup callback for memory available notification + // + Status = PeiServicesNotifyPpi (mMemAvailNotifyList); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to create MemDebugLog PEIM Callback: %r. Logging disabled\n", __func__, Status)); + } + + return Status; +} diff --git a/OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf b/OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf new file mode 100644 index 000000000000..dcb595bbb027 --- /dev/null +++ b/OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf @@ -0,0 +1,58 @@ +#/** @file +# +# Memory Debug Log PEIM +# +# Copyright (C) 2025, Oracle and/or its affiliates. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +#**/ + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = MemDebugLogPei + FILE_GUID = 2e501046-26ae-406b-9935-084b61a12e15 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + ENTRY_POINT = MemDebugLogEntry + +# +# For reference only: +# VALID_ARCHITECTURES = X64 +# + +[Sources] + MemDebugLog.c + +[Packages] + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + BaseMemoryLib + DebugLib + HobLib + MemoryAllocationLib + PeiServicesLib + PeiServicesTablePointerLib + PeimEntryPoint + PcdLib + MemDebugLogLib + +[Ppis] + gEfiPeiMemoryDiscoveredPpiGuid ## CONSUMES + +[Guids] + gMemDebugLogHobGuid + +[Pcd] + +[FeaturePcd] + +[FixedPcd] + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogBase ## CONSUMES + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogSize ## CONSUMES + +[Depex] + TRUE From b3bc1954902665253ec2128b9b1e3de1ad14a553 Mon Sep 17 00:00:00 2001 From: Aaron Young Date: Mon, 28 Apr 2025 09:30:12 -0700 Subject: [PATCH 0069/1172] OvmfPkg: Add OVMF Memory Debug Logging support to PlatformDebugLibIoPort Extend OvmfPkg PlatformDebugLibIoPort library to also write debug messages to memory. Include NULL versions of MemDebugLogLib to all OVMF builds which use PlatformDebugLibIoPort. Cc: Gerd Hoffmann Cc: Ard Biesheuvel Cc: Jiewen Yao Signed-off-by: Aaron Young --- OvmfPkg/AmdSev/AmdSevX64.dsc | 1 + OvmfPkg/Bhyve/BhyveX64.dsc | 1 + OvmfPkg/CloudHv/CloudHvX64.dsc | 1 + OvmfPkg/IntelTdx/IntelTdxX64.dsc | 1 + .../Library/PlatformDebugLibIoPort/DebugLib.c | 24 +++++++++++++++---- .../PlatformDebugLibIoPort.inf | 1 + .../PlatformRomDebugLibIoPort.inf | 1 + OvmfPkg/Microvm/MicrovmX64.dsc | 1 + OvmfPkg/OvmfPkgIa32.dsc | 1 + OvmfPkg/OvmfPkgIa32X64.dsc | 1 + OvmfPkg/OvmfPkgX64.dsc | 1 + OvmfPkg/OvmfXen.dsc | 1 + 12 files changed, 31 insertions(+), 4 deletions(-) diff --git a/OvmfPkg/AmdSev/AmdSevX64.dsc b/OvmfPkg/AmdSev/AmdSevX64.dsc index e99fb3bd95a9..df8cc2c2c34e 100644 --- a/OvmfPkg/AmdSev/AmdSevX64.dsc +++ b/OvmfPkg/AmdSev/AmdSevX64.dsc @@ -211,6 +211,7 @@ TdxLib|MdePkg/Library/TdxLib/TdxLib.inf TdxMailboxLib|OvmfPkg/Library/TdxMailboxLib/TdxMailboxLibNull.inf TdxHelperLib|OvmfPkg/IntelTdx/TdxHelperLib/TdxHelperLibNull.inf + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf [LibraryClasses.common.SEC] TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf diff --git a/OvmfPkg/Bhyve/BhyveX64.dsc b/OvmfPkg/Bhyve/BhyveX64.dsc index 5aab790316c7..c4658634b17d 100644 --- a/OvmfPkg/Bhyve/BhyveX64.dsc +++ b/OvmfPkg/Bhyve/BhyveX64.dsc @@ -243,6 +243,7 @@ BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf CcExitLib|UefiCpuPkg/Library/CcExitLibNull/CcExitLibNull.inf TdxLib|MdePkg/Library/TdxLib/TdxLib.inf + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf [LibraryClasses.common.SEC] !ifdef $(DEBUG_ON_SERIAL_PORT) diff --git a/OvmfPkg/CloudHv/CloudHvX64.dsc b/OvmfPkg/CloudHv/CloudHvX64.dsc index a4f6d1c10a2c..0a068ecdeeae 100644 --- a/OvmfPkg/CloudHv/CloudHvX64.dsc +++ b/OvmfPkg/CloudHv/CloudHvX64.dsc @@ -258,6 +258,7 @@ TdxLib|MdePkg/Library/TdxLib/TdxLib.inf TdxMailboxLib|OvmfPkg/Library/TdxMailboxLib/TdxMailboxLibNull.inf TdxHelperLib|OvmfPkg/IntelTdx/TdxHelperLib/TdxHelperLibNull.inf + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf [LibraryClasses.common.SEC] TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf diff --git a/OvmfPkg/IntelTdx/IntelTdxX64.dsc b/OvmfPkg/IntelTdx/IntelTdxX64.dsc index f1d070ca8c46..f1b85b251ecc 100644 --- a/OvmfPkg/IntelTdx/IntelTdxX64.dsc +++ b/OvmfPkg/IntelTdx/IntelTdxX64.dsc @@ -218,6 +218,7 @@ TdxLib|MdePkg/Library/TdxLib/TdxLib.inf TdxMailboxLib|OvmfPkg/Library/TdxMailboxLib/TdxMailboxLib.inf PlatformInitLib|OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf [LibraryClasses.common.SEC] TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf diff --git a/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c index 6895458cf09f..0be04cbd1896 100644 --- a/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c +++ b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "DebugLibDetect.h" // @@ -93,10 +94,11 @@ DebugPrintMarker ( ASSERT (Format != NULL); // - // Check if the global mask disables this message or the device is inactive + // If the global mask disables this message OR the debug I/O port is not + // present and Memory Debug Logging is disabled, there's nothing to do. // if (((ErrorLevel & GetDebugPrintErrorLevel ()) == 0) || - !PlatformDebugLibIoPortFound ()) + (!PlatformDebugLibIoPortFound () && !MemDebugLogEnabled ())) { return; } @@ -111,9 +113,18 @@ DebugPrintMarker ( } // - // Send the print string to the debug I/O port + // Send the print string to the debug I/O port, if present + // + if (PlatformDebugLibIoPortFound ()) { + IoWriteFifo8 (PcdGet16 (PcdDebugIoPort), Length, Buffer); + } + // - IoWriteFifo8 (PcdGet16 (PcdDebugIoPort), Length, Buffer); + // Send string to Memory Debug Log if enabled + // + if (MemDebugLogEnabled ()) { + MemDebugLogWrite (Buffer, Length); + } } /** @@ -221,6 +232,11 @@ DebugAssert ( IoWriteFifo8 (PcdGet16 (PcdDebugIoPort), Length, Buffer); } + // + // Send the string to Memory Debug Log + // + MemDebugLogWrite (Buffer, Length); + // // Generate a Breakpoint, DeadLoop, or NOP based on PCD settings // diff --git a/OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf b/OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf index 94ab9105077a..016391427dbc 100644 --- a/OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf +++ b/OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf @@ -40,6 +40,7 @@ PrintLib BaseLib DebugPrintErrorLevelLib + MemDebugLogLib [Pcd] gUefiOvmfPkgTokenSpaceGuid.PcdDebugIoPort ## CONSUMES diff --git a/OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf b/OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf index c89b1571bad8..17e970dba0e8 100644 --- a/OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf +++ b/OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf @@ -40,6 +40,7 @@ PrintLib BaseLib DebugPrintErrorLevelLib + MemDebugLogLib [Pcd] gUefiOvmfPkgTokenSpaceGuid.PcdDebugIoPort ## CONSUMES diff --git a/OvmfPkg/Microvm/MicrovmX64.dsc b/OvmfPkg/Microvm/MicrovmX64.dsc index 8bd8b686b556..d470ffb256c7 100644 --- a/OvmfPkg/Microvm/MicrovmX64.dsc +++ b/OvmfPkg/Microvm/MicrovmX64.dsc @@ -249,6 +249,7 @@ TdxLib|MdePkg/Library/TdxLib/TdxLib.inf TdxMailboxLib|OvmfPkg/Library/TdxMailboxLib/TdxMailboxLibNull.inf TdxHelperLib|OvmfPkg/IntelTdx/TdxHelperLib/TdxHelperLibNull.inf + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf [LibraryClasses.common.SEC] QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgSecLib.inf diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc index fa73d355ea2b..6c7765206aa9 100644 --- a/OvmfPkg/OvmfPkgIa32.dsc +++ b/OvmfPkg/OvmfPkgIa32.dsc @@ -246,6 +246,7 @@ TdxLib|MdePkg/Library/TdxLib/TdxLib.inf TdxMailboxLib|OvmfPkg/Library/TdxMailboxLib/TdxMailboxLibNull.inf TdxHelperLib|OvmfPkg/IntelTdx/TdxHelperLib/TdxHelperLibNull.inf + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf [LibraryClasses.common.SEC] TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc index 384bb310c3f2..f6b3112c7cb3 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc @@ -251,6 +251,7 @@ TdxLib|MdePkg/Library/TdxLib/TdxLib.inf TdxMailboxLib|OvmfPkg/Library/TdxMailboxLib/TdxMailboxLibNull.inf TdxHelperLib|OvmfPkg/IntelTdx/TdxHelperLib/TdxHelperLibNull.inf + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf [LibraryClasses.common.SEC] TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index 60fccc19d2f2..8f68e0778b0e 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -267,6 +267,7 @@ CcExitLib|OvmfPkg/Library/CcExitLib/CcExitLib.inf TdxLib|MdePkg/Library/TdxLib/TdxLib.inf TdxMailboxLib|OvmfPkg/Library/TdxMailboxLib/TdxMailboxLib.inf + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf [LibraryClasses.common.SEC] TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf diff --git a/OvmfPkg/OvmfXen.dsc b/OvmfPkg/OvmfXen.dsc index 088c63f5c24e..1c797e0cbe03 100644 --- a/OvmfPkg/OvmfXen.dsc +++ b/OvmfPkg/OvmfXen.dsc @@ -235,6 +235,7 @@ BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf CcExitLib|UefiCpuPkg/Library/CcExitLibNull/CcExitLibNull.inf TdxLib|MdePkg/Library/TdxLib/TdxLib.inf + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf [LibraryClasses.common.SEC] QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgSecLib.inf From 44831e815c300a4792dcf7e3f851702bb06445b4 Mon Sep 17 00:00:00 2001 From: Aaron Young Date: Mon, 28 Apr 2025 09:53:39 -0700 Subject: [PATCH 0070/1172] OvmfPkg: Add OVMF Mem Debug Log buffer to PEI mem cap/reserve early buffer Add the memory debug log buffer size (pages) to TotalPages in PlatformPei:GetPeiMemoryCap() help ensure we don't run out of memory. Also Reserve the "early" memory debug log buffer. Cc: Gerd Hoffmann Cc: Ard Biesheuvel Cc: Jiewen Yao Signed-off-by: Aaron Young --- OvmfPkg/Library/PlatformInitLib/MemDetect.c | 14 ++++++++++++++ .../Library/PlatformInitLib/PlatformInitLib.inf | 3 +++ OvmfPkg/PlatformPei/MemDetect.c | 6 ++++++ OvmfPkg/PlatformPei/PlatformPei.inf | 1 + 4 files changed, 24 insertions(+) diff --git a/OvmfPkg/Library/PlatformInitLib/MemDetect.c b/OvmfPkg/Library/PlatformInitLib/MemDetect.c index 44b2e0d24f77..17eaff316065 100644 --- a/OvmfPkg/Library/PlatformInitLib/MemDetect.c +++ b/OvmfPkg/Library/PlatformInitLib/MemDetect.c @@ -1504,6 +1504,20 @@ PlatformQemuInitializeRamForS3 ( ); } + if (FixedPcdGet32 (PcdOvmfEarlyMemDebugLogSize) != 0) { + // + // Reserve the Early Memory Debug Log buffer + // + // Since this memory range will be used on S3 resume, it must be + // reserved as ACPI NVS. + // + BuildMemoryAllocationHob ( + (EFI_PHYSICAL_ADDRESS)(UINTN)FixedPcdGet32 (PcdOvmfEarlyMemDebugLogBase), + (UINT64)(UINTN)FixedPcdGet32 (PcdOvmfEarlyMemDebugLogSize), + PlatformInfoHob->S3Supported ? EfiACPIMemoryNVS : EfiBootServicesData + ); + } + #endif } } diff --git a/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf b/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf index c79b2ee1065a..fe46dc071775 100644 --- a/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf +++ b/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf @@ -107,5 +107,8 @@ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageVariableBase gUefiOvmfPkgTokenSpaceGuid.PcdCfvRawDataSize + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogSize + [FeaturePcd] gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode diff --git a/OvmfPkg/PlatformPei/MemDetect.c b/OvmfPkg/PlatformPei/MemDetect.c index 04409b28bacf..19137df7fbb0 100644 --- a/OvmfPkg/PlatformPei/MemDetect.c +++ b/OvmfPkg/PlatformPei/MemDetect.c @@ -29,6 +29,7 @@ Module Name: #include #include #include +#include #include #include #include @@ -250,6 +251,11 @@ GetPeiMemoryCap ( ASSERT (TotalPages <= 0x404); } + // + // Add Memory Debug Log Buffer Pages (which can large) + // + TotalPages += MemDebugLogPages (); + // // With 32k stacks and 4096 vcpus this lands at 128 MB (far away // from MAX_UINT32). diff --git a/OvmfPkg/PlatformPei/PlatformPei.inf b/OvmfPkg/PlatformPei/PlatformPei.inf index 1b2af6f3e60d..1f1616c569b7 100644 --- a/OvmfPkg/PlatformPei/PlatformPei.inf +++ b/OvmfPkg/PlatformPei/PlatformPei.inf @@ -72,6 +72,7 @@ PlatformInitLib SmmRelocationLib TdxHelperLib + MemDebugLogLib [Pcd] gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase From b1887152024c7eb0cc7de735b0b57febd6099bf9 Mon Sep 17 00:00:00 2001 From: Aaron Young Date: Mon, 28 Apr 2025 09:58:50 -0700 Subject: [PATCH 0071/1172] OvmfPkg: Add OVMF Memory Debug Logging to Ia32X64 and X64 OVMF builds Add the OVMF Memory Debug Logging feature (MemDebugLogLib library and MemDebugLogPei PEIM) to the Ia32X64 and X64 OVMF builds. This includes reserving the "early" memory debug log buffer in the .fdf files. The OVMF Memory Debug Logging feature is enabled via the -D DEBUG_TO_MEM build flag. Cc: Gerd Hoffmann Cc: Ard Biesheuvel Cc: Jiewen Yao Signed-off-by: Aaron Young --- OvmfPkg/OvmfPkgIa32X64.dsc | 25 +++++++++++++++++++++++++ OvmfPkg/OvmfPkgIa32X64.fdf | 11 ++++++++++- OvmfPkg/OvmfPkgX64.dsc | 25 +++++++++++++++++++++++++ OvmfPkg/OvmfPkgX64.fdf | 11 ++++++++++- 4 files changed, 70 insertions(+), 2 deletions(-) diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc index f6b3112c7cb3..bab9b91b0ad0 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc @@ -251,7 +251,11 @@ TdxLib|MdePkg/Library/TdxLib/TdxLib.inf TdxMailboxLib|OvmfPkg/Library/TdxMailboxLib/TdxMailboxLibNull.inf TdxHelperLib|OvmfPkg/IntelTdx/TdxHelperLib/TdxHelperLibNull.inf +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogDxeLib.inf +!else MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf +!endif [LibraryClasses.common.SEC] TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf @@ -260,6 +264,9 @@ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf !else DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf +!endif +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogSecLib.inf !endif ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf ExtractGuidedSectionLib|MdePkg/Library/BaseExtractGuidedSectionLib/BaseExtractGuidedSectionLib.inf @@ -286,6 +293,9 @@ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf !else DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf +!endif +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCoreLib.inf !endif PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf @@ -302,6 +312,9 @@ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf !else DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf +!endif +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf !endif PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf ResourcePublicationLib|MdePkg/Library/PeiResourcePublicationLib/PeiResourcePublicationLib.inf @@ -347,6 +360,9 @@ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf !else DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf +!endif +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogRtLib.inf !endif UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf BaseCryptLib|CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf @@ -692,6 +708,9 @@ # PEI Phase modules # MdeModulePkg/Core/Pei/PeiMain.inf +!if $(DEBUG_TO_MEM) + OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf +!endif MdeModulePkg/Universal/PCD/Pei/Pcd.inf { PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf @@ -738,6 +757,9 @@ MdeModulePkg/Universal/PCD/Dxe/Pcd.inf { PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf +!endif } MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf @@ -815,6 +837,9 @@ DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf +!endif } MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf index 2ad26713f60c..41981d58d899 100644 --- a/OvmfPkg/OvmfPkgIa32X64.fdf +++ b/OvmfPkg/OvmfPkgIa32X64.fdf @@ -82,10 +82,13 @@ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvm 0x010000|0x010000 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize -0x020000|0x0E0000 +0x020000|0x0D0000 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize FV = PEIFV +0x0F0000|0x10000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogSize + 0x100000|0xE80000 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize FV = DXEFV @@ -152,6 +155,9 @@ READ_LOCK_CAP = TRUE READ_LOCK_STATUS = TRUE APRIORI PEI { +!if $(DEBUG_TO_MEM) + INF OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf +!endif INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf } @@ -162,6 +168,9 @@ INF MdeModulePkg/Core/Pei/PeiMain.inf INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf INF MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouterPei.inf INF MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCodeHandlerPei.inf +!if $(DEBUG_TO_MEM) +INF OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf +!endif INF OvmfPkg/PlatformPei/PlatformPei.inf INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf INF UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index 8f68e0778b0e..0b7955c42dde 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -267,7 +267,11 @@ CcExitLib|OvmfPkg/Library/CcExitLib/CcExitLib.inf TdxLib|MdePkg/Library/TdxLib/TdxLib.inf TdxMailboxLib|OvmfPkg/Library/TdxMailboxLib/TdxMailboxLib.inf +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogDxeLib.inf +!else MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf +!endif [LibraryClasses.common.SEC] TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf @@ -276,6 +280,9 @@ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf !else DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf +!endif +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogSecLib.inf !endif ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf ExtractGuidedSectionLib|MdePkg/Library/BaseExtractGuidedSectionLib/BaseExtractGuidedSectionLib.inf @@ -305,6 +312,9 @@ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf !else DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf +!endif +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCoreLib.inf !endif PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf CcProbeLib|OvmfPkg/Library/CcProbeLib/SecPeiCcProbeLib.inf @@ -322,6 +332,9 @@ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf !else DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf +!endif +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf !endif PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf ResourcePublicationLib|MdePkg/Library/PeiResourcePublicationLib/PeiResourcePublicationLib.inf @@ -371,6 +384,9 @@ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf !else DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf +!endif +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogRtLib.inf !endif UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf BaseCryptLib|CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf @@ -722,6 +738,9 @@ # PEI Phase modules # MdeModulePkg/Core/Pei/PeiMain.inf +!if $(DEBUG_TO_MEM) + OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf +!endif MdeModulePkg/Universal/PCD/Pei/Pcd.inf { PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf @@ -796,6 +815,9 @@ MdeModulePkg/Universal/PCD/Dxe/Pcd.inf { PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf +!endif } MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf @@ -896,6 +918,9 @@ DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf +!endif } MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf index 06ae0cafc110..c1a9977b7244 100644 --- a/OvmfPkg/OvmfPkgX64.fdf +++ b/OvmfPkg/OvmfPkgX64.fdf @@ -103,10 +103,13 @@ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecApicPageTableBase|gUefiOvmfPkgTokenSpaceGui 0x011000|0x00F000 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize -0x020000|0x0E0000 +0x020000|0x0D0000 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize FV = PEIFV +0x0F0000|0x10000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogSize + 0x100000|0xE80000 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize FV = DXEFV @@ -173,6 +176,9 @@ READ_LOCK_CAP = TRUE READ_LOCK_STATUS = TRUE APRIORI PEI { +!if $(DEBUG_TO_MEM) + INF OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf +!endif INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf } @@ -183,6 +189,9 @@ INF MdeModulePkg/Core/Pei/PeiMain.inf INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf INF MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouterPei.inf INF MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCodeHandlerPei.inf +!if $(DEBUG_TO_MEM) +INF OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf +!endif !if $(CC_MEASUREMENT_ENABLE) == TRUE INF OvmfPkg/Tcg/TdTcg2Pei/TdTcg2Pei.inf !endif From 92bf30908fd4027962aff8ce239027e50b4106f8 Mon Sep 17 00:00:00 2001 From: abdattar Date: Tue, 15 Apr 2025 09:55:39 +0000 Subject: [PATCH 0072/1172] DynamicTablesPkg: Add SLIT table generator library Introduce a common architecture SLIT table generator library that retrieves locality domain distance information from the configuration manager and generates the table accordingly. Signed-off-by: abdattar --- DynamicTablesPkg/DynamicTables.dsc.inc | 3 + DynamicTablesPkg/Include/AcpiTableGenerator.h | 3 + .../Acpi/Common/AcpiSlitLib/AcpiSlitLib.inf | 29 + .../Acpi/Common/AcpiSlitLib/SlitGenerator.c | 626 ++++++++++++++++++ 4 files changed, 661 insertions(+) create mode 100755 DynamicTablesPkg/Library/Acpi/Common/AcpiSlitLib/AcpiSlitLib.inf create mode 100755 DynamicTablesPkg/Library/Acpi/Common/AcpiSlitLib/SlitGenerator.c diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc index 6509275a4b1e..371efe9115e7 100644 --- a/DynamicTablesPkg/DynamicTables.dsc.inc +++ b/DynamicTablesPkg/DynamicTables.dsc.inc @@ -43,6 +43,7 @@ DynamicTablesPkg/Library/Acpi/Common/AcpiSpcrLib/AcpiSpcrLib.inf DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf DynamicTablesPkg/Library/Acpi/Common/AcpiTpm2Lib/AcpiTpm2Lib.inf + DynamicTablesPkg/Library/Acpi/Common/AcpiSlitLib/AcpiSlitLib.inf DynamicTablesPkg/Library/Acpi/Common/AcpiSpmiLib/AcpiSpmiLib.inf # AML Fixup (Common) @@ -77,6 +78,7 @@ NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiCedtLib/AcpiCedtLib.inf NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiFadtLib/AcpiFadtLib.inf NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf + NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSlitLib/AcpiSlitLib.inf NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSpmiLib/AcpiSpmiLib.inf # X64 specific NULL|DynamicTablesPkg/Library/Acpi/X64/AcpiFacsLib/AcpiFacsLib.inf @@ -116,6 +118,7 @@ NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiPpttLib/AcpiPpttLib.inf NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiRawLib/AcpiRawLib.inf NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSpcrLib/AcpiSpcrLib.inf + NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSlitLib/AcpiSlitLib.inf NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSpmiLib/AcpiSpmiLib.inf NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiTpm2Lib/AcpiTpm2Lib.inf diff --git a/DynamicTablesPkg/Include/AcpiTableGenerator.h b/DynamicTablesPkg/Include/AcpiTableGenerator.h index 7618d276b8b3..972fc0275b8c 100755 --- a/DynamicTablesPkg/Include/AcpiTableGenerator.h +++ b/DynamicTablesPkg/Include/AcpiTableGenerator.h @@ -82,6 +82,8 @@ The Dynamic Tables Framework implements the following ACPI table generators: Configuration Manager and builds the FACS table. - CEDT : The CEDT generator collates the CEDT information from the Configuration Manager and builds the CEDT table. + - SLIT : The SLIT generator collates the SLIT information from the + Configuration Manager and builds the SLIT table. */ /** The ACPI_TABLE_GENERATOR_ID type describes ACPI table generator ID. @@ -117,6 +119,7 @@ typedef enum StdAcpiTableId { EStdAcpiTableIdSpmi, ///< SPMI Generator EStdAcpiTableIdFacs, ///< FACS Generator EStdAcpiTableIdCedt, ///< CEDT Generator + EStdAcpiTableIdSlit, ///< SLIT Generator EStdAcpiTableIdMax } ESTD_ACPI_TABLE_ID; diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSlitLib/AcpiSlitLib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiSlitLib/AcpiSlitLib.inf new file mode 100755 index 000000000000..dcc2670cec2f --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSlitLib/AcpiSlitLib.inf @@ -0,0 +1,29 @@ +## @file +# SLIT Table Generator +# +# Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 1.30 + BASE_NAME = AcpiSlitLib + FILE_GUID = 5735C624-E8ED-426C-8292-6712EF4D8329 + VERSION_STRING = 1.0 + MODULE_TYPE = DXE_DRIVER + LIBRARY_CLASS = NULL|DXE_DRIVER + CONSTRUCTOR = AcpiSlitLibConstructor + DESTRUCTOR = AcpiSlitLibDestructor + +[Sources] + SlitGenerator.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + DynamicTablesPkg/DynamicTablesPkg.dec + +[LibraryClasses] + BaseLib + CmObjHelperLib diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSlitLib/SlitGenerator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiSlitLib/SlitGenerator.c new file mode 100755 index 000000000000..d3e7207ee628 --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSlitLib/SlitGenerator.c @@ -0,0 +1,626 @@ +/** @file + SLIT Table Generator + + Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include + +// Module specific include files. +#include +#include +#include +#include +#include +#include + +#define SLIT_DISTANCE_NORMALIZED 10 +#define SLIT_DISTANCE_UNREACHABLE 0xFF + +/** Structure to hold domain relation information. + */ +typedef struct { + UINT32 DomainIdSrc; + UINT32 DomainIdDst; + UINT64 Relation; +} DOMAIN_RELATION_INFO; + +/** Standard SLIT Generator + +Requirements: + The following Configuration Manager Object(s) are required by + this Generator: + - EArchCommonObjSystemLocalityInfo + - EArchCommonObjProximityDomainRelationInfo + - EArchCommonObjProximityDomainInfo +*/ + +/** Retrieve the System locality information. */ +GET_OBJECT_LIST ( + EObjNameSpaceArchCommon, + EArchCommonObjSystemLocalityInfo, + CM_ARCH_COMMON_SYSTEM_LOCALITY_INFO + ); + +/** Retrieve the Proximity Domain relation information. */ +GET_OBJECT_LIST ( + EObjNameSpaceArchCommon, + EArchCommonObjProximityDomainRelationInfo, + CM_ARCH_COMMON_PROXIMITY_DOMAIN_RELATION_INFO + ); + +/** Retrieve the System Locality domain information. + + This function fetches the System Locality data from the + Configuration Manager. + + The caller is responsible for freeing the memory allocated for + the System Locality data, i.e., SlitDomainRelationInfo. + + @param [in] CfgMgrProtocol Pointer to the Configuration Manager Protocol. + @param [out] SlitDomainRelationInfoCount Pointer to the count of System Locality + domain information entries. + @param [out] SlitDomainRelationInfo Pointer to the System Locality domain information. + + @retval EFI_SUCCESS Successfully retrieved the System Locality domain information. + @retval EFI_INVALID_PARAMETER One or more parameters are invalid. + @retval retval Errors returned by the Configuration Manager Protocol. +**/ +STATIC +EFI_STATUS +EFIAPI +GetProximityDomainInfo ( + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + OUT UINT32 *SlitDomainRelationInfoCount, + OUT DOMAIN_RELATION_INFO **SlitDomainRelationInfo + ) +{ + CM_ARCH_COMMON_PROXIMITY_DOMAIN_RELATION_INFO *DomainRelationInfo; + CM_ARCH_COMMON_SYSTEM_LOCALITY_INFO *SystemLocalityInfo; + DOMAIN_RELATION_INFO *RelationInfo; + EFI_STATUS Status; + UINT32 DomainIdFirst; + UINT32 DomainIdSecond; + UINT32 DomainRelationInfoCount; + UINT32 Index; + + if ((CfgMgrProtocol == NULL) || + (SlitDomainRelationInfoCount == NULL) || + (SlitDomainRelationInfo == NULL)) + { + return EFI_INVALID_PARAMETER; + } + + Status = GetEArchCommonObjSystemLocalityInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &SystemLocalityInfo, + NULL + ); + + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SLIT: Failed to retrieve SLIT information. Status = %r\n", + Status + )); + return Status; + } + + if (SystemLocalityInfo == NULL) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SLIT: No SLIT information provided by configuration manager.\n" + )); + return EFI_NOT_FOUND; + } + + Status = GetEArchCommonObjProximityDomainRelationInfo ( + CfgMgrProtocol, + SystemLocalityInfo->RelativeDistanceArray, + &DomainRelationInfo, + &DomainRelationInfoCount + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SLIT: Failed to get domain relation info. Status = %r\n", + Status + )); + return Status; + } + + if ((DomainRelationInfo == NULL) || (DomainRelationInfoCount == 0)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SLIT: No domain relation info from config manager.\n" + )); + return EFI_NOT_FOUND; + } + + RelationInfo = AllocateZeroPool ( + sizeof (DOMAIN_RELATION_INFO) * DomainRelationInfoCount + ); + if (RelationInfo == NULL) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SLIT: Failed to allocate memory for SLIT relation info.\n" + )); + return EFI_OUT_OF_RESOURCES; + } + + for (Index = 0; Index < DomainRelationInfoCount; Index++) { + if ((DomainRelationInfo[Index].Relation < SLIT_DISTANCE_NORMALIZED) || + (DomainRelationInfo[Index].Relation > SLIT_DISTANCE_UNREACHABLE)) + { + DEBUG (( + DEBUG_ERROR, + "ERROR: SLIT: Invalid relation value %d\n", + DomainRelationInfo[Index].Relation + )); + FreePool (RelationInfo); + return EFI_INVALID_PARAMETER; + } + + Status = GetProximityDomainId ( + CfgMgrProtocol, + 0, + DomainRelationInfo[Index].FirstDomainToken, + &DomainIdFirst + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SLIT: Failed to retrieve First Domain ID. Status = %r\n", + Status + )); + FreePool (RelationInfo); + return Status; + } + + Status = GetProximityDomainId ( + CfgMgrProtocol, + 0, + DomainRelationInfo[Index].SecondDomainToken, + &DomainIdSecond + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SLIT: Failed to retrieve Second Domain ID. Status = %r\n", + Status + )); + FreePool (RelationInfo); + return Status; + } + + if (DomainIdFirst == DomainIdSecond) { + if (DomainRelationInfo[Index].Relation != SLIT_DISTANCE_NORMALIZED) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SLIT: Invalid relation value %d for same domain ID %d\n", + DomainRelationInfo[Index].Relation, + DomainIdFirst + )); + FreePool (RelationInfo); + return EFI_INVALID_PARAMETER; + } + } + + RelationInfo[Index].DomainIdSrc = DomainIdFirst; + RelationInfo[Index].DomainIdDst = DomainIdSecond; + RelationInfo[Index].Relation = DomainRelationInfo[Index].Relation; + } + + *SlitDomainRelationInfoCount = DomainRelationInfoCount; + *SlitDomainRelationInfo = RelationInfo; + return EFI_SUCCESS; +} + +/** Get the number of System Localities. + + This function calculates the number of System Localities based on + the maximum locality ID found in the SLIT domain relation information. + + @param [in] SlitDomainRelationInfo Pointer to the SLIT domain relation information. + @param [in] SlitDomainRelationInfoCount The count of SLIT domain relation information entries. + @param [out] NumberOfSystemLocalities Pointer to the number of System Localities. + + @retval EFI_SUCCESS Successfully retrieved the number of System Localities. + @retval EFI_INVALID_PARAMETER One or more parameters are invalid +**/ +STATIC +EFI_STATUS +EFIAPI +GetNumberOfSystemLocalities ( + IN DOMAIN_RELATION_INFO *SlitDomainRelationInfo, + IN UINT32 SlitDomainRelationInfoCount, + OUT UINT32 *NumberOfSystemLocalities + ) +{ + UINT32 Index; + UINT32 MaxLocality; + + if ((SlitDomainRelationInfo == NULL) || + (NumberOfSystemLocalities == NULL) || + (SlitDomainRelationInfoCount == 0)) + { + return EFI_INVALID_PARAMETER; + } + + MaxLocality = 0; + for (Index = 0; Index < SlitDomainRelationInfoCount; Index++) { + MaxLocality = MAX ( + MaxLocality, + MAX ( + SlitDomainRelationInfo[Index].DomainIdSrc, + SlitDomainRelationInfo[Index].DomainIdDst + ) + ); + } + + *NumberOfSystemLocalities = MaxLocality + 1; + return EFI_SUCCESS; +} + +/** Get the SLIT entry. + + This function constructs the SLIT entry based on the SLIT domain relation + information and the number of System Localities. + + @param [in] SlitDomainRelationInfo Pointer to the SLIT domain relation information. + @param [in] SlitDomainRelationInfoCount The count of SLIT domain relation information entries. + @param [in] NumberOfSystemLocalities The number of System Localities. + @param [in, out] SlitEntry Pointer to the SLIT entry. + + @retval EFI_SUCCESS Successfully retrieved the SLIT entry. + @retval EFI_INVALID_PARAMETER One or more parameters are invalid. +**/ +STATIC +EFI_STATUS +EFIAPI +GetSlitEntry ( + IN DOMAIN_RELATION_INFO *SlitDomainRelationInfo, + IN UINT32 SlitDomainRelationInfoCount, + IN UINT32 NumberOfSystemLocalities, + IN OUT UINT8 *SlitEntry + ) +{ + UINT32 Index; + UINT32 LocalitySrc; + UINT32 LocalityDst; + UINT32 SrcIndex; + UINT32 DstIndex; + + if ((SlitDomainRelationInfo == NULL) || + (SlitEntry == NULL) || + (NumberOfSystemLocalities == 0) || + (SlitDomainRelationInfoCount == 0)) + { + return EFI_INVALID_PARAMETER; + } + + SetMem ( + SlitEntry, + sizeof (UINT8) * NumberOfSystemLocalities * NumberOfSystemLocalities, + SLIT_DISTANCE_UNREACHABLE + ); + for (Index = 0; Index < NumberOfSystemLocalities; Index++) { + SlitEntry[(Index * NumberOfSystemLocalities) + Index] = SLIT_DISTANCE_NORMALIZED; + } + + for (Index = 0; Index < SlitDomainRelationInfoCount; Index++) { + LocalitySrc = SlitDomainRelationInfo[Index].DomainIdSrc; + LocalityDst = SlitDomainRelationInfo[Index].DomainIdDst; + SrcIndex = (LocalitySrc * NumberOfSystemLocalities) + LocalityDst; + DstIndex = (LocalityDst * NumberOfSystemLocalities) + LocalitySrc; + + /// compare with default normalized + if (SlitDomainRelationInfo[Index].Relation == SLIT_DISTANCE_NORMALIZED) { + if ((SlitEntry[SrcIndex] != SLIT_DISTANCE_NORMALIZED) || + (SlitEntry[DstIndex] != SLIT_DISTANCE_NORMALIZED)) + { + DEBUG (( + DEBUG_ERROR, + "ERROR: SLIT: Invalid normalized value Src[%d] = %d, Dst[%d] = %d.\n", + SrcIndex, + SlitEntry[SrcIndex], + DstIndex, + SlitEntry[DstIndex] + )); + return EFI_INVALID_PARAMETER; + } + + continue; + } + + /// Compare with default unreachable and symmetric value + if (SlitDomainRelationInfo[Index].Relation == SLIT_DISTANCE_UNREACHABLE) { + if ((SlitEntry[SrcIndex] != SLIT_DISTANCE_UNREACHABLE) || + (SlitEntry[DstIndex] != SLIT_DISTANCE_UNREACHABLE)) + { + DEBUG (( + DEBUG_ERROR, + "ERROR: SLIT: Invalid unreachable value Src[%d] = %d, Dst[%d] = %d\n", + SrcIndex, + SlitEntry[SrcIndex], + DstIndex, + SlitEntry[DstIndex] + )); + return EFI_INVALID_PARAMETER; + } + + continue; + } + + if ((SlitEntry[SrcIndex] != SLIT_DISTANCE_UNREACHABLE) && + (SlitEntry[SrcIndex] != SlitDomainRelationInfo[Index].Relation)) + { + DEBUG (( + DEBUG_ERROR, + "ERROR: SLIT: Invalid existing value %d for Src %d Dst %d\n", + SlitEntry[SrcIndex], + LocalitySrc, + LocalityDst + )); + return EFI_INVALID_PARAMETER; + } + + SlitEntry[SrcIndex] = (SlitDomainRelationInfo[Index].Relation & MAX_UINT8); + + if ((SlitEntry[DstIndex] != SLIT_DISTANCE_UNREACHABLE) && + (SlitEntry[DstIndex] != SlitDomainRelationInfo[Index].Relation)) + { + DEBUG (( + DEBUG_ERROR, + "ERROR: SLIT: Invalid existing value %d for Dst %d Src %d\n", + SlitEntry[DstIndex], + LocalityDst, + LocalitySrc + )); + return EFI_INVALID_PARAMETER; + } + + SlitEntry[DstIndex] = (SlitDomainRelationInfo[Index].Relation & MAX_UINT8); + } + + return EFI_SUCCESS; +} + +/** Construct the SLIT ACPI table. + + This function invokes the Configuration Manager protocol interface + to get the required hardware information for generating the ACPI + table. + + If this function allocates any resources then they must be freed + in the FreeXXXXTableResources function. + + @param [in] This Pointer to the table generator. + @param [in] AcpiTableInfo Pointer to the ACPI Table Info. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [out] Table Pointer to the constructed ACPI Table. + + @retval EFI_SUCCESS Table generated successfully. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND The required object was not found. + @retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration + Manager is less than the Object size for the + requested object. +**/ +STATIC +EFI_STATUS +EFIAPI +BuildSlitTable ( + IN CONST ACPI_TABLE_GENERATOR *CONST This, + IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + OUT EFI_ACPI_DESCRIPTION_HEADER **CONST Table + ) +{ + DOMAIN_RELATION_INFO *SlitDomainRelationInfo; + EFI_STATUS Status; + UINT32 NumberOfSystemLocalities; + UINT32 SlitDomainRelationInfoCount; + UINT8 *SlitEntry; + + EFI_ACPI_6_5_SYSTEM_LOCALITY_DISTANCE_INFORMATION_TABLE_HEADER *AcpiSlitTable; + + ASSERT (This != NULL); + ASSERT (AcpiTableInfo != NULL); + ASSERT (CfgMgrProtocol != NULL); + ASSERT (Table != NULL); + ASSERT (AcpiTableInfo->TableGeneratorId == This->GeneratorID); + ASSERT (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature); + + if ((AcpiTableInfo->AcpiTableRevision < This->MinAcpiTableRevision) || + (AcpiTableInfo->AcpiTableRevision > This->AcpiTableRevision)) + { + DEBUG (( + DEBUG_ERROR, + "ERROR: SLIT: Requested table revision = %d, is not supported." + "Supported table revision: Minimum = %d, Maximum = %d\n", + AcpiTableInfo->AcpiTableRevision, + This->MinAcpiTableRevision, + This->AcpiTableRevision + )); + return EFI_INVALID_PARAMETER; + } + + *Table = NULL; + + Status = GetProximityDomainInfo ( + CfgMgrProtocol, + &SlitDomainRelationInfoCount, + &SlitDomainRelationInfo + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SLIT: Failed to get domain info. Status = %r\n", + Status + )); + return Status; + } + + Status = GetNumberOfSystemLocalities ( + SlitDomainRelationInfo, + SlitDomainRelationInfoCount, + &NumberOfSystemLocalities + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SLIT: Failed to get NumberOfSystemLocalities. Status = %r\n", + Status + )); + FreePool (SlitDomainRelationInfo); + return Status; + } + + AcpiSlitTable = AllocateZeroPool ( + sizeof (EFI_ACPI_6_5_SYSTEM_LOCALITY_DISTANCE_INFORMATION_TABLE_HEADER) + + (sizeof (UINT8) * NumberOfSystemLocalities * NumberOfSystemLocalities) + ); + if (AcpiSlitTable == NULL) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SLIT: Failed to allocate memory for SLIT table.\n" + )); + FreePool (SlitDomainRelationInfo); + return EFI_OUT_OF_RESOURCES; + } + + AcpiSlitTable->NumberOfSystemLocalities = NumberOfSystemLocalities; + + SlitEntry = (UINT8 *)AcpiSlitTable; + SlitEntry = SlitEntry + sizeof (EFI_ACPI_6_5_SYSTEM_LOCALITY_DISTANCE_INFORMATION_TABLE_HEADER); + + Status = GetSlitEntry ( + SlitDomainRelationInfo, + SlitDomainRelationInfoCount, + NumberOfSystemLocalities, + SlitEntry + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SLIT: Failed to get SLIT entry. Status = %r\n", + Status + )); + FreePool (AcpiSlitTable); + FreePool (SlitDomainRelationInfo); + return Status; + } + + FreePool (SlitDomainRelationInfo); + Status = AddAcpiHeader ( + CfgMgrProtocol, + This, + (EFI_ACPI_DESCRIPTION_HEADER *)AcpiSlitTable, + AcpiTableInfo, + (sizeof (EFI_ACPI_6_5_SYSTEM_LOCALITY_DISTANCE_INFORMATION_TABLE_HEADER) + + (sizeof (UINT8) * NumberOfSystemLocalities * NumberOfSystemLocalities)) + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SLIT: Failed to add ACPI header. Status = %r\n", + Status + )); + FreePool (AcpiSlitTable); + return Status; + } + + *Table = (EFI_ACPI_DESCRIPTION_HEADER *)AcpiSlitTable; + return Status; +} + +/** This macro defines the SLIT Table Generator revision. +*/ +#define SLIT_GENERATOR_REVISION CREATE_REVISION (1, 0) + +/** The interface for the SLIT Table Generator. +*/ +STATIC +CONST +ACPI_TABLE_GENERATOR SpmiGenerator = { + // Generator ID + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdSlit), + // Generator Description + L"ACPI.STD.SLIT.GENERATOR", + // ACPI Table Signature + EFI_ACPI_6_5_SYSTEM_LOCALITY_INFORMATION_TABLE_SIGNATURE, + // ACPI Table Revision supported by this Generator + EFI_ACPI_6_5_SYSTEM_LOCALITY_DISTANCE_INFORMATION_TABLE_REVISION, + // Minimum supported ACPI Table Revision + EFI_ACPI_6_5_SYSTEM_LOCALITY_DISTANCE_INFORMATION_TABLE_REVISION, + // Creator ID + TABLE_GENERATOR_CREATOR_ID, + // Creator Revision + SLIT_GENERATOR_REVISION, + // Build Table function + BuildSlitTable, + // Free Resource function + NULL, + // Extended build function not needed + NULL, + // Extended build function not implemented by the generator. + // Hence extended free resource function is not required. + NULL +}; + +/** Register the Generator with the ACPI Table Factory. + + @param [in] ImageHandle The handle to the image. + @param [in] SystemTable Pointer to the System Table. + + @retval EFI_SUCCESS The Generator is registered. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_ALREADY_STARTED The Generator for the Table ID + is already registered. +**/ +EFI_STATUS +EFIAPI +AcpiSlitLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = RegisterAcpiTableGenerator (&SpmiGenerator); + DEBUG ((DEBUG_INFO, "SLIT: Register Generator. Status = %r\n", Status)); + ASSERT_EFI_ERROR (Status); + return Status; +} + +/** Deregister the Generator from the ACPI Table Factory. + + @param [in] ImageHandle The handle to the image. + @param [in] SystemTable Pointer to the System Table. + + @retval EFI_SUCCESS The Generator is deregistered. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND The Generator is not registered. +**/ +EFI_STATUS +EFIAPI +AcpiSlitLibDestructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = DeregisterAcpiTableGenerator (&SpmiGenerator); + DEBUG ((DEBUG_INFO, "SLIT: Deregister Generator. Status = %r\n", Status)); + ASSERT_EFI_ERROR (Status); + return Status; +} From 8810c3b2702c86de7246d6644e1e16642fd64f90 Mon Sep 17 00:00:00 2001 From: Damien Date: Tue, 10 Jun 2025 11:00:46 +0800 Subject: [PATCH 0073/1172] edksetup.sh: Update "inux" to "Unix-like" This commit replaces the outdated and less common term "inux" with "Unix-like." While "inux" historically served as an abbreviation for Unix-like systems, the term "Unix-like" is now the widely accepted and more precise descriptor in the industry, as detailed by sources like Wikipedia's "Unix-like" entry. This change enhances readability and ensures consistency with current technical vocabulary, making the text clearer for a broader audience. Signed-off-by: Damien Chen --- edksetup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/edksetup.sh b/edksetup.sh index 0ae32ea8cc91..d36c690e51f5 100755 --- a/edksetup.sh +++ b/edksetup.sh @@ -3,7 +3,7 @@ # Copyright (c) 2016, Linaro Ltd. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent # -# In *inux environment, the build tools's source is required and need to be compiled +# In Unix-like environment, the build tools's source is required and need to be compiled # firstly, please reference https://github.com/tianocore/tianocore.github.io/wiki/SourceForge-to-Github-Quick-Start # to get how to setup build tool. # From 45010d2812555ee53a681522099d063b342694e8 Mon Sep 17 00:00:00 2001 From: Kevin Tsai Date: Tue, 3 Jun 2025 12:10:26 -0700 Subject: [PATCH 0074/1172] UefiPayloadPkg: fix SPI prefetch and cache disable setting fix SPI prefetch and cache disable value and define SRC bitfield position correct register setting in SaveAndDisableSpiPrefetchCache Signed-off-by: Kevin Tsai --- UefiPayloadPkg/Library/SpiFlashLib/PchSpi.c | 6 +++--- UefiPayloadPkg/Library/SpiFlashLib/RegsSpi.h | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/UefiPayloadPkg/Library/SpiFlashLib/PchSpi.c b/UefiPayloadPkg/Library/SpiFlashLib/PchSpi.c index 18f4a0ba3f69..04a69fb7d415 100644 --- a/UefiPayloadPkg/Library/SpiFlashLib/PchSpi.c +++ b/UefiPayloadPkg/Library/SpiFlashLib/PchSpi.c @@ -144,10 +144,10 @@ SaveAndDisableSpiPrefetchCache ( BiosCtlSave = MmioRead8 (PchSpiBase + R_SPI_BCR) & B_SPI_BCR_SRC; - MmioAndThenOr32 ( + MmioAndThenOr8 ( PchSpiBase + R_SPI_BCR, \ - (UINT32)(~B_SPI_BCR_SRC), \ - (UINT32)(V_SPI_BCR_SRC_PREF_DIS_CACHE_DIS << B_SPI_BCR_SRC) + (UINT8)(~B_SPI_BCR_SRC), \ + (UINT8)(V_SPI_BCR_SRC_PREF_DIS_CACHE_DIS << N_SPI_BCR_SRC) ); return BiosCtlSave; diff --git a/UefiPayloadPkg/Library/SpiFlashLib/RegsSpi.h b/UefiPayloadPkg/Library/SpiFlashLib/RegsSpi.h index b74190414381..dd6d382c6c61 100644 --- a/UefiPayloadPkg/Library/SpiFlashLib/RegsSpi.h +++ b/UefiPayloadPkg/Library/SpiFlashLib/RegsSpi.h @@ -13,7 +13,8 @@ #define B_SPI_BAR0_MASK 0x0FFF #define R_SPI_BCR 0xDC ///< BIOS Control Register #define B_SPI_BCR_SRC (BIT3 | BIT2) ///< SPI Read Configuration (SRC) -#define V_SPI_BCR_SRC_PREF_DIS_CACHE_DIS 0x04 ///< Prefetch Disable, Cache Disable +#define N_SPI_BCR_SRC 2 ///< SPI Read Configuration bit position +#define V_SPI_BCR_SRC_PREF_DIS_CACHE_DIS 0x01 ///< Prefetch Disable, Cache Disable #define B_SPI_BCR_SYNC_SS BIT8 #define B_SPI_BCR_BIOSWE BIT0 ///< Write Protect Disable (WPD) From 897edd165c400b613b9d1c2acdea1ce600126cd1 Mon Sep 17 00:00:00 2001 From: Rebecca Cran Date: Sat, 14 Jun 2025 19:03:02 -0600 Subject: [PATCH 0075/1172] MdeModulePkg: Add help for Reset menu item, and fix French strings Fix the help string for the Reset menu item, and add it to the UI instead of just repeating the main text. Fix the French translations. Signed-off-by: Rebecca Cran --- .../Application/UiApp/FrontPageCustomizedUiSupport.c | 2 +- MdeModulePkg/Application/UiApp/FrontPageStrings.uni | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MdeModulePkg/Application/UiApp/FrontPageCustomizedUiSupport.c b/MdeModulePkg/Application/UiApp/FrontPageCustomizedUiSupport.c index 9e905e5f993f..24f9f1e3fb02 100644 --- a/MdeModulePkg/Application/UiApp/FrontPageCustomizedUiSupport.c +++ b/MdeModulePkg/Application/UiApp/FrontPageCustomizedUiSupport.c @@ -452,7 +452,7 @@ UiCreateResetMenu ( StartOpCodeHandle, FRONT_PAGE_KEY_RESET, STRING_TOKEN (STR_RESET_STRING), - STRING_TOKEN (STR_RESET_STRING), + STRING_TOKEN (STR_RESET_STRING_HELP), EFI_IFR_FLAG_CALLBACK, 0 ); diff --git a/MdeModulePkg/Application/UiApp/FrontPageStrings.uni b/MdeModulePkg/Application/UiApp/FrontPageStrings.uni index a0ab9abce10a..bd6e377cc106 100644 --- a/MdeModulePkg/Application/UiApp/FrontPageStrings.uni +++ b/MdeModulePkg/Application/UiApp/FrontPageStrings.uni @@ -51,9 +51,9 @@ #string STR_EMPTY_STRING #language en-US "" #language fr-FR "" #string STR_RESET_STRING #language en-US "Reset" - #language fr-FR "Reset" -#string STR_RESET_STRING_HELP #language en-US "Reset the current setting." - #language fr-FR "Reset the current setting." + #language fr-FR "Réinitialiser" +#string STR_RESET_STRING_HELP #language en-US "Cold reset (reboots the computer)." + #language fr-FR "Réinitialisation à froid (redémarre l'ordinateur)." #string STR_CUSTOMIZE_BANNER_LINE4_LEFT #language en-US "" #language fr-FR "" #string STR_CUSTOMIZE_BANNER_LINE4_RIGHT #language en-US "" From 0dde8cd3149caf00c1950616a15f1eae48c60d44 Mon Sep 17 00:00:00 2001 From: Rebecca Cran Date: Sat, 14 Jun 2025 19:03:26 -0600 Subject: [PATCH 0076/1172] NetworkPkg: Change 'Tls' to 'TLS' Sicne it's a user-visible string, change 'Tls' to 'TLS', which is more correct. Signed-off-by: Rebecca Cran --- NetworkPkg/TlsAuthConfigDxe/TlsAuthConfigDxeStrings.uni | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/NetworkPkg/TlsAuthConfigDxe/TlsAuthConfigDxeStrings.uni b/NetworkPkg/TlsAuthConfigDxe/TlsAuthConfigDxeStrings.uni index 2b4a27d24e00..0afa6e312122 100644 --- a/NetworkPkg/TlsAuthConfigDxe/TlsAuthConfigDxeStrings.uni +++ b/NetworkPkg/TlsAuthConfigDxe/TlsAuthConfigDxeStrings.uni @@ -1,5 +1,5 @@ /** @file - String definitions for Tls Authentication Configuration form. + String definitions for TLS Authentication Configuration form. Copyright (c) 2016, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -8,8 +8,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #langdef en-US "English" -#string STR_TLS_AUTH_CONFIG_TITLE #language en-US "Tls Auth Configuration" -#string STR_TLS_AUTH_CONFIG_HELP #language en-US "Press to select Tls Auth Configuration." +#string STR_TLS_AUTH_CONFIG_TITLE #language en-US "TLS Auth Configuration" +#string STR_TLS_AUTH_CONFIG_HELP #language en-US "Press to select TLS Auth Configuration." #string STR_TLS_AUTH_CONFIG_SERVER_CA #language en-US "Server CA Configuration" #string STR_TLS_AUTH_CONFIG_SERVER_CA_HELP #language en-US "Press to configure Server CA." From c2554567658ca2deba4790a98e7a8e9858c4840c Mon Sep 17 00:00:00 2001 From: Rebecca Cran Date: Sat, 14 Jun 2025 19:04:48 -0600 Subject: [PATCH 0077/1172] OvmfPkg: Update README with new 'TLS Auth Configuration' 'Tls Auth Configuration' is now 'TLS Auth Configuration'. Update README to match. Signed-off-by: Rebecca Cran --- OvmfPkg/README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OvmfPkg/README b/OvmfPkg/README index 8c19b4c490a2..550e952cccd5 100644 --- a/OvmfPkg/README +++ b/OvmfPkg/README @@ -288,7 +288,7 @@ and encrypted connection. connections will be accepted. * By default, there is no trusted certificate. The user has to import the - certificates either manually with "Tls Auth Configuration" utility in the + certificates either manually with "TLS Auth Configuration" utility in the firmware UI or through the fw_cfg entry, etc/edk2/https/cacerts. -fw_cfg name=etc/edk2/https/cacerts,file= From c72d6384347bc57109d75fd56f2a5cdb8a40d132 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Fri, 4 Apr 2025 16:54:18 -0700 Subject: [PATCH 0078/1172] StandaloneMmPkg: StandaloneMmIplPei: Prevent Freeing Zero Pages There could be scenarios where the HOB producer does not create any HOBs. In such cases, the buffer intended to be freed will have zero pages. This update addresses the issue that could cause assertions during runtime by ensuring that buffers with zero pages are not freed. Signed-off-by: Kun Qin --- .../Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c index 9360d2c756d0..972f0a32f209 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c @@ -467,7 +467,10 @@ CreatMmHobList ( MmProfileDataHob, Block ); - FreePages (PlatformHobList, EFI_SIZE_TO_PAGES (PlatformHobSize)); + if (PlatformHobSize != 0) { + FreePages (PlatformHobList, EFI_SIZE_TO_PAGES (PlatformHobSize)); + } + ASSERT (Status == RETURN_BUFFER_TOO_SMALL); ASSERT (FoundationHobSize != 0); From 73b0b5edaef19beb08b04869bc2e0f6328c9e604 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Fri, 4 Apr 2025 16:54:38 -0700 Subject: [PATCH 0079/1172] StandaloneMmPkg: StandaloneMmIplPei: Use MM access to open the regions Current MM IPL in PEI phase does not open the MMRAM regions through MM access PPI. This is causing some platforms like OVMF reading all `0xFF`s when trying to relocate the Standalone MM core. This change opens all the MMRAM regions provided by MM access PPI and closes + locks the regions after initial MM foundation setup, when MM Access PPI is available. Platforms that require MM access PPI can inject depex through libraries. Signed-off-by: Kun Qin --- .../StandaloneMmIplPei/StandaloneMmIplPei.c | 81 ++++++++++++++++++- .../StandaloneMmIplPei/StandaloneMmIplPei.h | 1 + .../StandaloneMmIplPei/StandaloneMmIplPei.inf | 1 + 3 files changed, 81 insertions(+), 2 deletions(-) diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c index 972f0a32f209..eda47b93eff0 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c @@ -684,6 +684,10 @@ ExecuteMmCoreFromMmram ( PE_COFF_LOADER_IMAGE_CONTEXT ImageContext; STANDALONE_MM_FOUNDATION_ENTRY_POINT Entry; EFI_MMRAM_HOB_DESCRIPTOR_BLOCK *Block; + EFI_PEI_MM_ACCESS_PPI *MmAccess; + UINTN Size; + UINTN Index; + UINTN MmramRangeCount; MmFvBase = 0; MmFvSize = 0; @@ -693,6 +697,40 @@ ExecuteMmCoreFromMmram ( Status = LocateMmCoreFv (&MmFvBase, &MmFvSize, &MmCoreFileName, &ImageContext.Handle); ASSERT_EFI_ERROR (Status); + // + // Prepare an MM access PPI for MM RAM. + // + MmAccess = NULL; + MmramRangeCount = 0; + Status = PeiServicesLocatePpi ( + &gEfiPeiMmAccessPpiGuid, + 0, + NULL, + (VOID **)&MmAccess + ); + if (!EFI_ERROR (Status)) { + // + // Open all MMRAM ranges, if MmAccess is available. + // + Size = 0; + Status = MmAccess->GetCapabilities ((EFI_PEI_SERVICES **)GetPeiServicesTablePointer (), MmAccess, &Size, NULL); + if (Status != EFI_BUFFER_TOO_SMALL) { + // This is not right... + ASSERT (Status == EFI_BUFFER_TOO_SMALL); + return EFI_DEVICE_ERROR; + } + + MmramRangeCount = Size / sizeof (EFI_MMRAM_DESCRIPTOR); + for (Index = 0; Index < MmramRangeCount; Index++) { + Status = MmAccess->Open ((EFI_PEI_SERVICES **)GetPeiServicesTablePointer (), MmAccess, Index); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "MM IPL failed to open MMRAM windows index %d - %r\n", Index, Status)); + ASSERT_EFI_ERROR (Status); + goto Done; + } + } + } + // // Initialize ImageContext // @@ -703,7 +741,7 @@ ExecuteMmCoreFromMmram ( // Status = PeCoffLoaderGetImageInfo (&ImageContext); if (EFI_ERROR (Status)) { - return Status; + goto Done; } PageCount = (UINTN)EFI_SIZE_TO_PAGES ((UINTN)ImageContext.ImageSize + ImageContext.SectionAlignment); @@ -713,7 +751,8 @@ ExecuteMmCoreFromMmram ( // ImageContext.ImageAddress = MmIplAllocateMmramPage (PageCount, &Block); if (ImageContext.ImageAddress == 0) { - return EFI_NOT_FOUND; + Status = EFI_NOT_FOUND; + goto Done; } // @@ -776,6 +815,44 @@ ExecuteMmCoreFromMmram ( } } +Done: + if (MmAccess != NULL) { + // + // Close all MMRAM ranges, if MmAccess is available. + // + for (Index = 0; Index < MmramRangeCount; Index++) { + Status = MmAccess->Close ((EFI_PEI_SERVICES **)GetPeiServicesTablePointer (), MmAccess, Index); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "MM IPL failed to close MMRAM windows index %d - %r\n", Index, Status)); + ASSERT (FALSE); + return Status; + } + + // + // Print debug message that the MMRAM window is now closed. + // + DEBUG ((DEBUG_INFO, "MM IPL closed MMRAM window index %d\n", Index)); + + // + // Lock the MMRAM (Note: Locking MMRAM may not be supported on all platforms) + // + Status = MmAccess->Lock ((EFI_PEI_SERVICES **)GetPeiServicesTablePointer (), MmAccess, Index); + if (EFI_ERROR (Status)) { + // + // Print error message that the MMRAM failed to lock... + // + DEBUG ((DEBUG_ERROR, "MM IPL could not lock MMRAM (Index %d) after executing MM Core %r\n", Index, Status)); + ASSERT (FALSE); + return Status; + } + + // + // Print debug message that the MMRAM window is now closed. + // + DEBUG ((DEBUG_INFO, "MM IPL locked MMRAM window index %d\n", Index)); + } + } + return Status; } diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.h b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.h index 01b947c8ce59..430e7c578b3a 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.h +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.h @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.inf b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.inf index 9f446e82a08b..c06899e8ae6a 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.inf +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.inf @@ -65,6 +65,7 @@ gEfiPeiMmCommunication3PpiGuid gEfiEndOfPeiSignalPpiGuid gMmCoreFvLocationPpiGuid + gEfiPeiMmAccessPpiGuid [Protocols] gEfiMmEndOfPeiProtocol From aba8a76a64b21dbdd8382ba6361b35969af6405e Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Wed, 18 Jun 2025 22:44:57 -0700 Subject: [PATCH 0080/1172] OvmfPkg: MemDebugLogLibNull: Support Standalone MM core and drivers This change extends the supported types to Standalone MM and Standalone MM Core module types to support potential MM usage. Signed-off-by: Kun Qin --- OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf index 33f8dfee9cd4..7c2c68f7a263 100644 --- a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf @@ -14,7 +14,7 @@ FILE_GUID = 11b4523c-2c30-44f7-9dee-e6d59eef3d04 MODULE_TYPE = BASE VERSION_STRING = 1.0 - LIBRARY_CLASS = MemDebugLogLib|SEC PEI_CORE PEIM DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_APPLICATION UEFI_DRIVER SMM_CORE DXE_SMM_DRIVER + LIBRARY_CLASS = MemDebugLogLib|SEC PEI_CORE PEIM DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_APPLICATION UEFI_DRIVER SMM_CORE DXE_SMM_DRIVER MM_STANDALONE MM_CORE_STANDALONE [Sources] From 423b9872534807862d5a0b7268c442ed509b0500 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Fri, 4 Apr 2025 16:35:25 -0700 Subject: [PATCH 0081/1172] OvmfPkg: DxeAcpiTimerLib: Support Standalone MM core and drivers This change extends the library to support MM_CORE_STANDALONE and MM_STANDALONE for usage in MM standalone environment. Signed-off-by: Kun Qin --- OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf b/OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf index 9c364be886bd..b0e3478c91a2 100644 --- a/OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf +++ b/OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf @@ -14,7 +14,7 @@ FILE_GUID = 52DECA02-2EE8-4EAA-8EAD-1AB83F8A5955 MODULE_TYPE = BASE VERSION_STRING = 1.0 - LIBRARY_CLASS = TimerLib|DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_DRIVER UEFI_APPLICATION SMM_CORE + LIBRARY_CLASS = TimerLib|DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_DRIVER UEFI_APPLICATION SMM_CORE MM_CORE_STANDALONE MM_STANDALONE CONSTRUCTOR = AcpiTimerLibConstructor [Sources] From a60b026a1022cfc3bf4fa23b2c54065c734433ff Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Fri, 4 Apr 2025 16:45:42 -0700 Subject: [PATCH 0082/1172] OvmfPkg: PlatformDebugLibIoPort: Support Standalone MM core and drivers This change extends the library to support MM_CORE_STANDALONE and MM_STANDALONE for usage in MM standalone environment. Signed-off-by: Kun Qin --- .../Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf b/OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf index 016391427dbc..a8febf01ce94 100644 --- a/OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf +++ b/OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf @@ -16,7 +16,7 @@ FILE_GUID = DF934DA3-CD31-49FE-AF50-B3C87C79325F MODULE_TYPE = BASE VERSION_STRING = 1.0 - LIBRARY_CLASS = DebugLib|PEI_CORE PEIM DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER SMM_CORE DXE_SMM_DRIVER UEFI_DRIVER UEFI_APPLICATION + LIBRARY_CLASS = DebugLib|PEI_CORE PEIM DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER SMM_CORE DXE_SMM_DRIVER UEFI_DRIVER UEFI_APPLICATION MM_CORE_STANDALONE MM_STANDALONE CONSTRUCTOR = PlatformDebugLibIoPortConstructor # From d03c535745ff73bff2154d11bf5b39b1e7e6cbdc Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Fri, 4 Apr 2025 16:46:30 -0700 Subject: [PATCH 0083/1172] OvmfPkg: PlatformSecureLib: Support Standalone MM core and drivers This change extends the library to support MM_CORE_STANDALONE and MM_STANDALONE for usage in MM standalone environment. Signed-off-by: Kun Qin --- OvmfPkg/Library/PlatformSecureLib/PlatformSecureLib.inf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OvmfPkg/Library/PlatformSecureLib/PlatformSecureLib.inf b/OvmfPkg/Library/PlatformSecureLib/PlatformSecureLib.inf index db340f60b17d..538a80d369f4 100644 --- a/OvmfPkg/Library/PlatformSecureLib/PlatformSecureLib.inf +++ b/OvmfPkg/Library/PlatformSecureLib/PlatformSecureLib.inf @@ -13,7 +13,7 @@ FILE_GUID = 4204D78D-EDBF-4cee-BE80-3881457CF344 MODULE_TYPE = DXE_DRIVER VERSION_STRING = 1.0 - LIBRARY_CLASS = PlatformSecureLib|DXE_RUNTIME_DRIVER DXE_SMM_DRIVER DXE_DRIVER + LIBRARY_CLASS = PlatformSecureLib|DXE_RUNTIME_DRIVER DXE_SMM_DRIVER DXE_DRIVER MM_STANDALONE # # The following information is for reference only and not required by the build tools. From ad46860061f590c9a5f1a2dc6f80030faa444591 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Fri, 4 Apr 2025 16:40:28 -0700 Subject: [PATCH 0084/1172] OvmfPkg: SmmCpuFeaturesLib: Abstract out SMM specific implementations This update refactors the existing SmmCpuFeaturesLib to eliminate direct calls to SMM-specific functions. In particular, the constructor has been relocated to traditional MM- specific C files, utilizing a common entry point. Furthermore, several implementation-specific functions have been modularized into its respective C files. These changes lay the groundwork for supporting a Standalone MM-based solution in the future. Signed-off-by: Kun Qin --- .../SmmCpuFeaturesLib/SmmCpuFeaturesLib.c | 200 +------------- .../SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf | 1 + .../TraditionalMmCpuFeaturesLib.c | 248 ++++++++++++++++++ 3 files changed, 251 insertions(+), 198 deletions(-) create mode 100644 OvmfPkg/Library/SmmCpuFeaturesLib/TraditionalMmCpuFeaturesLib.c diff --git a/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c b/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c index 0a6f33c2b13c..6efc6305668c 100644 --- a/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c +++ b/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c @@ -45,9 +45,8 @@ BOOLEAN mSmmCpuFeaturesSmmRelocated; **/ EFI_STATUS EFIAPI -SmmCpuFeaturesLibConstructor ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +MmCpuFeaturesLibConstructorCommon ( + VOID ) { // @@ -194,152 +193,6 @@ SmmCpuFeaturesHookReturnFromSmm ( return OriginalInstructionPointer; } -STATIC CPU_HOT_EJECT_DATA *mCpuHotEjectData = NULL; - -/** - Initialize mCpuHotEjectData if PcdCpuMaxLogicalProcessorNumber > 1. - - Also setup the corresponding PcdCpuHotEjectDataAddress. -**/ -STATIC -VOID -InitCpuHotEjectData ( - VOID - ) -{ - UINTN Size; - UINT32 Idx; - UINT32 MaxNumberOfCpus; - RETURN_STATUS PcdStatus; - - MaxNumberOfCpus = PcdGet32 (PcdCpuMaxLogicalProcessorNumber); - if (MaxNumberOfCpus == 1) { - return; - } - - // - // We allocate CPU_HOT_EJECT_DATA and CPU_HOT_EJECT_DATA->QemuSelectorMap[] - // in a single allocation, and explicitly align the QemuSelectorMap[] (which - // is a UINT64 array) at its natural boundary. - // Accordingly, allocate: - // sizeof(*mCpuHotEjectData) + (MaxNumberOfCpus * sizeof(UINT64)) - // and, add sizeof(UINT64) - 1 to use as padding if needed. - // - - if (RETURN_ERROR (SafeUintnMult (MaxNumberOfCpus, sizeof (UINT64), &Size)) || - RETURN_ERROR (SafeUintnAdd (Size, sizeof (*mCpuHotEjectData), &Size)) || - RETURN_ERROR (SafeUintnAdd (Size, sizeof (UINT64) - 1, &Size))) - { - DEBUG ((DEBUG_ERROR, "%a: invalid CPU_HOT_EJECT_DATA\n", __func__)); - goto Fatal; - } - - mCpuHotEjectData = AllocatePool (Size); - if (mCpuHotEjectData == NULL) { - ASSERT (mCpuHotEjectData != NULL); - goto Fatal; - } - - mCpuHotEjectData->Handler = NULL; - mCpuHotEjectData->ArrayLength = MaxNumberOfCpus; - - mCpuHotEjectData->QemuSelectorMap = ALIGN_POINTER ( - mCpuHotEjectData + 1, - sizeof (UINT64) - ); - // - // We use mCpuHotEjectData->QemuSelectorMap to map - // ProcessorNum -> QemuSelector. Initialize to invalid values. - // - for (Idx = 0; Idx < mCpuHotEjectData->ArrayLength; Idx++) { - mCpuHotEjectData->QemuSelectorMap[Idx] = CPU_EJECT_QEMU_SELECTOR_INVALID; - } - - // - // Expose address of CPU Hot eject Data structure - // - PcdStatus = PcdSet64S ( - PcdCpuHotEjectDataAddress, - (UINTN)(VOID *)mCpuHotEjectData - ); - ASSERT_RETURN_ERROR (PcdStatus); - - return; - -Fatal: - CpuDeadLoop (); -} - -/** - Hook point in normal execution mode that allows the one CPU that was elected - as monarch during System Management Mode initialization to perform additional - initialization actions immediately after all of the CPUs have processed their - first SMI and called SmmCpuFeaturesInitializeProcessor() relocating SMBASE - into a buffer in SMRAM and called SmmCpuFeaturesHookReturnFromSmm(). -**/ -VOID -EFIAPI -SmmCpuFeaturesSmmRelocationComplete ( - VOID - ) -{ - EFI_STATUS Status; - UINTN MapPagesBase; - UINTN MapPagesCount; - - InitCpuHotEjectData (); - - if (!MemEncryptSevIsEnabled ()) { - return; - } - - // - // Now that SMBASE relocation is complete, re-encrypt the original SMRAM save - // state map's container pages, and release the pages to DXE. (The pages were - // allocated in PlatformPei.) - // - Status = MemEncryptSevLocateInitialSmramSaveStateMapPages ( - &MapPagesBase, - &MapPagesCount - ); - ASSERT_EFI_ERROR (Status); - - Status = MemEncryptSevSetPageEncMask ( - 0, // Cr3BaseAddress -- use current CR3 - MapPagesBase, // BaseAddress - MapPagesCount // NumPages - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "%a: MemEncryptSevSetPageEncMask(): %r\n", - __func__, - Status - )); - ASSERT (FALSE); - CpuDeadLoop (); - } - - ZeroMem ((VOID *)MapPagesBase, EFI_PAGES_TO_SIZE (MapPagesCount)); - - if (PcdGetBool (PcdQ35SmramAtDefaultSmbase)) { - // - // The initial SMRAM Save State Map has been covered as part of a larger - // reserved memory allocation in PlatformPei's InitializeRamRegions(). That - // allocation is supposed to survive into OS runtime; we must not release - // any part of it. Only re-assert the containment here. - // - ASSERT (SMM_DEFAULT_SMBASE <= MapPagesBase); - ASSERT ( - (MapPagesBase + EFI_PAGES_TO_SIZE (MapPagesCount) <= - SMM_DEFAULT_SMBASE + MCH_DEFAULT_SMBASE_SIZE) - ); - } else { - Status = gBS->FreePages (MapPagesBase, MapPagesCount); - ASSERT_EFI_ERROR (Status); - } -} - /** Return the size, in bytes, of a custom SMI Handler in bytes. If 0 is returned, then a custom SMI handler is not provided by this library, @@ -466,55 +319,6 @@ SmmCpuFeaturesRendezvousEntry ( // } -/** - Processor specific hook point each time a CPU exits System Management Mode. - - @param[in] CpuIndex The index of the CPU that is exiting SMM. The value - must be between 0 and the NumberOfCpus field in the - System Management System Table (SMST). -**/ -VOID -EFIAPI -SmmCpuFeaturesRendezvousExit ( - IN UINTN CpuIndex - ) -{ - // - // We only call the Handler if CPU hot-eject is enabled - // (PcdCpuMaxLogicalProcessorNumber > 1), and hot-eject is needed - // in this SMI exit (otherwise mCpuHotEjectData->Handler is not armed.) - // - - if (mCpuHotEjectData != NULL) { - CPU_HOT_EJECT_HANDLER Handler; - - // - // As the comment above mentions, mCpuHotEjectData->Handler might be - // written to on the BSP as part of handling of the CPU-ejection. - // - // We know that any initial assignment to mCpuHotEjectData->Handler - // (on the BSP, in the CpuHotplugMmi() context) is ordered-before the - // load below, since it is guaranteed to happen before the - // control-dependency of the BSP's SMI exit signal -- by way of a store - // to AllCpusInSync (on the BSP, in BspHandler()) and the corresponding - // AllCpusInSync loop (on the APs, in SmiRendezvous()) which depends on - // that store. - // - // This guarantees that these pieces of code can never execute - // simultaneously. In addition, we ensure that the following load is - // ordered-after the AllCpusInSync loop by using a MemoryFence() with - // acquire semantics. - // - MemoryFence (); - - Handler = mCpuHotEjectData->Handler; - - if (Handler != NULL) { - Handler (CpuIndex); - } - } -} - /** Check to see if an SMM register is supported by a specified CPU. diff --git a/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf b/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf index 2697a90525bb..13abcf0db20e 100644 --- a/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf +++ b/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf @@ -19,6 +19,7 @@ [Sources] SmmCpuFeaturesLib.c + TraditionalMmCpuFeaturesLib.c [Packages] MdePkg/MdePkg.dec diff --git a/OvmfPkg/Library/SmmCpuFeaturesLib/TraditionalMmCpuFeaturesLib.c b/OvmfPkg/Library/SmmCpuFeaturesLib/TraditionalMmCpuFeaturesLib.c new file mode 100644 index 000000000000..7552b29419a3 --- /dev/null +++ b/OvmfPkg/Library/SmmCpuFeaturesLib/TraditionalMmCpuFeaturesLib.c @@ -0,0 +1,248 @@ +/** @file + The CPU specific programming for PiSmmCpuDxeSmm module. + + Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.
+ Copyright (c) Microsoft Corporation. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +STATIC CPU_HOT_EJECT_DATA *mCpuHotEjectData = NULL; + +/** + The common constructor function + + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +MmCpuFeaturesLibConstructorCommon ( + VOID + ); + +/** + Initialize mCpuHotEjectData if PcdCpuMaxLogicalProcessorNumber > 1. + + Also setup the corresponding PcdCpuHotEjectDataAddress. +**/ +STATIC +VOID +InitCpuHotEjectData ( + VOID + ) +{ + UINTN Size; + UINT32 Idx; + UINT32 MaxNumberOfCpus; + RETURN_STATUS PcdStatus; + + MaxNumberOfCpus = PcdGet32 (PcdCpuMaxLogicalProcessorNumber); + if (MaxNumberOfCpus == 1) { + return; + } + + // + // We allocate CPU_HOT_EJECT_DATA and CPU_HOT_EJECT_DATA->QemuSelectorMap[] + // in a single allocation, and explicitly align the QemuSelectorMap[] (which + // is a UINT64 array) at its natural boundary. + // Accordingly, allocate: + // sizeof(*mCpuHotEjectData) + (MaxNumberOfCpus * sizeof(UINT64)) + // and, add sizeof(UINT64) - 1 to use as padding if needed. + // + + if (RETURN_ERROR (SafeUintnMult (MaxNumberOfCpus, sizeof (UINT64), &Size)) || + RETURN_ERROR (SafeUintnAdd (Size, sizeof (*mCpuHotEjectData), &Size)) || + RETURN_ERROR (SafeUintnAdd (Size, sizeof (UINT64) - 1, &Size))) + { + DEBUG ((DEBUG_ERROR, "%a: invalid CPU_HOT_EJECT_DATA\n", __func__)); + goto Fatal; + } + + mCpuHotEjectData = AllocatePool (Size); + if (mCpuHotEjectData == NULL) { + ASSERT (mCpuHotEjectData != NULL); + goto Fatal; + } + + mCpuHotEjectData->Handler = NULL; + mCpuHotEjectData->ArrayLength = MaxNumberOfCpus; + + mCpuHotEjectData->QemuSelectorMap = ALIGN_POINTER ( + mCpuHotEjectData + 1, + sizeof (UINT64) + ); + // + // We use mCpuHotEjectData->QemuSelectorMap to map + // ProcessorNum -> QemuSelector. Initialize to invalid values. + // + for (Idx = 0; Idx < mCpuHotEjectData->ArrayLength; Idx++) { + mCpuHotEjectData->QemuSelectorMap[Idx] = CPU_EJECT_QEMU_SELECTOR_INVALID; + } + + // + // Expose address of CPU Hot eject Data structure + // + PcdStatus = PcdSet64S ( + PcdCpuHotEjectDataAddress, + (UINTN)(VOID *)mCpuHotEjectData + ); + ASSERT_RETURN_ERROR (PcdStatus); + + return; + +Fatal: + CpuDeadLoop (); +} + +/** + Hook point in normal execution mode that allows the one CPU that was elected + as monarch during System Management Mode initialization to perform additional + initialization actions immediately after all of the CPUs have processed their + first SMI and called SmmCpuFeaturesInitializeProcessor() relocating SMBASE + into a buffer in SMRAM and called SmmCpuFeaturesHookReturnFromSmm(). +**/ +VOID +EFIAPI +SmmCpuFeaturesSmmRelocationComplete ( + VOID + ) +{ + EFI_STATUS Status; + UINTN MapPagesBase; + UINTN MapPagesCount; + + InitCpuHotEjectData (); + + if (!MemEncryptSevIsEnabled ()) { + return; + } + + // + // Now that SMBASE relocation is complete, re-encrypt the original SMRAM save + // state map's container pages, and release the pages to DXE. (The pages were + // allocated in PlatformPei.) + // + Status = MemEncryptSevLocateInitialSmramSaveStateMapPages ( + &MapPagesBase, + &MapPagesCount + ); + ASSERT_EFI_ERROR (Status); + + Status = MemEncryptSevSetPageEncMask ( + 0, // Cr3BaseAddress -- use current CR3 + MapPagesBase, // BaseAddress + MapPagesCount // NumPages + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: MemEncryptSevSetPageEncMask(): %r\n", + __func__, + Status + )); + ASSERT (FALSE); + CpuDeadLoop (); + } + + ZeroMem ((VOID *)MapPagesBase, EFI_PAGES_TO_SIZE (MapPagesCount)); + + if (PcdGetBool (PcdQ35SmramAtDefaultSmbase)) { + // + // The initial SMRAM Save State Map has been covered as part of a larger + // reserved memory allocation in PlatformPei's InitializeRamRegions(). That + // allocation is supposed to survive into OS runtime; we must not release + // any part of it. Only re-assert the containment here. + // + ASSERT (SMM_DEFAULT_SMBASE <= MapPagesBase); + ASSERT ( + (MapPagesBase + EFI_PAGES_TO_SIZE (MapPagesCount) <= + SMM_DEFAULT_SMBASE + MCH_DEFAULT_SMBASE_SIZE) + ); + } else { + Status = gBS->FreePages (MapPagesBase, MapPagesCount); + ASSERT_EFI_ERROR (Status); + } +} + +/** + Processor specific hook point each time a CPU exits System Management Mode. + + @param[in] CpuIndex The index of the CPU that is exiting SMM. The value + must be between 0 and the NumberOfCpus field in the + System Management System Table (SMST). +**/ +VOID +EFIAPI +SmmCpuFeaturesRendezvousExit ( + IN UINTN CpuIndex + ) +{ + // + // We only call the Handler if CPU hot-eject is enabled + // (PcdCpuMaxLogicalProcessorNumber > 1), and hot-eject is needed + // in this SMI exit (otherwise mCpuHotEjectData->Handler is not armed.) + // + + if (mCpuHotEjectData != NULL) { + CPU_HOT_EJECT_HANDLER Handler; + + // + // As the comment above mentions, mCpuHotEjectData->Handler might be + // written to on the BSP as part of handling of the CPU-ejection. + // + // We know that any initial assignment to mCpuHotEjectData->Handler + // (on the BSP, in the CpuHotplugMmi() context) is ordered-before the + // load below, since it is guaranteed to happen before the + // control-dependency of the BSP's SMI exit signal -- by way of a store + // to AllCpusInSync (on the BSP, in BspHandler()) and the corresponding + // AllCpusInSync loop (on the APs, in SmiRendezvous()) which depends on + // that store. + // + // This guarantees that these pieces of code can never execute + // simultaneously. In addition, we ensure that the following load is + // ordered-after the AllCpusInSync loop by using a MemoryFence() with + // acquire semantics. + // + MemoryFence (); + + Handler = mCpuHotEjectData->Handler; + + if (Handler != NULL) { + Handler (CpuIndex); + } + } +} + +/** + The constructor function + + @param[in] ImageHandle The firmware allocated handle for the EFI image. + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +SmmCpuFeaturesLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return MmCpuFeaturesLibConstructorCommon (); +} From 84f140bf86ec6b944a7a3955def554142af5faeb Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Wed, 23 Apr 2025 11:27:39 -0700 Subject: [PATCH 0085/1172] OvmfPkg: StandaloneMmCpuFeaturesLib: Introduce SmmCpuFeaturesLib for Ovmf This change adds the implementation of SmmCpuFeaturesLib for Ovmf to operate with Standalone MM supported platforms. Signed-off-by: Kun Qin --- .../StandaloneMmCpuFeaturesLib.c | 75 +++++++++++++++++++ .../StandaloneMmCpuFeaturesLib.inf | 42 +++++++++++ OvmfPkg/OvmfPkg.ci.yaml | 3 +- 3 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 OvmfPkg/Library/SmmCpuFeaturesLib/StandaloneMmCpuFeaturesLib.c create mode 100644 OvmfPkg/Library/SmmCpuFeaturesLib/StandaloneMmCpuFeaturesLib.inf diff --git a/OvmfPkg/Library/SmmCpuFeaturesLib/StandaloneMmCpuFeaturesLib.c b/OvmfPkg/Library/SmmCpuFeaturesLib/StandaloneMmCpuFeaturesLib.c new file mode 100644 index 000000000000..9f3b54ccdaf6 --- /dev/null +++ b/OvmfPkg/Library/SmmCpuFeaturesLib/StandaloneMmCpuFeaturesLib.c @@ -0,0 +1,75 @@ +/** @file + The CPU specific programming for Standalone MM environment. + + Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.
+ Copyright (c) Microsoft Corporation. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include + +/** + The common constructor function + + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +MmCpuFeaturesLibConstructorCommon ( + VOID + ); + +/** + Hook point in normal execution mode that allows the one CPU that was elected + as monarch during System Management Mode initialization to perform additional + initialization actions immediately after all of the CPUs have processed their + first SMI and called SmmCpuFeaturesInitializeProcessor() relocating SMBASE + into a buffer in SMRAM and called SmmCpuFeaturesHookReturnFromSmm(). +**/ +VOID +EFIAPI +SmmCpuFeaturesSmmRelocationComplete ( + VOID + ) +{ + // Do nothing for Standalone MM instance. +} + +/** + Processor specific hook point each time a CPU exits System Management Mode. + + @param[in] CpuIndex The index of the CPU that is exiting SMM. The value + must be between 0 and the NumberOfCpus field in the + System Management System Table (SMST). +**/ +VOID +EFIAPI +SmmCpuFeaturesRendezvousExit ( + IN UINTN CpuIndex + ) +{ + // Do nothing for Standalone MM instance. +} + +/** + The constructor function + + @param[in] ImageHandle The firmware allocated handle for the EFI image. + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +StandalonMmCpuFeaturesLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_MM_SYSTEM_TABLE *SystemTable + ) +{ + return MmCpuFeaturesLibConstructorCommon (); +} diff --git a/OvmfPkg/Library/SmmCpuFeaturesLib/StandaloneMmCpuFeaturesLib.inf b/OvmfPkg/Library/SmmCpuFeaturesLib/StandaloneMmCpuFeaturesLib.inf new file mode 100644 index 000000000000..ae7396a49cfa --- /dev/null +++ b/OvmfPkg/Library/SmmCpuFeaturesLib/StandaloneMmCpuFeaturesLib.inf @@ -0,0 +1,42 @@ +## @file +# The CPU specific programming for Standalone MM environment. +# +# Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.
+# Copyright (c) Microsoft Corporation. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = StandaloneMmCpuFeaturesLib + MODULE_UNI_FILE = StandaloneMmCpuFeaturesLib.uni + FILE_GUID = 74B868F6-7DC6-4CDE-86B1-27E9A7CEBFCC + MODULE_TYPE = MM_STANDALONE + VERSION_STRING = 1.0 + PI_SPECIFICATION_VERSION = 0x00010032 + LIBRARY_CLASS = SmmCpuFeaturesLib + CONSTRUCTOR = StandalonMmCpuFeaturesLibConstructor + +[Sources] + SmmCpuFeaturesLib.c + StandaloneMmCpuFeaturesLib.c + +[Packages] + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + UefiCpuPkg/UefiCpuPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + MemEncryptSevLib + PcdLib + +[Guids] + gSmmBaseHobGuid ## CONSUMES + +[Pcd] + gUefiOvmfPkgTokenSpaceGuid.PcdQ35SmramAtDefaultSmbase diff --git a/OvmfPkg/OvmfPkg.ci.yaml b/OvmfPkg/OvmfPkg.ci.yaml index e4b729b4a80e..62f3aef3c59d 100644 --- a/OvmfPkg/OvmfPkg.ci.yaml +++ b/OvmfPkg/OvmfPkg.ci.yaml @@ -53,7 +53,8 @@ "UefiCpuPkg/UefiCpuPkg.dec", "ShellPkg/ShellPkg.dec", "EmbeddedPkg/EmbeddedPkg.dec", - "SourceLevelDebugPkg/SourceLevelDebugPkg.dec" + "SourceLevelDebugPkg/SourceLevelDebugPkg.dec", + "StandaloneMmPkg/StandaloneMmPkg.dec" ], # For host based unit tests "AcceptableDependencies-HOST_APPLICATION":[ From 8ac270e812e0dfd03c6e55663cab19f76e941dd0 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Fri, 4 Apr 2025 16:42:12 -0700 Subject: [PATCH 0086/1172] OvmfPkg: MmControlPei: Introduce MM control PPI to OVMF This change adds a PEIM that produces gEfiPeiMmControlPpiGuid to be used in PEI phase, i.e. boot strap MM foundation. This flow is largely in assemblence of MM control DXE driver and used the `SmiFeatures.*` files from the DXE drivers as the common resources. Signed-off-by: Kun Qin --- OvmfPkg/SmmControl2Dxe/MmControlPei.c | 271 ++++++++++++++++++++++++ OvmfPkg/SmmControl2Dxe/MmControlPei.inf | 70 ++++++ 2 files changed, 341 insertions(+) create mode 100644 OvmfPkg/SmmControl2Dxe/MmControlPei.c create mode 100644 OvmfPkg/SmmControl2Dxe/MmControlPei.inf diff --git a/OvmfPkg/SmmControl2Dxe/MmControlPei.c b/OvmfPkg/SmmControl2Dxe/MmControlPei.c new file mode 100644 index 000000000000..8feac62e32ef --- /dev/null +++ b/OvmfPkg/SmmControl2Dxe/MmControlPei.c @@ -0,0 +1,271 @@ +/** @file + + A PEIM providing synchronous SMI activations via the + EFI_PEI_MM_CONTROL_PPI. + + We expect the PEI phase to have covered the following: + - ensure that the underlying QEMU machine type be Q35 + (responsible: OvmfPkg/SmmAccess/SmmAccessPei.inf) + - ensure that the ACPI PM IO space be configured + (responsible: OvmfPkg/PlatformPei/PlatformPei.inf) + + Our own entry point is responsible for confirming the SMI feature and for + configuring it. + + Copyright (C) 2013, 2015, Red Hat, Inc.
+ Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.
+ Copyright (c) Microsoft Corporation. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "SmiFeatures.h" + +// +// The absolute IO port address of the SMI Control and Enable Register. +// +STATIC UINTN mSmiEnable; + +/** + Invokes PPI activation from the PI PEI environment. + + @param PeiServices An indirect pointer to the PEI Services Table published by the PEI Foundation. + @param This The PEI_MM_CONTROL_PPI instance. + @param ArgumentBuffer The value passed to the MMI handler. This value corresponds to the + SwMmiInputValue in the RegisterContext parameter for the Register() + function in the EFI_MM_SW_DISPATCH_PROTOCOL and in the Context parameter + in the call to the DispatchFunction + @param ArgumentBufferSize The size of the data passed in ArgumentBuffer or NULL if ArgumentBuffer is NULL. + @param Periodic An optional mechanism to periodically repeat activation. + @param ActivationInterval An optional parameter to repeat at this period one + time or, if the Periodic Boolean is set, periodically. + + @retval EFI_SUCCESS The MMI has been engendered. + @retval EFI_DEVICE_ERROR The timing is unsupported. + @retval EFI_INVALID_PARAMETER The activation period is unsupported. + @retval EFI_NOT_STARTED The MM base service has not been initialized. + +**/ +STATIC +EFI_STATUS +EFIAPI +MmControlPeiTrigger ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_MM_CONTROL_PPI *This, + IN OUT INT8 *ArgumentBuffer OPTIONAL, + IN OUT UINTN *ArgumentBufferSize OPTIONAL, + IN BOOLEAN Periodic OPTIONAL, + IN UINTN ActivationInterval OPTIONAL + ) +{ + UINT8 Command; + UINT8 Data; + + // + // No support for queued or periodic activation. + // + if (Periodic || (ActivationInterval > 0)) { + return EFI_DEVICE_ERROR; + } + + if ((ArgumentBufferSize != NULL) && (ArgumentBuffer == NULL)) { + return EFI_INVALID_PARAMETER; + } + + // + // The 0th byte as command, 1st as data... Right? + // + if ((NULL == ArgumentBuffer) || (*ArgumentBufferSize == 0)) { + Command = 0; + Data = 0; + } else if (*ArgumentBufferSize == 1) { + Command = *ArgumentBuffer; + Data = 0; + } else if (*ArgumentBufferSize == 2) { + Command = ArgumentBuffer[0]; + Data = ArgumentBuffer[1]; + } else { + return EFI_INVALID_PARAMETER; + } + + // + // The so-called "Advanced Power Management Status Port Register" is in fact + // a generic data passing register, between the caller and the SMI + // dispatcher. The ICH9 spec calls it "scratchpad register" -- calling it + // "status" elsewhere seems quite the misnomer. Status registers usually + // report about hardware status, while this register is fully governed by + // software. + // + // Write to the status register first, as this won't trigger the SMI just + // yet. Then write to the control register. + // + IoWrite8 (ICH9_APM_STS, Data); + IoWrite8 (ICH9_APM_CNT, Command); + return EFI_SUCCESS; +} + +/** + Clears any system state that was created in response to the Trigger() call. + + @param PeiServices General purpose services available to every PEIM. + @param This The PEI_MM_CONTROL_PPI instance. + @param Periodic Optional parameter to repeat at this period one + time or, if the Periodic Boolean is set, periodically. + + @retval EFI_SUCCESS The MMI has been engendered. + @retval EFI_DEVICE_ERROR The source could not be cleared. + @retval EFI_INVALID_PARAMETER The service did not support the Periodic input argument. + +**/ +STATIC +EFI_STATUS +EFIAPI +MmControlPeiClear ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_MM_CONTROL_PPI *This, + IN BOOLEAN Periodic OPTIONAL + ) +{ + if (Periodic) { + return EFI_INVALID_PARAMETER; + } + + // + // The PI spec v1.4 explains that Clear() is only supposed to clear software + // status; it is not in fact responsible for deasserting the SMI. It gives + // two reasons for this: (a) many boards clear the SMI automatically when + // entering SMM, (b) if Clear() actually deasserted the SMI, then it could + // incorrectly suppress an SMI that was asynchronously asserted between the + // last return of the SMI handler and the call made to Clear(). + // + // In fact QEMU automatically deasserts CPU_INTERRUPT_SMI in: + // - x86_cpu_exec_interrupt() [target-i386/seg_helper.c], and + // - kvm_arch_pre_run() [target-i386/kvm.c]. + // + // So, nothing to do here. + // + return EFI_SUCCESS; +} + +STATIC EFI_PEI_MM_CONTROL_PPI mMmControl = +{ + .Trigger = MmControlPeiTrigger, + .Clear = MmControlPeiClear +}; + +STATIC EFI_PEI_PPI_DESCRIPTOR mSmmControlPpiList = +{ + (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), + &gEfiPeiMmControlPpiGuid, + &mMmControl +}; + +// +// Entry point of this driver. +// +EFI_STATUS +EFIAPI +MmControlPeiEntryPoint ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + UINT32 PmBase; + UINT32 SmiEnableVal; + EFI_STATUS Status; + + // + // This module should only be included if SMRAM support is required. + // + ASSERT (FeaturePcdGet (PcdSmmSmramRequire)); + + // + // Calculate the absolute IO port address of the SMI Control and Enable + // Register. (As noted at the top, the PEI phase has left us with a working + // ACPI PM IO space.) + // + PmBase = PciRead32 (POWER_MGMT_REGISTER_Q35 (ICH9_PMBASE)) & + ICH9_PMBASE_MASK; + mSmiEnable = PmBase + ICH9_PMBASE_OFS_SMI_EN; + + // + // If APMC_EN is pre-set in SMI_EN, that's QEMU's way to tell us that SMI + // support is not available. (For example due to KVM lacking it.) Otherwise, + // this bit is clear after each reset. + // + SmiEnableVal = IoRead32 (mSmiEnable); + if ((SmiEnableVal & ICH9_SMI_EN_APMC_EN) != 0) { + DEBUG (( + DEBUG_ERROR, + "%a: this Q35 implementation lacks SMI\n", + __func__ + )); + goto FatalError; + } + + // + // Otherwise, configure the board to inject an SMI when ICH9_APM_CNT is + // written to. (See the Trigger() method above.) + // + SmiEnableVal |= ICH9_SMI_EN_APMC_EN | ICH9_SMI_EN_GBL_SMI_EN; + IoWrite32 (mSmiEnable, SmiEnableVal); + + // + // Prevent software from undoing the above (until platform reset). + // + PciOr16 ( + POWER_MGMT_REGISTER_Q35 (ICH9_GEN_PMCON_1), + ICH9_GEN_PMCON_1_SMI_LOCK + ); + + // + // If we can clear GBL_SMI_EN now, that means QEMU's SMI support is not + // appropriate. + // + IoWrite32 (mSmiEnable, SmiEnableVal & ~(UINT32)ICH9_SMI_EN_GBL_SMI_EN); + if (IoRead32 (mSmiEnable) != SmiEnableVal) { + DEBUG (( + DEBUG_ERROR, + "%a: failed to lock down GBL_SMI_EN\n", + __func__ + )); + goto FatalError; + } + + // + // We have no pointers to convert to virtual addresses. The handle itself + // doesn't matter, as protocol services are not accessible at runtime. + // + Status = (*PeiServices)->InstallPpi (PeiServices, &mSmmControlPpiList); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: InstallMultipleProtocolInterfaces: %r\n", + __func__, + Status + )); + goto FatalError; + } + + return EFI_SUCCESS; + +FatalError: + // + // We really don't want to continue in this case. + // + ASSERT (FALSE); + CpuDeadLoop (); + return EFI_UNSUPPORTED; +} diff --git a/OvmfPkg/SmmControl2Dxe/MmControlPei.inf b/OvmfPkg/SmmControl2Dxe/MmControlPei.inf new file mode 100644 index 000000000000..cd14ae337fe8 --- /dev/null +++ b/OvmfPkg/SmmControl2Dxe/MmControlPei.inf @@ -0,0 +1,70 @@ +## @file +# A PEIM providing synchronous SMI activations via the +# EFI_PEI_MM_CONTROL_PPI. +# +# We expect the PEI phase to have covered the following: +# - ensure that the underlying QEMU machine type be Q35 +# (responsible: QemuQ35Pkg/SmmAccess/SmmAccessPei.inf) +# - ensure that the ACPI PM IO space be configured +# (responsible: QemuQ35Pkg/PlatformPei/PlatformPei.inf) +# +# Our own entry point is responsible for confirming the SMI feature and for +# configuring it. +# +# Copyright (C) 2013, 2015, Red Hat, Inc. +# Copyright (c) Microsoft Corporation. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = MmControlPei + FILE_GUID = A0DBE438-701C-44AF-AB4A-25545B86B565 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + ENTRY_POINT = MmControlPeiEntryPoint + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + SmiFeatures.h + SmiFeatures.c + MmControlPei.c + +[Packages] + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + UefiCpuPkg/UefiCpuPkg.dec + +[LibraryClasses] + BaseLib + DebugLib + IoLib + MemEncryptSevLib + MemoryAllocationLib + PcdLib + PciLib + QemuFwCfgLib + QemuFwCfgS3Lib + PeimEntryPoint + +[Ppis] + gEfiPeiMmControlPpiGuid ## PRODUCES + +[Pcd] + gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmApSyncTimeout ## SOMETIMES_PRODUCES + gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmApSyncTimeout2 ## SOMETIMES_PRODUCES + gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmSyncMode ## SOMETIMES_PRODUCES + +[FeaturePcd] + gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire + gUefiOvmfPkgTokenSpaceGuid.PcdStandaloneMmEnable + +[Depex] + TRUE From cf4534c9daf2ead4ce530d374f0a06a95bd98693 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Wed, 23 Apr 2025 10:39:32 -0700 Subject: [PATCH 0087/1172] OvmfPkg: SmmControl2Dxe: Avoid double initialization This change adds a build time PCD to prevent the SmmControl2Dxe driver from re-initialization the MM related registers. This register is to be used when MmControlPei is already executed in PEI phase and completed setting up the MM control registers. Signed-off-by: Kun Qin --- OvmfPkg/OvmfPkg.dec | 4 ++++ OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.c | 16 +++++++++------- OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf | 1 + 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec index 2078cf27a8a2..edc72a98fe87 100644 --- a/OvmfPkg/OvmfPkg.dec +++ b/OvmfPkg/OvmfPkg.dec @@ -485,3 +485,7 @@ ## This feature flag indicates the firmware build needs the qemu variable service. gUefiOvmfPkgTokenSpaceGuid.PcdQemuVarsRequire|FALSE|BOOLEAN|0x77 + + ## Informs modules whether the platform firmware supports Standalone MM. + # + gUefiOvmfPkgTokenSpaceGuid.PcdStandaloneMmEnable|FALSE|BOOLEAN|0x100065 diff --git a/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.c b/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.c index e7438b18ddcb..5632b84af928 100644 --- a/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.c +++ b/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.c @@ -201,13 +201,15 @@ SmmControl2DxeEntryPoint ( // this bit is clear after each reset. // SmiEnableVal = IoRead32 (mSmiEnable); - if ((SmiEnableVal & ICH9_SMI_EN_APMC_EN) != 0) { - DEBUG (( - DEBUG_ERROR, - "%a: this Q35 implementation lacks SMI\n", - __func__ - )); - goto FatalError; + if (!FeaturePcdGet (PcdStandaloneMmEnable)) { + if ((SmiEnableVal & ICH9_SMI_EN_APMC_EN) != 0) { + DEBUG (( + DEBUG_ERROR, + "%a: this Q35 implementation lacks SMI\n", + __func__ + )); + goto FatalError; + } } // diff --git a/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf b/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf index d20198cab710..c31aee411c0f 100644 --- a/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf +++ b/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf @@ -69,6 +69,7 @@ [FeaturePcd] gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire + gUefiOvmfPkgTokenSpaceGuid.PcdStandaloneMmEnable [Depex] TRUE From aedcb46e6fd260ab39cf0fc63a85c7f8da8aa476 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Fri, 4 Apr 2025 16:43:53 -0700 Subject: [PATCH 0088/1172] OvmfPkg: QemuFlashFvbServicesRuntimeDxe: Abstract out SMM/DXE functions This update refactors QemuFlashFvbServicesRuntimeDxe to abstract out direct calls to SMM and DXE specific functions. Specifically, dynamic PCD usage and gBS references have been moved to SMM specific files. The constructor functionality has been relocated to a common implementation and is invoked from their respective entry points. These changes lay the groundwork for supporting a Standalone MM-based solution in the future. Signed-off-by: Kun Qin --- .../QemuFlashFvbServicesRuntimeDxe/FwBlockService.c | 8 +++----- .../QemuFlashFvbServicesRuntimeDxe/FwBlockService.h | 5 +++++ .../FwBlockServiceDxe.c | 11 +++++++++++ .../FwBlockServiceSmm.c | 11 +++++++++++ 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c index b34298faf82b..83051a568fc0 100644 --- a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c +++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c @@ -27,9 +27,7 @@ #include #include #include -#include #include -#include #include "FwBlockService.h" #include "QemuFlash.h" @@ -976,7 +974,6 @@ FvbInitialize ( EFI_PHYSICAL_ADDRESS BaseAddress; UINTN Length; UINTN NumOfBlocks; - RETURN_STATUS PcdStatus; if (EFI_ERROR (QemuFlashInitialize ())) { // @@ -1129,7 +1126,8 @@ FvbInitialize ( // InstallVirtualAddressChangeHandler (); - PcdStatus = PcdSetBoolS (PcdOvmfFlashVariablesEnable, TRUE); - ASSERT_RETURN_ERROR (PcdStatus); + // Abstract dynamic PCD set to support Standalone MM + UpdateQemuFlashVariablesEnable (); + return EFI_SUCCESS; } diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.h b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.h index 639ad0471c50..dda3bc5feb98 100644 --- a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.h +++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.h @@ -194,4 +194,9 @@ SetPcdFlashNvStorageBaseAddresses ( VOID ); +VOID +UpdateQemuFlashVariablesEnable ( + VOID + ); + #endif diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceDxe.c b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceDxe.c index 61e1f2e196e5..27812fc02e5d 100644 --- a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceDxe.c +++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceDxe.c @@ -244,3 +244,14 @@ SetPcdFlashNvStorageBaseAddresses ( ); ASSERT_RETURN_ERROR (PcdStatus); } + +VOID +UpdateQemuFlashVariablesEnable ( + VOID + ) +{ + RETURN_STATUS PcdStatus; + + PcdStatus = PcdSetBoolS (PcdOvmfFlashVariablesEnable, TRUE); + ASSERT_RETURN_ERROR (PcdStatus); +} diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceSmm.c b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceSmm.c index 19bd5aab7c70..6acd4b7afe64 100644 --- a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceSmm.c +++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceSmm.c @@ -84,3 +84,14 @@ SetPcdFlashNvStorageBaseAddresses ( // Do nothing. // } + +VOID +UpdateQemuFlashVariablesEnable ( + VOID + ) +{ + RETURN_STATUS PcdStatus; + + PcdStatus = PcdSetBoolS (PcdOvmfFlashVariablesEnable, TRUE); + ASSERT_RETURN_ERROR (PcdStatus); +} From 4ea31ba0200ecf734bbb5b6ae75ebce5612fb329 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Wed, 23 Apr 2025 11:43:47 -0700 Subject: [PATCH 0089/1172] OvmfPkg: QemuFlashFvbServices: Introduce Standalone MM instance This update introduces the implementation of QemuFlashFvbServices to support operation with Standalone MM backed platforms. Signed-off-by: Kun Qin --- .../FvbServicesStandaloneMm.inf | 78 ++++++++++++ .../FwBlockServiceStandaloneMm.c | 116 ++++++++++++++++++ 2 files changed, 194 insertions(+) create mode 100644 OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesStandaloneMm.inf create mode 100644 OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceStandaloneMm.c diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesStandaloneMm.inf b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesStandaloneMm.inf new file mode 100644 index 000000000000..f8d36340a80c --- /dev/null +++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesStandaloneMm.inf @@ -0,0 +1,78 @@ +## @file +# Component description file for QEMU Flash Firmware Volume Block MM driver +# module. +# +# This Standalone MM driver implements and produces the MM Firmware Volue Block Protocol +# for a QEMU flash device. +# +# Copyright (C) 2015, Red Hat, Inc. +# Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.
+# Copyright (c) Microsoft Corporation. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = FvbServicesStandaloneMm + FILE_GUID = 834DA76A-4EA1-41C7-9601-FE7A7C564757 + MODULE_TYPE = MM_STANDALONE + VERSION_STRING = 1.0 + PI_SPECIFICATION_VERSION = 0x00010032 + ENTRY_POINT = FvbInitializeStandaloneMm + +# +# The following information is for reference only and not required by the build +# tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + FvbInfo.c + FwBlockService.c + FwBlockService.h + FwBlockServiceStandaloneMm.c + QemuFlash.c + QemuFlash.h + QemuFlashSmm.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + OvmfPkg/OvmfPkg.dec + StandaloneMmPkg/StandaloneMmPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + DevicePathLib + MemoryAllocationLib + MemEncryptSevLib + PcdLib + MmServicesTableLib + StandaloneMmDriverEntryPoint + +[Guids] + +[Protocols] + gEfiSmmFirmwareVolumeBlockProtocolGuid # PROTOCOL ALWAYS_PRODUCED + gEfiDevicePathProtocolGuid # PROTOCOL ALWAYS_PRODUCED + +[FixedPcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageVariableBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageEventLogSize + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFdBaseAddress + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareBlockSize + +[FeaturePcd] + gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire + +[Depex] + TRUE diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceStandaloneMm.c b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceStandaloneMm.c new file mode 100644 index 000000000000..3ec3826417c2 --- /dev/null +++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceStandaloneMm.c @@ -0,0 +1,116 @@ +/**@file + Functions related to the Firmware Volume Block service whose + implementation is specific to the SMM driver build. + + Copyright (C) 2015, Red Hat, Inc. + Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include + +#include "FwBlockService.h" + +VOID +InstallProtocolInterfaces ( + IN EFI_FW_VOL_BLOCK_DEVICE *FvbDevice + ) +{ + EFI_HANDLE FvbHandle; + EFI_STATUS Status; + + ASSERT (FeaturePcdGet (PcdSmmSmramRequire)); + + // + // There is no SMM service that can install multiple protocols in the SMM + // protocol database in one go. + // + // The SMM Firmware Volume Block protocol structure is the same as the + // Firmware Volume Block protocol structure. + // + FvbHandle = NULL; + DEBUG ((DEBUG_INFO, "Installing QEMU flash SMM FVB\n")); + Status = gMmst->MmInstallProtocolInterface ( + &FvbHandle, + &gEfiSmmFirmwareVolumeBlockProtocolGuid, + EFI_NATIVE_INTERFACE, + &FvbDevice->FwVolBlockInstance + ); + ASSERT_EFI_ERROR (Status); + + Status = gMmst->MmInstallProtocolInterface ( + &FvbHandle, + &gEfiDevicePathProtocolGuid, + EFI_NATIVE_INTERFACE, + FvbDevice->DevicePath + ); + ASSERT_EFI_ERROR (Status); +} + +VOID +InstallVirtualAddressChangeHandler ( + VOID + ) +{ + // + // Nothing. + // +} + +EFI_STATUS +MarkIoMemoryRangeForRuntimeAccess ( + IN EFI_PHYSICAL_ADDRESS BaseAddress, + IN UINTN Length + ) +{ + // + // Nothing + // + + return EFI_SUCCESS; +} + +VOID +SetPcdFlashNvStorageBaseAddresses ( + VOID + ) +{ + // + // Do nothing. + // +} + +VOID +UpdateQemuFlashVariablesEnable ( + VOID + ) +{ + // + // Do nothing for Standalone MM. + // +} + +/** + Abstracted entry point for Standalone MM instance. + FVB Standalone MM driver entry point. + + @param[in] ImageHandle A handle for the image that is initializing this + driver + @param[in] MmSystemTable A pointer to the MM system table + + @retval EFI_SUCCESS Variable service successfully initialized. +**/ +EFI_STATUS +EFIAPI +FvbInitializeStandaloneMm ( + IN EFI_HANDLE ImageHandle, + IN EFI_MM_SYSTEM_TABLE *MmSystemTable + ) +{ + return FvbInitialize (NULL, NULL); +} From 187761e05d82501aa5d63b3900501ea065c9d182 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Fri, 4 Apr 2025 16:49:55 -0700 Subject: [PATCH 0090/1172] OvmfPkg: MemEncryptSevLib: Add Null instance This change introduces a Null instance of MemEncryptSevLib to enable platforms that do not have confidential compute support. Signed-off-by: Kun Qin --- .../MemEncryptSevLibNull.c | 241 ++++++++++++++++++ .../MemEncryptSevLibNull.inf | 32 +++ 2 files changed, 273 insertions(+) create mode 100644 OvmfPkg/Library/MemEncryptSevLibNull/MemEncryptSevLibNull.c create mode 100644 OvmfPkg/Library/MemEncryptSevLibNull/MemEncryptSevLibNull.inf diff --git a/OvmfPkg/Library/MemEncryptSevLibNull/MemEncryptSevLibNull.c b/OvmfPkg/Library/MemEncryptSevLibNull/MemEncryptSevLibNull.c new file mode 100644 index 000000000000..e22aedca686f --- /dev/null +++ b/OvmfPkg/Library/MemEncryptSevLibNull/MemEncryptSevLibNull.c @@ -0,0 +1,241 @@ +/** @file + + Secure Encrypted Virtualization (SEV) library helper function + + Copyright (c) 2017 - 2020, AMD Incorporated. All rights reserved.
+ Copyright (c) Microsoft Corporation. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include + +/** + Returns a boolean to indicate whether SEV-SNP is enabled. + + @retval TRUE SEV-SNP is enabled + @retval FALSE SEV-SNP is not enabled +**/ +BOOLEAN +EFIAPI +MemEncryptSevSnpIsEnabled ( + VOID + ) +{ + return FALSE; +} + +/** + Returns a boolean to indicate whether SEV-ES is enabled. + + @retval TRUE SEV-ES is enabled + @retval FALSE SEV-ES is not enabled +**/ +BOOLEAN +EFIAPI +MemEncryptSevEsIsEnabled ( + VOID + ) +{ + return FALSE; +} + +/** + Returns a boolean to indicate whether SEV is enabled. + + @retval TRUE SEV is enabled + @retval FALSE SEV is not enabled +**/ +BOOLEAN +EFIAPI +MemEncryptSevIsEnabled ( + VOID + ) +{ + return FALSE; +} + +/** + This function clears memory encryption bit for the memory region specified by + BaseAddress and NumPages from the current page table context. + + @param[in] Cr3BaseAddress Cr3 Base Address (if zero then use + current CR3) + @param[in] BaseAddress The physical address that is the start + address of a memory region. + @param[in] NumPages The number of pages from start memory + region. + + @retval RETURN_SUCCESS The attributes were cleared for the + memory region. + @retval RETURN_INVALID_PARAMETER Number of pages is zero. + @retval RETURN_UNSUPPORTED Clearing the memory encryption attribute + is not supported +**/ +RETURN_STATUS +EFIAPI +MemEncryptSevClearPageEncMask ( + IN PHYSICAL_ADDRESS Cr3BaseAddress, + IN PHYSICAL_ADDRESS BaseAddress, + IN UINTN NumPages + ) +{ + return RETURN_UNSUPPORTED; +} + +/** + This function sets memory encryption bit for the memory region specified by + BaseAddress and NumPages from the current page table context. + + @param[in] Cr3BaseAddress Cr3 Base Address (if zero then use + current CR3) + @param[in] BaseAddress The physical address that is the start + address of a memory region. + @param[in] NumPages The number of pages from start memory + region. + + @retval RETURN_SUCCESS The attributes were set for the memory + region. + @retval RETURN_INVALID_PARAMETER Number of pages is zero. + @retval RETURN_UNSUPPORTED Setting the memory encryption attribute + is not supported +**/ +RETURN_STATUS +EFIAPI +MemEncryptSevSetPageEncMask ( + IN PHYSICAL_ADDRESS Cr3BaseAddress, + IN PHYSICAL_ADDRESS BaseAddress, + IN UINTN NumPages + ) +{ + return RETURN_UNSUPPORTED; +} + +/** + Locate the page range that covers the initial (pre-SMBASE-relocation) SMRAM + Save State Map. + + @param[out] BaseAddress The base address of the lowest-address page that + covers the initial SMRAM Save State Map. + + @param[out] NumberOfPages The number of pages in the page range that covers + the initial SMRAM Save State Map. + + @retval RETURN_SUCCESS BaseAddress and NumberOfPages have been set on + output. + + @retval RETURN_UNSUPPORTED SMM is unavailable. +**/ +RETURN_STATUS +EFIAPI +MemEncryptSevLocateInitialSmramSaveStateMapPages ( + OUT UINTN *BaseAddress, + OUT UINTN *NumberOfPages + ) +{ + return RETURN_UNSUPPORTED; +} + +/** + Returns the SEV encryption mask. + + @return The SEV pagtable encryption mask +**/ +UINT64 +EFIAPI +MemEncryptSevGetEncryptionMask ( + VOID + ) +{ + return 0; +} + +/** + Returns a boolean to indicate whether DebugVirtualization is enabled. + + @retval TRUE DebugVirtualization is enabled + @retval FALSE DebugVirtualization is not enabled +**/ +BOOLEAN +EFIAPI +MemEncryptSevEsDebugVirtualizationIsEnabled ( + VOID + ) +{ + return FALSE; +} + +/** + Returns the encryption state of the specified virtual address range. + + @param[in] Cr3BaseAddress Cr3 Base Address (if zero then use + current CR3) + @param[in] BaseAddress Base address to check + @param[in] Length Length of virtual address range + + @retval MemEncryptSevAddressRangeUnencrypted Address range is mapped + unencrypted + @retval MemEncryptSevAddressRangeEncrypted Address range is mapped + encrypted + @retval MemEncryptSevAddressRangeMixed Address range is mapped mixed + @retval MemEncryptSevAddressRangeError Address range is not mapped +**/ +MEM_ENCRYPT_SEV_ADDRESS_RANGE_STATE +EFIAPI +MemEncryptSevGetAddressRangeState ( + IN PHYSICAL_ADDRESS Cr3BaseAddress, + IN PHYSICAL_ADDRESS BaseAddress, + IN UINTN Length + ) +{ + return MemEncryptSevAddressRangeUnencrypted; +} + +/** + This function clears memory encryption bit for the MMIO region specified by + BaseAddress and NumPages. + + @param[in] Cr3BaseAddress Cr3 Base Address (if zero then use + current CR3) + @param[in] BaseAddress The physical address that is the start + address of a MMIO region. + @param[in] NumPages The number of pages from start memory + region. + + @retval RETURN_SUCCESS The attributes were cleared for the + memory region. + @retval RETURN_INVALID_PARAMETER Number of pages is zero. + @retval RETURN_UNSUPPORTED Clearing the memory encryption attribute + is not supported +**/ +RETURN_STATUS +EFIAPI +MemEncryptSevClearMmioPageEncMask ( + IN PHYSICAL_ADDRESS Cr3BaseAddress, + IN PHYSICAL_ADDRESS BaseAddress, + IN UINTN NumPages + ) +{ + return RETURN_UNSUPPORTED; +} + +/** + Pre-validate the system RAM when SEV-SNP is enabled in the guest VM. + + @param[in] BaseAddress Base address + @param[in] NumPages Number of pages starting from the base address + +**/ +VOID +EFIAPI +MemEncryptSevSnpPreValidateSystemRam ( + IN PHYSICAL_ADDRESS BaseAddress, + IN UINTN NumPages + ) +{ + // + // Do nothing + // +} diff --git a/OvmfPkg/Library/MemEncryptSevLibNull/MemEncryptSevLibNull.inf b/OvmfPkg/Library/MemEncryptSevLibNull/MemEncryptSevLibNull.inf new file mode 100644 index 000000000000..a7ed263c8ab9 --- /dev/null +++ b/OvmfPkg/Library/MemEncryptSevLibNull/MemEncryptSevLibNull.inf @@ -0,0 +1,32 @@ +## @file +# Library provides the helper functions for SEV guest +# +# Copyright (c) 2017 - 2024, Advanced Micro Devices. All rights reserved.
+# Copyright (c) Microsoft Corporation. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION = 1.25 + BASE_NAME = MemEncryptSevLibNull + FILE_GUID = 02A5CD1B-05F2-4C7F-B8E9-66A5E66C47C7 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = MemEncryptSevLib + +# +# The following information is for reference only and not required by the build +# tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Packages] + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + +[Sources] + MemEncryptSevLibNull.c From 00ee4b57f8b3071f85984f8a9c715a318bf67f04 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Fri, 4 Apr 2025 16:43:30 -0700 Subject: [PATCH 0091/1172] OvmfPkg: MmPlatformHobProducerLibOvmf: Ovmf specific HOB creators for Stmm This change introduces a platform specific HOB producor library to meet the expectation of Standalone MM core. Signed-off-by: Kun Qin --- .../MmPlatformHobProducerLibOvmf.c | 131 ++++++++++++++++++ .../MmPlatformHobProducerLibOvmf.inf | 51 +++++++ 2 files changed, 182 insertions(+) create mode 100644 OvmfPkg/Library/MmPlatformHobProducerLibOvmf/MmPlatformHobProducerLibOvmf.c create mode 100644 OvmfPkg/Library/MmPlatformHobProducerLibOvmf/MmPlatformHobProducerLibOvmf.inf diff --git a/OvmfPkg/Library/MmPlatformHobProducerLibOvmf/MmPlatformHobProducerLibOvmf.c b/OvmfPkg/Library/MmPlatformHobProducerLibOvmf/MmPlatformHobProducerLibOvmf.c new file mode 100644 index 000000000000..16197c3bf55f --- /dev/null +++ b/OvmfPkg/Library/MmPlatformHobProducerLibOvmf/MmPlatformHobProducerLibOvmf.c @@ -0,0 +1,131 @@ +/** @file + Null instance of MM Platform HOB Producer Library Class. + + CreateMmPlatformHob() function is called by StandaloneMm IPL to create all + Platform specific HOBs that required by Standalone MM environment. + + Copyright (c) 2024, Intel Corporation. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include + +#define NUMBER_OF_HOB_RESOURCE_DESCRIPTOR 2 + +/** + Create the platform specific HOBs needed by the Standalone MM environment. + + The following HOBs are created by StandaloneMm IPL common logic. + Hence they should NOT be created by this function: + * Single EFI_HOB_TYPE_FV to describe the Firmware Volume where MM Core resides. + * Single GUIDed (gEfiSmmSmramMemoryGuid) HOB to describe the MM regions. + * Single EFI_HOB_MEMORY_ALLOCATION_MODULE to describe the MM region used by MM Core. + * Multiple EFI_HOB_RESOURCE_DESCRIPTOR to describe the non-MM regions and their access permissions. + Note: All accessible non-MM regions should be described by EFI_HOB_RESOURCE_DESCRIPTOR HOBs. + * Single GUIDed (gMmCommBufferHobGuid) HOB to identify MM Communication buffer in non-MM region. + * Multiple GUIDed (gSmmBaseHobGuid) HOB to describe the SMM base address of each processor. + * Multiple GUIDed (gMpInformation2HobGuid) HOB to describe the MP information. + * Single GUIDed (gMmCpuSyncConfigHobGuid) HOB to describe how BSP synchronizes with APs in x86 SMM. + * Single GUIDed (gMmAcpiS3EnableHobGuid) HOB to describe the ACPI S3 enable status. + * Single GUIDed (gEfiAcpiVariableGuid) HOB to identify the S3 data root region in x86. + * Single GUIDed (gMmProfileDataHobGuid) HOB to describe the MM profile data region. + * Single GUIDed (gMmStatusCodeUseSerialHobGuid) HOB to describe the status code use serial port. + + @param[in] Buffer The free buffer to be used for HOB creation. + @param[in, out] BufferSize The buffer size. + On return, the expected/used size. + + @retval RETURN_INVALID_PARAMETER BufferSize is NULL. + @retval RETURN_INVALID_PARAMETER Buffer is NULL and BufferSize is not 0. + @retval RETURN_BUFFER_TOO_SMALL The buffer is too small for HOB creation. + BufferSize is updated to indicate the expected buffer size. + When the input BufferSize is bigger than the expected buffer size, + the BufferSize value will be changed to the used buffer size. + @retval RETURN_SUCCESS The HOB list is created successfully. + +**/ +EFI_STATUS +EFIAPI +CreateMmPlatformHob ( + IN VOID *Buffer, + IN OUT UINTN *BufferSize + ) +{ + EFI_HOB_GUID_TYPE *GuidHob; + UINTN Size; + EFI_HOB_RESOURCE_DESCRIPTOR Hob; + UINTN NumberOfHobResourceDescriptor; + + if (BufferSize == NULL) { + return RETURN_INVALID_PARAMETER; + } + + if ((*BufferSize != 0) && (Buffer == NULL)) { + return RETURN_INVALID_PARAMETER; + } + + Size = 0; + + // Account for the Platform Info HOB + GuidHob = GetFirstGuidHob (&gUefiOvmfPkgPlatformInfoGuid); + Size += GET_HOB_LENGTH (GuidHob); + + // Account for resource descriptor HOBs for MM region + Size += sizeof (EFI_HOB_RESOURCE_DESCRIPTOR) * NUMBER_OF_HOB_RESOURCE_DESCRIPTOR; + + if (Size > *BufferSize) { + *BufferSize = Size; + return RETURN_BUFFER_TOO_SMALL; + } + + *BufferSize = Size; + + Size = 0; + NumberOfHobResourceDescriptor = 0; + + // Duplicate the Platform Info HOB + CopyMem (Buffer, GuidHob, GET_HOB_LENGTH (GuidHob)); + Size += GET_HOB_LENGTH (GuidHob); + + // Create resource descriptor HOBs for MM region + // APIC + Hob.Header.HobType = EFI_HOB_TYPE_RESOURCE_DESCRIPTOR; + Hob.Header.HobLength = (UINT16)sizeof (EFI_HOB_RESOURCE_DESCRIPTOR); + Hob.ResourceType = EFI_RESOURCE_MEMORY_MAPPED_IO; + Hob.ResourceAttribute = EFI_RESOURCE_ATTRIBUTE_PRESENT | + EFI_RESOURCE_ATTRIBUTE_INITIALIZED | + EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | + EFI_RESOURCE_ATTRIBUTE_TESTED; + Hob.PhysicalStart = PcdGet32 (PcdOvmfFlashNvStorageVariableBase); + Hob.ResourceLength = SIZE_1MB; + ZeroMem (&(Hob.Owner), sizeof (EFI_GUID)); + CopyMem ((UINT8 *)Buffer + Size, &Hob, sizeof (EFI_HOB_RESOURCE_DESCRIPTOR)); + Size += sizeof (EFI_HOB_RESOURCE_DESCRIPTOR); + NumberOfHobResourceDescriptor++; + + // Variable Storage + Hob.Header.HobType = EFI_HOB_TYPE_RESOURCE_DESCRIPTOR; + Hob.Header.HobLength = (UINT16)sizeof (EFI_HOB_RESOURCE_DESCRIPTOR); + Hob.ResourceType = EFI_RESOURCE_MEMORY_MAPPED_IO; + Hob.ResourceAttribute = EFI_RESOURCE_ATTRIBUTE_PRESENT | + EFI_RESOURCE_ATTRIBUTE_INITIALIZED | + EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | + EFI_RESOURCE_ATTRIBUTE_TESTED; + Hob.PhysicalStart = PcdGet32 (PcdCpuLocalApicBaseAddress); + Hob.ResourceLength = PcdGet32 (PcdFlashNvStorageVariableSize); + ZeroMem (&(Hob.Owner), sizeof (EFI_GUID)); + CopyMem ((UINT8 *)Buffer + Size, &Hob, sizeof (EFI_HOB_RESOURCE_DESCRIPTOR)); + Size += sizeof (EFI_HOB_RESOURCE_DESCRIPTOR); + NumberOfHobResourceDescriptor++; + + ASSERT (NumberOfHobResourceDescriptor == NUMBER_OF_HOB_RESOURCE_DESCRIPTOR); + + return EFI_SUCCESS; +} diff --git a/OvmfPkg/Library/MmPlatformHobProducerLibOvmf/MmPlatformHobProducerLibOvmf.inf b/OvmfPkg/Library/MmPlatformHobProducerLibOvmf/MmPlatformHobProducerLibOvmf.inf new file mode 100644 index 000000000000..a86010b63d72 --- /dev/null +++ b/OvmfPkg/Library/MmPlatformHobProducerLibOvmf/MmPlatformHobProducerLibOvmf.inf @@ -0,0 +1,51 @@ +## @file +# Null instance of MM Platform HOB Producer Library Class. +# +# Copyright (c) 2024, Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION = 0x00010017 + BASE_NAME = MmPlatformHobProducerLibOvmf + FILE_GUID = 011E97D9-2CA9-453D-9652-50C43AE54A4E + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + LIBRARY_CLASS = MmPlatformHobProducerLib + +# +# VALID_ARCHITECTURES = X64 +# + +[Sources] + MmPlatformHobProducerLibOvmf.c + +[LibraryClasses] + BaseLib + DebugLib + PcdLib + MemoryAllocationLib + HobLib + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + StandaloneMmPkg/StandaloneMmPkg.dec + UefiCpuPkg/UefiCpuPkg.dec + OvmfPkg/OvmfPkg.dec + +[Guids] + gUefiOvmfPkgPlatformInfoGuid ## CONSUMES ## SystemTable + +[Pcd] + gUefiCpuPkgTokenSpaceGuid.PcdCpuLocalApicBaseAddress + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageVariableBase + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize + gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask + gEfiMdePkgTokenSpaceGuid.PcdConfidentialComputingGuestAttr + +[Depex] + gEfiPeiMmAccessPpiGuid From e8fe2e83f10822e2b3fb4e41e444e792cd7c2420 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Wed, 23 Apr 2025 11:15:43 -0700 Subject: [PATCH 0092/1172] OvmfPkg: OvmfPkgX64: Platform changes for Standalone MM support This change adds a build flag in the platform DSC file to support standalone MM build on OVMF platform. The new standalone MM platform will not support S3 boot and thus no SMM lock box related components are included. Signed-off-by: Kun Qin --- OvmfPkg/OvmfPkgX64.dsc | 110 +++++++++++++++++++++++-- OvmfPkg/OvmfPkgX64.fdf | 32 +++++++ OvmfPkg/PlatformCI/PlatformBuildLib.py | 5 ++ 3 files changed, 138 insertions(+), 9 deletions(-) diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index 0b7955c42dde..cdb815c4b655 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -32,6 +32,7 @@ DEFINE SECURE_BOOT_ENABLE = FALSE DEFINE SMM_REQUIRE = FALSE DEFINE QEMU_PV_VARS = FALSE + DEFINE STANDALONE_MM_ENABLE = FALSE DEFINE SOURCE_DEBUG_ENABLE = FALSE DEFINE CC_MEASUREMENT_ENABLE = TRUE @@ -125,8 +126,8 @@ CLANGPDB:*_*_*_DLINK_FLAGS = /ALIGN:4096 # Force PE/COFF sections to be aligned at 4KB boundaries to support page level -# protection of DXE_SMM_DRIVER/SMM_CORE modules -[BuildOptions.common.EDKII.DXE_SMM_DRIVER, BuildOptions.common.EDKII.SMM_CORE] +# protection of MM/MM_CORE modules +[BuildOptions.common.EDKII.DXE_SMM_DRIVER, BuildOptions.common.EDKII.SMM_CORE, BuildOptions.common.EDKII.MM_CORE_STANDALONE, BuildOptions.common.EDKII.MM_STANDALONE] GCC:*_*_*_DLINK_FLAGS = -z common-page-size=0x1000 XCODE:*_*_*_DLINK_FLAGS = -seg1addr 0x1000 -segalign 0x1000 XCODE:*_*_*_MTOC_FLAGS = -align 0x1000 @@ -203,7 +204,12 @@ QemuFwCfgSimpleParserLib|OvmfPkg/Library/QemuFwCfgSimpleParserLib/QemuFwCfgSimpleParserLib.inf VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf LoadLinuxLib|OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf +!if $(STANDALONE_MM_ENABLE) != TRUE MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf +!else + # CC is not supported with standalone MM enabled + MemEncryptSevLib|OvmfPkg/Library/MemEncryptSevLibNull/MemEncryptSevLibNull.inf +!endif MemEncryptTdxLib|OvmfPkg/Library/BaseMemEncryptTdxLib/BaseMemEncryptTdxLib.inf PeiHardwareInfoLib|OvmfPkg/Library/HardwareInfoLib/PeiHardwareInfoLib.inf DxeHardwareInfoLib|OvmfPkg/Library/HardwareInfoLib/DxeHardwareInfoLib.inf @@ -215,6 +221,9 @@ CcProbeLib|OvmfPkg/Library/CcProbeLib/DxeCcProbeLib.inf !else CcProbeLib|MdePkg/Library/CcProbeLibNull/CcProbeLibNull.inf +!if $(STANDALONE_MM_ENABLE) == TRUE + MmPlatformHobProducerLib|OvmfPkg/Library/MmPlatformHobProducerLibOvmf/MmPlatformHobProducerLibOvmf.inf +!endif !endif CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf FrameBufferBltLib|MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltLib.inf @@ -295,7 +304,9 @@ MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf CcExitLib|OvmfPkg/Library/CcExitLib/SecCcExitLib.inf +!if $(STANDALONE_MM_ENABLE) != TRUE MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLib.inf +!endif CcProbeLib|OvmfPkg/Library/CcProbeLib/SecPeiCcProbeLib.inf TdxMeasurementLib|OvmfPkg/IntelTdx/TdxMeasurementLib/SecPeiTdxMeasurementLib.inf @@ -349,11 +360,16 @@ QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf PlatformInitLib|OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf +!if $(STANDALONE_MM_ENABLE) != TRUE MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf +!endif CcProbeLib|OvmfPkg/Library/CcProbeLib/SecPeiCcProbeLib.inf BaseCryptLib|CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf TdxMeasurementLib|OvmfPkg/IntelTdx/TdxMeasurementLib/SecPeiTdxMeasurementLib.inf TdxHelperLib|OvmfPkg/IntelTdx/TdxHelperLib/PeiTdxHelperLib.inf +!if $(SMM_REQUIRE) == TRUE && $(STANDALONE_MM_ENABLE) == TRUE + MmUnblockMemoryLib|UefiCpuPkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLib.inf +!endif [LibraryClasses.common.DXE_CORE] HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf @@ -501,6 +517,40 @@ !endif PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf +[LibraryClasses.common.MM_STANDALONE] +!ifdef $(DEBUG_ON_SERIAL_PORT) + DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf +!else + DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf +!endif + StandaloneMmDriverEntryPoint|MdePkg/Library/DynamicStackCookieEntryPointLib/StandaloneMmDriverEntryPoint.inf + TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf + MemoryAllocationLib|StandaloneMmPkg/Library/StandaloneMmMemoryAllocationLib/StandaloneMmMemoryAllocationLib.inf + MmServicesTableLib|MdePkg/Library/StandaloneMmServicesTableLib/StandaloneMmServicesTableLib.inf + HobLib|StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.inf + CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf + ReportStatusCodeLib|MdeModulePkg/Library/SmmReportStatusCodeLib/StandaloneMmReportStatusCodeLib.inf + CcExitLib|UefiCpuPkg/Library/CcExitLibNull/CcExitLibNull.inf + MemLib|StandaloneMmPkg/Library/StandaloneMmMemLib/StandaloneMmMemLib.inf + DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibStandaloneMm.inf + BaseCryptLib|CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf + +[LibraryClasses.common.MM_CORE_STANDALONE] +!ifdef $(DEBUG_ON_SERIAL_PORT) + DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf +!else + DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf +!endif + ExtractGuidedSectionLib|StandaloneMmPkg/Library/StandaloneMmExtractGuidedSectionLib/StandaloneMmExtractGuidedSectionLib.inf + FvLib|StandaloneMmPkg/Library/FvLib/FvLib.inf + HobLib|StandaloneMmPkg/Library/StandaloneMmCoreHobLib/StandaloneMmCoreHobLib.inf + MemoryAllocationLib|StandaloneMmPkg/Library/StandaloneMmCoreMemoryAllocationLib/StandaloneMmCoreMemoryAllocationLib.inf + MemLib|StandaloneMmPkg/Library/StandaloneMmMemLib/StandaloneMmMemLib.inf + ReportStatusCodeLib|MdeModulePkg/Library/SmmReportStatusCodeLib/StandaloneMmReportStatusCodeLib.inf + StandaloneMmCoreEntryPoint|MdePkg/Library/DynamicStackCookieEntryPointLib/StandaloneMmCoreEntryPoint.inf + HobPrintLib|MdeModulePkg/Library/HobPrintLib/HobPrintLib.inf + MmServicesTableLib|MdePkg/Library/StandaloneMmServicesTableLib/StandaloneMmServicesTableLib.inf + ################################################################################ # # Pcd Section - list of all EDK II PCD Entries defined by this Platform. @@ -517,6 +567,7 @@ gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire|TRUE gUefiCpuPkgTokenSpaceGuid.PcdCpuHotPlugSupport|TRUE gEfiMdeModulePkgTokenSpaceGuid.PcdEnableVariableRuntimeCache|FALSE + gUefiOvmfPkgTokenSpaceGuid.PcdStandaloneMmEnable|$(STANDALONE_MM_ENABLE) !endif !if $(QEMU_PV_VARS) == TRUE gUefiOvmfPkgTokenSpaceGuid.PcdQemuVarsRequire|TRUE @@ -965,8 +1016,10 @@ # MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf +!if $(STANDALONE_MM_ENABLE) != TRUE MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf +!endif MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf # @@ -1006,16 +1059,53 @@ # # SMM Initial Program Load (a DXE_RUNTIME_DRIVER) # +!if $(STANDALONE_MM_ENABLE) == TRUE + OvmfPkg/SmmControl2Dxe/MmControlPei.inf + StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.inf + StandaloneMmPkg/Drivers/MmCommunicationDxe/MmCommunicationDxe.inf { + + NULL|StandaloneMmPkg/Library/VariableMmDependency/VariableMmDependency.inf + } +!else MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf +!endif # # SMM_CORE # +!if $(STANDALONE_MM_ENABLE) == TRUE + StandaloneMmPkg/Core/StandaloneMmCore.inf +!else MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf +!endif # # Privileged drivers (DXE_SMM_DRIVER modules) # +!if $(STANDALONE_MM_ENABLE) == TRUE + UefiCpuPkg/CpuIo2Smm/CpuIo2StandaloneMm.inf + UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuStandaloneMm.inf { + + SmmCpuPlatformHookLib|OvmfPkg/Library/SmmCpuPlatformHookLibQemu/SmmCpuPlatformHookLibQemu.inf + SmmCpuFeaturesLib|OvmfPkg/Library/SmmCpuFeaturesLib/StandaloneMmCpuFeaturesLib.inf + MmSaveStateLib|UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveStateLib.inf + SmmCpuSyncLib|UefiCpuPkg/Library/SmmCpuSyncLib/SmmCpuSyncLib.inf + } + + # + # Variable driver stack (SMM) + # + OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesStandaloneMm.inf { + + CcExitLib|UefiCpuPkg/Library/CcExitLibNull/CcExitLibNull.inf + } + MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStandaloneMm.inf + MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.inf { + + NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf + NULL|MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLibStandaloneMm.inf + } +!else OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf { @@ -1023,13 +1113,12 @@ LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxSmmLib.inf } UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf { - - SmmCpuPlatformHookLib|OvmfPkg/Library/SmmCpuPlatformHookLibQemu/SmmCpuPlatformHookLibQemu.inf - SmmCpuFeaturesLib|OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf - MmSaveStateLib|UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveStateLib.inf - SmmCpuSyncLib|UefiCpuPkg/Library/SmmCpuSyncLib/SmmCpuSyncLib.inf - } - MdeModulePkg/Universal/SmmCommunicationBufferDxe/SmmCommunicationBufferDxe.inf + + SmmCpuPlatformHookLib|OvmfPkg/Library/SmmCpuPlatformHookLibQemu/SmmCpuPlatformHookLibQemu.inf + SmmCpuFeaturesLib|OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf + MmSaveStateLib|UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveStateLib.inf + SmmCpuSyncLib|UefiCpuPkg/Library/SmmCpuSyncLib/SmmCpuSyncLib.inf + } # # Variable driver stack (SMM) @@ -1044,6 +1133,9 @@ NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf NULL|MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.inf } +!endif + MdeModulePkg/Universal/SmmCommunicationBufferDxe/SmmCommunicationBufferDxe.inf + MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf !else diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf index c1a9977b7244..046d74f9b7cd 100644 --- a/OvmfPkg/OvmfPkgX64.fdf +++ b/OvmfPkg/OvmfPkgX64.fdf @@ -330,8 +330,10 @@ INF OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf INF OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf +!if $(STANDALONE_MM_ENABLE) != TRUE INF MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf +!endif INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf INF FatPkg/EnhancedFatDxe/Fat.inf @@ -379,6 +381,14 @@ INF OvmfPkg/VirtHstiDxe/VirtHstiDxe.inf !if $(SMM_REQUIRE) == TRUE INF OvmfPkg/SmmAccess/SmmAccess2Dxe.inf INF OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf +!if $(STANDALONE_MM_ENABLE) == TRUE +INF OvmfPkg/SmmControl2Dxe/MmControlPei.inf +INF StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.inf +INF StandaloneMmPkg/Drivers/MmCommunicationDxe/MmCommunicationDxe.inf +INF StandaloneMmPkg/Core/StandaloneMmCore.inf +INF UefiCpuPkg/CpuIo2Smm/CpuIo2StandaloneMm.inf +INF UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuStandaloneMm.inf +!else INF OvmfPkg/CpuS3DataDxe/CpuS3DataDxe.inf INF MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf INF MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf @@ -386,14 +396,21 @@ INF OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf INF UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf INF MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf INF UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf +!endif INF MdeModulePkg/Universal/SmmCommunicationBufferDxe/SmmCommunicationBufferDxe.inf # # Variable driver stack (SMM) # +!if $(STANDALONE_MM_ENABLE) == TRUE +INF OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesStandaloneMm.inf +INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStandaloneMm.inf +INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.inf +!else INF OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesSmm.inf INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf +!endif INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf !else @@ -573,3 +590,18 @@ FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 { UI STRING="$(MODULE_NAME)" Optional VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) } + +[Rule.Common.MM_CORE_STANDALONE] + FILE MM_CORE_STANDALONE = $(NAMED_GUID) { + PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi + UI STRING="$(MODULE_NAME)" Optional + VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) + } + +[Rule.Common.MM_STANDALONE] + FILE MM_STANDALONE = $(NAMED_GUID) { + SMM_DEPEX SMM_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex + PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi + UI STRING="$(MODULE_NAME)" Optional + VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) + } diff --git a/OvmfPkg/PlatformCI/PlatformBuildLib.py b/OvmfPkg/PlatformCI/PlatformBuildLib.py index 4d7b787d13a9..19f92ac13ff0 100644 --- a/OvmfPkg/PlatformCI/PlatformBuildLib.py +++ b/OvmfPkg/PlatformCI/PlatformBuildLib.py @@ -224,6 +224,11 @@ def FlashRomImage(self): args += " -global driver=cfi.pflash01,property=secure,value=on" args += " -drive if=pflash,format=raw,unit=0,file=" + os.path.join(OutputPath_FV, "OVMF_CODE.fd") + ",readonly=on" args += " -drive if=pflash,format=raw,unit=1,file=" + os.path.join(OutputPath_FV, "OVMF_VARS.fd") + if (self.env.GetBuildValue("STANDALONE_MM_ENABLE") == "1"): + # We will not support S3 in standalone MM mode + args += " -global ICH9-LPC.disable_s3=1" + # Make MMRAM bigger as it will need to hold the FV where the MM core is at + args += " -global mch.extended-tseg-mbytes=32" else: args += " -pflash " + os.path.join(OutputPath_FV, "OVMF.fd") # path to firmware From b25c1aa090bc0292023e69f53ada5b3c0f2e426a Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Tue, 15 Apr 2025 00:28:36 -0700 Subject: [PATCH 0093/1172] OvmfPkg: PlatformCI: Ovmf x64 platform with Standalone MM This change expands the CI pipeline build to a new platform type with Standalone MM support to ensure the incoming change works with Standalone MM environment on x64 platforms. Signed-off-by: Kun Qin --- OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml | 15 +++++++++++++++ OvmfPkg/PlatformCI/.azurepipelines/Windows-VS.yml | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml b/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml index a1f3a9b39e85..a7a802c3fe07 100644 --- a/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml +++ b/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml @@ -120,6 +120,21 @@ jobs: # Run.Flags: $(run_flags) # Run: $(should_run) + OVMF_X64_MM_DEBUG: + Build.File: "$(package)/PlatformCI/PlatformBuild.py" + Build.Arch: "X64" + Build.Flags: "BLD_*_SECURE_BOOT_ENABLE=1 BLD_*_SMM_REQUIRE=1 BLD_*_TPM2_ENABLE=1 BLD_*_NETWORK_TLS_ENABLE=1 BLD_*_NETWORK_IP6_ENABLE=1 BLD_*_NETWORK_HTTP_BOOT_ENABLE=1 BLD_*_STANDALONE_MM_ENABLE=1" + Build.Target: "DEBUG" + Run.Flags: $(run_flags) + Run: $(should_run) + OVMF_X64_MM_RELEASE: + Build.File: "$(package)/PlatformCI/PlatformBuild.py" + Build.Arch: "X64" + Build.Flags: "BLD_*_SECURE_BOOT_ENABLE=1 BLD_*_SMM_REQUIRE=1 BLD_*_TPM2_ENABLE=1 BLD_*_NETWORK_TLS_ENABLE=1 BLD_*_NETWORK_IP6_ENABLE=1 BLD_*_NETWORK_HTTP_BOOT_ENABLE=1 BLD_*_STANDALONE_MM_ENABLE=1" + Build.Target: "RELEASE" + Run.Flags: $(run_flags) + Run: $(should_run) + AMDSEV_X64_DEBUG: Build.File: "$(package)/PlatformCI/AmdSevBuild.py" Build.Arch: "X64" diff --git a/OvmfPkg/PlatformCI/.azurepipelines/Windows-VS.yml b/OvmfPkg/PlatformCI/.azurepipelines/Windows-VS.yml index adba93c6a1a4..9a9bf54b84d4 100644 --- a/OvmfPkg/PlatformCI/.azurepipelines/Windows-VS.yml +++ b/OvmfPkg/PlatformCI/.azurepipelines/Windows-VS.yml @@ -121,6 +121,21 @@ jobs: # Run.Flags: $(run_flags) # Run: $(should_run) + OVMF_X64_MM_DEBUG: + Build.File: "$(package)/PlatformCI/PlatformBuild.py" + Build.Arch: "X64" + Build.Flags: "BLD_*_SECURE_BOOT_ENABLE=1 BLD_*_SMM_REQUIRE=1 BLD_*_TPM2_ENABLE=1 BLD_*_NETWORK_TLS_ENABLE=1 BLD_*_NETWORK_IP6_ENABLE=1 BLD_*_NETWORK_HTTP_BOOT_ENABLE=1 BLD_*_STANDALONE_MM_ENABLE=1" + Build.Target: "DEBUG" + Run.Flags: $(run_flags) + Run: $(should_run) + OVMF_X64_MM_RELEASE: + Build.File: "$(package)/PlatformCI/PlatformBuild.py" + Build.Arch: "X64" + Build.Flags: "BLD_*_SECURE_BOOT_ENABLE=1 BLD_*_SMM_REQUIRE=1 BLD_*_TPM2_ENABLE=1 BLD_*_NETWORK_TLS_ENABLE=1 BLD_*_NETWORK_IP6_ENABLE=1 BLD_*_NETWORK_HTTP_BOOT_ENABLE=1 BLD_*_STANDALONE_MM_ENABLE=1" + Build.Target: "RELEASE" + Run.Flags: $(run_flags) + Run: $(should_run) + workspace: clean: all From e4e29690f11f492ef929916dd1fa862f5ac25e2d Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Thu, 24 Apr 2025 10:38:55 -0700 Subject: [PATCH 0094/1172] OvmfPkg: README: Add documentation for Standalone MM on OVMF This update introduces a new section in the README file, detailing the design considerations of the recently onboarded Standalone MM platform in OVMF. The section is intended for future reference and should be revised accordingly if updates to the Standalone MM framework render these limitations obsolete. Signed-off-by: Kun Qin --- OvmfPkg/README | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/OvmfPkg/README b/OvmfPkg/README index 550e952cccd5..c32e82a51b69 100644 --- a/OvmfPkg/README +++ b/OvmfPkg/README @@ -214,6 +214,47 @@ can be used on Windows. -global ICH9-LPC.disable_s3=1 \ +=== Standalone MM Support === + +Standalone MM (Management Mode) in UEFI is a secure execution environment +provided by the CPU and related silicon, designed to improve security and +portability compared to Traditional MM. It operates independently of the DXE +(Driver Execution Environment) phase, ensuring better isolation and reducing +vulnerabilities. + +Standalone MM leverages the same hardware capabilities as Traditional MM but +revises the software model to address security challenges. It uses Management +Mode RAM (MMRAM) for executing drivers and protocols securely, and its +initialization and runtime phases are distinct from Traditional MM. + +Due to the nature of Standalone MM, there are some limitations, requirements and +considerations when using it in OVMF: + +* Standalone MM is only supported in X64 mode and is not available in IA32 mode. +* The Standalone MM driver must be built with `-D STANDALONE_MM_ENABLE` flag. +* For X64, Standalone MM does not currently support S3 resume or LockBox + functionality. While LockBox functionality could be supported in the future + with unblock memory enabled during the DXE phase, S3 resume support is not + planned. +* On OVMF, Standalone MM does not support CPU hotplugging at this time; however, + this feature may be enabled in the future. +* Similar to SMM, Standalone MM requires a pflash-backed variable store. +* Standalone MM framework copies the entire Firmware Volume (FV) containing the + Standalone MM core into MMRAM. As a result, MMRAM must have sufficient + capacity to accommodate this operation alongside the runtime-loaded drivers. + +* Example QEMU launching command for Standalone MM based Q35 machine type: + + $ qemu-system-x86_64 \ + -debugcon stdio \ + -smp 4 -cpu IvyBridge,+rdrand \ + -machine q35,smm=on --accel tcg,thread=single \ + -global driver=cfi.pflash01,property=secure,value=on \ + -drive if=pflash,format=raw,unit=0,file=OVMF_CODE.fd,readonly=on \ + -drive if=pflash,format=raw,unit=1,file=OVMF_VARS.fd \ + -global ICH9-LPC.disable_s3=1 \ + -global mch.extended-tseg-mbytes=32 + === Network Support === OVMF provides a UEFI network stack by default. Its lowest level driver is the From f93da0727748fa2102e17e85bb43a28ff9007fe5 Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Wed, 11 Jun 2025 10:34:44 +0000 Subject: [PATCH 0095/1172] DynamicTablesPkg: Enhance SPCR support for interrupt and terminal types Introduce optional configuration objects to specify interrupt and terminal types. When the platform supplies this information, the SPCR table is updated to reflect the provided values. If the interrupt type is 8259, the corresponding IRQ number is set in the SPCR table. Signed-off-by: Abdul Lateef Attar --- .../Include/ArchCommonNameSpaceObjects.h | 15 ++ .../Acpi/Common/AcpiSpcrLib/SpcrGenerator.c | 247 ++++++++++++++++++ .../ConfigurationManagerObjectParser.c | 8 + 3 files changed, 270 insertions(+) diff --git a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h index 2e0b5ee3884c..a642aeca0fec 100644 --- a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h +++ b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h @@ -70,6 +70,7 @@ typedef enum ArchCommonObjectID { EArchCommonObjMemoryProximityDomainAttrInfo, ///< 42 - Memory Proximity Domain Attribute EArchCommonObjMemoryLatBwInfo, ///< 43 - Memory Latency Bandwidth Info EArchCommonObjMemoryCacheInfo, ///< 44 - Memory Cache Info + EArchCommonObjSpcrInfo, ///< 45 - Serial Terminal and Interrupt Info EArchCommonObjMax } EARCH_COMMON_OBJECT_ID; @@ -1048,6 +1049,20 @@ typedef struct CmArchCommonMemoryCacheInfo { /// @todo but will be in a near future. } CM_ARCH_COMMON_MEMORY_CACHE_INFO; +/** A structure that describes the Serial Terminal and Interrupt Information. + + This structure provides details about the interrupt type and terminal type + associated with a console device, used for the SPCR Table. + + ID: EArchCommonObjSpcrInfo +*/ +typedef struct CmArchCommonObjSpcrInfo { + /// Specifies the type of interrupt used by the console device. + UINT8 InterruptType; + /// Specifies the terminal type used by the console device. + UINT8 TerminalType; +} CM_ARCH_COMMON_SPCR_INFO; + #pragma pack() #endif // ARCH_COMMON_NAMESPACE_OBJECTS_H_ diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSpcrLib/SpcrGenerator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiSpcrLib/SpcrGenerator.c index 3dbfc3e84fea..421594bec0bb 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSpcrLib/SpcrGenerator.c +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSpcrLib/SpcrGenerator.c @@ -2,6 +2,7 @@ SPCR Table Generator Copyright (c) 2017 - 2021, Arm Limited. All rights reserved.
+ Copyright (C) 2025, Advanced Micro Devices, Inc. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent @@ -35,6 +36,8 @@ The following Configuration Manager Object(s) are required by this Generator: - EArchCommonObjConsolePortInfo + - EArchCommonObjSpcrInfo (OPTIONAL) + NOTE: This implementation ignores the possibility that the Serial settings may be modified from the UEFI Shell. A more complex handler would be needed @@ -44,6 +47,14 @@ NOTE: This implementation ignores the possibility that the Serial settings may #pragma pack(1) +/** Valid SPCR interrupt types +*/ +#define SPCR_VALID_INTERRUPT_TYPES \ + (EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_8259 | \ + EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_APIC | \ + EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_SAPIC | \ + EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_GIC) + /** A string representing the name of the SPCR port. */ #define NAME_STR_SPCR_PORT "COM1" @@ -107,6 +118,187 @@ GET_OBJECT_LIST ( CM_ARCH_COMMON_SERIAL_PORT_INFO ) +/** This macro expands to a function that retrieves the Serial + Terminal and Interrupt Information from the Configuration Manager. + This object is optional. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceArchCommon, + EArchCommonObjSpcrInfo, + CM_ARCH_COMMON_SPCR_INFO + ) + +/** Validate the Serial Port Terminal Interrupt Information. + + @param [in] SerialPortInfo Pointer to the Serial Port Information. + @param [in] SpcrInfo Pointer to the SPCR additional Information. + + @retval EFI_SUCCESS The information is valid. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +STATIC +EFI_STATUS +EFIAPI +ValidateSerialTerminalInterruptInfo ( + IN CM_ARCH_COMMON_SERIAL_PORT_INFO *SerialPortInfo, + IN CM_ARCH_COMMON_SPCR_INFO *SpcrInfo + ) +{ + EFI_STATUS Status; + + if ((SerialPortInfo == NULL) || (SpcrInfo == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_SUCCESS; + if ((SpcrInfo->TerminalType != EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_TERMINAL_TYPE_VT100) && + (SpcrInfo->TerminalType != EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_TERMINAL_TYPE_VT100_PLUS) && + (SpcrInfo->TerminalType != EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_TERMINAL_TYPE_VT_UTF8) && + (SpcrInfo->TerminalType != EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_TERMINAL_TYPE_ANSI)) + { + DEBUG (( + DEBUG_ERROR, + "ERROR: SPCR: Invalid terminal type %d for serial terminal.\n", + SpcrInfo->TerminalType + )); + Status |= EFI_INVALID_PARAMETER; + } + + if ((SerialPortInfo->PortSubtype == EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_FULL_16550) && + (SerialPortInfo->AccessSize > EFI_ACPI_6_3_UNDEFINED)) + { + DEBUG (( + DEBUG_ERROR, + "ERROR: SPCR: Access size must be %d for legacy 16550 UART.\n", + EFI_ACPI_6_3_UNDEFINED + )); + Status |= EFI_INVALID_PARAMETER; + } + + if (SerialPortInfo->PortSubtype == EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_16550_WITH_GAS) { + if ((SerialPortInfo->AccessSize <= EFI_ACPI_6_3_UNDEFINED) || + (SerialPortInfo->AccessSize >= EFI_ACPI_6_3_QWORD)) + { + DEBUG (( + DEBUG_ERROR, + "ERROR: SPCR: Access size must be > %d and < %d for 16550 with GAS.\n", + EFI_ACPI_6_3_UNDEFINED, + EFI_ACPI_6_3_QWORD + )); + Status |= EFI_INVALID_PARAMETER; + } + } + + if (SpcrInfo->InterruptType != 0) { + // Check that reserved bits [5:7] are zero + if ((SpcrInfo->InterruptType & ~(SPCR_VALID_INTERRUPT_TYPES)) != 0) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SPCR: Reserved bits [5:7] must be zero in interrupt type (0x%02x).\n", + SpcrInfo->InterruptType + )); + Status |= EFI_INVALID_PARAMETER; + } + + if ((((SpcrInfo->InterruptType) & + (EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_GIC)) != 0) && + (SpcrInfo->InterruptType != + EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_GIC)) + { + DEBUG (( + DEBUG_ERROR, + "ERROR: SPCR: %d GIC interrupt type cannot be combined with others.\n", + SpcrInfo->InterruptType + )); + Status |= EFI_INVALID_PARAMETER; + } + + if ((SpcrInfo->InterruptType & + EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_APIC) != 0) + { + if ((SpcrInfo->InterruptType & + ~(EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_8259 | + EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_APIC)) != 0) + { + DEBUG (( + DEBUG_ERROR, + "ERROR: SPCR: %d Invalid APIC interrupt type.\n", + SpcrInfo->InterruptType + )); + Status |= EFI_INVALID_PARAMETER; + } + } + + if ((SpcrInfo->InterruptType & + EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_SAPIC) != 0) + { + if ((SpcrInfo->InterruptType & + ~(EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_8259 | \ + EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_SAPIC)) != 0) + { + DEBUG (( + DEBUG_ERROR, + "ERROR: SPCR: %d Invalid SAPIC interrupt type.\n", + SpcrInfo->InterruptType + )); + Status |= EFI_INVALID_PARAMETER; + } + } + + if ((SpcrInfo->InterruptType & EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_8259) != 0) { + // For legacy devices, only GSIs below 32 are used. + // Valid IRQs: 2-7, 9-12, 14-15. Reserved: 0-1, 8, 13, 16-255. + if (!(((SerialPortInfo->Interrupt >= 2) && (SerialPortInfo->Interrupt <= 7)) || + ((SerialPortInfo->Interrupt >= 9) && (SerialPortInfo->Interrupt <= 12)) || + ((SerialPortInfo->Interrupt >= 14) && (SerialPortInfo->Interrupt <= 15)))) + { + DEBUG (( + DEBUG_ERROR, + "ERROR: SPCR: Invalid IRQ %d for 8259 interrupt type.\n", + SerialPortInfo->Interrupt + )); + Status |= EFI_INVALID_PARAMETER; + } + } + } + + return Status; +} + +/** Update the SPCR table with the terminal interrupt type and terminal information. + + @param [in, out] SpcrTable Pointer to the SPCR table. + @param [in] SpcrInfo Pointer to the Serial Terminal Interrupt Information. + @param [in] SerialPortInfo Pointer to the Serial Port Information. + + @retval EFI_SUCCESS The information was updated successfully. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +STATIC +EFI_STATUS +EFIAPI +UpdateTerminalInterruptTypeInfo ( + IN OUT EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_4 *SpcrTable, + IN CM_ARCH_COMMON_SPCR_INFO *SpcrInfo, + IN CM_ARCH_COMMON_SERIAL_PORT_INFO *SerialPortInfo + ) +{ + if ((SpcrTable == NULL) || (SpcrInfo == NULL)) { + return EFI_INVALID_PARAMETER; + } + + SpcrTable->InterruptType = SpcrInfo->InterruptType; + SpcrTable->TerminalType = SpcrInfo->TerminalType; + + if ((SpcrInfo->InterruptType & + EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_8259) != 0) + { + SpcrTable->Irq = (SerialPortInfo->Interrupt & MAX_UINT8); + } + + return EFI_SUCCESS; +} + /** Free any resources allocated for constructing the tables. @param [in] This Pointer to the ACPI table generator. @@ -209,6 +401,8 @@ BuildSpcrTableEx ( UINT32 SerialPortCount; EFI_ACPI_DESCRIPTION_HEADER **TableList; UINT32 Size; + CM_ARCH_COMMON_SPCR_INFO *SpcrInfo; + UINT32 SpcrInfoCount; ASSERT (This != NULL); ASSERT (AcpiTableInfo != NULL); @@ -258,6 +452,37 @@ BuildSpcrTableEx ( return EFI_NOT_FOUND; } + SpcrInfo = NULL; + SpcrInfoCount = 0; + Status = GetEArchCommonObjSpcrInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &SpcrInfo, + &SpcrInfoCount + ); + + if (!EFI_ERROR (Status)) { + Status = ValidateSerialTerminalInterruptInfo ( + SerialPortInfo, + SpcrInfo + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SPCR: Invalid serial terminal interrupt information. Status = %r\n", + Status + )); + return Status; + } + } else { + DEBUG (( + DEBUG_VERBOSE, + "SPCR: Continue with default interrupt type (0x%x) and terminal type (0x%x).\n", + EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_GIC, + EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_TERMINAL_TYPE_ANSI + )); + } + // Validate the SerialPort info. Only one SPCR port can be described. // If platform provides description for multiple SPCR ports, use the // first SPCR port information. @@ -343,6 +568,12 @@ BuildSpcrTableEx ( // and some ConfigurationManager implementations // may not be providing this field data AcpiSpcr.BaseAddress.AccessSize = EFI_ACPI_6_3_DWORD; + if (SerialPortInfo->PortSubtype == EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_FULL_16550) { + AcpiSpcr.BaseAddress.AddressSpaceId = EFI_ACPI_6_3_SYSTEM_IO; + AcpiSpcr.BaseAddress.RegisterBitWidth = 8; + AcpiSpcr.BaseAddress.RegisterBitOffset = 0; + AcpiSpcr.BaseAddress.AccessSize = EFI_ACPI_6_3_UNDEFINED; + } } else { AcpiSpcr.BaseAddress.AccessSize = SerialPortInfo->AccessSize; } @@ -397,6 +628,22 @@ BuildSpcrTableEx ( AsciiStrCpyS (AcpiSpcr.NameSpaceString, sizeof (NAME_STR_SPCR_PORT), NAME_STR_SPCR_PORT); } + if (SpcrInfoCount != 0) { + Status = UpdateTerminalInterruptTypeInfo ( + &AcpiSpcr, + SpcrInfo, + SerialPortInfo + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SPCR: Failed to update interrupt terminal type info. Status = %r\n", + Status + )); + goto error_handler; + } + } + TableList[0] = (EFI_ACPI_DESCRIPTION_HEADER *)&AcpiSpcr; // Build a SSDT table describing the serial port. diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c index c61caf80bd68..a0f00ce2faff 100644 --- a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c +++ b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c @@ -874,6 +874,13 @@ STATIC CONST CM_OBJ_PARSER CmArchCommonMemoryCacheInfo[] = { { "CacheAttributes", 4, "0x%x", NULL,}, }; +/** A parser for EArchCommonObjSpcrInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArchCommonObjSpcrInfoParser[] = { + { "InterruptType", 1, "0x%x", NULL }, + { "TerminalType", 1, "0x%x", NULL } +}; + /** A parser for Arch Common namespace objects. */ STATIC CONST CM_OBJ_PARSER_ARRAY ArchCommonNamespaceObjectParser[] = { @@ -922,6 +929,7 @@ STATIC CONST CM_OBJ_PARSER_ARRAY ArchCommonNamespaceObjectParser[] = { CM_PARSER_ADD_OBJECT (EArchCommonObjMemoryProximityDomainAttrInfo,CmArchCommonMemoryProximityDomainAttrInfo), CM_PARSER_ADD_OBJECT (EArchCommonObjMemoryLatBwInfo, CmArchCommonMemoryLatBwInfo), CM_PARSER_ADD_OBJECT (EArchCommonObjMemoryCacheInfo, CmArchCommonMemoryCacheInfo), + CM_PARSER_ADD_OBJECT (EArchCommonObjSpcrInfo, CmArchCommonObjSpcrInfoParser), CM_PARSER_ADD_OBJECT_RESERVED (EArchCommonObjMax) }; From 510a5c20398d4324ab4eda17b1a3c1606e83c1a2 Mon Sep 17 00:00:00 2001 From: Ceping Sun Date: Mon, 2 Jun 2025 23:06:42 -0400 Subject: [PATCH 0096/1172] MdePkg/Acpi66.h: Add ACPI 6.6 header Create Acpi66.h, which is copied from Acpi65.h, and make the following changes: 1. Replace all occurences of "6.5/6_5" with "6.6/6_6". 2. Add "ResetVector" in Multiprocessor Wakeup Structure. 3. Add "Test" command for Multiprocessor Wakeup Mailbox. 4. Make Acpi66.h the latest ACPI definitions that Acpi.h contains. Cc: Michael D Kinney Cc: Liming Gao Signed-off-by: Ceping Sun --- MdePkg/Include/IndustryStandard/Acpi.h | 2 +- MdePkg/Include/IndustryStandard/Acpi66.h | 3363 ++++++++++++++++++++++ 2 files changed, 3364 insertions(+), 1 deletion(-) create mode 100644 MdePkg/Include/IndustryStandard/Acpi66.h diff --git a/MdePkg/Include/IndustryStandard/Acpi.h b/MdePkg/Include/IndustryStandard/Acpi.h index a0610d4a4cc9..64c7d78eec36 100644 --- a/MdePkg/Include/IndustryStandard/Acpi.h +++ b/MdePkg/Include/IndustryStandard/Acpi.h @@ -12,6 +12,6 @@ #ifndef _ACPI_H_ #define _ACPI_H_ -#include +#include #endif diff --git a/MdePkg/Include/IndustryStandard/Acpi66.h b/MdePkg/Include/IndustryStandard/Acpi66.h new file mode 100644 index 000000000000..b95166841fe5 --- /dev/null +++ b/MdePkg/Include/IndustryStandard/Acpi66.h @@ -0,0 +1,3363 @@ +/** @file + ACPI 6.6 definitions from the ACPI Specification Revision 6.6 May, 2025. + + Copyright (c) 2017 - 2025, Intel Corporation. All rights reserved.
+ Copyright (c) 2019 - 2024, ARM Ltd. All rights reserved.
+ Copyright (c) 2023, Loongson Technology Corporation Limited. All rights reserved.
+ Copyright (C) 2025, Advanced Micro Devices, Inc. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef ACPI_6_6_H_ +#define ACPI_6_6_H_ + +#include + +// +// Ensure proper structure formats +// +#pragma pack(1) + +/// +/// _STA bit definitions ACPI 6.6 s6.3.7 +/// +#define ACPI_AML_STA_DEVICE_STATUS_PRESET 0x1 +#define ACPI_AML_STA_DEVICE_STATUS_ENABLED 0x2 +#define ACPI_AML_STA_DEVICE_STATUS_UI 0x4 +#define ACPI_AML_STA_DEVICE_STATUS_FUNCTIONING 0x8 +#define ACPI_AML_STA_DEVICE_STATUS_BATTERY 0x10 + +/// +/// _CSD Revision for ACPI 6.6 +/// +#define EFI_ACPI_6_6_AML_CSD_REVISION 0 + +/// +/// _CSD NumEntries for ACPI 6.6 +/// +#define EFI_ACPI_6_6_AML_CSD_NUM_ENTRIES 6 + +/// +/// _PSD Revision for ACPI 6.6 +/// +#define EFI_ACPI_6_6_AML_PSD_REVISION 0 + +/// +/// _CPC Revision for ACPI 6.6 +/// +#define EFI_ACPI_6_6_AML_CPC_REVISION 3 + +/// +/// ACPI 6.6 Generic Address Space definition +/// +typedef struct { + UINT8 AddressSpaceId; + UINT8 RegisterBitWidth; + UINT8 RegisterBitOffset; + UINT8 AccessSize; + UINT64 Address; +} EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE; + +// +// Generic Address Space Address IDs +// +#define EFI_ACPI_6_6_SYSTEM_MEMORY 0x00 +#define EFI_ACPI_6_6_SYSTEM_IO 0x01 +#define EFI_ACPI_6_6_PCI_CONFIGURATION_SPACE 0x02 +#define EFI_ACPI_6_6_EMBEDDED_CONTROLLER 0x03 +#define EFI_ACPI_6_6_SMBUS 0x04 +#define EFI_ACPI_6_6_SYSTEM_CMOS 0x05 +#define EFI_ACPI_6_6_PCI_BAR_TARGET 0x06 +#define EFI_ACPI_6_6_IPMI 0x07 +#define EFI_ACPI_6_6_GENERAL_PURPOSE_IO 0x08 +#define EFI_ACPI_6_6_GENERIC_SERIAL_BUS 0x09 +#define EFI_ACPI_6_6_PLATFORM_COMMUNICATION_CHANNEL 0x0A +#define EFI_ACPI_6_6_PLATFORM_RUNTIME_MECHANISM 0x0B +#define EFI_ACPI_6_6_FUNCTIONAL_FIXED_HARDWARE 0x7F + +// +// Generic Address Space Access Sizes +// +#define EFI_ACPI_6_6_UNDEFINED 0 +#define EFI_ACPI_6_6_BYTE 1 +#define EFI_ACPI_6_6_WORD 2 +#define EFI_ACPI_6_6_DWORD 3 +#define EFI_ACPI_6_6_QWORD 4 + +// +// ACPI 6.6 table structures +// + +/// +/// Root System Description Pointer Structure +/// +typedef struct { + UINT64 Signature; + UINT8 Checksum; + UINT8 OemId[6]; + UINT8 Revision; + UINT32 RsdtAddress; + UINT32 Length; + UINT64 XsdtAddress; + UINT8 ExtendedChecksum; + UINT8 Reserved[3]; +} EFI_ACPI_6_6_ROOT_SYSTEM_DESCRIPTION_POINTER; + +/// +/// RSD_PTR Revision (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION 0x02 ///< ACPISpec (Revision 6.6) says current value is 2 + +/// +/// Common table header, this prefaces all ACPI tables, including FACS, but +/// excluding the RSD PTR structure +/// +typedef struct { + UINT32 Signature; + UINT32 Length; +} EFI_ACPI_6_6_COMMON_HEADER; + +// +// Root System Description Table +// No definition needed as it is a common description table header, the same with +// EFI_ACPI_DESCRIPTION_HEADER, followed by a variable number of UINT32 table pointers. +// + +/// +/// RSDT Revision (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_ROOT_SYSTEM_DESCRIPTION_TABLE_REVISION 0x01 + +// +// Extended System Description Table +// No definition needed as it is a common description table header, the same with +// EFI_ACPI_DESCRIPTION_HEADER, followed by a variable number of UINT64 table pointers. +// + +/// +/// XSDT Revision (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_EXTENDED_SYSTEM_DESCRIPTION_TABLE_REVISION 0x01 + +/// +/// Fixed ACPI Description Table Structure (FADT) +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT32 FirmwareCtrl; + UINT32 Dsdt; + UINT8 Reserved0; + UINT8 PreferredPmProfile; + UINT16 SciInt; + UINT32 SmiCmd; + UINT8 AcpiEnable; + UINT8 AcpiDisable; + UINT8 S4BiosReq; + UINT8 PstateCnt; + UINT32 Pm1aEvtBlk; + UINT32 Pm1bEvtBlk; + UINT32 Pm1aCntBlk; + UINT32 Pm1bCntBlk; + UINT32 Pm2CntBlk; + UINT32 PmTmrBlk; + UINT32 Gpe0Blk; + UINT32 Gpe1Blk; + UINT8 Pm1EvtLen; + UINT8 Pm1CntLen; + UINT8 Pm2CntLen; + UINT8 PmTmrLen; + UINT8 Gpe0BlkLen; + UINT8 Gpe1BlkLen; + UINT8 Gpe1Base; + UINT8 CstCnt; + UINT16 PLvl2Lat; + UINT16 PLvl3Lat; + UINT16 FlushSize; + UINT16 FlushStride; + UINT8 DutyOffset; + UINT8 DutyWidth; + UINT8 DayAlrm; + UINT8 MonAlrm; + UINT8 Century; + UINT16 IaPcBootArch; + UINT8 Reserved1; + UINT32 Flags; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE ResetReg; + UINT8 ResetValue; + UINT16 ArmBootArch; + UINT8 MinorVersion; + UINT64 XFirmwareCtrl; + UINT64 XDsdt; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE XPm1aEvtBlk; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE XPm1bEvtBlk; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE XPm1aCntBlk; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE XPm1bCntBlk; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE XPm2CntBlk; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE XPmTmrBlk; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE XGpe0Blk; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE XGpe1Blk; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE SleepControlReg; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE SleepStatusReg; + UINT64 HypervisorVendorIdentity; +} EFI_ACPI_6_6_FIXED_ACPI_DESCRIPTION_TABLE; + +/// +/// FADT Version (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_FIXED_ACPI_DESCRIPTION_TABLE_REVISION 0x06 +#define EFI_ACPI_6_6_FIXED_ACPI_DESCRIPTION_TABLE_MINOR_REVISION 0x05 + +// +// Fixed ACPI Description Table Preferred Power Management Profile +// +#define EFI_ACPI_6_6_PM_PROFILE_UNSPECIFIED 0 +#define EFI_ACPI_6_6_PM_PROFILE_DESKTOP 1 +#define EFI_ACPI_6_6_PM_PROFILE_MOBILE 2 +#define EFI_ACPI_6_6_PM_PROFILE_WORKSTATION 3 +#define EFI_ACPI_6_6_PM_PROFILE_ENTERPRISE_SERVER 4 +#define EFI_ACPI_6_6_PM_PROFILE_SOHO_SERVER 5 +#define EFI_ACPI_6_6_PM_PROFILE_APPLIANCE_PC 6 +#define EFI_ACPI_6_6_PM_PROFILE_PERFORMANCE_SERVER 7 +#define EFI_ACPI_6_6_PM_PROFILE_TABLET 8 + +// +// Fixed ACPI Description Table Boot Architecture Flags +// All other bits are reserved and must be set to 0. +// +#define EFI_ACPI_6_6_LEGACY_DEVICES BIT0 +#define EFI_ACPI_6_6_8042 BIT1 +#define EFI_ACPI_6_6_VGA_NOT_PRESENT BIT2 +#define EFI_ACPI_6_6_MSI_NOT_SUPPORTED BIT3 +#define EFI_ACPI_6_6_PCIE_ASPM_CONTROLS BIT4 +#define EFI_ACPI_6_6_CMOS_RTC_NOT_PRESENT BIT5 + +// +// Fixed ACPI Description Table Arm Boot Architecture Flags +// All other bits are reserved and must be set to 0. +// +#define EFI_ACPI_6_6_ARM_PSCI_COMPLIANT BIT0 +#define EFI_ACPI_6_6_ARM_PSCI_USE_HVC BIT1 + +// +// Fixed ACPI Description Table Fixed Feature Flags +// All other bits are reserved and must be set to 0. +// +#define EFI_ACPI_6_6_WBINVD BIT0 +#define EFI_ACPI_6_6_WBINVD_FLUSH BIT1 +#define EFI_ACPI_6_6_PROC_C1 BIT2 +#define EFI_ACPI_6_6_P_LVL2_UP BIT3 +#define EFI_ACPI_6_6_PWR_BUTTON BIT4 +#define EFI_ACPI_6_6_SLP_BUTTON BIT5 +#define EFI_ACPI_6_6_FIX_RTC BIT6 +#define EFI_ACPI_6_6_RTC_S4 BIT7 +#define EFI_ACPI_6_6_TMR_VAL_EXT BIT8 +#define EFI_ACPI_6_6_DCK_CAP BIT9 +#define EFI_ACPI_6_6_RESET_REG_SUP BIT10 +#define EFI_ACPI_6_6_SEALED_CASE BIT11 +#define EFI_ACPI_6_6_HEADLESS BIT12 +#define EFI_ACPI_6_6_CPU_SW_SLP BIT13 +#define EFI_ACPI_6_6_PCI_EXP_WAK BIT14 +#define EFI_ACPI_6_6_USE_PLATFORM_CLOCK BIT15 +#define EFI_ACPI_6_6_S4_RTC_STS_VALID BIT16 +#define EFI_ACPI_6_6_REMOTE_POWER_ON_CAPABLE BIT17 +#define EFI_ACPI_6_6_FORCE_APIC_CLUSTER_MODEL BIT18 +#define EFI_ACPI_6_6_FORCE_APIC_PHYSICAL_DESTINATION_MODE BIT19 +#define EFI_ACPI_6_6_HW_REDUCED_ACPI BIT20 +#define EFI_ACPI_6_6_LOW_POWER_S0_IDLE_CAPABLE BIT21 + +/// +/// Firmware ACPI Control Structure +/// +typedef struct { + UINT32 Signature; + UINT32 Length; + UINT32 HardwareSignature; + UINT32 FirmwareWakingVector; + UINT32 GlobalLock; + UINT32 Flags; + UINT64 XFirmwareWakingVector; + UINT8 Version; + UINT8 Reserved0[3]; + UINT32 OspmFlags; + UINT8 Reserved1[24]; +} EFI_ACPI_6_6_FIRMWARE_ACPI_CONTROL_STRUCTURE; + +/// +/// FACS Version (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION 0x02 + +/// +/// Firmware Control Structure Feature Flags +/// All other bits are reserved and must be set to 0. +/// +#define EFI_ACPI_6_6_S4BIOS_F BIT0 +#define EFI_ACPI_6_6_64BIT_WAKE_SUPPORTED_F BIT1 + +/// +/// OSPM Enabled Firmware Control Structure Flags +/// All other bits are reserved and must be set to 0. +/// +#define EFI_ACPI_6_6_OSPM_64BIT_WAKE_F BIT0 + +// +// Differentiated System Description Table, +// Secondary System Description Table +// and Persistent System Description Table, +// no definition needed as they are common description table header, the same with +// EFI_ACPI_DESCRIPTION_HEADER, followed by a definition block. +// +#define EFI_ACPI_6_6_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_REVISION 0x02 +#define EFI_ACPI_6_6_SECONDARY_SYSTEM_DESCRIPTION_TABLE_REVISION 0x02 + +/// +/// Multiple APIC Description Table header definition. The rest of the table +/// must be defined in a platform specific manner. +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT32 LocalApicAddress; + UINT32 Flags; +} EFI_ACPI_6_6_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER; + +/// +/// MADT Revision (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION 0x06 + +/// +/// Multiple APIC Flags +/// All other bits are reserved and must be set to 0. +/// +#define EFI_ACPI_6_6_PCAT_COMPAT BIT0 + +// +// Multiple APIC Description Table APIC structure types +// All other values between 0x18 and 0x7F are reserved and +// will be ignored by OSPM. 0x80 ~ 0xFF are reserved for OEM. +// +#define EFI_ACPI_6_6_PROCESSOR_LOCAL_APIC 0x00 +#define EFI_ACPI_6_6_IO_APIC 0x01 +#define EFI_ACPI_6_6_INTERRUPT_SOURCE_OVERRIDE 0x02 +#define EFI_ACPI_6_6_NON_MASKABLE_INTERRUPT_SOURCE 0x03 +#define EFI_ACPI_6_6_LOCAL_APIC_NMI 0x04 +#define EFI_ACPI_6_6_LOCAL_APIC_ADDRESS_OVERRIDE 0x05 +#define EFI_ACPI_6_6_IO_SAPIC 0x06 +#define EFI_ACPI_6_6_LOCAL_SAPIC 0x07 +#define EFI_ACPI_6_6_PLATFORM_INTERRUPT_SOURCES 0x08 +#define EFI_ACPI_6_6_PROCESSOR_LOCAL_X2APIC 0x09 +#define EFI_ACPI_6_6_LOCAL_X2APIC_NMI 0x0A +#define EFI_ACPI_6_6_GIC 0x0B +#define EFI_ACPI_6_6_GICD 0x0C +#define EFI_ACPI_6_6_GIC_MSI_FRAME 0x0D +#define EFI_ACPI_6_6_GICR 0x0E +#define EFI_ACPI_6_6_GIC_ITS 0x0F +#define EFI_ACPI_6_6_MULTIPROCESSOR_WAKEUP 0x10 +#define EFI_ACPI_6_6_CORE_PIC 0x11 +#define EFI_ACPI_6_6_LIO_PIC 0x12 +#define EFI_ACPI_6_6_HT_PIC 0x13 +#define EFI_ACPI_6_6_EIO_PIC 0x14 +#define EFI_ACPI_6_6_MSI_PIC 0x15 +#define EFI_ACPI_6_6_BIO_PIC 0x16 +#define EFI_ACPI_6_6_LPC_PIC 0x17 + +// +// APIC Structure Definitions +// + +/// +/// Processor Local APIC Structure Definition +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 AcpiProcessorUid; + UINT8 ApicId; + UINT32 Flags; +} EFI_ACPI_6_6_PROCESSOR_LOCAL_APIC_STRUCTURE; + +/// +/// Local APIC Flags. All other bits are reserved and must be 0. +/// +#define EFI_ACPI_6_6_LOCAL_APIC_ENABLED BIT0 +#define EFI_ACPI_6_6_LOCAL_APIC_ONLINE_CAPABLE BIT1 + +/// +/// IO APIC Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 IoApicId; + UINT8 Reserved; + UINT32 IoApicAddress; + UINT32 GlobalSystemInterruptBase; +} EFI_ACPI_6_6_IO_APIC_STRUCTURE; + +/// +/// Interrupt Source Override Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Bus; + UINT8 Source; + UINT32 GlobalSystemInterrupt; + UINT16 Flags; +} EFI_ACPI_6_6_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE; + +/// +/// Platform Interrupt Sources Structure Definition +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT16 Flags; + UINT8 InterruptType; + UINT8 ProcessorId; + UINT8 ProcessorEid; + UINT8 IoSapicVector; + UINT32 GlobalSystemInterrupt; + UINT32 PlatformInterruptSourceFlags; + UINT8 CpeiProcessorOverride; + UINT8 Reserved[31]; +} EFI_ACPI_6_6_PLATFORM_INTERRUPT_APIC_STRUCTURE; + +// +// MPS INTI flags. +// All other bits are reserved and must be set to 0. +// +#define EFI_ACPI_6_6_POLARITY (3 << 0) +#define EFI_ACPI_6_6_TRIGGER_MODE (3 << 2) + +/// +/// Non-Maskable Interrupt Source Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT16 Flags; + UINT32 GlobalSystemInterrupt; +} EFI_ACPI_6_6_NON_MASKABLE_INTERRUPT_SOURCE_STRUCTURE; + +/// +/// Local APIC NMI Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 AcpiProcessorUid; + UINT16 Flags; + UINT8 LocalApicLint; +} EFI_ACPI_6_6_LOCAL_APIC_NMI_STRUCTURE; + +/// +/// Local APIC Address Override Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT16 Reserved; + UINT64 LocalApicAddress; +} EFI_ACPI_6_6_LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE; + +/// +/// IO SAPIC Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 IoApicId; + UINT8 Reserved; + UINT32 GlobalSystemInterruptBase; + UINT64 IoSapicAddress; +} EFI_ACPI_6_6_IO_SAPIC_STRUCTURE; + +/// +/// Local SAPIC Structure +/// This struct followed by a null-terminated ASCII string - ACPI Processor UID String +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 AcpiProcessorId; + UINT8 LocalSapicId; + UINT8 LocalSapicEid; + UINT8 Reserved[3]; + UINT32 Flags; + UINT32 ACPIProcessorUIDValue; +} EFI_ACPI_6_6_PROCESSOR_LOCAL_SAPIC_STRUCTURE; + +/// +/// Platform Interrupt Sources Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT16 Flags; + UINT8 InterruptType; + UINT8 ProcessorId; + UINT8 ProcessorEid; + UINT8 IoSapicVector; + UINT32 GlobalSystemInterrupt; + UINT32 PlatformInterruptSourceFlags; +} EFI_ACPI_6_6_PLATFORM_INTERRUPT_SOURCES_STRUCTURE; + +/// +/// Platform Interrupt Source Flags. +/// All other bits are reserved and must be set to 0. +/// +#define EFI_ACPI_6_6_CPEI_PROCESSOR_OVERRIDE BIT0 + +/// +/// Processor Local x2APIC Structure Definition +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Reserved[2]; + UINT32 X2ApicId; + UINT32 Flags; + UINT32 AcpiProcessorUid; +} EFI_ACPI_6_6_PROCESSOR_LOCAL_X2APIC_STRUCTURE; + +/// +/// Local x2APIC NMI Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT16 Flags; + UINT32 AcpiProcessorUid; + UINT8 LocalX2ApicLint; + UINT8 Reserved[3]; +} EFI_ACPI_6_6_LOCAL_X2APIC_NMI_STRUCTURE; + +/// +/// GIC Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT16 Reserved; + UINT32 CPUInterfaceNumber; + UINT32 AcpiProcessorUid; + UINT32 Flags; + UINT32 ParkingProtocolVersion; + UINT32 PerformanceInterruptGsiv; + UINT64 ParkedAddress; + UINT64 PhysicalBaseAddress; + UINT64 GICV; + UINT64 GICH; + UINT32 VGICMaintenanceInterrupt; + UINT64 GICRBaseAddress; + UINT64 MPIDR; + UINT8 ProcessorPowerEfficiencyClass; + UINT8 Reserved2; + UINT16 SpeOverflowInterrupt; + UINT16 TrbeInterrupt; +} EFI_ACPI_6_6_GIC_STRUCTURE; + +/// +/// GIC Flags. All other bits are reserved and must be 0. +/// +#define EFI_ACPI_6_6_GIC_ENABLED BIT0 +#define EFI_ACPI_6_6_PERFORMANCE_INTERRUPT_MODEL BIT1 +#define EFI_ACPI_6_6_VGIC_MAINTENANCE_INTERRUPT_MODE_FLAGS BIT2 +#define EFI_ACPI_6_6_GIC_ONLINE_CAPABLE BIT3 + +/// +/// GIC Distributor Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT16 Reserved1; + UINT32 GicId; + UINT64 PhysicalBaseAddress; + UINT32 SystemVectorBase; + UINT8 GicVersion; + UINT8 Reserved2[3]; +} EFI_ACPI_6_6_GIC_DISTRIBUTOR_STRUCTURE; + +/// +/// GIC Version +/// +#define EFI_ACPI_6_6_GIC_V1 0x01 +#define EFI_ACPI_6_6_GIC_V2 0x02 +#define EFI_ACPI_6_6_GIC_V3 0x03 +#define EFI_ACPI_6_6_GIC_V4 0x04 + +/// +/// GIC MSI Frame Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT16 Reserved1; + UINT32 GicMsiFrameId; + UINT64 PhysicalBaseAddress; + UINT32 Flags; + UINT16 SPICount; + UINT16 SPIBase; +} EFI_ACPI_6_6_GIC_MSI_FRAME_STRUCTURE; + +/// +/// GIC MSI Frame Flags. All other bits are reserved and must be 0. +/// +#define EFI_ACPI_6_6_SPI_COUNT_BASE_SELECT BIT0 + +/// +/// GICR Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT16 Reserved; + UINT64 DiscoveryRangeBaseAddress; + UINT32 DiscoveryRangeLength; +} EFI_ACPI_6_6_GICR_STRUCTURE; + +/// +/// GIC Interrupt Translation Service Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT16 Reserved; + UINT32 GicItsId; + UINT64 PhysicalBaseAddress; + UINT32 Reserved2; +} EFI_ACPI_6_6_GIC_ITS_STRUCTURE; + +/// +/// Multiprocessor Wakeup Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT16 MailBoxVersion; + UINT32 Reserved; + UINT64 MailBoxAddress; + UINT64 ResetVector; +} EFI_ACPI_6_6_MULTIPROCESSOR_WAKEUP_STRUCTURE; + +/// +/// Multiprocessor Wakeup Mailbox Structure +/// +typedef struct { + UINT16 Command; + UINT16 Reserved; + UINT32 AcpiId; + UINT64 WakeupVector; + UINT8 ReservedForOs[2032]; + UINT8 ReservedForFirmware[2048]; +} EFI_ACPI_6_6_MULTIPROCESSOR_WAKEUP_MAILBOX_STRUCTURE; + +#define EFI_ACPI_6_6_MULTIPROCESSOR_WAKEUP_MAILBOX_COMMAND_NOOP 0x0000 +#define EFI_ACPI_6_6_MULTIPROCESSOR_WAKEUP_MAILBOX_COMMAND_WAKEUP 0x0001 +#define EFI_ACPI_6_6_MULTIPROCESSOR_WAKEUP_MAILBOX_COMMAND_TEST 0x0002 + +/// +/// Core Programmable Interrupt Controller +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Version; + UINT32 ProcessorId; + UINT32 CoreId; + UINT32 Flags; +} EFI_ACPI_6_6_CORE_PIC_STRUCTURE; + +/// +/// Legacy I/O Programmable Interrupt Controller +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Version; + UINT64 Address; + UINT16 Size; + UINT8 Cascade[2]; + UINT32 CascadeMap[2]; +} EFI_ACPI_6_6_LIO_PIC_STRUCTURE; + +/// +/// HyperTransport Programmable Interrupt Controller +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Version; + UINT64 Address; + UINT16 Size; + UINT8 Cascade[8]; +} EFI_ACPI_6_6_HT_PIC_STRUCTURE; + +/// +/// Extend I/O Programmable Interrupt Controller +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Version; + UINT8 Cascade; + UINT8 Node; + UINT64 NodeMap; +} EFI_ACPI_6_6_EIO_PIC_STRUCTURE; + +/// +/// MSI Programmable Interrupt Controller +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Version; + UINT64 MsgAddress; + UINT32 Start; + UINT32 Count; +} EFI_ACPI_6_6_MSI_PIC_STRUCTURE; + +/// +/// Bridge I/O Programmable Interrupt Controller +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Version; + UINT64 Address; + UINT16 Size; + UINT16 Id; + UINT16 GsiBase; +} EFI_ACPI_6_6_BIO_PIC_STRUCTURE; + +/// +/// Low Pin Count Programmable Interrupt Controller +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Version; + UINT64 Address; + UINT16 Size; + UINT8 Cascade; +} EFI_ACPI_6_6_LPC_PIC_STRUCTURE; + +/// +/// Smart Battery Description Table (SBST) +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT32 WarningEnergyLevel; + UINT32 LowEnergyLevel; + UINT32 CriticalEnergyLevel; +} EFI_ACPI_6_6_SMART_BATTERY_DESCRIPTION_TABLE; + +/// +/// SBST Version (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_SMART_BATTERY_DESCRIPTION_TABLE_REVISION 0x01 + +/// +/// Embedded Controller Boot Resources Table (ECDT) +/// The table is followed by a null terminated ASCII string that contains +/// a fully qualified reference to the name space object. +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE EcControl; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE EcData; + UINT32 Uid; + UINT8 GpeBit; +} EFI_ACPI_6_6_EMBEDDED_CONTROLLER_BOOT_RESOURCES_TABLE; + +/// +/// ECDT Version (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_EMBEDDED_CONTROLLER_BOOT_RESOURCES_TABLE_REVISION 0x01 + +/// +/// System Resource Affinity Table (SRAT). The rest of the table +/// must be defined in a platform specific manner. +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT32 Reserved1; ///< Must be set to 1 + UINT64 Reserved2; +} EFI_ACPI_6_6_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER; + +/// +/// SRAT Version (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_SYSTEM_RESOURCE_AFFINITY_TABLE_REVISION 0x03 + +// +// SRAT structure types. +// All other values between 0x06 an 0xFF are reserved and +// will be ignored by OSPM. +// +#define EFI_ACPI_6_6_PROCESSOR_LOCAL_APIC_SAPIC_AFFINITY 0x00 +#define EFI_ACPI_6_6_MEMORY_AFFINITY 0x01 +#define EFI_ACPI_6_6_PROCESSOR_LOCAL_X2APIC_AFFINITY 0x02 +#define EFI_ACPI_6_6_GICC_AFFINITY 0x03 +#define EFI_ACPI_6_6_GIC_ITS_AFFINITY 0x04 +#define EFI_ACPI_6_6_GENERIC_INITIATOR_AFFINITY 0x05 + +/// +/// Processor Local APIC/SAPIC Affinity Structure Definition +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 ProximityDomain7To0; + UINT8 ApicId; + UINT32 Flags; + UINT8 LocalSapicEid; + UINT8 ProximityDomain31To8[3]; + UINT32 ClockDomain; +} EFI_ACPI_6_6_PROCESSOR_LOCAL_APIC_SAPIC_AFFINITY_STRUCTURE; + +/// +/// Local APIC/SAPIC Flags. All other bits are reserved and must be 0. +/// +#define EFI_ACPI_6_6_PROCESSOR_LOCAL_APIC_SAPIC_ENABLED (1 << 0) + +/// +/// Memory Affinity Structure Definition +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT32 ProximityDomain; + UINT16 Reserved1; + UINT32 AddressBaseLow; + UINT32 AddressBaseHigh; + UINT32 LengthLow; + UINT32 LengthHigh; + UINT32 Reserved2; + UINT32 Flags; + UINT64 Reserved3; +} EFI_ACPI_6_6_MEMORY_AFFINITY_STRUCTURE; + +// +// Memory Flags. All other bits are reserved and must be 0. +// +#define EFI_ACPI_6_6_MEMORY_ENABLED (1 << 0) +#define EFI_ACPI_6_6_MEMORY_HOT_PLUGGABLE (1 << 1) +#define EFI_ACPI_6_6_MEMORY_NONVOLATILE (1 << 2) + +/// +/// Processor Local x2APIC Affinity Structure Definition +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Reserved1[2]; + UINT32 ProximityDomain; + UINT32 X2ApicId; + UINT32 Flags; + UINT32 ClockDomain; + UINT8 Reserved2[4]; +} EFI_ACPI_6_6_PROCESSOR_LOCAL_X2APIC_AFFINITY_STRUCTURE; + +/// +/// GICC Affinity Structure Definition +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT32 ProximityDomain; + UINT32 AcpiProcessorUid; + UINT32 Flags; + UINT32 ClockDomain; +} EFI_ACPI_6_6_GICC_AFFINITY_STRUCTURE; + +/// +/// GICC Flags. All other bits are reserved and must be 0. +/// +#define EFI_ACPI_6_6_GICC_ENABLED (1 << 0) + +/// +/// GIC Interrupt Translation Service (ITS) Affinity Structure Definition +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT32 ProximityDomain; + UINT8 Reserved[2]; + UINT32 ItsId; +} EFI_ACPI_6_6_GIC_ITS_AFFINITY_STRUCTURE; + +// +// Generic Initiator Affinity Structure Device Handle Types +// All other values between 0x02 an 0xFF are reserved and +// will be ignored by OSPM. +// +#define EFI_ACPI_6_6_ACPI_DEVICE_HANDLE 0x00 +#define EFI_ACPI_6_6_PCI_DEVICE_HANDLE 0x01 + +/// +/// Device Handle - ACPI +/// +typedef struct { + UINT64 AcpiHid; + UINT32 AcpiUid; + UINT8 Reserved[4]; +} EFI_ACPI_6_6_DEVICE_HANDLE_ACPI; + +/// +/// Device Handle - PCI +/// +typedef struct { + UINT16 PciSegment; + UINT16 PciBdfNumber; + UINT8 Reserved[12]; +} EFI_ACPI_6_6_DEVICE_HANDLE_PCI; + +/// +/// Device Handle +/// +typedef union { + EFI_ACPI_6_6_DEVICE_HANDLE_ACPI Acpi; + EFI_ACPI_6_6_DEVICE_HANDLE_PCI Pci; +} EFI_ACPI_6_6_DEVICE_HANDLE; + +/// +/// Generic Initiator Affinity Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Reserved1; + UINT8 DeviceHandleType; + UINT32 ProximityDomain; + EFI_ACPI_6_6_DEVICE_HANDLE DeviceHandle; + UINT32 Flags; + UINT8 Reserved2[4]; +} EFI_ACPI_6_6_GENERIC_INITIATOR_AFFINITY_STRUCTURE; + +/// +/// Generic Initiator Affinity Structure Flags. All other bits are reserved +/// and must be 0. +/// +#define EFI_ACPI_6_6_GENERIC_INITIATOR_AFFINITY_STRUCTURE_ENABLED BIT0 +#define EFI_ACPI_6_6_GENERIC_INITIATOR_AFFINITY_STRUCTURE_ARCHITECTURAL_TRANSACTIONS BIT1 + +/// +/// System Locality Distance Information Table (SLIT). +/// The rest of the table is a matrix. +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT64 NumberOfSystemLocalities; +} EFI_ACPI_6_6_SYSTEM_LOCALITY_DISTANCE_INFORMATION_TABLE_HEADER; + +/// +/// SLIT Version (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_SYSTEM_LOCALITY_DISTANCE_INFORMATION_TABLE_REVISION 0x01 + +/// +/// Corrected Platform Error Polling Table (CPEP) +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT8 Reserved[8]; +} EFI_ACPI_6_6_CORRECTED_PLATFORM_ERROR_POLLING_TABLE_HEADER; + +/// +/// CPEP Version (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_CORRECTED_PLATFORM_ERROR_POLLING_TABLE_REVISION 0x01 + +// +// CPEP processor structure types. +// +#define EFI_ACPI_6_6_CPEP_PROCESSOR_APIC_SAPIC 0x00 + +/// +/// Corrected Platform Error Polling Processor Structure Definition +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 ProcessorId; + UINT8 ProcessorEid; + UINT32 PollingInterval; +} EFI_ACPI_6_6_CPEP_PROCESSOR_APIC_SAPIC_STRUCTURE; + +/// +/// Maximum System Characteristics Table (MSCT) +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT32 OffsetProxDomInfo; + UINT32 MaximumNumberOfProximityDomains; + UINT32 MaximumNumberOfClockDomains; + UINT64 MaximumPhysicalAddress; +} EFI_ACPI_6_6_MAXIMUM_SYSTEM_CHARACTERISTICS_TABLE_HEADER; + +/// +/// MSCT Version (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_MAXIMUM_SYSTEM_CHARACTERISTICS_TABLE_REVISION 0x01 + +/// +/// Maximum Proximity Domain Information Structure Definition +/// +typedef struct { + UINT8 Revision; + UINT8 Length; + UINT32 ProximityDomainRangeLow; + UINT32 ProximityDomainRangeHigh; + UINT32 MaximumProcessorCapacity; + UINT64 MaximumMemoryCapacity; +} EFI_ACPI_6_6_MAXIMUM_PROXIMITY_DOMAIN_INFORMATION_STRUCTURE; + +/// +/// ACPI RAS Feature Table definition. +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT8 PlatformCommunicationChannelIdentifier[12]; +} EFI_ACPI_6_6_RAS_FEATURE_TABLE; + +/// +/// RASF Version (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_RAS_FEATURE_TABLE_REVISION 0x01 + +/// +/// ACPI RASF Platform Communication Channel Shared Memory Region definition. +/// +typedef struct { + UINT32 Signature; + UINT16 Command; + UINT16 Status; + UINT16 Version; + UINT8 RASCapabilities[16]; + UINT8 SetRASCapabilities[16]; + UINT16 NumberOfRASFParameterBlocks; + UINT32 SetRASCapabilitiesStatus; +} EFI_ACPI_6_6_RASF_PLATFORM_COMMUNICATION_CHANNEL_SHARED_MEMORY_REGION; + +/// +/// ACPI RASF PCC command code +/// +#define EFI_ACPI_6_6_RASF_PCC_COMMAND_CODE_EXECUTE_RASF_COMMAND 0x01 + +/// +/// ACPI RASF Platform RAS Capabilities +/// +#define EFI_ACPI_6_6_RASF_PLATFORM_RAS_CAPABILITY_HARDWARE_BASED_PATROL_SCRUB_SUPPORTED BIT0 +#define EFI_ACPI_6_6_RASF_PLATFORM_RAS_CAPABILITY_HARDWARE_BASED_PATROL_SCRUB_SUPPORTED_AND_EXPOSED_TO_SOFTWARE BIT1 +#define EFI_ACPI_6_6_RASF_PLATFORM_RAS_CAPABILITY_CPU_CACHE_FLUSH_TO_NVDIMM_DURABILITY_ON_POWER_LOSS BIT2 +#define EFI_ACPI_6_6_RASF_PLATFORM_RAS_CAPABILITY_MEMORY_CONTROLLER_FLUSH_TO_NVDIMM_DURABILITY_ON_POWER_LOSS BIT3 +#define EFI_ACPI_6_6_RASF_PLATFORM_RAS_CAPABILITY_BYTE_ADDRESSABLE_PERSISTENT_MEMORY_HARDWARE_MIRRORING BIT4 + +/// +/// ACPI RASF Parameter Block structure for PATROL_SCRUB +/// +typedef struct { + UINT16 Type; + UINT16 Version; + UINT16 Length; + UINT16 PatrolScrubCommand; + UINT64 RequestedAddressRange[2]; + UINT64 ActualAddressRange[2]; + UINT16 Flags; + UINT8 RequestedSpeed; +} EFI_ACPI_6_6_RASF_PATROL_SCRUB_PLATFORM_BLOCK_STRUCTURE; + +/// +/// ACPI RASF Patrol Scrub command +/// +#define EFI_ACPI_6_6_RASF_PATROL_SCRUB_COMMAND_GET_PATROL_PARAMETERS 0x01 +#define EFI_ACPI_6_6_RASF_PATROL_SCRUB_COMMAND_START_PATROL_SCRUBBER 0x02 +#define EFI_ACPI_6_6_RASF_PATROL_SCRUB_COMMAND_STOP_PATROL_SCRUBBER 0x03 + +/// +/// ACPI RAS2 Feature Table definition. +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT16 Reserved; + UINT16 PccCount; + // EFI_ACPI_RAS2_PCC_DESCRIPTOR Descriptors[PccCount]; +} EFI_ACPI_6_6_RAS2_FEATURE_TABLE; + +/// +/// Memory Power State Table definition. +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT8 PlatformCommunicationChannelIdentifier; + UINT8 Reserved[3]; + // Memory Power Node Structure + // Memory Power State Characteristics +} EFI_ACPI_6_6_MEMORY_POWER_STATUS_TABLE; + +/// +/// MPST Version (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_MEMORY_POWER_STATE_TABLE_REVISION 0x01 + +/// +/// MPST Platform Communication Channel Shared Memory Region definition. +/// +typedef struct { + UINT32 Signature; + UINT16 Command; + UINT16 Status; + UINT32 MemoryPowerCommandRegister; + UINT32 MemoryPowerStatusRegister; + UINT32 PowerStateId; + UINT32 MemoryPowerNodeId; + UINT64 MemoryEnergyConsumed; + UINT64 ExpectedAveragePowerComsuned; +} EFI_ACPI_6_6_MPST_PLATFORM_COMMUNICATION_CHANNEL_SHARED_MEMORY_REGION; + +/// +/// ACPI MPST PCC command code +/// +#define EFI_ACPI_6_6_MPST_PCC_COMMAND_CODE_EXECUTE_MPST_COMMAND 0x03 + +/// +/// ACPI MPST Memory Power command +/// +#define EFI_ACPI_6_6_MPST_MEMORY_POWER_COMMAND_GET_MEMORY_POWER_STATE 0x01 +#define EFI_ACPI_6_6_MPST_MEMORY_POWER_COMMAND_SET_MEMORY_POWER_STATE 0x02 +#define EFI_ACPI_6_6_MPST_MEMORY_POWER_COMMAND_GET_AVERAGE_POWER_CONSUMED 0x03 +#define EFI_ACPI_6_6_MPST_MEMORY_POWER_COMMAND_GET_MEMORY_ENERGY_CONSUMED 0x04 + +/// +/// MPST Memory Power Node Table +/// +typedef struct { + UINT8 PowerStateValue; + UINT8 PowerStateInformationIndex; +} EFI_ACPI_6_6_MPST_MEMORY_POWER_STATE; + +typedef struct { + UINT8 Flag; + UINT8 Reserved; + UINT16 MemoryPowerNodeId; + UINT32 Length; + UINT64 AddressBase; + UINT64 AddressLength; + UINT32 NumberOfPowerStates; + UINT32 NumberOfPhysicalComponents; + // EFI_ACPI_6_6_MPST_MEMORY_POWER_STATE MemoryPowerState[NumberOfPowerStates]; + // UINT16 PhysicalComponentIdentifier[NumberOfPhysicalComponents]; +} EFI_ACPI_6_6_MPST_MEMORY_POWER_STRUCTURE; + +#define EFI_ACPI_6_6_MPST_MEMORY_POWER_STRUCTURE_FLAG_ENABLE 0x01 +#define EFI_ACPI_6_6_MPST_MEMORY_POWER_STRUCTURE_FLAG_POWER_MANAGED 0x02 +#define EFI_ACPI_6_6_MPST_MEMORY_POWER_STRUCTURE_FLAG_HOT_PLUGGABLE 0x04 + +typedef struct { + UINT16 MemoryPowerNodeCount; + UINT8 Reserved[2]; +} EFI_ACPI_6_6_MPST_MEMORY_POWER_NODE_TABLE; + +/// +/// MPST Memory Power State Characteristics Table +/// +typedef struct { + UINT8 PowerStateStructureID; + UINT8 Flag; + UINT16 Reserved; + UINT32 AveragePowerConsumedInMPS0; + UINT32 RelativePowerSavingToMPS0; + UINT64 ExitLatencyToMPS0; +} EFI_ACPI_6_6_MPST_MEMORY_POWER_STATE_CHARACTERISTICS_STRUCTURE; + +#define EFI_ACPI_6_6_MPST_MEMORY_POWER_STATE_CHARACTERISTICS_STRUCTURE_FLAG_MEMORY_CONTENT_PRESERVED 0x01 +#define EFI_ACPI_6_6_MPST_MEMORY_POWER_STATE_CHARACTERISTICS_STRUCTURE_FLAG_AUTONOMOUS_MEMORY_POWER_STATE_ENTRY 0x02 +#define EFI_ACPI_6_6_MPST_MEMORY_POWER_STATE_CHARACTERISTICS_STRUCTURE_FLAG_AUTONOMOUS_MEMORY_POWER_STATE_EXIT 0x04 + +typedef struct { + UINT16 MemoryPowerStateCharacteristicsCount; + UINT8 Reserved[2]; +} EFI_ACPI_6_6_MPST_MEMORY_POWER_STATE_CHARACTERISTICS_TABLE; + +/// +/// Platform Memory Topology Table definition. +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT32 NumberOfMemoryDevices; + // EFI_ACPI_6_6_PMTT_COMMON_MEMORY_DEVICE MemoryDeviceStructure[NumberOfMemoryDevices]; +} EFI_ACPI_6_6_PLATFORM_MEMORY_TOPOLOGY_TABLE; + +/// +/// PMTT Version (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_MEMORY_TOPOLOGY_TABLE_REVISION 0x02 + +/// +/// Common Memory Device. +/// +typedef struct { + UINT8 Type; + UINT8 Reserved; + UINT16 Length; + UINT16 Flags; + UINT16 Reserved1; + UINT32 NumberOfMemoryDevices; + // UINT8 TypeSpecificData[]; + // EFI_ACPI_6_6_PMTT_COMMON_MEMORY_DEVICE MemoryDeviceStructure[NumberOfMemoryDevices]; +} EFI_ACPI_6_6_PMTT_COMMON_MEMORY_DEVICE; + +/// +/// Memory Device Type. +/// +#define EFI_ACPI_6_6_PMTT_MEMORY_DEVICE_TYPE_SOCKET 0x0 +#define EFI_ACPI_6_6_PMTT_MEMORY_DEVICE_TYPE_MEMORY_CONTROLLER 0x1 +#define EFI_ACPI_6_6_PMTT_MEMORY_DEVICE_TYPE_DIMM 0x2 +#define EFI_ACPI_6_6_PMTT_MEMORY_DEVICE_TYPE_VENDOR_SPECIFIC_TYPE 0xFF + +/// +/// Socket Type Data. +/// +typedef struct { + EFI_ACPI_6_6_PMTT_COMMON_MEMORY_DEVICE CommonMemoryDeviceHeader; + UINT16 SocketIdentifier; + UINT16 Reserved; + // EFI_ACPI_6_6_PMTT_COMMON_MEMORY_DEVICE MemoryDeviceStructure[]; +} EFI_ACPI_6_6_PMTT_SOCKET_TYPE_DATA; + +/// +/// Memory Controller Type Data. +/// +typedef struct { + EFI_ACPI_6_6_PMTT_COMMON_MEMORY_DEVICE CommonMemoryDeviceHeader; + UINT16 MemoryControllerIdentifier; + UINT16 Reserved; + // EFI_ACPI_6_6_PMTT_COMMON_MEMORY_DEVICE MemoryDeviceStructure[]; +} EFI_ACPI_6_6_PMTT_MEMORY_CONTROLLER_TYPE_DATA; + +/// +/// DIMM Type Specific Data. +/// +typedef struct { + EFI_ACPI_6_6_PMTT_COMMON_MEMORY_DEVICE CommonMemoryDeviceHeader; + UINT32 SmbiosHandle; +} EFI_ACPI_6_6_PMTT_DIMM_TYPE_SPECIFIC_DATA; + +/// +/// Vendor Specific Type Data. +/// +typedef struct { + EFI_ACPI_6_6_PMTT_COMMON_MEMORY_DEVICE CommonMemoryDeviceHeader; + UINT8 TypeUuid[16]; + // EFI_ACPI_6_6_PMTT_VENDOR_SPECIFIC_TYPE_DATA VendorSpecificData[]; + // EFI_ACPI_6_6_PMTT_COMMON_MEMORY_DEVICE MemoryDeviceStructure[]; +} EFI_ACPI_6_6_PMTT_VENDOR_SPECIFIC_TYPE_DATA; + +/// +/// Boot Graphics Resource Table definition. +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + /// + /// 2-bytes (16 bit) version ID. This value must be 1. + /// + UINT16 Version; + /// + /// 1-byte status field indicating current status about the table. + /// Bits[7:3] = Reserved (must be zero) + /// Bits[2:1] = Orientation Offset. These bits describe the clockwise + /// degree offset from the image's default orientation. + /// [00] = 0, no offset + /// [01] = 90 + /// [10] = 180 + /// [11] = 270 + /// Bit [0] = Displayed. A one indicates the boot image graphic is + /// displayed. + /// + UINT8 Status; + /// + /// 1-byte enumerated type field indicating format of the image. + /// 0 = Bitmap + /// 1 - 255 Reserved (for future use) + /// + UINT8 ImageType; + /// + /// 8-byte (64 bit) physical address pointing to the firmware's in-memory copy + /// of the image bitmap. + /// + UINT64 ImageAddress; + /// + /// A 4-byte (32-bit) unsigned long describing the display X-offset of the boot image. + /// (X, Y) display offset of the top left corner of the boot image. + /// The top left corner of the display is at offset (0, 0). + /// + UINT32 ImageOffsetX; + /// + /// A 4-byte (32-bit) unsigned long describing the display Y-offset of the boot image. + /// (X, Y) display offset of the top left corner of the boot image. + /// The top left corner of the display is at offset (0, 0). + /// + UINT32 ImageOffsetY; +} EFI_ACPI_6_6_BOOT_GRAPHICS_RESOURCE_TABLE; + +/// +/// BGRT Revision +/// +#define EFI_ACPI_6_6_BOOT_GRAPHICS_RESOURCE_TABLE_REVISION 1 + +/// +/// BGRT Version +/// +#define EFI_ACPI_6_6_BGRT_VERSION 0x01 + +/// +/// BGRT Status +/// +#define EFI_ACPI_6_6_BGRT_STATUS_NOT_DISPLAYED 0x00 +#define EFI_ACPI_6_6_BGRT_STATUS_DISPLAYED 0x01 + +/// +/// BGRT Image Type +/// +#define EFI_ACPI_6_6_BGRT_IMAGE_TYPE_BMP 0x00 + +/// +/// FPDT Version (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_FIRMWARE_PERFORMANCE_DATA_TABLE_REVISION 0x01 + +/// +/// FPDT Performance Record Types +/// +#define EFI_ACPI_6_6_FPDT_RECORD_TYPE_FIRMWARE_BASIC_BOOT_POINTER 0x0000 +#define EFI_ACPI_6_6_FPDT_RECORD_TYPE_S3_PERFORMANCE_TABLE_POINTER 0x0001 + +/// +/// FPDT Performance Record Revision +/// +#define EFI_ACPI_6_6_FPDT_RECORD_REVISION_FIRMWARE_BASIC_BOOT_POINTER 0x01 +#define EFI_ACPI_6_6_FPDT_RECORD_REVISION_S3_PERFORMANCE_TABLE_POINTER 0x01 + +/// +/// FPDT Runtime Performance Record Types +/// +#define EFI_ACPI_6_6_FPDT_RUNTIME_RECORD_TYPE_S3_RESUME 0x0000 +#define EFI_ACPI_6_6_FPDT_RUNTIME_RECORD_TYPE_S3_SUSPEND 0x0001 +#define EFI_ACPI_6_6_FPDT_RUNTIME_RECORD_TYPE_FIRMWARE_BASIC_BOOT 0x0002 + +/// +/// FPDT Runtime Performance Record Revision +/// +#define EFI_ACPI_6_6_FPDT_RUNTIME_RECORD_REVISION_S3_RESUME 0x01 +#define EFI_ACPI_6_6_FPDT_RUNTIME_RECORD_REVISION_S3_SUSPEND 0x01 +#define EFI_ACPI_6_6_FPDT_RUNTIME_RECORD_REVISION_FIRMWARE_BASIC_BOOT 0x02 + +/// +/// FPDT Performance Record header +/// +typedef struct { + UINT16 Type; + UINT8 Length; + UINT8 Revision; +} EFI_ACPI_6_6_FPDT_PERFORMANCE_RECORD_HEADER; + +/// +/// FPDT Performance Table header +/// +typedef struct { + UINT32 Signature; + UINT32 Length; +} EFI_ACPI_6_6_FPDT_PERFORMANCE_TABLE_HEADER; + +/// +/// FPDT Firmware Basic Boot Performance Pointer Record Structure +/// +typedef struct { + EFI_ACPI_6_6_FPDT_PERFORMANCE_RECORD_HEADER Header; + UINT32 Reserved; + /// + /// 64-bit processor-relative physical address of the Basic Boot Performance Table. + /// + UINT64 BootPerformanceTablePointer; +} EFI_ACPI_6_6_FPDT_BOOT_PERFORMANCE_TABLE_POINTER_RECORD; + +/// +/// FPDT S3 Performance Table Pointer Record Structure +/// +typedef struct { + EFI_ACPI_6_6_FPDT_PERFORMANCE_RECORD_HEADER Header; + UINT32 Reserved; + /// + /// 64-bit processor-relative physical address of the S3 Performance Table. + /// + UINT64 S3PerformanceTablePointer; +} EFI_ACPI_6_6_FPDT_S3_PERFORMANCE_TABLE_POINTER_RECORD; + +/// +/// FPDT Firmware Basic Boot Performance Record Structure +/// +typedef struct { + EFI_ACPI_6_6_FPDT_PERFORMANCE_RECORD_HEADER Header; + UINT32 Reserved; + /// + /// Timer value logged at the beginning of firmware image execution. + /// This may not always be zero or near zero. + /// + UINT64 ResetEnd; + /// + /// Timer value logged just prior to loading the OS boot loader into memory. + /// For non-UEFI compatible boots, this field must be zero. + /// + UINT64 OsLoaderLoadImageStart; + /// + /// Timer value logged just prior to launching the previously loaded OS boot loader image. + /// For non-UEFI compatible boots, the timer value logged will be just prior + /// to the INT 19h handler invocation. + /// + UINT64 OsLoaderStartImageStart; + /// + /// Timer value logged at the point when the OS loader calls the + /// ExitBootServices function for UEFI compatible firmware. + /// For non-UEFI compatible boots, this field must be zero. + /// + UINT64 ExitBootServicesEntry; + /// + /// Timer value logged at the point just prior towhen the OS loader gaining + /// control back from calls the ExitBootServices function for UEFI compatible firmware. + /// For non-UEFI compatible boots, this field must be zero. + /// + UINT64 ExitBootServicesExit; +} EFI_ACPI_6_6_FPDT_FIRMWARE_BASIC_BOOT_RECORD; + +/// +/// FPDT Firmware Basic Boot Performance Table signature +/// +#define EFI_ACPI_6_6_FPDT_BOOT_PERFORMANCE_TABLE_SIGNATURE SIGNATURE_32('F', 'B', 'P', 'T') + +// +// FPDT Firmware Basic Boot Performance Table +// +typedef struct { + EFI_ACPI_6_6_FPDT_PERFORMANCE_TABLE_HEADER Header; + // + // one or more Performance Records. + // +} EFI_ACPI_6_6_FPDT_FIRMWARE_BASIC_BOOT_TABLE; + +/// +/// FPDT "S3PT" S3 Performance Table +/// +#define EFI_ACPI_6_6_FPDT_S3_PERFORMANCE_TABLE_SIGNATURE SIGNATURE_32('S', '3', 'P', 'T') + +// +// FPDT Firmware S3 Boot Performance Table +// +typedef struct { + EFI_ACPI_6_6_FPDT_PERFORMANCE_TABLE_HEADER Header; + // + // one or more Performance Records. + // +} EFI_ACPI_6_6_FPDT_FIRMWARE_S3_BOOT_TABLE; + +/// +/// FPDT Basic S3 Resume Performance Record +/// +typedef struct { + EFI_ACPI_6_6_FPDT_PERFORMANCE_RECORD_HEADER Header; + /// + /// A count of the number of S3 resume cycles since the last full boot sequence. + /// + UINT32 ResumeCount; + /// + /// Timer recorded at the end of BIOS S3 resume, just prior to handoff to the + /// OS waking vector. Only the most recent resume cycle's time is retained. + /// + UINT64 FullResume; + /// + /// Average timer value of all resume cycles logged since the last full boot + /// sequence, including the most recent resume. Note that the entire log of + /// timer values does not need to be retained in order to calculate this average. + /// + UINT64 AverageResume; +} EFI_ACPI_6_6_FPDT_S3_RESUME_RECORD; + +/// +/// FPDT Basic S3 Suspend Performance Record +/// +typedef struct { + EFI_ACPI_6_6_FPDT_PERFORMANCE_RECORD_HEADER Header; + /// + /// Timer value recorded at the OS write to SLP_TYP upon entry to S3. + /// Only the most recent suspend cycle's timer value is retained. + /// + UINT64 SuspendStart; + /// + /// Timer value recorded at the final firmware write to SLP_TYP (or other + /// mechanism) used to trigger hardware entry to S3. + /// Only the most recent suspend cycle's timer value is retained. + /// + UINT64 SuspendEnd; +} EFI_ACPI_6_6_FPDT_S3_SUSPEND_RECORD; + +/// +/// Firmware Performance Record Table definition. +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; +} EFI_ACPI_6_6_FIRMWARE_PERFORMANCE_RECORD_TABLE; + +/// +/// Generic Timer Description Table definition. +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT64 CntControlBasePhysicalAddress; + UINT32 Reserved; + UINT32 SecurePL1TimerGSIV; + UINT32 SecurePL1TimerFlags; + UINT32 NonSecurePL1TimerGSIV; + UINT32 NonSecurePL1TimerFlags; + UINT32 VirtualTimerGSIV; + UINT32 VirtualTimerFlags; + UINT32 NonSecurePL2TimerGSIV; + UINT32 NonSecurePL2TimerFlags; + UINT64 CntReadBasePhysicalAddress; + UINT32 PlatformTimerCount; + UINT32 PlatformTimerOffset; + UINT32 VirtualPL2TimerGSIV; + UINT32 VirtualPL2TimerFlags; +} EFI_ACPI_6_6_GENERIC_TIMER_DESCRIPTION_TABLE; + +/// +/// GTDT Version (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_GENERIC_TIMER_DESCRIPTION_TABLE_REVISION 0x03 + +/// +/// Timer Flags. All other bits are reserved and must be 0. +/// +#define EFI_ACPI_6_6_GTDT_TIMER_FLAG_TIMER_INTERRUPT_MODE BIT0 +#define EFI_ACPI_6_6_GTDT_TIMER_FLAG_TIMER_INTERRUPT_POLARITY BIT1 +#define EFI_ACPI_6_6_GTDT_TIMER_FLAG_ALWAYS_ON_CAPABILITY BIT2 + +/// +/// Platform Timer Type +/// +#define EFI_ACPI_6_6_GTDT_GT_BLOCK 0 +#define EFI_ACPI_6_6_GTDT_ARM_GENERIC_WATCHDOG 1 + +/// +/// GT Block Structure +/// +typedef struct { + UINT8 Type; + UINT16 Length; + UINT8 Reserved; + UINT64 CntCtlBase; + UINT32 GTBlockTimerCount; + UINT32 GTBlockTimerOffset; +} EFI_ACPI_6_6_GTDT_GT_BLOCK_STRUCTURE; + +/// +/// GT Block Timer Structure +/// +typedef struct { + UINT8 GTFrameNumber; + UINT8 Reserved[3]; + UINT64 CntBaseX; + UINT64 CntEL0BaseX; + UINT32 GTxPhysicalTimerGSIV; + UINT32 GTxPhysicalTimerFlags; + UINT32 GTxVirtualTimerGSIV; + UINT32 GTxVirtualTimerFlags; + UINT32 GTxCommonFlags; +} EFI_ACPI_6_6_GTDT_GT_BLOCK_TIMER_STRUCTURE; + +/// +/// GT Block Physical Timers and Virtual Timers Flags. All other bits are reserved and must be 0. +/// +#define EFI_ACPI_6_6_GTDT_GT_BLOCK_TIMER_FLAG_TIMER_INTERRUPT_MODE BIT0 +#define EFI_ACPI_6_6_GTDT_GT_BLOCK_TIMER_FLAG_TIMER_INTERRUPT_POLARITY BIT1 + +/// +/// Common Flags Flags. All other bits are reserved and must be 0. +/// +#define EFI_ACPI_6_6_GTDT_GT_BLOCK_COMMON_FLAG_SECURE_TIMER BIT0 +#define EFI_ACPI_6_6_GTDT_GT_BLOCK_COMMON_FLAG_ALWAYS_ON_CAPABILITY BIT1 + +/// +/// Arm Generic Watchdog Structure +/// +typedef struct { + UINT8 Type; + UINT16 Length; + UINT8 Reserved; + UINT64 RefreshFramePhysicalAddress; + UINT64 WatchdogControlFramePhysicalAddress; + UINT32 WatchdogTimerGSIV; + UINT32 WatchdogTimerFlags; +} EFI_ACPI_6_6_GTDT_ARM_GENERIC_WATCHDOG_STRUCTURE; + +/// +/// Arm Generic Watchdog Timer Flags. All other bits are reserved and must be 0. +/// +#define EFI_ACPI_6_6_GTDT_ARM_GENERIC_WATCHDOG_FLAG_TIMER_INTERRUPT_MODE BIT0 +#define EFI_ACPI_6_6_GTDT_ARM_GENERIC_WATCHDOG_FLAG_TIMER_INTERRUPT_POLARITY BIT1 +#define EFI_ACPI_6_6_GTDT_ARM_GENERIC_WATCHDOG_FLAG_SECURE_TIMER BIT2 + +// +// NVDIMM Firmware Interface Table definition. +// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT32 Reserved; +} EFI_ACPI_6_6_NVDIMM_FIRMWARE_INTERFACE_TABLE; + +// +// NFIT Version (as defined in ACPI 6.6 spec.) +// +#define EFI_ACPI_6_6_NVDIMM_FIRMWARE_INTERFACE_TABLE_REVISION 0x1 + +// +// Definition for NFIT Table Structure Types +// +#define EFI_ACPI_6_6_NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE_STRUCTURE_TYPE 0 +#define EFI_ACPI_6_6_NFIT_NVDIMM_REGION_MAPPING_STRUCTURE_TYPE 1 +#define EFI_ACPI_6_6_NFIT_INTERLEAVE_STRUCTURE_TYPE 2 +#define EFI_ACPI_6_6_NFIT_SMBIOS_MANAGEMENT_INFORMATION_STRUCTURE_TYPE 3 +#define EFI_ACPI_6_6_NFIT_NVDIMM_CONTROL_REGION_STRUCTURE_TYPE 4 +#define EFI_ACPI_6_6_NFIT_NVDIMM_BLOCK_DATA_WINDOW_REGION_STRUCTURE_TYPE 5 +#define EFI_ACPI_6_6_NFIT_FLUSH_HINT_ADDRESS_STRUCTURE_TYPE 6 +#define EFI_ACPI_6_6_NFIT_PLATFORM_CAPABILITIES_STRUCTURE_TYPE 7 + +// +// Definition for NFIT Structure Header +// +typedef struct { + UINT16 Type; + UINT16 Length; +} EFI_ACPI_6_6_NFIT_STRUCTURE_HEADER; + +// +// Definition for System Physical Address Range Structure +// +#define EFI_ACPI_6_6_NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE_FLAGS_CONTROL_REGION_FOR_MANAGEMENT BIT0 +#define EFI_ACPI_6_6_NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE_FLAGS_PROXIMITY_DOMAIN_VALID BIT1 +#define EFI_ACPI_6_6_NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE_FLAGS_SPA_LOCATION_COOKIE_VALID BIT2 + +#define EFI_ACPI_6_6_NFIT_GUID_VOLATILE_MEMORY_REGION { 0x7305944F, 0xFDDA, 0x44E3, { 0xB1, 0x6C, 0x3F, 0x22, 0xD2, 0x52, 0xE5, 0xD0 }} +#define EFI_ACPI_6_6_NFIT_GUID_BYTE_ADDRESSABLE_PERSISTENT_MEMORY_REGION { 0x66F0D379, 0xB4F3, 0x4074, { 0xAC, 0x43, 0x0D, 0x33, 0x18, 0xB7, 0x8C, 0xDB }} +#define EFI_ACPI_6_6_NFIT_GUID_NVDIMM_CONTROL_REGION { 0x92F701F6, 0x13B4, 0x405D, { 0x91, 0x0B, 0x29, 0x93, 0x67, 0xE8, 0x23, 0x4C }} +#define EFI_ACPI_6_6_NFIT_GUID_NVDIMM_BLOCK_DATA_WINDOW_REGION { 0x91AF0530, 0x5D86, 0x470E, { 0xA6, 0xB0, 0x0A, 0x2D, 0xB9, 0x40, 0x82, 0x49 }} +#define EFI_ACPI_6_6_NFIT_GUID_RAM_DISK_SUPPORTING_VIRTUAL_DISK_REGION_VOLATILE { 0x77AB535A, 0x45FC, 0x624B, { 0x55, 0x60, 0xF7, 0xB2, 0x81, 0xD1, 0xF9, 0x6E }} +#define EFI_ACPI_6_6_NFIT_GUID_RAM_DISK_SUPPORTING_VIRTUAL_CD_REGION_VOLATILE { 0x3D5ABD30, 0x4175, 0x87CE, { 0x6D, 0x64, 0xD2, 0xAD, 0xE5, 0x23, 0xC4, 0xBB }} +#define EFI_ACPI_6_6_NFIT_GUID_RAM_DISK_SUPPORTING_VIRTUAL_DISK_REGION_PERSISTENT { 0x5CEA02C9, 0x4D07, 0x69D3, { 0x26, 0x9F ,0x44, 0x96, 0xFB, 0xE0, 0x96, 0xF9 }} +#define EFI_ACPI_6_6_NFIT_GUID_RAM_DISK_SUPPORTING_VIRTUAL_CD_REGION_PERSISTENT { 0x08018188, 0x42CD, 0xBB48, { 0x10, 0x0F, 0x53, 0x87, 0xD5, 0x3D, 0xED, 0x3D }} + +typedef struct { + UINT16 Type; + UINT16 Length; + UINT16 SPARangeStructureIndex; + UINT16 Flags; + UINT32 Reserved_8; + UINT32 ProximityDomain; + GUID AddressRangeTypeGUID; + UINT64 SystemPhysicalAddressRangeBase; + UINT64 SystemPhysicalAddressRangeLength; + UINT64 AddressRangeMemoryMappingAttribute; + UINT64 SPALocationCookie; +} EFI_ACPI_6_6_NFIT_SYSTEM_PHYSICAL_ADDRESS_RANGE_STRUCTURE; + +// +// Definition for Memory Device to System Physical Address Range Mapping Structure +// +typedef struct { + UINT32 DIMMNumber : 4; + UINT32 MemoryChannelNumber : 4; + UINT32 MemoryControllerID : 4; + UINT32 SocketID : 4; + UINT32 NodeControllerID : 12; + UINT32 Reserved_28 : 4; +} EFI_ACPI_6_6_NFIT_DEVICE_HANDLE; + +#define EFI_ACPI_6_6_NFIT_MEMORY_DEVICE_STATE_FLAGS_PREVIOUS_SAVE_FAIL BIT0 +#define EFI_ACPI_6_6_NFIT_MEMORY_DEVICE_STATE_FLAGS_LAST_RESTORE_FAIL BIT1 +#define EFI_ACPI_6_6_NFIT_MEMORY_DEVICE_STATE_FLAGS_PLATFORM_FLUSH_FAIL BIT2 +#define EFI_ACPI_6_6_NFIT_MEMORY_DEVICE_STATE_FLAGS_NOT_ARMED_PRIOR_TO_OSPM_HAND_OFF BIT3 +#define EFI_ACPI_6_6_NFIT_MEMORY_DEVICE_STATE_FLAGS_SMART_HEALTH_EVENTS_PRIOR_OSPM_HAND_OFF BIT4 +#define EFI_ACPI_6_6_NFIT_MEMORY_DEVICE_STATE_FLAGS_FIRMWARE_ENABLED_TO_NOTIFY_OSPM_ON_SMART_HEALTH_EVENTS BIT5 +#define EFI_ACPI_6_6_NFIT_MEMORY_DEVICE_STATE_FLAGS_FIRMWARE_NOT_MAP_NVDIMM_TO_SPA BIT6 + +typedef struct { + UINT16 Type; + UINT16 Length; + EFI_ACPI_6_6_NFIT_DEVICE_HANDLE NFITDeviceHandle; + UINT16 NVDIMMPhysicalID; + UINT16 NVDIMMRegionID; + UINT16 SPARangeStructureIndex; + UINT16 NVDIMMControlRegionStructureIndex; + UINT64 NVDIMMRegionSize; + UINT64 RegionOffset; + UINT64 NVDIMMPhysicalAddressRegionBase; + UINT16 InterleaveStructureIndex; + UINT16 InterleaveWays; + UINT16 NVDIMMStateFlags; + UINT16 Reserved_46; +} EFI_ACPI_6_6_NFIT_NVDIMM_REGION_MAPPING_STRUCTURE; + +// +// Definition for Interleave Structure +// +typedef struct { + UINT16 Type; + UINT16 Length; + UINT16 InterleaveStructureIndex; + UINT16 Reserved_6; + UINT32 NumberOfLines; + UINT32 LineSize; + // UINT32 LineOffset[NumberOfLines]; +} EFI_ACPI_6_6_NFIT_INTERLEAVE_STRUCTURE; + +// +// Definition for SMBIOS Management Information Structure +// +typedef struct { + UINT16 Type; + UINT16 Length; + UINT32 Reserved_4; + // UINT8 Data[]; +} EFI_ACPI_6_6_NFIT_SMBIOS_MANAGEMENT_INFORMATION_STRUCTURE; + +// +// Definition for NVDIMM Control Region Structure +// +#define EFI_ACPI_6_6_NFIT_NVDIMM_CONTROL_REGION_VALID_FIELDS_MANUFACTURING BIT0 + +#define EFI_ACPI_6_6_NFIT_NVDIMM_CONTROL_REGION_FLAGS_BLOCK_DATA_WINDOWS_BUFFERED BIT0 + +typedef struct { + UINT16 Type; + UINT16 Length; + UINT16 NVDIMMControlRegionStructureIndex; + UINT16 VendorID; + UINT16 DeviceID; + UINT16 RevisionID; + UINT16 SubsystemVendorID; + UINT16 SubsystemDeviceID; + UINT16 SubsystemRevisionID; + UINT8 ValidFields; + UINT8 ManufacturingLocation; + UINT16 ManufacturingDate; + UINT8 Reserved_22[2]; + UINT32 SerialNumber; + UINT16 RegionFormatInterfaceCode; + UINT16 NumberOfBlockControlWindows; + UINT64 SizeOfBlockControlWindow; + UINT64 CommandRegisterOffsetInBlockControlWindow; + UINT64 SizeOfCommandRegisterInBlockControlWindows; + UINT64 StatusRegisterOffsetInBlockControlWindow; + UINT64 SizeOfStatusRegisterInBlockControlWindows; + UINT16 NVDIMMControlRegionFlag; + UINT8 Reserved_74[6]; +} EFI_ACPI_6_6_NFIT_NVDIMM_CONTROL_REGION_STRUCTURE; + +// +// Definition for NVDIMM Block Data Window Region Structure +// +typedef struct { + UINT16 Type; + UINT16 Length; + UINT16 NVDIMMControlRegionStructureIndex; + UINT16 NumberOfBlockDataWindows; + UINT64 BlockDataWindowStartOffset; + UINT64 SizeOfBlockDataWindow; + UINT64 BlockAccessibleMemoryCapacity; + UINT64 BeginningAddressOfFirstBlockInBlockAccessibleMemory; +} EFI_ACPI_6_6_NFIT_NVDIMM_BLOCK_DATA_WINDOW_REGION_STRUCTURE; + +// +// Definition for Flush Hint Address Structure +// +typedef struct { + UINT16 Type; + UINT16 Length; + EFI_ACPI_6_6_NFIT_DEVICE_HANDLE NFITDeviceHandle; + UINT16 NumberOfFlushHintAddresses; + UINT8 Reserved_10[6]; + // UINT64 FlushHintAddress[NumberOfFlushHintAddresses]; +} EFI_ACPI_6_6_NFIT_FLUSH_HINT_ADDRESS_STRUCTURE; + +// +// Definition for Platform Capabilities Structure +// +typedef struct { + UINT16 Type; + UINT16 Length; + UINT8 HighestValidCapability; + UINT8 Reserved_5[3]; + UINT32 Capabilities; + UINT8 Reserved_12[4]; +} EFI_ACPI_6_6_NFIT_PLATFORM_CAPABILITIES_STRUCTURE; + +#define EFI_ACPI_6_6_NFIT_PLATFORM_CAPABILITY_CPU_CACHE_FLUSH_TO_NVDIMM_DURABILITY_ON_POWER_LOSS BIT0 +#define EFI_ACPI_6_6_NFIT_PLATFORM_CAPABILITY_MEMORY_CONTROLLER_FLUSH_TO_NVDIMM_DURABILITY_ON_POWER_LOSS BIT1 +#define EFI_ACPI_6_6_NFIT_PLATFORM_CAPABILITY_BYTE_ADDRESSABLE_PERSISTENT_MEMORY_HARDWARE_MIRRORING BIT2 + +/// +/// Secure DEVices Table (SDEV) +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; +} EFI_ACPI_6_6_SECURE_DEVICES_TABLE_HEADER; + +/// +/// SDEV Revision (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_SECURE_DEVICES_TABLE_REVISION 0x01 + +/// +/// Secure Device types +/// +#define EFI_ACPI_6_6_SDEV_TYPE_ACPI_NAMESPACE_DEVICE 0x00 +#define EFI_ACPI_6_6_SDEV_TYPE_PCIE_ENDPOINT_DEVICE 0x01 + +/// +/// Secure Device flags +/// +#define EFI_ACPI_6_6_SDEV_FLAG_ALLOW_HANDOFF BIT0 +#define EFI_ACPI_6_6_SDEV_FLAG_SECURE_ACCESS_COMPONENTS_PRESENT BIT1 + +/// +/// SDEV Structure Header +/// +typedef struct { + UINT8 Type; + UINT8 Flags; + UINT16 Length; +} EFI_ACPI_6_6_SDEV_STRUCTURE_HEADER; + +/// +/// ACPI_NAMESPACE_DEVICE based Secure Device Structure +/// +typedef struct { + EFI_ACPI_6_6_SDEV_STRUCTURE_HEADER Header; + UINT16 DeviceIdentifierOffset; + UINT16 DeviceIdentifierLength; + UINT16 VendorSpecificDataOffset; + UINT16 VendorSpecificDataLength; + UINT16 SecureAccessComponentsOffset; + UINT16 SecureAccessComponentsLength; +} EFI_ACPI_6_6_SDEV_STRUCTURE_ACPI_NAMESPACE_DEVICE; + +/// +/// Secure Access Component Types +/// +#define EFI_ACPI_6_6_SDEV_SECURE_ACCESS_COMPONENT_TYPE_IDENTIFICATION 0x00 +#define EFI_ACPI_6_6_SDEV_SECURE_ACCESS_COMPONENT_TYPE_MEMORY 0x01 + +/// +/// Identification Based Secure Access Component +/// +typedef struct { + EFI_ACPI_6_6_SDEV_STRUCTURE_HEADER Header; + UINT16 HardwareIdentifierOffset; + UINT16 HardwareIdentifierLength; + UINT16 SubsystemIdentifierOffset; + UINT16 SubsystemIdentifierLength; + UINT16 HardwareRevision; + UINT8 HardwareRevisionPresent; + UINT8 ClassCodePresent; + UINT8 PciCompatibleBaseClass; + UINT8 PciCompatibleSubClass; + UINT8 PciCompatibleProgrammingInterface; +} EFI_ACPI_6_6_SDEV_SECURE_ACCESS_COMPONENT_IDENTIFICATION_STRUCTURE; + +/// +/// Memory-based Secure Access Component +/// +typedef struct { + EFI_ACPI_6_6_SDEV_STRUCTURE_HEADER Header; + UINT32 Reserved; + UINT64 MemoryAddressBase; + UINT64 MemoryLength; +} EFI_ACPI_6_6_SDEV_SECURE_ACCESS_COMPONENT_MEMORY_STRUCTURE; + +/// +/// PCIe Endpoint Device based Secure Device Structure +/// +typedef struct { + EFI_ACPI_6_6_SDEV_STRUCTURE_HEADER Header; + UINT16 PciSegmentNumber; + UINT16 StartBusNumber; + UINT16 PciPathOffset; + UINT16 PciPathLength; + UINT16 VendorSpecificDataOffset; + UINT16 VendorSpecificDataLength; +} EFI_ACPI_6_6_SDEV_STRUCTURE_PCIE_ENDPOINT_DEVICE; + +/// +/// Boot Error Record Table (BERT) +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT32 BootErrorRegionLength; + UINT64 BootErrorRegion; +} EFI_ACPI_6_6_BOOT_ERROR_RECORD_TABLE_HEADER; + +/// +/// BERT Version (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_BOOT_ERROR_RECORD_TABLE_REVISION 0x01 + +/// +/// Boot Error Region Block Status Definition +/// +typedef struct { + UINT32 UncorrectableErrorValid : 1; + UINT32 CorrectableErrorValid : 1; + UINT32 MultipleUncorrectableErrors : 1; + UINT32 MultipleCorrectableErrors : 1; + UINT32 ErrorDataEntryCount : 10; + UINT32 Reserved : 18; +} EFI_ACPI_6_6_ERROR_BLOCK_STATUS; + +/// +/// Boot Error Region Definition +/// +typedef struct { + EFI_ACPI_6_6_ERROR_BLOCK_STATUS BlockStatus; + UINT32 RawDataOffset; + UINT32 RawDataLength; + UINT32 DataLength; + UINT32 ErrorSeverity; +} EFI_ACPI_6_6_BOOT_ERROR_REGION_STRUCTURE; + +// +// Boot Error Severity types +// +#define EFI_ACPI_6_6_ERROR_SEVERITY_RECOVERABLE 0x00 +#define EFI_ACPI_6_6_ERROR_SEVERITY_FATAL 0x01 +#define EFI_ACPI_6_6_ERROR_SEVERITY_CORRECTED 0x02 +#define EFI_ACPI_6_6_ERROR_SEVERITY_NONE 0x03 +// +// The term 'Correctable' is no longer being used as an error severity of the +// reported error since ACPI Specification Version 5.1 Errata B. +// The below macro is considered as deprecated and should no longer be used. +// +#define EFI_ACPI_6_6_ERROR_SEVERITY_CORRECTABLE 0x00 + +/// +/// Generic Error Data Entry Definition +/// +typedef struct { + UINT8 SectionType[16]; + UINT32 ErrorSeverity; + UINT16 Revision; + UINT8 ValidationBits; + UINT8 Flags; + UINT32 ErrorDataLength; + UINT8 FruId[16]; + UINT8 FruText[20]; + UINT8 Timestamp[8]; +} EFI_ACPI_6_6_GENERIC_ERROR_DATA_ENTRY_STRUCTURE; + +/// +/// Generic Error Data Entry Version (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_GENERIC_ERROR_DATA_ENTRY_REVISION 0x0300 + +/// +/// HEST - Hardware Error Source Table +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT32 ErrorSourceCount; +} EFI_ACPI_6_6_HARDWARE_ERROR_SOURCE_TABLE_HEADER; + +/// +/// HEST Version (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_HARDWARE_ERROR_SOURCE_TABLE_REVISION 0x02 + +// +// Error Source structure types. +// +#define EFI_ACPI_6_6_IA32_ARCHITECTURE_MACHINE_CHECK_EXCEPTION 0x00 +#define EFI_ACPI_6_6_IA32_ARCHITECTURE_CORRECTED_MACHINE_CHECK 0x01 +#define EFI_ACPI_6_6_IA32_ARCHITECTURE_NMI_ERROR 0x02 +#define EFI_ACPI_6_6_PCI_EXPRESS_ROOT_PORT_AER 0x06 +#define EFI_ACPI_6_6_PCI_EXPRESS_DEVICE_AER 0x07 +#define EFI_ACPI_6_6_PCI_EXPRESS_BRIDGE_AER 0x08 +#define EFI_ACPI_6_6_GENERIC_HARDWARE_ERROR 0x09 +#define EFI_ACPI_6_6_GENERIC_HARDWARE_ERROR_VERSION_2 0x0A +#define EFI_ACPI_6_6_IA32_ARCHITECTURE_DEFERRED_MACHINE_CHECK 0x0B + +// +// Error Source structure flags. +// +#define EFI_ACPI_6_6_ERROR_SOURCE_FLAG_FIRMWARE_FIRST (1 << 0) +#define EFI_ACPI_6_6_ERROR_SOURCE_FLAG_GLOBAL (1 << 1) +#define EFI_ACPI_6_6_ERROR_SOURCE_FLAG_GHES_ASSIST (1 << 2) + +/// +/// IA-32 Architecture Machine Check Exception Structure Definition +/// +typedef struct { + UINT16 Type; + UINT16 SourceId; + UINT8 Reserved0[2]; + UINT8 Flags; + UINT8 Enabled; + UINT32 NumberOfRecordsToPreAllocate; + UINT32 MaxSectionsPerRecord; + UINT64 GlobalCapabilityInitData; + UINT64 GlobalControlInitData; + UINT8 NumberOfHardwareBanks; + UINT8 Reserved1[7]; +} EFI_ACPI_6_6_IA32_ARCHITECTURE_MACHINE_CHECK_EXCEPTION_STRUCTURE; + +/// +/// IA-32 Architecture Machine Check Bank Structure Definition +/// +typedef struct { + UINT8 BankNumber; + UINT8 ClearStatusOnInitialization; + UINT8 StatusDataFormat; + UINT8 Reserved0; + UINT32 ControlRegisterMsrAddress; + UINT64 ControlInitData; + UINT32 StatusRegisterMsrAddress; + UINT32 AddressRegisterMsrAddress; + UINT32 MiscRegisterMsrAddress; +} EFI_ACPI_6_6_IA32_ARCHITECTURE_MACHINE_CHECK_ERROR_BANK_STRUCTURE; + +/// +/// IA-32 Architecture Machine Check Bank Structure MCA data format +/// +#define EFI_ACPI_6_6_IA32_ARCHITECTURE_MACHINE_CHECK_ERROR_DATA_FORMAT_IA32 0x00 +#define EFI_ACPI_6_6_IA32_ARCHITECTURE_MACHINE_CHECK_ERROR_DATA_FORMAT_INTEL64 0x01 +#define EFI_ACPI_6_6_IA32_ARCHITECTURE_MACHINE_CHECK_ERROR_DATA_FORMAT_AMD64 0x02 + +// +// Hardware Error Notification types. All other values are reserved +// +#define EFI_ACPI_6_6_HARDWARE_ERROR_NOTIFICATION_POLLED 0x00 +#define EFI_ACPI_6_6_HARDWARE_ERROR_NOTIFICATION_EXTERNAL_INTERRUPT 0x01 +#define EFI_ACPI_6_6_HARDWARE_ERROR_NOTIFICATION_LOCAL_INTERRUPT 0x02 +#define EFI_ACPI_6_6_HARDWARE_ERROR_NOTIFICATION_SCI 0x03 +#define EFI_ACPI_6_6_HARDWARE_ERROR_NOTIFICATION_NMI 0x04 +#define EFI_ACPI_6_6_HARDWARE_ERROR_NOTIFICATION_CMCI 0x05 +#define EFI_ACPI_6_6_HARDWARE_ERROR_NOTIFICATION_MCE 0x06 +#define EFI_ACPI_6_6_HARDWARE_ERROR_NOTIFICATION_GPIO_SIGNAL 0x07 +#define EFI_ACPI_6_6_HARDWARE_ERROR_NOTIFICATION_ARMV8_SEA 0x08 +#define EFI_ACPI_6_6_HARDWARE_ERROR_NOTIFICATION_ARMV8_SEI 0x09 +#define EFI_ACPI_6_6_HARDWARE_ERROR_NOTIFICATION_GSIV 0x0A +#define EFI_ACPI_6_6_HARDWARE_ERROR_NOTIFICATION_SOFTWARE_DELEGATED_EXCEPTION 0x0B + +/// +/// Hardware Error Notification Configuration Write Enable Structure Definition +/// +typedef struct { + UINT16 Type : 1; + UINT16 PollInterval : 1; + UINT16 SwitchToPollingThresholdValue : 1; + UINT16 SwitchToPollingThresholdWindow : 1; + UINT16 ErrorThresholdValue : 1; + UINT16 ErrorThresholdWindow : 1; + UINT16 Reserved : 10; +} EFI_ACPI_6_6_HARDWARE_ERROR_NOTIFICATION_CONFIGURATION_WRITE_ENABLE_STRUCTURE; + +/// +/// Hardware Error Notification Structure Definition +/// +typedef struct { + UINT8 Type; + UINT8 Length; + EFI_ACPI_6_6_HARDWARE_ERROR_NOTIFICATION_CONFIGURATION_WRITE_ENABLE_STRUCTURE ConfigurationWriteEnable; + UINT32 PollInterval; + UINT32 Vector; + UINT32 SwitchToPollingThresholdValue; + UINT32 SwitchToPollingThresholdWindow; + UINT32 ErrorThresholdValue; + UINT32 ErrorThresholdWindow; +} EFI_ACPI_6_6_HARDWARE_ERROR_NOTIFICATION_STRUCTURE; + +/// +/// IA-32 Architecture Corrected Machine Check Structure Definition +/// +typedef struct { + UINT16 Type; + UINT16 SourceId; + UINT8 Reserved0[2]; + UINT8 Flags; + UINT8 Enabled; + UINT32 NumberOfRecordsToPreAllocate; + UINT32 MaxSectionsPerRecord; + EFI_ACPI_6_6_HARDWARE_ERROR_NOTIFICATION_STRUCTURE NotificationStructure; + UINT8 NumberOfHardwareBanks; + UINT8 Reserved1[3]; +} EFI_ACPI_6_6_IA32_ARCHITECTURE_CORRECTED_MACHINE_CHECK_STRUCTURE; + +/// +/// IA-32 Architecture NMI Error Structure Definition +/// +typedef struct { + UINT16 Type; + UINT16 SourceId; + UINT8 Reserved0[2]; + UINT32 NumberOfRecordsToPreAllocate; + UINT32 MaxSectionsPerRecord; + UINT32 MaxRawDataLength; +} EFI_ACPI_6_6_IA32_ARCHITECTURE_NMI_ERROR_STRUCTURE; + +/// +/// PCI Express Root Port AER Structure Definition +/// +typedef struct { + UINT16 Type; + UINT16 SourceId; + UINT8 Reserved0[2]; + UINT8 Flags; + UINT8 Enabled; + UINT32 NumberOfRecordsToPreAllocate; + UINT32 MaxSectionsPerRecord; + UINT32 Bus; + UINT16 Device; + UINT16 Function; + UINT16 DeviceControl; + UINT8 Reserved1[2]; + UINT32 UncorrectableErrorMask; + UINT32 UncorrectableErrorSeverity; + UINT32 CorrectableErrorMask; + UINT32 AdvancedErrorCapabilitiesAndControl; + UINT32 RootErrorCommand; +} EFI_ACPI_6_6_PCI_EXPRESS_ROOT_PORT_AER_STRUCTURE; + +/// +/// PCI Express Device AER Structure Definition +/// +typedef struct { + UINT16 Type; + UINT16 SourceId; + UINT8 Reserved0[2]; + UINT8 Flags; + UINT8 Enabled; + UINT32 NumberOfRecordsToPreAllocate; + UINT32 MaxSectionsPerRecord; + UINT32 Bus; + UINT16 Device; + UINT16 Function; + UINT16 DeviceControl; + UINT8 Reserved1[2]; + UINT32 UncorrectableErrorMask; + UINT32 UncorrectableErrorSeverity; + UINT32 CorrectableErrorMask; + UINT32 AdvancedErrorCapabilitiesAndControl; +} EFI_ACPI_6_6_PCI_EXPRESS_DEVICE_AER_STRUCTURE; + +/// +/// PCI Express Bridge AER Structure Definition +/// +typedef struct { + UINT16 Type; + UINT16 SourceId; + UINT8 Reserved0[2]; + UINT8 Flags; + UINT8 Enabled; + UINT32 NumberOfRecordsToPreAllocate; + UINT32 MaxSectionsPerRecord; + UINT32 Bus; + UINT16 Device; + UINT16 Function; + UINT16 DeviceControl; + UINT8 Reserved1[2]; + UINT32 UncorrectableErrorMask; + UINT32 UncorrectableErrorSeverity; + UINT32 CorrectableErrorMask; + UINT32 AdvancedErrorCapabilitiesAndControl; + UINT32 SecondaryUncorrectableErrorMask; + UINT32 SecondaryUncorrectableErrorSeverity; + UINT32 SecondaryAdvancedErrorCapabilitiesAndControl; +} EFI_ACPI_6_6_PCI_EXPRESS_BRIDGE_AER_STRUCTURE; + +/// +/// Generic Hardware Error Source Structure Definition +/// +typedef struct { + UINT16 Type; + UINT16 SourceId; + UINT16 RelatedSourceId; + UINT8 Flags; + UINT8 Enabled; + UINT32 NumberOfRecordsToPreAllocate; + UINT32 MaxSectionsPerRecord; + UINT32 MaxRawDataLength; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE ErrorStatusAddress; + EFI_ACPI_6_6_HARDWARE_ERROR_NOTIFICATION_STRUCTURE NotificationStructure; + UINT32 ErrorStatusBlockLength; +} EFI_ACPI_6_6_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE; + +/// +/// Generic Hardware Error Source Version 2 Structure Definition +/// +typedef struct { + UINT16 Type; + UINT16 SourceId; + UINT16 RelatedSourceId; + UINT8 Flags; + UINT8 Enabled; + UINT32 NumberOfRecordsToPreAllocate; + UINT32 MaxSectionsPerRecord; + UINT32 MaxRawDataLength; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE ErrorStatusAddress; + EFI_ACPI_6_6_HARDWARE_ERROR_NOTIFICATION_STRUCTURE NotificationStructure; + UINT32 ErrorStatusBlockLength; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE ReadAckRegister; + UINT64 ReadAckPreserve; + UINT64 ReadAckWrite; +} EFI_ACPI_6_6_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE; + +/// +/// Generic Error Status Definition +/// +typedef struct { + EFI_ACPI_6_6_ERROR_BLOCK_STATUS BlockStatus; + UINT32 RawDataOffset; + UINT32 RawDataLength; + UINT32 DataLength; + UINT32 ErrorSeverity; +} EFI_ACPI_6_6_GENERIC_ERROR_STATUS_STRUCTURE; + +/// +/// IA-32 Architecture Deferred Machine Check Structure Definition +/// +typedef struct { + UINT16 Type; + UINT16 SourceId; + UINT8 Reserved0[2]; + UINT8 Flags; + UINT8 Enabled; + UINT32 NumberOfRecordsToPreAllocate; + UINT32 MaxSectionsPerRecord; + EFI_ACPI_6_6_HARDWARE_ERROR_NOTIFICATION_STRUCTURE NotificationStructure; + UINT8 NumberOfHardwareBanks; + UINT8 Reserved1[3]; +} EFI_ACPI_6_6_IA32_ARCHITECTURE_DEFERRED_MACHINE_CHECK_STRUCTURE; + +/// +/// HMAT - Heterogeneous Memory Attribute Table +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT8 Reserved[4]; +} EFI_ACPI_6_6_HETEROGENEOUS_MEMORY_ATTRIBUTE_TABLE_HEADER; + +/// +/// HMAT Revision (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_HETEROGENEOUS_MEMORY_ATTRIBUTE_TABLE_REVISION 0x02 + +/// +/// HMAT types +/// +#define EFI_ACPI_6_6_HMAT_TYPE_MEMORY_PROXIMITY_DOMAIN_ATTRIBUTES 0x00 +#define EFI_ACPI_6_6_HMAT_TYPE_SYSTEM_LOCALITY_LATENCY_AND_BANDWIDTH_INFO 0x01 +#define EFI_ACPI_6_6_HMAT_TYPE_MEMORY_SIDE_CACHE_INFO 0x02 + +/// +/// HMAT Structure Header +/// +typedef struct { + UINT16 Type; + UINT8 Reserved[2]; + UINT32 Length; +} EFI_ACPI_6_6_HMAT_STRUCTURE_HEADER; + +/// +/// Memory Proximity Domain Attributes Structure flags +/// +typedef struct { + UINT16 InitiatorProximityDomainValid : 1; + UINT16 Reserved : 15; +} EFI_ACPI_6_6_HMAT_STRUCTURE_MEMORY_PROXIMITY_DOMAIN_ATTRIBUTES_FLAGS; + +/// +/// Memory Proximity Domain Attributes Structure +/// +typedef struct { + UINT16 Type; + UINT8 Reserved[2]; + UINT32 Length; + EFI_ACPI_6_6_HMAT_STRUCTURE_MEMORY_PROXIMITY_DOMAIN_ATTRIBUTES_FLAGS Flags; + UINT8 Reserved1[2]; + UINT32 InitiatorProximityDomain; + UINT32 MemoryProximityDomain; + UINT8 Reserved2[20]; +} EFI_ACPI_6_6_HMAT_STRUCTURE_MEMORY_PROXIMITY_DOMAIN_ATTRIBUTES; + +/// +/// System Locality Latency and Bandwidth Information Structure flags +/// +typedef struct { + UINT8 MemoryHierarchy : 4; + UINT8 AccessAttributes : 2; + UINT8 Reserved : 2; +} EFI_ACPI_6_6_HMAT_STRUCTURE_SYSTEM_LOCALITY_LATENCY_AND_BANDWIDTH_INFO_FLAGS; + +/// +/// System Locality Latency and Bandwidth Information Structure +/// +typedef struct { + UINT16 Type; + UINT8 Reserved[2]; + UINT32 Length; + EFI_ACPI_6_6_HMAT_STRUCTURE_SYSTEM_LOCALITY_LATENCY_AND_BANDWIDTH_INFO_FLAGS Flags; + UINT8 DataType; + UINT8 MinTransferSize; + UINT8 Reserved1; + UINT32 NumberOfInitiatorProximityDomains; + UINT32 NumberOfTargetProximityDomains; + UINT8 Reserved2[4]; + UINT64 EntryBaseUnit; +} EFI_ACPI_6_6_HMAT_STRUCTURE_SYSTEM_LOCALITY_LATENCY_AND_BANDWIDTH_INFO; + +/// +/// Memory Side Cache Information Structure cache attributes +/// +typedef struct { + UINT32 TotalCacheLevels : 4; + UINT32 CacheLevel : 4; + UINT32 CacheAssociativity : 4; + UINT32 WritePolicy : 4; + UINT32 CacheLineSize : 16; +} EFI_ACPI_6_6_HMAT_STRUCTURE_MEMORY_SIDE_CACHE_INFO_CACHE_ATTRIBUTES; + +/// +/// Memory Side Cache Information Structure +/// +typedef struct { + UINT16 Type; + UINT8 Reserved[2]; + UINT32 Length; + UINT32 MemoryProximityDomain; + UINT8 Reserved1[4]; + UINT64 MemorySideCacheSize; + EFI_ACPI_6_6_HMAT_STRUCTURE_MEMORY_SIDE_CACHE_INFO_CACHE_ATTRIBUTES CacheAttributes; + UINT8 Reserved2[2]; + UINT16 NumberOfSmbiosHandles; +} EFI_ACPI_6_6_HMAT_STRUCTURE_MEMORY_SIDE_CACHE_INFO; + +/// +/// ERST - Error Record Serialization Table +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT32 SerializationHeaderSize; + UINT8 Reserved0[4]; + UINT32 InstructionEntryCount; +} EFI_ACPI_6_6_ERROR_RECORD_SERIALIZATION_TABLE_HEADER; + +/// +/// ERST Version (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_ERROR_RECORD_SERIALIZATION_TABLE_REVISION 0x01 + +/// +/// ERST Serialization Actions +/// +#define EFI_ACPI_6_6_ERST_BEGIN_WRITE_OPERATION 0x00 +#define EFI_ACPI_6_6_ERST_BEGIN_READ_OPERATION 0x01 +#define EFI_ACPI_6_6_ERST_BEGIN_CLEAR_OPERATION 0x02 +#define EFI_ACPI_6_6_ERST_END_OPERATION 0x03 +#define EFI_ACPI_6_6_ERST_SET_RECORD_OFFSET 0x04 +#define EFI_ACPI_6_6_ERST_EXECUTE_OPERATION 0x05 +#define EFI_ACPI_6_6_ERST_CHECK_BUSY_STATUS 0x06 +#define EFI_ACPI_6_6_ERST_GET_COMMAND_STATUS 0x07 +#define EFI_ACPI_6_6_ERST_GET_RECORD_IDENTIFIER 0x08 +#define EFI_ACPI_6_6_ERST_SET_RECORD_IDENTIFIER 0x09 +#define EFI_ACPI_6_6_ERST_GET_RECORD_COUNT 0x0A +#define EFI_ACPI_6_6_ERST_BEGIN_DUMMY_WRITE_OPERATION 0x0B +#define EFI_ACPI_6_6_ERST_GET_ERROR_LOG_ADDRESS_RANGE 0x0D +#define EFI_ACPI_6_6_ERST_GET_ERROR_LOG_ADDRESS_RANGE_LENGTH 0x0E +#define EFI_ACPI_6_6_ERST_GET_ERROR_LOG_ADDRESS_RANGE_ATTRIBUTES 0x0F +#define EFI_ACPI_6_6_ERST_GET_EXECUTE_OPERATION_TIMINGS 0x10 + +/// +/// ERST Action Command Status +/// +#define EFI_ACPI_6_6_ERST_STATUS_SUCCESS 0x00 +#define EFI_ACPI_6_6_ERST_STATUS_NOT_ENOUGH_SPACE 0x01 +#define EFI_ACPI_6_6_ERST_STATUS_HARDWARE_NOT_AVAILABLE 0x02 +#define EFI_ACPI_6_6_ERST_STATUS_FAILED 0x03 +#define EFI_ACPI_6_6_ERST_STATUS_RECORD_STORE_EMPTY 0x04 +#define EFI_ACPI_6_6_ERST_STATUS_RECORD_NOT_FOUND 0x05 + +/// +/// ERST Serialization Instructions +/// +#define EFI_ACPI_6_6_ERST_READ_REGISTER 0x00 +#define EFI_ACPI_6_6_ERST_READ_REGISTER_VALUE 0x01 +#define EFI_ACPI_6_6_ERST_WRITE_REGISTER 0x02 +#define EFI_ACPI_6_6_ERST_WRITE_REGISTER_VALUE 0x03 +#define EFI_ACPI_6_6_ERST_NOOP 0x04 +#define EFI_ACPI_6_6_ERST_LOAD_VAR1 0x05 +#define EFI_ACPI_6_6_ERST_LOAD_VAR2 0x06 +#define EFI_ACPI_6_6_ERST_STORE_VAR1 0x07 +#define EFI_ACPI_6_6_ERST_ADD 0x08 +#define EFI_ACPI_6_6_ERST_SUBTRACT 0x09 +#define EFI_ACPI_6_6_ERST_ADD_VALUE 0x0A +#define EFI_ACPI_6_6_ERST_SUBTRACT_VALUE 0x0B +#define EFI_ACPI_6_6_ERST_STALL 0x0C +#define EFI_ACPI_6_6_ERST_STALL_WHILE_TRUE 0x0D +#define EFI_ACPI_6_6_ERST_SKIP_NEXT_INSTRUCTION_IF_TRUE 0x0E +#define EFI_ACPI_6_6_ERST_GOTO 0x0F +#define EFI_ACPI_6_6_ERST_SET_SRC_ADDRESS_BASE 0x10 +#define EFI_ACPI_6_6_ERST_SET_DST_ADDRESS_BASE 0x11 +#define EFI_ACPI_6_6_ERST_MOVE_DATA 0x12 + +/// +/// ERST Instruction Flags +/// +#define EFI_ACPI_6_6_ERST_PRESERVE_REGISTER 0x01 + +/// +/// ERST Serialization Instruction Entry +/// +typedef struct { + UINT8 SerializationAction; + UINT8 Instruction; + UINT8 Flags; + UINT8 Reserved0; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE RegisterRegion; + UINT64 Value; + UINT64 Mask; +} EFI_ACPI_6_6_ERST_SERIALIZATION_INSTRUCTION_ENTRY; + +/// +/// EINJ - Error Injection Table +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT32 InjectionHeaderSize; + UINT8 InjectionFlags; + UINT8 Reserved0[3]; + UINT32 InjectionEntryCount; +} EFI_ACPI_6_6_ERROR_INJECTION_TABLE_HEADER; + +/// +/// EINJ Version (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_ERROR_INJECTION_TABLE_REVISION 0x02 + +/// +/// EINJ Error Injection Actions +/// +#define EFI_ACPI_6_6_EINJ_BEGIN_INJECTION_OPERATION 0x00 +#define EFI_ACPI_6_6_EINJ_GET_TRIGGER_ERROR_ACTION_TABLE 0x01 +#define EFI_ACPI_6_6_EINJ_SET_ERROR_TYPE 0x02 +#define EFI_ACPI_6_6_EINJ_GET_ERROR_TYPE 0x03 +#define EFI_ACPI_6_6_EINJ_END_OPERATION 0x04 +#define EFI_ACPI_6_6_EINJ_EXECUTE_OPERATION 0x05 +#define EFI_ACPI_6_6_EINJ_CHECK_BUSY_STATUS 0x06 +#define EFI_ACPI_6_6_EINJ_GET_COMMAND_STATUS 0x07 +#define EFI_ACPI_6_6_EINJ_SET_ERROR_TYPE_WITH_ADDRESS 0x08 +#define EFI_ACPI_6_6_EINJ_GET_EXECUTE_OPERATION_TIMINGS 0x09 +#define EFI_ACPI_6_6_EINJ_EINJV2_SET_ERROR_TYPE 0x10 +#define EFI_ACPI_6_6_EINJ_EINJV2_GET_ERROR_TYPE 0x11 +#define EFI_ACPI_6_6_EINJ_TRIGGER_ERROR 0xFF + +/// +/// EINJ Action Command Status +/// +#define EFI_ACPI_6_6_EINJ_STATUS_SUCCESS 0x00 +#define EFI_ACPI_6_6_EINJ_STATUS_UNKNOWN_FAILURE 0x01 +#define EFI_ACPI_6_6_EINJ_STATUS_INVALID_ACCESS 0x02 + +/// +/// EINJ Error Type Definition +/// +#define EFI_ACPI_6_6_EINJ_ERROR_PROCESSOR_CORRECTABLE (1 << 0) +#define EFI_ACPI_6_6_EINJ_ERROR_PROCESSOR_UNCORRECTABLE_NONFATAL (1 << 1) +#define EFI_ACPI_6_6_EINJ_ERROR_PROCESSOR_UNCORRECTABLE_FATAL (1 << 2) +#define EFI_ACPI_6_6_EINJ_ERROR_MEMORY_CORRECTABLE (1 << 3) +#define EFI_ACPI_6_6_EINJ_ERROR_MEMORY_UNCORRECTABLE_NONFATAL (1 << 4) +#define EFI_ACPI_6_6_EINJ_ERROR_MEMORY_UNCORRECTABLE_FATAL (1 << 5) +#define EFI_ACPI_6_6_EINJ_ERROR_PCI_EXPRESS_CORRECTABLE (1 << 6) +#define EFI_ACPI_6_6_EINJ_ERROR_PCI_EXPRESS_UNCORRECTABLE_NONFATAL (1 << 7) +#define EFI_ACPI_6_6_EINJ_ERROR_PCI_EXPRESS_UNCORRECTABLE_FATAL (1 << 8) +#define EFI_ACPI_6_6_EINJ_ERROR_PLATFORM_CORRECTABLE (1 << 9) +#define EFI_ACPI_6_6_EINJ_ERROR_PLATFORM_UNCORRECTABLE_NONFATAL (1 << 10) +#define EFI_ACPI_6_6_EINJ_ERROR_PLATFORM_UNCORRECTABLE_FATAL (1 << 11) + +/// +/// EINJ Injection Instructions +/// +#define EFI_ACPI_6_6_EINJ_READ_REGISTER 0x00 +#define EFI_ACPI_6_6_EINJ_READ_REGISTER_VALUE 0x01 +#define EFI_ACPI_6_6_EINJ_WRITE_REGISTER 0x02 +#define EFI_ACPI_6_6_EINJ_WRITE_REGISTER_VALUE 0x03 +#define EFI_ACPI_6_6_EINJ_NOOP 0x04 + +/// +/// EINJ Instruction Flags +/// +#define EFI_ACPI_6_6_EINJ_PRESERVE_REGISTER 0x01 + +/// +/// EINJ Injection Instruction Entry +/// +typedef struct { + UINT8 InjectionAction; + UINT8 Instruction; + UINT8 Flags; + UINT8 Reserved0; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE RegisterRegion; + UINT64 Value; + UINT64 Mask; +} EFI_ACPI_6_6_EINJ_INJECTION_INSTRUCTION_ENTRY; + +/// +/// EINJ Trigger Action Table +/// +typedef struct { + UINT32 HeaderSize; + UINT32 Revision; + UINT32 TableSize; + UINT32 EntryCount; +} EFI_ACPI_6_6_EINJ_TRIGGER_ACTION_TABLE; + +/// +/// Platform Communications Channel Table (PCCT) +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT32 Flags; + UINT64 Reserved; +} EFI_ACPI_6_6_PLATFORM_COMMUNICATION_CHANNEL_TABLE_HEADER; + +/// +/// PCCT Version (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_PLATFORM_COMMUNICATION_CHANNEL_TABLE_REVISION 0x02 + +/// +/// PCCT Global Flags +/// +#define EFI_ACPI_6_6_PCCT_FLAGS_PLATFORM_INTERRUPT BIT0 + +// +// PCCT Subspace type +// +#define EFI_ACPI_6_6_PCCT_SUBSPACE_TYPE_GENERIC 0x00 +#define EFI_ACPI_6_6_PCCT_SUBSPACE_TYPE_1_HW_REDUCED_COMMUNICATIONS 0x01 +#define EFI_ACPI_6_6_PCCT_SUBSPACE_TYPE_2_HW_REDUCED_COMMUNICATIONS 0x02 +#define EFI_ACPI_6_6_PCCT_SUBSPACE_TYPE_3_EXTENDED_PCC 0x03 +#define EFI_ACPI_6_6_PCCT_SUBSPACE_TYPE_4_EXTENDED_PCC 0x04 +#define EFI_ACPI_6_6_PCCT_SUBSPACE_TYPE_5_HW_REGISTERS_COMMUNICATIONS 0x05 + +/// +/// PCC Subspace Structure Header +/// +typedef struct { + UINT8 Type; + UINT8 Length; +} EFI_ACPI_6_6_PCCT_SUBSPACE_HEADER; + +/// +/// Generic Communications Subspace Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Reserved[6]; + UINT64 BaseAddress; + UINT64 AddressLength; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE DoorbellRegister; + UINT64 DoorbellPreserve; + UINT64 DoorbellWrite; + UINT32 NominalLatency; + UINT32 MaximumPeriodicAccessRate; + UINT16 MinimumRequestTurnaroundTime; +} EFI_ACPI_6_6_PCCT_SUBSPACE_GENERIC; + +/// +/// Generic Communications Channel Shared Memory Region +/// + +typedef struct { + UINT8 Command; + UINT8 Reserved : 7; + UINT8 NotifyOnCompletion : 1; +} EFI_ACPI_6_6_PCCT_GENERIC_SHARED_MEMORY_REGION_COMMAND; + +typedef struct { + UINT8 CommandComplete : 1; + UINT8 PlatformInterrupt : 1; + UINT8 Error : 1; + UINT8 PlatformNotification : 1; + UINT8 Reserved : 4; + UINT8 Reserved1; +} EFI_ACPI_6_6_PCCT_GENERIC_SHARED_MEMORY_REGION_STATUS; + +typedef struct { + UINT32 Signature; + EFI_ACPI_6_6_PCCT_GENERIC_SHARED_MEMORY_REGION_COMMAND Command; + EFI_ACPI_6_6_PCCT_GENERIC_SHARED_MEMORY_REGION_STATUS Status; +} EFI_ACPI_6_6_PCCT_GENERIC_SHARED_MEMORY_REGION_HEADER; + +#define EFI_ACPI_6_6_PCCT_SUBSPACE_PLATFORM_INTERRUPT_FLAGS_POLARITY BIT0 +#define EFI_ACPI_6_6_PCCT_SUBSPACE_PLATFORM_INTERRUPT_FLAGS_MODE BIT1 + +/// +/// Type 1 HW-Reduced Communications Subspace Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT32 PlatformInterrupt; + UINT8 PlatformInterruptFlags; + UINT8 Reserved; + UINT64 BaseAddress; + UINT64 AddressLength; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE DoorbellRegister; + UINT64 DoorbellPreserve; + UINT64 DoorbellWrite; + UINT32 NominalLatency; + UINT32 MaximumPeriodicAccessRate; + UINT16 MinimumRequestTurnaroundTime; +} EFI_ACPI_6_6_PCCT_SUBSPACE_1_HW_REDUCED_COMMUNICATIONS; + +/// +/// Type 2 HW-Reduced Communications Subspace Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT32 PlatformInterrupt; + UINT8 PlatformInterruptFlags; + UINT8 Reserved; + UINT64 BaseAddress; + UINT64 AddressLength; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE DoorbellRegister; + UINT64 DoorbellPreserve; + UINT64 DoorbellWrite; + UINT32 NominalLatency; + UINT32 MaximumPeriodicAccessRate; + UINT16 MinimumRequestTurnaroundTime; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE PlatformInterruptAckRegister; + UINT64 PlatformInterruptAckPreserve; + UINT64 PlatformInterruptAckWrite; +} EFI_ACPI_6_6_PCCT_SUBSPACE_2_HW_REDUCED_COMMUNICATIONS; + +/// +/// Type 3 Extended PCC Subspace Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT32 PlatformInterrupt; + UINT8 PlatformInterruptFlags; + UINT8 Reserved; + UINT64 BaseAddress; + UINT32 AddressLength; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE DoorbellRegister; + UINT64 DoorbellPreserve; + UINT64 DoorbellWrite; + UINT32 NominalLatency; + UINT32 MaximumPeriodicAccessRate; + UINT32 MinimumRequestTurnaroundTime; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE PlatformInterruptAckRegister; + UINT64 PlatformInterruptAckPreserve; + UINT64 PlatformInterruptAckSet; + UINT8 Reserved1[8]; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE CommandCompleteCheckRegister; + UINT64 CommandCompleteCheckMask; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE CommandCompleteUpdateRegister; + UINT64 CommandCompleteUpdatePreserve; + UINT64 CommandCompleteUpdateSet; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE ErrorStatusRegister; + UINT64 ErrorStatusMask; +} EFI_ACPI_6_6_PCCT_SUBSPACE_3_EXTENDED_PCC; + +/// +/// Type 4 Extended PCC Subspace Structure +/// +typedef EFI_ACPI_6_6_PCCT_SUBSPACE_3_EXTENDED_PCC EFI_ACPI_6_6_PCCT_SUBSPACE_4_EXTENDED_PCC; + +#define EFI_ACPI_6_6_PCCT_MASTER_SLAVE_COMMUNICATIONS_CHANNEL_FLAGS_NOTIFY_ON_COMPLETION BIT0 + +typedef struct { + UINT32 Signature; + UINT32 Flags; + UINT32 Length; + UINT32 Command; +} EFI_ACPI_6_6_PCCT_EXTENDED_PCC_SHARED_MEMORY_REGION_HEADER; + +/// +/// Type 5 HW Registers based Communications Subspace Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT16 Version; + UINT64 BaseAddress; + UINT64 SharedMemoryRangeLength; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE DoorbellRegister; + UINT64 DoorbellPreserve; + UINT64 DoorbellWrite; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE CommandCompleteCheckRegister; + UINT64 CommandCompleteCheckMask; + EFI_ACPI_6_6_GENERIC_ADDRESS_STRUCTURE ErrorStatusRegister; + UINT64 ErrorStatusMask; + UINT32 NominalLatency; + UINT32 MinimumRequestTurnaroundTime; +} EFI_ACPI_6_6_PCCT_SUBSPACE_5_HW_REGISTERS_COMMUNICATIONS; + +/// +/// Reduced PCC Subspace Shared Memory Region +/// +typedef struct { + UINT32 Signature; + // UINT8 CommunicationSubspace[]; +} EFI_6_6_PCCT_REDUCED_PCC_SUBSPACE_SHARED_MEMORY_REGION; + +/// +/// Platform Debug Trigger Table (PDTT) +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT8 TriggerCount; + UINT8 Reserved[3]; + UINT32 TriggerIdentifierArrayOffset; +} EFI_ACPI_6_6_PLATFORM_DEBUG_TRIGGER_TABLE_HEADER; + +/// +/// PDTT Revision (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_PLATFORM_DEBUG_TRIGGER_TABLE_REVISION 0x00 + +/// +/// PDTT Platform Communication Channel Identifier Structure +/// +typedef struct { + UINT16 SubChannelIdentifer : 8; + UINT16 Runtime : 1; + UINT16 WaitForCompletion : 1; + UINT16 TriggerOrder : 1; + UINT16 Reserved : 5; +} EFI_ACPI_6_6_PDTT_PCC_IDENTIFIER; + +/// +/// PCC Commands Codes used by Platform Debug Trigger Table +/// +#define EFI_ACPI_6_6_PDTT_PCC_COMMAND_DOORBELL_ONLY 0x00 +#define EFI_ACPI_6_6_PDTT_PCC_COMMAND_VENDOR_SPECIFIC 0x01 + +/// +/// PDTT Platform Communication Channel +/// +typedef EFI_ACPI_6_6_PCCT_GENERIC_SHARED_MEMORY_REGION_HEADER EFI_ACPI_6_6_PDTT_PCC; + +/// +/// Processor Properties Topology Table (PPTT) +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; +} EFI_ACPI_6_6_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_HEADER; + +/// +/// PPTT Revision (as defined in ACPI 6.6 spec.) +/// +#define EFI_ACPI_6_6_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_REVISION 0x03 + +/// +/// PPTT types +/// +#define EFI_ACPI_6_6_PPTT_TYPE_PROCESSOR 0x00 +#define EFI_ACPI_6_6_PPTT_TYPE_CACHE 0x01 + +/// +/// PPTT Structure Header +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Reserved[2]; +} EFI_ACPI_6_6_PPTT_STRUCTURE_HEADER; + +/// +/// For PPTT struct processor flags +/// +#define EFI_ACPI_6_6_PPTT_PACKAGE_NOT_PHYSICAL 0x0 +#define EFI_ACPI_6_6_PPTT_PACKAGE_PHYSICAL 0x1 +#define EFI_ACPI_6_6_PPTT_PROCESSOR_ID_INVALID 0x0 +#define EFI_ACPI_6_6_PPTT_PROCESSOR_ID_VALID 0x1 +#define EFI_ACPI_6_6_PPTT_PROCESSOR_IS_NOT_THREAD 0x0 +#define EFI_ACPI_6_6_PPTT_PROCESSOR_IS_THREAD 0x1 +#define EFI_ACPI_6_6_PPTT_NODE_IS_NOT_LEAF 0x0 +#define EFI_ACPI_6_6_PPTT_NODE_IS_LEAF 0x1 +#define EFI_ACPI_6_6_PPTT_IMPLEMENTATION_NOT_IDENTICAL 0x0 +#define EFI_ACPI_6_6_PPTT_IMPLEMENTATION_IDENTICAL 0x1 + +/// +/// Processor hierarchy node structure flags +/// +typedef struct { + UINT32 PhysicalPackage : 1; + UINT32 AcpiProcessorIdValid : 1; + UINT32 ProcessorIsAThread : 1; + UINT32 NodeIsALeaf : 1; + UINT32 IdenticalImplementation : 1; + UINT32 Reserved : 27; +} EFI_ACPI_6_6_PPTT_STRUCTURE_PROCESSOR_FLAGS; + +/// +/// Processor hierarchy node structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Reserved[2]; + EFI_ACPI_6_6_PPTT_STRUCTURE_PROCESSOR_FLAGS Flags; + UINT32 Parent; + UINT32 AcpiProcessorId; + UINT32 NumberOfPrivateResources; +} EFI_ACPI_6_6_PPTT_STRUCTURE_PROCESSOR; + +/// +/// For PPTT struct cache flags +/// +#define EFI_ACPI_6_6_PPTT_CACHE_SIZE_INVALID 0x0 +#define EFI_ACPI_6_6_PPTT_CACHE_SIZE_VALID 0x1 +#define EFI_ACPI_6_6_PPTT_NUMBER_OF_SETS_INVALID 0x0 +#define EFI_ACPI_6_6_PPTT_NUMBER_OF_SETS_VALID 0x1 +#define EFI_ACPI_6_6_PPTT_ASSOCIATIVITY_INVALID 0x0 +#define EFI_ACPI_6_6_PPTT_ASSOCIATIVITY_VALID 0x1 +#define EFI_ACPI_6_6_PPTT_ALLOCATION_TYPE_INVALID 0x0 +#define EFI_ACPI_6_6_PPTT_ALLOCATION_TYPE_VALID 0x1 +#define EFI_ACPI_6_6_PPTT_CACHE_TYPE_INVALID 0x0 +#define EFI_ACPI_6_6_PPTT_CACHE_TYPE_VALID 0x1 +#define EFI_ACPI_6_6_PPTT_WRITE_POLICY_INVALID 0x0 +#define EFI_ACPI_6_6_PPTT_WRITE_POLICY_VALID 0x1 +#define EFI_ACPI_6_6_PPTT_LINE_SIZE_INVALID 0x0 +#define EFI_ACPI_6_6_PPTT_LINE_SIZE_VALID 0x1 +#define EFI_ACPI_6_6_PPTT_CACHE_ID_INVALID 0x0 +#define EFI_ACPI_6_6_PPTT_CACHE_ID_VALID 0x1 + +/// +/// Cache Type Structure flags +/// +typedef struct { + UINT32 SizePropertyValid : 1; + UINT32 NumberOfSetsValid : 1; + UINT32 AssociativityValid : 1; + UINT32 AllocationTypeValid : 1; + UINT32 CacheTypeValid : 1; + UINT32 WritePolicyValid : 1; + UINT32 LineSizeValid : 1; + UINT32 CacheIdValid : 1; + UINT32 Reserved : 24; +} EFI_ACPI_6_6_PPTT_STRUCTURE_CACHE_FLAGS; + +/// +/// For cache attributes +/// +#define EFI_ACPI_6_6_CACHE_ATTRIBUTES_ALLOCATION_READ 0x0 +#define EFI_ACPI_6_6_CACHE_ATTRIBUTES_ALLOCATION_WRITE 0x1 +#define EFI_ACPI_6_6_CACHE_ATTRIBUTES_ALLOCATION_READ_WRITE 0x2 +#define EFI_ACPI_6_6_CACHE_ATTRIBUTES_CACHE_TYPE_DATA 0x0 +#define EFI_ACPI_6_6_CACHE_ATTRIBUTES_CACHE_TYPE_INSTRUCTION 0x1 +#define EFI_ACPI_6_6_CACHE_ATTRIBUTES_CACHE_TYPE_UNIFIED 0x2 +#define EFI_ACPI_6_6_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK 0x0 +#define EFI_ACPI_6_6_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_THROUGH 0x1 + +/// +/// Cache Type Structure cache attributes +/// +typedef struct { + UINT8 AllocationType : 2; + UINT8 CacheType : 2; + UINT8 WritePolicy : 1; + UINT8 Reserved : 3; +} EFI_ACPI_6_6_PPTT_STRUCTURE_CACHE_ATTRIBUTES; + +/// +/// Cache Type Structure +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Reserved[2]; + EFI_ACPI_6_6_PPTT_STRUCTURE_CACHE_FLAGS Flags; + UINT32 NextLevelOfCache; + UINT32 Size; + UINT32 NumberOfSets; + UINT8 Associativity; + EFI_ACPI_6_6_PPTT_STRUCTURE_CACHE_ATTRIBUTES Attributes; + UINT16 LineSize; + UINT32 CacheId; +} EFI_ACPI_6_6_PPTT_STRUCTURE_CACHE; + +/// +/// Platform Health Assessment Table (PHAT) Format +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + // UINT8 PlatformTelemetryRecords[]; +} EFI_ACPI_6_6_PLATFORM_HEALTH_ASSESSMENT_TABLE; + +#define EFI_ACPI_6_6_PLATFORM_HEALTH_ASSESSMENT_TABLE_REVISION 0x01 + +/// +/// PHAT Record Format +/// +typedef struct { + UINT16 PlatformHealthAssessmentRecordType; + UINT16 RecordLength; + UINT8 Revision; + // UINT8 Data[]; +} EFI_ACPI_6_6_PHAT_RECORD; + +/// +/// PHAT Record Type Format +/// +#define EFI_ACPI_6_6_PHAT_RECORD_TYPE_FIRMWARE_VERSION_DATA_RECORD 0x0000 +#define EFI_ACPI_6_6_PHAT_RECORD_TYPE_FIRMWARE_HEALTH_DATA_RECORD 0x0001 + +/// +/// PHAT Version Element +/// +typedef struct { + GUID ComponentId; + UINT64 VersionValue; + UINT32 ProducerId; +} EFI_ACPI_6_6_PHAT_VERSION_ELEMENT; + +/// +/// PHAT Firmware Version Data Record +/// +typedef struct { + UINT16 PlatformRecordType; + UINT16 RecordLength; + UINT8 Revision; + UINT8 Reserved[3]; + UINT32 RecordCount; + // UINT8 PhatVersionElement[]; +} EFI_ACPI_6_6_PHAT_FIRMWARE_VERISON_DATA_RECORD; + +#define EFI_ACPI_6_6_PHAT_FIRMWARE_VERSION_DATA_RECORD_REVISION 0x01 + +/// +/// Firmware Health Data Record Structure +/// +typedef struct { + UINT16 PlatformRecordType; + UINT16 RecordLength; + UINT8 Revision; + UINT16 Reserved; + UINT8 AmHealthy; + GUID DeviceSignature; + UINT32 DeviceSpecificDataOffset; + // UINT8 DevicePath[]; + // UINT8 DeviceSpecificData[]; +} EFI_ACPI_6_6_PHAT_FIRMWARE_HEALTH_DATA_RECORD_STRUCTURE; + +#define EFI_ACPI_6_6_PHAT_FIRMWARE_HEALTH_DATA_RECORD_REVISION 0x01 + +/// +/// Firmware Health Data Record device health state +/// +#define EFI_ACPI_6_6_PHAT_FIRMWARE_HEALTH_DATA_RECORD_ERRORS_FOUND 0x00 +#define EFI_ACPI_6_6_PHAT_FIRMWARE_HEALTH_DATA_RECORD_NO_ERRORS_FOUND 0x01 +#define EFI_ACPI_6_6_PHAT_FIRMWARE_HEALTH_DATA_RECORD_UNKNOWN 0x02 +#define EFI_ACPI_6_6_PHAT_FIRMWARE_HEALTH_DATA_RECORD_ADVISORY 0x03 + +/// +/// Reset Reason Health Record Vendor Data Entry +/// +typedef struct { + GUID VendorDataID; + UINT16 Length; + UINT16 Revision; + // UINTN Data[]; +} EFI_ACPI_6_6_PHAT_RESET_REASON_HEALTH_RECORD_VENDOR_DATA_ENTRY; + +/// +/// Reset Reason Health Record Structure +/// +typedef struct { + UINT8 SupportedSources; + UINT8 Source; + UINT8 SubSource; + UINT8 Reason; + UINT16 VendorCount; + // EFI_ACPI_6_6_PHAT_RESET_REASON_HEALTH_RECORD_VENDOR_DATA_ENTRY VendorSpecificResetReasonEntry[]; +} EFI_ACPI_6_6_PHAT_RESET_REASON_HEALTH_RECORD_STRUCTURE; + +#define EFI_ACPI_6_6_PHAT_RESET_REASON_HEADER_GUID { 0x7a014ce2, 0xf263, 0x4b77, { 0xb8, 0x8a, 0xe6, 0x33, 0x6b, 0x78, 0x2c, 0x14 }} + +#define EFI_ACPI_6_6_PHAT_RESET_REASON_SUPPORTED_SOURCES_UNKNOWN BIT0 +#define EFI_ACPI_6_6_PHAT_RESET_REASON_SUPPORTED_SOURCES_HARDWARE BIT1 +#define EFI_ACPI_6_6_PHAT_RESET_REASON_SUPPORTED_SOURCES_FIRMWARE BIT2 +#define EFI_ACPI_6_6_PHAT_RESET_REASON_SUPPORTED_SOURCES_SOFTWARE BIT3 +#define EFI_ACPI_6_6_PHAT_RESET_REASON_SUPPORTED_SOURCES_SUPERVISOR BIT4 + +#define EFI_ACPI_6_6_PHAT_RESET_REASON_SOURCES_UNKNOWN BIT0 +#define EFI_ACPI_6_6_PHAT_RESET_REASON_SOURCES_HARDWARE BIT1 +#define EFI_ACPI_6_6_PHAT_RESET_REASON_SOURCES_FIRMWARE BIT2 +#define EFI_ACPI_6_6_PHAT_RESET_REASON_SOURCES_SOFTWARE BIT3 +#define EFI_ACPI_6_6_PHAT_RESET_REASON_SOURCES_SUPERVISOR BIT4 + +#define EFI_ACPI_6_6_PHAT_RESET_REASON_REASON_UNKNOWN 0x00 +#define EFI_ACPI_6_6_PHAT_RESET_REASON_REASON_COLD_BOOT 0x01 +#define EFI_ACPI_6_6_PHAT_RESET_REASON_REASON_COLD_RESET 0x02 +#define EFI_ACPI_6_6_PHAT_RESET_REASON_REASON_WARM_RESET 0x03 +#define EFI_ACPI_6_6_PHAT_RESET_REASON_REASON_UPDATE 0x04 +#define EFI_ACPI_6_6_PHAT_RESET_REASON_REASON_UNEXPECTED_RESET 0x20 +#define EFI_ACPI_6_6_PHAT_RESET_REASON_REASON_FAULT 0x21 +#define EFI_ACPI_6_6_PHAT_RESET_REASON_REASON_TIMEOUT 0x22 +#define EFI_ACPI_6_6_PHAT_RESET_REASON_REASON_THERMAL 0x23 +#define EFI_ACPI_6_6_PHAT_RESET_REASON_REASON_POWER_LOSS 0x24 +#define EFI_ACPI_6_6_PHAT_RESET_REASON_REASON_POWER_BUTTON 0x25 + +// +// Known table signatures +// + +/// +/// "RSD PTR " Root System Description Pointer +/// +#define EFI_ACPI_6_6_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE SIGNATURE_64('R', 'S', 'D', ' ', 'P', 'T', 'R', ' ') + +/// +/// "APIC" Multiple APIC Description Table +/// +#define EFI_ACPI_6_6_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE SIGNATURE_32('A', 'P', 'I', 'C') + +/// +/// "APMT" Arm Performance Monitoring Unit Table +/// +#define EFI_ACPI_6_6_ARM_PERFORMANCE_MONITORING_UNIT_TABLE_SIGNATURE SIGNATURE_32('A', 'P', 'M', 'T') + +/// +/// "BERT" Boot Error Record Table +/// +#define EFI_ACPI_6_6_BOOT_ERROR_RECORD_TABLE_SIGNATURE SIGNATURE_32('B', 'E', 'R', 'T') + +/// +/// "BGRT" Boot Graphics Resource Table +/// +#define EFI_ACPI_6_6_BOOT_GRAPHICS_RESOURCE_TABLE_SIGNATURE SIGNATURE_32('B', 'G', 'R', 'T') + +/// +/// "CDIT" Component Distance Information Table +/// +#define EFI_ACPI_6_6_COMPONENT_DISTANCE_INFORMATION_TABLE_SIGNATURE SIGNATURE_32('C', 'D', 'I', 'T') + +/// +/// "CPEP" Corrected Platform Error Polling Table +/// +#define EFI_ACPI_6_6_CORRECTED_PLATFORM_ERROR_POLLING_TABLE_SIGNATURE SIGNATURE_32('C', 'P', 'E', 'P') + +/// +/// "CRAT" Component Resource Attribute Table +/// +#define EFI_ACPI_6_6_COMPONENT_RESOURCE_ATTRIBUTE_TABLE_SIGNATURE SIGNATURE_32('C', 'R', 'A', 'T') + +/// +/// "DSDT" Differentiated System Description Table +/// +#define EFI_ACPI_6_6_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE SIGNATURE_32('D', 'S', 'D', 'T') + +/// +/// "ECDT" Embedded Controller Boot Resources Table +/// +#define EFI_ACPI_6_6_EMBEDDED_CONTROLLER_BOOT_RESOURCES_TABLE_SIGNATURE SIGNATURE_32('E', 'C', 'D', 'T') + +/// +/// "EINJ" Error Injection Table +/// +#define EFI_ACPI_6_6_ERROR_INJECTION_TABLE_SIGNATURE SIGNATURE_32('E', 'I', 'N', 'J') + +/// +/// "ERST" Error Record Serialization Table +/// +#define EFI_ACPI_6_6_ERROR_RECORD_SERIALIZATION_TABLE_SIGNATURE SIGNATURE_32('E', 'R', 'S', 'T') + +/// +/// "FACP" Fixed ACPI Description Table +/// +#define EFI_ACPI_6_6_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE SIGNATURE_32('F', 'A', 'C', 'P') + +/// +/// "FACS" Firmware ACPI Control Structure +/// +#define EFI_ACPI_6_6_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE SIGNATURE_32('F', 'A', 'C', 'S') + +/// +/// "FPDT" Firmware Performance Data Table +/// +#define EFI_ACPI_6_6_FIRMWARE_PERFORMANCE_DATA_TABLE_SIGNATURE SIGNATURE_32('F', 'P', 'D', 'T') + +/// +/// "GTDT" Generic Timer Description Table +/// +#define EFI_ACPI_6_6_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE SIGNATURE_32('G', 'T', 'D', 'T') + +/// +/// "HEST" Hardware Error Source Table +/// +#define EFI_ACPI_6_6_HARDWARE_ERROR_SOURCE_TABLE_SIGNATURE SIGNATURE_32('H', 'E', 'S', 'T') + +/// +/// "HMAT" Heterogeneous Memory Attribute Table +/// +#define EFI_ACPI_6_6_HETEROGENEOUS_MEMORY_ATTRIBUTE_TABLE_SIGNATURE SIGNATURE_32('H', 'M', 'A', 'T') + +/// +/// "MPST" Memory Power State Table +/// +#define EFI_ACPI_6_6_MEMORY_POWER_STATE_TABLE_SIGNATURE SIGNATURE_32('M', 'P', 'S', 'T') + +/// +/// "MSCT" Maximum System Characteristics Table +/// +#define EFI_ACPI_6_6_MAXIMUM_SYSTEM_CHARACTERISTICS_TABLE_SIGNATURE SIGNATURE_32('M', 'S', 'C', 'T') + +/// +/// "NFIT" NVDIMM Firmware Interface Table +/// +#define EFI_ACPI_6_6_NVDIMM_FIRMWARE_INTERFACE_TABLE_STRUCTURE_SIGNATURE SIGNATURE_32('N', 'F', 'I', 'T') + +/// +/// "PDTT" Platform Debug Trigger Table +/// +#define EFI_ACPI_6_6_PLATFORM_DEBUG_TRIGGER_TABLE_STRUCTURE_SIGNATURE SIGNATURE_32('P', 'D', 'T', 'T') + +/// +/// "PMTT" Platform Memory Topology Table +/// +#define EFI_ACPI_6_6_PLATFORM_MEMORY_TOPOLOGY_TABLE_SIGNATURE SIGNATURE_32('P', 'M', 'T', 'T') + +/// +/// "PPTT" Processor Properties Topology Table +/// +#define EFI_ACPI_6_6_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_STRUCTURE_SIGNATURE SIGNATURE_32('P', 'P', 'T', 'T') + +/// +/// "PSDT" Persistent System Description Table +/// +#define EFI_ACPI_6_6_PERSISTENT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE SIGNATURE_32('P', 'S', 'D', 'T') + +/// +/// "RAS2" ACPI RAS2 Feature Table +/// +#define EFI_ACPI_6_6_ACPI_RAS2_FEATURE_TABLE_SIGNATURE SIGNATURE_32('R', 'A', 'S', '2') + +/// +/// "RASF" ACPI RAS Feature Table +/// +#define EFI_ACPI_6_6_ACPI_RAS_FEATURE_TABLE_SIGNATURE SIGNATURE_32('R', 'A', 'S', 'F') + +/// +/// "RSDT" Root System Description Table +/// +#define EFI_ACPI_6_6_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE SIGNATURE_32('R', 'S', 'D', 'T') + +/// +/// "SBST" Smart Battery Specification Table +/// +#define EFI_ACPI_6_6_SMART_BATTERY_SPECIFICATION_TABLE_SIGNATURE SIGNATURE_32('S', 'B', 'S', 'T') + +/// +/// "SDEV" Secure DEVices Table +/// +#define EFI_ACPI_6_6_SECURE_DEVICES_TABLE_SIGNATURE SIGNATURE_32('S', 'D', 'E', 'V') + +/// +/// "SLIT" System Locality Information Table +/// +#define EFI_ACPI_6_6_SYSTEM_LOCALITY_INFORMATION_TABLE_SIGNATURE SIGNATURE_32('S', 'L', 'I', 'T') + +/// +/// "SRAT" System Resource Affinity Table +/// +#define EFI_ACPI_6_6_SYSTEM_RESOURCE_AFFINITY_TABLE_SIGNATURE SIGNATURE_32('S', 'R', 'A', 'T') + +/// +/// "SSDT" Secondary System Description Table +/// +#define EFI_ACPI_6_6_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE SIGNATURE_32('S', 'S', 'D', 'T') + +/// +/// "XSDT" Extended System Description Table +/// +#define EFI_ACPI_6_6_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE SIGNATURE_32('X', 'S', 'D', 'T') + +/// +/// "BOOT" MS Simple Boot Spec +/// +#define EFI_ACPI_6_6_SIMPLE_BOOT_FLAG_TABLE_SIGNATURE SIGNATURE_32('B', 'O', 'O', 'T') + +/// +/// "CSRT" MS Core System Resource Table +/// +#define EFI_ACPI_6_6_CORE_SYSTEM_RESOURCE_TABLE_SIGNATURE SIGNATURE_32('C', 'S', 'R', 'T') + +/// +/// "DBG2" MS Debug Port 2 Spec +/// +#define EFI_ACPI_6_6_DEBUG_PORT_2_TABLE_SIGNATURE SIGNATURE_32('D', 'B', 'G', '2') + +/// +/// "DBGP" MS Debug Port Spec +/// +#define EFI_ACPI_6_6_DEBUG_PORT_TABLE_SIGNATURE SIGNATURE_32('D', 'B', 'G', 'P') + +/// +/// "DMAR" DMA Remapping Table +/// +#define EFI_ACPI_6_6_DMA_REMAPPING_TABLE_SIGNATURE SIGNATURE_32('D', 'M', 'A', 'R') + +/// +/// "DRTM" Dynamic Root of Trust for Measurement Table +/// +#define EFI_ACPI_6_6_DYNAMIC_ROOT_OF_TRUST_FOR_MEASUREMENT_TABLE_SIGNATURE SIGNATURE_32('D', 'R', 'T', 'M') + +/// +/// "ETDT" Event Timer Description Table +/// +#define EFI_ACPI_6_6_EVENT_TIMER_DESCRIPTION_TABLE_SIGNATURE SIGNATURE_32('E', 'T', 'D', 'T') + +/// +/// "HPET" IA-PC High Precision Event Timer Table +/// +#define EFI_ACPI_6_6_HIGH_PRECISION_EVENT_TIMER_TABLE_SIGNATURE SIGNATURE_32('H', 'P', 'E', 'T') + +/// +/// "iBFT" iSCSI Boot Firmware Table +/// +#define EFI_ACPI_6_6_ISCSI_BOOT_FIRMWARE_TABLE_SIGNATURE SIGNATURE_32('i', 'B', 'F', 'T') + +/// +/// "IORT" I/O Remapping Table +/// +#define EFI_ACPI_6_6_IO_REMAPPING_TABLE_SIGNATURE SIGNATURE_32('I', 'O', 'R', 'T') + +/// +/// "IVRS" I/O Virtualization Reporting Structure +/// +#define EFI_ACPI_6_6_IO_VIRTUALIZATION_REPORTING_STRUCTURE_SIGNATURE SIGNATURE_32('I', 'V', 'R', 'S') + +/// +/// "LPIT" Low Power Idle Table +/// +#define EFI_ACPI_6_6_LOW_POWER_IDLE_TABLE_STRUCTURE_SIGNATURE SIGNATURE_32('L', 'P', 'I', 'T') + +/// +/// "MCFG" PCI Express Memory Mapped Configuration Space Base Address Description Table +/// +#define EFI_ACPI_6_6_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE SIGNATURE_32('M', 'C', 'F', 'G') + +/// +/// "MCHI" Management Controller Host Interface Table +/// +#define EFI_ACPI_6_6_MANAGEMENT_CONTROLLER_HOST_INTERFACE_TABLE_SIGNATURE SIGNATURE_32('M', 'C', 'H', 'I') + +/// +/// "MSDM" MS Data Management Table +/// +#define EFI_ACPI_6_6_DATA_MANAGEMENT_TABLE_SIGNATURE SIGNATURE_32('M', 'S', 'D', 'M') + +/// +/// "PCCT" Platform Communications Channel Table +/// +#define EFI_ACPI_6_6_PLATFORM_COMMUNICATIONS_CHANNEL_TABLE_SIGNATURE SIGNATURE_32('P', 'C', 'C', 'T') + +/// +/// "PHAT" Platform Health Assessment Table +/// +#define EFI_ACPI_6_6_PLATFORM_HEALTH_ASSESSMENT_TABLE_SIGNATURE SIGNATURE_32('P', 'H', 'A', 'T') + +/// +/// "SDEI" Software Delegated Exceptions Interface Table +/// +#define EFI_ACPI_6_6_SOFTWARE_DELEGATED_EXCEPTIONS_INTERFACE_TABLE_SIGNATURE SIGNATURE_32('S', 'D', 'E', 'I') + +/// +/// "SLIC" MS Software Licensing Table Specification +/// +#define EFI_ACPI_6_6_SOFTWARE_LICENSING_TABLE_SIGNATURE SIGNATURE_32('S', 'L', 'I', 'C') + +/// +/// "SPCR" Serial Port Concole Redirection Table +/// +#define EFI_ACPI_6_6_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE SIGNATURE_32('S', 'P', 'C', 'R') + +/// +/// "SPMI" Server Platform Management Interface Table +/// +#define EFI_ACPI_6_6_SERVER_PLATFORM_MANAGEMENT_INTERFACE_TABLE_SIGNATURE SIGNATURE_32('S', 'P', 'M', 'I') + +/// +/// "STAO" _STA Override Table +/// +#define EFI_ACPI_6_6_STA_OVERRIDE_TABLE_SIGNATURE SIGNATURE_32('S', 'T', 'A', 'O') + +/// +/// "TCPA" Trusted Computing Platform Alliance Capabilities Table +/// +#define EFI_ACPI_6_6_TRUSTED_COMPUTING_PLATFORM_ALLIANCE_CAPABILITIES_TABLE_SIGNATURE SIGNATURE_32('T', 'C', 'P', 'A') + +/// +/// "TPM2" Trusted Computing Platform 1 Table +/// +#define EFI_ACPI_6_6_TRUSTED_COMPUTING_PLATFORM_2_TABLE_SIGNATURE SIGNATURE_32('T', 'P', 'M', '2') + +/// +/// "UEFI" UEFI ACPI Data Table +/// +#define EFI_ACPI_6_6_UEFI_ACPI_DATA_TABLE_SIGNATURE SIGNATURE_32('U', 'E', 'F', 'I') + +/// +/// "WAET" Windows ACPI Emulated Devices Table +/// +#define EFI_ACPI_6_6_WINDOWS_ACPI_EMULATED_DEVICES_TABLE_SIGNATURE SIGNATURE_32('W', 'A', 'E', 'T') + +/// +/// "WDAT" Watchdog Action Table +/// +#define EFI_ACPI_6_6_WATCHDOG_ACTION_TABLE_SIGNATURE SIGNATURE_32('W', 'D', 'A', 'T') + +/// +/// "WDRT" Watchdog Resource Table +/// +#define EFI_ACPI_6_6_WATCHDOG_RESOURCE_TABLE_SIGNATURE SIGNATURE_32('W', 'D', 'R', 'T') + +/// +/// "WPBT" MS Platform Binary Table +/// +#define EFI_ACPI_6_6_PLATFORM_BINARY_TABLE_SIGNATURE SIGNATURE_32('W', 'P', 'B', 'T') + +/// +/// "WSMT" Windows SMM Security Mitigation Table +/// +#define EFI_ACPI_6_6_WINDOWS_SMM_SECURITY_MITIGATION_TABLE_SIGNATURE SIGNATURE_32('W', 'S', 'M', 'T') + +/// +/// "XENV" Xen Project Table +/// +#define EFI_ACPI_6_6_XEN_PROJECT_TABLE_SIGNATURE SIGNATURE_32('X', 'E', 'N', 'V') + +/// +/// "MPAM" Memory System Resource Partitioning and Monitoring Table +/// +#define EFI_ACPI_MEMORY_SYSTEM_RESOURCE_PARTITIONING_AND_MONITORING_TABLE_SIGNATURE SIGNATURE_32('M', 'P', 'A', 'M') + +#pragma pack() + +#endif From 8d22d1c288970c43ddb103268a875fc2310b19d8 Mon Sep 17 00:00:00 2001 From: Ceping Sun Date: Thu, 30 Nov 2023 00:54:17 -0500 Subject: [PATCH 0097/1172] OvmfPkg/WorkArea.h: Add MAILBOX_GDT Add the GDT table to swicth paging mode when the OS jumps to the ResetVector in Mailbox. Signed-off-by: Ceping Sun Reviewed-by: Min Xu Tested-by: Kirill A. Shutemov --- OvmfPkg/Include/WorkArea.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/OvmfPkg/Include/WorkArea.h b/OvmfPkg/Include/WorkArea.h index e3b415db2caa..3b9ea0463099 100644 --- a/OvmfPkg/Include/WorkArea.h +++ b/OvmfPkg/Include/WorkArea.h @@ -12,6 +12,7 @@ #include #include +#include // // Confidential computing work area header definition. Any change @@ -85,6 +86,11 @@ typedef struct _TDX_MEASUREMENTS_DATA { UINT8 CfvImgHashValue[SHA384_DIGEST_SIZE]; } TDX_MEASUREMENTS_DATA; +#define MAILBOX_GDT_SIZE (sizeof(IA32_SEGMENT_DESCRIPTOR) * 5) +typedef struct _MAILBOX_GDT { + IA32_DESCRIPTOR Gdtr; + UINT8 Data[MAILBOX_GDT_SIZE]; +} MAILBOX_GDT; // // The TDX work area definition // @@ -98,6 +104,7 @@ typedef struct _SEC_TDX_WORK_AREA { typedef struct _TDX_WORK_AREA { CONFIDENTIAL_COMPUTING_WORK_AREA_HEADER Header; SEC_TDX_WORK_AREA SecTdxWorkArea; + MAILBOX_GDT MailboxGdt; } TDX_WORK_AREA; // From 41aaecbf59aba2bacef9bf7c870a5925a7854974 Mon Sep 17 00:00:00 2001 From: Ceping Sun Date: Thu, 12 Jun 2025 23:48:16 -0400 Subject: [PATCH 0098/1172] OvmfPkg: Add the Test command in TDX MailBox Base on ACPI 6.6 MultiProcessor Wakeup Mailbox Structure, the new "Test" command is added. Also the "Sleep" command is not used in TDX Mailbox, it should be removed. Cc: Gerd Hoffmann Cc: Min Xu Cc: Jiewen Yao Cc: Kirill A. Shutemov Signed-off-by: Ceping Sun --- OvmfPkg/Include/IndustryStandard/IntelTdx.h | 7 +++++-- OvmfPkg/Include/TdxCommondefs.inc | 3 +-- OvmfPkg/TdxDxe/X64/ApRunLoop.nasm | 20 +++++++++++++------- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/OvmfPkg/Include/IndustryStandard/IntelTdx.h b/OvmfPkg/Include/IndustryStandard/IntelTdx.h index cc849be2fb59..1151f9edd507 100644 --- a/OvmfPkg/Include/IndustryStandard/IntelTdx.h +++ b/OvmfPkg/Include/IndustryStandard/IntelTdx.h @@ -17,11 +17,14 @@ #define MP_CPU_PROTECTED_MODE_MAILBOX_APICID_INVALID 0xFFFFFFFF #define MP_CPU_PROTECTED_MODE_MAILBOX_APICID_BROADCAST 0xFFFFFFFE +// +// This enum is defined for the use of Intel TDX Guest. +// TDX Guest CPUs wait for below commands and do corresponding tasks. +// typedef enum { MpProtectedModeWakeupCommandNoop = 0, MpProtectedModeWakeupCommandWakeup = 1, - MpProtectedModeWakeupCommandSleep = 2, - MpProtectedModeWakeupCommandAcceptPages = 3, + MpProtectedModeWakeupCommandAcceptPages = 2, } MP_CPU_PROTECTED_MODE_WAKEUP_CMD; #pragma pack(1) diff --git a/OvmfPkg/Include/TdxCommondefs.inc b/OvmfPkg/Include/TdxCommondefs.inc index a29d2fad4233..b49a83017893 100644 --- a/OvmfPkg/Include/TdxCommondefs.inc +++ b/OvmfPkg/Include/TdxCommondefs.inc @@ -41,8 +41,7 @@ ERROR_INVALID_FALLBACK_PAGE_LEVEL equ 3 MpProtectedModeWakeupCommandNoop equ 0 MpProtectedModeWakeupCommandWakeup equ 1 -MpProtectedModeWakeupCommandSleep equ 2 -MpProtectedModeWakeupCommandAcceptPages equ 3 +MpProtectedModeWakeupCommandAcceptPages equ 2 MailboxApicIdInvalid equ 0xffffffff MailboxApicidBroadcast equ 0xfffffffe diff --git a/OvmfPkg/TdxDxe/X64/ApRunLoop.nasm b/OvmfPkg/TdxDxe/X64/ApRunLoop.nasm index 538ae718313f..6e909f7d0294 100644 --- a/OvmfPkg/TdxDxe/X64/ApRunLoop.nasm +++ b/OvmfPkg/TdxDxe/X64/ApRunLoop.nasm @@ -1,5 +1,5 @@ ;------------------------------------------------------------------------------ ; -; Copyright (c) 2021, Intel Corporation. All rights reserved.
+; Copyright (c) 2025, Intel Corporation. All rights reserved.
; SPDX-License-Identifier: BSD-2-Clause-Patent ; ; Module Name: @@ -24,6 +24,11 @@ BITS 64 %define TDVMCALL 0x0 %define EXIT_REASON_CPUID 0xa +; Defined in ACPI 6.6 section 5.2.12.19 MultiProcessor Wakeup Mailbox Command. +%define MULTIPROCESSOR_WAKEUP_MAILBOX_COMMAND_NOOP 0 +%define MULTIPROCESSOR_WAKEUP_MAILBOX_COMMAND_WAKEUP 1 +%define MULTIPROCESSOR_WAKEUP_MAILBOX_COMMAND_TEST 2 + %macro tdcall 0 db 0x66, 0x0f, 0x01, 0xcc %endmacro @@ -74,7 +79,7 @@ AsmRelocateApMailBoxLoopStart: MailBoxLoop: ; Spin until command set - cmp dword [rbx + CommandOffset], MpProtectedModeWakeupCommandNoop + cmp dword [rbx + CommandOffset], MULTIPROCESSOR_WAKEUP_MAILBOX_COMMAND_NOOP je MailBoxLoop ; Determine if this is a broadcast or directly for my apic-id, if not, ignore cmp dword [rbx + ApicidOffset], MailboxApicidBroadcast @@ -82,10 +87,10 @@ MailBoxLoop: cmp dword [rbx + ApicidOffset], r8d jne MailBoxLoop MailBoxProcessCommand: - cmp dword [rbx + CommandOffset], MpProtectedModeWakeupCommandWakeup + cmp dword [rbx + CommandOffset], MULTIPROCESSOR_WAKEUP_MAILBOX_COMMAND_WAKEUP je MailBoxWakeUp - cmp dword [rbx + CommandOffset], MpProtectedModeWakeupCommandSleep - je MailBoxSleep + cmp dword [rbx + CommandOffset], MULTIPROCESSOR_WAKEUP_MAILBOX_COMMAND_TEST + je MailBoxTest ; Don't support this command, so ignore jmp MailBoxLoop MailBoxWakeUp: @@ -94,8 +99,9 @@ MailBoxWakeUp: ; the command field back to zero as acknowledgement. mov qword [rbx + CommandOffset], 0 jmp rax -MailBoxSleep: - jmp $ +MailBoxTest: + mov qword [rbx + CommandOffset], 0 + jmp MailBoxLoop Panic: ud2 BITS 64 From 406f42cb74fbdac1fdf6a90c72fb7b4ca67107ff Mon Sep 17 00:00:00 2001 From: Ceping Sun Date: Thu, 30 Nov 2023 21:00:32 -0500 Subject: [PATCH 0099/1172] OvmfPkg: Add the ResetVector in TDX MailBox Base on ACPI 6.6 Multiprocessor Wakeup Structure, TDVF needs to provide a physical address of the ResetVector to OS. And it should allow the Multiprocessor Wakeup Mailbox to be reset in order to be used once again with a given AP. Signed-off-by: Ceping Sun Reviewed-by: Min Xu Tested-by: Kirill A. Shutemov --- OvmfPkg/Include/IndustryStandard/IntelTdx.h | 1 + OvmfPkg/Library/PlatformInitLib/IntelTdx.c | 5 +- OvmfPkg/TdxDxe/TdxAcpiTable.c | 63 ++++++++++-- OvmfPkg/TdxDxe/TdxAcpiTable.h | 4 +- OvmfPkg/TdxDxe/TdxDxe.inf | 4 + OvmfPkg/TdxDxe/X64/ApRunLoop.nasm | 100 +++++++++++++++++++- 6 files changed, 167 insertions(+), 10 deletions(-) diff --git a/OvmfPkg/Include/IndustryStandard/IntelTdx.h b/OvmfPkg/Include/IndustryStandard/IntelTdx.h index 1151f9edd507..e80688c45946 100644 --- a/OvmfPkg/Include/IndustryStandard/IntelTdx.h +++ b/OvmfPkg/Include/IndustryStandard/IntelTdx.h @@ -63,6 +63,7 @@ typedef struct { typedef struct { UINT8 *RelocateApLoopFuncAddress; UINTN RelocateApLoopFuncSize; + UINT8 *RelocateApResetVector; } MP_RELOCATION_MAP; #pragma pack() diff --git a/OvmfPkg/Library/PlatformInitLib/IntelTdx.c b/OvmfPkg/Library/PlatformInitLib/IntelTdx.c index 12e4501c5b5e..c3e08d881292 100644 --- a/OvmfPkg/Library/PlatformInitLib/IntelTdx.c +++ b/OvmfPkg/Library/PlatformInitLib/IntelTdx.c @@ -186,10 +186,13 @@ PlatformTdxPublishRamRegions ( // work area. We ought to prevent DXE from serving allocation requests // such that they would overlap the work area. // + // Since this memory range will be used by the Reset Vector on Maibox + // wakeup again, it must be reserved as ACPI NVS. + // BuildMemoryAllocationHob ( (EFI_PHYSICAL_ADDRESS)(UINTN)FixedPcdGet32 (PcdOvmfWorkAreaBase), (UINT64)(UINTN)FixedPcdGet32 (PcdOvmfWorkAreaSize), - EfiBootServicesData + EfiACPIMemoryNVS ); } } diff --git a/OvmfPkg/TdxDxe/TdxAcpiTable.c b/OvmfPkg/TdxDxe/TdxAcpiTable.c index d6d6975e5676..4f62d7d729c3 100644 --- a/OvmfPkg/TdxDxe/TdxAcpiTable.c +++ b/OvmfPkg/TdxDxe/TdxAcpiTable.c @@ -28,6 +28,43 @@ #include #include +IA32_SEGMENT_DESCRIPTOR mGdtEntries[] = { + { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, /* 0x0: reserve */ + { + { 0xFFFF, 0, 0, 0xB, 1, 0, 1, 0xF, 0, 0, 1, 1, 0 } + }, /* 0x8: compatibility mode */ + { + { 0xFFFF, 0, 0, 0xB, 1, 0, 1, 0xF, 0, 1, 0, 1, 0 } + }, /* 0x10: for long mode */ + { + { 0xFFFF, 0, 0, 0x3, 1, 0, 1, 0xF, 0, 0, 1, 1, 0 } + }, /* 0x18: data */ + { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }, /* 0x20: reserve */ +}; + +/** + At the beginning of ResetVector in OS, the GDT needs to be reloaded. +**/ +VOID +SetMailboxResetVectorGDT ( + VOID + ) +{ + TDX_WORK_AREA *TdxWorkArea; + + TdxWorkArea = (TDX_WORK_AREA *)(UINTN)FixedPcdGet32 (PcdOvmfWorkAreaBase); + ASSERT (TdxWorkArea != NULL); + ZeroMem ((VOID *)TdxWorkArea->MailboxGdt.Data, sizeof (TdxWorkArea->MailboxGdt.Data)); + + CopyMem ((VOID *)TdxWorkArea->MailboxGdt.Data, (VOID *)mGdtEntries, sizeof (mGdtEntries)); + TdxWorkArea->MailboxGdt.Gdtr.Base = (UINTN)TdxWorkArea->MailboxGdt.Data; + TdxWorkArea->MailboxGdt.Gdtr.Limit = sizeof (mGdtEntries) - 1; +} + /** At the beginning of system boot, a 4K-aligned, 4K-size memory (Td mailbox) is pre-allocated by host VMM. BSP & APs do the page accept together in that memory @@ -37,12 +74,14 @@ memory block which is allocated in the ACPI Nvs memory. APs are waken up and spin around the relocated mailbox for further command. + @param[in, out] ResetVector Pointer to the ResetVector + @return EFI_PHYSICAL_ADDRESS Address of the relocated mailbox **/ EFI_PHYSICAL_ADDRESS EFIAPI RelocateMailbox ( - VOID + EFI_PHYSICAL_ADDRESS *ResetVector ) { EFI_PHYSICAL_ADDRESS Address; @@ -92,6 +131,7 @@ RelocateMailbox ( ApLoopFunc )); + SetMailboxResetVectorGDT (); // // Initialize mailbox // @@ -115,6 +155,13 @@ RelocateMailbox ( 0 ); + *ResetVector = (UINT64)ApLoopFunc + (RelocationMap.RelocateApResetVector - + RelocationMap.RelocateApLoopFuncAddress); + DEBUG (( + DEBUG_INFO, + "Ap Relocation: reset_vector %llx\n", + *ResetVector + )); return Address; } @@ -142,7 +189,8 @@ AlterAcpiTable ( UINT8 *NewMadtTable; UINTN NewMadtTableLength; EFI_PHYSICAL_ADDRESS RelocateMailboxAddress; - EFI_ACPI_6_4_MULTIPROCESSOR_WAKEUP_STRUCTURE *MadtMpWk; + EFI_PHYSICAL_ADDRESS RelocateResetVector; + EFI_ACPI_6_6_MULTIPROCESSOR_WAKEUP_STRUCTURE *MadtMpWk; EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *MadtHeader; Index = 0; @@ -155,7 +203,7 @@ AlterAcpiTable ( return; } - RelocateMailboxAddress = RelocateMailbox (); + RelocateMailboxAddress = RelocateMailbox (&RelocateResetVector); if (RelocateMailboxAddress == 0) { ASSERT (FALSE); DEBUG ((DEBUG_ERROR, "Failed to relocate Td mailbox\n")); @@ -172,7 +220,7 @@ AlterAcpiTable ( break; } - NewMadtTableLength = Table->Length + sizeof (EFI_ACPI_6_4_MULTIPROCESSOR_WAKEUP_STRUCTURE); + NewMadtTableLength = Table->Length + sizeof (EFI_ACPI_6_6_MULTIPROCESSOR_WAKEUP_STRUCTURE); NewMadtTable = AllocatePool (NewMadtTableLength); if (NewMadtTable == NULL) { DEBUG ((DEBUG_ERROR, "%a: OUT_OF_SOURCES error.\n", __func__)); @@ -183,12 +231,13 @@ AlterAcpiTable ( MadtHeader = (EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *)NewMadtTable; MadtHeader->Header.Length = (UINT32)NewMadtTableLength; - MadtMpWk = (EFI_ACPI_6_4_MULTIPROCESSOR_WAKEUP_STRUCTURE *)(NewMadtTable + Table->Length); + MadtMpWk = (EFI_ACPI_6_6_MULTIPROCESSOR_WAKEUP_STRUCTURE *)(NewMadtTable + Table->Length); MadtMpWk->Type = EFI_ACPI_6_4_MULTIPROCESSOR_WAKEUP; - MadtMpWk->Length = sizeof (EFI_ACPI_6_4_MULTIPROCESSOR_WAKEUP_STRUCTURE); - MadtMpWk->MailBoxVersion = 0; + MadtMpWk->Length = sizeof (EFI_ACPI_6_6_MULTIPROCESSOR_WAKEUP_STRUCTURE); + MadtMpWk->MailBoxVersion = 1; MadtMpWk->Reserved = 0; MadtMpWk->MailBoxAddress = RelocateMailboxAddress; + MadtMpWk->ResetVector = RelocateResetVector; Status = AcpiTableProtocol->InstallAcpiTable (AcpiTableProtocol, NewMadtTable, NewMadtTableLength, &NewTableKey); if (EFI_ERROR (Status)) { diff --git a/OvmfPkg/TdxDxe/TdxAcpiTable.h b/OvmfPkg/TdxDxe/TdxAcpiTable.h index 6b7615dc3687..6081665ffa0f 100644 --- a/OvmfPkg/TdxDxe/TdxAcpiTable.h +++ b/OvmfPkg/TdxDxe/TdxAcpiTable.h @@ -18,6 +18,8 @@ #include #include #include +#include + #include #include @@ -41,7 +43,7 @@ AsmGetRelocationMap ( EFI_PHYSICAL_ADDRESS EFIAPI RelocateMailbox ( - VOID + EFI_PHYSICAL_ADDRESS *ResetVector ); /** diff --git a/OvmfPkg/TdxDxe/TdxDxe.inf b/OvmfPkg/TdxDxe/TdxDxe.inf index 9793562884c7..69e4c0bfa54e 100644 --- a/OvmfPkg/TdxDxe/TdxDxe.inf +++ b/OvmfPkg/TdxDxe/TdxDxe.inf @@ -71,3 +71,7 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved gUefiOvmfPkgTokenSpaceGuid.PcdTdxAcceptPageSize + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize diff --git a/OvmfPkg/TdxDxe/X64/ApRunLoop.nasm b/OvmfPkg/TdxDxe/X64/ApRunLoop.nasm index 6e909f7d0294..e99d735b00be 100644 --- a/OvmfPkg/TdxDxe/X64/ApRunLoop.nasm +++ b/OvmfPkg/TdxDxe/X64/ApRunLoop.nasm @@ -16,8 +16,18 @@ DEFAULT REL +SECTION .bss +global STACK_BASE +STACK_BASE: + resb 1024 +STACK_TOP: + SECTION .text +%define TDX_WORK_AREA_MAILBOX_GDTR (FixedPcdGet32 (PcdOvmfWorkAreaBase) + 128) + +%define PT_ADDR(Offset) (FixedPcdGet32 (PcdOvmfSecPageTablesBase) + (Offset)) + BITS 64 %define TDVMCALL_EXPOSE_REGS_MASK 0xffc4 @@ -76,6 +86,7 @@ AsmRelocateApMailBoxLoopStart: test r10, r10 jnz Panic mov r8, r15 + mov qword[rel mailbox_address], rbx MailBoxLoop: ; Spin until command set @@ -104,6 +115,91 @@ MailBoxTest: jmp MailBoxLoop Panic: ud2 + +AsmRelocateApResetVector: + +.prepareStack: + ; The stack can then be used to switch from long mode to compatibility mode + mov rsp, STACK_TOP + +.loadGDT: + cli + mov rax, TDX_WORK_AREA_MAILBOX_GDTR + lgdt [rax] + +.loadSwicthModeCode: + mov rcx, dword 0x10 ; load long mode selector + shl rcx, 32 + lea rdx, [LongMode] ; assume address < 4G + or rcx, rdx + push rcx + + mov rcx, dword 0x08 ; load compatible mode selector + shl rcx, 32 + lea rdx, [Compatible] ; assume address < 4G + or rcx, rdx + push rcx + retf + +BITS 32 +Compatible: + mov eax, dword 0x18 +; ; reload DS/ES/SS to make sure they are correct referred to current GDT + mov ds, ax + mov es, ax + mov ss, ax + ; reload the fs and gs + mov fs, ax + mov gs, ax + + ; Must clear the CR4.PCIDE before clearing paging + mov ecx, cr4 + btc ecx, 17 + mov cr4, ecx + ; + ; Disable paging + ; + mov ecx, cr0 + btc ecx, 31 + mov cr0, ecx + ; +RestoreCr0: + ; Only enable PE(bit 0), NE(bit 5), ET(bit 4) 0x31 + mov eax, dword 0x31 + mov cr0, eax + + + ; Only Enable MCE(bit 6), VMXE(bit 13) 0x2040 + ; TDX enforeced the VMXE = 1 and mask it in VMM, so not set it. +RestoreCr4: + mov eax, 0x40 + mov cr4, eax +SetCr3: + ; + ; Can use the boot page tables since it's reserved + + mov eax, PT_ADDR (0) + mov cr3, eax + +EnablePAE: + mov eax, cr4 + bts eax, 5 + mov cr4, eax + +EnablePaging: + mov eax, cr0 + bts eax, 31 ; set PG + mov cr0, eax ; enable paging + ; return to LongMode + retf + +BITS 64 +LongMode: + mov rbx, qword[rel mailbox_address] + jmp AsmRelocateApMailBoxLoopStart +align 16 +mailbox_address: + dq 0 BITS 64 AsmRelocateApMailBoxLoopEnd: @@ -112,8 +208,10 @@ AsmRelocateApMailBoxLoopEnd: ;------------------------------------------------------------------------------------- global ASM_PFX(AsmGetRelocationMap) ASM_PFX(AsmGetRelocationMap): + ; mov byte[TDX_WORK_AREA_MB_PGTBL_READY], 0 lea rax, [AsmRelocateApMailBoxLoopStart] mov qword [rcx], rax mov qword [rcx + 8h], AsmRelocateApMailBoxLoopEnd - AsmRelocateApMailBoxLoopStart + lea rax, [AsmRelocateApResetVector] + mov qword [rcx + 10h], rax ret - From 92c714f8b7482f69f6f66bf78b884feacec66fa1 Mon Sep 17 00:00:00 2001 From: Ceping Sun Date: Tue, 2 Apr 2024 07:13:40 +0800 Subject: [PATCH 0100/1172] OvmfPkg/TdxDxe: Support 5-level paging for ResetVector Since OVMF already supports 5-level paging, the ResetVector needs to handle the case. Cc: Gerd Hoffmann Cc: Min Xu Cc: Jiewen Yao Cc: Kirill A. Shutemov Signed-off-by: Ceping Sun --- OvmfPkg/TdxDxe/TdxDxe.inf | 1 + OvmfPkg/TdxDxe/X64/ApRunLoop.nasm | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/TdxDxe/TdxDxe.inf b/OvmfPkg/TdxDxe/TdxDxe.inf index 69e4c0bfa54e..9af67952c07b 100644 --- a/OvmfPkg/TdxDxe/TdxDxe.inf +++ b/OvmfPkg/TdxDxe/TdxDxe.inf @@ -75,3 +75,4 @@ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize + gEfiMdeModulePkgTokenSpaceGuid.PcdUse5LevelPageTable diff --git a/OvmfPkg/TdxDxe/X64/ApRunLoop.nasm b/OvmfPkg/TdxDxe/X64/ApRunLoop.nasm index e99d735b00be..62474fde398c 100644 --- a/OvmfPkg/TdxDxe/X64/ApRunLoop.nasm +++ b/OvmfPkg/TdxDxe/X64/ApRunLoop.nasm @@ -25,8 +25,13 @@ STACK_TOP: SECTION .text %define TDX_WORK_AREA_MAILBOX_GDTR (FixedPcdGet32 (PcdOvmfWorkAreaBase) + 128) +%define PT_ADDR(Offset) (FixedPcdGet32 (PcdOvmfSecPageTablesBase) + (Offset)) +%define TDX_WORK_AREA_PGTBL_READY (FixedPcdGet32 (PcdOvmfWorkAreaBase) + 4) +%define PG_5_LEVEL (FixedPcdGetBool (PcdUse5LevelPageTable)) -%define PT_ADDR(Offset) (FixedPcdGet32 (PcdOvmfSecPageTablesBase) + (Offset)) +%define TDX_BSP 1 +%define TDX_AP 2 +%define TDX_AP_5_LEVEL 3 BITS 64 @@ -174,6 +179,19 @@ RestoreCr0: RestoreCr4: mov eax, 0x40 mov cr4, eax + +%if PG_5_LEVEL + mov al, byte[TDX_WORK_AREA_PGTBL_READY] + inc eax + cmp eax, TDX_AP_5_LEVEL + jne SetCr3 +SetCr4La57: + ; set la57 bit in cr4 + mov eax, cr4 + bts eax, 12 + mov cr4, eax +%endif + SetCr3: ; ; Can use the boot page tables since it's reserved From bbee92c9af59e877f9a5028140e600571faea181 Mon Sep 17 00:00:00 2001 From: Wei6 Xu Date: Thu, 19 Jun 2025 13:58:02 +0800 Subject: [PATCH 0101/1172] UefiCpuPkg/PiSmmCpuDxeSmm: Add sync barrier before BSP invokes SmmCoreEntry This patch introduces a synchronization point between the BSP and APs to ensure all APs have entered their SMM wait-loop (while (TRUE) in APHandler ()) before the BSP calls into the SMI handler logic via gSmmCpuPrivate ->SmmCoreEntry(). Previously, the BSP would invoke ReleaseAllAPs() and immediately proceed to SmmCoreEntry() without confirming whether APs had reached the stable waiting state. If SmmStartupThisAp() was called inside the SMI handler shortly after ReleaseAllAPs(), it might lead to a race condition: APs are issued two consecutive wait signals (SmmCpuSyncWaitForBsp()). BSP sends two consecutive releases (ReleaseAllAPs() + SmmStartupThisAp()) If an AP has not yet responded to the first release, the second release may overwrite the semaphore state, and the AP might miss the notification, causing it to hang or behave unpredictably. To address this: A SmmCpuSyncWaitForAPs() is added in BSP after mmCpuPlatformHookBeforeMmiHandler() and before entering SmmCoreEntry(). A matching SmmCpuSyncReleaseBsp() is added in AP immediately after its own SmmCpuPlatformHookBeforeMmiHandler() This ensures that BSP does not enter SMI handler logic or dispatch any AP-related requests before all APs are confirmed to be idle and ready. Debug sync point markers (e.g., /// #6, #7) are updated accordingly. This change eliminates a subtle but critical race condition in multi-processor/multi-socket systems during SMM entry and improves overall synchronization safety. Signed-off-by: Wei6 Xu --- UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 44 +++++++++++++++++++-------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c index 7bc68087adff..22f813a5d9d9 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c @@ -561,6 +561,11 @@ BSPHandler ( // Wait for all APs to complete their MTRR programming // SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #5: Wait APs + + // + // Notify all APs to continue + // + ReleaseAllAPs (); /// #6: Signal APs } } @@ -569,6 +574,11 @@ BSPHandler ( // SmmCpuPlatformHookBeforeMmiHandler (); + // + // Wait for all APs of arrival at this point + // + SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #7: Wait APs + // // The BUSY lock is initialized to Acquired state // @@ -630,18 +640,18 @@ BSPHandler ( // Notify all APs to exit // *mSmmMpSyncData->InsideSmm = FALSE; - ReleaseAllAPs (); /// #6: Signal APs + ReleaseAllAPs (); /// #8: Signal APs if (SmmCpuFeaturesNeedConfigureMtrrs ()) { // // Wait for all APs the readiness to program MTRRs // - SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #7: Wait APs + SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #9: Wait APs // // Signal APs to restore MTRRs // - ReleaseAllAPs (); /// #8: Signal APs + ReleaseAllAPs (); /// #10: Signal APs // // Restore OS MTRRs @@ -654,12 +664,12 @@ BSPHandler ( // // Wait for all APs to complete their pending tasks including MTRR programming if needed. // - SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #9: Wait APs + SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #11: Wait APs // // Signal APs to Reset states/semaphore for this processor // - ReleaseAllAPs (); /// #10: Signal APs + ReleaseAllAPs (); /// #12: Signal APs } if (mSmmDebugAgentSupport) { @@ -684,7 +694,7 @@ BSPHandler ( // Gather APs to exit SMM synchronously. Note the Present flag is cleared by now but // WaitForAllAps does not depend on the Present flag. // - SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #11: Wait APs + SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #13: Wait APs // // At this point, all APs should have exited from APHandler(). @@ -845,6 +855,11 @@ APHandler ( // Signal BSP the completion of this AP // SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #5: Signal BSP + + // + // Wait for BSP's signal to continue + // + SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #6: Wait BSP } // @@ -852,11 +867,16 @@ APHandler ( // SmmCpuPlatformHookBeforeMmiHandler (); + // + // Notify BSP of arrival at this point + // + SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #7: Signal BSP + while (TRUE) { // // Wait for something to happen // - SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #6: Wait BSP + SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #8: Wait BSP // // Check if BSP wants to exit SMM @@ -896,12 +916,12 @@ APHandler ( // // Notify BSP the readiness of this AP to program MTRRs // - SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #7: Signal BSP + SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #9: Signal BSP // // Wait for the signal from BSP to program MTRRs // - SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #8: Wait BSP + SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #10: Wait BSP // // Restore OS MTRRs @@ -914,12 +934,12 @@ APHandler ( // // Notify BSP the readiness of this AP to Reset states/semaphore for this processor // - SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #9: Signal BSP + SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #11: Signal BSP // // Wait for the signal from BSP to Reset states/semaphore for this processor // - SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #10: Wait BSP + SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #12: Wait BSP } // @@ -930,7 +950,7 @@ APHandler ( // // Notify BSP the readiness of this AP to exit SMM // - SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #11: Signal BSP + SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #13: Signal BSP } /** From f93e6a074326ba0d4649990aa3337c845311e9b2 Mon Sep 17 00:00:00 2001 From: Leif Lindholm Date: Tue, 24 Jun 2025 15:58:26 +0100 Subject: [PATCH 0102/1172] Revert "UefiCpuPkg/PiSmmCpuDxeSmm: Add sync barrier before BSP invokes ..." PR #11210 introduced Commit bbee92c9af59, ("UefiCpuPkg/PiSmmCpuDxeSmm: Add sync barrier before BSP invokes SmmCoreEntry") which causes a boot failure in OVMF_X64_MMDEBUG targets, breaking upstream CI. Revert it. Signed-off-by: Leif Lindholm --- UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 44 ++++++++------------------- 1 file changed, 12 insertions(+), 32 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c index 22f813a5d9d9..7bc68087adff 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c @@ -561,11 +561,6 @@ BSPHandler ( // Wait for all APs to complete their MTRR programming // SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #5: Wait APs - - // - // Notify all APs to continue - // - ReleaseAllAPs (); /// #6: Signal APs } } @@ -574,11 +569,6 @@ BSPHandler ( // SmmCpuPlatformHookBeforeMmiHandler (); - // - // Wait for all APs of arrival at this point - // - SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #7: Wait APs - // // The BUSY lock is initialized to Acquired state // @@ -640,18 +630,18 @@ BSPHandler ( // Notify all APs to exit // *mSmmMpSyncData->InsideSmm = FALSE; - ReleaseAllAPs (); /// #8: Signal APs + ReleaseAllAPs (); /// #6: Signal APs if (SmmCpuFeaturesNeedConfigureMtrrs ()) { // // Wait for all APs the readiness to program MTRRs // - SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #9: Wait APs + SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #7: Wait APs // // Signal APs to restore MTRRs // - ReleaseAllAPs (); /// #10: Signal APs + ReleaseAllAPs (); /// #8: Signal APs // // Restore OS MTRRs @@ -664,12 +654,12 @@ BSPHandler ( // // Wait for all APs to complete their pending tasks including MTRR programming if needed. // - SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #11: Wait APs + SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #9: Wait APs // // Signal APs to Reset states/semaphore for this processor // - ReleaseAllAPs (); /// #12: Signal APs + ReleaseAllAPs (); /// #10: Signal APs } if (mSmmDebugAgentSupport) { @@ -694,7 +684,7 @@ BSPHandler ( // Gather APs to exit SMM synchronously. Note the Present flag is cleared by now but // WaitForAllAps does not depend on the Present flag. // - SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #13: Wait APs + SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #11: Wait APs // // At this point, all APs should have exited from APHandler(). @@ -855,11 +845,6 @@ APHandler ( // Signal BSP the completion of this AP // SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #5: Signal BSP - - // - // Wait for BSP's signal to continue - // - SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #6: Wait BSP } // @@ -867,16 +852,11 @@ APHandler ( // SmmCpuPlatformHookBeforeMmiHandler (); - // - // Notify BSP of arrival at this point - // - SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #7: Signal BSP - while (TRUE) { // // Wait for something to happen // - SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #8: Wait BSP + SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #6: Wait BSP // // Check if BSP wants to exit SMM @@ -916,12 +896,12 @@ APHandler ( // // Notify BSP the readiness of this AP to program MTRRs // - SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #9: Signal BSP + SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #7: Signal BSP // // Wait for the signal from BSP to program MTRRs // - SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #10: Wait BSP + SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #8: Wait BSP // // Restore OS MTRRs @@ -934,12 +914,12 @@ APHandler ( // // Notify BSP the readiness of this AP to Reset states/semaphore for this processor // - SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #11: Signal BSP + SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #9: Signal BSP // // Wait for the signal from BSP to Reset states/semaphore for this processor // - SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #12: Wait BSP + SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #10: Wait BSP } // @@ -950,7 +930,7 @@ APHandler ( // // Notify BSP the readiness of this AP to exit SMM // - SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #13: Signal BSP + SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #11: Signal BSP } /** From b4e5860fd5f722cc849265f1fa4ea20b4071fa1d Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 18 Jun 2025 17:58:33 -0700 Subject: [PATCH 0103/1172] UnitTestFrameworkPkg/GoogleTestLib: Enhance unit test NULL checks gtest.h uses standard includes that define NULL to __null. This is different that the C++ standard that uses nullptr. Redefine NULL in GoogleTestLib.h to use C++ form of nullptr. This allows NULL to be used in checks and mocks without explicit typecasts. Signed-off-by: Michael D Kinney --- UnitTestFrameworkPkg/Include/Library/GoogleTestLib.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/UnitTestFrameworkPkg/Include/Library/GoogleTestLib.h b/UnitTestFrameworkPkg/Include/Library/GoogleTestLib.h index b8405cee8ee1..951bbb81020f 100644 --- a/UnitTestFrameworkPkg/Include/Library/GoogleTestLib.h +++ b/UnitTestFrameworkPkg/Include/Library/GoogleTestLib.h @@ -13,6 +13,15 @@ #include #include +// +// For all use of GoogleTestLib, make sure NULL is defined to nullptr to +// support matching any unit test pointer value to NULL. +// +#ifdef NULL + #undef NULL +#define NULL nullptr +#endif + using ::testing::Throws; using ::testing::ThrowsMessage; using ::testing::HasSubstr; From 272c1b2b5f9881c63bde369579116242d639f1b1 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 18 Jun 2025 17:59:36 -0700 Subject: [PATCH 0104/1172] UnitTestFrameworkPkg: Add -pie to ASLCC_FLAGS for unit tests For Linux/GCC host-based unit tests, -fno-pei is added to CC_FLAGS and this causes builds of .aslc/.act files for ACPI tables used in host-based unit tests to fail. Add -fpie to ASLCC_FLAGS in UnitTestFrameworkPkgHost.dsc.inc to override this CC_FLAGS setting and resolve the build issue. Signed-off-by: Michael D Kinney --- UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc | 1 + 1 file changed, 1 insertion(+) diff --git a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc index 3777d87e726d..e257ce5ff95f 100644 --- a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc +++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc @@ -32,6 +32,7 @@ [BuildOptions] MSFT:*_*_*_CC_FLAGS = /MTd GCC:*_*_*_CC_FLAGS = -fno-pie + GCC:*_*_*_ASLCC_FLAGS = -fpie !if $(UNIT_TESTING_ADDRESS_SANITIZER_ENABLE) # # Enable Address Sanitizer for VS2019, VS2022, and GCC From 3f278768fab371ca2d9d2515a85894f8ee3194f9 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 18 Jun 2025 22:05:23 -0700 Subject: [PATCH 0105/1172] BaseTools/HostBasedUnitTestRunner: lcov ignore mismatch errors Ignore mismatch errors for lcov 2.x in all locations that lcov is run. When building more complex unit tests, these mismatch errors are showing up in different phases of the code coverage collection. Signed-off-by: Michael D Kinney --- .../HostBasedUnitTestRunner/HostBasedUnitTestRunner.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/BaseTools/Plugin/HostBasedUnitTestRunner/HostBasedUnitTestRunner.py b/BaseTools/Plugin/HostBasedUnitTestRunner/HostBasedUnitTestRunner.py index c39dae236c9b..91425f1ddf17 100644 --- a/BaseTools/Plugin/HostBasedUnitTestRunner/HostBasedUnitTestRunner.py +++ b/BaseTools/Plugin/HostBasedUnitTestRunner/HostBasedUnitTestRunner.py @@ -174,21 +174,21 @@ def gen_code_coverage_gcc(self, thebuilder): logging.info(f"Got lcov version {lcov_version_major}") # Generate base code coverage for all source files - ret = RunCmd("lcov", f"--no-external --capture --initial --directory {buildOutputBase} --output-file {buildOutputBase}/cov-base.info --rc lcov_branch_coverage=1") + # `--ignore-errors mismatch` needed to make lcov v2.0+/gcov work. + lcov_error_settings = "--ignore-errors mismatch" if lcov_version_major >= 2 else "" + ret = RunCmd("lcov", f"--no-external --capture --initial --directory {buildOutputBase} --output-file {buildOutputBase}/cov-base.info --rc lcov_branch_coverage=1 {lcov_error_settings}") if ret != 0: logging.error("UnitTest Coverage: Failed to build initial coverage data.") return 1 # Coverage data for tested files only - # `--ignore-errors mismatch` needed to make lcov v2.0+/gcov work. - lcov_error_settings = "--ignore-errors mismatch" if lcov_version_major >= 2 else "" ret = RunCmd("lcov", f"--capture --directory {buildOutputBase}/ --output-file {buildOutputBase}/coverage-test.info --rc lcov_branch_coverage=1 {lcov_error_settings}") if ret != 0: logging.error("UnitTest Coverage: Failed to build coverage data for tested files.") return 1 # Aggregate all coverage data - ret = RunCmd("lcov", f"--add-tracefile {buildOutputBase}/cov-base.info --add-tracefile {buildOutputBase}/coverage-test.info --output-file {buildOutputBase}/total-coverage.info --rc lcov_branch_coverage=1") + ret = RunCmd("lcov", f"--add-tracefile {buildOutputBase}/cov-base.info --add-tracefile {buildOutputBase}/coverage-test.info --output-file {buildOutputBase}/total-coverage.info --rc lcov_branch_coverage=1 {lcov_error_settings}") if ret != 0: logging.error("UnitTest Coverage: Failed to aggregate coverage data.") return 1 @@ -211,7 +211,7 @@ def gen_code_coverage_gcc(self, thebuilder): coverageFile = "" for testCoverage in testCoverageList: coverageFile += " --add-tracefile " + testCoverage - ret = RunCmd("lcov", f"{coverageFile} --output-file {workspace}/Build/all-coverage.info --rc lcov_branch_coverage=1") + ret = RunCmd("lcov", f"{coverageFile} --output-file {workspace}/Build/all-coverage.info --rc lcov_branch_coverage=1 {lcov_error_settings}") if ret != 0: logging.error("UnitTest Coverage: Failed generate all coverage file.") return 1 From 50dc5f2f31e144283413f92521d02aa8ce2dc993 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 19 Jun 2025 14:42:17 -0700 Subject: [PATCH 0106/1172] BaseTools/GetFw: Skip R_X86_64_NONE relocations Building .aslc files in a module for host-based unit testing in Linux/GCC X64 environments may introduce relocations for a symbol in a shared library from lcov or asan. Update logic to not generate an error message and exit if the symbol is unknown but the relocation type is R_X86_64_NONE. Signed-off-by: Michael D Kinney --- BaseTools/Source/C/GenFw/Elf64Convert.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c b/BaseTools/Source/C/GenFw/Elf64Convert.c index 6919e188090b..18594122eaa1 100644 --- a/BaseTools/Source/C/GenFw/Elf64Convert.c +++ b/BaseTools/Source/C/GenFw/Elf64Convert.c @@ -1398,6 +1398,18 @@ WriteSections64 ( SymName = (const UINT8 *)""; } + if (mEhdr->e_machine == EM_X86_64) { + // + // For x86_64, we can ignore R_X86_64_NONE relocations. + // They are used to indicate that the symbol is not defined + // in the current module, but in a shared library that may be + // used when building modules for inclusion in host-based unit tests. + // + if (ELF_R_TYPE(Rel->r_info) == R_X86_64_NONE) { + continue; + } + } + // // Skip error on EM_RISCV64 and EM_LOONGARCH because no symbol name is built // from RISC-V and LoongArch toolchain. From ecdab102c8495f0daec570f8f8637a807d27e433 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 19 Jun 2025 21:08:40 -0700 Subject: [PATCH 0107/1172] DynamicTablesPkg: Use Library/GoogleTestLib.h Update unit tests to use GoogleTestLib.h instead of gtest.h so the edk2 extensions for google tests are always available. Signed-off-by: Michael D Kinney --- .../Common/AcpiCedtLib/GoogleTest/CedtGeneratorGoogleTest.cpp | 2 -- .../Common/AcpiDbg2Lib/GoogleTest/Dbg2GeneratorGoogleTest.cpp | 2 -- 2 files changed, 4 deletions(-) diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiCedtLib/GoogleTest/CedtGeneratorGoogleTest.cpp b/DynamicTablesPkg/Library/Acpi/Common/AcpiCedtLib/GoogleTest/CedtGeneratorGoogleTest.cpp index 4fbdcf7dbc9b..2754722d56d5 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiCedtLib/GoogleTest/CedtGeneratorGoogleTest.cpp +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiCedtLib/GoogleTest/CedtGeneratorGoogleTest.cpp @@ -6,8 +6,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#include -#include #include extern "C" { diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/GoogleTest/Dbg2GeneratorGoogleTest.cpp b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/GoogleTest/Dbg2GeneratorGoogleTest.cpp index 1d7b9c2cd055..e882e87ee595 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/GoogleTest/Dbg2GeneratorGoogleTest.cpp +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/GoogleTest/Dbg2GeneratorGoogleTest.cpp @@ -6,8 +6,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#include -#include #include extern "C" { From 953b9d0e574126fb0242112d6ee47d812db20d91 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 19 Jun 2025 21:08:53 -0700 Subject: [PATCH 0108/1172] MdePkg: Use Library/GoogleTestLib.h Update unit tests to use GoogleTestLib.h instead of gtest.h so the edk2 extensions for google tests are always available. Signed-off-by: Michael D Kinney --- MdePkg/Test/GoogleTest/Library/BaseLib/TestBaseLibMain.cpp | 2 +- MdePkg/Test/GoogleTest/Library/BaseLib/TestCheckSum.cpp | 2 +- .../Library/BaseSafeIntLib/SafeIntLibUintnIntnUnitTests32.cpp | 2 +- .../Library/BaseSafeIntLib/SafeIntLibUintnIntnUnitTests64.cpp | 2 +- .../GoogleTest/Library/BaseSafeIntLib/TestBaseSafeIntLib.cpp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/MdePkg/Test/GoogleTest/Library/BaseLib/TestBaseLibMain.cpp b/MdePkg/Test/GoogleTest/Library/BaseLib/TestBaseLibMain.cpp index 2f941c7ffa18..13d72c16393b 100644 --- a/MdePkg/Test/GoogleTest/Library/BaseLib/TestBaseLibMain.cpp +++ b/MdePkg/Test/GoogleTest/Library/BaseLib/TestBaseLibMain.cpp @@ -5,7 +5,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#include +#include int main ( diff --git a/MdePkg/Test/GoogleTest/Library/BaseLib/TestCheckSum.cpp b/MdePkg/Test/GoogleTest/Library/BaseLib/TestCheckSum.cpp index 1f4f73a88b9d..60560635cc57 100644 --- a/MdePkg/Test/GoogleTest/Library/BaseLib/TestCheckSum.cpp +++ b/MdePkg/Test/GoogleTest/Library/BaseLib/TestCheckSum.cpp @@ -5,7 +5,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#include +#include extern "C" { #include #include diff --git a/MdePkg/Test/GoogleTest/Library/BaseSafeIntLib/SafeIntLibUintnIntnUnitTests32.cpp b/MdePkg/Test/GoogleTest/Library/BaseSafeIntLib/SafeIntLibUintnIntnUnitTests32.cpp index 3f50f0cd99db..20e53a91b27a 100644 --- a/MdePkg/Test/GoogleTest/Library/BaseSafeIntLib/SafeIntLibUintnIntnUnitTests32.cpp +++ b/MdePkg/Test/GoogleTest/Library/BaseSafeIntLib/SafeIntLibUintnIntnUnitTests32.cpp @@ -8,7 +8,7 @@ **/ -#include +#include extern "C" { #include #include diff --git a/MdePkg/Test/GoogleTest/Library/BaseSafeIntLib/SafeIntLibUintnIntnUnitTests64.cpp b/MdePkg/Test/GoogleTest/Library/BaseSafeIntLib/SafeIntLibUintnIntnUnitTests64.cpp index 6efdd3be7c5e..3b6c6bf743c8 100644 --- a/MdePkg/Test/GoogleTest/Library/BaseSafeIntLib/SafeIntLibUintnIntnUnitTests64.cpp +++ b/MdePkg/Test/GoogleTest/Library/BaseSafeIntLib/SafeIntLibUintnIntnUnitTests64.cpp @@ -8,7 +8,7 @@ **/ -#include +#include extern "C" { #include #include diff --git a/MdePkg/Test/GoogleTest/Library/BaseSafeIntLib/TestBaseSafeIntLib.cpp b/MdePkg/Test/GoogleTest/Library/BaseSafeIntLib/TestBaseSafeIntLib.cpp index 857ab4d1d36c..f584b86804df 100644 --- a/MdePkg/Test/GoogleTest/Library/BaseSafeIntLib/TestBaseSafeIntLib.cpp +++ b/MdePkg/Test/GoogleTest/Library/BaseSafeIntLib/TestBaseSafeIntLib.cpp @@ -6,7 +6,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#include +#include extern "C" { #include #include From 36a71d088b354d5a5a1e38778ead41a39ce1fc18 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 19 Jun 2025 21:09:09 -0700 Subject: [PATCH 0109/1172] NetworkPkg: Use Library/GoogleTestLib.h Update unit tests to use GoogleTestLib.h instead of gtest.h so the edk2 extensions for google tests are always available. Signed-off-by: Michael D Kinney --- NetworkPkg/Dhcp6Dxe/GoogleTest/Dhcp6DxeGoogleTest.cpp | 2 +- NetworkPkg/Dhcp6Dxe/GoogleTest/Dhcp6IoGoogleTest.cpp | 2 +- NetworkPkg/Ip6Dxe/GoogleTest/Ip6DxeGoogleTest.cpp | 2 +- NetworkPkg/Ip6Dxe/GoogleTest/Ip6OptionGoogleTest.cpp | 2 +- NetworkPkg/UefiPxeBcDxe/GoogleTest/UefiPxeBcDxeGoogleTest.cpp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/NetworkPkg/Dhcp6Dxe/GoogleTest/Dhcp6DxeGoogleTest.cpp b/NetworkPkg/Dhcp6Dxe/GoogleTest/Dhcp6DxeGoogleTest.cpp index 9aeced2f9156..5604c4bddab9 100644 --- a/NetworkPkg/Dhcp6Dxe/GoogleTest/Dhcp6DxeGoogleTest.cpp +++ b/NetworkPkg/Dhcp6Dxe/GoogleTest/Dhcp6DxeGoogleTest.cpp @@ -4,7 +4,7 @@ Copyright (c) Microsoft Corporation SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#include +#include //////////////////////////////////////////////////////////////////////////////// // Run the tests diff --git a/NetworkPkg/Dhcp6Dxe/GoogleTest/Dhcp6IoGoogleTest.cpp b/NetworkPkg/Dhcp6Dxe/GoogleTest/Dhcp6IoGoogleTest.cpp index 5998d481f65c..dc0366920953 100644 --- a/NetworkPkg/Dhcp6Dxe/GoogleTest/Dhcp6IoGoogleTest.cpp +++ b/NetworkPkg/Dhcp6Dxe/GoogleTest/Dhcp6IoGoogleTest.cpp @@ -4,7 +4,7 @@ Copyright (c) Microsoft Corporation SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#include +#include extern "C" { #include diff --git a/NetworkPkg/Ip6Dxe/GoogleTest/Ip6DxeGoogleTest.cpp b/NetworkPkg/Ip6Dxe/GoogleTest/Ip6DxeGoogleTest.cpp index 6ebfd5fdfb70..92472e032e6f 100644 --- a/NetworkPkg/Ip6Dxe/GoogleTest/Ip6DxeGoogleTest.cpp +++ b/NetworkPkg/Ip6Dxe/GoogleTest/Ip6DxeGoogleTest.cpp @@ -4,7 +4,7 @@ Copyright (c) Microsoft Corporation SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#include +#include //////////////////////////////////////////////////////////////////////////////// // Run the tests diff --git a/NetworkPkg/Ip6Dxe/GoogleTest/Ip6OptionGoogleTest.cpp b/NetworkPkg/Ip6Dxe/GoogleTest/Ip6OptionGoogleTest.cpp index 29f8a4a96e4c..ac982824cd53 100644 --- a/NetworkPkg/Ip6Dxe/GoogleTest/Ip6OptionGoogleTest.cpp +++ b/NetworkPkg/Ip6Dxe/GoogleTest/Ip6OptionGoogleTest.cpp @@ -4,7 +4,7 @@ Copyright (c) Microsoft Corporation SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#include +#include extern "C" { #include diff --git a/NetworkPkg/UefiPxeBcDxe/GoogleTest/UefiPxeBcDxeGoogleTest.cpp b/NetworkPkg/UefiPxeBcDxe/GoogleTest/UefiPxeBcDxeGoogleTest.cpp index cc4fdf525b62..b14e4d25c518 100644 --- a/NetworkPkg/UefiPxeBcDxe/GoogleTest/UefiPxeBcDxeGoogleTest.cpp +++ b/NetworkPkg/UefiPxeBcDxe/GoogleTest/UefiPxeBcDxeGoogleTest.cpp @@ -3,7 +3,7 @@ Copyright (c) Microsoft Corporation SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#include +#include //////////////////////////////////////////////////////////////////////////////// // Run the tests From da7b74161bd4e24fd7d038003cf6bd2a73349183 Mon Sep 17 00:00:00 2001 From: Zachary Clark-Williams Date: Tue, 24 Jun 2025 12:39:07 -0700 Subject: [PATCH 0110/1172] WifiConnectionManagerDxe: HII missing EAP TLS case Add missing EAP-TLS option to HII configuration Implemented support for EAP-TLS authentication in the WifiConnectionManagerDxe HII interface. This change ensures that the EAP-TLS option is available for selection in the UI, addressing cases where it was previously missing. Signed-off-by: Zachary Clark-Williams --- .../WifiConnectionManagerDxe/WifiConnectionMgrHiiConfigAccess.c | 1 + 1 file changed, 1 insertion(+) diff --git a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrHiiConfigAccess.c b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrHiiConfigAccess.c index 58ca6d3254ab..41d332e5c846 100644 --- a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrHiiConfigAccess.c +++ b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrHiiConfigAccess.c @@ -1489,6 +1489,7 @@ WifiMgrDxeHiiConfigAccessCallback ( } else if (Action == EFI_BROWSER_ACTION_FORM_CLOSE) { switch (QuestionId) { case KEY_EAP_ENROLL_CERT_FROM_FILE: + case KEY_EAP_ENROLL_PRIVATE_KEY_FROM_FILE: case KEY_REFRESH_NETWORK_LIST: if (Private->CurrentNic->UserSelectedProfile == NULL) { From d82e9b7bbb9c1d80e7b6f818e1d32e73e29553de Mon Sep 17 00:00:00 2001 From: Zachary Clark-Williams Date: Mon, 23 Jun 2025 12:39:57 -0700 Subject: [PATCH 0111/1172] WifiConnectionManagerDxe: clear timers not events Replace timer eventclose with scan timerset in WifiConnectionManagerDxe. This change ensures that the driver sets and manages scan timers correctly without requiring a reload when the user enables WiFi and initiates a scan for available networks. By using scan timerset directly, the driver maintains consistent behavior across WiFi sessions and avoids redundant event handling. Signed-off-by: Zachary Clark-Williams --- .../WifiConnectionMgrHiiConfigAccess.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrHiiConfigAccess.c b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrHiiConfigAccess.c index 41d332e5c846..78e9b0ea4e70 100644 --- a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrHiiConfigAccess.c +++ b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrHiiConfigAccess.c @@ -1665,7 +1665,8 @@ WifiMgrDxeHiiConfigAccessCallback ( Status = gBS->SetTimer (Private->CurrentNic->TickTimer, TimerPeriodic, EFI_TIMER_PERIOD_MILLISECONDS (500)); if (EFI_ERROR (Status)) { - gBS->CloseEvent (Private->CurrentNic->TickTimer); + DEBUG ((DEBUG_WARN, "[WiFi Connection Manager] Error: Failed to set timer for connect action!")); + gBS->SetTimer (Private->CurrentNic->TickTimer, TimerCancel, 0); } break; @@ -1921,7 +1922,8 @@ WifiMgrDxeHiiConfigAccessCallback ( Status = gBS->SetTimer (Private->CurrentNic->TickTimer, TimerPeriodic, EFI_TIMER_PERIOD_MILLISECONDS (500)); if (EFI_ERROR (Status)) { - gBS->CloseEvent (Private->CurrentNic->TickTimer); + DEBUG ((DEBUG_WARN, "[WiFi Connection Manager] Error: Failed to set timer for connect action!")); + gBS->SetTimer (Private->CurrentNic->TickTimer, TimerCancel, 0); } break; From e64983d53dcdbc495a1f22db3158e72ebff3795c Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Tue, 27 May 2025 14:08:37 -0700 Subject: [PATCH 0112/1172] OvmfPkg/VirtNorFlash: Refactor TPL handling outside NOR flash functions To facilitate moving the NOR flash functions into a separate library, TPL handling is now delegated to the caller. Signed-off-by: Tuan Phan --- OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.c | 30 ------------------- OvmfPkg/VirtNorFlashDxe/VirtNorFlashFvb.c | 35 ++++++++++++++++++++++- 2 files changed, 34 insertions(+), 31 deletions(-) diff --git a/OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.c b/OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.c index 6b9ef261335e..0ff8e5c9c606 100644 --- a/OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.c +++ b/OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.c @@ -148,16 +148,6 @@ NorFlashUnlockAndEraseSingleBlock ( { EFI_STATUS Status; UINTN Index; - EFI_TPL OriginalTPL; - - if (!EfiAtRuntime ()) { - // Raise TPL to TPL_HIGH to stop anyone from interrupting us. - OriginalTPL = gBS->RaiseTPL (TPL_HIGH_LEVEL); - } else { - // This initialization is only to prevent the compiler to complain about the - // use of uninitialized variables - OriginalTPL = TPL_HIGH_LEVEL; - } Index = 0; // The block erase might fail a first time (SW bug ?). Retry it ... @@ -176,11 +166,6 @@ NorFlashUnlockAndEraseSingleBlock ( DEBUG ((DEBUG_ERROR, "EraseSingleBlock(BlockAddress=0x%08x: Block Locked Error (try to erase %d times)\n", BlockAddress, Index)); } - if (!EfiAtRuntime ()) { - // Interruptions can resume. - gBS->RestoreTPL (OriginalTPL); - } - return Status; } @@ -199,7 +184,6 @@ NorFlashWriteFullBlock ( UINTN BlockAddress; UINTN BuffersInBlock; UINTN RemainingWords; - EFI_TPL OriginalTPL; UINTN Cnt; Status = EFI_SUCCESS; @@ -210,15 +194,6 @@ NorFlashWriteFullBlock ( // Start writing from the first address at the start of the block WordAddress = BlockAddress; - if (!EfiAtRuntime ()) { - // Raise TPL to TPL_HIGH to stop anyone from interrupting us. - OriginalTPL = gBS->RaiseTPL (TPL_HIGH_LEVEL); - } else { - // This initialization is only to prevent the compiler to complain about the - // use of uninitialized variables - OriginalTPL = TPL_HIGH_LEVEL; - } - Status = NorFlashUnlockAndEraseSingleBlock (Instance, BlockAddress); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "WriteSingleBlock: ERROR - Failed to Unlock and Erase the single block at 0x%X\n", BlockAddress)); @@ -283,11 +258,6 @@ NorFlashWriteFullBlock ( // Put device back into Read Array mode SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_READ_ARRAY); - if (!EfiAtRuntime ()) { - // Interruptions can resume. - gBS->RestoreTPL (OriginalTPL); - } - if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "NOR FLASH Programming [WriteSingleBlock] failed at address 0x%08x. Exit Status = \"%r\".\n", WordAddress, Status)); } diff --git a/OvmfPkg/VirtNorFlashDxe/VirtNorFlashFvb.c b/OvmfPkg/VirtNorFlashDxe/VirtNorFlashFvb.c index c8b5e0be1379..59e5f432bcd9 100644 --- a/OvmfPkg/VirtNorFlashDxe/VirtNorFlashFvb.c +++ b/OvmfPkg/VirtNorFlashDxe/VirtNorFlashFvb.c @@ -734,10 +734,28 @@ FvbWrite ( ) { NOR_FLASH_INSTANCE *Instance; + EFI_TPL OriginalTPL; + EFI_STATUS Status; Instance = INSTANCE_FROM_FVB_THIS (This); - return NorFlashWriteSingleBlock (Instance, Instance->StartLba + Lba, Offset, NumBytes, Buffer); + if (!EfiAtRuntime ()) { + // Raise TPL to TPL_HIGH to stop anyone from interrupting us. + OriginalTPL = gBS->RaiseTPL (TPL_HIGH_LEVEL); + } else { + // This initialization is only to prevent the compiler to complain about the + // use of uninitialized variables + OriginalTPL = TPL_HIGH_LEVEL; + } + + Status = NorFlashWriteSingleBlock (Instance, Instance->StartLba + Lba, Offset, NumBytes, Buffer); + + if (!EfiAtRuntime ()) { + // Interruptions can resume. + gBS->RestoreTPL (OriginalTPL); + } + + return Status; } /** @@ -795,6 +813,7 @@ FvbEraseBlocks ( UINTN BlockAddress; // Physical address of Lba to erase EFI_LBA StartingLba; // Lba from which we start erasing UINTN NumOfLba; // Number of Lba blocks to erase + EFI_TPL OriginalTPL; NOR_FLASH_INSTANCE *Instance; Instance = INSTANCE_FROM_FVB_THIS (This); @@ -865,7 +884,21 @@ FvbEraseBlocks ( // Erase it DEBUG ((DEBUG_BLKIO, "FvbEraseBlocks: Erasing Lba=%ld @ 0x%08x.\n", Instance->StartLba + StartingLba, BlockAddress)); + if (!EfiAtRuntime ()) { + // Raise TPL to TPL_HIGH to stop anyone from interrupting us. + OriginalTPL = gBS->RaiseTPL (TPL_HIGH_LEVEL); + } else { + // This initialization is only to prevent the compiler to complain about the + // use of uninitialized variables + OriginalTPL = TPL_HIGH_LEVEL; + } + Status = NorFlashUnlockAndEraseSingleBlock (Instance, BlockAddress); + if (!EfiAtRuntime ()) { + // Interruptions can resume. + gBS->RestoreTPL (OriginalTPL); + } + if (EFI_ERROR (Status)) { VA_END (Args); Status = EFI_DEVICE_ERROR; From 6fff3da2254b09ca922949b9d861244bd9f1e4fc Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Tue, 27 May 2025 14:04:21 -0700 Subject: [PATCH 0113/1172] OvmfPkg/VirtNorFlash: Move low level NOR flash functions into library This patch refactors low level NOR flash functions into a dedicated library to enable reuse, particularly for supporting the firmware upgrade feature. Signed-off-by: Tuan Phan --- .../Include/Library/VirtNorFlashDeviceLib.h | 126 +++++ .../VirtNorFlashDeviceLib.c} | 504 +++++++++++++----- .../VirtNorFlashDeviceLib.inf | 30 ++ OvmfPkg/LoongArchVirt/LoongArchVirtQemu.dsc | 1 + OvmfPkg/OvmfPkg.dec | 4 + OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc | 1 + OvmfPkg/VirtNorFlashDxe/VirtNorFlash.h | 345 ------------ OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.c | 148 +---- OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.h | 156 ++++++ OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.inf | 3 +- OvmfPkg/VirtNorFlashDxe/VirtNorFlashFvb.c | 38 +- 11 files changed, 741 insertions(+), 615 deletions(-) create mode 100644 OvmfPkg/Include/Library/VirtNorFlashDeviceLib.h rename OvmfPkg/{VirtNorFlashDxe/VirtNorFlash.c => Library/VirtNorFlashDeviceLib/VirtNorFlashDeviceLib.c} (56%) create mode 100644 OvmfPkg/Library/VirtNorFlashDeviceLib/VirtNorFlashDeviceLib.inf delete mode 100644 OvmfPkg/VirtNorFlashDxe/VirtNorFlash.h create mode 100644 OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.h diff --git a/OvmfPkg/Include/Library/VirtNorFlashDeviceLib.h b/OvmfPkg/Include/Library/VirtNorFlashDeviceLib.h new file mode 100644 index 000000000000..d6a6816fd9ae --- /dev/null +++ b/OvmfPkg/Include/Library/VirtNorFlashDeviceLib.h @@ -0,0 +1,126 @@ +/** @file VirtNorFlashDeviceLib.h + + Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.
+ Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef VIRT_NOR_FLASH_DEVICE_LIB_H +#define VIRT_NOR_FLASH_DEVICE_LIB_H + +// Each command must be sent simultaneously to both chips, +// i.e. at the lower 16 bits AND at the higher 16 bits +#define CREATE_NOR_ADDRESS(BaseAddr, OffsetAddr) ((BaseAddr) + ((OffsetAddr) << 2)) +#define CREATE_DUAL_CMD(Cmd) ( ( Cmd << 16) | ( Cmd & LOW_16_BITS) ) +#define SEND_NOR_COMMAND(BaseAddr, Offset, Cmd) MmioWrite32 (CREATE_NOR_ADDRESS(BaseAddr,Offset), CREATE_DUAL_CMD(Cmd)) +#define GET_NOR_BLOCK_ADDRESS(BaseAddr, Lba, LbaSize) ( BaseAddr + (UINTN)((Lba) * LbaSize) ) + +EFI_STATUS +EFIAPI +NorFlashWriteBuffer ( + IN UINTN DeviceBaseAddress, + IN UINTN TargetAddress, + IN UINTN BufferSizeInBytes, + IN UINT32 *Buffer + ); + +EFI_STATUS +EFIAPI +NorFlashWriteSingleBlock ( + IN UINTN DeviceBaseAddress, + IN UINTN RegionBaseAddress, + IN EFI_LBA Lba, + IN UINT32 LastBlock, + IN UINT32 BlockSize, + IN UINTN Size, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN UINT8 *Buffer, + IN VOID *ShadowBuffer + ); + +EFI_STATUS +EFIAPI +NorFlashWriteBlocks ( + IN UINTN DeviceBaseAddress, + IN UINTN RegionBaseAddress, + IN EFI_LBA Lba, + IN EFI_LBA LastBlock, + IN UINT32 BlockSize, + IN UINTN BufferSizeInBytes, + IN VOID *Buffer + ); + +EFI_STATUS +EFIAPI +NorFlashReadBlocks ( + IN UINTN DeviceBaseAddress, + IN UINTN RegionBaseAddress, + IN EFI_LBA Lba, + IN EFI_LBA LastBlock, + IN UINT32 BlockSize, + IN UINTN BufferSizeInBytes, + OUT VOID *Buffer + ); + +EFI_STATUS +EFIAPI +NorFlashRead ( + IN UINTN DeviceBaseAddress, + IN UINTN RegionBaseAddress, + IN EFI_LBA Lba, + IN UINT32 BlockSize, + IN UINTN Size, + IN UINTN Offset, + IN UINTN BufferSizeInBytes, + OUT VOID *Buffer + ); + +EFI_STATUS +EFIAPI +NorFlashEraseSingleBlock ( + IN UINTN DeviceBaseAddress, + IN UINTN BlockAddress + ); + +EFI_STATUS +EFIAPI +NorFlashUnlockSingleBlockIfNecessary ( + IN UINTN DeviceBaseAddress, + IN UINTN BlockAddress + ); + +EFI_STATUS +EFIAPI +NorFlashWriteSingleWord ( + IN UINTN DeviceBaseAddress, + IN UINTN WordAddress, + IN UINT32 WriteData + ); + +EFI_STATUS +EFIAPI +NorFlashWriteFullBlock ( + IN UINTN DeviceBaseAddress, + IN UINTN RegionBaseAddress, + IN EFI_LBA Lba, + IN UINT32 *DataBuffer, + IN UINT32 BlockSizeInWords + ); + +EFI_STATUS +EFIAPI +NorFlashUnlockAndEraseSingleBlock ( + IN UINTN DeviceBaseAddress, + IN UINTN BlockAddress + ); + +EFI_STATUS +EFIAPI +NorFlashReset ( + IN UINTN DeviceBaseAddress + ); + +#endif /* VIRT_NOR_FLASH_DEVICE_LIB_H */ diff --git a/OvmfPkg/VirtNorFlashDxe/VirtNorFlash.c b/OvmfPkg/Library/VirtNorFlashDeviceLib/VirtNorFlashDeviceLib.c similarity index 56% rename from OvmfPkg/VirtNorFlashDxe/VirtNorFlash.c rename to OvmfPkg/Library/VirtNorFlashDeviceLib/VirtNorFlashDeviceLib.c index e6aaed27ceba..731af75b73b5 100644 --- a/OvmfPkg/VirtNorFlashDxe/VirtNorFlash.c +++ b/OvmfPkg/Library/VirtNorFlashDeviceLib/VirtNorFlashDeviceLib.c @@ -1,4 +1,4 @@ -/** @file NorFlash.c +/** @file VirtNorFlashDeviceLib.c Copyright (c) 2011 - 2020, Arm Limited. All rights reserved.
Copyright (c) 2020, Linaro, Ltd. All rights reserved.
@@ -7,32 +7,108 @@ **/ -#include - -#include "VirtNorFlash.h" +#include +#include -// -// Global variable declarations -// -extern NOR_FLASH_INSTANCE **mNorFlashInstances; -extern UINT32 mNorFlashDeviceCount; +#include +#include +#include +#include + +#define NOR_FLASH_ERASE_RETRY 10 + +// Device access macros +// These are necessary because we use 2 x 16bit parts to make up 32bit data + +#define HIGH_16_BITS 0xFFFF0000 +#define LOW_16_BITS 0x0000FFFF +#define LOW_8_BITS 0x000000FF + +#define FOLD_32BIT_INTO_16BIT(value) ( ( value >> 16 ) | ( value & LOW_16_BITS ) ) + +#define GET_LOW_BYTE(value) ( value & LOW_8_BITS ) +#define GET_HIGH_BYTE(value) ( GET_LOW_BYTE( value >> 16 ) ) + +// Status Register Bits +#define P30_SR_BIT_WRITE (BIT7 << 16 | BIT7) +#define P30_SR_BIT_ERASE_SUSPEND (BIT6 << 16 | BIT6) +#define P30_SR_BIT_ERASE (BIT5 << 16 | BIT5) +#define P30_SR_BIT_PROGRAM (BIT4 << 16 | BIT4) +#define P30_SR_BIT_VPP (BIT3 << 16 | BIT3) +#define P30_SR_BIT_PROGRAM_SUSPEND (BIT2 << 16 | BIT2) +#define P30_SR_BIT_BLOCK_LOCKED (BIT1 << 16 | BIT1) +#define P30_SR_BIT_BEFP (BIT0 << 16 | BIT0) + +// Device Commands for Intel StrataFlash(R) Embedded Memory (P30) Family + +// On chip buffer size for buffered programming operations +// There are 2 chips, each chip can buffer up to 32 (16-bit)words, and each word is 2 bytes. +// Therefore the total size of the buffer is 2 x 32 x 2 = 128 bytes +#define P30_MAX_BUFFER_SIZE_IN_BYTES ((UINTN)128) +#define P30_MAX_BUFFER_SIZE_IN_WORDS (P30_MAX_BUFFER_SIZE_IN_BYTES/((UINTN)4)) +#define MAX_BUFFERED_PROG_ITERATIONS 10000000 +#define BOUNDARY_OF_32_WORDS ((UINTN)0x7F) + +// CFI Addresses +#define P30_CFI_ADDR_QUERY_UNIQUE_QRY 0x10 +#define P30_CFI_ADDR_VENDOR_ID 0x13 + +// CFI Data +#define CFI_QRY 0x00595251 + +// READ Commands +#define P30_CMD_READ_DEVICE_ID 0x0090 +#define P30_CMD_READ_STATUS_REGISTER 0x0070 +#define P30_CMD_CLEAR_STATUS_REGISTER 0x0050 +#define P30_CMD_READ_ARRAY 0x00FF +#define P30_CMD_READ_CFI_QUERY 0x0098 + +// WRITE Commands +#define P30_CMD_WORD_PROGRAM_SETUP 0x0040 +#define P30_CMD_ALTERNATE_WORD_PROGRAM_SETUP 0x0010 +#define P30_CMD_BUFFERED_PROGRAM_SETUP 0x00E8 +#define P30_CMD_BUFFERED_PROGRAM_CONFIRM 0x00D0 +#define P30_CMD_BEFP_SETUP 0x0080 +#define P30_CMD_BEFP_CONFIRM 0x00D0 + +// ERASE Commands +#define P30_CMD_BLOCK_ERASE_SETUP 0x0020 +#define P30_CMD_BLOCK_ERASE_CONFIRM 0x00D0 + +// SUSPEND Commands +#define P30_CMD_PROGRAM_OR_ERASE_SUSPEND 0x00B0 +#define P30_CMD_SUSPEND_RESUME 0x00D0 + +// BLOCK LOCKING / UNLOCKING Commands +#define P30_CMD_LOCK_BLOCK_SETUP 0x0060 +#define P30_CMD_LOCK_BLOCK 0x0001 +#define P30_CMD_UNLOCK_BLOCK 0x00D0 +#define P30_CMD_LOCK_DOWN_BLOCK 0x002F + +// PROTECTION Commands +#define P30_CMD_PROGRAM_PROTECTION_REGISTER_SETUP 0x00C0 + +// CONFIGURATION Commands +#define P30_CMD_READ_CONFIGURATION_REGISTER_SETUP 0x0060 +#define P30_CMD_READ_CONFIGURATION_REGISTER 0x0003 +STATIC UINT32 NorFlashReadStatusRegister ( - IN NOR_FLASH_INSTANCE *Instance, - IN UINTN SR_Address + IN UINTN DeviceBaseAddress, + IN UINTN SR_Address ) { // Prepare to read the status register - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_READ_STATUS_REGISTER); - return MmioRead32 (Instance->DeviceBaseAddress); + SEND_NOR_COMMAND (DeviceBaseAddress, 0, P30_CMD_READ_STATUS_REGISTER); + return MmioRead32 (DeviceBaseAddress); } STATIC BOOLEAN NorFlashBlockIsLocked ( - IN NOR_FLASH_INSTANCE *Instance, - IN UINTN BlockAddress + IN UINTN DeviceBaseAddress, + IN UINTN BlockAddress ) { UINT32 LockStatus; @@ -56,8 +132,8 @@ NorFlashBlockIsLocked ( STATIC EFI_STATUS NorFlashUnlockSingleBlock ( - IN NOR_FLASH_INSTANCE *Instance, - IN UINTN BlockAddress + IN UINTN DeviceBaseAddress, + IN UINTN BlockAddress ) { UINT32 LockStatus; @@ -73,7 +149,7 @@ NorFlashUnlockSingleBlock ( // Wait until the status register gives us the all clear do { - LockStatus = NorFlashReadStatusRegister (Instance, BlockAddress); + LockStatus = NorFlashReadStatusRegister (DeviceBaseAddress, BlockAddress); } while ((LockStatus & P30_SR_BIT_WRITE) != P30_SR_BIT_WRITE); // Put device back into Read Array mode @@ -85,17 +161,18 @@ NorFlashUnlockSingleBlock ( } EFI_STATUS +EFIAPI NorFlashUnlockSingleBlockIfNecessary ( - IN NOR_FLASH_INSTANCE *Instance, - IN UINTN BlockAddress + IN UINTN DeviceBaseAddress, + IN UINTN BlockAddress ) { EFI_STATUS Status; Status = EFI_SUCCESS; - if (NorFlashBlockIsLocked (Instance, BlockAddress)) { - Status = NorFlashUnlockSingleBlock (Instance, BlockAddress); + if (NorFlashBlockIsLocked (DeviceBaseAddress, BlockAddress)) { + Status = NorFlashUnlockSingleBlock (DeviceBaseAddress, BlockAddress); } return Status; @@ -105,9 +182,10 @@ NorFlashUnlockSingleBlockIfNecessary ( * The following function presumes that the block has already been unlocked. **/ EFI_STATUS +EFIAPI NorFlashEraseSingleBlock ( - IN NOR_FLASH_INSTANCE *Instance, - IN UINTN BlockAddress + IN UINTN DeviceBaseAddress, + IN UINTN BlockAddress ) { EFI_STATUS Status; @@ -121,7 +199,7 @@ NorFlashEraseSingleBlock ( // Wait until the status register gives us the all clear do { - StatusRegister = NorFlashReadStatusRegister (Instance, BlockAddress); + StatusRegister = NorFlashReadStatusRegister (DeviceBaseAddress, BlockAddress); } while ((StatusRegister & P30_SR_BIT_WRITE) != P30_SR_BIT_WRITE); if (StatusRegister & P30_SR_BIT_VPP) { @@ -147,20 +225,21 @@ NorFlashEraseSingleBlock ( if (EFI_ERROR (Status)) { // Clear the Status Register - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_CLEAR_STATUS_REGISTER); + SEND_NOR_COMMAND (DeviceBaseAddress, 0, P30_CMD_CLEAR_STATUS_REGISTER); } // Put device back into Read Array mode - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_READ_ARRAY); + SEND_NOR_COMMAND (DeviceBaseAddress, 0, P30_CMD_READ_ARRAY); return Status; } EFI_STATUS +EFIAPI NorFlashWriteSingleWord ( - IN NOR_FLASH_INSTANCE *Instance, - IN UINTN WordAddress, - IN UINT32 WriteData + IN UINTN DeviceBaseAddress, + IN UINTN WordAddress, + IN UINT32 WriteData ) { EFI_STATUS Status; @@ -177,7 +256,7 @@ NorFlashWriteSingleWord ( // Wait for the write to complete and then check for any errors; i.e. check the Status Register do { // Prepare to read the status register - StatusRegister = NorFlashReadStatusRegister (Instance, WordAddress); + StatusRegister = NorFlashReadStatusRegister (DeviceBaseAddress, WordAddress); // The chip is busy while the WRITE bit is not asserted } while ((StatusRegister & P30_SR_BIT_WRITE) != P30_SR_BIT_WRITE); @@ -202,7 +281,7 @@ NorFlashWriteSingleWord ( if (!EFI_ERROR (Status)) { // Clear the Status Register - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_CLEAR_STATUS_REGISTER); + SEND_NOR_COMMAND (DeviceBaseAddress, 0, P30_CMD_CLEAR_STATUS_REGISTER); } return Status; @@ -224,11 +303,12 @@ NorFlashWriteSingleWord ( * i.e. the last 4 bits of the target start address must be zero: 0x......00 */ EFI_STATUS +EFIAPI NorFlashWriteBuffer ( - IN NOR_FLASH_INSTANCE *Instance, - IN UINTN TargetAddress, - IN UINTN BufferSizeInBytes, - IN UINT32 *Buffer + IN UINTN DeviceBaseAddress, + IN UINTN TargetAddress, + IN UINTN BufferSizeInBytes, + IN UINT32 *Buffer ) { EFI_STATUS Status; @@ -299,11 +379,11 @@ NorFlashWriteBuffer ( } // Issue the Buffered Program Confirm command, to start the programming operation - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_BUFFERED_PROGRAM_CONFIRM); + SEND_NOR_COMMAND (DeviceBaseAddress, 0, P30_CMD_BUFFERED_PROGRAM_CONFIRM); // Wait for the write to complete and then check for any errors; i.e. check the Status Register do { - StatusRegister = NorFlashReadStatusRegister (Instance, TargetAddress); + StatusRegister = NorFlashReadStatusRegister (DeviceBaseAddress, TargetAddress); // The chip is busy while the WRITE bit is not asserted } while ((StatusRegister & P30_SR_BIT_WRITE) != P30_SR_BIT_WRITE); @@ -330,18 +410,150 @@ NorFlashWriteBuffer ( if (!EFI_ERROR (Status)) { // Clear the Status Register - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_CLEAR_STATUS_REGISTER); + SEND_NOR_COMMAND (DeviceBaseAddress, 0, P30_CMD_CLEAR_STATUS_REGISTER); + } + + return Status; +} + +/** + * This function unlock and erase an entire NOR Flash block. + **/ +EFI_STATUS +NorFlashUnlockAndEraseSingleBlock ( + IN UINTN DeviceBaseAddress, + IN UINTN BlockAddress + ) +{ + EFI_STATUS Status; + UINTN Index; + + Index = 0; + // The block erase might fail a first time (SW bug ?). Retry it ... + do { + // Unlock the block if we have to + Status = NorFlashUnlockSingleBlockIfNecessary (DeviceBaseAddress, BlockAddress); + if (EFI_ERROR (Status)) { + break; + } + + Status = NorFlashEraseSingleBlock (DeviceBaseAddress, BlockAddress); + Index++; + } while ((Index < NOR_FLASH_ERASE_RETRY) && (Status == EFI_WRITE_PROTECTED)); + + if (Index == NOR_FLASH_ERASE_RETRY) { + DEBUG ((DEBUG_ERROR, "EraseSingleBlock(BlockAddress=0x%08x: Block Locked Error (try to erase %d times)\n", BlockAddress, Index)); + } + + return Status; +} + +EFI_STATUS +NorFlashWriteFullBlock ( + IN UINTN DeviceBaseAddress, + IN UINTN RegionBaseAddress, + IN EFI_LBA Lba, + IN UINT32 *DataBuffer, + IN UINT32 BlockSizeInWords + ) +{ + EFI_STATUS Status; + UINTN WordAddress; + UINT32 WordIndex; + UINTN BufferIndex; + UINTN BlockAddress; + UINTN BuffersInBlock; + UINTN RemainingWords; + UINTN Cnt; + + Status = EFI_SUCCESS; + + // Get the physical address of the block + BlockAddress = GET_NOR_BLOCK_ADDRESS (RegionBaseAddress, Lba, BlockSizeInWords * 4); + + // Start writing from the first address at the start of the block + WordAddress = BlockAddress; + Status = NorFlashUnlockAndEraseSingleBlock (DeviceBaseAddress, BlockAddress); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "WriteSingleBlock: ERROR - Failed to Unlock and Erase the single block at 0x%X\n", BlockAddress)); + goto EXIT; + } + + // To speed up the programming operation, NOR Flash is programmed using the Buffered Programming method. + + // Check that the address starts at a 32-word boundary, i.e. last 7 bits must be zero + if ((WordAddress & BOUNDARY_OF_32_WORDS) == 0x00) { + // First, break the entire block into buffer-sized chunks. + BuffersInBlock = (UINTN)(BlockSizeInWords * 4) / P30_MAX_BUFFER_SIZE_IN_BYTES; + + // Then feed each buffer chunk to the NOR Flash + // If a buffer does not contain any data, don't write it. + for (BufferIndex = 0; + BufferIndex < BuffersInBlock; + BufferIndex++, WordAddress += P30_MAX_BUFFER_SIZE_IN_BYTES, DataBuffer += P30_MAX_BUFFER_SIZE_IN_WORDS + ) + { + // Check the buffer to see if it contains any data (not set all 1s). + for (Cnt = 0; Cnt < P30_MAX_BUFFER_SIZE_IN_WORDS; Cnt++) { + if (~DataBuffer[Cnt] != 0 ) { + // Some data found, write the buffer. + Status = NorFlashWriteBuffer ( + DeviceBaseAddress, + WordAddress, + P30_MAX_BUFFER_SIZE_IN_BYTES, + DataBuffer + ); + if (EFI_ERROR (Status)) { + goto EXIT; + } + + break; + } + } + } + + // Finally, finish off any remaining words that are less than the maximum size of the buffer + RemainingWords = BlockSizeInWords % P30_MAX_BUFFER_SIZE_IN_WORDS; + + if (RemainingWords != 0) { + Status = NorFlashWriteBuffer (DeviceBaseAddress, WordAddress, (RemainingWords * 4), DataBuffer); + if (EFI_ERROR (Status)) { + goto EXIT; + } + } + } else { + // For now, use the single word programming algorithm + // It is unlikely that the NOR Flash will exist in an address which falls within a 32 word boundary range, + // i.e. which ends in the range 0x......01 - 0x......7F. + for (WordIndex = 0; WordIndex < BlockSizeInWords; WordIndex++, DataBuffer++, WordAddress = WordAddress + 4) { + Status = NorFlashWriteSingleWord (DeviceBaseAddress, WordAddress, *DataBuffer); + if (EFI_ERROR (Status)) { + goto EXIT; + } + } + } + +EXIT: + // Put device back into Read Array mode + SEND_NOR_COMMAND (DeviceBaseAddress, 0, P30_CMD_READ_ARRAY); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "NOR FLASH Programming [WriteSingleBlock] failed at address 0x%08x. Exit Status = \"%r\".\n", WordAddress, Status)); } return Status; } EFI_STATUS +EFIAPI NorFlashWriteBlocks ( - IN NOR_FLASH_INSTANCE *Instance, - IN EFI_LBA Lba, - IN UINTN BufferSizeInBytes, - IN VOID *Buffer + IN UINTN DeviceBaseAddress, + IN UINTN RegionBaseAddress, + IN EFI_LBA Lba, + IN EFI_LBA LastBlock, + IN UINT32 BlockSize, + IN UINTN BufferSizeInBytes, + IN VOID *Buffer ) { UINT32 *pWriteBuffer; @@ -365,22 +577,22 @@ NorFlashWriteBlocks ( } // The size of the buffer must be a multiple of the block size - DEBUG ((DEBUG_BLKIO, "NorFlashWriteBlocks: BlockSize in bytes =0x%x\n", Instance->BlockSize)); - if ((BufferSizeInBytes % Instance->BlockSize) != 0) { + DEBUG ((DEBUG_BLKIO, "NorFlashWriteBlocks: BlockSize in bytes =0x%x\n", BlockSize)); + if ((BufferSizeInBytes % BlockSize) != 0) { return EFI_BAD_BUFFER_SIZE; } // All blocks must be within the device - NumBlocks = ((UINT32)BufferSizeInBytes) / Instance->BlockSize; + NumBlocks = ((UINT32)BufferSizeInBytes) / BlockSize; - DEBUG ((DEBUG_BLKIO, "NorFlashWriteBlocks: NumBlocks=%d, LastBlock=%ld, Lba=%ld.\n", NumBlocks, Instance->LastBlock, Lba)); + DEBUG ((DEBUG_BLKIO, "NorFlashWriteBlocks: NumBlocks=%d, LastBlock=%ld, Lba=%ld.\n", NumBlocks, LastBlock, Lba)); - if ((Lba + NumBlocks) > (Instance->LastBlock + 1)) { + if ((Lba + NumBlocks) > (LastBlock + 1)) { DEBUG ((DEBUG_ERROR, "NorFlashWriteBlocks: ERROR - Write will exceed last block.\n")); return EFI_INVALID_PARAMETER; } - BlockSizeInWords = Instance->BlockSize / 4; + BlockSizeInWords = BlockSize / 4; // Because the target *Buffer is a pointer to VOID, we must put all the data into a pointer // to a proper data type, so use *ReadBuffer @@ -390,7 +602,13 @@ NorFlashWriteBlocks ( for (BlockCount = 0; BlockCount < NumBlocks; BlockCount++, CurrentBlock++, pWriteBuffer = pWriteBuffer + BlockSizeInWords) { DEBUG ((DEBUG_BLKIO, "NorFlashWriteBlocks: Writing block #%d\n", (UINTN)CurrentBlock)); - Status = NorFlashWriteFullBlock (Instance, CurrentBlock, pWriteBuffer, BlockSizeInWords); + Status = NorFlashWriteFullBlock ( + DeviceBaseAddress, + RegionBaseAddress, + CurrentBlock, + pWriteBuffer, + BlockSizeInWords + ); if (EFI_ERROR (Status)) { break; @@ -402,11 +620,15 @@ NorFlashWriteBlocks ( } EFI_STATUS +EFIAPI NorFlashReadBlocks ( - IN NOR_FLASH_INSTANCE *Instance, - IN EFI_LBA Lba, - IN UINTN BufferSizeInBytes, - OUT VOID *Buffer + IN UINTN DeviceBaseAddress, + IN UINTN RegionBaseAddress, + IN EFI_LBA Lba, + IN EFI_LBA LastBlock, + IN UINT32 BlockSize, + IN UINTN BufferSizeInBytes, + OUT VOID *Buffer ) { UINT32 NumBlocks; @@ -416,8 +638,8 @@ NorFlashReadBlocks ( DEBUG_BLKIO, "NorFlashReadBlocks: BufferSize=0x%xB BlockSize=0x%xB LastBlock=%ld, Lba=%ld.\n", BufferSizeInBytes, - Instance->BlockSize, - Instance->LastBlock, + BlockSize, + LastBlock, Lba )); @@ -432,27 +654,27 @@ NorFlashReadBlocks ( } // The size of the buffer must be a multiple of the block size - if ((BufferSizeInBytes % Instance->BlockSize) != 0) { + if ((BufferSizeInBytes % BlockSize) != 0) { return EFI_BAD_BUFFER_SIZE; } // All blocks must be within the device - NumBlocks = ((UINT32)BufferSizeInBytes) / Instance->BlockSize; + NumBlocks = ((UINT32)BufferSizeInBytes) / BlockSize; - if ((Lba + NumBlocks) > (Instance->LastBlock + 1)) { + if ((Lba + NumBlocks) > (LastBlock + 1)) { DEBUG ((DEBUG_ERROR, "NorFlashReadBlocks: ERROR - Read will exceed last block\n")); return EFI_INVALID_PARAMETER; } // Get the address to start reading from StartAddress = GET_NOR_BLOCK_ADDRESS ( - Instance->RegionBaseAddress, + RegionBaseAddress, Lba, - Instance->BlockSize + BlockSize ); // Put the device into Read Array mode - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_READ_ARRAY); + SEND_NOR_COMMAND (DeviceBaseAddress, 0, P30_CMD_READ_ARRAY); // Readout the data CopyMem (Buffer, (VOID *)StartAddress, BufferSizeInBytes); @@ -461,12 +683,16 @@ NorFlashReadBlocks ( } EFI_STATUS +EFIAPI NorFlashRead ( - IN NOR_FLASH_INSTANCE *Instance, - IN EFI_LBA Lba, - IN UINTN Offset, - IN UINTN BufferSizeInBytes, - OUT VOID *Buffer + IN UINTN DeviceBaseAddress, + IN UINTN RegionBaseAddress, + IN EFI_LBA Lba, + IN UINT32 BlockSize, + IN UINTN Size, + IN UINTN Offset, + IN UINTN BufferSizeInBytes, + OUT VOID *Buffer ) { UINTN StartAddress; @@ -481,20 +707,20 @@ NorFlashRead ( return EFI_SUCCESS; } - if (((Lba * Instance->BlockSize) + Offset + BufferSizeInBytes) > Instance->Size) { + if (((Lba * BlockSize) + Offset + BufferSizeInBytes) > Size) { DEBUG ((DEBUG_ERROR, "NorFlashRead: ERROR - Read will exceed device size.\n")); return EFI_INVALID_PARAMETER; } // Get the address to start reading from StartAddress = GET_NOR_BLOCK_ADDRESS ( - Instance->RegionBaseAddress, + RegionBaseAddress, Lba, - Instance->BlockSize + BlockSize ); // Put the device into Read Array mode - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_READ_ARRAY); + SEND_NOR_COMMAND (DeviceBaseAddress, 0, P30_CMD_READ_ARRAY); // Readout the data CopyMem (Buffer, (VOID *)(StartAddress + Offset), BufferSizeInBytes); @@ -505,27 +731,47 @@ NorFlashRead ( STATIC EFI_STATUS NorFlashWriteSingleBlockWithErase ( - IN NOR_FLASH_INSTANCE *Instance, - IN EFI_LBA Lba, - IN UINTN Offset, - IN OUT UINTN *NumBytes, - IN UINT8 *Buffer + IN UINTN DeviceBaseAddress, + IN UINTN RegionBaseAddress, + IN EFI_LBA Lba, + IN UINT32 LastBlock, + IN UINT32 BlockSize, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN UINT8 *Buffer, + IN VOID *ShadowBuffer ) { EFI_STATUS Status; // Read NOR Flash data into shadow buffer - Status = NorFlashReadBlocks (Instance, Lba, Instance->BlockSize, Instance->ShadowBuffer); + Status = NorFlashReadBlocks ( + DeviceBaseAddress, + RegionBaseAddress, + Lba, + LastBlock, + BlockSize, + BlockSize, + ShadowBuffer + ); if (EFI_ERROR (Status)) { // Return one of the pre-approved error statuses return EFI_DEVICE_ERROR; } // Put the data at the appropriate location inside the buffer area - CopyMem ((VOID *)((UINTN)Instance->ShadowBuffer + Offset), Buffer, *NumBytes); + CopyMem ((VOID *)((UINTN)ShadowBuffer + Offset), Buffer, *NumBytes); // Write the modified buffer back to the NorFlash - Status = NorFlashWriteBlocks (Instance, Lba, Instance->BlockSize, Instance->ShadowBuffer); + Status = NorFlashWriteBlocks ( + DeviceBaseAddress, + RegionBaseAddress, + Lba, + LastBlock, + BlockSize, + BlockSize, + ShadowBuffer + ); if (EFI_ERROR (Status)) { // Return one of the pre-approved error statuses return EFI_DEVICE_ERROR; @@ -539,17 +785,22 @@ NorFlashWriteSingleBlockWithErase ( Offset + *NumBytes <= Instance->BlockSize. */ EFI_STATUS +EFIAPI NorFlashWriteSingleBlock ( - IN NOR_FLASH_INSTANCE *Instance, - IN EFI_LBA Lba, - IN UINTN Offset, - IN OUT UINTN *NumBytes, - IN UINT8 *Buffer + IN UINTN DeviceBaseAddress, + IN UINTN RegionBaseAddress, + IN EFI_LBA Lba, + IN UINT32 LastBlock, + IN UINT32 BlockSize, + IN UINTN Size, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN UINT8 *Buffer, + IN VOID *ShadowBuffer ) { EFI_STATUS Status; UINTN CurOffset; - UINTN BlockSize; UINTN BlockAddress; UINT8 *OrigData; UINTN Start, End; @@ -558,14 +809,11 @@ NorFlashWriteSingleBlock ( DEBUG ((DEBUG_BLKIO, "NorFlashWriteSingleBlock(Parameters: Lba=%ld, Offset=0x%x, *NumBytes=0x%x, Buffer @ 0x%08x)\n", Lba, Offset, *NumBytes, Buffer)); // Check we did get some memory. Buffer is BlockSize. - if (Instance->ShadowBuffer == NULL) { + if (ShadowBuffer == NULL) { DEBUG ((DEBUG_ERROR, "FvbWrite: ERROR - Buffer not ready\n")); return EFI_DEVICE_ERROR; } - // Cache the block size to avoid de-referencing pointers all the time - BlockSize = Instance->BlockSize; - // The write must not span block boundaries. // We need to check each variable individually because adding two large values together overflows. if ((Offset >= BlockSize) || @@ -620,11 +868,14 @@ NorFlashWriteSingleBlock ( // Read the old version of the data into the shadow buffer Status = NorFlashRead ( - Instance, + DeviceBaseAddress, + RegionBaseAddress, Lba, + BlockSize, + Size, Start, End - Start, - Instance->ShadowBuffer + ShadowBuffer ); if (EFI_ERROR (Status)) { return EFI_DEVICE_ERROR; @@ -632,7 +883,7 @@ NorFlashWriteSingleBlock ( // Make OrigData point to the start of the old version of the data inside // the word aligned buffer - OrigData = Instance->ShadowBuffer + (Offset & BOUNDARY_OF_32_WORDS); + OrigData = ShadowBuffer + (Offset & BOUNDARY_OF_32_WORDS); // Update the buffer containing the old version of the data with the new // contents, while checking whether the old version had any bits cleared @@ -640,11 +891,15 @@ NorFlashWriteSingleBlock ( for (CurOffset = 0; CurOffset < *NumBytes; CurOffset++) { if (~(UINT32)OrigData[CurOffset] & (UINT32)Buffer[CurOffset]) { Status = NorFlashWriteSingleBlockWithErase ( - Instance, + DeviceBaseAddress, + RegionBaseAddress, Lba, + LastBlock, + BlockSize, Offset, NumBytes, - Buffer + Buffer, + ShadowBuffer ); return Status; } @@ -655,10 +910,10 @@ NorFlashWriteSingleBlock ( // // Write the updated buffer to NOR. // - BlockAddress = GET_NOR_BLOCK_ADDRESS (Instance->RegionBaseAddress, Lba, BlockSize); + BlockAddress = GET_NOR_BLOCK_ADDRESS (RegionBaseAddress, Lba, BlockSize); // Unlock the block if we have to - Status = NorFlashUnlockSingleBlockIfNecessary (Instance, BlockAddress); + Status = NorFlashUnlockSingleBlockIfNecessary (DeviceBaseAddress, BlockAddress); if (EFI_ERROR (Status)) { goto Exit; } @@ -666,10 +921,10 @@ NorFlashWriteSingleBlock ( Count = (End - Start) / P30_MAX_BUFFER_SIZE_IN_BYTES; for (Index = 0; Index < Count; Index++) { Status = NorFlashWriteBuffer ( - Instance, + DeviceBaseAddress, BlockAddress + Start + Index * P30_MAX_BUFFER_SIZE_IN_BYTES, P30_MAX_BUFFER_SIZE_IN_BYTES, - Instance->ShadowBuffer + Index * P30_MAX_BUFFER_SIZE_IN_BYTES + ShadowBuffer + Index * P30_MAX_BUFFER_SIZE_IN_BYTES ); if (EFI_ERROR (Status)) { goto Exit; @@ -677,66 +932,33 @@ NorFlashWriteSingleBlock ( } } else { Status = NorFlashWriteSingleBlockWithErase ( - Instance, + DeviceBaseAddress, + RegionBaseAddress, Lba, + LastBlock, + BlockSize, Offset, NumBytes, - Buffer + Buffer, + ShadowBuffer ); return Status; } Exit: // Put device back into Read Array mode - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_READ_ARRAY); + SEND_NOR_COMMAND (DeviceBaseAddress, 0, P30_CMD_READ_ARRAY); return Status; } EFI_STATUS +EFIAPI NorFlashReset ( - IN NOR_FLASH_INSTANCE *Instance + IN UINTN DeviceBaseAddress ) { // As there is no specific RESET to perform, ensure that the devices is in the default Read Array mode - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_READ_ARRAY); + SEND_NOR_COMMAND (DeviceBaseAddress, 0, P30_CMD_READ_ARRAY); return EFI_SUCCESS; } - -/** - Fixup internal data so that EFI can be call in virtual mode. - Call the passed in Child Notify event and convert any pointers in - lib to virtual mode. - - @param[in] Event The Event that is being processed - @param[in] Context Event Context -**/ -VOID -EFIAPI -NorFlashVirtualNotifyEvent ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - UINTN Index; - - for (Index = 0; Index < mNorFlashDeviceCount; Index++) { - EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->DeviceBaseAddress); - EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->RegionBaseAddress); - - // Convert Fvb - EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->FvbProtocol.EraseBlocks); - EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->FvbProtocol.GetAttributes); - EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->FvbProtocol.GetBlockSize); - EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->FvbProtocol.GetPhysicalAddress); - EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->FvbProtocol.Read); - EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->FvbProtocol.SetAttributes); - EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->FvbProtocol.Write); - - if (mNorFlashInstances[Index]->ShadowBuffer != NULL) { - EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->ShadowBuffer); - } - } - - return; -} diff --git a/OvmfPkg/Library/VirtNorFlashDeviceLib/VirtNorFlashDeviceLib.inf b/OvmfPkg/Library/VirtNorFlashDeviceLib/VirtNorFlashDeviceLib.inf new file mode 100644 index 000000000000..befa57034de4 --- /dev/null +++ b/OvmfPkg/Library/VirtNorFlashDeviceLib/VirtNorFlashDeviceLib.inf @@ -0,0 +1,30 @@ +#/** @file +# +# This library enables low-level access to Virt Flash devices +# +# Copyright (c) 2011 - 2021, Arm Limited. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +#**/ + +[Defines] + INF_VERSION = 1.29 + BASE_NAME = VirtNorFlashDeviceLib + FILE_GUID = 3f8c8c4b-5b92-4e71-ae73-9f7d2f1e33d4 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = VirtNorFlashDeviceLib + +[Sources.common] + VirtNorFlashDeviceLib.c + +[Packages] + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + IoLib diff --git a/OvmfPkg/LoongArchVirt/LoongArchVirtQemu.dsc b/OvmfPkg/LoongArchVirt/LoongArchVirtQemu.dsc index 948047e085d5..3f16e20764ec 100644 --- a/OvmfPkg/LoongArchVirt/LoongArchVirtQemu.dsc +++ b/OvmfPkg/LoongArchVirt/LoongArchVirtQemu.dsc @@ -204,6 +204,7 @@ DebugLib | MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf PeiServicesLib | MdePkg/Library/PeiServicesLib/PeiServicesLib.inf VariableFlashInfoLib | MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.inf + VirtNorFlashDeviceLib | OvmfPkg/Library/VirtNorFlashDeviceLib/VirtNorFlashDeviceLib.inf VirtNorFlashPlatformLib | OvmfPkg/Library/FdtNorFlashQemuLib/FdtNorFlashQemuLib.inf [LibraryClasses.common.SEC] diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec index edc72a98fe87..0a1a09fb70ad 100644 --- a/OvmfPkg/OvmfPkg.dec +++ b/OvmfPkg/OvmfPkg.dec @@ -120,6 +120,10 @@ # transports. VirtioMmioDeviceLib|Include/Library/VirtioMmioDeviceLib.h + ## @libraryclass Provides a Device Nor flash interface. + # + VirtNorFlashDeviceLib|Include/Library/VirtNorFlashDeviceLib.h + ## @libraryclass Provides a Nor flash interface. # VirtNorFlashPlatformLib|Include/Library/VirtNorFlashPlatformLib.h diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc index ca211b3db356..aeda34247bd1 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc +++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc @@ -90,6 +90,7 @@ QemuLoadImageLib|OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.inf TimerLib|UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/BaseRiscV64CpuTimerLib.inf + VirtNorFlashDeviceLib|OvmfPkg/Library/VirtNorFlashDeviceLib/VirtNorFlashDeviceLib.inf VirtNorFlashPlatformLib|OvmfPkg/RiscVVirt/Library/VirtNorFlashPlatformLib/VirtNorFlashDeviceTreeLib.inf CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf diff --git a/OvmfPkg/VirtNorFlashDxe/VirtNorFlash.h b/OvmfPkg/VirtNorFlashDxe/VirtNorFlash.h deleted file mode 100644 index 455eafacc2cf..000000000000 --- a/OvmfPkg/VirtNorFlashDxe/VirtNorFlash.h +++ /dev/null @@ -1,345 +0,0 @@ -/** @file NorFlash.h - - Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.
- - SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#ifndef __VIRT_NOR_FLASH__ -#define __VIRT_NOR_FLASH__ - -#include -#include - -#include - -#include - -#include -#include -#include -#include -#include - -#define NOR_FLASH_ERASE_RETRY 10 - -// Device access macros -// These are necessary because we use 2 x 16bit parts to make up 32bit data - -#define HIGH_16_BITS 0xFFFF0000 -#define LOW_16_BITS 0x0000FFFF -#define LOW_8_BITS 0x000000FF - -#define FOLD_32BIT_INTO_16BIT(value) ( ( value >> 16 ) | ( value & LOW_16_BITS ) ) - -#define GET_LOW_BYTE(value) ( value & LOW_8_BITS ) -#define GET_HIGH_BYTE(value) ( GET_LOW_BYTE( value >> 16 ) ) - -// Each command must be sent simultaneously to both chips, -// i.e. at the lower 16 bits AND at the higher 16 bits -#define CREATE_NOR_ADDRESS(BaseAddr, OffsetAddr) ((BaseAddr) + ((OffsetAddr) << 2)) -#define CREATE_DUAL_CMD(Cmd) ( ( Cmd << 16) | ( Cmd & LOW_16_BITS) ) -#define SEND_NOR_COMMAND(BaseAddr, Offset, Cmd) MmioWrite32 (CREATE_NOR_ADDRESS(BaseAddr,Offset), CREATE_DUAL_CMD(Cmd)) -#define GET_NOR_BLOCK_ADDRESS(BaseAddr, Lba, LbaSize) ( BaseAddr + (UINTN)((Lba) * LbaSize) ) - -// Status Register Bits -#define P30_SR_BIT_WRITE (BIT7 << 16 | BIT7) -#define P30_SR_BIT_ERASE_SUSPEND (BIT6 << 16 | BIT6) -#define P30_SR_BIT_ERASE (BIT5 << 16 | BIT5) -#define P30_SR_BIT_PROGRAM (BIT4 << 16 | BIT4) -#define P30_SR_BIT_VPP (BIT3 << 16 | BIT3) -#define P30_SR_BIT_PROGRAM_SUSPEND (BIT2 << 16 | BIT2) -#define P30_SR_BIT_BLOCK_LOCKED (BIT1 << 16 | BIT1) -#define P30_SR_BIT_BEFP (BIT0 << 16 | BIT0) - -// Device Commands for Intel StrataFlash(R) Embedded Memory (P30) Family - -// On chip buffer size for buffered programming operations -// There are 2 chips, each chip can buffer up to 32 (16-bit)words, and each word is 2 bytes. -// Therefore the total size of the buffer is 2 x 32 x 2 = 128 bytes -#define P30_MAX_BUFFER_SIZE_IN_BYTES ((UINTN)128) -#define P30_MAX_BUFFER_SIZE_IN_WORDS (P30_MAX_BUFFER_SIZE_IN_BYTES/((UINTN)4)) -#define MAX_BUFFERED_PROG_ITERATIONS 10000000 -#define BOUNDARY_OF_32_WORDS ((UINTN)0x7F) - -// CFI Addresses -#define P30_CFI_ADDR_QUERY_UNIQUE_QRY 0x10 -#define P30_CFI_ADDR_VENDOR_ID 0x13 - -// CFI Data -#define CFI_QRY 0x00595251 - -// READ Commands -#define P30_CMD_READ_DEVICE_ID 0x0090 -#define P30_CMD_READ_STATUS_REGISTER 0x0070 -#define P30_CMD_CLEAR_STATUS_REGISTER 0x0050 -#define P30_CMD_READ_ARRAY 0x00FF -#define P30_CMD_READ_CFI_QUERY 0x0098 - -// WRITE Commands -#define P30_CMD_WORD_PROGRAM_SETUP 0x0040 -#define P30_CMD_ALTERNATE_WORD_PROGRAM_SETUP 0x0010 -#define P30_CMD_BUFFERED_PROGRAM_SETUP 0x00E8 -#define P30_CMD_BUFFERED_PROGRAM_CONFIRM 0x00D0 -#define P30_CMD_BEFP_SETUP 0x0080 -#define P30_CMD_BEFP_CONFIRM 0x00D0 - -// ERASE Commands -#define P30_CMD_BLOCK_ERASE_SETUP 0x0020 -#define P30_CMD_BLOCK_ERASE_CONFIRM 0x00D0 - -// SUSPEND Commands -#define P30_CMD_PROGRAM_OR_ERASE_SUSPEND 0x00B0 -#define P30_CMD_SUSPEND_RESUME 0x00D0 - -// BLOCK LOCKING / UNLOCKING Commands -#define P30_CMD_LOCK_BLOCK_SETUP 0x0060 -#define P30_CMD_LOCK_BLOCK 0x0001 -#define P30_CMD_UNLOCK_BLOCK 0x00D0 -#define P30_CMD_LOCK_DOWN_BLOCK 0x002F - -// PROTECTION Commands -#define P30_CMD_PROGRAM_PROTECTION_REGISTER_SETUP 0x00C0 - -// CONFIGURATION Commands -#define P30_CMD_READ_CONFIGURATION_REGISTER_SETUP 0x0060 -#define P30_CMD_READ_CONFIGURATION_REGISTER 0x0003 - -#define NOR_FLASH_SIGNATURE SIGNATURE_32('n', 'o', 'r', '0') -#define INSTANCE_FROM_FVB_THIS(a) CR(a, NOR_FLASH_INSTANCE, FvbProtocol, NOR_FLASH_SIGNATURE) - -typedef struct _NOR_FLASH_INSTANCE NOR_FLASH_INSTANCE; - -#pragma pack (1) -typedef struct { - VENDOR_DEVICE_PATH Vendor; - UINT8 Index; - EFI_DEVICE_PATH_PROTOCOL End; -} NOR_FLASH_DEVICE_PATH; -#pragma pack () - -struct _NOR_FLASH_INSTANCE { - UINT32 Signature; - EFI_HANDLE Handle; - - UINTN DeviceBaseAddress; - UINTN RegionBaseAddress; - UINTN Size; - EFI_LBA StartLba; - EFI_LBA LastBlock; - UINT32 BlockSize; - - EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL FvbProtocol; - VOID *ShadowBuffer; - - NOR_FLASH_DEVICE_PATH DevicePath; -}; - -EFI_STATUS -NorFlashReadCfiData ( - IN UINTN DeviceBaseAddress, - IN UINTN CFI_Offset, - IN UINT32 NumberOfBytes, - OUT UINT32 *Data - ); - -EFI_STATUS -NorFlashWriteBuffer ( - IN NOR_FLASH_INSTANCE *Instance, - IN UINTN TargetAddress, - IN UINTN BufferSizeInBytes, - IN UINT32 *Buffer - ); - -// -// NorFlashFvbDxe.c -// - -EFI_STATUS -EFIAPI -FvbGetAttributes ( - IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, - OUT EFI_FVB_ATTRIBUTES_2 *Attributes - ); - -EFI_STATUS -EFIAPI -FvbSetAttributes ( - IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, - IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes - ); - -EFI_STATUS -EFIAPI -FvbGetPhysicalAddress ( - IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, - OUT EFI_PHYSICAL_ADDRESS *Address - ); - -EFI_STATUS -EFIAPI -FvbGetBlockSize ( - IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, - IN EFI_LBA Lba, - OUT UINTN *BlockSize, - OUT UINTN *NumberOfBlocks - ); - -EFI_STATUS -EFIAPI -FvbRead ( - IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, - IN EFI_LBA Lba, - IN UINTN Offset, - IN OUT UINTN *NumBytes, - IN OUT UINT8 *Buffer - ); - -EFI_STATUS -EFIAPI -FvbWrite ( - IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, - IN EFI_LBA Lba, - IN UINTN Offset, - IN OUT UINTN *NumBytes, - IN UINT8 *Buffer - ); - -EFI_STATUS -EFIAPI -FvbEraseBlocks ( - IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, - ... - ); - -EFI_STATUS -ValidateFvHeader ( - IN NOR_FLASH_INSTANCE *Instance - ); - -EFI_STATUS -InitializeFvAndVariableStoreHeaders ( - IN NOR_FLASH_INSTANCE *Instance - ); - -VOID -EFIAPI -FvbVirtualNotifyEvent ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -// -// NorFlashDxe.c -// - -EFI_STATUS -NorFlashWriteFullBlock ( - IN NOR_FLASH_INSTANCE *Instance, - IN EFI_LBA Lba, - IN UINT32 *DataBuffer, - IN UINT32 BlockSizeInWords - ); - -EFI_STATUS -NorFlashUnlockAndEraseSingleBlock ( - IN NOR_FLASH_INSTANCE *Instance, - IN UINTN BlockAddress - ); - -EFI_STATUS -NorFlashCreateInstance ( - IN UINTN NorFlashDeviceBase, - IN UINTN NorFlashRegionBase, - IN UINTN NorFlashSize, - IN UINT32 Index, - IN UINT32 BlockSize, - IN BOOLEAN SupportFvb, - OUT NOR_FLASH_INSTANCE **NorFlashInstance - ); - -EFI_STATUS -EFIAPI -NorFlashFvbInitialize ( - IN NOR_FLASH_INSTANCE *Instance - ); - -// -// NorFlash.c -// -EFI_STATUS -NorFlashWriteSingleBlock ( - IN NOR_FLASH_INSTANCE *Instance, - IN EFI_LBA Lba, - IN UINTN Offset, - IN OUT UINTN *NumBytes, - IN UINT8 *Buffer - ); - -EFI_STATUS -NorFlashWriteBlocks ( - IN NOR_FLASH_INSTANCE *Instance, - IN EFI_LBA Lba, - IN UINTN BufferSizeInBytes, - IN VOID *Buffer - ); - -EFI_STATUS -NorFlashReadBlocks ( - IN NOR_FLASH_INSTANCE *Instance, - IN EFI_LBA Lba, - IN UINTN BufferSizeInBytes, - OUT VOID *Buffer - ); - -EFI_STATUS -NorFlashRead ( - IN NOR_FLASH_INSTANCE *Instance, - IN EFI_LBA Lba, - IN UINTN Offset, - IN UINTN BufferSizeInBytes, - OUT VOID *Buffer - ); - -EFI_STATUS -NorFlashWrite ( - IN NOR_FLASH_INSTANCE *Instance, - IN EFI_LBA Lba, - IN UINTN Offset, - IN OUT UINTN *NumBytes, - IN UINT8 *Buffer - ); - -EFI_STATUS -NorFlashReset ( - IN NOR_FLASH_INSTANCE *Instance - ); - -EFI_STATUS -NorFlashEraseSingleBlock ( - IN NOR_FLASH_INSTANCE *Instance, - IN UINTN BlockAddress - ); - -EFI_STATUS -NorFlashUnlockSingleBlockIfNecessary ( - IN NOR_FLASH_INSTANCE *Instance, - IN UINTN BlockAddress - ); - -EFI_STATUS -NorFlashWriteSingleWord ( - IN NOR_FLASH_INSTANCE *Instance, - IN UINTN WordAddress, - IN UINT32 WriteData - ); - -VOID -EFIAPI -NorFlashVirtualNotifyEvent ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -#endif /* __VIRT_NOR_FLASH__ */ diff --git a/OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.c b/OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.c index 0ff8e5c9c606..5eec1c13985a 100644 --- a/OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.c +++ b/OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.c @@ -1,4 +1,4 @@ -/** @file NorFlashDxe.c +/** @file VirtNorFlashDxe.c Copyright (c) 2011 - 2021, Arm Limited. All rights reserved.
@@ -14,7 +14,7 @@ #include #include -#include "VirtNorFlash.h" +#include "VirtNorFlashDxe.h" STATIC EFI_EVENT mNorFlashVirtualAddrChangeEvent; @@ -138,131 +138,35 @@ NorFlashCreateInstance ( } /** - * This function unlock and erase an entire NOR Flash block. - **/ -EFI_STATUS -NorFlashUnlockAndEraseSingleBlock ( - IN NOR_FLASH_INSTANCE *Instance, - IN UINTN BlockAddress - ) -{ - EFI_STATUS Status; - UINTN Index; - - Index = 0; - // The block erase might fail a first time (SW bug ?). Retry it ... - do { - // Unlock the block if we have to - Status = NorFlashUnlockSingleBlockIfNecessary (Instance, BlockAddress); - if (EFI_ERROR (Status)) { - break; - } - - Status = NorFlashEraseSingleBlock (Instance, BlockAddress); - Index++; - } while ((Index < NOR_FLASH_ERASE_RETRY) && (Status == EFI_WRITE_PROTECTED)); - - if (Index == NOR_FLASH_ERASE_RETRY) { - DEBUG ((DEBUG_ERROR, "EraseSingleBlock(BlockAddress=0x%08x: Block Locked Error (try to erase %d times)\n", BlockAddress, Index)); - } - - return Status; -} - -EFI_STATUS -NorFlashWriteFullBlock ( - IN NOR_FLASH_INSTANCE *Instance, - IN EFI_LBA Lba, - IN UINT32 *DataBuffer, - IN UINT32 BlockSizeInWords + @param[in] Event The Event that is being processed + @param[in] Context Event Context +**/ +VOID +EFIAPI +NorFlashVirtualNotifyEvent ( + IN EFI_EVENT Event, + IN VOID *Context ) { - EFI_STATUS Status; - UINTN WordAddress; - UINT32 WordIndex; - UINTN BufferIndex; - UINTN BlockAddress; - UINTN BuffersInBlock; - UINTN RemainingWords; - UINTN Cnt; + UINTN Index; - Status = EFI_SUCCESS; - - // Get the physical address of the block - BlockAddress = GET_NOR_BLOCK_ADDRESS (Instance->RegionBaseAddress, Lba, BlockSizeInWords * 4); - - // Start writing from the first address at the start of the block - WordAddress = BlockAddress; - - Status = NorFlashUnlockAndEraseSingleBlock (Instance, BlockAddress); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "WriteSingleBlock: ERROR - Failed to Unlock and Erase the single block at 0x%X\n", BlockAddress)); - goto EXIT; - } - - // To speed up the programming operation, NOR Flash is programmed using the Buffered Programming method. - - // Check that the address starts at a 32-word boundary, i.e. last 7 bits must be zero - if ((WordAddress & BOUNDARY_OF_32_WORDS) == 0x00) { - // First, break the entire block into buffer-sized chunks. - BuffersInBlock = (UINTN)(BlockSizeInWords * 4) / P30_MAX_BUFFER_SIZE_IN_BYTES; - - // Then feed each buffer chunk to the NOR Flash - // If a buffer does not contain any data, don't write it. - for (BufferIndex = 0; - BufferIndex < BuffersInBlock; - BufferIndex++, WordAddress += P30_MAX_BUFFER_SIZE_IN_BYTES, DataBuffer += P30_MAX_BUFFER_SIZE_IN_WORDS - ) - { - // Check the buffer to see if it contains any data (not set all 1s). - for (Cnt = 0; Cnt < P30_MAX_BUFFER_SIZE_IN_WORDS; Cnt++) { - if (~DataBuffer[Cnt] != 0 ) { - // Some data found, write the buffer. - Status = NorFlashWriteBuffer ( - Instance, - WordAddress, - P30_MAX_BUFFER_SIZE_IN_BYTES, - DataBuffer - ); - if (EFI_ERROR (Status)) { - goto EXIT; - } - - break; - } - } - } - - // Finally, finish off any remaining words that are less than the maximum size of the buffer - RemainingWords = BlockSizeInWords % P30_MAX_BUFFER_SIZE_IN_WORDS; - - if (RemainingWords != 0) { - Status = NorFlashWriteBuffer (Instance, WordAddress, (RemainingWords * 4), DataBuffer); - if (EFI_ERROR (Status)) { - goto EXIT; - } - } - } else { - // For now, use the single word programming algorithm - // It is unlikely that the NOR Flash will exist in an address which falls within a 32 word boundary range, - // i.e. which ends in the range 0x......01 - 0x......7F. - for (WordIndex = 0; WordIndex < BlockSizeInWords; WordIndex++, DataBuffer++, WordAddress = WordAddress + 4) { - Status = NorFlashWriteSingleWord (Instance, WordAddress, *DataBuffer); - if (EFI_ERROR (Status)) { - goto EXIT; - } + for (Index = 0; Index < mNorFlashDeviceCount; Index++) { + EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->DeviceBaseAddress); + EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->RegionBaseAddress); + + // Convert Fvb + EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->FvbProtocol.EraseBlocks); + EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->FvbProtocol.GetAttributes); + EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->FvbProtocol.GetBlockSize); + EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->FvbProtocol.GetPhysicalAddress); + EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->FvbProtocol.Read); + EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->FvbProtocol.SetAttributes); + EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->FvbProtocol.Write); + + if (mNorFlashInstances[Index]->ShadowBuffer != NULL) { + EfiConvertPointer (0x0, (VOID **)&mNorFlashInstances[Index]->ShadowBuffer); } } - -EXIT: - // Put device back into Read Array mode - SEND_NOR_COMMAND (Instance->DeviceBaseAddress, 0, P30_CMD_READ_ARRAY); - - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "NOR FLASH Programming [WriteSingleBlock] failed at address 0x%08x. Exit Status = \"%r\".\n", WordAddress, Status)); - } - - return Status; } EFI_STATUS diff --git a/OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.h b/OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.h new file mode 100644 index 000000000000..3c7f5094153f --- /dev/null +++ b/OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.h @@ -0,0 +1,156 @@ +/** @file VirtNorFlashDxe.h + + Copyright (c) 2011 - 2021, Arm Limited. All rights reserved.
+ Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef __VIRT_NOR_FLASH_DXE__ +#define __VIRT_NOR_FLASH_DXE__ + +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#define NOR_FLASH_SIGNATURE SIGNATURE_32('n', 'o', 'r', '0') +#define INSTANCE_FROM_FVB_THIS(a) CR(a, NOR_FLASH_INSTANCE, FvbProtocol, NOR_FLASH_SIGNATURE) + +typedef struct _NOR_FLASH_INSTANCE NOR_FLASH_INSTANCE; + +#pragma pack (1) +typedef struct { + VENDOR_DEVICE_PATH Vendor; + UINT8 Index; + EFI_DEVICE_PATH_PROTOCOL End; +} NOR_FLASH_DEVICE_PATH; +#pragma pack () + +struct _NOR_FLASH_INSTANCE { + UINT32 Signature; + EFI_HANDLE Handle; + + UINTN DeviceBaseAddress; + UINTN RegionBaseAddress; + UINTN Size; + EFI_LBA StartLba; + EFI_LBA LastBlock; + UINT32 BlockSize; + + EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL FvbProtocol; + VOID *ShadowBuffer; + + NOR_FLASH_DEVICE_PATH DevicePath; +}; + +// +// NorFlashFvbDxe.c +// + +EFI_STATUS +EFIAPI +FvbGetAttributes ( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + OUT EFI_FVB_ATTRIBUTES_2 *Attributes + ); + +EFI_STATUS +EFIAPI +FvbSetAttributes ( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes + ); + +EFI_STATUS +EFIAPI +FvbGetPhysicalAddress ( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + OUT EFI_PHYSICAL_ADDRESS *Address + ); + +EFI_STATUS +EFIAPI +FvbGetBlockSize ( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + IN EFI_LBA Lba, + OUT UINTN *BlockSize, + OUT UINTN *NumberOfBlocks + ); + +EFI_STATUS +EFIAPI +FvbRead ( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN OUT UINT8 *Buffer + ); + +EFI_STATUS +EFIAPI +FvbWrite ( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN UINT8 *Buffer + ); + +EFI_STATUS +EFIAPI +FvbEraseBlocks ( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This, + ... + ); + +EFI_STATUS +ValidateFvHeader ( + IN NOR_FLASH_INSTANCE *Instance + ); + +EFI_STATUS +InitializeFvAndVariableStoreHeaders ( + IN NOR_FLASH_INSTANCE *Instance + ); + +VOID +EFIAPI +FvbVirtualNotifyEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ); + +// +// NorFlashDxe.c +// +EFI_STATUS +NorFlashCreateInstance ( + IN UINTN NorFlashDeviceBase, + IN UINTN NorFlashRegionBase, + IN UINTN NorFlashSize, + IN UINT32 Index, + IN UINT32 BlockSize, + IN BOOLEAN SupportFvb, + OUT NOR_FLASH_INSTANCE **NorFlashInstance + ); + +EFI_STATUS +EFIAPI +NorFlashFvbInitialize ( + IN NOR_FLASH_INSTANCE *Instance + ); + +#endif /* __VIRT_NOT_FLASH_DXE__ */ diff --git a/OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.inf b/OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.inf index f549400280a1..6d6d615a6219 100644 --- a/OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.inf +++ b/OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.inf @@ -17,8 +17,6 @@ ENTRY_POINT = NorFlashInitialise [Sources.common] - VirtNorFlash.c - VirtNorFlash.h VirtNorFlashDxe.c VirtNorFlashFvb.c @@ -39,6 +37,7 @@ UefiDriverEntryPoint UefiLib UefiRuntimeLib + VirtNorFlashDeviceLib VirtNorFlashPlatformLib [Guids] diff --git a/OvmfPkg/VirtNorFlashDxe/VirtNorFlashFvb.c b/OvmfPkg/VirtNorFlashDxe/VirtNorFlashFvb.c index 59e5f432bcd9..2632e199b7bf 100644 --- a/OvmfPkg/VirtNorFlashDxe/VirtNorFlashFvb.c +++ b/OvmfPkg/VirtNorFlashDxe/VirtNorFlashFvb.c @@ -19,7 +19,7 @@ #include #include -#include "VirtNorFlash.h" +#include "VirtNorFlashDxe.h" extern UINTN mFlashNvStorageVariableBase; /// @@ -653,13 +653,30 @@ FvbRead ( // Decide if we are doing full block reads or not. if (*NumBytes % BlockSize != 0) { - TempStatus = NorFlashRead (Instance, Instance->StartLba + Lba, Offset, *NumBytes, Buffer); + TempStatus = NorFlashRead ( + Instance->DeviceBaseAddress, + Instance->RegionBaseAddress, + Instance->StartLba + Lba, + Instance->BlockSize, + Instance->Size, + Offset, + *NumBytes, + Buffer + ); if (EFI_ERROR (TempStatus)) { return EFI_DEVICE_ERROR; } } else { // Read NOR Flash data into shadow buffer - TempStatus = NorFlashReadBlocks (Instance, Instance->StartLba + Lba, BlockSize, Buffer); + TempStatus = NorFlashReadBlocks ( + Instance->DeviceBaseAddress, + Instance->RegionBaseAddress, + Instance->StartLba + Lba, + Instance->LastBlock, + Instance->BlockSize, + BlockSize, + Buffer + ); if (EFI_ERROR (TempStatus)) { // Return one of the pre-approved error statuses return EFI_DEVICE_ERROR; @@ -748,7 +765,18 @@ FvbWrite ( OriginalTPL = TPL_HIGH_LEVEL; } - Status = NorFlashWriteSingleBlock (Instance, Instance->StartLba + Lba, Offset, NumBytes, Buffer); + Status = NorFlashWriteSingleBlock ( + Instance->DeviceBaseAddress, + Instance->RegionBaseAddress, + Instance->StartLba + Lba, + Instance->LastBlock, + Instance->BlockSize, + Instance->Size, + Offset, + NumBytes, + Buffer, + Instance->ShadowBuffer + ); if (!EfiAtRuntime ()) { // Interruptions can resume. @@ -893,7 +921,7 @@ FvbEraseBlocks ( OriginalTPL = TPL_HIGH_LEVEL; } - Status = NorFlashUnlockAndEraseSingleBlock (Instance, BlockAddress); + Status = NorFlashUnlockAndEraseSingleBlock (Instance->DeviceBaseAddress, BlockAddress); if (!EfiAtRuntime ()) { // Interruptions can resume. gBS->RestoreTPL (OriginalTPL); From 26c80e55ed1c2e32202ce8ee904ca10195e98c71 Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Thu, 17 Apr 2025 16:26:19 -0700 Subject: [PATCH 0114/1172] ArmVirtPkg: Link all targets to the new VirtNorFlashDeviceLib Since VirtNorFlashDxe now depends on the new VirtNorFlashDeviceLib, all related targets should be linked against this library. Signed-off-by: Tuan Phan --- ArmVirtPkg/ArmVirtKvmTool.dsc | 1 + ArmVirtPkg/ArmVirtQemu.dsc | 1 + ArmVirtPkg/ArmVirtQemuKernel.dsc | 1 + 3 files changed, 3 insertions(+) diff --git a/ArmVirtPkg/ArmVirtKvmTool.dsc b/ArmVirtPkg/ArmVirtKvmTool.dsc index 18d60f6cea92..fbf518b9837a 100644 --- a/ArmVirtPkg/ArmVirtKvmTool.dsc +++ b/ArmVirtPkg/ArmVirtKvmTool.dsc @@ -55,6 +55,7 @@ ArmVirtMemInfoLib|ArmVirtPkg/Library/KvmtoolVirtMemInfoLib/KvmtoolVirtMemInfoLib.inf TimerLib|ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf + VirtNorFlashDeviceLib|OvmfPkg/Library/VirtNorFlashDeviceLib/VirtNorFlashDeviceLib.inf VirtNorFlashPlatformLib|ArmVirtPkg/Library/NorFlashKvmtoolLib/NorFlashKvmtoolLib.inf CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc index 7b26b5059e29..735b5c69904a 100644 --- a/ArmVirtPkg/ArmVirtQemu.dsc +++ b/ArmVirtPkg/ArmVirtQemu.dsc @@ -73,6 +73,7 @@ QemuLoadImageLib|OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.inf TimerLib|ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf + VirtNorFlashDeviceLib|OvmfPkg/Library/VirtNorFlashDeviceLib/VirtNorFlashDeviceLib.inf VirtNorFlashPlatformLib|OvmfPkg/Library/FdtNorFlashQemuLib/FdtNorFlashQemuLib.inf CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc index 49bd99346aee..25aac70c05ea 100644 --- a/ArmVirtPkg/ArmVirtQemuKernel.dsc +++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc @@ -72,6 +72,7 @@ ArmVirtMemInfoLib|ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoLib.inf TimerLib|ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf + VirtNorFlashDeviceLib|OvmfPkg/Library/VirtNorFlashDeviceLib/VirtNorFlashDeviceLib.inf VirtNorFlashPlatformLib|OvmfPkg/Library/FdtNorFlashQemuLib/FdtNorFlashQemuLib.inf CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf From 5925977a4e713dcec3ad34f1ee5362fb1bf8ea18 Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Thu, 27 Mar 2025 14:33:35 -0700 Subject: [PATCH 0115/1172] OvmfPkg/RiscVVirt: Add support for Capsule Firmware Upgrade This patch introduces support for firmware upgrades using the FMP capsule update mechanism. Signed-off-by: Tuan Phan --- OvmfPkg/OvmfPkg.ci.yaml | 3 +- .../Capsule/GenerateCapsule/GenCapsule.py | 332 ++++++++ .../CapsuleUpdatePolicyLib.c | 121 +++ .../CapsuleUpdatePolicyLib.inf | 29 + .../CapsuleUpdatePolicyLib.uni | 12 + .../Library/FmpDeviceLib/FmpDeviceLib.c | 774 ++++++++++++++++++ .../Library/FmpDeviceLib/FmpDeviceLib.inf | 46 ++ .../PlatformFlashAccessLib.c | 233 ++++++ .../PlatformFlashAccessLib.h | 95 +++ .../PlatformFlashAccessLib.inf | 34 + OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc | 39 + OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf | 5 + OvmfPkg/RiscVVirt/RiscVVirtSystemFW.dsc.inc | 61 ++ 13 files changed, 1783 insertions(+), 1 deletion(-) create mode 100644 OvmfPkg/RiscVVirt/Feature/Capsule/GenerateCapsule/GenCapsule.py create mode 100644 OvmfPkg/RiscVVirt/Feature/Capsule/Library/CapsuleUpdatePolicyLib/CapsuleUpdatePolicyLib.c create mode 100644 OvmfPkg/RiscVVirt/Feature/Capsule/Library/CapsuleUpdatePolicyLib/CapsuleUpdatePolicyLib.inf create mode 100644 OvmfPkg/RiscVVirt/Feature/Capsule/Library/CapsuleUpdatePolicyLib/CapsuleUpdatePolicyLib.uni create mode 100644 OvmfPkg/RiscVVirt/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.c create mode 100644 OvmfPkg/RiscVVirt/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.inf create mode 100644 OvmfPkg/RiscVVirt/Feature/Capsule/Library/PlatformFlashAccessLib/PlatformFlashAccessLib.c create mode 100644 OvmfPkg/RiscVVirt/Feature/Capsule/Library/PlatformFlashAccessLib/PlatformFlashAccessLib.h create mode 100644 OvmfPkg/RiscVVirt/Feature/Capsule/Library/PlatformFlashAccessLib/PlatformFlashAccessLib.inf create mode 100644 OvmfPkg/RiscVVirt/RiscVVirtSystemFW.dsc.inc diff --git a/OvmfPkg/OvmfPkg.ci.yaml b/OvmfPkg/OvmfPkg.ci.yaml index 62f3aef3c59d..f44c1b8f2df2 100644 --- a/OvmfPkg/OvmfPkg.ci.yaml +++ b/OvmfPkg/OvmfPkg.ci.yaml @@ -54,7 +54,8 @@ "ShellPkg/ShellPkg.dec", "EmbeddedPkg/EmbeddedPkg.dec", "SourceLevelDebugPkg/SourceLevelDebugPkg.dec", - "StandaloneMmPkg/StandaloneMmPkg.dec" + "StandaloneMmPkg/StandaloneMmPkg.dec", + "FmpDevicePkg/FmpDevicePkg.dec" ], # For host based unit tests "AcceptableDependencies-HOST_APPLICATION":[ diff --git a/OvmfPkg/RiscVVirt/Feature/Capsule/GenerateCapsule/GenCapsule.py b/OvmfPkg/RiscVVirt/Feature/Capsule/GenerateCapsule/GenCapsule.py new file mode 100644 index 000000000000..1889328fb9ba --- /dev/null +++ b/OvmfPkg/RiscVVirt/Feature/Capsule/GenerateCapsule/GenCapsule.py @@ -0,0 +1,332 @@ +## @file +# Generate capsules for RiscVVirt platform +# openssl, gcab must be install and in path +# +# Copyright (c) 2019, Intel Corporation. All rights reserved.
+# Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# + +''' +GenCapsuleAll +''' + +import os +import sys +import argparse +import subprocess +import glob +import shutil +import struct +import datetime + +# +# Globals for help information +# +__prog__ = 'GenCapsuleAll' +__copyright__ = 'Copyright (c) 2019, Intel Corporation. All rights reserved.' +__description__ = 'Generate RiscVVirt capsules.\n' + +# +# Globals +# +gWorkspace = '' +gBaseToolsPath = '' +gArgs = None + +def LogAlways(Message): + sys.stdout.write (__prog__ + ': ' + Message + '\n') + sys.stdout.flush() + +def Log(Message): + global gArgs + if not gArgs.Verbose: + return + sys.stdout.write (__prog__ + ': ' + Message + '\n') + sys.stdout.flush() + +def Error(Message, ExitValue=1): + sys.stderr.write (__prog__ + ': ERROR: ' + Message + '\n') + sys.exit (ExitValue) + +def RelativePath(target): + global gWorkspace + Log('RelativePath' + target) + return os.path.relpath (target, gWorkspace) + +def NormalizePath(target): + if isinstance(target, tuple): + return os.path.normpath (os.path.join (*target)) + else: + return os.path.normpath (target) + +def RemoveFile(target): + target = NormalizePath(target) + if not target or target == os.pathsep: + Error ('RemoveFile() invalid target') + if os.path.exists(target): + os.remove (target) + Log ('remove %s' % (RelativePath (target))) + +def RemoveDirectory(target): + target = NormalizePath(target) + if not target or target == os.pathsep: + Error ('RemoveDirectory() invalid target') + if os.path.exists(target): + Log ('rmdir %s' % (RelativePath (target))) + shutil.rmtree(target) + +def CreateDirectory(target): + target = NormalizePath(target) + if not os.path.exists(target): + Log ('mkdir %s' % (RelativePath (target))) + os.makedirs (target) + +def Copy(src, dst): + src = NormalizePath(src) + dst = NormalizePath(dst) + for File in glob.glob(src): + Log ('copy %s -> %s' % (RelativePath (File), RelativePath (dst))) + shutil.copy (File, dst) + +GenerateCapsuleCommand = ''' +GenerateCapsule +--encode +--guid {FMP_CAPSULE_GUID} +--fw-version {FMP_CAPSULE_VERSION} +--lsv {FMP_CAPSULE_LSV} +--signer-private-cert={BASE_TOOLS_PATH}/Source/Python/Pkcs7Sign/TestCert.pem +--other-public-cert={BASE_TOOLS_PATH}/Source/Python/Pkcs7Sign/TestSub.pub.pem +--trusted-public-cert={BASE_TOOLS_PATH}/Source/Python/Pkcs7Sign/TestRoot.pub.pem +-o {FMP_CAPSULE_FILE} +{FMP_CAPSULE_PAYLOAD} +''' +MetaInfoXmlTemplate = ''' + + + com.intel.FMP_CAPSULE_BASE_NAME.firmware + FMP_CAPSULE_BASE_NAME + System firmware for the FMP_CAPSULE_BASE_NAME + + Description of System firmware for the FMP_CAPSULE_BASE_NAME + + + FMP_CAPSULE_GUID + + http://www.tianocore.org + CC0-1.0 + BSD + Tianocore + + + + Build FMP_CAPSULE_STRING + + + + + + + + +''' + +def GenCapsuleDevice (BaseName, PayloadFileName, Guid, Version, Lsv, CapsulesPath, CapsulesSubDir): + global gBaseToolsPath + LogAlways ('Generate Capsule: {0} {1:08x} {2:08x} {3}'.format (Guid, Version, Lsv, PayloadFileName)) + + VersionString = '.'.join([str(ord(x)) for x in struct.pack('>I', Version).decode()]) + + FmpCapsuleFile = NormalizePath ((CapsulesPath, CapsulesSubDir, BaseName + '.' + VersionString + '.cap')) + Command = GenerateCapsuleCommand.format ( + FMP_CAPSULE_GUID = Guid, + FMP_CAPSULE_VERSION = Version, + FMP_CAPSULE_LSV = Lsv, + BASE_TOOLS_PATH = gBaseToolsPath, + FMP_CAPSULE_FILE = FmpCapsuleFile, + FMP_CAPSULE_PAYLOAD = PayloadFileName + ) + Command = ' '.join(Command.splitlines()).strip() + if gArgs.Verbose: + Command = Command + ' -v' + + Log (Command) + + Process = subprocess.Popen(Command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + ProcessOutput = Process.communicate() + + if Process.returncode == 0: + Log (ProcessOutput[0].decode()) + else: + LogAlways (Command) + LogAlways (ProcessOutput[0].decode()) + Error ('GenerateCapsule returned an error') + + Copy (PayloadFileName, (CapsulesPath, 'firmware.bin')) + MetaInfoXml = MetaInfoXmlTemplate + MetaInfoXml = MetaInfoXml.replace ('FMP_CAPSULE_GUID', Guid) + MetaInfoXml = MetaInfoXml.replace ('FMP_CAPSULE_BASE_NAME', BaseName) + MetaInfoXml = MetaInfoXml.replace ('FMP_CAPSULE_VERSION_DECIMAL', str(Version)) + MetaInfoXml = MetaInfoXml.replace ('FMP_CAPSULE_STRING', VersionString) + MetaInfoXml = MetaInfoXml.replace ('FMP_CAPSULE_DATE', str(datetime.date.today())) + f = open (NormalizePath ((CapsulesPath, 'firmware.metainfo.xml')), 'w') + f.write(MetaInfoXml) + f.close() + + Command = 'gcab --create firmware.cab firmware.bin firmware.metainfo.xml' + Log (Command) + + Process = subprocess.Popen(Command, cwd=CapsulesPath, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + ProcessOutput = Process.communicate() + + if Process.returncode == 0: + Log (ProcessOutput[0].decode()) + else: + LogAlways (Command) + LogAlways (ProcessOutput[0].decode()) + Error ('GenerateCapsule returned an error') + + FmpCabinetFile = NormalizePath ((CapsulesPath, CapsulesSubDir, BaseName + '.' + VersionString + '.cab')) + + Copy ((CapsulesPath, 'firmware.cab'), FmpCabinetFile) + + RemoveFile ((CapsulesPath, 'firmware.cab')) + RemoveFile ((CapsulesPath, 'firmware.metainfo.xml')) + RemoveFile ((CapsulesPath, 'firmware.bin')) + +if __name__ == '__main__': + # + # Create command line argument parser object + # + parser = argparse.ArgumentParser ( + prog = __prog__, + description = __description__ + __copyright__, + conflict_handler = 'resolve' + ) + parser.add_argument ( + '-a', '--arch', dest = 'Arch', nargs = '+', action = 'append', + required = True, + help = '''ARCHS is one of list: IA32, X64, IPF, ARM, AARCH64, RISCV64 + or EBC, which overrides target.txt's TARGET_ARCH definition. + To specify more archs, please repeat this option.''' + ) + parser.add_argument ( + '-t', '--tagname', dest = 'ToolChain', required = True, + help = '''Using the Tool Chain Tagname to build the platform, + overriding target.txt's TOOL_CHAIN_TAG definition.''' + ) + parser.add_argument ( + '-p', '--platform', dest = 'PlatformFile', required = True, + help = '''Build the platform specified by the DSC file name argument, + overriding target.txt's ACTIVE_PLATFORM definition.''' + ) + parser.add_argument ( + '-b', '--buildtarget', dest = 'BuildTarget', required = True, + help = '''Using the TARGET to build the platform, overriding + target.txt's TARGET definition.''' + ) + parser.add_argument ( + '--conf=', dest = 'ConfDirectory', required = True, + help = '''Specify the customized Conf directory.''' + ) + parser.add_argument ( + '-D', '--define', dest = 'Define', nargs='*', action = 'append', + help = '''Macro: "Name [= Value]".''' + ) + parser.add_argument ( + '-v', '--verbose', dest = 'Verbose', action = 'store_true', + help = '''Turn on verbose output with informational messages printed''' + ) + parser.add_argument ( + '--package', dest = 'Package', nargs = '*', action = 'append', + help = '''The directory name of a package of tests to copy''' + ) + + # + # Parse command line arguments + # + gArgs, remaining = parser.parse_known_args() + gArgs.BuildType = 'all' + for BuildType in ['all', 'fds', 'genc', 'genmake', 'clean', 'cleanall', 'modules', 'libraries', 'run']: + if BuildType in remaining: + gArgs.BuildType = BuildType + remaining.remove(BuildType) + break + gArgs.Remaining = ' '.join(remaining) + + # + # Get WORKSPACE environment variable + # + try: + gWorkspace = os.environ['WORKSPACE'] + except: + Error ('WORKSPACE environment variable not set') + + # + # Get PACKAGES_PATH and generate prioritized list of paths + # + PathList = [gWorkspace] + try: + PathList += os.environ['PACKAGES_PATH'].split(os.pathsep) + except: + pass + + # + # Determine full path to BaseTools + # + for Path in PathList: + if os.path.exists (os.path.join (Path, 'BaseTools')): + gBaseToolsPath = os.path.join (Path, 'BaseTools') + break + + # + # Parse PLATFORM_NAME from DSC file + # + for Path in PathList: + if os.path.exists (os.path.join (Path, gArgs.PlatformFile)): + Dsc = open (os.path.join (Path, gArgs.PlatformFile), 'r').readlines() + break + for Line in Dsc: + if Line.strip().startswith('PLATFORM_NAME'): + OutputDirectory = os.path.join ('Build', Line.strip().split('=')[1].strip()) + break + + # + # Determine full paths to EDK II build directory, EDK II build output + # directory and the CPU arch of the UEFI phase. + # + CommandDir = os.path.dirname(sys.argv[0]) + EdkiiBuildDir = os.path.join (gWorkspace, OutputDirectory) + EdkiiBuildOutput = os.path.join (EdkiiBuildDir, gArgs.BuildTarget + '_' + gArgs.ToolChain) + UefiArch = gArgs.Arch[0][0] + if len (gArgs.Arch) > 1: + if ['RISCV64'] in gArgs.Arch: + UefiArch = 'RISCV64' + + CapsulesPath = NormalizePath((EdkiiBuildDir, 'Capsules')) + + CapsulesSubDir = 'TestCert' + '_' + UefiArch + '_' + gArgs.BuildTarget + '_' + gArgs.ToolChain + + # + # Create output directories + # + try: + CreateDirectory ((CapsulesPath)) + except: + pass + try: + CreateDirectory ((CapsulesPath, CapsulesSubDir)) + except: + pass + + # + # Copy CapsuleApp + # + Copy ((EdkiiBuildOutput, UefiArch, 'CapsuleApp.efi'), (CapsulesPath, CapsulesSubDir)) + + # + # Generate capsules for RiscVVirt Firmware Updates + # + CodeFW = os.path.join (EdkiiBuildOutput, 'FV', 'RISCV_VIRT_CODE.fd') + GenCapsuleDevice('RISCVVIRT', CodeFW,'bcbacac2-1d1d-4c14-89a3-5e27496b702d',0x00010000,0x00000000, CapsulesPath, CapsulesSubDir) diff --git a/OvmfPkg/RiscVVirt/Feature/Capsule/Library/CapsuleUpdatePolicyLib/CapsuleUpdatePolicyLib.c b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/CapsuleUpdatePolicyLib/CapsuleUpdatePolicyLib.c new file mode 100644 index 000000000000..3d1adfac1849 --- /dev/null +++ b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/CapsuleUpdatePolicyLib/CapsuleUpdatePolicyLib.c @@ -0,0 +1,121 @@ +/** @file + Provides platform policy services used during a capsule update. + + Copyright (c) 2016, Microsoft Corporation. All rights reserved.
+ Copyright (c) 2018, Intel Corporation. All rights reserved.
+ Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include + +/** + Determine if the system power state supports a capsule update. + + @param[out] Good Returns TRUE if system power state supports a capsule + update. Returns FALSE if system power state does not + support a capsule update. Return value is only valid if + return status is EFI_SUCCESS. + + @retval EFI_SUCCESS Good parameter has been updated with result. + @retval EFI_INVALID_PARAMETER Good is NULL. + @retval EFI_DEVICE_ERROR System power state can not be determined. + +**/ +EFI_STATUS +EFIAPI +CheckSystemPower ( + OUT BOOLEAN *Good + ) +{ + *Good = TRUE; + return EFI_SUCCESS; +} + +/** + Determines if the system thermal state supports a capsule update. + + @param[out] Good Returns TRUE if system thermal state supports a capsule + update. Returns FALSE if system thermal state does not + support a capsule update. Return value is only valid if + return status is EFI_SUCCESS. + + @retval EFI_SUCCESS Good parameter has been updated with result. + @retval EFI_INVALID_PARAMETER Good is NULL. + @retval EFI_DEVICE_ERROR System thermal state can not be determined. + +**/ +EFI_STATUS +EFIAPI +CheckSystemThermal ( + OUT BOOLEAN *Good + ) +{ + *Good = TRUE; + return EFI_SUCCESS; +} + +/** + Determines if the system environment state supports a capsule update. + + @param[out] Good Returns TRUE if system environment state supports a capsule + update. Returns FALSE if system environment state does not + support a capsule update. Return value is only valid if + return status is EFI_SUCCESS. + + @retval EFI_SUCCESS Good parameter has been updated with result. + @retval EFI_INVALID_PARAMETER Good is NULL. + @retval EFI_DEVICE_ERROR System environment state can not be determined. + +**/ +EFI_STATUS +EFIAPI +CheckSystemEnvironment ( + OUT BOOLEAN *Good + ) +{ + *Good = TRUE; + return EFI_SUCCESS; +} + +/** + Determines if the Lowest Supported Version checks should be performed. The + expected result from this function is TRUE. A platform can choose to return + FALSE (e.g. during manufacturing or servicing) to allow a capsule update to a + version below the current Lowest Supported Version. + + @retval TRUE The lowest supported version check is required. + @retval FALSE Do not perform lowest support version check. + +**/ +BOOLEAN +EFIAPI +IsLowestSupportedVersionCheckRequired ( + VOID + ) +{ + return TRUE; +} + +/** + Determines if the FMP device should be locked when the event specified by + PcdFmpDeviceLockEventGuid is signaled. The expected result from this function + is TRUE so the FMP device is always locked. A platform can choose to return + FALSE (e.g. during manufacturing) to allow FMP devices to remain unlocked. + + @retval TRUE The FMP device lock action is required at lock event guid. + @retval FALSE Do not perform FMP device lock at lock event guid. + +**/ +BOOLEAN +EFIAPI +IsLockFmpDeviceAtLockEventGuidRequired ( + VOID + ) +{ + // Not lock FMP device for this platform + return FALSE; +} diff --git a/OvmfPkg/RiscVVirt/Feature/Capsule/Library/CapsuleUpdatePolicyLib/CapsuleUpdatePolicyLib.inf b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/CapsuleUpdatePolicyLib/CapsuleUpdatePolicyLib.inf new file mode 100644 index 000000000000..5008100e5159 --- /dev/null +++ b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/CapsuleUpdatePolicyLib/CapsuleUpdatePolicyLib.inf @@ -0,0 +1,29 @@ +## @file +# Provides platform policy services used during a capsule update. +# +# Copyright (c) 2016, Microsoft Corporation. All rights reserved.
+# Copyright (c) 2018, Intel Corporation. All rights reserved.
+# Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 1.30 + BASE_NAME = CapsuleUpdatePolicyLib + MODULE_UNI_FILE = CapsuleUpdatePolicyLib.uni + FILE_GUID = 3ed188f7-7aba-47ff-bdeb-2ac23287a5ea + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = CapsuleUpdatePolicyLib + +# +# VALID_ARCHITECTURES = RISCV64 +# + +[Sources] + CapsuleUpdatePolicyLib.c + +[Packages] + MdePkg/MdePkg.dec + FmpDevicePkg/FmpDevicePkg.dec diff --git a/OvmfPkg/RiscVVirt/Feature/Capsule/Library/CapsuleUpdatePolicyLib/CapsuleUpdatePolicyLib.uni b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/CapsuleUpdatePolicyLib/CapsuleUpdatePolicyLib.uni new file mode 100644 index 000000000000..d26e716b11ad --- /dev/null +++ b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/CapsuleUpdatePolicyLib/CapsuleUpdatePolicyLib.uni @@ -0,0 +1,12 @@ +// /** @file +// Provides platform policy services used during a capsule update. +// +// Copyright (c) 2018, Intel Corporation. All rights reserved.
+// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// **/ + +#string STR_MODULE_ABSTRACT #language en-US "Provides platform policy services used during a capsule update." + +#string STR_MODULE_DESCRIPTION #language en-US "Provides platform policy services used during a capsule update." diff --git a/OvmfPkg/RiscVVirt/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.c b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.c new file mode 100644 index 000000000000..4fe21b763d5b --- /dev/null +++ b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.c @@ -0,0 +1,774 @@ +/** @file + Provides firmware device specific services to support updates of a firmware + image stored in a firmware device. + + Copyright (c) Microsoft Corporation.
+ Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.
+ Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include "../PlatformFlashAccessLib/PlatformFlashAccessLib.h" + +#define __BUILD_STRING(x) L ## #x +#define BUILD_STRING(x) L"build #" __BUILD_STRING(x) +#define CURRENT_FIRMWARE_VERSION FixedPcdGet32 (PcdFirmwareRevision) +#define CURRENT_FIRMWARE_VERSION_STRING BUILD_STRING (CURRENT_FIRMWARE_VERSION) + +typedef struct { + PLATFORM_FIRMWARE_TYPE FirmwareType; + FLASH_ADDRESS_TYPE AddressType; + EFI_PHYSICAL_ADDRESS BaseAddress; + UINTN Length; + UINTN ImageOffset; +} UPDATE_CONFIG_DATA; + +UPDATE_CONFIG_DATA mUpdateConfigData[] = { + { PlatformFirmwareTypeSystemFirmware, FlashAddressTypeAbsoluteAddress, 0x20000000, 0x00800000, 0x00000000 }, +}; + +/** + Provide a function to install the Firmware Management Protocol instance onto a + device handle when the device is managed by a driver that follows the UEFI + Driver Model. If the device is not managed by a driver that follows the UEFI + Driver Model, then EFI_UNSUPPORTED is returned. + + @param[in] FmpInstaller Function that installs the Firmware Management + Protocol. + + @retval EFI_SUCCESS The device is managed by a driver that follows the + UEFI Driver Model. FmpInstaller must be called on + each Driver Binding Start(). + @retval EFI_UNSUPPORTED The device is not managed by a driver that follows + the UEFI Driver Model. + @retval other The Firmware Management Protocol for this firmware + device is not installed. The firmware device is + still locked using FmpDeviceLock(). + +**/ +EFI_STATUS +EFIAPI +RegisterFmpInstaller ( + IN FMP_DEVICE_LIB_REGISTER_FMP_INSTALLER Function + ) +{ + // + // This is a system firmware update that does not use Driver Binding Protocol + // + return EFI_UNSUPPORTED; +} + +/** + Provide a function to uninstall the Firmware Management Protocol instance from a + device handle when the device is managed by a driver that follows the UEFI + Driver Model. If the device is not managed by a driver that follows the UEFI + Driver Model, then EFI_UNSUPPORTED is returned. + + @param[in] FmpUninstaller Function that installs the Firmware Management + Protocol. + + @retval EFI_SUCCESS The device is managed by a driver that follows the + UEFI Driver Model. FmpUninstaller must be called on + each Driver Binding Stop(). + @retval EFI_UNSUPPORTED The device is not managed by a driver that follows + the UEFI Driver Model. + @retval other The Firmware Management Protocol for this firmware + device is not installed. The firmware device is + still locked using FmpDeviceLock(). + +**/ +EFI_STATUS +EFIAPI +RegisterFmpUninstaller ( + IN FMP_DEVICE_LIB_REGISTER_FMP_UNINSTALLER Function + ) +{ + // + // This is a system firmware update that does not use Driver Binding Protocol + // + return EFI_UNSUPPORTED; +} + +/** + Set the device context for the FmpDeviceLib services when the device is + managed by a driver that follows the UEFI Driver Model. If the device is not + managed by a driver that follows the UEFI Driver Model, then EFI_UNSUPPORTED + is returned. Once a device context is set, the FmpDeviceLib services + operate on the currently set device context. + + @param[in] Handle Device handle for the FmpDeviceLib services. + If Handle is NULL, then Context is freed. + @param[in, out] Context Device context for the FmpDeviceLib services. + If Context is NULL, then a new context is allocated + for Handle and the current device context is set and + returned in Context. If Context is not NULL, then + the current device context is set. + + @retval EFI_SUCCESS The device is managed by a driver that follows the + UEFI Driver Model. + @retval EFI_UNSUPPORTED The device is not managed by a driver that follows + the UEFI Driver Model. + @retval other The Firmware Management Protocol for this firmware + device is not installed. The firmware device is + still locked using FmpDeviceLock(). + +**/ +EFI_STATUS +EFIAPI +FmpDeviceSetContext ( + IN EFI_HANDLE Handle, + IN OUT VOID **Context + ) +{ + // + // This is a system firmware update that does not use Driver Binding Protocol + // + return EFI_UNSUPPORTED; +} + +/** + Returns the size, in bytes, of the firmware image currently stored in the + firmware device. This function is used to by the GetImage() and + GetImageInfo() services of the Firmware Management Protocol. If the image + size can not be determined from the firmware device, then 0 must be returned. + + @param[out] Size Pointer to the size, in bytes, of the firmware image + currently stored in the firmware device. + + @retval EFI_SUCCESS The size of the firmware image currently + stored in the firmware device was returned. + @retval EFI_INVALID_PARAMETER Size is NULL. + @retval EFI_UNSUPPORTED The firmware device does not support reporting + the size of the currently stored firmware image. + @retval EFI_DEVICE_ERROR An error occurred attempting to determine the + size of the firmware image currently stored in + in the firmware device. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetSize ( + OUT UINTN *Size + ) +{ + if (Size == NULL) { + return EFI_INVALID_PARAMETER; + } + + return EFI_UNSUPPORTED; +} + +/** + Returns the GUID value used to fill in the ImageTypeId field of the + EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo() + service of the Firmware Management Protocol. If EFI_UNSUPPORTED is returned, + then the ImageTypeId field is set to gEfiCallerIdGuid. If EFI_SUCCESS is + returned, then ImageTypeId is set to the Guid returned from this function. + + @param[out] Guid Double pointer to a GUID value that is updated to point to + to a GUID value. The GUID value is not allocated and must + not be modified or freed by the caller. + + @retval EFI_SUCCESS EFI_FIRMWARE_IMAGE_DESCRIPTOR ImageTypeId GUID is set + to the returned Guid value. + @retval EFI_UNSUPPORTED EFI_FIRMWARE_IMAGE_DESCRIPTOR ImageTypeId GUID is set + to gEfiCallerIdGuid. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetImageTypeIdGuidPtr ( + OUT EFI_GUID **Guid + ) +{ + *Guid = &gEfiCallerIdGuid; + + return EFI_SUCCESS; +} + +/** + Returns values used to fill in the AttributesSupported and AttributesSettings + fields of the EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the + GetImageInfo() service of the Firmware Management Protocol. The following + bit values from the Firmware Management Protocol may be combined: + IMAGE_ATTRIBUTE_IMAGE_UPDATABLE + IMAGE_ATTRIBUTE_RESET_REQUIRED + IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED + IMAGE_ATTRIBUTE_IN_USE + IMAGE_ATTRIBUTE_UEFI_IMAGE + + @param[out] Supported Attributes supported by this firmware device. + @param[out] Setting Attributes settings for this firmware device. + + @retval EFI_SUCCESS The attributes supported by the firmware + device were returned. + @retval EFI_INVALID_PARAMETER Supported is NULL. + @retval EFI_INVALID_PARAMETER Setting is NULL. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetAttributes ( + OUT UINT64 *Supported, + OUT UINT64 *Setting + ) +{ + if ((Supported == NULL) || (Setting == NULL)) { + return EFI_INVALID_PARAMETER; + } + + *Supported = (IMAGE_ATTRIBUTE_IMAGE_UPDATABLE | + IMAGE_ATTRIBUTE_RESET_REQUIRED | + IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED | + IMAGE_ATTRIBUTE_IN_USE + ); + *Setting = (IMAGE_ATTRIBUTE_IMAGE_UPDATABLE | + IMAGE_ATTRIBUTE_RESET_REQUIRED | + IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED | + IMAGE_ATTRIBUTE_IN_USE + ); + return EFI_SUCCESS; +} + +/** + Returns the value used to fill in the LowestSupportedVersion field of the + EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo() + service of the Firmware Management Protocol. If EFI_SUCCESS is returned, then + the firmware device supports a method to report the LowestSupportedVersion + value from the currently stored firmware image. If the value can not be + reported for the firmware image currently stored in the firmware device, then + EFI_UNSUPPORTED must be returned. EFI_DEVICE_ERROR is returned if an error + occurs attempting to retrieve the LowestSupportedVersion value for the + currently stored firmware image. + + @note It is recommended that all firmware devices support a method to report + the LowestSupportedVersion value from the currently stored firmware + image. + + @param[out] LowestSupportedVersion LowestSupportedVersion value retrieved + from the currently stored firmware image. + + @retval EFI_SUCCESS The lowest supported version of currently stored + firmware image was returned in LowestSupportedVersion. + @retval EFI_UNSUPPORTED The firmware device does not support a method to + report the lowest supported version of the currently + stored firmware image. + @retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the lowest + supported version of the currently stored firmware + image. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetLowestSupportedVersion ( + OUT UINT32 *LowestSupportedVersion + ) +{ + *LowestSupportedVersion = PcdGet32 (PcdFmpDeviceBuildTimeLowestSupportedVersion); + return EFI_SUCCESS; +} + +/** + Returns the Null-terminated Unicode string that is used to fill in the + VersionName field of the EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is + returned by the GetImageInfo() service of the Firmware Management Protocol. + The returned string must be allocated using EFI_BOOT_SERVICES.AllocatePool(). + + @note It is recommended that all firmware devices support a method to report + the VersionName string from the currently stored firmware image. + + @param[out] VersionString The version string retrieved from the currently + stored firmware image. + + @retval EFI_SUCCESS The version string of currently stored + firmware image was returned in Version. + @retval EFI_INVALID_PARAMETER VersionString is NULL. + @retval EFI_UNSUPPORTED The firmware device does not support a method + to report the version string of the currently + stored firmware image. + @retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the + version string of the currently stored + firmware image. + @retval EFI_OUT_OF_RESOURCES There are not enough resources to allocate the + buffer for the version string of the currently + stored firmware image. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetVersionString ( + OUT CHAR16 **VersionString + ) +{ + if (VersionString == NULL) { + return EFI_INVALID_PARAMETER; + } + + *VersionString = (CHAR16 *)AllocateCopyPool ( + sizeof (CURRENT_FIRMWARE_VERSION_STRING), + CURRENT_FIRMWARE_VERSION_STRING + ); + if (*VersionString == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + return EFI_SUCCESS; +} + +/** + Returns the value used to fill in the Version field of the + EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo() + service of the Firmware Management Protocol. If EFI_SUCCESS is returned, then + the firmware device supports a method to report the Version value from the + currently stored firmware image. If the value can not be reported for the + firmware image currently stored in the firmware device, then EFI_UNSUPPORTED + must be returned. EFI_DEVICE_ERROR is returned if an error occurs attempting + to retrieve the LowestSupportedVersion value for the currently stored firmware + image. + + @note It is recommended that all firmware devices support a method to report + the Version value from the currently stored firmware image. + + @param[out] Version The version value retrieved from the currently stored + firmware image. + + @retval EFI_SUCCESS The version of currently stored firmware image was + returned in Version. + @retval EFI_UNSUPPORTED The firmware device does not support a method to + report the version of the currently stored firmware + image. + @retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the version + of the currently stored firmware image. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetVersion ( + OUT UINT32 *Version + ) +{ + *Version = PcdGet32 (PcdFirmwareRevision); + return EFI_SUCCESS; +} + +/** + Returns the value used to fill in the HardwareInstance field of the + EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo() + service of the Firmware Management Protocol. If EFI_SUCCESS is returned, then + the firmware device supports a method to report the HardwareInstance value. + If the value can not be reported for the firmware device, then EFI_UNSUPPORTED + must be returned. EFI_DEVICE_ERROR is returned if an error occurs attempting + to retrieve the HardwareInstance value for the firmware device. + + @param[out] HardwareInstance The hardware instance value for the firmware + device. + + @retval EFI_SUCCESS The hardware instance for the current firmware + device is returned in HardwareInstance. + @retval EFI_UNSUPPORTED The firmware device does not support a method to + report the hardware instance value. + @retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the hardware + instance value. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetHardwareInstance ( + OUT UINT64 *HardwareInstance + ) +{ + return EFI_UNSUPPORTED; +} + +/** + Returns a copy of the firmware image currently stored in the firmware device. + + @note It is recommended that all firmware devices support a method to retrieve + a copy currently stored firmware image. This can be used to support + features such as recovery and rollback. + + @param[out] Image Pointer to a caller allocated buffer where the + currently stored firmware image is copied to. + @param[in, out] ImageSize Pointer the size, in bytes, of the Image buffer. + On return, points to the size, in bytes, of firmware + image currently stored in the firmware device. + + @retval EFI_SUCCESS Image contains a copy of the firmware image + currently stored in the firmware device, and + ImageSize contains the size, in bytes, of the + firmware image currently stored in the + firmware device. + @retval EFI_BUFFER_TOO_SMALL The buffer specified by ImageSize is too small + to hold the firmware image currently stored in + the firmware device. The buffer size required + is returned in ImageSize. + @retval EFI_INVALID_PARAMETER The Image is NULL. + @retval EFI_INVALID_PARAMETER The ImageSize is NULL. + @retval EFI_UNSUPPORTED The operation is not supported. + @retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the + firmware image currently stored in the firmware + device. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetImage ( + OUT VOID *Image, + IN OUT UINTN *ImageSize + ) +{ + return EFI_UNSUPPORTED; +} + +/** + Checks if a new firmware image is valid for the firmware device. This + function allows firmware update operation to validate the firmware image + before FmpDeviceSetImage() is called. + + @param[in] Image Points to a new firmware image. + @param[in] ImageSize Size, in bytes, of a new firmware image. + @param[out] ImageUpdatable Indicates if a new firmware image is valid for + a firmware update to the firmware device. The + following values from the Firmware Management + Protocol are supported: + IMAGE_UPDATABLE_VALID + IMAGE_UPDATABLE_INVALID + IMAGE_UPDATABLE_INVALID_TYPE + IMAGE_UPDATABLE_INVALID_OLD + IMAGE_UPDATABLE_VALID_WITH_VENDOR_CODE + + @retval EFI_SUCCESS The image was successfully checked. Additional + status information is returned in + ImageUpdatable. + @retval EFI_INVALID_PARAMETER Image is NULL. + @retval EFI_INVALID_PARAMETER ImageUpdatable is NULL. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceCheckImage ( + IN CONST VOID *Image, + IN UINTN ImageSize, + OUT UINT32 *ImageUpdatable + ) +{ + UINT32 LastAttemptStatus; + + return FmpDeviceCheckImageWithStatus (Image, ImageSize, ImageUpdatable, &LastAttemptStatus); +} + +/** + Checks if a new firmware image is valid for the firmware device. This + function allows firmware update operation to validate the firmware image + before FmpDeviceSetImage() is called. + + @param[in] Image Points to a new firmware image. + @param[in] ImageSize Size, in bytes, of a new firmware image. + @param[out] ImageUpdatable Indicates if a new firmware image is valid for + a firmware update to the firmware device. The + following values from the Firmware Management + Protocol are supported: + IMAGE_UPDATABLE_VALID + IMAGE_UPDATABLE_INVALID + IMAGE_UPDATABLE_INVALID_TYPE + IMAGE_UPDATABLE_INVALID_OLD + IMAGE_UPDATABLE_VALID_WITH_VENDOR_CODE + @param[out] LastAttemptStatus A pointer to a UINT32 that holds the last attempt + status to report back to the ESRT table in case + of error. + + The return status code must fall in the range of + LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MIN_ERROR_CODE_VALUE to + LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MAX_ERROR_CODE_VALUE. + + If the value falls outside this range, it will be converted + to LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL. + + @retval EFI_SUCCESS The image was successfully checked. Additional + status information is returned in + ImageUpdatable. + @retval EFI_INVALID_PARAMETER Image is NULL. + @retval EFI_INVALID_PARAMETER ImageUpdatable is NULL. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceCheckImageWithStatus ( + IN CONST VOID *Image, + IN UINTN ImageSize, + OUT UINT32 *ImageUpdatable, + OUT UINT32 *LastAttemptStatus + ) +{ + if (LastAttemptStatus == NULL) { + DEBUG ((DEBUG_ERROR, "CheckImageWithStatus - LastAttemptStatus Pointer Parameter is NULL.\n")); + return EFI_INVALID_PARAMETER; + } + + *LastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS; + + if (ImageUpdatable == NULL) { + DEBUG ((DEBUG_ERROR, "CheckImageWithStatus - ImageUpdatable Pointer Parameter is NULL.\n")); + *LastAttemptStatus = LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MIN_ERROR_CODE_VALUE; + return EFI_INVALID_PARAMETER; + } + + // + // Set to valid and then if any tests fail it will update this flag. + // + *ImageUpdatable = IMAGE_UPDATABLE_VALID; + + if (Image == NULL) { + DEBUG ((DEBUG_ERROR, "CheckImageWithStatus - Image Pointer Parameter is NULL.\n")); + // + // Not sure if this is needed + // + *ImageUpdatable = IMAGE_UPDATABLE_INVALID; + *LastAttemptStatus = LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MIN_ERROR_CODE_VALUE; + return EFI_INVALID_PARAMETER; + } + + return EFI_SUCCESS; +} + +/** + Updates a firmware device with a new firmware image. This function returns + EFI_UNSUPPORTED if the firmware image is not updatable. If the firmware image + is updatable, the function should perform the following minimal validations + before proceeding to do the firmware image update. + - Validate that the image is a supported image for this firmware device. + Return EFI_ABORTED if the image is not supported. Additional details + on why the image is not a supported image may be returned in AbortReason. + - Validate the data from VendorCode if is not NULL. Firmware image + validation must be performed before VendorCode data validation. + VendorCode data is ignored or considered invalid if image validation + fails. Return EFI_ABORTED if the VendorCode data is invalid. + + VendorCode enables vendor to implement vendor-specific firmware image update + policy. Null if the caller did not specify the policy or use the default + policy. As an example, vendor can implement a policy to allow an option to + force a firmware image update when the abort reason is due to the new firmware + image version is older than the current firmware image version or bad image + checksum. Sensitive operations such as those wiping the entire firmware image + and render the device to be non-functional should be encoded in the image + itself rather than passed with the VendorCode. AbortReason enables vendor to + have the option to provide a more detailed description of the abort reason to + the caller. + + @param[in] Image Points to the new firmware image. + @param[in] ImageSize Size, in bytes, of the new firmware image. + @param[in] VendorCode This enables vendor to implement vendor-specific + firmware image update policy. NULL indicates + the caller did not specify the policy or use the + default policy. + @param[in] Progress A function used to report the progress of + updating the firmware device with the new + firmware image. + @param[in] CapsuleFwVersion The version of the new firmware image from the + update capsule that provided the new firmware + image. + @param[out] AbortReason A pointer to a pointer to a Null-terminated + Unicode string providing more details on an + aborted operation. The buffer is allocated by + this function with + EFI_BOOT_SERVICES.AllocatePool(). It is the + caller's responsibility to free this buffer with + EFI_BOOT_SERVICES.FreePool(). + + @retval EFI_SUCCESS The firmware device was successfully updated + with the new firmware image. + @retval EFI_ABORTED The operation is aborted. Additional details + are provided in AbortReason. + @retval EFI_INVALID_PARAMETER The Image was NULL. + @retval EFI_UNSUPPORTED The operation is not supported. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceSetImage ( + IN CONST VOID *Image, + IN UINTN ImageSize, + IN CONST VOID *VendorCode OPTIONAL, + IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress OPTIONAL, + IN UINT32 CapsuleFwVersion, + OUT CHAR16 **AbortReason + ) +{ + UINT32 LastAttemptStatus; + + return FmpDeviceSetImageWithStatus ( + Image, + ImageSize, + VendorCode, + Progress, + CapsuleFwVersion, + AbortReason, + &LastAttemptStatus + ); +} + +/** + Updates a firmware device with a new firmware image. This function returns + EFI_UNSUPPORTED if the firmware image is not updatable. If the firmware image + is updatable, the function should perform the following minimal validations + before proceeding to do the firmware image update. + - Validate that the image is a supported image for this firmware device. + Return EFI_ABORTED if the image is not supported. Additional details + on why the image is not a supported image may be returned in AbortReason. + - Validate the data from VendorCode if is not NULL. Firmware image + validation must be performed before VendorCode data validation. + VendorCode data is ignored or considered invalid if image validation + fails. Return EFI_ABORTED if the VendorCode data is invalid. + + VendorCode enables vendor to implement vendor-specific firmware image update + policy. Null if the caller did not specify the policy or use the default + policy. As an example, vendor can implement a policy to allow an option to + force a firmware image update when the abort reason is due to the new firmware + image version is older than the current firmware image version or bad image + checksum. Sensitive operations such as those wiping the entire firmware image + and render the device to be non-functional should be encoded in the image + itself rather than passed with the VendorCode. AbortReason enables vendor to + have the option to provide a more detailed description of the abort reason to + the caller. + + @param[in] Image Points to the new firmware image. + @param[in] ImageSize Size, in bytes, of the new firmware image. + @param[in] VendorCode This enables vendor to implement vendor-specific + firmware image update policy. NULL indicates + the caller did not specify the policy or use the + default policy. + @param[in] Progress A function used to report the progress of + updating the firmware device with the new + firmware image. + @param[in] CapsuleFwVersion The version of the new firmware image from the + update capsule that provided the new firmware + image. + @param[out] AbortReason A pointer to a pointer to a Null-terminated + Unicode string providing more details on an + aborted operation. The buffer is allocated by + this function with + EFI_BOOT_SERVICES.AllocatePool(). It is the + caller's responsibility to free this buffer with + EFI_BOOT_SERVICES.FreePool(). + @param[out] LastAttemptStatus A pointer to a UINT32 that holds the last attempt + status to report back to the ESRT table in case + of error. This value will only be checked when this + function returns an error. + + The return status code must fall in the range of + LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MIN_ERROR_CODE_VALUE to + LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MAX_ERROR_CODE_VALUE. + + If the value falls outside this range, it will be converted + to LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL. + + @retval EFI_SUCCESS The firmware device was successfully updated + with the new firmware image. + @retval EFI_ABORTED The operation is aborted. Additional details + are provided in AbortReason. + @retval EFI_INVALID_PARAMETER The Image was NULL. + @retval EFI_UNSUPPORTED The operation is not supported. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceSetImageWithStatus ( + IN CONST VOID *Image, + IN UINTN ImageSize, + IN CONST VOID *VendorCode OPTIONAL, + IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress OPTIONAL, + IN UINT32 CapsuleFwVersion, + OUT CHAR16 **AbortReason, + OUT UINT32 *LastAttemptStatus + ) +{ + EFI_STATUS Status; + UINTN Index; + UPDATE_CONFIG_DATA *ConfigData; + UINTN TotalSize; + UINTN BytesWritten; + + if (Progress == NULL) { + DEBUG ((DEBUG_ERROR, "FmpDeviceSetImageWithStatus - Invalid progress callback\n")); + *LastAttemptStatus = LAST_ATTEMPT_STATUS_ERROR_UNSATISFIED_DEPENDENCIES; + return EFI_INVALID_PARAMETER; + } + + *LastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS; + DEBUG ((DEBUG_INFO, "FmpDeviceSetImageWithStatus - %d Images ...\n", ARRAY_SIZE (mUpdateConfigData))); + + // + // Compute total size of update + // + for (Index = 0, TotalSize = 0; Index < ARRAY_SIZE (mUpdateConfigData); Index++) { + TotalSize += mUpdateConfigData[Index].Length; + } + + BytesWritten = 0; + for (Index = 0, ConfigData = mUpdateConfigData; Index < ARRAY_SIZE (mUpdateConfigData); Index++, ConfigData++) { + DEBUG (( + DEBUG_INFO, + "PlatformUpdate(%d): BaseAddress - 0x%lx ImageOffset - 0x%x Length - 0x%x\n", + Index, + ConfigData->BaseAddress, + ConfigData->ImageOffset, + ConfigData->Length + )); + Status = PerformFlashWriteWithProgress ( + ConfigData->FirmwareType, // FirmwareType + ConfigData->BaseAddress, // FlashAddress + ConfigData->AddressType, // FlashAddressType + (VOID *)((UINTN)Image + (UINTN)ConfigData->ImageOffset), // Buffer + ConfigData->Length, // BufferLength + Progress, // Progress + BytesWritten / TotalSize, // StartPercentage + (BytesWritten + ConfigData->Length) * 80 / TotalSize // EndPercentage + ); + if (EFI_ERROR (Status)) { + break; + } + + BytesWritten += ConfigData->Length; + } + + DEBUG ((DEBUG_INFO, "FmpDeviceSetImageWithStatus - %r\n", Status)); + + if (EFI_ERROR (Status)) { + *LastAttemptStatus = LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MIN_ERROR_CODE_VALUE; + } + + return Status; +} + +/** + Lock the firmware device that contains a firmware image. Once a firmware + device is locked, any attempts to modify the firmware image contents in the + firmware device must fail. + + @note It is recommended that all firmware devices support a lock method to + prevent modifications to a stored firmware image. + + @note A firmware device lock mechanism is typically only cleared by a full + system reset (not just sleep state/low power mode). + + @retval EFI_SUCCESS The firmware device was locked. + @retval EFI_UNSUPPORTED The firmware device does not support locking + +**/ +EFI_STATUS +EFIAPI +FmpDeviceLock ( + VOID + ) +{ + return EFI_UNSUPPORTED; +} diff --git a/OvmfPkg/RiscVVirt/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.inf b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.inf new file mode 100644 index 000000000000..abdf5d5d6ddc --- /dev/null +++ b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.inf @@ -0,0 +1,46 @@ +## @file +# Provides firmware device specific services to support updates of a firmware +# image stored in a firmware device. +# +# Copyright (c) 2016, Microsoft Corporation. All rights reserved.
+# Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.
+# Copyright (c) 2025, Ventana Micro Systems Inc. All Rights Reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 1.30 + BASE_NAME = FmpDeviceLib + FILE_GUID = BCBACAC2-1D1D-4C14-89A3-5E27496B702D + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = FmpDeviceLib|DXE_DRIVER UEFI_DRIVER + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 +# + +[Sources] + FmpDeviceLib.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + FmpDevicePkg/FmpDevicePkg.dec + +[LibraryClasses] + DebugLib + BaseLib + BaseMemoryLib + MemoryAllocationLib + PlatformFlashAccessLib + +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareRevision + gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceBuildTimeLowestSupportedVersion + + + diff --git a/OvmfPkg/RiscVVirt/Feature/Capsule/Library/PlatformFlashAccessLib/PlatformFlashAccessLib.c b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/PlatformFlashAccessLib/PlatformFlashAccessLib.c new file mode 100644 index 000000000000..cea6f8d8031c --- /dev/null +++ b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/PlatformFlashAccessLib/PlatformFlashAccessLib.c @@ -0,0 +1,233 @@ +/** @file + Platform Flash Access library. + + Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.
+ Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include "PlatformFlashAccessLib.h" + +#define ALIGN(v, a) (UINTN)((((v) - 1) | ((a) - 1)) + 1) + +#define FLASH_CODE_BASE 0x20000000 +#define FLASH_DATA_BASE 0x22000000 +#define FLASH_SIZE SIZE_32MB +#define BLOCK_SIZE SIZE_256KB + +/** + Perform flash write operation with progress indicator. The start and end + completion percentage values are passed into this function. If the requested + flash write operation is broken up, then completion percentage between the + start and end values may be passed to the provided Progress function. The + caller of this function is required to call the Progress function for the + start and end completion percentage values. This allows the Progress, + StartPercentage, and EndPercentage parameters to be ignored if the requested + flash write operation can not be broken up + + @param[in] FirmwareType The type of firmware. + @param[in] FlashAddress The address of flash device to be accessed. + @param[in] FlashAddressType The type of flash device address. + @param[in] Buffer The pointer to the data buffer. + @param[in] Length The length of data buffer in bytes. + @param[in] Progress A function used report the progress of the + firmware update. This is an optional parameter + that may be NULL. + @param[in] StartPercentage The start completion percentage value that may + be used to report progress during the flash + write operation. + @param[in] EndPercentage The end completion percentage value that may + be used to report progress during the flash + write operation. + + @retval EFI_SUCCESS The operation returns successfully. + @retval EFI_WRITE_PROTECTED The flash device is read only. + @retval EFI_UNSUPPORTED The flash device access is unsupported. + @retval EFI_INVALID_PARAMETER The input parameter is not valid. +**/ +EFI_STATUS +EFIAPI +PerformFlashWriteWithProgress ( + IN PLATFORM_FIRMWARE_TYPE FirmwareType, + IN EFI_PHYSICAL_ADDRESS FlashAddress, + IN FLASH_ADDRESS_TYPE FlashAddressType, + IN VOID *Buffer, + IN UINTN Length, + IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress, OPTIONAL + IN UINTN StartPercentage, + IN UINTN EndPercentage + ) +{ + EFI_STATUS Status = EFI_SUCCESS; + UINTN LbaNum; + UINTN Lba; + UINTN Index; + VOID *ShadowBuffer; + UINTN LastBlock; + UINTN NumByte; + UINTN FlashBase; + + DEBUG ((DEBUG_INFO, "PerformFlashWrite - 0x%x(%x) - 0x%x\n", (UINTN)FlashAddress, (UINTN)FlashAddressType, Length)); + + if (FlashAddressType != FlashAddressTypeAbsoluteAddress) { + // Only support absolute address for this platform + return EFI_INVALID_PARAMETER; + } + + if (FirmwareType == PlatformFirmwareTypeSystemFirmware) { + if ((FlashAddress < FLASH_CODE_BASE) || ((FlashAddress + Length) > (FLASH_CODE_BASE + FLASH_SIZE))) { + return EFI_INVALID_PARAMETER; + } + + FlashBase = FLASH_CODE_BASE; + } else { + if ((FlashAddress < FLASH_DATA_BASE) || ((FlashAddress + Length) > (FLASH_DATA_BASE + FLASH_SIZE))) { + return EFI_INVALID_PARAMETER; + } + + FlashBase = FLASH_DATA_BASE; + } + + ShadowBuffer = AllocateZeroPool (BLOCK_SIZE); + LastBlock = FLASH_SIZE / BLOCK_SIZE - 1; + if ( (ALIGN (FlashAddress, BLOCK_SIZE) != FlashAddress) + || (Length % BLOCK_SIZE)) + { + // Not expect un-aligned flash address + return EFI_INVALID_PARAMETER; + } + + // + // Erase & Write + // + LbaNum = Length / BLOCK_SIZE; + Lba = (FlashAddress - FlashBase) / BLOCK_SIZE; + for (Index = 0; Index < LbaNum; Index++) { + if (Progress != NULL) { + Progress (StartPercentage + ((Index * (EndPercentage - StartPercentage)) / LbaNum)); + } + + if (CompareMem ( + (UINT8 *)(UINTN)(GET_NOR_BLOCK_ADDRESS (FlashBase, Lba + Index, BLOCK_SIZE)), + (UINT8 *)Buffer + Index * BLOCK_SIZE, + BLOCK_SIZE + ) == 0) + { + DEBUG ((DEBUG_INFO, "Sector - 0x%x - skip\n", Index)); + continue; + } + + DEBUG ((DEBUG_INFO, "Sector - 0x%x - update...\n", Index)); + NumByte = BLOCK_SIZE; + Status = NorFlashWriteSingleBlock ( + FlashBase, + FlashBase, + Lba + Index, + LastBlock, + BLOCK_SIZE, + FLASH_SIZE, + 0, + &NumByte, + (UINT8 *)Buffer + Index * BLOCK_SIZE, + ShadowBuffer + ); + if ((Status != EFI_SUCCESS) || (NumByte != BLOCK_SIZE)) { + DEBUG (( + DEBUG_ERROR, + "Sector - 0x%x - update failed (bytes written)...\n", + Index, + NumByte + )); + break; + } + } + + if (Progress != NULL) { + Progress (EndPercentage); + } + + FreePool (ShadowBuffer); + return Status; +} + +/** + Perform flash write operation. + + @param[in] FirmwareType The type of firmware. + @param[in] FlashAddress The address of flash device to be accessed. + @param[in] FlashAddressType The type of flash device address. + @param[in] Buffer The pointer to the data buffer. + @param[in] Length The length of data buffer in bytes. + + @retval EFI_SUCCESS The operation returns successfully. + @retval EFI_WRITE_PROTECTED The flash device is read only. + @retval EFI_UNSUPPORTED The flash device access is unsupported. + @retval EFI_INVALID_PARAMETER The input parameter is not valid. +**/ +EFI_STATUS +EFIAPI +PerformFlashWrite ( + IN PLATFORM_FIRMWARE_TYPE FirmwareType, + IN EFI_PHYSICAL_ADDRESS FlashAddress, + IN FLASH_ADDRESS_TYPE FlashAddressType, + IN VOID *Buffer, + IN UINTN Length + ) +{ + return PerformFlashWriteWithProgress ( + FirmwareType, + FlashAddress, + FlashAddressType, + Buffer, + Length, + NULL, + 0, + 0 + ); +} + +/** + Platform Flash Access Lib Constructor. + + @retval EFI_SUCCESS Constructor returns successfully. +**/ +EFI_STATUS +EFIAPI +PlatformFlashAccessLibConstructor ( + VOID + ) +{ + EFI_STATUS Status; + + // + // map the code flash region, the data flash region + // already mapped via variable driver + // + Status = gDS->AddMemorySpace ( + EfiGcdMemoryTypeMemoryMappedIo, + FLASH_CODE_BASE, + SIZE_32MB, + EFI_MEMORY_UC + ); + if (!EFI_ERROR (Status)) { + Status = gDS->SetMemorySpaceAttributes ( + FLASH_CODE_BASE, + SIZE_32MB, + EFI_MEMORY_UC + ); + ASSERT_EFI_ERROR (Status); + } + + return EFI_SUCCESS; +} diff --git a/OvmfPkg/RiscVVirt/Feature/Capsule/Library/PlatformFlashAccessLib/PlatformFlashAccessLib.h b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/PlatformFlashAccessLib/PlatformFlashAccessLib.h new file mode 100644 index 000000000000..fe3cf0a17b3c --- /dev/null +++ b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/PlatformFlashAccessLib/PlatformFlashAccessLib.h @@ -0,0 +1,95 @@ +/** @file + Platform flash device access library. + + Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef __PLATFORM_FLASH_ACCESS_LIB_H__ +#define __PLATFORM_FLASH_ACCESS_LIB_H__ + +#include + +typedef enum { + FlashAddressTypeRelativeAddress, + FlashAddressTypeAbsoluteAddress, +} FLASH_ADDRESS_TYPE; + +// +// Type 0 ~ 0x7FFFFFFF is defined in this library. +// Type 0x80000000 ~ 0xFFFFFFFF is reserved for OEM. +// +typedef enum { + PlatformFirmwareTypeSystemFirmware, + PlatformFirmwareTypeNvRam, +} PLATFORM_FIRMWARE_TYPE; + +/** + Perform flash write operation. + + @param[in] FirmwareType The type of firmware. + @param[in] FlashAddress The address of flash device to be accessed. + @param[in] FlashAddressType The type of flash device address. + @param[in] Buffer The pointer to the data buffer. + @param[in] Length The length of data buffer in bytes. + + @retval EFI_SUCCESS The operation returns successfully. + @retval EFI_WRITE_PROTECTED The flash device is read only. + @retval EFI_UNSUPPORTED The flash device access is unsupported. + @retval EFI_INVALID_PARAMETER The input parameter is not valid. +**/ +EFI_STATUS +EFIAPI +PerformFlashWrite ( + IN PLATFORM_FIRMWARE_TYPE FirmwareType, + IN EFI_PHYSICAL_ADDRESS FlashAddress, + IN FLASH_ADDRESS_TYPE FlashAddressType, + IN VOID *Buffer, + IN UINTN Length + ); + +/** + Perform flash write operation with progress indicator. The start and end + completion percentage values are passed into this function. If the requested + flash write operation is broken up, then completion percentage between the + start and end values may be passed to the provided Progress function. The + caller of this function is required to call the Progress function for the + start and end completion percentage values. This allows the Progress, + StartPercentage, and EndPercentage parameters to be ignored if the requested + flash write operation can not be broken up + + @param[in] FirmwareType The type of firmware. + @param[in] FlashAddress The address of flash device to be accessed. + @param[in] FlashAddressType The type of flash device address. + @param[in] Buffer The pointer to the data buffer. + @param[in] Length The length of data buffer in bytes. + @param[in] Progress A function used report the progress of the + firmware update. This is an optional parameter + that may be NULL. + @param[in] StartPercentage The start completion percentage value that may + be used to report progress during the flash + write operation. + @param[in] EndPercentage The end completion percentage value that may + be used to report progress during the flash + write operation. + + @retval EFI_SUCCESS The operation returns successfully. + @retval EFI_WRITE_PROTECTED The flash device is read only. + @retval EFI_UNSUPPORTED The flash device access is unsupported. + @retval EFI_INVALID_PARAMETER The input parameter is not valid. +**/ +EFI_STATUS +EFIAPI +PerformFlashWriteWithProgress ( + IN PLATFORM_FIRMWARE_TYPE FirmwareType, + IN EFI_PHYSICAL_ADDRESS FlashAddress, + IN FLASH_ADDRESS_TYPE FlashAddressType, + IN VOID *Buffer, + IN UINTN Length, + IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress OPTIONAL, + IN UINTN StartPercentage, + IN UINTN EndPercentage + ); + +#endif diff --git a/OvmfPkg/RiscVVirt/Feature/Capsule/Library/PlatformFlashAccessLib/PlatformFlashAccessLib.inf b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/PlatformFlashAccessLib/PlatformFlashAccessLib.inf new file mode 100644 index 000000000000..1c632f2fde52 --- /dev/null +++ b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/PlatformFlashAccessLib/PlatformFlashAccessLib.inf @@ -0,0 +1,34 @@ +## @file +# Platform Flash Access library. +# +# Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.
+# Copyright (c) 2025, Ventana Micro Systems Inc. All Rights Reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 1.30 + BASE_NAME = PlatformFlashAccessLibDxe + FILE_GUID = 2FDAFAFE-0179-4047-90A4-40BC56CFBBAE + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = PlatformFlashAccessLib + CONSTRUCTOR = PlatformFlashAccessLibConstructor + +[Sources] + PlatformFlashAccessLib.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + BaseMemoryLib + PcdLib + DebugLib + VirtNorFlashDeviceLib + UefiBootServicesTableLib + DxeServicesTableLib diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc index aeda34247bd1..8480ec5de689 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc +++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc @@ -56,10 +56,20 @@ !error "NETWORK_SNP_ENABLE is IA32/X64/EBC only" !endif + # + # UPDATE/RECOVERY definition + # + DEFINE CAPSULE_ENABLE = FALSE + DEFINE FMP_SYSTEM_DEVICE = BCBACAC2-1D1D-4C14-89A3-5E27496B702D !include MdePkg/MdeLibs.dsc.inc !include NetworkPkg/Network.dsc.inc +!if $(CAPSULE_ENABLE) == TRUE + POSTBUILD = python OvmfPkg/RiscVVirt/Feature/Capsule/GenerateCapsule/GenCapsule.py +!include OvmfPkg/RiscVVirt/RiscVVirtSystemFW.dsc.inc +!endif + [BuildOptions] GCC:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG !ifdef $(SOURCE_DEBUG_ENABLE) @@ -119,6 +129,18 @@ TpmPlatformHierarchyLib|SecurityPkg/Library/PeiDxeTpmPlatformHierarchyLibNull/PeiDxeTpmPlatformHierarchyLib.inf !endif +!if $(CAPSULE_ENABLE) == TRUE + CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf + BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf + SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf + OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf + IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf + BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf + FmpAuthenticationLib|SecurityPkg/Library/FmpAuthenticationLibPkcs7/FmpAuthenticationLibPkcs7.inf + DisplayUpdateProgressLib|MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLibText.inf + RngLib|MdeModulePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf +!endif + [LibraryClasses.common.DXE_DRIVER] AcpiPlatformLib|OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf @@ -132,6 +154,11 @@ UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf PciExpressLib|OvmfPkg/Library/BaseCachingPciExpressLib/BaseCachingPciExpressLib.inf +[LibraryClasses.common.DXE_RUNTIME_DRIVER] +!if $(CAPSULE_ENABLE) == TRUE + CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf +!endif + ################################################################################ # # Pcd Section - list of all EDK II PCD Entries defined by this Platform. @@ -231,6 +258,10 @@ gEfiSecurityPkgTokenSpaceGuid.PcdTpmBaseAddress|0x0 !endif +!if $(CAPSULE_ENABLE) == TRUE + gEfiMdeModulePkgTokenSpaceGuid.PcdSystemFmpCapsuleImageTypeIdGuid|{GUID("$(FMP_SYSTEM_DEVICE)")}|VOID*|0x10 +!endif + [PcdsDynamicHii] gUefiOvmfPkgTokenSpaceGuid.PcdForceNoAcpi|L"ForceNoAcpi"|gOvmfVariableGuid|0x0|FALSE|NV,BS @@ -491,3 +522,11 @@ NULL|OvmfPkg/Fdt/FdtPciPcdProducerLib/FdtPciPcdProducerLib.inf } + +!if $(CAPSULE_ENABLE) == TRUE + MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmpDxe.inf + MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf { + + PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf + } +!endif diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf b/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf index 4528a44d3b82..8cbd5711aa64 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf +++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf @@ -216,6 +216,11 @@ INF MdeModulePkg/Logo/LogoDxe.inf # INF MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf +!if $(CAPSULE_ENABLE) == TRUE +INF MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmpDxe.inf +INF FILE_GUID = $(FMP_SYSTEM_DEVICE) FmpDevicePkg/FmpDxe/FmpDxe.inf +!endif + ################################################################################ [FV.FVMAIN_COMPACT] diff --git a/OvmfPkg/RiscVVirt/RiscVVirtSystemFW.dsc.inc b/OvmfPkg/RiscVVirt/RiscVVirtSystemFW.dsc.inc new file mode 100644 index 000000000000..644e894e03fc --- /dev/null +++ b/OvmfPkg/RiscVVirt/RiscVVirtSystemFW.dsc.inc @@ -0,0 +1,61 @@ +## @file +# FmpDxe driver for system firmware update. +# +# Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +FmpDevicePkg/FmpDxe/FmpDxe.inf { + + # + # ESRT and FMP GUID for system device capsule update + # + FILE_GUID = $(FMP_SYSTEM_DEVICE) + + + # + # Unicode name string that is used to populate FMP Image Descriptor for this capsule update module + # + gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceImageIdName|L"RISC-V VIRT System Firmware Device" + + # + # ESRT and FMP Lowest Support Version for this capsule update module + # 000.000.000.000 + # + gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceBuildTimeLowestSupportedVersion|0x00000001 + + gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceProgressWatchdogTimeInSeconds|2 + + # + # Capsule Update Progress Bar Color. Set to Green (RGB) (0, 255, 0) + # + gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceProgressColor|0x0000FF00 + + # + # Certificates used to authenticate capsule update image + # EDKII Test certificate + # + !include BaseTools/Source/Python/Pkcs7Sign/TestRoot.cer.gFmpDevicePkgTokenSpaceGuid.PcdFmpDevicePkcs7CertBufferXdr.inc + + + # + # Generic libraries that are used "as is" by all FMP modules + # + FmpPayloadHeaderLib|FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.inf + FmpAuthenticationLib|SecurityPkg/Library/FmpAuthenticationLibPkcs7/FmpAuthenticationLibPkcs7.inf + FmpDependencyLib|FmpDevicePkg/Library/FmpDependencyLib/FmpDependencyLib.inf + FmpDependencyCheckLib|FmpDevicePkg/Library/FmpDependencyCheckLibNull/FmpDependencyCheckLibNull.inf + FmpDependencyDeviceLib|FmpDevicePkg/Library/FmpDependencyDeviceLibNull/FmpDependencyDeviceLibNull.inf + # + # Platform specific capsule policy library + # + CapsuleUpdatePolicyLib|OvmfPkg/RiscVVirt/Feature/Capsule/Library/CapsuleUpdatePolicyLib/CapsuleUpdatePolicyLib.inf + # + # Device specific library that processes a capsule and updates the FW storage device + # + FmpDeviceLib|OvmfPkg/RiscVVirt/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.inf + VirtNorFlashDeviceLib|OvmfPkg/Library/VirtNorFlashDeviceLib/VirtNorFlashDeviceLib.inf + PlatformFlashAccessLib|OvmfPkg/RiscVVirt/Feature/Capsule/Library/PlatformFlashAccessLib/PlatformFlashAccessLib.inf + } From 7d4b9f5cb1ac68a1e680921ded77d67d5caf678f Mon Sep 17 00:00:00 2001 From: Jean-Philippe Brucker Date: Wed, 24 Jul 2024 18:27:07 +0100 Subject: [PATCH 0116/1172] BaseTools: Declare $(DEBUG_DIR)/.efi output $(DEBUG_DIR)/.efi is generated by the recipe of $(OUTPUT_DIR)/.efi: the .efi file is generated and then copied into $(DEBUG_DIR). At the moment the generate GNUmakefile does not declare the dependency between these two files, which can be a problem because $(FFS_OUTPUT_DIR)/.offset depends on $(DEBUG_DIR)/.efi. Normally $(DEBUG_DIR)/.efi is generated first and there is no problem, but when an external tool builds edk2 from a Makefile, like OP-TEE build does for instance, the parallel '-j' flag passed to Make is inherited by the edk2 GNUmakefile from the environment. As a result Make might try to build the $(FFS_OUTPUT_DIR)/.offset target in parallel and fail to find the .efi file: make[1]: *** No rule to make target 'Build/ArmVirtQemu-AARCH64/DEBUG_GCC5/AARCH64/NetworkPkg/VlanConfigDxe/VlanConfigDxe/DEBUG/VlanConfigDxe.efi', needed by 'Build/ArmVirtQemu-AARCH64/DEBUG_GCC5/FV/Ffs/E4F61863-FE2C-4b56-A8F4-08519BC439DFVlanConfigDxe/VlanConfigDxe.offset'. Stop. If we declare the $(DEBUG_DIR) file as output of this rule, then the generated GNUmakefile will contain the right dependency declaration: $(DEBUG_DIR)/VlanConfigDxe.efi: $(OUTPUT_DIR)/VlanConfigDxe.efi and the parallel build will succeed. Signed-off-by: Jean-Philippe Brucker --- BaseTools/Conf/build_rule.template | 1 + 1 file changed, 1 insertion(+) diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_rule.template index fb16854c56e5..ccddf7aa206f 100755 --- a/BaseTools/Conf/build_rule.template +++ b/BaseTools/Conf/build_rule.template @@ -376,6 +376,7 @@ $(OUTPUT_DIR)(+)$(MODULE_NAME).efi $(OUTPUT_DIR)(+)$(MODULE_NAME).map + $(DEBUG_DIR)(+)$(MODULE_NAME).efi "$(GENFW)" -e $(MODULE_TYPE) -o ${dst} ${src} $(GENFW_FLAGS) From 5ac1dfc0937c07856857965ba6135bee0eb6202b Mon Sep 17 00:00:00 2001 From: Ryan Wong Date: Tue, 18 Mar 2025 20:23:22 +0800 Subject: [PATCH 0117/1172] MdeModulePkg/UfsPassThruDxe: Correct size in UfsHc->FreeBuffer call UfsHc->FreeBuffer accepts page numbers rather than bytes as its size argument. Fix two positions where wrong size were passed. Signed-off-by: Ryan Wong --- MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c index 4a9fa01e7d81..a03b2ce35dd5 100644 --- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c +++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c @@ -1808,7 +1808,7 @@ UfsAllocateAlignCommonBuffer ( if (EFI_ERROR (Status) || (Bytes != EFI_PAGES_TO_SIZE (EFI_SIZE_TO_PAGES (Size)))) { UfsHc->FreeBuffer ( UfsHc, - EFI_PAGES_TO_SIZE (EFI_SIZE_TO_PAGES (Size)), + EFI_SIZE_TO_PAGES (Size), *CmdDescHost ); *CmdDescHost = NULL; @@ -1825,7 +1825,7 @@ UfsAllocateAlignCommonBuffer ( ); UfsHc->FreeBuffer ( UfsHc, - EFI_PAGES_TO_SIZE (EFI_SIZE_TO_PAGES (Size)), + EFI_SIZE_TO_PAGES (Size), *CmdDescHost ); *CmdDescMapping = NULL; From 579c12d7bcad2ef9f1446dd83ccd80d59a149d36 Mon Sep 17 00:00:00 2001 From: Yang Gang Date: Wed, 25 Jun 2025 15:56:45 +0800 Subject: [PATCH 0118/1172] UefiPayloadPkg: Add missing VirtNorFlashDeviceLib instance Signed-off-by: Yang Gang --- UefiPayloadPkg/UefiPayloadPkg.dsc | 1 + 1 file changed, 1 insertion(+) diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index e4a8b36e947b..13d292cdc841 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -409,6 +409,7 @@ QemuLoadImageLib|OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.inf TimerLib|ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf + VirtNorFlashDeviceLib|OvmfPkg/Library/VirtNorFlashDeviceLib/VirtNorFlashDeviceLib.inf VirtNorFlashPlatformLib|OvmfPkg/Library/FdtNorFlashQemuLib/FdtNorFlashQemuLib.inf # ARM Architectural Libraries From 0cb71c18c560f0e55936a11d3873a92e76abafca Mon Sep 17 00:00:00 2001 From: Zachary Clark-Williams Date: Wed, 18 Jun 2025 11:57:17 -0700 Subject: [PATCH 0119/1172] NetworkPkg/WifiConnectionManager: net list scan ui Commit 7c204d7 changed the behavior of the WiFi Connection Manager. It no longer scans for available networks when the driver loads, because scanning during that time disrupts connections for other features. To avoid blocking other processes, the driver should initiate a scan only when appropriate. This update introduces a one-time scan that occurs when the user opens the network settings page in the UI, enables WiFi, and then opens the network list page to view available networks. Signed-off-by: Zachary Clark-Williams --- .../WifiConnectionMgrHiiConfigAccess.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrHiiConfigAccess.c b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrHiiConfigAccess.c index 78e9b0ea4e70..0ecadbae4616 100644 --- a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrHiiConfigAccess.c +++ b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrHiiConfigAccess.c @@ -1559,6 +1559,11 @@ WifiMgrDxeHiiConfigAccessCallback ( // User triggered a scan process. // Private->CurrentNic->OneTimeScanRequest = TRUE; + Status = WifiMgrStartScan (Private->CurrentNic); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, "[WiFi Connection Manager] Error: Failed in start scan for network list with status %r", Status)); + } + break; case KEY_PASSWORD_CONNECT_NETWORK: From fe19f86dcd9c5c40b5ed487ee7eacd93a013a044 Mon Sep 17 00:00:00 2001 From: "INDIA\\sachinganesh" Date: Fri, 20 Jun 2025 01:42:17 +0530 Subject: [PATCH 0120/1172] MdeModulePkg/SmmCore: Modify check for Mm Communicate Buffer without data Modify communication buffer size check to take into consideration that buffer might not have data. Signed-off-by: Sachin Ganesh --- MdeModulePkg/Core/PiSmmCore/PiSmmCore.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c b/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c index 1b2b8857c5fb..100e00697c56 100644 --- a/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c +++ b/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c @@ -734,7 +734,7 @@ SmmEntryPoint ( // Check for over or underflows // if (!SmmIsBufferOutsideSmmValid ((UINTN)CommunicationBuffer, BufferSize) || - IsOverlapped || (BufferSize < sizeof (EFI_SMM_COMMUNICATE_HEADER))) + IsOverlapped || (BufferSize < OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data))) { // // If CommunicationBuffer is not in valid address scope, From a2e20bc4b0dc4f88105d304dd99479fd4f1eaac0 Mon Sep 17 00:00:00 2001 From: Leif Lindholm Date: Tue, 10 Jun 2025 12:56:14 +0100 Subject: [PATCH 0121/1172] BaseTools/PatchCheck.py: make get_parent_packages return directory names The get_parent_packages function in CheckGitCommits returns the path of non-package directories, but in fact returns the path of the .dec file for actual packages. Align the handling to be more consistent and return only directory names, regarding of how it was found. Signed-off-by: Leif Lindholm --- BaseTools/Scripts/PatchCheck.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BaseTools/Scripts/PatchCheck.py b/BaseTools/Scripts/PatchCheck.py index d178a6081b1b..551e0b4e535e 100755 --- a/BaseTools/Scripts/PatchCheck.py +++ b/BaseTools/Scripts/PatchCheck.py @@ -730,7 +730,7 @@ def get_parent_packages(self, dec_files, commit, filter): for dec_file in dec_files: if os.path.commonpath([dec_file, file]): dec_found = True - parents.add(dec_file) + parents.add(dec_file.split('/')[0]) if not dec_found and os.path.dirname (file): # No DEC file found and file is in a subdir # Covers BaseTools, .github, .azurepipelines, .pytool From c44efa0fbd393c47756bed8708c47650a23218ac Mon Sep 17 00:00:00 2001 From: Leif Lindholm Date: Tue, 10 Jun 2025 13:18:07 +0100 Subject: [PATCH 0122/1172] BaseTools/PatchCheck.py: pass list of packages to CommitMessageCheck In order to enable subject line format compliance checking in following patches, pass through a list of modified packages to CommitMessageCheck. Signed-off-by: Leif Lindholm --- BaseTools/Scripts/PatchCheck.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/BaseTools/Scripts/PatchCheck.py b/BaseTools/Scripts/PatchCheck.py index 551e0b4e535e..47c2b0345328 100755 --- a/BaseTools/Scripts/PatchCheck.py +++ b/BaseTools/Scripts/PatchCheck.py @@ -97,7 +97,7 @@ def check_email_address(self, email): class CommitMessageCheck: """Checks the contents of a git commit message.""" - def __init__(self, subject, message, author_email): + def __init__(self, subject, message, author_email, updated_packages): self.ok = True self.ignore_multi_package = False @@ -561,14 +561,14 @@ class CheckOnePatch: patch content. """ - def __init__(self, name, patch): + def __init__(self, name, patch, updated_packages=None): self.patch = patch self.find_patch_pieces() email_check = EmailAddressCheck(self.author_email, 'Author') email_ok = email_check.ok - msg_check = CommitMessageCheck(self.commit_subject, self.commit_msg, self.author_email) + msg_check = CommitMessageCheck(self.commit_subject, self.commit_msg, self.author_email, updated_packages) msg_ok = msg_check.ok self.ignore_multi_package = msg_check.ignore_multi_package @@ -695,7 +695,8 @@ def __init__(self, rev_spec, max_count): email = self.read_committer_email_address_from_git(commit) self.ok &= EmailAddressCheck(email, 'Committer').ok patch = self.read_patch_from_git(commit) - check_patch = CheckOnePatch(commit, patch) + updated_packages = self.get_parent_packages (dec_files, commit, 'ADM') + check_patch = CheckOnePatch(commit, patch, updated_packages) self.ok &= check_patch.ok ignore_multi_package = check_patch.ignore_multi_package if PatchCheckConf.ignore_multi_package: From b55530ad4460c0eb31c2326dd86028e2b4639909 Mon Sep 17 00:00:00 2001 From: Leif Lindholm Date: Tue, 10 Jun 2025 13:18:17 +0100 Subject: [PATCH 0123/1172] BaseTools/PatchCheck.py: verify commit message lists package(s) Verify that the subject line matches the basic {Package}[,Package]: format _or_ the Revert "" format. Non-package top-level directories are treated as packages. Suggested-by: Ard Biesheuvel Signed-off-by: Leif Lindholm --- BaseTools/Scripts/PatchCheck.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/BaseTools/Scripts/PatchCheck.py b/BaseTools/Scripts/PatchCheck.py index 47c2b0345328..5b611e0aac32 100755 --- a/BaseTools/Scripts/PatchCheck.py +++ b/BaseTools/Scripts/PatchCheck.py @@ -117,6 +117,7 @@ def __init__(self, subject, message, author_email, updated_packages): self.check_contributed_under() if not MergifyMerge: + self.check_subject(updated_packages) self.check_signed_off_by() self.check_misc_signatures() self.check_overall_format() @@ -209,6 +210,14 @@ def find_signatures(self, sig): return sigs + def check_subject(self, updated_packages): + if updated_packages: + for package in updated_packages: + current_package_re = r"(Revert \"|^|, ?)" + re.escape(package) + r"([ ,:\/])" + if not re.search(current_package_re, self.subject): + self.error("Subject line not in \"package/component: description\" format!") + return + def check_signed_off_by(self): sob='Signed-off-by' if self.msg.find(sob) < 0: From 07425903d351b282072a5a4437b185fdb96d2e58 Mon Sep 17 00:00:00 2001 From: Jeff Brasen Date: Tue, 10 Jun 2025 15:42:19 -0700 Subject: [PATCH 0124/1172] MdeModulePkg/UefiBootManagerLib: Fix crash when no load options are found Do not attempt to sort the load options when there are none. Signed-off-by: Jeff Brasen --- MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.c b/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.c index 284f5116db8d..7813c87cce0d 100644 --- a/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.c +++ b/MdeModulePkg/Library/UefiBootManagerLib/BmLoadOption.c @@ -437,6 +437,10 @@ EfiBootManagerSortLoadOptionVariable ( LoadOption = EfiBootManagerGetLoadOptions (&LoadOptionCount, OptionType); + if (LoadOptionCount == 0) { + return; + } + // // Insertion sort algorithm // From e0852f75d8b9dd1ccf38e89f833922884893af26 Mon Sep 17 00:00:00 2001 From: Mohamed Gamal Morsy Date: Thu, 1 May 2025 12:41:59 +0100 Subject: [PATCH 0125/1172] ArmPkg: StMM: Use x24 register to store stack address Now that the use of 18 registers for FF-A is supported. Registers from x0-x17 can be used by FF-A to return call results. StMM also uses registers x19-x23 to store SPMC boot information. Use the x24 register to store the stack address instead of x12 to avoid it being clobbered by FF-A calls. Signed-off-by: Mohamed Gamal Morsy --- .../AArch64/ModuleEntryPoint.S | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/AArch64/ModuleEntryPoint.S b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/AArch64/ModuleEntryPoint.S index f8f8877927ed..6d4866ddb7f6 100644 --- a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/AArch64/ModuleEntryPoint.S +++ b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/AArch64/ModuleEntryPoint.S @@ -81,8 +81,8 @@ ASM_FUNC(SetStackPermissionFfa) // x1 = stmm_stack top mov x1, x0 - // x12 = Compute and save the stack base - add x12, x1, x2 + // x24 = Compute and save the stack base + add x24, x1, x2 // x2 = Count of pages of stmm_stack lsr x2, x2, #EFI_PAGE_SHIFT @@ -110,7 +110,7 @@ ASM_FUNC(SetStackPermissionFfa) cmp x10, #0x00 // Set return value as base address of stack. - mov x0, x12 + mov x0, x24 b.ne .Lout_set_stack_perm_ffa // If failed, set return value as zero. mov x0, #0x00 @@ -119,7 +119,7 @@ ASM_FUNC(SetStackPermissionFfa) mov x9, xzr mov x10, xzr mov x11, xzr - mov x12, xzr + mov x24, xzr ret // From d7110cd638c00f2d5697783630c82cbffe63823d Mon Sep 17 00:00:00 2001 From: Dionna Glaze Date: Wed, 18 Dec 2024 04:57:52 +0000 Subject: [PATCH 0126/1172] MdePkg: Add ACPI 5.1 table definition for WAET This is a struct needed for virtualizing Windows. https://uefi.org/acpi entry for WAET links to https://learn.microsoft.com/en-us/previous-versions/gg487524(v=msdn.10) which describes the 32-bit flags field with bits 0 and 1 defined. Signed-off-by: Dionna Glaze --- MdePkg/Include/IndustryStandard/Acpi51.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/MdePkg/Include/IndustryStandard/Acpi51.h b/MdePkg/Include/IndustryStandard/Acpi51.h index 8ad40770a33f..a39d65178c3b 100644 --- a/MdePkg/Include/IndustryStandard/Acpi51.h +++ b/MdePkg/Include/IndustryStandard/Acpi51.h @@ -1834,6 +1834,25 @@ typedef struct { UINT32 EntryCount; } EFI_ACPI_5_1_EINJ_TRIGGER_ACTION_TABLE; +/// +/// Windows ACPI Emulated devices Table +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + /// + /// Container of a bitmask of Windows behavior that this system requires + /// Bit 0 - RTC good + /// Bit 1 - ACPI PM timer good + /// + UINT32 EmulatedDeviceFlags; +} EFI_ACPI_5_1_WAET_TABLE; + +/// +/// WAET Flags. All other bits are reserved and must be 0. +/// +#define EFI_ACPI_5_1_WAET_FLAGS_RTC_GOOD BIT0 +#define EFI_ACPI_5_1_WAET_FLAGS_ACPI_PM_TIMER_GOOD BIT1 + /// /// Platform Communications Channel Table (PCCT) /// From a2e4ee7ed26a28dcdcf0c0091f5ee44c8ea2cfbe Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Tue, 24 Jun 2025 21:55:32 -0700 Subject: [PATCH 0127/1172] UnitTestFrameworkPkg: Add -Wno-write-strings to host unit tests Disable write strings warning for host-based unit test builds when building modules of type HOST_APPLICATION. Modules of type HOST_APPLICATION may compile and link code under test into the host-based unit test. When building GoogleTest based unit tests, the G++ compiler is used. The G++ compiler is stricter than GCC for passing a const string into a function parameter that is not const. This is not a warning for GCC build of firmware code. But GoogleTest builds that use g++ detect as a warning and that breaks the build. The firmware code under test can not be changed, so the warning -Wno-write-strings is added to CC_FLAGS to ignore this warning. Signed-off-by: Michael D Kinney --- UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc | 1 + 1 file changed, 1 insertion(+) diff --git a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc index e257ce5ff95f..0f6851636290 100644 --- a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc +++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc @@ -71,6 +71,7 @@ # # GCC # + GCC:*_*_*_CC_FLAGS = -Wno-write-strings GCC:*_*_IA32_DLINK_FLAGS == -o $(BIN_DIR)/$(MODULE_NAME_GUID) -m32 -no-pie GCC:*_*_X64_DLINK_FLAGS == -o $(BIN_DIR)/$(MODULE_NAME_GUID) -m64 -no-pie # From b534cabbdac4eed002cbd84f31bcad584002f731 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Thu, 24 Apr 2025 15:36:26 -0700 Subject: [PATCH 0128/1172] MdeModulePkg: ArmFfaLib: Add Rx/Tx support for Stmm secure partition This change adds the support for mapping Rx/Tx buffer through the library constructor. The first mapper will produce an MM protocol instance with Rx/Tx information, which allows subsequent consumers to query the information. Signed-off-by: Kun Qin --- .../Library/ArmFfaLib/ArmFfaRxTxMapStmm.c | 321 ++++++++++++++++++ .../ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf | 7 + .../Library/ArmFfaLib/ArmFfaStandaloneMmLib.c | 42 +-- .../ArmFfaLib/ArmFfaStandaloneMmLib.inf | 7 + 4 files changed, 349 insertions(+), 28 deletions(-) create mode 100644 MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMapStmm.c diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMapStmm.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMapStmm.c new file mode 100644 index 000000000000..e7c195121060 --- /dev/null +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMapStmm.c @@ -0,0 +1,321 @@ +/** @file + Arm Ffa library common code. + + Copyright (c) 2024, Arm Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Glossary: + - FF-A - Firmware Framework for Arm A-profile + + @par Reference(s): + - Arm Firmware Framework for Arm A-Profile v1.3 ALP1: [https://developer.arm.com/documentation/den0077/l] + +**/ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "ArmFfaCommon.h" +#include "ArmFfaRxTxMap.h" + +EFI_HANDLE mArmFfaRxTxBufferStmmInfoHandle = NULL; +ARM_FFA_RX_TX_BUFFER_INFO *mArmFfaRxTxBufferStmmInfo = NULL; + +/** + Get mapped Rx/Tx buffers. + + @param [out] TxBuffer Address of TxBuffer + @param [out] TxBufferSize Size of TxBuffer + @param [out] RxBuffer Address of RxBuffer + @param [out] RxBufferSize Size of RxBuffer + + @retval EFI_SUCCESS + @retval Others Error. + +**/ +EFI_STATUS +EFIAPI +ArmFfaLibGetRxTxBuffers ( + OUT VOID **TxBuffer OPTIONAL, + OUT UINT64 *TxBufferSize OPTIONAL, + OUT VOID **RxBuffer OPTIONAL, + OUT UINT64 *RxBufferSize OPTIONAL + ) +{ + UINTN TxBufferAddr; + UINTN RxBufferAddr; + + EFI_STATUS Status = gMmst->MmLocateProtocol ( + &gArmFfaRxTxBufferInfoGuid, + NULL, + (VOID **)&mArmFfaRxTxBufferStmmInfo + ); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to locate Rx/Tx buffer protocol... Status: %r\n", __func__, Status)); + return Status; + } + + TxBufferAddr = (UINTN)mArmFfaRxTxBufferStmmInfo->TxBufferAddr; + RxBufferAddr = (UINTN)mArmFfaRxTxBufferStmmInfo->RxBufferAddr; + + if ((TxBufferAddr == 0x00) || (RxBufferAddr == 0x00)) { + return EFI_NOT_READY; + } + + if (TxBuffer != NULL) { + *TxBuffer = (VOID *)TxBufferAddr; + } + + if (TxBufferSize != NULL) { + *TxBufferSize = mArmFfaRxTxBufferStmmInfo->TxBufferSize; + } + + if (RxBuffer != NULL) { + *RxBuffer = (VOID *)RxBufferAddr; + } + + if (RxBufferSize != NULL) { + *RxBufferSize = mArmFfaRxTxBufferStmmInfo->RxBufferSize; + } + + return EFI_SUCCESS; +} + +/** + Mapping Rx/Tx buffers. + This function is only called in ArmFfaLibConstructor because + Rx/Tx buffer is registered only once per partition. + + @retval EFI_SUCCESS + @retval EFI_ALREADY_STARTED Rx/Tx buffer already mapped. + @retval EFI_OUT_OF_RESOURCE Out of memory + @retval EFI_INVALID_PARAMETER Invalid alignment of Rx/Tx buffer + @retval Others Error + +**/ +EFI_STATUS +EFIAPI +ArmFfaLibRxTxMap ( + IN VOID + ) +{ + EFI_STATUS Status; + ARM_FFA_ARGS FfaArgs; + UINTN Property1; + UINTN Property2; + UINTN MinSizeAndAlign; + UINTN MaxSize; + VOID *Buffers; + VOID *TxBuffer; + VOID *RxBuffer; + UINT64 BufferSize; + + Status = gMmst->MmLocateProtocol ( + &gArmFfaRxTxBufferInfoGuid, + NULL, + (VOID **)&mArmFfaRxTxBufferStmmInfo + ); + if (!EFI_ERROR (Status)) { + // Great, we got what we need. + return EFI_ALREADY_STARTED; + } + + Status = ArmFfaLibGetFeatures ( + ARM_FID_FFA_RXTX_MAP, + FFA_RXTX_MAP_INPUT_PROPERTY_DEFAULT, + &Property1, + &Property2 + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to get RX/TX buffer property... Status: %r\n", + __func__, + Status + )); + return Status; + } + + ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); + + MinSizeAndAlign = + ((Property1 >> + ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_SHIFT) & + ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_MASK); + + switch (MinSizeAndAlign) { + case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_4K: + MinSizeAndAlign = SIZE_4KB; + break; + case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_16K: + MinSizeAndAlign = SIZE_16KB; + break; + case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_64K: + MinSizeAndAlign = SIZE_64KB; + break; + default: + DEBUG ((DEBUG_ERROR, "%a: Invalid MinSizeAndAlign: 0x%x\n", __func__, MinSizeAndAlign)); + return EFI_UNSUPPORTED; + } + + MaxSize = (Property1 >> ARM_FFA_BUFFER_MAXSIZE_PAGE_COUNT_SHIFT) & + ARM_FFA_BUFFER_MAXSIZE_PAGE_COUNT_MASK; + + MaxSize = ((MaxSize == 0) ? MAX_UINTN : (MaxSize * MinSizeAndAlign)); + + if ((MinSizeAndAlign > (PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE)) || + (MaxSize < (PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE))) + { + DEBUG (( + DEBUG_ERROR, + "%a: Buffer is too small! MinSize: 0x%x, MaxSize: 0x%x, PageCount: %d\n", + __func__, + MinSizeAndAlign, + MaxSize, + PcdGet64 (PcdFfaTxRxPageCount) + )); + return EFI_INVALID_PARAMETER; + } + + Buffers = AllocateAlignedPages ((PcdGet64 (PcdFfaTxRxPageCount) * 2), MinSizeAndAlign); + if (Buffers == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + BufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + TxBuffer = Buffers; + RxBuffer = Buffers + BufferSize; + + FfaArgs.Arg0 = ARM_FID_FFA_RXTX_MAP; + FfaArgs.Arg1 = (UINTN)TxBuffer; + FfaArgs.Arg2 = (UINTN)RxBuffer; + + /* + * PcdFfaTxRxPageCount sets with count of EFI_PAGE_SIZE granularity + * But, PageCounts for Tx/Rx buffer should set with + * count of Tx/Rx Buffer's MinSizeAndAlign. granularity. + */ + FfaArgs.Arg3 = PcdGet64 (PcdFfaTxRxPageCount) / EFI_SIZE_TO_PAGES (MinSizeAndAlign); + + ArmCallFfa (&FfaArgs); + + Status = FfaArgsToEfiStatus (&FfaArgs); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to map Rx/Tx buffer. Status: %r\n", + __func__, + Status + )); + goto ErrorHandler; + } + + mArmFfaRxTxBufferStmmInfo = AllocateZeroPool (sizeof (ARM_FFA_RX_TX_BUFFER_INFO)); + if (mArmFfaRxTxBufferStmmInfo == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto ErrorHandler; + } + + mArmFfaRxTxBufferStmmInfo->TxBufferAddr = TxBuffer; + mArmFfaRxTxBufferStmmInfo->RxBufferAddr = RxBuffer; + mArmFfaRxTxBufferStmmInfo->TxBufferSize = BufferSize; + mArmFfaRxTxBufferStmmInfo->RxBufferSize = BufferSize; + + Status = gMmst->MmInstallProtocolInterface ( + &mArmFfaRxTxBufferStmmInfoHandle, + &gArmFfaRxTxBufferInfoGuid, + EFI_NATIVE_INTERFACE, + mArmFfaRxTxBufferStmmInfo + ); + + return Status; + +ErrorHandler: + FreeAlignedPages (Buffers, (PcdGet64 (PcdFfaTxRxPageCount) * 2)); + TxBuffer = NULL; + RxBuffer = NULL; + + return Status; +} + +/** + Unmap Rx/Tx buffer. + This function is only called in Exit boot service because + Rx/Tx buffer is registered only once per partition. + + @retval EFI_SUCCESS + @retval EFI_INVALID_PARAMETERS Already unregistered + @retval EFI_UNSUPPORTED Not supported + +**/ +EFI_STATUS +EFIAPI +ArmFfaLibRxTxUnmap ( + IN VOID + ) +{ + EFI_STATUS Status; + ARM_FFA_ARGS FfaArgs; + VOID *Buffers; + + if (mArmFfaRxTxBufferStmmInfoHandle == NULL) { + // This means that the agent tried to unmap the buffers before even know them. + // Let's be a nice player... + return EFI_UNSUPPORTED; + } + + ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); + + FfaArgs.Arg0 = ARM_FID_FFA_RXTX_UNMAP; + FfaArgs.Arg1 = (gPartId << ARM_FFA_SOURCE_EP_SHIFT); + + ArmCallFfa (&FfaArgs); + + Status = FfaArgsToEfiStatus (&FfaArgs); + if (EFI_ERROR (Status)) { + return Status; + } + + /* + * Rx/Tx Buffer are allocated with continuous pages. + * and start address of these pages is set on PcdFfaTxBuffer. + * See ArmFfaLibRxTxMap(). + */ + Buffers = (VOID *)(UINTN)mArmFfaRxTxBufferStmmInfo->TxBufferAddr; + if (Buffers != NULL) { + FreeAlignedPages (Buffers, (EFI_SIZE_TO_PAGES (mArmFfaRxTxBufferStmmInfo->TxBufferSize) * 2)); + } + + Status = gMmst->MmUninstallProtocolInterface ( + mArmFfaRxTxBufferStmmInfoHandle, + &gArmFfaRxTxBufferInfoGuid, + mArmFfaRxTxBufferStmmInfo + ); + + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to uninstall Rx/Tx buffer protocol... Status: %r\n", + __func__, + Status + )); + return Status; + } + + FreePool (mArmFfaRxTxBufferStmmInfo); + mArmFfaRxTxBufferStmmInfo = NULL; + + return EFI_SUCCESS; +} diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf index 395d1f07d1dc..863836af39fa 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf @@ -20,6 +20,8 @@ ArmFfaCommon.h ArmFfaCommon.c ArmFfaStandaloneMmLib.c + ArmFfaRxTxMap.h + ArmFfaRxTxMapStmm.c [Packages] MdePkg/MdePkg.dec @@ -31,6 +33,11 @@ BaseLib BaseMemoryLib DebugLib + MmServicesTableLib [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdFfaLibConduitSmc + gEfiMdeModulePkgTokenSpaceGuid.PcdFfaTxRxPageCount + +[Guids] + gArmFfaRxTxBufferInfoGuid diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c index 2d7f83421915..72f9a80b2788 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c @@ -22,34 +22,7 @@ #include #include "ArmFfaCommon.h" - -/** - Get mapped Rx/Tx buffers. - - @param [out] TxBuffer Address of TxBuffer - @param [out] TxBufferSize Size of TxBuffer - @param [out] RxBuffer Address of RxBuffer - @param [out] RxBufferSize Size of RxBuffer - - @retval EFI_SUCCESS - @retval Others Error. - -**/ -EFI_STATUS -EFIAPI -ArmFfaLibGetRxTxBuffers ( - OUT VOID **TxBuffer, - OUT UINT64 *TxBufferSize, - OUT VOID **RxBuffer, - OUT UINT64 *RxBufferSize - ) -{ - /* - * StandaloneMm doesn't use Rx/Tx buffer. - * So, return EFI_UNSUPPORTED. - */ - return EFI_UNSUPPORTED; -} +#include "ArmFfaRxTxMap.h" /** ArmFfaLib Constructor. @@ -85,5 +58,18 @@ ArmFfaStandaloneMmLibConstructor ( DEBUG ((DEBUG_ERROR, "%a failed. Status = %r\n", __func__, Status)); } + Status = ArmFfaLibRxTxMap (); + if (Status == EFI_ALREADY_STARTED) { + /* + * When first Stmm instance (most likely core) which uses ArmFfaLib loaded, + * It already maps Rx/Tx buffer. + * From Next Stmm instance which uses ArmFfaLib it doesn't need to map Rx/Tx + * buffer again but it uses the mapped one. + */ + Status = EFI_SUCCESS; + } else if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a failed. Status = %r\n", __func__, Status)); + } + return Status; } diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.inf b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.inf index 44679c0d0803..019eab3e5894 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.inf +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.inf @@ -20,6 +20,8 @@ ArmFfaCommon.h ArmFfaCommon.c ArmFfaStandaloneMmLib.c + ArmFfaRxTxMap.h + ArmFfaRxTxMapStmm.c [Packages] MdePkg/MdePkg.dec @@ -31,7 +33,12 @@ BaseLib BaseMemoryLib DebugLib + MmServicesTableLib [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdFfaLibConduitSmc + gEfiMdeModulePkgTokenSpaceGuid.PcdFfaTxRxPageCount + +[Guids] + gArmFfaRxTxBufferInfoGuid From 22142b4f4a7822872aed9281bf3a5994199754b3 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Thu, 24 Apr 2025 15:32:09 -0700 Subject: [PATCH 0129/1172] MdePkg, MdeModulePkg: ArmFfaLib: Expose FFA_ARGS and ArmCallFfa FFA is a framework that supports various protocols built on top. i.e. memory protocol, which is nothing that can be done through existing interfaces. Instead of requiring protocol authors to check conduit PCD in every implementation, exposing the ArmCallFfa is a unified way to allow other protocols to leverage FFA interfaces. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Kun Qin --- MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h | 36 +------------------ MdePkg/Include/Library/ArmFfaLib.h | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h index 663d2d330ae0..5bb1b77d7578 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h @@ -17,29 +17,7 @@ #ifndef ARM_FFA_COMMON_LIB_H_ #define ARM_FFA_COMMON_LIB_H_ -/** - * Arguments to call FF-A request via SMC/SVC. - */ -typedef struct ArmFfaArgs { - UINTN Arg0; - UINTN Arg1; - UINTN Arg2; - UINTN Arg3; - UINTN Arg4; - UINTN Arg5; - UINTN Arg6; - UINTN Arg7; - UINTN Arg8; - UINTN Arg9; - UINTN Arg10; - UINTN Arg11; - UINTN Arg12; - UINTN Arg13; - UINTN Arg14; - UINTN Arg15; - UINTN Arg16; - UINTN Arg17; -} ARM_FFA_ARGS; +#include extern BOOLEAN gFfaSupported; extern UINT16 gPartId; @@ -58,18 +36,6 @@ FfaArgsToEfiStatus ( IN ARM_FFA_ARGS *FfaArgs ); -/** - Trigger FF-A ABI call according to PcdFfaLibConduitSmc. - - @param [in out] FfaArgs Ffa arguments - -**/ -VOID -EFIAPI -ArmCallFfa ( - IN OUT ARM_FFA_ARGS *FfaArgs - ); - /** Common ArmFfaLib Constructor. diff --git a/MdePkg/Include/Library/ArmFfaLib.h b/MdePkg/Include/Library/ArmFfaLib.h index 977f3252fc7e..dd2ac4120277 100644 --- a/MdePkg/Include/Library/ArmFfaLib.h +++ b/MdePkg/Include/Library/ArmFfaLib.h @@ -23,6 +23,30 @@ #include +/** + * Arguments to call FF-A request via SMC/SVC. + */ +typedef struct ArmFfaArgs { + UINTN Arg0; + UINTN Arg1; + UINTN Arg2; + UINTN Arg3; + UINTN Arg4; + UINTN Arg5; + UINTN Arg6; + UINTN Arg7; + UINTN Arg8; + UINTN Arg9; + UINTN Arg10; + UINTN Arg11; + UINTN Arg12; + UINTN Arg13; + UINTN Arg14; + UINTN Arg15; + UINTN Arg16; + UINTN Arg17; +} ARM_FFA_ARGS; + #define FFA_RXTX_MAP_INPUT_PROPERTY_DEFAULT 0x00 /** Implementation define arguments used in @@ -73,6 +97,18 @@ typedef struct DirectMsgArgs { UINTN Arg13; } DIRECT_MSG_ARGS; +/** + Trigger FF-A ABI call according to PcdFfaLibConduitSmc. + + @param [in, out] FfaArgs Ffa arguments + +**/ +VOID +EFIAPI +ArmCallFfa ( + IN OUT ARM_FFA_ARGS *FfaArgs + ); + /** Convert EFI_STATUS to FFA return code. From a0d78f6625c3c3f0e4bf6e7ff7002fa595033772 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Thu, 20 Mar 2025 15:59:06 -0700 Subject: [PATCH 0130/1172] MdePkg: ArmFfaMemMgmtLib: Introduce FF-A memory protocol library This change introduced a library interface that implements the FF-A memory protocol v1.3 ALP1: https://developer.arm.com/documentation/den0140/f Signed-off-by: Kun Qin --- .../Include/IndustryStandard/ArmFfaMemMgmt.h | 325 +++++++++ MdePkg/Include/Library/ArmFfaMemMgmtLib.h | 289 ++++++++ .../ArmFfaMemMgmtLib/ArmFfaMemMgmtLib.c | 618 ++++++++++++++++++ .../ArmFfaMemMgmtLib/ArmFfaMemMgmtLib.inf | 26 + MdePkg/MdePkg.dec | 4 + MdePkg/MdePkg.dsc | 1 + 6 files changed, 1263 insertions(+) create mode 100644 MdePkg/Include/IndustryStandard/ArmFfaMemMgmt.h create mode 100644 MdePkg/Include/Library/ArmFfaMemMgmtLib.h create mode 100644 MdePkg/Library/ArmFfaMemMgmtLib/ArmFfaMemMgmtLib.c create mode 100644 MdePkg/Library/ArmFfaMemMgmtLib/ArmFfaMemMgmtLib.inf diff --git a/MdePkg/Include/IndustryStandard/ArmFfaMemMgmt.h b/MdePkg/Include/IndustryStandard/ArmFfaMemMgmt.h new file mode 100644 index 000000000000..4f9d7c15b4ec --- /dev/null +++ b/MdePkg/Include/IndustryStandard/ArmFfaMemMgmt.h @@ -0,0 +1,325 @@ +/** @file + Memory management protocol definitions as specfied in the FF-A Memory Management + v1.3 APL1 specification. + + Copyright 2021 The Hafnium Authors. + Copyright (c), Microsoft Corporation. + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Glossary: + - FF-A - Firmware Framework for Arm A-profile + + @par Reference(s): + - FF-A Version 1.3 ALP1 [https://developer.arm.com/documentation/den0077/l] + - FF-A Memory Management Protocol 1.3 ALP1 [https://developer.arm.com/documentation/den0140/f] + +**/ + +#ifndef ARM_FFA_MEM_MGMT_H_ +#define ARM_FFA_MEM_MGMT_H_ + +/** + Data access attributes in a memory access permission descriptor. This corresponds + to table 1.15 of the FF-A v1.3 APL1, "Memory access permissions descriptor", + bits[1:0]. +**/ +#define FFA_DATA_ACCESS_NOT_SPECIFIED 0 +#define FFA_DATA_ACCESS_RO 1 +#define FFA_DATA_ACCESS_RW 2 +#define FFA_DATA_ACCESS_RESERVED 3 + +/** + Intruction access attributes in a memory access permission descriptor. + + This corresponds to table 1.15 of the FF-A Memory Management v1.3 APL1, "Memory + access permissions descriptor", bits[3:2]. +**/ +#define FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED 0 +#define FFA_INSTRUCTION_ACCESS_NX 1 +#define FFA_INSTRUCTION_ACCESS_X 2 +#define FFA_INSTRUCTION_ACCESS_RESERVED 3 + +/** + Memory access permission struct definition of memory access permissions descriptor. + + This corresponds to table 1.15 of the FF-A Memory Management v1.3 APL1, "Memory + region attributes descriptor". +**/ +typedef struct { + UINT8 DataAccess : 2; + UINT8 InstructionAccess : 2; + UINT8 Reservd : 4; +} FFA_MEMORY_ACCESS_PERMISSIONS; + +/** + Memory shareability attributes in a memory region attributes descriptor. + + This corresponds to table 1.18 of the FF-A Memory Management v1.3 APL1, "Memory + region attributes descriptor", bits[1:0]. +**/ +#define FFA_MEMORY_SHARE_NON_SHAREABLE 0 +#define FFA_MEMORY_SHARE_RESERVED 1 +#define FFA_MEMORY_OUTER_SHAREABLE 2 +#define FFA_MEMORY_INNER_SHAREABLE 3 + +/** + Memory cacheability or device memory attributes in a memory region attributes + descriptor. + + This corresponds to table 1.18 of the FF-A Memory Management v1.3 APL1, "Memory + region attributes descriptor", bits[3:2]. +**/ +#define FFA_MEMORY_CACHE_RESERVED 0x0 +#define FFA_MEMORY_CACHE_NON_CACHEABLE 0x1 +#define FFA_MEMORY_CACHE_RESERVED_1 0x2 +#define FFA_MEMORY_CACHE_WRITE_BACK 0x3 +#define FFA_MEMORY_DEV_NGNRNE 0x0 +#define FFA_MEMORY_DEV_NGNRE 0x1 +#define FFA_MEMORY_DEV_NGRE 0x2 +#define FFA_MEMORY_DEV_GRE 0x3 + +/** + Memory type in a memory region attributes descriptor. + + This corresponds to table 1.18 of the FF-A Memory Management v1.3 APL1, "Memory + region attributes descriptor", bits[5:4]. +**/ +#define FFA_MEMORY_NOT_SPECIFIED_MEM 0 +#define FFA_MEMORY_DEVICE_MEM 1 +#define FFA_MEMORY_NORMAL_MEM 2 + +/** + FF-A Memory Management v1.3 APL1 Table 1.18 "Memory region attributes descriptor" + bits[6]. Per section 1.10.4.1, NS bit is reserved for FFA_MEM_DONATE/LEND/SHARE + and FFA_MEM_RETRIEVE_REQUEST. +**/ +#define FFA_MEMORY_SECURITY_SECURE 0 +#define FFA_MEMORY_SECURITY_NON_SECURE 1 + +/** + Reserved bits (SBZ) of a memory region attributes descriptor. + + This corresponds to table 1.18 of the FF-A Memory Management v1.3 APL1, "Memory + region attributes descriptor", bits[15:7]. +**/ +#define FFA_MEMORY_ATTRIBUTES_MBZ_MASK 0xFF80U + +/** + Memory region attributes struct definition of memory region attribute descriptor. + + This corresponds to table 1.18 of the FF-A Memory Management v1.3 APL1, "Memory + region attributes descriptor". +**/ +typedef struct { + UINT16 Shareability : 2; + UINT16 Cacheability : 2; + UINT16 Type : 2; + UINT16 Security : 1; + UINT16 Reserved : 9; +} FFA_MEMORY_ATTRIBUTES; + +/** + A set of contiguous pages which is part of a memory region. + + This corresponds to table 1.14 of the the FF-A Memory Management v1.3 APL1, "Constituent + memory region descriptor". +**/ +typedef struct { + /** + The base IPA of the constituent memory region, aligned to 4 kiB page + size granularity. + **/ + UINT64 Address; + /** The number of 4 kiB pages in the constituent memory region. **/ + UINT32 PageCount; + /** Reserved field, SBZ. **/ + UINT32 Reserved; +} FFA_MEMORY_REGION_CONSTITUENT; + +/** + A set of pages comprising a memory region. + + This corresponds to table 1.13 of the FF-A Memory Management v1.3 APL1, "Composite + memory region descriptor". +**/ +typedef struct { + /** + The total number of 4 kiB pages included in this memory region. This + must be equal to the sum of page counts specified in each + `FFA_MEMORY_REGION_CONSTITUENT`. + **/ + UINT32 TotalPageCount; + + /** + The number of constituents (`FFA_MEMORY_REGION_CONSTITUENT`) + included in this memory region range. + **/ + UINT32 ConstituentCount; + /** Reserved field, SBZ. */ + UINT64 Reserved; + /** An array of `ConstituentCount` memory region constituents. */ + FFA_MEMORY_REGION_CONSTITUENT Constituents[]; +} FFA_COMPOSITE_MEMORY_REGION; + +/** + Flags to indicate properties of memory management ABI being invoked. + + This corresponds to table 1.17 of the FF-A Memory Management v1.3 APL1, "Flags + Flags usage in FFA_MEM_RETRIEVE_REQ and FFA_MEM_RETRIEVE_RESP ABIs", Bit[0]. +**/ +#define FFA_MEMORY_ACCESS_PERMISSION_FLAG_MASK ((0x1U) << 0) +#define FFA_MEMORY_ACCESS_PERMISSION_FLAG_UNSPECIFIED ((0x0U) << 0) +#define FFA_MEMORY_ACCESS_PERMISSION_FLAG_RETRIEVAL ((0x0U) << 0) +#define FFA_MEMORY_ACCESS_PERMISSION_FLAG_NON_RETRIEVAL ((0x1U) << 0) + +/** + Memory region attributes descriptor. + + This corresponds to table 1.15 of the FF-A Memory Management v1.3 APL1, "Memory + access permissions descriptor". +**/ +typedef struct { + /** The ID of the VM to which the memory is being given or shared. **/ + UINT16 ReceiverId; + + /** + The permissions with which the memory region should be mapped in the + receiver's page table. + **/ + FFA_MEMORY_ACCESS_PERMISSIONS Permissions; + + /** + Flags used during FFA_MEM_RETRIEVE_REQ and FFA_MEM_RETRIEVE_RESP + for memory regions with multiple borrowers. + **/ + UINT8 Flags; +} FFA_MEMORY_ACCESS_PERMISSIONS_DESCRIPTOR; + +/** + Endpoint memory access descriptor. + + This corresponds to table 1.16 of the FF-A Memory Management v1.3 APL1, "Endpoint + memory access descriptor". +**/ +typedef struct { + FFA_MEMORY_ACCESS_PERMISSIONS_DESCRIPTOR ReceiverPermissions; + + /** + Offset in bytes from the start of the outer `FFA_MEMORY_TRANSACTION_DESCRIPTOR` to + an `FFA_COMPOSITE_MEMORY_REGION` struct. + **/ + UINT32 CompositeMemoryRegionOffset; + UINT8 ImpementationDefined[16]; + UINT64 Reserved; +} FFA_ENDPOINT_MEMORY_ACCESS_DESCRIPTOR; + +/** + Clear memory region contents after unmapping it from the sender and before + mapping it for any receiver. + + This corresponds to table 1.22 of the FF-A Memory Management v1.3 APL1, "Flags + usage in FFA_MEM_RETRIEVE_REQ ABI", bits[0]. +**/ +#define FFA_MEMORY_REGION_FLAG_CLEAR 0x1 + +/** + Whether the hypervisor may time slice the memory sharing or retrieval + operation. + + This corresponds to table 1.22 of the FF-A Memory Management v1.3 APL1, "Flags + usage in FFA_MEM_RETRIEVE_REQ ABI", bits[1]. +**/ +#define FFA_MEMORY_REGION_FLAG_TIME_SLICE 0x2 + +/** + Whether the hypervisor should clear the memory region after the receiver + relinquishes it or is aborted. + + This corresponds to table 1.22 of the FF-A Memory Management v1.3 APL1, "Flags + usage in FFA_MEM_RETRIEVE_REQ ABI", bits[2]. +**/ +#define FFA_MEMORY_REGION_FLAG_CLEAR_RELINQUISH 0x4 + +/** + Transaction type for memory region retrieval. + + This corresponds to table 1.22 of the FF-A Memory Management v1.3 APL1, "Flags + usage in FFA_MEM_RETRIEVE_REQ ABI", bits[3]. +**/ +#define FFA_MEMORY_REGION_TRANSACTION_TYPE_MASK ((0x3U) << 3) +#define FFA_MEMORY_REGION_TRANSACTION_TYPE_UNSPECIFIED ((0x0U) << 3) +#define FFA_MEMORY_REGION_TRANSACTION_TYPE_SHARE ((0x1U) << 3) +#define FFA_MEMORY_REGION_TRANSACTION_TYPE_LEND ((0x2U) << 3) +#define FFA_MEMORY_REGION_TRANSACTION_TYPE_DONATE ((0x3U) << 3) + +/** + Address range hint for memory region retrieval. + + This corresponds to table 1.22 of the FF-A Memory Management v1.3 APL1, "Flags + usage in FFA_MEM_RETRIEVE_REQ ABI", bits[9:5]. +**/ +#define FFA_MEMORY_REGION_ADDRESS_RANGE_HINT_VALID ((0x1U) << 9) +#define FFA_MEMORY_REGION_ADDRESS_RANGE_HINT_MASK ((0xFU) << 5) + +/** + On retrieve request, bypass the multi-borrower check. + + This corresponds to table 1.22 of the FF-A Memory Management v1.3 APL1, "Flags + usage in FFA_MEM_RETRIEVE_REQ ABI", bits[10]. +**/ +#define FFA_MEMORY_REGION_FLAG_BYPASS_BORROWERS_CHECK (0x1U << 10) + +/** + Information about a set of pages which are being shared. + + This corresponds to table 1.20 of the FF-A Memory Management v1.3 APL1, "Memory + transaction descriptor". Note that it is also used for retrieve requests and responses. +**/ +typedef struct { + /** + The ID of the VM which originally sent the memory region, i.e. the + owner. + **/ + UINT16 SenderId; + FFA_MEMORY_ATTRIBUTES Attributes; + /** Flags to control behaviour of the transaction. **/ + UINT32 Flags; + UINT64 Handle; + + /** + An implementation defined value associated with the receiver and the + memory region. + **/ + UINT64 Tag; + /** Size of the memory access descriptor. **/ + UINT32 MemoryAccessDescSize; + + /** + The number of `FFA_ENDPOINT_MEMORY_ACCESS_DESCRIPTOR` entries included in this + transaction. + **/ + UINT32 ReceiverCount; + + /** + Offset to the 'FFA_ENDPOINT_MEMORY_ACCESS_DESCRIPTOR' field, which relates to + the memory access descriptors. + **/ + UINT32 ReceiversOffset; + /** Reserved field (12 bytes) SBZ. */ + UINT8 Reserved[12]; +} FFA_MEMORY_TRANSACTION_DESCRIPTOR; + +/** + Descriptor used for FFA_MEM_RELINQUISH requests. This corresponds to table + 2.25 of the FF-A Memory Management v1.3 APL1, "Descriptor to relinquish a memory + region". +**/ +typedef struct { + UINT64 Handle; + UINT32 Flags; + UINT32 EndpointCount; + UINT16 Endpoints[]; +} FFA_MEM_RELINQUISH_DESCRIPTOR; + +#endif diff --git a/MdePkg/Include/Library/ArmFfaMemMgmtLib.h b/MdePkg/Include/Library/ArmFfaMemMgmtLib.h new file mode 100644 index 000000000000..c52e15d84ac9 --- /dev/null +++ b/MdePkg/Include/Library/ArmFfaMemMgmtLib.h @@ -0,0 +1,289 @@ +/** @file + Library definition for FF-A memory management protocol. + + Copyright (c) 2020 - 2022, Arm Ltd. All rights reserved.
+ Copyright (c), Microsoft Corporation. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef ARM_FFA_MEM_MGMT_LIB_H_ +#define ARM_FFA_MEM_MGMT_LIB_H_ + +#include + +/** + @brief Starts a transaction to transfer of ownership of a memory region + from a Sender endpoint to a Receiver endpoint. + + @param[in] TotalLength Total length of the memory transaction descriptor + in bytes + @param[in] FragmentLength Length in bytes of the memory transaction descriptor + passed in this ABI invocation + @param[in] BufferAddr Base address of a buffer allocated by the Owner and + distinct from the TX buffer + @param[in] PageCount Number of 4K pages in the buffer allocated by the + Owner and distinct from the TX buffer + @param[out] Handle Globally unique Handle to identify the memory region + upon successful transmission of the transaction descriptor. + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibDonate ( + IN UINT32 TotalLength, + IN UINT32 FragmentLength, + IN VOID *BufferAddr, + IN UINT32 PageCount, + OUT UINT64 *Handle + ); + +/** + @brief Starts a transaction to transfer of ownership of a memory region + from a Sender endpoint to a Receiver endpoint. + + @param[in] TotalLength Total length of the memory transaction descriptor + in bytes + @param[in] FragmentLength Length in bytes of the memory transaction descriptor + passed in this ABI invocation + @param[out] Handle Globally unique Handle to identify the memory region + upon successful transmission of the transaction descriptor. + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibDonateRxTx ( + IN UINT32 TotalLength, + IN UINT32 FragmentLength, + OUT UINT64 *Handle + ); + +/** + @brief Starts a transaction to transfer an Owner’s access to a memory + region and grant access to it to one or more Borrowers. + + @param[in] TotalLength Total length of the memory transaction descriptor + in bytes + @param[in] FragmentLength Length in bytes of the memory transaction + descriptor passed in this ABI invocation + @param[in] BufferAddr Base address of a buffer allocated by the Owner + and distinct from the TX buffer + @param[in] PageCount Number of 4K pages in the buffer allocated by + the Owner and distinct from the TX buffer + @param[out] Handle Globally unique Handle to identify the memory + region upon successful transmission of the + transaction descriptor. + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibLend ( + IN UINT32 TotalLength, + IN UINT32 FragmentLength, + IN VOID *BufferAddr, + IN UINT32 PageCount, + OUT UINT64 *Handle + ); + +/** + @brief Starts a transaction to transfer an Owner’s access to a memory + region and grant access to it to one or more Borrowers through + Rx/Tx buffer. + + @param[in] TotalLength Total length of the memory transaction descriptor + in bytes + @param[in] FragmentLength Length in bytes of the memory transaction descriptor + passed in this ABI invocation + @param[out] Handle Globally unique Handle to identify the memory region + upon successful transmission of the transaction descriptor. + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibLendRxTx ( + IN UINT32 TotalLength, + IN UINT32 FragmentLength, + OUT UINT64 *Handle + ); + +/** + @brief Starts a transaction to grant access to a memory region to one or + more Borrowers. + + @param[in] TotalLength Total length of the memory transaction descriptor + in bytes + @param[in] FragmentLength Length in bytes of the memory transaction descriptor + passed in this ABI invocation + @param[in] BufferAddr Base address of a buffer allocated by the Owner and + distinct from the TX buffer + @param[in] PageCount Number of 4K pages in the buffer allocated by the + Owner and distinct from the TX buffer + @param[out] Handle Globally unique Handle to identify the memory region + upon successful transmission of the transaction descriptor. + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibShare ( + IN UINT32 TotalLength, + IN UINT32 FragmentLength, + IN VOID *BufferAddr, + IN UINT32 PageCount, + OUT UINT64 *Handle + ); + +/** + @brief Starts a transaction to grant access to a memory region to one or + more Borrowers through Rx/Tx buffer. + + @param[in] TotalLength Total length of the memory transaction descriptor + in bytes + @param[in] FragmentLength Length in bytes of the memory transaction descriptor + passed in this ABI invocation + @param[out] Handle Globally unique Handle to identify the memory region + upon successful transmission of the transaction descriptor. + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibShareRxTx ( + IN UINT32 TotalLength, + IN UINT32 FragmentLength, + OUT UINT64 *Handle + ); + +/** + @brief Requests completion of a donate, lend or share memory management + transaction. + + @param[in] TotalLength Total length of the memory transaction descriptor + in bytes + @param[in] FragmentLength Length in bytes of the memory transaction descriptor + passed in this ABI invocation + @param[in] BufferAddr Base address of a buffer allocated by the Owner + and distinct from the TX buffer + @param[in] PageCount Number of 4K pages in the buffer allocated by + the Owner and distinct from the TX buffer + @param[out] RespTotalLength Total length of the response memory transaction + descriptor in bytes + @param[out] RespFragmentLength Length in bytes of the response memory transaction + descriptor passed in this ABI invocation + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibRetrieveReq ( + IN UINT32 TotalLength, + IN UINT32 FragmentLength, + IN VOID *BufferAddr, + IN UINT32 PageCount, + OUT UINT32 *RespTotalLength, + OUT UINT32 *RespFragmentLength + ); + +/** + @brief Requests completion of a donate, lend or share memory management + transaction through Rx/Tx buffer. + + @param[in] TotalLength Total length of the memory transaction descriptor + in bytes + @param[in] FragmentLength Length in bytes of the memory transaction descriptor + passed in this ABI invocation + @param[out] RespTotalLength Total length of the response memory transaction + descriptor in bytes + @param[out] RespFragmentLength Length in bytes of the response memory transaction + descriptor passed in this ABI invocation + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibRetrieveReqRxTx ( + IN UINT32 TotalLength, + IN UINT32 FragmentLength, + OUT UINT32 *RespTotalLength, + OUT UINT32 *RespFragmentLength + ); + +/** + @brief Starts a transaction to transfer access to a shared or lent + memory region from a Borrower back to its Owner. + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibRelinquish ( + VOID + ); + +/** + @brief Restores exclusive access to a memory region back to its Owner. + + @param[in] Handle Globally unique Handle to identify the memory region + @param[in] Flags Flags for modifying the reclaim behavior + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibReclaim ( + IN UINT64 Handle, + IN UINT32 Flags + ); + +/** + @brief Queries the memory attributes of a memory region. This function + can only access the regions of the SP's own translation regine. + Moreover this interface is only available in the boot phase, + i.e. before invoking FFA_MSG_WAIT interface. + + @param[in] BaseAddr Base VA of a translation granule whose + permission attributes must be returned. + @param[in] PageCount Number of translation granule size pages from the + Base address whose permissions must be returned. + This is calculated as Input Page count + 1. + @param[out] MemoryPerm Permission attributes of the memory region + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibPermGet ( + IN CONST VOID *BaseAddr, + IN UINT32 PageCount, + OUT UINT32 *MemoryPerm + ); + +/** + @brief Sets the memory attributes of a memory regions. This function + can only access the regions of the SP's own translation regine. + Moreover this interface is only available in the boot phase, + i.e. before invoking FFA_MSG_WAIT interface. + + @param[in] BaseAddr Base VA of a memory region whose permission + attributes must be set. + @param[in] PageCount Number of translation granule size pages + starting from the Base address whose permissions + must be set. + @param[in] MemoryPerm Permission attributes to be set for the memory + region. + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibPermSet ( + IN CONST VOID *BaseAddr, + IN UINT32 PageCount, + IN UINT32 MemoryPerm + ); + +#endif // ARM_FFA_MEM_MGMT_LIB_H_ diff --git a/MdePkg/Library/ArmFfaMemMgmtLib/ArmFfaMemMgmtLib.c b/MdePkg/Library/ArmFfaMemMgmtLib/ArmFfaMemMgmtLib.c new file mode 100644 index 000000000000..91dfd17d402a --- /dev/null +++ b/MdePkg/Library/ArmFfaMemMgmtLib/ArmFfaMemMgmtLib.c @@ -0,0 +1,618 @@ +// SPDX-License-Identifier: BSD-3-Clause + +/** @file + This library implements the FF-A memory manage protocol. + + Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved. + Copyright (c), Microsoft Corporation. + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Glossary: + - FF-A - Firmware Framework for Arm A-profile + + @par Reference(s): + - Arm Firmware Framework for Arm A-Profile v1.3 ALP1: [https://developer.arm.com/documentation/den0077/l] + - FF-A Memory Management Protocol [https://developer.arm.com/documentation/den0140/f] + +**/ + +#include +#include +#include +#include +#include +#include +#include + +/** + @brief Starts a transaction to transfer of ownership of a memory region + from a Sender endpoint to a Receiver endpoint. + + @param[in] TotalLength Total length of the memory transaction descriptor + in bytes + @param[in] FragmentLength Length in bytes of the memory transaction descriptor + passed in this ABI invocation + @param[in] BufferAddr Base address of a buffer allocated by the Owner and + distinct from the TX buffer + @param[in] PageCount Number of 4K pages in the buffer allocated by the + Owner and distinct from the TX buffer + @param[out] Handle Globally unique Handle to identify the memory region + upon successful transmission of the transaction descriptor. + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibDonate ( + IN UINT32 TotalLength, + IN UINT32 FragmentLength, + IN VOID *BufferAddr, + IN UINT32 PageCount, + OUT UINT64 *Handle + ) +{ + ARM_FFA_ARGS FfaArgs; + EFI_STATUS Status; + + if (Handle == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Handle is NULL\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + FfaArgs.Arg0 = ((UINTN)BufferAddr > MAX_UINT32) ? ARM_FID_FFA_MEM_DONATE_AARCH64 : ARM_FID_FFA_MEM_DONATE_AARCH32; + + Status = ArmFfaLibGetFeatures ( + FfaArgs.Arg0, + 0, + &FfaArgs.Arg1, + &FfaArgs.Arg2 + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to get FFA_MEM_DONATE feature... Status: %r\n", __func__, Status)); + *Handle = 0U; + return Status; + } + + FfaArgs.Arg1 = TotalLength; + FfaArgs.Arg2 = FragmentLength; + FfaArgs.Arg3 = (UINTN)BufferAddr; + FfaArgs.Arg4 = PageCount; + + ArmCallFfa (&FfaArgs); + + if (FfaArgs.Arg0 == ARM_FID_FFA_ERROR) { + *Handle = 0U; + return FfaStatusToEfiStatus (FfaArgs.Arg2); + } + + /** + There are no 64-bit parameters returned with FFA_SUCCESS, the SPMC + will use the default 32-bit version. + **/ + ASSERT (FfaArgs.Arg0 == ARM_FID_FFA_SUCCESS_AARCH32); + *Handle = ((UINT64)FfaArgs.Arg3 << 32) | FfaArgs.Arg2; + return EFI_SUCCESS; +} + +/** + @brief Starts a transaction to transfer of ownership of a memory region + from a Sender endpoint to a Receiver endpoint. + + @param[in] TotalLength Total length of the memory transaction descriptor + in bytes + @param[in] FragmentLength Length in bytes of the memory transaction descriptor + passed in this ABI invocation + @param[out] Handle Globally unique Handle to identify the memory region + upon successful transmission of the transaction descriptor. + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibDonateRxTx ( + IN UINT32 TotalLength, + IN UINT32 FragmentLength, + OUT UINT64 *Handle + ) +{ + return ArmFfaMemLibDonate (TotalLength, FragmentLength, NULL, 0, Handle); +} + +/** + @brief Starts a transaction to transfer an Owner’s access to a memory + region and grant access to it to one or more Borrowers. + + @param[in] TotalLength Total length of the memory transaction descriptor + in bytes + @param[in] FragmentLength Length in bytes of the memory transaction + descriptor passed in this ABI invocation + @param[in] BufferAddr Base address of a buffer allocated by the Owner + and distinct from the TX buffer + @param[in] PageCount Number of 4K pages in the buffer allocated by + the Owner and distinct from the TX buffer + @param[out] Handle Globally unique Handle to identify the memory + region upon successful transmission of the + transaction descriptor. + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibLend ( + IN UINT32 TotalLength, + IN UINT32 FragmentLength, + IN VOID *BufferAddr, + IN UINT32 PageCount, + OUT UINT64 *Handle + ) +{ + ARM_FFA_ARGS FfaArgs; + EFI_STATUS Status; + + if (Handle == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Handle is NULL\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + FfaArgs.Arg0 = ((UINTN)BufferAddr > MAX_UINT32) ? ARM_FID_FFA_MEM_LEND_AARCH64 : ARM_FID_FFA_MEM_LEND_AARCH32; + + Status = ArmFfaLibGetFeatures ( + FfaArgs.Arg0, + 0, + &FfaArgs.Arg1, + &FfaArgs.Arg2 + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to get FFA_MEM_LEND feature... Status: %r\n", __func__, Status)); + *Handle = 0U; + return Status; + } + + FfaArgs.Arg1 = TotalLength; + FfaArgs.Arg2 = FragmentLength; + FfaArgs.Arg3 = (UINTN)BufferAddr; + FfaArgs.Arg4 = PageCount; + + ArmCallFfa (&FfaArgs); + + if (FfaArgs.Arg0 == ARM_FID_FFA_ERROR) { + *Handle = 0U; + return FfaStatusToEfiStatus (FfaArgs.Arg2); + } + + /** + There are no 64-bit parameters returned with FFA_SUCCESS, the SPMC + will use the default 32-bit version. + **/ + ASSERT (FfaArgs.Arg0 == ARM_FID_FFA_SUCCESS_AARCH32); + *Handle = ((UINT64)FfaArgs.Arg3 << 32) | FfaArgs.Arg2; + return EFI_SUCCESS; +} + +/** + @brief Starts a transaction to transfer an Owner’s access to a memory + region and grant access to it to one or more Borrowers through + Rx/Tx buffer. + + @param[in] TotalLength Total length of the memory transaction descriptor + in bytes + @param[in] FragmentLength Length in bytes of the memory transaction descriptor + passed in this ABI invocation + @param[out] Handle Globally unique Handle to identify the memory region + upon successful transmission of the transaction descriptor. + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibLendRxTx ( + IN UINT32 TotalLength, + IN UINT32 FragmentLength, + OUT UINT64 *Handle + ) +{ + return ArmFfaMemLibLend (TotalLength, FragmentLength, NULL, 0, Handle); +} + +/** + @brief Starts a transaction to grant access to a memory region to one or + more Borrowers. + + @param[in] TotalLength Total length of the memory transaction descriptor + in bytes + @param[in] FragmentLength Length in bytes of the memory transaction descriptor + passed in this ABI invocation + @param[in] BufferAddr Base address of a buffer allocated by the Owner and + distinct from the TX buffer + @param[in] PageCount Number of 4K pages in the buffer allocated by the + Owner and distinct from the TX buffer + @param[out] Handle Globally unique Handle to identify the memory region + upon successful transmission of the transaction descriptor. + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibShare ( + IN UINT32 TotalLength, + IN UINT32 FragmentLength, + IN VOID *BufferAddr, + IN UINT32 PageCount, + OUT UINT64 *Handle + ) +{ + ARM_FFA_ARGS FfaArgs; + EFI_STATUS Status; + + if (Handle == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Handle is NULL\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + FfaArgs.Arg0 = ((UINTN)BufferAddr > MAX_UINT32) ? ARM_FID_FFA_MEM_SHARE_AARCH64 : ARM_FID_FFA_MEM_SHARE_AARCH32; + + Status = ArmFfaLibGetFeatures ( + FfaArgs.Arg0, + 0, + &FfaArgs.Arg1, + &FfaArgs.Arg2 + ); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to get FFA_MEM_SHARE feature... Status: %r\n", __func__, Status)); + *Handle = 0U; + return Status; + } + + FfaArgs.Arg1 = TotalLength; + FfaArgs.Arg2 = FragmentLength; + FfaArgs.Arg3 = (UINTN)BufferAddr; + FfaArgs.Arg4 = PageCount; + + ArmCallFfa (&FfaArgs); + + if (FfaArgs.Arg0 == ARM_FID_FFA_ERROR) { + *Handle = 0U; + return FfaStatusToEfiStatus (FfaArgs.Arg2); + } + + /** + There are no 64-bit parameters returned with FFA_SUCCESS, the SPMC + will use the default 32-bit version. + **/ + ASSERT (FfaArgs.Arg0 == ARM_FID_FFA_SUCCESS_AARCH32); + *Handle = ((UINT64)FfaArgs.Arg3 << 32) | FfaArgs.Arg2; + return EFI_SUCCESS; +} + +/** + @brief Starts a transaction to grant access to a memory region to one or + more Borrowers through Rx/Tx buffer. + + @param[in] TotalLength Total length of the memory transaction descriptor + in bytes + @param[in] FragmentLength Length in bytes of the memory transaction descriptor + passed in this ABI invocation + @param[out] Handle Globally unique Handle to identify the memory region + upon successful transmission of the transaction descriptor. + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibShareRxTx ( + IN UINT32 TotalLength, + IN UINT32 FragmentLength, + OUT UINT64 *Handle + ) +{ + return ArmFfaMemLibShare (TotalLength, FragmentLength, NULL, 0, Handle); +} + +/** + @brief Requests completion of a donate, lend or share memory management + transaction. + + @param[in] TotalLength Total length of the memory transaction descriptor + in bytes + @param[in] FragmentLength Length in bytes of the memory transaction descriptor + passed in this ABI invocation + @param[in] BufferAddr Base address of a buffer allocated by the Owner + and distinct from the TX buffer + @param[in] PageCount Number of 4K pages in the buffer allocated by + the Owner and distinct from the TX buffer + @param[out] RespTotalLength Total length of the response memory transaction + descriptor in bytes + @param[out] RespFragmentLength Length in bytes of the response memory transaction + descriptor passed in this ABI invocation + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibRetrieveReq ( + IN UINT32 TotalLength, + IN UINT32 FragmentLength, + IN VOID *BufferAddr, + IN UINT32 PageCount, + OUT UINT32 *RespTotalLength, + OUT UINT32 *RespFragmentLength + ) +{ + ARM_FFA_ARGS FfaArgs; + EFI_STATUS Status; + + if ((RespTotalLength == NULL) || (RespFragmentLength == NULL)) { + DEBUG ((DEBUG_ERROR, "%a: Handle is NULL\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + FfaArgs.Arg0 = ((UINTN)BufferAddr > MAX_UINT32) ? ARM_FID_FFA_MEM_RETRIEVE_REQ_AARCH64 : ARM_FID_FFA_MEM_RETRIEVE_REQ_AARCH32; + + Status = ArmFfaLibGetFeatures ( + FfaArgs.Arg0, + 0, + &FfaArgs.Arg1, + &FfaArgs.Arg2 + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to get FFA_MEM_RETRIEVE_REQ feature... Status: %r\n", __func__, Status)); + *RespTotalLength = 0U; + *RespFragmentLength = 0U; + return Status; + } + + FfaArgs.Arg1 = TotalLength; + FfaArgs.Arg2 = FragmentLength; + FfaArgs.Arg3 = (UINTN)BufferAddr; + FfaArgs.Arg4 = PageCount; + + ArmCallFfa (&FfaArgs); + + if (FfaArgs.Arg0 == ARM_FID_FFA_ERROR) { + *RespTotalLength = 0U; + *RespFragmentLength = 0U; + return FfaStatusToEfiStatus (FfaArgs.Arg2); + } + + ASSERT (FfaArgs.Arg0 == ARM_FID_FFA_MEM_RETRIEVE_RESP); + *RespTotalLength = FfaArgs.Arg1; + *RespFragmentLength = FfaArgs.Arg2; + return EFI_SUCCESS; +} + +/** + @brief Requests completion of a donate, lend or share memory management + transaction through Rx/Tx buffer. + + @param[in] TotalLength Total length of the memory transaction descriptor + in bytes + @param[in] FragmentLength Length in bytes of the memory transaction descriptor + passed in this ABI invocation + @param[out] RespTotalLength Total length of the response memory transaction + descriptor in bytes + @param[out] RespFragmentLength Length in bytes of the response memory transaction + descriptor passed in this ABI invocation + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibRetrieveReqRxTx ( + IN UINT32 TotalLength, + IN UINT32 FragmentLength, + OUT UINT32 *RespTotalLength, + OUT UINT32 *RespFragmentLength + ) +{ + return ArmFfaMemLibRetrieveReq ( + TotalLength, + FragmentLength, + NULL, + 0, + RespTotalLength, + RespFragmentLength + ); +} + +/** + @brief Starts a transaction to transfer access to a shared or lent + memory region from a Borrower back to its Owner. + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibRelinquish ( + VOID + ) +{ + ARM_FFA_ARGS FfaArgs; + EFI_STATUS Status; + + FfaArgs.Arg0 = ARM_FID_FFA_MEM_RETRIEVE_RELINQUISH; + + Status = ArmFfaLibGetFeatures ( + FfaArgs.Arg0, + 0, + &FfaArgs.Arg1, + &FfaArgs.Arg2 + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to get FFA_MEM_RETRIEVE_RELINQUISH feature... Status: %r\n", __func__, Status)); + return Status; + } + + ArmCallFfa (&FfaArgs); + + if (FfaArgs.Arg0 == ARM_FID_FFA_ERROR) { + return FfaStatusToEfiStatus (FfaArgs.Arg2); + } + + ASSERT (FfaArgs.Arg0 == ARM_FID_FFA_SUCCESS_AARCH32); + return EFI_SUCCESS; +} + +/** + @brief Restores exclusive access to a memory region back to its Owner. + + @param[in] Handle Globally unique Handle to identify the memory region + @param[in] Flags Flags for modifying the reclaim behavior + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibReclaim ( + IN UINT64 Handle, + IN UINT32 Flags + ) +{ + ARM_FFA_ARGS FfaArgs; + EFI_STATUS Status; + UINT32 HandleHi = 0; + UINT32 HandleLo = 0; + + FfaArgs.Arg0 = ARM_FID_FFA_MEM_RETRIEVE_RECLAIM; + + Status = ArmFfaLibGetFeatures ( + FfaArgs.Arg0, + 0, + &FfaArgs.Arg1, + &FfaArgs.Arg2 + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to get FFA_MEM_RETRIEVE_RECLAIM feature... Status: %r\n", __func__, Status)); + return Status; + } + + HandleHi = (Handle >> 32) & MAX_UINT32; + HandleLo = Handle & MAX_UINT32; + + FfaArgs.Arg1 = HandleLo; + FfaArgs.Arg2 = HandleHi; + FfaArgs.Arg3 = Flags; + + ArmCallFfa (&FfaArgs); + + if (FfaArgs.Arg0 == ARM_FID_FFA_ERROR) { + return FfaStatusToEfiStatus (FfaArgs.Arg2); + } + + ASSERT (FfaArgs.Arg0 == ARM_FID_FFA_SUCCESS_AARCH32); + return EFI_SUCCESS; +} + +/** + @brief Queries the memory attributes of a memory region. This function + can only access the regions of the SP's own translation regine. + Moreover this interface is only available in the boot phase, + i.e. before invoking FFA_MSG_WAIT interface. + + @param[in] BaseAddr Base VA of a translation granule whose + permission attributes must be returned. + @param[in] PageCount Number of translation granule size pages from the + Base address whose permissions must be returned. + This is calculated as Input Page count + 1. + @param[out] MemoryPerm Permission attributes of the memory region + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibPermGet ( + IN CONST VOID *BaseAddr, + IN UINT32 PageCount, + OUT UINT32 *MemoryPerm + ) +{ + ARM_FFA_ARGS FfaArgs; + EFI_STATUS Status; + + if (MemoryPerm == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Handle is NULL\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + FfaArgs.Arg0 = ((UINTN)BaseAddr > MAX_UINT32) ? ARM_FID_FFA_MEM_PERM_GET_AARCH64 : ARM_FID_FFA_MEM_PERM_GET_AARCH32; + + Status = ArmFfaLibGetFeatures ( + FfaArgs.Arg0, + 0, + &FfaArgs.Arg1, + &FfaArgs.Arg2 + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to get FFA_MEM_PERM_GET feature... Status: %r\n", __func__, Status)); + return Status; + } + + FfaArgs.Arg1 = (UINTN)BaseAddr; + FfaArgs.Arg2 = PageCount; + + ArmCallFfa (&FfaArgs); + + if (FfaArgs.Arg0 == ARM_FID_FFA_ERROR) { + return FfaStatusToEfiStatus (FfaArgs.Arg2); + } + + ASSERT (FfaArgs.Arg0 == ARM_FID_FFA_SUCCESS_AARCH32); + *MemoryPerm = FfaArgs.Arg2; + return EFI_SUCCESS; +} + +/** + @brief Sets the memory attributes of a memory regions. This function + can only access the regions of the SP's own translation regine. + Moreover this interface is only available in the boot phase, + i.e. before invoking FFA_MSG_WAIT interface. + + @param[in] BaseAddr Base VA of a memory region whose permission + attributes must be set. + @param[in] PageCount Number of translation granule size pages + starting from the Base address whose permissions + must be set. + @param[in] MemoryPerm Permission attributes to be set for the memory + region. + + @retval The translated FF-A error status code +**/ +EFI_STATUS +EFIAPI +ArmFfaMemLibPermSet ( + IN CONST VOID *BaseAddr, + IN UINT32 PageCount, + IN UINT32 MemoryPerm + ) +{ + ARM_FFA_ARGS FfaArgs; + EFI_STATUS Status; + + ASSERT ((MemoryPerm & ARM_FFA_MEM_PERM_RESERVED_MASK) == 0); + + FfaArgs.Arg0 = ((UINTN)BaseAddr > MAX_UINT32) ? ARM_FID_FFA_MEM_PERM_SET_AARCH64 : ARM_FID_FFA_MEM_PERM_SET_AARCH32; + + Status = ArmFfaLibGetFeatures ( + FfaArgs.Arg0, + 0, + &FfaArgs.Arg1, + &FfaArgs.Arg2 + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to get FFA_MEM_PERM_SET feature... Status: %r\n", __func__, Status)); + return Status; + } + + FfaArgs.Arg1 = (UINTN)BaseAddr; + FfaArgs.Arg2 = PageCount; + FfaArgs.Arg3 = MemoryPerm; + + ArmCallFfa (&FfaArgs); + + if (FfaArgs.Arg0 == ARM_FID_FFA_ERROR) { + return FfaStatusToEfiStatus (FfaArgs.Arg2); + } + + ASSERT (FfaArgs.Arg0 == ARM_FID_FFA_SUCCESS_AARCH32); + return EFI_SUCCESS; +} diff --git a/MdePkg/Library/ArmFfaMemMgmtLib/ArmFfaMemMgmtLib.inf b/MdePkg/Library/ArmFfaMemMgmtLib/ArmFfaMemMgmtLib.inf new file mode 100644 index 000000000000..6c3df9653b12 --- /dev/null +++ b/MdePkg/Library/ArmFfaMemMgmtLib/ArmFfaMemMgmtLib.inf @@ -0,0 +1,26 @@ +#/** @file +# +# Component description file for ArmFfaMemMgmtLib module +# +# Copyright (c), Microsoft Corporation. +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +#**/ + +[Defines] + INF_VERSION = 1.29 + BASE_NAME = ArmFfaMemMgmtLib + FILE_GUID = CC121A12-7C90-46BB-89B8-5F5BAEEFFF12 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = ArmFfaMemMgmtLib + +[Sources.common] + ArmFfaMemMgmtLib.c + +[Packages] + MdePkg/MdePkg.dec + +[LibraryClasses] + DebugLib + ArmFfaLib diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index 23d315ee32e3..43b0973737a7 100644 --- a/MdePkg/MdePkg.dec +++ b/MdePkg/MdePkg.dec @@ -370,6 +370,10 @@ # ArmFfaLib|Include/Library/ArmFfaLib.h + ## @libraryclass Provides an interface to Arm's Firmware Framework for A-profile (FF-A) memory management functions. + # + ArmFfaMemMgmtLib|Include/Library/ArmFfaMemMgmtLib.h + [Guids] # # GUID defined in UEFI2.1/UEFI2.0/EFI1.1 diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc index 752557376261..2abd7b8c3994 100644 --- a/MdePkg/MdePkg.dsc +++ b/MdePkg/MdePkg.dsc @@ -210,6 +210,7 @@ MdePkg/Library/ArmSmcLib/ArmSmcLib.inf MdePkg/Library/ArmSmcLibNull/ArmSmcLibNull.inf MdePkg/Library/ArmSvcLib/ArmSvcLib.inf + MdePkg/Library/ArmFfaMemMgmtLib/ArmFfaMemMgmtLib.inf [Components.RISCV64] MdePkg/Library/BaseRiscVSbiLib/BaseRiscVSbiLib.inf From 1cd24ff1302677a458b550c524090fd86717d848 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Thu, 22 May 2025 22:10:56 -0700 Subject: [PATCH 0131/1172] Maintainers.txt: Add reviewer and maintainer for ARM-FFA folders - Updated Maintainers.txt to include Sami Mujawar as a maintainer for the ARM-FFA sections in MdePkg and MdeModulePkg. - Updated Maintainers.txt to include Yeo Reum Yun as a reviewer for the ARM-FFA sections in MdePkg and MdeModulePkg. - Updated Maintainers.txt to include Kun Qin as a reviewer for the ARM- FFA sections in MdePkg and MdeModulePkg. - Added their contact information: email and GitHub username. Signed-off-by: Kun Qin --- Maintainers.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Maintainers.txt b/Maintainers.txt index 4430ec48d28f..ee0142fe4d68 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -404,6 +404,13 @@ F: MdeModulePkg/Bus/Spi/ M: Abner Chang [changab] R: Brit Chesley [BritChesley] +MdeModulePkg: ARM-FFA related modules +F: MdeModulePkg/*ArmFfa* +F: MdeModulePkg/*/ArmFfa*/ +M: Sami Mujawar [samimujawar] +R: Yeo Reum Yun [LeviYeoReum] +R: Kun Qin [kuqin12] + MdePkg F: MdePkg/ W: https://github.com/tianocore/tianocore.github.io/wiki/MdePkg @@ -448,6 +455,13 @@ M: Leif Lindholm [leiflindholm] M: Ard Biesheuvel [ardbiesheuvel] M: Sami Mujawar [samimujawar] +MdePkg: ARM-FFA related interfaces +F: MdePkg/*ArmFfa* +F: MdePkg/*/ArmFfa*/ +M: Sami Mujawar [samimujawar] +R: Yeo Reum Yun [LeviYeoReum] +R: Kun Qin [kuqin12] + NetworkPkg F: NetworkPkg/ W: https://github.com/tianocore/tianocore.github.io/wiki/NetworkPkg From 4fa354b11628a488fa2a227ecd231034cf74e4ea Mon Sep 17 00:00:00 2001 From: Pankaj Kumar Singh Date: Tue, 24 Jun 2025 14:53:40 +0530 Subject: [PATCH 0132/1172] EmbeddedPkg/TimeBaseLib: aligning year with UEFI specification According to the UEFI Specification version 2.11, the valid range for the Year field in the EFI_TIME structure is from 1900 to 9999. Currently IsTimeValid() checks a restricted range 2000 - 2099. Update range in TimeBaseLib.c to match UEFI specification. Signed-off-by: Pankaj Singh --- EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.c b/EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.c index b03c23773a6b..9341a2235c51 100644 --- a/EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.c +++ b/EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.c @@ -271,8 +271,8 @@ IsTimeValid ( ) { // Check the input parameters are within the range specified by UEFI - if ((Time->Year < 2000) || - (Time->Year > 2099) || + if ((Time->Year < 1900) || + (Time->Year > 9999) || (Time->Month < 1) || (Time->Month > 12) || (!IsDayValid (Time)) || From 6eed57a0aaa4a69fb33c39eb00acaae5c0d44e3f Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Tue, 13 May 2025 14:37:49 -0700 Subject: [PATCH 0133/1172] ArmPkg: MmCommunicationDxe: Add MM communicate v3 As MM cores start to support MM communciate v3. This change moves the MM communicate driver to produce MM communicate v3 protocol. Signed-off-by: Kun Qin --- .../MmCommunicationDxe/MmCommunication.c | 157 +++++++++++++++--- .../MmCommunicationDxe/MmCommunication.inf | 2 + 2 files changed, 134 insertions(+), 25 deletions(-) diff --git a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c index 2d5e36225990..188fd3289e77 100644 --- a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c +++ b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -148,7 +149,6 @@ SendSpmMmCommunicate ( This function provides a service to send and receive messages from a registered UEFI service. - @param[in] This The EFI_MM_COMMUNICATION_PROTOCOL instance. @param[in, out] CommBufferPhysical Physical address of the MM communication buffer @param[in, out] CommBufferVirtual Virtual address of the MM communication buffer @param[in, out] CommSize The size of the data buffer being passed in. On input, @@ -173,18 +173,21 @@ SendSpmMmCommunicate ( accessed by the MM environment. **/ +STATIC EFI_STATUS EFIAPI -MmCommunication2Communicate ( - IN CONST EFI_MM_COMMUNICATION2_PROTOCOL *This, - IN OUT VOID *CommBufferPhysical, - IN OUT VOID *CommBufferVirtual, - IN OUT UINTN *CommSize OPTIONAL +MmCommunicationCommon ( + IN OUT VOID *CommBufferPhysical, + IN OUT VOID *CommBufferVirtual, + IN OUT UINTN *CommSize OPTIONAL ) { - EFI_MM_COMMUNICATE_HEADER *CommunicateHeader; - UINTN BufferSize; - EFI_STATUS Status; + EFI_MM_COMMUNICATE_HEADER *CommunicateHeader; + EFI_MM_COMMUNICATE_HEADER_V3 *CommunicateHeaderV3; + UINTN BufferSize; + UINTN *MessageSize; + UINTN HeaderSize; + EFI_STATUS Status; Status = EFI_ACCESS_DENIED; BufferSize = 0; @@ -196,15 +199,30 @@ MmCommunication2Communicate ( return EFI_INVALID_PARAMETER; } - Status = EFI_SUCCESS; - CommunicateHeader = CommBufferVirtual; + Status = EFI_SUCCESS; + CommunicateHeader = CommBufferVirtual; + CommunicateHeaderV3 = NULL; // CommBuffer is a mandatory parameter. Hence, Rely on // MessageLength + Header to ascertain the // total size of the communication payload rather than // rely on optional CommSize parameter - BufferSize = CommunicateHeader->MessageLength + - sizeof (CommunicateHeader->HeaderGuid) + - sizeof (CommunicateHeader->MessageLength); + if (CompareGuid ( + &CommunicateHeader->HeaderGuid, + &gEfiMmCommunicateHeaderV3Guid + )) + { + CommunicateHeaderV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)CommBufferVirtual; + BufferSize = CommunicateHeaderV3->BufferSize; + MessageSize = &CommunicateHeaderV3->MessageSize; + HeaderSize = sizeof (EFI_MM_COMMUNICATE_HEADER_V3); + } else { + BufferSize = CommunicateHeader->MessageLength + + sizeof (CommunicateHeader->HeaderGuid) + + sizeof (CommunicateHeader->MessageLength); + MessageSize = &CommunicateHeader->MessageLength; + HeaderSize = sizeof (CommunicateHeader->HeaderGuid) + + sizeof (CommunicateHeader->MessageLength); + } // If CommSize is not omitted, perform size inspection before proceeding. if (CommSize != NULL) { @@ -229,13 +247,11 @@ MmCommunication2Communicate ( // If the message length is 0 or greater than what can be tolerated by the MM // environment then return the expected size. // - if ((CommunicateHeader->MessageLength == 0) || + if ((*MessageSize == 0) || (BufferSize > mNsCommBuffMemRegion.Length)) { - CommunicateHeader->MessageLength = mNsCommBuffMemRegion.Length - - sizeof (CommunicateHeader->HeaderGuid) - - sizeof (CommunicateHeader->MessageLength); - Status = EFI_BAD_BUFFER_SIZE; + *MessageSize = mNsCommBuffMemRegion.Length - HeaderSize; + Status = EFI_BAD_BUFFER_SIZE; } // MessageLength or CommSize check has failed, return here. @@ -257,9 +273,30 @@ MmCommunication2Communicate ( // On successful return, the size of data being returned is inferred from // MessageLength + Header. CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)mNsCommBuffMemRegion.VirtualBase; - BufferSize = CommunicateHeader->MessageLength + - sizeof (CommunicateHeader->HeaderGuid) + - sizeof (CommunicateHeader->MessageLength); + if ((CommunicateHeaderV3 != NULL) && !CompareGuid ( + &CommunicateHeader->HeaderGuid, + &gEfiMmCommunicateHeaderV3Guid + )) + { + // Sanity check to make sure we are still using v3 + DEBUG (( + DEBUG_ERROR, + "%a Expected v3 header, but got v1 header! %g\n", + __func__, + &CommunicateHeader->HeaderGuid + )); + return EFI_INVALID_PARAMETER; + } + + if (CommunicateHeaderV3 != NULL) { + CommunicateHeaderV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)CommunicateHeader; + BufferSize = CommunicateHeaderV3->BufferSize; + } else { + BufferSize = CommunicateHeader->MessageLength + + sizeof (CommunicateHeader->HeaderGuid) + + sizeof (CommunicateHeader->MessageLength); + } + if (BufferSize > mNsCommBuffMemRegion.Length) { // Something bad has happened, we should have landed in ARM_SMC_MM_RET_NO_MEMORY Status = EFI_BAD_BUFFER_SIZE; @@ -282,6 +319,67 @@ MmCommunication2Communicate ( return Status; } +/** + Communicates with a registered handler. + + This function provides a service to send and receive messages from a registered UEFI service. + + @param[in] This The EFI_MM_COMMUNICATION_PROTOCOL instance. + @param[in, out] CommBufferPhysical Physical address of the MM communication buffer + @param[in, out] CommBufferVirtual Virtual address of the MM communication buffer + @param[in, out] CommSize The size of the data buffer being passed in. On input, + when not omitted, the buffer should cover EFI_MM_COMMUNICATE_HEADER + and the value of MessageLength field. On exit, the size + of data being returned. Zero if the handler does not + wish to reply with any data. This parameter is optional + and may be NULL. + + @retval EFI_SUCCESS The message was successfully posted. + @retval EFI_INVALID_PARAMETER CommBufferPhysical or CommBufferVirtual was NULL, or + integer value pointed by CommSize does not cover + EFI_MM_COMMUNICATE_HEADER and the value of MessageLength + field. + @retval EFI_BAD_BUFFER_SIZE The buffer is too large for the MM implementation. + If this error is returned, the MessageLength field + in the CommBuffer header or the integer pointed by + CommSize, are updated to reflect the maximum payload + size the implementation can accommodate. + @retval EFI_ACCESS_DENIED The CommunicateBuffer parameter or CommSize parameter, + if not omitted, are in address range that cannot be + accessed by the MM environment. + +**/ +EFI_STATUS +EFIAPI +MmCommunication2Communicate ( + IN CONST EFI_MM_COMMUNICATION2_PROTOCOL *This, + IN OUT VOID *CommBufferPhysical, + IN OUT VOID *CommBufferVirtual, + IN OUT UINTN *CommSize OPTIONAL + ) +{ + return MmCommunicationCommon ( + CommBufferPhysical, + CommBufferVirtual, + CommSize + ); +} + +EFI_STATUS +EFIAPI +MmCommunication3Communicate ( + IN CONST EFI_MM_COMMUNICATION3_PROTOCOL *This, + IN OUT VOID *CommBufferPhysical, + IN OUT VOID *CommBufferVirtual + ) +{ + return MmCommunicationCommon ( + CommBufferPhysical, + CommBufferVirtual, + NULL + ); +} + // // MM Communication Protocol instance // @@ -289,6 +387,13 @@ STATIC EFI_MM_COMMUNICATION2_PROTOCOL mMmCommunication2 = { MmCommunication2Communicate }; +// +// MM Communication Protocol instance +// +STATIC EFI_MM_COMMUNICATION3_PROTOCOL mMmCommunication3 = { + MmCommunication3Communicate +}; + /** Notification callback on SetVirtualAddressMap event. @@ -682,11 +787,13 @@ MmCommunication2Initialize ( } // Install the communication protocol - Status = gBS->InstallProtocolInterface ( + Status = gBS->InstallMultipleProtocolInterfaces ( &mMmCommunicateHandle, &gEfiMmCommunication2ProtocolGuid, - EFI_NATIVE_INTERFACE, - &mMmCommunication2 + &mMmCommunication2, + &gEfiMmCommunication3ProtocolGuid, + &mMmCommunication3, + NULL ); if (EFI_ERROR (Status)) { DEBUG (( diff --git a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.inf b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.inf index 6a57f0c79f05..c9d37d895051 100644 --- a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.inf +++ b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.inf @@ -43,11 +43,13 @@ [Protocols] gEfiDxeMmReadyToLockProtocolGuid ## UNDEFINED # SmiHandlerRegister gEfiMmCommunication2ProtocolGuid ## PRODUCES + gEfiMmCommunication3ProtocolGuid ## PRODUCES [Guids] gEfiEndOfDxeEventGroupGuid gEfiEventExitBootServicesGuid gEfiEventReadyToBootGuid + gEfiMmCommunicateHeaderV3Guid [Pcd.common] gArmTokenSpaceGuid.PcdMmBufferBase From 1634dd5b9396702556aa784cfd47c3408d72006f Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Tue, 13 May 2025 15:19:13 -0700 Subject: [PATCH 0134/1172] ArmPkg: MmCommunicationPei: Add MM communicate v3 As MM cores start to support MM communciate v3. This change moves the MM communicate driver to produce MM communicate v3 PPI. Signed-off-by: Kun Qin --- .../MmCommunicationPei/MmCommunicationPei.c | 232 +++++++++++++----- .../MmCommunicationPei/MmCommunicationPei.inf | 4 + 2 files changed, 181 insertions(+), 55 deletions(-) diff --git a/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c b/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c index 666b7a209276..fc29e99788b5 100644 --- a/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c +++ b/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -371,70 +372,92 @@ SendSpmMmCommunicate ( STATIC EFI_STATUS EFIAPI -MmCommunicationPeim ( - IN CONST EFI_PEI_MM_COMMUNICATION_PPI *This, - IN OUT VOID *CommBuffer, - IN OUT UINTN *CommSize +MmCommunicationPeimCommon ( + IN OUT VOID *CommBuffer, + IN OUT UINTN *CommSize ) { - EFI_MM_COMMUNICATE_HEADER *CommunicateHeader; - EFI_MM_COMMUNICATE_HEADER *TempCommHeader; - EFI_STATUS Status; - UINTN BufferSize; + EFI_MM_COMMUNICATE_HEADER *CommunicateHeader; + EFI_MM_COMMUNICATE_HEADER_V3 *CommunicateHeaderV3; + EFI_STATUS Status; + UINTN BufferSize; + UINTN HeaderSize; // // Check parameters // - if ((CommBuffer == NULL) || (CommSize == NULL)) { + if (CommBuffer == NULL) { ASSERT (CommBuffer != NULL); - ASSERT (CommSize != NULL); return EFI_INVALID_PARAMETER; } - // If the length of the CommBuffer is 0 then return the expected length. - // This case can be used by the consumer of this driver to find out the - // max size that can be used for allocating CommBuffer. - if ((*CommSize == 0) || (*CommSize > (UINTN)PcdGet64 (PcdMmBufferSize))) { - DEBUG (( - DEBUG_ERROR, - "%a Invalid CommSize value 0x%llx!\n", - __func__, - *CommSize - )); - *CommSize = (UINTN)PcdGet64 (PcdMmBufferSize); - return EFI_BAD_BUFFER_SIZE; - } + CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)(UINTN)CommBuffer; + CommunicateHeaderV3 = NULL; + if (CompareGuid ( + &CommunicateHeader->HeaderGuid, + &gEfiMmCommunicateHeaderV3Guid + )) + { + // This is a v3 header + CommunicateHeaderV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)(UINTN)CommBuffer; + HeaderSize = sizeof (EFI_MM_COMMUNICATE_HEADER_V3); + BufferSize = CommunicateHeaderV3->BufferSize; + } else { + // This is a v1 header, do some checks + if (CommSize == NULL) { + // If CommSize is not NULL, then it must be the size of the header + // plus the size of the message. + DEBUG (( + DEBUG_ERROR, + "%a CommSize is NULL!\n", + __func__ + )); + return EFI_INVALID_PARAMETER; + } - // Given CommBuffer is not NULL here, we use it to test the legitimacy of CommSize. - TempCommHeader = (EFI_MM_COMMUNICATE_HEADER *)(UINTN)CommBuffer; + // If the length of the CommBuffer is 0 then return the expected length. + // This case can be used by the consumer of this driver to find out the + // max size that can be used for allocating CommBuffer. + if ((*CommSize == 0) || (*CommSize > (UINTN)PcdGet64 (PcdMmBufferSize))) { + DEBUG (( + DEBUG_ERROR, + "%a Invalid CommSize value 0x%llx!\n", + __func__, + *CommSize + )); + *CommSize = (UINTN)PcdGet64 (PcdMmBufferSize); + return EFI_BAD_BUFFER_SIZE; + } - // CommBuffer is a mandatory parameter. Hence, Rely on - // MessageLength + Header to ascertain the - // total size of the communication payload rather than - // rely on optional CommSize parameter - BufferSize = TempCommHeader->MessageLength + - sizeof (TempCommHeader->HeaderGuid) + - sizeof (TempCommHeader->MessageLength); + HeaderSize = sizeof (CommunicateHeader->HeaderGuid) + + sizeof (CommunicateHeader->MessageLength); - // - // If CommSize is supplied it must match MessageLength + sizeof (EFI_MM_COMMUNICATE_HEADER); - // - if (*CommSize != BufferSize) { - DEBUG (( - DEBUG_ERROR, - "%a Unexpected CommSize value, has: 0x%llx vs. expected: 0x%llx!\n", - __func__, - *CommSize, - BufferSize - )); - return EFI_INVALID_PARAMETER; + // CommBuffer is a mandatory parameter. Hence, Rely on + // MessageLength + Header to ascertain the + // total size of the communication payload rather than + // rely on optional CommSize parameter + BufferSize = CommunicateHeader->MessageLength + + sizeof (CommunicateHeader->HeaderGuid) + + sizeof (CommunicateHeader->MessageLength); + // + // If CommSize is supplied it must match MessageLength + sizeof (EFI_MM_COMMUNICATE_HEADER); + // + if (*CommSize != BufferSize) { + DEBUG (( + DEBUG_ERROR, + "%a Unexpected CommSize value, has: 0x%llx vs. expected: 0x%llx!\n", + __func__, + *CommSize, + BufferSize + )); + return EFI_INVALID_PARAMETER; + } } // Now we know that the size is something we can handle, copy it over to the designated comm buffer. CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)(UINTN)(PcdGet64 (PcdMmBufferBase)); - CopyMem (CommunicateHeader, CommBuffer, *CommSize); - + CopyMem (CommunicateHeader, CommBuffer, BufferSize); if (IsFfaSupported ()) { Status = SendFfaMmCommunicate (); } else { @@ -444,9 +467,30 @@ MmCommunicationPeim ( if (!EFI_ERROR (Status)) { // On successful return, the size of data being returned is inferred from // MessageLength + Header. - BufferSize = CommunicateHeader->MessageLength + - sizeof (CommunicateHeader->HeaderGuid) + - sizeof (CommunicateHeader->MessageLength); + if ((CommunicateHeaderV3 != NULL) && !CompareGuid ( + &CommunicateHeader->HeaderGuid, + &gEfiMmCommunicateHeaderV3Guid + )) + { + // Sanity check to make sure we are still using v3 + DEBUG (( + DEBUG_ERROR, + "%a Expected v3 header, but got v1 header! %g\n", + __func__, + &CommunicateHeader->HeaderGuid + )); + return EFI_INVALID_PARAMETER; + } + + if (CommunicateHeaderV3 != NULL) { + CommunicateHeaderV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)CommunicateHeader; + BufferSize = CommunicateHeaderV3->BufferSize; + } else { + BufferSize = CommunicateHeader->MessageLength + + sizeof (CommunicateHeader->HeaderGuid) + + sizeof (CommunicateHeader->MessageLength); + } + if (BufferSize > (UINTN)PcdGet64 (PcdMmBufferSize)) { // Something bad has happened, we should have landed in ARM_SMC_MM_RET_NO_MEMORY Status = EFI_BAD_BUFFER_SIZE; @@ -459,13 +503,80 @@ MmCommunicationPeim ( )); } else { CopyMem (CommBuffer, CommunicateHeader, BufferSize); - *CommSize = BufferSize; + if (CommSize != NULL) { + // If CommSize is not NULL, then it must be the size of the header + // plus the size of the message. + *CommSize = BufferSize; + } } } return Status; } +/** + MmCommunicationPeim + Communicates with a registered handler. + This function provides a service to send and receive messages from a registered UEFI service during PEI. + + @param[in] This The EFI_PEI_MM_COMMUNICATION_PPI instance. + @param[in, out] CommBuffer Pointer to the data buffer + @param[in, out] CommSize The size of the data buffer being passed in. On exit, the + size of data being returned. Zero if the handler does not + wish to reply with any data. + + @retval EFI_SUCCESS The message was successfully posted. + @retval EFI_INVALID_PARAMETER CommBuffer or CommSize was NULL, or *CommSize does not + match MessageLength + sizeof (EFI_MM_COMMUNICATE_HEADER). + @retval EFI_BAD_BUFFER_SIZE The buffer is too large for the MM implementation. + If this error is returned, the MessageLength field + in the CommBuffer header or the integer pointed by + CommSize, are updated to reflect the maximum payload + size the implementation can accommodate. + @retval EFI_ACCESS_DENIED The CommunicateBuffer parameter or CommSize parameter, + if not omitted, are in address range that cannot be + accessed by the MM environment. +**/ +STATIC +EFI_STATUS +EFIAPI +MmCommunicationPeim ( + IN CONST EFI_PEI_MM_COMMUNICATION_PPI *This, + IN OUT VOID *CommBuffer, + IN OUT UINTN *CommSize + ) +{ + return MmCommunicationPeimCommon ( + CommBuffer, + CommSize + ); +} + +/** + Communicates with a registered handler through MM communicate v3. + + This function provides a service to send and receive messages from a registered UEFI service. + + @param[in] This The EFI_PEI_MM_COMMUNICATE3 instance. + @param[in, out] CommBuffer A pointer to the buffer to convey into MMRAM. + + @retval EFI_SUCCESS The message was successfully posted. + @retval EFI_INVALID_PARAMETER The CommBuffer was NULL. +**/ +STATIC +EFI_STATUS +EFIAPI +MmCommunication3Peim ( + IN CONST EFI_PEI_MM_COMMUNICATION3_PPI *This, + IN OUT VOID *CommBuffer + ) +{ + return MmCommunicationPeimCommon ( + CommBuffer, + NULL + ); +} + // // Module globals for the MM Communication PPI // @@ -473,10 +584,21 @@ STATIC CONST EFI_PEI_MM_COMMUNICATION_PPI mPeiMmCommunication = { MmCommunicationPeim }; -STATIC CONST EFI_PEI_PPI_DESCRIPTOR mPeiMmCommunicationPpi = { - (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), - &gEfiPeiMmCommunicationPpiGuid, - (VOID *)&mPeiMmCommunication +STATIC CONST EFI_PEI_MM_COMMUNICATION3_PPI mPeiMmCommunication3 = { + MmCommunication3Peim +}; + +STATIC CONST EFI_PEI_PPI_DESCRIPTOR mPeiMmCommunicationPpis[] = { + { + (EFI_PEI_PPI_DESCRIPTOR_PPI), + &gEfiPeiMmCommunication3PpiGuid, + (VOID *)&mPeiMmCommunication3 + }, + { + (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), + &gEfiPeiMmCommunicationPpiGuid, + (VOID *)&mPeiMmCommunication + } }; /** @@ -514,5 +636,5 @@ MmCommunicationPeiInitialize ( return Status; } - return PeiServicesInstallPpi (&mPeiMmCommunicationPpi); + return PeiServicesInstallPpi (mPeiMmCommunicationPpis); } diff --git a/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.inf b/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.inf index 2bd4d7182667..7a422a7396d0 100644 --- a/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.inf +++ b/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.inf @@ -37,8 +37,12 @@ [Protocols] gEfiMmCommunication2ProtocolGuid +[Guids] + gEfiMmCommunicateHeaderV3Guid + [Ppis] gEfiPeiMmCommunicationPpiGuid ## PRODUCES + gEfiPeiMmCommunication3PpiGuid ## PRODUCES [Depex] TRUE From 6b7a3e05f06843af98d91d76f2c80bbb73780647 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Tue, 13 May 2025 15:24:56 -0700 Subject: [PATCH 0135/1172] ArmPkg: ArmStandaloneMmCoreEntryPoint: Add MM communicate v3 support As the standalone MM core begins supporting MM Communicate v3, this update extends its functionality to incorporate MM Communicate v3 headers, enabling compatibility with the new protocol. Signed-off-by: Kun Qin --- .../ArmStandaloneMmCoreEntryPoint.c | 52 +++++++++++++++---- .../ArmStandaloneMmCoreEntryPoint.inf | 1 + 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c index 52194832e2ec..86e42140a2eb 100644 --- a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c +++ b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -45,6 +46,8 @@ #include #include +#include +#include extern EFI_MM_SYSTEM_TABLE gMmCoreMmst; @@ -443,7 +446,9 @@ GetServiceType ( IN EFI_GUID *ServiceGuid ) { - if (CompareGuid (ServiceGuid, &gEfiMmCommunication2ProtocolGuid)) { + if (CompareGuid (ServiceGuid, &gEfiMmCommunication2ProtocolGuid) || + CompareGuid (ServiceGuid, &gEfiMmCommunication3ProtocolGuid)) + { return ServiceTypeMmCommunication; } @@ -467,10 +472,14 @@ ValidateMmCommBufferAddr ( IN UINTN CommBufferAddr ) { - UINT64 NsCommBufferEnd; - UINT64 SCommBufferEnd; - UINT64 CommBufferEnd; - UINT64 CommBufferRange; + UINT64 NsCommBufferEnd; + UINT64 SCommBufferEnd; + UINT64 CommBufferEnd; + UINT64 CommBufferRange; + UINT64 BufferSize; + UINT64 BufferEnd; + EFI_MM_COMMUNICATE_HEADER_V3 *CommBufferHeaderV3; + EFI_STATUS Status; NsCommBufferEnd = mNsCommBuffer->PhysicalStart + mNsCommBuffer->PhysicalSize; SCommBufferEnd = mSCommBuffer->PhysicalStart + mSCommBuffer->PhysicalSize; @@ -493,11 +502,36 @@ ValidateMmCommBufferAddr ( return EFI_ACCESS_DENIED; } - // perform bounds check. - if (((CommBufferAddr + sizeof (EFI_MM_COMMUNICATE_HEADER) + - ((EFI_MM_COMMUNICATE_HEADER *)CommBufferAddr)->MessageLength)) > - CommBufferEnd) + if (CompareGuid ( + &((EFI_MM_COMMUNICATE_HEADER *)CommBufferAddr)->HeaderGuid, + &gEfiMmCommunicateHeaderV3Guid + )) { + CommBufferHeaderV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)CommBufferAddr; + Status = SafeUint64Add ( + CommBufferHeaderV3->MessageSize, + sizeof (EFI_MM_COMMUNICATE_HEADER_V3), + &BufferSize + ); + if (EFI_ERROR (Status)) { + return EFI_ACCESS_DENIED; + } + } else { + BufferSize = ((EFI_MM_COMMUNICATE_HEADER *)CommBufferAddr)->MessageLength + + OFFSET_OF (EFI_MM_COMMUNICATE_HEADER, Data); + } + + Status = SafeUint64Add ( + CommBufferAddr, + BufferSize, + &BufferEnd + ); + if (EFI_ERROR (Status)) { + return EFI_ACCESS_DENIED; + } + + // perform bounds check. + if (BufferEnd > CommBufferEnd) { return EFI_ACCESS_DENIED; } diff --git a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.inf b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.inf index 0e9aab79af50..e94a2660dbf7 100644 --- a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.inf +++ b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.inf @@ -59,6 +59,7 @@ [Protocols] gEdkiiPiMmCpuDriverEpProtocolGuid gEfiMmCommunication2ProtocolGuid + gEfiMmCommunication3ProtocolGuid [Pcd] gArmTokenSpaceGuid.PcdStMmStackSize From 9752e69927ce8e42a4b4602ae628dcfd9891d5cb Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Wed, 14 May 2025 13:22:26 -0700 Subject: [PATCH 0136/1172] ArmPkg: StandaloneMmCpu: Add MM communicate v3 support As the standalone MM core begins supporting MM Communicate v3, this update extends its functionality to incorporate MM Communicate v3 headers format, enabling compatibility with the new protocol. Signed-off-by: Kun Qin --- ArmPkg/Drivers/StandaloneMmCpu/EventHandle.c | 66 ++++++++++++++----- .../StandaloneMmCpu/StandaloneMmCpu.inf | 1 + 2 files changed, 51 insertions(+), 16 deletions(-) diff --git a/ArmPkg/Drivers/StandaloneMmCpu/EventHandle.c b/ArmPkg/Drivers/StandaloneMmCpu/EventHandle.c index b6cecd133604..99445d5912cf 100644 --- a/ArmPkg/Drivers/StandaloneMmCpu/EventHandle.c +++ b/ArmPkg/Drivers/StandaloneMmCpu/EventHandle.c @@ -39,7 +39,8 @@ MmFoundationEntryRegister ( // maintained in single global variable because StandaloneMm is UP-migratable // (which means it cannot run concurrently) // -EFI_MM_COMMUNICATE_HEADER *gGuidedEventContext = NULL; +EFI_MM_COMMUNICATE_HEADER *gGuidedEventContext = NULL; +EFI_MM_COMMUNICATE_HEADER_V3 *gGuidedEventContextV3 = NULL; EFI_MM_CONFIGURATION_PROTOCOL mMmConfig = { 0, @@ -89,8 +90,19 @@ PiMmStandaloneMmCpuDriverEntry ( } // Find out the size of the buffer passed - CommBufferSize = ((EFI_MM_COMMUNICATE_HEADER *)CommBufferAddr)->MessageLength + - sizeof (EFI_MM_COMMUNICATE_HEADER); + if (CompareGuid ( + &((EFI_MM_COMMUNICATE_HEADER *)CommBufferAddr)->HeaderGuid, + &gEfiMmCommunicateHeaderV3Guid + )) + { + // This is a v3 header + CommBufferSize = ((EFI_MM_COMMUNICATE_HEADER_V3 *)CommBufferAddr)->BufferSize; + } else { + // This is a v1 header + // Find out the size of the buffer passed + CommBufferSize = ((EFI_MM_COMMUNICATE_HEADER *)CommBufferAddr)->MessageLength + + OFFSET_OF (EFI_MM_COMMUNICATE_HEADER, Data); + } // Now that the secure world can see the normal world buffer, allocate // memory to copy the communication buffer to the secure world. @@ -188,19 +200,41 @@ PiMmCpuTpFwRootMmiHandler ( return EFI_NOT_FOUND; } - DEBUG (( - DEBUG_INFO, - "CommBuffer - 0x%x, CommBufferSize - 0x%x\n", - gGuidedEventContext, - gGuidedEventContext->MessageLength - )); - - Status = mMmst->MmiManage ( - &gGuidedEventContext->HeaderGuid, - NULL, - gGuidedEventContext->Data, - &gGuidedEventContext->MessageLength - ); + if (CompareGuid ( + &gGuidedEventContext->HeaderGuid, + &gEfiMmCommunicateHeaderV3Guid + )) + { + gGuidedEventContextV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)gGuidedEventContext; + DEBUG (( + DEBUG_INFO, + "CommBuffer - 0x%x, CommBufferSize - 0x%llx, MessageSize - 0x%llx\n", + gGuidedEventContextV3, + gGuidedEventContextV3->BufferSize, + gGuidedEventContextV3->MessageSize + )); + + Status = mMmst->MmiManage ( + &gGuidedEventContextV3->MessageGuid, + NULL, + gGuidedEventContextV3->MessageData, + (UINTN *)(&gGuidedEventContextV3->MessageSize) + ); + } else { + DEBUG (( + DEBUG_INFO, + "CommBuffer - 0x%x, CommBufferSize - 0x%x\n", + gGuidedEventContext, + gGuidedEventContext->MessageLength + )); + + Status = mMmst->MmiManage ( + &gGuidedEventContext->HeaderGuid, + NULL, + gGuidedEventContext->Data, + (UINTN *)(&gGuidedEventContext->MessageLength) + ); + } if (Status != EFI_SUCCESS) { DEBUG ((DEBUG_WARN, "Unable to manage Guided Event - %d\n", Status)); diff --git a/ArmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.inf b/ArmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.inf index dcf94d5778d7..5f8bf90d7ec1 100644 --- a/ArmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.inf +++ b/ArmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.inf @@ -46,6 +46,7 @@ gZeroGuid gMpInformationHobGuid gEfiStandaloneMmNonSecureBufferGuid + gEfiMmCommunicateHeaderV3Guid [Depex] TRUE From fdb638fc28d3cabf634f206504226de092e2b775 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Tue, 13 May 2025 15:30:02 -0700 Subject: [PATCH 0137/1172] MdeModulePkg: PiSmmIpl: Add check for MM communicate v3 header This change adds a check to ensure the incoming buffer is correctly using MM communicate v3 header before dereferencing the content. Signed-off-by: Kun Qin --- MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c b/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c index de7636adfb3f..749295b0ac81 100644 --- a/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c +++ b/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c @@ -737,6 +737,13 @@ MmCommunicationMmCommunicate3 ( } CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER_V3 *)CommBufferVirtual; + if (!CompareGuid ( + &CommunicateHeader->HeaderGuid, + &gEfiMmCommunicateHeaderV3Guid + )) + { + return EFI_INVALID_PARAMETER; + } Status = SafeUint64Add (sizeof (EFI_MM_COMMUNICATE_HEADER_V3), CommunicateHeader->MessageSize, &MinCommSize); if (EFI_ERROR (Status)) { From 23e1fc6b0bea0849e1a9be0caf915f9121612353 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Sun, 20 Apr 2025 21:47:37 -0700 Subject: [PATCH 0138/1172] MdeModulePkg: VariableSmmRuntimeDxe: Use MM communicate v3 As MM cores start to support MM communciate v3. This change moves the variable driver to use MM communicate v3 if it is available, otherwise the driver will fallback to v2 to keep the same functionality. Signed-off-by: Kun Qin --- MdeModulePkg/Include/Guid/SmmVariableCommon.h | 3 +- .../RuntimeDxe/VariableSmmRuntimeDxe.c | 272 +++++++++++++----- .../RuntimeDxe/VariableSmmRuntimeDxe.inf | 4 +- 3 files changed, 206 insertions(+), 73 deletions(-) diff --git a/MdeModulePkg/Include/Guid/SmmVariableCommon.h b/MdeModulePkg/Include/Guid/SmmVariableCommon.h index 1a1ab4fcc18e..e88645ece3b8 100644 --- a/MdeModulePkg/Include/Guid/SmmVariableCommon.h +++ b/MdeModulePkg/Include/Guid/SmmVariableCommon.h @@ -81,7 +81,8 @@ typedef struct { /// /// Size of SMM communicate header, without including the payload. /// -#define SMM_COMMUNICATE_HEADER_SIZE (OFFSET_OF (EFI_MM_COMMUNICATE_HEADER, Data)) +#define SMM_COMMUNICATE_HEADER_SIZE (OFFSET_OF (EFI_MM_COMMUNICATE_HEADER, Data)) +#define SMM_COMMUNICATE_HEADER_SIZE_V3 (sizeof (EFI_MM_COMMUNICATE_HEADER_V3)) /// /// Size of SMM variable communicate header, without including the payload. diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c index 8afc4f4b8808..47f14c59c7f0 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c @@ -22,6 +22,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include +#include #include #include #include @@ -48,6 +49,7 @@ EFI_HANDLE mHandle = NULL; EFI_SMM_VARIABLE_PROTOCOL *mSmmVariable = NULL; EFI_EVENT mVirtualAddressChangeEvent = NULL; EFI_MM_COMMUNICATION2_PROTOCOL *mMmCommunication2 = NULL; +EFI_MM_COMMUNICATION3_PROTOCOL *mMmCommunication3 = NULL; UINT8 *mVariableBuffer = NULL; UINT8 *mVariableBufferPhysical = NULL; VARIABLE_INFO_ENTRY *mVariableInfo = NULL; @@ -163,17 +165,33 @@ InitCommunicateBuffer ( ) { EFI_MM_COMMUNICATE_HEADER *SmmCommunicateHeader; + EFI_MM_COMMUNICATE_HEADER_V3 *SmmCommunicateHeaderV3; SMM_VARIABLE_COMMUNICATE_HEADER *SmmVariableFunctionHeader; - if (DataSize + SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE > mVariableBufferSize) { - return EFI_INVALID_PARAMETER; - } + ZeroMem (mVariableBuffer, mVariableBufferSize); + if (mMmCommunication3 != NULL) { + if (DataSize + SMM_COMMUNICATE_HEADER_SIZE_V3 + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE > mVariableBufferSize) { + return EFI_INVALID_PARAMETER; + } - SmmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)mVariableBuffer; - CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid); - SmmCommunicateHeader->MessageLength = DataSize + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE; + SmmCommunicateHeaderV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)mVariableBuffer; + CopyGuid (&SmmCommunicateHeaderV3->HeaderGuid, &gEfiMmCommunicateHeaderV3Guid); + SmmCommunicateHeaderV3->BufferSize = mVariableBufferSize; + CopyGuid (&SmmCommunicateHeaderV3->MessageGuid, &gEfiSmmVariableProtocolGuid); + SmmCommunicateHeaderV3->MessageSize = DataSize + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE; + SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeaderV3->MessageData; + } else { + // Use v1 communication header, if v3 protocol is not available. + if (DataSize + SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE > mVariableBufferSize) { + return EFI_INVALID_PARAMETER; + } + + SmmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)mVariableBuffer; + CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid); + SmmCommunicateHeader->MessageLength = DataSize + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE; + SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data; + } - SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data; SmmVariableFunctionHeader->Function = Function; if (DataPtr != NULL) { *DataPtr = SmmVariableFunctionHeader->Data; @@ -199,20 +217,38 @@ SendCommunicateBuffer ( EFI_STATUS Status; UINTN CommSize; EFI_MM_COMMUNICATE_HEADER *SmmCommunicateHeader; + EFI_MM_COMMUNICATE_HEADER_V3 *SmmCommunicateHeaderV3; SMM_VARIABLE_COMMUNICATE_HEADER *SmmVariableFunctionHeader; - CommSize = DataSize + SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE; - Status = mMmCommunication2->Communicate ( - mMmCommunication2, + if (mMmCommunication3 != NULL) { + Status = mMmCommunication3->Communicate ( + mMmCommunication3, mVariableBufferPhysical, - mVariableBuffer, - &CommSize + mVariableBuffer ); - ASSERT_EFI_ERROR (Status); + ASSERT_EFI_ERROR (Status); - SmmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)mVariableBuffer; - SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data; - return SmmVariableFunctionHeader->ReturnStatus; + SmmCommunicateHeaderV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)mVariableBuffer; + SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeaderV3->MessageData; + + Status = SmmVariableFunctionHeader->ReturnStatus; + } else { + CommSize = DataSize + SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE; + Status = mMmCommunication2->Communicate ( + mMmCommunication2, + mVariableBufferPhysical, + mVariableBuffer, + &CommSize + ); + ASSERT_EFI_ERROR (Status); + + SmmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)mVariableBuffer; + SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data; + + Status = SmmVariableFunctionHeader->ReturnStatus; + } + + return Status; } /** @@ -1342,7 +1378,12 @@ VariableAddressChangeEvent ( ) { EfiConvertPointer (0x0, (VOID **)&mVariableBuffer); - EfiConvertPointer (0x0, (VOID **)&mMmCommunication2); + if (mMmCommunication3 != NULL) { + EfiConvertPointer (0x0, (VOID **)&mMmCommunication3); + } else { + EfiConvertPointer (0x0, (VOID **)&mMmCommunication2); + } + EfiConvertPointer (EFI_OPTIONAL_PTR, (VOID **)&mVariableRtCacheInfo.CacheInfoFlagBuffer); EfiConvertPointer (EFI_OPTIONAL_PTR, (VOID **)&mVariableRtCacheInfo.RuntimeHobCacheBuffer); EfiConvertPointer (EFI_OPTIONAL_PTR, (VOID **)&mVariableRtCacheInfo.RuntimeNvCacheBuffer); @@ -1367,6 +1408,7 @@ GetVariablePayloadSize ( EFI_STATUS Status; SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE *SmmGetPayloadSize; EFI_MM_COMMUNICATE_HEADER *SmmCommunicateHeader; + EFI_MM_COMMUNICATE_HEADER_V3 *SmmCommunicateHeaderV3; SMM_VARIABLE_COMMUNICATE_HEADER *SmmVariableFunctionHeader; UINTN CommSize; UINT8 *CommBuffer; @@ -1384,26 +1426,52 @@ GetVariablePayloadSize ( // Init the communicate buffer. The buffer data size is: // SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE); // - CommSize = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE); - CommBuffer = AllocateZeroPool (CommSize); - if (CommBuffer == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto Done; - } - SmmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)CommBuffer; - CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid); - SmmCommunicateHeader->MessageLength = SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE); + if (mMmCommunication3 != NULL) { + CommSize = SMM_COMMUNICATE_HEADER_SIZE_V3 + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE); + CommBuffer = AllocateZeroPool (CommSize); + if (CommBuffer == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } - SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data; - SmmVariableFunctionHeader->Function = SMM_VARIABLE_FUNCTION_GET_PAYLOAD_SIZE; - SmmGetPayloadSize = (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE *)SmmVariableFunctionHeader->Data; + SmmCommunicateHeaderV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)CommBuffer; + CopyGuid (&SmmCommunicateHeaderV3->HeaderGuid, &gEfiMmCommunicateHeaderV3Guid); + SmmCommunicateHeaderV3->BufferSize = CommSize; + CopyGuid (&SmmCommunicateHeaderV3->MessageGuid, &gEfiSmmVariableProtocolGuid); + SmmCommunicateHeaderV3->MessageSize = SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE); + SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeaderV3->MessageData; - // - // Send data to SMM. - // - Status = mMmCommunication2->Communicate (mMmCommunication2, CommBuffer, CommBuffer, &CommSize); - ASSERT_EFI_ERROR (Status); + SmmVariableFunctionHeader->Function = SMM_VARIABLE_FUNCTION_GET_PAYLOAD_SIZE; + SmmGetPayloadSize = (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE *)SmmVariableFunctionHeader->Data; + + // + // Send data to SMM. + // + Status = mMmCommunication3->Communicate (mMmCommunication3, CommBuffer, CommBuffer); + ASSERT_EFI_ERROR (Status); + } else { + CommSize = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE); + CommBuffer = AllocateZeroPool (CommSize); + if (CommBuffer == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + + SmmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)CommBuffer; + CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid); + SmmCommunicateHeader->MessageLength = SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE); + SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data; + + SmmVariableFunctionHeader->Function = SMM_VARIABLE_FUNCTION_GET_PAYLOAD_SIZE; + SmmGetPayloadSize = (SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE *)SmmVariableFunctionHeader->Data; + + // + // Send data to SMM. + // + Status = mMmCommunication2->Communicate (mMmCommunication2, CommBuffer, CommBuffer, &CommSize); + ASSERT_EFI_ERROR (Status); + } Status = SmmVariableFunctionHeader->ReturnStatus; if (EFI_ERROR (Status)) { @@ -1449,6 +1517,7 @@ GetRuntimeCacheInfo ( EFI_STATUS Status; SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO *SmmGetRuntimeCacheInfo; EFI_MM_COMMUNICATE_HEADER *SmmCommunicateHeader; + EFI_MM_COMMUNICATE_HEADER_V3 *SmmCommunicateHeaderV3; SMM_VARIABLE_COMMUNICATE_HEADER *SmmVariableFunctionHeader; UINTN CommSize; UINT8 *CommBuffer; @@ -1466,22 +1535,44 @@ GetRuntimeCacheInfo ( AcquireLockOnlyAtBootTime (&mVariableServicesLock); - CommSize = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO); - ZeroMem (CommBuffer, CommSize); + if (mMmCommunication3 != NULL) { + CommSize = SMM_COMMUNICATE_HEADER_SIZE_V3 + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO); + ZeroMem (CommBuffer, CommSize); - SmmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)CommBuffer; - CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid); - SmmCommunicateHeader->MessageLength = SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO); + SmmCommunicateHeaderV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)CommBuffer; + CopyGuid (&SmmCommunicateHeaderV3->HeaderGuid, &gEfiMmCommunicateHeaderV3Guid); + SmmCommunicateHeaderV3->BufferSize = mVariableBufferSize; + CopyGuid (&SmmCommunicateHeaderV3->MessageGuid, &gEfiSmmVariableProtocolGuid); + SmmCommunicateHeaderV3->MessageSize = SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO); - SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data; - SmmVariableFunctionHeader->Function = SMM_VARIABLE_FUNCTION_GET_RUNTIME_CACHE_INFO; - SmmGetRuntimeCacheInfo = (SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO *)SmmVariableFunctionHeader->Data; + SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeaderV3->MessageData; + SmmVariableFunctionHeader->Function = SMM_VARIABLE_FUNCTION_GET_RUNTIME_CACHE_INFO; + SmmGetRuntimeCacheInfo = (SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO *)SmmVariableFunctionHeader->Data; + + // + // Send data to SMM. + // + Status = mMmCommunication3->Communicate (mMmCommunication3, CommBuffer, CommBuffer); + ASSERT_EFI_ERROR (Status); + } else { + CommSize = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO); + ZeroMem (CommBuffer, CommSize); + + SmmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)CommBuffer; + CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid); + SmmCommunicateHeader->MessageLength = SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO); + + SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data; + SmmVariableFunctionHeader->Function = SMM_VARIABLE_FUNCTION_GET_RUNTIME_CACHE_INFO; + SmmGetRuntimeCacheInfo = (SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO *)SmmVariableFunctionHeader->Data; + + // + // Send data to SMM. + // + Status = mMmCommunication2->Communicate (mMmCommunication2, CommBuffer, CommBuffer, &CommSize); + ASSERT_EFI_ERROR (Status); + } - // - // Send data to SMM. - // - Status = mMmCommunication2->Communicate (mMmCommunication2, CommBuffer, CommBuffer, &CommSize); - ASSERT_EFI_ERROR (Status); if (CommSize <= SMM_VARIABLE_COMMUNICATE_HEADER_SIZE) { Status = EFI_BAD_BUFFER_SIZE; goto Done; @@ -1599,6 +1690,7 @@ SendRuntimeVariableCacheContextToSmm ( EFI_STATUS Status; SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT *SmmRuntimeVarCacheContext; EFI_MM_COMMUNICATE_HEADER *SmmCommunicateHeader; + EFI_MM_COMMUNICATE_HEADER_V3 *SmmCommunicateHeaderV3; SMM_VARIABLE_COMMUNICATE_HEADER *SmmVariableFunctionHeader; UINTN CommSize; UINT8 *CommBuffer; @@ -1612,33 +1704,66 @@ SendRuntimeVariableCacheContextToSmm ( AcquireLockOnlyAtBootTime (&mVariableServicesLock); - // - // Init the communicate buffer. The buffer data size is: - // SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT); - // - CommSize = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT); - ZeroMem (CommBuffer, CommSize); + if (mMmCommunication3 != NULL) { + // + // Init the communicate buffer. The buffer data size is: + // SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT); + // + CommSize = SMM_COMMUNICATE_HEADER_SIZE_V3 + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT); + ZeroMem (CommBuffer, CommSize); + + SmmCommunicateHeaderV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)CommBuffer; + CopyGuid (&SmmCommunicateHeaderV3->HeaderGuid, &gEfiMmCommunicateHeaderV3Guid); + SmmCommunicateHeaderV3->BufferSize = mVariableBufferSize; + CopyGuid (&SmmCommunicateHeaderV3->MessageGuid, &gEfiSmmVariableProtocolGuid); + SmmCommunicateHeaderV3->MessageSize = SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT); + + SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeaderV3->MessageData; + SmmVariableFunctionHeader->Function = SMM_VARIABLE_FUNCTION_INIT_RUNTIME_VARIABLE_CACHE_CONTEXT; + SmmRuntimeVarCacheContext = (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT *)SmmVariableFunctionHeader->Data; + + SmmRuntimeVarCacheContext->RuntimeHobCache = (VARIABLE_STORE_HEADER *)(UINTN)mVariableRtCacheInfo.RuntimeHobCacheBuffer; + SmmRuntimeVarCacheContext->RuntimeVolatileCache = (VARIABLE_STORE_HEADER *)(UINTN)mVariableRtCacheInfo.RuntimeVolatileCacheBuffer; + SmmRuntimeVarCacheContext->RuntimeNvCache = (VARIABLE_STORE_HEADER *)(UINTN)mVariableRtCacheInfo.RuntimeNvCacheBuffer; + SmmRuntimeVarCacheContext->PendingUpdate = &((CACHE_INFO_FLAG *)(UINTN)mVariableRtCacheInfo.CacheInfoFlagBuffer)->PendingUpdate; + SmmRuntimeVarCacheContext->ReadLock = &((CACHE_INFO_FLAG *)(UINTN)mVariableRtCacheInfo.CacheInfoFlagBuffer)->ReadLock; + SmmRuntimeVarCacheContext->HobFlushComplete = &((CACHE_INFO_FLAG *)(UINTN)mVariableRtCacheInfo.CacheInfoFlagBuffer)->HobFlushComplete; - SmmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)CommBuffer; - CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid); - SmmCommunicateHeader->MessageLength = SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT); + // + // Send data to SMM. + // + Status = mMmCommunication3->Communicate (mMmCommunication3, CommBuffer, CommBuffer); + ASSERT_EFI_ERROR (Status); + } else { + // + // Init the communicate buffer. The buffer data size is: + // SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT); + // + CommSize = SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT); + ZeroMem (CommBuffer, CommSize); - SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data; - SmmVariableFunctionHeader->Function = SMM_VARIABLE_FUNCTION_INIT_RUNTIME_VARIABLE_CACHE_CONTEXT; - SmmRuntimeVarCacheContext = (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT *)SmmVariableFunctionHeader->Data; + SmmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)CommBuffer; + CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid); + SmmCommunicateHeader->MessageLength = SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT); - SmmRuntimeVarCacheContext->RuntimeHobCache = (VARIABLE_STORE_HEADER *)(UINTN)mVariableRtCacheInfo.RuntimeHobCacheBuffer; - SmmRuntimeVarCacheContext->RuntimeVolatileCache = (VARIABLE_STORE_HEADER *)(UINTN)mVariableRtCacheInfo.RuntimeVolatileCacheBuffer; - SmmRuntimeVarCacheContext->RuntimeNvCache = (VARIABLE_STORE_HEADER *)(UINTN)mVariableRtCacheInfo.RuntimeNvCacheBuffer; - SmmRuntimeVarCacheContext->PendingUpdate = &((CACHE_INFO_FLAG *)(UINTN)mVariableRtCacheInfo.CacheInfoFlagBuffer)->PendingUpdate; - SmmRuntimeVarCacheContext->ReadLock = &((CACHE_INFO_FLAG *)(UINTN)mVariableRtCacheInfo.CacheInfoFlagBuffer)->ReadLock; - SmmRuntimeVarCacheContext->HobFlushComplete = &((CACHE_INFO_FLAG *)(UINTN)mVariableRtCacheInfo.CacheInfoFlagBuffer)->HobFlushComplete; + SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)SmmCommunicateHeader->Data; + SmmVariableFunctionHeader->Function = SMM_VARIABLE_FUNCTION_INIT_RUNTIME_VARIABLE_CACHE_CONTEXT; + SmmRuntimeVarCacheContext = (SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT *)SmmVariableFunctionHeader->Data; + + SmmRuntimeVarCacheContext->RuntimeHobCache = (VARIABLE_STORE_HEADER *)(UINTN)mVariableRtCacheInfo.RuntimeHobCacheBuffer; + SmmRuntimeVarCacheContext->RuntimeVolatileCache = (VARIABLE_STORE_HEADER *)(UINTN)mVariableRtCacheInfo.RuntimeVolatileCacheBuffer; + SmmRuntimeVarCacheContext->RuntimeNvCache = (VARIABLE_STORE_HEADER *)(UINTN)mVariableRtCacheInfo.RuntimeNvCacheBuffer; + SmmRuntimeVarCacheContext->PendingUpdate = &((CACHE_INFO_FLAG *)(UINTN)mVariableRtCacheInfo.CacheInfoFlagBuffer)->PendingUpdate; + SmmRuntimeVarCacheContext->ReadLock = &((CACHE_INFO_FLAG *)(UINTN)mVariableRtCacheInfo.CacheInfoFlagBuffer)->ReadLock; + SmmRuntimeVarCacheContext->HobFlushComplete = &((CACHE_INFO_FLAG *)(UINTN)mVariableRtCacheInfo.CacheInfoFlagBuffer)->HobFlushComplete; + + // + // Send data to SMM. + // + Status = mMmCommunication2->Communicate (mMmCommunication2, CommBuffer, CommBuffer, &CommSize); + ASSERT_EFI_ERROR (Status); + } - // - // Send data to SMM. - // - Status = mMmCommunication2->Communicate (mMmCommunication2, CommBuffer, CommBuffer, &CommSize); - ASSERT_EFI_ERROR (Status); if (CommSize <= SMM_VARIABLE_COMMUNICATE_HEADER_SIZE) { Status = EFI_BAD_BUFFER_SIZE; goto Done; @@ -1677,7 +1802,12 @@ SmmVariableReady ( return; } - Status = gBS->LocateProtocol (&gEfiMmCommunication2ProtocolGuid, NULL, (VOID **)&mMmCommunication2); + Status = gBS->LocateProtocol (&gEfiMmCommunication3ProtocolGuid, NULL, (VOID **)&mMmCommunication3); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, "Unable to locate MM communication v3 (%r). Falling back to v2\n", Status)); + Status = gBS->LocateProtocol (&gEfiMmCommunication2ProtocolGuid, NULL, (VOID **)&mMmCommunication2); + } + ASSERT_EFI_ERROR (Status); // diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf index d984a3637de7..af8a32a7540e 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf @@ -66,6 +66,7 @@ gEfiVariableWriteArchProtocolGuid ## PRODUCES gEfiVariableArchProtocolGuid ## PRODUCES gEfiMmCommunication2ProtocolGuid ## CONSUMES + gEfiMmCommunication3ProtocolGuid ## CONSUMES ## CONSUMES ## NOTIFY ## UNDEFINED # Used to do smm communication @@ -113,9 +114,10 @@ gEfiEndOfDxeEventGroupGuid gEfiDeviceSignatureDatabaseGuid gEdkiiVariableRuntimeCacheInfoHobGuid + gEfiMmCommunicateHeaderV3Guid [Depex] - gEfiMmCommunication2ProtocolGuid + gEfiMmCommunication2ProtocolGuid OR gEfiMmCommunication3ProtocolGuid [UserExtensions.TianoCore."ExtraFiles"] VariableSmmRuntimeDxeExtra.uni From 51d273d8c3dbc36f25f3d2af27bef6e01604d90c Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Wed, 14 May 2025 13:22:39 -0700 Subject: [PATCH 0139/1172] MdeModulePkg: MmVariablePei: Use MM communicate v3 As the MM cores begin to support MM Communicate v3, this update moves the driver to communicate to MM agent through MM Communicate v3 PPI. Signed-off-by: Kun Qin --- .../Variable/MmVariablePei/MmVariablePei.c | 69 +++++++++++++++---- .../Variable/MmVariablePei/MmVariablePei.h | 1 + .../Variable/MmVariablePei/MmVariablePei.inf | 8 ++- 3 files changed, 61 insertions(+), 17 deletions(-) diff --git a/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.c b/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.c index 4f937e22e89e..eac1da50ca87 100644 --- a/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.c +++ b/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.c @@ -66,7 +66,9 @@ PopulateHeaderAndCommunicate ( { EFI_STATUS Status; EFI_PEI_MM_COMMUNICATION_PPI *MmCommunicationPpi; + EFI_PEI_MM_COMMUNICATION3_PPI *MmCommunicationPpiV3; EFI_MM_COMMUNICATE_HEADER *MmCommunicateHeader; + EFI_MM_COMMUNICATE_HEADER_V3 *MmCommunicateHeaderV3; SMM_VARIABLE_COMMUNICATE_HEADER *MmVarCommsHeader; // Minimal sanity check @@ -86,30 +88,67 @@ PopulateHeaderAndCommunicate ( goto Exit; } - Status = PeiServicesLocatePpi (&gEfiPeiMmCommunicationPpiGuid, 0, NULL, (VOID **)&MmCommunicationPpi); + MmCommunicationPpiV3 = NULL; + MmCommunicationPpi = NULL; + + Status = PeiServicesLocatePpi (&gEfiPeiMmCommunication3PpiGuid, 0, NULL, (VOID **)&MmCommunicationPpiV3); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "%a: Failed to locate PEI MM Communication PPI: %r\n", __func__, Status)); - goto Exit; + DEBUG ((DEBUG_WARN, "%a: Unable to locate PEI MM Communication3 PPI: %r\n", __func__, Status)); + // Try to locate the older version of the PPI + Status = PeiServicesLocatePpi (&gEfiPeiMmCommunicationPpiGuid, 0, NULL, (VOID **)&MmCommunicationPpi); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to locate PEI MM Communication PPI: %r\n", __func__, Status)); + goto Exit; + } } - // Zero the entire Communication Buffer Header - MmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)CommunicateBuffer; + if (MmCommunicationPpiV3 != NULL) { + // Zero the entire Communication Buffer Header + MmCommunicateHeaderV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)CommunicateBuffer; - ZeroMem (MmCommunicateHeader, SMM_COMMUNICATE_HEADER_SIZE); + ZeroMem (MmCommunicateHeaderV3, SMM_COMMUNICATE_HEADER_SIZE_V3); - // Use gEfiSmmVariableProtocolGuid to request the MM variable service in Standalone MM - CopyMem ((VOID *)&MmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid, sizeof (GUID)); + // Use gEfiSmmVariableProtocolGuid to request the MM variable service in Standalone MM + CopyMem ((VOID *)&MmCommunicateHeaderV3->HeaderGuid, &gEfiMmCommunicateHeaderV3Guid, sizeof (GUID)); + MmCommunicateHeaderV3->BufferSize = CommunicateBufferSize; - // Program the MM header size - MmCommunicateHeader->MessageLength = CommunicateBufferSize - SMM_COMMUNICATE_HEADER_SIZE; + CopyMem ((VOID *)&MmCommunicateHeaderV3->MessageGuid, &gEfiSmmVariableProtocolGuid, sizeof (GUID)); - MmVarCommsHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)(CommunicateBuffer + SMM_COMMUNICATE_HEADER_SIZE); + // Program the MM header size + MmCommunicateHeaderV3->MessageSize = CommunicateBufferSize - SMM_COMMUNICATE_HEADER_SIZE_V3; - // We are only supporting GetVariable and GetNextVariableName - MmVarCommsHeader->Function = Function; + MmVarCommsHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)(MmCommunicateHeaderV3->MessageData); + + // We are only supporting GetVariable and GetNextVariableName + MmVarCommsHeader->Function = Function; + + // Send the MM request using MmCommunicationPei + Status = MmCommunicationPpiV3->Communicate (MmCommunicationPpiV3, CommunicateBuffer); + } else if (MmCommunicationPpi != NULL) { + // Zero the entire Communication Buffer Header + MmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)CommunicateBuffer; + + ZeroMem (MmCommunicateHeader, SMM_COMMUNICATE_HEADER_SIZE); + + // Use gEfiSmmVariableProtocolGuid to request the MM variable service in Standalone MM + CopyMem ((VOID *)&MmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid, sizeof (GUID)); + + // Program the MM header size + MmCommunicateHeader->MessageLength = CommunicateBufferSize - SMM_COMMUNICATE_HEADER_SIZE; + + MmVarCommsHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)(CommunicateBuffer + SMM_COMMUNICATE_HEADER_SIZE); + + // We are only supporting GetVariable and GetNextVariableName + MmVarCommsHeader->Function = Function; + + // Send the MM request using MmCommunicationPei + Status = MmCommunicationPpi->Communicate (MmCommunicationPpi, CommunicateBuffer, &CommunicateBufferSize); + } else { + // We should never reach here, but just in case + Status = EFI_UNSUPPORTED; + DEBUG ((DEBUG_ERROR, "%a: No MM Communication PPI found!\n", __func__)); + } - // Send the MM request using MmCommunicationPei - Status = MmCommunicationPpi->Communicate (MmCommunicationPpi, CommunicateBuffer, &CommunicateBufferSize); if (EFI_ERROR (Status)) { // Received an error from MM interface. DEBUG ((DEBUG_ERROR, "%a - MM Interface Error: %r\n", __func__, Status)); diff --git a/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.h b/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.h index 0feed8cd1cb6..0b3832945f0a 100644 --- a/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.h +++ b/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.h @@ -23,6 +23,7 @@ #include #include +#include #include #include diff --git a/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.inf b/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.inf index 13e80523f960..1f972db0d952 100644 --- a/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.inf +++ b/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.inf @@ -34,7 +34,11 @@ [Ppis] gEfiPeiReadOnlyVariable2PpiGuid ## PRODUCES - gEfiPeiMmCommunicationPpiGuid ## CONSUMES + gEfiPeiMmCommunication3PpiGuid ## CONSUMES + gEfiPeiMmCommunicationPpiGuid ## SOMETIMES_CONSUMES + +[Guids] + gEfiMmCommunicateHeaderV3Guid [Depex] - gEfiPeiMmCommunicationPpiGuid + gEfiPeiMmCommunicationPpiGuid OR gEfiPeiMmCommunication3PpiGuid From d165ebcf4363dcdb9164d4d2eed410d01aaa1f30 Mon Sep 17 00:00:00 2001 From: Wenbo Hou Date: Fri, 23 May 2025 23:54:58 +0800 Subject: [PATCH 0140/1172] MdeModulePkg/FaultTolerantWriteDxe: Add validation for FtwWorkSpaceHeader Add validation for FtwWorkSpaceHeader within the WorkSpaceRefresh() function to address an issue where the variable store cannot recover from the FTW spare block if the variable store is erased or corrupted during an FTW write or reclaim operation. Signed-off-by: Wenbo Hou --- MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c | 5 ++++- .../Universal/FaultTolerantWriteDxe/UpdateWorkingBlock.c | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c index d442ccb52fc4..5c168c8751dc 100644 --- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c +++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c @@ -1300,7 +1300,10 @@ InitFtwProtocol ( // Refresh the working space data from working block // Status = WorkSpaceRefresh (FtwDevice); - ASSERT_EFI_ERROR (Status); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Ftw: Init.. WorkSpaceRefresh failed: Status = %r\n", Status)); + } + // // If the working block workspace is not valid, try the spare block // diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/UpdateWorkingBlock.c b/MdeModulePkg/Universal/FaultTolerantWriteDxe/UpdateWorkingBlock.c index fd563643eb63..caa87e95d529 100644 --- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/UpdateWorkingBlock.c +++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/UpdateWorkingBlock.c @@ -286,6 +286,10 @@ WorkSpaceRefresh ( return EFI_ABORTED; } + if (!IsValidWorkSpace (FtwDevice->FtwWorkSpaceHeader)) { + return EFI_ABORTED; + } + // // Refresh the FtwLastWriteHeader // From f54fe78d9a1a760bdfd50131221cb93916ce5865 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 30 Apr 2025 12:57:01 +0200 Subject: [PATCH 0141/1172] BaseTools: Remove unused import Running the vulture tool gave the following report. Remove the unused import. - BPDG/BPDG.py:21: unused import 'encodings' (90% confidence) - build/build.py:61: unused import 'Manager' (90% confidence) - Ecc/CParser4/CLexer.py:4: unused import 'TextIO' (90% confidence) - Ecc/CParser4/CParser.py:5: unused import 'TextIO' (90% confidence) - Eot/CParser4/CLexer.py:4: unused import 'TextIO' (90% confidence) - Eot/CParser4/CParser.py:5: unused import 'TextIO' (90% confidence) - Eot/EotMain.py:28: unused import 'ConvertGuid' (90% confidence) - GenFds/FdfParser.py:16: unused import 'hexdigits' (90% confidence) - Table/TableEotReport.py:16: unused import 'EotToolError' (90% confidence) - UPT/Library/CommentGenerating.py:19: unused import 'USAGE_ITEM_NOTIFY' (90% confidence) - UPT/Library/ParserValidate.py:18: unused import 'COMPONENT_TYPE_LIST' (90% confidence) - UPT/Library/UniClassObject.py:25: unused import 'CheckUTF16FileHeader' (90% confidence) Signed-off-by: Pierre Gondois --- BaseTools/Source/Python/BPDG/BPDG.py | 1 - BaseTools/Source/Python/Ecc/CParser4/CLexer.py | 1 - BaseTools/Source/Python/Ecc/CParser4/CParser.py | 1 - BaseTools/Source/Python/Eot/CParser4/CLexer.py | 1 - BaseTools/Source/Python/Eot/CParser4/CParser.py | 1 - BaseTools/Source/Python/Eot/EotMain.py | 1 - BaseTools/Source/Python/GenFds/FdfParser.py | 1 - BaseTools/Source/Python/Table/TableEotReport.py | 1 - BaseTools/Source/Python/UPT/Library/CommentGenerating.py | 1 - BaseTools/Source/Python/UPT/Library/ParserValidate.py | 1 - BaseTools/Source/Python/UPT/Library/UniClassObject.py | 1 - BaseTools/Source/Python/build/build.py | 1 - 12 files changed, 12 deletions(-) diff --git a/BaseTools/Source/Python/BPDG/BPDG.py b/BaseTools/Source/Python/BPDG/BPDG.py index 283e08a37a0f..86f773cbf04f 100644 --- a/BaseTools/Source/Python/BPDG/BPDG.py +++ b/BaseTools/Source/Python/BPDG/BPDG.py @@ -18,7 +18,6 @@ from __future__ import absolute_import import Common.LongFilePathOs as os import sys -import encodings.ascii from optparse import OptionParser from Common import EdkLogger diff --git a/BaseTools/Source/Python/Ecc/CParser4/CLexer.py b/BaseTools/Source/Python/Ecc/CParser4/CLexer.py index 888d685432d4..f0c6e66f0df5 100644 --- a/BaseTools/Source/Python/Ecc/CParser4/CLexer.py +++ b/BaseTools/Source/Python/Ecc/CParser4/CLexer.py @@ -1,7 +1,6 @@ # Generated from C.g4 by ANTLR 4.7.1 from antlr4 import * from io import StringIO -from typing import TextIO import sys diff --git a/BaseTools/Source/Python/Ecc/CParser4/CParser.py b/BaseTools/Source/Python/Ecc/CParser4/CParser.py index 4d88238abee4..3946497f816b 100644 --- a/BaseTools/Source/Python/Ecc/CParser4/CParser.py +++ b/BaseTools/Source/Python/Ecc/CParser4/CParser.py @@ -2,7 +2,6 @@ # encoding: utf-8 from antlr4 import * from io import StringIO -from typing import TextIO import sys diff --git a/BaseTools/Source/Python/Eot/CParser4/CLexer.py b/BaseTools/Source/Python/Eot/CParser4/CLexer.py index b370c706e41c..6666664d6bb8 100644 --- a/BaseTools/Source/Python/Eot/CParser4/CLexer.py +++ b/BaseTools/Source/Python/Eot/CParser4/CLexer.py @@ -1,7 +1,6 @@ # Generated from C.g4 by ANTLR 4.7.1 from antlr4 import * from io import StringIO -from typing import TextIO import sys diff --git a/BaseTools/Source/Python/Eot/CParser4/CParser.py b/BaseTools/Source/Python/Eot/CParser4/CParser.py index 4d88238abee4..3946497f816b 100644 --- a/BaseTools/Source/Python/Eot/CParser4/CParser.py +++ b/BaseTools/Source/Python/Eot/CParser4/CParser.py @@ -2,7 +2,6 @@ # encoding: utf-8 from antlr4 import * from io import StringIO -from typing import TextIO import sys diff --git a/BaseTools/Source/Python/Eot/EotMain.py b/BaseTools/Source/Python/Eot/EotMain.py index 791fcdfeaed8..a5063782883d 100644 --- a/BaseTools/Source/Python/Eot/EotMain.py +++ b/BaseTools/Source/Python/Eot/EotMain.py @@ -25,7 +25,6 @@ from array import array from Eot.Report import Report from Common.BuildVersion import gBUILD_VERSION -from Eot.Parser import ConvertGuid from Common.LongFilePathSupport import OpenLongFilePath as open import struct import uuid diff --git a/BaseTools/Source/Python/GenFds/FdfParser.py b/BaseTools/Source/Python/GenFds/FdfParser.py index feb4c727794f..c821494d0d82 100644 --- a/BaseTools/Source/Python/GenFds/FdfParser.py +++ b/BaseTools/Source/Python/GenFds/FdfParser.py @@ -13,7 +13,6 @@ from __future__ import print_function from __future__ import absolute_import from re import compile, DOTALL -from string import hexdigits from uuid import UUID from Common.BuildToolError import * diff --git a/BaseTools/Source/Python/Table/TableEotReport.py b/BaseTools/Source/Python/Table/TableEotReport.py index 72bc11f6dbc2..abd433ec8ef1 100644 --- a/BaseTools/Source/Python/Table/TableEotReport.py +++ b/BaseTools/Source/Python/Table/TableEotReport.py @@ -13,7 +13,6 @@ import Common.LongFilePathOs as os, time from Table.Table import Table from Common.StringUtils import ConvertToSqlString2 -import Eot.EotToolError as EotToolError import Eot.EotGlobalData as EotGlobalData ## TableReport diff --git a/BaseTools/Source/Python/UPT/Library/CommentGenerating.py b/BaseTools/Source/Python/UPT/Library/CommentGenerating.py index bded508f565a..4c50adac6e50 100644 --- a/BaseTools/Source/Python/UPT/Library/CommentGenerating.py +++ b/BaseTools/Source/Python/UPT/Library/CommentGenerating.py @@ -16,7 +16,6 @@ from Library.StringUtils import GetSplitValueList from Library.DataType import TAB_SPACE_SPLIT from Library.DataType import TAB_INF_GUIDTYPE_VAR -from Library.DataType import USAGE_ITEM_NOTIFY from Library.DataType import ITEM_UNDEFINED from Library.DataType import TAB_HEADER_COMMENT from Library.DataType import TAB_BINARY_HEADER_COMMENT diff --git a/BaseTools/Source/Python/UPT/Library/ParserValidate.py b/BaseTools/Source/Python/UPT/Library/ParserValidate.py index 62f406141cc6..edb0c6275aef 100644 --- a/BaseTools/Source/Python/UPT/Library/ParserValidate.py +++ b/BaseTools/Source/Python/UPT/Library/ParserValidate.py @@ -15,7 +15,6 @@ import platform from Library.DataType import MODULE_LIST -from Library.DataType import COMPONENT_TYPE_LIST from Library.DataType import PCD_USAGE_TYPE_LIST_OF_MODULE from Library.DataType import TAB_SPACE_SPLIT from Library.StringUtils import GetSplitValueList diff --git a/BaseTools/Source/Python/UPT/Library/UniClassObject.py b/BaseTools/Source/Python/UPT/Library/UniClassObject.py index 8c44dc225277..381f978cfeb3 100644 --- a/BaseTools/Source/Python/UPT/Library/UniClassObject.py +++ b/BaseTools/Source/Python/UPT/Library/UniClassObject.py @@ -22,7 +22,6 @@ from Library.Misc import PathClass from Library.Misc import GetCharIndexOutStr from Library import DataType as DT -from Library.ParserValidate import CheckUTF16FileHeader ## # Static definitions diff --git a/BaseTools/Source/Python/build/build.py b/BaseTools/Source/Python/build/build.py index f471aea172ae..a78d4e95013a 100755 --- a/BaseTools/Source/Python/build/build.py +++ b/BaseTools/Source/Python/build/build.py @@ -58,7 +58,6 @@ import Common.GlobalData as GlobalData from GenFds.GenFds import GenFds, GenFdsApi import multiprocessing as mp -from multiprocessing import Manager from AutoGen.DataPipe import MemoryDataPipe from AutoGen.ModuleAutoGenHelper import WorkSpaceInfo, PlatformInfo from GenFds.FdfParser import FdfParser From c169a5420b25f6e95e1ca8223051aade870f0d03 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 30 Apr 2025 10:06:21 +0200 Subject: [PATCH 0142/1172] BaseTools: Remove unreachable code Running the vulture tool gave the following report. Remove the unreachable code. - TargetTool/TargetTool.py:49: unreachable code after 'raise' (100% confidence) - UPT/Library/UniClassObject.py:137: unreachable code after 'return' (100% confidence) - UPT/Object/Parser/InfDefineObject.py:795: unreachable code after 'if' (100% confidence) - Ecc/Check.py:1504: unreachable code after 'return' (100% confidence) Signed-off-by: Pierre Gondois --- BaseTools/Source/Python/Ecc/Check.py | 1 - .../Source/Python/TargetTool/TargetTool.py | 1 - .../Python/UPT/Library/UniClassObject.py | 34 ------------------- .../UPT/Object/Parser/InfDefineObject.py | 1 - 4 files changed, 37 deletions(-) diff --git a/BaseTools/Source/Python/Ecc/Check.py b/BaseTools/Source/Python/Ecc/Check.py index 160e803764fe..c31ee703a7de 100644 --- a/BaseTools/Source/Python/Ecc/Check.py +++ b/BaseTools/Source/Python/Ecc/Check.py @@ -1501,7 +1501,6 @@ def FindPara(FilePath, Para, CallingLine): if Line.startswith('%s = ' % Para): Line = Line.strip() return Line - break return '' diff --git a/BaseTools/Source/Python/TargetTool/TargetTool.py b/BaseTools/Source/Python/TargetTool/TargetTool.py index 7f2479f0f0ac..8b344251fb6b 100644 --- a/BaseTools/Source/Python/TargetTool/TargetTool.py +++ b/BaseTools/Source/Python/TargetTool/TargetTool.py @@ -46,7 +46,6 @@ def LoadTargetTxtFile(self, filename): return self.ConvertTextFileToDict(filename, '#', '=') else: raise ParseError('LoadTargetTxtFile() : No Target.txt file exists.') - return 1 # # Convert a text file to a dictionary diff --git a/BaseTools/Source/Python/UPT/Library/UniClassObject.py b/BaseTools/Source/Python/UPT/Library/UniClassObject.py index 381f978cfeb3..80924a6f2a9e 100644 --- a/BaseTools/Source/Python/UPT/Library/UniClassObject.py +++ b/BaseTools/Source/Python/UPT/Library/UniClassObject.py @@ -133,40 +133,6 @@ def ConvertSpecialUnicodes(Uni): def GetLanguageCode1766(LangName, File=None): return LangName - length = len(LangName) - if length == 2: - if LangName.isalpha(): - for Key in gLANG_CONV_TABLE.keys(): - if gLANG_CONV_TABLE.get(Key) == LangName.lower(): - return Key - elif length == 3: - if LangName.isalpha() and gLANG_CONV_TABLE.get(LangName.lower()): - return LangName - else: - EdkLogger.Error("Unicode File Parser", - ToolError.FORMAT_INVALID, - "Invalid RFC 1766 language code : %s" % LangName, - File) - elif length == 5: - if LangName[0:2].isalpha() and LangName[2] == '-': - for Key in gLANG_CONV_TABLE.keys(): - if gLANG_CONV_TABLE.get(Key) == LangName[0:2].lower(): - return Key - elif length >= 6: - if LangName[0:2].isalpha() and LangName[2] == '-': - for Key in gLANG_CONV_TABLE.keys(): - if gLANG_CONV_TABLE.get(Key) == LangName[0:2].lower(): - return Key - if LangName[0:3].isalpha() and gLANG_CONV_TABLE.get(LangName.lower()) is None and LangName[3] == '-': - for Key in gLANG_CONV_TABLE.keys(): - if Key == LangName[0:3].lower(): - return Key - - EdkLogger.Error("Unicode File Parser", - ToolError.FORMAT_INVALID, - "Invalid RFC 4646 language code : %s" % LangName, - File) - ## GetLanguageCode # # Check the language code read from .UNI file and convert RFC 1766 codes to RFC 4646 codes if appropriate diff --git a/BaseTools/Source/Python/UPT/Object/Parser/InfDefineObject.py b/BaseTools/Source/Python/UPT/Object/Parser/InfDefineObject.py index a1b691ff0300..fda1fc9664a3 100644 --- a/BaseTools/Source/Python/UPT/Object/Parser/InfDefineObject.py +++ b/BaseTools/Source/Python/UPT/Object/Parser/InfDefineObject.py @@ -792,7 +792,6 @@ def SetSpecification(self, Specification, Comments): ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Name), LineInfo=self.CurrentLine) return False - return True def GetSpecification(self): return self.Specification From f79717aac2345568f46d69e125972342850ebd1e Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 30 Apr 2025 14:29:25 +0200 Subject: [PATCH 0143/1172] BaseTools: AutoGen: Remove unnecessary code Running the vulture tool on the AutoGen folder gave the following report. Remove the unnecessary code. - AutoGen/BuildEngine.py:333: unused attribute 'SupportedToolChainFamilyList' (60% confidence) - AutoGen/BuildEngine.py:346: unused attribute '_RuleObjectList' (60% confidence) - AutoGen/GenMake.py:450: unused attribute 'FileBuildTargetList' (60% confidence) - AutoGen/GenMake.py:452: unused attribute 'PendingBuildTargetList' (60% confidence) - AutoGen/GenMake.py:458: unused attribute 'LibraryBuildCommandList' (60% confidence) - AutoGen/GenMake.py:459: unused attribute 'LibraryFileList' (60% confidence) - AutoGen/GenMake.py:462: unused attribute 'SystemLibraryList' (60% confidence) - AutoGen/GenMake.py:1168: unused method 'GetFileDependency' (60% confidence) - AutoGen/GenMake.py:1466: unused attribute 'ModuleBuildCommandList' (60% confidence) - AutoGen/GenPcdDb.py:442: unused class 'DbSkuHeadTableItemList' (60% confidence) - AutoGen/GenVar.py:31: unused attribute 'VpdRegionOffset' (60% confidence) - AutoGen/GenVar.py:43: unused attribute 'VpdRegionOffset' (60% confidence) - AutoGen/ModuleAutoGen.py:257: unused attribute 'FileDependCache' (60% confidence) - AutoGen/ModuleAutoGen.py:684: unused method 'BuildOptionIncPathList' (60% confidence) - AutoGen/PlatformAutoGen.py:994: unused method 'EdkBuildOption' (60% confidence) - AutoGen/UniClassObject.py:171: unused attribute 'StringNameByteList' (60% confidence) - AutoGen/UniClassObject.py:181: unused attribute 'StringNameByteList' (60% confidence) - AutoGen/UniClassObject.py:366: unused method 'GetIncludeFile' (60% confidence) - AutoGen/UniClassObject.py:606: unused method 'FindStringValue' (60% confidence) - AutoGen/UniClassObject.py:616: unused method 'FindByToken' (60% confidence) - AutoGen/ValidCheckingInfoObject.py:228: unused attribute 'ValidData' (60% confidence) - AutoGen/ValidCheckingInfoObject.py:231: unused attribute 'ValidData' (60% confidence) Signed-off-by: Pierre Gondois --- .../Source/Python/AutoGen/BuildEngine.py | 2 - BaseTools/Source/Python/AutoGen/GenMake.py | 21 --------- BaseTools/Source/Python/AutoGen/GenPcdDb.py | 17 ------- BaseTools/Source/Python/AutoGen/GenVar.py | 4 -- .../Source/Python/AutoGen/ModuleAutoGen.py | 45 ------------------- .../Source/Python/AutoGen/PlatformAutoGen.py | 6 --- .../Source/Python/AutoGen/UniClassObject.py | 29 ------------ .../Python/AutoGen/ValidCheckingInfoObject.py | 2 - 8 files changed, 126 deletions(-) diff --git a/BaseTools/Source/Python/AutoGen/BuildEngine.py b/BaseTools/Source/Python/AutoGen/BuildEngine.py index 45b39d7878d5..b829a2503cfa 100644 --- a/BaseTools/Source/Python/AutoGen/BuildEngine.py +++ b/BaseTools/Source/Python/AutoGen/BuildEngine.py @@ -330,7 +330,6 @@ def __init__(self, File=None, Content=None, LineIndex=0, SupportedFamily=[TAB_CO else: EdkLogger.error("build", PARAMETER_MISSING, ExtraData="No rule file or string given") - self.SupportedToolChainFamilyList = SupportedFamily self.RuleDatabase = tdict(True, 4) # {FileExt, ModuleType, Arch, Family : FileBuildRule object} self.Ext2FileType = {} # {ext : file-type} self.FileTypeList = set() @@ -343,7 +342,6 @@ def __init__(self, File=None, Content=None, LineIndex=0, SupportedFamily=[TAB_CO self._ArchList = set() self._FamilyList = [] self._TotalToolChainFamilySet = set() - self._RuleObjectList = [] # FileBuildRule object list self._FileVersion = "" self.Parse() diff --git a/BaseTools/Source/Python/AutoGen/GenMake.py b/BaseTools/Source/Python/AutoGen/GenMake.py index 547c708fc7c3..e5f282c4acce 100755 --- a/BaseTools/Source/Python/AutoGen/GenMake.py +++ b/BaseTools/Source/Python/AutoGen/GenMake.py @@ -447,19 +447,14 @@ def __init__(self, ModuleAutoGen): self.ResultFileList = [] self.IntermediateDirectoryList = ["$(DEBUG_DIR)", "$(OUTPUT_DIR)"] - self.FileBuildTargetList = [] # [(src, target string)] self.BuildTargetList = [] # [target string] - self.PendingBuildTargetList = [] # [FileBuildRule objects] self.CommonFileDependency = [] self.FileListMacros = {} self.ListFileMacros = {} self.ObjTargetDict = OrderedDict() self.FileCache = {} - self.LibraryBuildCommandList = [] - self.LibraryFileList = [] self.LibraryMakefileList = [] self.LibraryBuildDirectoryList = [] - self.SystemLibraryList = [] self.Macros = OrderedDict() self.Macros["OUTPUT_DIR" ] = self._AutoGenObject.Macros["OUTPUT_DIR"] self.Macros["DEBUG_DIR" ] = self._AutoGenObject.Macros["DEBUG_DIR"] @@ -1157,21 +1152,6 @@ def ProcessDependentLibrary(self): if not LibraryAutoGen.IsBinaryModule: self.LibraryBuildDirectoryList.append(self.PlaceMacro(LibraryAutoGen.BuildDir, self.Macros)) - ## Return a list containing source file's dependencies - # - # @param FileList The list of source files - # @param ForceInculeList The list of files which will be included forcely - # @param SearchPathList The list of search path - # - # @retval dict The mapping between source file path and its dependencies - # - def GetFileDependency(self, FileList, ForceInculeList, SearchPathList): - Dependency = {} - for F in FileList: - Dependency[F] = GetDependencyList(self._AutoGenObject, self.FileCache, F, ForceInculeList, SearchPathList) - return Dependency - - ## CustomMakefile class # # This class encapsules makefie and its generation for module. It uses template to generate @@ -1463,7 +1443,6 @@ class PlatformMakefile(BuildFile): # def __init__(self, PlatformAutoGen): BuildFile.__init__(self, PlatformAutoGen) - self.ModuleBuildCommandList = [] self.ModuleMakefileList = [] self.IntermediateDirectoryList = [] self.ModuleBuildDirectoryList = [] diff --git a/BaseTools/Source/Python/AutoGen/GenPcdDb.py b/BaseTools/Source/Python/AutoGen/GenPcdDb.py index ad5dae0e5a2f..28df647bfe4e 100644 --- a/BaseTools/Source/Python/AutoGen/GenPcdDb.py +++ b/BaseTools/Source/Python/AutoGen/GenPcdDb.py @@ -435,23 +435,6 @@ def GetListSize(self): self.ListSize += self.ItemSize return self.ListSize -## DbSkuHeadTableItemList -# -# The class holds the Sku header value table -# -class DbSkuHeadTableItemList (DbItemList): - def __init__(self, ItemSize, DataList=None, RawDataList=None): - DbItemList.__init__(self, ItemSize, DataList, RawDataList) - - def PackData(self): - PackStr = "=LL" - Buffer = bytearray() - for Data in self.RawDataList: - Buffer += pack(PackStr, - GetIntegerValue(Data[0]), - GetIntegerValue(Data[1])) - return Buffer - ## DbSizeTableItemList # # The class holds the size table diff --git a/BaseTools/Source/Python/AutoGen/GenVar.py b/BaseTools/Source/Python/AutoGen/GenVar.py index f2ad54ba630e..54d786438077 100644 --- a/BaseTools/Source/Python/AutoGen/GenVar.py +++ b/BaseTools/Source/Python/AutoGen/GenVar.py @@ -28,7 +28,6 @@ def __init__(self, DefaultStoreMap, SkuIdMap): self.DefaultStoreMap = DefaultStoreMap self.SkuIdMap = SkuIdMap self.VpdRegionSize = 0 - self.VpdRegionOffset = 0 self.NVHeaderBuff = None self.VarDefaultBuff = None self.VarDeltaBuff = None @@ -39,9 +38,6 @@ def append_variable(self, uefi_var): def SetVpdRegionMaxSize(self, maxsize): self.VpdRegionSize = maxsize - def SetVpdRegionOffset(self, vpdoffset): - self.VpdRegionOffset = vpdoffset - def PatchNVStoreDefaultMaxSize(self, maxsize): if not self.NVHeaderBuff: return "" diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py index 65a2176ca982..aa0b71632e8e 100755 --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py @@ -254,7 +254,6 @@ def _InitWorker(self, Workspace, ModuleFile, Target, Toolchain, Arch, PlatformFi self.AutoGenDepSet = set() self.ReferenceModules = [] self.ConstPcd = {} - self.FileDependCache = {} def __init_platform_info__(self): pinfo = self.DataPipe.Get("P_Info") @@ -677,50 +676,6 @@ def BuildOption(self): self.BuildRuleOrder = ['.%s' % Ext for Ext in self.BuildRuleOrder.split()] return RetVal - ## Get include path list from tool option for the module build - # - # @retval list The include path list - # - @cached_property - def BuildOptionIncPathList(self): - # - # Regular expression for finding Include Directories, the difference between MSFT and INTEL/GCC - # is the former use /I , the Latter used -I to specify include directories - # - if self.PlatformInfo.ToolChainFamily in (TAB_COMPILER_MSFT): - BuildOptIncludeRegEx = gBuildOptIncludePatternMsft - elif self.PlatformInfo.ToolChainFamily in ('INTEL', 'GCC'): - BuildOptIncludeRegEx = gBuildOptIncludePatternOther - else: - # - # New ToolChainFamily, don't known whether there is option to specify include directories - # - return [] - - RetVal = [] - for Tool in ('CC', 'PP', 'VFRPP', 'ASLPP', 'ASLCC', 'APP', 'ASM'): - try: - FlagOption = self.BuildOption[Tool]['FLAGS'] - except KeyError: - FlagOption = '' - - IncPathList = [NormPath(Path, self.Macros) for Path in BuildOptIncludeRegEx.findall(FlagOption)] - - # - # EDK II modules must not reference header files outside of the packages they depend on or - # within the module's directory tree. Report error if violation. - # - if GlobalData.gDisableIncludePathCheck == False: - for Path in IncPathList: - if (Path not in self.IncludePathList) and (CommonPath([Path, self.MetaFile.Dir]) != self.MetaFile.Dir): - ErrMsg = "The include directory for the EDK II module in this line is invalid %s specified in %s FLAGS '%s'" % (Path, Tool, FlagOption) - EdkLogger.error("build", - PARAMETER_INVALID, - ExtraData=ErrMsg, - File=str(self.MetaFile)) - RetVal += IncPathList - return RetVal - ## Return a list of files which can be built from source # # What kind of files can be built is determined by build rules in diff --git a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py index e80203dce22e..68b9d89062b8 100644 --- a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py +++ b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py @@ -251,7 +251,6 @@ def CollectVariables(self, DynamicPcdSet): VariableInfo = VariableMgr(self.DscBuildDataObj._GetDefaultStores(), self.DscBuildDataObj.SkuIds) VariableInfo.SetVpdRegionMaxSize(VpdRegionSize) - VariableInfo.SetVpdRegionOffset(VpdRegionBase) Index = 0 for Pcd in sorted(DynamicPcdSet): pcdname = ".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName)) @@ -990,11 +989,6 @@ def BuildOption(self): def _BuildOptionWithToolDef(self, ToolDef): return self._ExpandBuildOption(self.Platform.BuildOptions, ToolDef=ToolDef) - ## Return the build options specific for EDK modules in this platform - @cached_property - def EdkBuildOption(self): - return self._ExpandBuildOption(self.Platform.BuildOptions, EDK_NAME) - ## Return the build options specific for EDKII modules in this platform @cached_property def EdkIIBuildOption(self): diff --git a/BaseTools/Source/Python/AutoGen/UniClassObject.py b/BaseTools/Source/Python/AutoGen/UniClassObject.py index b16330e36825..6d62fa00c433 100644 --- a/BaseTools/Source/Python/AutoGen/UniClassObject.py +++ b/BaseTools/Source/Python/AutoGen/UniClassObject.py @@ -168,7 +168,6 @@ def Ucs2Search(name): class StringDefClassObject(object): def __init__(self, Name = None, Value = None, Referenced = False, Token = None, UseOtherLangDef = ''): self.StringName = '' - self.StringNameByteList = [] self.StringValue = '' self.StringValueByteList = '' self.Token = 0 @@ -178,7 +177,6 @@ def __init__(self, Name = None, Value = None, Referenced = False, Token = None, if Name is not None: self.StringName = Name - self.StringNameByteList = UniToHexList(Name) if Value is not None: self.StringValue = Value + u'\x00' # Add a NULL at string tail self.StringValueByteList = UniToHexList(self.StringValue) @@ -360,13 +358,6 @@ def GetStringObject(self, Item): Language = GetLanguageCode(Language, self.IsCompatibleMode, self.File) self.AddStringToList(Name, Language, Value) - # - # Get include file list and load them - # - def GetIncludeFile(self, Item, Dir): - FileName = Item[Item.find(u'#include ') + len(u'#include ') :Item.find(u' ', len(u'#include '))][1:-1] - self.LoadUniFile(FileName) - # # Pre-process before parse .uni file # @@ -600,26 +591,6 @@ def SetStringReferenced(self, Name): Item = self.OrderedStringList[Lang][ItemIndexInList] Item.Referenced = True - # - # Search the string in language definition by Name - # - def FindStringValue(self, Name, Lang): - if Name in self.OrderedStringDict[Lang]: - ItemIndexInList = self.OrderedStringDict[Lang][Name] - return self.OrderedStringList[Lang][ItemIndexInList] - - return None - - # - # Search the string in language definition by Token - # - def FindByToken(self, Token, Lang): - for Item in self.OrderedStringList[Lang]: - if Item.Token == Token: - return Item - - return None - # # Re-order strings and re-generate tokens # diff --git a/BaseTools/Source/Python/AutoGen/ValidCheckingInfoObject.py b/BaseTools/Source/Python/AutoGen/ValidCheckingInfoObject.py index ad8c9b598025..d4fc31a0b1fe 100644 --- a/BaseTools/Source/Python/AutoGen/ValidCheckingInfoObject.py +++ b/BaseTools/Source/Python/AutoGen/ValidCheckingInfoObject.py @@ -225,10 +225,8 @@ def __init__(self, VarOffset, data, PcdDataType): self.data = set() try: self.StorageWidth = MAX_SIZE_TYPE[self.PcdDataType] - self.ValidData = True except: self.StorageWidth = 0 - self.ValidData = False def __eq__(self, validObj): return validObj and self.VarOffset == validObj.VarOffset From ac9dc333965804e128945c28482c1b76199d6968 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 30 Apr 2025 14:31:24 +0200 Subject: [PATCH 0144/1172] BaseTools: build: Remove unnecessary code Running the vulture tool on the build folder gave the following report. Remove the unnecessary code. - build/build.py:79: unused function 'IsToolInPath' (60% confidence) - build/build.py:396: unused class 'PlatformMakeUnit' (60% confidence) - build/build.py:570: unused method 'GetErrorMessage' (60% confidence) - build/build.py:806: unused attribute 'HashSkipModules' (60% confidence) - build/build.py:807: unused attribute 'Db_Flag' (60% confidence) - build/build.py:1048: unused attribute 'Db_Flag' (60% confidence) - build/build.py:2500: unused method 'GetRealPathOfTool' (60% confidence) - build/BuildReport.py:1497: unused method 'StrtoHex' (60% confidence) Signed-off-by: Pierre Gondois --- BaseTools/Source/Python/build/BuildReport.py | 30 ----------- BaseTools/Source/Python/build/build.py | 55 -------------------- 2 files changed, 85 deletions(-) diff --git a/BaseTools/Source/Python/build/BuildReport.py b/BaseTools/Source/Python/build/BuildReport.py index a11195b011d7..2eeaf4f0f67f 100644 --- a/BaseTools/Source/Python/build/BuildReport.py +++ b/BaseTools/Source/Python/build/BuildReport.py @@ -1494,36 +1494,6 @@ def PrintStructureInfo(self, File, Struct): else: FileWrite(File, ' %-*s = %s' % (self.MaxLen + 4, '.' + Key, Value[0])) - def StrtoHex(self, value): - try: - value = hex(int(value)) - return value - except: - if value.startswith("L\"") and value.endswith("\""): - valuelist = [] - for ch in value[2:-1]: - valuelist.append(hex(ord(ch))) - valuelist.append('0x00') - return valuelist - elif value.startswith("\"") and value.endswith("\""): - return hex(ord(value[1:-1])) - elif value.startswith("{") and value.endswith("}"): - valuelist = [] - if ',' not in value: - return value[1:-1] - for ch in value[1:-1].split(','): - ch = ch.strip() - if ch.startswith('0x') or ch.startswith('0X'): - valuelist.append(ch) - continue - try: - valuelist.append(hex(int(ch.strip()))) - except: - pass - return valuelist - else: - return value - def IsStructurePcd(self, PcdToken, PcdTokenSpaceGuid): if GlobalData.gStructurePcd and (self.Arch in GlobalData.gStructurePcd) and ((PcdToken, PcdTokenSpaceGuid) in GlobalData.gStructurePcd[self.Arch]): return True diff --git a/BaseTools/Source/Python/build/build.py b/BaseTools/Source/Python/build/build.py index a78d4e95013a..0ca71e5458c0 100755 --- a/BaseTools/Source/Python/build/build.py +++ b/BaseTools/Source/Python/build/build.py @@ -71,22 +71,6 @@ TemporaryTablePattern = re.compile(r'^_\d+_\d+_[a-fA-F0-9]+$') TmpTableDict = {} -## Check environment PATH variable to make sure the specified tool is found -# -# If the tool is found in the PATH, then True is returned -# Otherwise, False is returned -# -def IsToolInPath(tool): - if 'PATHEXT' in os.environ: - extns = os.environ['PATHEXT'].split(os.path.pathsep) - else: - extns = ('',) - for pathDir in os.environ['PATH'].split(os.path.pathsep): - for ext in extns: - if os.path.exists(os.path.join(pathDir, tool + ext)): - return True - return False - ## Check environment variables # # Check environment variables that must be set for build. Currently they are @@ -385,26 +369,6 @@ def __init__(self, Obj, BuildCommand,Target): if Target in [None, "", "all"]: self.Target = "tbuild" -## The smallest platform unit that can be built by nmake/make command in multi-thread build mode -# -# This class is for platform build by nmake/make build system. The "Obj" parameter -# must provide __str__(), __eq__() and __hash__() methods. Otherwise there could -# be make units missing build. -# -# Currently the "Obj" should be only PlatformAutoGen object. -# -class PlatformMakeUnit(BuildUnit): - ## The constructor - # - # @param self The object pointer - # @param Obj The PlatformAutoGen object the build is working on - # @param Target The build target name, one of gSupportedTarget - # - def __init__(self, Obj, BuildCommand, Target): - Dependency = [ModuleMakeUnit(Lib, BuildCommand, Target) for Lib in self.BuildObject.LibraryAutoGenList] - Dependency.extend([ModuleMakeUnit(Mod, BuildCommand,Target) for Mod in self.BuildObject.ModuleAutoGenList]) - BuildUnit.__init__(self, Obj, BuildCommand, Target, Dependency, Obj.MakeFileDir) - ## The class representing the task of a module build or platform build # # This class manages the build tasks in multi-thread build mode. Its jobs include @@ -562,15 +526,6 @@ def Abort(): def HasError(): return BuildTask._ErrorFlag.is_set() - ## Get error message in running thread - # - # Since the main thread cannot catch exceptions in other thread, we have to - # use a static variable to communicate this message to main thread. - # - @staticmethod - def GetErrorMessage(): - return BuildTask._ErrorMessage - ## Factory method to create a BuildTask object # # This method will check if a module is building or has been built. And if @@ -803,8 +758,6 @@ def __init__(self, Target, WorkspaceDir, BuildOptions,log_q): self.LoadFixAddress = 0 self.UniFlag = BuildOptions.Flag self.BuildModules = [] - self.HashSkipModules = [] - self.Db_Flag = False self.LaunchPrebuildFlag = False self.PlatformBuildPath = os.path.join(GlobalData.gConfDirectory, '.cache', '.PlatformBuild') if BuildOptions.CommandLength: @@ -1045,7 +998,6 @@ def InitPreBuild(self): if 'PREBUILD' in GlobalData.gCommandLineDefines: self.Prebuild = GlobalData.gCommandLineDefines.get('PREBUILD') else: - self.Db_Flag = True Platform = self.Db.MapPlatform(str(self.PlatformFile)) self.Prebuild = str(Platform.Prebuild) if self.Prebuild: @@ -2495,13 +2447,6 @@ def CreateGuidedSectionToolsFile(self,Wa): print(' '.join(guidedSectionTool), file=toolsFile) toolsFile.close() - ## Returns the real path of the tool. - # - def GetRealPathOfTool (self, tool): - if os.path.exists(tool): - return os.path.realpath(tool) - return tool - ## Launch the module or platform build # def Launch(self): From c6e088cafcf3f7fe056e94480d3e5673498c7f91 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 30 Apr 2025 14:31:47 +0200 Subject: [PATCH 0145/1172] BaseTools: Capsule: Remove unnecessary code Running the vulture tool on the Capsule folder gave the following report. Remove the unnecessary code. - Capsule/WindowsCapsuleSupportHelper.py:26: unused method 'RegisterHelpers' (60% confidence) Signed-off-by: Pierre Gondois --- .../Source/Python/Capsule/WindowsCapsuleSupportHelper.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/BaseTools/Source/Python/Capsule/WindowsCapsuleSupportHelper.py b/BaseTools/Source/Python/Capsule/WindowsCapsuleSupportHelper.py index a29ac21ae890..b82c51853edd 100644 --- a/BaseTools/Source/Python/Capsule/WindowsCapsuleSupportHelper.py +++ b/BaseTools/Source/Python/Capsule/WindowsCapsuleSupportHelper.py @@ -23,11 +23,6 @@ class WindowsCapsuleSupportHelper(object): - def RegisterHelpers(self, obj): - fp = os.path.abspath(__file__) - obj.Register("PackageWindowsCapsuleFiles", WindowsCapsuleSupportHelper.PackageWindowsCapsuleFiles, fp) - - @staticmethod def PackageWindowsCapsuleFiles(OutputFolder, ProductName, ProductFmpGuid, CapsuleVersion_DotString, CapsuleVersion_HexString, ProductFwProvider, ProductFwMfgName, ProductFwDesc, CapsuleFileName, PfxFile=None, PfxPass=None, From 7402bd06cfa88a93a416a1edff7e7f9283ee18ed Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 30 Apr 2025 14:35:54 +0200 Subject: [PATCH 0146/1172] BaseTools: Ecc: Remove unnecessary code Running the vulture tool on the Ecc folder gave the following report. Remove the unnecessary code. - Ecc/c.py:52: unused function 'GetConfig' (60% confidence) - Ecc/c.py:484: unused function 'GetFileModificationTimeFromDB' (60% confidence) - Ecc/CodeFragmentCollector.py:77: unused attribute '__Token' (60% confidence) - Ecc/CodeFragmentCollector.py:78: unused attribute '__SkippedChars' (60% confidence) - Ecc/CodeFragmentCollector.py:109: unused method '__EndOfLine' (60% confidence) - Ecc/CodeFragmentCollector.py:134: unused method '__UndoOneChar' (60% confidence) - Ecc/CodeFragmentCollector.py:221: unused method '__InsertComma' (60% confidence) - Ecc/CodeFragmentCollector.py:539: unused method 'PrintFragments' (60% confidence) - Ecc/Database.py:81: unused attribute 'text_factory' (60% confidence) - Ecc/Database.py:214: unused method 'UpdateIdentifierBelongsToFunction_disabled' (60% confidence) - Ecc/MetaFileWorkspace/MetaDataTable.py:142: unused method 'IsIntegral' (60% confidence) - Ecc/MetaFileWorkspace/MetaDataTable.py:205: unused method 'GetCrossIndex' (60% confidence) - Ecc/Xml/XmlRoutines.py:145: unused function 'XmlElementData' (60% confidence) - Ecc/Xml/XmlRoutines.py:162: unused function 'XmlElementList' (60% confidence) - Ecc/Xml/XmlRoutines.py:192: unused function 'XmlNodeName' (60% confidence) Signed-off-by: Pierre Gondois --- .../Python/Ecc/CodeFragmentCollector.py | 62 ------------------- BaseTools/Source/Python/Ecc/Database.py | 54 ---------------- .../Ecc/MetaFileWorkspace/MetaDataTable.py | 22 ------- .../Source/Python/Ecc/Xml/XmlRoutines.py | 47 -------------- BaseTools/Source/Python/Ecc/c.py | 15 ----- 5 files changed, 200 deletions(-) diff --git a/BaseTools/Source/Python/Ecc/CodeFragmentCollector.py b/BaseTools/Source/Python/Ecc/CodeFragmentCollector.py index d8d6aff08a6e..5bd3eec040ff 100644 --- a/BaseTools/Source/Python/Ecc/CodeFragmentCollector.py +++ b/BaseTools/Source/Python/Ecc/CodeFragmentCollector.py @@ -74,8 +74,6 @@ def __init__(self, FileName): self.CurrentLineNumber = 1 self.CurrentOffsetWithinLine = 0 self.TokenReleaceList = [] - self.__Token = "" - self.__SkippedChars = "" ## __EndOfFile() method # @@ -98,21 +96,6 @@ def __EndOfFile(self): else: return False - ## __EndOfLine() method - # - # Judge current buffer pos is at line end - # - # @param self The object pointer - # @retval True Current File buffer position is at line end - # @retval False Current File buffer position is NOT at line end - # - def __EndOfLine(self): - SizeOfCurrentLine = len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - if self.CurrentOffsetWithinLine >= SizeOfCurrentLine - 1: - return True - else: - return False - ## Rewind() method # # Reset file data buffer to the initial state @@ -123,25 +106,6 @@ def Rewind(self): self.CurrentLineNumber = 1 self.CurrentOffsetWithinLine = 0 - ## __UndoOneChar() method - # - # Go back one char in the file buffer - # - # @param self The object pointer - # @retval True Successfully go back one char - # @retval False Not able to go back one char as file beginning reached - # - def __UndoOneChar(self): - - if self.CurrentLineNumber == 1 and self.CurrentOffsetWithinLine == 0: - return False - elif self.CurrentOffsetWithinLine == 0: - self.CurrentLineNumber -= 1 - self.CurrentOffsetWithinLine = len(self.__CurrentLine()) - 1 - else: - self.CurrentOffsetWithinLine -= 1 - return True - ## __GetOneChar() method # # Move forward one char in the file buffer @@ -211,32 +175,6 @@ def __SetCharValue(self, Line, Offset, Value): def __CurrentLine(self): return self.Profile.FileLinesList[self.CurrentLineNumber - 1] - ## __InsertComma() method - # - # Insert ',' to replace PP - # - # @param self The object pointer - # @retval List current line contents - # - def __InsertComma(self, Line): - - - if self.Profile.FileLinesList[Line - 1][0] != T_CHAR_HASH: - BeforeHashPart = str(self.Profile.FileLinesList[Line - 1]).split(T_CHAR_HASH)[0] - if BeforeHashPart.rstrip().endswith(T_CHAR_COMMA) or BeforeHashPart.rstrip().endswith(';'): - return - - if Line - 2 >= 0 and str(self.Profile.FileLinesList[Line - 2]).rstrip().endswith(','): - return - - if Line - 2 >= 0 and str(self.Profile.FileLinesList[Line - 2]).rstrip().endswith(';'): - return - - if str(self.Profile.FileLinesList[Line]).lstrip().startswith(',') or str(self.Profile.FileLinesList[Line]).lstrip().startswith(';'): - return - - self.Profile.FileLinesList[Line - 1].insert(self.CurrentOffsetWithinLine, ',') - ## PreprocessFile() method # # Preprocess file contents, replace comments with spaces. diff --git a/BaseTools/Source/Python/Ecc/Database.py b/BaseTools/Source/Python/Ecc/Database.py index a5b70c52029b..f31dd933e89a 100644 --- a/BaseTools/Source/Python/Ecc/Database.py +++ b/BaseTools/Source/Python/Ecc/Database.py @@ -78,7 +78,6 @@ def InitDatabase(self, NewDatabase = True): self.Conn.execute("PRAGMA page_size=4096") self.Conn.execute("PRAGMA synchronous=OFF") # to avoid non-ascii character conversion error - self.Conn.text_factory = str self.Cur = self.Conn.cursor() self.TblDataModel = TableDataModel(self.Cur) @@ -206,59 +205,6 @@ def InsertOneFile(self, File): EdkLogger.verbose("Insert information from file %s ... DONE!" % File.FullPath) - ## UpdateIdentifierBelongsToFunction - # - # Update the field "BelongsToFunction" for each Identifier - # - # - def UpdateIdentifierBelongsToFunction_disabled(self): - EdkLogger.verbose("Update 'BelongsToFunction' for Identifiers started ...") - - SqlCommand = """select ID, BelongsToFile, StartLine, EndLine, Model from Identifier""" - EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand) - self.Cur.execute(SqlCommand) - Records = self.Cur.fetchall() - for Record in Records: - IdentifierID = Record[0] - BelongsToFile = Record[1] - StartLine = Record[2] - EndLine = Record[3] - Model = Record[4] - - # - # Check whether an identifier belongs to a function - # - EdkLogger.debug(4, "For common identifiers ... ") - SqlCommand = """select ID from Function - where StartLine < %s and EndLine > %s - and BelongsToFile = %s""" % (StartLine, EndLine, BelongsToFile) - EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand) - self.Cur.execute(SqlCommand) - IDs = self.Cur.fetchall() - for ID in IDs: - SqlCommand = """Update Identifier set BelongsToFunction = %s where ID = %s""" % (ID[0], IdentifierID) - EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand) - self.Cur.execute(SqlCommand) - - # - # Check whether the identifier is a function header - # - EdkLogger.debug(4, "For function headers ... ") - if Model == DataClass.MODEL_IDENTIFIER_COMMENT: - SqlCommand = """select ID from Function - where StartLine = %s + 1 - and BelongsToFile = %s""" % (EndLine, BelongsToFile) - EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand) - self.Cur.execute(SqlCommand) - IDs = self.Cur.fetchall() - for ID in IDs: - SqlCommand = """Update Identifier set BelongsToFunction = %s, Model = %s where ID = %s""" % (ID[0], DataClass.MODEL_IDENTIFIER_FUNCTION_HEADER, IdentifierID) - EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand) - self.Cur.execute(SqlCommand) - - EdkLogger.verbose("Update 'BelongsToFunction' for Identifiers ... DONE") - - ## UpdateIdentifierBelongsToFunction # # Update the field "BelongsToFunction" for each Identifier diff --git a/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaDataTable.py b/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaDataTable.py index 1d7f6eb10434..552344e2c021 100644 --- a/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaDataTable.py +++ b/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaDataTable.py @@ -139,12 +139,6 @@ def Exec(self, SqlCommand): def SetEndFlag(self): pass - def IsIntegral(self): - Result = self.Exec("select min(ID) from %s" % (self.Table)) - if Result[0][0] != -1: - return False - return True - def GetAll(self): return self.Exec("select * from %s where ID > 0 order by ID" % (self.Table)) @@ -195,19 +189,3 @@ def InitTable(self): self.Insert(CrossIndex, Name, Description) EdkLogger.verbose("Initialize table DataModel ... DONE!") - ## Get CrossIndex - # - # Get a model's cross index from its name - # - # @param ModelName: Name of the model - # @retval CrossIndex: CrossIndex of the model - # - def GetCrossIndex(self, ModelName): - CrossIndex = -1 - SqlCommand = """select CrossIndex from DataModel where name = '""" + ModelName + """'""" - self.Cur.execute(SqlCommand) - for Item in self.Cur: - CrossIndex = Item[0] - - return CrossIndex - diff --git a/BaseTools/Source/Python/Ecc/Xml/XmlRoutines.py b/BaseTools/Source/Python/Ecc/Xml/XmlRoutines.py index b02f663b15a5..1428afef6d04 100644 --- a/BaseTools/Source/Python/Ecc/Xml/XmlRoutines.py +++ b/BaseTools/Source/Python/Ecc/Xml/XmlRoutines.py @@ -132,37 +132,6 @@ def XmlElement(Dom, String): except: return "" - -## Get a single XML element of the current node. -# -# Return a single XML element specified by the current root Dom. -# If the input Dom is not valid, then an empty string is returned. -# -# @param Dom The root XML DOM object. -# -# @revel Element An XML element in current root Dom. -# -def XmlElementData(Dom): - try: - return Dom.firstChild.data.strip() - except: - return "" - - -## Get a list of XML elements using XPath style syntax. -# -# Return a list of XML elements from the root Dom specified by XPath String. -# If the input Dom or String is not valid, then an empty list is returned. -# -# @param Dom The root XML DOM object. -# @param String A XPath style path. -# -# @revel Elements A list of XML elements matching XPath style Sting. -# -def XmlElementList(Dom, String): - return map(XmlElementData, XmlList(Dom, String)) - - ## Get the XML attribute of the current node. # # Return a single XML attribute named Attribute from the current root Dom. @@ -179,22 +148,6 @@ def XmlAttribute(Dom, Attribute): except: return '' - -## Get the XML node name of the current node. -# -# Return a single XML node name from the current root Dom. -# If the input Dom is not valid, then an empty string is returned. -# -# @param Dom The root XML DOM object. -# -# @revel Element A single XML element matching XPath style Sting. -# -def XmlNodeName(Dom): - try: - return Dom.nodeName.strip() - except: - return '' - ## Parse an XML file. # # Parse the input XML file named FileName and return a XML DOM it stands for. diff --git a/BaseTools/Source/Python/Ecc/c.py b/BaseTools/Source/Python/Ecc/c.py index 8e45c0730c46..a6b9076f9173 100644 --- a/BaseTools/Source/Python/Ecc/c.py +++ b/BaseTools/Source/Python/Ecc/c.py @@ -49,9 +49,6 @@ def GetTypedefFuncPointerPattern(): def GetDB(): return EccGlobalData.gDb -def GetConfig(): - return EccGlobalData.gConfig - def PrintErrorMsg(ErrorType, Msg, TableName, ItemId): Msg = Msg.replace('\n', '').replace('\r', '') MsgPartList = Msg.split() @@ -481,18 +478,6 @@ def GetFunctionList(): return FuncObjList -def GetFileModificationTimeFromDB(FullFileName): - TimeValue = 0.0 - Db = GetDB() - SqlStatement = """ select TimeStamp - from File - where FullPath = \'%s\' - """ % (FullFileName) - ResultSet = Db.TblFile.Exec(SqlStatement) - for Result in ResultSet: - TimeValue = Result[0] - return TimeValue - def CollectSourceCodeDataIntoDB(RootDir): FileObjList = [] tuple = os.walk(RootDir) From 3c2f04a3c7e2058f7f0b784f365aa39e52237b44 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 30 Apr 2025 14:40:15 +0200 Subject: [PATCH 0147/1172] BaseTools: Eot: Remove unnecessary code Running the vulture tool on the Eot folder gave the following report. Remove the unnecessary code. - Eot/CodeFragment.py:47: unused class 'AssignmentExpression' (60% confidence) - Eot/CodeFragmentCollector.py:75: unused attribute '__Token' (60% confidence) - Eot/CodeFragmentCollector.py:76: unused attribute '__SkippedChars' (60% confidence) - Eot/CodeFragmentCollector.py:104: unused method '__EndOfLine' (60% confidence) - Eot/CodeFragmentCollector.py:129: unused method '__UndoOneChar' (60% confidence) - Eot/CodeFragmentCollector.py:215: unused method '__InsertComma' (60% confidence) - Eot/Database.py:81: unused attribute 'text_factory' (60% confidence) - Eot/EotMain.py:1012: unused method 'SetFreeSpace' (60% confidence) - Eot/Identification.py:36: unused method 'GetFileFullPath' (60% confidence) - Eot/Identification.py:43: unused method 'GetFileRelativePath' (60% confidence) - Eot/Parser.py:119: unused function 'AddToGlobalMacro' (60% confidence) - Eot/Parser.py:238: unused function 'GetAllSourceFiles' (60% confidence) - Eot/Parser.py:257: unused function 'ParseConditionalStatementMacros' (60% confidence) - Eot/Parser.py:267: unused function 'GetAllFiles' (60% confidence) - Eot/Parser.py:291: unused function 'ParseConditionalStatement' (60% confidence) - Eot/Parser.py:367: unused function 'GetConditionalStatementStatus' (60% confidence) - Eot/Parser.py:722: unused function 'ConvertGuid' (60% confidence) - Eot/Parser.py:857: unused function 'ConvertGuid2' (60% confidence) - Eot/Report.py:161: unused method 'GeneratePpi' (60% confidence) - Eot/Report.py:173: unused method 'GenerateProtocol' (60% confidence) Signed-off-by: Pierre Gondois --- BaseTools/Source/Python/Eot/CodeFragment.py | 18 -- .../Python/Eot/CodeFragmentCollector.py | 63 ------ BaseTools/Source/Python/Eot/Database.py | 1 - BaseTools/Source/Python/Eot/EotMain.py | 3 - BaseTools/Source/Python/Eot/Identification.py | 14 -- BaseTools/Source/Python/Eot/Parser.py | 185 ------------------ BaseTools/Source/Python/Eot/Report.py | 24 --- 7 files changed, 308 deletions(-) diff --git a/BaseTools/Source/Python/Eot/CodeFragment.py b/BaseTools/Source/Python/Eot/CodeFragment.py index 94c3f52d5c20..ec73fc46ac7d 100644 --- a/BaseTools/Source/Python/Eot/CodeFragment.py +++ b/BaseTools/Source/Python/Eot/CodeFragment.py @@ -41,24 +41,6 @@ def __init__(self, Str, Begin, End): self.StartPos = Begin self.EndPos = End -## The description of assignment expression and start & end position -# -# -class AssignmentExpression : - ## The constructor - # - # @param self The object pointer - # @param Str The message to record - # @param Begin The start position tuple. - # @param End The end position tuple. - # - def __init__(self, Lvalue, Op, Exp, Begin, End): - self.Name = Lvalue - self.Operator = Op - self.Value = Exp - self.StartPos = Begin - self.EndPos = End - ## The description of predicate expression and start & end position # # diff --git a/BaseTools/Source/Python/Eot/CodeFragmentCollector.py b/BaseTools/Source/Python/Eot/CodeFragmentCollector.py index a5c1ceeaea32..a6827c0ce18e 100644 --- a/BaseTools/Source/Python/Eot/CodeFragmentCollector.py +++ b/BaseTools/Source/Python/Eot/CodeFragmentCollector.py @@ -72,9 +72,6 @@ def __init__(self, FileName): self.CurrentLineNumber = 1 self.CurrentOffsetWithinLine = 0 - self.__Token = "" - self.__SkippedChars = "" - ## __EndOfFile() method # # Judge current buffer pos is at file end @@ -93,21 +90,6 @@ def __EndOfFile(self): else: return False - ## __EndOfLine() method - # - # Judge current buffer pos is at line end - # - # @param self The object pointer - # @retval True Current File buffer position is at line end - # @retval False Current File buffer position is NOT at line end - # - def __EndOfLine(self): - SizeOfCurrentLine = len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - if self.CurrentOffsetWithinLine >= SizeOfCurrentLine - 1: - return True - else: - return False - ## Rewind() method # # Reset file data buffer to the initial state @@ -118,25 +100,6 @@ def Rewind(self): self.CurrentLineNumber = 1 self.CurrentOffsetWithinLine = 0 - ## __UndoOneChar() method - # - # Go back one char in the file buffer - # - # @param self The object pointer - # @retval True Successfully go back one char - # @retval False Not able to go back one char as file beginning reached - # - def __UndoOneChar(self): - - if self.CurrentLineNumber == 1 and self.CurrentOffsetWithinLine == 0: - return False - elif self.CurrentOffsetWithinLine == 0: - self.CurrentLineNumber -= 1 - self.CurrentOffsetWithinLine = len(self.__CurrentLine()) - 1 - else: - self.CurrentOffsetWithinLine -= 1 - return True - ## __GetOneChar() method # # Move forward one char in the file buffer @@ -205,32 +168,6 @@ def __SetCharValue(self, Line, Offset, Value): def __CurrentLine(self): return self.Profile.FileLinesList[self.CurrentLineNumber - 1] - ## __InsertComma() method - # - # Insert ',' to replace PP - # - # @param self The object pointer - # @retval List current line contents - # - def __InsertComma(self, Line): - - - if self.Profile.FileLinesList[Line - 1][0] != T_CHAR_HASH: - BeforeHashPart = str(self.Profile.FileLinesList[Line - 1]).split(T_CHAR_HASH)[0] - if BeforeHashPart.rstrip().endswith(T_CHAR_COMMA) or BeforeHashPart.rstrip().endswith(';'): - return - - if Line - 2 >= 0 and str(self.Profile.FileLinesList[Line - 2]).rstrip().endswith(','): - return - - if Line - 2 >= 0 and str(self.Profile.FileLinesList[Line - 2]).rstrip().endswith(';'): - return - - if str(self.Profile.FileLinesList[Line]).lstrip().startswith(',') or str(self.Profile.FileLinesList[Line]).lstrip().startswith(';'): - return - - self.Profile.FileLinesList[Line - 1].insert(self.CurrentOffsetWithinLine, ',') - ## PreprocessFileWithClear() method # # Run a preprocess for the file to clean all comments diff --git a/BaseTools/Source/Python/Eot/Database.py b/BaseTools/Source/Python/Eot/Database.py index fca08b96bbdf..64a72287e0d3 100644 --- a/BaseTools/Source/Python/Eot/Database.py +++ b/BaseTools/Source/Python/Eot/Database.py @@ -78,7 +78,6 @@ def InitDatabase(self, NewDatabase = True): self.Conn.execute("PRAGMA page_size=8192") self.Conn.execute("PRAGMA synchronous=OFF") # to avoid non-ascii character conversion error - self.Conn.text_factory = str self.Cur = self.Conn.cursor() self.TblDataModel = TableDataModel(self.Cur) diff --git a/BaseTools/Source/Python/Eot/EotMain.py b/BaseTools/Source/Python/Eot/EotMain.py index a5063782883d..e0b2ed2e70d4 100644 --- a/BaseTools/Source/Python/Eot/EotMain.py +++ b/BaseTools/Source/Python/Eot/EotMain.py @@ -1009,9 +1009,6 @@ def _Unpack(self): def Pack(self): pass - def SetFreeSpace(self, Size): - self.FreeSpace = Size - def _GetGuid(self): return gGuidStringFormat % self.Name diff --git a/BaseTools/Source/Python/Eot/Identification.py b/BaseTools/Source/Python/Eot/Identification.py index 31d47602e519..168a8865ca69 100644 --- a/BaseTools/Source/Python/Eot/Identification.py +++ b/BaseTools/Source/Python/Eot/Identification.py @@ -29,20 +29,6 @@ def __init__(self): def GetFileName(self, FileFullPath, FileRelativePath): pass - ## GetFileName - # - # Reserved - # - def GetFileFullPath(self, FileName, FileRelativePath): - pass - - ## GetFileName - # - # Reserved - # - def GetFileRelativePath(self, FileName, FileFullPath): - pass - ## # # This acts like the main() function for the script, unless it is 'import'ed into another diff --git a/BaseTools/Source/Python/Eot/Parser.py b/BaseTools/Source/Python/Eot/Parser.py index f204051d01f7..b0b3d0b6e1b3 100644 --- a/BaseTools/Source/Python/Eot/Parser.py +++ b/BaseTools/Source/Python/Eot/Parser.py @@ -109,17 +109,6 @@ def PreProcess(Filename, MergeMultipleLines = True, LineNo = -1): return Lines -## AddToGlobalMacro() method -# -# Add a macro to EotGlobalData.gMACRO -# -# @param Name: Name of the macro -# @param Value: Value of the macro -# -def AddToGlobalMacro(Name, Value): - Value = ReplaceMacro(Value, EotGlobalData.gMACRO, True) - EotGlobalData.gMACRO[Name] = Value - ## AddToSelfMacro() method # # Parse a line of macro definition and add it to a macro set @@ -238,139 +227,6 @@ def GetAllIncludeFiles(Db): return IncludeFileList -## GetAllSourceFiles() method -# -# Find all source files -# -# @param Db: Eot database -# -# @return SourceFileList: A list of source files -# -def GetAllSourceFiles(Db): - SourceFileList = [] - SqlCommand = """select distinct Value1 from Inf where Model = %s order by Value1""" % MODEL_EFI_SOURCE_FILE - RecordSet = Db.TblInf.Exec(SqlCommand) - - for Record in RecordSet: - SourceFileList.append(Record[0]) - - return SourceFileList - -## GetAllFiles() method -# -# Find all files, both source files and include files -# -# @param Db: Eot database -# -# @return FileList: A list of files -# -def GetAllFiles(Db): - FileList = [] - IncludeFileList = GetAllIncludeFiles(Db) - SourceFileList = GetAllSourceFiles(Db) - for Item in IncludeFileList: - if os.path.isfile(Item) and Item not in FileList: - FileList.append(Item) - for Item in SourceFileList: - if os.path.isfile(Item) and Item not in FileList: - FileList.append(Item) - - return FileList - -## ParseConditionalStatement() method -# -# Parse conditional statement -# -# @param Line: One line to be parsed -# @param Macros: A set of all macro -# @param StatusSet: A set of all status -# -# @retval True: Find keyword of conditional statement -# @retval False: Not find keyword of conditional statement -# -def ParseConditionalStatement(Line, Macros, StatusSet): - NewLine = Line.upper() - if NewLine.find(TAB_IF_EXIST.upper()) > -1: - IfLine = Line[NewLine.find(TAB_IF_EXIST) + len(TAB_IF_EXIST) + 1:].strip() - IfLine = ReplaceMacro(IfLine, EotGlobalData.gMACRO, True) - IfLine = ReplaceMacro(IfLine, Macros, True) - IfLine = IfLine.replace("\"", '') - IfLine = IfLine.replace("(", '') - IfLine = IfLine.replace(")", '') - Status = os.path.exists(os.path.normpath(IfLine)) - StatusSet.append([Status]) - return True - if NewLine.find(TAB_IF_DEF.upper()) > -1: - IfLine = Line[NewLine.find(TAB_IF_DEF) + len(TAB_IF_DEF) + 1:].strip() - Status = False - if IfLine in Macros or IfLine in EotGlobalData.gMACRO: - Status = True - StatusSet.append([Status]) - return True - if NewLine.find(TAB_IF_N_DEF.upper()) > -1: - IfLine = Line[NewLine.find(TAB_IF_N_DEF) + len(TAB_IF_N_DEF) + 1:].strip() - Status = False - if IfLine not in Macros and IfLine not in EotGlobalData.gMACRO: - Status = True - StatusSet.append([Status]) - return True - if NewLine.find(TAB_IF.upper()) > -1: - IfLine = Line[NewLine.find(TAB_IF) + len(TAB_IF) + 1:].strip() - Status = ParseConditionalStatementMacros(IfLine, Macros) - StatusSet.append([Status]) - return True - if NewLine.find(TAB_ELSE_IF.upper()) > -1: - IfLine = Line[NewLine.find(TAB_ELSE_IF) + len(TAB_ELSE_IF) + 1:].strip() - Status = ParseConditionalStatementMacros(IfLine, Macros) - StatusSet[-1].append(Status) - return True - if NewLine.find(TAB_ELSE.upper()) > -1: - Status = False - for Item in StatusSet[-1]: - Status = Status or Item - StatusSet[-1].append(not Status) - return True - if NewLine.find(TAB_END_IF.upper()) > -1: - StatusSet.pop() - return True - - return False - -## ParseConditionalStatement() method -# -# Parse conditional statement with Macros -# -# @param Line: One line to be parsed -# @param Macros: A set of macros -# -# @return Line: New line after replacing macros -# -def ParseConditionalStatementMacros(Line, Macros): - if Line.upper().find('DEFINED(') > -1 or Line.upper().find('EXIST') > -1: - return False - Line = ReplaceMacro(Line, EotGlobalData.gMACRO, True) - Line = ReplaceMacro(Line, Macros, True) - Line = Line.replace("&&", "and") - Line = Line.replace("||", "or") - return eval(Line) - -## GetConditionalStatementStatus() method -# -# 1. Assume the latest status as True -# 2. Pop the top status of status set, previous status -# 3. Compare the latest one and the previous one and get new status -# -# @param StatusSet: A set of all status -# -# @return Status: The final status -# -def GetConditionalStatementStatus(StatusSet): - Status = True - for Item in StatusSet: - Status = Status and Item[-1] - - return Status - ## SearchBelongsToFunction() method # # Search all functions belong to the file @@ -819,47 +675,6 @@ def ParseMapFile(Files): return AllMaps -## ConvertGuid -# -# Convert a GUID to a GUID with all upper letters -# -# @param guid: The GUID to be converted -# -# @param newGuid: The GUID with all upper letters. -# -def ConvertGuid(guid): - numList = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] - newGuid = '' - if guid.startswith('g'): - guid = guid[1:] - for i in guid: - if i.upper() == i and i not in numList: - newGuid = newGuid + ('_' + i) - else: - newGuid = newGuid + i.upper() - if newGuid.startswith('_'): - newGuid = newGuid[1:] - if newGuid.endswith('_'): - newGuid = newGuid[:-1] - - return newGuid - -## ConvertGuid2() method -# -# Convert a GUID to a GUID with new string instead of old string -# -# @param guid: The GUID to be converted -# @param old: Old string to be replaced -# @param new: New string to replace the old one -# -# @param newGuid: The GUID after replacement -# -def ConvertGuid2(guid, old, new): - newGuid = ConvertGuid(guid) - newGuid = newGuid.replace(old, new) - - return newGuid - ## # # This acts like the main() function for the script, unless it is 'import'ed into another diff --git a/BaseTools/Source/Python/Eot/Report.py b/BaseTools/Source/Python/Eot/Report.py index 9d99fe22a0f1..32af504f1342 100644 --- a/BaseTools/Source/Python/Eot/Report.py +++ b/BaseTools/Source/Python/Eot/Report.py @@ -149,30 +149,6 @@ def GenerateDepex(self, DepexString): """ % (DepexString) self.WriteLn(Content) - ## GeneratePpi() method - # - # Generate PPI information - # - # @param self: The object pointer - # @param Name: CName of a GUID - # @param Guid: Value of a GUID - # @param Type: Type of a GUID - # - def GeneratePpi(self, Name, Guid, Type): - self.GeneratePpiProtocol('Ppi', Name, Guid, Type, self.PpiIndex) - - ## GenerateProtocol() method - # - # Generate PROTOCOL information - # - # @param self: The object pointer - # @param Name: CName of a GUID - # @param Guid: Value of a GUID - # @param Type: Type of a GUID - # - def GenerateProtocol(self, Name, Guid, Type): - self.GeneratePpiProtocol('Protocol', Name, Guid, Type, self.ProtocolIndex) - ## GeneratePpiProtocol() method # # Generate PPI/PROTOCOL information From ff0162bf07b130811d833c889574e7301b17ae11 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 30 Apr 2025 14:54:22 +0200 Subject: [PATCH 0148/1172] BaseTools: FMTT: Remove unnecessary code Running the vulture tool on the FMTT folder gave the following report. Remove the unnecessary code. - FMMT/core/BinaryFactoryProduct.py:132: unused attribute 'ROffset' (60% confidence) - FMMT/core/BinaryFactoryProduct.py:176: unused attribute 'ROffset' (60% confidence) - FMMT/core/BinaryFactoryProduct.py:229: unused attribute 'ROffset' (60% confidence) - FMMT/core/BinaryFactoryProduct.py:365: unused class 'ElfSectionProduct' (60% confidence) - FMMT/core/BinaryFactoryProduct.py:369: unused method 'ParserSectionData' (60% confidence) - FMMT/core/BinaryFactoryProduct.py:371: unused method 'ParserProgramData' (60% confidence) - FMMT/core/BiosTree.py:76: unused method 'insertRel' (60% confidence) - FMMT/core/BiosTree.py:84: unused method 'deleteNode' (60% confidence) - FMMT/core/BiosTreeNode.py:63: unused attribute 'ROffset' (60% confidence) - FMMT/core/BiosTreeNode.py:125: unused attribute 'ROffset' (60% confidence) - FMMT/core/BiosTreeNode.py:182: unused attribute 'ROffset' (60% confidence) - FMMT/core/BiosTreeNode.py:185: unused attribute 'SectionMaxAlignment' (60% confidence) - FMMT/core/BiosTreeNode.py:220: unused attribute 'ROffset' (60% confidence) - FMMT/core/BiosTreeNode.py:223: unused attribute 'OriHeader' (60% confidence) - FMMT/core/BiosTreeNode.py:226: unused attribute 'SectionMaxAlignment' (60% confidence) - FMMT/core/BiosTreeNode.py:247: unused attribute 'ROffset' (60% confidence) - FMMT/FMMT.py:52: unused attribute 'firmware_packet' (60% confidence) Signed-off-by: Pierre Gondois --- BaseTools/Source/Python/FMMT/FMMT.py | 2 +- .../Python/FMMT/core/BinaryFactoryProduct.py | 12 -------- BaseTools/Source/Python/FMMT/core/BiosTree.py | 30 ------------------- .../Source/Python/FMMT/core/BiosTreeNode.py | 8 ----- 4 files changed, 1 insertion(+), 51 deletions(-) diff --git a/BaseTools/Source/Python/FMMT/FMMT.py b/BaseTools/Source/Python/FMMT/FMMT.py index 7505b6c88a04..d4fa07a984ce 100644 --- a/BaseTools/Source/Python/FMMT/FMMT.py +++ b/BaseTools/Source/Python/FMMT/FMMT.py @@ -49,7 +49,7 @@ def print_banner(): class FMMT(): def __init__(self) -> None: - self.firmware_packet = {} + pass def SetConfigFilePath(self, configfilepath:str) -> str: os.environ['FmmtConfPath'] = os.path.abspath(configfilepath) diff --git a/BaseTools/Source/Python/FMMT/core/BinaryFactoryProduct.py b/BaseTools/Source/Python/FMMT/core/BinaryFactoryProduct.py index 7ebe11d00101..9dd717cfcf16 100644 --- a/BaseTools/Source/Python/FMMT/core/BinaryFactoryProduct.py +++ b/BaseTools/Source/Python/FMMT/core/BinaryFactoryProduct.py @@ -129,7 +129,6 @@ def ParserSection(self, ParTree, Whole_Data: bytes, Rel_Whole_Offset: int=0) -> Section_Info.Data = Whole_Data[Rel_Offset+Section_Info.HeaderLength: Rel_Offset+Section_Info.Size] Section_Info.DOffset = Section_Offset + Section_Info.HeaderLength + Rel_Whole_Offset Section_Info.HOffset = Section_Offset + Rel_Whole_Offset - Section_Info.ROffset = Rel_Offset if Section_Info.Header.Type == 0: break # The final Section in parent Section does not need to add padding, else must be 4-bytes align with parent Section start offset @@ -173,7 +172,6 @@ def ParserData(self, ParTree, Whole_Data: bytes, Rel_Whole_Offset: int=0) -> Non Section_Info.Data = Whole_Data[Rel_Offset+Section_Info.HeaderLength: Rel_Offset+Section_Info.Size] Section_Info.DOffset = Section_Offset + Section_Info.HeaderLength + Rel_Whole_Offset Section_Info.HOffset = Section_Offset + Rel_Whole_Offset - Section_Info.ROffset = Rel_Offset if Section_Info.Header.Type == 0: break # The final Section in Ffs does not need to add padding, else must be 4-bytes align with Ffs start offset @@ -226,7 +224,6 @@ def ParserData(self, ParTree, Whole_Data: bytes, Rel_Whole_Offset: int=0) -> Non Ffs_Tree = BIOSTREE(Ffs_Info.Name) Ffs_Info.HOffset = Ffs_Offset + Rel_Whole_Offset Ffs_Info.DOffset = Ffs_Offset + Ffs_Info.Header.HeaderLength + Rel_Whole_Offset - Ffs_Info.ROffset = Rel_Offset if Ffs_Info.Name == PADVECTOR: Ffs_Tree.type = FFS_PAD Ffs_Info.Data = Whole_Data[Rel_Offset+Ffs_Info.Header.HeaderLength: Rel_Offset+Ffs_Info.Size] @@ -362,15 +359,6 @@ def GetFvFromFd(self, whole_data: bytes=b'') -> list: tmp_index += 1 return Fd_Struct -class ElfSectionProduct(BinaryProduct): - ## Decompress the compressed section. - def ParserData(self, Section_Tree, whole_Data: bytes, Rel_Whole_Offset: int=0) -> None: - pass - def ParserSectionData(self, Section_Tree, whole_Data: bytes, Rel_Whole_Offset: int=0) -> None: - pass - def ParserProgramData(self, Section_Tree, whole_Data: bytes, Rel_Whole_Offset: int=0) -> None: - pass - class ElfProduct(BinaryProduct): def ParserData(self, ParTree, Whole_Data: bytes, Rel_Whole_Offset: int=0) -> None: diff --git a/BaseTools/Source/Python/FMMT/core/BiosTree.py b/BaseTools/Source/Python/FMMT/core/BiosTree.py index c5a7b017f4b1..d99f964e64c2 100644 --- a/BaseTools/Source/Python/FMMT/core/BiosTree.py +++ b/BaseTools/Source/Python/FMMT/core/BiosTree.py @@ -72,36 +72,6 @@ def insertChild(self, newNode, pos: int=None) -> None: self.Child.insert(pos, newNode) newNode.Parent = self - # lastNode.insertRel(newNode) - def insertRel(self, newNode) -> None: - if self.Parent: - parentTree = self.Parent - new_index = parentTree.Child.index(self) + 1 - parentTree.Child.insert(new_index, newNode) - self.NextRel = newNode - newNode.LastRel = self - - def deleteNode(self, deletekey: str) -> None: - FindStatus, DeleteTree = self.FindNode(deletekey) - if FindStatus: - parentTree = DeleteTree.Parent - lastTree = DeleteTree.LastRel - nextTree = DeleteTree.NextRel - if parentTree: - index = parentTree.Child.index(DeleteTree) - del parentTree.Child[index] - if lastTree and nextTree: - lastTree.NextRel = nextTree - nextTree.LastRel = lastTree - elif lastTree: - lastTree.NextRel = None - elif nextTree: - nextTree.LastRel = None - return DeleteTree - else: - logger.error('Could not find the target tree') - return None - def FindNode(self, key: str, Findlist: list) -> None: if self.key == key or (self.Data and self.Data.Name == key) or (self.type == FFS_TREE and self.Data.UiName == key): Findlist.append(self) diff --git a/BaseTools/Source/Python/FMMT/core/BiosTreeNode.py b/BaseTools/Source/Python/FMMT/core/BiosTreeNode.py index 5ca4c20dc67a..92611f8ce99d 100644 --- a/BaseTools/Source/Python/FMMT/core/BiosTreeNode.py +++ b/BaseTools/Source/Python/FMMT/core/BiosTreeNode.py @@ -60,7 +60,6 @@ def __init__(self, buffer: bytes) -> None: self.HeaderLength = len(struct2stream(self.Header)) self.HOffset = 0 self.DOffset = 0 - self.ROffset = 0 self.Data = b'' self.PadData = b'' self.Upld_Info_Align = False @@ -122,7 +121,6 @@ def __init__(self, name, buffer: bytes) -> None: self.HeaderLength = self.Header.HeaderLength self.HOffset = 0 self.DOffset = 0 - self.ROffset = 0 self.Data = b'' if self.Header.Signature != 1213613663: logger.error('Invalid Fv Header! Fv {} signature {} is not "_FVH".'.format(struct2stream(self.Header), self.Header.Signature)) @@ -179,10 +177,8 @@ def __init__(self, buffer: bytes) -> None: self.HeaderLength = self.Header.HeaderLength self.HOffset = 0 self.DOffset = 0 - self.ROffset = 0 self.Data = b'' self.PadData = b'' - self.SectionMaxAlignment = SECTION_COMMON_ALIGNMENT # 4-align def ModCheckSum(self) -> None: HeaderData = struct2stream(self.Header) @@ -217,13 +213,10 @@ def __init__(self, buffer: bytes) -> None: self.Type = self.Header.Type self.HOffset = 0 self.DOffset = 0 - self.ROffset = 0 self.Data = b'' self.OriData = b'' - self.OriHeader = b'' self.PadData = b'' self.IsPadSection = False - self.SectionMaxAlignment = SECTION_COMMON_ALIGNMENT # 4-align def GetExtHeader(self, Type: int, buffer: bytes, nums: int=0) -> None: if Type == 0x01: @@ -244,5 +237,4 @@ def __init__(self, buffer: bytes) -> None: self.Size = len(buffer) self.HOffset = 0 self.DOffset = 0 - self.ROffset = 0 self.PadData = b'' From fa2c27514c5923d8a1c7f8cb7b1bf2f3b69c4331 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 30 Apr 2025 14:53:32 +0200 Subject: [PATCH 0149/1172] BaseTools: GenFds: Remove unnecessary code Running the vulture tool on the GenFds folder gave the following report. Remove the unnecessary code. - GenFds/Fd.py:146: unused method 'GenFlashMap' (60% confidence) - GenFds/FdfParser.py:1539: unused attribute 'BaseAddressPcd' (60% confidence) - GenFds/FdfParser.py:1556: unused attribute 'SizePcd' (60% confidence) - GenFds/FdfParser.py:2394: unused attribute 'CurrentLineNum' (60% confidence) - GenFds/FdfParser.py:2395: unused attribute 'CurrentLineContent' (60% confidence) - GenFds/FdfParser.py:2653: unused attribute 'CurrentLineNum' (60% confidence) - GenFds/FdfParser.py:2654: unused attribute 'CurrentLineContent' (60% confidence) - GenFds/FdfParser.py:3229: unused attribute 'CreateFile' (60% confidence) - GenFds/FfsFileStatement.py:36: unused attribute 'CurrentLineNum' (60% confidence) - GenFds/FfsFileStatement.py:37: unused attribute 'CurrentLineContent' (60% confidence) - GenFds/FfsInfStatement.py:68: unused attribute 'CurrentLineNum' (60% confidence) - GenFds/FfsInfStatement.py:69: unused attribute 'CurrentLineContent' (60% confidence) - GenFds/GenFds.py:68: unused attribute 'LibDir' (60% confidence) - GenFds/GenFds.py:557: unused method 'GetFvBlockSize' (60% confidence) Signed-off-by: Pierre Gondois --- BaseTools/Source/Python/GenFds/Fd.py | 13 ------- BaseTools/Source/Python/GenFds/FdfParser.py | 9 ----- .../Source/Python/GenFds/FfsFileStatement.py | 2 -- .../Source/Python/GenFds/FfsInfStatement.py | 2 -- BaseTools/Source/Python/GenFds/GenFds.py | 36 ------------------- .../Python/GenFds/GenFdsGlobalVariable.py | 1 - 6 files changed, 63 deletions(-) diff --git a/BaseTools/Source/Python/GenFds/Fd.py b/BaseTools/Source/Python/GenFds/Fd.py index 973936b6f273..c21453adccf2 100644 --- a/BaseTools/Source/Python/GenFds/Fd.py +++ b/BaseTools/Source/Python/GenFds/Fd.py @@ -139,17 +139,4 @@ def GenFd (self, Flag = False): GenFdsGlobalVariable.ImageBinDict[self.FdUiName.upper() + 'fd'] = FdFileName return FdFileName - ## generate flash map file - # - # @param self The object pointer - # - def GenFlashMap (self): - pass - - - - - - - diff --git a/BaseTools/Source/Python/GenFds/FdfParser.py b/BaseTools/Source/Python/GenFds/FdfParser.py index c821494d0d82..63e73a78bfa6 100644 --- a/BaseTools/Source/Python/GenFds/FdfParser.py +++ b/BaseTools/Source/Python/GenFds/FdfParser.py @@ -1536,7 +1536,6 @@ def _GetTokenStatements(self, Obj): if self._IsToken(TAB_VALUE_SPLIT): pcdPair = self._GetNextPcdSettings() - Obj.BaseAddressPcd = pcdPair self.Profile.PcdDict[pcdPair] = Obj.BaseAddress self.SetPcdLocalation(pcdPair) FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber) @@ -1553,7 +1552,6 @@ def _GetTokenStatements(self, Obj): Size = self._Token if self._IsToken(TAB_VALUE_SPLIT): pcdPair = self._GetNextPcdSettings() - Obj.SizePcd = pcdPair self.Profile.PcdDict[pcdPair] = Size self.SetPcdLocalation(pcdPair) FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber) @@ -2391,9 +2389,6 @@ def _ParseInfStatement(self): if not ffsInf.InfFileName.endswith('.inf'): raise Warning.Expected(".inf file path", self.FileName, self.CurrentLineNumber) - ffsInf.CurrentLineNum = self.CurrentLineNumber - ffsInf.CurrentLineContent = self._CurrentLine() - #Replace $(SAPCE) with real space ffsInf.InfFileName = ffsInf.InfFileName.replace('$(SPACE)', ' ') @@ -2650,8 +2645,6 @@ def _GetFilePart(self, FfsFileObj): self._GetRAWData(FfsFileObj) else: - FfsFileObj.CurrentLineNum = self.CurrentLineNumber - FfsFileObj.CurrentLineContent = self._CurrentLine() FfsFileObj.FileName = self._Token.replace('$(SPACE)', ' ') self._VerifyFile(FfsFileObj.FileName) @@ -3226,8 +3219,6 @@ def _GetCapsule(self): if not self._GetNextToken(): raise Warning.Expected("file name", self.FileName, self.CurrentLineNumber) - CapsuleObj.CreateFile = self._Token - self._GetCapsuleStatements(CapsuleObj) self.Profile.CapsuleDict[CapsuleObj.UiCapsuleName] = CapsuleObj return True diff --git a/BaseTools/Source/Python/GenFds/FfsFileStatement.py b/BaseTools/Source/Python/GenFds/FfsFileStatement.py index 1c6e59bac75c..e1eb75d204b7 100644 --- a/BaseTools/Source/Python/GenFds/FfsFileStatement.py +++ b/BaseTools/Source/Python/GenFds/FfsFileStatement.py @@ -33,8 +33,6 @@ class FileStatement (FileStatementClassObject): # def __init__(self): FileStatementClassObject.__init__(self) - self.CurrentLineNum = None - self.CurrentLineContent = None self.FileName = None self.InfFileName = None self.SubAlignment = None diff --git a/BaseTools/Source/Python/GenFds/FfsInfStatement.py b/BaseTools/Source/Python/GenFds/FfsInfStatement.py index 4e26a5af9db7..6c837accee0a 100644 --- a/BaseTools/Source/Python/GenFds/FfsInfStatement.py +++ b/BaseTools/Source/Python/GenFds/FfsInfStatement.py @@ -65,8 +65,6 @@ def __init__(self): self.PiSpecVersion = '0x00000000' self.InfModule = None self.FinalTargetSuffixMap = {} - self.CurrentLineNum = None - self.CurrentLineContent = None self.FileName = None self.InfFileName = None self.OverrideGuid = None diff --git a/BaseTools/Source/Python/GenFds/GenFds.py b/BaseTools/Source/Python/GenFds/GenFds.py index 885e01e9cc9b..fe53d6b160e1 100644 --- a/BaseTools/Source/Python/GenFds/GenFds.py +++ b/BaseTools/Source/Python/GenFds/GenFds.py @@ -65,7 +65,6 @@ def resetFdsGlobalVariable(): # will be FvDir + os.sep + 'Ffs' GenFdsGlobalVariable.FfsDir = '' GenFdsGlobalVariable.FdfParser = None - GenFdsGlobalVariable.LibDir = '' GenFdsGlobalVariable.WorkSpace = None GenFdsGlobalVariable.WorkSpaceDir = '' GenFdsGlobalVariable.ConfDir = '' @@ -549,41 +548,6 @@ def GenFfsMakefile(OutputDir, FdfParserObject, WorkSpace, ArchList, GlobalData): return GenFdsGlobalVariable.FfsCmdDict - ## GetFvBlockSize() - # - # @param FvObj Whose block size to get - # @retval int Block size value - # - @staticmethod - def GetFvBlockSize(FvObj): - DefaultBlockSize = 0x1 - FdObj = None - if GenFds.OnlyGenerateThisFd is not None and GenFds.OnlyGenerateThisFd.upper() in GenFdsGlobalVariable.FdfParser.Profile.FdDict: - FdObj = GenFdsGlobalVariable.FdfParser.Profile.FdDict[GenFds.OnlyGenerateThisFd.upper()] - if FdObj is None: - for ElementFd in GenFdsGlobalVariable.FdfParser.Profile.FdDict.values(): - for ElementRegion in ElementFd.RegionList: - if ElementRegion.RegionType == BINARY_FILE_TYPE_FV: - for ElementRegionData in ElementRegion.RegionDataList: - if ElementRegionData is not None and ElementRegionData.upper() == FvObj.UiFvName: - if FvObj.BlockSizeList != []: - return FvObj.BlockSizeList[0][0] - else: - return ElementRegion.BlockSizeOfRegion(ElementFd.BlockSizeList) - if FvObj.BlockSizeList != []: - return FvObj.BlockSizeList[0][0] - return DefaultBlockSize - else: - for ElementRegion in FdObj.RegionList: - if ElementRegion.RegionType == BINARY_FILE_TYPE_FV: - for ElementRegionData in ElementRegion.RegionDataList: - if ElementRegionData is not None and ElementRegionData.upper() == FvObj.UiFvName: - if FvObj.BlockSizeList != []: - return FvObj.BlockSizeList[0][0] - else: - return ElementRegion.BlockSizeOfRegion(ElementFd.BlockSizeList) - return DefaultBlockSize - ## DisplayFvSpaceInfo() # # @param FvObj Whose block size to get diff --git a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py index d7668ba681aa..4e014bf84b98 100644 --- a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py +++ b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py @@ -44,7 +44,6 @@ class GenFdsGlobalVariable: # will be FvDir + os.sep + 'Ffs' FfsDir = '' FdfParser = None - LibDir = '' WorkSpace = None WorkSpaceDir = '' ConfDir = '' From ee791006781e821e1d415f15433bfa95b9e83500 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 30 Apr 2025 14:59:09 +0200 Subject: [PATCH 0150/1172] BaseTools: Table: Remove unnecessary code Running the vulture tool on the Table folder gave the following report. Remove the unnecessary code. - Table/Table.py:88: unused method 'GenerateID' (60% confidence) - Table/TableDataModel.py:83: unused method 'GetCrossIndex' (60% confidence) - Table/TableEotReport.py:66: unused method 'GetMaxID' (60% confidence) Signed-off-by: Pierre Gondois --- BaseTools/Source/Python/Table/Table.py | 14 -------------- BaseTools/Source/Python/Table/TableDataModel.py | 16 ---------------- BaseTools/Source/Python/Table/TableEotReport.py | 6 ------ 3 files changed, 36 deletions(-) diff --git a/BaseTools/Source/Python/Table/Table.py b/BaseTools/Source/Python/Table/Table.py index 7a60313e9524..47ebea683523 100644 --- a/BaseTools/Source/Python/Table/Table.py +++ b/BaseTools/Source/Python/Table/Table.py @@ -77,20 +77,6 @@ def GetCount(self): for Item in self.Cur: return Item[0] - ## Generate ID - # - # Generate an ID if input ID is -1 - # - # @param ID: Input ID - # - # @retval ID: New generated ID - # - def GenerateID(self, ID): - if ID == -1: - self.ID = self.ID + 1 - - return self.ID - ## Init the ID of the table # # Init the ID of the table diff --git a/BaseTools/Source/Python/Table/TableDataModel.py b/BaseTools/Source/Python/Table/TableDataModel.py index 3855807452f7..7d1d7ed3db5b 100644 --- a/BaseTools/Source/Python/Table/TableDataModel.py +++ b/BaseTools/Source/Python/Table/TableDataModel.py @@ -72,19 +72,3 @@ def InitTable(self): Description = Item[0] self.Insert(CrossIndex, Name, Description) EdkLogger.verbose("Initialize table DataModel ... DONE!") - - ## Get CrossIndex - # - # Get a model's cross index from its name - # - # @param ModelName: Name of the model - # @retval CrossIndex: CrossIndex of the model - # - def GetCrossIndex(self, ModelName): - CrossIndex = -1 - SqlCommand = """select CrossIndex from DataModel where name = '""" + ModelName + """'""" - self.Cur.execute(SqlCommand) - for Item in self.Cur: - CrossIndex = Item[0] - - return CrossIndex diff --git a/BaseTools/Source/Python/Table/TableEotReport.py b/BaseTools/Source/Python/Table/TableEotReport.py index abd433ec8ef1..db6660f57afe 100644 --- a/BaseTools/Source/Python/Table/TableEotReport.py +++ b/BaseTools/Source/Python/Table/TableEotReport.py @@ -62,9 +62,3 @@ def Insert(self, ModuleID = -1, ModuleName = '', ModuleGuid = '', SourceFileID = % (self.Table, self.ID, ModuleID, ModuleName, ModuleGuid, SourceFileID, SourceFileFullPath, \ ItemName, ItemType, ItemMode, GuidName, GuidMacro, GuidValue, BelongsToFunction, Enabled) Table.Insert(self, SqlCommand) - - def GetMaxID(self): - SqlCommand = """select max(ID) from %s""" % self.Table - self.Cur.execute(SqlCommand) - for Item in self.Cur: - return Item[0] From 583b64122c7797ef012f7db634420a12c2b89b62 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 30 Apr 2025 14:48:04 +0200 Subject: [PATCH 0151/1172] BaseTools: UPT/Parser: Remove unnecessary code Running the vulture tool on the UPT/Parser folder gave the following report. Remove the unnecessary code. - UPT/Parser/InfAsBuiltProcess.py:223: unused function 'GetInfsFromWorkSpace' (60% confidence) - UPT/Parser/InfAsBuiltProcess.py:237: unused function 'GetGuidVerFormLibInstance' (60% confidence) - UPT/Parser/InfParserMisc.py:211: unused attribute 'InfPeiDepexSection' (60% confidence) - UPT/Parser/InfParserMisc.py:212: unused attribute 'InfDxeDepexSection' (60% confidence) - UPT/Parser/InfParserMisc.py:213: unused attribute 'InfSmmDepexSection' (60% confidence) - UPT/Parser/InfSectionParser.py:231: unused attribute 'InfPeiDepexSection' (60% confidence) - UPT/Parser/InfSectionParser.py:232: unused attribute 'InfDxeDepexSection' (60% confidence) - UPT/Parser/InfSectionParser.py:233: unused attribute 'InfSmmDepexSection' (60% confidence) Signed-off-by: Pierre Gondois --- .../Python/UPT/Parser/InfAsBuiltProcess.py | 66 ------------------- .../Source/Python/UPT/Parser/InfParserMisc.py | 3 - .../Python/UPT/Parser/InfSectionParser.py | 3 - 3 files changed, 72 deletions(-) diff --git a/BaseTools/Source/Python/UPT/Parser/InfAsBuiltProcess.py b/BaseTools/Source/Python/UPT/Parser/InfAsBuiltProcess.py index fb646191b186..fd0795e32661 100644 --- a/BaseTools/Source/Python/UPT/Parser/InfAsBuiltProcess.py +++ b/BaseTools/Source/Python/UPT/Parser/InfAsBuiltProcess.py @@ -215,69 +215,3 @@ def GetFileLineContent(FileName, WorkSpace, LineNo, OriginalString): FileLinesList = ProcessLineExtender(FileLinesList) return FileLinesList - -## -# Get all INF files from current workspace -# -# -def GetInfsFromWorkSpace(WorkSpace): - InfFiles = [] - for top, dirs, files in os.walk(WorkSpace): - dirs = dirs # just for pylint - for File in files: - if File.upper().endswith(".INF"): - InfFiles.append(os.path.join(top, File)) - - return InfFiles - -## -# Get GUID and version from library instance file -# -# -def GetGuidVerFormLibInstance(Guid, Version, WorkSpace, CurrentInfFileName): - for InfFile in GetInfsFromWorkSpace(WorkSpace): - try: - if InfFile.strip().upper() == CurrentInfFileName.strip().upper(): - continue - InfFile = InfFile.replace('\\', '/') - if InfFile not in GlobalData.gLIBINSTANCEDICT: - InfFileObj = open(InfFile, "r") - GlobalData.gLIBINSTANCEDICT[InfFile] = InfFileObj - else: - InfFileObj = GlobalData.gLIBINSTANCEDICT[InfFile] - - except BaseException: - Logger.Error("InfParser", - ToolError.FILE_READ_FAILURE, - ST.ERR_FILE_OPEN_FAILURE, - File=InfFile) - try: - FileLinesList = InfFileObj.readlines() - FileLinesList = ProcessLineExtender(FileLinesList) - - ReFindFileGuidPattern = re.compile(r"^\s*FILE_GUID\s*=.*$") - ReFindVerStringPattern = re.compile(r"^\s*VERSION_STRING\s*=.*$") - - for Line in FileLinesList: - if ReFindFileGuidPattern.match(Line): - FileGuidString = Line - if ReFindVerStringPattern.match(Line): - VerString = Line - - if FileGuidString: - FileGuidString = GetSplitValueList(FileGuidString, '=', 1)[1] - if VerString: - VerString = GetSplitValueList(VerString, '=', 1)[1] - - if FileGuidString.strip().upper() == Guid.upper() and \ - VerString.strip().upper() == Version.upper(): - return Guid, Version - - except BaseException: - Logger.Error("InfParser", ToolError.FILE_READ_FAILURE, ST.ERR_FILE_OPEN_FAILURE, File=InfFile) - finally: - InfFileObj.close() - - return '', '' - - diff --git a/BaseTools/Source/Python/UPT/Parser/InfParserMisc.py b/BaseTools/Source/Python/UPT/Parser/InfParserMisc.py index eb768b9a1241..fd0f819feb4e 100644 --- a/BaseTools/Source/Python/UPT/Parser/InfParserMisc.py +++ b/BaseTools/Source/Python/UPT/Parser/InfParserMisc.py @@ -208,9 +208,6 @@ def __init__(self): self.InfPpiSection = None self.InfGuidSection = None self.InfDepexSection = None - self.InfPeiDepexSection = None - self.InfDxeDepexSection = None - self.InfSmmDepexSection = None self.InfBinariesSection = None self.InfHeader = None self.InfSpecialCommentSection = None diff --git a/BaseTools/Source/Python/UPT/Parser/InfSectionParser.py b/BaseTools/Source/Python/UPT/Parser/InfSectionParser.py index 474d37379d2b..4899e7d6c58e 100644 --- a/BaseTools/Source/Python/UPT/Parser/InfSectionParser.py +++ b/BaseTools/Source/Python/UPT/Parser/InfSectionParser.py @@ -228,9 +228,6 @@ def __init__(self): self.InfPpiSection = InfPpiObject() self.InfGuidSection = InfGuidObject() self.InfDepexSection = InfDepexObject() - self.InfPeiDepexSection = InfDepexObject() - self.InfDxeDepexSection = InfDepexObject() - self.InfSmmDepexSection = InfDepexObject() self.InfBinariesSection = InfBinariesObject() self.InfHeader = InfHeaderObject() self.InfBinaryHeader = InfHeaderObject() From 9b52f0c2057abd1204f99916b11a90d031832418 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 30 Apr 2025 14:48:31 +0200 Subject: [PATCH 0152/1172] BaseTools: UPT/PomAdapter: Remove unnecessary code Running the vulture tool on the UPT/PomAdapter folder gave the following report. Remove the unnecessary code. - UPT/PomAdapter/DecPomAlignment.py:898: unused method 'ShowPackage' (60% confidence) Signed-off-by: Pierre Gondois --- .../Python/UPT/PomAdapter/DecPomAlignment.py | 47 ------------------- 1 file changed, 47 deletions(-) diff --git a/BaseTools/Source/Python/UPT/PomAdapter/DecPomAlignment.py b/BaseTools/Source/Python/UPT/PomAdapter/DecPomAlignment.py index b1f8135bc780..944fd2fa18d5 100644 --- a/BaseTools/Source/Python/UPT/PomAdapter/DecPomAlignment.py +++ b/BaseTools/Source/Python/UPT/PomAdapter/DecPomAlignment.py @@ -891,53 +891,6 @@ def GenModuleFileList(self, ContainerFile): self.SetModuleFileList(ModuleFileList) - ## Show detailed information of Package - # - # Print all members and their values of Package class - # - def ShowPackage(self): - print('\nName =', self.GetName()) - print('\nBaseName =', self.GetBaseName()) - print('\nVersion =', self.GetVersion()) - print('\nGuid =', self.GetGuid()) - - print('\nStandardIncludes = %d ' \ - % len(self.GetStandardIncludeFileList()), end=' ') - for Item in self.GetStandardIncludeFileList(): - print(Item.GetFilePath(), ' ', Item.GetSupArchList()) - print('\nPackageIncludes = %d \n' \ - % len(self.GetPackageIncludeFileList()), end=' ') - for Item in self.GetPackageIncludeFileList(): - print(Item.GetFilePath(), ' ', Item.GetSupArchList()) - - print('\nGuids =', self.GetGuidList()) - for Item in self.GetGuidList(): - print(Item.GetCName(), Item.GetGuid(), Item.GetSupArchList()) - print('\nProtocols =', self.GetProtocolList()) - for Item in self.GetProtocolList(): - print(Item.GetCName(), Item.GetGuid(), Item.GetSupArchList()) - print('\nPpis =', self.GetPpiList()) - for Item in self.GetPpiList(): - print(Item.GetCName(), Item.GetGuid(), Item.GetSupArchList()) - print('\nLibraryClasses =', self.GetLibraryClassList()) - for Item in self.GetLibraryClassList(): - print(Item.GetLibraryClass(), Item.GetRecommendedInstance(), \ - Item.GetSupArchList()) - print('\nPcds =', self.GetPcdList()) - for Item in self.GetPcdList(): - print('CName=', Item.GetCName(), 'TokenSpaceGuidCName=', \ - Item.GetTokenSpaceGuidCName(), \ - 'DefaultValue=', Item.GetDefaultValue(), \ - 'ValidUsage=', Item.GetValidUsage(), \ - 'SupArchList', Item.GetSupArchList(), \ - 'Token=', Item.GetToken(), 'DatumType=', Item.GetDatumType()) - - for Item in self.GetMiscFileList(): - print(Item.GetName()) - for FileObjectItem in Item.GetFileList(): - print(FileObjectItem.GetURI()) - print('****************\n') - ## GenPcdDeclaration # # @param ContainerFile: File name of the DEC file From 5c558ce5f3631521a790ee8d30de3f4ffcd16f1a Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 30 Apr 2025 14:45:49 +0200 Subject: [PATCH 0153/1172] BaseTools: UPT/Xml: Remove unnecessary code Running the vulture tool on the UPT/Xml folder gave the following report. Remove the unnecessary code. - UPT/Xml/CommonXml.py:585: unused attribute 'LangDefsList' (60% confidence) Signed-off-by: Pierre Gondois --- BaseTools/Source/Python/UPT/Xml/CommonXml.py | 1 - 1 file changed, 1 deletion(-) diff --git a/BaseTools/Source/Python/UPT/Xml/CommonXml.py b/BaseTools/Source/Python/UPT/Xml/CommonXml.py index cfadacf4aaaf..1c18d7f76323 100644 --- a/BaseTools/Source/Python/UPT/Xml/CommonXml.py +++ b/BaseTools/Source/Python/UPT/Xml/CommonXml.py @@ -582,7 +582,6 @@ def __init__(self): self.BinaryDescriptionList = [] self.BinaryCopyrightList = [] self.BinaryLicenseList = [] - self.LangDefsList = [] self.DefineDict = {} self.BuildOptionDict = {} self.IncludesDict = {} From 70d53c2df096d1789061f21b56cba34558a0c46d Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 30 Apr 2025 15:01:27 +0200 Subject: [PATCH 0154/1172] BaseTools: UPT/Library: Remove unnecessary code Running the vulture tool on the UPT/Library folder gave the following report. Remove the unnecessary code. - UPT/Library/CommentGenerating.py:50: unused function 'GenGenericComment' (60% confidence) - UPT/Library/CommentGenerating.py:172: unused function 'GenInfPcdTailComment' (60% confidence) - UPT/Library/CommentGenerating.py:185: unused function 'GenInfProtocolPPITailComment' (60% confidence) - UPT/Library/CommentGenerating.py:203: unused function 'GenInfGuidTailComment' (60% confidence) - UPT/Library/Misc.py:504: unused class 'MergeCommentDict' (60% confidence) - UPT/Library/Misc.py:527: unused function 'GenDummyHelpTextObj' (60% confidence) - UPT/Library/ParserValidate.py:110: unused function 'IsValidInfComponentType' (60% confidence) - UPT/Library/ParserValidate.py:122: unused function 'IsValidToolFamily' (60% confidence) - UPT/Library/ParserValidate.py:134: unused function 'IsValidToolTagName' (60% confidence) - UPT/Library/ParserValidate.py:465: unused function 'IsValidBuildNumber' (60% confidence) - UPT/Library/ParserValidate.py:478: unused function 'IsValidDepex' (60% confidence) - UPT/Library/ParserValidate.py:546: unused function 'IsValidVersionString' (60% confidence) - UPT/Library/ParserValidate.py:721: unused function 'CheckUTF16FileHeader' (60% confidence) - UPT/Library/Parsing.py:52: unused function 'GetBuildOption' (60% confidence) - UPT/Library/Parsing.py:100: unused function 'GetLibraryClassOfInf' (60% confidence) - UPT/Library/Parsing.py:150: unused function 'GetPcd' (60% confidence) - UPT/Library/Parsing.py:177: unused function 'GetFeatureFlagPcd' (60% confidence) - UPT/Library/Parsing.py:201: unused function 'GetDynamicDefaultPcd' (60% confidence) - UPT/Library/Parsing.py:227: unused function 'GetDynamicHiiPcd' (60% confidence) - UPT/Library/Parsing.py:254: unused function 'GetDynamicVpdPcd' (60% confidence) - UPT/Library/Parsing.py:277: unused function 'GetComponent' (60% confidence) - UPT/Library/Parsing.py:392: unused function 'GetExec' (60% confidence) - UPT/Library/Parsing.py:416: unused function 'GetComponents' (60% confidence) - UPT/Library/Parsing.py:532: unused function 'GetSource' (60% confidence) - UPT/Library/Parsing.py:581: unused function 'GetGuidsProtocolsPpisOfInf' (60% confidence) - UPT/Library/Parsing.py:595: unused function 'GetGuidsProtocolsPpisOfDec' (60% confidence) - UPT/Library/Parsing.py:645: unused function 'GetPcdOfInf' (60% confidence) - UPT/Library/Parsing.py:682: unused function 'GetPcdOfDec' (60% confidence) - UPT/Library/Parsing.py:739: unused function 'InsertSectionItems' (60% confidence) - UPT/Library/Parsing.py:776: unused function 'GenMetaDatSectionItem' (60% confidence) - UPT/Library/StringUtils.py:87: unused function 'GetLibraryClassesWithModuleType' (60% confidence) - UPT/Library/StringUtils.py:107: unused function 'GetDynamics' (60% confidence) - UPT/Library/StringUtils.py:350: unused function 'GetMultipleValuesOfKeyFromLines' (60% confidence) - UPT/Library/StringUtils.py:396: unused function 'GetSingleValueOfKeyFromLines' (60% confidence) - UPT/Library/StringUtils.py:463: unused function 'PreCheck' (60% confidence) - UPT/Library/StringUtils.py:675: unused function 'StringArrayLength' (60% confidence) - UPT/Library/StringUtils.py:718: unused function 'IsHexDigit' (60% confidence) - UPT/Library/UniClassObject.py:86: unused function 'UniToStr' (60% confidence) - UPT/Library/UniClassObject.py:227: unused attribute 'StringNameByteList' (60% confidence) - UPT/Library/UniClassObject.py:237: unused attribute 'StringNameByteList' (60% confidence) - UPT/Library/UniClassObject.py:377: unused method 'GetIncludeFile' (60% confidence) - UPT/Library/UniClassObject.py:947: unused method 'FindStringValue' (60% confidence) - UPT/Library/UniClassObject.py:957: unused method 'FindByToken' (60% confidence) - UPT/Library/UniClassObject.py:1022: unused method 'ReadIncludeUNIfile' (60% confidence) - UPT/Library/StringUtils.py:718: unused function 'IsHexDigit' (60% confidence) - UPT/Library/Xml/XmlRoutines.py:176: unused function 'XmlElementList' (60% confidence) - UPT/Library/Xml/XmlRoutines.py:202: unused function 'XmlNodeName' (60% confidence) Signed-off-by: Pierre Gondois --- .../Python/UPT/Library/CommentGenerating.py | 63 -- BaseTools/Source/Python/UPT/Library/Misc.py | 35 - .../Python/UPT/Library/ParserValidate.py | 97 --- .../Source/Python/UPT/Library/Parsing.py | 625 ------------------ .../Source/Python/UPT/Library/StringUtils.py | 229 ------- .../Python/UPT/Library/UniClassObject.py | 65 -- .../Python/UPT/Library/Xml/XmlRoutines.py | 41 -- 7 files changed, 1155 deletions(-) diff --git a/BaseTools/Source/Python/UPT/Library/CommentGenerating.py b/BaseTools/Source/Python/UPT/Library/CommentGenerating.py index 4c50adac6e50..ac09ab84c566 100644 --- a/BaseTools/Source/Python/UPT/Library/CommentGenerating.py +++ b/BaseTools/Source/Python/UPT/Library/CommentGenerating.py @@ -43,18 +43,6 @@ def GenTailCommentLines (TailCommentLines, LeadingSpaceNum = 0): return CommentStr -## GenGenericComment -# -# @param CommentLines: Generic comment Text, maybe Multiple Lines -# -def GenGenericComment (CommentLines): - if not CommentLines: - return '' - CommentLines = CommentLines.rstrip(END_OF_LINE) - CommentStr = TAB_SPECIAL_COMMENT + TAB_SPACE_SPLIT + (END_OF_LINE + TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT).join\ - (GetSplitValueList(CommentLines, END_OF_LINE)) + END_OF_LINE - return CommentStr - ## GenGenericCommentF # # similar to GenGenericComment but will remove at end of comment once, @@ -162,57 +150,6 @@ def GenHeaderCommentSection(Abstract, Description, Copyright, License, IsBinaryH return Content - -## GenInfPcdTailComment -# Generate Pcd tail comment for Inf, this would be one line comment -# -# @param Usage: Usage type -# @param TailCommentText: Comment text for tail comment -# -def GenInfPcdTailComment (Usage, TailCommentText): - if (Usage == ITEM_UNDEFINED) and (not TailCommentText): - return '' - - CommentLine = TAB_SPACE_SPLIT.join([Usage, TailCommentText]) - return GenTailCommentLines(CommentLine) - -## GenInfProtocolPPITailComment -# Generate Protocol/PPI tail comment for Inf -# -# @param Usage: Usage type -# @param TailCommentText: Comment text for tail comment -# -def GenInfProtocolPPITailComment (Usage, Notify, TailCommentText): - if (not Notify) and (Usage == ITEM_UNDEFINED) and (not TailCommentText): - return '' - - if Notify: - CommentLine = USAGE_ITEM_NOTIFY + " ## " - else: - CommentLine = '' - - CommentLine += TAB_SPACE_SPLIT.join([Usage, TailCommentText]) - return GenTailCommentLines(CommentLine) - -## GenInfGuidTailComment -# Generate Guid tail comment for Inf -# -# @param Usage: Usage type -# @param TailCommentText: Comment text for tail comment -# -def GenInfGuidTailComment (Usage, GuidTypeList, VariableName, TailCommentText): - GuidType = GuidTypeList[0] - if (Usage == ITEM_UNDEFINED) and (GuidType == ITEM_UNDEFINED) and \ - (not TailCommentText): - return '' - - FirstLine = Usage + " ## " + GuidType - if GuidType == TAB_INF_GUIDTYPE_VAR: - FirstLine += ":" + VariableName - - CommentLine = TAB_SPACE_SPLIT.join([FirstLine, TailCommentText]) - return GenTailCommentLines(CommentLine) - ## GenDecGuidTailComment # # @param SupModuleList: Supported module type list diff --git a/BaseTools/Source/Python/UPT/Library/Misc.py b/BaseTools/Source/Python/UPT/Library/Misc.py index f3688de4b1b7..554d1ec350e2 100644 --- a/BaseTools/Source/Python/UPT/Library/Misc.py +++ b/BaseTools/Source/Python/UPT/Library/Misc.py @@ -495,41 +495,6 @@ def IsAllModuleList(ModuleList): else: return True -## Dictionary that use comment(GenericComment, TailComment) as value, -# if a new comment which key already in the dic is inserted, then the -# comment will be merged. -# Key is (Statement, SupArch), when TailComment is added, it will ident -# according to Statement -# -class MergeCommentDict(dict): - ## []= operator - # - def __setitem__(self, Key, CommentVal): - GenericComment, TailComment = CommentVal - if Key in self: - OrigVal1, OrigVal2 = dict.__getitem__(self, Key) - Statement = Key[0] - dict.__setitem__(self, Key, (OrigVal1 + GenericComment, OrigVal2 \ - + len(Statement) * ' ' + TailComment)) - else: - dict.__setitem__(self, Key, (GenericComment, TailComment)) - - ## =[] operator - # - def __getitem__(self, Key): - return dict.__getitem__(self, Key) - - -## GenDummyHelpTextObj -# -# @retval HelpTxt: Generated dummy help text object -# -def GenDummyHelpTextObj(): - HelpTxt = TextObject() - HelpTxt.SetLang(TAB_LANGUAGE_EN_US) - HelpTxt.SetString(' ') - return HelpTxt - ## ConvertVersionToDecimal, the minor version should be within 0 - 99 # ::= "0x" # ::= (a-fA-F0-9){4} diff --git a/BaseTools/Source/Python/UPT/Library/ParserValidate.py b/BaseTools/Source/Python/UPT/Library/ParserValidate.py index edb0c6275aef..cfa51e7a3c3d 100644 --- a/BaseTools/Source/Python/UPT/Library/ParserValidate.py +++ b/BaseTools/Source/Python/UPT/Library/ParserValidate.py @@ -103,43 +103,6 @@ def IsValidInfMoudleType(ModuleType): else: return False -## Is Valid Component Type or not -# -# @param ComponentType: A string contain ComponentType need to be judged. -# -def IsValidInfComponentType(ComponentType): - if ComponentType.upper() in COMPONENT_TYPE_LIST: - return True - else: - return False - - -## Is valid Tool Family or not -# -# @param ToolFamily: A string contain Tool Family need to be judged. -# Family := [A-Z]([a-zA-Z0-9])* -# -def IsValidToolFamily(ToolFamily): - ReIsValidFamily = re.compile(r"^[A-Z]+[A-Za-z0-9]{0,}$", re.DOTALL) - if ReIsValidFamily.match(ToolFamily) is None: - return False - return True - -## Is valid Tool TagName or not -# -# The TagName sample is MYTOOLS and VS2005. -# -# @param TagName: A string contain Tool TagName need to be judged. -# -def IsValidToolTagName(TagName): - if TagName.strip() == '': - return True - if TagName.strip() == '*': - return True - if not IsValidWord(TagName): - return False - return True - ## Is valid arch or not # # @param Arch The arch string need to be validated @@ -455,37 +418,6 @@ def IsValidHexVersion(Word): return True -## IsValidBuildNumber -# -# Check whether the BUILD_NUMBER is valid. -# ["BUILD_NUMBER" "=" {1,4} ] -# -# @param Word: The BUILD_NUMBER string need to be checked. -# -def IsValidBuildNumber(Word): - ReIsValieBuildNumber = re.compile(r"[0-9]{1,4}$", re.DOTALL) - if ReIsValieBuildNumber.match(Word) is None: - return False - - return True - -## IsValidDepex -# -# Check whether the Depex is valid. -# -# @param Word: The Depex string need to be checked. -# -def IsValidDepex(Word): - Index = Word.upper().find("PUSH") - if Index > -1: - return IsValidCFormatGuid(Word[Index+4:].strip()) - - ReIsValidCName = re.compile(r"^[A-Za-z_][0-9A-Za-z_\s\.]*$", re.DOTALL) - if ReIsValidCName.match(Word) is None: - return False - - return True - ## IsValidNormalizedString # # Check @@ -532,25 +464,6 @@ def IsValidIdString(String): return False -## IsValidVersionString -# -# Check whether the VersionString is valid. -# ::= [ []{0,} []{0,} ] {0,} -# ::= {} {} -# ::= 0x09 -# ::= 0x20 -# ::= (0x21 - 0x7E) -# -# @param VersionString: The VersionString need to be checked. -# -def IsValidVersionString(VersionString): - VersionString = VersionString.strip() - for Char in VersionString: - if not (Char >= 0x21 and Char <= 0x7E): - return False - - return True - ## IsValidPcdValue # # Check whether the PcdValue is valid. @@ -714,13 +627,3 @@ def IsValidUserId(UserId): if Char == '.' and not Quoted: return False return True - -# -# Check if a UTF16-LE file has a BOM header -# -def CheckUTF16FileHeader(File): - FileIn = open(File, 'rb').read(2) - if FileIn != b'\xff\xfe': - return False - - return True diff --git a/BaseTools/Source/Python/UPT/Library/Parsing.py b/BaseTools/Source/Python/UPT/Library/Parsing.py index 6fb133745e36..5f2a448adab9 100644 --- a/BaseTools/Source/Python/UPT/Library/Parsing.py +++ b/BaseTools/Source/Python/UPT/Library/Parsing.py @@ -41,29 +41,6 @@ gPKG_INFO_DICT = {} -## GetBuildOption -# -# Parse a string with format "[:]=Flag" -# Return (Family, ToolFlag, Flag) -# -# @param String: String with BuildOption statement -# @param File: The file which defines build option, used in error report -# -def GetBuildOption(String, File, LineNo= -1): - (Family, ToolChain, Flag) = ('', '', '') - if String.find(DataType.TAB_EQUAL_SPLIT) < 0: - RaiseParserError(String, 'BuildOptions', File, \ - '[:]=Flag', LineNo) - else: - List = GetSplitValueList(String, DataType.TAB_EQUAL_SPLIT, MaxSplit=1) - if List[0].find(':') > -1: - Family = List[0][ : List[0].find(':')].strip() - ToolChain = List[0][List[0].find(':') + 1 : ].strip() - else: - ToolChain = List[0].strip() - Flag = List[1].strip() - return (Family, ToolChain, Flag) - ## Get Library Class # # Get Library of Dsc as | @@ -88,37 +65,6 @@ def GetLibraryClass(Item, ContainerFile, WorkspaceDir, LineNo= -1): return (List[0], List[1], SupMod) -## Get Library Class -# -# Get Library of Dsc as [|] -# [|.] -# -# @param Item: String as | -# @param ContainerFile: The file which describes the library class, used for -# error report -# -def GetLibraryClassOfInf(Item, ContainerFile, WorkspaceDir, LineNo= -1): - ItemList = GetSplitValueList((Item[0] + DataType.TAB_VALUE_SPLIT * 2)) - SupMod = DataType.SUP_MODULE_LIST_STRING - - if len(ItemList) > 5: - RaiseParserError\ - (Item[0], 'LibraryClasses', ContainerFile, \ - '[|]\ - [|.]') - else: - CheckFileType(ItemList[1], '.Inf', ContainerFile, 'LibraryClasses', \ - Item[0], LineNo) - CheckFileExist(WorkspaceDir, ItemList[1], ContainerFile, \ - 'LibraryClasses', Item[0], LineNo) - if ItemList[2] != '': - CheckPcdTokenInfo(ItemList[2], 'LibraryClasses', \ - ContainerFile, LineNo) - if Item[1] != '': - SupMod = Item[1] - - return (ItemList[0], ItemList[1], ItemList[2], SupMod) - ## CheckPcdTokenInfo # # Check if PcdTokenInfo is following . @@ -136,414 +82,6 @@ def CheckPcdTokenInfo(TokenInfoString, Section, File, LineNo= -1): RaiseParserError(TokenInfoString, Section, File, Format, LineNo) -## Get Pcd -# -# Get Pcd of Dsc as .| -# [||] -# -# @param Item: String as .| -# [||] -# @param ContainerFile: The file which describes the pcd, used for error -# report - -# -def GetPcd(Item, Type, ContainerFile, LineNo= -1): - TokenGuid, TokenName, Value, MaximumDatumSize, Token = '', '', '', '', '' - List = GetSplitValueList(Item + DataType.TAB_VALUE_SPLIT * 2) - - if len(List) < 4 or len(List) > 6: - RaiseParserError(Item, 'Pcds' + Type, ContainerFile, \ - '.|\ - [||]', LineNo) - else: - Value = List[1] - MaximumDatumSize = List[2] - Token = List[3] - - if CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo): - (TokenGuid, TokenName) = GetSplitValueList(List[0], DataType.TAB_SPLIT) - - return (TokenName, TokenGuid, Value, MaximumDatumSize, Token, Type) - -## Get FeatureFlagPcd -# -# Get FeatureFlagPcd of Dsc as .|TRUE/FALSE -# -# @param Item: String as -# .|TRUE/FALSE -# @param ContainerFile: The file which describes the pcd, used for error -# report -# -def GetFeatureFlagPcd(Item, Type, ContainerFile, LineNo= -1): - TokenGuid, TokenName, Value = '', '', '' - List = GetSplitValueList(Item) - if len(List) != 2: - RaiseParserError(Item, 'Pcds' + Type, ContainerFile, \ - '.|TRUE/FALSE', \ - LineNo) - else: - Value = List[1] - if CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo): - (TokenGuid, TokenName) = GetSplitValueList(List[0], DataType.TAB_SPLIT) - - return (TokenName, TokenGuid, Value, Type) - -## Get DynamicDefaultPcd -# -# Get DynamicDefaultPcd of Dsc as . -# |[|[|]] -# -# @param Item: String as .| -# TRUE/FALSE -# @param ContainerFile: The file which describes the pcd, used for error -# report -# -def GetDynamicDefaultPcd(Item, Type, ContainerFile, LineNo= -1): - TokenGuid, TokenName, Value, DatumTyp, MaxDatumSize = '', '', '', '', '' - List = GetSplitValueList(Item + DataType.TAB_VALUE_SPLIT * 2) - if len(List) < 4 or len(List) > 8: - RaiseParserError(Item, 'Pcds' + Type, ContainerFile, \ - '.|\ - [|[|]]', LineNo) - else: - Value = List[1] - DatumTyp = List[2] - MaxDatumSize = List[3] - if CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo): - (TokenGuid, TokenName) = GetSplitValueList(List[0], DataType.TAB_SPLIT) - - return (TokenName, TokenGuid, Value, DatumTyp, MaxDatumSize, Type) - -## Get DynamicHiiPcd -# -# Get DynamicHiiPcd of Dsc as .|| -# |[|[|]] -# -# @param Item: String as .| -# TRUE/FALSE -# @param ContainerFile: The file which describes the pcd, used for error -# report -# -def GetDynamicHiiPcd(Item, Type, ContainerFile, LineNo= -1): - TokenGuid, TokenName, List1, List2, List3, List4, List5 = \ - '', '', '', '', '', '', '' - List = GetSplitValueList(Item + DataType.TAB_VALUE_SPLIT * 2) - if len(List) < 6 or len(List) > 8: - RaiseParserError(Item, 'Pcds' + Type, ContainerFile, \ - '.||\ - |[|\ - [|]]', LineNo) - else: - List1, List2, List3, List4, List5 = \ - List[1], List[2], List[3], List[4], List[5] - if CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo): - (TokenGuid, TokenName) = GetSplitValueList(List[0], DataType.TAB_SPLIT) - - return (TokenName, TokenGuid, List1, List2, List3, List4, List5, Type) - -## Get DynamicVpdPcd -# -# Get DynamicVpdPcd of Dsc as .| -# [|] -# -# @param Item: String as . -# |TRUE/FALSE -# @param ContainerFile: The file which describes the pcd, used for error -# report -# -def GetDynamicVpdPcd(Item, Type, ContainerFile, LineNo= -1): - TokenGuid, TokenName, List1, List2 = '', '', '', '' - List = GetSplitValueList(Item + DataType.TAB_VALUE_SPLIT) - if len(List) < 3 or len(List) > 4: - RaiseParserError(Item, 'Pcds' + Type, ContainerFile, \ - '.|\ - [|]', LineNo) - else: - List1, List2 = List[1], List[2] - if CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo): - (TokenGuid, TokenName) = GetSplitValueList(List[0], DataType.TAB_SPLIT) - - return (TokenName, TokenGuid, List1, List2, Type) - -## GetComponent -# -# Parse block of the components defined in dsc file -# Set KeyValues as [ ['component name', [lib1, lib2, lib3], -# [bo1, bo2, bo3], [pcd1, pcd2, pcd3]], ...] -# -# @param Lines: The content to be parsed -# @param KeyValues: To store data after parsing -# -def GetComponent(Lines, KeyValues): - (FindBlock, FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \ - FindPcdsPatchableInModule, FindPcdsFixedAtBuild, FindPcdsDynamic, \ - FindPcdsDynamicEx) = (False, False, False, False, False, False, False, \ - False) - ListItem = None - LibraryClassItem = [] - BuildOption = [] - Pcd = [] - - for Line in Lines: - Line = Line[0] - # - # Ignore !include statement - # - if Line.upper().find(DataType.TAB_INCLUDE.upper() + ' ') > -1 or \ - Line.upper().find(DataType.TAB_DEFINE + ' ') > -1: - continue - - if FindBlock == False: - ListItem = Line - # - # find '{' at line tail - # - if Line.endswith('{'): - FindBlock = True - ListItem = CleanString(Line.rsplit('{', 1)[0], \ - DataType.TAB_COMMENT_SPLIT) - - # - # Parse a block content - # - if FindBlock: - if Line.find('') != -1: - (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \ - FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \ - FindPcdsDynamic, FindPcdsDynamicEx) = \ - (True, False, False, False, False, False, False) - continue - if Line.find('') != -1: - (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \ - FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \ - FindPcdsDynamic, FindPcdsDynamicEx) = \ - (False, True, False, False, False, False, False) - continue - if Line.find('') != -1: - (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \ - FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \ - FindPcdsDynamic, FindPcdsDynamicEx) = \ - (False, False, True, False, False, False, False) - continue - if Line.find('') != -1: - (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \ - FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \ - FindPcdsDynamic, FindPcdsDynamicEx) = \ - (False, False, False, True, False, False, False) - continue - if Line.find('') != -1: - (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \ - FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \ - FindPcdsDynamic, FindPcdsDynamicEx) = \ - (False, False, False, False, True, False, False) - continue - if Line.find('') != -1: - (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \ - FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \ - FindPcdsDynamic, FindPcdsDynamicEx) = \ - (False, False, False, False, False, True, False) - continue - if Line.find('') != -1: - (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \ - FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \ - FindPcdsDynamic, FindPcdsDynamicEx) = \ - (False, False, False, False, False, False, True) - continue - if Line.endswith('}'): - # - # find '}' at line tail - # - KeyValues.append([ListItem, LibraryClassItem, \ - BuildOption, Pcd]) - (FindBlock, FindLibraryClass, FindBuildOption, \ - FindPcdsFeatureFlag, FindPcdsPatchableInModule, \ - FindPcdsFixedAtBuild, FindPcdsDynamic, FindPcdsDynamicEx) = \ - (False, False, False, False, False, False, False, False) - LibraryClassItem, BuildOption, Pcd = [], [], [] - continue - - if FindBlock: - if FindLibraryClass: - LibraryClassItem.append(Line) - elif FindBuildOption: - BuildOption.append(Line) - elif FindPcdsFeatureFlag: - Pcd.append((DataType.TAB_PCDS_FEATURE_FLAG_NULL, Line)) - elif FindPcdsPatchableInModule: - Pcd.append((DataType.TAB_PCDS_PATCHABLE_IN_MODULE_NULL, Line)) - elif FindPcdsFixedAtBuild: - Pcd.append((DataType.TAB_PCDS_FIXED_AT_BUILD_NULL, Line)) - elif FindPcdsDynamic: - Pcd.append((DataType.TAB_PCDS_DYNAMIC_DEFAULT_NULL, Line)) - elif FindPcdsDynamicEx: - Pcd.append((DataType.TAB_PCDS_DYNAMIC_EX_DEFAULT_NULL, Line)) - else: - KeyValues.append([ListItem, [], [], []]) - - return True - -## GetExec -# -# Parse a string with format "InfFilename [EXEC = ExecFilename]" -# Return (InfFilename, ExecFilename) -# -# @param String: String with EXEC statement -# -def GetExec(String): - InfFilename = '' - ExecFilename = '' - if String.find('EXEC') > -1: - InfFilename = String[ : String.find('EXEC')].strip() - ExecFilename = String[String.find('EXEC') + len('EXEC') : ].strip() - else: - InfFilename = String.strip() - - return (InfFilename, ExecFilename) - -## GetComponents -# -# Parse block of the components defined in dsc file -# Set KeyValues as [ ['component name', [lib1, lib2, lib3], [bo1, bo2, bo3], -# [pcd1, pcd2, pcd3]], ...] -# -# @param Lines: The content to be parsed -# @param Key: Reserved -# @param KeyValues: To store data after parsing -# @param CommentCharacter: Comment char, used to ignore comment content -# -# @retval True Get component successfully -# -def GetComponents(Lines, KeyValues, CommentCharacter): - if Lines.find(DataType.TAB_SECTION_END) > -1: - Lines = Lines.split(DataType.TAB_SECTION_END, 1)[1] - (FindBlock, FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \ - FindPcdsPatchableInModule, FindPcdsFixedAtBuild, FindPcdsDynamic, \ - FindPcdsDynamicEx) = \ - (False, False, False, False, False, False, False, False) - ListItem = None - LibraryClassItem = [] - BuildOption = [] - Pcd = [] - - LineList = Lines.split('\n') - for Line in LineList: - Line = CleanString(Line, CommentCharacter) - if Line is None or Line == '': - continue - - if FindBlock == False: - ListItem = Line - # - # find '{' at line tail - # - if Line.endswith('{'): - FindBlock = True - ListItem = CleanString(Line.rsplit('{', 1)[0], CommentCharacter) - - # - # Parse a block content - # - if FindBlock: - if Line.find('') != -1: - (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \ - FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \ - FindPcdsDynamic, FindPcdsDynamicEx) = \ - (True, False, False, False, False, False, False) - continue - if Line.find('') != -1: - (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \ - FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \ - FindPcdsDynamic, FindPcdsDynamicEx) = \ - (False, True, False, False, False, False, False) - continue - if Line.find('') != -1: - (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \ - FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \ - FindPcdsDynamic, FindPcdsDynamicEx) = \ - (False, False, True, False, False, False, False) - continue - if Line.find('') != -1: - (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \ - FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \ - FindPcdsDynamic, FindPcdsDynamicEx) = \ - (False, False, False, True, False, False, False) - continue - if Line.find('') != -1: - (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \ - FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \ - FindPcdsDynamic, FindPcdsDynamicEx) = \ - (False, False, False, False, True, False, False) - continue - if Line.find('') != -1: - (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \ - FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \ - FindPcdsDynamic, FindPcdsDynamicEx) = \ - (False, False, False, False, False, True, False) - continue - if Line.find('') != -1: - (FindLibraryClass, FindBuildOption, FindPcdsFeatureFlag, \ - FindPcdsPatchableInModule, FindPcdsFixedAtBuild, \ - FindPcdsDynamic, FindPcdsDynamicEx) = \ - (False, False, False, False, False, False, True) - continue - if Line.endswith('}'): - # - # find '}' at line tail - # - KeyValues.append([ListItem, LibraryClassItem, BuildOption, \ - Pcd]) - (FindBlock, FindLibraryClass, FindBuildOption, \ - FindPcdsFeatureFlag, FindPcdsPatchableInModule, \ - FindPcdsFixedAtBuild, FindPcdsDynamic, FindPcdsDynamicEx) = \ - (False, False, False, False, False, False, False, False) - LibraryClassItem, BuildOption, Pcd = [], [], [] - continue - - if FindBlock: - if FindLibraryClass: - LibraryClassItem.append(Line) - elif FindBuildOption: - BuildOption.append(Line) - elif FindPcdsFeatureFlag: - Pcd.append((DataType.TAB_PCDS_FEATURE_FLAG, Line)) - elif FindPcdsPatchableInModule: - Pcd.append((DataType.TAB_PCDS_PATCHABLE_IN_MODULE, Line)) - elif FindPcdsFixedAtBuild: - Pcd.append((DataType.TAB_PCDS_FIXED_AT_BUILD, Line)) - elif FindPcdsDynamic: - Pcd.append((DataType.TAB_PCDS_DYNAMIC, Line)) - elif FindPcdsDynamicEx: - Pcd.append((DataType.TAB_PCDS_DYNAMIC_EX, Line)) - else: - KeyValues.append([ListItem, [], [], []]) - - return True - -## Get Source -# -# Get Source of Inf as [|[|[| -# [|]]]] -# -# @param Item: String as [|[|[| -# [|]]]] -# @param ContainerFile: The file which describes the library class, used -# for error report -# -def GetSource(Item, ContainerFile, FileRelativePath, LineNo= -1): - ItemNew = Item + DataType.TAB_VALUE_SPLIT * 4 - List = GetSplitValueList(ItemNew) - if len(List) < 5 or len(List) > 9: - RaiseParserError(Item, 'Sources', ContainerFile, \ - '[|[|[|\ - [|]]]]', LineNo) - List[0] = NormPath(List[0]) - CheckFileExist(FileRelativePath, List[0], ContainerFile, 'Sources', \ - Item, LineNo) - if List[4] != '': - CheckPcdTokenInfo(List[4], 'Sources', ContainerFile, LineNo) - - return (List[0], List[1], List[2], List[3], List[4]) - ## Get Binary # # Get Binary of Inf as [|[|[| @@ -569,51 +107,6 @@ def GetBinary(Item, ContainerFile, LineNo= -1): elif len(List) == 3: return (List[0], List[1], List[2], '') -## Get Guids/Protocols/Ppis -# -# Get Guids/Protocols/Ppis of Inf as [|] -# -# @param Item: String as [|] -# @param Type: Type of parsing string -# @param ContainerFile: The file which describes the library class, -# used for error report -# -def GetGuidsProtocolsPpisOfInf(Item): - ItemNew = Item + DataType.TAB_VALUE_SPLIT - List = GetSplitValueList(ItemNew) - return (List[0], List[1]) - -## Get Guids/Protocols/Ppis -# -# Get Guids/Protocols/Ppis of Dec as = -# -# @param Item: String as = -# @param Type: Type of parsing string -# @param ContainerFile: The file which describes the library class, -# used for error report -# -def GetGuidsProtocolsPpisOfDec(Item, Type, ContainerFile, LineNo= -1): - List = GetSplitValueList(Item, DataType.TAB_EQUAL_SPLIT) - if len(List) != 2: - RaiseParserError(Item, Type, ContainerFile, '=', \ - LineNo) - # - #convert C-Format Guid to Register Format - # - if List[1][0] == '{' and List[1][-1] == '}': - RegisterFormatGuid = GuidStructureStringToGuidString(List[1]) - if RegisterFormatGuid == '': - RaiseParserError(Item, Type, ContainerFile, \ - 'CFormat or RegisterFormat', LineNo) - else: - if CheckGuidRegFormat(List[1]): - RegisterFormatGuid = List[1] - else: - RaiseParserError(Item, Type, ContainerFile, \ - 'CFormat or RegisterFormat', LineNo) - - return (List[0], RegisterFormatGuid) - ## GetPackage # # Get Package of Inf as [|] @@ -634,70 +127,6 @@ def GetPackage(Item, ContainerFile, FileRelativePath, LineNo= -1): return (List[0], List[1]) -## Get Pcd Values of Inf -# -# Get Pcd of Inf as .[|] -# -# @param Item: The string describes pcd -# @param Type: The type of Pcd -# @param File: The file which describes the pcd, used for error report -# -def GetPcdOfInf(Item, Type, File, LineNo): - Format = '.[|]' - TokenGuid, TokenName, Value, InfType = '', '', '', '' - - if Type == DataType.TAB_PCDS_FIXED_AT_BUILD: - InfType = DataType.TAB_INF_FIXED_PCD - elif Type == DataType.TAB_PCDS_PATCHABLE_IN_MODULE: - InfType = DataType.TAB_INF_PATCH_PCD - elif Type == DataType.TAB_PCDS_FEATURE_FLAG: - InfType = DataType.TAB_INF_FEATURE_PCD - elif Type == DataType.TAB_PCDS_DYNAMIC_EX: - InfType = DataType.TAB_INF_PCD_EX - elif Type == DataType.TAB_PCDS_DYNAMIC: - InfType = DataType.TAB_INF_PCD - List = GetSplitValueList(Item, DataType.TAB_VALUE_SPLIT, 1) - TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT) - if len(TokenInfo) != 2: - RaiseParserError(Item, InfType, File, Format, LineNo) - else: - TokenGuid = TokenInfo[0] - TokenName = TokenInfo[1] - - if len(List) > 1: - Value = List[1] - else: - Value = None - return (TokenGuid, TokenName, Value, InfType) - - -## Get Pcd Values of Dec -# -# Get Pcd of Dec as .||| -# @param Item: Pcd item -# @param Type: Pcd type -# @param File: Dec file -# @param LineNo: Line number -# -def GetPcdOfDec(Item, Type, File, LineNo= -1): - Format = '.|||' - TokenGuid, TokenName, Value, DatumType, Token = '', '', '', '', '' - List = GetSplitValueList(Item) - if len(List) != 4: - RaiseParserError(Item, 'Pcds' + Type, File, Format, LineNo) - else: - Value = List[1] - DatumType = List[2] - Token = List[3] - TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT) - if len(TokenInfo) != 2: - RaiseParserError(Item, 'Pcds' + Type, File, Format, LineNo) - else: - TokenGuid = TokenInfo[0] - TokenName = TokenInfo[1] - - return (TokenGuid, TokenName, Value, DatumType, Token, Type) - ## Parse DEFINE statement # # Get DEFINE macros @@ -725,60 +154,6 @@ def ParseDefine(LineValue, StartLine, Table, FileID, SectionName, \ '', '', Arch, SectionModel, FileID, StartLine, -1, \ StartLine, -1, 0) -## InsertSectionItems -# -# Insert item data of a section to a dict -# -# @param Model: A model -# @param CurrentSection: Current section -# @param SectionItemList: Section item list -# @param ArchList: Arch list -# @param ThirdList: Third list -# @param RecordSet: Record set -# -def InsertSectionItems(Model, SectionItemList, ArchList, \ - ThirdList, RecordSet): - # - # Insert each item data of a section - # - for Index in range(0, len(ArchList)): - Arch = ArchList[Index] - Third = ThirdList[Index] - if Arch == '': - Arch = DataType.TAB_ARCH_COMMON - - Records = RecordSet[Model] - for SectionItem in SectionItemList: - LineValue, StartLine, Comment = SectionItem[0], \ - SectionItem[1], SectionItem[2] - - Logger.Debug(4, ST.MSG_PARSING % LineValue) - # - # And then parse DEFINE statement - # - if LineValue.upper().find(DataType.TAB_DEFINE.upper() + ' ') > -1: - continue - # - # At last parse other sections - # - IdNum = -1 - Records.append([LineValue, Arch, StartLine, IdNum, Third, Comment]) - - if RecordSet != {}: - RecordSet[Model] = Records - -## GenMetaDatSectionItem -# -# @param Key: A key -# @param Value: A value -# @param List: A list -# -def GenMetaDatSectionItem(Key, Value, List): - if Key not in List: - List[Key] = [Value] - else: - List[Key].append(Value) - ## GetPkgInfoFromDec # # get package name, guid, version info from dec files diff --git a/BaseTools/Source/Python/UPT/Library/StringUtils.py b/BaseTools/Source/Python/UPT/Library/StringUtils.py index a6f47d0dd79b..fa6c12149811 100644 --- a/BaseTools/Source/Python/UPT/Library/StringUtils.py +++ b/BaseTools/Source/Python/UPT/Library/StringUtils.py @@ -75,50 +75,6 @@ def GenDefines(String, Arch, Defines): return -1 return 1 -## GetLibraryClassesWithModuleType -# -# Get Library Class definition when no module type defined -# -# @param Lines: The content to be parsed -# @param Key: Reserved -# @param KeyValues: To store data after parsing -# @param CommentCharacter: Comment char, used to ignore comment content -# -def GetLibraryClassesWithModuleType(Lines, Key, KeyValues, CommentCharacter): - NewKey = SplitModuleType(Key) - Lines = Lines.split(DataType.TAB_SECTION_END, 1)[1] - LineList = Lines.splitlines() - for Line in LineList: - Line = CleanString(Line, CommentCharacter) - if Line != '' and Line[0] != CommentCharacter: - KeyValues.append([CleanString(Line, CommentCharacter), NewKey[1]]) - - return True - -## GetDynamics -# -# Get Dynamic Pcds -# -# @param Lines: The content to be parsed -# @param Key: Reserved -# @param KeyValues: To store data after parsing -# @param CommentCharacter: Comment char, used to ignore comment content -# -def GetDynamics(Lines, Key, KeyValues, CommentCharacter): - # - # Get SkuId Name List - # - SkuIdNameList = SplitModuleType(Key) - - Lines = Lines.split(DataType.TAB_SECTION_END, 1)[1] - LineList = Lines.splitlines() - for Line in LineList: - Line = CleanString(Line, CommentCharacter) - if Line != '' and Line[0] != CommentCharacter: - KeyValues.append([CleanString(Line, CommentCharacter), SkuIdNameList[1]]) - - return True - ## SplitModuleType # # Split ModuleType out of section defien to get key @@ -337,29 +293,6 @@ def CleanString2(Line, CommentCharacter=DataType.TAB_COMMENT_SPLIT, AllowCppStyl return Line, Comment -## GetMultipleValuesOfKeyFromLines -# -# Parse multiple strings to clean comment and spaces -# The result is saved to KeyValues -# -# @param Lines: The content to be parsed -# @param Key: Reserved -# @param KeyValues: To store data after parsing -# @param CommentCharacter: Comment char, used to ignore comment content -# -def GetMultipleValuesOfKeyFromLines(Lines, Key, KeyValues, CommentCharacter): - if Key: - pass - if KeyValues: - pass - Lines = Lines.split(DataType.TAB_SECTION_END, 1)[1] - LineList = Lines.split('\n') - for Line in LineList: - Line = CleanString(Line, CommentCharacter) - if Line != '' and Line[0] != CommentCharacter: - KeyValues += [Line] - return True - ## GetDefineValue # # Parse a DEFINE statement to get defined value @@ -375,133 +308,6 @@ def GetDefineValue(String, Key, CommentCharacter): String = CleanString(String) return String[String.find(Key + ' ') + len(Key + ' ') : ] -## GetSingleValueOfKeyFromLines -# -# Parse multiple strings as below to get value of each definition line -# Key1 = Value1 -# Key2 = Value2 -# The result is saved to Dictionary -# -# @param Lines: The content to be parsed -# @param Dictionary: To store data after parsing -# @param CommentCharacter: Comment char, be used to ignore comment content -# @param KeySplitCharacter: Key split char, between key name and key value. -# Key1 = Value1, '=' is the key split char -# @param ValueSplitFlag: Value split flag, be used to decide if has -# multiple values -# @param ValueSplitCharacter: Value split char, be used to split multiple -# values. Key1 = Value1|Value2, '|' is the value -# split char -# -def GetSingleValueOfKeyFromLines(Lines, Dictionary, CommentCharacter, KeySplitCharacter, \ - ValueSplitFlag, ValueSplitCharacter): - Lines = Lines.split('\n') - Keys = [] - Value = '' - DefineValues = [''] - SpecValues = [''] - - for Line in Lines: - # - # Handle DEFINE and SPEC - # - if Line.find(DataType.TAB_INF_DEFINES_DEFINE + ' ') > -1: - if '' in DefineValues: - DefineValues.remove('') - DefineValues.append(GetDefineValue(Line, DataType.TAB_INF_DEFINES_DEFINE, CommentCharacter)) - continue - if Line.find(DataType.TAB_INF_DEFINES_SPEC + ' ') > -1: - if '' in SpecValues: - SpecValues.remove('') - SpecValues.append(GetDefineValue(Line, DataType.TAB_INF_DEFINES_SPEC, CommentCharacter)) - continue - - # - # Handle Others - # - LineList = Line.split(KeySplitCharacter, 1) - if len(LineList) >= 2: - Key = LineList[0].split() - if len(Key) == 1 and Key[0][0] != CommentCharacter: - # - # Remove comments and white spaces - # - LineList[1] = CleanString(LineList[1], CommentCharacter) - if ValueSplitFlag: - Value = list(map(lambda x: x.strip(), LineList[1].split(ValueSplitCharacter))) - else: - Value = CleanString(LineList[1], CommentCharacter).splitlines() - - if Key[0] in Dictionary: - if Key[0] not in Keys: - Dictionary[Key[0]] = Value - Keys.append(Key[0]) - else: - Dictionary[Key[0]].extend(Value) - else: - Dictionary[DataType.TAB_INF_DEFINES_MACRO][Key[0]] = Value[0] - - if DefineValues == []: - DefineValues = [''] - if SpecValues == []: - SpecValues = [''] - Dictionary[DataType.TAB_INF_DEFINES_DEFINE] = DefineValues - Dictionary[DataType.TAB_INF_DEFINES_SPEC] = SpecValues - - return True - -## The content to be parsed -# -# Do pre-check for a file before it is parsed -# Check $() -# Check [] -# -# @param FileName: Used for error report -# @param FileContent: File content to be parsed -# @param SupSectionTag: Used for error report -# -def PreCheck(FileName, FileContent, SupSectionTag): - if SupSectionTag: - pass - LineNo = 0 - IsFailed = False - NewFileContent = '' - for Line in FileContent.splitlines(): - LineNo = LineNo + 1 - # - # Clean current line - # - Line = CleanString(Line) - # - # Remove commented line - # - if Line.find(DataType.TAB_COMMA_SPLIT) == 0: - Line = '' - # - # Check $() - # - if Line.find('$') > -1: - if Line.find('$(') < 0 or Line.find(')') < 0: - Logger.Error("Parser", FORMAT_INVALID, Line=LineNo, File=FileName, RaiseError=Logger.IS_RAISE_ERROR) - # - # Check [] - # - if Line.find('[') > -1 or Line.find(']') > -1: - # - # Only get one '[' or one ']' - # - if not (Line.find('[') > -1 and Line.find(']') > -1): - Logger.Error("Parser", FORMAT_INVALID, Line=LineNo, File=FileName, RaiseError=Logger.IS_RAISE_ERROR) - # - # Regenerate FileContent - # - NewFileContent = NewFileContent + Line + '\r\n' - - if IsFailed: - Logger.Error("Parser", FORMAT_INVALID, Line=LineNo, File=FileName, RaiseError=Logger.IS_RAISE_ERROR) - - return NewFileContent - ## CheckFileType # # Check if the Filename is including ExtName @@ -666,20 +472,6 @@ def GetHelpTextList(HelpTextClassList): List.extend(HelpText.String.split('\n')) return List -## Get String Array Length -# -# Get String Array Length -# -# @param String: the source string -# -def StringArrayLength(String): - if String.startswith('L"'): - return (len(String) - 3 + 1) * 2 - elif String.startswith('"'): - return (len(String) - 2 + 1) - else: - return len(String.split()) + 1 - ## RemoveDupOption # # Remove Dup Option @@ -707,27 +499,6 @@ def RemoveDupOption(OptionString, Which="/I", Against=None): ValueList.append(Val) return " ".join(OptionList) -## Check if the string is HexDgit -# -# Return true if all characters in the string are digits and there is at -# least one character -# or valid Hexs (started with 0x, following by hexdigit letters) -# , false otherwise. -# @param string: input string -# -def IsHexDigit(Str): - try: - int(Str, 10) - return True - except ValueError: - if len(Str) > 2 and Str.upper().startswith('0X'): - try: - int(Str, 16) - return True - except ValueError: - return False - return False - ## Check if the string is HexDgit and its integer value within limit of UINT32 # # Return true if all characters in the string are digits and there is at diff --git a/BaseTools/Source/Python/UPT/Library/UniClassObject.py b/BaseTools/Source/Python/UPT/Library/UniClassObject.py index 80924a6f2a9e..1e7ca70a76e7 100644 --- a/BaseTools/Source/Python/UPT/Library/UniClassObject.py +++ b/BaseTools/Source/Python/UPT/Library/UniClassObject.py @@ -74,18 +74,6 @@ 'wln':'wa', 'wol':'wo', 'xho':'xh', 'yid':'yi', 'yor':'yo', 'zha':'za', \ 'zho':'zh', 'zul':'zu'} -## Convert a python unicode string to a normal string -# -# Convert a python unicode string to a normal string -# UniToStr(u'I am a string') is 'I am a string' -# -# @param Uni: The python unicode string -# -# @retval: The formatted normal string -# -def UniToStr(Uni): - return repr(Uni)[2:-1] - ## Convert a unicode string to a Hex list # # Convert a unicode string to a Hex list @@ -224,7 +212,6 @@ def FormatUniEntry(StrTokenName, TokenValueList, ContainerFile): class StringDefClassObject(object): def __init__(self, Name = None, Value = None, Referenced = False, Token = None, UseOtherLangDef = ''): self.StringName = '' - self.StringNameByteList = [] self.StringValue = '' self.StringValueByteList = '' self.Token = 0 @@ -234,7 +221,6 @@ def __init__(self, Name = None, Value = None, Referenced = False, Token = None, if Name is not None: self.StringName = Name - self.StringNameByteList = UniToHexList(Name) if Value is not None: self.StringValue = Value self.StringValueByteList = UniToHexList(self.StringValue) @@ -371,15 +357,6 @@ def GetStringObject(self, Item): Language = GetLanguageCode(Language, self.IsCompatibleMode, self.File) self.AddStringToList(Name, Language, Value) - # - # Get include file list and load them - # - def GetIncludeFile(self, Item, Dir = None): - if Dir: - pass - FileName = Item[Item.find(u'!include ') + len(u'!include ') :Item.find(u' ', len(u'!include '))][1:-1] - self.LoadUniFile(FileName) - # # Pre-process before parse .uni file # @@ -941,26 +918,6 @@ def SetStringReferenced(self, Name): Item = self.OrderedStringList[Lang][ItemIndexInList] Item.Referenced = True - # - # Search the string in language definition by Name - # - def FindStringValue(self, Name, Lang): - if Name in self.OrderedStringDict[Lang]: - ItemIndexInList = self.OrderedStringDict[Lang][Name] - return self.OrderedStringList[Lang][ItemIndexInList] - - return None - - # - # Search the string in language definition by Token - # - def FindByToken(self, Token, Lang): - for Item in self.OrderedStringList[Lang]: - if Item.Token == Token: - return Item - - return None - # # Re-order strings and re-generate tokens # @@ -1015,25 +972,3 @@ def ShowMe(self): print(Item) for Member in self.OrderedStringList[Item]: print(str(Member)) - - # - # Read content from '!include' UNI file - # - def ReadIncludeUNIfile(self, FilaPath): - if self.File: - pass - - if not os.path.exists(FilaPath) or not os.path.isfile(FilaPath): - EdkLogger.Error("Unicode File Parser", - ToolError.FILE_NOT_FOUND, - ExtraData=FilaPath) - try: - FileIn = codecs.open(FilaPath, mode='rb', encoding='utf_8').readlines() - except UnicodeError as Xstr: - FileIn = codecs.open(FilaPath, mode='rb', encoding='utf_16').readlines() - except UnicodeError: - FileIn = codecs.open(FilaPath, mode='rb', encoding='utf_16_le').readlines() - except: - EdkLogger.Error("Unicode File Parser", ToolError.FILE_OPEN_FAILURE, ExtraData=FilaPath) - return FileIn - diff --git a/BaseTools/Source/Python/UPT/Library/Xml/XmlRoutines.py b/BaseTools/Source/Python/UPT/Library/Xml/XmlRoutines.py index 94e97fa45c12..b12999a72d02 100644 --- a/BaseTools/Source/Python/UPT/Library/Xml/XmlRoutines.py +++ b/BaseTools/Source/Python/UPT/Library/Xml/XmlRoutines.py @@ -150,33 +150,6 @@ def XmlElement2(Dom, String): except BaseException: return "" - -## Get a single XML element of the current node. -# -# Return a single XML element specified by the current root Dom. -# If the input Dom is not valid, then an empty string is returned. -# -# @param Dom The root XML DOM object. -# -def XmlElementData(Dom): - try: - return Dom.firstChild.data.strip() - except BaseException: - return "" - - -## Get a list of XML elements using XPath style syntax. -# -# Return a list of XML elements from the root Dom specified by XPath String. -# If the input Dom or String is not valid, then an empty list is returned. -# -# @param Dom The root XML DOM object. -# @param String A XPath style path. -# -def XmlElementList(Dom, String): - return list(map(XmlElementData, XmlList(Dom, String))) - - ## Get the XML attribute of the current node. # # Return a single XML attribute named Attribute from the current root Dom. @@ -191,20 +164,6 @@ def XmlAttribute(Dom, Attribute): except BaseException: return '' - -## Get the XML node name of the current node. -# -# Return a single XML node name from the current root Dom. -# If the input Dom is not valid, then an empty string is returned. -# -# @param Dom The root XML DOM object. -# -def XmlNodeName(Dom): - try: - return Dom.nodeName.strip() - except BaseException: - return '' - ## Parse an XML file. # # Parse the input XML file named FileName and return a XML DOM it stands for. From 2d6b8d5ac951ee432512ca28db41ce32d0616849 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 30 Apr 2025 14:45:13 +0200 Subject: [PATCH 0155/1172] BaseTools: WorkSpace: Remove unnecessary code Running the vulture tool on the WorkSpace folder gave the following report. Remove the unnecessary code. - Workspace/BuildClassObject.py:148: unused method 'IsSimpleTypeArray' (60% confidence) - Workspace/BuildClassObject.py:337: unused method 'SetPcdMode' (60% confidence) - Workspace/BuildClassObject.py:612: unused attribute 'DscSpecification' (60% confidence) - Workspace/DscBuildData.py:451: unused property 'DscSpecification' (60% confidence) - Workspace/DscBuildData.py:1253: unused method 'GetBuildOptionsByPkg' (60% confidence) - Workspace/DscBuildData.py:2064: unused method 'GetStarNum' (60% confidence) - Workspace/DscBuildData.py:3613: unused method 'AddModule' (60% confidence) - Workspace/DscBuildData.py:3650: unused method 'AddPcd' (60% confidence) - Workspace/InfBuildData.py:117: unused attribute '_TailComments' (60% confidence) - Workspace/InfBuildData.py:126: unused attribute '_BinaryModule' (60% confidence) - Workspace/MetaDataTable.py:114: unused method 'IsIntegral' (60% confidence) - Workspace/MetaDataTable.py:218: unused method 'GetFileTimeStamp' (60% confidence) - Workspace/MetaDataTable.py:230: unused method 'SetFileTimeStamp' (60% confidence) - Workspace/MetaDataTable.py:298: unused method 'GetCrossIndex' (60% confidence) - Workspace/MetaFileParser.py:161: unused attribute '_FileDir' (60% confidence) - Workspace/MetaFileParser.py:1187: unused method '_DecodeCODEData' (60% confidence) - Workspace/MetaFileParser.py:1796: unused attribute '_RestofValue' (60% confidence) - Workspace/MetaFileTable.py:31: unused attribute '_NumpyTab' (60% confidence) - Workspace/WorkspaceDatabase.py:136: unused class 'TransformObjectFactory' (60% confidence) - Workspace/WorkspaceDatabase.py:159: unused attribute 'TransformObject' (60% confidence) Signed-off-by: Pierre Gondois --- .../Python/Workspace/BuildClassObject.py | 13 ---- .../Source/Python/Workspace/DscBuildData.py | 66 ------------------- .../Source/Python/Workspace/InfBuildData.py | 2 - .../Source/Python/Workspace/MetaDataTable.py | 46 ------------- .../Source/Python/Workspace/MetaFileParser.py | 6 -- .../Source/Python/Workspace/MetaFileTable.py | 1 - .../Python/Workspace/WorkspaceDatabase.py | 10 --- 7 files changed, 144 deletions(-) diff --git a/BaseTools/Source/Python/Workspace/BuildClassObject.py b/BaseTools/Source/Python/Workspace/BuildClassObject.py index ef873720f455..631e01914019 100644 --- a/BaseTools/Source/Python/Workspace/BuildClassObject.py +++ b/BaseTools/Source/Python/Workspace/BuildClassObject.py @@ -145,11 +145,6 @@ def IsAggregateDatumType(self): return True return False - def IsSimpleTypeArray(self): - if self.IsArray() and self.BaseDatumType in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, "BOOLEAN"]: - return True - return False - @staticmethod def GetPcdMaxSizeWorker(PcdString, MaxSize): if PcdString.startswith("{") and PcdString.endswith("}"): @@ -290,7 +285,6 @@ def __init__(self, StructuredPcdIncludeFile=None, Packages=None, Name=None, Guid self.PackageDecs = Packages self.DefaultStoreName = [default_store] self.DefaultValues = OrderedDict() - self.PcdMode = None self.SkuOverrideValues = OrderedDict() self.StructName = None self.PcdDefineLineNo = 0 @@ -334,9 +328,6 @@ def AddComponentOverrideValue(self,FieldName, Value, ModuleGuid, FileName="", Li self.PcdFiledValueFromDscComponent[ModuleGuid][DimensionAttr][FieldName] = [Value.strip(), FileName, LineNo] return self.PcdFiledValueFromDscComponent[ModuleGuid][DimensionAttr][FieldName] - def SetPcdMode (self, PcdMode): - self.PcdMode = PcdMode - def copy(self, PcdObject): self.TokenCName = PcdObject.TokenCName if PcdObject.TokenCName else self.TokenCName self.TokenSpaceGuidCName = PcdObject.TokenSpaceGuidCName if PcdObject.TokenSpaceGuidCName else PcdObject.TokenSpaceGuidCName @@ -365,7 +356,6 @@ def copy(self, PcdObject): self.StructuredPcdIncludeFile = PcdObject.StructuredPcdIncludeFile if PcdObject.StructuredPcdIncludeFile else self.StructuredPcdIncludeFile self.PackageDecs = PcdObject.PackageDecs if PcdObject.PackageDecs else self.PackageDecs self.DefaultValues = PcdObject.DefaultValues if PcdObject.DefaultValues else self.DefaultValues - self.PcdMode = PcdObject.PcdMode if PcdObject.PcdMode else self.PcdMode self.DefaultValueFromDec = PcdObject.DefaultValueFromDec if PcdObject.DefaultValueFromDec else self.DefaultValueFromDec self.DefaultValueFromDecInfo = PcdObject.DefaultValueFromDecInfo if PcdObject.DefaultValueFromDecInfo else self.DefaultValueFromDecInfo self.SkuOverrideValues = PcdObject.SkuOverrideValues if PcdObject.SkuOverrideValues else self.SkuOverrideValues @@ -383,7 +373,6 @@ def __deepcopy__(self,memo): new_pcd.DefaultValueFromDec = self.DefaultValueFromDec new_pcd.DefaultValueFromDecInfo = self.DefaultValueFromDecInfo - new_pcd.PcdMode = self.PcdMode new_pcd.StructName = self.DatumType new_pcd.PcdDefineLineNo = self.PcdDefineLineNo new_pcd.PkgPath = self.PkgPath @@ -586,7 +575,6 @@ def __init__(self): # @var PlatformName: To store value for PlatformName # @var Guid: To store value for Guid # @var Version: To store value for Version -# @var DscSpecification: To store value for DscSpecification # @var OutputDirectory: To store value for OutputDirectory # @var FlashDefinition: To store value for FlashDefinition # @var BuildNumber: To store value for BuildNumber @@ -609,7 +597,6 @@ def __init__(self): self.PlatformName = '' self.Guid = '' self.Version = '' - self.DscSpecification = '' self.OutputDirectory = '' self.FlashDefinition = '' self.BuildNumber = '' diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py index 894cf2f3887b..c8c276017f17 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -464,16 +464,6 @@ def Version(self): EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_VERSION", File=self.MetaFile) return self._Version - ## Retrieve platform description file version - @property - def DscSpecification(self): - if self._DscSpecification is None: - if self._Header is None: - self._GetHeaderInfo() - if self._DscSpecification is None: - EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No DSC_SPECIFICATION", File=self.MetaFile) - return self._DscSpecification - ## Retrieve OUTPUT_DIRECTORY @property def OutputDirectory(self): @@ -1267,27 +1257,6 @@ def BuildOptions(self): if ' ' + Option not in self._BuildOptions[CurKey]: self._BuildOptions[CurKey] += ' ' + Option return self._BuildOptions - def GetBuildOptionsByPkg(self, Module, ModuleType): - - local_pkg = os.path.split(Module.LocalPkg())[0] - if self._ModuleTypeOptions is None: - self._ModuleTypeOptions = OrderedDict() - if ModuleType not in self._ModuleTypeOptions: - options = OrderedDict() - self._ModuleTypeOptions[ ModuleType] = options - RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch] - for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList: - if Dummy2 not in (TAB_COMMON,local_pkg.upper(),"EDKII"): - continue - Type = Dummy3 - if Type.upper() == ModuleType.upper(): - Key = (ToolChainFamily, ToolChain) - if Key not in options or not ToolChain.endswith('_FLAGS') or Option.startswith('='): - options[Key] = Option - else: - if ' ' + Option not in options[Key]: - options[Key] += ' ' + Option - return self._ModuleTypeOptions[ModuleType] def GetBuildOptionsByModuleType(self, Edk, ModuleType): if self._ModuleTypeOptions is None: self._ModuleTypeOptions = OrderedDict() @@ -2078,13 +2047,6 @@ def cleanupindex(indexstr): indicator += "->" + FieldName return indicator - def GetStarNum(self,Pcd): - if not Pcd.IsArray(): - return 1 - elif Pcd.IsSimpleTypeArray(): - return len(Pcd.Capacity) - else: - return len(Pcd.Capacity) + 1 def GenerateDefaultValueAssignFunction(self, Pcd): CApp = "// Default value in Dec \n" CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType) @@ -3631,20 +3593,6 @@ def _GetDynamicVpdPcd(self, Type): list(map(self.FilterSkuSettings, Pcds.values())) return Pcds - ## Add external modules - # - # The external modules are mostly those listed in FDF file, which don't - # need "build". - # - # @param FilePath The path of module description file - # - def AddModule(self, FilePath): - FilePath = NormPath(FilePath) - if FilePath not in self.Modules: - Module = ModuleBuildClassObject() - Module.MetaFile = FilePath - self.Modules.append(Module) - @property def ToolChainFamily(self): self._ToolChainFamily = TAB_COMPILER_MSFT @@ -3666,20 +3614,6 @@ def ToolChainFamily(self): self._ToolChainFamily = ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain] return self._ToolChainFamily - ## Add external PCDs - # - # The external PCDs are mostly those listed in FDF file to specify address - # or offset information. - # - # @param Name Name of the PCD - # @param Guid Token space guid of the PCD - # @param Value Value of the PCD - # - def AddPcd(self, Name, Guid, Value): - if (Name, Guid) not in self.Pcds: - self.Pcds[Name, Guid] = PcdClassObject(Name, Guid, '', '', '', '', '', {}, False, None) - self.Pcds[Name, Guid].DefaultValue = Value - @property def DecPcds(self): if self._DecPcds is None: diff --git a/BaseTools/Source/Python/Workspace/InfBuildData.py b/BaseTools/Source/Python/Workspace/InfBuildData.py index 6339e494ca87..fa047a707d94 100644 --- a/BaseTools/Source/Python/Workspace/InfBuildData.py +++ b/BaseTools/Source/Python/Workspace/InfBuildData.py @@ -114,7 +114,6 @@ def __init__(self, FilePath, RawData, BuildDatabase, Arch=TAB_ARCH_COMMON, Targe self._Target = Target self._Toolchain = Toolchain self._Platform = TAB_COMMON - self._TailComments = None self._BaseName = None self._DxsFile = None self._ModuleType = None @@ -123,7 +122,6 @@ def __init__(self, FilePath, RawData, BuildDatabase, Arch=TAB_ARCH_COMMON, Targe self._Guid = None self._Version = None self._PcdIsDriver = None - self._BinaryModule = None self._Shadow = None self._MakefileName = None self._CustomMakefile = None diff --git a/BaseTools/Source/Python/Workspace/MetaDataTable.py b/BaseTools/Source/Python/Workspace/MetaDataTable.py index a20bd147846b..325d01ae04f9 100644 --- a/BaseTools/Source/Python/Workspace/MetaDataTable.py +++ b/BaseTools/Source/Python/Workspace/MetaDataTable.py @@ -110,14 +110,6 @@ def SetEndFlag(self): Tab = self.Db.GetTable(self.Table) Tab.append(self._DUMMY_) - - def IsIntegral(self): - tab = self.Db.GetTable(self.Table) - Id = min([int(item[0]) for item in tab]) - if Id != -1: - return False - return True - def GetAll(self): tab = self.Db.GetTable(self.Table) return tab @@ -209,27 +201,6 @@ def GetFileType(self, FileId): return None return RecordList[0][0] - ## Get file timestamp of a given file - # - # @param FileId ID of file - # - # @retval timestamp TimeStamp value of given file in the table - # - def GetFileTimeStamp(self, FileId): - QueryScript = "select TimeStamp from %s where ID = '%s'" % (self.Table, FileId) - RecordList = self.Exec(QueryScript) - if len(RecordList) == 0: - return None - return RecordList[0][0] - - ## Update the timestamp of a given file - # - # @param FileId ID of file - # @param TimeStamp Time stamp of file - # - def SetFileTimeStamp(self, FileId, TimeStamp): - self.Exec("update %s set TimeStamp=%s where ID='%s'" % (self.Table, TimeStamp, FileId)) - ## Get list of file with given type # # @param FileType Type value of file @@ -287,20 +258,3 @@ def InitTable(self): Description = Item[0] self.Insert(CrossIndex, Name, Description) EdkLogger.verbose("Initialize table DataModel ... DONE!") - - ## Get CrossIndex - # - # Get a model's cross index from its name - # - # @param ModelName: Name of the model - # @retval CrossIndex: CrossIndex of the model - # - def GetCrossIndex(self, ModelName): - CrossIndex = -1 - SqlCommand = """select CrossIndex from DataModel where name = '""" + ModelName + """'""" - self.Db.execute(SqlCommand) - for Item in self.Db: - CrossIndex = Item[0] - - return CrossIndex - diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py b/BaseTools/Source/Python/Workspace/MetaFileParser.py index 50319bfca5b3..ed1ccb1cf1fa 100644 --- a/BaseTools/Source/Python/Workspace/MetaFileParser.py +++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py @@ -158,7 +158,6 @@ def __init__(self, FilePath, FileType, Arch, Table, Owner= -1, From= -1): self._Arch = Arch self._FileType = FileType self.MetaFile = FilePath - self._FileDir = self.MetaFile.Dir self._Defines = {} self._Packages = [] self._FileLocalMacros = {} @@ -1183,9 +1182,6 @@ def _DefaultStoresParser(self): def _LibraryInstanceParser(self): self._ValueList[0] = self._CurrentLine - - def _DecodeCODEData(self): - pass ## PCD sections parser # # [PcdsFixedAtBuild] @@ -1794,8 +1790,6 @@ def __init__(self, FilePath, FileType, Arch, Table): self._include_flag = False self._package_flag = False - self._RestofValue = "" - ## Parser starter def Start(self): Content = '' diff --git a/BaseTools/Source/Python/Workspace/MetaFileTable.py b/BaseTools/Source/Python/Workspace/MetaFileTable.py index bebf9062e8e5..7ff5f2011d0a 100644 --- a/BaseTools/Source/Python/Workspace/MetaFileTable.py +++ b/BaseTools/Source/Python/Workspace/MetaFileTable.py @@ -28,7 +28,6 @@ def __init__(self, DB, MetaFile, FileType, Temporary, FromItem=None): self.MetaFile = MetaFile self.TableName = "" self.DB = DB - self._NumpyTab = None self.CurrentContent = [] DB.TblFile.append([MetaFile.Name, diff --git a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py index d955c78b258f..553b149695c0 100644 --- a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py +++ b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py @@ -132,15 +132,6 @@ def CreateBuildObject(self,FilePath, Arch, Target, Toolchain): ) return BuildObject - # placeholder for file format conversion - class TransformObjectFactory: - def __init__(self, WorkspaceDb): - self.WorkspaceDb = WorkspaceDb - - # key = FilePath, Arch - def __getitem__(self, Key): - pass - ## Constructor of WorkspaceDatabase # # @param DbPath Path of database file @@ -156,7 +147,6 @@ def __init__(self): # conversion object for build or file format conversion purpose self.BuildObject = WorkspaceDatabase.BuildObjectFactory(self) - self.TransformObject = WorkspaceDatabase.TransformObjectFactory(self) ## Summarize all packages in the database From 6cc56c6a2e2a1f9a40511811d23813847091a884 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Tue, 13 May 2025 11:03:52 -0700 Subject: [PATCH 0156/1172] MdeModulePkg: SmmCommunicationBuffer cumulative codeql issues. Running Codeql on MdeModulePkg/Universal/SmmCommunicationBuffer drivers results in codeql errors stemming from missing null tests. Signed-off-by: Aaron Pop Co-authored-by: Michael Kubacki Co-authored-by: Taylor Beebe Co-authored-by: pohanch <125842322+pohanch@users.noreply.github.com> Co-authored-by: kenlautner <85201046+kenlautner@users.noreply.github.com> Co-authored-by: Oliver Smith-Denny Co-authored-by: Sean Brogan Co-authored-by: Aaron --- .../SmmCommunicationBufferDxe/SmmCommunicationBufferDxe.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MdeModulePkg/Universal/SmmCommunicationBufferDxe/SmmCommunicationBufferDxe.c b/MdeModulePkg/Universal/SmmCommunicationBufferDxe/SmmCommunicationBufferDxe.c index a47311c3b1ba..8121e0cabc13 100644 --- a/MdeModulePkg/Universal/SmmCommunicationBufferDxe/SmmCommunicationBufferDxe.c +++ b/MdeModulePkg/Universal/SmmCommunicationBufferDxe/SmmCommunicationBufferDxe.c @@ -63,6 +63,10 @@ SmmCommunicationBufferEntryPoint ( // PiSmmCommunicationRegionTable = AllocateReservedPool (sizeof (EDKII_PI_SMM_COMMUNICATION_REGION_TABLE) + DescriptorSize); ASSERT (PiSmmCommunicationRegionTable != NULL); + if (PiSmmCommunicationRegionTable == NULL) { + return EFI_OUT_OF_RESOURCES; + } + ZeroMem (PiSmmCommunicationRegionTable, sizeof (EDKII_PI_SMM_COMMUNICATION_REGION_TABLE) + DescriptorSize); PiSmmCommunicationRegionTable->Version = EDKII_PI_SMM_COMMUNICATION_REGION_TABLE_VERSION; From d15b57292f345db25f1908c5ef43d0fd0c9d409e Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Tue, 13 May 2025 11:06:35 -0700 Subject: [PATCH 0157/1172] MdeModulePkg: SectionExtractionPei cumulative codeql issues. Running Codeql on MdeModulePkg/Universal/SectionExtractionPei drivers results in codeql errors stemming from missing null tests. Signed-off-by: Aaron Pop Co-authored-by: Michael Kubacki Co-authored-by: Taylor Beebe Co-authored-by: pohanch <125842322+pohanch@users.noreply.github.com> Co-authored-by: kenlautner <85201046+kenlautner@users.noreply.github.com> Co-authored-by: Oliver Smith-Denny Co-authored-by: Sean Brogan Co-authored-by: Aaron --- .../SectionExtractionPei/SectionExtractionPei.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/MdeModulePkg/Universal/SectionExtractionPei/SectionExtractionPei.c b/MdeModulePkg/Universal/SectionExtractionPei/SectionExtractionPei.c index 8a11643ace90..5229fd819ae0 100644 --- a/MdeModulePkg/Universal/SectionExtractionPei/SectionExtractionPei.c +++ b/MdeModulePkg/Universal/SectionExtractionPei/SectionExtractionPei.c @@ -251,12 +251,15 @@ SectionExtractionPeiEntry ( if (ExtractHandlerNumber > 0) { GuidPpi = (EFI_PEI_PPI_DESCRIPTOR *)AllocatePool (ExtractHandlerNumber * sizeof (EFI_PEI_PPI_DESCRIPTOR)); ASSERT (GuidPpi != NULL); - while (ExtractHandlerNumber-- > 0) { - GuidPpi->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; - GuidPpi->Ppi = (VOID *)&mCustomGuidedSectionExtractionPpi; - GuidPpi->Guid = &ExtractHandlerGuidTable[ExtractHandlerNumber]; - Status = PeiServicesInstallPpi (GuidPpi++); - ASSERT_EFI_ERROR (Status); + + if (GuidPpi != NULL) { + while (ExtractHandlerNumber-- > 0) { + GuidPpi->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; + GuidPpi->Ppi = (VOID *)&mCustomGuidedSectionExtractionPpi; + GuidPpi->Guid = &ExtractHandlerGuidTable[ExtractHandlerNumber]; + Status = PeiServicesInstallPpi (GuidPpi++); + ASSERT_EFI_ERROR (Status); + } } } From d49364779c53f0aba2fd445345c8999d548f6a90 Mon Sep 17 00:00:00 2001 From: Wei6 Xu Date: Thu, 19 Jun 2025 13:58:02 +0800 Subject: [PATCH 0158/1172] UefiCpuPkg/PiSmmCpuDxeSmm: Add sync barrier before BSP invokes SmmCoreEntry This patch introduces a synchronization point between the BSP and APs to ensure all APs have entered their SMM wait-loop (while (TRUE) in APHandler ()) before the BSP calls into the SMI handler logic via gSmmCpuPrivate ->SmmCoreEntry(). Previously, the BSP would invoke ReleaseAllAPs() and immediately proceed to SmmCoreEntry() without confirming whether APs had reached the stable waiting state. If SmmStartupThisAp() was called inside the SMI handler shortly after ReleaseAllAPs(), it might lead to a race condition: APs are issued two consecutive wait signals (SmmCpuSyncWaitForBsp()). BSP sends two consecutive releases (ReleaseAllAPs() + SmmStartupThisAp()) If an AP has not yet responded to the first release, the second release may overwrite the semaphore state, and the AP might miss the notification, causing it to hang or behave unpredictably. To address this: A SmmCpuSyncWaitForAPs() is added in BSP after mmCpuPlatformHookBeforeMmiHandler() and before entering SmmCoreEntry(). A matching SmmCpuSyncReleaseBsp() is added in AP immediately after its own SmmCpuPlatformHookBeforeMmiHandler() This ensures that BSP does not enter SMI handler logic or dispatch any AP-related requests before all APs are confirmed to be idle and ready. Debug sync point markers (e.g., /// #6, #7) are updated accordingly. This change eliminates a subtle but critical race condition in multi-processor/multi-socket systems during SMM entry and improves overall synchronization safety. Signed-off-by: Wei6 Xu --- UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 48 ++++++++++++++++++++------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c index 7bc68087adff..7402a281521f 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c @@ -561,6 +561,11 @@ BSPHandler ( // Wait for all APs to complete their MTRR programming // SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #5: Wait APs + + // + // Notify all APs to continue + // + ReleaseAllAPs (); /// #6: Signal APs } } @@ -569,6 +574,13 @@ BSPHandler ( // SmmCpuPlatformHookBeforeMmiHandler (); + if ((SyncMode == MmCpuSyncModeTradition) || SmmCpuFeaturesNeedConfigureMtrrs ()) { + // + // Wait for all APs of arrival at this point + // + SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #7: Wait APs + } + // // The BUSY lock is initialized to Acquired state // @@ -630,18 +642,18 @@ BSPHandler ( // Notify all APs to exit // *mSmmMpSyncData->InsideSmm = FALSE; - ReleaseAllAPs (); /// #6: Signal APs + ReleaseAllAPs (); /// #8: Signal APs if (SmmCpuFeaturesNeedConfigureMtrrs ()) { // // Wait for all APs the readiness to program MTRRs // - SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #7: Wait APs + SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #9: Wait APs // // Signal APs to restore MTRRs // - ReleaseAllAPs (); /// #8: Signal APs + ReleaseAllAPs (); /// #10: Signal APs // // Restore OS MTRRs @@ -654,12 +666,12 @@ BSPHandler ( // // Wait for all APs to complete their pending tasks including MTRR programming if needed. // - SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #9: Wait APs + SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #11: Wait APs // // Signal APs to Reset states/semaphore for this processor // - ReleaseAllAPs (); /// #10: Signal APs + ReleaseAllAPs (); /// #12: Signal APs } if (mSmmDebugAgentSupport) { @@ -684,7 +696,7 @@ BSPHandler ( // Gather APs to exit SMM synchronously. Note the Present flag is cleared by now but // WaitForAllAps does not depend on the Present flag. // - SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #11: Wait APs + SmmCpuSyncWaitForAPs (mSmmMpSyncData->SyncContext, ApCount, CpuIndex); /// #13: Wait APs // // At this point, all APs should have exited from APHandler(). @@ -845,6 +857,11 @@ APHandler ( // Signal BSP the completion of this AP // SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #5: Signal BSP + + // + // Wait for BSP's signal to continue + // + SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #6: Wait BSP } // @@ -852,11 +869,18 @@ APHandler ( // SmmCpuPlatformHookBeforeMmiHandler (); + if ((SyncMode == MmCpuSyncModeTradition) || SmmCpuFeaturesNeedConfigureMtrrs ()) { + // + // Notify BSP of arrival at this point + // + SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #7: Signal BSP + } + while (TRUE) { // // Wait for something to happen // - SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #6: Wait BSP + SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #8: Wait BSP // // Check if BSP wants to exit SMM @@ -896,12 +920,12 @@ APHandler ( // // Notify BSP the readiness of this AP to program MTRRs // - SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #7: Signal BSP + SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #9: Signal BSP // // Wait for the signal from BSP to program MTRRs // - SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #8: Wait BSP + SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #10: Wait BSP // // Restore OS MTRRs @@ -914,12 +938,12 @@ APHandler ( // // Notify BSP the readiness of this AP to Reset states/semaphore for this processor // - SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #9: Signal BSP + SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #11: Signal BSP // // Wait for the signal from BSP to Reset states/semaphore for this processor // - SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #10: Wait BSP + SmmCpuSyncWaitForBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #12: Wait BSP } // @@ -930,7 +954,7 @@ APHandler ( // // Notify BSP the readiness of this AP to exit SMM // - SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #11: Signal BSP + SmmCpuSyncReleaseBsp (mSmmMpSyncData->SyncContext, CpuIndex, BspIndex); /// #13: Signal BSP } /** From 7c40bc06a9d3da504c7046303c767d38fda3a1fe Mon Sep 17 00:00:00 2001 From: Ceping Sun Date: Tue, 1 Jul 2025 02:01:50 -0400 Subject: [PATCH 0159/1172] SecurityPkg/SecTpmMeasurementLib: Fix OverFlow Coverity issue CC_MR_INDEX_0_MRTD indicates the MRTD register. This register is NOT extendable in TDVF. So the return value of TdxMeasurementMapPcrToMrIndex must be checked. Cc: Jiewen Yao Signed-off-by: Ceping Sun --- SecurityPkg/Library/SecTpmMeasurementLib/IntelTdx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SecurityPkg/Library/SecTpmMeasurementLib/IntelTdx.c b/SecurityPkg/Library/SecTpmMeasurementLib/IntelTdx.c index 95d69eddc502..08e19159094c 100644 --- a/SecurityPkg/Library/SecTpmMeasurementLib/IntelTdx.c +++ b/SecurityPkg/Library/SecTpmMeasurementLib/IntelTdx.c @@ -58,7 +58,8 @@ TdxHashLogExtendEvent ( } MrIndex = TdxMeasurementMapPcrToMrIndex (PcrIndex); - if (MrIndex == CC_MR_INDEX_INVALID) { + // MRTD is NOT extendable in TDVF. + if ((MrIndex == CC_MR_INDEX_INVALID) || (MrIndex == CC_MR_INDEX_0_MRTD)) { return EFI_INVALID_PARAMETER; } From 27d44c1abd676a8db2cb92f231e2bc4cc89370da Mon Sep 17 00:00:00 2001 From: Leif Lindholm Date: Mon, 30 Jun 2025 15:55:50 +0100 Subject: [PATCH 0160/1172] BaseTools/PatchCheck.py: drop redundant line count check Before doing the subject line length check, the script checks that the number of lines in the commit message (including subject) is not less than or equal to zero - and returns if it is. However, then the test for whether the subject line starts with a CVE tag inexplicably also checks for whether the number of lines are greater than or equal to one. This is just clutter, so drop it. Signed-off-by: Leif Lindholm --- BaseTools/Scripts/PatchCheck.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BaseTools/Scripts/PatchCheck.py b/BaseTools/Scripts/PatchCheck.py index 5b611e0aac32..2b767071288d 100755 --- a/BaseTools/Scripts/PatchCheck.py +++ b/BaseTools/Scripts/PatchCheck.py @@ -263,7 +263,7 @@ def check_overall_format(self): self.error('Empty commit message!') return - if count >= 1 and re.search(self.cve_re, lines[0]): + if re.search(self.cve_re, lines[0]): # # If CVE-xxxx-xxxxx is present in subject line, then limit length of # subject line to 92 characters From 2bcad870049ae495eb8884b6ece893548fee770c Mon Sep 17 00:00:00 2001 From: Leif Lindholm Date: Mon, 30 Jun 2025 16:43:11 +0100 Subject: [PATCH 0161/1172] BaseTools/PatchCheck.py: clean up subject line length handling Use a temporary variable for max subject line length and log result of test in one location. Signed-off-by: Leif Lindholm --- BaseTools/Scripts/PatchCheck.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/BaseTools/Scripts/PatchCheck.py b/BaseTools/Scripts/PatchCheck.py index 2b767071288d..03a775af94c5 100755 --- a/BaseTools/Scripts/PatchCheck.py +++ b/BaseTools/Scripts/PatchCheck.py @@ -268,21 +268,19 @@ def check_overall_format(self): # If CVE-xxxx-xxxxx is present in subject line, then limit length of # subject line to 92 characters # - if len(lines[0].rstrip()) >= 93: - self.error( - 'First line of commit message (subject line) is too long (%d >= 93).' % - (len(lines[0].rstrip())) - ) + maxlength = 92 else: # # If CVE-xxxx-xxxxx is not present in subject line, then limit # length of subject line to 75 characters # - if len(lines[0].rstrip()) >= 76: - self.error( - 'First line of commit message (subject line) is too long (%d >= 76).' % - (len(lines[0].rstrip())) - ) + maxlength = 75 + + if len(lines[0].rstrip()) > maxlength: + self.error( + 'First line of commit message (subject line) is too long (%d > %d).' % + (len(lines[0].rstrip()), maxlength) + ) if count >= 1 and len(lines[0].strip()) == 0: self.error('First line of commit message (subject line) ' + From 87a4bfd28c1f45f29a0c8826dfe981e1ebc12fa8 Mon Sep 17 00:00:00 2001 From: Leif Lindholm Date: Mon, 30 Jun 2025 16:48:10 +0100 Subject: [PATCH 0162/1172] BaseTools/PatchCheck.py: permit at least 20 characters after ':' Commit b55530ad4460 ("BaseTools/PatchCheck.py: verify commit message lists package(s)") introduced a check for the requirement to enumerate all modified packages in the commit subject line. But it did leave the maximum line length at 75 characters (for non-CVE commits), which can get a bit cramped for changes to several packages. Introduce a new arbitrary "at least 20 characters after the :" limit. Signed-off-by: Leif Lindholm --- BaseTools/Scripts/PatchCheck.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/BaseTools/Scripts/PatchCheck.py b/BaseTools/Scripts/PatchCheck.py index 03a775af94c5..5c148409aaee 100755 --- a/BaseTools/Scripts/PatchCheck.py +++ b/BaseTools/Scripts/PatchCheck.py @@ -269,10 +269,15 @@ def check_overall_format(self): # subject line to 92 characters # maxlength = 92 + elif lines[0].find(':') > 55: + # + # If we need to enumerate lots of packages, ensure to leave room for + # a very short description at the end (after the ':'). + # + maxlength = lines[0].find(':') + 20 else: # - # If CVE-xxxx-xxxxx is not present in subject line, then limit - # length of subject line to 75 characters + # Otherwise, limit the length of subject line to 75 characters # maxlength = 75 From c3bf98f265b5bd7adc1ef889885fd398d6cbe7a5 Mon Sep 17 00:00:00 2001 From: "INDIA\\kanagavels" Date: Thu, 19 Jun 2025 13:16:55 +0530 Subject: [PATCH 0163/1172] CryptoPkg: Disable the security risk ciphers. REF:https://github.com/tianocore/edk2/issues/11040 Since the below mentioned ciphers has a security risks, Disable MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED MBEDTLS_SSL_RENEGOTIATION MBEDTLS_DHM_C Enable MBEDTLS_SSL_DTLS_ANTI_REPLAY MBEDTLS_SSL_DTLS_HELLO_VERIFY. Signed-off-by: Kanagavel S --- .../MbedTlsLib/Include/mbedtls/mbedtls_config.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CryptoPkg/Library/MbedTlsLib/Include/mbedtls/mbedtls_config.h b/CryptoPkg/Library/MbedTlsLib/Include/mbedtls/mbedtls_config.h index 3068612c0815..a2e1cfffdda1 100644 --- a/CryptoPkg/Library/MbedTlsLib/Include/mbedtls/mbedtls_config.h +++ b/CryptoPkg/Library/MbedTlsLib/Include/mbedtls/mbedtls_config.h @@ -741,7 +741,7 @@ * See dhm.h for more details. * */ -#define MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED +// #define MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED @@ -839,7 +839,7 @@ * See dhm.h for more details. * */ -#define MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED +// #define MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED @@ -1482,7 +1482,7 @@ * configuration of this extension). * */ -#define MBEDTLS_SSL_RENEGOTIATION +// #define MBEDTLS_SSL_RENEGOTIATION /** * \def MBEDTLS_SSL_MAX_FRAGMENT_LENGTH @@ -1706,7 +1706,7 @@ * * Comment this to disable anti-replay in DTLS. */ -// #define MBEDTLS_SSL_DTLS_ANTI_REPLAY +#define MBEDTLS_SSL_DTLS_ANTI_REPLAY /** * \def MBEDTLS_SSL_DTLS_HELLO_VERIFY @@ -1724,7 +1724,7 @@ * * Comment this to disable support for HelloVerifyRequest. */ -// #define MBEDTLS_SSL_DTLS_HELLO_VERIFY +#define MBEDTLS_SSL_DTLS_HELLO_VERIFY /** * \def MBEDTLS_SSL_DTLS_SRTP @@ -2398,7 +2398,7 @@ * See dhm.h for more details. * */ -#define MBEDTLS_DHM_C +// #define MBEDTLS_DHM_C /** * \def MBEDTLS_ECDH_C From 4be603d71322f87aa82bcb79682d69c8e67ca3e2 Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Tue, 1 Jul 2025 08:52:39 +0000 Subject: [PATCH 0164/1172] BaseTools: Fix the spelling or typo Signed-off-by: Abdul Lateef Attar --- BaseTools/Source/Python/Workspace/DscBuildData.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py index c8c276017f17..248c56295672 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -3,6 +3,7 @@ # # Copyright (c) 2008 - 2025, Intel Corporation. All rights reserved.
# (C) Copyright 2016 Hewlett Packard Enterprise Development LP
+# Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -1670,7 +1671,7 @@ def PlatformUsedPcds(self): AllModulePcds = AllModulePcds | ModuleData.PcdsName return AllModulePcds - #Filter the StrucutrePcd that is not used by any module in dsc file and fdf file. + #Filter the StructurePcd that is not used by any module in dsc file and fdf file. def FilterStrcturePcd(self, S_pcd_set): UnusedStruPcds = set(S_pcd_set.keys()) - self.PlatformUsedPcds for (Token, TokenSpaceGuid) in UnusedStruPcds: From 2e1c3b53ae6a5726bd7a42ed14446ef4855f5acd Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Tue, 1 Jul 2025 08:55:16 +0000 Subject: [PATCH 0165/1172] UefiPayloadPkg: Correct spelling errors and typos Signed-off-by: Abdul Lateef Attar --- UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c index eb5f14e6dd22..468c36625c9a 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c @@ -1,6 +1,8 @@ /** @file Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.
+ Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -398,7 +400,7 @@ BuildHobFromBl ( } // - // Creat SmBios table Hob + // Create SmBios table Hob // SmBiosTableHob = BuildGuidHob (&gUniversalPayloadSmbiosTableGuid, sizeof (UNIVERSAL_PAYLOAD_SMBIOS_TABLE)); ASSERT (SmBiosTableHob != NULL); @@ -411,7 +413,7 @@ BuildHobFromBl ( } // - // Creat ACPI table Hob + // Create ACPI table Hob // AcpiTableHob = BuildGuidHob (&gUniversalPayloadAcpiTableGuid, sizeof (UNIVERSAL_PAYLOAD_ACPI_TABLE)); ASSERT (AcpiTableHob != NULL); From db762861df50c5716af607316023a68472367cbf Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Tue, 1 Jul 2025 08:58:05 +0000 Subject: [PATCH 0166/1172] UefiCpuPkg: Correct spelling errors and typos Signed-off-by: Abdul Lateef Attar --- .../Library/SmmCpuRendezvousLib/SmmCpuRendezvousLib.c | 4 +++- UefiCpuPkg/PiSmmCpuDxeSmm/CpuService.c | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/UefiCpuPkg/Library/SmmCpuRendezvousLib/SmmCpuRendezvousLib.c b/UefiCpuPkg/Library/SmmCpuRendezvousLib/SmmCpuRendezvousLib.c index e573c2ecfb51..7a11963c427d 100644 --- a/UefiCpuPkg/Library/SmmCpuRendezvousLib/SmmCpuRendezvousLib.c +++ b/UefiCpuPkg/Library/SmmCpuRendezvousLib/SmmCpuRendezvousLib.c @@ -2,6 +2,8 @@ SMM CPU Rendezvous sevice implement. Copyright (c) 2022, Intel Corporation. All rights reserved.
+ Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -55,7 +57,7 @@ SmmCpuRendezvousProtocolNotify ( @param[in] BlockingMode Blocking mode or non-blocking mode. - @retval EFI_SUCCESS All avaiable APs arrived. + @retval EFI_SUCCESS All available APs arrived. @retval EFI_TIMEOUT Wait for all APs until timeout. @retval OTHER Fail to register SMM CPU Rendezvous service Protocol. **/ diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuService.c b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuService.c index 72ffb5a50d60..c1dabf86dd38 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuService.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuService.c @@ -2,6 +2,8 @@ Implementation of SMM CPU Services Protocol. Copyright (c) 2011 - 2024, Intel Corporation. All rights reserved.
+Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -405,7 +407,7 @@ InitializeSmmCpuServices ( @param This A pointer to the EDKII_SMM_CPU_RENDEZVOUS_PROTOCOL instance. @param BlockingMode Blocking mode or non-blocking mode. - @retval EFI_SUCCESS All avaiable APs arrived. + @retval EFI_SUCCESS All available APs arrived. @retval EFI_TIMEOUT Wait for all APs until timeout. **/ @@ -433,7 +435,7 @@ SmmCpuRendezvous ( if ((mSmmMpSyncData->EffectiveSyncMode != MmCpuSyncModeTradition) && !SmmCpuFeaturesNeedConfigureMtrrs ()) { // - // There are some APs outside SMM, Wait for all avaiable APs to arrive. + // There are some APs outside SMM, Wait for all available APs to arrive. // SmmWaitForApArrival (); Status = mSmmMpSyncData->AllApArrivedWithException ? EFI_SUCCESS : EFI_TIMEOUT; From f2e9785b6ef3ec57aaf72b2240104d8af87545a9 Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Tue, 1 Jul 2025 09:01:46 +0000 Subject: [PATCH 0167/1172] ShellPkg: Correct spelling errors and typos Signed-off-by: Abdul Lateef Attar --- .../Library/UefiHandleParsingLib/UefiHandleParsingLib.c | 7 ++++--- .../UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c | 3 ++- .../SmbiosView/SmbiosViewStrings.uni | 3 ++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c index 0b73cbbec136..51b77838ab20 100644 --- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c +++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c @@ -4,6 +4,7 @@ Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.
(C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.
(C) Copyright 2015-2021 Hewlett Packard Enterprise Development LP
+ Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -2028,7 +2029,7 @@ FirmwareManagementDumpInformation ( if (ImageInfoV1[Index].ImageId == ImageInfoV1[Index1].ImageId) { Found = TRUE; // - // At least one match found indicating presense of non unique ImageId values so no more comparisons needed + // At least one match found indicating presence of non unique ImageId values so no more comparisons needed // goto ENDLOOP; } @@ -2036,7 +2037,7 @@ FirmwareManagementDumpInformation ( if (ImageInfoV2[Index].ImageId == ImageInfoV2[Index1].ImageId) { Found = TRUE; // - // At least one match found indicating presense of non unique ImageId values so no more comparisons needed + // At least one match found indicating presence of non unique ImageId values so no more comparisons needed // goto ENDLOOP; } @@ -2044,7 +2045,7 @@ FirmwareManagementDumpInformation ( if (ImageInfo[Index].ImageId == ImageInfo[Index1].ImageId) { Found = TRUE; // - // At least one match found indicating presense of non unique ImageId values so no more comparisons needed + // At least one match found indicating presence of non unique ImageId values so no more comparisons needed // goto ENDLOOP; } diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c index 8ede590fbe63..42d766ea68e4 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c @@ -7,6 +7,7 @@ (C) Copyright 2015-2019 Hewlett Packard Enterprise Development LP
Copyright (c) 2023 Apple Inc. All rights reserved.
Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -2908,7 +2909,7 @@ DisplayProcessorStatus ( break; case 3: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_DIABLED_BY_BIOS), gShellDebug1HiiHandle); + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_DISABLED_BY_BIOS), gShellDebug1HiiHandle); break; case 4: diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosViewStrings.uni b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosViewStrings.uni index d55af31884ad..1f90e405fc41 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosViewStrings.uni +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosViewStrings.uni @@ -5,6 +5,7 @@ // (C) Copyright 2014-2015 Hewlett-Packard Development Company, L.P.
// (C) Copyright 2015-2019 Hewlett Packard Enterprise Development LP
// Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. // SPDX-License-Identifier: BSD-2-Clause-Patent // // Module Name: @@ -279,7 +280,7 @@ #string STR_SMBIOSVIEW_PRINTINFO_CPU_SOCKET_UNPOPULATED #language en-US "CPU Socket Unpopulated\r\n" #string STR_SMBIOSVIEW_PRINTINFO_CPU_ENABLED #language en-US "CPU Enabled\r\n" #string STR_SMBIOSVIEW_PRINTINFO_CPU_DISABLED_BY_USER #language en-US "CPU Disabled by User via BIOS Setup\r\n" -#string STR_SMBIOSVIEW_PRINTINFO_CPU_DIABLED_BY_BIOS #language en-US "CPU Disabled By BIOS (POST Error)\r\n" +#string STR_SMBIOSVIEW_PRINTINFO_CPU_DISABLED_BY_BIOS #language en-US "CPU Disabled By BIOS (POST Error)\r\n" #string STR_SMBIOSVIEW_PRINTINFO_CPU_IDLE #language en-US "CPU is Idle, waiting to be enabled\r\n" #string STR_SMBIOSVIEW_PRINTINFO_OTHERS #language en-US "Others\r\n" #string STR_SMBIOSVIEW_PRINTINFO_RESERVED #language en-US "Reserved\r\n" From 96ce01e6e7770175639d00c0ba5e5dfa880e389f Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Tue, 1 Jul 2025 09:04:51 +0000 Subject: [PATCH 0168/1172] RedfishPkg: Correct spelling errors and typos Signed-off-by: Abdul Lateef Attar --- RedfishPkg/RedfishHttpDxe/RedfishHttpData.c | 5 +++-- RedfishPkg/RedfishHttpDxe/RedfishHttpData.h | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/RedfishPkg/RedfishHttpDxe/RedfishHttpData.c b/RedfishPkg/RedfishHttpDxe/RedfishHttpData.c index d1d403c74a9b..fa8e37f3ec54 100644 --- a/RedfishPkg/RedfishHttpDxe/RedfishHttpData.c +++ b/RedfishPkg/RedfishHttpDxe/RedfishHttpData.c @@ -2,6 +2,7 @@ RedfishHttpData handles internal data to support Redfish HTTP protocol. Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent @@ -84,7 +85,7 @@ ReleaseRedfishService ( } /** - This function creat new service. Host and HostName are copied to + This function create new service. Host and HostName are copied to newly created service instance. @param[in] Host Host string. @@ -189,7 +190,7 @@ ReleaseRedfishPayload ( } /** - This function creat new payload. Server and JsonObj are + This function create new payload. Server and JsonObj are copied to newly created payload. @param[in] Service Pointer to Service instance. diff --git a/RedfishPkg/RedfishHttpDxe/RedfishHttpData.h b/RedfishPkg/RedfishHttpDxe/RedfishHttpData.h index cb956a454b10..700c74c9313a 100644 --- a/RedfishPkg/RedfishHttpDxe/RedfishHttpData.h +++ b/RedfishPkg/RedfishHttpDxe/RedfishHttpData.h @@ -2,6 +2,7 @@ Definitions of RedfishHttpData Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent @@ -184,7 +185,7 @@ ReleaseRedfishPayload ( ); /** - This function creat new payload. Server and JsonObj are + This function create new payload. Server and JsonObj are copied to newly created payload. @param[in] Service Pointer to Service instance. @@ -215,7 +216,7 @@ ReleaseRedfishService ( ); /** - This function creat new service. Host and HostName are copied to + This function create new service. Host and HostName are copied to newly created service instance. @param[in] Host Host string. From 727ba13d3e0deb818e1ce6c5fabe962aff2de987 Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Tue, 1 Jul 2025 09:05:58 +0000 Subject: [PATCH 0169/1172] OvmfPkg: Correct spelling errors and typos Signed-off-by: Abdul Lateef Attar --- OvmfPkg/LoongArchVirt/PlatformPei/Platform.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/LoongArchVirt/PlatformPei/Platform.c b/OvmfPkg/LoongArchVirt/PlatformPei/Platform.c index 8fe0973f856b..8d7149e458bd 100644 --- a/OvmfPkg/LoongArchVirt/PlatformPei/Platform.c +++ b/OvmfPkg/LoongArchVirt/PlatformPei/Platform.c @@ -2,6 +2,7 @@ Platform PEI driver Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.
+ Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent @@ -238,7 +239,7 @@ MiscInitialization ( CpuPhysMemAddressWidth = (UINT8)(CpucfgReg1Data.Bits.PALEN + 1); // - // Creat CPU HOBs. + // Create CPU HOBs. // BuildCpuHob (CpuPhysMemAddressWidth, FixedPcdGet8 (PcdPrePiCpuIoSize)); } From 66cc82727023b5daaa06106f0e04c049f6baa793 Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Tue, 1 Jul 2025 09:07:42 +0000 Subject: [PATCH 0170/1172] NetworkPkg: Correct spelling errors and typos Signed-off-by: Abdul Lateef Attar --- NetworkPkg/HttpDxe/HttpImpl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c index e35372e776fa..7ce68825f611 100644 --- a/NetworkPkg/HttpDxe/HttpImpl.c +++ b/NetworkPkg/HttpDxe/HttpImpl.c @@ -3,7 +3,7 @@ Copyright (c) 2015, Intel Corporation. All rights reserved.
(C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP
- Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.
+ Copyright (C) 2024 - 2025 Advanced Micro Devices, Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -180,7 +180,7 @@ EfiHttpConfigure ( } // - // Creat Tcp child + // Create Tcp child // Status = HttpInitProtocol (HttpInstance, HttpInstance->LocalAddressIsIPv6); if (EFI_ERROR (Status)) { From 0eae93e07c725e2970ed9589af4df94ed6bfe467 Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Tue, 1 Jul 2025 09:10:34 +0000 Subject: [PATCH 0171/1172] MdePkg: Correct spelling errors and typos Signed-off-by: Abdul Lateef Attar --- MdePkg/Library/BaseRngLib/Riscv/Rng.c | 3 ++- .../Library/SmmCpuRendezvousLibNull/SmmCpuRendezvousLibNull.c | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/MdePkg/Library/BaseRngLib/Riscv/Rng.c b/MdePkg/Library/BaseRngLib/Riscv/Rng.c index 305ab60b4dde..6a9b2ce9649a 100644 --- a/MdePkg/Library/BaseRngLib/Riscv/Rng.c +++ b/MdePkg/Library/BaseRngLib/Riscv/Rng.c @@ -3,6 +3,7 @@ to provide pseudorandom numbers. Copyright (c) 2024, Rivos, Inc. + Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -153,7 +154,7 @@ Get64BitSeed ( /** Constructor library which initializes Seeds and mStatus array. - @retval EFI_SUCCESS Intialization was successful. + @retval EFI_SUCCESS initialization was successful. @retval EFI_UNSUPPORTED Feature not supported. **/ diff --git a/MdePkg/Library/SmmCpuRendezvousLibNull/SmmCpuRendezvousLibNull.c b/MdePkg/Library/SmmCpuRendezvousLibNull/SmmCpuRendezvousLibNull.c index 769f4c673802..b3950cad4a7c 100644 --- a/MdePkg/Library/SmmCpuRendezvousLibNull/SmmCpuRendezvousLibNull.c +++ b/MdePkg/Library/SmmCpuRendezvousLibNull/SmmCpuRendezvousLibNull.c @@ -2,6 +2,8 @@ SMM CPU Rendezvous sevice implement. Copyright (c) 2022, Intel Corporation. All rights reserved.
+ Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -14,7 +16,7 @@ @param[in] BlockingMode Blocking mode or non-blocking mode. - @retval EFI_SUCCESS All avaiable APs arrived. + @retval EFI_SUCCESS All available APs arrived. @retval EFI_TIMEOUT Wait for all APs until timeout. @retval OTHER Fail to register SMM CPU Rendezvous service Protocol. **/ From 25b1754ae5a4107c1bdf80fa9bfd183034e31315 Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Tue, 1 Jul 2025 09:12:15 +0000 Subject: [PATCH 0172/1172] MdeModulePkg: Correct spelling errors and typos Signed-off-by: Abdul Lateef Attar --- MdeModulePkg/Bus/Pci/IdeBusPei/AtapiPeim.c | 3 ++- MdeModulePkg/Bus/Pci/IdeBusPei/AtapiPeim.h | 3 ++- MdeModulePkg/Library/VariablePolicyLib/VariablePolicyLib.c | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/IdeBusPei/AtapiPeim.c b/MdeModulePkg/Bus/Pci/IdeBusPei/AtapiPeim.c index 3f5462c257aa..8e21fd147906 100644 --- a/MdeModulePkg/Bus/Pci/IdeBusPei/AtapiPeim.c +++ b/MdeModulePkg/Bus/Pci/IdeBusPei/AtapiPeim.c @@ -6,6 +6,7 @@ This PPI can be consumed by PEIM which produce gEfiPeiDeviceRecoveryModulePpiGui for Atapi CD ROM device. Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent @@ -1198,7 +1199,7 @@ CheckErrorStatus ( } /** - Idendify Atapi devices. + Identify Atapi devices. @param[in] AtapiBlkIoDev A pointer to atapi block IO device. @param[in] DevicePosition An integer to signify device position. diff --git a/MdeModulePkg/Bus/Pci/IdeBusPei/AtapiPeim.h b/MdeModulePkg/Bus/Pci/IdeBusPei/AtapiPeim.h index abc1dc661b87..4cff117f0efc 100644 --- a/MdeModulePkg/Bus/Pci/IdeBusPei/AtapiPeim.h +++ b/MdeModulePkg/Bus/Pci/IdeBusPei/AtapiPeim.h @@ -2,6 +2,7 @@ Private Include file for IdeBus PEIM. Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent @@ -524,7 +525,7 @@ CheckErrorStatus ( ); /** - Idendify Atapi devices. + Identify Atapi devices. @param[in] AtapiBlkIoDev A pointer to atapi block IO device. @param[in] DevicePosition An integer to signify device position. diff --git a/MdeModulePkg/Library/VariablePolicyLib/VariablePolicyLib.c b/MdeModulePkg/Library/VariablePolicyLib/VariablePolicyLib.c index f5b9418a3834..7f377f1462d6 100644 --- a/MdeModulePkg/Library/VariablePolicyLib/VariablePolicyLib.c +++ b/MdeModulePkg/Library/VariablePolicyLib/VariablePolicyLib.c @@ -2,6 +2,8 @@ Business logic for Variable Policy enforcement. Copyright (c) Microsoft Corporation. +Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -107,7 +109,7 @@ IsValidVariablePolicyStructure ( // Sanitize some quick values. if ((NewPolicy == NULL) || (NewPolicy->Size == 0) || - // Structure size should be at least as long as the minumum structure and a NULL string. + // Structure size should be at least as long as the minimum structure and a NULL string. (NewPolicy->Size < sizeof (VARIABLE_POLICY_ENTRY)) || // Check for the known revision. (NewPolicy->Version != VARIABLE_POLICY_ENTRY_REVISION)) From faf600ccc76cf235c399d866ba7db52da8cea46c Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 9 May 2025 11:23:42 +0200 Subject: [PATCH 0173/1172] OvmfPkg: move scsi drivers to new OptHw include files Signed-off-by: Gerd Hoffmann --- OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc | 15 +++++++++++++++ OvmfPkg/Include/Dsc/OvmfOptHwDefines.dsc.inc | 9 +++++++++ OvmfPkg/Include/Fdf/OvmfOptHw.fdf.inc | 15 +++++++++++++++ OvmfPkg/OvmfPkgX64.dsc | 14 ++------------ OvmfPkg/OvmfPkgX64.fdf | 10 +--------- 5 files changed, 42 insertions(+), 21 deletions(-) create mode 100644 OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc create mode 100644 OvmfPkg/Include/Dsc/OvmfOptHwDefines.dsc.inc create mode 100644 OvmfPkg/Include/Fdf/OvmfOptHw.fdf.inc diff --git a/OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc b/OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc new file mode 100644 index 000000000000..faf049e754c6 --- /dev/null +++ b/OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc @@ -0,0 +1,15 @@ +## +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# optional hardware support components +## + +!if $(PVSCSI_ENABLE) == TRUE + OvmfPkg/PvScsiDxe/PvScsiDxe.inf +!endif +!if $(MPT_SCSI_ENABLE) == TRUE + OvmfPkg/MptScsiDxe/MptScsiDxe.inf +!endif +!if $(LSI_SCSI_ENABLE) == TRUE + OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf +!endif diff --git a/OvmfPkg/Include/Dsc/OvmfOptHwDefines.dsc.inc b/OvmfPkg/Include/Dsc/OvmfOptHwDefines.dsc.inc new file mode 100644 index 000000000000..54a631ada662 --- /dev/null +++ b/OvmfPkg/Include/Dsc/OvmfOptHwDefines.dsc.inc @@ -0,0 +1,9 @@ +## +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# optional hardware support components +## + + DEFINE PVSCSI_ENABLE = FALSE + DEFINE MPT_SCSI_ENABLE = FALSE + DEFINE LSI_SCSI_ENABLE = FALSE diff --git a/OvmfPkg/Include/Fdf/OvmfOptHw.fdf.inc b/OvmfPkg/Include/Fdf/OvmfOptHw.fdf.inc new file mode 100644 index 000000000000..60698d0a3c96 --- /dev/null +++ b/OvmfPkg/Include/Fdf/OvmfOptHw.fdf.inc @@ -0,0 +1,15 @@ +## +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# optional hardware support components +## + +!if $(PVSCSI_ENABLE) == TRUE +INF OvmfPkg/PvScsiDxe/PvScsiDxe.inf +!endif +!if $(MPT_SCSI_ENABLE) == TRUE +INF OvmfPkg/MptScsiDxe/MptScsiDxe.inf +!endif +!if $(LSI_SCSI_ENABLE) == TRUE +INF OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf +!endif diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index cdb815c4b655..20e73588e465 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -58,9 +58,7 @@ # # Device drivers # - DEFINE PVSCSI_ENABLE = FALSE - DEFINE MPT_SCSI_ENABLE = FALSE - DEFINE LSI_SCSI_ENABLE = FALSE +!include OvmfPkg/Include/Dsc/OvmfOptHwDefines.dsc.inc # # Flash size selection. Setting FD_SIZE_IN_KB on the command line directly to @@ -946,15 +944,6 @@ OvmfPkg/VirtioScsiDxe/VirtioScsi.inf OvmfPkg/VirtioSerialDxe/VirtioSerial.inf OvmfPkg/VirtioKeyboardDxe/VirtioKeyboard.inf -!if $(PVSCSI_ENABLE) == TRUE - OvmfPkg/PvScsiDxe/PvScsiDxe.inf -!endif -!if $(MPT_SCSI_ENABLE) == TRUE - OvmfPkg/MptScsiDxe/MptScsiDxe.inf -!endif -!if $(LSI_SCSI_ENABLE) == TRUE - OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf -!endif MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf @@ -1036,6 +1025,7 @@ !include OvmfPkg/Include/Dsc/ShellComponents.dsc.inc !include OvmfPkg/Include/Dsc/MorLock.dsc.inc !include OvmfPkg/Include/Dsc/OvmfRngComponents.dsc.inc +!include OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc !if $(SECURE_BOOT_ENABLE) == TRUE SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf index 046d74f9b7cd..b332d3bb8ea9 100644 --- a/OvmfPkg/OvmfPkgX64.fdf +++ b/OvmfPkg/OvmfPkgX64.fdf @@ -278,15 +278,6 @@ INF OvmfPkg/VirtioBlkDxe/VirtioBlk.inf INF OvmfPkg/VirtioScsiDxe/VirtioScsi.inf INF OvmfPkg/VirtioSerialDxe/VirtioSerial.inf INF OvmfPkg/VirtioKeyboardDxe/VirtioKeyboard.inf -!if $(PVSCSI_ENABLE) == TRUE -INF OvmfPkg/PvScsiDxe/PvScsiDxe.inf -!endif -!if $(MPT_SCSI_ENABLE) == TRUE -INF OvmfPkg/MptScsiDxe/MptScsiDxe.inf -!endif -!if $(LSI_SCSI_ENABLE) == TRUE -INF OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf -!endif !if $(SECURE_BOOT_ENABLE) == TRUE INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf @@ -449,6 +440,7 @@ INF OvmfPkg/Tcg/TdTcg2Dxe/TdTcg2Dxe.inf !include OvmfPkg/Include/Fdf/ShellDxe.fdf.inc !include OvmfPkg/Include/Fdf/MorLock.fdf.inc !include OvmfPkg/Include/Fdf/OvmfRngDxe.fdf.inc +!include OvmfPkg/Include/Fdf/OvmfOptHw.fdf.inc # # Smbios Measurement support From 55b48c85a8dcfbea0887acc68a7cff6059a1aaa6 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 9 May 2025 12:21:49 +0200 Subject: [PATCH 0174/1172] OvmfPkg: switch OvmfPkgIa32X64 to OptHw include files. Signed-off-by: Gerd Hoffmann --- OvmfPkg/OvmfPkgIa32X64.dsc | 14 ++------------ OvmfPkg/OvmfPkgIa32X64.fdf | 10 +--------- 2 files changed, 3 insertions(+), 21 deletions(-) diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc index bab9b91b0ad0..836d9ffca731 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc @@ -56,9 +56,7 @@ # # Device drivers # - DEFINE PVSCSI_ENABLE = FALSE - DEFINE MPT_SCSI_ENABLE = FALSE - DEFINE LSI_SCSI_ENABLE = FALSE +!include OvmfPkg/Include/Dsc/OvmfOptHwDefines.dsc.inc # # Flash size selection. Setting FD_SIZE_IN_KB on the command line directly to @@ -814,15 +812,6 @@ OvmfPkg/VirtioScsiDxe/VirtioScsi.inf OvmfPkg/VirtioSerialDxe/VirtioSerial.inf OvmfPkg/VirtioKeyboardDxe/VirtioKeyboard.inf -!if $(PVSCSI_ENABLE) == TRUE - OvmfPkg/PvScsiDxe/PvScsiDxe.inf -!endif -!if $(MPT_SCSI_ENABLE) == TRUE - OvmfPkg/MptScsiDxe/MptScsiDxe.inf -!endif -!if $(LSI_SCSI_ENABLE) == TRUE - OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf -!endif MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf @@ -902,6 +891,7 @@ !include OvmfPkg/Include/Dsc/ShellComponents.dsc.inc !include OvmfPkg/Include/Dsc/MorLock.dsc.inc !include OvmfPkg/Include/Dsc/OvmfRngComponents.dsc.inc +!include OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc !if $(SECURE_BOOT_ENABLE) == TRUE SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf index 41981d58d899..081faa5ee6d5 100644 --- a/OvmfPkg/OvmfPkgIa32X64.fdf +++ b/OvmfPkg/OvmfPkgIa32X64.fdf @@ -244,15 +244,6 @@ INF OvmfPkg/VirtioBlkDxe/VirtioBlk.inf INF OvmfPkg/VirtioScsiDxe/VirtioScsi.inf INF OvmfPkg/VirtioSerialDxe/VirtioSerial.inf INF OvmfPkg/VirtioKeyboardDxe/VirtioKeyboard.inf -!if $(PVSCSI_ENABLE) == TRUE -INF OvmfPkg/PvScsiDxe/PvScsiDxe.inf -!endif -!if $(MPT_SCSI_ENABLE) == TRUE -INF OvmfPkg/MptScsiDxe/MptScsiDxe.inf -!endif -!if $(LSI_SCSI_ENABLE) == TRUE -INF OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf -!endif !if $(SECURE_BOOT_ENABLE) == TRUE INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf @@ -379,6 +370,7 @@ INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf !include OvmfPkg/Include/Fdf/ShellDxe.fdf.inc !include OvmfPkg/Include/Fdf/MorLock.fdf.inc !include OvmfPkg/Include/Fdf/OvmfRngDxe.fdf.inc +!include OvmfPkg/Include/Fdf/OvmfOptHw.fdf.inc ################################################################################ From fceccd3eda35023cdd802d562927b46ab3527e8e Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 9 May 2025 12:27:18 +0200 Subject: [PATCH 0175/1172] OvmfPkg: switch OvmfPkgIa32 to OptHw include files. Signed-off-by: Gerd Hoffmann --- OvmfPkg/OvmfPkgIa32.dsc | 14 ++------------ OvmfPkg/OvmfPkgIa32.fdf | 10 +--------- 2 files changed, 3 insertions(+), 21 deletions(-) diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc index 6c7765206aa9..86c1d6ecbaff 100644 --- a/OvmfPkg/OvmfPkgIa32.dsc +++ b/OvmfPkg/OvmfPkgIa32.dsc @@ -56,9 +56,7 @@ # # Device drivers # - DEFINE PVSCSI_ENABLE = FALSE - DEFINE MPT_SCSI_ENABLE = FALSE - DEFINE LSI_SCSI_ENABLE = FALSE +!include OvmfPkg/Include/Dsc/OvmfOptHwDefines.dsc.inc # # Flash size selection. Setting FD_SIZE_IN_KB on the command line directly to @@ -778,15 +776,6 @@ OvmfPkg/VirtioBlkDxe/VirtioBlk.inf OvmfPkg/VirtioScsiDxe/VirtioScsi.inf OvmfPkg/VirtioSerialDxe/VirtioSerial.inf -!if $(PVSCSI_ENABLE) == TRUE - OvmfPkg/PvScsiDxe/PvScsiDxe.inf -!endif -!if $(MPT_SCSI_ENABLE) == TRUE - OvmfPkg/MptScsiDxe/MptScsiDxe.inf -!endif -!if $(LSI_SCSI_ENABLE) == TRUE - OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf -!endif MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf @@ -863,6 +852,7 @@ !include OvmfPkg/Include/Dsc/ShellComponents.dsc.inc !include OvmfPkg/Include/Dsc/MorLock.dsc.inc !include OvmfPkg/Include/Dsc/OvmfRngComponents.dsc.inc +!include OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc !if $(SECURE_BOOT_ENABLE) == TRUE SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf index d6abacc03b4e..ea693bf4a01f 100644 --- a/OvmfPkg/OvmfPkgIa32.fdf +++ b/OvmfPkg/OvmfPkgIa32.fdf @@ -233,15 +233,6 @@ INF OvmfPkg/Virtio10Dxe/Virtio10.inf INF OvmfPkg/VirtioBlkDxe/VirtioBlk.inf INF OvmfPkg/VirtioScsiDxe/VirtioScsi.inf INF OvmfPkg/VirtioSerialDxe/VirtioSerial.inf -!if $(PVSCSI_ENABLE) == TRUE -INF OvmfPkg/PvScsiDxe/PvScsiDxe.inf -!endif -!if $(MPT_SCSI_ENABLE) == TRUE -INF OvmfPkg/MptScsiDxe/MptScsiDxe.inf -!endif -!if $(LSI_SCSI_ENABLE) == TRUE -INF OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf -!endif !if $(SECURE_BOOT_ENABLE) == TRUE INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf @@ -362,6 +353,7 @@ INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf !include OvmfPkg/Include/Fdf/ShellDxe.fdf.inc !include OvmfPkg/Include/Fdf/MorLock.fdf.inc !include OvmfPkg/Include/Fdf/OvmfRngDxe.fdf.inc +!include OvmfPkg/Include/Fdf/OvmfOptHw.fdf.inc !if $(LOAD_X64_ON_IA32_ENABLE) == TRUE INF OvmfPkg/CompatImageLoaderDxe/CompatImageLoaderDxe.inf From 391e350cec72f3784928457e9fde6af3f0e1e477 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 9 May 2025 12:30:06 +0200 Subject: [PATCH 0176/1172] OvmfPkg: switch CloudHw to OptHw include files. Signed-off-by: Gerd Hoffmann --- OvmfPkg/CloudHv/CloudHvX64.dsc | 14 ++------------ OvmfPkg/CloudHv/CloudHvX64.fdf | 10 +--------- 2 files changed, 3 insertions(+), 21 deletions(-) diff --git a/OvmfPkg/CloudHv/CloudHvX64.dsc b/OvmfPkg/CloudHv/CloudHvX64.dsc index 0a068ecdeeae..d6db3ee31467 100644 --- a/OvmfPkg/CloudHv/CloudHvX64.dsc +++ b/OvmfPkg/CloudHv/CloudHvX64.dsc @@ -55,9 +55,7 @@ # # Device drivers # - DEFINE PVSCSI_ENABLE = FALSE - DEFINE MPT_SCSI_ENABLE = FALSE - DEFINE LSI_SCSI_ENABLE = FALSE +!include OvmfPkg/Include/Dsc/OvmfOptHwDefines.dsc.inc # # Flash size selection. Setting FD_SIZE_IN_KB on the command line directly to @@ -781,15 +779,6 @@ OvmfPkg/VirtioBlkDxe/VirtioBlk.inf OvmfPkg/VirtioScsiDxe/VirtioScsi.inf OvmfPkg/VirtioRngDxe/VirtioRng.inf -!if $(PVSCSI_ENABLE) == TRUE - OvmfPkg/PvScsiDxe/PvScsiDxe.inf -!endif -!if $(MPT_SCSI_ENABLE) == TRUE - OvmfPkg/MptScsiDxe/MptScsiDxe.inf -!endif -!if $(LSI_SCSI_ENABLE) == TRUE - OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf -!endif MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf @@ -852,6 +841,7 @@ !include OvmfPkg/Include/Dsc/NetworkComponents.dsc.inc !include OvmfPkg/Include/Dsc/ShellComponents.dsc.inc +!include OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc !if $(SECURE_BOOT_ENABLE) == TRUE SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf diff --git a/OvmfPkg/CloudHv/CloudHvX64.fdf b/OvmfPkg/CloudHv/CloudHvX64.fdf index 99d50fd7ecb2..346394cf188a 100644 --- a/OvmfPkg/CloudHv/CloudHvX64.fdf +++ b/OvmfPkg/CloudHv/CloudHvX64.fdf @@ -233,15 +233,6 @@ INF OvmfPkg/Virtio10Dxe/Virtio10.inf INF OvmfPkg/VirtioBlkDxe/VirtioBlk.inf INF OvmfPkg/VirtioScsiDxe/VirtioScsi.inf INF OvmfPkg/VirtioRngDxe/VirtioRng.inf -!if $(PVSCSI_ENABLE) == TRUE -INF OvmfPkg/PvScsiDxe/PvScsiDxe.inf -!endif -!if $(MPT_SCSI_ENABLE) == TRUE -INF OvmfPkg/MptScsiDxe/MptScsiDxe.inf -!endif -!if $(LSI_SCSI_ENABLE) == TRUE -INF OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf -!endif !if $(SECURE_BOOT_ENABLE) == TRUE INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf @@ -343,6 +334,7 @@ INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf # TPM support # !include OvmfPkg/Include/Fdf/OvmfTpmDxe.fdf.inc +!include OvmfPkg/Include/Fdf/OvmfOptHw.fdf.inc ################################################################################ From 57b9a6235cf8571f65dbd2026e74940e0cff82f9 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 9 May 2025 12:25:41 +0200 Subject: [PATCH 0177/1172] OvmfPkg: switch AmdSev to OptHw include files. Signed-off-by: Gerd Hoffmann --- OvmfPkg/AmdSev/AmdSevX64.dsc | 14 ++------------ OvmfPkg/AmdSev/AmdSevX64.fdf | 10 +--------- 2 files changed, 3 insertions(+), 21 deletions(-) diff --git a/OvmfPkg/AmdSev/AmdSevX64.dsc b/OvmfPkg/AmdSev/AmdSevX64.dsc index df8cc2c2c34e..3592381c5e8e 100644 --- a/OvmfPkg/AmdSev/AmdSevX64.dsc +++ b/OvmfPkg/AmdSev/AmdSevX64.dsc @@ -43,9 +43,7 @@ # # Device drivers # - DEFINE PVSCSI_ENABLE = FALSE - DEFINE MPT_SCSI_ENABLE = FALSE - DEFINE LSI_SCSI_ENABLE = FALSE +!include OvmfPkg/Include/Dsc/OvmfOptHwDefines.dsc.inc # # Flash size selection. Setting FD_SIZE_IN_KB on the command line directly to @@ -654,15 +652,6 @@ OvmfPkg/Virtio10Dxe/Virtio10.inf OvmfPkg/VirtioBlkDxe/VirtioBlk.inf OvmfPkg/VirtioScsiDxe/VirtioScsi.inf -!if $(PVSCSI_ENABLE) == TRUE - OvmfPkg/PvScsiDxe/PvScsiDxe.inf -!endif -!if $(MPT_SCSI_ENABLE) == TRUE - OvmfPkg/MptScsiDxe/MptScsiDxe.inf -!endif -!if $(LSI_SCSI_ENABLE) == TRUE - OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf -!endif MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf @@ -738,6 +727,7 @@ !include OvmfPkg/Include/Dsc/ShellComponents.dsc.inc !include OvmfPkg/Include/Dsc/OvmfRngComponents.dsc.inc +!include OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc OvmfPkg/PlatformDxe/Platform.inf OvmfPkg/AmdSevDxe/AmdSevDxe.inf { diff --git a/OvmfPkg/AmdSev/AmdSevX64.fdf b/OvmfPkg/AmdSev/AmdSevX64.fdf index 46e20745fe55..89b49ea7682f 100644 --- a/OvmfPkg/AmdSev/AmdSevX64.fdf +++ b/OvmfPkg/AmdSev/AmdSevX64.fdf @@ -228,15 +228,6 @@ INF OvmfPkg/VirtioPciDeviceDxe/VirtioPciDeviceDxe.inf INF OvmfPkg/Virtio10Dxe/Virtio10.inf INF OvmfPkg/VirtioBlkDxe/VirtioBlk.inf INF OvmfPkg/VirtioScsiDxe/VirtioScsi.inf -!if $(PVSCSI_ENABLE) == TRUE -INF OvmfPkg/PvScsiDxe/PvScsiDxe.inf -!endif -!if $(MPT_SCSI_ENABLE) == TRUE -INF OvmfPkg/MptScsiDxe/MptScsiDxe.inf -!endif -!if $(LSI_SCSI_ENABLE) == TRUE -INF OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf -!endif INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf INF MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf @@ -322,6 +313,7 @@ INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf !include OvmfPkg/Include/Fdf/ShellDxe.fdf.inc !include OvmfPkg/Include/Fdf/OvmfRngDxe.fdf.inc +!include OvmfPkg/Include/Fdf/OvmfOptHw.fdf.inc ################################################################################ From 3798da443eaba572ea432ebe2c576a9edfa5573e Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 9 May 2025 12:33:26 +0200 Subject: [PATCH 0178/1172] OvmfPkg: switch IntelTdx to OptHw include files. Signed-off-by: Gerd Hoffmann --- OvmfPkg/IntelTdx/IntelTdxX64.dsc | 14 ++------------ OvmfPkg/IntelTdx/IntelTdxX64.fdf | 10 +--------- 2 files changed, 3 insertions(+), 21 deletions(-) diff --git a/OvmfPkg/IntelTdx/IntelTdxX64.dsc b/OvmfPkg/IntelTdx/IntelTdxX64.dsc index f1b85b251ecc..637dc7dfed11 100644 --- a/OvmfPkg/IntelTdx/IntelTdxX64.dsc +++ b/OvmfPkg/IntelTdx/IntelTdxX64.dsc @@ -39,9 +39,7 @@ # # Device drivers # - DEFINE PVSCSI_ENABLE = FALSE - DEFINE MPT_SCSI_ENABLE = FALSE - DEFINE LSI_SCSI_ENABLE = FALSE +!include OvmfPkg/Include/Dsc/OvmfOptHwDefines.dsc.inc # # Flash size selection. Setting FD_SIZE_IN_KB on the command line directly to @@ -641,15 +639,6 @@ OvmfPkg/Virtio10Dxe/Virtio10.inf OvmfPkg/VirtioBlkDxe/VirtioBlk.inf OvmfPkg/VirtioScsiDxe/VirtioScsi.inf -!if $(PVSCSI_ENABLE) == TRUE - OvmfPkg/PvScsiDxe/PvScsiDxe.inf -!endif -!if $(MPT_SCSI_ENABLE) == TRUE - OvmfPkg/MptScsiDxe/MptScsiDxe.inf -!endif -!if $(LSI_SCSI_ENABLE) == TRUE - OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf -!endif MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf @@ -724,6 +713,7 @@ !include OvmfPkg/Include/Dsc/ShellComponents.dsc.inc !include OvmfPkg/Include/Dsc/OvmfRngComponents.dsc.inc +!include OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc !if $(SECURE_BOOT_ENABLE) == TRUE SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf diff --git a/OvmfPkg/IntelTdx/IntelTdxX64.fdf b/OvmfPkg/IntelTdx/IntelTdxX64.fdf index c05761abeaa0..da48f67fb342 100644 --- a/OvmfPkg/IntelTdx/IntelTdxX64.fdf +++ b/OvmfPkg/IntelTdx/IntelTdxX64.fdf @@ -291,15 +291,6 @@ READ_LOCK_STATUS = TRUE # INF MdeModulePkg/Universal/EbcDxe/EbcDxe.inf INF OvmfPkg/VirtioScsiDxe/VirtioScsi.inf -!if $(PVSCSI_ENABLE) == TRUE -INF OvmfPkg/PvScsiDxe/PvScsiDxe.inf -!endif -!if $(MPT_SCSI_ENABLE) == TRUE -INF OvmfPkg/MptScsiDxe/MptScsiDxe.inf -!endif -!if $(LSI_SCSI_ENABLE) == TRUE -INF OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf -!endif INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf INF MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.inf INF MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf @@ -332,6 +323,7 @@ INF OvmfPkg/PlatformDxe/Platform.inf !include OvmfPkg/Include/Fdf/ShellDxe.fdf.inc !include OvmfPkg/Include/Fdf/OvmfRngDxe.fdf.inc +!include OvmfPkg/Include/Fdf/OvmfOptHw.fdf.inc ################################################################################ From a3c6636d1eb5cafb67148cf10056f3cc902dcd0b Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 9 May 2025 11:26:26 +0200 Subject: [PATCH 0179/1172] OvmfPkg: add sdcard support Signed-off-by: Gerd Hoffmann --- OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc | 5 +++++ OvmfPkg/Include/Dsc/OvmfOptHwDefines.dsc.inc | 1 + OvmfPkg/Include/Fdf/OvmfOptHw.fdf.inc | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc b/OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc index faf049e754c6..569abb2ec606 100644 --- a/OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc +++ b/OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc @@ -13,3 +13,8 @@ !if $(LSI_SCSI_ENABLE) == TRUE OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf !endif +!if $(SDCARD_ENABLE) == TRUE + MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.inf + MdeModulePkg/Bus/Sd/SdDxe/SdDxe.inf + MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.inf +!endif diff --git a/OvmfPkg/Include/Dsc/OvmfOptHwDefines.dsc.inc b/OvmfPkg/Include/Dsc/OvmfOptHwDefines.dsc.inc index 54a631ada662..198de48b8a3f 100644 --- a/OvmfPkg/Include/Dsc/OvmfOptHwDefines.dsc.inc +++ b/OvmfPkg/Include/Dsc/OvmfOptHwDefines.dsc.inc @@ -7,3 +7,4 @@ DEFINE PVSCSI_ENABLE = FALSE DEFINE MPT_SCSI_ENABLE = FALSE DEFINE LSI_SCSI_ENABLE = FALSE + DEFINE SDCARD_ENABLE = TRUE diff --git a/OvmfPkg/Include/Fdf/OvmfOptHw.fdf.inc b/OvmfPkg/Include/Fdf/OvmfOptHw.fdf.inc index 60698d0a3c96..ec63f9b807fb 100644 --- a/OvmfPkg/Include/Fdf/OvmfOptHw.fdf.inc +++ b/OvmfPkg/Include/Fdf/OvmfOptHw.fdf.inc @@ -13,3 +13,8 @@ INF OvmfPkg/MptScsiDxe/MptScsiDxe.inf !if $(LSI_SCSI_ENABLE) == TRUE INF OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf !endif +!if $(SDCARD_ENABLE) == TRUE +INF MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.inf +INF MdeModulePkg/Bus/Sd/SdDxe/SdDxe.inf +INF MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.inf +!endif From 0b0d6e42f4d9238fdb0bfb601029a5d304a72f74 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 9 May 2025 14:38:34 +0200 Subject: [PATCH 0180/1172] OvmfPkg: add runtime switch for sdcard support Signed-off-by: Gerd Hoffmann --- OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc | 7 ++++++- OvmfPkg/RUNTIME_CONFIG.md | 10 ++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc b/OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc index 569abb2ec606..e3f955eca3e6 100644 --- a/OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc +++ b/OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc @@ -14,7 +14,12 @@ OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf !endif !if $(SDCARD_ENABLE) == TRUE - MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.inf + MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.inf { + + UefiDriverEntryPoint|OvmfPkg/Library/UefiDriverEntryPointFwCfgOverrideLib/UefiDriverEntryPointFwCfgOverrideLib.inf + + gUefiOvmfPkgTokenSpaceGuid.PcdEntryPointOverrideFwCfgVarName|"opt/org.tianocore/SDCardSupport" + } MdeModulePkg/Bus/Sd/SdDxe/SdDxe.inf MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.inf !endif diff --git a/OvmfPkg/RUNTIME_CONFIG.md b/OvmfPkg/RUNTIME_CONFIG.md index 42a472652c80..b75a5dacadf5 100644 --- a/OvmfPkg/RUNTIME_CONFIG.md +++ b/OvmfPkg/RUNTIME_CONFIG.md @@ -247,3 +247,13 @@ qemu-system-x86_64 -fw_cfg name=opt/org.tianocore/UsbStorageSupport,string=yes ``` +## Other: opt/org.tianocore/SDCardSupport + +This enables/disables the edk2 drivers SD card support. +Default: enabled. Usage: + +``` +qemu-system-x86_64 -fw_cfg name=opt/org.tianocore/SDCardSupport,string=no +``` + + From 4c282b4b4c2211ec111c5b932b1f6448029489c4 Mon Sep 17 00:00:00 2001 From: Ajan Zhong Date: Sun, 12 Jan 2025 17:47:28 +0800 Subject: [PATCH 0181/1172] ArmPkg,ArmPlatformPkg,ArmVirtPkg,UefiCpuPkg: Move ArmMmuLib.h to UefiCpuPkg Move the ArmMmuLib interface definition to UefiCpuPkg, with this change, MMU libraries for ARM, AARCH64, RiscV, LongArch64 architectures all reside in UefiCpuPkg. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Ajan Zhong --- ArmPkg/ArmPkg.dec | 6 ------ .../Drivers/ArmPsciMpServicesDxe/ArmPsciMpServicesDxe.inf | 1 + ArmPkg/Drivers/CpuDxe/CpuDxe.inf | 1 + ArmPkg/Drivers/CpuPei/CpuPei.inf | 1 + ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf | 1 + ArmPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf | 1 + .../ArmStandaloneMmCoreEntryPoint.inf | 1 + ArmPkg/Library/OpteeLib/OpteeLib.inf | 1 + .../Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.inf | 1 + ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.inf | 1 + .../ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.inf | 1 + {ArmPkg => UefiCpuPkg}/Include/Library/ArmMmuLib.h | 0 UefiCpuPkg/UefiCpuPkg.dec | 8 ++++++++ 13 files changed, 18 insertions(+), 6 deletions(-) rename {ArmPkg => UefiCpuPkg}/Include/Library/ArmMmuLib.h (100%) diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec index edf45670c6ab..b528bb4c7de1 100644 --- a/ArmPkg/ArmPkg.dec +++ b/ArmPkg/ArmPkg.dec @@ -41,10 +41,6 @@ # ArmHvcLib|Include/Library/ArmHvcLib.h - ## @libraryclass Provides a Mmu interface. - # - ArmMmuLib|Include/Library/ArmMmuLib.h - ## @libraryclass Provides a Mailbox Transport Layer (MTL) interface # for the System Control and Management Interface (SCMI). # @@ -91,8 +87,6 @@ # Include/Guid/ArmMpCoreInfo.h gArmMpCoreInfoGuid = { 0xa4ee0728, 0xe5d7, 0x4ac5, {0xb2, 0x1e, 0x65, 0x8e, 0xd8, 0x57, 0xe8, 0x34} } - gArmMmuReplaceLiveTranslationEntryFuncGuid = { 0xa8b50ff3, 0x08ec, 0x4dd3, {0xbf, 0x04, 0x28, 0xbf, 0x71, 0x75, 0xc7, 0x4a} } - [Protocols.common] ## Arm System Control and Management Interface(SCMI) Base protocol ## ArmPkg/Include/Protocol/ArmScmiBaseProtocol.h diff --git a/ArmPkg/Drivers/ArmPsciMpServicesDxe/ArmPsciMpServicesDxe.inf b/ArmPkg/Drivers/ArmPsciMpServicesDxe/ArmPsciMpServicesDxe.inf index 2c9ab99038f2..78303e28a14d 100644 --- a/ArmPkg/Drivers/ArmPsciMpServicesDxe/ArmPsciMpServicesDxe.inf +++ b/ArmPkg/Drivers/ArmPsciMpServicesDxe/ArmPsciMpServicesDxe.inf @@ -27,6 +27,7 @@ EmbeddedPkg/EmbeddedPkg.dec MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec + UefiCpuPkg/UefiCpuPkg.dec [LibraryClasses] ArmLib diff --git a/ArmPkg/Drivers/CpuDxe/CpuDxe.inf b/ArmPkg/Drivers/CpuDxe/CpuDxe.inf index ff8a67de1337..a19961464ad7 100644 --- a/ArmPkg/Drivers/CpuDxe/CpuDxe.inf +++ b/ArmPkg/Drivers/CpuDxe/CpuDxe.inf @@ -36,6 +36,7 @@ EmbeddedPkg/EmbeddedPkg.dec MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec + UefiCpuPkg/UefiCpuPkg.dec [LibraryClasses] ArmLib diff --git a/ArmPkg/Drivers/CpuPei/CpuPei.inf b/ArmPkg/Drivers/CpuPei/CpuPei.inf index 49b67077ec61..a9a238abfee9 100644 --- a/ArmPkg/Drivers/CpuPei/CpuPei.inf +++ b/ArmPkg/Drivers/CpuPei/CpuPei.inf @@ -33,6 +33,7 @@ MdePkg/MdePkg.dec EmbeddedPkg/EmbeddedPkg.dec ArmPkg/ArmPkg.dec + UefiCpuPkg/UefiCpuPkg.dec [LibraryClasses] PeimEntryPoint diff --git a/ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf b/ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf index 510511bd414f..5ee4afae573c 100644 --- a/ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf +++ b/ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf @@ -34,6 +34,7 @@ ArmPkg/ArmPkg.dec EmbeddedPkg/EmbeddedPkg.dec MdePkg/MdePkg.dec + UefiCpuPkg/UefiCpuPkg.dec [LibraryClasses] ArmLib diff --git a/ArmPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf b/ArmPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf index 37424628aa07..37732da6c877 100644 --- a/ArmPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf +++ b/ArmPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf @@ -26,6 +26,7 @@ ArmPkg/ArmPkg.dec EmbeddedPkg/EmbeddedPkg.dec MdePkg/MdePkg.dec + UefiCpuPkg/UefiCpuPkg.dec [LibraryClasses] ArmLib diff --git a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.inf b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.inf index e94a2660dbf7..711f83d39728 100644 --- a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.inf +++ b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.inf @@ -36,6 +36,7 @@ MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec StandaloneMmPkg/StandaloneMmPkg.dec + UefiCpuPkg/UefiCpuPkg.dec [Packages] ArmPkg/ArmPkg.dec diff --git a/ArmPkg/Library/OpteeLib/OpteeLib.inf b/ArmPkg/Library/OpteeLib/OpteeLib.inf index 40a4d8dd6fef..146fda7df653 100644 --- a/ArmPkg/Library/OpteeLib/OpteeLib.inf +++ b/ArmPkg/Library/OpteeLib/OpteeLib.inf @@ -23,6 +23,7 @@ [Packages] ArmPkg/ArmPkg.dec MdePkg/MdePkg.dec + UefiCpuPkg/UefiCpuPkg.dec [LibraryClasses] ArmMmuLib diff --git a/ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.inf b/ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.inf index 92bb5c062e14..e41e377e8d6b 100644 --- a/ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.inf +++ b/ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.inf @@ -22,6 +22,7 @@ [Packages] ArmPkg/ArmPkg.dec MdePkg/MdePkg.dec + UefiCpuPkg/UefiCpuPkg.dec [LibraryClasses] ArmLib diff --git a/ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.inf b/ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.inf index b8254cba7e7d..3d9079a6c55a 100644 --- a/ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.inf +++ b/ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.inf @@ -23,6 +23,7 @@ EmbeddedPkg/EmbeddedPkg.dec ArmPkg/ArmPkg.dec ArmPlatformPkg/ArmPlatformPkg.dec + UefiCpuPkg/UefiCpuPkg.dec [LibraryClasses] DebugLib diff --git a/ArmVirtPkg/Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.inf b/ArmVirtPkg/Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.inf index 48d9c66b22db..6292347bbb22 100644 --- a/ArmVirtPkg/Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.inf +++ b/ArmVirtPkg/Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.inf @@ -24,6 +24,7 @@ ArmPkg/ArmPkg.dec ArmPlatformPkg/ArmPlatformPkg.dec ArmVirtPkg/ArmVirtPkg.dec + UefiCpuPkg/UefiCpuPkg.dec [LibraryClasses] DebugLib diff --git a/ArmPkg/Include/Library/ArmMmuLib.h b/UefiCpuPkg/Include/Library/ArmMmuLib.h similarity index 100% rename from ArmPkg/Include/Library/ArmMmuLib.h rename to UefiCpuPkg/Include/Library/ArmMmuLib.h diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec index 9a8471ed443a..8164c59f1dfd 100644 --- a/UefiCpuPkg/UefiCpuPkg.dec +++ b/UefiCpuPkg/UefiCpuPkg.dec @@ -90,6 +90,11 @@ ## @libraryclass Provides functions for the memory management unit. CpuMmuLib|Include/Library/CpuMmuLib.h +[LibraryClasses.ARM, LibraryClasses.AARCH64] + ## @libraryclass Provides a Mmu interface. + # + ArmMmuLib|Include/Library/ArmMmuLib.h + [Guids] gUefiCpuPkgTokenSpaceGuid = { 0xac05bf33, 0x995a, 0x4ed4, { 0xaa, 0xb8, 0xef, 0x7a, 0xe8, 0xf, 0x5c, 0xb0 }} gMsegSmramGuid = { 0x5802bce4, 0xeeee, 0x4e33, { 0xa1, 0x30, 0xeb, 0xad, 0x27, 0xf0, 0xe4, 0x39 }} @@ -127,6 +132,9 @@ # Include/Guid/MmAcpiS3Enable.h gMmAcpiS3EnableHobGuid = { 0xe7402821, 0x2654, 0x4c1b, { 0x99, 0x0e, 0x04, 0x8f, 0x8d, 0x82, 0xcf, 0x67 }} +[Guids.ARM, Guids.AARCH64] + gArmMmuReplaceLiveTranslationEntryFuncGuid = { 0xa8b50ff3, 0x08ec, 0x4dd3, {0xbf, 0x04, 0x28, 0xbf, 0x71, 0x75, 0xc7, 0x4a} } + [Protocols] ## Include/Protocol/SmmCpuService.h gEfiSmmCpuServiceProtocolGuid = { 0x1d202cab, 0xc8ab, 0x4d5c, { 0x94, 0xf7, 0x3c, 0xfc, 0xc0, 0xd3, 0xd3, 0x35 }} From 3ce9d3f45b1dc59e60156df9023620ecf63f9f30 Mon Sep 17 00:00:00 2001 From: Ajan Zhong Date: Thu, 3 Jul 2025 21:13:27 +0800 Subject: [PATCH 0182/1172] ArmPkg,ArmPlatformPkg,ArmVirtPkg: Add UefiCpuPkg to AcceptableDependencies Since ArmMmuLib.h has been moved to UefiCpuPkg, add corresponding dec file to AcceptableDependencies to ArmPkg, ArmPlatformPkg and ArmVirtPkg. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Ajan Zhong --- ArmPkg/ArmPkg.ci.yaml | 3 ++- ArmPlatformPkg/ArmPlatformPkg.ci.yaml | 3 ++- ArmVirtPkg/ArmVirtPkg.ci.yaml | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/ArmPkg/ArmPkg.ci.yaml b/ArmPkg/ArmPkg.ci.yaml index 2f0766a1cc52..f89660823403 100644 --- a/ArmPkg/ArmPkg.ci.yaml +++ b/ArmPkg/ArmPkg.ci.yaml @@ -50,7 +50,8 @@ "MdeModulePkg/MdeModulePkg.dec", "MdePkg/MdePkg.dec", "ShellPkg/ShellPkg.dec", - "StandaloneMmPkg/StandaloneMmPkg.dec" + "StandaloneMmPkg/StandaloneMmPkg.dec", + "UefiCpuPkg/UefiCpuPkg.dec" ], # For host based unit tests "AcceptableDependencies-HOST_APPLICATION":[ diff --git a/ArmPlatformPkg/ArmPlatformPkg.ci.yaml b/ArmPlatformPkg/ArmPlatformPkg.ci.yaml index 9c384a3febad..e161d2c0fe44 100644 --- a/ArmPlatformPkg/ArmPlatformPkg.ci.yaml +++ b/ArmPlatformPkg/ArmPlatformPkg.ci.yaml @@ -49,7 +49,8 @@ "ArmPkg/ArmPkg.dec", "EmbeddedPkg/EmbeddedPkg.dec", "MdeModulePkg/MdeModulePkg.dec", - "MdePkg/MdePkg.dec" + "MdePkg/MdePkg.dec", + "UefiCpuPkg/UefiCpuPkg.dec" ], # For host based unit tests "AcceptableDependencies-HOST_APPLICATION":[ diff --git a/ArmVirtPkg/ArmVirtPkg.ci.yaml b/ArmVirtPkg/ArmVirtPkg.ci.yaml index b186d4eb421e..b8b8f190bd94 100644 --- a/ArmVirtPkg/ArmVirtPkg.ci.yaml +++ b/ArmVirtPkg/ArmVirtPkg.ci.yaml @@ -55,6 +55,7 @@ "ArmPlatformPkg/ArmPlatformPkg.dec", "PcAtChipsetPkg/PcAtChipsetPkg.dec", "SecurityPkg/SecurityPkg.dec", + "UefiCpuPkg/UefiCpuPkg.dec", "ShellPkg/ShellPkg.dec" #Is this ok? ], # For host based unit tests From 07fc968c8fd69d90d7015528cbaba6f1120e09fa Mon Sep 17 00:00:00 2001 From: Ajan Zhong Date: Tue, 18 Mar 2025 11:56:33 +0800 Subject: [PATCH 0183/1172] ArmPkg: Drop PcdNormalMemoryNonshareableOverride support There are no upstream platforms sets this Pcd, this Pcd was introduced by ArmVExpress-CTA15-A7. Signed-off-by: Ajan Zhong --- ArmPkg/ArmPkg.dec | 6 -- ArmPkg/Library/ArmLib/ArmBaseLib.inf | 3 - ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c | 70 +++----------------- ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf | 3 - 4 files changed, 10 insertions(+), 72 deletions(-) diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec index b528bb4c7de1..04252dab06c9 100644 --- a/ArmPkg/ArmPkg.dec +++ b/ArmPkg/ArmPkg.dec @@ -115,12 +115,6 @@ # attributes initially, and can be disabled otherwise. gArmTokenSpaceGuid.PcdRemapUnusedMemoryNx|TRUE|BOOLEAN|0x00000048 -[PcdsFeatureFlag.ARM] - # Whether to map normal memory as non-shareable. FALSE is the safe choice, but - # TRUE may be appropriate to fix performance problems if you don't care about - # hardware coherency (i.e., no virtualization or cache coherent DMA) - gArmTokenSpaceGuid.PcdNormalMemoryNonshareableOverride|FALSE|BOOLEAN|0x00000043 - [PcdsFixedAtBuild.common] gArmTokenSpaceGuid.PcdTrustzoneSupport|FALSE|BOOLEAN|0x00000006 diff --git a/ArmPkg/Library/ArmLib/ArmBaseLib.inf b/ArmPkg/Library/ArmLib/ArmBaseLib.inf index e37d85bee471..6d1acd281e25 100644 --- a/ArmPkg/Library/ArmLib/ArmBaseLib.inf +++ b/ArmPkg/Library/ArmLib/ArmBaseLib.inf @@ -45,6 +45,3 @@ [Packages] ArmPkg/ArmPkg.dec MdePkg/MdePkg.dec - -[FeaturePcd.ARM] - gArmTokenSpaceGuid.PcdNormalMemoryNonshareableOverride diff --git a/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c b/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c index 60dc6c987cbd..643541dcb6d8 100644 --- a/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c +++ b/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c @@ -43,43 +43,6 @@ ArmHasMpExtensions ( VOID ); -STATIC -BOOLEAN -PreferNonshareableMemory ( - VOID - ) -{ - UINTN Mmfr; - UINTN Val; - - if (FeaturePcdGet (PcdNormalMemoryNonshareableOverride)) { - return TRUE; - } - - // - // Check whether the innermost level of shareability (the level we will use - // by default to map normal memory) is implemented with hardware coherency - // support. Otherwise, revert to mapping as non-shareable. - // - Mmfr = ArmReadIdMmfr0 (); - switch ((Mmfr >> ID_MMFR0_SHARELVL_SHIFT) & ID_MMFR0_SHARELVL_MASK) { - case ID_MMFR0_SHARELVL_ONE: - // one level of shareability - Val = (Mmfr >> ID_MMFR0_OUTERSHR_SHIFT) & ID_MMFR0_OUTERSHR_MASK; - break; - case ID_MMFR0_SHARELVL_TWO: - // two levels of shareability - Val = (Mmfr >> ID_MMFR0_INNERSHR_SHIFT) & ID_MMFR0_INNERSHR_MASK; - break; - default: - // unexpected value -> shareable is the safe option - ASSERT (FALSE); - return FALSE; - } - - return Val != ID_MMFR0_SHR_IMP_HW_COHERENT; -} - STATIC VOID PopulateLevel2PageTable ( @@ -128,10 +91,6 @@ PopulateLevel2PageTable ( break; } - if (PreferNonshareableMemory ()) { - PageAttributes &= ~TT_DESCRIPTOR_PAGE_S_SHARED; - } - // Check if the Section Entry has already been populated. Otherwise attach a // Level 2 Translation Table to it if (*SectionEntry != 0) { @@ -268,10 +227,6 @@ FillTranslationTable ( break; } - if (PreferNonshareableMemory ()) { - Attributes &= ~TT_DESCRIPTOR_SECTION_S_SHARED; - } - // Get the first section entry for this mapping SectionEntry = TRANSLATION_TABLE_ENTRY_FOR_VIRTUAL_ADDRESS (TranslationTable, MemoryRegion->VirtualBase); @@ -370,21 +325,16 @@ ArmConfigureMmu ( TTBRAttributes = ArmHasMpExtensions () ? TTBR_MP_WRITE_BACK_ALLOC : TTBR_WRITE_BACK_ALLOC; - if (TTBRAttributes & TTBR_SHAREABLE) { - if (PreferNonshareableMemory ()) { - TTBRAttributes ^= TTBR_SHAREABLE; - } else { - // - // Unlike the S bit in the short descriptors, which implies inner shareable - // on an implementation that supports two levels, the meaning of the S bit - // in the TTBR depends on the NOS bit, which defaults to Outer Shareable. - // However, we should only set this bit after we have confirmed that the - // implementation supports multiple levels, or else the NOS bit is UNK/SBZP - // - if (((ArmReadIdMmfr0 () >> 12) & 0xf) != 0) { - TTBRAttributes |= TTBR_NOT_OUTER_SHAREABLE; - } - } + + // + // Unlike the S bit in the short descriptors, which implies inner shareable + // on an implementation that supports two levels, the meaning of the S bit + // in the TTBR depends on the NOS bit, which defaults to Outer Shareable. + // However, we should only set this bit after we have confirmed that the + // implementation supports multiple levels, or else the NOS bit is UNK/SBZP + // + if (((ArmReadIdMmfr0 () >> 12) & 0xf) != 0) { + TTBRAttributes |= TTBR_NOT_OUTER_SHAREABLE; } ArmSetTTBR0 ((VOID *)((UINTN)TranslationTable | TTBRAttributes)); diff --git a/ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf b/ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf index 5ee4afae573c..1a9552b87134 100644 --- a/ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf +++ b/ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf @@ -44,6 +44,3 @@ [Guids] gArmMmuReplaceLiveTranslationEntryFuncGuid - -[Pcd.ARM] - gArmTokenSpaceGuid.PcdNormalMemoryNonshareableOverride From 5b3bb5939e8cd94288672cb5f0107c95715db1a9 Mon Sep 17 00:00:00 2001 From: Ajan Zhong Date: Tue, 18 Mar 2025 11:27:37 +0800 Subject: [PATCH 0184/1172] ArmPkg,MdePkg,UefiCpuPkg,ArmPlatformPkg,ArmVirtPkg,UefiPayloadPkg: Move ArmMmuLib Move ArmMmuLib from ArmPkg to UefiCpuPkg for easy maintaining. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Ajan Zhong --- ArmPkg/ArmPkg.dsc | 5 +---- ArmPlatformPkg/ArmPlatformPkg.dsc | 2 +- ArmVirtPkg/ArmVirtCloudHv.dsc | 2 +- ArmVirtPkg/ArmVirtKvmTool.dsc | 2 +- ArmVirtPkg/ArmVirtQemu.dsc | 4 ++-- ArmVirtPkg/ArmVirtQemuKernel.dsc | 2 +- ArmVirtPkg/ArmVirtXen.dsc | 2 +- .../Library/ArmMmuLib/AArch64/ArmMmuLibCore.c | 0 .../Library/ArmMmuLib/AArch64/ArmMmuLibReplaceEntry.S | 0 .../Library/ArmMmuLib/AArch64/ArmMmuPeiLibConstructor.c | 0 .../Library/ArmMmuLib/Arm/ArmMmuLibConvert.c | 0 {ArmPkg => UefiCpuPkg}/Library/ArmMmuLib/Arm/ArmMmuLibCore.c | 0 .../Library/ArmMmuLib/Arm/ArmMmuLibUpdate.c | 0 .../Library/ArmMmuLib/Arm/ArmMmuLibV7Support.S | 0 {ArmPkg => UefiCpuPkg}/Library/ArmMmuLib/ArmMmuBaseLib.inf | 2 -- {ArmPkg => UefiCpuPkg}/Library/ArmMmuLib/ArmMmuLibInternal.h | 0 {ArmPkg => UefiCpuPkg}/Library/ArmMmuLib/ArmMmuPeiLib.inf | 2 -- UefiCpuPkg/UefiCpuPkg.dsc | 4 ++++ UefiPayloadPkg/UefiPayloadPkg.dsc | 4 ++-- 19 files changed, 14 insertions(+), 17 deletions(-) rename {ArmPkg => UefiCpuPkg}/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c (100%) rename {ArmPkg => UefiCpuPkg}/Library/ArmMmuLib/AArch64/ArmMmuLibReplaceEntry.S (100%) rename {ArmPkg => UefiCpuPkg}/Library/ArmMmuLib/AArch64/ArmMmuPeiLibConstructor.c (100%) rename {ArmPkg => UefiCpuPkg}/Library/ArmMmuLib/Arm/ArmMmuLibConvert.c (100%) rename {ArmPkg => UefiCpuPkg}/Library/ArmMmuLib/Arm/ArmMmuLibCore.c (100%) rename {ArmPkg => UefiCpuPkg}/Library/ArmMmuLib/Arm/ArmMmuLibUpdate.c (100%) rename {ArmPkg => UefiCpuPkg}/Library/ArmMmuLib/Arm/ArmMmuLibV7Support.S (100%) rename {ArmPkg => UefiCpuPkg}/Library/ArmMmuLib/ArmMmuBaseLib.inf (90%) rename {ArmPkg => UefiCpuPkg}/Library/ArmMmuLib/ArmMmuLibInternal.h (100%) rename {ArmPkg => UefiCpuPkg}/Library/ArmMmuLib/ArmMmuPeiLib.inf (90%) diff --git a/ArmPkg/ArmPkg.dsc b/ArmPkg/ArmPkg.dsc index 09eafc552bf6..50b5bdb92338 100644 --- a/ArmPkg/ArmPkg.dsc +++ b/ArmPkg/ArmPkg.dsc @@ -83,7 +83,7 @@ IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf - ArmMmuLib|ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf + ArmMmuLib|UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf ArmTransferListLib|ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.inf ArmFfaLib|MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.inf @@ -139,8 +139,6 @@ ArmPkg/Filesystem/SemihostFs/SemihostFs.inf - ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf - ArmPkg/Drivers/ArmPciCpuIo2Dxe/ArmPciCpuIo2Dxe.inf ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf ArmPkg/Library/ArmLib/ArmBaseLib.inf @@ -167,7 +165,6 @@ ArmPkg/Drivers/ArmCrashDumpDxe/ArmCrashDumpDxe.inf ArmPkg/Drivers/ArmPsciMpServicesDxe/ArmPsciMpServicesDxe.inf ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.inf - ArmPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf [Components.AARCH64, Components.ARM] ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.inf diff --git a/ArmPlatformPkg/ArmPlatformPkg.dsc b/ArmPlatformPkg/ArmPlatformPkg.dsc index d805778cee89..062246d8f2f2 100644 --- a/ArmPlatformPkg/ArmPlatformPkg.dsc +++ b/ArmPlatformPkg/ArmPlatformPkg.dsc @@ -38,7 +38,7 @@ [LibraryClasses.common] ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf ArmPlatformLib|ArmPlatformPkg/Library/ArmPlatformLibNull/ArmPlatformLibNull.inf - ArmMmuLib|ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf + ArmMmuLib|UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf BaseLib|MdePkg/Library/BaseLib/BaseLib.inf BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf CacheMaintenanceLib|ArmPkg/Library/ArmCacheMaintenanceLib/ArmCacheMaintenanceLib.inf diff --git a/ArmVirtPkg/ArmVirtCloudHv.dsc b/ArmVirtPkg/ArmVirtCloudHv.dsc index 90ea579d11d0..b076f5963a4e 100644 --- a/ArmVirtPkg/ArmVirtCloudHv.dsc +++ b/ArmVirtPkg/ArmVirtCloudHv.dsc @@ -37,7 +37,7 @@ [LibraryClasses.common] ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf - ArmMmuLib|ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf + ArmMmuLib|UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf # Virtio Support VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf diff --git a/ArmVirtPkg/ArmVirtKvmTool.dsc b/ArmVirtPkg/ArmVirtKvmTool.dsc index fbf518b9837a..5cb3e45aa651 100644 --- a/ArmVirtPkg/ArmVirtKvmTool.dsc +++ b/ArmVirtPkg/ArmVirtKvmTool.dsc @@ -45,7 +45,7 @@ [LibraryClasses.common] ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf - ArmMmuLib|ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf + ArmMmuLib|UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf # Virtio Support VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc index 735b5c69904a..00f96518672e 100644 --- a/ArmVirtPkg/ArmVirtQemu.dsc +++ b/ArmVirtPkg/ArmVirtQemu.dsc @@ -62,7 +62,7 @@ [LibraryClasses.common] ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf - ArmMmuLib|ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf + ArmMmuLib|UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf # Virtio Support VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf @@ -116,7 +116,7 @@ Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf [LibraryClasses.AARCH64.PEIM] - ArmMmuLib|ArmPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf + ArmMmuLib|UefiCpuPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf BaseCryptLib|CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf [LibraryClasses.ARM.PEIM] diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc index 25aac70c05ea..9821b0d749ec 100644 --- a/ArmVirtPkg/ArmVirtQemuKernel.dsc +++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc @@ -59,7 +59,7 @@ [LibraryClasses.common] ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf - ArmMmuLib|ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf + ArmMmuLib|UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf # Virtio Support VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf diff --git a/ArmVirtPkg/ArmVirtXen.dsc b/ArmVirtPkg/ArmVirtXen.dsc index f0bca166a780..55f418238c88 100644 --- a/ArmVirtPkg/ArmVirtXen.dsc +++ b/ArmVirtPkg/ArmVirtXen.dsc @@ -42,7 +42,7 @@ ArmGenericTimerCounterLib|ArmVirtPkg/Library/XenArmGenericTimerVirtCounterLib/XenArmGenericTimerVirtCounterLib.inf ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf - ArmMmuLib|ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf + ArmMmuLib|UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf # Virtio Support VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf diff --git a/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c b/UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c similarity index 100% rename from ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c rename to UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c diff --git a/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuLibReplaceEntry.S b/UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibReplaceEntry.S similarity index 100% rename from ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuLibReplaceEntry.S rename to UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibReplaceEntry.S diff --git a/ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuPeiLibConstructor.c b/UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuPeiLibConstructor.c similarity index 100% rename from ArmPkg/Library/ArmMmuLib/AArch64/ArmMmuPeiLibConstructor.c rename to UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuPeiLibConstructor.c diff --git a/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibConvert.c b/UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibConvert.c similarity index 100% rename from ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibConvert.c rename to UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibConvert.c diff --git a/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c b/UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c similarity index 100% rename from ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c rename to UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c diff --git a/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibUpdate.c b/UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibUpdate.c similarity index 100% rename from ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibUpdate.c rename to UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibUpdate.c diff --git a/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibV7Support.S b/UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibV7Support.S similarity index 100% rename from ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibV7Support.S rename to UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibV7Support.S diff --git a/ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf b/UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf similarity index 90% rename from ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf rename to UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf index 1a9552b87134..9e92e2e583d1 100644 --- a/ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf +++ b/UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf @@ -31,8 +31,6 @@ Arm/ArmMmuLibV7Support.S |GCC [Packages] - ArmPkg/ArmPkg.dec - EmbeddedPkg/EmbeddedPkg.dec MdePkg/MdePkg.dec UefiCpuPkg/UefiCpuPkg.dec diff --git a/ArmPkg/Library/ArmMmuLib/ArmMmuLibInternal.h b/UefiCpuPkg/Library/ArmMmuLib/ArmMmuLibInternal.h similarity index 100% rename from ArmPkg/Library/ArmMmuLib/ArmMmuLibInternal.h rename to UefiCpuPkg/Library/ArmMmuLib/ArmMmuLibInternal.h diff --git a/ArmPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf b/UefiCpuPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf similarity index 90% rename from ArmPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf rename to UefiCpuPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf index 37732da6c877..ae7dbe9d7492 100644 --- a/ArmPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf +++ b/UefiCpuPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf @@ -23,8 +23,6 @@ AArch64/ArmMmuLibReplaceEntry.S [Packages] - ArmPkg/ArmPkg.dec - EmbeddedPkg/EmbeddedPkg.dec MdePkg/MdePkg.dec UefiCpuPkg/UefiCpuPkg.dec diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc index ca00756d3006..4503536b767a 100644 --- a/UefiCpuPkg/UefiCpuPkg.dsc +++ b/UefiCpuPkg/UefiCpuPkg.dsc @@ -226,7 +226,11 @@ UefiCpuPkg/CpuDxeRiscV64/CpuDxeRiscV64.inf UefiCpuPkg/CpuMmio2Dxe/CpuMmio2Dxe.inf +[Components.ARM, Components.AARCH64] + UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf + [Components.AARCH64] + UefiCpuPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf UefiCpuPkg/Library/BaseArchSupportLib/BaseArchSupportLib.inf [Components.LOONGARCH64] diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index 13d292cdc841..6310c5b4389c 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -393,7 +393,7 @@ [LibraryClasses.AARCH64] ArmHvcLib|ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf - ArmMmuLib|ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf + ArmMmuLib|UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf ArmSmcLib|MdePkg/Library/ArmSmcLib/ArmSmcLib.inf BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf @@ -1147,7 +1147,7 @@ [Components.AARCH64] ArmPkg/Drivers/ArmPciCpuIo2Dxe/ArmPciCpuIo2Dxe.inf ArmPkg/Drivers/CpuDxe/CpuDxe.inf - ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf + UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf From b95eaaf06aa88783664624ea48b1db116fafca79 Mon Sep 17 00:00:00 2001 From: Ajan Zhong Date: Thu, 24 Apr 2025 10:41:13 +0800 Subject: [PATCH 0185/1172] UefiPayloadPkg: Add Architecture layer to support multiple architectures Move IA32 and X64 architectures specified code to corresponding files. Signed-off-by: Ajan Zhong --- UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c | 87 +------------- UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h | 7 ++ UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf | 3 + UefiPayloadPkg/BlSupportDxe/X86/BlSupport.c | 115 +++++++++++++++++++ 4 files changed, 128 insertions(+), 84 deletions(-) create mode 100644 UefiPayloadPkg/BlSupportDxe/X86/BlSupport.c diff --git a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c index 2e70c4533c21..2fd6f7d66fe7 100644 --- a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c +++ b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c @@ -8,84 +8,6 @@ **/ #include "BlSupportDxe.h" -/** - Reserve MMIO/IO resource in GCD - - @param IsMMIO Flag of whether it is mmio resource or io resource. - @param GcdType Type of the space. - @param BaseAddress Base address of the space. - @param Length Length of the space. - @param Alignment Align with 2^Alignment - @param ImageHandle Handle for the image of this driver. - - @retval EFI_SUCCESS Reserve successful -**/ -EFI_STATUS -ReserveResourceInGcd ( - IN BOOLEAN IsMMIO, - IN UINTN GcdType, - IN EFI_PHYSICAL_ADDRESS BaseAddress, - IN UINT64 Length, - IN UINTN Alignment, - IN EFI_HANDLE ImageHandle - ) -{ - EFI_STATUS Status; - - if (IsMMIO) { - Status = gDS->AddMemorySpace ( - GcdType, - BaseAddress, - Length, - EFI_MEMORY_UC - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_WARN, - "Failed to add memory space :0x%lx 0x%lx\n", - BaseAddress, - Length - )); - } - - Status = gDS->AllocateMemorySpace ( - EfiGcdAllocateAddress, - GcdType, - Alignment, - Length, - &BaseAddress, - ImageHandle, - NULL - ); - } else { - Status = gDS->AddIoSpace ( - GcdType, - BaseAddress, - Length - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_WARN, - "Failed to add IO space :0x%lx 0x%lx\n", - BaseAddress, - Length - )); - } - - Status = gDS->AllocateIoSpace ( - EfiGcdAllocateAddress, - GcdType, - Alignment, - Length, - &BaseAddress, - ImageHandle, - NULL - ); - } - - return Status; -} - /** Main entry for the bootloader support DXE module. @@ -109,12 +31,6 @@ BlDxeEntryPoint ( ACPI_BOARD_INFO *AcpiBoardInfo; Status = EFI_SUCCESS; - // - // Report MMIO/IO Resources - // - ReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFEC00000, SIZE_4KB, 0, ImageHandle); // IOAPIC - - ReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFED00000, SIZE_1KB, 0, ImageHandle); // HPET // // Find the frame buffer information and update PCDs @@ -144,5 +60,8 @@ BlDxeEntryPoint ( ASSERT_EFI_ERROR (Status); } + Status = BlArchAdditionalOps (ImageHandle, SystemTable); + ASSERT_EFI_ERROR (Status); + return EFI_SUCCESS; } diff --git a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h index 4d2d05d90739..ebae6f2b5e37 100644 --- a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h +++ b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h @@ -24,4 +24,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include +EFI_STATUS +EFIAPI +BlArchAdditionalOps ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ); + #endif diff --git a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf index 96d85d2b1d83..43b69e62d8bd 100644 --- a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf +++ b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf @@ -27,6 +27,9 @@ BlSupportDxe.c BlSupportDxe.h +[Sources.IA32, Sources.X64] + X86/BlSupport.c + [Packages] MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec diff --git a/UefiPayloadPkg/BlSupportDxe/X86/BlSupport.c b/UefiPayloadPkg/BlSupportDxe/X86/BlSupport.c new file mode 100644 index 000000000000..56d4c71822b7 --- /dev/null +++ b/UefiPayloadPkg/BlSupportDxe/X86/BlSupport.c @@ -0,0 +1,115 @@ +/** @file + This file will report some MMIO/IO resources to dxe core. + + Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.
+ Copyright 2025 Google LLC + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include "BlSupportDxe.h" + +/** + Reserve MMIO/IO resource in GCD + + @param IsMMIO Flag of whether it is mmio resource or io resource. + @param GcdType Type of the space. + @param BaseAddress Base address of the space. + @param Length Length of the space. + @param Alignment Align with 2^Alignment + @param ImageHandle Handle for the image of this driver. + + @retval EFI_SUCCESS Reserve successful +**/ +EFI_STATUS +ReserveResourceInGcd ( + IN BOOLEAN IsMMIO, + IN UINTN GcdType, + IN EFI_PHYSICAL_ADDRESS BaseAddress, + IN UINT64 Length, + IN UINTN Alignment, + IN EFI_HANDLE ImageHandle + ) +{ + EFI_STATUS Status; + + if (IsMMIO) { + Status = gDS->AddMemorySpace ( + GcdType, + BaseAddress, + Length, + EFI_MEMORY_UC + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_WARN, + "Failed to add memory space :0x%lx 0x%lx\n", + BaseAddress, + Length + )); + } + + Status = gDS->AllocateMemorySpace ( + EfiGcdAllocateAddress, + GcdType, + Alignment, + Length, + &BaseAddress, + ImageHandle, + NULL + ); + } else { + Status = gDS->AddIoSpace ( + GcdType, + BaseAddress, + Length + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_WARN, + "Failed to add IO space :0x%lx 0x%lx\n", + BaseAddress, + Length + )); + } + + Status = gDS->AllocateIoSpace ( + EfiGcdAllocateAddress, + GcdType, + Alignment, + Length, + &BaseAddress, + ImageHandle, + NULL + ); + } + + return Status; +} + +/** + Architecture level additional operation which needs to be performed before + launching payload. + + @param[in] ImageHandle The firmware allocated handle for the EFI image. + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The entry point is executed successfully. + @retval other Some error occurs when executing this entry point. + +**/ +EFI_STATUS +EFIAPI +BlArchAdditionalOps ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + // + // Report MMIO/IO Resources + // + ReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFEC00000, SIZE_4KB, 0, ImageHandle); // IOAPIC + + ReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFED00000, SIZE_1KB, 0, ImageHandle); // HPET + + return EFI_SUCCESS; +} From a4db6ecfd964c47c6a26563ebc821789675cd4bb Mon Sep 17 00:00:00 2001 From: Ajan Zhong Date: Sat, 26 Apr 2025 11:52:17 +0800 Subject: [PATCH 0186/1172] UefiPayloadPkg: Add BlSupportDxe AArch64 support Introduce AArch64 architecture support in BlSupportDxe. Translation table would be created based on the memory maps, which is provided by bootloader, in case MMU is disabled when execution is handed over to Universal Payload. Signed-off-by: Ajan Zhong --- .../BlSupportDxe/AArch64/BlSupport.c | 96 +++++++++++++++++++ UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf | 13 +++ 2 files changed, 109 insertions(+) create mode 100644 UefiPayloadPkg/BlSupportDxe/AArch64/BlSupport.c diff --git a/UefiPayloadPkg/BlSupportDxe/AArch64/BlSupport.c b/UefiPayloadPkg/BlSupportDxe/AArch64/BlSupport.c new file mode 100644 index 000000000000..4c5eaa729f35 --- /dev/null +++ b/UefiPayloadPkg/BlSupportDxe/AArch64/BlSupport.c @@ -0,0 +1,96 @@ +/** @file + This file handles post bootloader stage operations for AARCH64 architecture. + + Copyright 2025 Google LLC + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "BlSupportDxe.h" + +#define MAX_DESCRIPTORS 256 +ARM_MEMORY_REGION_DESCRIPTOR VirtualMemoryTable[MAX_DESCRIPTORS]; + +STATIC +EFI_STATUS +BlUpdateMemoryMap ( + VOID + ) +{ + EFI_STATUS Status; + EFI_PEI_HOB_POINTERS Hob; + EFI_HOB_RESOURCE_DESCRIPTOR *Resource; + VOID *TranslationTableBase; + UINTN TranslationTableSize; + UINTN Idx = 0; + + Hob.Raw = GetFirstHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR); + + while (Hob.Raw != NULL) { + Resource = (EFI_HOB_RESOURCE_DESCRIPTOR *)Hob.Raw; + Hob.Raw = GET_NEXT_HOB (Hob); + Hob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, Hob.Raw); + + VirtualMemoryTable[Idx].PhysicalBase = Resource->PhysicalStart; + VirtualMemoryTable[Idx].VirtualBase = VirtualMemoryTable[Idx].PhysicalBase; + VirtualMemoryTable[Idx].Length = ALIGN_VALUE (Resource->ResourceLength, EFI_PAGE_SIZE); + + if (Resource->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) { + VirtualMemoryTable[Idx].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK; + } else if (Resource->ResourceType == EFI_RESOURCE_MEMORY_MAPPED_IO) { + VirtualMemoryTable[Idx].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; + } else { + VirtualMemoryTable[Idx].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED; + } + + Idx++; + ASSERT (Idx <= MAX_DESCRIPTORS); + } + + Status = ArmConfigureMmu (VirtualMemoryTable, &TranslationTableBase, &TranslationTableSize); + ASSERT_EFI_ERROR (Status); + + return Status; +} + +/** + Architecture level additional operation which needs to be performed before + launching payload. + + @param[in] ImageHandle The firmware allocated handle for the EFI image. + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The entry point is executed successfully. + +**/ +EFI_STATUS +EFIAPI +BlArchAdditionalOps ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + RETURN_STATUS Status = EFI_SUCCESS; + + if (!ArmMmuEnabled ()) { + // Enable MMU if MMU is disabled. + Status = BlUpdateMemoryMap (); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to enable MMU: %r\n", __func__, Status)); + ASSERT_EFI_ERROR (Status); + return Status; + } + } + + return Status; +} diff --git a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf index 43b69e62d8bd..4c15fd4eab4b 100644 --- a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf +++ b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf @@ -30,10 +30,14 @@ [Sources.IA32, Sources.X64] X86/BlSupport.c +[Sources.AARCH64] + AArch64/BlSupport.c + [Packages] MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec UefiPayloadPkg/UefiPayloadPkg.dec + UefiCpuPkg/UefiCpuPkg.dec [LibraryClasses] UefiDriverEntryPoint @@ -44,10 +48,16 @@ UefiLib HobLib +[LibraryClasses.AARCH64] + ArmMmuLib + [Guids] gUefiAcpiBoardInfoGuid gEfiGraphicsInfoHobGuid +[Protocols] + gEfiCpuArchProtocolGuid + [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution @@ -56,5 +66,8 @@ gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseSize +[Pcd.AARCH64] + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase + [Depex] TRUE From f920354f92f273c9add0617c80bd75e9902abe48 Mon Sep 17 00:00:00 2001 From: "INDIA\\kanagavels" Date: Wed, 2 Jul 2025 21:17:27 +0530 Subject: [PATCH 0187/1172] CryptoPkg: Enable the time check flag. REF:https://github.com/tianocore/edk2/issues/11245 Enable the time check flag to verify the current time during the TLS certificate validation. Signed-off-by: Kanagavel S --- CryptoPkg/Library/TlsLib/TlsInit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CryptoPkg/Library/TlsLib/TlsInit.c b/CryptoPkg/Library/TlsLib/TlsInit.c index 8d707f82854f..6385f0c831ab 100644 --- a/CryptoPkg/Library/TlsLib/TlsInit.c +++ b/CryptoPkg/Library/TlsLib/TlsInit.c @@ -257,7 +257,7 @@ TlsNew ( // X509_STORE_set_flags ( X509Store, - X509_V_FLAG_PARTIAL_CHAIN | X509_V_FLAG_NO_CHECK_TIME + X509_V_FLAG_PARTIAL_CHAIN ); return (VOID *)TlsConn; } From 765d5e1c548d623caae727f80fa1d4659cec6c43 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 20 May 2025 08:21:05 +0200 Subject: [PATCH 0188/1172] OvmfPkg/VirtMmCommunicationDxe: limit to 64-bit archs 32-bit architecture (ia32 + arm) are not supported. Update inf file accordingly. Add a VALID_ARCHITECTURES line. Drop ARM configuration. Signed-off-by: Gerd Hoffmann --- .../VirtMmCommunicationDxe/VirtMmCommunication.inf | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/OvmfPkg/VirtMmCommunicationDxe/VirtMmCommunication.inf b/OvmfPkg/VirtMmCommunicationDxe/VirtMmCommunication.inf index 29485b53531a..57de1546767b 100644 --- a/OvmfPkg/VirtMmCommunicationDxe/VirtMmCommunication.inf +++ b/OvmfPkg/VirtMmCommunicationDxe/VirtMmCommunication.inf @@ -13,6 +13,7 @@ MODULE_TYPE = DXE_RUNTIME_DRIVER VERSION_STRING = 1.0 ENTRY_POINT = VirtMmCommunication2Initialize + VALID_ARCHITECTURES = X64 AARCH64 [Sources] VirtMmCommunication.c @@ -22,7 +23,7 @@ QemuHwInfo.c QemuMmio.c -[Sources.AARCH64, Sources.ARM] +[Sources.AARCH64] QemuFdt.c QemuMmio.c @@ -31,7 +32,7 @@ MdeModulePkg/MdeModulePkg.dec OvmfPkg/OvmfPkg.dec -[Packages.AARCH64, Packages.ARM] +[Packages.AARCH64] EmbeddedPkg/EmbeddedPkg.dec [LibraryClasses] @@ -47,7 +48,7 @@ DxeHardwareInfoLib QemuFwCfgLib -[LibraryClasses.AARCH64, LibraryClasses.ARM] +[LibraryClasses.AARCH64] FdtLib [FeaturePcd] @@ -59,7 +60,7 @@ gEfiMmCommunication2ProtocolGuid ## PRODUCES gEfiSmmVariableProtocolGuid ## PRODUCES -[Protocols.AARCH64, Protocols.ARM] +[Protocols.AARCH64] gFdtClientProtocolGuid [Guids] @@ -71,5 +72,5 @@ [Depex] gEfiCpuArchProtocolGuid -[Depex.AARCH64, Depex.ARM] +[Depex.AARCH64] gFdtClientProtocolGuid From 2dfaf135f16bafd61f8b809c77abc31904f7b19b Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 1 Jul 2025 09:06:44 +0200 Subject: [PATCH 0189/1172] OvmfPkg/VirtMmCommunicationDxe: enable riscv64 Add RISCV64 support. Configuration is identical to AARCH64. Signed-off-by: Gerd Hoffmann --- .../VirtMmCommunicationDxe/VirtMmCommunication.inf | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/OvmfPkg/VirtMmCommunicationDxe/VirtMmCommunication.inf b/OvmfPkg/VirtMmCommunicationDxe/VirtMmCommunication.inf index 57de1546767b..c7e7dcfb3f20 100644 --- a/OvmfPkg/VirtMmCommunicationDxe/VirtMmCommunication.inf +++ b/OvmfPkg/VirtMmCommunicationDxe/VirtMmCommunication.inf @@ -13,7 +13,7 @@ MODULE_TYPE = DXE_RUNTIME_DRIVER VERSION_STRING = 1.0 ENTRY_POINT = VirtMmCommunication2Initialize - VALID_ARCHITECTURES = X64 AARCH64 + VALID_ARCHITECTURES = X64 AARCH64 RISCV64 [Sources] VirtMmCommunication.c @@ -23,7 +23,7 @@ QemuHwInfo.c QemuMmio.c -[Sources.AARCH64] +[Sources.AARCH64, Sources.RISCV64] QemuFdt.c QemuMmio.c @@ -32,7 +32,7 @@ MdeModulePkg/MdeModulePkg.dec OvmfPkg/OvmfPkg.dec -[Packages.AARCH64] +[Packages.AARCH64, Packages.RISCV64] EmbeddedPkg/EmbeddedPkg.dec [LibraryClasses] @@ -48,7 +48,7 @@ DxeHardwareInfoLib QemuFwCfgLib -[LibraryClasses.AARCH64] +[LibraryClasses.AARCH64, LibraryClasses.RISCV64] FdtLib [FeaturePcd] @@ -60,7 +60,7 @@ gEfiMmCommunication2ProtocolGuid ## PRODUCES gEfiSmmVariableProtocolGuid ## PRODUCES -[Protocols.AARCH64] +[Protocols.AARCH64, Protocols.RISCV64] gFdtClientProtocolGuid [Guids] @@ -72,5 +72,5 @@ [Depex] gEfiCpuArchProtocolGuid -[Depex.AARCH64] +[Depex.AARCH64, Depex.RISCV64] gFdtClientProtocolGuid From 2e236ea148b314e02d199105f0ff5c0a4ab19c4a Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 1 Jul 2025 09:08:41 +0200 Subject: [PATCH 0190/1172] OvmfPkg/RiscVVirt: enable qemu uefi variable store support Add QEMU_PV_VARS build option, when enables the firmware build will support (and require) the qemu uefi variable store. This also enables proper (as-in: actually being secure) secure boot support. Signed-off-by: Gerd Hoffmann --- OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc | 11 +++++++++++ OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf | 7 ++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc index 8480ec5de689..03bdbf40f0ff 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc +++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc @@ -32,6 +32,7 @@ # DEFINE TTY_TERMINAL = FALSE DEFINE SECURE_BOOT_ENABLE = FALSE + DEFINE QEMU_PV_VARS = FALSE DEFINE TPM2_ENABLE = FALSE DEFINE TPM2_CONFIG_ENABLE = FALSE DEFINE DEBUG_ON_SERIAL_PORT = TRUE @@ -175,6 +176,11 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdTurnOffUsbLegacySupport|TRUE +!if $(QEMU_PV_VARS) == TRUE + gUefiOvmfPkgTokenSpaceGuid.PcdQemuVarsRequire|TRUE + gEfiMdeModulePkgTokenSpaceGuid.PcdEnableVariableRuntimeCache|FALSE +!endif + [PcdsFixedAtBuild.common] gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x2000 gEfiMdeModulePkgTokenSpaceGuid.PcdMaxAuthVariableSize|0x2800 @@ -320,12 +326,17 @@ # UefiCpuPkg/CpuDxeRiscV64/CpuDxeRiscV64.inf MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf +!if $(QEMU_PV_VARS) == TRUE + OvmfPkg/VirtMmCommunicationDxe/VirtMmCommunication.inf + MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf +!else MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf { NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf # don't use unaligned CopyMem () on the UEFI varstore NOR flash region BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf } +!endif !if $(SECURE_BOOT_ENABLE) == TRUE MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf { diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf b/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf index 8cbd5711aa64..77c749d78a8d 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf +++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf @@ -81,7 +81,12 @@ INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf INF MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf -INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf +!if $(QEMU_PV_VARS) == TRUE + INF OvmfPkg/VirtMmCommunicationDxe/VirtMmCommunication.inf + INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf +!else + INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf +!endif !if $(SECURE_BOOT_ENABLE) == TRUE INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf !endif From f4f14b8d7ecfb922a6ebaac63011f0d45cc968fa Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 1 Jul 2025 09:31:11 +0200 Subject: [PATCH 0191/1172] OvmfPkg/VirtMmCommunicationDxe: better usage hint Print per-arch help lines with qemu usage information. Signed-off-by: Gerd Hoffmann --- OvmfPkg/VirtMmCommunicationDxe/VirtMmCommunication.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/VirtMmCommunicationDxe/VirtMmCommunication.c b/OvmfPkg/VirtMmCommunicationDxe/VirtMmCommunication.c index e27599dff8bd..20f2806ea416 100644 --- a/OvmfPkg/VirtMmCommunicationDxe/VirtMmCommunication.c +++ b/OvmfPkg/VirtMmCommunicationDxe/VirtMmCommunication.c @@ -400,8 +400,15 @@ VirtMmCommunication2Initialize ( DEBUG (( DEBUG_ERROR, "ERROR: qemu uefi variable service is not available, use \n" - " 'qemu-system-x86_64 -device uefi-vars-x64' or\n" + #if defined (MDE_CPU_X64) + " 'qemu-system-x86_64 -device uefi-vars-x64'\n" + #elif defined (MDE_CPU_AARCH64) " 'qemu-system-aarch64 -device uefi-vars-sysbus'\n" + #elif defined (MDE_CPU_RISCV64) + " 'qemu-system-riscv64 -device uefi-vars-sysbus'\n" + #else + #error unsupported architecture + #endif )); CpuDeadLoop (); } From ef1d2fb8d61a1a4930d6da0b897a6d10c513629d Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 1 Jul 2025 10:58:23 +0200 Subject: [PATCH 0192/1172] OvmfPkg: add qemu vars documentation Add documentation for the qemu uefi variable store. Signed-off-by: Gerd Hoffmann --- OvmfPkg/QEMU_PV_VARS.md | 88 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 OvmfPkg/QEMU_PV_VARS.md diff --git a/OvmfPkg/QEMU_PV_VARS.md b/OvmfPkg/QEMU_PV_VARS.md new file mode 100644 index 000000000000..bda6d9ff5ece --- /dev/null +++ b/OvmfPkg/QEMU_PV_VARS.md @@ -0,0 +1,88 @@ +# QEMU uefi variable store + +Starting with version 10.0 (released April 2025) qemu can provide an +uefi variable store to the guest. + +## Motivation + +Main difference to the traditional approach to provide pflash storage +for the variables is that qemu will also handle access control and +signature verification for authenticated variable updates. Moving +that functionality from priviledged guest mode (SMM on x64) to the +host makes it much easier to support secure boot. The requirement to +have some priviledged guest mode for VMs goes away. + +## Build the firmware + +Support for the qemu uefi variable store is a compile time option. It +is disabled by default and can be enabled using the QEMU_PV_VARS +option. It makes sense to also enable secure boot support, i.e. build +with '-D QEMU_PV_VARS=TRUE -D SECURE_BOOT_ENABLE=TRUE'. + +Supported platforms: + + * OvmfPkg/OvmfPkgX64.dsc + * ArmVirtPkg/ArmVirtQemu.dsc + * ArmVirtPkg/ArmVirtQemuKernel.dsc + * OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc + +## Using the qemu uefi variable store + +The variable store is implemented as qemu device and it comes in two +variants. The first is `uefi-vars-x64`, for the x64 platform, using +the 'etc/hardware-info' fw_cfg file for device discovery. The second +is `uefi-vars-sysbus`, used by all other platforms, using device tree +for device discovery. + +Simplest way to use it is this: + +``` +qemu-system-x86_64 \ + -bios OVMF.qemuvars.fd \ + -device uefi-vars-x64 \ + $otherargs +``` + +This runs the uefi variable store without persistence, i.e. the +variables will be lost on VM poweroff (i.e. qemu exit). The variables +will survive reboots though. + +QEMU can save the variable store in json format for persistence. This +is enabled by passing a filename for the varstore to qemu: + +``` +touch /path/to/varstore.json +qemu-system-x86_64 \ + -bios OVMF.qemuvars.fd \ + -device uefi-vars-x64,jsonfile=/path/to/varstore.json \ + $otherargs +``` + +## Enroll secure boot variables + +There are two projects which can handle the json format variable +store: https://gitlab.com/kraxel/virt-firmware and +https://github.com/awslabs/python-uefivars. + +virt-firmware can be installed via `pip install virt-firmware`. Your +linux distro might also have packages for you. On Fedora, RHEL and +Centos Stream `dnf install virt-firmware` works. + +Creating a variable store with secure boot variables enrolled works +this way: + +``` +virt-fw-vars \ + --secure-boot \ + --enroll-redhat \ + --set-dbx /usr/share/edk2/ovmf/DBXUpdate-${date}.x64.bin \ + --output-json /path/to/varstore.json +``` + +This will enroll the standard set of microsoft certificates (both 2011 +and 2023). There are a number of config options to change default +behavior, check out `virt-fw-vars --help`. + +If your linux distro does not ship the dbx revocation database you can +get it from https://github.com/microsoft/secureboot_objects/ +(subdirectory `PostSignedObjects/DBX`) instead. From 0277d5d8f100f2490a08f3a7e38f08328283e4fe Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Tue, 1 Jul 2025 11:36:18 -0700 Subject: [PATCH 0193/1172] BaseTools: Improve report generation for Nested Fvs. Build report would not detect a nested FV if the nested FV was not in a subsection of an FFS statement. Modify the build report to better handle some of the variations of nested FVs. Failing Example: [Fv.FvName1] INF .inf [Fv.FvName0] FILE FV_IMAGE = B25ACDEF-39CE-4FA5-B50A-33E24DB1BDDF { SECTION FV_IMAGE = FvName1 } Working Example: [Fv.FvName1] INF .inf [Fv.FvName0] FILE FV_IMAGE = DA04F6BF-A0FD-47EC-928B-5101A6C95026 { SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE { SECTION FV_IMAGE = FvName1 } } Signed-off-by: Aaron Pop --- BaseTools/Source/Python/build/BuildReport.py | 22 +++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/BaseTools/Source/Python/build/BuildReport.py b/BaseTools/Source/Python/build/BuildReport.py index 2eeaf4f0f67f..2d31be4decbf 100644 --- a/BaseTools/Source/Python/build/BuildReport.py +++ b/BaseTools/Source/Python/build/BuildReport.py @@ -1814,13 +1814,21 @@ def _DiscoverNestedFvList(self, FvName, Wa): for Ffs in Wa.FdfProfile.FvDict[FvName.upper()].FfsList: for Section in Ffs.SectionList: try: - for FvSection in Section.SectionList: - if FvSection.FvName in self.FvList: - continue - self._GuidsDb[Ffs.NameGuid.upper()] = FvSection.FvName - self.FvList.append(FvSection.FvName) - self.FvInfo[FvSection.FvName] = ("Nested FV", 0, 0) - self._DiscoverNestedFvList(FvSection.FvName, Wa) + # Handle the case where an entire FFS is a FV, and not + # a sub-section of the FFS. + if getattr(Section, 'FvFileName', None) is None: + for FvSection in Section.SectionList: + if FvSection.FvName in self.FvList: + continue + self._GuidsDb[Ffs.NameGuid.upper()] = FvSection.FvName + self.FvList.append(FvSection.FvName) + self.FvInfo[FvSection.FvName] = ("Nested FV", 0, 0) + self._DiscoverNestedFvList(FvSection.FvName, Wa) + else: + self._GuidsDb[Ffs.NameGuid.upper()] = Section.FvFileName + self.FvList.append(Section.FvName) + self.FvInfo[Section.FvName] = ("Nested FV", 0, 0) + self._DiscoverNestedFvList(Section.FvName, Wa) except AttributeError: pass From 9280f16345755708ebd9553b3caee077ade0e592 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Tue, 17 Jun 2025 15:26:47 -0700 Subject: [PATCH 0194/1172] UefiPayloadPkg: Don't Allocate Page 0 UefiPayloadPkg has copied the MdeModulePkg DxeIpl behavior to create a memory allocation HOB for page 0. That is being changed (see that commit for details), so also remove it here. Signed-off-by: Oliver Smith-Denny --- .../UefiPayloadEntry/Ia32/DxeLoadFunc.c | 8 --- .../UefiPayloadEntry/Ia32/DxeLoadFuncFit.c | 8 --- .../UefiPayloadEntry/X64/DxeLoadFunc.c | 8 --- .../UefiPayloadEntry/X64/DxeLoadFuncFit.c | 8 --- .../UefiPayloadEntry/X64/VirtualMemory.c | 66 ------------------- 5 files changed, 98 deletions(-) diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c index 600923252476..3391da8446cc 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c +++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c @@ -280,14 +280,6 @@ HandOffToDxeCore ( IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF); IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF); - // - // Clear page 0 and mark it as allocated if NULL pointer detection is enabled. - // - if (IsNullDetectionEnabled ()) { - ClearFirst4KPage (HobList.Raw); - BuildMemoryAllocationHob (0, EFI_PAGES_TO_SIZE (1), EfiBootServicesData); - } - BaseOfStack = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES (STACK_SIZE)); ASSERT (BaseOfStack != 0); diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c index 439d5bee0b8c..d0f314300460 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c +++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c @@ -278,14 +278,6 @@ HandOffToDxeCore ( IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF); IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF); - // - // Clear page 0 and mark it as allocated if NULL pointer detection is enabled. - // - if (IsNullDetectionEnabled ()) { - ClearFirst4KPage (HobList.Raw); - BuildMemoryAllocationHob (0, EFI_PAGES_TO_SIZE (1), EfiBootServicesData); - } - BaseOfStack = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES (STACK_SIZE)); ASSERT (BaseOfStack != 0); diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c index 6c3603f12098..6672740e4768 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c +++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c @@ -52,14 +52,6 @@ HandOffToDxeCore ( IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF); IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF); - // - // Clear page 0 and mark it as allocated if NULL pointer detection is enabled. - // - if (IsNullDetectionEnabled ()) { - ClearFirst4KPage (HobList.Raw); - BuildMemoryAllocationHob (0, EFI_PAGES_TO_SIZE (1), EfiBootServicesData); - } - // // Allocate 128KB for the Stack // diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c index 35b52a911df3..37528d5fe2a4 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c +++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c @@ -53,14 +53,6 @@ HandOffToDxeCore ( IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF); IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF); - // - // Clear page 0 and mark it as allocated if NULL pointer detection is enabled. - // - if (IsNullDetectionEnabled ()) { - ClearFirst4KPage (HobList.Raw); - BuildMemoryAllocationHob (0, EFI_PAGES_TO_SIZE (1), EfiBootServicesData); - } - // // Allocate 128KB for the Stack // diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/VirtualMemory.c b/UefiPayloadPkg/UefiPayloadEntry/X64/VirtualMemory.c index bfe1ba4d02ca..9e45ef31d994 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/X64/VirtualMemory.c +++ b/UefiPayloadPkg/UefiPayloadEntry/X64/VirtualMemory.c @@ -37,72 +37,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent // PAGE_TABLE_POOL *mPageTablePool = NULL; -/** - Clear legacy memory located at the first 4K-page, if available. - - This function traverses the whole HOB list to check if memory from 0 to 4095 - exists and has not been allocated, and then clear it if so. - - @param HobStart The start of HobList passed to DxeCore. - -**/ -VOID -ClearFirst4KPage ( - IN VOID *HobStart - ) -{ - EFI_PEI_HOB_POINTERS RscHob; - EFI_PEI_HOB_POINTERS MemHob; - BOOLEAN DoClear; - - RscHob.Raw = HobStart; - MemHob.Raw = HobStart; - DoClear = FALSE; - - // - // Check if page 0 exists and free - // - while ((RscHob.Raw = GetNextHob ( - EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, - RscHob.Raw - )) != NULL) - { - if ((RscHob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) && - (RscHob.ResourceDescriptor->PhysicalStart == 0)) - { - DoClear = TRUE; - // - // Make sure memory at 0-4095 has not been allocated. - // - while ((MemHob.Raw = GetNextHob ( - EFI_HOB_TYPE_MEMORY_ALLOCATION, - MemHob.Raw - )) != NULL) - { - if (MemHob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress - < EFI_PAGE_SIZE) - { - DoClear = FALSE; - break; - } - - MemHob.Raw = GET_NEXT_HOB (MemHob); - } - - break; - } - - RscHob.Raw = GET_NEXT_HOB (RscHob); - } - - if (DoClear) { - DEBUG ((DEBUG_INFO, "Clearing first 4K-page!\r\n")); - SetMem (NULL, EFI_PAGE_SIZE, 0); - } - - return; -} - /** Return configure status of NULL pointer detection feature. From 83b30736bfb57b3895a089968319fb5c0cd42a28 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Tue, 17 Jun 2025 15:28:14 -0700 Subject: [PATCH 0195/1172] OvmfPkg: Don't Allocate Page 0 OvmfPkg has copied the MdeModulePkg DxeIpl behavior to create a memory allocation HOB for page 0. That is being changed (see that commit for details), so also remove it here. Signed-off-by: Oliver Smith-Denny --- OvmfPkg/Library/PeilessStartupLib/DxeLoad.c | 8 --- .../PeilessStartupLib/X64/VirtualMemory.c | 66 ------------------- 2 files changed, 74 deletions(-) diff --git a/OvmfPkg/Library/PeilessStartupLib/DxeLoad.c b/OvmfPkg/Library/PeilessStartupLib/DxeLoad.c index d34690eb8a0b..b7bacae395c0 100644 --- a/OvmfPkg/Library/PeilessStartupLib/DxeLoad.c +++ b/OvmfPkg/Library/PeilessStartupLib/DxeLoad.c @@ -42,14 +42,6 @@ HandOffToDxeCore ( VOID *TopOfStack; UINTN PageTables; - // - // Clear page 0 and mark it as allocated if NULL pointer detection is enabled. - // - if (IsNullDetectionEnabled ()) { - ClearFirst4KPage (GetHobList ()); - BuildMemoryAllocationHob (0, EFI_PAGES_TO_SIZE (1), EfiBootServicesData); - } - // // Allocate 128KB for the Stack // diff --git a/OvmfPkg/Library/PeilessStartupLib/X64/VirtualMemory.c b/OvmfPkg/Library/PeilessStartupLib/X64/VirtualMemory.c index e2c1bac5e059..d824a64e4e66 100644 --- a/OvmfPkg/Library/PeilessStartupLib/X64/VirtualMemory.c +++ b/OvmfPkg/Library/PeilessStartupLib/X64/VirtualMemory.c @@ -64,72 +64,6 @@ IsSetNxForStack ( return PlatformInfo->PcdSetNxForStack; } -/** - Clear legacy memory located at the first 4K-page, if available. - - This function traverses the whole HOB list to check if memory from 0 to 4095 - exists and has not been allocated, and then clear it if so. - - @param HobStart The start of HobList passed to DxeCore. - -**/ -VOID -ClearFirst4KPage ( - IN VOID *HobStart - ) -{ - EFI_PEI_HOB_POINTERS RscHob; - EFI_PEI_HOB_POINTERS MemHob; - BOOLEAN DoClear; - - RscHob.Raw = HobStart; - MemHob.Raw = HobStart; - DoClear = FALSE; - - // - // Check if page 0 exists and free - // - while ((RscHob.Raw = GetNextHob ( - EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, - RscHob.Raw - )) != NULL) - { - if ((RscHob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) && - (RscHob.ResourceDescriptor->PhysicalStart == 0)) - { - DoClear = TRUE; - // - // Make sure memory at 0-4095 has not been allocated. - // - while ((MemHob.Raw = GetNextHob ( - EFI_HOB_TYPE_MEMORY_ALLOCATION, - MemHob.Raw - )) != NULL) - { - if (MemHob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress - < EFI_PAGE_SIZE) - { - DoClear = FALSE; - break; - } - - MemHob.Raw = GET_NEXT_HOB (MemHob); - } - - break; - } - - RscHob.Raw = GET_NEXT_HOB (RscHob); - } - - if (DoClear) { - DEBUG ((DEBUG_INFO, "Clearing first 4K-page!\r\n")); - SetMem (NULL, EFI_PAGE_SIZE, 0); - } - - return; -} - /** Return configure status of NULL pointer detection feature. From 91bb5cee36fe52ef012ddbead4f5932b3f9fd862 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Tue, 17 Jun 2025 15:29:13 -0700 Subject: [PATCH 0196/1172] MdeModulePkg: Don't Allocate Page 0 Currently DxeIpl attempts to set page 0 to all 0's and to create a memory allocation HOB for it. However, DxeIpl will also unmap the page when mapping page tables and if null detection is not enabled, DxeCore will set the page to 0, regardless of allocation status. Because no consumers are using the memory allocation HOB for page 0, drop it. Instead, ensure that PeiCore and DxeCore do not allow allocating page 0; it should always be reserved for null pointer detection. It also complicates the story for platforms that are attempting to audit the system and ensure that no modules are using page 0. With these memory allocation HOBs in place, it is difficult to tell if it is simply DxeIpl who has allocated the memory or another module. This commit drops the memory allocation HOB publishing and ensures that DxeCore and PeiCore do not allocate page 0. DxeCore already will not allocate page 0 to callers of AllocatePages who call with a type other than AllocateAddress, this just changes so that AllocateAddress cannot allocate at page 0 (which if null detection is enabled will cause a page fault). PeiCore does not have AllocateAddress and so this ensures standard allocations do not receive page 0. Signed-off-by: Oliver Smith-Denny --- MdeModulePkg/Core/Dxe/Mem/Page.c | 5 ++ .../Core/DxeIplPeim/Ia32/DxeLoadFunc.c | 8 --- .../Core/DxeIplPeim/X64/DxeLoadFunc.c | 8 --- .../Core/DxeIplPeim/X64/VirtualMemory.c | 66 ------------------- .../Core/DxeIplPeim/X64/VirtualMemory.h | 14 ---- MdeModulePkg/Core/Pei/Memory/MemoryServices.c | 5 +- 6 files changed, 8 insertions(+), 98 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Mem/Page.c b/MdeModulePkg/Core/Dxe/Mem/Page.c index e4daa741b971..9df64cc1058e 100644 --- a/MdeModulePkg/Core/Dxe/Mem/Page.c +++ b/MdeModulePkg/Core/Dxe/Mem/Page.c @@ -1459,6 +1459,11 @@ CoreInternalAllocatePages ( // return EFI_NOT_FOUND. // if (Type == AllocateAddress) { + // Page 0 is not allowed to be allocated as it is reserved for null pointer detection + if (Start == 0) { + return EFI_NOT_FOUND; + } + if ((NumberOfPages == 0) || (NumberOfPages > RShiftU64 (MaxAddress, EFI_PAGE_SHIFT))) { diff --git a/MdeModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c b/MdeModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c index 60878b4c1a09..98aae5a96eb7 100644 --- a/MdeModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c +++ b/MdeModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c @@ -265,14 +265,6 @@ HandOffToDxeCore ( EFI_PEI_VECTOR_HANDOFF_INFO_PPI *VectorHandoffInfoPpi; BOOLEAN BuildPageTablesIa32Pae; - // - // Clear page 0 and mark it as allocated if NULL pointer detection is enabled. - // - if (IsNullDetectionEnabled ()) { - ClearFirst4KPage (HobList.Raw); - BuildMemoryAllocationHob (0, EFI_PAGES_TO_SIZE (1), EfiBootServicesData); - } - Status = PeiServicesAllocatePages (EfiBootServicesData, EFI_SIZE_TO_PAGES (STACK_SIZE), &BaseOfStack); ASSERT_EFI_ERROR (Status); diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c index fa2050cf023a..034254baeaa0 100644 --- a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c +++ b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c @@ -36,14 +36,6 @@ HandOffToDxeCore ( VOID *GhcbBase; UINTN GhcbSize; - // - // Clear page 0 and mark it as allocated if NULL pointer detection is enabled. - // - if (IsNullDetectionEnabled ()) { - ClearFirst4KPage (HobList.Raw); - BuildMemoryAllocationHob (0, EFI_PAGES_TO_SIZE (1), EfiBootServicesData); - } - // // Get Vector Hand-off Info PPI and build Guided HOB // diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c index 1fb2a3b2eac5..ee85b311e957 100644 --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c @@ -31,72 +31,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent // PAGE_TABLE_POOL *mPageTablePool = NULL; -/** - Clear legacy memory located at the first 4K-page, if available. - - This function traverses the whole HOB list to check if memory from 0 to 4095 - exists and has not been allocated, and then clear it if so. - - @param HobStart The start of HobList passed to DxeCore. - -**/ -VOID -ClearFirst4KPage ( - IN VOID *HobStart - ) -{ - EFI_PEI_HOB_POINTERS RscHob; - EFI_PEI_HOB_POINTERS MemHob; - BOOLEAN DoClear; - - RscHob.Raw = HobStart; - MemHob.Raw = HobStart; - DoClear = FALSE; - - // - // Check if page 0 exists and free - // - while ((RscHob.Raw = GetNextHob ( - EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, - RscHob.Raw - )) != NULL) - { - if ((RscHob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) && - (RscHob.ResourceDescriptor->PhysicalStart == 0)) - { - DoClear = TRUE; - // - // Make sure memory at 0-4095 has not been allocated. - // - while ((MemHob.Raw = GetNextHob ( - EFI_HOB_TYPE_MEMORY_ALLOCATION, - MemHob.Raw - )) != NULL) - { - if (MemHob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress - < EFI_PAGE_SIZE) - { - DoClear = FALSE; - break; - } - - MemHob.Raw = GET_NEXT_HOB (MemHob); - } - - break; - } - - RscHob.Raw = GET_NEXT_HOB (RscHob); - } - - if (DoClear) { - DEBUG ((DEBUG_INFO, "Clearing first 4K-page!\r\n")); - SetMem (NULL, EFI_PAGE_SIZE, 0); - } - - return; -} - /** Return configure status of NULL pointer detection feature. diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.h b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.h index e0352844d7cb..95e88a9c4f7c 100644 --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.h +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.h @@ -267,20 +267,6 @@ AsmGetVectorTemplatInfo ( OUT VOID **TemplateBase ); -/** - Clear legacy memory located at the first 4K-page. - - This function traverses the whole HOB list to check if memory from 0 to 4095 - exists and has not been allocated, and then clear it if so. - - @param HobStart The start of HobList passed to DxeCore. - -**/ -VOID -ClearFirst4KPage ( - IN VOID *HobStart - ); - /** Return configure status of NULL pointer detection feature. diff --git a/MdeModulePkg/Core/Pei/Memory/MemoryServices.c b/MdeModulePkg/Core/Pei/Memory/MemoryServices.c index 562092df7094..80b2f898b180 100644 --- a/MdeModulePkg/Core/Pei/Memory/MemoryServices.c +++ b/MdeModulePkg/Core/Pei/Memory/MemoryServices.c @@ -613,10 +613,11 @@ PeiAllocatePages ( // // Check to see if on correct boundary for the memory type. - // If not aligned, make the allocation aligned. + // If not aligned, make the allocation aligned and that we are not trying to allocate page 0, which is used for + // null detection. // Padding = *(FreeMemoryTop) & (Granularity - 1); - if ((UINTN)(*FreeMemoryTop - *FreeMemoryBottom) < Padding) { + if (((UINTN)(*FreeMemoryTop - *FreeMemoryBottom) < Padding) || (*(FreeMemoryTop) - Padding == 0)) { DEBUG ((DEBUG_ERROR, "AllocatePages failed: Out of space after padding.\n")); return EFI_OUT_OF_RESOURCES; } From 33e58db9e21e04b831fa23ea6f1f546003ae0444 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Mon, 23 Jun 2025 11:22:49 -0400 Subject: [PATCH 0197/1172] OvmfPkg: Pass command-line args to PR Eval Allow PR eval to operate with the same input variable values as the build command would. Signed-off-by: Michael Kubacki --- OvmfPkg/PlatformCI/PlatformBuildLib.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/PlatformCI/PlatformBuildLib.py b/OvmfPkg/PlatformCI/PlatformBuildLib.py index 19f92ac13ff0..6e0b9e4f51a9 100644 --- a/OvmfPkg/PlatformCI/PlatformBuildLib.py +++ b/OvmfPkg/PlatformCI/PlatformBuildLib.py @@ -110,8 +110,21 @@ def GetPlatformDscAndConfig(self) -> tuple: The tuple should be (, ) ''' + import re + import sys + + cmd_line_input_vars = {} + for arg in sys.argv: + if "=" in arg: + key, value = arg.split("=", 1) + if key.startswith("-"): + continue + if re.match(r"BLD_.+_", key): + key = re.sub(r"^BLD_.+?_", "", key, count=1) + cmd_line_input_vars[key] = value + dsc = CommonPlatform.GetDscName(",".join(self.ActualArchitectures)) - return (f"OvmfPkg/{dsc}", {}) + return (f"OvmfPkg/{dsc}", cmd_line_input_vars) # ####################################################################################### # From fb55173551c785bb1c5883a0324f2deea1d94384 Mon Sep 17 00:00:00 2001 From: Luigi Leonardi Date: Fri, 27 Jun 2025 16:39:34 +0200 Subject: [PATCH 0198/1172] OvmfPkg/PlatformDebugLibIoPort: Add check for MemDebugLogWrite This check is present for every call to `MemDebugLogWrite` but it is missing here. This may cause an unwanted write to the buffer, when the buffer's address is not null and MemDebug is disabled. Signed-off-by: Luigi Leonardi --- OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c index 0be04cbd1896..f07e994e6017 100644 --- a/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c +++ b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c @@ -235,7 +235,9 @@ DebugAssert ( // // Send the string to Memory Debug Log // - MemDebugLogWrite (Buffer, Length); + if (MemDebugLogEnabled ()) { + MemDebugLogWrite (Buffer, Length); + } // // Generate a Breakpoint, DeadLoop, or NOP based on PCD settings From 7f756db37a0ae94da1a3da8aafeb9061088482ef Mon Sep 17 00:00:00 2001 From: Vishal Oliyil Kunnil Date: Mon, 23 Jun 2025 18:54:56 -0700 Subject: [PATCH 0199/1172] EmbeddedPkg/PrePiMemoryAllocationLib: Add reserved memory allocations PrePiMemoryAllocationLib does not implement functions to allocate EfiMemoryReservedType. These are implemented in other instances of MemoryAllocationLib (Dxe, Uefi, PiSmmCore, SmmMemory). Add AllocateReservedPages() and AllocateAlignedReservedPages() functions to make it consistent with other MemoryAllocationLib intstances. Signed-off-by: Vishal Oliyil Kunnil --- .../MemoryAllocationLib.c | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/EmbeddedPkg/Library/PrePiMemoryAllocationLib/MemoryAllocationLib.c b/EmbeddedPkg/Library/PrePiMemoryAllocationLib/MemoryAllocationLib.c index f4077c04a7bb..f280483c2d71 100644 --- a/EmbeddedPkg/Library/PrePiMemoryAllocationLib/MemoryAllocationLib.c +++ b/EmbeddedPkg/Library/PrePiMemoryAllocationLib/MemoryAllocationLib.c @@ -98,6 +98,28 @@ AllocateRuntimePages ( return InternalAllocatePages (Pages, EfiRuntimeServicesData); } +/** + Allocates one or more 4KB pages of type EfiReservedMemoryType. + + Allocates the number of 4KB pages of type EfiReservedMemoryTypes and returns a pointer to the + allocated buffer. The buffer returned is aligned on a 4KB boundary. If Pages is 0, then NULL + is returned. If there is not enough memory remaining to satisfy the request, then NULL is + returned. + + @param Pages The number of 4 KB pages to allocate. + + @return A pointer to the allocated buffer or NULL if allocation fails. + +**/ +VOID * +EFIAPI +AllocateReservedPages ( + IN UINTN Pages + ) +{ + return InternalAllocatePages (Pages, EfiReservedMemoryType); +} + /** Allocates one or more 4KB pages of type EfiBootServicesData at a specified alignment. @@ -150,6 +172,58 @@ AllocateAlignedPages ( return (VOID *)(UINTN)(((UINTN)Memory + AlignmentMask) & ~AlignmentMask); } +/** + Allocates one or more 4KB pages of type EfiReservedMemoryType at a specified alignment. + + Allocates the number of 4KB pages specified by Pages of type EfiReservedMemoryType with an + alignment specified by Alignment. The allocated buffer is returned. If Pages is 0, then NULL is + returned. If there is not enough memory at the specified alignment remaining to satisfy the + request, then NULL is returned. + If Alignment is not a power of two and Alignment is not zero, then ASSERT(). + + @param Pages The number of 4 KB pages to allocate. + @param Alignment The requested alignment of the allocation. Must be a power of two. + If Alignment is zero, then byte alignment is used. + + @return A pointer to the allocated buffer or NULL if allocation fails. + +**/ +VOID * +EFIAPI +AllocateAlignedReservedPages ( + IN UINTN Pages, + IN UINTN Alignment + ) +{ + VOID *Memory; + UINTN AlignmentMask; + + // + // Alignment must be a power of two or zero. + // + ASSERT ((Alignment & (Alignment - 1)) == 0); + + if (Pages == 0) { + return NULL; + } + + // + // Make sure that Pages plus EFI_SIZE_TO_PAGES (Alignment) does not overflow. + // + ASSERT (Pages <= (MAX_ADDRESS - EFI_SIZE_TO_PAGES (Alignment))); + // + // We would rather waste some memory to save PEI code size. + // + Memory = (VOID *)(UINTN)AllocateReservedPages (Pages + EFI_SIZE_TO_PAGES (Alignment)); + if (Alignment == 0) { + AlignmentMask = Alignment; + } else { + AlignmentMask = Alignment - 1; + } + + return (VOID *)(UINTN)(((UINTN)Memory + AlignmentMask) & ~AlignmentMask); +} + /** Frees one or more 4KB pages that were previously allocated with one of the page allocation functions in the Memory Allocation Library. From 5090c39a59e308f6eedbbdc4c9004da9ab250a51 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 23 Jun 2025 22:32:51 +0200 Subject: [PATCH 0200/1172] OvmfPkg/PlatformDxe: register log buffer as efi config table If a memory debug log buffer is present, register the buffer location as config table so the OS can find and show it. Signed-off-by: Gerd Hoffmann --- OvmfPkg/PlatformDxe/Platform.c | 26 ++++++++++++++++++++++++++ OvmfPkg/PlatformDxe/Platform.inf | 2 ++ 2 files changed, 28 insertions(+) diff --git a/OvmfPkg/PlatformDxe/Platform.c b/OvmfPkg/PlatformDxe/Platform.c index 5b3e56682ed2..aee5a397b324 100644 --- a/OvmfPkg/PlatformDxe/Platform.c +++ b/OvmfPkg/PlatformDxe/Platform.c @@ -13,6 +13,8 @@ #include #include #include +#include +#include #include #include #include @@ -943,6 +945,28 @@ GopInstalled ( mGopTracker = NULL; } +/** + If a memory debug log buffer is present, register the buffer location as + config table so the OS can find and show it. +**/ +VOID +EFIAPI +MemDebugLogInstallTable ( + VOID + ) +{ + EFI_HOB_GUID_TYPE *GuidHob; + MEM_DEBUG_LOG_HOB_DATA *HobData; + VOID *LogBuffer; + + GuidHob = GetFirstGuidHob (&gMemDebugLogHobGuid); + if (GuidHob != NULL) { + HobData = (MEM_DEBUG_LOG_HOB_DATA *)GET_GUID_HOB_DATA (GuidHob); + LogBuffer = (VOID *)(UINTN)HobData->MemDebugLogBufAddr; + gBS->InstallConfigurationTable (&gMemDebugLogHobGuid, LogBuffer); + } +} + /** Entry point for this driver. @@ -1030,6 +1054,8 @@ PlatformInit ( Status = gBS->SignalEvent (mGopEvent); ASSERT_EFI_ERROR (Status); + MemDebugLogInstallTable (); + return EFI_SUCCESS; CloseGopEvent: diff --git a/OvmfPkg/PlatformDxe/Platform.inf b/OvmfPkg/PlatformDxe/Platform.inf index dd22c4f3a47a..4b5a2557bf04 100644 --- a/OvmfPkg/PlatformDxe/Platform.inf +++ b/OvmfPkg/PlatformDxe/Platform.inf @@ -36,6 +36,7 @@ DebugLib DevicePathLib HiiLib + HobLib MemoryAllocationLib PrintLib UefiBootServicesTableLib @@ -59,6 +60,7 @@ [Guids] gEfiIfrTianoGuid gOvmfPlatformConfigGuid + gMemDebugLogHobGuid [Depex] gEfiHiiConfigRoutingProtocolGuid AND From 91a9ad4349562b7489d59f122f111abfeb0d8279 Mon Sep 17 00:00:00 2001 From: GuoMinJ Date: Thu, 12 Jun 2025 17:26:14 +0200 Subject: [PATCH 0201/1172] ArmPkg: Remove UGA support The Universal Graphics Adapter (UGA) is a graphic abstraction. The UGA I/O and Draw protocols are deprecated since UEFI 2.0 was introduced. Cf. the UEFI spec v2.9: "Appendix L - EFI 1.10 Protocol Changes and Deprecation List" section L.2 "Deprecated Protocols" Remove the UGA support. Signed-off-by: GuoMinJ Signed-off-by: Pierre Gondois --- ArmPkg/Library/PlatformBootManagerLib/PlatformBm.h | 2 +- .../Library/PlatformBootManagerLib/PlatformBootManagerLib.inf | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/ArmPkg/Library/PlatformBootManagerLib/PlatformBm.h b/ArmPkg/Library/PlatformBootManagerLib/PlatformBm.h index a40a2ff5cb4f..6bf4c09bd5eb 100644 --- a/ArmPkg/Library/PlatformBootManagerLib/PlatformBm.h +++ b/ArmPkg/Library/PlatformBootManagerLib/PlatformBm.h @@ -43,7 +43,7 @@ EnableQuietBoot ( Simple Text Out screens will now be synced up with all non video output devices - @retval EFI_SUCCESS UGA devices are back in text mode and synced up. + @retval EFI_SUCCESS Devices are back in text mode and synced up. **/ EFI_STATUS DisableQuietBoot ( diff --git a/ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf b/ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf index bc029be635f2..44b9a2503507 100644 --- a/ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf +++ b/ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf @@ -52,9 +52,6 @@ UefiLib UefiRuntimeServicesTableLib -[FeaturePcd] - gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport - [FixedPcd] gArmTokenSpaceGuid.PcdUefiShellDefaultBootEnable gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString From 67192751abb8a90ca9ee86149345fec0f0d9193f Mon Sep 17 00:00:00 2001 From: GuoMinJ Date: Thu, 12 Jun 2025 17:26:53 +0200 Subject: [PATCH 0202/1172] ArmVirtPkg: Remove UGA support The Universal Graphics Adapter (UGA) is a graphic abstraction. The UGA I/O and Draw protocols are deprecated since UEFI 2.0 was introduced. Cf. the UEFI spec v2.9: "Appendix L - EFI 1.10 Protocol Changes and Deprecation List" section L.2 "Deprecated Protocols" Remove the UGA support. Signed-off-by: GuoMinJ Signed-off-by: Pierre Gondois --- ArmVirtPkg/ArmVirtCloudHv.dsc | 1 - ArmVirtPkg/ArmVirtKvmTool.dsc | 1 - ArmVirtPkg/ArmVirtQemu.dsc | 1 - ArmVirtPkg/ArmVirtQemuKernel.dsc | 1 - 4 files changed, 4 deletions(-) diff --git a/ArmVirtPkg/ArmVirtCloudHv.dsc b/ArmVirtPkg/ArmVirtCloudHv.dsc index b076f5963a4e..541e7c943fd2 100644 --- a/ArmVirtPkg/ArmVirtCloudHv.dsc +++ b/ArmVirtPkg/ArmVirtCloudHv.dsc @@ -87,7 +87,6 @@ ## If TRUE, Graphics Output Protocol will be installed on virtual handle created by ConsplitterDxe. # It could be set FALSE to save size. gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdTurnOffUsbLegacySupport|TRUE diff --git a/ArmVirtPkg/ArmVirtKvmTool.dsc b/ArmVirtPkg/ArmVirtKvmTool.dsc index 5cb3e45aa651..9d0411d9e0c1 100644 --- a/ArmVirtPkg/ArmVirtKvmTool.dsc +++ b/ArmVirtPkg/ArmVirtKvmTool.dsc @@ -127,7 +127,6 @@ ## If TRUE, Graphics Output Protocol will be installed on virtual handle created by ConsplitterDxe. # It could be set FALSE to save size. gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE # Use MMIO for accessing RTC controller registers. gPcAtChipsetPkgTokenSpaceGuid.PcdRtcUseMmio|TRUE diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc index 00f96518672e..fadd15fbf185 100644 --- a/ArmVirtPkg/ArmVirtQemu.dsc +++ b/ArmVirtPkg/ArmVirtQemu.dsc @@ -153,7 +153,6 @@ ## If TRUE, Graphics Output Protocol will be installed on virtual handle created by ConsplitterDxe. # It could be set FALSE to save size. gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdTurnOffUsbLegacySupport|TRUE diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc index 9821b0d749ec..eee9590a7ef3 100644 --- a/ArmVirtPkg/ArmVirtQemuKernel.dsc +++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc @@ -122,7 +122,6 @@ ## If TRUE, Graphics Output Protocol will be installed on virtual handle created by ConsplitterDxe. # It could be set FALSE to save size. gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdTurnOffUsbLegacySupport|TRUE From d97f415b52532f7c1f89c3e4357eafa61e2ae544 Mon Sep 17 00:00:00 2001 From: GuoMinJ Date: Thu, 12 Jun 2025 16:44:13 +0200 Subject: [PATCH 0203/1172] BaseTools: Remove UGA support The Universal Graphics Adapter (UGA) is a graphic abstraction. The UGA I/O and Draw protocols are deprecated since UEFI 2.0 was introduced. Cf. the UEFI spec v2.9: "Appendix L - EFI 1.10 Protocol Changes and Deprecation List" section L.2 "Deprecated Protocols" Remove the UGA support. Signed-off-by: GuoMinJ Signed-off-by: Pierre Gondois --- .../Source/C/Include/Protocol/HiiFramework.h | 50 ------ BaseTools/Source/C/Include/Protocol/UgaDraw.h | 161 ------------------ 2 files changed, 211 deletions(-) delete mode 100644 BaseTools/Source/C/Include/Protocol/UgaDraw.h diff --git a/BaseTools/Source/C/Include/Protocol/HiiFramework.h b/BaseTools/Source/C/Include/Protocol/HiiFramework.h index 448350967bbf..21abdf08796b 100644 --- a/BaseTools/Source/C/Include/Protocol/HiiFramework.h +++ b/BaseTools/Source/C/Include/Protocol/HiiFramework.h @@ -28,19 +28,6 @@ 0xd7ad636e, 0xb997, 0x459b, {0xbf, 0x3f, 0x88, 0x46, 0x89, 0x79, 0x80, 0xe1} \ } -// BugBug: -//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// If UGA goes away we need to put this some place. I'm not sure where? -// -//typedef struct { -// UINT8 Blue; -// UINT8 Green; -// UINT8 Red; -// UINT8 Reserved; -//} EFI_UGA_PIXEL; - -//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// typedef struct _EFI_HII_PROTOCOL EFI_HII_PROTOCOL; @@ -575,39 +562,6 @@ EFI_STATUS IN OUT UINT32 *InternalStatus ); -/** - Translates a glyph into the format required for input to the Universal - Graphics Adapter (UGA) Block Transfer (BLT) routines. - - @param This A pointer to the EFI_HII_PROTOCOL instance. - @param GlyphBuffer A pointer to the buffer that contains glyph data. - @param Foreground The foreground setting requested to be used for the - generated BltBuffer data. - @param Background The background setting requested to be used for the - generated BltBuffer data. - @param Count The entry in the BltBuffer upon which to act. - @param Width The width in bits of the glyph being converted. - @param Height The height in bits of the glyph being converted - @param BltBuffer A pointer to the buffer that contains the data that is - ready to be used by the UGA BLT routines. - - @retval EFI_SUCCESS It worked. - @retval EFI_NOT_FOUND A glyph for a character was not found. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_HII_GLYPH_TO_BLT) ( - IN EFI_HII_PROTOCOL *This, - IN UINT8 *GlyphBuffer, - IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground, - IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background, - IN UINTN Count, - IN UINTN Width, - IN UINTN Height, - IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer - ); - /** Allows a new string to be added to an already existing string package. @@ -878,9 +832,6 @@ EFI_STATUS @param GetGlyph Translates a Unicode character into the corresponding font glyph. - @param GlyphToBlt - Converts a glyph value into a format that is ready for a UGA BLT command. - @param NewString Allows a new string to be added to an already existing string package. @@ -924,7 +875,6 @@ struct _EFI_HII_PROTOCOL { EFI_HII_TEST_STRING TestString; EFI_HII_GET_GLYPH GetGlyph; - EFI_HII_GLYPH_TO_BLT GlyphToBlt; EFI_HII_NEW_STRING NewString; EFI_HII_GET_PRI_LANGUAGES GetPrimaryLanguages; diff --git a/BaseTools/Source/C/Include/Protocol/UgaDraw.h b/BaseTools/Source/C/Include/Protocol/UgaDraw.h deleted file mode 100644 index 412b000aeb6b..000000000000 --- a/BaseTools/Source/C/Include/Protocol/UgaDraw.h +++ /dev/null @@ -1,161 +0,0 @@ -/** @file - UGA Draw protocol from the EFI 1.1 specification. - - Abstraction of a very simple graphics device. - - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
- - SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#ifndef __UGA_DRAW_H__ -#define __UGA_DRAW_H__ - -#define EFI_UGA_DRAW_PROTOCOL_GUID \ - { \ - 0x982c298b, 0xf4fa, 0x41cb, {0xb8, 0x38, 0x77, 0xaa, 0x68, 0x8f, 0xb8, 0x39 } \ - } - -typedef struct _EFI_UGA_DRAW_PROTOCOL EFI_UGA_DRAW_PROTOCOL; - -/** - Return the current video mode information. - - @param This Protocol instance pointer. - @param HorizontalResolution Current video horizontal resolution in pixels - @param VerticalResolution Current video vertical resolution in pixels - @param ColorDepth Current video color depth in bits per pixel - @param RefreshRate Current video refresh rate in Hz. - - @retval EFI_SUCCESS Mode information returned. - @retval EFI_NOT_STARTED Video display is not initialized. Call SetMode () - @retval EFI_INVALID_PARAMETER One of the input args was NULL. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_UGA_DRAW_PROTOCOL_GET_MODE) ( - IN EFI_UGA_DRAW_PROTOCOL *This, - OUT UINT32 *HorizontalResolution, - OUT UINT32 *VerticalResolution, - OUT UINT32 *ColorDepth, - OUT UINT32 *RefreshRate - ) -; - -/** - Return the current video mode information. - - @param This Protocol instance pointer. - @param HorizontalResolution Current video horizontal resolution in pixels - @param VerticalResolution Current video vertical resolution in pixels - @param ColorDepth Current video color depth in bits per pixel - @param RefreshRate Current video refresh rate in Hz. - - @retval EFI_SUCCESS Mode information returned. - @retval EFI_NOT_STARTED Video display is not initialized. Call SetMode () - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_UGA_DRAW_PROTOCOL_SET_MODE) ( - IN EFI_UGA_DRAW_PROTOCOL *This, - IN UINT32 HorizontalResolution, - IN UINT32 VerticalResolution, - IN UINT32 ColorDepth, - IN UINT32 RefreshRate - ) -; - -typedef struct { - UINT8 Blue; - UINT8 Green; - UINT8 Red; - UINT8 Reserved; -} EFI_UGA_PIXEL; - -typedef union { - EFI_UGA_PIXEL Pixel; - UINT32 Raw; -} EFI_UGA_PIXEL_UNION; - -typedef enum { - EfiUgaVideoFill, - EfiUgaVideoToBltBuffer, - EfiUgaBltBufferToVideo, - EfiUgaVideoToVideo, - EfiUgaBltMax -} EFI_UGA_BLT_OPERATION; - -/** - Type specifying a pointer to a function to perform an UGA Blt operation. - - The following table defines actions for BltOperations: - - EfiUgaVideoFill - Write data from the BltBuffer pixel (SourceX, SourceY) - directly to every pixel of the video display rectangle - (DestinationX, DestinationY) (DestinationX + Width, DestinationY + Height). - Only one pixel will be used from the BltBuffer. Delta is NOT used. - - EfiUgaVideoToBltBuffer - Read data from the video display rectangle - (SourceX, SourceY) (SourceX + Width, SourceY + Height) and place it in - the BltBuffer rectangle (DestinationX, DestinationY ) - (DestinationX + Width, DestinationY + Height). If DestinationX or - DestinationY is not zero then Delta must be set to the length in bytes - of a row in the BltBuffer. - - EfiUgaBltBufferToVideo - Write data from the BltBuffer rectangle - (SourceX, SourceY) (SourceX + Width, SourceY + Height) directly to the - video display rectangle (DestinationX, DestinationY) - (DestinationX + Width, DestinationY + Height). If SourceX or SourceY is - not zero then Delta must be set to the length in bytes of a row in the - BltBuffer. - - EfiUgaVideoToVideo - Copy from the video display rectangle (SourceX, SourceY) - (SourceX + Width, SourceY + Height) .to the video display rectangle - (DestinationX, DestinationY) (DestinationX + Width, DestinationY + Height). - The BltBuffer and Delta are not used in this mode. - - - @param[in] This - Protocol instance pointer. - @param[in] BltBuffer - Buffer containing data to blit into video buffer. This - buffer has a size of Width*Height*sizeof(EFI_UGA_PIXEL) - @param[in] BltOperation - Operation to perform on BlitBuffer and video memory - @param[in] SourceX - X coordinate of source for the BltBuffer. - @param[in] SourceY - Y coordinate of source for the BltBuffer. - @param[in] DestinationX - X coordinate of destination for the BltBuffer. - @param[in] DestinationY - Y coordinate of destination for the BltBuffer. - @param[in] Width - Width of rectangle in BltBuffer in pixels. - @param[in] Height - Height of rectangle in BltBuffer in pixels. - @param[in] Delta - OPTIONAL - - @retval EFI_SUCCESS - The Blt operation completed. - @retval EFI_INVALID_PARAMETER - BltOperation is not valid. - @retval EFI_DEVICE_ERROR - A hardware error occurred writing to the video buffer. - ---*/ -typedef -EFI_STATUS -(EFIAPI *EFI_UGA_DRAW_PROTOCOL_BLT) ( - IN EFI_UGA_DRAW_PROTOCOL * This, - IN EFI_UGA_PIXEL * BltBuffer, OPTIONAL - IN EFI_UGA_BLT_OPERATION BltOperation, - IN UINTN SourceX, - IN UINTN SourceY, - IN UINTN DestinationX, - IN UINTN DestinationY, - IN UINTN Width, - IN UINTN Height, - IN UINTN Delta OPTIONAL - ); - -struct _EFI_UGA_DRAW_PROTOCOL { - EFI_UGA_DRAW_PROTOCOL_GET_MODE GetMode; - EFI_UGA_DRAW_PROTOCOL_SET_MODE SetMode; - EFI_UGA_DRAW_PROTOCOL_BLT Blt; -}; - -extern EFI_GUID gEfiUgaDrawProtocolGuid; - -#endif From b2f90ef115d9ed637c76013020ba24f29287c710 Mon Sep 17 00:00:00 2001 From: GuoMinJ Date: Thu, 12 Jun 2025 17:40:57 +0200 Subject: [PATCH 0204/1172] EmulatorPkg: Remove UGA support The Universal Graphics Adapter (UGA) is a graphic abstraction. The UGA I/O and Draw protocols are deprecated since UEFI 2.0 was introduced. Cf. the UEFI spec v2.9: "Appendix L - EFI 1.10 Protocol Changes and Deprecation List" section L.2 "Deprecated Protocols" Remove the UGA support. Signed-off-by: GuoMinJ Signed-off-by: Pierre Gondois --- EmulatorPkg/EmuGopDxe/Gop.h | 8 +- EmulatorPkg/EmuGopDxe/GopScreen.c | 14 ++-- EmulatorPkg/Include/Protocol/EmuFileSystem.h | 18 ++-- .../Include/Protocol/EmuGraphicsWindow.h | 18 ++-- .../Library/PlatformBmLib/PlatformBm.h | 2 +- .../Library/PlatformBmLib/PlatformBmData.c | 4 +- EmulatorPkg/Unix/Host/Gasket.h | 10 +-- EmulatorPkg/Unix/Host/Host.h | 1 - EmulatorPkg/Unix/Host/Ia32/Gasket.S | 2 +- EmulatorPkg/Unix/Host/X11GraphicsWindow.c | 82 +++++++++---------- EmulatorPkg/Unix/Host/X64/Gasket.S | 2 +- EmulatorPkg/Win/Host/WinGopScreen.c | 10 +-- 12 files changed, 84 insertions(+), 87 deletions(-) diff --git a/EmulatorPkg/EmuGopDxe/Gop.h b/EmulatorPkg/EmuGopDxe/Gop.h index 7f7dc4e8eb9f..e7c5ecf41728 100644 --- a/EmulatorPkg/EmuGopDxe/Gop.h +++ b/EmulatorPkg/EmuGopDxe/Gop.h @@ -6,8 +6,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#ifndef __UGA_H_ -#define __UGA_H_ +#ifndef __GOP_H_ +#define __GOP_H_ #include @@ -60,8 +60,6 @@ typedef struct { extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding; extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName; -#define EMU_UGA_CLASS_NAME L"EmuGopWindow" - #define GOP_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('G', 'o', 'p', 'N') typedef struct { UINT64 Signature; @@ -83,7 +81,7 @@ typedef struct { GOP_MODE_DATA *ModeData; // - // UGA Private Data knowing when to start hardware + // Private Data knowing when to start hardware // BOOLEAN HardwareNeedsStarting; diff --git a/EmulatorPkg/EmuGopDxe/GopScreen.c b/EmulatorPkg/EmuGopDxe/GopScreen.c index 88d95b88e162..113b496861b4 100644 --- a/EmulatorPkg/EmuGopDxe/GopScreen.c +++ b/EmulatorPkg/EmuGopDxe/GopScreen.c @@ -10,7 +10,7 @@ Module Name: Abstract: - This file produces the graphics abstration of UGA. It is called by + This file produces the graphics abstration of GOP. It is called by EmuGopDriver.c file which deals with the EFI 1.1 driver model. This file just does graphics. @@ -209,7 +209,7 @@ EmuGopBlt ( // the number of bytes in each row can be computed. // if (Delta == 0) { - Delta = Width * sizeof (EFI_UGA_PIXEL); + Delta = Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL); } // @@ -220,8 +220,8 @@ EmuGopBlt ( OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY); // - // Pack UGA Draw protocol parameters to EMU_GRAPHICS_WINDOWS__BLT_ARGS structure to adapt to - // GopBlt() API of Unix UGA IO protocol. + // Pack GOP protocol parameters to EMU_GRAPHICS_WINDOWS__BLT_ARGS structure to adapt to + // GopBlt() API of GOP protocol. // GopBltArgs.DestinationX = DestinationX; GopBltArgs.DestinationY = DestinationY; @@ -232,8 +232,8 @@ EmuGopBlt ( GopBltArgs.Delta = Delta; Status = Private->EmuGraphicsWindow->Blt ( Private->EmuGraphicsWindow, - (EFI_UGA_PIXEL *)BltBuffer, - (EFI_UGA_BLT_OPERATION)BltOperation, + BltBuffer, + BltOperation, &GopBltArgs ); @@ -384,7 +384,7 @@ ShutdownGopEvent ( Routine Description: - This is the UGA screen's callback notification function for exit-boot-services. + This is the screen's callback notification function for exit-boot-services. All we do here is call EmuGopDestructor(). Arguments: diff --git a/EmulatorPkg/Include/Protocol/EmuFileSystem.h b/EmulatorPkg/Include/Protocol/EmuFileSystem.h index 15de43ac022e..90c075e8a647 100644 --- a/EmulatorPkg/Include/Protocol/EmuFileSystem.h +++ b/EmulatorPkg/Include/Protocol/EmuFileSystem.h @@ -13,13 +13,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#ifndef _EMU_UGA_IO_H_ -#define _EMU_UGA_IO_H_ +#ifndef _EMU_GRAPHICS_WINDOW_H_ +#define _EMU_GRAPHICS_WINDOW_H_ #include #include #include -#include +#include #define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \ { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } } @@ -29,13 +29,13 @@ typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL EMU_GRAPHICS_WINDOW_PROTOCOL; typedef EFI_STATUS (EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)( - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga + EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows ); typedef EFI_STATUS (EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)( - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga, + EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows, UINT32 Width, UINT32 Height ); @@ -43,13 +43,13 @@ EFI_STATUS typedef EFI_STATUS (EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)( - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga + EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows ); typedef EFI_STATUS (EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)( - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga, + EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows, EFI_KEY_DATA *key ); @@ -89,8 +89,8 @@ typedef EFI_STATUS (EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)( IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows, - IN EFI_UGA_PIXEL *BltBuffer OPTIONAL, - IN EFI_UGA_BLT_OPERATION BltOperation, + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer OPTIONAL, + IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation, IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args ); diff --git a/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h b/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h index 7c495b25eb1b..68b2098d31c6 100644 --- a/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h +++ b/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h @@ -6,13 +6,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#ifndef _EMU_UGA_IO_H_ -#define _EMU_UGA_IO_H_ +#ifndef _EMU_GRAPHICS_WINDOW_H_ +#define _EMU_GRAPHICS_WINDOW_H_ #include #include #include -#include +#include #define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \ { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } } @@ -22,13 +22,13 @@ typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL EMU_GRAPHICS_WINDOW_PROTOCOL; typedef EFI_STATUS (EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)( - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga + EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindow ); typedef EFI_STATUS (EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)( - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga, + EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindow, UINT32 Width, UINT32 Height ); @@ -36,13 +36,13 @@ EFI_STATUS typedef EFI_STATUS (EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)( - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga + EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindow ); typedef EFI_STATUS (EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)( - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga, + EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindow, EFI_KEY_DATA *key ); @@ -83,8 +83,8 @@ typedef EFI_STATUS (EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)( IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows, - IN EFI_UGA_PIXEL *BltBuffer OPTIONAL, - IN EFI_UGA_BLT_OPERATION BltOperation, + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer OPTIONAL, + IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation, IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args ); diff --git a/EmulatorPkg/Library/PlatformBmLib/PlatformBm.h b/EmulatorPkg/Library/PlatformBmLib/PlatformBm.h index b89ffd77e4de..01fc45f22a64 100644 --- a/EmulatorPkg/Library/PlatformBmLib/PlatformBm.h +++ b/EmulatorPkg/Library/PlatformBmLib/PlatformBm.h @@ -60,7 +60,7 @@ typedef struct { EMU_VENDOR_DEVICE_PATH_NODE EmuBus; EMU_VENDOR_DEVICE_PATH_NODE EmuGraphicsWindow; EFI_DEVICE_PATH_PROTOCOL End; -} EMU_PLATFORM_UGA_DEVICE_PATH; +} EMU_PLATFORM_GRAPHICS_WINDOW_DEVICE_PATH; // // Platform BDS Functions diff --git a/EmulatorPkg/Library/PlatformBmLib/PlatformBmData.c b/EmulatorPkg/Library/PlatformBmLib/PlatformBmData.c index efb03def37eb..ee6966b311e3 100644 --- a/EmulatorPkg/Library/PlatformBmLib/PlatformBmData.c +++ b/EmulatorPkg/Library/PlatformBmLib/PlatformBmData.c @@ -8,7 +8,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include "PlatformBm.h" -EMU_PLATFORM_UGA_DEVICE_PATH gGopDevicePath = { +EMU_PLATFORM_GRAPHICS_WINDOW_DEVICE_PATH gGopDevicePath = { { { { @@ -40,7 +40,7 @@ EMU_PLATFORM_UGA_DEVICE_PATH gGopDevicePath = { gEndEntire }; -EMU_PLATFORM_UGA_DEVICE_PATH gGopDevicePath2 = { +EMU_PLATFORM_GRAPHICS_WINDOW_DEVICE_PATH gGopDevicePath2 = { { { { diff --git a/EmulatorPkg/Unix/Host/Gasket.h b/EmulatorPkg/Unix/Host/Gasket.h index 71b459ddd8c7..65b2c72965f0 100644 --- a/EmulatorPkg/Unix/Host/Gasket.h +++ b/EmulatorPkg/Unix/Host/Gasket.h @@ -200,7 +200,7 @@ ReverseGasketUint64Uint64 ( ); // -// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL +// Gasket functions for EFI_EMU_GRAPHICS_WINDOW_PROTOCOL // EFI_STATUS @@ -243,10 +243,10 @@ GasketX11RegisterKeyNotify ( EFI_STATUS EFIAPI GasketX11Blt ( - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows, - IN EFI_UGA_PIXEL *BltBuffer OPTIONAL, - IN EFI_UGA_BLT_OPERATION BltOperation, - IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows, + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer OPTIONAL, + IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation, + IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args ); EFI_STATUS diff --git a/EmulatorPkg/Unix/Host/Host.h b/EmulatorPkg/Unix/Host/Host.h index 0c81cdfc01f5..b62496bc7ed3 100644 --- a/EmulatorPkg/Unix/Host/Host.h +++ b/EmulatorPkg/Unix/Host/Host.h @@ -106,7 +106,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include -#include #include #include diff --git a/EmulatorPkg/Unix/Host/Ia32/Gasket.S b/EmulatorPkg/Unix/Host/Ia32/Gasket.S index 36197ff26028..6fcdd265cf30 100644 --- a/EmulatorPkg/Unix/Host/Ia32/Gasket.S +++ b/EmulatorPkg/Unix/Host/Ia32/Gasket.S @@ -371,7 +371,7 @@ ASM_PFX(GasketSecEmuThunkAddress): ret // -// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL +// Gasket functions for EFI_EMU_GRAPHICS_WINDOW_PROTOCOL // ASM_GLOBAL ASM_PFX(GasketX11Size) diff --git a/EmulatorPkg/Unix/Host/X11GraphicsWindow.c b/EmulatorPkg/Unix/Host/X11GraphicsWindow.c index a30cc19dbe0a..94ddf502d1e5 100644 --- a/EmulatorPkg/Unix/Host/X11GraphicsWindow.c +++ b/EmulatorPkg/Unix/Host/X11GraphicsWindow.c @@ -700,8 +700,8 @@ HandleEvents ( unsigned long X11PixelToColor ( - IN GRAPHICS_IO_PRIVATE *Drv, - IN EFI_UGA_PIXEL pixel + IN GRAPHICS_IO_PRIVATE *Drv, + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL pixel ) { return ((pixel.Red >> Drv->r.csize) << Drv->r.shift) @@ -709,15 +709,15 @@ X11PixelToColor ( | ((pixel.Blue >> Drv->b.csize) << Drv->b.shift); } -EFI_UGA_PIXEL +EFI_GRAPHICS_OUTPUT_BLT_PIXEL X11ColorToPixel ( IN GRAPHICS_IO_PRIVATE *Drv, IN unsigned long val ) { - EFI_UGA_PIXEL Pixel; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL Pixel; - memset (&Pixel, 0, sizeof (EFI_UGA_PIXEL)); + memset (&Pixel, 0, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); // Truncation not an issue since X11 and EFI are both using 8 bits per color Pixel.Red = (val >> Drv->r.shift) << Drv->r.csize; @@ -782,7 +782,7 @@ X11KeySetState ( if ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) == 0) { // // We could create an XKeyEvent and send a XK_Caps_Lock to - // the UGA/GOP Window + // the GOP Window // } } @@ -812,32 +812,32 @@ X11RegisterKeyNotify ( EFI_STATUS X11Blt ( - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo, - IN EFI_UGA_PIXEL *BltBuffer OPTIONAL, - IN EFI_UGA_BLT_OPERATION BltOperation, - IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo, + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer OPTIONAL, + IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation, + IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args ) { - GRAPHICS_IO_PRIVATE *Private; - UINTN DstY; - UINTN SrcY; - UINTN DstX; - UINTN SrcX; - UINTN Index; - EFI_UGA_PIXEL *Blt; - UINT8 *Dst; - UINT8 *Src; - UINTN Nbr; - unsigned long Color; - XEvent ev; + GRAPHICS_IO_PRIVATE *Private; + UINTN DstY; + UINTN SrcY; + UINTN DstX; + UINTN SrcX; + UINTN Index; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt; + UINT8 *Dst; + UINT8 *Src; + UINTN Nbr; + unsigned long Color; + XEvent ev; Private = (GRAPHICS_IO_PRIVATE *)GraphicsIo; // // Check bounds // - if ( (BltOperation == EfiUgaVideoToBltBuffer) - || (BltOperation == EfiUgaVideoToVideo)) + if ( (BltOperation == EfiBltVideoToBltBuffer) + || (BltOperation == EfiBltVideoToVideo)) { // // Source is Video. @@ -851,9 +851,9 @@ X11Blt ( } } - if ( (BltOperation == EfiUgaBltBufferToVideo) - || (BltOperation == EfiUgaVideoToVideo) - || (BltOperation == EfiUgaVideoFill)) + if ( (BltOperation == EfiBltBufferToVideo) + || (BltOperation == EfiBltVideoToVideo) + || (BltOperation == EfiBltVideoFill)) { // // Destination is Video @@ -868,32 +868,32 @@ X11Blt ( } switch (BltOperation) { - case EfiUgaVideoToBltBuffer: - Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->DestinationY * Args->Delta) + Args->DestinationX * sizeof (EFI_UGA_PIXEL)); - Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL); + case EfiBltVideoToBltBuffer: + Blt = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)((UINT8 *)BltBuffer + (Args->DestinationY * Args->Delta) + Args->DestinationX * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); + Args->Delta -= Args->Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL); for (SrcY = Args->SourceY; SrcY < (Args->Height + Args->SourceY); SrcY++) { for (SrcX = Args->SourceX; SrcX < (Args->Width + Args->SourceX); SrcX++) { *Blt++ = X11ColorToPixel (Private, XGetPixel (Private->image, SrcX, SrcY)); } - Blt = (EFI_UGA_PIXEL *)((UINT8 *)Blt + Args->Delta); + Blt = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)((UINT8 *)Blt + Args->Delta); } break; - case EfiUgaBltBufferToVideo: - Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->SourceY * Args->Delta) + Args->SourceX * sizeof (EFI_UGA_PIXEL)); - Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL); + case EfiBltBufferToVideo: + Blt = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)((UINT8 *)BltBuffer + (Args->SourceY * Args->Delta) + Args->SourceX * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); + Args->Delta -= Args->Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL); for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY); DstY++) { for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX); DstX++) { XPutPixel (Private->image, DstX, DstY, X11PixelToColor (Private, *Blt)); Blt++; } - Blt = (EFI_UGA_PIXEL *)((UINT8 *)Blt + Args->Delta); + Blt = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)((UINT8 *)Blt + Args->Delta); } break; - case EfiUgaVideoToVideo: + case EfiBltVideoToVideo: Dst = Private->image_data + (Args->DestinationX << Private->pixel_shift) + Args->DestinationY * Private->line_bytes; Src = Private->image_data + (Args->SourceX << Private->pixel_shift) @@ -920,7 +920,7 @@ X11Blt ( } break; - case EfiUgaVideoFill: + case EfiBltVideoFill: Color = X11PixelToColor (Private, *BltBuffer); for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY); DstY++) { for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX); DstX++) { @@ -937,7 +937,7 @@ X11Blt ( // Refresh screen. // switch (BltOperation) { - case EfiUgaVideoToVideo: + case EfiBltVideoToVideo: XCopyArea ( Private->display, Private->win, @@ -960,7 +960,7 @@ X11Blt ( } break; - case EfiUgaVideoFill: + case EfiBltVideoFill: Color = X11PixelToColor (Private, *BltBuffer); XSetForeground (Private->display, Private->gc, Color); XFillRectangle ( @@ -974,7 +974,7 @@ X11Blt ( ); XFlush (Private->display); break; - case EfiUgaBltBufferToVideo: + case EfiBltBufferToVideo: Redraw (Private, Args->DestinationX, Args->DestinationY, Args->Width, Args->Height); break; default: @@ -1060,7 +1060,7 @@ X11GraphicsWindowOpen ( Drv->display = XOpenDisplay (display_name); if (Drv->display == NULL) { - fprintf (stderr, "uga: cannot connect to X server %s\n", XDisplayName (display_name)); + fprintf (stderr, "GOP: cannot connect to X server %s\n", XDisplayName (display_name)); free (Drv); return EFI_DEVICE_ERROR; } diff --git a/EmulatorPkg/Unix/Host/X64/Gasket.S b/EmulatorPkg/Unix/Host/X64/Gasket.S index 030faa8e4c36..1b4614ab618d 100644 --- a/EmulatorPkg/Unix/Host/X64/Gasket.S +++ b/EmulatorPkg/Unix/Host/X64/Gasket.S @@ -427,7 +427,7 @@ ASM_PFX(GasketSecEmuThunkAddress): ret // -// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL +// Gasket functions for EFI_EMU_GRAPHICS_WINDOW_PROTOCOL // ASM_GLOBAL ASM_PFX(GasketX11Size) diff --git a/EmulatorPkg/Win/Host/WinGopScreen.c b/EmulatorPkg/Win/Host/WinGopScreen.c index cf27c34f1972..5a33d7e27fd3 100644 --- a/EmulatorPkg/Win/Host/WinGopScreen.c +++ b/EmulatorPkg/Win/Host/WinGopScreen.c @@ -396,10 +396,10 @@ WinNtWndSize ( // TODO: Delta - add argument and description to function comment EFI_STATUS WinNtWndBlt ( - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo, - IN EFI_UGA_PIXEL *BltBuffer OPTIONAL, - IN EFI_UGA_BLT_OPERATION BltOperation, - IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo, + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer OPTIONAL, + IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation, + IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args ) { RETURN_STATUS RStatus; @@ -423,7 +423,7 @@ WinNtWndBlt ( return (EFI_STATUS)RStatus; } - if (BltOperation != EfiUgaVideoToBltBuffer) { + if (BltOperation != EfiBltVideoToBltBuffer) { // // Mark the area we just blted as Invalid so WM_PAINT will update. // From 0fe2520aad17d6c9a228b343dd8e0e3126484ce7 Mon Sep 17 00:00:00 2001 From: GuoMinJ Date: Mon, 16 Jun 2025 10:50:30 +0200 Subject: [PATCH 0205/1172] MdeModulePkg: Remove UGA support The Universal Graphics Adapter (UGA) is a graphic abstraction. The UGA I/O and Draw protocols are deprecated since UEFI 2.0 was introduced. Cf. the UEFI spec v2.9: "Appendix L - EFI 1.10 Protocol Changes and Deprecation List" section L.2 "Deprecated Protocols" Remove the UGA support. Signed-off-by: GuoMinJ Signed-off-by: Pierre Gondois --- MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.c | 2 +- MdeModulePkg/Include/Library/BootLogoLib.h | 2 +- .../Library/BootLogoLib/BootLogoLib.c | 229 +++++------------- .../Library/BootLogoLib/BootLogoLib.inf | 4 - MdeModulePkg/MdeModulePkg.dec | 7 - MdeModulePkg/MdeModulePkg.uni | 6 - MdeModulePkg/Universal/HiiDatabaseDxe/Image.c | 2 +- 7 files changed, 58 insertions(+), 194 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.c index 337b2090d98e..a21c94c3dc1e 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.c +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.c @@ -49,7 +49,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_PCI_HOTPLUG_REQUEST_PROTOCOL mPciHotPlugReque Installs driver module protocols and. Creates virtual device handles for ConIn, ConOut, and StdErr. Installs Simple Text In protocol, Simple Text In Ex protocol, Simple Pointer protocol, Absolute Pointer protocol on those virtual handlers. - Installs Graphics Output protocol and/or UGA Draw protocol if needed. + Installs Graphics Output protocol if needed. @param[in] ImageHandle The firmware allocated handle for the EFI image. @param[in] SystemTable A pointer to the EFI System Table. diff --git a/MdeModulePkg/Include/Library/BootLogoLib.h b/MdeModulePkg/Include/Library/BootLogoLib.h index 2d6209a2789b..a2fd667026f5 100644 --- a/MdeModulePkg/Include/Library/BootLogoLib.h +++ b/MdeModulePkg/Include/Library/BootLogoLib.h @@ -26,7 +26,7 @@ BootLogoEnableLogo ( Use SystemTable ConOut to turn on video based Simple Text Out consoles. The Simple Text Out screens will now be synced up with all non-video output devices. - @retval EFI_SUCCESS UGA devices are back in text mode and synced up. + @retval EFI_SUCCESS Devices are back in text mode and synced up. **/ EFI_STATUS diff --git a/MdeModulePkg/Library/BootLogoLib/BootLogoLib.c b/MdeModulePkg/Library/BootLogoLib/BootLogoLib.c index 478ec2d40e2b..5beb0e0aa547 100644 --- a/MdeModulePkg/Library/BootLogoLib/BootLogoLib.c +++ b/MdeModulePkg/Library/BootLogoLib/BootLogoLib.c @@ -12,7 +12,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include -#include #include #include #include @@ -47,9 +46,6 @@ BootLogoEnableLogo ( UINT32 Instance; EFI_IMAGE_INPUT Image; EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; - UINT32 ColorDepth; - UINT32 RefreshRate; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; EFI_BOOT_LOGO_PROTOCOL *BootLogo; EDKII_BOOT_LOGO2_PROTOCOL *BootLogo2; @@ -68,22 +64,10 @@ BootLogoEnableLogo ( return EFI_UNSUPPORTED; } - UgaDraw = NULL; // // Try to open GOP first // Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiGraphicsOutputProtocolGuid, (VOID **)&GraphicsOutput); - if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) { - GraphicsOutput = NULL; - // - // Open GOP failed, try to open UGA - // - Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiUgaDrawProtocolGuid, (VOID **)&UgaDraw); - if (EFI_ERROR (Status)) { - UgaDraw = NULL; - } - } - if (EFI_ERROR (Status)) { return EFI_UNSUPPORTED; } @@ -109,16 +93,8 @@ BootLogoEnableLogo ( // gST->ConOut->EnableCursor (gST->ConOut, FALSE); - if (GraphicsOutput != NULL) { - SizeOfX = GraphicsOutput->Mode->Info->HorizontalResolution; - SizeOfY = GraphicsOutput->Mode->Info->VerticalResolution; - } else { - ASSERT (UgaDraw != NULL); - Status = UgaDraw->GetMode (UgaDraw, &SizeOfX, &SizeOfY, &ColorDepth, &RefreshRate); - if (EFI_ERROR (Status)) { - return EFI_UNSUPPORTED; - } - } + SizeOfX = GraphicsOutput->Mode->Info->HorizontalResolution; + SizeOfY = GraphicsOutput->Mode->Info->VerticalResolution; Blt = NULL; NumberOfLogos = 0; @@ -206,34 +182,18 @@ BootLogoEnableLogo ( DestY += OffsetY; if ((DestX >= 0) && (DestY >= 0)) { - if (GraphicsOutput != NULL) { - Status = GraphicsOutput->Blt ( - GraphicsOutput, - Blt, - EfiBltBufferToVideo, - 0, - 0, - (UINTN)DestX, - (UINTN)DestY, - Image.Width, - Image.Height, - Image.Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) - ); - } else { - ASSERT (UgaDraw != NULL); - Status = UgaDraw->Blt ( - UgaDraw, - (EFI_UGA_PIXEL *)Blt, - EfiUgaBltBufferToVideo, - 0, - 0, - (UINTN)DestX, - (UINTN)DestY, - Image.Width, - Image.Height, - Image.Width * sizeof (EFI_UGA_PIXEL) - ); - } + Status = GraphicsOutput->Blt ( + GraphicsOutput, + Blt, + EfiBltBufferToVideo, + 0, + 0, + (UINTN)DestX, + (UINTN)DestY, + Image.Width, + Image.Height, + Image.Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) + ); // // Report displayed Logo information. @@ -307,33 +267,18 @@ BootLogoEnableLogo ( return EFI_OUT_OF_RESOURCES; } - if (GraphicsOutput != NULL) { - Status = GraphicsOutput->Blt ( - GraphicsOutput, - LogoBlt, - EfiBltVideoToBltBuffer, - LogoDestX, - LogoDestY, - 0, - 0, - LogoWidth, - LogoHeight, - LogoWidth * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) - ); - } else { - Status = UgaDraw->Blt ( - UgaDraw, - (EFI_UGA_PIXEL *)LogoBlt, - EfiUgaVideoToBltBuffer, - LogoDestX, - LogoDestY, - 0, - 0, - LogoWidth, - LogoHeight, - LogoWidth * sizeof (EFI_UGA_PIXEL) - ); - } + Status = GraphicsOutput->Blt ( + GraphicsOutput, + LogoBlt, + EfiBltVideoToBltBuffer, + LogoDestX, + LogoDestY, + 0, + 0, + LogoWidth, + LogoHeight, + LogoWidth * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) + ); } if (!EFI_ERROR (Status)) { @@ -368,7 +313,7 @@ BootLogoEnableLogo ( Use SystemTable Conout to turn on video based Simple Text Out consoles. The Simple Text Out screens will now be synced up with all non video output devices - @retval EFI_SUCCESS UGA devices are back in text mode and synced up. + @retval EFI_SUCCESS GOP devices are back in text mode and synced up. **/ EFI_STATUS @@ -411,11 +356,8 @@ BootLogoUpdateProgress ( { EFI_STATUS Status; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; UINT32 SizeOfX; UINT32 SizeOfY; - UINT32 ColorDepth; - UINT32 RefreshRate; EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color; UINTN BlockHeight; UINTN BlockWidth; @@ -428,40 +370,13 @@ BootLogoUpdateProgress ( return EFI_INVALID_PARAMETER; } - UgaDraw = NULL; - Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiGraphicsOutputProtocolGuid, (VOID **)&GraphicsOutput); - if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) { - GraphicsOutput = NULL; - - Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiUgaDrawProtocolGuid, (VOID **)&UgaDraw); - if (EFI_ERROR (Status)) { - UgaDraw = NULL; - } - } - + Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiGraphicsOutputProtocolGuid, (VOID **)&GraphicsOutput); if (EFI_ERROR (Status)) { return EFI_UNSUPPORTED; } - SizeOfX = 0; - SizeOfY = 0; - if (GraphicsOutput != NULL) { - SizeOfX = GraphicsOutput->Mode->Info->HorizontalResolution; - SizeOfY = GraphicsOutput->Mode->Info->VerticalResolution; - } else if (UgaDraw != NULL) { - Status = UgaDraw->GetMode ( - UgaDraw, - &SizeOfX, - &SizeOfY, - &ColorDepth, - &RefreshRate - ); - if (EFI_ERROR (Status)) { - return EFI_UNSUPPORTED; - } - } else { - return EFI_UNSUPPORTED; - } + SizeOfX = GraphicsOutput->Mode->Info->HorizontalResolution; + SizeOfY = GraphicsOutput->Mode->Info->VerticalResolution; BlockWidth = SizeOfX / 100; BlockHeight = SizeOfY / 50; @@ -477,71 +392,37 @@ BootLogoUpdateProgress ( // SetMem (&Color, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0x0); - if (GraphicsOutput != NULL) { - Status = GraphicsOutput->Blt ( - GraphicsOutput, - &Color, - EfiBltVideoFill, - 0, - 0, - 0, - PosY - EFI_GLYPH_HEIGHT - 1, - SizeOfX, - SizeOfY - (PosY - EFI_GLYPH_HEIGHT - 1), - SizeOfX * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) - ); - } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { - Status = UgaDraw->Blt ( - UgaDraw, - (EFI_UGA_PIXEL *)&Color, - EfiUgaVideoFill, - 0, - 0, - 0, - PosY - EFI_GLYPH_HEIGHT - 1, - SizeOfX, - SizeOfY - (PosY - EFI_GLYPH_HEIGHT - 1), - SizeOfX * sizeof (EFI_UGA_PIXEL) - ); - } else { - return EFI_UNSUPPORTED; - } + Status = GraphicsOutput->Blt ( + GraphicsOutput, + &Color, + EfiBltVideoFill, + 0, + 0, + 0, + PosY - EFI_GLYPH_HEIGHT - 1, + SizeOfX, + SizeOfY - (PosY - EFI_GLYPH_HEIGHT - 1), + SizeOfX * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) + ); } // // Show progress by drawing blocks // for (Index = PreviousValue; Index < BlockNum; Index++) { - PosX = Index * BlockWidth; - if (GraphicsOutput != NULL) { - Status = GraphicsOutput->Blt ( - GraphicsOutput, - &ProgressColor, - EfiBltVideoFill, - 0, - 0, - PosX, - PosY, - BlockWidth - 1, - BlockHeight, - (BlockWidth) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) - ); - } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { - Status = UgaDraw->Blt ( - UgaDraw, - (EFI_UGA_PIXEL *)&ProgressColor, - EfiUgaVideoFill, - 0, - 0, - PosX, - PosY, - BlockWidth - 1, - BlockHeight, - (BlockWidth) * sizeof (EFI_UGA_PIXEL) - ); - } else { - return EFI_UNSUPPORTED; - } + PosX = Index * BlockWidth; + Status = GraphicsOutput->Blt ( + GraphicsOutput, + &ProgressColor, + EfiBltVideoFill, + 0, + 0, + PosX, + PosY, + BlockWidth - 1, + BlockHeight, + (BlockWidth) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) + ); } PrintXY ( diff --git a/MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf b/MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf index 7d50f2dfa3ab..03fd70451bc6 100644 --- a/MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf +++ b/MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf @@ -42,11 +42,7 @@ [Protocols] gEfiGraphicsOutputProtocolGuid ## SOMETIMES_CONSUMES - gEfiUgaDrawProtocolGuid |PcdUgaConsumeSupport ## SOMETIMES_CONSUMES gEfiBootLogoProtocolGuid ## SOMETIMES_CONSUMES gEdkiiBootLogo2ProtocolGuid ## SOMETIMES_CONSUMES gEfiUserManagerProtocolGuid ## CONSUMES gEdkiiPlatformLogoProtocolGuid ## CONSUMES - -[FeaturePcd] - gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport ## CONSUMES diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 3698caf902a4..88b5a9d0582e 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -824,13 +824,6 @@ # @Prompt Enable ConOut GOP support. gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE|BOOLEAN|0x00010042 - ## Indicates if UGA Draw Protocol will be installed on virtual handle created by ConsplitterDxe. - # It could be set FALSE to save size.

- # TRUE - Installs UGA Draw Protocol on virtual handle created by ConsplitterDxe.
- # FALSE - Does not install UGA Draw Protocol on virtual handle created by ConsplitterDxe.
- # @Prompt Enable ConOut UGA support. - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|TRUE|BOOLEAN|0x00010043 - ## Indicates PeiCore will first search TE section from the PEIM to load the image, or PE32 section, when PeiCore dispatches a PEI module. # This PCD is used to tune PEI phase performance to reduce the search image time. # It can be set according to the generated image section type.

diff --git a/MdeModulePkg/MdeModulePkg.uni b/MdeModulePkg/MdeModulePkg.uni index 6079285e3f8b..7aa83226bba3 100644 --- a/MdeModulePkg/MdeModulePkg.uni +++ b/MdeModulePkg/MdeModulePkg.uni @@ -709,12 +709,6 @@ "TRUE - Installs Graphics Output Protocol on virtual handle created by ConsplitterDxe.
\n" "FALSE - Does not install Graphics Output Protocol on virtual handle created by ConsplitterDxe.
" -#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdConOutUgaSupport_PROMPT #language en-US "Enable ConOut UGA support" - -#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdConOutUgaSupport_HELP #language en-US "Indicates if UGA Draw Protocol will be installed on virtual handle created by ConsplitterDxe. It could be set FALSE to save size.

\n" - "TRUE - Installs UGA Draw Protocol on virtual handle created by ConsplitterDxe.
\n" - "FALSE - Does not install UGA Draw Protocol on virtual handle created by ConsplitterDxe.
" - #string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdPeiCoreImageLoaderSearchTeSectionFirst_PROMPT #language en-US "PeiCore search TE section first" #string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdPeiCoreImageLoaderSearchTeSectionFirst_HELP #language en-US "Indicates PeiCore will first search TE section from the PEIM to load the image, or PE32 section, when PeiCore dispatches a PEI module. This PCD is used to tune PEI phase performance to reduce the search image time. It can be set according to the generated image section type.

\n" diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/Image.c b/MdeModulePkg/Universal/HiiDatabaseDxe/Image.c index b35360e2629b..ae5eff707849 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/Image.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/Image.c @@ -1407,7 +1407,7 @@ HiiDrawImage ( // if ((Flags & EFI_HII_DIRECT_TO_SCREEN) == EFI_HII_DIRECT_TO_SCREEN) { // - // Caller should make sure the current UGA console is grarphic mode. + // Caller should make sure the current console is grarphic mode. // // From ecaca1652d955ba8aad2f0d9cece47196bcc11b8 Mon Sep 17 00:00:00 2001 From: GuoMinJ Date: Mon, 16 Jun 2025 10:50:47 +0200 Subject: [PATCH 0206/1172] MdeModulePkg/ConSplitterDxe UGA The Universal Graphics Adapter (UGA) is a graphic abstraction. The UGA I/O and Draw protocols are deprecated since UEFI 2.0 was introduced. Cf. the UEFI spec v2.9: "Appendix L - EFI 1.10 Protocol Changes and Deprecation List" section L.2 "Deprecated Protocols" Remove the UGA support. Signed-off-by: GuoMinJ Signed-off-by: Pierre Gondois --- .../Console/ConSplitterDxe/ConSplitter.c | 317 +++--------------- .../Console/ConSplitterDxe/ConSplitter.h | 134 +------- .../Console/ConSplitterDxe/ConSplitterDxe.inf | 14 +- .../Console/ConSplitterDxe/ConSplitterDxe.uni | 11 +- .../ConSplitterDxe/ConSplitterGraphics.c | 308 ----------------- 5 files changed, 53 insertions(+), 731 deletions(-) diff --git a/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c b/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c index 0a776f369b9a..2dbb7eaeec7e 100644 --- a/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c +++ b/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c @@ -107,15 +107,6 @@ GLOBAL_REMOVE_IF_UNREFERENCED TEXT_IN_SPLITTER_PRIVATE_DATA mConIn = { FALSE }; -// -// Uga Draw Protocol Private Data template -// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UGA_DRAW_PROTOCOL mUgaDrawProtocolTemplate = { - ConSplitterUgaDrawGetMode, - ConSplitterUgaDrawSetMode, - ConSplitterUgaDrawBlt -}; - // // Graphics Output Protocol Private Data template // @@ -153,16 +144,6 @@ GLOBAL_REMOVE_IF_UNREFERENCED TEXT_OUT_SPLITTER_PRIVATE_DATA mConOut = { FALSE, }, - { - NULL, - NULL, - NULL - }, - 0, - 0, - 0, - 0, - { NULL, NULL, @@ -171,7 +152,6 @@ GLOBAL_REMOVE_IF_UNREFERENCED TEXT_OUT_SPLITTER_PRIVATE_DATA mConOut = { }, (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *)NULL, 0, - 0, 0, (TEXT_OUT_AND_GOP_DATA *)NULL, @@ -209,16 +189,6 @@ GLOBAL_REMOVE_IF_UNREFERENCED TEXT_OUT_SPLITTER_PRIVATE_DATA mStdErr = { FALSE, }, - { - NULL, - NULL, - NULL - }, - 0, - 0, - 0, - 0, - { NULL, NULL, @@ -227,7 +197,6 @@ GLOBAL_REMOVE_IF_UNREFERENCED TEXT_OUT_SPLITTER_PRIVATE_DATA mStdErr = { }, (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *)NULL, 0, - 0, 0, (TEXT_OUT_AND_GOP_DATA *)NULL, @@ -422,7 +391,7 @@ ToggleStateSyncReInitialization ( Installs driver module protocols and. Creates virtual device handles for ConIn, ConOut, and StdErr. Installs Simple Text In protocol, Simple Text In Ex protocol, Simple Pointer protocol, Absolute Pointer protocol on those virtual handlers. - Installs Graphics Output protocol and/or UGA Draw protocol if needed. + Installs Graphics Output protocol. @param[in] ImageHandle The firmware allocated handle for the EFI image. @param[in] SystemTable A pointer to the EFI System Table. @@ -494,12 +463,9 @@ ConSplitterDriverEntry ( ASSERT_EFI_ERROR (Status); // - // Either Graphics Output protocol or UGA Draw protocol must be supported. + // Graphics Output protocol must be supported. // - ASSERT ( - FeaturePcdGet (PcdConOutGopSupport) || - FeaturePcdGet (PcdConOutUgaSupport) - ); + ASSERT (FeaturePcdGet (PcdConOutGopSupport)); // // The driver creates virtual handles for ConIn, ConOut, StdErr. @@ -757,10 +723,6 @@ ConSplitterTextOutConstructor ( // // Copy protocols template // - if (FeaturePcdGet (PcdConOutUgaSupport)) { - CopyMem (&ConOutPrivate->UgaDraw, &mUgaDrawProtocolTemplate, sizeof (EFI_UGA_DRAW_PROTOCOL)); - } - if (FeaturePcdGet (PcdConOutGopSupport)) { CopyMem (&ConOutPrivate->GraphicsOutput, &mGraphicsOutputProtocolTemplate, sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL)); } @@ -806,13 +768,6 @@ ConSplitterTextOutConstructor ( ConOutPrivate->TextOutQueryData[0].Rows = 25; TextOutSetMode (ConOutPrivate, 0); - if (FeaturePcdGet (PcdConOutUgaSupport)) { - // - // Setup the UgaDraw to 800 x 600 x 32 bits per pixel, 60Hz. - // - ConSplitterUgaDrawSetMode (&ConOutPrivate->UgaDraw, 800, 600, 32, 60); - } - if (FeaturePcdGet (PcdConOutGopSupport)) { // // Setup resource for mode information in Graphics Output Protocol interface @@ -1335,7 +1290,6 @@ ConSplitterConOutDriverBindingStart ( EFI_STATUS Status; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *TextOut; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; UINTN SizeOfInfo; EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; @@ -1356,7 +1310,6 @@ ConSplitterConOutDriverBindingStart ( } GraphicsOutput = NULL; - UgaDraw = NULL; // // Try to Open Graphics Output protocol // @@ -1369,20 +1322,6 @@ ConSplitterConOutDriverBindingStart ( EFI_OPEN_PROTOCOL_GET_PROTOCOL ); - if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) { - // - // Open UGA DRAW protocol - // - gBS->OpenProtocol ( - ControllerHandle, - &gEfiUgaDrawProtocolGuid, - (VOID **)&UgaDraw, - This->DriverBindingHandle, - mConOut.VirtualHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - } - // // When new console device is added, the new mode will be set later, // so put current mode back to init state. @@ -1393,36 +1332,18 @@ ConSplitterConOutDriverBindingStart ( // If both ConOut and StdErr incorporate the same Text Out device, // their MaxMode and QueryData should be the intersection of both. // - Status = ConSplitterTextOutAddDevice (&mConOut, TextOut, GraphicsOutput, UgaDraw); + Status = ConSplitterTextOutAddDevice (&mConOut, TextOut, GraphicsOutput); ConSplitterTextOutSetAttribute (&mConOut.TextOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK)); - if (FeaturePcdGet (PcdConOutUgaSupport)) { - // - // Get the UGA mode data of ConOut from the current mode - // - if (GraphicsOutput != NULL) { - Status = GraphicsOutput->QueryMode (GraphicsOutput, GraphicsOutput->Mode->Mode, &SizeOfInfo, &Info); - if (EFI_ERROR (Status)) { - return Status; - } - - ASSERT (SizeOfInfo <= sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION)); - - mConOut.UgaHorizontalResolution = Info->HorizontalResolution; - mConOut.UgaVerticalResolution = Info->VerticalResolution; - mConOut.UgaColorDepth = 32; - mConOut.UgaRefreshRate = 60; - - FreePool (Info); - } else if (UgaDraw != NULL) { - Status = UgaDraw->GetMode ( - UgaDraw, - &mConOut.UgaHorizontalResolution, - &mConOut.UgaVerticalResolution, - &mConOut.UgaColorDepth, - &mConOut.UgaRefreshRate - ); + if (GraphicsOutput != NULL) { + Status = GraphicsOutput->QueryMode (GraphicsOutput, GraphicsOutput->Mode->Mode, &SizeOfInfo, &Info); + if (EFI_ERROR (Status)) { + return Status; } + + ASSERT (SizeOfInfo <= sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION)); + + FreePool (Info); } return Status; @@ -1477,7 +1398,7 @@ ConSplitterStdErrDriverBindingStart ( // If both ConOut and StdErr incorporate the same Text Out device, // their MaxMode and QueryData should be the intersection of both. // - Status = ConSplitterTextOutAddDevice (&mStdErr, TextOut, NULL, NULL); + Status = ConSplitterTextOutAddDevice (&mStdErr, TextOut, NULL); ConSplitterTextOutSetAttribute (&mStdErr.TextOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK)); return Status; @@ -2737,7 +2658,6 @@ ConSplitterGetIntersectionBetweenConOutAndStrErr ( @param Private Text Out Splitter pointer. @param GraphicsOutput Graphics Output protocol pointer. - @param UgaDraw UGA Draw protocol pointer. @retval EFI_SUCCESS Output mode added successfully. @retval other Failed to add output mode. @@ -2746,8 +2666,7 @@ ConSplitterGetIntersectionBetweenConOutAndStrErr ( EFI_STATUS ConSplitterAddGraphicsOutputMode ( IN TEXT_OUT_SPLITTER_PRIVATE_DATA *Private, - IN EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput, - IN EFI_UGA_DRAW_PROTOCOL *UgaDraw + IN EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput ) { EFI_STATUS Status; @@ -2762,12 +2681,8 @@ ConSplitterAddGraphicsOutputMode ( UINTN NumberIndex; BOOLEAN Match; BOOLEAN AlreadyExist; - UINT32 UgaHorizontalResolution; - UINT32 UgaVerticalResolution; - UINT32 UgaColorDepth; - UINT32 UgaRefreshRate; - ASSERT (GraphicsOutput != NULL || UgaDraw != NULL); + ASSERT (GraphicsOutput != NULL); CurrentGraphicsOutputMode = Private->GraphicsOutput.Mode; @@ -2775,15 +2690,6 @@ ConSplitterAddGraphicsOutputMode ( CurrentIndex = 0; Status = EFI_SUCCESS; - if (Private->CurrentNumberOfUgaDraw != 0) { - // - // If any UGA device has already been added, then there is no need to - // calculate intersection of display mode of different GOP/UGA device, - // since only one display mode will be exported (i.e. user-defined mode) - // - goto Done; - } - if (GraphicsOutput != NULL) { if (Private->CurrentNumberOfGraphicsOutput == 0) { // @@ -2937,51 +2843,12 @@ ConSplitterAddGraphicsOutputMode ( } } } - } else if (UgaDraw != NULL) { - // - // Graphics console driver can ensure the same mode for all GOP devices - // so we can get the current mode from this video device - // - UgaDraw->GetMode ( - UgaDraw, - &UgaHorizontalResolution, - &UgaVerticalResolution, - &UgaColorDepth, - &UgaRefreshRate - ); - - CurrentGraphicsOutputMode->MaxMode = 1; - Info = CurrentGraphicsOutputMode->Info; - Info->Version = 0; - Info->HorizontalResolution = UgaHorizontalResolution; - Info->VerticalResolution = UgaVerticalResolution; - Info->PixelFormat = PixelBltOnly; - Info->PixelsPerScanLine = UgaHorizontalResolution; - CurrentGraphicsOutputMode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); - CurrentGraphicsOutputMode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS)(UINTN)NULL; - CurrentGraphicsOutputMode->FrameBufferSize = 0; - - // - // Update the private mode buffer - // - CopyMem (&Private->GraphicsOutputModeBuffer[0], Info, sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION)); - - // - // Only mode 0 is available to be set - // - CurrentIndex = 0; } -Done: - if (GraphicsOutput != NULL) { Private->CurrentNumberOfGraphicsOutput++; } - if (UgaDraw != NULL) { - Private->CurrentNumberOfUgaDraw++; - } - // // Force GraphicsOutput mode to be set, // @@ -3130,7 +2997,6 @@ ConsplitterSetConsoleOutMode ( @param Private Text Out Splitter pointer. @param TextOut Simple Text Output protocol pointer. @param GraphicsOutput Graphics Output protocol pointer. - @param UgaDraw UGA Draw protocol pointer. @retval EFI_SUCCESS Text Output Device added successfully. @retval EFI_OUT_OF_RESOURCES Could not grow the buffer size. @@ -3140,17 +3006,12 @@ EFI_STATUS ConSplitterTextOutAddDevice ( IN TEXT_OUT_SPLITTER_PRIVATE_DATA *Private, IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *TextOut, - IN EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput, - IN EFI_UGA_DRAW_PROTOCOL *UgaDraw + IN EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput ) { EFI_STATUS Status; UINTN CurrentNumOfConsoles; INT32 MaxMode; - UINT32 UgaHorizontalResolution; - UINT32 UgaVerticalResolution; - UINT32 UgaColorDepth; - UINT32 UgaRefreshRate; TEXT_OUT_AND_GOP_DATA *TextAndGop; UINTN SizeOfInfo; EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; @@ -3186,7 +3047,6 @@ ConSplitterTextOutAddDevice ( TextAndGop->TextOut = TextOut; TextAndGop->GraphicsOutput = GraphicsOutput; - TextAndGop->UgaDraw = UgaDraw; if (CurrentNumOfConsoles == 0) { // @@ -3215,101 +3075,33 @@ ConSplitterTextOutAddDevice ( // // This device display mode will be added into Graphics Ouput modes. // - if ((GraphicsOutput != NULL) || (UgaDraw != NULL)) { - DeviceStatus = ConSplitterAddGraphicsOutputMode (Private, GraphicsOutput, UgaDraw); + if (GraphicsOutput != NULL) { + DeviceStatus = ConSplitterAddGraphicsOutputMode (Private, GraphicsOutput); } - if (FeaturePcdGet (PcdConOutUgaSupport)) { - // - // If UGA is produced by Consplitter - // - if (GraphicsOutput != NULL) { - Status = GraphicsOutput->QueryMode (GraphicsOutput, GraphicsOutput->Mode->Mode, &SizeOfInfo, &Info); - if (EFI_ERROR (Status)) { - return Status; - } - - ASSERT (SizeOfInfo <= sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION)); - - UgaHorizontalResolution = Info->HorizontalResolution; - UgaVerticalResolution = Info->VerticalResolution; - - FreePool (Info); - } else if (UgaDraw != NULL) { - Status = UgaDraw->GetMode ( - UgaDraw, - &UgaHorizontalResolution, - &UgaVerticalResolution, - &UgaColorDepth, - &UgaRefreshRate - ); - if (!EFI_ERROR (Status) && EFI_ERROR (DeviceStatus)) { - // - // if GetMode is successfully and UGA device hasn't been set, set it - // - Status = ConSplitterUgaDrawSetMode ( - &Private->UgaDraw, - UgaHorizontalResolution, - UgaVerticalResolution, - UgaColorDepth, - UgaRefreshRate - ); - } - - // - // If GetMode/SetMode is failed, set to 800x600 mode - // - if (EFI_ERROR (Status)) { - Status = ConSplitterUgaDrawSetMode ( - &Private->UgaDraw, - 800, - 600, - 32, - 60 - ); - } + if (GraphicsOutput != NULL) { + Status = GraphicsOutput->QueryMode (GraphicsOutput, GraphicsOutput->Mode->Mode, &SizeOfInfo, &Info); + if (EFI_ERROR (Status)) { + return Status; } + + ASSERT (SizeOfInfo <= sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION)); + FreePool (Info); } if (((!EFI_ERROR (DeviceStatus)) || (!EFI_ERROR (Status))) && - ((Private->CurrentNumberOfGraphicsOutput + Private->CurrentNumberOfUgaDraw) == 1)) + ((Private->CurrentNumberOfGraphicsOutput) == 1)) { - if (!FeaturePcdGet (PcdConOutGopSupport)) { - // - // If Graphics Outpurt protocol not supported, UGA Draw protocol is installed - // on the virtual handle. - // - Status = gBS->InstallMultipleProtocolInterfaces ( - &mConOut.VirtualHandle, - &gEfiUgaDrawProtocolGuid, - &mConOut.UgaDraw, - NULL - ); - } else if (!FeaturePcdGet (PcdConOutUgaSupport)) { - // - // If UGA Draw protocol not supported, Graphics Output Protocol is installed - // on virtual handle. - // - Status = gBS->InstallMultipleProtocolInterfaces ( - &mConOut.VirtualHandle, - &gEfiGraphicsOutputProtocolGuid, - &mConOut.GraphicsOutput, - NULL - ); - } else { - // - // Boot Graphics Output protocol and UGA Draw protocol are supported, - // both they will be installed on virtual handle. - // - Status = gBS->InstallMultipleProtocolInterfaces ( - &mConOut.VirtualHandle, - &gEfiGraphicsOutputProtocolGuid, - &mConOut.GraphicsOutput, - &gEfiUgaDrawProtocolGuid, - &mConOut.UgaDraw, - NULL - ); - } + // + // Graphics Output Protocol is installed + // on virtual handle. + // + Status = gBS->InstallMultipleProtocolInterfaces ( + &mConOut.VirtualHandle, + &gEfiGraphicsOutputProtocolGuid, + &mConOut.GraphicsOutput, + NULL + ); } // @@ -3353,10 +3145,6 @@ ConSplitterTextOutDeleteDevice ( TextOutList = Private->TextOutList; while (Index >= 0) { if (TextOutList->TextOut == TextOut) { - if (TextOutList->UgaDraw != NULL) { - Private->CurrentNumberOfUgaDraw--; - } - if (TextOutList->GraphicsOutput != NULL) { Private->CurrentNumberOfGraphicsOutput--; } @@ -3377,33 +3165,16 @@ ConSplitterTextOutDeleteDevice ( return EFI_NOT_FOUND; } - if ((Private->CurrentNumberOfGraphicsOutput == 0) && (Private->CurrentNumberOfUgaDraw == 0)) { + if ((Private->CurrentNumberOfGraphicsOutput == 0)) { // - // If there is not any physical GOP and UGA device in system, - // Consplitter GOP or UGA protocol will be uninstalled + // If there is not any physical GOP in system, + // Consplitter GOP protocol will be uninstalled // - if (!FeaturePcdGet (PcdConOutGopSupport)) { - Status = gBS->UninstallProtocolInterface ( - Private->VirtualHandle, - &gEfiUgaDrawProtocolGuid, - &Private->UgaDraw - ); - } else if (!FeaturePcdGet (PcdConOutUgaSupport)) { - Status = gBS->UninstallProtocolInterface ( - Private->VirtualHandle, - &gEfiGraphicsOutputProtocolGuid, - &Private->GraphicsOutput - ); - } else { - Status = gBS->UninstallMultipleProtocolInterfaces ( - Private->VirtualHandle, - &gEfiUgaDrawProtocolGuid, - &Private->UgaDraw, - &gEfiGraphicsOutputProtocolGuid, - &Private->GraphicsOutput, - NULL - ); - } + Status = gBS->UninstallProtocolInterface ( + Private->VirtualHandle, + &gEfiGraphicsOutputProtocolGuid, + &Private->GraphicsOutput + ); } if (CurrentNumOfConsoles == 0) { diff --git a/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.h b/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.h index 354107c62249..f6d90d532259 100644 --- a/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.h +++ b/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.h @@ -21,7 +21,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include -#include #include #include @@ -182,7 +181,6 @@ typedef struct { typedef struct { EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *TextOut; } TEXT_OUT_AND_GOP_DATA; @@ -195,16 +193,9 @@ typedef struct { EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL TextOut; EFI_SIMPLE_TEXT_OUTPUT_MODE TextOutMode; - EFI_UGA_DRAW_PROTOCOL UgaDraw; - UINT32 UgaHorizontalResolution; - UINT32 UgaVerticalResolution; - UINT32 UgaColorDepth; - UINT32 UgaRefreshRate; - EFI_GRAPHICS_OUTPUT_PROTOCOL GraphicsOutput; EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *GraphicsOutputModeBuffer; UINTN CurrentNumberOfGraphicsOutput; - UINTN CurrentNumberOfUgaDraw; UINTN CurrentNumberOfConsoles; TEXT_OUT_AND_GOP_DATA *TextOutList; @@ -230,13 +221,6 @@ typedef struct { TEXT_OUT_SPLITTER_PRIVATE_DATA_SIGNATURE \ ) -#define UGA_DRAW_SPLITTER_PRIVATE_DATA_FROM_THIS(a) \ - CR ((a), \ - TEXT_OUT_SPLITTER_PRIVATE_DATA, \ - UgaDraw, \ - TEXT_OUT_SPLITTER_PRIVATE_DATA_SIGNATURE \ - ) - #define CONSOLE_CONTROL_SPLITTER_PRIVATE_DATA_FROM_THIS(a) \ CR ((a), \ TEXT_OUT_SPLITTER_PRIVATE_DATA, \ @@ -254,7 +238,7 @@ typedef struct { Installs driver module protocols and. Creates virtual device handles for ConIn, ConOut, and StdErr. Installs Simple Text In protocol, Simple Text In Ex protocol, Simple Pointer protocol, Absolute Pointer protocol on those virtual handlers. - Installs Graphics Output protocol and/or UGA Draw protocol if needed. + Installs Graphics Output protocol if needed. @param[in] ImageHandle The firmware allocated handle for the EFI image. @param[in] SystemTable A pointer to the EFI System Table. @@ -1202,7 +1186,6 @@ ConSplitterSimplePointerDeleteDevice ( @param Private Text Out Splitter pointer. @param TextOut Simple Text Output protocol pointer. @param GraphicsOutput Graphics Output protocol pointer. - @param UgaDraw UGA Draw protocol pointer. @retval EFI_SUCCESS Text Output Device added successfully. @retval EFI_OUT_OF_RESOURCES Could not grow the buffer size. @@ -1212,8 +1195,7 @@ EFI_STATUS ConSplitterTextOutAddDevice ( IN TEXT_OUT_SPLITTER_PRIVATE_DATA *Private, IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *TextOut, - IN EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput, - IN EFI_UGA_DRAW_PROTOCOL *UgaDraw + IN EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput ); /** @@ -1857,118 +1839,6 @@ ConSplitterGraphicsOutputBlt ( IN UINTN Delta OPTIONAL ); -/** - Return the current video mode information. - - @param This The EFI_UGA_DRAW_PROTOCOL instance. - @param HorizontalResolution The size of video screen in pixels in the X dimension. - @param VerticalResolution The size of video screen in pixels in the Y dimension. - @param ColorDepth Number of bits per pixel, currently defined to be 32. - @param RefreshRate The refresh rate of the monitor in Hertz. - - @retval EFI_SUCCESS Mode information returned. - @retval EFI_NOT_STARTED Video display is not initialized. Call SetMode () - @retval EFI_INVALID_PARAMETER One of the input args was NULL. - -**/ -EFI_STATUS -EFIAPI -ConSplitterUgaDrawGetMode ( - IN EFI_UGA_DRAW_PROTOCOL *This, - OUT UINT32 *HorizontalResolution, - OUT UINT32 *VerticalResolution, - OUT UINT32 *ColorDepth, - OUT UINT32 *RefreshRate - ); - -/** - Set the current video mode information. - - @param This The EFI_UGA_DRAW_PROTOCOL instance. - @param HorizontalResolution The size of video screen in pixels in the X dimension. - @param VerticalResolution The size of video screen in pixels in the Y dimension. - @param ColorDepth Number of bits per pixel, currently defined to be 32. - @param RefreshRate The refresh rate of the monitor in Hertz. - - @retval EFI_SUCCESS Mode information returned. - @retval EFI_NOT_STARTED Video display is not initialized. Call SetMode () - @retval EFI_OUT_OF_RESOURCES Out of resources. - -**/ -EFI_STATUS -EFIAPI -ConSplitterUgaDrawSetMode ( - IN EFI_UGA_DRAW_PROTOCOL *This, - IN UINT32 HorizontalResolution, - IN UINT32 VerticalResolution, - IN UINT32 ColorDepth, - IN UINT32 RefreshRate - ); - -/** - Blt a rectangle of pixels on the graphics screen. - - The following table defines actions for BltOperations. - - EfiUgaVideoFill: - Write data from the BltBuffer pixel (SourceX, SourceY) - directly to every pixel of the video display rectangle - (DestinationX, DestinationY) - (DestinationX + Width, DestinationY + Height). - Only one pixel will be used from the BltBuffer. Delta is NOT used. - EfiUgaVideoToBltBuffer: - Read data from the video display rectangle - (SourceX, SourceY) (SourceX + Width, SourceY + Height) and place it in - the BltBuffer rectangle (DestinationX, DestinationY ) - (DestinationX + Width, DestinationY + Height). If DestinationX or - DestinationY is not zero then Delta must be set to the length in bytes - of a row in the BltBuffer. - EfiUgaBltBufferToVideo: - Write data from the BltBuffer rectangle - (SourceX, SourceY) (SourceX + Width, SourceY + Height) directly to the - video display rectangle (DestinationX, DestinationY) - (DestinationX + Width, DestinationY + Height). If SourceX or SourceY is - not zero then Delta must be set to the length in bytes of a row in the - BltBuffer. - EfiUgaVideoToVideo: - Copy from the video display rectangle - (SourceX, SourceY) (SourceX + Width, SourceY + Height) . - to the video display rectangle (DestinationX, DestinationY) - (DestinationX + Width, DestinationY + Height). - The BltBuffer and Delta are not used in this mode. - - @param This Protocol instance pointer. - @param BltBuffer Buffer containing data to blit into video buffer. This - buffer has a size of Width*Height*sizeof(EFI_UGA_PIXEL) - @param BltOperation Operation to perform on BlitBuffer and video memory - @param SourceX X coordinate of source for the BltBuffer. - @param SourceY Y coordinate of source for the BltBuffer. - @param DestinationX X coordinate of destination for the BltBuffer. - @param DestinationY Y coordinate of destination for the BltBuffer. - @param Width Width of rectangle in BltBuffer in pixels. - @param Height Hight of rectangle in BltBuffer in pixels. - @param Delta OPTIONAL - - @retval EFI_SUCCESS The Blt operation completed. - @retval EFI_INVALID_PARAMETER BltOperation is not valid. - @retval EFI_DEVICE_ERROR A hardware error occurred writting to the video buffer. - -**/ -EFI_STATUS -EFIAPI -ConSplitterUgaDrawBlt ( - IN EFI_UGA_DRAW_PROTOCOL *This, - IN EFI_UGA_PIXEL *BltBuffer OPTIONAL, - IN EFI_UGA_BLT_OPERATION BltOperation, - IN UINTN SourceX, - IN UINTN SourceY, - IN UINTN DestinationX, - IN UINTN DestinationY, - IN UINTN Width, - IN UINTN Height, - IN UINTN Delta OPTIONAL - ); - /** Sets the output device(s) to a specified mode. diff --git a/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf b/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf index 9aa1dade752a..156757aee653 100644 --- a/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf +++ b/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf @@ -3,12 +3,9 @@ # # This driver acts as a virtual console, takes over the console I/O control from selected # standard console devices, and transmits console I/O to related console device drivers. -# Consplitter could install Graphics Output protocol and/or UGA Draw protocol in system -# table according PCD settings(PcdConOutGopSupport, and PcdConOutUgaSupport). It always -# consumes Graphics Output protocol which is produced by display device, and consumes UGA Draw -# protocol which is produced by display device according to PcdUgaConsumeSupport value. -# Note: If only UGA Draw protocol is installed in system, PcdUgaConsumeSupport should be -# set to TRUE. +# Consplitter could install Graphics Output protocol in system +# table according PCD settings(PcdConOutGopSupport). It always +# consumes Graphics Output protocol which is produced by display device # # Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
# @@ -92,14 +89,9 @@ ## SOMETIMES_PRODUCES ## SOMETIMES_CONSUMES gEfiGraphicsOutputProtocolGuid - ## SOMETIMES_PRODUCES - ## SOMETIMES_CONSUMES - gEfiUgaDrawProtocolGuid [FeaturePcd] gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport ## CONSUMES - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport ## CONSUMES - gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport ## CONSUMES [Pcd] ## SOMETIMES_PRODUCES diff --git a/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.uni b/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.uni index 13c25b2a4ffc..903c505e303c 100644 --- a/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.uni +++ b/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.uni @@ -3,12 +3,9 @@ // // This driver acts as a virtual console, takes over the console I/O control from selected // standard console devices, and transmits console I/O to related console device drivers. -// Consplitter could install Graphics Output protocol and/or UGA Draw protocol in system -// table according PCD settings(PcdConOutGopSupport, and PcdConOutUgaSupport). It always -// consumes Graphics Output protocol which is produced by display device, and consumes UGA Draw -// protocol which is produced by display device according to PcdUgaConsumeSupport value. -// Note: If only UGA Draw protocol is installed in system, PcdUgaConsumeSupport should be -// set to TRUE. +// Consplitter could install Graphics Output protocol in system +// table according PCD settings(PcdConOutGopSupport). It always +// consumes Graphics Output protocol which is produced by display device // // Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
// @@ -19,5 +16,5 @@ #string STR_MODULE_ABSTRACT #language en-US "Provides multi console support" -#string STR_MODULE_DESCRIPTION #language en-US "This driver acts as a virtual console, takes over the console I/O control from selected standard console devices, and transmits console I/O to related console device drivers. Consplitter could install Graphics Output protocol and/or UGA Draw protocol in system table according PCD settings(PcdConOutGopSupport, and PcdConOutUgaSupport). It always consumes Graphics Output protocol, which is produced by display device, and consumes UGA Draw protocol, which is produced by display device according to PcdUgaConsumeSupport value. Note: If only UGA Draw protocol is installed in system, PcdUgaConsumeSupport should be set to TRUE." +#string STR_MODULE_DESCRIPTION #language en-US "This driver acts as a virtual console, takes over the console I/O control from selected standard console devices, and transmits console I/O to related console device drivers. Consplitter could install Graphics Output protocol in system table according PCD settings(PcdConOutGopSupport). It always consumes Graphics Output protocol, which is produced by display device." diff --git a/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterGraphics.c b/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterGraphics.c index 64ad567a6d7d..8353f0b4161d 100644 --- a/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterGraphics.c +++ b/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterGraphics.c @@ -117,7 +117,6 @@ ConSplitterGraphicsOutputSetMode ( UINTN NumberIndex; UINTN SizeOfInfo; EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; if (ModeNumber >= This->Mode->MaxMode) { return EFI_UNSUPPORTED; @@ -157,20 +156,6 @@ ConSplitterGraphicsOutputSetMode ( if (EFI_ERROR (Status)) { ReturnStatus = Status; } - } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { - UgaDraw = Private->TextOutList[Index].UgaDraw; - if (UgaDraw != NULL) { - Status = UgaDraw->SetMode ( - UgaDraw, - Mode->HorizontalResolution, - Mode->VerticalResolution, - 32, - 60 - ); - if (EFI_ERROR (Status)) { - ReturnStatus = Status; - } - } } } @@ -261,7 +246,6 @@ ConSplitterGraphicsOutputBlt ( TEXT_OUT_SPLITTER_PRIVATE_DATA *Private; UINTN Index; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; if ((This == NULL) || (((UINTN)BltOperation) >= EfiGraphicsOutputBltOperationMax)) { return EFI_INVALID_PARAMETER; @@ -298,298 +282,6 @@ ConSplitterGraphicsOutputBlt ( return EFI_SUCCESS; } } - - UgaDraw = Private->TextOutList[Index].UgaDraw; - if ((UgaDraw != NULL) && FeaturePcdGet (PcdUgaConsumeSupport)) { - Status = UgaDraw->Blt ( - UgaDraw, - (EFI_UGA_PIXEL *)BltBuffer, - (EFI_UGA_BLT_OPERATION)BltOperation, - SourceX, - SourceY, - DestinationX, - DestinationY, - Width, - Height, - Delta - ); - if (EFI_ERROR (Status)) { - ReturnStatus = Status; - } else if (BltOperation == EfiBltVideoToBltBuffer) { - // - // Only need to read the data into buffer one time - // - return EFI_SUCCESS; - } - } - } - - return ReturnStatus; -} - -/** - Return the current video mode information. - - @param This The EFI_UGA_DRAW_PROTOCOL instance. - @param HorizontalResolution The size of video screen in pixels in the X dimension. - @param VerticalResolution The size of video screen in pixels in the Y dimension. - @param ColorDepth Number of bits per pixel, currently defined to be 32. - @param RefreshRate The refresh rate of the monitor in Hertz. - - @retval EFI_SUCCESS Mode information returned. - @retval EFI_NOT_STARTED Video display is not initialized. Call SetMode () - @retval EFI_INVALID_PARAMETER One of the input args was NULL. - -**/ -EFI_STATUS -EFIAPI -ConSplitterUgaDrawGetMode ( - IN EFI_UGA_DRAW_PROTOCOL *This, - OUT UINT32 *HorizontalResolution, - OUT UINT32 *VerticalResolution, - OUT UINT32 *ColorDepth, - OUT UINT32 *RefreshRate - ) -{ - TEXT_OUT_SPLITTER_PRIVATE_DATA *Private; - - if ((HorizontalResolution == NULL) || - (VerticalResolution == NULL) || - (RefreshRate == NULL) || - (ColorDepth == NULL)) - { - return EFI_INVALID_PARAMETER; - } - - // - // retrieve private data - // - Private = UGA_DRAW_SPLITTER_PRIVATE_DATA_FROM_THIS (This); - - *HorizontalResolution = Private->UgaHorizontalResolution; - *VerticalResolution = Private->UgaVerticalResolution; - *ColorDepth = Private->UgaColorDepth; - *RefreshRate = Private->UgaRefreshRate; - - return EFI_SUCCESS; -} - -/** - Set the current video mode information. - - @param This The EFI_UGA_DRAW_PROTOCOL instance. - @param HorizontalResolution The size of video screen in pixels in the X dimension. - @param VerticalResolution The size of video screen in pixels in the Y dimension. - @param ColorDepth Number of bits per pixel, currently defined to be 32. - @param RefreshRate The refresh rate of the monitor in Hertz. - - @retval EFI_SUCCESS Mode information returned. - @retval EFI_NOT_STARTED Video display is not initialized. Call SetMode () - @retval EFI_OUT_OF_RESOURCES Out of resources. - -**/ -EFI_STATUS -EFIAPI -ConSplitterUgaDrawSetMode ( - IN EFI_UGA_DRAW_PROTOCOL *This, - IN UINT32 HorizontalResolution, - IN UINT32 VerticalResolution, - IN UINT32 ColorDepth, - IN UINT32 RefreshRate - ) -{ - EFI_STATUS Status; - TEXT_OUT_SPLITTER_PRIVATE_DATA *Private; - UINTN Index; - EFI_STATUS ReturnStatus; - EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - UINTN NumberIndex; - UINTN SizeOfInfo; - EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; - - Private = UGA_DRAW_SPLITTER_PRIVATE_DATA_FROM_THIS (This); - - ReturnStatus = EFI_SUCCESS; - - // - // Update the Mode data - // - Private->UgaHorizontalResolution = HorizontalResolution; - Private->UgaVerticalResolution = VerticalResolution; - Private->UgaColorDepth = ColorDepth; - Private->UgaRefreshRate = RefreshRate; - - // - // return the worst status met - // - for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) { - GraphicsOutput = Private->TextOutList[Index].GraphicsOutput; - if (GraphicsOutput != NULL) { - // - // Find corresponding ModeNumber of this GraphicsOutput instance - // - for (NumberIndex = 0; NumberIndex < GraphicsOutput->Mode->MaxMode; NumberIndex++) { - Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32)NumberIndex, &SizeOfInfo, &Info); - if (EFI_ERROR (Status)) { - return Status; - } - - if ((Info->HorizontalResolution == HorizontalResolution) && (Info->VerticalResolution == VerticalResolution)) { - FreePool (Info); - break; - } - - FreePool (Info); - } - - Status = GraphicsOutput->SetMode (GraphicsOutput, (UINT32)NumberIndex); - if (EFI_ERROR (Status)) { - ReturnStatus = Status; - } - } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { - UgaDraw = Private->TextOutList[Index].UgaDraw; - if (UgaDraw != NULL) { - Status = UgaDraw->SetMode ( - UgaDraw, - HorizontalResolution, - VerticalResolution, - ColorDepth, - RefreshRate - ); - if (EFI_ERROR (Status)) { - ReturnStatus = Status; - } - } - } - } - - return ReturnStatus; -} - -/** - Blt a rectangle of pixels on the graphics screen. - - The following table defines actions for BltOperations. - - EfiUgaVideoFill: - Write data from the BltBuffer pixel (SourceX, SourceY) - directly to every pixel of the video display rectangle - (DestinationX, DestinationY) - (DestinationX + Width, DestinationY + Height). - Only one pixel will be used from the BltBuffer. Delta is NOT used. - EfiUgaVideoToBltBuffer: - Read data from the video display rectangle - (SourceX, SourceY) (SourceX + Width, SourceY + Height) and place it in - the BltBuffer rectangle (DestinationX, DestinationY ) - (DestinationX + Width, DestinationY + Height). If DestinationX or - DestinationY is not zero then Delta must be set to the length in bytes - of a row in the BltBuffer. - EfiUgaBltBufferToVideo: - Write data from the BltBuffer rectangle - (SourceX, SourceY) (SourceX + Width, SourceY + Height) directly to the - video display rectangle (DestinationX, DestinationY) - (DestinationX + Width, DestinationY + Height). If SourceX or SourceY is - not zero then Delta must be set to the length in bytes of a row in the - BltBuffer. - EfiUgaVideoToVideo: - Copy from the video display rectangle - (SourceX, SourceY) (SourceX + Width, SourceY + Height) . - to the video display rectangle (DestinationX, DestinationY) - (DestinationX + Width, DestinationY + Height). - The BltBuffer and Delta are not used in this mode. - - @param This Protocol instance pointer. - @param BltBuffer Buffer containing data to blit into video buffer. This - buffer has a size of Width*Height*sizeof(EFI_UGA_PIXEL) - @param BltOperation Operation to perform on BlitBuffer and video memory - @param SourceX X coordinate of source for the BltBuffer. - @param SourceY Y coordinate of source for the BltBuffer. - @param DestinationX X coordinate of destination for the BltBuffer. - @param DestinationY Y coordinate of destination for the BltBuffer. - @param Width Width of rectangle in BltBuffer in pixels. - @param Height Hight of rectangle in BltBuffer in pixels. - @param Delta OPTIONAL - - @retval EFI_SUCCESS The Blt operation completed. - @retval EFI_INVALID_PARAMETER BltOperation is not valid. - @retval EFI_DEVICE_ERROR A hardware error occurred writting to the video buffer. - -**/ -EFI_STATUS -EFIAPI -ConSplitterUgaDrawBlt ( - IN EFI_UGA_DRAW_PROTOCOL *This, - IN EFI_UGA_PIXEL *BltBuffer OPTIONAL, - IN EFI_UGA_BLT_OPERATION BltOperation, - IN UINTN SourceX, - IN UINTN SourceY, - IN UINTN DestinationX, - IN UINTN DestinationY, - IN UINTN Width, - IN UINTN Height, - IN UINTN Delta OPTIONAL - ) -{ - EFI_STATUS Status; - TEXT_OUT_SPLITTER_PRIVATE_DATA *Private; - UINTN Index; - EFI_STATUS ReturnStatus; - EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - - Private = UGA_DRAW_SPLITTER_PRIVATE_DATA_FROM_THIS (This); - - ReturnStatus = EFI_SUCCESS; - // - // return the worst status met - // - for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) { - GraphicsOutput = Private->TextOutList[Index].GraphicsOutput; - if (GraphicsOutput != NULL) { - Status = GraphicsOutput->Blt ( - GraphicsOutput, - (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)BltBuffer, - (EFI_GRAPHICS_OUTPUT_BLT_OPERATION)BltOperation, - SourceX, - SourceY, - DestinationX, - DestinationY, - Width, - Height, - Delta - ); - if (EFI_ERROR (Status)) { - ReturnStatus = Status; - } else if (BltOperation == EfiUgaVideoToBltBuffer) { - // - // Only need to read the data into buffer one time - // - return EFI_SUCCESS; - } - } - - if ((Private->TextOutList[Index].UgaDraw != NULL) && FeaturePcdGet (PcdUgaConsumeSupport)) { - Status = Private->TextOutList[Index].UgaDraw->Blt ( - Private->TextOutList[Index].UgaDraw, - BltBuffer, - BltOperation, - SourceX, - SourceY, - DestinationX, - DestinationY, - Width, - Height, - Delta - ); - if (EFI_ERROR (Status)) { - ReturnStatus = Status; - } else if (BltOperation == EfiUgaVideoToBltBuffer) { - // - // Only need to read the data into buffer one time - // - return EFI_SUCCESS; - } - } } return ReturnStatus; From 4315b1922e386b507ff525a39d97ca4f12d070fc Mon Sep 17 00:00:00 2001 From: GuoMinJ Date: Mon, 16 Jun 2025 10:39:47 +0200 Subject: [PATCH 0207/1172] MdeModulePkg/GraphicsConsoleDxe UGA The Universal Graphics Adapter (UGA) is a graphic abstraction. The UGA I/O and Draw protocols are deprecated since UEFI 2.0 was introduced. Cf. the UEFI spec v2.9: "Appendix L - EFI 1.10 Protocol Changes and Deprecation List" section L.2 "Deprecated Protocols" Remove the UGA support. Signed-off-by: GuoMinJ Signed-off-by: Pierre Gondois --- .../GraphicsConsoleDxe/GraphicsConsole.c | 300 +----------------- .../GraphicsConsoleDxe/GraphicsConsole.h | 19 +- .../GraphicsConsoleDxe/GraphicsConsoleDxe.inf | 6 +- .../GraphicsConsoleDxe/GraphicsConsoleDxe.uni | 4 +- 4 files changed, 18 insertions(+), 311 deletions(-) diff --git a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c index b895dafedeaa..facb813276cd 100644 --- a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c +++ b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c @@ -14,7 +14,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent GRAPHICS_CONSOLE_DEV mGraphicsConsoleDevTemplate = { GRAPHICS_CONSOLE_DEV_SIGNATURE, (EFI_GRAPHICS_OUTPUT_PROTOCOL *)NULL, - (EFI_UGA_DRAW_PROTOCOL *)NULL, { GraphicsConsoleConOutReset, GraphicsConsoleConOutOutputString, @@ -104,9 +103,8 @@ EFI_DRIVER_BINDING_PROTOCOL gGraphicsConsoleDriverBinding = { /** Test to see if Graphics Console could be supported on the Controller. - Graphics Console could be supported if Graphics Output Protocol or UGA Draw - Protocol exists on the Controller. (UGA Draw Protocol could be skipped - if PcdUgaConsumeSupport is set to FALSE.) + Graphics Console could be supported if Graphics Output Protocol + exists on the Controller. @param This Protocol instance pointer. @param Controller Handle of device to test. @@ -127,11 +125,9 @@ GraphicsConsoleControllerDriverSupported ( { EFI_STATUS Status; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; EFI_DEVICE_PATH_PROTOCOL *DevicePath; GraphicsOutput = NULL; - UgaDraw = NULL; // // Open the IO Abstraction(s) needed to perform the supported test // @@ -143,21 +139,6 @@ GraphicsConsoleControllerDriverSupported ( Controller, EFI_OPEN_PROTOCOL_BY_DRIVER ); - - if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) { - // - // Open Graphics Output Protocol failed, try to open UGA Draw Protocol - // - Status = gBS->OpenProtocol ( - Controller, - &gEfiUgaDrawProtocolGuid, - (VOID **)&UgaDraw, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - } - if (EFI_ERROR (Status)) { return Status; } @@ -202,13 +183,6 @@ GraphicsConsoleControllerDriverSupported ( This->DriverBindingHandle, Controller ); - } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { - gBS->CloseProtocol ( - Controller, - &gEfiUgaDrawProtocolGuid, - This->DriverBindingHandle, - Controller - ); } return Status; @@ -369,9 +343,8 @@ InitializeGraphicsConsoleTextMode ( } /** - Start this driver on Controller by opening Graphics Output protocol or - UGA Draw protocol, and installing Simple Text Out protocol on Controller. - (UGA Draw protocol could be skipped if PcdUgaConsumeSupport is set to FALSE.) + Start this driver on Controller by opening Graphics Output protocol + and installing Simple Text Out protocol on Controller. @param This Protocol instance pointer. @param Controller Handle of device to bind driver to @@ -394,8 +367,6 @@ GraphicsConsoleControllerDriverStart ( GRAPHICS_CONSOLE_DEV *Private; UINT32 HorizontalResolution; UINT32 VerticalResolution; - UINT32 ColorDepth; - UINT32 RefreshRate; UINT32 ModeIndex; UINTN MaxMode; UINT32 ModeNumber; @@ -432,18 +403,6 @@ GraphicsConsoleControllerDriverStart ( Controller, EFI_OPEN_PROTOCOL_BY_DRIVER ); - - if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) { - Status = gBS->OpenProtocol ( - Controller, - &gEfiUgaDrawProtocolGuid, - (VOID **)&Private->UgaDraw, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - } - if (EFI_ERROR (Status)) { goto Error; } @@ -534,43 +493,6 @@ GraphicsConsoleControllerDriverStart ( goto Error; } } - } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { - // - // At first try to set user-defined resolution - // - ColorDepth = 32; - RefreshRate = 60; - Status = Private->UgaDraw->SetMode ( - Private->UgaDraw, - HorizontalResolution, - VerticalResolution, - ColorDepth, - RefreshRate - ); - if (EFI_ERROR (Status)) { - // - // Try to set 800*600 which is required by UEFI/EFI spec - // - Status = Private->UgaDraw->SetMode ( - Private->UgaDraw, - 800, - 600, - ColorDepth, - RefreshRate - ); - if (EFI_ERROR (Status)) { - Status = Private->UgaDraw->GetMode ( - Private->UgaDraw, - &HorizontalResolution, - &VerticalResolution, - &ColorDepth, - &RefreshRate - ); - if (EFI_ERROR (Status)) { - goto Error; - } - } - } } DEBUG ((DEBUG_INFO, "GraphicsConsole video resolution %d x %d\n", HorizontalResolution, VerticalResolution)); @@ -638,7 +560,7 @@ GraphicsConsoleControllerDriverStart ( Error: if (EFI_ERROR (Status)) { // - // Close the GOP and UGA Draw Protocol + // Close the GOP // if (Private->GraphicsOutput != NULL) { gBS->CloseProtocol ( @@ -647,13 +569,6 @@ GraphicsConsoleControllerDriverStart ( This->DriverBindingHandle, Controller ); - } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { - gBS->CloseProtocol ( - Controller, - &gEfiUgaDrawProtocolGuid, - This->DriverBindingHandle, - Controller - ); } if (Private->LineBuffer != NULL) { @@ -675,9 +590,7 @@ GraphicsConsoleControllerDriverStart ( /** Stop this driver on Controller by removing Simple Text Out protocol - and closing the Graphics Output Protocol or UGA Draw protocol on Controller. - (UGA Draw protocol could be skipped if PcdUgaConsumeSupport is set to FALSE.) - + and closing the Graphics Output Protocol on Controller. @param This Protocol instance pointer. @param Controller Handle of device to stop driver on @@ -726,7 +639,7 @@ GraphicsConsoleControllerDriverStop ( if (!EFI_ERROR (Status)) { // - // Close the GOP or UGA IO Protocol + // Close the GOP Protocol // if (Private->GraphicsOutput != NULL) { gBS->CloseProtocol ( @@ -735,13 +648,6 @@ GraphicsConsoleControllerDriverStop ( This->DriverBindingHandle, Controller ); - } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { - gBS->CloseProtocol ( - Controller, - &gEfiUgaDrawProtocolGuid, - This->DriverBindingHandle, - Controller - ); } if (Private->LineBuffer != NULL) { @@ -933,7 +839,6 @@ GraphicsConsoleConOutOutputString ( { GRAPHICS_CONSOLE_DEV *Private; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; INTN Mode; UINTN MaxColumn; UINTN MaxRow; @@ -967,7 +872,6 @@ GraphicsConsoleConOutOutputString ( Mode = This->Mode->Mode; Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This); GraphicsOutput = Private->GraphicsOutput; - UgaDraw = Private->UgaDraw; MaxColumn = Private->ModeData[Mode].Columns; MaxRow = Private->ModeData[Mode].Rows; @@ -1055,38 +959,6 @@ GraphicsConsoleConOutOutputString ( EFI_GLYPH_HEIGHT, Delta ); - } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { - // - // Scroll Screen Up One Row - // - UgaDraw->Blt ( - UgaDraw, - NULL, - EfiUgaVideoToVideo, - DeltaX, - DeltaY + EFI_GLYPH_HEIGHT, - DeltaX, - DeltaY, - Width, - Height, - Delta - ); - - // - // Print Blank Line at last line - // - UgaDraw->Blt ( - UgaDraw, - (EFI_UGA_PIXEL *)(UINTN)&Background, - EfiUgaVideoFill, - 0, - 0, - DeltaX, - DeltaY + Height, - Width, - EFI_GLYPH_HEIGHT, - Delta - ); } } else { This->Mode->CursorRow++; @@ -1320,19 +1192,13 @@ GraphicsConsoleConOutSetMode ( GRAPHICS_CONSOLE_DEV *Private; GRAPHICS_CONSOLE_MODE_DATA *ModeData; EFI_GRAPHICS_OUTPUT_BLT_PIXEL *NewLineBuffer; - UINT32 HorizontalResolution; - UINT32 VerticalResolution; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; - UINT32 ColorDepth; - UINT32 RefreshRate; EFI_TPL OldTpl; OldTpl = gBS->RaiseTPL (TPL_NOTIFY); Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This); GraphicsOutput = Private->GraphicsOutput; - UgaDraw = Private->UgaDraw; // // Make sure the requested mode number is supported @@ -1366,7 +1232,7 @@ GraphicsConsoleConOutSetMode ( } // - // Otherwise, the size of the text console and/or the GOP/UGA mode will be changed, + // Otherwise, the size of the text console and/or the GOP mode will be changed, // so erase the cursor, and free the LineBuffer for the current mode // FlushCursor (This); @@ -1422,51 +1288,6 @@ GraphicsConsoleConOutSetMode ( 0 ); } - } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { - // - // Get the current UGA Draw mode information - // - Status = UgaDraw->GetMode ( - UgaDraw, - &HorizontalResolution, - &VerticalResolution, - &ColorDepth, - &RefreshRate - ); - if (EFI_ERROR (Status) || (HorizontalResolution != ModeData->GopWidth) || (VerticalResolution != ModeData->GopHeight)) { - // - // Either no graphics mode is currently set, or it is set to the wrong resolution, so set the new graphics mode - // - Status = UgaDraw->SetMode ( - UgaDraw, - ModeData->GopWidth, - ModeData->GopHeight, - 32, - 60 - ); - if (EFI_ERROR (Status)) { - // - // The mode set operation failed - // - goto Done; - } - } else { - // - // The current graphics mode is correct, so simply clear the entire display - // - Status = UgaDraw->Blt ( - UgaDraw, - (EFI_UGA_PIXEL *)(UINTN)&mGraphicsEfiColors[0], - EfiUgaVideoFill, - 0, - 0, - 0, - 0, - ModeData->GopWidth, - ModeData->GopHeight, - 0 - ); - } } // @@ -1558,7 +1379,6 @@ GraphicsConsoleConOutClearScreen ( GRAPHICS_CONSOLE_DEV *Private; GRAPHICS_CONSOLE_MODE_DATA *ModeData; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground; EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background; EFI_TPL OldTpl; @@ -1574,7 +1394,6 @@ GraphicsConsoleConOutClearScreen ( Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This); GraphicsOutput = Private->GraphicsOutput; - UgaDraw = Private->UgaDraw; ModeData = &(Private->ModeData[This->Mode->Mode]); GetTextColors (This, &Foreground, &Background); @@ -1591,19 +1410,6 @@ GraphicsConsoleConOutClearScreen ( ModeData->GopHeight, 0 ); - } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { - Status = UgaDraw->Blt ( - UgaDraw, - (EFI_UGA_PIXEL *)(UINTN)&Background, - EfiUgaVideoFill, - 0, - 0, - 0, - 0, - ModeData->GopWidth, - ModeData->GopHeight, - 0 - ); } else { Status = EFI_UNSUPPORTED; } @@ -1764,7 +1570,7 @@ GetTextColors ( @param Count The count of Unicode string. @retval EFI_OUT_OF_RESOURCES If no memory resource to use. - @retval EFI_UNSUPPORTED If no Graphics Output protocol and UGA Draw + @retval EFI_UNSUPPORTED If no Graphics Output protocol protocol exist. @retval EFI_SUCCESS Drawing Unicode string implemented successfully. @@ -1781,9 +1587,6 @@ DrawUnicodeWeightAtCursorN ( EFI_IMAGE_OUTPUT *Blt; EFI_STRING String; EFI_FONT_DISPLAY_INFO *FontInfo; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; - EFI_HII_ROW_INFO *RowInfoArray; - UINTN RowInfoArraySize; Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This); Blt = (EFI_IMAGE_OUTPUT *)AllocateZeroPool (sizeof (EFI_IMAGE_OUTPUT)); @@ -1835,63 +1638,6 @@ DrawUnicodeWeightAtCursorN ( NULL, NULL ); - } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { - // - // If Graphics Output protocol cannot be found and PcdUgaConsumeSupport enabled, - // using UGA Draw protocol to draw. - // - ASSERT (Private->UgaDraw != NULL); - - UgaDraw = Private->UgaDraw; - - Blt->Image.Bitmap = AllocateZeroPool (Blt->Width * Blt->Height * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); - if (Blt->Image.Bitmap == NULL) { - FreePool (Blt); - FreePool (String); - return EFI_OUT_OF_RESOURCES; - } - - RowInfoArray = NULL; - // - // StringToImage only support blt'ing image to device using GOP protocol. If GOP is not supported in this platform, - // we ask StringToImage to print the string to blt buffer, then blt to device using UgaDraw. - // - Status = mHiiFont->StringToImage ( - mHiiFont, - EFI_HII_IGNORE_IF_NO_GLYPH | EFI_HII_IGNORE_LINE_BREAK, - String, - FontInfo, - &Blt, - This->Mode->CursorColumn * EFI_GLYPH_WIDTH + Private->ModeData[This->Mode->Mode].DeltaX, - This->Mode->CursorRow * EFI_GLYPH_HEIGHT + Private->ModeData[This->Mode->Mode].DeltaY, - &RowInfoArray, - &RowInfoArraySize, - NULL - ); - - if (!EFI_ERROR (Status)) { - // - // Line breaks are handled by caller of DrawUnicodeWeightAtCursorN, so the updated parameter RowInfoArraySize by StringToImage will - // always be 1 or 0 (if there is no valid Unicode Char can be printed). ASSERT here to make sure. - // - ASSERT (RowInfoArraySize <= 1); - - Status = UgaDraw->Blt ( - UgaDraw, - (EFI_UGA_PIXEL *)Blt->Image.Bitmap, - EfiUgaBltBufferToVideo, - This->Mode->CursorColumn * EFI_GLYPH_WIDTH + Private->ModeData[This->Mode->Mode].DeltaX, - (This->Mode->CursorRow) * EFI_GLYPH_HEIGHT + Private->ModeData[This->Mode->Mode].DeltaY, - This->Mode->CursorColumn * EFI_GLYPH_WIDTH + Private->ModeData[This->Mode->Mode].DeltaX, - (This->Mode->CursorRow) * EFI_GLYPH_HEIGHT + Private->ModeData[This->Mode->Mode].DeltaY, - RowInfoArray[0].LineWidth, - RowInfoArray[0].LineHeight, - Blt->Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) - ); - } - - FreePool (RowInfoArray); - FreePool (Blt->Image.Bitmap); } else { Status = EFI_UNSUPPORTED; } @@ -1934,7 +1680,6 @@ FlushCursor ( INTN GlyphX; INTN GlyphY; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Foreground; EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Background; EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION BltChar[EFI_GLYPH_HEIGHT][EFI_GLYPH_WIDTH]; @@ -1949,7 +1694,6 @@ FlushCursor ( Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This); GraphicsOutput = Private->GraphicsOutput; - UgaDraw = Private->UgaDraw; // // In this driver, only narrow character was supported. @@ -1972,19 +1716,6 @@ FlushCursor ( EFI_GLYPH_HEIGHT, EFI_GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) ); - } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { - UgaDraw->Blt ( - UgaDraw, - (EFI_UGA_PIXEL *)(UINTN)BltChar, - EfiUgaVideoToBltBuffer, - GlyphX, - GlyphY, - 0, - 0, - EFI_GLYPH_WIDTH, - EFI_GLYPH_HEIGHT, - EFI_GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL) - ); } GetTextColors (This, &Foreground.Pixel, &Background.Pixel); @@ -2013,19 +1744,6 @@ FlushCursor ( EFI_GLYPH_HEIGHT, EFI_GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) ); - } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { - UgaDraw->Blt ( - UgaDraw, - (EFI_UGA_PIXEL *)(UINTN)BltChar, - EfiUgaBltBufferToVideo, - 0, - 0, - GlyphX, - GlyphY, - EFI_GLYPH_WIDTH, - EFI_GLYPH_HEIGHT, - EFI_GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL) - ); } return EFI_SUCCESS; diff --git a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.h b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.h index e4abad40f49a..e1a6b37d7652 100644 --- a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.h +++ b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.h @@ -12,7 +12,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include -#include #include #include #include @@ -59,7 +58,6 @@ typedef struct { typedef struct { UINTN Signature; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL SimpleTextOutput; EFI_SIMPLE_TEXT_OUTPUT_MODE SimpleTextOutputMode; GRAPHICS_CONSOLE_MODE_DATA *ModeData; @@ -417,9 +415,8 @@ GraphicsConsoleConOutEnableCursor ( /** Test to see if Graphics Console could be supported on the Controller. - Graphics Console could be supported if Graphics Output Protocol or UGADraw - Protocol exists on the Controller. (UGA Draw Protocol could be skipped - if PcdUgaConsumeSupport is set to FALSE.) + Graphics Console could be supported if Graphics Output Protocol + exists on the Controller. @param This Protocol instance pointer. @param Controller Handle of device to test. @@ -439,9 +436,8 @@ GraphicsConsoleControllerDriverSupported ( ); /** - Start this driver on Controller by opening Graphics Output protocol or - UGA Draw protocol, and installing Simple Text Out protocol on Controller. - (UGA Draw protocol could be skipped if PcdUgaConsumeSupport is set to FALSE.) + Start this driver on Controller by opening Graphics Output protocol + and installing Simple Text Out protocol on Controller. @param This Protocol instance pointer. @param Controller Handle of device to bind driver to @@ -462,9 +458,7 @@ GraphicsConsoleControllerDriverStart ( /** Stop this driver on Controller by removing Simple Text Out protocol - and closing the Graphics Output Protocol or UGA Draw protocol on Controller. - (UGA Draw protocol could be skipped if PcdUgaConsumeSupport is set to FALSE.) - + and closing the Graphics Output Protocol on Controller. @param This Protocol instance pointer. @param Controller Handle of device to stop driver on @@ -526,8 +520,7 @@ GetTextColors ( @param Count The count of Unicode string. @retval EFI_OUT_OF_RESOURCES If no memory resource to use. - @retval EFI_UNSUPPORTED If no Graphics Output protocol and UGA Draw - protocol exist. + @retval EFI_UNSUPPORTED If no Graphics Output protocol exist. @retval EFI_SUCCESS Drawing Unicode string implemented successfully. **/ diff --git a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf index bcfd306eee13..975871b76d05 100644 --- a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf +++ b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf @@ -2,7 +2,7 @@ # Console support on graphic devices. # # This driver will install Simple Text Output protocol by consuming Graphices Output -# protocol or UGA Draw protocol on graphic devices. +# protocol on graphic devices. # # Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent @@ -53,15 +53,11 @@ gEfiDevicePathProtocolGuid ## TO_START gEfiSimpleTextOutProtocolGuid ## BY_START gEfiGraphicsOutputProtocolGuid ## TO_START - gEfiUgaDrawProtocolGuid ## TO_START gEfiHiiFontProtocolGuid ## TO_START ## TO_START ## NOTIFY gEfiHiiDatabaseProtocolGuid -[FeaturePcd] - gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport ## CONSUMES - [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution ## SOMETIMES_CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution ## SOMETIMES_CONSUMES diff --git a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.uni b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.uni index aec5d57f9038..45dbb24c8bca 100644 --- a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.uni +++ b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.uni @@ -2,7 +2,7 @@ // Console support on graphic devices. // // This driver will install Simple Text Output protocol by consuming Graphices Output -// protocol or UGA Draw protocol on graphic devices. +// protocol on graphic devices. // // Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
// @@ -14,5 +14,5 @@ #string STR_MODULE_ABSTRACT #language en-US "Console support on graphic devices" #string STR_MODULE_DESCRIPTION #language en-US "This driver will install SimpleTextOutputProtocol by consuming GraphicesOutput\n" - "Protocol or UgaDrawProtocol on graphics devices." + "Protocol on graphics devices." From c7569abdc4e7c589fbfe9e5311d92c82c34ffe1f Mon Sep 17 00:00:00 2001 From: GuoMinJ Date: Thu, 12 Jun 2025 17:30:22 +0200 Subject: [PATCH 0208/1172] MdePkg: Remove UGA support The Universal Graphics Adapter (UGA) is a graphic abstraction. The UGA I/O and Draw protocols are deprecated since UEFI 2.0 was introduced. Cf. the UEFI spec v2.9: "Appendix L - EFI 1.10 Protocol Changes and Deprecation List" section L.2 "Deprecated Protocols" Remove the UGA support. Signed-off-by: GuoMinJ Signed-off-by: Pierre Gondois --- MdePkg/Include/Protocol/UgaDraw.h | 159 ------------------- MdePkg/Include/Protocol/UgaIo.h | 189 ----------------------- MdePkg/Library/UefiLib/UefiLib.inf | 2 - MdePkg/Library/UefiLib/UefiLibInternal.h | 1 - MdePkg/Library/UefiLib/UefiLibPrint.c | 90 ----------- MdePkg/MdePkg.dec | 12 -- MdePkg/MdePkg.dsc | 3 - MdePkg/MdePkg.uni | 6 - 8 files changed, 462 deletions(-) delete mode 100644 MdePkg/Include/Protocol/UgaDraw.h delete mode 100644 MdePkg/Include/Protocol/UgaIo.h diff --git a/MdePkg/Include/Protocol/UgaDraw.h b/MdePkg/Include/Protocol/UgaDraw.h deleted file mode 100644 index 8d33bf873cad..000000000000 --- a/MdePkg/Include/Protocol/UgaDraw.h +++ /dev/null @@ -1,159 +0,0 @@ -/** @file - UGA Draw protocol from the EFI 1.10 specification. - - Abstraction of a very simple graphics device. - - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
- SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#ifndef __UGA_DRAW_H__ -#define __UGA_DRAW_H__ - -#define EFI_UGA_DRAW_PROTOCOL_GUID \ - { \ - 0x982c298b, 0xf4fa, 0x41cb, {0xb8, 0x38, 0x77, 0xaa, 0x68, 0x8f, 0xb8, 0x39 } \ - } - -typedef struct _EFI_UGA_DRAW_PROTOCOL EFI_UGA_DRAW_PROTOCOL; - -/** - Return the current video mode information. - - @param This The EFI_UGA_DRAW_PROTOCOL instance. - @param HorizontalResolution The size of video screen in pixels in the X dimension. - @param VerticalResolution The size of video screen in pixels in the Y dimension. - @param ColorDepth Number of bits per pixel, currently defined to be 32. - @param RefreshRate The refresh rate of the monitor in Hertz. - - @retval EFI_SUCCESS Mode information returned. - @retval EFI_NOT_STARTED Video display is not initialized. Call SetMode () - @retval EFI_INVALID_PARAMETER One of the input args was NULL. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_UGA_DRAW_PROTOCOL_GET_MODE)( - IN EFI_UGA_DRAW_PROTOCOL *This, - OUT UINT32 *HorizontalResolution, - OUT UINT32 *VerticalResolution, - OUT UINT32 *ColorDepth, - OUT UINT32 *RefreshRate - ); - -/** - Set the current video mode information. - - @param This The EFI_UGA_DRAW_PROTOCOL instance. - @param HorizontalResolution The size of video screen in pixels in the X dimension. - @param VerticalResolution The size of video screen in pixels in the Y dimension. - @param ColorDepth Number of bits per pixel, currently defined to be 32. - @param RefreshRate The refresh rate of the monitor in Hertz. - - @retval EFI_SUCCESS Mode information returned. - @retval EFI_NOT_STARTED Video display is not initialized. Call SetMode () - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_UGA_DRAW_PROTOCOL_SET_MODE)( - IN EFI_UGA_DRAW_PROTOCOL *This, - IN UINT32 HorizontalResolution, - IN UINT32 VerticalResolution, - IN UINT32 ColorDepth, - IN UINT32 RefreshRate - ); - -typedef struct { - UINT8 Blue; - UINT8 Green; - UINT8 Red; - UINT8 Reserved; -} EFI_UGA_PIXEL; - -typedef union { - EFI_UGA_PIXEL Pixel; - UINT32 Raw; -} EFI_UGA_PIXEL_UNION; - -/// -/// Enumration value for actions of Blt operations. -/// -typedef enum { - EfiUgaVideoFill, ///< Write data from the BltBuffer pixel (SourceX, SourceY) - ///< directly to every pixel of the video display rectangle - ///< (DestinationX, DestinationY) (DestinationX + Width, DestinationY + Height). - ///< Only one pixel will be used from the BltBuffer. Delta is NOT used. - - EfiUgaVideoToBltBuffer, ///< Read data from the video display rectangle - ///< (SourceX, SourceY) (SourceX + Width, SourceY + Height) and place it in - ///< the BltBuffer rectangle (DestinationX, DestinationY ) - ///< (DestinationX + Width, DestinationY + Height). If DestinationX or - ///< DestinationY is not zero then Delta must be set to the length in bytes - ///< of a row in the BltBuffer. - - EfiUgaBltBufferToVideo, ///< Write data from the BltBuffer rectangle - ///< (SourceX, SourceY) (SourceX + Width, SourceY + Height) directly to the - ///< video display rectangle (DestinationX, DestinationY) - ///< (DestinationX + Width, DestinationY + Height). If SourceX or SourceY is - ///< not zero then Delta must be set to the length in bytes of a row in the - ///< BltBuffer. - - EfiUgaVideoToVideo, ///< Copy from the video display rectangle (SourceX, SourceY) - ///< (SourceX + Width, SourceY + Height) .to the video display rectangle - ///< (DestinationX, DestinationY) (DestinationX + Width, DestinationY + Height). - ///< The BltBuffer and Delta are not used in this mode. - - EfiUgaBltMax ///< Maxmimum value for enumration value of Blt operation. If a Blt operation - ///< larger or equal to this enumration value, it is invalid. -} EFI_UGA_BLT_OPERATION; - -/** - Blt a rectangle of pixels on the graphics screen. - - @param[in] This - Protocol instance pointer. - @param[in] BltBuffer - Buffer containing data to blit into video buffer. This - buffer has a size of Width*Height*sizeof(EFI_UGA_PIXEL) - @param[in] BltOperation - Operation to perform on BlitBuffer and video memory - @param[in] SourceX - X coordinate of source for the BltBuffer. - @param[in] SourceY - Y coordinate of source for the BltBuffer. - @param[in] DestinationX - X coordinate of destination for the BltBuffer. - @param[in] DestinationY - Y coordinate of destination for the BltBuffer. - @param[in] Width - Width of rectangle in BltBuffer in pixels. - @param[in] Height - Hight of rectangle in BltBuffer in pixels. - @param[in] Delta - OPTIONAL - - @retval EFI_SUCCESS - The Blt operation completed. - @retval EFI_INVALID_PARAMETER - BltOperation is not valid. - @retval EFI_DEVICE_ERROR - A hardware error occurred writting to the video buffer. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_UGA_DRAW_PROTOCOL_BLT)( - IN EFI_UGA_DRAW_PROTOCOL *This, - IN EFI_UGA_PIXEL *BltBuffer OPTIONAL, - IN EFI_UGA_BLT_OPERATION BltOperation, - IN UINTN SourceX, - IN UINTN SourceY, - IN UINTN DestinationX, - IN UINTN DestinationY, - IN UINTN Width, - IN UINTN Height, - IN UINTN Delta OPTIONAL - ); - -/// -/// This protocol provides a basic abstraction to set video modes and -/// copy pixels to and from the graphics controller's frame buffer. -/// -struct _EFI_UGA_DRAW_PROTOCOL { - EFI_UGA_DRAW_PROTOCOL_GET_MODE GetMode; - EFI_UGA_DRAW_PROTOCOL_SET_MODE SetMode; - EFI_UGA_DRAW_PROTOCOL_BLT Blt; -}; - -extern EFI_GUID gEfiUgaDrawProtocolGuid; - -#endif diff --git a/MdePkg/Include/Protocol/UgaIo.h b/MdePkg/Include/Protocol/UgaIo.h deleted file mode 100644 index ffc5b3abe9fa..000000000000 --- a/MdePkg/Include/Protocol/UgaIo.h +++ /dev/null @@ -1,189 +0,0 @@ -/** @file - UGA IO protocol from the EFI 1.10 specification. - - Abstraction of a very simple graphics device. - - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
- SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#ifndef __UGA_IO_H__ -#define __UGA_IO_H__ - -#define EFI_UGA_IO_PROTOCOL_GUID \ - { 0x61a4d49e, 0x6f68, 0x4f1b, { 0xb9, 0x22, 0xa8, 0x6e, 0xed, 0xb, 0x7, 0xa2 } } - -typedef struct _EFI_UGA_IO_PROTOCOL EFI_UGA_IO_PROTOCOL; - -typedef UINT32 UGA_STATUS; - -typedef enum { - UgaDtParentBus = 1, - UgaDtGraphicsController, - UgaDtOutputController, - UgaDtOutputPort, - UgaDtOther -} UGA_DEVICE_TYPE, *PUGA_DEVICE_TYPE; - -typedef UINT32 UGA_DEVICE_ID, *PUGA_DEVICE_ID; - -typedef struct { - UGA_DEVICE_TYPE deviceType; - UGA_DEVICE_ID deviceId; - UINT32 ui32DeviceContextSize; - UINT32 ui32SharedContextSize; -} UGA_DEVICE_DATA, *PUGA_DEVICE_DATA; - -typedef struct _UGA_DEVICE { - VOID *pvDeviceContext; - VOID *pvSharedContext; - VOID *pvRunTimeContext; - struct _UGA_DEVICE *pParentDevice; - VOID *pvBusIoServices; - VOID *pvStdIoServices; - UGA_DEVICE_DATA deviceData; -} UGA_DEVICE, *PUGA_DEVICE; - -typedef enum { - UgaIoGetVersion = 1, - UgaIoGetChildDevice, - UgaIoStartDevice, - UgaIoStopDevice, - UgaIoFlushDevice, - UgaIoResetDevice, - UgaIoGetDeviceState, - UgaIoSetDeviceState, - UgaIoSetPowerState, - UgaIoGetMemoryConfiguration, - UgaIoSetVideoMode, - UgaIoCopyRectangle, - UgaIoGetEdidSegment, - UgaIoDeviceChannelOpen, - UgaIoDeviceChannelClose, - UgaIoDeviceChannelRead, - UgaIoDeviceChannelWrite, - UgaIoGetPersistentDataSize, - UgaIoGetPersistentData, - UgaIoSetPersistentData, - UgaIoGetDevicePropertySize, - UgaIoGetDeviceProperty, - UgaIoBtPrivateInterface -} UGA_IO_REQUEST_CODE, *PUGA_IO_REQUEST_CODE; - -typedef struct { - IN UGA_IO_REQUEST_CODE ioRequestCode; - IN VOID *pvInBuffer; - IN UINT64 ui64InBufferSize; - OUT VOID *pvOutBuffer; - IN UINT64 ui64OutBufferSize; - OUT UINT64 ui64BytesReturned; -} UGA_IO_REQUEST, *PUGA_IO_REQUEST; - -/** - Dynamically allocate storage for a child UGA_DEVICE. - - @param[in] This The EFI_UGA_IO_PROTOCOL instance. - @param[in] ParentDevice ParentDevice specifies a pointer to the parent device of Device. - @param[in] DeviceData A pointer to UGA_DEVICE_DATA returned from a call to DispatchService() - with a UGA_DEVICE of Parent and an IoRequest of type UgaIoGetChildDevice. - @param[in] RunTimeContext Context to associate with Device. - @param[out] Device The Device returns a dynamically allocated child UGA_DEVICE object - for ParentDevice. The caller is responsible for deleting Device. - - - @retval EFI_SUCCESS Device was returned. - @retval EFI_INVALID_PARAMETER One of the arguments was not valid. - @retval EFI_DEVICE_ERROR The device had an error and could not complete the request. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_UGA_IO_PROTOCOL_CREATE_DEVICE)( - IN EFI_UGA_IO_PROTOCOL *This, - IN UGA_DEVICE *ParentDevice, - IN UGA_DEVICE_DATA *DeviceData, - IN VOID *RunTimeContext, - OUT UGA_DEVICE **Device - ); - -/** - Delete a dynamically allocated child UGA_DEVICE object that was allocated via CreateDevice(). - - @param[in] This The EFI_UGA_IO_PROTOCOL instance. Type EFI_UGA_IO_PROTOCOL is - defined in Section 10.7. - @param[in] Device The Device points to a UGA_DEVICE object that was dynamically - allocated via a CreateDevice() call. - - - @retval EFI_SUCCESS Device was returned. - @retval EFI_INVALID_PARAMETER The Device was not allocated via CreateDevice(). - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_UGA_IO_PROTOCOL_DELETE_DEVICE)( - IN EFI_UGA_IO_PROTOCOL *This, - IN UGA_DEVICE *Device - ); - -/** - This is the main UGA service dispatch routine for all UGA_IO_REQUEST s. - - @param pDevice pDevice specifies a pointer to a device object associated with a - device enumerated by a pIoRequest->ioRequestCode of type - UgaIoGetChildDevice. The root device for the EFI_UGA_IO_PROTOCOL - is represented by pDevice being set to NULL. - - @param pIoRequest - pIoRequest points to a caller allocated buffer that contains data - defined by pIoRequest->ioRequestCode. See Related Definitions for - a definition of UGA_IO_REQUEST_CODE s and their associated data - structures. - - @return UGA_STATUS - -**/ -typedef UGA_STATUS -(EFIAPI *PUGA_FW_SERVICE_DISPATCH)( - IN PUGA_DEVICE pDevice, - IN OUT PUGA_IO_REQUEST pIoRequest - ); - -/// -/// Provides a basic abstraction to send I/O requests to the graphics device and any of its children. -/// -struct _EFI_UGA_IO_PROTOCOL { - EFI_UGA_IO_PROTOCOL_CREATE_DEVICE CreateDevice; - EFI_UGA_IO_PROTOCOL_DELETE_DEVICE DeleteDevice; - PUGA_FW_SERVICE_DISPATCH DispatchService; -}; - -extern EFI_GUID gEfiUgaIoProtocolGuid; - -// -// Data structure that is stored in the EFI Configuration Table with the -// EFI_UGA_IO_PROTOCOL_GUID. The option ROMs listed in this table may have -// EBC UGA drivers. -// -typedef struct { - UINT32 Version; - UINT32 HeaderSize; - UINT32 SizeOfEntries; - UINT32 NumberOfEntries; -} EFI_DRIVER_OS_HANDOFF_HEADER; - -typedef enum { - EfiUgaDriverFromPciRom, - EfiUgaDriverFromSystem, - EfiDriverHandoffMax -} EFI_DRIVER_HANOFF_ENUM; - -typedef struct { - EFI_DRIVER_HANOFF_ENUM Type; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - VOID *PciRomImage; - UINT64 PciRomSize; -} EFI_DRIVER_OS_HANDOFF; - -#endif diff --git a/MdePkg/Library/UefiLib/UefiLib.inf b/MdePkg/Library/UefiLib/UefiLib.inf index 3aced47d2e3e..8a35276180d4 100644 --- a/MdePkg/Library/UefiLib/UefiLib.inf +++ b/MdePkg/Library/UefiLib/UefiLib.inf @@ -68,7 +68,6 @@ gEfiGraphicsOutputProtocolGuid ## SOMETIMES_CONSUMES gEfiHiiFontProtocolGuid ## SOMETIMES_CONSUMES gEfiSimpleFileSystemProtocolGuid ## SOMETIMES_CONSUMES - gEfiUgaDrawProtocolGuid | gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport ## SOMETIMES_CONSUMES # Consumes if gEfiGraphicsOutputProtocolGuid uninstalled gEfiComponentNameProtocolGuid | NOT gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable ## SOMETIMES_PRODUCES # User chooses to produce it gEfiComponentName2ProtocolGuid | NOT gEfiMdePkgTokenSpaceGuid.PcdComponentName2Disable ## SOMETIMES_PRODUCES # User chooses to produce it gEfiDriverConfigurationProtocolGuid ## SOMETIMES_PRODUCES # User chooses to produce it @@ -85,5 +84,4 @@ gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable ## CONSUMES gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnostics2Disable ## CONSUMES gEfiMdePkgTokenSpaceGuid.PcdComponentName2Disable ## CONSUMES - gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport ## CONSUMES diff --git a/MdePkg/Library/UefiLib/UefiLibInternal.h b/MdePkg/Library/UefiLib/UefiLibInternal.h index 4365282cf213..b98f66e110c9 100644 --- a/MdePkg/Library/UefiLib/UefiLibInternal.h +++ b/MdePkg/Library/UefiLib/UefiLibInternal.h @@ -18,7 +18,6 @@ #include #include #include -#include #include #include diff --git a/MdePkg/Library/UefiLib/UefiLibPrint.c b/MdePkg/Library/UefiLib/UefiLibPrint.c index c2c6cacd55d0..32b17abecc6f 100644 --- a/MdePkg/Library/UefiLib/UefiLibPrint.c +++ b/MdePkg/Library/UefiLib/UefiLibPrint.c @@ -352,20 +352,14 @@ InternalPrintGraphic ( EFI_STATUS Status; UINT32 HorizontalResolution; UINT32 VerticalResolution; - UINT32 ColorDepth; - UINT32 RefreshRate; EFI_HII_FONT_PROTOCOL *HiiFont; EFI_IMAGE_OUTPUT *Blt; EFI_FONT_DISPLAY_INFO FontInfo; EFI_HII_ROW_INFO *RowInfoArray; UINTN RowInfoArraySize; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *Sto; EFI_HANDLE ConsoleHandle; - UINTN Width; - UINTN Height; - UINTN Delta; HorizontalResolution = 0; VerticalResolution = 0; @@ -381,21 +375,6 @@ InternalPrintGraphic ( &gEfiGraphicsOutputProtocolGuid, (VOID **)&GraphicsOutput ); - - UgaDraw = NULL; - if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) { - // - // If no GOP available, try to open UGA Draw protocol if supported. - // - GraphicsOutput = NULL; - - Status = gBS->HandleProtocol ( - ConsoleHandle, - &gEfiUgaDrawProtocolGuid, - (VOID **)&UgaDraw - ); - } - if (EFI_ERROR (Status)) { goto Error; } @@ -413,8 +392,6 @@ InternalPrintGraphic ( if (GraphicsOutput != NULL) { HorizontalResolution = GraphicsOutput->Mode->Info->HorizontalResolution; VerticalResolution = GraphicsOutput->Mode->Info->VerticalResolution; - } else if ((UgaDraw != NULL) && FeaturePcdGet (PcdUgaConsumeSupport)) { - UgaDraw->GetMode (UgaDraw, &HorizontalResolution, &VerticalResolution, &ColorDepth, &RefreshRate); } else { goto Error; } @@ -478,73 +455,6 @@ InternalPrintGraphic ( if (EFI_ERROR (Status)) { goto Error; } - } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { - ASSERT (UgaDraw != NULL); - - // - // Ensure Width * Height * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) doesn't overflow. - // - if (Blt->Width > DivU64x32 (MAX_UINTN, Blt->Height * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL))) { - goto Error; - } - - Blt->Image.Bitmap = AllocateZeroPool ((UINT32)Blt->Width * Blt->Height * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); - ASSERT (Blt->Image.Bitmap != NULL); - - // - // StringToImage only support blt'ing image to device using GOP protocol. If GOP is not supported in this platform, - // we ask StringToImage to print the string to blt buffer, then blt to device using UgaDraw. - // - Status = HiiFont->StringToImage ( - HiiFont, - EFI_HII_IGNORE_IF_NO_GLYPH | EFI_HII_OUT_FLAG_CLIP | - EFI_HII_OUT_FLAG_CLIP_CLEAN_X | EFI_HII_OUT_FLAG_CLIP_CLEAN_Y | - EFI_HII_IGNORE_LINE_BREAK, - Buffer, - &FontInfo, - &Blt, - PointX, - PointY, - &RowInfoArray, - &RowInfoArraySize, - NULL - ); - - if (!EFI_ERROR (Status)) { - ASSERT (RowInfoArray != NULL); - // - // Explicit Line break characters are ignored, so the updated parameter RowInfoArraySize by StringToImage will - // always be 1 or 0 (if there is no valid Unicode Char can be printed). ASSERT here to make sure. - // - ASSERT (RowInfoArraySize <= 1); - - if (RowInfoArraySize != 0) { - Width = RowInfoArray[0].LineWidth; - Height = RowInfoArray[0].LineHeight; - Delta = Blt->Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL); - } else { - Width = 0; - Height = 0; - Delta = 0; - } - - Status = UgaDraw->Blt ( - UgaDraw, - (EFI_UGA_PIXEL *)Blt->Image.Bitmap, - EfiUgaBltBufferToVideo, - PointX, - PointY, - PointX, - PointY, - Width, - Height, - Delta - ); - } else { - goto Error; - } - - FreePool (Blt->Image.Bitmap); } else { goto Error; } diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index 43b0973737a7..c296cfa29bee 100644 --- a/MdePkg/MdePkg.dec +++ b/MdePkg/MdePkg.dec @@ -1582,12 +1582,6 @@ ## Include/Protocol/EdidOverride.h gEfiEdidOverrideProtocolGuid = { 0x48ECB431, 0xFB72, 0x45C0, { 0xA9, 0x22, 0xF4, 0x58, 0xFE, 0x04, 0x0B, 0xD5 }} - ## Include/Protocol/UgaIo.h - gEfiUgaIoProtocolGuid = { 0x61A4D49E, 0x6F68, 0x4F1B, { 0xB9, 0x22, 0xA8, 0x6E, 0xED, 0x0B, 0x07, 0xA2 }} - - ## Include/Protocol/UgaDraw.h - gEfiUgaDrawProtocolGuid = { 0x982C298B, 0xF4FA, 0x41CB, { 0xB8, 0x38, 0x77, 0xAA, 0x68, 0x8F, 0xB8, 0x39 }} - ## Include/Protocol/LoadedImage.h gEfiLoadedImageProtocolGuid = { 0x5B1B31A1, 0x9562, 0x11D2, { 0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B }} @@ -2078,12 +2072,6 @@ # @Prompt Deprecate Global Variable LangCodes. gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLangDeprecate|FALSE|BOOLEAN|0x00000012 - ## Indicates if UGA Draw Protocol is still consumed.

- # TRUE - Consume UGA Draw protocol.
- # FALSE - Does not consume UGA Draw protocol.
- # @Prompt Consume UGA Draw Protocol. - gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport|TRUE|BOOLEAN|0x00000027 - ## Indicates if a check will be made to see if a specified node is a member of linked list # in the following BaseLib functions: GetNextNode(), IsNull(), IsNodeAtEnd(), SwapListEntries().

# TRUE - Verify a specified node is a member of linked list.
diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc index 2abd7b8c3994..066507b5790a 100644 --- a/MdePkg/MdePkg.dsc +++ b/MdePkg/MdePkg.dsc @@ -24,9 +24,6 @@ !include MdePkg/MdeLibs.dsc.inc -[PcdsFeatureFlag] - gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport|TRUE - [PcdsFixedAtBuild] gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x0f gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000000 diff --git a/MdePkg/MdePkg.uni b/MdePkg/MdePkg.uni index 67b79f0270d2..eaf1b9ea0ee3 100644 --- a/MdePkg/MdePkg.uni +++ b/MdePkg/MdePkg.uni @@ -379,12 +379,6 @@ "TRUE - Deprecate global variable LangCodes.
\n" "FALSE - Does not deprecate global variable LangCodes.
" -#string STR_gEfiMdePkgTokenSpaceGuid_PcdUgaConsumeSupport_PROMPT #language en-US "Consume UGA Draw Protocol" - -#string STR_gEfiMdePkgTokenSpaceGuid_PcdUgaConsumeSupport_HELP #language en-US "Indicates if UGA Draw Protocol is still consumed.

\n" - "TRUE - Consume UGA Draw protocol.
\n" - "FALSE - Does not consume UGA Draw protocol.
" - #string STR_gEfiMdePkgTokenSpaceGuid_PcdVerifyNodeInList_PROMPT #language en-US "Verify Node In List" #string STR_gEfiMdePkgTokenSpaceGuid_PcdVerifyNodeInList_HELP #language en-US "Indicates if a check will be made to see if a specified node is a member of linked list in the following BaseLib functions: GetNextNode(), IsNull(), IsNodeAtEnd(), SwapListEntries().

\n" From ea2ef8c3c9c06733e3f046974ed08aa04912e1ce Mon Sep 17 00:00:00 2001 From: GuoMinJ Date: Thu, 12 Jun 2025 16:48:50 +0200 Subject: [PATCH 0209/1172] ShellPkg: Remove UGA support The Universal Graphics Adapter (UGA) is a graphic abstraction. The UGA I/O and Draw protocols are deprecated since UEFI 2.0 was introduced. Cf. the UEFI spec v2.9: "Appendix L - EFI 1.10 Protocol Changes and Deprecation List" section L.2 "Deprecated Protocols" Remove the UGA support. Signed-off-by: GuoMinJ Signed-off-by: Pierre Gondois --- ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c | 2 -- ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h | 2 -- ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf | 2 -- ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.uni | 2 -- 4 files changed, 8 deletions(-) diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c index 51b77838ab20..14f17252e594 100644 --- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c +++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c @@ -2308,8 +2308,6 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = { { STRING_TOKEN (STR_SHELL_ENV2), &gEfiShellEnvironment2Guid, NULL }, { STRING_TOKEN (STR_SHELL_ENV), &gEfiShellEnvironment2Guid, NULL }, { STRING_TOKEN (STR_DEVICE_IO), &gEfiDeviceIoProtocolGuid, NULL }, - { STRING_TOKEN (STR_UGA_DRAW), &gEfiUgaDrawProtocolGuid, NULL }, - { STRING_TOKEN (STR_UGA_IO), &gEfiUgaIoProtocolGuid, NULL }, { STRING_TOKEN (STR_ESP), &gEfiPartTypeSystemPartGuid, NULL }, { STRING_TOKEN (STR_GPT_NBR), &gEfiPartTypeLegacyMbrGuid, NULL }, { STRING_TOKEN (STR_DRIVER_CONFIG), &gEfiDriverConfigurationProtocolGuid, NULL }, diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h index 4c3ed145d492..40eed671fa90 100644 --- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h +++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h @@ -93,8 +93,6 @@ #include #include #include -#include -#include #include #include #include diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf index 6e1ed779fa4c..0cc0ce9f4a25 100644 --- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf +++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf @@ -128,8 +128,6 @@ gEfiHiiConfigAccessProtocolGuid ## UNDEFINED gEfiFormBrowser2ProtocolGuid ## UNDEFINED gEfiDeviceIoProtocolGuid ## UNDEFINED - gEfiUgaDrawProtocolGuid ## UNDEFINED - gEfiUgaIoProtocolGuid ## UNDEFINED gEfiDriverConfigurationProtocolGuid ## UNDEFINED gEfiDriverConfiguration2ProtocolGuid ## UNDEFINED gEfiSimpleTextInputExProtocolGuid ## UNDEFINED diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.uni b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.uni index dcd1b23eb66a..7f5d2a37f9f6 100644 --- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.uni +++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.uni @@ -160,8 +160,6 @@ #string STR_SHELL_ALIAS #language en-US "ShellAlias" #string STR_DEVICE_IO #language en-US "DeviceIO" #string STR_TCP #language en-US "TCP" -#string STR_UGA_DRAW #language en-US "UGADraw" -#string STR_UGA_IO #language en-US "UGAIO" #string STR_ESP #language en-US "EFISystemPartition" #string STR_GPT_NBR #language en-US "LegacyMBR" #string STR_DRIVER_CONFIG #language en-US "DriverConfiguration" From 282d6962e47e6f45f8a90090e4da5342f7692ad2 Mon Sep 17 00:00:00 2001 From: GuoMinJ Date: Thu, 12 Jun 2025 17:25:23 +0200 Subject: [PATCH 0210/1172] OvmfPkg: Remove UGA support The Universal Graphics Adapter (UGA) is a graphic abstraction. The UGA I/O and Draw protocols are deprecated since UEFI 2.0 was introduced. Cf. the UEFI spec v2.9: "Appendix L - EFI 1.10 Protocol Changes and Deprecation List" section L.2 "Deprecated Protocols" Remove the UGA support. Signed-off-by: GuoMinJ Signed-off-by: Pierre Gondois --- OvmfPkg/AmdSev/AmdSevX64.dsc | 1 - OvmfPkg/Bhyve/BhyveRfbDxe/GopScreen.c | 4 ++-- OvmfPkg/Bhyve/BhyveX64.dsc | 1 - OvmfPkg/CloudHv/CloudHvX64.dsc | 1 - OvmfPkg/IntelTdx/IntelTdxX64.dsc | 1 - OvmfPkg/LoongArchVirt/LoongArchVirtQemu.dsc | 1 - OvmfPkg/Microvm/MicrovmX64.dsc | 1 - OvmfPkg/OvmfPkgIa32.dsc | 1 - OvmfPkg/OvmfPkgIa32X64.dsc | 1 - OvmfPkg/OvmfPkgX64.dsc | 1 - OvmfPkg/OvmfXen.dsc | 1 - OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc | 1 - 12 files changed, 2 insertions(+), 13 deletions(-) diff --git a/OvmfPkg/AmdSev/AmdSevX64.dsc b/OvmfPkg/AmdSev/AmdSevX64.dsc index 3592381c5e8e..8e7e69da0085 100644 --- a/OvmfPkg/AmdSev/AmdSevX64.dsc +++ b/OvmfPkg/AmdSev/AmdSevX64.dsc @@ -386,7 +386,6 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE [PcdsFixedAtBuild] diff --git a/OvmfPkg/Bhyve/BhyveRfbDxe/GopScreen.c b/OvmfPkg/Bhyve/BhyveRfbDxe/GopScreen.c index 2fcc1dd56acf..8f498432b5c8 100644 --- a/OvmfPkg/Bhyve/BhyveRfbDxe/GopScreen.c +++ b/OvmfPkg/Bhyve/BhyveRfbDxe/GopScreen.c @@ -13,7 +13,7 @@ Module Name: Abstract: - This file produces the graphics abstration of UGA. It is called by + This file produces the graphics abstration of GOP. It is called by EmuGopDriver.c file which deals with the EFI 1.1 driver model. This file just does graphics. @@ -378,7 +378,7 @@ ShutdownGopEvent ( Routine Description: - This is the UGA screen's callback notification function for exit-boot-services. + This is the GOP screen's callback notification function for exit-boot-services. All we do here is call EmuGopDestructor(). Arguments: diff --git a/OvmfPkg/Bhyve/BhyveX64.dsc b/OvmfPkg/Bhyve/BhyveX64.dsc index c4658634b17d..131f16fa03c0 100644 --- a/OvmfPkg/Bhyve/BhyveX64.dsc +++ b/OvmfPkg/Bhyve/BhyveX64.dsc @@ -432,7 +432,6 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE !if $(SECURE_BOOT_ENABLE) == TRUE gEfiMdeModulePkgTokenSpaceGuid.PcdRequireSelfSignedPk|TRUE diff --git a/OvmfPkg/CloudHv/CloudHvX64.dsc b/OvmfPkg/CloudHv/CloudHvX64.dsc index d6db3ee31467..d941d6d1ac8d 100644 --- a/OvmfPkg/CloudHv/CloudHvX64.dsc +++ b/OvmfPkg/CloudHv/CloudHvX64.dsc @@ -477,7 +477,6 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE !if $(SMM_REQUIRE) == TRUE gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire|TRUE diff --git a/OvmfPkg/IntelTdx/IntelTdxX64.dsc b/OvmfPkg/IntelTdx/IntelTdxX64.dsc index 637dc7dfed11..18fd116311e1 100644 --- a/OvmfPkg/IntelTdx/IntelTdxX64.dsc +++ b/OvmfPkg/IntelTdx/IntelTdxX64.dsc @@ -377,7 +377,6 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE !if $(SECURE_BOOT_ENABLE) == TRUE gUefiOvmfPkgTokenSpaceGuid.PcdSecureBootSupported|TRUE diff --git a/OvmfPkg/LoongArchVirt/LoongArchVirtQemu.dsc b/OvmfPkg/LoongArchVirt/LoongArchVirtQemu.dsc index 3f16e20764ec..df6a6e19571d 100644 --- a/OvmfPkg/LoongArchVirt/LoongArchVirtQemu.dsc +++ b/OvmfPkg/LoongArchVirt/LoongArchVirtQemu.dsc @@ -314,7 +314,6 @@ # gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory | TRUE gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress | TRUE gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport | TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport | FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdPciBusHotplugDeviceSupport | FALSE gUefiOvmfPkgTokenSpaceGuid.PcdQemuBootOrderPciTranslation | TRUE gUefiOvmfPkgTokenSpaceGuid.PcdQemuBootOrderMmioTranslation | TRUE diff --git a/OvmfPkg/Microvm/MicrovmX64.dsc b/OvmfPkg/Microvm/MicrovmX64.dsc index d470ffb256c7..884d5a943259 100644 --- a/OvmfPkg/Microvm/MicrovmX64.dsc +++ b/OvmfPkg/Microvm/MicrovmX64.dsc @@ -470,7 +470,6 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE !if $(SECURE_BOOT_ENABLE) == TRUE gUefiOvmfPkgTokenSpaceGuid.PcdSecureBootSupported|TRUE diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc index 86c1d6ecbaff..550c54d32109 100644 --- a/OvmfPkg/OvmfPkgIa32.dsc +++ b/OvmfPkg/OvmfPkgIa32.dsc @@ -463,7 +463,6 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE !if $(SMM_REQUIRE) == TRUE gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire|TRUE diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc index 836d9ffca731..06fc031ab460 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc @@ -485,7 +485,6 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|TRUE gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE !if $(SMM_REQUIRE) == TRUE gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire|TRUE diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index 20e73588e465..ace2dfcdeba3 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -559,7 +559,6 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE !if $(SMM_REQUIRE) == TRUE gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire|TRUE diff --git a/OvmfPkg/OvmfXen.dsc b/OvmfPkg/OvmfXen.dsc index 1c797e0cbe03..4e99acb80062 100644 --- a/OvmfPkg/OvmfXen.dsc +++ b/OvmfPkg/OvmfXen.dsc @@ -363,7 +363,6 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE [PcdsFixedAtBuild] diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc index 03bdbf40f0ff..b4f24eeed85a 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc +++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc @@ -172,7 +172,6 @@ ## If TRUE, Graphics Output Protocol will be installed on virtual handle created by ConsplitterDxe. # It could be set FALSE to save size. gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdTurnOffUsbLegacySupport|TRUE From 5ea0be305a072d995c11b163f6292d24cf514d0b Mon Sep 17 00:00:00 2001 From: GuoMinJ Date: Thu, 12 Jun 2025 16:47:48 +0200 Subject: [PATCH 0211/1172] UefiPayloadPkg: Remove UGA support The Universal Graphics Adapter (UGA) is a graphic abstraction. The UGA I/O and Draw protocols are deprecated since UEFI 2.0 was introduced. Cf. the UEFI spec v2.9: "Appendix L - EFI 1.10 Protocol Changes and Deprecation List" section L.2 "Deprecated Protocols" Remove the UGA support. Signed-off-by: GuoMinJ Signed-off-by: Pierre Gondois --- .../Library/PlatformBootManagerLib/PlatformBootManager.h | 2 +- .../Library/PlatformBootManagerLib/PlatformBootManagerLib.inf | 2 -- UefiPayloadPkg/UefiPayloadPkg.dsc | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManager.h b/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManager.h index 5614aadafb98..2110997d9bbc 100644 --- a/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManager.h +++ b/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManager.h @@ -98,7 +98,7 @@ PlatformBootManagerEnableQuietBoot ( Use SystemTable Conout to turn on video based Simple Text Out consoles. The Simple Text Out screens will now be synced up with all non video output devices - @retval EFI_SUCCESS UGA devices are back in text mode and synced up. + @retval EFI_SUCCESS Devices are back in text mode and synced up. **/ EFI_STATUS diff --git a/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf b/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf index ff92c952276f..987c73040e58 100644 --- a/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf +++ b/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf @@ -55,7 +55,6 @@ [Protocols] gEfiGenericMemTestProtocolGuid ## CONSUMES gEfiGraphicsOutputProtocolGuid ## CONSUMES - gEfiUgaDrawProtocolGuid ## CONSUMES gEfiBootLogoProtocolGuid ## CONSUMES gEfiDxeSmmReadyToLockProtocolGuid gEfiSmmAccess2ProtocolGuid @@ -64,7 +63,6 @@ [Pcd] gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut - gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow gEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn gEfiMdeModulePkgTokenSpaceGuid.PcdConInConnectOnDemand diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index 6310c5b4389c..34de87f7a501 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -549,7 +549,6 @@ ################################################################################ [PcdsFeatureFlag] gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE ## This PCD specified whether ACPI SDT protocol is installed. gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE gEfiMdeModulePkgTokenSpaceGuid.PcdHiiOsRuntimeSupport|FALSE From 67b744697c0780cce462560ab2d5d1c7fc18ecaf Mon Sep 17 00:00:00 2001 From: Akshay Behl Date: Sun, 8 Jun 2025 22:49:22 +0530 Subject: [PATCH 0212/1172] UefiCpuPkg: TimerLib support to fetch freq from DT On RISC-V platforms, just like other platforms, we need to pass various information from one stage to another (hartid/cmo operations etc). Also there are some settings like Timer freq which are platform dependent which use PCDs. Today hartid is extracted through Firmware Context (custom in mem structure passed from one stage to another). For CMO we have a features HOB. Going forward we would like to have a standard mechanism to pass on such information and DT is handy as it can easily carry all this information (in some cases nodes already exists). This patch implement timebase frequency extraction from DT. Signed-off-by: Akshay Behl Co-authored-by: Dhaval Sharma --- .../BaseRiscV64CpuTimerLib.inf | 6 +- .../BaseRiscV64CpuTimerLib/CpuTimerLib.c | 57 +++++++++++++++++-- 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/BaseRiscV64CpuTimerLib.inf b/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/BaseRiscV64CpuTimerLib.inf index 3d5eaa41716d..b7ae1e86b74d 100644 --- a/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/BaseRiscV64CpuTimerLib.inf +++ b/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/BaseRiscV64CpuTimerLib.inf @@ -28,6 +28,8 @@ BaseLib PcdLib DebugLib + FdtLib + HobLib -[Pcd] - gUefiCpuPkgTokenSpaceGuid.PcdCpuCoreCrystalClockFrequency ## CONSUMES +[Guids] + gFdtHobGuid diff --git a/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/CpuTimerLib.c b/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/CpuTimerLib.c index 27d7276aaa8a..080e229c401b 100644 --- a/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/CpuTimerLib.c +++ b/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/CpuTimerLib.c @@ -12,6 +12,12 @@ #include #include #include +#include +#include +#include +#include + +STATIC UINT64 mTimeBase; /** Stalls the CPU for at least the given number of ticks. @@ -57,7 +63,7 @@ MicroSecondDelay ( DivU64x32 ( MultU64x32 ( MicroSeconds, - PcdGet64 (PcdCpuCoreCrystalClockFrequency) + mTimeBase ), 1000000u ) @@ -85,7 +91,7 @@ NanoSecondDelay ( DivU64x32 ( MultU64x32 ( NanoSeconds, - PcdGet64 (PcdCpuCoreCrystalClockFrequency) + mTimeBase ), 1000000000u ) @@ -152,7 +158,48 @@ GetPerformanceCounterProperties ( *EndValue = 32 - 1; } - return PcdGet64 (PcdCpuCoreCrystalClockFrequency); + if (mTimeBase != 0) { + return mTimeBase; + } + + // + // Locate the FDT HOB and validate header + // + CONST EFI_HOB_GUID_TYPE *Hob = GetFirstGuidHob (&gFdtHobGuid); + + ASSERT (Hob != NULL); + + CONST VOID *DeviceTreeBase = + (CONST VOID *)(UINTN)*(CONST UINT64 *)GET_GUID_HOB_DATA (Hob); + + ASSERT (FdtCheckHeader (DeviceTreeBase) == 0); + + // + // /cpus node + // + INT32 Node = FdtSubnodeOffsetNameLen ( + DeviceTreeBase, + 0, + "cpus", + sizeof ("cpus") - 1 + ); + + ASSERT (Node >= 0); + + // + // timebase-frequency property + // + INT32 Len; + CONST FDT_PROPERTY *Prop = + FdtGetProperty (DeviceTreeBase, Node, "timebase-frequency", &Len); + + ASSERT (Prop != NULL && Len == sizeof (UINT32)); + + // + // Device-tree cells are big-endian + // + mTimeBase = SwapBytes32 (*(CONST UINT32 *)Prop->Data); + return mTimeBase; } /** @@ -180,13 +227,13 @@ GetTimeInNanoSecond ( // Time = --------- x 1,000,000,000 // Frequency // - NanoSeconds = MultU64x32 (DivU64x32Remainder (Ticks, PcdGet64 (PcdCpuCoreCrystalClockFrequency), &Remainder), 1000000000u); + NanoSeconds = MultU64x32 (DivU64x32Remainder (Ticks, mTimeBase, &Remainder), 1000000000u); // // Frequency < 0x100000000, so Remainder < 0x100000000, then (Remainder * 1,000,000,000) // will not overflow 64-bit. // - NanoSeconds += DivU64x32 (MultU64x32 ((UINT64)Remainder, 1000000000u), PcdGet64 (PcdCpuCoreCrystalClockFrequency)); + NanoSeconds += DivU64x32 (MultU64x32 ((UINT64)Remainder, 1000000000u), mTimeBase); return NanoSeconds; } From 8c721d68ea04ea73af011e1726a9b2c42973a243 Mon Sep 17 00:00:00 2001 From: Akshay Behl Date: Tue, 8 Jul 2025 10:49:08 +0530 Subject: [PATCH 0213/1172] MdePkg, EmbeddedPkg: Moved definition of Fdt Guid to MdePkg MdePkg has a more refined implementation of Fdt as compared to the EmbeddedPkg which was the initial implementation, hence moving the Fdt Guid from EmbeddedPkg to MdePkg. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Akshay Behl Co-authored-by: Dhaval Sharma --- EmbeddedPkg/EmbeddedPkg.dec | 2 -- {EmbeddedPkg => MdePkg}/Include/Guid/FdtHob.h | 0 MdePkg/MdePkg.dec | 3 +++ 3 files changed, 3 insertions(+), 2 deletions(-) rename {EmbeddedPkg => MdePkg}/Include/Guid/FdtHob.h (100%) diff --git a/EmbeddedPkg/EmbeddedPkg.dec b/EmbeddedPkg/EmbeddedPkg.dec index bb0b677bdc63..d386bda50ffa 100644 --- a/EmbeddedPkg/EmbeddedPkg.dec +++ b/EmbeddedPkg/EmbeddedPkg.dec @@ -53,8 +53,6 @@ ## FDT Configuration Table # Include/Guid/Fdt.h gFdtTableGuid = { 0xb1b621d5, 0xf19c, 0x41a5, { 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0 } } - # Include/Guid/FdtHob.h - gFdtHobGuid = { 0x16958446, 0x19B7, 0x480B, { 0xB0, 0x47, 0x74, 0x85, 0xAD, 0x3F, 0x71, 0x6D } } gFdtVariableGuid = { 0x25a4fd4a, 0x9703, 0x4ba9, { 0xa1, 0x90, 0xb7, 0xc8, 0x4e, 0xfb, 0x3e, 0x57 } } ## Include/Guid/PlatformHasDeviceTree.h diff --git a/EmbeddedPkg/Include/Guid/FdtHob.h b/MdePkg/Include/Guid/FdtHob.h similarity index 100% rename from EmbeddedPkg/Include/Guid/FdtHob.h rename to MdePkg/Include/Guid/FdtHob.h diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index c296cfa29bee..ea8bf0f4db1e 100644 --- a/MdePkg/MdePkg.dec +++ b/MdePkg/MdePkg.dec @@ -612,6 +612,9 @@ ## Include/Protocol/UserManager.h gEfiUserInfoAccessSetupRestrictedGuid = { 0xbdb38125, 0x4d63, 0x49f4, { 0x82, 0x12, 0x61, 0xcf, 0x5a, 0x19, 0xa, 0xf8 }} + ## Include/Guid/FdtHob.h + gFdtHobGuid = { 0x16958446, 0x19B7, 0x480B, { 0xB0, 0x47, 0x74, 0x85, 0xAD, 0x3F, 0x71, 0x6D } } + ## Include/Guid/ImageAuthentication.h gEfiImageSecurityDatabaseGuid = { 0xd719b2cb, 0x3d3a, 0x4596, {0xa3, 0xbc, 0xda, 0xd0, 0xe, 0x67, 0x65, 0x6f }} gEfiCertSha256Guid = { 0xc1c41626, 0x504c, 0x4092, {0xac, 0xa9, 0x41, 0xf9, 0x36, 0x93, 0x43, 0x28 }} From 484930e0c6b7991758a098b6e0fd31dec38e7d85 Mon Sep 17 00:00:00 2001 From: Akshay Behl Date: Sun, 8 Jun 2025 23:06:52 +0530 Subject: [PATCH 0214/1172] UefiCpuPkg/CpuDxeRiscV64: Use DT based timer frequency for CPU driver There is GetPerformanceCounterProperties() that relies on Device Tree to fetch timer frequency and removes the dependency from the PCDs, use that instead. Signed-off-by: Akshay Behl Co-authored-by: Dhaval Sharma --- UefiCpuPkg/CpuDxeRiscV64/CpuDxe.c | 2 +- UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h | 1 + UefiCpuPkg/CpuDxeRiscV64/CpuDxeRiscV64.inf | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.c b/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.c index 6a22e0171108..4f9d53eba89f 100644 --- a/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.c +++ b/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.c @@ -269,7 +269,7 @@ CpuGetTimerValue ( if (TimerPeriod != NULL) { *TimerPeriod = DivU64x32 ( 1000000000000000u, - PcdGet64 (PcdCpuCoreCrystalClockFrequency) + GetPerformanceCounterProperties (NULL, NULL) ); } diff --git a/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h b/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h index 40077d65bd5a..0c4ef2ec246f 100644 --- a/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h +++ b/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include diff --git a/UefiCpuPkg/CpuDxeRiscV64/CpuDxeRiscV64.inf b/UefiCpuPkg/CpuDxeRiscV64/CpuDxeRiscV64.inf index cb0f71e42eb0..7600c8873a9a 100644 --- a/UefiCpuPkg/CpuDxeRiscV64/CpuDxeRiscV64.inf +++ b/UefiCpuPkg/CpuDxeRiscV64/CpuDxeRiscV64.inf @@ -40,6 +40,7 @@ RiscVMmuLib RiscVFpuLib CacheMaintenanceLib + TimerLib [Sources] CpuDxe.c @@ -62,7 +63,6 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdNullPointerDetectionPropertyMask ## CONSUMES gUefiCpuPkgTokenSpaceGuid.PcdCpuStackSwitchExceptionList ## CONSUMES gUefiCpuPkgTokenSpaceGuid.PcdCpuKnownGoodStackSize ## CONSUMES - gUefiCpuPkgTokenSpaceGuid.PcdCpuCoreCrystalClockFrequency ## CONSUMES [Depex] TRUE From 34d609402bfec75c51a02deac7733c9a0128f55d Mon Sep 17 00:00:00 2001 From: Akshay Behl Date: Sun, 8 Jun 2025 23:09:04 +0530 Subject: [PATCH 0215/1172] UefiCpuPkg/CpuTimerDxeRiscV64: Use DT based timer frequency in Timer driver There is GetPerformanceCounterProperties() that relies on Device Tree to fetch timer frequency and removes the dependency from the PCDs, use that instead. Signed-off-by: Akshay Behl Co-authored-by: Dhaval Sharma --- UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerDxeRiscV64.inf | 2 +- UefiCpuPkg/CpuTimerDxeRiscV64/Timer.c | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerDxeRiscV64.inf b/UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerDxeRiscV64.inf index f2a2cf12caef..812b6745ebe8 100644 --- a/UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerDxeRiscV64.inf +++ b/UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerDxeRiscV64.inf @@ -32,6 +32,7 @@ CpuLib UefiBootServicesTableLib UefiDriverEntryPoint + TimerLib [LibraryClasses.RISCV64] RiscVSbiLib @@ -42,7 +43,6 @@ [Pcd] gEfiMdePkgTokenSpaceGuid.PcdRiscVFeatureOverride ## CONSUMES - gUefiCpuPkgTokenSpaceGuid.PcdCpuCoreCrystalClockFrequency ## CONSUMES [Protocols] gEfiCpuArchProtocolGuid ## CONSUMES diff --git a/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.c b/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.c index 216f48a52931..14780e4c45d6 100644 --- a/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.c +++ b/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.c @@ -10,6 +10,7 @@ #include #include #include +#include #include "Timer.h" // @@ -114,7 +115,7 @@ TimerInterruptHandler ( mTimerNotifyFunction ( DivU64x32 ( EFI_TIMER_PERIOD_SECONDS (PeriodStart - mLastPeriodStart), - PcdGet64 (PcdCpuCoreCrystalClockFrequency) + GetPerformanceCounterProperties (NULL, NULL) ) ); } @@ -129,7 +130,7 @@ TimerInterruptHandler ( PeriodStart += DivU64x32 ( MultU64x32 ( mTimerPeriod, - PcdGet64 (PcdCpuCoreCrystalClockFrequency) + GetPerformanceCounterProperties (NULL, NULL) ), 1000000u ); // convert to tick @@ -232,7 +233,7 @@ TimerDriverSetTimerPeriod ( PeriodStart += DivU64x32 ( MultU64x32 ( mTimerPeriod, - PcdGet64 (PcdCpuCoreCrystalClockFrequency) + GetPerformanceCounterProperties (NULL, NULL) ), 1000000u ); // convert to tick From 6cb05533875cf00e7b6072ae17fe171f75c39d98 Mon Sep 17 00:00:00 2001 From: Akshay Behl Date: Sun, 8 Jun 2025 23:10:30 +0530 Subject: [PATCH 0216/1172] OvmfPkg/RiscVVirt: Remove unnecessary PCD Signed-off-by: Akshay Behl Co-authored-by: Dhaval Sharma --- OvmfPkg/RiscVVirt/RiscVVirt.fdf.inc | 1 - 1 file changed, 1 deletion(-) diff --git a/OvmfPkg/RiscVVirt/RiscVVirt.fdf.inc b/OvmfPkg/RiscVVirt/RiscVVirt.fdf.inc index eba612372fee..6db361ef85fd 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirt.fdf.inc +++ b/OvmfPkg/RiscVVirt/RiscVVirt.fdf.inc @@ -34,6 +34,5 @@ DEFINE VARS_FTW_WORKING_SIZE = 0x00040000 DEFINE VARS_FTW_SPARE_OFFSET = $(VARS_FTW_WORKING_OFFSET) + $(VARS_FTW_WORKING_SIZE) DEFINE VARS_FTW_SPARE_SIZE = 0x00040000 -SET gUefiCpuPkgTokenSpaceGuid.PcdCpuCoreCrystalClockFrequency = 10000000 SET gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase = 0x83FF0000 SET gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize = 0x00010000 From 49b7a5e961bec6ad6e2459c39eecc19d88cbfa8d Mon Sep 17 00:00:00 2001 From: Akshay Behl Date: Tue, 8 Jul 2025 00:44:59 +0530 Subject: [PATCH 0217/1172] ArmVirtPkg: Remove unnecessary dependency on EmbeddedPkg These libraries required dependency on EmbeddedPkg for the FdtHob which has been moved to MdePkg. This dependency is not needed anymore and can now be removed. Signed-off-by: Akshay Behl Co-authored-by: Dhaval Sharma --- ArmVirtPkg/KvmtoolCfgMgrDxe/ConfigurationManagerDxe.inf | 1 - .../Library/KvmtoolPlatformPeiLib/KvmtoolPlatformPeiLib.inf | 1 - ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf | 1 - 3 files changed, 3 deletions(-) diff --git a/ArmVirtPkg/KvmtoolCfgMgrDxe/ConfigurationManagerDxe.inf b/ArmVirtPkg/KvmtoolCfgMgrDxe/ConfigurationManagerDxe.inf index a333966a8c96..c6d7e85bc0d7 100644 --- a/ArmVirtPkg/KvmtoolCfgMgrDxe/ConfigurationManagerDxe.inf +++ b/ArmVirtPkg/KvmtoolCfgMgrDxe/ConfigurationManagerDxe.inf @@ -30,7 +30,6 @@ [Packages] ArmVirtPkg/ArmVirtPkg.dec DynamicTablesPkg/DynamicTablesPkg.dec - EmbeddedPkg/EmbeddedPkg.dec MdeModulePkg/MdeModulePkg.dec MdePkg/MdePkg.dec diff --git a/ArmVirtPkg/Library/KvmtoolPlatformPeiLib/KvmtoolPlatformPeiLib.inf b/ArmVirtPkg/Library/KvmtoolPlatformPeiLib/KvmtoolPlatformPeiLib.inf index 77c0b923bd9c..d642cc8e8ebf 100644 --- a/ArmVirtPkg/Library/KvmtoolPlatformPeiLib/KvmtoolPlatformPeiLib.inf +++ b/ArmVirtPkg/Library/KvmtoolPlatformPeiLib/KvmtoolPlatformPeiLib.inf @@ -21,7 +21,6 @@ [Packages] ArmPkg/ArmPkg.dec ArmVirtPkg/ArmVirtPkg.dec - EmbeddedPkg/EmbeddedPkg.dec MdeModulePkg/MdeModulePkg.dec MdePkg/MdePkg.dec OvmfPkg/OvmfPkg.dec diff --git a/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf b/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf index e9a34b6e2ec9..d6c1b135c209 100644 --- a/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf +++ b/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf @@ -21,7 +21,6 @@ [Packages] ArmPkg/ArmPkg.dec ArmVirtPkg/ArmVirtPkg.dec - EmbeddedPkg/EmbeddedPkg.dec MdeModulePkg/MdeModulePkg.dec MdePkg/MdePkg.dec OvmfPkg/OvmfPkg.dec From 0425158a94d7b55c4670cdefe107a4ad9f6c7476 Mon Sep 17 00:00:00 2001 From: Chasel Chiu Date: Tue, 8 Jul 2025 10:01:31 -0700 Subject: [PATCH 0218/1172] Maintainers.txt: Remove Maintainers Remove unavailable maintainer for UefiPayloadPkg - Linus Liu Signed-off-by: Chasel Chiu --- Maintainers.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/Maintainers.txt b/Maintainers.txt index ee0142fe4d68..0078e9ac4021 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -673,7 +673,6 @@ M: Guo Dong [gdong1] M: Sean Rhodes [Sean-StarLabs] M: James Lu [jameslu8] M: Benjamin Doron [benjamindoron] -M: Linus Liu [LinusvPelt] R: Gua Guo [gguo11837463] M: Chasel Chiu [ChaselChiu] R: Shuo Liu [shuoliu0] From 2d69507a4dde02f1abf20c7eb3a43d1d3ef6b98f Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 16 Jun 2025 15:30:03 -0700 Subject: [PATCH 0219/1172] MdeModulePkg: Leak Memory if Not RW on FreePages Currently, if the DebugClearMemory bit is set in the PcdDebugPropertyMask, CoreConvertPagesEx will attempt to write a pattern to the pages being freed. However, it does not check that the page is writeable, which will cause a page fault if not. Furthermore, if NX protections are not enabled, the core does not ensure that any freed pages are RW, which is the state expected when they are allocated next. If they are not RW, the allocating driver will crash trying to use them. This patch updates the page freeing code to query the memory attributes protocol, if present, for the attributes. If this call fails or the attributes are not RW at a minimum, the core leaks the memory (returning success to the caller). If the memory attribute protocol is not present (either because a platform doesn't produce it or it is before the protocol has been produced, the core continues with freeing memory. This is either before the CPU Arch protocol is available (so drivers can't change memory attributes) or otherwise matches existing behavior. This was deemed the best approach to let memory that can't be guaranteed to be RW leak instead of letting a driver crash when allocating it. It was deemed less brittle to simply leak the memory instead of attempting to change the attributes. Signed-off-by: Oliver Smith-Denny --- MdeModulePkg/Core/Dxe/DxeMain.h | 2 + MdeModulePkg/Core/Dxe/DxeMain.inf | 1 + MdeModulePkg/Core/Dxe/Mem/Page.c | 32 ++++++++++ MdeModulePkg/Core/Dxe/Misc/MemoryProtection.c | 63 +++++++++++++++++++ 4 files changed, 98 insertions(+) diff --git a/MdeModulePkg/Core/Dxe/DxeMain.h b/MdeModulePkg/Core/Dxe/DxeMain.h index cd3940d34b2a..6f085549e87c 100644 --- a/MdeModulePkg/Core/Dxe/DxeMain.h +++ b/MdeModulePkg/Core/Dxe/DxeMain.h @@ -45,6 +45,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include +#include #include #include #include @@ -250,6 +251,7 @@ extern EFI_SECURITY_ARCH_PROTOCOL *gSecurity; extern EFI_SECURITY2_ARCH_PROTOCOL *gSecurity2; extern EFI_BDS_ARCH_PROTOCOL *gBds; extern EFI_SMM_BASE2_PROTOCOL *gSmmBase2; +extern EFI_MEMORY_ATTRIBUTE_PROTOCOL *gMemoryAttributeProtocol; extern EFI_TPL gEfiCurrentTpl; diff --git a/MdeModulePkg/Core/Dxe/DxeMain.inf b/MdeModulePkg/Core/Dxe/DxeMain.inf index cc315ac92ae8..40e7dc8d4176 100644 --- a/MdeModulePkg/Core/Dxe/DxeMain.inf +++ b/MdeModulePkg/Core/Dxe/DxeMain.inf @@ -156,6 +156,7 @@ gEfiHiiPackageListProtocolGuid ## SOMETIMES_PRODUCES gEfiSmmBase2ProtocolGuid ## SOMETIMES_CONSUMES gEdkiiPeCoffImageEmulatorProtocolGuid ## SOMETIMES_CONSUMES + gEfiMemoryAttributeProtocolGuid ## CONSUMES # Arch Protocols gEfiBdsArchProtocolGuid ## CONSUMES diff --git a/MdeModulePkg/Core/Dxe/Mem/Page.c b/MdeModulePkg/Core/Dxe/Mem/Page.c index 9df64cc1058e..27c27882fa7a 100644 --- a/MdeModulePkg/Core/Dxe/Mem/Page.c +++ b/MdeModulePkg/Core/Dxe/Mem/Page.c @@ -1746,6 +1746,38 @@ CoreFreePages ( { EFI_STATUS Status; EFI_MEMORY_TYPE MemoryType; + UINT64 Attributes; + + // check if this memory is returned to the core as RW at a minimum. If the memory attribute protocol is not installed, + // then we assume that the memory is RW by default and continue to free it. + if (gMemoryAttributeProtocol != NULL) { + Status = gMemoryAttributeProtocol->GetMemoryAttributes ( + gMemoryAttributeProtocol, + Memory, + EFI_PAGES_TO_SIZE (NumberOfPages), + &Attributes + ); + + // if we failed to get the attributes, or if the memory is read-only or read-protected, + // then we leak the memory and return success. This is done because the UEFI spec does not specify whether pages + // should be freed with any specific permission attributes. As such, there exist bootloaders in the wild that will + // free memory that is marked RO, which can crash the core if DebugClearMemory is enabled or can be passed out to a + // driver in the next AllocatePages() call, which can cause a crash later on. It is deemed lower risk to leak the + // memory than to attempt to fix up the attributes as that requires syncing the GCD and the page table. + if (EFI_ERROR (Status) || (Attributes & EFI_MEMORY_RO) || (Attributes & EFI_MEMORY_RP)) { + DEBUG (( + DEBUG_WARN, + "%a: Memory %llx for %llx Pages failed to get attributes with status %r or it is read-only or read-protected. " + "Attributes: %llx. Leaking memory!\n", + __func__, + Memory, + NumberOfPages, + Status, + Attributes + )); + return EFI_SUCCESS; + } + } Status = CoreInternalFreePages (Memory, NumberOfPages, &MemoryType); if (!EFI_ERROR (Status)) { diff --git a/MdeModulePkg/Core/Dxe/Misc/MemoryProtection.c b/MdeModulePkg/Core/Dxe/Misc/MemoryProtection.c index 33357eb124dd..69d26cb2b3cc 100644 --- a/MdeModulePkg/Core/Dxe/Misc/MemoryProtection.c +++ b/MdeModulePkg/Core/Dxe/Misc/MemoryProtection.c @@ -38,6 +38,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include +#include #include #include "DxeMain.h" @@ -67,6 +68,8 @@ extern LIST_ENTRY mGcdMemorySpaceMap; STATIC LIST_ENTRY mProtectedImageRecordList; +EFI_MEMORY_ATTRIBUTE_PROTOCOL *gMemoryAttributeProtocol; + /** Get the image type. @@ -1033,6 +1036,37 @@ DisableNullDetectionAtTheEndOfDxe ( return; } +/** + A notification for the Memory Attribute Protocol Installation. + + @param[in] Event Event whose notification function is being invoked. + @param[in] Context Pointer to the notification function's context, + which is implementation-dependent. + +**/ +VOID +EFIAPI +MemoryAttributeProtocolNotify ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_STATUS Status; + + Status = gBS->LocateProtocol (&gEfiMemoryAttributeProtocolGuid, NULL, (VOID **)&gMemoryAttributeProtocol); + + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_INFO, + "%a - Unable to locate the memory attribute protocol! Status = %r\n", + __func__, + Status + )); + } + + CoreCloseEvent (Event); +} + /** Initialize Memory Protection support. **/ @@ -1084,6 +1118,35 @@ CoreInitializeMemoryProtection ( ); ASSERT_EFI_ERROR (Status); + // Register an event to populate the memory attribute protocol + Status = CoreCreateEvent ( + EVT_NOTIFY_SIGNAL, + TPL_CALLBACK, + MemoryAttributeProtocolNotify, + NULL, + &Event + ); + + // if we fail to create the event or the protocol notify, we should still continue, we won't be able to query the + // memory attributes on FreePages(), so we may encounter a driver or bootloader that has not set attributes back to + // RW, but this matches the state of the world before this protocol was introduced, so it is not a regression. + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a - Failed to create event for the Memory Attribute Protocol notification: %r\n", __func__, Status)); + ASSERT_EFI_ERROR (Status); + } + + // Register for protocol notification + Status = CoreRegisterProtocolNotify ( + &gEfiMemoryAttributeProtocolGuid, + Event, + &Registration + ); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a - Failed to register for the Memory Attribute Protocol notification: %r\n", __func__, Status)); + ASSERT_EFI_ERROR (Status); + } + // // Register a callback to disable NULL pointer detection at EndOfDxe // From 5f2e0c8c4371a92c02dfdb69c3d4a10db16fcd38 Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Mon, 30 Jun 2025 20:32:09 -0700 Subject: [PATCH 0220/1172] MdeModulePkg: MdeModulePkg.dec update PcdDxeNxMemoryProtectionPolicy. Update the comments for PcdDxeNxMemoryProtectionPolicy which contained old information. Signed-off-by: Aaron Pop Co-authored-by: Oliver Smith-Denny --- MdeModulePkg/MdeModulePkg.dec | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 88b5a9d0582e..6ccca34eb74d 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -1508,8 +1508,7 @@ # OEM Reserved 0x4000000000000000
# OS Reserved 0x8000000000000000
# - # NOTE: User must NOT set NX protection for EfiLoaderCode / EfiBootServicesCode / EfiRuntimeServicesCode.
- # User MUST set the same NX protection for EfiBootServicesData and EfiConventionalMemory.
+ # NOTE: User MUST set the same NX protection for EfiBootServicesData and EfiConventionalMemory.
# # e.g. 0x7FD5 can be used for all memory except Code.
# e.g. 0x7BD4 can be used for all memory except Code and ACPINVS/Reserved.
From c9f01e35664fca4cc5881a19a523408cd7051ed6 Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Wed, 14 May 2025 10:47:16 -0700 Subject: [PATCH 0221/1172] UefiCpuPkg: Apply ReadOnly on Ap loop buffers. In the MpInitLib, pages are allocated for the APs, and data is copied into them. Depending on the allocation type, Nx needs to be removed from the pages to allow the processors to execute. Additionally, ReadOnly needs to be applied to the pages after they have been filled with the instructions that the APs need to execute. Signed-off-by: Aaron Pop Co-authored-by: Oliver Smith-Denny --- UefiCpuPkg/Library/MpInitLib/DxeMpLib.c | 64 ++++++++++++--- UefiCpuPkg/Library/MpInitLib/MpLib.c | 18 ++++- UefiCpuPkg/Library/MpInitLib/MpLib.h | 19 +++-- UefiCpuPkg/Library/MpInitLib/PeiMpLib.c | 101 +++++++++++++++++++----- 4 files changed, 163 insertions(+), 39 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c index 8c1428c2fcf6..f5f607401044 100644 --- a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c @@ -160,7 +160,7 @@ GetWakeupBuffer ( @retval 0 Cannot find free memory below 4GB. **/ UINTN -AllocateCodeBuffer ( +AllocateCodePage ( IN UINTN BufferSize ) { @@ -417,14 +417,46 @@ AllocateApLoopCodeBuffer ( /** Remove Nx protection for the range specific by BaseAddress and Length. - The PEI implementation uses CpuPageTableLib to change the attribute. - The DXE implementation uses gDS to change the attribute. + @param[in] BaseAddress BaseAddress of the range. + @param[in] Length Length of the range. +**/ +VOID +RemoveNxProtection ( + IN EFI_PHYSICAL_ADDRESS BaseAddress, + IN UINTN Length + ) +{ + EFI_STATUS Status; + EFI_GCD_MEMORY_SPACE_DESCRIPTOR MemDesc; + + Status = gDS->GetMemorySpaceDescriptor (BaseAddress, &MemDesc); + if (!EFI_ERROR (Status)) { + if (((MemDesc.Capabilities & EFI_MEMORY_XP) == EFI_MEMORY_XP) && ((MemDesc.Attributes & EFI_MEMORY_XP) == EFI_MEMORY_XP)) { + Status = gDS->SetMemorySpaceAttributes ( + BaseAddress, + Length, + MemDesc.Attributes & (~EFI_MEMORY_XP) + ); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a - Setting Nx on 0x%p returned %r\n", __func__, BaseAddress, Status)); + ASSERT_EFI_ERROR (Status); + } + } + } else { + DEBUG ((DEBUG_ERROR, "%a - Memory Address was not found in Memory map! %lp %r\n", __func__, BaseAddress, Status)); + ASSERT_EFI_ERROR (Status); + } +} + +/** + Add ReadOnly protection to the range specified by BaseAddress and Length. @param[in] BaseAddress BaseAddress of the range. @param[in] Length Length of the range. **/ VOID -RemoveNxprotection ( +ApplyRoProtection ( IN EFI_PHYSICAL_ADDRESS BaseAddress, IN UINTN Length ) @@ -432,17 +464,23 @@ RemoveNxprotection ( EFI_STATUS Status; EFI_GCD_MEMORY_SPACE_DESCRIPTOR MemDesc; - // - // TODO: Check EFI_MEMORY_XP bit set or not once it's available in DXE GCD - // service. - // Status = gDS->GetMemorySpaceDescriptor (BaseAddress, &MemDesc); if (!EFI_ERROR (Status)) { - gDS->SetMemorySpaceAttributes ( - BaseAddress, - Length, - MemDesc.Attributes & (~EFI_MEMORY_XP) - ); + if (((MemDesc.Capabilities & EFI_MEMORY_RO) == EFI_MEMORY_RO) && ((MemDesc.Attributes & EFI_MEMORY_RO) != EFI_MEMORY_RO)) { + Status = gDS->SetMemorySpaceAttributes ( + BaseAddress, + Length, + MemDesc.Attributes | EFI_MEMORY_RO + ); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a - Setting Ro on 0x%p returned %r\n", __func__, BaseAddress, Status)); + ASSERT_EFI_ERROR (Status); + } + } + } else { + DEBUG ((DEBUG_ERROR, "%a - Memory Address was not found in Memory map! %lp %r\n", __func__, BaseAddress, Status)); + ASSERT_EFI_ERROR (Status); } } diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c index ffaff1855f93..96c0980a2eba 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -2072,6 +2072,7 @@ MpInitLibInitialize ( UINTN ApResetVectorSizeAbove1Mb; UINTN BackupBufferAddr; UINTN ApIdtBase; + IA32_CR0 Cr0; FirstMpHandOff = GetNextMpHandOffHob (NULL); if (FirstMpHandOff != NULL) { @@ -2248,7 +2249,13 @@ MpInitLibInitialize ( // Copy all 32-bit code and 64-bit code into memory with type of // EfiBootServicesCode to avoid page fault if NX memory protection is enabled. // - CpuMpData->WakeupBufferHigh = AllocateCodeBuffer (ApResetVectorSizeAbove1Mb); + CpuMpData->WakeupBufferHigh = AllocateCodePage (ApResetVectorSizeAbove1Mb); + + Cr0.UintN = AsmReadCr0 (); + if (Cr0.Bits.PG != 0) { + RemoveNxProtection ((EFI_PHYSICAL_ADDRESS)(UINTN)CpuMpData->WakeupBufferHigh, ALIGN_VALUE (ApResetVectorSizeAbove1Mb, EFI_PAGE_SIZE)); + } + CopyMem ( (VOID *)CpuMpData->WakeupBufferHigh, CpuMpData->AddressMap.RendezvousFunnelAddress + @@ -2256,6 +2263,9 @@ MpInitLibInitialize ( ApResetVectorSizeAbove1Mb ); DEBUG ((DEBUG_INFO, "AP Vector: non-16-bit = %p/%x\n", CpuMpData->WakeupBufferHigh, ApResetVectorSizeAbove1Mb)); + if (Cr0.Bits.PG != 0) { + ApplyRoProtection ((EFI_PHYSICAL_ADDRESS)(UINTN)CpuMpData->WakeupBufferHigh, ALIGN_VALUE (ApResetVectorSizeAbove1Mb, EFI_PAGE_SIZE)); + } // // Save APIC mode for AP to sync @@ -3484,7 +3494,7 @@ PrepareApLoopCode ( // Make sure that the buffer memory is executable if NX protection is enabled // for EfiReservedMemoryType. // - RemoveNxprotection (Address, EFI_PAGES_TO_SIZE (FuncPages)); + RemoveNxProtection (Address, EFI_PAGES_TO_SIZE (FuncPages)); } mReservedTopOfApStack = (UINTN)Address + EFI_PAGES_TO_SIZE (StackPages+FuncPages); @@ -3492,6 +3502,10 @@ PrepareApLoopCode ( mReservedApLoop.Data = (VOID *)(UINTN)Address; ASSERT (mReservedApLoop.Data != NULL); CopyMem (mReservedApLoop.Data, ApLoopFunc, ApLoopFuncSize); + if (Cr0.Bits.PG != 0) { + ApplyRoProtection (Address, EFI_PAGES_TO_SIZE (FuncPages)); + } + if (!CpuMpData->UseSevEsAPMethod) { // // processors without SEV-ES and paging is enabled diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h index b30dcb3828ef..60cae3b1826b 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h @@ -533,7 +533,7 @@ GetNextMpHandOffHob ( @retval 0 Cannot find free memory below 4GB. **/ UINTN -AllocateCodeBuffer ( +AllocateCodePage ( IN UINTN BufferSize ); @@ -991,14 +991,23 @@ AllocateApLoopCodeBuffer ( /** Remove Nx protection for the range specific by BaseAddress and Length. - The PEI implementation uses CpuPageTableLib to change the attribute. - The DXE implementation uses gDS to change the attribute. - @param[in] BaseAddress BaseAddress of the range. @param[in] Length Length of the range. **/ VOID -RemoveNxprotection ( +RemoveNxProtection ( + IN EFI_PHYSICAL_ADDRESS BaseAddress, + IN UINTN Length + ); + +/** +Add ReadOnly protection to the range specified by BaseAddress and Length. + +@param[in] BaseAddress BaseAddress of the range. +@param[in] Length Length of the range. +**/ +VOID +ApplyRoProtection ( IN EFI_PHYSICAL_ADDRESS BaseAddress, IN UINTN Length ); diff --git a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c index bb287940e110..443508f9c837 100644 --- a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c @@ -290,7 +290,7 @@ GetWakeupBuffer ( @retval 0 Cannot find free memory below 4GB. **/ UINTN -AllocateCodeBuffer ( +AllocateCodePage ( IN UINTN BufferSize ) { @@ -819,31 +819,21 @@ AllocateApLoopCodeBuffer ( } /** - Remove Nx protection for the range specific by BaseAddress and Length. - - The PEI implementation uses CpuPageTableLib to change the attribute. - The DXE implementation uses gDS to change the attribute. + Determine the Paging Mode that the system is currently + using. - @param[in] BaseAddress BaseAddress of the range. - @param[in] Length Length of the range. -**/ -VOID -RemoveNxprotection ( - IN EFI_PHYSICAL_ADDRESS BaseAddress, - IN UINTN Length + @retval PAGING_MODE + **/ +PAGING_MODE +DetermineCurrentPagingMode ( + VOID ) { - EFI_STATUS Status; - UINTN PageTable; - EFI_PHYSICAL_ADDRESS Buffer; - UINTN BufferSize; - IA32_MAP_ATTRIBUTE MapAttribute; - IA32_MAP_ATTRIBUTE MapMask; PAGING_MODE PagingMode; IA32_CR4 Cr4; BOOLEAN Page5LevelSupport; - UINT32 RegEax; BOOLEAN Page1GSupport; + UINT32 RegEax; CPUID_EXTENDED_CPU_SIG_EDX RegEdx; if (sizeof (UINTN) == sizeof (UINT64)) { @@ -877,12 +867,36 @@ RemoveNxprotection ( PagingMode = PagingPae; } + return PagingMode; +} + +/** + Remove Nx protection for the range specific by BaseAddress and Length. + + @param[in] BaseAddress BaseAddress of the range. + @param[in] Length Length of the range. +**/ +VOID +RemoveNxProtection ( + IN EFI_PHYSICAL_ADDRESS BaseAddress, + IN UINTN Length + ) +{ + EFI_STATUS Status; + UINTN PageTable; + EFI_PHYSICAL_ADDRESS Buffer; + UINTN BufferSize; + IA32_MAP_ATTRIBUTE MapAttribute; + IA32_MAP_ATTRIBUTE MapMask; + PAGING_MODE PagingMode; + MapAttribute.Uint64 = 0; MapMask.Uint64 = 0; MapMask.Bits.Nx = 1; PageTable = AsmReadCr3 () & PAGING_4K_ADDRESS_MASK_64; BufferSize = 0; + PagingMode = DetermineCurrentPagingMode (); // // Get required buffer size for changing the pagetable. // @@ -903,3 +917,52 @@ RemoveNxprotection ( ASSERT_EFI_ERROR (Status); AsmWriteCr3 (PageTable); } + +/** + Add ReadOnly protection to the range specified by BaseAddress and Length. + + @param[in] BaseAddress BaseAddress of the range. + @param[in] Length Length of the range. +**/ +VOID +ApplyRoProtection ( + IN EFI_PHYSICAL_ADDRESS BaseAddress, + IN UINTN Length + ) +{ + EFI_STATUS Status; + UINTN PageTable; + EFI_PHYSICAL_ADDRESS Buffer; + UINTN BufferSize; + IA32_MAP_ATTRIBUTE MapAttribute; + IA32_MAP_ATTRIBUTE MapMask; + PAGING_MODE PagingMode; + + MapAttribute.Uint64 = 0; + MapMask.Uint64 = 0; + MapMask.Bits.ReadWrite = 1; + PageTable = AsmReadCr3 () & PAGING_4K_ADDRESS_MASK_64; + BufferSize = 0; + + PagingMode = DetermineCurrentPagingMode (); + // + // Get required buffer size for changing the pagetable. + // + Status = PageTableMap (&PageTable, PagingMode, 0, &BufferSize, BaseAddress, Length, &MapAttribute, &MapMask, NULL); + if (Status == EFI_BUFFER_TOO_SMALL) { + // + // Allocate required Buffer. + // + Status = PeiServicesAllocatePages ( + EfiBootServicesData, + EFI_SIZE_TO_PAGES (BufferSize), + &Buffer + ); + ASSERT_EFI_ERROR (Status); + Status = PageTableMap (&PageTable, PagingMode, (VOID *)(UINTN)Buffer, &BufferSize, BaseAddress, Length, &MapAttribute, &MapMask, NULL); + } + + ASSERT_EFI_ERROR (Status); + AsmWriteCr3 (PageTable); + return; +} From e44cb970da6da149dc796a4782be570e101a7fed Mon Sep 17 00:00:00 2001 From: Hongbin1 Zhang Date: Wed, 21 May 2025 21:41:05 +0800 Subject: [PATCH 0222/1172] StandaloneMmPkg: Split MmEvent to a separate Driver Due to PEIM will do following MM notify event under API mode: 1.MM end of dxe notify Event 2.MM ready to lock notify Event 3.MM ready to boot notify Event 4.MM exit boot services notify Event It will conflict with the notify event in MmCommunicationDxe.inf on edk2 bootloader under API mode, so split following MmEvent to MmCommunicationNotifyDxe.inf, and avoid run this driver under API mode. Signed-off-by: Hongbin1 Zhang Cc: Ray Ni Cc: Star Zeng Cc: Jiaxin Wu Cc: Dun Tan Cc: Khor Swee Aun Cc: Sami Mujawar Cc: Ard Biesheuvel --- .../MmCommunicationDxe/MmCommunicationDxe.c | 216 +------------- .../MmCommunicationDxe/MmCommunicationDxe.h | 64 ----- .../MmCommunicationDxe/MmCommunicationDxe.inf | 3 - .../MmCommunicationNotifyDxe.c | 265 ++++++++++++++++++ .../MmCommunicationNotifyDxe.h | 156 +++++++++++ .../MmCommunicationNotifyDxe.inf | 51 ++++ StandaloneMmPkg/StandaloneMmPkg.dsc | 3 + 7 files changed, 485 insertions(+), 273 deletions(-) create mode 100644 StandaloneMmPkg/Drivers/MmCommunicationNotifyDxe/MmCommunicationNotifyDxe.c create mode 100644 StandaloneMmPkg/Drivers/MmCommunicationNotifyDxe/MmCommunicationNotifyDxe.h create mode 100644 StandaloneMmPkg/Drivers/MmCommunicationNotifyDxe/MmCommunicationNotifyDxe.inf diff --git a/StandaloneMmPkg/Drivers/MmCommunicationDxe/MmCommunicationDxe.c b/StandaloneMmPkg/Drivers/MmCommunicationDxe/MmCommunicationDxe.c index ba0b2ec1a3e2..f5b1d2acf1a1 100644 --- a/StandaloneMmPkg/Drivers/MmCommunicationDxe/MmCommunicationDxe.c +++ b/StandaloneMmPkg/Drivers/MmCommunicationDxe/MmCommunicationDxe.c @@ -33,188 +33,7 @@ EFI_MM_COMMUNICATION_PROTOCOL mMmCommunication = { MM_COMM_BUFFER mMmCommonBuffer; EFI_SMM_CONTROL2_PROTOCOL *mSmmControl2; EFI_SMM_ACCESS2_PROTOCOL *mSmmAccess; -BOOLEAN mSmmLocked = FALSE; -BOOLEAN mEndOfDxe = FALSE; - -// -// Table of Protocol notification and GUIDed Event notifications that the Standalone Mm requires -// -MM_EVENT_NOTIFICATION mMmEvents[] = { - // - // Declare protocol notification on DxeMmReadyToLock protocols. When this notification is established, - // the associated event is immediately signalled, so the notification function will be executed and the - // DXE Mm Ready To Lock Protocol will be found if it is already in the handle database. - // - { ProtocolNotify, TRUE, &gEfiDxeMmReadyToLockProtocolGuid, MmReadyToLockEventNotify, &gEfiDxeMmReadyToLockProtocolGuid, NULL }, - // - // Declare event notification on Ready To Boot Event Group. This is an extra event notification that is - // used to make sure SMRAM is locked before any boot options are processed. - // - { EventNotify, TRUE, &gEfiEventReadyToBootGuid, MmReadyToLockEventNotify, &gEfiEventReadyToBootGuid, NULL }, - // - // Declare event notification on Ready To Boot Event Group. This is used to inform the MM Core - // to notify MM driver that system enter ready to boot. - // - { EventNotify, FALSE, &gEfiEventReadyToBootGuid, MmGuidedEventNotify, &gEfiEventReadyToBootGuid, NULL }, - // - // Declare event notification on EndOfDxe event. When this notification is established, - // the associated event is immediately signalled, so the notification function will be executed and the - // End Of Dxe Protocol will be found if it is already in the handle database. - // - { EventNotify, TRUE, &gEfiEndOfDxeEventGroupGuid, MmGuidedEventNotify, &gEfiEndOfDxeEventGroupGuid, NULL }, - // - // Declare event notification on EndOfDxe event. This is used to set EndOfDxe event signaled flag. - // - { EventNotify, TRUE, &gEfiEndOfDxeEventGroupGuid, MmEndOfDxeEventNotify, &gEfiEndOfDxeEventGroupGuid, NULL }, - // - // Declare event notification on Exit Boot Services Event Group. This is used to inform the MM Core - // to notify MM driver that system enter exit boot services. - // - { EventNotify, FALSE, &gEfiEventExitBootServicesGuid, MmGuidedEventNotify, &gEfiEventExitBootServicesGuid, NULL }, - // - // Declare event notification on SetVirtualAddressMap() Event Group. This is used to convert fixed MM communication buffer - // and MM_COMM_BUFFER_STATUS in mMmCommonBuffer, mSmmControl2 from physical addresses to virtual addresses. - // - { EventNotify, FALSE, &gEfiEventVirtualAddressChangeGuid, MmVirtualAddressChangeEvent, NULL, NULL }, - // - // Terminate the table of event notifications - // - { EndNotify, FALSE, NULL, NULL, NULL, NULL } -}; - -/** - Event notification that is fired when GUIDed Event Group is signaled. - - @param Event The Event that is being processed, not used. - @param Context Event Context, not used. - -**/ -VOID -EFIAPI -MmGuidedEventNotify ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - UINTN Size; - EFI_MM_COMMUNICATE_HEADER *CommunicateHeader; - - CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)(UINTN)mMmCommonBuffer.PhysicalStart; - - // - // Use Guid to initialize EFI_MM_COMMUNICATE_HEADER structure - // - CopyGuid (&CommunicateHeader->HeaderGuid, (EFI_GUID *)Context); - CommunicateHeader->MessageLength = 1; - CommunicateHeader->Data[0] = 0; - - // - // Generate the Software SMI and return the result - // - Size = sizeof (EFI_MM_COMMUNICATE_HEADER); - MmCommunicate2 (&mMmCommunication2, CommunicateHeader, CommunicateHeader, &Size); -} - -/** - Event notification that is fired every time a DxeSmmReadyToLock protocol is added - or if gEfiEventReadyToBootGuid is signaled. - - @param Event The Event that is being processed, not used. - @param Context Event Context, not used. - -**/ -VOID -EFIAPI -MmReadyToLockEventNotify ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - EFI_STATUS Status; - VOID *Interface; - UINTN Index; - - // - // See if we are already locked - // - if (mSmmLocked) { - return; - } - - // - // Make sure this notification is for this handler - // - if (CompareGuid ((EFI_GUID *)Context, &gEfiDxeMmReadyToLockProtocolGuid)) { - Status = gBS->LocateProtocol (&gEfiDxeMmReadyToLockProtocolGuid, NULL, &Interface); - if (EFI_ERROR (Status)) { - return; - } - } else { - // - // If MM is not locked yet and we got here from gEfiEventReadyToBootGuid being - // signaled, then gEfiDxeMmReadyToLockProtocolGuid was not installed as expected. - // Print a warning on debug builds. - // - DEBUG ((DEBUG_WARN, "DXE Mm Ready To Lock Protocol not installed before Ready To Boot signal\n")); - } - - if (!mEndOfDxe) { - DEBUG ((DEBUG_ERROR, "EndOfDxe Event must be signaled before DxeSmmReadyToLock Protocol installation!\n")); - REPORT_STATUS_CODE ( - EFI_ERROR_CODE | EFI_ERROR_UNRECOVERED, - (EFI_SOFTWARE_SMM_DRIVER | EFI_SW_EC_ILLEGAL_SOFTWARE_STATE) - ); - ASSERT (FALSE); - } - - // - // Lock the SMRAM (Note: Locking SMRAM may not be supported on all platforms) - // - mSmmAccess->Lock (mSmmAccess); - - // - // Close protocol and event notification events that do not apply after the - // DXE MM Ready To Lock Protocol has been installed or the Ready To Boot - // event has been signalled. - // - for (Index = 0; mMmEvents[Index].NotifyFunction != NULL; Index++) { - if (mMmEvents[Index].CloseOnLock) { - gBS->CloseEvent (mMmEvents[Index].Event); - } - } - - // - // Inform MM Core that the DxeSmmReadyToLock protocol was installed - // - MmGuidedEventNotify (Event, (VOID *)&gEfiDxeMmReadyToLockProtocolGuid); - - // - // Print debug message that the SMRAM window is now locked. - // - DEBUG ((DEBUG_INFO, "MmCommunicationDxe locked SMRAM window\n")); - - // - // Set flag so this operation will not be performed again - // - mSmmLocked = TRUE; -} - -/** - Event notification that is fired when EndOfDxe Event Group is signaled. - - @param Event The Event that is being processed, not used. - @param Context Event Context, not used. - -**/ -VOID -EFIAPI -MmEndOfDxeEventNotify ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - mEndOfDxe = TRUE; -} +EFI_EVENT mVirtualAddressChangeEvent = NULL; /** Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE. @@ -458,8 +277,6 @@ MmCommunicationEntryPoint ( EFI_HANDLE Handle; EFI_HOB_GUID_TYPE *GuidHob; MM_COMM_BUFFER *MmCommonBuffer; - UINTN Index; - VOID *Registration; // // Locate gMmCommBufferHobGuid and cache the content @@ -507,29 +324,16 @@ MmCommunicationEntryPoint ( ASSERT_EFI_ERROR (Status); // - // Create the set of protocol and event notifications that the Standalone Mm requires + // Register the event to convert the pointer for runtime. // - for (Index = 0; mMmEvents[Index].NotificationType != EndNotify; Index++) { - if (mMmEvents[Index].NotificationType == ProtocolNotify) { - mMmEvents[Index].Event = EfiCreateProtocolNotifyEvent ( - mMmEvents[Index].Guid, - TPL_CALLBACK, - mMmEvents[Index].NotifyFunction, - mMmEvents[Index].NotifyContext, - &Registration - ); - } else { - Status = gBS->CreateEventEx ( - EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, - mMmEvents[Index].NotifyFunction, - mMmEvents[Index].NotifyContext, - mMmEvents[Index].Guid, - &mMmEvents[Index].Event - ); - ASSERT_EFI_ERROR (Status); - } - } + gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_NOTIFY, + MmVirtualAddressChangeEvent, + NULL, + &gEfiEventVirtualAddressChangeGuid, + &mVirtualAddressChangeEvent + ); return EFI_SUCCESS; } diff --git a/StandaloneMmPkg/Drivers/MmCommunicationDxe/MmCommunicationDxe.h b/StandaloneMmPkg/Drivers/MmCommunicationDxe/MmCommunicationDxe.h index 3b399dab4012..80d2bfa2b307 100644 --- a/StandaloneMmPkg/Drivers/MmCommunicationDxe/MmCommunicationDxe.h +++ b/StandaloneMmPkg/Drivers/MmCommunicationDxe/MmCommunicationDxe.h @@ -25,30 +25,9 @@ #include #include #include -#include #include #include -#include - -typedef enum { - EventNotify, - ProtocolNotify, - EndNotify, -} NOTIFICATION_TYPE; - -// -// Data structure used to declare a table of protocol notifications and event -// notifications required by the Standalone Mm environment -// -typedef struct { - NOTIFICATION_TYPE NotificationType; - BOOLEAN CloseOnLock; - EFI_GUID *Guid; - EFI_EVENT_NOTIFY NotifyFunction; - VOID *NotifyContext; - EFI_EVENT Event; -} MM_EVENT_NOTIFICATION; /** Communicates with a registered handler. @@ -143,49 +122,6 @@ MmCommunicate ( IN OUT UINTN *CommSize OPTIONAL ); -/** - Event notification that is fired every time a DxeSmmReadyToLock protocol is added - or if gEfiEventReadyToBootGuid is signaled. - - @param Event The Event that is being processed, not used. - @param Context Event Context, not used. - -**/ -VOID -EFIAPI -MmReadyToLockEventNotify ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -/** - Event notification that is fired when GUIDed Event Group is signaled. - - @param Event The Event that is being processed, not used. - @param Context Event Context, not used. - -**/ -VOID -EFIAPI -MmGuidedEventNotify ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -/** - Event notification that is fired when EndOfDxe Event Group is signaled. - - @param Event The Event that is being processed, not used. - @param Context Event Context, not used. - -**/ -VOID -EFIAPI -MmEndOfDxeEventNotify ( - IN EFI_EVENT Event, - IN VOID *Context - ); - /** Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE. diff --git a/StandaloneMmPkg/Drivers/MmCommunicationDxe/MmCommunicationDxe.inf b/StandaloneMmPkg/Drivers/MmCommunicationDxe/MmCommunicationDxe.inf index dd5a0b1fb37f..2f23007f5f22 100644 --- a/StandaloneMmPkg/Drivers/MmCommunicationDxe/MmCommunicationDxe.inf +++ b/StandaloneMmPkg/Drivers/MmCommunicationDxe/MmCommunicationDxe.inf @@ -42,8 +42,6 @@ [Guids] gMmCommBufferHobGuid gEfiEventVirtualAddressChangeGuid - gEfiEndOfDxeEventGroupGuid - gEfiEventExitBootServicesGuid gEfiMmCommunicateHeaderV3Guid [Protocols] @@ -51,7 +49,6 @@ gEfiMmCommunication2ProtocolGuid gEfiSmmControl2ProtocolGuid gEfiMmCommunicationProtocolGuid - gEfiDxeMmReadyToLockProtocolGuid gEfiSmmAccess2ProtocolGuid [Depex] diff --git a/StandaloneMmPkg/Drivers/MmCommunicationNotifyDxe/MmCommunicationNotifyDxe.c b/StandaloneMmPkg/Drivers/MmCommunicationNotifyDxe/MmCommunicationNotifyDxe.c new file mode 100644 index 000000000000..8e49b53e1cfa --- /dev/null +++ b/StandaloneMmPkg/Drivers/MmCommunicationNotifyDxe/MmCommunicationNotifyDxe.c @@ -0,0 +1,265 @@ +/** @file + MmCommunicationNotifyDxe driver creates the notifications of + some protocols and event. + + Copyright (c) 2025, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "MmCommunicationNotifyDxe.h" + +// +// PI 1.7 MM Communication Protocol 2 instance +// +EFI_MM_COMMUNICATION2_PROTOCOL *mMmCommunication2; +MM_COMM_BUFFER mMmCommonBuffer; +EFI_SMM_ACCESS2_PROTOCOL *mSmmAccess; +BOOLEAN mSmmLocked = FALSE; +BOOLEAN mEndOfDxe = FALSE; + +// +// Table of Protocol notification and GUIDed Event notifications that the Standalone Mm requires +// +MM_EVENT_NOTIFICATION mMmEvents[] = { + // + // Declare protocol notification on DxeMmReadyToLock protocols. When this notification is established, + // the associated event is immediately signalled, so the notification function will be executed and the + // DXE Mm Ready To Lock Protocol will be found if it is already in the handle database. + // + { ProtocolNotify, TRUE, &gEfiDxeMmReadyToLockProtocolGuid, MmReadyToLockEventNotify, &gEfiDxeMmReadyToLockProtocolGuid, NULL }, + // + // Declare event notification on Ready To Boot Event Group. This is an extra event notification that is + // used to make sure SMRAM is locked before any boot options are processed. + // + { EventNotify, TRUE, &gEfiEventReadyToBootGuid, MmReadyToLockEventNotify, &gEfiEventReadyToBootGuid, NULL }, + // + // Declare event notification on Ready To Boot Event Group. This is used to inform the MM Core + // to notify MM driver that system enter ready to boot. + // + { EventNotify, FALSE, &gEfiEventReadyToBootGuid, MmGuidedEventNotify, &gEfiEventReadyToBootGuid, NULL }, + // + // Declare event notification on EndOfDxe event. When this notification is established, + // the associated event is immediately signalled, so the notification function will be executed and the + // End Of Dxe Protocol will be found if it is already in the handle database. + // + { EventNotify, TRUE, &gEfiEndOfDxeEventGroupGuid, MmGuidedEventNotify, &gEfiEndOfDxeEventGroupGuid, NULL }, + // + // Declare event notification on EndOfDxe event. This is used to set EndOfDxe event signaled flag. + // + { EventNotify, TRUE, &gEfiEndOfDxeEventGroupGuid, MmEndOfDxeEventNotify, &gEfiEndOfDxeEventGroupGuid, NULL }, + // + // Declare event notification on Exit Boot Services Event Group. This is used to inform the MM Core + // to notify MM driver that system enter exit boot services. + // + { EventNotify, FALSE, &gEfiEventExitBootServicesGuid, MmGuidedEventNotify, &gEfiEventExitBootServicesGuid, NULL }, + // + // Terminate the table of event notifications + // + { EndNotify, FALSE, NULL, NULL, NULL, NULL } +}; + +/** + Event notification that is fired when GUIDed Event Group is signaled. + + @param Event The Event that is being processed, not used. + @param Context Event Context, not used. + +**/ +VOID +EFIAPI +MmGuidedEventNotify ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + UINTN Size; + EFI_MM_COMMUNICATE_HEADER *CommunicateHeader; + + CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)(UINTN)mMmCommonBuffer.PhysicalStart; + + // + // Use Guid to initialize EFI_MM_COMMUNICATE_HEADER structure + // + CopyGuid (&CommunicateHeader->HeaderGuid, (EFI_GUID *)Context); + CommunicateHeader->MessageLength = 1; + CommunicateHeader->Data[0] = 0; + + // + // Generate the Software SMI and return the result + // + Size = sizeof (EFI_MM_COMMUNICATE_HEADER); + mMmCommunication2->Communicate (mMmCommunication2, CommunicateHeader, CommunicateHeader, &Size); +} + +/** + Event notification that is fired every time a DxeSmmReadyToLock protocol is added + or if gEfiEventReadyToBootGuid is signaled. + + @param Event The Event that is being processed, not used. + @param Context Event Context, not used. + +**/ +VOID +EFIAPI +MmReadyToLockEventNotify ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_STATUS Status; + VOID *Interface; + UINTN Index; + + // + // See if we are already locked + // + if (mSmmLocked) { + return; + } + + // + // Make sure this notification is for this handler + // + if (CompareGuid ((EFI_GUID *)Context, &gEfiDxeMmReadyToLockProtocolGuid)) { + Status = gBS->LocateProtocol (&gEfiDxeMmReadyToLockProtocolGuid, NULL, &Interface); + if (EFI_ERROR (Status)) { + return; + } + } else { + // + // If MM is not locked yet and we got here from gEfiEventReadyToBootGuid being + // signaled, then gEfiDxeMmReadyToLockProtocolGuid was not installed as expected. + // Print a warning on debug builds. + // + DEBUG ((DEBUG_WARN, "DXE Mm Ready To Lock Protocol not installed before Ready To Boot signal\n")); + } + + if (!mEndOfDxe) { + DEBUG ((DEBUG_ERROR, "EndOfDxe Event must be signaled before DxeSmmReadyToLock Protocol installation!\n")); + REPORT_STATUS_CODE ( + EFI_ERROR_CODE | EFI_ERROR_UNRECOVERED, + (EFI_SOFTWARE_SMM_DRIVER | EFI_SW_EC_ILLEGAL_SOFTWARE_STATE) + ); + ASSERT (FALSE); + } + + // + // Lock the SMRAM (Note: Locking SMRAM may not be supported on all platforms) + // + mSmmAccess->Lock (mSmmAccess); + + // + // Close protocol and event notification events that do not apply after the + // DXE MM Ready To Lock Protocol has been installed or the Ready To Boot + // event has been signalled. + // + for (Index = 0; mMmEvents[Index].NotifyFunction != NULL; Index++) { + if (mMmEvents[Index].CloseOnLock) { + gBS->CloseEvent (mMmEvents[Index].Event); + } + } + + // + // Inform MM Core that the DxeSmmReadyToLock protocol was installed + // + MmGuidedEventNotify (Event, (VOID *)&gEfiDxeMmReadyToLockProtocolGuid); + + // + // Print debug message that the SMRAM window is now locked. + // + DEBUG ((DEBUG_INFO, "MmCommunicationNotifyDxe locked SMRAM window\n")); + + // + // Set flag so this operation will not be performed again + // + mSmmLocked = TRUE; +} + +/** + Event notification that is fired when EndOfDxe Event Group is signaled. + + @param Event The Event that is being processed, not used. + @param Context Event Context, not used. + +**/ +VOID +EFIAPI +MmEndOfDxeEventNotify ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + mEndOfDxe = TRUE; +} + +/** + The Entry Point for MmCommunicateNotifyDxe driver. + + @param ImageHandle The firmware allocated handle for the EFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The entry point is executed successfully. + @retval Other Some error occurred when executing this entry point. + +**/ +EFI_STATUS +EFIAPI +MmCommunicationNotifyEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + EFI_HOB_GUID_TYPE *GuidHob; + MM_COMM_BUFFER *MmCommonBuffer; + UINTN Index; + VOID *Registration; + + // + // Locate gMmCommBufferHobGuid and cache the content + // + GuidHob = GetFirstGuidHob (&gMmCommBufferHobGuid); + ASSERT (GuidHob != NULL); + MmCommonBuffer = GET_GUID_HOB_DATA (GuidHob); + CopyMem (&mMmCommonBuffer, MmCommonBuffer, sizeof (MM_COMM_BUFFER)); + + // + // Get SMM Access Protocol + // + Status = gBS->LocateProtocol (&gEfiSmmAccess2ProtocolGuid, NULL, (VOID **)&mSmmAccess); + ASSERT_EFI_ERROR (Status); + + // + // Get MM Communication Protocol 2 instance + // + Status = gBS->LocateProtocol (&gEfiMmCommunication2ProtocolGuid, NULL, (VOID **)&mMmCommunication2); + ASSERT_EFI_ERROR (Status); + + // + // Create the set of protocol and event notifications that the Standalone Mm requires + // + for (Index = 0; mMmEvents[Index].NotificationType != EndNotify; Index++) { + if (mMmEvents[Index].NotificationType == ProtocolNotify) { + mMmEvents[Index].Event = EfiCreateProtocolNotifyEvent ( + mMmEvents[Index].Guid, + TPL_CALLBACK, + mMmEvents[Index].NotifyFunction, + mMmEvents[Index].NotifyContext, + &Registration + ); + } else { + Status = gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_CALLBACK, + mMmEvents[Index].NotifyFunction, + mMmEvents[Index].NotifyContext, + mMmEvents[Index].Guid, + &mMmEvents[Index].Event + ); + ASSERT_EFI_ERROR (Status); + } + } + + return EFI_SUCCESS; +} diff --git a/StandaloneMmPkg/Drivers/MmCommunicationNotifyDxe/MmCommunicationNotifyDxe.h b/StandaloneMmPkg/Drivers/MmCommunicationNotifyDxe/MmCommunicationNotifyDxe.h new file mode 100644 index 000000000000..83391dcabd7f --- /dev/null +++ b/StandaloneMmPkg/Drivers/MmCommunicationNotifyDxe/MmCommunicationNotifyDxe.h @@ -0,0 +1,156 @@ +/** @file + + Copyright (c) 2025, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef MM_COMMUNICATION_NOTIFY_DXE_H_ +#define MM_COMMUNICATION_NOTIFY_DXE_H_ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +typedef enum { + EventNotify, + ProtocolNotify, + EndNotify, +} NOTIFICATION_TYPE; + +// +// Data structure used to declare a table of protocol notifications and event +// notifications required by the Standalone Mm environment +// +typedef struct { + NOTIFICATION_TYPE NotificationType; + BOOLEAN CloseOnLock; + EFI_GUID *Guid; + EFI_EVENT_NOTIFY NotifyFunction; + VOID *NotifyContext; + EFI_EVENT Event; +} MM_EVENT_NOTIFICATION; + +/** + Communicates with a registered handler. + + This function provides a service to send and receive messages from a registered UEFI service. + + @param[in] This The EFI_MM_COMMUNICATION_PROTOCOL instance. + @param[in, out] CommBufferPhysical Physical address of the MM communication buffer. + @param[in, out] CommBufferVirtual Virtual address of the MM communication buffer. + @param[in, out] CommSize The size of the data buffer being passed in. On exit, the size of data + being returned. Zero if the handler does not wish to reply with any data. + This parameter is optional and may be NULL. + + @retval EFI_SUCCESS The message was successfully posted. + @retval EFI_INVALID_PARAMETER The CommBuffer was NULL. + @retval EFI_BAD_BUFFER_SIZE The buffer is too large for the MM implementation. + If this error is returned, the MessageLength field + in the CommBuffer header or the integer pointed by + CommSize, are updated to reflect the maximum payload + size the implementation can accommodate. + @retval EFI_ACCESS_DENIED The CommunicateBuffer parameter or CommSize parameter, + if not omitted, are in address range that cannot be + accessed by the MM environment. + +**/ +EFI_STATUS +EFIAPI +MmCommunicate2 ( + IN CONST EFI_MM_COMMUNICATION2_PROTOCOL *This, + IN OUT VOID *CommBufferPhysical, + IN OUT VOID *CommBufferVirtual, + IN OUT UINTN *CommSize OPTIONAL + ); + +/** + Communicates with a registered handler. + + This function provides a service to send and receive messages from a registered UEFI service. + + @param[in] This The EFI_MM_COMMUNICATION_PROTOCOL instance. + @param[in, out] CommBufferPhysical Physical address of the MM communication buffer + @param[in, out] CommSize The size of the data buffer being passed in. On exit, the size of data + being returned. Zero if the handler does not wish to reply with any data. + This parameter is optional and may be NULL. + + @retval EFI_SUCCESS The message was successfully posted. + @retval EFI_INVALID_PARAMETER The CommBuffer was NULL. + @retval EFI_BAD_BUFFER_SIZE The buffer is too large for the MM implementation. + If this error is returned, the MessageLength field + in the CommBuffer header or the integer pointed by + CommSize, are updated to reflect the maximum payload + size the implementation can accommodate. + @retval EFI_ACCESS_DENIED The CommunicateBuffer parameter or CommSize parameter, + if not omitted, are in address range that cannot be + accessed by the MM environment. + +**/ +EFI_STATUS +EFIAPI +MmCommunicate ( + IN CONST EFI_MM_COMMUNICATION_PROTOCOL *This, + IN OUT VOID *CommBufferPhysical, + IN OUT UINTN *CommSize OPTIONAL + ); + +/** + Event notification that is fired every time a DxeSmmReadyToLock protocol is added + or if gEfiEventReadyToBootGuid is signaled. + + @param Event The Event that is being processed, not used. + @param Context Event Context, not used. + +**/ +VOID +EFIAPI +MmReadyToLockEventNotify ( + IN EFI_EVENT Event, + IN VOID *Context + ); + +/** + Event notification that is fired when GUIDed Event Group is signaled. + + @param Event The Event that is being processed, not used. + @param Context Event Context, not used. + +**/ +VOID +EFIAPI +MmGuidedEventNotify ( + IN EFI_EVENT Event, + IN VOID *Context + ); + +/** + Event notification that is fired when EndOfDxe Event Group is signaled. + + @param Event The Event that is being processed, not used. + @param Context Event Context, not used. + +**/ +VOID +EFIAPI +MmEndOfDxeEventNotify ( + IN EFI_EVENT Event, + IN VOID *Context + ); + +#endif diff --git a/StandaloneMmPkg/Drivers/MmCommunicationNotifyDxe/MmCommunicationNotifyDxe.inf b/StandaloneMmPkg/Drivers/MmCommunicationNotifyDxe/MmCommunicationNotifyDxe.inf new file mode 100644 index 000000000000..670ae228ea82 --- /dev/null +++ b/StandaloneMmPkg/Drivers/MmCommunicationNotifyDxe/MmCommunicationNotifyDxe.inf @@ -0,0 +1,51 @@ +## @file +# MmCommunicationNotifyDxe driver create the notifications of +# some protocols and event. +# +# Copyright (c) 2025, Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x0001001A + BASE_NAME = MmCommunicationNotifyDxe + FILE_GUID = DE05B887-A2EF-4D81-BFFE-FF9CDE458753 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + PI_SPECIFICATION_VERSION = 0x00010032 + ENTRY_POINT = MmCommunicationNotifyEntryPoint + +[Sources] + MmCommunicationNotifyDxe.c + MmCommunicationNotifyDxe.h + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + UefiCpuPkg/UefiCpuPkg.dec + StandaloneMmPkg/StandaloneMmPkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + BaseLib + DebugLib + HobLib + BaseMemoryLib + UefiBootServicesTableLib + UefiLib + ReportStatusCodeLib + +[Guids] + gMmCommBufferHobGuid + gEfiEndOfDxeEventGroupGuid + gEfiEventExitBootServicesGuid + +[Protocols] + gEfiDxeMmReadyToLockProtocolGuid + gEfiSmmAccess2ProtocolGuid + gEfiMmCommunication2ProtocolGuid + +[Depex] + gEfiMmCommunication2ProtocolGuid diff --git a/StandaloneMmPkg/StandaloneMmPkg.dsc b/StandaloneMmPkg/StandaloneMmPkg.dsc index d36081ef833e..caf0b5078046 100644 --- a/StandaloneMmPkg/StandaloneMmPkg.dsc +++ b/StandaloneMmPkg/StandaloneMmPkg.dsc @@ -96,6 +96,8 @@ [LibraryClasses.common.DXE_RUNTIME_DRIVER] UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf + +[LibraryClasses.common.DXE_RUNTIME_DRIVER, LibraryClasses.common.DXE_DRIVER] UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf @@ -147,6 +149,7 @@ StandaloneMmPkg/Library/SmmLockBoxMmDependency/SmmLockBoxMmDependency.inf StandaloneMmPkg/Library/MmPlatformHobProducerLibNull/MmPlatformHobProducerLibNull.inf StandaloneMmPkg/Drivers/MmCommunicationDxe/MmCommunicationDxe.inf + StandaloneMmPkg/Drivers/MmCommunicationNotifyDxe/MmCommunicationNotifyDxe.inf StandaloneMmPkg/Library/StandaloneMmExtractGuidedSectionLib/StandaloneMmExtractGuidedSectionLib.inf [Components.AARCH64, Components.ARM] From 33a4ea182476d6b488a699775db3fb1935c25cdf Mon Sep 17 00:00:00 2001 From: Ray Ni Date: Wed, 9 Jul 2025 17:07:04 +0800 Subject: [PATCH 0223/1172] edk2/Maintainers.txt: Replace Ray with Jacek for MdeModulePkg/Device Signed-off-by: Ray Ni --- Maintainers.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maintainers.txt b/Maintainers.txt index 0078e9ac4021..ac9e85131dff 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -314,7 +314,7 @@ F: MdeModulePkg/Include/Ppi/StorageSecurityCommand.h F: MdeModulePkg/Include/Protocol/Ps2Policy.h F: MdeModulePkg/Library/NonDiscoverableDeviceRegistrationLib/ F: MdeModulePkg/Universal/PcatSingleSegmentPciCfg2Pei/ -R: Ray Ni [niruiyu] +R: Jacek Kolakowski [jkolakow] MdeModulePkg: Disk modules F: MdeModulePkg/Universal/Disk/ From 27599905c09973a20c1e16f4dc60e0ec5b878591 Mon Sep 17 00:00:00 2001 From: Ray Ni Date: Wed, 9 Jul 2025 17:08:37 +0800 Subject: [PATCH 0224/1172] edk2/Maintainers.txt: Remove Ray for EmulatorPkg Signed-off-by: Ray Ni --- Maintainers.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/Maintainers.txt b/Maintainers.txt index ac9e85131dff..85d53ff635db 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -209,7 +209,6 @@ W: https://github.com/tianocore/tianocore.github.io/wiki/EmulatorPkg M: Oliver Smith-Denny [os-d] M: Andrew Fish [ajfish] M: Michael Kubacki [makubacki] -M: Ray Ni [niruiyu] S: Maintained EmulatorPkg: Redfish-related modules From b61c47632938dddd0d838a1afe38a6fd0d97bcbf Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Tue, 8 Jul 2025 11:07:35 -0400 Subject: [PATCH 0225/1172] pip-requirements.txt: Update pytools Updates pytools to the latest releases to include changes for PR evaluation that include command-line build variable arguments by default in PR evaluation. Versions updated: - edk2-pytool-library v0.23.4 - edk2-pytool-extensions v0.29.11 Full release details are available on the pytool release pages: - https://github.com/tianocore/edk2-pytool-library/releases - https://github.com/tianocore/edk2-pytool-extensions/releases Signed-off-by: Michael Kubacki --- pip-requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pip-requirements.txt b/pip-requirements.txt index 93fadfeabb31..d2365e759025 100644 --- a/pip-requirements.txt +++ b/pip-requirements.txt @@ -12,8 +12,8 @@ # https://www.python.org/dev/peps/pep-0440/#version-specifiers ## -edk2-pytool-library~=0.23.0 -edk2-pytool-extensions~=0.29.0 +edk2-pytool-library~=0.23.4 +edk2-pytool-extensions~=0.29.11 antlr4-python3-runtime==4.9 lcov-cobertura==2.1.1 regex==2024.11.6 From 965a754f19e7f9434e598af6e99f012d462a91bc Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Tue, 8 Jul 2025 11:03:33 -0400 Subject: [PATCH 0226/1172] Revert "OvmfPkg: Pass command-line args to PR Eval" A change was made to the following pytool releases to prevent a platform from needing to include additional logic to consider command-line build variable parameters for PR evaluation. - edk2-pytool-library v0.23.4 - edk2-pytool-extensions v0.29.11 Commit 33e58db was added as a workaround, but that is no longer needed after these pytool updates, so revert it. Signed-off-by: Michael Kubacki --- OvmfPkg/PlatformCI/PlatformBuildLib.py | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/OvmfPkg/PlatformCI/PlatformBuildLib.py b/OvmfPkg/PlatformCI/PlatformBuildLib.py index 6e0b9e4f51a9..19f92ac13ff0 100644 --- a/OvmfPkg/PlatformCI/PlatformBuildLib.py +++ b/OvmfPkg/PlatformCI/PlatformBuildLib.py @@ -110,21 +110,8 @@ def GetPlatformDscAndConfig(self) -> tuple: The tuple should be (, ) ''' - import re - import sys - - cmd_line_input_vars = {} - for arg in sys.argv: - if "=" in arg: - key, value = arg.split("=", 1) - if key.startswith("-"): - continue - if re.match(r"BLD_.+_", key): - key = re.sub(r"^BLD_.+?_", "", key, count=1) - cmd_line_input_vars[key] = value - dsc = CommonPlatform.GetDscName(",".join(self.ActualArchitectures)) - return (f"OvmfPkg/{dsc}", cmd_line_input_vars) + return (f"OvmfPkg/{dsc}", {}) # ####################################################################################### # From e2a30df32e523ec19abd980f9665dee4ab620917 Mon Sep 17 00:00:00 2001 From: Nate DeSimone Date: Wed, 25 Jun 2025 15:48:35 -0700 Subject: [PATCH 0227/1172] BaseTools/tools_def: Use MSVC ABI for CLANGPDB Targets Update the CLANGPDB toolchain configuration to use MSVC ABI targets and retain frame pointers in generated code. This improves compatibility with the Microsoft Debug Interface Access (DIA) SDK and improves debuggability with any debugger that uses the Microsoft PDB parser, for example the Visual Studio debugger or windbg. Without these changes, code generated by the Clang compiler will have a mix of calling conventions. With the current configuration, any function declared with EFIAPI will use the Microsoft x64 calling convention. However, the default calling convention will be the SysV x64 calling convention. This mixing of calling conventions prevents debuggers from decoding the call stack. With these changes, only the Microsoft x64 calling convention will be used. These modifications enable debuggers to properly parse and display call stacks on binaries built with the CLANGPDB toolchain. The changes include: - Switch from GNU ABI target (*-unknown-windowsl-gnu) to MSVC ABI targets (*-pc-windows-msvc) for both IA32 and X64 architectures. - Remove -fseh-exceptions as not supported. - Add -fno-omit-frame-pointer as required for call stack. - Undefine the _MSC_VER macro, and define the __GNUC__ macro, so that pre-processor conditionals will continue to function as expected. Co-authored-by: Muhammad Mustafa Signed-off-by: Nate DeSimone --- BaseTools/Conf/tools_def.template | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index cca699c4a8c9..210894884e7b 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -1932,11 +1932,11 @@ RELEASE_GCC_LOONGARCH64_CC_FLAGS = DEF(GCC5_LOONGARCH64_CC_FLAGS) -Wno-unu DEFINE CLANGPDB_IA32_PREFIX = ENV(CLANG_BIN) DEFINE CLANGPDB_X64_PREFIX = ENV(CLANG_BIN) -DEFINE CLANGPDB_IA32_TARGET = -target i686-unknown-windows-gnu -DEFINE CLANGPDB_X64_TARGET = -target x86_64-unknown-windows-gnu +DEFINE CLANGPDB_IA32_TARGET = -target i686-pc-windows-msvc +DEFINE CLANGPDB_X64_TARGET = -target x86_64-pc-windows-msvc DEFINE CLANGPDB_WARNING_OVERRIDES = -Wno-parentheses-equality -Wno-tautological-compare -Wno-tautological-constant-out-of-range-compare -Wno-empty-body -Wno-unused-const-variable -Wno-varargs -Wno-unknown-warning-option -Wno-unused-but-set-variable -Wno-unused-const-variable -Wno-unaligned-access -Wno-microsoft-enum-forward-reference -DEFINE CLANGPDB_ALL_CC_FLAGS = DEF(GCC48_ALL_CC_FLAGS) DEF(CLANGPDB_WARNING_OVERRIDES) -fno-stack-protector -funsigned-char -ftrap-function=undefined_behavior_has_been_optimized_away_by_clang -Wno-address -Wno-shift-negative-value -Wno-unknown-pragmas -Wno-incompatible-library-redeclaration -Wno-null-dereference -mno-implicit-float -mms-bitfields -mno-stack-arg-probe -nostdlib -nostdlibinc -fseh-exceptions +DEFINE CLANGPDB_ALL_CC_FLAGS = DEF(GCC48_ALL_CC_FLAGS) DEF(CLANGPDB_WARNING_OVERRIDES) -fno-stack-protector -funsigned-char -ftrap-function=undefined_behavior_has_been_optimized_away_by_clang -Wno-address -Wno-shift-negative-value -Wno-unknown-pragmas -Wno-incompatible-library-redeclaration -Wno-null-dereference -mno-implicit-float -mms-bitfields -mno-stack-arg-probe -nostdlib -nostdlibinc -fno-omit-frame-pointer -U _MSC_VER -D __GNUC__ ########################### # CLANGPDB IA32 definitions From 7c2e2d4f1a6fec4caeadc8295f1a7a21364e07ec Mon Sep 17 00:00:00 2001 From: Nate DeSimone Date: Tue, 8 Jul 2025 16:47:08 -0700 Subject: [PATCH 0228/1172] BaseTools/toolsetup.bat: Set IASL_PREFIX when using Mingw-w64 on Windows If IASL_PREFIX is not already defined, then edksetup.bat should set it. This unifies the behavior between Visual Studio and Mingw-w64. Signed-off-by: Nate DeSimone --- BaseTools/set_vsprefix_envs.bat | 7 ++++++- BaseTools/toolsetup.bat | 11 +++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/BaseTools/set_vsprefix_envs.bat b/BaseTools/set_vsprefix_envs.bat index df2c771951c3..5565f615f1c4 100644 --- a/BaseTools/set_vsprefix_envs.bat +++ b/BaseTools/set_vsprefix_envs.bat @@ -242,7 +242,12 @@ if not defined WINDDK3790_PREFIX ( ) if not defined IASL_PREFIX ( - set IASL_PREFIX=C:\ASL\ + if exist "C:\ASL\" ( + set IASL_PREFIX=C:\ASL\ + ) else ( + @echo. + @echo !!! WARNING !!! IASL_PREFIX environment variable is not set + ) ) popd diff --git a/BaseTools/toolsetup.bat b/BaseTools/toolsetup.bat index ac52f7a8ee1f..92eb6823a1bf 100755 --- a/BaseTools/toolsetup.bat +++ b/BaseTools/toolsetup.bat @@ -333,6 +333,17 @@ if defined VS2022 ( call %EDK_TOOLS_PATH%\set_vsprefix_envs.bat call %EDK_TOOLS_PATH%\get_vsvars.bat ) +if defined BASETOOLS_MINGW_BUILD ( + if not defined IASL_PREFIX ( + REM For VS builds this environment variable is set via set_vsprefix_envs.bat + if exist "C:\ASL\" ( + set IASL_PREFIX=C:\ASL\ + ) else ( + @echo. + @echo !!! WARNING !!! IASL_PREFIX environment variable is not set + ) + ) +) if %SCRIPT_ERROR% NEQ 0 ( @echo. @echo !!! ERROR !!! %VSTool% is not installed !!! From a00ad45ea45203052491fe2b25c9393a59c75c53 Mon Sep 17 00:00:00 2001 From: Alok Kulkarni <18198210+akulkar4@users.noreply.github.com> Date: Tue, 1 Mar 2022 12:37:38 -0800 Subject: [PATCH 0229/1172] MdeModulePkg: UsbBusDxe Reset USB port GetPortStatus returns device error. During USB device enumeration, issuing a hot reset on a port is skipped if there is a reset change status already detected on the port. This can happen when enumerating devices after a host controller soft reset (which drives a hot reset down the ports). However, in certain cases an attached device may not be responsive even if the reset change and connection status bits are set. For e.g., according to xHCI spec section 4.19.5.1 the port reset change bits can be set when a hot reset driven on the port transitions to a warm reset and completes with errors. For such instances it is worthwhile to force a hot reset during enumeration to try and recover unresponsive devices. During enumeration check whether querying port status returns EFI_DEVICE_ERROR and try a port reset if there is a device attached to the port. Signed-off-by: Aaron Pop --- MdeModulePkg/Bus/Usb/UsbBusDxe/UsbEnumer.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbEnumer.c b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbEnumer.c index b3a40639f280..713415d86d3c 100644 --- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbEnumer.c +++ b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbEnumer.c @@ -900,12 +900,17 @@ UsbEnumeratePort ( Child = NULL; HubApi = HubIf->HubApi; + // Zero out PortState in case GetPortStatus does not set + // it and we continue on the EFI_DEVICE_ERROR path + PortState.PortStatus = 0; + PortState.PortChangeStatus = 0; + // // Host learns of the new device by polling the hub for port changes. // Status = HubApi->GetPortStatus (HubIf, Port, &PortState); - if (EFI_ERROR (Status)) { + if (EFI_ERROR (Status) && (Status != EFI_DEVICE_ERROR)) { DEBUG ((DEBUG_ERROR, "UsbEnumeratePort: failed to get state of port %d\n", Port)); return Status; } @@ -987,7 +992,9 @@ UsbEnumeratePort ( // Now, new device connected, enumerate and configure the device // DEBUG ((DEBUG_INFO, "UsbEnumeratePort: new device connected at port %d\n", Port)); - if (USB_BIT_IS_SET (PortState.PortChangeStatus, USB_PORT_STAT_C_RESET)) { + if (USB_BIT_IS_SET (PortState.PortChangeStatus, USB_PORT_STAT_C_RESET) && + (Status != EFI_DEVICE_ERROR)) + { Status = UsbEnumerateNewDev (HubIf, Port, FALSE); } else { Status = UsbEnumerateNewDev (HubIf, Port, TRUE); From c2a56930a61d452cc009785e217687b8b199c56d Mon Sep 17 00:00:00 2001 From: Nate DeSimone Date: Tue, 8 Jul 2025 16:59:07 -0700 Subject: [PATCH 0230/1172] CryptoPkg: Add support for IA32 builds using CLANGPDB Implements the _aulldiv() intrinsic function necessary to compile CryptoPkg using the CLANGPDB toolchain. The existing MASM assembly implementation of this function has been converted to NASM to enable it to be used with both the Visual Studio and Clang compilers. Signed-off-by: Nate DeSimone --- .../Ia32/{MathUlldiv.asm => MathUlldiv.nasm} | 49 +++++++++---------- .../Library/IntrinsicLib/IntrinsicLib.inf | 6 ++- 2 files changed, 28 insertions(+), 27 deletions(-) rename CryptoPkg/Library/IntrinsicLib/Ia32/{MathUlldiv.asm => MathUlldiv.nasm} (73%) diff --git a/CryptoPkg/Library/IntrinsicLib/Ia32/MathUlldiv.asm b/CryptoPkg/Library/IntrinsicLib/Ia32/MathUlldiv.nasm similarity index 73% rename from CryptoPkg/Library/IntrinsicLib/Ia32/MathUlldiv.asm rename to CryptoPkg/Library/IntrinsicLib/Ia32/MathUlldiv.nasm index c9f07e3666df..88b07057678f 100644 --- a/CryptoPkg/Library/IntrinsicLib/Ia32/MathUlldiv.asm +++ b/CryptoPkg/Library/IntrinsicLib/Ia32/MathUlldiv.nasm @@ -1,19 +1,19 @@ ;*** -;ulldiv.asm - unsigned long divide routine +;ulldiv.nasm - unsigned long divide routine ; ; Copyright (c) Microsoft Corporation. All rights reserved. +; Copyright (c) 2025, Intel Corporation. All rights reserved. ; SPDX-License-Identifier: BSD-2-Clause-Patent ; ;Purpose: ; defines the unsigned long divide routine ; __aulldiv ; -;Original Implemenation: MSVC 14.29.30133 +;Original Implementation: MSVC 14.29.30133 ; ;******************************************************************************* - .686 - .model flat,C - .code + + SECTION .text ;*** ;ulldiv - unsigned long divide @@ -37,10 +37,11 @@ ;Exceptions: ; ;******************************************************************************* -_aulldiv PROC NEAR +global ASM_PFX(_aulldiv) +ASM_PFX(_aulldiv): -HIWORD EQU [4] ; -LOWORD EQU [0] +%define HIWORD_OFFSET 4 +%define LOWORD_OFFSET 0 push ebx push esi @@ -68,8 +69,10 @@ LOWORD EQU [0] ; ----------------- ; -DVND equ [esp + 12] ; stack address of dividend (a) -DVSR equ [esp + 20] ; stack address of divisor (b) +; stack offset of dividend (a) +%define DVND_OFFSET 12 +; stack offset of divisor (b) +%define DVSR_OFFSET 20 ; ; Now do the divide. First look to see if the divisor is less than 4194304K. @@ -77,15 +80,15 @@ DVSR equ [esp + 20] ; stack address of divisor (b) ; things get a little more complex. ; - mov eax,HIWORD(DVSR) ; check to see if divisor < 4194304K + mov eax, dword [esp + DVSR_OFFSET + HIWORD_OFFSET] ; check to see if divisor < 4194304K or eax,eax jnz short L1 ; nope, gotta do this the hard way - mov ecx,LOWORD(DVSR) ; load divisor - mov eax,HIWORD(DVND) ; load high word of dividend + mov ecx, dword [esp + DVSR_OFFSET + LOWORD_OFFSET] ; load divisor + mov eax, dword [esp + DVND_OFFSET + HIWORD_OFFSET] ; load high word of dividend xor edx,edx div ecx ; get high order bits of quotient mov ebx,eax ; save high bits of quotient - mov eax,LOWORD(DVND) ; edx:eax <- remainder:lo word of dividend + mov eax, dword [esp + DVND_OFFSET + LOWORD_OFFSET] ; edx:eax <- remainder:lo word of dividend div ecx ; get low order bits of quotient mov edx,ebx ; edx:eax <- quotient hi:quotient lo jmp short L2 ; restore stack and return @@ -96,9 +99,9 @@ DVSR equ [esp + 20] ; stack address of divisor (b) L1: mov ecx,eax ; ecx:ebx <- divisor - mov ebx,LOWORD(DVSR) - mov edx,HIWORD(DVND) ; edx:eax <- dividend - mov eax,LOWORD(DVND) + mov ebx, dword [esp + DVSR_OFFSET + LOWORD_OFFSET] + mov edx, dword [esp + DVND_OFFSET + HIWORD_OFFSET] ; edx:eax <- dividend + mov eax, dword [esp + DVND_OFFSET + LOWORD_OFFSET] L3: shr ecx,1 ; shift divisor right one bit; hi bit <- 0 rcr ebx,1 @@ -116,9 +119,9 @@ L3: ; dividend is close to 2**64 and the quotient is off by 1. ; - mul dword ptr HIWORD(DVSR) ; QUOT * HIWORD(DVSR) + mul dword [esp + DVSR_OFFSET + HIWORD_OFFSET] ; QUOT * HIWORD(DVSR) mov ecx,eax - mov eax,LOWORD(DVSR) + mov eax, dword [esp + DVSR_OFFSET + LOWORD_OFFSET] mul esi ; QUOT * LOWORD(DVSR) add edx,ecx ; EDX:EAX = QUOT * DVSR jc short L4 ; carry means Quotient is off by 1 @@ -129,10 +132,10 @@ L3: ; subtract one (1) from the quotient. ; - cmp edx,HIWORD(DVND) ; compare hi words of result and original + cmp edx, dword [esp + DVND_OFFSET + HIWORD_OFFSET] ; compare hi words of result and original ja short L4 ; if result > original, do subtract jb short L5 ; if result < original, we are ok - cmp eax,LOWORD(DVND) ; hi words are equal, compare lo words + cmp eax, dword [esp + DVND_OFFSET + LOWORD_OFFSET] ; hi words are equal, compare lo words jbe short L5 ; if less or equal we are ok, else subtract L4: dec esi ; subtract 1 from quotient @@ -151,7 +154,3 @@ L2: pop ebx ret 16 - -_aulldiv ENDP - - end diff --git a/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf b/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf index e5fa3a94c9d3..8c3951d8c0ff 100644 --- a/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf +++ b/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf @@ -1,7 +1,7 @@ ## @file # Intrinsic Routines Wrapper Library Instance. # -# Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.
+# Copyright (c) 2010 - 2025, Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent # ## @@ -33,7 +33,7 @@ Ia32/MathFtol.c | MSFT Ia32/MathLlmul.asm | MSFT Ia32/MathLlshr.asm | MSFT - Ia32/MathUlldiv.asm | MSFT + Ia32/MathUlldiv.nasm | MSFT Ia32/MathUlldvrm.asm | MSFT Ia32/MathLldiv.asm | MSFT Ia32/MathUllrem.asm | MSFT @@ -48,6 +48,8 @@ Ia32/MathDivS64x64.c | GCC Ia32/MathDivU64x64.c | GCC Ia32/MathModU64x64.c | GCC + + Ia32/MathUlldiv.nasm | CLANGPDB [Sources.X64] CopyMem.c Math.c | GCC From a1b509c1a453815acbc6c8b0fc5882fd03a6f2c0 Mon Sep 17 00:00:00 2001 From: Eduardo Cuevas Farfan Date: Wed, 9 Jul 2025 14:04:38 -0700 Subject: [PATCH 0231/1172] Maintainers.txt: Update reviewer for StandaloneMmPkg and UefiCpuPkg Add ecuevasf as reviewer for StandaloneMmPkg and UefiCpuPkg Signed-off-by: Eduardo Cuevas Farfan --- Maintainers.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Maintainers.txt b/Maintainers.txt index 85d53ff635db..93910396fa73 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -647,6 +647,7 @@ M: Ray Ni [niruiyu] R: Jiaxin Wu [jiaxinwu] R: Dun Tan [td36] R: Khor Swee Aun [sweeaun] +R: Eduardo Cuevas Farfan [ecuevasf] UefiCpuPkg F: UefiCpuPkg/ @@ -658,6 +659,7 @@ R: Dun Tan [td36] R: Rahul Kumar [rahul1-kumar] R: Gerd Hoffmann [kraxel] R: Star Zeng [lzeng14] +R: Eduardo Cuevas Farfan [ecuevasf] UefiCpuPkg: AMD related files F: UefiCpuPkg/Library/MmSaveStateLib/*Amd*.* From dbf45a870b89fb9e307c41c66949288518c24440 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Tue, 17 Jun 2025 09:08:44 -0700 Subject: [PATCH 0232/1172] MdePkg: Add DEBUG_SECURITY Bit in PcdDebugPrintErrorLevel Tcg2Dxe and its libraries are currently the noisiest modules in edk2. For a sample platform printing at INFO level, Tcg2Dxe printed 4,000 lines out of 5,700 total lines printed. This commit defines a DEBUG_SECURITY bit to control the debug output of Tcg2Dxe and other security related components. Most of the output is not useful except for deep debugging of TPM transactions, so it is appropriate to only print when the DEBUG_SECURITY bit is present. Signed-off-by: Oliver Smith-Denny --- MdePkg/Include/Library/DebugLib.h | 3 ++- MdePkg/MdePkg.dec | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/MdePkg/Include/Library/DebugLib.h b/MdePkg/Include/Library/DebugLib.h index b48e08a7e42b..915844b78be5 100644 --- a/MdePkg/Include/Library/DebugLib.h +++ b/MdePkg/Include/Library/DebugLib.h @@ -57,7 +57,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent // significantly impact boot performance #define DEBUG_MANAGEABILITY 0x00800000 // Detailed debug and payload manageability messages // related to modules such as Redfish, IPMI, MCTP etc. -#define DEBUG_ERROR 0x80000000 // Error +#define DEBUG_SECURITY 0x01000000 // Security and security HW related messages, such as TPM +#define DEBUG_ERROR 0x80000000 // Error // // Aliases of debug message mask bits diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index ea8bf0f4db1e..842abaaa75d9 100644 --- a/MdePkg/MdePkg.dec +++ b/MdePkg/MdePkg.dec @@ -2292,6 +2292,7 @@ # BIT21 - Memory range cachability changes message.
# BIT22 - Detailed debug message.
# BIT23 - Manageability debug message.
+ # BIT24 - Security debug message.
# BIT31 - Error message.
# @Prompt Fixed Debug Message Print Level. gEfiMdePkgTokenSpaceGuid.PcdFixedDebugPrintErrorLevel|0xFFFFFFFF|UINT32|0x30001016 @@ -2399,6 +2400,7 @@ # BIT21 - Memory range cachability changes message.
# BIT22 - Detailed debug message.
# BIT23 - Manageability messages.
+ # BIT24 - Security debug message.
# BIT31 - Error message.
# @Prompt Debug Message Print Level. # @Expression 0x80000002 | (gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel & 0x7F84AA00) == 0 From 1f2adcbba571faead4795bfbeeb232e82166c901 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Thu, 1 May 2025 12:55:03 -0700 Subject: [PATCH 0233/1172] SecurityPkg: Remove/Downgrade Noisy TCG Prints The TCG code is very noisy when a TPM is connected. This commit downgrades some prints to verbose and removes some others that do not have value (such as function enter and exit prints). Signed-off-by: Oliver Smith-Denny --- .../DxeTpm2MeasureBootLib.c | 18 ------------------ .../Library/Tpm2CommandLib/Tpm2Capability.c | 4 +--- .../Library/Tpm2CommandLib/Tpm2Integrity.c | 2 -- SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c | 14 -------------- 4 files changed, 1 insertion(+), 37 deletions(-) diff --git a/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c b/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c index 73719f3b96ed..acba11d69561 100644 --- a/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c +++ b/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c @@ -323,8 +323,6 @@ Tcg2MeasureGptTable ( if (!EFI_ERROR (Status)) { mTcg2MeasureGptCount++; } - - DEBUG ((DEBUG_INFO, "DxeTpm2MeasureBootHandler - Cc MeasureGptTable - %r\n", Status)); } else if (Tcg2Protocol != NULL) { // // If Tcg2Protocol is installed, then Measure GPT data with this protocol. @@ -339,8 +337,6 @@ Tcg2MeasureGptTable ( if (!EFI_ERROR (Status)) { mTcg2MeasureGptCount++; } - - DEBUG ((DEBUG_INFO, "DxeTpm2MeasureBootHandler - Tcg2 MeasureGptTable - %r\n", Status)); } Exit: @@ -492,7 +488,6 @@ Tcg2MeasurePeImage ( ImageSize, CcEvent ); - DEBUG ((DEBUG_INFO, "DxeTpm2MeasureBootHandler - Cc MeasurePeImage - %r\n", Status)); } else if (Tcg2Protocol != NULL) { Status = Tcg2Protocol->HashLogExtendEvent ( Tcg2Protocol, @@ -501,7 +496,6 @@ Tcg2MeasurePeImage ( ImageSize, Tcg2Event ); - DEBUG ((DEBUG_INFO, "DxeTpm2MeasureBootHandler - Tcg2 MeasurePeImage - %r\n", Status)); } if (Status == EFI_VOLUME_FULL) { @@ -659,15 +653,6 @@ DxeTpm2MeasureBootHandler ( return EFI_SUCCESS; } - DEBUG ( - ( - DEBUG_INFO, - "Tcg2Protocol = %p, CcMeasurementProtocol = %p\n", - MeasureBootProtocols.Tcg2Protocol, - MeasureBootProtocols.CcProtocol - ) - ); - // // Copy File Device Path // @@ -853,7 +838,6 @@ DxeTpm2MeasureBootHandler ( TRUE ); if (ToText != NULL) { - DEBUG ((DEBUG_INFO, "The measured image path is %s.\n", ToText)); FreePool (ToText); } @@ -880,8 +864,6 @@ DxeTpm2MeasureBootHandler ( FreePool (OrigDevicePathNode); } - DEBUG ((DEBUG_INFO, "DxeTpm2MeasureBootHandler - %r\n", Status)); - return Status; } diff --git a/SecurityPkg/Library/Tpm2CommandLib/Tpm2Capability.c b/SecurityPkg/Library/Tpm2CommandLib/Tpm2Capability.c index 3dd5f2edd9aa..b15f72cabaa6 100644 --- a/SecurityPkg/Library/Tpm2CommandLib/Tpm2Capability.c +++ b/SecurityPkg/Library/Tpm2CommandLib/Tpm2Capability.c @@ -537,8 +537,7 @@ Tpm2GetCapabilitySupportedAndActivePcrs ( // // Get supported PCR // - Status = Tpm2GetCapabilityPcrs (&Pcrs); - DEBUG ((DEBUG_INFO, "Supported PCRs - Count = %08x\n", Pcrs.count)); + Status = Tpm2GetCapabilityPcrs (&Pcrs); ActivePcrBankCount = 0; // // If error, assume that we have at least SHA-1 (and return the error.) @@ -616,7 +615,6 @@ Tpm2GetCapabilitySupportedAndActivePcrs ( } } - DEBUG ((DEBUG_INFO, "GetSupportedAndActivePcrs - Count = %08x\n", ActivePcrBankCount)); return Status; } diff --git a/SecurityPkg/Library/Tpm2CommandLib/Tpm2Integrity.c b/SecurityPkg/Library/Tpm2CommandLib/Tpm2Integrity.c index 94e93b26428f..0142cba64476 100644 --- a/SecurityPkg/Library/Tpm2CommandLib/Tpm2Integrity.c +++ b/SecurityPkg/Library/Tpm2CommandLib/Tpm2Integrity.c @@ -773,8 +773,6 @@ Tpm2PcrReadForActiveBank ( ZeroMem (&PcrValues, sizeof (PcrValues)); ZeroMem (&Pcrs, sizeof (TPML_PCR_SELECTION)); - DEBUG ((DEBUG_INFO, "ReadPcr - %02d\n", PcrIndex)); - // // Read TPM capabilities // diff --git a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c index 4d0c241f4dea..e063719bc267 100644 --- a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c +++ b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c @@ -718,8 +718,6 @@ Tcg2GetEventLog ( { UINTN Index; - DEBUG ((DEBUG_INFO, "Tcg2GetEventLog ... (0x%x)\n", EventLogFormat)); - if (This == NULL) { return EFI_INVALID_PARAMETER; } @@ -756,7 +754,6 @@ Tcg2GetEventLog ( if (EventLogLocation != NULL) { *EventLogLocation = mTcgDxeData.EventLogAreaStruct[Index].Lasa; - DEBUG ((DEBUG_INFO, "Tcg2GetEventLog (EventLogLocation - %x)\n", *EventLogLocation)); } if (EventLogLastEntry != NULL) { @@ -765,17 +762,12 @@ Tcg2GetEventLog ( } else { *EventLogLastEntry = (EFI_PHYSICAL_ADDRESS)(UINTN)mTcgDxeData.EventLogAreaStruct[Index].LastEvent; } - - DEBUG ((DEBUG_INFO, "Tcg2GetEventLog (EventLogLastEntry - %x)\n", *EventLogLastEntry)); } if (EventLogTruncated != NULL) { *EventLogTruncated = mTcgDxeData.EventLogAreaStruct[Index].EventLogTruncated; - DEBUG ((DEBUG_INFO, "Tcg2GetEventLog (EventLogTruncated - %x)\n", *EventLogTruncated)); } - DEBUG ((DEBUG_INFO, "Tcg2GetEventLog - %r\n", EFI_SUCCESS)); - // Dump Event Log for debug purpose if ((EventLogLocation != NULL) && (EventLogLastEntry != NULL)) { DumpEventLog (EventLogFormat, *EventLogLocation, *EventLogLastEntry, mTcgDxeData.FinalEventsTable[Index]); @@ -1132,12 +1124,9 @@ TcgDxeLogHashEvent ( UINT8 *DigestBuffer; UINT32 *EventSizePtr; - DEBUG ((DEBUG_INFO, "SupportedEventLogs - 0x%08x\n", mTcgDxeData.BsCap.SupportedEventLogs)); - RetStatus = EFI_SUCCESS; for (Index = 0; Index < sizeof (mTcg2EventInfo)/sizeof (mTcg2EventInfo[0]); Index++) { if ((mTcgDxeData.BsCap.SupportedEventLogs & mTcg2EventInfo[Index].LogFormat) != 0) { - DEBUG ((DEBUG_INFO, " LogFormat - 0x%08x\n", mTcg2EventInfo[Index].LogFormat)); switch (mTcg2EventInfo[Index].LogFormat) { case EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2: Status = GetDigestFromDigestList (TPM_ALG_SHA1, DigestList, &NewEventHdr->Digest); @@ -1406,8 +1395,6 @@ Tcg2SubmitCommand ( { EFI_STATUS Status; - DEBUG ((DEBUG_INFO, "Tcg2SubmitCommand ...\n")); - if ((This == NULL) || (InputParameterBlockSize == 0) || (InputParameterBlock == NULL) || (OutputParameterBlockSize == 0) || (OutputParameterBlock == NULL)) @@ -1433,7 +1420,6 @@ Tcg2SubmitCommand ( &OutputParameterBlockSize, OutputParameterBlock ); - DEBUG ((DEBUG_INFO, "Tcg2SubmitCommand - %r\n", Status)); return Status; } From d5b86303792d44db5b94636b920547340c4fca61 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Tue, 17 Jun 2025 09:53:55 -0700 Subject: [PATCH 0234/1172] SecurityPkg: Move Noisy Logs to DEBUG_SECURITY The TPM code is currently very noisy (e.g. in a sample platform, 4,000 of the 5,700 lines printed to the serial port at DEBUG_INFO level were from the TPM code). For TPM debugging, this is very critical information, but for most builds it simply spams the logs and slows down the build. This commit moves the event log and PCR dumping to log at DEBUG_SECURITY level. Signed-off-by: Oliver Smith-Denny --- .../Library/Tpm2CommandLib/Tpm2Integrity.c | 26 +++-- SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c | 108 +++++++++--------- 2 files changed, 70 insertions(+), 64 deletions(-) diff --git a/SecurityPkg/Library/Tpm2CommandLib/Tpm2Integrity.c b/SecurityPkg/Library/Tpm2CommandLib/Tpm2Integrity.c index 0142cba64476..581b05d134d2 100644 --- a/SecurityPkg/Library/Tpm2CommandLib/Tpm2Integrity.c +++ b/SecurityPkg/Library/Tpm2CommandLib/Tpm2Integrity.c @@ -866,19 +866,21 @@ Tpm2PcrReadForActiveBank ( return EFI_DEVICE_ERROR; } - for (Index = 0; Index < PcrValues.count; Index++) { - DEBUG (( - DEBUG_INFO, - "ReadPcr - HashAlg = 0x%04x, Pcr[%02d], digest = ", - PcrSelectionOut.pcrSelections[Index].hash, - PcrIndex - )); - - for (Index2 = 0; Index2 < PcrValues.digests[Index].size; Index2++) { - DEBUG ((DEBUG_INFO, "%02x ", PcrValues.digests[Index].buffer[Index2])); + if (DebugPrintLevelEnabled (DEBUG_SECURITY)) { + for (Index = 0; Index < PcrValues.count; Index++) { + DEBUG (( + DEBUG_SECURITY, + "ReadPcr - HashAlg = 0x%04x, Pcr[%02d], digest = ", + PcrSelectionOut.pcrSelections[Index].hash, + PcrIndex + )); + + for (Index2 = 0; Index2 < PcrValues.digests[Index].size; Index2++) { + DEBUG ((DEBUG_SECURITY, "%02x ", PcrValues.digests[Index].buffer[Index2])); + } + + DEBUG ((DEBUG_SECURITY, "\n")); } - - DEBUG ((DEBUG_INFO, "\n")); } if (HashList != NULL) { diff --git a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c index e063719bc267..24a27cd6f3ff 100644 --- a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c +++ b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c @@ -145,7 +145,7 @@ MeasurePeImageAndExtend ( /** - This function dump raw data. + This function dumps raw data. @param Data raw data @param Size raw data size @@ -160,7 +160,7 @@ InternalDumpData ( UINTN Index; for (Index = 0; Index < Size; Index++) { - DEBUG ((DEBUG_INFO, "%02x", (UINTN)Data[Index])); + DEBUG ((DEBUG_SECURITY, "%02x", (UINTN)Data[Index])); } } @@ -242,7 +242,7 @@ InitNoActionEvent ( /** - This function dump raw data with colume format. + This function dumps raw data in columns. @param Data raw data @param Size raw data size @@ -263,15 +263,15 @@ InternalDumpHex ( Count = Size / COLUME_SIZE; Left = Size % COLUME_SIZE; for (Index = 0; Index < Count; Index++) { - DEBUG ((DEBUG_INFO, "%04x: ", Index * COLUME_SIZE)); + DEBUG ((DEBUG_SECURITY, "%04x: ", Index * COLUME_SIZE)); InternalDumpData (Data + Index * COLUME_SIZE, COLUME_SIZE); - DEBUG ((DEBUG_INFO, "\n")); + DEBUG ((DEBUG_SECURITY, "\n")); } if (Left != 0) { - DEBUG ((DEBUG_INFO, "%04x: ", Index * COLUME_SIZE)); + DEBUG ((DEBUG_SECURITY, "%04x: ", Index * COLUME_SIZE)); InternalDumpData (Data + Index * COLUME_SIZE, Left); - DEBUG ((DEBUG_INFO, "\n")); + DEBUG ((DEBUG_SECURITY, "\n")); } } @@ -420,7 +420,7 @@ Tcg2GetCapability ( } /** - This function dump PCR event. + This function dumps PCR events. @param[in] EventHdr TCG PCR event structure. **/ @@ -431,21 +431,21 @@ DumpEvent ( { UINTN Index; - DEBUG ((DEBUG_INFO, " Event:\n")); - DEBUG ((DEBUG_INFO, " PCRIndex - %d\n", EventHdr->PCRIndex)); - DEBUG ((DEBUG_INFO, " EventType - 0x%08x\n", EventHdr->EventType)); - DEBUG ((DEBUG_INFO, " Digest - ")); + DEBUG ((DEBUG_SECURITY, " Event:\n")); + DEBUG ((DEBUG_SECURITY, " PCRIndex - %d\n", EventHdr->PCRIndex)); + DEBUG ((DEBUG_SECURITY, " EventType - 0x%08x\n", EventHdr->EventType)); + DEBUG ((DEBUG_SECURITY, " Digest - ")); for (Index = 0; Index < sizeof (TCG_DIGEST); Index++) { - DEBUG ((DEBUG_INFO, "%02x ", EventHdr->Digest.digest[Index])); + DEBUG ((DEBUG_SECURITY, "%02x ", EventHdr->Digest.digest[Index])); } - DEBUG ((DEBUG_INFO, "\n")); - DEBUG ((DEBUG_INFO, " EventSize - 0x%08x\n", EventHdr->EventSize)); + DEBUG ((DEBUG_SECURITY, "\n")); + DEBUG ((DEBUG_SECURITY, " EventSize - 0x%08x\n", EventHdr->EventSize)); InternalDumpHex ((UINT8 *)(EventHdr + 1), EventHdr->EventSize); } /** - This function dump TCG_EfiSpecIDEventStruct. + This function dumps the TCG_EfiSpecIDEventStruct. @param[in] TcgEfiSpecIdEventStruct A pointer to TCG_EfiSpecIDEventStruct. **/ @@ -460,36 +460,36 @@ DumpTcgEfiSpecIdEventStruct ( UINT8 *VendorInfo; UINT32 NumberOfAlgorithms; - DEBUG ((DEBUG_INFO, " TCG_EfiSpecIDEventStruct:\n")); - DEBUG ((DEBUG_INFO, " signature - '")); + DEBUG ((DEBUG_SECURITY, " TCG_EfiSpecIDEventStruct:\n")); + DEBUG ((DEBUG_SECURITY, " signature - '")); for (Index = 0; Index < sizeof (TcgEfiSpecIdEventStruct->signature); Index++) { - DEBUG ((DEBUG_INFO, "%c", TcgEfiSpecIdEventStruct->signature[Index])); + DEBUG ((DEBUG_SECURITY, "%c", TcgEfiSpecIdEventStruct->signature[Index])); } - DEBUG ((DEBUG_INFO, "'\n")); - DEBUG ((DEBUG_INFO, " platformClass - 0x%08x\n", TcgEfiSpecIdEventStruct->platformClass)); - DEBUG ((DEBUG_INFO, " specVersion - %d.%d%d\n", TcgEfiSpecIdEventStruct->specVersionMajor, TcgEfiSpecIdEventStruct->specVersionMinor, TcgEfiSpecIdEventStruct->specErrata)); - DEBUG ((DEBUG_INFO, " uintnSize - 0x%02x\n", TcgEfiSpecIdEventStruct->uintnSize)); + DEBUG ((DEBUG_SECURITY, "'\n")); + DEBUG ((DEBUG_SECURITY, " platformClass - 0x%08x\n", TcgEfiSpecIdEventStruct->platformClass)); + DEBUG ((DEBUG_SECURITY, " specVersion - %d.%d%d\n", TcgEfiSpecIdEventStruct->specVersionMajor, TcgEfiSpecIdEventStruct->specVersionMinor, TcgEfiSpecIdEventStruct->specErrata)); + DEBUG ((DEBUG_SECURITY, " uintnSize - 0x%02x\n", TcgEfiSpecIdEventStruct->uintnSize)); CopyMem (&NumberOfAlgorithms, TcgEfiSpecIdEventStruct + 1, sizeof (NumberOfAlgorithms)); - DEBUG ((DEBUG_INFO, " NumberOfAlgorithms - 0x%08x\n", NumberOfAlgorithms)); + DEBUG ((DEBUG_SECURITY, " NumberOfAlgorithms - 0x%08x\n", NumberOfAlgorithms)); DigestSize = (TCG_EfiSpecIdEventAlgorithmSize *)((UINT8 *)TcgEfiSpecIdEventStruct + sizeof (*TcgEfiSpecIdEventStruct) + sizeof (NumberOfAlgorithms)); for (Index = 0; Index < NumberOfAlgorithms; Index++) { - DEBUG ((DEBUG_INFO, " digest(%d)\n", Index)); - DEBUG ((DEBUG_INFO, " algorithmId - 0x%04x\n", DigestSize[Index].algorithmId)); - DEBUG ((DEBUG_INFO, " digestSize - 0x%04x\n", DigestSize[Index].digestSize)); + DEBUG ((DEBUG_SECURITY, " digest(%d)\n", Index)); + DEBUG ((DEBUG_SECURITY, " algorithmId - 0x%04x\n", DigestSize[Index].algorithmId)); + DEBUG ((DEBUG_SECURITY, " digestSize - 0x%04x\n", DigestSize[Index].digestSize)); } VendorInfoSize = (UINT8 *)&DigestSize[NumberOfAlgorithms]; - DEBUG ((DEBUG_INFO, " VendorInfoSize - 0x%02x\n", *VendorInfoSize)); + DEBUG ((DEBUG_SECURITY, " VendorInfoSize - 0x%02x\n", *VendorInfoSize)); VendorInfo = VendorInfoSize + 1; - DEBUG ((DEBUG_INFO, " VendorInfo - ")); + DEBUG ((DEBUG_SECURITY, " VendorInfo - ")); for (Index = 0; Index < *VendorInfoSize; Index++) { - DEBUG ((DEBUG_INFO, "%02x ", VendorInfo[Index])); + DEBUG ((DEBUG_SECURITY, "%02x ", VendorInfo[Index])); } - DEBUG ((DEBUG_INFO, "\n")); + DEBUG ((DEBUG_SECURITY, "\n")); } /** @@ -514,7 +514,7 @@ GetTcgEfiSpecIdEventStructSize ( } /** - This function dump PCR event 2. + This function dumps PCR event 2 structures. @param[in] TcgPcrEvent2 TCG PCR event 2 structure. **/ @@ -532,24 +532,24 @@ DumpEvent2 ( UINT32 EventSize; UINT8 *EventBuffer; - DEBUG ((DEBUG_INFO, " Event:\n")); - DEBUG ((DEBUG_INFO, " PCRIndex - %d\n", TcgPcrEvent2->PCRIndex)); - DEBUG ((DEBUG_INFO, " EventType - 0x%08x\n", TcgPcrEvent2->EventType)); + DEBUG ((DEBUG_SECURITY, " Event:\n")); + DEBUG ((DEBUG_SECURITY, " PCRIndex - %d\n", TcgPcrEvent2->PCRIndex)); + DEBUG ((DEBUG_SECURITY, " EventType - 0x%08x\n", TcgPcrEvent2->EventType)); - DEBUG ((DEBUG_INFO, " DigestCount: 0x%08x\n", TcgPcrEvent2->Digest.count)); + DEBUG ((DEBUG_SECURITY, " DigestCount: 0x%08x\n", TcgPcrEvent2->Digest.count)); DigestCount = TcgPcrEvent2->Digest.count; HashAlgo = TcgPcrEvent2->Digest.digests[0].hashAlg; DigestBuffer = (UINT8 *)&TcgPcrEvent2->Digest.digests[0].digest; for (DigestIndex = 0; DigestIndex < DigestCount; DigestIndex++) { - DEBUG ((DEBUG_INFO, " HashAlgo : 0x%04x\n", HashAlgo)); - DEBUG ((DEBUG_INFO, " Digest(%d): ", DigestIndex)); + DEBUG ((DEBUG_SECURITY, " HashAlgo : 0x%04x\n", HashAlgo)); + DEBUG ((DEBUG_SECURITY, " Digest(%d): ", DigestIndex)); DigestSize = GetHashSizeFromAlgo (HashAlgo); for (Index = 0; Index < DigestSize; Index++) { - DEBUG ((DEBUG_INFO, "%02x ", DigestBuffer[Index])); + DEBUG ((DEBUG_SECURITY, "%02x ", DigestBuffer[Index])); } - DEBUG ((DEBUG_INFO, "\n")); + DEBUG ((DEBUG_SECURITY, "\n")); // // Prepare next // @@ -557,11 +557,11 @@ DumpEvent2 ( DigestBuffer = DigestBuffer + DigestSize + sizeof (TPMI_ALG_HASH); } - DEBUG ((DEBUG_INFO, "\n")); + DEBUG ((DEBUG_SECURITY, "\n")); DigestBuffer = DigestBuffer - sizeof (TPMI_ALG_HASH); CopyMem (&EventSize, DigestBuffer, sizeof (TcgPcrEvent2->EventSize)); - DEBUG ((DEBUG_INFO, " EventSize - 0x%08x\n", EventSize)); + DEBUG ((DEBUG_SECURITY, " EventSize - 0x%08x\n", EventSize)); EventBuffer = DigestBuffer + sizeof (TcgPcrEvent2->EventSize); InternalDumpHex (EventBuffer, EventSize); } @@ -607,7 +607,7 @@ GetPcrEvent2Size ( } /** - This function dump event log. + This function dumps the event log. @param[in] EventLogFormat The type of the event log for which the information is requested. @param[in] EventLogLocation A pointer to the memory address of the event log. @@ -628,7 +628,11 @@ DumpEventLog ( TCG_EfiSpecIDEventStruct *TcgEfiSpecIdEventStruct; UINTN NumberOfEvents; - DEBUG ((DEBUG_INFO, "EventLogFormat: (0x%x)\n", EventLogFormat)); + if (!DebugPrintLevelEnabled (DEBUG_SECURITY)) { + return; + } + + DEBUG ((DEBUG_SECURITY, "EventLogFormat: (0x%x)\n", EventLogFormat)); switch (EventLogFormat) { case EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2: @@ -639,11 +643,11 @@ DumpEventLog ( } if (FinalEventsTable == NULL) { - DEBUG ((DEBUG_INFO, "FinalEventsTable: NOT FOUND\n")); + DEBUG ((DEBUG_SECURITY, "FinalEventsTable: NOT FOUND\n")); } else { - DEBUG ((DEBUG_INFO, "FinalEventsTable: (0x%x)\n", FinalEventsTable)); - DEBUG ((DEBUG_INFO, " Version: (0x%x)\n", FinalEventsTable->Version)); - DEBUG ((DEBUG_INFO, " NumberOfEvents: (0x%x)\n", FinalEventsTable->NumberOfEvents)); + DEBUG ((DEBUG_SECURITY, "FinalEventsTable: (0x%x)\n", FinalEventsTable)); + DEBUG ((DEBUG_SECURITY, " Version: (0x%x)\n", FinalEventsTable->Version)); + DEBUG ((DEBUG_SECURITY, " NumberOfEvents: (0x%x)\n", FinalEventsTable->NumberOfEvents)); EventHdr = (TCG_PCR_EVENT_HDR *)(UINTN)(FinalEventsTable + 1); for (NumberOfEvents = 0; NumberOfEvents < FinalEventsTable->NumberOfEvents; NumberOfEvents++) { @@ -670,11 +674,11 @@ DumpEventLog ( } if (FinalEventsTable == NULL) { - DEBUG ((DEBUG_INFO, "FinalEventsTable: NOT FOUND\n")); + DEBUG ((DEBUG_SECURITY, "FinalEventsTable: NOT FOUND\n")); } else { - DEBUG ((DEBUG_INFO, "FinalEventsTable: (0x%x)\n", FinalEventsTable)); - DEBUG ((DEBUG_INFO, " Version: (0x%x)\n", FinalEventsTable->Version)); - DEBUG ((DEBUG_INFO, " NumberOfEvents: (0x%x)\n", FinalEventsTable->NumberOfEvents)); + DEBUG ((DEBUG_SECURITY, "FinalEventsTable: (0x%x)\n", FinalEventsTable)); + DEBUG ((DEBUG_SECURITY, " Version: (0x%x)\n", FinalEventsTable->Version)); + DEBUG ((DEBUG_SECURITY, " NumberOfEvents: (0x%x)\n", FinalEventsTable->NumberOfEvents)); TcgPcrEvent2 = (TCG_PCR_EVENT2 *)(UINTN)(FinalEventsTable + 1); for (NumberOfEvents = 0; NumberOfEvents < FinalEventsTable->NumberOfEvents; NumberOfEvents++) { From 460f2705b4cf17198d10a8053ed03c88b4de8d00 Mon Sep 17 00:00:00 2001 From: Bret Barkelew Date: Fri, 6 Mar 2020 18:02:37 -0800 Subject: [PATCH 0235/1172] SecurityPkg: Add Additional TPM Logging at DEBUG_SECURITY This commit adds additional dumping logic to Tpm2DeviceLibDTpm, print at DEBUG_SECURITY to aid in TPM debugging. Signed-off-by: Oliver Smith-Denny Co-authored-by: Bret Barkelew --- .../Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf | 1 + .../Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c | 736 ++++++++++++++++++ .../Tpm2DeviceLibDTpmStandaloneMm.inf | 1 + .../Tpm2DeviceLibDTpmSvsm.inf | 1 + .../Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpm.inf | 1 + .../Tpm2InstanceLibDTpmSvsm.inf | 1 + .../Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c | 37 +- .../Library/Tpm2DeviceLibDTpm/Tpm2Ptp.h | 31 + .../Library/Tpm2DeviceLibDTpm/Tpm2Tis.c | 41 +- 9 files changed, 779 insertions(+), 71 deletions(-) create mode 100644 SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf index be3a0053ccce..ebf43ba4ac64 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf @@ -37,6 +37,7 @@ Tpm2DeviceLibDTpm.c Tpm2DeviceLibDTpmBase.c Tpm2DeviceLibDTpm.h + Tpm2DeviceLibDTpmDump.c [Packages] MdePkg/MdePkg.dec diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c new file mode 100644 index 000000000000..c83838f2b05a --- /dev/null +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c @@ -0,0 +1,736 @@ +/** @file -- Tpm2DeviceLibDTpmDump.c +This file contains helper functions to perform a detailed debugging of +TPM transactions as they go to and from the TPM device. + +Copyright (c) Microsoft Corporation. +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include + +#include + +#include "Tpm2Ptp.h" + +#define MAX_TPM_BUFFER_DUMP 240 // If printing an entire buffer, only print up to MAX bytes. + +#pragma pack(1) + +// TPM2_PCR_COMMON_COMMAND - The common fields shared between the PCR Extend +// and PCR Event commands. +typedef struct { + TPM2_COMMAND_HEADER Header; + TPMI_DH_PCR PcrHandle; + UINT32 AuthorizationSize; + TPMS_AUTH_COMMAND AuthSessionPcr; +} TPM2_PCR_COMMON_COMMAND; + +typedef struct { + TPM2_COMMAND_HEADER Header; + TPMI_RH_HIERARCHY_AUTH AuthHandle; + UINT32 AuthorizationSize; + TPMS_AUTH_COMMAND AuthSession; + TPM2B_AUTH NewAuth; +} TPM2_HIERARCHY_CHANGE_AUTH_COMMAND; + +typedef struct { + TPM2_COMMAND_HEADER Header; + TPMI_SH_POLICY PolicySession; + TPML_DIGEST HashList; +} TPM2_POLICY_OR_COMMAND; + +typedef struct { + TPM2_COMMAND_HEADER Header; + TPMI_DH_OBJECT TpmKey; + TPMI_DH_ENTITY Bind; + TPM2B_NONCE NonceCaller; + TPM2B_ENCRYPTED_SECRET Salt; + TPM_SE SessionType; + TPMT_SYM_DEF Symmetric; + TPMI_ALG_HASH AuthHash; +} TPM2_START_AUTH_SESSION_COMMAND; + +typedef struct { + TPM2_RESPONSE_HEADER Header; + TPMI_SH_AUTH_SESSION SessionHandle; + TPM2B_NONCE NonceTPM; +} TPM2_START_AUTH_SESSION_RESPONSE; + +#pragma pack() + +typedef struct { + UINT32 Code; + CHAR8 *Text; +} TPM2_CODE_STRING; + +TPM2_CODE_STRING CommandCodeStrings[] = { + { TPM_CC_NV_UndefineSpaceSpecial, "TPM_CC_NV_UndefineSpaceSpecial" }, + { TPM_CC_EvictControl, "TPM_CC_EvictControl" }, + { TPM_CC_HierarchyControl, "TPM_CC_HierarchyControl" }, + { TPM_CC_NV_UndefineSpace, "TPM_CC_NV_UndefineSpace" }, + { TPM_CC_ChangeEPS, "TPM_CC_ChangeEPS" }, + { TPM_CC_ChangePPS, "TPM_CC_ChangePPS" }, + { TPM_CC_Clear, "TPM_CC_Clear" }, + { TPM_CC_ClearControl, "TPM_CC_ClearControl" }, + { TPM_CC_ClockSet, "TPM_CC_ClockSet" }, + { TPM_CC_HierarchyChangeAuth, "TPM_CC_HierarchyChangeAuth" }, + { TPM_CC_NV_DefineSpace, "TPM_CC_NV_DefineSpace" }, + { TPM_CC_PCR_Allocate, "TPM_CC_PCR_Allocate" }, + { TPM_CC_PCR_SetAuthPolicy, "TPM_CC_PCR_SetAuthPolicy" }, + { TPM_CC_PP_Commands, "TPM_CC_PP_Commands" }, + { TPM_CC_SetPrimaryPolicy, "TPM_CC_SetPrimaryPolicy" }, + { TPM_CC_FieldUpgradeStart, "TPM_CC_FieldUpgradeStart" }, + { TPM_CC_ClockRateAdjust, "TPM_CC_ClockRateAdjust" }, + { TPM_CC_CreatePrimary, "TPM_CC_CreatePrimary" }, + { TPM_CC_NV_GlobalWriteLock, "TPM_CC_NV_GlobalWriteLock" }, + { TPM_CC_PP_LAST, "TPM_CC_PP_LAST" }, + { TPM_CC_GetCommandAuditDigest, "TPM_CC_GetCommandAuditDigest" }, + { TPM_CC_NV_Increment, "TPM_CC_NV_Increment" }, + { TPM_CC_NV_SetBits, "TPM_CC_NV_SetBits" }, + { TPM_CC_NV_Extend, "TPM_CC_NV_Extend" }, + { TPM_CC_NV_Write, "TPM_CC_NV_Write" }, + { TPM_CC_NV_WriteLock, "TPM_CC_NV_WriteLock" }, + { TPM_CC_DictionaryAttackLockReset, "TPM_CC_DictionaryAttackLockReset" }, + { TPM_CC_DictionaryAttackParameters, "TPM_CC_DictionaryAttackParameters" }, + { TPM_CC_NV_ChangeAuth, "TPM_CC_NV_ChangeAuth" }, + { TPM_CC_PCR_Event, "TPM_CC_PCR_Event" }, + { TPM_CC_PCR_Reset, "TPM_CC_PCR_Reset" }, + { TPM_CC_SequenceComplete, "TPM_CC_SequenceComplete" }, + { TPM_CC_SetAlgorithmSet, "TPM_CC_SetAlgorithmSet" }, + { TPM_CC_SetCommandCodeAuditStatus, "TPM_CC_SetCommandCodeAuditStatus" }, + { TPM_CC_FieldUpgradeData, "TPM_CC_FieldUpgradeData" }, + { TPM_CC_IncrementalSelfTest, "TPM_CC_IncrementalSelfTest" }, + { TPM_CC_SelfTest, "TPM_CC_SelfTest" }, + { TPM_CC_Startup, "TPM_CC_Startup" }, + { TPM_CC_Shutdown, "TPM_CC_Shutdown" }, + { TPM_CC_StirRandom, "TPM_CC_StirRandom" }, + { TPM_CC_ActivateCredential, "TPM_CC_ActivateCredential" }, + { TPM_CC_Certify, "TPM_CC_Certify" }, + { TPM_CC_PolicyNV, "TPM_CC_PolicyNV" }, + { TPM_CC_CertifyCreation, "TPM_CC_CertifyCreation" }, + { TPM_CC_Duplicate, "TPM_CC_Duplicate" }, + { TPM_CC_GetTime, "TPM_CC_GetTime" }, + { TPM_CC_GetSessionAuditDigest, "TPM_CC_GetSessionAuditDigest" }, + { TPM_CC_NV_Read, "TPM_CC_NV_Read" }, + { TPM_CC_NV_ReadLock, "TPM_CC_NV_ReadLock" }, + { TPM_CC_ObjectChangeAuth, "TPM_CC_ObjectChangeAuth" }, + { TPM_CC_PolicySecret, "TPM_CC_PolicySecret" }, + { TPM_CC_Rewrap, "TPM_CC_Rewrap" }, + { TPM_CC_Create, "TPM_CC_Create" }, + { TPM_CC_ECDH_ZGen, "TPM_CC_ECDH_ZGen" }, + { TPM_CC_HMAC, "TPM_CC_HMAC" }, + { TPM_CC_Import, "TPM_CC_Import" }, + { TPM_CC_Load, "TPM_CC_Load" }, + { TPM_CC_Quote, "TPM_CC_Quote" }, + { TPM_CC_RSA_Decrypt, "TPM_CC_RSA_Decrypt" }, + { TPM_CC_HMAC_Start, "TPM_CC_HMAC_Start" }, + { TPM_CC_SequenceUpdate, "TPM_CC_SequenceUpdate" }, + { TPM_CC_Sign, "TPM_CC_Sign" }, + { TPM_CC_Unseal, "TPM_CC_Unseal" }, + { TPM_CC_PolicySigned, "TPM_CC_PolicySigned" }, + { TPM_CC_ContextLoad, "TPM_CC_ContextLoad" }, + { TPM_CC_ContextSave, "TPM_CC_ContextSave" }, + { TPM_CC_ECDH_KeyGen, "TPM_CC_ECDH_KeyGen" }, + { TPM_CC_EncryptDecrypt, "TPM_CC_EncryptDecrypt" }, + { TPM_CC_FlushContext, "TPM_CC_FlushContext" }, + { TPM_CC_LoadExternal, "TPM_CC_LoadExternal" }, + { TPM_CC_MakeCredential, "TPM_CC_MakeCredential" }, + { TPM_CC_NV_ReadPublic, "TPM_CC_NV_ReadPublic" }, + { TPM_CC_PolicyAuthorize, "TPM_CC_PolicyAuthorize" }, + { TPM_CC_PolicyAuthValue, "TPM_CC_PolicyAuthValue" }, + { TPM_CC_PolicyCommandCode, "TPM_CC_PolicyCommandCode" }, + { TPM_CC_PolicyCounterTimer, "TPM_CC_PolicyCounterTimer" }, + { TPM_CC_PolicyCpHash, "TPM_CC_PolicyCpHash" }, + { TPM_CC_PolicyLocality, "TPM_CC_PolicyLocality" }, + { TPM_CC_PolicyNameHash, "TPM_CC_PolicyNameHash" }, + { TPM_CC_PolicyOR, "TPM_CC_PolicyOR" }, + { TPM_CC_PolicyTicket, "TPM_CC_PolicyTicket" }, + { TPM_CC_ReadPublic, "TPM_CC_ReadPublic" }, + { TPM_CC_RSA_Encrypt, "TPM_CC_RSA_Encrypt" }, + { TPM_CC_StartAuthSession, "TPM_CC_StartAuthSession" }, + { TPM_CC_VerifySignature, "TPM_CC_VerifySignature" }, + { TPM_CC_ECC_Parameters, "TPM_CC_ECC_Parameters" }, + { TPM_CC_FirmwareRead, "TPM_CC_FirmwareRead" }, + { TPM_CC_GetCapability, "TPM_CC_GetCapability" }, + { TPM_CC_GetRandom, "TPM_CC_GetRandom" }, + { TPM_CC_GetTestResult, "TPM_CC_GetTestResult" }, + { TPM_CC_Hash, "TPM_CC_Hash" }, + { TPM_CC_PCR_Read, "TPM_CC_PCR_Read" }, + { TPM_CC_PolicyPCR, "TPM_CC_PolicyPCR" }, + { TPM_CC_PolicyRestart, "TPM_CC_PolicyRestart" }, + { TPM_CC_ReadClock, "TPM_CC_ReadClock" }, + { TPM_CC_PCR_Extend, "TPM_CC_PCR_Extend" }, + { TPM_CC_PCR_SetAuthValue, "TPM_CC_PCR_SetAuthValue" }, + { TPM_CC_NV_Certify, "TPM_CC_NV_Certify" }, + { TPM_CC_EventSequenceComplete, "TPM_CC_EventSequenceComplete" }, + { TPM_CC_HashSequenceStart, "TPM_CC_HashSequenceStart" }, + { TPM_CC_PolicyPhysicalPresence, "TPM_CC_PolicyPhysicalPresence" }, + { TPM_CC_PolicyDuplicationSelect, "TPM_CC_PolicyDuplicationSelect" }, + { TPM_CC_PolicyGetDigest, "TPM_CC_PolicyGetDigest" }, + { TPM_CC_TestParms, "TPM_CC_TestParms" }, + { TPM_CC_Commit, "TPM_CC_Commit" }, + { TPM_CC_PolicyPassword, "TPM_CC_PolicyPassword" }, + { TPM_CC_ZGen_2Phase, "TPM_CC_ZGen_2Phase" }, + { TPM_CC_EC_Ephemeral, "TPM_CC_EC_Ephemeral" }, +}; +UINTN CommandCodeStringsCount = sizeof (CommandCodeStrings) / sizeof (CommandCodeStrings[0]); + +TPM2_CODE_STRING ResponseCodeStrings[] = { + { TPM_RC_SUCCESS, "TPM_RC_SUCCESS" }, + { TPM_RC_BAD_TAG, "TPM_RC_BAD_TAG" }, + { TPM_RC_INITIALIZE, "TPM_RC_INITIALIZE" }, + { TPM_RC_FAILURE, "TPM_RC_FAILURE" }, + { TPM_RC_SEQUENCE, "TPM_RC_SEQUENCE" }, + { TPM_RC_PRIVATE, "TPM_RC_PRIVATE" }, + { TPM_RC_HMAC, "TPM_RC_HMAC" }, + { TPM_RC_DISABLED, "TPM_RC_DISABLED" }, + { TPM_RC_EXCLUSIVE, "TPM_RC_EXCLUSIVE" }, + { TPM_RC_AUTH_TYPE, "TPM_RC_AUTH_TYPE" }, + { TPM_RC_AUTH_MISSING, "TPM_RC_AUTH_MISSING" }, + { TPM_RC_POLICY, "TPM_RC_POLICY" }, + { TPM_RC_PCR, "TPM_RC_PCR" }, + { TPM_RC_PCR_CHANGED, "TPM_RC_PCR_CHANGED" }, + { TPM_RC_UPGRADE, "TPM_RC_UPGRADE" }, + { TPM_RC_TOO_MANY_CONTEXTS, "TPM_RC_TOO_MANY_CONTEXTS" }, + { TPM_RC_AUTH_UNAVAILABLE, "TPM_RC_AUTH_UNAVAILABLE" }, + { TPM_RC_REBOOT, "TPM_RC_REBOOT" }, + { TPM_RC_UNBALANCED, "TPM_RC_UNBALANCED" }, + { TPM_RC_COMMAND_SIZE, "TPM_RC_COMMAND_SIZE" }, + { TPM_RC_COMMAND_CODE, "TPM_RC_COMMAND_CODE" }, + { TPM_RC_AUTHSIZE, "TPM_RC_AUTHSIZE" }, + { TPM_RC_AUTH_CONTEXT, "TPM_RC_AUTH_CONTEXT" }, + { TPM_RC_NV_RANGE, "TPM_RC_NV_RANGE" }, + { TPM_RC_NV_SIZE, "TPM_RC_NV_SIZE" }, + { TPM_RC_NV_LOCKED, "TPM_RC_NV_LOCKED" }, + { TPM_RC_NV_AUTHORIZATION, "TPM_RC_NV_AUTHORIZATION" }, + { TPM_RC_NV_UNINITIALIZED, "TPM_RC_NV_UNINITIALIZED" }, + { TPM_RC_NV_SPACE, "TPM_RC_NV_SPACE" }, + { TPM_RC_NV_DEFINED, "TPM_RC_NV_DEFINED" }, + { TPM_RC_BAD_CONTEXT, "TPM_RC_BAD_CONTEXT" }, + { TPM_RC_CPHASH, "TPM_RC_CPHASH" }, + { TPM_RC_PARENT, "TPM_RC_PARENT" }, + { TPM_RC_NEEDS_TEST, "TPM_RC_NEEDS_TEST" }, + { TPM_RC_NO_RESULT, "TPM_RC_NO_RESULT" }, + { TPM_RC_SENSITIVE, "TPM_RC_SENSITIVE" }, +}; +UINTN ResponseCodeStringsCount = sizeof (ResponseCodeStrings) / sizeof (ResponseCodeStrings[0]); + +UINT32 mLastCommandSent = 0; + +/** + This simple function will dump up to MAX_TPM_BUFFER_DUMP bytes + of a TPM data buffer and apppend '...' if buffer is larger. + + @param[in] Preamble [Optional] A string to print before the buffer dump. + @param[in] BufferSize The actual size of the provided buffer. + @param[in] Buffer A pointer to the buffer in question. + +**/ +VOID +DumpTpmBuffer ( + IN CHAR8 *Preamble OPTIONAL, + IN UINTN BufferSize, + IN CONST UINT8 *Buffer + ) +{ + UINTN DebugBufferCount, Index; + + // TODO: Don't even evaluate if below required debugging level. + // TODO: Pass in max buffer size? Format nicely? + + // Determine max buffer size. + DebugBufferCount = MIN (BufferSize, MAX_TPM_BUFFER_DUMP); + + // Print the preamble, if supplied. + if (Preamble) { + DEBUG ((DEBUG_SECURITY, "%a", Preamble)); + } + + // Dump them bytes. + for (Index = 0; Index < DebugBufferCount; Index++) { + DEBUG ((DEBUG_SECURITY, "%02X ", Buffer[Index])); + } + + // FINISH HIM!!! + if (DebugBufferCount != BufferSize) { + DEBUG ((DEBUG_SECURITY, "...\n")); + } else { + DEBUG ((DEBUG_SECURITY, "\n")); + } + + return; +} + +/** + This abstract function takes in a list of codes and strings and returns either + a string matching the code or the supplied "default" string. + + @param[in] Code TPM2 Command or Response Code in little-endian format. + @param[in] List Pointer to the start of a TPM2_CODE_STRING list. + @param[in] ListCount Number of items in the given list. + @param[in] DefaultString A string to be returned if no matching string is found. + + @retval CHAR8* of a human-readable string for the code (as defined in the spec). + +**/ +STATIC +CHAR8 * +GetTpmCodeString ( + IN UINT32 Code, + IN TPM2_CODE_STRING *List, + IN UINTN ListCount, + IN CHAR8 *DefaultString + ) +{ + UINTN Index; + CHAR8 *Result = DefaultString; + + // Find the code in the string array. + for (Index = 0; Index < ListCount; Index++) { + if (List[Index].Code == Code) { + Result = List[Index].Text; + break; + } + } + + return Result; +} + +/** + Simple wrapper function to use GetTpmCodeString() to search for a command code. + + @param[in] Code TPM2 Command Code in marshalled (generally big-endian) format. + + @retval CHAR8* of a human-readable string for the code (as defined in the spec). + +**/ +CHAR8 * +GetTpm2CommandString ( + IN TPM_CC Code + ) +{ + return GetTpmCodeString (SwapBytes32 (Code), CommandCodeStrings, CommandCodeStringsCount, "TPM_CC_UNKNOWN"); +} + +/** + Simple wrapper function to use GetTpmCodeString() to search for a response code. + + @param[in] Code TPM2 Response Code in marshalled (generally big-endian) format. + + @retval CHAR8* of a human-readable string for the code (as defined in the spec). + +**/ +CHAR8 * +GetTpm2ResponseString ( + IN TPM_RC Code + ) +{ + return GetTpmCodeString (SwapBytes32 (Code), ResponseCodeStrings, ResponseCodeStringsCount, "TPM_RC_UNKNOWN"); +} + +/** + This function dumps a TPM2B_DIGEST structure. + + @param[in] Preamble [Optional] A string to print before the digest dump. + @param[in] Digest Pointer to the TPM2B_DIGEST structure to be printed. + +**/ +STATIC +VOID +Dump2bDigest ( + IN CHAR8 *Preamble OPTIONAL, + IN CONST TPM2B_DIGEST *Digest + ) +{ + UINT16 DigestSize; + + DigestSize = SwapBytes16 (Digest->size); + if (DigestSize) { + DumpTpmBuffer (Preamble, SwapBytes16 (Digest->size), Digest->buffer); + } else { + DEBUG ((DEBUG_SECURITY, "%a\n", Preamble)); + } + + return; +} + +/** + This function dumps an AuthSession structure from a command or response. + + @param[in] IsCommand Indicates that the auth session structure starts with a session handle. + @param[in] AuthSessionPtr Pointer to the auth session to be printed. + +**/ +STATIC +VOID +DumpAuthSession ( + IN BOOLEAN IsCommand, + IN CONST UINT8 *AuthSession + ) +{ + CONST UINT8 *FloatingPtr; + CONST TPM2B_DIGEST *Digest; + + FloatingPtr = AuthSession; + + DEBUG ((DEBUG_SECURITY, "== Auth Session ==\n")); + + // If we're pointing to a command auth session, + // we need to print the session handle. + if (IsCommand) { + DEBUG ((DEBUG_SECURITY, "- SHand: 0x%8X\n", SwapBytes32 (*(UINT32 *)FloatingPtr))); + FloatingPtr += sizeof (UINT32); + } + + // Print the common parts of an auth session. + Digest = (TPM2B_DIGEST *)FloatingPtr; + Dump2bDigest ("- Nonce: ", Digest); + FloatingPtr += sizeof (UINT16) + SwapBytes16 (Digest->size); // Add the size field and the digest size. + + DEBUG ((DEBUG_SECURITY, "- Attr: 0x%2X\n", *FloatingPtr)); + FloatingPtr++; + + Digest = (TPM2B_DIGEST *)FloatingPtr; + Dump2bDigest ("- HMAC: ", Digest); + + return; +} + +/** + This function dumps additional information about TPM PCR Extend + and Event operations. + + @param[in] Command Little-endian format of the command being issued. + @param[in] InputBlockSize Size of the input buffer. + @param[in] InputBlock Pointer to the input buffer itself. + +**/ +STATIC +VOID +DumpTpmPcrCommand ( + IN TPM_CC Command, + IN UINT32 InputBlockSize, + IN CONST UINT8 *InputBlock + ) +{ + CONST TPM2_PCR_COMMON_COMMAND *PcrHeader; + TPMI_DH_PCR PcrHandle; + + // If this is an unrecognized command, we can't go much further. + if ((Command != TPM_CC_PCR_Extend) && (Command != TPM_CC_PCR_Event)) { + DEBUG ((DEBUG_WARN, "%a - Unrecognized command! 0x%X\n", __func__, Command)); + return; + } + + // Start the debugging by mapping some stuff. + PcrHeader = (TPM2_PCR_COMMON_COMMAND *)InputBlock; + PcrHandle = SwapBytes32 (PcrHeader->PcrHandle); + DEBUG ((DEBUG_SECURITY, "- PCR: %d (0x%08X)\n", PcrHandle, PcrHandle)); + + // Now handle any command-specific debugging. + if (Command == TPM_CC_PCR_Extend) { + CONST TPML_DIGEST_VALUES *DigestValues; + CONST TPMT_HA *CurrentDigest; + UINT32 DigestCount; + + // Move the dump data to the start of the digest section. + DigestValues = (TPML_DIGEST_VALUES *)(InputBlock + OFFSET_OF (TPM2_PCR_COMMON_COMMAND, AuthSessionPcr) + SwapBytes32 (PcrHeader->AuthorizationSize)); + + // Determine the digest count and locate the first digest. + DigestCount = SwapBytes32 (DigestValues->count); + CurrentDigest = &DigestValues->digests[0]; + + // Print each digest. + do { + // Print the current digest. + switch (SwapBytes16 (CurrentDigest->hashAlg)) { + case TPM_ALG_SHA1: + DumpTpmBuffer ("- SHA1: ", SHA1_DIGEST_SIZE, CurrentDigest->digest.sha1); + CurrentDigest = (TPMT_HA *)((UINT8 *)CurrentDigest + OFFSET_OF (TPMT_HA, digest) + SHA1_DIGEST_SIZE); + DigestCount--; // Account for this digest. + break; + + case TPM_ALG_SHA256: + DumpTpmBuffer ("- SHA256: ", SHA256_DIGEST_SIZE, CurrentDigest->digest.sha256); + CurrentDigest = (TPMT_HA *)((UINT8 *)CurrentDigest + OFFSET_OF (TPMT_HA, digest) + SHA256_DIGEST_SIZE); + DigestCount--; // Account for this digest. + break; + + default: + // This algorithm hasn't been programmed yet. We need to bail. + DEBUG ((DEBUG_WARN, "%a - Unknown hash algorithm! 0x%04X\n", __func__, SwapBytes16 (CurrentDigest->hashAlg))); + // Zero the count so we can get out of here. + DigestCount = 0; + break; + } + } while (DigestCount > 0); + } + + return; +} + +/** + This function dumps additional information about TPM Hierarchy Change Auth operations. + + @param[in] InputBlockSize Size of the input buffer. + @param[in] InputBlock Pointer to the input buffer itself. + +**/ +STATIC +VOID +DumpTpmHierarchyChangeAuthCommand ( + IN UINT32 InputBlockSize, + IN CONST UINT8 *InputBlock + ) +{ + CONST TPM2_HIERARCHY_CHANGE_AUTH_COMMAND *ChangeAuthCommand; + CONST TPM2B_DIGEST *Digest; + + // Start the debugging by mapping some stuff. + ChangeAuthCommand = (TPM2_HIERARCHY_CHANGE_AUTH_COMMAND *)InputBlock; + + // Print the auth handle (the handle being authorized against). + DEBUG ((DEBUG_SECURITY, "- AHand: 0x%8X\n", SwapBytes32 (ChangeAuthCommand->AuthHandle))); + + // Print the auth session. + DumpAuthSession (TRUE, (UINT8 *)&ChangeAuthCommand->AuthSession); + + // Print the new auth. + Digest = (TPM2B_DIGEST *)(InputBlock + OFFSET_OF (TPM2_HIERARCHY_CHANGE_AUTH_COMMAND, AuthSession) + SwapBytes32 (ChangeAuthCommand->AuthorizationSize)); + Dump2bDigest ("- NAuth: ", Digest); + + return; +} + +/** + This function dumps additional information about Policy OR operations. + + @param[in] InputBlockSize Size of the input buffer. + @param[in] InputBlock Pointer to the input buffer itself. + +**/ +STATIC +VOID +DumpTpmPolicyOrCommand ( + IN UINT32 InputBlockSize, + IN CONST UINT8 *InputBlock + ) +{ + CONST TPM2_POLICY_OR_COMMAND *PolicyOrCommand; + CONST TPM2B_DIGEST *Digest; + UINT32 Index; + + // Start the debugging by mapping some stuff. + PolicyOrCommand = (TPM2_POLICY_OR_COMMAND *)InputBlock; + + // Print the policy session token. + DEBUG ((DEBUG_SECURITY, "- PSess: 0x%8X\n", SwapBytes32 (PolicyOrCommand->PolicySession))); + + // Print out all of the digests. + Digest = &PolicyOrCommand->HashList.digests[0]; + for (Index = 0; Index < SwapBytes32 (PolicyOrCommand->HashList.count); Index++) { + Dump2bDigest ("- Digest: ", Digest); + // Add the size field and the digest size. + Digest = (TPM2B_DIGEST *)((UINT8 *)Digest + sizeof (UINT16) + SwapBytes16 (Digest->size)); + } + + return; +} + +/** + This function dumps additional information about Start Auth Session operations. + + @param[in] InputBlockSize Size of the input buffer. + @param[in] InputBlock Pointer to the input buffer itself. + +**/ +STATIC +VOID +DumpTpmStartAuthSessionCommand ( + IN UINT32 InputBlockSize, + IN CONST UINT8 *InputBlock + ) +{ + CONST UINT8 *FloatingPtr; + CONST TPM2_START_AUTH_SESSION_COMMAND *StartAuthSessionCommand; + CONST TPM2B_DIGEST *Digest; + + // Start the debugging by mapping some stuff. + StartAuthSessionCommand = (TPM2_START_AUTH_SESSION_COMMAND *)InputBlock; + + // Print as many of the simple fields as possible. + DEBUG ((DEBUG_SECURITY, "- TpmKey: 0x%8X\n", SwapBytes32 (StartAuthSessionCommand->TpmKey))); + DEBUG ((DEBUG_SECURITY, "- Bind: 0x%8X\n", SwapBytes32 (StartAuthSessionCommand->Bind))); + Digest = (TPM2B_DIGEST *)&StartAuthSessionCommand->NonceCaller; + Dump2bDigest ("- NonceC: ", Digest); + // Add the size field and the digest size. + FloatingPtr = (UINT8 *)Digest + sizeof (UINT16) + SwapBytes16 (Digest->size); + + // Skip the Salt for now. + Digest = (TPM2B_DIGEST *)FloatingPtr; + Dump2bDigest ("- Salt: ", Digest); + FloatingPtr += sizeof (UINT16) + SwapBytes16 (Digest->size); + + // Print the remaining things. + DEBUG ((DEBUG_SECURITY, "- SesTyp: 0x%2X\n", *FloatingPtr)); + FloatingPtr++; + + // Skip Symmetric for now. + // NOTE: Symmetric is an interpreted structure, so just jump to the end. + FloatingPtr = InputBlock + (InputBlockSize - sizeof (UINT16)); + DEBUG ((DEBUG_SECURITY, "- AHash: 0x%4X\n", SwapBytes16 (*(UINT16 *)FloatingPtr))); + + return; +} + +/** + This function dumps additional information about Start Auth Session operations. + + @param[in] OutputBlockSize Size of the output buffer. + @param[in] OutputBlock Pointer to the output buffer itself. + +**/ +STATIC +VOID +DumpTpmStartAuthSessionResponse ( + IN UINT32 OutputBlockSize, + IN CONST UINT8 *OutputBlock + ) +{ + CONST TPM2_START_AUTH_SESSION_RESPONSE *StartAuthSessionResponse; + CONST TPM2B_DIGEST *Digest; + + // Start the debugging by mapping some stuff. + StartAuthSessionResponse = (TPM2_START_AUTH_SESSION_RESPONSE *)OutputBlock; + + // Dump the handle and the nonce. + DEBUG ((DEBUG_SECURITY, "- SHand: 0x%8X\n", SwapBytes32 (StartAuthSessionResponse->SessionHandle))); + Digest = (TPM2B_DIGEST *)&StartAuthSessionResponse->NonceTPM; + Dump2bDigest ("- NonceT: ", Digest); + + return; +} + +/** + This function dumps as much information as possible about + a command being sent to the TPM for maximum user-readability. + + @param[in] InputBlockSize Size of the input buffer. + @param[in] InputBlock Pointer to the input buffer itself. + +**/ +VOID +EFIAPI +DumpTpmInputBlock ( + IN UINT32 InputBlockSize, + IN CONST UINT8 *InputBlock + ) +{ + CONST TPM2_COMMAND_HEADER *CommHeader; + TPM_ST NativeTag; + UINT32 NativeSize; + TPM_CC NativeCode; + + DEBUG ((DEBUG_SECURITY, "\n=== BEGIN TPM COMMAND ===\n")); + DEBUG ((DEBUG_VERBOSE, "Size: %d (0x%X), Address: 0x%X\n", InputBlockSize, InputBlockSize, InputBlock)); + + // Make sure we've got at least enough data for a valid header. + if (InputBlockSize < sizeof (*CommHeader)) { + DEBUG ((DEBUG_WARN, "%a - Invalid buffer size!\n", __func__)); + return; + } + + // Start the debugging by mapping some stuff. + CommHeader = (TPM2_COMMAND_HEADER *)InputBlock; + NativeTag = SwapBytes16 (CommHeader->tag); + NativeSize = SwapBytes32 (CommHeader->paramSize); + NativeCode = SwapBytes32 (CommHeader->commandCode); + DEBUG ((DEBUG_SECURITY, "Command: %a (0x%08X)\n", GetTpm2CommandString (CommHeader->commandCode), NativeCode)); + DEBUG ((DEBUG_SECURITY, "Tag: 0x%04X\n", NativeTag)); + DEBUG ((DEBUG_SECURITY, "Size: %d (0x%X)\n", NativeSize, NativeSize)); + + // Debug anything else. + switch (NativeCode) { + case TPM_CC_PCR_Event: + case TPM_CC_PCR_Extend: + DumpTpmPcrCommand (NativeCode, InputBlockSize, InputBlock); + break; + + case TPM_CC_HierarchyChangeAuth: + DumpTpmHierarchyChangeAuthCommand (InputBlockSize, InputBlock); + break; + + case TPM_CC_PolicyOR: + DumpTpmPolicyOrCommand (InputBlockSize, InputBlock); + break; + + case TPM_CC_StartAuthSession: + DumpTpmStartAuthSessionCommand (InputBlockSize, InputBlock); + break; + + default: + break; + } + + // If verbose, dump all of the buffer contents for deeper analysis. + DumpTpmBuffer ("DATA: ", MIN (InputBlockSize, NativeSize), InputBlock); + + // Update the last command sent so that response parsing can have some context. + mLastCommandSent = NativeCode; + + return; +} + +/** + This function dumps as much information as possible about + a response from the TPM for maximum user-readability. + + @param[in] OutputBlockSize Size of the output buffer. + @param[in] OutputBlock Pointer to the output buffer itself. + +**/ +VOID +EFIAPI +DumpTpmOutputBlock ( + IN UINT32 OutputBlockSize, + IN CONST UINT8 *OutputBlock + ) +{ + CONST TPM2_RESPONSE_HEADER *RespHeader; + TPM_ST NativeTag; + UINT32 NativeSize; + TPM_CC NativeCode; + + DEBUG ((DEBUG_VERBOSE, "Size: %d (0x%X), Address: 0x%X\n", OutputBlockSize, OutputBlockSize, OutputBlock)); + + // Start the debugging by mapping some stuff. + RespHeader = (TPM2_RESPONSE_HEADER *)OutputBlock; + NativeTag = SwapBytes16 (RespHeader->tag); + NativeSize = SwapBytes32 (RespHeader->paramSize); + NativeCode = SwapBytes32 (RespHeader->responseCode); + DEBUG ((DEBUG_SECURITY, "Response: %a (0x%08X)\n", GetTpm2ResponseString (RespHeader->responseCode), NativeCode)); + DEBUG ((DEBUG_SECURITY, "Tag: 0x%04X\n", NativeTag)); + DEBUG ((DEBUG_SECURITY, "Size: %d (0x%X)\n", NativeSize, NativeSize)); + + // Debug anything else based on the Command context. + if (mLastCommandSent != 0x00) { + switch (mLastCommandSent) { + case TPM_CC_StartAuthSession: + DumpTpmStartAuthSessionResponse (OutputBlockSize, OutputBlock); + break; + + default: + break; + } + } + + // If verbose, dump all of the buffer contents for deeper analysis. + DumpTpmBuffer ("DATA: ", MIN (OutputBlockSize, NativeSize), OutputBlock); + + DEBUG ((DEBUG_SECURITY, "=== END TPM COMMAND ===\n\n")); + + return; +} diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmStandaloneMm.inf b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmStandaloneMm.inf index 18c08ad8bdcc..dcce2730bd39 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmStandaloneMm.inf +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmStandaloneMm.inf @@ -37,6 +37,7 @@ Tpm2DeviceLibDTpm.c Tpm2DeviceLibDTpmStandaloneMm.c Tpm2DeviceLibDTpm.h + Tpm2DeviceLibDTpmDump.c [Packages] MdePkg/MdePkg.dec diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmSvsm.inf b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmSvsm.inf index 0efcd4fca7b9..d7340041faac 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmSvsm.inf +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmSvsm.inf @@ -43,6 +43,7 @@ Tpm2DeviceLibDTpmSvsm.c Tpm2DeviceLibDTpmBase.c Tpm2DeviceLibDTpm.h + Tpm2DeviceLibDTpmDump.c [Packages] MdePkg/MdePkg.dec diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpm.inf b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpm.inf index 31113d93ee41..4525f1575c82 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpm.inf +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpm.inf @@ -33,6 +33,7 @@ Tpm2InstanceLibDTpm.c Tpm2DeviceLibDTpmBase.c Tpm2DeviceLibDTpm.h + Tpm2DeviceLibDTpmDump.c [Packages] MdePkg/MdePkg.dec diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpmSvsm.inf b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpmSvsm.inf index 357dfeb21fa7..b8413ccb57ea 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpmSvsm.inf +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpmSvsm.inf @@ -37,6 +37,7 @@ Tpm2InstanceLibDTpmSvsm.c Tpm2DeviceLibDTpmBase.c Tpm2DeviceLibDTpm.h + Tpm2DeviceLibDTpmDump.c [Packages] MdePkg/MdePkg.dec diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c index d1565c72d7ac..d3054690e2eb 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c @@ -164,27 +164,7 @@ PtpCrbTpmCommand ( UINT8 RetryCnt; DEBUG_CODE_BEGIN (); - UINTN DebugSize; - - DEBUG ((DEBUG_VERBOSE, "PtpCrbTpmCommand Send - ")); - if (SizeIn > 0x100) { - DebugSize = 0x40; - } else { - DebugSize = SizeIn; - } - - for (Index = 0; Index < DebugSize; Index++) { - DEBUG ((DEBUG_VERBOSE, "%02x ", BufferIn[Index])); - } - - if (DebugSize != SizeIn) { - DEBUG ((DEBUG_VERBOSE, "...... ")); - for (Index = SizeIn - 0x20; Index < SizeIn; Index++) { - DEBUG ((DEBUG_VERBOSE, "%02x ", BufferIn[Index])); - } - } - - DEBUG ((DEBUG_VERBOSE, "\n")); + DumpTpmInputBlock (SizeIn, BufferIn); DEBUG_CODE_END (); TpmOutSize = 0; @@ -326,14 +306,6 @@ PtpCrbTpmCommand ( BufferOut[Index] = MmioRead8 ((UINTN)&CrbReg->CrbDataBuffer[Index]); } - DEBUG_CODE_BEGIN (); - DEBUG ((DEBUG_VERBOSE, "PtpCrbTpmCommand ReceiveHeader - ")); - for (Index = 0; Index < sizeof (TPM2_RESPONSE_HEADER); Index++) { - DEBUG ((DEBUG_VERBOSE, "%02x ", BufferOut[Index])); - } - - DEBUG ((DEBUG_VERBOSE, "\n")); - DEBUG_CODE_END (); // // Check the response data header (tag, parasize and returncode) // @@ -364,12 +336,7 @@ PtpCrbTpmCommand ( } DEBUG_CODE_BEGIN (); - DEBUG ((DEBUG_VERBOSE, "PtpCrbTpmCommand Receive - ")); - for (Index = 0; Index < TpmOutSize; Index++) { - DEBUG ((DEBUG_VERBOSE, "%02x ", BufferOut[Index])); - } - - DEBUG ((DEBUG_VERBOSE, "\n")); + DumpTpmOutputBlock (TpmOutSize, BufferOut); DEBUG_CODE_END (); // diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.h b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.h index 95e7ce246a12..8b7c37bb9bb7 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.h +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.h @@ -8,6 +8,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include +#ifndef TPM2_PTP_H_ +#define TPM2_PTP_H_ + /** Dump PTP register information. @@ -51,3 +54,31 @@ EFIAPI DTpm2RequestUseTpm ( VOID ); + +/** + This function dumps as much information as possible about + a command being sent to the TPM for maximum user-readability. + @param[in] InputBlockSize Size of the input buffer. + @param[in] InputBlock Pointer to the input buffer itself. +**/ +VOID +EFIAPI +DumpTpmInputBlock ( + IN UINT32 InputBlockSize, + IN CONST UINT8 *InputBlock + ); + +/** + This function dumps as much information as possible about + a response from the TPM for maximum user-readability. + @param[in] OutputBlockSize Size of the output buffer. + @param[in] OutputBlock Pointer to the output buffer itself. +**/ +VOID +EFIAPI +DumpTpmOutputBlock ( + IN UINT32 OutputBlockSize, + IN CONST UINT8 *OutputBlock + ); + +#endif // TPM2_PTP_H_ diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Tis.c b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Tis.c index 642e0d4cdb94..d2f0abd160ca 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Tis.c +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Tis.c @@ -19,6 +19,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include +#include "Tpm2Ptp.h" + #define TIS_TIMEOUT_MAX (90000 * 1000) // 90s // @@ -223,27 +225,7 @@ Tpm2TisTpmCommand ( UINT32 Data32; DEBUG_CODE_BEGIN (); - UINTN DebugSize; - - DEBUG ((DEBUG_VERBOSE, "Tpm2TisTpmCommand Send - ")); - if (SizeIn > 0x100) { - DebugSize = 0x40; - } else { - DebugSize = SizeIn; - } - - for (Index = 0; Index < DebugSize; Index++) { - DEBUG ((DEBUG_VERBOSE, "%02x ", BufferIn[Index])); - } - - if (DebugSize != SizeIn) { - DEBUG ((DEBUG_VERBOSE, "...... ")); - for (Index = SizeIn - 0x20; Index < SizeIn; Index++) { - DEBUG ((DEBUG_VERBOSE, "%02x ", BufferIn[Index])); - } - } - - DEBUG ((DEBUG_VERBOSE, "\n")); + DumpTpmInputBlock (SizeIn, BufferIn); DEBUG_CODE_END (); TpmOutSize = 0; @@ -347,16 +329,8 @@ Tpm2TisTpmCommand ( } } - DEBUG_CODE_BEGIN (); - DEBUG ((DEBUG_VERBOSE, "Tpm2TisTpmCommand ReceiveHeader - ")); - for (Index = 0; Index < sizeof (TPM2_RESPONSE_HEADER); Index++) { - DEBUG ((DEBUG_VERBOSE, "%02x ", BufferOut[Index])); - } - - DEBUG ((DEBUG_VERBOSE, "\n")); - DEBUG_CODE_END (); // - // Check the response data header (tag,parasize and returncode ) + // Check the response data header (tag, parameter size and return code ) // CopyMem (&Data16, BufferOut, sizeof (UINT16)); // TPM2 should not use this RSP_COMMAND @@ -396,12 +370,7 @@ Tpm2TisTpmCommand ( Exit: DEBUG_CODE_BEGIN (); - DEBUG ((DEBUG_VERBOSE, "Tpm2TisTpmCommand Receive - ")); - for (Index = 0; Index < *SizeOut; Index++) { - DEBUG ((DEBUG_VERBOSE, "%02x ", BufferOut[Index])); - } - - DEBUG ((DEBUG_VERBOSE, "\n")); + DumpTpmOutputBlock (TpmOutSize, BufferOut); DEBUG_CODE_END (); MmioWrite8 ((UINTN)&TisReg->Status, TIS_PC_STS_READY); return Status; From b336d9b87aeb8713a8894c3c06f3fdb9579d456a Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Mon, 2 Jun 2025 23:11:56 +0100 Subject: [PATCH 0236/1172] MdeModulePkg/Library: fix memory leak Rx/Tx Buffer in ArmFfaPeiLib The commit e15fe066036da ("MdeModulePkg/Library: make ArmFfaPeiLib available early PEIM stage") uses ArmFfaPeiLib in the early PEIM stage. However, the Rx/Tx buffer allocated in the early PEIM stage uses temporary memory. This results in a memory leak when the temporary memory's heap is relocated to permanent memory. For example, if the Rx/Tx buffer memory is allocated at 0x20006000 in temporary memory, and if offset between temporary memory and permanent is 0x40000000, then: - Once permanent memory installed the temporary memory at 0x20006000 is migrated to 0x60006000. - However, ArmFfaPeiLib allocates new Rx/Tx buffer without freeing the migrated Rx/Tx buffers, i.e. the buffers at 0x60006000. This results in a memory leak as the migrated Rx/Tx buffer area is lost. To address this memory leak, use the MemoryAllocationHob's name, so that the migrated memory area will be reused as Rx/Tx buffer. This patch also includes rename ArmFfaRxTxStmm.c to ArmFfaStandaloneMmRxTxMap.c to keep the file name convention in ArmFfaLib with ArmFfa{Phase}{...}.c Fixes: e15fe066036da ("MdeModulePkg/Library: ...") Signed-off-by: Yeoreum Yun Continuous-integration-options: PatchCheck.ignore-multi-package --- .../Include/Guid/ArmFfaRxTxBufferInfo.h | 14 +- MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c | 91 ++++---- .../Library/ArmFfaLib/ArmFfaRxTxMap.c | 197 ++++++++++++++++++ .../Library/ArmFfaLib/ArmFfaRxTxMap.h | 45 ++++ .../ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf | 4 +- .../ArmFfaLib/ArmFfaStandaloneMmLib.inf | 4 +- ...xMapStmm.c => ArmFfaStandaloneMmRxTxMap.c} | 67 +++++- 7 files changed, 369 insertions(+), 53 deletions(-) rename MdeModulePkg/Library/ArmFfaLib/{ArmFfaRxTxMapStmm.c => ArmFfaStandaloneMmRxTxMap.c} (84%) diff --git a/MdeModulePkg/Include/Guid/ArmFfaRxTxBufferInfo.h b/MdeModulePkg/Include/Guid/ArmFfaRxTxBufferInfo.h index 0b8e2b64191c..763dd615084d 100644 --- a/MdeModulePkg/Include/Guid/ArmFfaRxTxBufferInfo.h +++ b/MdeModulePkg/Include/Guid/ArmFfaRxTxBufferInfo.h @@ -14,16 +14,22 @@ */ typedef struct ArmFfaRxTxBuffersInfo { /// Tx Buffer Address. - VOID *TxBufferAddr; + VOID *TxBufferAddr; /// Tx Buffer Size. - UINT64 TxBufferSize; + UINT64 TxBufferSize; /// Rx Buffer Address. - VOID *RxBufferAddr; + VOID *RxBufferAddr; /// Rx Buffer Size. - UINT64 RxBufferSize; + UINT64 RxBufferSize; + + /// Rx/Tx buffer should be remapped to permanent memory. + BOOLEAN RemapRequired; + + /// Rx/Tx buffer offset from its allocation base. + UINT64 RemapOffset; } ARM_FFA_RX_TX_BUFFER_INFO; extern EFI_GUID gArmFfaRxTxBufferInfoGuid; diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c index eb55255901cf..a85a616f15b4 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c @@ -34,25 +34,6 @@ #include "ArmFfaCommon.h" #include "ArmFfaRxTxMap.h" -/** - Update Rx/TX buffer information. - - @param BufferInfo Rx/Tx buffer information. - -**/ -STATIC -VOID -EFIAPI -UpdateRxTxBufferInfo ( - OUT ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo - ) -{ - BufferInfo->TxBufferAddr = (VOID *)(UINTN)PcdGet64 (PcdFfaTxBuffer); - BufferInfo->TxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; - BufferInfo->RxBufferAddr = (VOID *)(UINTN)PcdGet64 (PcdFfaRxBuffer); - BufferInfo->RxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; -} - /** Notification service to be called when gEfiPeiMemoryDiscoveredPpiGuid is installed. This function change reamp Rx/Tx buffer with permanent memory from @@ -81,7 +62,6 @@ PeiServicesMemoryDiscoveredNotifyCallback ( IN VOID *Ppi ) { - EFI_STATUS Status; EFI_HOB_GUID_TYPE *RxTxBufferHob; ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo; @@ -89,26 +69,7 @@ PeiServicesMemoryDiscoveredNotifyCallback ( ASSERT (RxTxBufferHob != NULL); BufferInfo = GET_GUID_HOB_DATA (RxTxBufferHob); - /* - * Temporary memory doesn't need to be free. - * otherwise PEI memory manager using permanent memory will be confused. - */ - PcdSet64S (PcdFfaTxBuffer, 0x00); - PcdSet64S (PcdFfaRxBuffer, 0x00); - - Status = ArmFfaLibRxTxUnmap (); - if (EFI_ERROR (Status)) { - return Status; - } - - Status = ArmFfaLibRxTxMap (); - if (EFI_ERROR (Status)) { - return Status; - } - - UpdateRxTxBufferInfo (BufferInfo); - - return EFI_SUCCESS; + return RemapFfaRxTxBuffer (BufferInfo); } STATIC EFI_PEI_NOTIFY_DESCRIPTOR mNotifyOnPeiMemoryDiscovered = { @@ -138,6 +99,7 @@ ArmFfaPeiLibConstructor ( EFI_HOB_GUID_TYPE *RxTxBufferHob; ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo; VOID *Dummy; + EFI_HOB_MEMORY_ALLOCATION *RxTxBufferAllocationHob; Status = ArmFfaLibCommonInit (); if (EFI_ERROR (Status)) { @@ -176,6 +138,11 @@ ArmFfaPeiLibConstructor ( UpdateRxTxBufferInfo (BufferInfo); + /* + * When permanent memory is used, gEfiPeiMemoryDiscoveredPpiGuid + * is installed. If gEfiPeiMemoryDiscoveredPpiGuid is found, + * It doesn't need to remap Rx/Tx buffer. + */ Status = (*PeiServices)->LocatePpi ( PeiServices, &gEfiPeiMemoryDiscoveredPpiGuid, @@ -183,10 +150,50 @@ ArmFfaPeiLibConstructor ( NULL, &Dummy ); + BufferInfo->RemapRequired = EFI_ERROR (Status); + } else { + BufferInfo = GET_GUID_HOB_DATA (RxTxBufferHob); + } + + if (BufferInfo->RemapRequired) { + /* + * If RxTxBufferAllocationHob can be found with gArmFfaRxTxBufferInfoGuid, + * This Rx/Tx buffer is mapped by ArmFfaSecLib. + */ + RxTxBufferAllocationHob = FindRxTxBufferAllocationHob (TRUE); + + /* + * Below case Rx/Tx buffer mapped by ArmPeiLib but in temporary memory. + */ + if (RxTxBufferAllocationHob == NULL) { + RxTxBufferAllocationHob = FindRxTxBufferAllocationHob (FALSE); + ASSERT (RxTxBufferAllocationHob != NULL); + BufferInfo->RemapOffset = + (UINTN)((EFI_PHYSICAL_ADDRESS)((UINTN)BufferInfo->TxBufferAddr) - + RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress); + + CopyGuid ( + &RxTxBufferAllocationHob->AllocDescriptor.Name, + &gArmFfaRxTxBufferInfoGuid + ); + } + + Status = (*PeiServices)->NotifyPpi (PeiServices, &mNotifyOnPeiMemoryDiscovered); + + /* + * Failed to register NotifyPpi. + * In this case, return ERROR to make failure of load for PPI + * and postpone to remap to other PEIM. + */ if (EFI_ERROR (Status)) { - Status = (*PeiServices)->NotifyPpi (PeiServices, &mNotifyOnPeiMemoryDiscovered); - ASSERT_EFI_ERROR (Status); + return Status; } + + /* + * Change RemapRequired to FALSE here to prevent other PEIM from + * registering notification again. + */ + BufferInfo->RemapRequired = FALSE; } return EFI_SUCCESS; diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c index 37d3e80c3cb0..528058e607cb 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c @@ -19,12 +19,15 @@ #include #include #include +#include #include #include #include #include +#include + #include "ArmFfaCommon.h" #include "ArmFfaRxTxMap.h" @@ -270,3 +273,197 @@ ArmFfaLibRxTxUnmap ( return EFI_SUCCESS; } + +/** + Update Rx/TX buffer information. + + @param BufferInfo Rx/Tx buffer information. + +**/ +VOID +EFIAPI +UpdateRxTxBufferInfo ( + OUT ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo + ) +{ + BufferInfo->TxBufferAddr = (VOID *)(UINTN)PcdGet64 (PcdFfaTxBuffer); + BufferInfo->TxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + BufferInfo->RxBufferAddr = (VOID *)(UINTN)PcdGet64 (PcdFfaRxBuffer); + BufferInfo->RxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; +} + +/** + Find Rx/TX buffer memory allocation hob. + + @param UseGuid Find MemoryAllocationHob using gArmFfaRxTxBufferInfoGuid. + + @retval MemoryAllocationHob + @retval NULL No memory allocation hob related to Rx/Tx buffer + +**/ +EFI_HOB_MEMORY_ALLOCATION * +EFIAPI +FindRxTxBufferAllocationHob ( + IN BOOLEAN UseGuid + ) +{ + EFI_PEI_HOB_POINTERS Hob; + EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHob; + EFI_PHYSICAL_ADDRESS BufferBase; + UINT64 BufferSize; + EFI_PHYSICAL_ADDRESS MemoryBase; + UINT64 MemorySize; + + BufferBase = (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdFfaTxBuffer); + BufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE * 2; + + if (!UseGuid && (BufferBase == 0x00)) { + return NULL; + } + + MemoryAllocationHob = NULL; + Hob.Raw = GetFirstHob (EFI_HOB_TYPE_MEMORY_ALLOCATION); + + while (Hob.Raw != NULL) { + if (Hob.MemoryAllocation->AllocDescriptor.MemoryType == EfiConventionalMemory) { + continue; + } + + MemoryBase = Hob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress; + MemorySize = Hob.MemoryAllocation->AllocDescriptor.MemoryLength; + + if ((!UseGuid && (BufferBase >= MemoryBase) && + ((BufferBase + BufferSize) <= (MemoryBase + MemorySize))) || + (UseGuid && CompareGuid ( + &gArmFfaRxTxBufferInfoGuid, + &Hob.MemoryAllocation->AllocDescriptor.Name + ))) + { + MemoryAllocationHob = (EFI_HOB_MEMORY_ALLOCATION *)Hob.Raw; + break; + } + + Hob.Raw = GET_NEXT_HOB (Hob); + Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, Hob.Raw); + } // while + + return MemoryAllocationHob; +} + +/** + Remap Rx/TX buffer with converted Rx/Tx Buffer address after + using permanent memory. + + @param[out] BufferInfo BufferInfo + + @retval EFI_SUCCESS Success + @retval EFI_NOT_FOUND No memory allocation hob related to Rx/Tx buffer + +**/ +EFI_STATUS +EFIAPI +RemapFfaRxTxBuffer ( + OUT ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo + ) +{ + EFI_STATUS Status; + ARM_FFA_ARGS FfaArgs; + UINTN NewBufferBase; + UINTN NewTxBuffer; + UINTN NewRxBuffer; + UINTN Property1; + UINTN Property2; + UINTN MinSizeAndAlign; + EFI_HOB_MEMORY_ALLOCATION *RxTxBufferAllocationHob; + + RxTxBufferAllocationHob = FindRxTxBufferAllocationHob (TRUE); + if (RxTxBufferAllocationHob == NULL) { + return EFI_NOT_FOUND; + } + + Status = ArmFfaLibGetFeatures ( + ARM_FID_FFA_RXTX_MAP, + FFA_RXTX_MAP_INPUT_PROPERTY_DEFAULT, + &Property1, + &Property2 + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to get RX/TX buffer property... Status: %r\n", + __func__, + Status + )); + return Status; + } + + MinSizeAndAlign = + ((Property1 >> + ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_SHIFT) & + ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_MASK); + + switch (MinSizeAndAlign) { + case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_4K: + MinSizeAndAlign = SIZE_4KB; + break; + case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_16K: + MinSizeAndAlign = SIZE_16KB; + break; + case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_64K: + MinSizeAndAlign = SIZE_64KB; + break; + default: + DEBUG ((DEBUG_ERROR, "%a: Invalid MinSizeAndAlign: 0x%x\n", __func__, MinSizeAndAlign)); + return EFI_UNSUPPORTED; + } + + ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); + FfaArgs.Arg0 = ARM_FID_FFA_RXTX_UNMAP; + FfaArgs.Arg1 = (gPartId << ARM_FFA_SOURCE_EP_SHIFT); + + ArmCallFfa (&FfaArgs); + Status = FfaArgsToEfiStatus (&FfaArgs); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to unmap Rx/Tx buffer. Status: %r\n", __func__, Status)); + return Status; + } + + PcdSet64S (PcdFfaTxBuffer, 0x00); + PcdSet64S (PcdFfaRxBuffer, 0x00); + + NewBufferBase = (UINTN)RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress + BufferInfo->RemapOffset; + NewTxBuffer = NewBufferBase; + NewRxBuffer = NewTxBuffer + (PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE); + + ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); + FfaArgs.Arg0 = ARM_FID_FFA_RXTX_MAP; + FfaArgs.Arg1 = NewTxBuffer; + FfaArgs.Arg2 = NewRxBuffer; + + /* + * PcdFfaTxRxPageCount sets with count of EFI_PAGE_SIZE granularity + * But, PageCounts for Tx/Rx buffer should set with + * count of Tx/Rx Buffer's MinSizeAndAlign. granularity. + */ + FfaArgs.Arg3 = PcdGet64 (PcdFfaTxRxPageCount) / EFI_SIZE_TO_PAGES (MinSizeAndAlign); + + ArmCallFfa (&FfaArgs); + Status = FfaArgsToEfiStatus (&FfaArgs); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to map with new Rx/Tx buffer. Status: %r\n", __func__, Status)); + return Status; + } + + PcdSet64S (PcdFfaTxBuffer, NewTxBuffer); + PcdSet64S (PcdFfaRxBuffer, NewRxBuffer); + + UpdateRxTxBufferInfo (BufferInfo); + + /* + * Remap is done. clear to AllocDesciptor.Name + * so that unnecessary remap happen again. + */ + ZeroMem (&RxTxBufferAllocationHob->AllocDescriptor.Name, sizeof (EFI_GUID)); + + return EFI_SUCCESS; +} diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.h b/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.h index 6c6bfaa3cded..5140865b5f09 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.h +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.h @@ -17,6 +17,8 @@ #ifndef ARM_FFA_RX_TX_MAP_LIB_H_ #define ARM_FFA_RX_TX_MAP_LIB_H_ +#include + /** Mapping Rx/Tx buffers. This function is only called in ArmFfaLibConstructor because @@ -51,4 +53,47 @@ ArmFfaLibRxTxUnmap ( IN VOID ); +/** + Update Rx/TX buffer information. + + @param BufferInfo Rx/Tx buffer information. + +**/ +VOID +EFIAPI +UpdateRxTxBufferInfo ( + OUT ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo + ); + +/** + Find Rx/TX buffer memory allocation hob. + + @param UseGuid Find MemoryAllocationHob using Guid. + + @retval MemoryAllocationHob + @retval NULL No memory allocation hob related to Rx/Tx buffer + +**/ +EFI_HOB_MEMORY_ALLOCATION * +EFIAPI +FindRxTxBufferAllocationHob ( + IN BOOLEAN UseGuid + ); + +/** + Remap Rx/TX buffer with converted Rx/Tx Buffer address after + using permanent memory. + + @param[out] BufferInfo BufferInfo + + @retval EFI_SUCCESS Success + @retval EFI_NOT_FOUND No memory allocation hob related to Rx/Tx buffer + +**/ +EFI_STATUS +EFIAPI +RemapFfaRxTxBuffer ( + IN OUT ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo + ); + #endif diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf index 863836af39fa..67b7b5c24a69 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf @@ -19,9 +19,9 @@ [Sources] ArmFfaCommon.h ArmFfaCommon.c - ArmFfaStandaloneMmLib.c ArmFfaRxTxMap.h - ArmFfaRxTxMapStmm.c + ArmFfaStandaloneMmRxTxMap.c + ArmFfaStandaloneMmLib.c [Packages] MdePkg/MdePkg.dec diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.inf b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.inf index 019eab3e5894..532dc195c66b 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.inf +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.inf @@ -19,9 +19,9 @@ [Sources] ArmFfaCommon.h ArmFfaCommon.c - ArmFfaStandaloneMmLib.c ArmFfaRxTxMap.h - ArmFfaRxTxMapStmm.c + ArmFfaStandaloneMmRxTxMap.c + ArmFfaStandaloneMmLib.c [Packages] MdePkg/MdePkg.dec diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMapStmm.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmRxTxMap.c similarity index 84% rename from MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMapStmm.c rename to MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmRxTxMap.c index e7c195121060..2d087ed5f299 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMapStmm.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmRxTxMap.c @@ -1,7 +1,7 @@ /** @file Arm Ffa library common code. - Copyright (c) 2024, Arm Limited. All rights reserved.
+ Copyright (c) 2024-2025, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @par Glossary: @@ -11,8 +11,7 @@ - Arm Firmware Framework for Arm A-Profile v1.3 ALP1: [https://developer.arm.com/documentation/den0077/l] **/ -#include -#include +#include #include #include @@ -319,3 +318,65 @@ ArmFfaLibRxTxUnmap ( return EFI_SUCCESS; } + +/** + Update Rx/TX buffer information. + + @param BufferInfo Rx/Tx buffer information. + +**/ +VOID +EFIAPI +UpdateRxTxBufferInfo ( + OUT ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo + ) +{ + /* + * StandaloneMm doesn't use Rx/Tx buffer. + */ + return; +} + +/** + Find Rx/TX buffer memory allocation hob. + + @param UseGuid Find MemoryAllocationHob using Guid. + + @retval MemoryAllocationHob + @retval NULL No memory allocation hob related to Rx/Tx buffer + +**/ +EFI_HOB_MEMORY_ALLOCATION * +EFIAPI +FindRxTxBufferAllocationHob ( + IN BOOLEAN UseGuid + ) +{ + /* + * StandaloneMm doesn't use Rx/Tx buffer. + */ + return NULL; +} + +/** + Remap Rx/TX buffer with converted Rx/Tx Buffer address after + using permanent memory. + + @param[out] BufferInfo BufferInfo + + @retval EFI_SUCCESS Success + @retval EFI_NOT_FOUND No memory allocation hob related to Rx/Tx buffer + +**/ +EFI_STATUS +EFIAPI +RemapFfaRxTxBuffer ( + OUT ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo + ) +{ + /* + * StandaloneMm doesn't use Rx/Tx buffer. + * So, return EFI_UNSUPPORTED. + */ + return EFI_UNSUPPORTED; +} From bbd810221ebd29bea789a3ed580ea2a8ed1eabd8 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Sat, 31 May 2025 14:18:25 +0100 Subject: [PATCH 0237/1172] MdeModulePkg: Make PcdFfaTxRxPageCount a PcdsFixedAtBuild PCD The PcdFfaTxRxPageCount can never be changed dynamically and is configured at build time to specify the size of the Rx/Tx buffers. Therefore, make PcdFfaTxRxPageCount a PcdsFixedAtBuild PCD. Signed-off-by: Yeoreum Yun --- MdeModulePkg/MdeModulePkg.dec | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 6ccca34eb74d..ed0b17ed9d5e 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -1211,6 +1211,10 @@ # @Prompt Defines the page allocation for the MM communication buffer; default is 128 pages (512KB). gEfiMdeModulePkgTokenSpaceGuid.PcdMmCommBufferPages|128|UINT32|0x30001061 + ## This PCD holds the number of pages for the FFA TX/RX buffer. + # @Prompt FFA TX/RX Buffer Page Count + gEfiMdeModulePkgTokenSpaceGuid.PcdFfaTxRxPageCount|1|UINT64|0x30001062 + [PcdsFixedAtBuild, PcdsPatchableInModule] ## Dynamic type PCD can be registered callback function for Pcd setting action. # PcdMaxPeiPcdCallBackNumberPerPcdEntry indicates the maximum number of callback function @@ -2368,10 +2372,6 @@ # @Prompt FFA RX Buffer Address gEfiMdeModulePkgTokenSpaceGuid.PcdFfaRxBuffer|0x00|UINT64|0x0003000A - ## This dynamic PCD holds the number of pages for the FFA TX/RX buffer. - # @Prompt FFA TX/RX Buffer Page Count - gEfiMdeModulePkgTokenSpaceGuid.PcdFfaTxRxPageCount|1|UINT64|0x0003000B - ## This dynamic PCD holds the information if the FFA exit boot event is registered. # @Prompt FFA Exit Boot Event Registered gEfiMdeModulePkgTokenSpaceGuid.PcdFfaExitBootEventRegistered|FALSE|BOOLEAN|0x0003000C From a7e27682cffe7cfbb48bcbaa11daf550a5cdd79c Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Mon, 2 Jun 2025 23:12:33 +0100 Subject: [PATCH 0238/1172] MdeModulePkg/Library: add ArmFfaSecLib To use Arm-FFA intereface in PeilessSec, implments ArmFfaSecLib used by PeilessSec. For example, communicate with TPM service using CRB over ARM-FFA (via Tpm2DeviceLibFfa), PeilessSec need to use Arm-FFA interface. Signed-off-by: Yeoreum Yun --- MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c | 29 +- MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c | 107 ++++++ .../Library/ArmFfaLib/ArmFfaSecLib.inf | 42 ++ .../Library/ArmFfaLib/ArmFfaSecRxTxMap.c | 363 ++++++++++++++++++ MdeModulePkg/MdeModulePkg.dsc | 1 + 5 files changed, 536 insertions(+), 6 deletions(-) create mode 100644 MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c create mode 100644 MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.inf create mode 100644 MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c index 8751f2f06e5d..ad2ed2f1fdef 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c @@ -98,15 +98,32 @@ ArmFfaDxeLibConstructor ( return EFI_SUCCESS; } - /* - * If PEIM uses ArmFfaPeiLib, the Rx/Tx buffers is already mapped in PEI phase. - * In this case, get Rx/Tx buffer info from Hob. - */ RxTxBufferHob = GetFirstGuidHob (&gArmFfaRxTxBufferInfoGuid); if (RxTxBufferHob != NULL) { BufferInfo = GET_GUID_HOB_DATA (RxTxBufferHob); - PcdSet64S (PcdFfaTxBuffer, (UINTN)BufferInfo->TxBufferAddr); - PcdSet64S (PcdFfaRxBuffer, (UINTN)BufferInfo->RxBufferAddr); + if (!BufferInfo->RemapRequired) { + /* + * ArmFfaPeiLib handles the Rx/Tx buffer Remap and update the + * BufferInfo with permanant memory. So use it as it is. + */ + PcdSet64S (PcdFfaTxBuffer, (UINTN)BufferInfo->TxBufferAddr); + PcdSet64S (PcdFfaRxBuffer, (UINTN)BufferInfo->RxBufferAddr); + } else { + /* + * SEC maps Rx/Tx buffer, But no PEIM module doesn't use + * ArmFfaPeiLib. In this case, the BufferInfo includes + * temporary Rx/Tx buffer address. + * + * Therefore, remap Rx/Tx buffer with migrated address again. + */ + Status = RemapFfaRxTxBuffer (BufferInfo); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to remap Rx/Tx buffer... Status: %r\n", __func__, Status)); + return Status; + } + + BufferInfo->RemapRequired = FALSE; + } } else { Status = ArmFfaLibRxTxMap (); diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c new file mode 100644 index 000000000000..fb62e61edabf --- /dev/null +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c @@ -0,0 +1,107 @@ +/** @file + Arm Ffa library code for PeilessSec + + Copyright (c) 2025, Arm Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Glossary: + - FF-A - Firmware Framework for Arm A-profile + + @par Reference(s): + - Arm Firmware Framework for Arm A-Profile [https://developer.arm.com/documentation/den0077/latest] + +**/ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include "ArmFfaCommon.h" +#include "ArmFfaRxTxMap.h" + +/** + ArmFfaLib Constructor. + + @param [in] FileHandle File Handle + @param [in] PeiServices Pei Service Table + + @retval EFI_SUCCESS Success + @retval Others Error + +**/ +EFI_STATUS +EFIAPI +ArmFfaSecLibConstructor ( + IN VOID + ) +{ + EFI_STATUS Status; + ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo; + EFI_HOB_MEMORY_ALLOCATION *RxTxBufferAllocationHob; + + Status = ArmFfaLibCommonInit (); + if (EFI_ERROR (Status)) { + if (Status == EFI_UNSUPPORTED) { + /* + * EFI_UNSUPPORTED return from ArmFfaLibCommonInit() means + * FF-A interface doesn't support. + * However, It doesn't make failure of loading driver/library instance + * (i.e) ArmPkg's MmCommunication Dxe/PEI Driver uses as well as SpmMm. + * So If FF-A is not supported the the MmCommunication Dxe/PEI falls + * back to SpmMm. + * For this case, return EFI_SUCCESS. + */ + return EFI_SUCCESS; + } + + return Status; + } + + Status = ArmFfaLibRxTxMap (); + if (EFI_ERROR (Status)) { + return Status; + } + + BufferInfo = BuildGuidHob ( + &gArmFfaRxTxBufferInfoGuid, + sizeof (ARM_FFA_RX_TX_BUFFER_INFO) + ); + if (BufferInfo == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Failed to create Rx/Tx Buffer Info Hob\n", __func__)); + ArmFfaLibRxTxUnmap (); + return EFI_OUT_OF_RESOURCES; + } + + RxTxBufferAllocationHob = FindRxTxBufferAllocationHob (FALSE); + ASSERT (RxTxBufferAllocationHob != NULL); + + /* + * Set then Name with gArmFfaRxTxBufferInfoGuid, so that ArmFfaPeiLib or + * ArmFfaDxeLib can find the Rx/Tx buffer allocation area. + */ + CopyGuid ( + &RxTxBufferAllocationHob->AllocDescriptor.Name, + &gArmFfaRxTxBufferInfoGuid + ); + + UpdateRxTxBufferInfo (BufferInfo); + BufferInfo->RemapOffset = + (UINTN)((EFI_PHYSICAL_ADDRESS)((UINTN)BufferInfo->TxBufferAddr) - + RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress); + BufferInfo->RemapRequired = TRUE; + + return EFI_SUCCESS; +} diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.inf b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.inf new file mode 100644 index 000000000000..611de85eb44e --- /dev/null +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.inf @@ -0,0 +1,42 @@ +## @file +# Provides FF-A ABI Library used in PeilessSec +# +# Copyright (c) 2025, Arm Limited. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = ArmFfaSecLib + FILE_GUID = 7b2c2aa6-3e20-11f0-a8b6-db774bafa249 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = ArmFfaLib|SEC + CONSTRUCTOR = ArmFfaSecLibConstructor + +[Sources] + ArmFfaCommon.h + ArmFfaCommon.c + ArmFfaRxTxMap.h + ArmFfaSecRxTxMap.c + ArmFfaSecLib.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + +[LibraryClasses] + ArmSmcLib + ArmSvcLib + BaseLib + BaseMemoryLib + DebugLib + HobLib + +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdFfaLibConduitSmc + gEfiMdeModulePkgTokenSpaceGuid.PcdFfaTxRxPageCount + +[Guids] + gArmFfaRxTxBufferInfoGuid diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c new file mode 100644 index 000000000000..fdc0dcefb971 --- /dev/null +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c @@ -0,0 +1,363 @@ +/** @file + Arm Ffa library common code. + + Copyright (c) 2025, Arm Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Glossary: + - FF-A - Firmware Framework for Arm A-profile + + @par Reference(s): + - Arm Firmware Framework for Arm A-Profile [https://developer.arm.com/documentation/den0077/latest] + +**/ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include "ArmFfaCommon.h" +#include "ArmFfaRxTxMap.h" + +STATIC VOID *mTxBuffer; +STATIC VOID *mRxBuffer; + +/** + Get mapped Rx/Tx buffers. + + @param [out] TxBuffer Address of TxBuffer + @param [out] TxBufferSize Size of TxBuffer + @param [out] RxBuffer Address of RxBuffer + @param [out] RxBufferSize Size of RxBuffer + + @retval EFI_SUCCESS + @retval Others Error. + +**/ +EFI_STATUS +EFIAPI +ArmFfaLibGetRxTxBuffers ( + OUT VOID **TxBuffer OPTIONAL, + OUT UINT64 *TxBufferSize OPTIONAL, + OUT VOID **RxBuffer OPTIONAL, + OUT UINT64 *RxBufferSize OPTIONAL + ) +{ + if ((mTxBuffer == NULL) || (mRxBuffer == NULL)) { + return EFI_NOT_READY; + } + + if (TxBuffer != NULL) { + *TxBuffer = mTxBuffer; + } + + if (TxBufferSize != NULL) { + *TxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + } + + if (RxBuffer != NULL) { + *RxBuffer = mRxBuffer; + } + + if (RxBufferSize != NULL) { + *RxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + } + + return EFI_SUCCESS; +} + +/** + Mapping Rx/Tx buffers. + This function is only called in ArmFfaLibConstructor because + Rx/Tx buffer is registered only once per partition. + + @retval EFI_SUCCESS + @retval EFI_ALREADY_STARTED Rx/Tx buffer already mapped. + @retval EFI_OUT_OF_RESOURCE Out of memory + @retval EFI_INVALID_PARAMETER Invalid alignment of Rx/Tx buffer + @retval Others Error + +**/ +EFI_STATUS +EFIAPI +ArmFfaLibRxTxMap ( + IN VOID + ) +{ + EFI_STATUS Status; + ARM_FFA_ARGS FfaArgs; + UINTN Property1; + UINTN Property2; + UINTN MinSizeAndAlign; + UINTN MaxSize; + VOID *Buffers; + VOID *TxBuffer; + VOID *RxBuffer; + + /* + * If someone already mapped Rx/Tx Buffers, return EFI_ALREADY_STARTED. + * return EFI_ALREADY_STARTED. + */ + if ((mTxBuffer != NULL) && (mRxBuffer != NULL)) { + return EFI_ALREADY_STARTED; + } + + Status = ArmFfaLibGetFeatures ( + ARM_FID_FFA_RXTX_MAP, + FFA_RXTX_MAP_INPUT_PROPERTY_DEFAULT, + &Property1, + &Property2 + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to get RX/TX buffer property... Status: %r\n", + __func__, + Status + )); + return Status; + } + + ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); + + MinSizeAndAlign = + ((Property1 >> + ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_SHIFT) & + ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_MASK); + + switch (MinSizeAndAlign) { + case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_4K: + MinSizeAndAlign = SIZE_4KB; + break; + case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_16K: + MinSizeAndAlign = SIZE_16KB; + break; + case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_64K: + MinSizeAndAlign = SIZE_64KB; + break; + default: + DEBUG ((DEBUG_ERROR, "%a: Invalid MinSizeAndAlign: 0x%x\n", __func__, MinSizeAndAlign)); + return EFI_UNSUPPORTED; + } + + MaxSize = + (((Property1 >> + ARM_FFA_BUFFER_MAXSIZE_PAGE_COUNT_SHIFT) & + ARM_FFA_BUFFER_MAXSIZE_PAGE_COUNT_MASK)); + + MaxSize = ((MaxSize == 0) ? MAX_UINTN : (MaxSize * MinSizeAndAlign)); + + if ((MinSizeAndAlign > (PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE)) || + (MaxSize < (PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE))) + { + DEBUG (( + DEBUG_ERROR, + "%a: Buffer is too small! MinSize: 0x%x, MaxSize: 0x%x, PageCount: %d\n", + __func__, + MinSizeAndAlign, + MaxSize, + PcdGet64 (PcdFfaTxRxPageCount) + )); + return EFI_INVALID_PARAMETER; + } + + Buffers = AllocateAlignedPages ((PcdGet64 (PcdFfaTxRxPageCount) * 2), MinSizeAndAlign); + if (Buffers == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + TxBuffer = Buffers; + RxBuffer = Buffers + (PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE); + + FfaArgs.Arg0 = ARM_FID_FFA_RXTX_MAP; + FfaArgs.Arg1 = (UINTN)TxBuffer; + FfaArgs.Arg2 = (UINTN)RxBuffer; + + /* + * PcdFfaTxRxPageCount sets with count of EFI_PAGE_SIZE granularity + * But, PageCounts for Tx/Rx buffer should set with + * count of Tx/Rx Buffer's MinSizeAndAlign. granularity. + */ + FfaArgs.Arg3 = PcdGet64 (PcdFfaTxRxPageCount) / EFI_SIZE_TO_PAGES (MinSizeAndAlign); + + ArmCallFfa (&FfaArgs); + + Status = FfaArgsToEfiStatus (&FfaArgs); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to map Rx/Tx buffer. Status: %r\n", + __func__, + Status + )); + goto ErrorHandler; + } + + mTxBuffer = TxBuffer; + mRxBuffer = RxBuffer; + + return EFI_SUCCESS; + +ErrorHandler: + FreePages (Buffers, (PcdGet64 (PcdFfaTxRxPageCount) * 2)); + + return Status; +} + +/** + Unmap Rx/Tx buffer. + This function is only called in Exit boot service because + Rx/Tx buffer is registered only once per partition. + + @retval EFI_SUCCESS + @retval EFI_INVALID_PARAMETERS Already unregistered + @retval EFI_UNSUPPORTED Not supported + +**/ +EFI_STATUS +EFIAPI +ArmFfaLibRxTxUnmap ( + IN VOID + ) +{ + EFI_STATUS Status; + ARM_FFA_ARGS FfaArgs; + VOID *Buffers; + + ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); + + FfaArgs.Arg0 = ARM_FID_FFA_RXTX_UNMAP; + FfaArgs.Arg1 = (gPartId << ARM_FFA_SOURCE_EP_SHIFT); + + ArmCallFfa (&FfaArgs); + + Status = FfaArgsToEfiStatus (&FfaArgs); + if (EFI_ERROR (Status)) { + return Status; + } + + /* + * Rx/Tx Buffer are allocated with continuous pages. + * and start address of these pages is set on PcdFfaTxBuffer. + * See ArmFfaLibRxTxMap(). + */ + Buffers = mTxBuffer; + if (Buffers != NULL) { + FreePages (Buffers, (PcdGet64 (PcdFfaTxRxPageCount) * 2)); + } + + mTxBuffer = NULL; + mRxBuffer = NULL; + + return EFI_SUCCESS; +} + +/** + Update Rx/TX buffer information. + + @param BufferInfo Rx/Tx buffer information. + +**/ +VOID +EFIAPI +UpdateRxTxBufferInfo ( + OUT ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo + ) +{ + BufferInfo->TxBufferAddr = mTxBuffer; + BufferInfo->TxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + BufferInfo->RxBufferAddr = mRxBuffer; + BufferInfo->RxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; +} + +/** + Find Rx/TX buffer memory allocation hob. + + @param UseGuid Find MemoryAllocationHob using Guid. + + @retval MemoryAllocationHob + @retval NULL No memory allocation hob related to Rx/Tx buffer + +**/ +EFI_HOB_MEMORY_ALLOCATION * +EFIAPI +FindRxTxBufferAllocationHob ( + IN BOOLEAN UseGuid + ) +{ + EFI_PEI_HOB_POINTERS Hob; + EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHob; + EFI_PHYSICAL_ADDRESS BufferBase; + UINT64 BufferSize; + EFI_PHYSICAL_ADDRESS MemoryBase; + UINT64 MemorySize; + + BufferBase = (EFI_PHYSICAL_ADDRESS)((UINTN)mTxBuffer); + BufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE * 2; + + if (!UseGuid && (BufferBase == 0x00)) { + return NULL; + } + + MemoryAllocationHob = NULL; + Hob.Raw = GetFirstHob (EFI_HOB_TYPE_MEMORY_ALLOCATION); + + while (Hob.Raw != NULL) { + if (Hob.MemoryAllocation->AllocDescriptor.MemoryType == EfiConventionalMemory) { + continue; + } + + MemoryBase = Hob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress; + MemorySize = Hob.MemoryAllocation->AllocDescriptor.MemoryLength; + + if ((!UseGuid && (BufferBase >= MemoryBase) && + ((BufferBase + BufferSize) <= (MemoryBase + MemorySize))) || + (UseGuid && CompareGuid ( + &gArmFfaRxTxBufferInfoGuid, + &Hob.MemoryAllocation->AllocDescriptor.Name + ))) + { + MemoryAllocationHob = (EFI_HOB_MEMORY_ALLOCATION *)Hob.Raw; + break; + } + + Hob.Raw = GET_NEXT_HOB (Hob); + Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, Hob.Raw); + } + + return MemoryAllocationHob; +} + +/** + Remap Rx/TX buffer with converted Rx/Tx Buffer address after + using permanent memory. + + @param[out] BufferInfo BufferInfo + + @retval EFI_SUCCESS Success + @retval EFI_NOT_FOUND No memory allocation hob related to Rx/Tx buffer + +**/ +EFI_STATUS +EFIAPI +RemapFfaRxTxBuffer ( + OUT ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo + ) +{ + /* + * SEC binary shouldn't remap the Rx/Tx Buffer. + */ + return EFI_UNSUPPORTED; +} diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc index 0c530c70c16a..2e0c665219f9 100644 --- a/MdeModulePkg/MdeModulePkg.dsc +++ b/MdeModulePkg/MdeModulePkg.dsc @@ -535,6 +535,7 @@ MdeModulePkg/Universal/CapsulePei/CapsuleX64.inf [Components.ARM, Components.AARCH64] + MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.inf MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.inf MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.inf MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf From 5a2713ec2b369da8c46fd2b41cc044e2d5026300 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Fri, 6 Jun 2025 15:16:07 +0100 Subject: [PATCH 0239/1172] MdeModulePkg/Library: commonize some duplicate code in ArmFfaLib Some of code for handling Rx/Tx buffer is duplicate. This patch commonize some of duplication routine used in Rx/Tx buffer related functions. Signed-off-by: Yeoreum Yun --- MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c | 146 ++++++++++++++++++ MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h | 37 +++++ .../Library/ArmFfaLib/ArmFfaRxTxMap.c | 138 +---------------- .../Library/ArmFfaLib/ArmFfaSecRxTxMap.c | 40 +---- .../ArmFfaLib/ArmFfaStandaloneMmRxTxMap.c | 58 +------ 5 files changed, 194 insertions(+), 225 deletions(-) diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c index 34234558132e..332628a5d553 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c @@ -21,12 +21,15 @@ #include #include #include +#include #include #include #include #include +#include + #include "ArmFfaCommon.h" BOOLEAN gFfaSupported; @@ -752,3 +755,146 @@ ArmFfaLibCommonInit ( return EFI_SUCCESS; } + +/** + Get first Rx/Tx Buffer allocation hob. + If UseGuid is TRUE, BufferAddr and BufferSize parameters are ignored. + + @param[in] BufferAddr Buffer address + @param[in] BufferSize Buffer Size + @param[in] UseGuid Find MemoryAllocationHob using gArmFfaRxTxBufferInfoGuid. + + @retval NULL Not found + @retval Other MemoryAllocationHob related to Rx/Tx buffer + +**/ +EFI_HOB_MEMORY_ALLOCATION * +EFIAPI +GetRxTxBufferAllocationHob ( + IN EFI_PHYSICAL_ADDRESS BufferAddr, + IN UINT64 BufferSize, + IN BOOLEAN UseGuid + ) +{ + EFI_PEI_HOB_POINTERS Hob; + EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHob; + EFI_PHYSICAL_ADDRESS MemoryBase; + UINT64 MemorySize; + + if (!UseGuid && (BufferAddr == 0x00)) { + return NULL; + } + + MemoryAllocationHob = NULL; + Hob.Raw = GetFirstHob (EFI_HOB_TYPE_MEMORY_ALLOCATION); + + while (Hob.Raw != NULL) { + if (Hob.MemoryAllocation->AllocDescriptor.MemoryType == EfiConventionalMemory) { + continue; + } + + MemoryBase = Hob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress; + MemorySize = Hob.MemoryAllocation->AllocDescriptor.MemoryLength; + + if ((!UseGuid && (BufferAddr >= MemoryBase) && + ((BufferAddr + BufferSize) <= (MemoryBase + MemorySize))) || + (UseGuid && CompareGuid ( + &gArmFfaRxTxBufferInfoGuid, + &Hob.MemoryAllocation->AllocDescriptor.Name + ))) + { + MemoryAllocationHob = (EFI_HOB_MEMORY_ALLOCATION *)Hob.Raw; + break; + } + + Hob.Raw = GET_NEXT_HOB (Hob); + Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, Hob.Raw); + } + + return MemoryAllocationHob; +} + +/** + Get Rx/Tx buffer MinSizeAndAign and MaxSize + + @param[out] MinSizeAndAlign Minimum size of Buffer. + + @retval EFI_SUCCESS + @retval EFI_UNSUPPORTED Wrong min size received from SPMC + @retval EFI_INVALID_PARAMETER Wrong buffer size + @retval Others Failure of ArmFfaLibGetFeatures() + +**/ +EFI_STATUS +EFIAPI +GetRxTxBufferMinSizeAndAlign ( + OUT UINTN *MinSizeAndAlign + ) +{ + EFI_STATUS Status; + UINTN MinAndAlign; + UINTN MaxSize; + UINTN Property1; + UINTN Property2; + + Status = ArmFfaLibGetFeatures ( + ARM_FID_FFA_RXTX_MAP, + FFA_RXTX_MAP_INPUT_PROPERTY_DEFAULT, + &Property1, + &Property2 + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to get RX/TX buffer property... Status: %r\n", + __func__, + Status + )); + return Status; + } + + MinAndAlign = + ((Property1 >> + ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_SHIFT) & + ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_MASK); + + switch (MinAndAlign) { + case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_4K: + MinAndAlign = SIZE_4KB; + break; + case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_16K: + MinAndAlign = SIZE_16KB; + break; + case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_64K: + MinAndAlign = SIZE_64KB; + break; + default: + DEBUG ((DEBUG_ERROR, "%a: Invalid MinSizeAndAlign: 0x%x\n", __func__, MinAndAlign)); + return EFI_UNSUPPORTED; + } + + MaxSize = + (((Property1 >> + ARM_FFA_BUFFER_MAXSIZE_PAGE_COUNT_SHIFT) & + ARM_FFA_BUFFER_MAXSIZE_PAGE_COUNT_MASK)); + + MaxSize = ((MaxSize == 0) ? MAX_UINTN : (MaxSize * MinAndAlign)); + + if ((MinAndAlign > (PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE)) || + (MaxSize < (PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE))) + { + DEBUG (( + DEBUG_ERROR, + "%a: Buffer is too small! MinSize: 0x%x, MaxSize: 0x%x, PageCount: %d\n", + __func__, + MinAndAlign, + MaxSize, + PcdGet64 (PcdFfaTxRxPageCount) + )); + return EFI_INVALID_PARAMETER; + } + + *MinSizeAndAlign = MinAndAlign; + + return EFI_SUCCESS; +} diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h index 5bb1b77d7578..1994dd8eef39 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h @@ -49,4 +49,41 @@ ArmFfaLibCommonInit ( IN VOID ); +/** + Get first Rx/Tx Buffer allocation hob. + If UseGuid is TRUE, BufferAddr and BufferSize parameters are ignored. + + @param[in] BufferAddr Buffer address + @param[in] BufferSize Buffer Size + @param[in] UseGuid Find MemoryAllocationHob using gArmFfaRxTxBufferInfoGuid. + + @retval NULL Not found + @retval Other MemoryAllocationHob related to Rx/Tx buffer + +**/ +EFI_HOB_MEMORY_ALLOCATION * +EFIAPI +GetRxTxBufferAllocationHob ( + IN EFI_PHYSICAL_ADDRESS BufferAddr, + IN UINT64 BufferSize, + IN BOOLEAN UseGuid + ); + +/** + Get Rx/Tx buffer MinSizeAndAign and MaxSize + + @param[out] MinSizeAndAlign Minimum size of Buffer. + + @retval EFI_SUCCESS + @retval EFI_UNSUPPORTED Wrong min size received from SPMC + @retval EFI_INVALID_PARAMETER Wrong buffer size + @retval Others Failure of ArmFfaLibGetFeatures() + +**/ +EFI_STATUS +EFIAPI +GetRxTxBufferMinSizeAndAlign ( + OUT UINTN *MinSizeAndAlign + ); + #endif diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c index 528058e607cb..6b753320a069 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c @@ -101,10 +101,7 @@ ArmFfaLibRxTxMap ( { EFI_STATUS Status; ARM_FFA_ARGS FfaArgs; - UINTN Property1; - UINTN Property2; UINTN MinSizeAndAlign; - UINTN MaxSize; VOID *Buffers; VOID *TxBuffer; VOID *RxBuffer; @@ -122,65 +119,11 @@ ArmFfaLibRxTxMap ( return EFI_ALREADY_STARTED; } - Status = ArmFfaLibGetFeatures ( - ARM_FID_FFA_RXTX_MAP, - FFA_RXTX_MAP_INPUT_PROPERTY_DEFAULT, - &Property1, - &Property2 - ); + Status = GetRxTxBufferMinSizeAndAlign (&MinSizeAndAlign); if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "%a: Failed to get RX/TX buffer property... Status: %r\n", - __func__, - Status - )); return Status; } - ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); - - MinSizeAndAlign = - ((Property1 >> - ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_SHIFT) & - ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_MASK); - - switch (MinSizeAndAlign) { - case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_4K: - MinSizeAndAlign = SIZE_4KB; - break; - case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_16K: - MinSizeAndAlign = SIZE_16KB; - break; - case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_64K: - MinSizeAndAlign = SIZE_64KB; - break; - default: - DEBUG ((DEBUG_ERROR, "%a: Invalid MinSizeAndAlign: 0x%x\n", __func__, MinSizeAndAlign)); - return EFI_UNSUPPORTED; - } - - MaxSize = - (((Property1 >> - ARM_FFA_BUFFER_MAXSIZE_PAGE_COUNT_SHIFT) & - ARM_FFA_BUFFER_MAXSIZE_PAGE_COUNT_MASK)); - - MaxSize = ((MaxSize == 0) ? MAX_UINTN : (MaxSize * MinSizeAndAlign)); - - if ((MinSizeAndAlign > (PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE)) || - (MaxSize < (PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE))) - { - DEBUG (( - DEBUG_ERROR, - "%a: Buffer is too small! MinSize: 0x%x, MaxSize: 0x%x, PageCount: %d\n", - __func__, - MinSizeAndAlign, - MaxSize, - PcdGet64 (PcdFfaTxRxPageCount) - )); - return EFI_INVALID_PARAMETER; - } - Buffers = AllocateAlignedPages ((PcdGet64 (PcdFfaTxRxPageCount) * 2), MinSizeAndAlign); if (Buffers == NULL) { return EFI_OUT_OF_RESOURCES; @@ -189,6 +132,7 @@ ArmFfaLibRxTxMap ( TxBuffer = Buffers; RxBuffer = Buffers + BufferSize; + ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); FfaArgs.Arg0 = ARM_FID_FFA_RXTX_MAP; FfaArgs.Arg1 = (UINTN)TxBuffer; FfaArgs.Arg2 = (UINTN)RxBuffer; @@ -307,47 +251,13 @@ FindRxTxBufferAllocationHob ( IN BOOLEAN UseGuid ) { - EFI_PEI_HOB_POINTERS Hob; - EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHob; - EFI_PHYSICAL_ADDRESS BufferBase; - UINT64 BufferSize; - EFI_PHYSICAL_ADDRESS MemoryBase; - UINT64 MemorySize; + EFI_PHYSICAL_ADDRESS BufferBase; + UINT64 BufferSize; BufferBase = (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdFfaTxBuffer); BufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE * 2; - if (!UseGuid && (BufferBase == 0x00)) { - return NULL; - } - - MemoryAllocationHob = NULL; - Hob.Raw = GetFirstHob (EFI_HOB_TYPE_MEMORY_ALLOCATION); - - while (Hob.Raw != NULL) { - if (Hob.MemoryAllocation->AllocDescriptor.MemoryType == EfiConventionalMemory) { - continue; - } - - MemoryBase = Hob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress; - MemorySize = Hob.MemoryAllocation->AllocDescriptor.MemoryLength; - - if ((!UseGuid && (BufferBase >= MemoryBase) && - ((BufferBase + BufferSize) <= (MemoryBase + MemorySize))) || - (UseGuid && CompareGuid ( - &gArmFfaRxTxBufferInfoGuid, - &Hob.MemoryAllocation->AllocDescriptor.Name - ))) - { - MemoryAllocationHob = (EFI_HOB_MEMORY_ALLOCATION *)Hob.Raw; - break; - } - - Hob.Raw = GET_NEXT_HOB (Hob); - Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, Hob.Raw); - } // while - - return MemoryAllocationHob; + return GetRxTxBufferAllocationHob (BufferBase, BufferSize, UseGuid); } /** @@ -371,8 +281,6 @@ RemapFfaRxTxBuffer ( UINTN NewBufferBase; UINTN NewTxBuffer; UINTN NewRxBuffer; - UINTN Property1; - UINTN Property2; UINTN MinSizeAndAlign; EFI_HOB_MEMORY_ALLOCATION *RxTxBufferAllocationHob; @@ -381,41 +289,7 @@ RemapFfaRxTxBuffer ( return EFI_NOT_FOUND; } - Status = ArmFfaLibGetFeatures ( - ARM_FID_FFA_RXTX_MAP, - FFA_RXTX_MAP_INPUT_PROPERTY_DEFAULT, - &Property1, - &Property2 - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "%a: Failed to get RX/TX buffer property... Status: %r\n", - __func__, - Status - )); - return Status; - } - - MinSizeAndAlign = - ((Property1 >> - ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_SHIFT) & - ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_MASK); - - switch (MinSizeAndAlign) { - case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_4K: - MinSizeAndAlign = SIZE_4KB; - break; - case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_16K: - MinSizeAndAlign = SIZE_16KB; - break; - case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_64K: - MinSizeAndAlign = SIZE_64KB; - break; - default: - DEBUG ((DEBUG_ERROR, "%a: Invalid MinSizeAndAlign: 0x%x\n", __func__, MinSizeAndAlign)); - return EFI_UNSUPPORTED; - } + Status = GetRxTxBufferMinSizeAndAlign (&MinSizeAndAlign); ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); FfaArgs.Arg0 = ARM_FID_FFA_RXTX_UNMAP; diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c index fdc0dcefb971..13f52157cac8 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c @@ -297,47 +297,13 @@ FindRxTxBufferAllocationHob ( IN BOOLEAN UseGuid ) { - EFI_PEI_HOB_POINTERS Hob; - EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHob; - EFI_PHYSICAL_ADDRESS BufferBase; - UINT64 BufferSize; - EFI_PHYSICAL_ADDRESS MemoryBase; - UINT64 MemorySize; + EFI_PHYSICAL_ADDRESS BufferBase; + UINT64 BufferSize; BufferBase = (EFI_PHYSICAL_ADDRESS)((UINTN)mTxBuffer); BufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE * 2; - if (!UseGuid && (BufferBase == 0x00)) { - return NULL; - } - - MemoryAllocationHob = NULL; - Hob.Raw = GetFirstHob (EFI_HOB_TYPE_MEMORY_ALLOCATION); - - while (Hob.Raw != NULL) { - if (Hob.MemoryAllocation->AllocDescriptor.MemoryType == EfiConventionalMemory) { - continue; - } - - MemoryBase = Hob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress; - MemorySize = Hob.MemoryAllocation->AllocDescriptor.MemoryLength; - - if ((!UseGuid && (BufferBase >= MemoryBase) && - ((BufferBase + BufferSize) <= (MemoryBase + MemorySize))) || - (UseGuid && CompareGuid ( - &gArmFfaRxTxBufferInfoGuid, - &Hob.MemoryAllocation->AllocDescriptor.Name - ))) - { - MemoryAllocationHob = (EFI_HOB_MEMORY_ALLOCATION *)Hob.Raw; - break; - } - - Hob.Raw = GET_NEXT_HOB (Hob); - Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, Hob.Raw); - } - - return MemoryAllocationHob; + return GetRxTxBufferAllocationHob (BufferBase, BufferSize, UseGuid); } /** diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmRxTxMap.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmRxTxMap.c index 2d087ed5f299..c2c7f1b1f538 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmRxTxMap.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmRxTxMap.c @@ -112,10 +112,7 @@ ArmFfaLibRxTxMap ( { EFI_STATUS Status; ARM_FFA_ARGS FfaArgs; - UINTN Property1; - UINTN Property2; UINTN MinSizeAndAlign; - UINTN MaxSize; VOID *Buffers; VOID *TxBuffer; VOID *RxBuffer; @@ -131,63 +128,11 @@ ArmFfaLibRxTxMap ( return EFI_ALREADY_STARTED; } - Status = ArmFfaLibGetFeatures ( - ARM_FID_FFA_RXTX_MAP, - FFA_RXTX_MAP_INPUT_PROPERTY_DEFAULT, - &Property1, - &Property2 - ); + Status = GetRxTxBufferMinSizeAndAlign (&MinSizeAndAlign); if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "%a: Failed to get RX/TX buffer property... Status: %r\n", - __func__, - Status - )); return Status; } - ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); - - MinSizeAndAlign = - ((Property1 >> - ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_SHIFT) & - ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_MASK); - - switch (MinSizeAndAlign) { - case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_4K: - MinSizeAndAlign = SIZE_4KB; - break; - case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_16K: - MinSizeAndAlign = SIZE_16KB; - break; - case ARM_FFA_BUFFER_MINSIZE_AND_ALIGN_64K: - MinSizeAndAlign = SIZE_64KB; - break; - default: - DEBUG ((DEBUG_ERROR, "%a: Invalid MinSizeAndAlign: 0x%x\n", __func__, MinSizeAndAlign)); - return EFI_UNSUPPORTED; - } - - MaxSize = (Property1 >> ARM_FFA_BUFFER_MAXSIZE_PAGE_COUNT_SHIFT) & - ARM_FFA_BUFFER_MAXSIZE_PAGE_COUNT_MASK; - - MaxSize = ((MaxSize == 0) ? MAX_UINTN : (MaxSize * MinSizeAndAlign)); - - if ((MinSizeAndAlign > (PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE)) || - (MaxSize < (PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE))) - { - DEBUG (( - DEBUG_ERROR, - "%a: Buffer is too small! MinSize: 0x%x, MaxSize: 0x%x, PageCount: %d\n", - __func__, - MinSizeAndAlign, - MaxSize, - PcdGet64 (PcdFfaTxRxPageCount) - )); - return EFI_INVALID_PARAMETER; - } - Buffers = AllocateAlignedPages ((PcdGet64 (PcdFfaTxRxPageCount) * 2), MinSizeAndAlign); if (Buffers == NULL) { return EFI_OUT_OF_RESOURCES; @@ -197,6 +142,7 @@ ArmFfaLibRxTxMap ( TxBuffer = Buffers; RxBuffer = Buffers + BufferSize; + ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); FfaArgs.Arg0 = ARM_FID_FFA_RXTX_MAP; FfaArgs.Arg1 = (UINTN)TxBuffer; FfaArgs.Arg2 = (UINTN)RxBuffer; From f85c71816702b068019957e7fd532db51dab9c7e Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Mon, 30 Jun 2025 11:03:36 +0100 Subject: [PATCH 0240/1172] MdeModulePkg/Include: change type of buffer address in ArmFfaRxTxBufferInfo Change type of buffer address type in ArmFfaRxTxBufferInfo so that reduce the type casting. Signed-off-by: Yeoreum Yun --- MdeModulePkg/Include/Guid/ArmFfaRxTxBufferInfo.h | 14 ++++++++------ MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c | 2 +- MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c | 4 ++-- MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c | 2 +- MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c | 4 ++-- .../Library/ArmFfaLib/ArmFfaStandaloneMmRxTxMap.c | 4 ++-- 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/MdeModulePkg/Include/Guid/ArmFfaRxTxBufferInfo.h b/MdeModulePkg/Include/Guid/ArmFfaRxTxBufferInfo.h index 763dd615084d..d38f8cec614a 100644 --- a/MdeModulePkg/Include/Guid/ArmFfaRxTxBufferInfo.h +++ b/MdeModulePkg/Include/Guid/ArmFfaRxTxBufferInfo.h @@ -9,27 +9,29 @@ #ifndef ARM_FFA_RX_TX_BUFFER_INFO_H_ #define ARM_FFA_RX_TX_BUFFER_INFO_H_ +#include + /** * Guid Hob Data for gArmFfaRxTxBufferInfoGuid Guid Hob. */ typedef struct ArmFfaRxTxBuffersInfo { /// Tx Buffer Address. - VOID *TxBufferAddr; + EFI_PHYSICAL_ADDRESS TxBufferAddr; /// Tx Buffer Size. - UINT64 TxBufferSize; + UINT64 TxBufferSize; /// Rx Buffer Address. - VOID *RxBufferAddr; + EFI_PHYSICAL_ADDRESS RxBufferAddr; /// Rx Buffer Size. - UINT64 RxBufferSize; + UINT64 RxBufferSize; /// Rx/Tx buffer should be remapped to permanent memory. - BOOLEAN RemapRequired; + BOOLEAN RemapRequired; /// Rx/Tx buffer offset from its allocation base. - UINT64 RemapOffset; + UINT64 RemapOffset; } ARM_FFA_RX_TX_BUFFER_INFO; extern EFI_GUID gArmFfaRxTxBufferInfoGuid; diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c index a85a616f15b4..e2dd99be673d 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c @@ -169,7 +169,7 @@ ArmFfaPeiLibConstructor ( RxTxBufferAllocationHob = FindRxTxBufferAllocationHob (FALSE); ASSERT (RxTxBufferAllocationHob != NULL); BufferInfo->RemapOffset = - (UINTN)((EFI_PHYSICAL_ADDRESS)((UINTN)BufferInfo->TxBufferAddr) - + (UINTN)(BufferInfo->TxBufferAddr - RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress); CopyGuid ( diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c index 6b753320a069..4f0e1a4e8f3e 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c @@ -230,9 +230,9 @@ UpdateRxTxBufferInfo ( OUT ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo ) { - BufferInfo->TxBufferAddr = (VOID *)(UINTN)PcdGet64 (PcdFfaTxBuffer); + BufferInfo->TxBufferAddr = PcdGet64 (PcdFfaTxBuffer); BufferInfo->TxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; - BufferInfo->RxBufferAddr = (VOID *)(UINTN)PcdGet64 (PcdFfaRxBuffer); + BufferInfo->RxBufferAddr = PcdGet64 (PcdFfaRxBuffer); BufferInfo->RxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; } diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c index fb62e61edabf..7c3d39d270fd 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c @@ -99,7 +99,7 @@ ArmFfaSecLibConstructor ( UpdateRxTxBufferInfo (BufferInfo); BufferInfo->RemapOffset = - (UINTN)((EFI_PHYSICAL_ADDRESS)((UINTN)BufferInfo->TxBufferAddr) - + (UINTN)(BufferInfo->TxBufferAddr - RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress); BufferInfo->RemapRequired = TRUE; diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c index 13f52157cac8..7c44e80822fc 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c @@ -276,9 +276,9 @@ UpdateRxTxBufferInfo ( OUT ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo ) { - BufferInfo->TxBufferAddr = mTxBuffer; + BufferInfo->TxBufferAddr = (UINTN)mTxBuffer; BufferInfo->TxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; - BufferInfo->RxBufferAddr = mRxBuffer; + BufferInfo->RxBufferAddr = (UINTN)mRxBuffer; BufferInfo->RxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; } diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmRxTxMap.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmRxTxMap.c index c2c7f1b1f538..d368c329eeb0 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmRxTxMap.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmRxTxMap.c @@ -173,8 +173,8 @@ ArmFfaLibRxTxMap ( goto ErrorHandler; } - mArmFfaRxTxBufferStmmInfo->TxBufferAddr = TxBuffer; - mArmFfaRxTxBufferStmmInfo->RxBufferAddr = RxBuffer; + mArmFfaRxTxBufferStmmInfo->TxBufferAddr = (UINTN)TxBuffer; + mArmFfaRxTxBufferStmmInfo->RxBufferAddr = (UINTN)RxBuffer; mArmFfaRxTxBufferStmmInfo->TxBufferSize = BufferSize; mArmFfaRxTxBufferStmmInfo->RxBufferSize = BufferSize; From bfd90d47abb630fba6ab30ec865031f678c0af18 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Thu, 10 Jul 2025 05:46:32 +0200 Subject: [PATCH 0241/1172] ArmPkg/ArmGicV3Dxe: Make v3 driver AArch64-only Before extending the GicV3Dxe driver with support for GICv5, make the driver AArch64-only to avoid the need for adding support to the 32-bit build, which would be rather pointless. Signed-off-by: Ard Biesheuvel --- ArmPkg/ArmPkg.dsc | 2 +- ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/ArmPkg/ArmPkg.dsc b/ArmPkg/ArmPkg.dsc index 50b5bdb92338..fb418674466a 100644 --- a/ArmPkg/ArmPkg.dsc +++ b/ArmPkg/ArmPkg.dsc @@ -123,7 +123,6 @@ ArmPkg/Drivers/CpuPei/CpuPei.inf ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf ArmPkg/Drivers/ArmGicDxe/ArmGicV2Dxe.inf - ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf ArmPkg/Drivers/GenericWatchdogDxe/GenericWatchdogDxe.inf ArmPkg/Drivers/TimerDxe/TimerDxe.inf @@ -163,6 +162,7 @@ [Components.AARCH64] ArmPkg/Drivers/ArmCrashDumpDxe/ArmCrashDumpDxe.inf + ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf ArmPkg/Drivers/ArmPsciMpServicesDxe/ArmPsciMpServicesDxe.inf ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.inf diff --git a/ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf b/ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf index a74018217f26..c177b2746017 100644 --- a/ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf +++ b/ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf @@ -21,11 +21,6 @@ ArmGicDxe.c ArmGicDxe.h GicV3/ArmGicV3Dxe.c - -[Sources.ARM] - GicV3/Arm/ArmGicV3.S | GCC - -[Sources.AARCH64] GicV3/AArch64/ArmGicV3.S [Packages] From 42b30dbc034e6af1d078e81b8381e0e81b06337f Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Tue, 14 Jan 2025 14:13:04 +0000 Subject: [PATCH 0242/1172] MdePkg: Include: Add defines for AA64PFR2 system register The AA64PFR2 system register is required to detect GICv5 support. Signed-off-by: Sarah Walker --- MdePkg/Include/AArch64/AArch64.h | 13 +++++++------ MdePkg/Include/Library/ArmLib.h | 12 ++++++++++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/MdePkg/Include/AArch64/AArch64.h b/MdePkg/Include/AArch64/AArch64.h index 4e5830c3752d..a2c554383705 100644 --- a/MdePkg/Include/AArch64/AArch64.h +++ b/MdePkg/Include/AArch64/AArch64.h @@ -33,6 +33,9 @@ #define AARCH64_PFR0_FP (0xF << 16) #define AARCH64_PFR0_GIC (0xF << 24) +// ID_AA64PFR2 - AArch64 Processor Feature Register 2 definitions +#define AARCH64_PFR2_GCIE (0xF << 12) + // ID_AA64DFR0 - AArch64 Debug Feature Register 0 definitions #define AARCH64_DFR0_TRACEVER (0xFULL << 4) #define AARCH64_DFR0_TRBE (0xFULL << 44) @@ -122,18 +125,16 @@ #define ARM_VECTOR_LOW_A32_FIQ 0x700 #define ARM_VECTOR_LOW_A32_SERR 0x780 -// The ID_AA64ISAR2_EL1 register is not recognized by older -// assemblers, we need to define it here. +// Definitions for ID registers introducted post ARMv8.0 and not +// given symbolic names in all relevant assemblers. #define ID_AA64ISAR2_EL1 S3_0_C0_C6_2 -// The ID_AA64MMFR2_EL1 register was added in ARMv8.2. Since we -// build for ARMv8.0, we need to define the register here. #define ID_AA64MMFR2_EL1 S3_0_C0_C7_2 -// The RNDR register is not recognized by older assemblers, -// so we need to define it here #define RNDR S3_3_C2_C4_0 +#define ID_AA64PFR2_EL1 S3_0_C0_C4_2 + #define VECTOR_BASE(tbl) \ .section .text.##tbl##,"ax"; \ .align 11; \ diff --git a/MdePkg/Include/Library/ArmLib.h b/MdePkg/Include/Library/ArmLib.h index a5823afdb24b..52ff1b86b9fe 100644 --- a/MdePkg/Include/Library/ArmLib.h +++ b/MdePkg/Include/Library/ArmLib.h @@ -699,6 +699,18 @@ ArmHasGicSystemRegisters ( VOID ); +/** + Check whether the CPU supports the GICv5 system register interface + + @return Whether GICv5 System Register Interface is supported + +**/ +BOOLEAN +EFIAPI +ArmHasGicV5SystemRegisters ( + VOID + ); + /** Checks if CCIDX is implemented. @retval TRUE CCIDX is implemented. From e1ac8b32a6492d8b60e5759f955d27304df14898 Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Thu, 16 Jan 2025 16:13:33 +0000 Subject: [PATCH 0243/1172] ArmPkg: ArmLib: Add functions to read AA64PFR2 and check GICv5 support Signed-off-by: Sarah Walker --- ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c | 14 ++++++++++++++ ArmPkg/Library/ArmLib/AArch64/AArch64Lib.h | 6 ++++++ ArmPkg/Library/ArmLib/AArch64/AArch64Support.S | 4 ++++ ArmPkg/Library/ArmLib/Arm/ArmV7Lib.c | 15 +++++++++++++++ 4 files changed, 39 insertions(+) diff --git a/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c b/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c index b0ae2baa7bbd..af91c9564e6a 100644 --- a/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c +++ b/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c @@ -33,6 +33,20 @@ ArmHasGicSystemRegisters ( return ((ArmReadIdAA64Pfr0 () & AARCH64_PFR0_GIC) != 0); } +/** + Check whether the CPU supports the GICv5 system register interface + + @return Whether GICv5 System Register Interface is supported +**/ +BOOLEAN +EFIAPI +ArmHasGicV5SystemRegisters ( + VOID + ) +{ + return ((ArmReadIdAA64Pfr2 () & AARCH64_PFR2_GCIE) != 0); +} + /** Checks if CCIDX is implemented. @retval TRUE CCIDX is implemented. diff --git a/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.h b/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.h index 7127a768ef8e..28df5f58f1ed 100644 --- a/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.h +++ b/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.h @@ -75,4 +75,10 @@ ArmReadIdAA64Pfr1 ( VOID ); +UINTN +EFIAPI +ArmReadIdAA64Pfr2 ( + VOID + ); + #endif // AARCH64_LIB_H_ diff --git a/ArmPkg/Library/ArmLib/AArch64/AArch64Support.S b/ArmPkg/Library/ArmLib/AArch64/AArch64Support.S index 9ad460559e79..54a2b8cecd8d 100644 --- a/ArmPkg/Library/ArmLib/AArch64/AArch64Support.S +++ b/ArmPkg/Library/ArmLib/AArch64/AArch64Support.S @@ -389,4 +389,8 @@ ASM_FUNC(ArmReadIdAA64Pfr1) mrs x0, ID_AA64PFR1_EL1 ret +ASM_FUNC(ArmReadIdAA64Pfr2) + mrs x0, ID_AA64PFR2_EL1 + ret + ASM_FUNCTION_REMOVE_IF_UNREFERENCED diff --git a/ArmPkg/Library/ArmLib/Arm/ArmV7Lib.c b/ArmPkg/Library/ArmLib/Arm/ArmV7Lib.c index dd1e8c5930c2..ee04294d2210 100644 --- a/ArmPkg/Library/ArmLib/Arm/ArmV7Lib.c +++ b/ArmPkg/Library/ArmLib/Arm/ArmV7Lib.c @@ -33,6 +33,21 @@ ArmHasGicSystemRegisters ( return ((ArmReadIdPfr1 () & ARM_PFR1_GIC) != 0); } +/** + Check whether the CPU supports the GICv5 system register interface + + @return Whether GICv5 System Register Interface is supported +**/ +BOOLEAN +EFIAPI +ArmHasGicV5SystemRegisters ( + VOID + ) +{ + // GICv5 not supported in AArch32. + return FALSE; +} + /** Check whether the CPU supports the Security extensions From b7fdcbbeb8ff45db0c7199799a6e8a7e9de14cc5 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Thu, 10 Jul 2025 07:44:22 +0200 Subject: [PATCH 0244/1172] ArmPkg: ArmGicDxe: Add support for GICv5 Add initial driver support for GICv5. This initial driver supports Private Peripheral Interrupts (PPIs) and Shared Peripheral Interrupts (SPIs). Signed-off-by: Sarah Walker [ardb: Merge v5 support into GicV3Dxe] Signed-off-by: Ard Biesheuvel --- ArmPkg/ArmPkg.dec | 1 + ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.c | 2 +- ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h | 6 + ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf | 5 + ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf | 4 + ArmPkg/Drivers/ArmGicDxe/GicV3/ArmGicV3Dxe.c | 4 + .../ArmGicDxe/GicV5/AArch64/ArmGicV5.S | 182 +++++ ArmPkg/Drivers/ArmGicDxe/GicV5/Arm/ArmGicV5.c | 25 + ArmPkg/Drivers/ArmGicDxe/GicV5/ArmGicV5.h | 186 ++++++ ArmPkg/Drivers/ArmGicDxe/GicV5/ArmGicV5Dxe.c | 620 ++++++++++++++++++ ArmPkg/Include/Library/ArmGicLib.h | 13 + 11 files changed, 1047 insertions(+), 1 deletion(-) create mode 100644 ArmPkg/Drivers/ArmGicDxe/GicV5/AArch64/ArmGicV5.S create mode 100644 ArmPkg/Drivers/ArmGicDxe/GicV5/Arm/ArmGicV5.c create mode 100644 ArmPkg/Drivers/ArmGicDxe/GicV5/ArmGicV5.h create mode 100644 ArmPkg/Drivers/ArmGicDxe/GicV5/ArmGicV5Dxe.c diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec index 04252dab06c9..ab3c3b365a77 100644 --- a/ArmPkg/ArmPkg.dec +++ b/ArmPkg/ArmPkg.dec @@ -303,6 +303,7 @@ gArmTokenSpaceGuid.PcdGicRedistributorsBase|0|UINT64|0x0000000E gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase|0|UINT64|0x0000000D gArmTokenSpaceGuid.PcdGicSgiIntId|0|UINT32|0x00000025 + gArmTokenSpaceGuid.PcdGicIrsConfigFrameBase|0|UINT64|0x00000064 # # Bases, sizes and translation offsets of IO and MMIO spaces, respectively. diff --git a/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.c b/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.c index b0da48e3a370..ecee83fdc5a5 100644 --- a/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.c +++ b/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.c @@ -74,7 +74,7 @@ InterruptDxeInitialize ( { EFI_STATUS Status; - if (!GicV3Supported ()) { + if (!GicV3Supported () && !ArmHasGicV5SystemRegisters ()) { Status = GicV2DxeInitialize (ImageHandle, SystemTable); } else { Status = GicV3DxeInitialize (ImageHandle, SystemTable); diff --git a/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h b/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h index dba0d322c7d1..610792f8b465 100644 --- a/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h +++ b/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h @@ -37,6 +37,12 @@ GicV3DxeInitialize ( IN EFI_SYSTEM_TABLE *SystemTable ); +// GicV5 API +EFI_STATUS +GicV5DxeInitialize ( + VOID + ); + // Shared code EFI_STATUS diff --git a/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf b/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf index 688993b89de8..6d4d78456080 100644 --- a/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf +++ b/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf @@ -26,9 +26,12 @@ [Sources.ARM] GicV3/Arm/ArmGicV3.S | GCC + GicV5/Arm/ArmGicV5.c [Sources.AARCH64] GicV3/AArch64/ArmGicV3.S + GicV5/AArch64/ArmGicV5.S + GicV5/ArmGicV5Dxe.c [Packages] MdePkg/MdePkg.dec @@ -46,6 +49,7 @@ UefiDriverEntryPoint IoLib PcdLib + TimerLib UefiLib [Protocols] @@ -57,6 +61,7 @@ gArmTokenSpaceGuid.PcdGicDistributorBase gArmTokenSpaceGuid.PcdGicRedistributorsBase gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase + gArmTokenSpaceGuid.PcdGicIrsConfigFrameBase [Depex] gEfiCpuArchProtocolGuid diff --git a/ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf b/ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf index c177b2746017..05a5498977a0 100644 --- a/ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf +++ b/ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf @@ -22,6 +22,8 @@ ArmGicDxe.h GicV3/ArmGicV3Dxe.c GicV3/AArch64/ArmGicV3.S + GicV5/ArmGicV5Dxe.c + GicV5/AArch64/ArmGicV5.S [Packages] MdePkg/MdePkg.dec @@ -35,6 +37,7 @@ IoLib PcdLib PrintLib + TimerLib UefiBootServicesTableLib UefiDriverEntryPoint UefiLib @@ -46,6 +49,7 @@ [Pcd.common] gArmTokenSpaceGuid.PcdGicDistributorBase + gArmTokenSpaceGuid.PcdGicIrsConfigFrameBase gArmTokenSpaceGuid.PcdGicRedistributorsBase [Depex] diff --git a/ArmPkg/Drivers/ArmGicDxe/GicV3/ArmGicV3Dxe.c b/ArmPkg/Drivers/ArmGicDxe/GicV3/ArmGicV3Dxe.c index 8aed686e3f62..5fd28e3f57f3 100644 --- a/ArmPkg/Drivers/ArmGicDxe/GicV3/ArmGicV3Dxe.c +++ b/ArmPkg/Drivers/ArmGicDxe/GicV3/ArmGicV3Dxe.c @@ -771,6 +771,10 @@ GicV3DxeInitialize ( Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&gCpuArch); ASSERT_EFI_ERROR (Status); + if (ArmHasGicV5SystemRegisters ()) { + return GicV5DxeInitialize (); + } + mGicDistributorBase = (UINTN)PcdGet64 (PcdGicDistributorBase); Status = gCpuArch->SetMemoryAttributes (gCpuArch, mGicDistributorBase, GICD_V3_SIZE, EFI_MEMORY_UC | EFI_MEMORY_XP); diff --git a/ArmPkg/Drivers/ArmGicDxe/GicV5/AArch64/ArmGicV5.S b/ArmPkg/Drivers/ArmGicDxe/GicV5/AArch64/ArmGicV5.S new file mode 100644 index 000000000000..9263fd850066 --- /dev/null +++ b/ArmPkg/Drivers/ArmGicDxe/GicV5/AArch64/ArmGicV5.S @@ -0,0 +1,182 @@ +# +# Copyright (c) 2025, ARM Limited. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# + +#include + +#define ICC_CR0_EL1 S3_1_C12_C0_1 + +#define ICC_ICSR_EL1 S3_0_C12_C10_4 + +#define ICC_PCR_EL1 S3_1_C12_C0_2 + +#define ICC_PPI_ENABLER0_EL1 S3_0_C12_C10_6 +#define ICC_PPI_ENABLER1_EL1 S3_0_C12_C10_7 + +#define ICC_PPI_HMR0_EL1 S3_0_C12_C10_0 +#define ICC_PPI_HMR1_EL1 S3_0_C12_C10_1 + +#define GICR_CDIA S1_0_C12_C3_0 +#define GIC_CDRCFG S1_0_C12_C1_5 +#define GIC_CDDI S1_0_C12_C2_0 +#define GIC_CDDIS S1_0_C12_C1_0 +#define GIC_CDEN S1_0_C12_C1_1 +#define GIC_CDEOI #0, C12, C1, #7 + +#define IRS_CR0 0x100 +#define IRS_IST_BASER 0x148 + +//UINT64 +//EFIAPI +//ArmGicV5GetPpiEnabler0 ( +// VOID +// ); +ASM_FUNC(ArmGicV5GetPpiEnabler0) + mrs x0, ICC_PPI_ENABLER0_EL1 + ret + +//UINT64 +//EFIAPI +//ArmGicV5GetPpiEnabler1 ( +// VOID +// ); +ASM_FUNC(ArmGicV5GetPpiEnabler1) + mrs x0, ICC_PPI_ENABLER1_EL1 + ret + +//VOID +//EFIAPI +//ArmGicV5SetPpiEnabler0 ( +// IN UINT64 InterruptMask +// ); +ASM_FUNC(ArmGicV5SetPpiEnabler0) + msr ICC_PPI_ENABLER0_EL1, x0 + ret + +//VOID +//EFIAPI +//ArmGicV5SetPpiEnabler1 ( +// IN UINT64 InterruptMask +// ); +ASM_FUNC(ArmGicV5SetPpiEnabler1) + msr ICC_PPI_ENABLER1_EL1, x0 + ret + +//UINT64 +//EFIAPI +//ArmGicV5GetPPIHMR0 ( +// VOID +// ); +ASM_FUNC(ArmGicV5GetPPIHMR0) + mrs x0, ICC_PPI_HMR0_EL1 + ret + +//UINT64 +//EFIAPI +//ArmGicV5GetPPIHMR1 ( +// VOID +// ); +ASM_FUNC(ArmGicV5GetPPIHMR1) + mrs x0, ICC_PPI_HMR1_EL1 + ret + +//VOID +//EFIAPI +//ArmGicV5SpiEnable ( +// IN UINT32 SpiId +// ); +ASM_FUNC(ArmGicV5SpiEnable) + orr x0, x0, #0x60000000 + msr GIC_CDEN, x0 + ret + +//VOID +//EFIAPI +//ArmGicV5SpiDisable ( +// IN UINT32 SpiId +// ); +ASM_FUNC(ArmGicV5SpiDisable) + orr x0, x0, #0x60000000 + msr GIC_CDDIS, x0 + ret + +//UINT64 +//EFIAPI +//ArmGicV5ReadInterruptConfig ( +// IN UINT32 InterruptId +// ); +ASM_FUNC(ArmGicV5ReadInterruptConfig) + msr GIC_CDRCFG, x0 + isb + mrs x0, ICC_ICSR_EL1 + ret + + +//VOID +//EFIAPI +//ArmGicV5EnableInterruptInterface ( +// UINT64 IrsConfigFrameBase +// ); +ASM_FUNC(ArmGicV5EnableInterruptInterface) + mov x1, #1 + msr ICC_CR0_EL1, x1 + mov x1, #0 + msr ICC_PCR_EL1, x1 + + mov x1, #0 + str x1, [x0, #IRS_CR0] + isb + + str x1, [x0, #IRS_IST_BASER] + isb + + mov x1, #1 + str x1, [x0, #IRS_CR0] + isb + + ret + +//VOID +//EFIAPI +//ArmGicV5DisableInterruptInterface ( +// UINT64 IrsConfigFrameBase +// ); +ASM_FUNC(ArmGicV5DisableInterruptInterface) + mov x1, #0 + str x1, [x0, #IRS_CR0] + isb + + mov x1, #0 + msr ICC_CR0_EL1, x1 + + ret + +//VOID +//EFIAPI +//ArmGicV5DeactivateInterrupt ( +// IN UINTN InterruptId +// ); +ASM_FUNC(ArmGicV5DeactivateInterrupt) + msr GIC_CDDI, x0 + ret + +//VOID +//EFIAPI +//ArmGicV5EndOfInterrupt ( +// VOID +// ); +ASM_FUNC(ArmGicV5EndOfInterrupt) + sys GIC_CDEOI + ret + +//UINTN +//EFIAPI +//ArmGicV5AcknowledgeInterrupt ( +// VOID +// ); +ASM_FUNC(ArmGicV5AcknowledgeInterrupt) + mrs x0, GICR_CDIA + ret diff --git a/ArmPkg/Drivers/ArmGicDxe/GicV5/Arm/ArmGicV5.c b/ArmPkg/Drivers/ArmGicDxe/GicV5/Arm/ArmGicV5.c new file mode 100644 index 000000000000..ad845d27b6c5 --- /dev/null +++ b/ArmPkg/Drivers/ArmGicDxe/GicV5/Arm/ArmGicV5.c @@ -0,0 +1,25 @@ +/*++ + +Copyright (c) 2025, ARM Limited. All rights reserved. + +SPDX-License-Identifier: BSD-2-Clause-Patent + +Module Name: + + ArmGicV5.c + +Abstract: + + Driver implementing the GICv5 interrupt controller protocol + +--*/ + +#include "ArmGicDxe.h" + +EFI_STATUS +GicV5DxeInitialize ( + VOID + ) +{ + return EFI_UNSUPPORTED; +} diff --git a/ArmPkg/Drivers/ArmGicDxe/GicV5/ArmGicV5.h b/ArmPkg/Drivers/ArmGicDxe/GicV5/ArmGicV5.h new file mode 100644 index 000000000000..294be79d2df0 --- /dev/null +++ b/ArmPkg/Drivers/ArmGicDxe/GicV5/ArmGicV5.h @@ -0,0 +1,186 @@ +/** @file +* +* Copyright (c) 2025, Arm Limited. All rights reserved. +* +* SPDX-License-Identifier: BSD-2-Clause-Patent +* +**/ + +#ifndef ARMGICV5_H_ +#define ARMGICV5_H_ + +#define GICV5_IRS_CONFIG_FRAME_SIZE SIZE_64KB + +#define GICV5_IRS_IDR5 0x14 +#define GICV5_IRS_IDR6 0x18 +#define GICV5_IRS_IDR7 0x1c +#define GICV5_IRS_SPI_SELR 0x108 +#define GICV5_IRS_SPI_CFGR 0x114 +#define GICV5_IRS_SPI_STATUSR 0x118 + +#define GICV5_IRS_SPI_STATUSR_IDLE (1 << 0) +#define GICV5_IRS_SPI_STATUSR_V (1 << 1) + +#define GICV5_PPI_EDGE_TRIGGER 0 +#define GICV5_PPI_LEVEL_TRIGGER 1 + +#define GICV5_INTERRUPT_ID_MASK 0xFFFFFF +#define GICV5_INTERRUPT_TYPE_MASK (7 << 29) + +#define GICV5_INTERRUPT_ID_VALID (1ull << 32) + +#define GICV5_INTERRUPT_TYPE_PPI (1 << 29) +#define GICV5_INTERRUPT_TYPE_SPI (3 << 29) + +#define GICV5_NUM_PPI_INTERRUPTS 128 + +#define GICV5_IRS_IDLE_TIMEOUT_MS 10 + +/** + Read GICv5 ICC_PPI_ENABLER0_EL1 system register. This provides the interrupt + enable mask for PPIs 0-63. + + @return Value of ICC_PPI_ENABLER0_EL1 +**/ +UINT64 +EFIAPI +ArmGicV5GetPpiEnabler0 ( + VOID + ); + +/** + Read GICv5 ICC_PPI_ENABLER1_EL1 system register.. This provides the interrupt + enable mask for PPIs 64-127. + + @return Value of ICC_PPI_ENABLER1_EL1 +**/ +UINT64 +EFIAPI +ArmGicV5GetPpiEnabler1 ( + VOID + ); + +/** + Write to GICv5 ICC_PPI_ENABLER0_EL1 system register. This provides the + interrupt enable mask for PPIs 0-63. + + @param InterruptMask New interrupt mask to write +**/ +VOID +EFIAPI +ArmGicV5SetPpiEnabler0 ( + IN UINT64 InterruptMask + ); + +/** + Write to GICv5 ICC_PPI_ENABLER1_EL1 system register. This provides the + interrupt enable mask for PPIs 64-127. + + @param InterruptMask New interrupt mask to write +**/ +VOID +EFIAPI +ArmGicV5SetPpiEnabler1 ( + IN UINT64 InterruptMask + ); + +/** + Read GICv5 ICC_PPI_HMR0_EL1 system register. This provides the interrupt + trigger type for PPIs 0-63. + + @return Value of ICC_PPI_HMR0_EL1 +**/ +UINT64 +EFIAPI +ArmGicV5GetPPIHMR0 ( + VOID + ); + +/** + Read GICv5 ICC_PPI_HMR1_EL1 system register. This provides the interrupt + trigger type for PPIs 64-127. + + @return Value of ICC_PPI_HMR1_EL1 +**/ +UINT64 +EFIAPI +ArmGicV5GetPPIHMR1 ( + VOID + ); + +/** + + @param SpiId ID of SPI to enable +**/ +VOID +EFIAPI +ArmGicV5SpiEnable ( + IN UINT32 SpiId + ); + +/** + + @param SpiId ID of SPI to disable +**/ +VOID +EFIAPI +ArmGicV5SpiDisable ( + IN UINT32 SpiId + ); + +UINT64 +EFIAPI +ArmGicV5ReadInterruptConfig ( + IN UINT32 InterruptId + ); + +/** + Enable GICv5 interrupt interface. +**/ +VOID +EFIAPI +ArmGicV5EnableInterruptInterface ( + UINT64 IrsConfigFrameBase + ); + +/** + Disable GICv5 interrupt interface. +**/ +VOID +EFIAPI +ArmGicV5DisableInterruptInterface ( + UINT64 IrsConfigFrameBase + ); + +/** + Clear the active state of the given GICv5 interrupt. + + @param InterruptId The INTID of the interrupt to deactivate +**/ +VOID +EFIAPI +ArmGicV5DeactivateInterrupt ( + IN UINTN InterruptId + ); + +/** + Signal End of Interrupt, causing a priority drop of the running priority at + the CPU interface in the current interrupt domain. +**/ +VOID +EFIAPI +ArmGicV5EndOfInterrupt ( + VOID + ); + +/** + Acknowledge the highest priority pending interrupt (HPPI) in the current + interrupt domain. +**/ +UINTN +EFIAPI +ArmGicV5AcknowledgeInterrupt ( + VOID + ); + +#endif // ARMGICV5_H_ diff --git a/ArmPkg/Drivers/ArmGicDxe/GicV5/ArmGicV5Dxe.c b/ArmPkg/Drivers/ArmGicDxe/GicV5/ArmGicV5Dxe.c new file mode 100644 index 000000000000..9a94baaece19 --- /dev/null +++ b/ArmPkg/Drivers/ArmGicDxe/GicV5/ArmGicV5Dxe.c @@ -0,0 +1,620 @@ +/*++ + +Copyright (c) 2025, ARM Limited. All rights reserved. + +SPDX-License-Identifier: BSD-2-Clause-Patent + +Module Name: + + ArmGicV5Dxe.c + +Abstract: + + Driver implementing the GICv5 interrupt controller protocol + +--*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "ArmGicDxe.h" +#include "ArmGicV5.h" + +STATIC UINTN mGicIrsConfigFrameBase; +STATIC UINT32 SpiRange; +STATIC UINTN mGicNumInterrupts; +STATIC HARDWARE_INTERRUPT_HANDLER *mRegisteredInterruptHandlers; + +STATIC EFI_HARDWARE_INTERRUPT_PROTOCOL mHardwareInterruptV5Protocol; + +/** + Wait for IRS SPI writes to complete. + + @retval TRUE Writes have completed successfully. + @retval FALSE Writes have timed out. +**/ +STATIC +BOOLEAN +WaitForIrsSpiIdle ( + ) +{ + UINT32 Timeout = GICV5_IRS_IDLE_TIMEOUT_MS; + + while (!(MmioRead32 (mGicIrsConfigFrameBase + GICV5_IRS_SPI_STATUSR) & GICV5_IRS_SPI_STATUSR_IDLE) && (Timeout > 0)) { + MicroSecondDelay (1); + Timeout--; + } + + if (!(MmioRead32 (mGicIrsConfigFrameBase + GICV5_IRS_SPI_STATUSR) & GICV5_IRS_SPI_STATUSR_IDLE)) { + DEBUG ((DEBUG_ERROR, "WaitForIrsSpiIdle: timed out\n")); + return FALSE; + } + + return TRUE; +} + +/** + Wait for IRS SPI writes to complete, and return valid status. + + @retval TRUE Writes have completed successfully, register status is valid + @retval FALSE Writes have timed out, or register status is invalid. +**/ +STATIC +BOOLEAN +WaitForIrsSpiIdleValid ( + ) +{ + if (!WaitForIrsSpiIdle ()) { + return FALSE; + } + + if (!(MmioRead32 (mGicIrsConfigFrameBase + GICV5_IRS_SPI_STATUSR) & GICV5_IRS_SPI_STATUSR_V)) { + DEBUG ((DEBUG_ERROR, "WaitForIrsSpiIdle: status invalid\n")); + return FALSE; + } + + return TRUE; +} + +/** + Enable interrupt source Source. + + @param This Instance pointer for this protocol + @param Source Hardware source of the interrupt + + @retval EFI_SUCCESS Source interrupt enabled. + @retval EFI_UNSUPPORTED Invalid interrupt source number. +**/ +STATIC +EFI_STATUS +EFIAPI +GicV5EnableInterruptSource ( + IN EFI_HARDWARE_INTERRUPT_PROTOCOL *This, + IN HARDWARE_INTERRUPT_SOURCE Source + ) +{ + UINT32 InterruptType = Source & GICV5_INTERRUPT_TYPE_MASK; + UINT32 InterruptId = Source & GICV5_INTERRUPT_ID_MASK; + + if (InterruptType == GICV5_INTERRUPT_TYPE_SPI) { + ArmGicV5SpiEnable (Source); + } else if (InterruptType == GICV5_INTERRUPT_TYPE_PPI) { + if (InterruptId >= GICV5_NUM_PPI_INTERRUPTS) { + DEBUG ((DEBUG_ERROR, "GicV5EnableInterruptSource: invalid PPI number\n")); + ASSERT (InterruptId < GICV5_NUM_PPI_INTERRUPTS); + return EFI_UNSUPPORTED; + } else if (InterruptId >= 64) { + UINT64 mask = ArmGicV5GetPpiEnabler1 (); + mask |= (1ull << (InterruptId - 64)); + ArmGicV5SetPpiEnabler1 (mask); + } else { + UINT64 mask = ArmGicV5GetPpiEnabler0 (); + mask |= (1ull << InterruptId); + ArmGicV5SetPpiEnabler0 (mask); + } + } else { + DEBUG ((DEBUG_ERROR, "GicV5EnableInterruptSource: invalid interrupt type\n")); + ASSERT (InterruptType == GICV5_INTERRUPT_TYPE_SPI || InterruptType == GICV5_INTERRUPT_TYPE_PPI); + return EFI_UNSUPPORTED; + } + + return EFI_SUCCESS; +} + +/** + Disable interrupt source Source. + + @param This Instance pointer for this protocol + @param Source Hardware source of the interrupt + + @retval EFI_SUCCESS Source interrupt enabled. + @retval EFI_UNSUPPORTED Invalid interrupt source number. +**/ +STATIC +EFI_STATUS +EFIAPI +GicV5DisableInterruptSource ( + IN EFI_HARDWARE_INTERRUPT_PROTOCOL *This, + IN HARDWARE_INTERRUPT_SOURCE Source + ) +{ + UINT32 InterruptType = Source & GICV5_INTERRUPT_TYPE_MASK; + UINT32 InterruptId = Source & GICV5_INTERRUPT_ID_MASK; + + if (InterruptType == GICV5_INTERRUPT_TYPE_SPI) { + ArmGicV5SpiDisable (Source); + } else if (InterruptType == GICV5_INTERRUPT_TYPE_PPI) { + if (InterruptId >= GICV5_NUM_PPI_INTERRUPTS) { + DEBUG ((DEBUG_ERROR, "GicV5DisableInterruptSource: invalid PPI number\n")); + ASSERT (InterruptId < GICV5_NUM_PPI_INTERRUPTS); + return EFI_UNSUPPORTED; + } else if (InterruptId >= 64) { + UINT64 mask = ArmGicV5GetPpiEnabler1 (); + mask &= ~(1ull << (InterruptId - 64)); + ArmGicV5SetPpiEnabler1 (mask); + } else { + UINT64 mask = ArmGicV5GetPpiEnabler0 (); + mask &= ~(1ull << InterruptId); + ArmGicV5SetPpiEnabler0 (mask); + } + } else { + DEBUG ((DEBUG_ERROR, "GicV5DisableInterruptSource: invalid interrupt type\n")); + ASSERT (InterruptType == GICV5_INTERRUPT_TYPE_SPI || InterruptType == GICV5_INTERRUPT_TYPE_PPI); + return EFI_UNSUPPORTED; + } + + return EFI_SUCCESS; +} + +/** + Return current state of interrupt source Source. + + @param This Instance pointer for this protocol + @param Source Hardware source of the interrupt + @param InterruptState TRUE: source enabled, FALSE: source disabled. + + @retval EFI_SUCCESS Source interrupt enabled. + @retval EFI_UNSUPPORTED Invalid interrupt source number. +**/ +STATIC +EFI_STATUS +EFIAPI +GicV5GetInterruptSourceState ( + IN EFI_HARDWARE_INTERRUPT_PROTOCOL *This, + IN HARDWARE_INTERRUPT_SOURCE Source, + IN BOOLEAN *InterruptState + ) +{ + UINT32 InterruptType = Source & GICV5_INTERRUPT_TYPE_MASK; + UINT32 InterruptId = Source & GICV5_INTERRUPT_ID_MASK; + + UINT64 Mask; + UINT64 Status; + + if (InterruptType == GICV5_INTERRUPT_TYPE_SPI) { + Status = ArmGicV5ReadInterruptConfig (Source); + + if (Status & 1) { + ASSERT (!(Status & 1)); + return EFI_UNSUPPORTED; + } + + *InterruptState = (Status & 4) ? 1 : 0; + } else if (InterruptType == GICV5_INTERRUPT_TYPE_PPI) { + if (InterruptId >= GICV5_NUM_PPI_INTERRUPTS) { + DEBUG ((DEBUG_ERROR, "GicV5GetInterruptSourceState: invalid PPI number\n")); + ASSERT (InterruptId < GICV5_NUM_PPI_INTERRUPTS); + return EFI_UNSUPPORTED; + } else if (InterruptId >= 64) { + Mask = ArmGicV5GetPpiEnabler1 (); + } else { + Mask = ArmGicV5GetPpiEnabler0 (); + } + + *InterruptState = (Mask >> (InterruptId & 63)) & 1; + } else { + DEBUG ((DEBUG_ERROR, "GicV5GetInterruptSourceState: invalid interrupt type\n")); + ASSERT (InterruptType == GICV5_INTERRUPT_TYPE_SPI || InterruptType == GICV5_INTERRUPT_TYPE_PPI); + return EFI_UNSUPPORTED; + } + + return EFI_SUCCESS; +} + +/** + Signal to the hardware that the End Of Interrupt state + has been reached. + + @param This Instance pointer for this protocol + @param Source Hardware source of the interrupt + + @retval EFI_SUCCESS Source interrupt enabled. + @retval EFI_UNSUPPORTED Invalid interrupt source number. +**/ +STATIC +EFI_STATUS +EFIAPI +GicV5EndOfInterrupt ( + IN EFI_HARDWARE_INTERRUPT_PROTOCOL *This, + IN HARDWARE_INTERRUPT_SOURCE Source + ) +{ + UINT32 InterruptType = Source & GICV5_INTERRUPT_TYPE_MASK; + UINT32 InterruptId = Source & GICV5_INTERRUPT_ID_MASK; + + if ((InterruptType == GICV5_INTERRUPT_TYPE_PPI) && (InterruptId >= GICV5_NUM_PPI_INTERRUPTS)) { + DEBUG ((DEBUG_ERROR, "GicV5EndOfInterrupt: invalid PPI number\n")); + ASSERT (!((InterruptType == GICV5_INTERRUPT_TYPE_PPI) && (InterruptId >= GICV5_NUM_PPI_INTERRUPTS))); + return EFI_UNSUPPORTED; + } + + ArmGicV5DeactivateInterrupt (Source); + ArmGicV5EndOfInterrupt (); + + return EFI_SUCCESS; +} + +/** + EFI_CPU_INTERRUPT_HANDLER that is called when a processor interrupt occurs. + + @param InterruptType Defines the type of interrupt or exception that + occurred on the processor. This parameter is + processor architecture specific. + @param SystemContext A pointer to the processor context when + the interrupt occurred on the processor. + + @return None +**/ +STATIC +VOID +EFIAPI +GicV5IrqInterruptHandler ( + IN EFI_EXCEPTION_TYPE InterruptType, + IN EFI_SYSTEM_CONTEXT SystemContext + ) +{ + UINT64 GicInterrupt; + HARDWARE_INTERRUPT_HANDLER InterruptHandler; + UINT32 IntId; + UINT32 IntType; + + GicInterrupt = ArmGicV5AcknowledgeInterrupt (); + IntId = GicInterrupt & GICV5_INTERRUPT_ID_MASK; + IntType = GicInterrupt & GICV5_INTERRUPT_TYPE_MASK; + + if (!(GicInterrupt & GICV5_INTERRUPT_ID_VALID)) { + DEBUG ((DEBUG_ERROR, "Spurious invalid GIC interrupt\n")); + return; + } + + if (IntType == GICV5_INTERRUPT_TYPE_SPI) { + IntId += GICV5_NUM_PPI_INTERRUPTS; + } else if (IntType != GICV5_INTERRUPT_TYPE_PPI) { + // Only PPI and SPI are currently supported + DEBUG ((DEBUG_ERROR, "Unsupported GIC interrupt type\n")); + GicV5EndOfInterrupt (&mHardwareInterruptV5Protocol, GicInterrupt); + return; + } + + InterruptHandler = mRegisteredInterruptHandlers[IntId]; + if (InterruptHandler != NULL) { + // Call the registered interrupt handler. + InterruptHandler (GicInterrupt, SystemContext); + } else { + DEBUG ((DEBUG_ERROR, "Spurious GIC interrupt: 0x%x\n", (UINT32)IntId)); + GicV5EndOfInterrupt (&mHardwareInterruptV5Protocol, GicInterrupt); + } +} + +STATIC +EFI_STATUS +EFIAPI +GicV5RegisterInterruptSource ( + IN EFI_HARDWARE_INTERRUPT_PROTOCOL *This, + IN HARDWARE_INTERRUPT_SOURCE Source, + IN HARDWARE_INTERRUPT_HANDLER Handler + ) +{ + // The GICv5 driver supports both PPIs and SPIs. To support both in a single + // interrupt handler array, map IDs 0 to NUM_PPI_INTERRUPTS-1 as PPIs, and + // NUM_PPI_INTERRUPTS and above as SPIs. + UINTN Type = Source & GICV5_INTERRUPT_TYPE_MASK; + UINTN IntId; + + if (Type == GICV5_INTERRUPT_TYPE_PPI) { + // PPI + IntId = Source & GICV5_INTERRUPT_ID_MASK; + if (IntId >= GICV5_NUM_PPI_INTERRUPTS) { + // GICv5 defines valid PPI IDs as 0-127 + ASSERT (IntId < GICV5_NUM_PPI_INTERRUPTS); + return EFI_UNSUPPORTED; + } + } else if (Type == GICV5_INTERRUPT_TYPE_SPI) { + // SPI + IntId = (Source & GICV5_INTERRUPT_ID_MASK) + GICV5_NUM_PPI_INTERRUPTS; + } else { + ASSERT (Type == GICV5_INTERRUPT_TYPE_PPI || Type == GICV5_INTERRUPT_TYPE_SPI); + return EFI_UNSUPPORTED; + } + + if (IntId >= mGicNumInterrupts) { + ASSERT (IntId < mGicNumInterrupts); + return EFI_UNSUPPORTED; + } + + return GicCommonRegisterInterruptSource ( + This, + Source, + Handler, + &mRegisteredInterruptHandlers[IntId] + ); +} + +// The protocol instance produced by this driver +STATIC EFI_HARDWARE_INTERRUPT_PROTOCOL mHardwareInterruptV5Protocol = { + GicV5RegisterInterruptSource, + GicV5EnableInterruptSource, + GicV5DisableInterruptSource, + GicV5GetInterruptSourceState, + GicV5EndOfInterrupt +}; + +/** + Select SPI ID to be read or written + + @param InterruptId Returns interrupt trigger type. + + @retval EFI_SUCCESS Source interrupt supported. + @retval EFI_TIMEOUT Timed out waiting for IRS to go idle. +**/ +STATIC +EFI_STATUS +SelectSPIId ( + UINT32 InterruptId + ) +{ + if (!WaitForIrsSpiIdle ()) { + ASSERT (FALSE); + return EFI_TIMEOUT; + } + + MmioWrite32 (mGicIrsConfigFrameBase + GICV5_IRS_SPI_SELR, InterruptId); + + if (!WaitForIrsSpiIdleValid ()) { + ASSERT (FALSE); + return EFI_TIMEOUT; + } + + return EFI_SUCCESS; +} + +/** + Get interrupt trigger type of an interrupt + + Following completion of this function, the configuration for the + selected interrupt can be read or written via GICV5_IRS_SPI_CFGR. + + @param This Instance pointer for this protocol + @param Source Hardware source of the interrupt. + @param TriggerType Returns interrupt trigger type. + + @retval EFI_SUCCESS Source interrupt supported. + @retval EFI_UNSUPPORTED Source interrupt is not supported. + @retval EFI_TIMEOUT Timed out waiting for IRS to go idle. +**/ +STATIC +EFI_STATUS +EFIAPI +GicV5GetTriggerType ( + IN EFI_HARDWARE_INTERRUPT2_PROTOCOL *This, + IN HARDWARE_INTERRUPT_SOURCE Source, + OUT EFI_HARDWARE_INTERRUPT2_TRIGGER_TYPE *TriggerType + ) +{ + UINT32 InterruptType = Source & GICV5_INTERRUPT_TYPE_MASK; + UINT32 InterruptId = Source & GICV5_INTERRUPT_ID_MASK; + UINT32 GicTriggerType; + EFI_STATUS Status; + + if (InterruptType == GICV5_INTERRUPT_TYPE_SPI) { + Status = SelectSPIId (InterruptId); + + if (EFI_ERROR (Status)) { + return Status; + } + + GicTriggerType = MmioRead32 (mGicIrsConfigFrameBase + GICV5_IRS_SPI_CFGR) & 1; + } else if (InterruptType == GICV5_INTERRUPT_TYPE_PPI) { + if (InterruptId >= GICV5_NUM_PPI_INTERRUPTS) { + DEBUG ((DEBUG_ERROR, "GicV5GetTriggerType: invalid PPI number\n")); + ASSERT (InterruptId < GICV5_NUM_PPI_INTERRUPTS); + return EFI_UNSUPPORTED; + } else if (InterruptId < 64) { + GicTriggerType = (ArmGicV5GetPPIHMR0 () >> InterruptId) & 1; + } else { + GicTriggerType = (ArmGicV5GetPPIHMR1 () >> (InterruptId - 64)) & 1; + } + } else { + DEBUG ((DEBUG_ERROR, "GicV5GetTriggerType: invalid interrupt type\n")); + ASSERT (InterruptType == GICV5_INTERRUPT_TYPE_SPI || InterruptType == GICV5_INTERRUPT_TYPE_PPI); + return EFI_UNSUPPORTED; + } + + if (GicTriggerType == GICV5_PPI_EDGE_TRIGGER) { + *TriggerType = EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING; + } else if (GicTriggerType == GICV5_PPI_LEVEL_TRIGGER) { + *TriggerType = EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH; + } + + return EFI_SUCCESS; +} + +/** + Set interrupt trigger type of an interrupt + + @param This Instance pointer for this protocol + @param Source Hardware source of the interrupt. + @param TriggerType Interrupt trigger type. + + @retval EFI_SUCCESS Source interrupt supported. + @retval EFI_UNSUPPORTED Source interrupt is not supported. + @retval EFI_TIMEOUT Timed out waiting for IRS to go idle. +**/ +STATIC +EFI_STATUS +EFIAPI +GicV5SetTriggerType ( + IN EFI_HARDWARE_INTERRUPT2_PROTOCOL *This, + IN HARDWARE_INTERRUPT_SOURCE Source, + IN EFI_HARDWARE_INTERRUPT2_TRIGGER_TYPE TriggerType + ) +{ + UINT32 InterruptType = Source & GICV5_INTERRUPT_TYPE_MASK; + UINT32 InterruptId = Source & GICV5_INTERRUPT_ID_MASK; + UINT32 GicTriggerType; + EFI_STATUS Status; + + if (InterruptType == GICV5_INTERRUPT_TYPE_SPI) { + if (TriggerType == EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING) { + GicTriggerType = GICV5_PPI_EDGE_TRIGGER; + } else if (TriggerType == EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH) { + GicTriggerType = GICV5_PPI_LEVEL_TRIGGER; + } else { + DEBUG ((DEBUG_ERROR, "GicV5SetTriggerType: invalid interrupt type\n")); + ASSERT (TriggerType == EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING || TriggerType == EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH); + return EFI_UNSUPPORTED; + } + + Status = SelectSPIId (InterruptId); + if (EFI_ERROR (Status)) { + return Status; + } + + MmioWrite32 (mGicIrsConfigFrameBase + GICV5_IRS_SPI_CFGR, GicTriggerType); + if (!WaitForIrsSpiIdle ()) { + ASSERT (FALSE); + return EFI_TIMEOUT; + } + } else if (InterruptType == GICV5_INTERRUPT_TYPE_PPI) { + if (InterruptId >= GICV5_NUM_PPI_INTERRUPTS) { + DEBUG ((DEBUG_ERROR, "GicV5SetTriggerType: invalid PPI number\n")); + ASSERT (InterruptId < GICV5_NUM_PPI_INTERRUPTS); + return EFI_UNSUPPORTED; + } else if (InterruptId < 64) { + GicTriggerType = (ArmGicV5GetPPIHMR0 () >> InterruptId) & 1; + } else { + GicTriggerType = (ArmGicV5GetPPIHMR1 () >> (InterruptId - 64)) & 1; + } + + if (((GicTriggerType == GICV5_PPI_EDGE_TRIGGER) && (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING)) || + ((GicTriggerType == GICV5_PPI_LEVEL_TRIGGER) && (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH))) + { + // PPI trigger types are fixed on GICv5. Fail on any attempt to change. + return EFI_UNSUPPORTED; + } + } else { + DEBUG ((DEBUG_ERROR, "GicV5SetTriggerType: invalid interrupt type\n")); + ASSERT (InterruptType == GICV5_INTERRUPT_TYPE_SPI || InterruptType == GICV5_INTERRUPT_TYPE_PPI); + return EFI_UNSUPPORTED; + } + + return EFI_SUCCESS; +} + +STATIC EFI_HARDWARE_INTERRUPT2_PROTOCOL mHardwareInterrupt2V5Protocol = { + (HARDWARE_INTERRUPT2_REGISTER)GicV5RegisterInterruptSource, + (HARDWARE_INTERRUPT2_ENABLE)GicV5EnableInterruptSource, + (HARDWARE_INTERRUPT2_DISABLE)GicV5DisableInterruptSource, + (HARDWARE_INTERRUPT2_INTERRUPT_STATE)GicV5GetInterruptSourceState, + (HARDWARE_INTERRUPT2_END_OF_INTERRUPT)GicV5EndOfInterrupt, + GicV5GetTriggerType, + GicV5SetTriggerType +}; + +/** + Shutdown our hardware + + DXE Core will disable interrupts and turn off the timer and disable interrupts + after all the event handlers have run. + + @param[in] Event The Event that is being processed + @param[in] Context Event Context +**/ +VOID +EFIAPI +GicV5ExitBootServicesEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + UINTN Index; + + // Acknowledge all pending interrupts + for (Index = 0; Index < GICV5_NUM_PPI_INTERRUPTS; Index++) { + GicV5DisableInterruptSource (&mHardwareInterruptV5Protocol, Index | GICV5_INTERRUPT_TYPE_PPI); + } + + for (Index = 0; Index < SpiRange; Index++) { + GicV5DisableInterruptSource (&mHardwareInterruptV5Protocol, Index | GICV5_INTERRUPT_TYPE_SPI); + } + + // Disable Gic Interface + ArmGicV5DisableInterruptInterface (mGicIrsConfigFrameBase); + + return; +} + +/** + Initialize the state information for the CPU Architectural Protocol + + @retval EFI_SUCCESS Protocol registered + @retval EFI_OUT_OF_RESOURCES Cannot allocate protocol data structure + @retval EFI_DEVICE_ERROR Hardware problems + @retval EFI_UNSUPPORTED GIC version not supported +**/ +EFI_STATUS +GicV5DxeInitialize ( + VOID + ) +{ + EFI_STATUS Status; + + mGicIrsConfigFrameBase = (UINTN)PcdGet64 (PcdGicIrsConfigFrameBase); + + Status = gCpuArch->SetMemoryAttributes (gCpuArch, mGicIrsConfigFrameBase, GICV5_IRS_CONFIG_FRAME_SIZE, EFI_MEMORY_UC | EFI_MEMORY_XP); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to map GICv5 configuration frame: %r\n", __func__, Status)); + ASSERT_EFI_ERROR (Status); + return Status; + } + + SpiRange = MmioRead32 (mGicIrsConfigFrameBase + GICV5_IRS_IDR5) & 0x00ffffff; + + mGicNumInterrupts = GICV5_NUM_PPI_INTERRUPTS + SpiRange; + + mRegisteredInterruptHandlers = AllocateZeroPool (mGicNumInterrupts * sizeof (HARDWARE_INTERRUPT_HANDLER)); + if (mRegisteredInterruptHandlers == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + Status = GicCommonInstallAndRegisterInterruptService ( + &mHardwareInterruptV5Protocol, + &mHardwareInterrupt2V5Protocol, + GicV5IrqInterruptHandler, + GicV5ExitBootServicesEvent + ); + + if (Status != EFI_SUCCESS) { + FreePool (mRegisteredInterruptHandlers); + return Status; + } + + ArmGicV5EnableInterruptInterface (mGicIrsConfigFrameBase); + + return EFI_SUCCESS; +} diff --git a/ArmPkg/Include/Library/ArmGicLib.h b/ArmPkg/Include/Library/ArmGicLib.h index bf4b28f91f64..32a362c4cb7d 100644 --- a/ArmPkg/Include/Library/ArmGicLib.h +++ b/ArmPkg/Include/Library/ArmGicLib.h @@ -166,6 +166,14 @@ // Bit Mask for #define ARM_GIC_ICCIAR_ACKINTID 0x3FF +// +// GIC SPI and extended SPI ranges +// +#define ARM_GIC_ARCH_SPI_MIN 32 +#define ARM_GIC_ARCH_SPI_MAX 1019 +#define ARM_GIC_ARCH_EXT_SPI_MIN 4096 +#define ARM_GIC_ARCH_EXT_SPI_MAX 5119 + // GIC revision 3 specific declarations #define ICC_SRE_EL2_SRE (1 << 0) @@ -173,4 +181,9 @@ #define ARM_GICD_IROUTER_IRM BIT31 +// GIC revision 5 specific declarations + +#define ARM_GICV5_ARCH_SPI_MIN 0x60000000 +#define ARM_GICV5_ARCH_SPI_MAX 0x60ffffff + #endif // ARMGIC_H_ From b762965bda5fb46418bbbc711339f6f5c2711be1 Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Tue, 24 Jun 2025 14:11:08 +0100 Subject: [PATCH 0245/1172] ArmPkg: TimerDxe: Add support for GICv5 PPIs GICv5 uses a different ID scheme for interrupt numbers to previous GICs; the top bits indicate the type of interrupt (PPI/SPI/LPI). Update TimerDxe to use the new ID scheme for GICv5. As the timer PPIs are architected for GICv5 they should be the same on all GICv5 platforms. Signed-off-by: Sarah Walker --- ArmPkg/Drivers/TimerDxe/TimerDxe.c | 24 ++++++++++++++++++++---- ArmPkg/Drivers/TimerDxe/TimerDxe.h | 18 ++++++++++++++++++ 2 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 ArmPkg/Drivers/TimerDxe/TimerDxe.h diff --git a/ArmPkg/Drivers/TimerDxe/TimerDxe.c b/ArmPkg/Drivers/TimerDxe/TimerDxe.c index 37859e178e6d..b7f5ecca56de 100644 --- a/ArmPkg/Drivers/TimerDxe/TimerDxe.c +++ b/ArmPkg/Drivers/TimerDxe/TimerDxe.c @@ -22,6 +22,8 @@ #include #include +#include "TimerDxe.h" + // The notification function to call on every timer interrupt. EFI_TIMER_NOTIFY mTimerNotifyFunction = (EFI_TIMER_NOTIFY)NULL; EFI_EVENT EfiExitBootServicesEvent = (EFI_EVENT)NULL; @@ -359,6 +361,9 @@ TimerInitialize ( EFI_STATUS Status; UINTN TimerCtrlReg; UINT32 TimerHypIntrNum; + UINT32 TimerVirtIntrNum; + UINT32 TimerSecIntrNum; + UINT32 TimerIntrNum; if (ArmIsArchTimerImplemented () == 0) { DEBUG ((DEBUG_ERROR, "ARM Architectural Timer is not available in the CPU, hence can't use this Driver \n")); @@ -377,27 +382,38 @@ TimerInitialize ( Status = TimerDriverSetTimerPeriod (&gTimer, 0); ASSERT_EFI_ERROR (Status); + if (ArmHasGicV5SystemRegisters ()) { + TimerSecIntrNum = GICV5_ARCH_TIMER_SEC_INTID; + TimerIntrNum = GICV5_ARCH_TIMER_INTID; + TimerHypIntrNum = GICV5_ARCH_TIMER_HYP_INTID; + TimerVirtIntrNum = GICV5_ARCH_TIMER_VIRT_INTID; + } else { + TimerVirtIntrNum = PcdGet32 (PcdArmArchTimerVirtIntrNum); + TimerHypIntrNum = PcdGet32 (PcdArmArchTimerHypIntrNum); + TimerSecIntrNum = PcdGet32 (PcdArmArchTimerSecIntrNum); + TimerIntrNum = PcdGet32 (PcdArmArchTimerIntrNum); + } + // Install secure and Non-secure interrupt handlers // Note: Because it is not possible to determine the security state of the // CPU dynamically, we just install interrupt handler for both sec and non-sec // timer PPI - Status = gInterrupt->RegisterInterruptSource (gInterrupt, PcdGet32 (PcdArmArchTimerVirtIntrNum), TimerInterruptHandler); + Status = gInterrupt->RegisterInterruptSource (gInterrupt, TimerVirtIntrNum, TimerInterruptHandler); ASSERT_EFI_ERROR (Status); // // The hypervisor timer interrupt may be omitted by implementations that // execute under virtualization. // - TimerHypIntrNum = PcdGet32 (PcdArmArchTimerHypIntrNum); if (TimerHypIntrNum != 0) { Status = gInterrupt->RegisterInterruptSource (gInterrupt, TimerHypIntrNum, TimerInterruptHandler); ASSERT_EFI_ERROR (Status); } - Status = gInterrupt->RegisterInterruptSource (gInterrupt, PcdGet32 (PcdArmArchTimerSecIntrNum), TimerInterruptHandler); + Status = gInterrupt->RegisterInterruptSource (gInterrupt, TimerSecIntrNum, TimerInterruptHandler); ASSERT_EFI_ERROR (Status); - Status = gInterrupt->RegisterInterruptSource (gInterrupt, PcdGet32 (PcdArmArchTimerIntrNum), TimerInterruptHandler); + Status = gInterrupt->RegisterInterruptSource (gInterrupt, TimerIntrNum, TimerInterruptHandler); ASSERT_EFI_ERROR (Status); // Set up default timer diff --git a/ArmPkg/Drivers/TimerDxe/TimerDxe.h b/ArmPkg/Drivers/TimerDxe/TimerDxe.h new file mode 100644 index 000000000000..98b2f9f74b49 --- /dev/null +++ b/ArmPkg/Drivers/TimerDxe/TimerDxe.h @@ -0,0 +1,18 @@ +/** @file +* +* Copyright (c) 2025, ARM Limited. All rights reserved. +* +* SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef TIMER_DXE_H_ +#define TIMER_DXE_H_ + +// Timer IntIDs are architecturally defined for GICv5 +#define GICV5_ARCH_TIMER_HYP_INTID 0x2000001a +#define GICV5_ARCH_TIMER_VIRT_INTID 0x2000001b +#define GICV5_ARCH_TIMER_HYP_VIRT_INTID 0x2000001c +#define GICV5_ARCH_TIMER_SEC_INTID 0x2000001d +#define GICV5_ARCH_TIMER_INTID 0x2000001e + +#endif // TIMER_DXE_H_ From 8f62819df37d025a44c7b1799df1f34ff9ba18eb Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Tue, 6 May 2025 10:56:40 -0700 Subject: [PATCH 0246/1172] MdePkg/BaseCpuLib: Add FPU initialization support for RISC-V Enable RISC-V support for the InitializeFloatingPointUnits function. Signed-off-by: Tuan Phan --- MdePkg/Include/Library/CpuLib.h | 2 +- MdePkg/Library/BaseCpuLib/BaseCpuLib.inf | 3 ++- .../Library/BaseCpuLib/RiscV/InitializeFpu.S | 22 +++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 MdePkg/Library/BaseCpuLib/RiscV/InitializeFpu.S diff --git a/MdePkg/Include/Library/CpuLib.h b/MdePkg/Include/Library/CpuLib.h index 27f3f82ab993..0ecdaec8490e 100644 --- a/MdePkg/Include/Library/CpuLib.h +++ b/MdePkg/Include/Library/CpuLib.h @@ -42,7 +42,7 @@ CpuFlushTlb ( VOID ); -#if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) || defined (MDE_CPU_LOONGARCH64) +#if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) || defined (MDE_CPU_LOONGARCH64) || defined (MDE_CPU_RISCV64) /** Initialize the CPU floating point units. diff --git a/MdePkg/Library/BaseCpuLib/BaseCpuLib.inf b/MdePkg/Library/BaseCpuLib/BaseCpuLib.inf index 89f6272f118f..57b60147ba3f 100644 --- a/MdePkg/Library/BaseCpuLib/BaseCpuLib.inf +++ b/MdePkg/Library/BaseCpuLib/BaseCpuLib.inf @@ -62,7 +62,8 @@ AArch64/CpuSleep.asm | MSFT [Sources.RISCV64] - RiscV/Cpu.S + RiscV/Cpu.S | GCC + RiscV/InitializeFpu.S | GCC [Sources.LOONGARCH64] LoongArch/CpuFlushTlb.S | GCC diff --git a/MdePkg/Library/BaseCpuLib/RiscV/InitializeFpu.S b/MdePkg/Library/BaseCpuLib/RiscV/InitializeFpu.S new file mode 100644 index 000000000000..dda5caaef665 --- /dev/null +++ b/MdePkg/Library/BaseCpuLib/RiscV/InitializeFpu.S @@ -0,0 +1,22 @@ +// ------------------------------------------------------------------------------ +// +// Enable FPU for RISC-V +// +// Copyright (c) 2024, Canonical Services Ltd.
+// Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// ------------------------------------------------------------------------------ +#include + +.global ASM_PFX(InitializeFloatingPointUnits) + +ASM_PFX(InitializeFloatingPointUnits): + csrr a0, CSR_SSTATUS + li a1, MSTATUS_FS + or a0, a0, a1 + csrw CSR_SSTATUS, a0 + csrw CSR_FCSR, x0 + li a0, 0 + ret From 66189310e283a1eb58752848bbeb500a5bd85afc Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Tue, 6 May 2025 11:09:22 -0700 Subject: [PATCH 0247/1172] UefiCpuPkg: Remove BaseRiscVFpuLib FPU initialization for RiscV is now handled in CpuLib, rendering this library obsolete. Signed-off-by: Tuan Phan --- UefiCpuPkg/CpuDxeRiscV64/CpuDxe.c | 3 +-- UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h | 2 +- UefiCpuPkg/CpuDxeRiscV64/CpuDxeRiscV64.inf | 1 - UefiCpuPkg/Include/Library/BaseRiscVFpuLib.h | 21 --------------- .../BaseRiscVFpuLib/BaseRiscVFpuLib.inf | 26 ------------------- .../Library/BaseRiscVFpuLib/RiscVFpuCore.S | 22 ---------------- UefiCpuPkg/UefiCpuPkg.dec | 2 -- UefiCpuPkg/UefiCpuPkg.dsc | 1 - 8 files changed, 2 insertions(+), 76 deletions(-) delete mode 100644 UefiCpuPkg/Include/Library/BaseRiscVFpuLib.h delete mode 100644 UefiCpuPkg/Library/BaseRiscVFpuLib/BaseRiscVFpuLib.inf delete mode 100644 UefiCpuPkg/Library/BaseRiscVFpuLib/RiscVFpuCore.S diff --git a/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.c b/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.c index 4f9d53eba89f..e51b4a7a7561 100644 --- a/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.c +++ b/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.c @@ -362,8 +362,7 @@ InitializeCpu ( // // Initialize FPU // - Status = RiscVInitializeFpu (); - ASSERT_EFI_ERROR (Status); + InitializeFloatingPointUnits (); // // Install Boot protocol diff --git a/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h b/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h index 0c4ef2ec246f..721d1ff8680c 100644 --- a/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h +++ b/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h @@ -14,13 +14,13 @@ #include #include -#include #include #include #include #include #include #include +#include #include #include #include diff --git a/UefiCpuPkg/CpuDxeRiscV64/CpuDxeRiscV64.inf b/UefiCpuPkg/CpuDxeRiscV64/CpuDxeRiscV64.inf index 7600c8873a9a..63424999b09e 100644 --- a/UefiCpuPkg/CpuDxeRiscV64/CpuDxeRiscV64.inf +++ b/UefiCpuPkg/CpuDxeRiscV64/CpuDxeRiscV64.inf @@ -38,7 +38,6 @@ PeCoffGetEntryPointLib RiscVSbiLib RiscVMmuLib - RiscVFpuLib CacheMaintenanceLib TimerLib diff --git a/UefiCpuPkg/Include/Library/BaseRiscVFpuLib.h b/UefiCpuPkg/Include/Library/BaseRiscVFpuLib.h deleted file mode 100644 index d75320ff744f..000000000000 --- a/UefiCpuPkg/Include/Library/BaseRiscVFpuLib.h +++ /dev/null @@ -1,21 +0,0 @@ -/** @file - - Copyright (c) 2024, Canonical Services Ltd
- SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#ifndef BASE_RISCV_FPU_LIB_H_ -#define BASE_RISCV_FPU_LIB_H_ - -/** - Initialize floating point unit - -**/ -EFI_STATUS -EFIAPI -RiscVInitializeFpu ( - VOID - ); - -#endif /* BASE_RISCV_FPU_LIB_H_ */ diff --git a/UefiCpuPkg/Library/BaseRiscVFpuLib/BaseRiscVFpuLib.inf b/UefiCpuPkg/Library/BaseRiscVFpuLib/BaseRiscVFpuLib.inf deleted file mode 100644 index 81304303100e..000000000000 --- a/UefiCpuPkg/Library/BaseRiscVFpuLib/BaseRiscVFpuLib.inf +++ /dev/null @@ -1,26 +0,0 @@ -## @file -# RISC-V FPU library. -# -# Copyright (c) 2024, Canonical Services Ltd -# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -## - -[Defines] - INF_VERSION = 0x0001001b - BASE_NAME = BaseRiscVFpuLib - FILE_GUID = e600fe4d-8595-40f3-90a0-5f043ce155c2 - MODULE_TYPE = BASE - VERSION_STRING = 1.0 - LIBRARY_CLASS = RiscVFpuLib - -[Sources] - RiscVFpuCore.S - -[Packages] - MdePkg/MdePkg.dec - UefiCpuPkg/UefiCpuPkg.dec - -[LibraryClasses] - BaseLib diff --git a/UefiCpuPkg/Library/BaseRiscVFpuLib/RiscVFpuCore.S b/UefiCpuPkg/Library/BaseRiscVFpuLib/RiscVFpuCore.S deleted file mode 100644 index b439af4e42cd..000000000000 --- a/UefiCpuPkg/Library/BaseRiscVFpuLib/RiscVFpuCore.S +++ /dev/null @@ -1,22 +0,0 @@ -/** @file -* -* Copyright (c) 2024, Canonical Services Ltd -* -* SPDX-License-Identifier: BSD-2-Clause-Patent -* -**/ - -#include -#include - -// -// Initialize floating point unit -// -ASM_FUNC (RiscVInitializeFpu) - csrr a0, CSR_SSTATUS - li a1, MSTATUS_FS - or a0, a0, a1 - csrw CSR_SSTATUS, a0 - csrw CSR_FCSR, x0 - li a0, 0 - ret diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec index 8164c59f1dfd..3789ee95351c 100644 --- a/UefiCpuPkg/UefiCpuPkg.dec +++ b/UefiCpuPkg/UefiCpuPkg.dec @@ -80,8 +80,6 @@ SmmRelocationLib|Include/Library/SmmRelocationLib.h [LibraryClasses.RISCV64] - ## @libraryclass Provides function to initialize the FPU. - RiscVFpuLib|Include/Library/BaseRiscVFpuLib.h ## @libraryclass Provides functions to manage MMU features on RISCV64 CPUs. ## RiscVMmuLib|Include/Library/BaseRiscVMmuLib.h diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc index 4503536b767a..aac466848f72 100644 --- a/UefiCpuPkg/UefiCpuPkg.dsc +++ b/UefiCpuPkg/UefiCpuPkg.dsc @@ -220,7 +220,6 @@ [Components.RISCV64] UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.inf UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/BaseRiscV64CpuTimerLib.inf - UefiCpuPkg/Library/BaseRiscVFpuLib/BaseRiscVFpuLib.inf UefiCpuPkg/Library/BaseRiscVMmuLib/BaseRiscVMmuLib.inf UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerDxeRiscV64.inf UefiCpuPkg/CpuDxeRiscV64/CpuDxeRiscV64.inf From f53f943b592722de8de4e7d355b023b7b9280b1e Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Tue, 6 May 2025 11:11:09 -0700 Subject: [PATCH 0248/1172] OvmfPkg/RiscVVirt: Unlink BaseRiscVFpuLib BaseRiscVFpuLib is deprecated. Signed-off-by: Tuan Phan --- OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc | 1 - 1 file changed, 1 deletion(-) diff --git a/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc b/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc index b855b8036d53..11f26bc6d8be 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc +++ b/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc @@ -80,7 +80,6 @@ # RISC-V Architectural Libraries CpuExceptionHandlerLib|UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.inf RiscVSbiLib|MdePkg/Library/BaseRiscVSbiLib/BaseRiscVSbiLib.inf - RiscVFpuLib|UefiCpuPkg/Library/BaseRiscVFpuLib/BaseRiscVFpuLib.inf RiscVMmuLib|UefiCpuPkg/Library/BaseRiscVMmuLib/BaseRiscVMmuLib.inf PlatformBootManagerLib|OvmfPkg/RiscVVirt/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf ResetSystemLib|OvmfPkg/RiscVVirt/Library/ResetSystemLib/BaseResetSystemLib.inf From dd36c3048fb2902daa1e1415401c98d87521a780 Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Thu, 22 May 2025 16:42:15 -0700 Subject: [PATCH 0249/1172] UefiCpuPkg: RISC-V: Add SEC HOB Data definition Introduce RISC-V SEC HOB Data structure to pass boot information from SEC phase to PEI/DXE phases. Signed-off-by: Tuan Phan --- UefiCpuPkg/Include/Guid/RiscVSecHobData.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 UefiCpuPkg/Include/Guid/RiscVSecHobData.h diff --git a/UefiCpuPkg/Include/Guid/RiscVSecHobData.h b/UefiCpuPkg/Include/Guid/RiscVSecHobData.h new file mode 100644 index 000000000000..ddfba64dc472 --- /dev/null +++ b/UefiCpuPkg/Include/Guid/RiscVSecHobData.h @@ -0,0 +1,22 @@ +/** @file + RISC-V SEC Data Hob to pass booting information between SEC, PEI and DXE. + + Copyright (c) 2025, Ventana Micro Systems Inc.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef RISCV_SEC_HOB_DATA_ +#define RISCV_SEC_HOB_DATA_ + +#include + +#define RISCV_SEC_HANDOFF_HOB_GUID { 0xe5ad277d, 0xc2a2, 0x4462, { 0xb1, 0x60, 0x1e, 0x37, 0x6e, 0xdd, 0xf1, 0x95 } } + +typedef struct { + UINTN BootHartId; + VOID *FdtPointer; +} RISCV_SEC_HANDOFF_DATA; + +#endif /* RISCV_SEC_HOB_DATA_ */ From 2ff92cf2aebe3a468a9daa9d3fbae2e0b702cfac Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Thu, 22 May 2025 16:34:12 -0700 Subject: [PATCH 0250/1172] UefiCpuPkg/CpuDxeRiscV64: Retrieve booting info from SEC HOB data The booting info is now stored in SEC HOB GUID data. Signed-off-by: Tuan Phan --- UefiCpuPkg/CpuDxeRiscV64/CpuDxe.c | 20 +++++++++----------- UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h | 2 ++ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.c b/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.c index e51b4a7a7561..6bbcdaca3698 100644 --- a/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.c +++ b/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.c @@ -331,19 +331,17 @@ InitializeCpu ( IN EFI_SYSTEM_TABLE *SystemTable ) { - EFI_STATUS Status; - EFI_RISCV_FIRMWARE_CONTEXT *FirmwareContext; - - GetFirmwareContextPointer (&FirmwareContext); - ASSERT (FirmwareContext != NULL); - if (FirmwareContext == NULL) { - DEBUG ((DEBUG_ERROR, "Failed to get the pointer of EFI_RISCV_FIRMWARE_CONTEXT\n")); - return EFI_NOT_FOUND; - } + EFI_STATUS Status; + VOID *Hob; + RISCV_SEC_HANDOFF_DATA *SecData; + const EFI_GUID SecHobDataGuid = RISCV_SEC_HANDOFF_HOB_GUID; + + Hob = GetFirstGuidHob (&SecHobDataGuid); + ASSERT (Hob != NULL); - DEBUG ((DEBUG_INFO, " %a: Firmware Context is at 0x%x.\n", __func__, FirmwareContext)); + SecData = GET_GUID_HOB_DATA (Hob); + mBootHartId = SecData->BootHartId; - mBootHartId = FirmwareContext->BootHartId; DEBUG ((DEBUG_INFO, " %a: mBootHartId = 0x%x.\n", __func__, mBootHartId)); InitializeCpuExceptionHandlers (NULL); diff --git a/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h b/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h index 721d1ff8680c..347c6ed823f3 100644 --- a/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h +++ b/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h @@ -12,6 +12,7 @@ #include +#include #include #include #include @@ -22,6 +23,7 @@ #include #include #include +#include #include #include #include From 4d80dc68c614365971d627ca836b39a773c98f8c Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Thu, 22 May 2025 16:31:59 -0700 Subject: [PATCH 0251/1172] MdePkg: RISC-V: Remove firmware context APIs Eliminate the APIs using the scratch register as PI 1.9 specifies it for the PEI service table pointer. Signed-off-by: Tuan Phan --- MdePkg/Include/Library/BaseRiscVSbiLib.h | 56 ----------------- .../Library/BaseRiscVSbiLib/BaseRiscVSbiLib.c | 61 ------------------- 2 files changed, 117 deletions(-) diff --git a/MdePkg/Include/Library/BaseRiscVSbiLib.h b/MdePkg/Include/Library/BaseRiscVSbiLib.h index 2244165a6b6a..d1666713a651 100644 --- a/MdePkg/Include/Library/BaseRiscVSbiLib.h +++ b/MdePkg/Include/Library/BaseRiscVSbiLib.h @@ -66,13 +66,6 @@ #define SBI_LAST_ERR SBI_ERR_ALREADY_STOPPED -typedef struct { - UINT64 BootHartId; - VOID *PeiServiceTable; // PEI Service table - VOID *PrePiHobList; // Pre PI Hob List - UINT64 FlattenedDeviceTree; // Pointer to Flattened Device tree -} EFI_RISCV_FIRMWARE_CONTEXT; - // // EDK2 OpenSBI firmware extension return status. // @@ -109,55 +102,6 @@ SbiSystemReset ( IN UINTN ResetReason ); -/** - Get firmware context of the calling hart. - - @param[out] FirmwareContext The firmware context pointer. -**/ -VOID -EFIAPI -GetFirmwareContext ( - OUT EFI_RISCV_FIRMWARE_CONTEXT **FirmwareContext - ); - -/** - Set firmware context of the calling hart. - - @param[in] FirmwareContext The firmware context pointer. -**/ -VOID -EFIAPI -SetFirmwareContext ( - IN EFI_RISCV_FIRMWARE_CONTEXT *FirmwareContext - ); - -/** - Get pointer to OpenSBI Firmware Context - - Get the pointer of firmware context. - - @param FirmwareContextPtr Pointer to retrieve pointer to the - Firmware Context. -**/ -VOID -EFIAPI -GetFirmwareContextPointer ( - IN OUT EFI_RISCV_FIRMWARE_CONTEXT **FirmwareContextPtr - ); - -/** - Set pointer to OpenSBI Firmware Context - - Set the pointer of firmware context. - - @param FirmwareContextPtr Pointer to Firmware Context. -**/ -VOID -EFIAPI -SetFirmwareContextPointer ( - IN EFI_RISCV_FIRMWARE_CONTEXT *FirmwareContextPtr - ); - /** Make ECALL in assembly diff --git a/MdePkg/Library/BaseRiscVSbiLib/BaseRiscVSbiLib.c b/MdePkg/Library/BaseRiscVSbiLib/BaseRiscVSbiLib.c index 1141abfab9d0..6890d943b8a0 100644 --- a/MdePkg/Library/BaseRiscVSbiLib/BaseRiscVSbiLib.c +++ b/MdePkg/Library/BaseRiscVSbiLib/BaseRiscVSbiLib.c @@ -167,64 +167,3 @@ SbiSystemReset ( return TranslateError (Ret.Error); } - -/** - Get firmware context of the calling hart. - - @param[out] FirmwareContext The firmware context pointer. -**/ -VOID -EFIAPI -GetFirmwareContext ( - OUT EFI_RISCV_FIRMWARE_CONTEXT **FirmwareContext - ) -{ - *FirmwareContext = (EFI_RISCV_FIRMWARE_CONTEXT *)RiscVGetSupervisorScratch (); -} - -/** - Set firmware context of the calling hart. - - @param[in] FirmwareContext The firmware context pointer. -**/ -VOID -EFIAPI -SetFirmwareContext ( - IN EFI_RISCV_FIRMWARE_CONTEXT *FirmwareContext - ) -{ - RiscVSetSupervisorScratch ((UINT64)FirmwareContext); -} - -/** - Get pointer to OpenSBI Firmware Context - - Get the pointer of firmware context through OpenSBI FW Extension SBI. - - @param FirmwareContextPtr Pointer to retrieve pointer to the - Firmware Context. -**/ -VOID -EFIAPI -GetFirmwareContextPointer ( - IN OUT EFI_RISCV_FIRMWARE_CONTEXT **FirmwareContextPtr - ) -{ - GetFirmwareContext (FirmwareContextPtr); -} - -/** - Set the pointer to OpenSBI Firmware Context - - Set the pointer of firmware context through OpenSBI FW Extension SBI. - - @param FirmwareContextPtr Pointer to Firmware Context. -**/ -VOID -EFIAPI -SetFirmwareContextPointer ( - IN EFI_RISCV_FIRMWARE_CONTEXT *FirmwareContextPtr - ) -{ - SetFirmwareContext (FirmwareContextPtr); -} From be053713c0b4638496c718ca3fb6faf39568f611 Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Thu, 22 May 2025 16:32:26 -0700 Subject: [PATCH 0252/1172] MdePkg: RISC-V: Add PeiServicesTablePointerLib Based on PI 1.9, the PEI service pointer will be stored in the scratch register. Signed-off-by: Tuan Phan --- .../PeiServicesTablePointer.c | 77 +++++++++++++++++++ .../PeiServicesTablePointerLib.inf | 33 ++++++++ .../PeiServicesTablePointerLib.uni | 15 ++++ MdePkg/MdePkg.dsc | 1 + 4 files changed, 126 insertions(+) create mode 100644 MdePkg/Library/PeiServicesTablePointerLibRiscV/PeiServicesTablePointer.c create mode 100644 MdePkg/Library/PeiServicesTablePointerLibRiscV/PeiServicesTablePointerLib.inf create mode 100644 MdePkg/Library/PeiServicesTablePointerLibRiscV/PeiServicesTablePointerLib.uni diff --git a/MdePkg/Library/PeiServicesTablePointerLibRiscV/PeiServicesTablePointer.c b/MdePkg/Library/PeiServicesTablePointerLibRiscV/PeiServicesTablePointer.c new file mode 100644 index 000000000000..a71efcbeea07 --- /dev/null +++ b/MdePkg/Library/PeiServicesTablePointerLibRiscV/PeiServicesTablePointer.c @@ -0,0 +1,77 @@ +/** @file + PEI Services Table Pointer Library. + + According to PI specification, the peiservice pointer is stored in the SSCRATCH + register of RISC-V architecture. + + Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+ Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include + +/** + Caches a pointer PEI Services Table. + + Caches the pointer to the PEI Services Table specified by PeiServicesTablePointer + in a CPU specific manner as specified in the CPU binding section of the Platform Initialization + Pre-EFI Initialization Core Interface Specification. + + If PeiServicesTablePointer is NULL, then ASSERT(). + + @param PeiServicesTablePointer The address of PeiServices pointer. +**/ +VOID +EFIAPI +SetPeiServicesTablePointer ( + IN CONST EFI_PEI_SERVICES **PeiServicesTablePointer + ) +{ + ASSERT (PeiServicesTablePointer != NULL); + RiscVSetSupervisorScratch ((UINT64)PeiServicesTablePointer); +} + +/** + Retrieves the cached value of the PEI Services Table pointer. + + Returns the cached value of the PEI Services Table pointer in a CPU specific manner + as specified in the CPU binding section of the Platform Initialization Pre-EFI + Initialization Core Interface Specification. + + If the cached PEI Services Table pointer is NULL, then ASSERT(). + + @return The pointer to PeiServices. + +**/ +CONST EFI_PEI_SERVICES ** +EFIAPI +GetPeiServicesTablePointer ( + VOID + ) +{ + return (CONST EFI_PEI_SERVICES **)RiscVGetSupervisorScratch (); +} + +/** + Perform CPU specific actions required to migrate the PEI Services Table + pointer from temporary RAM to permanent RAM. + +**/ +VOID +EFIAPI +MigratePeiServicesTablePointer ( + VOID + ) +{ + // + // PEI Services Table pointer is stored in CSR_SSCRATCH register. No additional + // migration actions are required. + // + return; +} diff --git a/MdePkg/Library/PeiServicesTablePointerLibRiscV/PeiServicesTablePointerLib.inf b/MdePkg/Library/PeiServicesTablePointerLibRiscV/PeiServicesTablePointerLib.inf new file mode 100644 index 000000000000..9c6d9e1fb59b --- /dev/null +++ b/MdePkg/Library/PeiServicesTablePointerLibRiscV/PeiServicesTablePointerLib.inf @@ -0,0 +1,33 @@ +## @file +# Instance of PEI Services Table Pointer Library using global variable for the table pointer. +# +# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
+# Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION = 1.30 + BASE_NAME = PeiServicesTablePointerLib + MODULE_UNI_FILE = PeiServicesTablePointerLib.uni + FILE_GUID = 3b5bccaa-366f-42d1-93b1-64dd7ecb9fa7 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + LIBRARY_CLASS = PeiServicesTablePointerLib|PEIM PEI_CORE SEC + +# +# VALID_ARCHITECTURES = RISCV64 +# + +[Sources] + PeiServicesTablePointer.c + +[Packages] + MdePkg/MdePkg.dec + +[LibraryClasses] + BaseLib + DebugLib diff --git a/MdePkg/Library/PeiServicesTablePointerLibRiscV/PeiServicesTablePointerLib.uni b/MdePkg/Library/PeiServicesTablePointerLibRiscV/PeiServicesTablePointerLib.uni new file mode 100644 index 000000000000..0e9921f3d2a5 --- /dev/null +++ b/MdePkg/Library/PeiServicesTablePointerLibRiscV/PeiServicesTablePointerLib.uni @@ -0,0 +1,15 @@ +// /** @file +// Instance of PEI Services Table Pointer Library for RISCV. +// +// Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.
+// Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// **/ + + +#string STR_MODULE_ABSTRACT #language en-US "Instance of PEI Services Table Pointer Library using global variable for the table pointer" + +#string STR_MODULE_DESCRIPTION #language en-US "The PEI Services Table Pointer Library implementation that retrieves a pointer to the PEI Services Table from a global variable. Not available to modules that execute from read-only memory." + diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc index 066507b5790a..f8b3ff54c388 100644 --- a/MdePkg/MdePkg.dsc +++ b/MdePkg/MdePkg.dsc @@ -213,6 +213,7 @@ MdePkg/Library/BaseRiscVSbiLib/BaseRiscVSbiLib.inf MdePkg/Library/BaseSerialPortLibRiscVSbiLib/BaseSerialPortLibRiscVSbiLib.inf MdePkg/Library/BaseSerialPortLibRiscVSbiLib/BaseSerialPortLibRiscVSbiLibRam.inf + MdePkg/Library/PeiServicesTablePointerLibRiscV/PeiServicesTablePointerLib.inf [Components.LOONGARCH64] MdePkg/Library/PeiServicesTablePointerLibKs0/PeiServicesTablePointerLibKs0.inf From dbe17c79e7775eb1757939c5ec2a1711f7b1d691 Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Thu, 22 May 2025 16:33:48 -0700 Subject: [PATCH 0253/1172] UefiCpuPkg/SecCore: Add support for architectures beyond IA32 and X64 Encapsulate IA32 and X64 code under preprocessor directives to enable module compatibility with other architectures. Signed-off-by: Tuan Phan --- UefiCpuPkg/SecCore/SecBist.c | 39 +++ UefiCpuPkg/SecCore/SecCore.inf | 9 +- UefiCpuPkg/SecCore/SecCoreNative.inf | 7 +- UefiCpuPkg/SecCore/SecMain.c | 357 ++++------------------- UefiCpuPkg/SecCore/SecMain.h | 69 ----- UefiCpuPkg/SecCore/SecTemporaryRamDone.c | 315 ++++++++++++++++++++ 6 files changed, 418 insertions(+), 378 deletions(-) create mode 100644 UefiCpuPkg/SecCore/SecTemporaryRamDone.c diff --git a/UefiCpuPkg/SecCore/SecBist.c b/UefiCpuPkg/SecCore/SecBist.c index cd2e34017106..5016f37d7bcc 100644 --- a/UefiCpuPkg/SecCore/SecBist.c +++ b/UefiCpuPkg/SecCore/SecBist.c @@ -8,6 +8,45 @@ #include "SecMain.h" +/** + Implementation of the PlatformInformation service in EFI_SEC_PLATFORM_INFORMATION_PPI. + + @param PeiServices Pointer to the PEI Services Table. + @param StructureSize Pointer to the variable describing size of the input buffer. + @param PlatformInformationRecord Pointer to the EFI_SEC_PLATFORM_INFORMATION_RECORD. + + @retval EFI_SUCCESS The data was successfully returned. + @retval EFI_BUFFER_TOO_SMALL The buffer was too small. + +**/ +EFI_STATUS +EFIAPI +SecPlatformInformationBist ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN OUT UINT64 *StructureSize, + OUT EFI_SEC_PLATFORM_INFORMATION_RECORD *PlatformInformationRecord + ); + +/** + Implementation of the PlatformInformation2 service in EFI_SEC_PLATFORM_INFORMATION2_PPI. + + @param PeiServices The pointer to the PEI Services Table. + @param StructureSize The pointer to the variable describing size of the input buffer. + @param PlatformInformationRecord2 The pointer to the EFI_SEC_PLATFORM_INFORMATION_RECORD2. + + @retval EFI_SUCCESS The data was successfully returned. + @retval EFI_BUFFER_TOO_SMALL The buffer was too small. The current buffer size needed to + hold the record is returned in StructureSize. + +**/ +EFI_STATUS +EFIAPI +SecPlatformInformation2Bist ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN OUT UINT64 *StructureSize, + OUT EFI_SEC_PLATFORM_INFORMATION_RECORD2 *PlatformInformationRecord2 + ); + EFI_SEC_PLATFORM_INFORMATION_PPI mSecPlatformInformation = { SecPlatformInformationBist }; diff --git a/UefiCpuPkg/SecCore/SecCore.inf b/UefiCpuPkg/SecCore/SecCore.inf index 94966f4edf8a..255d3a9a3f73 100644 --- a/UefiCpuPkg/SecCore/SecCore.inf +++ b/UefiCpuPkg/SecCore/SecCore.inf @@ -31,11 +31,14 @@ SecMain.c SecMain.h FindPeiCore.c - SecBist.c [Sources.IA32] Ia32/ResetVec.nasmb +[Sources.IA32, Sources.X64] + SecBist.c + SecTemporaryRamDone.c + [Packages] MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec @@ -55,9 +58,11 @@ PeiServicesLib PeiServicesTablePointerLib HobLib - CpuPageTableLib StackCheckLib +[LibraryClasses.IA32, LibraryClasses.X64] + CpuPageTableLib + [Ppis] ## SOMETIMES_CONSUMES ## PRODUCES diff --git a/UefiCpuPkg/SecCore/SecCoreNative.inf b/UefiCpuPkg/SecCore/SecCoreNative.inf index facb79c2c496..4d9f385e0624 100644 --- a/UefiCpuPkg/SecCore/SecCoreNative.inf +++ b/UefiCpuPkg/SecCore/SecCoreNative.inf @@ -31,7 +31,10 @@ SecMain.c SecMain.h FindPeiCore.c + +[Sources.IA32, Sources.X64] SecBist.c + SecTemporaryRamDone.c [Packages] MdePkg/MdePkg.dec @@ -52,9 +55,11 @@ PeiServicesLib PeiServicesTablePointerLib HobLib - CpuPageTableLib StackCheckLib +[LibraryClasses.IA32, LibraryClasses.X64] + CpuPageTableLib + [Ppis] ## SOMETIMES_CONSUMES ## PRODUCES diff --git a/UefiCpuPkg/SecCore/SecMain.c b/UefiCpuPkg/SecCore/SecMain.c index 23a75d307667..f6917e88d19c 100644 --- a/UefiCpuPkg/SecCore/SecMain.c +++ b/UefiCpuPkg/SecCore/SecMain.c @@ -2,12 +2,48 @@ C functions in SEC Copyright (c) 2008 - 2019, Intel Corporation. All rights reserved.
+ Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "SecMain.h" +#if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) + +#define SEC_IDT_ENTRY_COUNT 34 + +typedef struct _SEC_IDT_TABLE { + // + // Reserved 8 bytes preceding IDT to store EFI_PEI_SERVICES**, since IDT base + // address should be 8-byte alignment. + // Note: For IA32, only the 4 bytes immediately preceding IDT is used to store + // EFI_PEI_SERVICES** + // + UINT64 PeiService; + IA32_IDT_GATE_DESCRIPTOR IdtTable[SEC_IDT_ENTRY_COUNT]; +} SEC_IDT_TABLE; + +// +// These are IDT entries pointing to 10:FFFFFFE4h. +// +UINT64 mIdtEntryTemplate = 0xffff8e000010ffe4ULL; + +/** + TemporaryRamDone() disables the use of Temporary RAM. If present, this service is invoked + by the PEI Foundation after the EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is installed. + + @retval EFI_SUCCESS Use of Temporary RAM was disabled. + @retval EFI_INVALID_PARAMETER Temporary RAM could not be disabled. + +**/ +EFI_STATUS +EFIAPI +SecTemporaryRamDone ( + VOID + ); + EFI_PEI_TEMPORARY_RAM_DONE_PPI gSecTemporaryRamDonePpi = { SecTemporaryRamDone }; @@ -34,136 +70,18 @@ EFI_PEI_PPI_DESCRIPTOR mPeiSecPlatformInformationPpi[] = { &mSecPlatformInformationPpi } }; - -/** - Migrates the Global Descriptor Table (GDT) to permanent memory. - - @retval EFI_SUCCESS The GDT was migrated successfully. - @retval EFI_OUT_OF_RESOURCES The GDT could not be migrated due to lack of available memory. - -**/ -EFI_STATUS -MigrateGdt ( - VOID - ) -{ - EFI_STATUS Status; - UINTN GdtBufferSize; - IA32_DESCRIPTOR Gdtr; - VOID *GdtBuffer; - - AsmReadGdtr ((IA32_DESCRIPTOR *)&Gdtr); - GdtBufferSize = sizeof (IA32_SEGMENT_DESCRIPTOR) -1 + Gdtr.Limit + 1; - - Status = PeiServicesAllocatePool ( - GdtBufferSize, - &GdtBuffer - ); - ASSERT (GdtBuffer != NULL); - if (EFI_ERROR (Status)) { - return EFI_OUT_OF_RESOURCES; - } - - GdtBuffer = ALIGN_POINTER (GdtBuffer, sizeof (IA32_SEGMENT_DESCRIPTOR)); - CopyMem (GdtBuffer, (VOID *)Gdtr.Base, Gdtr.Limit + 1); - Gdtr.Base = (UINTN)GdtBuffer; - AsmWriteGdtr (&Gdtr); - - return EFI_SUCCESS; -} - -/** - Get Paging Mode - - @retval Paging Mode. -**/ -PAGING_MODE -GetPagingMode ( - VOID - ) -{ - IA32_CR4 Cr4; - BOOLEAN Page5LevelSupport; - UINT32 RegEax; - CPUID_EXTENDED_CPU_SIG_EDX RegEdx; - BOOLEAN Page1GSupport; - PAGING_MODE PagingMode; - - // - // Check Page5Level Support or not. - // - Cr4.UintN = AsmReadCr4 (); - Page5LevelSupport = (Cr4.Bits.LA57 ? TRUE : FALSE); - - // - // Check Page1G Support or not. - // - Page1GSupport = FALSE; - AsmCpuid (CPUID_EXTENDED_FUNCTION, &RegEax, NULL, NULL, NULL); - if (RegEax >= CPUID_EXTENDED_CPU_SIG) { - AsmCpuid (CPUID_EXTENDED_CPU_SIG, NULL, NULL, NULL, &RegEdx.Uint32); - if (RegEdx.Bits.Page1GB != 0) { - Page1GSupport = TRUE; - } - } - - // - // Decide Paging Mode according Page5LevelSupport & Page1GSupport. - // - if (Page5LevelSupport) { - PagingMode = Page1GSupport ? Paging5Level1GB : Paging5Level; - } else { - PagingMode = Page1GSupport ? Paging4Level1GB : Paging4Level; - } - - return PagingMode; -} - -/** - Get max physical address supported by specific page mode - - @param[in] PagingMode The paging mode. - - @retval Max Address. -**/ -UINT32 -GetMaxAddress ( - IN PAGING_MODE PagingMode - ) -{ - CPUID_VIR_PHY_ADDRESS_SIZE_EAX VirPhyAddressSize; - UINT32 MaxExtendedFunctionId; - UINT32 MaxAddressBits; - - VirPhyAddressSize.Uint32 = 0; - - // - // Get Maximum Physical Address Bits - // Get the number of address lines; Maximum Physical Address is 2^PhysicalAddressBits - 1. - // If CPUID does not supported, then use a max value of 36 as per SDM 3A, 4.1.4. - // - AsmCpuid (CPUID_EXTENDED_FUNCTION, &MaxExtendedFunctionId, NULL, NULL, NULL); - if (MaxExtendedFunctionId >= CPUID_VIR_PHY_ADDRESS_SIZE) { - AsmCpuid (CPUID_VIR_PHY_ADDRESS_SIZE, &VirPhyAddressSize.Uint32, NULL, NULL, NULL); - MaxAddressBits = VirPhyAddressSize.Bits.PhysicalAddressBits; - } else { - MaxAddressBits = 36; - } - - if ((PagingMode == Paging4Level1GB) || (PagingMode == Paging4Level)) { +#else +EFI_PEI_PPI_DESCRIPTOR mPeiSecPlatformInformationPpi[] = { + { // - // The max liner address bits is 48 for 4 level page table. + // SecPerformance PPI notify descriptor. // - MaxAddressBits = MIN (VirPhyAddressSize.Bits.PhysicalAddressBits, 48); + EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK, + &gPeiSecPerformancePpiGuid, + (VOID *)(UINTN)SecPerformancePpiCallBack } - - return MaxAddressBits; -} - -// -// These are IDT entries pointing to 10:FFFFFFE4h. -// -UINT64 mIdtEntryTemplate = 0xffff8e000010ffe4ULL; +}; +#endif /** Caller provided function to be invoked at the end of InitializeDebugAgent(). @@ -241,9 +159,6 @@ SecStartup ( ) { EFI_SEC_PEI_HAND_OFF SecCoreData; - IA32_DESCRIPTOR IdtDescriptor; - SEC_IDT_TABLE IdtTableInStack; - UINT32 Index; UINT32 PeiStackSize; EFI_STATUS Status; @@ -282,6 +197,11 @@ SecStartup ( // InitializeFloatingPointUnits (); + #if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) + IA32_DESCRIPTOR IdtDescriptor; + SEC_IDT_TABLE IdtTableInStack; + UINT32 Index; + // |-------------------|----> // |IDT Table | // |-------------------| @@ -307,6 +227,7 @@ SecStartup ( IdtDescriptor.Limit = (UINT16)(sizeof (IdtTableInStack.IdtTable) - 1); AsmWriteIdtr (&IdtDescriptor); + #endif // // Setup the default exception handlers @@ -520,179 +441,3 @@ SecStartupPhase2 ( // UNREACHABLE (); } - -/** - TemporaryRamDone() disables the use of Temporary RAM. If present, this service is invoked - by the PEI Foundation after the EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is installed. - - @retval EFI_SUCCESS Use of Temporary RAM was disabled. - @retval EFI_INVALID_PARAMETER Temporary RAM could not be disabled. - -**/ -EFI_STATUS -EFIAPI -SecTemporaryRamDone ( - VOID - ) -{ - EFI_STATUS Status; - EFI_STATUS Status2; - UINTN Index; - BOOLEAN State; - EFI_PEI_PPI_DESCRIPTOR *PeiPpiDescriptor; - REPUBLISH_SEC_PPI_PPI *RepublishSecPpiPpi; - IA32_CR0 Cr0; - PAGING_MODE PagingMode; - UINT32 MaxAddressBits; - UINTN PageTable; - EFI_PHYSICAL_ADDRESS Buffer; - UINTN BufferSize; - UINT64 Length; - UINT64 Address; - IA32_MAP_ATTRIBUTE MapAttribute; - IA32_MAP_ATTRIBUTE MapMask; - - PageTable = 0; - BufferSize = 0; - MapAttribute.Uint64 = 0; - MapAttribute.Bits.Present = 1; - MapAttribute.Bits.ReadWrite = 1; - MapMask.Uint64 = MAX_UINT64; - - // - // Republish Sec Platform Information(2) PPI - // - RepublishSecPlatformInformationPpi (); - - // - // Re-install SEC PPIs using a PEIM produced service if published - // - for (Index = 0, Status = EFI_SUCCESS; Status == EFI_SUCCESS; Index++) { - Status = PeiServicesLocatePpi ( - &gRepublishSecPpiPpiGuid, - Index, - &PeiPpiDescriptor, - (VOID **)&RepublishSecPpiPpi - ); - if (!EFI_ERROR (Status)) { - DEBUG ((DEBUG_INFO, "Calling RepublishSecPpi instance %d.\n", Index)); - Status2 = RepublishSecPpiPpi->RepublishSecPpis (); - ASSERT_EFI_ERROR (Status2); - } - } - - // - // Migrate DebugAgentContext. - // - InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, NULL, NULL); - - // - // Disable interrupts and save current interrupt state - // - State = SaveAndDisableInterrupts (); - - // - // Migrate GDT before NEM near down - // - if (PcdGetBool (PcdMigrateTemporaryRamFirmwareVolumes)) { - Status = MigrateGdt (); - ASSERT_EFI_ERROR (Status); - } - - // - // Migrate page table to permanent memory mapping entire physical address space if CR0.PG is set. - // - Cr0.UintN = AsmReadCr0 (); - if (Cr0.Bits.PG != 0) { - // - // Assume CPU runs in 64bit mode if paging is enabled. - // - ASSERT (sizeof (UINTN) == sizeof (UINT64)); - - // - // Get PagingMode & MaxAddressBits. - // - PagingMode = GetPagingMode (); - MaxAddressBits = GetMaxAddress (PagingMode); - DEBUG ((DEBUG_INFO, "SecTemporaryRamDone: PagingMode = 0x%lx, MaxAddressBits = %d\n", PagingMode, MaxAddressBits)); - - // - // Create page table to cover the max mapping address in physical memory before Temp - // Ram Exit. The max mapping address is defined by PcdMaxMappingAddressBeforeTempRamExit. - // - Length = FixedPcdGet64 (PcdMaxMappingAddressBeforeTempRamExit); - Length = MIN (LShiftU64 (1, MaxAddressBits), Length); - if (Length != 0) { - Status = PageTableMap (&PageTable, PagingMode, 0, &BufferSize, 0, Length, &MapAttribute, &MapMask, NULL); - ASSERT (Status == EFI_BUFFER_TOO_SMALL); - if (Status != EFI_BUFFER_TOO_SMALL) { - return Status; - } - - Status = PeiServicesAllocatePages ( - EfiBootServicesData, - EFI_SIZE_TO_PAGES (BufferSize), - &Buffer - ); - if (EFI_ERROR (Status)) { - return EFI_OUT_OF_RESOURCES; - } - - Status = PageTableMap (&PageTable, PagingMode, (VOID *)(UINTN)Buffer, &BufferSize, 0, Length, &MapAttribute, &MapMask, NULL); - ASSERT (BufferSize == 0); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "SecTemporaryRamDone: Failed to create page table in physical memory before Temp Ram Exit: %r.\n", Status)); - CpuDeadLoop (); - } - - AsmWriteCr3 (PageTable); - } - } - - // - // Disable Temporary RAM after Stack and Heap have been migrated at this point. - // - SecPlatformDisableTemporaryMemory (); - - // - // Expanding the page table to cover the entire memory space since the physical memory is WB after TempRamExit. - // - if ((Cr0.Bits.PG != 0) && (Length < LShiftU64 (1, MaxAddressBits))) { - Address = Length; - Length = LShiftU64 (1, MaxAddressBits) - Length; - - MapAttribute.Uint64 = Address; - MapAttribute.Bits.Present = 1; - MapAttribute.Bits.ReadWrite = 1; - - Status = PageTableMap (&PageTable, PagingMode, 0, &BufferSize, Address, Length, &MapAttribute, &MapMask, NULL); - ASSERT (Status == EFI_BUFFER_TOO_SMALL); - if (Status != EFI_BUFFER_TOO_SMALL) { - return Status; - } - - Status = PeiServicesAllocatePages ( - EfiBootServicesData, - EFI_SIZE_TO_PAGES (BufferSize), - &Buffer - ); - if (EFI_ERROR (Status)) { - return EFI_OUT_OF_RESOURCES; - } - - Status = PageTableMap (&PageTable, PagingMode, (VOID *)(UINTN)Buffer, &BufferSize, Address, Length, &MapAttribute, &MapMask, NULL); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "SecTemporaryRamDone: Failed to create full range page table in physical memory after Temp Ram Exit: %r.\n", Status)); - CpuDeadLoop (); - } - - AsmWriteCr3 (PageTable); - } - - // - // Restore original interrupt state - // - SetInterruptState (State); - - return EFI_SUCCESS; -} diff --git a/UefiCpuPkg/SecCore/SecMain.h b/UefiCpuPkg/SecCore/SecMain.h index 81c561424e3b..6b312a8ac135 100644 --- a/UefiCpuPkg/SecCore/SecMain.h +++ b/UefiCpuPkg/SecCore/SecMain.h @@ -33,36 +33,6 @@ #include #include #include -#include -#include -#include - -#define SEC_IDT_ENTRY_COUNT 34 - -typedef struct _SEC_IDT_TABLE { - // - // Reserved 8 bytes preceding IDT to store EFI_PEI_SERVICES**, since IDT base - // address should be 8-byte alignment. - // Note: For IA32, only the 4 bytes immediately preceding IDT is used to store - // EFI_PEI_SERVICES** - // - UINT64 PeiService; - IA32_IDT_GATE_DESCRIPTOR IdtTable[SEC_IDT_ENTRY_COUNT]; -} SEC_IDT_TABLE; - -/** - TemporaryRamDone() disables the use of Temporary RAM. If present, this service is invoked - by the PEI Foundation after the EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is installed. - - @retval EFI_SUCCESS Use of Temporary RAM was disabled. - @retval EFI_INVALID_PARAMETER Temporary RAM could not be disabled. - -**/ -EFI_STATUS -EFIAPI -SecTemporaryRamDone ( - VOID - ); /** Entry point to the C language phase of SEC. After the SEC assembly @@ -101,45 +71,6 @@ FindAndReportEntryPoints ( OUT EFI_PEI_CORE_ENTRY_POINT *PeiCoreEntryPoint ); -/** - Implementation of the PlatformInformation service in EFI_SEC_PLATFORM_INFORMATION_PPI. - - @param PeiServices Pointer to the PEI Services Table. - @param StructureSize Pointer to the variable describing size of the input buffer. - @param PlatformInformationRecord Pointer to the EFI_SEC_PLATFORM_INFORMATION_RECORD. - - @retval EFI_SUCCESS The data was successfully returned. - @retval EFI_BUFFER_TOO_SMALL The buffer was too small. - -**/ -EFI_STATUS -EFIAPI -SecPlatformInformationBist ( - IN CONST EFI_PEI_SERVICES **PeiServices, - IN OUT UINT64 *StructureSize, - OUT EFI_SEC_PLATFORM_INFORMATION_RECORD *PlatformInformationRecord - ); - -/** - Implementation of the PlatformInformation2 service in EFI_SEC_PLATFORM_INFORMATION2_PPI. - - @param PeiServices The pointer to the PEI Services Table. - @param StructureSize The pointer to the variable describing size of the input buffer. - @param PlatformInformationRecord2 The pointer to the EFI_SEC_PLATFORM_INFORMATION_RECORD2. - - @retval EFI_SUCCESS The data was successfully returned. - @retval EFI_BUFFER_TOO_SMALL The buffer was too small. The current buffer size needed to - hold the record is returned in StructureSize. - -**/ -EFI_STATUS -EFIAPI -SecPlatformInformation2Bist ( - IN CONST EFI_PEI_SERVICES **PeiServices, - IN OUT UINT64 *StructureSize, - OUT EFI_SEC_PLATFORM_INFORMATION_RECORD2 *PlatformInformationRecord2 - ); - /** Republish SecPlatformInformationPpi/SecPlatformInformation2Ppi. diff --git a/UefiCpuPkg/SecCore/SecTemporaryRamDone.c b/UefiCpuPkg/SecCore/SecTemporaryRamDone.c new file mode 100644 index 000000000000..f921d457e88d --- /dev/null +++ b/UefiCpuPkg/SecCore/SecTemporaryRamDone.c @@ -0,0 +1,315 @@ +/** @file + SEC platform information(2) PPI. + + Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
+ Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include "SecMain.h" + +/** + Migrates the Global Descriptor Table (GDT) to permanent memory. + + @retval EFI_SUCCESS The GDT was migrated successfully. + @retval EFI_OUT_OF_RESOURCES The GDT could not be migrated due to lack of available memory. + +**/ +EFI_STATUS +MigrateGdt ( + VOID + ) +{ + EFI_STATUS Status; + UINTN GdtBufferSize; + IA32_DESCRIPTOR Gdtr; + VOID *GdtBuffer; + + AsmReadGdtr ((IA32_DESCRIPTOR *)&Gdtr); + GdtBufferSize = sizeof (IA32_SEGMENT_DESCRIPTOR) -1 + Gdtr.Limit + 1; + + Status = PeiServicesAllocatePool ( + GdtBufferSize, + &GdtBuffer + ); + ASSERT (GdtBuffer != NULL); + if (EFI_ERROR (Status)) { + return EFI_OUT_OF_RESOURCES; + } + + GdtBuffer = ALIGN_POINTER (GdtBuffer, sizeof (IA32_SEGMENT_DESCRIPTOR)); + CopyMem (GdtBuffer, (VOID *)Gdtr.Base, Gdtr.Limit + 1); + Gdtr.Base = (UINTN)GdtBuffer; + AsmWriteGdtr (&Gdtr); + + return EFI_SUCCESS; +} + +/** + Get Paging Mode + + @retval Paging Mode. +**/ +PAGING_MODE +GetPagingMode ( + VOID + ) +{ + IA32_CR4 Cr4; + BOOLEAN Page5LevelSupport; + UINT32 RegEax; + CPUID_EXTENDED_CPU_SIG_EDX RegEdx; + BOOLEAN Page1GSupport; + PAGING_MODE PagingMode; + + // + // Check Page5Level Support or not. + // + Cr4.UintN = AsmReadCr4 (); + Page5LevelSupport = (Cr4.Bits.LA57 ? TRUE : FALSE); + + // + // Check Page1G Support or not. + // + Page1GSupport = FALSE; + AsmCpuid (CPUID_EXTENDED_FUNCTION, &RegEax, NULL, NULL, NULL); + if (RegEax >= CPUID_EXTENDED_CPU_SIG) { + AsmCpuid (CPUID_EXTENDED_CPU_SIG, NULL, NULL, NULL, &RegEdx.Uint32); + if (RegEdx.Bits.Page1GB != 0) { + Page1GSupport = TRUE; + } + } + + // + // Decide Paging Mode according Page5LevelSupport & Page1GSupport. + // + if (Page5LevelSupport) { + PagingMode = Page1GSupport ? Paging5Level1GB : Paging5Level; + } else { + PagingMode = Page1GSupport ? Paging4Level1GB : Paging4Level; + } + + return PagingMode; +} + +/** + Get max physical address supported by specific page mode + + @param[in] PagingMode The paging mode. + + @retval Max Address. +**/ +UINT32 +GetMaxAddress ( + IN PAGING_MODE PagingMode + ) +{ + CPUID_VIR_PHY_ADDRESS_SIZE_EAX VirPhyAddressSize; + UINT32 MaxExtendedFunctionId; + UINT32 MaxAddressBits; + + VirPhyAddressSize.Uint32 = 0; + + // + // Get Maximum Physical Address Bits + // Get the number of address lines; Maximum Physical Address is 2^PhysicalAddressBits - 1. + // If CPUID does not supported, then use a max value of 36 as per SDM 3A, 4.1.4. + // + AsmCpuid (CPUID_EXTENDED_FUNCTION, &MaxExtendedFunctionId, NULL, NULL, NULL); + if (MaxExtendedFunctionId >= CPUID_VIR_PHY_ADDRESS_SIZE) { + AsmCpuid (CPUID_VIR_PHY_ADDRESS_SIZE, &VirPhyAddressSize.Uint32, NULL, NULL, NULL); + MaxAddressBits = VirPhyAddressSize.Bits.PhysicalAddressBits; + } else { + MaxAddressBits = 36; + } + + if ((PagingMode == Paging4Level1GB) || (PagingMode == Paging4Level)) { + // + // The max liner address bits is 48 for 4 level page table. + // + MaxAddressBits = MIN (VirPhyAddressSize.Bits.PhysicalAddressBits, 48); + } + + return MaxAddressBits; +} + +/** + TemporaryRamDone() disables the use of Temporary RAM. If present, this service is invoked + by the PEI Foundation after the EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is installed. + + @retval EFI_SUCCESS Use of Temporary RAM was disabled. + @retval EFI_INVALID_PARAMETER Temporary RAM could not be disabled. + +**/ +EFI_STATUS +EFIAPI +SecTemporaryRamDone ( + VOID + ) +{ + EFI_STATUS Status; + EFI_STATUS Status2; + UINTN Index; + BOOLEAN State; + EFI_PEI_PPI_DESCRIPTOR *PeiPpiDescriptor; + REPUBLISH_SEC_PPI_PPI *RepublishSecPpiPpi; + IA32_CR0 Cr0; + PAGING_MODE PagingMode; + UINT32 MaxAddressBits; + UINTN PageTable; + EFI_PHYSICAL_ADDRESS Buffer; + UINTN BufferSize; + UINT64 Length; + UINT64 Address; + IA32_MAP_ATTRIBUTE MapAttribute; + IA32_MAP_ATTRIBUTE MapMask; + + PageTable = 0; + BufferSize = 0; + MapAttribute.Uint64 = 0; + MapAttribute.Bits.Present = 1; + MapAttribute.Bits.ReadWrite = 1; + MapMask.Uint64 = MAX_UINT64; + + // + // Republish Sec Platform Information(2) PPI + // + RepublishSecPlatformInformationPpi (); + + // + // Re-install SEC PPIs using a PEIM produced service if published + // + for (Index = 0, Status = EFI_SUCCESS; Status == EFI_SUCCESS; Index++) { + Status = PeiServicesLocatePpi ( + &gRepublishSecPpiPpiGuid, + Index, + &PeiPpiDescriptor, + (VOID **)&RepublishSecPpiPpi + ); + if (!EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "Calling RepublishSecPpi instance %d.\n", Index)); + Status2 = RepublishSecPpiPpi->RepublishSecPpis (); + ASSERT_EFI_ERROR (Status2); + } + } + + // + // Migrate DebugAgentContext. + // + InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, NULL, NULL); + + // + // Disable interrupts and save current interrupt state + // + State = SaveAndDisableInterrupts (); + + // + // Migrate GDT before NEM near down + // + if (PcdGetBool (PcdMigrateTemporaryRamFirmwareVolumes)) { + Status = MigrateGdt (); + ASSERT_EFI_ERROR (Status); + } + + // + // Migrate page table to permanent memory mapping entire physical address space if CR0.PG is set. + // + Cr0.UintN = AsmReadCr0 (); + if (Cr0.Bits.PG != 0) { + // + // Assume CPU runs in 64bit mode if paging is enabled. + // + ASSERT (sizeof (UINTN) == sizeof (UINT64)); + + // + // Get PagingMode & MaxAddressBits. + // + PagingMode = GetPagingMode (); + MaxAddressBits = GetMaxAddress (PagingMode); + DEBUG ((DEBUG_INFO, "SecTemporaryRamDone: PagingMode = 0x%lx, MaxAddressBits = %d\n", PagingMode, MaxAddressBits)); + + // + // Create page table to cover the max mapping address in physical memory before Temp + // Ram Exit. The max mapping address is defined by PcdMaxMappingAddressBeforeTempRamExit. + // + Length = FixedPcdGet64 (PcdMaxMappingAddressBeforeTempRamExit); + Length = MIN (LShiftU64 (1, MaxAddressBits), Length); + if (Length != 0) { + Status = PageTableMap (&PageTable, PagingMode, 0, &BufferSize, 0, Length, &MapAttribute, &MapMask, NULL); + ASSERT (Status == EFI_BUFFER_TOO_SMALL); + if (Status != EFI_BUFFER_TOO_SMALL) { + return Status; + } + + Status = PeiServicesAllocatePages ( + EfiBootServicesData, + EFI_SIZE_TO_PAGES (BufferSize), + &Buffer + ); + if (EFI_ERROR (Status)) { + return EFI_OUT_OF_RESOURCES; + } + + Status = PageTableMap (&PageTable, PagingMode, (VOID *)(UINTN)Buffer, &BufferSize, 0, Length, &MapAttribute, &MapMask, NULL); + ASSERT (BufferSize == 0); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "SecTemporaryRamDone: Failed to create page table in physical memory before Temp Ram Exit: %r.\n", Status)); + CpuDeadLoop (); + } + + AsmWriteCr3 (PageTable); + } + } + + // + // Disable Temporary RAM after Stack and Heap have been migrated at this point. + // + SecPlatformDisableTemporaryMemory (); + + // + // Expanding the page table to cover the entire memory space since the physical memory is WB after TempRamExit. + // + if ((Cr0.Bits.PG != 0) && (Length < LShiftU64 (1, MaxAddressBits))) { + Address = Length; + Length = LShiftU64 (1, MaxAddressBits) - Length; + + MapAttribute.Uint64 = Address; + MapAttribute.Bits.Present = 1; + MapAttribute.Bits.ReadWrite = 1; + + Status = PageTableMap (&PageTable, PagingMode, 0, &BufferSize, Address, Length, &MapAttribute, &MapMask, NULL); + ASSERT (Status == EFI_BUFFER_TOO_SMALL); + if (Status != EFI_BUFFER_TOO_SMALL) { + return Status; + } + + Status = PeiServicesAllocatePages ( + EfiBootServicesData, + EFI_SIZE_TO_PAGES (BufferSize), + &Buffer + ); + if (EFI_ERROR (Status)) { + return EFI_OUT_OF_RESOURCES; + } + + Status = PageTableMap (&PageTable, PagingMode, (VOID *)(UINTN)Buffer, &BufferSize, Address, Length, &MapAttribute, &MapMask, NULL); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "SecTemporaryRamDone: Failed to create full range page table in physical memory after Temp Ram Exit: %r.\n", Status)); + CpuDeadLoop (); + } + + AsmWriteCr3 (PageTable); + } + + // + // Restore original interrupt state + // + SetInterruptState (State); + + return EFI_SUCCESS; +} From 977b68aa1efd400b54009f30c1f5c3225e9ea691 Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Tue, 6 May 2025 11:38:30 -0700 Subject: [PATCH 0254/1172] OvmfPkg/RiscVVirt: Add PlatformSecLib library Create PlatformSecLib library to support both PEIless and PEI booting modes. Signed-off-by: Tuan Phan --- .../RiscVVirt/Library/PlatformSecLib/Cpu.c | 31 ++ .../{Sec => Library/PlatformSecLib}/Memory.c | 90 ++--- .../PlatformSecLib}/Platform.c | 62 +--- .../Library/PlatformSecLib/PlatformSecLib.c | 341 ++++++++++++++++++ .../Library/PlatformSecLib/PlatformSecLib.h | 102 ++++++ .../Library/PlatformSecLib/PlatformSecLib.inf | 61 ++++ .../Library/PlatformSecLib/SecEntry.S | 22 ++ OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc | 1 - OvmfPkg/RiscVVirt/RiscVVirt.fdf.inc | 4 +- OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc | 6 +- OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf | 2 +- OvmfPkg/RiscVVirt/Sec/Cpu.c | 33 -- OvmfPkg/RiscVVirt/Sec/SecEntry.S | 18 - OvmfPkg/RiscVVirt/Sec/SecMain.c | 110 ------ OvmfPkg/RiscVVirt/Sec/SecMain.h | 91 ----- OvmfPkg/RiscVVirt/Sec/SecMain.inf | 68 ---- 16 files changed, 621 insertions(+), 421 deletions(-) create mode 100644 OvmfPkg/RiscVVirt/Library/PlatformSecLib/Cpu.c rename OvmfPkg/RiscVVirt/{Sec => Library/PlatformSecLib}/Memory.c (77%) rename OvmfPkg/RiscVVirt/{Sec => Library/PlatformSecLib}/Platform.c (59%) create mode 100644 OvmfPkg/RiscVVirt/Library/PlatformSecLib/PlatformSecLib.c create mode 100644 OvmfPkg/RiscVVirt/Library/PlatformSecLib/PlatformSecLib.h create mode 100644 OvmfPkg/RiscVVirt/Library/PlatformSecLib/PlatformSecLib.inf create mode 100644 OvmfPkg/RiscVVirt/Library/PlatformSecLib/SecEntry.S delete mode 100644 OvmfPkg/RiscVVirt/Sec/Cpu.c delete mode 100644 OvmfPkg/RiscVVirt/Sec/SecEntry.S delete mode 100644 OvmfPkg/RiscVVirt/Sec/SecMain.c delete mode 100644 OvmfPkg/RiscVVirt/Sec/SecMain.h delete mode 100644 OvmfPkg/RiscVVirt/Sec/SecMain.inf diff --git a/OvmfPkg/RiscVVirt/Library/PlatformSecLib/Cpu.c b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/Cpu.c new file mode 100644 index 000000000000..27975f122b50 --- /dev/null +++ b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/Cpu.c @@ -0,0 +1,31 @@ +/** @file + Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "PlatformSecLib.h" + +/** + Perform CPU initialization. + + @param FdtPointer The pointer to the device tree. + + @return EFI_SUCCESS The platform initialized successfully. + @retval Others - As the error code indicates + +**/ +EFI_STATUS +EFIAPI +CpuInitialization ( + VOID *FdtPointer + ) +{ + // + // for MMU type >= sv39 + // + BuildCpuHob (56, 32); + + return EFI_SUCCESS; +} diff --git a/OvmfPkg/RiscVVirt/Sec/Memory.c b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/Memory.c similarity index 77% rename from OvmfPkg/RiscVVirt/Sec/Memory.c rename to OvmfPkg/RiscVVirt/Library/PlatformSecLib/Memory.c index 4dee8d3cd3d0..281e4783cbe8 100644 --- a/OvmfPkg/RiscVVirt/Sec/Memory.c +++ b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/Memory.c @@ -1,41 +1,39 @@ /** @file - Memory Detection for Virtual Machines. + Memory Detection for RiscVVirt Machines. Copyright (c) 2021, Hewlett Packard Enterprise Development LP. All rights reserved.
Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
+ Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent -Module Name: - - MemDetect.c - **/ -// -// The package level header files this module uses -// -#include - -// -// The Library classes this module consumes -// -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "PlatformSecLib.h" VOID -BuildMemoryTypeInformationHob ( +BuildMemoryTypeHob ( VOID - ); + ) +{ + EFI_MEMORY_TYPE_INFORMATION Info[6]; + + Info[0].Type = EfiACPIReclaimMemory; + Info[0].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiACPIReclaimMemory); + Info[1].Type = EfiACPIMemoryNVS; + Info[1].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiACPIMemoryNVS); + Info[2].Type = EfiReservedMemoryType; + Info[2].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiReservedMemoryType); + Info[3].Type = EfiRuntimeServicesData; + Info[3].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiRuntimeServicesData); + Info[4].Type = EfiRuntimeServicesCode; + Info[4].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiRuntimeServicesCode); + // Terminator for the list + Info[5].Type = EfiMaxMemoryType; + Info[5].NumberOfPages = 0; + + BuildGuidDataHob (&gEfiMemoryTypeInformationGuid, &Info, sizeof (Info)); +} /** Create memory range resource HOB using the memory base @@ -235,37 +233,25 @@ AddReservedMemoryMap ( } /** - Initialize memory hob based on the DTB information. + Perform Memory initialization. - @return EFI_SUCCESS The memory hob added successfully. + @param FdtPointer The pointer to the device tree. + + @return EFI_SUCCESS The platform initialized successfully. + @retval Others - As the error code indicates **/ EFI_STATUS -MemoryPeimInitialization ( - VOID +EFIAPI +MemoryInitialization ( + VOID *FdtPointer ) { - EFI_RISCV_FIRMWARE_CONTEXT *FirmwareContext; - CONST UINT64 *RegProp; - CONST CHAR8 *Type; - UINT64 CurBase, CurSize; - INT32 Node, Prev; - INT32 Len; - VOID *FdtPointer; - - FirmwareContext = NULL; - GetFirmwareContextPointer (&FirmwareContext); - - if (FirmwareContext == NULL) { - DEBUG ((DEBUG_ERROR, "%a: Firmware Context is NULL\n", __func__)); - return EFI_UNSUPPORTED; - } - - FdtPointer = (VOID *)FirmwareContext->FlattenedDeviceTree; - if (FdtPointer == NULL) { - DEBUG ((DEBUG_ERROR, "%a: Invalid FDT pointer\n", __func__)); - return EFI_UNSUPPORTED; - } + CONST UINT64 *RegProp; + CONST CHAR8 *Type; + UINT64 CurBase, CurSize; + INT32 Node, Prev; + INT32 Len; // Look for the lowest memory node for (Prev = 0; ; Prev = Node) { @@ -311,7 +297,7 @@ MemoryPeimInitialization ( /* Make sure SEC is booting with bare mode */ ASSERT ((RiscVGetSupervisorAddressTranslationRegister () & SATP64_MODE) == (SATP_MODE_OFF << SATP64_MODE_SHIFT)); - BuildMemoryTypeInformationHob (); + BuildMemoryTypeHob (); return EFI_SUCCESS; } diff --git a/OvmfPkg/RiscVVirt/Sec/Platform.c b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/Platform.c similarity index 59% rename from OvmfPkg/RiscVVirt/Sec/Platform.c rename to OvmfPkg/RiscVVirt/Library/PlatformSecLib/Platform.c index 18658e7e3e1c..13028e46421e 100644 --- a/OvmfPkg/RiscVVirt/Sec/Platform.c +++ b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/Platform.c @@ -1,25 +1,12 @@ /** @file -The library call to pass the device tree to DXE via HOB. + Copyright (c) 2021, Hewlett Packard Enterprise Development LP. All rights reserved.
+ Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
-Copyright (c) 2021, Hewlett Packard Enterprise Development LP. All rights reserved.
- -SPDX-License-Identifier: BSD-2-Clause-Patent + SPDX-License-Identifier: BSD-2-Clause-Patent **/ -// -//// The package level header files this module uses -//// -#include - -#include -#include -#include -#include -#include -#include -#include -#include +#include "PlatformSecLib.h" /** Build memory map I/O range resource HOB using the @@ -80,36 +67,27 @@ PopulateIoResources ( } /** - @retval EFI_SUCCESS The address of FDT is passed in HOB. - EFI_UNSUPPORTED Can't locate FDT. + Perform Platform initialization. + + @param FdtPointer The pointer to the device tree. + + @return EFI_SUCCESS The platform initialized successfully. + @retval Others - As the error code indicates + **/ EFI_STATUS EFIAPI -PlatformPeimInitialization ( - VOID +PlatformInitialization ( + VOID *FdtPointer ) { - EFI_RISCV_FIRMWARE_CONTEXT *FirmwareContext; - VOID *FdtPointer; - VOID *Base; - VOID *NewBase; - UINTN FdtSize; - UINTN FdtPages; - UINT64 *FdtHobData; - - FirmwareContext = NULL; - GetFirmwareContextPointer (&FirmwareContext); - - if (FirmwareContext == NULL) { - DEBUG ((DEBUG_ERROR, "%a: Firmware Context is NULL\n", __func__)); - return EFI_UNSUPPORTED; - } + VOID *Base; + VOID *NewBase; + UINTN FdtSize; + UINTN FdtPages; + UINT64 *FdtHobData; - FdtPointer = (VOID *)FirmwareContext->FlattenedDeviceTree; - if (FdtPointer == NULL) { - DEBUG ((DEBUG_ERROR, "%a: Invalid FDT pointer\n", __func__)); - return EFI_UNSUPPORTED; - } + SerialPortInitialize (); DEBUG ((DEBUG_INFO, "%a: Build FDT HOB - FDT at address: 0x%x \n", __func__, FdtPointer)); Base = FdtPointer; @@ -136,8 +114,6 @@ PlatformPeimInitialization ( *FdtHobData = (UINTN)NewBase; - BuildFvHob (PcdGet32 (PcdOvmfDxeMemFvBase), PcdGet32 (PcdOvmfDxeMemFvSize)); - PopulateIoResources (Base, "ns16550a"); PopulateIoResources (Base, "qemu,fw-cfg-mmio"); PopulateIoResources (Base, "virtio,mmio"); diff --git a/OvmfPkg/RiscVVirt/Library/PlatformSecLib/PlatformSecLib.c b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/PlatformSecLib.c new file mode 100644 index 000000000000..26e58bf196d2 --- /dev/null +++ b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/PlatformSecLib.c @@ -0,0 +1,341 @@ +/** @file +An instance of Platform Sec Lib. + +Copyright (c) 2013 - 2015, Intel Corporation. All rights reserved.
+Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+ +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "PlatformSecLib.h" + +typedef struct { + EFI_HOB_GUID_TYPE HobGuidHeader; + RISCV_SEC_HANDOFF_DATA SecHandoffData; + EFI_HOB_GENERIC_HEADER HobEnd; +} SEC_HOBLIST_DATA; + +EFI_STATUS +EFIAPI +RiscVSecGetHobData ( + IN CONST EFI_SEC_HOB_DATA_PPI *This, + OUT EFI_HOB_GENERIC_HEADER **HobList + ); + +STATIC EFI_SEC_HOB_DATA_PPI mSecHobDataPpi = { + RiscVSecGetHobData +}; + +STATIC EFI_PEI_PPI_DESCRIPTOR mPpiSecHobData = { + (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), + &gEfiSecHobDataPpiGuid, + &mSecHobDataPpi +}; + +VOID +EFIAPI +ProcessLibraryConstructorList ( + VOID + ); + +/** + After the SEC assembly code has initialized some temporary memory and set up + the stack, the control is transferred to this function for PEI booting. + + @param SizeOfRam Size of the temporary memory available for use. + @param TempRamBase Base address of temporary ram + @param BootFirmwareVolume Base address of the Boot Firmware Volume. +**/ +VOID +NORETURN +EFIAPI +SecStartup ( + IN UINT32 SizeOfRam, + IN UINT32 TempRamBase, + IN VOID *BootFirmwareVolume + ); + +STATIC +VOID * +GetSecHobData ( + VOID + ) +{ + return (VOID *)(FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) + FixedPcdGet32 (PcdOvmfSecPeiTempRamSize) - SEC_HANDOFF_DATA_RESERVE_SIZE); +} + +#ifndef RISCVVIRT_PEI_BOOTING + +/** + After the SEC assembly code has initialized some temporary memory and set up + the stack, the control is transferred to this function for PEIless booting. + + @param SizeOfRam Size of the temporary memory available for use. + @param TempRamBase Base address of temporary ram + @param BootFirmwareVolume Base address of the Boot Firmware Volume. +**/ +STATIC +VOID +NORETURN +SecPEIlessStartup ( + IN UINT32 SizeOfRam, + IN UINT32 TempRamBase, + IN VOID *BootFirmwareVolume + ) +{ + EFI_STATUS Status; + EFI_HOB_HANDOFF_INFO_TABLE *HobList; + UINTN SecStackBase; + UINTN SecStackSize; + EFI_PEI_FILE_HANDLE FileHandle = NULL; + + DEBUG (( + DEBUG_INFO, + "%a(): TempRAM Base: 0x%x, TempRAM Size: 0x%x\n", + __func__, + TempRamBase, + SizeOfRam + )); + + SecStackSize = SIZE_16KB; + SecStackBase = TempRamBase + SizeOfRam - SecStackSize; + + // + // Initialize floating point operating environment + // to be compliant with UEFI spec. + // + InitializeFloatingPointUnits (); + + // + // Setup the default exception handlers + // + Status = InitializeCpuExceptionHandlers (NULL); + ASSERT_EFI_ERROR (Status); + + DEBUG (( + DEBUG_INFO, + "%a() BFV Base: 0x%p, StackBase: 0x%x, StackSize: 0x%x\n", + __func__, + BootFirmwareVolume, + SecStackBase, + SecStackSize + )); + + // + // Declare the temporary memory region + // + HobList = HobConstructor ( + (VOID *)(UINTN)TempRamBase, + SizeOfRam, + (VOID *)(UINTN)TempRamBase, + (VOID *)SecStackBase + ); + PrePeiSetHobList (HobList); + + BuildStackHob (SecStackBase, SecStackSize); + + // + // Initialize platform devices + // + SecPlatformMain (NULL); + + // + // Process all libraries constructor function linked to SecMain. + // + ProcessLibraryConstructorList (); + + // + // Decompress BFV first + // + Status = FfsFindNextFile ( + EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE, + (EFI_PEI_FV_HANDLE)BootFirmwareVolume, + &FileHandle + ); + ASSERT_EFI_ERROR (Status); + + Status = FfsProcessFvFile (FileHandle); + ASSERT_EFI_ERROR (Status); + + // + // Load the DXE Core and transfer control to it + // + Status = LoadDxeCoreFromFv (NULL, 0); + ASSERT_EFI_ERROR (Status); + + // + // Should not come here. + // + UNREACHABLE (); +} + +#endif /* RISCVVIRT_PEI_BOOTING */ + +/** + Entry point to the C language phase of SEC for this platform. After the SEC assembly + code has initialized some temporary memory and set up the stack, + the control is transferred to this function. + + @param BootHartId The hardware thread (Hart) ID of the current CPU. + @param DeviceTreeAddress Address of the device tree provided to the SEC phase. + @param TempRamBase Base address of the temporary memory. + @param TempRamSize Size of the temporary memory region. +**/ +VOID +NORETURN +EFIAPI +SecStartupPlatform ( + IN UINTN BootHartId, + IN VOID *DeviceTreeAddress, + IN UINT32 TempRamBase, + IN UINT32 TempRamSize + ) +{ + SEC_HOBLIST_DATA *SecHobList; + + DEBUG (( + DEBUG_INFO, + "%a() BootHartId: 0x%x, DeviceTreeAddress=0x%p\n", + __func__, + BootHartId, + DeviceTreeAddress + )); + + // + // Set hob list data that will be passed to PEI + // + SecHobList = (SEC_HOBLIST_DATA *)GetSecHobData (); + SecHobList->SecHandoffData.BootHartId = BootHartId; + SecHobList->SecHandoffData.FdtPointer = DeviceTreeAddress; + + TempRamSize -= SEC_HANDOFF_DATA_RESERVE_SIZE; + + #ifdef RISCVVIRT_PEI_BOOTING + SecStartup (TempRamSize, TempRamBase, (VOID *)(UINTN)PcdGet32 (PcdOvmfDxeMemFvBase)); + #else + // Default PEIless booting + SecPEIlessStartup (TempRamSize, TempRamBase, (VOID *)(UINTN)PcdGet32 (PcdOvmfDxeMemFvBase)); + #endif + + // + // Should not come here. + // + UNREACHABLE (); +} + +/** + A developer supplied function to perform platform specific operations. + + It's a developer supplied function to perform any operations appropriate to a + given platform. It's invoked just before passing control to PEI/DXE core by SEC + core. Platform developer may modify the SecCoreData passed to PEI Core. + It returns a platform specific PPI list that platform wishes to pass to PEI core. + The Generic SEC core module will merge this list to join the final list passed to + PEI core. + + @param SecCoreData The same parameter as passing to PEI core. It + could be overridden by this function. + + @return The platform specific PPI list to be passed to PEI core or + NULL if there is no need of such platform specific PPI list. + +**/ +EFI_PEI_PPI_DESCRIPTOR * +EFIAPI +SecPlatformMain ( + IN OUT EFI_SEC_PEI_HAND_OFF *SecCoreData + ) +{ + SEC_HOBLIST_DATA *SecHobList; + const EFI_GUID SecHobDataGuid = RISCV_SEC_HANDOFF_HOB_GUID; + + SecHobList = (SEC_HOBLIST_DATA *)GetSecHobData (); + if (SecCoreData == NULL) { + // + // PEIless booting, initializing platform devices now + // + SetBootMode (BOOT_WITH_FULL_CONFIGURATION); + + MemoryInitialization (SecHobList->SecHandoffData.FdtPointer); + CpuInitialization (SecHobList->SecHandoffData.FdtPointer); + PlatformInitialization (SecHobList->SecHandoffData.FdtPointer); + + // + // Pass Sec Hob data to DXE + // + BuildGuidDataHob (&SecHobDataGuid, &SecHobList->SecHandoffData, sizeof (SecHobList->SecHandoffData)); + + return NULL; + } + + // + // Public our PEI PPI + // + return &mPpiSecHobData; +} + +/** + This interface conveys state information out of the Security (SEC) phase into PEI. + + @param PeiServices Pointer to the PEI Services Table. + @param StructureSize Pointer to the variable describing size of the input buffer. + @param PlatformInformationRecord Pointer to the EFI_SEC_PLATFORM_INFORMATION_RECORD. + + @retval EFI_SUCCESS The data was successfully returned. + @retval EFI_BUFFER_TOO_SMALL The buffer was too small. + +**/ +EFI_STATUS +EFIAPI +SecPlatformInformation ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN OUT UINT64 *StructureSize, + OUT EFI_SEC_PLATFORM_INFORMATION_RECORD *PlatformInformationRecord + ) +{ + // + // Not available for RISC-V + // + return EFI_SUCCESS; +} + +/** + This interface disables temporary memory in SEC Phase. +**/ +VOID +EFIAPI +SecPlatformDisableTemporaryMemory ( + VOID + ) +{ + // + // Not available + // +} + +EFI_STATUS +EFIAPI +RiscVSecGetHobData ( + IN CONST EFI_SEC_HOB_DATA_PPI *This, + OUT EFI_HOB_GENERIC_HEADER **HobList + ) +{ + SEC_HOBLIST_DATA *SecHobList; + const EFI_GUID SecHobDataGuid = RISCV_SEC_HANDOFF_HOB_GUID; + + SecHobList = (SEC_HOBLIST_DATA *)GetSecHobData (); + + SecHobList->HobGuidHeader.Header.HobType = EFI_HOB_TYPE_GUID_EXTENSION; + SecHobList->HobGuidHeader.Header.HobLength = sizeof (SecHobList->HobGuidHeader) + sizeof (SecHobList->SecHandoffData); + SecHobList->HobGuidHeader.Header.Reserved = 0; + CopyGuid (&(SecHobList->HobGuidHeader.Name), &SecHobDataGuid); + + SecHobList->HobEnd.HobType = EFI_HOB_TYPE_END_OF_HOB_LIST; + SecHobList->HobEnd.HobLength = sizeof (SecHobList->HobEnd); + SecHobList->HobEnd.Reserved = 0; + + *HobList = (EFI_HOB_GENERIC_HEADER *)&(SecHobList->HobGuidHeader); + + return EFI_SUCCESS; +} diff --git a/OvmfPkg/RiscVVirt/Library/PlatformSecLib/PlatformSecLib.h b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/PlatformSecLib.h new file mode 100644 index 000000000000..53fa53f1f691 --- /dev/null +++ b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/PlatformSecLib.h @@ -0,0 +1,102 @@ +/** @file + +Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+ +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef PLATFORM_SEC_LIB_ +#define PLATFORM_SEC_LIB_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// Size temporary region to store SEC handoff data for PEI +// +#define SEC_HANDOFF_DATA_RESERVE_SIZE SIZE_4KB + +/** + Entry point to the C language phase of SEC for this platform. After the SEC assembly + code has initialized some temporary memory and set up the stack, + the control is transferred to this function. + + @param BootHartId The hardware thread (Hart) ID of the current CPU. + @param DeviceTreeAddress Address of the device tree provided to the SEC phase. + @param TempRamBase Base address of the temporary memory. + @param TempRamSize Size of the temporary memory region. +**/ +VOID +NORETURN +EFIAPI +SecStartupPlatform ( + IN UINTN BootHartId, + IN VOID *DeviceTreeAddress, + IN UINT32 TempRamBase, + IN UINT32 TempRamSize + ); + +/** + Perform Platform initialization. + + @param FdtPointer The pointer to the device tree. + + @return EFI_SUCCESS The platform initialized successfully. + @retval Others - As the error code indicates + +**/ +EFI_STATUS +EFIAPI +PlatformInitialization ( + VOID *FdtPointer + ); + +/** + Perform Memory initialization. + + @param FdtPointer The pointer to the device tree. + + @return EFI_SUCCESS Memory initialized successfully. + @retval Others - As the error code indicates + +**/ +EFI_STATUS +EFIAPI +MemoryInitialization ( + VOID *FdtPointer + ); + +/** + Perform CPU initialization. + + @param FdtPointer The pointer to the device tree. + + @return EFI_SUCCESS CPU initialized successfully. + @retval Others - As the error code indicates + +**/ +EFI_STATUS +EFIAPI +CpuInitialization ( + VOID *FdtPointer + ); + +#endif /* PLATFORM_SEC_LIB_ */ diff --git a/OvmfPkg/RiscVVirt/Library/PlatformSecLib/PlatformSecLib.inf b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/PlatformSecLib.inf new file mode 100644 index 000000000000..22c71cf21910 --- /dev/null +++ b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/PlatformSecLib.inf @@ -0,0 +1,61 @@ +## @file +# Library functions for PlatformSecLib. +# +# Copyright (c) 2013 - 2015, Intel Corporation. All rights reserved.
+# Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 1.30 + BASE_NAME = PlatformSecLib + FILE_GUID = dddcaa5e-26e4-4922-9bcc-50e1a1bd0aac + MODULE_TYPE = SEC + VERSION_STRING = 1.0 + LIBRARY_CLASS = PlatformSecLib + +[Sources] + Cpu.c + Memory.c + Platform.c + PlatformSecLib.c + SecEntry.S + +[LibraryClasses] + BaseLib + BaseMemoryLib + CpuExceptionHandlerLib + CpuLib + DebugLib + FdtLib + RiscVSbiLib + HobLib + StackCheckLib + PcdLib + PrePiLib + +[Packages] + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + UefiCpuPkg/UefiCpuPkg.dec + OvmfPkg/OvmfPkg.dec + +[Pcd] + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase + gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiACPIReclaimMemory + gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiACPIMemoryNVS + gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiReservedMemoryType + gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData + gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode + +[Ppis] + gEfiSecHobDataPpiGuid + +[Guids] + gFdtHobGuid + gEfiMemoryTypeInformationGuid diff --git a/OvmfPkg/RiscVVirt/Library/PlatformSecLib/SecEntry.S b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/SecEntry.S new file mode 100644 index 000000000000..de42a9026e2e --- /dev/null +++ b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/SecEntry.S @@ -0,0 +1,22 @@ +/* + Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + + */ + +#include "PlatformSecLib.h" + +ASM_FUNC (_ModuleEntryPoint) +/* Use Temp memory as the stack for calling to C code */ +li a2, FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) +li a3, FixedPcdGet32 (PcdOvmfSecPeiTempRamSize) + +/* Reserve region to store handoff data +li a4, SEC_HANDOFF_DATA_RESERVE_SIZE +sub a3, a3, a4 + +/* Use Temp memory as the stack for calling to C code */ +add sp, a2, a3 + +call SecStartupPlatform diff --git a/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc b/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc index 11f26bc6d8be..7d97225ca2c7 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc +++ b/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc @@ -148,7 +148,6 @@ PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf ExtractGuidedSectionLib|MdePkg/Library/BaseExtractGuidedSectionLib/BaseExtractGuidedSectionLib.inf - PlatformSecLib|UefiCpuPkg/Library/PlatformSecLibNull/PlatformSecLibNull.inf HobLib|EmbeddedPkg/Library/PrePiHobLib/PrePiHobLib.inf PrePiHobListPointerLib|OvmfPkg/RiscVVirt/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf MemoryAllocationLib|EmbeddedPkg/Library/PrePiMemoryAllocationLib/PrePiMemoryAllocationLib.inf diff --git a/OvmfPkg/RiscVVirt/RiscVVirt.fdf.inc b/OvmfPkg/RiscVVirt/RiscVVirt.fdf.inc index 6db361ef85fd..186eb74fec2d 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirt.fdf.inc +++ b/OvmfPkg/RiscVVirt/RiscVVirt.fdf.inc @@ -34,5 +34,5 @@ DEFINE VARS_FTW_WORKING_SIZE = 0x00040000 DEFINE VARS_FTW_SPARE_OFFSET = $(VARS_FTW_WORKING_OFFSET) + $(VARS_FTW_WORKING_SIZE) DEFINE VARS_FTW_SPARE_SIZE = 0x00040000 -SET gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase = 0x83FF0000 -SET gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize = 0x00010000 +SET gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase = 0x82000000 +SET gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize = 0x02000000 diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc index b4f24eeed85a..45f6dc01cc67 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc +++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc @@ -92,6 +92,8 @@ !include MdePkg/MdeLibs.dsc.inc [LibraryClasses.common] + PlatformSecLib|OvmfPkg/RiscVVirt/Library/PlatformSecLib/PlatformSecLib.inf + # Virtio Support VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf VirtioMmioDeviceLib|OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceLib.inf @@ -294,10 +296,10 @@ # # SEC Phase modules # - OvmfPkg/RiscVVirt/Sec/SecMain.inf { + UefiCpuPkg/SecCore/SecCoreNative.inf { ExtractGuidedSectionLib|EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.inf - LzmaDecompressLib|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf + NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf PrePiLib|EmbeddedPkg/Library/PrePiLib/PrePiLib.inf HobLib|EmbeddedPkg/Library/PrePiHobLib/PrePiHobLib.inf PrePiHobListPointerLib|OvmfPkg/RiscVVirt/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf b/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf index 77c749d78a8d..ad8d1d65c3cb 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf +++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf @@ -247,7 +247,7 @@ READ_LOCK_CAP = TRUE READ_LOCK_STATUS = TRUE FvNameGuid = 27A72E80-3118-4c0c-8673-AA5B4EFA9613 -INF OvmfPkg/RiscVVirt/Sec/SecMain.inf +INF UefiCpuPkg/SecCore/SecCoreNative.inf FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 { SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE { diff --git a/OvmfPkg/RiscVVirt/Sec/Cpu.c b/OvmfPkg/RiscVVirt/Sec/Cpu.c deleted file mode 100644 index 2c16df697e37..000000000000 --- a/OvmfPkg/RiscVVirt/Sec/Cpu.c +++ /dev/null @@ -1,33 +0,0 @@ -/** @file -The library call to pass the device tree to DXE via HOB. - -Copyright (c) 2021, Hewlett Packard Enterprise Development LP. All rights reserved.
- -SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -// -//// The package level header files this module uses -//// -#include - -#include -#include - -/** - Cpu Peim initialization. - -**/ -EFI_STATUS -CpuPeimInitialization ( - VOID - ) -{ - // - // for MMU type >= sv39 - // - BuildCpuHob (56, 32); - - return EFI_SUCCESS; -} diff --git a/OvmfPkg/RiscVVirt/Sec/SecEntry.S b/OvmfPkg/RiscVVirt/Sec/SecEntry.S deleted file mode 100644 index 192fff321ce5..000000000000 --- a/OvmfPkg/RiscVVirt/Sec/SecEntry.S +++ /dev/null @@ -1,18 +0,0 @@ -/* - Copyright (c) 2022 Ventana Micro Systems Inc. - - SPDX-License-Identifier: BSD-2-Clause-Patent - - */ - -#include "SecMain.h" - -ASM_FUNC (_ModuleEntryPoint) - /* Use Temp memory as the stack for calling to C code */ - li a4, FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) - li a5, FixedPcdGet32 (PcdOvmfSecPeiTempRamSize) - - /* Use Temp memory as the stack for calling to C code */ - add sp, a4, a5 - - call SecStartup diff --git a/OvmfPkg/RiscVVirt/Sec/SecMain.c b/OvmfPkg/RiscVVirt/Sec/SecMain.c deleted file mode 100644 index 6db39b940159..000000000000 --- a/OvmfPkg/RiscVVirt/Sec/SecMain.c +++ /dev/null @@ -1,110 +0,0 @@ -/** @file - RISC-V SEC phase module for Qemu Virt. - - Copyright (c) 2008 - 2023, Intel Corporation. All rights reserved.
- Copyright (c) 2022, Ventana Micro Systems Inc. All rights reserved.
- - SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include "SecMain.h" - -STATIC -EFI_STATUS -EFIAPI -SecInitializePlatform ( - VOID - ) -{ - EFI_STATUS Status; - - MemoryPeimInitialization (); - - CpuPeimInitialization (); - - // Set the Boot Mode - SetBootMode (BOOT_WITH_FULL_CONFIGURATION); - - Status = PlatformPeimInitialization (); - ASSERT_EFI_ERROR (Status); - - return EFI_SUCCESS; -} - -/** - - Entry point to the C language phase of SEC. After the SEC assembly - code has initialized some temporary memory and set up the stack, - the control is transferred to this function. - - - @param[in] BootHartId Hardware thread ID of boot hart. - @param[in] DeviceTreeAddress Pointer to Device Tree (DTB) -**/ -VOID -NORETURN -EFIAPI -SecStartup ( - IN UINTN BootHartId, - IN VOID *DeviceTreeAddress - ) -{ - EFI_HOB_HANDOFF_INFO_TABLE *HobList; - EFI_RISCV_FIRMWARE_CONTEXT FirmwareContext; - EFI_STATUS Status; - UINT64 UefiMemoryBase; - UINT64 StackBase; - UINT32 StackSize; - - SerialPortInitialize (); - - // - // Report Status Code to indicate entering SEC core - // - DEBUG (( - DEBUG_INFO, - "%a() BootHartId: 0x%x, DeviceTreeAddress=0x%x\n", - __func__, - BootHartId, - DeviceTreeAddress - )); - - FirmwareContext.BootHartId = BootHartId; - FirmwareContext.FlattenedDeviceTree = (UINT64)DeviceTreeAddress; - SetFirmwareContextPointer (&FirmwareContext); - - StackBase = (UINT64)FixedPcdGet32 (PcdOvmfSecPeiTempRamBase); - StackSize = FixedPcdGet32 (PcdOvmfSecPeiTempRamSize); - UefiMemoryBase = StackBase + StackSize - SIZE_32MB; - - // Declare the PI/UEFI memory region - HobList = HobConstructor ( - (VOID *)UefiMemoryBase, - SIZE_32MB, - (VOID *)UefiMemoryBase, - (VOID *)StackBase // The top of the UEFI Memory is reserved for the stacks - ); - PrePeiSetHobList (HobList); - - SecInitializePlatform (); - - BuildStackHob (StackBase, StackSize); - - // - // Process all libraries constructor function linked to SecMain. - // - ProcessLibraryConstructorList (); - - // Assume the FV that contains the SEC (our code) also contains a compressed FV. - Status = DecompressFirstFv (); - ASSERT_EFI_ERROR (Status); - - // Load the DXE Core and transfer control to it - Status = LoadDxeCoreFromFv (NULL, 0); - ASSERT_EFI_ERROR (Status); - // - // Should not come here. - // - UNREACHABLE (); -} diff --git a/OvmfPkg/RiscVVirt/Sec/SecMain.h b/OvmfPkg/RiscVVirt/Sec/SecMain.h deleted file mode 100644 index fd7c48f87653..000000000000 --- a/OvmfPkg/RiscVVirt/Sec/SecMain.h +++ /dev/null @@ -1,91 +0,0 @@ -/** @file - Master header file for SecCore. - - Copyright (c) 2022, Ventana Micro Systems Inc. All rights reserved.
- SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#ifndef SEC_MAIN_H_ -#define SEC_MAIN_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/** - Entry point to the C language phase of SEC. After the SEC assembly - code has initialized some temporary memory and set up the stack, - the control is transferred to this function. - - @param SizeOfRam Size of the temporary memory available for use. - @param TempRamBase Base address of temporary ram - @param BootFirmwareVolume Base address of the Boot Firmware Volume. -**/ -VOID -NORETURN -EFIAPI -SecStartup ( - IN UINTN BootHartId, - IN VOID *DeviceTreeAddress - ); - -/** - Perform Platform PEIM initialization. - - @return EFI_SUCCESS The platform initialized successfully. - @retval Others - As the error code indicates - -**/ -EFI_STATUS -EFIAPI -PlatformPeimInitialization ( - VOID - ); - -/** - Perform Memory PEIM initialization. - - @return EFI_SUCCESS The platform initialized successfully. - @retval Others - As the error code indicates - -**/ -EFI_STATUS -EFIAPI -MemoryPeimInitialization ( - VOID - ); - -/** - Perform CPU PEIM initialization. - - @return EFI_SUCCESS The platform initialized successfully. - @retval Others - As the error code indicates - -**/ -EFI_STATUS -EFIAPI -CpuPeimInitialization ( - VOID - ); - -#endif diff --git a/OvmfPkg/RiscVVirt/Sec/SecMain.inf b/OvmfPkg/RiscVVirt/Sec/SecMain.inf deleted file mode 100644 index 5a8cc497219d..000000000000 --- a/OvmfPkg/RiscVVirt/Sec/SecMain.inf +++ /dev/null @@ -1,68 +0,0 @@ -## @file -# SEC Driver for RISC-V -# -# Copyright (c) 2022, Ventana Micro Systems Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -## - -[Defines] - INF_VERSION = 1.30 - BASE_NAME = SecMainRiscV64 - FILE_GUID = 16740C0A-AA84-4F62-A06D-AE328057AE07 - MODULE_TYPE = SEC - VERSION_STRING = 1.0 - ENTRY_POINT = SecMain - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = RISCV64 -# - -[Sources] - SecEntry.S - SecMain.c - SecMain.h - Cpu.c - Memory.c - Platform.c - -[Packages] - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - UefiCpuPkg/UefiCpuPkg.dec - OvmfPkg/OvmfPkg.dec - EmbeddedPkg/EmbeddedPkg.dec - -[LibraryClasses] - BaseLib - DebugLib - PcdLib - IoLib - PeCoffLib - LzmaDecompressLib - RiscVSbiLib - PrePiLib - FdtLib - MemoryAllocationLib - HobLib - SerialPortLib - StackCheckLib - -[Ppis] - gEfiTemporaryRamSupportPpiGuid # PPI ALWAYS_PRODUCED - gEfiTemporaryRamDonePpiGuid ## PRODUCES - -[Pcd] - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFdBaseAddress - -[Guids] - gFdtHobGuid From 07552c31ad8b596e2c7725d2a0a573e47c30d2dc Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Thu, 22 May 2025 16:36:07 -0700 Subject: [PATCH 0255/1172] OvmfPkg/RiscVVirt: PrePiHobListPointerLib: Use scratch register directly With firmware context APIs removed, store HobList pointer directly in the scratch register for Peiless booting. Signed-off-by: Tuan Phan --- .../PrePiHobListPointer.c | 25 ++----------------- .../PrePiHobListPointerLib.inf | 2 +- 2 files changed, 3 insertions(+), 24 deletions(-) diff --git a/OvmfPkg/RiscVVirt/Library/PrePiHobListPointerLib/PrePiHobListPointer.c b/OvmfPkg/RiscVVirt/Library/PrePiHobListPointerLib/PrePiHobListPointer.c index 4035ba8d850a..4aed66e271c8 100644 --- a/OvmfPkg/RiscVVirt/Library/PrePiHobListPointerLib/PrePiHobListPointer.c +++ b/OvmfPkg/RiscVVirt/Library/PrePiHobListPointerLib/PrePiHobListPointer.c @@ -9,7 +9,6 @@ #include #include #include -#include /** Returns the pointer to the HOB list. @@ -25,17 +24,7 @@ PrePeiGetHobList ( VOID ) { - EFI_RISCV_FIRMWARE_CONTEXT *FirmwareContext; - - FirmwareContext = NULL; - GetFirmwareContextPointer (&FirmwareContext); - - if (FirmwareContext == NULL) { - DEBUG ((DEBUG_ERROR, "%a: Firmware Context is NULL\n", __func__)); - return NULL; - } - - return (VOID *)FirmwareContext->PrePiHobList; + return (VOID *)RiscVGetSupervisorScratch (); } /** @@ -50,16 +39,6 @@ PrePeiSetHobList ( IN VOID *HobList ) { - EFI_RISCV_FIRMWARE_CONTEXT *FirmwareContext; - - FirmwareContext = NULL; - GetFirmwareContextPointer (&FirmwareContext); - - if (FirmwareContext == NULL) { - DEBUG ((DEBUG_ERROR, "%a: Firmware Context is NULL\n", __func__)); - return EFI_NOT_READY; - } - - FirmwareContext->PrePiHobList = HobList; + RiscVSetSupervisorScratch ((UINTN)HobList); return EFI_SUCCESS; } diff --git a/OvmfPkg/RiscVVirt/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf b/OvmfPkg/RiscVVirt/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf index c539682e8d0b..ef4dbddfe5b2 100644 --- a/OvmfPkg/RiscVVirt/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf +++ b/OvmfPkg/RiscVVirt/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf @@ -9,7 +9,7 @@ INF_VERSION = 0x0001001B BASE_NAME = PrePiHobListPointerLib FILE_GUID = E3FAFC60-758C-471B-A333-FE704A4C11B4 - MODULE_TYPE = BASE + MODULE_TYPE = SEC VERSION_STRING = 1.0 LIBRARY_CLASS = PrePiHobListPointerLib From 003c8887147a50aad8aa29aec1c554ed432b202e Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Thu, 22 May 2025 16:39:58 -0700 Subject: [PATCH 0256/1172] OvmfPkg/RiscVVirt: Add PlatformPeim module Introduce PEIM module to support platform initialization during the PEI phase. Signed-off-by: Tuan Phan --- OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.c | 147 ++++++++++++++++++ .../RiscVVirt/PlatformPei/PlatformPeim.inf | 41 +++++ 2 files changed, 188 insertions(+) create mode 100644 OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.c create mode 100644 OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.inf diff --git a/OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.c b/OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.c new file mode 100644 index 000000000000..54b5d3361334 --- /dev/null +++ b/OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.c @@ -0,0 +1,147 @@ +/** @file + + Copyright (c) 2011, ARM Limited. All rights reserved.
+ Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +// +// The protocols, PPI and GUID definitions for this module +// +#include +#include +#include +#include +#include + +// +// The Library classes this module consumes +// +#include +#include +#include +#include +#include "../Library/PlatformSecLib/PlatformSecLib.h" + +#define PEI_MEMORY_SIZE SIZE_64MB + +EFI_STATUS +EFIAPI +InitializePlatformPeim ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ); + +// +// Module globals +// +CONST EFI_PEI_PPI_DESCRIPTOR mPpiListBootMode = { + (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), + &gEfiPeiMasterBootModePpiGuid, + NULL +}; + +/* + Install PEI memory. + +*/ +STATIC +VOID +FindInstallPeiMemory ( + VOID + ) +{ + EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob; + VOID *HobList; + EFI_PEI_HOB_POINTERS Hob; + EFI_PHYSICAL_ADDRESS PeiMemoryBase; + + // Get the HOB list from PEI services + HobList = GetHobList (); + ASSERT (HobList != NULL); + + // + // Search the top region + // + PeiMemoryBase = 0; + + // Iterate through the HOB list + Hob.Raw = HobList; + while (!END_OF_HOB_LIST (Hob)) { + if (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) { + ResourceHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)Hob.Raw; + if ( (ResourceHob->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) + && (ResourceHob->PhysicalStart > PeiMemoryBase) + && (ResourceHob->ResourceLength >= PEI_MEMORY_SIZE)) + { + PeiMemoryBase = ResourceHob->PhysicalStart + ResourceHob->ResourceLength - PEI_MEMORY_SIZE; + } + } + + Hob.Raw = GET_NEXT_HOB (Hob); + } + + ASSERT (PeiMemoryBase != 0); + ASSERT_EFI_ERROR (PeiServicesInstallPeiMemory (PeiMemoryBase, PEI_MEMORY_SIZE)); +} + +/* + Entry point of this module. + + @param FileHandle Handle of the file being invoked. + @param PeiServices Pointer to the PEI Services Table. + + @retval EFI_SUCCESS The entry point executes successfully. + @retval Others Some error occurs during the execution of this function. +*/ +EFI_STATUS +EFIAPI +InitializePlatformPeim ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + EFI_STATUS Status; + VOID *Hob; + RISCV_SEC_HANDOFF_DATA *SecData; + EFI_GUID SecHobDataGuid = RISCV_SEC_HANDOFF_HOB_GUID; + + DEBUG ((DEBUG_LOAD | DEBUG_INFO, "Platform PEIM Loaded\n")); + + Status = PeiServicesSetBootMode (BOOT_WITH_FULL_CONFIGURATION); + ASSERT_EFI_ERROR (Status); + + Hob = GetFirstGuidHob (&SecHobDataGuid); + ASSERT (Hob != NULL); + SecData = GET_GUID_HOB_DATA (Hob); + + // + // Do all platform initializations + // + MemoryInitialization (SecData->FdtPointer); + CpuInitialization (SecData->FdtPointer); + PlatformInitialization (SecData->FdtPointer); + + // + // Install PEI memory + // + FindInstallPeiMemory (); + + // + // Reinstall HOB after memory initialization + // + BuildGuidDataHob ( + &SecHobDataGuid, // GUID for the HOB + &SecData, // Pointer to the data + sizeof (SecData) // Size of the data + ); + + Status = PeiServicesInstallPpi (&mPpiListBootMode); + ASSERT_EFI_ERROR (Status); + + return Status; +} diff --git a/OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.inf b/OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.inf new file mode 100644 index 000000000000..9be96dd3de3d --- /dev/null +++ b/OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.inf @@ -0,0 +1,41 @@ +#/** @file +# +# Copyright (c) 2011, ARM Limited. All rights reserved.
+# Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +#**/ + +[Defines] + INF_VERSION = 1.30 + BASE_NAME = PlatformPei + FILE_GUID = 59893180-5a35-46a3-b3d2-fe8ae1d983d4 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + + ENTRY_POINT = InitializePlatformPeim + +[Sources] + PlatformPeim.c + +[Packages] + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + UefiCpuPkg/UefiCpuPkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + PeimEntryPoint + DebugLib + HobLib + PeiServicesLib + PlatformSecLib + +[Ppis] + gEfiPeiMasterBootModePpiGuid # PPI ALWAYS_PRODUCED + gEfiSecHobDataPpiGuid # ALWAYS_CONSUMED + +[Depex] + TRUE From ac20e4398a6022288bb6311ae4b1a9e3c24870c4 Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Wed, 28 May 2025 16:57:05 -0700 Subject: [PATCH 0257/1172] OvmfPkg/RiscVVirt: Add PEI phase booting support Introduce a switch to select between PEI and PEI less booting modes. Signed-off-by: Tuan Phan --- OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc | 23 +++++++++++++++++++++++ OvmfPkg/RiscVVirt/RiscVVirt.fdf.inc | 1 + OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc | 24 +++++++++++++++++++++++- OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf | 23 +++++++++++++++++++++++ 4 files changed, 70 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc b/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc index 7d97225ca2c7..4c3eff7772fc 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc +++ b/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc @@ -26,6 +26,7 @@ !else DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf !endif + PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLibRiscV/PeiServicesTablePointerLib.inf DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf BaseLib|MdePkg/Library/BaseLib/BaseLib.inf @@ -150,8 +151,30 @@ ExtractGuidedSectionLib|MdePkg/Library/BaseExtractGuidedSectionLib/BaseExtractGuidedSectionLib.inf HobLib|EmbeddedPkg/Library/PrePiHobLib/PrePiHobLib.inf PrePiHobListPointerLib|OvmfPkg/RiscVVirt/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf + PrePiLib|EmbeddedPkg/Library/PrePiLib/PrePiLib.inf MemoryAllocationLib|EmbeddedPkg/Library/PrePiMemoryAllocationLib/PrePiMemoryAllocationLib.inf + [LibraryClasses.common.PEI_CORE] + HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf + PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf + MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf + PeiCoreEntryPoint|MdePkg/Library/PeiCoreEntryPoint/PeiCoreEntryPoint.inf + PerformanceLib|MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.inf + ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf + PeiResourcePublicationLib|MdePkg/Library/PeiResourcePublicationLib/PeiResourcePublicationLib.inf + ExtractGuidedSectionLib|MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf + +[LibraryClasses.common.PEIM] + HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf + PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf + PrePiLib|EmbeddedPkg/Library/PrePiLib/PrePiLib.inf + MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf + PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf + PerformanceLib|MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.inf + ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf + PeiResourcePublicationLib|MdePkg/Library/PeiResourcePublicationLib/PeiResourcePublicationLib.inf + ExtractGuidedSectionLib|MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf + [LibraryClasses.common.DXE_CORE] PerformanceLib|MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf diff --git a/OvmfPkg/RiscVVirt/RiscVVirt.fdf.inc b/OvmfPkg/RiscVVirt/RiscVVirt.fdf.inc index 186eb74fec2d..8d30a0062dcf 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirt.fdf.inc +++ b/OvmfPkg/RiscVVirt/RiscVVirt.fdf.inc @@ -34,5 +34,6 @@ DEFINE VARS_FTW_WORKING_SIZE = 0x00040000 DEFINE VARS_FTW_SPARE_OFFSET = $(VARS_FTW_WORKING_OFFSET) + $(VARS_FTW_WORKING_SIZE) DEFINE VARS_FTW_SPARE_SIZE = 0x00040000 +SET gUefiCpuPkgTokenSpaceGuid.PcdPeiTemporaryRamStackSize = 0x10000 SET gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase = 0x82000000 SET gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize = 0x02000000 diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc index 45f6dc01cc67..bc4935ec2b21 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc +++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc @@ -24,6 +24,11 @@ SKUID_IDENTIFIER = DEFAULT FLASH_DEFINITION = OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf + # + # Option to enable PEI booting. + # + DEFINE RISCVVIRT_PEI_BOOTING = FALSE + # # Enable below options may cause build error or may not work on # the initial version of RISC-V package @@ -72,6 +77,9 @@ !endif [BuildOptions] +!if $(RISCVVIRT_PEI_BOOTING) == TRUE + GCC:*_*_*_CC_FLAGS = -DRISCVVIRT_PEI_BOOTING +!endif GCC:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG !ifdef $(SOURCE_DEBUG_ENABLE) GCC:*_*_RISCV64_GENFW_FLAGS = --keepexceptiontable @@ -296,15 +304,29 @@ # # SEC Phase modules # +!if $(RISCVVIRT_PEI_BOOTING) == TRUE + UefiCpuPkg/SecCore/SecCoreNative.inf + OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.inf + MdeModulePkg/Core/Pei/PeiMain.inf + MdeModulePkg/Universal/PCD/Pei/Pcd.inf { + + PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf + } + MdeModulePkg/Universal/Variable/Pei/VariablePei.inf + MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf { + + NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf + } +!else UefiCpuPkg/SecCore/SecCoreNative.inf { ExtractGuidedSectionLib|EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.inf NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf - PrePiLib|EmbeddedPkg/Library/PrePiLib/PrePiLib.inf HobLib|EmbeddedPkg/Library/PrePiHobLib/PrePiHobLib.inf PrePiHobListPointerLib|OvmfPkg/RiscVVirt/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf MemoryAllocationLib|EmbeddedPkg/Library/PrePiMemoryAllocationLib/PrePiMemoryAllocationLib.inf } +!endif # # DXE diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf b/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf index ad8d1d65c3cb..3470b18a2ef5 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf +++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf @@ -249,6 +249,14 @@ FvNameGuid = 27A72E80-3118-4c0c-8673-AA5B4EFA9613 INF UefiCpuPkg/SecCore/SecCoreNative.inf +!if $(RISCVVIRT_PEI_BOOTING) == TRUE + INF OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.inf + INF MdeModulePkg/Core/Pei/PeiMain.inf + INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf + INF MdeModulePkg/Universal/Variable/Pei/VariablePei.inf + INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf +!endif + FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 { SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE { SECTION FV_IMAGE = DXEFV @@ -262,6 +270,21 @@ FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 { VERSION STRING ="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) } +[Rule.Common.PEI_CORE] + FILE PEI_CORE = $(NAMED_GUID) FIXED { + PE32 PE32 Align = Auto $(INF_OUTPUT)/$(MODULE_NAME).efi + UI STRING ="$(MODULE_NAME)" Optional + VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) + } + +[Rule.Common.PEIM] + FILE PEIM = $(NAMED_GUID) FIXED { + PEI_DEPEX PEI_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex + PE32 PE32 Align = Auto $(INF_OUTPUT)/$(MODULE_NAME).efi + UI STRING="$(MODULE_NAME)" Optional + VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) + } + [Rule.Common.DXE_CORE] FILE DXE_CORE = $(NAMED_GUID) { PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi From bdca3681e90b924bfa89b378c2687eef4e22db91 Mon Sep 17 00:00:00 2001 From: Stanislaw Grams Date: Tue, 15 Jul 2025 16:31:32 +0200 Subject: [PATCH 0258/1172] Maintainers.txt: Update reviewer for OvmfPkg/Confidential Computing Stanislaw Grams replaces Min Xu as the reviewer for patches to OvmfPkg/Confidential Computing Signed-off-by: Stanislaw Grams --- Maintainers.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maintainers.txt b/Maintainers.txt index 93910396fa73..579a70ba9872 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -514,7 +514,7 @@ F: OvmfPkg/ResetVector/ F: OvmfPkg/Sec/ R: Erdem Aktas [ruleof2] R: Jiewen Yao [jyao1] -R: Min Xu [mxu9] +R: Stanislaw Grams [sgrams] R: Tom Lendacky [tlendacky] R: Michael Roth [mdroth] From a72e6fe7ab07e002f087b88caf776b3d73b5048a Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 4 Jun 2025 12:32:05 +0200 Subject: [PATCH 0259/1172] UefiCpuPkg/AmdSvsmLib: add AmdSvsmQueryProtocol AmdSvsmQueryProtocol() is a helper function for QUERY_PROTOCOL calls of the core svsm protocol. Signed-off-by: Gerd Hoffmann --- UefiCpuPkg/Include/Library/AmdSvsmLib.h | 9 +++++++++ UefiCpuPkg/Library/AmdSvsmLibNull/AmdSvsmLibNull.c | 12 ++++++++++++ 2 files changed, 21 insertions(+) diff --git a/UefiCpuPkg/Include/Library/AmdSvsmLib.h b/UefiCpuPkg/Include/Library/AmdSvsmLib.h index 693b79bda5d8..b84c0bb21367 100644 --- a/UefiCpuPkg/Include/Library/AmdSvsmLib.h +++ b/UefiCpuPkg/Include/Library/AmdSvsmLib.h @@ -139,4 +139,13 @@ AmdSvsmVtpmCmd ( IN OUT UINT8 *Buffer ); +BOOLEAN +EFIAPI +AmdSvsmQueryProtocol ( + IN UINT32 ProtocolId, + IN UINT32 ProtocolVersion, + OUT UINT32 *ProtocolMin, + OUT UINT32 *ProtocolMax + ); + #endif diff --git a/UefiCpuPkg/Library/AmdSvsmLibNull/AmdSvsmLibNull.c b/UefiCpuPkg/Library/AmdSvsmLibNull/AmdSvsmLibNull.c index fc6871c7b274..990d6407cd43 100644 --- a/UefiCpuPkg/Library/AmdSvsmLibNull/AmdSvsmLibNull.c +++ b/UefiCpuPkg/Library/AmdSvsmLibNull/AmdSvsmLibNull.c @@ -153,3 +153,15 @@ AmdSvsmVtpmCmd ( { return FALSE; } + +BOOLEAN +EFIAPI +AmdSvsmQueryProtocol ( + IN UINT32 ProtocolId, + IN UINT32 ProtocolVersion, + OUT UINT32 *ProtocolMin, + OUT UINT32 *ProtocolMax + ) +{ + return FALSE; +} From 29477c2045ec90e12231421489427e2ac1ee69ee Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 4 Jun 2025 12:32:48 +0200 Subject: [PATCH 0260/1172] OvmfPkg/AmdSvsmLib: add AmdSvsmQueryProtocol AmdSvsmQueryProtocol() is a helper function for QUERY_PROTOCOL calls of the core svsm protocol. Signed-off-by: Gerd Hoffmann --- OvmfPkg/Library/AmdSvsmLib/AmdSvsmLib.c | 47 +++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/OvmfPkg/Library/AmdSvsmLib/AmdSvsmLib.c b/OvmfPkg/Library/AmdSvsmLib/AmdSvsmLib.c index e286ac0bc031..6a92ffcf6738 100644 --- a/OvmfPkg/Library/AmdSvsmLib/AmdSvsmLib.c +++ b/OvmfPkg/Library/AmdSvsmLib/AmdSvsmLib.c @@ -593,3 +593,50 @@ AmdSvsmVtpmCmd ( return (Ret == 0) ? TRUE : FALSE; } + +BOOLEAN +EFIAPI +AmdSvsmQueryProtocol ( + IN UINT32 ProtocolId, + IN UINT32 ProtocolVersion, + OUT UINT32 *ProtocolMin, + OUT UINT32 *ProtocolMax + ) +{ + SVSM_CALL_DATA SvsmCallData; + SVSM_FUNCTION Function; + UINT64 Rcx; + UINTN Ret; + + if (!AmdSvsmIsSvsmPresent ()) { + return FALSE; + } + + Function.Id.Protocol = SVSM_PROTOCOL_CORE; + Function.Id.CallId = SVSM_CORE_QUERY_PROTOCOL; + + Rcx = ((UINT64)ProtocolId << 32) | ProtocolVersion; + + SvsmCallData.Caa = (SVSM_CAA *)AmdSvsmSnpGetCaa (); + SvsmCallData.RaxIn = Function.Uint64; + SvsmCallData.RcxIn = Rcx; + + Ret = SvsmMsrProtocol (&SvsmCallData); + if (Ret != 0) { + return FALSE; + } + + if (SvsmCallData.RcxOut == 0) { + return FALSE; + } + + if (ProtocolMin) { + *ProtocolMin = (UINT32)(SvsmCallData.RcxOut & 0xffffffff); + } + + if (ProtocolMax) { + *ProtocolMax = (UINT32)(SvsmCallData.RcxOut >> 32); + } + + return TRUE; +} From 36b63e9fc87e4494067fb2cfa702449cfbb55b86 Mon Sep 17 00:00:00 2001 From: Ray Ni Date: Mon, 14 Jul 2025 15:48:15 +0800 Subject: [PATCH 0261/1172] IntelFsp2Pkg/FspCommonLib: Remove unused API SetFspCoreStackPointer() Signed-off-by: Ray Ni Cc: Chasel Chiu Cc: Nate DeSimone Cc: Star Zeng Cc: Ted Kuo Cc: Ashraf Ali S --- IntelFsp2Pkg/Include/Library/FspCommonLib.h | 14 +------- .../Library/BaseFspCommonLib/FspCommonLib.c | 33 +------------------ 2 files changed, 2 insertions(+), 45 deletions(-) diff --git a/IntelFsp2Pkg/Include/Library/FspCommonLib.h b/IntelFsp2Pkg/Include/Library/FspCommonLib.h index 12d993b7cc47..d5bbaa69dd86 100644 --- a/IntelFsp2Pkg/Include/Library/FspCommonLib.h +++ b/IntelFsp2Pkg/Include/Library/FspCommonLib.h @@ -1,6 +1,6 @@ /** @file - Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.
+ Copyright (c) 2014 - 2025, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -90,18 +90,6 @@ SetFspApiReturnStatus ( IN UINTN ReturnStatus ); -/** - This function sets the context switching stack to a new stack frame. - - @param[in] NewStackTop New core stack to be set. - -**/ -VOID -EFIAPI -SetFspCoreStackPointer ( - IN VOID *NewStackTop - ); - /** This function sets the platform specific data pointer. diff --git a/IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c b/IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c index 663f9b3c0ad9..f1b1a5ea5848 100644 --- a/IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c +++ b/IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c @@ -1,6 +1,6 @@ /** @file - Copyright (c) 2014 - 2022, Intel Corporation. All rights reserved.
+ Copyright (c) 2014 - 2025, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -167,37 +167,6 @@ SetFspApiReturnStatus ( *(UINTN *)(FspData->CoreStack + CONTEXT_STACK_OFFSET (Registers[7])) = ReturnStatus; } -/** - This function sets the context switching stack to a new stack frame. - - @param[in] NewStackTop New core stack to be set. - -**/ -VOID -EFIAPI -SetFspCoreStackPointer ( - IN VOID *NewStackTop - ) -{ - FSP_GLOBAL_DATA *FspData; - UINTN *OldStack; - UINTN *NewStack; - UINT32 StackContextLen; - - FspData = GetFspGlobalDataPointer (); - StackContextLen = sizeof (CONTEXT_STACK) / sizeof (UINTN); - - // - // Reserve space for the ContinuationFunc two parameters - // - OldStack = (UINTN *)FspData->CoreStack; - NewStack = (UINTN *)NewStackTop - StackContextLen - 2; - FspData->CoreStack = (UINTN)NewStack; - while (StackContextLen-- != 0) { - *NewStack++ = *OldStack++; - } -} - /** This function sets the platform specific data pointer. From 83794b8e968e0928aec5333b66d094d0ae289770 Mon Sep 17 00:00:00 2001 From: Ray Ni Date: Tue, 15 Jul 2025 15:43:07 +0800 Subject: [PATCH 0262/1172] IntelFsp2Pkg/FspMultiPhaseLib: Remove EFIAPI for local function FspMultiPhaseWorker() is a local function that's called from FspMultiPhaseMemInitApiHandler() and FspMultiPhaseSiInitApiHandlerV2(). Remove "EFIAPI" from its function header. Signed-off-by: Ray Ni Cc: Chasel Chiu Cc: Nate DeSimone Cc: Star Zeng Cc: Ted Kuo Cc: Ashraf Ali S --- IntelFsp2Pkg/Library/BaseFspMultiPhaseLib/FspMultiPhaseLib.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/IntelFsp2Pkg/Library/BaseFspMultiPhaseLib/FspMultiPhaseLib.c b/IntelFsp2Pkg/Library/BaseFspMultiPhaseLib/FspMultiPhaseLib.c index 3786da91b1b8..10d5d2f91852 100644 --- a/IntelFsp2Pkg/Library/BaseFspMultiPhaseLib/FspMultiPhaseLib.c +++ b/IntelFsp2Pkg/Library/BaseFspMultiPhaseLib/FspMultiPhaseLib.c @@ -1,7 +1,7 @@ /** @file FSP MultiPhase library. - Copyright (c) 2022, Intel Corporation. All rights reserved.
+ Copyright (c) 2022 - 2025, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -58,7 +58,6 @@ FspVariableRequestSwitchStack ( @retval EFI_DEVICE_ERROR FSP initialization failed. **/ EFI_STATUS -EFIAPI FspMultiPhaseWorker ( IN UINT32 ApiIdx, IN VOID *ApiParam From 1f462def90617b3823fb5dd222b003e5529b9940 Mon Sep 17 00:00:00 2001 From: Aaron Li Date: Mon, 14 Jul 2025 09:48:05 +0800 Subject: [PATCH 0263/1172] PrmPkg: Fix debug log format specifier for PhysicalAddress The debug print incorrectly uses "%016x" to print a UINT64 PhysicalAddress. This can cause truncation since "%x" expects UINT32. Update the format specifier to "%016llx" to properly handle UINT64 values and ensure correct output across all architectures. Signed-off-by: Aaron Li --- PrmPkg/Application/PrmInfo/PrmInfoStrings.uni | 6 +++--- PrmPkg/PrmConfigDxe/PrmConfigDxe.c | 6 +++--- PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/PrmPkg/Application/PrmInfo/PrmInfoStrings.uni b/PrmPkg/Application/PrmInfo/PrmInfoStrings.uni index 756cf97c7c37..1ca7f69b3104 100644 --- a/PrmPkg/Application/PrmInfo/PrmInfoStrings.uni +++ b/PrmPkg/Application/PrmInfo/PrmInfoStrings.uni @@ -29,7 +29,7 @@ #string STR_PRMINFO_HANDLER_GUID #language en-US " Handler GUID: %g\r\n" #string STR_PRMINFO_HANDLER_NAME #language en-US " Handler Name: %a\r\n" #string STR_PRMINFO_HANDLER_NAME_HL #language en-US " Handler Name: %H%a%N\r\n" -#string STR_PRMINFO_HANDLER_PA #language en-US " Handler Physical Address: 0x%016x\r\n" +#string STR_PRMINFO_HANDLER_PA #language en-US " Handler Physical Address: 0x%016llx\r\n" #string STR_PRMINFO_HANDLER_ERR_STATUS #language en-US " Return Status: %E%r%N\r\n" #string STR_PRMINFO_HANDLER_SUCC_STATUS #language en-US " Return Status: %V%r%N\r\n" #string STR_PRMINFO_HANDLERS_FOUND #language en-US " %d PRM handlers found.\r\n" @@ -42,8 +42,8 @@ #string STR_PRMINFO_NO_MMIO_RANGES #language en-US " No runtime MMIO ranges used by this module.\r\n" #string STR_PRMINFO_NO_STATIC_BUFFER #language en-US " This handler does not define a static data buffer.\r\n\r\n" #string STR_PRMINFO_RUNTIME_MMIO_COUNT #language en-US " Runtime MMIO Range Count: %d\r\n" -#string STR_PRMINFO_RUNTIME_MMIO_INFO #language en-US " [%d]: Physical Base Address = 0x%016x\r\n Virtual Base Address = 0x%016x\r\n Length = 0x%x\r\n" -#string STR_PRMINFO_STATIC_DATA_BUFFER #language en-US " Static Data Buffer: 0x%016x\r\n" +#string STR_PRMINFO_RUNTIME_MMIO_INFO #language en-US " [%d]: Physical Base Address = 0x%016llx\r\n Virtual Base Address = 0x%016llx\r\n Length = 0x%x\r\n" +#string STR_PRMINFO_STATIC_DATA_BUFFER #language en-US " Static Data Buffer: 0x%016llx\r\n" #string STR_PRMINFO_UNKNOWN #language en-US "Unknown" #string STR_PRMINFO_USECS #language en-US "%H%ld.%ld microseconds%N" #string STR_PRMINFO_NANO_SECS #language en-US "%H%ld nanoseconds%N" diff --git a/PrmPkg/PrmConfigDxe/PrmConfigDxe.c b/PrmPkg/PrmConfigDxe/PrmConfigDxe.c index f919435eaa45..f36745415d83 100644 --- a/PrmPkg/PrmConfigDxe/PrmConfigDxe.c +++ b/PrmPkg/PrmConfigDxe/PrmConfigDxe.c @@ -87,7 +87,7 @@ SetRuntimeMemoryRangeAttributes ( )); DEBUG (( DEBUG_INFO, - " %a %a: Physical address = 0x%016x. Length = 0x%x.\n", + " %a %a: Physical address = 0x%016llx. Length = 0x%x.\n", _DBGMSGID_, __func__, RuntimeMmioRanges->Range[Index].PhysicalBaseAddress, @@ -144,7 +144,7 @@ SetRuntimeMemoryRangeAttributes ( if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, - " %a %a: Error [%r] finding descriptor for runtime memory range 0x%016x.\n", + " %a %a: Error [%r] finding descriptor for runtime memory range 0x%016llx.\n", _DBGMSGID_, __func__, Status, @@ -171,7 +171,7 @@ SetRuntimeMemoryRangeAttributes ( if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, - " %a %a: Error [%r] setting descriptor for runtime memory range 0x%016x.\n", + " %a %a: Error [%r] setting descriptor for runtime memory range 0x%016llx.\n", _DBGMSGID_, __func__, Status, diff --git a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c index 477c24c8b8ff..2e576cd73a5d 100644 --- a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c +++ b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c @@ -210,7 +210,7 @@ ProcessPrmModules ( CurrentHandlerInfoStruct->PhysicalAddress = HandlerPhysicalAddress; DEBUG (( DEBUG_INFO, - " %a %a: Found %a handler physical address at 0x%016x.\n", + " %a %a: Found %a handler physical address at 0x%016llx.\n", _DBGMSGID_, __func__, CurrentExportDescriptorHandlerName, From 4cb3e8d46721c7d3410cc347e3262a64421e913c Mon Sep 17 00:00:00 2001 From: "Ivan A. Melnikov" Date: Wed, 16 Jul 2025 11:22:53 +0400 Subject: [PATCH 0264/1172] OvmfPkg/LoongArchVirt: Add SATA support SATA CD-ROMS are still conventionally used in many virtual environments, so it's nice to support them out of the box. Tested with QEMU 9.2.3 with the following controller and drive: qemu-system-loongarch64 -M virt [...] \ -device ahci,id=ahci0,multifunction=on,bus=pcie.0,addr=0x7 \ -drive if=none,id=drive-sata2,media=cdrom,format=raw,aio=threads,file=/path/to/bootable.iso \ -device ide-cd,bus=ahci0.2,drive=drive-sata2,id=sata2,bootindex=102 Signed-off-by: Ivan A. Melnikov --- OvmfPkg/LoongArchVirt/LoongArchVirtQemu.dsc | 10 ++++++++-- OvmfPkg/LoongArchVirt/LoongArchVirtQemu.fdf | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/OvmfPkg/LoongArchVirt/LoongArchVirtQemu.dsc b/OvmfPkg/LoongArchVirt/LoongArchVirtQemu.dsc index df6a6e19571d..b4418f765c88 100644 --- a/OvmfPkg/LoongArchVirt/LoongArchVirtQemu.dsc +++ b/OvmfPkg/LoongArchVirt/LoongArchVirtQemu.dsc @@ -584,12 +584,18 @@ OvmfPkg/VirtioNetDxe/VirtioNet.inf # - # IDE/SCSI + # SCSI # - MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf + # + # SATA + # + MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf + MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf + MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf + # # NVME Driver # diff --git a/OvmfPkg/LoongArchVirt/LoongArchVirtQemu.fdf b/OvmfPkg/LoongArchVirt/LoongArchVirtQemu.fdf index ac197ade80f7..f612b99944b2 100644 --- a/OvmfPkg/LoongArchVirt/LoongArchVirtQemu.fdf +++ b/OvmfPkg/LoongArchVirt/LoongArchVirtQemu.fdf @@ -111,12 +111,18 @@ INF OvmfPkg/VirtioGpuDxe/VirtioGpu.inf INF OvmfPkg/PlatformDxe/Platform.inf # -# SATA/SCSI +# SCSI # -INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf +# +# SATA +# +INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf +INF MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf +INF MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf + # # NVME # From cb85c4deefea9f893c511c54c1911cc84d816a57 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Mon, 12 May 2025 16:33:13 -0700 Subject: [PATCH 0265/1172] MdeModulePkg: FvSimpleFileSystemDxe cumulative codeql issues. Running Codeql on MdeModulePkg/Universal/FvSimpleFileSystemDxe drivers results in codeql errors stemming from missing null tests. Signed-off-by: Aaron Pop Co-authored-by: Michael Kubacki Co-authored-by: Taylor Beebe Co-authored-by: pohanch <125842322+pohanch@users.noreply.github.com> Co-authored-by: kenlautner <85201046+kenlautner@users.noreply.github.com> Co-authored-by: Oliver Smith-Denny Co-authored-by: Sean Brogan Co-authored-by: Aaron --- .../Universal/FvSimpleFileSystemDxe/FvSimpleFileSystem.c | 4 ++++ .../FvSimpleFileSystemDxe/FvSimpleFileSystemEntryPoint.c | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystem.c b/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystem.c index 0252db19ade9..42ab3f16ecba 100644 --- a/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystem.c +++ b/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystem.c @@ -562,6 +562,10 @@ FvSimpleFileSystemOpen ( // NewFileNameLength = FileNameLength + 1 + 4 = (Number of non-null character) + (file extension) + (a null character) NewFileNameLength = FileNameLength + 1 + 4; FileNameWithExtension = AllocatePool (NewFileNameLength * 2); + if (FileNameWithExtension == NULL) { + return EFI_OUT_OF_RESOURCES; + } + StrCpyS (FileNameWithExtension, NewFileNameLength, FileName); StrCatS (FileNameWithExtension, NewFileNameLength, L".EFI"); diff --git a/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemEntryPoint.c b/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemEntryPoint.c index 3f96407dc755..5d7fdaa2ff7f 100644 --- a/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemEntryPoint.c +++ b/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemEntryPoint.c @@ -450,7 +450,10 @@ FvSimpleFileSystemDriverStart ( // Create an instance // Instance = AllocateZeroPool (sizeof (FV_FILESYSTEM_INSTANCE)); - ASSERT (Instance != NULL); + if (Instance == NULL) { + ASSERT (Instance != NULL); + return EFI_OUT_OF_RESOURCES; + } Instance->Root = NULL; Instance->FvProtocol = FvProtocol; From fdda38a96e8204d49f20d0a6f2af433658700927 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 7 Apr 2025 12:02:31 +0200 Subject: [PATCH 0266/1172] CryptoPkg/openssl: update submodule to openssl-3.5.1 release Signed-off-by: Gerd Hoffmann --- CryptoPkg/Library/OpensslLib/openssl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CryptoPkg/Library/OpensslLib/openssl b/CryptoPkg/Library/OpensslLib/openssl index a26d85337dbd..aea7aaf2abb0 160000 --- a/CryptoPkg/Library/OpensslLib/openssl +++ b/CryptoPkg/Library/OpensslLib/openssl @@ -1 +1 @@ -Subproject commit a26d85337dbdcd33c971f38eb3fa5150e75cea87 +Subproject commit aea7aaf2abb04789f5868cbabec406ea43aa84bf From 565323e29de04e05c838b608196ad3958b0999af Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 7 Apr 2025 12:06:45 +0200 Subject: [PATCH 0267/1172] CryptoPkg/openssl: update generated files Signed-off-by: Gerd Hoffmann --- .../AARCH64-GCC/crypto/aes/aesv8-armx.S | 6 +- .../AARCH64-GCC/crypto/aes/bsaes-armv8.S | 26 +- .../AARCH64-GCC/crypto/aes/vpaes-armv8.S | 53 +- .../AARCH64-GCC/crypto/bn/armv8-mont.S | 1 + .../crypto/ec/ecp_nistz256-armv8.S | 100 +- .../AARCH64-GCC/crypto/md5/md5-aarch64.S | 128 +- .../crypto/modes/aes-gcm-armv8_64.S | 1 + .../AARCH64-GCC/crypto/modes/ghashv8-armx.S | 1 + .../AARCH64-GCC/crypto/sha/keccak1600-armv8.S | 10 +- .../AARCH64-GCC/crypto/sha/sha1-armv8.S | 6 +- .../AARCH64-GCC/crypto/sha/sha256-armv8.S | 15 +- .../AARCH64-GCC/crypto/sha/sha512-armv8.S | 12 +- .../AARCH64-GCC/crypto/sm3/sm3-armv8.S | 15 +- .../OpensslGen/IA32-GCC/crypto/aes/aes-586.S | 2 +- .../IA32-GCC/crypto/aes/aesni-x86.S | 2 +- .../OpensslGen/IA32-GCC/crypto/bn/bn-586.S | 2 +- .../OpensslGen/IA32-GCC/crypto/bn/x86-gf2m.S | 2 +- .../OpensslGen/IA32-GCC/crypto/bn/x86-mont.S | 2 +- .../IA32-GCC/crypto/ec/ecp_nistz256-x86.S | 2 +- .../OpensslGen/IA32-GCC/crypto/sha/sha1-586.S | 2 +- .../IA32-GCC/crypto/sha/sha256-586.S | 2 +- .../IA32-GCC/crypto/sha/sha512-586.S | 2 +- .../OpensslGen/IA32-GCC/crypto/x86cpuid.S | 21 +- .../IA32-MSFT/crypto/aes/aes-586.nasm | 2 +- .../IA32-MSFT/crypto/aes/aesni-x86.nasm | 2 +- .../IA32-MSFT/crypto/bn/bn-586.nasm | 2 +- .../IA32-MSFT/crypto/bn/x86-gf2m.nasm | 2 +- .../IA32-MSFT/crypto/bn/x86-mont.nasm | 2 +- .../IA32-MSFT/crypto/ec/ecp_nistz256-x86.nasm | 2 +- .../IA32-MSFT/crypto/sha/sha1-586.nasm | 2 +- .../IA32-MSFT/crypto/sha/sha256-586.nasm | 2 +- .../IA32-MSFT/crypto/sha/sha512-586.nasm | 2 +- .../OpensslGen/IA32-MSFT/crypto/x86cpuid.nasm | 21 +- .../X64-GCC/crypto/aes/aesni-xts-avx512.s | 8145 ++++++++++++++++ .../X64-GCC/crypto/bn/rsaz-2k-avxifma.s | 1167 +++ .../X64-GCC/crypto/bn/rsaz-3k-avxifma.s | 1768 ++++ .../X64-GCC/crypto/bn/rsaz-4k-avxifma.s | 1922 ++++ .../X64-GCC/crypto/md5/md5-x86_64.s | 32 +- .../OpensslGen/X64-GCC/crypto/x86_64cpuid.s | 30 +- .../X64-MSFT/crypto/aes/aesni-xts-avx512.nasm | 8350 +++++++++++++++++ .../X64-MSFT/crypto/bn/rsaz-2k-avxifma.nasm | 1276 +++ .../X64-MSFT/crypto/bn/rsaz-3k-avxifma.nasm | 1927 ++++ .../X64-MSFT/crypto/bn/rsaz-4k-avxifma.nasm | 2081 ++++ .../X64-MSFT/crypto/md5/md5-x86_64.nasm | 32 +- .../X64-MSFT/crypto/x86_64cpuid.nasm | 30 +- .../OpensslLib/OpensslGen/crypto/params_idx.c | 151 +- .../OpensslGen/include/internal/param_names.h | 607 +- .../OpensslGen/include/openssl/asn1.h | 31 +- .../OpensslGen/include/openssl/bio.h | 47 +- .../OpensslGen/include/openssl/cms.h | 5 +- .../include/openssl/configuration-ec.h | 21 + .../include/openssl/configuration-noec.h | 21 + .../OpensslGen/include/openssl/core_names.h | 32 +- .../OpensslGen/include/openssl/crmf.h | 30 +- .../OpensslGen/include/openssl/crypto.h | 3 + .../OpensslGen/include/openssl/opensslv.h | 10 +- .../OpensslGen/include/openssl/ssl.h | 63 +- .../OpensslGen/include/openssl/x509_acert.h | 31 + .../OpensslGen/include/openssl/x509_vfy.h | 3 +- .../OpensslGen/include/openssl/x509v3.h | 480 +- .../providers/common/der/der_ml_dsa_gen.c | 37 + .../providers/common/der/der_slh_dsa_gen.c | 100 + .../common/include/prov/der_ml_dsa.h | 40 + .../common/include/prov/der_slh_dsa.h | 103 + CryptoPkg/Library/OpensslLib/OpensslLib.inf | 15 +- .../Library/OpensslLib/OpensslLibAccel.inf | 47 +- .../Library/OpensslLib/OpensslLibCrypto.inf | 12 + .../Library/OpensslLib/OpensslLibFull.inf | 15 +- .../OpensslLib/OpensslLibFullAccel.inf | 47 +- 69 files changed, 28600 insertions(+), 563 deletions(-) create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/aes/aesni-xts-avx512.s create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-2k-avxifma.s create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-3k-avxifma.s create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-4k-avxifma.s create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/aes/aesni-xts-avx512.nasm create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-2k-avxifma.nasm create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-3k-avxifma.nasm create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-4k-avxifma.nasm create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/der/der_ml_dsa_gen.c create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/der/der_slh_dsa_gen.c create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/include/prov/der_ml_dsa.h create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/include/prov/der_slh_dsa.h diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/aesv8-armx.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/aesv8-armx.S index 96a66379e1e7..31c750f87552 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/aesv8-armx.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/aesv8-armx.S @@ -3,12 +3,13 @@ #if __ARM_MAX_ARCH__>=7 .arch armv8-a+crypto .text +.section .rodata .align 5 .Lrcon: .long 0x01,0x01,0x01,0x01 .long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d // rotate-n-splat .long 0x1b,0x1b,0x1b,0x1b - +.previous .globl aes_v8_set_encrypt_key .type aes_v8_set_encrypt_key,%function .align 5 @@ -31,7 +32,8 @@ aes_v8_set_encrypt_key: tst w1,#0x3f b.ne .Lenc_key_abort - adr x3,.Lrcon + adrp x3,.Lrcon + add x3,x3,#:lo12:.Lrcon cmp w1,#192 eor v0.16b,v0.16b,v0.16b diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/bsaes-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/bsaes-armv8.S index 8a8668262a73..bb05512c17ed 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/bsaes-armv8.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/bsaes-armv8.S @@ -1,4 +1,4 @@ -// Copyright 2021-2024 The OpenSSL Project Authors. All Rights Reserved. +// Copyright 2021-2025 The OpenSSL Project Authors. All Rights Reserved. // // Licensed under the OpenSSL license (the "License"). You may not use // this file except in compliance with the License. You can obtain a copy @@ -44,7 +44,8 @@ // other SIMD registers corrupted _bsaes_decrypt8: ldr q8, [x9], #16 - adr x11, .LM0ISR + adrp x11, .LM0ISR + add x11, x11, #:lo12:.LM0ISR movi v9.16b, #0x55 ldr q10, [x11], #16 movi v16.16b, #0x33 @@ -460,9 +461,10 @@ _bsaes_decrypt8: ret .size _bsaes_decrypt8,.-_bsaes_decrypt8 -.type _bsaes_const,%object +.section .rodata +.type _bsaes_consts,%object .align 6 -_bsaes_const: +_bsaes_consts: // InvShiftRows constants // Used in _bsaes_decrypt8, which assumes contiguity // .LM0ISR used with round 0 key @@ -498,7 +500,9 @@ _bsaes_const: .quad 0x090d01050c000408, 0x03070b0f060a0e02 .align 6 -.size _bsaes_const,.-_bsaes_const +.size _bsaes_consts,.-_bsaes_consts + +.previous .type _bsaes_encrypt8,%function .align 4 @@ -514,7 +518,8 @@ _bsaes_const: // other SIMD registers corrupted _bsaes_encrypt8: ldr q8, [x9], #16 - adr x11, .LM0SR + adrp x11, .LM0SR + add x11, x11, #:lo12:.LM0SR ldr q9, [x11], #16 _bsaes_encrypt8_alt: eor v0.16b, v0.16b, v8.16b @@ -918,9 +923,11 @@ _bsaes_encrypt8_alt: // other SIMD registers corrupted _bsaes_key_convert: #ifdef __AARCH64EL__ - adr x11, .LM0_littleendian + adrp x11, .LM0_littleendian + add x11, x11, #:lo12:.LM0_littleendian #else - adr x11, .LM0_bigendian + adrp x11, .LM0_bigendian + add x11, x11, #:lo12:.LM0_bigendian #endif ldr q0, [x9], #16 // load round 0 key ldr q1, [x11] // .LM0 @@ -964,7 +971,8 @@ _bsaes_key_convert: // don't save last round key #ifdef __AARCH64EL__ rev32 v15.16b, v15.16b - adr x11, .LM0_bigendian + adrp x11, .LM0_bigendian + add x11, x11, #:lo12:.LM0_bigendian #endif ret .size _bsaes_key_convert,.-_bsaes_key_convert diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/vpaes-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/vpaes-armv8.S index 9aef5acd861b..e78961d334d0 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/vpaes-armv8.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/vpaes-armv8.S @@ -1,6 +1,6 @@ #include "arm_arch.h" -.text +.section .rodata .type _vpaes_consts,%object .align 7 // totally strategic alignment @@ -92,6 +92,9 @@ _vpaes_consts: .align 2 .size _vpaes_consts,.-_vpaes_consts .align 6 + +.text + // // _aes_preheat // @@ -101,7 +104,8 @@ _vpaes_consts: .type _vpaes_encrypt_preheat,%function .align 4 _vpaes_encrypt_preheat: - adr x10, .Lk_inv + adrp x10, .Lk_inv + add x10, x10, #:lo12:.Lk_inv movi v17.16b, #0x0f ld1 {v18.2d,v19.2d}, [x10],#32 // .Lk_inv ld1 {v20.2d,v21.2d,v22.2d,v23.2d}, [x10],#64 // .Lk_ipt, .Lk_sbo @@ -129,7 +133,8 @@ _vpaes_encrypt_preheat: _vpaes_encrypt_core: mov x9, x2 ldr w8, [x2,#240] // pull rounds - adr x11, .Lk_mc_forward+16 + adrp x11, .Lk_mc_forward+16 + add x11, x11, #:lo12:.Lk_mc_forward+16 // vmovdqa .Lk_ipt(%rip), %xmm2 # iptlo ld1 {v16.2d}, [x9], #16 // vmovdqu (%r9), %xmm5 # round0 key and v1.16b, v7.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 @@ -216,7 +221,8 @@ vpaes_encrypt: _vpaes_encrypt_2x: mov x9, x2 ldr w8, [x2,#240] // pull rounds - adr x11, .Lk_mc_forward+16 + adrp x11, .Lk_mc_forward+16 + add x11, x11, #:lo12:.Lk_mc_forward+16 // vmovdqa .Lk_ipt(%rip), %xmm2 # iptlo ld1 {v16.2d}, [x9], #16 // vmovdqu (%r9), %xmm5 # round0 key and v1.16b, v14.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 @@ -319,9 +325,11 @@ _vpaes_encrypt_2x: .type _vpaes_decrypt_preheat,%function .align 4 _vpaes_decrypt_preheat: - adr x10, .Lk_inv + adrp x10, .Lk_inv + add x10, x10, #:lo12:.Lk_inv movi v17.16b, #0x0f - adr x11, .Lk_dipt + adrp x11, .Lk_dipt + add x11, x11, #:lo12:.Lk_dipt ld1 {v18.2d,v19.2d}, [x10],#32 // .Lk_inv ld1 {v20.2d,v21.2d,v22.2d,v23.2d}, [x11],#64 // .Lk_dipt, .Lk_dsbo ld1 {v24.2d,v25.2d,v26.2d,v27.2d}, [x11],#64 // .Lk_dsb9, .Lk_dsbd @@ -343,10 +351,12 @@ _vpaes_decrypt_core: // vmovdqa .Lk_dipt(%rip), %xmm2 # iptlo lsl x11, x8, #4 // mov %rax, %r11; shl $4, %r11 eor x11, x11, #0x30 // xor $0x30, %r11 - adr x10, .Lk_sr + adrp x10, .Lk_sr + add x10, x10, #:lo12:.Lk_sr and x11, x11, #0x30 // and $0x30, %r11 add x11, x11, x10 - adr x10, .Lk_mc_forward+48 + adrp x10, .Lk_mc_forward+48 + add x10, x10, #:lo12:.Lk_mc_forward+48 ld1 {v16.2d}, [x9],#16 // vmovdqu (%r9), %xmm4 # round0 key and v1.16b, v7.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 @@ -454,10 +464,12 @@ _vpaes_decrypt_2x: // vmovdqa .Lk_dipt(%rip), %xmm2 # iptlo lsl x11, x8, #4 // mov %rax, %r11; shl $4, %r11 eor x11, x11, #0x30 // xor $0x30, %r11 - adr x10, .Lk_sr + adrp x10, .Lk_sr + add x10, x10, #:lo12:.Lk_sr and x11, x11, #0x30 // and $0x30, %r11 add x11, x11, x10 - adr x10, .Lk_mc_forward+48 + adrp x10, .Lk_mc_forward+48 + add x10, x10, #:lo12:.Lk_mc_forward+48 ld1 {v16.2d}, [x9],#16 // vmovdqu (%r9), %xmm4 # round0 key and v1.16b, v14.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 @@ -586,14 +598,18 @@ _vpaes_decrypt_2x: .type _vpaes_key_preheat,%function .align 4 _vpaes_key_preheat: - adr x10, .Lk_inv + adrp x10, .Lk_inv + add x10, x10, #:lo12:.Lk_inv movi v16.16b, #0x5b // .Lk_s63 - adr x11, .Lk_sb1 + adrp x11, .Lk_sb1 + add x11, x11, #:lo12:.Lk_sb1 movi v17.16b, #0x0f // .Lk_s0F ld1 {v18.2d,v19.2d,v20.2d,v21.2d}, [x10] // .Lk_inv, .Lk_ipt - adr x10, .Lk_dksd + adrp x10, .Lk_dksd + add x10, x10, #:lo12:.Lk_dksd ld1 {v22.2d,v23.2d}, [x11] // .Lk_sb1 - adr x11, .Lk_mc_forward + adrp x11, .Lk_mc_forward + add x11, x11, #:lo12:.Lk_mc_forward ld1 {v24.2d,v25.2d,v26.2d,v27.2d}, [x10],#64 // .Lk_dksd, .Lk_dksb ld1 {v28.2d,v29.2d,v30.2d,v31.2d}, [x10],#64 // .Lk_dkse, .Lk_dks9 ld1 {v8.2d}, [x10] // .Lk_rcon @@ -617,7 +633,8 @@ _vpaes_schedule_core: bl _vpaes_schedule_transform mov v7.16b, v0.16b // vmovdqa %xmm0, %xmm7 - adr x10, .Lk_sr // lea .Lk_sr(%rip),%r10 + adrp x10, .Lk_sr + add x10, x10, #:lo12:.Lk_sr add x8, x8, x10 cbnz w3, .Lschedule_am_decrypting @@ -743,12 +760,14 @@ _vpaes_schedule_core: .align 4 .Lschedule_mangle_last: // schedule last round key from xmm0 - adr x11, .Lk_deskew // lea .Lk_deskew(%rip),%r11 # prepare to deskew + adrp x11, .Lk_deskew + add x11, x11, #:lo12:.Lk_deskew cbnz w3, .Lschedule_mangle_last_dec // encrypting ld1 {v1.2d}, [x8] // vmovdqa (%r8,%r10),%xmm1 - adr x11, .Lk_opt // lea .Lk_opt(%rip), %r11 # prepare to output transform + adrp x11, .Lk_opt + add x11, x11, #:lo12:.Lk_opt add x2, x2, #32 // add $32, %rdx tbl v0.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm0 # output permute diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/bn/armv8-mont.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/bn/armv8-mont.S index 111de65451b0..98c5b76576c0 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/bn/armv8-mont.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/bn/armv8-mont.S @@ -2130,6 +2130,7 @@ __bn_mul4x_mont: AARCH64_VALIDATE_LINK_REGISTER ret .size __bn_mul4x_mont,.-__bn_mul4x_mont +.section .rodata .byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 4 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/ec/ecp_nistz256-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/ec/ecp_nistz256-armv8.S index 6fe86a40201c..8c42109669ad 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/ec/ecp_nistz256-armv8.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/ec/ecp_nistz256-armv8.S @@ -1,6 +1,6 @@ #include "arm_arch.h" -.text +.section .rodata .globl ecp_nistz256_precomputed .type ecp_nistz256_precomputed,%object .align 12 @@ -2390,6 +2390,8 @@ ecp_nistz256_precomputed: .byte 69,67,80,95,78,73,83,84,90,50,53,54,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 +.text + // void ecp_nistz256_to_mont(BN_ULONG x0[4],const BN_ULONG x1[4]); .globl ecp_nistz256_to_mont .type ecp_nistz256_to_mont,%function @@ -2400,12 +2402,16 @@ ecp_nistz256_to_mont: add x29,sp,#0 stp x19,x20,[sp,#16] - ldr x3,.LRR // bp[0] + adrp x3,.LRR + ldr x3,[x3,#:lo12:.LRR] // bp[0] ldp x4,x5,[x1] ldp x6,x7,[x1,#16] - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 - adr x2,.LRR // &bp[0] + adrp x13,.Lpoly + add x13,x13,#:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] + adrp x2,.LRR + add x2,x2,#:lo12:.LRR bl __ecp_nistz256_mul_mont @@ -2428,9 +2434,12 @@ ecp_nistz256_from_mont: mov x3,#1 // bp[0] ldp x4,x5,[x1] ldp x6,x7,[x1,#16] - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 - adr x2,.Lone // &bp[0] + adrp x13,.Lpoly + add x13,x13,#:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] + adrp x2,.Lone + add x2,x2,#:lo12:.Lone bl __ecp_nistz256_mul_mont @@ -2454,8 +2463,10 @@ ecp_nistz256_mul_mont: ldr x3,[x2] // bp[0] ldp x4,x5,[x1] ldp x6,x7,[x1,#16] - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 + adrp x13,.Lpoly + add x13,x13,#:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_mul_mont @@ -2477,8 +2488,10 @@ ecp_nistz256_sqr_mont: ldp x4,x5,[x1] ldp x6,x7,[x1,#16] - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 + adrp x13,.Lpoly + add x13,x13,#:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_sqr_mont @@ -2502,8 +2515,10 @@ ecp_nistz256_add: ldp x8,x9,[x2] ldp x16,x17,[x1,#16] ldp x10,x11,[x2,#16] - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 + adrp x13,.Lpoly + add x13,x13,#:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_add @@ -2523,8 +2538,10 @@ ecp_nistz256_div_by_2: ldp x14,x15,[x1] ldp x16,x17,[x1,#16] - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 + adrp x13,.Lpoly + add x13,x13,#:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_div_by_2 @@ -2544,8 +2561,10 @@ ecp_nistz256_mul_by_2: ldp x14,x15,[x1] ldp x16,x17,[x1,#16] - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 + adrp x13,.Lpoly + add x13,x13,#:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] mov x8,x14 mov x9,x15 mov x10,x16 @@ -2569,8 +2588,10 @@ ecp_nistz256_mul_by_3: ldp x14,x15,[x1] ldp x16,x17,[x1,#16] - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 + adrp x13,.Lpoly + add x13,x13,#:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] mov x8,x14 mov x9,x15 mov x10,x16 @@ -2606,8 +2627,10 @@ ecp_nistz256_sub: ldp x14,x15,[x1] ldp x16,x17,[x1,#16] - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 + adrp x13,.Lpoly + add x13,x13,#:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_sub_from @@ -2630,8 +2653,10 @@ ecp_nistz256_neg: mov x15,xzr mov x16,xzr mov x17,xzr - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 + adrp x13,.Lpoly + add x13,x13,#:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] bl __ecp_nistz256_sub_from @@ -3026,9 +3051,11 @@ ecp_nistz256_point_double: mov x21,x0 ldp x16,x17,[x1,#48] mov x22,x1 - ldr x12,.Lpoly+8 + adrp x13,.Lpoly + add x13,x13,#:lo12:.Lpoly + ldr x12,[x13,#8] mov x8,x14 - ldr x13,.Lpoly+24 + ldr x13,[x13,#24] mov x9,x15 ldp x4,x5,[x22,#64] // forward load for p256_sqr_mont mov x10,x16 @@ -3171,8 +3198,10 @@ ecp_nistz256_point_add: mov x21,x0 mov x22,x1 mov x23,x2 - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 + adrp x13,.Lpoly + add x13,x13,#:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] orr x8,x4,x5 orr x10,x6,x7 orr x25,x8,x10 @@ -3422,8 +3451,10 @@ ecp_nistz256_point_add_affine: mov x21,x0 mov x22,x1 mov x23,x2 - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 + adrp x13,.Lpoly + add x13,x13,#:lo12:.Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] ldp x4,x5,[x1,#64] // in1_z ldp x6,x7,[x1,#64+16] @@ -3569,7 +3600,8 @@ ecp_nistz256_point_add_affine: ldp x10,x11,[x23,#0+48] stp x14,x15,[x21,#0] stp x16,x17,[x21,#0+16] - adr x23,.Lone_mont-64 + adrp x23,.Lone_mont-64 + add x23,x23,#:lo12:.Lone_mont-64 ldp x14,x15,[x22,#32] // in1 cmp x24,#0 // ~, remember? ldp x16,x17,[x22,#32+16] @@ -3627,7 +3659,8 @@ ecp_nistz256_ord_mul_mont: stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] - adr x23,.Lord + adrp x23,.Lord + add x23,x23,#:lo12:.Lord ldr x3,[x2] // bp[0] ldp x4,x5,[x1] ldp x6,x7,[x1,#16] @@ -3837,7 +3870,8 @@ ecp_nistz256_ord_sqr_mont: stp x21,x22,[sp,#32] stp x23,x24,[sp,#48] - adr x23,.Lord + adrp x23,.Lord + add x23,x23,#:lo12:.Lord ldp x4,x5,[x1] ldp x6,x7,[x1,#16] diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/md5/md5-aarch64.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/md5/md5-aarch64.S index 7045e31f189f..76e4de346afc 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/md5/md5-aarch64.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/md5/md5-aarch64.S @@ -207,165 +207,165 @@ ossl_md5_blocks_loop: add w9, w9, w13 // Add constant 0x49b40821 add w9, w9, w6 // Add aux function result ror w9, w9, #10 // Rotate left s=22 bits - bic x6, x8, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) + bic x6, x8, x17 // Aux function round 2 (~z & y) add w9, w8, w9 // Add X parameter round 1 B=FF(B, C, D, A, 0x49b40821, s=22, M[15]) - and x13, x9, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) - orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y)) movz x13, #0x2562 // .Load lower half of constant 0xf61e2562 movk x13, #0xf61e, lsl #16 // .Load upper half of constant 0xf61e2562 add w4, w4, w20 // Add dest value add w4, w4, w13 // Add constant 0xf61e2562 - add w4, w4, w6 // Add aux function result + and x13, x9, x17 // Aux function round 2 (x & z) + add w4, w4, w6 // Add (~z & y) + add w4, w4, w13 // Add (x & z) ror w4, w4, #27 // Rotate left s=5 bits - bic x6, x9, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) + bic x6, x9, x8 // Aux function round 2 (~z & y) add w4, w9, w4 // Add X parameter round 2 A=GG(A, B, C, D, 0xf61e2562, s=5, M[1]) - and x13, x4, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) - orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y)) movz x13, #0xb340 // .Load lower half of constant 0xc040b340 movk x13, #0xc040, lsl #16 // .Load upper half of constant 0xc040b340 add w17, w17, w7 // Add dest value add w17, w17, w13 // Add constant 0xc040b340 - add w17, w17, w6 // Add aux function result + and x13, x4, x8 // Aux function round 2 (x & z) + add w17, w17, w6 // Add (~z & y) + add w17, w17, w13 // Add (x & z) ror w17, w17, #23 // Rotate left s=9 bits - bic x6, x4, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) + bic x6, x4, x9 // Aux function round 2 (~z & y) add w17, w4, w17 // Add X parameter round 2 D=GG(D, A, B, C, 0xc040b340, s=9, M[6]) - and x13, x17, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) - orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y)) movz x13, #0x5a51 // .Load lower half of constant 0x265e5a51 movk x13, #0x265e, lsl #16 // .Load upper half of constant 0x265e5a51 add w8, w8, w25 // Add dest value add w8, w8, w13 // Add constant 0x265e5a51 - add w8, w8, w6 // Add aux function result + and x13, x17, x9 // Aux function round 2 (x & z) + add w8, w8, w6 // Add (~z & y) + add w8, w8, w13 // Add (x & z) ror w8, w8, #18 // Rotate left s=14 bits - bic x6, x17, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) + bic x6, x17, x4 // Aux function round 2 (~z & y) add w8, w17, w8 // Add X parameter round 2 C=GG(C, D, A, B, 0x265e5a51, s=14, M[11]) - and x13, x8, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) - orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y)) movz x13, #0xc7aa // .Load lower half of constant 0xe9b6c7aa movk x13, #0xe9b6, lsl #16 // .Load upper half of constant 0xe9b6c7aa add w9, w9, w15 // Add dest value add w9, w9, w13 // Add constant 0xe9b6c7aa - add w9, w9, w6 // Add aux function result + and x13, x8, x4 // Aux function round 2 (x & z) + add w9, w9, w6 // Add (~z & y) + add w9, w9, w13 // Add (x & z) ror w9, w9, #12 // Rotate left s=20 bits - bic x6, x8, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) + bic x6, x8, x17 // Aux function round 2 (~z & y) add w9, w8, w9 // Add X parameter round 2 B=GG(B, C, D, A, 0xe9b6c7aa, s=20, M[0]) - and x13, x9, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) - orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y)) movz x13, #0x105d // .Load lower half of constant 0xd62f105d movk x13, #0xd62f, lsl #16 // .Load upper half of constant 0xd62f105d add w4, w4, w22 // Add dest value add w4, w4, w13 // Add constant 0xd62f105d - add w4, w4, w6 // Add aux function result + and x13, x9, x17 // Aux function round 2 (x & z) + add w4, w4, w6 // Add (~z & y) + add w4, w4, w13 // Add (x & z) ror w4, w4, #27 // Rotate left s=5 bits - bic x6, x9, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) + bic x6, x9, x8 // Aux function round 2 (~z & y) add w4, w9, w4 // Add X parameter round 2 A=GG(A, B, C, D, 0xd62f105d, s=5, M[5]) - and x13, x4, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) - orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y)) movz x13, #0x1453 // .Load lower half of constant 0x2441453 movk x13, #0x244, lsl #16 // .Load upper half of constant 0x2441453 add w17, w17, w16 // Add dest value add w17, w17, w13 // Add constant 0x2441453 - add w17, w17, w6 // Add aux function result + and x13, x4, x8 // Aux function round 2 (x & z) + add w17, w17, w6 // Add (~z & y) + add w17, w17, w13 // Add (x & z) ror w17, w17, #23 // Rotate left s=9 bits - bic x6, x4, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) + bic x6, x4, x9 // Aux function round 2 (~z & y) add w17, w4, w17 // Add X parameter round 2 D=GG(D, A, B, C, 0x2441453, s=9, M[10]) - and x13, x17, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) - orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y)) movz x13, #0xe681 // .Load lower half of constant 0xd8a1e681 movk x13, #0xd8a1, lsl #16 // .Load upper half of constant 0xd8a1e681 add w8, w8, w27 // Add dest value add w8, w8, w13 // Add constant 0xd8a1e681 - add w8, w8, w6 // Add aux function result + and x13, x17, x9 // Aux function round 2 (x & z) + add w8, w8, w6 // Add (~z & y) + add w8, w8, w13 // Add (x & z) ror w8, w8, #18 // Rotate left s=14 bits - bic x6, x17, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) + bic x6, x17, x4 // Aux function round 2 (~z & y) add w8, w17, w8 // Add X parameter round 2 C=GG(C, D, A, B, 0xd8a1e681, s=14, M[15]) - and x13, x8, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) - orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y)) movz x13, #0xfbc8 // .Load lower half of constant 0xe7d3fbc8 movk x13, #0xe7d3, lsl #16 // .Load upper half of constant 0xe7d3fbc8 add w9, w9, w14 // Add dest value add w9, w9, w13 // Add constant 0xe7d3fbc8 - add w9, w9, w6 // Add aux function result + and x13, x8, x4 // Aux function round 2 (x & z) + add w9, w9, w6 // Add (~z & y) + add w9, w9, w13 // Add (x & z) ror w9, w9, #12 // Rotate left s=20 bits - bic x6, x8, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) + bic x6, x8, x17 // Aux function round 2 (~z & y) add w9, w8, w9 // Add X parameter round 2 B=GG(B, C, D, A, 0xe7d3fbc8, s=20, M[4]) - and x13, x9, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) - orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y)) movz x13, #0xcde6 // .Load lower half of constant 0x21e1cde6 movk x13, #0x21e1, lsl #16 // .Load upper half of constant 0x21e1cde6 add w4, w4, w24 // Add dest value add w4, w4, w13 // Add constant 0x21e1cde6 - add w4, w4, w6 // Add aux function result + and x13, x9, x17 // Aux function round 2 (x & z) + add w4, w4, w6 // Add (~z & y) + add w4, w4, w13 // Add (x & z) ror w4, w4, #27 // Rotate left s=5 bits - bic x6, x9, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) + bic x6, x9, x8 // Aux function round 2 (~z & y) add w4, w9, w4 // Add X parameter round 2 A=GG(A, B, C, D, 0x21e1cde6, s=5, M[9]) - and x13, x4, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) - orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y)) movz x13, #0x7d6 // .Load lower half of constant 0xc33707d6 movk x13, #0xc337, lsl #16 // .Load upper half of constant 0xc33707d6 add w17, w17, w12 // Add dest value add w17, w17, w13 // Add constant 0xc33707d6 - add w17, w17, w6 // Add aux function result + and x13, x4, x8 // Aux function round 2 (x & z) + add w17, w17, w6 // Add (~z & y) + add w17, w17, w13 // Add (x & z) ror w17, w17, #23 // Rotate left s=9 bits - bic x6, x4, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) + bic x6, x4, x9 // Aux function round 2 (~z & y) add w17, w4, w17 // Add X parameter round 2 D=GG(D, A, B, C, 0xc33707d6, s=9, M[14]) - and x13, x17, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) - orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y)) movz x13, #0xd87 // .Load lower half of constant 0xf4d50d87 movk x13, #0xf4d5, lsl #16 // .Load upper half of constant 0xf4d50d87 add w8, w8, w21 // Add dest value add w8, w8, w13 // Add constant 0xf4d50d87 - add w8, w8, w6 // Add aux function result + and x13, x17, x9 // Aux function round 2 (x & z) + add w8, w8, w6 // Add (~z & y) + add w8, w8, w13 // Add (x & z) ror w8, w8, #18 // Rotate left s=14 bits - bic x6, x17, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) + bic x6, x17, x4 // Aux function round 2 (~z & y) add w8, w17, w8 // Add X parameter round 2 C=GG(C, D, A, B, 0xf4d50d87, s=14, M[3]) - and x13, x8, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) - orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y)) movz x13, #0x14ed // .Load lower half of constant 0x455a14ed movk x13, #0x455a, lsl #16 // .Load upper half of constant 0x455a14ed add w9, w9, w5 // Add dest value add w9, w9, w13 // Add constant 0x455a14ed - add w9, w9, w6 // Add aux function result + and x13, x8, x4 // Aux function round 2 (x & z) + add w9, w9, w6 // Add (~z & y) + add w9, w9, w13 // Add (x & z) ror w9, w9, #12 // Rotate left s=20 bits - bic x6, x8, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) + bic x6, x8, x17 // Aux function round 2 (~z & y) add w9, w8, w9 // Add X parameter round 2 B=GG(B, C, D, A, 0x455a14ed, s=20, M[8]) - and x13, x9, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) - orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y)) movz x13, #0xe905 // .Load lower half of constant 0xa9e3e905 movk x13, #0xa9e3, lsl #16 // .Load upper half of constant 0xa9e3e905 add w4, w4, w26 // Add dest value add w4, w4, w13 // Add constant 0xa9e3e905 - add w4, w4, w6 // Add aux function result + and x13, x9, x17 // Aux function round 2 (x & z) + add w4, w4, w6 // Add (~z & y) + add w4, w4, w13 // Add (x & z) ror w4, w4, #27 // Rotate left s=5 bits - bic x6, x9, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) + bic x6, x9, x8 // Aux function round 2 (~z & y) add w4, w9, w4 // Add X parameter round 2 A=GG(A, B, C, D, 0xa9e3e905, s=5, M[13]) - and x13, x4, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) - orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y)) movz x13, #0xa3f8 // .Load lower half of constant 0xfcefa3f8 movk x13, #0xfcef, lsl #16 // .Load upper half of constant 0xfcefa3f8 add w17, w17, w3 // Add dest value add w17, w17, w13 // Add constant 0xfcefa3f8 - add w17, w17, w6 // Add aux function result + and x13, x4, x8 // Aux function round 2 (x & z) + add w17, w17, w6 // Add (~z & y) + add w17, w17, w13 // Add (x & z) ror w17, w17, #23 // Rotate left s=9 bits - bic x6, x4, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) + bic x6, x4, x9 // Aux function round 2 (~z & y) add w17, w4, w17 // Add X parameter round 2 D=GG(D, A, B, C, 0xfcefa3f8, s=9, M[2]) - and x13, x17, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) - orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y)) movz x13, #0x2d9 // .Load lower half of constant 0x676f02d9 movk x13, #0x676f, lsl #16 // .Load upper half of constant 0x676f02d9 add w8, w8, w23 // Add dest value add w8, w8, w13 // Add constant 0x676f02d9 - add w8, w8, w6 // Add aux function result + and x13, x17, x9 // Aux function round 2 (x & z) + add w8, w8, w6 // Add (~z & y) + add w8, w8, w13 // Add (x & z) ror w8, w8, #18 // Rotate left s=14 bits - bic x6, x17, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) + bic x6, x17, x4 // Aux function round 2 (~z & y) add w8, w17, w8 // Add X parameter round 2 C=GG(C, D, A, B, 0x676f02d9, s=14, M[7]) - and x13, x8, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y)) - orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y)) movz x13, #0x4c8a // .Load lower half of constant 0x8d2a4c8a movk x13, #0x8d2a, lsl #16 // .Load upper half of constant 0x8d2a4c8a add w9, w9, w11 // Add dest value add w9, w9, w13 // Add constant 0x8d2a4c8a - add w9, w9, w6 // Add aux function result + and x13, x8, x4 // Aux function round 2 (x & z) + add w9, w9, w6 // Add (~z & y) + add w9, w9, w13 // Add (x & z) eor x6, x8, x17 // Begin aux function round 3 H(x,y,z)=(x^y^z) ror w9, w9, #12 // Rotate left s=20 bits movz x10, #0x3942 // .Load lower half of constant 0xfffa3942 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/aes-gcm-armv8_64.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/aes-gcm-armv8_64.S index 75e29532bc13..117c52ebc0e7 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/aes-gcm-armv8_64.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/aes-gcm-armv8_64.S @@ -6389,6 +6389,7 @@ aes_gcm_dec_256_kernel: mov w0, #0x0 ret .size aes_gcm_dec_256_kernel,.-aes_gcm_dec_256_kernel +.section .rodata .byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/ghashv8-armx.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/ghashv8-armx.S index 955379036110..0b50e2af31dc 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/ghashv8-armx.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/ghashv8-armx.S @@ -637,6 +637,7 @@ gcm_ghash_v8_4x: ret .size gcm_ghash_v8_4x,.-gcm_ghash_v8_4x +.section .rodata .byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/keccak1600-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/keccak1600-armv8.S index a6f0f603a092..a4f0f0f7d0b2 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/keccak1600-armv8.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/keccak1600-armv8.S @@ -1,6 +1,6 @@ #include "arm_arch.h" -.text +.section .rodata .align 8 // strategic alignment and padding that allows to use // address value as loop termination condition... @@ -32,11 +32,14 @@ iotas: .quad 0x0000000080000001 .quad 0x8000000080008008 .size iotas,.-iotas +.text + .type KeccakF1600_int,%function .align 5 KeccakF1600_int: AARCH64_SIGN_LINK_REGISTER - adr x28,iotas + adrp x28,iotas + add x28,x28,#:lo12:iotas stp x28,x30,[sp,#16] // 32 bytes on top are mine b .Loop .align 4 @@ -578,7 +581,8 @@ SHA3_squeeze: .align 5 KeccakF1600_ce: mov x9,#24 - adr x10,iotas + adrp x10,iotas + add x10,x10,#:lo12:iotas b .Loop_ce .align 4 .Loop_ce: diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha1-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha1-armv8.S index 42fc0a74c1c4..507262b368f6 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha1-armv8.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha1-armv8.S @@ -1080,7 +1080,8 @@ sha1_block_armv8: stp x29,x30,[sp,#-16]! add x29,sp,#0 - adr x4,.Lconst + adrp x4,.Lconst + add x4,x4,#:lo12:.Lconst eor v1.16b,v1.16b,v1.16b ld1 {v0.4s},[x0],#16 ld1 {v1.s}[0],[x0] @@ -1203,6 +1204,9 @@ sha1_block_armv8: ldr x29,[sp],#16 ret .size sha1_block_armv8,.-sha1_block_armv8 + +.section .rodata + .align 6 .Lconst: .long 0x5a827999,0x5a827999,0x5a827999,0x5a827999 //K_00_19 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha256-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha256-armv8.S index 9d397fae8fb8..b0644b849d96 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha256-armv8.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha256-armv8.S @@ -1,4 +1,4 @@ -// Copyright 2014-2020 The OpenSSL Project Authors. All Rights Reserved. +// Copyright 2014-2025 The OpenSSL Project Authors. All Rights Reserved. // // Licensed under the Apache License 2.0 (the "License"). You may not use // this file except in compliance with the License. You can obtain a copy @@ -92,7 +92,8 @@ sha256_block_data_order: ldp w24,w25,[x0,#4*4] add x2,x1,x2,lsl#6 // end of input ldp w26,w27,[x0,#6*4] - adr x30,.LK256 + adrp x30,.LK256 + add x30,x30,#:lo12:.LK256 stp x0,x2,[x29,#96] .Loop: @@ -1040,6 +1041,8 @@ sha256_block_data_order: ret .size sha256_block_data_order,.-sha256_block_data_order +.section .rodata + .align 6 .type .LK256,%object .LK256: @@ -1064,6 +1067,8 @@ sha256_block_data_order: .byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 + +.text #ifndef __KERNEL__ .type sha256_block_armv8,%function .align 6 @@ -1074,7 +1079,8 @@ sha256_block_armv8: add x29,sp,#0 ld1 {v0.4s,v1.4s},[x0] - adr x3,.LK256 + adrp x3,.LK256 + add x3,x3,#:lo12:.LK256 .Loop_hw: ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64 @@ -1218,7 +1224,8 @@ sha256_block_neon: mov x29, sp sub sp,sp,#16*4 - adr x16,.LK256 + adrp x16,.LK256 + add x16,x16,#:lo12:.LK256 add x2,x1,x2,lsl#6 // len to point at the end of inp ld1 {v0.16b},[x1], #16 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha512-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha512-armv8.S index dbc688df71cb..0a45eb06ed0f 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha512-armv8.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha512-armv8.S @@ -1,4 +1,4 @@ -// Copyright 2014-2020 The OpenSSL Project Authors. All Rights Reserved. +// Copyright 2014-2025 The OpenSSL Project Authors. All Rights Reserved. // // Licensed under the Apache License 2.0 (the "License"). You may not use // this file except in compliance with the License. You can obtain a copy @@ -90,7 +90,8 @@ sha512_block_data_order: ldp x24,x25,[x0,#4*8] add x2,x1,x2,lsl#7 // end of input ldp x26,x27,[x0,#6*8] - adr x30,.LK512 + adrp x30,.LK512 + add x30,x30,#:lo12:.LK512 stp x0,x2,[x29,#96] .Loop: @@ -1038,6 +1039,8 @@ sha512_block_data_order: ret .size sha512_block_data_order,.-sha512_block_data_order +.section .rodata + .align 6 .type .LK512,%object .LK512: @@ -1086,6 +1089,8 @@ sha512_block_data_order: .byte 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 .align 2 .align 2 + +.text #ifndef __KERNEL__ .type sha512_block_armv8,%function .align 6 @@ -1099,7 +1104,8 @@ sha512_block_armv8: ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64 ld1 {v0.2d,v1.2d,v2.2d,v3.2d},[x0] // load context - adr x3,.LK512 + adrp x3,.LK512 + add x3,x3,#:lo12:.LK512 rev64 v16.16b,v16.16b rev64 v17.16b,v17.16b diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sm3/sm3-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sm3/sm3-armv8.S index f1678ff1439b..39ffc201d711 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sm3/sm3-armv8.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sm3/sm3-armv8.S @@ -1,4 +1,4 @@ -// Copyright 2021-2023 The OpenSSL Project Authors. All Rights Reserved. +// Copyright 2021-2025 The OpenSSL Project Authors. All Rights Reserved. // // Licensed under the Apache License 2.0 (the "License"). You may not use // this file except in compliance with the License. You can obtain a copy @@ -22,19 +22,19 @@ ossl_hwsm3_block_data_order: rev64 v6.4s, v6.4s ext v5.16b, v5.16b, v5.16b, #8 ext v6.16b, v6.16b, v6.16b, #8 - - adr x8, .Tj + adrp x8, .Tj + add x8, x8, #:lo12:.Tj ldp s16, s17, [x8] .Loop: // load input - ld1 {v0.16b,v1.16b,v2.16b,v3.16b}, [x1], #64 + ld1 {v0.4s,v1.4s,v2.4s,v3.4s}, [x1], #64 sub w2, w2, #1 mov v18.16b, v5.16b mov v19.16b, v6.16b -#ifndef __ARMEB__ +#ifndef __AARCH64EB__ rev32 v0.16b, v0.16b rev32 v1.16b, v1.16b rev32 v2.16b, v2.16b @@ -497,7 +497,12 @@ ossl_hwsm3_block_data_order: st1 {v5.4s,v6.4s}, [x0] ret .size ossl_hwsm3_block_data_order,.-ossl_hwsm3_block_data_order +.section .rodata +.type _sm3_consts,%object .align 3 +_sm3_consts: .Tj: .word 0x79cc4519, 0x9d8a7a87 +.size _sm3_consts,.-_sm3_consts +.previous diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/aes/aes-586.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/aes/aes-586.S index 9792a50a8c84..c55c427c3524 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/aes/aes-586.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/aes/aes-586.S @@ -3300,7 +3300,7 @@ AES_set_decrypt_key: .byte 65,69,83,32,102,111,114,32,120,56,54,44,32,67,82,89 .byte 80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114 .byte 111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.comm OPENSSL_ia32cap_P,16,4 +.comm OPENSSL_ia32cap_P,40,4 .section ".note.gnu.property", "a" .p2align 2 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/aes/aesni-x86.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/aes/aesni-x86.S index 28e4f1a50a32..2f9563bdca46 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/aes/aesni-x86.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/aes/aesni-x86.S @@ -3344,7 +3344,7 @@ aesni_set_decrypt_key: .byte 83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83 .byte 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115 .byte 115,108,46,111,114,103,62,0 -.comm OPENSSL_ia32cap_P,16,4 +.comm OPENSSL_ia32cap_P,40,4 .section ".note.gnu.property", "a" .p2align 2 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/bn-586.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/bn-586.S index b26aa4b79952..73b87147f080 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/bn-586.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/bn-586.S @@ -1552,7 +1552,7 @@ bn_sub_part_words: popl %ebp ret .size bn_sub_part_words,.-.L_bn_sub_part_words_begin -.comm OPENSSL_ia32cap_P,16,4 +.comm OPENSSL_ia32cap_P,40,4 .section ".note.gnu.property", "a" .p2align 2 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/x86-gf2m.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/x86-gf2m.S index 9ec7e1625831..74f09869536d 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/x86-gf2m.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/x86-gf2m.S @@ -354,7 +354,7 @@ bn_GF2m_mul_2x2: .byte 67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97 .byte 112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103 .byte 62,0 -.comm OPENSSL_ia32cap_P,16,4 +.comm OPENSSL_ia32cap_P,40,4 .section ".note.gnu.property", "a" .p2align 2 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/x86-mont.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/x86-mont.S index 73fad9f75da6..eedb0f4b9736 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/x86-mont.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/bn/x86-mont.S @@ -474,7 +474,7 @@ bn_mul_mont: .byte 54,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121 .byte 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46 .byte 111,114,103,62,0 -.comm OPENSSL_ia32cap_P,16,4 +.comm OPENSSL_ia32cap_P,40,4 .section ".note.gnu.property", "a" .p2align 2 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/ec/ecp_nistz256-x86.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/ec/ecp_nistz256-x86.S index ccd96e4167d7..63f333ed9114 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/ec/ecp_nistz256-x86.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/ec/ecp_nistz256-x86.S @@ -5270,7 +5270,7 @@ ecp_nistz256_point_add_affine: popl %ebp ret .size ecp_nistz256_point_add_affine,.-.L_ecp_nistz256_point_add_affine_begin -.comm OPENSSL_ia32cap_P,16,4 +.comm OPENSSL_ia32cap_P,40,4 .section ".note.gnu.property", "a" .p2align 2 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha1-586.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha1-586.S index 9cfe5a46603a..a3f81ed9035f 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha1-586.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha1-586.S @@ -3986,7 +3986,7 @@ _sha1_block_data_order_avx: .byte 102,111,114,109,32,102,111,114,32,120,56,54,44,32,67,82 .byte 89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112 .byte 114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.comm OPENSSL_ia32cap_P,16,4 +.comm OPENSSL_ia32cap_P,40,4 .section ".note.gnu.property", "a" .p2align 2 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha256-586.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha256-586.S index 9253ab18d0d3..8497be1bb27b 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha256-586.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha256-586.S @@ -6784,7 +6784,7 @@ sha256_block_data_order: popl %ebp ret .size sha256_block_data_order,.-.L_sha256_block_data_order_begin -.comm OPENSSL_ia32cap_P,16,4 +.comm OPENSSL_ia32cap_P,40,4 .section ".note.gnu.property", "a" .p2align 2 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha512-586.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha512-586.S index 5e849365a6aa..74624d5a50ec 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha512-586.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/sha/sha512-586.S @@ -2830,7 +2830,7 @@ sha512_block_data_order: .byte 67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97 .byte 112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103 .byte 62,0 -.comm OPENSSL_ia32cap_P,16,4 +.comm OPENSSL_ia32cap_P,40,4 .section ".note.gnu.property", "a" .p2align 2 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/x86cpuid.S b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/x86cpuid.S index 3a3533b0f1d1..76d15e57dbe8 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/x86cpuid.S +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-GCC/crypto/x86cpuid.S @@ -122,6 +122,24 @@ OPENSSL_ia32_cpuid: xorl %ecx,%ecx .byte 0x0f,0xa2 movl %ebx,8(%edi) + movl %ecx,12(%edi) + movl %edx,16(%edi) + cmpl $1,%eax + jb .L005no_extended_info + movl $7,%eax + movl $1,%ecx + .byte 0x0f,0xa2 + movl %eax,20(%edi) + movl %edx,24(%edi) + movl %ebx,28(%edi) + movl %ecx,32(%edi) + andl $524288,%edx + cmpl $0,%edx + je .L005no_extended_info + movl $36,%eax + movl $0,%ecx + .byte 0x0f,0xa2 + movl %ebx,36(%edi) .L005no_extended_info: btl $27,%ebp jnc .L006clear_avx @@ -137,6 +155,7 @@ OPENSSL_ia32_cpuid: andl $4278190079,%esi .L006clear_avx: andl $4026525695,%ebp + andl $4286578687,20(%edi) andl $4294967263,8(%edi) .L007done: movl %esi,%eax @@ -577,7 +596,7 @@ OPENSSL_ia32_rdseed_bytes: .size OPENSSL_ia32_rdseed_bytes,.-.L_OPENSSL_ia32_rdseed_bytes_begin .hidden OPENSSL_cpuid_setup .hidden OPENSSL_ia32cap_P -.comm OPENSSL_ia32cap_P,16,4 +.comm OPENSSL_ia32cap_P,40,4 .section .init call OPENSSL_cpuid_setup diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/aes/aes-586.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/aes/aes-586.nasm index 6c21227279e2..71c812ab39a6 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/aes/aes-586.nasm +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/aes/aes-586.nasm @@ -3208,4 +3208,4 @@ db 65,69,83,32,102,111,114,32,120,56,54,44,32,67,82,89 db 80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114 db 111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 segment .bss -common _OPENSSL_ia32cap_P 16 +common _OPENSSL_ia32cap_P 40 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/aes/aesni-x86.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/aes/aesni-x86.nasm index ca5544aebe23..37198a2e5fda 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/aes/aesni-x86.nasm +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/aes/aesni-x86.nasm @@ -3199,4 +3199,4 @@ db 83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83 db 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115 db 115,108,46,111,114,103,62,0 segment .bss -common _OPENSSL_ia32cap_P 16 +common _OPENSSL_ia32cap_P 40 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/bn-586.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/bn-586.nasm index e46d8457cfd7..d79fd8012a65 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/bn-586.nasm +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/bn-586.nasm @@ -1512,4 +1512,4 @@ L$029pw_end: pop ebp ret segment .bss -common _OPENSSL_ia32cap_P 16 +common _OPENSSL_ia32cap_P 40 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/x86-gf2m.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/x86-gf2m.nasm index 7750777de2be..52be719fc050 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/x86-gf2m.nasm +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/x86-gf2m.nasm @@ -342,4 +342,4 @@ db 67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97 db 112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103 db 62,0 segment .bss -common _OPENSSL_ia32cap_P 16 +common _OPENSSL_ia32cap_P 40 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/x86-mont.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/x86-mont.nasm index 6547b0d7fa1d..545085381b46 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/x86-mont.nasm +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/bn/x86-mont.nasm @@ -476,4 +476,4 @@ db 54,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121 db 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46 db 111,114,103,62,0 segment .bss -common _OPENSSL_ia32cap_P 16 +common _OPENSSL_ia32cap_P 40 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/ec/ecp_nistz256-x86.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/ec/ecp_nistz256-x86.nasm index 1e487970e333..cd5381520de2 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/ec/ecp_nistz256-x86.nasm +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/ec/ecp_nistz256-x86.nasm @@ -5125,4 +5125,4 @@ L$013pic: pop ebp ret segment .bss -common _OPENSSL_ia32cap_P 16 +common _OPENSSL_ia32cap_P 40 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha1-586.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha1-586.nasm index 0d644acce056..41cc58af833d 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha1-586.nasm +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha1-586.nasm @@ -3967,4 +3967,4 @@ db 102,111,114,109,32,102,111,114,32,120,56,54,44,32,67,82 db 89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112 db 114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 segment .bss -common _OPENSSL_ia32cap_P 16 +common _OPENSSL_ia32cap_P 40 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha256-586.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha256-586.nasm index 7d8398c7d379..ec4ac3e7d467 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha256-586.nasm +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha256-586.nasm @@ -6786,4 +6786,4 @@ L$018avx_bmi_00_47: pop ebp ret segment .bss -common _OPENSSL_ia32cap_P 16 +common _OPENSSL_ia32cap_P 40 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha512-586.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha512-586.nasm index 9410d5c35d07..d04b03ec2a4f 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha512-586.nasm +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/sha/sha512-586.nasm @@ -2832,4 +2832,4 @@ db 67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97 db 112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103 db 62,0 segment .bss -common _OPENSSL_ia32cap_P 16 +common _OPENSSL_ia32cap_P 40 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/x86cpuid.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/x86cpuid.nasm index 5f3599ce1b2f..a0ca9aeadc98 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/x86cpuid.nasm +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/IA32-MSFT/crypto/x86cpuid.nasm @@ -123,6 +123,24 @@ L$002generic: xor ecx,ecx cpuid mov DWORD [8+edi],ebx + mov DWORD [12+edi],ecx + mov DWORD [16+edi],edx + cmp eax,1 + jb NEAR L$005no_extended_info + mov eax,7 + mov ecx,1 + cpuid + mov DWORD [20+edi],eax + mov DWORD [24+edi],edx + mov DWORD [28+edi],ebx + mov DWORD [32+edi],ecx + and edx,524288 + cmp edx,0 + je NEAR L$005no_extended_info + mov eax,36 + mov ecx,0 + cpuid + mov DWORD [36+edi],ebx L$005no_extended_info: bt ebp,27 jnc NEAR L$006clear_avx @@ -138,6 +156,7 @@ L$008clear_xmm: and esi,4278190079 L$006clear_avx: and ebp,4026525695 + and DWORD [20+edi],4286578687 and DWORD [8+edi],4294967263 L$007done: mov eax,esi @@ -500,7 +519,7 @@ L$031done: pop edi ret segment .bss -common _OPENSSL_ia32cap_P 16 +common _OPENSSL_ia32cap_P 40 segment .CRT$XCU data align=4 extern _OPENSSL_cpuid_setup dd _OPENSSL_cpuid_setup diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/aes/aesni-xts-avx512.s b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/aes/aesni-xts-avx512.s new file mode 100644 index 000000000000..a07316de2d3b --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/aes/aesni-xts-avx512.s @@ -0,0 +1,8145 @@ +.text + +.globl aesni_xts_avx512_eligible +.type aesni_xts_avx512_eligible,@function +.align 32 +aesni_xts_avx512_eligible: + movl OPENSSL_ia32cap_P+8(%rip),%ecx + xorl %eax,%eax + + andl $0xc0030000,%ecx + cmpl $0xc0030000,%ecx + jne .L_done + movl OPENSSL_ia32cap_P+12(%rip),%ecx + + andl $0x640,%ecx + cmpl $0x640,%ecx + cmovel %ecx,%eax +.L_done: + .byte 0xf3,0xc3 +.size aesni_xts_avx512_eligible, .-aesni_xts_avx512_eligible +.globl aesni_xts_128_encrypt_avx512 +.hidden aesni_xts_128_encrypt_avx512 +.type aesni_xts_128_encrypt_avx512,@function +.align 32 +aesni_xts_128_encrypt_avx512: +.cfi_startproc +.byte 243,15,30,250 + pushq %rbp + movq %rsp,%rbp + subq $136,%rsp + andq $0xffffffffffffffc0,%rsp + movq %rbx,128(%rsp) + movq $0x87,%r10 + vmovdqu (%r9),%xmm1 + vpxor (%r8),%xmm1,%xmm1 + vaesenc 16(%r8),%xmm1,%xmm1 + vaesenc 32(%r8),%xmm1,%xmm1 + vaesenc 48(%r8),%xmm1,%xmm1 + vaesenc 64(%r8),%xmm1,%xmm1 + vaesenc 80(%r8),%xmm1,%xmm1 + vaesenc 96(%r8),%xmm1,%xmm1 + vaesenc 112(%r8),%xmm1,%xmm1 + vaesenc 128(%r8),%xmm1,%xmm1 + vaesenc 144(%r8),%xmm1,%xmm1 + vaesenclast 160(%r8),%xmm1,%xmm1 + vmovdqa %xmm1,(%rsp) + + cmpq $0x80,%rdx + jl .L_less_than_128_bytes_hEgxyDlCngwrfFe + vpbroadcastq %r10,%zmm25 + cmpq $0x100,%rdx + jge .L_start_by16_hEgxyDlCngwrfFe + cmpq $0x80,%rdx + jge .L_start_by8_hEgxyDlCngwrfFe + +.L_do_n_blocks_hEgxyDlCngwrfFe: + cmpq $0x0,%rdx + je .L_ret_hEgxyDlCngwrfFe + cmpq $0x70,%rdx + jge .L_remaining_num_blocks_is_7_hEgxyDlCngwrfFe + cmpq $0x60,%rdx + jge .L_remaining_num_blocks_is_6_hEgxyDlCngwrfFe + cmpq $0x50,%rdx + jge .L_remaining_num_blocks_is_5_hEgxyDlCngwrfFe + cmpq $0x40,%rdx + jge .L_remaining_num_blocks_is_4_hEgxyDlCngwrfFe + cmpq $0x30,%rdx + jge .L_remaining_num_blocks_is_3_hEgxyDlCngwrfFe + cmpq $0x20,%rdx + jge .L_remaining_num_blocks_is_2_hEgxyDlCngwrfFe + cmpq $0x10,%rdx + jge .L_remaining_num_blocks_is_1_hEgxyDlCngwrfFe + vmovdqa %xmm0,%xmm8 + vmovdqa %xmm9,%xmm0 + jmp .L_steal_cipher_hEgxyDlCngwrfFe + +.L_remaining_num_blocks_is_7_hEgxyDlCngwrfFe: + movq $0x0000ffffffffffff,%r8 + kmovq %r8,%k1 + vmovdqu8 (%rdi),%zmm1 + vmovdqu8 64(%rdi),%zmm2{%k1} + addq $0x70,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vpternlogq $0x96,%zmm0,%zmm10,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vaesenclast %zmm0,%zmm2,%zmm2 + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %zmm2,64(%rsi){%k1} + addq $0x70,%rsi + vextracti32x4 $0x2,%zmm2,%xmm8 + vextracti32x4 $0x3,%zmm10,%xmm0 + andq $0xf,%rdx + je .L_ret_hEgxyDlCngwrfFe + jmp .L_steal_cipher_hEgxyDlCngwrfFe + +.L_remaining_num_blocks_is_6_hEgxyDlCngwrfFe: + vmovdqu8 (%rdi),%zmm1 + vmovdqu8 64(%rdi),%ymm2 + addq $0x60,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vpternlogq $0x96,%zmm0,%zmm10,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vaesenclast %zmm0,%zmm2,%zmm2 + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %ymm2,64(%rsi) + addq $0x60,%rsi + vextracti32x4 $0x1,%zmm2,%xmm8 + vextracti32x4 $0x2,%zmm10,%xmm0 + andq $0xf,%rdx + je .L_ret_hEgxyDlCngwrfFe + jmp .L_steal_cipher_hEgxyDlCngwrfFe + +.L_remaining_num_blocks_is_5_hEgxyDlCngwrfFe: + vmovdqu8 (%rdi),%zmm1 + vmovdqu 64(%rdi),%xmm2 + addq $0x50,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vpternlogq $0x96,%zmm0,%zmm10,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vaesenclast %zmm0,%zmm2,%zmm2 + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vmovdqu8 %zmm1,(%rsi) + vmovdqu %xmm2,64(%rsi) + addq $0x50,%rsi + vmovdqa %xmm2,%xmm8 + vextracti32x4 $0x1,%zmm10,%xmm0 + andq $0xf,%rdx + je .L_ret_hEgxyDlCngwrfFe + jmp .L_steal_cipher_hEgxyDlCngwrfFe + +.L_remaining_num_blocks_is_4_hEgxyDlCngwrfFe: + vmovdqu8 (%rdi),%zmm1 + addq $0x40,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vpxorq %zmm9,%zmm1,%zmm1 + vmovdqu8 %zmm1,(%rsi) + addq $0x40,%rsi + vextracti32x4 $0x3,%zmm1,%xmm8 + vmovdqa64 %xmm10,%xmm0 + andq $0xf,%rdx + je .L_ret_hEgxyDlCngwrfFe + jmp .L_steal_cipher_hEgxyDlCngwrfFe +.L_remaining_num_blocks_is_3_hEgxyDlCngwrfFe: + movq $-1,%r8 + shrq $0x10,%r8 + kmovq %r8,%k1 + vmovdqu8 (%rdi),%zmm1{%k1} + addq $0x30,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vpxorq %zmm9,%zmm1,%zmm1 + vmovdqu8 %zmm1,(%rsi){%k1} + addq $0x30,%rsi + vextracti32x4 $0x2,%zmm1,%xmm8 + vextracti32x4 $0x3,%zmm9,%xmm0 + andq $0xf,%rdx + je .L_ret_hEgxyDlCngwrfFe + jmp .L_steal_cipher_hEgxyDlCngwrfFe +.L_remaining_num_blocks_is_2_hEgxyDlCngwrfFe: + vmovdqu8 (%rdi),%ymm1 + addq $0x20,%rdi + vbroadcasti32x4 (%rcx),%ymm0 + vpternlogq $0x96,%ymm0,%ymm9,%ymm1 + vbroadcasti32x4 16(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 32(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 48(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 64(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 80(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 96(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 112(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 128(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 144(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 160(%rcx),%ymm0 + vaesenclast %ymm0,%ymm1,%ymm1 + vpxorq %ymm9,%ymm1,%ymm1 + vmovdqu %ymm1,(%rsi) + addq $0x20,%rsi + vextracti32x4 $0x1,%zmm1,%xmm8 + vextracti32x4 $0x2,%zmm9,%xmm0 + andq $0xf,%rdx + je .L_ret_hEgxyDlCngwrfFe + jmp .L_steal_cipher_hEgxyDlCngwrfFe +.L_remaining_num_blocks_is_1_hEgxyDlCngwrfFe: + vmovdqu (%rdi),%xmm1 + addq $0x10,%rdi + vpxor %xmm9,%xmm1,%xmm1 + vpxor (%rcx),%xmm1,%xmm1 + vaesenc 16(%rcx),%xmm1,%xmm1 + vaesenc 32(%rcx),%xmm1,%xmm1 + vaesenc 48(%rcx),%xmm1,%xmm1 + vaesenc 64(%rcx),%xmm1,%xmm1 + vaesenc 80(%rcx),%xmm1,%xmm1 + vaesenc 96(%rcx),%xmm1,%xmm1 + vaesenc 112(%rcx),%xmm1,%xmm1 + vaesenc 128(%rcx),%xmm1,%xmm1 + vaesenc 144(%rcx),%xmm1,%xmm1 + vaesenclast 160(%rcx),%xmm1,%xmm1 + vpxor %xmm9,%xmm1,%xmm1 + vmovdqu %xmm1,(%rsi) + addq $0x10,%rsi + vmovdqa %xmm1,%xmm8 + vextracti32x4 $0x1,%zmm9,%xmm0 + andq $0xf,%rdx + je .L_ret_hEgxyDlCngwrfFe + jmp .L_steal_cipher_hEgxyDlCngwrfFe + + +.L_start_by16_hEgxyDlCngwrfFe: + vbroadcasti32x4 (%rsp),%zmm0 + vbroadcasti32x4 shufb_15_7(%rip),%zmm8 + movq $0xaa,%r8 + kmovq %r8,%k2 + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x0,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + vpsllvq const_dq7654(%rip),%zmm0,%zmm5 + vpsrlvq const_dq1234(%rip),%zmm1,%zmm6 + vpclmulqdq $0x0,%zmm25,%zmm6,%zmm7 + vpxorq %zmm6,%zmm5,%zmm5{%k2} + vpxord %zmm5,%zmm7,%zmm10 + vpsrldq $0xf,%zmm9,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm9,%zmm11 + vpxord %zmm14,%zmm11,%zmm11 + vpsrldq $0xf,%zmm10,%zmm15 + vpclmulqdq $0x0,%zmm25,%zmm15,%zmm16 + vpslldq $0x1,%zmm10,%zmm12 + vpxord %zmm16,%zmm12,%zmm12 + +.L_main_loop_run_16_hEgxyDlCngwrfFe: + vmovdqu8 (%rdi),%zmm1 + vmovdqu8 64(%rdi),%zmm2 + vmovdqu8 128(%rdi),%zmm3 + vmovdqu8 192(%rdi),%zmm4 + addq $0x100,%rdi + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vpxorq %zmm11,%zmm3,%zmm3 + vpxorq %zmm12,%zmm4,%zmm4 + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vpxorq %zmm0,%zmm3,%zmm3 + vpxorq %zmm0,%zmm4,%zmm4 + vpsrldq $0xf,%zmm11,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm11,%zmm15 + vpxord %zmm14,%zmm15,%zmm15 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vpsrldq $0xf,%zmm12,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm12,%zmm16 + vpxord %zmm14,%zmm16,%zmm16 + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vpsrldq $0xf,%zmm15,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm15,%zmm17 + vpxord %zmm14,%zmm17,%zmm17 + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vpsrldq $0xf,%zmm16,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm16,%zmm18 + vpxord %zmm14,%zmm18,%zmm18 + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vaesenclast %zmm0,%zmm2,%zmm2 + vaesenclast %zmm0,%zmm3,%zmm3 + vaesenclast %zmm0,%zmm4,%zmm4 + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vpxorq %zmm11,%zmm3,%zmm3 + vpxorq %zmm12,%zmm4,%zmm4 + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqa32 %zmm17,%zmm11 + vmovdqa32 %zmm18,%zmm12 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %zmm2,64(%rsi) + vmovdqu8 %zmm3,128(%rsi) + vmovdqu8 %zmm4,192(%rsi) + addq $0x100,%rsi + subq $0x100,%rdx + cmpq $0x100,%rdx + jae .L_main_loop_run_16_hEgxyDlCngwrfFe + cmpq $0x80,%rdx + jae .L_main_loop_run_8_hEgxyDlCngwrfFe + vextracti32x4 $0x3,%zmm4,%xmm0 + jmp .L_do_n_blocks_hEgxyDlCngwrfFe + +.L_start_by8_hEgxyDlCngwrfFe: + vbroadcasti32x4 (%rsp),%zmm0 + vbroadcasti32x4 shufb_15_7(%rip),%zmm8 + movq $0xaa,%r8 + kmovq %r8,%k2 + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x0,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + vpsllvq const_dq7654(%rip),%zmm0,%zmm5 + vpsrlvq const_dq1234(%rip),%zmm1,%zmm6 + vpclmulqdq $0x0,%zmm25,%zmm6,%zmm7 + vpxorq %zmm6,%zmm5,%zmm5{%k2} + vpxord %zmm5,%zmm7,%zmm10 + +.L_main_loop_run_8_hEgxyDlCngwrfFe: + vmovdqu8 (%rdi),%zmm1 + vmovdqu8 64(%rdi),%zmm2 + addq $0x80,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vpternlogq $0x96,%zmm0,%zmm10,%zmm2 + vpsrldq $0xf,%zmm9,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm9,%zmm15 + vpxord %zmm14,%zmm15,%zmm15 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vpsrldq $0xf,%zmm10,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm10,%zmm16 + vpxord %zmm14,%zmm16,%zmm16 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vaesenclast %zmm0,%zmm2,%zmm2 + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %zmm2,64(%rsi) + addq $0x80,%rsi + subq $0x80,%rdx + cmpq $0x80,%rdx + jae .L_main_loop_run_8_hEgxyDlCngwrfFe + vextracti32x4 $0x3,%zmm2,%xmm0 + jmp .L_do_n_blocks_hEgxyDlCngwrfFe + +.L_steal_cipher_hEgxyDlCngwrfFe: + vmovdqa %xmm8,%xmm2 + leaq vpshufb_shf_table(%rip),%rax + vmovdqu (%rax,%rdx,1),%xmm10 + vpshufb %xmm10,%xmm8,%xmm8 + vmovdqu -16(%rdi,%rdx,1),%xmm3 + vmovdqu %xmm8,-16(%rsi,%rdx,1) + leaq vpshufb_shf_table(%rip),%rax + addq $16,%rax + subq %rdx,%rax + vmovdqu (%rax),%xmm10 + vpxor mask1(%rip),%xmm10,%xmm10 + vpshufb %xmm10,%xmm3,%xmm3 + vpblendvb %xmm10,%xmm2,%xmm3,%xmm3 + vpxor %xmm0,%xmm3,%xmm8 + vpxor (%rcx),%xmm8,%xmm8 + vaesenc 16(%rcx),%xmm8,%xmm8 + vaesenc 32(%rcx),%xmm8,%xmm8 + vaesenc 48(%rcx),%xmm8,%xmm8 + vaesenc 64(%rcx),%xmm8,%xmm8 + vaesenc 80(%rcx),%xmm8,%xmm8 + vaesenc 96(%rcx),%xmm8,%xmm8 + vaesenc 112(%rcx),%xmm8,%xmm8 + vaesenc 128(%rcx),%xmm8,%xmm8 + vaesenc 144(%rcx),%xmm8,%xmm8 + vaesenclast 160(%rcx),%xmm8,%xmm8 + vpxor %xmm0,%xmm8,%xmm8 + vmovdqu %xmm8,-16(%rsi) +.L_ret_hEgxyDlCngwrfFe: + movq 128(%rsp),%rbx + xorq %r8,%r8 + movq %r8,128(%rsp) + + vpxorq %zmm0,%zmm0,%zmm0 + movq %rbp,%rsp + popq %rbp + vzeroupper + .byte 0xf3,0xc3 + +.L_less_than_128_bytes_hEgxyDlCngwrfFe: + vpbroadcastq %r10,%zmm25 + cmpq $0x10,%rdx + jb .L_ret_hEgxyDlCngwrfFe + vbroadcasti32x4 (%rsp),%zmm0 + vbroadcasti32x4 shufb_15_7(%rip),%zmm8 + movl $0xaa,%r8d + kmovq %r8,%k2 + movq %rdx,%r8 + andq $0x70,%r8 + cmpq $0x60,%r8 + je .L_num_blocks_is_6_hEgxyDlCngwrfFe + cmpq $0x50,%r8 + je .L_num_blocks_is_5_hEgxyDlCngwrfFe + cmpq $0x40,%r8 + je .L_num_blocks_is_4_hEgxyDlCngwrfFe + cmpq $0x30,%r8 + je .L_num_blocks_is_3_hEgxyDlCngwrfFe + cmpq $0x20,%r8 + je .L_num_blocks_is_2_hEgxyDlCngwrfFe + cmpq $0x10,%r8 + je .L_num_blocks_is_1_hEgxyDlCngwrfFe + +.L_num_blocks_is_7_hEgxyDlCngwrfFe: + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + vpsllvq const_dq7654(%rip),%zmm0,%zmm5 + vpsrlvq const_dq1234(%rip),%zmm1,%zmm6 + vpclmulqdq $0x00,%zmm25,%zmm6,%zmm7 + vpxorq %zmm6,%zmm5,%zmm5{%k2} + vpxord %zmm5,%zmm7,%zmm10 + movq $0x0000ffffffffffff,%r8 + kmovq %r8,%k1 + vmovdqu8 0(%rdi),%zmm1 + vmovdqu8 64(%rdi),%zmm2{%k1} + + addq $0x70,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vpternlogq $0x96,%zmm0,%zmm10,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vaesenclast %zmm0,%zmm2,%zmm2 + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vmovdqu8 %zmm1,0(%rsi) + vmovdqu8 %zmm2,64(%rsi){%k1} + addq $0x70,%rsi + vextracti32x4 $0x2,%zmm2,%xmm8 + vextracti32x4 $0x3,%zmm10,%xmm0 + andq $0xf,%rdx + je .L_ret_hEgxyDlCngwrfFe + jmp .L_steal_cipher_hEgxyDlCngwrfFe +.L_num_blocks_is_6_hEgxyDlCngwrfFe: + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + vpsllvq const_dq7654(%rip),%zmm0,%zmm5 + vpsrlvq const_dq1234(%rip),%zmm1,%zmm6 + vpclmulqdq $0x00,%zmm25,%zmm6,%zmm7 + vpxorq %zmm6,%zmm5,%zmm5{%k2} + vpxord %zmm5,%zmm7,%zmm10 + vmovdqu8 0(%rdi),%zmm1 + vmovdqu8 64(%rdi),%ymm2 + addq $96,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vpternlogq $0x96,%zmm0,%zmm10,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vaesenclast %zmm0,%zmm2,%zmm2 + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vmovdqu8 %zmm1,0(%rsi) + vmovdqu8 %ymm2,64(%rsi) + addq $96,%rsi + + vextracti32x4 $0x1,%ymm2,%xmm8 + vextracti32x4 $0x2,%zmm10,%xmm0 + andq $0xf,%rdx + je .L_ret_hEgxyDlCngwrfFe + jmp .L_steal_cipher_hEgxyDlCngwrfFe +.L_num_blocks_is_5_hEgxyDlCngwrfFe: + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + vpsllvq const_dq7654(%rip),%zmm0,%zmm5 + vpsrlvq const_dq1234(%rip),%zmm1,%zmm6 + vpclmulqdq $0x00,%zmm25,%zmm6,%zmm7 + vpxorq %zmm6,%zmm5,%zmm5{%k2} + vpxord %zmm5,%zmm7,%zmm10 + vmovdqu8 0(%rdi),%zmm1 + vmovdqu8 64(%rdi),%xmm2 + addq $80,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vpternlogq $0x96,%zmm0,%zmm10,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vaesenclast %zmm0,%zmm2,%zmm2 + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vmovdqu8 %zmm1,0(%rsi) + vmovdqu8 %xmm2,64(%rsi) + addq $80,%rsi + + vmovdqa %xmm2,%xmm8 + vextracti32x4 $0x1,%zmm10,%xmm0 + andq $0xf,%rdx + je .L_ret_hEgxyDlCngwrfFe + jmp .L_steal_cipher_hEgxyDlCngwrfFe +.L_num_blocks_is_4_hEgxyDlCngwrfFe: + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + vpsllvq const_dq7654(%rip),%zmm0,%zmm5 + vpsrlvq const_dq1234(%rip),%zmm1,%zmm6 + vpclmulqdq $0x00,%zmm25,%zmm6,%zmm7 + vpxorq %zmm6,%zmm5,%zmm5{%k2} + vpxord %zmm5,%zmm7,%zmm10 + vmovdqu8 0(%rdi),%zmm1 + addq $64,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vpxorq %zmm9,%zmm1,%zmm1 + vmovdqu8 %zmm1,0(%rsi) + addq $64,%rsi + vextracti32x4 $0x3,%zmm1,%xmm8 + vmovdqa %xmm10,%xmm0 + andq $0xf,%rdx + je .L_ret_hEgxyDlCngwrfFe + jmp .L_steal_cipher_hEgxyDlCngwrfFe +.L_num_blocks_is_3_hEgxyDlCngwrfFe: + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + movq $0x0000ffffffffffff,%r8 + kmovq %r8,%k1 + vmovdqu8 0(%rdi),%zmm1{%k1} + addq $48,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vpxorq %zmm9,%zmm1,%zmm1 + vmovdqu8 %zmm1,0(%rsi){%k1} + addq $48,%rsi + vextracti32x4 $2,%zmm1,%xmm8 + vextracti32x4 $3,%zmm9,%xmm0 + andq $0xf,%rdx + je .L_ret_hEgxyDlCngwrfFe + jmp .L_steal_cipher_hEgxyDlCngwrfFe +.L_num_blocks_is_2_hEgxyDlCngwrfFe: + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + + vmovdqu8 0(%rdi),%ymm1 + addq $32,%rdi + vbroadcasti32x4 (%rcx),%ymm0 + vpternlogq $0x96,%ymm0,%ymm9,%ymm1 + vbroadcasti32x4 16(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 32(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 48(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 64(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 80(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 96(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 112(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 128(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 144(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 160(%rcx),%ymm0 + vaesenclast %ymm0,%ymm1,%ymm1 + vpxorq %ymm9,%ymm1,%ymm1 + vmovdqu8 %ymm1,0(%rsi) + addq $32,%rsi + + vextracti32x4 $1,%ymm1,%xmm8 + vextracti32x4 $2,%zmm9,%xmm0 + andq $0xf,%rdx + je .L_ret_hEgxyDlCngwrfFe + jmp .L_steal_cipher_hEgxyDlCngwrfFe +.L_num_blocks_is_1_hEgxyDlCngwrfFe: + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + + vmovdqu8 0(%rdi),%xmm1 + addq $16,%rdi + vbroadcasti32x4 (%rcx),%ymm0 + vpternlogq $0x96,%ymm0,%ymm9,%ymm1 + vbroadcasti32x4 16(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 32(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 48(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 64(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 80(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 96(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 112(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 128(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 144(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 160(%rcx),%ymm0 + vaesenclast %ymm0,%ymm1,%ymm1 + vpxorq %ymm9,%ymm1,%ymm1 + vmovdqu8 %xmm1,0(%rsi) + addq $16,%rsi + + vmovdqa %xmm1,%xmm8 + vextracti32x4 $1,%zmm9,%xmm0 + andq $0xf,%rdx + je .L_ret_hEgxyDlCngwrfFe + jmp .L_steal_cipher_hEgxyDlCngwrfFe +.cfi_endproc +.globl aesni_xts_128_decrypt_avx512 +.hidden aesni_xts_128_decrypt_avx512 +.type aesni_xts_128_decrypt_avx512,@function +.align 32 +aesni_xts_128_decrypt_avx512: +.cfi_startproc +.byte 243,15,30,250 + pushq %rbp + movq %rsp,%rbp + subq $136,%rsp + andq $0xffffffffffffffc0,%rsp + movq %rbx,128(%rsp) + movq $0x87,%r10 + vmovdqu (%r9),%xmm1 + vpxor (%r8),%xmm1,%xmm1 + vaesenc 16(%r8),%xmm1,%xmm1 + vaesenc 32(%r8),%xmm1,%xmm1 + vaesenc 48(%r8),%xmm1,%xmm1 + vaesenc 64(%r8),%xmm1,%xmm1 + vaesenc 80(%r8),%xmm1,%xmm1 + vaesenc 96(%r8),%xmm1,%xmm1 + vaesenc 112(%r8),%xmm1,%xmm1 + vaesenc 128(%r8),%xmm1,%xmm1 + vaesenc 144(%r8),%xmm1,%xmm1 + vaesenclast 160(%r8),%xmm1,%xmm1 + vmovdqa %xmm1,(%rsp) + + cmpq $0x80,%rdx + jb .L_less_than_128_bytes_amivrujEyduiFoi + vpbroadcastq %r10,%zmm25 + cmpq $0x100,%rdx + jge .L_start_by16_amivrujEyduiFoi + jmp .L_start_by8_amivrujEyduiFoi + +.L_do_n_blocks_amivrujEyduiFoi: + cmpq $0x0,%rdx + je .L_ret_amivrujEyduiFoi + cmpq $0x70,%rdx + jge .L_remaining_num_blocks_is_7_amivrujEyduiFoi + cmpq $0x60,%rdx + jge .L_remaining_num_blocks_is_6_amivrujEyduiFoi + cmpq $0x50,%rdx + jge .L_remaining_num_blocks_is_5_amivrujEyduiFoi + cmpq $0x40,%rdx + jge .L_remaining_num_blocks_is_4_amivrujEyduiFoi + cmpq $0x30,%rdx + jge .L_remaining_num_blocks_is_3_amivrujEyduiFoi + cmpq $0x20,%rdx + jge .L_remaining_num_blocks_is_2_amivrujEyduiFoi + cmpq $0x10,%rdx + jge .L_remaining_num_blocks_is_1_amivrujEyduiFoi + + + vmovdqu %xmm5,%xmm1 + + vpxor %xmm9,%xmm1,%xmm1 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vpxor %xmm9,%xmm1,%xmm1 + vmovdqu %xmm1,-16(%rsi) + vmovdqa %xmm1,%xmm8 + + + movq $0x1,%r8 + kmovq %r8,%k1 + vpsllq $0x3f,%xmm9,%xmm13 + vpsraq $0x3f,%xmm13,%xmm14 + vpandq %xmm25,%xmm14,%xmm5 + vpxorq %xmm5,%xmm9,%xmm9{%k1} + vpsrldq $0x8,%xmm9,%xmm10 +.byte 98, 211, 181, 8, 115, 194, 1 + vpslldq $0x8,%xmm13,%xmm13 + vpxorq %xmm13,%xmm0,%xmm0 + jmp .L_steal_cipher_amivrujEyduiFoi + +.L_remaining_num_blocks_is_7_amivrujEyduiFoi: + movq $0xffffffffffffffff,%r8 + shrq $0x10,%r8 + kmovq %r8,%k1 + vmovdqu8 (%rdi),%zmm1 + vmovdqu8 64(%rdi),%zmm2{%k1} + addq $0x70,%rdi + andq $0xf,%rdx + je .L_done_7_remain_amivrujEyduiFoi + vextracti32x4 $0x2,%zmm10,%xmm12 + vextracti32x4 $0x3,%zmm10,%xmm13 + vinserti32x4 $0x2,%xmm13,%zmm10,%zmm10 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %zmm2,64(%rsi){%k1} + addq $0x70,%rsi + vextracti32x4 $0x2,%zmm2,%xmm8 + vmovdqa %xmm12,%xmm0 + jmp .L_steal_cipher_amivrujEyduiFoi + +.L_done_7_remain_amivrujEyduiFoi: + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %zmm2,64(%rsi){%k1} + jmp .L_ret_amivrujEyduiFoi + +.L_remaining_num_blocks_is_6_amivrujEyduiFoi: + vmovdqu8 (%rdi),%zmm1 + vmovdqu8 64(%rdi),%ymm2 + addq $0x60,%rdi + andq $0xf,%rdx + je .L_done_6_remain_amivrujEyduiFoi + vextracti32x4 $0x1,%zmm10,%xmm12 + vextracti32x4 $0x2,%zmm10,%xmm13 + vinserti32x4 $0x1,%xmm13,%zmm10,%zmm10 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %ymm2,64(%rsi) + addq $0x60,%rsi + vextracti32x4 $0x1,%zmm2,%xmm8 + vmovdqa %xmm12,%xmm0 + jmp .L_steal_cipher_amivrujEyduiFoi + +.L_done_6_remain_amivrujEyduiFoi: + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %ymm2,64(%rsi) + jmp .L_ret_amivrujEyduiFoi + +.L_remaining_num_blocks_is_5_amivrujEyduiFoi: + vmovdqu8 (%rdi),%zmm1 + vmovdqu 64(%rdi),%xmm2 + addq $0x50,%rdi + andq $0xf,%rdx + je .L_done_5_remain_amivrujEyduiFoi + vmovdqa %xmm10,%xmm12 + vextracti32x4 $0x1,%zmm10,%xmm10 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + vmovdqu %xmm2,64(%rsi) + addq $0x50,%rsi + vmovdqa %xmm2,%xmm8 + vmovdqa %xmm12,%xmm0 + jmp .L_steal_cipher_amivrujEyduiFoi + +.L_done_5_remain_amivrujEyduiFoi: + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %xmm2,64(%rsi) + jmp .L_ret_amivrujEyduiFoi + +.L_remaining_num_blocks_is_4_amivrujEyduiFoi: + vmovdqu8 (%rdi),%zmm1 + addq $0x40,%rdi + andq $0xf,%rdx + je .L_done_4_remain_amivrujEyduiFoi + vextracti32x4 $0x3,%zmm9,%xmm12 + vinserti32x4 $0x3,%xmm10,%zmm9,%zmm9 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + addq $0x40,%rsi + vextracti32x4 $0x3,%zmm1,%xmm8 + vmovdqa %xmm12,%xmm0 + jmp .L_steal_cipher_amivrujEyduiFoi + +.L_done_4_remain_amivrujEyduiFoi: + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + jmp .L_ret_amivrujEyduiFoi + +.L_remaining_num_blocks_is_3_amivrujEyduiFoi: + vmovdqu (%rdi),%xmm1 + vmovdqu 16(%rdi),%xmm2 + vmovdqu 32(%rdi),%xmm3 + addq $0x30,%rdi + andq $0xf,%rdx + je .L_done_3_remain_amivrujEyduiFoi + vextracti32x4 $0x2,%zmm9,%xmm13 + vextracti32x4 $0x1,%zmm9,%xmm10 + vextracti32x4 $0x3,%zmm9,%xmm11 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + addq $0x30,%rsi + vmovdqa %xmm3,%xmm8 + vmovdqa %xmm13,%xmm0 + jmp .L_steal_cipher_amivrujEyduiFoi + +.L_done_3_remain_amivrujEyduiFoi: + vextracti32x4 $0x1,%zmm9,%xmm10 + vextracti32x4 $0x2,%zmm9,%xmm11 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + jmp .L_ret_amivrujEyduiFoi + +.L_remaining_num_blocks_is_2_amivrujEyduiFoi: + vmovdqu (%rdi),%xmm1 + vmovdqu 16(%rdi),%xmm2 + addq $0x20,%rdi + andq $0xf,%rdx + je .L_done_2_remain_amivrujEyduiFoi + vextracti32x4 $0x2,%zmm9,%xmm10 + vextracti32x4 $0x1,%zmm9,%xmm12 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + addq $0x20,%rsi + vmovdqa %xmm2,%xmm8 + vmovdqa %xmm12,%xmm0 + jmp .L_steal_cipher_amivrujEyduiFoi + +.L_done_2_remain_amivrujEyduiFoi: + vextracti32x4 $0x1,%zmm9,%xmm10 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + jmp .L_ret_amivrujEyduiFoi + +.L_remaining_num_blocks_is_1_amivrujEyduiFoi: + vmovdqu (%rdi),%xmm1 + addq $0x10,%rdi + andq $0xf,%rdx + je .L_done_1_remain_amivrujEyduiFoi + vextracti32x4 $0x1,%zmm9,%xmm11 + vpxor %xmm11,%xmm1,%xmm1 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vpxor %xmm11,%xmm1,%xmm1 + vmovdqu %xmm1,(%rsi) + addq $0x10,%rsi + vmovdqa %xmm1,%xmm8 + vmovdqa %xmm9,%xmm0 + jmp .L_steal_cipher_amivrujEyduiFoi + +.L_done_1_remain_amivrujEyduiFoi: + vpxor %xmm9,%xmm1,%xmm1 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vpxor %xmm9,%xmm1,%xmm1 + vmovdqu %xmm1,(%rsi) + jmp .L_ret_amivrujEyduiFoi + +.L_start_by16_amivrujEyduiFoi: + vbroadcasti32x4 (%rsp),%zmm0 + vbroadcasti32x4 shufb_15_7(%rip),%zmm8 + movq $0xaa,%r8 + kmovq %r8,%k2 + + + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x0,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + + + vpsllvq const_dq7654(%rip),%zmm0,%zmm5 + vpsrlvq const_dq1234(%rip),%zmm1,%zmm6 + vpclmulqdq $0x0,%zmm25,%zmm6,%zmm7 + vpxorq %zmm6,%zmm5,%zmm5{%k2} + vpxord %zmm5,%zmm7,%zmm10 + + + vpsrldq $0xf,%zmm9,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm9,%zmm11 + vpxord %zmm14,%zmm11,%zmm11 + + vpsrldq $0xf,%zmm10,%zmm15 + vpclmulqdq $0x0,%zmm25,%zmm15,%zmm16 + vpslldq $0x1,%zmm10,%zmm12 + vpxord %zmm16,%zmm12,%zmm12 + +.L_main_loop_run_16_amivrujEyduiFoi: + vmovdqu8 (%rdi),%zmm1 + vmovdqu8 64(%rdi),%zmm2 + vmovdqu8 128(%rdi),%zmm3 + vmovdqu8 192(%rdi),%zmm4 + vmovdqu8 240(%rdi),%xmm5 + addq $0x100,%rdi + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vpxorq %zmm11,%zmm3,%zmm3 + vpxorq %zmm12,%zmm4,%zmm4 + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vpxorq %zmm0,%zmm3,%zmm3 + vpxorq %zmm0,%zmm4,%zmm4 + vpsrldq $0xf,%zmm11,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm11,%zmm15 + vpxord %zmm14,%zmm15,%zmm15 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vpsrldq $0xf,%zmm12,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm12,%zmm16 + vpxord %zmm14,%zmm16,%zmm16 + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vpsrldq $0xf,%zmm15,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm15,%zmm17 + vpxord %zmm14,%zmm17,%zmm17 + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vpsrldq $0xf,%zmm16,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm16,%zmm18 + vpxord %zmm14,%zmm18,%zmm18 + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + vaesdeclast %zmm0,%zmm3,%zmm3 + vaesdeclast %zmm0,%zmm4,%zmm4 + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vpxorq %zmm11,%zmm3,%zmm3 + vpxorq %zmm12,%zmm4,%zmm4 + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqa32 %zmm17,%zmm11 + vmovdqa32 %zmm18,%zmm12 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %zmm2,64(%rsi) + vmovdqu8 %zmm3,128(%rsi) + vmovdqu8 %zmm4,192(%rsi) + addq $0x100,%rsi + subq $0x100,%rdx + cmpq $0x100,%rdx + jge .L_main_loop_run_16_amivrujEyduiFoi + + cmpq $0x80,%rdx + jge .L_main_loop_run_8_amivrujEyduiFoi + jmp .L_do_n_blocks_amivrujEyduiFoi + +.L_start_by8_amivrujEyduiFoi: + + vbroadcasti32x4 (%rsp),%zmm0 + vbroadcasti32x4 shufb_15_7(%rip),%zmm8 + movq $0xaa,%r8 + kmovq %r8,%k2 + + + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x0,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + + + vpsllvq const_dq7654(%rip),%zmm0,%zmm5 + vpsrlvq const_dq1234(%rip),%zmm1,%zmm6 + vpclmulqdq $0x0,%zmm25,%zmm6,%zmm7 + vpxorq %zmm6,%zmm5,%zmm5{%k2} + vpxord %zmm5,%zmm7,%zmm10 + +.L_main_loop_run_8_amivrujEyduiFoi: + vmovdqu8 (%rdi),%zmm1 + vmovdqu8 64(%rdi),%zmm2 + vmovdqu8 112(%rdi),%xmm5 + addq $0x80,%rdi + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vpsrldq $0xf,%zmm9,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm9,%zmm15 + vpxord %zmm14,%zmm15,%zmm15 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vpsrldq $0xf,%zmm10,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm10,%zmm16 + vpxord %zmm14,%zmm16,%zmm16 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %zmm2,64(%rsi) + addq $0x80,%rsi + subq $0x80,%rdx + cmpq $0x80,%rdx + jge .L_main_loop_run_8_amivrujEyduiFoi + jmp .L_do_n_blocks_amivrujEyduiFoi + +.L_steal_cipher_amivrujEyduiFoi: + + vmovdqa %xmm8,%xmm2 + + + leaq vpshufb_shf_table(%rip),%rax + vmovdqu (%rax,%rdx,1),%xmm10 + vpshufb %xmm10,%xmm8,%xmm8 + + + vmovdqu -16(%rdi,%rdx,1),%xmm3 + vmovdqu %xmm8,-16(%rsi,%rdx,1) + + + leaq vpshufb_shf_table(%rip),%rax + addq $16,%rax + subq %rdx,%rax + vmovdqu (%rax),%xmm10 + vpxor mask1(%rip),%xmm10,%xmm10 + vpshufb %xmm10,%xmm3,%xmm3 + + vpblendvb %xmm10,%xmm2,%xmm3,%xmm3 + + + vpxor %xmm0,%xmm3,%xmm8 + + + vpxor (%rcx),%xmm8,%xmm8 + vaesdec 16(%rcx),%xmm8,%xmm8 + vaesdec 32(%rcx),%xmm8,%xmm8 + vaesdec 48(%rcx),%xmm8,%xmm8 + vaesdec 64(%rcx),%xmm8,%xmm8 + vaesdec 80(%rcx),%xmm8,%xmm8 + vaesdec 96(%rcx),%xmm8,%xmm8 + vaesdec 112(%rcx),%xmm8,%xmm8 + vaesdec 128(%rcx),%xmm8,%xmm8 + vaesdec 144(%rcx),%xmm8,%xmm8 + vaesdeclast 160(%rcx),%xmm8,%xmm8 + + vpxor %xmm0,%xmm8,%xmm8 + +.L_done_amivrujEyduiFoi: + + vmovdqu %xmm8,-16(%rsi) +.L_ret_amivrujEyduiFoi: + movq 128(%rsp),%rbx + xorq %r8,%r8 + movq %r8,128(%rsp) + + vpxorq %zmm0,%zmm0,%zmm0 + movq %rbp,%rsp + popq %rbp + vzeroupper + .byte 0xf3,0xc3 + +.L_less_than_128_bytes_amivrujEyduiFoi: + cmpq $0x10,%rdx + jb .L_ret_amivrujEyduiFoi + + movq %rdx,%r8 + andq $0x70,%r8 + cmpq $0x60,%r8 + je .L_num_blocks_is_6_amivrujEyduiFoi + cmpq $0x50,%r8 + je .L_num_blocks_is_5_amivrujEyduiFoi + cmpq $0x40,%r8 + je .L_num_blocks_is_4_amivrujEyduiFoi + cmpq $0x30,%r8 + je .L_num_blocks_is_3_amivrujEyduiFoi + cmpq $0x20,%r8 + je .L_num_blocks_is_2_amivrujEyduiFoi + cmpq $0x10,%r8 + je .L_num_blocks_is_1_amivrujEyduiFoi + +.L_num_blocks_is_7_amivrujEyduiFoi: + vmovdqa 0(%rsp),%xmm9 + movq 0(%rsp),%rax + movq 8(%rsp),%rbx + vmovdqu 0(%rdi),%xmm1 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,16 + 8(%rsp) + vmovdqa 16(%rsp),%xmm10 + vmovdqu 16(%rdi),%xmm2 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,32(%rsp) + movq %rbx,32 + 8(%rsp) + vmovdqa 32(%rsp),%xmm11 + vmovdqu 32(%rdi),%xmm3 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,48(%rsp) + movq %rbx,48 + 8(%rsp) + vmovdqa 48(%rsp),%xmm12 + vmovdqu 48(%rdi),%xmm4 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,64(%rsp) + movq %rbx,64 + 8(%rsp) + vmovdqa 64(%rsp),%xmm13 + vmovdqu 64(%rdi),%xmm5 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,80(%rsp) + movq %rbx,80 + 8(%rsp) + vmovdqa 80(%rsp),%xmm14 + vmovdqu 80(%rdi),%xmm6 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,96(%rsp) + movq %rbx,96 + 8(%rsp) + vmovdqa 96(%rsp),%xmm15 + vmovdqu 96(%rdi),%xmm7 + addq $0x70,%rdi + andq $0xf,%rdx + je .L_done_7_amivrujEyduiFoi + +.L_steal_cipher_7_amivrujEyduiFoi: + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,24(%rsp) + vmovdqa64 %xmm15,%xmm16 + vmovdqa 16(%rsp),%xmm15 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vpxor %xmm14,%xmm6,%xmm6 + vpxor %xmm15,%xmm7,%xmm7 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vpxor %xmm0,%xmm4,%xmm4 + vpxor %xmm0,%xmm5,%xmm5 + vpxor %xmm0,%xmm6,%xmm6 + vpxor %xmm0,%xmm7,%xmm7 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vaesdeclast %xmm0,%xmm4,%xmm4 + vaesdeclast %xmm0,%xmm5,%xmm5 + vaesdeclast %xmm0,%xmm6,%xmm6 + vaesdeclast %xmm0,%xmm7,%xmm7 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vpxor %xmm14,%xmm6,%xmm6 + vpxor %xmm15,%xmm7,%xmm7 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + vmovdqu %xmm4,48(%rsi) + vmovdqu %xmm5,64(%rsi) + vmovdqu %xmm6,80(%rsi) + addq $0x70,%rsi + vmovdqa64 %xmm16,%xmm0 + vmovdqa %xmm7,%xmm8 + jmp .L_steal_cipher_amivrujEyduiFoi + +.L_done_7_amivrujEyduiFoi: + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vpxor %xmm14,%xmm6,%xmm6 + vpxor %xmm15,%xmm7,%xmm7 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vpxor %xmm0,%xmm4,%xmm4 + vpxor %xmm0,%xmm5,%xmm5 + vpxor %xmm0,%xmm6,%xmm6 + vpxor %xmm0,%xmm7,%xmm7 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vaesdeclast %xmm0,%xmm4,%xmm4 + vaesdeclast %xmm0,%xmm5,%xmm5 + vaesdeclast %xmm0,%xmm6,%xmm6 + vaesdeclast %xmm0,%xmm7,%xmm7 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vpxor %xmm14,%xmm6,%xmm6 + vpxor %xmm15,%xmm7,%xmm7 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + vmovdqu %xmm4,48(%rsi) + vmovdqu %xmm5,64(%rsi) + vmovdqu %xmm6,80(%rsi) + addq $0x70,%rsi + vmovdqa %xmm7,%xmm8 + jmp .L_done_amivrujEyduiFoi + +.L_num_blocks_is_6_amivrujEyduiFoi: + vmovdqa 0(%rsp),%xmm9 + movq 0(%rsp),%rax + movq 8(%rsp),%rbx + vmovdqu 0(%rdi),%xmm1 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,16 + 8(%rsp) + vmovdqa 16(%rsp),%xmm10 + vmovdqu 16(%rdi),%xmm2 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,32(%rsp) + movq %rbx,32 + 8(%rsp) + vmovdqa 32(%rsp),%xmm11 + vmovdqu 32(%rdi),%xmm3 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,48(%rsp) + movq %rbx,48 + 8(%rsp) + vmovdqa 48(%rsp),%xmm12 + vmovdqu 48(%rdi),%xmm4 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,64(%rsp) + movq %rbx,64 + 8(%rsp) + vmovdqa 64(%rsp),%xmm13 + vmovdqu 64(%rdi),%xmm5 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,80(%rsp) + movq %rbx,80 + 8(%rsp) + vmovdqa 80(%rsp),%xmm14 + vmovdqu 80(%rdi),%xmm6 + addq $0x60,%rdi + andq $0xf,%rdx + je .L_done_6_amivrujEyduiFoi + +.L_steal_cipher_6_amivrujEyduiFoi: + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,24(%rsp) + vmovdqa64 %xmm14,%xmm15 + vmovdqa 16(%rsp),%xmm14 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vpxor %xmm14,%xmm6,%xmm6 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vpxor %xmm0,%xmm4,%xmm4 + vpxor %xmm0,%xmm5,%xmm5 + vpxor %xmm0,%xmm6,%xmm6 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vaesdeclast %xmm0,%xmm4,%xmm4 + vaesdeclast %xmm0,%xmm5,%xmm5 + vaesdeclast %xmm0,%xmm6,%xmm6 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vpxor %xmm14,%xmm6,%xmm6 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + vmovdqu %xmm4,48(%rsi) + vmovdqu %xmm5,64(%rsi) + addq $0x60,%rsi + vmovdqa %xmm15,%xmm0 + vmovdqa %xmm6,%xmm8 + jmp .L_steal_cipher_amivrujEyduiFoi + +.L_done_6_amivrujEyduiFoi: + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vpxor %xmm14,%xmm6,%xmm6 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vpxor %xmm0,%xmm4,%xmm4 + vpxor %xmm0,%xmm5,%xmm5 + vpxor %xmm0,%xmm6,%xmm6 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vaesdeclast %xmm0,%xmm4,%xmm4 + vaesdeclast %xmm0,%xmm5,%xmm5 + vaesdeclast %xmm0,%xmm6,%xmm6 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vpxor %xmm14,%xmm6,%xmm6 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + vmovdqu %xmm4,48(%rsi) + vmovdqu %xmm5,64(%rsi) + addq $0x60,%rsi + vmovdqa %xmm6,%xmm8 + jmp .L_done_amivrujEyduiFoi + +.L_num_blocks_is_5_amivrujEyduiFoi: + vmovdqa 0(%rsp),%xmm9 + movq 0(%rsp),%rax + movq 8(%rsp),%rbx + vmovdqu 0(%rdi),%xmm1 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,16 + 8(%rsp) + vmovdqa 16(%rsp),%xmm10 + vmovdqu 16(%rdi),%xmm2 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,32(%rsp) + movq %rbx,32 + 8(%rsp) + vmovdqa 32(%rsp),%xmm11 + vmovdqu 32(%rdi),%xmm3 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,48(%rsp) + movq %rbx,48 + 8(%rsp) + vmovdqa 48(%rsp),%xmm12 + vmovdqu 48(%rdi),%xmm4 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,64(%rsp) + movq %rbx,64 + 8(%rsp) + vmovdqa 64(%rsp),%xmm13 + vmovdqu 64(%rdi),%xmm5 + addq $0x50,%rdi + andq $0xf,%rdx + je .L_done_5_amivrujEyduiFoi + +.L_steal_cipher_5_amivrujEyduiFoi: + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,24(%rsp) + vmovdqa64 %xmm13,%xmm14 + vmovdqa 16(%rsp),%xmm13 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vpxor %xmm0,%xmm4,%xmm4 + vpxor %xmm0,%xmm5,%xmm5 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vaesdeclast %xmm0,%xmm4,%xmm4 + vaesdeclast %xmm0,%xmm5,%xmm5 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + vmovdqu %xmm4,48(%rsi) + addq $0x50,%rsi + vmovdqa %xmm14,%xmm0 + vmovdqa %xmm5,%xmm8 + jmp .L_steal_cipher_amivrujEyduiFoi + +.L_done_5_amivrujEyduiFoi: + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vpxor %xmm0,%xmm4,%xmm4 + vpxor %xmm0,%xmm5,%xmm5 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vaesdeclast %xmm0,%xmm4,%xmm4 + vaesdeclast %xmm0,%xmm5,%xmm5 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + vmovdqu %xmm4,48(%rsi) + addq $0x50,%rsi + vmovdqa %xmm5,%xmm8 + jmp .L_done_amivrujEyduiFoi + +.L_num_blocks_is_4_amivrujEyduiFoi: + vmovdqa 0(%rsp),%xmm9 + movq 0(%rsp),%rax + movq 8(%rsp),%rbx + vmovdqu 0(%rdi),%xmm1 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,16 + 8(%rsp) + vmovdqa 16(%rsp),%xmm10 + vmovdqu 16(%rdi),%xmm2 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,32(%rsp) + movq %rbx,32 + 8(%rsp) + vmovdqa 32(%rsp),%xmm11 + vmovdqu 32(%rdi),%xmm3 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,48(%rsp) + movq %rbx,48 + 8(%rsp) + vmovdqa 48(%rsp),%xmm12 + vmovdqu 48(%rdi),%xmm4 + addq $0x40,%rdi + andq $0xf,%rdx + je .L_done_4_amivrujEyduiFoi + +.L_steal_cipher_4_amivrujEyduiFoi: + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,24(%rsp) + vmovdqa64 %xmm12,%xmm13 + vmovdqa 16(%rsp),%xmm12 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vpxor %xmm0,%xmm4,%xmm4 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vaesdeclast %xmm0,%xmm4,%xmm4 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + addq $0x40,%rsi + vmovdqa %xmm13,%xmm0 + vmovdqa %xmm4,%xmm8 + jmp .L_steal_cipher_amivrujEyduiFoi + +.L_done_4_amivrujEyduiFoi: + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vpxor %xmm0,%xmm4,%xmm4 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vaesdeclast %xmm0,%xmm4,%xmm4 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + addq $0x40,%rsi + vmovdqa %xmm4,%xmm8 + jmp .L_done_amivrujEyduiFoi + +.L_num_blocks_is_3_amivrujEyduiFoi: + vmovdqa 0(%rsp),%xmm9 + movq 0(%rsp),%rax + movq 8(%rsp),%rbx + vmovdqu 0(%rdi),%xmm1 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,16 + 8(%rsp) + vmovdqa 16(%rsp),%xmm10 + vmovdqu 16(%rdi),%xmm2 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,32(%rsp) + movq %rbx,32 + 8(%rsp) + vmovdqa 32(%rsp),%xmm11 + vmovdqu 32(%rdi),%xmm3 + addq $0x30,%rdi + andq $0xf,%rdx + je .L_done_3_amivrujEyduiFoi + +.L_steal_cipher_3_amivrujEyduiFoi: + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,24(%rsp) + vmovdqa64 %xmm11,%xmm12 + vmovdqa 16(%rsp),%xmm11 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + addq $0x30,%rsi + vmovdqa %xmm12,%xmm0 + vmovdqa %xmm3,%xmm8 + jmp .L_steal_cipher_amivrujEyduiFoi + +.L_done_3_amivrujEyduiFoi: + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + addq $0x30,%rsi + vmovdqa %xmm3,%xmm8 + jmp .L_done_amivrujEyduiFoi + +.L_num_blocks_is_2_amivrujEyduiFoi: + vmovdqa 0(%rsp),%xmm9 + movq 0(%rsp),%rax + movq 8(%rsp),%rbx + vmovdqu 0(%rdi),%xmm1 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,16 + 8(%rsp) + vmovdqa 16(%rsp),%xmm10 + vmovdqu 16(%rdi),%xmm2 + addq $0x20,%rdi + andq $0xf,%rdx + je .L_done_2_amivrujEyduiFoi + +.L_steal_cipher_2_amivrujEyduiFoi: + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,24(%rsp) + vmovdqa64 %xmm10,%xmm11 + vmovdqa 16(%rsp),%xmm10 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vmovdqu %xmm1,(%rsi) + addq $0x20,%rsi + vmovdqa %xmm11,%xmm0 + vmovdqa %xmm2,%xmm8 + jmp .L_steal_cipher_amivrujEyduiFoi + +.L_done_2_amivrujEyduiFoi: + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vmovdqu %xmm1,(%rsi) + addq $0x20,%rsi + vmovdqa %xmm2,%xmm8 + jmp .L_done_amivrujEyduiFoi + +.L_num_blocks_is_1_amivrujEyduiFoi: + vmovdqa 0(%rsp),%xmm9 + movq 0(%rsp),%rax + movq 8(%rsp),%rbx + vmovdqu 0(%rdi),%xmm1 + addq $0x10,%rdi + andq $0xf,%rdx + je .L_done_1_amivrujEyduiFoi + +.L_steal_cipher_1_amivrujEyduiFoi: + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,24(%rsp) + vmovdqa64 %xmm9,%xmm10 + vmovdqa 16(%rsp),%xmm9 + vpxor %xmm9,%xmm1,%xmm1 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vpxor %xmm9,%xmm1,%xmm1 + addq $0x10,%rsi + vmovdqa %xmm10,%xmm0 + vmovdqa %xmm1,%xmm8 + jmp .L_steal_cipher_amivrujEyduiFoi + +.L_done_1_amivrujEyduiFoi: + vpxor %xmm9,%xmm1,%xmm1 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 160(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vpxor %xmm9,%xmm1,%xmm1 + addq $0x10,%rsi + vmovdqa %xmm1,%xmm8 + jmp .L_done_amivrujEyduiFoi +.cfi_endproc +.globl aesni_xts_256_encrypt_avx512 +.hidden aesni_xts_256_encrypt_avx512 +.type aesni_xts_256_encrypt_avx512,@function +.align 32 +aesni_xts_256_encrypt_avx512: +.cfi_startproc +.byte 243,15,30,250 + pushq %rbp + movq %rsp,%rbp + subq $136,%rsp + andq $0xffffffffffffffc0,%rsp + movq %rbx,128(%rsp) + movq $0x87,%r10 + vmovdqu (%r9),%xmm1 + vpxor (%r8),%xmm1,%xmm1 + vaesenc 16(%r8),%xmm1,%xmm1 + vaesenc 32(%r8),%xmm1,%xmm1 + vaesenc 48(%r8),%xmm1,%xmm1 + vaesenc 64(%r8),%xmm1,%xmm1 + vaesenc 80(%r8),%xmm1,%xmm1 + vaesenc 96(%r8),%xmm1,%xmm1 + vaesenc 112(%r8),%xmm1,%xmm1 + vaesenc 128(%r8),%xmm1,%xmm1 + vaesenc 144(%r8),%xmm1,%xmm1 + vaesenc 160(%r8),%xmm1,%xmm1 + vaesenc 176(%r8),%xmm1,%xmm1 + vaesenc 192(%r8),%xmm1,%xmm1 + vaesenc 208(%r8),%xmm1,%xmm1 + vaesenclast 224(%r8),%xmm1,%xmm1 + vmovdqa %xmm1,(%rsp) + + cmpq $0x80,%rdx + jl .L_less_than_128_bytes_wcpqaDvsGlbjGoe + vpbroadcastq %r10,%zmm25 + cmpq $0x100,%rdx + jge .L_start_by16_wcpqaDvsGlbjGoe + cmpq $0x80,%rdx + jge .L_start_by8_wcpqaDvsGlbjGoe + +.L_do_n_blocks_wcpqaDvsGlbjGoe: + cmpq $0x0,%rdx + je .L_ret_wcpqaDvsGlbjGoe + cmpq $0x70,%rdx + jge .L_remaining_num_blocks_is_7_wcpqaDvsGlbjGoe + cmpq $0x60,%rdx + jge .L_remaining_num_blocks_is_6_wcpqaDvsGlbjGoe + cmpq $0x50,%rdx + jge .L_remaining_num_blocks_is_5_wcpqaDvsGlbjGoe + cmpq $0x40,%rdx + jge .L_remaining_num_blocks_is_4_wcpqaDvsGlbjGoe + cmpq $0x30,%rdx + jge .L_remaining_num_blocks_is_3_wcpqaDvsGlbjGoe + cmpq $0x20,%rdx + jge .L_remaining_num_blocks_is_2_wcpqaDvsGlbjGoe + cmpq $0x10,%rdx + jge .L_remaining_num_blocks_is_1_wcpqaDvsGlbjGoe + vmovdqa %xmm0,%xmm8 + vmovdqa %xmm9,%xmm0 + jmp .L_steal_cipher_wcpqaDvsGlbjGoe + +.L_remaining_num_blocks_is_7_wcpqaDvsGlbjGoe: + movq $0x0000ffffffffffff,%r8 + kmovq %r8,%k1 + vmovdqu8 (%rdi),%zmm1 + vmovdqu8 64(%rdi),%zmm2{%k1} + addq $0x70,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vpternlogq $0x96,%zmm0,%zmm10,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 176(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 192(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 208(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 224(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vaesenclast %zmm0,%zmm2,%zmm2 + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %zmm2,64(%rsi){%k1} + addq $0x70,%rsi + vextracti32x4 $0x2,%zmm2,%xmm8 + vextracti32x4 $0x3,%zmm10,%xmm0 + andq $0xf,%rdx + je .L_ret_wcpqaDvsGlbjGoe + jmp .L_steal_cipher_wcpqaDvsGlbjGoe + +.L_remaining_num_blocks_is_6_wcpqaDvsGlbjGoe: + vmovdqu8 (%rdi),%zmm1 + vmovdqu8 64(%rdi),%ymm2 + addq $0x60,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vpternlogq $0x96,%zmm0,%zmm10,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 176(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 192(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 208(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 224(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vaesenclast %zmm0,%zmm2,%zmm2 + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %ymm2,64(%rsi) + addq $0x60,%rsi + vextracti32x4 $0x1,%zmm2,%xmm8 + vextracti32x4 $0x2,%zmm10,%xmm0 + andq $0xf,%rdx + je .L_ret_wcpqaDvsGlbjGoe + jmp .L_steal_cipher_wcpqaDvsGlbjGoe + +.L_remaining_num_blocks_is_5_wcpqaDvsGlbjGoe: + vmovdqu8 (%rdi),%zmm1 + vmovdqu 64(%rdi),%xmm2 + addq $0x50,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vpternlogq $0x96,%zmm0,%zmm10,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 176(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 192(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 208(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 224(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vaesenclast %zmm0,%zmm2,%zmm2 + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vmovdqu8 %zmm1,(%rsi) + vmovdqu %xmm2,64(%rsi) + addq $0x50,%rsi + vmovdqa %xmm2,%xmm8 + vextracti32x4 $0x1,%zmm10,%xmm0 + andq $0xf,%rdx + je .L_ret_wcpqaDvsGlbjGoe + jmp .L_steal_cipher_wcpqaDvsGlbjGoe + +.L_remaining_num_blocks_is_4_wcpqaDvsGlbjGoe: + vmovdqu8 (%rdi),%zmm1 + addq $0x40,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 176(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 192(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 208(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 224(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vpxorq %zmm9,%zmm1,%zmm1 + vmovdqu8 %zmm1,(%rsi) + addq $0x40,%rsi + vextracti32x4 $0x3,%zmm1,%xmm8 + vmovdqa64 %xmm10,%xmm0 + andq $0xf,%rdx + je .L_ret_wcpqaDvsGlbjGoe + jmp .L_steal_cipher_wcpqaDvsGlbjGoe +.L_remaining_num_blocks_is_3_wcpqaDvsGlbjGoe: + movq $-1,%r8 + shrq $0x10,%r8 + kmovq %r8,%k1 + vmovdqu8 (%rdi),%zmm1{%k1} + addq $0x30,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 176(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 192(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 208(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 224(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vpxorq %zmm9,%zmm1,%zmm1 + vmovdqu8 %zmm1,(%rsi){%k1} + addq $0x30,%rsi + vextracti32x4 $0x2,%zmm1,%xmm8 + vextracti32x4 $0x3,%zmm9,%xmm0 + andq $0xf,%rdx + je .L_ret_wcpqaDvsGlbjGoe + jmp .L_steal_cipher_wcpqaDvsGlbjGoe +.L_remaining_num_blocks_is_2_wcpqaDvsGlbjGoe: + vmovdqu8 (%rdi),%ymm1 + addq $0x20,%rdi + vbroadcasti32x4 (%rcx),%ymm0 + vpternlogq $0x96,%ymm0,%ymm9,%ymm1 + vbroadcasti32x4 16(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 32(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 48(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 64(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 80(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 96(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 112(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 128(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 144(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 160(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 176(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 192(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 208(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 224(%rcx),%ymm0 + vaesenclast %ymm0,%ymm1,%ymm1 + vpxorq %ymm9,%ymm1,%ymm1 + vmovdqu %ymm1,(%rsi) + addq $0x20,%rsi + vextracti32x4 $0x1,%zmm1,%xmm8 + vextracti32x4 $0x2,%zmm9,%xmm0 + andq $0xf,%rdx + je .L_ret_wcpqaDvsGlbjGoe + jmp .L_steal_cipher_wcpqaDvsGlbjGoe +.L_remaining_num_blocks_is_1_wcpqaDvsGlbjGoe: + vmovdqu (%rdi),%xmm1 + addq $0x10,%rdi + vpxor %xmm9,%xmm1,%xmm1 + vpxor (%rcx),%xmm1,%xmm1 + vaesenc 16(%rcx),%xmm1,%xmm1 + vaesenc 32(%rcx),%xmm1,%xmm1 + vaesenc 48(%rcx),%xmm1,%xmm1 + vaesenc 64(%rcx),%xmm1,%xmm1 + vaesenc 80(%rcx),%xmm1,%xmm1 + vaesenc 96(%rcx),%xmm1,%xmm1 + vaesenc 112(%rcx),%xmm1,%xmm1 + vaesenc 128(%rcx),%xmm1,%xmm1 + vaesenc 144(%rcx),%xmm1,%xmm1 + vaesenc 160(%rcx),%xmm1,%xmm1 + vaesenc 176(%rcx),%xmm1,%xmm1 + vaesenc 192(%rcx),%xmm1,%xmm1 + vaesenc 208(%rcx),%xmm1,%xmm1 + vaesenclast 224(%rcx),%xmm1,%xmm1 + vpxor %xmm9,%xmm1,%xmm1 + vmovdqu %xmm1,(%rsi) + addq $0x10,%rsi + vmovdqa %xmm1,%xmm8 + vextracti32x4 $0x1,%zmm9,%xmm0 + andq $0xf,%rdx + je .L_ret_wcpqaDvsGlbjGoe + jmp .L_steal_cipher_wcpqaDvsGlbjGoe + + +.L_start_by16_wcpqaDvsGlbjGoe: + vbroadcasti32x4 (%rsp),%zmm0 + vbroadcasti32x4 shufb_15_7(%rip),%zmm8 + movq $0xaa,%r8 + kmovq %r8,%k2 + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x0,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + vpsllvq const_dq7654(%rip),%zmm0,%zmm5 + vpsrlvq const_dq1234(%rip),%zmm1,%zmm6 + vpclmulqdq $0x0,%zmm25,%zmm6,%zmm7 + vpxorq %zmm6,%zmm5,%zmm5{%k2} + vpxord %zmm5,%zmm7,%zmm10 + vpsrldq $0xf,%zmm9,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm9,%zmm11 + vpxord %zmm14,%zmm11,%zmm11 + vpsrldq $0xf,%zmm10,%zmm15 + vpclmulqdq $0x0,%zmm25,%zmm15,%zmm16 + vpslldq $0x1,%zmm10,%zmm12 + vpxord %zmm16,%zmm12,%zmm12 + +.L_main_loop_run_16_wcpqaDvsGlbjGoe: + vmovdqu8 (%rdi),%zmm1 + vmovdqu8 64(%rdi),%zmm2 + vmovdqu8 128(%rdi),%zmm3 + vmovdqu8 192(%rdi),%zmm4 + addq $0x100,%rdi + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vpxorq %zmm11,%zmm3,%zmm3 + vpxorq %zmm12,%zmm4,%zmm4 + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vpxorq %zmm0,%zmm3,%zmm3 + vpxorq %zmm0,%zmm4,%zmm4 + vpsrldq $0xf,%zmm11,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm11,%zmm15 + vpxord %zmm14,%zmm15,%zmm15 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vpsrldq $0xf,%zmm12,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm12,%zmm16 + vpxord %zmm14,%zmm16,%zmm16 + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vpsrldq $0xf,%zmm15,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm15,%zmm17 + vpxord %zmm14,%zmm17,%zmm17 + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vpsrldq $0xf,%zmm16,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm16,%zmm18 + vpxord %zmm14,%zmm18,%zmm18 + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 176(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 192(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 208(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vaesenc %zmm0,%zmm3,%zmm3 + vaesenc %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 224(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vaesenclast %zmm0,%zmm2,%zmm2 + vaesenclast %zmm0,%zmm3,%zmm3 + vaesenclast %zmm0,%zmm4,%zmm4 + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vpxorq %zmm11,%zmm3,%zmm3 + vpxorq %zmm12,%zmm4,%zmm4 + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqa32 %zmm17,%zmm11 + vmovdqa32 %zmm18,%zmm12 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %zmm2,64(%rsi) + vmovdqu8 %zmm3,128(%rsi) + vmovdqu8 %zmm4,192(%rsi) + addq $0x100,%rsi + subq $0x100,%rdx + cmpq $0x100,%rdx + jae .L_main_loop_run_16_wcpqaDvsGlbjGoe + cmpq $0x80,%rdx + jae .L_main_loop_run_8_wcpqaDvsGlbjGoe + vextracti32x4 $0x3,%zmm4,%xmm0 + jmp .L_do_n_blocks_wcpqaDvsGlbjGoe + +.L_start_by8_wcpqaDvsGlbjGoe: + vbroadcasti32x4 (%rsp),%zmm0 + vbroadcasti32x4 shufb_15_7(%rip),%zmm8 + movq $0xaa,%r8 + kmovq %r8,%k2 + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x0,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + vpsllvq const_dq7654(%rip),%zmm0,%zmm5 + vpsrlvq const_dq1234(%rip),%zmm1,%zmm6 + vpclmulqdq $0x0,%zmm25,%zmm6,%zmm7 + vpxorq %zmm6,%zmm5,%zmm5{%k2} + vpxord %zmm5,%zmm7,%zmm10 + +.L_main_loop_run_8_wcpqaDvsGlbjGoe: + vmovdqu8 (%rdi),%zmm1 + vmovdqu8 64(%rdi),%zmm2 + addq $0x80,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vpternlogq $0x96,%zmm0,%zmm10,%zmm2 + vpsrldq $0xf,%zmm9,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm9,%zmm15 + vpxord %zmm14,%zmm15,%zmm15 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + vpsrldq $0xf,%zmm10,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm10,%zmm16 + vpxord %zmm14,%zmm16,%zmm16 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 176(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 192(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 208(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 224(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vaesenclast %zmm0,%zmm2,%zmm2 + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %zmm2,64(%rsi) + addq $0x80,%rsi + subq $0x80,%rdx + cmpq $0x80,%rdx + jae .L_main_loop_run_8_wcpqaDvsGlbjGoe + vextracti32x4 $0x3,%zmm2,%xmm0 + jmp .L_do_n_blocks_wcpqaDvsGlbjGoe + +.L_steal_cipher_wcpqaDvsGlbjGoe: + vmovdqa %xmm8,%xmm2 + leaq vpshufb_shf_table(%rip),%rax + vmovdqu (%rax,%rdx,1),%xmm10 + vpshufb %xmm10,%xmm8,%xmm8 + vmovdqu -16(%rdi,%rdx,1),%xmm3 + vmovdqu %xmm8,-16(%rsi,%rdx,1) + leaq vpshufb_shf_table(%rip),%rax + addq $16,%rax + subq %rdx,%rax + vmovdqu (%rax),%xmm10 + vpxor mask1(%rip),%xmm10,%xmm10 + vpshufb %xmm10,%xmm3,%xmm3 + vpblendvb %xmm10,%xmm2,%xmm3,%xmm3 + vpxor %xmm0,%xmm3,%xmm8 + vpxor (%rcx),%xmm8,%xmm8 + vaesenc 16(%rcx),%xmm8,%xmm8 + vaesenc 32(%rcx),%xmm8,%xmm8 + vaesenc 48(%rcx),%xmm8,%xmm8 + vaesenc 64(%rcx),%xmm8,%xmm8 + vaesenc 80(%rcx),%xmm8,%xmm8 + vaesenc 96(%rcx),%xmm8,%xmm8 + vaesenc 112(%rcx),%xmm8,%xmm8 + vaesenc 128(%rcx),%xmm8,%xmm8 + vaesenc 144(%rcx),%xmm8,%xmm8 + vaesenc 160(%rcx),%xmm8,%xmm8 + vaesenc 176(%rcx),%xmm8,%xmm8 + vaesenc 192(%rcx),%xmm8,%xmm8 + vaesenc 208(%rcx),%xmm8,%xmm8 + vaesenclast 224(%rcx),%xmm8,%xmm8 + vpxor %xmm0,%xmm8,%xmm8 + vmovdqu %xmm8,-16(%rsi) +.L_ret_wcpqaDvsGlbjGoe: + movq 128(%rsp),%rbx + xorq %r8,%r8 + movq %r8,128(%rsp) + + vpxorq %zmm0,%zmm0,%zmm0 + movq %rbp,%rsp + popq %rbp + vzeroupper + .byte 0xf3,0xc3 + +.L_less_than_128_bytes_wcpqaDvsGlbjGoe: + vpbroadcastq %r10,%zmm25 + cmpq $0x10,%rdx + jb .L_ret_wcpqaDvsGlbjGoe + vbroadcasti32x4 (%rsp),%zmm0 + vbroadcasti32x4 shufb_15_7(%rip),%zmm8 + movl $0xaa,%r8d + kmovq %r8,%k2 + movq %rdx,%r8 + andq $0x70,%r8 + cmpq $0x60,%r8 + je .L_num_blocks_is_6_wcpqaDvsGlbjGoe + cmpq $0x50,%r8 + je .L_num_blocks_is_5_wcpqaDvsGlbjGoe + cmpq $0x40,%r8 + je .L_num_blocks_is_4_wcpqaDvsGlbjGoe + cmpq $0x30,%r8 + je .L_num_blocks_is_3_wcpqaDvsGlbjGoe + cmpq $0x20,%r8 + je .L_num_blocks_is_2_wcpqaDvsGlbjGoe + cmpq $0x10,%r8 + je .L_num_blocks_is_1_wcpqaDvsGlbjGoe + +.L_num_blocks_is_7_wcpqaDvsGlbjGoe: + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + vpsllvq const_dq7654(%rip),%zmm0,%zmm5 + vpsrlvq const_dq1234(%rip),%zmm1,%zmm6 + vpclmulqdq $0x00,%zmm25,%zmm6,%zmm7 + vpxorq %zmm6,%zmm5,%zmm5{%k2} + vpxord %zmm5,%zmm7,%zmm10 + movq $0x0000ffffffffffff,%r8 + kmovq %r8,%k1 + vmovdqu8 0(%rdi),%zmm1 + vmovdqu8 64(%rdi),%zmm2{%k1} + + addq $0x70,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vpternlogq $0x96,%zmm0,%zmm10,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 176(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 192(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 208(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 224(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vaesenclast %zmm0,%zmm2,%zmm2 + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vmovdqu8 %zmm1,0(%rsi) + vmovdqu8 %zmm2,64(%rsi){%k1} + addq $0x70,%rsi + vextracti32x4 $0x2,%zmm2,%xmm8 + vextracti32x4 $0x3,%zmm10,%xmm0 + andq $0xf,%rdx + je .L_ret_wcpqaDvsGlbjGoe + jmp .L_steal_cipher_wcpqaDvsGlbjGoe +.L_num_blocks_is_6_wcpqaDvsGlbjGoe: + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + vpsllvq const_dq7654(%rip),%zmm0,%zmm5 + vpsrlvq const_dq1234(%rip),%zmm1,%zmm6 + vpclmulqdq $0x00,%zmm25,%zmm6,%zmm7 + vpxorq %zmm6,%zmm5,%zmm5{%k2} + vpxord %zmm5,%zmm7,%zmm10 + vmovdqu8 0(%rdi),%zmm1 + vmovdqu8 64(%rdi),%ymm2 + addq $96,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vpternlogq $0x96,%zmm0,%zmm10,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 176(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 192(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 208(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 224(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vaesenclast %zmm0,%zmm2,%zmm2 + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vmovdqu8 %zmm1,0(%rsi) + vmovdqu8 %ymm2,64(%rsi) + addq $96,%rsi + + vextracti32x4 $0x1,%ymm2,%xmm8 + vextracti32x4 $0x2,%zmm10,%xmm0 + andq $0xf,%rdx + je .L_ret_wcpqaDvsGlbjGoe + jmp .L_steal_cipher_wcpqaDvsGlbjGoe +.L_num_blocks_is_5_wcpqaDvsGlbjGoe: + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + vpsllvq const_dq7654(%rip),%zmm0,%zmm5 + vpsrlvq const_dq1234(%rip),%zmm1,%zmm6 + vpclmulqdq $0x00,%zmm25,%zmm6,%zmm7 + vpxorq %zmm6,%zmm5,%zmm5{%k2} + vpxord %zmm5,%zmm7,%zmm10 + vmovdqu8 0(%rdi),%zmm1 + vmovdqu8 64(%rdi),%xmm2 + addq $80,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vpternlogq $0x96,%zmm0,%zmm10,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 176(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 192(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 208(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vaesenc %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 224(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vaesenclast %zmm0,%zmm2,%zmm2 + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vmovdqu8 %zmm1,0(%rsi) + vmovdqu8 %xmm2,64(%rsi) + addq $80,%rsi + + vmovdqa %xmm2,%xmm8 + vextracti32x4 $0x1,%zmm10,%xmm0 + andq $0xf,%rdx + je .L_ret_wcpqaDvsGlbjGoe + jmp .L_steal_cipher_wcpqaDvsGlbjGoe +.L_num_blocks_is_4_wcpqaDvsGlbjGoe: + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + vpsllvq const_dq7654(%rip),%zmm0,%zmm5 + vpsrlvq const_dq1234(%rip),%zmm1,%zmm6 + vpclmulqdq $0x00,%zmm25,%zmm6,%zmm7 + vpxorq %zmm6,%zmm5,%zmm5{%k2} + vpxord %zmm5,%zmm7,%zmm10 + vmovdqu8 0(%rdi),%zmm1 + addq $64,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 176(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 192(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 208(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 224(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vpxorq %zmm9,%zmm1,%zmm1 + vmovdqu8 %zmm1,0(%rsi) + addq $64,%rsi + vextracti32x4 $0x3,%zmm1,%xmm8 + vmovdqa %xmm10,%xmm0 + andq $0xf,%rdx + je .L_ret_wcpqaDvsGlbjGoe + jmp .L_steal_cipher_wcpqaDvsGlbjGoe +.L_num_blocks_is_3_wcpqaDvsGlbjGoe: + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + movq $0x0000ffffffffffff,%r8 + kmovq %r8,%k1 + vmovdqu8 0(%rdi),%zmm1{%k1} + addq $48,%rdi + vbroadcasti32x4 (%rcx),%zmm0 + vpternlogq $0x96,%zmm0,%zmm9,%zmm1 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 32(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 48(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 64(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 80(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 96(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 112(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 128(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 144(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 160(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 176(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 192(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 208(%rcx),%zmm0 + vaesenc %zmm0,%zmm1,%zmm1 + vbroadcasti32x4 224(%rcx),%zmm0 + vaesenclast %zmm0,%zmm1,%zmm1 + vpxorq %zmm9,%zmm1,%zmm1 + vmovdqu8 %zmm1,0(%rsi){%k1} + addq $48,%rsi + vextracti32x4 $2,%zmm1,%xmm8 + vextracti32x4 $3,%zmm9,%xmm0 + andq $0xf,%rdx + je .L_ret_wcpqaDvsGlbjGoe + jmp .L_steal_cipher_wcpqaDvsGlbjGoe +.L_num_blocks_is_2_wcpqaDvsGlbjGoe: + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + + vmovdqu8 0(%rdi),%ymm1 + addq $32,%rdi + vbroadcasti32x4 (%rcx),%ymm0 + vpternlogq $0x96,%ymm0,%ymm9,%ymm1 + vbroadcasti32x4 16(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 32(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 48(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 64(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 80(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 96(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 112(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 128(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 144(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 160(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 176(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 192(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 208(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 224(%rcx),%ymm0 + vaesenclast %ymm0,%ymm1,%ymm1 + vpxorq %ymm9,%ymm1,%ymm1 + vmovdqu8 %ymm1,0(%rsi) + addq $32,%rsi + + vextracti32x4 $1,%ymm1,%xmm8 + vextracti32x4 $2,%zmm9,%xmm0 + andq $0xf,%rdx + je .L_ret_wcpqaDvsGlbjGoe + jmp .L_steal_cipher_wcpqaDvsGlbjGoe +.L_num_blocks_is_1_wcpqaDvsGlbjGoe: + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x00,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + + vmovdqu8 0(%rdi),%xmm1 + addq $16,%rdi + vbroadcasti32x4 (%rcx),%ymm0 + vpternlogq $0x96,%ymm0,%ymm9,%ymm1 + vbroadcasti32x4 16(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 32(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 48(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 64(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 80(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 96(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 112(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 128(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 144(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 160(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 176(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 192(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 208(%rcx),%ymm0 + vaesenc %ymm0,%ymm1,%ymm1 + vbroadcasti32x4 224(%rcx),%ymm0 + vaesenclast %ymm0,%ymm1,%ymm1 + vpxorq %ymm9,%ymm1,%ymm1 + vmovdqu8 %xmm1,0(%rsi) + addq $16,%rsi + + vmovdqa %xmm1,%xmm8 + vextracti32x4 $1,%zmm9,%xmm0 + andq $0xf,%rdx + je .L_ret_wcpqaDvsGlbjGoe + jmp .L_steal_cipher_wcpqaDvsGlbjGoe +.cfi_endproc +.globl aesni_xts_256_decrypt_avx512 +.hidden aesni_xts_256_decrypt_avx512 +.type aesni_xts_256_decrypt_avx512,@function +.align 32 +aesni_xts_256_decrypt_avx512: +.cfi_startproc +.byte 243,15,30,250 + pushq %rbp + movq %rsp,%rbp + subq $136,%rsp + andq $0xffffffffffffffc0,%rsp + movq %rbx,128(%rsp) + movq $0x87,%r10 + vmovdqu (%r9),%xmm1 + vpxor (%r8),%xmm1,%xmm1 + vaesenc 16(%r8),%xmm1,%xmm1 + vaesenc 32(%r8),%xmm1,%xmm1 + vaesenc 48(%r8),%xmm1,%xmm1 + vaesenc 64(%r8),%xmm1,%xmm1 + vaesenc 80(%r8),%xmm1,%xmm1 + vaesenc 96(%r8),%xmm1,%xmm1 + vaesenc 112(%r8),%xmm1,%xmm1 + vaesenc 128(%r8),%xmm1,%xmm1 + vaesenc 144(%r8),%xmm1,%xmm1 + vaesenc 160(%r8),%xmm1,%xmm1 + vaesenc 176(%r8),%xmm1,%xmm1 + vaesenc 192(%r8),%xmm1,%xmm1 + vaesenc 208(%r8),%xmm1,%xmm1 + vaesenclast 224(%r8),%xmm1,%xmm1 + vmovdqa %xmm1,(%rsp) + + cmpq $0x80,%rdx + jb .L_less_than_128_bytes_EmbgEptodyewbFa + vpbroadcastq %r10,%zmm25 + cmpq $0x100,%rdx + jge .L_start_by16_EmbgEptodyewbFa + jmp .L_start_by8_EmbgEptodyewbFa + +.L_do_n_blocks_EmbgEptodyewbFa: + cmpq $0x0,%rdx + je .L_ret_EmbgEptodyewbFa + cmpq $0x70,%rdx + jge .L_remaining_num_blocks_is_7_EmbgEptodyewbFa + cmpq $0x60,%rdx + jge .L_remaining_num_blocks_is_6_EmbgEptodyewbFa + cmpq $0x50,%rdx + jge .L_remaining_num_blocks_is_5_EmbgEptodyewbFa + cmpq $0x40,%rdx + jge .L_remaining_num_blocks_is_4_EmbgEptodyewbFa + cmpq $0x30,%rdx + jge .L_remaining_num_blocks_is_3_EmbgEptodyewbFa + cmpq $0x20,%rdx + jge .L_remaining_num_blocks_is_2_EmbgEptodyewbFa + cmpq $0x10,%rdx + jge .L_remaining_num_blocks_is_1_EmbgEptodyewbFa + + + vmovdqu %xmm5,%xmm1 + + vpxor %xmm9,%xmm1,%xmm1 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vpxor %xmm9,%xmm1,%xmm1 + vmovdqu %xmm1,-16(%rsi) + vmovdqa %xmm1,%xmm8 + + + movq $0x1,%r8 + kmovq %r8,%k1 + vpsllq $0x3f,%xmm9,%xmm13 + vpsraq $0x3f,%xmm13,%xmm14 + vpandq %xmm25,%xmm14,%xmm5 + vpxorq %xmm5,%xmm9,%xmm9{%k1} + vpsrldq $0x8,%xmm9,%xmm10 +.byte 98, 211, 181, 8, 115, 194, 1 + vpslldq $0x8,%xmm13,%xmm13 + vpxorq %xmm13,%xmm0,%xmm0 + jmp .L_steal_cipher_EmbgEptodyewbFa + +.L_remaining_num_blocks_is_7_EmbgEptodyewbFa: + movq $0xffffffffffffffff,%r8 + shrq $0x10,%r8 + kmovq %r8,%k1 + vmovdqu8 (%rdi),%zmm1 + vmovdqu8 64(%rdi),%zmm2{%k1} + addq $0x70,%rdi + andq $0xf,%rdx + je .L_done_7_remain_EmbgEptodyewbFa + vextracti32x4 $0x2,%zmm10,%xmm12 + vextracti32x4 $0x3,%zmm10,%xmm13 + vinserti32x4 $0x2,%xmm13,%zmm10,%zmm10 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 176(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 192(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 208(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 224(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %zmm2,64(%rsi){%k1} + addq $0x70,%rsi + vextracti32x4 $0x2,%zmm2,%xmm8 + vmovdqa %xmm12,%xmm0 + jmp .L_steal_cipher_EmbgEptodyewbFa + +.L_done_7_remain_EmbgEptodyewbFa: + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 176(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 192(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 208(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 224(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %zmm2,64(%rsi){%k1} + jmp .L_ret_EmbgEptodyewbFa + +.L_remaining_num_blocks_is_6_EmbgEptodyewbFa: + vmovdqu8 (%rdi),%zmm1 + vmovdqu8 64(%rdi),%ymm2 + addq $0x60,%rdi + andq $0xf,%rdx + je .L_done_6_remain_EmbgEptodyewbFa + vextracti32x4 $0x1,%zmm10,%xmm12 + vextracti32x4 $0x2,%zmm10,%xmm13 + vinserti32x4 $0x1,%xmm13,%zmm10,%zmm10 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 176(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 192(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 208(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 224(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %ymm2,64(%rsi) + addq $0x60,%rsi + vextracti32x4 $0x1,%zmm2,%xmm8 + vmovdqa %xmm12,%xmm0 + jmp .L_steal_cipher_EmbgEptodyewbFa + +.L_done_6_remain_EmbgEptodyewbFa: + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 176(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 192(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 208(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 224(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %ymm2,64(%rsi) + jmp .L_ret_EmbgEptodyewbFa + +.L_remaining_num_blocks_is_5_EmbgEptodyewbFa: + vmovdqu8 (%rdi),%zmm1 + vmovdqu 64(%rdi),%xmm2 + addq $0x50,%rdi + andq $0xf,%rdx + je .L_done_5_remain_EmbgEptodyewbFa + vmovdqa %xmm10,%xmm12 + vextracti32x4 $0x1,%zmm10,%xmm10 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 176(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 192(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 208(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 224(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + vmovdqu %xmm2,64(%rsi) + addq $0x50,%rsi + vmovdqa %xmm2,%xmm8 + vmovdqa %xmm12,%xmm0 + jmp .L_steal_cipher_EmbgEptodyewbFa + +.L_done_5_remain_EmbgEptodyewbFa: + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 176(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 192(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 208(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 224(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %xmm2,64(%rsi) + jmp .L_ret_EmbgEptodyewbFa + +.L_remaining_num_blocks_is_4_EmbgEptodyewbFa: + vmovdqu8 (%rdi),%zmm1 + addq $0x40,%rdi + andq $0xf,%rdx + je .L_done_4_remain_EmbgEptodyewbFa + vextracti32x4 $0x3,%zmm9,%xmm12 + vinserti32x4 $0x3,%xmm10,%zmm9,%zmm9 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 176(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 192(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 208(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 224(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + addq $0x40,%rsi + vextracti32x4 $0x3,%zmm1,%xmm8 + vmovdqa %xmm12,%xmm0 + jmp .L_steal_cipher_EmbgEptodyewbFa + +.L_done_4_remain_EmbgEptodyewbFa: + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 176(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 192(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 208(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 224(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + jmp .L_ret_EmbgEptodyewbFa + +.L_remaining_num_blocks_is_3_EmbgEptodyewbFa: + vmovdqu (%rdi),%xmm1 + vmovdqu 16(%rdi),%xmm2 + vmovdqu 32(%rdi),%xmm3 + addq $0x30,%rdi + andq $0xf,%rdx + je .L_done_3_remain_EmbgEptodyewbFa + vextracti32x4 $0x2,%zmm9,%xmm13 + vextracti32x4 $0x1,%zmm9,%xmm10 + vextracti32x4 $0x3,%zmm9,%xmm11 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + addq $0x30,%rsi + vmovdqa %xmm3,%xmm8 + vmovdqa %xmm13,%xmm0 + jmp .L_steal_cipher_EmbgEptodyewbFa + +.L_done_3_remain_EmbgEptodyewbFa: + vextracti32x4 $0x1,%zmm9,%xmm10 + vextracti32x4 $0x2,%zmm9,%xmm11 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + jmp .L_ret_EmbgEptodyewbFa + +.L_remaining_num_blocks_is_2_EmbgEptodyewbFa: + vmovdqu (%rdi),%xmm1 + vmovdqu 16(%rdi),%xmm2 + addq $0x20,%rdi + andq $0xf,%rdx + je .L_done_2_remain_EmbgEptodyewbFa + vextracti32x4 $0x2,%zmm9,%xmm10 + vextracti32x4 $0x1,%zmm9,%xmm12 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + addq $0x20,%rsi + vmovdqa %xmm2,%xmm8 + vmovdqa %xmm12,%xmm0 + jmp .L_steal_cipher_EmbgEptodyewbFa + +.L_done_2_remain_EmbgEptodyewbFa: + vextracti32x4 $0x1,%zmm9,%xmm10 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + jmp .L_ret_EmbgEptodyewbFa + +.L_remaining_num_blocks_is_1_EmbgEptodyewbFa: + vmovdqu (%rdi),%xmm1 + addq $0x10,%rdi + andq $0xf,%rdx + je .L_done_1_remain_EmbgEptodyewbFa + vextracti32x4 $0x1,%zmm9,%xmm11 + vpxor %xmm11,%xmm1,%xmm1 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vpxor %xmm11,%xmm1,%xmm1 + vmovdqu %xmm1,(%rsi) + addq $0x10,%rsi + vmovdqa %xmm1,%xmm8 + vmovdqa %xmm9,%xmm0 + jmp .L_steal_cipher_EmbgEptodyewbFa + +.L_done_1_remain_EmbgEptodyewbFa: + vpxor %xmm9,%xmm1,%xmm1 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vpxor %xmm9,%xmm1,%xmm1 + vmovdqu %xmm1,(%rsi) + jmp .L_ret_EmbgEptodyewbFa + +.L_start_by16_EmbgEptodyewbFa: + vbroadcasti32x4 (%rsp),%zmm0 + vbroadcasti32x4 shufb_15_7(%rip),%zmm8 + movq $0xaa,%r8 + kmovq %r8,%k2 + + + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x0,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + + + vpsllvq const_dq7654(%rip),%zmm0,%zmm5 + vpsrlvq const_dq1234(%rip),%zmm1,%zmm6 + vpclmulqdq $0x0,%zmm25,%zmm6,%zmm7 + vpxorq %zmm6,%zmm5,%zmm5{%k2} + vpxord %zmm5,%zmm7,%zmm10 + + + vpsrldq $0xf,%zmm9,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm9,%zmm11 + vpxord %zmm14,%zmm11,%zmm11 + + vpsrldq $0xf,%zmm10,%zmm15 + vpclmulqdq $0x0,%zmm25,%zmm15,%zmm16 + vpslldq $0x1,%zmm10,%zmm12 + vpxord %zmm16,%zmm12,%zmm12 + +.L_main_loop_run_16_EmbgEptodyewbFa: + vmovdqu8 (%rdi),%zmm1 + vmovdqu8 64(%rdi),%zmm2 + vmovdqu8 128(%rdi),%zmm3 + vmovdqu8 192(%rdi),%zmm4 + vmovdqu8 240(%rdi),%xmm5 + addq $0x100,%rdi + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vpxorq %zmm11,%zmm3,%zmm3 + vpxorq %zmm12,%zmm4,%zmm4 + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vpxorq %zmm0,%zmm3,%zmm3 + vpxorq %zmm0,%zmm4,%zmm4 + vpsrldq $0xf,%zmm11,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm11,%zmm15 + vpxord %zmm14,%zmm15,%zmm15 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vpsrldq $0xf,%zmm12,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm12,%zmm16 + vpxord %zmm14,%zmm16,%zmm16 + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vpsrldq $0xf,%zmm15,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm15,%zmm17 + vpxord %zmm14,%zmm17,%zmm17 + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vpsrldq $0xf,%zmm16,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm16,%zmm18 + vpxord %zmm14,%zmm18,%zmm18 + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 176(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 192(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 208(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vaesdec %zmm0,%zmm3,%zmm3 + vaesdec %zmm0,%zmm4,%zmm4 + vbroadcasti32x4 224(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + vaesdeclast %zmm0,%zmm3,%zmm3 + vaesdeclast %zmm0,%zmm4,%zmm4 + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + vpxorq %zmm11,%zmm3,%zmm3 + vpxorq %zmm12,%zmm4,%zmm4 + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqa32 %zmm17,%zmm11 + vmovdqa32 %zmm18,%zmm12 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %zmm2,64(%rsi) + vmovdqu8 %zmm3,128(%rsi) + vmovdqu8 %zmm4,192(%rsi) + addq $0x100,%rsi + subq $0x100,%rdx + cmpq $0x100,%rdx + jge .L_main_loop_run_16_EmbgEptodyewbFa + + cmpq $0x80,%rdx + jge .L_main_loop_run_8_EmbgEptodyewbFa + jmp .L_do_n_blocks_EmbgEptodyewbFa + +.L_start_by8_EmbgEptodyewbFa: + + vbroadcasti32x4 (%rsp),%zmm0 + vbroadcasti32x4 shufb_15_7(%rip),%zmm8 + movq $0xaa,%r8 + kmovq %r8,%k2 + + + vpshufb %zmm8,%zmm0,%zmm1 + vpsllvq const_dq3210(%rip),%zmm0,%zmm4 + vpsrlvq const_dq5678(%rip),%zmm1,%zmm2 + vpclmulqdq $0x0,%zmm25,%zmm2,%zmm3 + vpxorq %zmm2,%zmm4,%zmm4{%k2} + vpxord %zmm4,%zmm3,%zmm9 + + + vpsllvq const_dq7654(%rip),%zmm0,%zmm5 + vpsrlvq const_dq1234(%rip),%zmm1,%zmm6 + vpclmulqdq $0x0,%zmm25,%zmm6,%zmm7 + vpxorq %zmm6,%zmm5,%zmm5{%k2} + vpxord %zmm5,%zmm7,%zmm10 + +.L_main_loop_run_8_EmbgEptodyewbFa: + vmovdqu8 (%rdi),%zmm1 + vmovdqu8 64(%rdi),%zmm2 + vmovdqu8 112(%rdi),%xmm5 + addq $0x80,%rdi + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vbroadcasti32x4 (%rcx),%zmm0 + vpxorq %zmm0,%zmm1,%zmm1 + vpxorq %zmm0,%zmm2,%zmm2 + vpsrldq $0xf,%zmm9,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm9,%zmm15 + vpxord %zmm14,%zmm15,%zmm15 + vbroadcasti32x4 16(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 32(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 48(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + vpsrldq $0xf,%zmm10,%zmm13 + vpclmulqdq $0x0,%zmm25,%zmm13,%zmm14 + vpslldq $0x1,%zmm10,%zmm16 + vpxord %zmm14,%zmm16,%zmm16 + + vbroadcasti32x4 64(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 80(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 96(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 112(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 128(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 144(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 160(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 176(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 192(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 208(%rcx),%zmm0 + vaesdec %zmm0,%zmm1,%zmm1 + vaesdec %zmm0,%zmm2,%zmm2 + + + vbroadcasti32x4 224(%rcx),%zmm0 + vaesdeclast %zmm0,%zmm1,%zmm1 + vaesdeclast %zmm0,%zmm2,%zmm2 + + vpxorq %zmm9,%zmm1,%zmm1 + vpxorq %zmm10,%zmm2,%zmm2 + + + vmovdqa32 %zmm15,%zmm9 + vmovdqa32 %zmm16,%zmm10 + vmovdqu8 %zmm1,(%rsi) + vmovdqu8 %zmm2,64(%rsi) + addq $0x80,%rsi + subq $0x80,%rdx + cmpq $0x80,%rdx + jge .L_main_loop_run_8_EmbgEptodyewbFa + jmp .L_do_n_blocks_EmbgEptodyewbFa + +.L_steal_cipher_EmbgEptodyewbFa: + + vmovdqa %xmm8,%xmm2 + + + leaq vpshufb_shf_table(%rip),%rax + vmovdqu (%rax,%rdx,1),%xmm10 + vpshufb %xmm10,%xmm8,%xmm8 + + + vmovdqu -16(%rdi,%rdx,1),%xmm3 + vmovdqu %xmm8,-16(%rsi,%rdx,1) + + + leaq vpshufb_shf_table(%rip),%rax + addq $16,%rax + subq %rdx,%rax + vmovdqu (%rax),%xmm10 + vpxor mask1(%rip),%xmm10,%xmm10 + vpshufb %xmm10,%xmm3,%xmm3 + + vpblendvb %xmm10,%xmm2,%xmm3,%xmm3 + + + vpxor %xmm0,%xmm3,%xmm8 + + + vpxor (%rcx),%xmm8,%xmm8 + vaesdec 16(%rcx),%xmm8,%xmm8 + vaesdec 32(%rcx),%xmm8,%xmm8 + vaesdec 48(%rcx),%xmm8,%xmm8 + vaesdec 64(%rcx),%xmm8,%xmm8 + vaesdec 80(%rcx),%xmm8,%xmm8 + vaesdec 96(%rcx),%xmm8,%xmm8 + vaesdec 112(%rcx),%xmm8,%xmm8 + vaesdec 128(%rcx),%xmm8,%xmm8 + vaesdec 144(%rcx),%xmm8,%xmm8 + vaesdec 160(%rcx),%xmm8,%xmm8 + vaesdec 176(%rcx),%xmm8,%xmm8 + vaesdec 192(%rcx),%xmm8,%xmm8 + vaesdec 208(%rcx),%xmm8,%xmm8 + vaesdeclast 224(%rcx),%xmm8,%xmm8 + + vpxor %xmm0,%xmm8,%xmm8 + +.L_done_EmbgEptodyewbFa: + + vmovdqu %xmm8,-16(%rsi) +.L_ret_EmbgEptodyewbFa: + movq 128(%rsp),%rbx + xorq %r8,%r8 + movq %r8,128(%rsp) + + vpxorq %zmm0,%zmm0,%zmm0 + movq %rbp,%rsp + popq %rbp + vzeroupper + .byte 0xf3,0xc3 + +.L_less_than_128_bytes_EmbgEptodyewbFa: + cmpq $0x10,%rdx + jb .L_ret_EmbgEptodyewbFa + + movq %rdx,%r8 + andq $0x70,%r8 + cmpq $0x60,%r8 + je .L_num_blocks_is_6_EmbgEptodyewbFa + cmpq $0x50,%r8 + je .L_num_blocks_is_5_EmbgEptodyewbFa + cmpq $0x40,%r8 + je .L_num_blocks_is_4_EmbgEptodyewbFa + cmpq $0x30,%r8 + je .L_num_blocks_is_3_EmbgEptodyewbFa + cmpq $0x20,%r8 + je .L_num_blocks_is_2_EmbgEptodyewbFa + cmpq $0x10,%r8 + je .L_num_blocks_is_1_EmbgEptodyewbFa + +.L_num_blocks_is_7_EmbgEptodyewbFa: + vmovdqa 0(%rsp),%xmm9 + movq 0(%rsp),%rax + movq 8(%rsp),%rbx + vmovdqu 0(%rdi),%xmm1 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,16 + 8(%rsp) + vmovdqa 16(%rsp),%xmm10 + vmovdqu 16(%rdi),%xmm2 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,32(%rsp) + movq %rbx,32 + 8(%rsp) + vmovdqa 32(%rsp),%xmm11 + vmovdqu 32(%rdi),%xmm3 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,48(%rsp) + movq %rbx,48 + 8(%rsp) + vmovdqa 48(%rsp),%xmm12 + vmovdqu 48(%rdi),%xmm4 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,64(%rsp) + movq %rbx,64 + 8(%rsp) + vmovdqa 64(%rsp),%xmm13 + vmovdqu 64(%rdi),%xmm5 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,80(%rsp) + movq %rbx,80 + 8(%rsp) + vmovdqa 80(%rsp),%xmm14 + vmovdqu 80(%rdi),%xmm6 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,96(%rsp) + movq %rbx,96 + 8(%rsp) + vmovdqa 96(%rsp),%xmm15 + vmovdqu 96(%rdi),%xmm7 + addq $0x70,%rdi + andq $0xf,%rdx + je .L_done_7_EmbgEptodyewbFa + +.L_steal_cipher_7_EmbgEptodyewbFa: + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,24(%rsp) + vmovdqa64 %xmm15,%xmm16 + vmovdqa 16(%rsp),%xmm15 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vpxor %xmm14,%xmm6,%xmm6 + vpxor %xmm15,%xmm7,%xmm7 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vpxor %xmm0,%xmm4,%xmm4 + vpxor %xmm0,%xmm5,%xmm5 + vpxor %xmm0,%xmm6,%xmm6 + vpxor %xmm0,%xmm7,%xmm7 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vaesdeclast %xmm0,%xmm4,%xmm4 + vaesdeclast %xmm0,%xmm5,%xmm5 + vaesdeclast %xmm0,%xmm6,%xmm6 + vaesdeclast %xmm0,%xmm7,%xmm7 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vpxor %xmm14,%xmm6,%xmm6 + vpxor %xmm15,%xmm7,%xmm7 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + vmovdqu %xmm4,48(%rsi) + vmovdqu %xmm5,64(%rsi) + vmovdqu %xmm6,80(%rsi) + addq $0x70,%rsi + vmovdqa64 %xmm16,%xmm0 + vmovdqa %xmm7,%xmm8 + jmp .L_steal_cipher_EmbgEptodyewbFa + +.L_done_7_EmbgEptodyewbFa: + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vpxor %xmm14,%xmm6,%xmm6 + vpxor %xmm15,%xmm7,%xmm7 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vpxor %xmm0,%xmm4,%xmm4 + vpxor %xmm0,%xmm5,%xmm5 + vpxor %xmm0,%xmm6,%xmm6 + vpxor %xmm0,%xmm7,%xmm7 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vaesdec %xmm0,%xmm7,%xmm7 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vaesdeclast %xmm0,%xmm4,%xmm4 + vaesdeclast %xmm0,%xmm5,%xmm5 + vaesdeclast %xmm0,%xmm6,%xmm6 + vaesdeclast %xmm0,%xmm7,%xmm7 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vpxor %xmm14,%xmm6,%xmm6 + vpxor %xmm15,%xmm7,%xmm7 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + vmovdqu %xmm4,48(%rsi) + vmovdqu %xmm5,64(%rsi) + vmovdqu %xmm6,80(%rsi) + addq $0x70,%rsi + vmovdqa %xmm7,%xmm8 + jmp .L_done_EmbgEptodyewbFa + +.L_num_blocks_is_6_EmbgEptodyewbFa: + vmovdqa 0(%rsp),%xmm9 + movq 0(%rsp),%rax + movq 8(%rsp),%rbx + vmovdqu 0(%rdi),%xmm1 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,16 + 8(%rsp) + vmovdqa 16(%rsp),%xmm10 + vmovdqu 16(%rdi),%xmm2 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,32(%rsp) + movq %rbx,32 + 8(%rsp) + vmovdqa 32(%rsp),%xmm11 + vmovdqu 32(%rdi),%xmm3 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,48(%rsp) + movq %rbx,48 + 8(%rsp) + vmovdqa 48(%rsp),%xmm12 + vmovdqu 48(%rdi),%xmm4 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,64(%rsp) + movq %rbx,64 + 8(%rsp) + vmovdqa 64(%rsp),%xmm13 + vmovdqu 64(%rdi),%xmm5 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,80(%rsp) + movq %rbx,80 + 8(%rsp) + vmovdqa 80(%rsp),%xmm14 + vmovdqu 80(%rdi),%xmm6 + addq $0x60,%rdi + andq $0xf,%rdx + je .L_done_6_EmbgEptodyewbFa + +.L_steal_cipher_6_EmbgEptodyewbFa: + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,24(%rsp) + vmovdqa64 %xmm14,%xmm15 + vmovdqa 16(%rsp),%xmm14 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vpxor %xmm14,%xmm6,%xmm6 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vpxor %xmm0,%xmm4,%xmm4 + vpxor %xmm0,%xmm5,%xmm5 + vpxor %xmm0,%xmm6,%xmm6 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vaesdeclast %xmm0,%xmm4,%xmm4 + vaesdeclast %xmm0,%xmm5,%xmm5 + vaesdeclast %xmm0,%xmm6,%xmm6 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vpxor %xmm14,%xmm6,%xmm6 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + vmovdqu %xmm4,48(%rsi) + vmovdqu %xmm5,64(%rsi) + addq $0x60,%rsi + vmovdqa %xmm15,%xmm0 + vmovdqa %xmm6,%xmm8 + jmp .L_steal_cipher_EmbgEptodyewbFa + +.L_done_6_EmbgEptodyewbFa: + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vpxor %xmm14,%xmm6,%xmm6 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vpxor %xmm0,%xmm4,%xmm4 + vpxor %xmm0,%xmm5,%xmm5 + vpxor %xmm0,%xmm6,%xmm6 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vaesdec %xmm0,%xmm6,%xmm6 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vaesdeclast %xmm0,%xmm4,%xmm4 + vaesdeclast %xmm0,%xmm5,%xmm5 + vaesdeclast %xmm0,%xmm6,%xmm6 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vpxor %xmm14,%xmm6,%xmm6 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + vmovdqu %xmm4,48(%rsi) + vmovdqu %xmm5,64(%rsi) + addq $0x60,%rsi + vmovdqa %xmm6,%xmm8 + jmp .L_done_EmbgEptodyewbFa + +.L_num_blocks_is_5_EmbgEptodyewbFa: + vmovdqa 0(%rsp),%xmm9 + movq 0(%rsp),%rax + movq 8(%rsp),%rbx + vmovdqu 0(%rdi),%xmm1 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,16 + 8(%rsp) + vmovdqa 16(%rsp),%xmm10 + vmovdqu 16(%rdi),%xmm2 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,32(%rsp) + movq %rbx,32 + 8(%rsp) + vmovdqa 32(%rsp),%xmm11 + vmovdqu 32(%rdi),%xmm3 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,48(%rsp) + movq %rbx,48 + 8(%rsp) + vmovdqa 48(%rsp),%xmm12 + vmovdqu 48(%rdi),%xmm4 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,64(%rsp) + movq %rbx,64 + 8(%rsp) + vmovdqa 64(%rsp),%xmm13 + vmovdqu 64(%rdi),%xmm5 + addq $0x50,%rdi + andq $0xf,%rdx + je .L_done_5_EmbgEptodyewbFa + +.L_steal_cipher_5_EmbgEptodyewbFa: + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,24(%rsp) + vmovdqa64 %xmm13,%xmm14 + vmovdqa 16(%rsp),%xmm13 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vpxor %xmm0,%xmm4,%xmm4 + vpxor %xmm0,%xmm5,%xmm5 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vaesdeclast %xmm0,%xmm4,%xmm4 + vaesdeclast %xmm0,%xmm5,%xmm5 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + vmovdqu %xmm4,48(%rsi) + addq $0x50,%rsi + vmovdqa %xmm14,%xmm0 + vmovdqa %xmm5,%xmm8 + jmp .L_steal_cipher_EmbgEptodyewbFa + +.L_done_5_EmbgEptodyewbFa: + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vpxor %xmm0,%xmm4,%xmm4 + vpxor %xmm0,%xmm5,%xmm5 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vaesdec %xmm0,%xmm5,%xmm5 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vaesdeclast %xmm0,%xmm4,%xmm4 + vaesdeclast %xmm0,%xmm5,%xmm5 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vpxor %xmm13,%xmm5,%xmm5 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + vmovdqu %xmm4,48(%rsi) + addq $0x50,%rsi + vmovdqa %xmm5,%xmm8 + jmp .L_done_EmbgEptodyewbFa + +.L_num_blocks_is_4_EmbgEptodyewbFa: + vmovdqa 0(%rsp),%xmm9 + movq 0(%rsp),%rax + movq 8(%rsp),%rbx + vmovdqu 0(%rdi),%xmm1 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,16 + 8(%rsp) + vmovdqa 16(%rsp),%xmm10 + vmovdqu 16(%rdi),%xmm2 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,32(%rsp) + movq %rbx,32 + 8(%rsp) + vmovdqa 32(%rsp),%xmm11 + vmovdqu 32(%rdi),%xmm3 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,48(%rsp) + movq %rbx,48 + 8(%rsp) + vmovdqa 48(%rsp),%xmm12 + vmovdqu 48(%rdi),%xmm4 + addq $0x40,%rdi + andq $0xf,%rdx + je .L_done_4_EmbgEptodyewbFa + +.L_steal_cipher_4_EmbgEptodyewbFa: + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,24(%rsp) + vmovdqa64 %xmm12,%xmm13 + vmovdqa 16(%rsp),%xmm12 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vpxor %xmm0,%xmm4,%xmm4 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vaesdeclast %xmm0,%xmm4,%xmm4 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + addq $0x40,%rsi + vmovdqa %xmm13,%xmm0 + vmovdqa %xmm4,%xmm8 + jmp .L_steal_cipher_EmbgEptodyewbFa + +.L_done_4_EmbgEptodyewbFa: + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vpxor %xmm0,%xmm4,%xmm4 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vaesdec %xmm0,%xmm4,%xmm4 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vaesdeclast %xmm0,%xmm4,%xmm4 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vpxor %xmm12,%xmm4,%xmm4 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + vmovdqu %xmm3,32(%rsi) + addq $0x40,%rsi + vmovdqa %xmm4,%xmm8 + jmp .L_done_EmbgEptodyewbFa + +.L_num_blocks_is_3_EmbgEptodyewbFa: + vmovdqa 0(%rsp),%xmm9 + movq 0(%rsp),%rax + movq 8(%rsp),%rbx + vmovdqu 0(%rdi),%xmm1 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,16 + 8(%rsp) + vmovdqa 16(%rsp),%xmm10 + vmovdqu 16(%rdi),%xmm2 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,32(%rsp) + movq %rbx,32 + 8(%rsp) + vmovdqa 32(%rsp),%xmm11 + vmovdqu 32(%rdi),%xmm3 + addq $0x30,%rdi + andq $0xf,%rdx + je .L_done_3_EmbgEptodyewbFa + +.L_steal_cipher_3_EmbgEptodyewbFa: + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,24(%rsp) + vmovdqa64 %xmm11,%xmm12 + vmovdqa 16(%rsp),%xmm11 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + addq $0x30,%rsi + vmovdqa %xmm12,%xmm0 + vmovdqa %xmm3,%xmm8 + jmp .L_steal_cipher_EmbgEptodyewbFa + +.L_done_3_EmbgEptodyewbFa: + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vpxor %xmm0,%xmm3,%xmm3 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vaesdec %xmm0,%xmm3,%xmm3 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vaesdeclast %xmm0,%xmm3,%xmm3 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vpxor %xmm11,%xmm3,%xmm3 + vmovdqu %xmm1,(%rsi) + vmovdqu %xmm2,16(%rsi) + addq $0x30,%rsi + vmovdqa %xmm3,%xmm8 + jmp .L_done_EmbgEptodyewbFa + +.L_num_blocks_is_2_EmbgEptodyewbFa: + vmovdqa 0(%rsp),%xmm9 + movq 0(%rsp),%rax + movq 8(%rsp),%rbx + vmovdqu 0(%rdi),%xmm1 + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,16 + 8(%rsp) + vmovdqa 16(%rsp),%xmm10 + vmovdqu 16(%rdi),%xmm2 + addq $0x20,%rdi + andq $0xf,%rdx + je .L_done_2_EmbgEptodyewbFa + +.L_steal_cipher_2_EmbgEptodyewbFa: + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,24(%rsp) + vmovdqa64 %xmm10,%xmm11 + vmovdqa 16(%rsp),%xmm10 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vmovdqu %xmm1,(%rsi) + addq $0x20,%rsi + vmovdqa %xmm11,%xmm0 + vmovdqa %xmm2,%xmm8 + jmp .L_steal_cipher_EmbgEptodyewbFa + +.L_done_2_EmbgEptodyewbFa: + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vpxor %xmm0,%xmm2,%xmm2 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vaesdec %xmm0,%xmm2,%xmm2 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vaesdeclast %xmm0,%xmm2,%xmm2 + vpxor %xmm9,%xmm1,%xmm1 + vpxor %xmm10,%xmm2,%xmm2 + vmovdqu %xmm1,(%rsi) + addq $0x20,%rsi + vmovdqa %xmm2,%xmm8 + jmp .L_done_EmbgEptodyewbFa + +.L_num_blocks_is_1_EmbgEptodyewbFa: + vmovdqa 0(%rsp),%xmm9 + movq 0(%rsp),%rax + movq 8(%rsp),%rbx + vmovdqu 0(%rdi),%xmm1 + addq $0x10,%rdi + andq $0xf,%rdx + je .L_done_1_EmbgEptodyewbFa + +.L_steal_cipher_1_EmbgEptodyewbFa: + xorq %r11,%r11 + shlq $1,%rax + adcq %rbx,%rbx + cmovcq %r10,%r11 + xorq %r11,%rax + movq %rax,16(%rsp) + movq %rbx,24(%rsp) + vmovdqa64 %xmm9,%xmm10 + vmovdqa 16(%rsp),%xmm9 + vpxor %xmm9,%xmm1,%xmm1 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vpxor %xmm9,%xmm1,%xmm1 + addq $0x10,%rsi + vmovdqa %xmm10,%xmm0 + vmovdqa %xmm1,%xmm8 + jmp .L_steal_cipher_EmbgEptodyewbFa + +.L_done_1_EmbgEptodyewbFa: + vpxor %xmm9,%xmm1,%xmm1 + vmovdqu (%rcx),%xmm0 + vpxor %xmm0,%xmm1,%xmm1 + vmovdqu 16(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 32(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 48(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 64(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 80(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 96(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 112(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 128(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 144(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 160(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 176(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 192(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 208(%rcx),%xmm0 + vaesdec %xmm0,%xmm1,%xmm1 + vmovdqu 224(%rcx),%xmm0 + vaesdeclast %xmm0,%xmm1,%xmm1 + vpxor %xmm9,%xmm1,%xmm1 + addq $0x10,%rsi + vmovdqa %xmm1,%xmm8 + jmp .L_done_EmbgEptodyewbFa +.cfi_endproc +.section .rodata +.align 16 + +vpshufb_shf_table: +.quad 0x8786858483828100, 0x8f8e8d8c8b8a8988 +.quad 0x0706050403020100, 0x000e0d0c0b0a0908 + +mask1: +.quad 0x8080808080808080, 0x8080808080808080 + +const_dq3210: +.quad 0, 0, 1, 1, 2, 2, 3, 3 +const_dq5678: +.quad 8, 8, 7, 7, 6, 6, 5, 5 +const_dq7654: +.quad 4, 4, 5, 5, 6, 6, 7, 7 +const_dq1234: +.quad 4, 4, 3, 3, 2, 2, 1, 1 + +shufb_15_7: +.byte 15, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 7, 0xff, 0xff +.byte 0xff, 0xff, 0xff, 0xff, 0xff + +.text + .section ".note.gnu.property", "a" + .p2align 3 + .long 1f - 0f + .long 4f - 1f + .long 5 +0: + # "GNU" encoded with .byte, since .asciz isn't supported + # on Solaris. + .byte 0x47 + .byte 0x4e + .byte 0x55 + .byte 0 +1: + .p2align 3 + .long 0xc0000002 + .long 3f - 2f +2: + .long 3 +3: + .p2align 3 +4: diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-2k-avxifma.s b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-2k-avxifma.s new file mode 100644 index 000000000000..1a91fca68481 --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-2k-avxifma.s @@ -0,0 +1,1167 @@ +.text + +.globl ossl_rsaz_avxifma_eligible +.type ossl_rsaz_avxifma_eligible,@function +.align 32 +ossl_rsaz_avxifma_eligible: + movl OPENSSL_ia32cap_P+20(%rip),%ecx + xorl %eax,%eax + andl $8388608,%ecx + cmpl $8388608,%ecx + cmovel %ecx,%eax + .byte 0xf3,0xc3 +.size ossl_rsaz_avxifma_eligible, .-ossl_rsaz_avxifma_eligible +.text + +.globl ossl_rsaz_amm52x20_x1_avxifma256 +.type ossl_rsaz_amm52x20_x1_avxifma256,@function +.align 32 +ossl_rsaz_amm52x20_x1_avxifma256: +.cfi_startproc +.byte 243,15,30,250 + pushq %rbx +.cfi_adjust_cfa_offset 8 +.cfi_offset %rbx,-16 + pushq %rbp +.cfi_adjust_cfa_offset 8 +.cfi_offset %rbp,-24 + pushq %r12 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r12,-32 + pushq %r13 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r13,-40 + pushq %r14 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r14,-48 + pushq %r15 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r15,-56 +.Lossl_rsaz_amm52x20_x1_avxifma256_body: + + + vpxor %ymm0,%ymm0,%ymm0 + vmovapd %ymm0,%ymm3 + vmovapd %ymm0,%ymm5 + vmovapd %ymm0,%ymm6 + vmovapd %ymm0,%ymm7 + vmovapd %ymm0,%ymm8 + + xorl %r9d,%r9d + + movq %rdx,%r11 + movq $0xfffffffffffff,%rax + + + movl $5,%ebx + +.align 32 +.Lloop5: + movq 0(%r11),%r13 + + vpbroadcastq 0(%r11),%ymm1 + movq 0(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + movq %r12,%r10 + adcq $0,%r10 + + movq %r8,%r13 + imulq %r9,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 0(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + adcq %r12,%r10 + + shrq $52,%r9 + salq $12,%r10 + orq %r10,%r9 + + leaq -168(%rsp),%rsp +{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm5 +{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm6 +{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm7 +{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm8 + +{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm5 +{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm6 +{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm7 +{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm8 + + + vmovdqu %ymm3,0(%rsp) + vmovdqu %ymm5,32(%rsp) + vmovdqu %ymm6,64(%rsp) + vmovdqu %ymm7,96(%rsp) + vmovdqu %ymm8,128(%rsp) + movq $0,160(%rsp) + + vmovdqu 8(%rsp),%ymm3 + vmovdqu 40(%rsp),%ymm5 + vmovdqu 72(%rsp),%ymm6 + vmovdqu 104(%rsp),%ymm7 + vmovdqu 136(%rsp),%ymm8 + + addq 8(%rsp),%r9 + +{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm5 +{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm6 +{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm7 +{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm8 + +{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm5 +{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm6 +{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm7 +{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm8 + leaq 168(%rsp),%rsp + movq 8(%r11),%r13 + + vpbroadcastq 8(%r11),%ymm1 + movq 0(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + movq %r12,%r10 + adcq $0,%r10 + + movq %r8,%r13 + imulq %r9,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 0(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + adcq %r12,%r10 + + shrq $52,%r9 + salq $12,%r10 + orq %r10,%r9 + + leaq -168(%rsp),%rsp +{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm5 +{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm6 +{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm7 +{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm8 + +{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm5 +{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm6 +{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm7 +{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm8 + + + vmovdqu %ymm3,0(%rsp) + vmovdqu %ymm5,32(%rsp) + vmovdqu %ymm6,64(%rsp) + vmovdqu %ymm7,96(%rsp) + vmovdqu %ymm8,128(%rsp) + movq $0,160(%rsp) + + vmovdqu 8(%rsp),%ymm3 + vmovdqu 40(%rsp),%ymm5 + vmovdqu 72(%rsp),%ymm6 + vmovdqu 104(%rsp),%ymm7 + vmovdqu 136(%rsp),%ymm8 + + addq 8(%rsp),%r9 + +{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm5 +{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm6 +{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm7 +{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm8 + +{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm5 +{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm6 +{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm7 +{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm8 + leaq 168(%rsp),%rsp + movq 16(%r11),%r13 + + vpbroadcastq 16(%r11),%ymm1 + movq 0(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + movq %r12,%r10 + adcq $0,%r10 + + movq %r8,%r13 + imulq %r9,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 0(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + adcq %r12,%r10 + + shrq $52,%r9 + salq $12,%r10 + orq %r10,%r9 + + leaq -168(%rsp),%rsp +{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm5 +{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm6 +{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm7 +{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm8 + +{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm5 +{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm6 +{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm7 +{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm8 + + + vmovdqu %ymm3,0(%rsp) + vmovdqu %ymm5,32(%rsp) + vmovdqu %ymm6,64(%rsp) + vmovdqu %ymm7,96(%rsp) + vmovdqu %ymm8,128(%rsp) + movq $0,160(%rsp) + + vmovdqu 8(%rsp),%ymm3 + vmovdqu 40(%rsp),%ymm5 + vmovdqu 72(%rsp),%ymm6 + vmovdqu 104(%rsp),%ymm7 + vmovdqu 136(%rsp),%ymm8 + + addq 8(%rsp),%r9 + +{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm5 +{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm6 +{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm7 +{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm8 + +{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm5 +{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm6 +{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm7 +{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm8 + leaq 168(%rsp),%rsp + movq 24(%r11),%r13 + + vpbroadcastq 24(%r11),%ymm1 + movq 0(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + movq %r12,%r10 + adcq $0,%r10 + + movq %r8,%r13 + imulq %r9,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 0(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + adcq %r12,%r10 + + shrq $52,%r9 + salq $12,%r10 + orq %r10,%r9 + + leaq -168(%rsp),%rsp +{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm5 +{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm6 +{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm7 +{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm8 + +{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm5 +{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm6 +{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm7 +{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm8 + + + vmovdqu %ymm3,0(%rsp) + vmovdqu %ymm5,32(%rsp) + vmovdqu %ymm6,64(%rsp) + vmovdqu %ymm7,96(%rsp) + vmovdqu %ymm8,128(%rsp) + movq $0,160(%rsp) + + vmovdqu 8(%rsp),%ymm3 + vmovdqu 40(%rsp),%ymm5 + vmovdqu 72(%rsp),%ymm6 + vmovdqu 104(%rsp),%ymm7 + vmovdqu 136(%rsp),%ymm8 + + addq 8(%rsp),%r9 + +{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm5 +{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm6 +{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm7 +{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm8 + +{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm5 +{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm6 +{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm7 +{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm8 + leaq 168(%rsp),%rsp + leaq 32(%r11),%r11 + decl %ebx + jne .Lloop5 + + vmovq %r9,%xmm0 + vpbroadcastq %xmm0,%ymm0 + vpblendd $3,%ymm0,%ymm3,%ymm3 + + + + vpsrlq $52,%ymm3,%ymm0 + vpsrlq $52,%ymm5,%ymm1 + vpsrlq $52,%ymm6,%ymm2 + vpsrlq $52,%ymm7,%ymm13 + vpsrlq $52,%ymm8,%ymm14 + + + vpermq $144,%ymm14,%ymm14 + vpermq $3,%ymm13,%ymm15 + vblendpd $1,%ymm15,%ymm14,%ymm14 + + vpermq $144,%ymm13,%ymm13 + vpermq $3,%ymm2,%ymm15 + vblendpd $1,%ymm15,%ymm13,%ymm13 + + vpermq $144,%ymm2,%ymm2 + vpermq $3,%ymm1,%ymm15 + vblendpd $1,%ymm15,%ymm2,%ymm2 + + vpermq $144,%ymm1,%ymm1 + vpermq $3,%ymm0,%ymm15 + vblendpd $1,%ymm15,%ymm1,%ymm1 + + vpermq $144,%ymm0,%ymm0 + vpand .Lhigh64x3(%rip),%ymm0,%ymm0 + + + vpand .Lmask52x4(%rip),%ymm3,%ymm3 + vpand .Lmask52x4(%rip),%ymm5,%ymm5 + vpand .Lmask52x4(%rip),%ymm6,%ymm6 + vpand .Lmask52x4(%rip),%ymm7,%ymm7 + vpand .Lmask52x4(%rip),%ymm8,%ymm8 + + + vpaddq %ymm0,%ymm3,%ymm3 + vpaddq %ymm1,%ymm5,%ymm5 + vpaddq %ymm2,%ymm6,%ymm6 + vpaddq %ymm13,%ymm7,%ymm7 + vpaddq %ymm14,%ymm8,%ymm8 + + + + vpcmpgtq .Lmask52x4(%rip),%ymm3,%ymm0 + vpcmpgtq .Lmask52x4(%rip),%ymm5,%ymm1 + vpcmpgtq .Lmask52x4(%rip),%ymm6,%ymm2 + vpcmpgtq .Lmask52x4(%rip),%ymm7,%ymm13 + vpcmpgtq .Lmask52x4(%rip),%ymm8,%ymm14 + vmovmskpd %ymm0,%r14d + vmovmskpd %ymm1,%r13d + vmovmskpd %ymm2,%r12d + vmovmskpd %ymm13,%r11d + vmovmskpd %ymm14,%r10d + + + vpcmpeqq .Lmask52x4(%rip),%ymm3,%ymm0 + vpcmpeqq .Lmask52x4(%rip),%ymm5,%ymm1 + vpcmpeqq .Lmask52x4(%rip),%ymm6,%ymm2 + vpcmpeqq .Lmask52x4(%rip),%ymm7,%ymm13 + vpcmpeqq .Lmask52x4(%rip),%ymm8,%ymm14 + vmovmskpd %ymm0,%r9d + vmovmskpd %ymm1,%r8d + vmovmskpd %ymm2,%ebx + vmovmskpd %ymm13,%ecx + vmovmskpd %ymm14,%edx + + + + shlb $4,%r13b + orb %r13b,%r14b + shlb $4,%r11b + orb %r11b,%r12b + + addb %r14b,%r14b + adcb %r12b,%r12b + adcb %r10b,%r10b + + shlb $4,%r8b + orb %r8b,%r9b + shlb $4,%cl + orb %cl,%bl + + addb %r9b,%r14b + adcb %bl,%r12b + adcb %dl,%r10b + + xorb %r9b,%r14b + xorb %bl,%r12b + xorb %dl,%r10b + + leaq .Lkmasklut(%rip),%rdx + + movb %r14b,%r13b + andq $0xf,%r14 + vpsubq .Lmask52x4(%rip),%ymm3,%ymm0 + shlq $5,%r14 + vmovapd (%rdx,%r14,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm3,%ymm3 + + shrb $4,%r13b + andq $0xf,%r13 + vpsubq .Lmask52x4(%rip),%ymm5,%ymm0 + shlq $5,%r13 + vmovapd (%rdx,%r13,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm5,%ymm5 + + movb %r12b,%r11b + andq $0xf,%r12 + vpsubq .Lmask52x4(%rip),%ymm6,%ymm0 + shlq $5,%r12 + vmovapd (%rdx,%r12,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm6,%ymm6 + + shrb $4,%r11b + andq $0xf,%r11 + vpsubq .Lmask52x4(%rip),%ymm7,%ymm0 + shlq $5,%r11 + vmovapd (%rdx,%r11,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm7,%ymm7 + + andq $0xf,%r10 + vpsubq .Lmask52x4(%rip),%ymm8,%ymm0 + shlq $5,%r10 + vmovapd (%rdx,%r10,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm8,%ymm8 + + + vpand .Lmask52x4(%rip),%ymm3,%ymm3 + vpand .Lmask52x4(%rip),%ymm5,%ymm5 + vpand .Lmask52x4(%rip),%ymm6,%ymm6 + vpand .Lmask52x4(%rip),%ymm7,%ymm7 + vpand .Lmask52x4(%rip),%ymm8,%ymm8 + + vmovdqu %ymm3,0(%rdi) + vmovdqu %ymm5,32(%rdi) + vmovdqu %ymm6,64(%rdi) + vmovdqu %ymm7,96(%rdi) + vmovdqu %ymm8,128(%rdi) + + vzeroupper + movq 0(%rsp),%r15 +.cfi_restore %r15 + movq 8(%rsp),%r14 +.cfi_restore %r14 + movq 16(%rsp),%r13 +.cfi_restore %r13 + movq 24(%rsp),%r12 +.cfi_restore %r12 + movq 32(%rsp),%rbp +.cfi_restore %rbp + movq 40(%rsp),%rbx +.cfi_restore %rbx + leaq 48(%rsp),%rsp +.cfi_adjust_cfa_offset -48 +.Lossl_rsaz_amm52x20_x1_avxifma256_epilogue: + .byte 0xf3,0xc3 +.cfi_endproc +.size ossl_rsaz_amm52x20_x1_avxifma256, .-ossl_rsaz_amm52x20_x1_avxifma256 +.section .rodata +.align 32 +.Lmask52x4: +.quad 0xfffffffffffff +.quad 0xfffffffffffff +.quad 0xfffffffffffff +.quad 0xfffffffffffff +.Lhigh64x3: +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.Lkmasklut: + +.quad 0x0 +.quad 0x0 +.quad 0x0 +.quad 0x0 + +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0x0 +.quad 0x0 + +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0x0 + +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0x0 + +.quad 0x0 +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0x0 + +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0x0 + +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0x0 + +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0x0 + +.quad 0x0 +.quad 0x0 +.quad 0x0 +.quad 0xffffffffffffffff + +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0x0 +.quad 0xffffffffffffffff + +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0xffffffffffffffff + +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0xffffffffffffffff + +.quad 0x0 +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff + +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff + +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff + +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.text + +.globl ossl_rsaz_amm52x20_x2_avxifma256 +.type ossl_rsaz_amm52x20_x2_avxifma256,@function +.align 32 +ossl_rsaz_amm52x20_x2_avxifma256: +.cfi_startproc +.byte 243,15,30,250 + pushq %rbx +.cfi_adjust_cfa_offset 8 +.cfi_offset %rbx,-16 + pushq %rbp +.cfi_adjust_cfa_offset 8 +.cfi_offset %rbp,-24 + pushq %r12 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r12,-32 + pushq %r13 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r13,-40 + pushq %r14 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r14,-48 + pushq %r15 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r15,-56 +.Lossl_rsaz_amm52x20_x2_avxifma256_body: + + + vpxor %ymm0,%ymm0,%ymm0 + vmovapd %ymm0,%ymm3 + vmovapd %ymm0,%ymm5 + vmovapd %ymm0,%ymm6 + vmovapd %ymm0,%ymm7 + vmovapd %ymm0,%ymm8 + vmovapd %ymm0,%ymm4 + vmovapd %ymm0,%ymm9 + vmovapd %ymm0,%ymm10 + vmovapd %ymm0,%ymm11 + vmovapd %ymm0,%ymm12 + + xorl %r9d,%r9d + xorl %r15d,%r15d + + movq %rdx,%r11 + movq $0xfffffffffffff,%rax + + movl $20,%ebx + +.align 32 +.Lloop20: + movq 0(%r11),%r13 + + vpbroadcastq 0(%r11),%ymm1 + movq 0(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + movq %r12,%r10 + adcq $0,%r10 + + movq (%r8),%r13 + imulq %r9,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 0(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + adcq %r12,%r10 + + shrq $52,%r9 + salq $12,%r10 + orq %r10,%r9 + + leaq -168(%rsp),%rsp +{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm5 +{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm6 +{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm7 +{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm8 + +{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm5 +{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm6 +{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm7 +{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm8 + + + vmovdqu %ymm3,0(%rsp) + vmovdqu %ymm5,32(%rsp) + vmovdqu %ymm6,64(%rsp) + vmovdqu %ymm7,96(%rsp) + vmovdqu %ymm8,128(%rsp) + movq $0,160(%rsp) + + vmovdqu 8(%rsp),%ymm3 + vmovdqu 40(%rsp),%ymm5 + vmovdqu 72(%rsp),%ymm6 + vmovdqu 104(%rsp),%ymm7 + vmovdqu 136(%rsp),%ymm8 + + addq 8(%rsp),%r9 + +{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm5 +{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm6 +{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm7 +{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm8 + +{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm5 +{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm6 +{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm7 +{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm8 + leaq 168(%rsp),%rsp + movq 160(%r11),%r13 + + vpbroadcastq 160(%r11),%ymm1 + movq 160(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r15 + movq %r12,%r10 + adcq $0,%r10 + + movq 8(%r8),%r13 + imulq %r15,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 160(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r15 + adcq %r12,%r10 + + shrq $52,%r15 + salq $12,%r10 + orq %r10,%r15 + + leaq -168(%rsp),%rsp +{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm4 +{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10 +{vex} vpmadd52luq 256(%rsi),%ymm1,%ymm11 +{vex} vpmadd52luq 288(%rsi),%ymm1,%ymm12 + +{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm4 +{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10 +{vex} vpmadd52luq 256(%rcx),%ymm2,%ymm11 +{vex} vpmadd52luq 288(%rcx),%ymm2,%ymm12 + + + vmovdqu %ymm4,0(%rsp) + vmovdqu %ymm9,32(%rsp) + vmovdqu %ymm10,64(%rsp) + vmovdqu %ymm11,96(%rsp) + vmovdqu %ymm12,128(%rsp) + movq $0,160(%rsp) + + vmovdqu 8(%rsp),%ymm4 + vmovdqu 40(%rsp),%ymm9 + vmovdqu 72(%rsp),%ymm10 + vmovdqu 104(%rsp),%ymm11 + vmovdqu 136(%rsp),%ymm12 + + addq 8(%rsp),%r15 + +{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm4 +{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10 +{vex} vpmadd52huq 256(%rsi),%ymm1,%ymm11 +{vex} vpmadd52huq 288(%rsi),%ymm1,%ymm12 + +{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm4 +{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10 +{vex} vpmadd52huq 256(%rcx),%ymm2,%ymm11 +{vex} vpmadd52huq 288(%rcx),%ymm2,%ymm12 + leaq 168(%rsp),%rsp + leaq 8(%r11),%r11 + decl %ebx + jne .Lloop20 + + vmovq %r9,%xmm0 + vpbroadcastq %xmm0,%ymm0 + vpblendd $3,%ymm0,%ymm3,%ymm3 + + + + vpsrlq $52,%ymm3,%ymm0 + vpsrlq $52,%ymm5,%ymm1 + vpsrlq $52,%ymm6,%ymm2 + vpsrlq $52,%ymm7,%ymm13 + vpsrlq $52,%ymm8,%ymm14 + + + vpermq $144,%ymm14,%ymm14 + vpermq $3,%ymm13,%ymm15 + vblendpd $1,%ymm15,%ymm14,%ymm14 + + vpermq $144,%ymm13,%ymm13 + vpermq $3,%ymm2,%ymm15 + vblendpd $1,%ymm15,%ymm13,%ymm13 + + vpermq $144,%ymm2,%ymm2 + vpermq $3,%ymm1,%ymm15 + vblendpd $1,%ymm15,%ymm2,%ymm2 + + vpermq $144,%ymm1,%ymm1 + vpermq $3,%ymm0,%ymm15 + vblendpd $1,%ymm15,%ymm1,%ymm1 + + vpermq $144,%ymm0,%ymm0 + vpand .Lhigh64x3(%rip),%ymm0,%ymm0 + + + vpand .Lmask52x4(%rip),%ymm3,%ymm3 + vpand .Lmask52x4(%rip),%ymm5,%ymm5 + vpand .Lmask52x4(%rip),%ymm6,%ymm6 + vpand .Lmask52x4(%rip),%ymm7,%ymm7 + vpand .Lmask52x4(%rip),%ymm8,%ymm8 + + + vpaddq %ymm0,%ymm3,%ymm3 + vpaddq %ymm1,%ymm5,%ymm5 + vpaddq %ymm2,%ymm6,%ymm6 + vpaddq %ymm13,%ymm7,%ymm7 + vpaddq %ymm14,%ymm8,%ymm8 + + + + vpcmpgtq .Lmask52x4(%rip),%ymm3,%ymm0 + vpcmpgtq .Lmask52x4(%rip),%ymm5,%ymm1 + vpcmpgtq .Lmask52x4(%rip),%ymm6,%ymm2 + vpcmpgtq .Lmask52x4(%rip),%ymm7,%ymm13 + vpcmpgtq .Lmask52x4(%rip),%ymm8,%ymm14 + vmovmskpd %ymm0,%r14d + vmovmskpd %ymm1,%r13d + vmovmskpd %ymm2,%r12d + vmovmskpd %ymm13,%r11d + vmovmskpd %ymm14,%r10d + + + vpcmpeqq .Lmask52x4(%rip),%ymm3,%ymm0 + vpcmpeqq .Lmask52x4(%rip),%ymm5,%ymm1 + vpcmpeqq .Lmask52x4(%rip),%ymm6,%ymm2 + vpcmpeqq .Lmask52x4(%rip),%ymm7,%ymm13 + vpcmpeqq .Lmask52x4(%rip),%ymm8,%ymm14 + vmovmskpd %ymm0,%r9d + vmovmskpd %ymm1,%r8d + vmovmskpd %ymm2,%ebx + vmovmskpd %ymm13,%ecx + vmovmskpd %ymm14,%edx + + + + shlb $4,%r13b + orb %r13b,%r14b + shlb $4,%r11b + orb %r11b,%r12b + + addb %r14b,%r14b + adcb %r12b,%r12b + adcb %r10b,%r10b + + shlb $4,%r8b + orb %r8b,%r9b + shlb $4,%cl + orb %cl,%bl + + addb %r9b,%r14b + adcb %bl,%r12b + adcb %dl,%r10b + + xorb %r9b,%r14b + xorb %bl,%r12b + xorb %dl,%r10b + + leaq .Lkmasklut(%rip),%rdx + + movb %r14b,%r13b + andq $0xf,%r14 + vpsubq .Lmask52x4(%rip),%ymm3,%ymm0 + shlq $5,%r14 + vmovapd (%rdx,%r14,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm3,%ymm3 + + shrb $4,%r13b + andq $0xf,%r13 + vpsubq .Lmask52x4(%rip),%ymm5,%ymm0 + shlq $5,%r13 + vmovapd (%rdx,%r13,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm5,%ymm5 + + movb %r12b,%r11b + andq $0xf,%r12 + vpsubq .Lmask52x4(%rip),%ymm6,%ymm0 + shlq $5,%r12 + vmovapd (%rdx,%r12,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm6,%ymm6 + + shrb $4,%r11b + andq $0xf,%r11 + vpsubq .Lmask52x4(%rip),%ymm7,%ymm0 + shlq $5,%r11 + vmovapd (%rdx,%r11,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm7,%ymm7 + + andq $0xf,%r10 + vpsubq .Lmask52x4(%rip),%ymm8,%ymm0 + shlq $5,%r10 + vmovapd (%rdx,%r10,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm8,%ymm8 + + + vpand .Lmask52x4(%rip),%ymm3,%ymm3 + vpand .Lmask52x4(%rip),%ymm5,%ymm5 + vpand .Lmask52x4(%rip),%ymm6,%ymm6 + vpand .Lmask52x4(%rip),%ymm7,%ymm7 + vpand .Lmask52x4(%rip),%ymm8,%ymm8 + + vmovq %r15,%xmm0 + vpbroadcastq %xmm0,%ymm0 + vpblendd $3,%ymm0,%ymm4,%ymm4 + + + + vpsrlq $52,%ymm4,%ymm0 + vpsrlq $52,%ymm9,%ymm1 + vpsrlq $52,%ymm10,%ymm2 + vpsrlq $52,%ymm11,%ymm13 + vpsrlq $52,%ymm12,%ymm14 + + + vpermq $144,%ymm14,%ymm14 + vpermq $3,%ymm13,%ymm15 + vblendpd $1,%ymm15,%ymm14,%ymm14 + + vpermq $144,%ymm13,%ymm13 + vpermq $3,%ymm2,%ymm15 + vblendpd $1,%ymm15,%ymm13,%ymm13 + + vpermq $144,%ymm2,%ymm2 + vpermq $3,%ymm1,%ymm15 + vblendpd $1,%ymm15,%ymm2,%ymm2 + + vpermq $144,%ymm1,%ymm1 + vpermq $3,%ymm0,%ymm15 + vblendpd $1,%ymm15,%ymm1,%ymm1 + + vpermq $144,%ymm0,%ymm0 + vpand .Lhigh64x3(%rip),%ymm0,%ymm0 + + + vpand .Lmask52x4(%rip),%ymm4,%ymm4 + vpand .Lmask52x4(%rip),%ymm9,%ymm9 + vpand .Lmask52x4(%rip),%ymm10,%ymm10 + vpand .Lmask52x4(%rip),%ymm11,%ymm11 + vpand .Lmask52x4(%rip),%ymm12,%ymm12 + + + vpaddq %ymm0,%ymm4,%ymm4 + vpaddq %ymm1,%ymm9,%ymm9 + vpaddq %ymm2,%ymm10,%ymm10 + vpaddq %ymm13,%ymm11,%ymm11 + vpaddq %ymm14,%ymm12,%ymm12 + + + + vpcmpgtq .Lmask52x4(%rip),%ymm4,%ymm0 + vpcmpgtq .Lmask52x4(%rip),%ymm9,%ymm1 + vpcmpgtq .Lmask52x4(%rip),%ymm10,%ymm2 + vpcmpgtq .Lmask52x4(%rip),%ymm11,%ymm13 + vpcmpgtq .Lmask52x4(%rip),%ymm12,%ymm14 + vmovmskpd %ymm0,%r14d + vmovmskpd %ymm1,%r13d + vmovmskpd %ymm2,%r12d + vmovmskpd %ymm13,%r11d + vmovmskpd %ymm14,%r10d + + + vpcmpeqq .Lmask52x4(%rip),%ymm4,%ymm0 + vpcmpeqq .Lmask52x4(%rip),%ymm9,%ymm1 + vpcmpeqq .Lmask52x4(%rip),%ymm10,%ymm2 + vpcmpeqq .Lmask52x4(%rip),%ymm11,%ymm13 + vpcmpeqq .Lmask52x4(%rip),%ymm12,%ymm14 + vmovmskpd %ymm0,%r9d + vmovmskpd %ymm1,%r8d + vmovmskpd %ymm2,%ebx + vmovmskpd %ymm13,%ecx + vmovmskpd %ymm14,%edx + + + + shlb $4,%r13b + orb %r13b,%r14b + shlb $4,%r11b + orb %r11b,%r12b + + addb %r14b,%r14b + adcb %r12b,%r12b + adcb %r10b,%r10b + + shlb $4,%r8b + orb %r8b,%r9b + shlb $4,%cl + orb %cl,%bl + + addb %r9b,%r14b + adcb %bl,%r12b + adcb %dl,%r10b + + xorb %r9b,%r14b + xorb %bl,%r12b + xorb %dl,%r10b + + leaq .Lkmasklut(%rip),%rdx + + movb %r14b,%r13b + andq $0xf,%r14 + vpsubq .Lmask52x4(%rip),%ymm4,%ymm0 + shlq $5,%r14 + vmovapd (%rdx,%r14,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm4,%ymm4 + + shrb $4,%r13b + andq $0xf,%r13 + vpsubq .Lmask52x4(%rip),%ymm9,%ymm0 + shlq $5,%r13 + vmovapd (%rdx,%r13,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm9,%ymm9 + + movb %r12b,%r11b + andq $0xf,%r12 + vpsubq .Lmask52x4(%rip),%ymm10,%ymm0 + shlq $5,%r12 + vmovapd (%rdx,%r12,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm10,%ymm10 + + shrb $4,%r11b + andq $0xf,%r11 + vpsubq .Lmask52x4(%rip),%ymm11,%ymm0 + shlq $5,%r11 + vmovapd (%rdx,%r11,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm11,%ymm11 + + andq $0xf,%r10 + vpsubq .Lmask52x4(%rip),%ymm12,%ymm0 + shlq $5,%r10 + vmovapd (%rdx,%r10,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm12,%ymm12 + + + vpand .Lmask52x4(%rip),%ymm4,%ymm4 + vpand .Lmask52x4(%rip),%ymm9,%ymm9 + vpand .Lmask52x4(%rip),%ymm10,%ymm10 + vpand .Lmask52x4(%rip),%ymm11,%ymm11 + vpand .Lmask52x4(%rip),%ymm12,%ymm12 + + vmovdqu %ymm3,0(%rdi) + vmovdqu %ymm5,32(%rdi) + vmovdqu %ymm6,64(%rdi) + vmovdqu %ymm7,96(%rdi) + vmovdqu %ymm8,128(%rdi) + + vmovdqu %ymm4,160(%rdi) + vmovdqu %ymm9,192(%rdi) + vmovdqu %ymm10,224(%rdi) + vmovdqu %ymm11,256(%rdi) + vmovdqu %ymm12,288(%rdi) + + vzeroupper + movq 0(%rsp),%r15 +.cfi_restore %r15 + movq 8(%rsp),%r14 +.cfi_restore %r14 + movq 16(%rsp),%r13 +.cfi_restore %r13 + movq 24(%rsp),%r12 +.cfi_restore %r12 + movq 32(%rsp),%rbp +.cfi_restore %rbp + movq 40(%rsp),%rbx +.cfi_restore %rbx + leaq 48(%rsp),%rsp +.cfi_adjust_cfa_offset -48 +.Lossl_rsaz_amm52x20_x2_avxifma256_epilogue: + .byte 0xf3,0xc3 +.cfi_endproc +.size ossl_rsaz_amm52x20_x2_avxifma256, .-ossl_rsaz_amm52x20_x2_avxifma256 +.text + +.align 32 +.globl ossl_extract_multiplier_2x20_win5_avx +.type ossl_extract_multiplier_2x20_win5_avx,@function +ossl_extract_multiplier_2x20_win5_avx: +.cfi_startproc +.byte 243,15,30,250 + vmovapd .Lones(%rip),%ymm14 + vmovq %rdx,%xmm10 + vpbroadcastq %xmm10,%ymm12 + vmovq %rcx,%xmm10 + vpbroadcastq %xmm10,%ymm13 + leaq 10240(%rsi),%rax + + + vpxor %xmm0,%xmm0,%xmm0 + vmovapd %ymm0,%ymm11 + vmovapd %ymm0,%ymm1 + vmovapd %ymm0,%ymm2 + vmovapd %ymm0,%ymm3 + vmovapd %ymm0,%ymm4 + vmovapd %ymm0,%ymm5 + vmovapd %ymm0,%ymm6 + vmovapd %ymm0,%ymm7 + vmovapd %ymm0,%ymm8 + vmovapd %ymm0,%ymm9 + +.align 32 +.Lloop: + vpcmpeqq %ymm11,%ymm12,%ymm15 + vmovdqu 0(%rsi),%ymm10 + vblendvpd %ymm15,%ymm10,%ymm0,%ymm0 + vmovdqu 32(%rsi),%ymm10 + vblendvpd %ymm15,%ymm10,%ymm1,%ymm1 + vmovdqu 64(%rsi),%ymm10 + vblendvpd %ymm15,%ymm10,%ymm2,%ymm2 + vmovdqu 96(%rsi),%ymm10 + vblendvpd %ymm15,%ymm10,%ymm3,%ymm3 + vmovdqu 128(%rsi),%ymm10 + vblendvpd %ymm15,%ymm10,%ymm4,%ymm4 + vpcmpeqq %ymm11,%ymm13,%ymm15 + vmovdqu 160(%rsi),%ymm10 + vblendvpd %ymm15,%ymm10,%ymm5,%ymm5 + vmovdqu 192(%rsi),%ymm10 + vblendvpd %ymm15,%ymm10,%ymm6,%ymm6 + vmovdqu 224(%rsi),%ymm10 + vblendvpd %ymm15,%ymm10,%ymm7,%ymm7 + vmovdqu 256(%rsi),%ymm10 + vblendvpd %ymm15,%ymm10,%ymm8,%ymm8 + vmovdqu 288(%rsi),%ymm10 + vblendvpd %ymm15,%ymm10,%ymm9,%ymm9 + vpaddq %ymm14,%ymm11,%ymm11 + addq $320,%rsi + cmpq %rsi,%rax + jne .Lloop + vmovdqu %ymm0,0(%rdi) + vmovdqu %ymm1,32(%rdi) + vmovdqu %ymm2,64(%rdi) + vmovdqu %ymm3,96(%rdi) + vmovdqu %ymm4,128(%rdi) + vmovdqu %ymm5,160(%rdi) + vmovdqu %ymm6,192(%rdi) + vmovdqu %ymm7,224(%rdi) + vmovdqu %ymm8,256(%rdi) + vmovdqu %ymm9,288(%rdi) + .byte 0xf3,0xc3 +.cfi_endproc +.size ossl_extract_multiplier_2x20_win5_avx, .-ossl_extract_multiplier_2x20_win5_avx +.section .rodata +.align 32 +.Lones: +.quad 1,1,1,1 +.Lzeros: +.quad 0,0,0,0 + .section ".note.gnu.property", "a" + .p2align 3 + .long 1f - 0f + .long 4f - 1f + .long 5 +0: + # "GNU" encoded with .byte, since .asciz isn't supported + # on Solaris. + .byte 0x47 + .byte 0x4e + .byte 0x55 + .byte 0 +1: + .p2align 3 + .long 0xc0000002 + .long 3f - 2f +2: + .long 3 +3: + .p2align 3 +4: diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-3k-avxifma.s b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-3k-avxifma.s new file mode 100644 index 000000000000..c40b2093942e --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-3k-avxifma.s @@ -0,0 +1,1768 @@ +.text + +.globl ossl_rsaz_amm52x30_x1_avxifma256 +.type ossl_rsaz_amm52x30_x1_avxifma256,@function +.align 32 +ossl_rsaz_amm52x30_x1_avxifma256: +.cfi_startproc +.byte 243,15,30,250 + pushq %rbx +.cfi_adjust_cfa_offset 8 +.cfi_offset %rbx,-16 + pushq %rbp +.cfi_adjust_cfa_offset 8 +.cfi_offset %rbp,-24 + pushq %r12 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r12,-32 + pushq %r13 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r13,-40 + pushq %r14 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r14,-48 + pushq %r15 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r15,-56 + + vpxor %ymm0,%ymm0,%ymm0 + vmovapd %ymm0,%ymm3 + vmovapd %ymm0,%ymm4 + vmovapd %ymm0,%ymm5 + vmovapd %ymm0,%ymm6 + vmovapd %ymm0,%ymm7 + vmovapd %ymm0,%ymm8 + vmovapd %ymm0,%ymm9 + vmovapd %ymm0,%ymm10 + + xorl %r9d,%r9d + + movq %rdx,%r11 + movq $0xfffffffffffff,%rax + + + movl $7,%ebx + +.align 32 +.Lloop7: + movq 0(%r11),%r13 + + vpbroadcastq 0(%r11),%ymm1 + movq 0(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + movq %r12,%r10 + adcq $0,%r10 + + movq %r8,%r13 + imulq %r9,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 0(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + adcq %r12,%r10 + + shrq $52,%r9 + salq $12,%r10 + orq %r10,%r9 + + leaq -264(%rsp),%rsp + +{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10 + +{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10 + + + vmovdqu %ymm3,0(%rsp) + vmovdqu %ymm4,32(%rsp) + vmovdqu %ymm5,64(%rsp) + vmovdqu %ymm6,96(%rsp) + vmovdqu %ymm7,128(%rsp) + vmovdqu %ymm8,160(%rsp) + vmovdqu %ymm9,192(%rsp) + vmovdqu %ymm10,224(%rsp) + movq $0,256(%rsp) + + vmovdqu 8(%rsp),%ymm3 + vmovdqu 40(%rsp),%ymm4 + vmovdqu 72(%rsp),%ymm5 + vmovdqu 104(%rsp),%ymm6 + vmovdqu 136(%rsp),%ymm7 + vmovdqu 168(%rsp),%ymm8 + vmovdqu 200(%rsp),%ymm9 + vmovdqu 232(%rsp),%ymm10 + + addq 8(%rsp),%r9 + +{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10 + +{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10 + + leaq 264(%rsp),%rsp + movq 8(%r11),%r13 + + vpbroadcastq 8(%r11),%ymm1 + movq 0(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + movq %r12,%r10 + adcq $0,%r10 + + movq %r8,%r13 + imulq %r9,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 0(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + adcq %r12,%r10 + + shrq $52,%r9 + salq $12,%r10 + orq %r10,%r9 + + leaq -264(%rsp),%rsp + +{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10 + +{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10 + + + vmovdqu %ymm3,0(%rsp) + vmovdqu %ymm4,32(%rsp) + vmovdqu %ymm5,64(%rsp) + vmovdqu %ymm6,96(%rsp) + vmovdqu %ymm7,128(%rsp) + vmovdqu %ymm8,160(%rsp) + vmovdqu %ymm9,192(%rsp) + vmovdqu %ymm10,224(%rsp) + movq $0,256(%rsp) + + vmovdqu 8(%rsp),%ymm3 + vmovdqu 40(%rsp),%ymm4 + vmovdqu 72(%rsp),%ymm5 + vmovdqu 104(%rsp),%ymm6 + vmovdqu 136(%rsp),%ymm7 + vmovdqu 168(%rsp),%ymm8 + vmovdqu 200(%rsp),%ymm9 + vmovdqu 232(%rsp),%ymm10 + + addq 8(%rsp),%r9 + +{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10 + +{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10 + + leaq 264(%rsp),%rsp + movq 16(%r11),%r13 + + vpbroadcastq 16(%r11),%ymm1 + movq 0(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + movq %r12,%r10 + adcq $0,%r10 + + movq %r8,%r13 + imulq %r9,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 0(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + adcq %r12,%r10 + + shrq $52,%r9 + salq $12,%r10 + orq %r10,%r9 + + leaq -264(%rsp),%rsp + +{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10 + +{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10 + + + vmovdqu %ymm3,0(%rsp) + vmovdqu %ymm4,32(%rsp) + vmovdqu %ymm5,64(%rsp) + vmovdqu %ymm6,96(%rsp) + vmovdqu %ymm7,128(%rsp) + vmovdqu %ymm8,160(%rsp) + vmovdqu %ymm9,192(%rsp) + vmovdqu %ymm10,224(%rsp) + movq $0,256(%rsp) + + vmovdqu 8(%rsp),%ymm3 + vmovdqu 40(%rsp),%ymm4 + vmovdqu 72(%rsp),%ymm5 + vmovdqu 104(%rsp),%ymm6 + vmovdqu 136(%rsp),%ymm7 + vmovdqu 168(%rsp),%ymm8 + vmovdqu 200(%rsp),%ymm9 + vmovdqu 232(%rsp),%ymm10 + + addq 8(%rsp),%r9 + +{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10 + +{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10 + + leaq 264(%rsp),%rsp + movq 24(%r11),%r13 + + vpbroadcastq 24(%r11),%ymm1 + movq 0(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + movq %r12,%r10 + adcq $0,%r10 + + movq %r8,%r13 + imulq %r9,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 0(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + adcq %r12,%r10 + + shrq $52,%r9 + salq $12,%r10 + orq %r10,%r9 + + leaq -264(%rsp),%rsp + +{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10 + +{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10 + + + vmovdqu %ymm3,0(%rsp) + vmovdqu %ymm4,32(%rsp) + vmovdqu %ymm5,64(%rsp) + vmovdqu %ymm6,96(%rsp) + vmovdqu %ymm7,128(%rsp) + vmovdqu %ymm8,160(%rsp) + vmovdqu %ymm9,192(%rsp) + vmovdqu %ymm10,224(%rsp) + movq $0,256(%rsp) + + vmovdqu 8(%rsp),%ymm3 + vmovdqu 40(%rsp),%ymm4 + vmovdqu 72(%rsp),%ymm5 + vmovdqu 104(%rsp),%ymm6 + vmovdqu 136(%rsp),%ymm7 + vmovdqu 168(%rsp),%ymm8 + vmovdqu 200(%rsp),%ymm9 + vmovdqu 232(%rsp),%ymm10 + + addq 8(%rsp),%r9 + +{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10 + +{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10 + + leaq 264(%rsp),%rsp + leaq 32(%r11),%r11 + decl %ebx + jne .Lloop7 + movq 0(%r11),%r13 + + vpbroadcastq 0(%r11),%ymm1 + movq 0(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + movq %r12,%r10 + adcq $0,%r10 + + movq %r8,%r13 + imulq %r9,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 0(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + adcq %r12,%r10 + + shrq $52,%r9 + salq $12,%r10 + orq %r10,%r9 + + leaq -264(%rsp),%rsp + +{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10 + +{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10 + + + vmovdqu %ymm3,0(%rsp) + vmovdqu %ymm4,32(%rsp) + vmovdqu %ymm5,64(%rsp) + vmovdqu %ymm6,96(%rsp) + vmovdqu %ymm7,128(%rsp) + vmovdqu %ymm8,160(%rsp) + vmovdqu %ymm9,192(%rsp) + vmovdqu %ymm10,224(%rsp) + movq $0,256(%rsp) + + vmovdqu 8(%rsp),%ymm3 + vmovdqu 40(%rsp),%ymm4 + vmovdqu 72(%rsp),%ymm5 + vmovdqu 104(%rsp),%ymm6 + vmovdqu 136(%rsp),%ymm7 + vmovdqu 168(%rsp),%ymm8 + vmovdqu 200(%rsp),%ymm9 + vmovdqu 232(%rsp),%ymm10 + + addq 8(%rsp),%r9 + +{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10 + +{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10 + + leaq 264(%rsp),%rsp + movq 8(%r11),%r13 + + vpbroadcastq 8(%r11),%ymm1 + movq 0(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + movq %r12,%r10 + adcq $0,%r10 + + movq %r8,%r13 + imulq %r9,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 0(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + adcq %r12,%r10 + + shrq $52,%r9 + salq $12,%r10 + orq %r10,%r9 + + leaq -264(%rsp),%rsp + +{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10 + +{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10 + + + vmovdqu %ymm3,0(%rsp) + vmovdqu %ymm4,32(%rsp) + vmovdqu %ymm5,64(%rsp) + vmovdqu %ymm6,96(%rsp) + vmovdqu %ymm7,128(%rsp) + vmovdqu %ymm8,160(%rsp) + vmovdqu %ymm9,192(%rsp) + vmovdqu %ymm10,224(%rsp) + movq $0,256(%rsp) + + vmovdqu 8(%rsp),%ymm3 + vmovdqu 40(%rsp),%ymm4 + vmovdqu 72(%rsp),%ymm5 + vmovdqu 104(%rsp),%ymm6 + vmovdqu 136(%rsp),%ymm7 + vmovdqu 168(%rsp),%ymm8 + vmovdqu 200(%rsp),%ymm9 + vmovdqu 232(%rsp),%ymm10 + + addq 8(%rsp),%r9 + +{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10 + +{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10 + + leaq 264(%rsp),%rsp + + vmovq %r9,%xmm0 + vpbroadcastq %xmm0,%ymm0 + vpblendd $3,%ymm0,%ymm3,%ymm3 + + + + vpsrlq $52,%ymm3,%ymm0 + vpsrlq $52,%ymm4,%ymm1 + vpsrlq $52,%ymm5,%ymm2 + vpsrlq $52,%ymm6,%ymm11 + vpsrlq $52,%ymm7,%ymm12 + vpsrlq $52,%ymm8,%ymm13 + vpsrlq $52,%ymm9,%ymm14 + vpsrlq $52,%ymm10,%ymm15 + + leaq -32(%rsp),%rsp + vmovupd %ymm3,(%rsp) + + + vpermq $144,%ymm15,%ymm15 + vpermq $3,%ymm14,%ymm3 + vblendpd $1,%ymm3,%ymm15,%ymm15 + + vpermq $144,%ymm14,%ymm14 + vpermq $3,%ymm13,%ymm3 + vblendpd $1,%ymm3,%ymm14,%ymm14 + + vpermq $144,%ymm13,%ymm13 + vpermq $3,%ymm12,%ymm3 + vblendpd $1,%ymm3,%ymm13,%ymm13 + + vpermq $144,%ymm12,%ymm12 + vpermq $3,%ymm11,%ymm3 + vblendpd $1,%ymm3,%ymm12,%ymm12 + + vpermq $144,%ymm11,%ymm11 + vpermq $3,%ymm2,%ymm3 + vblendpd $1,%ymm3,%ymm11,%ymm11 + + vpermq $144,%ymm2,%ymm2 + vpermq $3,%ymm1,%ymm3 + vblendpd $1,%ymm3,%ymm2,%ymm2 + + vpermq $144,%ymm1,%ymm1 + vpermq $3,%ymm0,%ymm3 + vblendpd $1,%ymm3,%ymm1,%ymm1 + + vpermq $144,%ymm0,%ymm0 + vpand .Lhigh64x3(%rip),%ymm0,%ymm0 + + vmovupd (%rsp),%ymm3 + leaq 32(%rsp),%rsp + + + vpand .Lmask52x4(%rip),%ymm3,%ymm3 + vpand .Lmask52x4(%rip),%ymm4,%ymm4 + vpand .Lmask52x4(%rip),%ymm5,%ymm5 + vpand .Lmask52x4(%rip),%ymm6,%ymm6 + vpand .Lmask52x4(%rip),%ymm7,%ymm7 + vpand .Lmask52x4(%rip),%ymm8,%ymm8 + vpand .Lmask52x4(%rip),%ymm9,%ymm9 + vpand .Lmask52x4(%rip),%ymm10,%ymm10 + + + vpaddq %ymm0,%ymm3,%ymm3 + vpaddq %ymm1,%ymm4,%ymm4 + vpaddq %ymm2,%ymm5,%ymm5 + vpaddq %ymm11,%ymm6,%ymm6 + vpaddq %ymm12,%ymm7,%ymm7 + vpaddq %ymm13,%ymm8,%ymm8 + vpaddq %ymm14,%ymm9,%ymm9 + vpaddq %ymm15,%ymm10,%ymm10 + + + + vpcmpgtq .Lmask52x4(%rip),%ymm3,%ymm0 + vpcmpgtq .Lmask52x4(%rip),%ymm4,%ymm1 + vmovmskpd %ymm0,%r14d + vmovmskpd %ymm1,%r13d + shlb $4,%r13b + orb %r13b,%r14b + + vpcmpgtq .Lmask52x4(%rip),%ymm5,%ymm2 + vpcmpgtq .Lmask52x4(%rip),%ymm6,%ymm11 + vmovmskpd %ymm2,%r13d + vmovmskpd %ymm11,%r12d + shlb $4,%r12b + orb %r12b,%r13b + + vpcmpgtq .Lmask52x4(%rip),%ymm7,%ymm12 + vpcmpgtq .Lmask52x4(%rip),%ymm8,%ymm13 + vmovmskpd %ymm12,%r12d + vmovmskpd %ymm13,%r11d + shlb $4,%r11b + orb %r11b,%r12b + + vpcmpgtq .Lmask52x4(%rip),%ymm9,%ymm14 + vpcmpgtq .Lmask52x4(%rip),%ymm10,%ymm15 + vmovmskpd %ymm14,%r11d + vmovmskpd %ymm15,%r10d + shlb $4,%r10b + orb %r10b,%r11b + + addb %r14b,%r14b + adcb %r13b,%r13b + adcb %r12b,%r12b + adcb %r11b,%r11b + + + vpcmpeqq .Lmask52x4(%rip),%ymm3,%ymm0 + vpcmpeqq .Lmask52x4(%rip),%ymm4,%ymm1 + vmovmskpd %ymm0,%r9d + vmovmskpd %ymm1,%r8d + shlb $4,%r8b + orb %r8b,%r9b + + vpcmpeqq .Lmask52x4(%rip),%ymm5,%ymm2 + vpcmpeqq .Lmask52x4(%rip),%ymm6,%ymm11 + vmovmskpd %ymm2,%r8d + vmovmskpd %ymm11,%edx + shlb $4,%dl + orb %dl,%r8b + + vpcmpeqq .Lmask52x4(%rip),%ymm7,%ymm12 + vpcmpeqq .Lmask52x4(%rip),%ymm8,%ymm13 + vmovmskpd %ymm12,%edx + vmovmskpd %ymm13,%ecx + shlb $4,%cl + orb %cl,%dl + + vpcmpeqq .Lmask52x4(%rip),%ymm9,%ymm14 + vpcmpeqq .Lmask52x4(%rip),%ymm10,%ymm15 + vmovmskpd %ymm14,%ecx + vmovmskpd %ymm15,%ebx + shlb $4,%bl + orb %bl,%cl + + addb %r9b,%r14b + adcb %r8b,%r13b + adcb %dl,%r12b + adcb %cl,%r11b + + xorb %r9b,%r14b + xorb %r8b,%r13b + xorb %dl,%r12b + xorb %cl,%r11b + + leaq .Lkmasklut(%rip),%rdx + + movb %r14b,%r10b + andq $0xf,%r14 + vpsubq .Lmask52x4(%rip),%ymm3,%ymm0 + shlq $5,%r14 + vmovapd (%rdx,%r14,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm3,%ymm3 + + shrb $4,%r10b + andq $0xf,%r10 + vpsubq .Lmask52x4(%rip),%ymm4,%ymm0 + shlq $5,%r10 + vmovapd (%rdx,%r10,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm4,%ymm4 + + movb %r13b,%r10b + andq $0xf,%r13 + vpsubq .Lmask52x4(%rip),%ymm5,%ymm0 + shlq $5,%r13 + vmovapd (%rdx,%r13,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm5,%ymm5 + + shrb $4,%r10b + andq $0xf,%r10 + vpsubq .Lmask52x4(%rip),%ymm6,%ymm0 + shlq $5,%r10 + vmovapd (%rdx,%r10,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm6,%ymm6 + + movb %r12b,%r10b + andq $0xf,%r12 + vpsubq .Lmask52x4(%rip),%ymm7,%ymm0 + shlq $5,%r12 + vmovapd (%rdx,%r12,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm7,%ymm7 + + shrb $4,%r10b + andq $0xf,%r10 + vpsubq .Lmask52x4(%rip),%ymm8,%ymm0 + shlq $5,%r10 + vmovapd (%rdx,%r10,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm8,%ymm8 + + movb %r11b,%r10b + andq $0xf,%r11 + vpsubq .Lmask52x4(%rip),%ymm9,%ymm0 + shlq $5,%r11 + vmovapd (%rdx,%r11,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm9,%ymm9 + + shrb $4,%r10b + andq $0xf,%r10 + vpsubq .Lmask52x4(%rip),%ymm10,%ymm0 + shlq $5,%r10 + vmovapd (%rdx,%r10,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm10,%ymm10 + + vpand .Lmask52x4(%rip),%ymm3,%ymm3 + vpand .Lmask52x4(%rip),%ymm4,%ymm4 + vpand .Lmask52x4(%rip),%ymm5,%ymm5 + vpand .Lmask52x4(%rip),%ymm6,%ymm6 + vpand .Lmask52x4(%rip),%ymm7,%ymm7 + vpand .Lmask52x4(%rip),%ymm8,%ymm8 + vpand .Lmask52x4(%rip),%ymm9,%ymm9 + + vpand .Lmask52x4(%rip),%ymm10,%ymm10 + + vmovdqu %ymm3,0(%rdi) + vmovdqu %ymm4,32(%rdi) + vmovdqu %ymm5,64(%rdi) + vmovdqu %ymm6,96(%rdi) + vmovdqu %ymm7,128(%rdi) + vmovdqu %ymm8,160(%rdi) + vmovdqu %ymm9,192(%rdi) + vmovdqu %ymm10,224(%rdi) + + vzeroupper + leaq (%rsp),%rax +.cfi_def_cfa_register %rax + movq 0(%rax),%r15 +.cfi_restore %r15 + movq 8(%rax),%r14 +.cfi_restore %r14 + movq 16(%rax),%r13 +.cfi_restore %r13 + movq 24(%rax),%r12 +.cfi_restore %r12 + movq 32(%rax),%rbp +.cfi_restore %rbp + movq 40(%rax),%rbx +.cfi_restore %rbx + leaq 48(%rax),%rsp +.cfi_def_cfa %rsp,8 +.Lossl_rsaz_amm52x30_x1_avxifma256_epilogue: + .byte 0xf3,0xc3 +.cfi_endproc +.size ossl_rsaz_amm52x30_x1_avxifma256, .-ossl_rsaz_amm52x30_x1_avxifma256 +.section .rodata +.align 32 +.Lmask52x4: +.quad 0xfffffffffffff +.quad 0xfffffffffffff +.quad 0xfffffffffffff +.quad 0xfffffffffffff +.Lhigh64x3: +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.Lkmasklut: + +.quad 0x0 +.quad 0x0 +.quad 0x0 +.quad 0x0 + +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0x0 +.quad 0x0 + +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0x0 + +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0x0 + +.quad 0x0 +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0x0 + +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0x0 + +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0x0 + +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0x0 + +.quad 0x0 +.quad 0x0 +.quad 0x0 +.quad 0xffffffffffffffff + +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0x0 +.quad 0xffffffffffffffff + +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0xffffffffffffffff + +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0xffffffffffffffff + +.quad 0x0 +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff + +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff + +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff + +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.text + +.globl ossl_rsaz_amm52x30_x2_avxifma256 +.type ossl_rsaz_amm52x30_x2_avxifma256,@function +.align 32 +ossl_rsaz_amm52x30_x2_avxifma256: +.cfi_startproc +.byte 243,15,30,250 + pushq %rbx +.cfi_adjust_cfa_offset 8 +.cfi_offset %rbx,-16 + pushq %rbp +.cfi_adjust_cfa_offset 8 +.cfi_offset %rbp,-24 + pushq %r12 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r12,-32 + pushq %r13 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r13,-40 + pushq %r14 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r14,-48 + pushq %r15 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r15,-56 + + vpxor %ymm0,%ymm0,%ymm0 + vmovapd %ymm0,%ymm3 + vmovapd %ymm0,%ymm4 + vmovapd %ymm0,%ymm5 + vmovapd %ymm0,%ymm6 + vmovapd %ymm0,%ymm7 + vmovapd %ymm0,%ymm8 + vmovapd %ymm0,%ymm9 + vmovapd %ymm0,%ymm10 + + xorl %r9d,%r9d + + movq %rdx,%r11 + movq $0xfffffffffffff,%rax + + movl $30,%ebx + +.align 32 +.Lloop30: + movq 0(%r11),%r13 + + vpbroadcastq 0(%r11),%ymm1 + movq 0(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + movq %r12,%r10 + adcq $0,%r10 + + movq (%r8),%r13 + imulq %r9,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 0(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + adcq %r12,%r10 + + shrq $52,%r9 + salq $12,%r10 + orq %r10,%r9 + + leaq -264(%rsp),%rsp + +{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10 + +{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10 + + + vmovdqu %ymm3,0(%rsp) + vmovdqu %ymm4,32(%rsp) + vmovdqu %ymm5,64(%rsp) + vmovdqu %ymm6,96(%rsp) + vmovdqu %ymm7,128(%rsp) + vmovdqu %ymm8,160(%rsp) + vmovdqu %ymm9,192(%rsp) + vmovdqu %ymm10,224(%rsp) + movq $0,256(%rsp) + + vmovdqu 8(%rsp),%ymm3 + vmovdqu 40(%rsp),%ymm4 + vmovdqu 72(%rsp),%ymm5 + vmovdqu 104(%rsp),%ymm6 + vmovdqu 136(%rsp),%ymm7 + vmovdqu 168(%rsp),%ymm8 + vmovdqu 200(%rsp),%ymm9 + vmovdqu 232(%rsp),%ymm10 + + addq 8(%rsp),%r9 + +{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10 + +{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10 + + leaq 264(%rsp),%rsp + leaq 8(%r11),%r11 + decl %ebx + jne .Lloop30 + + pushq %r11 + pushq %rsi + pushq %rcx + pushq %r8 + + vmovq %r9,%xmm0 + vpbroadcastq %xmm0,%ymm0 + vpblendd $3,%ymm0,%ymm3,%ymm3 + + + + vpsrlq $52,%ymm3,%ymm0 + vpsrlq $52,%ymm4,%ymm1 + vpsrlq $52,%ymm5,%ymm2 + vpsrlq $52,%ymm6,%ymm11 + vpsrlq $52,%ymm7,%ymm12 + vpsrlq $52,%ymm8,%ymm13 + vpsrlq $52,%ymm9,%ymm14 + vpsrlq $52,%ymm10,%ymm15 + + leaq -32(%rsp),%rsp + vmovupd %ymm3,(%rsp) + + + vpermq $144,%ymm15,%ymm15 + vpermq $3,%ymm14,%ymm3 + vblendpd $1,%ymm3,%ymm15,%ymm15 + + vpermq $144,%ymm14,%ymm14 + vpermq $3,%ymm13,%ymm3 + vblendpd $1,%ymm3,%ymm14,%ymm14 + + vpermq $144,%ymm13,%ymm13 + vpermq $3,%ymm12,%ymm3 + vblendpd $1,%ymm3,%ymm13,%ymm13 + + vpermq $144,%ymm12,%ymm12 + vpermq $3,%ymm11,%ymm3 + vblendpd $1,%ymm3,%ymm12,%ymm12 + + vpermq $144,%ymm11,%ymm11 + vpermq $3,%ymm2,%ymm3 + vblendpd $1,%ymm3,%ymm11,%ymm11 + + vpermq $144,%ymm2,%ymm2 + vpermq $3,%ymm1,%ymm3 + vblendpd $1,%ymm3,%ymm2,%ymm2 + + vpermq $144,%ymm1,%ymm1 + vpermq $3,%ymm0,%ymm3 + vblendpd $1,%ymm3,%ymm1,%ymm1 + + vpermq $144,%ymm0,%ymm0 + vpand .Lhigh64x3(%rip),%ymm0,%ymm0 + + vmovupd (%rsp),%ymm3 + leaq 32(%rsp),%rsp + + + vpand .Lmask52x4(%rip),%ymm3,%ymm3 + vpand .Lmask52x4(%rip),%ymm4,%ymm4 + vpand .Lmask52x4(%rip),%ymm5,%ymm5 + vpand .Lmask52x4(%rip),%ymm6,%ymm6 + vpand .Lmask52x4(%rip),%ymm7,%ymm7 + vpand .Lmask52x4(%rip),%ymm8,%ymm8 + vpand .Lmask52x4(%rip),%ymm9,%ymm9 + vpand .Lmask52x4(%rip),%ymm10,%ymm10 + + + vpaddq %ymm0,%ymm3,%ymm3 + vpaddq %ymm1,%ymm4,%ymm4 + vpaddq %ymm2,%ymm5,%ymm5 + vpaddq %ymm11,%ymm6,%ymm6 + vpaddq %ymm12,%ymm7,%ymm7 + vpaddq %ymm13,%ymm8,%ymm8 + vpaddq %ymm14,%ymm9,%ymm9 + vpaddq %ymm15,%ymm10,%ymm10 + + + + vpcmpgtq .Lmask52x4(%rip),%ymm3,%ymm0 + vpcmpgtq .Lmask52x4(%rip),%ymm4,%ymm1 + vmovmskpd %ymm0,%r14d + vmovmskpd %ymm1,%r13d + shlb $4,%r13b + orb %r13b,%r14b + + vpcmpgtq .Lmask52x4(%rip),%ymm5,%ymm2 + vpcmpgtq .Lmask52x4(%rip),%ymm6,%ymm11 + vmovmskpd %ymm2,%r13d + vmovmskpd %ymm11,%r12d + shlb $4,%r12b + orb %r12b,%r13b + + vpcmpgtq .Lmask52x4(%rip),%ymm7,%ymm12 + vpcmpgtq .Lmask52x4(%rip),%ymm8,%ymm13 + vmovmskpd %ymm12,%r12d + vmovmskpd %ymm13,%r11d + shlb $4,%r11b + orb %r11b,%r12b + + vpcmpgtq .Lmask52x4(%rip),%ymm9,%ymm14 + vpcmpgtq .Lmask52x4(%rip),%ymm10,%ymm15 + vmovmskpd %ymm14,%r11d + vmovmskpd %ymm15,%r10d + shlb $4,%r10b + orb %r10b,%r11b + + addb %r14b,%r14b + adcb %r13b,%r13b + adcb %r12b,%r12b + adcb %r11b,%r11b + + + vpcmpeqq .Lmask52x4(%rip),%ymm3,%ymm0 + vpcmpeqq .Lmask52x4(%rip),%ymm4,%ymm1 + vmovmskpd %ymm0,%r9d + vmovmskpd %ymm1,%r8d + shlb $4,%r8b + orb %r8b,%r9b + + vpcmpeqq .Lmask52x4(%rip),%ymm5,%ymm2 + vpcmpeqq .Lmask52x4(%rip),%ymm6,%ymm11 + vmovmskpd %ymm2,%r8d + vmovmskpd %ymm11,%edx + shlb $4,%dl + orb %dl,%r8b + + vpcmpeqq .Lmask52x4(%rip),%ymm7,%ymm12 + vpcmpeqq .Lmask52x4(%rip),%ymm8,%ymm13 + vmovmskpd %ymm12,%edx + vmovmskpd %ymm13,%ecx + shlb $4,%cl + orb %cl,%dl + + vpcmpeqq .Lmask52x4(%rip),%ymm9,%ymm14 + vpcmpeqq .Lmask52x4(%rip),%ymm10,%ymm15 + vmovmskpd %ymm14,%ecx + vmovmskpd %ymm15,%ebx + shlb $4,%bl + orb %bl,%cl + + addb %r9b,%r14b + adcb %r8b,%r13b + adcb %dl,%r12b + adcb %cl,%r11b + + xorb %r9b,%r14b + xorb %r8b,%r13b + xorb %dl,%r12b + xorb %cl,%r11b + + leaq .Lkmasklut(%rip),%rdx + + movb %r14b,%r10b + andq $0xf,%r14 + vpsubq .Lmask52x4(%rip),%ymm3,%ymm0 + shlq $5,%r14 + vmovapd (%rdx,%r14,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm3,%ymm3 + + shrb $4,%r10b + andq $0xf,%r10 + vpsubq .Lmask52x4(%rip),%ymm4,%ymm0 + shlq $5,%r10 + vmovapd (%rdx,%r10,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm4,%ymm4 + + movb %r13b,%r10b + andq $0xf,%r13 + vpsubq .Lmask52x4(%rip),%ymm5,%ymm0 + shlq $5,%r13 + vmovapd (%rdx,%r13,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm5,%ymm5 + + shrb $4,%r10b + andq $0xf,%r10 + vpsubq .Lmask52x4(%rip),%ymm6,%ymm0 + shlq $5,%r10 + vmovapd (%rdx,%r10,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm6,%ymm6 + + movb %r12b,%r10b + andq $0xf,%r12 + vpsubq .Lmask52x4(%rip),%ymm7,%ymm0 + shlq $5,%r12 + vmovapd (%rdx,%r12,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm7,%ymm7 + + shrb $4,%r10b + andq $0xf,%r10 + vpsubq .Lmask52x4(%rip),%ymm8,%ymm0 + shlq $5,%r10 + vmovapd (%rdx,%r10,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm8,%ymm8 + + movb %r11b,%r10b + andq $0xf,%r11 + vpsubq .Lmask52x4(%rip),%ymm9,%ymm0 + shlq $5,%r11 + vmovapd (%rdx,%r11,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm9,%ymm9 + + shrb $4,%r10b + andq $0xf,%r10 + vpsubq .Lmask52x4(%rip),%ymm10,%ymm0 + shlq $5,%r10 + vmovapd (%rdx,%r10,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm10,%ymm10 + + vpand .Lmask52x4(%rip),%ymm3,%ymm3 + vpand .Lmask52x4(%rip),%ymm4,%ymm4 + vpand .Lmask52x4(%rip),%ymm5,%ymm5 + vpand .Lmask52x4(%rip),%ymm6,%ymm6 + vpand .Lmask52x4(%rip),%ymm7,%ymm7 + vpand .Lmask52x4(%rip),%ymm8,%ymm8 + vpand .Lmask52x4(%rip),%ymm9,%ymm9 + + vpand .Lmask52x4(%rip),%ymm10,%ymm10 + popq %r8 + popq %rcx + popq %rsi + popq %r11 + + vmovdqu %ymm3,0(%rdi) + vmovdqu %ymm4,32(%rdi) + vmovdqu %ymm5,64(%rdi) + vmovdqu %ymm6,96(%rdi) + vmovdqu %ymm7,128(%rdi) + vmovdqu %ymm8,160(%rdi) + vmovdqu %ymm9,192(%rdi) + vmovdqu %ymm10,224(%rdi) + + xorl %r15d,%r15d + + leaq 16(%r11),%r11 + movq $0xfffffffffffff,%rax + + movl $30,%ebx + + vpxor %ymm0,%ymm0,%ymm0 + vmovapd %ymm0,%ymm3 + vmovapd %ymm0,%ymm4 + vmovapd %ymm0,%ymm5 + vmovapd %ymm0,%ymm6 + vmovapd %ymm0,%ymm7 + vmovapd %ymm0,%ymm8 + vmovapd %ymm0,%ymm9 + vmovapd %ymm0,%ymm10 +.align 32 +.Lloop40: + movq 0(%r11),%r13 + + vpbroadcastq 0(%r11),%ymm1 + movq 256(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + movq %r12,%r10 + adcq $0,%r10 + + movq 8(%r8),%r13 + imulq %r9,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 256(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + adcq %r12,%r10 + + shrq $52,%r9 + salq $12,%r10 + orq %r10,%r9 + + leaq -264(%rsp),%rsp + +{vex} vpmadd52luq 256(%rsi),%ymm1,%ymm3 +{vex} vpmadd52luq 288(%rsi),%ymm1,%ymm4 +{vex} vpmadd52luq 320(%rsi),%ymm1,%ymm5 +{vex} vpmadd52luq 352(%rsi),%ymm1,%ymm6 +{vex} vpmadd52luq 384(%rsi),%ymm1,%ymm7 +{vex} vpmadd52luq 416(%rsi),%ymm1,%ymm8 +{vex} vpmadd52luq 448(%rsi),%ymm1,%ymm9 +{vex} vpmadd52luq 480(%rsi),%ymm1,%ymm10 + +{vex} vpmadd52luq 256(%rcx),%ymm2,%ymm3 +{vex} vpmadd52luq 288(%rcx),%ymm2,%ymm4 +{vex} vpmadd52luq 320(%rcx),%ymm2,%ymm5 +{vex} vpmadd52luq 352(%rcx),%ymm2,%ymm6 +{vex} vpmadd52luq 384(%rcx),%ymm2,%ymm7 +{vex} vpmadd52luq 416(%rcx),%ymm2,%ymm8 +{vex} vpmadd52luq 448(%rcx),%ymm2,%ymm9 +{vex} vpmadd52luq 480(%rcx),%ymm2,%ymm10 + + + vmovdqu %ymm3,0(%rsp) + vmovdqu %ymm4,32(%rsp) + vmovdqu %ymm5,64(%rsp) + vmovdqu %ymm6,96(%rsp) + vmovdqu %ymm7,128(%rsp) + vmovdqu %ymm8,160(%rsp) + vmovdqu %ymm9,192(%rsp) + vmovdqu %ymm10,224(%rsp) + movq $0,256(%rsp) + + vmovdqu 8(%rsp),%ymm3 + vmovdqu 40(%rsp),%ymm4 + vmovdqu 72(%rsp),%ymm5 + vmovdqu 104(%rsp),%ymm6 + vmovdqu 136(%rsp),%ymm7 + vmovdqu 168(%rsp),%ymm8 + vmovdqu 200(%rsp),%ymm9 + vmovdqu 232(%rsp),%ymm10 + + addq 8(%rsp),%r9 + +{vex} vpmadd52huq 256(%rsi),%ymm1,%ymm3 +{vex} vpmadd52huq 288(%rsi),%ymm1,%ymm4 +{vex} vpmadd52huq 320(%rsi),%ymm1,%ymm5 +{vex} vpmadd52huq 352(%rsi),%ymm1,%ymm6 +{vex} vpmadd52huq 384(%rsi),%ymm1,%ymm7 +{vex} vpmadd52huq 416(%rsi),%ymm1,%ymm8 +{vex} vpmadd52huq 448(%rsi),%ymm1,%ymm9 +{vex} vpmadd52huq 480(%rsi),%ymm1,%ymm10 + +{vex} vpmadd52huq 256(%rcx),%ymm2,%ymm3 +{vex} vpmadd52huq 288(%rcx),%ymm2,%ymm4 +{vex} vpmadd52huq 320(%rcx),%ymm2,%ymm5 +{vex} vpmadd52huq 352(%rcx),%ymm2,%ymm6 +{vex} vpmadd52huq 384(%rcx),%ymm2,%ymm7 +{vex} vpmadd52huq 416(%rcx),%ymm2,%ymm8 +{vex} vpmadd52huq 448(%rcx),%ymm2,%ymm9 +{vex} vpmadd52huq 480(%rcx),%ymm2,%ymm10 + + leaq 264(%rsp),%rsp + leaq 8(%r11),%r11 + decl %ebx + jne .Lloop40 + + vmovq %r9,%xmm0 + vpbroadcastq %xmm0,%ymm0 + vpblendd $3,%ymm0,%ymm3,%ymm3 + + + + vpsrlq $52,%ymm3,%ymm0 + vpsrlq $52,%ymm4,%ymm1 + vpsrlq $52,%ymm5,%ymm2 + vpsrlq $52,%ymm6,%ymm11 + vpsrlq $52,%ymm7,%ymm12 + vpsrlq $52,%ymm8,%ymm13 + vpsrlq $52,%ymm9,%ymm14 + vpsrlq $52,%ymm10,%ymm15 + + leaq -32(%rsp),%rsp + vmovupd %ymm3,(%rsp) + + + vpermq $144,%ymm15,%ymm15 + vpermq $3,%ymm14,%ymm3 + vblendpd $1,%ymm3,%ymm15,%ymm15 + + vpermq $144,%ymm14,%ymm14 + vpermq $3,%ymm13,%ymm3 + vblendpd $1,%ymm3,%ymm14,%ymm14 + + vpermq $144,%ymm13,%ymm13 + vpermq $3,%ymm12,%ymm3 + vblendpd $1,%ymm3,%ymm13,%ymm13 + + vpermq $144,%ymm12,%ymm12 + vpermq $3,%ymm11,%ymm3 + vblendpd $1,%ymm3,%ymm12,%ymm12 + + vpermq $144,%ymm11,%ymm11 + vpermq $3,%ymm2,%ymm3 + vblendpd $1,%ymm3,%ymm11,%ymm11 + + vpermq $144,%ymm2,%ymm2 + vpermq $3,%ymm1,%ymm3 + vblendpd $1,%ymm3,%ymm2,%ymm2 + + vpermq $144,%ymm1,%ymm1 + vpermq $3,%ymm0,%ymm3 + vblendpd $1,%ymm3,%ymm1,%ymm1 + + vpermq $144,%ymm0,%ymm0 + vpand .Lhigh64x3(%rip),%ymm0,%ymm0 + + vmovupd (%rsp),%ymm3 + leaq 32(%rsp),%rsp + + + vpand .Lmask52x4(%rip),%ymm3,%ymm3 + vpand .Lmask52x4(%rip),%ymm4,%ymm4 + vpand .Lmask52x4(%rip),%ymm5,%ymm5 + vpand .Lmask52x4(%rip),%ymm6,%ymm6 + vpand .Lmask52x4(%rip),%ymm7,%ymm7 + vpand .Lmask52x4(%rip),%ymm8,%ymm8 + vpand .Lmask52x4(%rip),%ymm9,%ymm9 + vpand .Lmask52x4(%rip),%ymm10,%ymm10 + + + vpaddq %ymm0,%ymm3,%ymm3 + vpaddq %ymm1,%ymm4,%ymm4 + vpaddq %ymm2,%ymm5,%ymm5 + vpaddq %ymm11,%ymm6,%ymm6 + vpaddq %ymm12,%ymm7,%ymm7 + vpaddq %ymm13,%ymm8,%ymm8 + vpaddq %ymm14,%ymm9,%ymm9 + vpaddq %ymm15,%ymm10,%ymm10 + + + + vpcmpgtq .Lmask52x4(%rip),%ymm3,%ymm0 + vpcmpgtq .Lmask52x4(%rip),%ymm4,%ymm1 + vmovmskpd %ymm0,%r14d + vmovmskpd %ymm1,%r13d + shlb $4,%r13b + orb %r13b,%r14b + + vpcmpgtq .Lmask52x4(%rip),%ymm5,%ymm2 + vpcmpgtq .Lmask52x4(%rip),%ymm6,%ymm11 + vmovmskpd %ymm2,%r13d + vmovmskpd %ymm11,%r12d + shlb $4,%r12b + orb %r12b,%r13b + + vpcmpgtq .Lmask52x4(%rip),%ymm7,%ymm12 + vpcmpgtq .Lmask52x4(%rip),%ymm8,%ymm13 + vmovmskpd %ymm12,%r12d + vmovmskpd %ymm13,%r11d + shlb $4,%r11b + orb %r11b,%r12b + + vpcmpgtq .Lmask52x4(%rip),%ymm9,%ymm14 + vpcmpgtq .Lmask52x4(%rip),%ymm10,%ymm15 + vmovmskpd %ymm14,%r11d + vmovmskpd %ymm15,%r10d + shlb $4,%r10b + orb %r10b,%r11b + + addb %r14b,%r14b + adcb %r13b,%r13b + adcb %r12b,%r12b + adcb %r11b,%r11b + + + vpcmpeqq .Lmask52x4(%rip),%ymm3,%ymm0 + vpcmpeqq .Lmask52x4(%rip),%ymm4,%ymm1 + vmovmskpd %ymm0,%r9d + vmovmskpd %ymm1,%r8d + shlb $4,%r8b + orb %r8b,%r9b + + vpcmpeqq .Lmask52x4(%rip),%ymm5,%ymm2 + vpcmpeqq .Lmask52x4(%rip),%ymm6,%ymm11 + vmovmskpd %ymm2,%r8d + vmovmskpd %ymm11,%edx + shlb $4,%dl + orb %dl,%r8b + + vpcmpeqq .Lmask52x4(%rip),%ymm7,%ymm12 + vpcmpeqq .Lmask52x4(%rip),%ymm8,%ymm13 + vmovmskpd %ymm12,%edx + vmovmskpd %ymm13,%ecx + shlb $4,%cl + orb %cl,%dl + + vpcmpeqq .Lmask52x4(%rip),%ymm9,%ymm14 + vpcmpeqq .Lmask52x4(%rip),%ymm10,%ymm15 + vmovmskpd %ymm14,%ecx + vmovmskpd %ymm15,%ebx + shlb $4,%bl + orb %bl,%cl + + addb %r9b,%r14b + adcb %r8b,%r13b + adcb %dl,%r12b + adcb %cl,%r11b + + xorb %r9b,%r14b + xorb %r8b,%r13b + xorb %dl,%r12b + xorb %cl,%r11b + + leaq .Lkmasklut(%rip),%rdx + + movb %r14b,%r10b + andq $0xf,%r14 + vpsubq .Lmask52x4(%rip),%ymm3,%ymm0 + shlq $5,%r14 + vmovapd (%rdx,%r14,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm3,%ymm3 + + shrb $4,%r10b + andq $0xf,%r10 + vpsubq .Lmask52x4(%rip),%ymm4,%ymm0 + shlq $5,%r10 + vmovapd (%rdx,%r10,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm4,%ymm4 + + movb %r13b,%r10b + andq $0xf,%r13 + vpsubq .Lmask52x4(%rip),%ymm5,%ymm0 + shlq $5,%r13 + vmovapd (%rdx,%r13,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm5,%ymm5 + + shrb $4,%r10b + andq $0xf,%r10 + vpsubq .Lmask52x4(%rip),%ymm6,%ymm0 + shlq $5,%r10 + vmovapd (%rdx,%r10,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm6,%ymm6 + + movb %r12b,%r10b + andq $0xf,%r12 + vpsubq .Lmask52x4(%rip),%ymm7,%ymm0 + shlq $5,%r12 + vmovapd (%rdx,%r12,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm7,%ymm7 + + shrb $4,%r10b + andq $0xf,%r10 + vpsubq .Lmask52x4(%rip),%ymm8,%ymm0 + shlq $5,%r10 + vmovapd (%rdx,%r10,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm8,%ymm8 + + movb %r11b,%r10b + andq $0xf,%r11 + vpsubq .Lmask52x4(%rip),%ymm9,%ymm0 + shlq $5,%r11 + vmovapd (%rdx,%r11,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm9,%ymm9 + + shrb $4,%r10b + andq $0xf,%r10 + vpsubq .Lmask52x4(%rip),%ymm10,%ymm0 + shlq $5,%r10 + vmovapd (%rdx,%r10,1),%ymm2 + vblendvpd %ymm2,%ymm0,%ymm10,%ymm10 + + vpand .Lmask52x4(%rip),%ymm3,%ymm3 + vpand .Lmask52x4(%rip),%ymm4,%ymm4 + vpand .Lmask52x4(%rip),%ymm5,%ymm5 + vpand .Lmask52x4(%rip),%ymm6,%ymm6 + vpand .Lmask52x4(%rip),%ymm7,%ymm7 + vpand .Lmask52x4(%rip),%ymm8,%ymm8 + vpand .Lmask52x4(%rip),%ymm9,%ymm9 + + vpand .Lmask52x4(%rip),%ymm10,%ymm10 + + vmovdqu %ymm3,256(%rdi) + vmovdqu %ymm4,288(%rdi) + vmovdqu %ymm5,320(%rdi) + vmovdqu %ymm6,352(%rdi) + vmovdqu %ymm7,384(%rdi) + vmovdqu %ymm8,416(%rdi) + vmovdqu %ymm9,448(%rdi) + vmovdqu %ymm10,480(%rdi) + + vzeroupper + leaq (%rsp),%rax +.cfi_def_cfa_register %rax + movq 0(%rax),%r15 +.cfi_restore %r15 + movq 8(%rax),%r14 +.cfi_restore %r14 + movq 16(%rax),%r13 +.cfi_restore %r13 + movq 24(%rax),%r12 +.cfi_restore %r12 + movq 32(%rax),%rbp +.cfi_restore %rbp + movq 40(%rax),%rbx +.cfi_restore %rbx + leaq 48(%rax),%rsp +.cfi_def_cfa %rsp,8 +.Lossl_rsaz_amm52x30_x2_avxifma256_epilogue: + .byte 0xf3,0xc3 +.cfi_endproc +.size ossl_rsaz_amm52x30_x2_avxifma256, .-ossl_rsaz_amm52x30_x2_avxifma256 +.text + +.align 32 +.globl ossl_extract_multiplier_2x30_win5_avx +.type ossl_extract_multiplier_2x30_win5_avx,@function +ossl_extract_multiplier_2x30_win5_avx: +.cfi_startproc +.byte 243,15,30,250 + vmovapd .Lones(%rip),%ymm12 + vmovq %rdx,%xmm8 + vpbroadcastq %xmm8,%ymm10 + vmovq %rcx,%xmm8 + vpbroadcastq %xmm8,%ymm11 + leaq 16384(%rsi),%rax + + + vpxor %xmm0,%xmm0,%xmm0 + vmovapd %ymm0,%ymm9 + vmovapd %ymm0,%ymm1 + vmovapd %ymm0,%ymm2 + vmovapd %ymm0,%ymm3 + vmovapd %ymm0,%ymm4 + vmovapd %ymm0,%ymm5 + vmovapd %ymm0,%ymm6 + vmovapd %ymm0,%ymm7 + +.align 32 +.Lloop: + vpcmpeqq %ymm9,%ymm10,%ymm13 + vmovdqu 0(%rsi),%ymm8 + + vblendvpd %ymm13,%ymm8,%ymm0,%ymm0 + vmovdqu 32(%rsi),%ymm8 + + vblendvpd %ymm13,%ymm8,%ymm1,%ymm1 + vmovdqu 64(%rsi),%ymm8 + + vblendvpd %ymm13,%ymm8,%ymm2,%ymm2 + vmovdqu 96(%rsi),%ymm8 + + vblendvpd %ymm13,%ymm8,%ymm3,%ymm3 + vmovdqu 128(%rsi),%ymm8 + + vblendvpd %ymm13,%ymm8,%ymm4,%ymm4 + vmovdqu 160(%rsi),%ymm8 + + vblendvpd %ymm13,%ymm8,%ymm5,%ymm5 + vmovdqu 192(%rsi),%ymm8 + + vblendvpd %ymm13,%ymm8,%ymm6,%ymm6 + vmovdqu 224(%rsi),%ymm8 + + vblendvpd %ymm13,%ymm8,%ymm7,%ymm7 + vpaddq %ymm12,%ymm9,%ymm9 + addq $512,%rsi + cmpq %rsi,%rax + jne .Lloop + vmovdqu %ymm0,0(%rdi) + vmovdqu %ymm1,32(%rdi) + vmovdqu %ymm2,64(%rdi) + vmovdqu %ymm3,96(%rdi) + vmovdqu %ymm4,128(%rdi) + vmovdqu %ymm5,160(%rdi) + vmovdqu %ymm6,192(%rdi) + vmovdqu %ymm7,224(%rdi) + leaq -16384(%rax),%rsi + + + vpxor %xmm0,%xmm0,%xmm0 + vmovapd %ymm0,%ymm9 + vmovapd %ymm0,%ymm0 + vmovapd %ymm0,%ymm1 + vmovapd %ymm0,%ymm2 + vmovapd %ymm0,%ymm3 + vmovapd %ymm0,%ymm4 + vmovapd %ymm0,%ymm5 + vmovapd %ymm0,%ymm6 + vmovapd %ymm0,%ymm7 + +.align 32 +.Lloop_8_15: + vpcmpeqq %ymm9,%ymm11,%ymm13 + vmovdqu 256(%rsi),%ymm8 + + vblendvpd %ymm13,%ymm8,%ymm0,%ymm0 + vmovdqu 288(%rsi),%ymm8 + + vblendvpd %ymm13,%ymm8,%ymm1,%ymm1 + vmovdqu 320(%rsi),%ymm8 + + vblendvpd %ymm13,%ymm8,%ymm2,%ymm2 + vmovdqu 352(%rsi),%ymm8 + + vblendvpd %ymm13,%ymm8,%ymm3,%ymm3 + vmovdqu 384(%rsi),%ymm8 + + vblendvpd %ymm13,%ymm8,%ymm4,%ymm4 + vmovdqu 416(%rsi),%ymm8 + + vblendvpd %ymm13,%ymm8,%ymm5,%ymm5 + vmovdqu 448(%rsi),%ymm8 + + vblendvpd %ymm13,%ymm8,%ymm6,%ymm6 + vmovdqu 480(%rsi),%ymm8 + + vblendvpd %ymm13,%ymm8,%ymm7,%ymm7 + vpaddq %ymm12,%ymm9,%ymm9 + addq $512,%rsi + cmpq %rsi,%rax + jne .Lloop_8_15 + vmovdqu %ymm0,256(%rdi) + vmovdqu %ymm1,288(%rdi) + vmovdqu %ymm2,320(%rdi) + vmovdqu %ymm3,352(%rdi) + vmovdqu %ymm4,384(%rdi) + vmovdqu %ymm5,416(%rdi) + vmovdqu %ymm6,448(%rdi) + vmovdqu %ymm7,480(%rdi) + + .byte 0xf3,0xc3 +.cfi_endproc +.size ossl_extract_multiplier_2x30_win5_avx, .-ossl_extract_multiplier_2x30_win5_avx +.section .rodata +.align 32 +.Lones: +.quad 1,1,1,1 +.Lzeros: +.quad 0,0,0,0 + .section ".note.gnu.property", "a" + .p2align 3 + .long 1f - 0f + .long 4f - 1f + .long 5 +0: + # "GNU" encoded with .byte, since .asciz isn't supported + # on Solaris. + .byte 0x47 + .byte 0x4e + .byte 0x55 + .byte 0 +1: + .p2align 3 + .long 0xc0000002 + .long 3f - 2f +2: + .long 3 +3: + .p2align 3 +4: diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-4k-avxifma.s b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-4k-avxifma.s new file mode 100644 index 000000000000..5b5a89797411 --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/bn/rsaz-4k-avxifma.s @@ -0,0 +1,1922 @@ +.text + +.globl ossl_rsaz_amm52x40_x1_avxifma256 +.type ossl_rsaz_amm52x40_x1_avxifma256,@function +.align 32 +ossl_rsaz_amm52x40_x1_avxifma256: +.cfi_startproc +.byte 243,15,30,250 + pushq %rbx +.cfi_adjust_cfa_offset 8 +.cfi_offset %rbx,-16 + pushq %rbp +.cfi_adjust_cfa_offset 8 +.cfi_offset %rbp,-24 + pushq %r12 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r12,-32 + pushq %r13 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r13,-40 + pushq %r14 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r14,-48 + pushq %r15 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r15,-56 + + vpxor %ymm0,%ymm0,%ymm0 + vmovapd %ymm0,%ymm3 + vmovapd %ymm0,%ymm4 + vmovapd %ymm0,%ymm5 + vmovapd %ymm0,%ymm6 + vmovapd %ymm0,%ymm7 + vmovapd %ymm0,%ymm8 + vmovapd %ymm0,%ymm9 + vmovapd %ymm0,%ymm10 + vmovapd %ymm0,%ymm11 + vmovapd %ymm0,%ymm12 + + xorl %r9d,%r9d + + movq %rdx,%r11 + movq $0xfffffffffffff,%rax + + + movl $10,%ebx + +.align 32 +.Lloop10: + movq 0(%r11),%r13 + + vpbroadcastq 0(%r11),%ymm1 + movq 0(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + movq %r12,%r10 + adcq $0,%r10 + + movq %r8,%r13 + imulq %r9,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 0(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + adcq %r12,%r10 + + shrq $52,%r9 + salq $12,%r10 + orq %r10,%r9 + + leaq -328(%rsp),%rsp + +{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10 +{vex} vpmadd52luq 256(%rsi),%ymm1,%ymm11 +{vex} vpmadd52luq 288(%rsi),%ymm1,%ymm12 + +{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10 +{vex} vpmadd52luq 256(%rcx),%ymm2,%ymm11 +{vex} vpmadd52luq 288(%rcx),%ymm2,%ymm12 + vmovdqu %ymm3,0(%rsp) + vmovdqu %ymm4,32(%rsp) + vmovdqu %ymm5,64(%rsp) + vmovdqu %ymm6,96(%rsp) + vmovdqu %ymm7,128(%rsp) + vmovdqu %ymm8,160(%rsp) + vmovdqu %ymm9,192(%rsp) + vmovdqu %ymm10,224(%rsp) + vmovdqu %ymm11,256(%rsp) + vmovdqu %ymm12,288(%rsp) + movq $0,320(%rsp) + + vmovdqu 8(%rsp),%ymm3 + vmovdqu 40(%rsp),%ymm4 + vmovdqu 72(%rsp),%ymm5 + vmovdqu 104(%rsp),%ymm6 + vmovdqu 136(%rsp),%ymm7 + vmovdqu 168(%rsp),%ymm8 + vmovdqu 200(%rsp),%ymm9 + vmovdqu 232(%rsp),%ymm10 + vmovdqu 264(%rsp),%ymm11 + vmovdqu 296(%rsp),%ymm12 + + addq 8(%rsp),%r9 + +{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10 +{vex} vpmadd52huq 256(%rsi),%ymm1,%ymm11 +{vex} vpmadd52huq 288(%rsi),%ymm1,%ymm12 + +{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10 +{vex} vpmadd52huq 256(%rcx),%ymm2,%ymm11 +{vex} vpmadd52huq 288(%rcx),%ymm2,%ymm12 + leaq 328(%rsp),%rsp + movq 8(%r11),%r13 + + vpbroadcastq 8(%r11),%ymm1 + movq 0(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + movq %r12,%r10 + adcq $0,%r10 + + movq %r8,%r13 + imulq %r9,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 0(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + adcq %r12,%r10 + + shrq $52,%r9 + salq $12,%r10 + orq %r10,%r9 + + leaq -328(%rsp),%rsp + +{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10 +{vex} vpmadd52luq 256(%rsi),%ymm1,%ymm11 +{vex} vpmadd52luq 288(%rsi),%ymm1,%ymm12 + +{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10 +{vex} vpmadd52luq 256(%rcx),%ymm2,%ymm11 +{vex} vpmadd52luq 288(%rcx),%ymm2,%ymm12 + vmovdqu %ymm3,0(%rsp) + vmovdqu %ymm4,32(%rsp) + vmovdqu %ymm5,64(%rsp) + vmovdqu %ymm6,96(%rsp) + vmovdqu %ymm7,128(%rsp) + vmovdqu %ymm8,160(%rsp) + vmovdqu %ymm9,192(%rsp) + vmovdqu %ymm10,224(%rsp) + vmovdqu %ymm11,256(%rsp) + vmovdqu %ymm12,288(%rsp) + movq $0,320(%rsp) + + vmovdqu 8(%rsp),%ymm3 + vmovdqu 40(%rsp),%ymm4 + vmovdqu 72(%rsp),%ymm5 + vmovdqu 104(%rsp),%ymm6 + vmovdqu 136(%rsp),%ymm7 + vmovdqu 168(%rsp),%ymm8 + vmovdqu 200(%rsp),%ymm9 + vmovdqu 232(%rsp),%ymm10 + vmovdqu 264(%rsp),%ymm11 + vmovdqu 296(%rsp),%ymm12 + + addq 8(%rsp),%r9 + +{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10 +{vex} vpmadd52huq 256(%rsi),%ymm1,%ymm11 +{vex} vpmadd52huq 288(%rsi),%ymm1,%ymm12 + +{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10 +{vex} vpmadd52huq 256(%rcx),%ymm2,%ymm11 +{vex} vpmadd52huq 288(%rcx),%ymm2,%ymm12 + leaq 328(%rsp),%rsp + movq 16(%r11),%r13 + + vpbroadcastq 16(%r11),%ymm1 + movq 0(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + movq %r12,%r10 + adcq $0,%r10 + + movq %r8,%r13 + imulq %r9,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 0(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + adcq %r12,%r10 + + shrq $52,%r9 + salq $12,%r10 + orq %r10,%r9 + + leaq -328(%rsp),%rsp + +{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10 +{vex} vpmadd52luq 256(%rsi),%ymm1,%ymm11 +{vex} vpmadd52luq 288(%rsi),%ymm1,%ymm12 + +{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10 +{vex} vpmadd52luq 256(%rcx),%ymm2,%ymm11 +{vex} vpmadd52luq 288(%rcx),%ymm2,%ymm12 + vmovdqu %ymm3,0(%rsp) + vmovdqu %ymm4,32(%rsp) + vmovdqu %ymm5,64(%rsp) + vmovdqu %ymm6,96(%rsp) + vmovdqu %ymm7,128(%rsp) + vmovdqu %ymm8,160(%rsp) + vmovdqu %ymm9,192(%rsp) + vmovdqu %ymm10,224(%rsp) + vmovdqu %ymm11,256(%rsp) + vmovdqu %ymm12,288(%rsp) + movq $0,320(%rsp) + + vmovdqu 8(%rsp),%ymm3 + vmovdqu 40(%rsp),%ymm4 + vmovdqu 72(%rsp),%ymm5 + vmovdqu 104(%rsp),%ymm6 + vmovdqu 136(%rsp),%ymm7 + vmovdqu 168(%rsp),%ymm8 + vmovdqu 200(%rsp),%ymm9 + vmovdqu 232(%rsp),%ymm10 + vmovdqu 264(%rsp),%ymm11 + vmovdqu 296(%rsp),%ymm12 + + addq 8(%rsp),%r9 + +{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10 +{vex} vpmadd52huq 256(%rsi),%ymm1,%ymm11 +{vex} vpmadd52huq 288(%rsi),%ymm1,%ymm12 + +{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10 +{vex} vpmadd52huq 256(%rcx),%ymm2,%ymm11 +{vex} vpmadd52huq 288(%rcx),%ymm2,%ymm12 + leaq 328(%rsp),%rsp + movq 24(%r11),%r13 + + vpbroadcastq 24(%r11),%ymm1 + movq 0(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + movq %r12,%r10 + adcq $0,%r10 + + movq %r8,%r13 + imulq %r9,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 0(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + adcq %r12,%r10 + + shrq $52,%r9 + salq $12,%r10 + orq %r10,%r9 + + leaq -328(%rsp),%rsp + +{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10 +{vex} vpmadd52luq 256(%rsi),%ymm1,%ymm11 +{vex} vpmadd52luq 288(%rsi),%ymm1,%ymm12 + +{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10 +{vex} vpmadd52luq 256(%rcx),%ymm2,%ymm11 +{vex} vpmadd52luq 288(%rcx),%ymm2,%ymm12 + vmovdqu %ymm3,0(%rsp) + vmovdqu %ymm4,32(%rsp) + vmovdqu %ymm5,64(%rsp) + vmovdqu %ymm6,96(%rsp) + vmovdqu %ymm7,128(%rsp) + vmovdqu %ymm8,160(%rsp) + vmovdqu %ymm9,192(%rsp) + vmovdqu %ymm10,224(%rsp) + vmovdqu %ymm11,256(%rsp) + vmovdqu %ymm12,288(%rsp) + movq $0,320(%rsp) + + vmovdqu 8(%rsp),%ymm3 + vmovdqu 40(%rsp),%ymm4 + vmovdqu 72(%rsp),%ymm5 + vmovdqu 104(%rsp),%ymm6 + vmovdqu 136(%rsp),%ymm7 + vmovdqu 168(%rsp),%ymm8 + vmovdqu 200(%rsp),%ymm9 + vmovdqu 232(%rsp),%ymm10 + vmovdqu 264(%rsp),%ymm11 + vmovdqu 296(%rsp),%ymm12 + + addq 8(%rsp),%r9 + +{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10 +{vex} vpmadd52huq 256(%rsi),%ymm1,%ymm11 +{vex} vpmadd52huq 288(%rsi),%ymm1,%ymm12 + +{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10 +{vex} vpmadd52huq 256(%rcx),%ymm2,%ymm11 +{vex} vpmadd52huq 288(%rcx),%ymm2,%ymm12 + leaq 328(%rsp),%rsp + leaq 32(%r11),%r11 + decl %ebx + jne .Lloop10 + + vmovq %r9,%xmm0 + vpbroadcastq %xmm0,%ymm0 + vpblendd $3,%ymm0,%ymm3,%ymm3 + + leaq -640(%rsp),%rsp + vmovupd %ymm3,0(%rsp) + vmovupd %ymm4,32(%rsp) + vmovupd %ymm5,64(%rsp) + vmovupd %ymm6,96(%rsp) + vmovupd %ymm7,128(%rsp) + vmovupd %ymm8,160(%rsp) + vmovupd %ymm9,192(%rsp) + vmovupd %ymm10,224(%rsp) + vmovupd %ymm11,256(%rsp) + vmovupd %ymm12,288(%rsp) + + + + vpsrlq $52,%ymm3,%ymm3 + vpsrlq $52,%ymm4,%ymm4 + vpsrlq $52,%ymm5,%ymm5 + vpsrlq $52,%ymm6,%ymm6 + vpsrlq $52,%ymm7,%ymm7 + vpsrlq $52,%ymm8,%ymm8 + vpsrlq $52,%ymm9,%ymm9 + vpsrlq $52,%ymm10,%ymm10 + vpsrlq $52,%ymm11,%ymm11 + vpsrlq $52,%ymm12,%ymm12 + + + vpermq $144,%ymm12,%ymm12 + vpermq $3,%ymm11,%ymm13 + vblendpd $1,%ymm13,%ymm12,%ymm12 + + vpermq $144,%ymm11,%ymm11 + vpermq $3,%ymm10,%ymm13 + vblendpd $1,%ymm13,%ymm11,%ymm11 + + vpermq $144,%ymm10,%ymm10 + vpermq $3,%ymm9,%ymm13 + vblendpd $1,%ymm13,%ymm10,%ymm10 + + vpermq $144,%ymm9,%ymm9 + vpermq $3,%ymm8,%ymm13 + vblendpd $1,%ymm13,%ymm9,%ymm9 + + vpermq $144,%ymm8,%ymm8 + vpermq $3,%ymm7,%ymm13 + vblendpd $1,%ymm13,%ymm8,%ymm8 + + vpermq $144,%ymm7,%ymm7 + vpermq $3,%ymm6,%ymm13 + vblendpd $1,%ymm13,%ymm7,%ymm7 + + vpermq $144,%ymm6,%ymm6 + vpermq $3,%ymm5,%ymm13 + vblendpd $1,%ymm13,%ymm6,%ymm6 + + vpermq $144,%ymm5,%ymm5 + vpermq $3,%ymm4,%ymm13 + vblendpd $1,%ymm13,%ymm5,%ymm5 + + vpermq $144,%ymm4,%ymm4 + vpermq $3,%ymm3,%ymm13 + vblendpd $1,%ymm13,%ymm4,%ymm4 + + vpermq $144,%ymm3,%ymm3 + vpand .Lhigh64x3(%rip),%ymm3,%ymm3 + + vmovupd %ymm3,320(%rsp) + vmovupd %ymm4,352(%rsp) + vmovupd %ymm5,384(%rsp) + vmovupd %ymm6,416(%rsp) + vmovupd %ymm7,448(%rsp) + vmovupd %ymm8,480(%rsp) + vmovupd %ymm9,512(%rsp) + vmovupd %ymm10,544(%rsp) + vmovupd %ymm11,576(%rsp) + vmovupd %ymm12,608(%rsp) + + vmovupd 0(%rsp),%ymm3 + vmovupd 32(%rsp),%ymm4 + vmovupd 64(%rsp),%ymm5 + vmovupd 96(%rsp),%ymm6 + vmovupd 128(%rsp),%ymm7 + vmovupd 160(%rsp),%ymm8 + vmovupd 192(%rsp),%ymm9 + vmovupd 224(%rsp),%ymm10 + vmovupd 256(%rsp),%ymm11 + vmovupd 288(%rsp),%ymm12 + + + vpand .Lmask52x4(%rip),%ymm3,%ymm3 + vpand .Lmask52x4(%rip),%ymm4,%ymm4 + vpand .Lmask52x4(%rip),%ymm5,%ymm5 + vpand .Lmask52x4(%rip),%ymm6,%ymm6 + vpand .Lmask52x4(%rip),%ymm7,%ymm7 + vpand .Lmask52x4(%rip),%ymm8,%ymm8 + vpand .Lmask52x4(%rip),%ymm9,%ymm9 + vpand .Lmask52x4(%rip),%ymm10,%ymm10 + vpand .Lmask52x4(%rip),%ymm11,%ymm11 + vpand .Lmask52x4(%rip),%ymm12,%ymm12 + + + vpaddq 320(%rsp),%ymm3,%ymm3 + vpaddq 352(%rsp),%ymm4,%ymm4 + vpaddq 384(%rsp),%ymm5,%ymm5 + vpaddq 416(%rsp),%ymm6,%ymm6 + vpaddq 448(%rsp),%ymm7,%ymm7 + vpaddq 480(%rsp),%ymm8,%ymm8 + vpaddq 512(%rsp),%ymm9,%ymm9 + vpaddq 544(%rsp),%ymm10,%ymm10 + vpaddq 576(%rsp),%ymm11,%ymm11 + vpaddq 608(%rsp),%ymm12,%ymm12 + + leaq 640(%rsp),%rsp + + + + vpcmpgtq .Lmask52x4(%rip),%ymm3,%ymm13 + vmovmskpd %ymm13,%r14d + vpcmpgtq .Lmask52x4(%rip),%ymm4,%ymm13 + vmovmskpd %ymm13,%r13d + shlb $4,%r13b + orb %r13b,%r14b + + vpcmpgtq .Lmask52x4(%rip),%ymm5,%ymm13 + vmovmskpd %ymm13,%r13d + vpcmpgtq .Lmask52x4(%rip),%ymm6,%ymm13 + vmovmskpd %ymm13,%r12d + shlb $4,%r12b + orb %r12b,%r13b + + vpcmpgtq .Lmask52x4(%rip),%ymm7,%ymm13 + vmovmskpd %ymm13,%r12d + vpcmpgtq .Lmask52x4(%rip),%ymm8,%ymm13 + vmovmskpd %ymm13,%r11d + shlb $4,%r11b + orb %r11b,%r12b + + vpcmpgtq .Lmask52x4(%rip),%ymm9,%ymm13 + vmovmskpd %ymm13,%r11d + vpcmpgtq .Lmask52x4(%rip),%ymm10,%ymm13 + vmovmskpd %ymm13,%r10d + shlb $4,%r10b + orb %r10b,%r11b + + vpcmpgtq .Lmask52x4(%rip),%ymm11,%ymm13 + vmovmskpd %ymm13,%r10d + vpcmpgtq .Lmask52x4(%rip),%ymm12,%ymm13 + vmovmskpd %ymm13,%r9d + shlb $4,%r9b + orb %r9b,%r10b + + addb %r14b,%r14b + adcb %r13b,%r13b + adcb %r12b,%r12b + adcb %r11b,%r11b + adcb %r10b,%r10b + + + vpcmpeqq .Lmask52x4(%rip),%ymm3,%ymm13 + vmovmskpd %ymm13,%r9d + vpcmpeqq .Lmask52x4(%rip),%ymm4,%ymm13 + vmovmskpd %ymm13,%r8d + shlb $4,%r8b + orb %r8b,%r9b + + vpcmpeqq .Lmask52x4(%rip),%ymm5,%ymm13 + vmovmskpd %ymm13,%r8d + vpcmpeqq .Lmask52x4(%rip),%ymm6,%ymm13 + vmovmskpd %ymm13,%edx + shlb $4,%dl + orb %dl,%r8b + + vpcmpeqq .Lmask52x4(%rip),%ymm7,%ymm13 + vmovmskpd %ymm13,%edx + vpcmpeqq .Lmask52x4(%rip),%ymm8,%ymm13 + vmovmskpd %ymm13,%ecx + shlb $4,%cl + orb %cl,%dl + + vpcmpeqq .Lmask52x4(%rip),%ymm9,%ymm13 + vmovmskpd %ymm13,%ecx + vpcmpeqq .Lmask52x4(%rip),%ymm10,%ymm13 + vmovmskpd %ymm13,%ebx + shlb $4,%bl + orb %bl,%cl + + vpcmpeqq .Lmask52x4(%rip),%ymm11,%ymm13 + vmovmskpd %ymm13,%ebx + vpcmpeqq .Lmask52x4(%rip),%ymm12,%ymm13 + vmovmskpd %ymm13,%eax + shlb $4,%al + orb %al,%bl + + addb %r9b,%r14b + adcb %r8b,%r13b + adcb %dl,%r12b + adcb %cl,%r11b + adcb %bl,%r10b + + xorb %r9b,%r14b + xorb %r8b,%r13b + xorb %dl,%r12b + xorb %cl,%r11b + xorb %bl,%r10b + + pushq %r9 + pushq %r8 + + leaq .Lkmasklut(%rip),%r8 + + movb %r14b,%r9b + andq $0xf,%r14 + vpsubq .Lmask52x4(%rip),%ymm3,%ymm13 + shlq $5,%r14 + vmovapd (%r8,%r14,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm3,%ymm3 + + shrb $4,%r9b + andq $0xf,%r9 + vpsubq .Lmask52x4(%rip),%ymm4,%ymm13 + shlq $5,%r9 + vmovapd (%r8,%r9,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm4,%ymm4 + + movb %r13b,%r9b + andq $0xf,%r13 + vpsubq .Lmask52x4(%rip),%ymm5,%ymm13 + shlq $5,%r13 + vmovapd (%r8,%r13,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm5,%ymm5 + + shrb $4,%r9b + andq $0xf,%r9 + vpsubq .Lmask52x4(%rip),%ymm6,%ymm13 + shlq $5,%r9 + vmovapd (%r8,%r9,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm6,%ymm6 + + movb %r12b,%r9b + andq $0xf,%r12 + vpsubq .Lmask52x4(%rip),%ymm7,%ymm13 + shlq $5,%r12 + vmovapd (%r8,%r12,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm7,%ymm7 + + shrb $4,%r9b + andq $0xf,%r9 + vpsubq .Lmask52x4(%rip),%ymm8,%ymm13 + shlq $5,%r9 + vmovapd (%r8,%r9,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm8,%ymm8 + + movb %r11b,%r9b + andq $0xf,%r11 + vpsubq .Lmask52x4(%rip),%ymm9,%ymm13 + shlq $5,%r11 + vmovapd (%r8,%r11,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm9,%ymm9 + + shrb $4,%r9b + andq $0xf,%r9 + vpsubq .Lmask52x4(%rip),%ymm10,%ymm13 + shlq $5,%r9 + vmovapd (%r8,%r9,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm10,%ymm10 + + movb %r10b,%r9b + andq $0xf,%r10 + vpsubq .Lmask52x4(%rip),%ymm11,%ymm13 + shlq $5,%r10 + vmovapd (%r8,%r10,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm11,%ymm11 + + shrb $4,%r9b + andq $0xf,%r9 + vpsubq .Lmask52x4(%rip),%ymm12,%ymm13 + shlq $5,%r9 + vmovapd (%r8,%r9,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm12,%ymm12 + + popq %r8 + popq %r9 + + vpand .Lmask52x4(%rip),%ymm3,%ymm3 + vpand .Lmask52x4(%rip),%ymm4,%ymm4 + vpand .Lmask52x4(%rip),%ymm5,%ymm5 + vpand .Lmask52x4(%rip),%ymm6,%ymm6 + vpand .Lmask52x4(%rip),%ymm7,%ymm7 + vpand .Lmask52x4(%rip),%ymm8,%ymm8 + vpand .Lmask52x4(%rip),%ymm9,%ymm9 + + vpand .Lmask52x4(%rip),%ymm10,%ymm10 + vpand .Lmask52x4(%rip),%ymm11,%ymm11 + vpand .Lmask52x4(%rip),%ymm12,%ymm12 + + vmovdqu %ymm3,0(%rdi) + vmovdqu %ymm4,32(%rdi) + vmovdqu %ymm5,64(%rdi) + vmovdqu %ymm6,96(%rdi) + vmovdqu %ymm7,128(%rdi) + vmovdqu %ymm8,160(%rdi) + vmovdqu %ymm9,192(%rdi) + vmovdqu %ymm10,224(%rdi) + vmovdqu %ymm11,256(%rdi) + vmovdqu %ymm12,288(%rdi) + + vzeroupper + leaq (%rsp),%rax +.cfi_def_cfa_register %rax + movq 0(%rax),%r15 +.cfi_restore %r15 + movq 8(%rax),%r14 +.cfi_restore %r14 + movq 16(%rax),%r13 +.cfi_restore %r13 + movq 24(%rax),%r12 +.cfi_restore %r12 + movq 32(%rax),%rbp +.cfi_restore %rbp + movq 40(%rax),%rbx +.cfi_restore %rbx + leaq 48(%rax),%rsp +.cfi_def_cfa %rsp,8 +.Lossl_rsaz_amm52x40_x1_avxifma256_epilogue: + + .byte 0xf3,0xc3 +.cfi_endproc +.size ossl_rsaz_amm52x40_x1_avxifma256, .-ossl_rsaz_amm52x40_x1_avxifma256 +.section .rodata +.align 32 +.Lmask52x4: +.quad 0xfffffffffffff +.quad 0xfffffffffffff +.quad 0xfffffffffffff +.quad 0xfffffffffffff +.Lhigh64x3: +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.Lkmasklut: + +.quad 0x0 +.quad 0x0 +.quad 0x0 +.quad 0x0 + +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0x0 +.quad 0x0 + +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0x0 + +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0x0 + +.quad 0x0 +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0x0 + +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0x0 + +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0x0 + +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0x0 + +.quad 0x0 +.quad 0x0 +.quad 0x0 +.quad 0xffffffffffffffff + +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0x0 +.quad 0xffffffffffffffff + +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0xffffffffffffffff + +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0xffffffffffffffff + +.quad 0x0 +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff + +.quad 0xffffffffffffffff +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff + +.quad 0x0 +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff + +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.quad 0xffffffffffffffff +.text + +.globl ossl_rsaz_amm52x40_x2_avxifma256 +.type ossl_rsaz_amm52x40_x2_avxifma256,@function +.align 32 +ossl_rsaz_amm52x40_x2_avxifma256: +.cfi_startproc +.byte 243,15,30,250 + pushq %rbx +.cfi_adjust_cfa_offset 8 +.cfi_offset %rbx,-16 + pushq %rbp +.cfi_adjust_cfa_offset 8 +.cfi_offset %rbp,-24 + pushq %r12 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r12,-32 + pushq %r13 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r13,-40 + pushq %r14 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r14,-48 + pushq %r15 +.cfi_adjust_cfa_offset 8 +.cfi_offset %r15,-56 + + vpxor %ymm0,%ymm0,%ymm0 + vmovapd %ymm0,%ymm3 + vmovapd %ymm0,%ymm4 + vmovapd %ymm0,%ymm5 + vmovapd %ymm0,%ymm6 + vmovapd %ymm0,%ymm7 + vmovapd %ymm0,%ymm8 + vmovapd %ymm0,%ymm9 + vmovapd %ymm0,%ymm10 + vmovapd %ymm0,%ymm11 + vmovapd %ymm0,%ymm12 + + xorl %r9d,%r9d + + movq %rdx,%r11 + movq $0xfffffffffffff,%rax + + movl $40,%ebx + +.align 32 +.Lloop40: + movq 0(%r11),%r13 + + vpbroadcastq 0(%r11),%ymm1 + movq 0(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + movq %r12,%r10 + adcq $0,%r10 + + movq (%r8),%r13 + imulq %r9,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 0(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + adcq %r12,%r10 + + shrq $52,%r9 + salq $12,%r10 + orq %r10,%r9 + + leaq -328(%rsp),%rsp + +{vex} vpmadd52luq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52luq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52luq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52luq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52luq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52luq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52luq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52luq 224(%rsi),%ymm1,%ymm10 +{vex} vpmadd52luq 256(%rsi),%ymm1,%ymm11 +{vex} vpmadd52luq 288(%rsi),%ymm1,%ymm12 + +{vex} vpmadd52luq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52luq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52luq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52luq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52luq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52luq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52luq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52luq 224(%rcx),%ymm2,%ymm10 +{vex} vpmadd52luq 256(%rcx),%ymm2,%ymm11 +{vex} vpmadd52luq 288(%rcx),%ymm2,%ymm12 + vmovdqu %ymm3,0(%rsp) + vmovdqu %ymm4,32(%rsp) + vmovdqu %ymm5,64(%rsp) + vmovdqu %ymm6,96(%rsp) + vmovdqu %ymm7,128(%rsp) + vmovdqu %ymm8,160(%rsp) + vmovdqu %ymm9,192(%rsp) + vmovdqu %ymm10,224(%rsp) + vmovdqu %ymm11,256(%rsp) + vmovdqu %ymm12,288(%rsp) + movq $0,320(%rsp) + + vmovdqu 8(%rsp),%ymm3 + vmovdqu 40(%rsp),%ymm4 + vmovdqu 72(%rsp),%ymm5 + vmovdqu 104(%rsp),%ymm6 + vmovdqu 136(%rsp),%ymm7 + vmovdqu 168(%rsp),%ymm8 + vmovdqu 200(%rsp),%ymm9 + vmovdqu 232(%rsp),%ymm10 + vmovdqu 264(%rsp),%ymm11 + vmovdqu 296(%rsp),%ymm12 + + addq 8(%rsp),%r9 + +{vex} vpmadd52huq 0(%rsi),%ymm1,%ymm3 +{vex} vpmadd52huq 32(%rsi),%ymm1,%ymm4 +{vex} vpmadd52huq 64(%rsi),%ymm1,%ymm5 +{vex} vpmadd52huq 96(%rsi),%ymm1,%ymm6 +{vex} vpmadd52huq 128(%rsi),%ymm1,%ymm7 +{vex} vpmadd52huq 160(%rsi),%ymm1,%ymm8 +{vex} vpmadd52huq 192(%rsi),%ymm1,%ymm9 +{vex} vpmadd52huq 224(%rsi),%ymm1,%ymm10 +{vex} vpmadd52huq 256(%rsi),%ymm1,%ymm11 +{vex} vpmadd52huq 288(%rsi),%ymm1,%ymm12 + +{vex} vpmadd52huq 0(%rcx),%ymm2,%ymm3 +{vex} vpmadd52huq 32(%rcx),%ymm2,%ymm4 +{vex} vpmadd52huq 64(%rcx),%ymm2,%ymm5 +{vex} vpmadd52huq 96(%rcx),%ymm2,%ymm6 +{vex} vpmadd52huq 128(%rcx),%ymm2,%ymm7 +{vex} vpmadd52huq 160(%rcx),%ymm2,%ymm8 +{vex} vpmadd52huq 192(%rcx),%ymm2,%ymm9 +{vex} vpmadd52huq 224(%rcx),%ymm2,%ymm10 +{vex} vpmadd52huq 256(%rcx),%ymm2,%ymm11 +{vex} vpmadd52huq 288(%rcx),%ymm2,%ymm12 + leaq 328(%rsp),%rsp + leaq 8(%r11),%r11 + decl %ebx + jne .Lloop40 + + pushq %r11 + pushq %rsi + pushq %rcx + pushq %r8 + + vmovq %r9,%xmm0 + vpbroadcastq %xmm0,%ymm0 + vpblendd $3,%ymm0,%ymm3,%ymm3 + + leaq -640(%rsp),%rsp + vmovupd %ymm3,0(%rsp) + vmovupd %ymm4,32(%rsp) + vmovupd %ymm5,64(%rsp) + vmovupd %ymm6,96(%rsp) + vmovupd %ymm7,128(%rsp) + vmovupd %ymm8,160(%rsp) + vmovupd %ymm9,192(%rsp) + vmovupd %ymm10,224(%rsp) + vmovupd %ymm11,256(%rsp) + vmovupd %ymm12,288(%rsp) + + + + vpsrlq $52,%ymm3,%ymm3 + vpsrlq $52,%ymm4,%ymm4 + vpsrlq $52,%ymm5,%ymm5 + vpsrlq $52,%ymm6,%ymm6 + vpsrlq $52,%ymm7,%ymm7 + vpsrlq $52,%ymm8,%ymm8 + vpsrlq $52,%ymm9,%ymm9 + vpsrlq $52,%ymm10,%ymm10 + vpsrlq $52,%ymm11,%ymm11 + vpsrlq $52,%ymm12,%ymm12 + + + vpermq $144,%ymm12,%ymm12 + vpermq $3,%ymm11,%ymm13 + vblendpd $1,%ymm13,%ymm12,%ymm12 + + vpermq $144,%ymm11,%ymm11 + vpermq $3,%ymm10,%ymm13 + vblendpd $1,%ymm13,%ymm11,%ymm11 + + vpermq $144,%ymm10,%ymm10 + vpermq $3,%ymm9,%ymm13 + vblendpd $1,%ymm13,%ymm10,%ymm10 + + vpermq $144,%ymm9,%ymm9 + vpermq $3,%ymm8,%ymm13 + vblendpd $1,%ymm13,%ymm9,%ymm9 + + vpermq $144,%ymm8,%ymm8 + vpermq $3,%ymm7,%ymm13 + vblendpd $1,%ymm13,%ymm8,%ymm8 + + vpermq $144,%ymm7,%ymm7 + vpermq $3,%ymm6,%ymm13 + vblendpd $1,%ymm13,%ymm7,%ymm7 + + vpermq $144,%ymm6,%ymm6 + vpermq $3,%ymm5,%ymm13 + vblendpd $1,%ymm13,%ymm6,%ymm6 + + vpermq $144,%ymm5,%ymm5 + vpermq $3,%ymm4,%ymm13 + vblendpd $1,%ymm13,%ymm5,%ymm5 + + vpermq $144,%ymm4,%ymm4 + vpermq $3,%ymm3,%ymm13 + vblendpd $1,%ymm13,%ymm4,%ymm4 + + vpermq $144,%ymm3,%ymm3 + vpand .Lhigh64x3(%rip),%ymm3,%ymm3 + + vmovupd %ymm3,320(%rsp) + vmovupd %ymm4,352(%rsp) + vmovupd %ymm5,384(%rsp) + vmovupd %ymm6,416(%rsp) + vmovupd %ymm7,448(%rsp) + vmovupd %ymm8,480(%rsp) + vmovupd %ymm9,512(%rsp) + vmovupd %ymm10,544(%rsp) + vmovupd %ymm11,576(%rsp) + vmovupd %ymm12,608(%rsp) + + vmovupd 0(%rsp),%ymm3 + vmovupd 32(%rsp),%ymm4 + vmovupd 64(%rsp),%ymm5 + vmovupd 96(%rsp),%ymm6 + vmovupd 128(%rsp),%ymm7 + vmovupd 160(%rsp),%ymm8 + vmovupd 192(%rsp),%ymm9 + vmovupd 224(%rsp),%ymm10 + vmovupd 256(%rsp),%ymm11 + vmovupd 288(%rsp),%ymm12 + + + vpand .Lmask52x4(%rip),%ymm3,%ymm3 + vpand .Lmask52x4(%rip),%ymm4,%ymm4 + vpand .Lmask52x4(%rip),%ymm5,%ymm5 + vpand .Lmask52x4(%rip),%ymm6,%ymm6 + vpand .Lmask52x4(%rip),%ymm7,%ymm7 + vpand .Lmask52x4(%rip),%ymm8,%ymm8 + vpand .Lmask52x4(%rip),%ymm9,%ymm9 + vpand .Lmask52x4(%rip),%ymm10,%ymm10 + vpand .Lmask52x4(%rip),%ymm11,%ymm11 + vpand .Lmask52x4(%rip),%ymm12,%ymm12 + + + vpaddq 320(%rsp),%ymm3,%ymm3 + vpaddq 352(%rsp),%ymm4,%ymm4 + vpaddq 384(%rsp),%ymm5,%ymm5 + vpaddq 416(%rsp),%ymm6,%ymm6 + vpaddq 448(%rsp),%ymm7,%ymm7 + vpaddq 480(%rsp),%ymm8,%ymm8 + vpaddq 512(%rsp),%ymm9,%ymm9 + vpaddq 544(%rsp),%ymm10,%ymm10 + vpaddq 576(%rsp),%ymm11,%ymm11 + vpaddq 608(%rsp),%ymm12,%ymm12 + + leaq 640(%rsp),%rsp + + + + vpcmpgtq .Lmask52x4(%rip),%ymm3,%ymm13 + vmovmskpd %ymm13,%r14d + vpcmpgtq .Lmask52x4(%rip),%ymm4,%ymm13 + vmovmskpd %ymm13,%r13d + shlb $4,%r13b + orb %r13b,%r14b + + vpcmpgtq .Lmask52x4(%rip),%ymm5,%ymm13 + vmovmskpd %ymm13,%r13d + vpcmpgtq .Lmask52x4(%rip),%ymm6,%ymm13 + vmovmskpd %ymm13,%r12d + shlb $4,%r12b + orb %r12b,%r13b + + vpcmpgtq .Lmask52x4(%rip),%ymm7,%ymm13 + vmovmskpd %ymm13,%r12d + vpcmpgtq .Lmask52x4(%rip),%ymm8,%ymm13 + vmovmskpd %ymm13,%r11d + shlb $4,%r11b + orb %r11b,%r12b + + vpcmpgtq .Lmask52x4(%rip),%ymm9,%ymm13 + vmovmskpd %ymm13,%r11d + vpcmpgtq .Lmask52x4(%rip),%ymm10,%ymm13 + vmovmskpd %ymm13,%r10d + shlb $4,%r10b + orb %r10b,%r11b + + vpcmpgtq .Lmask52x4(%rip),%ymm11,%ymm13 + vmovmskpd %ymm13,%r10d + vpcmpgtq .Lmask52x4(%rip),%ymm12,%ymm13 + vmovmskpd %ymm13,%r9d + shlb $4,%r9b + orb %r9b,%r10b + + addb %r14b,%r14b + adcb %r13b,%r13b + adcb %r12b,%r12b + adcb %r11b,%r11b + adcb %r10b,%r10b + + + vpcmpeqq .Lmask52x4(%rip),%ymm3,%ymm13 + vmovmskpd %ymm13,%r9d + vpcmpeqq .Lmask52x4(%rip),%ymm4,%ymm13 + vmovmskpd %ymm13,%r8d + shlb $4,%r8b + orb %r8b,%r9b + + vpcmpeqq .Lmask52x4(%rip),%ymm5,%ymm13 + vmovmskpd %ymm13,%r8d + vpcmpeqq .Lmask52x4(%rip),%ymm6,%ymm13 + vmovmskpd %ymm13,%edx + shlb $4,%dl + orb %dl,%r8b + + vpcmpeqq .Lmask52x4(%rip),%ymm7,%ymm13 + vmovmskpd %ymm13,%edx + vpcmpeqq .Lmask52x4(%rip),%ymm8,%ymm13 + vmovmskpd %ymm13,%ecx + shlb $4,%cl + orb %cl,%dl + + vpcmpeqq .Lmask52x4(%rip),%ymm9,%ymm13 + vmovmskpd %ymm13,%ecx + vpcmpeqq .Lmask52x4(%rip),%ymm10,%ymm13 + vmovmskpd %ymm13,%ebx + shlb $4,%bl + orb %bl,%cl + + vpcmpeqq .Lmask52x4(%rip),%ymm11,%ymm13 + vmovmskpd %ymm13,%ebx + vpcmpeqq .Lmask52x4(%rip),%ymm12,%ymm13 + vmovmskpd %ymm13,%eax + shlb $4,%al + orb %al,%bl + + addb %r9b,%r14b + adcb %r8b,%r13b + adcb %dl,%r12b + adcb %cl,%r11b + adcb %bl,%r10b + + xorb %r9b,%r14b + xorb %r8b,%r13b + xorb %dl,%r12b + xorb %cl,%r11b + xorb %bl,%r10b + + pushq %r9 + pushq %r8 + + leaq .Lkmasklut(%rip),%r8 + + movb %r14b,%r9b + andq $0xf,%r14 + vpsubq .Lmask52x4(%rip),%ymm3,%ymm13 + shlq $5,%r14 + vmovapd (%r8,%r14,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm3,%ymm3 + + shrb $4,%r9b + andq $0xf,%r9 + vpsubq .Lmask52x4(%rip),%ymm4,%ymm13 + shlq $5,%r9 + vmovapd (%r8,%r9,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm4,%ymm4 + + movb %r13b,%r9b + andq $0xf,%r13 + vpsubq .Lmask52x4(%rip),%ymm5,%ymm13 + shlq $5,%r13 + vmovapd (%r8,%r13,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm5,%ymm5 + + shrb $4,%r9b + andq $0xf,%r9 + vpsubq .Lmask52x4(%rip),%ymm6,%ymm13 + shlq $5,%r9 + vmovapd (%r8,%r9,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm6,%ymm6 + + movb %r12b,%r9b + andq $0xf,%r12 + vpsubq .Lmask52x4(%rip),%ymm7,%ymm13 + shlq $5,%r12 + vmovapd (%r8,%r12,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm7,%ymm7 + + shrb $4,%r9b + andq $0xf,%r9 + vpsubq .Lmask52x4(%rip),%ymm8,%ymm13 + shlq $5,%r9 + vmovapd (%r8,%r9,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm8,%ymm8 + + movb %r11b,%r9b + andq $0xf,%r11 + vpsubq .Lmask52x4(%rip),%ymm9,%ymm13 + shlq $5,%r11 + vmovapd (%r8,%r11,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm9,%ymm9 + + shrb $4,%r9b + andq $0xf,%r9 + vpsubq .Lmask52x4(%rip),%ymm10,%ymm13 + shlq $5,%r9 + vmovapd (%r8,%r9,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm10,%ymm10 + + movb %r10b,%r9b + andq $0xf,%r10 + vpsubq .Lmask52x4(%rip),%ymm11,%ymm13 + shlq $5,%r10 + vmovapd (%r8,%r10,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm11,%ymm11 + + shrb $4,%r9b + andq $0xf,%r9 + vpsubq .Lmask52x4(%rip),%ymm12,%ymm13 + shlq $5,%r9 + vmovapd (%r8,%r9,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm12,%ymm12 + + popq %r8 + popq %r9 + + vpand .Lmask52x4(%rip),%ymm3,%ymm3 + vpand .Lmask52x4(%rip),%ymm4,%ymm4 + vpand .Lmask52x4(%rip),%ymm5,%ymm5 + vpand .Lmask52x4(%rip),%ymm6,%ymm6 + vpand .Lmask52x4(%rip),%ymm7,%ymm7 + vpand .Lmask52x4(%rip),%ymm8,%ymm8 + vpand .Lmask52x4(%rip),%ymm9,%ymm9 + + vpand .Lmask52x4(%rip),%ymm10,%ymm10 + vpand .Lmask52x4(%rip),%ymm11,%ymm11 + vpand .Lmask52x4(%rip),%ymm12,%ymm12 + + popq %r8 + popq %rcx + popq %rsi + popq %r11 + + vmovdqu %ymm3,0(%rdi) + vmovdqu %ymm4,32(%rdi) + vmovdqu %ymm5,64(%rdi) + vmovdqu %ymm6,96(%rdi) + vmovdqu %ymm7,128(%rdi) + vmovdqu %ymm8,160(%rdi) + vmovdqu %ymm9,192(%rdi) + vmovdqu %ymm10,224(%rdi) + vmovdqu %ymm11,256(%rdi) + vmovdqu %ymm12,288(%rdi) + + xorl %r15d,%r15d + + movq $0xfffffffffffff,%rax + + movl $40,%ebx + + vpxor %ymm0,%ymm0,%ymm0 + vmovapd %ymm0,%ymm3 + vmovapd %ymm0,%ymm4 + vmovapd %ymm0,%ymm5 + vmovapd %ymm0,%ymm6 + vmovapd %ymm0,%ymm7 + vmovapd %ymm0,%ymm8 + vmovapd %ymm0,%ymm9 + vmovapd %ymm0,%ymm10 + vmovapd %ymm0,%ymm11 + vmovapd %ymm0,%ymm12 +.align 32 +.Lloop40_1: + movq 0(%r11),%r13 + + vpbroadcastq 0(%r11),%ymm1 + movq 320(%rsi),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + movq %r12,%r10 + adcq $0,%r10 + + movq 8(%r8),%r13 + imulq %r9,%r13 + andq %rax,%r13 + + vmovq %r13,%xmm2 + vpbroadcastq %xmm2,%ymm2 + movq 320(%rcx),%rdx + mulxq %r13,%r13,%r12 + addq %r13,%r9 + adcq %r12,%r10 + + shrq $52,%r9 + salq $12,%r10 + orq %r10,%r9 + + leaq -328(%rsp),%rsp + +{vex} vpmadd52luq 320(%rsi),%ymm1,%ymm3 +{vex} vpmadd52luq 352(%rsi),%ymm1,%ymm4 +{vex} vpmadd52luq 384(%rsi),%ymm1,%ymm5 +{vex} vpmadd52luq 416(%rsi),%ymm1,%ymm6 +{vex} vpmadd52luq 448(%rsi),%ymm1,%ymm7 +{vex} vpmadd52luq 480(%rsi),%ymm1,%ymm8 +{vex} vpmadd52luq 512(%rsi),%ymm1,%ymm9 +{vex} vpmadd52luq 544(%rsi),%ymm1,%ymm10 +{vex} vpmadd52luq 576(%rsi),%ymm1,%ymm11 +{vex} vpmadd52luq 608(%rsi),%ymm1,%ymm12 + +{vex} vpmadd52luq 320(%rcx),%ymm2,%ymm3 +{vex} vpmadd52luq 352(%rcx),%ymm2,%ymm4 +{vex} vpmadd52luq 384(%rcx),%ymm2,%ymm5 +{vex} vpmadd52luq 416(%rcx),%ymm2,%ymm6 +{vex} vpmadd52luq 448(%rcx),%ymm2,%ymm7 +{vex} vpmadd52luq 480(%rcx),%ymm2,%ymm8 +{vex} vpmadd52luq 512(%rcx),%ymm2,%ymm9 +{vex} vpmadd52luq 544(%rcx),%ymm2,%ymm10 +{vex} vpmadd52luq 576(%rcx),%ymm2,%ymm11 +{vex} vpmadd52luq 608(%rcx),%ymm2,%ymm12 + vmovdqu %ymm3,0(%rsp) + vmovdqu %ymm4,32(%rsp) + vmovdqu %ymm5,64(%rsp) + vmovdqu %ymm6,96(%rsp) + vmovdqu %ymm7,128(%rsp) + vmovdqu %ymm8,160(%rsp) + vmovdqu %ymm9,192(%rsp) + vmovdqu %ymm10,224(%rsp) + vmovdqu %ymm11,256(%rsp) + vmovdqu %ymm12,288(%rsp) + movq $0,320(%rsp) + + vmovdqu 8(%rsp),%ymm3 + vmovdqu 40(%rsp),%ymm4 + vmovdqu 72(%rsp),%ymm5 + vmovdqu 104(%rsp),%ymm6 + vmovdqu 136(%rsp),%ymm7 + vmovdqu 168(%rsp),%ymm8 + vmovdqu 200(%rsp),%ymm9 + vmovdqu 232(%rsp),%ymm10 + vmovdqu 264(%rsp),%ymm11 + vmovdqu 296(%rsp),%ymm12 + + addq 8(%rsp),%r9 + +{vex} vpmadd52huq 320(%rsi),%ymm1,%ymm3 +{vex} vpmadd52huq 352(%rsi),%ymm1,%ymm4 +{vex} vpmadd52huq 384(%rsi),%ymm1,%ymm5 +{vex} vpmadd52huq 416(%rsi),%ymm1,%ymm6 +{vex} vpmadd52huq 448(%rsi),%ymm1,%ymm7 +{vex} vpmadd52huq 480(%rsi),%ymm1,%ymm8 +{vex} vpmadd52huq 512(%rsi),%ymm1,%ymm9 +{vex} vpmadd52huq 544(%rsi),%ymm1,%ymm10 +{vex} vpmadd52huq 576(%rsi),%ymm1,%ymm11 +{vex} vpmadd52huq 608(%rsi),%ymm1,%ymm12 + +{vex} vpmadd52huq 320(%rcx),%ymm2,%ymm3 +{vex} vpmadd52huq 352(%rcx),%ymm2,%ymm4 +{vex} vpmadd52huq 384(%rcx),%ymm2,%ymm5 +{vex} vpmadd52huq 416(%rcx),%ymm2,%ymm6 +{vex} vpmadd52huq 448(%rcx),%ymm2,%ymm7 +{vex} vpmadd52huq 480(%rcx),%ymm2,%ymm8 +{vex} vpmadd52huq 512(%rcx),%ymm2,%ymm9 +{vex} vpmadd52huq 544(%rcx),%ymm2,%ymm10 +{vex} vpmadd52huq 576(%rcx),%ymm2,%ymm11 +{vex} vpmadd52huq 608(%rcx),%ymm2,%ymm12 + leaq 328(%rsp),%rsp + leaq 8(%r11),%r11 + decl %ebx + jne .Lloop40_1 + + vmovq %r9,%xmm0 + vpbroadcastq %xmm0,%ymm0 + vpblendd $3,%ymm0,%ymm3,%ymm3 + + leaq -640(%rsp),%rsp + vmovupd %ymm3,0(%rsp) + vmovupd %ymm4,32(%rsp) + vmovupd %ymm5,64(%rsp) + vmovupd %ymm6,96(%rsp) + vmovupd %ymm7,128(%rsp) + vmovupd %ymm8,160(%rsp) + vmovupd %ymm9,192(%rsp) + vmovupd %ymm10,224(%rsp) + vmovupd %ymm11,256(%rsp) + vmovupd %ymm12,288(%rsp) + + + + vpsrlq $52,%ymm3,%ymm3 + vpsrlq $52,%ymm4,%ymm4 + vpsrlq $52,%ymm5,%ymm5 + vpsrlq $52,%ymm6,%ymm6 + vpsrlq $52,%ymm7,%ymm7 + vpsrlq $52,%ymm8,%ymm8 + vpsrlq $52,%ymm9,%ymm9 + vpsrlq $52,%ymm10,%ymm10 + vpsrlq $52,%ymm11,%ymm11 + vpsrlq $52,%ymm12,%ymm12 + + + vpermq $144,%ymm12,%ymm12 + vpermq $3,%ymm11,%ymm13 + vblendpd $1,%ymm13,%ymm12,%ymm12 + + vpermq $144,%ymm11,%ymm11 + vpermq $3,%ymm10,%ymm13 + vblendpd $1,%ymm13,%ymm11,%ymm11 + + vpermq $144,%ymm10,%ymm10 + vpermq $3,%ymm9,%ymm13 + vblendpd $1,%ymm13,%ymm10,%ymm10 + + vpermq $144,%ymm9,%ymm9 + vpermq $3,%ymm8,%ymm13 + vblendpd $1,%ymm13,%ymm9,%ymm9 + + vpermq $144,%ymm8,%ymm8 + vpermq $3,%ymm7,%ymm13 + vblendpd $1,%ymm13,%ymm8,%ymm8 + + vpermq $144,%ymm7,%ymm7 + vpermq $3,%ymm6,%ymm13 + vblendpd $1,%ymm13,%ymm7,%ymm7 + + vpermq $144,%ymm6,%ymm6 + vpermq $3,%ymm5,%ymm13 + vblendpd $1,%ymm13,%ymm6,%ymm6 + + vpermq $144,%ymm5,%ymm5 + vpermq $3,%ymm4,%ymm13 + vblendpd $1,%ymm13,%ymm5,%ymm5 + + vpermq $144,%ymm4,%ymm4 + vpermq $3,%ymm3,%ymm13 + vblendpd $1,%ymm13,%ymm4,%ymm4 + + vpermq $144,%ymm3,%ymm3 + vpand .Lhigh64x3(%rip),%ymm3,%ymm3 + + vmovupd %ymm3,320(%rsp) + vmovupd %ymm4,352(%rsp) + vmovupd %ymm5,384(%rsp) + vmovupd %ymm6,416(%rsp) + vmovupd %ymm7,448(%rsp) + vmovupd %ymm8,480(%rsp) + vmovupd %ymm9,512(%rsp) + vmovupd %ymm10,544(%rsp) + vmovupd %ymm11,576(%rsp) + vmovupd %ymm12,608(%rsp) + + vmovupd 0(%rsp),%ymm3 + vmovupd 32(%rsp),%ymm4 + vmovupd 64(%rsp),%ymm5 + vmovupd 96(%rsp),%ymm6 + vmovupd 128(%rsp),%ymm7 + vmovupd 160(%rsp),%ymm8 + vmovupd 192(%rsp),%ymm9 + vmovupd 224(%rsp),%ymm10 + vmovupd 256(%rsp),%ymm11 + vmovupd 288(%rsp),%ymm12 + + + vpand .Lmask52x4(%rip),%ymm3,%ymm3 + vpand .Lmask52x4(%rip),%ymm4,%ymm4 + vpand .Lmask52x4(%rip),%ymm5,%ymm5 + vpand .Lmask52x4(%rip),%ymm6,%ymm6 + vpand .Lmask52x4(%rip),%ymm7,%ymm7 + vpand .Lmask52x4(%rip),%ymm8,%ymm8 + vpand .Lmask52x4(%rip),%ymm9,%ymm9 + vpand .Lmask52x4(%rip),%ymm10,%ymm10 + vpand .Lmask52x4(%rip),%ymm11,%ymm11 + vpand .Lmask52x4(%rip),%ymm12,%ymm12 + + + vpaddq 320(%rsp),%ymm3,%ymm3 + vpaddq 352(%rsp),%ymm4,%ymm4 + vpaddq 384(%rsp),%ymm5,%ymm5 + vpaddq 416(%rsp),%ymm6,%ymm6 + vpaddq 448(%rsp),%ymm7,%ymm7 + vpaddq 480(%rsp),%ymm8,%ymm8 + vpaddq 512(%rsp),%ymm9,%ymm9 + vpaddq 544(%rsp),%ymm10,%ymm10 + vpaddq 576(%rsp),%ymm11,%ymm11 + vpaddq 608(%rsp),%ymm12,%ymm12 + + leaq 640(%rsp),%rsp + + + + vpcmpgtq .Lmask52x4(%rip),%ymm3,%ymm13 + vmovmskpd %ymm13,%r14d + vpcmpgtq .Lmask52x4(%rip),%ymm4,%ymm13 + vmovmskpd %ymm13,%r13d + shlb $4,%r13b + orb %r13b,%r14b + + vpcmpgtq .Lmask52x4(%rip),%ymm5,%ymm13 + vmovmskpd %ymm13,%r13d + vpcmpgtq .Lmask52x4(%rip),%ymm6,%ymm13 + vmovmskpd %ymm13,%r12d + shlb $4,%r12b + orb %r12b,%r13b + + vpcmpgtq .Lmask52x4(%rip),%ymm7,%ymm13 + vmovmskpd %ymm13,%r12d + vpcmpgtq .Lmask52x4(%rip),%ymm8,%ymm13 + vmovmskpd %ymm13,%r11d + shlb $4,%r11b + orb %r11b,%r12b + + vpcmpgtq .Lmask52x4(%rip),%ymm9,%ymm13 + vmovmskpd %ymm13,%r11d + vpcmpgtq .Lmask52x4(%rip),%ymm10,%ymm13 + vmovmskpd %ymm13,%r10d + shlb $4,%r10b + orb %r10b,%r11b + + vpcmpgtq .Lmask52x4(%rip),%ymm11,%ymm13 + vmovmskpd %ymm13,%r10d + vpcmpgtq .Lmask52x4(%rip),%ymm12,%ymm13 + vmovmskpd %ymm13,%r9d + shlb $4,%r9b + orb %r9b,%r10b + + addb %r14b,%r14b + adcb %r13b,%r13b + adcb %r12b,%r12b + adcb %r11b,%r11b + adcb %r10b,%r10b + + + vpcmpeqq .Lmask52x4(%rip),%ymm3,%ymm13 + vmovmskpd %ymm13,%r9d + vpcmpeqq .Lmask52x4(%rip),%ymm4,%ymm13 + vmovmskpd %ymm13,%r8d + shlb $4,%r8b + orb %r8b,%r9b + + vpcmpeqq .Lmask52x4(%rip),%ymm5,%ymm13 + vmovmskpd %ymm13,%r8d + vpcmpeqq .Lmask52x4(%rip),%ymm6,%ymm13 + vmovmskpd %ymm13,%edx + shlb $4,%dl + orb %dl,%r8b + + vpcmpeqq .Lmask52x4(%rip),%ymm7,%ymm13 + vmovmskpd %ymm13,%edx + vpcmpeqq .Lmask52x4(%rip),%ymm8,%ymm13 + vmovmskpd %ymm13,%ecx + shlb $4,%cl + orb %cl,%dl + + vpcmpeqq .Lmask52x4(%rip),%ymm9,%ymm13 + vmovmskpd %ymm13,%ecx + vpcmpeqq .Lmask52x4(%rip),%ymm10,%ymm13 + vmovmskpd %ymm13,%ebx + shlb $4,%bl + orb %bl,%cl + + vpcmpeqq .Lmask52x4(%rip),%ymm11,%ymm13 + vmovmskpd %ymm13,%ebx + vpcmpeqq .Lmask52x4(%rip),%ymm12,%ymm13 + vmovmskpd %ymm13,%eax + shlb $4,%al + orb %al,%bl + + addb %r9b,%r14b + adcb %r8b,%r13b + adcb %dl,%r12b + adcb %cl,%r11b + adcb %bl,%r10b + + xorb %r9b,%r14b + xorb %r8b,%r13b + xorb %dl,%r12b + xorb %cl,%r11b + xorb %bl,%r10b + + pushq %r9 + pushq %r8 + + leaq .Lkmasklut(%rip),%r8 + + movb %r14b,%r9b + andq $0xf,%r14 + vpsubq .Lmask52x4(%rip),%ymm3,%ymm13 + shlq $5,%r14 + vmovapd (%r8,%r14,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm3,%ymm3 + + shrb $4,%r9b + andq $0xf,%r9 + vpsubq .Lmask52x4(%rip),%ymm4,%ymm13 + shlq $5,%r9 + vmovapd (%r8,%r9,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm4,%ymm4 + + movb %r13b,%r9b + andq $0xf,%r13 + vpsubq .Lmask52x4(%rip),%ymm5,%ymm13 + shlq $5,%r13 + vmovapd (%r8,%r13,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm5,%ymm5 + + shrb $4,%r9b + andq $0xf,%r9 + vpsubq .Lmask52x4(%rip),%ymm6,%ymm13 + shlq $5,%r9 + vmovapd (%r8,%r9,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm6,%ymm6 + + movb %r12b,%r9b + andq $0xf,%r12 + vpsubq .Lmask52x4(%rip),%ymm7,%ymm13 + shlq $5,%r12 + vmovapd (%r8,%r12,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm7,%ymm7 + + shrb $4,%r9b + andq $0xf,%r9 + vpsubq .Lmask52x4(%rip),%ymm8,%ymm13 + shlq $5,%r9 + vmovapd (%r8,%r9,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm8,%ymm8 + + movb %r11b,%r9b + andq $0xf,%r11 + vpsubq .Lmask52x4(%rip),%ymm9,%ymm13 + shlq $5,%r11 + vmovapd (%r8,%r11,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm9,%ymm9 + + shrb $4,%r9b + andq $0xf,%r9 + vpsubq .Lmask52x4(%rip),%ymm10,%ymm13 + shlq $5,%r9 + vmovapd (%r8,%r9,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm10,%ymm10 + + movb %r10b,%r9b + andq $0xf,%r10 + vpsubq .Lmask52x4(%rip),%ymm11,%ymm13 + shlq $5,%r10 + vmovapd (%r8,%r10,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm11,%ymm11 + + shrb $4,%r9b + andq $0xf,%r9 + vpsubq .Lmask52x4(%rip),%ymm12,%ymm13 + shlq $5,%r9 + vmovapd (%r8,%r9,1),%ymm14 + vblendvpd %ymm14,%ymm13,%ymm12,%ymm12 + + popq %r8 + popq %r9 + + vpand .Lmask52x4(%rip),%ymm3,%ymm3 + vpand .Lmask52x4(%rip),%ymm4,%ymm4 + vpand .Lmask52x4(%rip),%ymm5,%ymm5 + vpand .Lmask52x4(%rip),%ymm6,%ymm6 + vpand .Lmask52x4(%rip),%ymm7,%ymm7 + vpand .Lmask52x4(%rip),%ymm8,%ymm8 + vpand .Lmask52x4(%rip),%ymm9,%ymm9 + + vpand .Lmask52x4(%rip),%ymm10,%ymm10 + vpand .Lmask52x4(%rip),%ymm11,%ymm11 + vpand .Lmask52x4(%rip),%ymm12,%ymm12 + + vmovdqu %ymm3,320(%rdi) + vmovdqu %ymm4,352(%rdi) + vmovdqu %ymm5,384(%rdi) + vmovdqu %ymm6,416(%rdi) + vmovdqu %ymm7,448(%rdi) + vmovdqu %ymm8,480(%rdi) + vmovdqu %ymm9,512(%rdi) + vmovdqu %ymm10,544(%rdi) + vmovdqu %ymm11,576(%rdi) + vmovdqu %ymm12,608(%rdi) + + vzeroupper + leaq (%rsp),%rax +.cfi_def_cfa_register %rax + movq 0(%rax),%r15 +.cfi_restore %r15 + movq 8(%rax),%r14 +.cfi_restore %r14 + movq 16(%rax),%r13 +.cfi_restore %r13 + movq 24(%rax),%r12 +.cfi_restore %r12 + movq 32(%rax),%rbp +.cfi_restore %rbp + movq 40(%rax),%rbx +.cfi_restore %rbx + leaq 48(%rax),%rsp +.cfi_def_cfa %rsp,8 +.Lossl_rsaz_amm52x40_x2_avxifma256_epilogue: + .byte 0xf3,0xc3 +.cfi_endproc +.size ossl_rsaz_amm52x40_x2_avxifma256, .-ossl_rsaz_amm52x40_x2_avxifma256 +.text + +.align 32 +.globl ossl_extract_multiplier_2x40_win5_avx +.type ossl_extract_multiplier_2x40_win5_avx,@function +ossl_extract_multiplier_2x40_win5_avx: +.cfi_startproc +.byte 243,15,30,250 + vmovapd .Lones(%rip),%ymm14 + vmovq %rdx,%xmm10 + vpbroadcastq %xmm10,%ymm12 + vmovq %rcx,%xmm10 + vpbroadcastq %xmm10,%ymm13 + leaq 20480(%rsi),%rax + + + movq %rsi,%r10 + + + vpxor %xmm0,%xmm0,%xmm0 + vmovapd %ymm0,%ymm1 + vmovapd %ymm0,%ymm2 + vmovapd %ymm0,%ymm3 + vmovapd %ymm0,%ymm4 + vmovapd %ymm0,%ymm5 + vmovapd %ymm0,%ymm6 + vmovapd %ymm0,%ymm7 + vmovapd %ymm0,%ymm8 + vmovapd %ymm0,%ymm9 + vpxor %ymm11,%ymm11,%ymm11 +.align 32 +.Lloop_0: + vpcmpeqq %ymm11,%ymm12,%ymm15 + vmovdqu 0(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm0,%ymm0 + vmovdqu 32(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm1,%ymm1 + vmovdqu 64(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm2,%ymm2 + vmovdqu 96(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm3,%ymm3 + vmovdqu 128(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm4,%ymm4 + vmovdqu 160(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm5,%ymm5 + vmovdqu 192(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm6,%ymm6 + vmovdqu 224(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm7,%ymm7 + vmovdqu 256(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm8,%ymm8 + vmovdqu 288(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm9,%ymm9 + vpaddq %ymm14,%ymm11,%ymm11 + addq $640,%rsi + cmpq %rsi,%rax + jne .Lloop_0 + vmovdqu %ymm0,0(%rdi) + vmovdqu %ymm1,32(%rdi) + vmovdqu %ymm2,64(%rdi) + vmovdqu %ymm3,96(%rdi) + vmovdqu %ymm4,128(%rdi) + vmovdqu %ymm5,160(%rdi) + vmovdqu %ymm6,192(%rdi) + vmovdqu %ymm7,224(%rdi) + vmovdqu %ymm8,256(%rdi) + vmovdqu %ymm9,288(%rdi) + movq %r10,%rsi + vpxor %ymm11,%ymm11,%ymm11 +.align 32 +.Lloop_320: + vpcmpeqq %ymm11,%ymm13,%ymm15 + vmovdqu 320(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm0,%ymm0 + vmovdqu 352(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm1,%ymm1 + vmovdqu 384(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm2,%ymm2 + vmovdqu 416(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm3,%ymm3 + vmovdqu 448(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm4,%ymm4 + vmovdqu 480(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm5,%ymm5 + vmovdqu 512(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm6,%ymm6 + vmovdqu 544(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm7,%ymm7 + vmovdqu 576(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm8,%ymm8 + vmovdqu 608(%rsi),%ymm10 + + vblendvpd %ymm15,%ymm10,%ymm9,%ymm9 + vpaddq %ymm14,%ymm11,%ymm11 + addq $640,%rsi + cmpq %rsi,%rax + jne .Lloop_320 + vmovdqu %ymm0,320(%rdi) + vmovdqu %ymm1,352(%rdi) + vmovdqu %ymm2,384(%rdi) + vmovdqu %ymm3,416(%rdi) + vmovdqu %ymm4,448(%rdi) + vmovdqu %ymm5,480(%rdi) + vmovdqu %ymm6,512(%rdi) + vmovdqu %ymm7,544(%rdi) + vmovdqu %ymm8,576(%rdi) + vmovdqu %ymm9,608(%rdi) + + .byte 0xf3,0xc3 +.cfi_endproc +.size ossl_extract_multiplier_2x40_win5_avx, .-ossl_extract_multiplier_2x40_win5_avx +.section .rodata +.align 32 +.Lones: +.quad 1,1,1,1 +.Lzeros: +.quad 0,0,0,0 + .section ".note.gnu.property", "a" + .p2align 3 + .long 1f - 0f + .long 4f - 1f + .long 5 +0: + # "GNU" encoded with .byte, since .asciz isn't supported + # on Solaris. + .byte 0x47 + .byte 0x4e + .byte 0x55 + .byte 0 +1: + .p2align 3 + .long 0xc0000002 + .long 3f - 2f +2: + .long 3 +3: + .p2align 3 +4: diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/md5/md5-x86_64.s b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/md5/md5-x86_64.s index 40bfc69f380d..27a5a80375c2 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/md5/md5-x86_64.s +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/md5/md5-x86_64.s @@ -201,7 +201,7 @@ ossl_md5_block_asm_data_order: leal -165796510(%rax,%r10,1),%eax andl %ecx,%r11d movl 24(%rsi),%r10d - orl %r11d,%r12d + addl %r11d,%eax movl %ecx,%r11d addl %r12d,%eax movl %ecx,%r12d @@ -212,7 +212,7 @@ ossl_md5_block_asm_data_order: leal -1069501632(%rdx,%r10,1),%edx andl %ebx,%r11d movl 44(%rsi),%r10d - orl %r11d,%r12d + addl %r11d,%edx movl %ebx,%r11d addl %r12d,%edx movl %ebx,%r12d @@ -223,7 +223,7 @@ ossl_md5_block_asm_data_order: leal 643717713(%rcx,%r10,1),%ecx andl %eax,%r11d movl 0(%rsi),%r10d - orl %r11d,%r12d + addl %r11d,%ecx movl %eax,%r11d addl %r12d,%ecx movl %eax,%r12d @@ -234,7 +234,7 @@ ossl_md5_block_asm_data_order: leal -373897302(%rbx,%r10,1),%ebx andl %edx,%r11d movl 20(%rsi),%r10d - orl %r11d,%r12d + addl %r11d,%ebx movl %edx,%r11d addl %r12d,%ebx movl %edx,%r12d @@ -245,7 +245,7 @@ ossl_md5_block_asm_data_order: leal -701558691(%rax,%r10,1),%eax andl %ecx,%r11d movl 40(%rsi),%r10d - orl %r11d,%r12d + addl %r11d,%eax movl %ecx,%r11d addl %r12d,%eax movl %ecx,%r12d @@ -256,7 +256,7 @@ ossl_md5_block_asm_data_order: leal 38016083(%rdx,%r10,1),%edx andl %ebx,%r11d movl 60(%rsi),%r10d - orl %r11d,%r12d + addl %r11d,%edx movl %ebx,%r11d addl %r12d,%edx movl %ebx,%r12d @@ -267,7 +267,7 @@ ossl_md5_block_asm_data_order: leal -660478335(%rcx,%r10,1),%ecx andl %eax,%r11d movl 16(%rsi),%r10d - orl %r11d,%r12d + addl %r11d,%ecx movl %eax,%r11d addl %r12d,%ecx movl %eax,%r12d @@ -278,7 +278,7 @@ ossl_md5_block_asm_data_order: leal -405537848(%rbx,%r10,1),%ebx andl %edx,%r11d movl 36(%rsi),%r10d - orl %r11d,%r12d + addl %r11d,%ebx movl %edx,%r11d addl %r12d,%ebx movl %edx,%r12d @@ -289,7 +289,7 @@ ossl_md5_block_asm_data_order: leal 568446438(%rax,%r10,1),%eax andl %ecx,%r11d movl 56(%rsi),%r10d - orl %r11d,%r12d + addl %r11d,%eax movl %ecx,%r11d addl %r12d,%eax movl %ecx,%r12d @@ -300,7 +300,7 @@ ossl_md5_block_asm_data_order: leal -1019803690(%rdx,%r10,1),%edx andl %ebx,%r11d movl 12(%rsi),%r10d - orl %r11d,%r12d + addl %r11d,%edx movl %ebx,%r11d addl %r12d,%edx movl %ebx,%r12d @@ -311,7 +311,7 @@ ossl_md5_block_asm_data_order: leal -187363961(%rcx,%r10,1),%ecx andl %eax,%r11d movl 32(%rsi),%r10d - orl %r11d,%r12d + addl %r11d,%ecx movl %eax,%r11d addl %r12d,%ecx movl %eax,%r12d @@ -322,7 +322,7 @@ ossl_md5_block_asm_data_order: leal 1163531501(%rbx,%r10,1),%ebx andl %edx,%r11d movl 52(%rsi),%r10d - orl %r11d,%r12d + addl %r11d,%ebx movl %edx,%r11d addl %r12d,%ebx movl %edx,%r12d @@ -333,7 +333,7 @@ ossl_md5_block_asm_data_order: leal -1444681467(%rax,%r10,1),%eax andl %ecx,%r11d movl 8(%rsi),%r10d - orl %r11d,%r12d + addl %r11d,%eax movl %ecx,%r11d addl %r12d,%eax movl %ecx,%r12d @@ -344,7 +344,7 @@ ossl_md5_block_asm_data_order: leal -51403784(%rdx,%r10,1),%edx andl %ebx,%r11d movl 28(%rsi),%r10d - orl %r11d,%r12d + addl %r11d,%edx movl %ebx,%r11d addl %r12d,%edx movl %ebx,%r12d @@ -355,7 +355,7 @@ ossl_md5_block_asm_data_order: leal 1735328473(%rcx,%r10,1),%ecx andl %eax,%r11d movl 48(%rsi),%r10d - orl %r11d,%r12d + addl %r11d,%ecx movl %eax,%r11d addl %r12d,%ecx movl %eax,%r12d @@ -366,7 +366,7 @@ ossl_md5_block_asm_data_order: leal -1926607734(%rbx,%r10,1),%ebx andl %edx,%r11d movl 20(%rsi),%r10d - orl %r11d,%r12d + addl %r11d,%ebx movl %edx,%r11d addl %r12d,%ebx movl %edx,%r12d diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/x86_64cpuid.s b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/x86_64cpuid.s index 5fda386d1df6..4fb26cc6e262 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/x86_64cpuid.s +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-GCC/crypto/x86_64cpuid.s @@ -1,11 +1,11 @@ + .hidden OPENSSL_cpuid_setup .section .init call OPENSSL_cpuid_setup .hidden OPENSSL_ia32cap_P -.comm OPENSSL_ia32cap_P,16,4 - +.comm OPENSSL_ia32cap_P,40,4 .text .globl OPENSSL_atomic_add @@ -163,6 +163,7 @@ OPENSSL_ia32_cpuid: movl $7,%eax xorl %ecx,%ecx cpuid + movd %eax,%xmm1 btl $26,%r9d jc .Lnotknights andl $0xfff7ffff,%ebx @@ -173,9 +174,31 @@ OPENSSL_ia32_cpuid: jne .Lnotskylakex andl $0xfffeffff,%ebx + .Lnotskylakex: movl %ebx,8(%rdi) movl %ecx,12(%rdi) + movl %edx,16(%rdi) + + movd %xmm1,%eax + cmpl $0x1,%eax + jb .Lno_extended_info + movl $0x7,%eax + movl $0x1,%ecx + cpuid + movl %eax,20(%rdi) + movl %edx,24(%rdi) + movl %ebx,28(%rdi) + movl %ecx,32(%rdi) + + andl $0x80000,%edx + cmpl $0x0,%edx + je .Lno_extended_info + movl $0x24,%eax + movl $0x0,%ecx + cpuid + movl %ebx,36(%rdi) + .Lno_extended_info: btl $27,%r9d @@ -194,6 +217,9 @@ OPENSSL_ia32_cpuid: cmpl $6,%eax je .Ldone .Lclear_avx: + andl $0xff7fffff,20(%rdi) + + movl $0xefffe7ff,%eax andl %eax,%r9d movl $0x3fdeffdf,%eax diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/aes/aesni-xts-avx512.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/aes/aesni-xts-avx512.nasm new file mode 100644 index 000000000000..cf6644f9e4ba --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/aes/aesni-xts-avx512.nasm @@ -0,0 +1,8350 @@ +default rel +%define XMMWORD +%define YMMWORD +%define ZMMWORD +section .text code align=64 + +EXTERN OPENSSL_ia32cap_P +global aesni_xts_avx512_eligible + +ALIGN 32 +aesni_xts_avx512_eligible: + mov ecx,DWORD[((OPENSSL_ia32cap_P+8))] + xor eax,eax + + and ecx,0xc0030000 + cmp ecx,0xc0030000 + jne NEAR $L$_done + mov ecx,DWORD[((OPENSSL_ia32cap_P+12))] + + and ecx,0x640 + cmp ecx,0x640 + cmove eax,ecx +$L$_done: + DB 0F3h,0C3h ;repret + +global aesni_xts_128_encrypt_avx512 + + +ALIGN 32 +aesni_xts_128_encrypt_avx512: + mov QWORD[8+rsp],rdi ;WIN64 prologue + mov QWORD[16+rsp],rsi + mov rax,rsp +$L$SEH_begin_aesni_xts_128_encrypt_avx512: + mov rdi,rcx + mov rsi,rdx + mov rdx,r8 + mov rcx,r9 + mov r8,QWORD[40+rsp] + mov r9,QWORD[48+rsp] + + + +DB 243,15,30,250 + push rbp + mov rbp,rsp + sub rsp,312 + and rsp,0xffffffffffffffc0 + mov QWORD[288+rsp],rbx + mov QWORD[((288 + 8))+rsp],rdi + mov QWORD[((288 + 16))+rsp],rsi + vmovdqa XMMWORD[(128 + 0)+rsp],xmm6 + vmovdqa XMMWORD[(128 + 16)+rsp],xmm7 + vmovdqa XMMWORD[(128 + 32)+rsp],xmm8 + vmovdqa XMMWORD[(128 + 48)+rsp],xmm9 + vmovdqa XMMWORD[(128 + 64)+rsp],xmm10 + vmovdqa XMMWORD[(128 + 80)+rsp],xmm11 + vmovdqa XMMWORD[(128 + 96)+rsp],xmm12 + vmovdqa XMMWORD[(128 + 112)+rsp],xmm13 + vmovdqa XMMWORD[(128 + 128)+rsp],xmm14 + vmovdqa XMMWORD[(128 + 144)+rsp],xmm15 + mov r10,0x87 + vmovdqu xmm1,XMMWORD[r9] + vpxor xmm1,xmm1,XMMWORD[r8] + vaesenc xmm1,xmm1,XMMWORD[16+r8] + vaesenc xmm1,xmm1,XMMWORD[32+r8] + vaesenc xmm1,xmm1,XMMWORD[48+r8] + vaesenc xmm1,xmm1,XMMWORD[64+r8] + vaesenc xmm1,xmm1,XMMWORD[80+r8] + vaesenc xmm1,xmm1,XMMWORD[96+r8] + vaesenc xmm1,xmm1,XMMWORD[112+r8] + vaesenc xmm1,xmm1,XMMWORD[128+r8] + vaesenc xmm1,xmm1,XMMWORD[144+r8] + vaesenclast xmm1,xmm1,XMMWORD[160+r8] + vmovdqa XMMWORD[rsp],xmm1 + mov QWORD[((8 + 40))+rbp],rdi + mov QWORD[((8 + 48))+rbp],rsi + + cmp rdx,0x80 + jl NEAR $L$_less_than_128_bytes_hEgxyDlCngwrfFe + vpbroadcastq zmm25,r10 + cmp rdx,0x100 + jge NEAR $L$_start_by16_hEgxyDlCngwrfFe + cmp rdx,0x80 + jge NEAR $L$_start_by8_hEgxyDlCngwrfFe + +$L$_do_n_blocks_hEgxyDlCngwrfFe: + cmp rdx,0x0 + je NEAR $L$_ret_hEgxyDlCngwrfFe + cmp rdx,0x70 + jge NEAR $L$_remaining_num_blocks_is_7_hEgxyDlCngwrfFe + cmp rdx,0x60 + jge NEAR $L$_remaining_num_blocks_is_6_hEgxyDlCngwrfFe + cmp rdx,0x50 + jge NEAR $L$_remaining_num_blocks_is_5_hEgxyDlCngwrfFe + cmp rdx,0x40 + jge NEAR $L$_remaining_num_blocks_is_4_hEgxyDlCngwrfFe + cmp rdx,0x30 + jge NEAR $L$_remaining_num_blocks_is_3_hEgxyDlCngwrfFe + cmp rdx,0x20 + jge NEAR $L$_remaining_num_blocks_is_2_hEgxyDlCngwrfFe + cmp rdx,0x10 + jge NEAR $L$_remaining_num_blocks_is_1_hEgxyDlCngwrfFe + vmovdqa xmm8,xmm0 + vmovdqa xmm0,xmm9 + jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe + +$L$_remaining_num_blocks_is_7_hEgxyDlCngwrfFe: + mov r8,0x0000ffffffffffff + kmovq k1,r8 + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 zmm2{k1},[64+rdi] + add rdi,0x70 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vpternlogq zmm2,zmm10,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenclast zmm1,zmm1,zmm0 + vaesenclast zmm2,zmm2,zmm0 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 ZMMWORD[64+rsi]{k1},zmm2 + add rsi,0x70 + vextracti32x4 xmm8,zmm2,0x2 + vextracti32x4 xmm0,zmm10,0x3 + and rdx,0xf + je NEAR $L$_ret_hEgxyDlCngwrfFe + jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe + +$L$_remaining_num_blocks_is_6_hEgxyDlCngwrfFe: + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 ymm2,YMMWORD[64+rdi] + add rdi,0x60 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vpternlogq zmm2,zmm10,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenclast zmm1,zmm1,zmm0 + vaesenclast zmm2,zmm2,zmm0 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 YMMWORD[64+rsi],ymm2 + add rsi,0x60 + vextracti32x4 xmm8,zmm2,0x1 + vextracti32x4 xmm0,zmm10,0x2 + and rdx,0xf + je NEAR $L$_ret_hEgxyDlCngwrfFe + jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe + +$L$_remaining_num_blocks_is_5_hEgxyDlCngwrfFe: + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu xmm2,XMMWORD[64+rdi] + add rdi,0x50 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vpternlogq zmm2,zmm10,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenclast zmm1,zmm1,zmm0 + vaesenclast zmm2,zmm2,zmm0 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu XMMWORD[64+rsi],xmm2 + add rsi,0x50 + vmovdqa xmm8,xmm2 + vextracti32x4 xmm0,zmm10,0x1 + and rdx,0xf + je NEAR $L$_ret_hEgxyDlCngwrfFe + jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe + +$L$_remaining_num_blocks_is_4_hEgxyDlCngwrfFe: + vmovdqu8 zmm1,ZMMWORD[rdi] + add rdi,0x40 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenclast zmm1,zmm1,zmm0 + vpxorq zmm1,zmm1,zmm9 + vmovdqu8 ZMMWORD[rsi],zmm1 + add rsi,0x40 + vextracti32x4 xmm8,zmm1,0x3 + vmovdqa64 xmm0,xmm10 + and rdx,0xf + je NEAR $L$_ret_hEgxyDlCngwrfFe + jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe +$L$_remaining_num_blocks_is_3_hEgxyDlCngwrfFe: + mov r8,-1 + shr r8,0x10 + kmovq k1,r8 + vmovdqu8 zmm1{k1},[rdi] + add rdi,0x30 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenclast zmm1,zmm1,zmm0 + vpxorq zmm1,zmm1,zmm9 + vmovdqu8 ZMMWORD[rsi]{k1},zmm1 + add rsi,0x30 + vextracti32x4 xmm8,zmm1,0x2 + vextracti32x4 xmm0,zmm9,0x3 + and rdx,0xf + je NEAR $L$_ret_hEgxyDlCngwrfFe + jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe +$L$_remaining_num_blocks_is_2_hEgxyDlCngwrfFe: + vmovdqu8 ymm1,YMMWORD[rdi] + add rdi,0x20 + vbroadcasti32x4 ymm0,YMMWORD[rcx] + vpternlogq ymm1,ymm9,ymm0,0x96 + vbroadcasti32x4 ymm0,YMMWORD[16+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[32+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[48+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[64+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[80+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[96+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[112+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[128+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[144+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[160+rcx] + vaesenclast ymm1,ymm1,ymm0 + vpxorq ymm1,ymm1,ymm9 + vmovdqu YMMWORD[rsi],ymm1 + add rsi,0x20 + vextracti32x4 xmm8,zmm1,0x1 + vextracti32x4 xmm0,zmm9,0x2 + and rdx,0xf + je NEAR $L$_ret_hEgxyDlCngwrfFe + jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe +$L$_remaining_num_blocks_is_1_hEgxyDlCngwrfFe: + vmovdqu xmm1,XMMWORD[rdi] + add rdi,0x10 + vpxor xmm1,xmm1,xmm9 + vpxor xmm1,xmm1,XMMWORD[rcx] + vaesenc xmm1,xmm1,XMMWORD[16+rcx] + vaesenc xmm1,xmm1,XMMWORD[32+rcx] + vaesenc xmm1,xmm1,XMMWORD[48+rcx] + vaesenc xmm1,xmm1,XMMWORD[64+rcx] + vaesenc xmm1,xmm1,XMMWORD[80+rcx] + vaesenc xmm1,xmm1,XMMWORD[96+rcx] + vaesenc xmm1,xmm1,XMMWORD[112+rcx] + vaesenc xmm1,xmm1,XMMWORD[128+rcx] + vaesenc xmm1,xmm1,XMMWORD[144+rcx] + vaesenclast xmm1,xmm1,XMMWORD[160+rcx] + vpxor xmm1,xmm1,xmm9 + vmovdqu XMMWORD[rsi],xmm1 + add rsi,0x10 + vmovdqa xmm8,xmm1 + vextracti32x4 xmm0,zmm9,0x1 + and rdx,0xf + je NEAR $L$_ret_hEgxyDlCngwrfFe + jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe + + +$L$_start_by16_hEgxyDlCngwrfFe: + vbroadcasti32x4 zmm0,ZMMWORD[rsp] + vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7] + mov r8,0xaa + kmovq k2,r8 + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x0 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654] + vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234] + vpclmulqdq zmm7,zmm6,zmm25,0x0 + vpxorq zmm5{k2},zmm5,zmm6 + vpxord zmm10,zmm7,zmm5 + vpsrldq zmm13,zmm9,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm11,zmm9,0x1 + vpxord zmm11,zmm11,zmm14 + vpsrldq zmm15,zmm10,0xf + vpclmulqdq zmm16,zmm15,zmm25,0x0 + vpslldq zmm12,zmm10,0x1 + vpxord zmm12,zmm12,zmm16 + +$L$_main_loop_run_16_hEgxyDlCngwrfFe: + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 zmm2,ZMMWORD[64+rdi] + vmovdqu8 zmm3,ZMMWORD[128+rdi] + vmovdqu8 zmm4,ZMMWORD[192+rdi] + add rdi,0x100 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vpxorq zmm3,zmm3,zmm11 + vpxorq zmm4,zmm4,zmm12 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vpxorq zmm3,zmm3,zmm0 + vpxorq zmm4,zmm4,zmm0 + vpsrldq zmm13,zmm11,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm15,zmm11,0x1 + vpxord zmm15,zmm15,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vpsrldq zmm13,zmm12,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm16,zmm12,0x1 + vpxord zmm16,zmm16,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vpsrldq zmm13,zmm15,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm17,zmm15,0x1 + vpxord zmm17,zmm17,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vpsrldq zmm13,zmm16,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm18,zmm16,0x1 + vpxord zmm18,zmm18,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenclast zmm1,zmm1,zmm0 + vaesenclast zmm2,zmm2,zmm0 + vaesenclast zmm3,zmm3,zmm0 + vaesenclast zmm4,zmm4,zmm0 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vpxorq zmm3,zmm3,zmm11 + vpxorq zmm4,zmm4,zmm12 + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqa32 zmm11,zmm17 + vmovdqa32 zmm12,zmm18 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 ZMMWORD[64+rsi],zmm2 + vmovdqu8 ZMMWORD[128+rsi],zmm3 + vmovdqu8 ZMMWORD[192+rsi],zmm4 + add rsi,0x100 + sub rdx,0x100 + cmp rdx,0x100 + jae NEAR $L$_main_loop_run_16_hEgxyDlCngwrfFe + cmp rdx,0x80 + jae NEAR $L$_main_loop_run_8_hEgxyDlCngwrfFe + vextracti32x4 xmm0,zmm4,0x3 + jmp NEAR $L$_do_n_blocks_hEgxyDlCngwrfFe + +$L$_start_by8_hEgxyDlCngwrfFe: + vbroadcasti32x4 zmm0,ZMMWORD[rsp] + vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7] + mov r8,0xaa + kmovq k2,r8 + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x0 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654] + vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234] + vpclmulqdq zmm7,zmm6,zmm25,0x0 + vpxorq zmm5{k2},zmm5,zmm6 + vpxord zmm10,zmm7,zmm5 + +$L$_main_loop_run_8_hEgxyDlCngwrfFe: + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 zmm2,ZMMWORD[64+rdi] + add rdi,0x80 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vpternlogq zmm2,zmm10,zmm0,0x96 + vpsrldq zmm13,zmm9,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm15,zmm9,0x1 + vpxord zmm15,zmm15,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vpsrldq zmm13,zmm10,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm16,zmm10,0x1 + vpxord zmm16,zmm16,zmm14 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenclast zmm1,zmm1,zmm0 + vaesenclast zmm2,zmm2,zmm0 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 ZMMWORD[64+rsi],zmm2 + add rsi,0x80 + sub rdx,0x80 + cmp rdx,0x80 + jae NEAR $L$_main_loop_run_8_hEgxyDlCngwrfFe + vextracti32x4 xmm0,zmm2,0x3 + jmp NEAR $L$_do_n_blocks_hEgxyDlCngwrfFe + +$L$_steal_cipher_hEgxyDlCngwrfFe: + vmovdqa xmm2,xmm8 + lea rax,[vpshufb_shf_table] + vmovdqu xmm10,XMMWORD[rdx*1+rax] + vpshufb xmm8,xmm8,xmm10 + vmovdqu xmm3,XMMWORD[((-16))+rdx*1+rdi] + vmovdqu XMMWORD[(-16)+rdx*1+rsi],xmm8 + lea rax,[vpshufb_shf_table] + add rax,16 + sub rax,rdx + vmovdqu xmm10,XMMWORD[rax] + vpxor xmm10,xmm10,XMMWORD[mask1] + vpshufb xmm3,xmm3,xmm10 + vpblendvb xmm3,xmm3,xmm2,xmm10 + vpxor xmm8,xmm3,xmm0 + vpxor xmm8,xmm8,XMMWORD[rcx] + vaesenc xmm8,xmm8,XMMWORD[16+rcx] + vaesenc xmm8,xmm8,XMMWORD[32+rcx] + vaesenc xmm8,xmm8,XMMWORD[48+rcx] + vaesenc xmm8,xmm8,XMMWORD[64+rcx] + vaesenc xmm8,xmm8,XMMWORD[80+rcx] + vaesenc xmm8,xmm8,XMMWORD[96+rcx] + vaesenc xmm8,xmm8,XMMWORD[112+rcx] + vaesenc xmm8,xmm8,XMMWORD[128+rcx] + vaesenc xmm8,xmm8,XMMWORD[144+rcx] + vaesenclast xmm8,xmm8,XMMWORD[160+rcx] + vpxor xmm8,xmm8,xmm0 + vmovdqu XMMWORD[(-16)+rsi],xmm8 +$L$_ret_hEgxyDlCngwrfFe: + mov rbx,QWORD[288+rsp] + xor r8,r8 + mov QWORD[288+rsp],r8 + + vpxorq zmm0,zmm0,zmm0 + mov rdi,QWORD[((288 + 8))+rsp] + mov QWORD[((288 + 8))+rsp],r8 + mov rsi,QWORD[((288 + 16))+rsp] + mov QWORD[((288 + 16))+rsp],r8 + + vmovdqa xmm6,XMMWORD[((128 + 0))+rsp] + vmovdqa xmm7,XMMWORD[((128 + 16))+rsp] + vmovdqa xmm8,XMMWORD[((128 + 32))+rsp] + vmovdqa xmm9,XMMWORD[((128 + 48))+rsp] + + + vmovdqa64 ZMMWORD[128+rsp],zmm0 + + vmovdqa xmm10,XMMWORD[((128 + 64))+rsp] + vmovdqa xmm11,XMMWORD[((128 + 80))+rsp] + vmovdqa xmm12,XMMWORD[((128 + 96))+rsp] + vmovdqa xmm13,XMMWORD[((128 + 112))+rsp] + + + vmovdqa64 ZMMWORD[(128 + 64)+rsp],zmm0 + + vmovdqa xmm14,XMMWORD[((128 + 128))+rsp] + vmovdqa xmm15,XMMWORD[((128 + 144))+rsp] + + + + vmovdqa YMMWORD[(128 + 128)+rsp],ymm0 + mov rsp,rbp + pop rbp + vzeroupper + mov rdi,QWORD[8+rsp] ;WIN64 epilogue + mov rsi,QWORD[16+rsp] + DB 0F3h,0C3h ;repret + +$L$_less_than_128_bytes_hEgxyDlCngwrfFe: + vpbroadcastq zmm25,r10 + cmp rdx,0x10 + jb NEAR $L$_ret_hEgxyDlCngwrfFe + vbroadcasti32x4 zmm0,ZMMWORD[rsp] + vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7] + mov r8d,0xaa + kmovq k2,r8 + mov r8,rdx + and r8,0x70 + cmp r8,0x60 + je NEAR $L$_num_blocks_is_6_hEgxyDlCngwrfFe + cmp r8,0x50 + je NEAR $L$_num_blocks_is_5_hEgxyDlCngwrfFe + cmp r8,0x40 + je NEAR $L$_num_blocks_is_4_hEgxyDlCngwrfFe + cmp r8,0x30 + je NEAR $L$_num_blocks_is_3_hEgxyDlCngwrfFe + cmp r8,0x20 + je NEAR $L$_num_blocks_is_2_hEgxyDlCngwrfFe + cmp r8,0x10 + je NEAR $L$_num_blocks_is_1_hEgxyDlCngwrfFe + +$L$_num_blocks_is_7_hEgxyDlCngwrfFe: + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x00 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654] + vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234] + vpclmulqdq zmm7,zmm6,zmm25,0x00 + vpxorq zmm5{k2},zmm5,zmm6 + vpxord zmm10,zmm7,zmm5 + mov r8,0x0000ffffffffffff + kmovq k1,r8 + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 zmm2{k1},[64+rdi] + + add rdi,0x70 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vpternlogq zmm2,zmm10,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenclast zmm1,zmm1,zmm0 + vaesenclast zmm2,zmm2,zmm0 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 ZMMWORD[64+rsi]{k1},zmm2 + add rsi,0x70 + vextracti32x4 xmm8,zmm2,0x2 + vextracti32x4 xmm0,zmm10,0x3 + and rdx,0xf + je NEAR $L$_ret_hEgxyDlCngwrfFe + jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe +$L$_num_blocks_is_6_hEgxyDlCngwrfFe: + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x00 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654] + vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234] + vpclmulqdq zmm7,zmm6,zmm25,0x00 + vpxorq zmm5{k2},zmm5,zmm6 + vpxord zmm10,zmm7,zmm5 + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 ymm2,YMMWORD[64+rdi] + add rdi,96 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vpternlogq zmm2,zmm10,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenclast zmm1,zmm1,zmm0 + vaesenclast zmm2,zmm2,zmm0 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 YMMWORD[64+rsi],ymm2 + add rsi,96 + + vextracti32x4 xmm8,ymm2,0x1 + vextracti32x4 xmm0,zmm10,0x2 + and rdx,0xf + je NEAR $L$_ret_hEgxyDlCngwrfFe + jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe +$L$_num_blocks_is_5_hEgxyDlCngwrfFe: + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x00 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654] + vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234] + vpclmulqdq zmm7,zmm6,zmm25,0x00 + vpxorq zmm5{k2},zmm5,zmm6 + vpxord zmm10,zmm7,zmm5 + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 xmm2,XMMWORD[64+rdi] + add rdi,80 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vpternlogq zmm2,zmm10,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenclast zmm1,zmm1,zmm0 + vaesenclast zmm2,zmm2,zmm0 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 XMMWORD[64+rsi],xmm2 + add rsi,80 + + vmovdqa xmm8,xmm2 + vextracti32x4 xmm0,zmm10,0x1 + and rdx,0xf + je NEAR $L$_ret_hEgxyDlCngwrfFe + jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe +$L$_num_blocks_is_4_hEgxyDlCngwrfFe: + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x00 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654] + vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234] + vpclmulqdq zmm7,zmm6,zmm25,0x00 + vpxorq zmm5{k2},zmm5,zmm6 + vpxord zmm10,zmm7,zmm5 + vmovdqu8 zmm1,ZMMWORD[rdi] + add rdi,64 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenclast zmm1,zmm1,zmm0 + vpxorq zmm1,zmm1,zmm9 + vmovdqu8 ZMMWORD[rsi],zmm1 + add rsi,64 + vextracti32x4 xmm8,zmm1,0x3 + vmovdqa xmm0,xmm10 + and rdx,0xf + je NEAR $L$_ret_hEgxyDlCngwrfFe + jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe +$L$_num_blocks_is_3_hEgxyDlCngwrfFe: + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x00 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + mov r8,0x0000ffffffffffff + kmovq k1,r8 + vmovdqu8 zmm1{k1},[rdi] + add rdi,48 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenclast zmm1,zmm1,zmm0 + vpxorq zmm1,zmm1,zmm9 + vmovdqu8 ZMMWORD[rsi]{k1},zmm1 + add rsi,48 + vextracti32x4 xmm8,zmm1,2 + vextracti32x4 xmm0,zmm9,3 + and rdx,0xf + je NEAR $L$_ret_hEgxyDlCngwrfFe + jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe +$L$_num_blocks_is_2_hEgxyDlCngwrfFe: + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x00 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + + vmovdqu8 ymm1,YMMWORD[rdi] + add rdi,32 + vbroadcasti32x4 ymm0,YMMWORD[rcx] + vpternlogq ymm1,ymm9,ymm0,0x96 + vbroadcasti32x4 ymm0,YMMWORD[16+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[32+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[48+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[64+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[80+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[96+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[112+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[128+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[144+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[160+rcx] + vaesenclast ymm1,ymm1,ymm0 + vpxorq ymm1,ymm1,ymm9 + vmovdqu8 YMMWORD[rsi],ymm1 + add rsi,32 + + vextracti32x4 xmm8,ymm1,1 + vextracti32x4 xmm0,zmm9,2 + and rdx,0xf + je NEAR $L$_ret_hEgxyDlCngwrfFe + jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe +$L$_num_blocks_is_1_hEgxyDlCngwrfFe: + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x00 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + + vmovdqu8 xmm1,XMMWORD[rdi] + add rdi,16 + vbroadcasti32x4 ymm0,YMMWORD[rcx] + vpternlogq ymm1,ymm9,ymm0,0x96 + vbroadcasti32x4 ymm0,YMMWORD[16+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[32+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[48+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[64+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[80+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[96+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[112+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[128+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[144+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[160+rcx] + vaesenclast ymm1,ymm1,ymm0 + vpxorq ymm1,ymm1,ymm9 + vmovdqu8 XMMWORD[rsi],xmm1 + add rsi,16 + + vmovdqa xmm8,xmm1 + vextracti32x4 xmm0,zmm9,1 + and rdx,0xf + je NEAR $L$_ret_hEgxyDlCngwrfFe + jmp NEAR $L$_steal_cipher_hEgxyDlCngwrfFe + +global aesni_xts_128_decrypt_avx512 + + +ALIGN 32 +aesni_xts_128_decrypt_avx512: + mov QWORD[8+rsp],rdi ;WIN64 prologue + mov QWORD[16+rsp],rsi + mov rax,rsp +$L$SEH_begin_aesni_xts_128_decrypt_avx512: + mov rdi,rcx + mov rsi,rdx + mov rdx,r8 + mov rcx,r9 + mov r8,QWORD[40+rsp] + mov r9,QWORD[48+rsp] + + + +DB 243,15,30,250 + push rbp + mov rbp,rsp + sub rsp,312 + and rsp,0xffffffffffffffc0 + mov QWORD[288+rsp],rbx + mov QWORD[((288 + 8))+rsp],rdi + mov QWORD[((288 + 16))+rsp],rsi + vmovdqa XMMWORD[(128 + 0)+rsp],xmm6 + vmovdqa XMMWORD[(128 + 16)+rsp],xmm7 + vmovdqa XMMWORD[(128 + 32)+rsp],xmm8 + vmovdqa XMMWORD[(128 + 48)+rsp],xmm9 + vmovdqa XMMWORD[(128 + 64)+rsp],xmm10 + vmovdqa XMMWORD[(128 + 80)+rsp],xmm11 + vmovdqa XMMWORD[(128 + 96)+rsp],xmm12 + vmovdqa XMMWORD[(128 + 112)+rsp],xmm13 + vmovdqa XMMWORD[(128 + 128)+rsp],xmm14 + vmovdqa XMMWORD[(128 + 144)+rsp],xmm15 + mov r10,0x87 + vmovdqu xmm1,XMMWORD[r9] + vpxor xmm1,xmm1,XMMWORD[r8] + vaesenc xmm1,xmm1,XMMWORD[16+r8] + vaesenc xmm1,xmm1,XMMWORD[32+r8] + vaesenc xmm1,xmm1,XMMWORD[48+r8] + vaesenc xmm1,xmm1,XMMWORD[64+r8] + vaesenc xmm1,xmm1,XMMWORD[80+r8] + vaesenc xmm1,xmm1,XMMWORD[96+r8] + vaesenc xmm1,xmm1,XMMWORD[112+r8] + vaesenc xmm1,xmm1,XMMWORD[128+r8] + vaesenc xmm1,xmm1,XMMWORD[144+r8] + vaesenclast xmm1,xmm1,XMMWORD[160+r8] + vmovdqa XMMWORD[rsp],xmm1 + mov QWORD[((8 + 40))+rbp],rdi + mov QWORD[((8 + 48))+rbp],rsi + + cmp rdx,0x80 + jb NEAR $L$_less_than_128_bytes_amivrujEyduiFoi + vpbroadcastq zmm25,r10 + cmp rdx,0x100 + jge NEAR $L$_start_by16_amivrujEyduiFoi + jmp NEAR $L$_start_by8_amivrujEyduiFoi + +$L$_do_n_blocks_amivrujEyduiFoi: + cmp rdx,0x0 + je NEAR $L$_ret_amivrujEyduiFoi + cmp rdx,0x70 + jge NEAR $L$_remaining_num_blocks_is_7_amivrujEyduiFoi + cmp rdx,0x60 + jge NEAR $L$_remaining_num_blocks_is_6_amivrujEyduiFoi + cmp rdx,0x50 + jge NEAR $L$_remaining_num_blocks_is_5_amivrujEyduiFoi + cmp rdx,0x40 + jge NEAR $L$_remaining_num_blocks_is_4_amivrujEyduiFoi + cmp rdx,0x30 + jge NEAR $L$_remaining_num_blocks_is_3_amivrujEyduiFoi + cmp rdx,0x20 + jge NEAR $L$_remaining_num_blocks_is_2_amivrujEyduiFoi + cmp rdx,0x10 + jge NEAR $L$_remaining_num_blocks_is_1_amivrujEyduiFoi + + + vmovdqu xmm1,xmm5 + + vpxor xmm1,xmm1,xmm9 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vpxor xmm1,xmm1,xmm9 + vmovdqu XMMWORD[(-16)+rsi],xmm1 + vmovdqa xmm8,xmm1 + + + mov r8,0x1 + kmovq k1,r8 + vpsllq xmm13,xmm9,0x3f + vpsraq xmm14,xmm13,0x3f + vpandq xmm5,xmm14,xmm25 + vpxorq xmm9{k1},xmm9,xmm5 + vpsrldq xmm10,xmm9,0x8 +DB 98,211,181,8,115,194,1 + vpslldq xmm13,xmm13,0x8 + vpxorq xmm0,xmm0,xmm13 + jmp NEAR $L$_steal_cipher_amivrujEyduiFoi + +$L$_remaining_num_blocks_is_7_amivrujEyduiFoi: + mov r8,0xffffffffffffffff + shr r8,0x10 + kmovq k1,r8 + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 zmm2{k1},[64+rdi] + add rdi,0x70 + and rdx,0xf + je NEAR $L$_done_7_remain_amivrujEyduiFoi + vextracti32x4 xmm12,zmm10,0x2 + vextracti32x4 xmm13,zmm10,0x3 + vinserti32x4 zmm10,zmm10,xmm13,0x2 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 ZMMWORD[64+rsi]{k1},zmm2 + add rsi,0x70 + vextracti32x4 xmm8,zmm2,0x2 + vmovdqa xmm0,xmm12 + jmp NEAR $L$_steal_cipher_amivrujEyduiFoi + +$L$_done_7_remain_amivrujEyduiFoi: + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 ZMMWORD[64+rsi]{k1},zmm2 + jmp NEAR $L$_ret_amivrujEyduiFoi + +$L$_remaining_num_blocks_is_6_amivrujEyduiFoi: + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 ymm2,YMMWORD[64+rdi] + add rdi,0x60 + and rdx,0xf + je NEAR $L$_done_6_remain_amivrujEyduiFoi + vextracti32x4 xmm12,zmm10,0x1 + vextracti32x4 xmm13,zmm10,0x2 + vinserti32x4 zmm10,zmm10,xmm13,0x1 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 YMMWORD[64+rsi],ymm2 + add rsi,0x60 + vextracti32x4 xmm8,zmm2,0x1 + vmovdqa xmm0,xmm12 + jmp NEAR $L$_steal_cipher_amivrujEyduiFoi + +$L$_done_6_remain_amivrujEyduiFoi: + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 YMMWORD[64+rsi],ymm2 + jmp NEAR $L$_ret_amivrujEyduiFoi + +$L$_remaining_num_blocks_is_5_amivrujEyduiFoi: + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu xmm2,XMMWORD[64+rdi] + add rdi,0x50 + and rdx,0xf + je NEAR $L$_done_5_remain_amivrujEyduiFoi + vmovdqa xmm12,xmm10 + vextracti32x4 xmm10,zmm10,0x1 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu XMMWORD[64+rsi],xmm2 + add rsi,0x50 + vmovdqa xmm8,xmm2 + vmovdqa xmm0,xmm12 + jmp NEAR $L$_steal_cipher_amivrujEyduiFoi + +$L$_done_5_remain_amivrujEyduiFoi: + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 XMMWORD[64+rsi],xmm2 + jmp NEAR $L$_ret_amivrujEyduiFoi + +$L$_remaining_num_blocks_is_4_amivrujEyduiFoi: + vmovdqu8 zmm1,ZMMWORD[rdi] + add rdi,0x40 + and rdx,0xf + je NEAR $L$_done_4_remain_amivrujEyduiFoi + vextracti32x4 xmm12,zmm9,0x3 + vinserti32x4 zmm9,zmm9,xmm10,0x3 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + add rsi,0x40 + vextracti32x4 xmm8,zmm1,0x3 + vmovdqa xmm0,xmm12 + jmp NEAR $L$_steal_cipher_amivrujEyduiFoi + +$L$_done_4_remain_amivrujEyduiFoi: + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + jmp NEAR $L$_ret_amivrujEyduiFoi + +$L$_remaining_num_blocks_is_3_amivrujEyduiFoi: + vmovdqu xmm1,XMMWORD[rdi] + vmovdqu xmm2,XMMWORD[16+rdi] + vmovdqu xmm3,XMMWORD[32+rdi] + add rdi,0x30 + and rdx,0xf + je NEAR $L$_done_3_remain_amivrujEyduiFoi + vextracti32x4 xmm13,zmm9,0x2 + vextracti32x4 xmm10,zmm9,0x1 + vextracti32x4 xmm11,zmm9,0x3 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + add rsi,0x30 + vmovdqa xmm8,xmm3 + vmovdqa xmm0,xmm13 + jmp NEAR $L$_steal_cipher_amivrujEyduiFoi + +$L$_done_3_remain_amivrujEyduiFoi: + vextracti32x4 xmm10,zmm9,0x1 + vextracti32x4 xmm11,zmm9,0x2 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + jmp NEAR $L$_ret_amivrujEyduiFoi + +$L$_remaining_num_blocks_is_2_amivrujEyduiFoi: + vmovdqu xmm1,XMMWORD[rdi] + vmovdqu xmm2,XMMWORD[16+rdi] + add rdi,0x20 + and rdx,0xf + je NEAR $L$_done_2_remain_amivrujEyduiFoi + vextracti32x4 xmm10,zmm9,0x2 + vextracti32x4 xmm12,zmm9,0x1 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + add rsi,0x20 + vmovdqa xmm8,xmm2 + vmovdqa xmm0,xmm12 + jmp NEAR $L$_steal_cipher_amivrujEyduiFoi + +$L$_done_2_remain_amivrujEyduiFoi: + vextracti32x4 xmm10,zmm9,0x1 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + jmp NEAR $L$_ret_amivrujEyduiFoi + +$L$_remaining_num_blocks_is_1_amivrujEyduiFoi: + vmovdqu xmm1,XMMWORD[rdi] + add rdi,0x10 + and rdx,0xf + je NEAR $L$_done_1_remain_amivrujEyduiFoi + vextracti32x4 xmm11,zmm9,0x1 + vpxor xmm1,xmm1,xmm11 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vpxor xmm1,xmm1,xmm11 + vmovdqu XMMWORD[rsi],xmm1 + add rsi,0x10 + vmovdqa xmm8,xmm1 + vmovdqa xmm0,xmm9 + jmp NEAR $L$_steal_cipher_amivrujEyduiFoi + +$L$_done_1_remain_amivrujEyduiFoi: + vpxor xmm1,xmm1,xmm9 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vpxor xmm1,xmm1,xmm9 + vmovdqu XMMWORD[rsi],xmm1 + jmp NEAR $L$_ret_amivrujEyduiFoi + +$L$_start_by16_amivrujEyduiFoi: + vbroadcasti32x4 zmm0,ZMMWORD[rsp] + vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7] + mov r8,0xaa + kmovq k2,r8 + + + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x0 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + + + vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654] + vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234] + vpclmulqdq zmm7,zmm6,zmm25,0x0 + vpxorq zmm5{k2},zmm5,zmm6 + vpxord zmm10,zmm7,zmm5 + + + vpsrldq zmm13,zmm9,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm11,zmm9,0x1 + vpxord zmm11,zmm11,zmm14 + + vpsrldq zmm15,zmm10,0xf + vpclmulqdq zmm16,zmm15,zmm25,0x0 + vpslldq zmm12,zmm10,0x1 + vpxord zmm12,zmm12,zmm16 + +$L$_main_loop_run_16_amivrujEyduiFoi: + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 zmm2,ZMMWORD[64+rdi] + vmovdqu8 zmm3,ZMMWORD[128+rdi] + vmovdqu8 zmm4,ZMMWORD[192+rdi] + vmovdqu8 xmm5,XMMWORD[240+rdi] + add rdi,0x100 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vpxorq zmm3,zmm3,zmm11 + vpxorq zmm4,zmm4,zmm12 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vpxorq zmm3,zmm3,zmm0 + vpxorq zmm4,zmm4,zmm0 + vpsrldq zmm13,zmm11,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm15,zmm11,0x1 + vpxord zmm15,zmm15,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vpsrldq zmm13,zmm12,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm16,zmm12,0x1 + vpxord zmm16,zmm16,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vpsrldq zmm13,zmm15,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm17,zmm15,0x1 + vpxord zmm17,zmm17,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vpsrldq zmm13,zmm16,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm18,zmm16,0x1 + vpxord zmm18,zmm18,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + vaesdeclast zmm3,zmm3,zmm0 + vaesdeclast zmm4,zmm4,zmm0 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vpxorq zmm3,zmm3,zmm11 + vpxorq zmm4,zmm4,zmm12 + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqa32 zmm11,zmm17 + vmovdqa32 zmm12,zmm18 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 ZMMWORD[64+rsi],zmm2 + vmovdqu8 ZMMWORD[128+rsi],zmm3 + vmovdqu8 ZMMWORD[192+rsi],zmm4 + add rsi,0x100 + sub rdx,0x100 + cmp rdx,0x100 + jge NEAR $L$_main_loop_run_16_amivrujEyduiFoi + + cmp rdx,0x80 + jge NEAR $L$_main_loop_run_8_amivrujEyduiFoi + jmp NEAR $L$_do_n_blocks_amivrujEyduiFoi + +$L$_start_by8_amivrujEyduiFoi: + + vbroadcasti32x4 zmm0,ZMMWORD[rsp] + vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7] + mov r8,0xaa + kmovq k2,r8 + + + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x0 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + + + vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654] + vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234] + vpclmulqdq zmm7,zmm6,zmm25,0x0 + vpxorq zmm5{k2},zmm5,zmm6 + vpxord zmm10,zmm7,zmm5 + +$L$_main_loop_run_8_amivrujEyduiFoi: + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 zmm2,ZMMWORD[64+rdi] + vmovdqu8 xmm5,XMMWORD[112+rdi] + add rdi,0x80 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vpsrldq zmm13,zmm9,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm15,zmm9,0x1 + vpxord zmm15,zmm15,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vpsrldq zmm13,zmm10,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm16,zmm10,0x1 + vpxord zmm16,zmm16,zmm14 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 ZMMWORD[64+rsi],zmm2 + add rsi,0x80 + sub rdx,0x80 + cmp rdx,0x80 + jge NEAR $L$_main_loop_run_8_amivrujEyduiFoi + jmp NEAR $L$_do_n_blocks_amivrujEyduiFoi + +$L$_steal_cipher_amivrujEyduiFoi: + + vmovdqa xmm2,xmm8 + + + lea rax,[vpshufb_shf_table] + vmovdqu xmm10,XMMWORD[rdx*1+rax] + vpshufb xmm8,xmm8,xmm10 + + + vmovdqu xmm3,XMMWORD[((-16))+rdx*1+rdi] + vmovdqu XMMWORD[(-16)+rdx*1+rsi],xmm8 + + + lea rax,[vpshufb_shf_table] + add rax,16 + sub rax,rdx + vmovdqu xmm10,XMMWORD[rax] + vpxor xmm10,xmm10,XMMWORD[mask1] + vpshufb xmm3,xmm3,xmm10 + + vpblendvb xmm3,xmm3,xmm2,xmm10 + + + vpxor xmm8,xmm3,xmm0 + + + vpxor xmm8,xmm8,XMMWORD[rcx] + vaesdec xmm8,xmm8,XMMWORD[16+rcx] + vaesdec xmm8,xmm8,XMMWORD[32+rcx] + vaesdec xmm8,xmm8,XMMWORD[48+rcx] + vaesdec xmm8,xmm8,XMMWORD[64+rcx] + vaesdec xmm8,xmm8,XMMWORD[80+rcx] + vaesdec xmm8,xmm8,XMMWORD[96+rcx] + vaesdec xmm8,xmm8,XMMWORD[112+rcx] + vaesdec xmm8,xmm8,XMMWORD[128+rcx] + vaesdec xmm8,xmm8,XMMWORD[144+rcx] + vaesdeclast xmm8,xmm8,XMMWORD[160+rcx] + + vpxor xmm8,xmm8,xmm0 + +$L$_done_amivrujEyduiFoi: + + vmovdqu XMMWORD[(-16)+rsi],xmm8 +$L$_ret_amivrujEyduiFoi: + mov rbx,QWORD[288+rsp] + xor r8,r8 + mov QWORD[288+rsp],r8 + + vpxorq zmm0,zmm0,zmm0 + mov rdi,QWORD[((288 + 8))+rsp] + mov QWORD[((288 + 8))+rsp],r8 + mov rsi,QWORD[((288 + 16))+rsp] + mov QWORD[((288 + 16))+rsp],r8 + + vmovdqa xmm6,XMMWORD[((128 + 0))+rsp] + vmovdqa xmm7,XMMWORD[((128 + 16))+rsp] + vmovdqa xmm8,XMMWORD[((128 + 32))+rsp] + vmovdqa xmm9,XMMWORD[((128 + 48))+rsp] + + + vmovdqa64 ZMMWORD[128+rsp],zmm0 + + vmovdqa xmm10,XMMWORD[((128 + 64))+rsp] + vmovdqa xmm11,XMMWORD[((128 + 80))+rsp] + vmovdqa xmm12,XMMWORD[((128 + 96))+rsp] + vmovdqa xmm13,XMMWORD[((128 + 112))+rsp] + + + vmovdqa64 ZMMWORD[(128 + 64)+rsp],zmm0 + + vmovdqa xmm14,XMMWORD[((128 + 128))+rsp] + vmovdqa xmm15,XMMWORD[((128 + 144))+rsp] + + + + vmovdqa YMMWORD[(128 + 128)+rsp],ymm0 + mov rsp,rbp + pop rbp + vzeroupper + mov rdi,QWORD[8+rsp] ;WIN64 epilogue + mov rsi,QWORD[16+rsp] + DB 0F3h,0C3h ;repret + +$L$_less_than_128_bytes_amivrujEyduiFoi: + cmp rdx,0x10 + jb NEAR $L$_ret_amivrujEyduiFoi + + mov r8,rdx + and r8,0x70 + cmp r8,0x60 + je NEAR $L$_num_blocks_is_6_amivrujEyduiFoi + cmp r8,0x50 + je NEAR $L$_num_blocks_is_5_amivrujEyduiFoi + cmp r8,0x40 + je NEAR $L$_num_blocks_is_4_amivrujEyduiFoi + cmp r8,0x30 + je NEAR $L$_num_blocks_is_3_amivrujEyduiFoi + cmp r8,0x20 + je NEAR $L$_num_blocks_is_2_amivrujEyduiFoi + cmp r8,0x10 + je NEAR $L$_num_blocks_is_1_amivrujEyduiFoi + +$L$_num_blocks_is_7_amivrujEyduiFoi: + vmovdqa xmm9,XMMWORD[rsp] + mov rax,QWORD[rsp] + mov rbx,QWORD[8+rsp] + vmovdqu xmm1,XMMWORD[rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[((16 + 8))+rsp],rbx + vmovdqa xmm10,XMMWORD[16+rsp] + vmovdqu xmm2,XMMWORD[16+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[32+rsp],rax + mov QWORD[((32 + 8))+rsp],rbx + vmovdqa xmm11,XMMWORD[32+rsp] + vmovdqu xmm3,XMMWORD[32+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[48+rsp],rax + mov QWORD[((48 + 8))+rsp],rbx + vmovdqa xmm12,XMMWORD[48+rsp] + vmovdqu xmm4,XMMWORD[48+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[64+rsp],rax + mov QWORD[((64 + 8))+rsp],rbx + vmovdqa xmm13,XMMWORD[64+rsp] + vmovdqu xmm5,XMMWORD[64+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[80+rsp],rax + mov QWORD[((80 + 8))+rsp],rbx + vmovdqa xmm14,XMMWORD[80+rsp] + vmovdqu xmm6,XMMWORD[80+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[96+rsp],rax + mov QWORD[((96 + 8))+rsp],rbx + vmovdqa xmm15,XMMWORD[96+rsp] + vmovdqu xmm7,XMMWORD[96+rdi] + add rdi,0x70 + and rdx,0xf + je NEAR $L$_done_7_amivrujEyduiFoi + +$L$_steal_cipher_7_amivrujEyduiFoi: + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[24+rsp],rbx + vmovdqa64 xmm16,xmm15 + vmovdqa xmm15,XMMWORD[16+rsp] + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vpxor xmm6,xmm6,xmm14 + vpxor xmm7,xmm7,xmm15 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vpxor xmm4,xmm4,xmm0 + vpxor xmm5,xmm5,xmm0 + vpxor xmm6,xmm6,xmm0 + vpxor xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vaesdeclast xmm4,xmm4,xmm0 + vaesdeclast xmm5,xmm5,xmm0 + vaesdeclast xmm6,xmm6,xmm0 + vaesdeclast xmm7,xmm7,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vpxor xmm6,xmm6,xmm14 + vpxor xmm7,xmm7,xmm15 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + vmovdqu XMMWORD[48+rsi],xmm4 + vmovdqu XMMWORD[64+rsi],xmm5 + vmovdqu XMMWORD[80+rsi],xmm6 + add rsi,0x70 + vmovdqa64 xmm0,xmm16 + vmovdqa xmm8,xmm7 + jmp NEAR $L$_steal_cipher_amivrujEyduiFoi + +$L$_done_7_amivrujEyduiFoi: + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vpxor xmm6,xmm6,xmm14 + vpxor xmm7,xmm7,xmm15 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vpxor xmm4,xmm4,xmm0 + vpxor xmm5,xmm5,xmm0 + vpxor xmm6,xmm6,xmm0 + vpxor xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vaesdeclast xmm4,xmm4,xmm0 + vaesdeclast xmm5,xmm5,xmm0 + vaesdeclast xmm6,xmm6,xmm0 + vaesdeclast xmm7,xmm7,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vpxor xmm6,xmm6,xmm14 + vpxor xmm7,xmm7,xmm15 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + vmovdqu XMMWORD[48+rsi],xmm4 + vmovdqu XMMWORD[64+rsi],xmm5 + vmovdqu XMMWORD[80+rsi],xmm6 + add rsi,0x70 + vmovdqa xmm8,xmm7 + jmp NEAR $L$_done_amivrujEyduiFoi + +$L$_num_blocks_is_6_amivrujEyduiFoi: + vmovdqa xmm9,XMMWORD[rsp] + mov rax,QWORD[rsp] + mov rbx,QWORD[8+rsp] + vmovdqu xmm1,XMMWORD[rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[((16 + 8))+rsp],rbx + vmovdqa xmm10,XMMWORD[16+rsp] + vmovdqu xmm2,XMMWORD[16+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[32+rsp],rax + mov QWORD[((32 + 8))+rsp],rbx + vmovdqa xmm11,XMMWORD[32+rsp] + vmovdqu xmm3,XMMWORD[32+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[48+rsp],rax + mov QWORD[((48 + 8))+rsp],rbx + vmovdqa xmm12,XMMWORD[48+rsp] + vmovdqu xmm4,XMMWORD[48+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[64+rsp],rax + mov QWORD[((64 + 8))+rsp],rbx + vmovdqa xmm13,XMMWORD[64+rsp] + vmovdqu xmm5,XMMWORD[64+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[80+rsp],rax + mov QWORD[((80 + 8))+rsp],rbx + vmovdqa xmm14,XMMWORD[80+rsp] + vmovdqu xmm6,XMMWORD[80+rdi] + add rdi,0x60 + and rdx,0xf + je NEAR $L$_done_6_amivrujEyduiFoi + +$L$_steal_cipher_6_amivrujEyduiFoi: + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[24+rsp],rbx + vmovdqa64 xmm15,xmm14 + vmovdqa xmm14,XMMWORD[16+rsp] + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vpxor xmm6,xmm6,xmm14 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vpxor xmm4,xmm4,xmm0 + vpxor xmm5,xmm5,xmm0 + vpxor xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vaesdeclast xmm4,xmm4,xmm0 + vaesdeclast xmm5,xmm5,xmm0 + vaesdeclast xmm6,xmm6,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vpxor xmm6,xmm6,xmm14 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + vmovdqu XMMWORD[48+rsi],xmm4 + vmovdqu XMMWORD[64+rsi],xmm5 + add rsi,0x60 + vmovdqa xmm0,xmm15 + vmovdqa xmm8,xmm6 + jmp NEAR $L$_steal_cipher_amivrujEyduiFoi + +$L$_done_6_amivrujEyduiFoi: + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vpxor xmm6,xmm6,xmm14 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vpxor xmm4,xmm4,xmm0 + vpxor xmm5,xmm5,xmm0 + vpxor xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vaesdeclast xmm4,xmm4,xmm0 + vaesdeclast xmm5,xmm5,xmm0 + vaesdeclast xmm6,xmm6,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vpxor xmm6,xmm6,xmm14 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + vmovdqu XMMWORD[48+rsi],xmm4 + vmovdqu XMMWORD[64+rsi],xmm5 + add rsi,0x60 + vmovdqa xmm8,xmm6 + jmp NEAR $L$_done_amivrujEyduiFoi + +$L$_num_blocks_is_5_amivrujEyduiFoi: + vmovdqa xmm9,XMMWORD[rsp] + mov rax,QWORD[rsp] + mov rbx,QWORD[8+rsp] + vmovdqu xmm1,XMMWORD[rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[((16 + 8))+rsp],rbx + vmovdqa xmm10,XMMWORD[16+rsp] + vmovdqu xmm2,XMMWORD[16+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[32+rsp],rax + mov QWORD[((32 + 8))+rsp],rbx + vmovdqa xmm11,XMMWORD[32+rsp] + vmovdqu xmm3,XMMWORD[32+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[48+rsp],rax + mov QWORD[((48 + 8))+rsp],rbx + vmovdqa xmm12,XMMWORD[48+rsp] + vmovdqu xmm4,XMMWORD[48+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[64+rsp],rax + mov QWORD[((64 + 8))+rsp],rbx + vmovdqa xmm13,XMMWORD[64+rsp] + vmovdqu xmm5,XMMWORD[64+rdi] + add rdi,0x50 + and rdx,0xf + je NEAR $L$_done_5_amivrujEyduiFoi + +$L$_steal_cipher_5_amivrujEyduiFoi: + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[24+rsp],rbx + vmovdqa64 xmm14,xmm13 + vmovdqa xmm13,XMMWORD[16+rsp] + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vpxor xmm4,xmm4,xmm0 + vpxor xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vaesdeclast xmm4,xmm4,xmm0 + vaesdeclast xmm5,xmm5,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + vmovdqu XMMWORD[48+rsi],xmm4 + add rsi,0x50 + vmovdqa xmm0,xmm14 + vmovdqa xmm8,xmm5 + jmp NEAR $L$_steal_cipher_amivrujEyduiFoi + +$L$_done_5_amivrujEyduiFoi: + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vpxor xmm4,xmm4,xmm0 + vpxor xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vaesdeclast xmm4,xmm4,xmm0 + vaesdeclast xmm5,xmm5,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + vmovdqu XMMWORD[48+rsi],xmm4 + add rsi,0x50 + vmovdqa xmm8,xmm5 + jmp NEAR $L$_done_amivrujEyduiFoi + +$L$_num_blocks_is_4_amivrujEyduiFoi: + vmovdqa xmm9,XMMWORD[rsp] + mov rax,QWORD[rsp] + mov rbx,QWORD[8+rsp] + vmovdqu xmm1,XMMWORD[rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[((16 + 8))+rsp],rbx + vmovdqa xmm10,XMMWORD[16+rsp] + vmovdqu xmm2,XMMWORD[16+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[32+rsp],rax + mov QWORD[((32 + 8))+rsp],rbx + vmovdqa xmm11,XMMWORD[32+rsp] + vmovdqu xmm3,XMMWORD[32+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[48+rsp],rax + mov QWORD[((48 + 8))+rsp],rbx + vmovdqa xmm12,XMMWORD[48+rsp] + vmovdqu xmm4,XMMWORD[48+rdi] + add rdi,0x40 + and rdx,0xf + je NEAR $L$_done_4_amivrujEyduiFoi + +$L$_steal_cipher_4_amivrujEyduiFoi: + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[24+rsp],rbx + vmovdqa64 xmm13,xmm12 + vmovdqa xmm12,XMMWORD[16+rsp] + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vpxor xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vaesdeclast xmm4,xmm4,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + add rsi,0x40 + vmovdqa xmm0,xmm13 + vmovdqa xmm8,xmm4 + jmp NEAR $L$_steal_cipher_amivrujEyduiFoi + +$L$_done_4_amivrujEyduiFoi: + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vpxor xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vaesdeclast xmm4,xmm4,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + add rsi,0x40 + vmovdqa xmm8,xmm4 + jmp NEAR $L$_done_amivrujEyduiFoi + +$L$_num_blocks_is_3_amivrujEyduiFoi: + vmovdqa xmm9,XMMWORD[rsp] + mov rax,QWORD[rsp] + mov rbx,QWORD[8+rsp] + vmovdqu xmm1,XMMWORD[rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[((16 + 8))+rsp],rbx + vmovdqa xmm10,XMMWORD[16+rsp] + vmovdqu xmm2,XMMWORD[16+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[32+rsp],rax + mov QWORD[((32 + 8))+rsp],rbx + vmovdqa xmm11,XMMWORD[32+rsp] + vmovdqu xmm3,XMMWORD[32+rdi] + add rdi,0x30 + and rdx,0xf + je NEAR $L$_done_3_amivrujEyduiFoi + +$L$_steal_cipher_3_amivrujEyduiFoi: + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[24+rsp],rbx + vmovdqa64 xmm12,xmm11 + vmovdqa xmm11,XMMWORD[16+rsp] + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + add rsi,0x30 + vmovdqa xmm0,xmm12 + vmovdqa xmm8,xmm3 + jmp NEAR $L$_steal_cipher_amivrujEyduiFoi + +$L$_done_3_amivrujEyduiFoi: + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + add rsi,0x30 + vmovdqa xmm8,xmm3 + jmp NEAR $L$_done_amivrujEyduiFoi + +$L$_num_blocks_is_2_amivrujEyduiFoi: + vmovdqa xmm9,XMMWORD[rsp] + mov rax,QWORD[rsp] + mov rbx,QWORD[8+rsp] + vmovdqu xmm1,XMMWORD[rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[((16 + 8))+rsp],rbx + vmovdqa xmm10,XMMWORD[16+rsp] + vmovdqu xmm2,XMMWORD[16+rdi] + add rdi,0x20 + and rdx,0xf + je NEAR $L$_done_2_amivrujEyduiFoi + +$L$_steal_cipher_2_amivrujEyduiFoi: + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[24+rsp],rbx + vmovdqa64 xmm11,xmm10 + vmovdqa xmm10,XMMWORD[16+rsp] + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vmovdqu XMMWORD[rsi],xmm1 + add rsi,0x20 + vmovdqa xmm0,xmm11 + vmovdqa xmm8,xmm2 + jmp NEAR $L$_steal_cipher_amivrujEyduiFoi + +$L$_done_2_amivrujEyduiFoi: + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vmovdqu XMMWORD[rsi],xmm1 + add rsi,0x20 + vmovdqa xmm8,xmm2 + jmp NEAR $L$_done_amivrujEyduiFoi + +$L$_num_blocks_is_1_amivrujEyduiFoi: + vmovdqa xmm9,XMMWORD[rsp] + mov rax,QWORD[rsp] + mov rbx,QWORD[8+rsp] + vmovdqu xmm1,XMMWORD[rdi] + add rdi,0x10 + and rdx,0xf + je NEAR $L$_done_1_amivrujEyduiFoi + +$L$_steal_cipher_1_amivrujEyduiFoi: + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[24+rsp],rbx + vmovdqa64 xmm10,xmm9 + vmovdqa xmm9,XMMWORD[16+rsp] + vpxor xmm1,xmm1,xmm9 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vpxor xmm1,xmm1,xmm9 + add rsi,0x10 + vmovdqa xmm0,xmm10 + vmovdqa xmm8,xmm1 + jmp NEAR $L$_steal_cipher_amivrujEyduiFoi + +$L$_done_1_amivrujEyduiFoi: + vpxor xmm1,xmm1,xmm9 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vpxor xmm1,xmm1,xmm9 + add rsi,0x10 + vmovdqa xmm8,xmm1 + jmp NEAR $L$_done_amivrujEyduiFoi + +global aesni_xts_256_encrypt_avx512 + + +ALIGN 32 +aesni_xts_256_encrypt_avx512: + mov QWORD[8+rsp],rdi ;WIN64 prologue + mov QWORD[16+rsp],rsi + mov rax,rsp +$L$SEH_begin_aesni_xts_256_encrypt_avx512: + mov rdi,rcx + mov rsi,rdx + mov rdx,r8 + mov rcx,r9 + mov r8,QWORD[40+rsp] + mov r9,QWORD[48+rsp] + + + +DB 243,15,30,250 + push rbp + mov rbp,rsp + sub rsp,312 + and rsp,0xffffffffffffffc0 + mov QWORD[288+rsp],rbx + mov QWORD[((288 + 8))+rsp],rdi + mov QWORD[((288 + 16))+rsp],rsi + vmovdqa XMMWORD[(128 + 0)+rsp],xmm6 + vmovdqa XMMWORD[(128 + 16)+rsp],xmm7 + vmovdqa XMMWORD[(128 + 32)+rsp],xmm8 + vmovdqa XMMWORD[(128 + 48)+rsp],xmm9 + vmovdqa XMMWORD[(128 + 64)+rsp],xmm10 + vmovdqa XMMWORD[(128 + 80)+rsp],xmm11 + vmovdqa XMMWORD[(128 + 96)+rsp],xmm12 + vmovdqa XMMWORD[(128 + 112)+rsp],xmm13 + vmovdqa XMMWORD[(128 + 128)+rsp],xmm14 + vmovdqa XMMWORD[(128 + 144)+rsp],xmm15 + mov r10,0x87 + vmovdqu xmm1,XMMWORD[r9] + vpxor xmm1,xmm1,XMMWORD[r8] + vaesenc xmm1,xmm1,XMMWORD[16+r8] + vaesenc xmm1,xmm1,XMMWORD[32+r8] + vaesenc xmm1,xmm1,XMMWORD[48+r8] + vaesenc xmm1,xmm1,XMMWORD[64+r8] + vaesenc xmm1,xmm1,XMMWORD[80+r8] + vaesenc xmm1,xmm1,XMMWORD[96+r8] + vaesenc xmm1,xmm1,XMMWORD[112+r8] + vaesenc xmm1,xmm1,XMMWORD[128+r8] + vaesenc xmm1,xmm1,XMMWORD[144+r8] + vaesenc xmm1,xmm1,XMMWORD[160+r8] + vaesenc xmm1,xmm1,XMMWORD[176+r8] + vaesenc xmm1,xmm1,XMMWORD[192+r8] + vaesenc xmm1,xmm1,XMMWORD[208+r8] + vaesenclast xmm1,xmm1,XMMWORD[224+r8] + vmovdqa XMMWORD[rsp],xmm1 + mov QWORD[((8 + 40))+rbp],rdi + mov QWORD[((8 + 48))+rbp],rsi + + cmp rdx,0x80 + jl NEAR $L$_less_than_128_bytes_wcpqaDvsGlbjGoe + vpbroadcastq zmm25,r10 + cmp rdx,0x100 + jge NEAR $L$_start_by16_wcpqaDvsGlbjGoe + cmp rdx,0x80 + jge NEAR $L$_start_by8_wcpqaDvsGlbjGoe + +$L$_do_n_blocks_wcpqaDvsGlbjGoe: + cmp rdx,0x0 + je NEAR $L$_ret_wcpqaDvsGlbjGoe + cmp rdx,0x70 + jge NEAR $L$_remaining_num_blocks_is_7_wcpqaDvsGlbjGoe + cmp rdx,0x60 + jge NEAR $L$_remaining_num_blocks_is_6_wcpqaDvsGlbjGoe + cmp rdx,0x50 + jge NEAR $L$_remaining_num_blocks_is_5_wcpqaDvsGlbjGoe + cmp rdx,0x40 + jge NEAR $L$_remaining_num_blocks_is_4_wcpqaDvsGlbjGoe + cmp rdx,0x30 + jge NEAR $L$_remaining_num_blocks_is_3_wcpqaDvsGlbjGoe + cmp rdx,0x20 + jge NEAR $L$_remaining_num_blocks_is_2_wcpqaDvsGlbjGoe + cmp rdx,0x10 + jge NEAR $L$_remaining_num_blocks_is_1_wcpqaDvsGlbjGoe + vmovdqa xmm8,xmm0 + vmovdqa xmm0,xmm9 + jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe + +$L$_remaining_num_blocks_is_7_wcpqaDvsGlbjGoe: + mov r8,0x0000ffffffffffff + kmovq k1,r8 + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 zmm2{k1},[64+rdi] + add rdi,0x70 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vpternlogq zmm2,zmm10,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesenclast zmm1,zmm1,zmm0 + vaesenclast zmm2,zmm2,zmm0 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 ZMMWORD[64+rsi]{k1},zmm2 + add rsi,0x70 + vextracti32x4 xmm8,zmm2,0x2 + vextracti32x4 xmm0,zmm10,0x3 + and rdx,0xf + je NEAR $L$_ret_wcpqaDvsGlbjGoe + jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe + +$L$_remaining_num_blocks_is_6_wcpqaDvsGlbjGoe: + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 ymm2,YMMWORD[64+rdi] + add rdi,0x60 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vpternlogq zmm2,zmm10,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesenclast zmm1,zmm1,zmm0 + vaesenclast zmm2,zmm2,zmm0 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 YMMWORD[64+rsi],ymm2 + add rsi,0x60 + vextracti32x4 xmm8,zmm2,0x1 + vextracti32x4 xmm0,zmm10,0x2 + and rdx,0xf + je NEAR $L$_ret_wcpqaDvsGlbjGoe + jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe + +$L$_remaining_num_blocks_is_5_wcpqaDvsGlbjGoe: + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu xmm2,XMMWORD[64+rdi] + add rdi,0x50 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vpternlogq zmm2,zmm10,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesenclast zmm1,zmm1,zmm0 + vaesenclast zmm2,zmm2,zmm0 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu XMMWORD[64+rsi],xmm2 + add rsi,0x50 + vmovdqa xmm8,xmm2 + vextracti32x4 xmm0,zmm10,0x1 + and rdx,0xf + je NEAR $L$_ret_wcpqaDvsGlbjGoe + jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe + +$L$_remaining_num_blocks_is_4_wcpqaDvsGlbjGoe: + vmovdqu8 zmm1,ZMMWORD[rdi] + add rdi,0x40 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesenclast zmm1,zmm1,zmm0 + vpxorq zmm1,zmm1,zmm9 + vmovdqu8 ZMMWORD[rsi],zmm1 + add rsi,0x40 + vextracti32x4 xmm8,zmm1,0x3 + vmovdqa64 xmm0,xmm10 + and rdx,0xf + je NEAR $L$_ret_wcpqaDvsGlbjGoe + jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe +$L$_remaining_num_blocks_is_3_wcpqaDvsGlbjGoe: + mov r8,-1 + shr r8,0x10 + kmovq k1,r8 + vmovdqu8 zmm1{k1},[rdi] + add rdi,0x30 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesenclast zmm1,zmm1,zmm0 + vpxorq zmm1,zmm1,zmm9 + vmovdqu8 ZMMWORD[rsi]{k1},zmm1 + add rsi,0x30 + vextracti32x4 xmm8,zmm1,0x2 + vextracti32x4 xmm0,zmm9,0x3 + and rdx,0xf + je NEAR $L$_ret_wcpqaDvsGlbjGoe + jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe +$L$_remaining_num_blocks_is_2_wcpqaDvsGlbjGoe: + vmovdqu8 ymm1,YMMWORD[rdi] + add rdi,0x20 + vbroadcasti32x4 ymm0,YMMWORD[rcx] + vpternlogq ymm1,ymm9,ymm0,0x96 + vbroadcasti32x4 ymm0,YMMWORD[16+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[32+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[48+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[64+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[80+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[96+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[112+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[128+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[144+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[160+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[176+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[192+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[208+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[224+rcx] + vaesenclast ymm1,ymm1,ymm0 + vpxorq ymm1,ymm1,ymm9 + vmovdqu YMMWORD[rsi],ymm1 + add rsi,0x20 + vextracti32x4 xmm8,zmm1,0x1 + vextracti32x4 xmm0,zmm9,0x2 + and rdx,0xf + je NEAR $L$_ret_wcpqaDvsGlbjGoe + jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe +$L$_remaining_num_blocks_is_1_wcpqaDvsGlbjGoe: + vmovdqu xmm1,XMMWORD[rdi] + add rdi,0x10 + vpxor xmm1,xmm1,xmm9 + vpxor xmm1,xmm1,XMMWORD[rcx] + vaesenc xmm1,xmm1,XMMWORD[16+rcx] + vaesenc xmm1,xmm1,XMMWORD[32+rcx] + vaesenc xmm1,xmm1,XMMWORD[48+rcx] + vaesenc xmm1,xmm1,XMMWORD[64+rcx] + vaesenc xmm1,xmm1,XMMWORD[80+rcx] + vaesenc xmm1,xmm1,XMMWORD[96+rcx] + vaesenc xmm1,xmm1,XMMWORD[112+rcx] + vaesenc xmm1,xmm1,XMMWORD[128+rcx] + vaesenc xmm1,xmm1,XMMWORD[144+rcx] + vaesenc xmm1,xmm1,XMMWORD[160+rcx] + vaesenc xmm1,xmm1,XMMWORD[176+rcx] + vaesenc xmm1,xmm1,XMMWORD[192+rcx] + vaesenc xmm1,xmm1,XMMWORD[208+rcx] + vaesenclast xmm1,xmm1,XMMWORD[224+rcx] + vpxor xmm1,xmm1,xmm9 + vmovdqu XMMWORD[rsi],xmm1 + add rsi,0x10 + vmovdqa xmm8,xmm1 + vextracti32x4 xmm0,zmm9,0x1 + and rdx,0xf + je NEAR $L$_ret_wcpqaDvsGlbjGoe + jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe + + +$L$_start_by16_wcpqaDvsGlbjGoe: + vbroadcasti32x4 zmm0,ZMMWORD[rsp] + vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7] + mov r8,0xaa + kmovq k2,r8 + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x0 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654] + vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234] + vpclmulqdq zmm7,zmm6,zmm25,0x0 + vpxorq zmm5{k2},zmm5,zmm6 + vpxord zmm10,zmm7,zmm5 + vpsrldq zmm13,zmm9,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm11,zmm9,0x1 + vpxord zmm11,zmm11,zmm14 + vpsrldq zmm15,zmm10,0xf + vpclmulqdq zmm16,zmm15,zmm25,0x0 + vpslldq zmm12,zmm10,0x1 + vpxord zmm12,zmm12,zmm16 + +$L$_main_loop_run_16_wcpqaDvsGlbjGoe: + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 zmm2,ZMMWORD[64+rdi] + vmovdqu8 zmm3,ZMMWORD[128+rdi] + vmovdqu8 zmm4,ZMMWORD[192+rdi] + add rdi,0x100 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vpxorq zmm3,zmm3,zmm11 + vpxorq zmm4,zmm4,zmm12 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vpxorq zmm3,zmm3,zmm0 + vpxorq zmm4,zmm4,zmm0 + vpsrldq zmm13,zmm11,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm15,zmm11,0x1 + vpxord zmm15,zmm15,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vpsrldq zmm13,zmm12,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm16,zmm12,0x1 + vpxord zmm16,zmm16,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vpsrldq zmm13,zmm15,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm17,zmm15,0x1 + vpxord zmm17,zmm17,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vpsrldq zmm13,zmm16,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm18,zmm16,0x1 + vpxord zmm18,zmm18,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vaesenc zmm3,zmm3,zmm0 + vaesenc zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesenclast zmm1,zmm1,zmm0 + vaesenclast zmm2,zmm2,zmm0 + vaesenclast zmm3,zmm3,zmm0 + vaesenclast zmm4,zmm4,zmm0 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vpxorq zmm3,zmm3,zmm11 + vpxorq zmm4,zmm4,zmm12 + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqa32 zmm11,zmm17 + vmovdqa32 zmm12,zmm18 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 ZMMWORD[64+rsi],zmm2 + vmovdqu8 ZMMWORD[128+rsi],zmm3 + vmovdqu8 ZMMWORD[192+rsi],zmm4 + add rsi,0x100 + sub rdx,0x100 + cmp rdx,0x100 + jae NEAR $L$_main_loop_run_16_wcpqaDvsGlbjGoe + cmp rdx,0x80 + jae NEAR $L$_main_loop_run_8_wcpqaDvsGlbjGoe + vextracti32x4 xmm0,zmm4,0x3 + jmp NEAR $L$_do_n_blocks_wcpqaDvsGlbjGoe + +$L$_start_by8_wcpqaDvsGlbjGoe: + vbroadcasti32x4 zmm0,ZMMWORD[rsp] + vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7] + mov r8,0xaa + kmovq k2,r8 + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x0 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654] + vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234] + vpclmulqdq zmm7,zmm6,zmm25,0x0 + vpxorq zmm5{k2},zmm5,zmm6 + vpxord zmm10,zmm7,zmm5 + +$L$_main_loop_run_8_wcpqaDvsGlbjGoe: + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 zmm2,ZMMWORD[64+rdi] + add rdi,0x80 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vpternlogq zmm2,zmm10,zmm0,0x96 + vpsrldq zmm13,zmm9,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm15,zmm9,0x1 + vpxord zmm15,zmm15,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + vpsrldq zmm13,zmm10,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm16,zmm10,0x1 + vpxord zmm16,zmm16,zmm14 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesenclast zmm1,zmm1,zmm0 + vaesenclast zmm2,zmm2,zmm0 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 ZMMWORD[64+rsi],zmm2 + add rsi,0x80 + sub rdx,0x80 + cmp rdx,0x80 + jae NEAR $L$_main_loop_run_8_wcpqaDvsGlbjGoe + vextracti32x4 xmm0,zmm2,0x3 + jmp NEAR $L$_do_n_blocks_wcpqaDvsGlbjGoe + +$L$_steal_cipher_wcpqaDvsGlbjGoe: + vmovdqa xmm2,xmm8 + lea rax,[vpshufb_shf_table] + vmovdqu xmm10,XMMWORD[rdx*1+rax] + vpshufb xmm8,xmm8,xmm10 + vmovdqu xmm3,XMMWORD[((-16))+rdx*1+rdi] + vmovdqu XMMWORD[(-16)+rdx*1+rsi],xmm8 + lea rax,[vpshufb_shf_table] + add rax,16 + sub rax,rdx + vmovdqu xmm10,XMMWORD[rax] + vpxor xmm10,xmm10,XMMWORD[mask1] + vpshufb xmm3,xmm3,xmm10 + vpblendvb xmm3,xmm3,xmm2,xmm10 + vpxor xmm8,xmm3,xmm0 + vpxor xmm8,xmm8,XMMWORD[rcx] + vaesenc xmm8,xmm8,XMMWORD[16+rcx] + vaesenc xmm8,xmm8,XMMWORD[32+rcx] + vaesenc xmm8,xmm8,XMMWORD[48+rcx] + vaesenc xmm8,xmm8,XMMWORD[64+rcx] + vaesenc xmm8,xmm8,XMMWORD[80+rcx] + vaesenc xmm8,xmm8,XMMWORD[96+rcx] + vaesenc xmm8,xmm8,XMMWORD[112+rcx] + vaesenc xmm8,xmm8,XMMWORD[128+rcx] + vaesenc xmm8,xmm8,XMMWORD[144+rcx] + vaesenc xmm8,xmm8,XMMWORD[160+rcx] + vaesenc xmm8,xmm8,XMMWORD[176+rcx] + vaesenc xmm8,xmm8,XMMWORD[192+rcx] + vaesenc xmm8,xmm8,XMMWORD[208+rcx] + vaesenclast xmm8,xmm8,XMMWORD[224+rcx] + vpxor xmm8,xmm8,xmm0 + vmovdqu XMMWORD[(-16)+rsi],xmm8 +$L$_ret_wcpqaDvsGlbjGoe: + mov rbx,QWORD[288+rsp] + xor r8,r8 + mov QWORD[288+rsp],r8 + + vpxorq zmm0,zmm0,zmm0 + mov rdi,QWORD[((288 + 8))+rsp] + mov QWORD[((288 + 8))+rsp],r8 + mov rsi,QWORD[((288 + 16))+rsp] + mov QWORD[((288 + 16))+rsp],r8 + + vmovdqa xmm6,XMMWORD[((128 + 0))+rsp] + vmovdqa xmm7,XMMWORD[((128 + 16))+rsp] + vmovdqa xmm8,XMMWORD[((128 + 32))+rsp] + vmovdqa xmm9,XMMWORD[((128 + 48))+rsp] + + + vmovdqa64 ZMMWORD[128+rsp],zmm0 + + vmovdqa xmm10,XMMWORD[((128 + 64))+rsp] + vmovdqa xmm11,XMMWORD[((128 + 80))+rsp] + vmovdqa xmm12,XMMWORD[((128 + 96))+rsp] + vmovdqa xmm13,XMMWORD[((128 + 112))+rsp] + + + vmovdqa64 ZMMWORD[(128 + 64)+rsp],zmm0 + + vmovdqa xmm14,XMMWORD[((128 + 128))+rsp] + vmovdqa xmm15,XMMWORD[((128 + 144))+rsp] + + + + vmovdqa YMMWORD[(128 + 128)+rsp],ymm0 + mov rsp,rbp + pop rbp + vzeroupper + mov rdi,QWORD[8+rsp] ;WIN64 epilogue + mov rsi,QWORD[16+rsp] + DB 0F3h,0C3h ;repret + +$L$_less_than_128_bytes_wcpqaDvsGlbjGoe: + vpbroadcastq zmm25,r10 + cmp rdx,0x10 + jb NEAR $L$_ret_wcpqaDvsGlbjGoe + vbroadcasti32x4 zmm0,ZMMWORD[rsp] + vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7] + mov r8d,0xaa + kmovq k2,r8 + mov r8,rdx + and r8,0x70 + cmp r8,0x60 + je NEAR $L$_num_blocks_is_6_wcpqaDvsGlbjGoe + cmp r8,0x50 + je NEAR $L$_num_blocks_is_5_wcpqaDvsGlbjGoe + cmp r8,0x40 + je NEAR $L$_num_blocks_is_4_wcpqaDvsGlbjGoe + cmp r8,0x30 + je NEAR $L$_num_blocks_is_3_wcpqaDvsGlbjGoe + cmp r8,0x20 + je NEAR $L$_num_blocks_is_2_wcpqaDvsGlbjGoe + cmp r8,0x10 + je NEAR $L$_num_blocks_is_1_wcpqaDvsGlbjGoe + +$L$_num_blocks_is_7_wcpqaDvsGlbjGoe: + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x00 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654] + vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234] + vpclmulqdq zmm7,zmm6,zmm25,0x00 + vpxorq zmm5{k2},zmm5,zmm6 + vpxord zmm10,zmm7,zmm5 + mov r8,0x0000ffffffffffff + kmovq k1,r8 + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 zmm2{k1},[64+rdi] + + add rdi,0x70 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vpternlogq zmm2,zmm10,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesenclast zmm1,zmm1,zmm0 + vaesenclast zmm2,zmm2,zmm0 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 ZMMWORD[64+rsi]{k1},zmm2 + add rsi,0x70 + vextracti32x4 xmm8,zmm2,0x2 + vextracti32x4 xmm0,zmm10,0x3 + and rdx,0xf + je NEAR $L$_ret_wcpqaDvsGlbjGoe + jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe +$L$_num_blocks_is_6_wcpqaDvsGlbjGoe: + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x00 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654] + vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234] + vpclmulqdq zmm7,zmm6,zmm25,0x00 + vpxorq zmm5{k2},zmm5,zmm6 + vpxord zmm10,zmm7,zmm5 + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 ymm2,YMMWORD[64+rdi] + add rdi,96 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vpternlogq zmm2,zmm10,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesenclast zmm1,zmm1,zmm0 + vaesenclast zmm2,zmm2,zmm0 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 YMMWORD[64+rsi],ymm2 + add rsi,96 + + vextracti32x4 xmm8,ymm2,0x1 + vextracti32x4 xmm0,zmm10,0x2 + and rdx,0xf + je NEAR $L$_ret_wcpqaDvsGlbjGoe + jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe +$L$_num_blocks_is_5_wcpqaDvsGlbjGoe: + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x00 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654] + vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234] + vpclmulqdq zmm7,zmm6,zmm25,0x00 + vpxorq zmm5{k2},zmm5,zmm6 + vpxord zmm10,zmm7,zmm5 + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 xmm2,XMMWORD[64+rdi] + add rdi,80 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vpternlogq zmm2,zmm10,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesenc zmm1,zmm1,zmm0 + vaesenc zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesenclast zmm1,zmm1,zmm0 + vaesenclast zmm2,zmm2,zmm0 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 XMMWORD[64+rsi],xmm2 + add rsi,80 + + vmovdqa xmm8,xmm2 + vextracti32x4 xmm0,zmm10,0x1 + and rdx,0xf + je NEAR $L$_ret_wcpqaDvsGlbjGoe + jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe +$L$_num_blocks_is_4_wcpqaDvsGlbjGoe: + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x00 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654] + vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234] + vpclmulqdq zmm7,zmm6,zmm25,0x00 + vpxorq zmm5{k2},zmm5,zmm6 + vpxord zmm10,zmm7,zmm5 + vmovdqu8 zmm1,ZMMWORD[rdi] + add rdi,64 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesenclast zmm1,zmm1,zmm0 + vpxorq zmm1,zmm1,zmm9 + vmovdqu8 ZMMWORD[rsi],zmm1 + add rsi,64 + vextracti32x4 xmm8,zmm1,0x3 + vmovdqa xmm0,xmm10 + and rdx,0xf + je NEAR $L$_ret_wcpqaDvsGlbjGoe + jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe +$L$_num_blocks_is_3_wcpqaDvsGlbjGoe: + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x00 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + mov r8,0x0000ffffffffffff + kmovq k1,r8 + vmovdqu8 zmm1{k1},[rdi] + add rdi,48 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpternlogq zmm1,zmm9,zmm0,0x96 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesenc zmm1,zmm1,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesenclast zmm1,zmm1,zmm0 + vpxorq zmm1,zmm1,zmm9 + vmovdqu8 ZMMWORD[rsi]{k1},zmm1 + add rsi,48 + vextracti32x4 xmm8,zmm1,2 + vextracti32x4 xmm0,zmm9,3 + and rdx,0xf + je NEAR $L$_ret_wcpqaDvsGlbjGoe + jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe +$L$_num_blocks_is_2_wcpqaDvsGlbjGoe: + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x00 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + + vmovdqu8 ymm1,YMMWORD[rdi] + add rdi,32 + vbroadcasti32x4 ymm0,YMMWORD[rcx] + vpternlogq ymm1,ymm9,ymm0,0x96 + vbroadcasti32x4 ymm0,YMMWORD[16+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[32+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[48+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[64+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[80+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[96+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[112+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[128+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[144+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[160+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[176+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[192+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[208+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[224+rcx] + vaesenclast ymm1,ymm1,ymm0 + vpxorq ymm1,ymm1,ymm9 + vmovdqu8 YMMWORD[rsi],ymm1 + add rsi,32 + + vextracti32x4 xmm8,ymm1,1 + vextracti32x4 xmm0,zmm9,2 + and rdx,0xf + je NEAR $L$_ret_wcpqaDvsGlbjGoe + jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe +$L$_num_blocks_is_1_wcpqaDvsGlbjGoe: + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x00 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + + vmovdqu8 xmm1,XMMWORD[rdi] + add rdi,16 + vbroadcasti32x4 ymm0,YMMWORD[rcx] + vpternlogq ymm1,ymm9,ymm0,0x96 + vbroadcasti32x4 ymm0,YMMWORD[16+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[32+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[48+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[64+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[80+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[96+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[112+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[128+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[144+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[160+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[176+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[192+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[208+rcx] + vaesenc ymm1,ymm1,ymm0 + vbroadcasti32x4 ymm0,YMMWORD[224+rcx] + vaesenclast ymm1,ymm1,ymm0 + vpxorq ymm1,ymm1,ymm9 + vmovdqu8 XMMWORD[rsi],xmm1 + add rsi,16 + + vmovdqa xmm8,xmm1 + vextracti32x4 xmm0,zmm9,1 + and rdx,0xf + je NEAR $L$_ret_wcpqaDvsGlbjGoe + jmp NEAR $L$_steal_cipher_wcpqaDvsGlbjGoe + +global aesni_xts_256_decrypt_avx512 + + +ALIGN 32 +aesni_xts_256_decrypt_avx512: + mov QWORD[8+rsp],rdi ;WIN64 prologue + mov QWORD[16+rsp],rsi + mov rax,rsp +$L$SEH_begin_aesni_xts_256_decrypt_avx512: + mov rdi,rcx + mov rsi,rdx + mov rdx,r8 + mov rcx,r9 + mov r8,QWORD[40+rsp] + mov r9,QWORD[48+rsp] + + + +DB 243,15,30,250 + push rbp + mov rbp,rsp + sub rsp,312 + and rsp,0xffffffffffffffc0 + mov QWORD[288+rsp],rbx + mov QWORD[((288 + 8))+rsp],rdi + mov QWORD[((288 + 16))+rsp],rsi + vmovdqa XMMWORD[(128 + 0)+rsp],xmm6 + vmovdqa XMMWORD[(128 + 16)+rsp],xmm7 + vmovdqa XMMWORD[(128 + 32)+rsp],xmm8 + vmovdqa XMMWORD[(128 + 48)+rsp],xmm9 + vmovdqa XMMWORD[(128 + 64)+rsp],xmm10 + vmovdqa XMMWORD[(128 + 80)+rsp],xmm11 + vmovdqa XMMWORD[(128 + 96)+rsp],xmm12 + vmovdqa XMMWORD[(128 + 112)+rsp],xmm13 + vmovdqa XMMWORD[(128 + 128)+rsp],xmm14 + vmovdqa XMMWORD[(128 + 144)+rsp],xmm15 + mov r10,0x87 + vmovdqu xmm1,XMMWORD[r9] + vpxor xmm1,xmm1,XMMWORD[r8] + vaesenc xmm1,xmm1,XMMWORD[16+r8] + vaesenc xmm1,xmm1,XMMWORD[32+r8] + vaesenc xmm1,xmm1,XMMWORD[48+r8] + vaesenc xmm1,xmm1,XMMWORD[64+r8] + vaesenc xmm1,xmm1,XMMWORD[80+r8] + vaesenc xmm1,xmm1,XMMWORD[96+r8] + vaesenc xmm1,xmm1,XMMWORD[112+r8] + vaesenc xmm1,xmm1,XMMWORD[128+r8] + vaesenc xmm1,xmm1,XMMWORD[144+r8] + vaesenc xmm1,xmm1,XMMWORD[160+r8] + vaesenc xmm1,xmm1,XMMWORD[176+r8] + vaesenc xmm1,xmm1,XMMWORD[192+r8] + vaesenc xmm1,xmm1,XMMWORD[208+r8] + vaesenclast xmm1,xmm1,XMMWORD[224+r8] + vmovdqa XMMWORD[rsp],xmm1 + mov QWORD[((8 + 40))+rbp],rdi + mov QWORD[((8 + 48))+rbp],rsi + + cmp rdx,0x80 + jb NEAR $L$_less_than_128_bytes_EmbgEptodyewbFa + vpbroadcastq zmm25,r10 + cmp rdx,0x100 + jge NEAR $L$_start_by16_EmbgEptodyewbFa + jmp NEAR $L$_start_by8_EmbgEptodyewbFa + +$L$_do_n_blocks_EmbgEptodyewbFa: + cmp rdx,0x0 + je NEAR $L$_ret_EmbgEptodyewbFa + cmp rdx,0x70 + jge NEAR $L$_remaining_num_blocks_is_7_EmbgEptodyewbFa + cmp rdx,0x60 + jge NEAR $L$_remaining_num_blocks_is_6_EmbgEptodyewbFa + cmp rdx,0x50 + jge NEAR $L$_remaining_num_blocks_is_5_EmbgEptodyewbFa + cmp rdx,0x40 + jge NEAR $L$_remaining_num_blocks_is_4_EmbgEptodyewbFa + cmp rdx,0x30 + jge NEAR $L$_remaining_num_blocks_is_3_EmbgEptodyewbFa + cmp rdx,0x20 + jge NEAR $L$_remaining_num_blocks_is_2_EmbgEptodyewbFa + cmp rdx,0x10 + jge NEAR $L$_remaining_num_blocks_is_1_EmbgEptodyewbFa + + + vmovdqu xmm1,xmm5 + + vpxor xmm1,xmm1,xmm9 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vpxor xmm1,xmm1,xmm9 + vmovdqu XMMWORD[(-16)+rsi],xmm1 + vmovdqa xmm8,xmm1 + + + mov r8,0x1 + kmovq k1,r8 + vpsllq xmm13,xmm9,0x3f + vpsraq xmm14,xmm13,0x3f + vpandq xmm5,xmm14,xmm25 + vpxorq xmm9{k1},xmm9,xmm5 + vpsrldq xmm10,xmm9,0x8 +DB 98,211,181,8,115,194,1 + vpslldq xmm13,xmm13,0x8 + vpxorq xmm0,xmm0,xmm13 + jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa + +$L$_remaining_num_blocks_is_7_EmbgEptodyewbFa: + mov r8,0xffffffffffffffff + shr r8,0x10 + kmovq k1,r8 + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 zmm2{k1},[64+rdi] + add rdi,0x70 + and rdx,0xf + je NEAR $L$_done_7_remain_EmbgEptodyewbFa + vextracti32x4 xmm12,zmm10,0x2 + vextracti32x4 xmm13,zmm10,0x3 + vinserti32x4 zmm10,zmm10,xmm13,0x2 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 ZMMWORD[64+rsi]{k1},zmm2 + add rsi,0x70 + vextracti32x4 xmm8,zmm2,0x2 + vmovdqa xmm0,xmm12 + jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa + +$L$_done_7_remain_EmbgEptodyewbFa: + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 ZMMWORD[64+rsi]{k1},zmm2 + jmp NEAR $L$_ret_EmbgEptodyewbFa + +$L$_remaining_num_blocks_is_6_EmbgEptodyewbFa: + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 ymm2,YMMWORD[64+rdi] + add rdi,0x60 + and rdx,0xf + je NEAR $L$_done_6_remain_EmbgEptodyewbFa + vextracti32x4 xmm12,zmm10,0x1 + vextracti32x4 xmm13,zmm10,0x2 + vinserti32x4 zmm10,zmm10,xmm13,0x1 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 YMMWORD[64+rsi],ymm2 + add rsi,0x60 + vextracti32x4 xmm8,zmm2,0x1 + vmovdqa xmm0,xmm12 + jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa + +$L$_done_6_remain_EmbgEptodyewbFa: + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 YMMWORD[64+rsi],ymm2 + jmp NEAR $L$_ret_EmbgEptodyewbFa + +$L$_remaining_num_blocks_is_5_EmbgEptodyewbFa: + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu xmm2,XMMWORD[64+rdi] + add rdi,0x50 + and rdx,0xf + je NEAR $L$_done_5_remain_EmbgEptodyewbFa + vmovdqa xmm12,xmm10 + vextracti32x4 xmm10,zmm10,0x1 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu XMMWORD[64+rsi],xmm2 + add rsi,0x50 + vmovdqa xmm8,xmm2 + vmovdqa xmm0,xmm12 + jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa + +$L$_done_5_remain_EmbgEptodyewbFa: + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 XMMWORD[64+rsi],xmm2 + jmp NEAR $L$_ret_EmbgEptodyewbFa + +$L$_remaining_num_blocks_is_4_EmbgEptodyewbFa: + vmovdqu8 zmm1,ZMMWORD[rdi] + add rdi,0x40 + and rdx,0xf + je NEAR $L$_done_4_remain_EmbgEptodyewbFa + vextracti32x4 xmm12,zmm9,0x3 + vinserti32x4 zmm9,zmm9,xmm10,0x3 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + add rsi,0x40 + vextracti32x4 xmm8,zmm1,0x3 + vmovdqa xmm0,xmm12 + jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa + +$L$_done_4_remain_EmbgEptodyewbFa: + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + jmp NEAR $L$_ret_EmbgEptodyewbFa + +$L$_remaining_num_blocks_is_3_EmbgEptodyewbFa: + vmovdqu xmm1,XMMWORD[rdi] + vmovdqu xmm2,XMMWORD[16+rdi] + vmovdqu xmm3,XMMWORD[32+rdi] + add rdi,0x30 + and rdx,0xf + je NEAR $L$_done_3_remain_EmbgEptodyewbFa + vextracti32x4 xmm13,zmm9,0x2 + vextracti32x4 xmm10,zmm9,0x1 + vextracti32x4 xmm11,zmm9,0x3 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + add rsi,0x30 + vmovdqa xmm8,xmm3 + vmovdqa xmm0,xmm13 + jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa + +$L$_done_3_remain_EmbgEptodyewbFa: + vextracti32x4 xmm10,zmm9,0x1 + vextracti32x4 xmm11,zmm9,0x2 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + jmp NEAR $L$_ret_EmbgEptodyewbFa + +$L$_remaining_num_blocks_is_2_EmbgEptodyewbFa: + vmovdqu xmm1,XMMWORD[rdi] + vmovdqu xmm2,XMMWORD[16+rdi] + add rdi,0x20 + and rdx,0xf + je NEAR $L$_done_2_remain_EmbgEptodyewbFa + vextracti32x4 xmm10,zmm9,0x2 + vextracti32x4 xmm12,zmm9,0x1 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + add rsi,0x20 + vmovdqa xmm8,xmm2 + vmovdqa xmm0,xmm12 + jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa + +$L$_done_2_remain_EmbgEptodyewbFa: + vextracti32x4 xmm10,zmm9,0x1 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + jmp NEAR $L$_ret_EmbgEptodyewbFa + +$L$_remaining_num_blocks_is_1_EmbgEptodyewbFa: + vmovdqu xmm1,XMMWORD[rdi] + add rdi,0x10 + and rdx,0xf + je NEAR $L$_done_1_remain_EmbgEptodyewbFa + vextracti32x4 xmm11,zmm9,0x1 + vpxor xmm1,xmm1,xmm11 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vpxor xmm1,xmm1,xmm11 + vmovdqu XMMWORD[rsi],xmm1 + add rsi,0x10 + vmovdqa xmm8,xmm1 + vmovdqa xmm0,xmm9 + jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa + +$L$_done_1_remain_EmbgEptodyewbFa: + vpxor xmm1,xmm1,xmm9 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vpxor xmm1,xmm1,xmm9 + vmovdqu XMMWORD[rsi],xmm1 + jmp NEAR $L$_ret_EmbgEptodyewbFa + +$L$_start_by16_EmbgEptodyewbFa: + vbroadcasti32x4 zmm0,ZMMWORD[rsp] + vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7] + mov r8,0xaa + kmovq k2,r8 + + + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x0 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + + + vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654] + vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234] + vpclmulqdq zmm7,zmm6,zmm25,0x0 + vpxorq zmm5{k2},zmm5,zmm6 + vpxord zmm10,zmm7,zmm5 + + + vpsrldq zmm13,zmm9,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm11,zmm9,0x1 + vpxord zmm11,zmm11,zmm14 + + vpsrldq zmm15,zmm10,0xf + vpclmulqdq zmm16,zmm15,zmm25,0x0 + vpslldq zmm12,zmm10,0x1 + vpxord zmm12,zmm12,zmm16 + +$L$_main_loop_run_16_EmbgEptodyewbFa: + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 zmm2,ZMMWORD[64+rdi] + vmovdqu8 zmm3,ZMMWORD[128+rdi] + vmovdqu8 zmm4,ZMMWORD[192+rdi] + vmovdqu8 xmm5,XMMWORD[240+rdi] + add rdi,0x100 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vpxorq zmm3,zmm3,zmm11 + vpxorq zmm4,zmm4,zmm12 + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vpxorq zmm3,zmm3,zmm0 + vpxorq zmm4,zmm4,zmm0 + vpsrldq zmm13,zmm11,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm15,zmm11,0x1 + vpxord zmm15,zmm15,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vpsrldq zmm13,zmm12,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm16,zmm12,0x1 + vpxord zmm16,zmm16,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vpsrldq zmm13,zmm15,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm17,zmm15,0x1 + vpxord zmm17,zmm17,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vpsrldq zmm13,zmm16,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm18,zmm16,0x1 + vpxord zmm18,zmm18,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vaesdec zmm3,zmm3,zmm0 + vaesdec zmm4,zmm4,zmm0 + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + vaesdeclast zmm3,zmm3,zmm0 + vaesdeclast zmm4,zmm4,zmm0 + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + vpxorq zmm3,zmm3,zmm11 + vpxorq zmm4,zmm4,zmm12 + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqa32 zmm11,zmm17 + vmovdqa32 zmm12,zmm18 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 ZMMWORD[64+rsi],zmm2 + vmovdqu8 ZMMWORD[128+rsi],zmm3 + vmovdqu8 ZMMWORD[192+rsi],zmm4 + add rsi,0x100 + sub rdx,0x100 + cmp rdx,0x100 + jge NEAR $L$_main_loop_run_16_EmbgEptodyewbFa + + cmp rdx,0x80 + jge NEAR $L$_main_loop_run_8_EmbgEptodyewbFa + jmp NEAR $L$_do_n_blocks_EmbgEptodyewbFa + +$L$_start_by8_EmbgEptodyewbFa: + + vbroadcasti32x4 zmm0,ZMMWORD[rsp] + vbroadcasti32x4 zmm8,ZMMWORD[shufb_15_7] + mov r8,0xaa + kmovq k2,r8 + + + vpshufb zmm1,zmm0,zmm8 + vpsllvq zmm4,zmm0,ZMMWORD[const_dq3210] + vpsrlvq zmm2,zmm1,ZMMWORD[const_dq5678] + vpclmulqdq zmm3,zmm2,zmm25,0x0 + vpxorq zmm4{k2},zmm4,zmm2 + vpxord zmm9,zmm3,zmm4 + + + vpsllvq zmm5,zmm0,ZMMWORD[const_dq7654] + vpsrlvq zmm6,zmm1,ZMMWORD[const_dq1234] + vpclmulqdq zmm7,zmm6,zmm25,0x0 + vpxorq zmm5{k2},zmm5,zmm6 + vpxord zmm10,zmm7,zmm5 + +$L$_main_loop_run_8_EmbgEptodyewbFa: + vmovdqu8 zmm1,ZMMWORD[rdi] + vmovdqu8 zmm2,ZMMWORD[64+rdi] + vmovdqu8 xmm5,XMMWORD[112+rdi] + add rdi,0x80 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vbroadcasti32x4 zmm0,ZMMWORD[rcx] + vpxorq zmm1,zmm1,zmm0 + vpxorq zmm2,zmm2,zmm0 + vpsrldq zmm13,zmm9,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm15,zmm9,0x1 + vpxord zmm15,zmm15,zmm14 + vbroadcasti32x4 zmm0,ZMMWORD[16+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[32+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[48+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + vpsrldq zmm13,zmm10,0xf + vpclmulqdq zmm14,zmm13,zmm25,0x0 + vpslldq zmm16,zmm10,0x1 + vpxord zmm16,zmm16,zmm14 + + vbroadcasti32x4 zmm0,ZMMWORD[64+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[80+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[96+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[112+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[128+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[144+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[160+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[176+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[192+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[208+rcx] + vaesdec zmm1,zmm1,zmm0 + vaesdec zmm2,zmm2,zmm0 + + + vbroadcasti32x4 zmm0,ZMMWORD[224+rcx] + vaesdeclast zmm1,zmm1,zmm0 + vaesdeclast zmm2,zmm2,zmm0 + + vpxorq zmm1,zmm1,zmm9 + vpxorq zmm2,zmm2,zmm10 + + + vmovdqa32 zmm9,zmm15 + vmovdqa32 zmm10,zmm16 + vmovdqu8 ZMMWORD[rsi],zmm1 + vmovdqu8 ZMMWORD[64+rsi],zmm2 + add rsi,0x80 + sub rdx,0x80 + cmp rdx,0x80 + jge NEAR $L$_main_loop_run_8_EmbgEptodyewbFa + jmp NEAR $L$_do_n_blocks_EmbgEptodyewbFa + +$L$_steal_cipher_EmbgEptodyewbFa: + + vmovdqa xmm2,xmm8 + + + lea rax,[vpshufb_shf_table] + vmovdqu xmm10,XMMWORD[rdx*1+rax] + vpshufb xmm8,xmm8,xmm10 + + + vmovdqu xmm3,XMMWORD[((-16))+rdx*1+rdi] + vmovdqu XMMWORD[(-16)+rdx*1+rsi],xmm8 + + + lea rax,[vpshufb_shf_table] + add rax,16 + sub rax,rdx + vmovdqu xmm10,XMMWORD[rax] + vpxor xmm10,xmm10,XMMWORD[mask1] + vpshufb xmm3,xmm3,xmm10 + + vpblendvb xmm3,xmm3,xmm2,xmm10 + + + vpxor xmm8,xmm3,xmm0 + + + vpxor xmm8,xmm8,XMMWORD[rcx] + vaesdec xmm8,xmm8,XMMWORD[16+rcx] + vaesdec xmm8,xmm8,XMMWORD[32+rcx] + vaesdec xmm8,xmm8,XMMWORD[48+rcx] + vaesdec xmm8,xmm8,XMMWORD[64+rcx] + vaesdec xmm8,xmm8,XMMWORD[80+rcx] + vaesdec xmm8,xmm8,XMMWORD[96+rcx] + vaesdec xmm8,xmm8,XMMWORD[112+rcx] + vaesdec xmm8,xmm8,XMMWORD[128+rcx] + vaesdec xmm8,xmm8,XMMWORD[144+rcx] + vaesdec xmm8,xmm8,XMMWORD[160+rcx] + vaesdec xmm8,xmm8,XMMWORD[176+rcx] + vaesdec xmm8,xmm8,XMMWORD[192+rcx] + vaesdec xmm8,xmm8,XMMWORD[208+rcx] + vaesdeclast xmm8,xmm8,XMMWORD[224+rcx] + + vpxor xmm8,xmm8,xmm0 + +$L$_done_EmbgEptodyewbFa: + + vmovdqu XMMWORD[(-16)+rsi],xmm8 +$L$_ret_EmbgEptodyewbFa: + mov rbx,QWORD[288+rsp] + xor r8,r8 + mov QWORD[288+rsp],r8 + + vpxorq zmm0,zmm0,zmm0 + mov rdi,QWORD[((288 + 8))+rsp] + mov QWORD[((288 + 8))+rsp],r8 + mov rsi,QWORD[((288 + 16))+rsp] + mov QWORD[((288 + 16))+rsp],r8 + + vmovdqa xmm6,XMMWORD[((128 + 0))+rsp] + vmovdqa xmm7,XMMWORD[((128 + 16))+rsp] + vmovdqa xmm8,XMMWORD[((128 + 32))+rsp] + vmovdqa xmm9,XMMWORD[((128 + 48))+rsp] + + + vmovdqa64 ZMMWORD[128+rsp],zmm0 + + vmovdqa xmm10,XMMWORD[((128 + 64))+rsp] + vmovdqa xmm11,XMMWORD[((128 + 80))+rsp] + vmovdqa xmm12,XMMWORD[((128 + 96))+rsp] + vmovdqa xmm13,XMMWORD[((128 + 112))+rsp] + + + vmovdqa64 ZMMWORD[(128 + 64)+rsp],zmm0 + + vmovdqa xmm14,XMMWORD[((128 + 128))+rsp] + vmovdqa xmm15,XMMWORD[((128 + 144))+rsp] + + + + vmovdqa YMMWORD[(128 + 128)+rsp],ymm0 + mov rsp,rbp + pop rbp + vzeroupper + mov rdi,QWORD[8+rsp] ;WIN64 epilogue + mov rsi,QWORD[16+rsp] + DB 0F3h,0C3h ;repret + +$L$_less_than_128_bytes_EmbgEptodyewbFa: + cmp rdx,0x10 + jb NEAR $L$_ret_EmbgEptodyewbFa + + mov r8,rdx + and r8,0x70 + cmp r8,0x60 + je NEAR $L$_num_blocks_is_6_EmbgEptodyewbFa + cmp r8,0x50 + je NEAR $L$_num_blocks_is_5_EmbgEptodyewbFa + cmp r8,0x40 + je NEAR $L$_num_blocks_is_4_EmbgEptodyewbFa + cmp r8,0x30 + je NEAR $L$_num_blocks_is_3_EmbgEptodyewbFa + cmp r8,0x20 + je NEAR $L$_num_blocks_is_2_EmbgEptodyewbFa + cmp r8,0x10 + je NEAR $L$_num_blocks_is_1_EmbgEptodyewbFa + +$L$_num_blocks_is_7_EmbgEptodyewbFa: + vmovdqa xmm9,XMMWORD[rsp] + mov rax,QWORD[rsp] + mov rbx,QWORD[8+rsp] + vmovdqu xmm1,XMMWORD[rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[((16 + 8))+rsp],rbx + vmovdqa xmm10,XMMWORD[16+rsp] + vmovdqu xmm2,XMMWORD[16+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[32+rsp],rax + mov QWORD[((32 + 8))+rsp],rbx + vmovdqa xmm11,XMMWORD[32+rsp] + vmovdqu xmm3,XMMWORD[32+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[48+rsp],rax + mov QWORD[((48 + 8))+rsp],rbx + vmovdqa xmm12,XMMWORD[48+rsp] + vmovdqu xmm4,XMMWORD[48+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[64+rsp],rax + mov QWORD[((64 + 8))+rsp],rbx + vmovdqa xmm13,XMMWORD[64+rsp] + vmovdqu xmm5,XMMWORD[64+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[80+rsp],rax + mov QWORD[((80 + 8))+rsp],rbx + vmovdqa xmm14,XMMWORD[80+rsp] + vmovdqu xmm6,XMMWORD[80+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[96+rsp],rax + mov QWORD[((96 + 8))+rsp],rbx + vmovdqa xmm15,XMMWORD[96+rsp] + vmovdqu xmm7,XMMWORD[96+rdi] + add rdi,0x70 + and rdx,0xf + je NEAR $L$_done_7_EmbgEptodyewbFa + +$L$_steal_cipher_7_EmbgEptodyewbFa: + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[24+rsp],rbx + vmovdqa64 xmm16,xmm15 + vmovdqa xmm15,XMMWORD[16+rsp] + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vpxor xmm6,xmm6,xmm14 + vpxor xmm7,xmm7,xmm15 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vpxor xmm4,xmm4,xmm0 + vpxor xmm5,xmm5,xmm0 + vpxor xmm6,xmm6,xmm0 + vpxor xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vaesdeclast xmm4,xmm4,xmm0 + vaesdeclast xmm5,xmm5,xmm0 + vaesdeclast xmm6,xmm6,xmm0 + vaesdeclast xmm7,xmm7,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vpxor xmm6,xmm6,xmm14 + vpxor xmm7,xmm7,xmm15 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + vmovdqu XMMWORD[48+rsi],xmm4 + vmovdqu XMMWORD[64+rsi],xmm5 + vmovdqu XMMWORD[80+rsi],xmm6 + add rsi,0x70 + vmovdqa64 xmm0,xmm16 + vmovdqa xmm8,xmm7 + jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa + +$L$_done_7_EmbgEptodyewbFa: + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vpxor xmm6,xmm6,xmm14 + vpxor xmm7,xmm7,xmm15 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vpxor xmm4,xmm4,xmm0 + vpxor xmm5,xmm5,xmm0 + vpxor xmm6,xmm6,xmm0 + vpxor xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vaesdec xmm7,xmm7,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vaesdeclast xmm4,xmm4,xmm0 + vaesdeclast xmm5,xmm5,xmm0 + vaesdeclast xmm6,xmm6,xmm0 + vaesdeclast xmm7,xmm7,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vpxor xmm6,xmm6,xmm14 + vpxor xmm7,xmm7,xmm15 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + vmovdqu XMMWORD[48+rsi],xmm4 + vmovdqu XMMWORD[64+rsi],xmm5 + vmovdqu XMMWORD[80+rsi],xmm6 + add rsi,0x70 + vmovdqa xmm8,xmm7 + jmp NEAR $L$_done_EmbgEptodyewbFa + +$L$_num_blocks_is_6_EmbgEptodyewbFa: + vmovdqa xmm9,XMMWORD[rsp] + mov rax,QWORD[rsp] + mov rbx,QWORD[8+rsp] + vmovdqu xmm1,XMMWORD[rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[((16 + 8))+rsp],rbx + vmovdqa xmm10,XMMWORD[16+rsp] + vmovdqu xmm2,XMMWORD[16+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[32+rsp],rax + mov QWORD[((32 + 8))+rsp],rbx + vmovdqa xmm11,XMMWORD[32+rsp] + vmovdqu xmm3,XMMWORD[32+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[48+rsp],rax + mov QWORD[((48 + 8))+rsp],rbx + vmovdqa xmm12,XMMWORD[48+rsp] + vmovdqu xmm4,XMMWORD[48+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[64+rsp],rax + mov QWORD[((64 + 8))+rsp],rbx + vmovdqa xmm13,XMMWORD[64+rsp] + vmovdqu xmm5,XMMWORD[64+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[80+rsp],rax + mov QWORD[((80 + 8))+rsp],rbx + vmovdqa xmm14,XMMWORD[80+rsp] + vmovdqu xmm6,XMMWORD[80+rdi] + add rdi,0x60 + and rdx,0xf + je NEAR $L$_done_6_EmbgEptodyewbFa + +$L$_steal_cipher_6_EmbgEptodyewbFa: + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[24+rsp],rbx + vmovdqa64 xmm15,xmm14 + vmovdqa xmm14,XMMWORD[16+rsp] + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vpxor xmm6,xmm6,xmm14 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vpxor xmm4,xmm4,xmm0 + vpxor xmm5,xmm5,xmm0 + vpxor xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vaesdeclast xmm4,xmm4,xmm0 + vaesdeclast xmm5,xmm5,xmm0 + vaesdeclast xmm6,xmm6,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vpxor xmm6,xmm6,xmm14 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + vmovdqu XMMWORD[48+rsi],xmm4 + vmovdqu XMMWORD[64+rsi],xmm5 + add rsi,0x60 + vmovdqa xmm0,xmm15 + vmovdqa xmm8,xmm6 + jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa + +$L$_done_6_EmbgEptodyewbFa: + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vpxor xmm6,xmm6,xmm14 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vpxor xmm4,xmm4,xmm0 + vpxor xmm5,xmm5,xmm0 + vpxor xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vaesdec xmm6,xmm6,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vaesdeclast xmm4,xmm4,xmm0 + vaesdeclast xmm5,xmm5,xmm0 + vaesdeclast xmm6,xmm6,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vpxor xmm6,xmm6,xmm14 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + vmovdqu XMMWORD[48+rsi],xmm4 + vmovdqu XMMWORD[64+rsi],xmm5 + add rsi,0x60 + vmovdqa xmm8,xmm6 + jmp NEAR $L$_done_EmbgEptodyewbFa + +$L$_num_blocks_is_5_EmbgEptodyewbFa: + vmovdqa xmm9,XMMWORD[rsp] + mov rax,QWORD[rsp] + mov rbx,QWORD[8+rsp] + vmovdqu xmm1,XMMWORD[rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[((16 + 8))+rsp],rbx + vmovdqa xmm10,XMMWORD[16+rsp] + vmovdqu xmm2,XMMWORD[16+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[32+rsp],rax + mov QWORD[((32 + 8))+rsp],rbx + vmovdqa xmm11,XMMWORD[32+rsp] + vmovdqu xmm3,XMMWORD[32+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[48+rsp],rax + mov QWORD[((48 + 8))+rsp],rbx + vmovdqa xmm12,XMMWORD[48+rsp] + vmovdqu xmm4,XMMWORD[48+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[64+rsp],rax + mov QWORD[((64 + 8))+rsp],rbx + vmovdqa xmm13,XMMWORD[64+rsp] + vmovdqu xmm5,XMMWORD[64+rdi] + add rdi,0x50 + and rdx,0xf + je NEAR $L$_done_5_EmbgEptodyewbFa + +$L$_steal_cipher_5_EmbgEptodyewbFa: + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[24+rsp],rbx + vmovdqa64 xmm14,xmm13 + vmovdqa xmm13,XMMWORD[16+rsp] + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vpxor xmm4,xmm4,xmm0 + vpxor xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vaesdeclast xmm4,xmm4,xmm0 + vaesdeclast xmm5,xmm5,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + vmovdqu XMMWORD[48+rsi],xmm4 + add rsi,0x50 + vmovdqa xmm0,xmm14 + vmovdqa xmm8,xmm5 + jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa + +$L$_done_5_EmbgEptodyewbFa: + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vpxor xmm4,xmm4,xmm0 + vpxor xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vaesdec xmm5,xmm5,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vaesdeclast xmm4,xmm4,xmm0 + vaesdeclast xmm5,xmm5,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vpxor xmm5,xmm5,xmm13 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + vmovdqu XMMWORD[48+rsi],xmm4 + add rsi,0x50 + vmovdqa xmm8,xmm5 + jmp NEAR $L$_done_EmbgEptodyewbFa + +$L$_num_blocks_is_4_EmbgEptodyewbFa: + vmovdqa xmm9,XMMWORD[rsp] + mov rax,QWORD[rsp] + mov rbx,QWORD[8+rsp] + vmovdqu xmm1,XMMWORD[rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[((16 + 8))+rsp],rbx + vmovdqa xmm10,XMMWORD[16+rsp] + vmovdqu xmm2,XMMWORD[16+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[32+rsp],rax + mov QWORD[((32 + 8))+rsp],rbx + vmovdqa xmm11,XMMWORD[32+rsp] + vmovdqu xmm3,XMMWORD[32+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[48+rsp],rax + mov QWORD[((48 + 8))+rsp],rbx + vmovdqa xmm12,XMMWORD[48+rsp] + vmovdqu xmm4,XMMWORD[48+rdi] + add rdi,0x40 + and rdx,0xf + je NEAR $L$_done_4_EmbgEptodyewbFa + +$L$_steal_cipher_4_EmbgEptodyewbFa: + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[24+rsp],rbx + vmovdqa64 xmm13,xmm12 + vmovdqa xmm12,XMMWORD[16+rsp] + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vpxor xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vaesdeclast xmm4,xmm4,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + add rsi,0x40 + vmovdqa xmm0,xmm13 + vmovdqa xmm8,xmm4 + jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa + +$L$_done_4_EmbgEptodyewbFa: + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vpxor xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vaesdec xmm4,xmm4,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vaesdeclast xmm4,xmm4,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vpxor xmm4,xmm4,xmm12 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + vmovdqu XMMWORD[32+rsi],xmm3 + add rsi,0x40 + vmovdqa xmm8,xmm4 + jmp NEAR $L$_done_EmbgEptodyewbFa + +$L$_num_blocks_is_3_EmbgEptodyewbFa: + vmovdqa xmm9,XMMWORD[rsp] + mov rax,QWORD[rsp] + mov rbx,QWORD[8+rsp] + vmovdqu xmm1,XMMWORD[rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[((16 + 8))+rsp],rbx + vmovdqa xmm10,XMMWORD[16+rsp] + vmovdqu xmm2,XMMWORD[16+rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[32+rsp],rax + mov QWORD[((32 + 8))+rsp],rbx + vmovdqa xmm11,XMMWORD[32+rsp] + vmovdqu xmm3,XMMWORD[32+rdi] + add rdi,0x30 + and rdx,0xf + je NEAR $L$_done_3_EmbgEptodyewbFa + +$L$_steal_cipher_3_EmbgEptodyewbFa: + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[24+rsp],rbx + vmovdqa64 xmm12,xmm11 + vmovdqa xmm11,XMMWORD[16+rsp] + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + add rsi,0x30 + vmovdqa xmm0,xmm12 + vmovdqa xmm8,xmm3 + jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa + +$L$_done_3_EmbgEptodyewbFa: + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vpxor xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vaesdec xmm3,xmm3,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vaesdeclast xmm3,xmm3,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vpxor xmm3,xmm3,xmm11 + vmovdqu XMMWORD[rsi],xmm1 + vmovdqu XMMWORD[16+rsi],xmm2 + add rsi,0x30 + vmovdqa xmm8,xmm3 + jmp NEAR $L$_done_EmbgEptodyewbFa + +$L$_num_blocks_is_2_EmbgEptodyewbFa: + vmovdqa xmm9,XMMWORD[rsp] + mov rax,QWORD[rsp] + mov rbx,QWORD[8+rsp] + vmovdqu xmm1,XMMWORD[rdi] + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[((16 + 8))+rsp],rbx + vmovdqa xmm10,XMMWORD[16+rsp] + vmovdqu xmm2,XMMWORD[16+rdi] + add rdi,0x20 + and rdx,0xf + je NEAR $L$_done_2_EmbgEptodyewbFa + +$L$_steal_cipher_2_EmbgEptodyewbFa: + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[24+rsp],rbx + vmovdqa64 xmm11,xmm10 + vmovdqa xmm10,XMMWORD[16+rsp] + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vmovdqu XMMWORD[rsi],xmm1 + add rsi,0x20 + vmovdqa xmm0,xmm11 + vmovdqa xmm8,xmm2 + jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa + +$L$_done_2_EmbgEptodyewbFa: + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vpxor xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vaesdec xmm2,xmm2,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vaesdeclast xmm2,xmm2,xmm0 + vpxor xmm1,xmm1,xmm9 + vpxor xmm2,xmm2,xmm10 + vmovdqu XMMWORD[rsi],xmm1 + add rsi,0x20 + vmovdqa xmm8,xmm2 + jmp NEAR $L$_done_EmbgEptodyewbFa + +$L$_num_blocks_is_1_EmbgEptodyewbFa: + vmovdqa xmm9,XMMWORD[rsp] + mov rax,QWORD[rsp] + mov rbx,QWORD[8+rsp] + vmovdqu xmm1,XMMWORD[rdi] + add rdi,0x10 + and rdx,0xf + je NEAR $L$_done_1_EmbgEptodyewbFa + +$L$_steal_cipher_1_EmbgEptodyewbFa: + xor r11,r11 + shl rax,1 + adc rbx,rbx + cmovc r11,r10 + xor rax,r11 + mov QWORD[16+rsp],rax + mov QWORD[24+rsp],rbx + vmovdqa64 xmm10,xmm9 + vmovdqa xmm9,XMMWORD[16+rsp] + vpxor xmm1,xmm1,xmm9 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vpxor xmm1,xmm1,xmm9 + add rsi,0x10 + vmovdqa xmm0,xmm10 + vmovdqa xmm8,xmm1 + jmp NEAR $L$_steal_cipher_EmbgEptodyewbFa + +$L$_done_1_EmbgEptodyewbFa: + vpxor xmm1,xmm1,xmm9 + vmovdqu xmm0,XMMWORD[rcx] + vpxor xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[16+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[32+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[48+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[64+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[80+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[96+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[112+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[128+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[144+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[160+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[176+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[192+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[208+rcx] + vaesdec xmm1,xmm1,xmm0 + vmovdqu xmm0,XMMWORD[224+rcx] + vaesdeclast xmm1,xmm1,xmm0 + vpxor xmm1,xmm1,xmm9 + add rsi,0x10 + vmovdqa xmm8,xmm1 + jmp NEAR $L$_done_EmbgEptodyewbFa + +section .rdata rdata align=8 +ALIGN 16 + +vpshufb_shf_table: + DQ 0x8786858483828100,0x8f8e8d8c8b8a8988 + DQ 0x0706050403020100,0x000e0d0c0b0a0908 + +mask1: + DQ 0x8080808080808080,0x8080808080808080 + +const_dq3210: + DQ 0,0,1,1,2,2,3,3 +const_dq5678: + DQ 8,8,7,7,6,6,5,5 +const_dq7654: + DQ 4,4,5,5,6,6,7,7 +const_dq1234: + DQ 4,4,3,3,2,2,1,1 + +shufb_15_7: +DB 15,0xff,0xff,0xff,0xff,0xff,0xff,0xff,7,0xff,0xff +DB 0xff,0xff,0xff,0xff,0xff + +section .text code align=64 + diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-2k-avxifma.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-2k-avxifma.nasm new file mode 100644 index 000000000000..47930a955ef0 --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-2k-avxifma.nasm @@ -0,0 +1,1276 @@ +default rel +%define XMMWORD +%define YMMWORD +%define ZMMWORD +section .text code align=64 + +EXTERN OPENSSL_ia32cap_P +global ossl_rsaz_avxifma_eligible + +ALIGN 32 +ossl_rsaz_avxifma_eligible: + mov ecx,DWORD[((OPENSSL_ia32cap_P+20))] + xor eax,eax + and ecx,8388608 + cmp ecx,8388608 + cmove eax,ecx + DB 0F3h,0C3h ;repret + +section .text code align=64 + + +global ossl_rsaz_amm52x20_x1_avxifma256 + +ALIGN 32 +ossl_rsaz_amm52x20_x1_avxifma256: + mov QWORD[8+rsp],rdi ;WIN64 prologue + mov QWORD[16+rsp],rsi + mov rax,rsp +$L$SEH_begin_ossl_rsaz_amm52x20_x1_avxifma256: + mov rdi,rcx + mov rsi,rdx + mov rdx,r8 + mov rcx,r9 + mov r8,QWORD[40+rsp] + + + +DB 243,15,30,250 + push rbx + + push rbp + + push r12 + + push r13 + + push r14 + + push r15 + +$L$ossl_rsaz_amm52x20_x1_avxifma256_body: + + + vpxor ymm0,ymm0,ymm0 + vmovapd ymm3,ymm0 + vmovapd ymm5,ymm0 + vmovapd ymm6,ymm0 + vmovapd ymm7,ymm0 + vmovapd ymm8,ymm0 + + xor r9d,r9d + + mov r11,rdx + mov rax,0xfffffffffffff + + + mov ebx,5 + +ALIGN 32 +$L$loop5: + mov r13,QWORD[r11] + + vpbroadcastq ymm1,QWORD[r11] + mov rdx,QWORD[rsi] + mulx r12,r13,r13 + add r9,r13 + mov r10,r12 + adc r10,0 + + mov r13,r8 + imul r13,r9 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[rcx] + mulx r12,r13,r13 + add r9,r13 + adc r10,r12 + + shr r9,52 + sal r10,12 + or r9,r10 + + lea rsp,[((-168))+rsp] +{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52luq ymm5,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52luq ymm6,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52luq ymm7,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52luq ymm8,ymm1,YMMWORD[128+rsi] + +{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52luq ymm5,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52luq ymm6,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52luq ymm7,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52luq ymm8,ymm2,YMMWORD[128+rcx] + + + vmovdqu YMMWORD[rsp],ymm3 + vmovdqu YMMWORD[32+rsp],ymm5 + vmovdqu YMMWORD[64+rsp],ymm6 + vmovdqu YMMWORD[96+rsp],ymm7 + vmovdqu YMMWORD[128+rsp],ymm8 + mov QWORD[160+rsp],0 + + vmovdqu ymm3,YMMWORD[8+rsp] + vmovdqu ymm5,YMMWORD[40+rsp] + vmovdqu ymm6,YMMWORD[72+rsp] + vmovdqu ymm7,YMMWORD[104+rsp] + vmovdqu ymm8,YMMWORD[136+rsp] + + add r9,QWORD[8+rsp] + +{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52huq ymm5,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52huq ymm6,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52huq ymm7,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52huq ymm8,ymm1,YMMWORD[128+rsi] + +{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52huq ymm5,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52huq ymm6,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52huq ymm7,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52huq ymm8,ymm2,YMMWORD[128+rcx] + lea rsp,[168+rsp] + mov r13,QWORD[8+r11] + + vpbroadcastq ymm1,QWORD[8+r11] + mov rdx,QWORD[rsi] + mulx r12,r13,r13 + add r9,r13 + mov r10,r12 + adc r10,0 + + mov r13,r8 + imul r13,r9 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[rcx] + mulx r12,r13,r13 + add r9,r13 + adc r10,r12 + + shr r9,52 + sal r10,12 + or r9,r10 + + lea rsp,[((-168))+rsp] +{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52luq ymm5,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52luq ymm6,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52luq ymm7,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52luq ymm8,ymm1,YMMWORD[128+rsi] + +{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52luq ymm5,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52luq ymm6,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52luq ymm7,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52luq ymm8,ymm2,YMMWORD[128+rcx] + + + vmovdqu YMMWORD[rsp],ymm3 + vmovdqu YMMWORD[32+rsp],ymm5 + vmovdqu YMMWORD[64+rsp],ymm6 + vmovdqu YMMWORD[96+rsp],ymm7 + vmovdqu YMMWORD[128+rsp],ymm8 + mov QWORD[160+rsp],0 + + vmovdqu ymm3,YMMWORD[8+rsp] + vmovdqu ymm5,YMMWORD[40+rsp] + vmovdqu ymm6,YMMWORD[72+rsp] + vmovdqu ymm7,YMMWORD[104+rsp] + vmovdqu ymm8,YMMWORD[136+rsp] + + add r9,QWORD[8+rsp] + +{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52huq ymm5,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52huq ymm6,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52huq ymm7,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52huq ymm8,ymm1,YMMWORD[128+rsi] + +{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52huq ymm5,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52huq ymm6,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52huq ymm7,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52huq ymm8,ymm2,YMMWORD[128+rcx] + lea rsp,[168+rsp] + mov r13,QWORD[16+r11] + + vpbroadcastq ymm1,QWORD[16+r11] + mov rdx,QWORD[rsi] + mulx r12,r13,r13 + add r9,r13 + mov r10,r12 + adc r10,0 + + mov r13,r8 + imul r13,r9 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[rcx] + mulx r12,r13,r13 + add r9,r13 + adc r10,r12 + + shr r9,52 + sal r10,12 + or r9,r10 + + lea rsp,[((-168))+rsp] +{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52luq ymm5,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52luq ymm6,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52luq ymm7,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52luq ymm8,ymm1,YMMWORD[128+rsi] + +{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52luq ymm5,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52luq ymm6,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52luq ymm7,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52luq ymm8,ymm2,YMMWORD[128+rcx] + + + vmovdqu YMMWORD[rsp],ymm3 + vmovdqu YMMWORD[32+rsp],ymm5 + vmovdqu YMMWORD[64+rsp],ymm6 + vmovdqu YMMWORD[96+rsp],ymm7 + vmovdqu YMMWORD[128+rsp],ymm8 + mov QWORD[160+rsp],0 + + vmovdqu ymm3,YMMWORD[8+rsp] + vmovdqu ymm5,YMMWORD[40+rsp] + vmovdqu ymm6,YMMWORD[72+rsp] + vmovdqu ymm7,YMMWORD[104+rsp] + vmovdqu ymm8,YMMWORD[136+rsp] + + add r9,QWORD[8+rsp] + +{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52huq ymm5,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52huq ymm6,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52huq ymm7,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52huq ymm8,ymm1,YMMWORD[128+rsi] + +{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52huq ymm5,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52huq ymm6,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52huq ymm7,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52huq ymm8,ymm2,YMMWORD[128+rcx] + lea rsp,[168+rsp] + mov r13,QWORD[24+r11] + + vpbroadcastq ymm1,QWORD[24+r11] + mov rdx,QWORD[rsi] + mulx r12,r13,r13 + add r9,r13 + mov r10,r12 + adc r10,0 + + mov r13,r8 + imul r13,r9 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[rcx] + mulx r12,r13,r13 + add r9,r13 + adc r10,r12 + + shr r9,52 + sal r10,12 + or r9,r10 + + lea rsp,[((-168))+rsp] +{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52luq ymm5,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52luq ymm6,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52luq ymm7,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52luq ymm8,ymm1,YMMWORD[128+rsi] + +{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52luq ymm5,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52luq ymm6,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52luq ymm7,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52luq ymm8,ymm2,YMMWORD[128+rcx] + + + vmovdqu YMMWORD[rsp],ymm3 + vmovdqu YMMWORD[32+rsp],ymm5 + vmovdqu YMMWORD[64+rsp],ymm6 + vmovdqu YMMWORD[96+rsp],ymm7 + vmovdqu YMMWORD[128+rsp],ymm8 + mov QWORD[160+rsp],0 + + vmovdqu ymm3,YMMWORD[8+rsp] + vmovdqu ymm5,YMMWORD[40+rsp] + vmovdqu ymm6,YMMWORD[72+rsp] + vmovdqu ymm7,YMMWORD[104+rsp] + vmovdqu ymm8,YMMWORD[136+rsp] + + add r9,QWORD[8+rsp] + +{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52huq ymm5,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52huq ymm6,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52huq ymm7,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52huq ymm8,ymm1,YMMWORD[128+rsi] + +{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52huq ymm5,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52huq ymm6,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52huq ymm7,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52huq ymm8,ymm2,YMMWORD[128+rcx] + lea rsp,[168+rsp] + lea r11,[32+r11] + dec ebx + jne NEAR $L$loop5 + + vmovq xmm0,r9 + vpbroadcastq ymm0,xmm0 + vpblendd ymm3,ymm3,ymm0,3 + + + + vpsrlq ymm0,ymm3,52 + vpsrlq ymm1,ymm5,52 + vpsrlq ymm2,ymm6,52 + vpsrlq ymm13,ymm7,52 + vpsrlq ymm14,ymm8,52 + + + vpermq ymm14,ymm14,144 + vpermq ymm15,ymm13,3 + vblendpd ymm14,ymm14,ymm15,1 + + vpermq ymm13,ymm13,144 + vpermq ymm15,ymm2,3 + vblendpd ymm13,ymm13,ymm15,1 + + vpermq ymm2,ymm2,144 + vpermq ymm15,ymm1,3 + vblendpd ymm2,ymm2,ymm15,1 + + vpermq ymm1,ymm1,144 + vpermq ymm15,ymm0,3 + vblendpd ymm1,ymm1,ymm15,1 + + vpermq ymm0,ymm0,144 + vpand ymm0,ymm0,YMMWORD[$L$high64x3] + + + vpand ymm3,ymm3,YMMWORD[$L$mask52x4] + vpand ymm5,ymm5,YMMWORD[$L$mask52x4] + vpand ymm6,ymm6,YMMWORD[$L$mask52x4] + vpand ymm7,ymm7,YMMWORD[$L$mask52x4] + vpand ymm8,ymm8,YMMWORD[$L$mask52x4] + + + vpaddq ymm3,ymm3,ymm0 + vpaddq ymm5,ymm5,ymm1 + vpaddq ymm6,ymm6,ymm2 + vpaddq ymm7,ymm7,ymm13 + vpaddq ymm8,ymm8,ymm14 + + + + vpcmpgtq ymm0,ymm3,YMMWORD[$L$mask52x4] + vpcmpgtq ymm1,ymm5,YMMWORD[$L$mask52x4] + vpcmpgtq ymm2,ymm6,YMMWORD[$L$mask52x4] + vpcmpgtq ymm13,ymm7,YMMWORD[$L$mask52x4] + vpcmpgtq ymm14,ymm8,YMMWORD[$L$mask52x4] + vmovmskpd r14d,ymm0 + vmovmskpd r13d,ymm1 + vmovmskpd r12d,ymm2 + vmovmskpd r11d,ymm13 + vmovmskpd r10d,ymm14 + + + vpcmpeqq ymm0,ymm3,YMMWORD[$L$mask52x4] + vpcmpeqq ymm1,ymm5,YMMWORD[$L$mask52x4] + vpcmpeqq ymm2,ymm6,YMMWORD[$L$mask52x4] + vpcmpeqq ymm13,ymm7,YMMWORD[$L$mask52x4] + vpcmpeqq ymm14,ymm8,YMMWORD[$L$mask52x4] + vmovmskpd r9d,ymm0 + vmovmskpd r8d,ymm1 + vmovmskpd ebx,ymm2 + vmovmskpd ecx,ymm13 + vmovmskpd edx,ymm14 + + + + shl r13b,4 + or r14b,r13b + shl r11b,4 + or r12b,r11b + + add r14b,r14b + adc r12b,r12b + adc r10b,r10b + + shl r8b,4 + or r9b,r8b + shl cl,4 + or bl,cl + + add r14b,r9b + adc r12b,bl + adc r10b,dl + + xor r14b,r9b + xor r12b,bl + xor r10b,dl + + lea rdx,[$L$kmasklut] + + mov r13b,r14b + and r14,0xf + vpsubq ymm0,ymm3,YMMWORD[$L$mask52x4] + shl r14,5 + vmovapd ymm2,YMMWORD[r14*1+rdx] + vblendvpd ymm3,ymm3,ymm0,ymm2 + + shr r13b,4 + and r13,0xf + vpsubq ymm0,ymm5,YMMWORD[$L$mask52x4] + shl r13,5 + vmovapd ymm2,YMMWORD[r13*1+rdx] + vblendvpd ymm5,ymm5,ymm0,ymm2 + + mov r11b,r12b + and r12,0xf + vpsubq ymm0,ymm6,YMMWORD[$L$mask52x4] + shl r12,5 + vmovapd ymm2,YMMWORD[r12*1+rdx] + vblendvpd ymm6,ymm6,ymm0,ymm2 + + shr r11b,4 + and r11,0xf + vpsubq ymm0,ymm7,YMMWORD[$L$mask52x4] + shl r11,5 + vmovapd ymm2,YMMWORD[r11*1+rdx] + vblendvpd ymm7,ymm7,ymm0,ymm2 + + and r10,0xf + vpsubq ymm0,ymm8,YMMWORD[$L$mask52x4] + shl r10,5 + vmovapd ymm2,YMMWORD[r10*1+rdx] + vblendvpd ymm8,ymm8,ymm0,ymm2 + + + vpand ymm3,ymm3,YMMWORD[$L$mask52x4] + vpand ymm5,ymm5,YMMWORD[$L$mask52x4] + vpand ymm6,ymm6,YMMWORD[$L$mask52x4] + vpand ymm7,ymm7,YMMWORD[$L$mask52x4] + vpand ymm8,ymm8,YMMWORD[$L$mask52x4] + + vmovdqu YMMWORD[rdi],ymm3 + vmovdqu YMMWORD[32+rdi],ymm5 + vmovdqu YMMWORD[64+rdi],ymm6 + vmovdqu YMMWORD[96+rdi],ymm7 + vmovdqu YMMWORD[128+rdi],ymm8 + + vzeroupper + mov r15,QWORD[rsp] + + mov r14,QWORD[8+rsp] + + mov r13,QWORD[16+rsp] + + mov r12,QWORD[24+rsp] + + mov rbp,QWORD[32+rsp] + + mov rbx,QWORD[40+rsp] + + lea rsp,[48+rsp] + +$L$ossl_rsaz_amm52x20_x1_avxifma256_epilogue: + mov rdi,QWORD[8+rsp] ;WIN64 epilogue + mov rsi,QWORD[16+rsp] + DB 0F3h,0C3h ;repret + +$L$SEH_end_ossl_rsaz_amm52x20_x1_avxifma256: +section .rdata rdata align=32 +ALIGN 32 +$L$mask52x4: + DQ 0xfffffffffffff + DQ 0xfffffffffffff + DQ 0xfffffffffffff + DQ 0xfffffffffffff +$L$high64x3: + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff +$L$kmasklut: + + DQ 0x0 + DQ 0x0 + DQ 0x0 + DQ 0x0 + + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0x0 + DQ 0x0 + + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0x0 + + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0x0 + + DQ 0x0 + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0x0 + + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0x0 + + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0x0 + + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0x0 + + DQ 0x0 + DQ 0x0 + DQ 0x0 + DQ 0xffffffffffffffff + + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0x0 + DQ 0xffffffffffffffff + + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0xffffffffffffffff + + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0xffffffffffffffff + + DQ 0x0 + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff +section .text code align=64 + + +global ossl_rsaz_amm52x20_x2_avxifma256 + +ALIGN 32 +ossl_rsaz_amm52x20_x2_avxifma256: + mov QWORD[8+rsp],rdi ;WIN64 prologue + mov QWORD[16+rsp],rsi + mov rax,rsp +$L$SEH_begin_ossl_rsaz_amm52x20_x2_avxifma256: + mov rdi,rcx + mov rsi,rdx + mov rdx,r8 + mov rcx,r9 + mov r8,QWORD[40+rsp] + + + +DB 243,15,30,250 + push rbx + + push rbp + + push r12 + + push r13 + + push r14 + + push r15 + +$L$ossl_rsaz_amm52x20_x2_avxifma256_body: + + + vpxor ymm0,ymm0,ymm0 + vmovapd ymm3,ymm0 + vmovapd ymm5,ymm0 + vmovapd ymm6,ymm0 + vmovapd ymm7,ymm0 + vmovapd ymm8,ymm0 + vmovapd ymm4,ymm0 + vmovapd ymm9,ymm0 + vmovapd ymm10,ymm0 + vmovapd ymm11,ymm0 + vmovapd ymm12,ymm0 + + xor r9d,r9d + xor r15d,r15d + + mov r11,rdx + mov rax,0xfffffffffffff + + mov ebx,20 + +ALIGN 32 +$L$loop20: + mov r13,QWORD[r11] + + vpbroadcastq ymm1,QWORD[r11] + mov rdx,QWORD[rsi] + mulx r12,r13,r13 + add r9,r13 + mov r10,r12 + adc r10,0 + + mov r13,QWORD[r8] + imul r13,r9 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[rcx] + mulx r12,r13,r13 + add r9,r13 + adc r10,r12 + + shr r9,52 + sal r10,12 + or r9,r10 + + lea rsp,[((-168))+rsp] +{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52luq ymm5,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52luq ymm6,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52luq ymm7,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52luq ymm8,ymm1,YMMWORD[128+rsi] + +{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52luq ymm5,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52luq ymm6,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52luq ymm7,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52luq ymm8,ymm2,YMMWORD[128+rcx] + + + vmovdqu YMMWORD[rsp],ymm3 + vmovdqu YMMWORD[32+rsp],ymm5 + vmovdqu YMMWORD[64+rsp],ymm6 + vmovdqu YMMWORD[96+rsp],ymm7 + vmovdqu YMMWORD[128+rsp],ymm8 + mov QWORD[160+rsp],0 + + vmovdqu ymm3,YMMWORD[8+rsp] + vmovdqu ymm5,YMMWORD[40+rsp] + vmovdqu ymm6,YMMWORD[72+rsp] + vmovdqu ymm7,YMMWORD[104+rsp] + vmovdqu ymm8,YMMWORD[136+rsp] + + add r9,QWORD[8+rsp] + +{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52huq ymm5,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52huq ymm6,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52huq ymm7,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52huq ymm8,ymm1,YMMWORD[128+rsi] + +{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52huq ymm5,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52huq ymm6,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52huq ymm7,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52huq ymm8,ymm2,YMMWORD[128+rcx] + lea rsp,[168+rsp] + mov r13,QWORD[160+r11] + + vpbroadcastq ymm1,QWORD[160+r11] + mov rdx,QWORD[160+rsi] + mulx r12,r13,r13 + add r15,r13 + mov r10,r12 + adc r10,0 + + mov r13,QWORD[8+r8] + imul r13,r15 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[160+rcx] + mulx r12,r13,r13 + add r15,r13 + adc r10,r12 + + shr r15,52 + sal r10,12 + or r15,r10 + + lea rsp,[((-168))+rsp] +{vex} vpmadd52luq ymm4,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi] +{vex} vpmadd52luq ymm11,ymm1,YMMWORD[256+rsi] +{vex} vpmadd52luq ymm12,ymm1,YMMWORD[288+rsi] + +{vex} vpmadd52luq ymm4,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx] +{vex} vpmadd52luq ymm11,ymm2,YMMWORD[256+rcx] +{vex} vpmadd52luq ymm12,ymm2,YMMWORD[288+rcx] + + + vmovdqu YMMWORD[rsp],ymm4 + vmovdqu YMMWORD[32+rsp],ymm9 + vmovdqu YMMWORD[64+rsp],ymm10 + vmovdqu YMMWORD[96+rsp],ymm11 + vmovdqu YMMWORD[128+rsp],ymm12 + mov QWORD[160+rsp],0 + + vmovdqu ymm4,YMMWORD[8+rsp] + vmovdqu ymm9,YMMWORD[40+rsp] + vmovdqu ymm10,YMMWORD[72+rsp] + vmovdqu ymm11,YMMWORD[104+rsp] + vmovdqu ymm12,YMMWORD[136+rsp] + + add r15,QWORD[8+rsp] + +{vex} vpmadd52huq ymm4,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi] +{vex} vpmadd52huq ymm11,ymm1,YMMWORD[256+rsi] +{vex} vpmadd52huq ymm12,ymm1,YMMWORD[288+rsi] + +{vex} vpmadd52huq ymm4,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx] +{vex} vpmadd52huq ymm11,ymm2,YMMWORD[256+rcx] +{vex} vpmadd52huq ymm12,ymm2,YMMWORD[288+rcx] + lea rsp,[168+rsp] + lea r11,[8+r11] + dec ebx + jne NEAR $L$loop20 + + vmovq xmm0,r9 + vpbroadcastq ymm0,xmm0 + vpblendd ymm3,ymm3,ymm0,3 + + + + vpsrlq ymm0,ymm3,52 + vpsrlq ymm1,ymm5,52 + vpsrlq ymm2,ymm6,52 + vpsrlq ymm13,ymm7,52 + vpsrlq ymm14,ymm8,52 + + + vpermq ymm14,ymm14,144 + vpermq ymm15,ymm13,3 + vblendpd ymm14,ymm14,ymm15,1 + + vpermq ymm13,ymm13,144 + vpermq ymm15,ymm2,3 + vblendpd ymm13,ymm13,ymm15,1 + + vpermq ymm2,ymm2,144 + vpermq ymm15,ymm1,3 + vblendpd ymm2,ymm2,ymm15,1 + + vpermq ymm1,ymm1,144 + vpermq ymm15,ymm0,3 + vblendpd ymm1,ymm1,ymm15,1 + + vpermq ymm0,ymm0,144 + vpand ymm0,ymm0,YMMWORD[$L$high64x3] + + + vpand ymm3,ymm3,YMMWORD[$L$mask52x4] + vpand ymm5,ymm5,YMMWORD[$L$mask52x4] + vpand ymm6,ymm6,YMMWORD[$L$mask52x4] + vpand ymm7,ymm7,YMMWORD[$L$mask52x4] + vpand ymm8,ymm8,YMMWORD[$L$mask52x4] + + + vpaddq ymm3,ymm3,ymm0 + vpaddq ymm5,ymm5,ymm1 + vpaddq ymm6,ymm6,ymm2 + vpaddq ymm7,ymm7,ymm13 + vpaddq ymm8,ymm8,ymm14 + + + + vpcmpgtq ymm0,ymm3,YMMWORD[$L$mask52x4] + vpcmpgtq ymm1,ymm5,YMMWORD[$L$mask52x4] + vpcmpgtq ymm2,ymm6,YMMWORD[$L$mask52x4] + vpcmpgtq ymm13,ymm7,YMMWORD[$L$mask52x4] + vpcmpgtq ymm14,ymm8,YMMWORD[$L$mask52x4] + vmovmskpd r14d,ymm0 + vmovmskpd r13d,ymm1 + vmovmskpd r12d,ymm2 + vmovmskpd r11d,ymm13 + vmovmskpd r10d,ymm14 + + + vpcmpeqq ymm0,ymm3,YMMWORD[$L$mask52x4] + vpcmpeqq ymm1,ymm5,YMMWORD[$L$mask52x4] + vpcmpeqq ymm2,ymm6,YMMWORD[$L$mask52x4] + vpcmpeqq ymm13,ymm7,YMMWORD[$L$mask52x4] + vpcmpeqq ymm14,ymm8,YMMWORD[$L$mask52x4] + vmovmskpd r9d,ymm0 + vmovmskpd r8d,ymm1 + vmovmskpd ebx,ymm2 + vmovmskpd ecx,ymm13 + vmovmskpd edx,ymm14 + + + + shl r13b,4 + or r14b,r13b + shl r11b,4 + or r12b,r11b + + add r14b,r14b + adc r12b,r12b + adc r10b,r10b + + shl r8b,4 + or r9b,r8b + shl cl,4 + or bl,cl + + add r14b,r9b + adc r12b,bl + adc r10b,dl + + xor r14b,r9b + xor r12b,bl + xor r10b,dl + + lea rdx,[$L$kmasklut] + + mov r13b,r14b + and r14,0xf + vpsubq ymm0,ymm3,YMMWORD[$L$mask52x4] + shl r14,5 + vmovapd ymm2,YMMWORD[r14*1+rdx] + vblendvpd ymm3,ymm3,ymm0,ymm2 + + shr r13b,4 + and r13,0xf + vpsubq ymm0,ymm5,YMMWORD[$L$mask52x4] + shl r13,5 + vmovapd ymm2,YMMWORD[r13*1+rdx] + vblendvpd ymm5,ymm5,ymm0,ymm2 + + mov r11b,r12b + and r12,0xf + vpsubq ymm0,ymm6,YMMWORD[$L$mask52x4] + shl r12,5 + vmovapd ymm2,YMMWORD[r12*1+rdx] + vblendvpd ymm6,ymm6,ymm0,ymm2 + + shr r11b,4 + and r11,0xf + vpsubq ymm0,ymm7,YMMWORD[$L$mask52x4] + shl r11,5 + vmovapd ymm2,YMMWORD[r11*1+rdx] + vblendvpd ymm7,ymm7,ymm0,ymm2 + + and r10,0xf + vpsubq ymm0,ymm8,YMMWORD[$L$mask52x4] + shl r10,5 + vmovapd ymm2,YMMWORD[r10*1+rdx] + vblendvpd ymm8,ymm8,ymm0,ymm2 + + + vpand ymm3,ymm3,YMMWORD[$L$mask52x4] + vpand ymm5,ymm5,YMMWORD[$L$mask52x4] + vpand ymm6,ymm6,YMMWORD[$L$mask52x4] + vpand ymm7,ymm7,YMMWORD[$L$mask52x4] + vpand ymm8,ymm8,YMMWORD[$L$mask52x4] + + vmovq xmm0,r15 + vpbroadcastq ymm0,xmm0 + vpblendd ymm4,ymm4,ymm0,3 + + + + vpsrlq ymm0,ymm4,52 + vpsrlq ymm1,ymm9,52 + vpsrlq ymm2,ymm10,52 + vpsrlq ymm13,ymm11,52 + vpsrlq ymm14,ymm12,52 + + + vpermq ymm14,ymm14,144 + vpermq ymm15,ymm13,3 + vblendpd ymm14,ymm14,ymm15,1 + + vpermq ymm13,ymm13,144 + vpermq ymm15,ymm2,3 + vblendpd ymm13,ymm13,ymm15,1 + + vpermq ymm2,ymm2,144 + vpermq ymm15,ymm1,3 + vblendpd ymm2,ymm2,ymm15,1 + + vpermq ymm1,ymm1,144 + vpermq ymm15,ymm0,3 + vblendpd ymm1,ymm1,ymm15,1 + + vpermq ymm0,ymm0,144 + vpand ymm0,ymm0,YMMWORD[$L$high64x3] + + + vpand ymm4,ymm4,YMMWORD[$L$mask52x4] + vpand ymm9,ymm9,YMMWORD[$L$mask52x4] + vpand ymm10,ymm10,YMMWORD[$L$mask52x4] + vpand ymm11,ymm11,YMMWORD[$L$mask52x4] + vpand ymm12,ymm12,YMMWORD[$L$mask52x4] + + + vpaddq ymm4,ymm4,ymm0 + vpaddq ymm9,ymm9,ymm1 + vpaddq ymm10,ymm10,ymm2 + vpaddq ymm11,ymm11,ymm13 + vpaddq ymm12,ymm12,ymm14 + + + + vpcmpgtq ymm0,ymm4,YMMWORD[$L$mask52x4] + vpcmpgtq ymm1,ymm9,YMMWORD[$L$mask52x4] + vpcmpgtq ymm2,ymm10,YMMWORD[$L$mask52x4] + vpcmpgtq ymm13,ymm11,YMMWORD[$L$mask52x4] + vpcmpgtq ymm14,ymm12,YMMWORD[$L$mask52x4] + vmovmskpd r14d,ymm0 + vmovmskpd r13d,ymm1 + vmovmskpd r12d,ymm2 + vmovmskpd r11d,ymm13 + vmovmskpd r10d,ymm14 + + + vpcmpeqq ymm0,ymm4,YMMWORD[$L$mask52x4] + vpcmpeqq ymm1,ymm9,YMMWORD[$L$mask52x4] + vpcmpeqq ymm2,ymm10,YMMWORD[$L$mask52x4] + vpcmpeqq ymm13,ymm11,YMMWORD[$L$mask52x4] + vpcmpeqq ymm14,ymm12,YMMWORD[$L$mask52x4] + vmovmskpd r9d,ymm0 + vmovmskpd r8d,ymm1 + vmovmskpd ebx,ymm2 + vmovmskpd ecx,ymm13 + vmovmskpd edx,ymm14 + + + + shl r13b,4 + or r14b,r13b + shl r11b,4 + or r12b,r11b + + add r14b,r14b + adc r12b,r12b + adc r10b,r10b + + shl r8b,4 + or r9b,r8b + shl cl,4 + or bl,cl + + add r14b,r9b + adc r12b,bl + adc r10b,dl + + xor r14b,r9b + xor r12b,bl + xor r10b,dl + + lea rdx,[$L$kmasklut] + + mov r13b,r14b + and r14,0xf + vpsubq ymm0,ymm4,YMMWORD[$L$mask52x4] + shl r14,5 + vmovapd ymm2,YMMWORD[r14*1+rdx] + vblendvpd ymm4,ymm4,ymm0,ymm2 + + shr r13b,4 + and r13,0xf + vpsubq ymm0,ymm9,YMMWORD[$L$mask52x4] + shl r13,5 + vmovapd ymm2,YMMWORD[r13*1+rdx] + vblendvpd ymm9,ymm9,ymm0,ymm2 + + mov r11b,r12b + and r12,0xf + vpsubq ymm0,ymm10,YMMWORD[$L$mask52x4] + shl r12,5 + vmovapd ymm2,YMMWORD[r12*1+rdx] + vblendvpd ymm10,ymm10,ymm0,ymm2 + + shr r11b,4 + and r11,0xf + vpsubq ymm0,ymm11,YMMWORD[$L$mask52x4] + shl r11,5 + vmovapd ymm2,YMMWORD[r11*1+rdx] + vblendvpd ymm11,ymm11,ymm0,ymm2 + + and r10,0xf + vpsubq ymm0,ymm12,YMMWORD[$L$mask52x4] + shl r10,5 + vmovapd ymm2,YMMWORD[r10*1+rdx] + vblendvpd ymm12,ymm12,ymm0,ymm2 + + + vpand ymm4,ymm4,YMMWORD[$L$mask52x4] + vpand ymm9,ymm9,YMMWORD[$L$mask52x4] + vpand ymm10,ymm10,YMMWORD[$L$mask52x4] + vpand ymm11,ymm11,YMMWORD[$L$mask52x4] + vpand ymm12,ymm12,YMMWORD[$L$mask52x4] + + vmovdqu YMMWORD[rdi],ymm3 + vmovdqu YMMWORD[32+rdi],ymm5 + vmovdqu YMMWORD[64+rdi],ymm6 + vmovdqu YMMWORD[96+rdi],ymm7 + vmovdqu YMMWORD[128+rdi],ymm8 + + vmovdqu YMMWORD[160+rdi],ymm4 + vmovdqu YMMWORD[192+rdi],ymm9 + vmovdqu YMMWORD[224+rdi],ymm10 + vmovdqu YMMWORD[256+rdi],ymm11 + vmovdqu YMMWORD[288+rdi],ymm12 + + vzeroupper + mov r15,QWORD[rsp] + + mov r14,QWORD[8+rsp] + + mov r13,QWORD[16+rsp] + + mov r12,QWORD[24+rsp] + + mov rbp,QWORD[32+rsp] + + mov rbx,QWORD[40+rsp] + + lea rsp,[48+rsp] + +$L$ossl_rsaz_amm52x20_x2_avxifma256_epilogue: + mov rdi,QWORD[8+rsp] ;WIN64 epilogue + mov rsi,QWORD[16+rsp] + DB 0F3h,0C3h ;repret + +$L$SEH_end_ossl_rsaz_amm52x20_x2_avxifma256: +section .text code align=64 + + +ALIGN 32 +global ossl_extract_multiplier_2x20_win5_avx + +ossl_extract_multiplier_2x20_win5_avx: + +DB 243,15,30,250 + vmovapd ymm14,YMMWORD[$L$ones] + vmovq xmm10,r8 + vpbroadcastq ymm12,xmm10 + vmovq xmm10,r9 + vpbroadcastq ymm13,xmm10 + lea rax,[10240+rdx] + + + vpxor xmm0,xmm0,xmm0 + vmovapd ymm11,ymm0 + vmovapd ymm1,ymm0 + vmovapd ymm2,ymm0 + vmovapd ymm3,ymm0 + vmovapd ymm4,ymm0 + vmovapd ymm5,ymm0 + vmovapd ymm6,ymm0 + vmovapd ymm7,ymm0 + vmovapd ymm8,ymm0 + vmovapd ymm9,ymm0 + +ALIGN 32 +$L$loop: + vpcmpeqq ymm15,ymm12,ymm11 + vmovdqu ymm10,YMMWORD[rdx] + vblendvpd ymm0,ymm0,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[32+rdx] + vblendvpd ymm1,ymm1,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[64+rdx] + vblendvpd ymm2,ymm2,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[96+rdx] + vblendvpd ymm3,ymm3,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[128+rdx] + vblendvpd ymm4,ymm4,ymm10,ymm15 + vpcmpeqq ymm15,ymm13,ymm11 + vmovdqu ymm10,YMMWORD[160+rdx] + vblendvpd ymm5,ymm5,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[192+rdx] + vblendvpd ymm6,ymm6,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[224+rdx] + vblendvpd ymm7,ymm7,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[256+rdx] + vblendvpd ymm8,ymm8,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[288+rdx] + vblendvpd ymm9,ymm9,ymm10,ymm15 + vpaddq ymm11,ymm11,ymm14 + add rdx,320 + cmp rax,rdx + jne NEAR $L$loop + vmovdqu YMMWORD[rcx],ymm0 + vmovdqu YMMWORD[32+rcx],ymm1 + vmovdqu YMMWORD[64+rcx],ymm2 + vmovdqu YMMWORD[96+rcx],ymm3 + vmovdqu YMMWORD[128+rcx],ymm4 + vmovdqu YMMWORD[160+rcx],ymm5 + vmovdqu YMMWORD[192+rcx],ymm6 + vmovdqu YMMWORD[224+rcx],ymm7 + vmovdqu YMMWORD[256+rcx],ymm8 + vmovdqu YMMWORD[288+rcx],ymm9 + DB 0F3h,0C3h ;repret + + +section .rdata rdata align=32 +ALIGN 32 +$L$ones: + DQ 1,1,1,1 +$L$zeros: + DQ 0,0,0,0 +EXTERN __imp_RtlVirtualUnwind + +ALIGN 16 +rsaz_def_handler: + push rsi + push rdi + push rbx + push rbp + push r12 + push r13 + push r14 + push r15 + pushfq + sub rsp,64 + + mov rax,QWORD[120+r8] + mov rbx,QWORD[248+r8] + + mov rsi,QWORD[8+r9] + mov r11,QWORD[56+r9] + + mov r10d,DWORD[r11] + lea r10,[r10*1+rsi] + cmp rbx,r10 + jb NEAR $L$common_seh_tail + + mov rax,QWORD[152+r8] + + mov r10d,DWORD[4+r11] + lea r10,[r10*1+rsi] + cmp rbx,r10 + jae NEAR $L$common_seh_tail + + lea rax,[48+rax] + + mov rbx,QWORD[((-8))+rax] + mov rbp,QWORD[((-16))+rax] + mov r12,QWORD[((-24))+rax] + mov r13,QWORD[((-32))+rax] + mov r14,QWORD[((-40))+rax] + mov r15,QWORD[((-48))+rax] + mov QWORD[144+r8],rbx + mov QWORD[160+r8],rbp + mov QWORD[216+r8],r12 + mov QWORD[224+r8],r13 + mov QWORD[232+r8],r14 + mov QWORD[240+r8],r15 + +$L$common_seh_tail: + mov rdi,QWORD[8+rax] + mov rsi,QWORD[16+rax] + mov QWORD[152+r8],rax + mov QWORD[168+r8],rsi + mov QWORD[176+r8],rdi + + mov rdi,QWORD[40+r9] + mov rsi,r8 + mov ecx,154 + DD 0xa548f3fc + + mov rsi,r9 + xor rcx,rcx + mov rdx,QWORD[8+rsi] + mov r8,QWORD[rsi] + mov r9,QWORD[16+rsi] + mov r10,QWORD[40+rsi] + lea r11,[56+rsi] + lea r12,[24+rsi] + mov QWORD[32+rsp],r10 + mov QWORD[40+rsp],r11 + mov QWORD[48+rsp],r12 + mov QWORD[56+rsp],rcx + call QWORD[__imp_RtlVirtualUnwind] + + mov eax,1 + add rsp,64 + popfq + pop r15 + pop r14 + pop r13 + pop r12 + pop rbp + pop rbx + pop rdi + pop rsi + DB 0F3h,0C3h ;repret + + +section .pdata rdata align=4 +ALIGN 4 + DD $L$SEH_begin_ossl_rsaz_amm52x20_x1_avxifma256 wrt ..imagebase + DD $L$SEH_end_ossl_rsaz_amm52x20_x1_avxifma256 wrt ..imagebase + DD $L$SEH_info_ossl_rsaz_amm52x20_x1_avxifma256 wrt ..imagebase + + DD $L$SEH_begin_ossl_rsaz_amm52x20_x2_avxifma256 wrt ..imagebase + DD $L$SEH_end_ossl_rsaz_amm52x20_x2_avxifma256 wrt ..imagebase + DD $L$SEH_info_ossl_rsaz_amm52x20_x2_avxifma256 wrt ..imagebase + +section .xdata rdata align=8 +ALIGN 8 +$L$SEH_info_ossl_rsaz_amm52x20_x1_avxifma256: +DB 9,0,0,0 + DD rsaz_def_handler wrt ..imagebase + DD $L$ossl_rsaz_amm52x20_x1_avxifma256_body wrt ..imagebase,$L$ossl_rsaz_amm52x20_x1_avxifma256_epilogue wrt ..imagebase +$L$SEH_info_ossl_rsaz_amm52x20_x2_avxifma256: +DB 9,0,0,0 + DD rsaz_def_handler wrt ..imagebase + DD $L$ossl_rsaz_amm52x20_x2_avxifma256_body wrt ..imagebase,$L$ossl_rsaz_amm52x20_x2_avxifma256_epilogue wrt ..imagebase diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-3k-avxifma.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-3k-avxifma.nasm new file mode 100644 index 000000000000..98b10734b600 --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-3k-avxifma.nasm @@ -0,0 +1,1927 @@ +default rel +%define XMMWORD +%define YMMWORD +%define ZMMWORD +section .text code align=64 + + +global ossl_rsaz_amm52x30_x1_avxifma256 + +ALIGN 32 +ossl_rsaz_amm52x30_x1_avxifma256: + mov QWORD[8+rsp],rdi ;WIN64 prologue + mov QWORD[16+rsp],rsi + mov rax,rsp +$L$SEH_begin_ossl_rsaz_amm52x30_x1_avxifma256: + mov rdi,rcx + mov rsi,rdx + mov rdx,r8 + mov rcx,r9 + mov r8,QWORD[40+rsp] + + + +DB 243,15,30,250 + push rbx + + push rbp + + push r12 + + push r13 + + push r14 + + push r15 + + lea rsp,[((-168))+rsp] + vmovapd XMMWORD[rsp],xmm6 + vmovapd XMMWORD[16+rsp],xmm7 + vmovapd XMMWORD[32+rsp],xmm8 + vmovapd XMMWORD[48+rsp],xmm9 + vmovapd XMMWORD[64+rsp],xmm10 + vmovapd XMMWORD[80+rsp],xmm11 + vmovapd XMMWORD[96+rsp],xmm12 + vmovapd XMMWORD[112+rsp],xmm13 + vmovapd XMMWORD[128+rsp],xmm14 + vmovapd XMMWORD[144+rsp],xmm15 +$L$ossl_rsaz_amm52x30_x1_avxifma256_body: + + vpxor ymm0,ymm0,ymm0 + vmovapd ymm3,ymm0 + vmovapd ymm4,ymm0 + vmovapd ymm5,ymm0 + vmovapd ymm6,ymm0 + vmovapd ymm7,ymm0 + vmovapd ymm8,ymm0 + vmovapd ymm9,ymm0 + vmovapd ymm10,ymm0 + + xor r9d,r9d + + mov r11,rdx + mov rax,0xfffffffffffff + + + mov ebx,7 + +ALIGN 32 +$L$loop7: + mov r13,QWORD[r11] + + vpbroadcastq ymm1,QWORD[r11] + mov rdx,QWORD[rsi] + mulx r12,r13,r13 + add r9,r13 + mov r10,r12 + adc r10,0 + + mov r13,r8 + imul r13,r9 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[rcx] + mulx r12,r13,r13 + add r9,r13 + adc r10,r12 + + shr r9,52 + sal r10,12 + or r9,r10 + + lea rsp,[((-264))+rsp] + +{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi] + +{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx] + + + vmovdqu YMMWORD[rsp],ymm3 + vmovdqu YMMWORD[32+rsp],ymm4 + vmovdqu YMMWORD[64+rsp],ymm5 + vmovdqu YMMWORD[96+rsp],ymm6 + vmovdqu YMMWORD[128+rsp],ymm7 + vmovdqu YMMWORD[160+rsp],ymm8 + vmovdqu YMMWORD[192+rsp],ymm9 + vmovdqu YMMWORD[224+rsp],ymm10 + mov QWORD[256+rsp],0 + + vmovdqu ymm3,YMMWORD[8+rsp] + vmovdqu ymm4,YMMWORD[40+rsp] + vmovdqu ymm5,YMMWORD[72+rsp] + vmovdqu ymm6,YMMWORD[104+rsp] + vmovdqu ymm7,YMMWORD[136+rsp] + vmovdqu ymm8,YMMWORD[168+rsp] + vmovdqu ymm9,YMMWORD[200+rsp] + vmovdqu ymm10,YMMWORD[232+rsp] + + add r9,QWORD[8+rsp] + +{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi] + +{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx] + + lea rsp,[264+rsp] + mov r13,QWORD[8+r11] + + vpbroadcastq ymm1,QWORD[8+r11] + mov rdx,QWORD[rsi] + mulx r12,r13,r13 + add r9,r13 + mov r10,r12 + adc r10,0 + + mov r13,r8 + imul r13,r9 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[rcx] + mulx r12,r13,r13 + add r9,r13 + adc r10,r12 + + shr r9,52 + sal r10,12 + or r9,r10 + + lea rsp,[((-264))+rsp] + +{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi] + +{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx] + + + vmovdqu YMMWORD[rsp],ymm3 + vmovdqu YMMWORD[32+rsp],ymm4 + vmovdqu YMMWORD[64+rsp],ymm5 + vmovdqu YMMWORD[96+rsp],ymm6 + vmovdqu YMMWORD[128+rsp],ymm7 + vmovdqu YMMWORD[160+rsp],ymm8 + vmovdqu YMMWORD[192+rsp],ymm9 + vmovdqu YMMWORD[224+rsp],ymm10 + mov QWORD[256+rsp],0 + + vmovdqu ymm3,YMMWORD[8+rsp] + vmovdqu ymm4,YMMWORD[40+rsp] + vmovdqu ymm5,YMMWORD[72+rsp] + vmovdqu ymm6,YMMWORD[104+rsp] + vmovdqu ymm7,YMMWORD[136+rsp] + vmovdqu ymm8,YMMWORD[168+rsp] + vmovdqu ymm9,YMMWORD[200+rsp] + vmovdqu ymm10,YMMWORD[232+rsp] + + add r9,QWORD[8+rsp] + +{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi] + +{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx] + + lea rsp,[264+rsp] + mov r13,QWORD[16+r11] + + vpbroadcastq ymm1,QWORD[16+r11] + mov rdx,QWORD[rsi] + mulx r12,r13,r13 + add r9,r13 + mov r10,r12 + adc r10,0 + + mov r13,r8 + imul r13,r9 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[rcx] + mulx r12,r13,r13 + add r9,r13 + adc r10,r12 + + shr r9,52 + sal r10,12 + or r9,r10 + + lea rsp,[((-264))+rsp] + +{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi] + +{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx] + + + vmovdqu YMMWORD[rsp],ymm3 + vmovdqu YMMWORD[32+rsp],ymm4 + vmovdqu YMMWORD[64+rsp],ymm5 + vmovdqu YMMWORD[96+rsp],ymm6 + vmovdqu YMMWORD[128+rsp],ymm7 + vmovdqu YMMWORD[160+rsp],ymm8 + vmovdqu YMMWORD[192+rsp],ymm9 + vmovdqu YMMWORD[224+rsp],ymm10 + mov QWORD[256+rsp],0 + + vmovdqu ymm3,YMMWORD[8+rsp] + vmovdqu ymm4,YMMWORD[40+rsp] + vmovdqu ymm5,YMMWORD[72+rsp] + vmovdqu ymm6,YMMWORD[104+rsp] + vmovdqu ymm7,YMMWORD[136+rsp] + vmovdqu ymm8,YMMWORD[168+rsp] + vmovdqu ymm9,YMMWORD[200+rsp] + vmovdqu ymm10,YMMWORD[232+rsp] + + add r9,QWORD[8+rsp] + +{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi] + +{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx] + + lea rsp,[264+rsp] + mov r13,QWORD[24+r11] + + vpbroadcastq ymm1,QWORD[24+r11] + mov rdx,QWORD[rsi] + mulx r12,r13,r13 + add r9,r13 + mov r10,r12 + adc r10,0 + + mov r13,r8 + imul r13,r9 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[rcx] + mulx r12,r13,r13 + add r9,r13 + adc r10,r12 + + shr r9,52 + sal r10,12 + or r9,r10 + + lea rsp,[((-264))+rsp] + +{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi] + +{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx] + + + vmovdqu YMMWORD[rsp],ymm3 + vmovdqu YMMWORD[32+rsp],ymm4 + vmovdqu YMMWORD[64+rsp],ymm5 + vmovdqu YMMWORD[96+rsp],ymm6 + vmovdqu YMMWORD[128+rsp],ymm7 + vmovdqu YMMWORD[160+rsp],ymm8 + vmovdqu YMMWORD[192+rsp],ymm9 + vmovdqu YMMWORD[224+rsp],ymm10 + mov QWORD[256+rsp],0 + + vmovdqu ymm3,YMMWORD[8+rsp] + vmovdqu ymm4,YMMWORD[40+rsp] + vmovdqu ymm5,YMMWORD[72+rsp] + vmovdqu ymm6,YMMWORD[104+rsp] + vmovdqu ymm7,YMMWORD[136+rsp] + vmovdqu ymm8,YMMWORD[168+rsp] + vmovdqu ymm9,YMMWORD[200+rsp] + vmovdqu ymm10,YMMWORD[232+rsp] + + add r9,QWORD[8+rsp] + +{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi] + +{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx] + + lea rsp,[264+rsp] + lea r11,[32+r11] + dec ebx + jne NEAR $L$loop7 + mov r13,QWORD[r11] + + vpbroadcastq ymm1,QWORD[r11] + mov rdx,QWORD[rsi] + mulx r12,r13,r13 + add r9,r13 + mov r10,r12 + adc r10,0 + + mov r13,r8 + imul r13,r9 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[rcx] + mulx r12,r13,r13 + add r9,r13 + adc r10,r12 + + shr r9,52 + sal r10,12 + or r9,r10 + + lea rsp,[((-264))+rsp] + +{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi] + +{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx] + + + vmovdqu YMMWORD[rsp],ymm3 + vmovdqu YMMWORD[32+rsp],ymm4 + vmovdqu YMMWORD[64+rsp],ymm5 + vmovdqu YMMWORD[96+rsp],ymm6 + vmovdqu YMMWORD[128+rsp],ymm7 + vmovdqu YMMWORD[160+rsp],ymm8 + vmovdqu YMMWORD[192+rsp],ymm9 + vmovdqu YMMWORD[224+rsp],ymm10 + mov QWORD[256+rsp],0 + + vmovdqu ymm3,YMMWORD[8+rsp] + vmovdqu ymm4,YMMWORD[40+rsp] + vmovdqu ymm5,YMMWORD[72+rsp] + vmovdqu ymm6,YMMWORD[104+rsp] + vmovdqu ymm7,YMMWORD[136+rsp] + vmovdqu ymm8,YMMWORD[168+rsp] + vmovdqu ymm9,YMMWORD[200+rsp] + vmovdqu ymm10,YMMWORD[232+rsp] + + add r9,QWORD[8+rsp] + +{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi] + +{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx] + + lea rsp,[264+rsp] + mov r13,QWORD[8+r11] + + vpbroadcastq ymm1,QWORD[8+r11] + mov rdx,QWORD[rsi] + mulx r12,r13,r13 + add r9,r13 + mov r10,r12 + adc r10,0 + + mov r13,r8 + imul r13,r9 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[rcx] + mulx r12,r13,r13 + add r9,r13 + adc r10,r12 + + shr r9,52 + sal r10,12 + or r9,r10 + + lea rsp,[((-264))+rsp] + +{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi] + +{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx] + + + vmovdqu YMMWORD[rsp],ymm3 + vmovdqu YMMWORD[32+rsp],ymm4 + vmovdqu YMMWORD[64+rsp],ymm5 + vmovdqu YMMWORD[96+rsp],ymm6 + vmovdqu YMMWORD[128+rsp],ymm7 + vmovdqu YMMWORD[160+rsp],ymm8 + vmovdqu YMMWORD[192+rsp],ymm9 + vmovdqu YMMWORD[224+rsp],ymm10 + mov QWORD[256+rsp],0 + + vmovdqu ymm3,YMMWORD[8+rsp] + vmovdqu ymm4,YMMWORD[40+rsp] + vmovdqu ymm5,YMMWORD[72+rsp] + vmovdqu ymm6,YMMWORD[104+rsp] + vmovdqu ymm7,YMMWORD[136+rsp] + vmovdqu ymm8,YMMWORD[168+rsp] + vmovdqu ymm9,YMMWORD[200+rsp] + vmovdqu ymm10,YMMWORD[232+rsp] + + add r9,QWORD[8+rsp] + +{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi] + +{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx] + + lea rsp,[264+rsp] + + vmovq xmm0,r9 + vpbroadcastq ymm0,xmm0 + vpblendd ymm3,ymm3,ymm0,3 + + + + vpsrlq ymm0,ymm3,52 + vpsrlq ymm1,ymm4,52 + vpsrlq ymm2,ymm5,52 + vpsrlq ymm11,ymm6,52 + vpsrlq ymm12,ymm7,52 + vpsrlq ymm13,ymm8,52 + vpsrlq ymm14,ymm9,52 + vpsrlq ymm15,ymm10,52 + + lea rsp,[((-32))+rsp] + vmovupd YMMWORD[rsp],ymm3 + + + vpermq ymm15,ymm15,144 + vpermq ymm3,ymm14,3 + vblendpd ymm15,ymm15,ymm3,1 + + vpermq ymm14,ymm14,144 + vpermq ymm3,ymm13,3 + vblendpd ymm14,ymm14,ymm3,1 + + vpermq ymm13,ymm13,144 + vpermq ymm3,ymm12,3 + vblendpd ymm13,ymm13,ymm3,1 + + vpermq ymm12,ymm12,144 + vpermq ymm3,ymm11,3 + vblendpd ymm12,ymm12,ymm3,1 + + vpermq ymm11,ymm11,144 + vpermq ymm3,ymm2,3 + vblendpd ymm11,ymm11,ymm3,1 + + vpermq ymm2,ymm2,144 + vpermq ymm3,ymm1,3 + vblendpd ymm2,ymm2,ymm3,1 + + vpermq ymm1,ymm1,144 + vpermq ymm3,ymm0,3 + vblendpd ymm1,ymm1,ymm3,1 + + vpermq ymm0,ymm0,144 + vpand ymm0,ymm0,YMMWORD[$L$high64x3] + + vmovupd ymm3,YMMWORD[rsp] + lea rsp,[32+rsp] + + + vpand ymm3,ymm3,YMMWORD[$L$mask52x4] + vpand ymm4,ymm4,YMMWORD[$L$mask52x4] + vpand ymm5,ymm5,YMMWORD[$L$mask52x4] + vpand ymm6,ymm6,YMMWORD[$L$mask52x4] + vpand ymm7,ymm7,YMMWORD[$L$mask52x4] + vpand ymm8,ymm8,YMMWORD[$L$mask52x4] + vpand ymm9,ymm9,YMMWORD[$L$mask52x4] + vpand ymm10,ymm10,YMMWORD[$L$mask52x4] + + + vpaddq ymm3,ymm3,ymm0 + vpaddq ymm4,ymm4,ymm1 + vpaddq ymm5,ymm5,ymm2 + vpaddq ymm6,ymm6,ymm11 + vpaddq ymm7,ymm7,ymm12 + vpaddq ymm8,ymm8,ymm13 + vpaddq ymm9,ymm9,ymm14 + vpaddq ymm10,ymm10,ymm15 + + + + vpcmpgtq ymm0,ymm3,YMMWORD[$L$mask52x4] + vpcmpgtq ymm1,ymm4,YMMWORD[$L$mask52x4] + vmovmskpd r14d,ymm0 + vmovmskpd r13d,ymm1 + shl r13b,4 + or r14b,r13b + + vpcmpgtq ymm2,ymm5,YMMWORD[$L$mask52x4] + vpcmpgtq ymm11,ymm6,YMMWORD[$L$mask52x4] + vmovmskpd r13d,ymm2 + vmovmskpd r12d,ymm11 + shl r12b,4 + or r13b,r12b + + vpcmpgtq ymm12,ymm7,YMMWORD[$L$mask52x4] + vpcmpgtq ymm13,ymm8,YMMWORD[$L$mask52x4] + vmovmskpd r12d,ymm12 + vmovmskpd r11d,ymm13 + shl r11b,4 + or r12b,r11b + + vpcmpgtq ymm14,ymm9,YMMWORD[$L$mask52x4] + vpcmpgtq ymm15,ymm10,YMMWORD[$L$mask52x4] + vmovmskpd r11d,ymm14 + vmovmskpd r10d,ymm15 + shl r10b,4 + or r11b,r10b + + add r14b,r14b + adc r13b,r13b + adc r12b,r12b + adc r11b,r11b + + + vpcmpeqq ymm0,ymm3,YMMWORD[$L$mask52x4] + vpcmpeqq ymm1,ymm4,YMMWORD[$L$mask52x4] + vmovmskpd r9d,ymm0 + vmovmskpd r8d,ymm1 + shl r8b,4 + or r9b,r8b + + vpcmpeqq ymm2,ymm5,YMMWORD[$L$mask52x4] + vpcmpeqq ymm11,ymm6,YMMWORD[$L$mask52x4] + vmovmskpd r8d,ymm2 + vmovmskpd edx,ymm11 + shl dl,4 + or r8b,dl + + vpcmpeqq ymm12,ymm7,YMMWORD[$L$mask52x4] + vpcmpeqq ymm13,ymm8,YMMWORD[$L$mask52x4] + vmovmskpd edx,ymm12 + vmovmskpd ecx,ymm13 + shl cl,4 + or dl,cl + + vpcmpeqq ymm14,ymm9,YMMWORD[$L$mask52x4] + vpcmpeqq ymm15,ymm10,YMMWORD[$L$mask52x4] + vmovmskpd ecx,ymm14 + vmovmskpd ebx,ymm15 + shl bl,4 + or cl,bl + + add r14b,r9b + adc r13b,r8b + adc r12b,dl + adc r11b,cl + + xor r14b,r9b + xor r13b,r8b + xor r12b,dl + xor r11b,cl + + lea rdx,[$L$kmasklut] + + mov r10b,r14b + and r14,0xf + vpsubq ymm0,ymm3,YMMWORD[$L$mask52x4] + shl r14,5 + vmovapd ymm2,YMMWORD[r14*1+rdx] + vblendvpd ymm3,ymm3,ymm0,ymm2 + + shr r10b,4 + and r10,0xf + vpsubq ymm0,ymm4,YMMWORD[$L$mask52x4] + shl r10,5 + vmovapd ymm2,YMMWORD[r10*1+rdx] + vblendvpd ymm4,ymm4,ymm0,ymm2 + + mov r10b,r13b + and r13,0xf + vpsubq ymm0,ymm5,YMMWORD[$L$mask52x4] + shl r13,5 + vmovapd ymm2,YMMWORD[r13*1+rdx] + vblendvpd ymm5,ymm5,ymm0,ymm2 + + shr r10b,4 + and r10,0xf + vpsubq ymm0,ymm6,YMMWORD[$L$mask52x4] + shl r10,5 + vmovapd ymm2,YMMWORD[r10*1+rdx] + vblendvpd ymm6,ymm6,ymm0,ymm2 + + mov r10b,r12b + and r12,0xf + vpsubq ymm0,ymm7,YMMWORD[$L$mask52x4] + shl r12,5 + vmovapd ymm2,YMMWORD[r12*1+rdx] + vblendvpd ymm7,ymm7,ymm0,ymm2 + + shr r10b,4 + and r10,0xf + vpsubq ymm0,ymm8,YMMWORD[$L$mask52x4] + shl r10,5 + vmovapd ymm2,YMMWORD[r10*1+rdx] + vblendvpd ymm8,ymm8,ymm0,ymm2 + + mov r10b,r11b + and r11,0xf + vpsubq ymm0,ymm9,YMMWORD[$L$mask52x4] + shl r11,5 + vmovapd ymm2,YMMWORD[r11*1+rdx] + vblendvpd ymm9,ymm9,ymm0,ymm2 + + shr r10b,4 + and r10,0xf + vpsubq ymm0,ymm10,YMMWORD[$L$mask52x4] + shl r10,5 + vmovapd ymm2,YMMWORD[r10*1+rdx] + vblendvpd ymm10,ymm10,ymm0,ymm2 + + vpand ymm3,ymm3,YMMWORD[$L$mask52x4] + vpand ymm4,ymm4,YMMWORD[$L$mask52x4] + vpand ymm5,ymm5,YMMWORD[$L$mask52x4] + vpand ymm6,ymm6,YMMWORD[$L$mask52x4] + vpand ymm7,ymm7,YMMWORD[$L$mask52x4] + vpand ymm8,ymm8,YMMWORD[$L$mask52x4] + vpand ymm9,ymm9,YMMWORD[$L$mask52x4] + + vpand ymm10,ymm10,YMMWORD[$L$mask52x4] + + vmovdqu YMMWORD[rdi],ymm3 + vmovdqu YMMWORD[32+rdi],ymm4 + vmovdqu YMMWORD[64+rdi],ymm5 + vmovdqu YMMWORD[96+rdi],ymm6 + vmovdqu YMMWORD[128+rdi],ymm7 + vmovdqu YMMWORD[160+rdi],ymm8 + vmovdqu YMMWORD[192+rdi],ymm9 + vmovdqu YMMWORD[224+rdi],ymm10 + + vzeroupper + lea rax,[rsp] + + vmovapd xmm6,XMMWORD[rax] + vmovapd xmm7,XMMWORD[16+rax] + vmovapd xmm8,XMMWORD[32+rax] + vmovapd xmm9,XMMWORD[48+rax] + vmovapd xmm10,XMMWORD[64+rax] + vmovapd xmm11,XMMWORD[80+rax] + vmovapd xmm12,XMMWORD[96+rax] + vmovapd xmm13,XMMWORD[112+rax] + vmovapd xmm14,XMMWORD[128+rax] + vmovapd xmm15,XMMWORD[144+rax] + lea rax,[168+rsp] + mov r15,QWORD[rax] + + mov r14,QWORD[8+rax] + + mov r13,QWORD[16+rax] + + mov r12,QWORD[24+rax] + + mov rbp,QWORD[32+rax] + + mov rbx,QWORD[40+rax] + + lea rsp,[48+rax] + +$L$ossl_rsaz_amm52x30_x1_avxifma256_epilogue: + mov rdi,QWORD[8+rsp] ;WIN64 epilogue + mov rsi,QWORD[16+rsp] + DB 0F3h,0C3h ;repret + +$L$SEH_end_ossl_rsaz_amm52x30_x1_avxifma256: +section .rdata rdata align=32 +ALIGN 32 +$L$mask52x4: + DQ 0xfffffffffffff + DQ 0xfffffffffffff + DQ 0xfffffffffffff + DQ 0xfffffffffffff +$L$high64x3: + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff +$L$kmasklut: + + DQ 0x0 + DQ 0x0 + DQ 0x0 + DQ 0x0 + + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0x0 + DQ 0x0 + + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0x0 + + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0x0 + + DQ 0x0 + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0x0 + + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0x0 + + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0x0 + + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0x0 + + DQ 0x0 + DQ 0x0 + DQ 0x0 + DQ 0xffffffffffffffff + + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0x0 + DQ 0xffffffffffffffff + + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0xffffffffffffffff + + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0xffffffffffffffff + + DQ 0x0 + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff +section .text code align=64 + + +global ossl_rsaz_amm52x30_x2_avxifma256 + +ALIGN 32 +ossl_rsaz_amm52x30_x2_avxifma256: + mov QWORD[8+rsp],rdi ;WIN64 prologue + mov QWORD[16+rsp],rsi + mov rax,rsp +$L$SEH_begin_ossl_rsaz_amm52x30_x2_avxifma256: + mov rdi,rcx + mov rsi,rdx + mov rdx,r8 + mov rcx,r9 + mov r8,QWORD[40+rsp] + + + +DB 243,15,30,250 + push rbx + + push rbp + + push r12 + + push r13 + + push r14 + + push r15 + + lea rsp,[((-168))+rsp] + vmovapd XMMWORD[rsp],xmm6 + vmovapd XMMWORD[16+rsp],xmm7 + vmovapd XMMWORD[32+rsp],xmm8 + vmovapd XMMWORD[48+rsp],xmm9 + vmovapd XMMWORD[64+rsp],xmm10 + vmovapd XMMWORD[80+rsp],xmm11 + vmovapd XMMWORD[96+rsp],xmm12 + vmovapd XMMWORD[112+rsp],xmm13 + vmovapd XMMWORD[128+rsp],xmm14 + vmovapd XMMWORD[144+rsp],xmm15 +$L$ossl_rsaz_amm52x30_x2_avxifma256_body: + + vpxor ymm0,ymm0,ymm0 + vmovapd ymm3,ymm0 + vmovapd ymm4,ymm0 + vmovapd ymm5,ymm0 + vmovapd ymm6,ymm0 + vmovapd ymm7,ymm0 + vmovapd ymm8,ymm0 + vmovapd ymm9,ymm0 + vmovapd ymm10,ymm0 + + xor r9d,r9d + + mov r11,rdx + mov rax,0xfffffffffffff + + mov ebx,30 + +ALIGN 32 +$L$loop30: + mov r13,QWORD[r11] + + vpbroadcastq ymm1,QWORD[r11] + mov rdx,QWORD[rsi] + mulx r12,r13,r13 + add r9,r13 + mov r10,r12 + adc r10,0 + + mov r13,QWORD[r8] + imul r13,r9 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[rcx] + mulx r12,r13,r13 + add r9,r13 + adc r10,r12 + + shr r9,52 + sal r10,12 + or r9,r10 + + lea rsp,[((-264))+rsp] + +{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi] + +{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx] + + + vmovdqu YMMWORD[rsp],ymm3 + vmovdqu YMMWORD[32+rsp],ymm4 + vmovdqu YMMWORD[64+rsp],ymm5 + vmovdqu YMMWORD[96+rsp],ymm6 + vmovdqu YMMWORD[128+rsp],ymm7 + vmovdqu YMMWORD[160+rsp],ymm8 + vmovdqu YMMWORD[192+rsp],ymm9 + vmovdqu YMMWORD[224+rsp],ymm10 + mov QWORD[256+rsp],0 + + vmovdqu ymm3,YMMWORD[8+rsp] + vmovdqu ymm4,YMMWORD[40+rsp] + vmovdqu ymm5,YMMWORD[72+rsp] + vmovdqu ymm6,YMMWORD[104+rsp] + vmovdqu ymm7,YMMWORD[136+rsp] + vmovdqu ymm8,YMMWORD[168+rsp] + vmovdqu ymm9,YMMWORD[200+rsp] + vmovdqu ymm10,YMMWORD[232+rsp] + + add r9,QWORD[8+rsp] + +{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi] + +{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx] + + lea rsp,[264+rsp] + lea r11,[8+r11] + dec ebx + jne NEAR $L$loop30 + + push r11 + push rsi + push rcx + push r8 + + vmovq xmm0,r9 + vpbroadcastq ymm0,xmm0 + vpblendd ymm3,ymm3,ymm0,3 + + + + vpsrlq ymm0,ymm3,52 + vpsrlq ymm1,ymm4,52 + vpsrlq ymm2,ymm5,52 + vpsrlq ymm11,ymm6,52 + vpsrlq ymm12,ymm7,52 + vpsrlq ymm13,ymm8,52 + vpsrlq ymm14,ymm9,52 + vpsrlq ymm15,ymm10,52 + + lea rsp,[((-32))+rsp] + vmovupd YMMWORD[rsp],ymm3 + + + vpermq ymm15,ymm15,144 + vpermq ymm3,ymm14,3 + vblendpd ymm15,ymm15,ymm3,1 + + vpermq ymm14,ymm14,144 + vpermq ymm3,ymm13,3 + vblendpd ymm14,ymm14,ymm3,1 + + vpermq ymm13,ymm13,144 + vpermq ymm3,ymm12,3 + vblendpd ymm13,ymm13,ymm3,1 + + vpermq ymm12,ymm12,144 + vpermq ymm3,ymm11,3 + vblendpd ymm12,ymm12,ymm3,1 + + vpermq ymm11,ymm11,144 + vpermq ymm3,ymm2,3 + vblendpd ymm11,ymm11,ymm3,1 + + vpermq ymm2,ymm2,144 + vpermq ymm3,ymm1,3 + vblendpd ymm2,ymm2,ymm3,1 + + vpermq ymm1,ymm1,144 + vpermq ymm3,ymm0,3 + vblendpd ymm1,ymm1,ymm3,1 + + vpermq ymm0,ymm0,144 + vpand ymm0,ymm0,YMMWORD[$L$high64x3] + + vmovupd ymm3,YMMWORD[rsp] + lea rsp,[32+rsp] + + + vpand ymm3,ymm3,YMMWORD[$L$mask52x4] + vpand ymm4,ymm4,YMMWORD[$L$mask52x4] + vpand ymm5,ymm5,YMMWORD[$L$mask52x4] + vpand ymm6,ymm6,YMMWORD[$L$mask52x4] + vpand ymm7,ymm7,YMMWORD[$L$mask52x4] + vpand ymm8,ymm8,YMMWORD[$L$mask52x4] + vpand ymm9,ymm9,YMMWORD[$L$mask52x4] + vpand ymm10,ymm10,YMMWORD[$L$mask52x4] + + + vpaddq ymm3,ymm3,ymm0 + vpaddq ymm4,ymm4,ymm1 + vpaddq ymm5,ymm5,ymm2 + vpaddq ymm6,ymm6,ymm11 + vpaddq ymm7,ymm7,ymm12 + vpaddq ymm8,ymm8,ymm13 + vpaddq ymm9,ymm9,ymm14 + vpaddq ymm10,ymm10,ymm15 + + + + vpcmpgtq ymm0,ymm3,YMMWORD[$L$mask52x4] + vpcmpgtq ymm1,ymm4,YMMWORD[$L$mask52x4] + vmovmskpd r14d,ymm0 + vmovmskpd r13d,ymm1 + shl r13b,4 + or r14b,r13b + + vpcmpgtq ymm2,ymm5,YMMWORD[$L$mask52x4] + vpcmpgtq ymm11,ymm6,YMMWORD[$L$mask52x4] + vmovmskpd r13d,ymm2 + vmovmskpd r12d,ymm11 + shl r12b,4 + or r13b,r12b + + vpcmpgtq ymm12,ymm7,YMMWORD[$L$mask52x4] + vpcmpgtq ymm13,ymm8,YMMWORD[$L$mask52x4] + vmovmskpd r12d,ymm12 + vmovmskpd r11d,ymm13 + shl r11b,4 + or r12b,r11b + + vpcmpgtq ymm14,ymm9,YMMWORD[$L$mask52x4] + vpcmpgtq ymm15,ymm10,YMMWORD[$L$mask52x4] + vmovmskpd r11d,ymm14 + vmovmskpd r10d,ymm15 + shl r10b,4 + or r11b,r10b + + add r14b,r14b + adc r13b,r13b + adc r12b,r12b + adc r11b,r11b + + + vpcmpeqq ymm0,ymm3,YMMWORD[$L$mask52x4] + vpcmpeqq ymm1,ymm4,YMMWORD[$L$mask52x4] + vmovmskpd r9d,ymm0 + vmovmskpd r8d,ymm1 + shl r8b,4 + or r9b,r8b + + vpcmpeqq ymm2,ymm5,YMMWORD[$L$mask52x4] + vpcmpeqq ymm11,ymm6,YMMWORD[$L$mask52x4] + vmovmskpd r8d,ymm2 + vmovmskpd edx,ymm11 + shl dl,4 + or r8b,dl + + vpcmpeqq ymm12,ymm7,YMMWORD[$L$mask52x4] + vpcmpeqq ymm13,ymm8,YMMWORD[$L$mask52x4] + vmovmskpd edx,ymm12 + vmovmskpd ecx,ymm13 + shl cl,4 + or dl,cl + + vpcmpeqq ymm14,ymm9,YMMWORD[$L$mask52x4] + vpcmpeqq ymm15,ymm10,YMMWORD[$L$mask52x4] + vmovmskpd ecx,ymm14 + vmovmskpd ebx,ymm15 + shl bl,4 + or cl,bl + + add r14b,r9b + adc r13b,r8b + adc r12b,dl + adc r11b,cl + + xor r14b,r9b + xor r13b,r8b + xor r12b,dl + xor r11b,cl + + lea rdx,[$L$kmasklut] + + mov r10b,r14b + and r14,0xf + vpsubq ymm0,ymm3,YMMWORD[$L$mask52x4] + shl r14,5 + vmovapd ymm2,YMMWORD[r14*1+rdx] + vblendvpd ymm3,ymm3,ymm0,ymm2 + + shr r10b,4 + and r10,0xf + vpsubq ymm0,ymm4,YMMWORD[$L$mask52x4] + shl r10,5 + vmovapd ymm2,YMMWORD[r10*1+rdx] + vblendvpd ymm4,ymm4,ymm0,ymm2 + + mov r10b,r13b + and r13,0xf + vpsubq ymm0,ymm5,YMMWORD[$L$mask52x4] + shl r13,5 + vmovapd ymm2,YMMWORD[r13*1+rdx] + vblendvpd ymm5,ymm5,ymm0,ymm2 + + shr r10b,4 + and r10,0xf + vpsubq ymm0,ymm6,YMMWORD[$L$mask52x4] + shl r10,5 + vmovapd ymm2,YMMWORD[r10*1+rdx] + vblendvpd ymm6,ymm6,ymm0,ymm2 + + mov r10b,r12b + and r12,0xf + vpsubq ymm0,ymm7,YMMWORD[$L$mask52x4] + shl r12,5 + vmovapd ymm2,YMMWORD[r12*1+rdx] + vblendvpd ymm7,ymm7,ymm0,ymm2 + + shr r10b,4 + and r10,0xf + vpsubq ymm0,ymm8,YMMWORD[$L$mask52x4] + shl r10,5 + vmovapd ymm2,YMMWORD[r10*1+rdx] + vblendvpd ymm8,ymm8,ymm0,ymm2 + + mov r10b,r11b + and r11,0xf + vpsubq ymm0,ymm9,YMMWORD[$L$mask52x4] + shl r11,5 + vmovapd ymm2,YMMWORD[r11*1+rdx] + vblendvpd ymm9,ymm9,ymm0,ymm2 + + shr r10b,4 + and r10,0xf + vpsubq ymm0,ymm10,YMMWORD[$L$mask52x4] + shl r10,5 + vmovapd ymm2,YMMWORD[r10*1+rdx] + vblendvpd ymm10,ymm10,ymm0,ymm2 + + vpand ymm3,ymm3,YMMWORD[$L$mask52x4] + vpand ymm4,ymm4,YMMWORD[$L$mask52x4] + vpand ymm5,ymm5,YMMWORD[$L$mask52x4] + vpand ymm6,ymm6,YMMWORD[$L$mask52x4] + vpand ymm7,ymm7,YMMWORD[$L$mask52x4] + vpand ymm8,ymm8,YMMWORD[$L$mask52x4] + vpand ymm9,ymm9,YMMWORD[$L$mask52x4] + + vpand ymm10,ymm10,YMMWORD[$L$mask52x4] + pop r8 + pop rcx + pop rsi + pop r11 + + vmovdqu YMMWORD[rdi],ymm3 + vmovdqu YMMWORD[32+rdi],ymm4 + vmovdqu YMMWORD[64+rdi],ymm5 + vmovdqu YMMWORD[96+rdi],ymm6 + vmovdqu YMMWORD[128+rdi],ymm7 + vmovdqu YMMWORD[160+rdi],ymm8 + vmovdqu YMMWORD[192+rdi],ymm9 + vmovdqu YMMWORD[224+rdi],ymm10 + + xor r15d,r15d + + lea r11,[16+r11] + mov rax,0xfffffffffffff + + mov ebx,30 + + vpxor ymm0,ymm0,ymm0 + vmovapd ymm3,ymm0 + vmovapd ymm4,ymm0 + vmovapd ymm5,ymm0 + vmovapd ymm6,ymm0 + vmovapd ymm7,ymm0 + vmovapd ymm8,ymm0 + vmovapd ymm9,ymm0 + vmovapd ymm10,ymm0 +ALIGN 32 +$L$loop40: + mov r13,QWORD[r11] + + vpbroadcastq ymm1,QWORD[r11] + mov rdx,QWORD[256+rsi] + mulx r12,r13,r13 + add r9,r13 + mov r10,r12 + adc r10,0 + + mov r13,QWORD[8+r8] + imul r13,r9 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[256+rcx] + mulx r12,r13,r13 + add r9,r13 + adc r10,r12 + + shr r9,52 + sal r10,12 + or r9,r10 + + lea rsp,[((-264))+rsp] + +{vex} vpmadd52luq ymm3,ymm1,YMMWORD[256+rsi] +{vex} vpmadd52luq ymm4,ymm1,YMMWORD[288+rsi] +{vex} vpmadd52luq ymm5,ymm1,YMMWORD[320+rsi] +{vex} vpmadd52luq ymm6,ymm1,YMMWORD[352+rsi] +{vex} vpmadd52luq ymm7,ymm1,YMMWORD[384+rsi] +{vex} vpmadd52luq ymm8,ymm1,YMMWORD[416+rsi] +{vex} vpmadd52luq ymm9,ymm1,YMMWORD[448+rsi] +{vex} vpmadd52luq ymm10,ymm1,YMMWORD[480+rsi] + +{vex} vpmadd52luq ymm3,ymm2,YMMWORD[256+rcx] +{vex} vpmadd52luq ymm4,ymm2,YMMWORD[288+rcx] +{vex} vpmadd52luq ymm5,ymm2,YMMWORD[320+rcx] +{vex} vpmadd52luq ymm6,ymm2,YMMWORD[352+rcx] +{vex} vpmadd52luq ymm7,ymm2,YMMWORD[384+rcx] +{vex} vpmadd52luq ymm8,ymm2,YMMWORD[416+rcx] +{vex} vpmadd52luq ymm9,ymm2,YMMWORD[448+rcx] +{vex} vpmadd52luq ymm10,ymm2,YMMWORD[480+rcx] + + + vmovdqu YMMWORD[rsp],ymm3 + vmovdqu YMMWORD[32+rsp],ymm4 + vmovdqu YMMWORD[64+rsp],ymm5 + vmovdqu YMMWORD[96+rsp],ymm6 + vmovdqu YMMWORD[128+rsp],ymm7 + vmovdqu YMMWORD[160+rsp],ymm8 + vmovdqu YMMWORD[192+rsp],ymm9 + vmovdqu YMMWORD[224+rsp],ymm10 + mov QWORD[256+rsp],0 + + vmovdqu ymm3,YMMWORD[8+rsp] + vmovdqu ymm4,YMMWORD[40+rsp] + vmovdqu ymm5,YMMWORD[72+rsp] + vmovdqu ymm6,YMMWORD[104+rsp] + vmovdqu ymm7,YMMWORD[136+rsp] + vmovdqu ymm8,YMMWORD[168+rsp] + vmovdqu ymm9,YMMWORD[200+rsp] + vmovdqu ymm10,YMMWORD[232+rsp] + + add r9,QWORD[8+rsp] + +{vex} vpmadd52huq ymm3,ymm1,YMMWORD[256+rsi] +{vex} vpmadd52huq ymm4,ymm1,YMMWORD[288+rsi] +{vex} vpmadd52huq ymm5,ymm1,YMMWORD[320+rsi] +{vex} vpmadd52huq ymm6,ymm1,YMMWORD[352+rsi] +{vex} vpmadd52huq ymm7,ymm1,YMMWORD[384+rsi] +{vex} vpmadd52huq ymm8,ymm1,YMMWORD[416+rsi] +{vex} vpmadd52huq ymm9,ymm1,YMMWORD[448+rsi] +{vex} vpmadd52huq ymm10,ymm1,YMMWORD[480+rsi] + +{vex} vpmadd52huq ymm3,ymm2,YMMWORD[256+rcx] +{vex} vpmadd52huq ymm4,ymm2,YMMWORD[288+rcx] +{vex} vpmadd52huq ymm5,ymm2,YMMWORD[320+rcx] +{vex} vpmadd52huq ymm6,ymm2,YMMWORD[352+rcx] +{vex} vpmadd52huq ymm7,ymm2,YMMWORD[384+rcx] +{vex} vpmadd52huq ymm8,ymm2,YMMWORD[416+rcx] +{vex} vpmadd52huq ymm9,ymm2,YMMWORD[448+rcx] +{vex} vpmadd52huq ymm10,ymm2,YMMWORD[480+rcx] + + lea rsp,[264+rsp] + lea r11,[8+r11] + dec ebx + jne NEAR $L$loop40 + + vmovq xmm0,r9 + vpbroadcastq ymm0,xmm0 + vpblendd ymm3,ymm3,ymm0,3 + + + + vpsrlq ymm0,ymm3,52 + vpsrlq ymm1,ymm4,52 + vpsrlq ymm2,ymm5,52 + vpsrlq ymm11,ymm6,52 + vpsrlq ymm12,ymm7,52 + vpsrlq ymm13,ymm8,52 + vpsrlq ymm14,ymm9,52 + vpsrlq ymm15,ymm10,52 + + lea rsp,[((-32))+rsp] + vmovupd YMMWORD[rsp],ymm3 + + + vpermq ymm15,ymm15,144 + vpermq ymm3,ymm14,3 + vblendpd ymm15,ymm15,ymm3,1 + + vpermq ymm14,ymm14,144 + vpermq ymm3,ymm13,3 + vblendpd ymm14,ymm14,ymm3,1 + + vpermq ymm13,ymm13,144 + vpermq ymm3,ymm12,3 + vblendpd ymm13,ymm13,ymm3,1 + + vpermq ymm12,ymm12,144 + vpermq ymm3,ymm11,3 + vblendpd ymm12,ymm12,ymm3,1 + + vpermq ymm11,ymm11,144 + vpermq ymm3,ymm2,3 + vblendpd ymm11,ymm11,ymm3,1 + + vpermq ymm2,ymm2,144 + vpermq ymm3,ymm1,3 + vblendpd ymm2,ymm2,ymm3,1 + + vpermq ymm1,ymm1,144 + vpermq ymm3,ymm0,3 + vblendpd ymm1,ymm1,ymm3,1 + + vpermq ymm0,ymm0,144 + vpand ymm0,ymm0,YMMWORD[$L$high64x3] + + vmovupd ymm3,YMMWORD[rsp] + lea rsp,[32+rsp] + + + vpand ymm3,ymm3,YMMWORD[$L$mask52x4] + vpand ymm4,ymm4,YMMWORD[$L$mask52x4] + vpand ymm5,ymm5,YMMWORD[$L$mask52x4] + vpand ymm6,ymm6,YMMWORD[$L$mask52x4] + vpand ymm7,ymm7,YMMWORD[$L$mask52x4] + vpand ymm8,ymm8,YMMWORD[$L$mask52x4] + vpand ymm9,ymm9,YMMWORD[$L$mask52x4] + vpand ymm10,ymm10,YMMWORD[$L$mask52x4] + + + vpaddq ymm3,ymm3,ymm0 + vpaddq ymm4,ymm4,ymm1 + vpaddq ymm5,ymm5,ymm2 + vpaddq ymm6,ymm6,ymm11 + vpaddq ymm7,ymm7,ymm12 + vpaddq ymm8,ymm8,ymm13 + vpaddq ymm9,ymm9,ymm14 + vpaddq ymm10,ymm10,ymm15 + + + + vpcmpgtq ymm0,ymm3,YMMWORD[$L$mask52x4] + vpcmpgtq ymm1,ymm4,YMMWORD[$L$mask52x4] + vmovmskpd r14d,ymm0 + vmovmskpd r13d,ymm1 + shl r13b,4 + or r14b,r13b + + vpcmpgtq ymm2,ymm5,YMMWORD[$L$mask52x4] + vpcmpgtq ymm11,ymm6,YMMWORD[$L$mask52x4] + vmovmskpd r13d,ymm2 + vmovmskpd r12d,ymm11 + shl r12b,4 + or r13b,r12b + + vpcmpgtq ymm12,ymm7,YMMWORD[$L$mask52x4] + vpcmpgtq ymm13,ymm8,YMMWORD[$L$mask52x4] + vmovmskpd r12d,ymm12 + vmovmskpd r11d,ymm13 + shl r11b,4 + or r12b,r11b + + vpcmpgtq ymm14,ymm9,YMMWORD[$L$mask52x4] + vpcmpgtq ymm15,ymm10,YMMWORD[$L$mask52x4] + vmovmskpd r11d,ymm14 + vmovmskpd r10d,ymm15 + shl r10b,4 + or r11b,r10b + + add r14b,r14b + adc r13b,r13b + adc r12b,r12b + adc r11b,r11b + + + vpcmpeqq ymm0,ymm3,YMMWORD[$L$mask52x4] + vpcmpeqq ymm1,ymm4,YMMWORD[$L$mask52x4] + vmovmskpd r9d,ymm0 + vmovmskpd r8d,ymm1 + shl r8b,4 + or r9b,r8b + + vpcmpeqq ymm2,ymm5,YMMWORD[$L$mask52x4] + vpcmpeqq ymm11,ymm6,YMMWORD[$L$mask52x4] + vmovmskpd r8d,ymm2 + vmovmskpd edx,ymm11 + shl dl,4 + or r8b,dl + + vpcmpeqq ymm12,ymm7,YMMWORD[$L$mask52x4] + vpcmpeqq ymm13,ymm8,YMMWORD[$L$mask52x4] + vmovmskpd edx,ymm12 + vmovmskpd ecx,ymm13 + shl cl,4 + or dl,cl + + vpcmpeqq ymm14,ymm9,YMMWORD[$L$mask52x4] + vpcmpeqq ymm15,ymm10,YMMWORD[$L$mask52x4] + vmovmskpd ecx,ymm14 + vmovmskpd ebx,ymm15 + shl bl,4 + or cl,bl + + add r14b,r9b + adc r13b,r8b + adc r12b,dl + adc r11b,cl + + xor r14b,r9b + xor r13b,r8b + xor r12b,dl + xor r11b,cl + + lea rdx,[$L$kmasklut] + + mov r10b,r14b + and r14,0xf + vpsubq ymm0,ymm3,YMMWORD[$L$mask52x4] + shl r14,5 + vmovapd ymm2,YMMWORD[r14*1+rdx] + vblendvpd ymm3,ymm3,ymm0,ymm2 + + shr r10b,4 + and r10,0xf + vpsubq ymm0,ymm4,YMMWORD[$L$mask52x4] + shl r10,5 + vmovapd ymm2,YMMWORD[r10*1+rdx] + vblendvpd ymm4,ymm4,ymm0,ymm2 + + mov r10b,r13b + and r13,0xf + vpsubq ymm0,ymm5,YMMWORD[$L$mask52x4] + shl r13,5 + vmovapd ymm2,YMMWORD[r13*1+rdx] + vblendvpd ymm5,ymm5,ymm0,ymm2 + + shr r10b,4 + and r10,0xf + vpsubq ymm0,ymm6,YMMWORD[$L$mask52x4] + shl r10,5 + vmovapd ymm2,YMMWORD[r10*1+rdx] + vblendvpd ymm6,ymm6,ymm0,ymm2 + + mov r10b,r12b + and r12,0xf + vpsubq ymm0,ymm7,YMMWORD[$L$mask52x4] + shl r12,5 + vmovapd ymm2,YMMWORD[r12*1+rdx] + vblendvpd ymm7,ymm7,ymm0,ymm2 + + shr r10b,4 + and r10,0xf + vpsubq ymm0,ymm8,YMMWORD[$L$mask52x4] + shl r10,5 + vmovapd ymm2,YMMWORD[r10*1+rdx] + vblendvpd ymm8,ymm8,ymm0,ymm2 + + mov r10b,r11b + and r11,0xf + vpsubq ymm0,ymm9,YMMWORD[$L$mask52x4] + shl r11,5 + vmovapd ymm2,YMMWORD[r11*1+rdx] + vblendvpd ymm9,ymm9,ymm0,ymm2 + + shr r10b,4 + and r10,0xf + vpsubq ymm0,ymm10,YMMWORD[$L$mask52x4] + shl r10,5 + vmovapd ymm2,YMMWORD[r10*1+rdx] + vblendvpd ymm10,ymm10,ymm0,ymm2 + + vpand ymm3,ymm3,YMMWORD[$L$mask52x4] + vpand ymm4,ymm4,YMMWORD[$L$mask52x4] + vpand ymm5,ymm5,YMMWORD[$L$mask52x4] + vpand ymm6,ymm6,YMMWORD[$L$mask52x4] + vpand ymm7,ymm7,YMMWORD[$L$mask52x4] + vpand ymm8,ymm8,YMMWORD[$L$mask52x4] + vpand ymm9,ymm9,YMMWORD[$L$mask52x4] + + vpand ymm10,ymm10,YMMWORD[$L$mask52x4] + + vmovdqu YMMWORD[256+rdi],ymm3 + vmovdqu YMMWORD[288+rdi],ymm4 + vmovdqu YMMWORD[320+rdi],ymm5 + vmovdqu YMMWORD[352+rdi],ymm6 + vmovdqu YMMWORD[384+rdi],ymm7 + vmovdqu YMMWORD[416+rdi],ymm8 + vmovdqu YMMWORD[448+rdi],ymm9 + vmovdqu YMMWORD[480+rdi],ymm10 + + vzeroupper + lea rax,[rsp] + + vmovapd xmm6,XMMWORD[rax] + vmovapd xmm7,XMMWORD[16+rax] + vmovapd xmm8,XMMWORD[32+rax] + vmovapd xmm9,XMMWORD[48+rax] + vmovapd xmm10,XMMWORD[64+rax] + vmovapd xmm11,XMMWORD[80+rax] + vmovapd xmm12,XMMWORD[96+rax] + vmovapd xmm13,XMMWORD[112+rax] + vmovapd xmm14,XMMWORD[128+rax] + vmovapd xmm15,XMMWORD[144+rax] + lea rax,[168+rsp] + mov r15,QWORD[rax] + + mov r14,QWORD[8+rax] + + mov r13,QWORD[16+rax] + + mov r12,QWORD[24+rax] + + mov rbp,QWORD[32+rax] + + mov rbx,QWORD[40+rax] + + lea rsp,[48+rax] + +$L$ossl_rsaz_amm52x30_x2_avxifma256_epilogue: + mov rdi,QWORD[8+rsp] ;WIN64 epilogue + mov rsi,QWORD[16+rsp] + DB 0F3h,0C3h ;repret + +$L$SEH_end_ossl_rsaz_amm52x30_x2_avxifma256: +section .text code align=64 + + +ALIGN 32 +global ossl_extract_multiplier_2x30_win5_avx + +ossl_extract_multiplier_2x30_win5_avx: + +DB 243,15,30,250 + vmovapd ymm12,YMMWORD[$L$ones] + vmovq xmm8,r8 + vpbroadcastq ymm10,xmm8 + vmovq xmm8,r9 + vpbroadcastq ymm11,xmm8 + lea rax,[16384+rdx] + + + vpxor xmm0,xmm0,xmm0 + vmovapd ymm9,ymm0 + vmovapd ymm1,ymm0 + vmovapd ymm2,ymm0 + vmovapd ymm3,ymm0 + vmovapd ymm4,ymm0 + vmovapd ymm5,ymm0 + vmovapd ymm6,ymm0 + vmovapd ymm7,ymm0 + +ALIGN 32 +$L$loop: + vpcmpeqq ymm13,ymm10,ymm9 + vmovdqu ymm8,YMMWORD[rdx] + + vblendvpd ymm0,ymm0,ymm8,ymm13 + vmovdqu ymm8,YMMWORD[32+rdx] + + vblendvpd ymm1,ymm1,ymm8,ymm13 + vmovdqu ymm8,YMMWORD[64+rdx] + + vblendvpd ymm2,ymm2,ymm8,ymm13 + vmovdqu ymm8,YMMWORD[96+rdx] + + vblendvpd ymm3,ymm3,ymm8,ymm13 + vmovdqu ymm8,YMMWORD[128+rdx] + + vblendvpd ymm4,ymm4,ymm8,ymm13 + vmovdqu ymm8,YMMWORD[160+rdx] + + vblendvpd ymm5,ymm5,ymm8,ymm13 + vmovdqu ymm8,YMMWORD[192+rdx] + + vblendvpd ymm6,ymm6,ymm8,ymm13 + vmovdqu ymm8,YMMWORD[224+rdx] + + vblendvpd ymm7,ymm7,ymm8,ymm13 + vpaddq ymm9,ymm9,ymm12 + add rdx,512 + cmp rax,rdx + jne NEAR $L$loop + vmovdqu YMMWORD[rcx],ymm0 + vmovdqu YMMWORD[32+rcx],ymm1 + vmovdqu YMMWORD[64+rcx],ymm2 + vmovdqu YMMWORD[96+rcx],ymm3 + vmovdqu YMMWORD[128+rcx],ymm4 + vmovdqu YMMWORD[160+rcx],ymm5 + vmovdqu YMMWORD[192+rcx],ymm6 + vmovdqu YMMWORD[224+rcx],ymm7 + lea rdx,[((-16384))+rax] + + + vpxor xmm0,xmm0,xmm0 + vmovapd ymm9,ymm0 + vmovapd ymm0,ymm0 + vmovapd ymm1,ymm0 + vmovapd ymm2,ymm0 + vmovapd ymm3,ymm0 + vmovapd ymm4,ymm0 + vmovapd ymm5,ymm0 + vmovapd ymm6,ymm0 + vmovapd ymm7,ymm0 + +ALIGN 32 +$L$loop_8_15: + vpcmpeqq ymm13,ymm11,ymm9 + vmovdqu ymm8,YMMWORD[256+rdx] + + vblendvpd ymm0,ymm0,ymm8,ymm13 + vmovdqu ymm8,YMMWORD[288+rdx] + + vblendvpd ymm1,ymm1,ymm8,ymm13 + vmovdqu ymm8,YMMWORD[320+rdx] + + vblendvpd ymm2,ymm2,ymm8,ymm13 + vmovdqu ymm8,YMMWORD[352+rdx] + + vblendvpd ymm3,ymm3,ymm8,ymm13 + vmovdqu ymm8,YMMWORD[384+rdx] + + vblendvpd ymm4,ymm4,ymm8,ymm13 + vmovdqu ymm8,YMMWORD[416+rdx] + + vblendvpd ymm5,ymm5,ymm8,ymm13 + vmovdqu ymm8,YMMWORD[448+rdx] + + vblendvpd ymm6,ymm6,ymm8,ymm13 + vmovdqu ymm8,YMMWORD[480+rdx] + + vblendvpd ymm7,ymm7,ymm8,ymm13 + vpaddq ymm9,ymm9,ymm12 + add rdx,512 + cmp rax,rdx + jne NEAR $L$loop_8_15 + vmovdqu YMMWORD[256+rcx],ymm0 + vmovdqu YMMWORD[288+rcx],ymm1 + vmovdqu YMMWORD[320+rcx],ymm2 + vmovdqu YMMWORD[352+rcx],ymm3 + vmovdqu YMMWORD[384+rcx],ymm4 + vmovdqu YMMWORD[416+rcx],ymm5 + vmovdqu YMMWORD[448+rcx],ymm6 + vmovdqu YMMWORD[480+rcx],ymm7 + + DB 0F3h,0C3h ;repret + + +section .rdata rdata align=32 +ALIGN 32 +$L$ones: + DQ 1,1,1,1 +$L$zeros: + DQ 0,0,0,0 +EXTERN __imp_RtlVirtualUnwind + +ALIGN 16 +rsaz_avx_handler: + push rsi + push rdi + push rbx + push rbp + push r12 + push r13 + push r14 + push r15 + pushfq + sub rsp,64 + + mov rax,QWORD[120+r8] + mov rbx,QWORD[248+r8] + + mov rsi,QWORD[8+r9] + mov r11,QWORD[56+r9] + + mov r10d,DWORD[r11] + lea r10,[r10*1+rsi] + cmp rbx,r10 + jb NEAR $L$common_seh_tail + + mov r10d,DWORD[4+r11] + lea r10,[r10*1+rsi] + cmp rbx,r10 + jae NEAR $L$common_seh_tail + + mov rax,QWORD[152+r8] + + lea rsi,[rax] + lea rdi,[512+r8] + mov ecx,20 + DD 0xa548f3fc + + lea rax,[216+rax] + + mov rbx,QWORD[((-8))+rax] + mov rbp,QWORD[((-16))+rax] + mov r12,QWORD[((-24))+rax] + mov r13,QWORD[((-32))+rax] + mov r14,QWORD[((-40))+rax] + mov r15,QWORD[((-48))+rax] + mov QWORD[144+r8],rbx + mov QWORD[160+r8],rbp + mov QWORD[216+r8],r12 + mov QWORD[224+r8],r13 + mov QWORD[232+r8],r14 + mov QWORD[240+r8],r15 + +$L$common_seh_tail: + mov rdi,QWORD[8+rax] + mov rsi,QWORD[16+rax] + mov QWORD[152+r8],rax + mov QWORD[168+r8],rsi + mov QWORD[176+r8],rdi + + mov rdi,QWORD[40+r9] + mov rsi,r8 + mov ecx,154 + DD 0xa548f3fc + + mov rsi,r9 + xor rcx,rcx + mov rdx,QWORD[8+rsi] + mov r8,QWORD[rsi] + mov r9,QWORD[16+rsi] + mov r10,QWORD[40+rsi] + lea r11,[56+rsi] + lea r12,[24+rsi] + mov QWORD[32+rsp],r10 + mov QWORD[40+rsp],r11 + mov QWORD[48+rsp],r12 + mov QWORD[56+rsp],rcx + call QWORD[__imp_RtlVirtualUnwind] + + mov eax,1 + add rsp,64 + popfq + pop r15 + pop r14 + pop r13 + pop r12 + pop rbp + pop rbx + pop rdi + pop rsi + DB 0F3h,0C3h ;repret + + +section .pdata rdata align=4 +ALIGN 4 + DD $L$SEH_begin_ossl_rsaz_amm52x30_x1_avxifma256 wrt ..imagebase + DD $L$SEH_end_ossl_rsaz_amm52x30_x1_avxifma256 wrt ..imagebase + DD $L$SEH_info_ossl_rsaz_amm52x30_x1_avxifma256 wrt ..imagebase + + DD $L$SEH_begin_ossl_rsaz_amm52x30_x2_avxifma256 wrt ..imagebase + DD $L$SEH_end_ossl_rsaz_amm52x30_x2_avxifma256 wrt ..imagebase + DD $L$SEH_info_ossl_rsaz_amm52x30_x2_avxifma256 wrt ..imagebase + +section .xdata rdata align=8 +ALIGN 8 +$L$SEH_info_ossl_rsaz_amm52x30_x1_avxifma256: +DB 9,0,0,0 + DD rsaz_avx_handler wrt ..imagebase + DD $L$ossl_rsaz_amm52x30_x1_avxifma256_body wrt ..imagebase,$L$ossl_rsaz_amm52x30_x1_avxifma256_epilogue wrt ..imagebase +$L$SEH_info_ossl_rsaz_amm52x30_x2_avxifma256: +DB 9,0,0,0 + DD rsaz_avx_handler wrt ..imagebase + DD $L$ossl_rsaz_amm52x30_x2_avxifma256_body wrt ..imagebase,$L$ossl_rsaz_amm52x30_x2_avxifma256_epilogue wrt ..imagebase diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-4k-avxifma.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-4k-avxifma.nasm new file mode 100644 index 000000000000..3c718158808e --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/bn/rsaz-4k-avxifma.nasm @@ -0,0 +1,2081 @@ +default rel +%define XMMWORD +%define YMMWORD +%define ZMMWORD +section .text code align=64 + + +global ossl_rsaz_amm52x40_x1_avxifma256 + +ALIGN 32 +ossl_rsaz_amm52x40_x1_avxifma256: + mov QWORD[8+rsp],rdi ;WIN64 prologue + mov QWORD[16+rsp],rsi + mov rax,rsp +$L$SEH_begin_ossl_rsaz_amm52x40_x1_avxifma256: + mov rdi,rcx + mov rsi,rdx + mov rdx,r8 + mov rcx,r9 + mov r8,QWORD[40+rsp] + + + +DB 243,15,30,250 + push rbx + + push rbp + + push r12 + + push r13 + + push r14 + + push r15 + + lea rsp,[((-168))+rsp] + vmovapd XMMWORD[rsp],xmm6 + vmovapd XMMWORD[16+rsp],xmm7 + vmovapd XMMWORD[32+rsp],xmm8 + vmovapd XMMWORD[48+rsp],xmm9 + vmovapd XMMWORD[64+rsp],xmm10 + vmovapd XMMWORD[80+rsp],xmm11 + vmovapd XMMWORD[96+rsp],xmm12 + vmovapd XMMWORD[112+rsp],xmm13 + vmovapd XMMWORD[128+rsp],xmm14 + vmovapd XMMWORD[144+rsp],xmm15 +$L$ossl_rsaz_amm52x40_x1_avxifma256_body: + + vpxor ymm0,ymm0,ymm0 + vmovapd ymm3,ymm0 + vmovapd ymm4,ymm0 + vmovapd ymm5,ymm0 + vmovapd ymm6,ymm0 + vmovapd ymm7,ymm0 + vmovapd ymm8,ymm0 + vmovapd ymm9,ymm0 + vmovapd ymm10,ymm0 + vmovapd ymm11,ymm0 + vmovapd ymm12,ymm0 + + xor r9d,r9d + + mov r11,rdx + mov rax,0xfffffffffffff + + + mov ebx,10 + +ALIGN 32 +$L$loop10: + mov r13,QWORD[r11] + + vpbroadcastq ymm1,QWORD[r11] + mov rdx,QWORD[rsi] + mulx r12,r13,r13 + add r9,r13 + mov r10,r12 + adc r10,0 + + mov r13,r8 + imul r13,r9 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[rcx] + mulx r12,r13,r13 + add r9,r13 + adc r10,r12 + + shr r9,52 + sal r10,12 + or r9,r10 + + lea rsp,[((-328))+rsp] + +{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi] +{vex} vpmadd52luq ymm11,ymm1,YMMWORD[256+rsi] +{vex} vpmadd52luq ymm12,ymm1,YMMWORD[288+rsi] + +{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx] +{vex} vpmadd52luq ymm11,ymm2,YMMWORD[256+rcx] +{vex} vpmadd52luq ymm12,ymm2,YMMWORD[288+rcx] + vmovdqu YMMWORD[rsp],ymm3 + vmovdqu YMMWORD[32+rsp],ymm4 + vmovdqu YMMWORD[64+rsp],ymm5 + vmovdqu YMMWORD[96+rsp],ymm6 + vmovdqu YMMWORD[128+rsp],ymm7 + vmovdqu YMMWORD[160+rsp],ymm8 + vmovdqu YMMWORD[192+rsp],ymm9 + vmovdqu YMMWORD[224+rsp],ymm10 + vmovdqu YMMWORD[256+rsp],ymm11 + vmovdqu YMMWORD[288+rsp],ymm12 + mov QWORD[320+rsp],0 + + vmovdqu ymm3,YMMWORD[8+rsp] + vmovdqu ymm4,YMMWORD[40+rsp] + vmovdqu ymm5,YMMWORD[72+rsp] + vmovdqu ymm6,YMMWORD[104+rsp] + vmovdqu ymm7,YMMWORD[136+rsp] + vmovdqu ymm8,YMMWORD[168+rsp] + vmovdqu ymm9,YMMWORD[200+rsp] + vmovdqu ymm10,YMMWORD[232+rsp] + vmovdqu ymm11,YMMWORD[264+rsp] + vmovdqu ymm12,YMMWORD[296+rsp] + + add r9,QWORD[8+rsp] + +{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi] +{vex} vpmadd52huq ymm11,ymm1,YMMWORD[256+rsi] +{vex} vpmadd52huq ymm12,ymm1,YMMWORD[288+rsi] + +{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx] +{vex} vpmadd52huq ymm11,ymm2,YMMWORD[256+rcx] +{vex} vpmadd52huq ymm12,ymm2,YMMWORD[288+rcx] + lea rsp,[328+rsp] + mov r13,QWORD[8+r11] + + vpbroadcastq ymm1,QWORD[8+r11] + mov rdx,QWORD[rsi] + mulx r12,r13,r13 + add r9,r13 + mov r10,r12 + adc r10,0 + + mov r13,r8 + imul r13,r9 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[rcx] + mulx r12,r13,r13 + add r9,r13 + adc r10,r12 + + shr r9,52 + sal r10,12 + or r9,r10 + + lea rsp,[((-328))+rsp] + +{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi] +{vex} vpmadd52luq ymm11,ymm1,YMMWORD[256+rsi] +{vex} vpmadd52luq ymm12,ymm1,YMMWORD[288+rsi] + +{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx] +{vex} vpmadd52luq ymm11,ymm2,YMMWORD[256+rcx] +{vex} vpmadd52luq ymm12,ymm2,YMMWORD[288+rcx] + vmovdqu YMMWORD[rsp],ymm3 + vmovdqu YMMWORD[32+rsp],ymm4 + vmovdqu YMMWORD[64+rsp],ymm5 + vmovdqu YMMWORD[96+rsp],ymm6 + vmovdqu YMMWORD[128+rsp],ymm7 + vmovdqu YMMWORD[160+rsp],ymm8 + vmovdqu YMMWORD[192+rsp],ymm9 + vmovdqu YMMWORD[224+rsp],ymm10 + vmovdqu YMMWORD[256+rsp],ymm11 + vmovdqu YMMWORD[288+rsp],ymm12 + mov QWORD[320+rsp],0 + + vmovdqu ymm3,YMMWORD[8+rsp] + vmovdqu ymm4,YMMWORD[40+rsp] + vmovdqu ymm5,YMMWORD[72+rsp] + vmovdqu ymm6,YMMWORD[104+rsp] + vmovdqu ymm7,YMMWORD[136+rsp] + vmovdqu ymm8,YMMWORD[168+rsp] + vmovdqu ymm9,YMMWORD[200+rsp] + vmovdqu ymm10,YMMWORD[232+rsp] + vmovdqu ymm11,YMMWORD[264+rsp] + vmovdqu ymm12,YMMWORD[296+rsp] + + add r9,QWORD[8+rsp] + +{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi] +{vex} vpmadd52huq ymm11,ymm1,YMMWORD[256+rsi] +{vex} vpmadd52huq ymm12,ymm1,YMMWORD[288+rsi] + +{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx] +{vex} vpmadd52huq ymm11,ymm2,YMMWORD[256+rcx] +{vex} vpmadd52huq ymm12,ymm2,YMMWORD[288+rcx] + lea rsp,[328+rsp] + mov r13,QWORD[16+r11] + + vpbroadcastq ymm1,QWORD[16+r11] + mov rdx,QWORD[rsi] + mulx r12,r13,r13 + add r9,r13 + mov r10,r12 + adc r10,0 + + mov r13,r8 + imul r13,r9 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[rcx] + mulx r12,r13,r13 + add r9,r13 + adc r10,r12 + + shr r9,52 + sal r10,12 + or r9,r10 + + lea rsp,[((-328))+rsp] + +{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi] +{vex} vpmadd52luq ymm11,ymm1,YMMWORD[256+rsi] +{vex} vpmadd52luq ymm12,ymm1,YMMWORD[288+rsi] + +{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx] +{vex} vpmadd52luq ymm11,ymm2,YMMWORD[256+rcx] +{vex} vpmadd52luq ymm12,ymm2,YMMWORD[288+rcx] + vmovdqu YMMWORD[rsp],ymm3 + vmovdqu YMMWORD[32+rsp],ymm4 + vmovdqu YMMWORD[64+rsp],ymm5 + vmovdqu YMMWORD[96+rsp],ymm6 + vmovdqu YMMWORD[128+rsp],ymm7 + vmovdqu YMMWORD[160+rsp],ymm8 + vmovdqu YMMWORD[192+rsp],ymm9 + vmovdqu YMMWORD[224+rsp],ymm10 + vmovdqu YMMWORD[256+rsp],ymm11 + vmovdqu YMMWORD[288+rsp],ymm12 + mov QWORD[320+rsp],0 + + vmovdqu ymm3,YMMWORD[8+rsp] + vmovdqu ymm4,YMMWORD[40+rsp] + vmovdqu ymm5,YMMWORD[72+rsp] + vmovdqu ymm6,YMMWORD[104+rsp] + vmovdqu ymm7,YMMWORD[136+rsp] + vmovdqu ymm8,YMMWORD[168+rsp] + vmovdqu ymm9,YMMWORD[200+rsp] + vmovdqu ymm10,YMMWORD[232+rsp] + vmovdqu ymm11,YMMWORD[264+rsp] + vmovdqu ymm12,YMMWORD[296+rsp] + + add r9,QWORD[8+rsp] + +{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi] +{vex} vpmadd52huq ymm11,ymm1,YMMWORD[256+rsi] +{vex} vpmadd52huq ymm12,ymm1,YMMWORD[288+rsi] + +{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx] +{vex} vpmadd52huq ymm11,ymm2,YMMWORD[256+rcx] +{vex} vpmadd52huq ymm12,ymm2,YMMWORD[288+rcx] + lea rsp,[328+rsp] + mov r13,QWORD[24+r11] + + vpbroadcastq ymm1,QWORD[24+r11] + mov rdx,QWORD[rsi] + mulx r12,r13,r13 + add r9,r13 + mov r10,r12 + adc r10,0 + + mov r13,r8 + imul r13,r9 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[rcx] + mulx r12,r13,r13 + add r9,r13 + adc r10,r12 + + shr r9,52 + sal r10,12 + or r9,r10 + + lea rsp,[((-328))+rsp] + +{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi] +{vex} vpmadd52luq ymm11,ymm1,YMMWORD[256+rsi] +{vex} vpmadd52luq ymm12,ymm1,YMMWORD[288+rsi] + +{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx] +{vex} vpmadd52luq ymm11,ymm2,YMMWORD[256+rcx] +{vex} vpmadd52luq ymm12,ymm2,YMMWORD[288+rcx] + vmovdqu YMMWORD[rsp],ymm3 + vmovdqu YMMWORD[32+rsp],ymm4 + vmovdqu YMMWORD[64+rsp],ymm5 + vmovdqu YMMWORD[96+rsp],ymm6 + vmovdqu YMMWORD[128+rsp],ymm7 + vmovdqu YMMWORD[160+rsp],ymm8 + vmovdqu YMMWORD[192+rsp],ymm9 + vmovdqu YMMWORD[224+rsp],ymm10 + vmovdqu YMMWORD[256+rsp],ymm11 + vmovdqu YMMWORD[288+rsp],ymm12 + mov QWORD[320+rsp],0 + + vmovdqu ymm3,YMMWORD[8+rsp] + vmovdqu ymm4,YMMWORD[40+rsp] + vmovdqu ymm5,YMMWORD[72+rsp] + vmovdqu ymm6,YMMWORD[104+rsp] + vmovdqu ymm7,YMMWORD[136+rsp] + vmovdqu ymm8,YMMWORD[168+rsp] + vmovdqu ymm9,YMMWORD[200+rsp] + vmovdqu ymm10,YMMWORD[232+rsp] + vmovdqu ymm11,YMMWORD[264+rsp] + vmovdqu ymm12,YMMWORD[296+rsp] + + add r9,QWORD[8+rsp] + +{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi] +{vex} vpmadd52huq ymm11,ymm1,YMMWORD[256+rsi] +{vex} vpmadd52huq ymm12,ymm1,YMMWORD[288+rsi] + +{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx] +{vex} vpmadd52huq ymm11,ymm2,YMMWORD[256+rcx] +{vex} vpmadd52huq ymm12,ymm2,YMMWORD[288+rcx] + lea rsp,[328+rsp] + lea r11,[32+r11] + dec ebx + jne NEAR $L$loop10 + + vmovq xmm0,r9 + vpbroadcastq ymm0,xmm0 + vpblendd ymm3,ymm3,ymm0,3 + + lea rsp,[((-640))+rsp] + vmovupd YMMWORD[rsp],ymm3 + vmovupd YMMWORD[32+rsp],ymm4 + vmovupd YMMWORD[64+rsp],ymm5 + vmovupd YMMWORD[96+rsp],ymm6 + vmovupd YMMWORD[128+rsp],ymm7 + vmovupd YMMWORD[160+rsp],ymm8 + vmovupd YMMWORD[192+rsp],ymm9 + vmovupd YMMWORD[224+rsp],ymm10 + vmovupd YMMWORD[256+rsp],ymm11 + vmovupd YMMWORD[288+rsp],ymm12 + + + + vpsrlq ymm3,ymm3,52 + vpsrlq ymm4,ymm4,52 + vpsrlq ymm5,ymm5,52 + vpsrlq ymm6,ymm6,52 + vpsrlq ymm7,ymm7,52 + vpsrlq ymm8,ymm8,52 + vpsrlq ymm9,ymm9,52 + vpsrlq ymm10,ymm10,52 + vpsrlq ymm11,ymm11,52 + vpsrlq ymm12,ymm12,52 + + + vpermq ymm12,ymm12,144 + vpermq ymm13,ymm11,3 + vblendpd ymm12,ymm12,ymm13,1 + + vpermq ymm11,ymm11,144 + vpermq ymm13,ymm10,3 + vblendpd ymm11,ymm11,ymm13,1 + + vpermq ymm10,ymm10,144 + vpermq ymm13,ymm9,3 + vblendpd ymm10,ymm10,ymm13,1 + + vpermq ymm9,ymm9,144 + vpermq ymm13,ymm8,3 + vblendpd ymm9,ymm9,ymm13,1 + + vpermq ymm8,ymm8,144 + vpermq ymm13,ymm7,3 + vblendpd ymm8,ymm8,ymm13,1 + + vpermq ymm7,ymm7,144 + vpermq ymm13,ymm6,3 + vblendpd ymm7,ymm7,ymm13,1 + + vpermq ymm6,ymm6,144 + vpermq ymm13,ymm5,3 + vblendpd ymm6,ymm6,ymm13,1 + + vpermq ymm5,ymm5,144 + vpermq ymm13,ymm4,3 + vblendpd ymm5,ymm5,ymm13,1 + + vpermq ymm4,ymm4,144 + vpermq ymm13,ymm3,3 + vblendpd ymm4,ymm4,ymm13,1 + + vpermq ymm3,ymm3,144 + vpand ymm3,ymm3,YMMWORD[$L$high64x3] + + vmovupd YMMWORD[320+rsp],ymm3 + vmovupd YMMWORD[352+rsp],ymm4 + vmovupd YMMWORD[384+rsp],ymm5 + vmovupd YMMWORD[416+rsp],ymm6 + vmovupd YMMWORD[448+rsp],ymm7 + vmovupd YMMWORD[480+rsp],ymm8 + vmovupd YMMWORD[512+rsp],ymm9 + vmovupd YMMWORD[544+rsp],ymm10 + vmovupd YMMWORD[576+rsp],ymm11 + vmovupd YMMWORD[608+rsp],ymm12 + + vmovupd ymm3,YMMWORD[rsp] + vmovupd ymm4,YMMWORD[32+rsp] + vmovupd ymm5,YMMWORD[64+rsp] + vmovupd ymm6,YMMWORD[96+rsp] + vmovupd ymm7,YMMWORD[128+rsp] + vmovupd ymm8,YMMWORD[160+rsp] + vmovupd ymm9,YMMWORD[192+rsp] + vmovupd ymm10,YMMWORD[224+rsp] + vmovupd ymm11,YMMWORD[256+rsp] + vmovupd ymm12,YMMWORD[288+rsp] + + + vpand ymm3,ymm3,YMMWORD[$L$mask52x4] + vpand ymm4,ymm4,YMMWORD[$L$mask52x4] + vpand ymm5,ymm5,YMMWORD[$L$mask52x4] + vpand ymm6,ymm6,YMMWORD[$L$mask52x4] + vpand ymm7,ymm7,YMMWORD[$L$mask52x4] + vpand ymm8,ymm8,YMMWORD[$L$mask52x4] + vpand ymm9,ymm9,YMMWORD[$L$mask52x4] + vpand ymm10,ymm10,YMMWORD[$L$mask52x4] + vpand ymm11,ymm11,YMMWORD[$L$mask52x4] + vpand ymm12,ymm12,YMMWORD[$L$mask52x4] + + + vpaddq ymm3,ymm3,YMMWORD[320+rsp] + vpaddq ymm4,ymm4,YMMWORD[352+rsp] + vpaddq ymm5,ymm5,YMMWORD[384+rsp] + vpaddq ymm6,ymm6,YMMWORD[416+rsp] + vpaddq ymm7,ymm7,YMMWORD[448+rsp] + vpaddq ymm8,ymm8,YMMWORD[480+rsp] + vpaddq ymm9,ymm9,YMMWORD[512+rsp] + vpaddq ymm10,ymm10,YMMWORD[544+rsp] + vpaddq ymm11,ymm11,YMMWORD[576+rsp] + vpaddq ymm12,ymm12,YMMWORD[608+rsp] + + lea rsp,[640+rsp] + + + + vpcmpgtq ymm13,ymm3,YMMWORD[$L$mask52x4] + vmovmskpd r14d,ymm13 + vpcmpgtq ymm13,ymm4,YMMWORD[$L$mask52x4] + vmovmskpd r13d,ymm13 + shl r13b,4 + or r14b,r13b + + vpcmpgtq ymm13,ymm5,YMMWORD[$L$mask52x4] + vmovmskpd r13d,ymm13 + vpcmpgtq ymm13,ymm6,YMMWORD[$L$mask52x4] + vmovmskpd r12d,ymm13 + shl r12b,4 + or r13b,r12b + + vpcmpgtq ymm13,ymm7,YMMWORD[$L$mask52x4] + vmovmskpd r12d,ymm13 + vpcmpgtq ymm13,ymm8,YMMWORD[$L$mask52x4] + vmovmskpd r11d,ymm13 + shl r11b,4 + or r12b,r11b + + vpcmpgtq ymm13,ymm9,YMMWORD[$L$mask52x4] + vmovmskpd r11d,ymm13 + vpcmpgtq ymm13,ymm10,YMMWORD[$L$mask52x4] + vmovmskpd r10d,ymm13 + shl r10b,4 + or r11b,r10b + + vpcmpgtq ymm13,ymm11,YMMWORD[$L$mask52x4] + vmovmskpd r10d,ymm13 + vpcmpgtq ymm13,ymm12,YMMWORD[$L$mask52x4] + vmovmskpd r9d,ymm13 + shl r9b,4 + or r10b,r9b + + add r14b,r14b + adc r13b,r13b + adc r12b,r12b + adc r11b,r11b + adc r10b,r10b + + + vpcmpeqq ymm13,ymm3,YMMWORD[$L$mask52x4] + vmovmskpd r9d,ymm13 + vpcmpeqq ymm13,ymm4,YMMWORD[$L$mask52x4] + vmovmskpd r8d,ymm13 + shl r8b,4 + or r9b,r8b + + vpcmpeqq ymm13,ymm5,YMMWORD[$L$mask52x4] + vmovmskpd r8d,ymm13 + vpcmpeqq ymm13,ymm6,YMMWORD[$L$mask52x4] + vmovmskpd edx,ymm13 + shl dl,4 + or r8b,dl + + vpcmpeqq ymm13,ymm7,YMMWORD[$L$mask52x4] + vmovmskpd edx,ymm13 + vpcmpeqq ymm13,ymm8,YMMWORD[$L$mask52x4] + vmovmskpd ecx,ymm13 + shl cl,4 + or dl,cl + + vpcmpeqq ymm13,ymm9,YMMWORD[$L$mask52x4] + vmovmskpd ecx,ymm13 + vpcmpeqq ymm13,ymm10,YMMWORD[$L$mask52x4] + vmovmskpd ebx,ymm13 + shl bl,4 + or cl,bl + + vpcmpeqq ymm13,ymm11,YMMWORD[$L$mask52x4] + vmovmskpd ebx,ymm13 + vpcmpeqq ymm13,ymm12,YMMWORD[$L$mask52x4] + vmovmskpd eax,ymm13 + shl al,4 + or bl,al + + add r14b,r9b + adc r13b,r8b + adc r12b,dl + adc r11b,cl + adc r10b,bl + + xor r14b,r9b + xor r13b,r8b + xor r12b,dl + xor r11b,cl + xor r10b,bl + + push r9 + push r8 + + lea r8,[$L$kmasklut] + + mov r9b,r14b + and r14,0xf + vpsubq ymm13,ymm3,YMMWORD[$L$mask52x4] + shl r14,5 + vmovapd ymm14,YMMWORD[r14*1+r8] + vblendvpd ymm3,ymm3,ymm13,ymm14 + + shr r9b,4 + and r9,0xf + vpsubq ymm13,ymm4,YMMWORD[$L$mask52x4] + shl r9,5 + vmovapd ymm14,YMMWORD[r9*1+r8] + vblendvpd ymm4,ymm4,ymm13,ymm14 + + mov r9b,r13b + and r13,0xf + vpsubq ymm13,ymm5,YMMWORD[$L$mask52x4] + shl r13,5 + vmovapd ymm14,YMMWORD[r13*1+r8] + vblendvpd ymm5,ymm5,ymm13,ymm14 + + shr r9b,4 + and r9,0xf + vpsubq ymm13,ymm6,YMMWORD[$L$mask52x4] + shl r9,5 + vmovapd ymm14,YMMWORD[r9*1+r8] + vblendvpd ymm6,ymm6,ymm13,ymm14 + + mov r9b,r12b + and r12,0xf + vpsubq ymm13,ymm7,YMMWORD[$L$mask52x4] + shl r12,5 + vmovapd ymm14,YMMWORD[r12*1+r8] + vblendvpd ymm7,ymm7,ymm13,ymm14 + + shr r9b,4 + and r9,0xf + vpsubq ymm13,ymm8,YMMWORD[$L$mask52x4] + shl r9,5 + vmovapd ymm14,YMMWORD[r9*1+r8] + vblendvpd ymm8,ymm8,ymm13,ymm14 + + mov r9b,r11b + and r11,0xf + vpsubq ymm13,ymm9,YMMWORD[$L$mask52x4] + shl r11,5 + vmovapd ymm14,YMMWORD[r11*1+r8] + vblendvpd ymm9,ymm9,ymm13,ymm14 + + shr r9b,4 + and r9,0xf + vpsubq ymm13,ymm10,YMMWORD[$L$mask52x4] + shl r9,5 + vmovapd ymm14,YMMWORD[r9*1+r8] + vblendvpd ymm10,ymm10,ymm13,ymm14 + + mov r9b,r10b + and r10,0xf + vpsubq ymm13,ymm11,YMMWORD[$L$mask52x4] + shl r10,5 + vmovapd ymm14,YMMWORD[r10*1+r8] + vblendvpd ymm11,ymm11,ymm13,ymm14 + + shr r9b,4 + and r9,0xf + vpsubq ymm13,ymm12,YMMWORD[$L$mask52x4] + shl r9,5 + vmovapd ymm14,YMMWORD[r9*1+r8] + vblendvpd ymm12,ymm12,ymm13,ymm14 + + pop r8 + pop r9 + + vpand ymm3,ymm3,YMMWORD[$L$mask52x4] + vpand ymm4,ymm4,YMMWORD[$L$mask52x4] + vpand ymm5,ymm5,YMMWORD[$L$mask52x4] + vpand ymm6,ymm6,YMMWORD[$L$mask52x4] + vpand ymm7,ymm7,YMMWORD[$L$mask52x4] + vpand ymm8,ymm8,YMMWORD[$L$mask52x4] + vpand ymm9,ymm9,YMMWORD[$L$mask52x4] + + vpand ymm10,ymm10,YMMWORD[$L$mask52x4] + vpand ymm11,ymm11,YMMWORD[$L$mask52x4] + vpand ymm12,ymm12,YMMWORD[$L$mask52x4] + + vmovdqu YMMWORD[rdi],ymm3 + vmovdqu YMMWORD[32+rdi],ymm4 + vmovdqu YMMWORD[64+rdi],ymm5 + vmovdqu YMMWORD[96+rdi],ymm6 + vmovdqu YMMWORD[128+rdi],ymm7 + vmovdqu YMMWORD[160+rdi],ymm8 + vmovdqu YMMWORD[192+rdi],ymm9 + vmovdqu YMMWORD[224+rdi],ymm10 + vmovdqu YMMWORD[256+rdi],ymm11 + vmovdqu YMMWORD[288+rdi],ymm12 + + vzeroupper + lea rax,[rsp] + + vmovapd xmm6,XMMWORD[rax] + vmovapd xmm7,XMMWORD[16+rax] + vmovapd xmm8,XMMWORD[32+rax] + vmovapd xmm9,XMMWORD[48+rax] + vmovapd xmm10,XMMWORD[64+rax] + vmovapd xmm11,XMMWORD[80+rax] + vmovapd xmm12,XMMWORD[96+rax] + vmovapd xmm13,XMMWORD[112+rax] + vmovapd xmm14,XMMWORD[128+rax] + vmovapd xmm15,XMMWORD[144+rax] + lea rax,[168+rsp] + mov r15,QWORD[rax] + + mov r14,QWORD[8+rax] + + mov r13,QWORD[16+rax] + + mov r12,QWORD[24+rax] + + mov rbp,QWORD[32+rax] + + mov rbx,QWORD[40+rax] + + lea rsp,[48+rax] + +$L$ossl_rsaz_amm52x40_x1_avxifma256_epilogue: + + mov rdi,QWORD[8+rsp] ;WIN64 epilogue + mov rsi,QWORD[16+rsp] + DB 0F3h,0C3h ;repret + +$L$SEH_end_ossl_rsaz_amm52x40_x1_avxifma256: +section .rdata rdata align=32 +ALIGN 32 +$L$mask52x4: + DQ 0xfffffffffffff + DQ 0xfffffffffffff + DQ 0xfffffffffffff + DQ 0xfffffffffffff +$L$high64x3: + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff +$L$kmasklut: + + DQ 0x0 + DQ 0x0 + DQ 0x0 + DQ 0x0 + + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0x0 + DQ 0x0 + + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0x0 + + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0x0 + + DQ 0x0 + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0x0 + + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0x0 + + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0x0 + + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0x0 + + DQ 0x0 + DQ 0x0 + DQ 0x0 + DQ 0xffffffffffffffff + + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0x0 + DQ 0xffffffffffffffff + + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0xffffffffffffffff + + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0xffffffffffffffff + + DQ 0x0 + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + + DQ 0xffffffffffffffff + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + + DQ 0x0 + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff + DQ 0xffffffffffffffff +section .text code align=64 + + +global ossl_rsaz_amm52x40_x2_avxifma256 + +ALIGN 32 +ossl_rsaz_amm52x40_x2_avxifma256: + mov QWORD[8+rsp],rdi ;WIN64 prologue + mov QWORD[16+rsp],rsi + mov rax,rsp +$L$SEH_begin_ossl_rsaz_amm52x40_x2_avxifma256: + mov rdi,rcx + mov rsi,rdx + mov rdx,r8 + mov rcx,r9 + mov r8,QWORD[40+rsp] + + + +DB 243,15,30,250 + push rbx + + push rbp + + push r12 + + push r13 + + push r14 + + push r15 + + lea rsp,[((-168))+rsp] + vmovapd XMMWORD[rsp],xmm6 + vmovapd XMMWORD[16+rsp],xmm7 + vmovapd XMMWORD[32+rsp],xmm8 + vmovapd XMMWORD[48+rsp],xmm9 + vmovapd XMMWORD[64+rsp],xmm10 + vmovapd XMMWORD[80+rsp],xmm11 + vmovapd XMMWORD[96+rsp],xmm12 + vmovapd XMMWORD[112+rsp],xmm13 + vmovapd XMMWORD[128+rsp],xmm14 + vmovapd XMMWORD[144+rsp],xmm15 +$L$ossl_rsaz_amm52x40_x2_avxifma256_body: + + vpxor ymm0,ymm0,ymm0 + vmovapd ymm3,ymm0 + vmovapd ymm4,ymm0 + vmovapd ymm5,ymm0 + vmovapd ymm6,ymm0 + vmovapd ymm7,ymm0 + vmovapd ymm8,ymm0 + vmovapd ymm9,ymm0 + vmovapd ymm10,ymm0 + vmovapd ymm11,ymm0 + vmovapd ymm12,ymm0 + + xor r9d,r9d + + mov r11,rdx + mov rax,0xfffffffffffff + + mov ebx,40 + +ALIGN 32 +$L$loop40: + mov r13,QWORD[r11] + + vpbroadcastq ymm1,QWORD[r11] + mov rdx,QWORD[rsi] + mulx r12,r13,r13 + add r9,r13 + mov r10,r12 + adc r10,0 + + mov r13,QWORD[r8] + imul r13,r9 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[rcx] + mulx r12,r13,r13 + add r9,r13 + adc r10,r12 + + shr r9,52 + sal r10,12 + or r9,r10 + + lea rsp,[((-328))+rsp] + +{vex} vpmadd52luq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52luq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52luq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52luq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52luq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52luq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52luq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52luq ymm10,ymm1,YMMWORD[224+rsi] +{vex} vpmadd52luq ymm11,ymm1,YMMWORD[256+rsi] +{vex} vpmadd52luq ymm12,ymm1,YMMWORD[288+rsi] + +{vex} vpmadd52luq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52luq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52luq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52luq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52luq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52luq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52luq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52luq ymm10,ymm2,YMMWORD[224+rcx] +{vex} vpmadd52luq ymm11,ymm2,YMMWORD[256+rcx] +{vex} vpmadd52luq ymm12,ymm2,YMMWORD[288+rcx] + vmovdqu YMMWORD[rsp],ymm3 + vmovdqu YMMWORD[32+rsp],ymm4 + vmovdqu YMMWORD[64+rsp],ymm5 + vmovdqu YMMWORD[96+rsp],ymm6 + vmovdqu YMMWORD[128+rsp],ymm7 + vmovdqu YMMWORD[160+rsp],ymm8 + vmovdqu YMMWORD[192+rsp],ymm9 + vmovdqu YMMWORD[224+rsp],ymm10 + vmovdqu YMMWORD[256+rsp],ymm11 + vmovdqu YMMWORD[288+rsp],ymm12 + mov QWORD[320+rsp],0 + + vmovdqu ymm3,YMMWORD[8+rsp] + vmovdqu ymm4,YMMWORD[40+rsp] + vmovdqu ymm5,YMMWORD[72+rsp] + vmovdqu ymm6,YMMWORD[104+rsp] + vmovdqu ymm7,YMMWORD[136+rsp] + vmovdqu ymm8,YMMWORD[168+rsp] + vmovdqu ymm9,YMMWORD[200+rsp] + vmovdqu ymm10,YMMWORD[232+rsp] + vmovdqu ymm11,YMMWORD[264+rsp] + vmovdqu ymm12,YMMWORD[296+rsp] + + add r9,QWORD[8+rsp] + +{vex} vpmadd52huq ymm3,ymm1,YMMWORD[rsi] +{vex} vpmadd52huq ymm4,ymm1,YMMWORD[32+rsi] +{vex} vpmadd52huq ymm5,ymm1,YMMWORD[64+rsi] +{vex} vpmadd52huq ymm6,ymm1,YMMWORD[96+rsi] +{vex} vpmadd52huq ymm7,ymm1,YMMWORD[128+rsi] +{vex} vpmadd52huq ymm8,ymm1,YMMWORD[160+rsi] +{vex} vpmadd52huq ymm9,ymm1,YMMWORD[192+rsi] +{vex} vpmadd52huq ymm10,ymm1,YMMWORD[224+rsi] +{vex} vpmadd52huq ymm11,ymm1,YMMWORD[256+rsi] +{vex} vpmadd52huq ymm12,ymm1,YMMWORD[288+rsi] + +{vex} vpmadd52huq ymm3,ymm2,YMMWORD[rcx] +{vex} vpmadd52huq ymm4,ymm2,YMMWORD[32+rcx] +{vex} vpmadd52huq ymm5,ymm2,YMMWORD[64+rcx] +{vex} vpmadd52huq ymm6,ymm2,YMMWORD[96+rcx] +{vex} vpmadd52huq ymm7,ymm2,YMMWORD[128+rcx] +{vex} vpmadd52huq ymm8,ymm2,YMMWORD[160+rcx] +{vex} vpmadd52huq ymm9,ymm2,YMMWORD[192+rcx] +{vex} vpmadd52huq ymm10,ymm2,YMMWORD[224+rcx] +{vex} vpmadd52huq ymm11,ymm2,YMMWORD[256+rcx] +{vex} vpmadd52huq ymm12,ymm2,YMMWORD[288+rcx] + lea rsp,[328+rsp] + lea r11,[8+r11] + dec ebx + jne NEAR $L$loop40 + + push r11 + push rsi + push rcx + push r8 + + vmovq xmm0,r9 + vpbroadcastq ymm0,xmm0 + vpblendd ymm3,ymm3,ymm0,3 + + lea rsp,[((-640))+rsp] + vmovupd YMMWORD[rsp],ymm3 + vmovupd YMMWORD[32+rsp],ymm4 + vmovupd YMMWORD[64+rsp],ymm5 + vmovupd YMMWORD[96+rsp],ymm6 + vmovupd YMMWORD[128+rsp],ymm7 + vmovupd YMMWORD[160+rsp],ymm8 + vmovupd YMMWORD[192+rsp],ymm9 + vmovupd YMMWORD[224+rsp],ymm10 + vmovupd YMMWORD[256+rsp],ymm11 + vmovupd YMMWORD[288+rsp],ymm12 + + + + vpsrlq ymm3,ymm3,52 + vpsrlq ymm4,ymm4,52 + vpsrlq ymm5,ymm5,52 + vpsrlq ymm6,ymm6,52 + vpsrlq ymm7,ymm7,52 + vpsrlq ymm8,ymm8,52 + vpsrlq ymm9,ymm9,52 + vpsrlq ymm10,ymm10,52 + vpsrlq ymm11,ymm11,52 + vpsrlq ymm12,ymm12,52 + + + vpermq ymm12,ymm12,144 + vpermq ymm13,ymm11,3 + vblendpd ymm12,ymm12,ymm13,1 + + vpermq ymm11,ymm11,144 + vpermq ymm13,ymm10,3 + vblendpd ymm11,ymm11,ymm13,1 + + vpermq ymm10,ymm10,144 + vpermq ymm13,ymm9,3 + vblendpd ymm10,ymm10,ymm13,1 + + vpermq ymm9,ymm9,144 + vpermq ymm13,ymm8,3 + vblendpd ymm9,ymm9,ymm13,1 + + vpermq ymm8,ymm8,144 + vpermq ymm13,ymm7,3 + vblendpd ymm8,ymm8,ymm13,1 + + vpermq ymm7,ymm7,144 + vpermq ymm13,ymm6,3 + vblendpd ymm7,ymm7,ymm13,1 + + vpermq ymm6,ymm6,144 + vpermq ymm13,ymm5,3 + vblendpd ymm6,ymm6,ymm13,1 + + vpermq ymm5,ymm5,144 + vpermq ymm13,ymm4,3 + vblendpd ymm5,ymm5,ymm13,1 + + vpermq ymm4,ymm4,144 + vpermq ymm13,ymm3,3 + vblendpd ymm4,ymm4,ymm13,1 + + vpermq ymm3,ymm3,144 + vpand ymm3,ymm3,YMMWORD[$L$high64x3] + + vmovupd YMMWORD[320+rsp],ymm3 + vmovupd YMMWORD[352+rsp],ymm4 + vmovupd YMMWORD[384+rsp],ymm5 + vmovupd YMMWORD[416+rsp],ymm6 + vmovupd YMMWORD[448+rsp],ymm7 + vmovupd YMMWORD[480+rsp],ymm8 + vmovupd YMMWORD[512+rsp],ymm9 + vmovupd YMMWORD[544+rsp],ymm10 + vmovupd YMMWORD[576+rsp],ymm11 + vmovupd YMMWORD[608+rsp],ymm12 + + vmovupd ymm3,YMMWORD[rsp] + vmovupd ymm4,YMMWORD[32+rsp] + vmovupd ymm5,YMMWORD[64+rsp] + vmovupd ymm6,YMMWORD[96+rsp] + vmovupd ymm7,YMMWORD[128+rsp] + vmovupd ymm8,YMMWORD[160+rsp] + vmovupd ymm9,YMMWORD[192+rsp] + vmovupd ymm10,YMMWORD[224+rsp] + vmovupd ymm11,YMMWORD[256+rsp] + vmovupd ymm12,YMMWORD[288+rsp] + + + vpand ymm3,ymm3,YMMWORD[$L$mask52x4] + vpand ymm4,ymm4,YMMWORD[$L$mask52x4] + vpand ymm5,ymm5,YMMWORD[$L$mask52x4] + vpand ymm6,ymm6,YMMWORD[$L$mask52x4] + vpand ymm7,ymm7,YMMWORD[$L$mask52x4] + vpand ymm8,ymm8,YMMWORD[$L$mask52x4] + vpand ymm9,ymm9,YMMWORD[$L$mask52x4] + vpand ymm10,ymm10,YMMWORD[$L$mask52x4] + vpand ymm11,ymm11,YMMWORD[$L$mask52x4] + vpand ymm12,ymm12,YMMWORD[$L$mask52x4] + + + vpaddq ymm3,ymm3,YMMWORD[320+rsp] + vpaddq ymm4,ymm4,YMMWORD[352+rsp] + vpaddq ymm5,ymm5,YMMWORD[384+rsp] + vpaddq ymm6,ymm6,YMMWORD[416+rsp] + vpaddq ymm7,ymm7,YMMWORD[448+rsp] + vpaddq ymm8,ymm8,YMMWORD[480+rsp] + vpaddq ymm9,ymm9,YMMWORD[512+rsp] + vpaddq ymm10,ymm10,YMMWORD[544+rsp] + vpaddq ymm11,ymm11,YMMWORD[576+rsp] + vpaddq ymm12,ymm12,YMMWORD[608+rsp] + + lea rsp,[640+rsp] + + + + vpcmpgtq ymm13,ymm3,YMMWORD[$L$mask52x4] + vmovmskpd r14d,ymm13 + vpcmpgtq ymm13,ymm4,YMMWORD[$L$mask52x4] + vmovmskpd r13d,ymm13 + shl r13b,4 + or r14b,r13b + + vpcmpgtq ymm13,ymm5,YMMWORD[$L$mask52x4] + vmovmskpd r13d,ymm13 + vpcmpgtq ymm13,ymm6,YMMWORD[$L$mask52x4] + vmovmskpd r12d,ymm13 + shl r12b,4 + or r13b,r12b + + vpcmpgtq ymm13,ymm7,YMMWORD[$L$mask52x4] + vmovmskpd r12d,ymm13 + vpcmpgtq ymm13,ymm8,YMMWORD[$L$mask52x4] + vmovmskpd r11d,ymm13 + shl r11b,4 + or r12b,r11b + + vpcmpgtq ymm13,ymm9,YMMWORD[$L$mask52x4] + vmovmskpd r11d,ymm13 + vpcmpgtq ymm13,ymm10,YMMWORD[$L$mask52x4] + vmovmskpd r10d,ymm13 + shl r10b,4 + or r11b,r10b + + vpcmpgtq ymm13,ymm11,YMMWORD[$L$mask52x4] + vmovmskpd r10d,ymm13 + vpcmpgtq ymm13,ymm12,YMMWORD[$L$mask52x4] + vmovmskpd r9d,ymm13 + shl r9b,4 + or r10b,r9b + + add r14b,r14b + adc r13b,r13b + adc r12b,r12b + adc r11b,r11b + adc r10b,r10b + + + vpcmpeqq ymm13,ymm3,YMMWORD[$L$mask52x4] + vmovmskpd r9d,ymm13 + vpcmpeqq ymm13,ymm4,YMMWORD[$L$mask52x4] + vmovmskpd r8d,ymm13 + shl r8b,4 + or r9b,r8b + + vpcmpeqq ymm13,ymm5,YMMWORD[$L$mask52x4] + vmovmskpd r8d,ymm13 + vpcmpeqq ymm13,ymm6,YMMWORD[$L$mask52x4] + vmovmskpd edx,ymm13 + shl dl,4 + or r8b,dl + + vpcmpeqq ymm13,ymm7,YMMWORD[$L$mask52x4] + vmovmskpd edx,ymm13 + vpcmpeqq ymm13,ymm8,YMMWORD[$L$mask52x4] + vmovmskpd ecx,ymm13 + shl cl,4 + or dl,cl + + vpcmpeqq ymm13,ymm9,YMMWORD[$L$mask52x4] + vmovmskpd ecx,ymm13 + vpcmpeqq ymm13,ymm10,YMMWORD[$L$mask52x4] + vmovmskpd ebx,ymm13 + shl bl,4 + or cl,bl + + vpcmpeqq ymm13,ymm11,YMMWORD[$L$mask52x4] + vmovmskpd ebx,ymm13 + vpcmpeqq ymm13,ymm12,YMMWORD[$L$mask52x4] + vmovmskpd eax,ymm13 + shl al,4 + or bl,al + + add r14b,r9b + adc r13b,r8b + adc r12b,dl + adc r11b,cl + adc r10b,bl + + xor r14b,r9b + xor r13b,r8b + xor r12b,dl + xor r11b,cl + xor r10b,bl + + push r9 + push r8 + + lea r8,[$L$kmasklut] + + mov r9b,r14b + and r14,0xf + vpsubq ymm13,ymm3,YMMWORD[$L$mask52x4] + shl r14,5 + vmovapd ymm14,YMMWORD[r14*1+r8] + vblendvpd ymm3,ymm3,ymm13,ymm14 + + shr r9b,4 + and r9,0xf + vpsubq ymm13,ymm4,YMMWORD[$L$mask52x4] + shl r9,5 + vmovapd ymm14,YMMWORD[r9*1+r8] + vblendvpd ymm4,ymm4,ymm13,ymm14 + + mov r9b,r13b + and r13,0xf + vpsubq ymm13,ymm5,YMMWORD[$L$mask52x4] + shl r13,5 + vmovapd ymm14,YMMWORD[r13*1+r8] + vblendvpd ymm5,ymm5,ymm13,ymm14 + + shr r9b,4 + and r9,0xf + vpsubq ymm13,ymm6,YMMWORD[$L$mask52x4] + shl r9,5 + vmovapd ymm14,YMMWORD[r9*1+r8] + vblendvpd ymm6,ymm6,ymm13,ymm14 + + mov r9b,r12b + and r12,0xf + vpsubq ymm13,ymm7,YMMWORD[$L$mask52x4] + shl r12,5 + vmovapd ymm14,YMMWORD[r12*1+r8] + vblendvpd ymm7,ymm7,ymm13,ymm14 + + shr r9b,4 + and r9,0xf + vpsubq ymm13,ymm8,YMMWORD[$L$mask52x4] + shl r9,5 + vmovapd ymm14,YMMWORD[r9*1+r8] + vblendvpd ymm8,ymm8,ymm13,ymm14 + + mov r9b,r11b + and r11,0xf + vpsubq ymm13,ymm9,YMMWORD[$L$mask52x4] + shl r11,5 + vmovapd ymm14,YMMWORD[r11*1+r8] + vblendvpd ymm9,ymm9,ymm13,ymm14 + + shr r9b,4 + and r9,0xf + vpsubq ymm13,ymm10,YMMWORD[$L$mask52x4] + shl r9,5 + vmovapd ymm14,YMMWORD[r9*1+r8] + vblendvpd ymm10,ymm10,ymm13,ymm14 + + mov r9b,r10b + and r10,0xf + vpsubq ymm13,ymm11,YMMWORD[$L$mask52x4] + shl r10,5 + vmovapd ymm14,YMMWORD[r10*1+r8] + vblendvpd ymm11,ymm11,ymm13,ymm14 + + shr r9b,4 + and r9,0xf + vpsubq ymm13,ymm12,YMMWORD[$L$mask52x4] + shl r9,5 + vmovapd ymm14,YMMWORD[r9*1+r8] + vblendvpd ymm12,ymm12,ymm13,ymm14 + + pop r8 + pop r9 + + vpand ymm3,ymm3,YMMWORD[$L$mask52x4] + vpand ymm4,ymm4,YMMWORD[$L$mask52x4] + vpand ymm5,ymm5,YMMWORD[$L$mask52x4] + vpand ymm6,ymm6,YMMWORD[$L$mask52x4] + vpand ymm7,ymm7,YMMWORD[$L$mask52x4] + vpand ymm8,ymm8,YMMWORD[$L$mask52x4] + vpand ymm9,ymm9,YMMWORD[$L$mask52x4] + + vpand ymm10,ymm10,YMMWORD[$L$mask52x4] + vpand ymm11,ymm11,YMMWORD[$L$mask52x4] + vpand ymm12,ymm12,YMMWORD[$L$mask52x4] + + pop r8 + pop rcx + pop rsi + pop r11 + + vmovdqu YMMWORD[rdi],ymm3 + vmovdqu YMMWORD[32+rdi],ymm4 + vmovdqu YMMWORD[64+rdi],ymm5 + vmovdqu YMMWORD[96+rdi],ymm6 + vmovdqu YMMWORD[128+rdi],ymm7 + vmovdqu YMMWORD[160+rdi],ymm8 + vmovdqu YMMWORD[192+rdi],ymm9 + vmovdqu YMMWORD[224+rdi],ymm10 + vmovdqu YMMWORD[256+rdi],ymm11 + vmovdqu YMMWORD[288+rdi],ymm12 + + xor r15d,r15d + + mov rax,0xfffffffffffff + + mov ebx,40 + + vpxor ymm0,ymm0,ymm0 + vmovapd ymm3,ymm0 + vmovapd ymm4,ymm0 + vmovapd ymm5,ymm0 + vmovapd ymm6,ymm0 + vmovapd ymm7,ymm0 + vmovapd ymm8,ymm0 + vmovapd ymm9,ymm0 + vmovapd ymm10,ymm0 + vmovapd ymm11,ymm0 + vmovapd ymm12,ymm0 +ALIGN 32 +$L$loop40_1: + mov r13,QWORD[r11] + + vpbroadcastq ymm1,QWORD[r11] + mov rdx,QWORD[320+rsi] + mulx r12,r13,r13 + add r9,r13 + mov r10,r12 + adc r10,0 + + mov r13,QWORD[8+r8] + imul r13,r9 + and r13,rax + + vmovq xmm2,r13 + vpbroadcastq ymm2,xmm2 + mov rdx,QWORD[320+rcx] + mulx r12,r13,r13 + add r9,r13 + adc r10,r12 + + shr r9,52 + sal r10,12 + or r9,r10 + + lea rsp,[((-328))+rsp] + +{vex} vpmadd52luq ymm3,ymm1,YMMWORD[320+rsi] +{vex} vpmadd52luq ymm4,ymm1,YMMWORD[352+rsi] +{vex} vpmadd52luq ymm5,ymm1,YMMWORD[384+rsi] +{vex} vpmadd52luq ymm6,ymm1,YMMWORD[416+rsi] +{vex} vpmadd52luq ymm7,ymm1,YMMWORD[448+rsi] +{vex} vpmadd52luq ymm8,ymm1,YMMWORD[480+rsi] +{vex} vpmadd52luq ymm9,ymm1,YMMWORD[512+rsi] +{vex} vpmadd52luq ymm10,ymm1,YMMWORD[544+rsi] +{vex} vpmadd52luq ymm11,ymm1,YMMWORD[576+rsi] +{vex} vpmadd52luq ymm12,ymm1,YMMWORD[608+rsi] + +{vex} vpmadd52luq ymm3,ymm2,YMMWORD[320+rcx] +{vex} vpmadd52luq ymm4,ymm2,YMMWORD[352+rcx] +{vex} vpmadd52luq ymm5,ymm2,YMMWORD[384+rcx] +{vex} vpmadd52luq ymm6,ymm2,YMMWORD[416+rcx] +{vex} vpmadd52luq ymm7,ymm2,YMMWORD[448+rcx] +{vex} vpmadd52luq ymm8,ymm2,YMMWORD[480+rcx] +{vex} vpmadd52luq ymm9,ymm2,YMMWORD[512+rcx] +{vex} vpmadd52luq ymm10,ymm2,YMMWORD[544+rcx] +{vex} vpmadd52luq ymm11,ymm2,YMMWORD[576+rcx] +{vex} vpmadd52luq ymm12,ymm2,YMMWORD[608+rcx] + vmovdqu YMMWORD[rsp],ymm3 + vmovdqu YMMWORD[32+rsp],ymm4 + vmovdqu YMMWORD[64+rsp],ymm5 + vmovdqu YMMWORD[96+rsp],ymm6 + vmovdqu YMMWORD[128+rsp],ymm7 + vmovdqu YMMWORD[160+rsp],ymm8 + vmovdqu YMMWORD[192+rsp],ymm9 + vmovdqu YMMWORD[224+rsp],ymm10 + vmovdqu YMMWORD[256+rsp],ymm11 + vmovdqu YMMWORD[288+rsp],ymm12 + mov QWORD[320+rsp],0 + + vmovdqu ymm3,YMMWORD[8+rsp] + vmovdqu ymm4,YMMWORD[40+rsp] + vmovdqu ymm5,YMMWORD[72+rsp] + vmovdqu ymm6,YMMWORD[104+rsp] + vmovdqu ymm7,YMMWORD[136+rsp] + vmovdqu ymm8,YMMWORD[168+rsp] + vmovdqu ymm9,YMMWORD[200+rsp] + vmovdqu ymm10,YMMWORD[232+rsp] + vmovdqu ymm11,YMMWORD[264+rsp] + vmovdqu ymm12,YMMWORD[296+rsp] + + add r9,QWORD[8+rsp] + +{vex} vpmadd52huq ymm3,ymm1,YMMWORD[320+rsi] +{vex} vpmadd52huq ymm4,ymm1,YMMWORD[352+rsi] +{vex} vpmadd52huq ymm5,ymm1,YMMWORD[384+rsi] +{vex} vpmadd52huq ymm6,ymm1,YMMWORD[416+rsi] +{vex} vpmadd52huq ymm7,ymm1,YMMWORD[448+rsi] +{vex} vpmadd52huq ymm8,ymm1,YMMWORD[480+rsi] +{vex} vpmadd52huq ymm9,ymm1,YMMWORD[512+rsi] +{vex} vpmadd52huq ymm10,ymm1,YMMWORD[544+rsi] +{vex} vpmadd52huq ymm11,ymm1,YMMWORD[576+rsi] +{vex} vpmadd52huq ymm12,ymm1,YMMWORD[608+rsi] + +{vex} vpmadd52huq ymm3,ymm2,YMMWORD[320+rcx] +{vex} vpmadd52huq ymm4,ymm2,YMMWORD[352+rcx] +{vex} vpmadd52huq ymm5,ymm2,YMMWORD[384+rcx] +{vex} vpmadd52huq ymm6,ymm2,YMMWORD[416+rcx] +{vex} vpmadd52huq ymm7,ymm2,YMMWORD[448+rcx] +{vex} vpmadd52huq ymm8,ymm2,YMMWORD[480+rcx] +{vex} vpmadd52huq ymm9,ymm2,YMMWORD[512+rcx] +{vex} vpmadd52huq ymm10,ymm2,YMMWORD[544+rcx] +{vex} vpmadd52huq ymm11,ymm2,YMMWORD[576+rcx] +{vex} vpmadd52huq ymm12,ymm2,YMMWORD[608+rcx] + lea rsp,[328+rsp] + lea r11,[8+r11] + dec ebx + jne NEAR $L$loop40_1 + + vmovq xmm0,r9 + vpbroadcastq ymm0,xmm0 + vpblendd ymm3,ymm3,ymm0,3 + + lea rsp,[((-640))+rsp] + vmovupd YMMWORD[rsp],ymm3 + vmovupd YMMWORD[32+rsp],ymm4 + vmovupd YMMWORD[64+rsp],ymm5 + vmovupd YMMWORD[96+rsp],ymm6 + vmovupd YMMWORD[128+rsp],ymm7 + vmovupd YMMWORD[160+rsp],ymm8 + vmovupd YMMWORD[192+rsp],ymm9 + vmovupd YMMWORD[224+rsp],ymm10 + vmovupd YMMWORD[256+rsp],ymm11 + vmovupd YMMWORD[288+rsp],ymm12 + + + + vpsrlq ymm3,ymm3,52 + vpsrlq ymm4,ymm4,52 + vpsrlq ymm5,ymm5,52 + vpsrlq ymm6,ymm6,52 + vpsrlq ymm7,ymm7,52 + vpsrlq ymm8,ymm8,52 + vpsrlq ymm9,ymm9,52 + vpsrlq ymm10,ymm10,52 + vpsrlq ymm11,ymm11,52 + vpsrlq ymm12,ymm12,52 + + + vpermq ymm12,ymm12,144 + vpermq ymm13,ymm11,3 + vblendpd ymm12,ymm12,ymm13,1 + + vpermq ymm11,ymm11,144 + vpermq ymm13,ymm10,3 + vblendpd ymm11,ymm11,ymm13,1 + + vpermq ymm10,ymm10,144 + vpermq ymm13,ymm9,3 + vblendpd ymm10,ymm10,ymm13,1 + + vpermq ymm9,ymm9,144 + vpermq ymm13,ymm8,3 + vblendpd ymm9,ymm9,ymm13,1 + + vpermq ymm8,ymm8,144 + vpermq ymm13,ymm7,3 + vblendpd ymm8,ymm8,ymm13,1 + + vpermq ymm7,ymm7,144 + vpermq ymm13,ymm6,3 + vblendpd ymm7,ymm7,ymm13,1 + + vpermq ymm6,ymm6,144 + vpermq ymm13,ymm5,3 + vblendpd ymm6,ymm6,ymm13,1 + + vpermq ymm5,ymm5,144 + vpermq ymm13,ymm4,3 + vblendpd ymm5,ymm5,ymm13,1 + + vpermq ymm4,ymm4,144 + vpermq ymm13,ymm3,3 + vblendpd ymm4,ymm4,ymm13,1 + + vpermq ymm3,ymm3,144 + vpand ymm3,ymm3,YMMWORD[$L$high64x3] + + vmovupd YMMWORD[320+rsp],ymm3 + vmovupd YMMWORD[352+rsp],ymm4 + vmovupd YMMWORD[384+rsp],ymm5 + vmovupd YMMWORD[416+rsp],ymm6 + vmovupd YMMWORD[448+rsp],ymm7 + vmovupd YMMWORD[480+rsp],ymm8 + vmovupd YMMWORD[512+rsp],ymm9 + vmovupd YMMWORD[544+rsp],ymm10 + vmovupd YMMWORD[576+rsp],ymm11 + vmovupd YMMWORD[608+rsp],ymm12 + + vmovupd ymm3,YMMWORD[rsp] + vmovupd ymm4,YMMWORD[32+rsp] + vmovupd ymm5,YMMWORD[64+rsp] + vmovupd ymm6,YMMWORD[96+rsp] + vmovupd ymm7,YMMWORD[128+rsp] + vmovupd ymm8,YMMWORD[160+rsp] + vmovupd ymm9,YMMWORD[192+rsp] + vmovupd ymm10,YMMWORD[224+rsp] + vmovupd ymm11,YMMWORD[256+rsp] + vmovupd ymm12,YMMWORD[288+rsp] + + + vpand ymm3,ymm3,YMMWORD[$L$mask52x4] + vpand ymm4,ymm4,YMMWORD[$L$mask52x4] + vpand ymm5,ymm5,YMMWORD[$L$mask52x4] + vpand ymm6,ymm6,YMMWORD[$L$mask52x4] + vpand ymm7,ymm7,YMMWORD[$L$mask52x4] + vpand ymm8,ymm8,YMMWORD[$L$mask52x4] + vpand ymm9,ymm9,YMMWORD[$L$mask52x4] + vpand ymm10,ymm10,YMMWORD[$L$mask52x4] + vpand ymm11,ymm11,YMMWORD[$L$mask52x4] + vpand ymm12,ymm12,YMMWORD[$L$mask52x4] + + + vpaddq ymm3,ymm3,YMMWORD[320+rsp] + vpaddq ymm4,ymm4,YMMWORD[352+rsp] + vpaddq ymm5,ymm5,YMMWORD[384+rsp] + vpaddq ymm6,ymm6,YMMWORD[416+rsp] + vpaddq ymm7,ymm7,YMMWORD[448+rsp] + vpaddq ymm8,ymm8,YMMWORD[480+rsp] + vpaddq ymm9,ymm9,YMMWORD[512+rsp] + vpaddq ymm10,ymm10,YMMWORD[544+rsp] + vpaddq ymm11,ymm11,YMMWORD[576+rsp] + vpaddq ymm12,ymm12,YMMWORD[608+rsp] + + lea rsp,[640+rsp] + + + + vpcmpgtq ymm13,ymm3,YMMWORD[$L$mask52x4] + vmovmskpd r14d,ymm13 + vpcmpgtq ymm13,ymm4,YMMWORD[$L$mask52x4] + vmovmskpd r13d,ymm13 + shl r13b,4 + or r14b,r13b + + vpcmpgtq ymm13,ymm5,YMMWORD[$L$mask52x4] + vmovmskpd r13d,ymm13 + vpcmpgtq ymm13,ymm6,YMMWORD[$L$mask52x4] + vmovmskpd r12d,ymm13 + shl r12b,4 + or r13b,r12b + + vpcmpgtq ymm13,ymm7,YMMWORD[$L$mask52x4] + vmovmskpd r12d,ymm13 + vpcmpgtq ymm13,ymm8,YMMWORD[$L$mask52x4] + vmovmskpd r11d,ymm13 + shl r11b,4 + or r12b,r11b + + vpcmpgtq ymm13,ymm9,YMMWORD[$L$mask52x4] + vmovmskpd r11d,ymm13 + vpcmpgtq ymm13,ymm10,YMMWORD[$L$mask52x4] + vmovmskpd r10d,ymm13 + shl r10b,4 + or r11b,r10b + + vpcmpgtq ymm13,ymm11,YMMWORD[$L$mask52x4] + vmovmskpd r10d,ymm13 + vpcmpgtq ymm13,ymm12,YMMWORD[$L$mask52x4] + vmovmskpd r9d,ymm13 + shl r9b,4 + or r10b,r9b + + add r14b,r14b + adc r13b,r13b + adc r12b,r12b + adc r11b,r11b + adc r10b,r10b + + + vpcmpeqq ymm13,ymm3,YMMWORD[$L$mask52x4] + vmovmskpd r9d,ymm13 + vpcmpeqq ymm13,ymm4,YMMWORD[$L$mask52x4] + vmovmskpd r8d,ymm13 + shl r8b,4 + or r9b,r8b + + vpcmpeqq ymm13,ymm5,YMMWORD[$L$mask52x4] + vmovmskpd r8d,ymm13 + vpcmpeqq ymm13,ymm6,YMMWORD[$L$mask52x4] + vmovmskpd edx,ymm13 + shl dl,4 + or r8b,dl + + vpcmpeqq ymm13,ymm7,YMMWORD[$L$mask52x4] + vmovmskpd edx,ymm13 + vpcmpeqq ymm13,ymm8,YMMWORD[$L$mask52x4] + vmovmskpd ecx,ymm13 + shl cl,4 + or dl,cl + + vpcmpeqq ymm13,ymm9,YMMWORD[$L$mask52x4] + vmovmskpd ecx,ymm13 + vpcmpeqq ymm13,ymm10,YMMWORD[$L$mask52x4] + vmovmskpd ebx,ymm13 + shl bl,4 + or cl,bl + + vpcmpeqq ymm13,ymm11,YMMWORD[$L$mask52x4] + vmovmskpd ebx,ymm13 + vpcmpeqq ymm13,ymm12,YMMWORD[$L$mask52x4] + vmovmskpd eax,ymm13 + shl al,4 + or bl,al + + add r14b,r9b + adc r13b,r8b + adc r12b,dl + adc r11b,cl + adc r10b,bl + + xor r14b,r9b + xor r13b,r8b + xor r12b,dl + xor r11b,cl + xor r10b,bl + + push r9 + push r8 + + lea r8,[$L$kmasklut] + + mov r9b,r14b + and r14,0xf + vpsubq ymm13,ymm3,YMMWORD[$L$mask52x4] + shl r14,5 + vmovapd ymm14,YMMWORD[r14*1+r8] + vblendvpd ymm3,ymm3,ymm13,ymm14 + + shr r9b,4 + and r9,0xf + vpsubq ymm13,ymm4,YMMWORD[$L$mask52x4] + shl r9,5 + vmovapd ymm14,YMMWORD[r9*1+r8] + vblendvpd ymm4,ymm4,ymm13,ymm14 + + mov r9b,r13b + and r13,0xf + vpsubq ymm13,ymm5,YMMWORD[$L$mask52x4] + shl r13,5 + vmovapd ymm14,YMMWORD[r13*1+r8] + vblendvpd ymm5,ymm5,ymm13,ymm14 + + shr r9b,4 + and r9,0xf + vpsubq ymm13,ymm6,YMMWORD[$L$mask52x4] + shl r9,5 + vmovapd ymm14,YMMWORD[r9*1+r8] + vblendvpd ymm6,ymm6,ymm13,ymm14 + + mov r9b,r12b + and r12,0xf + vpsubq ymm13,ymm7,YMMWORD[$L$mask52x4] + shl r12,5 + vmovapd ymm14,YMMWORD[r12*1+r8] + vblendvpd ymm7,ymm7,ymm13,ymm14 + + shr r9b,4 + and r9,0xf + vpsubq ymm13,ymm8,YMMWORD[$L$mask52x4] + shl r9,5 + vmovapd ymm14,YMMWORD[r9*1+r8] + vblendvpd ymm8,ymm8,ymm13,ymm14 + + mov r9b,r11b + and r11,0xf + vpsubq ymm13,ymm9,YMMWORD[$L$mask52x4] + shl r11,5 + vmovapd ymm14,YMMWORD[r11*1+r8] + vblendvpd ymm9,ymm9,ymm13,ymm14 + + shr r9b,4 + and r9,0xf + vpsubq ymm13,ymm10,YMMWORD[$L$mask52x4] + shl r9,5 + vmovapd ymm14,YMMWORD[r9*1+r8] + vblendvpd ymm10,ymm10,ymm13,ymm14 + + mov r9b,r10b + and r10,0xf + vpsubq ymm13,ymm11,YMMWORD[$L$mask52x4] + shl r10,5 + vmovapd ymm14,YMMWORD[r10*1+r8] + vblendvpd ymm11,ymm11,ymm13,ymm14 + + shr r9b,4 + and r9,0xf + vpsubq ymm13,ymm12,YMMWORD[$L$mask52x4] + shl r9,5 + vmovapd ymm14,YMMWORD[r9*1+r8] + vblendvpd ymm12,ymm12,ymm13,ymm14 + + pop r8 + pop r9 + + vpand ymm3,ymm3,YMMWORD[$L$mask52x4] + vpand ymm4,ymm4,YMMWORD[$L$mask52x4] + vpand ymm5,ymm5,YMMWORD[$L$mask52x4] + vpand ymm6,ymm6,YMMWORD[$L$mask52x4] + vpand ymm7,ymm7,YMMWORD[$L$mask52x4] + vpand ymm8,ymm8,YMMWORD[$L$mask52x4] + vpand ymm9,ymm9,YMMWORD[$L$mask52x4] + + vpand ymm10,ymm10,YMMWORD[$L$mask52x4] + vpand ymm11,ymm11,YMMWORD[$L$mask52x4] + vpand ymm12,ymm12,YMMWORD[$L$mask52x4] + + vmovdqu YMMWORD[320+rdi],ymm3 + vmovdqu YMMWORD[352+rdi],ymm4 + vmovdqu YMMWORD[384+rdi],ymm5 + vmovdqu YMMWORD[416+rdi],ymm6 + vmovdqu YMMWORD[448+rdi],ymm7 + vmovdqu YMMWORD[480+rdi],ymm8 + vmovdqu YMMWORD[512+rdi],ymm9 + vmovdqu YMMWORD[544+rdi],ymm10 + vmovdqu YMMWORD[576+rdi],ymm11 + vmovdqu YMMWORD[608+rdi],ymm12 + + vzeroupper + lea rax,[rsp] + + vmovapd xmm6,XMMWORD[rax] + vmovapd xmm7,XMMWORD[16+rax] + vmovapd xmm8,XMMWORD[32+rax] + vmovapd xmm9,XMMWORD[48+rax] + vmovapd xmm10,XMMWORD[64+rax] + vmovapd xmm11,XMMWORD[80+rax] + vmovapd xmm12,XMMWORD[96+rax] + vmovapd xmm13,XMMWORD[112+rax] + vmovapd xmm14,XMMWORD[128+rax] + vmovapd xmm15,XMMWORD[144+rax] + lea rax,[168+rsp] + mov r15,QWORD[rax] + + mov r14,QWORD[8+rax] + + mov r13,QWORD[16+rax] + + mov r12,QWORD[24+rax] + + mov rbp,QWORD[32+rax] + + mov rbx,QWORD[40+rax] + + lea rsp,[48+rax] + +$L$ossl_rsaz_amm52x40_x2_avxifma256_epilogue: + mov rdi,QWORD[8+rsp] ;WIN64 epilogue + mov rsi,QWORD[16+rsp] + DB 0F3h,0C3h ;repret + +$L$SEH_end_ossl_rsaz_amm52x40_x2_avxifma256: +section .text code align=64 + + +ALIGN 32 +global ossl_extract_multiplier_2x40_win5_avx + +ossl_extract_multiplier_2x40_win5_avx: + +DB 243,15,30,250 + vmovapd ymm14,YMMWORD[$L$ones] + vmovq xmm10,r8 + vpbroadcastq ymm12,xmm10 + vmovq xmm10,r9 + vpbroadcastq ymm13,xmm10 + lea rax,[20480+rdx] + + + mov r10,rdx + + + vpxor xmm0,xmm0,xmm0 + vmovapd ymm1,ymm0 + vmovapd ymm2,ymm0 + vmovapd ymm3,ymm0 + vmovapd ymm4,ymm0 + vmovapd ymm5,ymm0 + vmovapd ymm6,ymm0 + vmovapd ymm7,ymm0 + vmovapd ymm8,ymm0 + vmovapd ymm9,ymm0 + vpxor ymm11,ymm11,ymm11 +ALIGN 32 +$L$loop_0: + vpcmpeqq ymm15,ymm12,ymm11 + vmovdqu ymm10,YMMWORD[rdx] + + vblendvpd ymm0,ymm0,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[32+rdx] + + vblendvpd ymm1,ymm1,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[64+rdx] + + vblendvpd ymm2,ymm2,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[96+rdx] + + vblendvpd ymm3,ymm3,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[128+rdx] + + vblendvpd ymm4,ymm4,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[160+rdx] + + vblendvpd ymm5,ymm5,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[192+rdx] + + vblendvpd ymm6,ymm6,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[224+rdx] + + vblendvpd ymm7,ymm7,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[256+rdx] + + vblendvpd ymm8,ymm8,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[288+rdx] + + vblendvpd ymm9,ymm9,ymm10,ymm15 + vpaddq ymm11,ymm11,ymm14 + add rdx,640 + cmp rax,rdx + jne NEAR $L$loop_0 + vmovdqu YMMWORD[rcx],ymm0 + vmovdqu YMMWORD[32+rcx],ymm1 + vmovdqu YMMWORD[64+rcx],ymm2 + vmovdqu YMMWORD[96+rcx],ymm3 + vmovdqu YMMWORD[128+rcx],ymm4 + vmovdqu YMMWORD[160+rcx],ymm5 + vmovdqu YMMWORD[192+rcx],ymm6 + vmovdqu YMMWORD[224+rcx],ymm7 + vmovdqu YMMWORD[256+rcx],ymm8 + vmovdqu YMMWORD[288+rcx],ymm9 + mov rdx,r10 + vpxor ymm11,ymm11,ymm11 +ALIGN 32 +$L$loop_320: + vpcmpeqq ymm15,ymm13,ymm11 + vmovdqu ymm10,YMMWORD[320+rdx] + + vblendvpd ymm0,ymm0,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[352+rdx] + + vblendvpd ymm1,ymm1,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[384+rdx] + + vblendvpd ymm2,ymm2,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[416+rdx] + + vblendvpd ymm3,ymm3,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[448+rdx] + + vblendvpd ymm4,ymm4,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[480+rdx] + + vblendvpd ymm5,ymm5,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[512+rdx] + + vblendvpd ymm6,ymm6,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[544+rdx] + + vblendvpd ymm7,ymm7,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[576+rdx] + + vblendvpd ymm8,ymm8,ymm10,ymm15 + vmovdqu ymm10,YMMWORD[608+rdx] + + vblendvpd ymm9,ymm9,ymm10,ymm15 + vpaddq ymm11,ymm11,ymm14 + add rdx,640 + cmp rax,rdx + jne NEAR $L$loop_320 + vmovdqu YMMWORD[320+rcx],ymm0 + vmovdqu YMMWORD[352+rcx],ymm1 + vmovdqu YMMWORD[384+rcx],ymm2 + vmovdqu YMMWORD[416+rcx],ymm3 + vmovdqu YMMWORD[448+rcx],ymm4 + vmovdqu YMMWORD[480+rcx],ymm5 + vmovdqu YMMWORD[512+rcx],ymm6 + vmovdqu YMMWORD[544+rcx],ymm7 + vmovdqu YMMWORD[576+rcx],ymm8 + vmovdqu YMMWORD[608+rcx],ymm9 + + DB 0F3h,0C3h ;repret + + +section .rdata rdata align=32 +ALIGN 32 +$L$ones: + DQ 1,1,1,1 +$L$zeros: + DQ 0,0,0,0 +EXTERN __imp_RtlVirtualUnwind + +ALIGN 16 +rsaz_avx_handler: + push rsi + push rdi + push rbx + push rbp + push r12 + push r13 + push r14 + push r15 + pushfq + sub rsp,64 + + mov rax,QWORD[120+r8] + mov rbx,QWORD[248+r8] + + mov rsi,QWORD[8+r9] + mov r11,QWORD[56+r9] + + mov r10d,DWORD[r11] + lea r10,[r10*1+rsi] + cmp rbx,r10 + jb NEAR $L$common_seh_tail + + mov r10d,DWORD[4+r11] + lea r10,[r10*1+rsi] + cmp rbx,r10 + jae NEAR $L$common_seh_tail + + mov rax,QWORD[152+r8] + + lea rsi,[rax] + lea rdi,[512+r8] + mov ecx,20 + DD 0xa548f3fc + + lea rax,[216+rax] + + mov rbx,QWORD[((-8))+rax] + mov rbp,QWORD[((-16))+rax] + mov r12,QWORD[((-24))+rax] + mov r13,QWORD[((-32))+rax] + mov r14,QWORD[((-40))+rax] + mov r15,QWORD[((-48))+rax] + mov QWORD[144+r8],rbx + mov QWORD[160+r8],rbp + mov QWORD[216+r8],r12 + mov QWORD[224+r8],r13 + mov QWORD[232+r8],r14 + mov QWORD[240+r8],r15 + +$L$common_seh_tail: + mov rdi,QWORD[8+rax] + mov rsi,QWORD[16+rax] + mov QWORD[152+r8],rax + mov QWORD[168+r8],rsi + mov QWORD[176+r8],rdi + + mov rdi,QWORD[40+r9] + mov rsi,r8 + mov ecx,154 + DD 0xa548f3fc + + mov rsi,r9 + xor rcx,rcx + mov rdx,QWORD[8+rsi] + mov r8,QWORD[rsi] + mov r9,QWORD[16+rsi] + mov r10,QWORD[40+rsi] + lea r11,[56+rsi] + lea r12,[24+rsi] + mov QWORD[32+rsp],r10 + mov QWORD[40+rsp],r11 + mov QWORD[48+rsp],r12 + mov QWORD[56+rsp],rcx + call QWORD[__imp_RtlVirtualUnwind] + + mov eax,1 + add rsp,64 + popfq + pop r15 + pop r14 + pop r13 + pop r12 + pop rbp + pop rbx + pop rdi + pop rsi + DB 0F3h,0C3h ;repret + + +section .pdata rdata align=4 +ALIGN 4 + DD $L$SEH_begin_ossl_rsaz_amm52x40_x1_avxifma256 wrt ..imagebase + DD $L$SEH_end_ossl_rsaz_amm52x40_x1_avxifma256 wrt ..imagebase + DD $L$SEH_info_ossl_rsaz_amm52x40_x1_avxifma256 wrt ..imagebase + + DD $L$SEH_begin_ossl_rsaz_amm52x40_x2_avxifma256 wrt ..imagebase + DD $L$SEH_end_ossl_rsaz_amm52x40_x2_avxifma256 wrt ..imagebase + DD $L$SEH_info_ossl_rsaz_amm52x40_x2_avxifma256 wrt ..imagebase + +section .xdata rdata align=8 +ALIGN 8 +$L$SEH_info_ossl_rsaz_amm52x40_x1_avxifma256: +DB 9,0,0,0 + DD rsaz_avx_handler wrt ..imagebase + DD $L$ossl_rsaz_amm52x40_x1_avxifma256_body wrt ..imagebase,$L$ossl_rsaz_amm52x40_x1_avxifma256_epilogue wrt ..imagebase +$L$SEH_info_ossl_rsaz_amm52x40_x2_avxifma256: +DB 9,0,0,0 + DD rsaz_avx_handler wrt ..imagebase + DD $L$ossl_rsaz_amm52x40_x2_avxifma256_body wrt ..imagebase,$L$ossl_rsaz_amm52x40_x2_avxifma256_epilogue wrt ..imagebase diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/md5/md5-x86_64.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/md5/md5-x86_64.nasm index 9139d4c44a8c..f71708242fbc 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/md5/md5-x86_64.nasm +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/md5/md5-x86_64.nasm @@ -210,7 +210,7 @@ $L$loop: lea eax,[((-165796510))+r10*1+rax] and r11d,ecx mov r10d,DWORD[24+rsi] - or r12d,r11d + add eax,r11d mov r11d,ecx add eax,r12d mov r12d,ecx @@ -221,7 +221,7 @@ $L$loop: lea edx,[((-1069501632))+r10*1+rdx] and r11d,ebx mov r10d,DWORD[44+rsi] - or r12d,r11d + add edx,r11d mov r11d,ebx add edx,r12d mov r12d,ebx @@ -232,7 +232,7 @@ $L$loop: lea ecx,[643717713+r10*1+rcx] and r11d,eax mov r10d,DWORD[rsi] - or r12d,r11d + add ecx,r11d mov r11d,eax add ecx,r12d mov r12d,eax @@ -243,7 +243,7 @@ $L$loop: lea ebx,[((-373897302))+r10*1+rbx] and r11d,edx mov r10d,DWORD[20+rsi] - or r12d,r11d + add ebx,r11d mov r11d,edx add ebx,r12d mov r12d,edx @@ -254,7 +254,7 @@ $L$loop: lea eax,[((-701558691))+r10*1+rax] and r11d,ecx mov r10d,DWORD[40+rsi] - or r12d,r11d + add eax,r11d mov r11d,ecx add eax,r12d mov r12d,ecx @@ -265,7 +265,7 @@ $L$loop: lea edx,[38016083+r10*1+rdx] and r11d,ebx mov r10d,DWORD[60+rsi] - or r12d,r11d + add edx,r11d mov r11d,ebx add edx,r12d mov r12d,ebx @@ -276,7 +276,7 @@ $L$loop: lea ecx,[((-660478335))+r10*1+rcx] and r11d,eax mov r10d,DWORD[16+rsi] - or r12d,r11d + add ecx,r11d mov r11d,eax add ecx,r12d mov r12d,eax @@ -287,7 +287,7 @@ $L$loop: lea ebx,[((-405537848))+r10*1+rbx] and r11d,edx mov r10d,DWORD[36+rsi] - or r12d,r11d + add ebx,r11d mov r11d,edx add ebx,r12d mov r12d,edx @@ -298,7 +298,7 @@ $L$loop: lea eax,[568446438+r10*1+rax] and r11d,ecx mov r10d,DWORD[56+rsi] - or r12d,r11d + add eax,r11d mov r11d,ecx add eax,r12d mov r12d,ecx @@ -309,7 +309,7 @@ $L$loop: lea edx,[((-1019803690))+r10*1+rdx] and r11d,ebx mov r10d,DWORD[12+rsi] - or r12d,r11d + add edx,r11d mov r11d,ebx add edx,r12d mov r12d,ebx @@ -320,7 +320,7 @@ $L$loop: lea ecx,[((-187363961))+r10*1+rcx] and r11d,eax mov r10d,DWORD[32+rsi] - or r12d,r11d + add ecx,r11d mov r11d,eax add ecx,r12d mov r12d,eax @@ -331,7 +331,7 @@ $L$loop: lea ebx,[1163531501+r10*1+rbx] and r11d,edx mov r10d,DWORD[52+rsi] - or r12d,r11d + add ebx,r11d mov r11d,edx add ebx,r12d mov r12d,edx @@ -342,7 +342,7 @@ $L$loop: lea eax,[((-1444681467))+r10*1+rax] and r11d,ecx mov r10d,DWORD[8+rsi] - or r12d,r11d + add eax,r11d mov r11d,ecx add eax,r12d mov r12d,ecx @@ -353,7 +353,7 @@ $L$loop: lea edx,[((-51403784))+r10*1+rdx] and r11d,ebx mov r10d,DWORD[28+rsi] - or r12d,r11d + add edx,r11d mov r11d,ebx add edx,r12d mov r12d,ebx @@ -364,7 +364,7 @@ $L$loop: lea ecx,[1735328473+r10*1+rcx] and r11d,eax mov r10d,DWORD[48+rsi] - or r12d,r11d + add ecx,r11d mov r11d,eax add ecx,r12d mov r12d,eax @@ -375,7 +375,7 @@ $L$loop: lea ebx,[((-1926607734))+r10*1+rbx] and r11d,edx mov r10d,DWORD[20+rsi] - or r12d,r11d + add ebx,r11d mov r11d,edx add ebx,r12d mov r12d,edx diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/x86_64cpuid.nasm b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/x86_64cpuid.nasm index 2ce22321d74f..b58086af0a44 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/x86_64cpuid.nasm +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/X64-MSFT/crypto/x86_64cpuid.nasm @@ -2,14 +2,14 @@ default rel %define XMMWORD %define YMMWORD %define ZMMWORD + EXTERN OPENSSL_cpuid_setup section .CRT$XCU rdata align=8 DQ OPENSSL_cpuid_setup -common OPENSSL_ia32cap_P 16 - +common OPENSSL_ia32cap_P 40 section .text code align=64 @@ -175,6 +175,7 @@ $L$generic: mov eax,7 xor ecx,ecx cpuid + movd xmm1,eax bt r9d,26 jc NEAR $L$notknights and ebx,0xfff7ffff @@ -185,9 +186,31 @@ $L$notknights: jne NEAR $L$notskylakex and ebx,0xfffeffff + $L$notskylakex: mov DWORD[8+rdi],ebx mov DWORD[12+rdi],ecx + mov DWORD[16+rdi],edx + + movd eax,xmm1 + cmp eax,0x1 + jb NEAR $L$no_extended_info + mov eax,0x7 + mov ecx,0x1 + cpuid + mov DWORD[20+rdi],eax + mov DWORD[24+rdi],edx + mov DWORD[28+rdi],ebx + mov DWORD[32+rdi],ecx + + and edx,0x80000 + cmp edx,0x0 + je NEAR $L$no_extended_info + mov eax,0x24 + mov ecx,0x0 + cpuid + mov DWORD[36+rdi],ebx + $L$no_extended_info: bt r9d,27 @@ -206,6 +229,9 @@ DB 0x0f,0x01,0xd0 cmp eax,6 je NEAR $L$done $L$clear_avx: + and DWORD[20+rdi],0xff7fffff + + mov eax,0xefffe7ff and r9d,eax mov eax,0x3fdeffdf diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/crypto/params_idx.c b/CryptoPkg/Library/OpensslLib/OpensslGen/crypto/params_idx.c index fd9b9ae658f5..e77a24260233 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/crypto/params_idx.c +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/crypto/params_idx.c @@ -33,6 +33,10 @@ int ossl_param_find_pidx(const char *s) switch(s[2]) { default: break; + case 'd': + if (strcmp("itional-random", s + 3) == 0) + return PIDX_SIGNATURE_PARAM_ADD_RANDOM; + break; case '\0': return PIDX_KDF_PARAM_ARGON2_AD; } @@ -322,6 +326,10 @@ int ossl_param_find_pidx(const char *s) case 's': if (strcmp("c", s + 3) == 0) return PIDX_OBJECT_PARAM_DESC; + break; + case 't': + if (strcmp("erministic", s + 3) == 0) + return PIDX_SIGNATURE_PARAM_DETERMINISTIC; } break; case 'h': @@ -936,8 +944,17 @@ int ossl_param_find_pidx(const char *s) default: break; case '-': - if (strcmp("check", s + 4) == 0) - return PIDX_PKEY_PARAM_FIPS_KEY_CHECK; + switch(s[4]) { + default: + break; + case 'c': + if (strcmp("heck", s + 5) == 0) + return PIDX_PKEY_PARAM_FIPS_KEY_CHECK; + break; + case 'l': + if (strcmp("ength", s + 5) == 0) + return PIDX_SKEY_PARAM_KEY_LENGTH; + } break; case 'b': if (strcmp("its", s + 4) == 0) @@ -1060,8 +1077,17 @@ int ossl_param_find_pidx(const char *s) } break; case 'e': - if (strcmp("mcost", s + 2) == 0) - return PIDX_KDF_PARAM_ARGON2_MEMCOST; + switch(s[2]) { + default: + break; + case 'm': + if (strcmp("cost", s + 3) == 0) + return PIDX_KDF_PARAM_ARGON2_MEMCOST; + break; + case 's': + if (strcmp("sage-encoding", s + 3) == 0) + return PIDX_SIGNATURE_PARAM_MESSAGE_ENCODING; + } break; case 'g': switch(s[2]) { @@ -1125,6 +1151,97 @@ int ossl_param_find_pidx(const char *s) } } break; + case 'l': + switch(s[2]) { + default: + break; + case '-': + switch(s[3]) { + default: + break; + case 'd': + switch(s[4]) { + default: + break; + case 's': + switch(s[5]) { + default: + break; + case 'a': + switch(s[6]) { + default: + break; + case '.': + switch(s[7]) { + default: + break; + case 'i': + if (strcmp("nput_formats", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_DSA_INPUT_FORMATS; + break; + case 'o': + if (strcmp("utput_formats", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_DSA_OUTPUT_FORMATS; + break; + case 'p': + if (strcmp("refer_seed", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_DSA_PREFER_SEED; + break; + case 'r': + if (strcmp("etain_seed", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_DSA_RETAIN_SEED; + } + } + } + } + break; + case 'k': + switch(s[4]) { + default: + break; + case 'e': + switch(s[5]) { + default: + break; + case 'm': + switch(s[6]) { + default: + break; + case '.': + switch(s[7]) { + default: + break; + case 'i': + switch(s[8]) { + default: + break; + case 'm': + if (strcmp("port_pct_type", s + 9) == 0) + return PIDX_PKEY_PARAM_ML_KEM_IMPORT_PCT_TYPE; + break; + case 'n': + if (strcmp("put_formats", s + 9) == 0) + return PIDX_PKEY_PARAM_ML_KEM_INPUT_FORMATS; + } + break; + case 'o': + if (strcmp("utput_formats", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_KEM_OUTPUT_FORMATS; + break; + case 'p': + if (strcmp("refer_seed", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_KEM_PREFER_SEED; + break; + case 'r': + if (strcmp("etain_seed", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_KEM_RETAIN_SEED; + } + } + } + } + } + } + break; case 'o': switch(s[2]) { default: @@ -1147,6 +1264,14 @@ int ossl_param_find_pidx(const char *s) } } break; + case 'u': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_SIGNATURE_PARAM_MU; + } + break; case '\0': return PIDX_PKEY_PARAM_EC_CHAR2_M; } @@ -1327,6 +1452,10 @@ int ossl_param_find_pidx(const char *s) if (strcmp("ounter", s + 2) == 0) return PIDX_PKEY_PARAM_FFC_PCOUNTER; break; + case 'i': + if (strcmp("peline-tag", s + 2) == 0) + return PIDX_CIPHER_PARAM_PIPELINE_AEAD_TAG; + break; case 'k': if (strcmp("cs5", s + 2) == 0) return PIDX_KDF_PARAM_PKCS5; @@ -1473,6 +1602,10 @@ int ossl_param_find_pidx(const char *s) return PIDX_DRBG_PARAM_RANDOM_DATA; } } + break; + case 'w': + if (strcmp("-bytes", s + 3) == 0) + return PIDX_SKEY_PARAM_RAW_BYTES; } break; case 'e': @@ -2064,7 +2197,7 @@ int ossl_param_find_pidx(const char *s) break; case 'e': if (strcmp("d", s + 3) == 0) - return PIDX_PKEY_PARAM_FFC_SEED; + return PIDX_PKEY_PARAM_SLH_DSA_SEED; break; case 'r': if (strcmp("ial", s + 3) == 0) @@ -2350,6 +2483,10 @@ int ossl_param_find_pidx(const char *s) switch(s[4]) { default: break; + case '-': + if (strcmp("entropy", s + 5) == 0) + return PIDX_SIGNATURE_PARAM_TEST_ENTROPY; + break; case '_': switch(s[5]) { default: @@ -2502,7 +2639,7 @@ int ossl_param_find_pidx(const char *s) break; case 'd': if (strcmp("tls", s + 9) == 0) - return PIDX_CAPABILITY_TLS_GROUP_MAX_DTLS; + return PIDX_CAPABILITY_TLS_SIGALG_MAX_DTLS; break; case 't': if (strcmp("ls", s + 9) == 0) @@ -2525,7 +2662,7 @@ int ossl_param_find_pidx(const char *s) break; case 'd': if (strcmp("tls", s + 9) == 0) - return PIDX_CAPABILITY_TLS_GROUP_MIN_DTLS; + return PIDX_CAPABILITY_TLS_SIGALG_MIN_DTLS; break; case 't': if (strcmp("ls", s + 9) == 0) diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/internal/param_names.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/internal/param_names.h index 27bcea8137a2..10e995f20ca0 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/internal/param_names.h +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/internal/param_names.h @@ -14,7 +14,7 @@ int ossl_param_find_pidx(const char *s); /* Parameter name definitions - generated by util/perl/OpenSSL/paramnames.pm */ -#define NUM_PIDX 329 +#define NUM_PIDX 346 #define PIDX_ALG_PARAM_ALGORITHM_ID 0 #define PIDX_ALG_PARAM_ALGORITHM_ID_PARAMS 1 @@ -55,7 +55,9 @@ int ossl_param_find_pidx(const char *s); #define PIDX_CAPABILITY_TLS_SIGALG_IANA_NAME 26 #define PIDX_CAPABILITY_TLS_SIGALG_KEYTYPE 27 #define PIDX_CAPABILITY_TLS_SIGALG_KEYTYPE_OID 28 +#define PIDX_CAPABILITY_TLS_SIGALG_MAX_DTLS 16 #define PIDX_CAPABILITY_TLS_SIGALG_MAX_TLS 17 +#define PIDX_CAPABILITY_TLS_SIGALG_MIN_DTLS 18 #define PIDX_CAPABILITY_TLS_SIGALG_MIN_TLS 19 #define PIDX_CAPABILITY_TLS_SIGALG_NAME 29 #define PIDX_CAPABILITY_TLS_SIGALG_OID 30 @@ -90,357 +92,378 @@ int ossl_param_find_pidx(const char *s); #define PIDX_CIPHER_PARAM_MODE 55 #define PIDX_CIPHER_PARAM_NUM 56 #define PIDX_CIPHER_PARAM_PADDING 57 -#define PIDX_CIPHER_PARAM_RANDOM_KEY 58 -#define PIDX_CIPHER_PARAM_RC2_KEYBITS 59 -#define PIDX_CIPHER_PARAM_ROUNDS 60 -#define PIDX_CIPHER_PARAM_SPEED 61 -#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK 62 -#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD 63 -#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD_PACKLEN 64 -#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC 65 -#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_IN 66 -#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_LEN 67 -#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_INTERLEAVE 68 -#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_BUFSIZE 69 -#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_SEND_FRAGMENT 70 -#define PIDX_CIPHER_PARAM_TLS_MAC 71 -#define PIDX_CIPHER_PARAM_TLS_MAC_SIZE 72 -#define PIDX_CIPHER_PARAM_TLS_VERSION 73 -#define PIDX_CIPHER_PARAM_UPDATED_IV 74 -#define PIDX_CIPHER_PARAM_USE_BITS 75 -#define PIDX_CIPHER_PARAM_XTS_STANDARD 76 +#define PIDX_CIPHER_PARAM_PIPELINE_AEAD_TAG 58 +#define PIDX_CIPHER_PARAM_RANDOM_KEY 59 +#define PIDX_CIPHER_PARAM_RC2_KEYBITS 60 +#define PIDX_CIPHER_PARAM_ROUNDS 61 +#define PIDX_CIPHER_PARAM_SPEED 62 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK 63 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD 64 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD_PACKLEN 65 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC 66 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_IN 67 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_LEN 68 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_INTERLEAVE 69 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_BUFSIZE 70 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_SEND_FRAGMENT 71 +#define PIDX_CIPHER_PARAM_TLS_MAC 72 +#define PIDX_CIPHER_PARAM_TLS_MAC_SIZE 73 +#define PIDX_CIPHER_PARAM_TLS_VERSION 74 +#define PIDX_CIPHER_PARAM_UPDATED_IV 75 +#define PIDX_CIPHER_PARAM_USE_BITS 76 +#define PIDX_CIPHER_PARAM_XTS_STANDARD 77 #define PIDX_DECODER_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES -#define PIDX_DIGEST_PARAM_ALGID_ABSENT 77 +#define PIDX_DIGEST_PARAM_ALGID_ABSENT 78 #define PIDX_DIGEST_PARAM_BLOCK_SIZE 45 -#define PIDX_DIGEST_PARAM_MICALG 78 -#define PIDX_DIGEST_PARAM_PAD_TYPE 79 -#define PIDX_DIGEST_PARAM_SIZE 80 -#define PIDX_DIGEST_PARAM_SSL3_MS 81 -#define PIDX_DIGEST_PARAM_XOF 82 -#define PIDX_DIGEST_PARAM_XOFLEN 83 +#define PIDX_DIGEST_PARAM_MICALG 79 +#define PIDX_DIGEST_PARAM_PAD_TYPE 80 +#define PIDX_DIGEST_PARAM_SIZE 81 +#define PIDX_DIGEST_PARAM_SSL3_MS 82 +#define PIDX_DIGEST_PARAM_XOF 83 +#define PIDX_DIGEST_PARAM_XOFLEN 84 #define PIDX_DRBG_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER #define PIDX_DRBG_PARAM_DIGEST PIDX_ALG_PARAM_DIGEST -#define PIDX_DRBG_PARAM_ENTROPY_REQUIRED 84 +#define PIDX_DRBG_PARAM_ENTROPY_REQUIRED 85 #define PIDX_DRBG_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR #define PIDX_DRBG_PARAM_FIPS_DIGEST_CHECK PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK #define PIDX_DRBG_PARAM_MAC PIDX_ALG_PARAM_MAC -#define PIDX_DRBG_PARAM_MAX_ADINLEN 85 -#define PIDX_DRBG_PARAM_MAX_ENTROPYLEN 86 -#define PIDX_DRBG_PARAM_MAX_LENGTH 87 -#define PIDX_DRBG_PARAM_MAX_NONCELEN 88 -#define PIDX_DRBG_PARAM_MAX_PERSLEN 89 -#define PIDX_DRBG_PARAM_MIN_ENTROPYLEN 90 -#define PIDX_DRBG_PARAM_MIN_LENGTH 91 -#define PIDX_DRBG_PARAM_MIN_NONCELEN 92 -#define PIDX_DRBG_PARAM_PREDICTION_RESISTANCE 93 +#define PIDX_DRBG_PARAM_MAX_ADINLEN 86 +#define PIDX_DRBG_PARAM_MAX_ENTROPYLEN 87 +#define PIDX_DRBG_PARAM_MAX_LENGTH 88 +#define PIDX_DRBG_PARAM_MAX_NONCELEN 89 +#define PIDX_DRBG_PARAM_MAX_PERSLEN 90 +#define PIDX_DRBG_PARAM_MIN_ENTROPYLEN 91 +#define PIDX_DRBG_PARAM_MIN_LENGTH 92 +#define PIDX_DRBG_PARAM_MIN_NONCELEN 93 +#define PIDX_DRBG_PARAM_PREDICTION_RESISTANCE 94 #define PIDX_DRBG_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES -#define PIDX_DRBG_PARAM_RANDOM_DATA 94 -#define PIDX_DRBG_PARAM_RESEED_COUNTER 95 -#define PIDX_DRBG_PARAM_RESEED_REQUESTS 96 -#define PIDX_DRBG_PARAM_RESEED_TIME 97 -#define PIDX_DRBG_PARAM_RESEED_TIME_INTERVAL 98 -#define PIDX_DRBG_PARAM_SIZE 80 -#define PIDX_DRBG_PARAM_USE_DF 99 +#define PIDX_DRBG_PARAM_RANDOM_DATA 95 +#define PIDX_DRBG_PARAM_RESEED_COUNTER 96 +#define PIDX_DRBG_PARAM_RESEED_REQUESTS 97 +#define PIDX_DRBG_PARAM_RESEED_TIME 98 +#define PIDX_DRBG_PARAM_RESEED_TIME_INTERVAL 99 +#define PIDX_DRBG_PARAM_SIZE 81 +#define PIDX_DRBG_PARAM_USE_DF 100 #define PIDX_ENCODER_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER -#define PIDX_ENCODER_PARAM_ENCRYPT_LEVEL 100 +#define PIDX_ENCODER_PARAM_ENCRYPT_LEVEL 101 #define PIDX_ENCODER_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES -#define PIDX_ENCODER_PARAM_SAVE_PARAMETERS 101 -#define PIDX_EXCHANGE_PARAM_EC_ECDH_COFACTOR_MODE 102 +#define PIDX_ENCODER_PARAM_SAVE_PARAMETERS 102 +#define PIDX_EXCHANGE_PARAM_EC_ECDH_COFACTOR_MODE 103 #define PIDX_EXCHANGE_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR #define PIDX_EXCHANGE_PARAM_FIPS_DIGEST_CHECK PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK #define PIDX_EXCHANGE_PARAM_FIPS_ECDH_COFACTOR_CHECK PIDX_PROV_PARAM_ECDH_COFACTOR_CHECK #define PIDX_EXCHANGE_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK -#define PIDX_EXCHANGE_PARAM_KDF_DIGEST 103 -#define PIDX_EXCHANGE_PARAM_KDF_DIGEST_PROPS 104 -#define PIDX_EXCHANGE_PARAM_KDF_OUTLEN 105 -#define PIDX_EXCHANGE_PARAM_KDF_TYPE 106 -#define PIDX_EXCHANGE_PARAM_KDF_UKM 107 -#define PIDX_EXCHANGE_PARAM_PAD 108 -#define PIDX_GEN_PARAM_ITERATION 109 -#define PIDX_GEN_PARAM_POTENTIAL 110 -#define PIDX_KDF_PARAM_ARGON2_AD 111 -#define PIDX_KDF_PARAM_ARGON2_LANES 112 -#define PIDX_KDF_PARAM_ARGON2_MEMCOST 113 -#define PIDX_KDF_PARAM_ARGON2_VERSION 114 -#define PIDX_KDF_PARAM_CEK_ALG 115 +#define PIDX_EXCHANGE_PARAM_KDF_DIGEST 104 +#define PIDX_EXCHANGE_PARAM_KDF_DIGEST_PROPS 105 +#define PIDX_EXCHANGE_PARAM_KDF_OUTLEN 106 +#define PIDX_EXCHANGE_PARAM_KDF_TYPE 107 +#define PIDX_EXCHANGE_PARAM_KDF_UKM 108 +#define PIDX_EXCHANGE_PARAM_PAD 109 +#define PIDX_GEN_PARAM_ITERATION 110 +#define PIDX_GEN_PARAM_POTENTIAL 111 +#define PIDX_KDF_PARAM_ARGON2_AD 112 +#define PIDX_KDF_PARAM_ARGON2_LANES 113 +#define PIDX_KDF_PARAM_ARGON2_MEMCOST 114 +#define PIDX_KDF_PARAM_ARGON2_VERSION 115 +#define PIDX_KDF_PARAM_CEK_ALG 116 #define PIDX_KDF_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER -#define PIDX_KDF_PARAM_CONSTANT 116 -#define PIDX_KDF_PARAM_DATA 117 +#define PIDX_KDF_PARAM_CONSTANT 117 +#define PIDX_KDF_PARAM_DATA 118 #define PIDX_KDF_PARAM_DIGEST PIDX_ALG_PARAM_DIGEST -#define PIDX_KDF_PARAM_EARLY_CLEAN 118 +#define PIDX_KDF_PARAM_EARLY_CLEAN 119 #define PIDX_KDF_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR #define PIDX_KDF_PARAM_FIPS_DIGEST_CHECK PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK -#define PIDX_KDF_PARAM_FIPS_EMS_CHECK 119 +#define PIDX_KDF_PARAM_FIPS_EMS_CHECK 120 #define PIDX_KDF_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK -#define PIDX_KDF_PARAM_HMACDRBG_ENTROPY 120 -#define PIDX_KDF_PARAM_HMACDRBG_NONCE 121 -#define PIDX_KDF_PARAM_INFO 122 -#define PIDX_KDF_PARAM_ITER 123 -#define PIDX_KDF_PARAM_KBKDF_R 124 -#define PIDX_KDF_PARAM_KBKDF_USE_L 125 -#define PIDX_KDF_PARAM_KBKDF_USE_SEPARATOR 126 -#define PIDX_KDF_PARAM_KEY 127 -#define PIDX_KDF_PARAM_LABEL 128 +#define PIDX_KDF_PARAM_HMACDRBG_ENTROPY 121 +#define PIDX_KDF_PARAM_HMACDRBG_NONCE 122 +#define PIDX_KDF_PARAM_INFO 123 +#define PIDX_KDF_PARAM_ITER 124 +#define PIDX_KDF_PARAM_KBKDF_R 125 +#define PIDX_KDF_PARAM_KBKDF_USE_L 126 +#define PIDX_KDF_PARAM_KBKDF_USE_SEPARATOR 127 +#define PIDX_KDF_PARAM_KEY 128 +#define PIDX_KDF_PARAM_LABEL 129 #define PIDX_KDF_PARAM_MAC PIDX_ALG_PARAM_MAC -#define PIDX_KDF_PARAM_MAC_SIZE 129 +#define PIDX_KDF_PARAM_MAC_SIZE 130 #define PIDX_KDF_PARAM_MODE 55 -#define PIDX_KDF_PARAM_PASSWORD 130 -#define PIDX_KDF_PARAM_PKCS12_ID 131 -#define PIDX_KDF_PARAM_PKCS5 132 -#define PIDX_KDF_PARAM_PREFIX 133 +#define PIDX_KDF_PARAM_PASSWORD 131 +#define PIDX_KDF_PARAM_PKCS12_ID 132 +#define PIDX_KDF_PARAM_PKCS5 133 +#define PIDX_KDF_PARAM_PREFIX 134 #define PIDX_KDF_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES -#define PIDX_KDF_PARAM_SALT 134 -#define PIDX_KDF_PARAM_SCRYPT_MAXMEM 135 -#define PIDX_KDF_PARAM_SCRYPT_N 136 -#define PIDX_KDF_PARAM_SCRYPT_P 137 -#define PIDX_KDF_PARAM_SCRYPT_R 124 -#define PIDX_KDF_PARAM_SECRET 138 -#define PIDX_KDF_PARAM_SEED 139 -#define PIDX_KDF_PARAM_SIZE 80 -#define PIDX_KDF_PARAM_SSHKDF_SESSION_ID 140 -#define PIDX_KDF_PARAM_SSHKDF_TYPE 141 -#define PIDX_KDF_PARAM_SSHKDF_XCGHASH 142 -#define PIDX_KDF_PARAM_THREADS 143 -#define PIDX_KDF_PARAM_UKM 144 -#define PIDX_KDF_PARAM_X942_ACVPINFO 145 -#define PIDX_KDF_PARAM_X942_PARTYUINFO 146 -#define PIDX_KDF_PARAM_X942_PARTYVINFO 147 -#define PIDX_KDF_PARAM_X942_SUPP_PRIVINFO 148 -#define PIDX_KDF_PARAM_X942_SUPP_PUBINFO 149 -#define PIDX_KDF_PARAM_X942_USE_KEYBITS 150 +#define PIDX_KDF_PARAM_SALT 135 +#define PIDX_KDF_PARAM_SCRYPT_MAXMEM 136 +#define PIDX_KDF_PARAM_SCRYPT_N 137 +#define PIDX_KDF_PARAM_SCRYPT_P 138 +#define PIDX_KDF_PARAM_SCRYPT_R 125 +#define PIDX_KDF_PARAM_SECRET 139 +#define PIDX_KDF_PARAM_SEED 140 +#define PIDX_KDF_PARAM_SIZE 81 +#define PIDX_KDF_PARAM_SSHKDF_SESSION_ID 141 +#define PIDX_KDF_PARAM_SSHKDF_TYPE 142 +#define PIDX_KDF_PARAM_SSHKDF_XCGHASH 143 +#define PIDX_KDF_PARAM_THREADS 144 +#define PIDX_KDF_PARAM_UKM 145 +#define PIDX_KDF_PARAM_X942_ACVPINFO 146 +#define PIDX_KDF_PARAM_X942_PARTYUINFO 147 +#define PIDX_KDF_PARAM_X942_PARTYVINFO 148 +#define PIDX_KDF_PARAM_X942_SUPP_PRIVINFO 149 +#define PIDX_KDF_PARAM_X942_SUPP_PUBINFO 150 +#define PIDX_KDF_PARAM_X942_USE_KEYBITS 151 #define PIDX_KEM_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR #define PIDX_KEM_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK -#define PIDX_KEM_PARAM_IKME 151 -#define PIDX_KEM_PARAM_OPERATION 152 -#define PIDX_LIBSSL_RECORD_LAYER_PARAM_BLOCK_PADDING 153 -#define PIDX_LIBSSL_RECORD_LAYER_PARAM_HS_PADDING 154 -#define PIDX_LIBSSL_RECORD_LAYER_PARAM_MAX_EARLY_DATA 155 -#define PIDX_LIBSSL_RECORD_LAYER_PARAM_MAX_FRAG_LEN 156 +#define PIDX_KEM_PARAM_IKME 152 +#define PIDX_KEM_PARAM_OPERATION 153 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_BLOCK_PADDING 154 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_HS_PADDING 155 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_MAX_EARLY_DATA 156 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_MAX_FRAG_LEN 157 #define PIDX_LIBSSL_RECORD_LAYER_PARAM_MODE 55 -#define PIDX_LIBSSL_RECORD_LAYER_PARAM_OPTIONS 157 -#define PIDX_LIBSSL_RECORD_LAYER_PARAM_READ_AHEAD 158 -#define PIDX_LIBSSL_RECORD_LAYER_PARAM_STREAM_MAC 159 -#define PIDX_LIBSSL_RECORD_LAYER_PARAM_TLSTREE 160 -#define PIDX_LIBSSL_RECORD_LAYER_PARAM_USE_ETM 161 -#define PIDX_LIBSSL_RECORD_LAYER_READ_BUFFER_LEN 162 -#define PIDX_MAC_PARAM_BLOCK_SIZE 163 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_OPTIONS 158 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_READ_AHEAD 159 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_STREAM_MAC 160 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_TLSTREE 161 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_USE_ETM 162 +#define PIDX_LIBSSL_RECORD_LAYER_READ_BUFFER_LEN 163 +#define PIDX_MAC_PARAM_BLOCK_SIZE 164 #define PIDX_MAC_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER -#define PIDX_MAC_PARAM_CUSTOM 164 -#define PIDX_MAC_PARAM_C_ROUNDS 165 +#define PIDX_MAC_PARAM_CUSTOM 165 +#define PIDX_MAC_PARAM_C_ROUNDS 166 #define PIDX_MAC_PARAM_DIGEST PIDX_ALG_PARAM_DIGEST -#define PIDX_MAC_PARAM_DIGEST_NOINIT 166 -#define PIDX_MAC_PARAM_DIGEST_ONESHOT 167 -#define PIDX_MAC_PARAM_D_ROUNDS 168 +#define PIDX_MAC_PARAM_DIGEST_NOINIT 167 +#define PIDX_MAC_PARAM_DIGEST_ONESHOT 168 +#define PIDX_MAC_PARAM_D_ROUNDS 169 #define PIDX_MAC_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR #define PIDX_MAC_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK #define PIDX_MAC_PARAM_FIPS_NO_SHORT_MAC PIDX_PROV_PARAM_NO_SHORT_MAC #define PIDX_MAC_PARAM_IV 52 -#define PIDX_MAC_PARAM_KEY 127 +#define PIDX_MAC_PARAM_KEY 128 #define PIDX_MAC_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES -#define PIDX_MAC_PARAM_SALT 134 -#define PIDX_MAC_PARAM_SIZE 80 -#define PIDX_MAC_PARAM_TLS_DATA_SIZE 169 -#define PIDX_MAC_PARAM_XOF 82 -#define PIDX_OBJECT_PARAM_DATA 117 -#define PIDX_OBJECT_PARAM_DATA_STRUCTURE 170 -#define PIDX_OBJECT_PARAM_DATA_TYPE 171 -#define PIDX_OBJECT_PARAM_DESC 172 -#define PIDX_OBJECT_PARAM_REFERENCE 173 -#define PIDX_OBJECT_PARAM_TYPE 141 -#define PIDX_PASSPHRASE_PARAM_INFO 122 +#define PIDX_MAC_PARAM_SALT 135 +#define PIDX_MAC_PARAM_SIZE 81 +#define PIDX_MAC_PARAM_TLS_DATA_SIZE 170 +#define PIDX_MAC_PARAM_XOF 83 +#define PIDX_OBJECT_PARAM_DATA 118 +#define PIDX_OBJECT_PARAM_DATA_STRUCTURE 171 +#define PIDX_OBJECT_PARAM_DATA_TYPE 172 +#define PIDX_OBJECT_PARAM_DESC 173 +#define PIDX_OBJECT_PARAM_INPUT_TYPE 174 +#define PIDX_OBJECT_PARAM_REFERENCE 175 +#define PIDX_OBJECT_PARAM_TYPE 142 +#define PIDX_PASSPHRASE_PARAM_INFO 123 #define PIDX_PKEY_PARAM_ALGORITHM_ID PIDX_ALG_PARAM_ALGORITHM_ID #define PIDX_PKEY_PARAM_ALGORITHM_ID_PARAMS PIDX_ALG_PARAM_ALGORITHM_ID_PARAMS -#define PIDX_PKEY_PARAM_BITS 174 +#define PIDX_PKEY_PARAM_BITS 176 #define PIDX_PKEY_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER -#define PIDX_PKEY_PARAM_DEFAULT_DIGEST 175 -#define PIDX_PKEY_PARAM_DHKEM_IKM 176 -#define PIDX_PKEY_PARAM_DH_GENERATOR 177 -#define PIDX_PKEY_PARAM_DH_PRIV_LEN 178 +#define PIDX_PKEY_PARAM_DEFAULT_DIGEST 177 +#define PIDX_PKEY_PARAM_DHKEM_IKM 178 +#define PIDX_PKEY_PARAM_DH_GENERATOR 179 +#define PIDX_PKEY_PARAM_DH_PRIV_LEN 180 #define PIDX_PKEY_PARAM_DIGEST PIDX_ALG_PARAM_DIGEST -#define PIDX_PKEY_PARAM_DIGEST_SIZE 179 -#define PIDX_PKEY_PARAM_DIST_ID 180 -#define PIDX_PKEY_PARAM_EC_A 181 -#define PIDX_PKEY_PARAM_EC_B 182 -#define PIDX_PKEY_PARAM_EC_CHAR2_M 183 -#define PIDX_PKEY_PARAM_EC_CHAR2_PP_K1 184 -#define PIDX_PKEY_PARAM_EC_CHAR2_PP_K2 185 -#define PIDX_PKEY_PARAM_EC_CHAR2_PP_K3 186 -#define PIDX_PKEY_PARAM_EC_CHAR2_TP_BASIS 187 -#define PIDX_PKEY_PARAM_EC_CHAR2_TYPE 188 -#define PIDX_PKEY_PARAM_EC_COFACTOR 189 -#define PIDX_PKEY_PARAM_EC_DECODED_FROM_EXPLICIT_PARAMS 190 -#define PIDX_PKEY_PARAM_EC_ENCODING 191 -#define PIDX_PKEY_PARAM_EC_FIELD_TYPE 192 -#define PIDX_PKEY_PARAM_EC_GENERATOR 193 -#define PIDX_PKEY_PARAM_EC_GROUP_CHECK_TYPE 194 -#define PIDX_PKEY_PARAM_EC_INCLUDE_PUBLIC 195 -#define PIDX_PKEY_PARAM_EC_ORDER 196 -#define PIDX_PKEY_PARAM_EC_P 137 -#define PIDX_PKEY_PARAM_EC_POINT_CONVERSION_FORMAT 197 -#define PIDX_PKEY_PARAM_EC_PUB_X 198 -#define PIDX_PKEY_PARAM_EC_PUB_Y 199 -#define PIDX_PKEY_PARAM_EC_SEED 139 -#define PIDX_PKEY_PARAM_ENCODED_PUBLIC_KEY 200 +#define PIDX_PKEY_PARAM_DIGEST_SIZE 181 +#define PIDX_PKEY_PARAM_DIST_ID 182 +#define PIDX_PKEY_PARAM_EC_A 183 +#define PIDX_PKEY_PARAM_EC_B 184 +#define PIDX_PKEY_PARAM_EC_CHAR2_M 185 +#define PIDX_PKEY_PARAM_EC_CHAR2_PP_K1 186 +#define PIDX_PKEY_PARAM_EC_CHAR2_PP_K2 187 +#define PIDX_PKEY_PARAM_EC_CHAR2_PP_K3 188 +#define PIDX_PKEY_PARAM_EC_CHAR2_TP_BASIS 189 +#define PIDX_PKEY_PARAM_EC_CHAR2_TYPE 190 +#define PIDX_PKEY_PARAM_EC_COFACTOR 191 +#define PIDX_PKEY_PARAM_EC_DECODED_FROM_EXPLICIT_PARAMS 192 +#define PIDX_PKEY_PARAM_EC_ENCODING 193 +#define PIDX_PKEY_PARAM_EC_FIELD_TYPE 194 +#define PIDX_PKEY_PARAM_EC_GENERATOR 195 +#define PIDX_PKEY_PARAM_EC_GROUP_CHECK_TYPE 196 +#define PIDX_PKEY_PARAM_EC_INCLUDE_PUBLIC 197 +#define PIDX_PKEY_PARAM_EC_ORDER 198 +#define PIDX_PKEY_PARAM_EC_P 138 +#define PIDX_PKEY_PARAM_EC_POINT_CONVERSION_FORMAT 199 +#define PIDX_PKEY_PARAM_EC_PUB_X 200 +#define PIDX_PKEY_PARAM_EC_PUB_Y 201 +#define PIDX_PKEY_PARAM_EC_SEED 140 +#define PIDX_PKEY_PARAM_ENCODED_PUBLIC_KEY 202 #define PIDX_PKEY_PARAM_ENGINE PIDX_ALG_PARAM_ENGINE -#define PIDX_PKEY_PARAM_FFC_COFACTOR 201 +#define PIDX_PKEY_PARAM_FFC_COFACTOR 203 #define PIDX_PKEY_PARAM_FFC_DIGEST PIDX_PKEY_PARAM_DIGEST #define PIDX_PKEY_PARAM_FFC_DIGEST_PROPS PIDX_PKEY_PARAM_PROPERTIES -#define PIDX_PKEY_PARAM_FFC_G 202 -#define PIDX_PKEY_PARAM_FFC_GINDEX 203 -#define PIDX_PKEY_PARAM_FFC_H 204 -#define PIDX_PKEY_PARAM_FFC_P 137 -#define PIDX_PKEY_PARAM_FFC_PBITS 205 -#define PIDX_PKEY_PARAM_FFC_PCOUNTER 206 -#define PIDX_PKEY_PARAM_FFC_Q 207 -#define PIDX_PKEY_PARAM_FFC_QBITS 208 -#define PIDX_PKEY_PARAM_FFC_SEED 139 -#define PIDX_PKEY_PARAM_FFC_TYPE 141 -#define PIDX_PKEY_PARAM_FFC_VALIDATE_G 209 -#define PIDX_PKEY_PARAM_FFC_VALIDATE_LEGACY 210 -#define PIDX_PKEY_PARAM_FFC_VALIDATE_PQ 211 +#define PIDX_PKEY_PARAM_FFC_G 204 +#define PIDX_PKEY_PARAM_FFC_GINDEX 205 +#define PIDX_PKEY_PARAM_FFC_H 206 +#define PIDX_PKEY_PARAM_FFC_P 138 +#define PIDX_PKEY_PARAM_FFC_PBITS 207 +#define PIDX_PKEY_PARAM_FFC_PCOUNTER 208 +#define PIDX_PKEY_PARAM_FFC_Q 209 +#define PIDX_PKEY_PARAM_FFC_QBITS 210 +#define PIDX_PKEY_PARAM_FFC_SEED 140 +#define PIDX_PKEY_PARAM_FFC_TYPE 142 +#define PIDX_PKEY_PARAM_FFC_VALIDATE_G 211 +#define PIDX_PKEY_PARAM_FFC_VALIDATE_LEGACY 212 +#define PIDX_PKEY_PARAM_FFC_VALIDATE_PQ 213 #define PIDX_PKEY_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR -#define PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK 212 -#define PIDX_PKEY_PARAM_FIPS_KEY_CHECK 213 -#define PIDX_PKEY_PARAM_FIPS_SIGN_CHECK 214 -#define PIDX_PKEY_PARAM_GROUP_NAME 215 +#define PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK 214 +#define PIDX_PKEY_PARAM_FIPS_KEY_CHECK 215 +#define PIDX_PKEY_PARAM_FIPS_SIGN_CHECK 216 +#define PIDX_PKEY_PARAM_GROUP_NAME 217 #define PIDX_PKEY_PARAM_IMPLICIT_REJECTION 8 -#define PIDX_PKEY_PARAM_MANDATORY_DIGEST 216 -#define PIDX_PKEY_PARAM_MASKGENFUNC 217 -#define PIDX_PKEY_PARAM_MAX_SIZE 218 -#define PIDX_PKEY_PARAM_MGF1_DIGEST 219 -#define PIDX_PKEY_PARAM_MGF1_PROPERTIES 220 -#define PIDX_PKEY_PARAM_PAD_MODE 221 -#define PIDX_PKEY_PARAM_PRIV_KEY 222 +#define PIDX_PKEY_PARAM_MANDATORY_DIGEST 218 +#define PIDX_PKEY_PARAM_MASKGENFUNC 219 +#define PIDX_PKEY_PARAM_MAX_SIZE 220 +#define PIDX_PKEY_PARAM_MGF1_DIGEST 221 +#define PIDX_PKEY_PARAM_MGF1_PROPERTIES 222 +#define PIDX_PKEY_PARAM_ML_DSA_INPUT_FORMATS 223 +#define PIDX_PKEY_PARAM_ML_DSA_OUTPUT_FORMATS 224 +#define PIDX_PKEY_PARAM_ML_DSA_PREFER_SEED 225 +#define PIDX_PKEY_PARAM_ML_DSA_RETAIN_SEED 226 +#define PIDX_PKEY_PARAM_ML_DSA_SEED 140 +#define PIDX_PKEY_PARAM_ML_KEM_IMPORT_PCT_TYPE 227 +#define PIDX_PKEY_PARAM_ML_KEM_INPUT_FORMATS 228 +#define PIDX_PKEY_PARAM_ML_KEM_OUTPUT_FORMATS 229 +#define PIDX_PKEY_PARAM_ML_KEM_PREFER_SEED 230 +#define PIDX_PKEY_PARAM_ML_KEM_RETAIN_SEED 231 +#define PIDX_PKEY_PARAM_ML_KEM_SEED 140 +#define PIDX_PKEY_PARAM_PAD_MODE 232 +#define PIDX_PKEY_PARAM_PRIV_KEY 233 #define PIDX_PKEY_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES -#define PIDX_PKEY_PARAM_PUB_KEY 223 +#define PIDX_PKEY_PARAM_PUB_KEY 234 #define PIDX_PKEY_PARAM_RSA_BITS PIDX_PKEY_PARAM_BITS -#define PIDX_PKEY_PARAM_RSA_COEFFICIENT 224 -#define PIDX_PKEY_PARAM_RSA_COEFFICIENT1 225 -#define PIDX_PKEY_PARAM_RSA_COEFFICIENT2 226 -#define PIDX_PKEY_PARAM_RSA_COEFFICIENT3 227 -#define PIDX_PKEY_PARAM_RSA_COEFFICIENT4 228 -#define PIDX_PKEY_PARAM_RSA_COEFFICIENT5 229 -#define PIDX_PKEY_PARAM_RSA_COEFFICIENT6 230 -#define PIDX_PKEY_PARAM_RSA_COEFFICIENT7 231 -#define PIDX_PKEY_PARAM_RSA_COEFFICIENT8 232 -#define PIDX_PKEY_PARAM_RSA_COEFFICIENT9 233 -#define PIDX_PKEY_PARAM_RSA_D 234 -#define PIDX_PKEY_PARAM_RSA_DERIVE_FROM_PQ 235 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT 235 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT1 236 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT2 237 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT3 238 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT4 239 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT5 240 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT6 241 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT7 242 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT8 243 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT9 244 +#define PIDX_PKEY_PARAM_RSA_D 245 +#define PIDX_PKEY_PARAM_RSA_DERIVE_FROM_PQ 246 #define PIDX_PKEY_PARAM_RSA_DIGEST PIDX_PKEY_PARAM_DIGEST #define PIDX_PKEY_PARAM_RSA_DIGEST_PROPS PIDX_PKEY_PARAM_PROPERTIES -#define PIDX_PKEY_PARAM_RSA_E 236 -#define PIDX_PKEY_PARAM_RSA_EXPONENT 237 -#define PIDX_PKEY_PARAM_RSA_EXPONENT1 238 -#define PIDX_PKEY_PARAM_RSA_EXPONENT10 239 -#define PIDX_PKEY_PARAM_RSA_EXPONENT2 240 -#define PIDX_PKEY_PARAM_RSA_EXPONENT3 241 -#define PIDX_PKEY_PARAM_RSA_EXPONENT4 242 -#define PIDX_PKEY_PARAM_RSA_EXPONENT5 243 -#define PIDX_PKEY_PARAM_RSA_EXPONENT6 244 -#define PIDX_PKEY_PARAM_RSA_EXPONENT7 245 -#define PIDX_PKEY_PARAM_RSA_EXPONENT8 246 -#define PIDX_PKEY_PARAM_RSA_EXPONENT9 247 -#define PIDX_PKEY_PARAM_RSA_FACTOR 248 -#define PIDX_PKEY_PARAM_RSA_FACTOR1 249 -#define PIDX_PKEY_PARAM_RSA_FACTOR10 250 -#define PIDX_PKEY_PARAM_RSA_FACTOR2 251 -#define PIDX_PKEY_PARAM_RSA_FACTOR3 252 -#define PIDX_PKEY_PARAM_RSA_FACTOR4 253 -#define PIDX_PKEY_PARAM_RSA_FACTOR5 254 -#define PIDX_PKEY_PARAM_RSA_FACTOR6 255 -#define PIDX_PKEY_PARAM_RSA_FACTOR7 256 -#define PIDX_PKEY_PARAM_RSA_FACTOR8 257 -#define PIDX_PKEY_PARAM_RSA_FACTOR9 258 +#define PIDX_PKEY_PARAM_RSA_E 247 +#define PIDX_PKEY_PARAM_RSA_EXPONENT 248 +#define PIDX_PKEY_PARAM_RSA_EXPONENT1 249 +#define PIDX_PKEY_PARAM_RSA_EXPONENT10 250 +#define PIDX_PKEY_PARAM_RSA_EXPONENT2 251 +#define PIDX_PKEY_PARAM_RSA_EXPONENT3 252 +#define PIDX_PKEY_PARAM_RSA_EXPONENT4 253 +#define PIDX_PKEY_PARAM_RSA_EXPONENT5 254 +#define PIDX_PKEY_PARAM_RSA_EXPONENT6 255 +#define PIDX_PKEY_PARAM_RSA_EXPONENT7 256 +#define PIDX_PKEY_PARAM_RSA_EXPONENT8 257 +#define PIDX_PKEY_PARAM_RSA_EXPONENT9 258 +#define PIDX_PKEY_PARAM_RSA_FACTOR 259 +#define PIDX_PKEY_PARAM_RSA_FACTOR1 260 +#define PIDX_PKEY_PARAM_RSA_FACTOR10 261 +#define PIDX_PKEY_PARAM_RSA_FACTOR2 262 +#define PIDX_PKEY_PARAM_RSA_FACTOR3 263 +#define PIDX_PKEY_PARAM_RSA_FACTOR4 264 +#define PIDX_PKEY_PARAM_RSA_FACTOR5 265 +#define PIDX_PKEY_PARAM_RSA_FACTOR6 266 +#define PIDX_PKEY_PARAM_RSA_FACTOR7 267 +#define PIDX_PKEY_PARAM_RSA_FACTOR8 268 +#define PIDX_PKEY_PARAM_RSA_FACTOR9 269 #define PIDX_PKEY_PARAM_RSA_MASKGENFUNC PIDX_PKEY_PARAM_MASKGENFUNC #define PIDX_PKEY_PARAM_RSA_MGF1_DIGEST PIDX_PKEY_PARAM_MGF1_DIGEST -#define PIDX_PKEY_PARAM_RSA_N 136 -#define PIDX_PKEY_PARAM_RSA_PRIMES 259 -#define PIDX_PKEY_PARAM_RSA_PSS_SALTLEN 260 -#define PIDX_PKEY_PARAM_RSA_TEST_P1 261 -#define PIDX_PKEY_PARAM_RSA_TEST_P2 262 -#define PIDX_PKEY_PARAM_RSA_TEST_Q1 263 -#define PIDX_PKEY_PARAM_RSA_TEST_Q2 264 -#define PIDX_PKEY_PARAM_RSA_TEST_XP 265 -#define PIDX_PKEY_PARAM_RSA_TEST_XP1 266 -#define PIDX_PKEY_PARAM_RSA_TEST_XP2 267 -#define PIDX_PKEY_PARAM_RSA_TEST_XQ 268 -#define PIDX_PKEY_PARAM_RSA_TEST_XQ1 269 -#define PIDX_PKEY_PARAM_RSA_TEST_XQ2 270 -#define PIDX_PKEY_PARAM_SECURITY_BITS 271 +#define PIDX_PKEY_PARAM_RSA_N 137 +#define PIDX_PKEY_PARAM_RSA_PRIMES 270 +#define PIDX_PKEY_PARAM_RSA_PSS_SALTLEN 271 +#define PIDX_PKEY_PARAM_RSA_TEST_P1 272 +#define PIDX_PKEY_PARAM_RSA_TEST_P2 273 +#define PIDX_PKEY_PARAM_RSA_TEST_Q1 274 +#define PIDX_PKEY_PARAM_RSA_TEST_Q2 275 +#define PIDX_PKEY_PARAM_RSA_TEST_XP 276 +#define PIDX_PKEY_PARAM_RSA_TEST_XP1 277 +#define PIDX_PKEY_PARAM_RSA_TEST_XP2 278 +#define PIDX_PKEY_PARAM_RSA_TEST_XQ 279 +#define PIDX_PKEY_PARAM_RSA_TEST_XQ1 280 +#define PIDX_PKEY_PARAM_RSA_TEST_XQ2 281 +#define PIDX_PKEY_PARAM_SECURITY_BITS 282 +#define PIDX_PKEY_PARAM_SLH_DSA_SEED 140 #define PIDX_PKEY_PARAM_USE_COFACTOR_ECDH PIDX_PKEY_PARAM_USE_COFACTOR_FLAG -#define PIDX_PKEY_PARAM_USE_COFACTOR_FLAG 272 -#define PIDX_PROV_PARAM_BUILDINFO 273 -#define PIDX_PROV_PARAM_CORE_MODULE_FILENAME 274 -#define PIDX_PROV_PARAM_CORE_PROV_NAME 275 -#define PIDX_PROV_PARAM_CORE_VERSION 276 -#define PIDX_PROV_PARAM_DRBG_TRUNC_DIGEST 277 -#define PIDX_PROV_PARAM_DSA_SIGN_DISABLED 278 -#define PIDX_PROV_PARAM_ECDH_COFACTOR_CHECK 279 -#define PIDX_PROV_PARAM_HKDF_DIGEST_CHECK 280 -#define PIDX_PROV_PARAM_HKDF_KEY_CHECK 281 -#define PIDX_PROV_PARAM_HMAC_KEY_CHECK 282 -#define PIDX_PROV_PARAM_KBKDF_KEY_CHECK 283 -#define PIDX_PROV_PARAM_KMAC_KEY_CHECK 284 -#define PIDX_PROV_PARAM_NAME 285 -#define PIDX_PROV_PARAM_NO_SHORT_MAC 286 -#define PIDX_PROV_PARAM_PBKDF2_LOWER_BOUND_CHECK 287 -#define PIDX_PROV_PARAM_RSA_PKCS15_PAD_DISABLED 288 -#define PIDX_PROV_PARAM_RSA_PSS_SALTLEN_CHECK 289 -#define PIDX_PROV_PARAM_RSA_SIGN_X931_PAD_DISABLED 290 -#define PIDX_PROV_PARAM_SECURITY_CHECKS 291 -#define PIDX_PROV_PARAM_SELF_TEST_DESC 292 -#define PIDX_PROV_PARAM_SELF_TEST_PHASE 293 -#define PIDX_PROV_PARAM_SELF_TEST_TYPE 294 -#define PIDX_PROV_PARAM_SIGNATURE_DIGEST_CHECK 295 -#define PIDX_PROV_PARAM_SSHKDF_DIGEST_CHECK 296 -#define PIDX_PROV_PARAM_SSHKDF_KEY_CHECK 297 -#define PIDX_PROV_PARAM_SSKDF_DIGEST_CHECK 298 -#define PIDX_PROV_PARAM_SSKDF_KEY_CHECK 299 -#define PIDX_PROV_PARAM_STATUS 300 -#define PIDX_PROV_PARAM_TDES_ENCRYPT_DISABLED 301 -#define PIDX_PROV_PARAM_TLS13_KDF_DIGEST_CHECK 302 -#define PIDX_PROV_PARAM_TLS13_KDF_KEY_CHECK 303 -#define PIDX_PROV_PARAM_TLS1_PRF_DIGEST_CHECK 304 -#define PIDX_PROV_PARAM_TLS1_PRF_EMS_CHECK 305 -#define PIDX_PROV_PARAM_TLS1_PRF_KEY_CHECK 306 -#define PIDX_PROV_PARAM_VERSION 114 -#define PIDX_PROV_PARAM_X942KDF_KEY_CHECK 307 -#define PIDX_PROV_PARAM_X963KDF_DIGEST_CHECK 308 -#define PIDX_PROV_PARAM_X963KDF_KEY_CHECK 309 +#define PIDX_PKEY_PARAM_USE_COFACTOR_FLAG 283 +#define PIDX_PROV_PARAM_BUILDINFO 284 +#define PIDX_PROV_PARAM_CORE_MODULE_FILENAME 285 +#define PIDX_PROV_PARAM_CORE_PROV_NAME 286 +#define PIDX_PROV_PARAM_CORE_VERSION 287 +#define PIDX_PROV_PARAM_DRBG_TRUNC_DIGEST 288 +#define PIDX_PROV_PARAM_DSA_SIGN_DISABLED 289 +#define PIDX_PROV_PARAM_ECDH_COFACTOR_CHECK 290 +#define PIDX_PROV_PARAM_HKDF_DIGEST_CHECK 291 +#define PIDX_PROV_PARAM_HKDF_KEY_CHECK 292 +#define PIDX_PROV_PARAM_HMAC_KEY_CHECK 293 +#define PIDX_PROV_PARAM_KBKDF_KEY_CHECK 294 +#define PIDX_PROV_PARAM_KMAC_KEY_CHECK 295 +#define PIDX_PROV_PARAM_NAME 296 +#define PIDX_PROV_PARAM_NO_SHORT_MAC 297 +#define PIDX_PROV_PARAM_PBKDF2_LOWER_BOUND_CHECK 298 +#define PIDX_PROV_PARAM_RSA_PKCS15_PAD_DISABLED 299 +#define PIDX_PROV_PARAM_RSA_PSS_SALTLEN_CHECK 300 +#define PIDX_PROV_PARAM_RSA_SIGN_X931_PAD_DISABLED 301 +#define PIDX_PROV_PARAM_SECURITY_CHECKS 302 +#define PIDX_PROV_PARAM_SELF_TEST_DESC 303 +#define PIDX_PROV_PARAM_SELF_TEST_PHASE 304 +#define PIDX_PROV_PARAM_SELF_TEST_TYPE 305 +#define PIDX_PROV_PARAM_SIGNATURE_DIGEST_CHECK 306 +#define PIDX_PROV_PARAM_SSHKDF_DIGEST_CHECK 307 +#define PIDX_PROV_PARAM_SSHKDF_KEY_CHECK 308 +#define PIDX_PROV_PARAM_SSKDF_DIGEST_CHECK 309 +#define PIDX_PROV_PARAM_SSKDF_KEY_CHECK 310 +#define PIDX_PROV_PARAM_STATUS 311 +#define PIDX_PROV_PARAM_TDES_ENCRYPT_DISABLED 312 +#define PIDX_PROV_PARAM_TLS13_KDF_DIGEST_CHECK 313 +#define PIDX_PROV_PARAM_TLS13_KDF_KEY_CHECK 314 +#define PIDX_PROV_PARAM_TLS1_PRF_DIGEST_CHECK 315 +#define PIDX_PROV_PARAM_TLS1_PRF_EMS_CHECK 316 +#define PIDX_PROV_PARAM_TLS1_PRF_KEY_CHECK 317 +#define PIDX_PROV_PARAM_VERSION 115 +#define PIDX_PROV_PARAM_X942KDF_KEY_CHECK 318 +#define PIDX_PROV_PARAM_X963KDF_DIGEST_CHECK 319 +#define PIDX_PROV_PARAM_X963KDF_KEY_CHECK 320 #define PIDX_RAND_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR -#define PIDX_RAND_PARAM_GENERATE 310 -#define PIDX_RAND_PARAM_MAX_REQUEST 311 -#define PIDX_RAND_PARAM_STATE 312 -#define PIDX_RAND_PARAM_STRENGTH 313 -#define PIDX_RAND_PARAM_TEST_ENTROPY 314 -#define PIDX_RAND_PARAM_TEST_NONCE 315 +#define PIDX_RAND_PARAM_GENERATE 321 +#define PIDX_RAND_PARAM_MAX_REQUEST 322 +#define PIDX_RAND_PARAM_STATE 323 +#define PIDX_RAND_PARAM_STRENGTH 324 +#define PIDX_RAND_PARAM_TEST_ENTROPY 325 +#define PIDX_RAND_PARAM_TEST_NONCE 326 +#define PIDX_SIGNATURE_PARAM_ADD_RANDOM 327 #define PIDX_SIGNATURE_PARAM_ALGORITHM_ID PIDX_PKEY_PARAM_ALGORITHM_ID #define PIDX_SIGNATURE_PARAM_ALGORITHM_ID_PARAMS PIDX_PKEY_PARAM_ALGORITHM_ID_PARAMS -#define PIDX_SIGNATURE_PARAM_CONTEXT_STRING 316 +#define PIDX_SIGNATURE_PARAM_CONTEXT_STRING 328 +#define PIDX_SIGNATURE_PARAM_DETERMINISTIC 329 #define PIDX_SIGNATURE_PARAM_DIGEST PIDX_PKEY_PARAM_DIGEST #define PIDX_SIGNATURE_PARAM_DIGEST_SIZE PIDX_PKEY_PARAM_DIGEST_SIZE #define PIDX_SIGNATURE_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR #define PIDX_SIGNATURE_PARAM_FIPS_DIGEST_CHECK PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK #define PIDX_SIGNATURE_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK -#define PIDX_SIGNATURE_PARAM_FIPS_RSA_PSS_SALTLEN_CHECK 289 +#define PIDX_SIGNATURE_PARAM_FIPS_RSA_PSS_SALTLEN_CHECK 300 #define PIDX_SIGNATURE_PARAM_FIPS_SIGN_CHECK PIDX_PKEY_PARAM_FIPS_SIGN_CHECK -#define PIDX_SIGNATURE_PARAM_FIPS_SIGN_X931_PAD_CHECK 317 -#define PIDX_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE 318 -#define PIDX_SIGNATURE_PARAM_INSTANCE 319 -#define PIDX_SIGNATURE_PARAM_KAT 320 +#define PIDX_SIGNATURE_PARAM_FIPS_SIGN_X931_PAD_CHECK 330 +#define PIDX_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE 331 +#define PIDX_SIGNATURE_PARAM_INSTANCE 332 +#define PIDX_SIGNATURE_PARAM_KAT 333 +#define PIDX_SIGNATURE_PARAM_MESSAGE_ENCODING 334 #define PIDX_SIGNATURE_PARAM_MGF1_DIGEST PIDX_PKEY_PARAM_MGF1_DIGEST #define PIDX_SIGNATURE_PARAM_MGF1_PROPERTIES PIDX_PKEY_PARAM_MGF1_PROPERTIES -#define PIDX_SIGNATURE_PARAM_NONCE_TYPE 321 +#define PIDX_SIGNATURE_PARAM_MU 335 +#define PIDX_SIGNATURE_PARAM_NONCE_TYPE 336 #define PIDX_SIGNATURE_PARAM_PAD_MODE PIDX_PKEY_PARAM_PAD_MODE #define PIDX_SIGNATURE_PARAM_PROPERTIES PIDX_PKEY_PARAM_PROPERTIES -#define PIDX_SIGNATURE_PARAM_PSS_SALTLEN 260 -#define PIDX_SIGNATURE_PARAM_SIGNATURE 322 -#define PIDX_STORE_PARAM_ALIAS 323 +#define PIDX_SIGNATURE_PARAM_PSS_SALTLEN 271 +#define PIDX_SIGNATURE_PARAM_SIGNATURE 337 +#define PIDX_SIGNATURE_PARAM_TEST_ENTROPY 338 +#define PIDX_SKEY_PARAM_KEY_LENGTH 339 +#define PIDX_SKEY_PARAM_RAW_BYTES 340 +#define PIDX_STORE_PARAM_ALIAS 341 #define PIDX_STORE_PARAM_DIGEST 3 -#define PIDX_STORE_PARAM_EXPECT 324 -#define PIDX_STORE_PARAM_FINGERPRINT 325 -#define PIDX_STORE_PARAM_INPUT_TYPE 326 -#define PIDX_STORE_PARAM_ISSUER 285 +#define PIDX_STORE_PARAM_EXPECT 342 +#define PIDX_STORE_PARAM_FINGERPRINT 343 +#define PIDX_STORE_PARAM_INPUT_TYPE 174 +#define PIDX_STORE_PARAM_ISSUER 296 #define PIDX_STORE_PARAM_PROPERTIES 7 -#define PIDX_STORE_PARAM_SERIAL 327 -#define PIDX_STORE_PARAM_SUBJECT 328 +#define PIDX_STORE_PARAM_SERIAL 344 +#define PIDX_STORE_PARAM_SUBJECT 345 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/asn1.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/asn1.h index 2425fa10cf34..d6c943ac69d3 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/asn1.h +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/asn1.h @@ -2,7 +2,7 @@ * WARNING: do not edit! * Generated by Makefile from include/openssl/asn1.h.in * - * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License 2.0 (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy @@ -53,14 +53,14 @@ extern "C" { # define V_ASN1_PRIMITIVE_TAG 0x1f # define V_ASN1_PRIMATIVE_TAG /*compat*/ V_ASN1_PRIMITIVE_TAG -# define V_ASN1_APP_CHOOSE -2/* let the recipient choose */ -# define V_ASN1_OTHER -3/* used in ASN1_TYPE */ -# define V_ASN1_ANY -4/* used in ASN1 template code */ +# define V_ASN1_APP_CHOOSE -2 /* let the recipient choose */ +# define V_ASN1_OTHER -3 /* used in ASN1_TYPE */ +# define V_ASN1_ANY -4 /* used in ASN1 template code */ # define V_ASN1_UNDEF -1 /* ASN.1 tag values */ # define V_ASN1_EOC 0 -# define V_ASN1_BOOLEAN 1 /**/ +# define V_ASN1_BOOLEAN 1 # define V_ASN1_INTEGER 2 # define V_ASN1_BIT_STRING 3 # define V_ASN1_OCTET_STRING 4 @@ -73,19 +73,19 @@ extern "C" { # define V_ASN1_UTF8STRING 12 # define V_ASN1_SEQUENCE 16 # define V_ASN1_SET 17 -# define V_ASN1_NUMERICSTRING 18 /**/ +# define V_ASN1_NUMERICSTRING 18 # define V_ASN1_PRINTABLESTRING 19 # define V_ASN1_T61STRING 20 -# define V_ASN1_TELETEXSTRING 20/* alias */ -# define V_ASN1_VIDEOTEXSTRING 21 /**/ +# define V_ASN1_TELETEXSTRING 20 /* alias */ +# define V_ASN1_VIDEOTEXSTRING 21 # define V_ASN1_IA5STRING 22 # define V_ASN1_UTCTIME 23 -# define V_ASN1_GENERALIZEDTIME 24 /**/ -# define V_ASN1_GRAPHICSTRING 25 /**/ -# define V_ASN1_ISO64STRING 26 /**/ -# define V_ASN1_VISIBLESTRING 26/* alias */ -# define V_ASN1_GENERALSTRING 27 /**/ -# define V_ASN1_UNIVERSALSTRING 28 /**/ +# define V_ASN1_GENERALIZEDTIME 24 +# define V_ASN1_GRAPHICSTRING 25 +# define V_ASN1_ISO64STRING 26 +# define V_ASN1_VISIBLESTRING 26 /* alias */ +# define V_ASN1_GENERALSTRING 27 +# define V_ASN1_UNIVERSALSTRING 28 # define V_ASN1_BMPSTRING 30 /* @@ -278,7 +278,7 @@ typedef struct ASN1_TLC_st ASN1_TLC; /* This is just an opaque pointer */ typedef struct ASN1_VALUE_st ASN1_VALUE; -/* Declare ASN1 functions: the implement macro in in asn1t.h */ +/* Declare ASN1 functions: the implement macro is in asn1t.h */ /* * The mysterious 'extern' that's passed to some macros is innocuous, @@ -371,6 +371,7 @@ typedef struct ASN1_VALUE_st ASN1_VALUE; typedef void *d2i_of_void(void **, const unsigned char **, long); typedef int i2d_of_void(const void *, unsigned char **); +typedef int OSSL_i2d_of_void_ctx(const void *, unsigned char **, void *vctx); /*- * The following macros and typedefs allow an ASN1_ITEM diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/bio.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/bio.h index 89ed6c060ddc..8a1f9f039b8c 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/bio.h +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/bio.h @@ -2,7 +2,7 @@ * WARNING: do not edit! * Generated by Makefile from include/openssl/bio.h.in * - * Copyright 1995-2024 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License 2.0 (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy @@ -193,6 +193,7 @@ extern "C" { # define BIO_CTRL_GET_RPOLL_DESCRIPTOR 91 # define BIO_CTRL_GET_WPOLL_DESCRIPTOR 92 # define BIO_CTRL_DGRAM_DETECT_PEER_ADDR 93 +# define BIO_CTRL_DGRAM_SET0_LOCAL_ADDR 94 # define BIO_DGRAM_CAP_NONE 0U # define BIO_DGRAM_CAP_HANDLES_SRC_ADDR (1U << 0) @@ -693,6 +694,8 @@ int BIO_ctrl_reset_read_request(BIO *b); (unsigned int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_MTU, 0, NULL) # define BIO_dgram_set_mtu(b, mtu) \ (int)BIO_ctrl((b), BIO_CTRL_DGRAM_SET_MTU, (mtu), NULL) +# define BIO_dgram_set0_local_addr(b, addr) \ + (int)BIO_ctrl((b), BIO_CTRL_DGRAM_SET0_LOCAL_ADDR, 0, (addr)) /* ctrl macros for BIO_f_prefix */ # define BIO_set_prefix(b,p) BIO_ctrl((b), BIO_CTRL_SET_PREFIX, 0, (void *)(p)) @@ -965,9 +968,6 @@ ossl_bio__attr__((__format__(ossl_bio__printf__, 3, 0))); BIO_METHOD *BIO_meth_new(int type, const char *name); void BIO_meth_free(BIO_METHOD *biom); -int (*BIO_meth_get_write(const BIO_METHOD *biom)) (BIO *, const char *, int); -int (*BIO_meth_get_write_ex(const BIO_METHOD *biom)) (BIO *, const char *, size_t, - size_t *); int BIO_meth_set_write(BIO_METHOD *biom, int (*write) (BIO *, const char *, int)); int BIO_meth_set_write_ex(BIO_METHOD *biom, @@ -975,11 +975,6 @@ int BIO_meth_set_write_ex(BIO_METHOD *biom, int BIO_meth_set_sendmmsg(BIO_METHOD *biom, int (*f) (BIO *, BIO_MSG *, size_t, size_t, uint64_t, size_t *)); -int (*BIO_meth_get_sendmmsg(const BIO_METHOD *biom))(BIO *, BIO_MSG *, - size_t, size_t, - uint64_t, size_t *); -int (*BIO_meth_get_read(const BIO_METHOD *biom)) (BIO *, char *, int); -int (*BIO_meth_get_read_ex(const BIO_METHOD *biom)) (BIO *, char *, size_t, size_t *); int BIO_meth_set_read(BIO_METHOD *biom, int (*read) (BIO *, char *, int)); int BIO_meth_set_read_ex(BIO_METHOD *biom, @@ -987,28 +982,40 @@ int BIO_meth_set_read_ex(BIO_METHOD *biom, int BIO_meth_set_recvmmsg(BIO_METHOD *biom, int (*f) (BIO *, BIO_MSG *, size_t, size_t, uint64_t, size_t *)); -int (*BIO_meth_get_recvmmsg(const BIO_METHOD *biom))(BIO *, BIO_MSG *, - size_t, size_t, - uint64_t, size_t *); -int (*BIO_meth_get_puts(const BIO_METHOD *biom)) (BIO *, const char *); int BIO_meth_set_puts(BIO_METHOD *biom, int (*puts) (BIO *, const char *)); -int (*BIO_meth_get_gets(const BIO_METHOD *biom)) (BIO *, char *, int); int BIO_meth_set_gets(BIO_METHOD *biom, int (*ossl_gets) (BIO *, char *, int)); -long (*BIO_meth_get_ctrl(const BIO_METHOD *biom)) (BIO *, int, long, void *); int BIO_meth_set_ctrl(BIO_METHOD *biom, long (*ctrl) (BIO *, int, long, void *)); -int (*BIO_meth_get_create(const BIO_METHOD *bion)) (BIO *); int BIO_meth_set_create(BIO_METHOD *biom, int (*create) (BIO *)); -int (*BIO_meth_get_destroy(const BIO_METHOD *biom)) (BIO *); int BIO_meth_set_destroy(BIO_METHOD *biom, int (*destroy) (BIO *)); -long (*BIO_meth_get_callback_ctrl(const BIO_METHOD *biom)) - (BIO *, int, BIO_info_cb *); int BIO_meth_set_callback_ctrl(BIO_METHOD *biom, long (*callback_ctrl) (BIO *, int, BIO_info_cb *)); - +# ifndef OPENSSL_NO_DEPRECATED_3_5 +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_write(const BIO_METHOD *biom)) (BIO *, const char *, + int); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_write_ex(const BIO_METHOD *biom)) (BIO *, const char *, + size_t, size_t *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_sendmmsg(const BIO_METHOD *biom))(BIO *, BIO_MSG *, + size_t, size_t, + uint64_t, size_t *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_read(const BIO_METHOD *biom)) (BIO *, char *, int); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_read_ex(const BIO_METHOD *biom)) (BIO *, char *, + size_t, size_t *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_recvmmsg(const BIO_METHOD *biom))(BIO *, BIO_MSG *, + size_t, size_t, + uint64_t, size_t *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_puts(const BIO_METHOD *biom)) (BIO *, const char *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_gets(const BIO_METHOD *biom)) (BIO *, char *, int); +OSSL_DEPRECATEDIN_3_5 long (*BIO_meth_get_ctrl(const BIO_METHOD *biom)) (BIO *, int, + long, void *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_create(const BIO_METHOD *bion)) (BIO *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_destroy(const BIO_METHOD *biom)) (BIO *); +OSSL_DEPRECATEDIN_3_5 long (*BIO_meth_get_callback_ctrl(const BIO_METHOD *biom)) (BIO *, int, + BIO_info_cb *); +# endif # ifdef __cplusplus } # endif diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/cms.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/cms.h index 0f21a5193020..6713419cfcd1 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/cms.h +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/cms.h @@ -2,7 +2,7 @@ * WARNING: do not edit! * Generated by Makefile from include/openssl/cms.h.in * - * Copyright 2008-2022 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 2008-2025 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License 2.0 (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy @@ -155,6 +155,8 @@ DECLARE_ASN1_FUNCTIONS(CMS_ContentInfo) DECLARE_ASN1_FUNCTIONS(CMS_ReceiptRequest) DECLARE_ASN1_PRINT_FUNCTION(CMS_ContentInfo) +DECLARE_ASN1_DUP_FUNCTION(CMS_EnvelopedData) + CMS_ContentInfo *CMS_ContentInfo_new_ex(OSSL_LIB_CTX *libctx, const char *propq); # define CMS_SIGNERINFO_ISSUER_SERIAL 0 @@ -194,6 +196,7 @@ CMS_ContentInfo *CMS_ContentInfo_new_ex(OSSL_LIB_CTX *libctx, const char *propq) # define CMS_ASCIICRLF 0x80000 # define CMS_CADES 0x100000 # define CMS_USE_ORIGINATOR_KEYID 0x200000 +# define CMS_NO_SIGNING_TIME 0x400000 const ASN1_OBJECT *CMS_get0_type(const CMS_ContentInfo *cms); diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/configuration-ec.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/configuration-ec.h index a292da4b5b93..f40117295c13 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/configuration-ec.h +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/configuration-ec.h @@ -166,6 +166,9 @@ extern "C" { # ifndef OPENSSL_NO_FILENAMES # define OPENSSL_NO_FILENAMES # endif +# ifndef OPENSSL_NO_FIPS_JITTER +# define OPENSSL_NO_FIPS_JITTER +# endif # ifndef OPENSSL_NO_FIPS_POST # define OPENSSL_NO_FIPS_POST # endif @@ -184,6 +187,9 @@ extern "C" { # ifndef OPENSSL_NO_H3DEMO # define OPENSSL_NO_H3DEMO # endif +# ifndef OPENSSL_NO_HQINTEROP +# define OPENSSL_NO_HQINTEROP +# endif # ifndef OPENSSL_NO_IDEA # define OPENSSL_NO_IDEA # endif @@ -205,6 +211,12 @@ extern "C" { # ifndef OPENSSL_NO_MDC2 # define OPENSSL_NO_MDC2 # endif +# ifndef OPENSSL_NO_ML_DSA +# define OPENSSL_NO_ML_DSA +# endif +# ifndef OPENSSL_NO_ML_KEM +# define OPENSSL_NO_ML_KEM +# endif # ifndef OPENSSL_NO_MSAN # define OPENSSL_NO_MSAN # endif @@ -271,6 +283,9 @@ extern "C" { # ifndef OPENSSL_NO_SIV # define OPENSSL_NO_SIV # endif +# ifndef OPENSSL_NO_SLH_DSA +# define OPENSSL_NO_SLH_DSA +# endif # ifndef OPENSSL_NO_SM2 # define OPENSSL_NO_SM2 # endif @@ -295,6 +310,9 @@ extern "C" { # ifndef OPENSSL_NO_SSL3_METHOD # define OPENSSL_NO_SSL3_METHOD # endif +# ifndef OPENSSL_NO_SSLKEYLOG +# define OPENSSL_NO_SSLKEYLOG +# endif # ifndef OPENSSL_NO_STDIO # define OPENSSL_NO_STDIO # endif @@ -307,6 +325,9 @@ extern "C" { # ifndef OPENSSL_NO_THREAD_POOL # define OPENSSL_NO_THREAD_POOL # endif +# ifndef OPENSSL_NO_TLS_DEPRECATED_EC +# define OPENSSL_NO_TLS_DEPRECATED_EC +# endif # ifndef OPENSSL_NO_TLS1_3 # define OPENSSL_NO_TLS1_3 # endif diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/configuration-noec.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/configuration-noec.h index 14bb6dca8b01..c098fb7fb133 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/configuration-noec.h +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/configuration-noec.h @@ -178,6 +178,9 @@ extern "C" { # ifndef OPENSSL_NO_FILENAMES # define OPENSSL_NO_FILENAMES # endif +# ifndef OPENSSL_NO_FIPS_JITTER +# define OPENSSL_NO_FIPS_JITTER +# endif # ifndef OPENSSL_NO_FIPS_POST # define OPENSSL_NO_FIPS_POST # endif @@ -196,6 +199,9 @@ extern "C" { # ifndef OPENSSL_NO_H3DEMO # define OPENSSL_NO_H3DEMO # endif +# ifndef OPENSSL_NO_HQINTEROP +# define OPENSSL_NO_HQINTEROP +# endif # ifndef OPENSSL_NO_IDEA # define OPENSSL_NO_IDEA # endif @@ -217,6 +223,12 @@ extern "C" { # ifndef OPENSSL_NO_MDC2 # define OPENSSL_NO_MDC2 # endif +# ifndef OPENSSL_NO_ML_DSA +# define OPENSSL_NO_ML_DSA +# endif +# ifndef OPENSSL_NO_ML_KEM +# define OPENSSL_NO_ML_KEM +# endif # ifndef OPENSSL_NO_MSAN # define OPENSSL_NO_MSAN # endif @@ -283,6 +295,9 @@ extern "C" { # ifndef OPENSSL_NO_SIV # define OPENSSL_NO_SIV # endif +# ifndef OPENSSL_NO_SLH_DSA +# define OPENSSL_NO_SLH_DSA +# endif # ifndef OPENSSL_NO_SM2 # define OPENSSL_NO_SM2 # endif @@ -307,6 +322,9 @@ extern "C" { # ifndef OPENSSL_NO_SSL3_METHOD # define OPENSSL_NO_SSL3_METHOD # endif +# ifndef OPENSSL_NO_SSLKEYLOG +# define OPENSSL_NO_SSLKEYLOG +# endif # ifndef OPENSSL_NO_STDIO # define OPENSSL_NO_STDIO # endif @@ -319,6 +337,9 @@ extern "C" { # ifndef OPENSSL_NO_THREAD_POOL # define OPENSSL_NO_THREAD_POOL # endif +# ifndef OPENSSL_NO_TLS_DEPRECATED_EC +# define OPENSSL_NO_TLS_DEPRECATED_EC +# endif # ifndef OPENSSL_NO_TLS1_3 # define OPENSSL_NO_TLS1_3 # endif diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/core_names.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/core_names.h index 072a6b8a8cc9..3ed524600b81 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/core_names.h +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/core_names.h @@ -2,7 +2,7 @@ * WARNING: do not edit! * Generated by Makefile from include/openssl/core_names.h.in * - * Copyright 2019-2023 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 2019-2025 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License 2.0 (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy @@ -104,10 +104,17 @@ extern "C" { # define OSSL_PKEY_EC_GROUP_CHECK_NAMED "named" # define OSSL_PKEY_EC_GROUP_CHECK_NAMED_NIST "named-nist" +/* PROV_SKEY well known key types */ +# define OSSL_SKEY_TYPE_GENERIC "GENERIC-SECRET" +# define OSSL_SKEY_TYPE_AES "AES" + /* OSSL_KEM_PARAM_OPERATION values */ #define OSSL_KEM_PARAM_OPERATION_RSASVE "RSASVE" #define OSSL_KEM_PARAM_OPERATION_DHKEM "DHKEM" +/* Provider configuration variables */ +#define OSSL_PKEY_RETAIN_SEED "pkey_retain_seed" + /* Parameter name definitions - generated by util/perl/OpenSSL/paramnames.pm */ # define OSSL_ALG_PARAM_ALGORITHM_ID "algorithm-id" # define OSSL_ALG_PARAM_ALGORITHM_ID_PARAMS "algorithm-id-params" @@ -148,7 +155,9 @@ extern "C" { # define OSSL_CAPABILITY_TLS_SIGALG_IANA_NAME "tls-sigalg-iana-name" # define OSSL_CAPABILITY_TLS_SIGALG_KEYTYPE "tls-sigalg-keytype" # define OSSL_CAPABILITY_TLS_SIGALG_KEYTYPE_OID "tls-sigalg-keytype-oid" +# define OSSL_CAPABILITY_TLS_SIGALG_MAX_DTLS "tls-max-dtls" # define OSSL_CAPABILITY_TLS_SIGALG_MAX_TLS "tls-max-tls" +# define OSSL_CAPABILITY_TLS_SIGALG_MIN_DTLS "tls-min-dtls" # define OSSL_CAPABILITY_TLS_SIGALG_MIN_TLS "tls-min-tls" # define OSSL_CAPABILITY_TLS_SIGALG_NAME "tls-sigalg-name" # define OSSL_CAPABILITY_TLS_SIGALG_OID "tls-sigalg-oid" @@ -183,6 +192,7 @@ extern "C" { # define OSSL_CIPHER_PARAM_MODE "mode" # define OSSL_CIPHER_PARAM_NUM "num" # define OSSL_CIPHER_PARAM_PADDING "padding" +# define OSSL_CIPHER_PARAM_PIPELINE_AEAD_TAG "pipeline-tag" # define OSSL_CIPHER_PARAM_RANDOM_KEY "randkey" # define OSSL_CIPHER_PARAM_RC2_KEYBITS "keybits" # define OSSL_CIPHER_PARAM_ROUNDS "rounds" @@ -338,6 +348,7 @@ extern "C" { # define OSSL_OBJECT_PARAM_DATA_STRUCTURE "data-structure" # define OSSL_OBJECT_PARAM_DATA_TYPE "data-type" # define OSSL_OBJECT_PARAM_DESC "desc" +# define OSSL_OBJECT_PARAM_INPUT_TYPE "input-type" # define OSSL_OBJECT_PARAM_REFERENCE "reference" # define OSSL_OBJECT_PARAM_TYPE "type" # define OSSL_PASSPHRASE_PARAM_INFO "info" @@ -402,6 +413,17 @@ extern "C" { # define OSSL_PKEY_PARAM_MAX_SIZE "max-size" # define OSSL_PKEY_PARAM_MGF1_DIGEST "mgf1-digest" # define OSSL_PKEY_PARAM_MGF1_PROPERTIES "mgf1-properties" +# define OSSL_PKEY_PARAM_ML_DSA_INPUT_FORMATS "ml-dsa.input_formats" +# define OSSL_PKEY_PARAM_ML_DSA_OUTPUT_FORMATS "ml-dsa.output_formats" +# define OSSL_PKEY_PARAM_ML_DSA_PREFER_SEED "ml-dsa.prefer_seed" +# define OSSL_PKEY_PARAM_ML_DSA_RETAIN_SEED "ml-dsa.retain_seed" +# define OSSL_PKEY_PARAM_ML_DSA_SEED "seed" +# define OSSL_PKEY_PARAM_ML_KEM_IMPORT_PCT_TYPE "ml-kem.import_pct_type" +# define OSSL_PKEY_PARAM_ML_KEM_INPUT_FORMATS "ml-kem.input_formats" +# define OSSL_PKEY_PARAM_ML_KEM_OUTPUT_FORMATS "ml-kem.output_formats" +# define OSSL_PKEY_PARAM_ML_KEM_PREFER_SEED "ml-kem.prefer_seed" +# define OSSL_PKEY_PARAM_ML_KEM_RETAIN_SEED "ml-kem.retain_seed" +# define OSSL_PKEY_PARAM_ML_KEM_SEED "seed" # define OSSL_PKEY_PARAM_PAD_MODE "pad-mode" # define OSSL_PKEY_PARAM_PRIV_KEY "priv" # define OSSL_PKEY_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES @@ -460,6 +482,7 @@ extern "C" { # define OSSL_PKEY_PARAM_RSA_TEST_XQ1 "xq1" # define OSSL_PKEY_PARAM_RSA_TEST_XQ2 "xq2" # define OSSL_PKEY_PARAM_SECURITY_BITS "security-bits" +# define OSSL_PKEY_PARAM_SLH_DSA_SEED "seed" # define OSSL_PKEY_PARAM_USE_COFACTOR_ECDH OSSL_PKEY_PARAM_USE_COFACTOR_FLAG # define OSSL_PKEY_PARAM_USE_COFACTOR_FLAG "use-cofactor-flag" # define OSSL_PROV_PARAM_BUILDINFO "buildinfo" @@ -507,9 +530,11 @@ extern "C" { # define OSSL_RAND_PARAM_STRENGTH "strength" # define OSSL_RAND_PARAM_TEST_ENTROPY "test_entropy" # define OSSL_RAND_PARAM_TEST_NONCE "test_nonce" +# define OSSL_SIGNATURE_PARAM_ADD_RANDOM "additional-random" # define OSSL_SIGNATURE_PARAM_ALGORITHM_ID OSSL_PKEY_PARAM_ALGORITHM_ID # define OSSL_SIGNATURE_PARAM_ALGORITHM_ID_PARAMS OSSL_PKEY_PARAM_ALGORITHM_ID_PARAMS # define OSSL_SIGNATURE_PARAM_CONTEXT_STRING "context-string" +# define OSSL_SIGNATURE_PARAM_DETERMINISTIC "deterministic" # define OSSL_SIGNATURE_PARAM_DIGEST OSSL_PKEY_PARAM_DIGEST # define OSSL_SIGNATURE_PARAM_DIGEST_SIZE OSSL_PKEY_PARAM_DIGEST_SIZE # define OSSL_SIGNATURE_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR @@ -521,13 +546,18 @@ extern "C" { # define OSSL_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE "verify-message" # define OSSL_SIGNATURE_PARAM_INSTANCE "instance" # define OSSL_SIGNATURE_PARAM_KAT "kat" +# define OSSL_SIGNATURE_PARAM_MESSAGE_ENCODING "message-encoding" # define OSSL_SIGNATURE_PARAM_MGF1_DIGEST OSSL_PKEY_PARAM_MGF1_DIGEST # define OSSL_SIGNATURE_PARAM_MGF1_PROPERTIES OSSL_PKEY_PARAM_MGF1_PROPERTIES +# define OSSL_SIGNATURE_PARAM_MU "mu" # define OSSL_SIGNATURE_PARAM_NONCE_TYPE "nonce-type" # define OSSL_SIGNATURE_PARAM_PAD_MODE OSSL_PKEY_PARAM_PAD_MODE # define OSSL_SIGNATURE_PARAM_PROPERTIES OSSL_PKEY_PARAM_PROPERTIES # define OSSL_SIGNATURE_PARAM_PSS_SALTLEN "saltlen" # define OSSL_SIGNATURE_PARAM_SIGNATURE "signature" +# define OSSL_SIGNATURE_PARAM_TEST_ENTROPY "test-entropy" +# define OSSL_SKEY_PARAM_KEY_LENGTH "key-length" +# define OSSL_SKEY_PARAM_RAW_BYTES "raw-bytes" # define OSSL_STORE_PARAM_ALIAS "alias" # define OSSL_STORE_PARAM_DIGEST "digest" # define OSSL_STORE_PARAM_EXPECT "expect" diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/crmf.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/crmf.h index 9900edfddec6..551394d31452 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/crmf.h +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/crmf.h @@ -2,7 +2,7 @@ * WARNING: do not edit! * Generated by Makefile from include/openssl/crmf.h.in * - * Copyright 2007-2024 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 2007-2025 The OpenSSL Project Authors. All Rights Reserved. * Copyright Nokia 2007-2019 * Copyright Siemens AG 2015-2019 * @@ -26,6 +26,7 @@ # include # include # include /* for GENERAL_NAME etc. */ +# include /* explicit #includes not strictly needed since implied by the above: */ # include @@ -44,8 +45,11 @@ extern "C" { # define OSSL_CRMF_SUBSEQUENTMESSAGE_ENCRCERT 0 # define OSSL_CRMF_SUBSEQUENTMESSAGE_CHALLENGERESP 1 typedef struct ossl_crmf_encryptedvalue_st OSSL_CRMF_ENCRYPTEDVALUE; - DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_ENCRYPTEDVALUE) + +typedef struct ossl_crmf_encryptedkey_st OSSL_CRMF_ENCRYPTEDKEY; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_ENCRYPTEDKEY) + typedef struct ossl_crmf_msg_st OSSL_CRMF_MSG; DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_MSG) DECLARE_ASN1_DUP_FUNCTION(OSSL_CRMF_MSG) @@ -248,10 +252,24 @@ int OSSL_CRMF_CERTTEMPLATE_fill(OSSL_CRMF_CERTTEMPLATE *tmpl, const X509_NAME *subject, const X509_NAME *issuer, const ASN1_INTEGER *serial); -X509 -*OSSL_CRMF_ENCRYPTEDVALUE_get1_encCert(const OSSL_CRMF_ENCRYPTEDVALUE *ecert, - OSSL_LIB_CTX *libctx, const char *propq, - EVP_PKEY *pkey); +X509 *OSSL_CRMF_ENCRYPTEDVALUE_get1_encCert(const OSSL_CRMF_ENCRYPTEDVALUE *ecert, + OSSL_LIB_CTX *libctx, const char *propq, + EVP_PKEY *pkey); +X509 *OSSL_CRMF_ENCRYPTEDKEY_get1_encCert(const OSSL_CRMF_ENCRYPTEDKEY *ecert, + OSSL_LIB_CTX *libctx, const char *propq, + EVP_PKEY *pkey, unsigned int flags); +unsigned char +*OSSL_CRMF_ENCRYPTEDVALUE_decrypt(const OSSL_CRMF_ENCRYPTEDVALUE *enc, + OSSL_LIB_CTX *libctx, const char *propq, + EVP_PKEY *pkey, int *outlen); +EVP_PKEY *OSSL_CRMF_ENCRYPTEDKEY_get1_pkey(const OSSL_CRMF_ENCRYPTEDKEY *encryptedKey, + X509_STORE *ts, STACK_OF(X509) *extra, EVP_PKEY *pkey, + X509 *cert, ASN1_OCTET_STRING *secret, + OSSL_LIB_CTX *libctx, const char *propq); +int OSSL_CRMF_MSG_centralkeygen_requested(const OSSL_CRMF_MSG *crm, const X509_REQ *p10cr); +# ifndef OPENSSL_NO_CMS +OSSL_CRMF_ENCRYPTEDKEY *OSSL_CRMF_ENCRYPTEDKEY_init_envdata(CMS_EnvelopedData *envdata); +# endif # ifdef __cplusplus } diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/crypto.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/crypto.h index ae7e30a26ee1..bba69ec2e18f 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/crypto.h +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/crypto.h @@ -391,6 +391,9 @@ void OPENSSL_cleanse(void *ptr, size_t len); # define CRYPTO_MEM_CHECK_ENABLE 0x2 /* Control and mode bit */ # define CRYPTO_MEM_CHECK_DISABLE 0x3 /* Control only */ +/* max allowed length for value of OPENSSL_MALLOC_FAILURES env var. */ +# define CRYPTO_MEM_CHECK_MAX_FS 256 + void CRYPTO_get_alloc_counts(int *mcount, int *rcount, int *fcount); # ifndef OPENSSL_NO_DEPRECATED_3_0 # define OPENSSL_mem_debug_push(info) \ diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/opensslv.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/opensslv.h index cf4bdbcea42b..a19c6250ca5c 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/opensslv.h +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/opensslv.h @@ -28,7 +28,7 @@ extern "C" { * These macros express version number MAJOR.MINOR.PATCH exactly */ # define OPENSSL_VERSION_MAJOR 3 -# define OPENSSL_VERSION_MINOR 4 +# define OPENSSL_VERSION_MINOR 5 # define OPENSSL_VERSION_PATCH 1 /* @@ -74,21 +74,21 @@ extern "C" { * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and * OPENSSL_VERSION_BUILD_METADATA_STR appended. */ -# define OPENSSL_VERSION_STR "3.4.1" -# define OPENSSL_FULL_VERSION_STR "3.4.1" +# define OPENSSL_VERSION_STR "3.5.1" +# define OPENSSL_FULL_VERSION_STR "3.5.1" /* * SECTION 3: ADDITIONAL METADATA * * These strings are defined separately to allow them to be parsable. */ -# define OPENSSL_RELEASE_DATE "11 Feb 2025" +# define OPENSSL_RELEASE_DATE "1 Jul 2025" /* * SECTION 4: BACKWARD COMPATIBILITY */ -# define OPENSSL_VERSION_TEXT "OpenSSL 3.4.1 11 Feb 2025" +# define OPENSSL_VERSION_TEXT "OpenSSL 3.5.1 1 Jul 2025" /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */ # ifdef OPENSSL_VERSION_PRE_RELEASE diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/ssl.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/ssl.h index 9741f3a18a58..273b8c3f4ba2 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/ssl.h +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/ssl.h @@ -2,7 +2,7 @@ * WARNING: do not edit! * Generated by Makefile from include/openssl/ssl.h.in * - * Copyright 1995-2024 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved. * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved * Copyright 2005 Nokia. All rights reserved. * @@ -409,7 +409,7 @@ typedef int (*SSL_async_callback_fn)(SSL *s, void *arg); */ # define SSL_OP_CIPHER_SERVER_PREFERENCE SSL_OP_BIT(22) /* - * If set, a server will allow a client to issue a SSLv3.0 version + * If set, a server will allow a client to issue an SSLv3.0 version * number as latest version supported in the premaster secret, even when * TLSv1.0 (version 3.1) was announced in the client hello. Normally * this is forbidden to prevent version rollback attacks. @@ -1383,6 +1383,9 @@ DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION) # define SSL_CTRL_SET_RETRY_VERIFY 136 # define SSL_CTRL_GET_VERIFY_CERT_STORE 137 # define SSL_CTRL_GET_CHAIN_CERT_STORE 138 +# define SSL_CTRL_GET0_IMPLEMENTED_GROUPS 139 +# define SSL_CTRL_GET_SIGNATURE_NAME 140 +# define SSL_CTRL_GET_PEER_SIGNATURE_NAME 141 # define SSL_CERT_SET_FIRST 1 # define SSL_CERT_SET_NEXT 2 # define SSL_CERT_SET_SERVER 3 @@ -1491,6 +1494,9 @@ DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION) SSL_CTX_ctrl(ctx,SSL_CTRL_SET_GROUPS,glistlen,(int *)(glist)) # define SSL_CTX_set1_groups_list(ctx, s) \ SSL_CTX_ctrl(ctx,SSL_CTRL_SET_GROUPS_LIST,0,(char *)(s)) +# define SSL_CTX_get0_implemented_groups(ctx, all, out) \ + SSL_CTX_ctrl(ctx,SSL_CTRL_GET0_IMPLEMENTED_GROUPS, all, \ + (STACK_OF(OPENSSL_CSTRING) *)(out)) # define SSL_set1_groups(s, glist, glistlen) \ SSL_ctrl(s,SSL_CTRL_SET_GROUPS,glistlen,(char *)(glist)) # define SSL_set1_groups_list(s, str) \ @@ -1522,8 +1528,12 @@ DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION) (char *)(clist)) # define SSL_set1_client_certificate_types(s, clist, clistlen) \ SSL_ctrl(s,SSL_CTRL_SET_CLIENT_CERT_TYPES,clistlen,(char *)(clist)) +# define SSL_get0_signature_name(s, str) \ + SSL_ctrl(s,SSL_CTRL_GET_SIGNATURE_NAME,0,(1?(str):(const char **)NULL)) # define SSL_get_signature_nid(s, pn) \ SSL_ctrl(s,SSL_CTRL_GET_SIGNATURE_NID,0,pn) +# define SSL_get0_peer_signature_name(s, str) \ + SSL_ctrl(s,SSL_CTRL_GET_PEER_SIGNATURE_NAME,0,(1?(str):(const char **)NULL)) # define SSL_get_peer_signature_nid(s, pn) \ SSL_ctrl(s,SSL_CTRL_GET_PEER_SIGNATURE_NID,0,pn) # define SSL_get_peer_tmp_key(s, pk) \ @@ -1868,8 +1878,8 @@ __owur int SSL_set_purpose(SSL *ssl, int purpose); __owur int SSL_CTX_set_trust(SSL_CTX *ctx, int trust); __owur int SSL_set_trust(SSL *ssl, int trust); -__owur int SSL_set1_host(SSL *s, const char *hostname); -__owur int SSL_add1_host(SSL *s, const char *hostname); +__owur int SSL_set1_host(SSL *s, const char *host); +__owur int SSL_add1_host(SSL *s, const char *host); __owur const char *SSL_get0_peername(SSL *s); void SSL_set_hostflags(SSL *s, unsigned int flags); @@ -1944,6 +1954,11 @@ OSSL_DEPRECATEDIN_3_0 __owur char *SSL_get_srp_userinfo(SSL *s); typedef int (*SSL_client_hello_cb_fn) (SSL *s, int *al, void *arg); void SSL_CTX_set_client_hello_cb(SSL_CTX *c, SSL_client_hello_cb_fn cb, void *arg); +typedef int (*SSL_new_pending_conn_cb_fn) (SSL_CTX *ctx, SSL *new_ssl, + void *arg); +void SSL_CTX_set_new_pending_conn_cb(SSL_CTX *c, SSL_new_pending_conn_cb_fn cb, + void *arg); + int SSL_client_hello_isv2(SSL *s); unsigned int SSL_client_hello_get0_legacy_version(SSL *s); size_t SSL_client_hello_get0_random(SSL *s, const unsigned char **out); @@ -2339,6 +2354,31 @@ __owur int SSL_set1_initial_peer_addr(SSL *s, const BIO_ADDR *peer_addr); __owur SSL *SSL_get0_connection(SSL *s); __owur int SSL_is_connection(SSL *s); +__owur int SSL_is_listener(SSL *ssl); +__owur SSL *SSL_get0_listener(SSL *s); +#define SSL_LISTENER_FLAG_NO_VALIDATE (1UL << 1) +__owur SSL *SSL_new_listener(SSL_CTX *ctx, uint64_t flags); +__owur SSL *SSL_new_listener_from(SSL *ssl, uint64_t flags); +__owur SSL *SSL_new_from_listener(SSL *ssl, uint64_t flags); +#define SSL_ACCEPT_CONNECTION_NO_BLOCK (1UL << 0) +__owur SSL *SSL_accept_connection(SSL *ssl, uint64_t flags); +__owur size_t SSL_get_accept_connection_queue_len(SSL *ssl); +__owur int SSL_listen(SSL *ssl); + +__owur int SSL_is_domain(SSL *s); +__owur SSL *SSL_get0_domain(SSL *s); +__owur SSL *SSL_new_domain(SSL_CTX *ctx, uint64_t flags); + +#define SSL_DOMAIN_FLAG_SINGLE_THREAD (1U << 0) +#define SSL_DOMAIN_FLAG_MULTI_THREAD (1U << 1) +#define SSL_DOMAIN_FLAG_THREAD_ASSISTED (1U << 2) +#define SSL_DOMAIN_FLAG_BLOCKING (1U << 3) +#define SSL_DOMAIN_FLAG_LEGACY_BLOCKING (1U << 4) + +__owur int SSL_CTX_set_domain_flags(SSL_CTX *ctx, uint64_t domain_flags); +__owur int SSL_CTX_get_domain_flags(const SSL_CTX *ctx, uint64_t *domain_flags); +__owur int SSL_get_domain_flags(const SSL *ssl, uint64_t *domain_flags); + #define SSL_STREAM_TYPE_NONE 0 #define SSL_STREAM_TYPE_READ (1U << 0) #define SSL_STREAM_TYPE_WRITE (1U << 1) @@ -2872,6 +2912,21 @@ __owur int SSL_get0_server_cert_type(const SSL *s, unsigned char **t, size_t *le __owur int SSL_CTX_get0_client_cert_type(const SSL_CTX *ctx, unsigned char **t, size_t *len); __owur int SSL_CTX_get0_server_cert_type(const SSL_CTX *s, unsigned char **t, size_t *len); +/* + * Protection level. For <= TLSv1.2 only "NONE" and "APPLICATION" are used. + */ +# define OSSL_RECORD_PROTECTION_LEVEL_NONE 0 +# define OSSL_RECORD_PROTECTION_LEVEL_EARLY 1 +# define OSSL_RECORD_PROTECTION_LEVEL_HANDSHAKE 2 +# define OSSL_RECORD_PROTECTION_LEVEL_APPLICATION 3 + +int SSL_set_quic_tls_cbs(SSL *s, const OSSL_DISPATCH *qtdis, void *arg); +int SSL_set_quic_tls_transport_params(SSL *s, + const unsigned char *params, + size_t params_len); + +int SSL_set_quic_tls_early_data_enabled(SSL *s, int enabled); + # ifdef __cplusplus } # endif diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509_acert.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509_acert.h index 86babde0d87e..4eaac6f955b2 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509_acert.h +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509_acert.h @@ -260,4 +260,35 @@ DECLARE_ASN1_FUNCTIONS(OSSL_TARGET) DECLARE_ASN1_FUNCTIONS(OSSL_TARGETS) DECLARE_ASN1_FUNCTIONS(OSSL_TARGETING_INFORMATION) +typedef STACK_OF(OSSL_ISSUER_SERIAL) OSSL_AUTHORITY_ATTRIBUTE_ID_SYNTAX; +DECLARE_ASN1_FUNCTIONS(OSSL_AUTHORITY_ATTRIBUTE_ID_SYNTAX) + +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ISSUER_SERIAL, OSSL_ISSUER_SERIAL, OSSL_ISSUER_SERIAL) +#define sk_OSSL_ISSUER_SERIAL_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk)) +#define sk_OSSL_ISSUER_SERIAL_value(sk, idx) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_value(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk), (idx))) +#define sk_OSSL_ISSUER_SERIAL_new(cmp) ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_new(ossl_check_OSSL_ISSUER_SERIAL_compfunc_type(cmp))) +#define sk_OSSL_ISSUER_SERIAL_new_null() ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_new_null()) +#define sk_OSSL_ISSUER_SERIAL_new_reserve(cmp, n) ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ISSUER_SERIAL_compfunc_type(cmp), (n))) +#define sk_OSSL_ISSUER_SERIAL_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), (n)) +#define sk_OSSL_ISSUER_SERIAL_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk)) +#define sk_OSSL_ISSUER_SERIAL_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk)) +#define sk_OSSL_ISSUER_SERIAL_delete(sk, i) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_delete(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), (i))) +#define sk_OSSL_ISSUER_SERIAL_delete_ptr(sk, ptr) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr))) +#define sk_OSSL_ISSUER_SERIAL_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr)) +#define sk_OSSL_ISSUER_SERIAL_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr)) +#define sk_OSSL_ISSUER_SERIAL_pop(sk) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_pop(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk))) +#define sk_OSSL_ISSUER_SERIAL_shift(sk) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_shift(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk))) +#define sk_OSSL_ISSUER_SERIAL_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk),ossl_check_OSSL_ISSUER_SERIAL_freefunc_type(freefunc)) +#define sk_OSSL_ISSUER_SERIAL_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr), (idx)) +#define sk_OSSL_ISSUER_SERIAL_set(sk, idx, ptr) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_set(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), (idx), ossl_check_OSSL_ISSUER_SERIAL_type(ptr))) +#define sk_OSSL_ISSUER_SERIAL_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr)) +#define sk_OSSL_ISSUER_SERIAL_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr)) +#define sk_OSSL_ISSUER_SERIAL_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr), pnum) +#define sk_OSSL_ISSUER_SERIAL_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk)) +#define sk_OSSL_ISSUER_SERIAL_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk)) +#define sk_OSSL_ISSUER_SERIAL_dup(sk) ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk))) +#define sk_OSSL_ISSUER_SERIAL_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_copyfunc_type(copyfunc), ossl_check_OSSL_ISSUER_SERIAL_freefunc_type(freefunc))) +#define sk_OSSL_ISSUER_SERIAL_set_cmp_func(sk, cmp) ((sk_OSSL_ISSUER_SERIAL_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_compfunc_type(cmp))) + + #endif diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509_vfy.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509_vfy.h index 68b20ee5f2d6..de63bf018439 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509_vfy.h +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509_vfy.h @@ -2,7 +2,7 @@ * WARNING: do not edit! * Generated by Makefile from include/openssl/x509_vfy.h.in * - * Copyright 1995-2024 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License 2.0 (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy @@ -812,6 +812,7 @@ int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *param, unsigned long flags); unsigned long X509_VERIFY_PARAM_get_flags(const X509_VERIFY_PARAM *param); int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose); +int X509_VERIFY_PARAM_get_purpose(const X509_VERIFY_PARAM *param); int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, int trust); void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth); void X509_VERIFY_PARAM_set_auth_level(X509_VERIFY_PARAM *param, int auth_level); diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509v3.h b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509v3.h index 5fd66fbda363..718157ebfa20 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509v3.h +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/include/openssl/x509v3.h @@ -2,7 +2,7 @@ * WARNING: do not edit! * Generated by Makefile from include/openssl/x509v3.h.in * - * Copyright 1999-2024 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 1999-2025 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License 2.0 (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy @@ -741,7 +741,7 @@ SKM_DEFINE_STACK_OF_INTERNAL(X509_PURPOSE, X509_PURPOSE, X509_PURPOSE) #define sk_X509_PURPOSE_set_cmp_func(sk, cmp) ((sk_X509_PURPOSE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_compfunc_type(cmp))) - +# define X509_PURPOSE_DEFAULT_ANY 0 # define X509_PURPOSE_SSL_CLIENT 1 # define X509_PURPOSE_SSL_SERVER 2 # define X509_PURPOSE_NS_SSL_SERVER 3 @@ -990,7 +990,6 @@ int X509V3_extensions_print(BIO *out, const char *title, int X509_check_ca(X509 *x); int X509_check_purpose(X509 *x, int id, int ca); int X509_supported_extension(X509_EXTENSION *ex); -int X509_PURPOSE_set(int *p, int purpose); int X509_check_issued(X509 *issuer, X509 *subject); int X509_check_akid(const X509 *issuer, const AUTHORITY_KEYID *akid); void X509_set_proxy_flag(X509 *x); @@ -1006,22 +1005,26 @@ const GENERAL_NAMES *X509_get0_authority_issuer(X509 *x); const ASN1_INTEGER *X509_get0_authority_serial(X509 *x); int X509_PURPOSE_get_count(void); -X509_PURPOSE *X509_PURPOSE_get0(int idx); +int X509_PURPOSE_get_unused_id(OSSL_LIB_CTX *libctx); int X509_PURPOSE_get_by_sname(const char *sname); int X509_PURPOSE_get_by_id(int id); int X509_PURPOSE_add(int id, int trust, int flags, int (*ck) (const X509_PURPOSE *, const X509 *, int), const char *name, const char *sname, void *arg); +void X509_PURPOSE_cleanup(void); + +X509_PURPOSE *X509_PURPOSE_get0(int idx); +int X509_PURPOSE_get_id(const X509_PURPOSE *); char *X509_PURPOSE_get0_name(const X509_PURPOSE *xp); char *X509_PURPOSE_get0_sname(const X509_PURPOSE *xp); int X509_PURPOSE_get_trust(const X509_PURPOSE *xp); -void X509_PURPOSE_cleanup(void); -int X509_PURPOSE_get_id(const X509_PURPOSE *); +int X509_PURPOSE_set(int *p, int purpose); STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x); STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(X509_REQ *x); void X509_email_free(STACK_OF(OPENSSL_STRING) *sk); STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x); + /* Flags for X509_check_* functions */ /* @@ -1494,6 +1497,471 @@ SKM_DEFINE_STACK_OF_INTERNAL(USERNOTICE, USERNOTICE, USERNOTICE) #define sk_USERNOTICE_set_cmp_func(sk, cmp) ((sk_USERNOTICE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_compfunc_type(cmp))) +typedef struct OSSL_ROLE_SPEC_CERT_ID_st { + GENERAL_NAME *roleName; + GENERAL_NAME *roleCertIssuer; + ASN1_INTEGER *roleCertSerialNumber; + GENERAL_NAMES *roleCertLocator; +} OSSL_ROLE_SPEC_CERT_ID; + +DECLARE_ASN1_FUNCTIONS(OSSL_ROLE_SPEC_CERT_ID) + +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ROLE_SPEC_CERT_ID, OSSL_ROLE_SPEC_CERT_ID, OSSL_ROLE_SPEC_CERT_ID) +#define sk_OSSL_ROLE_SPEC_CERT_ID_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_value(sk, idx) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_value(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), (idx))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_new(cmp) ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_new(ossl_check_OSSL_ROLE_SPEC_CERT_ID_compfunc_type(cmp))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_new_null() ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_new_null()) +#define sk_OSSL_ROLE_SPEC_CERT_ID_new_reserve(cmp, n) ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ROLE_SPEC_CERT_ID_compfunc_type(cmp), (n))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), (n)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_delete(sk, i) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_delete(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), (i))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_delete_ptr(sk, ptr) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_pop(sk) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_pop(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_shift(sk) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_shift(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk),ossl_check_OSSL_ROLE_SPEC_CERT_ID_freefunc_type(freefunc)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr), (idx)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_set(sk, idx, ptr) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_set(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), (idx), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr), pnum) +#define sk_OSSL_ROLE_SPEC_CERT_ID_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_dup(sk) ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_copyfunc_type(copyfunc), ossl_check_OSSL_ROLE_SPEC_CERT_ID_freefunc_type(freefunc))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_set_cmp_func(sk, cmp) ((sk_OSSL_ROLE_SPEC_CERT_ID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_compfunc_type(cmp))) + + +typedef STACK_OF(OSSL_ROLE_SPEC_CERT_ID) OSSL_ROLE_SPEC_CERT_ID_SYNTAX; + +DECLARE_ASN1_FUNCTIONS(OSSL_ROLE_SPEC_CERT_ID_SYNTAX) +typedef struct OSSL_HASH_st { + X509_ALGOR *algorithmIdentifier; + ASN1_BIT_STRING *hashValue; +} OSSL_HASH; + +typedef struct OSSL_INFO_SYNTAX_POINTER_st { + GENERAL_NAMES *name; + OSSL_HASH *hash; +} OSSL_INFO_SYNTAX_POINTER; + +# define OSSL_INFO_SYNTAX_TYPE_CONTENT 0 +# define OSSL_INFO_SYNTAX_TYPE_POINTER 1 + +typedef struct OSSL_INFO_SYNTAX_st { + int type; + union { + ASN1_STRING *content; + OSSL_INFO_SYNTAX_POINTER *pointer; + } choice; +} OSSL_INFO_SYNTAX; + +typedef struct OSSL_PRIVILEGE_POLICY_ID_st { + ASN1_OBJECT *privilegePolicy; + OSSL_INFO_SYNTAX *privPolSyntax; +} OSSL_PRIVILEGE_POLICY_ID; + +typedef struct OSSL_ATTRIBUTE_DESCRIPTOR_st { + ASN1_OBJECT *identifier; + ASN1_STRING *attributeSyntax; + ASN1_UTF8STRING *name; + ASN1_UTF8STRING *description; + OSSL_PRIVILEGE_POLICY_ID *dominationRule; +} OSSL_ATTRIBUTE_DESCRIPTOR; + +DECLARE_ASN1_FUNCTIONS(OSSL_HASH) +DECLARE_ASN1_FUNCTIONS(OSSL_INFO_SYNTAX) +DECLARE_ASN1_FUNCTIONS(OSSL_INFO_SYNTAX_POINTER) +DECLARE_ASN1_FUNCTIONS(OSSL_PRIVILEGE_POLICY_ID) +DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_DESCRIPTOR) + +typedef struct OSSL_TIME_SPEC_ABSOLUTE_st { + ASN1_GENERALIZEDTIME *startTime; + ASN1_GENERALIZEDTIME *endTime; +} OSSL_TIME_SPEC_ABSOLUTE; + +typedef struct OSSL_DAY_TIME_st { + ASN1_INTEGER *hour; + ASN1_INTEGER *minute; + ASN1_INTEGER *second; +} OSSL_DAY_TIME; + +typedef struct OSSL_DAY_TIME_BAND_st { + OSSL_DAY_TIME *startDayTime; + OSSL_DAY_TIME *endDayTime; +} OSSL_DAY_TIME_BAND; + +# define OSSL_NAMED_DAY_TYPE_INT 0 +# define OSSL_NAMED_DAY_TYPE_BIT 1 +# define OSSL_NAMED_DAY_INT_SUN 1 +# define OSSL_NAMED_DAY_INT_MON 2 +# define OSSL_NAMED_DAY_INT_TUE 3 +# define OSSL_NAMED_DAY_INT_WED 4 +# define OSSL_NAMED_DAY_INT_THU 5 +# define OSSL_NAMED_DAY_INT_FRI 6 +# define OSSL_NAMED_DAY_INT_SAT 7 +# define OSSL_NAMED_DAY_BIT_SUN 0 +# define OSSL_NAMED_DAY_BIT_MON 1 +# define OSSL_NAMED_DAY_BIT_TUE 2 +# define OSSL_NAMED_DAY_BIT_WED 3 +# define OSSL_NAMED_DAY_BIT_THU 4 +# define OSSL_NAMED_DAY_BIT_FRI 5 +# define OSSL_NAMED_DAY_BIT_SAT 6 + +typedef struct OSSL_NAMED_DAY_st { + int type; + union { + ASN1_INTEGER *intNamedDays; + ASN1_BIT_STRING *bitNamedDays; + } choice; +} OSSL_NAMED_DAY; + +# define OSSL_TIME_SPEC_X_DAY_OF_FIRST 0 +# define OSSL_TIME_SPEC_X_DAY_OF_SECOND 1 +# define OSSL_TIME_SPEC_X_DAY_OF_THIRD 2 +# define OSSL_TIME_SPEC_X_DAY_OF_FOURTH 3 +# define OSSL_TIME_SPEC_X_DAY_OF_FIFTH 4 + +typedef struct OSSL_TIME_SPEC_X_DAY_OF_st { + int type; + union { + OSSL_NAMED_DAY *first; + OSSL_NAMED_DAY *second; + OSSL_NAMED_DAY *third; + OSSL_NAMED_DAY *fourth; + OSSL_NAMED_DAY *fifth; + } choice; +} OSSL_TIME_SPEC_X_DAY_OF; + +# define OSSL_TIME_SPEC_DAY_TYPE_INT 0 +# define OSSL_TIME_SPEC_DAY_TYPE_BIT 1 +# define OSSL_TIME_SPEC_DAY_TYPE_DAY_OF 2 +# define OSSL_TIME_SPEC_DAY_BIT_SUN 0 +# define OSSL_TIME_SPEC_DAY_BIT_MON 1 +# define OSSL_TIME_SPEC_DAY_BIT_TUE 2 +# define OSSL_TIME_SPEC_DAY_BIT_WED 3 +# define OSSL_TIME_SPEC_DAY_BIT_THU 4 +# define OSSL_TIME_SPEC_DAY_BIT_FRI 5 +# define OSSL_TIME_SPEC_DAY_BIT_SAT 6 +# define OSSL_TIME_SPEC_DAY_INT_SUN 1 +# define OSSL_TIME_SPEC_DAY_INT_MON 2 +# define OSSL_TIME_SPEC_DAY_INT_TUE 3 +# define OSSL_TIME_SPEC_DAY_INT_WED 4 +# define OSSL_TIME_SPEC_DAY_INT_THU 5 +# define OSSL_TIME_SPEC_DAY_INT_FRI 6 +# define OSSL_TIME_SPEC_DAY_INT_SAT 7 + +typedef struct OSSL_TIME_SPEC_DAY_st { + int type; + union { + STACK_OF(ASN1_INTEGER) *intDay; + ASN1_BIT_STRING *bitDay; + OSSL_TIME_SPEC_X_DAY_OF *dayOf; + } choice; +} OSSL_TIME_SPEC_DAY; + +# define OSSL_TIME_SPEC_WEEKS_TYPE_ALL 0 +# define OSSL_TIME_SPEC_WEEKS_TYPE_INT 1 +# define OSSL_TIME_SPEC_WEEKS_TYPE_BIT 2 +# define OSSL_TIME_SPEC_BIT_WEEKS_1 0 +# define OSSL_TIME_SPEC_BIT_WEEKS_2 1 +# define OSSL_TIME_SPEC_BIT_WEEKS_3 2 +# define OSSL_TIME_SPEC_BIT_WEEKS_4 3 +# define OSSL_TIME_SPEC_BIT_WEEKS_5 4 + +typedef struct OSSL_TIME_SPEC_WEEKS_st { + int type; + union { + ASN1_NULL *allWeeks; + STACK_OF(ASN1_INTEGER) *intWeek; + ASN1_BIT_STRING *bitWeek; + } choice; +} OSSL_TIME_SPEC_WEEKS; + +# define OSSL_TIME_SPEC_MONTH_TYPE_ALL 0 +# define OSSL_TIME_SPEC_MONTH_TYPE_INT 1 +# define OSSL_TIME_SPEC_MONTH_TYPE_BIT 2 +# define OSSL_TIME_SPEC_INT_MONTH_JAN 1 +# define OSSL_TIME_SPEC_INT_MONTH_FEB 2 +# define OSSL_TIME_SPEC_INT_MONTH_MAR 3 +# define OSSL_TIME_SPEC_INT_MONTH_APR 4 +# define OSSL_TIME_SPEC_INT_MONTH_MAY 5 +# define OSSL_TIME_SPEC_INT_MONTH_JUN 6 +# define OSSL_TIME_SPEC_INT_MONTH_JUL 7 +# define OSSL_TIME_SPEC_INT_MONTH_AUG 8 +# define OSSL_TIME_SPEC_INT_MONTH_SEP 9 +# define OSSL_TIME_SPEC_INT_MONTH_OCT 10 +# define OSSL_TIME_SPEC_INT_MONTH_NOV 11 +# define OSSL_TIME_SPEC_INT_MONTH_DEC 12 +# define OSSL_TIME_SPEC_BIT_MONTH_JAN 0 +# define OSSL_TIME_SPEC_BIT_MONTH_FEB 1 +# define OSSL_TIME_SPEC_BIT_MONTH_MAR 2 +# define OSSL_TIME_SPEC_BIT_MONTH_APR 3 +# define OSSL_TIME_SPEC_BIT_MONTH_MAY 4 +# define OSSL_TIME_SPEC_BIT_MONTH_JUN 5 +# define OSSL_TIME_SPEC_BIT_MONTH_JUL 6 +# define OSSL_TIME_SPEC_BIT_MONTH_AUG 7 +# define OSSL_TIME_SPEC_BIT_MONTH_SEP 8 +# define OSSL_TIME_SPEC_BIT_MONTH_OCT 9 +# define OSSL_TIME_SPEC_BIT_MONTH_NOV 10 +# define OSSL_TIME_SPEC_BIT_MONTH_DEC 11 + +typedef struct OSSL_TIME_SPEC_MONTH_st { + int type; + union { + ASN1_NULL *allMonths; + STACK_OF(ASN1_INTEGER) *intMonth; + ASN1_BIT_STRING *bitMonth; + } choice; +} OSSL_TIME_SPEC_MONTH; + +typedef struct OSSL_TIME_PERIOD_st { + STACK_OF(OSSL_DAY_TIME_BAND) *timesOfDay; + OSSL_TIME_SPEC_DAY *days; + OSSL_TIME_SPEC_WEEKS *weeks; + OSSL_TIME_SPEC_MONTH *months; + STACK_OF(ASN1_INTEGER) *years; +} OSSL_TIME_PERIOD; + +# define OSSL_TIME_SPEC_TIME_TYPE_ABSOLUTE 0 +# define OSSL_TIME_SPEC_TIME_TYPE_PERIODIC 1 + +typedef struct OSSL_TIME_SPEC_TIME_st { + int type; + union { + OSSL_TIME_SPEC_ABSOLUTE *absolute; + STACK_OF(OSSL_TIME_PERIOD) *periodic; + } choice; +} OSSL_TIME_SPEC_TIME; + +typedef struct OSSL_TIME_SPEC_st { + OSSL_TIME_SPEC_TIME *time; + ASN1_BOOLEAN notThisTime; + ASN1_INTEGER *timeZone; +} OSSL_TIME_SPEC; + +DECLARE_ASN1_FUNCTIONS(OSSL_DAY_TIME) +DECLARE_ASN1_FUNCTIONS(OSSL_DAY_TIME_BAND) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_DAY) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_WEEKS) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_MONTH) +DECLARE_ASN1_FUNCTIONS(OSSL_NAMED_DAY) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_X_DAY_OF) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_ABSOLUTE) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_TIME) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_PERIOD) + +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_TIME_PERIOD, OSSL_TIME_PERIOD, OSSL_TIME_PERIOD) +#define sk_OSSL_TIME_PERIOD_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk)) +#define sk_OSSL_TIME_PERIOD_value(sk, idx) ((OSSL_TIME_PERIOD *)OPENSSL_sk_value(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk), (idx))) +#define sk_OSSL_TIME_PERIOD_new(cmp) ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_new(ossl_check_OSSL_TIME_PERIOD_compfunc_type(cmp))) +#define sk_OSSL_TIME_PERIOD_new_null() ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_new_null()) +#define sk_OSSL_TIME_PERIOD_new_reserve(cmp, n) ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_TIME_PERIOD_compfunc_type(cmp), (n))) +#define sk_OSSL_TIME_PERIOD_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), (n)) +#define sk_OSSL_TIME_PERIOD_free(sk) OPENSSL_sk_free(ossl_check_OSSL_TIME_PERIOD_sk_type(sk)) +#define sk_OSSL_TIME_PERIOD_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_TIME_PERIOD_sk_type(sk)) +#define sk_OSSL_TIME_PERIOD_delete(sk, i) ((OSSL_TIME_PERIOD *)OPENSSL_sk_delete(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), (i))) +#define sk_OSSL_TIME_PERIOD_delete_ptr(sk, ptr) ((OSSL_TIME_PERIOD *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr))) +#define sk_OSSL_TIME_PERIOD_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr)) +#define sk_OSSL_TIME_PERIOD_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr)) +#define sk_OSSL_TIME_PERIOD_pop(sk) ((OSSL_TIME_PERIOD *)OPENSSL_sk_pop(ossl_check_OSSL_TIME_PERIOD_sk_type(sk))) +#define sk_OSSL_TIME_PERIOD_shift(sk) ((OSSL_TIME_PERIOD *)OPENSSL_sk_shift(ossl_check_OSSL_TIME_PERIOD_sk_type(sk))) +#define sk_OSSL_TIME_PERIOD_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_TIME_PERIOD_sk_type(sk),ossl_check_OSSL_TIME_PERIOD_freefunc_type(freefunc)) +#define sk_OSSL_TIME_PERIOD_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr), (idx)) +#define sk_OSSL_TIME_PERIOD_set(sk, idx, ptr) ((OSSL_TIME_PERIOD *)OPENSSL_sk_set(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), (idx), ossl_check_OSSL_TIME_PERIOD_type(ptr))) +#define sk_OSSL_TIME_PERIOD_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr)) +#define sk_OSSL_TIME_PERIOD_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr)) +#define sk_OSSL_TIME_PERIOD_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr), pnum) +#define sk_OSSL_TIME_PERIOD_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_TIME_PERIOD_sk_type(sk)) +#define sk_OSSL_TIME_PERIOD_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk)) +#define sk_OSSL_TIME_PERIOD_dup(sk) ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_dup(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk))) +#define sk_OSSL_TIME_PERIOD_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_copyfunc_type(copyfunc), ossl_check_OSSL_TIME_PERIOD_freefunc_type(freefunc))) +#define sk_OSSL_TIME_PERIOD_set_cmp_func(sk, cmp) ((sk_OSSL_TIME_PERIOD_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_compfunc_type(cmp))) + + +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_DAY_TIME_BAND, OSSL_DAY_TIME_BAND, OSSL_DAY_TIME_BAND) +#define sk_OSSL_DAY_TIME_BAND_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk)) +#define sk_OSSL_DAY_TIME_BAND_value(sk, idx) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_value(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk), (idx))) +#define sk_OSSL_DAY_TIME_BAND_new(cmp) ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_new(ossl_check_OSSL_DAY_TIME_BAND_compfunc_type(cmp))) +#define sk_OSSL_DAY_TIME_BAND_new_null() ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_new_null()) +#define sk_OSSL_DAY_TIME_BAND_new_reserve(cmp, n) ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_DAY_TIME_BAND_compfunc_type(cmp), (n))) +#define sk_OSSL_DAY_TIME_BAND_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), (n)) +#define sk_OSSL_DAY_TIME_BAND_free(sk) OPENSSL_sk_free(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk)) +#define sk_OSSL_DAY_TIME_BAND_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk)) +#define sk_OSSL_DAY_TIME_BAND_delete(sk, i) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_delete(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), (i))) +#define sk_OSSL_DAY_TIME_BAND_delete_ptr(sk, ptr) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr))) +#define sk_OSSL_DAY_TIME_BAND_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr)) +#define sk_OSSL_DAY_TIME_BAND_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr)) +#define sk_OSSL_DAY_TIME_BAND_pop(sk) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_pop(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk))) +#define sk_OSSL_DAY_TIME_BAND_shift(sk) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_shift(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk))) +#define sk_OSSL_DAY_TIME_BAND_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk),ossl_check_OSSL_DAY_TIME_BAND_freefunc_type(freefunc)) +#define sk_OSSL_DAY_TIME_BAND_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr), (idx)) +#define sk_OSSL_DAY_TIME_BAND_set(sk, idx, ptr) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_set(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), (idx), ossl_check_OSSL_DAY_TIME_BAND_type(ptr))) +#define sk_OSSL_DAY_TIME_BAND_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr)) +#define sk_OSSL_DAY_TIME_BAND_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr)) +#define sk_OSSL_DAY_TIME_BAND_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr), pnum) +#define sk_OSSL_DAY_TIME_BAND_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk)) +#define sk_OSSL_DAY_TIME_BAND_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk)) +#define sk_OSSL_DAY_TIME_BAND_dup(sk) ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_dup(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk))) +#define sk_OSSL_DAY_TIME_BAND_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_copyfunc_type(copyfunc), ossl_check_OSSL_DAY_TIME_BAND_freefunc_type(freefunc))) +#define sk_OSSL_DAY_TIME_BAND_set_cmp_func(sk, cmp) ((sk_OSSL_DAY_TIME_BAND_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_compfunc_type(cmp))) + + +/* Attribute Type and Value */ +typedef struct atav_st { + ASN1_OBJECT *type; + ASN1_TYPE *value; +} OSSL_ATAV; + +typedef struct ATTRIBUTE_TYPE_MAPPING_st { + ASN1_OBJECT *local; + ASN1_OBJECT *remote; +} OSSL_ATTRIBUTE_TYPE_MAPPING; + +typedef struct ATTRIBUTE_VALUE_MAPPING_st { + OSSL_ATAV *local; + OSSL_ATAV *remote; +} OSSL_ATTRIBUTE_VALUE_MAPPING; + +# define OSSL_ATTR_MAP_TYPE 0 +# define OSSL_ATTR_MAP_VALUE 1 + +typedef struct ATTRIBUTE_MAPPING_st { + int type; + union { + OSSL_ATTRIBUTE_TYPE_MAPPING *typeMappings; + OSSL_ATTRIBUTE_VALUE_MAPPING *typeValueMappings; + } choice; +} OSSL_ATTRIBUTE_MAPPING; + +typedef STACK_OF(OSSL_ATTRIBUTE_MAPPING) OSSL_ATTRIBUTE_MAPPINGS; +DECLARE_ASN1_FUNCTIONS(OSSL_ATAV) +DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_TYPE_MAPPING) +DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_VALUE_MAPPING) +DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_MAPPING) +DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_MAPPINGS) + +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ATTRIBUTE_MAPPING, OSSL_ATTRIBUTE_MAPPING, OSSL_ATTRIBUTE_MAPPING) +#define sk_OSSL_ATTRIBUTE_MAPPING_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk)) +#define sk_OSSL_ATTRIBUTE_MAPPING_value(sk, idx) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_value(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), (idx))) +#define sk_OSSL_ATTRIBUTE_MAPPING_new(cmp) ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_new(ossl_check_OSSL_ATTRIBUTE_MAPPING_compfunc_type(cmp))) +#define sk_OSSL_ATTRIBUTE_MAPPING_new_null() ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_new_null()) +#define sk_OSSL_ATTRIBUTE_MAPPING_new_reserve(cmp, n) ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ATTRIBUTE_MAPPING_compfunc_type(cmp), (n))) +#define sk_OSSL_ATTRIBUTE_MAPPING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), (n)) +#define sk_OSSL_ATTRIBUTE_MAPPING_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk)) +#define sk_OSSL_ATTRIBUTE_MAPPING_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk)) +#define sk_OSSL_ATTRIBUTE_MAPPING_delete(sk, i) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_delete(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), (i))) +#define sk_OSSL_ATTRIBUTE_MAPPING_delete_ptr(sk, ptr) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr))) +#define sk_OSSL_ATTRIBUTE_MAPPING_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr)) +#define sk_OSSL_ATTRIBUTE_MAPPING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr)) +#define sk_OSSL_ATTRIBUTE_MAPPING_pop(sk) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_pop(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk))) +#define sk_OSSL_ATTRIBUTE_MAPPING_shift(sk) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_shift(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk))) +#define sk_OSSL_ATTRIBUTE_MAPPING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk),ossl_check_OSSL_ATTRIBUTE_MAPPING_freefunc_type(freefunc)) +#define sk_OSSL_ATTRIBUTE_MAPPING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr), (idx)) +#define sk_OSSL_ATTRIBUTE_MAPPING_set(sk, idx, ptr) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_set(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), (idx), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr))) +#define sk_OSSL_ATTRIBUTE_MAPPING_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr)) +#define sk_OSSL_ATTRIBUTE_MAPPING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr)) +#define sk_OSSL_ATTRIBUTE_MAPPING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr), pnum) +#define sk_OSSL_ATTRIBUTE_MAPPING_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk)) +#define sk_OSSL_ATTRIBUTE_MAPPING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk)) +#define sk_OSSL_ATTRIBUTE_MAPPING_dup(sk) ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk))) +#define sk_OSSL_ATTRIBUTE_MAPPING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_copyfunc_type(copyfunc), ossl_check_OSSL_ATTRIBUTE_MAPPING_freefunc_type(freefunc))) +#define sk_OSSL_ATTRIBUTE_MAPPING_set_cmp_func(sk, cmp) ((sk_OSSL_ATTRIBUTE_MAPPING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_compfunc_type(cmp))) + + +# define OSSL_AAA_ATTRIBUTE_TYPE 0 +# define OSSL_AAA_ATTRIBUTE_VALUES 1 + +typedef struct ALLOWED_ATTRIBUTES_CHOICE_st { + int type; + union { + ASN1_OBJECT *attributeType; + X509_ATTRIBUTE *attributeTypeandValues; + } choice; +} OSSL_ALLOWED_ATTRIBUTES_CHOICE; + +typedef struct ALLOWED_ATTRIBUTES_ITEM_st { + STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *attributes; + GENERAL_NAME *holderDomain; +} OSSL_ALLOWED_ATTRIBUTES_ITEM; + +typedef STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) OSSL_ALLOWED_ATTRIBUTES_SYNTAX; + +DECLARE_ASN1_FUNCTIONS(OSSL_ALLOWED_ATTRIBUTES_CHOICE) +DECLARE_ASN1_FUNCTIONS(OSSL_ALLOWED_ATTRIBUTES_ITEM) +DECLARE_ASN1_FUNCTIONS(OSSL_ALLOWED_ATTRIBUTES_SYNTAX) + +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ALLOWED_ATTRIBUTES_CHOICE, OSSL_ALLOWED_ATTRIBUTES_CHOICE, OSSL_ALLOWED_ATTRIBUTES_CHOICE) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_value(sk, idx) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_value(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), (idx))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_new(cmp) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_new(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_compfunc_type(cmp))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_new_null() ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_new_null()) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_new_reserve(cmp, n) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_compfunc_type(cmp), (n))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), (n)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_delete(sk, i) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_delete(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), (i))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_delete_ptr(sk, ptr) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_pop(sk) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_pop(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_shift(sk) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_shift(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk),ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_freefunc_type(freefunc)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr), (idx)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_set(sk, idx, ptr) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_set(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), (idx), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr), pnum) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_dup(sk) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_copyfunc_type(copyfunc), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_freefunc_type(freefunc))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_set_cmp_func(sk, cmp) ((sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_compfunc_type(cmp))) + + +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ALLOWED_ATTRIBUTES_ITEM, OSSL_ALLOWED_ATTRIBUTES_ITEM, OSSL_ALLOWED_ATTRIBUTES_ITEM) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_value(sk, idx) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_value(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), (idx))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_new(cmp) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_new(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_compfunc_type(cmp))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_new_null() ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_new_null()) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_new_reserve(cmp, n) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_compfunc_type(cmp), (n))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), (n)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_delete(sk, i) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_delete(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), (i))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_delete_ptr(sk, ptr) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_pop(sk) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_pop(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_shift(sk) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_shift(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk),ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_freefunc_type(freefunc)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr), (idx)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_set(sk, idx, ptr) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_set(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), (idx), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr), pnum) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_dup(sk) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_copyfunc_type(copyfunc), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_freefunc_type(freefunc))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_set_cmp_func(sk, cmp) ((sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_compfunc_type(cmp))) + + +typedef struct AA_DIST_POINT_st { + DIST_POINT_NAME *distpoint; + ASN1_BIT_STRING *reasons; + int dp_reasons; + ASN1_BOOLEAN indirectCRL; + ASN1_BOOLEAN containsUserAttributeCerts; + ASN1_BOOLEAN containsAACerts; + ASN1_BOOLEAN containsSOAPublicKeyCerts; +} OSSL_AA_DIST_POINT; + +DECLARE_ASN1_FUNCTIONS(OSSL_AA_DIST_POINT) + # ifdef __cplusplus } # endif diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/der/der_ml_dsa_gen.c b/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/der/der_ml_dsa_gen.c new file mode 100644 index 000000000000..d4c6cfc61e88 --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/der/der_ml_dsa_gen.c @@ -0,0 +1,37 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_ml_dsa_gen.c.in + * + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "prov/der_ml_dsa.h" + +/* Well known OIDs precompiled */ + +/* + * id-ml-dsa-44 OBJECT IDENTIFIER ::= { sigAlgs 17 } + */ +const unsigned char ossl_der_oid_id_ml_dsa_44[DER_OID_SZ_id_ml_dsa_44] = { + DER_OID_V_id_ml_dsa_44 +}; + +/* + * id-ml-dsa-65 OBJECT IDENTIFIER ::= { sigAlgs 18 } + */ +const unsigned char ossl_der_oid_id_ml_dsa_65[DER_OID_SZ_id_ml_dsa_65] = { + DER_OID_V_id_ml_dsa_65 +}; + +/* + * id-ml-dsa-87 OBJECT IDENTIFIER ::= { sigAlgs 19 } + */ +const unsigned char ossl_der_oid_id_ml_dsa_87[DER_OID_SZ_id_ml_dsa_87] = { + DER_OID_V_id_ml_dsa_87 +}; + diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/der/der_slh_dsa_gen.c b/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/der/der_slh_dsa_gen.c new file mode 100644 index 000000000000..f9fb0bdc5182 --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/der/der_slh_dsa_gen.c @@ -0,0 +1,100 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_slh_dsa_gen.c.in + * + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "prov/der_slh_dsa.h" + +/* Well known OIDs precompiled */ + +/* + * id-slh-dsa-sha2-128s OBJECT IDENTIFIER ::= { sigAlgs 20 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_sha2_128s[DER_OID_SZ_id_slh_dsa_sha2_128s] = { + DER_OID_V_id_slh_dsa_sha2_128s +}; + +/* + * id-slh-dsa-sha2-128f OBJECT IDENTIFIER ::= { sigAlgs 21 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_sha2_128f[DER_OID_SZ_id_slh_dsa_sha2_128f] = { + DER_OID_V_id_slh_dsa_sha2_128f +}; + +/* + * id-slh-dsa-sha2-192s OBJECT IDENTIFIER ::= { sigAlgs 22 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_sha2_192s[DER_OID_SZ_id_slh_dsa_sha2_192s] = { + DER_OID_V_id_slh_dsa_sha2_192s +}; + +/* + * id-slh-dsa-sha2-192f OBJECT IDENTIFIER ::= { sigAlgs 23 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_sha2_192f[DER_OID_SZ_id_slh_dsa_sha2_192f] = { + DER_OID_V_id_slh_dsa_sha2_192f +}; + +/* + * id-slh-dsa-sha2-256s OBJECT IDENTIFIER ::= { sigAlgs 24 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_sha2_256s[DER_OID_SZ_id_slh_dsa_sha2_256s] = { + DER_OID_V_id_slh_dsa_sha2_256s +}; + +/* + * id-slh-dsa-sha2-256f OBJECT IDENTIFIER ::= { sigAlgs 25 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_sha2_256f[DER_OID_SZ_id_slh_dsa_sha2_256f] = { + DER_OID_V_id_slh_dsa_sha2_256f +}; + +/* + * id-slh-dsa-shake-128s OBJECT IDENTIFIER ::= { sigAlgs 26 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_shake_128s[DER_OID_SZ_id_slh_dsa_shake_128s] = { + DER_OID_V_id_slh_dsa_shake_128s +}; + +/* + * id-slh-dsa-shake-128f OBJECT IDENTIFIER ::= { sigAlgs 27 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_shake_128f[DER_OID_SZ_id_slh_dsa_shake_128f] = { + DER_OID_V_id_slh_dsa_shake_128f +}; + +/* + * id-slh-dsa-shake-192s OBJECT IDENTIFIER ::= { sigAlgs 28 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_shake_192s[DER_OID_SZ_id_slh_dsa_shake_192s] = { + DER_OID_V_id_slh_dsa_shake_192s +}; + +/* + * id-slh-dsa-shake-192f OBJECT IDENTIFIER ::= { sigAlgs 29 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_shake_192f[DER_OID_SZ_id_slh_dsa_shake_192f] = { + DER_OID_V_id_slh_dsa_shake_192f +}; + +/* + * id-slh-dsa-shake-256s OBJECT IDENTIFIER ::= { sigAlgs 30 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_shake_256s[DER_OID_SZ_id_slh_dsa_shake_256s] = { + DER_OID_V_id_slh_dsa_shake_256s +}; + +/* + * id-slh-dsa-shake-256f OBJECT IDENTIFIER ::= { sigAlgs 31 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_shake_256f[DER_OID_SZ_id_slh_dsa_shake_256f] = { + DER_OID_V_id_slh_dsa_shake_256f +}; + diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/include/prov/der_ml_dsa.h b/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/include/prov/der_ml_dsa.h new file mode 100644 index 000000000000..636054f781df --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/include/prov/der_ml_dsa.h @@ -0,0 +1,40 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_ml_dsa.h.in + * + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/der.h" +#include "crypto/ml_dsa.h" + +/* Well known OIDs precompiled */ + +/* + * id-ml-dsa-44 OBJECT IDENTIFIER ::= { sigAlgs 17 } + */ +#define DER_OID_V_id_ml_dsa_44 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x11 +#define DER_OID_SZ_id_ml_dsa_44 11 +extern const unsigned char ossl_der_oid_id_ml_dsa_44[DER_OID_SZ_id_ml_dsa_44]; + +/* + * id-ml-dsa-65 OBJECT IDENTIFIER ::= { sigAlgs 18 } + */ +#define DER_OID_V_id_ml_dsa_65 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x12 +#define DER_OID_SZ_id_ml_dsa_65 11 +extern const unsigned char ossl_der_oid_id_ml_dsa_65[DER_OID_SZ_id_ml_dsa_65]; + +/* + * id-ml-dsa-87 OBJECT IDENTIFIER ::= { sigAlgs 19 } + */ +#define DER_OID_V_id_ml_dsa_87 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x13 +#define DER_OID_SZ_id_ml_dsa_87 11 +extern const unsigned char ossl_der_oid_id_ml_dsa_87[DER_OID_SZ_id_ml_dsa_87]; + + +int ossl_DER_w_algorithmIdentifier_ML_DSA(WPACKET *pkt, int tag, ML_DSA_KEY *key); diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/include/prov/der_slh_dsa.h b/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/include/prov/der_slh_dsa.h new file mode 100644 index 000000000000..0da6cdd7b19f --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/providers/common/include/prov/der_slh_dsa.h @@ -0,0 +1,103 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_slh_dsa.h.in + * + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/der.h" +#include "crypto/slh_dsa.h" + +/* Well known OIDs precompiled */ + +/* + * id-slh-dsa-sha2-128s OBJECT IDENTIFIER ::= { sigAlgs 20 } + */ +#define DER_OID_V_id_slh_dsa_sha2_128s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x14 +#define DER_OID_SZ_id_slh_dsa_sha2_128s 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_128s[DER_OID_SZ_id_slh_dsa_sha2_128s]; + +/* + * id-slh-dsa-sha2-128f OBJECT IDENTIFIER ::= { sigAlgs 21 } + */ +#define DER_OID_V_id_slh_dsa_sha2_128f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x15 +#define DER_OID_SZ_id_slh_dsa_sha2_128f 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_128f[DER_OID_SZ_id_slh_dsa_sha2_128f]; + +/* + * id-slh-dsa-sha2-192s OBJECT IDENTIFIER ::= { sigAlgs 22 } + */ +#define DER_OID_V_id_slh_dsa_sha2_192s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x16 +#define DER_OID_SZ_id_slh_dsa_sha2_192s 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_192s[DER_OID_SZ_id_slh_dsa_sha2_192s]; + +/* + * id-slh-dsa-sha2-192f OBJECT IDENTIFIER ::= { sigAlgs 23 } + */ +#define DER_OID_V_id_slh_dsa_sha2_192f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x17 +#define DER_OID_SZ_id_slh_dsa_sha2_192f 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_192f[DER_OID_SZ_id_slh_dsa_sha2_192f]; + +/* + * id-slh-dsa-sha2-256s OBJECT IDENTIFIER ::= { sigAlgs 24 } + */ +#define DER_OID_V_id_slh_dsa_sha2_256s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x18 +#define DER_OID_SZ_id_slh_dsa_sha2_256s 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_256s[DER_OID_SZ_id_slh_dsa_sha2_256s]; + +/* + * id-slh-dsa-sha2-256f OBJECT IDENTIFIER ::= { sigAlgs 25 } + */ +#define DER_OID_V_id_slh_dsa_sha2_256f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x19 +#define DER_OID_SZ_id_slh_dsa_sha2_256f 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_256f[DER_OID_SZ_id_slh_dsa_sha2_256f]; + +/* + * id-slh-dsa-shake-128s OBJECT IDENTIFIER ::= { sigAlgs 26 } + */ +#define DER_OID_V_id_slh_dsa_shake_128s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1A +#define DER_OID_SZ_id_slh_dsa_shake_128s 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_shake_128s[DER_OID_SZ_id_slh_dsa_shake_128s]; + +/* + * id-slh-dsa-shake-128f OBJECT IDENTIFIER ::= { sigAlgs 27 } + */ +#define DER_OID_V_id_slh_dsa_shake_128f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1B +#define DER_OID_SZ_id_slh_dsa_shake_128f 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_shake_128f[DER_OID_SZ_id_slh_dsa_shake_128f]; + +/* + * id-slh-dsa-shake-192s OBJECT IDENTIFIER ::= { sigAlgs 28 } + */ +#define DER_OID_V_id_slh_dsa_shake_192s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1C +#define DER_OID_SZ_id_slh_dsa_shake_192s 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_shake_192s[DER_OID_SZ_id_slh_dsa_shake_192s]; + +/* + * id-slh-dsa-shake-192f OBJECT IDENTIFIER ::= { sigAlgs 29 } + */ +#define DER_OID_V_id_slh_dsa_shake_192f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1D +#define DER_OID_SZ_id_slh_dsa_shake_192f 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_shake_192f[DER_OID_SZ_id_slh_dsa_shake_192f]; + +/* + * id-slh-dsa-shake-256s OBJECT IDENTIFIER ::= { sigAlgs 30 } + */ +#define DER_OID_V_id_slh_dsa_shake_256s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1E +#define DER_OID_SZ_id_slh_dsa_shake_256s 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_shake_256s[DER_OID_SZ_id_slh_dsa_shake_256s]; + +/* + * id-slh-dsa-shake-256f OBJECT IDENTIFIER ::= { sigAlgs 31 } + */ +#define DER_OID_V_id_slh_dsa_shake_256f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1F +#define DER_OID_SZ_id_slh_dsa_shake_256f 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_shake_256f[DER_OID_SZ_id_slh_dsa_shake_256f]; + + +int ossl_DER_w_algorithmIdentifier_SLH_DSA(WPACKET *pkt, int tag, SLH_DSA_KEY *key); diff --git a/CryptoPkg/Library/OpensslLib/OpensslLib.inf b/CryptoPkg/Library/OpensslLib/OpensslLib.inf index 1aa22f990575..28f7539c2610 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLib.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLib.inf @@ -289,7 +289,9 @@ $(OPENSSL_PATH)/crypto/evp/pmeth_check.c $(OPENSSL_PATH)/crypto/evp/pmeth_gn.c $(OPENSSL_PATH)/crypto/evp/pmeth_lib.c + $(OPENSSL_PATH)/crypto/evp/s_lib.c $(OPENSSL_PATH)/crypto/evp/signature.c + $(OPENSSL_PATH)/crypto/evp/skeymgmt_meth.c $(OPENSSL_PATH)/crypto/ffc/ffc_backend.c $(OPENSSL_PATH)/crypto/ffc/ffc_dh.c $(OPENSSL_PATH)/crypto/ffc/ffc_key_generate.c @@ -297,6 +299,7 @@ $(OPENSSL_PATH)/crypto/ffc/ffc_params.c $(OPENSSL_PATH)/crypto/ffc/ffc_params_generate.c $(OPENSSL_PATH)/crypto/ffc/ffc_params_validate.c + $(OPENSSL_PATH)/crypto/hashtable/hashfunc.c $(OPENSSL_PATH)/crypto/hashtable/hashtable.c $(OPENSSL_PATH)/crypto/hmac/hmac.c $(OPENSSL_PATH)/crypto/hpke/hpke.c @@ -353,6 +356,7 @@ $(OPENSSL_PATH)/crypto/self_test_core.c $(OPENSSL_PATH)/crypto/sleep.c $(OPENSSL_PATH)/crypto/sparse_array.c + $(OPENSSL_PATH)/crypto/ssl_err.c $(OPENSSL_PATH)/crypto/threads_lib.c $(OPENSSL_PATH)/crypto/threads_none.c $(OPENSSL_PATH)/crypto/threads_pthread.c @@ -467,13 +471,17 @@ $(OPENSSL_PATH)/crypto/x509/t_crl.c $(OPENSSL_PATH)/crypto/x509/t_req.c $(OPENSSL_PATH)/crypto/x509/t_x509.c + $(OPENSSL_PATH)/crypto/x509/v3_aaa.c $(OPENSSL_PATH)/crypto/x509/v3_ac_tgt.c $(OPENSSL_PATH)/crypto/x509/v3_addr.c $(OPENSSL_PATH)/crypto/x509/v3_admis.c $(OPENSSL_PATH)/crypto/x509/v3_akeya.c $(OPENSSL_PATH)/crypto/x509/v3_akid.c $(OPENSSL_PATH)/crypto/x509/v3_asid.c + $(OPENSSL_PATH)/crypto/x509/v3_attrdesc.c + $(OPENSSL_PATH)/crypto/x509/v3_attrmap.c $(OPENSSL_PATH)/crypto/x509/v3_audit_id.c + $(OPENSSL_PATH)/crypto/x509/v3_authattid.c $(OPENSSL_PATH)/crypto/x509/v3_battcons.c $(OPENSSL_PATH)/crypto/x509/v3_bcons.c $(OPENSSL_PATH)/crypto/x509/v3_bitst.c @@ -501,12 +509,14 @@ $(OPENSSL_PATH)/crypto/x509/v3_pmaps.c $(OPENSSL_PATH)/crypto/x509/v3_prn.c $(OPENSSL_PATH)/crypto/x509/v3_purp.c + $(OPENSSL_PATH)/crypto/x509/v3_rolespec.c $(OPENSSL_PATH)/crypto/x509/v3_san.c $(OPENSSL_PATH)/crypto/x509/v3_sda.c $(OPENSSL_PATH)/crypto/x509/v3_single_use.c $(OPENSSL_PATH)/crypto/x509/v3_skid.c $(OPENSSL_PATH)/crypto/x509/v3_soa_id.c $(OPENSSL_PATH)/crypto/x509/v3_sxnet.c + $(OPENSSL_PATH)/crypto/x509/v3_timespec.c $(OPENSSL_PATH)/crypto/x509/v3_tlsf.c $(OPENSSL_PATH)/crypto/x509/v3_usernotice.c $(OPENSSL_PATH)/crypto/x509/v3_utf8.c @@ -621,6 +631,8 @@ $(OPENSSL_PATH)/providers/implementations/rands/seeding/rand_win.c $(OPENSSL_PATH)/providers/implementations/signature/mac_legacy_sig.c $(OPENSSL_PATH)/providers/implementations/signature/rsa_sig.c + $(OPENSSL_PATH)/providers/implementations/skeymgmt/aes_skmgmt.c + $(OPENSSL_PATH)/providers/implementations/skeymgmt/generic.c $(OPENSSL_PATH)/ssl/record/methods/ssl3_cbc.c $(OPENSSL_GEN_PATH)/crypto/params_idx.c $(OPENSSL_PATH)/providers/common/der/der_rsa_key.c @@ -652,7 +664,6 @@ $(OPENSSL_PATH)/ssl/ssl_cert_comp.c $(OPENSSL_PATH)/ssl/ssl_ciph.c $(OPENSSL_PATH)/ssl/ssl_conf.c - $(OPENSSL_PATH)/ssl/ssl_err.c $(OPENSSL_PATH)/ssl/ssl_err_legacy.c $(OPENSSL_PATH)/ssl/ssl_init.c $(OPENSSL_PATH)/ssl/ssl_lib.c @@ -669,6 +680,8 @@ $(OPENSSL_PATH)/ssl/tls13_enc.c $(OPENSSL_PATH)/ssl/tls_depr.c $(OPENSSL_PATH)/ssl/tls_srp.c + $(OPENSSL_PATH)/ssl/quic/quic_tls.c + $(OPENSSL_PATH)/ssl/quic/quic_tls_api.c $(OPENSSL_PATH)/ssl/record/rec_layer_d1.c $(OPENSSL_PATH)/ssl/record/rec_layer_s3.c $(OPENSSL_PATH)/ssl/record/methods/dtls_meth.c diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf index 1138211ff477..54663cc56bd8 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf @@ -306,7 +306,9 @@ $(OPENSSL_PATH)/crypto/evp/pmeth_check.c $(OPENSSL_PATH)/crypto/evp/pmeth_gn.c $(OPENSSL_PATH)/crypto/evp/pmeth_lib.c + $(OPENSSL_PATH)/crypto/evp/s_lib.c $(OPENSSL_PATH)/crypto/evp/signature.c + $(OPENSSL_PATH)/crypto/evp/skeymgmt_meth.c $(OPENSSL_PATH)/crypto/ffc/ffc_backend.c $(OPENSSL_PATH)/crypto/ffc/ffc_dh.c $(OPENSSL_PATH)/crypto/ffc/ffc_key_generate.c @@ -314,6 +316,7 @@ $(OPENSSL_PATH)/crypto/ffc/ffc_params.c $(OPENSSL_PATH)/crypto/ffc/ffc_params_generate.c $(OPENSSL_PATH)/crypto/ffc/ffc_params_validate.c + $(OPENSSL_PATH)/crypto/hashtable/hashfunc.c $(OPENSSL_PATH)/crypto/hashtable/hashtable.c $(OPENSSL_PATH)/crypto/hmac/hmac.c $(OPENSSL_PATH)/crypto/hpke/hpke.c @@ -369,6 +372,7 @@ $(OPENSSL_PATH)/crypto/self_test_core.c $(OPENSSL_PATH)/crypto/sleep.c $(OPENSSL_PATH)/crypto/sparse_array.c + $(OPENSSL_PATH)/crypto/ssl_err.c $(OPENSSL_PATH)/crypto/threads_lib.c $(OPENSSL_PATH)/crypto/threads_none.c $(OPENSSL_PATH)/crypto/threads_pthread.c @@ -483,13 +487,17 @@ $(OPENSSL_PATH)/crypto/x509/t_crl.c $(OPENSSL_PATH)/crypto/x509/t_req.c $(OPENSSL_PATH)/crypto/x509/t_x509.c + $(OPENSSL_PATH)/crypto/x509/v3_aaa.c $(OPENSSL_PATH)/crypto/x509/v3_ac_tgt.c $(OPENSSL_PATH)/crypto/x509/v3_addr.c $(OPENSSL_PATH)/crypto/x509/v3_admis.c $(OPENSSL_PATH)/crypto/x509/v3_akeya.c $(OPENSSL_PATH)/crypto/x509/v3_akid.c $(OPENSSL_PATH)/crypto/x509/v3_asid.c + $(OPENSSL_PATH)/crypto/x509/v3_attrdesc.c + $(OPENSSL_PATH)/crypto/x509/v3_attrmap.c $(OPENSSL_PATH)/crypto/x509/v3_audit_id.c + $(OPENSSL_PATH)/crypto/x509/v3_authattid.c $(OPENSSL_PATH)/crypto/x509/v3_battcons.c $(OPENSSL_PATH)/crypto/x509/v3_bcons.c $(OPENSSL_PATH)/crypto/x509/v3_bitst.c @@ -517,12 +525,14 @@ $(OPENSSL_PATH)/crypto/x509/v3_pmaps.c $(OPENSSL_PATH)/crypto/x509/v3_prn.c $(OPENSSL_PATH)/crypto/x509/v3_purp.c + $(OPENSSL_PATH)/crypto/x509/v3_rolespec.c $(OPENSSL_PATH)/crypto/x509/v3_san.c $(OPENSSL_PATH)/crypto/x509/v3_sda.c $(OPENSSL_PATH)/crypto/x509/v3_single_use.c $(OPENSSL_PATH)/crypto/x509/v3_skid.c $(OPENSSL_PATH)/crypto/x509/v3_soa_id.c $(OPENSSL_PATH)/crypto/x509/v3_sxnet.c + $(OPENSSL_PATH)/crypto/x509/v3_timespec.c $(OPENSSL_PATH)/crypto/x509/v3_tlsf.c $(OPENSSL_PATH)/crypto/x509/v3_usernotice.c $(OPENSSL_PATH)/crypto/x509/v3_utf8.c @@ -637,6 +647,8 @@ $(OPENSSL_PATH)/providers/implementations/rands/seeding/rand_win.c $(OPENSSL_PATH)/providers/implementations/signature/mac_legacy_sig.c $(OPENSSL_PATH)/providers/implementations/signature/rsa_sig.c + $(OPENSSL_PATH)/providers/implementations/skeymgmt/aes_skmgmt.c + $(OPENSSL_PATH)/providers/implementations/skeymgmt/generic.c $(OPENSSL_PATH)/ssl/record/methods/ssl3_cbc.c $(OPENSSL_GEN_PATH)/crypto/params_idx.c $(OPENSSL_PATH)/providers/common/der/der_rsa_key.c @@ -668,7 +680,6 @@ $(OPENSSL_PATH)/ssl/ssl_cert_comp.c $(OPENSSL_PATH)/ssl/ssl_ciph.c $(OPENSSL_PATH)/ssl/ssl_conf.c - $(OPENSSL_PATH)/ssl/ssl_err.c $(OPENSSL_PATH)/ssl/ssl_err_legacy.c $(OPENSSL_PATH)/ssl/ssl_init.c $(OPENSSL_PATH)/ssl/ssl_lib.c @@ -685,6 +696,8 @@ $(OPENSSL_PATH)/ssl/tls13_enc.c $(OPENSSL_PATH)/ssl/tls_depr.c $(OPENSSL_PATH)/ssl/tls_srp.c + $(OPENSSL_PATH)/ssl/quic/quic_tls.c + $(OPENSSL_PATH)/ssl/quic/quic_tls_api.c $(OPENSSL_PATH)/ssl/record/rec_layer_d1.c $(OPENSSL_PATH)/ssl/record/rec_layer_s3.c $(OPENSSL_PATH)/ssl/record/methods/dtls_meth.c @@ -982,7 +995,9 @@ $(OPENSSL_PATH)/crypto/evp/pmeth_check.c $(OPENSSL_PATH)/crypto/evp/pmeth_gn.c $(OPENSSL_PATH)/crypto/evp/pmeth_lib.c + $(OPENSSL_PATH)/crypto/evp/s_lib.c $(OPENSSL_PATH)/crypto/evp/signature.c + $(OPENSSL_PATH)/crypto/evp/skeymgmt_meth.c $(OPENSSL_PATH)/crypto/ffc/ffc_backend.c $(OPENSSL_PATH)/crypto/ffc/ffc_dh.c $(OPENSSL_PATH)/crypto/ffc/ffc_key_generate.c @@ -990,6 +1005,7 @@ $(OPENSSL_PATH)/crypto/ffc/ffc_params.c $(OPENSSL_PATH)/crypto/ffc/ffc_params_generate.c $(OPENSSL_PATH)/crypto/ffc/ffc_params_validate.c + $(OPENSSL_PATH)/crypto/hashtable/hashfunc.c $(OPENSSL_PATH)/crypto/hashtable/hashtable.c $(OPENSSL_PATH)/crypto/hmac/hmac.c $(OPENSSL_PATH)/crypto/hpke/hpke.c @@ -1045,6 +1061,7 @@ $(OPENSSL_PATH)/crypto/self_test_core.c $(OPENSSL_PATH)/crypto/sleep.c $(OPENSSL_PATH)/crypto/sparse_array.c + $(OPENSSL_PATH)/crypto/ssl_err.c $(OPENSSL_PATH)/crypto/threads_lib.c $(OPENSSL_PATH)/crypto/threads_none.c $(OPENSSL_PATH)/crypto/threads_pthread.c @@ -1158,13 +1175,17 @@ $(OPENSSL_PATH)/crypto/x509/t_crl.c $(OPENSSL_PATH)/crypto/x509/t_req.c $(OPENSSL_PATH)/crypto/x509/t_x509.c + $(OPENSSL_PATH)/crypto/x509/v3_aaa.c $(OPENSSL_PATH)/crypto/x509/v3_ac_tgt.c $(OPENSSL_PATH)/crypto/x509/v3_addr.c $(OPENSSL_PATH)/crypto/x509/v3_admis.c $(OPENSSL_PATH)/crypto/x509/v3_akeya.c $(OPENSSL_PATH)/crypto/x509/v3_akid.c $(OPENSSL_PATH)/crypto/x509/v3_asid.c + $(OPENSSL_PATH)/crypto/x509/v3_attrdesc.c + $(OPENSSL_PATH)/crypto/x509/v3_attrmap.c $(OPENSSL_PATH)/crypto/x509/v3_audit_id.c + $(OPENSSL_PATH)/crypto/x509/v3_authattid.c $(OPENSSL_PATH)/crypto/x509/v3_battcons.c $(OPENSSL_PATH)/crypto/x509/v3_bcons.c $(OPENSSL_PATH)/crypto/x509/v3_bitst.c @@ -1192,12 +1213,14 @@ $(OPENSSL_PATH)/crypto/x509/v3_pmaps.c $(OPENSSL_PATH)/crypto/x509/v3_prn.c $(OPENSSL_PATH)/crypto/x509/v3_purp.c + $(OPENSSL_PATH)/crypto/x509/v3_rolespec.c $(OPENSSL_PATH)/crypto/x509/v3_san.c $(OPENSSL_PATH)/crypto/x509/v3_sda.c $(OPENSSL_PATH)/crypto/x509/v3_single_use.c $(OPENSSL_PATH)/crypto/x509/v3_skid.c $(OPENSSL_PATH)/crypto/x509/v3_soa_id.c $(OPENSSL_PATH)/crypto/x509/v3_sxnet.c + $(OPENSSL_PATH)/crypto/x509/v3_timespec.c $(OPENSSL_PATH)/crypto/x509/v3_tlsf.c $(OPENSSL_PATH)/crypto/x509/v3_usernotice.c $(OPENSSL_PATH)/crypto/x509/v3_utf8.c @@ -1312,6 +1335,8 @@ $(OPENSSL_PATH)/providers/implementations/rands/seeding/rand_win.c $(OPENSSL_PATH)/providers/implementations/signature/mac_legacy_sig.c $(OPENSSL_PATH)/providers/implementations/signature/rsa_sig.c + $(OPENSSL_PATH)/providers/implementations/skeymgmt/aes_skmgmt.c + $(OPENSSL_PATH)/providers/implementations/skeymgmt/generic.c $(OPENSSL_PATH)/ssl/record/methods/ssl3_cbc.c $(OPENSSL_GEN_PATH)/crypto/params_idx.c $(OPENSSL_PATH)/providers/common/der/der_rsa_key.c @@ -1343,7 +1368,6 @@ $(OPENSSL_PATH)/ssl/ssl_cert_comp.c $(OPENSSL_PATH)/ssl/ssl_ciph.c $(OPENSSL_PATH)/ssl/ssl_conf.c - $(OPENSSL_PATH)/ssl/ssl_err.c $(OPENSSL_PATH)/ssl/ssl_err_legacy.c $(OPENSSL_PATH)/ssl/ssl_init.c $(OPENSSL_PATH)/ssl/ssl_lib.c @@ -1360,6 +1384,8 @@ $(OPENSSL_PATH)/ssl/tls13_enc.c $(OPENSSL_PATH)/ssl/tls_depr.c $(OPENSSL_PATH)/ssl/tls_srp.c + $(OPENSSL_PATH)/ssl/quic/quic_tls.c + $(OPENSSL_PATH)/ssl/quic/quic_tls_api.c $(OPENSSL_PATH)/ssl/record/rec_layer_d1.c $(OPENSSL_PATH)/ssl/record/rec_layer_s3.c $(OPENSSL_PATH)/ssl/record/methods/dtls_meth.c @@ -1382,6 +1408,7 @@ $(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/aesni-sha1-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/aesni-sha256-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/aesni-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm + $(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/aesni-xts-avx512.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/bsaes-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/vpaes-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-MSFT/crypto/x86_64cpuid.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm @@ -1400,6 +1427,7 @@ $(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/aesni-sha1-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/aesni-sha256-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/aesni-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm + $(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/aesni-xts-avx512.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/bsaes-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/vpaes-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-GCC/crypto/x86_64cpuid.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm @@ -1676,7 +1704,9 @@ $(OPENSSL_PATH)/crypto/evp/pmeth_check.c $(OPENSSL_PATH)/crypto/evp/pmeth_gn.c $(OPENSSL_PATH)/crypto/evp/pmeth_lib.c + $(OPENSSL_PATH)/crypto/evp/s_lib.c $(OPENSSL_PATH)/crypto/evp/signature.c + $(OPENSSL_PATH)/crypto/evp/skeymgmt_meth.c $(OPENSSL_PATH)/crypto/ffc/ffc_backend.c $(OPENSSL_PATH)/crypto/ffc/ffc_dh.c $(OPENSSL_PATH)/crypto/ffc/ffc_key_generate.c @@ -1684,6 +1714,7 @@ $(OPENSSL_PATH)/crypto/ffc/ffc_params.c $(OPENSSL_PATH)/crypto/ffc/ffc_params_generate.c $(OPENSSL_PATH)/crypto/ffc/ffc_params_validate.c + $(OPENSSL_PATH)/crypto/hashtable/hashfunc.c $(OPENSSL_PATH)/crypto/hashtable/hashtable.c $(OPENSSL_PATH)/crypto/hmac/hmac.c $(OPENSSL_PATH)/crypto/hpke/hpke.c @@ -1739,6 +1770,7 @@ $(OPENSSL_PATH)/crypto/self_test_core.c $(OPENSSL_PATH)/crypto/sleep.c $(OPENSSL_PATH)/crypto/sparse_array.c + $(OPENSSL_PATH)/crypto/ssl_err.c $(OPENSSL_PATH)/crypto/threads_lib.c $(OPENSSL_PATH)/crypto/threads_none.c $(OPENSSL_PATH)/crypto/threads_pthread.c @@ -1852,13 +1884,17 @@ $(OPENSSL_PATH)/crypto/x509/t_crl.c $(OPENSSL_PATH)/crypto/x509/t_req.c $(OPENSSL_PATH)/crypto/x509/t_x509.c + $(OPENSSL_PATH)/crypto/x509/v3_aaa.c $(OPENSSL_PATH)/crypto/x509/v3_ac_tgt.c $(OPENSSL_PATH)/crypto/x509/v3_addr.c $(OPENSSL_PATH)/crypto/x509/v3_admis.c $(OPENSSL_PATH)/crypto/x509/v3_akeya.c $(OPENSSL_PATH)/crypto/x509/v3_akid.c $(OPENSSL_PATH)/crypto/x509/v3_asid.c + $(OPENSSL_PATH)/crypto/x509/v3_attrdesc.c + $(OPENSSL_PATH)/crypto/x509/v3_attrmap.c $(OPENSSL_PATH)/crypto/x509/v3_audit_id.c + $(OPENSSL_PATH)/crypto/x509/v3_authattid.c $(OPENSSL_PATH)/crypto/x509/v3_battcons.c $(OPENSSL_PATH)/crypto/x509/v3_bcons.c $(OPENSSL_PATH)/crypto/x509/v3_bitst.c @@ -1886,12 +1922,14 @@ $(OPENSSL_PATH)/crypto/x509/v3_pmaps.c $(OPENSSL_PATH)/crypto/x509/v3_prn.c $(OPENSSL_PATH)/crypto/x509/v3_purp.c + $(OPENSSL_PATH)/crypto/x509/v3_rolespec.c $(OPENSSL_PATH)/crypto/x509/v3_san.c $(OPENSSL_PATH)/crypto/x509/v3_sda.c $(OPENSSL_PATH)/crypto/x509/v3_single_use.c $(OPENSSL_PATH)/crypto/x509/v3_skid.c $(OPENSSL_PATH)/crypto/x509/v3_soa_id.c $(OPENSSL_PATH)/crypto/x509/v3_sxnet.c + $(OPENSSL_PATH)/crypto/x509/v3_timespec.c $(OPENSSL_PATH)/crypto/x509/v3_tlsf.c $(OPENSSL_PATH)/crypto/x509/v3_usernotice.c $(OPENSSL_PATH)/crypto/x509/v3_utf8.c @@ -2006,6 +2044,8 @@ $(OPENSSL_PATH)/providers/implementations/rands/seeding/rand_win.c $(OPENSSL_PATH)/providers/implementations/signature/mac_legacy_sig.c $(OPENSSL_PATH)/providers/implementations/signature/rsa_sig.c + $(OPENSSL_PATH)/providers/implementations/skeymgmt/aes_skmgmt.c + $(OPENSSL_PATH)/providers/implementations/skeymgmt/generic.c $(OPENSSL_PATH)/ssl/record/methods/ssl3_cbc.c $(OPENSSL_GEN_PATH)/crypto/params_idx.c $(OPENSSL_PATH)/providers/common/der/der_rsa_key.c @@ -2037,7 +2077,6 @@ $(OPENSSL_PATH)/ssl/ssl_cert_comp.c $(OPENSSL_PATH)/ssl/ssl_ciph.c $(OPENSSL_PATH)/ssl/ssl_conf.c - $(OPENSSL_PATH)/ssl/ssl_err.c $(OPENSSL_PATH)/ssl/ssl_err_legacy.c $(OPENSSL_PATH)/ssl/ssl_init.c $(OPENSSL_PATH)/ssl/ssl_lib.c @@ -2054,6 +2093,8 @@ $(OPENSSL_PATH)/ssl/tls13_enc.c $(OPENSSL_PATH)/ssl/tls_depr.c $(OPENSSL_PATH)/ssl/tls_srp.c + $(OPENSSL_PATH)/ssl/quic/quic_tls.c + $(OPENSSL_PATH)/ssl/quic/quic_tls_api.c $(OPENSSL_PATH)/ssl/record/rec_layer_d1.c $(OPENSSL_PATH)/ssl/record/rec_layer_s3.c $(OPENSSL_PATH)/ssl/record/methods/dtls_meth.c diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf index a5dd36432dd5..30c23d8fdc22 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf @@ -290,7 +290,9 @@ $(OPENSSL_PATH)/crypto/evp/pmeth_check.c $(OPENSSL_PATH)/crypto/evp/pmeth_gn.c $(OPENSSL_PATH)/crypto/evp/pmeth_lib.c + $(OPENSSL_PATH)/crypto/evp/s_lib.c $(OPENSSL_PATH)/crypto/evp/signature.c + $(OPENSSL_PATH)/crypto/evp/skeymgmt_meth.c $(OPENSSL_PATH)/crypto/ffc/ffc_backend.c $(OPENSSL_PATH)/crypto/ffc/ffc_dh.c $(OPENSSL_PATH)/crypto/ffc/ffc_key_generate.c @@ -298,6 +300,7 @@ $(OPENSSL_PATH)/crypto/ffc/ffc_params.c $(OPENSSL_PATH)/crypto/ffc/ffc_params_generate.c $(OPENSSL_PATH)/crypto/ffc/ffc_params_validate.c + $(OPENSSL_PATH)/crypto/hashtable/hashfunc.c $(OPENSSL_PATH)/crypto/hashtable/hashtable.c $(OPENSSL_PATH)/crypto/hmac/hmac.c $(OPENSSL_PATH)/crypto/hpke/hpke.c @@ -354,6 +357,7 @@ $(OPENSSL_PATH)/crypto/self_test_core.c $(OPENSSL_PATH)/crypto/sleep.c $(OPENSSL_PATH)/crypto/sparse_array.c + $(OPENSSL_PATH)/crypto/ssl_err.c $(OPENSSL_PATH)/crypto/threads_lib.c $(OPENSSL_PATH)/crypto/threads_none.c $(OPENSSL_PATH)/crypto/threads_pthread.c @@ -468,13 +472,17 @@ $(OPENSSL_PATH)/crypto/x509/t_crl.c $(OPENSSL_PATH)/crypto/x509/t_req.c $(OPENSSL_PATH)/crypto/x509/t_x509.c + $(OPENSSL_PATH)/crypto/x509/v3_aaa.c $(OPENSSL_PATH)/crypto/x509/v3_ac_tgt.c $(OPENSSL_PATH)/crypto/x509/v3_addr.c $(OPENSSL_PATH)/crypto/x509/v3_admis.c $(OPENSSL_PATH)/crypto/x509/v3_akeya.c $(OPENSSL_PATH)/crypto/x509/v3_akid.c $(OPENSSL_PATH)/crypto/x509/v3_asid.c + $(OPENSSL_PATH)/crypto/x509/v3_attrdesc.c + $(OPENSSL_PATH)/crypto/x509/v3_attrmap.c $(OPENSSL_PATH)/crypto/x509/v3_audit_id.c + $(OPENSSL_PATH)/crypto/x509/v3_authattid.c $(OPENSSL_PATH)/crypto/x509/v3_battcons.c $(OPENSSL_PATH)/crypto/x509/v3_bcons.c $(OPENSSL_PATH)/crypto/x509/v3_bitst.c @@ -502,12 +510,14 @@ $(OPENSSL_PATH)/crypto/x509/v3_pmaps.c $(OPENSSL_PATH)/crypto/x509/v3_prn.c $(OPENSSL_PATH)/crypto/x509/v3_purp.c + $(OPENSSL_PATH)/crypto/x509/v3_rolespec.c $(OPENSSL_PATH)/crypto/x509/v3_san.c $(OPENSSL_PATH)/crypto/x509/v3_sda.c $(OPENSSL_PATH)/crypto/x509/v3_single_use.c $(OPENSSL_PATH)/crypto/x509/v3_skid.c $(OPENSSL_PATH)/crypto/x509/v3_soa_id.c $(OPENSSL_PATH)/crypto/x509/v3_sxnet.c + $(OPENSSL_PATH)/crypto/x509/v3_timespec.c $(OPENSSL_PATH)/crypto/x509/v3_tlsf.c $(OPENSSL_PATH)/crypto/x509/v3_usernotice.c $(OPENSSL_PATH)/crypto/x509/v3_utf8.c @@ -622,6 +632,8 @@ $(OPENSSL_PATH)/providers/implementations/rands/seeding/rand_win.c $(OPENSSL_PATH)/providers/implementations/signature/mac_legacy_sig.c $(OPENSSL_PATH)/providers/implementations/signature/rsa_sig.c + $(OPENSSL_PATH)/providers/implementations/skeymgmt/aes_skmgmt.c + $(OPENSSL_PATH)/providers/implementations/skeymgmt/generic.c $(OPENSSL_PATH)/ssl/record/methods/ssl3_cbc.c $(OPENSSL_GEN_PATH)/crypto/params_idx.c $(OPENSSL_PATH)/providers/common/der/der_rsa_key.c diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf index 75f40b8abf29..280d216b2772 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf @@ -332,7 +332,9 @@ $(OPENSSL_PATH)/crypto/evp/pmeth_check.c $(OPENSSL_PATH)/crypto/evp/pmeth_gn.c $(OPENSSL_PATH)/crypto/evp/pmeth_lib.c + $(OPENSSL_PATH)/crypto/evp/s_lib.c $(OPENSSL_PATH)/crypto/evp/signature.c + $(OPENSSL_PATH)/crypto/evp/skeymgmt_meth.c $(OPENSSL_PATH)/crypto/ffc/ffc_backend.c $(OPENSSL_PATH)/crypto/ffc/ffc_dh.c $(OPENSSL_PATH)/crypto/ffc/ffc_key_generate.c @@ -340,6 +342,7 @@ $(OPENSSL_PATH)/crypto/ffc/ffc_params.c $(OPENSSL_PATH)/crypto/ffc/ffc_params_generate.c $(OPENSSL_PATH)/crypto/ffc/ffc_params_validate.c + $(OPENSSL_PATH)/crypto/hashtable/hashfunc.c $(OPENSSL_PATH)/crypto/hashtable/hashtable.c $(OPENSSL_PATH)/crypto/hmac/hmac.c $(OPENSSL_PATH)/crypto/hpke/hpke.c @@ -396,6 +399,7 @@ $(OPENSSL_PATH)/crypto/self_test_core.c $(OPENSSL_PATH)/crypto/sleep.c $(OPENSSL_PATH)/crypto/sparse_array.c + $(OPENSSL_PATH)/crypto/ssl_err.c $(OPENSSL_PATH)/crypto/threads_lib.c $(OPENSSL_PATH)/crypto/threads_none.c $(OPENSSL_PATH)/crypto/threads_pthread.c @@ -510,13 +514,17 @@ $(OPENSSL_PATH)/crypto/x509/t_crl.c $(OPENSSL_PATH)/crypto/x509/t_req.c $(OPENSSL_PATH)/crypto/x509/t_x509.c + $(OPENSSL_PATH)/crypto/x509/v3_aaa.c $(OPENSSL_PATH)/crypto/x509/v3_ac_tgt.c $(OPENSSL_PATH)/crypto/x509/v3_addr.c $(OPENSSL_PATH)/crypto/x509/v3_admis.c $(OPENSSL_PATH)/crypto/x509/v3_akeya.c $(OPENSSL_PATH)/crypto/x509/v3_akid.c $(OPENSSL_PATH)/crypto/x509/v3_asid.c + $(OPENSSL_PATH)/crypto/x509/v3_attrdesc.c + $(OPENSSL_PATH)/crypto/x509/v3_attrmap.c $(OPENSSL_PATH)/crypto/x509/v3_audit_id.c + $(OPENSSL_PATH)/crypto/x509/v3_authattid.c $(OPENSSL_PATH)/crypto/x509/v3_battcons.c $(OPENSSL_PATH)/crypto/x509/v3_bcons.c $(OPENSSL_PATH)/crypto/x509/v3_bitst.c @@ -544,12 +552,14 @@ $(OPENSSL_PATH)/crypto/x509/v3_pmaps.c $(OPENSSL_PATH)/crypto/x509/v3_prn.c $(OPENSSL_PATH)/crypto/x509/v3_purp.c + $(OPENSSL_PATH)/crypto/x509/v3_rolespec.c $(OPENSSL_PATH)/crypto/x509/v3_san.c $(OPENSSL_PATH)/crypto/x509/v3_sda.c $(OPENSSL_PATH)/crypto/x509/v3_single_use.c $(OPENSSL_PATH)/crypto/x509/v3_skid.c $(OPENSSL_PATH)/crypto/x509/v3_soa_id.c $(OPENSSL_PATH)/crypto/x509/v3_sxnet.c + $(OPENSSL_PATH)/crypto/x509/v3_timespec.c $(OPENSSL_PATH)/crypto/x509/v3_tlsf.c $(OPENSSL_PATH)/crypto/x509/v3_usernotice.c $(OPENSSL_PATH)/crypto/x509/v3_utf8.c @@ -673,6 +683,8 @@ $(OPENSSL_PATH)/providers/implementations/signature/eddsa_sig.c $(OPENSSL_PATH)/providers/implementations/signature/mac_legacy_sig.c $(OPENSSL_PATH)/providers/implementations/signature/rsa_sig.c + $(OPENSSL_PATH)/providers/implementations/skeymgmt/aes_skmgmt.c + $(OPENSSL_PATH)/providers/implementations/skeymgmt/generic.c $(OPENSSL_PATH)/ssl/record/methods/ssl3_cbc.c $(OPENSSL_GEN_PATH)/crypto/params_idx.c $(OPENSSL_PATH)/providers/common/der/der_ec_key.c @@ -709,7 +721,6 @@ $(OPENSSL_PATH)/ssl/ssl_cert_comp.c $(OPENSSL_PATH)/ssl/ssl_ciph.c $(OPENSSL_PATH)/ssl/ssl_conf.c - $(OPENSSL_PATH)/ssl/ssl_err.c $(OPENSSL_PATH)/ssl/ssl_err_legacy.c $(OPENSSL_PATH)/ssl/ssl_init.c $(OPENSSL_PATH)/ssl/ssl_lib.c @@ -726,6 +737,8 @@ $(OPENSSL_PATH)/ssl/tls13_enc.c $(OPENSSL_PATH)/ssl/tls_depr.c $(OPENSSL_PATH)/ssl/tls_srp.c + $(OPENSSL_PATH)/ssl/quic/quic_tls.c + $(OPENSSL_PATH)/ssl/quic/quic_tls_api.c $(OPENSSL_PATH)/ssl/record/rec_layer_d1.c $(OPENSSL_PATH)/ssl/record/rec_layer_s3.c $(OPENSSL_PATH)/ssl/record/methods/dtls_meth.c diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf index f46659c0a0d6..0f9efd1fc172 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf @@ -349,7 +349,9 @@ $(OPENSSL_PATH)/crypto/evp/pmeth_check.c $(OPENSSL_PATH)/crypto/evp/pmeth_gn.c $(OPENSSL_PATH)/crypto/evp/pmeth_lib.c + $(OPENSSL_PATH)/crypto/evp/s_lib.c $(OPENSSL_PATH)/crypto/evp/signature.c + $(OPENSSL_PATH)/crypto/evp/skeymgmt_meth.c $(OPENSSL_PATH)/crypto/ffc/ffc_backend.c $(OPENSSL_PATH)/crypto/ffc/ffc_dh.c $(OPENSSL_PATH)/crypto/ffc/ffc_key_generate.c @@ -357,6 +359,7 @@ $(OPENSSL_PATH)/crypto/ffc/ffc_params.c $(OPENSSL_PATH)/crypto/ffc/ffc_params_generate.c $(OPENSSL_PATH)/crypto/ffc/ffc_params_validate.c + $(OPENSSL_PATH)/crypto/hashtable/hashfunc.c $(OPENSSL_PATH)/crypto/hashtable/hashtable.c $(OPENSSL_PATH)/crypto/hmac/hmac.c $(OPENSSL_PATH)/crypto/hpke/hpke.c @@ -412,6 +415,7 @@ $(OPENSSL_PATH)/crypto/self_test_core.c $(OPENSSL_PATH)/crypto/sleep.c $(OPENSSL_PATH)/crypto/sparse_array.c + $(OPENSSL_PATH)/crypto/ssl_err.c $(OPENSSL_PATH)/crypto/threads_lib.c $(OPENSSL_PATH)/crypto/threads_none.c $(OPENSSL_PATH)/crypto/threads_pthread.c @@ -526,13 +530,17 @@ $(OPENSSL_PATH)/crypto/x509/t_crl.c $(OPENSSL_PATH)/crypto/x509/t_req.c $(OPENSSL_PATH)/crypto/x509/t_x509.c + $(OPENSSL_PATH)/crypto/x509/v3_aaa.c $(OPENSSL_PATH)/crypto/x509/v3_ac_tgt.c $(OPENSSL_PATH)/crypto/x509/v3_addr.c $(OPENSSL_PATH)/crypto/x509/v3_admis.c $(OPENSSL_PATH)/crypto/x509/v3_akeya.c $(OPENSSL_PATH)/crypto/x509/v3_akid.c $(OPENSSL_PATH)/crypto/x509/v3_asid.c + $(OPENSSL_PATH)/crypto/x509/v3_attrdesc.c + $(OPENSSL_PATH)/crypto/x509/v3_attrmap.c $(OPENSSL_PATH)/crypto/x509/v3_audit_id.c + $(OPENSSL_PATH)/crypto/x509/v3_authattid.c $(OPENSSL_PATH)/crypto/x509/v3_battcons.c $(OPENSSL_PATH)/crypto/x509/v3_bcons.c $(OPENSSL_PATH)/crypto/x509/v3_bitst.c @@ -560,12 +568,14 @@ $(OPENSSL_PATH)/crypto/x509/v3_pmaps.c $(OPENSSL_PATH)/crypto/x509/v3_prn.c $(OPENSSL_PATH)/crypto/x509/v3_purp.c + $(OPENSSL_PATH)/crypto/x509/v3_rolespec.c $(OPENSSL_PATH)/crypto/x509/v3_san.c $(OPENSSL_PATH)/crypto/x509/v3_sda.c $(OPENSSL_PATH)/crypto/x509/v3_single_use.c $(OPENSSL_PATH)/crypto/x509/v3_skid.c $(OPENSSL_PATH)/crypto/x509/v3_soa_id.c $(OPENSSL_PATH)/crypto/x509/v3_sxnet.c + $(OPENSSL_PATH)/crypto/x509/v3_timespec.c $(OPENSSL_PATH)/crypto/x509/v3_tlsf.c $(OPENSSL_PATH)/crypto/x509/v3_usernotice.c $(OPENSSL_PATH)/crypto/x509/v3_utf8.c @@ -689,6 +699,8 @@ $(OPENSSL_PATH)/providers/implementations/signature/eddsa_sig.c $(OPENSSL_PATH)/providers/implementations/signature/mac_legacy_sig.c $(OPENSSL_PATH)/providers/implementations/signature/rsa_sig.c + $(OPENSSL_PATH)/providers/implementations/skeymgmt/aes_skmgmt.c + $(OPENSSL_PATH)/providers/implementations/skeymgmt/generic.c $(OPENSSL_PATH)/ssl/record/methods/ssl3_cbc.c $(OPENSSL_GEN_PATH)/crypto/params_idx.c $(OPENSSL_PATH)/providers/common/der/der_ec_key.c @@ -725,7 +737,6 @@ $(OPENSSL_PATH)/ssl/ssl_cert_comp.c $(OPENSSL_PATH)/ssl/ssl_ciph.c $(OPENSSL_PATH)/ssl/ssl_conf.c - $(OPENSSL_PATH)/ssl/ssl_err.c $(OPENSSL_PATH)/ssl/ssl_err_legacy.c $(OPENSSL_PATH)/ssl/ssl_init.c $(OPENSSL_PATH)/ssl/ssl_lib.c @@ -742,6 +753,8 @@ $(OPENSSL_PATH)/ssl/tls13_enc.c $(OPENSSL_PATH)/ssl/tls_depr.c $(OPENSSL_PATH)/ssl/tls_srp.c + $(OPENSSL_PATH)/ssl/quic/quic_tls.c + $(OPENSSL_PATH)/ssl/quic/quic_tls_api.c $(OPENSSL_PATH)/ssl/record/rec_layer_d1.c $(OPENSSL_PATH)/ssl/record/rec_layer_s3.c $(OPENSSL_PATH)/ssl/record/methods/dtls_meth.c @@ -1077,7 +1090,9 @@ $(OPENSSL_PATH)/crypto/evp/pmeth_check.c $(OPENSSL_PATH)/crypto/evp/pmeth_gn.c $(OPENSSL_PATH)/crypto/evp/pmeth_lib.c + $(OPENSSL_PATH)/crypto/evp/s_lib.c $(OPENSSL_PATH)/crypto/evp/signature.c + $(OPENSSL_PATH)/crypto/evp/skeymgmt_meth.c $(OPENSSL_PATH)/crypto/ffc/ffc_backend.c $(OPENSSL_PATH)/crypto/ffc/ffc_dh.c $(OPENSSL_PATH)/crypto/ffc/ffc_key_generate.c @@ -1085,6 +1100,7 @@ $(OPENSSL_PATH)/crypto/ffc/ffc_params.c $(OPENSSL_PATH)/crypto/ffc/ffc_params_generate.c $(OPENSSL_PATH)/crypto/ffc/ffc_params_validate.c + $(OPENSSL_PATH)/crypto/hashtable/hashfunc.c $(OPENSSL_PATH)/crypto/hashtable/hashtable.c $(OPENSSL_PATH)/crypto/hmac/hmac.c $(OPENSSL_PATH)/crypto/hpke/hpke.c @@ -1140,6 +1156,7 @@ $(OPENSSL_PATH)/crypto/self_test_core.c $(OPENSSL_PATH)/crypto/sleep.c $(OPENSSL_PATH)/crypto/sparse_array.c + $(OPENSSL_PATH)/crypto/ssl_err.c $(OPENSSL_PATH)/crypto/threads_lib.c $(OPENSSL_PATH)/crypto/threads_none.c $(OPENSSL_PATH)/crypto/threads_pthread.c @@ -1253,13 +1270,17 @@ $(OPENSSL_PATH)/crypto/x509/t_crl.c $(OPENSSL_PATH)/crypto/x509/t_req.c $(OPENSSL_PATH)/crypto/x509/t_x509.c + $(OPENSSL_PATH)/crypto/x509/v3_aaa.c $(OPENSSL_PATH)/crypto/x509/v3_ac_tgt.c $(OPENSSL_PATH)/crypto/x509/v3_addr.c $(OPENSSL_PATH)/crypto/x509/v3_admis.c $(OPENSSL_PATH)/crypto/x509/v3_akeya.c $(OPENSSL_PATH)/crypto/x509/v3_akid.c $(OPENSSL_PATH)/crypto/x509/v3_asid.c + $(OPENSSL_PATH)/crypto/x509/v3_attrdesc.c + $(OPENSSL_PATH)/crypto/x509/v3_attrmap.c $(OPENSSL_PATH)/crypto/x509/v3_audit_id.c + $(OPENSSL_PATH)/crypto/x509/v3_authattid.c $(OPENSSL_PATH)/crypto/x509/v3_battcons.c $(OPENSSL_PATH)/crypto/x509/v3_bcons.c $(OPENSSL_PATH)/crypto/x509/v3_bitst.c @@ -1287,12 +1308,14 @@ $(OPENSSL_PATH)/crypto/x509/v3_pmaps.c $(OPENSSL_PATH)/crypto/x509/v3_prn.c $(OPENSSL_PATH)/crypto/x509/v3_purp.c + $(OPENSSL_PATH)/crypto/x509/v3_rolespec.c $(OPENSSL_PATH)/crypto/x509/v3_san.c $(OPENSSL_PATH)/crypto/x509/v3_sda.c $(OPENSSL_PATH)/crypto/x509/v3_single_use.c $(OPENSSL_PATH)/crypto/x509/v3_skid.c $(OPENSSL_PATH)/crypto/x509/v3_soa_id.c $(OPENSSL_PATH)/crypto/x509/v3_sxnet.c + $(OPENSSL_PATH)/crypto/x509/v3_timespec.c $(OPENSSL_PATH)/crypto/x509/v3_tlsf.c $(OPENSSL_PATH)/crypto/x509/v3_usernotice.c $(OPENSSL_PATH)/crypto/x509/v3_utf8.c @@ -1416,6 +1439,8 @@ $(OPENSSL_PATH)/providers/implementations/signature/eddsa_sig.c $(OPENSSL_PATH)/providers/implementations/signature/mac_legacy_sig.c $(OPENSSL_PATH)/providers/implementations/signature/rsa_sig.c + $(OPENSSL_PATH)/providers/implementations/skeymgmt/aes_skmgmt.c + $(OPENSSL_PATH)/providers/implementations/skeymgmt/generic.c $(OPENSSL_PATH)/ssl/record/methods/ssl3_cbc.c $(OPENSSL_GEN_PATH)/crypto/params_idx.c $(OPENSSL_PATH)/providers/common/der/der_ec_key.c @@ -1452,7 +1477,6 @@ $(OPENSSL_PATH)/ssl/ssl_cert_comp.c $(OPENSSL_PATH)/ssl/ssl_ciph.c $(OPENSSL_PATH)/ssl/ssl_conf.c - $(OPENSSL_PATH)/ssl/ssl_err.c $(OPENSSL_PATH)/ssl/ssl_err_legacy.c $(OPENSSL_PATH)/ssl/ssl_init.c $(OPENSSL_PATH)/ssl/ssl_lib.c @@ -1469,6 +1493,8 @@ $(OPENSSL_PATH)/ssl/tls13_enc.c $(OPENSSL_PATH)/ssl/tls_depr.c $(OPENSSL_PATH)/ssl/tls_srp.c + $(OPENSSL_PATH)/ssl/quic/quic_tls.c + $(OPENSSL_PATH)/ssl/quic/quic_tls_api.c $(OPENSSL_PATH)/ssl/record/rec_layer_d1.c $(OPENSSL_PATH)/ssl/record/rec_layer_s3.c $(OPENSSL_PATH)/ssl/record/methods/dtls_meth.c @@ -1491,6 +1517,7 @@ $(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/aesni-sha1-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/aesni-sha256-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/aesni-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm + $(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/aesni-xts-avx512.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/bsaes-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-MSFT/crypto/aes/vpaes-x86_64.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-MSFT/crypto/x86_64cpuid.nasm ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm @@ -1509,6 +1536,7 @@ $(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/aesni-sha1-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/aesni-sha256-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/aesni-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm + $(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/aesni-xts-avx512.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/bsaes-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-GCC/crypto/aes/vpaes-x86_64.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm $(OPENSSL_GEN_PATH)/X64-GCC/crypto/x86_64cpuid.s ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm @@ -1823,7 +1851,9 @@ $(OPENSSL_PATH)/crypto/evp/pmeth_check.c $(OPENSSL_PATH)/crypto/evp/pmeth_gn.c $(OPENSSL_PATH)/crypto/evp/pmeth_lib.c + $(OPENSSL_PATH)/crypto/evp/s_lib.c $(OPENSSL_PATH)/crypto/evp/signature.c + $(OPENSSL_PATH)/crypto/evp/skeymgmt_meth.c $(OPENSSL_PATH)/crypto/ffc/ffc_backend.c $(OPENSSL_PATH)/crypto/ffc/ffc_dh.c $(OPENSSL_PATH)/crypto/ffc/ffc_key_generate.c @@ -1831,6 +1861,7 @@ $(OPENSSL_PATH)/crypto/ffc/ffc_params.c $(OPENSSL_PATH)/crypto/ffc/ffc_params_generate.c $(OPENSSL_PATH)/crypto/ffc/ffc_params_validate.c + $(OPENSSL_PATH)/crypto/hashtable/hashfunc.c $(OPENSSL_PATH)/crypto/hashtable/hashtable.c $(OPENSSL_PATH)/crypto/hmac/hmac.c $(OPENSSL_PATH)/crypto/hpke/hpke.c @@ -1886,6 +1917,7 @@ $(OPENSSL_PATH)/crypto/self_test_core.c $(OPENSSL_PATH)/crypto/sleep.c $(OPENSSL_PATH)/crypto/sparse_array.c + $(OPENSSL_PATH)/crypto/ssl_err.c $(OPENSSL_PATH)/crypto/threads_lib.c $(OPENSSL_PATH)/crypto/threads_none.c $(OPENSSL_PATH)/crypto/threads_pthread.c @@ -1999,13 +2031,17 @@ $(OPENSSL_PATH)/crypto/x509/t_crl.c $(OPENSSL_PATH)/crypto/x509/t_req.c $(OPENSSL_PATH)/crypto/x509/t_x509.c + $(OPENSSL_PATH)/crypto/x509/v3_aaa.c $(OPENSSL_PATH)/crypto/x509/v3_ac_tgt.c $(OPENSSL_PATH)/crypto/x509/v3_addr.c $(OPENSSL_PATH)/crypto/x509/v3_admis.c $(OPENSSL_PATH)/crypto/x509/v3_akeya.c $(OPENSSL_PATH)/crypto/x509/v3_akid.c $(OPENSSL_PATH)/crypto/x509/v3_asid.c + $(OPENSSL_PATH)/crypto/x509/v3_attrdesc.c + $(OPENSSL_PATH)/crypto/x509/v3_attrmap.c $(OPENSSL_PATH)/crypto/x509/v3_audit_id.c + $(OPENSSL_PATH)/crypto/x509/v3_authattid.c $(OPENSSL_PATH)/crypto/x509/v3_battcons.c $(OPENSSL_PATH)/crypto/x509/v3_bcons.c $(OPENSSL_PATH)/crypto/x509/v3_bitst.c @@ -2033,12 +2069,14 @@ $(OPENSSL_PATH)/crypto/x509/v3_pmaps.c $(OPENSSL_PATH)/crypto/x509/v3_prn.c $(OPENSSL_PATH)/crypto/x509/v3_purp.c + $(OPENSSL_PATH)/crypto/x509/v3_rolespec.c $(OPENSSL_PATH)/crypto/x509/v3_san.c $(OPENSSL_PATH)/crypto/x509/v3_sda.c $(OPENSSL_PATH)/crypto/x509/v3_single_use.c $(OPENSSL_PATH)/crypto/x509/v3_skid.c $(OPENSSL_PATH)/crypto/x509/v3_soa_id.c $(OPENSSL_PATH)/crypto/x509/v3_sxnet.c + $(OPENSSL_PATH)/crypto/x509/v3_timespec.c $(OPENSSL_PATH)/crypto/x509/v3_tlsf.c $(OPENSSL_PATH)/crypto/x509/v3_usernotice.c $(OPENSSL_PATH)/crypto/x509/v3_utf8.c @@ -2162,6 +2200,8 @@ $(OPENSSL_PATH)/providers/implementations/signature/eddsa_sig.c $(OPENSSL_PATH)/providers/implementations/signature/mac_legacy_sig.c $(OPENSSL_PATH)/providers/implementations/signature/rsa_sig.c + $(OPENSSL_PATH)/providers/implementations/skeymgmt/aes_skmgmt.c + $(OPENSSL_PATH)/providers/implementations/skeymgmt/generic.c $(OPENSSL_PATH)/ssl/record/methods/ssl3_cbc.c $(OPENSSL_GEN_PATH)/crypto/params_idx.c $(OPENSSL_PATH)/providers/common/der/der_ec_key.c @@ -2198,7 +2238,6 @@ $(OPENSSL_PATH)/ssl/ssl_cert_comp.c $(OPENSSL_PATH)/ssl/ssl_ciph.c $(OPENSSL_PATH)/ssl/ssl_conf.c - $(OPENSSL_PATH)/ssl/ssl_err.c $(OPENSSL_PATH)/ssl/ssl_err_legacy.c $(OPENSSL_PATH)/ssl/ssl_init.c $(OPENSSL_PATH)/ssl/ssl_lib.c @@ -2215,6 +2254,8 @@ $(OPENSSL_PATH)/ssl/tls13_enc.c $(OPENSSL_PATH)/ssl/tls_depr.c $(OPENSSL_PATH)/ssl/tls_srp.c + $(OPENSSL_PATH)/ssl/quic/quic_tls.c + $(OPENSSL_PATH)/ssl/quic/quic_tls_api.c $(OPENSSL_PATH)/ssl/record/rec_layer_d1.c $(OPENSSL_PATH)/ssl/record/rec_layer_s3.c $(OPENSSL_PATH)/ssl/record/methods/dtls_meth.c From 8a1698229f01f0fec0c11b27c3f21641d6e02618 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 24 Apr 2025 15:25:28 +0200 Subject: [PATCH 0268/1172] CryptoPkg/openssl: add new generated files to uncrustify exception list Signed-off-by: Gerd Hoffmann --- CryptoPkg/CryptoPkg.ci.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CryptoPkg/CryptoPkg.ci.yaml b/CryptoPkg/CryptoPkg.ci.yaml index 8bb5717a1286..cf614f00fc1d 100644 --- a/CryptoPkg/CryptoPkg.ci.yaml +++ b/CryptoPkg/CryptoPkg.ci.yaml @@ -142,12 +142,16 @@ "Library/OpensslLib/OpensslGen/providers/common/der/der_digests_gen.c", "Library/OpensslLib/OpensslGen/providers/common/der/der_ecx_gen.c", "Library/OpensslLib/OpensslGen/providers/common/der/der_ec_gen.c", + "Library/OpensslLib/OpensslGen/providers/common/der/der_ml_dsa_gen.c", "Library/OpensslLib/OpensslGen/providers/common/der/der_rsa_gen.c", + "Library/OpensslLib/OpensslGen/providers/common/der/der_slh_dsa_gen.c", "Library/OpensslLib/OpensslGen/providers/common/der/der_wrap_gen.c", "Library/OpensslLib/OpensslGen/providers/common/include/prov/der_digests.h", "Library/OpensslLib/OpensslGen/providers/common/include/prov/der_ec.h", "Library/OpensslLib/OpensslGen/providers/common/include/prov/der_ecx.h", + "Library/OpensslLib/OpensslGen/providers/common/include/prov/der_ml_dsa.h", "Library/OpensslLib/OpensslGen/providers/common/include/prov/der_rsa.h", + "Library/OpensslLib/OpensslGen/providers/common/include/prov/der_slh_dsa.h", "Library/OpensslLib/OpensslGen/providers/common/include/prov/der_wrap.h", "Library/OpensslLib/OpensslStub/uefiprov.c" ] From e9bac26203da4b945ff2365c590edfd9accb80cc Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 7 Apr 2025 19:22:04 +0200 Subject: [PATCH 0269/1172] CryptoPkg/openssl: add ossl_bio_print_labeled_buf stub New function in openssl 3.5 in a file edk2 replaces with stubs. Add a stub for the new function. Signed-off-by: Gerd Hoffmann --- .../Library/OpensslLib/OpensslStub/EncoderNull.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CryptoPkg/Library/OpensslLib/OpensslStub/EncoderNull.c b/CryptoPkg/Library/OpensslLib/OpensslStub/EncoderNull.c index f3106cf8abed..1430696462cd 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslStub/EncoderNull.c +++ b/CryptoPkg/Library/OpensslLib/OpensslStub/EncoderNull.c @@ -362,3 +362,14 @@ ossl_encoder_store_cache_flush ( { return -1; } + +int +ossl_bio_print_labeled_buf ( + BIO *out, + const char *label, + const unsigned char *buf, + size_t buflen + ) +{ + return -1; +} From 2a36117d7af2632d15df624074ac650798c247d6 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 24 Apr 2025 12:06:05 +0200 Subject: [PATCH 0270/1172] CryptoPkg/CrtLib: add strpbrk implementation Needed by openssl-3.5.1. Signed-off-by: Gerd Hoffmann --- .../Library/BaseCryptLib/SysCall/CrtWrapper.c | 19 +++++++++++++++++++ CryptoPkg/Library/Include/CrtLibSupport.h | 6 ++++++ 2 files changed, 25 insertions(+) diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c b/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c index 8046ef9b20e0..8a8fdfefc7a8 100644 --- a/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c +++ b/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c @@ -425,6 +425,25 @@ strtoul ( return 0; } +char * +strpbrk ( + const char *s, + const char *accept + ) +{ + int i; + + for ( ; *s != '\0'; s++) { + for (i = 0; accept[i] != '\0'; i++) { + if (*s == accept[i]) { + return (char *)s; + } + } + } + + return NULL; +} + /* Convert character to lowercase */ int tolower ( diff --git a/CryptoPkg/Library/Include/CrtLibSupport.h b/CryptoPkg/Library/Include/CrtLibSupport.h index b43bfd41b194..9fdffedf5f1e 100644 --- a/CryptoPkg/Library/Include/CrtLibSupport.h +++ b/CryptoPkg/Library/Include/CrtLibSupport.h @@ -426,6 +426,12 @@ strcat ( const char *strSource ); +char * +strpbrk ( + const char *s, + const char *accept + ); + // // Macros that directly map functions to BaseLib, BaseMemoryLib, and DebugLib functions // From c718ed29a450938046f48cffdb34a3d66560d2a8 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 24 Apr 2025 17:21:04 +0200 Subject: [PATCH 0271/1172] CryptoPkg/CrtLib: explicitly define INT32* constants Avoids openssl-3.5 trying to figure automatically with some macro magic, which happens to not work with the microsoft compiler. Signed-off-by: Gerd Hoffmann --- CryptoPkg/Library/Include/CrtLibSupport.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CryptoPkg/Library/Include/CrtLibSupport.h b/CryptoPkg/Library/Include/CrtLibSupport.h index 9fdffedf5f1e..80e2fa9ca52e 100644 --- a/CryptoPkg/Library/Include/CrtLibSupport.h +++ b/CryptoPkg/Library/Include/CrtLibSupport.h @@ -79,6 +79,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #define CHAR_BIT 8 /* Number of bits in a char */ #define SIZE_MAX 0xFFFFFFFF /* Maximum unsigned size_t */ +#define INT32_MIN INT_MIN +#define INT32_MAX INT_MAX +#define UINT32_MAX UINT_MAX + // // Address families. // From 94d6fcf46566c4c3ed332b7e094aed5a46399b3b Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 25 Apr 2025 07:28:41 +0200 Subject: [PATCH 0272/1172] CryptoPkg/openssl: turn off warning 4130 for microsoft compiler Needed to build with openssl-3.5. Signed-off-by: Gerd Hoffmann --- CryptoPkg/Library/OpensslLib/OpensslLib.inf | 4 ++-- CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf | 4 ++-- CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf | 4 ++-- CryptoPkg/Library/OpensslLib/OpensslLibFull.inf | 4 ++-- CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/CryptoPkg/Library/OpensslLib/OpensslLib.inf b/CryptoPkg/Library/OpensslLib/OpensslLib.inf index 28f7539c2610..07782362d17c 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLib.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLib.inf @@ -740,8 +740,8 @@ # C4819: The file contains a character that cannot be represented in the current code page # C4133: incompatible types - from 'ASN1_TYPE *' to 'const ASN1_STRING *' (v3_genn.c(101)) # - MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189 - MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189 + MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 + MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 # # Disable following Visual Studio 2015 compiler warnings brought by openssl source, diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf index 54663cc56bd8..98ff3e8a61fa 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf @@ -2158,8 +2158,8 @@ # C4819: The file contains a character that cannot be represented in the current code page # C4133: incompatible types - from 'ASN1_TYPE *' to 'const ASN1_STRING *' (v3_genn.c(101)) # - MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189 - MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189 + MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 + MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 # # Disable following Visual Studio 2015 compiler warnings brought by openssl source, diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf index 30c23d8fdc22..42fb505fa57c 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf @@ -690,8 +690,8 @@ # C4819: The file contains a character that cannot be represented in the current code page # C4133: incompatible types - from 'ASN1_TYPE *' to 'const ASN1_STRING *' (v3_genn.c(101)) # - MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189 - MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189 + MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 + MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 # # Disable following Visual Studio 2015 compiler warnings brought by openssl source, diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf index 280d216b2772..3bdda0f68693 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf @@ -797,8 +797,8 @@ # C4819: The file contains a character that cannot be represented in the current code page # C4133: incompatible types - from 'ASN1_TYPE *' to 'const ASN1_STRING *' (v3_genn.c(101)) # - MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189 - MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189 + MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 + MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 # # Disable following Visual Studio 2015 compiler warnings brought by openssl source, diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf index 0f9efd1fc172..b61abdd811ce 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf @@ -2319,8 +2319,8 @@ # C4819: The file contains a character that cannot be represented in the current code page # C4133: incompatible types - from 'ASN1_TYPE *' to 'const ASN1_STRING *' (v3_genn.c(101)) # - MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189 - MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4133 /wd4189 + MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 + MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 # # Disable following Visual Studio 2015 compiler warnings brought by openssl source, From 7bbe0b2dec2789630ab2e3254f988d78cf859672 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 10 Jun 2025 12:42:02 +0200 Subject: [PATCH 0273/1172] CryptoPkg/openssl: disable some features support Reduce library size by turning off: * quic protocol support. * post-quantum chipers. Signed-off-by: Gerd Hoffmann --- CryptoPkg/Library/OpensslLib/configure.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CryptoPkg/Library/OpensslLib/configure.py b/CryptoPkg/Library/OpensslLib/configure.py index 37e5cf395da2..beb6f3ed61b6 100755 --- a/CryptoPkg/Library/OpensslLib/configure.py +++ b/CryptoPkg/Library/OpensslLib/configure.py @@ -53,6 +53,8 @@ def openssl_configure(openssldir, target, ec = True): 'no-module', 'no-md4', 'no-mdc2', + 'no-ml-dsa', + 'no-ml-kem', 'no-multiblock', 'no-nextprotoneg', 'no-pic', @@ -62,6 +64,7 @@ def openssl_configure(openssldir, target, ec = True): 'no-padlockeng', 'no-poly1305', 'no-posix-io', + 'no-quic', 'no-rc2', 'no-rc4', 'no-rc5', @@ -72,6 +75,7 @@ def openssl_configure(openssldir, target, ec = True): 'no-shared', 'no-siphash', 'no-siv', + 'no-slh-dsa', 'no-sm2', 'no-sm4', 'no-sock', From 8be9a344d35316fb0ee70a33779a7a931fcb8a1d Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Mon, 12 May 2025 10:55:53 -0700 Subject: [PATCH 0274/1172] MdeModulePkg: Console cumulative codeql issues. Running Codeql on MdeModulePkg/Universal/Console drivers results in codeql errors stemming for the following checks. - cpp/comparison-with-wider-type - cpp/missing-null-test Signed-off-by: Aaron Pop Co-authored-by: Michael Kubacki Co-authored-by: Taylor Beebe Co-authored-by: pohanch <125842322+pohanch@users.noreply.github.com> Co-authored-by: kenlautner <85201046+kenlautner@users.noreply.github.com> Co-authored-by: Oliver Smith-Denny Co-authored-by: Sean Brogan Co-authored-by: Aaron --- .../Console/ConPlatformDxe/ConPlatform.c | 10 +++---- .../GraphicsConsoleDxe/GraphicsConsole.c | 12 ++++++-- .../Universal/Console/TerminalDxe/Terminal.c | 28 ++++++++++--------- 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.c b/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.c index a7f0225f305b..7d32d9a7345b 100644 --- a/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.c +++ b/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.c @@ -1096,10 +1096,8 @@ ConPlatformMatchDevicePaths ( // // If performing Delete operation, the NewDevicePath must not be NULL. // - if (Delete) { - if (NewDevicePath == NULL) { - return EFI_INVALID_PARAMETER; - } + if (Delete && (NewDevicePath == NULL)) { + return EFI_INVALID_PARAMETER; } TempDevicePath1 = NULL; @@ -1178,6 +1176,8 @@ ConPlatformUpdateDeviceVariable ( EFI_DEVICE_PATH_PROTOCOL *VariableDevicePath; EFI_DEVICE_PATH_PROTOCOL *NewVariableDevicePath; + Status = EFI_SUCCESS; + VariableDevicePath = NULL; NewVariableDevicePath = NULL; @@ -1187,7 +1187,7 @@ ConPlatformUpdateDeviceVariable ( // it is the caller's responsibility to free the memory before return. // VariableDevicePath = ConPlatformGetVariable (VariableName); - + // At this point, VariableDevicePath may be null. This is expected. if (Operation != Delete) { // // Match specified DevicePath in Console Variable. diff --git a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c index facb813276cd..50a88f576386 100644 --- a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c +++ b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c @@ -257,7 +257,10 @@ InitializeGraphicsConsoleTextMode ( // Reserve 2 modes for 80x25, 80x50 of graphics console. // NewModeBuffer = AllocateZeroPool (sizeof (GRAPHICS_CONSOLE_MODE_DATA) * (Count + 2)); - ASSERT (NewModeBuffer != NULL); + if (NewModeBuffer == NULL) { + ASSERT (NewModeBuffer != NULL); + return EFI_OUT_OF_RESOURCES; + } // // Mode 0 and mode 1 is for 80x25, 80x50 according to UEFI spec. @@ -422,7 +425,7 @@ GraphicsConsoleControllerDriverStart ( // MaxMode = Private->GraphicsOutput->Mode->MaxMode; - for (ModeIndex = 0; ModeIndex < MaxMode; ModeIndex++) { + for (ModeIndex = 0; (UINTN)ModeIndex < MaxMode; ModeIndex++) { Status = Private->GraphicsOutput->QueryMode ( Private->GraphicsOutput, ModeIndex, @@ -1802,7 +1805,10 @@ RegisterFontPackage ( PackageLength = sizeof (EFI_HII_SIMPLE_FONT_PACKAGE_HDR) + mNarrowFontSize + 4; Package = AllocateZeroPool (PackageLength); - ASSERT (Package != NULL); + if (Package == NULL) { + ASSERT (Package != NULL); + return; + } WriteUnaligned32 ((UINT32 *)Package, PackageLength); SimplifiedFont = (EFI_HII_SIMPLE_FONT_PACKAGE_HDR *)(Package + 4); diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c index 50f79f55a6b9..2f455719b74e 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c @@ -1265,19 +1265,21 @@ TerminalRemoveConsoleDevVariable ( FreePool (OriginalVariable); if (FoundOne) { - VariableSize = GetDevicePathSize (NewVariable); - - Status = gRT->SetVariable ( - VariableName, - &gEfiGlobalVariableGuid, - EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - VariableSize, - NewVariable - ); - // - // Shrinking variable with existing variable driver implementation shouldn't fail. - // - ASSERT_EFI_ERROR (Status); + if (NewVariable != NULL) { + VariableSize = GetDevicePathSize (NewVariable); + + Status = gRT->SetVariable ( + VariableName, + &gEfiGlobalVariableGuid, + EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + VariableSize, + NewVariable + ); + // + // Shrinking variable with existing variable driver implementation shouldn't fail. + // + ASSERT_EFI_ERROR (Status); + } } if (NewVariable != NULL) { From 562bce0febd641f78df7cd61f2ed5a4c944b31ac Mon Sep 17 00:00:00 2001 From: Ray Ni Date: Tue, 15 Jul 2025 15:41:50 +0800 Subject: [PATCH 0275/1172] IntelFsp2Pkg: Preserve GDTR and CS/DS/ES/FS/GS/SS Bootloader does not expect FSP modifies GDTR and segment selectors, update FSP entry/exit code to preserve these registers. Signed-off-by: Ray Ni Cc: Chasel Chiu Cc: Nate DeSimone Cc: Star Zeng Cc: Ted Kuo Cc: Ashraf Ali S --- .../FspSecCore/X64/Fsp24ApiEntryM.nasm | 20 ++++++++- IntelFsp2Pkg/FspSecCore/X64/FspApiEntryM.nasm | 20 ++++++++- .../Library/BaseFspCommonLib/FspCommonLib.c | 4 +- .../BaseFspSwitchStackLib/X64/Stack.nasm | 41 ++++++++++++++++++- 4 files changed, 81 insertions(+), 4 deletions(-) diff --git a/IntelFsp2Pkg/FspSecCore/X64/Fsp24ApiEntryM.nasm b/IntelFsp2Pkg/FspSecCore/X64/Fsp24ApiEntryM.nasm index 3066156bcf97..3552f54f7393 100644 --- a/IntelFsp2Pkg/FspSecCore/X64/Fsp24ApiEntryM.nasm +++ b/IntelFsp2Pkg/FspSecCore/X64/Fsp24ApiEntryM.nasm @@ -1,7 +1,7 @@ ;; @file ; Provide FSP API entry points. ; -; Copyright (c) 2022, Intel Corporation. All rights reserved.
+; Copyright (c) 2022 - 2025, Intel Corporation. All rights reserved.
; SPDX-License-Identifier: BSD-2-Clause-Patent ;; DEFAULT REL @@ -173,6 +173,24 @@ NotMultiPhaseMemoryInitApi: push rdx SkipPagetableSave: + ; Save Segment registers + mov rdx, ss + push rdx + mov rdx, gs + push rdx + mov rdx, fs + push rdx + mov rdx, es + push rdx + mov rdx, ds + push rdx + mov rdx, cs + push rdx + + ; Reserve 16 bytes for GDT save/restore + sub rsp, 16 + sgdt [rsp] + ; Reserve 16 bytes for IDT save/restore sub rsp, 16 sidt [rsp] diff --git a/IntelFsp2Pkg/FspSecCore/X64/FspApiEntryM.nasm b/IntelFsp2Pkg/FspSecCore/X64/FspApiEntryM.nasm index b0b6b6a4aad4..873adb29bef2 100644 --- a/IntelFsp2Pkg/FspSecCore/X64/FspApiEntryM.nasm +++ b/IntelFsp2Pkg/FspSecCore/X64/FspApiEntryM.nasm @@ -1,7 +1,7 @@ ;; @file ; Provide FSP API entry points. ; -; Copyright (c) 2022, Intel Corporation. All rights reserved.
+; Copyright (c) 2022 - 2025, Intel Corporation. All rights reserved.
; SPDX-License-Identifier: BSD-2-Clause-Patent ;; DEFAULT REL @@ -141,6 +141,24 @@ ASM_PFX(FspApiCommonContinue): push rdx SkipPagetableSave: + ; Save Segment registers + mov rdx, ss + push rdx + mov rdx, gs + push rdx + mov rdx, fs + push rdx + mov rdx, es + push rdx + mov rdx, ds + push rdx + mov rdx, cs + push rdx + + ; Reserve 16 bytes for GDT save/restore + sub rsp, 16 + sgdt [rsp] + ; Reserve 16 bytes for IDT save/restore sub rsp, 16 sidt [rsp] diff --git a/IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c b/IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c index f1b1a5ea5848..9cb3d523030c 100644 --- a/IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c +++ b/IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c @@ -31,7 +31,9 @@ typedef struct { } CONTEXT_STACK; typedef struct { - UINT64 Idtr[2]; // IDTR Limit - bit0:bi15, IDTR Base - bit16:bit79 + UINT64 Idtr[2]; // IDTR Limit - bit0:bit15, IDTR Base - bit16:bit79 + UINT64 Gdtr[2]; // GDTR Limit - bit0:bit15, GDTR Base - bit16:bit79 + UINT64 Segment[6]; // Segment Registers: CS, DS, ES, FS, GS, SS UINT64 Cr0; UINT64 Cr3; UINT64 Cr4; diff --git a/IntelFsp2Pkg/Library/BaseFspSwitchStackLib/X64/Stack.nasm b/IntelFsp2Pkg/Library/BaseFspSwitchStackLib/X64/Stack.nasm index f40df51ab4ad..d77f59bc9aa4 100644 --- a/IntelFsp2Pkg/Library/BaseFspSwitchStackLib/X64/Stack.nasm +++ b/IntelFsp2Pkg/Library/BaseFspSwitchStackLib/X64/Stack.nasm @@ -1,6 +1,6 @@ ;------------------------------------------------------------------------------ ; -; Copyright (c) 2022 - 2023, Intel Corporation. All rights reserved.
+; Copyright (c) 2022 - 2025, Intel Corporation. All rights reserved.
; SPDX-License-Identifier: BSD-2-Clause-Patent ; ; Abstract: @@ -92,6 +92,25 @@ ASM_PFX(FspSwitchStack): push rdx SkipPagetableSave: + ; Save Segment registers + mov rdx, ss + push rdx + mov rdx, gs + push rdx + mov rdx, fs + push rdx + mov rdx, es + push rdx + mov rdx, ds + push rdx + mov rdx, cs + push rdx + + ; Reserve 16 bytes for GDT save/restore + sub rsp, 16 + sgdt [rsp] + + ; Reserve 16 bytes for IDT save/restore sub rsp, 16 sidt [rsp] @@ -106,6 +125,26 @@ SkipPagetableSave: lidt [rsp] add rsp, 16 + ; Restore GDTR + lgdt [rsp] + add rsp, 16 + + ; Restore Segment registers + lea rdx, [.0] + push rdx ; Push return address + retfq ; Far return to restore CS (uses CS from stack + return address) +.0: + pop rdx + mov ds, dx + pop rdx + mov es, dx + pop rdx + mov fs, dx + pop rdx + mov gs, dx + pop rdx + mov ss, dx + lea rax, [ASM_PFX(FeaturePcdGet (PcdFspSaveRestorePageTableEnable))] mov al, byte [rax] cmp al, 0 From 6fb7117e2887ac98634290078fb555d2b3807fd0 Mon Sep 17 00:00:00 2001 From: Jiaxin Wu Date: Fri, 18 Jul 2025 14:22:06 +0800 Subject: [PATCH 0276/1172] UefiCpuPkg/PiSmmCpuDxeSmm: Correct AllApArrivedWithException flag Update AllApArrivedWithException if the 1st timeout sync is skipped but all APs have arrived. Example: If IsCpuSyncAlwaysNeeded() returns false, LMCE is enabled and triggered, and another SMI source combined with LMCE causes all APs to enter SMI. Then 2nd timeout sync will be also skipped, but all APs have arrived, so AllApArrivedWithException should be updated before using. Signed-off-by: Jiaxin Wu --- UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 1 + 1 file changed, 1 insertion(+) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c index 7402a281521f..47ae9fd6449f 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c @@ -318,6 +318,7 @@ SmmWaitForApArrival ( } } + mSmmMpSyncData->AllApArrivedWithException = AllCpusInSmmExceptBlockedDisabled (); if (!mSmmMpSyncData->AllApArrivedWithException) { // // Check for the Blocked & Delayed Case. From 8216419a02173421ce7070268fdd11a7caadfa4b Mon Sep 17 00:00:00 2001 From: Jiaxin Wu Date: Fri, 18 Jul 2025 14:23:30 +0800 Subject: [PATCH 0277/1172] UefiCpuPkg/PiSmmCpuDxeSmm: Refine debug log in SmmWaitForApArrival Refine debug log in SmmWaitForApArrival, and print the disabled count info. Signed-off-by: Jiaxin Wu --- UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c index 47ae9fd6449f..1d53b7889d77 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c @@ -236,12 +236,14 @@ SmmWaitForApArrival ( UINTN Index; UINT32 DelayedCount; UINT32 BlockedCount; + UINT32 DisabledCount; BOOLEAN SyncNeeded; PERF_FUNCTION_BEGIN (); - DelayedCount = 0; - BlockedCount = 0; + DelayedCount = 0; + BlockedCount = 0; + DisabledCount = 0; ASSERT (SmmCpuSyncGetArrivedCpuCount (mSmmMpSyncData->SyncContext) <= mNumberOfCpus); @@ -321,10 +323,10 @@ SmmWaitForApArrival ( mSmmMpSyncData->AllApArrivedWithException = AllCpusInSmmExceptBlockedDisabled (); if (!mSmmMpSyncData->AllApArrivedWithException) { // - // Check for the Blocked & Delayed Case. + // Check for the Disabled & Blocked & Delayed Case. // - GetSmmDelayedBlockedDisabledCount (&DelayedCount, &BlockedCount, NULL); - DEBUG ((DEBUG_INFO, "SmmWaitForApArrival: Delayed AP Count = %d, Blocked AP Count = %d\n", DelayedCount, BlockedCount)); + GetSmmDelayedBlockedDisabledCount (&DelayedCount, &BlockedCount, &DisabledCount); + DEBUG ((DEBUG_ERROR, "SmmWaitForApArrival: Failed to wait all APs enter SMI. Delayed AP Count = %d, Blocked AP Count = %d, Disabled AP Count = %d\n", DelayedCount, BlockedCount, DisabledCount)); } PERF_FUNCTION_END (); From 9c382953257404b229de334f8310bceb55c63f87 Mon Sep 17 00:00:00 2001 From: Dionna Glaze Date: Thu, 8 May 2025 15:57:06 +0000 Subject: [PATCH 0278/1172] OvmfPkg: Clarify Is800155Event The Event3 memory comparison is technically correct since the definitions of the struct types are the same. The extended bodies of the events are different. The Event2 size guard for the Event3 comparison should be split to use the Event3 in its sizeof for better clarity. The large single condition makes the function difficult to understand, so the combined logic is split into different conditional statements. Signed-off-by: Dionna Glaze --- OvmfPkg/Tcg/TdTcg2Dxe/TdTcg2Dxe.c | 33 ++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/OvmfPkg/Tcg/TdTcg2Dxe/TdTcg2Dxe.c b/OvmfPkg/Tcg/TdTcg2Dxe/TdTcg2Dxe.c index 5287cda4d007..8547c76d4cab 100644 --- a/OvmfPkg/Tcg/TdTcg2Dxe/TdTcg2Dxe.c +++ b/OvmfPkg/Tcg/TdTcg2Dxe/TdTcg2Dxe.c @@ -806,6 +806,7 @@ TdGetEventLog ( @retval FALSE This is NOT a Tcg800155PlatformIdEvent. **/ +STATIC BOOLEAN Is800155Event ( IN VOID *NewEventHdr, @@ -814,18 +815,26 @@ Is800155Event ( IN UINT32 NewEventSize ) { - if ((((TCG_PCR_EVENT2_HDR *)NewEventHdr)->EventType == EV_NO_ACTION) && - (NewEventSize >= sizeof (TCG_Sp800_155_PlatformId_Event2)) && - ((CompareMem ( - NewEventData, - TCG_Sp800_155_PlatformId_Event2_SIGNATURE, - sizeof (TCG_Sp800_155_PlatformId_Event2_SIGNATURE) - 1 - ) == 0) || - (CompareMem ( - NewEventData, - TCG_Sp800_155_PlatformId_Event3_SIGNATURE, - sizeof (TCG_Sp800_155_PlatformId_Event3_SIGNATURE) - 1 - ) == 0))) + if (((TCG_PCR_EVENT2_HDR *)NewEventHdr)->EventType != EV_NO_ACTION) { + return FALSE; + } + + if ((NewEventSize >= sizeof (TCG_Sp800_155_PlatformId_Event2)) && + (CompareMem ( + NewEventData, + TCG_Sp800_155_PlatformId_Event2_SIGNATURE, + sizeof (TCG_Sp800_155_PlatformId_Event2_SIGNATURE) - 1 + ) == 0)) + { + return TRUE; + } + + if ((NewEventSize >= sizeof (TCG_Sp800_155_PlatformId_Event3)) && + (CompareMem ( + NewEventData, + TCG_Sp800_155_PlatformId_Event3_SIGNATURE, + sizeof (TCG_Sp800_155_PlatformId_Event3_SIGNATURE) - 1 + ) == 0)) { return TRUE; } From 0bb4cf0228fce0b6aaedc0bfc1d79147aebf16f3 Mon Sep 17 00:00:00 2001 From: Dionna Glaze Date: Mon, 12 May 2025 14:39:03 +0000 Subject: [PATCH 0279/1172] SecurityPkg: Clarify Is800155Event The Event3 memory comparison is technically correct since the definitions of the struct types are the same. The extended bodies of the events are different. The Event2 size guard for the Event3 comparison should be split to use the Event3 in its sizeof for better clarity. The large single condition makes the function difficult to understand, so the combined logic is split into different conditional statements. Signed-off-by: Dionna Glaze [ardb: whitespace fixes] Signed-off-by: Ard Biesheuvel --- SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c | 33 ++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c index 24a27cd6f3ff..85a852842d50 100644 --- a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c +++ b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c @@ -798,6 +798,7 @@ Tcg2GetEventLog ( @retval FALSE This is NOT a Tcg800155PlatformIdEvent. **/ +STATIC BOOLEAN Is800155Event ( IN VOID *NewEventHdr, @@ -806,18 +807,26 @@ Is800155Event ( IN UINT32 NewEventSize ) { - if ((((TCG_PCR_EVENT2_HDR *)NewEventHdr)->EventType == EV_NO_ACTION) && - (NewEventSize >= sizeof (TCG_Sp800_155_PlatformId_Event2)) && - ((CompareMem ( - NewEventData, - TCG_Sp800_155_PlatformId_Event2_SIGNATURE, - sizeof (TCG_Sp800_155_PlatformId_Event2_SIGNATURE) - 1 - ) == 0) || - (CompareMem ( - NewEventData, - TCG_Sp800_155_PlatformId_Event3_SIGNATURE, - sizeof (TCG_Sp800_155_PlatformId_Event3_SIGNATURE) - 1 - ) == 0))) + if (((TCG_PCR_EVENT2_HDR *)NewEventHdr)->EventType != EV_NO_ACTION) { + return FALSE; + } + + if ((NewEventSize >= sizeof (TCG_Sp800_155_PlatformId_Event2)) && + (CompareMem ( + NewEventData, + TCG_Sp800_155_PlatformId_Event2_SIGNATURE, + sizeof (TCG_Sp800_155_PlatformId_Event2_SIGNATURE) - 1 + ) == 0)) + { + return TRUE; + } + + if ((NewEventSize >= sizeof (TCG_Sp800_155_PlatformId_Event3)) && + (CompareMem ( + NewEventData, + TCG_Sp800_155_PlatformId_Event3_SIGNATURE, + sizeof (TCG_Sp800_155_PlatformId_Event3_SIGNATURE) - 1 + ) == 0)) { return TRUE; } From 046ba401c29618e2065aad10db20f62a974f1439 Mon Sep 17 00:00:00 2001 From: Tom Lendacky Date: Tue, 15 Jul 2025 10:07:24 -0500 Subject: [PATCH 0280/1172] UefiCpuPkg/MpInitLib: Fix random SEV-ES guest boot crash The SevSnpKnownInitApicId field within the MP_CPU_EXCHANGE_INFO structure is not guaranteed to be zero when booting an SEV-ES guest. While the check in SevSnpGetInitCpuNumber() is conditionally guarded by verifying if the guest is an SEV-SNP guest, the check in SevEsGetApicId() is not similarly guarded. This lack of protection can cause SevEsGetApicId() to return to the wrong location. If the value of the SevSnpKnownInitApicId field contains the exact random value of 1, the guest will be treated as an SEV-SNP guest rather than an SEV-ES guest and return to the wrong location in the code which will lead to a crash. Ensure that all SEV related fields in MP_CPU_EXCHANGE_INFO structure are properly initialized, thus removing the need for guarding access to the SevSnpKnownInitApicId field. Fixes: dca5d26bc57e ("UefiCpuPkg/MpInitLib: Fix SNP AP creation when using known APIC IDs") Signed-off-by: Tom Lendacky --- UefiCpuPkg/Library/MpInitLib/AmdSev.c | 2 -- UefiCpuPkg/Library/MpInitLib/MpLib.c | 8 +++++--- UefiCpuPkg/Library/MpInitLib/X64/AmdSev.nasm | 7 ------- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/AmdSev.c b/UefiCpuPkg/Library/MpInitLib/AmdSev.c index 5108873c3b3e..75429e3daec9 100644 --- a/UefiCpuPkg/Library/MpInitLib/AmdSev.c +++ b/UefiCpuPkg/Library/MpInitLib/AmdSev.c @@ -293,8 +293,6 @@ FillExchangeInfoDataSevEs ( ); ExchangeInfo->ExtTopoAvail = !!ExtTopoEbx.Bits.LogicalProcessors; } - - ExchangeInfo->SevSnpKnownInitApicId = FALSE; } /** diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c index 96c0980a2eba..3afd012fc2e8 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -1018,9 +1018,11 @@ FillExchangeInfoData ( ExchangeInfo->Enable5LevelPaging = (BOOLEAN)(Cr4.Bits.LA57 == 1); DEBUG ((DEBUG_INFO, "%a: 5-Level Paging = %d\n", gEfiCallerBaseName, ExchangeInfo->Enable5LevelPaging)); - ExchangeInfo->SevEsIsEnabled = CpuMpData->SevEsIsEnabled; - ExchangeInfo->SevSnpIsEnabled = CpuMpData->SevSnpIsEnabled; - ExchangeInfo->GhcbBase = (UINTN)CpuMpData->GhcbBase; + ExchangeInfo->SevEsIsEnabled = CpuMpData->SevEsIsEnabled; + ExchangeInfo->SevSnpIsEnabled = CpuMpData->SevSnpIsEnabled; + ExchangeInfo->GhcbBase = (UINTN)CpuMpData->GhcbBase; + ExchangeInfo->ExtTopoAvail = FALSE; + ExchangeInfo->SevSnpKnownInitApicId = FALSE; // // Populate SEV-ES specific exchange data. diff --git a/UefiCpuPkg/Library/MpInitLib/X64/AmdSev.nasm b/UefiCpuPkg/Library/MpInitLib/X64/AmdSev.nasm index 66d63a2b90e9..64358e54ef86 100644 --- a/UefiCpuPkg/Library/MpInitLib/X64/AmdSev.nasm +++ b/UefiCpuPkg/Library/MpInitLib/X64/AmdSev.nasm @@ -23,13 +23,6 @@ ; relationship getting out of sync after the first AP boot. ; SevSnpGetInitCpuNumber: - ; - ; If not an SNP guest, leave EBX (CpuNumber) as is - ; - lea edi, [esi + MP_CPU_EXCHANGE_INFO_FIELD (SevSnpIsEnabled)] - cmp byte [edi], 1 ; SevSnpIsEnabled - jne SevSnpGetCpuNumberDone - ; ; If not starting the AP with a specific ApicId, leave EBX (CpuNumber) as is ; From 6f939cee32ab1fb78f7ff7e5179c02ab88ed9c49 Mon Sep 17 00:00:00 2001 From: Tom Lendacky Date: Tue, 15 Jul 2025 10:07:24 -0500 Subject: [PATCH 0281/1172] UefiCpuPkg/MpInitLib: Rename FillExchangeInfoDataSevEs() The FillExchangeInfoDataSevEs() is only called for SEV-SNP guests, but the name (and comment in MpLib.c) implies that it is also called for SEV-ES guests. Rename the function to FillExchangeInfoDataSevSnp() to avoid confusion. Signed-off-by: Tom Lendacky --- UefiCpuPkg/Library/MpInitLib/AmdSev.c | 2 +- UefiCpuPkg/Library/MpInitLib/MpLib.c | 4 ++-- UefiCpuPkg/Library/MpInitLib/MpLib.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/AmdSev.c b/UefiCpuPkg/Library/MpInitLib/AmdSev.c index 75429e3daec9..8ffb1b5461ac 100644 --- a/UefiCpuPkg/Library/MpInitLib/AmdSev.c +++ b/UefiCpuPkg/Library/MpInitLib/AmdSev.c @@ -273,7 +273,7 @@ SevEsPlaceApHlt ( @param[in] ExchangeInfo The pointer to CPU Exchange Data structure **/ VOID -FillExchangeInfoDataSevEs ( +FillExchangeInfoDataSevSnp ( IN volatile MP_CPU_EXCHANGE_INFO *ExchangeInfo ) { diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c index 3afd012fc2e8..63b846445de2 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -1025,10 +1025,10 @@ FillExchangeInfoData ( ExchangeInfo->SevSnpKnownInitApicId = FALSE; // - // Populate SEV-ES specific exchange data. + // Populate SEV-SNP specific exchange data. // if (ExchangeInfo->SevSnpIsEnabled) { - FillExchangeInfoDataSevEs (ExchangeInfo); + FillExchangeInfoDataSevSnp (ExchangeInfo); } // diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h index 60cae3b1826b..5d10516cd81a 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h @@ -901,7 +901,7 @@ ConfidentialComputingGuestHas ( @param[in] ExchangeInfo The pointer to CPU Exchange Data structure **/ VOID -FillExchangeInfoDataSevEs ( +FillExchangeInfoDataSevSnp ( IN volatile MP_CPU_EXCHANGE_INFO *ExchangeInfo ); From 6b8522d007a6d2d1d8847cb6618e9a6bfd2092ec Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Fri, 20 Jun 2025 11:18:56 +0530 Subject: [PATCH 0282/1172] MdePkg: Acpi66: Add RISC-V MADT and RHCT structures ACPI 6.6 introduced new MADT structures for RISC-V and a new static table RHCT. Add the definitions for these new structures. Signed-off-by: Sunil V L --- MdePkg/Include/IndustryStandard/Acpi66.h | 165 +++++++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git a/MdePkg/Include/IndustryStandard/Acpi66.h b/MdePkg/Include/IndustryStandard/Acpi66.h index b95166841fe5..633d8bb7efee 100644 --- a/MdePkg/Include/IndustryStandard/Acpi66.h +++ b/MdePkg/Include/IndustryStandard/Acpi66.h @@ -361,6 +361,10 @@ typedef struct { #define EFI_ACPI_6_6_MSI_PIC 0x15 #define EFI_ACPI_6_6_BIO_PIC 0x16 #define EFI_ACPI_6_6_LPC_PIC 0x17 +#define EFI_ACPI_6_6_RINTC 0x18 +#define EFI_ACPI_6_6_IMSIC 0x19 +#define EFI_ACPI_6_6_APLIC 0x1A +#define EFI_ACPI_6_6_PLIC 0x1B // // APIC Structure Definitions @@ -745,6 +749,83 @@ typedef struct { UINT8 Cascade; } EFI_ACPI_6_6_LPC_PIC_STRUCTURE; +/// +/// RISC-V INTC (RINTC) +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Version; + UINT8 Reserved; + UINT32 Flags; + UINT64 HartId; + UINT32 Uid; + UINT32 ExtIntcId; + UINT64 ImsicAddr; + UINT32 ImsicSize; +} EFI_ACPI_6_6_RINTC_STRUCTURE; + +#define EFI_ACPI_6_6_RINTC_STRUCTURE_VERSION 1 + +#define EFI_ACPI_6_6_RINTC_FLAG_ENABLE 1 + +/// +/// RISC-V Incoming MSI Controller (IMSIC) +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Version; + UINT8 Reserved; + UINT32 Flags; + UINT16 NumIds; + UINT16 NumGuestIds; + UINT8 GuestIndexBits; + UINT8 HartIndexBits; + UINT8 GroupIndexBits; + UINT8 GroupIndexShift; +} EFI_ACPI_6_6_IMSIC_STRUCTURE; + +#define EFI_ACPI_6_6_IMSIC_STRUCTURE_VERSION 1 + +/// +/// RISC-V APLIC +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Version; + UINT8 Id; + UINT32 Flags; + UINT8 HwId[8]; + UINT16 NumIdcs; + UINT16 NumSources; + UINT32 GsiBase; + UINT64 BaseAddr; + UINT32 Size; +} EFI_ACPI_6_6_APLIC_STRUCTURE; + +#define EFI_ACPI_6_6_APLIC_STRUCTURE_VERSION 1 + +/// +/// RISC-V PLIC +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT8 Version; + UINT8 Id; + UINT8 HwId[8]; + UINT16 NumIrqs; + UINT16 MaxPrio; + UINT32 Flags; + UINT32 Size; + UINT64 BaseAddr; + UINT32 GsiBase; +} EFI_ACPI_6_6_PLIC_STRUCTURE; + +#define EFI_ACPI_6_6_PLIC_STRUCTURE_VERSION 1 + /// /// Smart Battery Description Table (SBST) /// @@ -3024,6 +3105,86 @@ typedef struct { #define EFI_ACPI_6_6_PHAT_RESET_REASON_REASON_POWER_LOSS 0x24 #define EFI_ACPI_6_6_PHAT_RESET_REASON_REASON_POWER_BUTTON 0x25 +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT32 Flags; + UINT64 TimeBaseFreq; + UINT32 NodeCount; + UINT32 NodeOffset; +} EFI_ACPI_6_6_RISCV_HART_CAPABILITIES_TABLE; + +#define EFI_ACPI_6_6_RHCT_TABLE_REVISION 1 +// +// RHCT Flags +// +#define EFI_ACPI_6_6_RHCT_FLAG_TIMER_CANNOT_WAKEUP_CPU 1 + +// +// RHCT subtables +// +typedef struct { + UINT16 Type; + UINT16 Length; + UINT16 Revision; +} EFI_ACPI_6_6_RHCT_NODE_HEADER; + +/* Values for RHCT subtable Type above */ +#define EFI_ACPI_6_6_RHCT_NODE_TYPE_ISA_STRING 0x0000 +#define EFI_ACPI_6_6_RHCT_NODE_TYPE_CMO 0x0001 +#define EFI_ACPI_6_6_RHCT_NODE_TYPE_MMU 0x0002 +#define EFI_ACPI_6_6_RHCT_NODE_TYPE_HART_INFO 0xFFFF + +// +// ISA string node structure +// +typedef struct { + EFI_ACPI_6_6_RHCT_NODE_HEADER Node; + UINT16 IsaLength; + char Isa[]; +} EFI_ACPI_6_6_RHCT_ISA_STRING_NODE; + +#define EFI_ACPI_6_6_RHCT_ISA_NODE_STRUCTURE_VERSION 1 + +// +// CMO node structure +// +typedef struct { + EFI_ACPI_6_6_RHCT_NODE_HEADER Node; + UINT8 Reserved; + UINT8 CbomBlockSize; + UINT8 CbopBlockSize; + UINT8 CbozBlockSize; +} EFI_ACPI_6_6_RHCT_CMO_NODE; + +#define EFI_ACPI_6_6_RHCT_CMO_NODE_STRUCTURE_VERSION 1 + +// +// MMU node structure +// +typedef struct { + EFI_ACPI_6_6_RHCT_NODE_HEADER Node; + UINT8 Reserved; + UINT8 MmuType; +} EFI_ACPI_6_6_RHCT_MMU_NODE; + +#define EFI_ACPI_6_6_RHCT_MMU_NODE_STRUCTURE_VERSION 1 + +#define EFI_ACPI_6_6_RHCT_MMU_TYPE_SV39 0 +#define EFI_ACPI_6_6_RHCT_MMU_TYPE_SV48 1 +#define EFI_ACPI_6_6_RHCT_MMU_TYPE_SV57 2 + +// +// Hart Info node structure +// +typedef struct { + EFI_ACPI_6_6_RHCT_NODE_HEADER Node; + UINT16 NumOffsets; + UINT32 Uid; + UINT32 Offsets[]; +} EFI_ACPI_6_6_RHCT_HART_INFO_NODE; + +#define EFI_ACPI_6_6_RHCT_HART_INFO_NODE_STRUCTURE_VERSION 1 + // // Known table signatures // @@ -3283,6 +3444,10 @@ typedef struct { /// #define EFI_ACPI_6_6_PLATFORM_HEALTH_ASSESSMENT_TABLE_SIGNATURE SIGNATURE_32('P', 'H', 'A', 'T') +/// +/// "RHCT" RISC-V Hart Capabilities Table (RHCT) +/// +#define EFI_ACPI_6_6_RISCV_HART_CAPABILITIES_TABLE_SIGNATURE SIGNATURE_32('R', 'H', 'C', 'T') /// /// "SDEI" Software Delegated Exceptions Interface Table /// From b0fb8da1fa5a2e57b94eb8c6e7e39f47b76b1510 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Fri, 20 Jun 2025 16:15:02 +0530 Subject: [PATCH 0283/1172] MdePkg: Acpi66: Add newly defined RISC-V affinity structure ACPI 6.6 defines new affinity structure for RISC-V Intc. Add their definitions. Signed-off-by: Sunil V L --- MdePkg/Include/IndustryStandard/Acpi66.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/MdePkg/Include/IndustryStandard/Acpi66.h b/MdePkg/Include/IndustryStandard/Acpi66.h index 633d8bb7efee..cbe4ffa483f6 100644 --- a/MdePkg/Include/IndustryStandard/Acpi66.h +++ b/MdePkg/Include/IndustryStandard/Acpi66.h @@ -885,6 +885,8 @@ typedef struct { #define EFI_ACPI_6_6_GICC_AFFINITY 0x03 #define EFI_ACPI_6_6_GIC_ITS_AFFINITY 0x04 #define EFI_ACPI_6_6_GENERIC_INITIATOR_AFFINITY 0x05 +#define EFI_ACPI_6_6_GENERIC_PORT_AFFINITY 0x06 +#define EFI_ACPI_6_6_RINTC_AFFINITY 0x07 /// /// Processor Local APIC/SAPIC Affinity Structure Definition @@ -971,6 +973,19 @@ typedef struct { UINT32 ItsId; } EFI_ACPI_6_6_GIC_ITS_AFFINITY_STRUCTURE; +/// +/// RINTC Affinity Structure Definition +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT16 Reserved; + UINT32 ProximityDomain; + UINT32 AcpiProcessorUid; + UINT32 Flags; + UINT32 ClockDomain; +} EFI_ACPI_6_6_RINTC_AFFINITY_STRUCTURE; + // // Generic Initiator Affinity Structure Device Handle Types // All other values between 0x02 an 0xFF are reserved and From 988162092bc033108b102ff5c41dbead81624848 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Wed, 16 Jul 2025 16:40:05 +0530 Subject: [PATCH 0284/1172] MdePkg: Acpi66: Update FADT and MADT versions According to the recently released ACPI 6.6 specification, the minor version of the Fixed ACPI Description Table (FADT) should be updated to revision 6, and the Multiple APIC Description Table (MADT) should use revision 7. Update the macros to reflect this. Signed-off-by: Sunil V L --- MdePkg/Include/IndustryStandard/Acpi66.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MdePkg/Include/IndustryStandard/Acpi66.h b/MdePkg/Include/IndustryStandard/Acpi66.h index cbe4ffa483f6..b7bc8ea63952 100644 --- a/MdePkg/Include/IndustryStandard/Acpi66.h +++ b/MdePkg/Include/IndustryStandard/Acpi66.h @@ -206,7 +206,7 @@ typedef struct { /// FADT Version (as defined in ACPI 6.6 spec.) /// #define EFI_ACPI_6_6_FIXED_ACPI_DESCRIPTION_TABLE_REVISION 0x06 -#define EFI_ACPI_6_6_FIXED_ACPI_DESCRIPTION_TABLE_MINOR_REVISION 0x05 +#define EFI_ACPI_6_6_FIXED_ACPI_DESCRIPTION_TABLE_MINOR_REVISION 0x06 // // Fixed ACPI Description Table Preferred Power Management Profile @@ -324,7 +324,7 @@ typedef struct { /// /// MADT Revision (as defined in ACPI 6.6 spec.) /// -#define EFI_ACPI_6_6_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION 0x06 +#define EFI_ACPI_6_6_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION 0x07 /// /// Multiple APIC Flags From 10f0364b61bc230c5584ad9419a12c9b055d128d Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Tue, 24 Jun 2025 07:11:18 +0000 Subject: [PATCH 0285/1172] MdePkg/Acpi50: Add revision macro for Serial Bus UART structure The Serial Bus UART structure was introduced in ACPI 5.0. This patch defines a revision macro for this structure and also adds type specific flag macros. Signed-off-by: Abdul Lateef Attar --- MdePkg/Include/IndustryStandard/Acpi50.h | 34 ++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/MdePkg/Include/IndustryStandard/Acpi50.h b/MdePkg/Include/IndustryStandard/Acpi50.h index c98c35fd222e..dd96ab592247 100644 --- a/MdePkg/Include/IndustryStandard/Acpi50.h +++ b/MdePkg/Include/IndustryStandard/Acpi50.h @@ -132,6 +132,40 @@ typedef PACKED struct { UINT16 DeviceSelection; } EFI_ACPI_SERIAL_BUS_RESOURCE_SPI_DESCRIPTOR; +/// Revision ID of serial bus uart descriptor +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_REVISION_ID 0x1 + +/// Type specific flags +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_LITTLE_ENDIAN 0x0 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_BIG_ENDIAN 0x1 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_5_BITS_PER_BYTE 0x0 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_6_BITS_PER_BYTE 0x1 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_7_BITS_PER_BYTE 0x2 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_8_BITS_PER_BYTE 0x3 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_9_BITS_PER_BYTE 0x4 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_STOP_BIT_NONE 0x0 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_STOP_BIT_1 0x1 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_STOP_BIT_1_5 0x2 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_STOP_BIT_2 0x3 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_FC_NONE 0x0 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_FC_HW 0x1 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_FC_XON_XOFF 0x2 + +/// Parity definitions +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_PARITY_NONE 0x0 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_PARITY_EVEN 0x1 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_PARITY_ODD 0x2 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_PARITY_MARK 0x3 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_PARITY_SPACE 0x4 + +/// Serial lines in use bits +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_RTS BIT7 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_CTS BIT6 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_DTR BIT5 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_DSR BIT4 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_RI BIT3 +#define EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_DTD BIT2 + /// /// Serial Bus Resource Descriptor (UART) /// From d1f84858228caeeff926b70e43d389eff34363c2 Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Tue, 24 Jun 2025 07:28:46 +0000 Subject: [PATCH 0286/1172] DynamicTablesPkg: Adds AML code generation for IRQ Adds AML code generation for IRQ resource descriptor. This commit introduces helper functions to generate AML resource data for IRQ resource descriptors. Signed-off-by: Abdul Lateef Attar --- .../Include/Library/AmlLib/AmlLib.h | 42 +++++++ .../AmlLib/CodeGen/AmlResourceDataCodeGen.c | 110 +++++++++++++++++- 2 files changed, 151 insertions(+), 1 deletion(-) diff --git a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h index 9e294ac18816..4ce12419e694 100644 --- a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h +++ b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h @@ -2107,4 +2107,46 @@ AmlCreatePssNode ( OUT AML_OBJECT_NODE_HANDLE *NewPssNode OPTIONAL ); +/** Code generation for the IRQ Descriptor. + + The Resource Data effectively created is an IRQ Resource + Data. Cf ACPI 6.5 specification: + - s6.4.2.1 "IRQ Descriptor" + - s19.6.66 "IRQ (Interrupt Resource Descriptor Macro)" + + + The created resource data node can be: + - appended to the list of resource data elements of the NameOpNode. + In such case NameOpNode must be defined by a the "Name ()" ASL statement + and initially contain a "ResourceTemplate ()". + - returned through the NewRdNode parameter. + + @param [in] IsEdgeTriggered The interrupt is edge triggered or + level triggered. + @param [in] IsActiveLow The interrupt is active-high or active-low. + @param [in] IsShared The interrupt can be shared with other + devices or not (Exclusive). + @param [in] IrqList List of IRQ numbers. Must be non-NULL. + @param [in] IrqCount Number of IRQs in IrqList. Must be > 0 and <= 16. + @param [in] NameOpNode NameOp object node defining a named object. + If provided, append the new resource data node + to the list of resource data elements of this node. + @param [out] NewRdNode If provided and success, contain the created node. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval various Other errors as indicated. +**/ +EFI_STATUS +EFIAPI +AmlCodeGenRdIrq ( + IN BOOLEAN IsEdgeTriggered, + IN BOOLEAN IsActiveLow, + IN BOOLEAN IsShared, + IN UINT8 *IrqList, + IN UINT8 IrqCount, + IN AML_OBJECT_NODE_HANDLE NameOpNode OPTIONAL, + OUT AML_DATA_NODE_HANDLE *NewRdNode OPTIONAL + ); + #endif // AML_LIB_H_ diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c index bf0d7b0ccaa3..2d776ffbd495 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c @@ -2,7 +2,7 @@ AML Resource Data Code Generation. Copyright (c) 2020 - 2021, Arm Limited. All rights reserved.
- Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.
+ Copyright (C) 2023 - 2025 Advanced Micro Devices, Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -1670,3 +1670,111 @@ AmlCodeGenEndTag ( return Status; } + +/** Code generation for the IRQ Descriptor. + + The Resource Data effectively created is an IRQ Resource + Data. Cf ACPI 6.5 specification: + - s6.4.2.1 "IRQ Descriptor" + - s19.6.66 "IRQ (Interrupt Resource Descriptor Macro)" + + + The created resource data node can be: + - appended to the list of resource data elements of the NameOpNode. + In such case NameOpNode must be defined by a the "Name ()" ASL statement + and initially contain a "ResourceTemplate ()". + - returned through the NewRdNode parameter. + + @param [in] IsEdgeTriggered The interrupt is edge triggered or + level triggered. + @param [in] IsActiveLow The interrupt is active-high or active-low. + @param [in] IsShared The interrupt can be shared with other + devices or not (Exclusive). + @param [in] IrqList List of IRQ numbers. Must be non-NULL. + @param [in] IrqCount Number of IRQs in IrqList. Must be > 0 and <= 16. + @param [in] NameOpNode NameOp object node defining a named object. + If provided, append the new resource data node + to the list of resource data elements of this node. + @param [out] NewRdNode If provided and success, contain the created node. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval various Other errors as indicated. +**/ +EFI_STATUS +EFIAPI +AmlCodeGenRdIrq ( + IN BOOLEAN IsEdgeTriggered, + IN BOOLEAN IsActiveLow, + IN BOOLEAN IsShared, + IN UINT8 *IrqList, + IN UINT8 IrqCount, + IN AML_OBJECT_NODE_HANDLE NameOpNode OPTIONAL, + OUT AML_DATA_NODE_HANDLE *NewRdNode OPTIONAL + ) +{ + AML_DATA_NODE *RdNode; + EFI_ACPI_IRQ_DESCRIPTOR IrqDesc; + EFI_STATUS Status; + UINT8 Index; + UINT16 Mask; + + if ((NameOpNode == NULL) && (NewRdNode == NULL)) { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + if ((IsEdgeTriggered && !IsActiveLow) || + (!IsEdgeTriggered && IsActiveLow)) + { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + if ((IrqList == NULL) || (IrqCount == 0) || (IrqCount > 16)) { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + Mask = 0; + for (Index = 0; Index < IrqCount; Index++) { + if (IrqList[Index] > 16) { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + if ((Mask & (1 << IrqList[Index])) != 0) { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + Mask |= (1 << IrqList[Index]); + } + + if (Mask == 0) { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + IrqDesc.Header.Bits.Type = ACPI_SMALL_ITEM_FLAG; + IrqDesc.Header.Bits.Name = ACPI_SMALL_IRQ_DESCRIPTOR_NAME; + IrqDesc.Header.Bits.Length = sizeof (EFI_ACPI_IRQ_DESCRIPTOR) - + sizeof (ACPI_SMALL_RESOURCE_HEADER); + IrqDesc.Mask = Mask; + IrqDesc.Information = (IsEdgeTriggered ? BIT0 : 0) | + (IsActiveLow ? BIT3 : 0) | + (IsShared ? BIT4 : 0); + + Status = AmlCreateDataNode ( + EAmlNodeDataTypeResourceData, + (UINT8 *)&IrqDesc, + sizeof (EFI_ACPI_IRQ_DESCRIPTOR), + &RdNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + return LinkRdNode (RdNode, NameOpNode, NewRdNode); +} From 7d8760875a7f16312f88cf80821b25387c764a4e Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Tue, 24 Jun 2025 10:42:13 +0000 Subject: [PATCH 0287/1172] DynamicTablesPkg: Adds AML code generation for serial UART RD Adds AML code generation for Serial UART resource descriptor. This commit introduces helper functions to generate AML resource data for serial UART resource descriptor. Signed-off-by: Abdul Lateef Attar --- .../Include/Library/AmlLib/AmlLib.h | 75 ++++ .../AmlLib/CodeGen/AmlResourceDataCodeGen.c | 350 ++++++++++++++++++ 2 files changed, 425 insertions(+) diff --git a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h index 4ce12419e694..a96614898b58 100644 --- a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h +++ b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h @@ -2149,4 +2149,79 @@ AmlCodeGenRdIrq ( OUT AML_DATA_NODE_HANDLE *NewRdNode OPTIONAL ); +/** Code generation for the UARTSerialBusV2() ASL macro. + + The Resource Data effectively created is a UART Serial Bus Connection + Resource Descriptor Resource Data. + Cf ACPI 6.5: + - s19.6.143 UARTSerialBusV2 + (UART Serial Bus Connection Resource Descriptor Version 2 Macro) + - s6.4.3.8.2.3 UART Serial Bus Connection Resource Descriptor + + The created resource data node can be: + - appended to the list of resource data elements of the NameOpNode. + In such case NameOpNode must be defined by a the "Name ()" ASL statement + and initially contain a "ResourceTemplate ()". + - returned through the NewRdNode parameter. + + @param [in] InitialBaudRate Initial baud rate. + @param [in] BitsPerByte Number of bits per byte. + Optional, default is 8. + @param [in] StopBits Number of stop bits. + Optional, default is 1. + @param [in] LinesInUse Number of lines in use. + @param [in] IsBigEndian Indicates whether the bit transfer is big-endian. + Optional, default is FALSE (little-endian). + @param [in] Parity Parity format used. + Optional, default is no parity. + @param [in] FlowControl Flow control protocol used. + Optional, default is no flow control. + @param [in] ReceiveBufferSize Size of the receive buffer. + @param [in] TransmitBufferSize Size of the transmit buffer. + @param [in] ResourceSource Name of source resource used. + @param [in] ResourceSourceLength Length of the Resource Source. + @param [in] ResourceSourceIndex Resource Source index. + Optional, default is 0. + @param [in] ResourceUsage Resource usage, TRUE for consumer, + FALSE for producer. + Optional, default is TRUE (consumer). + @param [in] IsShared Indicates whether the resource is shared. + Optional, default is FALSE (exclusive). + @param [in] VendorDefinedData Vendor defined data. + Optional, can be NULL. + @param [in] VendorDefinedDataLength Length of the vendor defined data. + @param [in] NameOpNode NameOp object node defining a named object. + If provided, append the new resource data + node to the list of resource data elements + of this node. + @param [out] NewRdNode If provided and success, + contain the created node. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval various Various failure values of called functions. +**/ +EFI_STATUS +EFIAPI +AmlCodeGenRdUartSerialBusV2 ( + IN UINT32 InitialBaudRate, + IN UINT8 *BitsPerByte OPTIONAL, + IN UINT8 *StopBits OPTIONAL, + IN UINT8 LinesInUse, + IN BOOLEAN *IsBigEndian OPTIONAL, + IN UINT8 *Parity OPTIONAL, + IN UINT8 *FlowControl OPTIONAL, + IN UINT16 ReceiveBufferSize, + IN UINT16 TransmitBufferSize, + IN CHAR8 *ResourceSource, + IN UINT16 ResourceSourceLength, + IN UINT8 *ResourceSourceIndex OPTIONAL, + IN BOOLEAN *ResourceUsage OPTIONAL, + IN BOOLEAN *IsShared OPTIONAL, + IN UINT8 *VendorDefinedData OPTIONAL, + IN UINT16 VendorDefinedDataLength, + IN AML_OBJECT_NODE_HANDLE NameOpNode OPTIONAL, + OUT AML_DATA_NODE_HANDLE *NewRdNode OPTIONAL + ); + #endif // AML_LIB_H_ diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c index 2d776ffbd495..8be5eabf3a92 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c @@ -1778,3 +1778,353 @@ AmlCodeGenRdIrq ( return LinkRdNode (RdNode, NameOpNode, NewRdNode); } + +/** Code generation for the UART Serial Bus Connection Resource Descriptor. + + The Resource Data effectively created is a UART Serial Bus Connection + Resource Descriptor Resource Data. + Cf ACPI 6.5: + - s19.6.143 UARTSerialBusV2 + (UART Serial Bus Connection Resource Descriptor Version 2 Macro) + - s6.4.3.8.2.3 UART Serial Bus Connection Resource Descriptor + + The created resource data node can be: + - appended to the list of resource data elements of the NameOpNode. + In such case NameOpNode must be defined by a the "Name ()" ASL statement + and initially contain a "ResourceTemplate ()". + - returned through the NewRdNode parameter. + + @param [in] IsResourceConsumer ResourceUsage parameter. + @param [in] IsSlaveMode Indicates whether the uart operates in slave mode. + @param [in] IsBigEndian Indicates whether the bit transfer is big-endian. + @param [in] BitsPerByte Indicates the number of bits per byte. + @param [in] StopBits Specifies the stop bits format used. + @param [in] FlowControl Specifies the flow control protocol used. + @param [in] BaudRate Specifies the baud rate. + @param [in] RxFifo Number of bytes in the receiver FIFO. + @param [in] TxFifo Number of bytes in the transmitter FIFO. + @param [in] Parity Specifies the parity format used. + @param [in] SerialLinesEnabled Specifies which serial lines are enabled. + @param [in] VendorDefinedData VendorDefinedData parameter. + @param [in] VendorDefinedDataLength VendorDefinedDataLength parameter. + @param [in] ResourceSource Name of source resource used. + @param [in] ResourceSourceLength Resource Source Length. + @param [in] NameOpNode NameOpNode object node defining a named object. + If provided, append the new resource data + node to the list of resource data elements + of this node. + @param [out] NewRdNode If provided and success, + contain the created node. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_OUT_OF_RESOURCES Could not allocate memory. + @retval various Other errors as indicated. + +**/ +STATIC +EFI_STATUS +EFIAPI +AmlCodeGenRdUartSerialBus ( + IN BOOLEAN IsResourceConsumer, + IN BOOLEAN IsSlaveMode, + IN BOOLEAN IsBigEndian, + IN UINT8 BitsPerByte, + IN UINT8 StopBits, + IN UINT8 FlowControl, + IN UINT32 BaudRate, + IN UINT16 RxFifo, + IN UINT16 TxFifo, + IN UINT8 Parity, + IN UINT8 SerialLinesEnabled, + IN UINT8 *VendorDefinedData OPTIONAL, + IN UINT16 VendorDefinedDataLength, + IN CHAR8 *ResourceSource, + IN UINT16 ResourceSourceLength, + IN AML_OBJECT_NODE_HANDLE NameOpNode OPTIONAL, + OUT AML_DATA_NODE_HANDLE *NewRdNode OPTIONAL + ) +{ + AML_DATA_NODE *RdNode; + EFI_STATUS Status; + UINT16 UartDescBuffLength; + UINT8 *UartDescBuff; + UINT8 BitsPerByteMask; + + EFI_ACPI_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR UartDesc; + + if ((NameOpNode == NULL) && (NewRdNode == NULL)) { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + if (((VendorDefinedData == NULL) && (VendorDefinedDataLength > 0)) || + ((VendorDefinedData != NULL) && (VendorDefinedDataLength == 0))) + { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + if ((ResourceSource == NULL) || (ResourceSourceLength <= 0)) { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + if (StopBits > EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_STOP_BIT_2) { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + if (FlowControl > EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_FC_XON_XOFF) { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + if (Parity > EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_PARITY_SPACE) { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + switch (BitsPerByte) { + case 5: + BitsPerByteMask = EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_5_BITS_PER_BYTE; + break; + case 6: + BitsPerByteMask = EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_6_BITS_PER_BYTE; + break; + case 7: + BitsPerByteMask = EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_7_BITS_PER_BYTE; + break; + case 8: + BitsPerByteMask = EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_8_BITS_PER_BYTE; + break; + case 9: + BitsPerByteMask = EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_9_BITS_PER_BYTE; + break; + default: + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + /// as per spec last two bits are reserved and must be 0. + if ((SerialLinesEnabled & + ~(EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_RTS | + EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_CTS | + EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_DTR | + EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_DSR | + EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_RI | + EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_LIN_DTD)) != 0) + { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + UartDesc.Header.Header.Bits.Type = ACPI_LARGE_ITEM_FLAG; + UartDesc.Header.Header.Bits.Name = ACPI_LARGE_GENERIC_SERIAL_BUS_CONNECTION_DESCRIPTOR_NAME; + UartDesc.RevisionId = EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_REVISION_ID; + UartDesc.ResourceSourceIndex = 0; + UartDesc.SerialBusType = EFI_ACPI_SERIAL_BUS_RESOURCE_TYPE_UART; + UartDesc.GeneralFlags = (IsResourceConsumer ? BIT1 : 0) | + (IsSlaveMode ? BIT0 : 0); + UartDesc.TypeSpecificFlags = (IsBigEndian ? BIT7 : 0) | + (BitsPerByteMask << 4) | + (StopBits << 2) | + (FlowControl); + UartDesc.TypeSpecificRevisionId = EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_REVISION_ID; + /// TypeDataLength is the length of the data following the TypeDataLength, + /// up to the Additional vendor supplied data (not included). + UartDesc.TypeDataLength = sizeof (UartDesc.DefaultBaudRate) + + sizeof (UartDesc.RxFIFO) + + sizeof (UartDesc.TxFIFO) + + sizeof (UartDesc.Parity) + + sizeof (UartDesc.SerialLinesEnabled) + + VendorDefinedDataLength; + UartDesc.DefaultBaudRate = BaudRate; + UartDesc.RxFIFO = RxFifo; + UartDesc.TxFIFO = TxFifo; + UartDesc.Parity = Parity; + UartDesc.SerialLinesEnabled = SerialLinesEnabled; + + UartDescBuffLength = sizeof (EFI_ACPI_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR) + + VendorDefinedDataLength + + ResourceSourceLength; + + UartDesc.Header.Length = UartDescBuffLength - sizeof (ACPI_LARGE_RESOURCE_HEADER); + + UartDescBuff = AllocateZeroPool (UartDescBuffLength); + if (UartDescBuff == NULL) { + ASSERT_EFI_ERROR (EFI_OUT_OF_RESOURCES); + return EFI_OUT_OF_RESOURCES; + } + + CopyMem ( + UartDescBuff, + &UartDesc, + sizeof (EFI_ACPI_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR) + ); + + if (VendorDefinedData != NULL) { + CopyMem ( + UartDescBuff + sizeof (EFI_ACPI_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR), + VendorDefinedData, + VendorDefinedDataLength + ); + } + + CopyMem ( + UartDescBuff + + sizeof (EFI_ACPI_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR) + + VendorDefinedDataLength, + ResourceSource, + ResourceSourceLength + ); + + Status = AmlCreateDataNode ( + EAmlNodeDataTypeResourceData, + UartDescBuff, + UartDescBuffLength, + &RdNode + ); + FreePool (UartDescBuff); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + return LinkRdNode (RdNode, NameOpNode, NewRdNode); +} + +/** Code generation for the UARTSerialBusV2() ASL macro. + + The Resource Data effectively created is a UART Serial Bus Connection + Resource Descriptor Resource Data. + Cf ACPI 6.5: + - s19.6.143 UARTSerialBusV2 + (UART Serial Bus Connection Resource Descriptor Version 2 Macro) + - s6.4.3.8.2.3 UART Serial Bus Connection Resource Descriptor + + The created resource data node can be: + - appended to the list of resource data elements of the NameOpNode. + In such case NameOpNode must be defined by a the "Name ()" ASL statement + and initially contain a "ResourceTemplate ()". + - returned through the NewRdNode parameter. + + @param [in] InitialBaudRate Initial baud rate. + @param [in] BitsPerByte Number of bits per byte. + Optional, default is 8. + @param [in] StopBits Number of stop bits. + Optional, default is 1. + @param [in] LinesInUse Number of lines in use. + @param [in] IsBigEndian Indicates whether the bit transfer is big-endian. + Optional, default is FALSE (little-endian). + @param [in] Parity Parity format used. + Optional, default is no parity. + @param [in] FlowControl Flow control protocol used. + Optional, default is no flow control. + @param [in] ReceiveBufferSize Size of the receive buffer. + @param [in] TransmitBufferSize Size of the transmit buffer. + @param [in] ResourceSource Name of source resource used. + @param [in] ResourceSourceLength Length of the Resource Source. + @param [in] ResourceSourceIndex Resource Source index. + Optional, default is 0. + @param [in] ResourceUsage Resource usage, TRUE for consumer, + FALSE for producer. + Optional, default is TRUE (consumer). + @param [in] IsShared Indicates whether the resource is shared. + Optional, default is FALSE (exclusive). + @param [in] VendorDefinedData Vendor defined data. + Optional, can be NULL. + @param [in] VendorDefinedDataLength Length of the vendor defined data. + @param [in] NameOpNode NameOp object node defining a named object. + If provided, append the new resource data + node to the list of resource data elements + of this node. + @param [out] NewRdNode If provided and success, + contain the created node. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval various Various failure values of called functions. +**/ +EFI_STATUS +EFIAPI +AmlCodeGenRdUartSerialBusV2 ( + IN UINT32 InitialBaudRate, + IN UINT8 *BitsPerByte OPTIONAL, + IN UINT8 *StopBits OPTIONAL, + IN UINT8 LinesInUse, + IN BOOLEAN *IsBigEndian OPTIONAL, + IN UINT8 *Parity OPTIONAL, + IN UINT8 *FlowControl OPTIONAL, + IN UINT16 ReceiveBufferSize, + IN UINT16 TransmitBufferSize, + IN CHAR8 *ResourceSource, + IN UINT16 ResourceSourceLength, + IN UINT8 *ResourceSourceIndex OPTIONAL, + IN BOOLEAN *ResourceUsage OPTIONAL, + IN BOOLEAN *IsShared OPTIONAL, + IN UINT8 *VendorDefinedData OPTIONAL, + IN UINT16 VendorDefinedDataLength, + IN AML_OBJECT_NODE_HANDLE NameOpNode OPTIONAL, + OUT AML_DATA_NODE_HANDLE *NewRdNode OPTIONAL + ) +{ + EFI_STATUS Status; + + if ((NameOpNode == NULL) && (NewRdNode == NULL)) { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + if (((VendorDefinedData == NULL) && (VendorDefinedDataLength > 0)) || + ((VendorDefinedData != NULL) && (VendorDefinedDataLength == 0))) + { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + if ((ResourceSource == NULL) || (ResourceSourceLength <= 0)) { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + if (ResourceSourceIndex != NULL) { + if (*ResourceSourceIndex != 0) { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + } + + Status = AmlCodeGenRdUartSerialBus ( + /// default is resource consumer + (ResourceUsage != NULL) ? *ResourceUsage : TRUE, + /// slave mode + TRUE, + /// default is little-endian + (IsBigEndian != NULL) ? *IsBigEndian : FALSE, + /// default is 8 bits per byte + (BitsPerByte != NULL) ? *BitsPerByte : 8, + /// default is 1 stop bit + (StopBits != NULL) ? *StopBits : EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_STOP_BIT_1, + /// default is no flow control + (FlowControl != NULL) ? *FlowControl : EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_TSF_FC_NONE, + InitialBaudRate, + ReceiveBufferSize, + TransmitBufferSize, + /// default is no parity + (Parity != NULL) ? *Parity : EFI_ACPI_5_0_SERIAL_BUS_RESOURCE_UART_DESCRIPTOR_PARITY_NONE, + LinesInUse, + VendorDefinedData, + VendorDefinedDataLength, + ResourceSource, + ResourceSourceLength, + NameOpNode, + NewRdNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + return Status; +} From 095bfacc9e52d5e7d4ef5e4a1c9bf311dce61b18 Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Thu, 26 Jun 2025 10:16:42 +0000 Subject: [PATCH 0288/1172] DynamicTablesPkg: Implement X64-specific SsdtSerialPortFixupLib Introduce an X64-specific implementation of the SsdtSerialPortFixupLib library class. Utilizes the AML library to generate COM or serial device dynamically. Signed-off-by: Abdul Lateef Attar --- DynamicTablesPkg/DynamicTables.dsc.inc | 1 + .../SsdtSerialPortFixupLib.c | 533 ++++++++++++++++++ .../SsdtSerialPortFixupLib.inf | 32 ++ 3 files changed, 566 insertions(+) create mode 100644 DynamicTablesPkg/Library/Acpi/X64/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c create mode 100644 DynamicTablesPkg/Library/Acpi/X64/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc index 371efe9115e7..95b64076b74d 100644 --- a/DynamicTablesPkg/DynamicTables.dsc.inc +++ b/DynamicTablesPkg/DynamicTables.dsc.inc @@ -67,6 +67,7 @@ DynamicTablesPkg/Library/Acpi/X64/AcpiMadtLib/AcpiMadtLib.inf DynamicTablesPkg/Library/Acpi/X64/AcpiSsdtHpetLib/AcpiSsdtHpetLib.inf DynamicTablesPkg/Library/Acpi/X64/AcpiWsmtLib/AcpiWsmtLib.inf + DynamicTablesPkg/Library/Acpi/X64/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf # # Dynamic Table Factory Dxe diff --git a/DynamicTablesPkg/Library/Acpi/X64/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c b/DynamicTablesPkg/Library/Acpi/X64/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c new file mode 100644 index 000000000000..b6e7c4666943 --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/X64/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c @@ -0,0 +1,533 @@ +/** @file + SSDT Serial Port Fixup Library for X64. + + + Copyright (c) 2019 - 2024, Arm Limited. All rights reserved.
+ Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - Arm Server Base Boot Requirements (SBBR), s4.2.1.8 "SPCR". + - Microsoft Debug Port Table 2 (DBG2) Specification - December 10, 2015. + - ACPI for Arm Components 1.0 - 2020 + - Arm Generic Interrupt Controller Architecture Specification, + Issue H, January 2022. + (https://developer.arm.com/documentation/ihi0069/) +**/ + +#include +#include +#include +#include +#include +#include +#include + +// Module specific include files. +#include +#include +#include +#include +#include +#include + +/** UART address range length. +*/ +#define MIN_UART_ADDRESS_LENGTH 0x1000U + +/** Validate the Serial Port Information. + + @param [in] SerialPortInfoTable Table of CM_ARCH_COMMON_SERIAL_PORT_INFO. + @param [in] SerialPortCount Count of SerialPort in the table. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER Invalid parameter. +**/ +EFI_STATUS +EFIAPI +ValidateSerialPortInfo ( + IN CONST CM_ARCH_COMMON_SERIAL_PORT_INFO *SerialPortInfoTable, + IN UINT32 SerialPortCount + ) +{ + UINT32 Index; + CONST CM_ARCH_COMMON_SERIAL_PORT_INFO *SerialPortInfo; + + if ((SerialPortInfoTable == NULL) || + (SerialPortCount == 0)) + { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + for (Index = 0; Index < SerialPortCount; Index++) { + SerialPortInfo = &SerialPortInfoTable[Index]; + ASSERT (SerialPortInfo != NULL); + + if ((SerialPortInfo == NULL) || + (SerialPortInfo->BaseAddress == 0)) + { + DEBUG (( + DEBUG_ERROR, + "ERROR: UART port base address is invalid. BaseAddress = 0x%llx\n", + SerialPortInfo->BaseAddress + )); + return EFI_INVALID_PARAMETER; + } + + if ((SerialPortInfo->PortSubtype != + EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_PL011_UART) && + (SerialPortInfo->PortSubtype != + EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_SBSA_GENERIC_UART_2X) && + (SerialPortInfo->PortSubtype != + EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_SBSA_GENERIC_UART) && + (SerialPortInfo->PortSubtype != + EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_DCC) && + (SerialPortInfo->PortSubtype != + EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_FULL_16550) && + (SerialPortInfo->PortSubtype != + EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_16550_WITH_GAS)) + { + DEBUG (( + DEBUG_ERROR, + "ERROR: UART port subtype is invalid." + " UART Base = 0x%llx, PortSubtype = 0x%x\n", + SerialPortInfo->BaseAddress, + SerialPortInfo->PortSubtype + )); + return EFI_INVALID_PARAMETER; + } + + DEBUG ((DEBUG_INFO, "UART Configuration:\n")); + DEBUG (( + DEBUG_INFO, + " UART Base = 0x%llx\n", + SerialPortInfo->BaseAddress + )); + DEBUG (( + DEBUG_INFO, + " Length = 0x%llx\n", + SerialPortInfo->BaseAddressLength + )); + DEBUG ((DEBUG_INFO, " Clock = %lu\n", SerialPortInfo->Clock)); + DEBUG ((DEBUG_INFO, " BaudRate = %llu\n", SerialPortInfo->BaudRate)); + DEBUG ((DEBUG_INFO, " Interrupt = %lu\n", SerialPortInfo->Interrupt)); + } // for + + return EFI_SUCCESS; +} + +/** + Create the _CRS (Current Resource Settings) AML node for a serial port device. + + @param [in] SerialPortInfo Pointer to the serial port information structure. + @param [in] Name The Name to give to the Device. + Must be a NULL-terminated ASL NameString + e.g.: "DEV0", "DV15.DEV0", etc. + @param [in] DeviceNode AML device node handle. + + @retval EFI_SUCCESS The CRS node was created successfully. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval Others Failed to create CRS node. +**/ +STATIC +EFI_STATUS +EFIAPI +CreateSerialPortCrs ( + IN CONST CM_ARCH_COMMON_SERIAL_PORT_INFO *SerialPortInfo, + IN CONST CHAR8 *Name, + IN AML_OBJECT_NODE_HANDLE DeviceNode + ) +{ + AML_OBJECT_NODE_HANDLE CrsNode; + EFI_STATUS Status; + UINT8 IrqList[1]; + + Status = AmlCodeGenNameResourceTemplate ("_CRS", DeviceNode, &CrsNode); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create AML _CRS Node." + " Status = %r\n", + Status + )); + return Status; + } + + IrqList[0] = SerialPortInfo->Interrupt & MAX_UINT8; + + if (SerialPortInfo->PortSubtype == EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_FULL_16550) { + Status = AmlCodeGenRdIo ( + TRUE, + SerialPortInfo->BaseAddress & MAX_UINT16, + SerialPortInfo->BaseAddress & MAX_UINT16, + 1, + 0x8, + CrsNode, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to generate IO RD node." + " Status = %r\n", + Status + )); + return Status; + } + + // + // Generate the IRQ() ASL macro. + // This is used for legacy X86/X64/PC-AT compatible systems. + // + Status = AmlCodeGenRdIrq ( + TRUE, + TRUE, + TRUE, + IrqList, + ARRAY_SIZE (IrqList), + CrsNode, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to generate IRQ RD node." + " Status = %r\n", + Status + )); + return Status; + } + + // + // Generate the UARTSerialBusV2() ASL macro. + // This describes legacy COM port resources for X86/X64/PC-AT compatible systems. + // + Status = AmlCodeGenRdUartSerialBusV2 ( + SerialPortInfo->BaudRate & MAX_UINT32, // BaudRate + NULL, // Default 8 Bits Per Byte + NULL, // Default 1 Stop Bit + 0, // Lines in Use + NULL, // Default is little endian + NULL, // Default is no parity + NULL, // Default is no flow control + 0x1, // ReceiveBufferSize + 0x1, // TransmitBufferSize + (CHAR8 *)Name, // Serial Port Name + (AsciiStrLen (Name) + 1) & MAX_UINT16, // Serial Port Name Length + NULL, // Default resource index is zero + NULL, // Default is consumer + NULL, // Default is exclusive + NULL, // vendor defined data + 0, // VendorDefinedDataLength + CrsNode, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to generate UartSerialBus RD node." + " Status = %r\n", + Status + )); + return Status; + } + } + + if (SerialPortInfo->PortSubtype == EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_16550_WITH_GAS) { + Status = AmlCodeGenRdMemory32Fixed ( + TRUE, + SerialPortInfo->BaseAddress & MAX_UINT32, + ((SerialPortInfo->BaseAddressLength > MIN_UART_ADDRESS_LENGTH) + ? SerialPortInfo->BaseAddressLength + : MIN_UART_ADDRESS_LENGTH) & MAX_UINT32, + CrsNode, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to generate MMIO RD node." + " Status = %r\n", + Status + )); + return Status; + } + + Status = AmlCodeGenRdIrq ( + TRUE, + TRUE, + TRUE, + IrqList, + 1, + CrsNode, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to generate IRQ RD node." + " Status = %r\n", + Status + )); + return Status; + } + } + + return EFI_SUCCESS; +} + +/** Build a SSDT table describing the input serial port. + + The table created by this function must be freed by FreeSsdtSerialTable. + + @param [in] AcpiTableInfo Pointer to the ACPI table information. + @param [in] SerialPortInfo Serial port to describe in the SSDT table. + @param [in] Name The Name to give to the Device. + Must be a NULL-terminated ASL NameString + e.g.: "DEV0", "DV15.DEV0", etc. + @param [in] Uid UID for the Serial Port. + @param [out] Table If success, pointer to the created SSDT table. + + @retval EFI_SUCCESS Table generated successfully. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND Could not find information. + @retval EFI_OUT_OF_RESOURCES Could not allocate memory. +**/ +EFI_STATUS +EFIAPI +BuildSsdtSerialPortTable ( + IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *AcpiTableInfo, + IN CONST CM_ARCH_COMMON_SERIAL_PORT_INFO *SerialPortInfo, + IN CONST CHAR8 *Name, + IN CONST UINT64 Uid, + OUT EFI_ACPI_DESCRIPTION_HEADER **Table + ) +{ + AML_OBJECT_NODE_HANDLE DeviceNode; + AML_OBJECT_NODE_HANDLE ScopeNode; + AML_ROOT_NODE_HANDLE RootNode; + CONST CHAR8 *NonBsaHid; + EFI_STATUS Status; + EFI_STATUS Status1; + UINT32 EisaId; + + ASSERT (AcpiTableInfo != NULL); + ASSERT (SerialPortInfo != NULL); + ASSERT (Name != NULL); + ASSERT (Table != NULL); + + // Validate the Serial Port Info. + Status = ValidateSerialPortInfo (SerialPortInfo, 1); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = AmlCodeGenDefinitionBlock ( + "SSDT", + "AMDINC", + "SERIAL", + 0x01, + &RootNode + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create AML Definition Block." + " Status = %r\n", + Status + )); + ASSERT_EFI_ERROR (Status); + return Status; + } + + Status = AmlCodeGenScope ("\\_SB_", RootNode, &ScopeNode); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create AML Scope Node." + " Status = %r\n", + Status + )); + goto exit_handler; + } + + // Create the Device Node, COMx, where x is the Uid. + Status = AmlCodeGenDevice (Name, ScopeNode, &DeviceNode); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create AML Device Node." + " Status = %r\n", + Status + )); + goto exit_handler; + } + + NonBsaHid = (CONST CHAR8 *)PcdGetPtr (PcdNonBsaCompliant16550SerialHid); + if (SerialPortInfo->PortSubtype == EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_16550_WITH_GAS) { + if ((NonBsaHid != NULL) && (AsciiStrLen (NonBsaHid) != 0)) { + if (!(IsValidPnpId (NonBsaHid) || IsValidAcpiId (NonBsaHid))) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-SERIAL-PORT-FIXUP: Invalid Supplied HID %a.\n", + NonBsaHid + )); + goto exit_handler; + } + + Status = AmlCodeGenNameString ( + "_HID", + NonBsaHid, + DeviceNode, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create AML _HID Node." + " Status = %r\n", + Status + )); + goto exit_handler; + } + } + } + + if ((SerialPortInfo->PortSubtype == EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_FULL_16550) || + ((SerialPortInfo->PortSubtype == EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_16550_WITH_GAS) && + ((NonBsaHid == NULL) || (AsciiStrLen (NonBsaHid) == 0)))) + { + Status = AmlGetEisaIdFromString ("PNP0501", &EisaId); + if (EFI_ERROR (Status)) { + goto exit_handler; + } + + Status = AmlCodeGenNameInteger ("_HID", EisaId, DeviceNode, NULL); + if (EFI_ERROR (Status)) { + goto exit_handler; + } + + Status = AmlGetEisaIdFromString ("PNP0500", &EisaId); + if (EFI_ERROR (Status)) { + goto exit_handler; + } + + Status = AmlCodeGenNameInteger ("_CID", EisaId, DeviceNode, NULL); + if (EFI_ERROR (Status)) { + goto exit_handler; + } + } + + // _UID + Status = AmlCodeGenNameInteger ("_UID", Uid, DeviceNode, NULL); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create AML _UID Node." + " Status = %r\n", + Status + )); + goto exit_handler; + } + + // _DDN + Status = AmlCodeGenNameString ("_DDN", Name, DeviceNode, NULL); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create AML _DDN Node." + " Status = %r\n", + Status + )); + goto exit_handler; + } + + // _STA + Status = AmlCodeGenMethodRetInteger ( + "_STA", + 0x0F, + 0, + FALSE, + 0, + DeviceNode, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create AML _STA Node." + " Status = %r\n", + Status + )); + goto exit_handler; + } + + Status = CreateSerialPortCrs (SerialPortInfo, Name, DeviceNode); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create _CRS for Serial Port." + " Status = %r\n", + Status + )); + goto exit_handler; + } + + // Serialize the tree. + Status = AmlSerializeDefinitionBlock ( + RootNode, + Table + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to Serialize SSDT Table Data." + " Status = %r\n", + Status + )); + } + + return EFI_SUCCESS; + +exit_handler: + // Cleanup + if (RootNode != NULL) { + Status1 = AmlDeleteTree (RootNode); + if (EFI_ERROR (Status1)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to cleanup AML tree." + " Status = %r\n", + Status1 + )); + // If Status was success but we failed to delete the AML Tree + // return Status1 else return the original error code, i.e. Status. + if (!EFI_ERROR (Status)) { + return Status1; + } + } + } + + return Status; +} + +/** Free an SSDT table previously created by + the BuildSsdtSerialTable function. + + @param [in] Table Pointer to a SSDT table allocated by + the BuildSsdtSerialTable function. + + @retval EFI_SUCCESS Success. +**/ +EFI_STATUS +EFIAPI +FreeSsdtSerialPortTable ( + IN EFI_ACPI_DESCRIPTION_HEADER *Table + ) +{ + ASSERT (Table != NULL); + FreePool (Table); + return EFI_SUCCESS; +} diff --git a/DynamicTablesPkg/Library/Acpi/X64/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf b/DynamicTablesPkg/Library/Acpi/X64/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf new file mode 100644 index 000000000000..73ae99ba0445 --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/X64/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf @@ -0,0 +1,32 @@ +## @file +# SSDT Serial Port fixup Library +# +# Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 1.30 + BASE_NAME = DynamicSsdtSerialPortFixupLib + FILE_GUID = 83F367CE-9EA3-4A5B-B61F-60E06CA7D9FF + VERSION_STRING = 1.0 + MODULE_TYPE = DXE_DRIVER + LIBRARY_CLASS = SsdtSerialPortFixupLib + +[Sources] + SsdtSerialPortFixupLib.c + +[Packages.common] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + EmbeddedPkg/EmbeddedPkg.dec + DynamicTablesPkg/DynamicTablesPkg.dec + +[LibraryClasses] + AcpiHelperLib + AmlLib + BaseLib + +[Pcd] + gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdNonBsaCompliant16550SerialHid From 6cb452370482b17af4ffb58d0b5704ae20050017 Mon Sep 17 00:00:00 2001 From: Pranav V V Date: Mon, 14 Jul 2025 21:27:17 +0530 Subject: [PATCH 0289/1172] ArmPlatformPkg/PL011SerialPortLib: Support dynamic PCD type. Convert UART configuration PCDs from FixedPcd to dynamic Pcd to enable runtime modification of serial port parameters. Changes made: - Replace FixedPcdGet64/FixedPcdGet8 calls with PcdGet64/PcdGet8 for: * PcdUartDefaultBaudRate * PcdUartDefaultParity * PcdUartDefaultDataBits * PcdUartDefaultStopBits - Update INF file to declare these PCDs under [Pcd]. Signed-off-by: Pranav V V --- .../Library/PL011SerialPortLib/PL011SerialPortLib.c | 8 ++++---- .../Library/PL011SerialPortLib/PL011SerialPortLib.inf | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.c b/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.c index bf437af1b205..afa3fc410c67 100644 --- a/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.c +++ b/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.c @@ -37,11 +37,11 @@ SerialPortInitialize ( EFI_STATUS Status; UINT8 Scratch; - BaudRate = FixedPcdGet64 (PcdUartDefaultBaudRate); + BaudRate = PcdGet64 (PcdUartDefaultBaudRate); ReceiveFifoDepth = 0; // Use default FIFO depth - Parity = (EFI_PARITY_TYPE)FixedPcdGet8 (PcdUartDefaultParity); - DataBits = FixedPcdGet8 (PcdUartDefaultDataBits); - StopBits = (EFI_STOP_BITS_TYPE)FixedPcdGet8 (PcdUartDefaultStopBits); + Parity = (EFI_PARITY_TYPE)PcdGet8 (PcdUartDefaultParity); + DataBits = PcdGet8 (PcdUartDefaultDataBits); + StopBits = (EFI_STOP_BITS_TYPE)PcdGet8 (PcdUartDefaultStopBits); Status = PL011UartInitializePort ( (UINTN)PcdGet64 (PcdSerialRegisterBase), diff --git a/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf b/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf index b6b87f32a99c..07424cccb3f8 100644 --- a/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf +++ b/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf @@ -33,7 +33,7 @@ [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase -[FixedPcd] +[Pcd] gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate gEfiMdePkgTokenSpaceGuid.PcdUartDefaultDataBits gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity From 1caa6a92ea36d812bd2dc99f38356613d8aa1baa Mon Sep 17 00:00:00 2001 From: Pranav V V Date: Mon, 14 Jul 2025 22:20:34 +0530 Subject: [PATCH 0290/1172] ArmPlatformPkg/PL011UartLib: Prevent data loss in conversion. Add an explicit (UINT32) cast to the assignment. Signed-off-by: Pranav V V --- ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.c b/ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.c index 60f9bc5fb0e6..e8e2e1d83998 100644 --- a/ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.c +++ b/ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.c @@ -193,7 +193,7 @@ PL011UartInitializePort ( return RETURN_INVALID_PARAMETER; } - Divisor = (UartClkInHz * 4) / *BaudRate; + Divisor = (UINT32)((UartClkInHz * 4) / *BaudRate); Integer = Divisor >> FRACTION_PART_SIZE_IN_BITS; Fractional = Divisor & FRACTION_PART_MASK; } From 35a93babfbbf18b72890572f909a86257683ccfd Mon Sep 17 00:00:00 2001 From: James Le Cuirot Date: Wed, 19 Mar 2025 16:22:29 +0000 Subject: [PATCH 0291/1172] BaseTools/tools_def: Drop unused GCC IA32/X64 flag variables These haven't been used since before 2d07607d8b1a0710ba7379f8ee6c11dae1, when UNIXGCC support was dropped. The recent change in 14cb48b0a053b44c5a6bcc89cbbbf86ac78c7820 to make linker warnings fatal was therefore ineffective for these architectures. As requested, also make linker warnings fatal for GCC5 only. The last release made them fatal for AARCH64 on GCC48/GCC49, but it seems likely no one has actually tested that yet. Signed-off-by: James Le Cuirot --- BaseTools/Conf/tools_def.template | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index 210894884e7b..32d04519be80 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -929,18 +929,15 @@ DEFINE GCC_AARCH64_CC_FLAGS = DEF(GCC_ALL_CC_FLAGS) -mlittle-endian -fno- DEFINE GCC_AARCH64_CC_XIPFLAGS = -mstrict-align -mgeneral-regs-only DEFINE GCC_RISCV64_CC_XIPFLAGS = -mstrict-align -mgeneral-regs-only DEFINE GCC_DLINK2_FLAGS_COMMON = -Wl,--script=$(EDK_TOOLS_PATH)/Scripts/GccBase.lds -DEFINE GCC_IA32_X64_DLINK_COMMON = -nostdlib --pie --fatal-warnings -z,noexecstack --gc-sections -DEFINE GCC_ARM_AARCH64_DLINK_COMMON= -Wl,--emit-relocs -nostdlib -Wl,--gc-sections -u $(IMAGE_ENTRY_POINT) -Wl,-e,$(IMAGE_ENTRY_POINT),-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map -Wl,--fatal-warnings -Wl,-z,noexecstack +DEFINE GCC_ARM_AARCH64_DLINK_COMMON= -Wl,--emit-relocs -nostdlib -Wl,--gc-sections -u $(IMAGE_ENTRY_POINT) -Wl,-e,$(IMAGE_ENTRY_POINT),-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map DEFINE GCC_LOONGARCH64_DLINK_COMMON= -Wl,--emit-relocs -nostdlib -Wl,--gc-sections -u $(IMAGE_ENTRY_POINT) -Wl,-e,$(IMAGE_ENTRY_POINT),-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map DEFINE GCC_ARM_DLINK_FLAGS = DEF(GCC_ARM_AARCH64_DLINK_COMMON) -z common-page-size=0x20 -Wl,--pic-veneer DEFINE GCC_AARCH64_DLINK_FLAGS = DEF(GCC_ARM_AARCH64_DLINK_COMMON) -z common-page-size=0x20 DEFINE GCC_LOONGARCH64_DLINK_FLAGS = DEF(GCC_LOONGARCH64_DLINK_COMMON) -z common-page-size=0x20 DEFINE GCC_ARM_AARCH64_ASLDLINK_FLAGS = -Wl,--defsym=PECOFF_HEADER_SIZE=0 DEF(GCC_DLINK2_FLAGS_COMMON) -z common-page-size=0x20 -DEFINE GCC_IA32_X64_ASLDLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_COMMON) --entry _ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) DEFINE GCC_ARM_ASLDLINK_FLAGS = DEF(GCC_ARM_DLINK_FLAGS) -Wl,--entry,ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) DEF(GCC_ARM_AARCH64_ASLDLINK_FLAGS) DEFINE GCC_AARCH64_ASLDLINK_FLAGS = DEF(GCC_AARCH64_DLINK_FLAGS) -Wl,--entry,ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) DEF(GCC_ARM_AARCH64_ASLDLINK_FLAGS) DEFINE GCC_LOONGARCH64_ASLDLINK_FLAGS = DEF(GCC_LOONGARCH64_DLINK_FLAGS) -Wl,--entry,ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) -DEFINE GCC_IA32_X64_DLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_COMMON) --entry _$(IMAGE_ENTRY_POINT) --file-alignment 0x20 --section-alignment 0x20 -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map DEFINE GCC_ASM_FLAGS = -c -x assembler -imacros AutoGen.h DEFINE GCC_PP_FLAGS = -E -x assembler-with-cpp -include AutoGen.h DEFINE GCC_VFRPP_FLAGS = -x c -E -DVFRCOMPILE --include $(MODULE_NAME)StrDefs.h @@ -1006,13 +1003,13 @@ DEFINE GCC49_ARM_ASLDLINK_FLAGS = DEF(GCC48_ARM_ASLDLINK_FLAGS) DEFINE GCC49_AARCH64_ASLDLINK_FLAGS = DEF(GCC48_AARCH64_ASLDLINK_FLAGS) DEFINE GCC49_ASLCC_FLAGS = DEF(GCC48_ASLCC_FLAGS) +DEFINE GCC5_DLINK_WARNING_FLAGS = -Wl,--fatal-warnings -Wl,-z,noexecstack DEFINE GCC5_IA32_CC_FLAGS = DEF(GCC49_IA32_CC_FLAGS) DEFINE GCC5_X64_CC_FLAGS = DEF(GCC49_X64_CC_FLAGS) -DEFINE GCC5_IA32_X64_DLINK_COMMON = DEF(GCC49_IA32_X64_DLINK_COMMON) -DEFINE GCC5_IA32_X64_ASLDLINK_FLAGS = DEF(GCC49_IA32_X64_ASLDLINK_FLAGS) -DEFINE GCC5_IA32_X64_DLINK_FLAGS = DEF(GCC49_IA32_X64_DLINK_FLAGS) +DEFINE GCC5_IA32_X64_ASLDLINK_FLAGS = DEF(GCC49_IA32_X64_ASLDLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS) +DEFINE GCC5_IA32_X64_DLINK_FLAGS = DEF(GCC49_IA32_X64_DLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS) DEFINE GCC5_IA32_DLINK2_FLAGS = DEF(GCC49_IA32_DLINK2_FLAGS) -Wno-error -DEFINE GCC5_X64_DLINK_FLAGS = DEF(GCC49_X64_DLINK_FLAGS) +DEFINE GCC5_X64_DLINK_FLAGS = DEF(GCC49_X64_DLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS) DEFINE GCC5_X64_DLINK2_FLAGS = DEF(GCC49_X64_DLINK2_FLAGS) -Wno-error DEFINE GCC5_ASM_FLAGS = DEF(GCC49_ASM_FLAGS) DEFINE GCC5_ARM_ASM_FLAGS = DEF(GCC49_ARM_ASM_FLAGS) @@ -1021,12 +1018,12 @@ DEFINE GCC5_ARM_CC_FLAGS = DEF(GCC49_ARM_CC_FLAGS) DEFINE GCC5_ARM_CC_XIPFLAGS = DEF(GCC49_ARM_CC_XIPFLAGS) DEFINE GCC5_AARCH64_CC_FLAGS = DEF(GCC49_AARCH64_CC_FLAGS) DEFINE GCC5_AARCH64_CC_XIPFLAGS = DEF(GCC49_AARCH64_CC_XIPFLAGS) -DEFINE GCC5_ARM_DLINK_FLAGS = DEF(GCC49_ARM_DLINK_FLAGS) +DEFINE GCC5_ARM_DLINK_FLAGS = DEF(GCC49_ARM_DLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS) DEFINE GCC5_ARM_DLINK2_FLAGS = DEF(GCC49_ARM_DLINK2_FLAGS) -Wno-error -DEFINE GCC5_AARCH64_DLINK_FLAGS = DEF(GCC49_AARCH64_DLINK_FLAGS) +DEFINE GCC5_AARCH64_DLINK_FLAGS = DEF(GCC49_AARCH64_DLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS) DEFINE GCC5_AARCH64_DLINK2_FLAGS = DEF(GCC49_AARCH64_DLINK2_FLAGS) -Wno-error -DEFINE GCC5_ARM_ASLDLINK_FLAGS = DEF(GCC49_ARM_ASLDLINK_FLAGS) -DEFINE GCC5_AARCH64_ASLDLINK_FLAGS = DEF(GCC49_AARCH64_ASLDLINK_FLAGS) +DEFINE GCC5_ARM_ASLDLINK_FLAGS = DEF(GCC49_ARM_ASLDLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS) +DEFINE GCC5_AARCH64_ASLDLINK_FLAGS = DEF(GCC49_AARCH64_ASLDLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS) DEFINE GCC5_ASLCC_FLAGS = DEF(GCC49_ASLCC_FLAGS) -fno-lto DEFINE GCC5_RISCV_ALL_CC_FLAGS = -g -fshort-wchar -fno-strict-aliasing -Wall -Werror -Wno-array-bounds -ffunction-sections -fdata-sections -include AutoGen.h -fno-common -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings -msmall-data-limit=0 From d7ccf477f598949d76ab1596bf62f495997cf70a Mon Sep 17 00:00:00 2001 From: James Le Cuirot Date: Thu, 20 Mar 2025 10:27:28 +0000 Subject: [PATCH 0292/1172] BaseTools/tools_def: Make linker warnings fatal for RISCV + LOONGARCH64 For consistency, and as before, for GCC5 only. Signed-off-by: James Le Cuirot --- BaseTools/Conf/tools_def.template | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index 32d04519be80..b950720094dd 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -1027,7 +1027,7 @@ DEFINE GCC5_AARCH64_ASLDLINK_FLAGS = DEF(GCC49_AARCH64_ASLDLINK_FLAGS) DEF(GCC DEFINE GCC5_ASLCC_FLAGS = DEF(GCC49_ASLCC_FLAGS) -fno-lto DEFINE GCC5_RISCV_ALL_CC_FLAGS = -g -fshort-wchar -fno-strict-aliasing -Wall -Werror -Wno-array-bounds -ffunction-sections -fdata-sections -include AutoGen.h -fno-common -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings -msmall-data-limit=0 -DEFINE GCC5_RISCV_ALL_DLINK_COMMON = -nostdlib -Wl,-n,-q,--gc-sections -z common-page-size=0x40 +DEFINE GCC5_RISCV_ALL_DLINK_COMMON = -nostdlib -Wl,-n,-q,--gc-sections -z common-page-size=0x40 DEF(GCC5_DLINK_WARNING_FLAGS) DEFINE GCC5_RISCV_ALL_DLINK_FLAGS = DEF(GCC5_RISCV_ALL_DLINK_COMMON) -Wl,--entry,$(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT) -Wl,-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map DEFINE GCC5_RISCV_ALL_DLINK2_FLAGS = -Wl,--defsym=PECOFF_HEADER_SIZE=0x220,--script=$(EDK_TOOLS_PATH)/Scripts/GccBase.lds DEFINE GCC5_RISCV_ALL_ASM_FLAGS = -c -x assembler -imacros $(DEST_DIR_DEBUG)/AutoGen.h @@ -1043,9 +1043,9 @@ DEFINE GCC5_RISCV64_DLINK2_FLAGS = DEF(GCC5_RISCV_ALL_DLINK2_FLAGS) DEFINE GCC5_RISCV64_ASM_FLAGS = DEF(GCC5_RISCV_ALL_ASM_FLAGS) -march=DEF(GCC5_RISCV64_ARCH) -mcmodel=medany -mabi=lp64 DEFINE GCC5_LOONGARCH64_CC_FLAGS = DEF(GCC_LOONGARCH64_CC_FLAGS) -march=loongarch64 -mno-memcpy -Werror -Wno-maybe-uninitialized -Wno-stringop-overflow -Wno-pointer-to-int-cast -no-pie -fno-stack-protector -mno-explicit-relocs -DEFINE GCC5_LOONGARCH64_DLINK_FLAGS = DEF(GCC_LOONGARCH64_DLINK_FLAGS) +DEFINE GCC5_LOONGARCH64_DLINK_FLAGS = DEF(GCC_LOONGARCH64_DLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS) DEFINE GCC5_LOONGARCH64_DLINK2_FLAGS = DEF(GCC_DLINK2_FLAGS_COMMON) -Wl,--defsym=PECOFF_HEADER_SIZE=0x228 -DEFINE GCC5_LOONGARCH64_ASLDLINK_FLAGS = DEF(GCC_LOONGARCH64_ASLDLINK_FLAGS) DEF(GCC5_LOONGARCH64_DLINK2_FLAGS) +DEFINE GCC5_LOONGARCH64_ASLDLINK_FLAGS = DEF(GCC_LOONGARCH64_ASLDLINK_FLAGS) DEF(GCC5_LOONGARCH64_DLINK2_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS) DEFINE GCC5_LOONGARCH64_ASM_FLAGS = -x assembler-with-cpp -mabi=lp64d -march=loongarch64 -fno-builtin -c -Wall -mno-explicit-relocs DEFINE GCC5_LOONGARCH64_PP_FLAGS = -mabi=lp64d -march=loongarch64 DEF(GCC_PP_FLAGS) From 188f8c686ed39b7b9998f1c2f4658ca8ba74b6ba Mon Sep 17 00:00:00 2001 From: James Le Cuirot Date: Wed, 19 Mar 2025 15:33:07 +0000 Subject: [PATCH 0293/1172] BaseTools/tools_def: Always link with -Wl,-z,notext for BFD/LLD Commit a257988f590ba90dd8394dd6bc7014ae9d814a08 added -Wl,-z,notext, but only when linking for IA32/X64 with LLD. BFD can also be configured to either warn or error when text relocations are detected. It does not check at all by default, but Gentoo Linux tells it to warn in its regular configuration and tells it to error in its hardened configuration. Commit 14cb48b0a053b44c5a6bcc89cbbbf86ac78c7820 made linker warnings fatal in all BFD cases. At least the AARCH64 and IA32/X64 code does include text relocations, so this now fails to build on Gentoo Linux. We should therefore always use -Wl,-z,notext. Signed-off-by: James Le Cuirot --- BaseTools/Conf/tools_def.template | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index b950720094dd..a59fe5b3e288 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -1003,7 +1003,7 @@ DEFINE GCC49_ARM_ASLDLINK_FLAGS = DEF(GCC48_ARM_ASLDLINK_FLAGS) DEFINE GCC49_AARCH64_ASLDLINK_FLAGS = DEF(GCC48_AARCH64_ASLDLINK_FLAGS) DEFINE GCC49_ASLCC_FLAGS = DEF(GCC48_ASLCC_FLAGS) -DEFINE GCC5_DLINK_WARNING_FLAGS = -Wl,--fatal-warnings -Wl,-z,noexecstack +DEFINE GCC5_DLINK_WARNING_FLAGS = -Wl,--fatal-warnings -Wl,-z,noexecstack -Wl,-z,notext DEFINE GCC5_IA32_CC_FLAGS = DEF(GCC49_IA32_CC_FLAGS) DEFINE GCC5_X64_CC_FLAGS = DEF(GCC49_X64_CC_FLAGS) DEFINE GCC5_IA32_X64_ASLDLINK_FLAGS = DEF(GCC49_IA32_X64_ASLDLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS) @@ -2028,10 +2028,11 @@ DEFINE CLANGDWARF_X64_PREFIX = ENV(CLANG_BIN) # LLVM/CLANG doesn't support -n link option. So, it can't share the same IA32_X64_DLINK_COMMON flag. # LLVM/CLANG doesn't support common page size. So, it can't share the same GccBase.lds script. -DEFINE CLANGDWARF_IA32_X64_DLINK_COMMON = -nostdlib -Wl,-q,--gc-sections -z common-page-size=0x40 +DEFINE CLANGDWARF_DLINK_WARNING_FLAGS = -Wl,-z,notext +DEFINE CLANGDWARF_IA32_X64_DLINK_COMMON = -nostdlib -Wl,-q,--gc-sections -z common-page-size=0x40 DEF(CLANGDWARF_DLINK_WARNING_FLAGS) DEFINE CLANGDWARF_DLINK2_FLAGS_COMMON = -Wl,--script=$(EDK_TOOLS_PATH)/Scripts/GccBase.lds DEFINE CLANGDWARF_IA32_X64_ASLDLINK_FLAGS = DEF(CLANGDWARF_IA32_X64_DLINK_COMMON) -Wl,--defsym=PECOFF_HEADER_SIZE=0 DEF(CLANGDWARF_DLINK2_FLAGS_COMMON) -Wl,--entry,ReferenceAcpiTable -u ReferenceAcpiTable -DEFINE CLANGDWARF_IA32_X64_DLINK_FLAGS = DEF(CLANGDWARF_IA32_X64_DLINK_COMMON) -Wl,--entry,$(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT) -Wl,-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map,--whole-archive -Wl,-z,notext +DEFINE CLANGDWARF_IA32_X64_DLINK_FLAGS = DEF(CLANGDWARF_IA32_X64_DLINK_COMMON) -Wl,--entry,$(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT) -Wl,-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map,--whole-archive DEFINE CLANGDWARF_IA32_DLINK2_FLAGS = -Wl,--defsym=PECOFF_HEADER_SIZE=0x220 DEF(CLANGDWARF_DLINK2_FLAGS_COMMON) DEFINE CLANGDWARF_X64_DLINK2_FLAGS = -Wl,--defsym=PECOFF_HEADER_SIZE=0x228 DEF(CLANGDWARF_DLINK2_FLAGS_COMMON) @@ -2118,7 +2119,7 @@ NOOPT_CLANGDWARF_X64_DLINK2_FLAGS = DEF(CLANGDWARF_X64_DLINK2_FLAGS) -O0 -fu ################## DEFINE CLANGDWARF_ARM_TARGET = -target arm-linux-gnueabi DEFINE CLANGDWARF_ARM_CC_FLAGS = DEF(GCC_ARM_CC_FLAGS) DEF(CLANGDWARF_ARM_TARGET) DEF(CLANGDWARF_WARNING_OVERRIDES) -mno-movt -fno-stack-protector -DEFINE CLANGDWARF_ARM_DLINK_FLAGS = DEF(CLANGDWARF_ARM_TARGET) DEF(GCC_ARM_DLINK_FLAGS) +DEFINE CLANGDWARF_ARM_DLINK_FLAGS = DEF(CLANGDWARF_ARM_TARGET) DEF(GCC_ARM_DLINK_FLAGS) DEF(CLANGDWARF_DLINK_WARNING_FLAGS) *_CLANGDWARF_ARM_PP_FLAGS = DEF(GCC_PP_FLAGS) *_CLANGDWARF_ARM_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) @@ -2162,7 +2163,7 @@ RELEASE_CLANGDWARF_ARM_DLINK_FLAGS = DEF(CLANGDWARF_ARM_DLINK_FLAGS) -flto -Wl, ################## DEFINE CLANGDWARF_AARCH64_TARGET = -target aarch64-linux-gnu DEFINE CLANGDWARF_AARCH64_CC_FLAGS = DEF(GCC_AARCH64_CC_FLAGS) DEF(CLANGDWARF_AARCH64_TARGET) -mcmodel=small DEF(CLANGDWARF_WARNING_OVERRIDES) -DEFINE CLANGDWARF_AARCH64_DLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_AARCH64_DLINK_FLAGS) -z common-page-size=0x1000 +DEFINE CLANGDWARF_AARCH64_DLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_AARCH64_DLINK_FLAGS) -z common-page-size=0x1000 DEF(CLANGDWARF_DLINK_WARNING_FLAGS) *_CLANGDWARF_AARCH64_PP_FLAGS = DEF(GCC_PP_FLAGS) *_CLANGDWARF_AARCH64_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) @@ -2184,9 +2185,9 @@ DEFINE CLANGDWARF_AARCH64_DLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_ *_CLANGDWARF_AARCH64_RC_PATH = ENV(CLANGDWARF_BIN)llvm-objcopy *_CLANGDWARF_AARCH64_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) -fno-lto -*_CLANGDWARF_AARCH64_ASLDLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_AARCH64_ASLDLINK_FLAGS) +*_CLANGDWARF_AARCH64_ASLDLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_AARCH64_ASLDLINK_FLAGS) DEF(CLANGDWARF_DLINK_WARNING_FLAGS) *_CLANGDWARF_AARCH64_ASM_FLAGS = DEF(GCC_ASM_FLAGS) DEF(CLANGDWARF_AARCH64_TARGET) $(PLATFORM_FLAGS) -Qunused-arguments -*_CLANGDWARF_AARCH64_DLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_AARCH64_DLINK_FLAGS) -z common-page-size=0x1000 +*_CLANGDWARF_AARCH64_DLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_AARCH64_DLINK_FLAGS) -z common-page-size=0x1000 DEF(CLANGDWARF_DLINK_WARNING_FLAGS) *_CLANGDWARF_AARCH64_DLINK_XIPFLAGS = -z common-page-size=0x20 *_CLANGDWARF_AARCH64_DLINK2_FLAGS = DEF(GCC_DLINK2_FLAGS_COMMON) -Wl,--defsym=PECOFF_HEADER_SIZE=0x228 *_CLANGDWARF_AARCH64_PLATFORM_FLAGS = @@ -2211,7 +2212,7 @@ DEFINE CLANGDWARF_RISCV64_CC_COMMON = DEF(GCC5_RISCV_ALL_CC_FLAGS) DEF(GCC5_RISC DEFINE CLANGDWARF_RISCV64_CC_FLAGS = DEF(CLANGDWARF_RISCV64_CC_COMMON) DEF(CLANGDWARF_RISCV64_TARGET) DEF(CLANGDWARF_WARNING_OVERRIDES) # This is similar to GCC flags but without -n -DEFINE CLANGDWARF_RISCV64_ALL_DLINK_COMMON = -nostdlib -Wl,-q,--gc-sections -z common-page-size=0x40 +DEFINE CLANGDWARF_RISCV64_ALL_DLINK_COMMON = -nostdlib -Wl,-q,--gc-sections -z common-page-size=0x40 DEF(CLANGDWARF_DLINK_WARNING_FLAGS) DEFINE CLANGDWARF_RISCV64_ALL_DLINK_FLAGS = DEF(CLANGDWARF_RISCV64_ALL_DLINK_COMMON) -Wl,--entry,$(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT) -Wl,-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map DEFINE CLANGDWARF_RISCV64_DLINK_FLAGS = DEF(CLANGDWARF_RISCV64_TARGET) DEF(CLANGDWARF_RISCV64_ALL_DLINK_FLAGS) -Wl,-melf64lriscv,--oformat=elf64-littleriscv,--no-relax @@ -2236,9 +2237,9 @@ DEFINE CLANGDWARF_RISCV64_DLINK_FLAGS = DEF(CLANGDWARF_RISCV64_TARGET) DEF *_CLANGDWARF_RISCV64_RC_PATH = ENV(CLANGDWARF_BIN)llvm-objcopy *_CLANGDWARF_RISCV64_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) -fno-lto -*_CLANGDWARF_RISCV64_ASLDLINK_FLAGS = DEF(CLANGDWARF_RISCV64_TARGET) DEF(GCC5_RISCV32_RISCV64_ASLDLINK_FLAGS) +*_CLANGDWARF_RISCV64_ASLDLINK_FLAGS = DEF(CLANGDWARF_RISCV64_TARGET) DEF(GCC5_RISCV32_RISCV64_ASLDLINK_FLAGS) DEF(CLANGDWARF_DLINK_WARNING_FLAGS) *_CLANGDWARF_RISCV64_ASM_FLAGS = DEF(GCC_ASM_FLAGS) DEF(CLANGDWARF_RISCV64_TARGET) $(PLATFORM_FLAGS) -Qunused-arguments -mabi=lp64 -mno-relax -*_CLANGDWARF_RISCV64_DLINK_FLAGS = DEF(CLANGDWARF_RISCV64_TARGET) DEF(GCC5_RISCV64_DLINK_FLAGS) +*_CLANGDWARF_RISCV64_DLINK_FLAGS = DEF(CLANGDWARF_RISCV64_TARGET) DEF(GCC5_RISCV64_DLINK_FLAGS) DEF(CLANGDWARF_DLINK_WARNING_FLAGS) *_CLANGDWARF_RISCV64_DLINK_XIPFLAGS = -z common-page-size=0x20 *_CLANGDWARF_RISCV64_DLINK2_FLAGS = DEF(CLANGDWARF_DLINK2_FLAGS_COMMON) -Wl,--defsym=PECOFF_HEADER_SIZE=0x240 *_CLANGDWARF_RISCV64_PLATFORM_FLAGS = From c840e5f95b0f05a713b7ae09db0987db193630b3 Mon Sep 17 00:00:00 2001 From: Chris Fernald Date: Wed, 16 Jul 2025 10:09:53 -0700 Subject: [PATCH 0294/1172] EmbeddedPkg: Fix incorrect define for hardware interrupt2 protocol In HardwareInterrupt2.h the define for the protocol does not match the definition of the protocol in the dec file. The definition in the dec file is 32898322-2da1-474a-baaa-f3f7cf569470 where in the definition the define is 32898322-2d1a-474a-baaa-f3f7cf569470 and the string is even less correct with various bit swaps. This commit changes all the strings and definitions to be consistent with the dec definition. Signed-off-by: Chris Fernald --- EmbeddedPkg/Include/Protocol/HardwareInterrupt2.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/EmbeddedPkg/Include/Protocol/HardwareInterrupt2.h b/EmbeddedPkg/Include/Protocol/HardwareInterrupt2.h index d017a9e21fc0..d5b2f1562979 100644 --- a/EmbeddedPkg/Include/Protocol/HardwareInterrupt2.h +++ b/EmbeddedPkg/Include/Protocol/HardwareInterrupt2.h @@ -11,10 +11,10 @@ #include -// 22838932-1a2d-4a47-aaba-f3f7cf569470 +// 32898322-2da1-474a-baaa-f3f7cf569470 #define EFI_HARDWARE_INTERRUPT2_PROTOCOL_GUID \ - { 0x32898322, 0x2d1a, 0x474a, \ + { 0x32898322, 0x2da1, 0x474a, \ { 0xba, 0xaa, 0xf3, 0xf7, 0xcf, 0x56, 0x94, 0x70 } } typedef enum { From db299fa7882e6f46d87a51ee31d02c70f96e115d Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Fri, 18 Jul 2025 15:14:16 -0700 Subject: [PATCH 0295/1172] UefiCpuPkg: CpuExceptionHandlerLib: Support RISC-V Relocate exception handler code from BaseRiscV64CpuExceptionHandlerLib to CpuExceptionHandlerLib. Signed-off-by: Tuan Phan --- .../BaseRiscV64CpuExceptionHandlerLib.inf | 42 ------------------- .../BaseRiscV64CpuExceptionHandlerLib.uni | 13 ------ .../DxeCpuExceptionHandlerLib.inf | 7 +++- .../RiscV/ExceptionHandler.h} | 8 ++-- .../RiscV/ExceptionHandlerAsm.S} | 2 +- .../RiscV/ExceptionLib.c} | 2 +- .../SecPeiCpuExceptionHandlerLib.inf | 6 ++- UefiCpuPkg/UefiCpuPkg.ci.yaml | 1 - UefiCpuPkg/UefiCpuPkg.dsc | 1 - 9 files changed, 17 insertions(+), 65 deletions(-) delete mode 100644 UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.inf delete mode 100644 UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.uni rename UefiCpuPkg/Library/{BaseRiscV64CpuExceptionHandlerLib/CpuExceptionHandlerLib.h => CpuExceptionHandlerLib/RiscV/ExceptionHandler.h} (92%) rename UefiCpuPkg/Library/{BaseRiscV64CpuExceptionHandlerLib/SupervisorTrapHandler.S => CpuExceptionHandlerLib/RiscV/ExceptionHandlerAsm.S} (96%) rename UefiCpuPkg/Library/{BaseRiscV64CpuExceptionHandlerLib/CpuExceptionHandlerLib.c => CpuExceptionHandlerLib/RiscV/ExceptionLib.c} (96%) diff --git a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.inf b/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.inf deleted file mode 100644 index d80462943645..000000000000 --- a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.inf +++ /dev/null @@ -1,42 +0,0 @@ -## @file -# RISC-V CPU Exception Handler Library -# -# Copyright (c) 2022-2023, Ventana Micro Systems Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -## - -[Defines] - INF_VERSION = 0x0001001B - BASE_NAME = BaseRiscV64CpuExceptionHandlerLib - MODULE_UNI_FILE = BaseRiscV64CpuExceptionHandlerLib.uni - FILE_GUID = 6AB0D5FD-E615-45A3-9374-E284FB061FC9 - MODULE_TYPE = BASE - VERSION_STRING = 1.0 - LIBRARY_CLASS = CpuExceptionHandlerLib - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = RISCV64 -# - -[Sources] - SupervisorTrapHandler.S - CpuExceptionHandlerLib.c - CpuExceptionHandlerLib.h - -[Packages] - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - UefiCpuPkg/UefiCpuPkg.dec - -[LibraryClasses] - BaseLib - SerialPortLib - PrintLib - SynchronizationLib - PeCoffGetEntryPointLib - MemoryAllocationLib - DebugLib diff --git a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.uni b/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.uni deleted file mode 100644 index 00cca2213096..000000000000 --- a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.uni +++ /dev/null @@ -1,13 +0,0 @@ -// /** @file -// -// Copyright (c) 2016 - 2019, Hewlett Packard Enterprise Development LP. All rights reserved.
-// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -// **/ - - -#string STR_MODULE_ABSTRACT #language en-US "RISC-V CPU Exception Handler Librarys." - -#string STR_MODULE_DESCRIPTION #language en-US "RISC-V CPU Exception Handler Librarys." - diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf b/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf index 9fcba009d65e..314143b29463 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf @@ -19,7 +19,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 LOONGARCH64 +# VALID_ARCHITECTURES = IA32 X64 LOONGARCH64 RISCV64 # [Sources.Ia32] @@ -46,6 +46,11 @@ LoongArch/LoongArch64/ArchExceptionHandler.c LoongArch/LoongArch64/ExceptionHandlerAsm.S | GCC +[Sources.RISCV64] + RiscV/ExceptionLib.c + RiscV/ExceptionHandler.h + RiscV/ExceptionHandlerAsm.S | GCC + [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard gUefiCpuPkgTokenSpaceGuid.PcdCpuStackSwitchExceptionList diff --git a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/CpuExceptionHandlerLib.h b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionHandler.h similarity index 92% rename from UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/CpuExceptionHandlerLib.h rename to UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionHandler.h index 9b7e1304dd3b..0cf82214bb2d 100644 --- a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/CpuExceptionHandlerLib.h +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionHandler.h @@ -8,16 +8,16 @@ **/ -#ifndef RISCV_CPU_EXECPTION_HANDLER_LIB_H_ -#define RISCV_CPU_EXECPTION_HANDLER_LIB_H_ +#ifndef EXCEPTION_HANDLER_H_ +#define EXCEPTION_HANDLER_H_ #include /** Trap Handler for S-mode - **/ VOID +EFIAPI SupervisorModeTrap ( VOID ); @@ -108,4 +108,4 @@ typedef struct { } SMODE_TRAP_REGISTERS; #pragma pack() -#endif +#endif /* EXCEPTION_HANDLER_H_ */ diff --git a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/SupervisorTrapHandler.S b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionHandlerAsm.S similarity index 96% rename from UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/SupervisorTrapHandler.S rename to UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionHandlerAsm.S index 45070b5cda04..815e28bbc69b 100644 --- a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/SupervisorTrapHandler.S +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionHandlerAsm.S @@ -8,7 +8,7 @@ **/ #include -#include "CpuExceptionHandlerLib.h" +#include "ExceptionHandler.h" .align 3 .section .entry, "ax", %progbits diff --git a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/CpuExceptionHandlerLib.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionLib.c similarity index 96% rename from UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/CpuExceptionHandlerLib.c rename to UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionLib.c index 73a9dd57658c..48f57f6c5a30 100644 --- a/UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/CpuExceptionHandlerLib.c +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionLib.c @@ -14,7 +14,7 @@ #include #include #include -#include "CpuExceptionHandlerLib.h" +#include "ExceptionHandler.h" // // Define the maximum message length diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf index 64de252dcd25..cc872e12b06f 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf @@ -20,7 +20,7 @@ # The following information is for reference only and not required by the build tools. # # VALID_ARCHITECTURES = IA32 X64 -# VALID_ARCHITECTURES = IA32 X64 LOONGARCH64 +# VALID_ARCHITECTURES = IA32 X64 LOONGARCH64 RISCV64 # [Sources.Ia32] @@ -46,6 +46,10 @@ LoongArch/LoongArch64/ArchExceptionHandler.c LoongArch/LoongArch64/ExceptionHandlerAsm.S | GCC +[Sources.RISCV64] + RiscV/ExceptionLib.c + RiscV/ExceptionHandler.h + RiscV/ExceptionHandlerAsm.S | GCC [Packages] MdePkg/MdePkg.dec diff --git a/UefiCpuPkg/UefiCpuPkg.ci.yaml b/UefiCpuPkg/UefiCpuPkg.ci.yaml index a6fd1471deac..57867ddf989e 100644 --- a/UefiCpuPkg/UefiCpuPkg.ci.yaml +++ b/UefiCpuPkg/UefiCpuPkg.ci.yaml @@ -30,7 +30,6 @@ ], ## Both file path and directory path are accepted. "IgnoreFiles": [ - "Library/BaseRiscV64CpuExceptionHandlerLib/CpuExceptionHandlerLib.h" ] }, "CompilerPlugin": { diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc index aac466848f72..e011b1839dfe 100644 --- a/UefiCpuPkg/UefiCpuPkg.dsc +++ b/UefiCpuPkg/UefiCpuPkg.dsc @@ -218,7 +218,6 @@ UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionHandlerLibUnitTest.inf [Components.RISCV64] - UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.inf UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/BaseRiscV64CpuTimerLib.inf UefiCpuPkg/Library/BaseRiscVMmuLib/BaseRiscVMmuLib.inf UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerDxeRiscV64.inf From 3a06b5dac989573c4d2a568ec7b961ebadb12f86 Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Wed, 25 Jun 2025 10:31:07 -0700 Subject: [PATCH 0296/1172] OvmfPkg/RiscVVirt/PlatformSecLib: Clear s0 (fp) at entry point Scrub s0 (fp) to prevent stack tracing from extending beyond the Sec code. Signed-off-by: Andrei Warkentin --- OvmfPkg/RiscVVirt/Library/PlatformSecLib/SecEntry.S | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OvmfPkg/RiscVVirt/Library/PlatformSecLib/SecEntry.S b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/SecEntry.S index de42a9026e2e..b52becdb29cf 100644 --- a/OvmfPkg/RiscVVirt/Library/PlatformSecLib/SecEntry.S +++ b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/SecEntry.S @@ -8,6 +8,9 @@ #include "PlatformSecLib.h" ASM_FUNC (_ModuleEntryPoint) +/* Prevent stack unwinding from going further */ +li s0, 0 + /* Use Temp memory as the stack for calling to C code */ li a2, FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) li a3, FixedPcdGet32 (PcdOvmfSecPeiTempRamSize) From aee4d29d56ddeafc34f9e9144ec3028bd749ec96 Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Fri, 27 Jun 2025 11:18:43 -0700 Subject: [PATCH 0297/1172] BaseTools/tools_def: Enable frame pointer for RISC-V Add -fno-omit-frame-pointer to RISC-V targets to ensure frame pointers are preserved, supporting stack backtraces for debugging. Signed-off-by: Tuan Phan --- BaseTools/Conf/tools_def.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index a59fe5b3e288..0caa1c90018f 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -1026,7 +1026,7 @@ DEFINE GCC5_ARM_ASLDLINK_FLAGS = DEF(GCC49_ARM_ASLDLINK_FLAGS) DEF(GCC5_DL DEFINE GCC5_AARCH64_ASLDLINK_FLAGS = DEF(GCC49_AARCH64_ASLDLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS) DEFINE GCC5_ASLCC_FLAGS = DEF(GCC49_ASLCC_FLAGS) -fno-lto -DEFINE GCC5_RISCV_ALL_CC_FLAGS = -g -fshort-wchar -fno-strict-aliasing -Wall -Werror -Wno-array-bounds -ffunction-sections -fdata-sections -include AutoGen.h -fno-common -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings -msmall-data-limit=0 +DEFINE GCC5_RISCV_ALL_CC_FLAGS = -g -fshort-wchar -fno-omit-frame-pointer -fno-strict-aliasing -Wall -Werror -Wno-array-bounds -ffunction-sections -fdata-sections -include AutoGen.h -fno-common -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings -msmall-data-limit=0 DEFINE GCC5_RISCV_ALL_DLINK_COMMON = -nostdlib -Wl,-n,-q,--gc-sections -z common-page-size=0x40 DEF(GCC5_DLINK_WARNING_FLAGS) DEFINE GCC5_RISCV_ALL_DLINK_FLAGS = DEF(GCC5_RISCV_ALL_DLINK_COMMON) -Wl,--entry,$(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT) -Wl,-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map DEFINE GCC5_RISCV_ALL_DLINK2_FLAGS = -Wl,--defsym=PECOFF_HEADER_SIZE=0x220,--script=$(EDK_TOOLS_PATH)/Scripts/GccBase.lds From 4052e8f15589bba9b386ed0fa6082f377074cb84 Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Fri, 18 Jul 2025 15:38:14 -0700 Subject: [PATCH 0298/1172] UefiCpuPkg: CpuExceptionHandlerLib: RISC-V: Support backtrace Add support for backtrace in DEBUG builds for RISC-V. Signed-off-by: Tuan Phan --- .../DxeCpuExceptionHandlerLib.inf | 6 + .../CpuExceptionHandlerLib/RiscV/Backtrace.c | 175 ++++++++++++++++++ .../CpuExceptionHandlerLib/RiscV/Backtrace.h | 57 ++++++ .../RiscV/BacktraceHelper.c | 71 +++++++ .../RiscV/BacktraceHelperSec.c | 42 +++++ .../RiscV/ExceptionLib.c | 16 ++ .../SecPeiCpuExceptionHandlerLib.inf | 3 + 7 files changed, 370 insertions(+) create mode 100644 UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/Backtrace.c create mode 100644 UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/Backtrace.h create mode 100644 UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/BacktraceHelper.c create mode 100644 UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/BacktraceHelperSec.c diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf b/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf index 314143b29463..9e0b54ec78ee 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf @@ -47,6 +47,9 @@ LoongArch/LoongArch64/ExceptionHandlerAsm.S | GCC [Sources.RISCV64] + RiscV/Backtrace.h + RiscV/Backtrace.c + RiscV/BacktraceHelper.c RiscV/ExceptionLib.c RiscV/ExceptionHandler.h RiscV/ExceptionHandlerAsm.S | GCC @@ -80,5 +83,8 @@ [LibraryClasses.LoongArch64] CpuLib +[Guids.RISCV64] + gEfiDebugImageInfoTableGuid + [BuildOptions] XCODE:*_*_X64_NASM_FLAGS = -D NO_ABSOLUTE_RELOCS_IN_TEXT diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/Backtrace.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/Backtrace.c new file mode 100644 index 000000000000..9765d721e536 --- /dev/null +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/Backtrace.c @@ -0,0 +1,175 @@ +/** @file + RISC-V backtrace implementation. + + Copyright (c) 2016 - 2022, Hewlett Packard Enterprise Development LP. All rights reserved.
+ Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.
+ Copyright (c) 2023, Intel Corporation. All rights reserved.
+ Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "Backtrace.h" + +#define MAX_STACK_FRAME_SIZE SIZE_16KB + +STATIC +INTN +CheckFpValid ( + IN UINTN Fp, + IN UINTN Sp + ) +{ + UINTN Low, High; + + Low = Sp + 2 * sizeof (UINTN); + High = ALIGN_VALUE (Sp, MAX_STACK_FRAME_SIZE); + + return !(Fp < Low || Fp > High || Fp & 0x07); +} + +STATIC +CONST CHAR8 * +BaseName ( + IN CONST CHAR8 *FullName + ) +{ + CONST CHAR8 *Str; + + Str = FullName + AsciiStrLen (FullName); + + while (--Str > FullName) { + if ((*Str == '/') || (*Str == '\\')) { + return Str + 1; + } + } + + return Str; +} + +/** + Helper for displaying a backtrace. + + @param Regs Pointer to SMODE_TRAP_REGISTERS. + @param FirstPdb Pointer to the first symbol file used. + @param ListImage If true, only show the full path to symbol file, else + show the PC value and its decoded components. +**/ +STATIC +VOID +DumpCpuBacktraceHelper ( + IN SMODE_TRAP_REGISTERS *Regs, + IN CHAR8 *FirstPdb, + IN BOOLEAN ListImage + ) +{ + UINTN ImageBase; + UINTN PeCoffSizeOfHeader; + BOOLEAN IsLeaf; + UINTN RootFp; + UINTN RootRa; + UINTN Sp; + UINTN Fp; + UINTN Ra; + UINTN Idx; + CHAR8 *Pdb; + CHAR8 *PrevPdb; + + RootRa = Regs->ra; + RootFp = Regs->s0; + + Idx = 0; + IsLeaf = TRUE; + Fp = RootFp; + Ra = RootRa; + PrevPdb = FirstPdb; + while (Fp != 0) { + Pdb = GetImageName (Ra, &ImageBase, &PeCoffSizeOfHeader); + if (Pdb != NULL) { + if (Pdb != PrevPdb) { + Idx++; + if (ListImage) { + DEBUG ((DEBUG_ERROR, "[% 2d] %a\n", Idx, Pdb)); + } + + PrevPdb = Pdb; + } + + if (!ListImage) { + DEBUG (( + DEBUG_ERROR, + "PC 0x%012lx (0x%012lx+0x%08x) [% 2d] %a\n", + Ra, + ImageBase, + Ra - ImageBase, + Idx, + BaseName (Pdb) + )); + } + } else if (!ListImage) { + DEBUG ((DEBUG_ERROR, "PC 0x%012lx\n", Ra)); + } + + /* + * After the prologue, the frame pointer register s0 will point + * to the Canonical Frame Address or CFA, which is the stack + * pointer value on entry to the current procedure. The previous + * frame pointer and return address pair will reside just prior + * to the current stack address held in s0. This puts the return + * address at s0 - XLEN/8, and the previous frame pointer at + * s0 - 2 * XLEN/8. + */ + Sp = Fp; + Fp -= sizeof (UINTN) * 2; + Ra = *(UINTN *)(Fp + sizeof (UINTN)); + Fp = *(UINTN *)(Fp); + if (IsLeaf && CheckFpValid (Ra, Sp)) { + /* We hit function where ra is not saved on the stack */ + Fp = Ra; + Ra = RootRa; + } + + IsLeaf = FALSE; + } +} + +/** + Display a backtrace. + + @param SystemContext Pointer to EFI_SYSTEM_CONTEXT. +**/ +VOID +EFIAPI +DumpCpuBacktrace ( + IN EFI_SYSTEM_CONTEXT SystemContext + ) +{ + SMODE_TRAP_REGISTERS *Regs; + CHAR8 *Pdb; + UINTN ImageBase; + UINTN PeCoffSizeOfHeader; + + Regs = (SMODE_TRAP_REGISTERS *)SystemContext.SystemContextRiscV64; + Pdb = GetImageName (Regs->sepc, &ImageBase, &PeCoffSizeOfHeader); + if (Pdb != NULL) { + DEBUG (( + DEBUG_ERROR, + "PC 0x%012lx (0x%012lx+0x%08x) [ 0] %a\n", + Regs->sepc, + ImageBase, + Regs->sepc - ImageBase, + BaseName (Pdb) + )); + } else { + DEBUG ((DEBUG_ERROR, "PC 0x%012lx\n", Regs->sepc)); + } + + DumpCpuBacktraceHelper (Regs, Pdb, FALSE); + + if (Pdb != NULL) { + DEBUG ((DEBUG_ERROR, "\n[ 0] %a\n", Pdb)); + } + + DumpCpuBacktraceHelper (Regs, Pdb, TRUE); +} diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/Backtrace.h b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/Backtrace.h new file mode 100644 index 000000000000..6e29b9080f0c --- /dev/null +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/Backtrace.h @@ -0,0 +1,57 @@ +/** @file + + RISC-V backtrace definition file. + + Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef BACKTRACE_H_ +#define BACKTRACE_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "ExceptionHandler.h" + +/** + Use the EFI Debug Image Table to lookup the FaultAddress and find which PE/COFF image + it came from. As long as the PE/COFF image contains a debug directory entry a + string can be returned. For ELF and Mach-O images the string points to the Mach-O or ELF + image. Microsoft tools contain a pointer to the PDB file that contains the debug information. + + @param FaultAddress Address to find PE/COFF image for. + @param ImageBase Return load address of found image + @param PeCoffSizeOfHeaders Return the size of the PE/COFF header for the image that was found + + @retval NULL FaultAddress not in a loaded PE/COFF image. + @retval Path and file name of PE/COFF image. + +**/ +CHAR8 * +EFIAPI +GetImageName ( + IN UINTN FaultAddress, + OUT UINTN *ImageBase, + OUT UINTN *PeCoffSizeOfHeaders + ); + +/** + Display a backtrace. + + @param SystemContext Pointer to EFI_SYSTEM_CONTEXT. +**/ +VOID +EFIAPI +DumpCpuBacktrace ( + IN EFI_SYSTEM_CONTEXT SystemContext + ); + +#endif // BACKTRACE_H_ diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/BacktraceHelper.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/BacktraceHelper.c new file mode 100644 index 000000000000..fdc56669aee2 --- /dev/null +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/BacktraceHelper.c @@ -0,0 +1,71 @@ +/** @file + RISC-V backtrace helper functions. + + Copyright (c) 2016 - 2022, Hewlett Packard Enterprise Development LP. All rights reserved.
+ Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.
+ Copyright (c) 2023, Intel Corporation. All rights reserved.
+ Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "Backtrace.h" + +/** + Use the EFI Debug Image Table to lookup the FaultAddress and find which PE/COFF image + it came from. As long as the PE/COFF image contains a debug directory entry a + string can be returned. For ELF and Mach-O images the string points to the Mach-O or ELF + image. Microsoft tools contain a pointer to the PDB file that contains the debug information. + + @param FaultAddress Address to find PE/COFF image for. + @param ImageBase Return load address of found image + @param PeCoffSizeOfHeaders Return the size of the PE/COFF header for the image that was found + + @retval NULL FaultAddress not in a loaded PE/COFF image. + @retval Path and file name of PE/COFF image. + +**/ +CHAR8 * +EFIAPI +GetImageName ( + IN UINTN FaultAddress, + OUT UINTN *ImageBase, + OUT UINTN *PeCoffSizeOfHeaders + ) +{ + EFI_STATUS Status; + EFI_DEBUG_IMAGE_INFO_TABLE_HEADER *DebugTableHeader; + EFI_DEBUG_IMAGE_INFO *DebugTable; + UINTN Entry; + CHAR8 *Address; + + Status = EfiGetSystemConfigurationTable (&gEfiDebugImageInfoTableGuid, (VOID **)&DebugTableHeader); + if (EFI_ERROR (Status)) { + return NULL; + } + + DebugTable = DebugTableHeader->EfiDebugImageInfoTable; + if (DebugTable == NULL) { + return NULL; + } + + Address = (CHAR8 *)(UINTN)FaultAddress; + for (Entry = 0; Entry < DebugTableHeader->TableSize; Entry++, DebugTable++) { + if (DebugTable->NormalImage != NULL) { + if ((DebugTable->NormalImage->ImageInfoType == EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL) && + (DebugTable->NormalImage->LoadedImageProtocolInstance != NULL)) + { + if ((Address >= (CHAR8 *)DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase) && + (Address <= ((CHAR8 *)DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase + DebugTable->NormalImage->LoadedImageProtocolInstance->ImageSize))) + { + *ImageBase = (UINTN)DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase; + *PeCoffSizeOfHeaders = PeCoffGetSizeOfHeaders ((VOID *)(UINTN)*ImageBase); + return PeCoffLoaderGetPdbPointer (DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase); + } + } + } + } + + return NULL; +} diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/BacktraceHelperSec.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/BacktraceHelperSec.c new file mode 100644 index 000000000000..10e3497bfe27 --- /dev/null +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/BacktraceHelperSec.c @@ -0,0 +1,42 @@ +/** @file + RISC-V backtrace helper functions for SEC. + + Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "Backtrace.h" + +/** + Use the EFI Debug Image Table to lookup the FaultAddress and find which PE/COFF image + it came from. As long as the PE/COFF image contains a debug directory entry a + string can be returned. For ELF and Mach-O images the string points to the Mach-O or ELF + image. Microsoft tools contain a pointer to the PDB file that contains the debug information. + + @param FaultAddress Address to find PE/COFF image for. + @param ImageBase Return load address of found image + @param PeCoffSizeOfHeaders Return the size of the PE/COFF header for the image that was found + + @retval NULL FaultAddress not in a loaded PE/COFF image. + @retval Path and file name of PE/COFF image. + +**/ +CHAR8 * +EFIAPI +GetImageName ( + IN UINTN FaultAddress, + OUT UINTN *ImageBase, + OUT UINTN *PeCoffSizeOfHeaders + ) +{ + // + // This function is not implemented in SEC phase. + // It should be implemented in DXE phase. + // + *ImageBase = 0; + *PeCoffSizeOfHeaders = 0; + + return NULL; +} diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionLib.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionLib.c index 48f57f6c5a30..d19c99234dfb 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionLib.c +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/RiscV/ExceptionLib.c @@ -2,6 +2,9 @@ RISC-V Exception Handler library implementation. Copyright (c) 2016 - 2022, Hewlett Packard Enterprise Development LP. All rights reserved.
+ Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.
+ Copyright (c) 2023, Intel Corporation. All rights reserved.
+ Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -14,6 +17,7 @@ #include #include #include +#include "Backtrace.h" #include "ExceptionHandler.h" // @@ -136,11 +140,21 @@ DumpCpuContext ( ) { UINTN Printed; + UINTN RecursiveException; SMODE_TRAP_REGISTERS *Regs; Printed = 0; Regs = (SMODE_TRAP_REGISTERS *)SystemContext.SystemContextRiscV64; + RecursiveException = RiscVGetSupervisorScratch (); + if (RecursiveException == 0xdeaddead) { + InternalPrintMessage ("\nRecursive exception occurred while dumping the CPU state\n"); + + CpuDeadLoop (); + } + + RiscVSetSupervisorScratch ((UINTN)0xdeaddead); + InternalPrintMessage ( "!!!! RISCV64 Exception Type - %016x(%a) !!!!\n", ExceptionType, @@ -171,6 +185,8 @@ DumpCpuContext ( #undef REG #undef REGS + DumpCpuBacktrace (SystemContext); + DEBUG_CODE_END (); } diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf index cc872e12b06f..00a5b495e0cc 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf @@ -47,6 +47,9 @@ LoongArch/LoongArch64/ExceptionHandlerAsm.S | GCC [Sources.RISCV64] + RiscV/Backtrace.h + RiscV/Backtrace.c + RiscV/BacktraceHelperSec.c RiscV/ExceptionLib.c RiscV/ExceptionHandler.h RiscV/ExceptionHandlerAsm.S | GCC From 04fe3f50d63c0427fb7c4e6a45b48f487e985c5a Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Fri, 18 Jul 2025 15:40:03 -0700 Subject: [PATCH 0299/1172] OvmfPkg/RiscVVirt: Adopt New CpuExceptionHandlerLib Utilize the updated CpuExceptionHandlerLib, which now includes RISC-V support. Signed-off-by: Tuan Phan --- OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc b/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc index 4c3eff7772fc..47248f23127a 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc +++ b/OvmfPkg/RiscVVirt/RiscVVirt.dsc.inc @@ -79,7 +79,6 @@ !endif # RISC-V Architectural Libraries - CpuExceptionHandlerLib|UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExceptionHandlerLib.inf RiscVSbiLib|MdePkg/Library/BaseRiscVSbiLib/BaseRiscVSbiLib.inf RiscVMmuLib|UefiCpuPkg/Library/BaseRiscVMmuLib/BaseRiscVMmuLib.inf PlatformBootManagerLib|OvmfPkg/RiscVVirt/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf @@ -153,6 +152,7 @@ PrePiHobListPointerLib|OvmfPkg/RiscVVirt/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf PrePiLib|EmbeddedPkg/Library/PrePiLib/PrePiLib.inf MemoryAllocationLib|EmbeddedPkg/Library/PrePiMemoryAllocationLib/PrePiMemoryAllocationLib.inf + CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf [LibraryClasses.common.PEI_CORE] HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf @@ -163,6 +163,7 @@ ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf PeiResourcePublicationLib|MdePkg/Library/PeiResourcePublicationLib/PeiResourcePublicationLib.inf ExtractGuidedSectionLib|MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf + CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf [LibraryClasses.common.PEIM] HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf @@ -174,16 +175,19 @@ ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf PeiResourcePublicationLib|MdePkg/Library/PeiResourcePublicationLib/PeiResourcePublicationLib.inf ExtractGuidedSectionLib|MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf + CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf [LibraryClasses.common.DXE_CORE] PerformanceLib|MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf MemoryAllocationLib|MdeModulePkg/Library/DxeCoreMemoryAllocationLib/DxeCoreMemoryAllocationLib.inf DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf + CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf [LibraryClasses.common.DXE_DRIVER] SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf + CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf [LibraryClasses.common.UEFI_APPLICATION] MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf From c27552f3431df4580cdd56410b125a579b7201f1 Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Mon, 21 Jul 2025 15:41:46 -0700 Subject: [PATCH 0300/1172] ShellPkg: Shell Validate parameter before use. When FvSimpleFileSystem is included in a firmware image, the FV is accessible as a simple file system. Shell contained a bad assumption that the FileDevicepath, the path where the efi shell was loaded from, was always a Media device path/media vendor device path. It would make a blind cast of the device path node. Add a check to verify device path type/subtype before casting the node to a FILEPATH_DEVICE_PATH. Signed-off-by: Aaron Pop --- ShellPkg/Application/Shell/Shell.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ShellPkg/Application/Shell/Shell.c b/ShellPkg/Application/Shell/Shell.c index 483fe4df5da3..ae3e94368bd9 100644 --- a/ShellPkg/Application/Shell/Shell.c +++ b/ShellPkg/Application/Shell/Shell.c @@ -1262,9 +1262,11 @@ LocateStartupScript ( InternalEfiShellSetEnv (L"homefilesystem", StartupScriptPath, TRUE); - StartupScriptPath = StrnCatGrow (&StartupScriptPath, &Size, ((FILEPATH_DEVICE_PATH *)FileDevicePath)->PathName, 0); - PathRemoveLastItem (StartupScriptPath); - StartupScriptPath = StrnCatGrow (&StartupScriptPath, &Size, mStartupScript, 0); + if ((DevicePathType (FileDevicePath) == MEDIA_DEVICE_PATH) && (DevicePathSubType (FileDevicePath) == MEDIA_FILEPATH_DP)) { + StartupScriptPath = StrnCatGrow (&StartupScriptPath, &Size, ((FILEPATH_DEVICE_PATH *)FileDevicePath)->PathName, 0); + PathRemoveLastItem (StartupScriptPath); + StartupScriptPath = StrnCatGrow (&StartupScriptPath, &Size, mStartupScript, 0); + } } // From c37e2d38d6019b44ee8e56209027c717eb3f1f32 Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Thu, 3 Jul 2025 18:36:01 +0200 Subject: [PATCH 0301/1172] OvmfPkg/PlatformPei: record "etc/msr_feature_control" presence explicitly A zero "FeatureControlValue" currently means "no feature control, or feature control with zero value". Distinguish both cases by explicitly recording the presence of the "etc/msr_feature_control" fw_cfg file. This will be helpful later in this series, when we won't want to touch fw_cfg again, but still know if "etc/msr_feature_control" was read OK. Signed-off-by: Laszlo Ersek --- OvmfPkg/Include/Library/PlatformInitLib.h | 1 + OvmfPkg/PlatformPei/FeatureControl.c | 1 + 2 files changed, 2 insertions(+) diff --git a/OvmfPkg/Include/Library/PlatformInitLib.h b/OvmfPkg/Include/Library/PlatformInitLib.h index 2d9c662e37fb..dc0c280a4857 100644 --- a/OvmfPkg/Include/Library/PlatformInitLib.h +++ b/OvmfPkg/Include/Library/PlatformInitLib.h @@ -64,6 +64,7 @@ typedef struct { UINT32 S3AcpiReservedMemoryBase; UINT32 S3AcpiReservedMemorySize; + BOOLEAN FeatureControl; UINT64 FeatureControlValue; BOOLEAN QemuFwCfgChecked; diff --git a/OvmfPkg/PlatformPei/FeatureControl.c b/OvmfPkg/PlatformPei/FeatureControl.c index d2ec496b74a8..749a07cd7515 100644 --- a/OvmfPkg/PlatformPei/FeatureControl.c +++ b/OvmfPkg/PlatformPei/FeatureControl.c @@ -143,6 +143,7 @@ InstallFeatureControlCallback ( return; } + PlatformInfoHob->FeatureControl = TRUE; QemuFwCfgSelectItem (FwCfgItem); QemuFwCfgReadBytes ( sizeof (PlatformInfoHob->FeatureControlValue), From f92ba13a665701537193798f7bcaf65398ac6180 Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Thu, 3 Jul 2025 19:04:24 +0200 Subject: [PATCH 0302/1172] OvmfPkg/CpuHotplugSmm: add whitespace In a subsequent patch, we'll introduce fields with long names to "FIRST_SMI_HANDLER_CONTEXT". Make room for those field names in "FirstSmiHandler.nasm". "git show -b" produces no patch output for this commit. Signed-off-by: Laszlo Ersek --- OvmfPkg/CpuHotplugSmm/FirstSmiHandler.nasm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OvmfPkg/CpuHotplugSmm/FirstSmiHandler.nasm b/OvmfPkg/CpuHotplugSmm/FirstSmiHandler.nasm index 5399b5fa4387..20e0b0c34b18 100644 --- a/OvmfPkg/CpuHotplugSmm/FirstSmiHandler.nasm +++ b/OvmfPkg/CpuHotplugSmm/FirstSmiHandler.nasm @@ -41,9 +41,9 @@ SMM_DEFAULT_SMBASE: equ 0x3_0000 ; Field offsets in FIRST_SMI_HANDLER_CONTEXT, which resides at ; SMM_DEFAULT_SMBASE. ; -ApicIdGate: equ 0 ; UINT64 -NewSmbase: equ 8 ; UINT32 -AboutToLeaveSmm: equ 12 ; UINT8 +ApicIdGate: equ 0 ; UINT64 +NewSmbase: equ 8 ; UINT32 +AboutToLeaveSmm: equ 12 ; UINT8 ; ; SMRAM Save State Map field offsets, per the AMD (not Intel) layout that QEMU From 0e814e829e5fb901a89937340a470ab3cda83de7 Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Thu, 3 Jul 2025 19:40:59 +0200 Subject: [PATCH 0303/1172] OvmfPkg/CpuHotplugSmm: set MSR_IA32_FEATURE_CONTROL in first SMI handler Introduce new fields to FIRST_SMI_HANDLER_CONTEXT: - a UINT8 (effectively: boolean) value that controls whether the first SMI handler of the hot-added CPU is supposed to set MSR_IA32_FEATURE_CONTROL, - and for when that is the case, two UINT32 values, for passing the desired EDX:EAX (64-bit) MSR value. MSR_IA32_FEATURE_CONTROL might as well be settable in the post-SMM pen ("PostSmmPen.nasm"); however, I find the first SMI handler better for this purpose: - we already have a nice context structure we can extend, - in SMM, we have tighter control than after SMM (see the comments near the top of "PostSmmPen.nasm"). MSR_IA32_FEATURE_CONTROL is orthogonal to the SMRAM State Save Map, and WRMSR is permitted in the real mode-like initial environment of SMM, so functionally speaking, this should be fine. For now, the feature is disabled. Signed-off-by: Laszlo Ersek --- OvmfPkg/CpuHotplugSmm/FirstSmiHandler.nasm | 22 ++++++++++++++++++- .../CpuHotplugSmm/FirstSmiHandlerContext.h | 8 +++++++ OvmfPkg/CpuHotplugSmm/Smbase.c | 5 ++++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/OvmfPkg/CpuHotplugSmm/FirstSmiHandler.nasm b/OvmfPkg/CpuHotplugSmm/FirstSmiHandler.nasm index 20e0b0c34b18..b38f94c5e0f8 100644 --- a/OvmfPkg/CpuHotplugSmm/FirstSmiHandler.nasm +++ b/OvmfPkg/CpuHotplugSmm/FirstSmiHandler.nasm @@ -43,7 +43,10 @@ SMM_DEFAULT_SMBASE: equ 0x3_0000 ; ApicIdGate: equ 0 ; UINT64 NewSmbase: equ 8 ; UINT32 -AboutToLeaveSmm: equ 12 ; UINT8 +FeatureControlHighValue: equ 12 ; UINT32 +FeatureControlLowValue: equ 16 ; UINT32 +FeatureControl: equ 20 ; UINT8 +AboutToLeaveSmm: equ 21 ; UINT8 ; ; SMRAM Save State Map field offsets, per the AMD (not Intel) layout that QEMU @@ -60,6 +63,11 @@ CPUID_SIGNATURE: equ 0x00 CPUID_EXTENDED_TOPOLOGY: equ 0x0B CPUID_VERSION_INFO: equ 0x01 +; +; MSR constants, from "MdePkg/Include/Register/Intel/ArchitecturalMsr.h". +; +MSR_IA32_FEATURE_CONTROL: equ 0x0000003A + GLOBAL ASM_PFX (mFirstSmiHandler) ; UINT8[] GLOBAL ASM_PFX (mFirstSmiHandlerSize) ; UINT16 @@ -141,6 +149,18 @@ UpdateSmbase: ; Save it to the SMBASE field whose address we calculated in EBX. ; mov dword [ds : dword ebx], eax + + ; + ; Set MSR_IA32_FEATURE_CONTROL if requested. + ; + cmp byte [ds : dword (SMM_DEFAULT_SMBASE + FeatureControl)], 0 + je NoFeatureControl + mov ecx, MSR_IA32_FEATURE_CONTROL + mov edx, dword [ds : dword (SMM_DEFAULT_SMBASE + FeatureControlHighValue)] + mov eax, dword [ds : dword (SMM_DEFAULT_SMBASE + FeatureControlLowValue)] + wrmsr + +NoFeatureControl: ; ; Set AboutToLeaveSmm. ; diff --git a/OvmfPkg/CpuHotplugSmm/FirstSmiHandlerContext.h b/OvmfPkg/CpuHotplugSmm/FirstSmiHandlerContext.h index 6039532fd8a4..0c6deed4d815 100644 --- a/OvmfPkg/CpuHotplugSmm/FirstSmiHandlerContext.h +++ b/OvmfPkg/CpuHotplugSmm/FirstSmiHandlerContext.h @@ -36,6 +36,14 @@ typedef struct { // UINT32 NewSmbase; // + // The High:Low value for the hot-added CPU to store in + // MSR_IA32_FEATURE_CONTROL, assuming MSR_IA32_FEATURE_CONTROL setting is + // enabled (i.e., if "FeatureControl" is nonzero). + // + UINT32 FeatureControlHighValue; + UINT32 FeatureControlLowValue; + UINT8 FeatureControl; + // // The hot-added CPU sets this field to 1 right before executing the RSM // instruction. This tells the SMM Monarch to proceed to polling the last // byte of the normal RAM reserved page (Post-SMM Pen). diff --git a/OvmfPkg/CpuHotplugSmm/Smbase.c b/OvmfPkg/CpuHotplugSmm/Smbase.c index dc6f4f4b4994..2fd3ffb0b03d 100644 --- a/OvmfPkg/CpuHotplugSmm/Smbase.c +++ b/OvmfPkg/CpuHotplugSmm/Smbase.c @@ -132,7 +132,8 @@ SmbaseReleasePostSmmPen ( Note that this effects an "SMRAM to SMRAM" copy. - Additionally, shut the APIC ID gate in FIRST_SMI_HANDLER_CONTEXT. + Additionally, shut the APIC ID gate in FIRST_SMI_HANDLER_CONTEXT, and prepare + for configuring MSR_IA32_FEATURE_CONTROL. This function may only be called from the entry point function of the driver, and only after PcdQ35SmramAtDefaultSmbase has been determined to be TRUE. @@ -152,6 +153,8 @@ SmbaseInstallFirstSmiHandler ( Context = (VOID *)(UINTN)SMM_DEFAULT_SMBASE; Context->ApicIdGate = MAX_UINT64; + + Context->FeatureControl = 0; } /** From 43d696a3667a808dbe9117cf8131dbfa64dcf631 Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Thu, 3 Jul 2025 20:34:03 +0200 Subject: [PATCH 0304/1172] OvmfPkg/CpuHotplugSmm: hook up MSR_IA32_FEATURE_CONTROL with platform info Map the feature control MSR config from the OVMF platform info HOB to FIRST_SMI_HANDLER_CONTEXT. (Note that CpuHotplugSmm already consumes -- indirectly -- the "MdePkg/Library/DxeHobLib/DxeHobLib.inf" library instance, according to the build report; therefore adding an explicit HobLib class dependency shouldn't *generally* increase this SMM driver's exposure. The consumed lib instances are the same before and after this patch, at least in "OvmfPkgIa32X64.dsc".) Fixes: https://github.com/tianocore/edk2/issues/11188 Signed-off-by: Laszlo Ersek --- OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf | 4 ++++ OvmfPkg/CpuHotplugSmm/Smbase.c | 21 ++++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf b/OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf index ebcc7e2ac63a..099696801629 100644 --- a/OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf +++ b/OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf @@ -42,6 +42,7 @@ BaseMemoryLib CpuLib DebugLib + HobLib LocalApicLib MmServicesTableLib PcdLib @@ -53,6 +54,9 @@ gEfiMmCpuIoProtocolGuid ## CONSUMES gEfiSmmCpuServiceProtocolGuid ## CONSUMES +[Guids] + gUefiOvmfPkgPlatformInfoGuid ## CONSUMES + [Pcd] gUefiCpuPkgTokenSpaceGuid.PcdCpuHotPlugDataAddress ## CONSUMES gUefiOvmfPkgTokenSpaceGuid.PcdCpuHotEjectDataAddress ## CONSUMES diff --git a/OvmfPkg/CpuHotplugSmm/Smbase.c b/OvmfPkg/CpuHotplugSmm/Smbase.c index 2fd3ffb0b03d..433633df985f 100644 --- a/OvmfPkg/CpuHotplugSmm/Smbase.c +++ b/OvmfPkg/CpuHotplugSmm/Smbase.c @@ -10,7 +10,9 @@ #include // CpuPause() #include // CopyMem() #include // DEBUG() +#include // GetFirstGuidHob() #include // SendInitSipiSipi() +#include // EFI_HOB_PLATFORM_INFO #include // InterlockedCompareExchange64() #include // SMM_DEFAULT_SMBASE @@ -133,7 +135,9 @@ SmbaseReleasePostSmmPen ( Note that this effects an "SMRAM to SMRAM" copy. Additionally, shut the APIC ID gate in FIRST_SMI_HANDLER_CONTEXT, and prepare - for configuring MSR_IA32_FEATURE_CONTROL. + for configuring MSR_IA32_FEATURE_CONTROL. (The latter depends on a GUID HOB, + which does not live in SMRAM; however, if we can't trust the HOB list at this + stage, we're doomed anyway.) This function may only be called from the entry point function of the driver, and only after PcdQ35SmramAtDefaultSmbase has been determined to be TRUE. @@ -144,6 +148,7 @@ SmbaseInstallFirstSmiHandler ( ) { FIRST_SMI_HANDLER_CONTEXT *Context; + EFI_HOB_GUID_TYPE *GuidHob; CopyMem ( (VOID *)(UINTN)(SMM_DEFAULT_SMBASE + SMM_HANDLER_OFFSET), @@ -155,6 +160,20 @@ SmbaseInstallFirstSmiHandler ( Context->ApicIdGate = MAX_UINT64; Context->FeatureControl = 0; + GuidHob = GetFirstGuidHob (&gUefiOvmfPkgPlatformInfoGuid); + if (GuidHob != NULL) { + EFI_HOB_PLATFORM_INFO *Info; + + Info = GET_GUID_HOB_DATA (GuidHob); + if (Info->FeatureControl) { + Context->FeatureControlHighValue = (UINT32)RShiftU64 ( + Info->FeatureControlValue, + 32 + ); + Context->FeatureControlLowValue = (UINT32)Info->FeatureControlValue; + Context->FeatureControl = 1; + } + } } /** From 1ec1f5d711b47a9f9aca86b4089f21af4c8a17ac Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Thu, 17 Jul 2025 11:00:24 -0700 Subject: [PATCH 0305/1172] MdeModulePkg: Always Print Driver Load Messages Today, DXE/PEI/SMM Core's image loaders only print driver load messages if debug code is enabled. However, these are some of the most important prints in the codebase: on a given system even if you have nothing else to debug with, you can see the last driver executed. Debug code blocks are used to skip logic that only exists for debug purposes and wastes time on a release build. However, the logic to print a line and determine the filename from the PDB is not extensive and provides critical information, so it is inappropriate to wrap in a debug code section. Platforms can still choose to disable logging at DEBUG_INFO/DEBUG_LOAD and will not see the error messages. Signed-off-by: Oliver Smith-Denny --- MdeModulePkg/Core/Dxe/Image/Image.c | 11 +++-------- MdeModulePkg/Core/Pei/Image/Image.c | 12 ++++-------- MdeModulePkg/Core/PiSmmCore/Dispatcher.c | 11 +++-------- 3 files changed, 10 insertions(+), 24 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Image/Image.c b/MdeModulePkg/Core/Dxe/Image/Image.c index 8d12f93d7f95..323139e1abd5 100644 --- a/MdeModulePkg/Core/Dxe/Image/Image.c +++ b/MdeModulePkg/Core/Dxe/Image/Image.c @@ -584,6 +584,9 @@ CoreLoadPeImage ( EFI_STATUS Status; BOOLEAN DstBufAlocated; UINTN Size; + UINTN Index; + UINTN StartIndex; + CHAR8 EfiFileName[256]; ZeroMem (&Image->ImageContext, sizeof (Image->ImageContext)); @@ -823,12 +826,6 @@ CoreLoadPeImage ( // Print the load address and the PDB file name if it is available // - DEBUG_CODE_BEGIN (); - - UINTN Index; - UINTN StartIndex; - CHAR8 EfiFileName[256]; - DEBUG (( DEBUG_INFO | DEBUG_LOAD, "Loading driver at 0x%11p EntryPoint=0x%11p ", @@ -877,8 +874,6 @@ CoreLoadPeImage ( DEBUG ((DEBUG_INFO | DEBUG_LOAD, "\n")); - DEBUG_CODE_END (); - return EFI_SUCCESS; Done: diff --git a/MdeModulePkg/Core/Pei/Image/Image.c b/MdeModulePkg/Core/Pei/Image/Image.c index cee9f09c6ea6..24df09cbf3b7 100644 --- a/MdeModulePkg/Core/Pei/Image/Image.c +++ b/MdeModulePkg/Core/Pei/Image/Image.c @@ -623,6 +623,10 @@ PeiLoadImageLoadImage ( UINT16 Machine; EFI_SECTION_TYPE SearchType1; EFI_SECTION_TYPE SearchType2; + CHAR8 *AsciiString; + CHAR8 EfiFileName[512]; + INT32 Index; + INT32 StartIndex; *EntryPoint = 0; ImageSize = 0; @@ -706,12 +710,6 @@ PeiLoadImageLoadImage ( *ImageSizeArg = ImageSize; } - DEBUG_CODE_BEGIN (); - CHAR8 *AsciiString; - CHAR8 EfiFileName[512]; - INT32 Index; - INT32 StartIndex; - // // Print debug message: Loading PEIM at 0x12345678 EntryPoint=0x12345688 Driver.efi // @@ -764,8 +762,6 @@ PeiLoadImageLoadImage ( DEBUG ((DEBUG_INFO | DEBUG_LOAD, "%a", EfiFileName)); } - DEBUG_CODE_END (); - DEBUG ((DEBUG_INFO | DEBUG_LOAD, "\n")); return EFI_SUCCESS; diff --git a/MdeModulePkg/Core/PiSmmCore/Dispatcher.c b/MdeModulePkg/Core/PiSmmCore/Dispatcher.c index bb789e58903b..c22759db4416 100644 --- a/MdeModulePkg/Core/PiSmmCore/Dispatcher.c +++ b/MdeModulePkg/Core/PiSmmCore/Dispatcher.c @@ -325,6 +325,9 @@ SmmLoadImage ( EFI_DEVICE_PATH_PROTOCOL *HandleFilePath; EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; PE_COFF_LOADER_IMAGE_CONTEXT ImageContext; + UINTN Index; + UINTN StartIndex; + CHAR8 EfiFileName[256]; PERF_LOAD_IMAGE_BEGIN (DriverEntry->ImageHandle); @@ -664,12 +667,6 @@ SmmLoadImage ( // Print the load address and the PDB file name if it is available // - DEBUG_CODE_BEGIN (); - - UINTN Index; - UINTN StartIndex; - CHAR8 EfiFileName[256]; - DEBUG (( DEBUG_INFO | DEBUG_LOAD, "Loading SMM driver at 0x%11p EntryPoint=0x%11p ", @@ -718,8 +715,6 @@ SmmLoadImage ( DEBUG ((DEBUG_INFO | DEBUG_LOAD, "\n")); - DEBUG_CODE_END (); - // // Free buffer allocated by Fv->ReadSection. // From bcd8509640aa067d01fccc5fbdc021c149b64ebe Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 21 Jul 2025 14:57:04 -0700 Subject: [PATCH 0306/1172] StandaloneMmPkg: Always Print Driver Load Messages Today, StandaloneMM Core's image loader only prints driver load messages if debug code is enabled. However, these are some of the most important prints in the codebase: on a given system even if you have nothing else to debug with, you can see the last driver executed. Debug code blocks are used to skip logic that only exists for debug purposes and wastes time on a release build. However, the logic to print a line and determine the filename from the PDB is not extensive and provides critical information, so it is inappropriate to wrap in a debug code section. Platforms can still choose to disable logging at DEBUG_INFO/DEBUG_LOAD and will not see the error messages. Signed-off-by: Oliver Smith-Denny --- StandaloneMmPkg/Core/Dispatcher.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/StandaloneMmPkg/Core/Dispatcher.c b/StandaloneMmPkg/Core/Dispatcher.c index 821d9d6f455d..4bb74d34744a 100644 --- a/StandaloneMmPkg/Core/Dispatcher.c +++ b/StandaloneMmPkg/Core/Dispatcher.c @@ -143,6 +143,9 @@ MmLoadImage ( UINTN PageCount; EFI_STATUS Status; EFI_PHYSICAL_ADDRESS DstBuffer; + UINTN Index; + UINTN StartIndex; + CHAR8 EfiFileName[256]; DEBUG ((DEBUG_INFO, "MmLoadImage - %g\n", &DriverEntry->FileName)); @@ -254,11 +257,6 @@ MmLoadImage ( // // Print the load address and the PDB file name if it is available // - DEBUG_CODE_BEGIN (); - - UINTN Index; - UINTN StartIndex; - CHAR8 EfiFileName[256]; DEBUG (( DEBUG_INFO | DEBUG_LOAD, @@ -308,8 +306,6 @@ MmLoadImage ( DEBUG ((DEBUG_INFO | DEBUG_LOAD, "\n")); - DEBUG_CODE_END (); - return Status; } From c3479204cc067cceee43410a596ff434f4e9bf41 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Tue, 22 Jul 2025 10:07:45 -0700 Subject: [PATCH 0307/1172] MdeModulePkg: Unify EfiFileName Parsing The various cores all attempt to print the EfiFileName when loading/dispatching drivers, but they are not unified on approach. This commit ensures they are using the same buffer size and the loop parsing variables are unsigned, as we should not have a negative index. Signed-off-by: Oliver Smith-Denny --- MdeModulePkg/Core/Dxe/Image/Image.c | 2 +- MdeModulePkg/Core/Pei/Image/Image.c | 4 ++-- MdeModulePkg/Core/PiSmmCore/Dispatcher.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Image/Image.c b/MdeModulePkg/Core/Dxe/Image/Image.c index 323139e1abd5..71d267b3db5c 100644 --- a/MdeModulePkg/Core/Dxe/Image/Image.c +++ b/MdeModulePkg/Core/Dxe/Image/Image.c @@ -586,7 +586,7 @@ CoreLoadPeImage ( UINTN Size; UINTN Index; UINTN StartIndex; - CHAR8 EfiFileName[256]; + CHAR8 EfiFileName[512]; ZeroMem (&Image->ImageContext, sizeof (Image->ImageContext)); diff --git a/MdeModulePkg/Core/Pei/Image/Image.c b/MdeModulePkg/Core/Pei/Image/Image.c index 24df09cbf3b7..f74406f4e71d 100644 --- a/MdeModulePkg/Core/Pei/Image/Image.c +++ b/MdeModulePkg/Core/Pei/Image/Image.c @@ -625,8 +625,8 @@ PeiLoadImageLoadImage ( EFI_SECTION_TYPE SearchType2; CHAR8 *AsciiString; CHAR8 EfiFileName[512]; - INT32 Index; - INT32 StartIndex; + UINTN Index; + UINTN StartIndex; *EntryPoint = 0; ImageSize = 0; diff --git a/MdeModulePkg/Core/PiSmmCore/Dispatcher.c b/MdeModulePkg/Core/PiSmmCore/Dispatcher.c index c22759db4416..2011db1b3897 100644 --- a/MdeModulePkg/Core/PiSmmCore/Dispatcher.c +++ b/MdeModulePkg/Core/PiSmmCore/Dispatcher.c @@ -327,7 +327,7 @@ SmmLoadImage ( PE_COFF_LOADER_IMAGE_CONTEXT ImageContext; UINTN Index; UINTN StartIndex; - CHAR8 EfiFileName[256]; + CHAR8 EfiFileName[512]; PERF_LOAD_IMAGE_BEGIN (DriverEntry->ImageHandle); From 05c966e8f1139b30724de65a881769e654fa3a9e Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Tue, 22 Jul 2025 10:09:23 -0700 Subject: [PATCH 0308/1172] StandaloneMmPkg: Unify EfiFileName Parsing The various cores all attempt to print the EfiFileName when loading/dispatching drivers, but they are not unified on approach. This commit ensures they are using the same buffer size and the loop parsing variables are unsigned, as we should not have a negative index. Signed-off-by: Oliver Smith-Denny --- StandaloneMmPkg/Core/Dispatcher.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StandaloneMmPkg/Core/Dispatcher.c b/StandaloneMmPkg/Core/Dispatcher.c index 4bb74d34744a..086532e84751 100644 --- a/StandaloneMmPkg/Core/Dispatcher.c +++ b/StandaloneMmPkg/Core/Dispatcher.c @@ -145,7 +145,7 @@ MmLoadImage ( EFI_PHYSICAL_ADDRESS DstBuffer; UINTN Index; UINTN StartIndex; - CHAR8 EfiFileName[256]; + CHAR8 EfiFileName[512]; DEBUG ((DEBUG_INFO, "MmLoadImage - %g\n", &DriverEntry->FileName)); From 690929c45812bb3cdb6d388550c6662ab6f49422 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Tue, 22 Jul 2025 09:35:17 -0700 Subject: [PATCH 0309/1172] SecurityPkg: Tpm2DumpLib: Make All Prints at DEBUG_SECURITY When DEBUG_SECURITY was added, not all prints in Tpm2DeviceLibDTpmDump.c were updated. This commit updates the remaining prints. Signed-off-by: Oliver Smith-Denny --- .../Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c index c83838f2b05a..7b2e449130da 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c @@ -421,7 +421,7 @@ DumpTpmPcrCommand ( // If this is an unrecognized command, we can't go much further. if ((Command != TPM_CC_PCR_Extend) && (Command != TPM_CC_PCR_Event)) { - DEBUG ((DEBUG_WARN, "%a - Unrecognized command! 0x%X\n", __func__, Command)); + DEBUG ((DEBUG_SECURITY, "%a - Unrecognized command! 0x%X\n", __func__, Command)); return; } @@ -461,7 +461,7 @@ DumpTpmPcrCommand ( default: // This algorithm hasn't been programmed yet. We need to bail. - DEBUG ((DEBUG_WARN, "%a - Unknown hash algorithm! 0x%04X\n", __func__, SwapBytes16 (CurrentDigest->hashAlg))); + DEBUG ((DEBUG_SECURITY, "%a - Unknown hash algorithm! 0x%04X\n", __func__, SwapBytes16 (CurrentDigest->hashAlg))); // Zero the count so we can get out of here. DigestCount = 0; break; @@ -635,11 +635,11 @@ DumpTpmInputBlock ( TPM_CC NativeCode; DEBUG ((DEBUG_SECURITY, "\n=== BEGIN TPM COMMAND ===\n")); - DEBUG ((DEBUG_VERBOSE, "Size: %d (0x%X), Address: 0x%X\n", InputBlockSize, InputBlockSize, InputBlock)); + DEBUG ((DEBUG_SECURITY, "Size: %d (0x%X), Address: 0x%X\n", InputBlockSize, InputBlockSize, InputBlock)); // Make sure we've got at least enough data for a valid header. if (InputBlockSize < sizeof (*CommHeader)) { - DEBUG ((DEBUG_WARN, "%a - Invalid buffer size!\n", __func__)); + DEBUG ((DEBUG_SECURITY, "%a - Invalid buffer size!\n", __func__)); return; } @@ -704,7 +704,7 @@ DumpTpmOutputBlock ( UINT32 NativeSize; TPM_CC NativeCode; - DEBUG ((DEBUG_VERBOSE, "Size: %d (0x%X), Address: 0x%X\n", OutputBlockSize, OutputBlockSize, OutputBlock)); + DEBUG ((DEBUG_SECURITY, "Size: %d (0x%X), Address: 0x%X\n", OutputBlockSize, OutputBlockSize, OutputBlock)); // Start the debugging by mapping some stuff. RespHeader = (TPM2_RESPONSE_HEADER *)OutputBlock; From ba6a8eb045aededbc1472cce7314ab1911f0ea1c Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Tue, 30 Jul 2024 10:56:00 -0700 Subject: [PATCH 0310/1172] SecurityPkg: CodeQL Fixes. Makes changes to comply with alerts raised by CodeQL. Most of the issues here fall into the following two categories: 1. Potential use of uninitialized pointer. 2. Inconsistent integer width in comparison. Co-authored-by: Taylor Beebe <31827475+TaylorBeebe@users.noreply.github.com> Co-authored-by: kenlautner <85201046+kenlautner@users.noreply.github.com> Co-authored-by: Bret Barkelew Signed-off-by: Doug Flick --- SecurityPkg/FvReportPei/FvReportPei.c | 25 +++- SecurityPkg/HddPassword/HddPasswordDxe.c | 26 +++- .../Library/AuthVariableLib/AuthService.c | 6 +- .../DxeImageVerificationLib.c | 13 +- .../DxeTcg2PhysicalPresenceLib.c | 111 +++++++++++++++++- .../DxeTcgPhysicalPresenceLib.c | 2 +- .../DxeTpm2MeasureBootLib.c | 14 ++- .../HashInstanceLibSha1/HashInstanceLibSha1.c | 5 +- .../HashInstanceLibSha256.c | 5 +- .../HashLibBaseCryptoRouterDxe.c | 17 ++- .../HashLibBaseCryptoRouterPei.c | 22 +++- .../SecureBootVariableProvisionLib.c | 9 +- .../TcgEventLogRecordLib.c | 2 +- .../Library/Tpm12DeviceLibDTpm/Tpm12Tis.c | 2 +- .../RngDxe/Rand/AesCore.c | 7 +- .../Tcg/Opal/OpalPassword/OpalDriver.c | 2 +- SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c | 25 +++- SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c | 6 +- SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c | 6 +- SecurityPkg/Tcg/TcgConfigDxe/TcgConfigImpl.c | 16 ++- SecurityPkg/Tcg/TcgDxe/TcgDxe.c | 5 +- .../SecureBootConfigFileExplorer.c | 6 +- .../SecureBootConfigImpl.c | 46 +++++--- 23 files changed, 311 insertions(+), 67 deletions(-) diff --git a/SecurityPkg/FvReportPei/FvReportPei.c b/SecurityPkg/FvReportPei/FvReportPei.c index 50773db056bb..4376f526c0d9 100644 --- a/SecurityPkg/FvReportPei/FvReportPei.c +++ b/SecurityPkg/FvReportPei/FvReportPei.c @@ -71,7 +71,10 @@ InstallPreHashFvPpi ( + HashSize; PreHashedFvPpi = AllocatePool (PpiSize); - ASSERT (PreHashedFvPpi != NULL); + if (PreHashedFvPpi == NULL) { + ASSERT (PreHashedFvPpi != NULL); + return; + } PreHashedFvPpi->FvBase = (UINT32)(UINTN)FvBuffer; PreHashedFvPpi->FvLength = (UINT32)FvLength; @@ -83,7 +86,11 @@ InstallPreHashFvPpi ( CopyMem (HASH_VALUE_PTR (HashInfo), HashValue, HashSize); FvInfoPpiDescriptor = AllocatePool (sizeof (EFI_PEI_PPI_DESCRIPTOR)); - ASSERT (FvInfoPpiDescriptor != NULL); + if (FvInfoPpiDescriptor == NULL) { + ASSERT (FvInfoPpiDescriptor != NULL); + FreePool (PreHashedFvPpi); + return; + } FvInfoPpiDescriptor->Guid = &gEdkiiPeiFirmwareVolumeInfoPrehashedFvPpiGuid; FvInfoPpiDescriptor->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; @@ -202,8 +209,11 @@ VerifyHashedFv ( // Copy FV to permanent memory to avoid potential TOC/TOU. // FvBuffer = AllocatePages (EFI_SIZE_TO_PAGES ((UINTN)FvInfo[FvIndex].Length)); - - ASSERT (FvBuffer != NULL); + if (FvBuffer == NULL) { + ASSERT (FvBuffer != NULL); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } if (FvShadowPpi != NULL) { Status = FvShadowPpi->FirmwareVolumeShadow ( @@ -379,12 +389,17 @@ CheckStoredHashFv ( ); if (!EFI_ERROR (Status) && (StoredHashFvPpi != NULL) && (StoredHashFvPpi->FvNumber > 0)) { HashInfo = GetHashInfo (StoredHashFvPpi, BootMode); - Status = VerifyHashedFv ( + if (HashInfo != NULL) { + Status = VerifyHashedFv ( HashInfo, StoredHashFvPpi->FvInfo, StoredHashFvPpi->FvNumber, BootMode ); + } else { + Status = EFI_NOT_FOUND; + } + if (!EFI_ERROR (Status)) { DEBUG ((DEBUG_INFO, "OBB verification passed (%r)\r\n", Status)); diff --git a/SecurityPkg/HddPassword/HddPasswordDxe.c b/SecurityPkg/HddPassword/HddPasswordDxe.c index 6f36b5a0a28b..228a9f41b1c3 100644 --- a/SecurityPkg/HddPassword/HddPasswordDxe.c +++ b/SecurityPkg/HddPassword/HddPasswordDxe.c @@ -149,7 +149,10 @@ BuildHddPasswordDeviceInfo ( S3InitDevicesExist = FALSE; } else if (Status == EFI_BUFFER_TOO_SMALL) { S3InitDevices = AllocatePool (S3InitDevicesLength); - ASSERT (S3InitDevices != NULL); + if (S3InitDevices == NULL) { + ASSERT (S3InitDevices != NULL); + return; + } Status = RestoreLockBox ( &gS3StorageDeviceInitListGuid, @@ -184,7 +187,10 @@ BuildHddPasswordDeviceInfo ( FreePool (S3InitDevicesBak); } - ASSERT (S3InitDevices != NULL); + if (S3InitDevices == NULL) { + ASSERT (S3InitDevices != NULL); + return; + } TempDevInfo = (HDD_PASSWORD_DEVICE_INFO *)((UINTN)TempDevInfo + sizeof (HDD_PASSWORD_DEVICE_INFO) + @@ -2195,8 +2201,14 @@ HddPasswordFormExtractConfig ( // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator // ConfigRequestHdr = HiiConstructConfigHdr (&mHddPasswordVendorGuid, mHddPasswordVendorStorageName, Private->DriverHandle); - Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); - ConfigRequest = AllocateZeroPool (Size); + if (ConfigRequestHdr == NULL) { + ASSERT (ConfigRequestHdr != NULL); + FreePool (IfrData); + return EFI_OUT_OF_RESOURCES; + } + + Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); + ConfigRequest = AllocateZeroPool (Size); ASSERT (ConfigRequest != NULL); AllocatedRequest = TRUE; UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize); @@ -2386,7 +2398,11 @@ HddPasswordFormCallback ( // In case goto the device configuration form, update the device form title. // ConfigFormEntry = HddPasswordGetConfigFormEntryByIndex ((UINT32)(QuestionId - KEY_HDD_DEVICE_ENTRY_BASE)); - ASSERT (ConfigFormEntry != NULL); + if (ConfigFormEntry == NULL) { + ASSERT (ConfigFormEntry != NULL); + FreePool (IfrData); + return EFI_NOT_FOUND; + } DeviceFormTitleToken = (EFI_STRING_ID)STR_HDD_SECURITY_HD; HiiSetString (Private->HiiHandle, DeviceFormTitleToken, ConfigFormEntry->HddString, NULL); diff --git a/SecurityPkg/Library/AuthVariableLib/AuthService.c b/SecurityPkg/Library/AuthVariableLib/AuthService.c index 706cb6799b4c..2d79cc1dc9db 100644 --- a/SecurityPkg/Library/AuthVariableLib/AuthService.c +++ b/SecurityPkg/Library/AuthVariableLib/AuthService.c @@ -553,7 +553,7 @@ CheckSignatureListFormat ( // Walk through the input signature list and check the data format. // If any signature is incorrectly formed, the whole check will fail. // - while ((SigDataSize > 0) && (SigDataSize >= SigList->SignatureListSize)) { + while ((SigDataSize > 0) && (SigDataSize >= (UINTN)SigList->SignatureListSize)) { for (Index = 0; Index < (sizeof (mSupportSigItem) / sizeof (EFI_SIGNATURE_ITEM)); Index++ ) { if (CompareGuid (&SigList->SignatureType, &mSupportSigItem[Index].SigType)) { // @@ -1088,7 +1088,7 @@ FilterSignatureList ( Tail = TempData; NewCertList = (EFI_SIGNATURE_LIST *)NewData; - while ((*NewDataSize > 0) && (*NewDataSize >= NewCertList->SignatureListSize)) { + while ((*NewDataSize > 0) && (*NewDataSize >= (UINTN)NewCertList->SignatureListSize)) { NewCert = (EFI_SIGNATURE_DATA *)((UINT8 *)NewCertList + sizeof (EFI_SIGNATURE_LIST) + NewCertList->SignatureHeaderSize); NewCertCount = (NewCertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - NewCertList->SignatureHeaderSize) / NewCertList->SignatureSize; @@ -1098,7 +1098,7 @@ FilterSignatureList ( Size = DataSize; CertList = (EFI_SIGNATURE_LIST *)Data; - while ((Size > 0) && (Size >= CertList->SignatureListSize)) { + while ((Size > 0) && (Size >= (UINTN)CertList->SignatureListSize)) { if (CompareGuid (&CertList->SignatureType, &NewCertList->SignatureType) && (CertList->SignatureSize == NewCertList->SignatureSize)) { diff --git a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c index 2eca39d563fe..23e25a4b755a 100644 --- a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c +++ b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c @@ -883,7 +883,7 @@ IsCertHashFoundInDbx ( return Status; } - while ((DbxSize > 0) && (SignatureListSize >= DbxList->SignatureListSize)) { + while ((DbxSize > 0) && (SignatureListSize >= (UINTN)DbxList->SignatureListSize)) { // // Determine Hash Algorithm of Certificate in the forbidden database. // @@ -1028,7 +1028,7 @@ IsSignatureFoundInDatabase ( // Enumerate all signature data in SigDB to check if signature exists for executable. // CertList = (EFI_SIGNATURE_LIST *)Data; - while ((DataSize > 0) && (DataSize >= CertList->SignatureListSize)) { + while ((DataSize > 0) && (DataSize >= (UINTN)CertList->SignatureListSize)) { CertCount = (CertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize; Cert = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize); if ((CertList->SignatureSize == sizeof (EFI_SIGNATURE_DATA) - 1 + SignatureSize) && (CompareGuid (&CertList->SignatureType, CertType))) { @@ -1193,7 +1193,7 @@ PassTimestampCheck ( } CertList = (EFI_SIGNATURE_LIST *)DbtData; - while ((DbtDataSize > 0) && (DbtDataSize >= CertList->SignatureListSize)) { + while ((DbtDataSize > 0) && (DbtDataSize >= (UINTN)CertList->SignatureListSize)) { if (CompareGuid (&CertList->SignatureType, &gEfiCertX509Guid)) { Cert = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize); CertCount = (CertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize; @@ -1319,7 +1319,7 @@ IsForbiddenByDbx ( // CertList = (EFI_SIGNATURE_LIST *)Data; CertListSize = DataSize; - while ((CertListSize > 0) && (CertListSize >= CertList->SignatureListSize)) { + while ((CertListSize > 0) && (CertListSize >= (UINTN)CertList->SignatureListSize)) { if (CompareGuid (&CertList->SignatureType, &gEfiCertX509Guid)) { CertData = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize); CertCount = (CertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize; @@ -1524,7 +1524,7 @@ IsAllowedByDb ( // Find X509 certificate in Signature List to verify the signature in pkcs7 signed data. // CertList = (EFI_SIGNATURE_LIST *)Data; - while ((DataSize > 0) && (DataSize >= CertList->SignatureListSize)) { + while ((DataSize > 0) && (DataSize >= (UINTN)CertList->SignatureListSize)) { if (CompareGuid (&CertList->SignatureType, &gEfiCertX509Guid)) { CertData = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize); CertCount = (CertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize; @@ -2050,8 +2050,9 @@ DxeImageVerificationHandler ( // executable information table in either case. // NameStr = ConvertDevicePathToText (File, FALSE, TRUE); - AddImageExeInfo (Action, NameStr, File, SignatureList, SignatureListSize); + if (NameStr != NULL) { + AddImageExeInfo (Action, NameStr, File, SignatureList, SignatureListSize); DEBUG ((DEBUG_INFO, "The image doesn't pass verification: %s\n", NameStr)); FreePool (NameStr); } diff --git a/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c b/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c index de4f5e583d51..f81519d1b0bc 100644 --- a/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c +++ b/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c @@ -387,7 +387,10 @@ Tcg2UserConfirm ( NoPpiInfo = FALSE; BufSize = CONFIRM_BUFFER_SIZE; ConfirmText = AllocateZeroPool (BufSize); - ASSERT (ConfirmText != NULL); + if (ConfirmText == NULL) { + ASSERT (ConfirmText != NULL); + return FALSE; + } mTcg2PpStringPackHandle = HiiAddPackages (&gEfiTcg2PhysicalPresenceGuid, gImageHandle, DxeTcg2PhysicalPresenceLibStrings, NULL); ASSERT (mTcg2PpStringPackHandle != NULL); @@ -401,10 +404,20 @@ Tcg2UserConfirm ( TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_CLEAR)); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_HEAD_STR)); + if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) { + FreePool (ConfirmText); + return FALSE; + } + UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2); FreePool (TmpStr1); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_WARNING_CLEAR)); + if (TmpStr1 == NULL) { + FreePool (ConfirmText); + return FALSE; + } + StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), L" \n\n", (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); @@ -417,14 +430,29 @@ Tcg2UserConfirm ( TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_CLEAR)); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_PPI_HEAD_STR)); + if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) { + FreePool (ConfirmText); + return FALSE; + } + UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2); FreePool (TmpStr1); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_NOTE_CLEAR)); + if (TmpStr1 == NULL) { + FreePool (ConfirmText); + return FALSE; + } + StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_WARNING_CLEAR)); + if (TmpStr1 == NULL) { + FreePool (ConfirmText); + return FALSE; + } + StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), L" \n\n", (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); @@ -452,14 +480,29 @@ Tcg2UserConfirm ( TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_SET_PCR_BANKS)); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_HEAD_STR)); + if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) { + FreePool (ConfirmText); + return FALSE; + } + UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2); FreePool (TmpStr1); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_WARNING_SET_PCR_BANKS_1)); + if (TmpStr1 == NULL) { + FreePool (ConfirmText); + return FALSE; + } + StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_WARNING_SET_PCR_BANKS_2)); + if (TmpStr1 == NULL) { + FreePool (ConfirmText); + return FALSE; + } + StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); @@ -467,7 +510,11 @@ Tcg2UserConfirm ( Tcg2FillBufferWithBootHashAlg (TempBuffer2, sizeof (TempBuffer2), CurrentPCRBanks); TmpStr1 = AllocateZeroPool (BufSize); - ASSERT (TmpStr1 != NULL); + if (TmpStr1 == NULL) { + ASSERT (TmpStr1 != NULL); + return FALSE; + } + UnicodeSPrint (TmpStr1, BufSize, L"Current PCRBanks is 0x%x. (%s)\nNew PCRBanks is 0x%x. (%s)\n", CurrentPCRBanks, TempBuffer2, TpmPpCommandParameter, TempBuffer); StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); @@ -481,14 +528,29 @@ Tcg2UserConfirm ( TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_CHANGE_EPS)); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_HEAD_STR)); + if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) { + FreePool (ConfirmText); + return FALSE; + } + UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2); FreePool (TmpStr1); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_WARNING_CHANGE_EPS_1)); + if (TmpStr1 == NULL) { + FreePool (ConfirmText); + return FALSE; + } + StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_WARNING_CHANGE_EPS_2)); + if (TmpStr1 == NULL) { + FreePool (ConfirmText); + return FALSE; + } + StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); @@ -498,6 +560,11 @@ Tcg2UserConfirm ( TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_ENABLE_BLOCK_SID)); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_HEAD_STR)); + if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) { + FreePool (ConfirmText); + return FALSE; + } + UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2); FreePool (TmpStr1); break; @@ -506,6 +573,11 @@ Tcg2UserConfirm ( TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_DISABLE_BLOCK_SID)); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_HEAD_STR)); + if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) { + FreePool (ConfirmText); + return FALSE; + } + UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2); FreePool (TmpStr1); break; @@ -515,6 +587,11 @@ Tcg2UserConfirm ( TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_PP_ENABLE_BLOCK_SID)); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_PPI_HEAD_STR)); + if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) { + FreePool (ConfirmText); + return FALSE; + } + UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2); FreePool (TmpStr1); break; @@ -524,6 +601,11 @@ Tcg2UserConfirm ( TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_PP_DISABLE_BLOCK_SID)); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_PPI_HEAD_STR)); + if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) { + FreePool (ConfirmText); + return FALSE; + } + UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2); FreePool (TmpStr1); break; @@ -544,11 +626,21 @@ Tcg2UserConfirm ( TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_ACCEPT_KEY)); } + if (TmpStr1 == NULL) { + FreePool (ConfirmText); + return FALSE; + } + StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); if (NoPpiInfo) { TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_NO_PPI_INFO)); + if (TmpStr1 == NULL) { + FreePool (ConfirmText); + return FALSE; + } + StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); } @@ -561,11 +653,21 @@ Tcg2UserConfirm ( TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_ACCEPT_KEY)); } + if (TmpStr1 == NULL) { + FreePool (ConfirmText); + return FALSE; + } + StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); if (NoPpiInfo) { TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_NO_PPI_INFO)); + if (TmpStr1 == NULL) { + FreePool (ConfirmText); + return FALSE; + } + StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); } @@ -573,6 +675,11 @@ Tcg2UserConfirm ( TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_REJECT_KEY)); } + if (TmpStr1 == NULL) { + FreePool (ConfirmText); + return FALSE; + } + BufSize -= StrSize (ConfirmText); UnicodeSPrint (ConfirmText + StrLen (ConfirmText), BufSize, TmpStr1, TmpStr2); diff --git a/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.c b/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.c index 597ce77b4b49..d38a6073df80 100644 --- a/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.c +++ b/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.c @@ -540,7 +540,7 @@ UserConfirm ( CHAR16 *TmpStr2; UINTN BufSize; BOOLEAN CautionKey; - UINT16 Index; + UINTN Index; CHAR16 DstStr[81]; TmpStr2 = NULL; diff --git a/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c b/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c index acba11d69561..b8eb5d6ee239 100644 --- a/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c +++ b/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c @@ -615,6 +615,9 @@ GetMeasureBootProtocols ( @retval EFI_SUCCESS The file specified by DevicePath and non-NULL FileBuffer did authenticate, and the platform policy dictates that the DXE Foundation may use the file. + + @retval EFI_OUT_OF_RESOURCES A necessary memory buffer could not be allocated. + @retval other error value **/ EFI_STATUS @@ -708,9 +711,16 @@ DxeTpm2MeasureBootHandler ( } } - FreePool (OrigDevicePathNode); + if (OrigDevicePathNode != NULL) { + FreePool (OrigDevicePathNode); + } + OrigDevicePathNode = DuplicateDevicePath (File); - ASSERT (OrigDevicePathNode != NULL); + if (OrigDevicePathNode == NULL) { + ASSERT (OrigDevicePathNode != NULL); + return EFI_OUT_OF_RESOURCES; + } + break; } } diff --git a/SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.c b/SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.c index c786c2189c4f..7b00833dd2ec 100644 --- a/SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.c +++ b/SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.c @@ -56,7 +56,10 @@ Sha1HashInit ( CtxSize = Sha1GetContextSize (); Sha1Ctx = AllocatePool (CtxSize); - ASSERT (Sha1Ctx != NULL); + if (Sha1Ctx == NULL) { + ASSERT (Sha1Ctx != NULL); + return EFI_OUT_OF_RESOURCES; + } Sha1Init (Sha1Ctx); diff --git a/SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.c b/SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.c index 43877400011a..4fdc5a8ea5cf 100644 --- a/SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.c +++ b/SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.c @@ -56,7 +56,10 @@ Sha256HashInit ( CtxSize = Sha256GetContextSize (); Sha256Ctx = AllocatePool (CtxSize); - ASSERT (Sha256Ctx != NULL); + if (Sha256Ctx == NULL) { + ASSERT (Sha256Ctx != NULL); + return EFI_OUT_OF_RESOURCES; + } Sha256Init (Sha256Ctx); diff --git a/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c b/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c index 2169c5e18590..5e0bbe5eb062 100644 --- a/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c +++ b/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c @@ -80,6 +80,11 @@ HashStart ( for (Index = 0; Index < mHashInterfaceCount; Index++) { HashMask = Tpm2GetHashMaskFromAlgo (&mHashInterface[Index].HashGuid); + if (HashCtx == NULL) { + // If we fail to get the hash mask we don't have resources. + return EFI_OUT_OF_RESOURCES; + } + if ((HashMask & PcdGet32 (PcdTpm2HashMask)) != 0) { mHashInterface[Index].HashInit (&HashCtx[Index]); } @@ -278,8 +283,16 @@ HashAndExtend ( CheckSupportedHashMaskMismatch (); - HashStart (&HashHandle); - HashUpdate (HashHandle, DataToHash, DataToHashLen); + Status = HashStart (&HashHandle); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = HashUpdate (HashHandle, DataToHash, DataToHashLen); + if (EFI_ERROR (Status)) { + return Status; + } + Status = HashCompleteAndExtend (HashHandle, PcrIndex, NULL, 0, DigestList); return Status; diff --git a/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.c b/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.c index eeb424b6c3f2..156dc040b2f0 100644 --- a/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.c +++ b/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.c @@ -106,7 +106,10 @@ CheckSupportedHashMaskMismatch ( HASH_INTERFACE_HOB *HashInterfaceHobLast; HashInterfaceHobLast = InternalGetHashInterfaceHob (&gZeroGuid); - ASSERT (HashInterfaceHobLast != NULL); + if (HashInterfaceHobLast == NULL) { + ASSERT (HashInterfaceHobLast != NULL); + return; + } if ((HashInterfaceHobLast->SupportedHashMask != 0) && (HashInterfaceHobCurrent->SupportedHashMask != HashInterfaceHobLast->SupportedHashMask)) @@ -152,7 +155,10 @@ HashStart ( CheckSupportedHashMaskMismatch (HashInterfaceHob); HashCtx = AllocatePool (sizeof (*HashCtx) * HashInterfaceHob->HashInterfaceCount); - ASSERT (HashCtx != NULL); + if (HashCtx == NULL) { + ASSERT (HashCtx != NULL); + return EFI_OUT_OF_RESOURCES; + } for (Index = 0; Index < HashInterfaceHob->HashInterfaceCount; Index++) { HashMask = Tpm2GetHashMaskFromAlgo (&HashInterfaceHob->HashInterface[Index].HashGuid); @@ -305,8 +311,16 @@ HashAndExtend ( CheckSupportedHashMaskMismatch (HashInterfaceHob); - HashStart (&HashHandle); - HashUpdate (HashHandle, DataToHash, DataToHashLen); + Status = HashStart (&HashHandle); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = HashUpdate (HashHandle, DataToHash, DataToHashLen); + if (EFI_ERROR (Status)) { + return Status; + } + Status = HashCompleteAndExtend (HashHandle, PcrIndex, NULL, 0, DigestList); return Status; diff --git a/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.c b/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.c index 7f9fdd22d7fe..e45e975beffd 100644 --- a/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.c +++ b/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.c @@ -59,7 +59,11 @@ SecureBootFetchData ( *SigListOut = NULL; *SigListsSize = 0; CertInfo = AllocatePool (sizeof (SECURE_BOOT_CERTIFICATE_INFO)); - NewCertInfo = CertInfo; + if (CertInfo == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + NewCertInfo = CertInfo; while (1) { if (NewCertInfo == NULL) { Status = EFI_OUT_OF_RESOURCES; @@ -93,6 +97,9 @@ SecureBootFetchData ( sizeof (SECURE_BOOT_CERTIFICATE_INFO) * (KeyIndex + 1), CertInfo ); + if (NewCertInfo == NULL) { + goto Cleanup; + } } if (Status == EFI_NOT_FOUND) { diff --git a/SecurityPkg/Library/TcgEventLogRecordLib/TcgEventLogRecordLib.c b/SecurityPkg/Library/TcgEventLogRecordLib/TcgEventLogRecordLib.c index e1e0f990d313..cbe1da3aa383 100644 --- a/SecurityPkg/Library/TcgEventLogRecordLib/TcgEventLogRecordLib.c +++ b/SecurityPkg/Library/TcgEventLogRecordLib/TcgEventLogRecordLib.c @@ -106,7 +106,7 @@ MeasureFirmwareBlob ( { if (Description != NULL) { AsciiSPrint ((CHAR8 *)FvBlob2.BlobDescription, sizeof (FvBlob2.BlobDescription), "%a", Description); - } else { + } else if (FvName != NULL) { AsciiSPrint ((CHAR8 *)FvBlob2.BlobDescription, sizeof (FvBlob2.BlobDescription), "Fv(%g)", FvName); } diff --git a/SecurityPkg/Library/Tpm12DeviceLibDTpm/Tpm12Tis.c b/SecurityPkg/Library/Tpm12DeviceLibDTpm/Tpm12Tis.c index 64bea73d7957..5eb1a0b51d93 100644 --- a/SecurityPkg/Library/Tpm12DeviceLibDTpm/Tpm12Tis.c +++ b/SecurityPkg/Library/Tpm12DeviceLibDTpm/Tpm12Tis.c @@ -270,7 +270,7 @@ Tpm12TisTpmCommand ( { EFI_STATUS Status; UINT16 BurstCount; - UINT32 Index; + UINTN Index; UINT32 TpmOutSize; UINT16 Data16; UINT32 Data32; diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/AesCore.c b/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/AesCore.c index 3ac20e889cf1..1b2cddf3da26 100644 --- a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/AesCore.c +++ b/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/AesCore.c @@ -230,6 +230,8 @@ AesEncrypt ( UINTN NbIndex; UINTN Round; + EFI_STATUS Status; + if ((Key == NULL) || (InData == NULL) || (OutData == NULL)) { return EFI_INVALID_PARAMETER; } @@ -237,7 +239,10 @@ AesEncrypt ( // // Expands AES Key for encryption. // - AesExpandKey (Key, 128, &AesKey); + Status = AesExpandKey (Key, 128, &AesKey); + if (EFI_ERROR (Status)) { + return Status; + } Nr = AesKey.Nk + 6; Ek = AesKey.EncKey; diff --git a/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c b/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c index 0167afd0e934..068c3c71d407 100644 --- a/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c +++ b/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c @@ -2224,7 +2224,7 @@ ProcessOpalRequest ( // TempVariable = Variable; while ((VariableSize > sizeof (OPAL_REQUEST_VARIABLE)) && - (VariableSize >= TempVariable->Length) && + (VariableSize >= (UINTN)TempVariable->Length) && (TempVariable->Length > sizeof (OPAL_REQUEST_VARIABLE))) { DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *)((UINTN)TempVariable + sizeof (OPAL_REQUEST_VARIABLE)); diff --git a/SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c b/SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c index 1e0b00b3f7aa..c5f11215bd9f 100644 --- a/SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c +++ b/SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c @@ -113,7 +113,7 @@ GetSavedOpalRequest ( TempVariable = Variable; while ((VariableSize > sizeof (OPAL_REQUEST_VARIABLE)) && - (VariableSize >= TempVariable->Length) && + (VariableSize >= (UINTN)TempVariable->Length) && (TempVariable->Length > sizeof (OPAL_REQUEST_VARIABLE))) { DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *)((UINTN)TempVariable + sizeof (OPAL_REQUEST_VARIABLE)); @@ -193,7 +193,7 @@ SaveOpalRequest ( TempVariable = Variable; TempVariableSize = VariableSize; while ((TempVariableSize > sizeof (OPAL_REQUEST_VARIABLE)) && - (TempVariableSize >= TempVariable->Length) && + (TempVariableSize >= (UINTN)TempVariable->Length) && (TempVariable->Length > sizeof (OPAL_REQUEST_VARIABLE))) { DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *)((UINTN)TempVariable + sizeof (OPAL_REQUEST_VARIABLE)); @@ -226,7 +226,11 @@ SaveOpalRequest ( DevicePathSize = GetDevicePathSize (DevicePath); NewVariableSize = VariableSize + sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize; NewVariable = AllocatePool (NewVariableSize); - ASSERT (NewVariable != NULL); + if (NewVariable == NULL) { + ASSERT (NewVariable != NULL); + return; + } + CopyMem (NewVariable, Variable, VariableSize); TempVariable = (OPAL_REQUEST_VARIABLE *)((UINTN)NewVariable + VariableSize); TempVariable->Length = (UINT32)(sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize); @@ -239,7 +243,11 @@ SaveOpalRequest ( DevicePathSize = GetDevicePathSize (DevicePath); NewVariableSize = sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize; NewVariable = AllocatePool (NewVariableSize); - ASSERT (NewVariable != NULL); + if (NewVariable == NULL) { + ASSERT (NewVariable != NULL); + return; + } + NewVariable->Length = (UINT32)(sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize); CopyMem (&NewVariable->OpalRequest, &OpalRequest, sizeof (OPAL_REQUEST)); DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *)((UINTN)NewVariable + sizeof (OPAL_REQUEST_VARIABLE)); @@ -1111,8 +1119,13 @@ ExtractConfig ( // DriverHandle = HiiGetDriverImageHandleCB (); ConfigRequestHdr = HiiConstructConfigHdr (&gHiiSetupVariableGuid, OpalPasswordStorageName, DriverHandle); - Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); - ConfigRequest = AllocateZeroPool (Size); + if (ConfigRequestHdr == NULL) { + ASSERT (ConfigRequestHdr != NULL); + return EFI_OUT_OF_RESOURCES; + } + + Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); + ConfigRequest = AllocateZeroPool (Size); if (ConfigRequest == NULL) { return EFI_OUT_OF_RESOURCES; } diff --git a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c index edf5f0fc77ca..2b93733bb95a 100644 --- a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c +++ b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c @@ -103,7 +103,11 @@ InitializeTcg2VersionInfo ( TCG2_VERSION_NAME, PrivateData->DriverHandle ); - ASSERT (ConfigRequestHdr != NULL); + if (ConfigRequestHdr == NULL) { + ASSERT (ConfigRequestHdr != NULL); + return; + } + DataSize = sizeof (Tcg2Version); Status = gRT->GetVariable ( TCG2_VERSION_NAME, diff --git a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c index 85a852842d50..2a0307c6e953 100644 --- a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c +++ b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c @@ -626,7 +626,7 @@ DumpEventLog ( TCG_PCR_EVENT_HDR *EventHdr; TCG_PCR_EVENT2 *TcgPcrEvent2; TCG_EfiSpecIDEventStruct *TcgEfiSpecIdEventStruct; - UINTN NumberOfEvents; + UINT64 NumberOfEvents; if (!DebugPrintLevelEnabled (DEBUG_SECURITY)) { return; @@ -637,7 +637,7 @@ DumpEventLog ( switch (EventLogFormat) { case EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2: EventHdr = (TCG_PCR_EVENT_HDR *)(UINTN)EventLogLocation; - while ((UINTN)EventHdr <= EventLogLastEntry) { + while ((EFI_PHYSICAL_ADDRESS)(UINTN)EventHdr <= EventLogLastEntry) { DumpEvent (EventHdr); EventHdr = (TCG_PCR_EVENT_HDR *)((UINTN)EventHdr + sizeof (TCG_PCR_EVENT_HDR) + EventHdr->EventSize); } @@ -668,7 +668,7 @@ DumpEventLog ( DumpTcgEfiSpecIdEventStruct (TcgEfiSpecIdEventStruct); TcgPcrEvent2 = (TCG_PCR_EVENT2 *)((UINTN)TcgEfiSpecIdEventStruct + GetTcgEfiSpecIdEventStructSize (TcgEfiSpecIdEventStruct)); - while ((UINTN)TcgPcrEvent2 <= EventLogLastEntry) { + while ((EFI_PHYSICAL_ADDRESS)(UINTN)TcgPcrEvent2 <= EventLogLastEntry) { DumpEvent2 (TcgPcrEvent2); TcgPcrEvent2 = (TCG_PCR_EVENT2 *)((UINTN)TcgPcrEvent2 + GetPcrEvent2Size (TcgPcrEvent2)); } diff --git a/SecurityPkg/Tcg/TcgConfigDxe/TcgConfigImpl.c b/SecurityPkg/Tcg/TcgConfigDxe/TcgConfigImpl.c index 52ea1ac3aeaf..2b4164c4e724 100644 --- a/SecurityPkg/Tcg/TcgConfigDxe/TcgConfigImpl.c +++ b/SecurityPkg/Tcg/TcgConfigDxe/TcgConfigImpl.c @@ -193,9 +193,19 @@ TcgExtractConfig ( // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator // ConfigRequestHdr = HiiConstructConfigHdr (&gTcgConfigFormSetGuid, mTcgStorageName, PrivateData->DriverHandle); - Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); - ConfigRequest = AllocateZeroPool (Size); - ASSERT (ConfigRequest != NULL); + if (ConfigRequestHdr == NULL) { + ASSERT (ConfigRequestHdr != NULL); + return EFI_OUT_OF_RESOURCES; + } + + Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); + ConfigRequest = AllocateZeroPool (Size); + if (ConfigRequest == NULL) { + ASSERT (ConfigRequest != NULL); + FreePool (ConfigRequestHdr); + return EFI_OUT_OF_RESOURCES; + } + AllocatedRequest = TRUE; UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, sizeof (TCG_CONFIGURATION)); FreePool (ConfigRequestHdr); diff --git a/SecurityPkg/Tcg/TcgDxe/TcgDxe.c b/SecurityPkg/Tcg/TcgDxe/TcgDxe.c index ee6c6273033b..ea4516a3db8b 100644 --- a/SecurityPkg/Tcg/TcgDxe/TcgDxe.c +++ b/SecurityPkg/Tcg/TcgDxe/TcgDxe.c @@ -286,7 +286,10 @@ TpmCommHashAll ( CtxSize = Sha1GetContextSize (); Sha1Ctx = AllocatePool (CtxSize); - ASSERT (Sha1Ctx != NULL); + if (Sha1Ctx == NULL) { + ASSERT (Sha1Ctx != NULL); + return EFI_OUT_OF_RESOURCES; + } Sha1Init (Sha1Ctx); Sha1Update (Sha1Ctx, Data, DataLen); diff --git a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigFileExplorer.c b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigFileExplorer.c index 5a23dc517aa7..65b3f81b6e6e 100644 --- a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigFileExplorer.c +++ b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigFileExplorer.c @@ -98,7 +98,11 @@ ExtractFileNameFromDevicePath ( ASSERT (DevicePath != NULL); - String = DevicePathToStr (DevicePath); + String = DevicePathToStr (DevicePath); + if (String == NULL) { + return NULL; + } + MatchString = String; LastMatch = String; FileName = NULL; diff --git a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c index d262904c3138..e79932d5fe59 100644 --- a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c +++ b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c @@ -1095,7 +1095,7 @@ IsSignatureFoundInDatabase ( // Enumerate all signature data in SigDB to check if signature exists for executable. // CertList = (EFI_SIGNATURE_LIST *)Data; - while ((DataSize > 0) && (DataSize >= CertList->SignatureListSize)) { + while ((DataSize > 0) && (DataSize >= (UINTN)CertList->SignatureListSize)) { CertCount = (CertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize; Cert = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize); if ((CertList->SignatureSize == sizeof (EFI_SIGNATURE_DATA) - 1 + SignatureSize) && (CompareGuid (&CertList->SignatureType, &gEfiCertX509Guid))) { @@ -1173,7 +1173,10 @@ CalculateCertHash ( // CtxSize = mHash[HashAlg].GetContextSize (); HashCtx = AllocatePool (CtxSize); - ASSERT (HashCtx != NULL); + if (HashCtx == NULL) { + ASSERT (HashCtx != NULL); + return FALSE; + } // // 2. Initialize a hash context. @@ -1261,7 +1264,7 @@ IsCertHashFoundInDbx ( // Check whether the certificate hash exists in the forbidden database. // DbxList = (EFI_SIGNATURE_LIST *)Data; - while ((DataSize > 0) && (DataSize >= DbxList->SignatureListSize)) { + while ((DataSize > 0) && (DataSize >= (UINTN)DbxList->SignatureListSize)) { // // Determine Hash Algorithm of Certificate in the forbidden database. // @@ -1348,7 +1351,7 @@ GetSignaturelistOffset ( SigList = Database; SiglistSize = DatabaseSize; - while ((SiglistSize > 0) && (SiglistSize >= SigList->SignatureListSize)) { + while ((SiglistSize > 0) && (SiglistSize >= (UINTN)SigList->SignatureListSize)) { if (CompareGuid (&SigList->SignatureType, SignatureType)) { *Offset = DatabaseSize - SiglistSize; return TRUE; @@ -1888,7 +1891,10 @@ HashPeImage ( CtxSize = mHash[HashAlg].GetContextSize (); HashCtx = AllocatePool (CtxSize); - ASSERT (HashCtx != NULL); + if (HashCtx == NULL) { + ASSERT (HashCtx != NULL); + goto Done; + } // 1. Load the image header into memory. @@ -2540,7 +2546,7 @@ UpdateDeletePage ( ) { EFI_STATUS Status; - UINT32 Index; + UINTN Index; UINTN CertCount; UINTN GuidIndex; VOID *StartOpCodeHandle; @@ -2724,7 +2730,7 @@ DeleteKeyExchangeKey ( UINT8 *Data; UINT8 *OldData; UINT32 Attr; - UINT32 Index; + UINTN Index; EFI_SIGNATURE_LIST *CertList; EFI_SIGNATURE_LIST *NewCertList; EFI_SIGNATURE_DATA *Cert; @@ -2928,7 +2934,7 @@ DeleteSignature ( UINT8 *Data; UINT8 *OldData; UINT32 Attr; - UINT32 Index; + UINTN Index; EFI_SIGNATURE_LIST *CertList; EFI_SIGNATURE_LIST *NewCertList; EFI_SIGNATURE_DATA *Cert; @@ -3206,7 +3212,7 @@ DeleteSignatureEx ( // // Traverse to target EFI_SIGNATURE_LIST but others will be skipped. // - while ((RemainingSize > 0) && (RemainingSize >= ListWalker->SignatureListSize) && ListIndex < PrivateData->ListIndex) { + while ((RemainingSize > 0) && (RemainingSize >= (UINTN)ListWalker->SignatureListSize) && ListIndex < PrivateData->ListIndex) { CopyMem ((UINT8 *)NewVariableData + Offset, ListWalker, ListWalker->SignatureListSize); Offset += ListWalker->SignatureListSize; @@ -3513,9 +3519,19 @@ SecureBootExtractConfig ( // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator // ConfigRequestHdr = HiiConstructConfigHdr (&gSecureBootConfigFormSetGuid, mSecureBootStorageName, PrivateData->DriverHandle); - Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); - ConfigRequest = AllocateZeroPool (Size); - ASSERT (ConfigRequest != NULL); + if (ConfigRequestHdr == NULL) { + ASSERT (ConfigRequestHdr != NULL); + return EFI_OUT_OF_RESOURCES; + } + + Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); + ConfigRequest = AllocateZeroPool (Size); + if (ConfigRequest == NULL) { + ASSERT (ConfigRequest != NULL); + FreePool (ConfigRequestHdr); + return EFI_OUT_OF_RESOURCES; + } + AllocatedRequest = TRUE; UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize); FreePool (ConfigRequestHdr); @@ -3794,7 +3810,7 @@ LoadSignatureList ( RemainingSize = DataSize; ListWalker = (EFI_SIGNATURE_LIST *)VariableData; - while ((RemainingSize > 0) && (RemainingSize >= ListWalker->SignatureListSize)) { + while ((RemainingSize > 0) && (RemainingSize >= (UINTN)ListWalker->SignatureListSize)) { if (CompareGuid (&ListWalker->SignatureType, &gEfiCertRsa2048Guid)) { ListType = STRING_TOKEN (STR_LIST_TYPE_RSA2048_SHA256); } else if (CompareGuid (&ListWalker->SignatureType, &gEfiCertX509Guid)) { @@ -4210,7 +4226,7 @@ LoadSignatureData ( VOID *EndOpCodeHandle; UINTN DataSize; UINTN RemainingSize; - UINT16 Index; + UINT64 Index; UINT8 *VariableData; CHAR16 VariableName[BUFFER_MAX_SIZE]; CHAR16 NameBuffer[BUFFER_MAX_SIZE]; @@ -4294,7 +4310,7 @@ LoadSignatureData ( // // Skip signature list. // - while ((RemainingSize > 0) && (RemainingSize >= ListWalker->SignatureListSize) && ListIndex-- > 0) { + while ((RemainingSize > 0) && (RemainingSize >= (UINTN)ListWalker->SignatureListSize) && ListIndex-- > 0) { RemainingSize -= ListWalker->SignatureListSize; ListWalker = (EFI_SIGNATURE_LIST *)((UINT8 *)ListWalker + ListWalker->SignatureListSize); } From ee9950d3fbf15988a15aaf88c8cc0101771e1afa Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Tue, 22 Jul 2025 14:33:08 +0100 Subject: [PATCH 0311/1172] SecurityPkg/Library: separate logics geting TPM2 information with FF-A This is preparation patch to add Tpm2DeviceSecLibFfa for SEC used in PeilessSec. In SEC phase, DynamicPcd used for cacahing TPM2 information couldn't be used. To resolve this, writes wrapper functions to get TPM2 information so that in the wrapper functions used in SEC wouldn't use the related DyanmicPcd. Signed-off-by: Yeoreum Yun --- .../Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.h | 50 +++++++++++ .../Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.inf | 1 + .../Tpm2DeviceLibFfa/Tpm2DeviceLibFfaBase.c | 19 +--- .../Library/Tpm2DeviceLibFfa/Tpm2InfoFfa.c | 87 +++++++++++++++++++ .../Tpm2DeviceLibFfa/Tpm2InstanceLibFfa.inf | 1 + .../Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c | 48 ++++------ 6 files changed, 162 insertions(+), 44 deletions(-) create mode 100644 SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InfoFfa.c diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.h b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.h index 665b594dc1db..97a558a2ef7f 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.h +++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.h @@ -34,6 +34,9 @@ #ifndef TPM2_DEVICE_LIB_FFA_H_ #define TPM2_DEVICE_LIB_FFA_H_ +#define TPM2_FFA_INTERFACE_TYPE_UNKNOWN 0xFF +#define TPM2_FFA_PARTITION_ID_INVALID 0x0000 + /** This function is used to get the TPM interface version. @@ -187,6 +190,22 @@ FfaTpm2RequestUseTpm ( VOID ); +/** + This function is used to get the TPM service partition id via FF-A + + @param[out] PartitionId - Supplies the pointer to the TPM service partition id. + + @retval EFI_SUCCESS The TPM command was successfully sent to the TPM + and the response was copied to the Output buffer. + @retval EFI_INVALID_PARAMETER The TPM command buffer is NULL or the TPM command + buffer size is 0. + @retval EFI_DEVICE_ERROR An error occurred in communication with the TPM. +**/ +EFI_STATUS +FfaTpm2GetServicePartitionId ( + OUT UINT16 *PartitionId + ); + /** Dump PTP register information. @@ -210,4 +229,35 @@ InternalTpm2DeviceLibFfaConstructor ( VOID ); +/** + This function validate TPM interface type for TPM service over FF-A. + + @retval EFI_SUCCESS TPM interface type is valid. + + @retval EFI_UNSUPPORTED TPM interface type is invalid. + +**/ +EFI_STATUS +EFIAPI +ValidateTpmInterfaceType ( + VOID + ); + +/** + This function is used to get the TPM service partition id. + + @param[out] PartitionId - Supplies the pointer to the TPM service partition id. + + @retval EFI_SUCCESS The TPM command was successfully sent to the TPM + and the response was copied to the Output buffer. + @retval EFI_INVALID_PARAMETER The TPM command buffer is NULL or the TPM command + buffer size is 0. + @retval EFI_DEVICE_ERROR An error occurred in communication with the TPM. +**/ +EFI_STATUS +EFIAPI +GetTpmServicePartitionId ( + OUT UINT16 *PartitionId + ); + #endif /* _TPM2_DEVICE_LIB_SMC_H_ */ diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.inf b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.inf index 68a0094a0628..198a9e575dca 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.inf +++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.inf @@ -29,6 +29,7 @@ Tpm2DeviceLibFfaBase.c Tpm2Ptp.c Tpm2DeviceLibFfa.h + Tpm2InfoFfa.c [Packages] MdePkg/MdePkg.dec diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfaBase.c b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfaBase.c index 85815a002f84..058d13117815 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfaBase.c +++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfaBase.c @@ -21,8 +21,7 @@ #include "Tpm2DeviceLibFfa.h" -TPM2_PTP_INTERFACE_TYPE mActiveTpmInterfaceType; -UINT8 mCRBIdleByPass; +UINT8 mCRBIdleByPass; /** Return cached PTP CRB interface IdleByPass state. @@ -52,28 +51,18 @@ InternalTpm2DeviceLibFfaConstructor ( { EFI_STATUS Status; - mActiveTpmInterfaceType = PcdGet8 (PcdActiveTpmInterfaceType); - mCRBIdleByPass = 0xFF; + mCRBIdleByPass = 0xFF; if (PcdGet64 (PcdTpmBaseAddress) == 0) { Status = EFI_NO_MAPPING; goto Exit; } - // - // Start by checking the PCD out of the gate and read from the CRB if it is invalid - // - if (mActiveTpmInterfaceType == 0xFF) { - mActiveTpmInterfaceType = Tpm2GetPtpInterface ((VOID *)(UINTN)PcdGet64 (PcdTpmBaseAddress)); - PcdSet8S (PcdActiveTpmInterfaceType, mActiveTpmInterfaceType); - } - - if (mActiveTpmInterfaceType != Tpm2PtpInterfaceCrb) { - Status = EFI_UNSUPPORTED; + Status = ValidateTpmInterfaceType (); + if (EFI_ERROR (Status)) { goto Exit; } - DEBUG ((DEBUG_INFO, "Setting Tpm Active Interface Type %d\n", mActiveTpmInterfaceType)); mCRBIdleByPass = Tpm2GetIdleByPass ((VOID *)(UINTN)PcdGet64 (PcdTpmBaseAddress)); Status = EFI_SUCCESS; diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InfoFfa.c b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InfoFfa.c new file mode 100644 index 000000000000..602fe34f55a9 --- /dev/null +++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InfoFfa.c @@ -0,0 +1,87 @@ +/** @file + This library provides an interfaces to access DynamicPcds used + in Tpm2DeviceLibFfa. + + Copyright (c) 2025, Arm Ltd. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include + +#include "Tpm2DeviceLibFfa.h" + +TPM2_PTP_INTERFACE_TYPE mActiveTpmInterfaceType; + +/** + This function validate TPM interface type for TPM service over FF-A. + + @retval EFI_SUCCESS TPM interface type is valid. + + @retval EFI_UNSUPPORTED TPM interface type is invalid. + +**/ +EFI_STATUS +ValidateTpmInterfaceType ( + VOID + ) +{ + mActiveTpmInterfaceType = PcdGet8 (PcdActiveTpmInterfaceType); + + // + // Start by checking the PCD out of the gate and read from the CRB if it is invalid + // + if (mActiveTpmInterfaceType == TPM2_FFA_INTERFACE_TYPE_UNKNOWN) { + mActiveTpmInterfaceType = Tpm2GetPtpInterface ((VOID *)(UINTN)PcdGet64 (PcdTpmBaseAddress)); + PcdSet8S (PcdActiveTpmInterfaceType, mActiveTpmInterfaceType); + } + + if (mActiveTpmInterfaceType != Tpm2PtpInterfaceCrb) { + return EFI_UNSUPPORTED; + } + + DEBUG ((DEBUG_INFO, "Setting Tpm Active Interface Type %d\n", mActiveTpmInterfaceType)); + + return EFI_SUCCESS; +} + +/** + This function is used to get the TPM service partition id. + + @param[out] PartitionId - Supplies the pointer to the TPM service partition id. + + @retval EFI_SUCCESS The TPM command was successfully sent to the TPM + and the response was copied to the Output buffer. + @retval EFI_INVALID_PARAMETER The TPM command buffer is NULL or the TPM command + buffer size is 0. + @retval EFI_DEVICE_ERROR An error occurred in communication with the TPM. +**/ +EFI_STATUS +EFIAPI +GetTpmServicePartitionId ( + OUT UINT16 *PartitionId + ) +{ + EFI_STATUS Status; + + if (PartitionId == NULL) { + return EFI_INVALID_PARAMETER; + } + + if (PcdGet16 (PcdTpmServiceFfaPartitionId) != TPM2_FFA_PARTITION_ID_INVALID) { + *PartitionId = PcdGet16 (PcdTpmServiceFfaPartitionId); + return EFI_SUCCESS; + } + + Status = FfaTpm2GetServicePartitionId (PartitionId); + if (!EFI_ERROR (Status)) { + PcdSet16S (PcdTpmServiceFfaPartitionId, *PartitionId); + } + + return Status; +} diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InstanceLibFfa.inf b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InstanceLibFfa.inf index 0f5d3fae1708..ecf9a36e3a0e 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InstanceLibFfa.inf +++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InstanceLibFfa.inf @@ -29,6 +29,7 @@ Tpm2DeviceLibFfaBase.c Tpm2Ptp.c Tpm2DeviceLibFfa.h + Tpm2InfoFfa.c [Packages] MdePkg/MdePkg.dec diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c index 3e36bcfaea3e..44159c996179 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c +++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c @@ -26,7 +26,7 @@ #include "Tpm2DeviceLibFfa.h" -UINT32 mFfaTpm2PartitionId = MAX_UINT32; +UINT16 mFfaTpm2PartitionId = TPM2_FFA_PARTITION_ID_INVALID; /** Check the return status from the FF-A call and returns EFI_STATUS @@ -84,7 +84,7 @@ TranslateTpmReturnStatus ( } /** - This function is used to get the TPM service partition id. + This function is used to get the TPM service partition id via FF-A. @param[out] PartitionId - Supplies the pointer to the TPM service partition id. @@ -92,11 +92,12 @@ TranslateTpmReturnStatus ( and the response was copied to the Output buffer. @retval EFI_INVALID_PARAMETER The TPM command buffer is NULL or the TPM command buffer size is 0. + @retval EFI_DEVICE_ERROR The TPM partition information is wrong. @retval EFI_DEVICE_ERROR An error occurred in communication with the TPM. **/ EFI_STATUS -GetTpmServicePartitionId ( - OUT UINT32 *PartitionId +FfaTpm2GetServicePartitionId ( + OUT UINT16 *PartitionId ) { EFI_STATUS Status; @@ -114,20 +115,6 @@ GetTpmServicePartitionId ( goto Exit; } - if (mFfaTpm2PartitionId != MAX_UINT32) { - *PartitionId = mFfaTpm2PartitionId; - Status = EFI_SUCCESS; - goto Exit; - } - - if (PcdGet16 (PcdTpmServiceFfaPartitionId) != 0) { - mFfaTpm2PartitionId = PcdGet16 (PcdTpmServiceFfaPartitionId); - *PartitionId = mFfaTpm2PartitionId; - Status = EFI_SUCCESS; - - goto Exit; - } - Status = ArmFfaLibPartitionIdGet (&PartId); if (EFI_ERROR (Status)) { DEBUG (( @@ -164,11 +151,14 @@ GetTpmServicePartitionId ( Status = EFI_INVALID_PARAMETER; DEBUG ((DEBUG_ERROR, "Invalid partition Info(%g). Count: %d, Size: %d\n", &gTpm2ServiceFfaGuid, Count, Size)); } else { - TpmPartInfo = (EFI_FFA_PART_INFO_DESC *)RxBuffer; - mFfaTpm2PartitionId = TpmPartInfo->PartitionId; - *PartitionId = mFfaTpm2PartitionId; - - Status = PcdSet16S (PcdTpmServiceFfaPartitionId, mFfaTpm2PartitionId); + TpmPartInfo = (EFI_FFA_PART_INFO_DESC *)RxBuffer; + *PartitionId = TpmPartInfo->PartitionId; + if (TpmPartInfo->PartitionId == TPM2_FFA_PARTITION_ID_INVALID) { + /* + * Tpm partition id never be TPM2_FFA_PARTITION_ID_INVALID. + */ + Status = EFI_DEVICE_ERROR; + } } RxRelease: @@ -202,7 +192,7 @@ Tpm2GetInterfaceVersion ( goto Exit; } - if (mFfaTpm2PartitionId == MAX_UINT32) { + if (mFfaTpm2PartitionId == TPM2_FFA_PARTITION_ID_INVALID) { GetTpmServicePartitionId (&mFfaTpm2PartitionId); } @@ -253,7 +243,7 @@ Tpm2GetFeatureInfo ( goto Exit; } - if (mFfaTpm2PartitionId == MAX_UINT32) { + if (mFfaTpm2PartitionId == TPM2_FFA_PARTITION_ID_INVALID) { GetTpmServicePartitionId (&mFfaTpm2PartitionId); } @@ -296,7 +286,7 @@ Tpm2ServiceStart ( EFI_STATUS Status; DIRECT_MSG_ARGS FfaDirectReq2Args; - if (mFfaTpm2PartitionId == MAX_UINT32) { + if (mFfaTpm2PartitionId == TPM2_FFA_PARTITION_ID_INVALID) { GetTpmServicePartitionId (&mFfaTpm2PartitionId); } @@ -341,7 +331,7 @@ Tpm2RegisterNotification ( EFI_STATUS Status; DIRECT_MSG_ARGS FfaDirectReq2Args; - if (mFfaTpm2PartitionId == MAX_UINT32) { + if (mFfaTpm2PartitionId == TPM2_FFA_PARTITION_ID_INVALID) { GetTpmServicePartitionId (&mFfaTpm2PartitionId); } @@ -380,7 +370,7 @@ Tpm2UnregisterNotification ( EFI_STATUS Status; DIRECT_MSG_ARGS FfaDirectReq2Args; - if (mFfaTpm2PartitionId == MAX_UINT32) { + if (mFfaTpm2PartitionId == TPM2_FFA_PARTITION_ID_INVALID) { GetTpmServicePartitionId (&mFfaTpm2PartitionId); } @@ -417,7 +407,7 @@ Tpm2FinishNotified ( EFI_STATUS Status; DIRECT_MSG_ARGS FfaDirectReq2Args; - if (mFfaTpm2PartitionId == MAX_UINT32) { + if (mFfaTpm2PartitionId == TPM2_FFA_PARTITION_ID_INVALID) { GetTpmServicePartitionId (&mFfaTpm2PartitionId); } From f47216f159ec85186480156e3566eb6c44ba2512 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Tue, 22 Jul 2025 14:37:50 +0100 Subject: [PATCH 0312/1172] SecurityPkg/Library: Tpm2DeviceSecLibFfa for PeilessSec To support measurement and extend PCR in PeilessSec with TPM device using FF-A over CRB, add Tpm2DeviceSecLibFfa for PeilessSec. Signed-off-by: Yeoreum Yun --- .../Tpm2DeviceLibFfa/Tpm2DeviceSecLibFfa.inf | 51 +++++++++++++++ .../Library/Tpm2DeviceLibFfa/Tpm2InfoSecFfa.c | 62 +++++++++++++++++++ SecurityPkg/SecurityPkg.dsc | 1 + 3 files changed, 114 insertions(+) create mode 100644 SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceSecLibFfa.inf create mode 100644 SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InfoSecFfa.c diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceSecLibFfa.inf b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceSecLibFfa.inf new file mode 100644 index 000000000000..2f4ae526194a --- /dev/null +++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceSecLibFfa.inf @@ -0,0 +1,51 @@ +## @file +# Provides function interfaces to communicate with TPM 2.0 device +# +# This library helps to use TPM 2.0 device in library function API +# based on FF-A using Command Response Buffer (CRB). +# +# Copyright (c), Microsoft Corporation. +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = Tpm2DeviceSecLibFfa + FILE_GUID = d66e7482-615c-11f0-91d0-47f6d24396e9 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = Tpm2DeviceLib|SEC + CONSTRUCTOR = Tpm2DeviceLibFfaConstructor + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = AARCH64 +# + +[Sources.common] + Tpm2DeviceLibFfa.c + Tpm2ServiceFfaRaw.c + Tpm2DeviceLibFfaBase.c + Tpm2Ptp.c + Tpm2DeviceLibFfa.h + Tpm2InfoSecFfa.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + SecurityPkg/SecurityPkg.dec + +[LibraryClasses] + BaseLib + DebugLib + TimerLib + BaseMemoryLib + IoLib + ArmFfaLib + +[Guids] + gTpm2ServiceFfaGuid + +[Pcd.common] + gEfiSecurityPkgTokenSpaceGuid.PcdTpmBaseAddress ## CONSUMES diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InfoSecFfa.c b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InfoSecFfa.c new file mode 100644 index 000000000000..2f264eb3f1be --- /dev/null +++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InfoSecFfa.c @@ -0,0 +1,62 @@ +/** @file + This library provides an interfaces to access DynamicPcds used + in Tpm2DeviceLibFfa. + + Copyright (c) 2025, Arm Ltd. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include + +#include "Tpm2DeviceLibFfa.h" + +/** + This function validate TPM interface type for TPM service over FF-A. + + @retval EFI_SUCCESS TPM interface type is valid. + + @retval EFI_UNSUPPORTED TPM interface type is invalid. + +**/ +EFI_STATUS +EFIAPI +ValidateTpmInterfaceType ( + VOID + ) +{ + TPM2_PTP_INTERFACE_TYPE TpmInterfaceType; + + TpmInterfaceType = Tpm2GetPtpInterface ((VOID *)(UINTN)PcdGet64 (PcdTpmBaseAddress)); + if (TpmInterfaceType != Tpm2PtpInterfaceCrb) { + return EFI_UNSUPPORTED; + } + + DEBUG ((DEBUG_INFO, "Setting Tpm Active Interface Type %d\n", TpmInterfaceType)); + + return EFI_SUCCESS; +} + +/** + This function is used to get the TPM service partition id. + + @param[out] PartitionId - Supplies the pointer to the TPM service partition id. + + @retval EFI_SUCCESS The TPM command was successfully sent to the TPM + and the response was copied to the Output buffer. + @retval EFI_INVALID_PARAMETER The TPM command buffer is NULL or the TPM command + buffer size is 0. + @retval EFI_DEVICE_ERROR An error occurred in communication with the TPM. +**/ +EFI_STATUS +EFIAPI +GetTpmServicePartitionId ( + OUT UINT16 *PartitionId + ) +{ + return FfaTpm2GetServicePartitionId (PartitionId); +} diff --git a/SecurityPkg/SecurityPkg.dsc b/SecurityPkg/SecurityPkg.dsc index 430b42c1548c..cb4780867098 100644 --- a/SecurityPkg/SecurityPkg.dsc +++ b/SecurityPkg/SecurityPkg.dsc @@ -426,6 +426,7 @@ SecurityPkg/Tcg/Tcg2StandaloneMmArm/Tcg2StandaloneMmArm.inf SecurityPkg/Tcg/Tcg2AcpiFfa/Tcg2AcpiFfa.inf SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.inf + SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceSecLibFfa.inf SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InstanceLibFfa.inf [BuildOptions] From 5fc1ba3f25aa9d6f629caa71490bbb04c9e740c1 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Fri, 9 May 2025 16:20:28 +0100 Subject: [PATCH 0313/1172] SecurityPkg/Tcg2Config: add Tcg2ConfigFfaPei To support TPM2 devices that operate over the FF-A specification using CRB in the Tcg2Pei PEIM, add the Tcg2ConfigFfaPei PEIM to detect the presence of such TPM2 devices. Signed-off-by: Yeoreum Yun --- SecurityPkg/SecurityPkg.dsc | 4 + .../Tcg/Tcg2Config/Tcg2ConfigFfaPei.inf | 53 +++++ .../Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c | 198 ++++++++++++++++++ 3 files changed, 255 insertions(+) create mode 100644 SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPei.inf create mode 100644 SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c diff --git a/SecurityPkg/SecurityPkg.dsc b/SecurityPkg/SecurityPkg.dsc index cb4780867098..ea6fdc23678a 100644 --- a/SecurityPkg/SecurityPkg.dsc +++ b/SecurityPkg/SecurityPkg.dsc @@ -91,6 +91,9 @@ [LibraryClasses.ARM, LibraryClasses.AARCH64] ArmTrngLib|MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.inf + ArmSmcLib|MdePkg/Library/ArmSmcLib/ArmSmcLib.inf + ArmSvcLib|MdePkg/Library/ArmSvcLib/ArmSvcLib.inf + ArmFfaLib|MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.inf [LibraryClasses.ARM] RngLib|MdeModulePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf @@ -425,6 +428,7 @@ [Components.AARCH64] SecurityPkg/Tcg/Tcg2StandaloneMmArm/Tcg2StandaloneMmArm.inf SecurityPkg/Tcg/Tcg2AcpiFfa/Tcg2AcpiFfa.inf + SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPei.inf SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.inf SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceSecLibFfa.inf SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InstanceLibFfa.inf diff --git a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPei.inf b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPei.inf new file mode 100644 index 000000000000..e20a1f8d2dcf --- /dev/null +++ b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPei.inf @@ -0,0 +1,53 @@ +## @file +# Set TPM device type +# +# This module initializes TPM device type based on CRB over FF-A interface +# +# Copyright (c) 2025, Arm Ltd. All rights reserved.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = Tcg2ConfigFfaPei + FILE_GUID = ae8c4c50-2cd7-11f0-9e39-a7fbc471b972 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + ENTRY_POINT = Tcg2ConfigFfaPeimEntryPoint + +# +# VALID_ARCHITECTURES = AARCH64 +# + +[Sources] + Tcg2ConfigFfaPeim.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + SecurityPkg/SecurityPkg.dec + +[LibraryClasses] + ArmFfaLib + BaseLib + BaseMemoryLib + PeiServicesLib + PeimEntryPoint + DebugLib + PcdLib + HobLib + +[Guids] + gTpm2ServiceFfaGuid ## SOMETIMES_CONSUMES + gEfiTpmDeviceInstanceNoneGuid ## SOMETIMES_CONSUMES + gEfiTpmDeviceSelectedGuid ## SOMETIMES_PRODUCES + +[Ppis] + gPeiTpmInitializationDonePpiGuid ## SOMETIMES_PRODUCES + +[Pcd] + gEfiSecurityPkgTokenSpaceGuid.PcdTpmInstanceGuid + +[Depex] + gEfiPeiMasterBootModePpiGuid diff --git a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c new file mode 100644 index 000000000000..ea01c9b815dd --- /dev/null +++ b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c @@ -0,0 +1,198 @@ +/** @file + Set TPM device type + + This module initializes the TPM device type based on a CRB over FF-A + interface + + Copyright (C) 2025, Arm Ltd. + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - https://developer.arm.com/documentation/den0138/latest/ +**/ + +#include + +#include +#include + +#include +#include +#include +#include +#include + +#define TPM2_FFA_SERVICE_MAJOR_VERSION (1) +#define TPM2_FFA_SERVICE_MINOR_VERSION (0) + +STATIC CONST EFI_PEI_PPI_DESCRIPTOR mTpmSelectedPpi = { + (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), + &gEfiTpmDeviceSelectedGuid, + NULL +}; + +STATIC CONST EFI_PEI_PPI_DESCRIPTOR mTpmInitializationDonePpiList = { + EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST, + &gPeiTpmInitializationDonePpiGuid, + NULL +}; + +/** + Check the Tpm Service Interface version. + + See the CRB over FF-A spec 6.1. + all of arguments' value based on the specification. + + @param [in] TpmPartId TPM service partition id. + + @retval EFI_SUCCESS + @retval EFI_DEVICE_ERROR Failed to communicate TPM SP. + @retval EFI_UNSUPPORTED Unsupported version of TPM service + +**/ +STATIC +EFI_STATUS +EFIAPI +Tpm2FfaCheckInterfaceVersion ( + IN UINT16 TpmPartId + ) +{ + EFI_STATUS Status; + DIRECT_MSG_ARGS TpmArgs; + UINT16 MajorVer; + UINT16 MinorVer; + + ZeroMem (&TpmArgs, sizeof (DIRECT_MSG_ARGS)); + TpmArgs.Arg0 = TPM2_FFA_GET_INTERFACE_VERSION; + + Status = ArmFfaLibMsgSendDirectReq2 (TpmPartId, &gTpm2ServiceFfaGuid, &TpmArgs); + while (Status == EFI_INTERRUPT_PENDING) { + // We are assuming vCPU0 of the TPM SP since it is UP. + Status = ArmFfaLibRun (TpmPartId, 0x00); + } + + if (EFI_ERROR (Status) || (TpmArgs.Arg0 != TPM2_FFA_SUCCESS_OK_RESULTS_RETURNED)) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to get interface version... Status: %r, TpmArgs.Arg0: 0x%x\n", + __func__, + Status, + TpmArgs.Arg0 + )); + + return EFI_DEVICE_ERROR; + } + + MajorVer = (TpmArgs.Arg1 & TPM2_FFA_SERVICE_MAJOR_VER_MASK) >> TPM2_FFA_SERVICE_MAJOR_VER_SHIFT; + MinorVer = (TpmArgs.Arg1 & TPM2_FFA_SERVICE_MINOR_VER_MASK) >> TPM2_FFA_SERVICE_MINOR_VER_SHIFT; + if ((MajorVer != TPM2_FFA_SERVICE_MAJOR_VERSION) || (MinorVer < TPM2_FFA_SERVICE_MINOR_VERSION)) { + DEBUG (( + DEBUG_ERROR, + "%a: Wrong Tpm Ffa Interface Version...: v%d.%d\n", + __func__, + MajorVer, + MinorVer + )); + return EFI_UNSUPPORTED; + } + + return EFI_SUCCESS; +} + +/** + The entry point for Tcg2 configuration driver. + + @param FileHandle Handle of the file being invoked. + @param PeiServices Describes the list of possible PEI Services. +**/ +EFI_STATUS +EFIAPI +Tcg2ConfigFfaPeimEntryPoint ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + EFI_STATUS Status; + UINTN Size; + UINT16 PartId; + UINT16 TpmPartId; + EFI_FFA_PART_INFO_DESC *TpmPartInfo; + VOID *TxBuffer; + UINT64 TxBufferSize; + VOID *RxBuffer; + UINT64 RxBufferSize; + UINT32 Count; + CONST EFI_PEI_PPI_DESCRIPTOR *PpiList; + GUID *TpmInstanceGuid; + + DEBUG ((DEBUG_INFO, "%a\n", __func__)); + + TpmInstanceGuid = &gEfiTpmDeviceInstanceNoneGuid; + PpiList = &mTpmInitializationDonePpiList; + + Status = ArmFfaLibPartitionIdGet (&PartId); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to get partition-id. Status: %r\n", Status)); + goto Cleanup; + } + + Status = ArmFfaLibGetRxTxBuffers ( + &TxBuffer, + &TxBufferSize, + &RxBuffer, + &RxBufferSize + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to get Rx/Tx Buffer. Status: %r\n", Status)); + goto Cleanup; + } + + Status = ArmFfaLibPartitionInfoGet ( + &gTpm2ServiceFfaGuid, + FFA_PART_INFO_FLAG_TYPE_DESC, + &Count, + (UINT32 *)&Size + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to get Tpm2 partition info. Status: %r\n", Status)); + goto Cleanup; + } + + if ((Count != 1) || (Size < sizeof (EFI_FFA_PART_INFO_DESC))) { + Status = EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "Invalid partition Info(%g). Count: %d, Size: %d\n", &gTpm2ServiceFfaGuid, Count, Size)); + ArmFfaLibRxRelease (PartId); + goto Cleanup; + } + + TpmPartInfo = (EFI_FFA_PART_INFO_DESC *)RxBuffer; + TpmPartId = TpmPartInfo->PartitionId; + ArmFfaLibRxRelease (PartId); + + Status = Tpm2FfaCheckInterfaceVersion (TpmPartId); + if (EFI_ERROR (Status)) { + goto Cleanup; + } + + /* + * Set the PcdTpmInstanceGuid to TPM using CRB over FF-A + * So that Tpm2DeviceLibRouterPei/Dxe can communicate with + * TPM secure partition. + */ + TpmInstanceGuid = &gTpm2ServiceFfaGuid; + PpiList = &mTpmSelectedPpi; + +Cleanup: + Size = sizeof (GUID); + Status = PcdSetPtrS ( + PcdTpmInstanceGuid, + &Size, + TpmInstanceGuid + ); + ASSERT_EFI_ERROR (Status); + + Status = PeiServicesInstallPpi (PpiList); + + return Status; +} From e841099600749c29edaf48236909529d8e629869 Mon Sep 17 00:00:00 2001 From: Prachotan Reddy Bathi Date: Thu, 30 Jan 2025 15:52:29 -0600 Subject: [PATCH 0314/1172] ArmPkg/ArmTransferListLib: Add utility functions Added functionality TransferList Library TransferListVerifyChecksum - Verify TransferList CheckSum TransferListCheckHeader - Check if TransferList header is valid, return suitable opcodes validating the header TransferListFindEntry - Find a specific entry on the TransferList using the TagId TransferListDump - Dump the contents of the TransferList header and the entry headers Signed-off-by: Prachotan Reddy Bathi --- .../IndustryStandard/ArmTransferList.h | 12 +- ArmPkg/Include/Library/ArmTransferListLib.h | 58 ++++++- .../ArmTransferListLib/ArmTransferListLib.c | 156 +++++++++++++++++- 3 files changed, 222 insertions(+), 4 deletions(-) diff --git a/ArmPkg/Include/IndustryStandard/ArmTransferList.h b/ArmPkg/Include/IndustryStandard/ArmTransferList.h index 455c7d809d6d..303384622f95 100644 --- a/ArmPkg/Include/IndustryStandard/ArmTransferList.h +++ b/ArmPkg/Include/IndustryStandard/ArmTransferList.h @@ -2,7 +2,7 @@ Header file defining a Transfer List and Transfer Entry as specified by the A-profile Firmware Handoff Protocol specification. - Copyright (c) 2024, Arm Limited. All rights reserved.
+ Copyright (c) 2025, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @par Reference(s): @@ -73,6 +73,16 @@ */ #define TRANSFER_LIST_FL_HAS_CHECKSUM BIT0 +/* + * Operation codes indicating the validity of the Transfer List. + */ +typedef enum { + TRANSFER_LIST_OPS_INVALID, /* invalid for any operation */ + TRANSFER_LIST_OPS_ALL, /* valid for all operations */ + TRANSFER_LIST_OPS_RO, /* valid for read only */ + TRANSFER_LIST_OPS_CUSTOM, /* abort or switch to special code to interpret */ +} TRANSFER_LIST_OPS; + /* * Transfer list starts with the following header. * Transfer entries followed after the following header. diff --git a/ArmPkg/Include/Library/ArmTransferListLib.h b/ArmPkg/Include/Library/ArmTransferListLib.h index 96a12275b8fa..fb0c69972e07 100644 --- a/ArmPkg/Include/Library/ArmTransferListLib.h +++ b/ArmPkg/Include/Library/ArmTransferListLib.h @@ -2,7 +2,7 @@ Library that implements the helper functions to parse and pack a Transfer List as specified by the A-profile Firmware Handoff Specification. - Copyright (c) 2022, Arm Limited. All rights reserved.
+ Copyright (c) 2022 - 2025, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @par Reference(s): @@ -21,7 +21,7 @@ /** Return the first Transfer Entry Node in the Transfer List. - @param [in] TransferListHeader TransferListHeader + @param [in] TransferListHeader Pointer to the Transfer List Header. @return Pointer to the Transfer Entry Node if successful otherwise NULL @@ -103,4 +103,58 @@ TransferListGetEntryData ( IN TRANSFER_ENTRY_HEADER *TransferEntry ); +/** + Dump the transfer list to the debug output. + + @param [in] TransferListHeader Pointer to the Transfer List Header + +**/ +VOID +EFIAPI +TransferListDump ( + IN TRANSFER_LIST_HEADER *TransferListHeader + ); + +/** + Verify the checksum of the transfer list. + + @param [in] TransferListHeader Pointer to the Transfer List Header + + @retval FALSE Invalid Checksum + @retval TRUE Valid Checksum +**/ +BOOLEAN +EFIAPI +TransferListVerifyChecksum ( + IN TRANSFER_LIST_HEADER *TransferListHeader + ); + +/** + Check the header of the Transfer List. + + @param [in] TransferListHeader Pointer to the Transfer List Header + + @return TRANSFER_LIST_OPS code indicating the validity of the Transfer List +**/ +TRANSFER_LIST_OPS +EFIAPI +TransferListCheckHeader ( + IN TRANSFER_LIST_HEADER *TransferListHeader + ); + +/** + Find a Transfer Entry Node in the Transfer List matched with the given tag-id. + + @param [in] TransferListHeader Pointer to the Transfer List Header + @param [in] TagId Tag id + + @return Pointer to the Transfer Entry Node if successful otherwise NULL +**/ +TRANSFER_ENTRY_HEADER * +EFIAPI +TransferListFindEntry ( + IN TRANSFER_LIST_HEADER *TransferListHeader, + IN UINT16 TagId + ); + #endif // ARM_TRANSFER_LIST_LIB_ diff --git a/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.c b/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.c index 7cd203e4865c..af8170e67f37 100644 --- a/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.c +++ b/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.c @@ -2,7 +2,7 @@ Library that implements the helper functions to parse and pack a Transfer List as specified by the A-profile Firmware Handoff Specification. - Copyright (c) 2022, Arm Limited. All rights reserved.
+ Copyright (c) 2022 - 2025, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @par Reference(s): @@ -14,6 +14,90 @@ #include #include +/** + This function verifies the checksum of the Transfer List. + + @param [in] TransferListHeader Pointer to the Transfer List Header + + @retval FALSE Invalid Checksum + @retval TRUE Valid Checksum + +**/ +BOOLEAN +EFIAPI +TransferListVerifyChecksum ( + IN TRANSFER_LIST_HEADER *TransferListHeader + ) +{ + if (TransferListHeader == NULL) { + return FALSE; + } + + if ((TransferListHeader->Flags & TRANSFER_LIST_FL_HAS_CHECKSUM) == 0) { + return TRUE; + } + + return (CalculateSum8 ((UINT8 *)TransferListHeader, TransferListHeader->UsedSize) == 0); +} + +/** + This function checks the header of the Transfer List. + + @param [in] TransferListHeader Pointer to the Transfer List Header + + @return TRANSFER_LIST_OPS code indicating the validity of the Transfer List + +**/ +TRANSFER_LIST_OPS +EFIAPI +TransferListCheckHeader ( + IN TRANSFER_LIST_HEADER *TransferListHeader + ) +{ + if (TransferListHeader == NULL) { + return TRANSFER_LIST_OPS_INVALID; + } + + if (TransferListHeader->Signature != TRANSFER_LIST_SIGNATURE_64) { + DEBUG ((DEBUG_ERROR, "Bad transfer list signature 0x%x\n", TransferListHeader->Signature)); + return TRANSFER_LIST_OPS_INVALID; + } + + if (TransferListHeader->TotalSize == 0) { + DEBUG ((DEBUG_ERROR, "Bad transfer list total size 0x%x\n", TransferListHeader->TotalSize)); + return TRANSFER_LIST_OPS_INVALID; + } + + if (TransferListHeader->UsedSize > TransferListHeader->TotalSize) { + DEBUG ((DEBUG_ERROR, "Bad transfer list used size 0x%x\n", TransferListHeader->UsedSize)); + return TRANSFER_LIST_OPS_INVALID; + } + + if (TransferListHeader->HeaderSize != sizeof (TRANSFER_LIST_HEADER)) { + DEBUG ((DEBUG_ERROR, "Bad transfer list header size 0x%x\n", TransferListHeader->HeaderSize)); + return TRANSFER_LIST_OPS_INVALID; + } + + if (TransferListVerifyChecksum (TransferListHeader) == FALSE) { + DEBUG ((DEBUG_ERROR, "Bad transfer list checksum 0x%x\n", TransferListHeader->Checksum)); + return TRANSFER_LIST_OPS_INVALID; + } + + if (TransferListHeader->Version == 0) { + DEBUG ((DEBUG_ERROR, "Transfer list version is invalid\n")); + return TRANSFER_LIST_OPS_INVALID; + } else if (TransferListHeader->Version == ARM_FW_HANDOFF_PROTOCOL_VERSION) { + DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Transfer list version is valid for all operations\n")); + return TRANSFER_LIST_OPS_ALL; + } else if (TransferListHeader->Version > ARM_FW_HANDOFF_PROTOCOL_VERSION) { + DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Transfer list version is valid for read-only\n")); + return TRANSFER_LIST_OPS_RO; + } + + DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Old or custom transfer list version is detected\n")); + return TRANSFER_LIST_OPS_CUSTOM; +} + /** Return the first Transfer Entry Node in the Transfer List. @@ -165,3 +249,73 @@ TransferListGetEntryData ( return (VOID *)((UINTN)TransferEntry + TransferEntry->HeaderSize); } + +/** + Find a Transfer Entry Node in the Transfer List matched with the given tag-id. + + @param [in] TransferListHeader Pointer to the Transfer List Header + @param [in] TagId Tag id + + @return Pointer to the Transfer Entry Node if successful otherwise NULL +**/ +TRANSFER_ENTRY_HEADER * +EFIAPI +TransferListFindEntry ( + IN TRANSFER_LIST_HEADER *TransferListHeader, + IN UINT16 TagId + ) +{ + TRANSFER_ENTRY_HEADER *Entry = NULL; + + do { + Entry = TransferListGetNextEntry (TransferListHeader, Entry); + } while ((Entry != NULL) && (Entry->TagId != TagId)); + + return Entry; +} + +/** + Dump the transfer list to the debug output. + + @param [in] TransferListHeader Pointer to the Transfer List Header + +**/ +VOID +EFIAPI +TransferListDump ( + IN TRANSFER_LIST_HEADER *TransferListHeader + ) +{ + TRANSFER_ENTRY_HEADER *Entry; + UINTN Idx; + + Entry = NULL; + Idx = 0; + + if (TransferListHeader == NULL) { + return; + } + + DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Dump transfer list:\n")); + DEBUG ((DEBUG_INFO | DEBUG_LOAD, "signature 0x%x\n", TransferListHeader->Signature)); + DEBUG ((DEBUG_INFO | DEBUG_LOAD, "checksum 0x%x\n", TransferListHeader->Checksum)); + DEBUG ((DEBUG_INFO | DEBUG_LOAD, "version 0x%x\n", TransferListHeader->Version)); + DEBUG ((DEBUG_INFO | DEBUG_LOAD, "hdr_size 0x%x\n", TransferListHeader->HeaderSize)); + DEBUG ((DEBUG_INFO | DEBUG_LOAD, "alignment 0x%x\n", TransferListHeader->Alignment)); + DEBUG ((DEBUG_INFO | DEBUG_LOAD, "used_size 0x%x\n", TransferListHeader->UsedSize)); + DEBUG ((DEBUG_INFO | DEBUG_LOAD, "total_size 0x%x\n", TransferListHeader->TotalSize)); + DEBUG ((DEBUG_INFO | DEBUG_LOAD, "flags 0x%x\n", TransferListHeader->Flags)); + + while (TRUE) { + Entry = TransferListGetNextEntry (TransferListHeader, Entry); + if (Entry == NULL) { + break; + } + + DEBUG ((DEBUG_INFO | DEBUG_LOAD, "Entry %d:\n", Idx++)); + DEBUG ((DEBUG_INFO | DEBUG_LOAD, "tag_id 0x%x\n", Entry->TagId)); + DEBUG ((DEBUG_INFO | DEBUG_LOAD, "hdr_size 0x%x\n", Entry->HeaderSize)); + DEBUG ((DEBUG_INFO | DEBUG_LOAD, "data_size 0x%x\n", Entry->DataSize)); + DEBUG ((DEBUG_INFO | DEBUG_LOAD, "data_addr 0x%lx\n", (UINTN)TransferListGetEntryData (Entry))); + } +} From b1096651d8084a355d8043de4f0df08c69c18259 Mon Sep 17 00:00:00 2001 From: Prachotan Bathi Date: Thu, 24 Apr 2025 10:16:19 -0500 Subject: [PATCH 0315/1172] ArmPlatformPkg: Capture TransferList information for PeilessSec Capture TransferList address from register x3 Refer to section 3 of the FW Handoff Specification https://firmwarehandoff.github.io/firmware_handoff The TransferList header is present at the base address captured by this variable. For platforms with no TransferList support, boot continues without any errors. Signed-off-by: Prachotan Reddy Bathi --- ArmPlatformPkg/ArmPlatformPkg.dsc | 1 + .../PeilessSec/AArch64/ModuleEntryPoint.S | 20 ++++++++++++++- ArmPlatformPkg/PeilessSec/PeilessSec.c | 25 ++++++++++++++++--- ArmPlatformPkg/PeilessSec/PeilessSec.h | 1 + ArmPlatformPkg/PeilessSec/PeilessSec.inf | 1 + 5 files changed, 44 insertions(+), 4 deletions(-) diff --git a/ArmPlatformPkg/ArmPlatformPkg.dsc b/ArmPlatformPkg/ArmPlatformPkg.dsc index 062246d8f2f2..278d3cf1f22b 100644 --- a/ArmPlatformPkg/ArmPlatformPkg.dsc +++ b/ArmPlatformPkg/ArmPlatformPkg.dsc @@ -70,6 +70,7 @@ UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf + ArmTransferListLib|ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.inf [LibraryClasses.common.PEIM] HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf diff --git a/ArmPlatformPkg/PeilessSec/AArch64/ModuleEntryPoint.S b/ArmPlatformPkg/PeilessSec/AArch64/ModuleEntryPoint.S index 5f285f3f1322..94635ef8d340 100644 --- a/ArmPlatformPkg/PeilessSec/AArch64/ModuleEntryPoint.S +++ b/ArmPlatformPkg/PeilessSec/AArch64/ModuleEntryPoint.S @@ -1,13 +1,29 @@ // -// Copyright (c) 2011 - 2020, Arm Limited. All rights reserved.
+// Copyright (c) 2011 - 2025, Arm Limited. All rights reserved.
// // SPDX-License-Identifier: BSD-2-Clause-Patent // +// @Par Reference(s): +// - Firmware Handoff specification [https://firmwarehandoff.github.io/firmware_handoff/main] // #include ASM_FUNC(_ModuleEntryPoint) + + // Check if register assignment at handoff matches spec + MOV64 (x4, 0x14a0fb10b) + cmp x1, x4 + // Skip TransferList init if x1 is not equal to the TransferList signature + b.ne _SkipTransferList + + // Skip TransferList init if x2 is not equal to 0 + cbnz x2, _SkipTransferList + + // Set the TransferList Base Address from register x3 + mov x6, x3 + +_SkipTransferList: // Do early platform specific actions bl ASM_PFX(ArmPlatformPeiBootAction) @@ -76,6 +92,8 @@ _GetStackBase: MOV32 (x2, FixedPcdGet32(PcdCPUCorePrimaryStackSize)) sub x1, x1, x2 + // Pass Transfer List Base Address + mov x2, x6 // Move sec startup address into a data register // Ensure we're jumping to FV version of the code (not boot remapped alias) ldr x4, =ASM_PFX(CEntryPoint) diff --git a/ArmPlatformPkg/PeilessSec/PeilessSec.c b/ArmPlatformPkg/PeilessSec/PeilessSec.c index 639c3744c986..95b81485a115 100644 --- a/ArmPlatformPkg/PeilessSec/PeilessSec.c +++ b/ArmPlatformPkg/PeilessSec/PeilessSec.c @@ -53,13 +53,15 @@ GetPlatformPpi ( @param[in] UefiMemoryBase Start of the PI/UEFI memory region @param[in] StackBase Start of the stack @param[in] StartTimeStamp Timer value at start of execution + @param[in] TransferListBaseAddr Base address of the Transfer List **/ STATIC VOID SecMain ( IN UINTN UefiMemoryBase, IN UINTN StackBase, - IN UINT64 StartTimeStamp + IN UINT64 StartTimeStamp, + IN UINTN TransferListBaseAddr ) { EFI_HOB_HANDOFF_INFO_TABLE *HobList; @@ -71,6 +73,7 @@ SecMain ( UINTN CharCount; UINTN StacksSize; FIRMWARE_SEC_PERFORMANCE Performance; + VOID *TransferListBase; // If ensure the FD is either part of the System Memory or totally outside of the System Memory (XIP) ASSERT ( @@ -134,6 +137,20 @@ SecMain ( } } + // Dump the Transfer List + TransferListBase = (VOID *)TransferListBaseAddr; + if (TransferListBase != NULL) { + if (TransferListCheckHeader (TransferListBase) != TRANSFER_LIST_OPS_INVALID) { + DEBUG_CODE_BEGIN (); + TransferListDump (TransferListBase); + DEBUG_CODE_END (); + } else { + DEBUG ((DEBUG_ERROR, "%a: No valid operations possible on TransferList found @ 0x%p\n", __func__, TransferListBase)); + } + } else { + DEBUG ((DEBUG_INFO, "%a: No TransferList found, continuing boot\n", __func__)); + } + // Store timer value logged at the beginning of firmware image execution Performance.ResetEnd = GetTimeInNanoSecond (StartTimeStamp); @@ -167,11 +184,13 @@ SecMain ( @param[in] UefiMemoryBase Start of the PI/UEFI memory region @param[in] StackBase Start of the stack + @param[in] TransferListBaseAddr Base address of the Transfer List **/ VOID CEntryPoint ( IN UINTN UefiMemoryBase, - IN UINTN StackBase + IN UINTN StackBase, + IN UINTN TransferListBaseAddr ) { UINT64 StartTimeStamp; @@ -198,7 +217,7 @@ CEntryPoint ( FixedPcdGet32 (PcdSystemMemoryUefiRegionSize) ); - SecMain (UefiMemoryBase, StackBase, StartTimeStamp); + SecMain (UefiMemoryBase, StackBase, StartTimeStamp, TransferListBaseAddr); // DXE Core should always load and never return ASSERT (FALSE); diff --git a/ArmPlatformPkg/PeilessSec/PeilessSec.h b/ArmPlatformPkg/PeilessSec/PeilessSec.h index 70d78cafb0ef..217bf49f4205 100644 --- a/ArmPlatformPkg/PeilessSec/PeilessSec.h +++ b/ArmPlatformPkg/PeilessSec/PeilessSec.h @@ -24,6 +24,7 @@ #include #include #include +#include #include #include diff --git a/ArmPlatformPkg/PeilessSec/PeilessSec.inf b/ArmPlatformPkg/PeilessSec/PeilessSec.inf index e210d016dadc..4200d1a0e5d5 100644 --- a/ArmPlatformPkg/PeilessSec/PeilessSec.inf +++ b/ArmPlatformPkg/PeilessSec/PeilessSec.inf @@ -52,6 +52,7 @@ SerialPortLib TimerLib StackCheckLib + ArmTransferListLib [Ppis] gArmMpCoreInfoPpiGuid From 78d17ce5d2ca26e75af066d59ef7925a95fefcc9 Mon Sep 17 00:00:00 2001 From: Prachotan Reddy Bathi Date: Mon, 27 Jan 2025 12:48:14 -0600 Subject: [PATCH 0316/1172] ArmPkg: Add ArmTransferListHob Guid ArmTransferListHobGuid will hold the TransferList base address https://firmwarehandoff.github.io/firmware_handoff Signed-off-by: Prachotan Reddy Bathi --- ArmPkg/ArmPkg.dec | 2 ++ ArmPkg/Include/Guid/TransferListHob.h | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 ArmPkg/Include/Guid/TransferListHob.h diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec index ab3c3b365a77..4a41ad96571a 100644 --- a/ArmPkg/ArmPkg.dec +++ b/ArmPkg/ArmPkg.dec @@ -87,6 +87,8 @@ # Include/Guid/ArmMpCoreInfo.h gArmMpCoreInfoGuid = { 0xa4ee0728, 0xe5d7, 0x4ac5, {0xb2, 0x1e, 0x65, 0x8e, 0xd8, 0x57, 0xe8, 0x34} } + gArmTransferListHobGuid = { 0xebe7bae8, 0xfe18, 0x43c5, { 0xbf, 0x3f, 0xf2, 0xb1, 0xaf, 0xb2, 0xdf, 0xb8 } } + [Protocols.common] ## Arm System Control and Management Interface(SCMI) Base protocol ## ArmPkg/Include/Protocol/ArmScmiBaseProtocol.h diff --git a/ArmPkg/Include/Guid/TransferListHob.h b/ArmPkg/Include/Guid/TransferListHob.h new file mode 100644 index 000000000000..b8f9cc0b1eed --- /dev/null +++ b/ArmPkg/Include/Guid/TransferListHob.h @@ -0,0 +1,23 @@ +/** @file + GUID for the HOB that contains the copy of the Transfer List + + Copyright (C) 2024, Arm Limited. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - https://github.com/FirmwareHandoff/firmware_handoff + +**/ + +#ifndef ARM_TRANSFER_LIST_HOB_H__ +#define ARM_TRANSFER_LIST_HOB_H__ + +#define ARM_TRANSFER_LIST_HOB_GUID {\ + 0xebe7bae8, 0xfe18, 0x43c5, \ + { 0xbf, 0x3f, 0xf2, 0xb1, 0xaf, 0xb2, 0xdf, 0xb8 } \ + } + +extern EFI_GUID gArmTransferListHobGuid; + +#endif From 078414f0459963fc8254cf6115a5e28e411f63e2 Mon Sep 17 00:00:00 2001 From: Prachotan Bathi Date: Fri, 30 May 2025 10:01:19 -0500 Subject: [PATCH 0317/1172] ArmPlatformPkg: Introduce TransferList Guid Hob for PeilessSec ArmTransferListHobGuid holds TransferList base address If there's no valid TransferList found, Guid HOB is not built, boot progresses as usual. Signed-off-by: Prachotan Bathi --- ArmPlatformPkg/PeilessSec/PeilessSec.c | 6 ++++++ ArmPlatformPkg/PeilessSec/PeilessSec.h | 1 + ArmPlatformPkg/PeilessSec/PeilessSec.inf | 1 + 3 files changed, 8 insertions(+) diff --git a/ArmPlatformPkg/PeilessSec/PeilessSec.c b/ArmPlatformPkg/PeilessSec/PeilessSec.c index 95b81485a115..b9b7196a51a1 100644 --- a/ArmPlatformPkg/PeilessSec/PeilessSec.c +++ b/ArmPlatformPkg/PeilessSec/PeilessSec.c @@ -74,6 +74,7 @@ SecMain ( UINTN StacksSize; FIRMWARE_SEC_PERFORMANCE Performance; VOID *TransferListBase; + UINTN *TransferListHobData; // If ensure the FD is either part of the System Memory or totally outside of the System Memory (XIP) ASSERT ( @@ -144,6 +145,11 @@ SecMain ( DEBUG_CODE_BEGIN (); TransferListDump (TransferListBase); DEBUG_CODE_END (); + + TransferListHobData = BuildGuidHob (&gArmTransferListHobGuid, sizeof (*TransferListHobData)); + ASSERT (TransferListHobData != NULL); + + *TransferListHobData = (UINTN)TransferListBase; } else { DEBUG ((DEBUG_ERROR, "%a: No valid operations possible on TransferList found @ 0x%p\n", __func__, TransferListBase)); } diff --git a/ArmPlatformPkg/PeilessSec/PeilessSec.h b/ArmPlatformPkg/PeilessSec/PeilessSec.h index 217bf49f4205..73b6b25b5a56 100644 --- a/ArmPlatformPkg/PeilessSec/PeilessSec.h +++ b/ArmPlatformPkg/PeilessSec/PeilessSec.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include diff --git a/ArmPlatformPkg/PeilessSec/PeilessSec.inf b/ArmPlatformPkg/PeilessSec/PeilessSec.inf index 4200d1a0e5d5..db7449f61b29 100644 --- a/ArmPlatformPkg/PeilessSec/PeilessSec.inf +++ b/ArmPlatformPkg/PeilessSec/PeilessSec.inf @@ -60,6 +60,7 @@ [Guids] gArmMpCoreInfoGuid gEfiFirmwarePerformanceGuid + gArmTransferListHobGuid [FeaturePcd] gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob From 6a329eb853d177a8ba608d3503f394b906e9e6a8 Mon Sep 17 00:00:00 2001 From: Prachotan Bathi Date: Tue, 1 Jul 2025 11:28:58 -0500 Subject: [PATCH 0318/1172] ArmPlatformPkg: Capture TransferList Information for SEC Capture TransferList address from register x3 Refer to section 3 of the FW Handoff Specification https://firmwarehandoff.github.io/firmware_handoff The TransferList header is present at the base address captured by this variable. For platforms with no TransferList support, boot continues without any errors. Signed-off-by: Prachotan Bathi --- ArmPlatformPkg/Sec/AArch64/ModuleEntryPoint.S | 16 ++++++++++- ArmPlatformPkg/Sec/Sec.c | 27 ++++++++++++++++--- ArmPlatformPkg/Sec/Sec.h | 1 + ArmPlatformPkg/Sec/Sec.inf | 1 + 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/ArmPlatformPkg/Sec/AArch64/ModuleEntryPoint.S b/ArmPlatformPkg/Sec/AArch64/ModuleEntryPoint.S index 154be1111d09..28cd01577252 100644 --- a/ArmPlatformPkg/Sec/AArch64/ModuleEntryPoint.S +++ b/ArmPlatformPkg/Sec/AArch64/ModuleEntryPoint.S @@ -8,6 +8,19 @@ #include ASM_FUNC(_ModuleEntryPoint) + // Check if register assignment at handoff matches spec + MOV64 (x4, 0x14a0fb10b) + // Check if x1 holds TransferList signature + cmp x1, x4 + b.ne _SkipTransferList + + // Skip TransferList init if x2 is not equal to 0 + cbnz x2, _SkipTransferList + + // Set the TransferList Base Address from register x3 + mov x10, x3 + +_SkipTransferList: // Do early platform specific actions bl ASM_PFX(ArmPlatformPeiBootAction) @@ -47,7 +60,8 @@ ASM_PFX(MainEntryPoint): // The PEI Core Entry Point has been computed by GenFV and stored in the second entry of the Reset Vector MOV64 (x2, FixedPcdGet64(PcdFvBaseAddress)) ldr x0, [x2, #8] - + // Pass the TransferList Base Address + mov x1, x10 // Move sec startup address into a data register // Ensure we're jumping to FV version of the code (not boot remapped alias) ldr x3, =ASM_PFX(CEntryPoint) diff --git a/ArmPlatformPkg/Sec/Sec.c b/ArmPlatformPkg/Sec/Sec.c index 4535ae7e78fb..0e9d1c82fe57 100644 --- a/ArmPlatformPkg/Sec/Sec.c +++ b/ArmPlatformPkg/Sec/Sec.c @@ -151,12 +151,15 @@ PrintFirmwareVersion ( @param[in] PeiCoreEntryPoint Address in ram of the entrypoint of the PEI core + @param[in] TransferListBaseAddr Address of the Transfer List base address + **/ STATIC VOID EFIAPI SecMain ( - IN EFI_PEI_CORE_ENTRY_POINT PeiCoreEntryPoint + IN EFI_PEI_CORE_ENTRY_POINT PeiCoreEntryPoint, + IN UINTN TransferListBaseAddr ) { EFI_SEC_PEI_HAND_OFF SecCoreData; @@ -164,6 +167,21 @@ SecMain ( EFI_PEI_PPI_DESCRIPTOR *PpiList; UINTN TemporaryRamBase; UINTN TemporaryRamSize; + VOID *TransferListBase; + + // Dump the Transfer List + TransferListBase = (VOID *)TransferListBaseAddr; + if (TransferListBase != NULL) { + if (TransferListCheckHeader (TransferListBase) != TRANSFER_LIST_OPS_INVALID) { + DEBUG_CODE_BEGIN (); + TransferListDump (TransferListBase); + DEBUG_CODE_END (); + } else { + DEBUG ((DEBUG_ERROR, "%a: No valid operations possible on TransferList found @ 0x%p\n", __func__, TransferListBase)); + } + } else { + DEBUG ((DEBUG_INFO, "%a: No TransferList found, continuing boot\n", __func__)); + } CreatePpiList (&PpiListSize, &PpiList); @@ -197,10 +215,13 @@ SecMain ( @param[in] PeiCoreEntryPoint Address in ram of the entrypoint of the PEI core + @param[in] TransferListBaseAddr Address of the Transfer List base address + **/ VOID CEntryPoint ( - IN EFI_PEI_CORE_ENTRY_POINT PeiCoreEntryPoint + IN EFI_PEI_CORE_ENTRY_POINT PeiCoreEntryPoint, + IN UINTN TransferListBaseAddr ) { if (!ArmMmuEnabled ()) { @@ -237,7 +258,7 @@ CEntryPoint ( ArmPlatformInitialize (ArmReadMpidr ()); // Goto primary Main. - SecMain (PeiCoreEntryPoint); + SecMain (PeiCoreEntryPoint, TransferListBaseAddr); // PEI Core should always load and never return ASSERT (FALSE); diff --git a/ArmPlatformPkg/Sec/Sec.h b/ArmPlatformPkg/Sec/Sec.h index 56d9f352bda2..c1cd10d9093b 100644 --- a/ArmPlatformPkg/Sec/Sec.h +++ b/ArmPlatformPkg/Sec/Sec.h @@ -23,6 +23,7 @@ #include #include +#include /** Helper function to switch to a different stack. Implemented in assembler as diff --git a/ArmPlatformPkg/Sec/Sec.inf b/ArmPlatformPkg/Sec/Sec.inf index a75ce8d5ec35..2d1622cf52ad 100644 --- a/ArmPlatformPkg/Sec/Sec.inf +++ b/ArmPlatformPkg/Sec/Sec.inf @@ -48,6 +48,7 @@ PrintLib SerialPortLib StackCheckLib + ArmTransferListLib [Ppis] gEfiTemporaryRamSupportPpiGuid From 0bad279bd4809ca48c6ee913f32899c26976e319 Mon Sep 17 00:00:00 2001 From: Prachotan Bathi Date: Tue, 1 Jul 2025 11:26:23 -0500 Subject: [PATCH 0319/1172] ArmPkg: Add gArmTransferListPpiGuid ArmTransferListHobGuid will hold the TransferList base address https://firmwarehandoff.github.io/firmware_handoff SEC platforms can utilise this PPI to build the TransferList HOB Signed-off-by: Prachotan Bathi --- ArmPkg/ArmPkg.dec | 1 + 1 file changed, 1 insertion(+) diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec index 4a41ad96571a..a2b7c173d1ed 100644 --- a/ArmPkg/ArmPkg.dec +++ b/ArmPkg/ArmPkg.dec @@ -108,6 +108,7 @@ [Ppis] ## Include/Ppi/ArmMpCoreInfo.h gArmMpCoreInfoPpiGuid = { 0x6847cc74, 0xe9ec, 0x4f8f, {0xa2, 0x9d, 0xab, 0x44, 0xe7, 0x54, 0xa8, 0xfc} } + gArmTransferListPpiGuid = { 0x6d2e9da1, 0x9414, 0x41c3, {0x86, 0xbe, 0xf9, 0x16, 0x9f, 0xb4, 0x76, 0x38} } [PcdsFeatureFlag.common] gArmTokenSpaceGuid.PcdCpuDxeProduceDebugSupport|FALSE|BOOLEAN|0x00000001 From c1e3e71643db005a0bd9bd173333b68a1643ad74 Mon Sep 17 00:00:00 2001 From: Prachotan Bathi Date: Wed, 16 Jul 2025 13:50:14 -0500 Subject: [PATCH 0320/1172] ArmPlatformPkg: Introduce gArmTransferListPpiGuid Populate the gArmTransferListPpiGuid with the TransferList base address. Place the Ppi at the end of the PpiList For platforms with no TransferList support, boot continues without any errors. https://firmwarehandoff.github.io/firmware_handoff Signed-off-by: Prachotan Bathi --- ArmPlatformPkg/Sec/Sec.c | 21 +++++++++++++++++---- ArmPlatformPkg/Sec/Sec.inf | 1 + 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/ArmPlatformPkg/Sec/Sec.c b/ArmPlatformPkg/Sec/Sec.c index 0e9d1c82fe57..ec8bec22bf48 100644 --- a/ArmPlatformPkg/Sec/Sec.c +++ b/ArmPlatformPkg/Sec/Sec.c @@ -86,12 +86,14 @@ STATIC CONST EFI_PEI_PPI_DESCRIPTOR gCommonPpiTable[] = { @param[out] PpiListSize Size of the PPI list in bytes @param[out] PpiList Pointer to the constructed PPI list + @param[in] TransferListBase Pointer to the Transfer List base **/ STATIC VOID CreatePpiList ( OUT UINTN *PpiListSize, - OUT EFI_PEI_PPI_DESCRIPTOR **PpiList + OUT EFI_PEI_PPI_DESCRIPTOR **PpiList, + IN VOID *TransferListBase ) { EFI_PEI_PPI_DESCRIPTOR *PlatformPpiList; @@ -111,10 +113,20 @@ CreatePpiList ( // Set the Terminate flag on the last PPI entry LastPpi = (EFI_PEI_PPI_DESCRIPTOR *)ListBase + ((sizeof (gCommonPpiTable) + PlatformPpiListSize) / sizeof (EFI_PEI_PPI_DESCRIPTOR)) - 1; + *PpiListSize = sizeof (gCommonPpiTable) + PlatformPpiListSize; + + // Add the Transfer List PPI after the Common and Platform PPIs + if (TransferListBase != NULL) { + LastPpi++; + LastPpi->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI; + LastPpi->Guid = &gArmTransferListPpiGuid; + LastPpi->Ppi = TransferListBase; + *PpiListSize += sizeof (EFI_PEI_PPI_DESCRIPTOR); + } + LastPpi->Flags |= EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; - *PpiList = (EFI_PEI_PPI_DESCRIPTOR *)ListBase; - *PpiListSize = sizeof (gCommonPpiTable) + PlatformPpiListSize; + *PpiList = (EFI_PEI_PPI_DESCRIPTOR *)ListBase; } /** @@ -177,13 +189,14 @@ SecMain ( TransferListDump (TransferListBase); DEBUG_CODE_END (); } else { + TransferListBase = NULL; DEBUG ((DEBUG_ERROR, "%a: No valid operations possible on TransferList found @ 0x%p\n", __func__, TransferListBase)); } } else { DEBUG ((DEBUG_INFO, "%a: No TransferList found, continuing boot\n", __func__)); } - CreatePpiList (&PpiListSize, &PpiList); + CreatePpiList (&PpiListSize, &PpiList, TransferListBase); // Adjust the Temporary Ram as the new Ppi List (Common + Platform Ppi Lists) is created at // the base of the primary core stack diff --git a/ArmPlatformPkg/Sec/Sec.inf b/ArmPlatformPkg/Sec/Sec.inf index 2d1622cf52ad..620670768eb4 100644 --- a/ArmPlatformPkg/Sec/Sec.inf +++ b/ArmPlatformPkg/Sec/Sec.inf @@ -52,6 +52,7 @@ [Ppis] gEfiTemporaryRamSupportPpiGuid + gArmTransferListPpiGuid [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString From adf345e27b01037d895830e11622c44c7890fc82 Mon Sep 17 00:00:00 2001 From: Prachotan Bathi Date: Tue, 1 Jul 2025 13:18:51 -0500 Subject: [PATCH 0321/1172] ArmPlatformPkg: Introduce TransferList Guid Hob for SEC ArmTransferListHobGuid holds TransferList base address If there's no valid TransferList found, or if a Guid HOB is already present Guid HOB is not built, boot progresses as usual. https://firmwarehandoff.github.io/firmware_handoff Signed-off-by: Prachotan Bathi --- ArmPlatformPkg/PlatformPei/PlatformPeim.c | 21 +++++++++++++++++++-- ArmPlatformPkg/PlatformPei/PlatformPeim.inf | 4 ++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/ArmPlatformPkg/PlatformPei/PlatformPeim.c b/ArmPlatformPkg/PlatformPei/PlatformPeim.c index 62d1faf0c466..921371a3e553 100644 --- a/ArmPlatformPkg/PlatformPei/PlatformPeim.c +++ b/ArmPlatformPkg/PlatformPei/PlatformPeim.c @@ -24,6 +24,7 @@ #include #include #include +#include EFI_STATUS EFIAPI @@ -76,14 +77,30 @@ InitializePlatformPeim ( IN CONST EFI_PEI_SERVICES **PeiServices ) { - EFI_STATUS Status; - EFI_BOOT_MODE BootMode; + EFI_STATUS Status; + EFI_BOOT_MODE BootMode; + VOID *TransferListBase; + UINTN *TransferListHobData; + EFI_HOB_GUID_TYPE *GuidHob; DEBUG ((DEBUG_LOAD | DEBUG_INFO, "Platform PEIM Loaded\n")); Status = PeiServicesSetBootMode (ArmPlatformGetBootMode ()); ASSERT_EFI_ERROR (Status); + // If TransferList PPI is present and TransferListHobGuid is not present, + // then create a TransferListHob with the TransferListBase address. + Status = PeiServicesLocatePpi (&gArmTransferListPpiGuid, 0, NULL, &TransferListBase); + if (!EFI_ERROR (Status)) { + GuidHob = GetFirstGuidHob (&gArmTransferListHobGuid); + if ((GuidHob == NULL) && (TransferListBase != NULL)) { + TransferListHobData = BuildGuidHob (&gArmTransferListHobGuid, sizeof (*TransferListHobData)); + ASSERT (TransferListHobData != NULL); + + *TransferListHobData = (UINTN)TransferListBase; + } + } + PlatformPeim (); Status = PeiServicesGetBootMode (&BootMode); diff --git a/ArmPlatformPkg/PlatformPei/PlatformPeim.inf b/ArmPlatformPkg/PlatformPei/PlatformPeim.inf index f2b0e0f08430..d9e8f32ac985 100644 --- a/ArmPlatformPkg/PlatformPei/PlatformPeim.inf +++ b/ArmPlatformPkg/PlatformPei/PlatformPeim.inf @@ -43,6 +43,7 @@ [Ppis] gEfiPeiMasterBootModePpiGuid # PPI ALWAYS_PRODUCED gEfiPeiBootInRecoveryModePpiGuid # PPI SOMETIMES_PRODUCED + gArmTransferListPpiGuid # PPI SOMETIMES_CONSUMED [FixedPcd] gArmTokenSpaceGuid.PcdFdBaseAddress @@ -51,6 +52,9 @@ gArmTokenSpaceGuid.PcdFvBaseAddress gArmTokenSpaceGuid.PcdFvSize +[Guids] + gArmTransferListHobGuid + [Depex] TRUE From f41cc8ac792bf334f577a85b79e4c9491c066e06 Mon Sep 17 00:00:00 2001 From: Prachotan Bathi Date: Thu, 3 Jul 2025 09:49:54 -0500 Subject: [PATCH 0322/1172] ArmVirtPkg: Introduce ArmTransferListLib to ArmVirtPkg Add ArmTransferListLib as a library to platforms using ArmVirtCloudHv.dsc and ArmVirtQemu.dsc. Signed-off-by: Prachotan Bathi --- ArmVirtPkg/ArmVirtCloudHv.dsc | 1 + ArmVirtPkg/ArmVirtQemu.dsc | 1 + 2 files changed, 2 insertions(+) diff --git a/ArmVirtPkg/ArmVirtCloudHv.dsc b/ArmVirtPkg/ArmVirtCloudHv.dsc index 541e7c943fd2..94a4ff10e40c 100644 --- a/ArmVirtPkg/ArmVirtCloudHv.dsc +++ b/ArmVirtPkg/ArmVirtCloudHv.dsc @@ -61,6 +61,7 @@ TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf TpmPlatformHierarchyLib|SecurityPkg/Library/PeiDxeTpmPlatformHierarchyLibNull/PeiDxeTpmPlatformHierarchyLib.inf + ArmTransferListLib|ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.inf !include MdePkg/MdeLibs.dsc.inc diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc index fadd15fbf185..1e239bbbf783 100644 --- a/ArmVirtPkg/ArmVirtQemu.dsc +++ b/ArmVirtPkg/ArmVirtQemu.dsc @@ -63,6 +63,7 @@ [LibraryClasses.common] ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf ArmMmuLib|UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf + ArmTransferListLib|ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.inf # Virtio Support VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf From 01295fd25b0465f6a82682e7adbfdbec70c4beb1 Mon Sep 17 00:00:00 2001 From: Prachotan Reddy Bathi Date: Wed, 12 Feb 2025 12:36:45 -0600 Subject: [PATCH 0323/1172] ShellPkg: DtbTableAddress via config in dmem DTB address can be modified through the config table. Use this address in dmem output. EmbeddedPkg dependency added to ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf and ShellPkg/ShellPkg.ci.yaml Adds to: 42b0443599a6 ("ShellPkg: UefiShellDebug1CommandsLib: Uefi Config Tables in Dmem.c") Signed-off-by: Prachotan Reddy Bathi --- ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c | 5 +++++ .../UefiShellDebug1CommandsLib.inf | 2 ++ ShellPkg/ShellPkg.ci.yaml | 1 + 3 files changed, 8 insertions(+) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c index dd3d7a7a0a93..37bccea704a1 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c @@ -491,6 +491,11 @@ ShellCommandRunDmem ( continue; } + if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gFdtTableGuid)) { + DtbTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; + continue; + } + if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiMemoryAttributesTableGuid)) { MemoryAttributesTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; continue; diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf index 91b48e81f9c1..0f4068df0f3a 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf @@ -96,6 +96,7 @@ MdePkg/MdePkg.dec ShellPkg/ShellPkg.dec MdeModulePkg/MdeModulePkg.dec + EmbeddedPkg/EmbeddedPkg.dec [LibraryClasses] MemoryAllocationLib @@ -144,3 +145,4 @@ gEfiConfProfilesUefiSpecGuid ## SOMETIMES_CONSUMES ## GUID gEfiConfProfilesEbbrSpec21Guid ## SOMETIMES_CONSUMES ## GUID gEfiConfProfilesEbbrSpec22Guid ## SOMETIMES_CONSUMES ## GUID + gFdtTableGuid ## SOMETIMES_CONSUMES ## SystemTable diff --git a/ShellPkg/ShellPkg.ci.yaml b/ShellPkg/ShellPkg.ci.yaml index 2c3a70d84b51..4f5c69dc8c1f 100644 --- a/ShellPkg/ShellPkg.ci.yaml +++ b/ShellPkg/ShellPkg.ci.yaml @@ -35,6 +35,7 @@ "MdePkg/MdePkg.dec", "MdeModulePkg/MdeModulePkg.dec", "ShellPkg/ShellPkg.dec", + "EmbeddedPkg/EmbeddedPkg.dec", "NetworkPkg/NetworkPkg.dec" ], # For host based unit tests From be6342d64fa0e13e7792f4dc4a6dfb45bab9cf9b Mon Sep 17 00:00:00 2001 From: Revathy V Date: Tue, 15 Jul 2025 14:58:46 +0530 Subject: [PATCH 0324/1172] ShellPkg: Fixed Deadcode and Null field Coverity warnings. Updated fixes for all Deadcode and Null field Coverity fixes in ShellPkg Signed-off-by: Revathy --- ShellPkg/Application/Shell/ShellEnvVar.c | 30 ++++++----- ShellPkg/Application/Shell/ShellProtocol.c | 6 ++- .../UefiShellCommandLib/UefiShellCommandLib.c | 54 ++++++++++++------- .../SmbiosView/PrintInfo.c | 2 +- 4 files changed, 59 insertions(+), 33 deletions(-) diff --git a/ShellPkg/Application/Shell/ShellEnvVar.c b/ShellPkg/Application/Shell/ShellEnvVar.c index b97cfe91b96b..9e84d7f5082d 100644 --- a/ShellPkg/Application/Shell/ShellEnvVar.c +++ b/ShellPkg/Application/Shell/ShellEnvVar.c @@ -285,19 +285,23 @@ SetEnvironmentVariableList ( // // set all the variables from the list // - for ( Node = (ENV_VAR_LIST *)GetFirstNode (ListHead) - ; !IsNull (ListHead, &Node->Link) - ; Node = (ENV_VAR_LIST *)GetNextNode (ListHead, &Node->Link) - ) - { - Size = StrSize (Node->Val) - sizeof (CHAR16); - if (Node->Atts & EFI_VARIABLE_NON_VOLATILE) { - Status = SHELL_SET_ENVIRONMENT_VARIABLE_NV (Node->Key, Size, Node->Val); - } else { - Status = SHELL_SET_ENVIRONMENT_VARIABLE_V (Node->Key, Size, Node->Val); - } + if ((ListHead != NULL) && !IsListEmpty (ListHead)) { + for ( Node = (ENV_VAR_LIST *)GetFirstNode (ListHead) + ; !IsNull (ListHead, &Node->Link) + ; Node = (ENV_VAR_LIST *)GetNextNode (ListHead, &Node->Link) + ) + { + if ((Node->Key != NULL) && (Node->Val != NULL)) { + Size = StrSize (Node->Val) - sizeof (CHAR16); + if (Node->Atts & EFI_VARIABLE_NON_VOLATILE) { + Status = SHELL_SET_ENVIRONMENT_VARIABLE_NV (Node->Key, Size, Node->Val); + } else { + Status = SHELL_SET_ENVIRONMENT_VARIABLE_V (Node->Key, Size, Node->Val); + } - ASSERT_EFI_ERROR (Status); + ASSERT_EFI_ERROR (Status); + } + } } FreeEnvironmentVariableList (ListHead); @@ -441,7 +445,7 @@ ShellFindEnvVarInList ( ; Node = (ENV_VAR_LIST *)GetNextNode (&gShellEnvVarList.Link, &Node->Link) ) { - if ((Node->Key != NULL) && (StrCmp (Key, Node->Key) == 0)) { + if ((Node->Key != NULL) && (StrCmp (Key, Node->Key) == 0) && (Node->Val != NULL)) { *Value = AllocateCopyPool (StrSize (Node->Val), Node->Val); *ValueSize = StrSize (Node->Val); if (Atts != NULL) { diff --git a/ShellPkg/Application/Shell/ShellProtocol.c b/ShellPkg/Application/Shell/ShellProtocol.c index 3bc62399f89c..646294d4e6a1 100644 --- a/ShellPkg/Application/Shell/ShellProtocol.c +++ b/ShellPkg/Application/Shell/ShellProtocol.c @@ -2853,7 +2853,11 @@ EfiShellGetEnvEx ( ; Node = (ENV_VAR_LIST *)GetNextNode (&gShellEnvVarList.Link, &Node->Link) ) { - ASSERT (Node->Key != NULL); + if (Node->Key == NULL) { + ASSERT (FALSE); + continue; + } + Size += StrSize (Node->Key); } diff --git a/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c b/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c index b0c77e4e802f..44c2ed91fcb3 100644 --- a/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c +++ b/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c @@ -398,7 +398,11 @@ ShellCommandIsCommandOnInternalList ( ; Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetNextNode (&mCommandList.Link, &Node->Link) ) { - ASSERT (Node->CommandString != NULL); + if (Node->CommandString == NULL) { + ASSERT (FALSE); + continue; + } + if (gUnicodeCollation->StriColl ( gUnicodeCollation, (CHAR16 *)CommandString, @@ -485,7 +489,11 @@ ShellCommandGetInternalCommandHelp ( ; Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetNextNode (&mCommandList.Link, &Node->Link) ) { - ASSERT (Node->CommandString != NULL); + if (Node->CommandString == NULL) { + ASSERT (FALSE); + continue; + } + if (gUnicodeCollation->StriColl ( gUnicodeCollation, (CHAR16 *)CommandString, @@ -672,23 +680,25 @@ ShellCommandRegisterCommandName ( // // Get Lexical Comparison Value between PrevCommand and Command list entry // - LexicalMatchValue = gUnicodeCollation->StriColl ( - gUnicodeCollation, - PrevCommand->CommandString, - Command->CommandString - ); + if ((PrevCommand->CommandString != NULL) && (Command->CommandString != NULL)) { + LexicalMatchValue = gUnicodeCollation->StriColl ( + gUnicodeCollation, + PrevCommand->CommandString, + Command->CommandString + ); - // - // Swap PrevCommand and Command list entry if PrevCommand list entry - // is alphabetically greater than Command list entry - // - if (LexicalMatchValue > 0) { - Command = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)SwapListEntries (&PrevCommand->Link, &Command->Link); - } else if (LexicalMatchValue < 0) { // - // PrevCommand entry is lexically lower than Command entry + // Swap PrevCommand and Command list entry if PrevCommand list entry + // is alphabetically greater than Command list entry // - break; + if (LexicalMatchValue > 0) { + Command = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)SwapListEntries (&PrevCommand->Link, &Command->Link); + } else if (LexicalMatchValue < 0) { + // + // PrevCommand entry is lexically lower than Command entry + // + break; + } } } @@ -758,7 +768,11 @@ ShellCommandRunCommandHandler ( ; Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetNextNode (&mCommandList.Link, &Node->Link) ) { - ASSERT (Node->CommandString != NULL); + if (Node->CommandString == NULL) { + ASSERT (FALSE); + continue; + } + if (gUnicodeCollation->StriColl ( gUnicodeCollation, (CHAR16 *)CommandString, @@ -831,7 +845,11 @@ ShellCommandGetManFileNameHandler ( ; Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetNextNode (&mCommandList.Link, &Node->Link) ) { - ASSERT (Node->CommandString != NULL); + if (Node->CommandString == NULL) { + ASSERT (FALSE); + continue; + } + if (gUnicodeCollation->StriColl ( gUnicodeCollation, (CHAR16 *)CommandString, diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c index 42d766ea68e4..bf68eb12cc94 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c @@ -3011,7 +3011,7 @@ DisplayMmBankConnections ( // // Divide it to high and low // - High = (UINT8)(BankConnections & 0xF0); + High = (UINT8)((BankConnections & 0xF0)>>4); Low = (UINT8)(BankConnections & 0x0F); if (High != 0xF) { if (Low != 0xF) { From 97b0f1ea3b424115c2a1ee8c0d728b0f741ca61e Mon Sep 17 00:00:00 2001 From: Thomas Prescher Date: Thu, 5 Jun 2025 22:58:49 +0200 Subject: [PATCH 0325/1172] OvmfPkg/CloudHv: bump PcdCpuMaxLogicalProcessorNumber to 254 Signed-off-by: Thomas Prescher On-behalf-of: SAP thomas.prescher@sap.com --- OvmfPkg/CloudHv/CloudHvX64.dsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OvmfPkg/CloudHv/CloudHvX64.dsc b/OvmfPkg/CloudHv/CloudHvX64.dsc index d941d6d1ac8d..157aa8e61151 100644 --- a/OvmfPkg/CloudHv/CloudHvX64.dsc +++ b/OvmfPkg/CloudHv/CloudHvX64.dsc @@ -628,7 +628,7 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack|FALSE # UefiCpuPkg PCDs related to initial AP bringup and general AP management. - gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber|64 + gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber|254 gUefiCpuPkgTokenSpaceGuid.PcdCpuBootLogicalProcessorNumber|0 # Set memory encryption mask From 47e818016a8e360ccdea0c01f5af5f5d0f13de80 Mon Sep 17 00:00:00 2001 From: Nanjinmoorthyj Date: Wed, 9 Jul 2025 19:19:41 +0530 Subject: [PATCH 0326/1172] ShellPkg/Library: Remove unecessary error check Remove the error handling from the connect.c file as it is redundant. Signed-off-by: Nanjinmoorthy --- ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c index 4f398632fb6c..3bec32b70297 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c @@ -520,10 +520,6 @@ ShellCommandRunConnect ( } Handle1 = ConvertHandleIndexToHandle ((UINTN)Intermediate); - if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"connect", Param1); - ShellStatus = SHELL_INVALID_PARAMETER; - } } else { Handle1 = NULL; } From faeedaa54b29dc5d8d2ac3daac718e466ecdce19 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Mon, 28 Jul 2025 15:58:55 +0100 Subject: [PATCH 0327/1172] DynamicTablesPkg: add ArchCommonObjTpm2DeviceInfo To generate SSDT for TPM2 device using DynamicTablePkg, add TPM2 Device information Signed-off-by: Yeoreum Yun --- .../Include/ArchCommonNameSpaceObjects.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h index a642aeca0fec..33e976c4f351 100644 --- a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h +++ b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h @@ -71,6 +71,7 @@ typedef enum ArchCommonObjectID { EArchCommonObjMemoryLatBwInfo, ///< 43 - Memory Latency Bandwidth Info EArchCommonObjMemoryCacheInfo, ///< 44 - Memory Cache Info EArchCommonObjSpcrInfo, ///< 45 - Serial Terminal and Interrupt Info + EArchCommonObjTpm2DeviceInfo, ///< 46 - TPM2 Device Info EArchCommonObjMax } EARCH_COMMON_OBJECT_ID; @@ -724,6 +725,18 @@ typedef struct CmArchCommonTpm2InterfaceInfo { UINT64 Lasa; } CM_ARCH_COMMON_TPM2_INTERFACE_INFO; +/** A structure that describes TPM2 device. + + ID: EArchCommonObjTpm2DeviceInfo +*/ +typedef struct CmArchCommonTpm2DeviceInfo { + /** TPM2 Device's Base Address */ + UINT64 Tpm2DeviceBaseAddress; + + /** TPM2 Device' Size */ + UINT64 Tpm2DeviceSize; +} CM_ARCH_COMMON_TPM2_DEVICE_INFO; + /** A structure that describes the SPMI (Service Processor Management Interface) Info. From 0d82e48221747cc17ab48be9caf295d9494fd9ed Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Tue, 18 Mar 2025 14:15:03 +0000 Subject: [PATCH 0328/1172] DynamicTablesPkg: add Tpm2DeviceTableLib to generate Tpm2 device table Introduce Tpm2DeviceTableLib to generate SSDT table which describes Tpm2 devices. This dynamic table generation is controlled by PcdGenTpm2DeviceTable which default value is FALSE. When it is TRUE, the TPM2 device ssdt table is generated when TPM2 ACPI table is generated. Signed-off-by: Yeoreum Yun --- DynamicTablesPkg/DynamicTables.dsc.inc | 1 + DynamicTablesPkg/DynamicTablesPkg.ci.yaml | 3 +- DynamicTablesPkg/DynamicTablesPkg.dec | 6 + DynamicTablesPkg/DynamicTablesPkg.dsc | 1 + .../Include/Library/Tpm2DeviceTableLib.h | 50 +++ .../Acpi/Common/AcpiTpm2Lib/AcpiTpm2Lib.inf | 5 + .../Acpi/Common/AcpiTpm2Lib/Tpm2Generator.c | 251 ++++++++++--- .../Tpm2DeviceTableLib/Tpm2DeviceTableLib.c | 329 ++++++++++++++++++ .../Tpm2DeviceTableLib/Tpm2DeviceTableLib.inf | 33 ++ .../Tpm2DeviceTableTemplate.asl | 44 +++ 10 files changed, 673 insertions(+), 50 deletions(-) create mode 100644 DynamicTablesPkg/Include/Library/Tpm2DeviceTableLib.h create mode 100644 DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.c create mode 100644 DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.inf create mode 100644 DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableTemplate.asl diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc index 95b64076b74d..d8c92dece5f2 100644 --- a/DynamicTablesPkg/DynamicTables.dsc.inc +++ b/DynamicTablesPkg/DynamicTables.dsc.inc @@ -25,6 +25,7 @@ SmbiosStringTableLib|DynamicTablesPkg/Library/Common/SmbiosStringTableLib/SmbiosStringTableLib.inf MetadataObjLib|DynamicTablesPkg/Library/Common/MetadataObjLib/MetadataObjLib.inf MetadataHandlerLib|DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataHandlerLib.inf + Tpm2DeviceTableLib|DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.inf [LibraryClasses.AARCH64] DynamicTablesScmiInfoLib|DynamicTablesPkg/Library/DynamicTablesScmiInfoLib/DynamicTablesScmiInfoLib.inf diff --git a/DynamicTablesPkg/DynamicTablesPkg.ci.yaml b/DynamicTablesPkg/DynamicTablesPkg.ci.yaml index 5c4efb4035a1..56069e286f6e 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.ci.yaml +++ b/DynamicTablesPkg/DynamicTablesPkg.ci.yaml @@ -54,7 +54,8 @@ "EmbeddedPkg/EmbeddedPkg.dec", "DynamicTablesPkg/DynamicTablesPkg.dec", "MdeModulePkg/MdeModulePkg.dec", - "MdePkg/MdePkg.dec" + "MdePkg/MdePkg.dec", + "SecurityPkg/SecurityPkg.dec" ], # For host based unit tests "AcceptableDependencies-HOST_APPLICATION":[ diff --git a/DynamicTablesPkg/DynamicTablesPkg.dec b/DynamicTablesPkg/DynamicTablesPkg.dec index 87934c52cf1d..71e76e62330d 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dec +++ b/DynamicTablesPkg/DynamicTablesPkg.dec @@ -52,6 +52,9 @@ ## @libraryclass Defines a set of APIs to a handle Metadata generation/validation. MetadataHandlerLib|Include/Library/MetadataHandlerLib.h + ## @libraryclass Defines a set of methods for generating Tpm2 Device Table method. + Tpm2DeviceTableLib|Include/Library/Tpm2DeviceTableLib.h + [LibraryClasses.AARCH64] ## @libraryclass Defines a set of APIs to populate CmObj using SCMI. DynamicTablesScmiInfoLib|Include/Library/DynamicTablesScmiInfoLib.h @@ -84,5 +87,8 @@ # BIT0: Allow the absence of some registers in the _CPC object. gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdDevelopmentPlatformRelaxations|0|UINT64|0x4000000A + # Generate Tpm2 device table when generate TPM2 acpi table together. + gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdGenTpm2DeviceTable|FALSE|BOOLEAN|0x4000000B + [Guids] gEdkiiDynamicTablesPkgTokenSpaceGuid = { 0xab226e66, 0x31d8, 0x4613, { 0x87, 0x9d, 0xd2, 0xfa, 0xb6, 0x10, 0x26, 0x3c } } diff --git a/DynamicTablesPkg/DynamicTablesPkg.dsc b/DynamicTablesPkg/DynamicTablesPkg.dsc index 823b3fe62414..d8c04779b936 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dsc +++ b/DynamicTablesPkg/DynamicTablesPkg.dsc @@ -51,6 +51,7 @@ DynamicTablesPkg/Library/Common/SmbiosStringTableLib/SmbiosStringTableLib.inf DynamicTablesPkg/Library/Common/MetadataObjLib/MetadataObjLib.inf DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataHandlerLib.inf + DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.inf [Components.ARM, Components.AARCH64] DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf diff --git a/DynamicTablesPkg/Include/Library/Tpm2DeviceTableLib.h b/DynamicTablesPkg/Include/Library/Tpm2DeviceTableLib.h new file mode 100644 index 000000000000..5da8117e84c2 --- /dev/null +++ b/DynamicTablesPkg/Include/Library/Tpm2DeviceTableLib.h @@ -0,0 +1,50 @@ +/** @file + Tpm2 device table generating Library + + Copyright (c) 2025, Arm Limited. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef TPM2_DEVICE_TABLE_LIB_H_ +#define TPM2_DEVICE_TABLE_LIB_H_ + +/** Build a SSDT table describing the TPM2 device. + + The table created by this function must be freed by FreeTpm2DeviceTable. + + @param [in] TpmDevInfo TPM2 Device info to describe in the SSDT table. + @param [in] Name The Name to give to the Device. + Must be a NULL-terminated ASL NameString + e.g.: "DEV0", "DV15.DEV0", etc. + @param [in] Uid UID for the TPM@ device. + @param [out] Table If success, pointer to the created SSDT table. + + @retval EFI_SUCCESS Table generated successfully. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND Could not find information. + @retval EFI_OUT_OF_RESOURCES Could not allocate memory. +**/ +EFI_STATUS +EFIAPI +BuildTpm2DeviceTable ( + IN CONST CM_ARCH_COMMON_TPM2_DEVICE_INFO *TpmDevInfo, + IN CONST CHAR8 *Name, + IN CONST UINT64 Uid, + OUT EFI_ACPI_DESCRIPTION_HEADER **Table + ); + +/** Free an Tpm2 device table previously created by + the BuildTpm2DeviceTable function. + + @param [in] Table Pointer to a Tpm2 Device table allocated by + the BuildTpm2DeviceTable function. + +**/ +VOID +EFIAPI +FreeTpm2DeviceTable ( + IN EFI_ACPI_DESCRIPTION_HEADER *Table + ); + +#endif // TPM2_DEVICE_TABLE_LIB_H_ diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiTpm2Lib/AcpiTpm2Lib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiTpm2Lib/AcpiTpm2Lib.inf index ee50fc6f701b..1623e4d2fe75 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiTpm2Lib/AcpiTpm2Lib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiTpm2Lib/AcpiTpm2Lib.inf @@ -26,4 +26,9 @@ MdePkg/MdePkg.dec [LibraryClasses] + AcpiHelperLib BaseLib + Tpm2DeviceTableLib + +[FixedPcd] + gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdGenTpm2DeviceTable diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiTpm2Lib/Tpm2Generator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiTpm2Lib/Tpm2Generator.c index c743e20c6f98..9e39eb54fd9f 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiTpm2Lib/Tpm2Generator.c +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiTpm2Lib/Tpm2Generator.c @@ -20,13 +20,16 @@ #include #include #include +#include #include // Module specific include files. #include #include #include +#include #include +#include #include #include @@ -35,6 +38,9 @@ #define START_METHOD_CRB_WITH_SMC_PARAM_SIZE 12 #define START_METHOD_CRB_WITH_FFA_PARM_SIZE 12 +#define TPM2_DEVICE_UID 0 +#define MAX_TABLE_COUNT 2 + /** ARM standard TPM2 Generator @@ -53,6 +59,12 @@ GET_OBJECT_LIST ( CM_ARCH_COMMON_TPM2_INTERFACE_INFO ); +GET_OBJECT_LIST ( + EObjNameSpaceArchCommon, + EArchCommonObjTpm2DeviceInfo, + CM_ARCH_COMMON_TPM2_DEVICE_INFO + ); + /** Sanity check Start Method Specific Parameters field @@ -122,6 +134,73 @@ AcpiTpm2CheckStartMethodParameters ( return EFI_SUCCESS; } +/** Build a TPM2 ACPI table. + + @param [in] This Pointer to the table generator. + @param [in] AcpiTableInfo Pointer to the ACPI Table Info. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] TpmInfo TpmInfo to describe TPM2 device. + @param [in, out] Tpm2AcpiTable Tpm2AcpiTable. + @param [in] TableSize Size of Tpm2AcpiTable. + + @retval EFI_SUCCESS Table generated successfully. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND Could not find information. + @retval EFI_OUT_OF_RESOURCES Could not allocate memory. +**/ +STATIC +EFI_STATUS +EFIAPI +BuildTpm2AcpiTable ( + IN CONST ACPI_TABLE_GENERATOR *CONST This, + IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN CONST CM_ARCH_COMMON_TPM2_INTERFACE_INFO *TpmInfo, + IN OUT EFI_TPM2_ACPI_TABLE *Tpm2AcpiTable, + IN UINT32 TableSize + ) +{ + EFI_STATUS Status; + UINT32 *Laml; + UINT64 *Lasa; + + Status = AddAcpiHeader ( + CfgMgrProtocol, + This, + &Tpm2AcpiTable->Header, + AcpiTableInfo, + TableSize + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: TPM2: Failed to add ACPI header. Status = %r\n", + Status + )); + return Status; + } + + Tpm2AcpiTable->Flags = TpmInfo->PlatformClass; + Tpm2AcpiTable->AddressOfControlArea = TpmInfo->AddressOfControlArea; + Tpm2AcpiTable->StartMethod = TpmInfo->StartMethod; + + CopyMem ( + Tpm2AcpiTable + 1, + TpmInfo->StartMethodParameters, + TpmInfo->StartMethodParametersSize + ); + + if (TpmInfo->Laml > 0) { + Lasa = (UINT64 *)((UINT8 *)Tpm2AcpiTable + TableSize - sizeof (TpmInfo->Lasa)); + Laml = (UINT32 *)((UINT8 *)Lasa - sizeof (TpmInfo->Laml)); + *Laml = TpmInfo->Laml; + *Lasa = TpmInfo->Lasa; + } + + return EFI_SUCCESS; +} + /** Construct the TPM2 ACPI table. Called by the Dynamic Table Manager, this function invokes the @@ -135,7 +214,8 @@ AcpiTpm2CheckStartMethodParameters ( @param [in] AcpiTableInfo Pointer to the ACPI Table Info. @param [in] CfgMgrProtocol Pointer to the Configuration Manager Protocol Interface. - @param [out] Table Pointer to the constructed ACPI Table. + @param [out] Table Pointer to a list of generated ACPI table(s). + @param [out] TableCount Number of generated ACPI table(s). @retval EFI_SUCCESS Table generated successfully. @retval EFI_INVALID_PARAMETER A parameter is invalid. @@ -148,22 +228,24 @@ AcpiTpm2CheckStartMethodParameters ( STATIC EFI_STATUS EFIAPI -BuildTpm2Table ( +BuildTpm2TableEx ( IN CONST ACPI_TABLE_GENERATOR *CONST This, IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo, IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, - OUT EFI_ACPI_DESCRIPTION_HEADER **CONST Table + OUT EFI_ACPI_DESCRIPTION_HEADER ***Table, + OUT UINTN *CONST TableCount ) { EFI_STATUS Status; - UINT32 TableSize; CM_ARCH_COMMON_TPM2_INTERFACE_INFO *TpmInfo; - EFI_TPM2_ACPI_TABLE *Tpm2; - UINT32 *Laml; - UINT64 *Lasa; + CM_ARCH_COMMON_TPM2_DEVICE_INFO *TpmDevInfo; + UINT32 TableSize; UINT32 MaxParameterSize; + EFI_ACPI_DESCRIPTION_HEADER **TableList; + CHAR8 NewName[AML_NAME_SEG_SIZE + 1]; - *Table = NULL; + *Table = NULL; + *TableCount = 0; ASSERT ( (This != NULL) && @@ -233,9 +315,24 @@ BuildTpm2Table ( TableSize += sizeof (TpmInfo->Laml) + sizeof (TpmInfo->Lasa); } + // Allocate a table to store pointers to the TPM2 table and + // Ssdt table.for Tpm2 device description. + TableList = (EFI_ACPI_DESCRIPTION_HEADER **) + AllocateZeroPool ( + (sizeof (EFI_ACPI_DESCRIPTION_HEADER *) * MAX_TABLE_COUNT) + ); + if (TableList == NULL) { + DEBUG (( + DEBUG_ERROR, + "ERROR: TPM2: Failed to allocate memory for TableList.\n" + )); + return EFI_OUT_OF_RESOURCES; + } + // Allocate the Buffer for TPM2 table - *Table = (EFI_ACPI_DESCRIPTION_HEADER *)AllocateZeroPool (TableSize); - if (*Table == NULL) { + TableList[0] = (EFI_ACPI_DESCRIPTION_HEADER *)AllocateZeroPool (TableSize); + if (TableList[0] == NULL) { + Status = EFI_OUT_OF_RESOURCES; DEBUG (( DEBUG_ERROR, "ERROR: TPM2: Failed to allocate memory for TPM2 Table, Size = %d," \ @@ -243,51 +340,85 @@ BuildTpm2Table ( TableSize, Status )); - return EFI_OUT_OF_RESOURCES; + goto ErrorHandler; } - Tpm2 = (EFI_TPM2_ACPI_TABLE *)*Table; - - Status = AddAcpiHeader ( - CfgMgrProtocol, + Status = BuildTpm2AcpiTable ( This, - &Tpm2->Header, AcpiTableInfo, + CfgMgrProtocol, + TpmInfo, + (EFI_TPM2_ACPI_TABLE *)TableList[0], TableSize ); if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, - "ERROR: TPM2: Failed to add ACPI header. Status = %r\n", + "ERROR: TPM2: Failed to Build TPM2 ACPI Table, " \ + " Status = %r\n", Status )); - goto error_handler; + goto ErrorHandler; } - Tpm2->Flags = TpmInfo->PlatformClass; - Tpm2->AddressOfControlArea = TpmInfo->AddressOfControlArea; - Tpm2->StartMethod = TpmInfo->StartMethod; - - CopyMem ( - Tpm2 + 1, - TpmInfo->StartMethodParameters, - TpmInfo->StartMethodParametersSize - ); - - if (TpmInfo->Laml > 0) { - Laml = (UINT32 *)((UINT8 *)Tpm2 + sizeof (EFI_TPM2_ACPI_TABLE) + MaxParameterSize); - Lasa = (UINT64 *)((UINT8 *)Laml + sizeof (TpmInfo->Laml)); - *Laml = TpmInfo->Laml; - *Lasa = TpmInfo->Lasa; + *TableCount += 1; + + // Generate TPM2 device SSDT table. + if (FixedPcdGetBool (PcdGenTpm2DeviceTable)) { + Status = GetEArchCommonObjTpm2DeviceInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &TpmDevInfo, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to get TPM2 Device CM Object %r\n", + __func__, + Status + )); + goto ErrorHandler; + } + + NewName[0] = 'T'; + NewName[1] = 'P'; + NewName[2] = 'M'; + NewName[3] = AsciiFromHex ((UINT8)(TPM2_DEVICE_UID)); + NewName[4] = '\0'; + + Status = BuildTpm2DeviceTable ( + TpmDevInfo, + NewName, + TPM2_DEVICE_UID, + &TableList[1] + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: TPM2: Failed to Build SSDT table for TPM2 device," \ + " Status = %r\n", + Status + )); + goto ErrorHandler; + } + + *TableCount += 1; } + *Table = TableList; + return EFI_SUCCESS; -error_handler: +ErrorHandler: + *TableCount = 0; + + if (TableList != NULL) { + if (TableList[0] != NULL) { + FreePool (TableList[0]); + } - if (*Table != NULL) { - FreePool (*Table); - *Table = NULL; + FreePool (TableList); } return Status; @@ -299,7 +430,10 @@ BuildTpm2Table ( @param [in] AcpiTableInfo Pointer to the ACPI Table Info. @param [in] CfgMgrProtocol Pointer to the Configuration Manager Protocol Interface. - @param [in, out] Table Pointer to the ACPI Table. + @param [in, out] Table Pointer to an array of pointers + to ACPI Table(s). + @param [in] TableCount Number of ACPI table(s). + @retval EFI_SUCCESS The resources were freed successfully. @retval EFI_INVALID_PARAMETER The table pointer is NULL or invalid. @@ -307,13 +441,17 @@ BuildTpm2Table ( STATIC EFI_STATUS EFIAPI -FreeTpm2TableResources ( - IN CONST ACPI_TABLE_GENERATOR *CONST This, - IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo, - IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, - IN OUT EFI_ACPI_DESCRIPTION_HEADER **CONST Table +FreeTpm2TableResourcesEx ( + IN CONST ACPI_TABLE_GENERATOR *CONST This, + IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN OUT EFI_ACPI_DESCRIPTION_HEADER ***CONST Table, + IN CONST UINTN TableCount ) { + UINTN Idx; + EFI_ACPI_DESCRIPTION_HEADER **TableList; + ASSERT ( (This != NULL) && (AcpiTableInfo != NULL) && @@ -322,12 +460,27 @@ FreeTpm2TableResources ( (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature) ); - if ((Table == NULL) || (*Table == NULL)) { + if ((Table == NULL) || (*Table == NULL) || (TableCount == 0)) { DEBUG ((DEBUG_ERROR, "ERROR: TPM2: Invalid Table Pointer\n")); return EFI_INVALID_PARAMETER; } - FreePool (*Table); + TableList = *Table; + + for (Idx = 0; Idx < TableCount; Idx++) { + switch (TableList[Idx]->Signature) { + case EFI_ACPI_6_5_TRUSTED_COMPUTING_PLATFORM_2_TABLE_SIGNATURE: + FreePool (TableList[Idx]); + break; + case EFI_ACPI_6_5_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE: + FreeTpm2DeviceTable (TableList[Idx]); + break; + default: + ASSERT (0); + } + } + + FreePool (TableList); *Table = NULL; return EFI_SUCCESS; @@ -357,14 +510,14 @@ ACPI_TABLE_GENERATOR Tpm2Generator = { // Creator Revision TPM2_GENERATOR_REVISION, // Build Table function - BuildTpm2Table, + NULL, // Free Resource function - FreeTpm2TableResources, - // Extended build function not needed NULL, + // Extended build function not needed + BuildTpm2TableEx, // Extended build function not implemented by the generator. // Hence extended free resource function is not required. - NULL + FreeTpm2TableResourcesEx }; /** Register the Generator with the ACPI Table Factory. diff --git a/DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.c b/DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.c new file mode 100644 index 000000000000..22bd0018a8da --- /dev/null +++ b/DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.c @@ -0,0 +1,329 @@ +/** @file + Tpm2 device table generating Library + + Copyright (c) 2025, Arm Limited. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - TCG ACPI specification. + (https://trustedcomputinggroup.org/resource/tcg-acpi-specification/) +**/ +#include +#include +#include +#include +#include +#include +#include + +#include + +// Module specific include files. +#include +#include +#include +#include +#include +#include + +/** C array containing the compiled AML template. + This symbol is defined in the auto generated C file + containing the AML bytecode array. +*/ +extern CHAR8 tpm2devicetabletemplate_aml_code[]; + +/** Fixup the TPM2 device UID (_UID). + + @param [in] RootNodeHandle Pointer to the root of an AML tree. + @param [in] Uid UID for the TPM2 device. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Could not find information. + @retval EFI_OUT_OF_RESOURCES Out of resources. +**/ +STATIC +EFI_STATUS +EFIAPI +FixupTpm2DeviceUid ( + IN AML_ROOT_NODE_HANDLE RootNodeHandle, + IN CONST UINT64 Uid + ) +{ + EFI_STATUS Status; + AML_OBJECT_NODE_HANDLE NameOpIdNode; + + // Get the _UID NameOp object defined by the "Name ()" statement, + // and update its value. + Status = AmlFindNode ( + RootNodeHandle, + "\\_SB_.TPM0._UID", + &NameOpIdNode + ); + if (EFI_ERROR (Status)) { + return Status; + } + + return AmlNameOpUpdateInteger (NameOpIdNode, (UINT64)Uid); +} + +/** Fixup the Tpm2 device name. + + @param [in] RootNodeHandle Pointer to the root of an AML tree. + @param [in] Name The Name to give to the Device. + Must be a NULL-terminated ASL NameString + e.g.: "DEV0", "DV15.DEV0", etc. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Could not find information. + @retval EFI_OUT_OF_RESOURCES Out of resources. +**/ +STATIC +EFI_STATUS +EFIAPI +FixupTpm2DeviceName ( + IN AML_ROOT_NODE_HANDLE RootNodeHandle, + IN CONST CHAR8 *Name + ) +{ + EFI_STATUS Status; + AML_OBJECT_NODE_HANDLE DeviceNode; + + // Get the COM0 variable defined by the "Device ()" statement. + Status = AmlFindNode (RootNodeHandle, "\\_SB_.TPM0", &DeviceNode); + if (EFI_ERROR (Status)) { + return Status; + } + + // Update the Device's name. + return AmlDeviceOpUpdateName (DeviceNode, Name); +} + +/** Fixup the Tpm2 device _CRS values (BaseAddress, ...). + + @param [in] RootNodeHandle Pointer to the root of an AML tree. + @param [in] TpmDevInfo Pointer to a TPM2 device Information + structure. + Get the device size Information from there. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Could not find information. + @retval EFI_OUT_OF_RESOURCES Out of resources. +**/ +STATIC +EFI_STATUS +EFIAPI +FixupTpm2DeviceCrs ( + IN AML_ROOT_NODE_HANDLE RootNodeHandle, + IN CONST CM_ARCH_COMMON_TPM2_DEVICE_INFO *TpmDevInfo + ) +{ + EFI_STATUS Status; + AML_OBJECT_NODE_HANDLE NameOpCrsNode; + AML_DATA_NODE_HANDLE QWordRdNode; + + // Get the "_CRS" object defined by the "Name ()" statement. + Status = AmlFindNode ( + RootNodeHandle, + "\\_SB_.TPM0._CRS", + &NameOpCrsNode + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // Get the first Rd node in the "_CRS" object. + Status = AmlNameOpGetFirstRdNode (NameOpCrsNode, &QWordRdNode); + if (EFI_ERROR (Status)) { + return Status; + } + + if (QWordRdNode == NULL) { + return EFI_INVALID_PARAMETER; + } + + // Update the TPM2 device's base address and length. + Status = AmlUpdateRdQWord ( + QWordRdNode, + TpmDevInfo->Tpm2DeviceBaseAddress, + TpmDevInfo->Tpm2DeviceSize + ); + if (EFI_ERROR (Status)) { + return Status; + } + + return Status; +} + +/** Fixup the Tpm2 Device in the AML tree. + + For each template value: + - find the node to update; + - update the value. + + @param [in] RootNodeHandle Pointer to the root of the AML tree. + @param [in] TpmDevInfo Pointer to a TPM2 device Information + structure. + @param [in] Name The Name to give to the Device. + Must be a NULL-terminated ASL NameString + e.g.: "DEV0", "DV15.DEV0", etc. + @param [in] Uid UID for the TPM2 device. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Could not find information. + @retval EFI_OUT_OF_RESOURCES Out of resources. +**/ +STATIC +EFI_STATUS +EFIAPI +FixupTpm2DeviceInfo ( + IN AML_ROOT_NODE_HANDLE RootNodeHandle, + IN CONST CM_ARCH_COMMON_TPM2_DEVICE_INFO *TpmDevInfo, + IN CONST CHAR8 *Name, + IN CONST UINT64 Uid + ) +{ + EFI_STATUS Status; + + ASSERT (RootNodeHandle != NULL); + ASSERT (TpmDevInfo != NULL); + ASSERT (Name != NULL); + + // Fixup the _UID value. + Status = FixupTpm2DeviceUid (RootNodeHandle, Uid); + if (EFI_ERROR (Status)) { + return Status; + } + + // Fixup the _CRS values. + Status = FixupTpm2DeviceCrs (RootNodeHandle, TpmDevInfo); + if (EFI_ERROR (Status)) { + return Status; + } + + // Fixup the Tpm2 device name. + // This MUST be done at the end, otherwise AML paths won't be valid anymore. + return FixupTpm2DeviceName (RootNodeHandle, Name); +} + +/** Build a SSDT table describing the TPM2 device. + + The table created by this function must be freed by FreeSImpleTpm2DeviceTable. + + @param [in] TpmDevInfo TPM2 device info to describe in the SSDT table. + @param [in] Name The Name to give to the Device. + Must be a NULL-terminated ASL NameString + e.g.: "DEV0", "DV15.DEV0", etc. + @param [in] Uid UID for the TPM2 device + @param [out] Table If success, pointer to the created SSDT table. + + @retval EFI_SUCCESS Table generated successfully. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND Could not find information. + @retval EFI_OUT_OF_RESOURCES Could not allocate memory. +**/ +EFI_STATUS +EFIAPI +BuildTpm2DeviceTable ( + IN CONST CM_ARCH_COMMON_TPM2_DEVICE_INFO *TpmDevInfo, + IN CONST CHAR8 *Name, + IN CONST UINT64 Uid, + OUT EFI_ACPI_DESCRIPTION_HEADER **Table + ) +{ + EFI_STATUS Status; + EFI_STATUS Status1; + AML_ROOT_NODE_HANDLE RootNodeHandle; + + ASSERT (TpmDevInfo != NULL); + ASSERT (Name != NULL); + ASSERT (Table != NULL); + + // Parse the Tpm2 Device Table Template. + Status = AmlParseDefinitionBlock ( + (EFI_ACPI_DESCRIPTION_HEADER *)tpm2devicetabletemplate_aml_code, + &RootNodeHandle + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: TPM2-DEVICE-FIXUP:" + " Failed to parse SSDT TPM2 device Template. Status = %r\n", + Status + )); + return Status; + } + + // Fixup the template values. + Status = FixupTpm2DeviceInfo ( + RootNodeHandle, + TpmDevInfo, + Name, + Uid + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: TPM2-DEVICE-FIXUP: Failed to fixup SSDT TPM2 Device Table." + " Status = %r\n", + Status + )); + goto ExitHandler; + } + + // Serialize the tree. + Status = AmlSerializeDefinitionBlock ( + RootNodeHandle, + Table + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: TPM2-DEVICE-FIXUP: Failed to Serialize SSDT Table Data." + " Status = %r\n", + Status + )); + } + +ExitHandler: + // Cleanup + if (RootNodeHandle != NULL) { + Status1 = AmlDeleteTree (RootNodeHandle); + if (EFI_ERROR (Status1)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: TPM2-DEVICE-FIXUP: Failed to cleanup AML tree." + " Status = %r\n", + Status1 + )); + // If Status was success but we failed to delete the AML Tree + // return Status1 else return the original error code, i.e. Status. + if (!EFI_ERROR (Status)) { + return Status1; + } + } + } + + return Status; +} + +/** Free an Tpm2 device table previously created by + the BuildTpm2DeviceTable function. + + @param [in] Table Pointer to a Tpm2 Device table allocated by + the BuildTpm2DeviceTable function. + +**/ +VOID +EFIAPI +FreeTpm2DeviceTable ( + IN EFI_ACPI_DESCRIPTION_HEADER *Table + ) +{ + ASSERT (Table != NULL); + FreePool (Table); +} diff --git a/DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.inf b/DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.inf new file mode 100644 index 000000000000..6c69a9c24a68 --- /dev/null +++ b/DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.inf @@ -0,0 +1,33 @@ +## @file +# Tpm2 Device table generating library +# +# Copyright (c) 2025, Arm Limited. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = DynamicTpm2DeviceTableLib + FILE_GUID = b09d0390-0400-11f0-a447-cfc17b482322 + VERSION_STRING = 1.0 + MODULE_TYPE = DXE_DRIVER + LIBRARY_CLASS = Tpm2DeviceTableLib + +[Sources] + Tpm2DeviceTableLib.c + Tpm2DeviceTableTemplate.asl + +[Packages.common] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + EmbeddedPkg/EmbeddedPkg.dec + DynamicTablesPkg/DynamicTablesPkg.dec + +[Packages.ARM, Packages.AARCH64] + ArmPkg/ArmPkg.dec + +[LibraryClasses] + AcpiHelperLib + AmlLib + BaseLib diff --git a/DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableTemplate.asl b/DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableTemplate.asl new file mode 100644 index 000000000000..9b9976794ad7 --- /dev/null +++ b/DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableTemplate.asl @@ -0,0 +1,44 @@ +/** @file + TPM2 Device Table Template + + Copyright (c) 2025, ARM Ltd. All rights reserved.
+ All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s) + - TCG ACPI Specification + - TCG PC Client Platform Firmware Profile Specification + + @par Glossary: + - {template} - Data fixed up using AML Fixup APIs. +**/ + +DefinitionBlock("Tpm2DeviceTableTemplate.aml", "SSDT", 2, "ARMLTD", "TPM2CRB", 1) { + Scope(_SB) { + Device (TPM0) { // {template} + Name (_HID, "MSFT0101") + Name (_UID, 0) // {template} + Name (_CRS, ResourceTemplate () { + QWordMemory ( + ResourceProducer, + PosDecode, + MinFixed, + MaxFixed, + NonCacheable, + ReadWrite, + 0x0000000000000000, // Granularity + 0x00000000FFDFB000, // Range Minimum // {template} + 0x00000000FFDFFFFF, // Range Maximum // {template} + 0x0000000000000000, // Translation Offset + 0x0000000000005000, // Length // {template} + , + , + , + AddressRangeReserved, + TypeStatic + ) // QWordMemory + }) // Name + } // Device + } // Scope(_SB) +} From 3b48f8ccab3ff84653c2b982bd03fb60f390edf3 Mon Sep 17 00:00:00 2001 From: Guo Dong Date: Mon, 28 Jul 2025 22:41:01 -0700 Subject: [PATCH 0329/1172] UefiPayloadPkg: Fix calling convention When register a root SMI handler, it is expected to use windows calling convention for the SMI handler. This patch adds missing EFIAPI for the SMI handler SmmSwDispatcher to avoid potential issue from Linux build. Signed-off-by: Guo Dong --- UefiPayloadPkg/PchSmiDispatchSmm/PchSmiDispatchSmm.c | 1 + 1 file changed, 1 insertion(+) diff --git a/UefiPayloadPkg/PchSmiDispatchSmm/PchSmiDispatchSmm.c b/UefiPayloadPkg/PchSmiDispatchSmm/PchSmiDispatchSmm.c index 8a076e16e6d8..155ab79f0e77 100644 --- a/UefiPayloadPkg/PchSmiDispatchSmm/PchSmiDispatchSmm.c +++ b/UefiPayloadPkg/PchSmiDispatchSmm/PchSmiDispatchSmm.c @@ -87,6 +87,7 @@ FindContextByDispatchHandle ( **/ EFI_STATUS +EFIAPI SmmSwDispatcher ( IN EFI_HANDLE DispatchHandle, IN CONST VOID *RegisterContext, From 491530abaa5552805ed5c2be70ccfe1b0fcd0216 Mon Sep 17 00:00:00 2001 From: Pranav V V Date: Thu, 17 Jul 2025 20:28:25 +0530 Subject: [PATCH 0330/1172] MdeModulePkg: Change PCD type to support dynamic Move PcdSerialRegisterBase from [PcdsFixedAtBuild, PcdsPatchableInModule] section to [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx] section to enable dynamic configuration. Signed-off-by: Pranav V V --- MdeModulePkg/MdeModulePkg.dec | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index ed0b17ed9d5e..0c0b1c6c52d6 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -1352,10 +1352,6 @@ # @Prompt Enable serial port cable detetion. gEfiMdeModulePkgTokenSpaceGuid.PcdSerialDetectCable|FALSE|BOOLEAN|0x00020006 - ## Base address of 16550 serial port registers in MMIO or I/O space. Default is 0x3F8. - # @Prompt Base address of serial port registers. - gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0x03F8|UINT64|0x00020002 - ## Baud rate for the 16550 serial port. Default is 115200 baud. # @Prompt Baud rate for serial port. # @ValidList 0x80000001 | 921600, 460800, 230400, 115200, 57600, 38400, 19200, 9600, 7200, 4800, 3600, 2400, 2000, 1800, 1200, 600, 300, 150, 134, 110, 75, 50 @@ -1790,6 +1786,11 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiExposedTableVersions|0x20|UINT32|0x0001004c [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx] + + ## Base address of 16550 serial port registers in MMIO or I/O space. Default is 0x3F8. + # @Prompt Base address of serial port registers. + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0x03F8|UINT64|0x00020002 + ## UART clock frequency is for the baud rate configuration. # @Prompt Serial Port Clock Rate. gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate|1843200|UINT32|0x00010066 From a60334ad59eb8b6f2f056febeb0c2b5ed20c7b57 Mon Sep 17 00:00:00 2001 From: Yuwei Chen Date: Wed, 9 Jul 2025 13:26:40 +0800 Subject: [PATCH 0331/1172] BaseTools: Fix FMMT FvHandler Padding operation issue When using the FMMT FvHandler function, new padding size should be calculated correctly comparing with origin ffs and new ffs, else it will cause the binary size changes. This patch is used to fix the bug. Signed-off-by: Yuwei Chen --- .../Source/Python/FMMT/core/FvHandler.py | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/BaseTools/Source/Python/FMMT/core/FvHandler.py b/BaseTools/Source/Python/FMMT/core/FvHandler.py index 6d6a9c2829a3..12d52c1ac303 100644 --- a/BaseTools/Source/Python/FMMT/core/FvHandler.py +++ b/BaseTools/Source/Python/FMMT/core/FvHandler.py @@ -237,11 +237,20 @@ def CompressSectionData(self, TargetTree, pos: int, GuidTool=None) -> None: Size_delta = len(CompressedData) - len(TargetTree.Data.OriData) ChangeSize(TargetTree, -Size_delta) if TargetTree.NextRel: + Original_Pad_Size = len(TargetTree.Data.PadData) TargetTree.Data.PadData = b'\x00' * New_Pad_Size - self.Remain_New_Free_Space = len(TargetTree.Data.OriData) + len(TargetTree.Data.PadData) - len(CompressedData) - New_Pad_Size + self.Remain_New_Free_Space = ( + len(TargetTree.Data.OriData) + + Original_Pad_Size - + len(CompressedData) - + New_Pad_Size + ) else: TargetTree.Data.PadData = b'' - self.Remain_New_Free_Space = len(TargetTree.Data.OriData) - len(CompressedData) + self.Remain_New_Free_Space = ( + len(TargetTree.Data.OriData) - + len(CompressedData) + ) TargetTree.Data.OriData = CompressedData elif len(CompressedData) == len(TargetTree.Data.OriData): TargetTree.Data.OriData = CompressedData @@ -347,15 +356,24 @@ def ModifyTest(self, ParTree, Needed_Space: int) -> None: ModifySectionType(ParTree) Needed_Space += ParTree.Data.HeaderLength - OriHeaderLen # Update needed space with Delta_Pad_Size + Original_Pad_Size = len(ParTree.Data.PadData) if ParTree.NextRel: New_Pad_Size = GetPadSize(ParTree.Data.Size, SECTION_COMMON_ALIGNMENT) - Delta_Pad_Size = New_Pad_Size - len(ParTree.Data.PadData) + Delta_Pad_Size = New_Pad_Size - Original_Pad_Size ParTree.Data.PadData = b'\x00' * New_Pad_Size Needed_Space += Delta_Pad_Size else: ParTree.Data.PadData = b'' if Needed_Space < 0: - self.Remain_New_Free_Space = len(ParTree.Data.OriData) - len(CompressedData) + if ParTree.NextRel: + self.Remain_New_Free_Space = ( + len(ParTree.Data.OriData) + Original_Pad_Size - + len(CompressedData) - New_Pad_Size + ) + else: + self.Remain_New_Free_Space = ( + len(ParTree.Data.OriData) - len(CompressedData) + ) # If current section is not guided section elif Needed_Space: ChangeSize(ParTree, -Needed_Space) From 7fe3609022ce7f52190bd6384d117f1510e15afe Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Mon, 7 Jul 2025 10:08:20 +0000 Subject: [PATCH 0332/1172] DynamicTablesPkg: Add alias for EArchCommonObjPciConfigSpaceInfo Introduce EArchCommonObjMcfgPciConfigSpaceInfo as an alias for EArchCommonObjPciConfigSpaceInfo. The CM_ARCH_COMMON_PCI_CONFIG_SPACE_INFO object is utilized by both the MCFG and ACPI SSDT PCIE generators. Assigning a unique configuration object ID ensures the platform configuration driver supplies the correct data. Signed-off-by: Abdul Lateef Attar --- .../Include/ArchCommonNameSpaceObjects.h | 1 + .../Acpi/Common/AcpiMcfgLib/McfgGenerator.c | 27 ++++++++++++++++--- .../ConfigurationManagerObjectParser.c | 4 ++- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h index 33e976c4f351..54bb0467cc44 100644 --- a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h +++ b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h @@ -72,6 +72,7 @@ typedef enum ArchCommonObjectID { EArchCommonObjMemoryCacheInfo, ///< 44 - Memory Cache Info EArchCommonObjSpcrInfo, ///< 45 - Serial Terminal and Interrupt Info EArchCommonObjTpm2DeviceInfo, ///< 46 - TPM2 Device Info + EArchCommonObjMcfgPciConfigSpaceInfo, ///< 47 - MCFG PCI Configuration Space Info EArchCommonObjMax } EARCH_COMMON_OBJECT_ID; diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiMcfgLib/McfgGenerator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiMcfgLib/McfgGenerator.c index 79a2f598f942..9925c63718b2 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiMcfgLib/McfgGenerator.c +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiMcfgLib/McfgGenerator.c @@ -2,6 +2,7 @@ MCFG Table Generator Copyright (c) 2017 - 2019, ARM Limited. All rights reserved. + Copyright (C) 2025, Advanced Micro Devices, Inc. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent @par Reference(s): @@ -25,9 +26,9 @@ /** ARM standard MCFG Generator Requirements: - The following Configuration Manager Object(s) are required by - this Generator: - - EArchCommonObjPciConfigSpaceInfo + This Generator requires the following Configuration Manager Object(s): + - EArchCommonObjMcfgPciConfigSpaceInfo (primary, preferred) + - EArchCommonObjPciConfigSpaceInfo (secondary, for backward compatibility) */ #pragma pack(1) @@ -56,6 +57,14 @@ GET_OBJECT_LIST ( CM_ARCH_COMMON_PCI_CONFIG_SPACE_INFO ); +/** Retrieve the MCFG PCI Configuration Space Information. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceArchCommon, + EArchCommonObjMcfgPciConfigSpaceInfo, + CM_ARCH_COMMON_PCI_CONFIG_SPACE_INFO + ); + /** Add the PCI Enhanced Configuration Space Information to the MCFG Table. @param [in] Mcfg Pointer to MCFG Table. @@ -154,12 +163,22 @@ BuildMcfgTable ( } *Table = NULL; - Status = GetEArchCommonObjPciConfigSpaceInfo ( + Status = GetEArchCommonObjMcfgPciConfigSpaceInfo ( CfgMgrProtocol, CM_NULL_TOKEN, &PciConfigSpaceInfoList, &ConfigurationSpaceCount ); + if (Status == EFI_NOT_FOUND) { + // Fallback to the older object if the new one is not found. + Status = GetEArchCommonObjPciConfigSpaceInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &PciConfigSpaceInfoList, + &ConfigurationSpaceCount + ); + } + if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c index a0f00ce2faff..2ca1b1452ea8 100644 --- a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c +++ b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c @@ -184,7 +184,8 @@ STATIC CONST CM_OBJ_PARSER CmArmGenericWatchdogInfoParser[] = { { "Flags", 4, "0x%x", NULL } }; -/** A parser for EArchCommonObjPciConfigSpaceInfo. +/** A parser for EArchCommonObjPciConfigSpaceInfo or + EArchCommonObjMcfgPciConfigSpaceInfo. */ STATIC CONST CM_OBJ_PARSER CmArchCommonPciConfigSpaceInfoParser[] = { { "BaseAddress", 8, "0x%llx", NULL }, @@ -930,6 +931,7 @@ STATIC CONST CM_OBJ_PARSER_ARRAY ArchCommonNamespaceObjectParser[] = { CM_PARSER_ADD_OBJECT (EArchCommonObjMemoryLatBwInfo, CmArchCommonMemoryLatBwInfo), CM_PARSER_ADD_OBJECT (EArchCommonObjMemoryCacheInfo, CmArchCommonMemoryCacheInfo), CM_PARSER_ADD_OBJECT (EArchCommonObjSpcrInfo, CmArchCommonObjSpcrInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjMcfgPciConfigSpaceInfo, CmArchCommonPciConfigSpaceInfoParser), CM_PARSER_ADD_OBJECT_RESERVED (EArchCommonObjMax) }; From d2d8d38ee08c5e602fb092f940dfecc1f5a4eb38 Mon Sep 17 00:00:00 2001 From: John Mathews Date: Fri, 30 May 2025 11:06:49 -0700 Subject: [PATCH 0333/1172] UefiCpuPkg/PiSmmCpuDxeSmm: Safe handling of IDT register on SMM entry Mitigates CVE-2025-3770 Do not assume that IDT.limit is loaded with a zero value upon SMM entry. Delay enabling Machine Check Exceptions in SMM until after the SMM IDT has been reloaded. Signed-off-by: John Mathews --- UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm index 644366ba19fe..6e1cd45c0483 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.nasm @@ -113,7 +113,7 @@ ProtFlatMode: mov eax, strict dword 0 ; source operand will be patched ASM_PFX(gPatchSmiCr3): mov cr3, rax - mov eax, 0x668 ; as cr4.PGE is not set here, refresh cr3 + mov eax, 0x628 ; as cr4.PGE is not set here, refresh cr3 mov cl, strict byte 0 ; source operand will be patched ASM_PFX(gPatch5LevelPagingNeeded): @@ -204,6 +204,10 @@ SmiHandlerIdtrAbsAddr: mov ax, [rbx + DSC_SS] mov ss, eax + mov rax, cr4 ; enable MCE + bts rax, 6 + mov cr4, rax + mov rbx, [rsp + 0x8] ; rbx <- CpuIndex ; enable CET if supported From 686f1e3ea8373db48ea3a8457cc758c986455de0 Mon Sep 17 00:00:00 2001 From: HemaAnmisha Date: Thu, 31 Jul 2025 01:39:48 -0700 Subject: [PATCH 0334/1172] CryptoPkg/BaseCryptLibMbedTls : Add strpbrk() support to MbedTls Mbedtls requires the use of strpbrk(), but it is currently included in BaseCryptLib, which is not part of BaseCryptLibMbedTls. To resolve this, add strpbrk() to CrtWrapper.c, as BaseCryptLibMbedTls is not dependent on OpensslLib. Signed-off-by: HemaAnmisha --- .../BaseCryptLibMbedTls/SysCall/CrtWrapper.c | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/CrtWrapper.c b/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/CrtWrapper.c index 9352ffcbdadd..051a67dc7a6b 100644 --- a/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/CrtWrapper.c +++ b/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/CrtWrapper.c @@ -76,3 +76,23 @@ strcmp ( { return (int)AsciiStrCmp (s1, s2); } + +/**strpbrk function. **/ +char * +strpbrk ( + const char *s, + const char *accept + ) +{ + int i; + + for ( ; *s != '\0'; s++) { + for (i = 0; accept[i] != '\0'; i++) { + if (*s == accept[i]) { + return (char *)s; + } + } + } + + return NULL; +} From 5c7ef27b96421d5bac7ebe90a7d07d0cfc3f144f Mon Sep 17 00:00:00 2001 From: ddeptford <136014411+ddeptford@users.noreply.github.com> Date: Fri, 7 Jul 2023 08:49:45 -0700 Subject: [PATCH 0335/1172] MdeModulePkg: UefiBootManagerLib Change default alignment for ramdisk boot. The ramdisk is modelled as an NVDIMM which have a naturally higher alignment than 4K. Operating systems may wish to map NVDIMMs using large pages, so force the allocation alignment to 2MB. This change was tested using HTTP ramdisk boot, targeting a flat windows image. Signed-off-by: Aaron Pop --- MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c index 3343e607fcc3..22ab4d7e48bc 100644 --- a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c +++ b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c @@ -1404,7 +1404,7 @@ BmDestroyRamDisk ( Status = mRamDisk->Unregister (RamDiskDevicePath); ASSERT_EFI_ERROR (Status); - FreePages (RamDiskBuffer, RamDiskSizeInPages); + FreeAlignedPages (RamDiskBuffer, RamDiskSizeInPages); } /** @@ -1454,8 +1454,12 @@ BmExpandLoadFile ( // // The load option resides in a RAM disk. + // Use a reasonable default of 2MB for alignment as the ramdisk device is + // implemented as an NVDIMM persistent memory and operating systems may + // wish to map this with huge page support. // - FileBuffer = AllocateReservedPages (EFI_SIZE_TO_PAGES (BufferSize)); + + FileBuffer = AllocateAlignedReservedPages (EFI_SIZE_TO_PAGES (BufferSize), SIZE_2MB); if (FileBuffer == NULL) { DEBUG_CODE_BEGIN (); EFI_DEVICE_PATH *LoadFilePath; @@ -1496,7 +1500,7 @@ BmExpandLoadFile ( Status = LoadFile->LoadFile (LoadFile, FilePath, TRUE, &BufferSize, FileBuffer); if (EFI_ERROR (Status)) { - FreePages (FileBuffer, EFI_SIZE_TO_PAGES (BufferSize)); + FreeAlignedPages (FileBuffer, EFI_SIZE_TO_PAGES (BufferSize)); return NULL; } From 6e4bf7f934a9e787f4426347259491b416c141f7 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Tue, 5 Aug 2025 23:54:04 -0700 Subject: [PATCH 0336/1172] .mergify: Set max parallel checks to 1 Set max parallel checks to 1 to disable speculative checks. Signed-off-by: Michael D Kinney --- .mergify/config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.mergify/config.yml b/.mergify/config.yml index 000277c58471..7d6834ed2a59 100644 --- a/.mergify/config.yml +++ b/.mergify/config.yml @@ -24,6 +24,9 @@ # ## +merge_queue: + max_parallel_checks: 1 + queue_rules: - name: default queue_conditions: From 80f9e3aa2fc80ff82d4b280946656e7f30795b6c Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Tue, 15 Jul 2025 18:48:24 +0530 Subject: [PATCH 0337/1172] OvmfPkg/OvmfPkg.dsc:Update DevicePathLib mapping for MM_STANDALONE drivers As part of this PR [#3187], MM_STANDALONE drivers should now map DevicePathLib to UefiDevicePathLibBase.inf instead of UefiDevicePathLibStandaloneMm.inf, as latter is being deprecated. Cc: Sachin Ganesh Signed-off-by: Gowtham M --- OvmfPkg/OvmfPkgX64.dsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index ace2dfcdeba3..f859db6acd39 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -530,7 +530,7 @@ ReportStatusCodeLib|MdeModulePkg/Library/SmmReportStatusCodeLib/StandaloneMmReportStatusCodeLib.inf CcExitLib|UefiCpuPkg/Library/CcExitLibNull/CcExitLibNull.inf MemLib|StandaloneMmPkg/Library/StandaloneMmMemLib/StandaloneMmMemLib.inf - DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibStandaloneMm.inf + DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibBase.inf BaseCryptLib|CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf [LibraryClasses.common.MM_CORE_STANDALONE] From fdd6796d08027be9e224710b6b99b72e8c08a352 Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Tue, 29 Apr 2025 16:01:46 +0530 Subject: [PATCH 0338/1172] MdePkg/Library: Remove UefiDevicePathLibStandaloneMm.inf The file UefiDevicePathLibStandaloneMm.inf was reintroduced in [#3187] to give downstream platforms time to transition to UefiDevicePathLibBase.inf As nearly three years have passed since that change, and downstream consumers have had sufficient time to migrate, this library can now be safely removed. Cc: Sachin Ganesh Signed-off-by: Gowtham M --- .../UefiDevicePathLibStandaloneMm.inf | 78 ------------------- MdePkg/MdePkg.dsc | 1 - 2 files changed, 79 deletions(-) delete mode 100644 MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibStandaloneMm.inf diff --git a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibStandaloneMm.inf b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibStandaloneMm.inf deleted file mode 100644 index 97db485e23f8..000000000000 --- a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibStandaloneMm.inf +++ /dev/null @@ -1,78 +0,0 @@ -## @file -# Instance of Device Path Library based on Memory Allocation Library. -# -# Device Path Library that layers on top of the Memory Allocation Library. -# -# This library instances is deprecated and should no longer be used. Ue -# MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibBase.inf instead. -# -# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
-# Copyright (c) Microsoft Corporation. -# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -# -## - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = UefiDevicePathLibStandaloneMm - MODULE_UNI_FILE = UefiDevicePathLib.uni - FILE_GUID = 7B60A2BC-9259-48A8-8279-971412EECAB3 - MODULE_TYPE = BASE - PI_SPECIFICATION_VERSION = 0x00010032 - VERSION_STRING = 1.0 - LIBRARY_CLASS = DevicePathLib - - -# -# VALID_ARCHITECTURES = IA32 X64 EBC -# - -[Sources] - DevicePathUtilities.c - DevicePathUtilitiesBase.c - DevicePathToText.c - DevicePathFromText.c - UefiDevicePathLib.c - UefiDevicePathLib.h - -[Packages] - MdePkg/MdePkg.dec - -[LibraryClasses] - BaseLib - MemoryAllocationLib - DebugLib - BaseMemoryLib - PcdLib - PrintLib - -[Guids] - ## SOMETIMES_CONSUMES ## GUID - gEfiVTUTF8Guid - ## SOMETIMES_CONSUMES ## GUID - gEfiVT100Guid - ## SOMETIMES_CONSUMES ## GUID - gEfiVT100PlusGuid - ## SOMETIMES_CONSUMES ## GUID - gEfiPcAnsiGuid - ## SOMETIMES_CONSUMES ## GUID - gEfiUartDevicePathGuid - ## SOMETIMES_CONSUMES ## GUID - gEfiSasDevicePathGuid - ## SOMETIMES_CONSUMES ## GUID - gEfiVirtualDiskGuid - ## SOMETIMES_CONSUMES ## GUID - gEfiVirtualCdGuid - ## SOMETIMES_CONSUMES ## GUID - gEfiPersistentVirtualDiskGuid - ## SOMETIMES_CONSUMES ## GUID - gEfiPersistentVirtualCdGuid - -[Protocols] - gEfiDevicePathProtocolGuid ## SOMETIMES_CONSUMES - gEfiDebugPortProtocolGuid ## UNDEFINED - -[Pcd] - gEfiMdePkgTokenSpaceGuid.PcdMaximumDevicePathNodeCount ## SOMETIMES_CONSUMES diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc index f8b3ff54c388..0509bb6932da 100644 --- a/MdePkg/MdePkg.dsc +++ b/MdePkg/MdePkg.dsc @@ -111,7 +111,6 @@ MdePkg/Library/UefiDebugLibStdErr/UefiDebugLibStdErr.inf MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibBase.inf - MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibStandaloneMm.inf MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.inf MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLibDevicePathProtocol.inf MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf From 06627541341149fb9f22a5f45fd90c8a60d9e35a Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Tue, 29 Apr 2025 13:01:17 +0530 Subject: [PATCH 0339/1172] MdePkg/Library: Remove MM_STANDALONE LibraryClass in UefiDevicePathLib.inf UefiDevicePathLib.inf consumes Boot Services in MdePkg/Library/UefiDevicePathLib/DevicePathUtilitiesDxeSmm.c - DevicePathFromHandle(). And so cannot be used by MM_STANDALONE drivers. Instead, MM_STANDALONE drivers can use UefiDevicePathLibBase.inf as the DevicePathLib of choice. Cc: Sachin Ganesh Signed-off-by: Gowtham M --- MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf index eb85a54a74c3..2d571b5663ff 100644 --- a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf +++ b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf @@ -17,7 +17,7 @@ FILE_GUID = 91c1677a-e57f-4191-8b8e-eb7711a716e0 MODULE_TYPE = UEFI_DRIVER VERSION_STRING = 1.0 - LIBRARY_CLASS = DevicePathLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER SMM_CORE MM_STANDALONE + LIBRARY_CLASS = DevicePathLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER SMM_CORE # From d1c1f7e35419d937ab937ab050107864401d8cd9 Mon Sep 17 00:00:00 2001 From: Star Zeng Date: Mon, 4 Aug 2025 14:22:47 +0800 Subject: [PATCH 0340/1172] StandaloneMmPkg/MmIpl: Call CreatMmHobList() with page aligned size MmCore ImageSize may be not page aligned, it will be converted to page aligned for allocating MMRAM to hold MmCore image. This patch is to call CreatMmHobList() with page aligned size of ImageSize, otherwise ASSERT (IS_ALIGNED (Length, EFI_PAGE_SIZE)) in MmIplBuildMmCoreModuleHob() will happen if the input MmCore ImageSize is not page aligned. Signed-off-by: Star Zeng --- .../Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c index eda47b93eff0..38837b9bb6e7 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c @@ -1,7 +1,7 @@ /** @file MM IPL that load the MM Core into MMRAM at PEI stage - Copyright (c) 2024, Intel Corporation. All rights reserved.
+ Copyright (c) 2024 - 2025, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -795,7 +795,7 @@ ExecuteMmCoreFromMmram ( MmFvSize, &MmCoreFileName, ImageContext.ImageAddress, - ImageContext.ImageSize, + EFI_PAGES_TO_SIZE (PageCount), ImageContext.EntryPoint, Block ); From 3f453cd7aa6419b8743d18b62415bcb8c54b1bfd Mon Sep 17 00:00:00 2001 From: Poncho Figueroa Date: Fri, 18 Jul 2025 14:50:08 -0500 Subject: [PATCH 0341/1172] Add Poncho Figueroa as BaseTools reviewer Signed-off-by: Poncho Figueroa --- Maintainers.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Maintainers.txt b/Maintainers.txt index 579a70ba9872..6beda4c0ad82 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -176,6 +176,7 @@ M: Rebecca Cran [bexcran] M: Liming Gao [lgao4] M: Guillermo Antonio Palomino Sosa [gapalomi] R: Yuwei Chen [YuweiChen1110] +R: Poncho Figueroa [ponchofigueroa] BaseTools: Plugins F: BaseTools/Plugin/ From 1c3a22059b2da70832d4097141281d309a025c37 Mon Sep 17 00:00:00 2001 From: Alexander Gryanko Date: Sun, 22 Jun 2025 07:29:41 +0300 Subject: [PATCH 0342/1172] MdeModulePkg: added SecurityManagementLib mock Added Google Mock test support for SecurityManagementLib Signed-off-by: Alexander Gryanko --- MdeModulePkg/Test/MdeModulePkgHostTest.dsc | 1 + .../Library/MockSecurityManagementLib.h | 54 +++++++++++++++++++ .../MockSecurityManagementLib.cpp | 15 ++++++ .../MockSecurityManagementLib.inf | 34 ++++++++++++ 4 files changed, 104 insertions(+) create mode 100644 MdeModulePkg/Test/Mock/Include/GoogleTest/Library/MockSecurityManagementLib.h create mode 100644 MdeModulePkg/Test/Mock/Library/GoogleTest/MockSecurityManagementLib/MockSecurityManagementLib.cpp create mode 100644 MdeModulePkg/Test/Mock/Library/GoogleTest/MockSecurityManagementLib/MockSecurityManagementLib.inf diff --git a/MdeModulePkg/Test/MdeModulePkgHostTest.dsc b/MdeModulePkg/Test/MdeModulePkgHostTest.dsc index 0643e38c486b..236137470acd 100644 --- a/MdeModulePkg/Test/MdeModulePkgHostTest.dsc +++ b/MdeModulePkg/Test/MdeModulePkgHostTest.dsc @@ -71,3 +71,4 @@ MdeModulePkg/Test/Mock/Library/GoogleTest/MockHiiLib/MockHiiLib.inf MdeModulePkg/Test/Mock/Library/GoogleTest/MockPciHostBridgeLib/MockPciHostBridgeLib.inf MdeModulePkg/Test/Mock/Library/GoogleTest/MockVariablePolicyHelperLib/MockVariablePolicyHelperLib.inf + MdeModulePkg/Test/Mock/Library/GoogleTest/MockSecurityManagementLib/MockSecurityManagementLib.inf diff --git a/MdeModulePkg/Test/Mock/Include/GoogleTest/Library/MockSecurityManagementLib.h b/MdeModulePkg/Test/Mock/Include/GoogleTest/Library/MockSecurityManagementLib.h new file mode 100644 index 000000000000..59ec20518611 --- /dev/null +++ b/MdeModulePkg/Test/Mock/Include/GoogleTest/Library/MockSecurityManagementLib.h @@ -0,0 +1,54 @@ +/** @file + Google Test mocks for DevicePathLib + + Copyright (c) 2025, Yandex. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef MOCK_SECURITY_MANAGEMENT_LIB_H_ +#define MOCK_SECURITY_MANAGEMENT_LIB_LIB_H_ + +#include +#include +extern "C" { + #include + #include +} + +struct MockSecurityManagementLib { + MOCK_INTERFACE_DECLARATION (MockSecurityManagementLib); + + MOCK_FUNCTION_DECLARATION ( + EFI_STATUS, + RegisterSecurityHandler, + (IN SECURITY_FILE_AUTHENTICATION_STATE_HANDLER SecurityHandler, + IN UINT32 AuthenticationOperation) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_STATUS, + ExecuteSecurityHandlers, + (IN UINT32 AuthenticationStatus, + IN CONST EFI_DEVICE_PATH_PROTOCOL *FilePath) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_STATUS, + RegisterSecurity2Handler, + (IN SECURITY2_FILE_AUTHENTICATION_HANDLER Security2Handler, + IN UINT32 AuthenticationOperation) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_STATUS, + ExecuteSecurity2Handlers, + (IN UINT32 AuthenticationOperation, + IN UINT32 AuthenticationStatus, + IN CONST EFI_DEVICE_PATH_PROTOCOL *File OPTIONAL, + IN VOID *FileBuffer, + IN UINTN FileSize, + IN BOOLEAN BootPolicy) + ); +}; + +#endif // MOCK_SECURITY_MANAGEMENT_LIB_H_ diff --git a/MdeModulePkg/Test/Mock/Library/GoogleTest/MockSecurityManagementLib/MockSecurityManagementLib.cpp b/MdeModulePkg/Test/Mock/Library/GoogleTest/MockSecurityManagementLib/MockSecurityManagementLib.cpp new file mode 100644 index 000000000000..fa3b24bca55d --- /dev/null +++ b/MdeModulePkg/Test/Mock/Library/GoogleTest/MockSecurityManagementLib/MockSecurityManagementLib.cpp @@ -0,0 +1,15 @@ +/** @file + Google Test mocks for SecurityManagementLib + + Copyright (c) 2025, Yandex. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include + +MOCK_INTERFACE_DEFINITION (MockSecurityManagementLib); + +MOCK_FUNCTION_DEFINITION (MockSecurityManagementLib, RegisterSecurityHandler, 2, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockSecurityManagementLib, ExecuteSecurityHandlers, 2, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockSecurityManagementLib, RegisterSecurity2Handler, 2, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockSecurityManagementLib, ExecuteSecurity2Handlers, 6, EFIAPI); diff --git a/MdeModulePkg/Test/Mock/Library/GoogleTest/MockSecurityManagementLib/MockSecurityManagementLib.inf b/MdeModulePkg/Test/Mock/Library/GoogleTest/MockSecurityManagementLib/MockSecurityManagementLib.inf new file mode 100644 index 000000000000..d64e28c5c4fb --- /dev/null +++ b/MdeModulePkg/Test/Mock/Library/GoogleTest/MockSecurityManagementLib/MockSecurityManagementLib.inf @@ -0,0 +1,34 @@ +## @file +# Google Test mocks for SecurityManagementLib +# +# Copyright (c) 2025, Yandex. All rights reserved. +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = MockSecurityManagementLib + FILE_GUID = 22FF8498-3FE9-495B-81B7-6595145F5832 + MODULE_TYPE = HOST_APPLICATION + VERSION_STRING = 1.0 + LIBRARY_CLASS = SecurityManagementLib + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + MockSecurityManagementLib.cpp + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec + +[LibraryClasses] + GoogleTestLib + +[BuildOptions] + MSFT:*_*_*_CC_FLAGS = /EHsc From d55642f53785f316c5aa790522b6d5133c5b78cc Mon Sep 17 00:00:00 2001 From: Alexander Gryanko Date: Sun, 22 Jun 2025 15:35:31 +0300 Subject: [PATCH 0343/1172] MdePkg: added mocks for DevicePathLib and OpenProtocol Added Google Mock test support for DevicePathLib. Added OpenProtocol and CloseProtocol for UefiBootServicesTableLib mock library. Signed-off-by: Alexander Gryanko --- MdePkg/Test/MdePkgHostTest.dsc | 1 + .../GoogleTest/Library/MockDevicePathLib.h | 179 ++++++++++++++++++ .../Library/MockUefiBootServicesTableLib.h | 28 +++ .../MockDevicePathLib/MockDevicePathLib.cpp | 35 ++++ .../MockDevicePathLib/MockDevicePathLib.inf | 33 ++++ .../MockUefiBootServicesTableLib.cpp | 9 +- 6 files changed, 282 insertions(+), 3 deletions(-) create mode 100644 MdePkg/Test/Mock/Include/GoogleTest/Library/MockDevicePathLib.h create mode 100644 MdePkg/Test/Mock/Library/GoogleTest/MockDevicePathLib/MockDevicePathLib.cpp create mode 100644 MdePkg/Test/Mock/Library/GoogleTest/MockDevicePathLib/MockDevicePathLib.inf diff --git a/MdePkg/Test/MdePkgHostTest.dsc b/MdePkg/Test/MdePkgHostTest.dsc index 661646361200..e6e1829a6a18 100644 --- a/MdePkg/Test/MdePkgHostTest.dsc +++ b/MdePkg/Test/MdePkgHostTest.dsc @@ -53,5 +53,6 @@ MdePkg/Test/Mock/Library/GoogleTest/MockPciSegmentLib/MockPciSegmentLib.inf MdePkg/Test/Mock/Library/GoogleTest/MockReportStatusCodeLib/MockReportStatusCodeLib.inf MdePkg/Test/Mock/Library/GoogleTest/MockSafeIntLib/MockSafeIntLib.inf + MdePkg/Test/Mock/Library/GoogleTest/MockDevicePathLib/MockDevicePathLib.inf MdePkg/Library/StackCheckLibNull/StackCheckLibNullHostApplication.inf diff --git a/MdePkg/Test/Mock/Include/GoogleTest/Library/MockDevicePathLib.h b/MdePkg/Test/Mock/Include/GoogleTest/Library/MockDevicePathLib.h new file mode 100644 index 000000000000..1a6a080f0f17 --- /dev/null +++ b/MdePkg/Test/Mock/Include/GoogleTest/Library/MockDevicePathLib.h @@ -0,0 +1,179 @@ +/** @file + Google Test mocks for DevicePathLib + + Copyright (c) 2025, Yandex. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef MOCK_DEVICE_PATH_LIB_LIB_H_ +#define MOCK_DEVICE_PATH_LIB_LIB_H_ + +#include +#include +extern "C" { + #include + #include +} + +struct MockDevicePathLib { + MOCK_INTERFACE_DECLARATION (MockDevicePathLib); + + MOCK_FUNCTION_DECLARATION ( + BOOLEAN, + IsDevicePathValid, + (IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, + IN UINTN MaxSize) + ); + + MOCK_FUNCTION_DECLARATION ( + UINT8, + DevicePathType, + (IN CONST VOID *Node) + ); + + MOCK_FUNCTION_DECLARATION ( + UINT8, + DevicePathSubType, + (IN CONST VOID *Node) + ); + + MOCK_FUNCTION_DECLARATION ( + UINTN, + DevicePathNodeLength, + (IN CONST VOID *Node) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_DEVICE_PATH_PROTOCOL *, + NextDevicePathNode, + (IN CONST VOID *Node) + ); + + MOCK_FUNCTION_DECLARATION ( + BOOLEAN, + IsDevicePathEndType, + (IN CONST VOID *Node) + ); + + MOCK_FUNCTION_DECLARATION ( + BOOLEAN, + IsDevicePathEnd, + (IN CONST VOID *Node) + ); + + MOCK_FUNCTION_DECLARATION ( + BOOLEAN, + IsDevicePathEndInstance, + (IN CONST VOID *Node) + ); + + MOCK_FUNCTION_DECLARATION ( + UINT16, + SetDevicePathNodeLength, + (IN OUT VOID *Node, + IN UINTN Length) + ); + + MOCK_FUNCTION_DECLARATION ( + VOID, + SetDevicePathEndNode, + (OUT VOID *Node) + ); + + MOCK_FUNCTION_DECLARATION ( + UINTN, + GetDevicePathSize, + (IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_DEVICE_PATH_PROTOCOL *, + DuplicateDevicePath, + (IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_DEVICE_PATH_PROTOCOL *, + AppendDevicePath, + (IN CONST EFI_DEVICE_PATH_PROTOCOL *FirstDevicePath OPTIONAL, + IN CONST EFI_DEVICE_PATH_PROTOCOL *SecondDevicePath OPTIONAL) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_DEVICE_PATH_PROTOCOL *, + AppendDevicePathNode, + (IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL, + IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePathNode OPTIONAL) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_DEVICE_PATH_PROTOCOL *, + AppendDevicePathInstance, + (IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL, + IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePathInstance OPTIONAL) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_DEVICE_PATH_PROTOCOL *, + GetNextDevicePathInstance, + (IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath, + OUT UINTN *Size) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_DEVICE_PATH_PROTOCOL *, + CreateDeviceNode, + (IN UINT8 NodeType, + IN UINT8 NodeSubType, + IN UINT16 NodeLength) + ); + + MOCK_FUNCTION_DECLARATION ( + BOOLEAN, + IsDevicePathMultiInstance, + (IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_DEVICE_PATH_PROTOCOL *, + DevicePathFromHandle, + (IN EFI_HANDLE Handle) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_DEVICE_PATH_PROTOCOL *, + FileDevicePath, + (IN EFI_HANDLE Device OPTIONAL, + IN CONST CHAR16 *FileName) + ); + + MOCK_FUNCTION_DECLARATION ( + CHAR16 *, + ConvertDevicePathToText, + (IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, + IN BOOLEAN DisplayOnly, + IN BOOLEAN AllowShortcuts) + ); + + MOCK_FUNCTION_DECLARATION ( + CHAR16 *, + ConvertDeviceNodeToText, + (IN CONST EFI_DEVICE_PATH_PROTOCOL *DeviceNode, + IN BOOLEAN DisplayOnly, + IN BOOLEAN AllowShortcuts) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_DEVICE_PATH_PROTOCOL *, + ConvertTextToDeviceNode, + (IN CONST CHAR16 *TextDeviceNode) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_DEVICE_PATH_PROTOCOL *, + ConvertTextToDevicePath, + (IN CONST CHAR16 *TextDevicePath) + ); +}; + +#endif // MOCK_DEVICE_PATH_LIB_H_ diff --git a/MdePkg/Test/Mock/Include/GoogleTest/Library/MockUefiBootServicesTableLib.h b/MdePkg/Test/Mock/Include/GoogleTest/Library/MockUefiBootServicesTableLib.h index d72b941323c1..7f60da30c461 100644 --- a/MdePkg/Test/Mock/Include/GoogleTest/Library/MockUefiBootServicesTableLib.h +++ b/MdePkg/Test/Mock/Include/GoogleTest/Library/MockUefiBootServicesTableLib.h @@ -73,6 +73,34 @@ struct MockUefiBootServicesTableLib { IN CONST EFI_GUID *EventGroup OPTIONAL, OUT EFI_EVENT *Event) ); + + MOCK_FUNCTION_DECLARATION ( + EFI_STATUS, + gBS_LocateDevicePath, + (IN EFI_GUID *Protocol, + IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath, + OUT EFI_HANDLE *Device) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_STATUS, + gBS_OpenProtocol, + (IN EFI_HANDLE UserHandle, + IN EFI_GUID *Protocol, + OUT VOID **Interface OPTIONAL, + IN EFI_HANDLE ImageHandle, + IN EFI_HANDLE ControllerHandle, + IN UINT32 Attributes) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_STATUS, + gBS_CloseProtocol, + (IN EFI_HANDLE UserHandle, + IN EFI_GUID *Protocol, + IN EFI_HANDLE AgentHandle, + IN EFI_HANDLE ControllerHandle) + ); }; #endif // MOCK_UEFI_BOOT_SERVICES_TABLE_LIB_H_ diff --git a/MdePkg/Test/Mock/Library/GoogleTest/MockDevicePathLib/MockDevicePathLib.cpp b/MdePkg/Test/Mock/Library/GoogleTest/MockDevicePathLib/MockDevicePathLib.cpp new file mode 100644 index 000000000000..8f07d3046356 --- /dev/null +++ b/MdePkg/Test/Mock/Library/GoogleTest/MockDevicePathLib/MockDevicePathLib.cpp @@ -0,0 +1,35 @@ +/** @file + Google Test mocks for DevicePathLib + + Copyright (c) 2025, Yandex. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include + +MOCK_INTERFACE_DEFINITION (MockDevicePathLib); + +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, IsDevicePathValid, 2, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, DevicePathType, 1, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, DevicePathSubType, 1, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, DevicePathNodeLength, 1, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, NextDevicePathNode, 1, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, IsDevicePathEndType, 1, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, IsDevicePathEnd, 1, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, IsDevicePathEndInstance, 1, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, SetDevicePathNodeLength, 2, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, SetDevicePathEndNode, 1, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, GetDevicePathSize, 1, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, DuplicateDevicePath, 1, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, AppendDevicePath, 2, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, AppendDevicePathNode, 2, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, AppendDevicePathInstance, 2, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, GetNextDevicePathInstance, 2, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, CreateDeviceNode, 3, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, IsDevicePathMultiInstance, 1, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, DevicePathFromHandle, 1, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, FileDevicePath, 2, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, ConvertDevicePathToText, 3, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, ConvertDeviceNodeToText, 3, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, ConvertTextToDeviceNode, 1, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockDevicePathLib, ConvertTextToDevicePath, 1, EFIAPI); diff --git a/MdePkg/Test/Mock/Library/GoogleTest/MockDevicePathLib/MockDevicePathLib.inf b/MdePkg/Test/Mock/Library/GoogleTest/MockDevicePathLib/MockDevicePathLib.inf new file mode 100644 index 000000000000..542a2522273a --- /dev/null +++ b/MdePkg/Test/Mock/Library/GoogleTest/MockDevicePathLib/MockDevicePathLib.inf @@ -0,0 +1,33 @@ +## @file +# Google Test mocks for DevicePathLib +# +# Copyright (c) 2025, Yandex. All rights reserved. +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = MockDevicePathLib + FILE_GUID = 56A63D54-644B-4769-88BC-AB2DCDADE351 + MODULE_TYPE = HOST_APPLICATION + VERSION_STRING = 1.0 + LIBRARY_CLASS = DevicePathLib + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + MockDevicePathLib.cpp + +[Packages] + MdePkg/MdePkg.dec + UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec + +[LibraryClasses] + GoogleTestLib + +[BuildOptions] + MSFT:*_*_*_CC_FLAGS = /EHsc diff --git a/MdePkg/Test/Mock/Library/GoogleTest/MockUefiBootServicesTableLib/MockUefiBootServicesTableLib.cpp b/MdePkg/Test/Mock/Library/GoogleTest/MockUefiBootServicesTableLib/MockUefiBootServicesTableLib.cpp index ced6255418a2..64df07e51498 100644 --- a/MdePkg/Test/Mock/Library/GoogleTest/MockUefiBootServicesTableLib/MockUefiBootServicesTableLib.cpp +++ b/MdePkg/Test/Mock/Library/GoogleTest/MockUefiBootServicesTableLib/MockUefiBootServicesTableLib.cpp @@ -13,6 +13,9 @@ MOCK_FUNCTION_DEFINITION (MockUefiBootServicesTableLib, gBS_CloseEvent, 1, EFIAP MOCK_FUNCTION_DEFINITION (MockUefiBootServicesTableLib, gBS_HandleProtocol, 3, EFIAPI); MOCK_FUNCTION_DEFINITION (MockUefiBootServicesTableLib, gBS_LocateProtocol, 3, EFIAPI); MOCK_FUNCTION_DEFINITION (MockUefiBootServicesTableLib, gBS_CreateEventEx, 6, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockUefiBootServicesTableLib, gBS_LocateDevicePath, 3, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockUefiBootServicesTableLib, gBS_OpenProtocol, 6, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockUefiBootServicesTableLib, gBS_CloseProtocol, 4, EFIAPI); static EFI_BOOT_SERVICES LocalBs = { { 0, 0, 0, 0, 0 }, // EFI_TABLE_HEADER @@ -36,7 +39,7 @@ static EFI_BOOT_SERVICES LocalBs = { NULL, // VOID NULL, // EFI_REGISTER_PROTOCOL_NOTIFY NULL, // EFI_LOCATE_HANDLE - NULL, // EFI_LOCATE_DEVICE_PATH + gBS_LocateDevicePath, // EFI_LOCATE_DEVICE_PATH NULL, // EFI_INSTALL_CONFIGURATION_TABLE NULL, // EFI_IMAGE_LOAD NULL, // EFI_IMAGE_START @@ -48,8 +51,8 @@ static EFI_BOOT_SERVICES LocalBs = { NULL, // EFI_SET_WATCHDOG_TIMER NULL, // EFI_CONNECT_CONTROLLER NULL, // EFI_DISCONNECT_CONTROLLER - NULL, // EFI_OPEN_PROTOCOL - NULL, // EFI_CLOSE_PROTOCOL + gBS_OpenProtocol, // EFI_OPEN_PROTOCOL + gBS_CloseProtocol, // EFI_CLOSE_PROTOCOL NULL, // EFI_OPEN_PROTOCOL_INFORMATION NULL, // EFI_PROTOCOLS_PER_HANDLE NULL, // EFI_LOCATE_HANDLE_BUFFER From 5125e2d6b1cd18f73bfed2ad21f29167c64a01e9 Mon Sep 17 00:00:00 2001 From: Alexander Gryanko Date: Tue, 24 Jun 2025 02:54:17 +0300 Subject: [PATCH 0344/1172] CryptoPkg: workaround for MSVC linking tolower Currently when building NOOPT tests in MSVC, the linker cannot pick the correct tolower for the host runtime. A small workaround to make the build work in MSVC. Signed-off-by: Alexander Gryanko --- .../BaseCryptLib/SysCall/UnitTestHostCrtWrapper.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/UnitTestHostCrtWrapper.c b/CryptoPkg/Library/BaseCryptLib/SysCall/UnitTestHostCrtWrapper.c index 3aa76e0a6b14..e83d190dd8fd 100644 --- a/CryptoPkg/Library/BaseCryptLib/SysCall/UnitTestHostCrtWrapper.c +++ b/CryptoPkg/Library/BaseCryptLib/SysCall/UnitTestHostCrtWrapper.c @@ -14,10 +14,23 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include /* Convert character to lowercase */ +#ifdef _MSC_VER +// +// Workaround for building NOOPT on Windows systems. Due to disabled +// optimization, the MSVC compiler cannot hide this function +// implementation from the linker. +// +int +tolower_noos ( + int c + ) + #pragma comment(linker, "/alternatename:tolower=tolower_noos") +#else int tolower ( int c ) +#endif { if (('A' <= (c)) && ((c) <= 'Z')) { return (c - ('A' - 'a')); From 057a611ae6e3c4a1b2811220576a6b48be349cb8 Mon Sep 17 00:00:00 2001 From: Alexander Gryanko Date: Sun, 22 Jun 2025 15:38:43 +0300 Subject: [PATCH 0345/1172] SecurityPkg: Added basic DxeImageVerificationLib tests Add initial unit test for DxeImageVerificationHandler to validate signature verification bypass for selected image types. Signed-off-by: Alexander Gryanko --- .../DxeImageVerificationLib.c | 7 + .../DxeImageVerificationLibGoogleTest.cpp | 137 ++++++++++++++++++ .../DxeImageVerificationLibGoogleTest.h | 79 ++++++++++ .../DxeImageVerificationLibGoogleTest.inf | 79 ++++++++++ SecurityPkg/Test/SecurityPkgHostTest.dsc | 20 +++ 5 files changed, 322 insertions(+) create mode 100644 SecurityPkg/Library/DxeImageVerificationLib/GoogleTest/DxeImageVerificationLibGoogleTest.cpp create mode 100644 SecurityPkg/Library/DxeImageVerificationLib/GoogleTest/DxeImageVerificationLibGoogleTest.h create mode 100644 SecurityPkg/Library/DxeImageVerificationLib/GoogleTest/DxeImageVerificationLibGoogleTest.inf diff --git a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c index 23e25a4b755a..5ac6dda5c509 100644 --- a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c +++ b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c @@ -1704,6 +1704,13 @@ DxeImageVerificationHandler ( IsFound = FALSE; IsFoundInDatabase = FALSE; + // + // Sanity check + // + if (File == NULL) { + return EFI_INVALID_PARAMETER; + } + // // Check the image type and get policy setting. // diff --git a/SecurityPkg/Library/DxeImageVerificationLib/GoogleTest/DxeImageVerificationLibGoogleTest.cpp b/SecurityPkg/Library/DxeImageVerificationLib/GoogleTest/DxeImageVerificationLibGoogleTest.cpp new file mode 100644 index 000000000000..325c3f50070e --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib/GoogleTest/DxeImageVerificationLibGoogleTest.cpp @@ -0,0 +1,137 @@ +/** @file + Unit tests for the implementation of DxeImageVerificationLib. + + Copyright (c) 2025, Yandex. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include + +extern "C" { + #include + #include + #include + + #include "DxeImageVerificationLibGoogleTest.h" +} + +////////////////////////////////////////////////////////////////////////////// +class CheckImageTypeResult : public ::testing::Test { +public: + EFI_DEVICE_PATH_PROTOCOL File; + +protected: + MockUefiRuntimeServicesTableLib RtServicesMock; + MockUefiBootServicesTableLib BsMock; + MockDevicePathLib DevicePathMock; + + EFI_STATUS Status; + + UINT32 AuthenticationStatus; + VOID *FileBuffer; + UINTN FileSize; + BOOLEAN BootPolicy; + + virtual void + SetUp ( + ) + { + AuthenticationStatus = 0; + FileBuffer = NULL; + FileSize = 0; + BootPolicy = FALSE; + } +}; + +TEST_F (CheckImageTypeResult, ImageTypeVerifySanity) { + // Sanity check + Status = DxeImageVerificationHandler (AuthenticationStatus, NULL, FileBuffer, FileSize, BootPolicy); + EXPECT_EQ (Status, EFI_INVALID_PARAMETER); +} + +TEST_F (CheckImageTypeResult, ImageTypeVerifyImageFromFv) { + EXPECT_CALL (BsMock, gBS_LocateDevicePath) + .WillRepeatedly (testing::Return (EFI_SUCCESS)); + EXPECT_CALL (BsMock, gBS_OpenProtocol) + .WillRepeatedly (testing::Return (EFI_SUCCESS)); + + Status = DxeImageVerificationHandler (AuthenticationStatus, &File, FileBuffer, FileSize, BootPolicy); + EXPECT_EQ (Status, EFI_SUCCESS); +} + +TEST_F (CheckImageTypeResult, ImageTypeVerifyImageFromOptionRom) { + auto TestFunc = [&](EFI_STATUS ExpectedStatus) { + EXPECT_CALL (BsMock, gBS_LocateDevicePath) + .Times (3) + .WillRepeatedly (testing::Return (EFI_NOT_FOUND)); + EXPECT_CALL (BsMock, gBS_OpenProtocol) + .WillRepeatedly (testing::Return (EFI_NOT_FOUND)); + EXPECT_CALL (DevicePathMock, IsDevicePathEndType) + .WillOnce (testing::Return ((BOOLEAN)FALSE)); + EXPECT_CALL (DevicePathMock, DevicePathType) + .WillOnce (testing::Return ((UINT8)MEDIA_DEVICE_PATH)); + EXPECT_CALL (DevicePathMock, DevicePathSubType) + .WillOnce (testing::Return ((UINT8)MEDIA_RELATIVE_OFFSET_RANGE_DP)); + + Status = DxeImageVerificationHandler (AuthenticationStatus, &File, FileBuffer, FileSize, BootPolicy); + EXPECT_EQ (Status, ExpectedStatus); + }; + + PatchPcdSet32 (PcdOptionRomImageVerificationPolicy, ALWAYS_EXECUTE); + TestFunc (EFI_SUCCESS); + PatchPcdSet32 (PcdOptionRomImageVerificationPolicy, NEVER_EXECUTE); + TestFunc (EFI_ACCESS_DENIED); +} + +TEST_F (CheckImageTypeResult, ImageTypeVerifyImageFromRemovableMedia) { + auto TestFunc = [&](EFI_STATUS ExpectedStatus) { + EXPECT_CALL (BsMock, gBS_LocateDevicePath) + .Times (3) + .WillRepeatedly (testing::Return (EFI_NOT_FOUND)); + EXPECT_CALL (DevicePathMock, IsDevicePathEndType) + .WillOnce (testing::Return ((BOOLEAN)FALSE)); + EXPECT_CALL (DevicePathMock, DevicePathType) + .WillOnce (testing::Return ((UINT8)MESSAGING_DEVICE_PATH)); + EXPECT_CALL (DevicePathMock, DevicePathSubType) + .WillOnce (testing::Return ((UINT8)MSG_MAC_ADDR_DP)); + + Status = DxeImageVerificationHandler (AuthenticationStatus, &File, FileBuffer, FileSize, BootPolicy); + EXPECT_EQ (Status, ExpectedStatus); + }; + + PatchPcdSet32 (PcdRemovableMediaImageVerificationPolicy, ALWAYS_EXECUTE); + TestFunc (EFI_SUCCESS); + PatchPcdSet32 (PcdRemovableMediaImageVerificationPolicy, NEVER_EXECUTE); + TestFunc (EFI_ACCESS_DENIED); +} + +TEST_F (CheckImageTypeResult, ImageTypeVerifyImageFromFixedMedia) { + auto TestFunc = [&](EFI_STATUS ExpectedStatus) { + EXPECT_CALL (BsMock, gBS_LocateDevicePath) + .WillOnce (testing::Return (EFI_NOT_FOUND)) + .WillOnce (testing::Return (EFI_NOT_FOUND)) + .WillOnce (testing::Return (EFI_SUCCESS)); + + Status = DxeImageVerificationHandler (AuthenticationStatus, &File, FileBuffer, FileSize, BootPolicy); + EXPECT_EQ (Status, ExpectedStatus); + }; + + PatchPcdSet32 (PcdFixedMediaImageVerificationPolicy, ALWAYS_EXECUTE); + TestFunc (EFI_SUCCESS); + PatchPcdSet32 (PcdFixedMediaImageVerificationPolicy, NEVER_EXECUTE); + TestFunc (EFI_ACCESS_DENIED); +} + +int +main ( + int argc, + char *argv[] + ) +{ + testing::InitGoogleTest (&argc, argv); + return RUN_ALL_TESTS (); +} diff --git a/SecurityPkg/Library/DxeImageVerificationLib/GoogleTest/DxeImageVerificationLibGoogleTest.h b/SecurityPkg/Library/DxeImageVerificationLib/GoogleTest/DxeImageVerificationLibGoogleTest.h new file mode 100644 index 000000000000..fcaa0595f4e5 --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib/GoogleTest/DxeImageVerificationLibGoogleTest.h @@ -0,0 +1,79 @@ +/** @file + Unit tests for the implementation of DxeImageVerificationLib. + + Copyright (c) 2025, Yandex. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef DXE_IMAGE_VERIFICATION_LIB_GOOGLE_TEST_H +#define DXE_IMAGE_VERIFICATION_LIB_GOOGLE_TEST_H + +/** + Provide verification service for signed images, which include both signature validation + and platform policy control. For signature types, both UEFI WIN_CERTIFICATE_UEFI_GUID and + MSFT Authenticode type signatures are supported. + + In this implementation, only verify external executables when in USER MODE. + Executables from FV is bypass, so pass in AuthenticationStatus is ignored. + + The image verification policy is: + If the image is signed, + At least one valid signature or at least one hash value of the image must match a record + in the security database "db", and no valid signature nor any hash value of the image may + be reflected in the security database "dbx". + Otherwise, the image is not signed, + The hash value of the image must match a record in the security database "db", and + not be reflected in the security data base "dbx". + + Caution: This function may receive untrusted input. + PE/COFF image is external input, so this function will validate its data structure + within this image buffer before use. + + @param[in] AuthenticationStatus + This is the authentication status returned from the security + measurement services for the input file. + @param[in] File This is a pointer to the device path of the file that is + being dispatched. This will optionally be used for logging. + @param[in] FileBuffer File buffer matches the input file device path. + @param[in] FileSize Size of File buffer matches the input file device path. + @param[in] BootPolicy A boot policy that was used to call LoadImage() UEFI service. + + @retval EFI_SUCCESS The file specified by DevicePath and non-NULL + FileBuffer did authenticate, and the platform policy dictates + that the DXE Foundation may use the file. + @retval EFI_SUCCESS The device path specified by NULL device path DevicePath + and non-NULL FileBuffer did authenticate, and the platform + policy dictates that the DXE Foundation may execute the image in + FileBuffer. + @retval EFI_SECURITY_VIOLATION The file specified by File did not authenticate, and + the platform policy dictates that File should be placed + in the untrusted state. The image has been added to the file + execution table. + @retval EFI_ACCESS_DENIED The file specified by File and FileBuffer did not + authenticate, and the platform policy dictates that the DXE + Foundation may not use File. The image has + been added to the file execution table. + +**/ +EFI_STATUS +EFIAPI +DxeImageVerificationHandler ( + IN UINT32 AuthenticationStatus, + IN CONST EFI_DEVICE_PATH_PROTOCOL *File OPTIONAL, + IN VOID *FileBuffer, + IN UINTN FileSize, + IN BOOLEAN BootPolicy + ); + +// +// The DxeImageVerificationLib.h file has dependencies on Pi/PiFirmwareVolume.h and Pi/PiFirmwareFile.h. +// These macros are copied from the header file to prevent PiPei.h from being included in HOST_APPLICATION. +// + +// +// Authorization policy bit definition +// +#define ALWAYS_EXECUTE 0x00000000 +#define NEVER_EXECUTE 0x00000001 + +#endif // DXE_IMAGE_VERIFICATION_LIB_GOOGLE_TEST_H diff --git a/SecurityPkg/Library/DxeImageVerificationLib/GoogleTest/DxeImageVerificationLibGoogleTest.inf b/SecurityPkg/Library/DxeImageVerificationLib/GoogleTest/DxeImageVerificationLibGoogleTest.inf new file mode 100644 index 000000000000..78314b57d525 --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib/GoogleTest/DxeImageVerificationLibGoogleTest.inf @@ -0,0 +1,79 @@ +## @file +# Unit test suite for the DxeImageVerificationLib using Google Test +# +# Copyright (c) 2025, Yandex. All rights reserved. +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = DxeImageVerificationLibGoogleTest + FILE_GUID = 18723239-55AA-4814-9B7A-874BAF719A65 + MODULE_TYPE = HOST_APPLICATION + VERSION_STRING = 1.0 + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + DxeImageVerificationLibGoogleTest.cpp + ../../../../MdePkg/Test/Mock/Library/GoogleTest/Protocol/MockRng.cpp + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + SecurityPkg/SecurityPkg.dec + UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec + CryptoPkg/CryptoPkg.dec + +[LibraryClasses] + DxeImageVerificationLib + GoogleTestLib + BaseCryptLib + DebugLib + +[Guids] + ## SOMETIMES_CONSUMES ## Variable:L"SecureBoot" + gEfiGlobalVariableGuid + + ## SOMETIMES_CONSUMES ## Variable:L"DB" + ## SOMETIMES_CONSUMES ## Variable:L"DBX" + ## SOMETIMES_CONSUMES ## Variable:L"DBT" + ## PRODUCES ## SystemTable + ## CONSUMES ## SystemTable + gEfiImageSecurityDatabaseGuid + + ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + ## SOMETIMES_PRODUCES ## GUID # Unique ID for the type of the signature. + gEfiCertSha1Guid + + ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + ## SOMETIMES_PRODUCES ## GUID # Unique ID for the type of the signature. + gEfiCertSha256Guid + + ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + ## SOMETIMES_PRODUCES ## GUID # Unique ID for the type of the signature. + gEfiCertSha384Guid + + ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + ## SOMETIMES_PRODUCES ## GUID # Unique ID for the type of the signature. + gEfiCertSha512Guid + + gEfiCertX509Guid ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + gEfiCertX509Sha256Guid ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + gEfiCertX509Sha384Guid ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + gEfiCertX509Sha512Guid ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + gEfiCertPkcs7Guid ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the certificate. + +[Protocols] + gEfiFirmwareVolume2ProtocolGuid ## SOMETIMES_CONSUMES + gEfiBlockIoProtocolGuid ## SOMETIMES_CONSUMES + gEfiSimpleFileSystemProtocolGuid ## SOMETIMES_CONSUMES + +[Pcd] + gEfiSecurityPkgTokenSpaceGuid.PcdOptionRomImageVerificationPolicy ## SOMETIMES_CONSUMES + gEfiSecurityPkgTokenSpaceGuid.PcdRemovableMediaImageVerificationPolicy ## SOMETIMES_CONSUMES + gEfiSecurityPkgTokenSpaceGuid.PcdFixedMediaImageVerificationPolicy ## SOMETIMES_CONSUMES diff --git a/SecurityPkg/Test/SecurityPkgHostTest.dsc b/SecurityPkg/Test/SecurityPkgHostTest.dsc index 1655e573eae4..7159b20b6b2e 100644 --- a/SecurityPkg/Test/SecurityPkgHostTest.dsc +++ b/SecurityPkg/Test/SecurityPkgHostTest.dsc @@ -46,3 +46,23 @@ PlatformPKProtectionLib|SecurityPkg/Test/Mock/Library/GoogleTest/MockPlatformPKProtectionLib/MockPlatformPKProtectionLib.inf UefiLib|MdePkg/Test/Mock/Library/GoogleTest/MockUefiLib/MockUefiLib.inf } + SecurityPkg/Library/DxeImageVerificationLib/GoogleTest/DxeImageVerificationLibGoogleTest.inf { + + UefiRuntimeServicesTableLib|MdePkg/Test/Mock/Library/GoogleTest/MockUefiRuntimeServicesTableLib/MockUefiRuntimeServicesTableLib.inf + UefiBootServicesTableLib|MdePkg/Test/Mock/Library/GoogleTest/MockUefiBootServicesTableLib/MockUefiBootServicesTableLib.inf + DxeImageVerificationLib|SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.inf + BaseCryptLib|CryptoPkg/Library/BaseCryptLib/UnitTestHostBaseCryptLib.inf + OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLibFull.inf + RngLib|MdePkg/Library/BaseRngLib/BaseRngLib.inf + UefiLib|MdePkg/Test/Mock/Library/GoogleTest/MockUefiLib/MockUefiLib.inf + DevicePathLib|MdePkg/Test/Mock/Library/GoogleTest/MockDevicePathLib/MockDevicePathLib.inf + SecurityManagementLib|MdeModulePkg/Test/Mock/Library/GoogleTest/MockSecurityManagementLib/MockSecurityManagementLib.inf + PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf + PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf + TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf + } + +[PcdsPatchableInModule] + gEfiSecurityPkgTokenSpaceGuid.PcdOptionRomImageVerificationPolicy|0x04 + gEfiSecurityPkgTokenSpaceGuid.PcdRemovableMediaImageVerificationPolicy|0x04 + gEfiSecurityPkgTokenSpaceGuid.PcdFixedMediaImageVerificationPolicy|0x04 From 9418a9f1e7de67f1c660dab9bbbd891a0ccd028f Mon Sep 17 00:00:00 2001 From: Oliver Steffen Date: Wed, 23 Apr 2025 11:28:33 +0200 Subject: [PATCH 0346/1172] .azurepipelines: Use Fedora 41 image for Linux CI jobs Fedora 40, which is currently used as the base image for the Linux jobs in the CI, is EOL. Switch over to the Fedora 41 image (gcc 14). Signed-off-by: Oliver Steffen --- .azurepipelines/templates/defaults.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.azurepipelines/templates/defaults.yml b/.azurepipelines/templates/defaults.yml index e6d02cd0e5e2..c7484598853f 100644 --- a/.azurepipelines/templates/defaults.yml +++ b/.azurepipelines/templates/defaults.yml @@ -9,4 +9,4 @@ variables: default_python_version: "3.12" - default_linux_image: "ghcr.io/tianocore/containers/fedora-40-test:c98ff99" + default_linux_image: "ghcr.io/tianocore/containers/fedora-41-test:4dbfa9e" From d192e7ea75f3404c1363c48feb0f5a0857fdbeaa Mon Sep 17 00:00:00 2001 From: Star Zeng Date: Mon, 4 Aug 2025 16:22:28 +0800 Subject: [PATCH 0347/1172] StandaloneMmPkg/MmIpl: Correct CreatMmHobList to CreateMmHobList Signed-off-by: Star Zeng --- .../Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c index 38837b9bb6e7..1ab84ec56eb8 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c @@ -383,7 +383,7 @@ LocateMmCoreFv ( it is pointed to fundation and platform HOB list. **/ VOID * -CreatMmHobList ( +CreateMmHobList ( OUT UINTN *HobSize, IN MM_COMM_BUFFER *MmCommBuffer, IN EFI_PHYSICAL_ADDRESS MmFvBase, @@ -785,10 +785,10 @@ ExecuteMmCoreFromMmram ( InvalidateInstructionCacheRange ((VOID *)(UINTN)ImageContext.ImageAddress, (UINTN)ImageContext.ImageSize); // - // Get HOB list for Standalone MM Core. + // Create HOB list for Standalone MM Core. // MmHobSize = 0; - MmHobList = CreatMmHobList ( + MmHobList = CreateMmHobList ( &MmHobSize, MmCommBuffer, MmFvBase, From bd785cedc370c96b736e8a3db9526aca436cb7de Mon Sep 17 00:00:00 2001 From: Star Zeng Date: Mon, 4 Aug 2025 16:29:51 +0800 Subject: [PATCH 0348/1172] StandaloneMmPkg/MmCore: Correct EndOfDxe to EndOfPei in MmEndOfPeiHandler Signed-off-by: Star Zeng --- StandaloneMmPkg/Core/StandaloneMmCore.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StandaloneMmPkg/Core/StandaloneMmCore.c b/StandaloneMmPkg/Core/StandaloneMmCore.c index 154285fef6c4..2345f9a2322a 100644 --- a/StandaloneMmPkg/Core/StandaloneMmCore.c +++ b/StandaloneMmPkg/Core/StandaloneMmCore.c @@ -298,7 +298,7 @@ MmEndOfPeiHandler ( DEBUG ((DEBUG_INFO, "MmEndOfPeiHandler\n")); // - // Install MM EndOfDxe protocol + // Install MM EndOfPei protocol // MmHandle = NULL; Status = MmInstallProtocolInterface ( From 504a80c1514d824dba8a883373912b0f78e0f0ee Mon Sep 17 00:00:00 2001 From: Hunter Chang Date: Fri, 25 Jul 2025 13:31:35 +0800 Subject: [PATCH 0349/1172] SecurityPkg/Tcg/OpalPasswordDxe: Fix logic for RemoveDevice() First, If there are multiple devices in DeviceList and are going to remove the first device in the DeviceList, the DeviceList will be cleared up with setting to NULL. This is not the expected behavior, as it should keep the rest of the devices in the DeviceList. DeviceList should point to the next device, Dev->Next. Second, there is a potential infinite while loop if TmpDev->Next not equal to Dev. TmpDev should point to next device. Signed-off-by: Hunter Chang --- SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c b/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c index 068c3c71d407..c41fe6f00571 100644 --- a/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c +++ b/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c @@ -2329,7 +2329,7 @@ RemoveDevice ( } if (mOpalDriver.DeviceList == Dev) { - mOpalDriver.DeviceList = NULL; + mOpalDriver.DeviceList = Dev->Next; return; } @@ -2339,6 +2339,8 @@ RemoveDevice ( TmpDev->Next = Dev->Next; break; } + + TmpDev = TmpDev->Next; } } From d68f418300cd13005d2c78fc8d918b61698f5d00 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Wed, 7 May 2025 19:50:19 -0700 Subject: [PATCH 0350/1172] MdeModulePkg: Variable cumulative codeql issues. Running Codeql on MdeModulePkg/Universal/Variable drivers results in codeql errors stemming for the following two checks. - cpp/comparison-with-wider-type - cpp/overflow-buffer - cpp/missing-null-test Signed-off-by: Aaron Pop Co-authored-by: Michael Kubacki Co-authored-by: Taylor Beebe Co-authored-by: pohanch <125842322+pohanch@users.noreply.github.com> Co-authored-by: kenlautner <85201046+kenlautner@users.noreply.github.com> Co-authored-by: Oliver Smith-Denny Co-authored-by: Sean Brogan Co-authored-by: Aaron --- .../Universal/Variable/Pei/Variable.c | 4 +- .../Universal/Variable/RuntimeDxe/Variable.c | 126 +++++++++--------- .../RuntimeDxe/VariablePolicySmmDxe.c | 7 +- 3 files changed, 72 insertions(+), 65 deletions(-) diff --git a/MdeModulePkg/Universal/Variable/Pei/Variable.c b/MdeModulePkg/Universal/Variable/Pei/Variable.c index 9f3d43486cfc..8bd72f0ecf9c 100644 --- a/MdeModulePkg/Universal/Variable/Pei/Variable.c +++ b/MdeModulePkg/Universal/Variable/Pei/Variable.c @@ -913,7 +913,7 @@ FindVariableEx ( } } - if (MaxIndex != NULL) { + if ((MaxIndex != NULL) && (VariableHeader != NULL)) { // // HOB exists but the variable cannot be found in HOB // If not found in HOB, then let's start from the MaxIndex we've found. @@ -1164,7 +1164,7 @@ PeiGetNextVariableName ( VariableHeader = NULL; Status = FindVariable (VariableName, VariableGuid, &Variable, &StoreInfo); - if ((Variable.CurrPtr == NULL) || (Status != EFI_SUCCESS)) { + if ((Status != EFI_SUCCESS) || (Variable.CurrPtr == NULL)) { return Status; } diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c index 1c7659031dc5..10fb4a36614b 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c @@ -1549,39 +1549,40 @@ AutoUpdateLangVariable ( // Get the corresponding ISO639 language tag according to RFC4646 language tag. // BestLang = GetLangFromSupportedLangCodes (mVariableModuleGlobal->LangCodes, Index, TRUE); - - // - // Check the variable space for both Lang and PlatformLang variable. - // - VariableEntry[0].VariableSize = ISO_639_2_ENTRY_SIZE + 1; - VariableEntry[0].Guid = &gEfiGlobalVariableGuid; - VariableEntry[0].Name = EFI_LANG_VARIABLE_NAME; - - VariableEntry[1].VariableSize = AsciiStrSize (BestPlatformLang); - VariableEntry[1].Guid = &gEfiGlobalVariableGuid; - VariableEntry[1].Name = EFI_PLATFORM_LANG_VARIABLE_NAME; - if (!CheckRemainingSpaceForConsistency (VARIABLE_ATTRIBUTE_NV_BS_RT, &VariableEntry[0], &VariableEntry[1], NULL)) { - // - // No enough variable space to set both Lang and PlatformLang successfully. - // - Status = EFI_OUT_OF_RESOURCES; - } else { + if (BestLang != NULL) { // - // Successfully convert PlatformLang to Lang, and set the BestLang value into Lang variable simultaneously. + // Check the variable space for both Lang and PlatformLang variable. // - FindVariable (EFI_LANG_VARIABLE_NAME, &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE); - - Status = UpdateVariable ( - EFI_LANG_VARIABLE_NAME, - &gEfiGlobalVariableGuid, - BestLang, - ISO_639_2_ENTRY_SIZE + 1, - Attributes, - 0, - 0, - &Variable, - NULL - ); + VariableEntry[0].VariableSize = ISO_639_2_ENTRY_SIZE + 1; + VariableEntry[0].Guid = &gEfiGlobalVariableGuid; + VariableEntry[0].Name = EFI_LANG_VARIABLE_NAME; + + VariableEntry[1].VariableSize = AsciiStrSize (BestPlatformLang); + VariableEntry[1].Guid = &gEfiGlobalVariableGuid; + VariableEntry[1].Name = EFI_PLATFORM_LANG_VARIABLE_NAME; + if (!CheckRemainingSpaceForConsistency (VARIABLE_ATTRIBUTE_NV_BS_RT, &VariableEntry[0], &VariableEntry[1], NULL)) { + // + // No enough variable space to set both Lang and PlatformLang successfully. + // + Status = EFI_OUT_OF_RESOURCES; + } else { + // + // Successfully convert PlatformLang to Lang, and set the BestLang value into Lang variable simultaneously. + // + FindVariable (EFI_LANG_VARIABLE_NAME, &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE); + + Status = UpdateVariable ( + EFI_LANG_VARIABLE_NAME, + &gEfiGlobalVariableGuid, + BestLang, + ISO_639_2_ENTRY_SIZE + 1, + Attributes, + 0, + 0, + &Variable, + NULL + ); + } } DEBUG ((DEBUG_INFO, "Variable Driver Auto Update PlatformLang, PlatformLang:%a, Lang:%a Status: %r\n", BestPlatformLang, BestLang, Status)); @@ -1606,39 +1607,40 @@ AutoUpdateLangVariable ( // Get the corresponding RFC4646 language tag according to ISO639 language tag. // BestPlatformLang = GetLangFromSupportedLangCodes (mVariableModuleGlobal->PlatformLangCodes, Index, FALSE); - - // - // Check the variable space for both PlatformLang and Lang variable. - // - VariableEntry[0].VariableSize = AsciiStrSize (BestPlatformLang); - VariableEntry[0].Guid = &gEfiGlobalVariableGuid; - VariableEntry[0].Name = EFI_PLATFORM_LANG_VARIABLE_NAME; - - VariableEntry[1].VariableSize = ISO_639_2_ENTRY_SIZE + 1; - VariableEntry[1].Guid = &gEfiGlobalVariableGuid; - VariableEntry[1].Name = EFI_LANG_VARIABLE_NAME; - if (!CheckRemainingSpaceForConsistency (VARIABLE_ATTRIBUTE_NV_BS_RT, &VariableEntry[0], &VariableEntry[1], NULL)) { - // - // No enough variable space to set both PlatformLang and Lang successfully. - // - Status = EFI_OUT_OF_RESOURCES; - } else { + if (BestPlatformLang != NULL) { // - // Successfully convert Lang to PlatformLang, and set the BestPlatformLang value into PlatformLang variable simultaneously. + // Check the variable space for both PlatformLang and Lang variable. // - FindVariable (EFI_PLATFORM_LANG_VARIABLE_NAME, &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE); - - Status = UpdateVariable ( - EFI_PLATFORM_LANG_VARIABLE_NAME, - &gEfiGlobalVariableGuid, - BestPlatformLang, - AsciiStrSize (BestPlatformLang), - Attributes, - 0, - 0, - &Variable, - NULL - ); + VariableEntry[0].VariableSize = AsciiStrSize (BestPlatformLang); + VariableEntry[0].Guid = &gEfiGlobalVariableGuid; + VariableEntry[0].Name = EFI_PLATFORM_LANG_VARIABLE_NAME; + + VariableEntry[1].VariableSize = ISO_639_2_ENTRY_SIZE + 1; + VariableEntry[1].Guid = &gEfiGlobalVariableGuid; + VariableEntry[1].Name = EFI_LANG_VARIABLE_NAME; + if (!CheckRemainingSpaceForConsistency (VARIABLE_ATTRIBUTE_NV_BS_RT, &VariableEntry[0], &VariableEntry[1], NULL)) { + // + // No enough variable space to set both PlatformLang and Lang successfully. + // + Status = EFI_OUT_OF_RESOURCES; + } else { + // + // Successfully convert Lang to PlatformLang, and set the BestPlatformLang value into PlatformLang variable simultaneously. + // + FindVariable (EFI_PLATFORM_LANG_VARIABLE_NAME, &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE); + + Status = UpdateVariable ( + EFI_PLATFORM_LANG_VARIABLE_NAME, + &gEfiGlobalVariableGuid, + BestPlatformLang, + AsciiStrSize (BestPlatformLang), + Attributes, + 0, + 0, + &Variable, + NULL + ); + } } DEBUG ((DEBUG_INFO, "Variable Driver Auto Update Lang, Lang:%a, PlatformLang:%a Status: %r\n", BestLang, BestPlatformLang, Status)); diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariablePolicySmmDxe.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariablePolicySmmDxe.c index 984cae139382..60d16e9c5a49 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariablePolicySmmDxe.c +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariablePolicySmmDxe.c @@ -477,6 +477,8 @@ InternalProtocolGetVariablePolicyInfo ( UINTN BufferSize; UINTN VariableNameSize; + PolicyHeader = NULL; + if ((VariableName == NULL) || (VendorGuid == NULL) || (VariablePolicy == NULL)) { return EFI_INVALID_PARAMETER; } @@ -609,8 +611,11 @@ InternalProtocolGetVariablePolicyInfo ( Done: ReleaseLockOnlyAtBootTime (&mMmCommunicationLock); + if (EFI_ERROR (Status)) { + return Status; + } - return (EFI_ERROR (Status)) ? Status : PolicyHeader->Result; + return (PolicyHeader != NULL) ? PolicyHeader->Result : EFI_SUCCESS; } /** From 9688712f1d15ddfb8fc53ad728823f5a987bd705 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Wed, 7 May 2025 17:43:39 -0700 Subject: [PATCH 0351/1172] MdeModulePkg: Usb cumulative codeql issues. Running Codeql on the MdeModulePkg\Bus\Usb drivers results in codeql errors stemming for the following two checks. - cpp/comparison-with-wider-type - cpp/overflow-buffer Signed-off-by: Aaron Pop Co-authored-by: Michael Kubacki Co-authored-by: Taylor Beebe Co-authored-by: pohanch <125842322+pohanch@users.noreply.github.com> Co-authored-by: kenlautner <85201046+kenlautner@users.noreply.github.com> Co-authored-by: Oliver Smith-Denny Co-authored-by: Sean Brogan Co-authored-by: Aaron --- MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.c | 2 +- MdeModulePkg/Bus/Usb/UsbBusDxe/UsbEnumer.c | 4 +-- MdeModulePkg/Bus/Usb/UsbBusDxe/UsbHub.c | 2 +- MdeModulePkg/Bus/Usb/UsbBusDxe/UsbUtility.c | 14 +++++++--- MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.c | 26 +++++++++++-------- .../UsbMouseAbsolutePointer.c | 12 +++++++-- 6 files changed, 39 insertions(+), 21 deletions(-) diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.c b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.c index 3f24371afe51..0438638b49e6 100644 --- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.c +++ b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.c @@ -739,7 +739,7 @@ UsbIoGetStringDescriptor ( EFI_USB_STRING_DESCRIPTOR *StrDesc; EFI_TPL OldTpl; UINT8 *Buf; - UINT8 Index; + UINT16 Index; EFI_STATUS Status; if ((StringIndex == 0) || (LangID == 0)) { diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbEnumer.c b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbEnumer.c index 713415d86d3c..4b8d01d7fb9e 100644 --- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbEnumer.c +++ b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbEnumer.c @@ -330,7 +330,7 @@ UsbSelectSetting ( } } - if (Index == IfDesc->NumOfSetting) { + if ((Index == IfDesc->NumOfSetting) || (Setting == NULL)) { return EFI_NOT_FOUND; } @@ -393,7 +393,7 @@ UsbSelectConfig ( } } - if (Index == DevDesc->Desc.NumConfigurations) { + if ((Index == DevDesc->Desc.NumConfigurations) || (ConfigDesc == NULL)) { return EFI_NOT_FOUND; } diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbHub.c b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbHub.c index 1a473d099892..c4abf12c2d47 100644 --- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbHub.c +++ b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbHub.c @@ -596,7 +596,7 @@ UsbHubInit ( } } - if (Index == NumEndpoints) { + if ((Index == NumEndpoints) || (EpDesc == NULL)) { DEBUG ((DEBUG_ERROR, "UsbHubInit: no interrupt endpoint found for hub %d\n", HubDev->Address)); return EFI_DEVICE_ERROR; } diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbUtility.c b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbUtility.c index eaffb8ff4365..61cddf0c82f3 100644 --- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbUtility.c +++ b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbUtility.c @@ -850,6 +850,7 @@ UsbBusAddWantedUsbIoDP ( EFI_STATUS Status; EFI_DEVICE_PATH_PROTOCOL *DevicePathPtr; + DevicePathPtr = NULL; // // Check whether remaining device path is valid // @@ -894,9 +895,12 @@ UsbBusAddWantedUsbIoDP ( } ASSERT (DevicePathPtr != NULL); - Status = AddUsbDPToList (DevicePathPtr, &Bus->WantedUsbIoDPList); - ASSERT (!EFI_ERROR (Status)); - FreePool (DevicePathPtr); + if (DevicePathPtr != NULL) { + Status = AddUsbDPToList (DevicePathPtr, &Bus->WantedUsbIoDPList); + ASSERT (!EFI_ERROR (Status)); + FreePool (DevicePathPtr); + } + return EFI_SUCCESS; } @@ -953,7 +957,9 @@ UsbBusIsWantedUsbIO ( // Create new Usb device path according to the usb part in UsbIo full device path // DevicePathPtr = GetUsbDPFromFullDP (UsbIf->DevicePath); - ASSERT (DevicePathPtr != NULL); + if (DevicePathPtr == NULL) { + return FALSE; + } DoConvert = FALSE; WantedListIndex = WantedUsbIoDPListPtr->ForwardLink; diff --git a/MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.c b/MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.c index b5a6459a35d2..93608637dfcd 100644 --- a/MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.c +++ b/MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.c @@ -437,16 +437,17 @@ GetCurrentKeyboardLayout ( if (Status == EFI_BUFFER_TOO_SMALL) { KeyboardLayout = AllocatePool (Length); ASSERT (KeyboardLayout != NULL); - - Status = HiiDatabase->GetKeyboardLayout ( - HiiDatabase, - NULL, - &Length, - KeyboardLayout - ); - if (EFI_ERROR (Status)) { - FreePool (KeyboardLayout); - KeyboardLayout = NULL; + if (KeyboardLayout != NULL) { + Status = HiiDatabase->GetKeyboardLayout ( + HiiDatabase, + NULL, + &Length, + KeyboardLayout + ); + if (EFI_ERROR (Status)) { + FreePool (KeyboardLayout); + KeyboardLayout = NULL; + } } } @@ -683,7 +684,10 @@ SetKeyboardLayoutEvent ( // TableEntry = GetKeyDescriptor (UsbKeyboardDevice, 0x58); KeyDescriptor = GetKeyDescriptor (UsbKeyboardDevice, 0x28); - CopyMem (TableEntry, KeyDescriptor, sizeof (EFI_KEY_DESCRIPTOR)); + + if ((TableEntry != NULL) && (KeyDescriptor != NULL)) { + CopyMem (TableEntry, KeyDescriptor, sizeof (EFI_KEY_DESCRIPTOR)); + } FreePool (KeyboardLayout); } diff --git a/MdeModulePkg/Bus/Usb/UsbMouseAbsolutePointerDxe/UsbMouseAbsolutePointer.c b/MdeModulePkg/Bus/Usb/UsbMouseAbsolutePointerDxe/UsbMouseAbsolutePointer.c index 5706ccda2ae3..c75ce8a172d4 100644 --- a/MdeModulePkg/Bus/Usb/UsbMouseAbsolutePointerDxe/UsbMouseAbsolutePointer.c +++ b/MdeModulePkg/Bus/Usb/UsbMouseAbsolutePointerDxe/UsbMouseAbsolutePointer.c @@ -160,7 +160,11 @@ USBMouseAbsolutePointerDriverBindingStart ( } UsbMouseAbsolutePointerDevice = AllocateZeroPool (sizeof (USB_MOUSE_ABSOLUTE_POINTER_DEV)); - ASSERT (UsbMouseAbsolutePointerDevice != NULL); + if (UsbMouseAbsolutePointerDevice == NULL) { + ASSERT (UsbMouseAbsolutePointerDevice != NULL); + Status = EFI_OUT_OF_RESOURCES; + goto ErrorExit; + } UsbMouseAbsolutePointerDevice->UsbIo = UsbIo; UsbMouseAbsolutePointerDevice->Signature = USB_MOUSE_ABSOLUTE_POINTER_DEV_SIGNATURE; @@ -631,7 +635,11 @@ InitializeUsbMouseDevice ( } ReportDesc = AllocateZeroPool (MouseHidDesc->HidClassDesc[0].DescriptorLength); - ASSERT (ReportDesc != NULL); + if (ReportDesc == NULL) { + ASSERT (ReportDesc != NULL); + FreePool (Buf); + return EFI_OUT_OF_RESOURCES; + } Status = UsbGetReportDescriptor ( UsbIo, From 4e950950a432f87eae5687ff934b97523667e0c4 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Wed, 26 Feb 2025 13:13:07 +0100 Subject: [PATCH 0352/1172] MdeModulePkg/Usb: Remove UhciPei Remove the UHCI PEI module, which is unused (in edk2-platforms) and obsolete. It also implements an older version of the USB host controller PPI, which can be dropped from EDK2 entirely once this driver is gone. Signed-off-by: Ard Biesheuvel --- MdeModulePkg/Bus/Pci/UhciPei/DmaMem.c | 225 -- MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.c | 3303 ----------------- MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.h | 1383 ------- MdeModulePkg/Bus/Pci/UhciPei/UhciPei.inf | 60 - MdeModulePkg/Bus/Pci/UhciPei/UhciPei.uni | 17 - MdeModulePkg/Bus/Pci/UhciPei/UhciPeiExtra.uni | 14 - MdeModulePkg/MdeModulePkg.dsc | 1 - 7 files changed, 5003 deletions(-) delete mode 100644 MdeModulePkg/Bus/Pci/UhciPei/DmaMem.c delete mode 100644 MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.c delete mode 100644 MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.h delete mode 100644 MdeModulePkg/Bus/Pci/UhciPei/UhciPei.inf delete mode 100644 MdeModulePkg/Bus/Pci/UhciPei/UhciPei.uni delete mode 100644 MdeModulePkg/Bus/Pci/UhciPei/UhciPeiExtra.uni diff --git a/MdeModulePkg/Bus/Pci/UhciPei/DmaMem.c b/MdeModulePkg/Bus/Pci/UhciPei/DmaMem.c deleted file mode 100644 index c6ef12923593..000000000000 --- a/MdeModulePkg/Bus/Pci/UhciPei/DmaMem.c +++ /dev/null @@ -1,225 +0,0 @@ -/** @file -The DMA memory help functions. - -Copyright (c) 2017, Intel Corporation. All rights reserved.
- -SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include "UhcPeim.h" - -/** - Provides the controller-specific addresses required to access system memory from a - DMA bus master. - - @param IoMmu Pointer to IOMMU PPI. - @param Operation Indicates if the bus master is going to read or write to system memory. - @param HostAddress The system memory address to map to the PCI controller. - @param NumberOfBytes On input the number of bytes to map. On output the number of bytes - that were mapped. - @param DeviceAddress The resulting map address for the bus master PCI controller to use to - access the hosts HostAddress. - @param Mapping A resulting value to pass to Unmap(). - - @retval EFI_SUCCESS The range was mapped for the returned NumberOfBytes. - @retval EFI_UNSUPPORTED The HostAddress cannot be mapped as a common buffer. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. - @retval EFI_DEVICE_ERROR The system hardware could not map the requested address. - -**/ -EFI_STATUS -IoMmuMap ( - IN EDKII_IOMMU_PPI *IoMmu, - IN EDKII_IOMMU_OPERATION Operation, - IN VOID *HostAddress, - IN OUT UINTN *NumberOfBytes, - OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, - OUT VOID **Mapping - ) -{ - EFI_STATUS Status; - UINT64 Attribute; - - if (IoMmu != NULL) { - Status = IoMmu->Map ( - IoMmu, - Operation, - HostAddress, - NumberOfBytes, - DeviceAddress, - Mapping - ); - if (EFI_ERROR (Status)) { - return EFI_OUT_OF_RESOURCES; - } - - switch (Operation) { - case EdkiiIoMmuOperationBusMasterRead: - case EdkiiIoMmuOperationBusMasterRead64: - Attribute = EDKII_IOMMU_ACCESS_READ; - break; - case EdkiiIoMmuOperationBusMasterWrite: - case EdkiiIoMmuOperationBusMasterWrite64: - Attribute = EDKII_IOMMU_ACCESS_WRITE; - break; - case EdkiiIoMmuOperationBusMasterCommonBuffer: - case EdkiiIoMmuOperationBusMasterCommonBuffer64: - Attribute = EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE; - break; - default: - ASSERT (FALSE); - return EFI_INVALID_PARAMETER; - } - - Status = IoMmu->SetAttribute ( - IoMmu, - *Mapping, - Attribute - ); - if (EFI_ERROR (Status)) { - IoMmu->Unmap (IoMmu, Mapping); - *Mapping = NULL; - return Status; - } - } else { - *DeviceAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)HostAddress; - *Mapping = NULL; - Status = EFI_SUCCESS; - } - - return Status; -} - -/** - Completes the Map() operation and releases any corresponding resources. - - @param IoMmu Pointer to IOMMU PPI. - @param Mapping The mapping value returned from Map(). - -**/ -VOID -IoMmuUnmap ( - IN EDKII_IOMMU_PPI *IoMmu, - IN VOID *Mapping - ) -{ - if (IoMmu != NULL) { - IoMmu->SetAttribute (IoMmu, Mapping, 0); - IoMmu->Unmap (IoMmu, Mapping); - } -} - -/** - Allocates pages that are suitable for an OperationBusMasterCommonBuffer or - OperationBusMasterCommonBuffer64 mapping. - - @param IoMmu Pointer to IOMMU PPI. - @param Pages The number of pages to allocate. - @param HostAddress A pointer to store the base system memory address of the - allocated range. - @param DeviceAddress The resulting map address for the bus master PCI controller to use to - access the hosts HostAddress. - @param Mapping A resulting value to pass to Unmap(). - - @retval EFI_SUCCESS The requested memory pages were allocated. - @retval EFI_UNSUPPORTED Attributes is unsupported. The only legal attribute bits are - MEMORY_WRITE_COMBINE and MEMORY_CACHED. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES The memory pages could not be allocated. - -**/ -EFI_STATUS -IoMmuAllocateBuffer ( - IN EDKII_IOMMU_PPI *IoMmu, - IN UINTN Pages, - OUT VOID **HostAddress, - OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, - OUT VOID **Mapping - ) -{ - EFI_STATUS Status; - UINTN NumberOfBytes; - EFI_PHYSICAL_ADDRESS HostPhyAddress; - - *HostAddress = NULL; - *DeviceAddress = 0; - *Mapping = NULL; - - if (IoMmu != NULL) { - Status = IoMmu->AllocateBuffer ( - IoMmu, - EfiBootServicesData, - Pages, - HostAddress, - 0 - ); - if (EFI_ERROR (Status)) { - return EFI_OUT_OF_RESOURCES; - } - - NumberOfBytes = EFI_PAGES_TO_SIZE (Pages); - Status = IoMmu->Map ( - IoMmu, - EdkiiIoMmuOperationBusMasterCommonBuffer, - *HostAddress, - &NumberOfBytes, - DeviceAddress, - Mapping - ); - if (EFI_ERROR (Status)) { - IoMmu->FreeBuffer (IoMmu, Pages, *HostAddress); - *HostAddress = NULL; - return EFI_OUT_OF_RESOURCES; - } - - Status = IoMmu->SetAttribute ( - IoMmu, - *Mapping, - EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE - ); - if (EFI_ERROR (Status)) { - IoMmu->Unmap (IoMmu, *Mapping); - IoMmu->FreeBuffer (IoMmu, Pages, *HostAddress); - *Mapping = NULL; - *HostAddress = NULL; - return Status; - } - } else { - Status = PeiServicesAllocatePages ( - EfiBootServicesData, - Pages, - &HostPhyAddress - ); - if (EFI_ERROR (Status)) { - return EFI_OUT_OF_RESOURCES; - } - - *HostAddress = (VOID *)(UINTN)HostPhyAddress; - *DeviceAddress = HostPhyAddress; - *Mapping = NULL; - } - - return Status; -} - -/** - Initialize IOMMU. - - @param IoMmu Pointer to pointer to IOMMU PPI. - -**/ -VOID -IoMmuInit ( - OUT EDKII_IOMMU_PPI **IoMmu - ) -{ - *IoMmu = NULL; - PeiServicesLocatePpi ( - &gEdkiiIoMmuPpiGuid, - 0, - NULL, - (VOID **)IoMmu - ); -} diff --git a/MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.c b/MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.c deleted file mode 100644 index 96abf3ab13bd..000000000000 --- a/MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.c +++ /dev/null @@ -1,3303 +0,0 @@ -/** @file -PEIM to produce gPeiUsbHostControllerPpiGuid based on gPeiUsbControllerPpiGuid -which is used to enable recovery function from USB Drivers. - -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
- -SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include "UhcPeim.h" - -/** - Stop the host controller. - - @param Uhc The UHCI device. - @param Timeout Max time allowed. - - @retval EFI_SUCCESS The host controller is stopped. - @retval EFI_TIMEOUT Failed to stop the host controller. - -**/ -EFI_STATUS -UhciStopHc ( - IN USB_UHC_DEV *Uhc, - IN UINTN Timeout - ) -{ - UINT16 CommandContent; - UINT16 UsbSts; - UINTN Index; - - CommandContent = USBReadPortW (Uhc, Uhc->UsbHostControllerBaseAddress + USBCMD); - CommandContent &= USBCMD_RS; - USBWritePortW (Uhc, Uhc->UsbHostControllerBaseAddress + USBCMD, CommandContent); - - // - // ensure the HC is in halt status after send the stop command - // Timeout is in us unit. - // - for (Index = 0; Index < (Timeout / 50) + 1; Index++) { - UsbSts = USBReadPortW (Uhc, Uhc->UsbHostControllerBaseAddress + USBSTS); - - if ((UsbSts & USBSTS_HCH) == USBSTS_HCH) { - return EFI_SUCCESS; - } - - MicroSecondDelay (50); - } - - return EFI_TIMEOUT; -} - -/** - One notified function to stop the Host Controller at the end of PEI - - @param[in] PeiServices Pointer to PEI Services Table. - @param[in] NotifyDescriptor Pointer to the descriptor for the Notification event that - caused this function to execute. - @param[in] Ppi Pointer to the PPI data associated with this function. - - @retval EFI_SUCCESS The function completes successfully - @retval others -**/ -EFI_STATUS -EFIAPI -UhcEndOfPei ( - IN EFI_PEI_SERVICES **PeiServices, - IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, - IN VOID *Ppi - ) -{ - USB_UHC_DEV *Uhc; - - Uhc = PEI_RECOVERY_USB_UHC_DEV_FROM_THIS_NOTIFY (NotifyDescriptor); - - // - // Stop the Host Controller - // - UhciStopHc (Uhc, 1000 * 1000); - - return EFI_SUCCESS; -} - -/** - Initializes Usb Host Controller. - - @param FileHandle Handle of the file being invoked. - @param PeiServices Describes the list of possible PEI Services. - - @retval EFI_SUCCESS PPI successfully installed. - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. - -**/ -EFI_STATUS -EFIAPI -UhcPeimEntry ( - IN EFI_PEI_FILE_HANDLE FileHandle, - IN CONST EFI_PEI_SERVICES **PeiServices - ) -{ - PEI_USB_CONTROLLER_PPI *ChipSetUsbControllerPpi; - EFI_STATUS Status; - UINT8 Index; - UINTN ControllerType; - UINTN BaseAddress; - UINTN MemPages; - USB_UHC_DEV *UhcDev; - EFI_PHYSICAL_ADDRESS TempPtr; - - // - // Shadow this PEIM to run from memory - // - if (!EFI_ERROR (PeiServicesRegisterForShadow (FileHandle))) { - return EFI_SUCCESS; - } - - Status = PeiServicesLocatePpi ( - &gPeiUsbControllerPpiGuid, - 0, - NULL, - (VOID **)&ChipSetUsbControllerPpi - ); - // - // If failed to locate, it is a bug in dispather as depex has gPeiUsbControllerPpiGuid. - // - ASSERT_EFI_ERROR (Status); - - Index = 0; - while (TRUE) { - Status = ChipSetUsbControllerPpi->GetUsbController ( - (EFI_PEI_SERVICES **)PeiServices, - ChipSetUsbControllerPpi, - Index, - &ControllerType, - &BaseAddress - ); - // - // When status is error, meant no controller is found - // - if (EFI_ERROR (Status)) { - break; - } - - // - // This PEIM is for UHC type controller. - // - if (ControllerType != PEI_UHCI_CONTROLLER) { - Index++; - continue; - } - - MemPages = sizeof (USB_UHC_DEV) / EFI_PAGE_SIZE + 1; - - Status = PeiServicesAllocatePages ( - EfiBootServicesData, - MemPages, - &TempPtr - ); - if (EFI_ERROR (Status)) { - return EFI_OUT_OF_RESOURCES; - } - - UhcDev = (USB_UHC_DEV *)((UINTN)TempPtr); - UhcDev->Signature = USB_UHC_DEV_SIGNATURE; - IoMmuInit (&UhcDev->IoMmu); - UhcDev->UsbHostControllerBaseAddress = (UINT32)BaseAddress; - - // - // Init local memory management service - // - Status = InitializeMemoryManagement (UhcDev); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Initialize Uhc's hardware - // - Status = InitializeUsbHC (UhcDev); - if (EFI_ERROR (Status)) { - return Status; - } - - UhcDev->UsbHostControllerPpi.ControlTransfer = UhcControlTransfer; - UhcDev->UsbHostControllerPpi.BulkTransfer = UhcBulkTransfer; - UhcDev->UsbHostControllerPpi.GetRootHubPortNumber = UhcGetRootHubPortNumber; - UhcDev->UsbHostControllerPpi.GetRootHubPortStatus = UhcGetRootHubPortStatus; - UhcDev->UsbHostControllerPpi.SetRootHubPortFeature = UhcSetRootHubPortFeature; - UhcDev->UsbHostControllerPpi.ClearRootHubPortFeature = UhcClearRootHubPortFeature; - - UhcDev->PpiDescriptor.Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST); - UhcDev->PpiDescriptor.Guid = &gPeiUsbHostControllerPpiGuid; - UhcDev->PpiDescriptor.Ppi = &UhcDev->UsbHostControllerPpi; - - Status = PeiServicesInstallPpi (&UhcDev->PpiDescriptor); - if (EFI_ERROR (Status)) { - Index++; - continue; - } - - UhcDev->EndOfPeiNotifyList.Flags = (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST); - UhcDev->EndOfPeiNotifyList.Guid = &gEfiEndOfPeiSignalPpiGuid; - UhcDev->EndOfPeiNotifyList.Notify = UhcEndOfPei; - - PeiServicesNotifyPpi (&UhcDev->EndOfPeiNotifyList); - - Index++; - } - - return EFI_SUCCESS; -} - -/** - Submits control transfer to a target USB device. - - @param PeiServices The pointer of EFI_PEI_SERVICES. - @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI. - @param DeviceAddress The target device address. - @param DeviceSpeed Target device speed. - @param MaximumPacketLength Maximum packet size the default control transfer - endpoint is capable of sending or receiving. - @param Request USB device request to send. - @param TransferDirection Specifies the data direction for the data stage. - @param Data Data buffer to be transmitted or received from USB device. - @param DataLength The size (in bytes) of the data buffer. - @param TimeOut Indicates the maximum timeout, in millisecond. - If Timeout is 0, then the caller must wait for the function - to be completed until EFI_SUCCESS or EFI_DEVICE_ERROR is returned. - @param TransferResult Return the result of this control transfer. - - @retval EFI_SUCCESS Transfer was completed successfully. - @retval EFI_OUT_OF_RESOURCES The transfer failed due to lack of resources. - @retval EFI_INVALID_PARAMETER Some parameters are invalid. - @retval EFI_TIMEOUT Transfer failed due to timeout. - @retval EFI_DEVICE_ERROR Transfer failed due to host controller or device error. - -**/ -EFI_STATUS -EFIAPI -UhcControlTransfer ( - IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *This, - IN UINT8 DeviceAddress, - IN UINT8 DeviceSpeed, - IN UINT8 MaximumPacketLength, - IN EFI_USB_DEVICE_REQUEST *Request, - IN EFI_USB_DATA_DIRECTION TransferDirection, - IN OUT VOID *Data OPTIONAL, - IN OUT UINTN *DataLength OPTIONAL, - IN UINTN TimeOut, - OUT UINT32 *TransferResult - ) -{ - USB_UHC_DEV *UhcDev; - UINT32 StatusReg; - UINT8 PktID; - QH_STRUCT *PtrQH; - TD_STRUCT *PtrTD; - TD_STRUCT *PtrPreTD; - TD_STRUCT *PtrSetupTD; - TD_STRUCT *PtrStatusTD; - EFI_STATUS Status; - UINT32 DataLen; - UINT8 DataToggle; - UINT8 *RequestPhy; - VOID *RequestMap; - UINT8 *DataPhy; - VOID *DataMap; - - UhcDev = PEI_RECOVERY_USB_UHC_DEV_FROM_UHCI_THIS (This); - - StatusReg = UhcDev->UsbHostControllerBaseAddress + USBSTS; - - PktID = INPUT_PACKET_ID; - - RequestMap = NULL; - - if ((Request == NULL) || (TransferResult == NULL)) { - return EFI_INVALID_PARAMETER; - } - - // - // if errors exist that cause host controller halt, - // then return EFI_DEVICE_ERROR. - // - - if (!IsStatusOK (UhcDev, StatusReg)) { - ClearStatusReg (UhcDev, StatusReg); - *TransferResult = EFI_USB_ERR_SYSTEM; - return EFI_DEVICE_ERROR; - } - - ClearStatusReg (UhcDev, StatusReg); - - // - // Map the Request and data for bus master access, - // then create a list of TD for this transfer - // - Status = UhciMapUserRequest (UhcDev, Request, &RequestPhy, &RequestMap); - if (EFI_ERROR (Status)) { - return Status; - } - - Status = UhciMapUserData (UhcDev, TransferDirection, Data, DataLength, &PktID, &DataPhy, &DataMap); - - if (EFI_ERROR (Status)) { - if (RequestMap != NULL) { - IoMmuUnmap (UhcDev->IoMmu, RequestMap); - } - - return Status; - } - - // - // generate Setup Stage TD - // - - PtrQH = UhcDev->ConfigQH; - - GenSetupStageTD ( - UhcDev, - DeviceAddress, - 0, - DeviceSpeed, - (UINT8 *)Request, - RequestPhy, - (UINT8)sizeof (EFI_USB_DEVICE_REQUEST), - &PtrSetupTD - ); - - // - // link setup TD structures to QH structure - // - LinkTDToQH (PtrQH, PtrSetupTD); - - PtrPreTD = PtrSetupTD; - - // - // Data Stage of Control Transfer - // - - if (TransferDirection == EfiUsbNoData) { - DataLen = 0; - } else { - DataLen = (UINT32)*DataLength; - } - - DataToggle = 1; - - PtrTD = PtrSetupTD; - while (DataLen > 0) { - // - // create TD structures and link together - // - UINT8 PacketSize; - - // - // PacketSize is the data load size of each TD carries. - // - PacketSize = (UINT8)DataLen; - if (DataLen > MaximumPacketLength) { - PacketSize = MaximumPacketLength; - } - - GenDataTD ( - UhcDev, - DeviceAddress, - 0, - Data, - DataPhy, - PacketSize, - PktID, - DataToggle, - DeviceSpeed, - &PtrTD - ); - - // - // Link two TDs in vertical depth - // - LinkTDToTD (PtrPreTD, PtrTD); - PtrPreTD = PtrTD; - - DataToggle ^= 1; - Data = (VOID *)((UINT8 *)Data + PacketSize); - DataPhy += PacketSize; - DataLen -= PacketSize; - } - - // - // PtrPreTD points to the last TD before the Setup-Stage TD. - // - PtrPreTD = PtrTD; - - // - // Status Stage of Control Transfer - // - if (PktID == OUTPUT_PACKET_ID) { - PktID = INPUT_PACKET_ID; - } else { - PktID = OUTPUT_PACKET_ID; - } - - // - // create Status Stage TD structure - // - CreateStatusTD ( - UhcDev, - DeviceAddress, - 0, - PktID, - DeviceSpeed, - &PtrStatusTD - ); - - LinkTDToTD (PtrPreTD, PtrStatusTD); - - // - // Poll QH-TDs execution and get result. - // detail status is returned - // - Status = ExecuteControlTransfer ( - UhcDev, - PtrSetupTD, - DataLength, - TimeOut, - TransferResult - ); - - // - // TRUE means must search other framelistindex - // - SetQHVerticalValidorInvalid (PtrQH, FALSE); - DeleteQueuedTDs (UhcDev, PtrSetupTD); - - // - // if has errors that cause host controller halt, then return EFI_DEVICE_ERROR directly. - // - if (!IsStatusOK (UhcDev, StatusReg)) { - *TransferResult |= EFI_USB_ERR_SYSTEM; - Status = EFI_DEVICE_ERROR; - } - - ClearStatusReg (UhcDev, StatusReg); - - if (DataMap != NULL) { - IoMmuUnmap (UhcDev->IoMmu, DataMap); - } - - if (RequestMap != NULL) { - IoMmuUnmap (UhcDev->IoMmu, RequestMap); - } - - return Status; -} - -/** - Submits bulk transfer to a bulk endpoint of a USB device. - - @param PeiServices The pointer of EFI_PEI_SERVICES. - @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI. - @param DeviceAddress Target device address. - @param EndPointAddress Endpoint number and its direction in bit 7. - @param MaximumPacketLength Maximum packet size the endpoint is capable of - sending or receiving. - @param Data Array of pointers to the buffers of data to transmit - from or receive into. - @param DataLength The lenght of the data buffer. - @param DataToggle On input, the initial data toggle for the transfer; - On output, it is updated to to next data toggle to use of - the subsequent bulk transfer. - @param TimeOut Indicates the maximum time, in millisecond, which the - transfer is allowed to complete. - If Timeout is 0, then the caller must wait for the function - to be completed until EFI_SUCCESS or EFI_DEVICE_ERROR is returned. - @param TransferResult A pointer to the detailed result information of the - bulk transfer. - - @retval EFI_SUCCESS The transfer was completed successfully. - @retval EFI_OUT_OF_RESOURCES The transfer failed due to lack of resource. - @retval EFI_INVALID_PARAMETER Parameters are invalid. - @retval EFI_TIMEOUT The transfer failed due to timeout. - @retval EFI_DEVICE_ERROR The transfer failed due to host controller error. - -**/ -EFI_STATUS -EFIAPI -UhcBulkTransfer ( - IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *This, - IN UINT8 DeviceAddress, - IN UINT8 EndPointAddress, - IN UINT8 MaximumPacketLength, - IN OUT VOID *Data, - IN OUT UINTN *DataLength, - IN OUT UINT8 *DataToggle, - IN UINTN TimeOut, - OUT UINT32 *TransferResult - ) -{ - USB_UHC_DEV *UhcDev; - UINT32 StatusReg; - - UINT32 DataLen; - - QH_STRUCT *PtrQH; - TD_STRUCT *PtrFirstTD; - TD_STRUCT *PtrTD; - TD_STRUCT *PtrPreTD; - - UINT8 PktID; - - BOOLEAN IsFirstTD; - - EFI_STATUS Status; - - EFI_USB_DATA_DIRECTION TransferDirection; - - BOOLEAN ShortPacketEnable; - - UINT16 CommandContent; - - UINT8 *DataPhy; - VOID *DataMap; - - UhcDev = PEI_RECOVERY_USB_UHC_DEV_FROM_UHCI_THIS (This); - - // - // Enable the maximum packet size (64bytes) - // that can be used for full speed bandwidth reclamation - // at the end of a frame. - // - CommandContent = USBReadPortW (UhcDev, UhcDev->UsbHostControllerBaseAddress + USBCMD); - if ((CommandContent & USBCMD_MAXP) != USBCMD_MAXP) { - CommandContent |= USBCMD_MAXP; - USBWritePortW (UhcDev, UhcDev->UsbHostControllerBaseAddress + USBCMD, CommandContent); - } - - StatusReg = UhcDev->UsbHostControllerBaseAddress + USBSTS; - - // - // these code lines are added here per complier's strict demand - // - PktID = INPUT_PACKET_ID; - PtrTD = NULL; - PtrFirstTD = NULL; - PtrPreTD = NULL; - DataLen = 0; - - ShortPacketEnable = FALSE; - - if ((DataLength == 0) || (Data == NULL) || (TransferResult == NULL)) { - return EFI_INVALID_PARAMETER; - } - - if ((*DataToggle != 1) && (*DataToggle != 0)) { - return EFI_INVALID_PARAMETER; - } - - if ( (MaximumPacketLength != 8) && (MaximumPacketLength != 16) - && (MaximumPacketLength != 32) && (MaximumPacketLength != 64)) - { - return EFI_INVALID_PARAMETER; - } - - // - // if has errors that cause host controller halt, then return EFI_DEVICE_ERROR directly. - // - if (!IsStatusOK (UhcDev, StatusReg)) { - ClearStatusReg (UhcDev, StatusReg); - *TransferResult = EFI_USB_ERR_SYSTEM; - return EFI_DEVICE_ERROR; - } - - ClearStatusReg (UhcDev, StatusReg); - - // - // Map the source data buffer for bus master access, - // then create a list of TDs - // - if ((EndPointAddress & 0x80) != 0) { - TransferDirection = EfiUsbDataIn; - } else { - TransferDirection = EfiUsbDataOut; - } - - Status = UhciMapUserData (UhcDev, TransferDirection, Data, DataLength, &PktID, &DataPhy, &DataMap); - - if (EFI_ERROR (Status)) { - return Status; - } - - DataLen = (UINT32)*DataLength; - - PtrQH = UhcDev->BulkQH; - - IsFirstTD = TRUE; - while (DataLen > 0) { - // - // create TD structures and link together - // - UINT8 PacketSize; - - PacketSize = (UINT8)DataLen; - if (DataLen > MaximumPacketLength) { - PacketSize = MaximumPacketLength; - } - - GenDataTD ( - UhcDev, - DeviceAddress, - EndPointAddress, - Data, - DataPhy, - PacketSize, - PktID, - *DataToggle, - USB_FULL_SPEED_DEVICE, - &PtrTD - ); - - // - // Enable short packet detection. - // (default action is disabling short packet detection) - // - if (ShortPacketEnable) { - EnableorDisableTDShortPacket (PtrTD, TRUE); - } - - if (IsFirstTD) { - PtrFirstTD = PtrTD; - PtrFirstTD->PtrNextTD = NULL; - IsFirstTD = FALSE; - } else { - // - // Link two TDs in vertical depth - // - LinkTDToTD (PtrPreTD, PtrTD); - } - - PtrPreTD = PtrTD; - - *DataToggle ^= 1; - Data = (VOID *)((UINT8 *)Data + PacketSize); - DataPhy += PacketSize; - DataLen -= PacketSize; - } - - // - // link TD structures to QH structure - // - LinkTDToQH (PtrQH, PtrFirstTD); - - // - // Execute QH-TD and get result - // - // - // detail status is put into the Result field in the pIRP - // the Data Toggle value is also re-updated to the value - // of the last successful TD - // - Status = ExecBulkTransfer ( - UhcDev, - PtrFirstTD, - DataLength, - DataToggle, - TimeOut, - TransferResult - ); - - // - // Delete Bulk transfer TD structure - // - DeleteQueuedTDs (UhcDev, PtrFirstTD); - - // - // if has errors that cause host controller halt, then return EFI_DEVICE_ERROR directly. - // - if (!IsStatusOK (UhcDev, StatusReg)) { - *TransferResult |= EFI_USB_ERR_SYSTEM; - Status = EFI_DEVICE_ERROR; - } - - ClearStatusReg (UhcDev, StatusReg); - - if (DataMap != NULL) { - IoMmuUnmap (UhcDev->IoMmu, DataMap); - } - - return Status; -} - -/** - Retrieves the number of root hub ports. - - @param[in] PeiServices The pointer to the PEI Services Table. - @param[in] This The pointer to this instance of the - PEI_USB_HOST_CONTROLLER_PPI. - @param[out] PortNumber The pointer to the number of the root hub ports. - - @retval EFI_SUCCESS The port number was retrieved successfully. - @retval EFI_INVALID_PARAMETER PortNumber is NULL. - -**/ -EFI_STATUS -EFIAPI -UhcGetRootHubPortNumber ( - IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *This, - OUT UINT8 *PortNumber - ) -{ - USB_UHC_DEV *UhcDev; - UINT32 PSAddr; - UINT16 RHPortControl; - UINT32 Index; - - UhcDev = PEI_RECOVERY_USB_UHC_DEV_FROM_UHCI_THIS (This); - - if (PortNumber == NULL) { - return EFI_INVALID_PARAMETER; - } - - *PortNumber = 0; - - for (Index = 0; Index < 2; Index++) { - PSAddr = UhcDev->UsbHostControllerBaseAddress + USBPORTSC1 + Index * 2; - RHPortControl = USBReadPortW (UhcDev, PSAddr); - // - // Port Register content is valid - // - if (RHPortControl != 0xff) { - (*PortNumber)++; - } - } - - return EFI_SUCCESS; -} - -/** - Retrieves the current status of a USB root hub port. - - @param PeiServices The pointer of EFI_PEI_SERVICES. - @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI. - @param PortNumber The root hub port to retrieve the state from. - @param PortStatus Variable to receive the port state. - - @retval EFI_SUCCESS The status of the USB root hub port specified. - by PortNumber was returned in PortStatus. - @retval EFI_INVALID_PARAMETER PortNumber is invalid. - -**/ -EFI_STATUS -EFIAPI -UhcGetRootHubPortStatus ( - IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *This, - IN UINT8 PortNumber, - OUT EFI_USB_PORT_STATUS *PortStatus - ) -{ - USB_UHC_DEV *UhcDev; - UINT32 PSAddr; - UINT16 RHPortStatus; - UINT8 TotalPortNumber; - - if (PortStatus == NULL) { - return EFI_INVALID_PARAMETER; - } - - UhcGetRootHubPortNumber (PeiServices, This, &TotalPortNumber); - if (PortNumber > TotalPortNumber) { - return EFI_INVALID_PARAMETER; - } - - UhcDev = PEI_RECOVERY_USB_UHC_DEV_FROM_UHCI_THIS (This); - PSAddr = UhcDev->UsbHostControllerBaseAddress + USBPORTSC1 + PortNumber * 2; - - PortStatus->PortStatus = 0; - PortStatus->PortChangeStatus = 0; - - RHPortStatus = USBReadPortW (UhcDev, PSAddr); - - // - // Current Connect Status - // - if ((RHPortStatus & USBPORTSC_CCS) != 0) { - PortStatus->PortStatus |= USB_PORT_STAT_CONNECTION; - } - - // - // Port Enabled/Disabled - // - if ((RHPortStatus & USBPORTSC_PED) != 0) { - PortStatus->PortStatus |= USB_PORT_STAT_ENABLE; - } - - // - // Port Suspend - // - if ((RHPortStatus & USBPORTSC_SUSP) != 0) { - PortStatus->PortStatus |= USB_PORT_STAT_SUSPEND; - } - - // - // Port Reset - // - if ((RHPortStatus & USBPORTSC_PR) != 0) { - PortStatus->PortStatus |= USB_PORT_STAT_RESET; - } - - // - // Low Speed Device Attached - // - if ((RHPortStatus & USBPORTSC_LSDA) != 0) { - PortStatus->PortStatus |= USB_PORT_STAT_LOW_SPEED; - } - - // - // Fill Port Status Change bits - // - // - // Connect Status Change - // - if ((RHPortStatus & USBPORTSC_CSC) != 0) { - PortStatus->PortChangeStatus |= USB_PORT_STAT_C_CONNECTION; - } - - // - // Port Enabled/Disabled Change - // - if ((RHPortStatus & USBPORTSC_PEDC) != 0) { - PortStatus->PortChangeStatus |= USB_PORT_STAT_C_ENABLE; - } - - return EFI_SUCCESS; -} - -/** - Sets a feature for the specified root hub port. - - @param PeiServices The pointer of EFI_PEI_SERVICES - @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI - @param PortNumber Root hub port to set. - @param PortFeature Feature to set. - - @retval EFI_SUCCESS The feature specified by PortFeature was set. - @retval EFI_INVALID_PARAMETER PortNumber is invalid or PortFeature is invalid. - @retval EFI_TIMEOUT The time out occurred. - -**/ -EFI_STATUS -EFIAPI -UhcSetRootHubPortFeature ( - IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *This, - IN UINT8 PortNumber, - IN EFI_USB_PORT_FEATURE PortFeature - ) -{ - USB_UHC_DEV *UhcDev; - UINT32 PSAddr; - UINT32 CommandRegAddr; - UINT16 RHPortControl; - UINT8 TotalPortNumber; - - UhcGetRootHubPortNumber (PeiServices, This, &TotalPortNumber); - if (PortNumber > TotalPortNumber) { - return EFI_INVALID_PARAMETER; - } - - UhcDev = PEI_RECOVERY_USB_UHC_DEV_FROM_UHCI_THIS (This); - PSAddr = UhcDev->UsbHostControllerBaseAddress + USBPORTSC1 + PortNumber * 2; - CommandRegAddr = UhcDev->UsbHostControllerBaseAddress + USBCMD; - - RHPortControl = USBReadPortW (UhcDev, PSAddr); - - switch (PortFeature) { - case EfiUsbPortSuspend: - if ((USBReadPortW (UhcDev, CommandRegAddr) & USBCMD_EGSM) == 0) { - // - // if global suspend is not active, can set port suspend - // - RHPortControl &= 0xfff5; - RHPortControl |= USBPORTSC_SUSP; - } - - break; - - case EfiUsbPortReset: - RHPortControl &= 0xfff5; - RHPortControl |= USBPORTSC_PR; - // - // Set the reset bit - // - break; - - case EfiUsbPortPower: - break; - - case EfiUsbPortEnable: - RHPortControl &= 0xfff5; - RHPortControl |= USBPORTSC_PED; - break; - - default: - return EFI_INVALID_PARAMETER; - } - - USBWritePortW (UhcDev, PSAddr, RHPortControl); - - return EFI_SUCCESS; -} - -/** - Clears a feature for the specified root hub port. - - @param PeiServices The pointer of EFI_PEI_SERVICES. - @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI. - @param PortNumber Specifies the root hub port whose feature - is requested to be cleared. - @param PortFeature Indicates the feature selector associated with the - feature clear request. - - @retval EFI_SUCCESS The feature specified by PortFeature was cleared - for the USB root hub port specified by PortNumber. - @retval EFI_INVALID_PARAMETER PortNumber is invalid or PortFeature is invalid. - -**/ -EFI_STATUS -EFIAPI -UhcClearRootHubPortFeature ( - IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *This, - IN UINT8 PortNumber, - IN EFI_USB_PORT_FEATURE PortFeature - ) -{ - USB_UHC_DEV *UhcDev; - UINT32 PSAddr; - UINT16 RHPortControl; - UINT8 TotalPortNumber; - - UhcGetRootHubPortNumber (PeiServices, This, &TotalPortNumber); - - if (PortNumber > TotalPortNumber) { - return EFI_INVALID_PARAMETER; - } - - UhcDev = PEI_RECOVERY_USB_UHC_DEV_FROM_UHCI_THIS (This); - PSAddr = UhcDev->UsbHostControllerBaseAddress + USBPORTSC1 + PortNumber * 2; - - RHPortControl = USBReadPortW (UhcDev, PSAddr); - - switch (PortFeature) { - // - // clear PORT_ENABLE feature means disable port. - // - case EfiUsbPortEnable: - RHPortControl &= 0xfff5; - RHPortControl &= ~USBPORTSC_PED; - break; - - // - // clear PORT_SUSPEND feature means resume the port. - // (cause a resume on the specified port if in suspend mode) - // - case EfiUsbPortSuspend: - RHPortControl &= 0xfff5; - RHPortControl &= ~USBPORTSC_SUSP; - break; - - // - // no operation - // - case EfiUsbPortPower: - break; - - // - // clear PORT_RESET means clear the reset signal. - // - case EfiUsbPortReset: - RHPortControl &= 0xfff5; - RHPortControl &= ~USBPORTSC_PR; - break; - - // - // clear connect status change - // - case EfiUsbPortConnectChange: - RHPortControl &= 0xfff5; - RHPortControl |= USBPORTSC_CSC; - break; - - // - // clear enable/disable status change - // - case EfiUsbPortEnableChange: - RHPortControl &= 0xfff5; - RHPortControl |= USBPORTSC_PEDC; - break; - - // - // root hub does not support this request - // - case EfiUsbPortSuspendChange: - break; - - // - // root hub does not support this request - // - case EfiUsbPortOverCurrentChange: - break; - - // - // root hub does not support this request - // - case EfiUsbPortResetChange: - break; - - default: - return EFI_INVALID_PARAMETER; - } - - USBWritePortW (UhcDev, PSAddr, RHPortControl); - - return EFI_SUCCESS; -} - -/** - Initialize UHCI. - - @param UhcDev UHCI Device. - - @retval EFI_SUCCESS UHCI successfully initialized. - @retval EFI_OUT_OF_RESOURCES Resource can not be allocated. - -**/ -EFI_STATUS -InitializeUsbHC ( - IN USB_UHC_DEV *UhcDev - ) -{ - EFI_STATUS Status; - UINT32 FrameListBaseAddrReg; - UINT32 CommandReg; - UINT16 Command; - - // - // Create and Initialize Frame List For the Host Controller. - // - Status = CreateFrameList (UhcDev); - if (EFI_ERROR (Status)) { - return Status; - } - - FrameListBaseAddrReg = UhcDev->UsbHostControllerBaseAddress + USBFLBASEADD; - CommandReg = UhcDev->UsbHostControllerBaseAddress + USBCMD; - - // - // Set Frame List Base Address to the specific register to inform the hardware. - // - SetFrameListBaseAddress (UhcDev, FrameListBaseAddrReg, (UINT32)(UINTN)(UhcDev->FrameListEntry)); - - Command = USBReadPortW (UhcDev, CommandReg); - Command |= USBCMD_GRESET; - USBWritePortW (UhcDev, CommandReg, Command); - - MicroSecondDelay (50 * 1000); - - Command &= ~USBCMD_GRESET; - - USBWritePortW (UhcDev, CommandReg, Command); - - // - // UHCI spec page120 reset recovery time - // - MicroSecondDelay (20 * 1000); - - // - // Set Run/Stop bit to 1. - // - Command = USBReadPortW (UhcDev, CommandReg); - Command |= USBCMD_RS | USBCMD_MAXP; - USBWritePortW (UhcDev, CommandReg, Command); - - return EFI_SUCCESS; -} - -/** - Create Frame List Structure. - - @param UhcDev UHCI device. - - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. - @retval EFI_SUCCESS Success. - -**/ -EFI_STATUS -CreateFrameList ( - USB_UHC_DEV *UhcDev - ) -{ - EFI_STATUS Status; - EFI_PHYSICAL_ADDRESS FrameListBaseAddr; - FRAMELIST_ENTRY *FrameListPtr; - UINTN Index; - - // - // The Frame List ocupies 4K bytes, - // and must be aligned on 4-Kbyte boundaries. - // - Status = PeiServicesAllocatePages ( - EfiBootServicesData, - 1, - &FrameListBaseAddr - ); - - if (Status != EFI_SUCCESS) { - return EFI_OUT_OF_RESOURCES; - } - - // - // Create Control QH and Bulk QH and link them into Framelist Entry - // - Status = CreateQH (UhcDev, &UhcDev->ConfigQH); - if (Status != EFI_SUCCESS) { - return EFI_OUT_OF_RESOURCES; - } - - ASSERT (UhcDev->ConfigQH != NULL); - - Status = CreateQH (UhcDev, &UhcDev->BulkQH); - if (Status != EFI_SUCCESS) { - return EFI_OUT_OF_RESOURCES; - } - - ASSERT (UhcDev->BulkQH != NULL); - - // - // Set the corresponding QH pointer - // - SetQHHorizontalLinkPtr (UhcDev->ConfigQH, UhcDev->BulkQH); - SetQHHorizontalQHorTDSelect (UhcDev->ConfigQH, TRUE); - SetQHHorizontalValidorInvalid (UhcDev->ConfigQH, TRUE); - - UhcDev->FrameListEntry = (FRAMELIST_ENTRY *)((UINTN)FrameListBaseAddr); - - FrameListPtr = UhcDev->FrameListEntry; - - for (Index = 0; Index < 1024; Index++) { - FrameListPtr->FrameListPtrTerminate = 0; - FrameListPtr->FrameListPtr = (UINT32)(UINTN)UhcDev->ConfigQH >> 4; - FrameListPtr->FrameListPtrQSelect = 1; - FrameListPtr->FrameListRsvd = 0; - FrameListPtr++; - } - - return EFI_SUCCESS; -} - -/** - Read a 16bit width data from Uhc HC IO space register. - - @param UhcDev The UHCI device. - @param Port The IO space address of the register. - - @retval the register content read. - -**/ -UINT16 -USBReadPortW ( - IN USB_UHC_DEV *UhcDev, - IN UINT32 Port - ) -{ - return IoRead16 (Port); -} - -/** - Write a 16bit width data into Uhc HC IO space register. - - @param UhcDev The UHCI device. - @param Port The IO space address of the register. - @param Data The data written into the register. - -**/ -VOID -USBWritePortW ( - IN USB_UHC_DEV *UhcDev, - IN UINT32 Port, - IN UINT16 Data - ) -{ - IoWrite16 (Port, Data); -} - -/** - Write a 32bit width data into Uhc HC IO space register. - - @param UhcDev The UHCI device. - @param Port The IO space address of the register. - @param Data The data written into the register. - -**/ -VOID -USBWritePortDW ( - IN USB_UHC_DEV *UhcDev, - IN UINT32 Port, - IN UINT32 Data - ) -{ - IoWrite32 (Port, Data); -} - -/** - Clear the content of UHCI's Status Register. - - @param UhcDev The UHCI device. - @param StatusAddr The IO space address of the register. - -**/ -VOID -ClearStatusReg ( - IN USB_UHC_DEV *UhcDev, - IN UINT32 StatusAddr - ) -{ - // - // Clear the content of UHCI's Status Register - // - USBWritePortW (UhcDev, StatusAddr, 0x003F); -} - -/** - Check whether the host controller operates well. - - @param UhcDev The UHCI device. - @param StatusRegAddr The io address of status register. - - @retval TRUE Host controller is working. - @retval FALSE Host controller is halted or system error. - -**/ -BOOLEAN -IsStatusOK ( - IN USB_UHC_DEV *UhcDev, - IN UINT32 StatusRegAddr - ) -{ - UINT16 StatusValue; - - StatusValue = USBReadPortW (UhcDev, StatusRegAddr); - - if ((StatusValue & (USBSTS_HCPE | USBSTS_HSE | USBSTS_HCH)) != 0) { - return FALSE; - } else { - return TRUE; - } -} - -/** - Set Frame List Base Address. - - @param UhcDev The UHCI device. - @param FrameListRegAddr The address of frame list register. - @param Addr The address of frame list table. - -**/ -VOID -SetFrameListBaseAddress ( - IN USB_UHC_DEV *UhcDev, - IN UINT32 FrameListRegAddr, - IN UINT32 Addr - ) -{ - // - // Sets value in the USB Frame List Base Address register. - // - USBWritePortDW (UhcDev, FrameListRegAddr, (UINT32)(Addr & 0xFFFFF000)); -} - -/** - Create QH and initialize. - - @param UhcDev The UHCI device. - @param PtrQH Place to store QH_STRUCT pointer. - - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. - @retval EFI_SUCCESS Success. - -**/ -EFI_STATUS -CreateQH ( - IN USB_UHC_DEV *UhcDev, - OUT QH_STRUCT **PtrQH - ) -{ - EFI_STATUS Status; - - // - // allocate align memory for QH_STRUCT - // - Status = AllocateTDorQHStruct (UhcDev, sizeof (QH_STRUCT), (void **)PtrQH); - if (EFI_ERROR (Status)) { - return EFI_OUT_OF_RESOURCES; - } - - // - // init each field of the QH_STRUCT - // - SetQHHorizontalValidorInvalid (*PtrQH, FALSE); - SetQHVerticalValidorInvalid (*PtrQH, FALSE); - - return EFI_SUCCESS; -} - -/** - Set the horizontal link pointer in QH. - - @param PtrQH Place to store QH_STRUCT pointer. - @param PtrNext Place to the next QH_STRUCT. - -**/ -VOID -SetQHHorizontalLinkPtr ( - IN QH_STRUCT *PtrQH, - IN VOID *PtrNext - ) -{ - // - // Since the QH_STRUCT is aligned on 16-byte boundaries, - // Only the highest 28bit of the address is valid - // (take 32bit address as an example). - // - PtrQH->QueueHead.QHHorizontalPtr = (UINT32)(UINTN)PtrNext >> 4; -} - -/** - Set a QH or TD horizontally to be connected with a specific QH. - - @param PtrQH Place to store QH_STRUCT pointer. - @param IsQH Specify QH or TD is connected. - -**/ -VOID -SetQHHorizontalQHorTDSelect ( - IN QH_STRUCT *PtrQH, - IN BOOLEAN IsQH - ) -{ - // - // if QH is connected, the specified bit is set, - // if TD is connected, the specified bit is cleared. - // - PtrQH->QueueHead.QHHorizontalQSelect = IsQH ? 1 : 0; -} - -/** - Set the horizontal validor bit in QH. - - @param PtrQH Place to store QH_STRUCT pointer. - @param IsValid Specify the horizontal linker is valid or not. - -**/ -VOID -SetQHHorizontalValidorInvalid ( - IN QH_STRUCT *PtrQH, - IN BOOLEAN IsValid - ) -{ - // - // Valid means the horizontal link pointer is valid, - // else, it's invalid. - // - PtrQH->QueueHead.QHHorizontalTerminate = IsValid ? 0 : 1; -} - -/** - Set the vertical link pointer in QH. - - @param PtrQH Place to store QH_STRUCT pointer. - @param PtrNext Place to the next QH_STRUCT. - -**/ -VOID -SetQHVerticalLinkPtr ( - IN QH_STRUCT *PtrQH, - IN VOID *PtrNext - ) -{ - // - // Since the QH_STRUCT is aligned on 16-byte boundaries, - // Only the highest 28bit of the address is valid - // (take 32bit address as an example). - // - PtrQH->QueueHead.QHVerticalPtr = (UINT32)(UINTN)PtrNext >> 4; -} - -/** - Set a QH or TD vertically to be connected with a specific QH. - - @param PtrQH Place to store QH_STRUCT pointer. - @param IsQH Specify QH or TD is connected. - -**/ -VOID -SetQHVerticalQHorTDSelect ( - IN QH_STRUCT *PtrQH, - IN BOOLEAN IsQH - ) -{ - // - // Set the specified bit if the Vertical Link Pointer pointing to a QH, - // Clear the specified bit if the Vertical Link Pointer pointing to a TD. - // - PtrQH->QueueHead.QHVerticalQSelect = IsQH ? 1 : 0; -} - -/** - Set the vertical validor bit in QH. - - @param PtrQH Place to store QH_STRUCT pointer. - @param IsValid Specify the vertical linker is valid or not. - -**/ -VOID -SetQHVerticalValidorInvalid ( - IN QH_STRUCT *PtrQH, - IN BOOLEAN IsValid - ) -{ - // - // If TRUE, meaning the Vertical Link Pointer field is valid, - // else, the field is invalid. - // - PtrQH->QueueHead.QHVerticalTerminate = IsValid ? 0 : 1; -} - -/** - Allocate TD or QH Struct. - - @param UhcDev The UHCI device. - @param Size The size of allocation. - @param PtrStruct Place to store TD_STRUCT pointer. - - @return EFI_SUCCESS Allocate successfully. - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. - -**/ -EFI_STATUS -AllocateTDorQHStruct ( - IN USB_UHC_DEV *UhcDev, - IN UINT32 Size, - OUT VOID **PtrStruct - ) -{ - EFI_STATUS Status; - - Status = EFI_SUCCESS; - *PtrStruct = NULL; - - Status = UhcAllocatePool ( - UhcDev, - (UINT8 **)PtrStruct, - Size - ); - if (EFI_ERROR (Status)) { - return Status; - } - - ZeroMem (*PtrStruct, Size); - - return Status; -} - -/** - Create a TD Struct. - - @param UhcDev The UHCI device. - @param PtrTD Place to store TD_STRUCT pointer. - - @return EFI_SUCCESS Allocate successfully. - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. - -**/ -EFI_STATUS -CreateTD ( - IN USB_UHC_DEV *UhcDev, - OUT TD_STRUCT **PtrTD - ) -{ - EFI_STATUS Status; - - // - // create memory for TD_STRUCT, and align the memory. - // - Status = AllocateTDorQHStruct (UhcDev, sizeof (TD_STRUCT), (void **)PtrTD); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Make TD ready. - // - SetTDLinkPtrValidorInvalid (*PtrTD, FALSE); - - return EFI_SUCCESS; -} - -/** - Generate Setup Stage TD. - - @param UhcDev The UHCI device. - @param DevAddr Device address. - @param Endpoint Endpoint number. - @param DeviceSpeed Device Speed. - @param DevRequest CPU memory address of request structure buffer to transfer. - @param RequestPhy PCI memory address of request structure buffer to transfer. - @param RequestLen Request length. - @param PtrTD TD_STRUCT generated. - - @return EFI_SUCCESS Generate setup stage TD successfully. - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. - -**/ -EFI_STATUS -GenSetupStageTD ( - IN USB_UHC_DEV *UhcDev, - IN UINT8 DevAddr, - IN UINT8 Endpoint, - IN UINT8 DeviceSpeed, - IN UINT8 *DevRequest, - IN UINT8 *RequestPhy, - IN UINT8 RequestLen, - OUT TD_STRUCT **PtrTD - ) -{ - TD_STRUCT *TdStruct; - EFI_STATUS Status; - - Status = CreateTD (UhcDev, &TdStruct); - if (EFI_ERROR (Status)) { - return Status; - } - - SetTDLinkPtr (TdStruct, NULL); - - // - // Depth first fashion - // - SetTDLinkPtrDepthorBreadth (TdStruct, TRUE); - - // - // initialize as the last TD in the QH context, - // this field will be updated in the TD linkage process. - // - SetTDLinkPtrValidorInvalid (TdStruct, FALSE); - - // - // Disable Short Packet Detection by default - // - EnableorDisableTDShortPacket (TdStruct, FALSE); - - // - // Max error counter is 3, retry 3 times when error encountered. - // - SetTDControlErrorCounter (TdStruct, 3); - - // - // set device speed attribute - // (TRUE - Slow Device; FALSE - Full Speed Device) - // - switch (DeviceSpeed) { - case USB_SLOW_SPEED_DEVICE: - SetTDLoworFullSpeedDevice (TdStruct, TRUE); - break; - - case USB_FULL_SPEED_DEVICE: - SetTDLoworFullSpeedDevice (TdStruct, FALSE); - break; - } - - // - // Non isochronous transfer TD - // - SetTDControlIsochronousorNot (TdStruct, FALSE); - - // - // Interrupt On Complete bit be set to zero, - // Disable IOC interrupt. - // - SetorClearTDControlIOC (TdStruct, FALSE); - - // - // Set TD Active bit - // - SetTDStatusActiveorInactive (TdStruct, TRUE); - - SetTDTokenMaxLength (TdStruct, RequestLen); - - SetTDTokenDataToggle0 (TdStruct); - - SetTDTokenEndPoint (TdStruct, Endpoint); - - SetTDTokenDeviceAddress (TdStruct, DevAddr); - - SetTDTokenPacketID (TdStruct, SETUP_PACKET_ID); - - TdStruct->PtrTDBuffer = (UINT8 *)DevRequest; - TdStruct->TDBufferLength = RequestLen; - // - // Set the beginning address of the buffer that will be used - // during the transaction. - // - TdStruct->TDData.TDBufferPtr = (UINT32)(UINTN)RequestPhy; - - *PtrTD = TdStruct; - - return EFI_SUCCESS; -} - -/** - Generate Data Stage TD. - - @param UhcDev The UHCI device. - @param DevAddr Device address. - @param Endpoint Endpoint number. - @param PtrData CPU memory address of user data buffer to transfer. - @param DataPhy PCI memory address of user data buffer to transfer. - @param Len Data length. - @param PktID PacketID. - @param Toggle Data toggle value. - @param DeviceSpeed Device Speed. - @param PtrTD TD_STRUCT generated. - - @return EFI_SUCCESS Generate data stage TD successfully. - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. - -**/ -EFI_STATUS -GenDataTD ( - IN USB_UHC_DEV *UhcDev, - IN UINT8 DevAddr, - IN UINT8 Endpoint, - IN UINT8 *PtrData, - IN UINT8 *DataPhy, - IN UINT8 Len, - IN UINT8 PktID, - IN UINT8 Toggle, - IN UINT8 DeviceSpeed, - OUT TD_STRUCT **PtrTD - ) -{ - TD_STRUCT *TdStruct; - EFI_STATUS Status; - - Status = CreateTD (UhcDev, &TdStruct); - if (EFI_ERROR (Status)) { - return Status; - } - - SetTDLinkPtr (TdStruct, NULL); - - // - // Depth first fashion - // - SetTDLinkPtrDepthorBreadth (TdStruct, TRUE); - - // - // Link pointer pointing to TD struct - // - SetTDLinkPtrQHorTDSelect (TdStruct, FALSE); - - // - // initialize as the last TD in the QH context, - // this field will be updated in the TD linkage process. - // - SetTDLinkPtrValidorInvalid (TdStruct, FALSE); - - // - // Disable short packet detect - // - EnableorDisableTDShortPacket (TdStruct, FALSE); - // - // Max error counter is 3 - // - SetTDControlErrorCounter (TdStruct, 3); - - // - // set device speed attribute - // (TRUE - Slow Device; FALSE - Full Speed Device) - // - switch (DeviceSpeed) { - case USB_SLOW_SPEED_DEVICE: - SetTDLoworFullSpeedDevice (TdStruct, TRUE); - break; - - case USB_FULL_SPEED_DEVICE: - SetTDLoworFullSpeedDevice (TdStruct, FALSE); - break; - } - - // - // Non isochronous transfer TD - // - SetTDControlIsochronousorNot (TdStruct, FALSE); - - // - // Disable Interrupt On Complete - // Disable IOC interrupt. - // - SetorClearTDControlIOC (TdStruct, FALSE); - - // - // Set Active bit - // - SetTDStatusActiveorInactive (TdStruct, TRUE); - - SetTDTokenMaxLength (TdStruct, Len); - - if (Toggle != 0) { - SetTDTokenDataToggle1 (TdStruct); - } else { - SetTDTokenDataToggle0 (TdStruct); - } - - SetTDTokenEndPoint (TdStruct, Endpoint); - - SetTDTokenDeviceAddress (TdStruct, DevAddr); - - SetTDTokenPacketID (TdStruct, PktID); - - TdStruct->PtrTDBuffer = (UINT8 *)PtrData; - TdStruct->TDBufferLength = Len; - // - // Set the beginning address of the buffer that will be used - // during the transaction. - // - TdStruct->TDData.TDBufferPtr = (UINT32)(UINTN)DataPhy; - - *PtrTD = TdStruct; - - return EFI_SUCCESS; -} - -/** - Generate Status Stage TD. - - @param UhcDev The UHCI device. - @param DevAddr Device address. - @param Endpoint Endpoint number. - @param PktID PacketID. - @param DeviceSpeed Device Speed. - @param PtrTD TD_STRUCT generated. - - @return EFI_SUCCESS Generate status stage TD successfully. - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. - -**/ -EFI_STATUS -CreateStatusTD ( - IN USB_UHC_DEV *UhcDev, - IN UINT8 DevAddr, - IN UINT8 Endpoint, - IN UINT8 PktID, - IN UINT8 DeviceSpeed, - OUT TD_STRUCT **PtrTD - ) -{ - TD_STRUCT *PtrTDStruct; - EFI_STATUS Status; - - Status = CreateTD (UhcDev, &PtrTDStruct); - if (EFI_ERROR (Status)) { - return Status; - } - - SetTDLinkPtr (PtrTDStruct, NULL); - - // - // Depth first fashion - // - SetTDLinkPtrDepthorBreadth (PtrTDStruct, TRUE); - - // - // initialize as the last TD in the QH context, - // this field will be updated in the TD linkage process. - // - SetTDLinkPtrValidorInvalid (PtrTDStruct, FALSE); - - // - // Disable short packet detect - // - EnableorDisableTDShortPacket (PtrTDStruct, FALSE); - - // - // Max error counter is 3 - // - SetTDControlErrorCounter (PtrTDStruct, 3); - - // - // set device speed attribute - // (TRUE - Slow Device; FALSE - Full Speed Device) - // - switch (DeviceSpeed) { - case USB_SLOW_SPEED_DEVICE: - SetTDLoworFullSpeedDevice (PtrTDStruct, TRUE); - break; - - case USB_FULL_SPEED_DEVICE: - SetTDLoworFullSpeedDevice (PtrTDStruct, FALSE); - break; - } - - // - // Non isochronous transfer TD - // - SetTDControlIsochronousorNot (PtrTDStruct, FALSE); - - // - // Disable Interrupt On Complete - // Disable IOC interrupt. - // - SetorClearTDControlIOC (PtrTDStruct, FALSE); - - // - // Set TD Active bit - // - SetTDStatusActiveorInactive (PtrTDStruct, TRUE); - - SetTDTokenMaxLength (PtrTDStruct, 0); - - SetTDTokenDataToggle1 (PtrTDStruct); - - SetTDTokenEndPoint (PtrTDStruct, Endpoint); - - SetTDTokenDeviceAddress (PtrTDStruct, DevAddr); - - SetTDTokenPacketID (PtrTDStruct, PktID); - - PtrTDStruct->PtrTDBuffer = NULL; - PtrTDStruct->TDBufferLength = 0; - // - // Set the beginning address of the buffer that will be used - // during the transaction. - // - PtrTDStruct->TDData.TDBufferPtr = 0; - - *PtrTD = PtrTDStruct; - - return EFI_SUCCESS; -} - -/** - Set the link pointer validor bit in TD. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param IsValid Specify the linker pointer is valid or not. - -**/ -VOID -SetTDLinkPtrValidorInvalid ( - IN TD_STRUCT *PtrTDStruct, - IN BOOLEAN IsValid - ) -{ - // - // Valid means the link pointer is valid, - // else, it's invalid. - // - PtrTDStruct->TDData.TDLinkPtrTerminate = (IsValid ? 0 : 1); -} - -/** - Set the Link Pointer pointing to a QH or TD. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param IsQH Specify QH or TD is connected. - -**/ -VOID -SetTDLinkPtrQHorTDSelect ( - IN TD_STRUCT *PtrTDStruct, - IN BOOLEAN IsQH - ) -{ - // - // Indicate whether the Link Pointer pointing to a QH or TD - // - PtrTDStruct->TDData.TDLinkPtrQSelect = (IsQH ? 1 : 0); -} - -/** - Set the traverse is depth-first or breadth-first. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param IsDepth Specify the traverse is depth-first or breadth-first. - -**/ -VOID -SetTDLinkPtrDepthorBreadth ( - IN TD_STRUCT *PtrTDStruct, - IN BOOLEAN IsDepth - ) -{ - // - // If TRUE, indicating the host controller should process in depth first fashion, - // else, the host controller should process in breadth first fashion - // - PtrTDStruct->TDData.TDLinkPtrDepthSelect = (IsDepth ? 1 : 0); -} - -/** - Set TD Link Pointer in TD. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param PtrNext Place to the next TD_STRUCT. - -**/ -VOID -SetTDLinkPtr ( - IN TD_STRUCT *PtrTDStruct, - IN VOID *PtrNext - ) -{ - // - // Set TD Link Pointer. Since QH,TD align on 16-byte boundaries, - // only the highest 28 bits are valid. (if take 32bit address as an example) - // - PtrTDStruct->TDData.TDLinkPtr = (UINT32)(UINTN)PtrNext >> 4; -} - -/** - Get TD Link Pointer. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval Get TD Link Pointer in TD. - -**/ -VOID * -GetTDLinkPtr ( - IN TD_STRUCT *PtrTDStruct - ) -{ - // - // Get TD Link Pointer. Restore it back to 32bit - // (if take 32bit address as an example) - // - return (VOID *)(UINTN)((PtrTDStruct->TDData.TDLinkPtr) << 4); -} - -/** - Enable/Disable short packet detection mechanism. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param IsEnable Enable or disable short packet detection mechanism. - -**/ -VOID -EnableorDisableTDShortPacket ( - IN TD_STRUCT *PtrTDStruct, - IN BOOLEAN IsEnable - ) -{ - // - // TRUE means enable short packet detection mechanism. - // - PtrTDStruct->TDData.TDStatusSPD = (IsEnable ? 1 : 0); -} - -/** - Set the max error counter in TD. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param MaxErrors The number of allowable error. - -**/ -VOID -SetTDControlErrorCounter ( - IN TD_STRUCT *PtrTDStruct, - IN UINT8 MaxErrors - ) -{ - // - // valid value of MaxErrors is 0,1,2,3 - // - if (MaxErrors > 3) { - MaxErrors = 3; - } - - PtrTDStruct->TDData.TDStatusErr = MaxErrors; -} - -/** - Set the TD is targeting a low-speed device or not. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param IsLowSpeedDevice Whether The device is low-speed. - -**/ -VOID -SetTDLoworFullSpeedDevice ( - IN TD_STRUCT *PtrTDStruct, - IN BOOLEAN IsLowSpeedDevice - ) -{ - // - // TRUE means the TD is targeting at a Low-speed device - // - PtrTDStruct->TDData.TDStatusLS = (IsLowSpeedDevice ? 1 : 0); -} - -/** - Set the TD is isochronous transfer type or not. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param IsIsochronous Whether the transaction isochronous transfer type. - -**/ -VOID -SetTDControlIsochronousorNot ( - IN TD_STRUCT *PtrTDStruct, - IN BOOLEAN IsIsochronous - ) -{ - // - // TRUE means the TD belongs to Isochronous transfer type. - // - PtrTDStruct->TDData.TDStatusIOS = (IsIsochronous ? 1 : 0); -} - -/** - Set if UCHI should issue an interrupt on completion of the frame - in which this TD is executed - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param IsSet Whether HC should issue an interrupt on completion. - -**/ -VOID -SetorClearTDControlIOC ( - IN TD_STRUCT *PtrTDStruct, - IN BOOLEAN IsSet - ) -{ - // - // If this bit is set, it indicates that the host controller should issue - // an interrupt on completion of the frame in which this TD is executed. - // - PtrTDStruct->TDData.TDStatusIOC = IsSet ? 1 : 0; -} - -/** - Set if the TD is active and can be executed. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param IsActive Whether the TD is active and can be executed. - -**/ -VOID -SetTDStatusActiveorInactive ( - IN TD_STRUCT *PtrTDStruct, - IN BOOLEAN IsActive - ) -{ - // - // If this bit is set, it indicates that the TD is active and can be - // executed. - // - if (IsActive) { - PtrTDStruct->TDData.TDStatus |= 0x80; - } else { - PtrTDStruct->TDData.TDStatus &= 0x7F; - } -} - -/** - Specifies the maximum number of data bytes allowed for the transfer. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param MaxLen The maximum number of data bytes allowed. - - @retval The allowed maximum number of data. -**/ -UINT16 -SetTDTokenMaxLength ( - IN TD_STRUCT *PtrTDStruct, - IN UINT16 MaxLen - ) -{ - // - // Specifies the maximum number of data bytes allowed for the transfer. - // the legal value extent is 0 ~ 0x500. - // - if (MaxLen > 0x500) { - MaxLen = 0x500; - } - - PtrTDStruct->TDData.TDTokenMaxLen = MaxLen - 1; - - return MaxLen; -} - -/** - Set the data toggle bit to DATA1. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - -**/ -VOID -SetTDTokenDataToggle1 ( - IN TD_STRUCT *PtrTDStruct - ) -{ - // - // Set the data toggle bit to DATA1 - // - PtrTDStruct->TDData.TDTokenDataToggle = 1; -} - -/** - Set the data toggle bit to DATA0. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - -**/ -VOID -SetTDTokenDataToggle0 ( - IN TD_STRUCT *PtrTDStruct - ) -{ - // - // Set the data toggle bit to DATA0 - // - PtrTDStruct->TDData.TDTokenDataToggle = 0; -} - -/** - Set EndPoint Number the TD is targeting at. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param EndPoint The Endport number of the target. - -**/ -VOID -SetTDTokenEndPoint ( - IN TD_STRUCT *PtrTDStruct, - IN UINTN EndPoint - ) -{ - // - // Set EndPoint Number the TD is targeting at. - // - PtrTDStruct->TDData.TDTokenEndPt = (UINT8)EndPoint; -} - -/** - Set Device Address the TD is targeting at. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param DevAddr The Device Address of the target. - -**/ -VOID -SetTDTokenDeviceAddress ( - IN TD_STRUCT *PtrTDStruct, - IN UINTN DevAddr - ) -{ - // - // Set Device Address the TD is targeting at. - // - PtrTDStruct->TDData.TDTokenDevAddr = (UINT8)DevAddr; -} - -/** - Set Packet Identification the TD is targeting at. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param PacketID The Packet Identification of the target. - -**/ -VOID -SetTDTokenPacketID ( - IN TD_STRUCT *PtrTDStruct, - IN UINT8 PacketID - ) -{ - // - // Set the Packet Identification to be used for this transaction. - // - PtrTDStruct->TDData.TDTokenPID = PacketID; -} - -/** - Detect whether the TD is active. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval The TD is active or not. - -**/ -BOOLEAN -IsTDStatusActive ( - IN TD_STRUCT *PtrTDStruct - ) -{ - UINT8 TDStatus; - - // - // Detect whether the TD is active. - // - TDStatus = (UINT8)(PtrTDStruct->TDData.TDStatus); - return (BOOLEAN)(TDStatus & 0x80); -} - -/** - Detect whether the TD is stalled. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval The TD is stalled or not. - -**/ -BOOLEAN -IsTDStatusStalled ( - IN TD_STRUCT *PtrTDStruct - ) -{ - UINT8 TDStatus; - - // - // Detect whether the device/endpoint addressed by this TD is stalled. - // - TDStatus = (UINT8)(PtrTDStruct->TDData.TDStatus); - return (BOOLEAN)(TDStatus & 0x40); -} - -/** - Detect whether Data Buffer Error is happened. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval The Data Buffer Error is happened or not. - -**/ -BOOLEAN -IsTDStatusBufferError ( - IN TD_STRUCT *PtrTDStruct - ) -{ - UINT8 TDStatus; - - // - // Detect whether Data Buffer Error is happened. - // - TDStatus = (UINT8)(PtrTDStruct->TDData.TDStatus); - return (BOOLEAN)(TDStatus & 0x20); -} - -/** - Detect whether Babble Error is happened. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval The Babble Error is happened or not. - -**/ -BOOLEAN -IsTDStatusBabbleError ( - IN TD_STRUCT *PtrTDStruct - ) -{ - UINT8 TDStatus; - - // - // Detect whether Babble Error is happened. - // - TDStatus = (UINT8)(PtrTDStruct->TDData.TDStatus); - return (BOOLEAN)(TDStatus & 0x10); -} - -/** - Detect whether NAK is received. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval The NAK is received or not. - -**/ -BOOLEAN -IsTDStatusNAKReceived ( - IN TD_STRUCT *PtrTDStruct - ) -{ - UINT8 TDStatus; - - // - // Detect whether NAK is received. - // - TDStatus = (UINT8)(PtrTDStruct->TDData.TDStatus); - return (BOOLEAN)(TDStatus & 0x08); -} - -/** - Detect whether CRC/Time Out Error is encountered. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval The CRC/Time Out Error is encountered or not. - -**/ -BOOLEAN -IsTDStatusCRCTimeOutError ( - IN TD_STRUCT *PtrTDStruct - ) -{ - UINT8 TDStatus; - - // - // Detect whether CRC/Time Out Error is encountered. - // - TDStatus = (UINT8)(PtrTDStruct->TDData.TDStatus); - return (BOOLEAN)(TDStatus & 0x04); -} - -/** - Detect whether Bitstuff Error is received. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval The Bitstuff Error is received or not. - -**/ -BOOLEAN -IsTDStatusBitStuffError ( - IN TD_STRUCT *PtrTDStruct - ) -{ - UINT8 TDStatus; - - // - // Detect whether Bitstuff Error is received. - // - TDStatus = (UINT8)(PtrTDStruct->TDData.TDStatus); - return (BOOLEAN)(TDStatus & 0x02); -} - -/** - Retrieve the actual number of bytes that were tansferred. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval The actual number of bytes that were tansferred. - -**/ -UINT16 -GetTDStatusActualLength ( - IN TD_STRUCT *PtrTDStruct - ) -{ - // - // Retrieve the actual number of bytes that were tansferred. - // the value is encoded as n-1. so return the decoded value. - // - return (UINT16)((PtrTDStruct->TDData.TDStatusActualLength) + 1); -} - -/** - Retrieve the information of whether the Link Pointer field is valid or not. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval The linker pointer field is valid or not. - -**/ -BOOLEAN -GetTDLinkPtrValidorInvalid ( - IN TD_STRUCT *PtrTDStruct - ) -{ - // - // Retrieve the information of whether the Link Pointer field - // is valid or not. - // - if ((PtrTDStruct->TDData.TDLinkPtrTerminate & BIT0) != 0) { - return FALSE; - } else { - return TRUE; - } -} - -/** - Count TD Number from PtrFirstTD. - - @param PtrFirstTD Place to store TD_STRUCT pointer. - - @retval The queued TDs number. - -**/ -UINTN -CountTDsNumber ( - IN TD_STRUCT *PtrFirstTD - ) -{ - UINTN Number; - TD_STRUCT *Ptr; - - // - // Count the queued TDs number. - // - Number = 0; - Ptr = PtrFirstTD; - while (Ptr != 0) { - Ptr = (TD_STRUCT *)Ptr->PtrNextTD; - Number++; - } - - return Number; -} - -/** - Link TD To QH. - - @param PtrQH Place to store QH_STRUCT pointer. - @param PtrTD Place to store TD_STRUCT pointer. - -**/ -VOID -LinkTDToQH ( - IN QH_STRUCT *PtrQH, - IN TD_STRUCT *PtrTD - ) -{ - if ((PtrQH == NULL) || (PtrTD == NULL)) { - return; - } - - // - // Validate QH Vertical Ptr field - // - SetQHVerticalValidorInvalid (PtrQH, TRUE); - - // - // Vertical Ptr pointing to TD structure - // - SetQHVerticalQHorTDSelect (PtrQH, FALSE); - - SetQHVerticalLinkPtr (PtrQH, (VOID *)PtrTD); - - PtrQH->PtrDown = (VOID *)PtrTD; -} - -/** - Link TD To TD. - - @param PtrPreTD Place to store TD_STRUCT pointer. - @param PtrTD Place to store TD_STRUCT pointer. - -**/ -VOID -LinkTDToTD ( - IN TD_STRUCT *PtrPreTD, - IN TD_STRUCT *PtrTD - ) -{ - if ((PtrPreTD == NULL) || (PtrTD == NULL)) { - return; - } - - // - // Depth first fashion - // - SetTDLinkPtrDepthorBreadth (PtrPreTD, TRUE); - - // - // Link pointer pointing to TD struct - // - SetTDLinkPtrQHorTDSelect (PtrPreTD, FALSE); - - // - // Validate the link pointer valid bit - // - SetTDLinkPtrValidorInvalid (PtrPreTD, TRUE); - - SetTDLinkPtr (PtrPreTD, PtrTD); - - PtrPreTD->PtrNextTD = (VOID *)PtrTD; - - PtrTD->PtrNextTD = NULL; -} - -/** - Execute Control Transfer. - - @param UhcDev The UCHI device. - @param PtrTD A pointer to TD_STRUCT data. - @param ActualLen Actual transfer Length. - @param TimeOut TimeOut value. - @param TransferResult Transfer Result. - - @return EFI_DEVICE_ERROR The transfer failed due to transfer error. - @return EFI_TIMEOUT The transfer failed due to time out. - @return EFI_SUCCESS The transfer finished OK. - -**/ -EFI_STATUS -ExecuteControlTransfer ( - IN USB_UHC_DEV *UhcDev, - IN TD_STRUCT *PtrTD, - OUT UINTN *ActualLen, - IN UINTN TimeOut, - OUT UINT32 *TransferResult - ) -{ - UINTN ErrTDPos; - UINTN Delay; - BOOLEAN InfiniteLoop; - - ErrTDPos = 0; - *TransferResult = EFI_USB_NOERROR; - *ActualLen = 0; - InfiniteLoop = FALSE; - - Delay = TimeOut * STALL_1_MILLI_SECOND; - // - // If Timeout is 0, then the caller must wait for the function to be completed - // until EFI_SUCCESS or EFI_DEVICE_ERROR is returned. - // - if (TimeOut == 0) { - InfiniteLoop = TRUE; - } - - do { - CheckTDsResults (PtrTD, TransferResult, &ErrTDPos, ActualLen); - - // - // TD is inactive, means the control transfer is end. - // - if ((*TransferResult & EFI_USB_ERR_NOTEXECUTE) != EFI_USB_ERR_NOTEXECUTE) { - break; - } - - MicroSecondDelay (STALL_1_MICRO_SECOND); - Delay--; - } while (InfiniteLoop || (Delay != 0)); - - if (*TransferResult != EFI_USB_NOERROR) { - return EFI_DEVICE_ERROR; - } - - return EFI_SUCCESS; -} - -/** - Execute Bulk Transfer. - - @param UhcDev The UCHI device. - @param PtrTD A pointer to TD_STRUCT data. - @param ActualLen Actual transfer Length. - @param DataToggle DataToggle value. - @param TimeOut TimeOut value. - @param TransferResult Transfer Result. - - @return EFI_DEVICE_ERROR The transfer failed due to transfer error. - @return EFI_TIMEOUT The transfer failed due to time out. - @return EFI_SUCCESS The transfer finished OK. - -**/ -EFI_STATUS -ExecBulkTransfer ( - IN USB_UHC_DEV *UhcDev, - IN TD_STRUCT *PtrTD, - IN OUT UINTN *ActualLen, - IN UINT8 *DataToggle, - IN UINTN TimeOut, - OUT UINT32 *TransferResult - ) -{ - UINTN ErrTDPos; - UINTN ScrollNum; - UINTN Delay; - BOOLEAN InfiniteLoop; - - ErrTDPos = 0; - *TransferResult = EFI_USB_NOERROR; - *ActualLen = 0; - InfiniteLoop = FALSE; - - Delay = TimeOut * STALL_1_MILLI_SECOND; - // - // If Timeout is 0, then the caller must wait for the function to be completed - // until EFI_SUCCESS or EFI_DEVICE_ERROR is returned. - // - if (TimeOut == 0) { - InfiniteLoop = TRUE; - } - - do { - CheckTDsResults (PtrTD, TransferResult, &ErrTDPos, ActualLen); - // - // TD is inactive, thus meaning bulk transfer's end. - // - if ((*TransferResult & EFI_USB_ERR_NOTEXECUTE) != EFI_USB_ERR_NOTEXECUTE) { - break; - } - - MicroSecondDelay (STALL_1_MICRO_SECOND); - Delay--; - } while (InfiniteLoop || (Delay != 0)); - - // - // has error - // - if (*TransferResult != EFI_USB_NOERROR) { - // - // scroll the Data Toggle back to the last success TD - // - ScrollNum = CountTDsNumber (PtrTD) - ErrTDPos; - if ((ScrollNum % 2) != 0) { - *DataToggle ^= 1; - } - - // - // If error, wait 100ms to retry by upper layer - // - MicroSecondDelay (100 * 1000); - return EFI_DEVICE_ERROR; - } - - return EFI_SUCCESS; -} - -/** - Delete Queued TDs. - - @param UhcDev The UCHI device. - @param PtrFirstTD Place to store TD_STRUCT pointer. - -**/ -VOID -DeleteQueuedTDs ( - IN USB_UHC_DEV *UhcDev, - IN TD_STRUCT *PtrFirstTD - ) -{ - TD_STRUCT *Tptr1; - - TD_STRUCT *Tptr2; - - Tptr1 = PtrFirstTD; - // - // Delete all the TDs in a queue. - // - while (Tptr1 != NULL) { - Tptr2 = Tptr1; - - if (!GetTDLinkPtrValidorInvalid (Tptr2)) { - Tptr1 = NULL; - } else { - // - // has more than one TD in the queue. - // - Tptr1 = GetTDLinkPtr (Tptr2); - } - - UhcFreePool (UhcDev, (UINT8 *)Tptr2, sizeof (TD_STRUCT)); - } - - return; -} - -/** - Check TDs Results. - - @param PtrTD A pointer to TD_STRUCT data. - @param Result The result to return. - @param ErrTDPos The Error TD position. - @param ActualTransferSize Actual transfer size. - - @retval The TD is executed successfully or not. - -**/ -BOOLEAN -CheckTDsResults ( - IN TD_STRUCT *PtrTD, - OUT UINT32 *Result, - OUT UINTN *ErrTDPos, - OUT UINTN *ActualTransferSize - ) -{ - UINTN Len; - - *Result = EFI_USB_NOERROR; - *ErrTDPos = 0; - - // - // Init to zero. - // - *ActualTransferSize = 0; - - while (PtrTD != NULL) { - if (IsTDStatusActive (PtrTD)) { - *Result |= EFI_USB_ERR_NOTEXECUTE; - } - - if (IsTDStatusStalled (PtrTD)) { - *Result |= EFI_USB_ERR_STALL; - } - - if (IsTDStatusBufferError (PtrTD)) { - *Result |= EFI_USB_ERR_BUFFER; - } - - if (IsTDStatusBabbleError (PtrTD)) { - *Result |= EFI_USB_ERR_BABBLE; - } - - if (IsTDStatusNAKReceived (PtrTD)) { - *Result |= EFI_USB_ERR_NAK; - } - - if (IsTDStatusCRCTimeOutError (PtrTD)) { - *Result |= EFI_USB_ERR_TIMEOUT; - } - - if (IsTDStatusBitStuffError (PtrTD)) { - *Result |= EFI_USB_ERR_BITSTUFF; - } - - // - // Accumulate actual transferred data length in each TD. - // - Len = GetTDStatusActualLength (PtrTD) & 0x7FF; - *ActualTransferSize += Len; - - // - // if any error encountered, stop processing the left TDs. - // - if ((*Result) != 0) { - return FALSE; - } - - PtrTD = (TD_STRUCT *)(PtrTD->PtrNextTD); - // - // Record the first Error TD's position in the queue, - // this value is zero-based. - // - (*ErrTDPos)++; - } - - return TRUE; -} - -/** - Create Memory Block. - - @param UhcDev The UCHI device. - @param MemoryHeader The Pointer to allocated memory block. - @param MemoryBlockSizeInPages The page size of memory block to be allocated. - - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. - @retval EFI_SUCCESS Success. - -**/ -EFI_STATUS -CreateMemoryBlock ( - IN USB_UHC_DEV *UhcDev, - OUT MEMORY_MANAGE_HEADER **MemoryHeader, - IN UINTN MemoryBlockSizeInPages - ) -{ - EFI_STATUS Status; - UINT8 *TempPtr; - UINTN MemPages; - UINT8 *Ptr; - VOID *Mapping; - EFI_PHYSICAL_ADDRESS MappedAddr; - - // - // Memory Block uses MemoryBlockSizeInPages pages, - // memory management header and bit array use 1 page - // - MemPages = MemoryBlockSizeInPages + 1; - Status = IoMmuAllocateBuffer ( - UhcDev->IoMmu, - MemPages, - (VOID **)&TempPtr, - &MappedAddr, - &Mapping - ); - if (EFI_ERROR (Status) || (TempPtr == NULL)) { - return EFI_OUT_OF_RESOURCES; - } - - Ptr = TempPtr; - - ZeroMem (Ptr, MemPages * EFI_PAGE_SIZE); - - *MemoryHeader = (MEMORY_MANAGE_HEADER *)Ptr; - // - // adjust Ptr pointer to the next empty memory - // - Ptr += sizeof (MEMORY_MANAGE_HEADER); - // - // Set Bit Array initial address - // - (*MemoryHeader)->BitArrayPtr = Ptr; - - (*MemoryHeader)->Next = NULL; - - // - // Memory block initial address - // - Ptr = TempPtr; - Ptr += EFI_PAGE_SIZE; - (*MemoryHeader)->MemoryBlockPtr = Ptr; - // - // set Memory block size - // - (*MemoryHeader)->MemoryBlockSizeInBytes = MemoryBlockSizeInPages * EFI_PAGE_SIZE; - // - // each bit in Bit Array will manage 32byte memory in memory block - // - (*MemoryHeader)->BitArraySizeInBytes = ((*MemoryHeader)->MemoryBlockSizeInBytes / 32) / 8; - - return EFI_SUCCESS; -} - -/** - Initialize UHCI memory management. - - @param UhcDev The UCHI device. - - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. - @retval EFI_SUCCESS Success. - -**/ -EFI_STATUS -InitializeMemoryManagement ( - IN USB_UHC_DEV *UhcDev - ) -{ - MEMORY_MANAGE_HEADER *MemoryHeader; - EFI_STATUS Status; - UINTN MemPages; - - MemPages = NORMAL_MEMORY_BLOCK_UNIT_IN_PAGES; - Status = CreateMemoryBlock (UhcDev, &MemoryHeader, MemPages); - if (EFI_ERROR (Status)) { - return Status; - } - - UhcDev->Header1 = MemoryHeader; - - return EFI_SUCCESS; -} - -/** - Initialize UHCI memory management. - - @param UhcDev The UCHI device. - @param Pool Buffer pointer to store the buffer pointer. - @param AllocSize The size of the pool to be allocated. - - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. - @retval EFI_SUCCESS Success. - -**/ -EFI_STATUS -UhcAllocatePool ( - IN USB_UHC_DEV *UhcDev, - OUT UINT8 **Pool, - IN UINTN AllocSize - ) -{ - MEMORY_MANAGE_HEADER *MemoryHeader; - MEMORY_MANAGE_HEADER *TempHeaderPtr; - MEMORY_MANAGE_HEADER *NewMemoryHeader; - UINTN RealAllocSize; - UINTN MemoryBlockSizeInPages; - EFI_STATUS Status; - - *Pool = NULL; - - MemoryHeader = UhcDev->Header1; - - // - // allocate unit is 32 byte (align on 32 byte) - // - if ((AllocSize & 0x1F) != 0) { - RealAllocSize = (AllocSize / 32 + 1) * 32; - } else { - RealAllocSize = AllocSize; - } - - Status = EFI_NOT_FOUND; - for (TempHeaderPtr = MemoryHeader; TempHeaderPtr != NULL; TempHeaderPtr = TempHeaderPtr->Next) { - Status = AllocMemInMemoryBlock ( - TempHeaderPtr, - (VOID **)Pool, - RealAllocSize / 32 - ); - if (!EFI_ERROR (Status)) { - return EFI_SUCCESS; - } - } - - // - // There is no enough memory, - // Create a new Memory Block - // - // - // if pool size is larger than NORMAL_MEMORY_BLOCK_UNIT_IN_PAGES, - // just allocate a large enough memory block. - // - if (RealAllocSize > (NORMAL_MEMORY_BLOCK_UNIT_IN_PAGES * EFI_PAGE_SIZE)) { - MemoryBlockSizeInPages = RealAllocSize / EFI_PAGE_SIZE + 1; - } else { - MemoryBlockSizeInPages = NORMAL_MEMORY_BLOCK_UNIT_IN_PAGES; - } - - Status = CreateMemoryBlock (UhcDev, &NewMemoryHeader, MemoryBlockSizeInPages); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Link the new Memory Block to the Memory Header list - // - InsertMemoryHeaderToList (MemoryHeader, NewMemoryHeader); - - Status = AllocMemInMemoryBlock ( - NewMemoryHeader, - (VOID **)Pool, - RealAllocSize / 32 - ); - return Status; -} - -/** - Alloc Memory In MemoryBlock. - - @param MemoryHeader The pointer to memory manage header. - @param Pool Buffer pointer to store the buffer pointer. - @param NumberOfMemoryUnit The size of the pool to be allocated. - - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. - @retval EFI_SUCCESS Success. - -**/ -EFI_STATUS -AllocMemInMemoryBlock ( - IN MEMORY_MANAGE_HEADER *MemoryHeader, - OUT VOID **Pool, - IN UINTN NumberOfMemoryUnit - ) -{ - UINTN TempBytePos; - UINTN FoundBytePos; - UINT8 Index; - UINT8 FoundBitPos; - UINT8 ByteValue; - UINT8 BitValue; - UINTN NumberOfZeros; - UINTN Count; - - FoundBytePos = 0; - FoundBitPos = 0; - - ByteValue = MemoryHeader->BitArrayPtr[0]; - NumberOfZeros = 0; - Index = 0; - for (TempBytePos = 0; TempBytePos < MemoryHeader->BitArraySizeInBytes;) { - // - // Pop out BitValue from a byte in TempBytePos. - // - BitValue = (UINT8)(ByteValue & 0x1); - - if (BitValue == 0) { - // - // Found a free bit, the NumberOfZeros only record the number of those consecutive zeros - // - NumberOfZeros++; - // - // Found enough consecutive free space, break the loop - // - if (NumberOfZeros >= NumberOfMemoryUnit) { - break; - } - } else { - // - // Encountering a '1', meant the bit is ocupied. - // - if (NumberOfZeros >= NumberOfMemoryUnit) { - // - // Found enough consecutive free space,break the loop - // - break; - } else { - // - // the NumberOfZeros only record the number of those consecutive zeros, - // so reset the NumberOfZeros to 0 when encountering '1' before finding - // enough consecutive '0's - // - NumberOfZeros = 0; - // - // reset the (FoundBytePos,FoundBitPos) to the position of '1' - // - FoundBytePos = TempBytePos; - FoundBitPos = Index; - } - } - - // - // right shift the byte - // - ByteValue /= 2; - - // - // step forward a bit - // - Index++; - if (Index == 8) { - // - // step forward a byte, getting the byte value, - // and reset the bit pos. - // - TempBytePos += 1; - ByteValue = MemoryHeader->BitArrayPtr[TempBytePos]; - Index = 0; - } - } - - if (NumberOfZeros < NumberOfMemoryUnit) { - return EFI_NOT_FOUND; - } - - // - // Found enough free space. - // - // - // The values recorded in (FoundBytePos,FoundBitPos) have two conditions: - // 1)(FoundBytePos,FoundBitPos) record the position - // of the last '1' before the consecutive '0's, it must - // be adjusted to the start position of the consecutive '0's. - // 2)the start address of the consecutive '0's is just the start of - // the bitarray. so no need to adjust the values of (FoundBytePos,FoundBitPos). - // - if ((MemoryHeader->BitArrayPtr[0] & BIT0) != 0) { - FoundBitPos += 1; - } - - // - // Have the (FoundBytePos,FoundBitPos) make sense. - // - if (FoundBitPos > 7) { - FoundBytePos += 1; - FoundBitPos -= 8; - } - - // - // Set the memory as allocated - // - for (TempBytePos = FoundBytePos, Index = FoundBitPos, Count = 0; Count < NumberOfMemoryUnit; Count++) { - MemoryHeader->BitArrayPtr[TempBytePos] = (UINT8)(MemoryHeader->BitArrayPtr[TempBytePos] | (1 << Index)); - Index++; - if (Index == 8) { - TempBytePos += 1; - Index = 0; - } - } - - *Pool = MemoryHeader->MemoryBlockPtr + (FoundBytePos * 8 + FoundBitPos) * 32; - - return EFI_SUCCESS; -} - -/** - Uhci Free Pool. - - @param UhcDev The UHCI device. - @param Pool A pointer to store the buffer address. - @param AllocSize The size of the pool to be freed. - -**/ -VOID -UhcFreePool ( - IN USB_UHC_DEV *UhcDev, - IN UINT8 *Pool, - IN UINTN AllocSize - ) -{ - MEMORY_MANAGE_HEADER *MemoryHeader; - MEMORY_MANAGE_HEADER *TempHeaderPtr; - UINTN StartBytePos; - UINTN Index; - UINT8 StartBitPos; - UINT8 Index2; - UINTN Count; - UINTN RealAllocSize; - - MemoryHeader = UhcDev->Header1; - - // - // allocate unit is 32 byte (align on 32 byte) - // - if ((AllocSize & 0x1F) != 0) { - RealAllocSize = (AllocSize / 32 + 1) * 32; - } else { - RealAllocSize = AllocSize; - } - - for (TempHeaderPtr = MemoryHeader; TempHeaderPtr != NULL; - TempHeaderPtr = TempHeaderPtr->Next) - { - if ((Pool >= TempHeaderPtr->MemoryBlockPtr) && - ((Pool + RealAllocSize) <= (TempHeaderPtr->MemoryBlockPtr + - TempHeaderPtr->MemoryBlockSizeInBytes))) - { - // - // Pool is in the Memory Block area, - // find the start byte and bit in the bit array - // - StartBytePos = ((Pool - TempHeaderPtr->MemoryBlockPtr) / 32) / 8; - StartBitPos = (UINT8)(((Pool - TempHeaderPtr->MemoryBlockPtr) / 32) % 8); - - // - // reset associated bits in bit array - // - for (Index = StartBytePos, Index2 = StartBitPos, Count = 0; Count < (RealAllocSize / 32); Count++) { - TempHeaderPtr->BitArrayPtr[Index] = (UINT8)(TempHeaderPtr->BitArrayPtr[Index] ^ (1 << Index2)); - Index2++; - if (Index2 == 8) { - Index += 1; - Index2 = 0; - } - } - - // - // break the loop - // - break; - } - } -} - -/** - Insert a new memory header into list. - - @param MemoryHeader A pointer to the memory header list. - @param NewMemoryHeader A new memory header to be inserted into the list. - -**/ -VOID -InsertMemoryHeaderToList ( - IN MEMORY_MANAGE_HEADER *MemoryHeader, - IN MEMORY_MANAGE_HEADER *NewMemoryHeader - ) -{ - MEMORY_MANAGE_HEADER *TempHeaderPtr; - - for (TempHeaderPtr = MemoryHeader; TempHeaderPtr != NULL; TempHeaderPtr = TempHeaderPtr->Next) { - if (TempHeaderPtr->Next == NULL) { - TempHeaderPtr->Next = NewMemoryHeader; - break; - } - } -} - -/** - Map address of request structure buffer. - - @param Uhc The UHCI device. - @param Request The user request buffer. - @param MappedAddr Mapped address of request. - @param Map Identificaion of this mapping to return. - - @return EFI_SUCCESS Success. - @return EFI_DEVICE_ERROR Fail to map the user request. - -**/ -EFI_STATUS -UhciMapUserRequest ( - IN USB_UHC_DEV *Uhc, - IN OUT VOID *Request, - OUT UINT8 **MappedAddr, - OUT VOID **Map - ) -{ - EFI_STATUS Status; - UINTN Len; - EFI_PHYSICAL_ADDRESS PhyAddr; - - Len = sizeof (EFI_USB_DEVICE_REQUEST); - Status = IoMmuMap ( - Uhc->IoMmu, - EdkiiIoMmuOperationBusMasterRead, - Request, - &Len, - &PhyAddr, - Map - ); - - if (!EFI_ERROR (Status)) { - *MappedAddr = (UINT8 *)(UINTN)PhyAddr; - } - - return Status; -} - -/** - Map address of user data buffer. - - @param Uhc The UHCI device. - @param Direction Direction of the data transfer. - @param Data The user data buffer. - @param Len Length of the user data. - @param PktId Packet identificaion. - @param MappedAddr Mapped address to return. - @param Map Identificaion of this mapping to return. - - @return EFI_SUCCESS Success. - @return EFI_DEVICE_ERROR Fail to map the user data. - -**/ -EFI_STATUS -UhciMapUserData ( - IN USB_UHC_DEV *Uhc, - IN EFI_USB_DATA_DIRECTION Direction, - IN VOID *Data, - IN OUT UINTN *Len, - OUT UINT8 *PktId, - OUT UINT8 **MappedAddr, - OUT VOID **Map - ) -{ - EFI_STATUS Status; - EFI_PHYSICAL_ADDRESS PhyAddr; - - Status = EFI_SUCCESS; - - switch (Direction) { - case EfiUsbDataIn: - // - // BusMasterWrite means cpu read - // - *PktId = INPUT_PACKET_ID; - Status = IoMmuMap ( - Uhc->IoMmu, - EdkiiIoMmuOperationBusMasterWrite, - Data, - Len, - &PhyAddr, - Map - ); - - if (EFI_ERROR (Status)) { - goto EXIT; - } - - *MappedAddr = (UINT8 *)(UINTN)PhyAddr; - break; - - case EfiUsbDataOut: - *PktId = OUTPUT_PACKET_ID; - Status = IoMmuMap ( - Uhc->IoMmu, - EdkiiIoMmuOperationBusMasterRead, - Data, - Len, - &PhyAddr, - Map - ); - - if (EFI_ERROR (Status)) { - goto EXIT; - } - - *MappedAddr = (UINT8 *)(UINTN)PhyAddr; - break; - - case EfiUsbNoData: - if ((Len != NULL) && (*Len != 0)) { - Status = EFI_INVALID_PARAMETER; - goto EXIT; - } - - *PktId = OUTPUT_PACKET_ID; - *MappedAddr = NULL; - *Map = NULL; - break; - - default: - Status = EFI_INVALID_PARAMETER; - } - -EXIT: - return Status; -} diff --git a/MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.h b/MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.h deleted file mode 100644 index 5b135f2558fd..000000000000 --- a/MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.h +++ /dev/null @@ -1,1383 +0,0 @@ -/** @file -Private Header file for Usb Host Controller PEIM - -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
- -SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#ifndef _RECOVERY_UHC_H_ -#define _RECOVERY_UHC_H_ - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#define USB_SLOW_SPEED_DEVICE 0x01 -#define USB_FULL_SPEED_DEVICE 0x02 - -// -// One memory block uses 16 page -// -#define NORMAL_MEMORY_BLOCK_UNIT_IN_PAGES 16 - -#define USBCMD 0 /* Command Register Offset 00-01h */ -#define USBCMD_RS BIT0 /* Run/Stop */ -#define USBCMD_HCRESET BIT1 /* Host reset */ -#define USBCMD_GRESET BIT2 /* Global reset */ -#define USBCMD_EGSM BIT3 /* Global Suspend Mode */ -#define USBCMD_FGR BIT4 /* Force Global Resume */ -#define USBCMD_SWDBG BIT5 /* SW Debug mode */ -#define USBCMD_CF BIT6 /* Config Flag (sw only) */ -#define USBCMD_MAXP BIT7 /* Max Packet (0 = 32, 1 = 64) */ - -/* Status register */ -#define USBSTS 2 /* Status Register Offset 02-03h */ -#define USBSTS_USBINT BIT0 /* Interrupt due to IOC */ -#define USBSTS_ERROR BIT1 /* Interrupt due to error */ -#define USBSTS_RD BIT2 /* Resume Detect */ -#define USBSTS_HSE BIT3 /* Host System Error - basically PCI problems */ -#define USBSTS_HCPE BIT4 /* Host Controller Process Error - the scripts were buggy */ -#define USBSTS_HCH BIT5 /* HC Halted */ - -/* Interrupt enable register */ -#define USBINTR 4 /* Interrupt Enable Register 04-05h */ -#define USBINTR_TIMEOUT BIT0 /* Timeout/CRC error enable */ -#define USBINTR_RESUME BIT1 /* Resume interrupt enable */ -#define USBINTR_IOC BIT2 /* Interrupt On Complete enable */ -#define USBINTR_SP BIT3 /* Short packet interrupt enable */ - -/* Frame Number Register Offset 06-08h */ -#define USBFRNUM 6 - -/* Frame List Base Address Register Offset 08-0Bh */ -#define USBFLBASEADD 8 - -/* Start of Frame Modify Register Offset 0Ch */ -#define USBSOF 0x0c - -/* USB port status and control registers */ -#define USBPORTSC1 0x10 /*Port 1 offset 10-11h */ -#define USBPORTSC2 0x12 /*Port 2 offset 12-13h */ - -#define USBPORTSC_CCS BIT0 /* Current Connect Status ("device present") */ -#define USBPORTSC_CSC BIT1 /* Connect Status Change */ -#define USBPORTSC_PED BIT2 /* Port Enable / Disable */ -#define USBPORTSC_PEDC BIT3 /* Port Enable / Disable Change */ -#define USBPORTSC_LSL BIT4 /* Line Status Low bit*/ -#define USBPORTSC_LSH BIT5 /* Line Status High bit*/ -#define USBPORTSC_RD BIT6 /* Resume Detect */ -#define USBPORTSC_LSDA BIT8 /* Low Speed Device Attached */ -#define USBPORTSC_PR BIT9 /* Port Reset */ -#define USBPORTSC_SUSP BIT12 /* Suspend */ - -#define SETUP_PACKET_ID 0x2D -#define INPUT_PACKET_ID 0x69 -#define OUTPUT_PACKET_ID 0xE1 -#define ERROR_PACKET_ID 0x55 - -#define STALL_1_MICRO_SECOND 1 -#define STALL_1_MILLI_SECOND 1000 - -#pragma pack(1) - -typedef struct { - UINT32 FrameListPtrTerminate : 1; - UINT32 FrameListPtrQSelect : 1; - UINT32 FrameListRsvd : 2; - UINT32 FrameListPtr : 28; -} FRAMELIST_ENTRY; - -typedef struct { - UINT32 QHHorizontalTerminate : 1; - UINT32 QHHorizontalQSelect : 1; - UINT32 QHHorizontalRsvd : 2; - UINT32 QHHorizontalPtr : 28; - UINT32 QHVerticalTerminate : 1; - UINT32 QHVerticalQSelect : 1; - UINT32 QHVerticalRsvd : 2; - UINT32 QHVerticalPtr : 28; -} QUEUE_HEAD; - -typedef struct { - QUEUE_HEAD QueueHead; - UINT32 Reserved1; - UINT32 Reserved2; - VOID *PtrNext; - VOID *PtrDown; - VOID *Reserved3; - UINT32 Reserved4; -} QH_STRUCT; - -typedef struct { - UINT32 TDLinkPtrTerminate : 1; - UINT32 TDLinkPtrQSelect : 1; - UINT32 TDLinkPtrDepthSelect : 1; - UINT32 TDLinkPtrRsvd : 1; - UINT32 TDLinkPtr : 28; - UINT32 TDStatusActualLength : 11; - UINT32 TDStatusRsvd : 5; - UINT32 TDStatus : 8; - UINT32 TDStatusIOC : 1; - UINT32 TDStatusIOS : 1; - UINT32 TDStatusLS : 1; - UINT32 TDStatusErr : 2; - UINT32 TDStatusSPD : 1; - UINT32 TDStatusRsvd2 : 2; - UINT32 TDTokenPID : 8; - UINT32 TDTokenDevAddr : 7; - UINT32 TDTokenEndPt : 4; - UINT32 TDTokenDataToggle : 1; - UINT32 TDTokenRsvd : 1; - UINT32 TDTokenMaxLen : 11; - UINT32 TDBufferPtr; -} TD; - -typedef struct { - TD TDData; - UINT8 *PtrTDBuffer; - VOID *PtrNextTD; - VOID *PtrNextQH; - UINT16 TDBufferLength; - UINT16 Reserved; -} TD_STRUCT; - -#pragma pack() - -typedef struct _MEMORY_MANAGE_HEADER MEMORY_MANAGE_HEADER; - -struct _MEMORY_MANAGE_HEADER { - UINT8 *BitArrayPtr; - UINTN BitArraySizeInBytes; - UINT8 *MemoryBlockPtr; - UINTN MemoryBlockSizeInBytes; - MEMORY_MANAGE_HEADER *Next; -}; - -#define USB_UHC_DEV_SIGNATURE SIGNATURE_32 ('p', 'u', 'h', 'c') -typedef struct { - UINTN Signature; - PEI_USB_HOST_CONTROLLER_PPI UsbHostControllerPpi; - EDKII_IOMMU_PPI *IoMmu; - EFI_PEI_PPI_DESCRIPTOR PpiDescriptor; - // - // EndOfPei callback is used to stop the UHC DMA operation - // after exit PEI phase. - // - EFI_PEI_NOTIFY_DESCRIPTOR EndOfPeiNotifyList; - - UINT32 UsbHostControllerBaseAddress; - FRAMELIST_ENTRY *FrameListEntry; - QH_STRUCT *ConfigQH; - QH_STRUCT *BulkQH; - // - // Header1 used for QH,TD memory blocks management - // - MEMORY_MANAGE_HEADER *Header1; -} USB_UHC_DEV; - -#define PEI_RECOVERY_USB_UHC_DEV_FROM_UHCI_THIS(a) CR (a, USB_UHC_DEV, UsbHostControllerPpi, USB_UHC_DEV_SIGNATURE) -#define PEI_RECOVERY_USB_UHC_DEV_FROM_THIS_NOTIFY(a) CR (a, USB_UHC_DEV, EndOfPeiNotifyList, USB_UHC_DEV_SIGNATURE) - -/** - Submits control transfer to a target USB device. - - @param PeiServices The pointer of EFI_PEI_SERVICES. - @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI. - @param DeviceAddress The target device address. - @param DeviceSpeed Target device speed. - @param MaximumPacketLength Maximum packet size the default control transfer - endpoint is capable of sending or receiving. - @param Request USB device request to send. - @param TransferDirection Specifies the data direction for the data stage. - @param Data Data buffer to be transmitted or received from USB device. - @param DataLength The size (in bytes) of the data buffer. - @param TimeOut Indicates the maximum timeout, in millisecond. - @param TransferResult Return the result of this control transfer. - - @retval EFI_SUCCESS Transfer was completed successfully. - @retval EFI_OUT_OF_RESOURCES The transfer failed due to lack of resources. - @retval EFI_INVALID_PARAMETER Some parameters are invalid. - @retval EFI_TIMEOUT Transfer failed due to timeout. - @retval EFI_DEVICE_ERROR Transfer failed due to host controller or device error. - -**/ -EFI_STATUS -EFIAPI -UhcControlTransfer ( - IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *This, - IN UINT8 DeviceAddress, - IN UINT8 DeviceSpeed, - IN UINT8 MaximumPacketLength, - IN EFI_USB_DEVICE_REQUEST *Request, - IN EFI_USB_DATA_DIRECTION TransferDirection, - IN OUT VOID *Data OPTIONAL, - IN OUT UINTN *DataLength OPTIONAL, - IN UINTN TimeOut, - OUT UINT32 *TransferResult - ); - -/** - Submits bulk transfer to a bulk endpoint of a USB device. - - @param PeiServices The pointer of EFI_PEI_SERVICES. - @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI. - @param DeviceAddress Target device address. - @param EndPointAddress Endpoint number and its direction in bit 7. - @param MaximumPacketLength Maximum packet size the endpoint is capable of - sending or receiving. - @param Data Array of pointers to the buffers of data to transmit - from or receive into. - @param DataLength The lenght of the data buffer. - @param DataToggle On input, the initial data toggle for the transfer; - On output, it is updated to to next data toggle to use of - the subsequent bulk transfer. - @param TimeOut Indicates the maximum time, in millisecond, which the - transfer is allowed to complete. - @param TransferResult A pointer to the detailed result information of the - bulk transfer. - - @retval EFI_SUCCESS The transfer was completed successfully. - @retval EFI_OUT_OF_RESOURCES The transfer failed due to lack of resource. - @retval EFI_INVALID_PARAMETER Parameters are invalid. - @retval EFI_TIMEOUT The transfer failed due to timeout. - @retval EFI_DEVICE_ERROR The transfer failed due to host controller error. - -**/ -EFI_STATUS -EFIAPI -UhcBulkTransfer ( - IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *This, - IN UINT8 DeviceAddress, - IN UINT8 EndPointAddress, - IN UINT8 MaximumPacketLength, - IN OUT VOID *Data, - IN OUT UINTN *DataLength, - IN OUT UINT8 *DataToggle, - IN UINTN TimeOut, - OUT UINT32 *TransferResult - ); - -/** - Retrieves the number of root hub ports. - - @param[in] PeiServices The pointer to the PEI Services Table. - @param[in] This The pointer to this instance of the - PEI_USB_HOST_CONTROLLER_PPI. - @param[out] PortNumber The pointer to the number of the root hub ports. - - @retval EFI_SUCCESS The port number was retrieved successfully. - @retval EFI_INVALID_PARAMETER PortNumber is NULL. - -**/ -EFI_STATUS -EFIAPI -UhcGetRootHubPortNumber ( - IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *This, - OUT UINT8 *PortNumber - ); - -/** - Retrieves the current status of a USB root hub port. - - @param PeiServices The pointer of EFI_PEI_SERVICES. - @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI. - @param PortNumber The root hub port to retrieve the state from. - @param PortStatus Variable to receive the port state. - - @retval EFI_SUCCESS The status of the USB root hub port specified. - by PortNumber was returned in PortStatus. - @retval EFI_INVALID_PARAMETER PortNumber is invalid. - -**/ -EFI_STATUS -EFIAPI -UhcGetRootHubPortStatus ( - IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *This, - IN UINT8 PortNumber, - OUT EFI_USB_PORT_STATUS *PortStatus - ); - -/** - Sets a feature for the specified root hub port. - - @param PeiServices The pointer of EFI_PEI_SERVICES - @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI - @param PortNumber Root hub port to set. - @param PortFeature Feature to set. - - @retval EFI_SUCCESS The feature specified by PortFeature was set. - @retval EFI_INVALID_PARAMETER PortNumber is invalid or PortFeature is invalid. - @retval EFI_TIMEOUT The time out occurred. - -**/ -EFI_STATUS -EFIAPI -UhcSetRootHubPortFeature ( - IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *This, - IN UINT8 PortNumber, - IN EFI_USB_PORT_FEATURE PortFeature - ); - -/** - Clears a feature for the specified root hub port. - - @param PeiServices The pointer of EFI_PEI_SERVICES. - @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI. - @param PortNumber Specifies the root hub port whose feature - is requested to be cleared. - @param PortFeature Indicates the feature selector associated with the - feature clear request. - - @retval EFI_SUCCESS The feature specified by PortFeature was cleared - for the USB root hub port specified by PortNumber. - @retval EFI_INVALID_PARAMETER PortNumber is invalid or PortFeature is invalid. - -**/ -EFI_STATUS -EFIAPI -UhcClearRootHubPortFeature ( - IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *This, - IN UINT8 PortNumber, - IN EFI_USB_PORT_FEATURE PortFeature - ); - -/** - Initialize UHCI. - - @param UhcDev UHCI Device. - - @retval EFI_SUCCESS UHCI successfully initialized. - @retval EFI_OUT_OF_RESOURCES Resource can not be allocated. - -**/ -EFI_STATUS -InitializeUsbHC ( - IN USB_UHC_DEV *UhcDev - ); - -/** - Create Frame List Structure. - - @param UhcDev UHCI device. - - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. - @retval EFI_SUCCESS Success. - -**/ -EFI_STATUS -CreateFrameList ( - USB_UHC_DEV *UhcDev - ); - -/** - Read a 16bit width data from Uhc HC IO space register. - - @param UhcDev The UHCI device. - @param Port The IO space address of the register. - - @retval the register content read. - -**/ -UINT16 -USBReadPortW ( - IN USB_UHC_DEV *UhcDev, - IN UINT32 Port - ); - -/** - Write a 16bit width data into Uhc HC IO space register. - - @param UhcDev The UHCI device. - @param Port The IO space address of the register. - @param Data The data written into the register. - -**/ -VOID -USBWritePortW ( - IN USB_UHC_DEV *UhcDev, - IN UINT32 Port, - IN UINT16 Data - ); - -/** - Write a 32bit width data into Uhc HC IO space register. - - @param UhcDev The UHCI device. - @param Port The IO space address of the register. - @param Data The data written into the register. - -**/ -VOID -USBWritePortDW ( - IN USB_UHC_DEV *UhcDev, - IN UINT32 Port, - IN UINT32 Data - ); - -/** - Clear the content of UHCI's Status Register. - - @param UhcDev The UHCI device. - @param StatusAddr The IO space address of the register. - -**/ -VOID -ClearStatusReg ( - IN USB_UHC_DEV *UhcDev, - IN UINT32 StatusAddr - ); - -/** - Check whether the host controller operates well. - - @param UhcDev The UHCI device. - @param StatusRegAddr The io address of status register. - - @retval TRUE Host controller is working. - @retval FALSE Host controller is halted or system error. - -**/ -BOOLEAN -IsStatusOK ( - IN USB_UHC_DEV *UhcDev, - IN UINT32 StatusRegAddr - ); - -/** - Set Frame List Base Address. - - @param UhcDev The UHCI device. - @param FrameListRegAddr The address of frame list register. - @param Addr The address of frame list table. - -**/ -VOID -SetFrameListBaseAddress ( - IN USB_UHC_DEV *UhcDev, - IN UINT32 FrameListRegAddr, - IN UINT32 Addr - ); - -/** - Create QH and initialize. - - @param UhcDev The UHCI device. - @param PtrQH Place to store QH_STRUCT pointer. - - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. - @retval EFI_SUCCESS Success. - -**/ -EFI_STATUS -CreateQH ( - IN USB_UHC_DEV *UhcDev, - OUT QH_STRUCT **PtrQH - ); - -/** - Set the horizontal link pointer in QH. - - @param PtrQH Place to store QH_STRUCT pointer. - @param PtrNext Place to the next QH_STRUCT. - -**/ -VOID -SetQHHorizontalLinkPtr ( - IN QH_STRUCT *PtrQH, - IN VOID *PtrNext - ); - -/** - Set a QH or TD horizontally to be connected with a specific QH. - - @param PtrQH Place to store QH_STRUCT pointer. - @param IsQH Specify QH or TD is connected. - -**/ -VOID -SetQHHorizontalQHorTDSelect ( - IN QH_STRUCT *PtrQH, - IN BOOLEAN IsQH - ); - -/** - Set the horizontal validor bit in QH. - - @param PtrQH Place to store QH_STRUCT pointer. - @param IsValid Specify the horizontal linker is valid or not. - -**/ -VOID -SetQHHorizontalValidorInvalid ( - IN QH_STRUCT *PtrQH, - IN BOOLEAN IsValid - ); - -/** - Set the vertical link pointer in QH. - - @param PtrQH Place to store QH_STRUCT pointer. - @param PtrNext Place to the next QH_STRUCT. - -**/ -VOID -SetQHVerticalLinkPtr ( - IN QH_STRUCT *PtrQH, - IN VOID *PtrNext - ); - -/** - Set a QH or TD vertically to be connected with a specific QH. - - @param PtrQH Place to store QH_STRUCT pointer. - @param IsQH Specify QH or TD is connected. - -**/ -VOID -SetQHVerticalQHorTDSelect ( - IN QH_STRUCT *PtrQH, - IN BOOLEAN IsQH - ); - -/** - Set the vertical validor bit in QH. - - @param PtrQH Place to store QH_STRUCT pointer. - @param IsValid Specify the vertical linker is valid or not. - -**/ -VOID -SetQHVerticalValidorInvalid ( - IN QH_STRUCT *PtrQH, - IN BOOLEAN IsValid - ); - -/** - Allocate TD or QH Struct. - - @param UhcDev The UHCI device. - @param Size The size of allocation. - @param PtrStruct Place to store TD_STRUCT pointer. - - @return EFI_SUCCESS Allocate successfully. - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. - -**/ -EFI_STATUS -AllocateTDorQHStruct ( - IN USB_UHC_DEV *UhcDev, - IN UINT32 Size, - OUT VOID **PtrStruct - ); - -/** - Create a TD Struct. - - @param UhcDev The UHCI device. - @param PtrTD Place to store TD_STRUCT pointer. - - @return EFI_SUCCESS Allocate successfully. - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. - -**/ -EFI_STATUS -CreateTD ( - IN USB_UHC_DEV *UhcDev, - OUT TD_STRUCT **PtrTD - ); - -/** - Generate Setup Stage TD. - - @param UhcDev The UHCI device. - @param DevAddr Device address. - @param Endpoint Endpoint number. - @param DeviceSpeed Device Speed. - @param DevRequest CPU memory address of request structure buffer to transfer. - @param RequestPhy PCI memory address of request structure buffer to transfer. - @param RequestLen Request length. - @param PtrTD TD_STRUCT generated. - - @return EFI_SUCCESS Generate setup stage TD successfully. - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. - -**/ -EFI_STATUS -GenSetupStageTD ( - IN USB_UHC_DEV *UhcDev, - IN UINT8 DevAddr, - IN UINT8 Endpoint, - IN UINT8 DeviceSpeed, - IN UINT8 *DevRequest, - IN UINT8 *RequestPhy, - IN UINT8 RequestLen, - OUT TD_STRUCT **PtrTD - ); - -/** - Generate Data Stage TD. - - @param UhcDev The UHCI device. - @param DevAddr Device address. - @param Endpoint Endpoint number. - @param PtrData CPU memory address of user data buffer to transfer. - @param DataPhy PCI memory address of user data buffer to transfer. - @param Len Data length. - @param PktID PacketID. - @param Toggle Data toggle value. - @param DeviceSpeed Device Speed. - @param PtrTD TD_STRUCT generated. - - @return EFI_SUCCESS Generate data stage TD successfully. - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. - -**/ -EFI_STATUS -GenDataTD ( - IN USB_UHC_DEV *UhcDev, - IN UINT8 DevAddr, - IN UINT8 Endpoint, - IN UINT8 *PtrData, - IN UINT8 *DataPhy, - IN UINT8 Len, - IN UINT8 PktID, - IN UINT8 Toggle, - IN UINT8 DeviceSpeed, - OUT TD_STRUCT **PtrTD - ); - -/** - Generate Status Stage TD. - - @param UhcDev The UHCI device. - @param DevAddr Device address. - @param Endpoint Endpoint number. - @param PktID PacketID. - @param DeviceSpeed Device Speed. - @param PtrTD TD_STRUCT generated. - - @return EFI_SUCCESS Generate status stage TD successfully. - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. - -**/ -EFI_STATUS -CreateStatusTD ( - IN USB_UHC_DEV *UhcDev, - IN UINT8 DevAddr, - IN UINT8 Endpoint, - IN UINT8 PktID, - IN UINT8 DeviceSpeed, - OUT TD_STRUCT **PtrTD - ); - -/** - Set the link pointer validor bit in TD. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param IsValid Specify the linker pointer is valid or not. - -**/ -VOID -SetTDLinkPtrValidorInvalid ( - IN TD_STRUCT *PtrTDStruct, - IN BOOLEAN IsValid - ); - -/** - Set the Link Pointer pointing to a QH or TD. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param IsQH Specify QH or TD is connected. - -**/ -VOID -SetTDLinkPtrQHorTDSelect ( - IN TD_STRUCT *PtrTDStruct, - IN BOOLEAN IsQH - ); - -/** - Set the traverse is depth-first or breadth-first. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param IsDepth Specify the traverse is depth-first or breadth-first. - -**/ -VOID -SetTDLinkPtrDepthorBreadth ( - IN TD_STRUCT *PtrTDStruct, - IN BOOLEAN IsDepth - ); - -/** - Set TD Link Pointer in TD. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param PtrNext Place to the next TD_STRUCT. - -**/ -VOID -SetTDLinkPtr ( - IN TD_STRUCT *PtrTDStruct, - IN VOID *PtrNext - ); - -/** - Get TD Link Pointer. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval Get TD Link Pointer in TD. - -**/ -VOID * -GetTDLinkPtr ( - IN TD_STRUCT *PtrTDStruct - ); - -/** - Enable/Disable short packet detection mechanism. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param IsEnable Enable or disable short packet detection mechanism. - -**/ -VOID -EnableorDisableTDShortPacket ( - IN TD_STRUCT *PtrTDStruct, - IN BOOLEAN IsEnable - ); - -/** - Set the max error counter in TD. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param MaxErrors The number of allowable error. - -**/ -VOID -SetTDControlErrorCounter ( - IN TD_STRUCT *PtrTDStruct, - IN UINT8 MaxErrors - ); - -/** - Set the TD is targeting a low-speed device or not. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param IsLowSpeedDevice Whether The device is low-speed. - -**/ -VOID -SetTDLoworFullSpeedDevice ( - IN TD_STRUCT *PtrTDStruct, - IN BOOLEAN IsLowSpeedDevice - ); - -/** - Set the TD is isochronous transfer type or not. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param IsIsochronous Whether the transaction isochronous transfer type. - -**/ -VOID -SetTDControlIsochronousorNot ( - IN TD_STRUCT *PtrTDStruct, - IN BOOLEAN IsIsochronous - ); - -/** - Set if UCHI should issue an interrupt on completion of the frame - in which this TD is executed - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param IsSet Whether HC should issue an interrupt on completion. - -**/ -VOID -SetorClearTDControlIOC ( - IN TD_STRUCT *PtrTDStruct, - IN BOOLEAN IsSet - ); - -/** - Set if the TD is active and can be executed. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param IsActive Whether the TD is active and can be executed. - -**/ -VOID -SetTDStatusActiveorInactive ( - IN TD_STRUCT *PtrTDStruct, - IN BOOLEAN IsActive - ); - -/** - Specifies the maximum number of data bytes allowed for the transfer. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param MaxLen The maximum number of data bytes allowed. - - @retval The allowed maximum number of data. -**/ -UINT16 -SetTDTokenMaxLength ( - IN TD_STRUCT *PtrTDStruct, - IN UINT16 MaxLen - ); - -/** - Set the data toggle bit to DATA1. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - -**/ -VOID -SetTDTokenDataToggle1 ( - IN TD_STRUCT *PtrTDStruct - ); - -/** - Set the data toggle bit to DATA0. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - -**/ -VOID -SetTDTokenDataToggle0 ( - IN TD_STRUCT *PtrTDStruct - ); - -/** - Set EndPoint Number the TD is targeting at. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param EndPoint The Endport number of the target. - -**/ -VOID -SetTDTokenEndPoint ( - IN TD_STRUCT *PtrTDStruct, - IN UINTN EndPoint - ); - -/** - Set Device Address the TD is targeting at. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param DevAddr The Device Address of the target. - -**/ -VOID -SetTDTokenDeviceAddress ( - IN TD_STRUCT *PtrTDStruct, - IN UINTN DevAddr - ); - -/** - Set Packet Identification the TD is targeting at. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - @param PacketID The Packet Identification of the target. - -**/ -VOID -SetTDTokenPacketID ( - IN TD_STRUCT *PtrTDStruct, - IN UINT8 PacketID - ); - -/** - Set the beginning address of the data buffer that will be used - during the transaction. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - -**/ -VOID -SetTDDataBuffer ( - IN TD_STRUCT *PtrTDStruct - ); - -/** - Detect whether the TD is active. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval The TD is active or not. - -**/ -BOOLEAN -IsTDStatusActive ( - IN TD_STRUCT *PtrTDStruct - ); - -/** - Detect whether the TD is stalled. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval The TD is stalled or not. - -**/ -BOOLEAN -IsTDStatusStalled ( - IN TD_STRUCT *PtrTDStruct - ); - -/** - Detect whether Data Buffer Error is happened. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval The Data Buffer Error is happened or not. - -**/ -BOOLEAN -IsTDStatusBufferError ( - IN TD_STRUCT *PtrTDStruct - ); - -/** - Detect whether Babble Error is happened. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval The Babble Error is happened or not. - -**/ -BOOLEAN -IsTDStatusBabbleError ( - IN TD_STRUCT *PtrTDStruct - ); - -/** - Detect whether NAK is received. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval The NAK is received or not. - -**/ -BOOLEAN -IsTDStatusNAKReceived ( - IN TD_STRUCT *PtrTDStruct - ); - -/** - Detect whether CRC/Time Out Error is encountered. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval The CRC/Time Out Error is encountered or not. - -**/ -BOOLEAN -IsTDStatusCRCTimeOutError ( - IN TD_STRUCT *PtrTDStruct - ); - -/** - Detect whether Bitstuff Error is received. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval The Bitstuff Error is received or not. - -**/ -BOOLEAN -IsTDStatusBitStuffError ( - IN TD_STRUCT *PtrTDStruct - ); - -/** - Retrieve the actual number of bytes that were tansferred. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval The actual number of bytes that were tansferred. - -**/ -UINT16 -GetTDStatusActualLength ( - IN TD_STRUCT *PtrTDStruct - ); - -/** - Retrieve the information of whether the Link Pointer field is valid or not. - - @param PtrTDStruct Place to store TD_STRUCT pointer. - - @retval The linker pointer field is valid or not. - -**/ -BOOLEAN -GetTDLinkPtrValidorInvalid ( - IN TD_STRUCT *PtrTDStruct - ); - -/** - Count TD Number from PtrFirstTD. - - @param PtrFirstTD Place to store TD_STRUCT pointer. - - @retval The queued TDs number. - -**/ -UINTN -CountTDsNumber ( - IN TD_STRUCT *PtrFirstTD - ); - -/** - Link TD To QH. - - @param PtrQH Place to store QH_STRUCT pointer. - @param PtrTD Place to store TD_STRUCT pointer. - -**/ -VOID -LinkTDToQH ( - IN QH_STRUCT *PtrQH, - IN TD_STRUCT *PtrTD - ); - -/** - Link TD To TD. - - @param PtrPreTD Place to store TD_STRUCT pointer. - @param PtrTD Place to store TD_STRUCT pointer. - -**/ -VOID -LinkTDToTD ( - IN TD_STRUCT *PtrPreTD, - IN TD_STRUCT *PtrTD - ); - -/** - Execute Control Transfer. - - @param UhcDev The UCHI device. - @param PtrTD A pointer to TD_STRUCT data. - @param ActualLen Actual transfer Length. - @param TimeOut TimeOut value. - @param TransferResult Transfer Result. - - @return EFI_DEVICE_ERROR The transfer failed due to transfer error. - @return EFI_TIMEOUT The transfer failed due to time out. - @return EFI_SUCCESS The transfer finished OK. - -**/ -EFI_STATUS -ExecuteControlTransfer ( - IN USB_UHC_DEV *UhcDev, - IN TD_STRUCT *PtrTD, - OUT UINTN *ActualLen, - IN UINTN TimeOut, - OUT UINT32 *TransferResult - ); - -/** - Execute Bulk Transfer. - - @param UhcDev The UCHI device. - @param PtrTD A pointer to TD_STRUCT data. - @param ActualLen Actual transfer Length. - @param DataToggle DataToggle value. - @param TimeOut TimeOut value. - @param TransferResult Transfer Result. - - @return EFI_DEVICE_ERROR The transfer failed due to transfer error. - @return EFI_TIMEOUT The transfer failed due to time out. - @return EFI_SUCCESS The transfer finished OK. - -**/ -EFI_STATUS -ExecBulkTransfer ( - IN USB_UHC_DEV *UhcDev, - IN TD_STRUCT *PtrTD, - IN OUT UINTN *ActualLen, - IN UINT8 *DataToggle, - IN UINTN TimeOut, - OUT UINT32 *TransferResult - ); - -/** - Delete Queued TDs. - - @param UhcDev The UCHI device. - @param PtrFirstTD Place to store TD_STRUCT pointer. - -**/ -VOID -DeleteQueuedTDs ( - IN USB_UHC_DEV *UhcDev, - IN TD_STRUCT *PtrFirstTD - ); - -/** - Check TDs Results. - - @param PtrTD A pointer to TD_STRUCT data. - @param Result The result to return. - @param ErrTDPos The Error TD position. - @param ActualTransferSize Actual transfer size. - - @retval The TD is executed successfully or not. - -**/ -BOOLEAN -CheckTDsResults ( - IN TD_STRUCT *PtrTD, - OUT UINT32 *Result, - OUT UINTN *ErrTDPos, - OUT UINTN *ActualTransferSize - ); - -/** - Create Memory Block. - - @param UhcDev The UCHI device. - @param MemoryHeader The Pointer to allocated memory block. - @param MemoryBlockSizeInPages The page size of memory block to be allocated. - - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. - @retval EFI_SUCCESS Success. - -**/ -EFI_STATUS -CreateMemoryBlock ( - IN USB_UHC_DEV *UhcDev, - OUT MEMORY_MANAGE_HEADER **MemoryHeader, - IN UINTN MemoryBlockSizeInPages - ); - -/** - Initialize UHCI memory management. - - @param UhcDev The UCHI device. - - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. - @retval EFI_SUCCESS Success. - -**/ -EFI_STATUS -InitializeMemoryManagement ( - IN USB_UHC_DEV *UhcDev - ); - -/** - Initialize UHCI memory management. - - @param UhcDev The UCHI device. - @param Pool Buffer pointer to store the buffer pointer. - @param AllocSize The size of the pool to be allocated. - - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. - @retval EFI_SUCCESS Success. - -**/ -EFI_STATUS -UhcAllocatePool ( - IN USB_UHC_DEV *UhcDev, - OUT UINT8 **Pool, - IN UINTN AllocSize - ); - -/** - Alloc Memory In MemoryBlock. - - @param MemoryHeader The pointer to memory manage header. - @param Pool Buffer pointer to store the buffer pointer. - @param NumberOfMemoryUnit The size of the pool to be allocated. - - @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. - @retval EFI_SUCCESS Success. - -**/ -EFI_STATUS -AllocMemInMemoryBlock ( - IN MEMORY_MANAGE_HEADER *MemoryHeader, - OUT VOID **Pool, - IN UINTN NumberOfMemoryUnit - ); - -/** - Uhci Free Pool. - - @param UhcDev The UHCI device. - @param Pool A pointer to store the buffer address. - @param AllocSize The size of the pool to be freed. - -**/ -VOID -UhcFreePool ( - IN USB_UHC_DEV *UhcDev, - IN UINT8 *Pool, - IN UINTN AllocSize - ); - -/** - Insert a new memory header into list. - - @param MemoryHeader A pointer to the memory header list. - @param NewMemoryHeader A new memory header to be inserted into the list. - -**/ -VOID -InsertMemoryHeaderToList ( - IN MEMORY_MANAGE_HEADER *MemoryHeader, - IN MEMORY_MANAGE_HEADER *NewMemoryHeader - ); - -/** - Map address of request structure buffer. - - @param Uhc The UHCI device. - @param Request The user request buffer. - @param MappedAddr Mapped address of request. - @param Map Identificaion of this mapping to return. - - @return EFI_SUCCESS Success. - @return EFI_DEVICE_ERROR Fail to map the user request. - -**/ -EFI_STATUS -UhciMapUserRequest ( - IN USB_UHC_DEV *Uhc, - IN OUT VOID *Request, - OUT UINT8 **MappedAddr, - OUT VOID **Map - ); - -/** - Map address of user data buffer. - - @param Uhc The UHCI device. - @param Direction Direction of the data transfer. - @param Data The user data buffer. - @param Len Length of the user data. - @param PktId Packet identificaion. - @param MappedAddr Mapped address to return. - @param Map Identificaion of this mapping to return. - - @return EFI_SUCCESS Success. - @return EFI_DEVICE_ERROR Fail to map the user data. - -**/ -EFI_STATUS -UhciMapUserData ( - IN USB_UHC_DEV *Uhc, - IN EFI_USB_DATA_DIRECTION Direction, - IN VOID *Data, - IN OUT UINTN *Len, - OUT UINT8 *PktId, - OUT UINT8 **MappedAddr, - OUT VOID **Map - ); - -/** - Provides the controller-specific addresses required to access system memory from a - DMA bus master. - - @param IoMmu Pointer to IOMMU PPI. - @param Operation Indicates if the bus master is going to read or write to system memory. - @param HostAddress The system memory address to map to the PCI controller. - @param NumberOfBytes On input the number of bytes to map. On output the number of bytes - that were mapped. - @param DeviceAddress The resulting map address for the bus master PCI controller to use to - access the hosts HostAddress. - @param Mapping A resulting value to pass to Unmap(). - - @retval EFI_SUCCESS The range was mapped for the returned NumberOfBytes. - @retval EFI_UNSUPPORTED The HostAddress cannot be mapped as a common buffer. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. - @retval EFI_DEVICE_ERROR The system hardware could not map the requested address. - -**/ -EFI_STATUS -IoMmuMap ( - IN EDKII_IOMMU_PPI *IoMmu, - IN EDKII_IOMMU_OPERATION Operation, - IN VOID *HostAddress, - IN OUT UINTN *NumberOfBytes, - OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, - OUT VOID **Mapping - ); - -/** - Completes the Map() operation and releases any corresponding resources. - - @param IoMmu Pointer to IOMMU PPI. - @param Mapping The mapping value returned from Map(). - -**/ -VOID -IoMmuUnmap ( - IN EDKII_IOMMU_PPI *IoMmu, - IN VOID *Mapping - ); - -/** - Allocates pages that are suitable for an OperationBusMasterCommonBuffer or - OperationBusMasterCommonBuffer64 mapping. - - @param IoMmu Pointer to IOMMU PPI. - @param Pages The number of pages to allocate. - @param HostAddress A pointer to store the base system memory address of the - allocated range. - @param DeviceAddress The resulting map address for the bus master PCI controller to use to - access the hosts HostAddress. - @param Mapping A resulting value to pass to Unmap(). - - @retval EFI_SUCCESS The requested memory pages were allocated. - @retval EFI_UNSUPPORTED Attributes is unsupported. The only legal attribute bits are - MEMORY_WRITE_COMBINE and MEMORY_CACHED. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES The memory pages could not be allocated. - -**/ -EFI_STATUS -IoMmuAllocateBuffer ( - IN EDKII_IOMMU_PPI *IoMmu, - IN UINTN Pages, - OUT VOID **HostAddress, - OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, - OUT VOID **Mapping - ); - -/** - Initialize IOMMU. - - @param IoMmu Pointer to pointer to IOMMU PPI. - -**/ -VOID -IoMmuInit ( - OUT EDKII_IOMMU_PPI **IoMmu - ); - -#endif diff --git a/MdeModulePkg/Bus/Pci/UhciPei/UhciPei.inf b/MdeModulePkg/Bus/Pci/UhciPei/UhciPei.inf deleted file mode 100644 index 06515b7ca7ce..000000000000 --- a/MdeModulePkg/Bus/Pci/UhciPei/UhciPei.inf +++ /dev/null @@ -1,60 +0,0 @@ -## @file -# The UhcPeim driver is responsible for managing the behavior of UHCI controller at PEI phase. -# -# It produces gPeiUsbHostControllerPpiGuid based on gPeiUsbControllerPpiGuid which is used -# to enable recovery function from USB Drivers. -# -# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -## - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = UhciPei - MODULE_UNI_FILE = UhciPei.uni - FILE_GUID = C463CEAC-FC57-4f36-88B7-356C750C3BCA - MODULE_TYPE = PEIM - VERSION_STRING = 1.0 - - ENTRY_POINT = UhcPeimEntry - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 EBC -# - -[Sources] - UhcPeim.c - UhcPeim.h - DmaMem.c - - -[Packages] - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - - -[LibraryClasses] - IoLib - TimerLib - BaseMemoryLib - PeiServicesLib - PeimEntryPoint - DebugLib - - -[Ppis] - gPeiUsbHostControllerPpiGuid ## PRODUCES - gPeiUsbControllerPpiGuid ## CONSUMES - gEdkiiIoMmuPpiGuid ## CONSUMES - gEfiEndOfPeiSignalPpiGuid ## CONSUMES - - -[Depex] - gEfiPeiMemoryDiscoveredPpiGuid AND gPeiUsbControllerPpiGuid - -[UserExtensions.TianoCore."ExtraFiles"] - UhciPeiExtra.uni diff --git a/MdeModulePkg/Bus/Pci/UhciPei/UhciPei.uni b/MdeModulePkg/Bus/Pci/UhciPei/UhciPei.uni deleted file mode 100644 index 04bdb8a25bab..000000000000 --- a/MdeModulePkg/Bus/Pci/UhciPei/UhciPei.uni +++ /dev/null @@ -1,17 +0,0 @@ -// /** @file -// The UhcPeim driver is responsible for managing the behavior of UHCI controller at PEI phase. -// -// It produces gPeiUsbHostControllerPpiGuid based on gPeiUsbControllerPpiGuid which is used -// to enable recovery function from USB Drivers. -// -// Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -// **/ - - -#string STR_MODULE_ABSTRACT #language en-US "Responsible for managing the behavior of UHCI controller at PEI phase" - -#string STR_MODULE_DESCRIPTION #language en-US "It produces gPeiUsbHostControllerPpiGuid based on gPeiUsbControllerPpiGuid, which is used to enable recovery function from USB Drivers." - diff --git a/MdeModulePkg/Bus/Pci/UhciPei/UhciPeiExtra.uni b/MdeModulePkg/Bus/Pci/UhciPei/UhciPeiExtra.uni deleted file mode 100644 index 4641a7b3ff6f..000000000000 --- a/MdeModulePkg/Bus/Pci/UhciPei/UhciPeiExtra.uni +++ /dev/null @@ -1,14 +0,0 @@ -// /** @file -// UhciPei Localized Strings and Content -// -// Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.
-// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -// **/ - -#string STR_PROPERTIES_MODULE_NAME -#language en-US -"UHCI PEI Module for Recovery" - - diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc index 2e0c665219f9..62ece76b18f6 100644 --- a/MdeModulePkg/MdeModulePkg.dsc +++ b/MdeModulePkg/MdeModulePkg.dsc @@ -250,7 +250,6 @@ MdeModulePkg/Bus/Pci/XhciDxe/XhciDxe.inf MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf MdeModulePkg/Bus/Pci/UhciDxe/UhciDxe.inf - MdeModulePkg/Bus/Pci/UhciPei/UhciPei.inf MdeModulePkg/Bus/Pci/EhciPei/EhciPei.inf MdeModulePkg/Bus/Pci/XhciPei/XhciPei.inf MdeModulePkg/Bus/Pci/IdeBusPei/IdeBusPei.inf From 834586f3160d2ae696097f6f94c59ecb71978428 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Wed, 26 Feb 2025 13:22:07 +0100 Subject: [PATCH 0353/1172] MdeModulePkg/UsbBusPei: Drop support for obsolete host controller PPI There are two versions of the USB host controller PPI, and only the newer one, called PEI_USB2_HOST_CONTROLLER_PPI, is actually produced by the EHCI and XHCI host controller PEIMs in EDK2. (The other PPI was only produced by UhciPei which has been removed) So remove all the conditionally executed code based on the distinction between the two PPIs, and only support the newer one. Signed-off-by: Ard Biesheuvel --- MdeModulePkg/Bus/Usb/UsbBusPei/UsbBusPei.inf | 5 +- MdeModulePkg/Bus/Usb/UsbBusPei/UsbIoPeim.c | 88 ++--- MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.c | 383 +++++-------------- MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.h | 4 - 4 files changed, 132 insertions(+), 348 deletions(-) diff --git a/MdeModulePkg/Bus/Usb/UsbBusPei/UsbBusPei.inf b/MdeModulePkg/Bus/Usb/UsbBusPei/UsbBusPei.inf index 31d7c2e2fe78..45fa54ddd6d3 100644 --- a/MdeModulePkg/Bus/Usb/UsbBusPei/UsbBusPei.inf +++ b/MdeModulePkg/Bus/Usb/UsbBusPei/UsbBusPei.inf @@ -50,11 +50,10 @@ [Ppis] gPeiUsbIoPpiGuid ## PRODUCES - gPeiUsbHostControllerPpiGuid ## SOMETIMES_CONSUMES - gPeiUsb2HostControllerPpiGuid ## SOMETIMES_CONSUMES + gPeiUsb2HostControllerPpiGuid ## CONSUMES [Depex] - gEfiPeiMemoryDiscoveredPpiGuid AND gPeiUsb2HostControllerPpiGuid OR gPeiUsbHostControllerPpiGuid + gEfiPeiMemoryDiscoveredPpiGuid AND gPeiUsb2HostControllerPpiGuid [UserExtensions.TianoCore."ExtraFiles"] UsbBusPeiExtra.uni diff --git a/MdeModulePkg/Bus/Usb/UsbBusPei/UsbIoPeim.c b/MdeModulePkg/Bus/Usb/UsbBusPei/UsbIoPeim.c index c4283521ffa7..42fc56324f8c 100644 --- a/MdeModulePkg/Bus/Usb/UsbBusPei/UsbIoPeim.c +++ b/MdeModulePkg/Bus/Usb/UsbBusPei/UsbIoPeim.c @@ -78,36 +78,20 @@ PeiUsbControlTransfer ( } } - if (PeiUsbDev->Usb2HcPpi != NULL) { - Status = PeiUsbDev->Usb2HcPpi->ControlTransfer ( - PeiServices, - PeiUsbDev->Usb2HcPpi, - PeiUsbDev->DeviceAddress, - PeiUsbDev->DeviceSpeed, - PeiUsbDev->MaxPacketSize0, - Request, - Direction, - Data, - &DataLength, - Timeout, - &(PeiUsbDev->Translator), - &TransferResult - ); - } else { - Status = PeiUsbDev->UsbHcPpi->ControlTransfer ( - PeiServices, - PeiUsbDev->UsbHcPpi, - PeiUsbDev->DeviceAddress, - PeiUsbDev->DeviceSpeed, - (UINT8)PeiUsbDev->MaxPacketSize0, - Request, - Direction, - Data, - &DataLength, - Timeout, - &TransferResult - ); - } + Status = PeiUsbDev->Usb2HcPpi->ControlTransfer ( + PeiServices, + PeiUsbDev->Usb2HcPpi, + PeiUsbDev->DeviceAddress, + PeiUsbDev->DeviceSpeed, + PeiUsbDev->MaxPacketSize0, + Request, + Direction, + Data, + &DataLength, + Timeout, + &(PeiUsbDev->Translator), + &TransferResult + ); // // Reset the endpoint toggle when endpoint stall is cleared @@ -200,35 +184,20 @@ PeiUsbBulkTransfer ( OldToggle = DataToggle; - if (PeiUsbDev->Usb2HcPpi != NULL) { - Status = PeiUsbDev->Usb2HcPpi->BulkTransfer ( - PeiServices, - PeiUsbDev->Usb2HcPpi, - PeiUsbDev->DeviceAddress, - DeviceEndpoint, - PeiUsbDev->DeviceSpeed, - MaxPacketLength, - Data2, - DataLength, - &DataToggle, - Timeout, - &(PeiUsbDev->Translator), - &TransferResult - ); - } else { - Status = PeiUsbDev->UsbHcPpi->BulkTransfer ( - PeiServices, - PeiUsbDev->UsbHcPpi, - PeiUsbDev->DeviceAddress, - DeviceEndpoint, - (UINT8)MaxPacketLength, - Data, - DataLength, - &DataToggle, - Timeout, - &TransferResult - ); - } + Status = PeiUsbDev->Usb2HcPpi->BulkTransfer ( + PeiServices, + PeiUsbDev->Usb2HcPpi, + PeiUsbDev->DeviceAddress, + DeviceEndpoint, + PeiUsbDev->DeviceSpeed, + MaxPacketLength, + Data2, + DataLength, + &DataToggle, + Timeout, + &(PeiUsbDev->Translator), + &TransferResult + ); if (OldToggle != DataToggle) { PeiUsbDev->DataToggle = (UINT16)(PeiUsbDev->DataToggle ^ (1 << EndpointIndex)); @@ -332,7 +301,6 @@ PeiUsbPortReset ( ResetRootPort ( PeiServices, - PeiUsbDev->UsbHcPpi, PeiUsbDev->Usb2HcPpi, PeiUsbDev->DeviceAddress, 0 diff --git a/MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.c b/MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.c index 159cd1934017..93900531d2d2 100644 --- a/MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.c +++ b/MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.c @@ -33,7 +33,6 @@ EFI_PEI_PPI_DESCRIPTOR mUsbIoPpiList = { The enumeration routine to detect device change. @param PeiServices Describes the list of possible PEI Services. - @param UsbHcPpi The pointer of PEI_USB_HOST_CONTROLLER_PPI instance. @param Usb2HcPpi The pointer of PEI_USB2_HOST_CONTROLLER_PPI instance. @retval EFI_SUCCESS The usb is enumerated successfully. @@ -44,7 +43,6 @@ EFI_PEI_PPI_DESCRIPTOR mUsbIoPpiList = { EFI_STATUS PeiUsbEnumeration ( IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *UsbHcPpi, IN PEI_USB2_HOST_CONTROLLER_PPI *Usb2HcPpi ); @@ -128,27 +126,19 @@ PeimInitializeUsb ( { EFI_STATUS Status; UINTN Index; - PEI_USB_HOST_CONTROLLER_PPI *UsbHcPpi; PEI_USB2_HOST_CONTROLLER_PPI *Usb2HcPpi; if (!EFI_ERROR (PeiServicesRegisterForShadow (FileHandle))) { return EFI_SUCCESS; } - // - // gPeiUsbHostControllerPpiGuid and gPeiUsb2HostControllerPpiGuid should not - // be produced at the same time - // Index = 0; while (TRUE) { - // - // Get UsbHcPpi at first. - // Status = PeiServicesLocatePpi ( - &gPeiUsbHostControllerPpiGuid, + &gPeiUsb2HostControllerPpiGuid, Index, NULL, - (VOID **)&UsbHcPpi + (VOID **)&Usb2HcPpi ); if (EFI_ERROR (Status)) { // @@ -157,33 +147,10 @@ PeimInitializeUsb ( break; } - PeiUsbEnumeration ((EFI_PEI_SERVICES **)PeiServices, UsbHcPpi, NULL); + PeiUsbEnumeration ((EFI_PEI_SERVICES **)PeiServices, Usb2HcPpi); Index++; } - if (Index == 0) { - // - // Then try to get Usb2HcPpi. - // - while (TRUE) { - Status = PeiServicesLocatePpi ( - &gPeiUsb2HostControllerPpiGuid, - Index, - NULL, - (VOID **)&Usb2HcPpi - ); - if (EFI_ERROR (Status)) { - // - // No more host controller, break out - // - break; - } - - PeiUsbEnumeration ((EFI_PEI_SERVICES **)PeiServices, NULL, Usb2HcPpi); - Index++; - } - } - if (Index == 0) { return EFI_UNSUPPORTED; } @@ -277,7 +244,6 @@ PeiHubEnumeration ( ); NewPeiUsbDevice->UsbIoPpiList.Ppi = &NewPeiUsbDevice->UsbIoPpi; NewPeiUsbDevice->AllocateAddress = (UINTN)AllocateAddress; - NewPeiUsbDevice->UsbHcPpi = PeiUsbDevice->UsbHcPpi; NewPeiUsbDevice->Usb2HcPpi = PeiUsbDevice->Usb2HcPpi; NewPeiUsbDevice->Tier = (UINT8)(PeiUsbDevice->Tier + 1); NewPeiUsbDevice->IsHub = 0x0; @@ -404,7 +370,6 @@ PeiHubEnumeration ( The enumeration routine to detect device change. @param PeiServices Describes the list of possible PEI Services. - @param UsbHcPpi The pointer of PEI_USB_HOST_CONTROLLER_PPI instance. @param Usb2HcPpi The pointer of PEI_USB2_HOST_CONTROLLER_PPI instance. @retval EFI_SUCCESS The usb is enumerated successfully. @@ -415,7 +380,6 @@ PeiHubEnumeration ( EFI_STATUS PeiUsbEnumeration ( IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *UsbHcPpi, IN PEI_USB2_HOST_CONTROLLER_PPI *Usb2HcPpi ) { @@ -438,12 +402,6 @@ PeiUsbEnumeration ( Usb2HcPpi, (UINT8 *)&NumOfRootPort ); - } else if (UsbHcPpi != NULL) { - UsbHcPpi->GetRootHubPortNumber ( - PeiServices, - UsbHcPpi, - (UINT8 *)&NumOfRootPort - ); } else { ASSERT (FALSE); return EFI_INVALID_PARAMETER; @@ -461,21 +419,12 @@ PeiUsbEnumeration ( // // First get root port status to detect changes happen // - if (Usb2HcPpi != NULL) { - Usb2HcPpi->GetRootHubPortStatus ( - PeiServices, - Usb2HcPpi, - (UINT8)Index, - &PortStatus - ); - } else { - UsbHcPpi->GetRootHubPortStatus ( - PeiServices, - UsbHcPpi, - (UINT8)Index, - &PortStatus - ); - } + Usb2HcPpi->GetRootHubPortStatus ( + PeiServices, + Usb2HcPpi, + (UINT8)Index, + &PortStatus + ); DEBUG ((DEBUG_INFO, "USB Status --- Port: %x ConnectChange[%04x] Status[%04x]\n", Index, PortStatus.PortChangeStatus, PortStatus.PortStatus)); // @@ -514,7 +463,6 @@ PeiUsbEnumeration ( ); PeiUsbDevice->UsbIoPpiList.Ppi = &PeiUsbDevice->UsbIoPpi; PeiUsbDevice->AllocateAddress = (UINTN)AllocateAddress; - PeiUsbDevice->UsbHcPpi = UsbHcPpi; PeiUsbDevice->Usb2HcPpi = Usb2HcPpi; PeiUsbDevice->IsHub = 0x0; PeiUsbDevice->DownStreamPortNo = 0x0; @@ -527,43 +475,24 @@ PeiUsbEnumeration ( // ResetRootPort ( PeiServices, - PeiUsbDevice->UsbHcPpi, PeiUsbDevice->Usb2HcPpi, Index, 0 ); - if (Usb2HcPpi != NULL) { - Usb2HcPpi->GetRootHubPortStatus ( - PeiServices, - Usb2HcPpi, - (UINT8)Index, - &PortStatus - ); - } else { - UsbHcPpi->GetRootHubPortStatus ( - PeiServices, - UsbHcPpi, - (UINT8)Index, - &PortStatus - ); - } + Usb2HcPpi->GetRootHubPortStatus ( + PeiServices, + Usb2HcPpi, + (UINT8)Index, + &PortStatus + ); } else { - if (Usb2HcPpi != NULL) { - Usb2HcPpi->ClearRootHubPortFeature ( - PeiServices, - Usb2HcPpi, - (UINT8)Index, - EfiUsbPortResetChange - ); - } else { - UsbHcPpi->ClearRootHubPortFeature ( - PeiServices, - UsbHcPpi, - (UINT8)Index, - EfiUsbPortResetChange - ); - } + Usb2HcPpi->ClearRootHubPortFeature ( + PeiServices, + Usb2HcPpi, + (UINT8)Index, + EfiUsbPortResetChange + ); } PeiUsbDevice->DeviceSpeed = (UINT8)PeiUsbGetDeviceSpeed (PortStatus.PortStatus); @@ -1032,7 +961,6 @@ GetExpectedDescriptor ( Send reset signal over the given root hub port. @param PeiServices Describes the list of possible PEI Services. - @param UsbHcPpi The pointer of PEI_USB_HOST_CONTROLLER_PPI instance. @param Usb2HcPpi The pointer of PEI_USB2_HOST_CONTROLLER_PPI instance. @param PortNum The port to be reset. @param RetryIndex The retry times. @@ -1041,7 +969,6 @@ GetExpectedDescriptor ( VOID ResetRootPort ( IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *UsbHcPpi, IN PEI_USB2_HOST_CONTROLLER_PPI *Usb2HcPpi, IN UINT8 PortNum, IN UINT8 RetryIndex @@ -1051,211 +978,105 @@ ResetRootPort ( UINTN Index; EFI_USB_PORT_STATUS PortStatus; - if (Usb2HcPpi != NULL) { - MicroSecondDelay (200 * 1000); - - // - // reset root port - // - Status = Usb2HcPpi->SetRootHubPortFeature ( - PeiServices, - Usb2HcPpi, - PortNum, - EfiUsbPortReset - ); - - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "SetRootHubPortFeature EfiUsbPortReset Failed\n")); - return; - } - - // - // Drive the reset signal for at least 50ms. Check USB 2.0 Spec - // section 7.1.7.5 for timing requirements. - // - MicroSecondDelay (USB_SET_ROOT_PORT_RESET_STALL); - - // - // clear reset root port - // - Status = Usb2HcPpi->ClearRootHubPortFeature ( - PeiServices, - Usb2HcPpi, - PortNum, - EfiUsbPortReset - ); - - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "ClearRootHubPortFeature EfiUsbPortReset Failed\n")); - return; - } - - MicroSecondDelay (USB_CLR_ROOT_PORT_RESET_STALL); - - // - // USB host controller won't clear the RESET bit until - // reset is actually finished. - // - ZeroMem (&PortStatus, sizeof (EFI_USB_PORT_STATUS)); - - for (Index = 0; Index < USB_WAIT_PORT_STS_CHANGE_LOOP; Index++) { - Status = Usb2HcPpi->GetRootHubPortStatus ( - PeiServices, - Usb2HcPpi, - PortNum, - &PortStatus - ); - if (EFI_ERROR (Status)) { - return; - } - - if (!USB_BIT_IS_SET (PortStatus.PortStatus, USB_PORT_STAT_RESET)) { - break; - } + MicroSecondDelay (200 * 1000); - MicroSecondDelay (USB_WAIT_PORT_STS_CHANGE_STALL); - } - - if (Index == USB_WAIT_PORT_STS_CHANGE_LOOP) { - DEBUG ((DEBUG_ERROR, "ResetRootPort: reset not finished in time on port %d\n", PortNum)); - return; - } + // + // reset root port + // + Status = Usb2HcPpi->SetRootHubPortFeature ( + PeiServices, + Usb2HcPpi, + PortNum, + EfiUsbPortReset + ); - Usb2HcPpi->ClearRootHubPortFeature ( - PeiServices, - Usb2HcPpi, - PortNum, - EfiUsbPortResetChange - ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "SetRootHubPortFeature EfiUsbPortReset Failed\n")); + return; + } - Usb2HcPpi->ClearRootHubPortFeature ( - PeiServices, - Usb2HcPpi, - PortNum, - EfiUsbPortConnectChange - ); + // + // Drive the reset signal for at least 50ms. Check USB 2.0 Spec + // section 7.1.7.5 for timing requirements. + // + MicroSecondDelay (USB_SET_ROOT_PORT_RESET_STALL); - // - // Set port enable - // - Usb2HcPpi->SetRootHubPortFeature ( - PeiServices, - Usb2HcPpi, - PortNum, - EfiUsbPortEnable - ); + // + // clear reset root port + // + Status = Usb2HcPpi->ClearRootHubPortFeature ( + PeiServices, + Usb2HcPpi, + PortNum, + EfiUsbPortReset + ); - Usb2HcPpi->ClearRootHubPortFeature ( - PeiServices, - Usb2HcPpi, - PortNum, - EfiUsbPortEnableChange - ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "ClearRootHubPortFeature EfiUsbPortReset Failed\n")); + return; + } - MicroSecondDelay ((RetryIndex + 1) * 50 * 1000); - } else { - MicroSecondDelay (200 * 1000); + MicroSecondDelay (USB_CLR_ROOT_PORT_RESET_STALL); - // - // reset root port - // - Status = UsbHcPpi->SetRootHubPortFeature ( - PeiServices, - UsbHcPpi, - PortNum, - EfiUsbPortReset - ); + // + // USB host controller won't clear the RESET bit until + // reset is actually finished. + // + ZeroMem (&PortStatus, sizeof (EFI_USB_PORT_STATUS)); + for (Index = 0; Index < USB_WAIT_PORT_STS_CHANGE_LOOP; Index++) { + Status = Usb2HcPpi->GetRootHubPortStatus ( + PeiServices, + Usb2HcPpi, + PortNum, + &PortStatus + ); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "SetRootHubPortFeature EfiUsbPortReset Failed\n")); return; } - // - // Drive the reset signal for at least 50ms. Check USB 2.0 Spec - // section 7.1.7.5 for timing requirements. - // - MicroSecondDelay (USB_SET_ROOT_PORT_RESET_STALL); - - // - // clear reset root port - // - Status = UsbHcPpi->ClearRootHubPortFeature ( - PeiServices, - UsbHcPpi, - PortNum, - EfiUsbPortReset - ); - - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "ClearRootHubPortFeature EfiUsbPortReset Failed\n")); - return; + if (!USB_BIT_IS_SET (PortStatus.PortStatus, USB_PORT_STAT_RESET)) { + break; } - MicroSecondDelay (USB_CLR_ROOT_PORT_RESET_STALL); - - // - // USB host controller won't clear the RESET bit until - // reset is actually finished. - // - ZeroMem (&PortStatus, sizeof (EFI_USB_PORT_STATUS)); - - for (Index = 0; Index < USB_WAIT_PORT_STS_CHANGE_LOOP; Index++) { - Status = UsbHcPpi->GetRootHubPortStatus ( - PeiServices, - UsbHcPpi, - PortNum, - &PortStatus - ); - if (EFI_ERROR (Status)) { - return; - } - - if (!USB_BIT_IS_SET (PortStatus.PortStatus, USB_PORT_STAT_RESET)) { - break; - } + MicroSecondDelay (USB_WAIT_PORT_STS_CHANGE_STALL); + } - MicroSecondDelay (USB_WAIT_PORT_STS_CHANGE_STALL); - } + if (Index == USB_WAIT_PORT_STS_CHANGE_LOOP) { + DEBUG ((DEBUG_ERROR, "ResetRootPort: reset not finished in time on port %d\n", PortNum)); + return; + } - if (Index == USB_WAIT_PORT_STS_CHANGE_LOOP) { - DEBUG ((DEBUG_ERROR, "ResetRootPort: reset not finished in time on port %d\n", PortNum)); - return; - } + Usb2HcPpi->ClearRootHubPortFeature ( + PeiServices, + Usb2HcPpi, + PortNum, + EfiUsbPortResetChange + ); - UsbHcPpi->ClearRootHubPortFeature ( - PeiServices, - UsbHcPpi, - PortNum, - EfiUsbPortResetChange - ); + Usb2HcPpi->ClearRootHubPortFeature ( + PeiServices, + Usb2HcPpi, + PortNum, + EfiUsbPortConnectChange + ); - UsbHcPpi->ClearRootHubPortFeature ( - PeiServices, - UsbHcPpi, - PortNum, - EfiUsbPortConnectChange - ); + // + // Set port enable + // + Usb2HcPpi->SetRootHubPortFeature ( + PeiServices, + Usb2HcPpi, + PortNum, + EfiUsbPortEnable + ); - // - // Set port enable - // - UsbHcPpi->SetRootHubPortFeature ( - PeiServices, - UsbHcPpi, - PortNum, - EfiUsbPortEnable - ); - - UsbHcPpi->ClearRootHubPortFeature ( - PeiServices, - UsbHcPpi, - PortNum, - EfiUsbPortEnableChange - ); - - MicroSecondDelay ((RetryIndex + 1) * 50 * 1000); - } + Usb2HcPpi->ClearRootHubPortFeature ( + PeiServices, + Usb2HcPpi, + PortNum, + EfiUsbPortEnableChange + ); - return; + MicroSecondDelay ((RetryIndex + 1) * 50 * 1000); } diff --git a/MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.h b/MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.h index 69d1126da0af..83ee2ece2ece 100644 --- a/MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.h +++ b/MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.h @@ -12,7 +12,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include -#include #include #include @@ -51,7 +50,6 @@ typedef struct { UINT8 IsHub; UINT8 DownStreamPortNo; UINTN AllocateAddress; - PEI_USB_HOST_CONTROLLER_PPI *UsbHcPpi; PEI_USB2_HOST_CONTROLLER_PPI *Usb2HcPpi; UINT8 ConfigurationData[1024]; EFI_USB_CONFIG_DESCRIPTOR *ConfigDesc; @@ -238,7 +236,6 @@ PeiUsbPortReset ( Send reset signal over the given root hub port. @param PeiServices Describes the list of possible PEI Services. - @param UsbHcPpi The pointer of PEI_USB_HOST_CONTROLLER_PPI instance. @param Usb2HcPpi The pointer of PEI_USB2_HOST_CONTROLLER_PPI instance. @param PortNum The port to be reset. @param RetryIndex The retry times. @@ -247,7 +244,6 @@ PeiUsbPortReset ( VOID ResetRootPort ( IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *UsbHcPpi, IN PEI_USB2_HOST_CONTROLLER_PPI *Usb2HcPpi, IN UINT8 PortNum, IN UINT8 RetryIndex From 44d88d5d0c082f618be62ce7ef92cf4a8969e092 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Wed, 26 Feb 2025 13:27:14 +0100 Subject: [PATCH 0354/1172] MdeModulePkg: Remove obsolete PEI_USB_HOST_CONTROLLER_PPI This PPI is no longer used - the EHCI and XHCI host controller PEIMs expose PEI_USB2_HOST_CONTROLLER_PPI instead. Signed-off-by: Ard Biesheuvel --- MdeModulePkg/Bus/Usb/UsbBotPei/BotPeim.h | 1 - MdeModulePkg/Bus/Usb/UsbBotPei/UsbBotPeim.h | 1 - MdeModulePkg/Include/Ppi/UsbHostController.h | 249 ------------------- MdeModulePkg/MdeModulePkg.dec | 3 - 4 files changed, 254 deletions(-) delete mode 100644 MdeModulePkg/Include/Ppi/UsbHostController.h diff --git a/MdeModulePkg/Bus/Usb/UsbBotPei/BotPeim.h b/MdeModulePkg/Bus/Usb/UsbBotPei/BotPeim.h index 54d149e45b18..505bf3f7d9d2 100644 --- a/MdeModulePkg/Bus/Usb/UsbBotPei/BotPeim.h +++ b/MdeModulePkg/Bus/Usb/UsbBotPei/BotPeim.h @@ -13,7 +13,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include -#include #include // #include diff --git a/MdeModulePkg/Bus/Usb/UsbBotPei/UsbBotPeim.h b/MdeModulePkg/Bus/Usb/UsbBotPei/UsbBotPeim.h index 1819784981f3..8af679681e5c 100644 --- a/MdeModulePkg/Bus/Usb/UsbBotPei/UsbBotPeim.h +++ b/MdeModulePkg/Bus/Usb/UsbBotPei/UsbBotPeim.h @@ -13,7 +13,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include -#include #include #include diff --git a/MdeModulePkg/Include/Ppi/UsbHostController.h b/MdeModulePkg/Include/Ppi/UsbHostController.h deleted file mode 100644 index cf468f947891..000000000000 --- a/MdeModulePkg/Include/Ppi/UsbHostController.h +++ /dev/null @@ -1,249 +0,0 @@ -/** @file - Defines the USB Host Controller PPI that provides I/O services for a USB Host - Controller that may be used to access recovery devices. These interfaces are - modeled on the UEFI 2.3 specification EFI_USB2_HOST_CONTROLLER_PROTOCOL. - Refer to section 16.1 of the UEFI 2.3 Specification for more information on - these interfaces. - -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
- -SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#ifndef _PEI_USB_HOST_CONTROLLER_PPI_H_ -#define _PEI_USB_HOST_CONTROLLER_PPI_H_ - -#include - -/// -/// Global ID for the PEI_USB_HOST_CONTROLLER_PPI. -/// -#define PEI_USB_HOST_CONTROLLER_PPI_GUID \ - { \ - 0x652b38a9, 0x77f4, 0x453f, { 0x89, 0xd5, 0xe7, 0xbd, 0xc3, 0x52, 0xfc, 0x53} \ - } - -/// -/// Forward declaration for the PEI_USB_HOST_CONTROLLER_PPI. -/// -typedef struct _PEI_USB_HOST_CONTROLLER_PPI PEI_USB_HOST_CONTROLLER_PPI; - -/** - Initiate a USB control transfer using a specific USB Host controller on the USB bus. - - @param[in] PeiServices The pointer to the PEI Services Table. - @param[in] This The pointer to this instance of the - PEI_USB_HOST_CONTROLLER_PPI. - @param[in] DeviceAddress Represents the address of the target device - on the USB. - @param[in] DeviceSpeed Indicates device speed. - @param[in] MaximumPacketLength Indicates the maximum packet size that the - default control transfer - endpoint is capable of sending or receiving. - @param[in] Request A pointer to the USB device request that - will be sent to the USB device. - @param[in] TransferDirection Specifies the data direction for the transfer. - There are three values available: - EfiUsbDataIn, EfiUsbDataOut and EfiUsbNoData. - @param[in,out] Data A pointer to the buffer of data that will - be transmitted to USB device or - received from USB device. - @param[in,out] DataLength On input, indicates the size, in bytes, of - the data buffer specified by Data. - On output, indicates the amount of data - actually transferred. - @param[in] TimeOut Indicates the maximum time, in milliseconds, - that the transfer is allowed to complete. - If Timeout is 0, then the caller must wait for - the function to be completed until EFI_SUCCESS - or EFI_DEVICE_ERROR is returned. - @param[out] TransferResult A pointer to the detailed result information - generated by this control transfer. - - @retval EFI_DEVICE_ERROR The control transfer failed due to host controller - or device error. - @retval EFI_SUCCESS The control transfer was completed successfully. - -**/ -typedef -EFI_STATUS -(EFIAPI *PEI_USB_HOST_CONTROLLER_CONTROL_TRANSFER)( - IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *This, - IN UINT8 DeviceAddress, - IN UINT8 DeviceSpeed, - IN UINT8 MaximumPacketLength, - IN USB_DEVICE_REQUEST *Request, - IN EFI_USB_DATA_DIRECTION TransferDirection, - IN OUT VOID *Data OPTIONAL, - IN OUT UINTN *DataLength OPTIONAL, - IN UINTN TimeOut, - OUT UINT32 *TransferResult - ); - -/** - Initiate a USB bulk transfer using a specific USB Host controller on the USB bus. - - @param[in] PeiServices The pointer to the PEI Services Table. - @param[in] This The pointer to this instance of the - PEI_USB_HOST_CONTROLLER_PPI. - @param[in] DeviceAddress Represents the address of the target device - on the USB. - @param[in] EndPointAddress The combination of an endpoint number and - an endpoint direction of the target USB device. - @param[in] MaximumPacketLength Indicates the maximum packet size the target - endpoint is capable of sending or receiving. - @param[in,out] Data Array of pointers to the buffers of data - that will be transmitted to USB device or - received from USB device. - @param[in,out] DataLength When input, indicates the size, in bytes, of - the data buffers specified by Data. When output, - indicates the data size actually transferred. - @param[in,out] DataToggle A pointer to the data toggle value. - @param[in] TimeOut Indicates the maximum time, in milliseconds, - in which the transfer is allowed to complete. - If Timeout is 0, then the caller must wait for - the function to be completed until EFI_SUCCESS - or EFI_DEVICE_ERROR is returned. - @param[out] TransferResult A pointer to the detailed result information - of the bulk transfer. - - @retval EFI_SUCCESS The bulk transfer was completed successfully. - @retval EFI_DEVICE_ERROR The bulk transfer failed due to host controller or device error. - Caller should check TransferResult for detailed error information. - -**/ -typedef -EFI_STATUS -(EFIAPI *PEI_USB_HOST_CONTROLLER_BULK_TRANSFER)( - IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *This, - IN UINT8 DeviceAddress, - IN UINT8 EndPointAddress, - IN UINT8 MaximumPacketLength, - IN OUT VOID *Data, - IN OUT UINTN *DataLength, - IN OUT UINT8 *DataToggle, - IN UINTN TimeOut, - OUT UINT32 *TransferResult - ); - -/** - Retrieves the number of root hub ports. - - @param[in] PeiServices The pointer to the PEI Services Table. - @param[in] This The pointer to this instance of the - PEI_USB_HOST_CONTROLLER_PPI. - @param[out] PortNumber The pointer to the number of the root hub ports. - - @retval EFI_SUCCESS The port number was retrieved successfully. - @retval EFI_DEVICE_ERROR An error was encountered while attempting to retrieve - the port number. - @retval EFI_INVALID_PARAMETER PortNumber is NULL. - -**/ -typedef -EFI_STATUS -(EFIAPI *PEI_USB_HOST_CONTROLLER_GET_ROOTHUB_PORT_NUMBER)( - IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *This, - OUT UINT8 *PortNumber - ); - -/** - Retrieves the current status of a USB root hub port. - - @param[in] PeiServices The pointer to the PEI Services Table. - @param[in] This The pointer to this instance of the - PEI_USB_HOST_CONTROLLER_PPI. - @param[in] PortNumber Specifies the root hub port from which the status is - to be retrieved. - This value is zero based. - @param[out] PortStatus A pointer to the current port status bits and port - status change bits. - - @retval EFI_SUCCESS The status of the USB root hub port specified by - PortNumber was returned in PortStatus. - @retval EFI_INVALID_PARAMETER PortNumber is invalid. - -**/ -typedef -EFI_STATUS -(EFIAPI *PEI_USB_HOST_CONTROLLER_GET_ROOTHUB_PORT_STATUS)( - IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *This, - IN UINT8 PortNumber, - OUT EFI_USB_PORT_STATUS *PortStatus - ); - -/** - Sets a feature for the specified root hub port. - - @param[in] PeiServices The pointer to the PEI Services Table. - @param[in] This The pointer to this instance of the - PEI_USB_HOST_CONTROLLER_PPI. - @param[in] PortNumber Specifies the root hub port whose feature is requested - to be set. This value is zero based. - @param[in] PortFeature Indicates the feature selector associated with the feature - set request. - - @retval EFI_SUCCESS The feature specified by PortFeature was set for - the USB root hub port specified by PortNumber. - @retval EFI_INVALID_PARAMETER PortNumber is invalid or PortFeature is invalid - for this function. - -**/ -typedef -EFI_STATUS -(EFIAPI *PEI_USB_HOST_CONTROLLER_SET_ROOTHUB_PORT_FEATURE)( - IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *This, - IN UINT8 PortNumber, - IN EFI_USB_PORT_FEATURE PortFeature - ); - -/** - Clears a feature for the specified root hub port. - - @param[in] PeiServices The pointer to the PEI Services Table. - @param[in] This The pointer to this instance of the - PEI_USB_HOST_CONTROLLER_PPI. - @param[in] PortNumber Specifies the root hub port whose feature is - requested to be cleared. - @param[in] PortFeature Indicates the feature selector associated with the - feature clear request. - - @return EFI_SUCCESS The feature specified by PortFeature was cleared - for the USB root hub port specified by PortNumber. - @return EFI_INVALID_PARAMETER PortNumber is invalid or PortFeature is invalid. - @return EFI_DEVICE_ERROR Can't read the register. - -**/ -typedef -EFI_STATUS -(EFIAPI *PEI_USB_HOST_CONTROLLER_CLEAR_ROOTHUB_PORT_FEATURE)( - IN EFI_PEI_SERVICES **PeiServices, - IN PEI_USB_HOST_CONTROLLER_PPI *This, - IN UINT8 PortNumber, - IN EFI_USB_PORT_FEATURE PortFeature - ); - -/// -/// This PPI contains a set of services to interact with the USB host controller. -/// These interfaces are modeled on the UEFI 2.3 specification protocol -/// EFI_USB2_HOST_CONTROLLER_PROTOCOL. Refer to section 16.1 of the UEFI 2.3 -/// Specification for more information on these interfaces. -/// -struct _PEI_USB_HOST_CONTROLLER_PPI { - PEI_USB_HOST_CONTROLLER_CONTROL_TRANSFER ControlTransfer; - PEI_USB_HOST_CONTROLLER_BULK_TRANSFER BulkTransfer; - PEI_USB_HOST_CONTROLLER_GET_ROOTHUB_PORT_NUMBER GetRootHubPortNumber; - PEI_USB_HOST_CONTROLLER_GET_ROOTHUB_PORT_STATUS GetRootHubPortStatus; - PEI_USB_HOST_CONTROLLER_SET_ROOTHUB_PORT_FEATURE SetRootHubPortFeature; - PEI_USB_HOST_CONTROLLER_CLEAR_ROOTHUB_PORT_FEATURE ClearRootHubPortFeature; -}; - -extern EFI_GUID gPeiUsbHostControllerPpiGuid; - -#endif diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 0c0b1c6c52d6..24cc64f6b474 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -504,9 +504,6 @@ ## Include/Ppi/AtaController.h gPeiAtaControllerPpiGuid = { 0xa45e60d1, 0xc719, 0x44aa, { 0xb0, 0x7a, 0xaa, 0x77, 0x7f, 0x85, 0x90, 0x6d }} - ## Include/Ppi/UsbHostController.h - gPeiUsbHostControllerPpiGuid = { 0x652B38A9, 0x77F4, 0x453F, { 0x89, 0xD5, 0xE7, 0xBD, 0xC3, 0x52, 0xFC, 0x53 }} - ## Include/Ppi/Usb2HostController.h gPeiUsb2HostControllerPpiGuid = { 0xfedd6305, 0xe2d7, 0x4ed5, { 0x9f, 0xaa, 0xda, 0x8, 0xe, 0x33, 0x6c, 0x22 }} From 4488d4479a0d433a9df2ecf4c5c7863055118256 Mon Sep 17 00:00:00 2001 From: Benjamin Doron Date: Mon, 14 Jul 2025 13:22:14 -0400 Subject: [PATCH 0355/1172] UefiPayloadPkg/BlSupportDxe: Drop manual reservations for APIC and HPET The entrypoint module should do this programmatically using resources passed by the bootloader. Under UPL, bootloaders are expected to pass such ranges in the FDT. Signed-off-by: Benjamin Doron --- UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c | 6 +- UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h | 4 - UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf | 2 - UefiPayloadPkg/BlSupportDxe/X86/BlSupport.c | 86 +------------------- 4 files changed, 3 insertions(+), 95 deletions(-) diff --git a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c index 2fd6f7d66fe7..215bc60f7794 100644 --- a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c +++ b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c @@ -1,6 +1,6 @@ /** @file - This driver will report some MMIO/IO resources to dxe core, extract smbios and acpi - tables from bootloader. + This driver will setup PCDs for DXE phase from HOBs + and initialise architecture-specific settings and resources. Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -30,8 +30,6 @@ BlDxeEntryPoint ( EFI_PEI_GRAPHICS_INFO_HOB *GfxInfo; ACPI_BOARD_INFO *AcpiBoardInfo; - Status = EFI_SUCCESS; - // // Find the frame buffer information and update PCDs // diff --git a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h index ebae6f2b5e37..5f611c37138e 100644 --- a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h +++ b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h @@ -11,16 +11,12 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include -#include #include -#include #include #include -#include #include #include -#include #include #include diff --git a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf index 4c15fd4eab4b..401b99f9b6e0 100644 --- a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf +++ b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf @@ -42,10 +42,8 @@ [LibraryClasses] UefiDriverEntryPoint UefiBootServicesTableLib - DxeServicesTableLib DebugLib BaseMemoryLib - UefiLib HobLib [LibraryClasses.AARCH64] diff --git a/UefiPayloadPkg/BlSupportDxe/X86/BlSupport.c b/UefiPayloadPkg/BlSupportDxe/X86/BlSupport.c index 56d4c71822b7..a7bbd88541ac 100644 --- a/UefiPayloadPkg/BlSupportDxe/X86/BlSupport.c +++ b/UefiPayloadPkg/BlSupportDxe/X86/BlSupport.c @@ -6,85 +6,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#include "BlSupportDxe.h" - -/** - Reserve MMIO/IO resource in GCD - - @param IsMMIO Flag of whether it is mmio resource or io resource. - @param GcdType Type of the space. - @param BaseAddress Base address of the space. - @param Length Length of the space. - @param Alignment Align with 2^Alignment - @param ImageHandle Handle for the image of this driver. - - @retval EFI_SUCCESS Reserve successful -**/ -EFI_STATUS -ReserveResourceInGcd ( - IN BOOLEAN IsMMIO, - IN UINTN GcdType, - IN EFI_PHYSICAL_ADDRESS BaseAddress, - IN UINT64 Length, - IN UINTN Alignment, - IN EFI_HANDLE ImageHandle - ) -{ - EFI_STATUS Status; - - if (IsMMIO) { - Status = gDS->AddMemorySpace ( - GcdType, - BaseAddress, - Length, - EFI_MEMORY_UC - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_WARN, - "Failed to add memory space :0x%lx 0x%lx\n", - BaseAddress, - Length - )); - } - - Status = gDS->AllocateMemorySpace ( - EfiGcdAllocateAddress, - GcdType, - Alignment, - Length, - &BaseAddress, - ImageHandle, - NULL - ); - } else { - Status = gDS->AddIoSpace ( - GcdType, - BaseAddress, - Length - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_WARN, - "Failed to add IO space :0x%lx 0x%lx\n", - BaseAddress, - Length - )); - } - - Status = gDS->AllocateIoSpace ( - EfiGcdAllocateAddress, - GcdType, - Alignment, - Length, - &BaseAddress, - ImageHandle, - NULL - ); - } - return Status; -} +#include "BlSupportDxe.h" /** Architecture level additional operation which needs to be performed before @@ -104,12 +27,5 @@ BlArchAdditionalOps ( IN EFI_SYSTEM_TABLE *SystemTable ) { - // - // Report MMIO/IO Resources - // - ReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFEC00000, SIZE_4KB, 0, ImageHandle); // IOAPIC - - ReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFED00000, SIZE_1KB, 0, ImageHandle); // HPET - return EFI_SUCCESS; } From 9baa6193c2849e11f3aea91fc08e3bb01198cf12 Mon Sep 17 00:00:00 2001 From: Arun Subramanian Baskaran Date: Tue, 29 Jul 2025 16:34:10 -0400 Subject: [PATCH 0356/1172] Update reviewer for SecurityPkg: Tcg related modules and UefiCpuPkg Add arunsbaskaran as reviewer for SecurityPkg: Tcg related modules and UefiCpuPkg. Remove rahul1-kumar as reviewer from SecurityPkg: Tcg related modules and UefiCpuPkg. Signed-off-by: Arun Subramanian Baskaran --- Maintainers.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Maintainers.txt b/Maintainers.txt index 6beda4c0ad82..8be4f963bf85 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -615,7 +615,7 @@ R: Min Xu [mxu9] SecurityPkg: Tcg related modules F: SecurityPkg/Tcg/ -R: Rahul Kumar [rahul1-kumar] +R: Arun Subramanian Baskaran [arunsbaskaran] SecurityPkg: SVSM related modules F: SecurityPkg/Library/Tpm2DeviceLibDTpm/*Svsm* @@ -657,7 +657,7 @@ M: Ray Ni [niruiyu] M: Jiaxin Wu [jiaxinwu] R: Zhiguang Liu [LiuZhiguang001] R: Dun Tan [td36] -R: Rahul Kumar [rahul1-kumar] +R: Arun Subramanian Baskaran [arunsbaskaran] R: Gerd Hoffmann [kraxel] R: Star Zeng [lzeng14] R: Eduardo Cuevas Farfan [ecuevasf] From b58ce4c226768ced972bd49886e20c5ae6dfd8f0 Mon Sep 17 00:00:00 2001 From: Bob Morgan Date: Fri, 2 May 2025 15:37:11 -0700 Subject: [PATCH 0357/1172] MdeModulePkg: Support conditional UFS initialization Add SkipHceReenable and SkipLinkStartup flags to the EDKII_UFS_HC_PLATFORM_PROTOCOL to support using a UFS controller that has already been initialized. Signed-off-by: Bob Morgan --- .../Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c | 56 +++++++++++-------- .../Protocol/UfsHostControllerPlatform.h | 10 +++- 2 files changed, 41 insertions(+), 25 deletions(-) diff --git a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c index a03b2ce35dd5..c1072afafe10 100644 --- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c +++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c @@ -1862,42 +1862,46 @@ UfsEnableHostController ( } } - // - // UFS 2.0 spec section 7.1.1 - Host Controller Initialization - // - // Reinitialize the UFS host controller if HCE bit of HC register is set. - // - Status = UfsMmioRead32 (Private, UFS_HC_ENABLE_OFFSET, &Data); - if (EFI_ERROR (Status)) { - return Status; - } - - if ((Data & UFS_HC_HCE_EN) == UFS_HC_HCE_EN) { + if ((mUfsHcPlatform == NULL) || + ((mUfsHcPlatform->Version >= 3) && !mUfsHcPlatform->SkipHceReenable)) + { // - // Write a 0 to the HCE register at first to disable the host controller. + // UFS 2.0 spec section 7.1.1 - Host Controller Initialization // - Status = UfsMmioWrite32 (Private, UFS_HC_ENABLE_OFFSET, 0); + // Reinitialize the UFS host controller if HCE bit of HC register is set. + // + Status = UfsMmioRead32 (Private, UFS_HC_ENABLE_OFFSET, &Data); if (EFI_ERROR (Status)) { return Status; } + if ((Data & UFS_HC_HCE_EN) == UFS_HC_HCE_EN) { + // + // Write a 0 to the HCE register at first to disable the host controller. + // + Status = UfsMmioWrite32 (Private, UFS_HC_ENABLE_OFFSET, 0); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Wait until HCE is read as '0' before continuing. + // + Status = UfsWaitMemSet (Private, UFS_HC_ENABLE_OFFSET, UFS_HC_HCE_EN, 0, UFS_TIMEOUT); + if (EFI_ERROR (Status)) { + return EFI_DEVICE_ERROR; + } + } + // - // Wait until HCE is read as '0' before continuing. + // Write a 1 to the HCE register to enable the UFS host controller. // - Status = UfsWaitMemSet (Private, UFS_HC_ENABLE_OFFSET, UFS_HC_HCE_EN, 0, UFS_TIMEOUT); + Status = UfsMmioWrite32 (Private, UFS_HC_ENABLE_OFFSET, UFS_HC_HCE_EN); if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; + return Status; } } - // - // Write a 1 to the HCE register to enable the UFS host controller. - // - Status = UfsMmioWrite32 (Private, UFS_HC_ENABLE_OFFSET, UFS_HC_HCE_EN); - if (EFI_ERROR (Status)) { - return Status; - } - // // Wait until HCE is read as '1' before continuing. // @@ -1945,6 +1949,10 @@ UfsDeviceDetection ( } } + if ((mUfsHcPlatform != NULL) && (mUfsHcPlatform->Version >= 3) && mUfsHcPlatform->SkipLinkStartup) { + return EFI_SUCCESS; + } + // // Start UFS device detection. // Try up to 3 times for establishing data link with device. diff --git a/MdeModulePkg/Include/Protocol/UfsHostControllerPlatform.h b/MdeModulePkg/Include/Protocol/UfsHostControllerPlatform.h index 32e9f6488c90..b5b316036647 100644 --- a/MdeModulePkg/Include/Protocol/UfsHostControllerPlatform.h +++ b/MdeModulePkg/Include/Protocol/UfsHostControllerPlatform.h @@ -11,7 +11,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include -#define EDKII_UFS_HC_PLATFORM_PROTOCOL_VERSION 2 +#define EDKII_UFS_HC_PLATFORM_PROTOCOL_VERSION 3 extern EFI_GUID gEdkiiUfsHcPlatformProtocolGuid; @@ -129,6 +129,14 @@ struct _EDKII_UFS_HC_PLATFORM_PROTOCOL { /// Reference Clock Frequency Ufs Card Attribute that need to be set in this Ufs Host Environment. /// EDKII_UFS_CARD_REF_CLK_FREQ_ATTRIBUTE RefClkFreq; + /// + /// Flag to skip HCE re-enable. + /// + BOOLEAN SkipHceReenable; + /// + /// Flag to skip link startup. + /// + BOOLEAN SkipLinkStartup; }; #endif From e69d7653b98bade91855f2d0c4f55cb8dbcb16d5 Mon Sep 17 00:00:00 2001 From: Sherry Fan Date: Thu, 31 Jul 2025 11:10:30 -0700 Subject: [PATCH 0358/1172] MdeModulePkg: XhciDxe: Fix USB reset issue: use after free `XhcFreeUrb` attempts to unmap `Urb->DataMap` after `FreePool(Urb->Data)` has already been called in some cases, causing a use after free. Change the ordering so `Data` is freed after `Unmap`and only freed when appropriate. Signed-off-by: Sherry Fan --- MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c | 9 ++++++-- MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c | 28 ++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c b/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c index c830db66a17c..c337f15118d2 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c +++ b/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c @@ -837,6 +837,10 @@ XhcTransfer ( } Xhc->PciIo->Flush (Xhc->PciIo); + // + // Do not free URB data, since it is passed in as an external argument + // and allocated and managed by the caller. + // XhcFreeUrb (Xhc, Urb); return Status; } @@ -1227,8 +1231,9 @@ XhcControlTransfer ( sending or receiving. @param DataBuffersNumber Number of data buffers prepared for the transfer. @param Data Array of pointers to the buffers of data to transmit - from or receive into. - @param DataLength The lenght of the data buffer. + from or receive into. The caller is responsible for freeing + the buffers after the transfers are completed. + @param DataLength The length of the data buffer. @param DataToggle On input, the initial data toggle for the transfer; On output, it is updated to to next data toggle to use of the subsequent bulk transfer. diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c index 50d7d4b5f4ee..e0171d669979 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c +++ b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c @@ -107,6 +107,10 @@ XhcCmdTransfer ( Status = EFI_SUCCESS; } + // + // Do not free URB data, since `XhcCreateCmdTrb` does not allocate any data + // and the `Data` field is not used in command transfers. + // XhcFreeUrb (Xhc, Urb); ON_EXIT: @@ -184,6 +188,9 @@ XhcCreateUrb ( /** Free an allocated URB. + The `Data` field of the URB is not owned by the URB and is not freed here. + The caller is which allocates `Data` is responsible for freeing it. + Freeing `Data` must be done AFTER calling `XhcFreeUrb`, since this function may unmap the `DataMap` field. @param Xhc The XHCI device. @param Urb The URB to free. @@ -1388,6 +1395,7 @@ XhciDelAsyncIntTransfer ( LIST_ENTRY *Entry; LIST_ENTRY *Next; URB *Urb; + VOID *UrbData; EFI_USB_DATA_DIRECTION Direction; EFI_STATUS Status; @@ -1412,8 +1420,16 @@ XhciDelAsyncIntTransfer ( } RemoveEntryList (&Urb->UrbList); - FreePool (Urb->Data); + // + // For `XhciDelAsyncIntTransfer`, the URB is created through `XhciInsertAsyncIntTransfer` + // and allocates and manages its own data buffer, so free it here. + // + UrbData = Urb->Data; XhcFreeUrb (Xhc, Urb); + if (UrbData != NULL) { + FreePool (UrbData); + } + return EFI_SUCCESS; } } @@ -1435,6 +1451,7 @@ XhciDelAllAsyncIntTransfers ( LIST_ENTRY *Entry; LIST_ENTRY *Next; URB *Urb; + VOID *UrbData; EFI_STATUS Status; BASE_LIST_FOR_EACH_SAFE (Entry, Next, &Xhc->AsyncIntTransfers) { @@ -1450,8 +1467,15 @@ XhciDelAllAsyncIntTransfers ( } RemoveEntryList (&Urb->UrbList); - FreePool (Urb->Data); + // + // For `XhciDelAllAsyncIntTransfers`, the URB is created through `XhciInsertAsyncIntTransfer` + // and allocates and manages its own data buffer, so free it here. + // + UrbData = Urb->Data; XhcFreeUrb (Xhc, Urb); + if (UrbData != NULL) { + FreePool (UrbData); + } } } From 6d37ca427eac6b60be27ef8fc266a3157f23b040 Mon Sep 17 00:00:00 2001 From: Sherry Fan Date: Thu, 31 Jul 2025 11:15:42 -0700 Subject: [PATCH 0359/1172] MdeModulePkg: XhciDxe: Fix USB reset issue: callback / update order As noted in the comment above the callback invocation, the URB's callback may free the URB, so any operations, including updates, must occur before the callback. Signed-off-by: Sherry Fan --- MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c | 28 +++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c index e0171d669979..af1b6d43712d 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c +++ b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c @@ -1655,6 +1655,17 @@ XhcMonitorAsyncRequests ( Xhc = (USB_XHCI_INSTANCE *)Context; BASE_LIST_FOR_EACH_SAFE (Entry, Next, &Xhc->AsyncIntTransfers) { + // + // Save values passed into the callback. + // `XhcUpdateAsyncRequest` must be called before the callback + // since the callback may free the URB, leading to a fault. + // However, the callback depends on values of the URB *before* + // `XhcUpdateAsyncRequest` is called, so we must save a copy. + // + UINTN cbCompleted; + UINT32 cbResult; + VOID *cbContext; + Urb = EFI_LIST_CONTAINER (Entry, URB, UrbList); // @@ -1706,6 +1717,19 @@ XhcMonitorAsyncRequests ( CopyMem (ProcBuf, Urb->Data, Urb->Completed); } + // + // Store values of URB before `XhcUpdateAsyncRequest`, since the callback depends on these values. + // + cbCompleted = Urb->Completed; + cbResult = Urb->Result; + cbContext = Urb->Context; + + // + // The update call must occur before the callback since the callback + // may remove and free the URB, leading to a fault. + // + XhcUpdateAsyncRequest (Xhc, Urb); + // // Leave error recovery to its related device driver. A // common case of the error recovery is to re-submit the @@ -1722,15 +1746,13 @@ XhcMonitorAsyncRequests ( // his callback. Some drivers may has a lower TPL restriction. // gBS->RestoreTPL (OldTpl); - (Urb->Callback)(ProcBuf, Urb->Completed, Urb->Context, Urb->Result); + (Urb->Callback)(ProcBuf, cbCompleted, cbContext, cbResult); OldTpl = gBS->RaiseTPL (XHC_TPL); } if (ProcBuf != NULL) { gBS->FreePool (ProcBuf); } - - XhcUpdateAsyncRequest (Xhc, Urb); } gBS->RestoreTPL (OldTpl); } From 8d984e6a5742220d2b28bd85121000136d820fcb Mon Sep 17 00:00:00 2001 From: Sherry Fan Date: Fri, 8 Aug 2025 11:00:38 -0700 Subject: [PATCH 0360/1172] MdeModulePkg: XhciDxe: Fix comment grammar in XhcMonitorAsyncRequests Clarify wording of the comment before the callback in XhcMonitorAsyncRequests. Signed-off-by: Sherry Fan --- MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c index af1b6d43712d..52551a370900 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c +++ b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c @@ -1742,8 +1742,8 @@ XhcMonitorAsyncRequests ( // if (Urb->Callback != NULL) { // - // Restore the old TPL, USB bus maybe connect device in - // his callback. Some drivers may has a lower TPL restriction. + // Restore the previous TPL. The USB bus may connect a device in its callback, + // and some drivers require a lower TPL to run correctly. // gBS->RestoreTPL (OldTpl); (Urb->Callback)(ProcBuf, cbCompleted, cbContext, cbResult); From 072ab3846c4fd86387dfd5d191dcb91e98202023 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 11 Aug 2025 10:47:01 -0700 Subject: [PATCH 0361/1172] Revert "SecurityPkg: CodeQL Fixes." This reverts commit ba6a8eb045aededbc1472cce7314ab1911f0ea1c. PR https://github.com/tianocore/edk2/pull/11307 introduced a logic change that caused regressions in FV verification on some platforms. This PR is being reverted to restore the prior logic. The Code QL fixes in https://github.com/tianocore/edk2/pull/11307 can be resubmitted without the logic change along with one commit for each type of Code QL issue being addressed. Signed-off-by: Michael D Kinney --- SecurityPkg/FvReportPei/FvReportPei.c | 25 +--- SecurityPkg/HddPassword/HddPasswordDxe.c | 26 +--- .../Library/AuthVariableLib/AuthService.c | 6 +- .../DxeImageVerificationLib.c | 13 +- .../DxeTcg2PhysicalPresenceLib.c | 111 +----------------- .../DxeTcgPhysicalPresenceLib.c | 2 +- .../DxeTpm2MeasureBootLib.c | 14 +-- .../HashInstanceLibSha1/HashInstanceLibSha1.c | 5 +- .../HashInstanceLibSha256.c | 5 +- .../HashLibBaseCryptoRouterDxe.c | 17 +-- .../HashLibBaseCryptoRouterPei.c | 22 +--- .../SecureBootVariableProvisionLib.c | 9 +- .../TcgEventLogRecordLib.c | 2 +- .../Library/Tpm12DeviceLibDTpm/Tpm12Tis.c | 2 +- .../RngDxe/Rand/AesCore.c | 7 +- .../Tcg/Opal/OpalPassword/OpalDriver.c | 2 +- SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c | 25 +--- SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c | 6 +- SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c | 6 +- SecurityPkg/Tcg/TcgConfigDxe/TcgConfigImpl.c | 16 +-- SecurityPkg/Tcg/TcgDxe/TcgDxe.c | 5 +- .../SecureBootConfigFileExplorer.c | 6 +- .../SecureBootConfigImpl.c | 46 +++----- 23 files changed, 67 insertions(+), 311 deletions(-) diff --git a/SecurityPkg/FvReportPei/FvReportPei.c b/SecurityPkg/FvReportPei/FvReportPei.c index 4376f526c0d9..50773db056bb 100644 --- a/SecurityPkg/FvReportPei/FvReportPei.c +++ b/SecurityPkg/FvReportPei/FvReportPei.c @@ -71,10 +71,7 @@ InstallPreHashFvPpi ( + HashSize; PreHashedFvPpi = AllocatePool (PpiSize); - if (PreHashedFvPpi == NULL) { - ASSERT (PreHashedFvPpi != NULL); - return; - } + ASSERT (PreHashedFvPpi != NULL); PreHashedFvPpi->FvBase = (UINT32)(UINTN)FvBuffer; PreHashedFvPpi->FvLength = (UINT32)FvLength; @@ -86,11 +83,7 @@ InstallPreHashFvPpi ( CopyMem (HASH_VALUE_PTR (HashInfo), HashValue, HashSize); FvInfoPpiDescriptor = AllocatePool (sizeof (EFI_PEI_PPI_DESCRIPTOR)); - if (FvInfoPpiDescriptor == NULL) { - ASSERT (FvInfoPpiDescriptor != NULL); - FreePool (PreHashedFvPpi); - return; - } + ASSERT (FvInfoPpiDescriptor != NULL); FvInfoPpiDescriptor->Guid = &gEdkiiPeiFirmwareVolumeInfoPrehashedFvPpiGuid; FvInfoPpiDescriptor->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; @@ -209,11 +202,8 @@ VerifyHashedFv ( // Copy FV to permanent memory to avoid potential TOC/TOU. // FvBuffer = AllocatePages (EFI_SIZE_TO_PAGES ((UINTN)FvInfo[FvIndex].Length)); - if (FvBuffer == NULL) { - ASSERT (FvBuffer != NULL); - Status = EFI_OUT_OF_RESOURCES; - goto Done; - } + + ASSERT (FvBuffer != NULL); if (FvShadowPpi != NULL) { Status = FvShadowPpi->FirmwareVolumeShadow ( @@ -389,17 +379,12 @@ CheckStoredHashFv ( ); if (!EFI_ERROR (Status) && (StoredHashFvPpi != NULL) && (StoredHashFvPpi->FvNumber > 0)) { HashInfo = GetHashInfo (StoredHashFvPpi, BootMode); - if (HashInfo != NULL) { - Status = VerifyHashedFv ( + Status = VerifyHashedFv ( HashInfo, StoredHashFvPpi->FvInfo, StoredHashFvPpi->FvNumber, BootMode ); - } else { - Status = EFI_NOT_FOUND; - } - if (!EFI_ERROR (Status)) { DEBUG ((DEBUG_INFO, "OBB verification passed (%r)\r\n", Status)); diff --git a/SecurityPkg/HddPassword/HddPasswordDxe.c b/SecurityPkg/HddPassword/HddPasswordDxe.c index 228a9f41b1c3..6f36b5a0a28b 100644 --- a/SecurityPkg/HddPassword/HddPasswordDxe.c +++ b/SecurityPkg/HddPassword/HddPasswordDxe.c @@ -149,10 +149,7 @@ BuildHddPasswordDeviceInfo ( S3InitDevicesExist = FALSE; } else if (Status == EFI_BUFFER_TOO_SMALL) { S3InitDevices = AllocatePool (S3InitDevicesLength); - if (S3InitDevices == NULL) { - ASSERT (S3InitDevices != NULL); - return; - } + ASSERT (S3InitDevices != NULL); Status = RestoreLockBox ( &gS3StorageDeviceInitListGuid, @@ -187,10 +184,7 @@ BuildHddPasswordDeviceInfo ( FreePool (S3InitDevicesBak); } - if (S3InitDevices == NULL) { - ASSERT (S3InitDevices != NULL); - return; - } + ASSERT (S3InitDevices != NULL); TempDevInfo = (HDD_PASSWORD_DEVICE_INFO *)((UINTN)TempDevInfo + sizeof (HDD_PASSWORD_DEVICE_INFO) + @@ -2201,14 +2195,8 @@ HddPasswordFormExtractConfig ( // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator // ConfigRequestHdr = HiiConstructConfigHdr (&mHddPasswordVendorGuid, mHddPasswordVendorStorageName, Private->DriverHandle); - if (ConfigRequestHdr == NULL) { - ASSERT (ConfigRequestHdr != NULL); - FreePool (IfrData); - return EFI_OUT_OF_RESOURCES; - } - - Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); - ConfigRequest = AllocateZeroPool (Size); + Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); + ConfigRequest = AllocateZeroPool (Size); ASSERT (ConfigRequest != NULL); AllocatedRequest = TRUE; UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize); @@ -2398,11 +2386,7 @@ HddPasswordFormCallback ( // In case goto the device configuration form, update the device form title. // ConfigFormEntry = HddPasswordGetConfigFormEntryByIndex ((UINT32)(QuestionId - KEY_HDD_DEVICE_ENTRY_BASE)); - if (ConfigFormEntry == NULL) { - ASSERT (ConfigFormEntry != NULL); - FreePool (IfrData); - return EFI_NOT_FOUND; - } + ASSERT (ConfigFormEntry != NULL); DeviceFormTitleToken = (EFI_STRING_ID)STR_HDD_SECURITY_HD; HiiSetString (Private->HiiHandle, DeviceFormTitleToken, ConfigFormEntry->HddString, NULL); diff --git a/SecurityPkg/Library/AuthVariableLib/AuthService.c b/SecurityPkg/Library/AuthVariableLib/AuthService.c index 2d79cc1dc9db..706cb6799b4c 100644 --- a/SecurityPkg/Library/AuthVariableLib/AuthService.c +++ b/SecurityPkg/Library/AuthVariableLib/AuthService.c @@ -553,7 +553,7 @@ CheckSignatureListFormat ( // Walk through the input signature list and check the data format. // If any signature is incorrectly formed, the whole check will fail. // - while ((SigDataSize > 0) && (SigDataSize >= (UINTN)SigList->SignatureListSize)) { + while ((SigDataSize > 0) && (SigDataSize >= SigList->SignatureListSize)) { for (Index = 0; Index < (sizeof (mSupportSigItem) / sizeof (EFI_SIGNATURE_ITEM)); Index++ ) { if (CompareGuid (&SigList->SignatureType, &mSupportSigItem[Index].SigType)) { // @@ -1088,7 +1088,7 @@ FilterSignatureList ( Tail = TempData; NewCertList = (EFI_SIGNATURE_LIST *)NewData; - while ((*NewDataSize > 0) && (*NewDataSize >= (UINTN)NewCertList->SignatureListSize)) { + while ((*NewDataSize > 0) && (*NewDataSize >= NewCertList->SignatureListSize)) { NewCert = (EFI_SIGNATURE_DATA *)((UINT8 *)NewCertList + sizeof (EFI_SIGNATURE_LIST) + NewCertList->SignatureHeaderSize); NewCertCount = (NewCertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - NewCertList->SignatureHeaderSize) / NewCertList->SignatureSize; @@ -1098,7 +1098,7 @@ FilterSignatureList ( Size = DataSize; CertList = (EFI_SIGNATURE_LIST *)Data; - while ((Size > 0) && (Size >= (UINTN)CertList->SignatureListSize)) { + while ((Size > 0) && (Size >= CertList->SignatureListSize)) { if (CompareGuid (&CertList->SignatureType, &NewCertList->SignatureType) && (CertList->SignatureSize == NewCertList->SignatureSize)) { diff --git a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c index 5ac6dda5c509..46d39cd96f4e 100644 --- a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c +++ b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.c @@ -883,7 +883,7 @@ IsCertHashFoundInDbx ( return Status; } - while ((DbxSize > 0) && (SignatureListSize >= (UINTN)DbxList->SignatureListSize)) { + while ((DbxSize > 0) && (SignatureListSize >= DbxList->SignatureListSize)) { // // Determine Hash Algorithm of Certificate in the forbidden database. // @@ -1028,7 +1028,7 @@ IsSignatureFoundInDatabase ( // Enumerate all signature data in SigDB to check if signature exists for executable. // CertList = (EFI_SIGNATURE_LIST *)Data; - while ((DataSize > 0) && (DataSize >= (UINTN)CertList->SignatureListSize)) { + while ((DataSize > 0) && (DataSize >= CertList->SignatureListSize)) { CertCount = (CertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize; Cert = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize); if ((CertList->SignatureSize == sizeof (EFI_SIGNATURE_DATA) - 1 + SignatureSize) && (CompareGuid (&CertList->SignatureType, CertType))) { @@ -1193,7 +1193,7 @@ PassTimestampCheck ( } CertList = (EFI_SIGNATURE_LIST *)DbtData; - while ((DbtDataSize > 0) && (DbtDataSize >= (UINTN)CertList->SignatureListSize)) { + while ((DbtDataSize > 0) && (DbtDataSize >= CertList->SignatureListSize)) { if (CompareGuid (&CertList->SignatureType, &gEfiCertX509Guid)) { Cert = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize); CertCount = (CertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize; @@ -1319,7 +1319,7 @@ IsForbiddenByDbx ( // CertList = (EFI_SIGNATURE_LIST *)Data; CertListSize = DataSize; - while ((CertListSize > 0) && (CertListSize >= (UINTN)CertList->SignatureListSize)) { + while ((CertListSize > 0) && (CertListSize >= CertList->SignatureListSize)) { if (CompareGuid (&CertList->SignatureType, &gEfiCertX509Guid)) { CertData = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize); CertCount = (CertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize; @@ -1524,7 +1524,7 @@ IsAllowedByDb ( // Find X509 certificate in Signature List to verify the signature in pkcs7 signed data. // CertList = (EFI_SIGNATURE_LIST *)Data; - while ((DataSize > 0) && (DataSize >= (UINTN)CertList->SignatureListSize)) { + while ((DataSize > 0) && (DataSize >= CertList->SignatureListSize)) { if (CompareGuid (&CertList->SignatureType, &gEfiCertX509Guid)) { CertData = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize); CertCount = (CertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize; @@ -2057,9 +2057,8 @@ DxeImageVerificationHandler ( // executable information table in either case. // NameStr = ConvertDevicePathToText (File, FALSE, TRUE); - + AddImageExeInfo (Action, NameStr, File, SignatureList, SignatureListSize); if (NameStr != NULL) { - AddImageExeInfo (Action, NameStr, File, SignatureList, SignatureListSize); DEBUG ((DEBUG_INFO, "The image doesn't pass verification: %s\n", NameStr)); FreePool (NameStr); } diff --git a/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c b/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c index f81519d1b0bc..de4f5e583d51 100644 --- a/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c +++ b/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c @@ -387,10 +387,7 @@ Tcg2UserConfirm ( NoPpiInfo = FALSE; BufSize = CONFIRM_BUFFER_SIZE; ConfirmText = AllocateZeroPool (BufSize); - if (ConfirmText == NULL) { - ASSERT (ConfirmText != NULL); - return FALSE; - } + ASSERT (ConfirmText != NULL); mTcg2PpStringPackHandle = HiiAddPackages (&gEfiTcg2PhysicalPresenceGuid, gImageHandle, DxeTcg2PhysicalPresenceLibStrings, NULL); ASSERT (mTcg2PpStringPackHandle != NULL); @@ -404,20 +401,10 @@ Tcg2UserConfirm ( TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_CLEAR)); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_HEAD_STR)); - if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) { - FreePool (ConfirmText); - return FALSE; - } - UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2); FreePool (TmpStr1); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_WARNING_CLEAR)); - if (TmpStr1 == NULL) { - FreePool (ConfirmText); - return FALSE; - } - StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), L" \n\n", (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); @@ -430,29 +417,14 @@ Tcg2UserConfirm ( TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_CLEAR)); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_PPI_HEAD_STR)); - if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) { - FreePool (ConfirmText); - return FALSE; - } - UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2); FreePool (TmpStr1); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_NOTE_CLEAR)); - if (TmpStr1 == NULL) { - FreePool (ConfirmText); - return FALSE; - } - StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_WARNING_CLEAR)); - if (TmpStr1 == NULL) { - FreePool (ConfirmText); - return FALSE; - } - StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), L" \n\n", (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); @@ -480,29 +452,14 @@ Tcg2UserConfirm ( TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_SET_PCR_BANKS)); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_HEAD_STR)); - if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) { - FreePool (ConfirmText); - return FALSE; - } - UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2); FreePool (TmpStr1); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_WARNING_SET_PCR_BANKS_1)); - if (TmpStr1 == NULL) { - FreePool (ConfirmText); - return FALSE; - } - StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_WARNING_SET_PCR_BANKS_2)); - if (TmpStr1 == NULL) { - FreePool (ConfirmText); - return FALSE; - } - StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); @@ -510,11 +467,7 @@ Tcg2UserConfirm ( Tcg2FillBufferWithBootHashAlg (TempBuffer2, sizeof (TempBuffer2), CurrentPCRBanks); TmpStr1 = AllocateZeroPool (BufSize); - if (TmpStr1 == NULL) { - ASSERT (TmpStr1 != NULL); - return FALSE; - } - + ASSERT (TmpStr1 != NULL); UnicodeSPrint (TmpStr1, BufSize, L"Current PCRBanks is 0x%x. (%s)\nNew PCRBanks is 0x%x. (%s)\n", CurrentPCRBanks, TempBuffer2, TpmPpCommandParameter, TempBuffer); StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); @@ -528,29 +481,14 @@ Tcg2UserConfirm ( TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_CHANGE_EPS)); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_HEAD_STR)); - if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) { - FreePool (ConfirmText); - return FALSE; - } - UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2); FreePool (TmpStr1); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_WARNING_CHANGE_EPS_1)); - if (TmpStr1 == NULL) { - FreePool (ConfirmText); - return FALSE; - } - StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_WARNING_CHANGE_EPS_2)); - if (TmpStr1 == NULL) { - FreePool (ConfirmText); - return FALSE; - } - StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); @@ -560,11 +498,6 @@ Tcg2UserConfirm ( TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_ENABLE_BLOCK_SID)); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_HEAD_STR)); - if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) { - FreePool (ConfirmText); - return FALSE; - } - UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2); FreePool (TmpStr1); break; @@ -573,11 +506,6 @@ Tcg2UserConfirm ( TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_DISABLE_BLOCK_SID)); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_HEAD_STR)); - if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) { - FreePool (ConfirmText); - return FALSE; - } - UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2); FreePool (TmpStr1); break; @@ -587,11 +515,6 @@ Tcg2UserConfirm ( TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_PP_ENABLE_BLOCK_SID)); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_PPI_HEAD_STR)); - if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) { - FreePool (ConfirmText); - return FALSE; - } - UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2); FreePool (TmpStr1); break; @@ -601,11 +524,6 @@ Tcg2UserConfirm ( TmpStr2 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_PP_DISABLE_BLOCK_SID)); TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_PPI_HEAD_STR)); - if ((TmpStr1 == NULL) || (TmpStr2 == NULL)) { - FreePool (ConfirmText); - return FALSE; - } - UnicodeSPrint (ConfirmText, BufSize, TmpStr1, TmpStr2); FreePool (TmpStr1); break; @@ -626,21 +544,11 @@ Tcg2UserConfirm ( TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_ACCEPT_KEY)); } - if (TmpStr1 == NULL) { - FreePool (ConfirmText); - return FALSE; - } - StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); if (NoPpiInfo) { TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TPM_NO_PPI_INFO)); - if (TmpStr1 == NULL) { - FreePool (ConfirmText); - return FALSE; - } - StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); } @@ -653,21 +561,11 @@ Tcg2UserConfirm ( TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_ACCEPT_KEY)); } - if (TmpStr1 == NULL) { - FreePool (ConfirmText); - return FALSE; - } - StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); if (NoPpiInfo) { TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_NO_PPI_INFO)); - if (TmpStr1 == NULL) { - FreePool (ConfirmText); - return FALSE; - } - StrnCatS (ConfirmText, BufSize / sizeof (CHAR16), TmpStr1, (BufSize / sizeof (CHAR16)) - StrLen (ConfirmText) - 1); FreePool (TmpStr1); } @@ -675,11 +573,6 @@ Tcg2UserConfirm ( TmpStr1 = Tcg2PhysicalPresenceGetStringById (STRING_TOKEN (TCG_STORAGE_REJECT_KEY)); } - if (TmpStr1 == NULL) { - FreePool (ConfirmText); - return FALSE; - } - BufSize -= StrSize (ConfirmText); UnicodeSPrint (ConfirmText + StrLen (ConfirmText), BufSize, TmpStr1, TmpStr2); diff --git a/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.c b/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.c index d38a6073df80..597ce77b4b49 100644 --- a/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.c +++ b/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.c @@ -540,7 +540,7 @@ UserConfirm ( CHAR16 *TmpStr2; UINTN BufSize; BOOLEAN CautionKey; - UINTN Index; + UINT16 Index; CHAR16 DstStr[81]; TmpStr2 = NULL; diff --git a/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c b/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c index b8eb5d6ee239..acba11d69561 100644 --- a/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c +++ b/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.c @@ -615,9 +615,6 @@ GetMeasureBootProtocols ( @retval EFI_SUCCESS The file specified by DevicePath and non-NULL FileBuffer did authenticate, and the platform policy dictates that the DXE Foundation may use the file. - - @retval EFI_OUT_OF_RESOURCES A necessary memory buffer could not be allocated. - @retval other error value **/ EFI_STATUS @@ -711,16 +708,9 @@ DxeTpm2MeasureBootHandler ( } } - if (OrigDevicePathNode != NULL) { - FreePool (OrigDevicePathNode); - } - + FreePool (OrigDevicePathNode); OrigDevicePathNode = DuplicateDevicePath (File); - if (OrigDevicePathNode == NULL) { - ASSERT (OrigDevicePathNode != NULL); - return EFI_OUT_OF_RESOURCES; - } - + ASSERT (OrigDevicePathNode != NULL); break; } } diff --git a/SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.c b/SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.c index 7b00833dd2ec..c786c2189c4f 100644 --- a/SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.c +++ b/SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.c @@ -56,10 +56,7 @@ Sha1HashInit ( CtxSize = Sha1GetContextSize (); Sha1Ctx = AllocatePool (CtxSize); - if (Sha1Ctx == NULL) { - ASSERT (Sha1Ctx != NULL); - return EFI_OUT_OF_RESOURCES; - } + ASSERT (Sha1Ctx != NULL); Sha1Init (Sha1Ctx); diff --git a/SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.c b/SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.c index 4fdc5a8ea5cf..43877400011a 100644 --- a/SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.c +++ b/SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.c @@ -56,10 +56,7 @@ Sha256HashInit ( CtxSize = Sha256GetContextSize (); Sha256Ctx = AllocatePool (CtxSize); - if (Sha256Ctx == NULL) { - ASSERT (Sha256Ctx != NULL); - return EFI_OUT_OF_RESOURCES; - } + ASSERT (Sha256Ctx != NULL); Sha256Init (Sha256Ctx); diff --git a/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c b/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c index 5e0bbe5eb062..2169c5e18590 100644 --- a/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c +++ b/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.c @@ -80,11 +80,6 @@ HashStart ( for (Index = 0; Index < mHashInterfaceCount; Index++) { HashMask = Tpm2GetHashMaskFromAlgo (&mHashInterface[Index].HashGuid); - if (HashCtx == NULL) { - // If we fail to get the hash mask we don't have resources. - return EFI_OUT_OF_RESOURCES; - } - if ((HashMask & PcdGet32 (PcdTpm2HashMask)) != 0) { mHashInterface[Index].HashInit (&HashCtx[Index]); } @@ -283,16 +278,8 @@ HashAndExtend ( CheckSupportedHashMaskMismatch (); - Status = HashStart (&HashHandle); - if (EFI_ERROR (Status)) { - return Status; - } - - Status = HashUpdate (HashHandle, DataToHash, DataToHashLen); - if (EFI_ERROR (Status)) { - return Status; - } - + HashStart (&HashHandle); + HashUpdate (HashHandle, DataToHash, DataToHashLen); Status = HashCompleteAndExtend (HashHandle, PcrIndex, NULL, 0, DigestList); return Status; diff --git a/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.c b/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.c index 156dc040b2f0..eeb424b6c3f2 100644 --- a/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.c +++ b/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.c @@ -106,10 +106,7 @@ CheckSupportedHashMaskMismatch ( HASH_INTERFACE_HOB *HashInterfaceHobLast; HashInterfaceHobLast = InternalGetHashInterfaceHob (&gZeroGuid); - if (HashInterfaceHobLast == NULL) { - ASSERT (HashInterfaceHobLast != NULL); - return; - } + ASSERT (HashInterfaceHobLast != NULL); if ((HashInterfaceHobLast->SupportedHashMask != 0) && (HashInterfaceHobCurrent->SupportedHashMask != HashInterfaceHobLast->SupportedHashMask)) @@ -155,10 +152,7 @@ HashStart ( CheckSupportedHashMaskMismatch (HashInterfaceHob); HashCtx = AllocatePool (sizeof (*HashCtx) * HashInterfaceHob->HashInterfaceCount); - if (HashCtx == NULL) { - ASSERT (HashCtx != NULL); - return EFI_OUT_OF_RESOURCES; - } + ASSERT (HashCtx != NULL); for (Index = 0; Index < HashInterfaceHob->HashInterfaceCount; Index++) { HashMask = Tpm2GetHashMaskFromAlgo (&HashInterfaceHob->HashInterface[Index].HashGuid); @@ -311,16 +305,8 @@ HashAndExtend ( CheckSupportedHashMaskMismatch (HashInterfaceHob); - Status = HashStart (&HashHandle); - if (EFI_ERROR (Status)) { - return Status; - } - - Status = HashUpdate (HashHandle, DataToHash, DataToHashLen); - if (EFI_ERROR (Status)) { - return Status; - } - + HashStart (&HashHandle); + HashUpdate (HashHandle, DataToHash, DataToHashLen); Status = HashCompleteAndExtend (HashHandle, PcrIndex, NULL, 0, DigestList); return Status; diff --git a/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.c b/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.c index e45e975beffd..7f9fdd22d7fe 100644 --- a/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.c +++ b/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.c @@ -59,11 +59,7 @@ SecureBootFetchData ( *SigListOut = NULL; *SigListsSize = 0; CertInfo = AllocatePool (sizeof (SECURE_BOOT_CERTIFICATE_INFO)); - if (CertInfo == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - NewCertInfo = CertInfo; + NewCertInfo = CertInfo; while (1) { if (NewCertInfo == NULL) { Status = EFI_OUT_OF_RESOURCES; @@ -97,9 +93,6 @@ SecureBootFetchData ( sizeof (SECURE_BOOT_CERTIFICATE_INFO) * (KeyIndex + 1), CertInfo ); - if (NewCertInfo == NULL) { - goto Cleanup; - } } if (Status == EFI_NOT_FOUND) { diff --git a/SecurityPkg/Library/TcgEventLogRecordLib/TcgEventLogRecordLib.c b/SecurityPkg/Library/TcgEventLogRecordLib/TcgEventLogRecordLib.c index cbe1da3aa383..e1e0f990d313 100644 --- a/SecurityPkg/Library/TcgEventLogRecordLib/TcgEventLogRecordLib.c +++ b/SecurityPkg/Library/TcgEventLogRecordLib/TcgEventLogRecordLib.c @@ -106,7 +106,7 @@ MeasureFirmwareBlob ( { if (Description != NULL) { AsciiSPrint ((CHAR8 *)FvBlob2.BlobDescription, sizeof (FvBlob2.BlobDescription), "%a", Description); - } else if (FvName != NULL) { + } else { AsciiSPrint ((CHAR8 *)FvBlob2.BlobDescription, sizeof (FvBlob2.BlobDescription), "Fv(%g)", FvName); } diff --git a/SecurityPkg/Library/Tpm12DeviceLibDTpm/Tpm12Tis.c b/SecurityPkg/Library/Tpm12DeviceLibDTpm/Tpm12Tis.c index 5eb1a0b51d93..64bea73d7957 100644 --- a/SecurityPkg/Library/Tpm12DeviceLibDTpm/Tpm12Tis.c +++ b/SecurityPkg/Library/Tpm12DeviceLibDTpm/Tpm12Tis.c @@ -270,7 +270,7 @@ Tpm12TisTpmCommand ( { EFI_STATUS Status; UINT16 BurstCount; - UINTN Index; + UINT32 Index; UINT32 TpmOutSize; UINT16 Data16; UINT32 Data32; diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/AesCore.c b/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/AesCore.c index 1b2cddf3da26..3ac20e889cf1 100644 --- a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/AesCore.c +++ b/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/AesCore.c @@ -230,8 +230,6 @@ AesEncrypt ( UINTN NbIndex; UINTN Round; - EFI_STATUS Status; - if ((Key == NULL) || (InData == NULL) || (OutData == NULL)) { return EFI_INVALID_PARAMETER; } @@ -239,10 +237,7 @@ AesEncrypt ( // // Expands AES Key for encryption. // - Status = AesExpandKey (Key, 128, &AesKey); - if (EFI_ERROR (Status)) { - return Status; - } + AesExpandKey (Key, 128, &AesKey); Nr = AesKey.Nk + 6; Ek = AesKey.EncKey; diff --git a/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c b/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c index c41fe6f00571..7b48002bee85 100644 --- a/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c +++ b/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c @@ -2224,7 +2224,7 @@ ProcessOpalRequest ( // TempVariable = Variable; while ((VariableSize > sizeof (OPAL_REQUEST_VARIABLE)) && - (VariableSize >= (UINTN)TempVariable->Length) && + (VariableSize >= TempVariable->Length) && (TempVariable->Length > sizeof (OPAL_REQUEST_VARIABLE))) { DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *)((UINTN)TempVariable + sizeof (OPAL_REQUEST_VARIABLE)); diff --git a/SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c b/SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c index c5f11215bd9f..1e0b00b3f7aa 100644 --- a/SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c +++ b/SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c @@ -113,7 +113,7 @@ GetSavedOpalRequest ( TempVariable = Variable; while ((VariableSize > sizeof (OPAL_REQUEST_VARIABLE)) && - (VariableSize >= (UINTN)TempVariable->Length) && + (VariableSize >= TempVariable->Length) && (TempVariable->Length > sizeof (OPAL_REQUEST_VARIABLE))) { DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *)((UINTN)TempVariable + sizeof (OPAL_REQUEST_VARIABLE)); @@ -193,7 +193,7 @@ SaveOpalRequest ( TempVariable = Variable; TempVariableSize = VariableSize; while ((TempVariableSize > sizeof (OPAL_REQUEST_VARIABLE)) && - (TempVariableSize >= (UINTN)TempVariable->Length) && + (TempVariableSize >= TempVariable->Length) && (TempVariable->Length > sizeof (OPAL_REQUEST_VARIABLE))) { DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *)((UINTN)TempVariable + sizeof (OPAL_REQUEST_VARIABLE)); @@ -226,11 +226,7 @@ SaveOpalRequest ( DevicePathSize = GetDevicePathSize (DevicePath); NewVariableSize = VariableSize + sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize; NewVariable = AllocatePool (NewVariableSize); - if (NewVariable == NULL) { - ASSERT (NewVariable != NULL); - return; - } - + ASSERT (NewVariable != NULL); CopyMem (NewVariable, Variable, VariableSize); TempVariable = (OPAL_REQUEST_VARIABLE *)((UINTN)NewVariable + VariableSize); TempVariable->Length = (UINT32)(sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize); @@ -243,11 +239,7 @@ SaveOpalRequest ( DevicePathSize = GetDevicePathSize (DevicePath); NewVariableSize = sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize; NewVariable = AllocatePool (NewVariableSize); - if (NewVariable == NULL) { - ASSERT (NewVariable != NULL); - return; - } - + ASSERT (NewVariable != NULL); NewVariable->Length = (UINT32)(sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize); CopyMem (&NewVariable->OpalRequest, &OpalRequest, sizeof (OPAL_REQUEST)); DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *)((UINTN)NewVariable + sizeof (OPAL_REQUEST_VARIABLE)); @@ -1119,13 +1111,8 @@ ExtractConfig ( // DriverHandle = HiiGetDriverImageHandleCB (); ConfigRequestHdr = HiiConstructConfigHdr (&gHiiSetupVariableGuid, OpalPasswordStorageName, DriverHandle); - if (ConfigRequestHdr == NULL) { - ASSERT (ConfigRequestHdr != NULL); - return EFI_OUT_OF_RESOURCES; - } - - Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); - ConfigRequest = AllocateZeroPool (Size); + Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); + ConfigRequest = AllocateZeroPool (Size); if (ConfigRequest == NULL) { return EFI_OUT_OF_RESOURCES; } diff --git a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c index 2b93733bb95a..edf5f0fc77ca 100644 --- a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c +++ b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c @@ -103,11 +103,7 @@ InitializeTcg2VersionInfo ( TCG2_VERSION_NAME, PrivateData->DriverHandle ); - if (ConfigRequestHdr == NULL) { - ASSERT (ConfigRequestHdr != NULL); - return; - } - + ASSERT (ConfigRequestHdr != NULL); DataSize = sizeof (Tcg2Version); Status = gRT->GetVariable ( TCG2_VERSION_NAME, diff --git a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c index 2a0307c6e953..85a852842d50 100644 --- a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c +++ b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c @@ -626,7 +626,7 @@ DumpEventLog ( TCG_PCR_EVENT_HDR *EventHdr; TCG_PCR_EVENT2 *TcgPcrEvent2; TCG_EfiSpecIDEventStruct *TcgEfiSpecIdEventStruct; - UINT64 NumberOfEvents; + UINTN NumberOfEvents; if (!DebugPrintLevelEnabled (DEBUG_SECURITY)) { return; @@ -637,7 +637,7 @@ DumpEventLog ( switch (EventLogFormat) { case EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2: EventHdr = (TCG_PCR_EVENT_HDR *)(UINTN)EventLogLocation; - while ((EFI_PHYSICAL_ADDRESS)(UINTN)EventHdr <= EventLogLastEntry) { + while ((UINTN)EventHdr <= EventLogLastEntry) { DumpEvent (EventHdr); EventHdr = (TCG_PCR_EVENT_HDR *)((UINTN)EventHdr + sizeof (TCG_PCR_EVENT_HDR) + EventHdr->EventSize); } @@ -668,7 +668,7 @@ DumpEventLog ( DumpTcgEfiSpecIdEventStruct (TcgEfiSpecIdEventStruct); TcgPcrEvent2 = (TCG_PCR_EVENT2 *)((UINTN)TcgEfiSpecIdEventStruct + GetTcgEfiSpecIdEventStructSize (TcgEfiSpecIdEventStruct)); - while ((EFI_PHYSICAL_ADDRESS)(UINTN)TcgPcrEvent2 <= EventLogLastEntry) { + while ((UINTN)TcgPcrEvent2 <= EventLogLastEntry) { DumpEvent2 (TcgPcrEvent2); TcgPcrEvent2 = (TCG_PCR_EVENT2 *)((UINTN)TcgPcrEvent2 + GetPcrEvent2Size (TcgPcrEvent2)); } diff --git a/SecurityPkg/Tcg/TcgConfigDxe/TcgConfigImpl.c b/SecurityPkg/Tcg/TcgConfigDxe/TcgConfigImpl.c index 2b4164c4e724..52ea1ac3aeaf 100644 --- a/SecurityPkg/Tcg/TcgConfigDxe/TcgConfigImpl.c +++ b/SecurityPkg/Tcg/TcgConfigDxe/TcgConfigImpl.c @@ -193,19 +193,9 @@ TcgExtractConfig ( // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator // ConfigRequestHdr = HiiConstructConfigHdr (&gTcgConfigFormSetGuid, mTcgStorageName, PrivateData->DriverHandle); - if (ConfigRequestHdr == NULL) { - ASSERT (ConfigRequestHdr != NULL); - return EFI_OUT_OF_RESOURCES; - } - - Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); - ConfigRequest = AllocateZeroPool (Size); - if (ConfigRequest == NULL) { - ASSERT (ConfigRequest != NULL); - FreePool (ConfigRequestHdr); - return EFI_OUT_OF_RESOURCES; - } - + Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); + ConfigRequest = AllocateZeroPool (Size); + ASSERT (ConfigRequest != NULL); AllocatedRequest = TRUE; UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, sizeof (TCG_CONFIGURATION)); FreePool (ConfigRequestHdr); diff --git a/SecurityPkg/Tcg/TcgDxe/TcgDxe.c b/SecurityPkg/Tcg/TcgDxe/TcgDxe.c index ea4516a3db8b..ee6c6273033b 100644 --- a/SecurityPkg/Tcg/TcgDxe/TcgDxe.c +++ b/SecurityPkg/Tcg/TcgDxe/TcgDxe.c @@ -286,10 +286,7 @@ TpmCommHashAll ( CtxSize = Sha1GetContextSize (); Sha1Ctx = AllocatePool (CtxSize); - if (Sha1Ctx == NULL) { - ASSERT (Sha1Ctx != NULL); - return EFI_OUT_OF_RESOURCES; - } + ASSERT (Sha1Ctx != NULL); Sha1Init (Sha1Ctx); Sha1Update (Sha1Ctx, Data, DataLen); diff --git a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigFileExplorer.c b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigFileExplorer.c index 65b3f81b6e6e..5a23dc517aa7 100644 --- a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigFileExplorer.c +++ b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigFileExplorer.c @@ -98,11 +98,7 @@ ExtractFileNameFromDevicePath ( ASSERT (DevicePath != NULL); - String = DevicePathToStr (DevicePath); - if (String == NULL) { - return NULL; - } - + String = DevicePathToStr (DevicePath); MatchString = String; LastMatch = String; FileName = NULL; diff --git a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c index e79932d5fe59..d262904c3138 100644 --- a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c +++ b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c @@ -1095,7 +1095,7 @@ IsSignatureFoundInDatabase ( // Enumerate all signature data in SigDB to check if signature exists for executable. // CertList = (EFI_SIGNATURE_LIST *)Data; - while ((DataSize > 0) && (DataSize >= (UINTN)CertList->SignatureListSize)) { + while ((DataSize > 0) && (DataSize >= CertList->SignatureListSize)) { CertCount = (CertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize; Cert = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize); if ((CertList->SignatureSize == sizeof (EFI_SIGNATURE_DATA) - 1 + SignatureSize) && (CompareGuid (&CertList->SignatureType, &gEfiCertX509Guid))) { @@ -1173,10 +1173,7 @@ CalculateCertHash ( // CtxSize = mHash[HashAlg].GetContextSize (); HashCtx = AllocatePool (CtxSize); - if (HashCtx == NULL) { - ASSERT (HashCtx != NULL); - return FALSE; - } + ASSERT (HashCtx != NULL); // // 2. Initialize a hash context. @@ -1264,7 +1261,7 @@ IsCertHashFoundInDbx ( // Check whether the certificate hash exists in the forbidden database. // DbxList = (EFI_SIGNATURE_LIST *)Data; - while ((DataSize > 0) && (DataSize >= (UINTN)DbxList->SignatureListSize)) { + while ((DataSize > 0) && (DataSize >= DbxList->SignatureListSize)) { // // Determine Hash Algorithm of Certificate in the forbidden database. // @@ -1351,7 +1348,7 @@ GetSignaturelistOffset ( SigList = Database; SiglistSize = DatabaseSize; - while ((SiglistSize > 0) && (SiglistSize >= (UINTN)SigList->SignatureListSize)) { + while ((SiglistSize > 0) && (SiglistSize >= SigList->SignatureListSize)) { if (CompareGuid (&SigList->SignatureType, SignatureType)) { *Offset = DatabaseSize - SiglistSize; return TRUE; @@ -1891,10 +1888,7 @@ HashPeImage ( CtxSize = mHash[HashAlg].GetContextSize (); HashCtx = AllocatePool (CtxSize); - if (HashCtx == NULL) { - ASSERT (HashCtx != NULL); - goto Done; - } + ASSERT (HashCtx != NULL); // 1. Load the image header into memory. @@ -2546,7 +2540,7 @@ UpdateDeletePage ( ) { EFI_STATUS Status; - UINTN Index; + UINT32 Index; UINTN CertCount; UINTN GuidIndex; VOID *StartOpCodeHandle; @@ -2730,7 +2724,7 @@ DeleteKeyExchangeKey ( UINT8 *Data; UINT8 *OldData; UINT32 Attr; - UINTN Index; + UINT32 Index; EFI_SIGNATURE_LIST *CertList; EFI_SIGNATURE_LIST *NewCertList; EFI_SIGNATURE_DATA *Cert; @@ -2934,7 +2928,7 @@ DeleteSignature ( UINT8 *Data; UINT8 *OldData; UINT32 Attr; - UINTN Index; + UINT32 Index; EFI_SIGNATURE_LIST *CertList; EFI_SIGNATURE_LIST *NewCertList; EFI_SIGNATURE_DATA *Cert; @@ -3212,7 +3206,7 @@ DeleteSignatureEx ( // // Traverse to target EFI_SIGNATURE_LIST but others will be skipped. // - while ((RemainingSize > 0) && (RemainingSize >= (UINTN)ListWalker->SignatureListSize) && ListIndex < PrivateData->ListIndex) { + while ((RemainingSize > 0) && (RemainingSize >= ListWalker->SignatureListSize) && ListIndex < PrivateData->ListIndex) { CopyMem ((UINT8 *)NewVariableData + Offset, ListWalker, ListWalker->SignatureListSize); Offset += ListWalker->SignatureListSize; @@ -3519,19 +3513,9 @@ SecureBootExtractConfig ( // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator // ConfigRequestHdr = HiiConstructConfigHdr (&gSecureBootConfigFormSetGuid, mSecureBootStorageName, PrivateData->DriverHandle); - if (ConfigRequestHdr == NULL) { - ASSERT (ConfigRequestHdr != NULL); - return EFI_OUT_OF_RESOURCES; - } - - Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); - ConfigRequest = AllocateZeroPool (Size); - if (ConfigRequest == NULL) { - ASSERT (ConfigRequest != NULL); - FreePool (ConfigRequestHdr); - return EFI_OUT_OF_RESOURCES; - } - + Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); + ConfigRequest = AllocateZeroPool (Size); + ASSERT (ConfigRequest != NULL); AllocatedRequest = TRUE; UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize); FreePool (ConfigRequestHdr); @@ -3810,7 +3794,7 @@ LoadSignatureList ( RemainingSize = DataSize; ListWalker = (EFI_SIGNATURE_LIST *)VariableData; - while ((RemainingSize > 0) && (RemainingSize >= (UINTN)ListWalker->SignatureListSize)) { + while ((RemainingSize > 0) && (RemainingSize >= ListWalker->SignatureListSize)) { if (CompareGuid (&ListWalker->SignatureType, &gEfiCertRsa2048Guid)) { ListType = STRING_TOKEN (STR_LIST_TYPE_RSA2048_SHA256); } else if (CompareGuid (&ListWalker->SignatureType, &gEfiCertX509Guid)) { @@ -4226,7 +4210,7 @@ LoadSignatureData ( VOID *EndOpCodeHandle; UINTN DataSize; UINTN RemainingSize; - UINT64 Index; + UINT16 Index; UINT8 *VariableData; CHAR16 VariableName[BUFFER_MAX_SIZE]; CHAR16 NameBuffer[BUFFER_MAX_SIZE]; @@ -4310,7 +4294,7 @@ LoadSignatureData ( // // Skip signature list. // - while ((RemainingSize > 0) && (RemainingSize >= (UINTN)ListWalker->SignatureListSize) && ListIndex-- > 0) { + while ((RemainingSize > 0) && (RemainingSize >= ListWalker->SignatureListSize) && ListIndex-- > 0) { RemainingSize -= ListWalker->SignatureListSize; ListWalker = (EFI_SIGNATURE_LIST *)((UINT8 *)ListWalker + ListWalker->SignatureListSize); } From 808f1f1f87c87b4005d9bdf1076b7fc92ad64736 Mon Sep 17 00:00:00 2001 From: Patrick Rudolph Date: Fri, 15 May 2020 16:50:01 +0200 Subject: [PATCH 0362/1172] UefiPayloadPkg: Scan for Option ROMs Since on UefiPayload the full PCI enumeration isn't run, the light enumeration won't find Option ROMs. The introduced PciPlatform driver relies on completed PCI enumeration and assumes that all ROM bars have been properly assigned a free MMIO window. Installs the gPciPlatformProtocol to scan for Option ROMs during PCI enumeration light and copies found Option ROMs to runtime allocated buffers. Only for work devices that have a ROMBAR, but doesn't for devices that need a VBIOS loaded from SPI flash. TEST: QEMU can enumerate Option ROMs on VGA and NIC on UefiPayloadPkg. Signed-off-by: Patrick Rudolph --- .../PciPlatformDxe/PciPlatformDxe.c | 459 ++++++++++++++++++ .../PciPlatformDxe/PciPlatformDxe.h | 20 + .../PciPlatformDxe/PciPlatformDxe.inf | 43 ++ UefiPayloadPkg/UefiPayloadPkg.dsc | 8 + UefiPayloadPkg/UefiPayloadPkg.fdf | 4 + 5 files changed, 534 insertions(+) create mode 100644 UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.c create mode 100644 UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.h create mode 100644 UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.inf diff --git a/UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.c b/UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.c new file mode 100644 index 000000000000..05b66c0e8cb2 --- /dev/null +++ b/UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.c @@ -0,0 +1,459 @@ +/** @file + Implementation of the gEfiPciPlatformProtocol to support loading + PCI Option ROMs when full PCI enumeration is skipped. + +Copyright (c) 2025, 9elements GmbH. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + + +**/ + +#include "PciPlatformDxe.h" +#include +#include + +EFI_STATUS +EFIAPI +PciPlatformNotify ( + IN EFI_PCI_PLATFORM_PROTOCOL *This, + IN EFI_HANDLE HostBridge, + IN EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PHASE Phase, + IN EFI_PCI_EXECUTION_PHASE ExecPhase + ) +{ + return EFI_UNSUPPORTED; +} + +EFI_STATUS +EFIAPI +PciPlatformPrepController ( + IN EFI_PCI_PLATFORM_PROTOCOL *This, + IN EFI_HANDLE HostBridge, + IN EFI_HANDLE RootBridge, + IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_PCI_ADDRESS PciAddress, + IN EFI_PCI_CONTROLLER_RESOURCE_ALLOCATION_PHASE Phase, + IN EFI_PCI_EXECUTION_PHASE ExecPhase + ) +{ + return EFI_UNSUPPORTED; +} + +/** + Gets the PCI device's option ROM from a platform-specific location. + + The GetPciRom() function gets the PCI device's option ROM from a platform-specific location. + The option ROM will be loaded into memory. This member function is used to return an image + that is packaged as a PCI 2.2 option ROM. The image may contain both legacy and EFI option + ROMs. See the UEFI 2.0 Specification for details. This member function can be used to return + option ROM images for embedded controllers. Option ROMs for embedded controllers are typically + stored in platform-specific storage, and this member function can retrieve it from that storage + and return it to the PCI bus driver. The PCI bus driver will call this member function before + scanning the ROM that is attached to any controller, which allows to scan the PCI card for + ROM image and retrieve it. + + @param[in] This The pointer to the EFI_PCI_PLATFORM_PROTOCOL instance. + @param[in] PciHandle The handle of the PCI device. + @param[out] RomImage If the call succeeds, the pointer to the pointer to the option ROM image. + Otherwise, this field is undefined. The memory for RomImage is allocated + by EFI_PCI_PLATFORM_PROTOCOL.GetPciRom() using the EFI Boot Service AllocatePool(). + It is the caller's responsibility to free the memory using the EFI Boot Service + FreePool(), when the caller is done with the option ROM. + @param[out] RomSize If the call succeeds, a pointer to the size of the option ROM size. Otherwise, + this field is undefined. + + @retval EFI_SUCCESS The option ROM was available for this device and loaded into memory. + @retval EFI_NOT_FOUND No option ROM was available for this device. + @retval EFI_OUT_OF_RESOURCES No memory was available to load the option ROM. + @retval EFI_DEVICE_ERROR An error occurred in obtaining the option ROM. + +**/ +EFI_STATUS +EFIAPI +PciGetPciRom ( + IN CONST EFI_PCI_PLATFORM_PROTOCOL *This, + IN EFI_HANDLE PciHandle, + OUT VOID **RomImage, + OUT UINTN *RomSize + ) +{ + EFI_STATUS Status; + IN EFI_PCI_IO_PROTOCOL *PciIo; + UINTN PciSegment; + UINTN PciBus; + UINTN PciDevice; + UINTN PciFunction; + UINTN RomBarIndex; + UINT32 Buffer; + UINT32 AllOnes; + PCI_IO_DEVICE *PciIoDevice; + UINT8 Indicator; + UINT16 OffsetPcir; + UINT32 RomBarOffset; + UINT32 RomBar; + BOOLEAN FirstCheck; + UINT64 RomImageSize; + UINT32 LegacyImageLength; + UINT8 *RomInMemory; + UINT8 CodeType; + PCI_EXPANSION_ROM_HEADER RomHeader; + PCI_DATA_STRUCTURE RomPcir; + + // + // Check to see if RomImage is NULL + // + if (RomImage == NULL) { + return EFI_INVALID_PARAMETER; + } + + // + // Check to see if RomSize is NULL + // + if (RomSize == NULL) { + return EFI_INVALID_PARAMETER; + } + + *RomImage = NULL; + *RomSize = 0; + + Status = gBS->HandleProtocol ( + PciHandle, + &gEfiPciIoProtocolGuid, + (VOID **)&PciIo + ); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to open gEfiPciIoProtocolGuid\n", __func__)); + return EFI_UNSUPPORTED; + } + + PciIoDevice = PCI_IO_DEVICE_FROM_PCI_IO_THIS (PciIo); + + // + // Get the location of the PCI device + // + PciIo->GetLocation ( + PciIo, + &PciSegment, + &PciBus, + &PciDevice, + &PciFunction + ); + + DEBUG (( + DEBUG_VERBOSE, + "%a: PCI @ [%02x|%02x|%02x|%02x] Searching Option ROM...\n", + __func__, + PciSegment, + PciBus, + PciDevice, + PciFunction + )); + + // + // Default ROM is at 0x30 + // + RomBarIndex = PCI_EXPANSION_ROM_BASE; + + if (IS_PCI_BRIDGE (&PciIoDevice->Pci)) { + // + // If is ppb ROM is at 0x38 + // + RomBarIndex = PCI_BRIDGE_ROMBAR; + } + + // + // Backup ROM BAR + // + Status = PciIo->Pci.Read ( + PciIo, + EfiPciWidthUint32, + RomBarIndex, + 1, + &Buffer + ); + if (EFI_ERROR (Status)) { + goto CloseAndReturn; + } + + // + // The bit0 is 0 to prevent the enabling of the Rom address decoder + // + AllOnes = 0xfffffffe; + + Status = PciIo->Pci.Write ( + PciIo, + EfiPciWidthUint32, + RomBarIndex, + 1, + &AllOnes + ); + if (EFI_ERROR (Status)) { + goto CloseAndReturn; + } + + // + // Read back + // + Status = PciIo->Pci.Read ( + PciIo, + EfiPciWidthUint32, + RomBarIndex, + 1, + &AllOnes + ); + if (EFI_ERROR (Status)) { + goto CloseAndReturn; + } + + // + // Bits [1, 10] are reserved + // + AllOnes &= 0xFFFFF800; + if ((AllOnes == 0) || (AllOnes == 0xFFFFF800)) { + DEBUG ((DEBUG_VERBOSE, "%a: No Option ROM found\n", __func__)); + return EFI_NOT_FOUND; + } + + *RomSize = (~AllOnes) + 1; + + // + // Restore BAR and enable it + // + RomBar = Buffer | 1; + Status = PciIo->Pci.Write ( + PciIo, + EfiPciWidthUint32, + RomBarIndex, + 1, + &RomBar + ); + if (EFI_ERROR (Status)) { + goto CloseAndReturn; + } + + DEBUG (( + DEBUG_VERBOSE, + "%a: ROM BAR enabled at 0x%x with size %d\n", + __func__, + Buffer &~1, + *RomSize + )); + + // + // Set pointer to ROM BAR + // + RomBar = Buffer & 0xFFFFF800; + + RomBarOffset = RomBar; + FirstCheck = TRUE; + LegacyImageLength = 0; + RomImageSize = 0; + + // + // Expect to find a PCI ROM header at offset 0. + // The ROM header contains a pointer to the PCI Data structure. + // The PCI Data structure holds the image size. + // At the end of the image another Option ROM might be found + // (one for legacy BIOS and one for EFI). + // + do { + Status = PciIoDevice->PciRootBridgeIo->Mem.Read ( + PciIoDevice->PciRootBridgeIo, + EfiPciWidthUint8, + RomBarOffset, + sizeof (PCI_EXPANSION_ROM_HEADER), + (UINT8 *)&RomHeader + ); + if (EFI_ERROR (Status)) { + goto RestoreBar; + } + + if (RomHeader.Signature != PCI_EXPANSION_ROM_HEADER_SIGNATURE) { + RomBarOffset = RomBarOffset + 512; + if (FirstCheck) { + break; + } else { + RomImageSize = RomImageSize + 512; + continue; + } + } + + FirstCheck = FALSE; + OffsetPcir = RomHeader.PcirOffset; + // + // If the pointer to the PCI Data Structure is invalid, no further images can be located. + // The PCI Data Structure must be DWORD aligned. + // + if ((OffsetPcir == 0) || + ((OffsetPcir & 3) != 0) || + (RomImageSize + OffsetPcir + sizeof (PCI_DATA_STRUCTURE) > *RomSize)) + { + break; + } + + Status = PciIoDevice->PciRootBridgeIo->Mem.Read ( + PciIoDevice->PciRootBridgeIo, + EfiPciWidthUint8, + RomBarOffset + OffsetPcir, + sizeof (PCI_DATA_STRUCTURE), + (UINT8 *)&RomPcir + ); + if (EFI_ERROR (Status)) { + goto RestoreBar; + } + + // + // If a valid signature is not present in the PCI Data Structure, no further images can be located. + // + if (RomPcir.Signature != PCI_DATA_STRUCTURE_SIGNATURE) { + break; + } + + if (RomImageSize + RomPcir.ImageLength * 512 > *RomSize) { + break; + } + + if (RomPcir.CodeType == PCI_CODE_TYPE_PCAT_IMAGE) { + CodeType = PCI_CODE_TYPE_PCAT_IMAGE; + LegacyImageLength = ((UINT32)((EFI_LEGACY_EXPANSION_ROM_HEADER *)&RomHeader)->Size512) * 512; + } + + Indicator = RomPcir.Indicator; + RomImageSize = RomImageSize + RomPcir.ImageLength * 512; + RomBarOffset = RomBarOffset + RomPcir.ImageLength * 512; + } while (((Indicator & 0x80) == 0x00) && ((RomBarOffset - RomBar) < *RomSize)); + + // + // Some Legacy Cards do not report the correct ImageLength so used the maximum + // of the legacy length and the PCIR Image Length + // + if (CodeType == PCI_CODE_TYPE_PCAT_IMAGE) { + RomImageSize = MAX (RomImageSize, LegacyImageLength); + } + + if (RomImageSize > 0) { + // + // Allocate buffer to return + // + RomInMemory = (UINT8 *)AllocatePool ((UINT32)RomImageSize); + if (RomInMemory == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto RestoreBar; + } + + // + // Copy ROM image into memory + // + Status = PciIoDevice->PciRootBridgeIo->Mem.Read ( + PciIoDevice->PciRootBridgeIo, + EfiPciWidthUint8, + RomBar, + (UINT32)RomImageSize, + RomInMemory + ); + if (EFI_ERROR (Status)) { + goto RestoreBar; + } + } else { + Status = EFI_NOT_FOUND; + goto RestoreBar; + } + + DEBUG (( + DEBUG_INFO, + "%a: PCI @ [%02x|%02x|%02x|%02x]: Found Option ROM at 0x%x, length 0x%x\n", + __func__, + PciSegment, + PciBus, + PciDevice, + PciFunction, + RomBar, + RomImageSize + )); + + PciIoDevice->EmbeddedRom = TRUE; + PciIoDevice->PciIo.RomSize = RomImageSize; + PciIoDevice->PciIo.RomImage = RomInMemory; + + *RomImage = RomInMemory; + *RomSize = RomImageSize; + + Status = EFI_SUCCESS; + +RestoreBar: + // + // Restore BAR + // + PciIo->Pci.Write ( + PciIo, + EfiPciWidthUint32, + RomBarIndex, + 1, + &RomBar + ); + +CloseAndReturn: + // + // Close the I/O Abstraction(s) used to perform the supported test + // + gBS->CloseProtocol ( + PciHandle, + &gEfiPciIoProtocolGuid, + PciIo, + PciHandle + ); + + return Status; +} + +EFI_STATUS +EFIAPI +PciGetPlatformPolicy ( + IN CONST EFI_PCI_PLATFORM_PROTOCOL *This, + OUT EFI_PCI_PLATFORM_POLICY *PciPolicy + ) +{ + if (PciPolicy == NULL) { + return EFI_INVALID_PARAMETER; + } + + *PciPolicy = 0; + + return EFI_SUCCESS; +} + +EFI_PCI_PLATFORM_PROTOCOL mPciPlatformProtocol = { + PciPlatformNotify, + PciPlatformPrepController, + PciGetPlatformPolicy, + PciGetPciRom, +}; + +/** + The Entry Point for Option ROM driver. + + It installs DriverBinding. + + @retval EFI_SUCCESS The entry point is executed successfully. + @retval other Some error occurs when executing this entry point. + +**/ +EFI_STATUS +EFIAPI +InstallPciPlatformProtocol ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + EFI_HANDLE DriverHandle = NULL; + + Status = gBS->InstallProtocolInterface ( + &DriverHandle, + &gEfiPciPlatformProtocolGuid, + EFI_NATIVE_INTERFACE, + &mPciPlatformProtocol + ); + + return Status; +} diff --git a/UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.h b/UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.h new file mode 100644 index 000000000000..322fc5f8dbeb --- /dev/null +++ b/UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.h @@ -0,0 +1,20 @@ +/** @file + Header file for a gEfiPciPlatformProtocol driver. + +Copyright (c) 2025, 9elements GmbH. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + + +**/ + +#ifndef _PCI_PLATFORM_DXE_H_ +#define _PCI_PLATFORM_DXE_H_ +#include + +#include +#include +#include +#include +#include + +#endif diff --git a/UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.inf b/UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.inf new file mode 100644 index 000000000000..9e0ba63de377 --- /dev/null +++ b/UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.inf @@ -0,0 +1,43 @@ +## @file +# This driver produces gEfiPciPlatformProtocol to load PCI Option ROMs +# +# Copyright (c) 2025, 9elements Agency GmbH +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PciPlatformDxe + FILE_GUID = 86D58F7B-6E7C-401F-BDD4-E32E6D582AAD + MODULE_TYPE = UEFI_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = InstallPciPlatformProtocol + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# + +[Sources.common] + PciPlatformDxe.h + PciPlatformDxe.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + UefiPayloadPkg/UefiPayloadPkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + DxeServicesTableLib + DebugLib + MemoryAllocationLib + BaseMemoryLib + +[Protocols] + gEfiPciPlatformProtocolGuid ## PRODUCES + gEfiPciIoProtocolGuid ## COMSUMES diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index 34de87f7a501..76e4e58f50a6 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -45,6 +45,7 @@ DEFINE NVME_ENABLE = TRUE DEFINE CAPSULE_SUPPORT = FALSE DEFINE LOCKBOX_SUPPORT = FALSE + DEFINE LOAD_OPTION_ROMS = FALSE # # Crypto Support @@ -1035,6 +1036,13 @@ MdeModulePkg/Bus/Sd/SdDxe/SdDxe.inf !endif + # + # Support for loading Option ROMs from PCI-Express devices + # +!if $(LOAD_OPTION_ROMS) == TRUE + UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.inf +!endif + # # Usb Support # diff --git a/UefiPayloadPkg/UefiPayloadPkg.fdf b/UefiPayloadPkg/UefiPayloadPkg.fdf index 4264fa9a0e8b..06ca20761ac4 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.fdf +++ b/UefiPayloadPkg/UefiPayloadPkg.fdf @@ -292,6 +292,10 @@ INF MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf !endif INF UefiPayloadPkg/GraphicsOutputDxe/GraphicsOutputDxe.inf +!if $(LOAD_OPTION_ROMS) == TRUE +INF UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.inf +!endif + # # SCSI/ATA/IDE/DISK Support # From db5b28ed9e2720d66724283aef765d2370f9046b Mon Sep 17 00:00:00 2001 From: Prachotan Bathi Date: Tue, 5 Aug 2025 13:14:40 -0500 Subject: [PATCH 0363/1172] MdePkg, EmbeddedPkg: Move Fdt Table Guid to MdePkg Move Fdt Table Guid from EmbeddedPkg to MdePkg to avoid unnecessary dependencies on EmbeddedPkg for packages like ShellPkg. This change may affect modules dependent on EmbeddedPkg but not on MdePkg, which is unlikely. Also, per 8c721d6, MdePkg has a more refined implementation of Fdt as compared to the EmbeddedPkg which was the initial implementation. Not moving gFdtVariableGuid since it'll be moved to platform code. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Prachotan Bathi --- EmbeddedPkg/EmbeddedPkg.dec | 4 ---- {EmbeddedPkg => MdePkg}/Include/Guid/Fdt.h | 5 ----- MdePkg/MdePkg.dec | 4 ++++ 3 files changed, 4 insertions(+), 9 deletions(-) rename {EmbeddedPkg => MdePkg}/Include/Guid/Fdt.h (66%) diff --git a/EmbeddedPkg/EmbeddedPkg.dec b/EmbeddedPkg/EmbeddedPkg.dec index d386bda50ffa..4f0de24c554e 100644 --- a/EmbeddedPkg/EmbeddedPkg.dec +++ b/EmbeddedPkg/EmbeddedPkg.dec @@ -50,10 +50,6 @@ [Guids.common] gEmbeddedTokenSpaceGuid = { 0xe0d8ca17, 0x4276, 0x4386, { 0xbb, 0x79, 0x48, 0xcb, 0x81, 0x3d, 0x3c, 0x4f }} - ## FDT Configuration Table - # Include/Guid/Fdt.h - gFdtTableGuid = { 0xb1b621d5, 0xf19c, 0x41a5, { 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0 } } - gFdtVariableGuid = { 0x25a4fd4a, 0x9703, 0x4ba9, { 0xa1, 0x90, 0xb7, 0xc8, 0x4e, 0xfb, 0x3e, 0x57 } } ## Include/Guid/PlatformHasDeviceTree.h gEdkiiPlatformHasDeviceTreeGuid = { 0x7ebb920d, 0x1aaf, 0x46d9, { 0xb2, 0xaf, 0x54, 0x1e, 0x1d, 0xce, 0x14, 0x8b } } diff --git a/EmbeddedPkg/Include/Guid/Fdt.h b/MdePkg/Include/Guid/Fdt.h similarity index 66% rename from EmbeddedPkg/Include/Guid/Fdt.h rename to MdePkg/Include/Guid/Fdt.h index e0091468292a..9f9270ace15b 100644 --- a/EmbeddedPkg/Include/Guid/Fdt.h +++ b/MdePkg/Include/Guid/Fdt.h @@ -14,9 +14,4 @@ extern EFI_GUID gFdtTableGuid; -#define FDT_VARIABLE_GUID \ - { 0x25a4fd4a, 0x9703, 0x4ba9, { 0xa1, 0x90, 0xb7, 0xc8, 0x4e, 0xfb, 0x3e, 0x57 } } - -extern EFI_GUID gFdtVariableGuid; - #endif /* __FDT_H__ */ diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index 842abaaa75d9..ed22a6756853 100644 --- a/MdePkg/MdePkg.dec +++ b/MdePkg/MdePkg.dec @@ -615,6 +615,10 @@ ## Include/Guid/FdtHob.h gFdtHobGuid = { 0x16958446, 0x19B7, 0x480B, { 0xB0, 0x47, 0x74, 0x85, 0xAD, 0x3F, 0x71, 0x6D } } + ## FDT Configuration Table + # Include/Guid/Fdt.h + gFdtTableGuid = { 0xb1b621d5, 0xf19c, 0x41a5, { 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0 } } + ## Include/Guid/ImageAuthentication.h gEfiImageSecurityDatabaseGuid = { 0xd719b2cb, 0x3d3a, 0x4596, {0xa3, 0xbc, 0xda, 0xd0, 0xe, 0x67, 0x65, 0x6f }} gEfiCertSha256Guid = { 0xc1c41626, 0x504c, 0x4092, {0xac, 0xa9, 0x41, 0xf9, 0x36, 0x93, 0x43, 0x28 }} From d46aa46c8361194521391aa581593e556c707c6e Mon Sep 17 00:00:00 2001 From: Prachotan Bathi Date: Fri, 8 Aug 2025 13:55:10 -0500 Subject: [PATCH 0364/1172] ShellPkg: Remove EmbeddedPkg dependency Commit dcde148 introduced EmbeddedPkg as a dependency since gFdtTableGuid was in the EmbeddedPkg, but has now been moved to MdePkg. Signed-off-by: Prachotan Bathi --- .../UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf | 1 - ShellPkg/ShellPkg.ci.yaml | 1 - 2 files changed, 2 deletions(-) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf index 0f4068df0f3a..b6c5df7231ee 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf @@ -96,7 +96,6 @@ MdePkg/MdePkg.dec ShellPkg/ShellPkg.dec MdeModulePkg/MdeModulePkg.dec - EmbeddedPkg/EmbeddedPkg.dec [LibraryClasses] MemoryAllocationLib diff --git a/ShellPkg/ShellPkg.ci.yaml b/ShellPkg/ShellPkg.ci.yaml index 4f5c69dc8c1f..2c3a70d84b51 100644 --- a/ShellPkg/ShellPkg.ci.yaml +++ b/ShellPkg/ShellPkg.ci.yaml @@ -35,7 +35,6 @@ "MdePkg/MdePkg.dec", "MdeModulePkg/MdeModulePkg.dec", "ShellPkg/ShellPkg.dec", - "EmbeddedPkg/EmbeddedPkg.dec", "NetworkPkg/NetworkPkg.dec" ], # For host based unit tests From 305e5845e6fe4d74db117b7e04db7e2da02bf48c Mon Sep 17 00:00:00 2001 From: Gao Qihang Date: Fri, 25 Jul 2025 09:42:49 +0800 Subject: [PATCH 0365/1172] BaseTools/VfrCompile: Add check for setting string default to number It's illegal that string default is numeric type in vfr string definition. This patch add a check to the illegal behavior. If numeric string default is encountered, throw a invalid parameter error to break VfrCompile. Cc: Chao Li Signed-off-by: Gao Qihang --- BaseTools/Source/C/VfrCompile/VfrSyntax.g | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/BaseTools/Source/C/VfrCompile/VfrSyntax.g b/BaseTools/Source/C/VfrCompile/VfrSyntax.g index 942e0ed2e318..0f17b9dabc72 100644 --- a/BaseTools/Source/C/VfrCompile/VfrSyntax.g +++ b/BaseTools/Source/C/VfrCompile/VfrSyntax.g @@ -2,6 +2,7 @@ Vfr Syntax Copyright (c) 2004 - 2025, Intel Corporation. All rights reserved.
+Copyright (c) 2025, Loongson Technology Corporation Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent --*/ @@ -1618,7 +1619,7 @@ vfrConstantValueField[UINT8 Type, EFI_IFR_TYPE_VALUE &Value, BOOLEAN &ListType] $Value.b = _STOU8(N1->getText(), N1->getLine()); break; case EFI_IFR_TYPE_STRING : - $Value.string = _STOU16(N1->getText(), N1->getLine()); + _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "string type can't be numeric constant."); break; case EFI_IFR_TYPE_TIME : case EFI_IFR_TYPE_DATE : @@ -3127,7 +3128,7 @@ vfrStatementString : UINT8 StringMaxSize; >> L:String << SObj.SetLineNo(L->getLine()); gIsStringOp = TRUE;>> - vfrQuestionHeader[SObj] "," + vfrQuestionHeader[SObj] "," << _GET_CURRQEST_VARTINFO().mVarType = EFI_IFR_TYPE_STRING;>> { F:FLAGS "=" vfrStringFlagsField[SObj, F->getLine()] "," } { Key "=" KN:Number "," << AssignQuestionKey (SObj, KN); >> From eb3354a49953e1ff35cfcb986e8a959c4c8f1aeb Mon Sep 17 00:00:00 2001 From: Gao Qihang Date: Fri, 25 Jul 2025 10:44:37 +0800 Subject: [PATCH 0366/1172] MdeModulePkg/HiiDatabaseDxe: Avoid assert in InternalGetString If string default is set to zero in vfr file and VfrCompile may not found the invalid operation, assert is trigged. This patch will check whether StringId is 0 to avoid assert. Cc: Chao Li Signed-off-by: Gao Qihang --- MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c index c9aabaa3dad9..a282f6da5c6b 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c @@ -2,6 +2,7 @@ Implementation of interfaces function for EFI_HII_CONFIG_ROUTING_PROTOCOL. Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
+Copyright (c) 2025, Loongson Technology Corporation Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -4265,7 +4266,7 @@ GenerateAltConfigResp ( // Convert Value to a hex string in "%x" format // NOTE: This is in the opposite byte that GUID and PATH use // - if (BlockData->OpCode == EFI_IFR_STRING_OP) { + if ((BlockData->OpCode == EFI_IFR_STRING_OP) && (DefaultValueData->Value.string != 0)) { DefaultString = InternalGetString (HiiHandle, DefaultValueData->Value.string); TmpBuffer = AllocateZeroPool (Width); ASSERT (TmpBuffer != NULL); From 296c2e7edb9276b1187539b712b901328a4a4647 Mon Sep 17 00:00:00 2001 From: Gao Qihang Date: Tue, 15 Jul 2025 16:36:30 +0800 Subject: [PATCH 0367/1172] MdeModulePkg: Simplify PrintInternal function to fit wide character According to UEFI Spec, only Bit0...6 is valid in mode attribute, other bits are undefined and must be 0. So attribute with EFI_WIDE_ATTRIBUTE is unacceptable as EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetAttribute() input parameter. In current PrintInternal function, wide character removed WIDE_CHAR, and is used as EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString() input parameter. So, wide character is mistakenly be treated as narrow character. Because EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString() can handle unicode string with NARROW_CHAR and WIDE_CHAR, we can directly invoke OutputString() with whole unicode string in PrintInternal function instead of separated wide/narrow string. And then, the logic of computing unicode string width is also simplified. Signed-off-by: Gao Qihang --- .../CustomizedDisplayLibInternal.c | 73 +++++-------------- 1 file changed, 19 insertions(+), 54 deletions(-) diff --git a/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c b/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c index 2d807bfcb66b..bd5b8f5ea23f 100644 --- a/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c +++ b/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c @@ -3,6 +3,7 @@ This library class defines a set of interfaces to customize Display module Copyright (c) 2013-2018, Intel Corporation. All rights reserved.
+Copyright (c) 2025, Loongson Technology Corporation Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -859,10 +860,7 @@ PrintInternal ( ) { CHAR16 *Buffer; - CHAR16 *BackupBuffer; UINTN Index; - UINTN PreviousIndex; - UINTN Count; UINTN TotalCount; UINTN PrintWidth; UINTN CharWidth; @@ -870,10 +868,8 @@ PrintInternal ( // // For now, allocate an arbitrarily long buffer // - Buffer = AllocateZeroPool (0x10000); - BackupBuffer = AllocateZeroPool (0x10000); + Buffer = AllocateZeroPool (0x10000); ASSERT (Buffer); - ASSERT (BackupBuffer); if (Column != (UINTN)-1) { Out->SetCursorPosition (Out, Column, Row); @@ -884,73 +880,42 @@ PrintInternal ( Out->Mode->Attribute = Out->Mode->Attribute & 0x7f; Out->SetAttribute (Out, Out->Mode->Attribute); + Out->OutputString (Out, Buffer); - Index = 0; - PreviousIndex = 0; - Count = 0; - TotalCount = 0; - PrintWidth = 0; - CharWidth = 1; + Index = 0; + TotalCount = 0; + PrintWidth = 0; + CharWidth = 1; do { - for ( ; (Buffer[Index] != NARROW_CHAR) && (Buffer[Index] != WIDE_CHAR) && (Buffer[Index] != 0); Index++) { - BackupBuffer[Index] = Buffer[Index]; - } - if (Buffer[Index] == 0) { break; } - // - // Print this out, we are about to switch widths - // - Out->OutputString (Out, &BackupBuffer[PreviousIndex]); - Count = StrLen (&BackupBuffer[PreviousIndex]); - PrintWidth += Count * CharWidth; - TotalCount += Count; - - // - // Preserve the current index + 1, since this is where we will start printing from next - // - PreviousIndex = Index + 1; - - // - // We are at a narrow or wide character directive. Set attributes and strip it and print it - // - if (Buffer[Index] == NARROW_CHAR) { - // - // Preserve bits 0 - 6 and zero out the rest - // - Out->Mode->Attribute = Out->Mode->Attribute & 0x7f; - Out->SetAttribute (Out, Out->Mode->Attribute); - CharWidth = 1; - } else { - // - // Must be wide, set bit 7 ON - // - Out->Mode->Attribute = Out->Mode->Attribute | EFI_WIDE_ATTRIBUTE; - Out->SetAttribute (Out, Out->Mode->Attribute); - CharWidth = 2; + switch (Buffer[Index]) { + case NARROW_CHAR: + CharWidth = 1; + break; + case WIDE_CHAR: + CharWidth = 2; + break; + default: + PrintWidth += CharWidth; + TotalCount += 1; + break; } Index++; } while (Buffer[Index] != 0); // - // We hit the end of the string - print it + // We hit the end of the string - fill remaining space with SPACE. // - Out->OutputString (Out, &BackupBuffer[PreviousIndex]); - Count = StrLen (&BackupBuffer[PreviousIndex]); - PrintWidth += Count * CharWidth; - TotalCount += Count; if (PrintWidth < Width) { - Out->Mode->Attribute = Out->Mode->Attribute & 0x7f; - Out->SetAttribute (Out, Out->Mode->Attribute); Out->OutputString (Out, &mSpaceBuffer[SPACE_BUFFER_SIZE - Width + PrintWidth]); } FreePool (Buffer); - FreePool (BackupBuffer); return TotalCount; } From 0e1e079f4c5081da6b3b43f9dfc45932299ebb91 Mon Sep 17 00:00:00 2001 From: Gao Qihang Date: Fri, 1 Aug 2025 16:26:19 +0800 Subject: [PATCH 0368/1172] MdeModulePkg: Improve the implementation of EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL Fix TestString() to be compatible with wide/narrow string in GraphicsConsole driver. If WIDE_CHAR or NARROW_CHAR is hit in TestString function, ignore it since OutputString function will correctly handle it. Fix OutputString() to skip wide/narrow char in TerminalDxe. Because they are not displayable in terminal emulation tool, ingore to output if they are hit in OutputString function. Signed-off-by: Gao Qihang --- .../Console/GraphicsConsoleDxe/GraphicsConsole.c | 9 +++++++++ MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h | 2 ++ .../Universal/Console/TerminalDxe/TerminalConOut.c | 8 ++++++++ 3 files changed, 19 insertions(+) diff --git a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c index 50a88f576386..981844cc1634 100644 --- a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c +++ b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c @@ -2,6 +2,7 @@ This is the main routine for initializing the Graphics Console support routines. Copyright (c) 2006 - 2022, Intel Corporation. All rights reserved.
+Copyright (c) 2025, Loongson Technology Corporation Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -1095,6 +1096,14 @@ GraphicsConsoleConOutTestString ( Count = 0; while (WString[Count] != 0) { + // + // In TerminalConOutOutputString(), WIDE_CHAR/NARROW_CHAR will be ignored. + // So, WString contains WIDE_CHAR/NARROW_CHAR is also valid. + // + if ((WString[Count] == WIDE_CHAR) || (WString[Count] == NARROW_CHAR)) { + continue; + } + Status = mHiiFont->GetGlyph ( mHiiFont, WString[Count], diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h index 66438bec7eea..f9ef3b9c098b 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h @@ -4,6 +4,7 @@ Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved.
Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
Copyright (C) 2016 Silicon Graphics, Inc. All rights reserved.
+Copyright (c) 2025, Loongson Technology Corporation Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -17,6 +18,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include +#include #include #include diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c index eb8658c892e6..c3f3399e5f80 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c +++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c @@ -4,6 +4,7 @@ Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved.
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
Copyright (C) 2016 Silicon Graphics, Inc. All rights reserved.
+Copyright (c) 2025, Loongson Technology Corporation Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -216,6 +217,13 @@ TerminalConOutOutputString ( ); for ( ; *WString != CHAR_NULL; WString++) { + // + // Skip WIDE_CHAR/NARROW_CHAR, because they are not displayable. + // + if ((*WString == WIDE_CHAR) || (*WString == NARROW_CHAR)) { + continue; + } + switch (TerminalDevice->TerminalType) { case TerminalTypePcAnsi: case TerminalTypeVt100: From 42ba637432221cb6da9b4053204095e3cbd306f2 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Thu, 7 Aug 2025 18:56:27 -0400 Subject: [PATCH 0369/1172] .pytool: Use Tianocore Uncrustify release Tianocore uses a customized version of Uncrustify that previously resided in https://dev.azure.com/projectmu/_git/Uncrustify. An official fork in the Tianocore organization has been created here https://github.com/tianocore/uncrustify. The Tianocore fork publishes its releases to a GitHub release in the repo. This is the first release from that repo: https://github.com/tianocore/uncrustify/releases/tag/73.0.10 An advantage of this process is that the binaries for the release are simply attached on the release page in a zip file. For example, this is the zip file for that release: https://github.com/tianocore/uncrustify/releases/download/73.0.10/uncrustify-release.zip This eases consumption of the release, especially on non-Windows hosts versus the previous distribution method with NuGet. This change updates the external dependency in edk2 to consume the binary from this zip file in the release of the Tianocore repo instead of the previous NuGet feed in the Azure repo. Note: The goal is to eliminate the Tianocore fork of Uncrustify, the details for that are outside the scope of this commit. Signed-off-by: Michael Kubacki --- .../Plugin/UncrustifyCheck/uncrustify_ext_dep.yaml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.pytool/Plugin/UncrustifyCheck/uncrustify_ext_dep.yaml b/.pytool/Plugin/UncrustifyCheck/uncrustify_ext_dep.yaml index 74f3ffe41acf..78b9a40365f7 100644 --- a/.pytool/Plugin/UncrustifyCheck/uncrustify_ext_dep.yaml +++ b/.pytool/Plugin/UncrustifyCheck/uncrustify_ext_dep.yaml @@ -7,10 +7,13 @@ { "id": "uncrustify-ci-1", "scope": "cibuild", - "type": "nuget", - "name": "mu-uncrustify-release", - "source": "https://pkgs.dev.azure.com/projectmu/Uncrustify/_packaging/mu_uncrustify/nuget/v3/index.json", - "version": "73.0.8", + "type": "web", + "name": "tianocore-uncrustify-release", + "source": "https://github.com/tianocore/uncrustify/releases/download/73.0.10/uncrustify-release.zip", + "version": "73.0.10", + "sha256": "65d6f0f2e2bba9f25edaa1a9a5e5b9af32ba8d5c2792e467b84abfdf39b5e8ee", + "compression_type": "zip", + "internal_path": "/", "flags": ["set_shell_var", "host_specific"], "var_name": "UNCRUSTIFY_CI_PATH" } From 8682d3ea0a5df1152c62f87326649f3d0082d9b6 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Mon, 18 Aug 2025 11:52:58 -0400 Subject: [PATCH 0370/1172] SecurityPkg/Tpm2CommandLib: Update not found RC for Public NV Read Currently a EFI_DEVICE_ERROR is returned if `TPM_RC_HANDLE` is the return code from a TPM2_NV_ReadPublic command. However, in the TCG TPM Library Part 3: Commands specification, `TPM_RC_HANDLE` is a return code if: 1. An Index does not exist that corresponds to the handle (TPM_RC_HANDLE) 2. The hierarchy associated with the existing NV Index is not enabled (TPM_RC_HANDLE) Therefore, return EFI_NOT_FOUND in this case, since that more precisely allows a caller to identify this condition and act on it as opposed to a more generic device error. Signed-off-by: Michael Kubacki --- SecurityPkg/Library/Tpm2CommandLib/Tpm2NVStorage.c | 1 + 1 file changed, 1 insertion(+) diff --git a/SecurityPkg/Library/Tpm2CommandLib/Tpm2NVStorage.c b/SecurityPkg/Library/Tpm2CommandLib/Tpm2NVStorage.c index f11f7696b140..7ca892735b24 100644 --- a/SecurityPkg/Library/Tpm2CommandLib/Tpm2NVStorage.c +++ b/SecurityPkg/Library/Tpm2CommandLib/Tpm2NVStorage.c @@ -229,6 +229,7 @@ Tpm2NvReadPublic ( case TPM_RC_SUCCESS: // return data break; + case TPM_RC_HANDLE: case TPM_RC_HANDLE + RC_NV_ReadPublic_nvIndex: // TPM_RC_NV_DEFINED: return EFI_NOT_FOUND; case TPM_RC_VALUE + RC_NV_ReadPublic_nvIndex: From 829e42d3a345a641c8359e25e357d7acb1dee292 Mon Sep 17 00:00:00 2001 From: Ray Ni Date: Tue, 29 Jul 2025 10:17:37 +0800 Subject: [PATCH 0371/1172] MdeModulePkg/PeiCore: Print GUID of FV and FvFile in debug log When a BIOS implementation splits the PEIMs in multiple firmware volumes and the FVs are reported to PEI Core by different PEIMs at different time, it is hard to conclude the exact FV dispatch order. The change updates the existing PEI dispatch logic to print the GUID of the firmware volume and the FFS file which contains a nested FV. It helps developers to match the FV being dispatched to the FV defined in FDF file. Signed-off-by: Ray Ni Cc: Liming Gao --- MdeModulePkg/Core/Pei/FwVol/FwVol.c | 38 ++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/MdeModulePkg/Core/Pei/FwVol/FwVol.c b/MdeModulePkg/Core/Pei/FwVol/FwVol.c index 04bec986e42f..1c0aa9d121d8 100644 --- a/MdeModulePkg/Core/Pei/FwVol/FwVol.c +++ b/MdeModulePkg/Core/Pei/FwVol/FwVol.c @@ -2,7 +2,7 @@ Pei Core Firmware File System service routines. Copyright (c) 2015 HP Development Company, L.P. -Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2025, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -455,6 +455,29 @@ FindFileEx ( return EFI_NOT_FOUND; } +/** + Return the pointer to the Firmware Volume GUID name in the FV header. + + @param[in] FvHeader Pointer to the header of the Firmware Volume. + + @retval Pointer to the Firmware Volume GUID name in the FV header. + NULL if the FV is anonymous without an extended header. +**/ +EFI_GUID * +GetFvName ( + IN CONST EFI_FIRMWARE_VOLUME_HEADER *FvHeader + ) +{ + EFI_FIRMWARE_VOLUME_EXT_HEADER *FvExtHeader; + + if (FvHeader->ExtHeaderOffset == 0) { + return NULL; + } + + FvExtHeader = (EFI_FIRMWARE_VOLUME_EXT_HEADER *)((UINT8 *)FvHeader + FvHeader->ExtHeaderOffset); + return &FvExtHeader->FvName; +} + /** Initialize PeiCore FV List. @@ -519,8 +542,9 @@ PeiInitializeFv ( PrivateData->Fv[PrivateData->FvCount].AuthenticationStatus = 0; DEBUG (( DEBUG_INFO, - "The %dth FV start address is 0x%11p, size is 0x%08x, handle is 0x%p\n", + "The %dth FV[%g] start address is 0x%11p, size is 0x%08x, handle is 0x%p\n", (UINT32)PrivateData->FvCount, + GetFvName (BfvHeader), (VOID *)BfvHeader, (UINT32)BfvHeader->FvLength, FvHandle @@ -661,8 +685,9 @@ FirmwareVolumeInfoPpiNotifyCallback ( CurFvCount = PrivateData->FvCount; DEBUG (( DEBUG_INFO, - "The %dth FV start address is 0x%11p, size is 0x%08x, handle is 0x%p\n", + "The %dth FV[%g] start address is 0x%11p, size is 0x%08x, handle is 0x%p\n", (UINT32)CurFvCount, + GetFvName ((EFI_FIRMWARE_VOLUME_HEADER *)FvInfo2Ppi.FvInfo), (VOID *)FvInfo2Ppi.FvInfo, FvInfo2Ppi.FvInfoSize, FvHandle @@ -696,7 +721,7 @@ FirmwareVolumeInfoPpiNotifyCallback ( } } - DEBUG ((DEBUG_INFO, "Found firmware volume Image File %p in FV[%d] %p\n", FileHandle, CurFvCount, FvHandle)); + DEBUG ((DEBUG_INFO, "Found firmware volume Image File[%g] %p in FV[%d] %p\n", FileHandle, FileHandle, CurFvCount, FvHandle)); ProcessFvFile (PrivateData, &PrivateData->Fv[CurFvCount], FileHandle); } } while (FileHandle != NULL); @@ -2434,8 +2459,9 @@ ThirdPartyFvPpiNotifyCallback ( CurFvCount = PrivateData->FvCount; DEBUG (( DEBUG_INFO, - "The %dth FV start address is 0x%11p, size is 0x%08x, handle is 0x%p\n", + "The %dth FV[%g] start address is 0x%11p, size is 0x%08x, handle is 0x%p\n", (UINT32)CurFvCount, + GetFvName ((EFI_FIRMWARE_VOLUME_HEADER *)FvInfo), (VOID *)FvInfo, FvInfoSize, FvHandle @@ -2469,7 +2495,7 @@ ThirdPartyFvPpiNotifyCallback ( } } - DEBUG ((DEBUG_INFO, "Found firmware volume Image File %p in FV[%d] %p\n", FileHandle, CurFvCount, FvHandle)); + DEBUG ((DEBUG_INFO, "Found firmware volume Image File[%g] %p in FV[%d] %p\n", FileHandle, FileHandle, CurFvCount, FvHandle)); ProcessFvFile (PrivateData, &PrivateData->Fv[CurFvCount], FileHandle); } } while (FileHandle != NULL); From 433bbe6e493adeb75d8799e01a84968aa97db1a0 Mon Sep 17 00:00:00 2001 From: Sergii Dmytruk Date: Sat, 9 Aug 2025 16:47:12 +0300 Subject: [PATCH 0372/1172] BaseTools: DSC: fix processing !include in multiarch subsections Commit f0a2015373 ("UefiPayloadPkg: Add AARCH64 support") changed `[Components.X64]` to `[Components.X64, Components.AARCH64]` which resulted in the following code within that section to not work as expected (the code wasn't there, just providing a real world example that uncovered the issue): [Components.X64, Components.AARCH64] FmpDevicePkg/FmpDxe/FmpDxe.inf { ... !include .../...PcdFmpDevicePkcs7CertBufferXdr.inc ... } At the same time `[Components.X64]` or even `[Components.AARCH64, Components.X64]` (notice the swapped order) worked fine for X64 target. The cause of the issue turned out to be skipping includes inside `_PostProcess()` method of `DscParser` class. This method processes list of items stored in a database filled on the first pass through a DSC file in `Start()` method. One of the fields stored in each row of a table is link to a parent object (owner). A section like `[Components.X64, Components.AARCH64]` creates two objects and all of its subelements are duplicated for both X64 and AARCH64. This was not happening for !include statement in the example above. Because `_PostProcess()` contracted a sequence of !include objects disregarding their owner, it did not create instance for each of the requested targets. Codewise, `self._ContentIndex` was incremented more than once, while `__ProcessDirective()` method (invoked indirectly as `Processer[self._ItemType]()`) queried owner of the current directive as: if self._InSubsection: Owner = self._Content[self._ContentIndex - 1][8] else: # not taken in this case This is why order of targets made a difference, only the last was fully initialized in this case. An alternative fix is completely dropping merging of !include directives, but hard to say whether it still has some utility (the code is complex, hard to follow and barely documented). Safer to keep it, in the worst case it doesn't do anything now. Signed-off-by: Sergii Dmytruk --- BaseTools/Source/Python/Workspace/MetaFileParser.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py b/BaseTools/Source/Python/Workspace/MetaFileParser.py index ed1ccb1cf1fa..5d2a44481dc7 100644 --- a/BaseTools/Source/Python/Workspace/MetaFileParser.py +++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py @@ -1407,7 +1407,11 @@ def _PostProcess(self): if self._ContentIndex >= len(self._Content): break Record = self._Content[self._ContentIndex] - if LineStart == Record[10] and LineEnd == Record[12]: + # + # Avoid merging includes with different owners to make sure an + # include is correctly processed per arch. + # + if Owner == Record[8] and LineStart == Record[10] and LineEnd == Record[12]: if [Record[5], Record[6], Record[7]] not in self._Scope: self._Scope.append([Record[5], Record[6], Record[7]]) self._ContentIndex += 1 From 450784d3fd7f192bf48bb2c4d5548822825cc297 Mon Sep 17 00:00:00 2001 From: Sergii Dmytruk Date: Sat, 3 Aug 2024 00:38:54 +0300 Subject: [PATCH 0373/1172] UefiPayloadPkg/SblParseLib.inf: Add missing GUIDs They are used in SblParseLib.c (ParseSmbiosTable() and ParseAcpiTableInfo() functions) but weren't declared as such. Signed-off-by: Sergii Dmytruk --- UefiPayloadPkg/Library/SblParseLib/SblParseLib.inf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/UefiPayloadPkg/Library/SblParseLib/SblParseLib.inf b/UefiPayloadPkg/Library/SblParseLib/SblParseLib.inf index f83a10ccd826..15fd1ca8738e 100644 --- a/UefiPayloadPkg/Library/SblParseLib/SblParseLib.inf +++ b/UefiPayloadPkg/Library/SblParseLib/SblParseLib.inf @@ -41,6 +41,8 @@ gEfiGraphicsInfoHobGuid gEfiGraphicsDeviceInfoHobGuid gUniversalPayloadPciRootBridgeInfoGuid + gUniversalPayloadSmbiosTableGuid + gUniversalPayloadAcpiTableGuid [Pcd] gUefiPayloadPkgTokenSpaceGuid.PcdBootloaderParameter From f3a5772acac85e4ce8335d447ab4896054e73634 Mon Sep 17 00:00:00 2001 From: Sergii Dmytruk Date: Tue, 9 Jul 2024 18:13:31 +0300 Subject: [PATCH 0374/1172] UefiPayloadPkg/BlParseLib: Add parsing of firmware info The implementation is for CbParseLib, SblParseLib returns an error. coreboot's CB_TAG_FW_INFO is a machine-friendly version of a system firmware component. A component is identified by a GUID. This is meant to be primarily a source of information for ESRT. The following coreboot options translate directly into fields of the structure with information: - CONFIG_DRIVERS_EFI_MAIN_FW_GUID - CONFIG_DRIVERS_EFI_MAIN_FW_VERSION - CONFIG_DRIVERS_EFI_MAIN_FW_LSV - CONFIG_ROM_SIZE The first 3 options depend on CONFIG_DRIVERS_EFI_FW_INFO. Version as a string depends on CONFIG_LOCALVERSION as well as version of the code base (misnamed as KERNELVERSION in coreboot's build system). Signed-off-by: Sergii Dmytruk --- UefiPayloadPkg/Include/Coreboot.h | 20 +++++ .../Include/Guid/FirmwareInfoGuid.h | 26 +++++++ UefiPayloadPkg/Include/Library/BlParseLib.h | 16 ++++ .../Library/CbParseLib/CbParseLib.c | 75 +++++++++++++++++++ .../Library/CbParseLib/CbParseLib.inf | 1 + .../Library/SblParseLib/SblParseLib.c | 18 +++++ UefiPayloadPkg/UefiPayloadPkg.dec | 1 + 7 files changed, 157 insertions(+) create mode 100644 UefiPayloadPkg/Include/Guid/FirmwareInfoGuid.h diff --git a/UefiPayloadPkg/Include/Coreboot.h b/UefiPayloadPkg/Include/Coreboot.h index 1b05f15fe5d3..ba77f3b3134a 100644 --- a/UefiPayloadPkg/Include/Coreboot.h +++ b/UefiPayloadPkg/Include/Coreboot.h @@ -263,6 +263,26 @@ struct cb_smmstorev2 { UINT8 unused[3]; /* Set to zero */ } __attribute__ ((packed)); +/* + * Machine-friendly version of a system firmware component. A component is + * identified by a GUID. coreboot is an obvious main component but there could + * be others (like EC) which should get their own instances of the tag. + * + * The main consumer of this information is UEFI firmware but something else + * could reuse it too. + * + * Larger number in a version field corresponds to a more recent version. + */ +#define CB_TAG_FW_INFO 0x0045 +struct lb_efi_fw_info { + UINT32 tag; + UINT32 size; + UINT8 guid[16]; /* Called "firmware class" in UEFI */ + UINT32 version; /* Current version */ + UINT32 lowest_supported_version; /* Lowest allowed version */ + UINT32 fw_size; /* Size of firmware in bytes */ +} __attribute__ ((packed)); + /* Helpful macros */ #define MEM_RANGE_COUNT(_rec) \ diff --git a/UefiPayloadPkg/Include/Guid/FirmwareInfoGuid.h b/UefiPayloadPkg/Include/Guid/FirmwareInfoGuid.h new file mode 100644 index 000000000000..fa1d0649e2db --- /dev/null +++ b/UefiPayloadPkg/Include/Guid/FirmwareInfoGuid.h @@ -0,0 +1,26 @@ +/** @file + This file defines the hob structure for firmware related information from a + bootloader + + Copyright (c) 2025, 3mdeb Sp. z o.o.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef FIRMWARE_INFO_GUID_H_ +#define FIRMWARE_INFO_GUID_H_ + +/// +/// Firmware information GUID +/// +extern EFI_GUID gEfiFirmwareInfoHobGuid; + +typedef struct { + EFI_GUID Type; + CHAR8 VersionStr[64]; + UINT32 Version; + UINT32 LowestSupportedVersion; + UINT32 ImageSize; +} FIRMWARE_INFO; + +#endif // FIRMWARE_INFO_GUID_H_ diff --git a/UefiPayloadPkg/Include/Library/BlParseLib.h b/UefiPayloadPkg/Include/Library/BlParseLib.h index 82be5a9eb85a..f1487bbb24ea 100644 --- a/UefiPayloadPkg/Include/Library/BlParseLib.h +++ b/UefiPayloadPkg/Include/Library/BlParseLib.h @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -148,4 +149,19 @@ ParseMiscInfo ( VOID ); +/** + Parse firmware information passed in by bootloader + + @param FwInfo Information about current firmware. + + @retval RETURN_INVALID_PARAMETER The parameter is NULL. + @retval RETURN_SUCCESS Successfully parsed information. + @retval RETURN_NOT_FOUND The information is missing. +**/ +RETURN_STATUS +EFIAPI +ParseFirmwareInfo ( + OUT FIRMWARE_INFO *FwInfo + ); + #endif diff --git a/UefiPayloadPkg/Library/CbParseLib/CbParseLib.c b/UefiPayloadPkg/Library/CbParseLib/CbParseLib.c index d7282e07b020..826e5209b632 100644 --- a/UefiPayloadPkg/Library/CbParseLib/CbParseLib.c +++ b/UefiPayloadPkg/Library/CbParseLib/CbParseLib.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -638,3 +639,77 @@ ParseSmmStoreInfo ( return RETURN_SUCCESS; } + +/** + Parse information in a string form identified by a number + + @param Id String identifier. + + @retval NULL The requested information wasn't found. + @retval Otherwise A pointer to a static string. +**/ +STATIC +CONST CHAR8 * +EFIAPI +ParseInfoString ( + IN UINTN Id + ) +{ + struct cb_string *CbString; + + CbString = FindCbTag (Id); + if (CbString == NULL) { + return NULL; + } + + return (CONST CHAR8 *)CbString->string; +} + +/** + Parse firmware information passed in by bootloader + + @param FwInfo Information about current firmware. + + @retval RETURN_INVALID_PARAMETER The parameter is NULL. + @retval RETURN_SUCCESS Successfully parsed information. + @retval RETURN_NOT_FOUND The information is missing. +**/ +RETURN_STATUS +EFIAPI +ParseFirmwareInfo ( + OUT FIRMWARE_INFO *FwInfo + ) +{ + CONST CHAR8 *Version; + CONST CHAR8 *ExtraVersion; + struct lb_efi_fw_info *Info; + + if (FwInfo == NULL) { + return RETURN_INVALID_PARAMETER; + } + + Info = FindCbTag (CB_TAG_FW_INFO); + if (Info == NULL) { + return RETURN_NOT_FOUND; + } + + Version = ParseInfoString (CB_TAG_VERSION); + ExtraVersion = ParseInfoString (CB_TAG_EXTRA_VERSION); + + /* No big deal if these aren't available. */ + if ((Version == NULL) && (ExtraVersion == NULL)) { + Version = "coreboot+EDK2 (unknown version)"; + ExtraVersion = ""; + } else if (Version == NULL) { + Version = ""; + } else if (ExtraVersion == NULL) { + ExtraVersion = ""; + } + + CopyMem (&FwInfo->Type, &Info->guid, sizeof (FwInfo->Type)); + FwInfo->Version = Info->version; + FwInfo->LowestSupportedVersion = Info->lowest_supported_version; + FwInfo->ImageSize = Info->fw_size; + AsciiSPrint (FwInfo->VersionStr, sizeof (FwInfo->VersionStr), "%a%a", Version, ExtraVersion); + return RETURN_SUCCESS; +} diff --git a/UefiPayloadPkg/Library/CbParseLib/CbParseLib.inf b/UefiPayloadPkg/Library/CbParseLib/CbParseLib.inf index cf81697703cc..7be238c850f8 100644 --- a/UefiPayloadPkg/Library/CbParseLib/CbParseLib.inf +++ b/UefiPayloadPkg/Library/CbParseLib/CbParseLib.inf @@ -34,6 +34,7 @@ IoLib DebugLib PcdLib + PrintLib [Pcd] gUefiPayloadPkgTokenSpaceGuid.PcdBootloaderParameter diff --git a/UefiPayloadPkg/Library/SblParseLib/SblParseLib.c b/UefiPayloadPkg/Library/SblParseLib/SblParseLib.c index de139a5305ad..fc6349c5b8d9 100644 --- a/UefiPayloadPkg/Library/SblParseLib/SblParseLib.c +++ b/UefiPayloadPkg/Library/SblParseLib/SblParseLib.c @@ -307,3 +307,21 @@ ParseSmmStoreInfo ( { return RETURN_NOT_FOUND; } + +/** + Parse firmware information passed in by bootloader + + @param FwInfo Information about current firmware. + + @retval RETURN_INVALID_PARAMETER The parameter is NULL. + @retval RETURN_SUCCESS Successfully parsed information. + @retval RETURN_NOT_FOUND The information is missing. +**/ +RETURN_STATUS +EFIAPI +ParseFirmwareInfo ( + OUT FIRMWARE_INFO *FwInfo + ) +{ + return RETURN_NOT_FOUND; +} diff --git a/UefiPayloadPkg/UefiPayloadPkg.dec b/UefiPayloadPkg/UefiPayloadPkg.dec index 491e5428b93a..51ddcc58e97a 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dec +++ b/UefiPayloadPkg/UefiPayloadPkg.dec @@ -46,6 +46,7 @@ gUplPciSegmentInfoHobGuid = {0x37e0e3a9, 0xb3fc, 0x4e85, { 0x97, 0x2b, 0x40, 0x82, 0xfc, 0x79, 0x40, 0x54 } } gEfiSmmStoreInfoHobGuid = { 0xf585ca19, 0x881b, 0x44fb, { 0x3f, 0x3d, 0x81, 0x89, 0x7c, 0x57, 0xbb, 0x01 } } + gEfiFirmwareInfoHobGuid = { 0xe0653829, 0x274e, 0x4b1e, { 0x87, 0x2d, 0xa2, 0x20, 0xf5, 0xaf, 0x8f, 0x3d } } [Ppis] gEfiPayLoadHobBasePpiGuid = { 0xdbe23aa1, 0xa342, 0x4b97, {0x85, 0xb6, 0xb2, 0x26, 0xf1, 0x61, 0x73, 0x89} } From 8b2433c2f5e07519a31057bc6acb2158acd9e5e3 Mon Sep 17 00:00:00 2001 From: Sergii Dmytruk Date: Mon, 24 Jun 2024 16:13:55 +0300 Subject: [PATCH 0375/1172] UefiPayloadPkg/BlSupportDxe: Publish ESRT with an entry for system firmware Use firmware information passed by a bootloader and parsed by BlParseLib to make a single-element ESRT. This informs operating systems and EDK itself about which capsules are applicable for the current firmware. Signed-off-by: Sergii Dmytruk --- UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c | 28 ++++++++++++++++++++ UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h | 3 +++ UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf | 3 +++ 3 files changed, 34 insertions(+) diff --git a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c index 215bc60f7794..866ca70394ca 100644 --- a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c +++ b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c @@ -29,6 +29,9 @@ BlDxeEntryPoint ( EFI_HOB_GUID_TYPE *GuidHob; EFI_PEI_GRAPHICS_INFO_HOB *GfxInfo; ACPI_BOARD_INFO *AcpiBoardInfo; + FIRMWARE_INFO *FirmwareInfo; + EFI_SYSTEM_RESOURCE_TABLE *Esrt; + EFI_SYSTEM_RESOURCE_ENTRY *Esre; // // Find the frame buffer information and update PCDs @@ -61,5 +64,30 @@ BlDxeEntryPoint ( Status = BlArchAdditionalOps (ImageHandle, SystemTable); ASSERT_EFI_ERROR (Status); + // + // Build and publish a single-entry ESRT if a bootloader provided us with + // details about currently running firmware + // + GuidHob = GetFirstGuidHob (&gEfiFirmwareInfoHobGuid); + if (GuidHob != NULL) { + FirmwareInfo = (FIRMWARE_INFO *)GET_GUID_HOB_DATA (GuidHob); + + Esrt = AllocateZeroPool (sizeof (EFI_SYSTEM_RESOURCE_TABLE) + sizeof (EFI_SYSTEM_RESOURCE_ENTRY)); + ASSERT (Esrt != NULL); + + Esrt->FwResourceVersion = EFI_SYSTEM_RESOURCE_TABLE_FIRMWARE_RESOURCE_VERSION; + Esrt->FwResourceCount = 1; + Esrt->FwResourceCountMax = 1; + + Esre = (EFI_SYSTEM_RESOURCE_ENTRY *)&Esrt[1]; + CopyMem (&Esre->FwClass, &FirmwareInfo->Type, sizeof (EFI_GUID)); + Esre->FwType = ESRT_FW_TYPE_SYSTEMFIRMWARE; + Esre->FwVersion = FirmwareInfo->Version; + Esre->LowestSupportedFwVersion = FirmwareInfo->LowestSupportedVersion; + + Status = gBS->InstallConfigurationTable (&gEfiSystemResourceTableGuid, Esrt); + ASSERT_EFI_ERROR (Status); + } + return EFI_SUCCESS; } diff --git a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h index 5f611c37138e..2a235475f2fa 100644 --- a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h +++ b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h @@ -16,8 +16,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include +#include +#include #include +#include #include EFI_STATUS diff --git a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf index 401b99f9b6e0..c1fe073634d3 100644 --- a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf +++ b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf @@ -45,13 +45,16 @@ DebugLib BaseMemoryLib HobLib + MemoryAllocationLib [LibraryClasses.AARCH64] ArmMmuLib [Guids] gUefiAcpiBoardInfoGuid + gEfiFirmwareInfoHobGuid gEfiGraphicsInfoHobGuid + gEfiSystemResourceTableGuid [Protocols] gEfiCpuArchProtocolGuid From cc149a8eaab5f09d021c035d81132bd6f21760e3 Mon Sep 17 00:00:00 2001 From: Sergii Dmytruk Date: Tue, 30 Apr 2024 01:13:42 +0300 Subject: [PATCH 0376/1172] UefiPayloadPkg/UefiPayloadEntry: Import update capsules from bootloader The implementation is for CbParseLib, SblParseLib returns success while doing nothing. The HOBs created by BuildCvHob() will be eventually picked up and processed in DXE phase by MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLib.c Because multiple capsules can be chained (simply by placing them one after another), coreboot passes them as a single memory range which can provide tenths of capsules. coreboot won't pass any capsules unless it finds CapsuleUpdateData* EFI variables and is able to parse memory ranges they point to as scatter-gather lists of pages containing capsules. Signed-off-by: Sergii Dmytruk --- UefiPayloadPkg/Include/Coreboot.h | 8 ++++ UefiPayloadPkg/Include/Library/BlParseLib.h | 20 ++++++++++ .../Library/CbParseLib/CbParseLib.c | 37 +++++++++++++++++++ .../Library/PayloadEntryHobLib/Hob.c | 33 +++++++++++++++++ .../Library/SblParseLib/SblParseLib.c | 20 ++++++++++ .../UefiPayloadEntry/UefiPayloadEntry.c | 9 +++++ 6 files changed, 127 insertions(+) diff --git a/UefiPayloadPkg/Include/Coreboot.h b/UefiPayloadPkg/Include/Coreboot.h index ba77f3b3134a..4d0d2cc1e4e1 100644 --- a/UefiPayloadPkg/Include/Coreboot.h +++ b/UefiPayloadPkg/Include/Coreboot.h @@ -283,6 +283,14 @@ struct lb_efi_fw_info { UINT32 fw_size; /* Size of firmware in bytes */ } __attribute__ ((packed)); +#define CB_TAG_CAPSULE 0x0046 +struct cb_range { + UINT32 tag; + UINT32 size; + UINT64 range_start; + UINT32 range_size; +} __attribute__ ((packed)); + /* Helpful macros */ #define MEM_RANGE_COUNT(_rec) \ diff --git a/UefiPayloadPkg/Include/Library/BlParseLib.h b/UefiPayloadPkg/Include/Library/BlParseLib.h index f1487bbb24ea..e86f03f2b6ce 100644 --- a/UefiPayloadPkg/Include/Library/BlParseLib.h +++ b/UefiPayloadPkg/Include/Library/BlParseLib.h @@ -27,6 +27,12 @@ typedef RETURN_STATUS \ VOID *Param ); +typedef VOID \ +(*BL_CAPSULE_CALLBACK) ( + EFI_PHYSICAL_ADDRESS BaseAddress, + UINT64 Length + ); + /** This function retrieves the parameter base address from boot loader. @@ -164,4 +170,18 @@ ParseFirmwareInfo ( OUT FIRMWARE_INFO *FwInfo ); +/** + Parse update capsules passed in by bootloader + + @param CapsuleCallback The callback routine invoked for each capsule. + + @retval RETURN_SUCCESS Successfully parsed capsules. + @retval RETURN_NOT_FOUND Failed to look up the information. +**/ +RETURN_STATUS +EFIAPI +ParseCapsules ( + IN BL_CAPSULE_CALLBACK CapsuleCallback + ); + #endif diff --git a/UefiPayloadPkg/Library/CbParseLib/CbParseLib.c b/UefiPayloadPkg/Library/CbParseLib/CbParseLib.c index 826e5209b632..0f6d1d506fe6 100644 --- a/UefiPayloadPkg/Library/CbParseLib/CbParseLib.c +++ b/UefiPayloadPkg/Library/CbParseLib/CbParseLib.c @@ -713,3 +713,40 @@ ParseFirmwareInfo ( AsciiSPrint (FwInfo->VersionStr, sizeof (FwInfo->VersionStr), "%a%a", Version, ExtraVersion); return RETURN_SUCCESS; } + +/** + Parse update capsules passed in by bootloader + + @param CapsuleCallback The callback routine invoked for each capsule. + + @retval RETURN_SUCCESS Successfully parsed capsules. + @retval RETURN_NOT_FOUND Failed to look up the information. +**/ +RETURN_STATUS +EFIAPI +ParseCapsules ( + IN BL_CAPSULE_CALLBACK CapsuleCallback + ) +{ + struct cb_header *Header; + struct cb_range *Range; + UINT8 *TmpPtr; + UINTN Idx; + + Header = GetParameterBase (); + if (Header == NULL) { + return RETURN_NOT_FOUND; + } + + TmpPtr = (UINT8 *)Header + Header->header_bytes; + for (Idx = 0; Idx < Header->table_entries; Idx++) { + Range = (struct cb_range *)TmpPtr; + if (Range->tag == CB_TAG_CAPSULE) { + CapsuleCallback (Range->range_start, Range->range_size); + } + + TmpPtr += Range->size; + } + + return RETURN_SUCCESS; +} diff --git a/UefiPayloadPkg/Library/PayloadEntryHobLib/Hob.c b/UefiPayloadPkg/Library/PayloadEntryHobLib/Hob.c index c2d4437dd2b3..0e3bf29c8278 100644 --- a/UefiPayloadPkg/Library/PayloadEntryHobLib/Hob.c +++ b/UefiPayloadPkg/Library/PayloadEntryHobLib/Hob.c @@ -557,6 +557,39 @@ BuildFv3Hob ( } } +/** + Builds a Capsule Volume HOB. + + This function builds a Capsule Volume HOB. + It can only be invoked during PEI phase; + for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase. + + If the platform does not support Capsule Volume HOBs, then ASSERT(). + If there is no additional space for HOB creation, then ASSERT(). + + @param BaseAddress The base address of the Capsule Volume. + @param Length The size of the Capsule Volume in bytes. + +**/ +VOID +EFIAPI +BuildCvHob ( + IN EFI_PHYSICAL_ADDRESS BaseAddress, + IN UINT64 Length + ) +{ + EFI_HOB_UEFI_CAPSULE *Hob; + + Hob = CreateHob (EFI_HOB_TYPE_UEFI_CAPSULE, sizeof (EFI_HOB_UEFI_CAPSULE)); + ASSERT (Hob != NULL); + if (Hob == NULL) { + return; + } + + Hob->BaseAddress = BaseAddress; + Hob->Length = Length; +} + /** Builds a HOB for the CPU. diff --git a/UefiPayloadPkg/Library/SblParseLib/SblParseLib.c b/UefiPayloadPkg/Library/SblParseLib/SblParseLib.c index fc6349c5b8d9..7cc615a35e8a 100644 --- a/UefiPayloadPkg/Library/SblParseLib/SblParseLib.c +++ b/UefiPayloadPkg/Library/SblParseLib/SblParseLib.c @@ -325,3 +325,23 @@ ParseFirmwareInfo ( { return RETURN_NOT_FOUND; } + +/** + Parse update capsules passed in by bootloader + + @param CapsuleCallback The callback routine invoked for each capsule. + + @retval RETURN_SUCCESS Successfully parsed capsules. + @retval RETURN_NOT_FOUND Failed to look up the information. +**/ +RETURN_STATUS +EFIAPI +ParseCapsules ( + IN BL_CAPSULE_CALLBACK CapsuleCallback + ) +{ + // + // Treat not supporting this function like reporting zero capsules. + // + return RETURN_SUCCESS; +} diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c index 468c36625c9a..95cc3a8f2939 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c @@ -457,6 +457,15 @@ BuildHobFromBl ( return Status; } + // + // Import update capsules, if there are any. + // + Status = ParseCapsules (BuildCvHob); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Error when importing update capsules, Status = %r\n", Status)); + return Status; + } + return EFI_SUCCESS; } From d43451b52003ec6eedf0db933d3419515809191e Mon Sep 17 00:00:00 2001 From: Sergii Dmytruk Date: Sun, 30 Jun 2024 18:51:35 +0300 Subject: [PATCH 0377/1172] MdeModulePkg: Add PcdCapsuleFmpSupport When set to TRUE, bit EFI_OS_INDICATIONS_FMP_CAPSULE_SUPPORTED of OsIndications is set. At the moment EDK never sets this bit (there is only definition with no uses), maybe nothing actually checks its value. Whatever the reason is, it seems like a good idea to make setting it possible. Signed-off-by: Sergii Dmytruk --- MdeModulePkg/MdeModulePkg.dec | 8 ++++++++ MdeModulePkg/Universal/BdsDxe/BdsDxe.inf | 1 + MdeModulePkg/Universal/BdsDxe/BdsEntry.c | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 24cc64f6b474..8820059e7ce6 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -1674,6 +1674,14 @@ # @Prompt Maximum Number of PEI Reset Filters, Reset Notifications or Reset Handlers. gEfiMdeModulePkgTokenSpaceGuid.PcdMaximumPeiResetNotifies|0x10|UINT32|0x0000010A + ## Whether to report support of FMP capsules in OsIndicationSupport.

+ # This PCD indicates if support of FMP capsules should be advertised.
+ # TRUE - support of FMP capsules is advertised.
+ # FALSE - support of FMP capsules is not advertised.
+ # If platform does not use this feature, this PCD should be set to FALSE.

+ # @Prompt Enable advertising support of FMP capsules. + gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleFmpSupport|FALSE|BOOLEAN|0x00000028 + ## Capsule On Disk is to deliver capsules via files on Mass Storage device.

# This PCD indicates if the Capsule On Disk is supported.
# TRUE - Capsule On Disk is supported.
diff --git a/MdeModulePkg/Universal/BdsDxe/BdsDxe.inf b/MdeModulePkg/Universal/BdsDxe/BdsDxe.inf index 5bac635def93..95d2607b8d1f 100644 --- a/MdeModulePkg/Universal/BdsDxe/BdsDxe.inf +++ b/MdeModulePkg/Universal/BdsDxe/BdsDxe.inf @@ -97,6 +97,7 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdErrorCodeSetVariable ## SOMETIMES_CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleOnDiskSupport ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleFmpSupport ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdPlatformRecoverySupport ## CONSUMES [Depex] diff --git a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c b/MdeModulePkg/Universal/BdsDxe/BdsEntry.c index 72de8d3211b7..78564919f312 100644 --- a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c +++ b/MdeModulePkg/Universal/BdsDxe/BdsEntry.c @@ -580,6 +580,10 @@ BdsFormalizeOSIndicationVariable ( OsIndicationSupport |= EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED; } + if (PcdGetBool (PcdCapsuleFmpSupport)) { + OsIndicationSupport |= EFI_OS_INDICATIONS_FMP_CAPSULE_SUPPORTED; + } + Status = gRT->SetVariable ( EFI_OS_INDICATIONS_SUPPORT_VARIABLE_NAME, &gEfiGlobalVariableGuid, From f53b19f6c8ff6bababee3063d1e4f14abd723709 Mon Sep 17 00:00:00 2001 From: Sergii Dmytruk Date: Sun, 30 Jun 2024 19:17:38 +0300 Subject: [PATCH 0378/1172] UefiPayloadPkg: Enable processing of capsules Make UefiPayloadPkg.dsc add required libraries/DXEs/PCDs when CAPSULE_SUPPORT define is set to TRUE. UefiPayloadEntry now parses firmware information from a bootloader and switches boot mode to BOOT_ON_FLASH_UPDATE if there are any capsules. It's not guarded by any PCD under the assumption that bootloader won't pass capsules if EDK shouldn't be handling them. EsrtDxe is enabled to manage ESRT entries and it consumes the firmware information HOB created by UefiPayloadEntry. ProcessCapsules() internally looks up EsrtManagementProtocol and calls SyncEsrtFmp() to import data from available FMP instances. PlatformBootManagerLib was made to call ProcessCapsules() twice: before and after end-of-DXE. Signed-off-by: Sergii Dmytruk --- .../PlatformBootManager.c | 39 +++++++++++++++++++ .../PlatformBootManager.h | 2 + .../PlatformBootManagerLib.inf | 2 + .../UefiPayloadEntry/UefiPayloadEntry.c | 23 ++++++++++- .../UefiPayloadEntry/UefiPayloadEntry.h | 1 + .../UefiPayloadEntry/UefiPayloadEntry.inf | 1 + UefiPayloadPkg/UefiPayloadPkg.dsc | 20 +++++++++- UefiPayloadPkg/UefiPayloadPkg.fdf | 7 ++++ 8 files changed, 93 insertions(+), 2 deletions(-) diff --git a/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManager.c b/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManager.c index a4a49da0e9c5..0788d850abf3 100644 --- a/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManager.c +++ b/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManager.c @@ -226,6 +226,7 @@ PlatformBootManagerBeforeConsole ( VOID ) { + EFI_STATUS Status; EFI_INPUT_KEY Enter; EFI_INPUT_KEY CustomKey; EFI_INPUT_KEY Down; @@ -263,6 +264,17 @@ PlatformBootManagerBeforeConsole ( EfiBootManagerGetBootManagerMenu (&BootOption); EfiBootManagerAddKeyOptionVariable (NULL, (UINT16)BootOption.OptionNumber, 0, &Down, NULL); + // + // Process update capsules that don't contain embedded drivers. + // + if (GetBootModeHob () == BOOT_ON_FLASH_UPDATE) { + // TODO: when enabling capsule support for laptops, add a battery check here + Status = ProcessCapsules (); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a(): ProcessCapsule() failed with: %r\n", __func__, Status)); + } + } + // // Install ready to lock. // This needs to be done before option rom dispatched. @@ -311,6 +323,33 @@ PlatformBootManagerAfterConsole ( EfiBootManagerConnectAll (); EfiBootManagerRefreshAllBootOption (); + // + // Active BOOT_ON_FLASH_UPDATE mode means that at least one capsule has been + // discovered by a bootloader and passed for further processing into EDK which + // created EFI_HOB_TYPE_UEFI_CAPSULE HOB(s). + // + // Process update capsules that weren't processed on the first call to + // ProcessCapsules() in PlatformBootManagerBeforeConsole(). + // + if (GetBootModeHob () == BOOT_ON_FLASH_UPDATE) { + // TODO: when enabling capsule support for laptops, add a battery check here + Status = ProcessCapsules (); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a(): ProcessCapsule() failed with: %r\n", __func__, Status)); + } + + // + // Reset the system to disable SMI handler in order to exclude the + // possibility of it being used outside of the firmware. + // + // In practice, this will rarely execute because even the first + // ProcessCapsules() invocation might do a reset if all capsules were + // processed and at least one of them needed a reset. This is just to catch + // a case when this doesn't happen which is possible on error. + // + gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); + } + // // Register UEFI Shell // diff --git a/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManager.h b/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManager.h index 2110997d9bbc..88a83af04798 100644 --- a/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManager.h +++ b/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManager.h @@ -26,6 +26,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include +#include +#include #include typedef struct { diff --git a/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf b/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf index 987c73040e58..e803cc80c5cd 100644 --- a/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf +++ b/UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf @@ -47,6 +47,8 @@ HiiLib PrintLib PlatformHookLib + CapsuleLib + HobLib [Guids] gEfiEndOfDxeEventGroupGuid diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c index 95cc3a8f2939..343676d892c0 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c @@ -342,6 +342,8 @@ BuildHobFromBl ( ACPI_BOARD_INFO *AcpiBoardInfo; SMMSTORE_INFO SmmStoreInfo; SMMSTORE_INFO *NewSmmStoreInfo; + FIRMWARE_INFO FirmwareInfo; + FIRMWARE_INFO *NewFirmwareInfo; EFI_PEI_GRAPHICS_INFO_HOB GfxInfo; EFI_PEI_GRAPHICS_INFO_HOB *NewGfxInfo; EFI_PEI_GRAPHICS_DEVICE_INFO_HOB GfxDeviceInfo; @@ -399,6 +401,17 @@ BuildHobFromBl ( DEBUG ((DEBUG_INFO, "Created SmmStore info hob\n")); } + // + // Create guid hob for firmware information + // + Status = ParseFirmwareInfo (&FirmwareInfo); + if (!EFI_ERROR (Status)) { + NewFirmwareInfo = BuildGuidHob (&gEfiFirmwareInfoHobGuid, sizeof (FirmwareInfo)); + ASSERT (NewFirmwareInfo != NULL); + CopyMem (NewFirmwareInfo, &FirmwareInfo, sizeof (FirmwareInfo)); + DEBUG ((DEBUG_INFO, "Created firmware info hob\n")); + } + // // Create SmBios table Hob // @@ -521,6 +534,7 @@ _ModuleEntryPoint ( EFI_PEI_HOB_POINTERS Hob; SERIAL_PORT_INFO SerialPortInfo; UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO *UniversalSerialPort; + EFI_HOB_HANDOFF_INFO_TABLE *HobInfo; Status = PcdSet64S (PcdBootloaderParameter, BootloaderParameter); ASSERT_EFI_ERROR (Status); @@ -544,7 +558,7 @@ _ModuleEntryPoint ( HobMemTop = HobMemBase + FixedPcdGet32 (PcdSystemMemoryUefiRegionSize); - HobConstructor ((VOID *)MemBase, (VOID *)HobMemTop, (VOID *)HobMemBase, (VOID *)HobMemTop); + HobInfo = HobConstructor ((VOID *)MemBase, (VOID *)HobMemTop, (VOID *)HobMemBase, (VOID *)HobMemTop); // // Build serial port info @@ -600,6 +614,13 @@ _ModuleEntryPoint ( DEBUG ((DEBUG_INFO, "DxeCoreEntryPoint = 0x%lx\n", DxeCoreEntryPoint)); + // + // Switch to update mode if there is at least one capsule. + // + if (GetFirstHob (EFI_HOB_TYPE_UEFI_CAPSULE) != NULL) { + HobInfo->BootMode = BOOT_ON_FLASH_UPDATE; + } + // // Mask off all legacy 8259 interrupt sources // diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h index b6fe5ef738f1..87e156479815 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h @@ -38,6 +38,7 @@ #include #include #include +#include #include #define LEGACY_8259_MASK_REGISTER_MASTER 0x21 diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf index 702be0d7a0d5..8795f1b17d31 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf @@ -71,6 +71,7 @@ gUniversalPayloadSmbiosTableGuid gUniversalPayloadAcpiTableGuid gUniversalPayloadSerialPortInfoGuid + gEfiFirmwareInfoHobGuid gEfiSmmStoreInfoHobGuid [FeaturePcd.IA32] diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index 76e4e58f50a6..c62168bd06db 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -278,8 +278,15 @@ UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf !if $(CAPSULE_SUPPORT) == TRUE - CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf + CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf + !if $(BOOTSPLASH_IMAGE) + # Note, however, that DisplayUpdateProgressLibGraphics aborts firmware + # update if GOP is missing, so text progress works in more environments. + DisplayUpdateProgressLib|MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/DisplayUpdateProgressLibGraphics.inf + !else + DisplayUpdateProgressLib|MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLibText.inf + !endif !else CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf !endif @@ -496,6 +503,9 @@ !if $(PERFORMANCE_MEASUREMENT_ENABLE) PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf !endif +!if $(CAPSULE_SUPPORT) == TRUE + CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf +!endif [LibraryClasses.common.UEFI_DRIVER,LibraryClasses.common.UEFI_APPLICATION] PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf @@ -554,6 +564,8 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE gEfiMdeModulePkgTokenSpaceGuid.PcdHiiOsRuntimeSupport|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdPciDegradeResourceForOptionRom|FALSE + ## Whether capsules are allowed to persist across reset. + gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset|$(CAPSULE_SUPPORT) [PcdsFeatureFlag.X64] gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|TRUE @@ -592,6 +604,9 @@ gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength|1800000 + ## Whether FMP capsules are enabled. + gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleFmpSupport|$(CAPSULE_SUPPORT) + !if $(CRYPTO_PROTOCOL_SUPPORT) == TRUE !if $(CRYPTO_DRIVER_EXTERNAL_SUPPORT) == FALSE gEfiCryptoPkgTokenSpaceGuid.PcdCryptoServiceFamilyEnable.HmacSha256.Family | PCD_CRYPTO_SERVICE_ENABLE_FAMILY @@ -944,6 +959,9 @@ NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf } MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenuApp.inf +!if $(CAPSULE_SUPPORT) == TRUE + MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf +!endif MdeModulePkg/Universal/Metronome/Metronome.inf diff --git a/UefiPayloadPkg/UefiPayloadPkg.fdf b/UefiPayloadPkg/UefiPayloadPkg.fdf index 06ca20761ac4..28afae75ddb2 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.fdf +++ b/UefiPayloadPkg/UefiPayloadPkg.fdf @@ -369,6 +369,13 @@ INF ShellPkg/DynamicCommand/DpDynamicCommand/DpDynamicCommand.inf INF ShellPkg/Application/Shell/Shell.inf !endif +# +# Capsules +# +!if $(CAPSULE_SUPPORT) == TRUE +INF MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf +!endif + !if $(UNIVERSAL_PAYLOAD) == TRUE !if $(SECURE_BOOT_ENABLE) == TRUE From e7a1b295532d7177ea390d3d4efc3b1a30cc58b6 Mon Sep 17 00:00:00 2001 From: Sergii Dmytruk Date: Fri, 12 Jul 2024 00:32:17 +0300 Subject: [PATCH 0379/1172] UefiPayloadPkg/UefiPayloadPkg.dsc: Enable FMP updates This is using test certificate stored in this repository. Building additionally requires setting CAPSULE_FIRMWARE_GUID to firmware GUID in string form. FDF file is not updated because FMP driver is to be embedded into update capsule. Signed-off-by: Sergii Dmytruk --- UefiPayloadPkg/UefiPayloadPkg.dsc | 36 ++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index c62168bd06db..c9fbd0b7c15a 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -43,10 +43,18 @@ DEFINE USE_CBMEM_FOR_CONSOLE = FALSE DEFINE BOOTSPLASH_IMAGE = FALSE DEFINE NVME_ENABLE = TRUE - DEFINE CAPSULE_SUPPORT = FALSE DEFINE LOCKBOX_SUPPORT = FALSE DEFINE LOAD_OPTION_ROMS = FALSE + # + # Capsule updates + # + # CAPSULE_MAIN_FW_GUID specifies GUID to be used by FmpDxe when + # CAPSULE_SUPPORT is set to TRUE + # + DEFINE CAPSULE_SUPPORT = FALSE + DEFINE CAPSULE_MAIN_FW_GUID = + # # Crypto Support # @@ -287,6 +295,14 @@ !else DisplayUpdateProgressLib|MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLibText.inf !endif + # If there are no specific checks to do, null-library suffices + CapsuleUpdatePolicyLib|FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibNull.inf + FmpAuthenticationLib|SecurityPkg/Library/FmpAuthenticationLibPkcs7/FmpAuthenticationLibPkcs7.inf + FmpDependencyCheckLib|FmpDevicePkg/Library/FmpDependencyCheckLib/FmpDependencyCheckLib.inf + # No need to save/restore FMP dependencies unless they are utilized + FmpDependencyDeviceLib|FmpDevicePkg/Library/FmpDependencyDeviceLibNull/FmpDependencyDeviceLibNull.inf + FmpDependencyLib|FmpDevicePkg/Library/FmpDependencyLib/FmpDependencyLib.inf + FmpPayloadHeaderLib|FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.inf !else CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf !endif @@ -960,6 +976,24 @@ } MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenuApp.inf !if $(CAPSULE_SUPPORT) == TRUE + # Build FmpDxe meant for the inclusion into an update capsule as an embedded driver. + FmpDevicePkg/FmpDxe/FmpDxe.inf { + + # FmpDxe interprets its FILE_GUID as firmware GUID. This allows including + # multiple FmpDxe instances along each other targeting different + # components. + FILE_GUID = $(CAPSULE_MAIN_FW_GUID) + + gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceImageIdName|L"System Firmware" + # Public certificate used for validation of UEFI capsules + # + # See BaseTools/Source/Python/Pkcs7Sign/Readme.md for more details on such + # PCDs and include files. + !include BaseTools/Source/Python/Pkcs7Sign/TestRoot.cer.gFmpDevicePkgTokenSpaceGuid.PcdFmpDevicePkcs7CertBufferXdr.inc + + # TODO: provide platform-specific implementation of firmware flashing + FmpDeviceLib|FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull.inf + } MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf !endif From 2736239acaa7eb6dd6866eab543d307f25ee4b56 Mon Sep 17 00:00:00 2001 From: Sergii Dmytruk Date: Sat, 20 Jul 2024 11:30:24 +0300 Subject: [PATCH 0380/1172] UefiPayloadPkg/SmmStore: Add API to read/write/erase any flash block This allows reusing SMMSTORE protocol for the purpose of firmware updates. Signed-off-by: Sergii Dmytruk --- UefiPayloadPkg/Include/Library/SmmStoreLib.h | 51 +++++ UefiPayloadPkg/Library/SmmStoreLib/SmmStore.c | 174 +++++++++++++++--- UefiPayloadPkg/Library/SmmStoreLib/SmmStore.h | 4 + 3 files changed, 208 insertions(+), 21 deletions(-) diff --git a/UefiPayloadPkg/Include/Library/SmmStoreLib.h b/UefiPayloadPkg/Include/Library/SmmStoreLib.h index bf0b8a01b833..13b51ee63cb1 100644 --- a/UefiPayloadPkg/Include/Library/SmmStoreLib.h +++ b/UefiPayloadPkg/Include/Library/SmmStoreLib.h @@ -1,6 +1,7 @@ /** @file SmmStoreLib.h Copyright (c) 2022, 9elements GmbH
+ Copyright (c) 2025, 3mdeb Sp. z o.o.
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -66,6 +67,25 @@ SmmStoreLibRead ( IN UINT8 *Buffer ); +/** + Read from an arbitrary flash location. The whole flash is represented as a + sequence of blocks. + + @param[in] Lba The starting logical block index to read from. + @param[in] Offset Offset into the block at which to begin reading. + @param[in] NumBytes On input, indicates the requested read size. On + output, indicates the actual number of bytes read + @param[in] Buffer Pointer to the buffer to read into. + +**/ +EFI_STATUS +SmmStoreLibReadAnyBlock ( + IN EFI_LBA Lba, + IN UINTN Offset, + IN UINTN *NumBytes, + IN UINT8 *Buffer + ); + /** Write to SmmStore @@ -84,6 +104,25 @@ SmmStoreLibWrite ( IN UINT8 *Buffer ); +/** + Write to an arbitrary flash location. The whole flash is represented as a + sequence of blocks. + + @param[in] Lba The starting logical block index to write to. + @param[in] Offset Offset into the block at which to begin writing. + @param[in] NumBytes On input, indicates the requested write size. On + output, indicates the actual number of bytes written + @param[in] Buffer Pointer to the data to write. + +**/ +EFI_STATUS +SmmStoreLibWriteAnyBlock ( + IN EFI_LBA Lba, + IN UINTN Offset, + IN UINTN *NumBytes, + IN UINT8 *Buffer + ); + /** Erase a block using the SmmStore @@ -95,6 +134,18 @@ SmmStoreLibEraseBlock ( IN EFI_LBA Lba ); +/** + Erase an arbitrary block of the flash. The whole flash is represented as a + sequence of blocks. + + @param Lba The logical block index to erase. + +**/ +EFI_STATUS +SmmStoreLibEraseAnyBlock ( + IN EFI_LBA Lba + ); + /** Function to update a pointer on virtual address change. Matches the signature and operation of EfiConvertPointer. diff --git a/UefiPayloadPkg/Library/SmmStoreLib/SmmStore.c b/UefiPayloadPkg/Library/SmmStoreLib/SmmStore.c index 690bae0f1cf1..f232b12e8a3c 100644 --- a/UefiPayloadPkg/Library/SmmStoreLib/SmmStore.c +++ b/UefiPayloadPkg/Library/SmmStoreLib/SmmStore.c @@ -1,6 +1,7 @@ /** @file SmmStore.c Copyright (c) 2022, 9elements GmbH
+ Copyright (c) 2025, 3mdeb Sp. z o.o.
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -139,33 +140,31 @@ SmmStoreLibGetMmioAddress ( } /** - Read from SmmStore + Read a flash block. The whole flash is represented as a + sequence of blocks. @param[in] Lba The starting logical block index to read from. @param[in] Offset Offset into the block at which to begin reading. @param[in] NumBytes On input, indicates the requested read size. On - output, indicates the actual number of bytes read. + output, indicates the actual number of bytes read @param[in] Buffer Pointer to the buffer to read into. + @param[in] ReadCmd Read command to use. + + @note Validation of mSmmStoreInfo and Lba must be done by the calling code. **/ +STATIC EFI_STATUS -SmmStoreLibRead ( +ReadBlock ( IN EFI_LBA Lba, IN UINTN Offset, IN UINTN *NumBytes, - IN UINT8 *Buffer + IN UINT8 *Buffer, + IN UINT8 ReadCmd ) { EFI_STATUS Status; - if (mSmmStoreInfo == NULL) { - return EFI_NO_MEDIA; - } - - if (Lba >= mSmmStoreInfo->NumBlocks) { - return EFI_INVALID_PARAMETER; - } - if (((*NumBytes + Offset) > mSmmStoreInfo->BlockSize) || ((*NumBytes + Offset) > mSmmStoreInfo->ComBufferSize)) { @@ -176,7 +175,7 @@ SmmStoreLibRead ( mArgComBuf->Read.BufOffset = Offset; mArgComBuf->Read.BlockId = Lba; - Status = CallSmm (mSmmStoreInfo->ApmCmd, SMMSTORE_CMD_RAW_READ, mArgComBufPhys); + Status = CallSmm (mSmmStoreInfo->ApmCmd, ReadCmd, mArgComBufPhys); if (EFI_ERROR (Status)) { return Status; } @@ -187,17 +186,17 @@ SmmStoreLibRead ( } /** - Write to SmmStore + Read from SmmStore - @param[in] Lba The starting logical block index to write to. - @param[in] Offset Offset into the block at which to begin writing. - @param[in] NumBytes On input, indicates the requested write size. On - output, indicates the actual number of bytes written. - @param[in] Buffer Pointer to the data to write. + @param[in] Lba The starting logical block index to read from. + @param[in] Offset Offset into the block at which to begin reading. + @param[in] NumBytes On input, indicates the requested read size. On + output, indicates the actual number of bytes read. + @param[in] Buffer Pointer to the buffer to read into. **/ EFI_STATUS -SmmStoreLibWrite ( +SmmStoreLibRead ( IN EFI_LBA Lba, IN UINTN Offset, IN UINTN *NumBytes, @@ -212,6 +211,59 @@ SmmStoreLibWrite ( return EFI_INVALID_PARAMETER; } + return ReadBlock (Lba, Offset, NumBytes, Buffer, SMMSTORE_CMD_RAW_READ); +} + +/** + Read from an arbitrary flash location. The whole flash is represented as a + sequence of blocks. + + @param[in] Lba The starting logical block index to read from. + @param[in] Offset Offset into the block at which to begin reading. + @param[in] NumBytes On input, indicates the requested read size. On + output, indicates the actual number of bytes read + @param[in] Buffer Pointer to the buffer to read into. + +**/ +EFI_STATUS +SmmStoreLibReadAnyBlock ( + IN EFI_LBA Lba, + IN UINTN Offset, + IN UINTN *NumBytes, + IN UINT8 *Buffer + ) +{ + if (mSmmStoreInfo == NULL) { + return EFI_NO_MEDIA; + } + + return ReadBlock (Lba, Offset, NumBytes, Buffer, SMMSTORE_CMD_USE_FULL_FLASH | SMMSTORE_CMD_RAW_READ); +} + +/** + Write a flash block. The whole flash is represented as a + sequence of blocks. + + @param[in] Lba The starting logical block index to write to. + @param[in] Offset Offset into the block at which to begin writing. + @param[in] NumBytes On input, indicates the requested write size. On + output, indicates the actual number of bytes written + @param[in] Buffer Pointer to the data to write. + @param[in] WriteCmd Write command to use. + + @note Validation of mSmmStoreInfo and Lba must be done by the calling code. + +**/ +STATIC +EFI_STATUS +WriteBlock ( + IN EFI_LBA Lba, + IN UINTN Offset, + IN UINTN *NumBytes, + IN UINT8 *Buffer, + IN UINT8 WriteCmd + ) +{ if (((*NumBytes + Offset) > mSmmStoreInfo->BlockSize) || ((*NumBytes + Offset) > mSmmStoreInfo->ComBufferSize)) { @@ -224,7 +276,62 @@ SmmStoreLibWrite ( CopyMem ((VOID *)(UINTN)(mSmmStoreInfo->ComBuffer + Offset), Buffer, *NumBytes); - return CallSmm (mSmmStoreInfo->ApmCmd, SMMSTORE_CMD_RAW_WRITE, mArgComBufPhys); + return CallSmm (mSmmStoreInfo->ApmCmd, WriteCmd, mArgComBufPhys); +} + +/** + Write to SmmStore + + @param[in] Lba The starting logical block index to write to. + @param[in] Offset Offset into the block at which to begin writing. + @param[in] NumBytes On input, indicates the requested write size. On + output, indicates the actual number of bytes written. + @param[in] Buffer Pointer to the data to write. + +**/ +EFI_STATUS +SmmStoreLibWrite ( + IN EFI_LBA Lba, + IN UINTN Offset, + IN UINTN *NumBytes, + IN UINT8 *Buffer + ) +{ + if (mSmmStoreInfo == NULL) { + return EFI_NO_MEDIA; + } + + if (Lba >= mSmmStoreInfo->NumBlocks) { + return EFI_INVALID_PARAMETER; + } + + return WriteBlock (Lba, Offset, NumBytes, Buffer, SMMSTORE_CMD_RAW_WRITE); +} + +/** + Write to an arbitrary flash location. The whole flash is represented as a + sequence of blocks. + + @param[in] Lba The starting logical block index to write to. + @param[in] Offset Offset into the block at which to begin writing. + @param[in] NumBytes On input, indicates the requested write size. On + output, indicates the actual number of bytes written + @param[in] Buffer Pointer to the data to write. + +**/ +EFI_STATUS +SmmStoreLibWriteAnyBlock ( + IN EFI_LBA Lba, + IN UINTN Offset, + IN UINTN *NumBytes, + IN UINT8 *Buffer + ) +{ + if (mSmmStoreInfo == NULL) { + return EFI_NO_MEDIA; + } + + return WriteBlock (Lba, Offset, NumBytes, Buffer, SMMSTORE_CMD_USE_FULL_FLASH | SMMSTORE_CMD_RAW_WRITE); } /** @@ -251,6 +358,31 @@ SmmStoreLibEraseBlock ( return CallSmm (mSmmStoreInfo->ApmCmd, SMMSTORE_CMD_RAW_CLEAR, mArgComBufPhys); } +/** + Erase an arbitrary block of the flash. The whole flash is represented as a + sequence of blocks. + + @param Lba The logical block index to erase. + +**/ +EFI_STATUS +SmmStoreLibEraseAnyBlock ( + IN EFI_LBA Lba + ) +{ + if (mSmmStoreInfo == NULL) { + return EFI_NO_MEDIA; + } + + mArgComBuf->Clear.BlockId = Lba; + + return CallSmm ( + mSmmStoreInfo->ApmCmd, + SMMSTORE_CMD_USE_FULL_FLASH | SMMSTORE_CMD_RAW_CLEAR, + mArgComBufPhys + ); +} + /** Fixup internal data so that EFI can be called in virtual mode. Converts any pointers in lib to virtual mode. This function is meant to diff --git a/UefiPayloadPkg/Library/SmmStoreLib/SmmStore.h b/UefiPayloadPkg/Library/SmmStoreLib/SmmStore.h index d91b8e13c6c4..11a42a728951 100644 --- a/UefiPayloadPkg/Library/SmmStoreLib/SmmStore.h +++ b/UefiPayloadPkg/Library/SmmStoreLib/SmmStore.h @@ -1,6 +1,7 @@ /** @file SmmStore.h Copyright (c) 2022, 9elements GmbH
+ Copyright (c) 2025, 3mdeb Sp. z o.o.
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -19,6 +20,9 @@ #define SMMSTORE_CMD_RAW_WRITE 6 #define SMMSTORE_CMD_RAW_CLEAR 7 +/* Used by capsule updates as a standalone command or modifier to v2 commands */ +#define SMMSTORE_CMD_USE_FULL_FLASH 0x80 + /* * This allows the payload to store raw data in the flash regions. * This can be used by a FaultTolerantWrite implementation, that uses at least From 68a7665250e814f4ce8dd10f4310ce27df21e495 Mon Sep 17 00:00:00 2001 From: Sergii Dmytruk Date: Sat, 20 Jul 2024 16:56:41 +0300 Subject: [PATCH 0381/1172] UefiPayloadPkg/FmpDeviceSmmLib: Add for full chip flashing via SMMSTOREv2 Part of the functions of the library are left unimplemented (return EFI_UNSUPPORTED) the rest use information about current firmware obtained from CBMEM (at this point available in a HOB) and SMMSTOREv2 to perform flashing. Flashing is slightly optimized: FmpDeviceSetImageWithStatus() first reads a block and checks that it differs from the new contents before initiating erase and write. On successful flashing runtime APIs for dealing with EFI variables are replaced with stubs to prevent accesses to SMMSTORE from the currently running firmware. The SMMSTORE region's contents and possibly location and size have been changed as a result of the update and continued use of it can have unpredictable consequences including corruption of the newly written firmware image. A capsule mode always ends with a reboot, so the variable services are unavailable only for a very short period after a successful flashing. Signed-off-by: Sergii Dmytruk --- .../Library/FmpDeviceSmmLib/FmpDeviceSmmLib.c | 1143 +++++++++++++++++ .../FmpDeviceSmmLib/FmpDeviceSmmLib.inf | 47 + .../FmpDeviceSmmLib/FmpDeviceSmmLib.uni | 13 + UefiPayloadPkg/UefiPayloadPkg.dsc | 8 +- 4 files changed, 1210 insertions(+), 1 deletion(-) create mode 100644 UefiPayloadPkg/Library/FmpDeviceSmmLib/FmpDeviceSmmLib.c create mode 100644 UefiPayloadPkg/Library/FmpDeviceSmmLib/FmpDeviceSmmLib.inf create mode 100644 UefiPayloadPkg/Library/FmpDeviceSmmLib/FmpDeviceSmmLib.uni diff --git a/UefiPayloadPkg/Library/FmpDeviceSmmLib/FmpDeviceSmmLib.c b/UefiPayloadPkg/Library/FmpDeviceSmmLib/FmpDeviceSmmLib.c new file mode 100644 index 000000000000..ff85401ef07b --- /dev/null +++ b/UefiPayloadPkg/Library/FmpDeviceSmmLib/FmpDeviceSmmLib.c @@ -0,0 +1,1143 @@ +/** @file + Provides firmware device specific services to support updates of a firmware + image stored in a firmware device. + + This implementation uses SmmStoreLib to update the whole flash chip. For + this to work correctly Intel ME or an equivalent need to be disabled and all + flash chip protections need to be lifted (rather, not applied) if coreboot + finds any capsules during initialization. It is done to allow updating ME or + changing chip's layout in a new firmware (e.g., to allocate more space for + the BIOS region). In the future, this can be made more flexible, say, by + parsing coreboot's FMAP and only updating some regions. Such functionality + probably need embedding more knowledge about specific firmware image via a + new library to be customized for specific use-cases. + + Copyright (c) Microsoft Corporation.
+ Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.
+ Copyright (c) 2025, 3mdeb Sp. z o.o. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + This function requests firmware information on the first call, caches it and + returns on all calls afterwards. + + @param[out] Info Place to store a pointer to firmware information. + + @retval EFI_SUCCESS Info points to firmware information. + @retval EFI_INVALID_PARAMETER Info is NULL. +**/ +STATIC +EFI_STATUS +GetFwInfo ( + OUT FIRMWARE_INFO **Info + ) +{ + STATIC FIRMWARE_INFO Storage; + STATIC BOOLEAN Initialized; + + EFI_HOB_GUID_TYPE *GuidHob; + + if (Info == NULL) { + return EFI_INVALID_PARAMETER; + } + + if (!Initialized) { + GuidHob = GetFirstGuidHob (&gEfiFirmwareInfoHobGuid); + if (GuidHob == NULL) { + DEBUG ((DEBUG_ERROR, "%a(): failed to query firmware information\n", __func__)); + return EFI_UNSUPPORTED; + } + + Storage = *(FIRMWARE_INFO *)GET_GUID_HOB_DATA (GuidHob); + Initialized = TRUE; + } + + *Info = &Storage; + return EFI_SUCCESS; +} + +/** + Provide a function to install the Firmware Management Protocol instance onto a + device handle when the device is managed by a driver that follows the UEFI + Driver Model. If the device is not managed by a driver that follows the UEFI + Driver Model, then EFI_UNSUPPORTED is returned. + + @param[in] FmpInstaller Function that installs the Firmware Management + Protocol. + + @retval EFI_SUCCESS The device is managed by a driver that follows the + UEFI Driver Model. FmpInstaller must be called on + each Driver Binding Start(). + @retval EFI_UNSUPPORTED The device is not managed by a driver that follows + the UEFI Driver Model. + @retval other The Firmware Management Protocol for this firmware + device is not installed. The firmware device is + still locked using FmpDeviceLock(). +**/ +EFI_STATUS +EFIAPI +RegisterFmpInstaller ( + IN FMP_DEVICE_LIB_REGISTER_FMP_INSTALLER Function + ) +{ + return EFI_UNSUPPORTED; +} + +/** + Provide a function to uninstall the Firmware Management Protocol instance from a + device handle when the device is managed by a driver that follows the UEFI + Driver Model. If the device is not managed by a driver that follows the UEFI + Driver Model, then EFI_UNSUPPORTED is returned. + + @param[in] FmpUninstaller Function that installs the Firmware Management + Protocol. + + @retval EFI_SUCCESS The device is managed by a driver that follows the + UEFI Driver Model. FmpUninstaller must be called on + each Driver Binding Stop(). + @retval EFI_UNSUPPORTED The device is not managed by a driver that follows + the UEFI Driver Model. + @retval other The Firmware Management Protocol for this firmware + device is not installed. The firmware device is + still locked using FmpDeviceLock(). +**/ +EFI_STATUS +EFIAPI +RegisterFmpUninstaller ( + IN FMP_DEVICE_LIB_REGISTER_FMP_UNINSTALLER Function + ) +{ + return EFI_UNSUPPORTED; +} + +/** + Set the device context for the FmpDeviceLib services when the device is + managed by a driver that follows the UEFI Driver Model. If the device is not + managed by a driver that follows the UEFI Driver Model, then EFI_UNSUPPORTED + is returned. Once a device context is set, the FmpDeviceLib services + operate on the currently set device context. + + @param[in] Handle Device handle for the FmpDeviceLib services. + If Handle is NULL, then Context is freed. + @param[in, out] Context Device context for the FmpDeviceLib services. + If Context is NULL, then a new context is allocated + for Handle and the current device context is set and + returned in Context. If Context is not NULL, then + the current device context is set. + + @retval EFI_SUCCESS The device is managed by a driver that follows the + UEFI Driver Model. + @retval EFI_UNSUPPORTED The device is not managed by a driver that follows + the UEFI Driver Model. + @retval other The Firmware Management Protocol for this firmware + device is not installed. The firmware device is + still locked using FmpDeviceLock(). +**/ +EFI_STATUS +EFIAPI +FmpDeviceSetContext ( + IN EFI_HANDLE Handle, + IN OUT VOID **Context + ) +{ + return EFI_UNSUPPORTED; +} + +/** + Returns the size, in bytes, of the firmware image currently stored in the + firmware device. This function is used to by the GetImage() and + GetImageInfo() services of the Firmware Management Protocol. If the image + size can not be determined from the firmware device, then 0 must be returned. + + @param[out] Size Pointer to the size, in bytes, of the firmware image + currently stored in the firmware device. + + @retval EFI_SUCCESS The size of the firmware image currently + stored in the firmware device was returned. + @retval EFI_INVALID_PARAMETER Size is NULL. + @retval EFI_UNSUPPORTED The firmware device does not support reporting + the size of the currently stored firmware image. + @retval EFI_DEVICE_ERROR An error occurred attempting to determine the + size of the firmware image currently stored in + in the firmware device. +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetSize ( + OUT UINTN *Size + ) +{ + EFI_STATUS Status; + FIRMWARE_INFO *FwInfo; + + if (Size == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = GetFwInfo (&FwInfo); + if (!EFI_ERROR (Status)) { + *Size = FwInfo->ImageSize; + } + + return Status; +} + +/** + Returns the GUID value used to fill in the ImageTypeId field of the + EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo() + service of the Firmware Management Protocol. If EFI_UNSUPPORTED is returned, + then the ImageTypeId field is set to gEfiCallerIdGuid. If EFI_SUCCESS is + returned, then ImageTypeId is set to the Guid returned from this function. + + @param[out] Guid Double pointer to a GUID value that is updated to point to + to a GUID value. The GUID value is not allocated and must + not be modified or freed by the caller. + + @retval EFI_SUCCESS EFI_FIRMWARE_IMAGE_DESCRIPTOR ImageTypeId GUID is set + to the returned Guid value. + @retval EFI_UNSUPPORTED EFI_FIRMWARE_IMAGE_DESCRIPTOR ImageTypeId GUID is set + to gEfiCallerIdGuid. +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetImageTypeIdGuidPtr ( + OUT EFI_GUID **Guid + ) +{ + EFI_STATUS Status; + FIRMWARE_INFO *FwInfo; + + if (Guid == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = GetFwInfo (&FwInfo); + if (!EFI_ERROR (Status)) { + *Guid = &FwInfo->Type; + } + + return Status; +} + +/** + Returns values used to fill in the AttributesSupported and AttributesSettings + fields of the EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the + GetImageInfo() service of the Firmware Management Protocol. The following + bit values from the Firmware Management Protocol may be combined: + IMAGE_ATTRIBUTE_IMAGE_UPDATABLE + IMAGE_ATTRIBUTE_RESET_REQUIRED + IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED + IMAGE_ATTRIBUTE_IN_USE + IMAGE_ATTRIBUTE_UEFI_IMAGE + + @param[out] Supported Attributes supported by this firmware device. + @param[out] Setting Attributes settings for this firmware device. + + @retval EFI_SUCCESS The attributes supported by the firmware + device were returned. + @retval EFI_INVALID_PARAMETER Supported is NULL. + @retval EFI_INVALID_PARAMETER Setting is NULL. +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetAttributes ( + OUT UINT64 *Supported, + OUT UINT64 *Setting + ) +{ + if ((Supported == NULL) || (Setting == NULL)) { + return EFI_INVALID_PARAMETER; + } + + *Supported = IMAGE_ATTRIBUTE_IMAGE_UPDATABLE | + IMAGE_ATTRIBUTE_RESET_REQUIRED | + IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED | + IMAGE_ATTRIBUTE_IN_USE; + *Setting = *Supported; + return EFI_SUCCESS; +} + +/** + Returns the value used to fill in the LowestSupportedVersion field of the + EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo() + service of the Firmware Management Protocol. If EFI_SUCCESS is returned, then + the firmware device supports a method to report the LowestSupportedVersion + value from the currently stored firmware image. If the value can not be + reported for the firmware image currently stored in the firmware device, then + EFI_UNSUPPORTED must be returned. EFI_DEVICE_ERROR is returned if an error + occurs attempting to retrieve the LowestSupportedVersion value for the + currently stored firmware image. + + @note It is recommended that all firmware devices support a method to report + the LowestSupportedVersion value from the currently stored firmware + image. + + @param[out] LowestSupportedVersion LowestSupportedVersion value retrieved + from the currently stored firmware image. + + @retval EFI_SUCCESS The lowest supported version of currently stored + firmware image was returned in LowestSupportedVersion. + @retval EFI_UNSUPPORTED The firmware device does not support a method to + report the lowest supported version of the currently + stored firmware image. + @retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the lowest + supported version of the currently stored firmware + image. +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetLowestSupportedVersion ( + OUT UINT32 *LowestSupportedVersion + ) +{ + EFI_STATUS Status; + FIRMWARE_INFO *FwInfo; + + if (LowestSupportedVersion == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = GetFwInfo (&FwInfo); + if (!EFI_ERROR (Status)) { + *LowestSupportedVersion = FwInfo->LowestSupportedVersion; + } + + return Status; +} + +/** + Returns the Null-terminated Unicode string that is used to fill in the + VersionName field of the EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is + returned by the GetImageInfo() service of the Firmware Management Protocol. + The returned string must be allocated using EFI_BOOT_SERVICES.AllocatePool(). + + @note It is recommended that all firmware devices support a method to report + the VersionName string from the currently stored firmware image. + + @param[out] VersionString The version string retrieved from the currently + stored firmware image. + + @retval EFI_SUCCESS The version string of currently stored + firmware image was returned in Version. + @retval EFI_INVALID_PARAMETER VersionString is NULL. + @retval EFI_UNSUPPORTED The firmware device does not support a method + to report the version string of the currently + stored firmware image. + @retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the + version string of the currently stored + firmware image. + @retval EFI_OUT_OF_RESOURCES There are not enough resources to allocate the + buffer for the version string of the currently + stored firmware image. +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetVersionString ( + OUT CHAR16 **VersionString + ) +{ + EFI_STATUS Status; + FIRMWARE_INFO *FwInfo; + + if (VersionString == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = GetFwInfo (&FwInfo); + if (!EFI_ERROR (Status)) { + *VersionString = (CHAR16 *)AllocateCopyPool ( + sizeof (FwInfo->VersionStr), + FwInfo->VersionStr + ); + if (*VersionString == NULL) { + Status = EFI_OUT_OF_RESOURCES; + } + } + + return Status; +} + +/** + Returns the value used to fill in the Version field of the + EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo() + service of the Firmware Management Protocol. If EFI_SUCCESS is returned, then + the firmware device supports a method to report the Version value from the + currently stored firmware image. If the value can not be reported for the + firmware image currently stored in the firmware device, then EFI_UNSUPPORTED + must be returned. EFI_DEVICE_ERROR is returned if an error occurs attempting + to retrieve the LowestSupportedVersion value for the currently stored firmware + image. + + @note It is recommended that all firmware devices support a method to report + the Version value from the currently stored firmware image. + + @param[out] Version The version value retrieved from the currently stored + firmware image. + + @retval EFI_SUCCESS The version of currently stored firmware image was + returned in Version. + @retval EFI_UNSUPPORTED The firmware device does not support a method to + report the version of the currently stored firmware + image. + @retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the version + of the currently stored firmware image. +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetVersion ( + OUT UINT32 *Version + ) +{ + EFI_STATUS Status; + FIRMWARE_INFO *FwInfo; + + if (Version == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = GetFwInfo (&FwInfo); + if (!EFI_ERROR (Status)) { + *Version = FwInfo->Version; + } + + return Status; +} + +/** + Returns the value used to fill in the HardwareInstance field of the + EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo() + service of the Firmware Management Protocol. If EFI_SUCCESS is returned, then + the firmware device supports a method to report the HardwareInstance value. + If the value can not be reported for the firmware device, then EFI_UNSUPPORTED + must be returned. EFI_DEVICE_ERROR is returned if an error occurs attempting + to retrieve the HardwareInstance value for the firmware device. + + @param[out] HardwareInstance The hardware instance value for the firmware + device. + + @retval EFI_SUCCESS The hardware instance for the current firmware + device is returned in HardwareInstance. + @retval EFI_UNSUPPORTED The firmware device does not support a method to + report the hardware instance value. + @retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the hardware + instance value. +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetHardwareInstance ( + OUT UINT64 *HardwareInstance + ) +{ + if (HardwareInstance == NULL) { + return EFI_INVALID_PARAMETER; + } + + *HardwareInstance = 0; + return EFI_SUCCESS; +} + +/** + Returns a copy of the firmware image currently stored in the firmware device. + + @note It is recommended that all firmware devices support a method to retrieve + a copy currently stored firmware image. This can be used to support + features such as recovery and rollback. + + @param[out] Image Pointer to a caller allocated buffer where the + currently stored firmware image is copied to. + @param[in, out] ImageSize Pointer the size, in bytes, of the Image buffer. + On return, points to the size, in bytes, of firmware + image currently stored in the firmware device. + + @retval EFI_SUCCESS Image contains a copy of the firmware image + currently stored in the firmware device, and + ImageSize contains the size, in bytes, of the + firmware image currently stored in the + firmware device. + @retval EFI_BUFFER_TOO_SMALL The buffer specified by ImageSize is too small + to hold the firmware image currently stored in + the firmware device. The buffer size required + is returned in ImageSize. + @retval EFI_INVALID_PARAMETER The Image is NULL. + @retval EFI_INVALID_PARAMETER The ImageSize is NULL. + @retval EFI_UNSUPPORTED The operation is not supported. + @retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the + firmware image currently stored in the firmware + device. +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetImage ( + OUT VOID *Image, + IN OUT UINTN *ImageSize + ) +{ + // + // This seems useful only if FMP device is part of the running firmware. + // + return EFI_UNSUPPORTED; +} + +/** + Checks if a new firmware image is valid for the firmware device. This + function allows firmware update operation to validate the firmware image + before FmpDeviceSetImage() is called. + + @param[in] Image Points to a new firmware image. + @param[in] ImageSize Size, in bytes, of a new firmware image. + @param[out] ImageUpdatable Indicates if a new firmware image is valid for + a firmware update to the firmware device. The + following values from the Firmware Management + Protocol are supported: + IMAGE_UPDATABLE_VALID + IMAGE_UPDATABLE_INVALID + IMAGE_UPDATABLE_INVALID_TYPE + IMAGE_UPDATABLE_INVALID_OLD + IMAGE_UPDATABLE_VALID_WITH_VENDOR_CODE + + @retval EFI_SUCCESS The image was successfully checked. Additional + status information is returned in + ImageUpdatable. + @retval EFI_INVALID_PARAMETER Image is NULL. + @retval EFI_INVALID_PARAMETER ImageUpdatable is NULL. +**/ +EFI_STATUS +EFIAPI +FmpDeviceCheckImage ( + IN CONST VOID *Image, + IN UINTN ImageSize, + OUT UINT32 *ImageUpdatable + ) +{ + UINT32 LastAttemptStatus; + + return FmpDeviceCheckImageWithStatus (Image, ImageSize, ImageUpdatable, &LastAttemptStatus); +} + +/** + Checks if a new firmware image is valid for the firmware device. This + function allows firmware update operation to validate the firmware image + before FmpDeviceSetImage() is called. + + @param[in] Image Points to a new firmware image. + @param[in] ImageSize Size, in bytes, of a new firmware image. + @param[out] ImageUpdatable Indicates if a new firmware image is valid for + a firmware update to the firmware device. The + following values from the Firmware Management + Protocol are supported: + IMAGE_UPDATABLE_VALID + IMAGE_UPDATABLE_INVALID + IMAGE_UPDATABLE_INVALID_TYPE + IMAGE_UPDATABLE_INVALID_OLD + IMAGE_UPDATABLE_VALID_WITH_VENDOR_CODE + @param[out] LastAttemptStatus A pointer to a UINT32 that holds the last attempt + status to report back to the ESRT table in case + of error. + + The return status code must fall in the range of + LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MIN_ERROR_CODE_VALUE to + LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MAX_ERROR_CODE_VALUE. + + If the value falls outside this range, it will be converted + to LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL. + + @retval EFI_SUCCESS The image was successfully checked. Additional + status information is returned in + ImageUpdatable. + @retval EFI_INVALID_PARAMETER Image is NULL. + @retval EFI_INVALID_PARAMETER ImageUpdatable is NULL. +**/ +EFI_STATUS +EFIAPI +FmpDeviceCheckImageWithStatus ( + IN CONST VOID *Image, + IN UINTN ImageSize, + OUT UINT32 *ImageUpdatable, + OUT UINT32 *LastAttemptStatus + ) +{ + EFI_STATUS Status; + UINTN FwSize; + UINTN BlockSize; + + if ((Image == NULL) || (ImageUpdatable == NULL)) { + return EFI_INVALID_PARAMETER; + } + + *LastAttemptStatus = LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL; + *ImageUpdatable = IMAGE_UPDATABLE_INVALID; + + Status = FmpDeviceGetSize (&FwSize); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a(): FmpDeviceGetSize() failed with: %r\n", __func__, Status)); + return Status; + } + + if (ImageSize != FwSize) { + DEBUG (( + DEBUG_ERROR, + "%a(): image size (0x%x) doesn't match firmware size (0x%x)\n", + __func__, + ImageSize, + FwSize + )); + return EFI_ABORTED; + } + + Status = SmmStoreLibGetBlockSize (&BlockSize); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a(): SmmStoreLibGetBlockSize() failed with: %r\n", __func__, Status)); + return Status; + } + + if (FwSize % BlockSize != 0) { + DEBUG (( + DEBUG_ERROR, + "%a(): firmware size (0x%x) is not a multiple of block size (0x%x)\n", + __func__, + FwSize, + BlockSize + )); + return EFI_ABORTED; + } + + *LastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS; + *ImageUpdatable = IMAGE_UPDATABLE_VALID; + return EFI_SUCCESS; +} + +/** + Updates a firmware device with a new firmware image. This function returns + EFI_UNSUPPORTED if the firmware image is not updatable. If the firmware image + is updatable, the function should perform the following minimal validations + before proceeding to do the firmware image update. + - Validate that the image is a supported image for this firmware device. + Return EFI_ABORTED if the image is not supported. Additional details + on why the image is not a supported image may be returned in AbortReason. + - Validate the data from VendorCode if is not NULL. Firmware image + validation must be performed before VendorCode data validation. + VendorCode data is ignored or considered invalid if image validation + fails. Return EFI_ABORTED if the VendorCode data is invalid. + + VendorCode enables vendor to implement vendor-specific firmware image update + policy. Null if the caller did not specify the policy or use the default + policy. As an example, vendor can implement a policy to allow an option to + force a firmware image update when the abort reason is due to the new firmware + image version is older than the current firmware image version or bad image + checksum. Sensitive operations such as those wiping the entire firmware image + and render the device to be non-functional should be encoded in the image + itself rather than passed with the VendorCode. AbortReason enables vendor to + have the option to provide a more detailed description of the abort reason to + the caller. + + @param[in] Image Points to the new firmware image. + @param[in] ImageSize Size, in bytes, of the new firmware image. + @param[in] VendorCode This enables vendor to implement vendor-specific + firmware image update policy. NULL indicates + the caller did not specify the policy or use the + default policy. + @param[in] Progress A function used to report the progress of + updating the firmware device with the new + firmware image. + @param[in] CapsuleFwVersion The version of the new firmware image from the + update capsule that provided the new firmware + image. + @param[out] AbortReason A pointer to a pointer to a Null-terminated + Unicode string providing more details on an + aborted operation. The buffer is allocated by + this function with + EFI_BOOT_SERVICES.AllocatePool(). It is the + caller's responsibility to free this buffer with + EFI_BOOT_SERVICES.FreePool(). + + @retval EFI_SUCCESS The firmware device was successfully updated + with the new firmware image. + @retval EFI_ABORTED The operation is aborted. Additional details + are provided in AbortReason. + @retval EFI_INVALID_PARAMETER The Image was NULL. + @retval EFI_UNSUPPORTED The operation is not supported. +**/ +EFI_STATUS +EFIAPI +FmpDeviceSetImage ( + IN CONST VOID *Image, + IN UINTN ImageSize, + IN CONST VOID *VendorCode OPTIONAL, + IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress OPTIONAL, + IN UINT32 CapsuleFwVersion, + OUT CHAR16 **AbortReason + ) +{ + UINT32 LastAttemptStatus; + + return FmpDeviceSetImageWithStatus ( + Image, + ImageSize, + VendorCode, + Progress, + CapsuleFwVersion, + AbortReason, + &LastAttemptStatus + ); +} + +/** + Advances progress of the operation by a single step, converts the steps to + percents and invokes a callback if there is one. + + @param[in] Callback External callback for progress reporting + or NULL if there is none. + @param[in] TotalSteps Total number of flashing steps. + @param[in, out] Step Current step number. + @param[in, out] ShouldReportProgress A flag indicating whether progress needs + to be reported. +**/ +STATIC +VOID +IncrementProgress ( + IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Callback OPTIONAL, + IN UINTN TotalSteps, + IN OUT UINTN *Step, + IN OUT BOOLEAN *ShouldReportProgress + ) +{ + EFI_STATUS Status; + UINTN Progress; + + if (!*ShouldReportProgress) { + return; + } + + if (Callback == NULL) { + *ShouldReportProgress = FALSE; + return; + } + + ++*Step; + Progress = (*Step * 100) / TotalSteps; + + // + // Value of 0 means "progress reporting is not supported", so avoid using it. + // + if (Progress == 0) { + Progress = 1; + } + + Status = Callback (Progress); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, "%a(): progress callback failed with: %r\n", __func__, Status)); + *ShouldReportProgress = FALSE; + } +} + +/** + This code finds variable in storage blocks (Volatile or Non-Volatile). + + @param[in] VariableName Name of Variable to be found. + @param[in] VendorGuid Variable vendor GUID. + @param[out] Attributes Attribute value of the variable found. + @param[in, out] DataSize Size of Data found. If size is less than the + data, this value contains the required size. + @param[out] Data Data pointer. + + @return EFI_INVALID_PARAMETER Invalid parameter. + @return EFI_SUCCESS Find the specified variable. + @return EFI_NOT_FOUND Not found. + @return EFI_BUFFER_TO_SMALL DataSize is too small for the result. +**/ +STATIC +EFI_STATUS +EFIAPI +GetVariableHook ( + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid, + OUT UINT32 *Attributes OPTIONAL, + IN OUT UINTN *DataSize, + OUT VOID *Data + ) +{ + DEBUG ((DEBUG_INFO, "%a(): %g:%S\n", __func__, VendorGuid, VariableName)); + return EFI_NOT_AVAILABLE_YET; +} + +/** + This code Finds the Next available variable. + + @param[in, out] VariableNameSize Size of the variable name. + @param[in, out] VariableName Pointer to variable name. + @param[in, out] VendorGuid Variable Vendor Guid. + + @return EFI_INVALID_PARAMETER Invalid parameter. + @return EFI_SUCCESS Find the specified variable. + @return EFI_NOT_FOUND Not found. + @return EFI_BUFFER_TO_SMALL DataSize is too small for the result. +**/ +STATIC +EFI_STATUS +EFIAPI +GetNextVariableNameHook ( + IN OUT UINTN *VariableNameSize, + IN OUT CHAR16 *VariableName, + IN OUT EFI_GUID *VendorGuid + ) +{ + DEBUG ((DEBUG_INFO, "%a(): %g:%S\n", __func__, VendorGuid, VariableName)); + return EFI_NOT_AVAILABLE_YET; +} + +/** + This code sets variable in storage blocks (Volatile or Non-Volatile). + + @param[in] VariableName Name of Variable to be found. + @param[in] VendorGuid Variable vendor GUID. + @param[in] Attributes Attribute value of the variable found + @param[in] DataSize Size of Data found. If size is less than the + data, this value contains the required size. + @param[in] Data Data pointer. + + @return EFI_INVALID_PARAMETER Invalid parameter. + @return EFI_SUCCESS Set successfully. + @return EFI_OUT_OF_RESOURCES Resource not enough to set variable. + @return EFI_NOT_FOUND Not found. + @return EFI_WRITE_PROTECTED Variable is read-only. +**/ +STATIC +EFI_STATUS +EFIAPI +SetVariableHook ( + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid, + IN UINT32 Attributes, + IN UINTN DataSize, + IN VOID *Data + ) +{ + DEBUG (( + DEBUG_INFO, + "%a(): %g:%S, 0x%x bytes, 0x%x\n", + __func__, + VendorGuid, + VariableName, + DataSize, + Attributes + )); + return EFI_NOT_AVAILABLE_YET; +} + +/** + This code returns information about the EFI variables. + + @param[in] Attributes Attributes bitmask to specify the type of variables + on which to return information. + @param[out] MaximumVariableStorageSize Pointer to the maximum size of the storage space available + for the EFI variables associated with the attributes specified. + @param[out] RemainingVariableStorageSize Pointer to the remaining size of the storage space available + for EFI variables associated with the attributes specified. + @param[out] MaximumVariableSize Pointer to the maximum size of an individual EFI variables + associated with the attributes specified. + + @return EFI_SUCCESS Query successfully. +**/ +STATIC +EFI_STATUS +EFIAPI +QueryVariableInfoHook ( + IN UINT32 Attributes, + OUT UINT64 *MaximumVariableStorageSize, + OUT UINT64 *RemainingVariableStorageSize, + OUT UINT64 *MaximumVariableSize + ) +{ + DEBUG ((DEBUG_INFO, "%a(): 0x%x\n", __func__, Attributes)); + return EFI_NOT_AVAILABLE_YET; +} + +/** + Updates a firmware device with a new firmware image. This function returns + EFI_UNSUPPORTED if the firmware image is not updatable. If the firmware image + is updatable, the function should perform the following minimal validations + before proceeding to do the firmware image update. + - Validate that the image is a supported image for this firmware device. + Return EFI_ABORTED if the image is not supported. Additional details + on why the image is not a supported image may be returned in AbortReason. + - Validate the data from VendorCode if is not NULL. Firmware image + validation must be performed before VendorCode data validation. + VendorCode data is ignored or considered invalid if image validation + fails. Return EFI_ABORTED if the VendorCode data is invalid. + + VendorCode enables vendor to implement vendor-specific firmware image update + policy. Null if the caller did not specify the policy or use the default + policy. As an example, vendor can implement a policy to allow an option to + force a firmware image update when the abort reason is due to the new firmware + image version is older than the current firmware image version or bad image + checksum. Sensitive operations such as those wiping the entire firmware image + and render the device to be non-functional should be encoded in the image + itself rather than passed with the VendorCode. AbortReason enables vendor to + have the option to provide a more detailed description of the abort reason to + the caller. + + @param[in] Image Points to the new firmware image. + @param[in] ImageSize Size, in bytes, of the new firmware image. + @param[in] VendorCode This enables vendor to implement vendor-specific + firmware image update policy. NULL indicates + the caller did not specify the policy or use the + default policy. + @param[in] Progress A function used to report the progress of + updating the firmware device with the new + firmware image. + @param[in] CapsuleFwVersion The version of the new firmware image from the + update capsule that provided the new firmware + image. + @param[out] AbortReason A pointer to a pointer to a Null-terminated + Unicode string providing more details on an + aborted operation. The buffer is allocated by + this function with + EFI_BOOT_SERVICES.AllocatePool(). It is the + caller's responsibility to free this buffer with + EFI_BOOT_SERVICES.FreePool(). + @param[out] LastAttemptStatus A pointer to a UINT32 that holds the last attempt + status to report back to the ESRT table in case + of error. This value will only be checked when this + function returns an error. + + The return status code must fall in the range of + LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MIN_ERROR_CODE_VALUE to + LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MAX_ERROR_CODE_VALUE. + + If the value falls outside this range, it will be converted + to LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL. + + @retval EFI_SUCCESS The firmware device was successfully updated + with the new firmware image. + @retval EFI_ABORTED The operation is aborted. Additional details + are provided in AbortReason. + @retval EFI_INVALID_PARAMETER The Image was NULL. + @retval EFI_UNSUPPORTED The operation is not supported. +**/ +EFI_STATUS +EFIAPI +FmpDeviceSetImageWithStatus ( + IN CONST VOID *Image, + IN UINTN ImageSize, + IN CONST VOID *VendorCode OPTIONAL, + IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress OPTIONAL, + IN UINT32 CapsuleFwVersion, + OUT CHAR16 **AbortReason, + OUT UINT32 *LastAttemptStatus + ) +{ + EFI_STATUS Status; + UINTN BlockSize; + UINTN BlockCount; + UINTN Block; + UINTN NumBytes; + UINTN TotalSteps; + UINTN Step; + BOOLEAN ShouldReportProgress; + VOID *ReadBuffer; + CONST UINT8 *WriteNext; + + *LastAttemptStatus = LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL; + + // + // FmpDeviceCheckImageWithStatus() has already validated the image, so not + // repeating the checks. However, could move the checks here to be able to + // report abort reason which can't be done in FmpDeviceCheckImageWithStatus(). + // + + Status = SmmStoreLibGetBlockSize (&BlockSize); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a(): SmmStoreLibGetBlockSize() failed with: %r\n", + __func__, + Status + )); + return Status; + } + + ReadBuffer = AllocatePool (BlockSize); + if (ReadBuffer == NULL) { + DEBUG ((DEBUG_ERROR, "%a(): failed to allocate read buffer\n", __func__)); + return EFI_OUT_OF_RESOURCES; + } + + BlockCount = ImageSize / BlockSize; + DEBUG (( + DEBUG_INFO, + "%a(): 0x%x blocks of 0x%x bytes\n", + __func__, + BlockCount, + BlockSize + )); + + ShouldReportProgress = TRUE; + TotalSteps = BlockCount * 2; // Erase and write of each block. + Step = 0; + WriteNext = Image; + + for (Block = 0; Block < BlockCount; Block++, WriteNext += BlockSize) { + // + // Save the flash and time by only writing a block if new contents differs + // from the old one. + // + // This is an optimization, so ignore read errors (if they are indicative of + // a serious problem, erasing or writing will fail as well). + // + NumBytes = BlockSize; + Status = SmmStoreLibReadAnyBlock (Block, 0, &NumBytes, ReadBuffer); + if (!EFI_ERROR (Status) && (NumBytes == BlockSize)) { + if (CompareMem (ReadBuffer, WriteNext, BlockSize) == 0) { + // Erase step. + IncrementProgress (Progress, TotalSteps, &Step, &ShouldReportProgress); + // Write step. + IncrementProgress (Progress, TotalSteps, &Step, &ShouldReportProgress); + continue; + } + } + + Status = SmmStoreLibEraseAnyBlock (Block); + if (EFI_ERROR (Status)) { + goto IoError; + } + + IncrementProgress (Progress, TotalSteps, &Step, &ShouldReportProgress); + + NumBytes = BlockSize; + Status = SmmStoreLibWriteAnyBlock (Block, 0, &NumBytes, (VOID *)WriteNext); + if (EFI_ERROR (Status) || (NumBytes != BlockSize)) { + goto IoError; + } + + IncrementProgress (Progress, TotalSteps, &Step, &ShouldReportProgress); + } + + FreePool (ReadBuffer); + + *LastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS; + + // + // Updating the firmware on system flash overwrites SMMSTORE region which + // backs up EFI variables of the running firmware. At this point both SMI + // handler from coreboot and variable services of EDK can be mistaken in + // their assumptions about the location, size and contents of the region. + // Accessing flash where SMMSTORE used to be can lead to unexpected results + // including corruption of the new image outside of its SMMSTORE. Switch to + // the use of stubs for dealing with EFI variables that do nothing. + // + // New firmware will not report result of flashing in any way unless some + // kind of communication mechanism is implemented for this purpose. + // + // If there was an error, it's unclear whether these stubs would be of any + // help, so they are employed only on successful flashing. + // + + gRT->GetVariable = GetVariableHook; + gRT->GetNextVariableName = GetNextVariableNameHook; + gRT->SetVariable = SetVariableHook; + gRT->QueryVariableInfo = QueryVariableInfoHook; + + gRT->Hdr.CRC32 = 0; + gBS->CalculateCrc32 ( + (UINT8 *)&gRT->Hdr, + gRT->Hdr.HeaderSize, + &gRT->Hdr.CRC32 + ); + + return EFI_SUCCESS; + +IoError: + // + // There are several reasons why we might end up in here: + // - an actual issue with the flash chip which is unlikely to allow any + // recovery via software + // - a bug in SMMSTORE SMI handler of coreboot + // - any bug of the firmware or its configuration which has resulted in the + // system not being ready for a full flash update + // + // The last case can be caused at least by: + // - coreboot not lifting flash protections + // - Intel ME not being disabled + // + // This situation is atypical and can leave the flash chip in an + // unpredictable state which can be fully functional, unbootable or something + // in between. + // + // Being optimistic that the firmware is still functional, we're leaving + // variable services available under assumption that SMMSTORE region hasn't + // been moved withing the firmware image (most updates don't modify layout). + // Note that the store can even be recreated on the next boot depending on + // the damage that it has sustained. It's also possible that we hit + // protected range and nothing of any worth has been modified. + // + // If the firmware ends up unbootable, then, in general, external flashing + // via a programmer needs to be employed to recover the device. + // + FreePool (ReadBuffer); + DEBUG (( + DEBUG_ERROR, + "%a(): flashing has failed at block 0x%x/0x%x: %r\n", + __func__, + Block, + BlockCount, + EFI_DEVICE_ERROR + )); + return EFI_DEVICE_ERROR; +} + +/** + Lock the firmware device that contains a firmware image. Once a firmware + device is locked, any attempts to modify the firmware image contents in the + firmware device must fail. + + @note It is recommended that all firmware devices support a lock method to + prevent modifications to a stored firmware image. + + @note A firmware device lock mechanism is typically only cleared by a full + system reset (not just sleep state/low power mode). + + @retval EFI_SUCCESS The firmware device was locked. + @retval EFI_UNSUPPORTED The firmware device does not support locking +**/ +EFI_STATUS +EFIAPI +FmpDeviceLock ( + VOID + ) +{ + return EFI_UNSUPPORTED; +} + +/** + Constructor that performs required initialization. + + @param ImageHandle The image handle of the process. + @param SystemTable The EFI System Table pointer. + + @retval EFI_SUCCESS Initialization was successful. +**/ +EFI_STATUS +EFIAPI +FmpDeviceSmmLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + SmmStoreLibInitialize (); + return EFI_SUCCESS; +} diff --git a/UefiPayloadPkg/Library/FmpDeviceSmmLib/FmpDeviceSmmLib.inf b/UefiPayloadPkg/Library/FmpDeviceSmmLib/FmpDeviceSmmLib.inf new file mode 100644 index 000000000000..893e36170eaf --- /dev/null +++ b/UefiPayloadPkg/Library/FmpDeviceSmmLib/FmpDeviceSmmLib.inf @@ -0,0 +1,47 @@ +## @file +# Provides firmware device specific services to support updates of a firmware +# image stored in a firmware device. +# +# Copyright (c) 2016, Microsoft Corporation. All rights reserved.
+# Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.
+# Copyright (c) 2025, 3mdeb Sp. z o.o. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = FmpDeviceSmmLib + MODULE_UNI_FILE = FmpDeviceSmmLib.uni + FILE_GUID = 979CF0F8-7214-4D12-89CE-F32112ED71C6 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = FmpDeviceLib|DXE_DRIVER UEFI_DRIVER + CONSTRUCTOR = FmpDeviceSmmLibConstructor + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# + +[Sources] + FmpDeviceSmmLib.c + +[LibraryClasses] + BaseMemoryLib + DebugLib + HobLib + MemoryAllocationLib + SmmStoreLib + UefiBootServicesTableLib + UefiRuntimeServicesTableLib + +[Packages] + UefiPayloadPkg/UefiPayloadPkg.dec + FmpDevicePkg/FmpDevicePkg.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + +[Guids] + gEfiFirmwareInfoHobGuid diff --git a/UefiPayloadPkg/Library/FmpDeviceSmmLib/FmpDeviceSmmLib.uni b/UefiPayloadPkg/Library/FmpDeviceSmmLib/FmpDeviceSmmLib.uni new file mode 100644 index 000000000000..37efb8c9ecac --- /dev/null +++ b/UefiPayloadPkg/Library/FmpDeviceSmmLib/FmpDeviceSmmLib.uni @@ -0,0 +1,13 @@ +// /** @file +// Provides firmware device specific services to support updates of a firmware +// image stored in a firmware device. +// +// Copyright (c) 2018, Intel Corporation. All rights reserved.
+// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// **/ + +#string STR_MODULE_ABSTRACT #language en-US "Provides firmware device specific services to support updates of a firmware image stored in a firmware device." + +#string STR_MODULE_DESCRIPTION #language en-US "Provides firmware device specific services to support updates of a firmware image stored in a firmware device." diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index c9fbd0b7c15a..db4875e7c4cd 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -369,13 +369,15 @@ !if $(VARIABLE_SUPPORT) == "EMU" TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf !elseif $(VARIABLE_SUPPORT) == "SMMSTORE" - SmmStoreLib|UefiPayloadPkg/Library/SmmStoreLib/SmmStoreLib.inf TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf !elseif $(VARIABLE_SUPPORT) == "SPI" PlatformSecureLib|SecurityPkg/Library/PlatformSecureLibNull/PlatformSecureLibNull.inf TpmMeasurementLib|SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.inf S3BootScriptLib|MdePkg/Library/BaseS3BootScriptLibNull/BaseS3BootScriptLibNull.inf MmUnblockMemoryLib|MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.inf +!endif +!if $(VARIABLE_SUPPORT) == "SMMSTORE" || ($(CAPSULE_SUPPORT) && $(BOOTLOADER) == "COREBOOT") + SmmStoreLib|UefiPayloadPkg/Library/SmmStoreLib/SmmStoreLib.inf !endif VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolicyLib.inf @@ -991,8 +993,12 @@ # PCDs and include files. !include BaseTools/Source/Python/Pkcs7Sign/TestRoot.cer.gFmpDevicePkgTokenSpaceGuid.PcdFmpDevicePkcs7CertBufferXdr.inc +!if $(BOOTLOADER) == "COREBOOT" + FmpDeviceLib|UefiPayloadPkg/Library/FmpDeviceSmmLib/FmpDeviceSmmLib.inf +!else # TODO: provide platform-specific implementation of firmware flashing FmpDeviceLib|FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull.inf +!endif } MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf !endif From d188ad6a1fb60f8331bb2e6a269836eba041d032 Mon Sep 17 00:00:00 2001 From: Zachary Clark-Williams Date: Wed, 20 Aug 2025 00:46:44 -0700 Subject: [PATCH 0382/1172] NetworkPkg/WifiConnectionManagerDxe: UI Disconnect - Fix WifiMgrOnTimerTick to ensure the timer does not exit early when a disconnect is pending, allowing UI-initiated disconnects to complete as expected. Signed-off-by: Zachary Clark-Williams --- NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrImpl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrImpl.c b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrImpl.c index 3b2ac0d88759..072707faee47 100644 --- a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrImpl.c +++ b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrImpl.c @@ -1490,7 +1490,7 @@ WifiMgrOnTimerTick ( } Nic = (WIFI_MGR_DEVICE_DATA *)Context; - if (Nic->ConnectPendingNetwork == NULL) { + if ((Nic->ConnectPendingNetwork == NULL) && !Nic->HasDisconnectPendingNetwork) { DEBUG ((DEBUG_VERBOSE, "[WiFi Connection Manager] No profile for connection, no scan triggered!\n")); gBS->SetTimer (Nic->TickTimer, TimerCancel, 0); return; From dc9cdf6c90df2068728554893d4b2ec6e990d5ae Mon Sep 17 00:00:00 2001 From: Yi Li Date: Thu, 21 Aug 2025 13:11:17 +0800 Subject: [PATCH 0383/1172] CryptoPkg: Add PKCS7 test case for partial certificate chains MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This case uses a non-self-issued certificate as the signing certificate and CA. BaseCryptLib can pass this case (X509_V_FLAG_PARTIAL_CHAIN ​​enabled). BaseCryptLibMbedTls cannot, because Mbedtls certificate chain validation lacks support for partial certificate chains currently. Signed-off-by: Yi Li --- .../Library/BaseCryptLib/RsaPkcs7Tests.c | 227 +++++++++++++++++- 1 file changed, 226 insertions(+), 1 deletion(-) diff --git a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/RsaPkcs7Tests.c b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/RsaPkcs7Tests.c index aba049f0dd31..e7e80e6d469e 100644 --- a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/RsaPkcs7Tests.c +++ b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/RsaPkcs7Tests.c @@ -227,6 +227,164 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TestCert[] = { 0xd6 }; +// +// TestCase2: Non self issued CA (partial certificate chains) +// +// +// Password-protected PEM Key data for RSA Private Key Retrieving (encryption key is "non-self-issued"). +// (Generated by OpenSSL utility). +// $ openssl genrsa -aes256 -out TestKeyCert2Pem -passout pass:non-self-issued 1024 +// password should match TestKeyCert2PemPass in this file +// $ xxd --include TestKeyCert2Pem +// +GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TestKeyCert2Pem[] = { + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x52, + 0x53, 0x41, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, + 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0d, 0x0a, 0x50, 0x72, 0x6f, + 0x63, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x34, 0x2c, 0x45, 0x4e, + 0x43, 0x52, 0x59, 0x50, 0x54, 0x45, 0x44, 0x0d, 0x0a, 0x44, 0x45, 0x4b, + 0x2d, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x41, 0x45, 0x53, 0x2d, 0x32, + 0x35, 0x36, 0x2d, 0x43, 0x42, 0x43, 0x2c, 0x39, 0x43, 0x39, 0x38, 0x32, + 0x33, 0x31, 0x38, 0x42, 0x46, 0x37, 0x38, 0x33, 0x38, 0x46, 0x34, 0x32, + 0x45, 0x34, 0x33, 0x31, 0x32, 0x42, 0x42, 0x30, 0x43, 0x39, 0x31, 0x33, + 0x36, 0x43, 0x44, 0x0d, 0x0a, 0x0d, 0x0a, 0x62, 0x32, 0x77, 0x62, 0x64, + 0x75, 0x49, 0x30, 0x76, 0x6b, 0x48, 0x41, 0x6c, 0x45, 0x4a, 0x78, 0x30, + 0x6d, 0x69, 0x64, 0x57, 0x6f, 0x77, 0x6d, 0x71, 0x32, 0x62, 0x64, 0x75, + 0x65, 0x4f, 0x7a, 0x49, 0x71, 0x44, 0x59, 0x46, 0x6e, 0x4d, 0x41, 0x76, + 0x79, 0x58, 0x5a, 0x45, 0x74, 0x45, 0x4c, 0x79, 0x42, 0x41, 0x72, 0x7a, + 0x4c, 0x6c, 0x55, 0x72, 0x54, 0x73, 0x78, 0x41, 0x49, 0x62, 0x73, 0x0d, + 0x0a, 0x47, 0x4d, 0x46, 0x45, 0x47, 0x44, 0x59, 0x46, 0x69, 0x72, 0x7a, + 0x6c, 0x55, 0x77, 0x2f, 0x54, 0x6a, 0x36, 0x43, 0x2f, 0x78, 0x71, 0x45, + 0x67, 0x76, 0x79, 0x2b, 0x6c, 0x47, 0x57, 0x42, 0x46, 0x6b, 0x6c, 0x64, + 0x34, 0x7a, 0x49, 0x2b, 0x68, 0x73, 0x62, 0x77, 0x45, 0x70, 0x53, 0x6d, + 0x36, 0x4a, 0x61, 0x6a, 0x4e, 0x73, 0x69, 0x61, 0x79, 0x35, 0x6f, 0x6f, + 0x37, 0x6b, 0x41, 0x54, 0x68, 0x0d, 0x0a, 0x69, 0x6e, 0x51, 0x54, 0x33, + 0x43, 0x71, 0x76, 0x6e, 0x64, 0x41, 0x44, 0x50, 0x44, 0x5a, 0x72, 0x6f, + 0x38, 0x7a, 0x44, 0x52, 0x64, 0x4d, 0x2b, 0x58, 0x67, 0x65, 0x53, 0x42, + 0x37, 0x69, 0x65, 0x78, 0x6a, 0x55, 0x32, 0x55, 0x69, 0x42, 0x48, 0x4e, + 0x6b, 0x73, 0x76, 0x52, 0x77, 0x49, 0x4f, 0x75, 0x52, 0x50, 0x57, 0x41, + 0x75, 0x56, 0x4c, 0x41, 0x77, 0x6e, 0x6a, 0x57, 0x79, 0x66, 0x51, 0x0d, + 0x0a, 0x6e, 0x39, 0x52, 0x59, 0x4e, 0x78, 0x44, 0x37, 0x63, 0x73, 0x2f, + 0x56, 0x54, 0x38, 0x50, 0x50, 0x55, 0x75, 0x35, 0x69, 0x4d, 0x70, 0x65, + 0x4e, 0x49, 0x6a, 0x44, 0x44, 0x6a, 0x48, 0x5a, 0x2b, 0x78, 0x2f, 0x75, + 0x37, 0x77, 0x6e, 0x75, 0x46, 0x65, 0x76, 0x56, 0x73, 0x62, 0x67, 0x4e, + 0x50, 0x76, 0x4e, 0x78, 0x74, 0x6a, 0x74, 0x6a, 0x33, 0x66, 0x73, 0x6c, + 0x49, 0x75, 0x6d, 0x6c, 0x59, 0x0d, 0x0a, 0x53, 0x36, 0x35, 0x6b, 0x41, + 0x59, 0x6f, 0x36, 0x2f, 0x69, 0x51, 0x69, 0x50, 0x2b, 0x48, 0x52, 0x2b, + 0x59, 0x71, 0x57, 0x55, 0x53, 0x73, 0x4e, 0x7a, 0x55, 0x6f, 0x35, 0x52, + 0x72, 0x49, 0x51, 0x6d, 0x41, 0x52, 0x2f, 0x74, 0x66, 0x66, 0x55, 0x5a, + 0x66, 0x69, 0x4f, 0x37, 0x76, 0x53, 0x67, 0x4b, 0x49, 0x32, 0x47, 0x72, + 0x4e, 0x66, 0x69, 0x5a, 0x55, 0x6c, 0x49, 0x4f, 0x49, 0x7a, 0x39, 0x0d, + 0x0a, 0x67, 0x78, 0x56, 0x58, 0x73, 0x56, 0x69, 0x56, 0x2b, 0x47, 0x6b, + 0x70, 0x52, 0x49, 0x5a, 0x71, 0x7a, 0x46, 0x38, 0x53, 0x76, 0x4d, 0x72, + 0x35, 0x57, 0x4b, 0x63, 0x51, 0x49, 0x4b, 0x79, 0x61, 0x44, 0x52, 0x66, + 0x72, 0x57, 0x54, 0x75, 0x55, 0x4b, 0x4a, 0x67, 0x50, 0x57, 0x77, 0x30, + 0x42, 0x70, 0x45, 0x43, 0x65, 0x62, 0x6c, 0x77, 0x58, 0x79, 0x42, 0x56, + 0x70, 0x4b, 0x55, 0x72, 0x71, 0x0d, 0x0a, 0x77, 0x67, 0x56, 0x6c, 0x55, + 0x37, 0x42, 0x55, 0x55, 0x4b, 0x57, 0x6c, 0x36, 0x52, 0x66, 0x38, 0x32, + 0x42, 0x4d, 0x59, 0x63, 0x75, 0x47, 0x39, 0x2f, 0x36, 0x6a, 0x37, 0x61, + 0x4b, 0x6c, 0x6b, 0x42, 0x67, 0x42, 0x41, 0x33, 0x58, 0x75, 0x32, 0x33, + 0x68, 0x42, 0x64, 0x45, 0x33, 0x63, 0x55, 0x30, 0x47, 0x5a, 0x74, 0x50, + 0x66, 0x78, 0x33, 0x65, 0x4d, 0x64, 0x69, 0x2f, 0x6e, 0x4b, 0x4b, 0x0d, + 0x0a, 0x32, 0x66, 0x74, 0x33, 0x71, 0x79, 0x71, 0x2b, 0x32, 0x47, 0x56, + 0x73, 0x63, 0x74, 0x48, 0x65, 0x30, 0x75, 0x68, 0x37, 0x44, 0x4a, 0x6a, + 0x55, 0x30, 0x78, 0x37, 0x59, 0x48, 0x4f, 0x4f, 0x52, 0x51, 0x6b, 0x4f, + 0x79, 0x77, 0x79, 0x72, 0x6b, 0x34, 0x45, 0x61, 0x44, 0x42, 0x73, 0x72, + 0x71, 0x44, 0x6e, 0x51, 0x7a, 0x76, 0x2b, 0x4c, 0x34, 0x61, 0x70, 0x4a, + 0x71, 0x44, 0x31, 0x39, 0x72, 0x0d, 0x0a, 0x72, 0x64, 0x2b, 0x6e, 0x47, + 0x38, 0x75, 0x4d, 0x4b, 0x2f, 0x32, 0x4c, 0x38, 0x62, 0x73, 0x53, 0x71, + 0x4e, 0x7a, 0x46, 0x52, 0x2f, 0x46, 0x64, 0x51, 0x77, 0x6f, 0x39, 0x32, + 0x5a, 0x33, 0x6b, 0x4c, 0x63, 0x6a, 0x36, 0x61, 0x31, 0x36, 0x50, 0x6b, + 0x2f, 0x78, 0x38, 0x6e, 0x64, 0x70, 0x67, 0x54, 0x58, 0x35, 0x6a, 0x71, + 0x44, 0x41, 0x72, 0x4b, 0x36, 0x79, 0x38, 0x43, 0x65, 0x48, 0x70, 0x0d, + 0x0a, 0x33, 0x75, 0x48, 0x4b, 0x67, 0x77, 0x45, 0x52, 0x30, 0x52, 0x30, + 0x43, 0x34, 0x33, 0x6f, 0x37, 0x61, 0x41, 0x76, 0x6f, 0x79, 0x76, 0x5a, + 0x36, 0x44, 0x4e, 0x75, 0x5a, 0x46, 0x77, 0x65, 0x7a, 0x7a, 0x4c, 0x50, + 0x31, 0x35, 0x33, 0x78, 0x36, 0x35, 0x78, 0x75, 0x4b, 0x47, 0x57, 0x33, + 0x5a, 0x2b, 0x38, 0x68, 0x63, 0x5a, 0x53, 0x42, 0x32, 0x2b, 0x79, 0x76, + 0x33, 0x74, 0x36, 0x56, 0x69, 0x0d, 0x0a, 0x39, 0x45, 0x4b, 0x51, 0x65, + 0x58, 0x65, 0x36, 0x7a, 0x4f, 0x5a, 0x57, 0x36, 0x74, 0x42, 0x6d, 0x4a, + 0x51, 0x2f, 0x51, 0x65, 0x66, 0x51, 0x37, 0x45, 0x34, 0x70, 0x62, 0x78, + 0x65, 0x54, 0x46, 0x43, 0x4e, 0x33, 0x56, 0x4c, 0x51, 0x41, 0x75, 0x31, + 0x4d, 0x47, 0x75, 0x4b, 0x48, 0x70, 0x30, 0x5a, 0x59, 0x39, 0x42, 0x58, + 0x4f, 0x62, 0x77, 0x44, 0x48, 0x53, 0x39, 0x57, 0x51, 0x67, 0x6d, 0x0d, + 0x0a, 0x79, 0x31, 0x66, 0x37, 0x78, 0x70, 0x77, 0x30, 0x34, 0x38, 0x69, + 0x68, 0x67, 0x6c, 0x70, 0x32, 0x6e, 0x44, 0x32, 0x63, 0x72, 0x4b, 0x4b, + 0x57, 0x57, 0x38, 0x68, 0x6d, 0x41, 0x59, 0x6d, 0x6f, 0x51, 0x63, 0x42, + 0x36, 0x4f, 0x73, 0x58, 0x4f, 0x36, 0x45, 0x35, 0x77, 0x73, 0x4b, 0x65, + 0x75, 0x59, 0x41, 0x30, 0x6f, 0x79, 0x65, 0x61, 0x33, 0x6a, 0x6e, 0x55, + 0x4b, 0x71, 0x6a, 0x41, 0x58, 0x0d, 0x0a, 0x49, 0x56, 0x73, 0x43, 0x79, + 0x75, 0x68, 0x50, 0x48, 0x78, 0x65, 0x2b, 0x58, 0x38, 0x6e, 0x67, 0x38, + 0x52, 0x30, 0x72, 0x70, 0x78, 0x41, 0x30, 0x4d, 0x6f, 0x78, 0x71, 0x71, + 0x72, 0x67, 0x71, 0x78, 0x46, 0x32, 0x61, 0x4c, 0x33, 0x39, 0x38, 0x6d, + 0x51, 0x54, 0x46, 0x4f, 0x68, 0x4b, 0x46, 0x62, 0x2b, 0x73, 0x41, 0x69, + 0x6e, 0x7a, 0x34, 0x48, 0x59, 0x52, 0x59, 0x65, 0x4b, 0x72, 0x48, 0x0d, + 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x52, 0x53, + 0x41, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, 0x45, + 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0d, 0x0a +}; +// +// Password for private key retrieving from encrypted PEM ("TestKeyCert2PemPass"). +// +GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 *TestKeyCert2PemPass = "non-self-issued"; +// +// X509 Cert Data for RSA Public Key Retrieving and X509 Verification (Generated by OpenSSL utility). +// $ openssl req -new -key TestKeyCert2Pem -out TestCertCsr2 -subj "/C=US/ST=WA/L=Seattle/O=Tianocore/OU=EDK2CHILD/CN=UEFINOSELFISSUED" +// $ openssl x509 -days 10000 -CA TestCACert.pem -CAkey TestKeyPem -req -out TestCert2 -set_serial 3432 --outform DER -in TestCertCsr2 +// password should be in the PemPass variable +// $ xxd --include TestCert2 +GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TestCert2[] = { + 0x30, 0x82, 0x02, 0x3f, 0x30, 0x82, 0x01, 0xa8, 0x02, 0x02, 0x0d, 0x68, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x0b, 0x05, 0x00, 0x30, 0x5e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x08, 0x0c, 0x02, 0x57, 0x41, 0x31, 0x10, 0x30, 0x0e, 0x06, + 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x53, 0x65, 0x61, 0x74, 0x74, 0x6c, + 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x09, + 0x54, 0x69, 0x61, 0x6e, 0x6f, 0x63, 0x6f, 0x72, 0x65, 0x31, 0x0d, 0x30, + 0x0b, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x04, 0x45, 0x44, 0x4b, 0x32, + 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x04, 0x55, + 0x45, 0x46, 0x49, 0x30, 0x20, 0x17, 0x0d, 0x32, 0x35, 0x30, 0x38, 0x32, + 0x31, 0x30, 0x33, 0x34, 0x36, 0x35, 0x34, 0x5a, 0x18, 0x0f, 0x32, 0x30, + 0x35, 0x33, 0x30, 0x31, 0x30, 0x36, 0x30, 0x33, 0x34, 0x36, 0x35, 0x34, + 0x5a, 0x30, 0x6f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x55, 0x53, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x08, 0x0c, 0x02, 0x57, 0x41, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x04, 0x07, 0x0c, 0x07, 0x53, 0x65, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x31, + 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x09, 0x54, 0x69, + 0x61, 0x6e, 0x6f, 0x63, 0x6f, 0x72, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, + 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x09, 0x45, 0x44, 0x4b, 0x32, 0x43, 0x48, + 0x49, 0x4c, 0x44, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0c, 0x10, 0x55, 0x45, 0x46, 0x49, 0x4e, 0x4f, 0x53, 0x45, 0x4c, 0x46, + 0x49, 0x53, 0x53, 0x55, 0x45, 0x44, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xa3, + 0x08, 0x50, 0xc5, 0x20, 0xea, 0x2c, 0xf6, 0xfe, 0xa9, 0xa0, 0xee, 0x9b, + 0xa1, 0xd7, 0x5a, 0x24, 0x99, 0x8f, 0xe3, 0x27, 0xd9, 0xbf, 0x59, 0x73, + 0x5d, 0x88, 0x1a, 0x0d, 0x98, 0x0e, 0xaf, 0xe8, 0x98, 0x77, 0x67, 0x04, + 0xdc, 0x6d, 0x2d, 0xea, 0x3d, 0x94, 0x35, 0x56, 0x85, 0x4b, 0xad, 0xd3, + 0xb5, 0x19, 0xcb, 0x6e, 0x3f, 0xeb, 0x4c, 0x31, 0x85, 0xb5, 0xf5, 0x6c, + 0x5c, 0xd1, 0x71, 0x05, 0xef, 0x39, 0xf5, 0x0a, 0xca, 0x73, 0x0d, 0x4e, + 0xdc, 0x76, 0x29, 0xa3, 0xc7, 0x0d, 0xb7, 0x96, 0x83, 0x38, 0xaa, 0x49, + 0x93, 0xc9, 0x17, 0xe7, 0x13, 0xb6, 0xd3, 0xb5, 0xc0, 0xe4, 0x27, 0xd0, + 0x4f, 0x4a, 0x82, 0xe4, 0x79, 0x7e, 0xcc, 0xf5, 0x25, 0xb9, 0x2c, 0xe3, + 0xcd, 0xf1, 0x8b, 0xc3, 0x5a, 0x37, 0x5d, 0xe7, 0x34, 0xef, 0x9e, 0xd0, + 0xb9, 0x5a, 0x0c, 0xdc, 0x30, 0x13, 0xdf, 0x02, 0x03, 0x01, 0x00, 0x01, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x0b, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x87, 0x53, 0xea, 0x99, 0xbc, + 0x6d, 0xc4, 0xd3, 0x7f, 0xb2, 0xca, 0xe7, 0x19, 0x44, 0xc5, 0xcf, 0xdf, + 0xcb, 0x41, 0xee, 0x3b, 0xf6, 0x4f, 0x2a, 0x48, 0x5f, 0x32, 0xca, 0x11, + 0xae, 0x21, 0x46, 0x5d, 0xb4, 0xb0, 0x8a, 0x6b, 0x43, 0x4a, 0xc1, 0x49, + 0xc9, 0x83, 0x61, 0xce, 0x3f, 0x90, 0x7d, 0xc5, 0x0b, 0x5c, 0x93, 0xb7, + 0x76, 0x2b, 0xe5, 0x2f, 0xac, 0xb2, 0xc6, 0x3d, 0x82, 0xee, 0x70, 0x4a, + 0x0a, 0x62, 0x5e, 0xb2, 0x33, 0xe0, 0xed, 0xcc, 0x83, 0xbd, 0x45, 0x27, + 0x94, 0xc1, 0x98, 0x84, 0x9e, 0x22, 0x00, 0xa8, 0xfe, 0x18, 0x0a, 0xe7, + 0xaa, 0x23, 0xaf, 0x6e, 0xaa, 0xe5, 0x03, 0x55, 0x37, 0x5a, 0x98, 0x08, + 0x7b, 0xab, 0x4c, 0xba, 0x46, 0x27, 0xf1, 0xd3, 0x63, 0x16, 0x20, 0x2f, + 0xe8, 0x58, 0xd6, 0x34, 0x3f, 0x83, 0xe5, 0x33, 0x5b, 0xf5, 0x6e, 0x6a, + 0x25, 0x9f, 0x16 +}; + // // Message Hash for Signing & Verification Validation. // @@ -426,6 +584,72 @@ TestVerifyPkcs7SignVerify ( return UNIT_TEST_PASSED; } +// +// TestCase2: Non self issued CA (partial certificate chains) +// This case uses a non-self-issued certificate as the signing certificate and CA. +// BaseCryptLib can pass this case (with X509_V_FLAG_PARTIAL_CHAIN ​​enabled). +// BaseCryptLibMbedTls cannot, because Mbedtls certificate chain validation lacks support for partial certificate chains currently . +// +UNIT_TEST_STATUS +EFIAPI +TestVerifyPkcs7SignVerifyNonSelfIssued ( + IN UNIT_TEST_CONTEXT Context + ) +{ + BOOLEAN Status; + UINT8 *P7SignedData; + UINTN P7SignedDataSize; + UINT8 *SignCert; + + P7SignedData = NULL; + SignCert = NULL; + + // + // Construct Signer Certificate from RAW data. + // + Status = X509ConstructCertificate (TestCert2, sizeof (TestCert2), (UINT8 **)&SignCert); + UT_ASSERT_TRUE (Status); + UT_ASSERT_NOT_NULL (SignCert); + + // + // Create PKCS#7 signedData on Payload. + // Note: Caller should release P7SignedData manually. + // + Status = Pkcs7Sign ( + TestKeyCert2Pem, + sizeof (TestKeyCert2Pem), + (CONST UINT8 *)TestKeyCert2PemPass, + (UINT8 *)Payload, + AsciiStrLen (Payload), + SignCert, + NULL, + &P7SignedData, + &P7SignedDataSize + ); + UT_ASSERT_TRUE (Status); + UT_ASSERT_NOT_EQUAL (P7SignedDataSize, 0); + + Status = Pkcs7Verify ( + P7SignedData, + P7SignedDataSize, + TestCert2, + sizeof (TestCert2), + (UINT8 *)Payload, + AsciiStrLen (Payload) + ); + UT_ASSERT_TRUE (Status); + + if (P7SignedData != NULL) { + FreePool (P7SignedData); + } + + if (SignCert != NULL) { + X509Free (SignCert); + } + + return UNIT_TEST_PASSED; +} + TEST_DESC mRsaCertTest[] = { // // -----Description--------------------------------------Class----------------------Function-----------------Pre---Post--Context @@ -439,7 +663,8 @@ TEST_DESC mPkcs7Test[] = { // // -----Description--------------------------------------Class----------------------Function-----------------Pre---Post--Context // - { "TestVerifyPkcs7SignVerify()", "CryptoPkg.BaseCryptLib.Pkcs7", TestVerifyPkcs7SignVerify, NULL, NULL, NULL }, + { "TestVerifyPkcs7SignVerify()", "CryptoPkg.BaseCryptLib.Pkcs7", TestVerifyPkcs7SignVerify, NULL, NULL, NULL }, + { "TestVerifyPkcs7SignVerifyNonSelfIssued()", "CryptoPkg.BaseCryptLib.Pkcs7", TestVerifyPkcs7SignVerifyNonSelfIssued, NULL, NULL, NULL }, }; UINTN mPkcs7TestNum = ARRAY_SIZE (mPkcs7Test); From d2bdf8dda6604e490eebb91b809dec0738564440 Mon Sep 17 00:00:00 2001 From: Yi Li Date: Fri, 22 Aug 2025 10:48:53 +0800 Subject: [PATCH 0384/1172] CryptoPkg: Fix array index out of bounds in RsaGetPrivateKeyFromPem The real size of PemData is PemSize, access of PemSize+1 is not allowed Signed-off-by: Yi Li --- CryptoPkg/Library/BaseCryptLibMbedTls/Pem/CryptPem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CryptoPkg/Library/BaseCryptLibMbedTls/Pem/CryptPem.c b/CryptoPkg/Library/BaseCryptLibMbedTls/Pem/CryptPem.c index 56411174dd66..ddcf8f4e73ef 100644 --- a/CryptoPkg/Library/BaseCryptLibMbedTls/Pem/CryptPem.c +++ b/CryptoPkg/Library/BaseCryptLibMbedTls/Pem/CryptPem.c @@ -57,7 +57,7 @@ RsaGetPrivateKeyFromPem ( return FALSE; } - CopyMem (NewPemData, PemData, PemSize + 1); + CopyMem (NewPemData, PemData, PemSize); NewPemData[PemSize] = 0; PemData = NewPemData; PemSize += 1; From 31402d2a31ac16472432bde47f73c3c761bb8ed8 Mon Sep 17 00:00:00 2001 From: Yi Li Date: Thu, 21 Aug 2025 13:10:37 +0800 Subject: [PATCH 0385/1172] CryptoPkg: Add Unit Test Host of Mbedtls CryptoLib Currently BaseCryptLibMbedTls does not support all Crypto services, so the following case will fail: TestVerifyEKUsWith3CertsInSignature() TestVerifyEKUsWith2CertsInSignature() TestNoEKUsInSignature() TestVerifyRsaCertPkcs1SignVerify TestVerifyPkcs7SignVerifyNonSelfIssued() TestVerifyDhGenerateKey() Pkcs1v2Decrypt Pkcs1v2EncryptDecrypt RsaOaepEncrypt (Interface) RsaOaepEncrypt (NoSeed) RsaOaepEncrypt (Seeded) RsaOaepDecrypt RsaOaepEncryptDecrypt RsaOaepEncryptPkcs1v2Decrypt Pkcs1v2EncryptRsaOaepDecrypt RsaOaepEncrypt (MdDefaultMgf1Default) RsaOaepDecrypt (MdDefaultMgf1Default) RsaOaepEncryptDecrypt (MdDefaultMgf1Default) RsaOaepEncrypt (MdSha1Bgf1Sha1 RsaOaepDecrypt (MdSha1Bgf1Sha1) RsaOaepEncryptDecrypt (MdSha1Bgf1Sha1) RsaOaepEncrypt (MdSha256Bgf1Sha256) RsaOaepDecrypt (MdSha256Bgf1Sha256) RsaOaepEncryptDecrypt (MdSha256Bgf1Sha256) TestVerifyBn() TestVerifyEcKey() Signed-off-by: Yi Li --- .../UnitTestHostBaseCryptLib.inf | 86 +++++++++++++++++++ CryptoPkg/Test/CryptoPkgHostUnitTest.dsc | 20 +++++ .../Library/BaseCryptLib/RsaPkcs7Tests.c | 2 +- 3 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 CryptoPkg/Library/BaseCryptLibMbedTls/UnitTestHostBaseCryptLib.inf diff --git a/CryptoPkg/Library/BaseCryptLibMbedTls/UnitTestHostBaseCryptLib.inf b/CryptoPkg/Library/BaseCryptLibMbedTls/UnitTestHostBaseCryptLib.inf new file mode 100644 index 000000000000..ae1f0b3d6f63 --- /dev/null +++ b/CryptoPkg/Library/BaseCryptLibMbedTls/UnitTestHostBaseCryptLib.inf @@ -0,0 +1,86 @@ +## @file +# Cryptographic Library Instance for Unit Test Host. +# +# Caution: This module requires additional review when modified. +# This library will have external input - signature. +# This external input must be validated carefully to avoid security issues such as +# buffer overflow or integer overflow. +# +# Copyright (c) 2025, Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = BaseCryptLib + FILE_GUID = 5C14CE62-000E-4CC6-803C-683018EA5F97 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = BaseCryptLib|HOST_APPLICATION + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + InternalCryptLib.h + Hash/CryptMd5.c + Hash/CryptSha1.c + Hash/CryptSha256.c + Hash/CryptSha512.c + Hash/CryptParallelHashNull.c + Hash/CryptSm3.c + Hmac/CryptHmac.c + Kdf/CryptHkdf.c + Cipher/CryptAes.c + Cipher/CryptAeadAesGcm.c + Pk/CryptRsaBasic.c + Pk/CryptRsaExt.c + Pk/CryptPkcs1Oaep.c + Pk/CryptPkcs5Pbkdf2.c + Pk/CryptPkcs7Sign.c + Pk/CryptPkcs7VerifyCommon.c + Pk/CryptPkcs7VerifyBase.c + Pk/CryptPkcs7VerifyEku.c + Pk/CryptDhNull.c + Pk/CryptX509.c + Pk/CryptAuthenticode.c + Pk/CryptTs.c + Pk/CryptRsaPss.c + Pk/CryptRsaPssSign.c + Pk/CryptEcNull.c + Pem/CryptPem.c + Bn/CryptBnNull.c + Rand/CryptRand.c + + SysCall/CrtWrapper.c + SysCall/UnitTestHostCrtWrapper.c + +[Packages] + MdePkg/MdePkg.dec + CryptoPkg/CryptoPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + MemoryAllocationLib + DebugLib + MbedTlsLib + OpensslLib + PrintLib + RngLib + +# +# Remove these [BuildOptions] after this library is cleaned up +# +[BuildOptions] + # + # suppress the following warnings so we do not break the build with warnings-as-errors: + # + GCC:*_CLANGDWARF_*_CC_FLAGS = -std=c99 -Wno-error=incompatible-pointer-types + GCC:*_CLANGPDB_*_CC_FLAGS = -std=c99 -Wno-error=incompatible-pointer-types + + XCODE:*_*_*_CC_FLAGS = -std=c99 diff --git a/CryptoPkg/Test/CryptoPkgHostUnitTest.dsc b/CryptoPkg/Test/CryptoPkgHostUnitTest.dsc index e22363a110e5..d4d9bf008426 100644 --- a/CryptoPkg/Test/CryptoPkgHostUnitTest.dsc +++ b/CryptoPkg/Test/CryptoPkgHostUnitTest.dsc @@ -17,6 +17,15 @@ BUILD_TARGETS = NOOPT SKUID_IDENTIFIER = DEFAULT +!ifndef CRYPTO_TEST_TYPE + DEFINE CRYPTO_TEST_TYPE = OPENSSL +!endif + +!if $(CRYPTO_TEST_TYPE) IN "OPENSSL MBEDTLS" +!else + !error CRYPTO_TEST_TYPE must be set to one of OPENSSL MBEDTLS. +!endif + !include UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc !include CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc @@ -34,6 +43,7 @@ # # Build HOST_APPLICATION that tests the SampleUnitTest # +!if $(CRYPTO_TEST_TYPE) IN "OPENSSL" CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLibHost.inf { OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLibFull.inf @@ -44,6 +54,16 @@ OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf } +!endif + +!if $(CRYPTO_TEST_TYPE) IN "MBEDTLS" + CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLibHost.inf { + + BaseCryptLib|CryptoPkg/Library/BaseCryptLibMbedTls/UnitTestHostBaseCryptLib.inf + OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLibSm3.inf + MbedTlsLib|CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf + } +!endif [BuildOptions] *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES diff --git a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/RsaPkcs7Tests.c b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/RsaPkcs7Tests.c index e7e80e6d469e..dcb93236d46b 100644 --- a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/RsaPkcs7Tests.c +++ b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/RsaPkcs7Tests.c @@ -587,7 +587,7 @@ TestVerifyPkcs7SignVerify ( // // TestCase2: Non self issued CA (partial certificate chains) // This case uses a non-self-issued certificate as the signing certificate and CA. -// BaseCryptLib can pass this case (with X509_V_FLAG_PARTIAL_CHAIN ​​enabled). +// BaseCryptLib can pass this case (with X509_V_FLAG_PARTIAL_CHAIN enabled). // BaseCryptLibMbedTls cannot, because Mbedtls certificate chain validation lacks support for partial certificate chains currently . // UNIT_TEST_STATUS From fc0fffa7e9089e7b79b9ae7babb950f1f153e0ae Mon Sep 17 00:00:00 2001 From: Akshay Behl Date: Thu, 24 Jul 2025 12:05:07 +0530 Subject: [PATCH 0386/1172] pip-requirements: Add pylibfdt and pefile 1. Tool supportUPL requires libfdt support 2. pefile will be needed when building FIT UPL (for adding relocation data to FIT header). Signed-off-by: Akshay Behl --- pip-requirements.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pip-requirements.txt b/pip-requirements.txt index d2365e759025..25c028235613 100644 --- a/pip-requirements.txt +++ b/pip-requirements.txt @@ -17,3 +17,5 @@ edk2-pytool-extensions~=0.29.11 antlr4-python3-runtime==4.9 lcov-cobertura==2.1.1 regex==2024.11.6 +pylibfdt==1.7.2 +pefile From a56c2eb07e5bab558d0d52d7f9c297c5b566c325 Mon Sep 17 00:00:00 2001 From: Thamballi Sreelalitha Date: Wed, 6 Aug 2025 14:19:09 +0530 Subject: [PATCH 0387/1172] MdePkg/BaseFdtLib: Remove unused macros and string APIs Removed legacy macros and string helper APIs that are no longer used in the BaseFdtLib implementation. Specifically: - Dropped strcmp macro that incorrectly expected 3 arguments but ignored the third parameter. - Cleaned up other unused macros and redundant string APIs. These changes align with the current upstream libfdt module and reduce dead code. Signed-off-by: Thamballi Sreelalitha --- MdePkg/Library/BaseFdtLib/LibFdtSupport.h | 31 ++++++++--------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/MdePkg/Library/BaseFdtLib/LibFdtSupport.h b/MdePkg/Library/BaseFdtLib/LibFdtSupport.h index 05f758a93dc9..be7043bd2768 100644 --- a/MdePkg/Library/BaseFdtLib/LibFdtSupport.h +++ b/MdePkg/Library/BaseFdtLib/LibFdtSupport.h @@ -3,6 +3,7 @@ libfdt library. Copyright (c) 2023, Intel Corporation. All rights reserved.
+ Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -54,12 +55,6 @@ memcmp ( size_t ); -int -strcmp ( - const char *, - const char * - ); - char * strchr ( const char *, @@ -88,19 +83,15 @@ strcpy ( // // Macros that directly map functions to BaseLib, BaseMemoryLib, and DebugLib functions // -#define memcpy(dest, source, count) CopyMem(dest,source, (UINTN)(count)) -#define memset(dest, ch, count) SetMem(dest, (UINTN)(count),(UINT8)(ch)) -#define memchr(buf, ch, count) ScanMem8(buf, (UINTN)(count),(UINT8)ch) -#define memcmp(buf1, buf2, count) (int)(CompareMem(buf1, buf2, (UINTN)(count))) -#define memmove(dest, source, count) CopyMem(dest, source, (UINTN)(count)) -#define strlen(str) (size_t)(AsciiStrLen(str)) -#define strnlen(str, count) (size_t)(AsciiStrnLenS(str, count)) -#define strncpy(strDest, strSource, count) AsciiStrnCpyS(strDest, MAX_STRING_SIZE, strSource, (UINTN)count) -#define strcat(strDest, strSource) AsciiStrCatS(strDest, MAX_STRING_SIZE, strSource) -#define strchr(str, ch) ScanMem8(str, AsciiStrSize (str), (UINT8)ch) -#define strcmp(string1, string2, count) (int)(AsciiStrCmp(string1, string2)) -#define strncmp(string1, string2, count) (int)(AsciiStrnCmp(string1, string2, (UINTN)(count))) -#define strrchr(str, ch) fdt_strrchr(str, ch) -#define strtoul(ptr, end_ptr, base) fdt_strtoul(ptr, end_ptr, base) +#define memcpy(dest, source, count) CopyMem(dest,source, (UINTN)(count)) +#define memset(dest, ch, count) SetMem(dest, (UINTN)(count),(UINT8)(ch)) +#define memchr(buf, ch, count) ScanMem8(buf, (UINTN)(count),(UINT8)ch) +#define memcmp(buf1, buf2, count) (int)(CompareMem(buf1, buf2, (UINTN)(count))) +#define memmove(dest, source, count) CopyMem(dest, source, (UINTN)(count)) +#define strlen(str) (size_t)(AsciiStrLen(str)) +#define strnlen(str, count) (size_t)(AsciiStrnLenS(str, count)) +#define strchr(str, ch) ScanMem8(str, AsciiStrSize (str), (UINT8)ch) +#define strrchr(str, ch) fdt_strrchr(str, ch) +#define strtoul(ptr, end_ptr, base) fdt_strtoul(ptr, end_ptr, base) #endif /* FDT_LIB_SUPPORT_H_ */ From 8404e44c635c74e527c5299679b1ceaf288bdb2d Mon Sep 17 00:00:00 2001 From: Dhaval Date: Mon, 7 Jul 2025 21:30:33 +0530 Subject: [PATCH 0388/1172] UefiPayloadPkg: update stack address print to 64 bit Signed-off-by: Akshay Behl Co-authored-by: Dhaval Sharma --- UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c | 2 +- UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c | 2 +- UefiPayloadPkg/UefiPayloadEntry/RiscV64/DxeLoadFunc.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c index 3391da8446cc..9840368f2f73 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c +++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c @@ -358,7 +358,7 @@ HandOffToDxeCore ( DEBUG (( DEBUG_INFO, - "%a() Stack Base: 0x%lx, Stack Size: 0x%x\n", + "%a() Stack Base: 0x%llx, Stack Size: 0x%x\n", __func__, BaseOfStack, STACK_SIZE diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c index d0f314300460..867765f6ef96 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c +++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c @@ -356,7 +356,7 @@ HandOffToDxeCore ( DEBUG (( DEBUG_INFO, - "%a() Stack Base: 0x%lx, Stack Size: 0x%x\n", + "%a() Stack Base: 0x%llx, Stack Size: 0x%x\n", __func__, BaseOfStack, STACK_SIZE diff --git a/UefiPayloadPkg/UefiPayloadEntry/RiscV64/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/RiscV64/DxeLoadFunc.c index ecd249337151..ff4841bf85ac 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/RiscV64/DxeLoadFunc.c +++ b/UefiPayloadPkg/UefiPayloadEntry/RiscV64/DxeLoadFunc.c @@ -60,7 +60,7 @@ HandOffToDxeCore ( // UpdateStackHob ((EFI_PHYSICAL_ADDRESS)(UINTN)BaseOfStack, STACK_SIZE); - DEBUG ((DEBUG_INFO, "DXE Core new stack at %x, stack pointer at %x\n", BaseOfStack, TopOfStack)); + DEBUG ((DEBUG_INFO, "DXE Core new stack at %llx, stack pointer at %llx\n", BaseOfStack, TopOfStack)); // // Transfer the control to the entry point of DxeCore. From 60803295c3f000ad02adb51ec7495d68cd04d547 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Aug 2025 04:17:39 +0000 Subject: [PATCH 0389/1172] pip: bump pylibfdt from 1.7.2 to 1.7.2.post1 Bumps pylibfdt from 1.7.2 to 1.7.2.post1. --- updated-dependencies: - dependency-name: pylibfdt dependency-version: 1.7.2.post1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pip-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pip-requirements.txt b/pip-requirements.txt index 25c028235613..ec5502ecc231 100644 --- a/pip-requirements.txt +++ b/pip-requirements.txt @@ -17,5 +17,5 @@ edk2-pytool-extensions~=0.29.11 antlr4-python3-runtime==4.9 lcov-cobertura==2.1.1 regex==2024.11.6 -pylibfdt==1.7.2 +pylibfdt==1.7.2.post1 pefile From 6755c9d82c5683a6641fd345abd5d7463853b2a5 Mon Sep 17 00:00:00 2001 From: Akshay Behl Date: Mon, 28 Jul 2025 12:59:27 +0530 Subject: [PATCH 0390/1172] UefiPayloadPkg: RISCV: Licensing Fix Fixing a licensing typo in UefiPayloadEntry/RiscV64/DxeLoadFuncFit.c Signed-off-by: Akshay Behl --- UefiPayloadPkg/UefiPayloadEntry/RiscV64/DxeLoadFuncFit.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/UefiPayloadPkg/UefiPayloadEntry/RiscV64/DxeLoadFuncFit.c b/UefiPayloadPkg/UefiPayloadEntry/RiscV64/DxeLoadFuncFit.c index e74c4fae4ccf..e92c4c34f9e7 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/RiscV64/DxeLoadFuncFit.c +++ b/UefiPayloadPkg/UefiPayloadEntry/RiscV64/DxeLoadFuncFit.c @@ -1,8 +1,8 @@ /** @file - x64-specifc functionality for DxeLoad. + RISC-V specific functionality for DxeLoad. -Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.
-SPDX-License-Identifier: BSD-2-Clause-Patent + Copyright (C) 2023, Rivos Inc. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent **/ From 20609b499e67ada9c883d7d9bfbf6ac09df2040c Mon Sep 17 00:00:00 2001 From: Abner Chang Date: Thu, 5 Jun 2025 02:34:00 -0500 Subject: [PATCH 0391/1172] RedfishPkg/RedfishPlatformConfig: Expose suppressed HII options to Redfish When REDFISH_PLATFORM_CONFIG_ALLOW_SUPPRESSED is set in PcdRedfishPlatformConfigFeatureProperty, HII suppressed options should be exposed to Redfish BIOS resource. Signed-off-by: Abner Chang --- .../RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c index f759df900bd6..5ec80aa63736 100644 --- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c +++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c @@ -1666,7 +1666,7 @@ RedfishPlatformConfigProtocolGetValue ( goto RELEASE_RESOURCE; } - if (TargetStatement->Suppressed) { + if (TargetStatement->Suppressed && !RedfishPlatformConfigFeatureProp (REDFISH_PLATFORM_CONFIG_ALLOW_SUPPRESSED)) { Status = EFI_ACCESS_DENIED; goto RELEASE_RESOURCE; } @@ -2289,7 +2289,7 @@ RedfishPlatformConfigProtocolGetDefaultValue ( goto RELEASE_RESOURCE; } - if (TargetStatement->Suppressed) { + if (TargetStatement->Suppressed && !RedfishPlatformConfigFeatureProp (REDFISH_PLATFORM_CONFIG_ALLOW_SUPPRESSED)) { Status = EFI_ACCESS_DENIED; goto RELEASE_RESOURCE; } From 4b041f09d62ff569b2d3e1829387992de7cf237a Mon Sep 17 00:00:00 2001 From: Abner Chang Date: Mon, 18 Aug 2025 11:49:14 -0500 Subject: [PATCH 0392/1172] RedfishPkg/PlatformConfig: Use en-US if no x-uefi-redfish string Search en-US HII value string if x-uefi-redfish language of the value string is not found. Because not all of the HII value strings have the x-uefi-redfish language string define, such as "Enabled" or "Disabled". Signed-off-by: Abner Chang --- .../RedfishPlatformConfigDxe.c | 38 +++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c index 5ec80aa63736..c6a98048340e 100644 --- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c +++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c @@ -542,8 +542,19 @@ OneOfStatementToAttributeValues ( } if (Option->Text != 0) { - Values->ValueArray[Index].ValueName = HiiGetRedfishAsciiString (HiiHandle, SchemaName, Option->Text); Values->ValueArray[Index].ValueDisplayName = HiiGetEnglishAsciiString (HiiHandle, Option->Text); + Values->ValueArray[Index].ValueName = HiiGetRedfishAsciiString (HiiHandle, SchemaName, Option->Text); + if (Values->ValueArray[Index].ValueName == NULL) { + DEBUG ((DEBUG_MANAGEABILITY, "%a: Redfish x-UEFI string is not found.\n", __func__)); + // + // No x-UEFI-redfish string defined. Try to get string in English. + // + Values->ValueArray[Index].ValueName = + AllocateCopyPool (AsciiStrSize (Values->ValueArray[Index].ValueDisplayName), (VOID *)Values->ValueArray[Index].ValueDisplayName); + if (Values->ValueArray[Index].ValueName == NULL) { + DEBUG ((DEBUG_MANAGEABILITY, "%a: Both Redfish and English string are not found.\n", __func__)); + } + } } Index += 1; @@ -1309,8 +1320,16 @@ HiiValueToRedfishValue ( RedfishValue->Value.Buffer = HiiGetRedfishAsciiString (HiiHandle, FullSchema, StringId); if (RedfishValue->Value.Buffer == NULL) { - Status = EFI_OUT_OF_RESOURCES; - break; + DEBUG ((DEBUG_MANAGEABILITY, "%a: Redfish x-UEFI string is not found.\n", __func__)); + // + // No x-UEFI-redfish string defined. Try to get string in English. + // + RedfishValue->Value.Buffer = HiiGetEnglishAsciiString (HiiHandle, StringId); + if (RedfishValue->Value.Buffer == NULL) { + DEBUG ((DEBUG_MANAGEABILITY, "%a: Both Redfish and English string are not found.\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + break; + } } RedfishValue->Type = RedfishValueTypeString; @@ -1399,6 +1418,18 @@ HiiValueToRedfishValue ( } RedfishValue->Value.StringArray[Index] = HiiGetRedfishAsciiString (HiiHandle, FullSchema, StringIdArray[Index]); + if (RedfishValue->Value.StringArray[Index] == NULL) { + DEBUG ((DEBUG_MANAGEABILITY, "%a: Redfish x-UEFI string is not found.\n", __func__)); + // + // No x-UEFI-redfish string defined. Try to get string in English. + // + RedfishValue->Value.StringArray[Index] = HiiGetEnglishAsciiString (HiiHandle, StringIdArray[Index]); + if (RedfishValue->Value.StringArray[Index] == NULL) { + DEBUG ((DEBUG_MANAGEABILITY, "%a: Both Redfish and English string are not found.\n", __func__)); + Status = EFI_OUT_OF_RESOURCES; + } + } + ASSERT (RedfishValue->Value.StringArray[Index] != NULL); } @@ -1418,6 +1449,7 @@ HiiValueToRedfishValue ( RedfishValue->Value.Buffer = HiiGetRedfishAsciiString (HiiHandle, FullSchema, HiiStatement->ExtraData.TextTwo); if (RedfishValue->Value.Buffer == NULL) { + DEBUG ((DEBUG_MANAGEABILITY, "%a: Redfish x-UEFI string is not found.\n", __func__)); // // No x-UEFI-redfish string defined. Try to get string in English. // From 839e79f62b368475d2af5c2fd9d18c77a57fb8a7 Mon Sep 17 00:00:00 2001 From: Luigi Leonardi Date: Mon, 14 Jul 2025 17:19:36 +0200 Subject: [PATCH 0393/1172] OvmfPkg/MemDebugLogLib: unoptimize PEIM and PEI_CORE In AARCH64, the PEI phase runs from the flash memory, therefore global variables are not allowed. Remove this optimization so that this library can be used for this architecture. Signed-off-by: Luigi Leonardi --- .../Library/MemDebugLogLib/MemDebugLogPei.c | 29 ++++++++---------- .../MemDebugLogLib/MemDebugLogPeiCore.c | 30 ++++++++----------- 2 files changed, 24 insertions(+), 35 deletions(-) diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPei.c b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPei.c index cbdab6c22f86..05e32daf1ca0 100644 --- a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPei.c +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPei.c @@ -12,9 +12,6 @@ #include #include -EFI_PHYSICAL_ADDRESS mMemDebugLogBufAddr; -BOOLEAN mMemDebugLogBufAddrInit; - EFI_STATUS EFIAPI MemDebugLogWrite ( @@ -22,23 +19,21 @@ MemDebugLogWrite ( IN UINTN Length ) { - EFI_STATUS Status; + EFI_PHYSICAL_ADDRESS MemDebugLogBufAddr; + EFI_STATUS Status; - if (!mMemDebugLogBufAddrInit) { - // - // Obtain the Memory Debug Log buffer addr from HOB - // NOTE: This is expected to fail until the HOB is created. - // - Status = MemDebugLogAddrFromHOB (&mMemDebugLogBufAddr); - if (EFI_ERROR (Status)) { - mMemDebugLogBufAddr = 0; - } else { - mMemDebugLogBufAddrInit = TRUE; - } + // + // Obtain the Memory Debug Log buffer addr from HOB + // NOTE: This is expected to fail until the HOB is created. + // + Status = MemDebugLogAddrFromHOB (&MemDebugLogBufAddr); + + if (EFI_ERROR (Status)) { + MemDebugLogBufAddr = 0; } - if (mMemDebugLogBufAddr) { - Status = MemDebugLogWriteBuffer (mMemDebugLogBufAddr, Buffer, Length); + if (MemDebugLogBufAddr != 0) { + Status = MemDebugLogWriteBuffer (MemDebugLogBufAddr, Buffer, Length); } else { // // HOB has not yet been created, so diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCore.c b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCore.c index 1e95d65aaadf..c8de40d5c165 100644 --- a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCore.c +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCore.c @@ -11,9 +11,6 @@ #include #include -EFI_PHYSICAL_ADDRESS mMemDebugLogBufAddr; -BOOLEAN mMemDebugLogBufAddrInit; - EFI_STATUS EFIAPI MemDebugLogWrite ( @@ -21,23 +18,20 @@ MemDebugLogWrite ( IN UINTN Length ) { - EFI_STATUS Status; - - if (!mMemDebugLogBufAddrInit) { - // - // Obtain the Memory Debug Log buffer addr from HOB - // NOTE: This is expected to fail until the HOB is created. - // - Status = MemDebugLogAddrFromHOB (&mMemDebugLogBufAddr); - if (EFI_ERROR (Status)) { - mMemDebugLogBufAddr = 0; - } else { - mMemDebugLogBufAddrInit = TRUE; - } + EFI_PHYSICAL_ADDRESS MemDebugLogBufAddr; + EFI_STATUS Status; + + // + // Obtain the Memory Debug Log buffer addr from HOB + // NOTE: This is expected to fail until the HOB is created. + // + Status = MemDebugLogAddrFromHOB (&MemDebugLogBufAddr); + if (EFI_ERROR (Status)) { + MemDebugLogBufAddr = 0; } - if (mMemDebugLogBufAddr) { - Status = MemDebugLogWriteBuffer (mMemDebugLogBufAddr, Buffer, Length); + if (MemDebugLogBufAddr != 0) { + Status = MemDebugLogWriteBuffer (MemDebugLogBufAddr, Buffer, Length); } else { // // HOB has not yet been created, so From 41c48d2a7cfde90a84954f5810ad5392aa244ce8 Mon Sep 17 00:00:00 2001 From: Luigi Leonardi Date: Mon, 14 Jul 2025 12:15:34 +0200 Subject: [PATCH 0394/1172] OvmfPkg/MemDebugLogLib: move QemuFwCfgSimpleParserLib to LibraryClasses There is no good reason to keep QemuFwCfgSimpleParserLib arch-specific. Move it to the LibraryClasses section. Signed-off-by: Luigi Leonardi --- OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf | 5 ----- 1 file changed, 5 deletions(-) diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf index 18f06e45b3ba..b6b407c89191 100644 --- a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf @@ -29,11 +29,6 @@ [LibraryClasses] SynchronizationLib PcdLib - -[LibraryClasses.Ia32] - QemuFwCfgSimpleParserLib - -[LibraryClasses.X64] QemuFwCfgSimpleParserLib [Guids] From d14e964692bafcae129ba91e7537a41f16e18a12 Mon Sep 17 00:00:00 2001 From: Luigi Leonardi Date: Mon, 14 Jul 2025 13:13:25 +0200 Subject: [PATCH 0395/1172] ArmVirtPkg/ArmVirtQemu: Introduce support for MemDebugLib. Modify DebugLib so that it can write to the memory debug log, provided by MemDebugLogLib, when enabled. Enable MemDebugLog upport on the ArmVirtQemu platform. Note that memory logging is not available before the memory allocator has been initialized (SEC and the early PEI phase). In X64, early logging (SEC, PEI) is achieved using a pre-allocated static buffer; this cannot be easily reproduced on AARCH64. Such support can be introduced in the future. Signed-off-by: Luigi Leonardi --- ArmVirtPkg/ArmVirt.dsc.inc | 1 + ArmVirtPkg/ArmVirtQemu.dsc | 32 +++++++++++++++++++ ArmVirtPkg/ArmVirtQemu.fdf | 4 +++ .../Library/DebugLibFdtPL011Uart/DebugLib.c | 15 +++++++++ .../DebugLibFdtPL011UartFlash.inf | 1 + .../DebugLibFdtPL011UartRam.inf | 2 ++ .../DxeRuntimeDebugLibFdtPL011Uart.inf | 2 ++ 7 files changed, 57 insertions(+) diff --git a/ArmVirtPkg/ArmVirt.dsc.inc b/ArmVirtPkg/ArmVirt.dsc.inc index d791351f6b48..2dc36d69d633 100644 --- a/ArmVirtPkg/ArmVirt.dsc.inc +++ b/ArmVirtPkg/ArmVirt.dsc.inc @@ -72,6 +72,7 @@ UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf !include OvmfPkg/Include/Dsc/ShellLibs.dsc.inc ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc index 1e239bbbf783..c8e8ab2b0545 100644 --- a/ArmVirtPkg/ArmVirtQemu.dsc +++ b/ArmVirtPkg/ArmVirtQemu.dsc @@ -103,6 +103,11 @@ !endif ArmMonitorLib|ArmVirtPkg/Library/ArmVirtMonitorLib/ArmVirtMonitorLib.inf +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogDxeLib.inf +!else + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf +!endif [LibraryClasses.AARCH64] ArmPlatformLib|ArmVirtPkg/Library/ArmPlatformLibQemu/ArmPlatformLibQemu.inf @@ -115,6 +120,12 @@ ArmMonitorLib|ArmVirtPkg/Library/ArmVirtMonitorPeiLib/ArmVirtMonitorPeiLib.inf FdtLib|MdePkg/Library/BaseFdtLib/BaseFdtLib.inf Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf + QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioPeiLib.inf +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf +!else + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf +!endif [LibraryClasses.AARCH64.PEIM] ArmMmuLib|UefiCpuPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf @@ -335,6 +346,23 @@ PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf !endif +[LibraryClasses.common.SEC] + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf + +[LibraryClasses.common.PEI_CORE] +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCoreLib.inf +!else + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf +!endif + +[LibraryClasses.common.DXE_RUNTIME_DRIVER] +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogRtLib.inf +!else + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf +!endif + ################################################################################ # # Components Section - list of all EDK II Modules needed by this Platform @@ -350,6 +378,10 @@ ArmVirtPkg/MemoryInitPei/MemoryInitPeim.inf ArmPkg/Drivers/CpuPei/CpuPei.inf +!if $(DEBUG_TO_MEM) + OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf +!endif + !if $(TPM2_ENABLE) == TRUE MdeModulePkg/Universal/PCD/Pei/Pcd.inf { diff --git a/ArmVirtPkg/ArmVirtQemu.fdf b/ArmVirtPkg/ArmVirtQemu.fdf index ac2040acff33..1e45d5172991 100644 --- a/ArmVirtPkg/ArmVirtQemu.fdf +++ b/ArmVirtPkg/ArmVirtQemu.fdf @@ -111,6 +111,10 @@ READ_LOCK_STATUS = TRUE INF ArmPkg/Drivers/CpuPei/CpuPei.inf INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf +!if $(DEBUG_TO_MEM) + INF OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf +!endif + !if $(TPM2_ENABLE) == TRUE INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf INF MdeModulePkg/Universal/ResetSystemPei/ResetSystemPei.inf diff --git a/ArmVirtPkg/Library/DebugLibFdtPL011Uart/DebugLib.c b/ArmVirtPkg/Library/DebugLibFdtPL011Uart/DebugLib.c index 83d52e98f5c2..18222aaebc79 100644 --- a/ArmVirtPkg/Library/DebugLibFdtPL011Uart/DebugLib.c +++ b/ArmVirtPkg/Library/DebugLibFdtPL011Uart/DebugLib.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "Write.h" @@ -116,6 +117,13 @@ DebugPrintMarker ( AsciiBSPrint (Buffer, sizeof (Buffer), Format, BaseListMarker); } + // + // Send string to Memory Debug Log if enabled + // + if (MemDebugLogEnabled ()) { + MemDebugLogWrite ((CHAR8 *)Buffer, AsciiStrLen (Buffer)); + } + // // Send the print string to a Serial Port // @@ -212,6 +220,13 @@ DebugAssert ( // AsciiSPrint (Buffer, sizeof (Buffer), "ASSERT [%a] %a(%d): %a\n", gEfiCallerBaseName, FileName, LineNumber, Description); + // + // Send string to Memory Debug Log if enabled + // + if (MemDebugLogEnabled ()) { + MemDebugLogWrite ((CHAR8 *)Buffer, AsciiStrLen (Buffer)); + } + // // Send the print string to the Console Output device // diff --git a/ArmVirtPkg/Library/DebugLibFdtPL011Uart/DebugLibFdtPL011UartFlash.inf b/ArmVirtPkg/Library/DebugLibFdtPL011Uart/DebugLibFdtPL011UartFlash.inf index f35a0913f075..6b3b3316a25e 100644 --- a/ArmVirtPkg/Library/DebugLibFdtPL011Uart/DebugLibFdtPL011UartFlash.inf +++ b/ArmVirtPkg/Library/DebugLibFdtPL011Uart/DebugLibFdtPL011UartFlash.inf @@ -40,6 +40,7 @@ PL011UartLib PcdLib PrintLib + MemDebugLogLib [Pcd] gUefiOvmfPkgTokenSpaceGuid.PcdDeviceTreeInitialBaseAddress # Flash.c diff --git a/ArmVirtPkg/Library/DebugLibFdtPL011Uart/DebugLibFdtPL011UartRam.inf b/ArmVirtPkg/Library/DebugLibFdtPL011Uart/DebugLibFdtPL011UartRam.inf index a5f4c2d80a3c..568fc3e6b269 100644 --- a/ArmVirtPkg/Library/DebugLibFdtPL011Uart/DebugLibFdtPL011UartRam.inf +++ b/ArmVirtPkg/Library/DebugLibFdtPL011Uart/DebugLibFdtPL011UartRam.inf @@ -34,6 +34,7 @@ ArmPlatformPkg/ArmPlatformPkg.dec ArmVirtPkg/ArmVirtPkg.dec MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec [LibraryClasses] BaseLib @@ -43,6 +44,7 @@ PL011UartLib PcdLib PrintLib + MemDebugLogLib [Pcd] gEfiMdePkgTokenSpaceGuid.PcdDebugClearMemoryValue diff --git a/ArmVirtPkg/Library/DebugLibFdtPL011Uart/DxeRuntimeDebugLibFdtPL011Uart.inf b/ArmVirtPkg/Library/DebugLibFdtPL011Uart/DxeRuntimeDebugLibFdtPL011Uart.inf index 84e9dbae221b..1ae3f9993ab3 100644 --- a/ArmVirtPkg/Library/DebugLibFdtPL011Uart/DxeRuntimeDebugLibFdtPL011Uart.inf +++ b/ArmVirtPkg/Library/DebugLibFdtPL011Uart/DxeRuntimeDebugLibFdtPL011Uart.inf @@ -35,6 +35,7 @@ ArmPlatformPkg/ArmPlatformPkg.dec ArmVirtPkg/ArmVirtPkg.dec MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec [LibraryClasses] BaseLib @@ -44,6 +45,7 @@ PL011UartLib PcdLib PrintLib + MemDebugLogLib [Pcd] gEfiMdePkgTokenSpaceGuid.PcdDebugClearMemoryValue From 8bdc0c2a9abcbdedd11f364de0bfc0dca9438c87 Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Mon, 18 Aug 2025 11:33:07 -0700 Subject: [PATCH 0396/1172] UefiCpuPkg/BaseRiscV64CpuTimerLib: Ensure mTimeBase is initialized In early boot phases (SEC/PEI), CpuTimerLib may be used before GetPerformanceCounterProperties() is called, leaving mTimeBase uninitialized. This can result in divide-by-zero errors or incorrect timeouts. To fix this, check if mTimeBase is set before using it and initialize it via GetPerformanceCounterProperties() if necessary. Signed-off-by: Sunil V L Signed-off-by: Tuan Phan --- .../BaseRiscV64CpuTimerLib/CpuTimerLib.c | 55 ++++++++++++++----- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/CpuTimerLib.c b/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/CpuTimerLib.c index 080e229c401b..bb07200754be 100644 --- a/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/CpuTimerLib.c +++ b/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/CpuTimerLib.c @@ -8,6 +8,7 @@ **/ #include +#include #include #include #include @@ -16,9 +17,12 @@ #include #include #include +#include STATIC UINT64 mTimeBase; +#define GET_TIME_BASE() (mTimeBase ?: GetPerformanceCounterProperties(NULL, NULL)) + /** Stalls the CPU for at least the given number of ticks. @@ -63,7 +67,7 @@ MicroSecondDelay ( DivU64x32 ( MultU64x32 ( MicroSeconds, - mTimeBase + GET_TIME_BASE () ), 1000000u ) @@ -91,7 +95,7 @@ NanoSecondDelay ( DivU64x32 ( MultU64x32 ( NanoSeconds, - mTimeBase + GET_TIME_BASE () ), 1000000000u ) @@ -150,6 +154,12 @@ GetPerformanceCounterProperties ( OUT UINT64 *EndValue OPTIONAL ) { + VOID *Hob; + RISCV_SEC_HANDOFF_DATA *SecData; + CONST EFI_GUID SecHobDataGuid = RISCV_SEC_HANDOFF_HOB_GUID; + UINT64 TimeBase; + CONST VOID *FdtBase; + if (StartValue != NULL) { *StartValue = 0; } @@ -165,20 +175,27 @@ GetPerformanceCounterProperties ( // // Locate the FDT HOB and validate header // - CONST EFI_HOB_GUID_TYPE *Hob = GetFirstGuidHob (&gFdtHobGuid); - - ASSERT (Hob != NULL); - - CONST VOID *DeviceTreeBase = - (CONST VOID *)(UINTN)*(CONST UINT64 *)GET_GUID_HOB_DATA (Hob); + Hob = GetFirstGuidHob (&gFdtHobGuid); + if (Hob) { + FdtBase = (CONST VOID *)(UINTN)*(CONST UINT64 *)GET_GUID_HOB_DATA (Hob); + } else { + // + // Get the FDT address from the SEC HOB + // + Hob = GetFirstGuidHob (&SecHobDataGuid); + ASSERT (Hob != NULL); + SecData = (RISCV_SEC_HANDOFF_DATA *)GET_GUID_HOB_DATA (Hob); + FdtBase = (CONST VOID *)SecData->FdtPointer; + } - ASSERT (FdtCheckHeader (DeviceTreeBase) == 0); + ASSERT (FdtBase != NULL); + ASSERT (FdtCheckHeader ((VOID *)(UINTN)FdtBase) == 0); // // /cpus node // INT32 Node = FdtSubnodeOffsetNameLen ( - DeviceTreeBase, + FdtBase, 0, "cpus", sizeof ("cpus") - 1 @@ -191,15 +208,23 @@ GetPerformanceCounterProperties ( // INT32 Len; CONST FDT_PROPERTY *Prop = - FdtGetProperty (DeviceTreeBase, Node, "timebase-frequency", &Len); + FdtGetProperty (FdtBase, Node, "timebase-frequency", &Len); ASSERT (Prop != NULL && Len == sizeof (UINT32)); // // Device-tree cells are big-endian // - mTimeBase = SwapBytes32 (*(CONST UINT32 *)Prop->Data); - return mTimeBase; + TimeBase = SwapBytes32 (*(CONST UINT32 *)Prop->Data); + ASSERT (TimeBase != 0); + + // + // Save the time base for later use. Note that the mTimeBase maybe zero if + // this library is stored in read-only memory. + // + mTimeBase = TimeBase; + + return TimeBase; } /** @@ -227,13 +252,13 @@ GetTimeInNanoSecond ( // Time = --------- x 1,000,000,000 // Frequency // - NanoSeconds = MultU64x32 (DivU64x32Remainder (Ticks, mTimeBase, &Remainder), 1000000000u); + NanoSeconds = MultU64x32 (DivU64x32Remainder (Ticks, GET_TIME_BASE (), &Remainder), 1000000000u); // // Frequency < 0x100000000, so Remainder < 0x100000000, then (Remainder * 1,000,000,000) // will not overflow 64-bit. // - NanoSeconds += DivU64x32 (MultU64x32 ((UINT64)Remainder, 1000000000u), mTimeBase); + NanoSeconds += DivU64x32 (MultU64x32 ((UINT64)Remainder, 1000000000u), GET_TIME_BASE ()); return NanoSeconds; } From 6bbdcecc0a5808ccc011013868590fe6a9ce1c2c Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Mon, 18 Aug 2025 11:37:49 -0700 Subject: [PATCH 0397/1172] OvmfPkg/Tcg2Config: Add RISC-V Support for TPM Device Discovery Enable TPM device detection on RISC-V using gOvmfTpmDiscoveredPpiGuid. Signed-off-by: Tuan Phan --- OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf b/OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf index 51078c981374..0355df9609aa 100644 --- a/OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf +++ b/OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf @@ -52,3 +52,6 @@ [Depex.ARM, Depex.AARCH64] gOvmfTpmDiscoveredPpiGuid + +[Depex.RISCV64] + gOvmfTpmDiscoveredPpiGuid From 62929b3022e68462da46195c0376b81d2c72ccd5 Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Mon, 18 Aug 2025 11:49:35 -0700 Subject: [PATCH 0398/1172] OvmfPkg/RiscVVirt/PlatformPei: Enable TPM Device Discovery Add support for detecting TPM device and installing gOvmfTpmDiscoveredPpiGuid when a TPM is present. Signed-off-by: Tuan Phan --- OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.c | 130 +++++++++++++++++- .../RiscVVirt/PlatformPei/PlatformPeim.inf | 7 + 2 files changed, 136 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.c b/OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.c index 54b5d3361334..3da71aa51b71 100644 --- a/OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.c +++ b/OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.c @@ -1,6 +1,7 @@ /** @file - Copyright (c) 2011, ARM Limited. All rights reserved.
+ Copyright (c) 2011-2014, ARM Limited. All rights reserved.
+ Copyright (c) 2014-2020, Linaro Limited. All rights reserved.
Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -45,6 +46,12 @@ CONST EFI_PEI_PPI_DESCRIPTOR mPpiListBootMode = { NULL }; +CONST EFI_PEI_PPI_DESCRIPTOR mTpm2DiscoveredPpi = { + (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), + &gOvmfTpmDiscoveredPpiGuid, + NULL +}; + /* Install PEI memory. @@ -89,6 +96,126 @@ FindInstallPeiMemory ( ASSERT_EFI_ERROR (PeiServicesInstallPeiMemory (PeiMemoryBase, PEI_MEMORY_SIZE)); } +/** + Set up TPM resources from FDT. + + @param FdtBase Fdt base address + +**/ +STATIC +VOID +SetupTPMResources ( + VOID *FdtBase + ) +{ + INT32 Node, Prev; + INT32 Parent, Depth; + CONST CHAR8 *Compatible; + CONST CHAR8 *CompItem; + INT32 Len; + INT32 RangesLen; + CONST UINT8 *RegProp; + CONST UINT32 *RangesProp; + UINT64 TpmBase; + UINT64 TpmBaseSize; + + // + // Set Parent to suppress incorrect compiler/analyzer warnings. + // + Parent = 0; + + for (Prev = Depth = 0; ; Prev = Node) { + Node = FdtNextNode (FdtBase, Prev, &Depth); + if (Node < 0) { + break; + } + + if (Depth == 1) { + Parent = Node; + } + + Compatible = FdtGetProp (FdtBase, Node, "compatible", &Len); + + // + // Iterate over the NULL-separated items in the compatible string + // + for (CompItem = Compatible; CompItem != NULL && CompItem < Compatible + Len; + CompItem += 1 + AsciiStrLen (CompItem)) + { + if (AsciiStrCmp (CompItem, "tcg,tpm-tis-mmio") == 0) { + RegProp = FdtGetProp (FdtBase, Node, "reg", &Len); + ASSERT (Len == 8 || Len == 16); + if (Len == 8) { + TpmBase = Fdt32ToCpu (*(UINT32 *)RegProp); + TpmBaseSize = Fdt32ToCpu (*(UINT32 *)((UINT8 *)RegProp + 4)); + } else if (Len == 16) { + TpmBase = Fdt64ToCpu (ReadUnaligned64 ((UINT64 *)RegProp)); + TpmBaseSize = Fdt64ToCpu (ReadUnaligned64 ((UINT64 *)((UINT8 *)RegProp + 8))); + } + + if (Depth > 1) { + // + // QEMU/mach-virt may put the TPM on the platform bus, in which case + // we have to take its 'ranges' property into account to translate the + // MMIO address. This consists of a + // tuple, where the child base and the size use the same number of + // cells as the 'reg' property above, and the parent base uses 2 cells + // + RangesProp = FdtGetProp (FdtBase, Parent, "ranges", &RangesLen); + ASSERT (RangesProp != NULL); + + // + // a plain 'ranges' attribute without a value implies a 1:1 mapping + // + if (RangesLen != 0) { + // + // assume a single translated range with 2 cells for the parent base + // + if (RangesLen != Len + 2 * sizeof (UINT32)) { + DEBUG (( + DEBUG_WARN, + "%a: 'ranges' property has unexpected size %d\n", + __func__, + RangesLen + )); + break; + } + + if (Len == 8) { + TpmBase -= Fdt32ToCpu (RangesProp[0]); + } else { + TpmBase -= Fdt64ToCpu (ReadUnaligned64 ((UINT64 *)RangesProp)); + } + + // + // advance RangesProp to the parent bus address + // + RangesProp = (UINT32 *)((UINT8 *)RangesProp + Len / 2); + TpmBase += Fdt64ToCpu (ReadUnaligned64 ((UINT64 *)RangesProp)); + } + } + + break; + } + } + } + + if (TpmBase) { + BuildResourceDescriptorHob ( + EFI_RESOURCE_MEMORY_MAPPED_IO, + EFI_RESOURCE_ATTRIBUTE_PRESENT | + EFI_RESOURCE_ATTRIBUTE_INITIALIZED | + EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | + EFI_RESOURCE_ATTRIBUTE_TESTED, + TpmBase, + ALIGN_VALUE (TpmBaseSize, EFI_PAGE_SIZE) + ); + + ASSERT_EFI_ERROR ((EFI_STATUS)PcdSet64S (PcdTpmBaseAddress, TpmBase)); + PeiServicesInstallPpi (&mTpm2DiscoveredPpi); + } +} + /* Entry point of this module. @@ -125,6 +252,7 @@ InitializePlatformPeim ( MemoryInitialization (SecData->FdtPointer); CpuInitialization (SecData->FdtPointer); PlatformInitialization (SecData->FdtPointer); + SetupTPMResources (SecData->FdtPointer); // // Install PEI memory diff --git a/OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.inf b/OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.inf index 9be96dd3de3d..6ca005bec97c 100644 --- a/OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.inf +++ b/OvmfPkg/RiscVVirt/PlatformPei/PlatformPeim.inf @@ -25,17 +25,24 @@ MdeModulePkg/MdeModulePkg.dec UefiCpuPkg/UefiCpuPkg.dec OvmfPkg/OvmfPkg.dec + SecurityPkg/SecurityPkg.dec [LibraryClasses] PeimEntryPoint DebugLib + FdtLib HobLib + PcdLib PeiServicesLib PlatformSecLib +[Pcd] + gEfiSecurityPkgTokenSpaceGuid.PcdTpmBaseAddress + [Ppis] gEfiPeiMasterBootModePpiGuid # PPI ALWAYS_PRODUCED gEfiSecHobDataPpiGuid # ALWAYS_CONSUMED + gOvmfTpmDiscoveredPpiGuid # SOMETIMES_PRODUCES [Depex] TRUE From 32ea243c279c70509d9a5772e571fee6bcb49a30 Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Mon, 18 Aug 2025 12:00:25 -0700 Subject: [PATCH 0399/1172] OvmfPkg/RiscVVirt: Resolve missing TPM Modules/Libraries Correct missing TPM PEI/DXE library instances/modules. Signed-off-by: Tuan Phan --- OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc | 20 ++++++++++++++++++++ OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf | 10 ++++++++++ 2 files changed, 30 insertions(+) diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc index bc4935ec2b21..9e403e587c5f 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc +++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc @@ -290,6 +290,8 @@ [LibraryClasses.common.PEI_CORE, LibraryClasses.common.PEIM] !if $(TPM2_ENABLE) == TRUE PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf + BaseCryptLib|CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf + Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf !else PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf !endif @@ -317,6 +319,24 @@ NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf } +!if $(TPM2_ENABLE) == TRUE + OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf + SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.inf { + + Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibRouter/Tpm2DeviceLibRouterPei.inf + NULL|SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpm.inf + HashLib|SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterPei.inf + NULL|SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.inf + NULL|SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.inf + NULL|SecurityPkg/Library/HashInstanceLibSha384/HashInstanceLibSha384.inf + NULL|SecurityPkg/Library/HashInstanceLibSha512/HashInstanceLibSha512.inf + NULL|SecurityPkg/Library/HashInstanceLibSm3/HashInstanceLibSm3.inf + } + SecurityPkg/Tcg/Tcg2PlatformPei/Tcg2PlatformPei.inf { + + TpmPlatformHierarchyLib|SecurityPkg/Library/PeiDxeTpmPlatformHierarchyLib/PeiDxeTpmPlatformHierarchyLib.inf + } +!endif !else UefiCpuPkg/SecCore/SecCoreNative.inf { diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf b/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf index 3470b18a2ef5..a71ce1ae0b7e 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf +++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf @@ -211,6 +211,16 @@ INF MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf INF MdeModulePkg/Bus/Usb/UsbKbDxe/UsbKbDxe.inf INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf +# +# TPM2 support +# +!if $(TPM2_ENABLE) == TRUE + INF SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf +!if $(TPM2_CONFIG_ENABLE) == TRUE + INF SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDxe.inf +!endif +!endif + # # TianoCore logo (splash screen) # From 7374b2b224cbce2df1635d0b8d6c0b305aa8b337 Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Mon, 18 Aug 2025 12:16:23 -0700 Subject: [PATCH 0400/1172] OvmfPkg/RiscVVirt: Expand variable store size for secure boot Increase the variable store size to support secure boot, ensuring sufficient space for keys stored in authorized variables. Signed-off-by: Tuan Phan --- OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc index 9e403e587c5f..a49e51c49de5 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc +++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc @@ -193,13 +193,14 @@ [PcdsFixedAtBuild.common] gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x2000 gEfiMdeModulePkgTokenSpaceGuid.PcdMaxAuthVariableSize|0x2800 -!if $(NETWORK_TLS_ENABLE) == TRUE +!if $(NETWORK_TLS_ENABLE) == TRUE || $(SECURE_BOOT_ENABLE) == TRUE # # The cumulative and individual VOLATILE variable size limits should be set # high enough for accommodating several and/or large CA certificates. # gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize|0x80000 gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVolatileVariableSize|0x40000 + gEfiMdeModulePkgTokenSpaceGuid.PcdMaxAuthVariableSize|0x8400 !endif gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"2.7" From 35a3ceb882b57da0964c8b4a038e8808b3dc2b13 Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Mon, 18 Aug 2025 12:06:33 -0700 Subject: [PATCH 0401/1172] OvmfPkg/RiscVVirt: Add SecureBootDefaultKeysInit module. Add SecureBootDefaultKeysInit DXE driver to enroll default keys stored in FV, as EFI Shell is disabled when Secure Boot is enabled, preventing use of the EnrollDefaultKeys UEFI application. Signed-off-by: Tuan Phan --- .../SecureBootDefaultKeysInit.c | 643 ++++++++++++++++++ .../SecureBootDefaultKeysInit.inf | 49 ++ OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc | 2 +- OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf | 18 + 4 files changed, 711 insertions(+), 1 deletion(-) create mode 100644 OvmfPkg/RiscVVirt/Feature/SecureBoot/SecureBootDefaultKeysInit/SecureBootDefaultKeysInit.c create mode 100644 OvmfPkg/RiscVVirt/Feature/SecureBoot/SecureBootDefaultKeysInit/SecureBootDefaultKeysInit.inf diff --git a/OvmfPkg/RiscVVirt/Feature/SecureBoot/SecureBootDefaultKeysInit/SecureBootDefaultKeysInit.c b/OvmfPkg/RiscVVirt/Feature/SecureBoot/SecureBootDefaultKeysInit/SecureBootDefaultKeysInit.c new file mode 100644 index 000000000000..037174dc6a83 --- /dev/null +++ b/OvmfPkg/RiscVVirt/Feature/SecureBoot/SecureBootDefaultKeysInit/SecureBootDefaultKeysInit.c @@ -0,0 +1,643 @@ +/** @file + This driver init default Secure Boot variables + + Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.
+ (C) Copyright 2018 Hewlett Packard Enterprise Development LP
+ Copyright (c) 2021, ARM Ltd. All rights reserved.
+ Copyright (c) 2021, Semihalf All rights reserved.
+ Copyright (c) 2021, Ampere Computing LLC. All rights reserved.
+ Copyright (C) 2023-2025 Advanced Micro Devices, Inc. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + Set PKDefault Variable. + + @param[in] X509Data X509 Certificate data. + @param[in] X509DataSize X509 Certificate data size. + + @retval EFI_SUCCESS PKDefault is set successfully. + +**/ +EFI_STATUS +SetPkDefault ( + IN UINT8 *X509Data, + IN UINTN X509DataSize + ) +{ + EFI_STATUS Status; + UINT32 Attr; + UINTN DataSize; + EFI_SIGNATURE_LIST *PkCert; + EFI_SIGNATURE_DATA *PkCertData; + + PkCert = NULL; + + // + // Allocate space for PK certificate list and initialize it. + // Create PK database entry with SignatureHeaderSize equals 0. + // + PkCert = (EFI_SIGNATURE_LIST *)AllocateZeroPool ( + sizeof (EFI_SIGNATURE_LIST) + sizeof (EFI_SIGNATURE_DATA) - 1 + + X509DataSize + ); + if (PkCert == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: Cannot initialize PKDefault: %r\n", __func__, Status)); + goto ON_EXIT; + } + + PkCert->SignatureListSize = (UINT32)(sizeof (EFI_SIGNATURE_LIST) + + sizeof (EFI_SIGNATURE_DATA) - 1 + + X509DataSize); + PkCert->SignatureSize = (UINT32)(sizeof (EFI_SIGNATURE_DATA) - 1 + X509DataSize); + PkCert->SignatureHeaderSize = 0; + CopyGuid (&PkCert->SignatureType, &gEfiCertX509Guid); + PkCertData = (EFI_SIGNATURE_DATA *)((UINTN)PkCert + + sizeof (EFI_SIGNATURE_LIST) + + PkCert->SignatureHeaderSize); + CopyGuid (&PkCertData->SignatureOwner, &gEfiGlobalVariableGuid); + // + // Fill the PK database with PKpub data from X509 certificate file. + // + CopyMem (&(PkCertData->SignatureData[0]), X509Data, X509DataSize); + + Attr = EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS; + DataSize = PkCert->SignatureListSize; + + Status = gRT->SetVariable ( + EFI_PK_DEFAULT_VARIABLE_NAME, + &gEfiGlobalVariableGuid, + Attr, + DataSize, + PkCert + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Cannot initialize PKDefault: %r\n", __func__, Status)); + goto ON_EXIT; + } + +ON_EXIT: + + if (PkCert != NULL) { + FreePool (PkCert); + } + + return Status; +} + +/** + Set KDKDefault Variable. + + @param[in] X509Data X509 Certificate data. + @param[in] X509DataSize X509 Certificate data size. + + @retval EFI_SUCCESS KEKDefault is set successfully. + +**/ +EFI_STATUS +SetKekDefault ( + IN UINT8 *X509Data, + IN UINTN X509DataSize + ) +{ + EFI_STATUS Status; + EFI_SIGNATURE_DATA *KEKSigData; + EFI_SIGNATURE_LIST *KekSigList; + UINTN DataSize; + UINTN KekSigListSize; + UINT32 Attr; + + KekSigList = NULL; + KekSigListSize = 0; + DataSize = 0; + KEKSigData = NULL; + + KekSigListSize = sizeof (EFI_SIGNATURE_LIST) + sizeof (EFI_SIGNATURE_DATA) - 1 + X509DataSize; + KekSigList = (EFI_SIGNATURE_LIST *)AllocateZeroPool (KekSigListSize); + if (KekSigList == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: Cannot initialize KEKDefault: %r\n", __func__, Status)); + goto ON_EXIT; + } + + // + // Fill Certificate Database parameters. + // + KekSigList->SignatureListSize = (UINT32)KekSigListSize; + KekSigList->SignatureHeaderSize = 0; + KekSigList->SignatureSize = (UINT32)(sizeof (EFI_SIGNATURE_DATA) - 1 + X509DataSize); + CopyGuid (&KekSigList->SignatureType, &gEfiCertX509Guid); + + KEKSigData = (EFI_SIGNATURE_DATA *)((UINT8 *)KekSigList + sizeof (EFI_SIGNATURE_LIST)); + CopyGuid (&KEKSigData->SignatureOwner, &gEfiGlobalVariableGuid); + CopyMem (KEKSigData->SignatureData, X509Data, X509DataSize); + + // + // Check if KEK been already existed. + // If true, use EFI_VARIABLE_APPEND_WRITE attribute to append the + // new kek to original variable + // + Attr = EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS; + + Status = gRT->GetVariable ( + EFI_KEK_DEFAULT_VARIABLE_NAME, + &gEfiGlobalVariableGuid, + NULL, + &DataSize, + NULL + ); + if (Status == EFI_BUFFER_TOO_SMALL) { + Attr |= EFI_VARIABLE_APPEND_WRITE; + } else if (Status != EFI_NOT_FOUND) { + DEBUG ((DEBUG_ERROR, "%a: Cannot get the value of KEK: %r\n", __func__, Status)); + goto ON_EXIT; + } + + Status = gRT->SetVariable ( + EFI_KEK_DEFAULT_VARIABLE_NAME, + &gEfiGlobalVariableGuid, + Attr, + KekSigListSize, + KekSigList + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Cannot initialize KEKDefault: %r\n", __func__, Status)); + goto ON_EXIT; + } + +ON_EXIT: + + if (KekSigList != NULL) { + FreePool (KekSigList); + } + + return Status; +} + +/** + Checks if the file content complies with EFI_VARIABLE_AUTHENTICATION_2 format + + @param[in] Data Data. + @param[in] DataSize Data size. + + @retval TRUE The content is EFI_VARIABLE_AUTHENTICATION_2 format. + @retval FALSE The content is NOT a EFI_VARIABLE_AUTHENTICATION_2 format. + +**/ +BOOLEAN +IsAuthentication2Format ( + IN UINT8 *Data, + IN UINTN DataSize + ) +{ + EFI_VARIABLE_AUTHENTICATION_2 *Auth2; + BOOLEAN IsAuth2Format; + + IsAuth2Format = FALSE; + + Auth2 = (EFI_VARIABLE_AUTHENTICATION_2 *)Data; + if (Auth2->AuthInfo.Hdr.wCertificateType != WIN_CERT_TYPE_EFI_GUID) { + goto ON_EXIT; + } + + if (CompareGuid (&gEfiCertPkcs7Guid, &Auth2->AuthInfo.CertType)) { + IsAuth2Format = TRUE; + } + +ON_EXIT: + + return IsAuth2Format; +} + +/** + Set signature database with the data of EFI_VARIABLE_AUTHENTICATION_2 format. + + @param[in] AuthData AUTHENTICATION_2 data. + @param[in] AuthDataSize AUTHENTICATION_2 data size. + @param[in] VariableName Variable name of signature database, must be + EFI_DB_DEFAULT_VARIABLE_NAME or EFI_DBX_DEFAULT_VARIABLE_NAME or EFI_DBT_DEFAULT_VARIABLE_NAME. + + @retval EFI_SUCCESS New signature is set successfully. + @retval EFI_INVALID_PARAMETER The parameter is invalid. + @retval EFI_UNSUPPORTED Unsupported command. + @retval EFI_OUT_OF_RESOURCES Could not allocate needed resources. + +**/ +EFI_STATUS +SetAuthentication2ToSigDb ( + IN UINT8 *AuthData, + IN UINTN AuthDataSize, + IN CHAR16 *VariableName + ) +{ + EFI_STATUS Status; + UINTN DataSize; + UINT32 Attr; + UINT8 *Data; + + Attr = EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS; + + // + // Check if SigDB variable has been already existed. + // If true, use EFI_VARIABLE_APPEND_WRITE attribute to append the + // new signature data to original variable + // + DataSize = 0; + Status = gRT->GetVariable ( + VariableName, + &gEfiGlobalVariableGuid, + NULL, + &DataSize, + NULL + ); + if (Status == EFI_BUFFER_TOO_SMALL) { + Attr |= EFI_VARIABLE_APPEND_WRITE; + } else if (Status != EFI_NOT_FOUND) { + DEBUG ((DEBUG_ERROR, "%a: Cannot get the value of signature database: %r\n", __func__, Status)); + return Status; + } + + // + // Ignore AUTHENTICATION_2 region. Only the actual certificate is needed. + // + DataSize = AuthDataSize - ((EFI_VARIABLE_AUTHENTICATION_2 *)AuthData)->AuthInfo.Hdr.dwLength - sizeof (EFI_TIME); + Data = AuthData + (AuthDataSize - DataSize); + + Status = gRT->SetVariable ( + VariableName, + &gEfiGlobalVariableGuid, + Attr, + DataSize, + Data + ); + + return Status; +} + +/** + + Set signature database with the data of X509 format. + + @param[in] X509Data X509 Certificate data. + @param[in] X509DataSize X509 Certificate data size. + @param[in] VariableName Variable name of signature database, must be + EFI_DB_DEFAULT_VARIABLE_NAME or EFI_DBX_DEFAULT_VARIABLE_NAME or EFI_DBT_DEFAULT_VARIABLE_NAME. + @param[in] SignatureOwnerGuid Guid of the signature owner. + + @retval EFI_SUCCESS New X509 is enrolled successfully. + @retval EFI_OUT_OF_RESOURCES Could not allocate needed resources. + +**/ +EFI_STATUS +SetX509ToSigDb ( + IN UINT8 *X509Data, + IN UINTN X509DataSize, + IN CHAR16 *VariableName, + IN EFI_GUID *SignatureOwnerGuid + ) +{ + EFI_STATUS Status; + EFI_SIGNATURE_LIST *SigDBCert; + EFI_SIGNATURE_DATA *SigDBCertData; + VOID *Data; + UINTN DataSize; + UINTN SigDBSize; + UINT32 Attr; + + SigDBSize = 0; + DataSize = 0; + SigDBCert = NULL; + SigDBCertData = NULL; + Data = NULL; + + SigDBSize = sizeof (EFI_SIGNATURE_LIST) + sizeof (EFI_SIGNATURE_DATA) - 1 + X509DataSize; + Data = AllocateZeroPool (SigDBSize); + if (Data == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ((DEBUG_ERROR, "%a: Cannot allocate memory: %r\n", __func__, Status)); + goto ON_EXIT; + } + + // + // Fill Certificate Database parameters. + // + SigDBCert = (EFI_SIGNATURE_LIST *)Data; + SigDBCert->SignatureListSize = (UINT32)SigDBSize; + SigDBCert->SignatureHeaderSize = 0; + SigDBCert->SignatureSize = (UINT32)(sizeof (EFI_SIGNATURE_DATA) - 1 + X509DataSize); + CopyGuid (&SigDBCert->SignatureType, &gEfiCertX509Guid); + + SigDBCertData = (EFI_SIGNATURE_DATA *)((UINT8 *)SigDBCert + sizeof (EFI_SIGNATURE_LIST)); + CopyGuid (&SigDBCertData->SignatureOwner, SignatureOwnerGuid); + CopyMem ((UINT8 *)(SigDBCertData->SignatureData), X509Data, X509DataSize); + + // + // Check if signature database entry has been already existed. + // If true, use EFI_VARIABLE_APPEND_WRITE attribute to append the + // new signature data to original variable + // + Attr = EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS; + + Status = gRT->GetVariable ( + VariableName, + &gEfiGlobalVariableGuid, + NULL, + &DataSize, + NULL + ); + if (Status == EFI_BUFFER_TOO_SMALL) { + Attr |= EFI_VARIABLE_APPEND_WRITE; + } else if (Status != EFI_NOT_FOUND) { + goto ON_EXIT; + } + + Status = gRT->SetVariable ( + VariableName, + &gEfiGlobalVariableGuid, + Attr, + SigDBSize, + Data + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Cannot set signature database: %r\n", __func__, Status)); + goto ON_EXIT; + } + +ON_EXIT: + + if (Data != NULL) { + FreePool (Data); + } + + return Status; +} + +/** + + Set signature database. + + @param[in] Data Data. + @param[in] DataSize Data size. + @param[in] VariableName Variable name of signature database, must be + EFI_DB_DEFAULT_VARIABLE_NAME or EFI_DBX_DEFAULT_VARIABLE_NAME or EFI_DBT_DEFAULT_VARIABLE_NAME. + @param[in] SignatureOwnerGuid Guid of the signature owner. + + @retval EFI_SUCCESS Signature is set successfully. + @retval EFI_OUT_OF_RESOURCES Could not allocate needed resources. + +**/ +EFI_STATUS +SetSignatureDatabase ( + IN UINT8 *Data, + IN UINTN DataSize, + IN CHAR16 *VariableName, + IN EFI_GUID *SignatureOwnerGuid + ) +{ + if (IsAuthentication2Format (Data, DataSize)) { + return SetAuthentication2ToSigDb (Data, DataSize, VariableName); + } else { + return SetX509ToSigDb (Data, DataSize, VariableName, SignatureOwnerGuid); + } +} + +/** Initializes PKDefault variable with data from FFS section. + + @retval EFI_SUCCESS Variable was initialized successfully. + @retval EFI_UNSUPPORTED Variable already exists. +**/ +EFI_STATUS +InitPkDefault ( + IN VOID + ) +{ + EFI_STATUS Status; + UINT8 *Data; + UINTN DataSize; + + // + // Check if variable exists, if so do not change it + // + Status = GetVariable2 (EFI_PK_DEFAULT_VARIABLE_NAME, &gEfiGlobalVariableGuid, (VOID **)&Data, &DataSize); + if (Status == EFI_SUCCESS) { + DEBUG ((DEBUG_INFO, "Variable %s exists. Old value is preserved\n", EFI_PK_DEFAULT_VARIABLE_NAME)); + FreePool (Data); + return EFI_UNSUPPORTED; + } + + // + // Variable does not exist, can be initialized + // + DEBUG ((DEBUG_INFO, "Variable %s does not exist.\n", EFI_PK_DEFAULT_VARIABLE_NAME)); + + // + // Enroll default PK. + // + Status = GetSectionFromFv ( + &gDefaultPKFileGuid, + EFI_SECTION_RAW, + 0, + (VOID **)&Data, + &DataSize + ); + if (!EFI_ERROR (Status)) { + SetPkDefault (Data, DataSize); + } + + return EFI_SUCCESS; +} + +/** Initializes KEKDefault variable with data from FFS section. + + @retval EFI_SUCCESS Variable was initialized successfully. + @retval EFI_UNSUPPORTED Variable already exists. +**/ +EFI_STATUS +InitKekDefault ( + IN VOID + ) +{ + EFI_STATUS Status; + UINTN Index; + UINT8 *Data; + UINTN DataSize; + + // + // Check if variable exists, if so do not change it + // + Status = GetVariable2 (EFI_KEK_DEFAULT_VARIABLE_NAME, &gEfiGlobalVariableGuid, (VOID **)&Data, &DataSize); + if (Status == EFI_SUCCESS) { + DEBUG ((DEBUG_INFO, "Variable %s exists. Old value is preserved\n", EFI_KEK_DEFAULT_VARIABLE_NAME)); + FreePool (Data); + return EFI_UNSUPPORTED; + } + + Index = 0; + do { + Status = GetSectionFromFv ( + &gDefaultKEKFileGuid, + EFI_SECTION_RAW, + Index, + (VOID **)&Data, + &DataSize + ); + if (!EFI_ERROR (Status)) { + SetKekDefault (Data, DataSize); + Index++; + } + } while (Status == EFI_SUCCESS); + + return EFI_SUCCESS; +} + +/** Initializes dbDefault variable with data from FFS section. + + @retval EFI_SUCCESS Variable was initialized successfully. + @retval EFI_UNSUPPORTED Variable already exists. +**/ +EFI_STATUS +InitDbDefault ( + IN VOID + ) +{ + EFI_STATUS Status; + UINTN Index; + UINT8 *Data; + UINTN DataSize; + + Status = GetVariable2 (EFI_DB_DEFAULT_VARIABLE_NAME, &gEfiGlobalVariableGuid, (VOID **)&Data, &DataSize); + if (Status == EFI_SUCCESS) { + DEBUG ((DEBUG_INFO, "Variable %s exists. Old value is preserved\n", EFI_DB_DEFAULT_VARIABLE_NAME)); + FreePool (Data); + return EFI_UNSUPPORTED; + } + + DEBUG ((DEBUG_INFO, "Variable %s does not exist.\n", EFI_DB_DEFAULT_VARIABLE_NAME)); + + Index = 0; + do { + Status = GetSectionFromFv ( + &gDefaultdbFileGuid, + EFI_SECTION_RAW, + Index, + (VOID **)&Data, + &DataSize + ); + if (!EFI_ERROR (Status)) { + SetSignatureDatabase (Data, DataSize, EFI_DB_DEFAULT_VARIABLE_NAME, &gEfiGlobalVariableGuid); + Index++; + } + } while (Status == EFI_SUCCESS); + + return EFI_SUCCESS; +} + +/** Initializes dbxDefault variable with data from FFS section. + + @retval EFI_SUCCESS Variable was initialized successfully. + @retval EFI_UNSUPPORTED Variable already exists. +**/ +EFI_STATUS +InitDbxDefault ( + IN VOID + ) +{ + EFI_STATUS Status; + UINTN Index; + UINT8 *Data; + UINTN DataSize; + + // + // Check if variable exists, if so do not change it + // + Status = GetVariable2 (EFI_DBX_DEFAULT_VARIABLE_NAME, &gEfiGlobalVariableGuid, (VOID **)&Data, &DataSize); + if (Status == EFI_SUCCESS) { + DEBUG ((DEBUG_INFO, "Variable %s exists. Old value is preserved\n", EFI_DBX_DEFAULT_VARIABLE_NAME)); + FreePool (Data); + return EFI_UNSUPPORTED; + } + + // + // Variable does not exist, can be initialized + // + DEBUG ((DEBUG_INFO, "Variable %s does not exist.\n", EFI_DBX_DEFAULT_VARIABLE_NAME)); + + Index = 0; + do { + Status = GetSectionFromFv ( + &gDefaultdbxFileGuid, + EFI_SECTION_RAW, + Index, + (VOID **)&Data, + &DataSize + ); + if (!EFI_ERROR (Status)) { + SetSignatureDatabase (Data, DataSize, EFI_DBX_DEFAULT_VARIABLE_NAME, &gEfiGlobalVariableGuid); + Index++; + } + } while (Status == EFI_SUCCESS); + + return EFI_SUCCESS; +} + +/** + Initializes default SecureBoot certificates with data from FFS section. + + @param[in] ImageHandle The firmware allocated handle for the EFI image. + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS Variable was initialized successfully. +**/ +EFI_STATUS +EFIAPI +SecureBootDefaultKeysInitEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = InitPkDefault (); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Cannot initialize PKDefault: %r\n", __func__, Status)); + return Status; + } + + Status = InitKekDefault (); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Cannot initialize KEKDefault: %r\n", __func__, Status)); + return Status; + } + + Status = InitDbDefault (); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Cannot initialize dbDefault: %r\n", __func__, Status)); + return Status; + } + + Status = InitDbxDefault (); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Cannot initialize dbxDefault: %r\n", __func__, Status)); + return Status; + } + + return EFI_SUCCESS; +} diff --git a/OvmfPkg/RiscVVirt/Feature/SecureBoot/SecureBootDefaultKeysInit/SecureBootDefaultKeysInit.inf b/OvmfPkg/RiscVVirt/Feature/SecureBoot/SecureBootDefaultKeysInit/SecureBootDefaultKeysInit.inf new file mode 100644 index 000000000000..012784173372 --- /dev/null +++ b/OvmfPkg/RiscVVirt/Feature/SecureBoot/SecureBootDefaultKeysInit/SecureBootDefaultKeysInit.inf @@ -0,0 +1,49 @@ +## @file +# Initializes Secure Boot default keys +# +# Copyright (c) 2021, ARM Ltd. All rights reserved.
+# Copyright (c) 2021, Semihalf All rights reserved.
+# Copyright (C) 2023-2025 Advanced Micro Devices, Inc. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 1.29 + BASE_NAME = SecureBootDefaultKeysInit + FILE_GUID = 384D1860-7306-11F0-B8B4-F53A5CB787AC + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = SecureBootDefaultKeysInitEntry + +[Sources] + SecureBootDefaultKeysInit.c + +[Packages] + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + SecurityPkg/SecurityPkg.dec + +[LibraryClasses] + DebugLib + DxeServicesLib + SecureBootVariableLib + SecureBootVariableProvisionLib + UefiBootServicesTableLib + UefiDriverEntryPoint + +[Guids] + gDefaultdbFileGuid + gDefaultdbxFileGuid + gDefaultKEKFileGuid + gDefaultPKFileGuid + gEfiCertPkcs7Guid + gEfiCertX509Guid + gEfiCustomModeEnableGuid + gEfiImageSecurityDatabaseGuid + gEfiSecureBootEnableDisableGuid + +[Depex] + gEfiVariableArchProtocolGuid AND + gEfiVariableWriteArchProtocolGuid diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc index a49e51c49de5..c23130a72dc6 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc +++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc @@ -391,7 +391,7 @@ !endif } SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf - OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.inf + OvmfPkg/RiscVVirt/Feature/SecureBoot/SecureBootDefaultKeysInit/SecureBootDefaultKeysInit.inf !else MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf !endif diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf b/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf index a71ce1ae0b7e..1f37eb68945f 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf +++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf @@ -89,6 +89,24 @@ INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf !endif !if $(SECURE_BOOT_ENABLE) == TRUE INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf + INF OvmfPkg/RiscVVirt/Feature/SecureBoot/SecureBootDefaultKeysInit/SecureBootDefaultKeysInit.inf + + FILE FREEFORM = 85254ea7-4759-4fc4-82d4-5eed5fb0a4a0 { + SECTION RAW = OvmfPkg/RiscVVirt/Feature/SecureBoot/SecureBootKeys/PK/PK.cer + } + + FILE FREEFORM = 6f64916e-9f7a-4c35-b952-cd041efb05a3 { + SECTION RAW = OvmfPkg/RiscVVirt/Feature/SecureBoot/SecureBootKeys/KEK/MicCorKEKCA2011_2011-06-24.crt + } + + FILE FREEFORM = c491d352-7623-4843-accc-2791a7574421 { + SECTION RAW = OvmfPkg/RiscVVirt/Feature/SecureBoot/SecureBootKeys/db/MicWinProPCA2011_2011-10-19.crt + SECTION RAW = OvmfPkg/RiscVVirt/Feature/SecureBoot/SecureBootKeys/db/MicCorUEFCA2011_2011-06-27.crt + } + + FILE FREEFORM = 5740766a-718e-4dc0-9935-c36f7d3f884f { + SECTION RAW = OvmfPkg/RiscVVirt/Feature/SecureBoot/SecureBootKeys/dbx/dbxupdate_x64.bin + } !endif INF MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf INF MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf From a9cad8a1fbbebae818d4b6522a2ff4ec8cb8bd30 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Mon, 4 Aug 2025 14:52:28 +0100 Subject: [PATCH 0402/1172] ArmPkg/Library/ArmTransferList: add helper to get TransferList Add helper to get TrnasferList from HOB list. Signed-off-by: Yeoreum Yun --- ArmPkg/Include/Library/ArmTransferListLib.h | 15 +++++++ .../ArmTransferListLib/ArmTransferListLib.c | 39 +++++++++++++++++++ .../ArmTransferListLib/ArmTransferListLib.inf | 3 ++ 3 files changed, 57 insertions(+) diff --git a/ArmPkg/Include/Library/ArmTransferListLib.h b/ArmPkg/Include/Library/ArmTransferListLib.h index fb0c69972e07..38bfc507bdba 100644 --- a/ArmPkg/Include/Library/ArmTransferListLib.h +++ b/ArmPkg/Include/Library/ArmTransferListLib.h @@ -18,6 +18,21 @@ #include #include +/** + Get the TransferList from HOB list. + + @param[out] TransferList TransferList + + @retval EFI_SUCCESS TransferList is found. + @retval EFI_NOT_FOUND TransferList is not found. + +**/ +EFI_STATUS +EFIAPI +TransferListGetFromHobList ( + OUT TRANSFER_LIST_HEADER **TransferList + ); + /** Return the first Transfer Entry Node in the Transfer List. diff --git a/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.c b/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.c index af8170e67f37..6fa7c9bcaac0 100644 --- a/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.c +++ b/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.c @@ -13,6 +13,45 @@ #include #include #include +#include + +/** + Get the TransferList from HOB list. + + @param[out] TransferList TransferList + + @retval EFI_SUCCESS TransferList is found. + @retval EFI_NOT_FOUND TransferList is not found. + +**/ +EFI_STATUS +EFIAPI +TransferListGetFromHobList ( + OUT TRANSFER_LIST_HEADER **TransferList + ) +{ + VOID *HobList; + EFI_HOB_GUID_TYPE *GuidHob; + UINTN *GuidHobData; + + *TransferList = NULL; + + HobList = GetHobList (); + if (HobList == NULL) { + return EFI_NOT_FOUND; + } + + GuidHob = GetNextGuidHob (&gArmTransferListHobGuid, HobList); + if (GuidHob == NULL) { + return EFI_NOT_FOUND; + } + + GuidHobData = GET_GUID_HOB_DATA (GuidHob); + + *TransferList = (TRANSFER_LIST_HEADER *)(*GuidHobData); + + return EFI_SUCCESS; +} /** This function verifies the checksum of the Transfer List. diff --git a/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.inf b/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.inf index b1eeb8a1f757..5ffb1a4d9c46 100644 --- a/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.inf +++ b/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.inf @@ -25,3 +25,6 @@ [LibraryClasses] BaseLib + +[Guids] + gArmTransferListHobGuid From 5025fc1eda686d9daae6dc8a5b045a501cde12d3 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Mon, 4 Aug 2025 14:53:30 +0100 Subject: [PATCH 0403/1172] ArmPkg/ArmTransferList: add TPM_EVENT_LOG information Add TRANSFER_EVENT_LOG information according to firmware hand-off spec[0]. and related helper. Links: https://github.com/FirmwareHandoff/firmware_handoff/blob/main/source/transfer_list.rst#tpm-event-log-table-entry-layout-xferlist_evlog Signed-off-by: Yeoreum Yun --- .../IndustryStandard/ArmTransferList.h | 20 ++++++++ ArmPkg/Include/Library/ArmTransferListLib.h | 22 ++++++++ .../ArmTransferListLib/ArmTransferListLib.c | 50 +++++++++++++++++++ 3 files changed, 92 insertions(+) diff --git a/ArmPkg/Include/IndustryStandard/ArmTransferList.h b/ArmPkg/Include/IndustryStandard/ArmTransferList.h index 303384622f95..2bc0d80177bb 100644 --- a/ArmPkg/Include/IndustryStandard/ArmTransferList.h +++ b/ArmPkg/Include/IndustryStandard/ArmTransferList.h @@ -73,6 +73,12 @@ */ #define TRANSFER_LIST_FL_HAS_CHECKSUM BIT0 +/* + * Flag values for TPM event log table entry layout XFERLIST_EVLOG->Flags, + * see https://github.com/FirmwareHandoff/firmware_handoff/blob/main/source/transfer_list.rst#tpm-event-log-table-entry-layout-xferlist_evlog + */ +#define TRANSFER_LIST_EVENTLOG_FL_NEED_TO_REPLAY BIT0 /* Need to replay */ + /* * Operation codes indicating the validity of the Transfer List. */ @@ -137,4 +143,18 @@ typedef struct TransferEntryHeader { UINT32 DataSize; } TRANSFER_ENTRY_HEADER; +/* + * TPM event log information entry, + * see Section 'TPM event log table entry layout (XFERLIST_EVLOG)' in + * the Firmware Handoff specification. + */ +typedef struct TransferListEventLog { + /// See the TRANSFER_LIST_EVENT_LOG_FL_* + UINT32 Flags; + + /// TPM event log as much as + /// TRNASFER_ENTRY_HEADER->DataSize - sizeof (TRANSFER_LIST_EVENTLOG)->Flags + UINT8 EventLog[]; +} TRANSFER_LIST_EVENTLOG; + #endif // ARM_TRANSFER_LIST_ diff --git a/ArmPkg/Include/Library/ArmTransferListLib.h b/ArmPkg/Include/Library/ArmTransferListLib.h index 38bfc507bdba..09ade9f4a10a 100644 --- a/ArmPkg/Include/Library/ArmTransferListLib.h +++ b/ArmPkg/Include/Library/ArmTransferListLib.h @@ -172,4 +172,26 @@ TransferListFindEntry ( IN UINT16 TagId ); +/** + Get TPM event log from TransferList + + @param [in] TransferListHeader Pointer to the Transfer List Header + @param [out] EventLog Pointer to Eventlog in TransferList + @param [out] EventLogSize Size of Event log + @param [out] EventLogFlags Flags for Event log + + @return EFI_SUCCESS + @return EFI_NOT_FOUND No Event log in TransferListHeader + @return EFI_INVALID_PARAMETER Invalid parameters + +**/ +EFI_STATUS +EFIAPI +TransferListGetEventLog ( + IN TRANSFER_LIST_HEADER *TransferListHeader, + OUT VOID **EventLog, + OUT UINTN *EventLogSize, + OUT UINT32 *EventLogFlags OPTIONAL + ); + #endif // ARM_TRANSFER_LIST_LIB_ diff --git a/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.c b/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.c index 6fa7c9bcaac0..06d66292b428 100644 --- a/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.c +++ b/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.c @@ -313,6 +313,56 @@ TransferListFindEntry ( return Entry; } +/** + Get TPM event log from TransferList + + @param [in] TransferListHeader Pointer to the Transfer List Header + @param [out] EventLog Pointer to Eventlog in TransferList + @param [out] EventLogSize Size of Event log + @param [out] EventLogFlags Flags for Event log + + @return EFI_SUCCESS + @return EFI_NOT_FOUND No Event log in TransferListHeader + @return EFI_INVALID_PARAMETER Invalid parameters + +**/ +EFI_STATUS +EFIAPI +TransferListGetEventLog ( + IN TRANSFER_LIST_HEADER *TransferListHeader, + OUT VOID **EventLog, + OUT UINTN *EventLogSize, + OUT UINT32 *EventLogFlags OPTIONAL + ) +{ + TRANSFER_ENTRY_HEADER *Entry; + TRANSFER_LIST_EVENTLOG *EntryData; + + if ((TransferListHeader == NULL) || (EventLog == NULL) || (EventLogSize == NULL)) { + return EFI_INVALID_PARAMETER; + } + + *EventLog = NULL; + *EventLogSize = 0; + + Entry = TransferListFindFirstEntry (TransferListHeader, TRANSFER_ENTRY_TAG_ID_TPM_EVENT_LOG); + if ((Entry == NULL) || (Entry->DataSize == 0) || + ((Entry->DataSize - OFFSET_OF (TRANSFER_LIST_EVENTLOG, EventLog)) == 0)) + { + return EFI_NOT_FOUND; + } + + EntryData = TransferListGetEntryData (Entry); + if (EventLogFlags != NULL) { + *EventLogFlags = EntryData->Flags; + } + + *EventLogSize = Entry->DataSize - OFFSET_OF (TRANSFER_LIST_EVENTLOG, EventLog); + *EventLog = (VOID *)&EntryData->EventLog; + + return EFI_SUCCESS; +} + /** Dump the transfer list to the debug output. From 060bb0e5a75946729defa4824fa899cf4cc0528b Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Fri, 8 Aug 2025 13:41:10 -0400 Subject: [PATCH 0404/1172] SecurityPkg/FvReportPei: Improve CheckStoredHashFv() description Adds more detail to the function description so the dependencies and outcomes of the verification process are easier for a reviewer and consumer to understand. Signed-off-by: Michael Kubacki --- SecurityPkg/FvReportPei/FvReportPei.c | 29 +++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/SecurityPkg/FvReportPei/FvReportPei.c b/SecurityPkg/FvReportPei/FvReportPei.c index 50773db056bb..6c92e7379d21 100644 --- a/SecurityPkg/FvReportPei/FvReportPei.c +++ b/SecurityPkg/FvReportPei/FvReportPei.c @@ -343,17 +343,38 @@ GetHashInfo ( } /** - Verify and report pre-hashed FVs. + Verifies and reports pre-hashed Firmware Volumes (FVs). - Doing this must be at post-memory to make sure there's enough memory to hold - all FVs to be verified. This is necessary for mitigating TOCTOU issue. + This function should be called after memory initialization (post-memory phase) + to ensure sufficient memory is available to hold all FVs for verification. - This function will never return if the verification is failed. + Verifying FVs at this stage is critical to mitigate Time-of-Check to Time-of-Use (TOCTOU) vulnerabilities. + + FV Verification Step: + + This function relies upon an instance of gEdkiiPeiFirmwareVolumeInfoStoredHashFvPpiGuid being installed. If + an instance of the PPI is not found, EFI_NOT_FOUND is returned. + + If the gEdkiiPeiFirmwareVolumeInfoStoredHashFvPpiGuid PPI instance does not have valid hash information for the + current boot mode (hash info is NULL), verification is treated as successful. + + FV Reporting Step: + + If FV verification is successful, the function reports the FVs to PEI and/or DXE core for further processing by: + + 1. Installing a FV HOB. + 2. Installing a FV Info PPI. + 3. Reporting a status code with the value from PcdStatusCodeFvVerificationPass to indicate that FV verification + passed. + + If FV verification fails, the function reports a status code with the value from PcdStatusCodeFvVerificationFail + and returns a failure status code. @param[in] PeiServices General purpose services available to every PEIM. @param[in] BootMode Current boot mode. @retval EFI_SUCCESS The function completed successfully. + @retval EFI_NOT_FOUND No valid gEdkiiPeiFirmwareVolumeInfoStoredHashFvPpiGuid PPI instance found. **/ STATIC EFI_STATUS From aeea04341cd12d237fe90e7ed9ebd1cfe7764dab Mon Sep 17 00:00:00 2001 From: Jack Little Date: Mon, 14 Jul 2025 15:42:49 -0500 Subject: [PATCH 0405/1172] MdeModulePkg: Fix malformed terminal control sequences Commit 9224a2b91764ab17b2c1dbc9fdcb012eaed62da6 adds support for larger terminal dimensions; however, the ANSI control sequences to manipulate the terminal cursor are not built to accomodate terminal dimensions that are three digits long. For example, suppose we want to move the cursor 163 columns to the right. The required control sequence would be `^[[163C`; however, the existing code will create a control sequence of `^[[@3C` due to trying to add 16 to the character '0' instead of either 1 or 6. This fix adds a third digit to the sequence templates for moving the cursor forward, moving it backwards, and setting the cursor position. Signed-off-by: Jack Little --- .../Universal/Console/TerminalDxe/Terminal.h | 2 +- .../Console/TerminalDxe/TerminalConOut.c | 32 +++++++++++-------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h index f9ef3b9c098b..7a7aa5bb465c 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h @@ -163,7 +163,7 @@ typedef union { #define FOREGROUND_CONTROL_OFFSET 6 #define BACKGROUND_CONTROL_OFFSET 11 #define ROW_OFFSET 2 -#define COLUMN_OFFSET 5 +#define COLUMN_OFFSET 6 #define FW_BACK_OFFSET 2 #define RESIZE_ROW_OFFSET 4 #define RESIZE_COLUMN_OFFSET 8 diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c index c3f3399e5f80..54539c329782 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c +++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c @@ -76,12 +76,12 @@ UNICODE_TO_CHAR UnicodeToPcAnsiOrAscii[] = { }; CHAR16 mSetModeString[] = { ESC, '[', '=', '3', 'h', 0 }; -CHAR16 mSetModeStringResize[] = { ESC, '[', '8', ';', '0', '0', '0', ';', '0', '0', '0', 't', '0', 0 }; +CHAR16 mSetModeStringResize[] = { ESC, '[', '8', ';', '0', '0', '0', ';', '0', '0', '0', 't', 0 }; CHAR16 mSetAttributeString[] = { ESC, '[', '0', 'm', ESC, '[', '4', '0', 'm', ESC, '[', '4', '0', 'm', 0 }; CHAR16 mClearScreenString[] = { ESC, '[', '2', 'J', 0 }; -CHAR16 mSetCursorPositionString[] = { ESC, '[', '0', '0', ';', '0', '0', 'H', 0 }; -CHAR16 mCursorForwardString[] = { ESC, '[', '0', '0', 'C', 0 }; -CHAR16 mCursorBackwardString[] = { ESC, '[', '0', '0', 'D', 0 }; +CHAR16 mSetCursorPositionString[] = { ESC, '[', '0', '0', '0', ';', '0', '0', '0', 'H', 0 }; +CHAR16 mCursorForwardString[] = { ESC, '[', '0', '0', '0', 'C', 0 }; +CHAR16 mCursorBackwardString[] = { ESC, '[', '0', '0', '0', 'D', 0 }; // // Body of the ConOut functions @@ -505,10 +505,10 @@ TerminalConOutSetMode ( Rows = TerminalDevice->TerminalConsoleModeData[ModeNumber].Rows; mSetModeStringResize[RESIZE_ROW_OFFSET + 0] = (CHAR16)('0' + (Rows / 100)); - mSetModeStringResize[RESIZE_ROW_OFFSET + 1] = (CHAR16)('0' + ((Rows - ((Rows / 100) * 100)) / 10)); + mSetModeStringResize[RESIZE_ROW_OFFSET + 1] = (CHAR16)('0' + ((Rows % 100) / 10)); mSetModeStringResize[RESIZE_ROW_OFFSET + 2] = (CHAR16)('0' + (Rows % 10)); mSetModeStringResize[RESIZE_COLUMN_OFFSET + 0] = (CHAR16)('0' + (Columns / 100)); - mSetModeStringResize[RESIZE_COLUMN_OFFSET + 1] = (CHAR16)('0' + ((Columns - ((Columns / 100) * 100)) / 10)); + mSetModeStringResize[RESIZE_COLUMN_OFFSET + 1] = (CHAR16)('0' + ((Columns % 100) / 10)); mSetModeStringResize[RESIZE_COLUMN_OFFSET + 2] = (CHAR16)('0' + (Columns % 10)); String = mSetModeStringResize; @@ -812,21 +812,25 @@ TerminalConOutSetCursorPosition ( ((UINTN)Mode->CursorRow == Row)) { if ((UINTN)Mode->CursorColumn > Column) { - mCursorBackwardString[FW_BACK_OFFSET + 0] = (CHAR16)('0' + ((Mode->CursorColumn - Column) / 10)); - mCursorBackwardString[FW_BACK_OFFSET + 1] = (CHAR16)('0' + ((Mode->CursorColumn - Column) % 10)); + mCursorBackwardString[FW_BACK_OFFSET + 0] = (CHAR16)('0' + ((Mode->CursorColumn - Column) / 100)); + mCursorBackwardString[FW_BACK_OFFSET + 1] = (CHAR16)('0' + (((Mode->CursorColumn - Column) % 100) / 10)); + mCursorBackwardString[FW_BACK_OFFSET + 2] = (CHAR16)('0' + ((Mode->CursorColumn - Column) % 10)); String = mCursorBackwardString; } else if (Column > (UINTN)Mode->CursorColumn) { - mCursorForwardString[FW_BACK_OFFSET + 0] = (CHAR16)('0' + ((Column - Mode->CursorColumn) / 10)); - mCursorForwardString[FW_BACK_OFFSET + 1] = (CHAR16)('0' + ((Column - Mode->CursorColumn) % 10)); + mCursorForwardString[FW_BACK_OFFSET + 0] = (CHAR16)('0' + ((Column - Mode->CursorColumn) / 100)); + mCursorForwardString[FW_BACK_OFFSET + 1] = (CHAR16)('0' + (((Column - Mode->CursorColumn) % 100) / 10)); + mCursorForwardString[FW_BACK_OFFSET + 2] = (CHAR16)('0' + ((Column - Mode->CursorColumn) % 10)); String = mCursorForwardString; } else { String = L""; // No cursor motion necessary } } else { - mSetCursorPositionString[ROW_OFFSET + 0] = (CHAR16)('0' + ((Row + 1) / 10)); - mSetCursorPositionString[ROW_OFFSET + 1] = (CHAR16)('0' + ((Row + 1) % 10)); - mSetCursorPositionString[COLUMN_OFFSET + 0] = (CHAR16)('0' + ((Column + 1) / 10)); - mSetCursorPositionString[COLUMN_OFFSET + 1] = (CHAR16)('0' + ((Column + 1) % 10)); + mSetCursorPositionString[ROW_OFFSET + 0] = (CHAR16)('0' + ((Row + 1) / 100)); + mSetCursorPositionString[ROW_OFFSET + 1] = (CHAR16)('0' + (((Row + 1) % 100) / 10)); + mSetCursorPositionString[ROW_OFFSET + 2] = (CHAR16)('0' + ((Row + 1) % 10)); + mSetCursorPositionString[COLUMN_OFFSET + 0] = (CHAR16)('0' + ((Column + 1) / 100)); + mSetCursorPositionString[COLUMN_OFFSET + 1] = (CHAR16)('0' + (((Column + 1) % 100) / 10)); + mSetCursorPositionString[COLUMN_OFFSET + 2] = (CHAR16)('0' + ((Column + 1) % 10)); String = mSetCursorPositionString; } From fa92e9bd05816aace0f087d58413d69ddf540e2d Mon Sep 17 00:00:00 2001 From: Yang Gang Date: Wed, 2 Jul 2025 14:19:31 +0800 Subject: [PATCH 0406/1172] MdeModulePkg UsbMouseDxe: Correct some parameter comments Signed-off-by: Yang Gang --- MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouse.c | 2 +- MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouse.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouse.c b/MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouse.c index 451d4b934f4c..13c5b2234ddf 100644 --- a/MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouse.c +++ b/MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouse.c @@ -732,7 +732,7 @@ InitializeUsbMouseDevice ( @param Data A pointer to a buffer that is filled with key data which is retrieved via asynchronous interrupt transfer. @param DataLength Indicates the size of the data buffer. - @param Context Pointing to USB_KB_DEV instance. + @param Context Pointing to USB_MOUSE_DEV instance. @param Result Indicates the result of the asynchronous interrupt transfer. @retval EFI_SUCCESS Asynchronous interrupt transfer is handled successfully. diff --git a/MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouse.h b/MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouse.h index 3ddd765c4599..6766831df4f0 100644 --- a/MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouse.h +++ b/MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouse.h @@ -402,7 +402,7 @@ InitializeUsbMouseDevice ( @param Data A pointer to a buffer that is filled with key data which is retrieved via asynchronous interrupt transfer. @param DataLength Indicates the size of the data buffer. - @param Context Pointing to USB_KB_DEV instance. + @param Context Pointing to USB_MOUSE_DEV instance. @param Result Indicates the result of the asynchronous interrupt transfer. @retval EFI_SUCCESS Asynchronous interrupt transfer is handled successfully. From 77293f47116764abc7734bcef7dba69a9b83b696 Mon Sep 17 00:00:00 2001 From: Yang Gang Date: Wed, 2 Jul 2025 14:24:47 +0800 Subject: [PATCH 0407/1172] MdePkg: Correct comments for ResolutionY and ResolutionZ in SimplePointer.h Signed-off-by: Yang Gang --- MdePkg/Include/Protocol/SimplePointer.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MdePkg/Include/Protocol/SimplePointer.h b/MdePkg/Include/Protocol/SimplePointer.h index f8d45a6bc201..313119f50afd 100644 --- a/MdePkg/Include/Protocol/SimplePointer.h +++ b/MdePkg/Include/Protocol/SimplePointer.h @@ -54,12 +54,12 @@ typedef struct { UINT64 ResolutionX; /// /// The resolution of the pointer device on the y-axis in counts/mm. - /// If 0, then the pointer device does not support an x-axis. + /// If 0, then the pointer device does not support a y-axis. /// UINT64 ResolutionY; /// /// The resolution of the pointer device on the z-axis in counts/mm. - /// If 0, then the pointer device does not support an x-axis. + /// If 0, then the pointer device does not support a z-axis. /// UINT64 ResolutionZ; /// From 2efffed93811a7c5d0e6d7d19f8ff112128ffd6a Mon Sep 17 00:00:00 2001 From: Adriano Cordova Date: Tue, 22 Apr 2025 15:09:37 -0400 Subject: [PATCH 0408/1172] MdePkg/Library/BaseRngLib/Riscv: use CPU RNG instructions only Generate random number using risc-v CPU RNG instructions only, as for the other architectures. This is safer than using Mersenne Twister from a seed, which is the current implementation, as the latter is known to be cryptographically unsafe (e.g. see https://www.schutzwerk.com/en/blog/attacking-a-rng/) Signed-off-by: Adriano Cordova --- MdePkg/Library/BaseRngLib/Riscv/Rng.c | 95 +-------------------------- 1 file changed, 3 insertions(+), 92 deletions(-) diff --git a/MdePkg/Library/BaseRngLib/Riscv/Rng.c b/MdePkg/Library/BaseRngLib/Riscv/Rng.c index 6a9b2ce9649a..35b792f1f820 100644 --- a/MdePkg/Library/BaseRngLib/Riscv/Rng.c +++ b/MdePkg/Library/BaseRngLib/Riscv/Rng.c @@ -19,75 +19,7 @@ #define SEED_RETRY_LOOPS 100 -// 64-bit Mersenne Twister implementation -// A widely used pseudo random number generator. It performs bit shifts etc to -// achieve the random number. It's output is determined by SEED value generated -// by RISC-V SEED CSR" - -#define STATE_SIZE 312 -#define MIDDLE 156 -#define INIT_SHIFT 62 -#define TWIST_MASK 0xb5026f5aa96619e9ULL -#define INIT_FACT 6364136223846793005ULL -#define SHIFT1 29 -#define MASK1 0x5555555555555555ULL -#define SHIFT2 17 -#define MASK2 0x71d67fffeda60000ULL -#define SHIFT3 37 -#define MASK3 0xfff7eee000000000ULL -#define SHIFT4 43 - -#define LOWER_MASK 0x7fffffff -#define UPPER_MASK (~(UINT64)LOWER_MASK) - -static UINT64 mState[STATE_SIZE]; -static UINTN mIndex = STATE_SIZE + 1; - -/** - Initialize mState to defualt state. - - @param[in] S Input seed value - **/ -STATIC -VOID -SeedRng ( - IN UINT64 S - ) -{ - UINTN I; - - mIndex = STATE_SIZE; - mState[0] = S; - - for (I = 1; I < STATE_SIZE; I++) { - mState[I] = (INIT_FACT * (mState[I - 1] ^ (mState[I - 1] >> INIT_SHIFT))) + I; - } -} - -/** - Initializes mState with entropy values. The initialization is based on the - Seed value populated in mState[0] which then influences all the other values - in the mState array. Later values are retrieved from the same array instead - of calling trng instruction every time. - - **/ -STATIC -VOID -TwistRng ( - VOID - ) -{ - UINTN I; - UINT64 X; - - for (I = 0; I < STATE_SIZE; I++) { - X = (mState[I] & UPPER_MASK) | (mState[(I + 1) % STATE_SIZE] & LOWER_MASK); - X = (X >> 1) ^ (X & 1 ? TWIST_MASK : 0); - mState[I] = mState[(I + MIDDLE) % STATE_SIZE] ^ X; - } - - mIndex = 0; -} +// 64-bit CPU-based RNG using risc-v Zkr instruction // Defined in Seed.S extern UINT64 @@ -164,14 +96,7 @@ BaseRngLibConstructor ( VOID ) { - UINT64 Seed; - - if (Get64BitSeed (&Seed)) { - SeedRng (Seed); - return EFI_SUCCESS; - } else { - return EFI_UNSUPPORTED; - } + return EFI_SUCCESS; } /** @@ -241,24 +166,10 @@ ArchGetRandomNumber64 ( { UINT64 Y; - // Never initialized. - if (mIndex > STATE_SIZE) { + if (!Get64BitSeed (&Y)) { return FALSE; } - // Mersenne Twister - if (mIndex == STATE_SIZE) { - TwistRng (); - } - - Y = mState[mIndex]; - Y ^= (Y >> SHIFT1) & MASK1; - Y ^= (Y << SHIFT2) & MASK2; - Y ^= (Y << SHIFT3) & MASK3; - Y ^= Y >> SHIFT4; - - mIndex++; - *Rand = Y; return TRUE; } From 397479d74880f3eb180b3b58843ca667f7a56a4c Mon Sep 17 00:00:00 2001 From: Ning Feng Date: Sun, 31 Aug 2025 22:12:14 -0400 Subject: [PATCH 0409/1172] MdePkg/IndustryStandard: Add MRDIMM into Smbios.h Added the MRDIMM (0x08) entry to the MemoryDeviceMemoryTechnologyTable in Smbios.h. This enables proper display and decoding of MRDIMM memory technology in SMBIOS Type 17 structures. Signed-off-by: Ning Feng --- MdePkg/Include/IndustryStandard/SmBios.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/MdePkg/Include/IndustryStandard/SmBios.h b/MdePkg/Include/IndustryStandard/SmBios.h index 490ec43ca1ee..ce0a8e3e7327 100644 --- a/MdePkg/Include/IndustryStandard/SmBios.h +++ b/MdePkg/Include/IndustryStandard/SmBios.h @@ -1905,7 +1905,8 @@ typedef enum { MemoryTypeHBM2 = 0x21, MemoryTypeDdr5 = 0x22, MemoryTypeLpddr5 = 0x23, - MemoryTypeHBM3 = 0x24 + MemoryTypeHBM3 = 0x24, + MemoryTypeMrDimm = 0x25 } MEMORY_DEVICE_TYPE; /// @@ -1944,7 +1945,8 @@ typedef enum { // This definition is updated to represent Intel // Optane DC Persistent Memory in SMBIOS spec 3.4.0 // - MemoryTechnologyIntelOptanePersistentMemory = 0x07 + MemoryTechnologyIntelOptanePersistentMemory = 0x07, + MemoryTechnologyMrDimmDeprecated = 0x08 } MEMORY_DEVICE_TECHNOLOGY; /// From f718b0ffd625d23266af881c51abe09c05d5a708 Mon Sep 17 00:00:00 2001 From: Ning Feng Date: Fri, 29 Aug 2025 01:38:44 -0400 Subject: [PATCH 0410/1172] ShellPkg/UefiShellDebug1CommandsLib: Add MRDIMM entry to QueryTable Added the MRDIMM (0x08) entry to the MemoryDeviceMemoryTechnologyTable in QueryTable.c. This enables proper display and decoding of MRDIMM memory technology in SMBIOS Type 17 structures. Signed-off-by: Ning Feng --- .../SmbiosView/QueryTable.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c index 30f4846c2f8e..b8c685245eb8 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c @@ -2883,6 +2883,14 @@ TABLE_ITEM MemoryDeviceTypeTable[] = { { MemoryTypeLpddr5, L" LPDDR5" + }, + { + MemoryTypeHBM3, + L" HBM3 (High Bandwidth Memory Generation 3)" + }, + { + MemoryTypeMrDimm, + L" MRDIMM (Multi-Channel RDIMM)" } }; @@ -2973,6 +2981,10 @@ TABLE_ITEM MemoryDeviceMemoryTechnologyTable[] = { { MemoryTechnologyIntelOptanePersistentMemory, L" Intel Optane Persistent Memory" + }, + { + MemoryTechnologyMrDimmDeprecated, + L" MRDIMM" } }; From fcbf985673c3efd17e849d731d156995fdf33bad Mon Sep 17 00:00:00 2001 From: Vishal Oliyil Kunnil Date: Tue, 2 Sep 2025 17:36:00 -0700 Subject: [PATCH 0411/1172] MdePkg/ArmFfaMemMgmtLib: Fix typo in structure definition and comments Fix typo in FFA_ENDPOINT_MEMORY_ACCESS_DESCRIPTOR member and comments. Signed-off-by: Vishal Oliyil Kunnil --- MdePkg/Include/IndustryStandard/ArmFfaMemMgmt.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MdePkg/Include/IndustryStandard/ArmFfaMemMgmt.h b/MdePkg/Include/IndustryStandard/ArmFfaMemMgmt.h index 4f9d7c15b4ec..979bf16585e8 100644 --- a/MdePkg/Include/IndustryStandard/ArmFfaMemMgmt.h +++ b/MdePkg/Include/IndustryStandard/ArmFfaMemMgmt.h @@ -1,5 +1,5 @@ /** @file - Memory management protocol definitions as specfied in the FF-A Memory Management + Memory management protocol definitions as specified in the FF-A Memory Management v1.3 APL1 specification. Copyright 2021 The Hafnium Authors. @@ -30,7 +30,7 @@ #define FFA_DATA_ACCESS_RESERVED 3 /** - Intruction access attributes in a memory access permission descriptor. + Instruction access attributes in a memory access permission descriptor. This corresponds to table 1.15 of the FF-A Memory Management v1.3 APL1, "Memory access permissions descriptor", bits[3:2]. @@ -210,7 +210,7 @@ typedef struct { an `FFA_COMPOSITE_MEMORY_REGION` struct. **/ UINT32 CompositeMemoryRegionOffset; - UINT8 ImpementationDefined[16]; + UINT8 ImplementationDefined[16]; UINT64 Reserved; } FFA_ENDPOINT_MEMORY_ACCESS_DESCRIPTOR; From a80a53ccf2b0ec2a71d86608c2780941efdfbec7 Mon Sep 17 00:00:00 2001 From: Qihang Gao Date: Tue, 2 Sep 2025 16:12:07 +0800 Subject: [PATCH 0412/1172] MdeModulePkg/UiApp: Remove unused variable Since the variable mLanguageString is not used at all, remove it to make code clean. Signed-off-by: Qihang Gao --- MdeModulePkg/Application/UiApp/FrontPage.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/MdeModulePkg/Application/UiApp/FrontPage.c b/MdeModulePkg/Application/UiApp/FrontPage.c index 0e784fb327f5..56e174fe562f 100644 --- a/MdeModulePkg/Application/UiApp/FrontPage.c +++ b/MdeModulePkg/Application/UiApp/FrontPage.c @@ -17,7 +17,6 @@ EFI_GUID mFrontPageGuid = FRONT_PAGE_FORMSET_GUID; BOOLEAN mResetRequired = FALSE; EFI_FORM_BROWSER2_PROTOCOL *gFormBrowser2; -CHAR8 *mLanguageString; BOOLEAN mModeInitialized = FALSE; // // Boot video resolution and text mode. @@ -1032,11 +1031,6 @@ UiEntry ( FreeFrontPage (); - if (mLanguageString != NULL) { - FreePool (mLanguageString); - mLanguageString = NULL; - } - // // Will leave browser, check any reset required change is applied? if yes, reset system // From 1bbd68755c9dec61662e27b30ef71a45a33331f2 Mon Sep 17 00:00:00 2001 From: Gao Qihang Date: Thu, 28 Aug 2025 15:06:49 +0800 Subject: [PATCH 0413/1172] BaseTools: Update architectures in target.template - Remove IPF since it's no longer supported in edk2. - Rename AArch64 to AARCH64 for greater accuracy. - Add newly supported RISCV64 and LOONGARCH64. Cc: Chao Li Signed-off-by: Gao Qihang --- BaseTools/Conf/target.template | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BaseTools/Conf/target.template b/BaseTools/Conf/target.template index 29c38142aac8..aa78132e0bb6 100644 --- a/BaseTools/Conf/target.template +++ b/BaseTools/Conf/target.template @@ -28,8 +28,8 @@ ACTIVE_PLATFORM = EmulatorPkg/EmulatorPkg.dsc TARGET = DEBUG # TARGET_ARCH List Optional What kind of architecture is the binary being target for. -# One, or more, of the following, IA32, IPF, X64, EBC, ARM -# or AArch64. +# One, or more, of the following, IA32, X64, EBC, ARM, AARCH64, +# RISCV64 or LOONGARCH64. # Multiple values can be specified on a single line, using # space characters to separate the values. These are used # during the parsing of a platform description file, From 4e41744142c73f4f6f04ef73b86e5967ab53b8ff Mon Sep 17 00:00:00 2001 From: Hunter Chang Date: Mon, 4 Aug 2025 12:14:44 +0800 Subject: [PATCH 0414/1172] MdePkg/Nvme.h: Add Power Loss Signaling defination Add Nvme 2.1 spec update, specifically for Power Loss Signaling. 1. Update field in Identify Controller Data for Power Loss Signaling Information. 2. Add Power Loss Signaling Mode defination. 3. Add Power Loss Signaling feature identifer defination. Signed-off-by: Hunter Chang --- MdePkg/Include/IndustryStandard/Nvme.h | 37 +++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/MdePkg/Include/IndustryStandard/Nvme.h b/MdePkg/Include/IndustryStandard/Nvme.h index ffb8b843148b..de9e7ae0c430 100644 --- a/MdePkg/Include/IndustryStandard/Nvme.h +++ b/MdePkg/Include/IndustryStandard/Nvme.h @@ -1,5 +1,5 @@ /** @file - Definitions based on NVMe spec. version 2.0c. + Definitions based on NVMe spec. version 2.1. (C) Copyright 2016 Hewlett Packard Enterprise Development LP
Copyright (c) 2017 - 2023, Intel Corporation. All rights reserved.
@@ -11,6 +11,7 @@ NVMe Specification 1.4 NVMe Specification 2.0 NVMe Specification 2.0c + NVMe Specification 2.1 **/ @@ -367,6 +368,13 @@ typedef struct { UINT32 Nodmmas : 2; /* No-Deallocate Modifies Media After Sanitize */ } NVME_SANICAP; +// +// Power Loss Signaling Information +// (ref. spec. v2.1 Figure 312). +// +#define PLS_EMERGENCY_POWER_FAIL BIT0 +#define PLS_FORCED_QUIESCENCE BIT1 + // // Identify Controller Data // @@ -391,7 +399,8 @@ typedef struct { UINT32 Oaes; /* Optional Async Events Supported */ UINT32 Ctratt; /* Controller Attributes */ UINT16 Rrls; /* Read Recovery Levels Supported */ - UINT8 Rsvd1[9]; /* Reserved as of NVM Express 1.4c Spec */ + UINT8 Rsvd1[8]; /* Reserved as of NVM Express 1.4c Spec */ + UINT8 Plsi; /* Power Loss Signaling Information */ UINT8 Cntrltype; /* Controller Type */ UINT8 Fguid[16]; /* FRU Globally Unique Identifier */ UINT16 Crdt1; /* Command Retry Delay Time 1 */ @@ -750,6 +759,12 @@ typedef struct { UINT32 Sv : 1; /* Save */ } NVME_ADMIN_SET_FEATURES; +// +// Feature Identifier +// (ref. spec. v2.1 Figure 32). +// +#define POWER_LOSS_SIGNALING_CONFIG_FID 0x1B // Power Loss Signaling Config + // // NvmExpress Admin Sanitize Command // @@ -1183,7 +1198,7 @@ typedef struct { // UINT32 BlockEraseEstimatedTimeWithNodmm; // - // Indicates the number of seconds required to complete a Crypto Erase sanitize operation and the associated additional media modification after the Crypto Erase sanitize operation in the background. + // Indicates the number of seconds required to complete a Crypto Erase sanitize operation and the associated additional media modification after the Crypto Erase sanitize operation in the background. // The No-Deallocate After Sanitize bit was set to ?1? in the Sanitize command that requested the Crypto Erase sanitize operation. // The No-Deallocate Modifies Media After Sanitize field is set to 10b. // @@ -1191,6 +1206,22 @@ typedef struct { UINT8 Reserved[480]; } NVME_SANITIZE_STATUS_INFO_LOG; +// +// Power Loss Signaling Config +// (ref. spec. v2.1 Figure 414). +// +#define PLS_NOT_ENABLED 0x0 // Power Loss Signaling Not Enabled +#define PLS_EMERGENCY_POWER_FAIL_ENABLED 0x1 // Power Loss Signaling with Emergency Power Fail Enabled +#define PLS_FORCED_QUIESCENCE_ENABLED 0x2 // Power Loss Signaling with Forced Quiescence Enabled + +typedef struct { + // + // Indicates the Power Loss Signaling mode of operation + // + UINT32 Plsm : 2; /* Power Loss Signaling Mode */ + UINT32 Reserved : 30; +} NVME_POWER_LOSS_SIGNALING_CONFIG; + #pragma pack() #endif From 41cde6e2e313382f6ec4078577ad3dfbbd0c743c Mon Sep 17 00:00:00 2001 From: "INDIA\\kanagavels" Date: Wed, 9 Jul 2025 14:45:46 +0530 Subject: [PATCH 0415/1172] NetworkPkg/TlsDxe: Add SNI support Add Server Name Indication Support. Signed-off-by: Kanagavel S --- NetworkPkg/TlsDxe/TlsProtocol.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NetworkPkg/TlsDxe/TlsProtocol.c b/NetworkPkg/TlsDxe/TlsProtocol.c index b22ed900ba4c..ab9d10704b21 100644 --- a/NetworkPkg/TlsDxe/TlsProtocol.c +++ b/NetworkPkg/TlsDxe/TlsProtocol.c @@ -187,7 +187,11 @@ TlsSetSessionData ( } Status = TlsSetVerifyHost (Instance->TlsConn, TlsVerifyHost->Flags, TlsVerifyHost->HostName); + if (EFI_ERROR (Status)) { + goto ON_EXIT; + } + Status = TlsSetServerName (Instance->TlsConn, Instance->Service->TlsCtx, TlsVerifyHost->HostName); break; case EfiTlsSessionID: if (DataSize != sizeof (EFI_TLS_SESSION_ID)) { From 1dacf4c40825e184f08be4d3041dc9e2be4d3c5c Mon Sep 17 00:00:00 2001 From: "INDIA\\kanagavels" Date: Wed, 9 Jul 2025 16:34:36 +0530 Subject: [PATCH 0416/1172] CryptoPkg: Add SNI support Add Server Name Indication support. Signed-off-by: Kanagavel S --- CryptoPkg/Driver/Crypto.c | 23 ++++++ CryptoPkg/Include/Library/TlsLib.h | 17 ++++ .../Pcd/PcdCryptoServiceFamilyEnable.h | 1 + .../BaseCryptLibOnProtocolPpi/CryptLib.c | 21 +++++ CryptoPkg/Library/TlsLib/InternalTlsLib.h | 6 ++ CryptoPkg/Library/TlsLib/TlsConfig.c | 79 +++++++++++++++++++ CryptoPkg/Library/TlsLibNull/TlsConfigNull.c | 22 ++++++ CryptoPkg/Private/Protocol/Crypto.h | 22 +++++- 8 files changed, 190 insertions(+), 1 deletion(-) diff --git a/CryptoPkg/Driver/Crypto.c b/CryptoPkg/Driver/Crypto.c index 201ed8cbbf16..e2c49f1399d1 100644 --- a/CryptoPkg/Driver/Crypto.c +++ b/CryptoPkg/Driver/Crypto.c @@ -5103,6 +5103,27 @@ CryptoServiceTlsSetCertRevocationList ( return CALL_BASECRYPTLIB (TlsSet.Services.CertRevocationList, TlsSetCertRevocationList, (Data, DataSize), EFI_UNSUPPORTED); } +/** + Set the specified server name in Server/Client. + + @param[in] Tls Pointer to the TLS object. + @param[in] SslCtx Pointer to the SSL object. + @param[in] HostName The specified server name to be set. + + @retval EFI_SUCCESS The Server Name was set successfully. + @retval EFI_UNSUPPORTED Failed to set the Server Name. +**/ +EFI_STATUS +EFIAPI +CryptoServiceTlsSetServerName ( + VOID *Tls, + VOID *SslCtx, + CHAR8 *HostName + ) +{ + return CALL_BASECRYPTLIB (TlsSet.Services.ServerName, TlsSetServerName, (Tls, SslCtx, HostName), EFI_UNSUPPORTED); +} + /** Set the signature algorithm list to used by the TLS object. @@ -7116,4 +7137,6 @@ const EDKII_CRYPTO_PROTOCOL mEdkiiCrypto = { CryptoServicePkcs1v2Decrypt, CryptoServiceRsaOaepEncrypt, CryptoServiceRsaOaepDecrypt, + /// TLS Set (continued) + CryptoServiceTlsSetServerName, }; diff --git a/CryptoPkg/Include/Library/TlsLib.h b/CryptoPkg/Include/Library/TlsLib.h index d37c5fcc35b1..fab9b5bcdc20 100644 --- a/CryptoPkg/Include/Library/TlsLib.h +++ b/CryptoPkg/Include/Library/TlsLib.h @@ -435,6 +435,23 @@ TlsSetVerifyHost ( IN CHAR8 *HostName ); +/** + Set the specified server name to be verified. + + @param[in] Tls Pointer to the TLS object. + @param[in] SslCtx Pointer to the SSL object. + @param[in] HostName The specified server name to be set. + + @retval EFI_SUCCESS The Server Name was set successfully. +**/ +EFI_STATUS +EFIAPI +TlsSetServerName ( + VOID *Tls, + VOID *SslCtx, + CHAR8 *HostName + ); + /** Sets a TLS/SSL session ID to be used during TLS/SSL connect. diff --git a/CryptoPkg/Include/Pcd/PcdCryptoServiceFamilyEnable.h b/CryptoPkg/Include/Pcd/PcdCryptoServiceFamilyEnable.h index 7b3741381c06..ad6a608131f5 100644 --- a/CryptoPkg/Include/Pcd/PcdCryptoServiceFamilyEnable.h +++ b/CryptoPkg/Include/Pcd/PcdCryptoServiceFamilyEnable.h @@ -327,6 +327,7 @@ typedef struct { UINT8 HostPrivateKeyEx : 1; UINT8 SignatureAlgoList : 1; UINT8 EcCurve : 1; + UINT8 ServerName : 1; } Services; UINT32 Family; } TlsSet; diff --git a/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/CryptLib.c b/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/CryptLib.c index e51f178d9fe3..28d60614e44c 100644 --- a/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/CryptLib.c +++ b/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/CryptLib.c @@ -4165,6 +4165,27 @@ TlsSetVerifyHost ( CALL_CRYPTO_SERVICE (TlsSetVerifyHost, (Tls, Flags, HostName), EFI_UNSUPPORTED); } +/** + Set the specified server name in Server/Client. + + @param[in] Tls Pointer to the TLS object. + @param[in] SslCtx Pointer to the SSL object. + @param[in] HostName The specified server name to be set. + + @retval EFI_SUCCESS The Server Name was set successfully. + @retval EFI_UNSUPPORTED Failed to set the Server Name. +**/ +EFI_STATUS +EFIAPI +TlsSetServerName ( + VOID *Tls, + VOID *SslCtx, + CHAR8 *HostName + ) +{ + CALL_CRYPTO_SERVICE (TlsSetServerName, (Tls, SslCtx, HostName), EFI_UNSUPPORTED); +} + /** Sets a TLS/SSL session ID to be used during TLS/SSL connect. diff --git a/CryptoPkg/Library/TlsLib/InternalTlsLib.h b/CryptoPkg/Library/TlsLib/InternalTlsLib.h index 97a46af6c1c7..aca226b5de7d 100644 --- a/CryptoPkg/Library/TlsLib/InternalTlsLib.h +++ b/CryptoPkg/Library/TlsLib/InternalTlsLib.h @@ -41,4 +41,10 @@ typedef struct { BIO *OutBio; } TLS_CONNECTION; +/* This is a context that we pass to callbacks */ +typedef struct { + BIO *BioDebug; + INT32 Ack; +} TLS_EXT_CTX; + #endif diff --git a/CryptoPkg/Library/TlsLib/TlsConfig.c b/CryptoPkg/Library/TlsLib/TlsConfig.c index afbc583dafb1..ac1fe46070cc 100644 --- a/CryptoPkg/Library/TlsLib/TlsConfig.c +++ b/CryptoPkg/Library/TlsLib/TlsConfig.c @@ -552,6 +552,85 @@ TlsSetVerifyHost ( return (ParamStatus == 1) ? EFI_SUCCESS : EFI_ABORTED; } +/** + Callback function to get the server name. + + @param[in] SSL + @param[in] INT32 + @param[in] Arg + + @retval INT32 +**/ +STATIC +INT32 +SslServerNameCallback ( + SSL *Ssl, + INT32 *Ad, + VOID *Arg + ) +{ + const CHAR8 *HostName = NULL; + TLS_EXT_CTX *TlsCtx = (TLS_EXT_CTX *)Arg; + + HostName = SSL_get_servername (Ssl, TLSEXT_NAMETYPE_host_name); + + if (SSL_get_servername_type (Ssl) != -1) { + TlsCtx->Ack = !SSL_session_reused (Ssl) && HostName != NULL; + } + + return SSL_TLSEXT_ERR_OK; +} + +/** + Set the specified server name in Server/Client. + + @param[in] Tls Pointer to the TLS object. + @param[in] SslCtx Pointer to the SSL object. + @param[in] HostName The specified server name to be set. + + @retval EFI_SUCCESS The Server Name was set successfully. + @retval EFI_UNSUPPORTED Failed to set the Server Name. +**/ +EFI_STATUS +EFIAPI +TlsSetServerName ( + VOID *Tls, + VOID *SslCtx, + CHAR8 *HostName + ) +{ + SSL_CTX *Ctx; + TLS_CONNECTION *TlsConn; + UINT32 RetVal; + TLS_EXT_CTX *TlsExtCtx = NULL; + + TlsConn = (TLS_CONNECTION *)Tls; + Ctx = (SSL_CTX *)SslCtx; + + TlsExtCtx = AllocateZeroPool (sizeof (TLS_EXT_CTX)); + if (TlsExtCtx == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + RetVal = SSL_CTX_set_tlsext_servername_callback (Ctx, SslServerNameCallback); + if (!RetVal) { + return EFI_UNSUPPORTED; + } + + RetVal = SSL_CTX_set_tlsext_servername_arg (Ctx, TlsExtCtx); + if (!RetVal) { + return EFI_UNSUPPORTED; + } + + RetVal = SSL_set_tlsext_host_name (TlsConn->Ssl, HostName); + + if (!RetVal) { + return EFI_UNSUPPORTED; + } + + return EFI_SUCCESS; +} + /** Sets a TLS/SSL session ID to be used during TLS/SSL connect. diff --git a/CryptoPkg/Library/TlsLibNull/TlsConfigNull.c b/CryptoPkg/Library/TlsLibNull/TlsConfigNull.c index 18dd60438260..cbf5ee7f4fae 100644 --- a/CryptoPkg/Library/TlsLibNull/TlsConfigNull.c +++ b/CryptoPkg/Library/TlsLibNull/TlsConfigNull.c @@ -323,6 +323,28 @@ TlsSetCertRevocationList ( return EFI_UNSUPPORTED; } +/** + Set the specified server name in Server/Client. + + @param[in] Tls Pointer to the TLS object. + @param[in] SslCtx Pointer to the SSL object. + @param[in] HostName The specified server name to be set. + + @retval EFI_SUCCESS The Server Name was set successfully. + @retval EFI_UNSUPPORTED Failed to set the Server Name. +**/ +EFI_STATUS +EFIAPI +TlsSetServerName ( + IN VOID *Tls, + IN VOID *SslCtx, + IN CHAR8 *HostName + ) +{ + ASSERT (FALSE); + return EFI_UNSUPPORTED; +} + /** Set the signature algorithm list to used by the TLS object. diff --git a/CryptoPkg/Private/Protocol/Crypto.h b/CryptoPkg/Private/Protocol/Crypto.h index 4d91fb795e83..b3a55537e65f 100644 --- a/CryptoPkg/Private/Protocol/Crypto.h +++ b/CryptoPkg/Private/Protocol/Crypto.h @@ -21,7 +21,7 @@ /// the EDK II Crypto Protocol is extended, this version define must be /// increased. /// -#define EDKII_CRYPTO_VERSION 17 +#define EDKII_CRYPTO_VERSION 18 /// /// EDK II Crypto Protocol forward declaration @@ -3951,6 +3951,24 @@ EFI_STATUS IN UINTN DataSize ); +/** + Set the specified server name in Server/Client. + + @param[in] Tls Pointer to the TLS object. + @param[in] SslCtx Pointer to the SSL object. + @param[in] HostName The specified server name to be set. + + @retval EFI_SUCCESS The Server Name was set successfully. + @retval EFI_UNSUPPORTED Failed to set the Server Name. +**/ +typedef +EFI_STATUS +(EFIAPI *EDKII_CRYPTO_TLS_SET_SERVER_NAME)( + IN VOID *Tls, + IN VOID *SslCtx, + IN CHAR8 *HostName + ); + /** Gets the protocol version used by the specified TLS connection. @@ -5710,6 +5728,8 @@ struct _EDKII_CRYPTO_PROTOCOL { EDKII_CRYPTO_PKCS1V2_DECRYPT Pkcs1v2Decrypt; EDKII_CRYPTO_RSA_OAEP_ENCRYPT RsaOaepEncrypt; EDKII_CRYPTO_RSA_OAEP_DECRYPT RsaOaepDecrypt; + /// TLS Set (continued) + EDKII_CRYPTO_TLS_SET_SERVER_NAME TlsSetServerName; }; extern GUID gEdkiiCryptoProtocolGuid; From 65485e195f37653bbbc06db2001c3a189d468666 Mon Sep 17 00:00:00 2001 From: Phil Noh Date: Tue, 2 Sep 2025 12:25:13 -0500 Subject: [PATCH 0417/1172] UefiCpuPkg/MpInitLib: Ensure AP wake up on WakeUpByInitSipiSipi mode If AP loop mode is not Halt loop, it is found that the AP in ApInitDone state exits the loop mode immediately when WAKEUP_AP_SIGNAL is signaled at the first step of AP wake up. When WakeUpByInitSipiSipi is enabled, it is possible that the AP could clear StartupApSignal buffer before the BSP sends Init-Startup IPI to the AP. In the case, it causes that the BSP frees AP reset vector buffer even though AP wake up is in process. This results in an exception error. To ensure AP wake up, it is expected that the AP is in the known non-executable state before the AP wakeup signal. The issue happens when the AP is disabled through the MP service of gEfiMpServiceProtocolGuid->EnableDisableAP(FALSE) and enabled later through gEfiMpServiceProtocolGuid->EnableDisableAP(TRUE). In the flow, the AP that in MINOTOR-MWAIT-Loop or Run-Loop can respond to the WAKEUP_AP_SIGNAL before the BSP sends the INIT-SIPI-SIPI. Signed-off-by: Phil Noh --- UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf | 2 ++ UefiCpuPkg/Library/MpInitLib/MpLib.c | 18 ++++++++++++++++-- UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf | 2 ++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf b/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf index 922c7b12d3c9..ab2f1ade0c0a 100644 --- a/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf +++ b/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf @@ -3,6 +3,7 @@ # # Copyright (c) 2016 - 2023, Intel Corporation. All rights reserved.
# Copyright (c) 2024, Loongson Technology Corporation Limited. All rights reserved.
+# Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent # ## @@ -100,3 +101,4 @@ gUefiCpuPkgTokenSpaceGuid.PcdGhcbHypervisorFeatures ## CONSUMES gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase ## SOMETIMES_CONSUMES gUefiCpuPkgTokenSpaceGuid.PcdFirstTimeWakeUpAPsBySipi ## CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdCpuInitIpiDelayInMicroSeconds ## SOMETIMES_CONSUMES diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c index 63b846445de2..2cf91bff690b 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -2,7 +2,7 @@ CPU MP Initialize Library common functions. Copyright (c) 2016 - 2024, Intel Corporation. All rights reserved.
- Copyright (c) 2020 - 2024, AMD Inc. All rights reserved.
+ Copyright (C) 2020 - 2025 Advanced Micro Devices, Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -1663,12 +1663,26 @@ ResetProcessorToIdleState ( CpuMpData = GetCpuMpData (); - CpuMpData->WakeUpByInitSipiSipi = TRUE; if (CpuMpData == NULL) { DEBUG ((DEBUG_ERROR, "[%a] - Failed to get CpuMpData. Aborting the AP reset to idle.\n", __func__)); return; } + CpuMpData->WakeUpByInitSipiSipi = TRUE; + + // + // "CpuMpData->WakeUpByInitSipiSipi = TRUE" requires that the AP must be in Halt loop. + // If AP loop mode is not Halt loop, make sure that the AP is in the known non-executable state. + // + // AP could be in MONITOR/MWAIT state that could wake up the AP when setting WAKEUP_AP_SIGNAL in WakeUpAp(). + // And then SendInitSipiSipi() in WakeupAp() could wake up the AP again to run the AP Wakeup vector. + // But the AP wakeup vector could be freed by the BSP while the AP is running it. + // + if (CpuMpData->ApLoopMode != ApInHltLoop) { + SendInitIpi (((CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob)[ProcessorNumber].ApicId); + MicroSecondDelay (PcdGet32 (PcdCpuInitIpiDelayInMicroSeconds)); + } + WakeUpAP (CpuMpData, FALSE, ProcessorNumber, NULL, NULL, TRUE); while (CpuMpData->FinishedCount < 1) { CpuPause (); diff --git a/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf b/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf index d1e8312c021a..cbef1e8b9c54 100644 --- a/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf +++ b/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf @@ -3,6 +3,7 @@ # # Copyright (c) 2016 - 2024, Intel Corporation. All rights reserved.
# Copyright (c) 2024, Loongson Technology Corporation Limited. All rights reserved.
+# Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent # ## @@ -83,6 +84,7 @@ gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase ## SOMETIMES_CONSUMES gUefiCpuPkgTokenSpaceGuid.PcdGhcbHypervisorFeatures ## CONSUMES gUefiCpuPkgTokenSpaceGuid.PcdFirstTimeWakeUpAPsBySipi ## CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdCpuInitIpiDelayInMicroSeconds ## SOMETIMES_CONSUMES [Ppis] gEdkiiPeiShadowMicrocodePpiGuid ## SOMETIMES_CONSUMES From d2501910424569ce8925eae4bdff46ff7d8ad3de Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Tue, 5 Aug 2025 14:09:04 -0700 Subject: [PATCH 0418/1172] BaseTools/PatchCheck.py: Check CI Options Before Parsing PatchCheck.py currently parses the CI options as the last step it does before reporting results. This means that the other checking logic cannot use any of the CI options that are passed in. This updates the order of operations to process CI options before running other checks so that they can be used in performing checks. Signed-off-by: Oliver Smith-Denny --- BaseTools/Scripts/PatchCheck.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BaseTools/Scripts/PatchCheck.py b/BaseTools/Scripts/PatchCheck.py index 5c148409aaee..937348dd2cf5 100755 --- a/BaseTools/Scripts/PatchCheck.py +++ b/BaseTools/Scripts/PatchCheck.py @@ -117,13 +117,13 @@ def __init__(self, subject, message, author_email, updated_packages): self.check_contributed_under() if not MergifyMerge: + self.check_ci_options_format() self.check_subject(updated_packages) self.check_signed_off_by() self.check_misc_signatures() self.check_overall_format() if not PatchCheckConf.ignore_change_id: self.check_change_id_format() - self.check_ci_options_format() self.report_message_result() url = 'https://github.com/tianocore/tianocore.github.io/wiki/Commit-Message-Format' From 6093cfcdd19b242f16c473d0146906984c92d0a5 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Tue, 5 Aug 2025 14:11:33 -0700 Subject: [PATCH 0419/1172] BaseTools: PatchCheck.py: Allow MultiPkg Commits For Subject Check Subject Check was added to PatchCheck.py to enforce that if a package was touched in a commit that it be referenced in the subject line. However, this is impractical for multipackage commits with many packages, e.g. when stack cookies were added, every package was touched, but in a rote way, and it is not reasonable to put every package in a subject line. This updates PatchCheck.py to check if ignore_multi_package is set and if so only require that package names be included in the subject if there are fewer than 3 packages touched. Otherwise, PatchCheck will require the message to start with `Global:` to indicate it touches more than 3 packages. Signed-off-by: Oliver Smith-Denny --- BaseTools/Scripts/PatchCheck.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/BaseTools/Scripts/PatchCheck.py b/BaseTools/Scripts/PatchCheck.py index 937348dd2cf5..0094794de295 100755 --- a/BaseTools/Scripts/PatchCheck.py +++ b/BaseTools/Scripts/PatchCheck.py @@ -212,11 +212,17 @@ def find_signatures(self, sig): def check_subject(self, updated_packages): if updated_packages: + num_found = 0 for package in updated_packages: current_package_re = r"(Revert \"|^|, ?)" + re.escape(package) + r"([ ,:\/])" - if not re.search(current_package_re, self.subject): - self.error("Subject line not in \"package/component: description\" format!") - return + if re.search(current_package_re, self.subject): + num_found += 1 + + if self.ignore_multi_package and len(updated_packages) > 3: + if not re.search(r'^Global:', self.subject): + self.error("Subject line does not start with 'Global:' for > 3 package multi-package commit!") + elif num_found != len(updated_packages): + self.error("Subject line not in \"package,package: description\" format!") def check_signed_off_by(self): sob='Signed-off-by' From 338f5079f77b2fa31ec42293840358d171e62409 Mon Sep 17 00:00:00 2001 From: Chao Li Date: Fri, 5 Sep 2025 17:15:47 +0800 Subject: [PATCH 0420/1172] MdePkg: Enable CompilerIntrinsicsLib for LoongArch When arrays are lager enough, LoongArch compilers(such as GCC or Clang) will replace some libc functions to improve performace, which may cause building failures. Enabling this library can link edk2's own libc functions and fix this problem. Signed-off-by: Chao Li Cc: Michael D Kinney Cc: Liming Gao --- MdePkg/MdeLibs.dsc.inc | 11 +++++++++++ MdePkg/MdePkg.dsc | 1 + 2 files changed, 12 insertions(+) diff --git a/MdePkg/MdeLibs.dsc.inc b/MdePkg/MdeLibs.dsc.inc index 57818e249971..c55979ec67dc 100644 --- a/MdePkg/MdeLibs.dsc.inc +++ b/MdePkg/MdeLibs.dsc.inc @@ -68,3 +68,14 @@ # definitions for the intrinsic functions. # NULL|MdePkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf + +[LibraryClasses.LOONGARCH64] + # + # Some LOONGARCH/LOONGARCH64 compilers may replace memory operations with libc functions to improve performance, + # and there is no way to prevent the LOONGARCH/LOONGARCH64 compilers from inserting generic intrinsics. + # This library provides the intrinsic functions generated by these compilers. + # + # Linking this here as a null library will cause all LOONGARCH/LOONGARCH64 files to link against it and have + # definitions for the intrinsic functions. + # + NULL|MdePkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc index 0509bb6932da..d14a3326784b 100644 --- a/MdePkg/MdePkg.dsc +++ b/MdePkg/MdePkg.dsc @@ -216,5 +216,6 @@ [Components.LOONGARCH64] MdePkg/Library/PeiServicesTablePointerLibKs0/PeiServicesTablePointerLibKs0.inf + MdePkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf [BuildOptions] From c992bffaeff75f050e27613a669f327d36c36cf9 Mon Sep 17 00:00:00 2001 From: Nanjinmoorthyj Date: Wed, 6 Aug 2025 12:07:47 +0530 Subject: [PATCH 0421/1172] ShellPkg: Add support for PCIe Extended IDs Add a support to print PTM (001F) structure. Signed-off-by: Nanjinmoorthy --- .../Library/UefiShellDebug1CommandsLib/Pci.c | 38 +++++++++++++++++++ .../UefiShellDebug1CommandsLib.uni | 5 ++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c index 72b6e8870ed2..991aed320964 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c @@ -7079,6 +7079,42 @@ PrintInterpretedExtendedCompatibilityFlitLogging ( return EFI_SUCCESS; } +/** + Function to interpret and print out the PTM structure + + @param[in] HeaderAddress The Address of this capability header. + @param[in] HeadersBaseAddress The address of all the extended capability headers. +**/ +EFI_STATUS +PrintInterpretedExtendedCompatibilityPTM ( + IN CONST PCI_EXP_EXT_HDR *HeaderAddress, + IN CONST PCI_EXP_EXT_HDR *HeadersBaseAddress + ) +{ + CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_PTM *Header; + + Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_PTM *)HeaderAddress; + + ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_PCI_EXT_CAP_PTM), + gShellDebug1HiiHandle, + Header->Capability.Uint32, + Header->Control.Uint32 + ); + + DumpHex ( + 4, + EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), + sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_PTM), + (VOID *)(HeaderAddress) + ); + + return (EFI_SUCCESS); +} + /** Display Pcie extended capability details @@ -7166,6 +7202,8 @@ PrintPciExtendedCapabilityDetails ( return PrintInterpretedExtendedCompatibilityPhysicalLayer64 (HeaderAddress, HeadersBaseAddress); case PCI_EXPRESS_EXTENDED_CAPABILITY_FLIT_LOGGING_ID: return PrintInterpretedExtendedCompatibilityFlitLogging (HeaderAddress, HeadersBaseAddress); + case PCI_EXPRESS_EXTENDED_CAPABILITY_PTM_ID: + return PrintInterpretedExtendedCompatibilityPTM (HeaderAddress, HeadersBaseAddress); default: ShellPrintEx ( -1, diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni index 211ea7432df8..c42ef64e44e8 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni @@ -446,7 +446,6 @@ #string STR_PCI_EXT_CAP_PASID #language en-US " Process Address Space ID (PASID) Capability\r\n" " PasidCapability %04x\r\n" " PasidControl %04x\r\n" - " PasidMaxValue %08x\r\n" #string STR_PCI_EXT_CAP_L1_PM_SUBSTATES #language en-US " L1 PM Substates Capability\r\n" " L1PmSubstatesCapability %08x\r\n" " L1PmSubstatesControl1 %08x\r\n" @@ -469,7 +468,9 @@ #string STR_PCI_EXT_CAP_DATA_LINK_FEATURE #language en-US " Data Link Feature Capability\r\n" " DataLinkFeatureCapability %08x\r\n" " DataLinkFeatureControl %08x\r\n" - " DataLinkFeatureStatus %08x\r\n" +#string STR_PCI_EXT_CAP_PTM #language en-US " PTM Capability\r\n" + " PTMCapability %08x\r\n" + " PTMControl %08x\r\n" #string STR_PCI_EXT_CAP_PHYSICAL_LAYER_16 #language en-US " Physical Layer 16.0 GT/s Extended Capability\r\n" " Capabilities: %08x\r\n" " Control: %08x\r\n" From 85770fd4536c1be60f897def8d803c06512205be Mon Sep 17 00:00:00 2001 From: Nanjinmoorthyj Date: Wed, 6 Aug 2025 12:13:45 +0530 Subject: [PATCH 0422/1172] MdePkg: Add support for PCIe Extended IDs Add PTM (001F) structure in MdePkg. Signed-off-by: Nanjinmoorthy --- .../Include/IndustryStandard/PciExpress40.h | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/MdePkg/Include/IndustryStandard/PciExpress40.h b/MdePkg/Include/IndustryStandard/PciExpress40.h index a7901fe00701..d28f5e71d03c 100644 --- a/MdePkg/Include/IndustryStandard/PciExpress40.h +++ b/MdePkg/Include/IndustryStandard/PciExpress40.h @@ -16,6 +16,48 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #pragma pack(1) +/// Precision Time Management Extended Capability definitions. +/// +/// Based on section 7.9.16 of PCI Express Base Specification 4.0. +///@{ +#define PCI_EXPRESS_EXTENDED_CAPABILITY_PTM_ID 0x001F +#define PCI_EXPRESS_EXTENDED_CAPABILITY_PTM_VER1 0x1 + +#define PCI_EXPRESS_EXTENDED_CAPABILITIES_PTM_CAPABILITY_OFFSET 0x04 +#define PCI_EXPRESS_EXTENDED_CAPABILITIES_PTM_CONTROL_OFFSET 0x08 + +typedef union { + struct { + UINT32 PTMRequesterCapable : 1; + UINT32 PTMResponderCapable : 1; + UINT32 PTMRootCapable : 1; + UINT32 ePTMCapable : 1; + UINT32 PTMPropagationDelayAdaptationCapable : 1; + UINT32 Reserved : 3; + UINT32 LocalClockGranularity : 8; + UINT32 Reserved2 : 16; + } Bits; + UINT32 Uint32; +} PCI_EXPRESS_EXTENDED_CAPABILITIES_PTM_CAPABILITY; + +typedef union { + struct { + UINT32 PTMEnable : 1; + UINT32 RootSelect : 1; + UINT32 Reserved : 6; + UINT32 EffectiveGranularity : 8; + UINT32 Reserved2 : 16; + } Bits; + UINT32 Uint32; +} PCI_EXPRESS_EXTENDED_CAPABILITIES_PTM_CONTROL; + +typedef struct { + PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER Header; + PCI_EXPRESS_EXTENDED_CAPABILITIES_PTM_CAPABILITY Capability; + PCI_EXPRESS_EXTENDED_CAPABILITIES_PTM_CONTROL Control; +} PCI_EXPRESS_EXTENDED_CAPABILITIES_PTM; +///@} + /// The Physical Layer PCI Express Extended Capability definitions. /// /// Based on section 7.7.5 of PCI Express Base Specification 4.0. From c3cab06d2b4f47d4673cb35c2311623ab0b488f2 Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Thu, 31 Jul 2025 12:24:45 +0530 Subject: [PATCH 0423/1172] ShellPkg/Library: Deprecate EFI_IP4_CONFIG_PROTOCOL EFI_IP4_CONFIG_PROTOCOL is superseded by EFI_IP4_CONFIG2_PROTOCOL, which provides better support for modern network stack requirements. It was officially removed from UEFI specifications 2.10A and 2.11 and should no longer be used in current implementations. Cc: Sachin Ganesh Signed-off-by: Gowtham M --- ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c | 1 - ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h | 1 - ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf | 1 - 3 files changed, 3 deletions(-) diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c index 14f17252e594..3c243c24feb1 100644 --- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c +++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c @@ -2280,7 +2280,6 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = { { STRING_TOKEN (STR_TCPV4), &gEfiTcp4ProtocolGuid, NULL }, { STRING_TOKEN (STR_IPV4_SB), &gEfiIp4ServiceBindingProtocolGuid, NULL }, { STRING_TOKEN (STR_IPV4), &gEfiIp4ProtocolGuid, NULL }, - { STRING_TOKEN (STR_IPV4_CFG), &gEfiIp4ConfigProtocolGuid, NULL }, { STRING_TOKEN (STR_IPV4_CFG2), &gEfiIp4Config2ProtocolGuid, NULL }, { STRING_TOKEN (STR_UDPV4_SB), &gEfiUdp4ServiceBindingProtocolGuid, NULL }, { STRING_TOKEN (STR_UDPV4), &gEfiUdp4ProtocolGuid, NULL }, diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h index 40eed671fa90..ab92e03014b0 100644 --- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h +++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h @@ -79,7 +79,6 @@ #include #include #include -#include #include #include #include diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf index 0cc0ce9f4a25..677ebc0c807a 100644 --- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf +++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf @@ -112,7 +112,6 @@ gEfiTcp4ProtocolGuid ## UNDEFINED gEfiIp4ServiceBindingProtocolGuid ## UNDEFINED gEfiIp4ProtocolGuid ## UNDEFINED - gEfiIp4ConfigProtocolGuid ## UNDEFINED gEfiIp4Config2ProtocolGuid ## UNDEFINED gEfiUdp4ServiceBindingProtocolGuid ## UNDEFINED gEfiUdp4ProtocolGuid ## UNDEFINED From ff668af879d6899ff59a2ede260a85ba3f50bc14 Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Wed, 16 Apr 2025 16:40:13 +0530 Subject: [PATCH 0424/1172] MdePkg/Include: Deprecate EFI_IP4_CONFIG_PROTOCOL EFI_IP4_CONFIG_PROTOCOL is deprecated in the previous commit. Hence, removing related header file and guid definition. Cc: Sachin Ganesh Signed-off-by: Gowtham M --- MdePkg/Include/Protocol/Ip4Config.h | 176 ---------------------------- MdePkg/MdePkg.dec | 3 - 2 files changed, 179 deletions(-) delete mode 100644 MdePkg/Include/Protocol/Ip4Config.h diff --git a/MdePkg/Include/Protocol/Ip4Config.h b/MdePkg/Include/Protocol/Ip4Config.h deleted file mode 100644 index 89b07e45547d..000000000000 --- a/MdePkg/Include/Protocol/Ip4Config.h +++ /dev/null @@ -1,176 +0,0 @@ -/** @file - This file provides a definition of the EFI IPv4 Configuration - Protocol. - -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-SPDX-License-Identifier: BSD-2-Clause-Patent - - @par Revision Reference: - This Protocol is introduced in UEFI Specification 2.0. - -**/ - -#ifndef __EFI_IP4CONFIG_PROTOCOL_H__ -#define __EFI_IP4CONFIG_PROTOCOL_H__ - -#include - -#define EFI_IP4_CONFIG_PROTOCOL_GUID \ - { \ - 0x3b95aa31, 0x3793, 0x434b, {0x86, 0x67, 0xc8, 0x07, 0x08, 0x92, 0xe0, 0x5e } \ - } - -typedef struct _EFI_IP4_CONFIG_PROTOCOL EFI_IP4_CONFIG_PROTOCOL; - -#define IP4_CONFIG_VARIABLE_ATTRIBUTES \ - (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS) - -/// -/// EFI_IP4_IPCONFIG_DATA contains the minimum IPv4 configuration data -/// that is needed to start basic network communication. The StationAddress -/// and SubnetMask must be a valid unicast IP address and subnet mask. -/// If RouteTableSize is not zero, then RouteTable contains a properly -/// formatted routing table for the StationAddress/SubnetMask, with the -/// last entry in the table being the default route. -/// -typedef struct { - /// - /// Default station IP address, stored in network byte order. - /// - EFI_IPv4_ADDRESS StationAddress; - /// - /// Default subnet mask, stored in network byte order. - /// - EFI_IPv4_ADDRESS SubnetMask; - /// - /// Number of entries in the following RouteTable. May be zero. - /// - UINT32 RouteTableSize; - /// - /// Default routing table data (stored in network byte order). - /// Ignored if RouteTableSize is zero. - /// - EFI_IP4_ROUTE_TABLE *RouteTable; -} EFI_IP4_IPCONFIG_DATA; - -/** - Starts running the configuration policy for the EFI IPv4 Protocol driver. - - The Start() function is called to determine and to begin the platform - configuration policy by the EFI IPv4 Protocol driver. This determination may - be as simple as returning EFI_UNSUPPORTED if there is no EFI IPv4 Protocol - driver configuration policy. It may be as involved as loading some defaults - from nonvolatile storage, downloading dynamic data from a DHCP server, and - checking permissions with a site policy server. - Starting the configuration policy is just the beginning. It may finish almost - instantly or it may take several minutes before it fails to retrieve configuration - information from one or more servers. Once the policy is started, drivers - should use the DoneEvent parameter to determine when the configuration policy - has completed. EFI_IP4_CONFIG_PROTOCOL.GetData() must then be called to - determine if the configuration succeeded or failed. - Until the configuration completes successfully, EFI IPv4 Protocol driver instances - that are attempting to use default configurations must return EFI_NO_MAPPING. - Once the configuration is complete, the EFI IPv4 Configuration Protocol driver - signals DoneEvent. The configuration may need to be updated in the future. - Note that in this case the EFI IPv4 Configuration Protocol driver must signal - ReconfigEvent, and all EFI IPv4 Protocol driver instances that are using default - configurations must return EFI_NO_MAPPING until the configuration policy has - been rerun. - - @param This The pointer to the EFI_IP4_CONFIG_PROTOCOL instance. - @param DoneEvent Event that will be signaled when the EFI IPv4 - Protocol driver configuration policy completes - execution. This event must be of type EVT_NOTIFY_SIGNAL. - @param ReconfigEvent Event that will be signaled when the EFI IPv4 - Protocol driver configuration needs to be updated. - This event must be of type EVT_NOTIFY_SIGNAL. - - @retval EFI_SUCCESS The configuration policy for the EFI IPv4 Protocol - driver is now running. - @retval EFI_INVALID_PARAMETER One or more of the following parameters is NULL: - This - DoneEvent - ReconfigEvent - @retval EFI_OUT_OF_RESOURCES Required system resources could not be allocated. - @retval EFI_ALREADY_STARTED The configuration policy for the EFI IPv4 Protocol - driver was already started. - @retval EFI_DEVICE_ERROR An unexpected system error or network error occurred. - @retval EFI_UNSUPPORTED This interface does not support the EFI IPv4 Protocol - driver configuration. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_IP4_CONFIG_START)( - IN EFI_IP4_CONFIG_PROTOCOL *This, - IN EFI_EVENT DoneEvent, - IN EFI_EVENT ReconfigEvent - ); - -/** - Stops running the configuration policy for the EFI IPv4 Protocol driver. - - The Stop() function stops the configuration policy for the EFI IPv4 Protocol driver. - All configuration data will be lost after calling Stop(). - - @param This The pointer to the EFI_IP4_CONFIG_PROTOCOL instance. - - @retval EFI_SUCCESS The configuration policy for the EFI IPv4 Protocol - driver has been stopped. - @retval EFI_INVALID_PARAMETER This is NULL. - @retval EFI_NOT_STARTED The configuration policy for the EFI IPv4 Protocol - driver was not started. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_IP4_CONFIG_STOP)( - IN EFI_IP4_CONFIG_PROTOCOL *This - ); - -/** - Returns the default configuration data (if any) for the EFI IPv4 Protocol driver. - - The GetData() function returns the current configuration data for the EFI IPv4 - Protocol driver after the configuration policy has completed. - - @param This The pointer to the EFI_IP4_CONFIG_PROTOCOL instance. - @param IpConfigDataSize On input, the size of the IpConfigData buffer. - On output, the count of bytes that were written - into the IpConfigData buffer. - @param IpConfigData The pointer to the EFI IPv4 Configuration Protocol - driver configuration data structure. - Type EFI_IP4_IPCONFIG_DATA is defined in - "Related Definitions" below. - - @retval EFI_SUCCESS The EFI IPv4 Protocol driver configuration has been returned. - @retval EFI_INVALID_PARAMETER This is NULL. - @retval EFI_NOT_STARTED The configuration policy for the EFI IPv4 Protocol - driver is not running. - @retval EFI_NOT_READY EFI IPv4 Protocol driver configuration is still running. - @retval EFI_ABORTED EFI IPv4 Protocol driver configuration could not complete. - @retval EFI_BUFFER_TOO_SMALL *IpConfigDataSize is smaller than the configuration - data buffer or IpConfigData is NULL. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_IP4_CONFIG_GET_DATA)( - IN EFI_IP4_CONFIG_PROTOCOL *This, - IN OUT UINTN *IpConfigDataSize, - OUT EFI_IP4_IPCONFIG_DATA *IpConfigData OPTIONAL - ); - -/// -/// The EFI_IP4_CONFIG_PROTOCOL driver performs platform-dependent and policy-dependent -/// configurations for the EFI IPv4 Protocol driver. -/// -struct _EFI_IP4_CONFIG_PROTOCOL { - EFI_IP4_CONFIG_START Start; - EFI_IP4_CONFIG_STOP Stop; - EFI_IP4_CONFIG_GET_DATA GetData; -}; - -extern EFI_GUID gEfiIp4ConfigProtocolGuid; - -#endif diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index ed22a6756853..120be4b327cf 100644 --- a/MdePkg/MdePkg.dec +++ b/MdePkg/MdePkg.dec @@ -1697,9 +1697,6 @@ ## Include/Protocol/Ip4.h gEfiIp4ProtocolGuid = { 0x41D94CD2, 0x35B6, 0x455A, { 0x82, 0x58, 0xD4, 0xE5, 0x13, 0x34, 0xAA, 0xDD }} - ## Include/Protocol/Ip4Config.h - gEfiIp4ConfigProtocolGuid = { 0x3B95AA31, 0x3793, 0x434B, { 0x86, 0x67, 0xC8, 0x07, 0x08, 0x92, 0xE0, 0x5E }} - ## Include/Protocol/Udp4.h gEfiUdp4ServiceBindingProtocolGuid = { 0x83F01464, 0x99BD, 0x45E5, { 0xB3, 0x83, 0xAF, 0x63, 0x05, 0xD8, 0xE9, 0xE6 }} From a860818324031b0a06c168f79f04330d36931f98 Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Wed, 16 Apr 2025 16:47:55 +0530 Subject: [PATCH 0425/1172] MdePkg/Include: Deprecate EFI_NVDIMM_LABEL_FLAGS_RESERVED EFI_NVDIMM_LABEL_FLAGS_RESERVED is a reserved bit in the NVDIMM label flags field, intended for future use. It was removed in UEFI 2.10A and 2.11 as it had no defined function and was unused in implementations. Cc: Sachin Ganesh Signed-off-by: Gowtham M --- MdePkg/Include/Protocol/NvdimmLabel.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/MdePkg/Include/Protocol/NvdimmLabel.h b/MdePkg/Include/Protocol/NvdimmLabel.h index 0ba1003243ce..c17beb21696d 100644 --- a/MdePkg/Include/Protocol/NvdimmLabel.h +++ b/MdePkg/Include/Protocol/NvdimmLabel.h @@ -113,12 +113,6 @@ typedef struct { /// #define EFI_NVDIMM_LABEL_FLAGS_LOCAL 0x00000002 -/// -/// This reserved flag is utilized on older implementations and has been deprecated. -/// Do not use. -// -#define EFI_NVDIMM_LABEL_FLAGS_RESERVED 0x00000004 - /// /// When set, the label set is being updated. /// From b1e018c0ad29657d7308f942c61ba94554b4d71f Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Wed, 16 Apr 2025 17:03:38 +0530 Subject: [PATCH 0426/1172] MdePkg/Include: Deprecate EFI_NVDIMM_LABEL_FLAGS_UPDATING The EFI_NVDIMM_LABEL_FLAGS_UPDATING flag is used in UEFI to indicate that an update was in progress across multiple Label Storage Areas (LSAs) on NVDIMM devices. Its purpose was to help ensure atomicity in the event of interruptions like power loss or system crashes. It is deprecated in UEFI 2.10 and 2.11, as label index blocks and checksums now provide better atomicity and consistency without requiring this flag. Cc: Sachin Ganesh Signed-off-by: Gowtham M --- MdePkg/Include/Protocol/NvdimmLabel.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/MdePkg/Include/Protocol/NvdimmLabel.h b/MdePkg/Include/Protocol/NvdimmLabel.h index c17beb21696d..1919b9da8e75 100644 --- a/MdePkg/Include/Protocol/NvdimmLabel.h +++ b/MdePkg/Include/Protocol/NvdimmLabel.h @@ -113,11 +113,6 @@ typedef struct { /// #define EFI_NVDIMM_LABEL_FLAGS_LOCAL 0x00000002 -/// -/// When set, the label set is being updated. -/// -#define EFI_NVDIMM_LABEL_FLAGS_UPDATING 0x00000008 - /// /// When set, the SPALocationCookie in the namespace label is valid and should match the /// current value in the NFIT SPA Range Structure. From 80fddcaeb804ff72fcca0cfde2aca0603512f679 Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Wed, 16 Apr 2025 17:53:25 +0530 Subject: [PATCH 0427/1172] MdePkg/Include: Deprecate UNICODE_COLLATION_INTERFACE Remove UNICODE_COLLATION_INTERFACE typedef since unused and removed from UEFI 2.10A and 2.11 specifications. Cc: Sachin Ganesh Signed-off-by: Gowtham M --- MdePkg/Include/Protocol/UnicodeCollation.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/MdePkg/Include/Protocol/UnicodeCollation.h b/MdePkg/Include/Protocol/UnicodeCollation.h index c4025eb4ff8a..d3294196cefd 100644 --- a/MdePkg/Include/Protocol/UnicodeCollation.h +++ b/MdePkg/Include/Protocol/UnicodeCollation.h @@ -28,11 +28,6 @@ typedef struct _EFI_UNICODE_COLLATION_PROTOCOL EFI_UNICODE_COLLATION_PROTOCOL; /// #define UNICODE_COLLATION_PROTOCOL EFI_UNICODE_COLLATION_PROTOCOL_GUID -/// -/// Protocol defined in EFI1.1. -/// -typedef EFI_UNICODE_COLLATION_PROTOCOL UNICODE_COLLATION_INTERFACE; - /// /// Protocol data structures and defines /// From e27779e2c121e3074bf5a9330784a492010355b5 Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Sun, 20 Jul 2025 11:32:33 +0530 Subject: [PATCH 0428/1172] ShellPkg/Library: Deprecate EFI_DEVICE_IO_PROTOCOL gEfiDeviceIoProtocolGuid identifies EFI_DEVICE_IO_PROTOCOL, which provided low-level I/O and MMIO access for UEFI drivers. It was removed in UEFI 2.10A and 2.11 due to overlapping functionality with modern protocols like EFI_PCI_IO_PROTOCOL and EFI_CPU_IO2_PROTOCOL. These newer protocols offer improved modularity, abstraction, and safety, making EFI_DEVICE_IO_PROTOCOL obsolete. Cc: Sachin Ganesh Signed-off-by: Gowtham M --- ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c | 1 - ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h | 1 - ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf | 1 - ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.uni | 1 - ShellPkg/Library/UefiShellDebug1CommandsLib/Mm.c | 1 - 5 files changed, 5 deletions(-) diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c index 3c243c24feb1..e2409f9899b5 100644 --- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c +++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c @@ -2306,7 +2306,6 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = { { STRING_TOKEN (STR_SHELL_INTERFACE), &gEfiShellInterfaceGuid, NULL }, { STRING_TOKEN (STR_SHELL_ENV2), &gEfiShellEnvironment2Guid, NULL }, { STRING_TOKEN (STR_SHELL_ENV), &gEfiShellEnvironment2Guid, NULL }, - { STRING_TOKEN (STR_DEVICE_IO), &gEfiDeviceIoProtocolGuid, NULL }, { STRING_TOKEN (STR_ESP), &gEfiPartTypeSystemPartGuid, NULL }, { STRING_TOKEN (STR_GPT_NBR), &gEfiPartTypeLegacyMbrGuid, NULL }, { STRING_TOKEN (STR_DRIVER_CONFIG), &gEfiDriverConfigurationProtocolGuid, NULL }, diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h index ab92e03014b0..2a0416136613 100644 --- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h +++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h @@ -91,7 +91,6 @@ #include #include #include -#include #include #include #include diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf index 677ebc0c807a..708bde0cee04 100644 --- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf +++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf @@ -126,7 +126,6 @@ gEfiHiiConfigRoutingProtocolGuid ## UNDEFINED gEfiHiiConfigAccessProtocolGuid ## UNDEFINED gEfiFormBrowser2ProtocolGuid ## UNDEFINED - gEfiDeviceIoProtocolGuid ## UNDEFINED gEfiDriverConfigurationProtocolGuid ## UNDEFINED gEfiDriverConfiguration2ProtocolGuid ## UNDEFINED gEfiSimpleTextInputExProtocolGuid ## UNDEFINED diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.uni b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.uni index 7f5d2a37f9f6..8e0f516b978c 100644 --- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.uni +++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.uni @@ -158,7 +158,6 @@ #string STR_SHELL_ENV2 #language en-US "ShellEnvironment2" #string STR_SHELL_DP_MAP #language en-US "ShellDevicePathMap" #string STR_SHELL_ALIAS #language en-US "ShellAlias" -#string STR_DEVICE_IO #language en-US "DeviceIO" #string STR_TCP #language en-US "TCP" #string STR_ESP #language en-US "EFISystemPartition" #string STR_GPT_NBR #language en-US "LegacyMBR" diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Mm.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Mm.c index cff2c9daee38..ce475a6ef06b 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Mm.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Mm.c @@ -11,7 +11,6 @@ #include #include #include -#include typedef enum { ShellMmMemory, From 8bd3787e4ba3c9289ac1c8a83c3575a6f053b952 Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Sun, 20 Jul 2025 11:31:37 +0530 Subject: [PATCH 0429/1172] MdePkg/Include: Deprecate EFI_DEVICE_IO_PROTOCOL EFI_DEVICE_IO_PROTOCOL is deprecated in the previous commit. Hence, removing related header file and guid definition. Cc: Sachin Ganesh Signed-off-by: Gowtham M --- MdePkg/Include/Protocol/DeviceIo.h | 262 ----------------------------- MdePkg/MdePkg.dec | 3 - 2 files changed, 265 deletions(-) delete mode 100644 MdePkg/Include/Protocol/DeviceIo.h diff --git a/MdePkg/Include/Protocol/DeviceIo.h b/MdePkg/Include/Protocol/DeviceIo.h deleted file mode 100644 index c25b437f7232..000000000000 --- a/MdePkg/Include/Protocol/DeviceIo.h +++ /dev/null @@ -1,262 +0,0 @@ -/** @file - Device IO protocol as defined in the EFI 1.10 specification. - - Device IO is used to abstract hardware access to devices. It includes - memory mapped IO, IO, PCI Config space, and DMA. - - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
- SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#ifndef __DEVICE_IO_H__ -#define __DEVICE_IO_H__ - -#define EFI_DEVICE_IO_PROTOCOL_GUID \ - { \ - 0xaf6ac311, 0x84c3, 0x11d2, {0x8e, 0x3c, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \ - } - -typedef struct _EFI_DEVICE_IO_PROTOCOL EFI_DEVICE_IO_PROTOCOL; - -/// -/// Protocol GUID name defined in EFI1.1. -/// -#define DEVICE_IO_PROTOCOL EFI_DEVICE_IO_PROTOCOL_GUID - -/// -/// Protocol defined in EFI1.1. -/// -typedef EFI_DEVICE_IO_PROTOCOL EFI_DEVICE_IO_INTERFACE; - -/// -/// Device IO Access Width -/// -typedef enum { - IO_UINT8 = 0, - IO_UINT16 = 1, - IO_UINT32 = 2, - IO_UINT64 = 3, - // - // Below enumerations are added in "Extensible Firmware Interface Specification, - // Version 1.10, Specification Update, Version 001". - // - MMIO_COPY_UINT8 = 4, - MMIO_COPY_UINT16 = 5, - MMIO_COPY_UINT32 = 6, - MMIO_COPY_UINT64 = 7 -} EFI_IO_WIDTH; - -/** - Enables a driver to access device registers in the appropriate memory or I/O space. - - @param This A pointer to the EFI_DEVICE_IO_INTERFACE instance. - @param Width Signifies the width of the I/O operations. - @param Address The base address of the I/O operations. - @param Count The number of I/O operations to perform. - @param Buffer For read operations, the destination buffer to store the results. For write - operations, the source buffer to write data from. If - Width is MMIO_COPY_UINT8, MMIO_COPY_UINT16, - MMIO_COPY_UINT32, or MMIO_COPY_UINT64, then - Buffer is interpreted as a base address of an I/O operation such as Address. - - @retval EFI_SUCCESS The data was read from or written to the device. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. - @retval EFI_INVALID_PARAMETER Width is invalid. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_DEVICE_IO)( - IN EFI_DEVICE_IO_PROTOCOL *This, - IN EFI_IO_WIDTH Width, - IN UINT64 Address, - IN UINTN Count, - IN OUT VOID *Buffer - ); - -typedef struct { - EFI_DEVICE_IO Read; - EFI_DEVICE_IO Write; -} EFI_IO_ACCESS; - -/** - Provides an EFI Device Path for a PCI device with the given PCI configuration space address. - - @param This A pointer to the EFI_DEVICE_IO_INTERFACE instance. - @param PciAddress The PCI configuration space address of the device whose Device Path - is going to be returned. - @param PciDevicePath A pointer to the pointer for the EFI Device Path for PciAddress. - Memory for the Device Path is allocated from the pool. - - @retval EFI_SUCCESS The PciDevicePath returns a pointer to a valid EFI Device Path. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. - @retval EFI_UNSUPPORTED The PciAddress does not map to a valid EFI Device Path. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_PCI_DEVICE_PATH)( - IN EFI_DEVICE_IO_PROTOCOL *This, - IN UINT64 PciAddress, - IN OUT EFI_DEVICE_PATH_PROTOCOL **PciDevicePath - ); - -typedef enum { - /// - /// A read operation from system memory by a bus master. - /// - EfiBusMasterRead, - - /// - /// A write operation to system memory by a bus master. - /// - EfiBusMasterWrite, - - /// - /// Provides both read and write access to system memory - /// by both the processor and a bus master. The buffer is - /// coherent from both the processor's and the bus master's - /// point of view. - /// - EfiBusMasterCommonBuffer -} EFI_IO_OPERATION_TYPE; - -/** - Provides the device-specific addresses needed to access system memory. - - @param This A pointer to the EFI_DEVICE_IO_INTERFACE instance. - @param Operation Indicates if the bus master is going to read or write to system memory. - @param HostAddress The system memory address to map to the device. - @param NumberOfBytes On input, the number of bytes to map. - On output, the number of bytes that were mapped. - @param DeviceAddress The resulting map address for the bus master device to use to access the - hosts HostAddress. - @param Mapping A resulting value to pass to Unmap(). - - @retval EFI_SUCCESS The range was mapped for the returned NumberOfBytes. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. - @retval EFI_UNSUPPORTED The HostAddress cannot be mapped as a common buffer. - @retval EFI_INVALID_PARAMETER The Operation or HostAddress is undefined. - @retval EFI_DEVICE_ERROR The system hardware could not map the requested address. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_IO_MAP)( - IN EFI_DEVICE_IO_PROTOCOL *This, - IN EFI_IO_OPERATION_TYPE Operation, - IN EFI_PHYSICAL_ADDRESS *HostAddress, - IN OUT UINTN *NumberOfBytes, - OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, - OUT VOID **Mapping - ); - -/** - Completes the Map() operation and releases any corresponding resources. - - @param This A pointer to the EFI_DEVICE_IO_INTERFACE instance. - @param Mapping A resulting value to pass to Unmap(). - - @retval EFI_SUCCESS The range was mapped for the returned NumberOfBytes. - @retval EFI_DEVICE_ERROR The system hardware could not map the requested address. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_IO_UNMAP)( - IN EFI_DEVICE_IO_PROTOCOL *This, - IN VOID *Mapping - ); - -/** - Allocates pages that are suitable for an EFIBusMasterCommonBuffer mapping. - - @param This A pointer to the EFI_DEVICE_IO_INTERFACE instance. - @param Type The type allocation to perform. - @param MemoryType The type of memory to allocate, EfiBootServicesData or - EfiRuntimeServicesData. - @param Pages The number of pages to allocate. - @param HostAddress A pointer to store the base address of the allocated range. - - @retval EFI_SUCCESS The requested memory pages were allocated. - @retval EFI_OUT_OF_RESOURCES The memory pages could not be allocated. - @retval EFI_INVALID_PARAMETER The requested memory type is invalid. - @retval EFI_UNSUPPORTED The requested HostAddress is not supported on - this platform. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_IO_ALLOCATE_BUFFER)( - IN EFI_DEVICE_IO_PROTOCOL *This, - IN EFI_ALLOCATE_TYPE Type, - IN EFI_MEMORY_TYPE MemoryType, - IN UINTN Pages, - IN OUT EFI_PHYSICAL_ADDRESS *HostAddress - ); - -/** - Flushes any posted write data to the device. - - @param This A pointer to the EFI_DEVICE_IO_INTERFACE instance. - - @retval EFI_SUCCESS The buffers were flushed. - @retval EFI_DEVICE_ERROR The buffers were not flushed due to a hardware error. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_IO_FLUSH)( - IN EFI_DEVICE_IO_PROTOCOL *This - ); - -/** - Frees pages that were allocated with AllocateBuffer(). - - @param This A pointer to the EFI_DEVICE_IO_INTERFACE instance. - @param Pages The number of pages to free. - @param HostAddress The base address of the range to free. - - @retval EFI_SUCCESS The requested memory pages were allocated. - @retval EFI_NOT_FOUND The requested memory pages were not allocated with - AllocateBuffer(). - @retval EFI_INVALID_PARAMETER HostAddress is not page aligned or Pages is invalid. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_IO_FREE_BUFFER)( - IN EFI_DEVICE_IO_PROTOCOL *This, - IN UINTN Pages, - IN EFI_PHYSICAL_ADDRESS HostAddress - ); - -/// -/// This protocol provides the basic Memory, I/O, and PCI interfaces that -/// are used to abstract accesses to devices. -/// -struct _EFI_DEVICE_IO_PROTOCOL { - /// - /// Allows reads and writes to memory mapped I/O space. - /// - EFI_IO_ACCESS Mem; - /// - /// Allows reads and writes to I/O space. - /// - EFI_IO_ACCESS Io; - /// - /// Allows reads and writes to PCI configuration space. - /// - EFI_IO_ACCESS Pci; - EFI_IO_MAP Map; - EFI_PCI_DEVICE_PATH PciDevicePath; - EFI_IO_UNMAP Unmap; - EFI_IO_ALLOCATE_BUFFER AllocateBuffer; - EFI_IO_FLUSH Flush; - EFI_IO_FREE_BUFFER FreeBuffer; -}; - -extern EFI_GUID gEfiDeviceIoProtocolGuid; - -#endif diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index 120be4b327cf..cb9f89501092 100644 --- a/MdePkg/MdePkg.dec +++ b/MdePkg/MdePkg.dec @@ -1508,9 +1508,6 @@ ## Include/Protocol/Decompress.h gEfiDecompressProtocolGuid = { 0xD8117CFE, 0x94A6, 0x11D4, { 0x9A, 0x3A, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }} - ## Include/Protocol/DeviceIo.h - gEfiDeviceIoProtocolGuid = { 0xAF6AC311, 0x84C3, 0x11D2, { 0x8E, 0x3C, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B }} - ## Include/Protocol/DevicePath.h gEfiDevicePathProtocolGuid = { 0x09576E91, 0x6D3F, 0x11D2, { 0x8E, 0x39, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B }} From 9898567e2b080f2086dcebb445986882dcf11134 Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Tue, 5 Aug 2025 19:23:04 +0530 Subject: [PATCH 0430/1172] FatPkg/EnhanceFatDxe:Deprecate EFI_UNICODE_COLLATION_PROTOCOL_GUID EFI_UNICODE_COLLATION_PROTOCOL_GUID was deprecated in favor of a newer version EFI_UNICODE_COLLATION_PROTOCOL2_GUID which provides improved language support and better extensibility. It was officially removed from UEFI specifications 2.10A and 2.11 and should no longer be used in current implementations. Cc: Sachin Ganesh Signed-off-by: Gowtham M --- FatPkg/EnhancedFatDxe/Fat.inf | 1 - FatPkg/EnhancedFatDxe/UnicodeCollation.c | 14 +------------- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/FatPkg/EnhancedFatDxe/Fat.inf b/FatPkg/EnhancedFatDxe/Fat.inf index 17b6348a2542..9d83dbdac7a9 100644 --- a/FatPkg/EnhancedFatDxe/Fat.inf +++ b/FatPkg/EnhancedFatDxe/Fat.inf @@ -78,7 +78,6 @@ gEfiDiskIo2ProtocolGuid ## TO_START gEfiBlockIoProtocolGuid ## TO_START gEfiSimpleFileSystemProtocolGuid ## BY_START - gEfiUnicodeCollationProtocolGuid ## TO_START gEfiUnicodeCollation2ProtocolGuid ## TO_START [Pcd] diff --git a/FatPkg/EnhancedFatDxe/UnicodeCollation.c b/FatPkg/EnhancedFatDxe/UnicodeCollation.c index 6506584ba14c..45cd52345b6f 100644 --- a/FatPkg/EnhancedFatDxe/UnicodeCollation.c +++ b/FatPkg/EnhancedFatDxe/UnicodeCollation.c @@ -55,7 +55,7 @@ InitializeUnicodeCollationSupportWorker ( return Status; } - Iso639Language = (BOOLEAN)(ProtocolGuid == &gEfiUnicodeCollationProtocolGuid); + Iso639Language = (BOOLEAN)(ProtocolGuid == &gEfiUnicodeCollation2ProtocolGuid); GetEfiGlobalVariable2 (VariableName, (VOID **)&Language, NULL); ReturnStatus = EFI_UNSUPPORTED; @@ -134,18 +134,6 @@ InitializeUnicodeCollationSupport ( L"PlatformLang", (CONST CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLang) ); - // - // If the attempt to use Unicode Collation 2 Protocol fails, then we fall back - // on the ISO 639-2 Unicode Collation Protocol. - // - if (EFI_ERROR (Status)) { - Status = InitializeUnicodeCollationSupportWorker ( - AgentHandle, - &gEfiUnicodeCollationProtocolGuid, - L"Lang", - (CONST CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultLang) - ); - } return Status; } From a46697f73532dbaa84babacc887cd5ccd8c4fdc2 Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Tue, 5 Aug 2025 19:38:28 +0530 Subject: [PATCH 0431/1172] MdeModulePkg: Deprecate EFI_UNICODE_COLLATION_PROTOCOL_GUID Adding to the previous commit deprecating EFI_UNICODE_COLLATION_PROTOCOL_GUID in MdeModulePkg. Cc: Sachin Ganesh Signed-off-by: Gowtham M --- MdeModulePkg/MdeModulePkg.dec | 6 --- MdeModulePkg/MdeModulePkg.uni | 6 --- .../EnglishDxe/EnglishDxe.inf | 6 +-- .../EnglishDxe/EnglishDxe.uni | 6 +-- .../EnglishDxe/UnicodeCollationEng.c | 43 +++---------------- .../FvSimpleFileSystemDxe.inf | 1 - .../FvSimpleFileSystemEntryPoint.c | 14 +----- 7 files changed, 13 insertions(+), 69 deletions(-) diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 8820059e7ce6..00c0bc77bf39 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -802,12 +802,6 @@ # @Prompt Enable variable statistics collection. gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics|FALSE|BOOLEAN|0x0001003f - ## Indicates if Unicode Collation Protocol will be installed.

- # TRUE - Installs Unicode Collation Protocol.
- # FALSE - Does not install Unicode Collation Protocol.
- # @Prompt Enable Unicode Collation support. - gEfiMdeModulePkgTokenSpaceGuid.PcdUnicodeCollationSupport|TRUE|BOOLEAN|0x00010040 - ## Indicates if Unicode Collation 2 Protocol will be installed.

# TRUE - Installs Unicode Collation 2 Protocol.
# FALSE - Does not install Unicode Collation 2 Protocol.
diff --git a/MdeModulePkg/MdeModulePkg.uni b/MdeModulePkg/MdeModulePkg.uni index 7aa83226bba3..cce8426bb9d2 100644 --- a/MdeModulePkg/MdeModulePkg.uni +++ b/MdeModulePkg/MdeModulePkg.uni @@ -691,12 +691,6 @@ "TRUE - Statistics about variable usage will be collected.
\n" "FALSE - Statistics about variable usage will not be collected.
" -#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdUnicodeCollationSupport_PROMPT #language en-US "Enable Unicode Collation support" - -#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdUnicodeCollationSupport_HELP #language en-US "Indicates if Unicode Collation Protocol will be installed.

\n" - "TRUE - Installs Unicode Collation Protocol.
\n" - "FALSE - Does not install Unicode Collation Protocol.
" - #string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdUnicodeCollation2Support_PROMPT #language en-US "Enable Unicode Collation 2 support" #string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdUnicodeCollation2Support_HELP #language en-US "Indicates if Unicode Collation 2 Protocol will be installed.

\n" diff --git a/MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf b/MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf index f97ffdbcd35b..758d7241a61d 100644 --- a/MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf +++ b/MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf @@ -2,8 +2,8 @@ # English module that provides Unicode Collation supports. # # This driver installs Unicode ISO 639-2 Collation and -# RFC 4646 Unicode Collation 2 protocols based on feature flags -# PcdUnicodeCollationSupport & PcdUnicodeCollation2Support respectively. +# RFC 4646 Unicode Collation 2 protocols based on feature flag +# PcdUnicodeCollation2Support. # It allows code running in the boot services environment to perform lexical # comparison functions on Unicode strings for English languages. # @@ -43,11 +43,9 @@ PcdLib [FeaturePcd] - gEfiMdeModulePkgTokenSpaceGuid.PcdUnicodeCollationSupport ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdUnicodeCollation2Support ## CONSUMES [Protocols] - gEfiUnicodeCollationProtocolGuid | gEfiMdeModulePkgTokenSpaceGuid.PcdUnicodeCollationSupport ## SOMETIMES_PRODUCES gEfiUnicodeCollation2ProtocolGuid | gEfiMdeModulePkgTokenSpaceGuid.PcdUnicodeCollation2Support ## PRODUCES [UserExtensions.TianoCore."ExtraFiles"] diff --git a/MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.uni b/MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.uni index 400d5185b50e..12f0cf9cfbed 100644 --- a/MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.uni +++ b/MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.uni @@ -2,8 +2,8 @@ // English module that provides Unicode Collation supports. // // This driver installs Unicode ISO 639-2 Collation and -// RFC 4646 Unicode Collation 2 protocols based on feature flags -// PcdUnicodeCollationSupport & PcdUnicodeCollation2Support respectively. +// RFC 4646 Unicode Collation 2 protocols based on feature flag +// PcdUnicodeCollation2Support respectively. // It allows code running in the boot services environment to perform lexical // comparison functions on Unicode strings for English languages. // @@ -16,5 +16,5 @@ #string STR_MODULE_ABSTRACT #language en-US "Provides Unicode Collation support" -#string STR_MODULE_DESCRIPTION #language en-US "This driver installs Unicode ISO 639-2 Collation and RFC 4646 Unicode Collation 2 protocols based on feature flags PcdUnicodeCollationSupport & PcdUnicodeCollation2Support respectively. It allows code running in the boot services environment to perform lexical comparison functions on Unicode strings for English languages." +#string STR_MODULE_DESCRIPTION #language en-US "This driver installs Unicode ISO 639-2 Collation and RFC 4646 Unicode Collation 2 protocols based on feature flag PcdUnicodeCollation2Support. It allows code running in the boot services environment to perform lexical comparison functions on Unicode strings for English languages." diff --git a/MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/UnicodeCollationEng.c b/MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/UnicodeCollationEng.c index ada4825181be..381590261af1 100644 --- a/MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/UnicodeCollationEng.c +++ b/MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/UnicodeCollationEng.c @@ -120,42 +120,13 @@ InitializeUnicodeCollationEng ( } if (FeaturePcdGet (PcdUnicodeCollation2Support)) { - if (FeaturePcdGet (PcdUnicodeCollationSupport)) { - Status = gBS->InstallMultipleProtocolInterfaces ( - &mHandle, - &gEfiUnicodeCollationProtocolGuid, - &UnicodeEng, - &gEfiUnicodeCollation2ProtocolGuid, - &Unicode2Eng, - NULL - ); - ASSERT_EFI_ERROR (Status); - } else { - Status = gBS->InstallMultipleProtocolInterfaces ( - &mHandle, - &gEfiUnicodeCollation2ProtocolGuid, - &Unicode2Eng, - NULL - ); - ASSERT_EFI_ERROR (Status); - } - } else { - if (FeaturePcdGet (PcdUnicodeCollationSupport)) { - Status = gBS->InstallMultipleProtocolInterfaces ( - &mHandle, - &gEfiUnicodeCollationProtocolGuid, - &UnicodeEng, - NULL - ); - ASSERT_EFI_ERROR (Status); - } else { - // - // This module must support to produce at least one of Unicode Collation Protocol - // and Unicode Collation 2 Protocol. - // - ASSERT (FALSE); - Status = EFI_UNSUPPORTED; - } + Status = gBS->InstallMultipleProtocolInterfaces ( + &mHandle, + &gEfiUnicodeCollation2ProtocolGuid, + &Unicode2Eng, + NULL + ); + ASSERT_EFI_ERROR (Status); } return Status; diff --git a/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemDxe.inf b/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemDxe.inf index 03797847d936..224685c87597 100644 --- a/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemDxe.inf +++ b/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemDxe.inf @@ -60,7 +60,6 @@ [Protocols] gEfiDevicePathProtocolGuid ## TO_START gEfiFirmwareVolume2ProtocolGuid ## TO_START - gEfiUnicodeCollationProtocolGuid ## TO_START gEfiUnicodeCollation2ProtocolGuid ## TO_START gEfiSimpleFileSystemProtocolGuid ## BY_START diff --git a/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemEntryPoint.c b/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemEntryPoint.c index 5d7fdaa2ff7f..17831079dce0 100644 --- a/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemEntryPoint.c +++ b/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemEntryPoint.c @@ -271,7 +271,7 @@ InitializeUnicodeCollationSupportWorker ( return Status; } - Iso639Language = (BOOLEAN)(ProtocolGuid == &gEfiUnicodeCollationProtocolGuid); + Iso639Language = (BOOLEAN)(ProtocolGuid == &gEfiUnicodeCollation2ProtocolGuid); GetEfiGlobalVariable2 (VariableName, (VOID **)&Language, NULL); ReturnStatus = EFI_UNSUPPORTED; @@ -350,18 +350,6 @@ InitializeUnicodeCollationSupport ( L"PlatformLang", (CONST CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLang) ); - // - // If the attempt to use Unicode Collation 2 Protocol fails, then we fall back - // on the ISO 639-2 Unicode Collation Protocol. - // - if (EFI_ERROR (Status)) { - Status = InitializeUnicodeCollationSupportWorker ( - AgentHandle, - &gEfiUnicodeCollationProtocolGuid, - L"Lang", - (CONST CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultLang) - ); - } return Status; } From cf5f907cd53f0a1e33a93179c9976de5d6b576e1 Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Tue, 5 Aug 2025 19:45:11 +0530 Subject: [PATCH 0432/1172] ShellPkg: Deprecate EFI_UNICODE_COLLATION_PROTOCOL_GUID As EFI_UNICODE_COLLATION_PROTOCOL_GUID is being deprecated. Remove the instances used in ShellPkg. Cc: Sachin Ganesh Signed-off-by: Gowtham M --- ShellPkg/Application/Shell/Shell.c | 9 +-------- .../Library/UefiHandleParsingLib/UefiHandleParsingLib.c | 1 - .../UefiHandleParsingLib/UefiHandleParsingLib.inf | 1 - 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/ShellPkg/Application/Shell/Shell.c b/ShellPkg/Application/Shell/Shell.c index ae3e94368bd9..206fd7f0f2e3 100644 --- a/ShellPkg/Application/Shell/Shell.c +++ b/ShellPkg/Application/Shell/Shell.c @@ -971,14 +971,7 @@ ProcessCommandLine ( (VOID **)&UnicodeCollation ); if (EFI_ERROR (Status)) { - Status = gBS->LocateProtocol ( - &gEfiUnicodeCollationProtocolGuid, - NULL, - (VOID **)&UnicodeCollation - ); - if (EFI_ERROR (Status)) { - return Status; - } + return Status; } // Set default options diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c index e2409f9899b5..ea018f51caa2 100644 --- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c +++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c @@ -2249,7 +2249,6 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = { { STRING_TOKEN (STR_TAPE_IO), &gEfiTapeIoProtocolGuid, NULL }, { STRING_TOKEN (STR_DISK_IO), &gEfiDiskIoProtocolGuid, NULL }, { STRING_TOKEN (STR_BLK_IO), &gEfiBlockIoProtocolGuid, BlockIoProtocolDumpInformation }, - { STRING_TOKEN (STR_UC), &gEfiUnicodeCollationProtocolGuid, NULL }, { STRING_TOKEN (STR_UC2), &gEfiUnicodeCollation2ProtocolGuid, NULL }, { STRING_TOKEN (STR_PCIRB_IO), &gEfiPciRootBridgeIoProtocolGuid, PciRootBridgeIoDumpInformation }, { STRING_TOKEN (STR_PCI_IO), &gEfiPciIoProtocolGuid, PciIoProtocolDumpInformation }, diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf index 708bde0cee04..60898da952e7 100644 --- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf +++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf @@ -82,7 +82,6 @@ gEfiTapeIoProtocolGuid ## UNDEFINED gEfiDiskIoProtocolGuid ## UNDEFINED gEfiBlockIoProtocolGuid ## UNDEFINED - gEfiUnicodeCollationProtocolGuid ## UNDEFINED gEfiPciRootBridgeIoProtocolGuid ## UNDEFINED gEfiPciIoProtocolGuid ## UNDEFINED gEfiScsiPassThruProtocolGuid ## UNDEFINED From 438045682bee1d075489e584d290b91f1430f73e Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Tue, 5 Aug 2025 19:48:00 +0530 Subject: [PATCH 0433/1172] MdePkg/Inclde: Deprecate EFI_UNICODE_COLLATION_PROTOCOL_GUID EFI_UNICODE_COLLATION_PROTOCOL_GUID is deprecated in the previous commit. Hence, removing related guid definition. Cc: Sachin Ganesh Signed-off-by: Gowtham M --- MdePkg/Include/Protocol/UnicodeCollation.h | 11 ----------- MdePkg/MdePkg.dec | 3 --- 2 files changed, 14 deletions(-) diff --git a/MdePkg/Include/Protocol/UnicodeCollation.h b/MdePkg/Include/Protocol/UnicodeCollation.h index d3294196cefd..6d7eb13e2f03 100644 --- a/MdePkg/Include/Protocol/UnicodeCollation.h +++ b/MdePkg/Include/Protocol/UnicodeCollation.h @@ -11,11 +11,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #ifndef __UNICODE_COLLATION_H__ #define __UNICODE_COLLATION_H__ -#define EFI_UNICODE_COLLATION_PROTOCOL_GUID \ - { \ - 0x1d85cd7f, 0xf43d, 0x11d2, {0x9a, 0xc, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \ - } - #define EFI_UNICODE_COLLATION_PROTOCOL2_GUID \ { \ 0xa4c751fc, 0x23ae, 0x4c3e, {0x92, 0xe9, 0x49, 0x64, 0xcf, 0x63, 0xf3, 0x49 } \ @@ -23,11 +18,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent typedef struct _EFI_UNICODE_COLLATION_PROTOCOL EFI_UNICODE_COLLATION_PROTOCOL; -/// -/// Protocol GUID name defined in EFI1.1. -/// -#define UNICODE_COLLATION_PROTOCOL EFI_UNICODE_COLLATION_PROTOCOL_GUID - /// /// Protocol data structures and defines /// @@ -175,7 +165,6 @@ struct _EFI_UNICODE_COLLATION_PROTOCOL { CHAR8 *SupportedLanguages; }; -extern EFI_GUID gEfiUnicodeCollationProtocolGuid; extern EFI_GUID gEfiUnicodeCollation2ProtocolGuid; #endif diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index cb9f89501092..61f0c217a028 100644 --- a/MdePkg/MdePkg.dec +++ b/MdePkg/MdePkg.dec @@ -1610,9 +1610,6 @@ ## Include/Protocol/BlockIo.h gEfiBlockIoProtocolGuid = { 0x964E5B21, 0x6459, 0x11D2, { 0x8E, 0x39, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B }} - ## Include/Protocol/UnicodeCollation.h - gEfiUnicodeCollationProtocolGuid = { 0x1D85CD7F, 0xF43D, 0x11D2, { 0x9A, 0x0C, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }} - ## Include/Protocol/UnicodeCollation.h gEfiUnicodeCollation2ProtocolGuid = {0xa4c751fc, 0x23ae, 0x4c3e, { 0x92, 0xe9, 0x49, 0x64, 0xcf, 0x63, 0xf3, 0x49 }} From 57230fff6b39a665485be1bd43ec608d412ba6fb Mon Sep 17 00:00:00 2001 From: "INDIA\\sachinganesh" Date: Tue, 5 Aug 2025 20:12:21 +0530 Subject: [PATCH 0434/1172] ArmPlatformPkg,EmbeddedPkg,MdeModulePkg: Move RealTimeClockLib header RealTimeClockLib is an architectural implementation that is not restricted to the embedded segment or any platform in particular. So the header has been moved to MdeModulePkg. And the package has been added to the relevant INF files. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Sachin Ganesh --- .../Library/PL031RealTimeClockLib/PL031RealTimeClockLib.inf | 1 + EmbeddedPkg/EmbeddedPkg.dec | 1 - .../TemplateRealTimeClockLib/TemplateRealTimeClockLib.inf | 1 + .../VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf | 1 + .../RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf | 1 + .../Include/Library/RealTimeClockLib.h | 0 MdeModulePkg/MdeModulePkg.dec | 4 ++++ 7 files changed, 8 insertions(+), 1 deletion(-) rename {EmbeddedPkg => MdeModulePkg}/Include/Library/RealTimeClockLib.h (100%) diff --git a/ArmPlatformPkg/Library/PL031RealTimeClockLib/PL031RealTimeClockLib.inf b/ArmPlatformPkg/Library/PL031RealTimeClockLib/PL031RealTimeClockLib.inf index 8224617f20ab..7cf9d24cebc0 100644 --- a/ArmPlatformPkg/Library/PL031RealTimeClockLib/PL031RealTimeClockLib.inf +++ b/ArmPlatformPkg/Library/PL031RealTimeClockLib/PL031RealTimeClockLib.inf @@ -22,6 +22,7 @@ [Packages] MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec EmbeddedPkg/EmbeddedPkg.dec ArmPlatformPkg/ArmPlatformPkg.dec diff --git a/EmbeddedPkg/EmbeddedPkg.dec b/EmbeddedPkg/EmbeddedPkg.dec index 4f0de24c554e..666bd710919b 100644 --- a/EmbeddedPkg/EmbeddedPkg.dec +++ b/EmbeddedPkg/EmbeddedPkg.dec @@ -32,7 +32,6 @@ [LibraryClasses.common] PrePiLib|Include/Library/PrePiLib.h - RealTimeClockLib|Include/Library/RealTimeClockLib.h GdbSerialLib|Include/Library/GdbSerialLib.h DebugAgentTimerLib|Include/Library/DebugAgentTimerLib.h NorFlashInfoLib|Include/Library/NorFlashInfoLib.h diff --git a/EmbeddedPkg/Library/TemplateRealTimeClockLib/TemplateRealTimeClockLib.inf b/EmbeddedPkg/Library/TemplateRealTimeClockLib/TemplateRealTimeClockLib.inf index a7ff6e9b4aa1..6a8253e6fa36 100644 --- a/EmbeddedPkg/Library/TemplateRealTimeClockLib/TemplateRealTimeClockLib.inf +++ b/EmbeddedPkg/Library/TemplateRealTimeClockLib/TemplateRealTimeClockLib.inf @@ -24,6 +24,7 @@ [Packages] MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec EmbeddedPkg/EmbeddedPkg.dec [LibraryClasses] diff --git a/EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf b/EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf index 285e880daab8..1cc205991fb0 100644 --- a/EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf +++ b/EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf @@ -23,6 +23,7 @@ [Packages] MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec EmbeddedPkg/EmbeddedPkg.dec [LibraryClasses] diff --git a/EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf b/EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf index 0a4cd6dae703..ad548d07f888 100644 --- a/EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf +++ b/EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf @@ -24,6 +24,7 @@ [Packages] MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec EmbeddedPkg/EmbeddedPkg.dec [LibraryClasses] diff --git a/EmbeddedPkg/Include/Library/RealTimeClockLib.h b/MdeModulePkg/Include/Library/RealTimeClockLib.h similarity index 100% rename from EmbeddedPkg/Include/Library/RealTimeClockLib.h rename to MdeModulePkg/Include/Library/RealTimeClockLib.h diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 00c0bc77bf39..0cb53f0a8a90 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -181,6 +181,10 @@ # HobPrintLib|Include/Library/HobPrintLib.h + ## @libraryclass Provides time and date related EFI runtime services + # + RealTimeClockLib|Include/Library/RealTimeClockLib.h + [Guids] ## MdeModule package token space guid # Include/Guid/MdeModulePkgTokenSpace.h From d8e875e62505e15a48f82ccb49db42be9fda519f Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Wed, 13 Aug 2025 10:11:20 +0100 Subject: [PATCH 0435/1172] Global: fix ArmFfaLibRun() caller couldn't get ret-args When ArmFfaLibDirectMsgReq(2) is preempted, caller of these functions should resume it works via ArmFfaLibRun() and the secure partition will be return with FFA_DIRECT_MSG_RESP(2) with return arguments. However, since ArmFfaLibRun() gets its return in its stack variable, So caller of ArmFfaLibRun() doesn't get the return arguments from secure partition. To resolve this, add output parameter to ArmFfaLibRun() to receive return arguments. Continuous-integration-options: PatchCheck.ignore-multi-package Fixes: 5d1b38dd07c4 ("ArmPkg: Add ArmFfaLib used in Dxe driver") Reported-by: Mariam Elshakfy Signed-off-by: Yeoreum Yun --- .../MmCommunicationDxe/MmCommunication.c | 2 +- .../MmCommunicationPei/MmCommunicationPei.c | 2 +- MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c | 41 +++++++++++++++++-- MdePkg/Include/Library/ArmFfaLib.h | 6 ++- .../Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c | 12 +++--- .../Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c | 2 +- 6 files changed, 51 insertions(+), 14 deletions(-) diff --git a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c index 188fd3289e77..c2a3bd1a84dc 100644 --- a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c +++ b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c @@ -73,7 +73,7 @@ SendFfaMmCommunicate ( while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the StMM SP since it is UP. - Status = ArmFfaLibRun (mStMmPartId, 0x00); + Status = ArmFfaLibRun (mStMmPartId, 0x00, NULL); } return Status; diff --git a/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c b/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c index fc29e99788b5..7032409f057b 100644 --- a/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c +++ b/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c @@ -275,7 +275,7 @@ SendFfaMmCommunicate ( while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the StMM SP since it is UP. - Status = ArmFfaLibRun (mStMmPartId, 0x00); + Status = ArmFfaLibRun (mStMmPartId, 0x00, NULL); } return Status; diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c index 332628a5d553..0d6f0c1e408c 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c @@ -535,6 +535,7 @@ ArmFfaLibPartitionInfoGet ( @param [in] PartId Partition id @param [in] CpuNumber Cpu number in partition + @param [out] DirectMsgArg return arguments for direct msg resp/resp2 @retval EFI_SUCCESS @retval Other Error @@ -543,10 +544,12 @@ ArmFfaLibPartitionInfoGet ( EFI_STATUS EFIAPI ArmFfaLibRun ( - IN UINT16 PartId, - IN UINT16 CpuNumber + IN UINT16 PartId, + IN UINT16 CpuNumber, + OUT DIRECT_MSG_ARGS *DirectMsgArg OPTIONAL ) { + EFI_STATUS Status; ARM_FFA_ARGS FfaArgs; ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); @@ -556,7 +559,39 @@ ArmFfaLibRun ( ArmCallFfa (&FfaArgs); - return FfaArgsToEfiStatus (&FfaArgs); + Status = FfaArgsToEfiStatus (&FfaArgs); + if (EFI_ERROR (Status)) { + return Status; + } + + if (DirectMsgArg != NULL) { + ZeroMem (DirectMsgArg, sizeof (DIRECT_MSG_ARGS)); + + if (FfaArgs.Arg0 == ARM_FID_FFA_MSG_SEND_DIRECT_RESP) { + DirectMsgArg->Arg0 = FfaArgs.Arg3; + DirectMsgArg->Arg1 = FfaArgs.Arg4; + DirectMsgArg->Arg2 = FfaArgs.Arg5; + DirectMsgArg->Arg3 = FfaArgs.Arg6; + DirectMsgArg->Arg4 = FfaArgs.Arg7; + } else if (FfaArgs.Arg0 == ARM_FID_FFA_MSG_SEND_DIRECT_RESP2) { + DirectMsgArg->Arg0 = FfaArgs.Arg4; + DirectMsgArg->Arg1 = FfaArgs.Arg5; + DirectMsgArg->Arg2 = FfaArgs.Arg6; + DirectMsgArg->Arg3 = FfaArgs.Arg7; + DirectMsgArg->Arg4 = FfaArgs.Arg8; + DirectMsgArg->Arg5 = FfaArgs.Arg9; + DirectMsgArg->Arg6 = FfaArgs.Arg10; + DirectMsgArg->Arg7 = FfaArgs.Arg11; + DirectMsgArg->Arg8 = FfaArgs.Arg12; + DirectMsgArg->Arg9 = FfaArgs.Arg13; + DirectMsgArg->Arg10 = FfaArgs.Arg14; + DirectMsgArg->Arg11 = FfaArgs.Arg15; + DirectMsgArg->Arg12 = FfaArgs.Arg16; + DirectMsgArg->Arg13 = FfaArgs.Arg17; + } + } + + return Status; } /** diff --git a/MdePkg/Include/Library/ArmFfaLib.h b/MdePkg/Include/Library/ArmFfaLib.h index dd2ac4120277..190a943e5bda 100644 --- a/MdePkg/Include/Library/ArmFfaLib.h +++ b/MdePkg/Include/Library/ArmFfaLib.h @@ -301,6 +301,7 @@ ArmFfaLibSpmIdGet ( @param [in] PartId Partition id @param [in] CpuNumber Cpu number in partition + @param [out] DirectMsgArg return arguments for direct msg resp/resp2 @retval EFI_SUCCESS @retval Other Error @@ -309,8 +310,9 @@ ArmFfaLibSpmIdGet ( EFI_STATUS EFIAPI ArmFfaLibRun ( - IN UINT16 PartId, - IN UINT16 CpuNumber + IN UINT16 PartId, + IN UINT16 CpuNumber, + OUT DIRECT_MSG_ARGS *DirectMsgArg OPTIONAL ); /** diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c index 44159c996179..d6ece59f547d 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c +++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c @@ -202,7 +202,7 @@ Tpm2GetInterfaceVersion ( Status = ArmFfaLibMsgSendDirectReq2 (mFfaTpm2PartitionId, &gTpm2ServiceFfaGuid, &FfaDirectReq2Args); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00); + Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00, &FfaDirectReq2Args); } if (EFI_ERROR (Status)) { @@ -254,7 +254,7 @@ Tpm2GetFeatureInfo ( Status = ArmFfaLibMsgSendDirectReq2 (mFfaTpm2PartitionId, &gTpm2ServiceFfaGuid, &FfaDirectReq2Args); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00); + Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00, &FfaDirectReq2Args); } if (EFI_ERROR (Status)) { @@ -298,7 +298,7 @@ Tpm2ServiceStart ( Status = ArmFfaLibMsgSendDirectReq2 (mFfaTpm2PartitionId, &gTpm2ServiceFfaGuid, &FfaDirectReq2Args); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00); + Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00, &FfaDirectReq2Args); } if (EFI_ERROR (Status)) { @@ -343,7 +343,7 @@ Tpm2RegisterNotification ( Status = ArmFfaLibMsgSendDirectReq2 (mFfaTpm2PartitionId, &gTpm2ServiceFfaGuid, &FfaDirectReq2Args); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00); + Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00, &FfaDirectReq2Args); } if (EFI_ERROR (Status)) { @@ -380,7 +380,7 @@ Tpm2UnregisterNotification ( Status = ArmFfaLibMsgSendDirectReq2 (mFfaTpm2PartitionId, &gTpm2ServiceFfaGuid, &FfaDirectReq2Args); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00); + Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00, &FfaDirectReq2Args); } if (EFI_ERROR (Status)) { @@ -417,7 +417,7 @@ Tpm2FinishNotified ( Status = ArmFfaLibMsgSendDirectReq2 (mFfaTpm2PartitionId, &gTpm2ServiceFfaGuid, &FfaDirectReq2Args); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00); + Status = ArmFfaLibRun (mFfaTpm2PartitionId, 0x00, &FfaDirectReq2Args); } if (EFI_ERROR (Status)) { diff --git a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c index ea01c9b815dd..73a0f9a94416 100644 --- a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c +++ b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c @@ -69,7 +69,7 @@ Tpm2FfaCheckInterfaceVersion ( Status = ArmFfaLibMsgSendDirectReq2 (TpmPartId, &gTpm2ServiceFfaGuid, &TpmArgs); while (Status == EFI_INTERRUPT_PENDING) { // We are assuming vCPU0 of the TPM SP since it is UP. - Status = ArmFfaLibRun (TpmPartId, 0x00); + Status = ArmFfaLibRun (TpmPartId, 0x00, &TpmArgs); } if (EFI_ERROR (Status) || (TpmArgs.Arg0 != TPM2_FFA_SUCCESS_OK_RESULTS_RETURNED)) { From d7832b480009f8304c1f60af7c9beb6b99d1c7e4 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Sat, 16 Aug 2025 11:01:55 +0100 Subject: [PATCH 0436/1172] MdeModulePkg: consider UNSUPPORTED return as valid in ArmFfaStandaloneMmLib commit b534cabbdac4 ("ArmFfaLib: Add Rx/Tx support for Stmm secure partition") makes ArmFfaStandlaoneMm(Core)Lib map Rx/Tx buffer in its constructor. This makes a failure of loading StandaloneMm in legacy platform which doesn't implements Rx/Tx buffer related API since it doesn't need to. StandaloneMm could be only service provider not cosumer in some platform where doesn't need to map RxTx buffer. Therefore, Considier EFI_UNSUPPORTED return in ArmFfaStandaloneMmLib's constructor. Fixes: b534cabbdac4 ("ArmFfaLib: Add Rx/Tx support for Stmm secure partition") Signed-off-by: Yeoreum Yun --- .../Library/ArmFfaLib/ArmFfaStandaloneMmLib.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c index 72f9a80b2788..7f7d38f0b380 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c @@ -67,6 +67,19 @@ ArmFfaStandaloneMmLibConstructor ( * buffer again but it uses the mapped one. */ Status = EFI_SUCCESS; + } else if (Status == EFI_UNSUPPORTED) { + /* + * StandaloneMm can only act as a service provider, + * and its primary use case is the secure variable service. + * In this case, it does not require Rx/Tx buffers, + * so treating EFI_UNSUPPORTED as a valid return value is acceptable. + * + * Any service that requires Rx/Tx buffers + * MUST first verify their availability by calling + * ArmFfaLibGetRxTxBuffers(). + */ + Status = EFI_SUCCESS; + DEBUG ((DEBUG_WARN, "%a: Rx/Tx buffer doesn't support.\n", __func__)); } else if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "%a failed. Status = %r\n", __func__, Status)); } From f5d329137909067ad5849894f4f70e1cf4c6a3bf Mon Sep 17 00:00:00 2001 From: Vishal Oliyil Kunnil Date: Thu, 4 Sep 2025 14:32:24 -0700 Subject: [PATCH 0437/1172] Maintainers.txt: Add vishalo as reviewer for AARCH64 support Add vishalo as reviewer for ArmPkg, and ARM/AARCH64 support code in MdePkg. Signed-off-by: Vishal Oliyil Kunnil --- Maintainers.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Maintainers.txt b/Maintainers.txt index 8be4f963bf85..ad8b08784afa 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -93,6 +93,7 @@ F: UefiCpuPkg/*/Arm/ M: Leif Lindholm [leiflindholm] M: Ard Biesheuvel [ardbiesheuvel] M: Sami Mujawar [samimujawar] +R: Vishal Oliyil Kunnnil [vishalo] RISCV64 F: */RiscV64/ @@ -153,6 +154,7 @@ W: https://github.com/tianocore/tianocore.github.io/wiki/ArmPkg M: Leif Lindholm [leiflindholm] M: Ard Biesheuvel [ardbiesheuvel] M: Sami Mujawar [samimujawar] +R: Vishal Oliyil Kunnnil [vishalo] ArmPlatformPkg F: ArmPlatformPkg/ @@ -454,6 +456,7 @@ F: MdePkg/Include/Library/ArmLib.h M: Leif Lindholm [leiflindholm] M: Ard Biesheuvel [ardbiesheuvel] M: Sami Mujawar [samimujawar] +R: Vishal Oliyil Kunnnil [vishalo] MdePkg: ARM-FFA related interfaces F: MdePkg/*ArmFfa* From 57395308176b502df5dd7a23c1d51f3450032521 Mon Sep 17 00:00:00 2001 From: PaddyDeng Date: Wed, 30 Jul 2025 18:29:31 +0800 Subject: [PATCH 0438/1172] MdePkg: Add MockSpiNorFlashProtocol Add MockSpiNorFlashProtocol for google test components to use. Signed-off-by: PaddyDeng --- .../GoogleTest/Protocol/MockSpiNorFlash.h | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 MdePkg/Test/Mock/Include/GoogleTest/Protocol/MockSpiNorFlash.h diff --git a/MdePkg/Test/Mock/Include/GoogleTest/Protocol/MockSpiNorFlash.h b/MdePkg/Test/Mock/Include/GoogleTest/Protocol/MockSpiNorFlash.h new file mode 100644 index 000000000000..9669b36d4235 --- /dev/null +++ b/MdePkg/Test/Mock/Include/GoogleTest/Protocol/MockSpiNorFlash.h @@ -0,0 +1,113 @@ +/** @file MockSpiNorFlashProtocol.h + This file declares a mock of SPI NOR Flash Protocol. + + Copyright (c) Microsoft Corporation. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef MOCK_SPI_NOR_FLASH_PROTOCOL_H_ +#define MOCK_SPI_NOR_FLASH_PROTOCOL_H_ + +#include +#include + +extern "C" { + #include + #include +} + +struct MockSpiNorFlashProtocol { + MOCK_INTERFACE_DECLARATION (MockSpiNorFlashProtocol); + MOCK_FUNCTION_DECLARATION ( + EFI_STATUS, + GetFlashid, + ( + IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, + OUT UINT8 *Buffer + ) + ); + MOCK_FUNCTION_DECLARATION ( + EFI_STATUS, + ReadData, + ( + IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, + IN UINT32 FlashAddress, + IN UINT32 LengthInBytes, + OUT UINT8 *Buffer + ) + ); + MOCK_FUNCTION_DECLARATION ( + EFI_STATUS, + LfReadData, + ( + IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, + IN UINT32 FlashAddress, + IN UINT32 LengthInBytes, + OUT UINT8 *Buffer + ) + ); + MOCK_FUNCTION_DECLARATION ( + EFI_STATUS, + ReadStatus, + ( + IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, + IN UINT32 LengthInBytes, + OUT UINT8 *FlashStatus + ) + ); + MOCK_FUNCTION_DECLARATION ( + EFI_STATUS, + WriteStatus, + ( + IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, + IN UINT32 LengthInBytes, + IN UINT8 *FlashStatus + ) + ); + MOCK_FUNCTION_DECLARATION ( + EFI_STATUS, + WriteData, + ( + IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, + IN UINT32 FlashAddress, + IN UINT32 LengthInBytes, + IN UINT8 *Buffer + ) + ); + MOCK_FUNCTION_DECLARATION ( + EFI_STATUS, + Erase, + ( + IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, + IN UINT32 FlashAddress, + IN UINT32 BlockCount + ) + ); +}; + +MOCK_INTERFACE_DEFINITION (MockSpiNorFlashProtocol); +MOCK_FUNCTION_DEFINITION (MockSpiNorFlashProtocol, GetFlashid, 2, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockSpiNorFlashProtocol, ReadData, 4, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockSpiNorFlashProtocol, LfReadData, 4, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockSpiNorFlashProtocol, ReadStatus, 3, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockSpiNorFlashProtocol, WriteStatus, 3, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockSpiNorFlashProtocol, WriteData, 4, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockSpiNorFlashProtocol, Erase, 3, EFIAPI); + +#define MOCK_EFI_SPI_NOR_FLASH_PROTOCOL_INSTANCE(NAME) \ +EFI_SPI_NOR_FLASH_PROTOCOL NAME##_INSTANCE = { \ + NULL, \ + 0, \ + {0, 0, 0}, \ + 0, \ + GetFlashid, \ + ReadData, \ + LfReadData, \ + ReadStatus, \ + WriteStatus, \ + WriteData, \ + Erase \ +}; \ +EFI_SPI_NOR_FLASH_PROTOCOL *NAME = &NAME##_INSTANCE; + +#endif // MOCK_SPI_NOR_FLASH_PROTOCOL_H_ From 9e1c211b6c5ea60d331ebd9a893ae2cb81c04949 Mon Sep 17 00:00:00 2001 From: Giri Mudusuru Date: Sat, 23 Aug 2025 21:07:36 -0700 Subject: [PATCH 0439/1172] MdePkg/IndustryStandard: Define enums for DSP0134 SMBIOS Spec v3.9.0 Add new enums for Type3 Chassis & Type17 Memory Signed-off-by: Giri Mudusuru --- MdePkg/Include/IndustryStandard/SmBios.h | 33 ++++++++++++++++++++---- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/MdePkg/Include/IndustryStandard/SmBios.h b/MdePkg/Include/IndustryStandard/SmBios.h index ce0a8e3e7327..be46e9f4d6ac 100644 --- a/MdePkg/Include/IndustryStandard/SmBios.h +++ b/MdePkg/Include/IndustryStandard/SmBios.h @@ -1,6 +1,7 @@ /** @file Industry Standard Definitions of SMBIOS Table Specification v3.8.0. +Copyright (c) Microsoft Corporation. All rights reserved.
Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
Copyright (c) 2006 - 2024, Intel Corporation. All rights reserved.
(C) Copyright 2015-2017 Hewlett Packard Enterprise Development LP
@@ -482,6 +483,24 @@ typedef struct { /// /// System Enclosure or Chassis (Type 3). /// + +/// +/// Chassis - Height. +/// +typedef enum { + ChassisHeightUnspecified = 0x00, + ChassisHeightUseRackHeight = 0xFF ///< Enclosure Height is specified at offset 16h+(n*m) +} CHASSIS_HEIGHT; + +/// +/// Chassis - Rack Type. +/// SMBIOS Spec 3.9.0 CR251 Additional Rack Types +/// +typedef enum { + ChassisRackTypeUnspecified = 0x00, + ChassisRackTypeOU = 0x01, +} CHASSIS_RACK_TYPE; + /// The information in this structure defines attributes of the system's mechanical enclosure(s). /// For example, if a system included a separate enclosure for its peripheral devices, /// two structures would be returned: one for the main, system enclosure and the second for @@ -513,9 +532,11 @@ typedef struct { // // Since ContainedElements has a variable number of entries, must not define SKUNumber in // the structure. Need to reference it by starting at offset 0x15 and adding - // (ContainedElementCount * ContainedElementRecordLength) bytes. + // (ContainedElementCount(n) * ContainedElementRecordLength(m)) bytes. // - // SMBIOS_TABLE_STRING SKUNumber; + // SMBIOS_TABLE_STRING SKUNumber; ///< SMBIOS spec 2.7+ Offset 15h+(n*m) + // UINT8 RackType; ///< SMBIOS spec 3.9+ Offset 16h+(n*m) CR251 + // UINT8 RackHeight; ///< SMBIOS spec 3.9+ Offset 17h+(n*m) CR251 } SMBIOS_TABLE_TYPE3; /// @@ -1866,7 +1887,9 @@ typedef enum { MemoryFormFactorSrimm = 0x0E, MemoryFormFactorFbDimm = 0x0F, MemoryFormFactorDie = 0x10, - MemoryFormFactorCamm = 0x11 + MemoryFormFactorCamm = 0x11, + MemoryFormFactorCuDimm = 0x12, ///< SMBIOS spec 3.9.0 CR244 + MemoryFormFactorCsoDimm = 0x13 ///< SMBIOS spec 3.9.0 CR244 } MEMORY_FORM_FACTOR; /// @@ -1906,7 +1929,7 @@ typedef enum { MemoryTypeDdr5 = 0x22, MemoryTypeLpddr5 = 0x23, MemoryTypeHBM3 = 0x24, - MemoryTypeMrDimm = 0x25 + MemoryTypeMrDimm = 0x25 ///< SMBIOS spec 3.9.0 CR248 } MEMORY_DEVICE_TYPE; /// @@ -1946,7 +1969,7 @@ typedef enum { // Optane DC Persistent Memory in SMBIOS spec 3.4.0 // MemoryTechnologyIntelOptanePersistentMemory = 0x07, - MemoryTechnologyMrDimmDeprecated = 0x08 + MemoryTechnologyMrDimmDeprecated = 0x08 ///< SMBIOS spec 3.9.0 CR248 } MEMORY_DEVICE_TECHNOLOGY; /// From 406aeb5a974689b6a15bb69d140296c8c259ab50 Mon Sep 17 00:00:00 2001 From: Giri Mudusuru Date: Sat, 23 Aug 2025 21:28:56 -0700 Subject: [PATCH 0440/1172] ShellPkg/SmbiosView: Add decode for DSP0134 SMBIOS Spec v3.9.0 Add decode for Type17 Memory based on SMBIOS Spec v3.9.0 Signed-off-by: Giri Mudusuru --- .../UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c index b8c685245eb8..0bb98785e45a 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c @@ -2,6 +2,7 @@ Build a table, each item is (Key, Info) pair. And give a interface of query a string out of a table. + Copyright (c) Microsoft Corporation. All rights reserved.
Copyright (c) 2005 - 2024, Intel Corporation. All rights reserved.
(C) Copyright 2016-2019 Hewlett Packard Enterprise Development LP
Copyright (c) 2023-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. @@ -2752,6 +2753,14 @@ TABLE_ITEM MemoryDeviceFormFactorTable[] = { { MemoryFormFactorCamm, L" CAMM" + }, + { + MemoryFormFactorCuDimm, + L" CUDIMM" + }, + { + MemoryFormFactorCsoDimm, + L" CSODIMM" } }; From 3b0d834db286a236fd22c41923fc271fc44ead5f Mon Sep 17 00:00:00 2001 From: Tom Lendacky Date: Tue, 12 Aug 2025 14:43:32 -0500 Subject: [PATCH 0441/1172] OvmfPkg/MemEncryptSevLib: Evict cache lines during SNP memory validation An SNP cache coherency vulnerability may require a mitigation to evict cache lines after memory has been validated. Perform this mitigation after having validated memory. CVE-2024-36331 Signed-off-by: Michael Roth Co-developed-by: Tom Lendacky Signed-off-by: Tom Lendacky --- .../X64/SnpPageStateChangeInternal.c | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/SnpPageStateChangeInternal.c b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/SnpPageStateChangeInternal.c index e073f3937c41..7b6ba063df13 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/SnpPageStateChangeInternal.c +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/SnpPageStateChangeInternal.c @@ -22,6 +22,8 @@ #include "SnpPageStateChange.h" +#define PAGES_PER_2MB_ENTRY 512 + STATIC UINTN MemoryStateToGhcbOp ( @@ -213,6 +215,33 @@ PageStateChange ( } } +STATIC +VOID +SevEvictCache ( + IN EFI_PHYSICAL_ADDRESS Address, + IN UINTN NumPages + ) +{ + #if defined (__GNUC__) || defined (__clang__) + volatile UINT8 Val __attribute__ ((__unused__)); + #else + volatile UINT8 Val; + #endif + UINT8 *Bytes = (UINT8 *)Address; + UINTN PageIdx; + + /* + * For SEV guests, a read from the first/last cache-lines of a 4K page + * using the guest key is sufficient to cause a flush of all cache-lines + * associated with that 4K page without incurring all the overhead of a + * full CLFLUSH sequence. + */ + for (PageIdx = 0; PageIdx < NumPages; PageIdx++) { + Val = Bytes[PageIdx * SIZE_4KB]; + Val = Bytes[PageIdx * SIZE_4KB + SIZE_4KB - 1]; + } +} + /** The function is used to set the page state when SEV-SNP is active. The page state transition consist of changing the page ownership in the RMP table, and using the @@ -231,8 +260,12 @@ InternalSetPageState ( IN UINTN PscBufferSize ) { - EFI_PHYSICAL_ADDRESS NextAddress, EndAddress; + EFI_PHYSICAL_ADDRESS NextAddress; + EFI_PHYSICAL_ADDRESS EndAddress; + EFI_PHYSICAL_ADDRESS Address; SNP_PAGE_STATE_CHANGE_INFO *Info; + UINTN RmpPageSize; + UINTN Index; EndAddress = BaseAddress + EFI_PAGES_TO_SIZE (NumPages); @@ -281,6 +314,12 @@ InternalSetPageState ( // if (State == SevSnpPagePrivate) { AmdSvsmSnpPvalidate (Info); + + for (Index = 0; Index <= Info->Header.EndEntry; Index++) { + Address = LShiftU64 ((UINT64)Info->Entry[Index].GuestFrameNumber, EFI_PAGE_SHIFT); + RmpPageSize = Info->Entry[Index].PageSize; + SevEvictCache (Address, RmpPageSize == PvalidatePageSize2MB ? PAGES_PER_2MB_ENTRY : 1); + } } } } From 07ba06fdf7c3e6314aa8b3d7341e7910a469dbb2 Mon Sep 17 00:00:00 2001 From: Tom Lendacky Date: Tue, 22 Jul 2025 16:59:44 -0500 Subject: [PATCH 0442/1172] MdePkg: Add the COHERENCY_SFW_NO CPUID bit field Update the CPUID 0x8000001F EBX definition to add the COHERENCY_SFW_NO bit field. The COHERENCY_SFW_NO bit is used to indicate that the SEV-SNP cache coherency mitigation is not needed. Signed-off-by: Tom Lendacky --- MdePkg/Include/Register/Amd/Cpuid.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/MdePkg/Include/Register/Amd/Cpuid.h b/MdePkg/Include/Register/Amd/Cpuid.h index fdcbc475d534..0313ee2789e6 100644 --- a/MdePkg/Include/Register/Amd/Cpuid.h +++ b/MdePkg/Include/Register/Amd/Cpuid.h @@ -701,9 +701,14 @@ typedef union { UINT32 ReducedPhysBits : 5; /// - /// [Bit 31:12] Reserved + /// [Bit 30:12] Reserved /// - UINT32 ReservedBits : 21; + UINT32 ReservedBits : 20; + + /// + /// [Bit 31] SEV-SNP Cache Coherency Mitigation is not needed + /// + UINT32 CoherencySfwNo : 1; } Bits; /// /// All bit fields as a 32-bit value From f41f938b35dec30a88c8509dbfce5ddd87472e24 Mon Sep 17 00:00:00 2001 From: Tom Lendacky Date: Tue, 22 Jul 2025 13:38:22 -0500 Subject: [PATCH 0443/1172] OvmfPkg/ResetVector: Make ReceivedVc a flag in SEV-ES workarea In preparation for adding another indicator flag, change the ReceivedVc field into a flags field. Since the code is used by both assembler and C files, use bitmasks for field definitions. The VC flag is bit 0. Signed-off-by: Tom Lendacky --- OvmfPkg/Include/WorkArea.h | 10 ++++++---- OvmfPkg/ResetVector/Ia32/AmdSev.asm | 10 +++++----- OvmfPkg/ResetVector/ResetVector.nasmb | 3 ++- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/OvmfPkg/Include/WorkArea.h b/OvmfPkg/Include/WorkArea.h index 3b9ea0463099..9f3a4517bd66 100644 --- a/OvmfPkg/Include/WorkArea.h +++ b/OvmfPkg/Include/WorkArea.h @@ -50,11 +50,11 @@ typedef struct _SEC_SEV_ES_WORK_AREA { UINT64 EncryptionMask; + // Flags: + // - BIT0 - VC: Indicator that the VC handler was called. It is used + // during the SevFeature detection in OvmfPkg/ResetVector/Ia32/AmdSev.asm // - // Indicator that the VC handler is called. It is used during the SevFeature - // detection in OvmfPkg/ResetVector/Ia32/AmdSev.c - // - UINT8 ReceivedVc; + UINT8 Flags; UINT8 Reserved[7]; // Used by SEC to generate Page State Change requests. This should be @@ -64,6 +64,8 @@ typedef struct _SEC_SEV_ES_WORK_AREA { UINT8 WorkBuffer[1024]; } SEC_SEV_ES_WORK_AREA; +#define SEV_ES_WORK_AREA_VC BIT0 + // // The SEV work area definition. // diff --git a/OvmfPkg/ResetVector/Ia32/AmdSev.asm b/OvmfPkg/ResetVector/Ia32/AmdSev.asm index 827c874312a2..de09a59ef7fb 100644 --- a/OvmfPkg/ResetVector/Ia32/AmdSev.asm +++ b/OvmfPkg/ResetVector/Ia32/AmdSev.asm @@ -306,9 +306,9 @@ NoSev: ; Perform an SEV-ES sanity check by seeing if a #VC exception occurred. ; ; If SEV-ES is enabled, the CPUID instruction will trigger a #VC exception - ; where the RECEIVED_VC offset in the workarea will be set to one. + ; where the VC bit in the FLAGS field in the workarea will be set to one. ; - cmp byte[SEV_ES_WORK_AREA_RECEIVED_VC], 0 + test byte[SEV_ES_WORK_AREA_FLAGS], SEV_ES_WORK_AREA_FLAG_VC jz NoSevPass ; @@ -402,9 +402,9 @@ SevEsIdtVmmComm: ; If we're here, then we are an SEV-ES guest and this ; was triggered by a CPUID instruction ; - ; Set the recievedVc field in the workarea to communicate that - ; a #VC was taken. - mov byte[SEV_ES_WORK_AREA_RECEIVED_VC], 1 + ; Set the VC bit in the FLAGS field in the workarea to communicate + ; that a #VC was taken. + or byte[SEV_ES_WORK_AREA_FLAGS], SEV_ES_WORK_AREA_FLAG_VC pop ecx ; Error code cmp ecx, 0x72 ; Be sure it was CPUID diff --git a/OvmfPkg/ResetVector/ResetVector.nasmb b/OvmfPkg/ResetVector/ResetVector.nasmb index 7279ac64b17a..a63b859f39a0 100644 --- a/OvmfPkg/ResetVector/ResetVector.nasmb +++ b/OvmfPkg/ResetVector/ResetVector.nasmb @@ -63,7 +63,8 @@ %define SEV_ES_WORK_AREA_STATUS_MSR (FixedPcdGet32 (PcdSevEsWorkAreaBase)) %define SEV_ES_WORK_AREA_RDRAND (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 8) %define SEV_ES_WORK_AREA_ENC_MASK (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 16) -%define SEV_ES_WORK_AREA_RECEIVED_VC (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 24) +%define SEV_ES_WORK_AREA_FLAGS (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 24) +%define SEV_ES_WORK_AREA_FLAG_VC 0x01 %define SEV_ES_VC_TOP_OF_STACK (FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) + FixedPcdGet32 (PcdOvmfSecPeiTempRamSize)) %define SEV_SNP_SECRETS_BASE (FixedPcdGet32 (PcdOvmfSnpSecretsBase)) %define SEV_SNP_SECRETS_SIZE (FixedPcdGet32 (PcdOvmfSnpSecretsSize)) From 20f24c0f67b3364cd590e1eea470f74be40e7710 Mon Sep 17 00:00:00 2001 From: Tom Lendacky Date: Tue, 22 Jul 2025 15:06:18 -0500 Subject: [PATCH 0444/1172] OvmfPkg/MemEncryptSevLib: Check if SEV-SNP coherency mitigitation is needed CPUID bit Fn8000001F_EBX[31] defines the COHERNECY_SFW_NO CPUID bit that, when set, indicates that the software mitigation for this vulnerability is not needed. Add support to check for this CPUID bit and avoid the mitigation if set. Signed-off-by: Tom Lendacky --- OvmfPkg/Include/Library/MemEncryptSevLib.h | 14 +++++ OvmfPkg/Include/WorkArea.h | 5 +- .../DxeMemEncryptSevLibInternal.c | 54 +++++++++++++++++-- .../PeiMemEncryptSevLibInternal.c | 25 +++++++++ .../SecMemEncryptSevLibInternal.c | 25 +++++++++ .../X64/SnpPageStateChangeInternal.c | 10 ++-- OvmfPkg/ResetVector/Ia32/AmdSev.asm | 10 ++++ OvmfPkg/ResetVector/ResetVector.nasmb | 1 + 8 files changed, 135 insertions(+), 9 deletions(-) diff --git a/OvmfPkg/Include/Library/MemEncryptSevLib.h b/OvmfPkg/Include/Library/MemEncryptSevLib.h index c5653539d8d8..d3d4f6fa9ada 100644 --- a/OvmfPkg/Include/Library/MemEncryptSevLib.h +++ b/OvmfPkg/Include/Library/MemEncryptSevLib.h @@ -178,6 +178,20 @@ MemEncryptSevEsDebugVirtualizationIsEnabled ( VOID ); +/** + Returns a boolean to indicate whether the SEV-SNP cache line eviction + mitigation is needed. + + @retval TRUE Cache line eviction mitigation required + @retval FALSE Cache line eviction migigation not required + +**/ +BOOLEAN +EFIAPI +MemEncryptSevSnpDoCoherencyMitigation ( + VOID + ); + /** Returns the encryption state of the specified virtual address range. diff --git a/OvmfPkg/Include/WorkArea.h b/OvmfPkg/Include/WorkArea.h index 9f3a4517bd66..297e54f36e49 100644 --- a/OvmfPkg/Include/WorkArea.h +++ b/OvmfPkg/Include/WorkArea.h @@ -53,6 +53,8 @@ typedef struct _SEC_SEV_ES_WORK_AREA { // Flags: // - BIT0 - VC: Indicator that the VC handler was called. It is used // during the SevFeature detection in OvmfPkg/ResetVector/Ia32/AmdSev.asm + // - BIT1 - CSFW_NO: Indicator that the SEV-SNP cache line evication + // mitigation is not needed. // UINT8 Flags; UINT8 Reserved[7]; @@ -64,7 +66,8 @@ typedef struct _SEC_SEV_ES_WORK_AREA { UINT8 WorkBuffer[1024]; } SEC_SEV_ES_WORK_AREA; -#define SEV_ES_WORK_AREA_VC BIT0 +#define SEV_ES_WORK_AREA_FLAG_VC BIT0 +#define SEV_ES_WORK_AREA_FLAG_CSFW_NO BIT1 // // The SEV work area definition. diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLibInternal.c b/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLibInternal.c index 9947d663deae..aace322e5aa0 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLibInternal.c +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLibInternal.c @@ -18,10 +18,12 @@ #include #include -STATIC UINT64 mCurrentAttr = 0; -STATIC BOOLEAN mCurrentAttrRead = FALSE; -STATIC UINT64 mSevEncryptionMask = 0; -STATIC BOOLEAN mSevEncryptionMaskSaved = FALSE; +STATIC UINT64 mCurrentAttr = 0; +STATIC BOOLEAN mCurrentAttrRead = FALSE; +STATIC UINT64 mSevEncryptionMask = 0; +STATIC BOOLEAN mSevEncryptionMaskSaved = FALSE; +STATIC BOOLEAN mSevSnpCoherencySfwNo = FALSE; +STATIC BOOLEAN mSevSnpCoherencySfwNoRead = FALSE; /** The function check if the specified Attr is set. @@ -180,3 +182,47 @@ MemEncryptSevEsDebugVirtualizationIsEnabled ( { return ConfidentialComputingGuestHas (CCAttrFeatureAmdSevEsDebugVirtualization); } + +/** + Returns a boolean to indicate if the CPUID COHERENCY_SFW_NO bit is set. + + @retval TRUE The COHERENCY_SFW_NO bit is set. + @retval FALSE The COHERENCY_SFW_NO bit is not set. + +**/ +STATIC +BOOLEAN +MemEncryptCoherencSfwNo ( + VOID + ) +{ + CPUID_MEMORY_ENCRYPTION_INFO_EBX RegEbx; + + if (!mSevSnpCoherencySfwNoRead) { + AsmCpuid (0x8000001F, NULL, &RegEbx.Uint32, NULL, NULL); + if (RegEbx.Bits.CoherencySfwNo == 1) { + mSevSnpCoherencySfwNo = TRUE; + } + + mSevSnpCoherencySfwNoRead = TRUE; + } + + return mSevSnpCoherencySfwNo; +} + +/** + Returns a boolean to indicate whether the SEV-SNP cache line eviction + mitigation is needed. + + @retval TRUE Cache line eviction mitigation required + @retval FALSE Cache line eviction migigation not required + +**/ +BOOLEAN +EFIAPI +MemEncryptSevSnpDoCoherencyMitigation ( + VOID + ) +{ + return MemEncryptSevSnpIsEnabled () && !MemEncryptCoherencSfwNo (); +} diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLibInternal.c b/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLibInternal.c index f381b9255bb7..3eeb4831ab3f 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLibInternal.c +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLibInternal.c @@ -160,3 +160,28 @@ MemEncryptSevEsDebugVirtualizationIsEnabled ( return Msr.Bits.DebugVirtualization ? TRUE : FALSE; } + +/** + Returns a boolean to indicate whether the SEV-SNP cache line eviction + mitigation is needed. + + @retval TRUE Cache line eviction mitigation required + @retval FALSE Cache line eviction migigation not required + +**/ +BOOLEAN +EFIAPI +MemEncryptSevSnpDoCoherencyMitigation ( + VOID + ) +{ + SEC_SEV_ES_WORK_AREA *SevEsWorkArea; + + SevEsWorkArea = GetSevEsWorkArea (); + if (SevEsWorkArea == NULL) { + return FALSE; + } + + return MemEncryptSevSnpIsEnabled () && + ((SevEsWorkArea->Flags & SEV_ES_WORK_AREA_FLAG_CSFW_NO) == 0); +} diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLibInternal.c b/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLibInternal.c index 946bed2ada13..05c93de3e517 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLibInternal.c +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLibInternal.c @@ -161,6 +161,31 @@ MemEncryptSevEsDebugVirtualizationIsEnabled ( return Msr.Bits.DebugVirtualization ? TRUE : FALSE; } +/** + Returns a boolean to indicate whether the SEV-SNP cache line eviction + mitigation is needed. + + @retval TRUE Cache line eviction mitigation required + @retval FALSE Cache line eviction migigation not required + +**/ +BOOLEAN +EFIAPI +MemEncryptSevSnpDoCoherencyMitigation ( + VOID + ) +{ + SEC_SEV_ES_WORK_AREA *SevEsWorkArea; + + SevEsWorkArea = GetSevEsWorkArea (); + if (SevEsWorkArea == NULL) { + return FALSE; + } + + return MemEncryptSevSnpIsEnabled () && + ((SevEsWorkArea->Flags & SEV_ES_WORK_AREA_FLAG_CSFW_NO) == 0); +} + /** Locate the page range that covers the initial (pre-SMBASE-relocation) SMRAM Save State Map. diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/SnpPageStateChangeInternal.c b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/SnpPageStateChangeInternal.c index 7b6ba063df13..ef3aec4b3087 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/SnpPageStateChangeInternal.c +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/SnpPageStateChangeInternal.c @@ -315,10 +315,12 @@ InternalSetPageState ( if (State == SevSnpPagePrivate) { AmdSvsmSnpPvalidate (Info); - for (Index = 0; Index <= Info->Header.EndEntry; Index++) { - Address = LShiftU64 ((UINT64)Info->Entry[Index].GuestFrameNumber, EFI_PAGE_SHIFT); - RmpPageSize = Info->Entry[Index].PageSize; - SevEvictCache (Address, RmpPageSize == PvalidatePageSize2MB ? PAGES_PER_2MB_ENTRY : 1); + if (MemEncryptSevSnpDoCoherencyMitigation ()) { + for (Index = 0; Index <= Info->Header.EndEntry; Index++) { + Address = LShiftU64 ((UINT64)Info->Entry[Index].GuestFrameNumber, EFI_PAGE_SHIFT); + RmpPageSize = Info->Entry[Index].PageSize; + SevEvictCache (Address, RmpPageSize == PvalidatePageSize2MB ? PAGES_PER_2MB_ENTRY : 1); + } } } } diff --git a/OvmfPkg/ResetVector/Ia32/AmdSev.asm b/OvmfPkg/ResetVector/Ia32/AmdSev.asm index de09a59ef7fb..22b696419a90 100644 --- a/OvmfPkg/ResetVector/Ia32/AmdSev.asm +++ b/OvmfPkg/ResetVector/Ia32/AmdSev.asm @@ -249,9 +249,19 @@ ClearSevEsWorkArea: ; Check for SEV memory encryption feature: ; CPUID Fn8000_001F[EAX] - Bit 1 + ; Check for the COHERENCY_SFW_NO feature: + ; CPUID Fn8000_001F[EBX] - Bit 31 ; CPUID raises a #VC exception if running as an SEV-ES guest mov eax, 0x8000001f cpuid + + ; If COHERENCY_SFW_NO is set, set the CSFW_NO bit in the FLAGS field + ; of the workarea (this can be set regardless of whether SEV is enabled). + bt ebx, 31 + jnc CheckSev + or byte[SEV_ES_WORK_AREA_FLAGS], SEV_ES_WORK_AREA_FLAG_CSFW_NO + +CheckSev: bt eax, 1 jnc NoSev diff --git a/OvmfPkg/ResetVector/ResetVector.nasmb b/OvmfPkg/ResetVector/ResetVector.nasmb index a63b859f39a0..956116fbda7a 100644 --- a/OvmfPkg/ResetVector/ResetVector.nasmb +++ b/OvmfPkg/ResetVector/ResetVector.nasmb @@ -65,6 +65,7 @@ %define SEV_ES_WORK_AREA_ENC_MASK (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 16) %define SEV_ES_WORK_AREA_FLAGS (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 24) %define SEV_ES_WORK_AREA_FLAG_VC 0x01 +%define SEV_ES_WORK_AREA_FLAG_CSFW_NO 0x02 %define SEV_ES_VC_TOP_OF_STACK (FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) + FixedPcdGet32 (PcdOvmfSecPeiTempRamSize)) %define SEV_SNP_SECRETS_BASE (FixedPcdGet32 (PcdOvmfSnpSecretsBase)) %define SEV_SNP_SECRETS_SIZE (FixedPcdGet32 (PcdOvmfSnpSecretsSize)) From 1fb88ffe284782cc79e306306b8d19829b6248b7 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 25 Aug 2025 11:24:03 -0700 Subject: [PATCH 0445/1172] OvmfPkg: Remove OVMF IA32 This commit removes OVMF IA32 from edk2 per RFC https://edk2.groups.io/g/devel/topic/rfc_remove_ovmf_ia32_and/114152215. OVMF IA32 is a 32 bit only platform that no longer represents the vast majority of physical platforms. The RFC details more reasoning in much more depth. OVMF IA32 will be kept in a branch off the edk2-stable202508 tag for any long term consumers; it will receive build break updates only (e.g. if an upstream submodule changes location). Signed-off-by: Oliver Smith-Denny --- OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf | 2 +- .../Bhyve/AcpiPlatformDxe/AcpiPlatformDxe.inf | 2 +- OvmfPkg/Bhyve/AcpiTables/AcpiTables.inf | 2 +- OvmfPkg/Bhyve/BhyveRfbDxe/BhyveRfbDxe.inf | 2 +- OvmfPkg/Bhyve/PlatformPei/MemDetect.c | 22 - .../SmbiosPlatformDxe/SmbiosPlatformDxe.inf | 2 +- OvmfPkg/CpuS3DataDxe/CpuS3DataDxe.inf | 2 +- OvmfPkg/Include/IndustryStandard/QemuFwCfg.h | 3 +- OvmfPkg/Include/IndustryStandard/Xen/README | 4 +- .../IndustryStandard/Xen/arch-x86/xen.h | 7 +- .../Include/IndustryStandard/Xen/hvm/params.h | 2 +- .../Include/IndustryStandard/Xen/io/blkif.h | 14 - .../IndustryStandard/Xen/io/protocols.h | 5 +- OvmfPkg/Include/IndustryStandard/Xen/xen.h | 2 +- .../DxeMemEncryptSevLib.inf | 7 +- .../DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf | 2 +- .../EmuVariableFvbLib/EmuVariableFvbLib.inf | 2 +- .../LoadLinuxLib/Ia32/JumpToKernel.nasm | 43 - .../LoadLinuxLib/{X64 => }/JumpToKernel.nasm | 0 OvmfPkg/Library/LoadLinuxLib/Linux.c | 16 +- OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf | 9 +- OvmfPkg/Library/NestedInterruptTplLib/Iret.c | 16 - .../Library/NvVarsFileLib/NvVarsFileLib.inf | 2 +- .../PciHostBridgeLib/PciHostBridgeLib.inf | 2 +- .../PciHostBridgeLibScan.inf | 2 +- .../PciHostBridgeUtilityLib.inf | 2 +- .../PlatformBootManagerLib.inf | 4 +- .../PlatformBootManagerLibBhyve.inf | 4 +- .../PlatformDebugLibIoPort.inf | 2 +- .../PlatformFvbLibNull/PlatformFvbLibNull.inf | 2 +- .../PlatformSecureLib/PlatformSecureLib.inf | 2 +- .../QemuBootOrderLib/QemuBootOrderLib.inf | 2 +- .../Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf | 2 +- .../QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf | 2 +- .../ResetSystemLib/DxeResetSystemLib.inf | 2 +- .../DxeResetSystemLibMicrovm.inf | 2 +- .../ResetSystemLib/DxeResetSystemLibXen.inf | 2 +- .../DetectSmbiosVersionLib.inf | 2 +- .../SmmCpuPlatformHookLibQemu.inf | 2 +- .../DxeTcg2PhysicalPresenceLib.inf | 2 +- .../TlsAuthConfigLib/TlsAuthConfigLib.inf | 2 +- .../X86QemuLoadImageLib/X86QemuLoadImageLib.c | 37 +- .../XenHypercallLib/Ia32/hypercall.nasm | 48 - .../XenHypercallLib/XenHypercallLib.inf | 11 +- .../LinuxInitrdDynamicShellCommand.inf | 2 +- OvmfPkg/OvmfPkgIa32.dsc | 936 ------------------ OvmfPkg/OvmfPkgIa32.fdf | 494 --------- .../PlatformCI/.azurepipelines/Ubuntu-GCC.yml | 22 - .../PlatformCI/.azurepipelines/Windows-VS.yml | 22 - OvmfPkg/PlatformCI/PlatformBuild.py | 6 +- OvmfPkg/PlatformCI/PlatformBuildLib.py | 6 +- OvmfPkg/PlatformCI/ReadMe.md | 7 - OvmfPkg/PlatformPei/MemDetect.c | 22 - .../FvbServicesRuntimeDxe.inf | 2 +- .../FvbServicesSmm.inf | 2 +- .../FvbServicesStandaloneMm.inf | 2 +- OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf | 2 +- OvmfPkg/README | 13 +- .../Library/FmpDeviceLib/FmpDeviceLib.inf | 2 +- OvmfPkg/SioBusDxe/SioBusDxe.inf | 2 +- .../SmbiosPlatformDxe/SmbiosPlatformDxe.inf | 2 +- .../XenSmbiosPlatformDxe.inf | 10 +- OvmfPkg/SmmAccess/SmmAccess2Dxe.inf | 2 +- OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf | 2 +- .../XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf | 2 +- OvmfPkg/XenPlatformPei/MemDetect.c | 10 - OvmfPkg/build.sh | 23 - 67 files changed, 75 insertions(+), 1822 deletions(-) delete mode 100644 OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.nasm rename OvmfPkg/Library/LoadLinuxLib/{X64 => }/JumpToKernel.nasm (100%) delete mode 100644 OvmfPkg/Library/XenHypercallLib/Ia32/hypercall.nasm delete mode 100644 OvmfPkg/OvmfPkgIa32.dsc delete mode 100644 OvmfPkg/OvmfPkgIa32.fdf diff --git a/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf b/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf index 622589e607e9..928990b43d3a 100644 --- a/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf +++ b/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf @@ -17,7 +17,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# VALID_ARCHITECTURES = X64 ARM AARCH64 # [Sources] diff --git a/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatformDxe.inf b/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatformDxe.inf index 2e228d815b87..b82a61a25ae8 100644 --- a/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatformDxe.inf +++ b/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatformDxe.inf @@ -18,7 +18,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC +# VALID_ARCHITECTURES = X64 EBC # [Sources] diff --git a/OvmfPkg/Bhyve/AcpiTables/AcpiTables.inf b/OvmfPkg/Bhyve/AcpiTables/AcpiTables.inf index f422793f4938..c33b17afa493 100644 --- a/OvmfPkg/Bhyve/AcpiTables/AcpiTables.inf +++ b/OvmfPkg/Bhyve/AcpiTables/AcpiTables.inf @@ -21,7 +21,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC +# VALID_ARCHITECTURES = X64 EBC # [Sources] diff --git a/OvmfPkg/Bhyve/BhyveRfbDxe/BhyveRfbDxe.inf b/OvmfPkg/Bhyve/BhyveRfbDxe/BhyveRfbDxe.inf index d4016605f343..49ccec13b0e1 100644 --- a/OvmfPkg/Bhyve/BhyveRfbDxe/BhyveRfbDxe.inf +++ b/OvmfPkg/Bhyve/BhyveRfbDxe/BhyveRfbDxe.inf @@ -21,7 +21,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC +# VALID_ARCHITECTURES = X64 EBC # # DRIVER_BINDING = gEmuGopDriverBinding # COMPONENT_NAME = gEmuGopComponentName diff --git a/OvmfPkg/Bhyve/PlatformPei/MemDetect.c b/OvmfPkg/Bhyve/PlatformPei/MemDetect.c index 351862942d3e..fd7558a46162 100644 --- a/OvmfPkg/Bhyve/PlatformPei/MemDetect.c +++ b/OvmfPkg/Bhyve/PlatformPei/MemDetect.c @@ -162,18 +162,6 @@ GetFirstNonAddress ( FirstNonAddress = BASE_4GB + GetSystemMemorySizeAbove4gb (); - // - // If DXE is 32-bit, then we're done; PciBusDxe will degrade 64-bit MMIO - // resources to 32-bit anyway. See DegradeResource() in - // "PciResourceSupport.c". - // - #ifdef MDE_CPU_IA32 - if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) { - return FirstNonAddress; - } - - #endif - // // Otherwise, in order to calculate the highest address plus one, we must // consider the 64-bit PCI host aperture too. Fetch the default size. @@ -297,16 +285,6 @@ GetPeiMemoryCap ( UINT32 PdpEntries; UINTN TotalPages; - // - // If DXE is 32-bit, then just return the traditional 64 MB cap. - // - #ifdef MDE_CPU_IA32 - if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) { - return SIZE_64MB; - } - - #endif - // // Dependent on physical address width, PEI memory allocations can be // dominated by the page tables built for 64-bit DXE. So we key the cap off diff --git a/OvmfPkg/Bhyve/SmbiosPlatformDxe/SmbiosPlatformDxe.inf b/OvmfPkg/Bhyve/SmbiosPlatformDxe/SmbiosPlatformDxe.inf index 12deae7825e6..f6d7b5b3054c 100644 --- a/OvmfPkg/Bhyve/SmbiosPlatformDxe/SmbiosPlatformDxe.inf +++ b/OvmfPkg/Bhyve/SmbiosPlatformDxe/SmbiosPlatformDxe.inf @@ -21,7 +21,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 +# VALID_ARCHITECTURES = X64 EBC ARM AARCH64 # [Sources] diff --git a/OvmfPkg/CpuS3DataDxe/CpuS3DataDxe.inf b/OvmfPkg/CpuS3DataDxe/CpuS3DataDxe.inf index 5369613f5d9b..5240db6e0313 100644 --- a/OvmfPkg/CpuS3DataDxe/CpuS3DataDxe.inf +++ b/OvmfPkg/CpuS3DataDxe/CpuS3DataDxe.inf @@ -27,7 +27,7 @@ # The following information is for reference only and not required by the build # tools. # -# VALID_ARCHITECTURES = IA32 X64 +# VALID_ARCHITECTURES = X64 [Sources] CpuS3Data.c diff --git a/OvmfPkg/Include/IndustryStandard/QemuFwCfg.h b/OvmfPkg/Include/IndustryStandard/QemuFwCfg.h index 9adf158c22a5..c2e7e2f9209d 100644 --- a/OvmfPkg/Include/IndustryStandard/QemuFwCfg.h +++ b/OvmfPkg/Include/IndustryStandard/QemuFwCfg.h @@ -37,8 +37,7 @@ #define FW_CFG_DMA_CTL_WRITE BIT4 // -// The fw_cfg registers can be found at these IO Ports, on the IO-mapped -// platforms (Ia32 and X64). +// The fw_cfg registers can be found at these IO Ports // #define FW_CFG_IO_SELECTOR 0x510 #define FW_CFG_IO_DATA 0x511 diff --git a/OvmfPkg/Include/IndustryStandard/Xen/README b/OvmfPkg/Include/IndustryStandard/Xen/README index 8cb7f715b7a1..9f1ca626631d 100644 --- a/OvmfPkg/Include/IndustryStandard/Xen/README +++ b/OvmfPkg/Include/IndustryStandard/Xen/README @@ -3,8 +3,7 @@ modification that are described in this README. The modifications that needed to be done are: - Use of ZeroMem() or SetMem() instead of memset(). -- If a struct is using a 64bit field, then a #pragma(4) might be needed - for IA32, like in io/blkif.h. +- Drop any i386 references as OVMF Xen support is only for x64. - Replace the types with the ones used in UEFI. @@ -33,5 +32,4 @@ s/([^a-zA-Z0-9_]|^)char([^a-zA-Z0-9_]|$)/\1CHAR8\2/g s/([^a-zA-Z0-9_]|^)unsigned long([^a-zA-Z0-9_]|$)/\1UINTN\2/g s/([^a-zA-Z0-9_]|^)long([^a-zA-Z0-9_]|$)/\1INTN\2/g -s/__i386__/MDE_CPU_IA32/g s/__x86_64__/MDE_CPU_X64/g diff --git a/OvmfPkg/Include/IndustryStandard/Xen/arch-x86/xen.h b/OvmfPkg/Include/IndustryStandard/Xen/arch-x86/xen.h index ecf2047ee8c2..87227cd728c3 100644 --- a/OvmfPkg/Include/IndustryStandard/Xen/arch-x86/xen.h +++ b/OvmfPkg/Include/IndustryStandard/Xen/arch-x86/xen.h @@ -43,9 +43,7 @@ #endif #define set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val) - #if defined (MDE_CPU_IA32) - #include "xen-x86_32.h" - #elif defined (MDE_CPU_X64) + #if defined (MDE_CPU_X64) #include "xen-x86_64.h" #endif @@ -66,9 +64,6 @@ typedef UINTN xen_ulong_t; typedef UINT64 tsc_timestamp_t; /* RDTSC timestamp */ - #ifdef MDE_CPU_IA32 - #pragma pack(4) - #endif struct arch_shared_info { UINTN max_pfn; /* max pfn that appears in table */ /* Frame containing list of mfns containing list of mfns containing p2m. */ diff --git a/OvmfPkg/Include/IndustryStandard/Xen/hvm/params.h b/OvmfPkg/Include/IndustryStandard/Xen/hvm/params.h index 19c75468fc97..cdac741b699e 100644 --- a/OvmfPkg/Include/IndustryStandard/Xen/hvm/params.h +++ b/OvmfPkg/Include/IndustryStandard/Xen/hvm/params.h @@ -38,7 +38,7 @@ #define HVM_PARAM_BUFIOREQ_PFN 6 #define HVM_PARAM_BUFIOREQ_EVTCHN 26 -#if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) +#if defined (MDE_CPU_X64) /* Expose Viridian interfaces to this HVM guest? */ #define HVM_PARAM_VIRIDIAN 9 diff --git a/OvmfPkg/Include/IndustryStandard/Xen/io/blkif.h b/OvmfPkg/Include/IndustryStandard/Xen/io/blkif.h index d97a6aad40fb..80aae96c346a 100644 --- a/OvmfPkg/Include/IndustryStandard/Xen/io/blkif.h +++ b/OvmfPkg/Include/IndustryStandard/Xen/io/blkif.h @@ -657,14 +657,6 @@ struct blkif_request_segment { * 'sector-size' xenstore node. Note however that the offset in * 'sector_number' must be aligned to 'sector-size'. */ -#if defined (MDE_CPU_IA32) -// -// pack(4) is necessary when these structs are compiled for Ia32. -// Without it, the struct will have a different alignment than the one -// a backend expect for a 32bit guest. -// - #pragma pack(4) -#endif struct blkif_request { UINT8 operation; /* BLKIF_OP_??? */ UINT8 nr_segments; /* number of segments */ @@ -709,9 +701,6 @@ struct blkif_request_indirect { blkif_sector_t sector_number; /* start sector idx on disk (r/w only) */ blkif_vdev_t handle; /* same as for read/write requests */ grant_ref_t indirect_grefs[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST]; - #ifdef MDE_CPU_IA32 - UINT64 pad; /* Make it 64 byte aligned on i386 */ - #endif }; typedef struct blkif_request_indirect blkif_request_indirect_t; @@ -723,9 +712,6 @@ struct blkif_response { }; typedef struct blkif_response blkif_response_t; -#if defined (MDE_CPU_IA32) - #pragma pack() -#endif /* * STATUS RETURN CODES. diff --git a/OvmfPkg/Include/IndustryStandard/Xen/io/protocols.h b/OvmfPkg/Include/IndustryStandard/Xen/io/protocols.h index 4ea3b42b981f..ead4c90a0761 100644 --- a/OvmfPkg/Include/IndustryStandard/Xen/io/protocols.h +++ b/OvmfPkg/Include/IndustryStandard/Xen/io/protocols.h @@ -7,13 +7,10 @@ #ifndef __XEN_PROTOCOLS_H__ #define __XEN_PROTOCOLS_H__ -#define XEN_IO_PROTO_ABI_X86_32 "x86_32-abi" #define XEN_IO_PROTO_ABI_X86_64 "x86_64-abi" #define XEN_IO_PROTO_ABI_ARM "arm-abi" -#if defined (MDE_CPU_IA32) -#define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_32 -#elif defined (MDE_CPU_X64) +#if defined (MDE_CPU_X64) #define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_64 #elif defined (__arm__) || defined (__aarch64__) #define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_ARM diff --git a/OvmfPkg/Include/IndustryStandard/Xen/xen.h b/OvmfPkg/Include/IndustryStandard/Xen/xen.h index f28a1d47fc09..fce87ffb584f 100644 --- a/OvmfPkg/Include/IndustryStandard/Xen/xen.h +++ b/OvmfPkg/Include/IndustryStandard/Xen/xen.h @@ -18,7 +18,7 @@ #include "xen-compat.h" -#if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) +#if defined (MDE_CPU_X64) #include "arch-x86/xen.h" #elif defined (__arm__) || defined (__aarch64__) #include "arch-arm/xen.h" diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf b/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf index 312ee73e5474..88067081dda2 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf @@ -20,7 +20,7 @@ # The following information is for reference only and not required by the build # tools. # -# VALID_ARCHITECTURES = IA32 X64 +# VALID_ARCHITECTURES = X64 # [Packages] @@ -32,8 +32,6 @@ [Sources] DxeMemEncryptSevLibInternal.c PeiDxeMemEncryptSevLibInternal.c - -[Sources.X64] X64/DxeSnpSystemRamValidate.c X64/MemEncryptSevLib.c X64/PeiDxeVirtualMemory.c @@ -41,9 +39,6 @@ X64/VirtualMemory.c X64/VirtualMemory.h -[Sources.IA32] - Ia32/MemEncryptSevLib.c - [LibraryClasses] BaseLib CacheMaintenanceLib diff --git a/OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf b/OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf index 4a8c0bac2373..d13f3925f3bd 100644 --- a/OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf +++ b/OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf @@ -22,7 +22,7 @@ LIBRARY_CLASS = PciLib|DXE_DRIVER DXE_RUNTIME_DRIVER SMM_CORE DXE_SMM_DRIVER UEFI_DRIVER UEFI_APPLICATION CONSTRUCTOR = InitializeConfigAccessMethod -# VALID_ARCHITECTURES = IA32 X64 +# VALID_ARCHITECTURES = X64 [Sources] PciLib.c diff --git a/OvmfPkg/Library/EmuVariableFvbLib/EmuVariableFvbLib.inf b/OvmfPkg/Library/EmuVariableFvbLib/EmuVariableFvbLib.inf index 4eb0f506ea3a..fc7454d1f546 100644 --- a/OvmfPkg/Library/EmuVariableFvbLib/EmuVariableFvbLib.inf +++ b/OvmfPkg/Library/EmuVariableFvbLib/EmuVariableFvbLib.inf @@ -21,7 +21,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC +# VALID_ARCHITECTURES = X64 EBC # [Sources] diff --git a/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.nasm b/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.nasm deleted file mode 100644 index ae5f5eb03e9f..000000000000 --- a/OvmfPkg/Library/LoadLinuxLib/Ia32/JumpToKernel.nasm +++ /dev/null @@ -1,43 +0,0 @@ -;------------------------------------------------------------------------------ -; -; Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.
-; -; SPDX-License-Identifier: BSD-2-Clause-Patent -; -;------------------------------------------------------------------------------ - - SECTION .text - -;------------------------------------------------------------------------------ -; VOID -; EFIAPI -; JumpToKernel ( -; VOID *KernelStart, -; VOID *KernelBootParams -; ); -;------------------------------------------------------------------------------ -global ASM_PFX(JumpToKernel) -ASM_PFX(JumpToKernel): - - mov esi, [esp + 8] - call DWORD [esp + 4] - ret - -;------------------------------------------------------------------------------ -; VOID -; EFIAPI -; JumpToUefiKernel ( -; EFI_HANDLE ImageHandle, -; EFI_SYSTEM_TABLE *SystemTable, -; VOID *KernelBootParams, -; VOID *KernelStart -; ); -;------------------------------------------------------------------------------ -global ASM_PFX(JumpToUefiKernel) -ASM_PFX(JumpToUefiKernel): - - mov eax, [esp + 12] - mov eax, [eax + 0x264] - add eax, [esp + 16] - jmp eax - diff --git a/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.nasm b/OvmfPkg/Library/LoadLinuxLib/JumpToKernel.nasm similarity index 100% rename from OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.nasm rename to OvmfPkg/Library/LoadLinuxLib/JumpToKernel.nasm diff --git a/OvmfPkg/Library/LoadLinuxLib/Linux.c b/OvmfPkg/Library/LoadLinuxLib/Linux.c index 0bc8e156d780..0e95c26837bd 100644 --- a/OvmfPkg/Library/LoadLinuxLib/Linux.c +++ b/OvmfPkg/Library/LoadLinuxLib/Linux.c @@ -370,19 +370,15 @@ SetupLinuxMemmap ( Bp->e820_entries = (UINT8)E820EntryCount; - Efi = &Bp->efi_info; - Efi->efi_systab = (UINT32)(UINTN)gST; - Efi->efi_memdesc_size = (UINT32)DescriptorSize; - Efi->efi_memdesc_version = DescriptorVersion; - Efi->efi_memmap = (UINT32)(UINTN)MemoryMapPtr; - Efi->efi_memmap_size = (UINT32)MemoryMapSize; - #ifdef MDE_CPU_IA32 - Efi->efi_loader_signature = SIGNATURE_32 ('E', 'L', '3', '2'); - #else + Efi = &Bp->efi_info; + Efi->efi_systab = (UINT32)(UINTN)gST; + Efi->efi_memdesc_size = (UINT32)DescriptorSize; + Efi->efi_memdesc_version = DescriptorVersion; + Efi->efi_memmap = (UINT32)(UINTN)MemoryMapPtr; + Efi->efi_memmap_size = (UINT32)MemoryMapSize; Efi->efi_systab_hi = (UINT32)(((UINT64)(UINTN)gST) >> 32); Efi->efi_memmap_hi = (UINT32)(((UINT64)(UINTN)MemoryMapPtr) >> 32); Efi->efi_loader_signature = SIGNATURE_32 ('E', 'L', '6', '4'); - #endif gBS->ExitBootServices (gImageHandle, MapKey); } diff --git a/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf b/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf index cc643373eaa4..5a457b31c4ca 100644 --- a/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf +++ b/OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf @@ -17,19 +17,14 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 +# VALID_ARCHITECTURES = X64 # [Sources.common] Linux.c LinuxGdt.c LoadLinuxLib.h - -[Sources.IA32] - Ia32/JumpToKernel.nasm - -[Sources.X64] - X64/JumpToKernel.nasm + JumpToKernel.nasm [Packages] MdePkg/MdePkg.dec diff --git a/OvmfPkg/Library/NestedInterruptTplLib/Iret.c b/OvmfPkg/Library/NestedInterruptTplLib/Iret.c index f6b2c51b6cc1..4ab274d69be5 100644 --- a/OvmfPkg/Library/NestedInterruptTplLib/Iret.c +++ b/OvmfPkg/Library/NestedInterruptTplLib/Iret.c @@ -38,22 +38,6 @@ DisableInterruptsOnIret ( Rflags.Bits.IF = 0; SystemContext.SystemContextX64->Rflags = Rflags.UintN; - #elif defined (MDE_CPU_IA32) - - IA32_EFLAGS32 Eflags; - - // - // Get flags from system context. - // - Eflags.UintN = SystemContext.SystemContextIa32->Eflags; - ASSERT (Eflags.Bits.IF); - - // - // Clear interrupts-enabled flag. - // - Eflags.Bits.IF = 0; - SystemContext.SystemContextIa32->Eflags = Eflags.UintN; - #else #error "Unsupported CPU" diff --git a/OvmfPkg/Library/NvVarsFileLib/NvVarsFileLib.inf b/OvmfPkg/Library/NvVarsFileLib/NvVarsFileLib.inf index 9ae40ffe4373..6508a67850e1 100644 --- a/OvmfPkg/Library/NvVarsFileLib/NvVarsFileLib.inf +++ b/OvmfPkg/Library/NvVarsFileLib/NvVarsFileLib.inf @@ -22,7 +22,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC +# VALID_ARCHITECTURES = X64 EBC # [Sources] diff --git a/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf b/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf index f9f182557453..228c08c6ce36 100644 --- a/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf +++ b/OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf @@ -21,7 +21,7 @@ # The following information is for reference only and not required by the build # tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC +# VALID_ARCHITECTURES = X64 EBC # [Sources] diff --git a/OvmfPkg/Library/PciHostBridgeLibScan/PciHostBridgeLibScan.inf b/OvmfPkg/Library/PciHostBridgeLibScan/PciHostBridgeLibScan.inf index a2ac5f93d193..1a7a2462b482 100644 --- a/OvmfPkg/Library/PciHostBridgeLibScan/PciHostBridgeLibScan.inf +++ b/OvmfPkg/Library/PciHostBridgeLibScan/PciHostBridgeLibScan.inf @@ -21,7 +21,7 @@ # The following information is for reference only and not required by the build # tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC +# VALID_ARCHITECTURES = X64 EBC # [Sources] diff --git a/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf b/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf index e4fc903121d8..727df4bdd063 100644 --- a/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf +++ b/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf @@ -23,7 +23,7 @@ # The following information is for reference only and not required by the build # tools. # -# VALID_ARCHITECTURES = IA32 X64 AARCH64 ARM +# VALID_ARCHITECTURES = X64 AARCH64 ARM # [Sources] diff --git a/OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf b/OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf index 8257862662db..9675eb081f56 100644 --- a/OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf +++ b/OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf @@ -17,7 +17,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC +# VALID_ARCHITECTURES = X64 EBC # [Sources] @@ -71,7 +71,7 @@ gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity ## CONSUMES gEfiMdePkgTokenSpaceGuid.PcdUartDefaultStopBits ## CONSUMES -[Pcd.IA32, Pcd.X64] +[Pcd.X64] gEfiMdePkgTokenSpaceGuid.PcdFSBClock [Protocols] diff --git a/OvmfPkg/Library/PlatformBootManagerLibBhyve/PlatformBootManagerLibBhyve.inf b/OvmfPkg/Library/PlatformBootManagerLibBhyve/PlatformBootManagerLibBhyve.inf index abfe4f97e42b..68b81b293eb0 100644 --- a/OvmfPkg/Library/PlatformBootManagerLibBhyve/PlatformBootManagerLibBhyve.inf +++ b/OvmfPkg/Library/PlatformBootManagerLibBhyve/PlatformBootManagerLibBhyve.inf @@ -19,7 +19,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC +# VALID_ARCHITECTURES = X64 EBC # [Sources] @@ -59,7 +59,7 @@ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut -[Pcd.IA32, Pcd.X64] +[Pcd.X64] gEfiMdePkgTokenSpaceGuid.PcdFSBClock [Protocols] diff --git a/OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf b/OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf index a8febf01ce94..e2c8f343c701 100644 --- a/OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf +++ b/OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf @@ -20,7 +20,7 @@ CONSTRUCTOR = PlatformDebugLibIoPortConstructor # -# VALID_ARCHITECTURES = IA32 X64 EBC +# VALID_ARCHITECTURES = X64 EBC # [Sources] diff --git a/OvmfPkg/Library/PlatformFvbLibNull/PlatformFvbLibNull.inf b/OvmfPkg/Library/PlatformFvbLibNull/PlatformFvbLibNull.inf index 2966af31bdbf..0778aad88d9e 100644 --- a/OvmfPkg/Library/PlatformFvbLibNull/PlatformFvbLibNull.inf +++ b/OvmfPkg/Library/PlatformFvbLibNull/PlatformFvbLibNull.inf @@ -21,7 +21,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC +# VALID_ARCHITECTURES = X64 EBC # [Sources] diff --git a/OvmfPkg/Library/PlatformSecureLib/PlatformSecureLib.inf b/OvmfPkg/Library/PlatformSecureLib/PlatformSecureLib.inf index 538a80d369f4..3d5245fe4722 100644 --- a/OvmfPkg/Library/PlatformSecureLib/PlatformSecureLib.inf +++ b/OvmfPkg/Library/PlatformSecureLib/PlatformSecureLib.inf @@ -18,7 +18,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC +# VALID_ARCHITECTURES = X64 EBC # [Sources] diff --git a/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.inf b/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.inf index 6e320e3e8514..0f32d8c838b6 100644 --- a/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.inf +++ b/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.inf @@ -20,7 +20,7 @@ # The following information is for reference only and not required by the build # tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 +# VALID_ARCHITECTURES = X64 EBC ARM AARCH64 # [Sources] diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf index 51326807ef3e..01d75a68e66f 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf @@ -23,7 +23,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 +# VALID_ARCHITECTURES = X64 # [Sources] diff --git a/OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf b/OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf index 10f41d64c6a1..a552e3cef05c 100644 --- a/OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf +++ b/OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf @@ -19,7 +19,7 @@ # The following information is for reference only and not required by the build # tools. # -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 EBC +# VALID_ARCHITECTURES = X64 ARM AARCH64 EBC # [Sources] diff --git a/OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf b/OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf index a9b4ce90000a..d96a76d420ea 100644 --- a/OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf +++ b/OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf @@ -20,7 +20,7 @@ # The following information is for reference only and not required by the build # tools. # -# VALID_ARCHITECTURES = IA32 X64 +# VALID_ARCHITECTURES = X64 # [Sources] diff --git a/OvmfPkg/Library/ResetSystemLib/DxeResetSystemLibMicrovm.inf b/OvmfPkg/Library/ResetSystemLib/DxeResetSystemLibMicrovm.inf index ac9c2599642c..98e54096e88f 100644 --- a/OvmfPkg/Library/ResetSystemLib/DxeResetSystemLibMicrovm.inf +++ b/OvmfPkg/Library/ResetSystemLib/DxeResetSystemLibMicrovm.inf @@ -20,7 +20,7 @@ # The following information is for reference only and not required by the build # tools. # -# VALID_ARCHITECTURES = IA32 X64 +# VALID_ARCHITECTURES = X64 # [Sources] diff --git a/OvmfPkg/Library/ResetSystemLib/DxeResetSystemLibXen.inf b/OvmfPkg/Library/ResetSystemLib/DxeResetSystemLibXen.inf index ccee69e6e1fa..901ebad80707 100644 --- a/OvmfPkg/Library/ResetSystemLib/DxeResetSystemLibXen.inf +++ b/OvmfPkg/Library/ResetSystemLib/DxeResetSystemLibXen.inf @@ -22,7 +22,7 @@ # The following information is for reference only and not required by the build # tools. # -# VALID_ARCHITECTURES = IA32 X64 +# VALID_ARCHITECTURES = X64 # [Sources] diff --git a/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf b/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf index 8417498d9e32..37ae827ec761 100644 --- a/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf +++ b/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf @@ -24,7 +24,7 @@ # The following information is for reference only and not required by the build # tools. # -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# VALID_ARCHITECTURES = X64 ARM AARCH64 # [Sources] diff --git a/OvmfPkg/Library/SmmCpuPlatformHookLibQemu/SmmCpuPlatformHookLibQemu.inf b/OvmfPkg/Library/SmmCpuPlatformHookLibQemu/SmmCpuPlatformHookLibQemu.inf index 413c56fce6e1..af727efc1a68 100644 --- a/OvmfPkg/Library/SmmCpuPlatformHookLibQemu/SmmCpuPlatformHookLibQemu.inf +++ b/OvmfPkg/Library/SmmCpuPlatformHookLibQemu/SmmCpuPlatformHookLibQemu.inf @@ -18,7 +18,7 @@ # The following information is for reference only and not required by the build # tools. # -# VALID_ARCHITECTURES = IA32 X64 +# VALID_ARCHITECTURES = X64 # [Sources] diff --git a/OvmfPkg/Library/Tcg2PhysicalPresenceLibQemu/DxeTcg2PhysicalPresenceLib.inf b/OvmfPkg/Library/Tcg2PhysicalPresenceLibQemu/DxeTcg2PhysicalPresenceLib.inf index 5b5417c32150..7cfc0804b2e2 100644 --- a/OvmfPkg/Library/Tcg2PhysicalPresenceLibQemu/DxeTcg2PhysicalPresenceLib.inf +++ b/OvmfPkg/Library/Tcg2PhysicalPresenceLibQemu/DxeTcg2PhysicalPresenceLib.inf @@ -36,7 +36,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC +# VALID_ARCHITECTURES = X64 EBC # [Sources] diff --git a/OvmfPkg/Library/TlsAuthConfigLib/TlsAuthConfigLib.inf b/OvmfPkg/Library/TlsAuthConfigLib/TlsAuthConfigLib.inf index a2ec42a3a480..94f8b94df127 100644 --- a/OvmfPkg/Library/TlsAuthConfigLib/TlsAuthConfigLib.inf +++ b/OvmfPkg/Library/TlsAuthConfigLib/TlsAuthConfigLib.inf @@ -24,7 +24,7 @@ # The following information is for reference only and not required by the build # tools. # -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# VALID_ARCHITECTURES = X64 ARM AARCH64 # [Sources] diff --git a/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c b/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c index 85faae69d17c..0ff8354ebdd1 100644 --- a/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c +++ b/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c @@ -640,36 +640,6 @@ QemuStartKernelImage ( NULL, // ExitDataSize NULL // ExitData ); - #ifdef MDE_CPU_IA32 - if (Status == EFI_UNSUPPORTED) { - EFI_HANDLE KernelImageHandle; - - // - // On IA32, EFI_UNSUPPORTED means that the image's machine type is X64 while - // we are expecting a IA32 one, and the StartImage () boot service is unable - // to handle it, either because the image does not have the special .compat - // PE/COFF section that Linux specifies for mixed mode capable images, or - // because we are running without the support code for that. So load the - // image again, using the legacy loader, and unload the normally loaded - // image before starting the legacy one. - // - Status = QemuLoadLegacyImage (&KernelImageHandle); - if (EFI_ERROR (Status)) { - // - // Note: no change to (*ImageHandle), the caller will release it. - // - return Status; - } - - // - // Swap in the legacy-loaded image. - // - QemuUnloadKernelImage (*ImageHandle); - *ImageHandle = KernelImageHandle; - return QemuStartLegacyImage (KernelImageHandle); - } - - #endif return Status; } @@ -717,10 +687,9 @@ QemuUnloadKernelImage ( } // - // We are unloading a normal, non-legacy loaded image, either on behalf of - // an external caller, or called from QemuStartKernelImage() on IA32, while - // switching from the normal to the legacy method to load and start a X64 - // image. + // We are unloading a normal, non-legacy loaded image, on behalf of an external + // caller while switching from the normal to the legacy method to load and + // start a X64 image. // if (KernelLoadedImage->LoadOptions != NULL) { FreePool (KernelLoadedImage->LoadOptions); diff --git a/OvmfPkg/Library/XenHypercallLib/Ia32/hypercall.nasm b/OvmfPkg/Library/XenHypercallLib/Ia32/hypercall.nasm deleted file mode 100644 index abcfcb55ce30..000000000000 --- a/OvmfPkg/Library/XenHypercallLib/Ia32/hypercall.nasm +++ /dev/null @@ -1,48 +0,0 @@ -SECTION .text - -; INTN -; EFIAPI -; __XenVmmcall2 ( -; IN INTN HypercallNum, -; IN OUT INTN Arg1, -; IN OUT INTN Arg2 -; ); -global ASM_PFX(__XenVmmcall2) -ASM_PFX(__XenVmmcall2): - ; Save only ebx, ecx is supposed to be a scratch register and needs to be - ; saved by the caller - push ebx - ; Copy HypercallNum to eax - mov eax, [esp + 8] - ; Copy Arg1 to the register expected by Xen - mov ebx, [esp + 12] - ; Copy Arg2 to the register expected by Xen - mov ecx, [esp + 16] - ; Call Hypercall - vmmcall - pop ebx - ret - -; INTN -; EFIAPI -; __XenVmcall2 ( -; IN INTN HypercallNum, -; IN OUT INTN Arg1, -; IN OUT INTN Arg2 -; ); -global ASM_PFX(__XenVmcall2) -ASM_PFX(__XenVmcall2): - ; Save only ebx, ecx is supposed to be a scratch register and needs to be - ; saved by the caller - push ebx - ; Copy HypercallNum to eax - mov eax, [esp + 8] - ; Copy Arg1 to the register expected by Xen - mov ebx, [esp + 12] - ; Copy Arg2 to the register expected by Xen - mov ecx, [esp + 16] - ; Call Hypercall - vmcall - pop ebx - ret - diff --git a/OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf b/OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf index 2321b61bf8f4..4d1739660c32 100644 --- a/OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf +++ b/OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf @@ -18,15 +18,12 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# VALID_ARCHITECTURES = X64 ARM AARCH64 # -[Sources.IA32, Sources.X64] +[Sources.X64] X86XenHypercall.c -[Sources.IA32] - Ia32/hypercall.nasm - [Sources.X64] X64/hypercall.nasm @@ -46,11 +43,11 @@ MdePkg/MdePkg.dec OvmfPkg/OvmfPkg.dec -[LibraryClasses.IA32, LibraryClasses.X64] +[LibraryClasses.X64] CpuLib BaseLib HobLib DebugLib -[Guids.IA32, Guids.X64] +[Guids.X64] gEfiXenInfoGuid diff --git a/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.inf b/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.inf index 6da6ef6d7818..e547e0018be6 100644 --- a/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.inf +++ b/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.inf @@ -20,7 +20,7 @@ UEFI_HII_RESOURCE_SECTION = TRUE # -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 EBC +# VALID_ARCHITECTURES = X64 ARM AARCH64 EBC # [Sources.common] diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc deleted file mode 100644 index 550c54d32109..000000000000 --- a/OvmfPkg/OvmfPkgIa32.dsc +++ /dev/null @@ -1,936 +0,0 @@ -## @file -# EFI/Framework Open Virtual Machine Firmware (OVMF) platform -# -# Copyright (c) 2006 - 2024, Intel Corporation. All rights reserved.
-# (C) Copyright 2016 Hewlett Packard Enterprise Development LP
-# Copyright (c) Microsoft Corporation. -# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -## - -################################################################################ -# -# Defines Section - statements that will be processed to create a Makefile. -# -################################################################################ -[Defines] - PLATFORM_NAME = Ovmf - PLATFORM_GUID = 5a9e7754-d81b-49ea-85ad-69eaa7b1539b - PLATFORM_VERSION = 0.1 - DSC_SPECIFICATION = 0x00010005 - OUTPUT_DIRECTORY = Build/OvmfIa32 - SUPPORTED_ARCHITECTURES = IA32 - BUILD_TARGETS = NOOPT|DEBUG|RELEASE - SKUID_IDENTIFIER = DEFAULT - FLASH_DEFINITION = OvmfPkg/OvmfPkgIa32.fdf - - # - # Defines for default states. These can be changed on the command line. - # -D FLAG=VALUE - # - DEFINE SECURE_BOOT_ENABLE = FALSE - DEFINE SMM_REQUIRE = FALSE - DEFINE SOURCE_DEBUG_ENABLE = FALSE - DEFINE LOAD_X64_ON_IA32_ENABLE = FALSE - -!include OvmfPkg/Include/Dsc/OvmfTpmDefines.dsc.inc - - # - # Shell can be useful for debugging but should not be enabled for production - # - DEFINE BUILD_SHELL = TRUE - - # - # Network definition - # - DEFINE NETWORK_TLS_ENABLE = FALSE - DEFINE NETWORK_IP6_ENABLE = FALSE - DEFINE NETWORK_HTTP_BOOT_ENABLE = FALSE - DEFINE NETWORK_ALLOW_HTTP_CONNECTIONS = TRUE - DEFINE NETWORK_ISCSI_ENABLE = TRUE - DEFINE NETWORK_PXE_BOOT_ENABLE = TRUE - -!include NetworkPkg/NetworkDefines.dsc.inc - - # - # Device drivers - # -!include OvmfPkg/Include/Dsc/OvmfOptHwDefines.dsc.inc - - # - # Flash size selection. Setting FD_SIZE_IN_KB on the command line directly to - # one of the supported values, in place of any of the convenience macros, is - # permitted. - # -!ifdef $(FD_SIZE_1MB) - DEFINE FD_SIZE_IN_KB = 1024 -!else -!ifdef $(FD_SIZE_2MB) - DEFINE FD_SIZE_IN_KB = 2048 -!else -!ifdef $(FD_SIZE_4MB) - DEFINE FD_SIZE_IN_KB = 4096 -!else - DEFINE FD_SIZE_IN_KB = 4096 -!endif -!endif -!endif - -!include OvmfPkg/Include/Dsc/OvmfPkg.dsc.inc - -[BuildOptions] - GCC:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG - INTEL:RELEASE_*_*_CC_FLAGS = /D MDEPKG_NDEBUG - MSFT:RELEASE_*_*_CC_FLAGS = /D MDEPKG_NDEBUG -!if $(TOOL_CHAIN_TAG) != "XCODE5" && $(TOOL_CHAIN_TAG) != "CLANGPDB" - GCC:*_*_*_CC_FLAGS = -mno-mmx -mno-sse -!endif - RELEASE_*_*_GENFW_FLAGS = --zero - - # - # Disable deprecated APIs. - # - MSFT:*_*_*_CC_FLAGS = /D DISABLE_NEW_DEPRECATED_INTERFACES - INTEL:*_*_*_CC_FLAGS = /D DISABLE_NEW_DEPRECATED_INTERFACES - GCC:*_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES - -!include NetworkPkg/NetworkBuildOptions.dsc.inc - -[BuildOptions.common.EDKII.DXE_RUNTIME_DRIVER] - GCC:*_*_*_DLINK_FLAGS = -z common-page-size=0x1000 - XCODE:*_*_*_DLINK_FLAGS = -seg1addr 0x1000 -segalign 0x1000 - XCODE:*_*_*_MTOC_FLAGS = -align 0x1000 - CLANGPDB:*_*_*_DLINK_FLAGS = /ALIGN:4096 - -# Force PE/COFF sections to be aligned at 4KB boundaries to support page level -# protection of DXE_SMM_DRIVER/SMM_CORE modules -[BuildOptions.common.EDKII.DXE_SMM_DRIVER, BuildOptions.common.EDKII.SMM_CORE] - GCC:*_*_*_DLINK_FLAGS = -z common-page-size=0x1000 - XCODE:*_*_*_DLINK_FLAGS = -seg1addr 0x1000 -segalign 0x1000 - XCODE:*_*_*_MTOC_FLAGS = -align 0x1000 - CLANGPDB:*_*_*_DLINK_FLAGS = /ALIGN:4096 - -################################################################################ -# -# SKU Identification section - list of all SKU IDs supported by this Platform. -# -################################################################################ -[SkuIds] - 0|DEFAULT - -################################################################################ -# -# Library Class section - list of all Library Classes needed by this Platform. -# -################################################################################ - -!include MdePkg/MdeLibs.dsc.inc - -[LibraryClasses] - SmmRelocationLib|OvmfPkg/Library/SmmRelocationLib/SmmRelocationLib.inf - PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf - TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf - ResetSystemLib|OvmfPkg/Library/ResetSystemLib/BaseResetSystemLib.inf - PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf - BaseMemoryLib|MdePkg/Library/BaseMemoryLibRepStr/BaseMemoryLibRepStr.inf - BaseLib|MdePkg/Library/BaseLib/BaseLib.inf - SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf - TimeBaseLib|EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.inf - BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf - SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf - CpuLib|MdePkg/Library/BaseCpuLib/BaseCpuLib.inf - PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf - PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf - CacheMaintenanceLib|MdePkg/Library/BaseCacheMaintenanceLib/BaseCacheMaintenanceLib.inf - UefiDecompressLib|MdePkg/Library/BaseUefiDecompressLib/BaseUefiDecompressLib.inf - UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf - HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf - SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf - UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf - BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf - FileExplorerLib|MdeModulePkg/Library/FileExplorerLib/FileExplorerLib.inf - CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf - DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf - DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf - PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf - PciCf8Lib|MdePkg/Library/BasePciCf8Lib/BasePciCf8Lib.inf - PciExpressLib|MdePkg/Library/BasePciExpressLib/BasePciExpressLib.inf - PciLib|MdePkg/Library/BasePciLibCf8/BasePciLibCf8.inf - PciSegmentLib|MdePkg/Library/BasePciSegmentLibPci/BasePciSegmentLibPci.inf - PciCapLib|OvmfPkg/Library/BasePciCapLib/BasePciCapLib.inf - PciCapPciSegmentLib|OvmfPkg/Library/BasePciCapPciSegmentLib/BasePciCapPciSegmentLib.inf - PciCapPciIoLib|OvmfPkg/Library/UefiPciCapPciIoLib/UefiPciCapPciIoLib.inf - CcProbeLib|MdePkg/Library/CcProbeLibNull/CcProbeLibNull.inf - IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsicSev.inf - OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf - SerialPortLib|PcAtChipsetPkg/Library/SerialIoLib/SerialIoLib.inf - MtrrLib|UefiCpuPkg/Library/MtrrLib/MtrrLib.inf - MicrocodeLib|UefiCpuPkg/Library/MicrocodeLib/MicrocodeLib.inf - CpuPageTableLib|UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableLib.inf - UefiLib|MdePkg/Library/UefiLib/UefiLib.inf - UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf - UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf - UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf - UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf - DevicePathLib|MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLibDevicePathProtocol.inf - NvVarsFileLib|OvmfPkg/Library/NvVarsFileLib/NvVarsFileLib.inf - FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf - SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf - UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf - SerializeVariablesLib|OvmfPkg/Library/SerializeVariablesLib/SerializeVariablesLib.inf - QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf - QemuFwCfgSimpleParserLib|OvmfPkg/Library/QemuFwCfgSimpleParserLib/QemuFwCfgSimpleParserLib.inf - VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf - LoadLinuxLib|OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf - MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf - MemEncryptTdxLib|OvmfPkg/Library/BaseMemEncryptTdxLib/BaseMemEncryptTdxLibNull.inf - PeiHardwareInfoLib|OvmfPkg/Library/HardwareInfoLib/PeiHardwareInfoLib.inf - DxeHardwareInfoLib|OvmfPkg/Library/HardwareInfoLib/DxeHardwareInfoLib.inf - ImagePropertiesRecordLib|MdeModulePkg/Library/ImagePropertiesRecordLib/ImagePropertiesRecordLib.inf - HstiLib|MdePkg/Library/DxeHstiLib/DxeHstiLib.inf -!if $(SMM_REQUIRE) == FALSE - LockBoxLib|OvmfPkg/Library/LockBoxLib/LockBoxBaseLib.inf -!endif - CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf - FrameBufferBltLib|MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltLib.inf - -!if $(SOURCE_DEBUG_ENABLE) == TRUE - PeCoffExtraActionLib|SourceLevelDebugPkg/Library/PeCoffExtraActionLibDebug/PeCoffExtraActionLibDebug.inf - DebugCommunicationLib|SourceLevelDebugPkg/Library/DebugCommunicationLibSerialPort/DebugCommunicationLibSerialPort.inf -!else - PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf - DebugAgentLib|MdeModulePkg/Library/DebugAgentLibNull/DebugAgentLibNull.inf -!endif - - LocalApicLib|UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.inf - DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf - - RngLib|MdeModulePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf - -!if $(SECURE_BOOT_ENABLE) == TRUE - PlatformSecureLib|OvmfPkg/Library/PlatformSecureLib/PlatformSecureLib.inf - AuthVariableLib|SecurityPkg/Library/AuthVariableLib/AuthVariableLib.inf - SecureBootVariableLib|SecurityPkg/Library/SecureBootVariableLib/SecureBootVariableLib.inf - PlatformPKProtectionLib|SecurityPkg/Library/PlatformPKProtectionLibVarPolicy/PlatformPKProtectionLibVarPolicy.inf - SecureBootVariableProvisionLib|SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.inf -!else - AuthVariableLib|MdeModulePkg/Library/AuthVariableLibNull/AuthVariableLibNull.inf -!endif - VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf - VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolicyLib.inf - VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/VariablePolicyHelperLib.inf - VariableFlashInfoLib|MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.inf - - # - # Network libraries - # -!include NetworkPkg/NetworkLibs.dsc.inc - - ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf - - S3BootScriptLib|MdeModulePkg/Library/PiDxeS3BootScriptLib/DxeS3BootScriptLib.inf - SmbusLib|MdePkg/Library/BaseSmbusLibNull/BaseSmbusLibNull.inf - OrderedCollectionLib|MdePkg/Library/BaseOrderedCollectionRedBlackTreeLib/BaseOrderedCollectionRedBlackTreeLib.inf - -!include OvmfPkg/Include/Dsc/OvmfTpmLibs.dsc.inc -!include OvmfPkg/Include/Dsc/ShellLibs.dsc.inc -!include OvmfPkg/Include/Dsc/OvmfTlsLibs.dsc.inc - -[LibraryClasses.common] - AmdSvsmLib|UefiCpuPkg/Library/AmdSvsmLibNull/AmdSvsmLibNull.inf - BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf - CcExitLib|UefiCpuPkg/Library/CcExitLibNull/CcExitLibNull.inf - TdxLib|MdePkg/Library/TdxLib/TdxLib.inf - TdxMailboxLib|OvmfPkg/Library/TdxMailboxLib/TdxMailboxLibNull.inf - TdxHelperLib|OvmfPkg/IntelTdx/TdxHelperLib/TdxHelperLibNull.inf - MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf - -[LibraryClasses.common.SEC] - TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf - QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgSecLib.inf -!ifdef $(DEBUG_ON_SERIAL_PORT) - DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf -!else - DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf -!endif - ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf - ExtractGuidedSectionLib|MdePkg/Library/BaseExtractGuidedSectionLib/BaseExtractGuidedSectionLib.inf -!if $(SOURCE_DEBUG_ENABLE) == TRUE - DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgentLib.inf -!endif - HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf - PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf - PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf - MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf - CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf - MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLib.inf - -[LibraryClasses.common.PEI_CORE] - HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf - PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf - PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf - MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf - PeiCoreEntryPoint|MdePkg/Library/PeiCoreEntryPoint/PeiCoreEntryPoint.inf - ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf - OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf - PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf -!ifdef $(DEBUG_ON_SERIAL_PORT) - DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf -!else - DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf -!endif - PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf - -[LibraryClasses.common.PEIM] - HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf - PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf - PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf - MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf - PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf - ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf - OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf - PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf -!ifdef $(DEBUG_ON_SERIAL_PORT) - DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf -!else - DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf -!endif - PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf - ResourcePublicationLib|MdePkg/Library/PeiResourcePublicationLib/PeiResourcePublicationLib.inf - ExtractGuidedSectionLib|MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf -!if $(SOURCE_DEBUG_ENABLE) == TRUE - DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgentLib.inf -!endif - CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuExceptionHandlerLib.inf - MpInitLib|UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf - QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/PeiQemuFwCfgS3LibFwCfg.inf - PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf - QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf - PlatformInitLib|OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf - - MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf - -[LibraryClasses.common.DXE_CORE] - HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf - DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf - MemoryAllocationLib|MdeModulePkg/Library/DxeCoreMemoryAllocationLib/DxeCoreMemoryAllocationLib.inf - ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf -!ifdef $(DEBUG_ON_SERIAL_PORT) - DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf -!else - DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf -!endif - ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf -!if $(SOURCE_DEBUG_ENABLE) == TRUE - DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgentLib.inf -!endif - CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf - PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf - -[LibraryClasses.common.DXE_RUNTIME_DRIVER] - PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf - TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf - ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf - HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf - DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf - MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf - ReportStatusCodeLib|MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/RuntimeDxeReportStatusCodeLib.inf -!ifdef $(DEBUG_ON_SERIAL_PORT) - DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf -!else - DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf -!endif - UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf - BaseCryptLib|CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf - PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf - QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf - VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolicyLibRuntimeDxe.inf -!if $(SMM_REQUIRE) == TRUE - MmUnblockMemoryLib|MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.inf -!endif - -[LibraryClasses.common.UEFI_DRIVER] - PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf - TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf - ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf - HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf - DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf - MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf - ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf -!ifdef $(DEBUG_ON_SERIAL_PORT) - DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf -!else - DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf -!endif - UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf - PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf - -[LibraryClasses.common.DXE_DRIVER] - AcpiPlatformLib|OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf - PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf - TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf - ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf - HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf - MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf - ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf - UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf -!ifdef $(DEBUG_ON_SERIAL_PORT) - DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf -!else - DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf -!endif - PlatformBootManagerLib|OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf - PlatformBmPrintScLib|OvmfPkg/Library/PlatformBmPrintScLib/PlatformBmPrintScLib.inf - QemuBootOrderLib|OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.inf - PlatformBootManagerCommonLib|OvmfPkg/Library/PlatformBootManagerCommonLib/PlatformBootManagerCommonLib.inf - CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf -!if $(SMM_REQUIRE) == TRUE - LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxDxeLib.inf -!else - LockBoxLib|OvmfPkg/Library/LockBoxLib/LockBoxDxeLib.inf -!endif -!if $(SOURCE_DEBUG_ENABLE) == TRUE - DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgentLib.inf -!endif - PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf - MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf - NestedInterruptTplLib|OvmfPkg/Library/NestedInterruptTplLib/NestedInterruptTplLib.inf - QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf - QemuLoadImageLib|OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf - -[LibraryClasses.common.UEFI_APPLICATION] - PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf - TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf - ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf - HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf - MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf - ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf -!ifdef $(DEBUG_ON_SERIAL_PORT) - DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf -!else - DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf -!endif - PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf - -[LibraryClasses.common.DXE_SMM_DRIVER] - PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf - TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf - ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf - MemoryAllocationLib|MdePkg/Library/SmmMemoryAllocationLib/SmmMemoryAllocationLib.inf - ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf - HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf - SmmMemLib|MdePkg/Library/SmmMemLib/SmmMemLib.inf - MmServicesTableLib|MdePkg/Library/MmServicesTableLib/MmServicesTableLib.inf - SmmServicesTableLib|MdePkg/Library/SmmServicesTableLib/SmmServicesTableLib.inf -!ifdef $(DEBUG_ON_SERIAL_PORT) - DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf -!else - DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf -!endif - CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf -!if $(SOURCE_DEBUG_ENABLE) == TRUE - DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/SmmDebugAgentLib.inf -!endif - BaseCryptLib|CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf - PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf - SmmCpuRendezvousLib|UefiCpuPkg/Library/SmmCpuRendezvousLib/SmmCpuRendezvousLib.inf - -[LibraryClasses.common.SMM_CORE] - PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf - TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf - ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf - SmmCorePlatformHookLib|MdeModulePkg/Library/SmmCorePlatformHookLibNull/SmmCorePlatformHookLibNull.inf - MemoryAllocationLib|MdeModulePkg/Library/PiSmmCoreMemoryAllocationLib/PiSmmCoreMemoryAllocationLib.inf - ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf - HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf - SmmMemLib|MdePkg/Library/SmmMemLib/SmmMemLib.inf - SmmServicesTableLib|MdeModulePkg/Library/PiSmmCoreSmmServicesTableLib/PiSmmCoreSmmServicesTableLib.inf -!ifdef $(DEBUG_ON_SERIAL_PORT) - DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf -!else - DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf -!endif - PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf - -################################################################################ -# -# Pcd Section - list of all EDK II PCD Entries defined by this Platform. -# -################################################################################ -[PcdsFeatureFlag] - gEfiMdeModulePkgTokenSpaceGuid.PcdHiiOsRuntimeSupport|FALSE - gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress|FALSE - gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|FALSE - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE -!if $(SMM_REQUIRE) == TRUE - gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire|TRUE - gUefiCpuPkgTokenSpaceGuid.PcdCpuHotPlugSupport|TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdEnableVariableRuntimeCache|FALSE -!endif -!if $(SECURE_BOOT_ENABLE) == TRUE - gUefiOvmfPkgTokenSpaceGuid.PcdSecureBootSupported|TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdRequireSelfSignedPk|TRUE -!endif - -[PcdsFixedAtBuild] - gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeMemorySize|1 -!if $(SMM_REQUIRE) == FALSE - gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange|FALSE -!endif - gEfiMdePkgTokenSpaceGuid.PcdMaximumGuidedExtractHandler|0x10 - gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|0 -!if ($(FD_SIZE_IN_KB) == 1024) || ($(FD_SIZE_IN_KB) == 2048) - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x2000 - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxAuthVariableSize|0x2800 -!if $(NETWORK_TLS_ENABLE) == FALSE - # match PcdFlashNvStorageVariableSize purely for convenience - gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize|0xe000 -!endif -!endif -!if $(FD_SIZE_IN_KB) == 4096 - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x8400 - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxAuthVariableSize|0x8400 -!if $(NETWORK_TLS_ENABLE) == FALSE - # match PcdFlashNvStorageVariableSize purely for convenience - gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize|0x40000 -!endif -!endif -!if $(NETWORK_TLS_ENABLE) == TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize|0x80000 - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVolatileVariableSize|0x40000 -!endif - - gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress|0x0 - gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseSerial|FALSE - gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory|TRUE - - gEfiMdePkgTokenSpaceGuid.PcdReportStatusCodePropertyMask|0x07 - - # DEBUG_INIT 0x00000001 // Initialization - # DEBUG_WARN 0x00000002 // Warnings - # DEBUG_LOAD 0x00000004 // Load events - # DEBUG_FS 0x00000008 // EFI File system - # DEBUG_POOL 0x00000010 // Alloc & Free (pool) - # DEBUG_PAGE 0x00000020 // Alloc & Free (page) - # DEBUG_INFO 0x00000040 // Informational debug messages - # DEBUG_DISPATCH 0x00000080 // PEI/DXE/SMM Dispatchers - # DEBUG_VARIABLE 0x00000100 // Variable - # DEBUG_BM 0x00000400 // Boot Manager - # DEBUG_BLKIO 0x00001000 // BlkIo Driver - # DEBUG_NET 0x00004000 // SNP Driver - # DEBUG_UNDI 0x00010000 // UNDI Driver - # DEBUG_LOADFILE 0x00020000 // LoadFile - # DEBUG_EVENT 0x00080000 // Event messages - # DEBUG_GCD 0x00100000 // Global Coherency Database changes - # DEBUG_CACHE 0x00200000 // Memory range cachability changes - # DEBUG_VERBOSE 0x00400000 // Detailed debug messages that may - # // significantly impact boot performance - # DEBUG_ERROR 0x80000000 // Error - gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F - -!if $(SOURCE_DEBUG_ENABLE) == TRUE - gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x17 -!else - gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x2F -!endif - - # This PCD is used to set the base address of the PCI express hierarchy. It - # is only consulted when OVMF runs on Q35. In that case it is programmed into - # the PCIEXBAR register. - # - # On Q35 machine types that QEMU intends to support in the long term, QEMU - # never lets the RAM below 4 GB exceed 2816 MB. - gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0xE0000000 - -!if $(SOURCE_DEBUG_ENABLE) == TRUE - gEfiSourceLevelDebugPkgTokenSpaceGuid.PcdDebugLoadImageMethod|0x2 -!endif - - # - # The NumberOfPages values below are ad-hoc. They are updated sporadically at - # best (please refer to git-blame for past updates). The values capture a set - # of BIN hints that made sense at a particular time, for some (now likely - # unknown) workloads / boot paths. - # - gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiACPIMemoryNVS|0x80 - gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiACPIReclaimMemory|0x12 - gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiReservedMemoryType|0x80 - gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode|0x100 - gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData|0x100 - - # - # Network Pcds - # -!include NetworkPkg/NetworkFixedPcds.dsc.inc - - gEfiShellPkgTokenSpaceGuid.PcdShellFileOperationSize|0x20000 - -!if $(SMM_REQUIRE) == TRUE - gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmStackSize|0x4000 -!endif - - # Point to the MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenuApp.inf - gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile|{ 0xdc, 0x5b, 0xc2, 0xee, 0xf2, 0x67, 0x95, 0x4d, 0xb1, 0xd5, 0xf8, 0x1b, 0x20, 0x39, 0xd1, 0x1d } - # - # INIT is now triggered before BIOS by ucode/hardware. In the OVMF - # environment, QEMU lacks a simulation for the INIT process. - # To address this, PcdFirstTimeWakeUpAPsBySipi set to FALSE to - # broadcast INIT-SIPI-SIPI for the first time. - # - gUefiCpuPkgTokenSpaceGuid.PcdFirstTimeWakeUpAPsBySipi|FALSE - -################################################################################ -# -# Pcd Dynamic Section - list of all EDK II PCD Entries defined by this Platform -# -################################################################################ - -[PcdsDynamicDefault] - # only set when - # ($(SMM_REQUIRE) == FALSE) - gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved|0 - -!if $(SMM_REQUIRE) == FALSE - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|0 - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64|0 - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64|0 - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|0 - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|0 -!endif - gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiS3Enable|FALSE - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId|0 - gUefiOvmfPkgTokenSpaceGuid.PcdPciIoBase|0x0 - gUefiOvmfPkgTokenSpaceGuid.PcdPciIoSize|0x0 - gUefiOvmfPkgTokenSpaceGuid.PcdPciMmio32Base|0x0 - gUefiOvmfPkgTokenSpaceGuid.PcdPciMmio32Size|0x0 - - gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|0 - - # Set video resolution for text setup. - gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution|640 - gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution|480 - - gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion|0x0208 - gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosDocRev|0x0 - gUefiOvmfPkgTokenSpaceGuid.PcdQemuSmbiosValidated|FALSE - - # Noexec settings for DXE. - gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack|FALSE - - # UefiCpuPkg PCDs related to initial AP bringup and general AP management. - gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber|64 - gUefiCpuPkgTokenSpaceGuid.PcdCpuBootLogicalProcessorNumber|0 - - # Set memory encryption mask - gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask|0x0 - - # Set Tdx shared bit mask - gEfiMdeModulePkgTokenSpaceGuid.PcdTdxSharedBitMask|0x0 - - # Set SEV-ES defaults - gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase|0 - gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbSize|0 - gUefiCpuPkgTokenSpaceGuid.PcdSevEsIsEnabled|0 - -!if $(SMM_REQUIRE) == TRUE - gUefiOvmfPkgTokenSpaceGuid.PcdQ35TsegMbytes|8 - gUefiOvmfPkgTokenSpaceGuid.PcdQ35SmramAtDefaultSmbase|FALSE - gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmSyncMode|0x01 - gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmApSyncTimeout|100000 - gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmApSyncTimeout2|100000 -!endif - - gEfiSecurityPkgTokenSpaceGuid.PcdOptionRomImageVerificationPolicy|0x00 - -!include OvmfPkg/Include/Dsc/OvmfTpmPcds.dsc.inc -!include OvmfPkg/Include/Dsc/OvmfDisplayPcds.dsc.inc - -!include NetworkPkg/NetworkDynamicPcds.dsc.inc - - # Set ConfidentialComputing defaults - gEfiMdePkgTokenSpaceGuid.PcdConfidentialComputingGuestAttr|0 - - gEfiMdePkgTokenSpaceGuid.PcdFSBClock|1000000000 - -[PcdsDynamicHii] -!include OvmfPkg/Include/Dsc/OvmfTpmPcdsHii.dsc.inc - -################################################################################ -# -# Components Section - list of all EDK II Modules needed by this Platform. -# -################################################################################ -[Components] - OvmfPkg/ResetVector/ResetVector.inf - - # - # SEC Phase modules - # - OvmfPkg/Sec/SecMain.inf { - - NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf - } - - # - # PEI Phase modules - # - MdeModulePkg/Core/Pei/PeiMain.inf - MdeModulePkg/Universal/PCD/Pei/Pcd.inf { - - PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf - } - MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouterPei.inf { - - PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf - } - MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCodeHandlerPei.inf { - - PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf - } - MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf - - OvmfPkg/PlatformPei/PlatformPei.inf - - UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf { - -!if $(SMM_REQUIRE) == TRUE - LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxPeiLib.inf -!endif - } -!if $(SMM_REQUIRE) == TRUE - MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf - MdeModulePkg/Universal/Variable/Pei/VariablePei.inf - OvmfPkg/SmmAccess/SmmAccessPei.inf -!endif - UefiCpuPkg/CpuMpPei/CpuMpPei.inf - -!include OvmfPkg/Include/Dsc/OvmfTpmComponentsPei.dsc.inc - - # - # DXE Phase modules - # - MdeModulePkg/Core/Dxe/DxeMain.inf { - - NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf - DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf - } - - MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.inf - MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf - MdeModulePkg/Universal/PCD/Dxe/Pcd.inf { - - PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf - } - - MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf - - MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf { - -!if $(SECURE_BOOT_ENABLE) == TRUE - NULL|SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.inf -!endif -!include OvmfPkg/Include/Dsc/OvmfTpmSecurityStub.dsc.inc - } - - MdeModulePkg/Universal/EbcDxe/EbcDxe.inf - UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf - UefiCpuPkg/CpuDxe/CpuDxe.inf - OvmfPkg/LocalApicTimerDxe/LocalApicTimerDxe.inf - OvmfPkg/IncompatiblePciDeviceSupportDxe/IncompatiblePciDeviceSupport.inf - OvmfPkg/PciHotPlugInitDxe/PciHotPlugInit.inf - MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf { - - PciHostBridgeLib|OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf - PciHostBridgeUtilityLib|OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf - NULL|OvmfPkg/Library/PlatformHasIoMmuLib/PlatformHasIoMmuLib.inf - } - MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf { - - PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf - } - MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf - MdeModulePkg/Universal/Metronome/Metronome.inf - PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf - MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.inf - MdeModulePkg/Universal/BdsDxe/BdsDxe.inf { - - XenPlatformLib|OvmfPkg/Library/XenPlatformLib/XenPlatformLib.inf - } - MdeModulePkg/Logo/LogoDxe.inf - MdeModulePkg/Application/UiApp/UiApp.inf { - - NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf - NULL|MdeModulePkg/Library/BootManagerUiLib/BootManagerUiLib.inf - NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf - } - MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenuApp.inf - OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf { - - NULL|OvmfPkg/Library/BlobVerifierLibNull/BlobVerifierLibNull.inf - } - OvmfPkg/VirtioPciDeviceDxe/VirtioPciDeviceDxe.inf - OvmfPkg/Virtio10Dxe/Virtio10.inf - OvmfPkg/VirtioBlkDxe/VirtioBlk.inf - OvmfPkg/VirtioScsiDxe/VirtioScsi.inf - OvmfPkg/VirtioSerialDxe/VirtioSerial.inf - MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf - MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf - MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf - MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf - MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf - MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf { - - PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf - } - MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf - MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf { - - DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf - PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf - } - MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf - MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf - MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf - MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf - FatPkg/EnhancedFatDxe/Fat.inf - MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf - OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf - MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf - MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf - MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf - MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf - MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf - MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf - MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf - MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf - MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf - - OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf - OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf - OvmfPkg/VirtioGpuDxe/VirtioGpu.inf - OvmfPkg/VirtHstiDxe/VirtHstiDxe.inf - - # - # ISA Support - # - OvmfPkg/SioBusDxe/SioBusDxe.inf - MdeModulePkg/Bus/Pci/PciSioSerialDxe/PciSioSerialDxe.inf - MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KeyboardDxe.inf - - # - # SMBIOS Support - # - MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf { - - NULL|OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf - } - OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf - - # - # ACPI Support - # - MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf - OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf - MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf - MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf - MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf - - # - # Hash2 Protocol producer - # - SecurityPkg/Hash2DxeCrypto/Hash2DxeCrypto.inf - - # - # Network Support - # -!include NetworkPkg/NetworkComponents.dsc.inc -!include OvmfPkg/Include/Dsc/NetworkComponents.dsc.inc -!include OvmfPkg/Include/Dsc/UsbComponents.dsc.inc -!include OvmfPkg/Include/Dsc/ShellComponents.dsc.inc -!include OvmfPkg/Include/Dsc/MorLock.dsc.inc -!include OvmfPkg/Include/Dsc/OvmfRngComponents.dsc.inc -!include OvmfPkg/Include/Dsc/OvmfOptHwComponents.dsc.inc - -!if $(SECURE_BOOT_ENABLE) == TRUE - SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf - OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.inf -!endif - - OvmfPkg/PlatformDxe/Platform.inf - OvmfPkg/IoMmuDxe/IoMmuDxe.inf - -!if $(SMM_REQUIRE) == TRUE - OvmfPkg/SmmAccess/SmmAccess2Dxe.inf - OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf - OvmfPkg/CpuS3DataDxe/CpuS3DataDxe.inf - - # - # SMM Initial Program Load (a DXE_RUNTIME_DRIVER) - # - MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf - - # - # SMM_CORE - # - MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf - - # - # Privileged drivers (DXE_SMM_DRIVER modules) - # - OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf - UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf - MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf { - - LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxSmmLib.inf - } - UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf { - - SmmCpuPlatformHookLib|OvmfPkg/Library/SmmCpuPlatformHookLibQemu/SmmCpuPlatformHookLibQemu.inf - SmmCpuFeaturesLib|OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf - MmSaveStateLib|UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveStateLib.inf - SmmCpuSyncLib|UefiCpuPkg/Library/SmmCpuSyncLib/SmmCpuSyncLib.inf - } - MdeModulePkg/Universal/SmmCommunicationBufferDxe/SmmCommunicationBufferDxe.inf - - # - # Variable driver stack (SMM) - # - OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesSmm.inf { - - CcExitLib|UefiCpuPkg/Library/CcExitLibNull/CcExitLibNull.inf - } - MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf - MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf { - - NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf - NULL|MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.inf - } - MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf - -!else - - # - # Variable driver stack (non-SMM) - # - OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf - OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf { - - PlatformFvbLib|OvmfPkg/Library/EmuVariableFvbLib/EmuVariableFvbLib.inf - } - MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf - MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf { - - NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf - } -!endif - - # - # TPM support - # -!include OvmfPkg/Include/Dsc/OvmfTpmComponentsDxe.dsc.inc - -!if $(LOAD_X64_ON_IA32_ENABLE) == TRUE - OvmfPkg/CompatImageLoaderDxe/CompatImageLoaderDxe.inf -!endif diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf deleted file mode 100644 index ea693bf4a01f..000000000000 --- a/OvmfPkg/OvmfPkgIa32.fdf +++ /dev/null @@ -1,494 +0,0 @@ -## @file -# Open Virtual Machine Firmware: FDF -# -# Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
-# (C) Copyright 2016 Hewlett Packard Enterprise Development LP
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -## - -################################################################################ - -[Defines] -!include OvmfPkg/Include/Fdf/OvmfPkgDefines.fdf.inc - -# -# Build the variable store and the firmware code as one unified flash device -# image. -# -[FD.OVMF] -BaseAddress = $(FW_BASE_ADDRESS) -Size = $(FW_SIZE) -ErasePolarity = 1 -BlockSize = $(BLOCK_SIZE) -NumBlocks = $(FW_BLOCKS) - -!include OvmfPkg/Include/Fdf/VarStore.fdf.inc - -$(VARS_SIZE)|$(FVMAIN_SIZE) -FV = FVMAIN_COMPACT - -$(SECFV_OFFSET)|$(SECFV_SIZE) -FV = SECFV - -# -# Build the variable store and the firmware code as separate flash device -# images. -# -[FD.OVMF_VARS] -BaseAddress = $(FW_BASE_ADDRESS) -Size = $(VARS_SIZE) -ErasePolarity = 1 -BlockSize = $(BLOCK_SIZE) -NumBlocks = $(VARS_BLOCKS) - -!include OvmfPkg/Include/Fdf/VarStore.fdf.inc - -[FD.OVMF_CODE] -BaseAddress = $(CODE_BASE_ADDRESS) -Size = $(CODE_SIZE) -ErasePolarity = 1 -BlockSize = $(BLOCK_SIZE) -NumBlocks = $(CODE_BLOCKS) - -0x00000000|$(FVMAIN_SIZE) -FV = FVMAIN_COMPACT - -$(FVMAIN_SIZE)|$(SECFV_SIZE) -FV = SECFV - -################################################################################ - -[FD.MEMFD] -BaseAddress = $(MEMFD_BASE_ADDRESS) -Size = 0xF80000 -ErasePolarity = 1 -BlockSize = 0x10000 -NumBlocks = 0xF8 - -0x000000|0x006000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize - -0x006000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfLockBoxStorageBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfLockBoxStorageSize - -0x007000|0x001000 -gEfiMdePkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress|gUefiOvmfPkgTokenSpaceGuid.PcdGuidedExtractHandlerTableSize - -0x008000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - -0x010000|0x010000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize - -0x020000|0x0E0000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize -FV = PEIFV - -0x100000|0xE80000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize -FV = DXEFV - -########################################################################################## -# Set the SEV-ES specific work area PCDs (used for all forms of SEV since the -# the SEV STATUS MSR is now saved in the work area) -# -SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = $(MEMFD_BASE_ADDRESS) + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader -SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader -########################################################################################## - -################################################################################ - -[FV.SECFV] -FvNameGuid = 763BED0D-DE9F-48F5-81F1-3E90E1B1A015 -BlockSize = 0x1000 -FvAlignment = 16 -ERASE_POLARITY = 1 -MEMORY_MAPPED = TRUE -STICKY_WRITE = TRUE -LOCK_CAP = TRUE -LOCK_STATUS = TRUE -WRITE_DISABLED_CAP = TRUE -WRITE_ENABLED_CAP = TRUE -WRITE_STATUS = TRUE -WRITE_LOCK_CAP = TRUE -WRITE_LOCK_STATUS = TRUE -READ_DISABLED_CAP = TRUE -READ_ENABLED_CAP = TRUE -READ_STATUS = TRUE -READ_LOCK_CAP = TRUE -READ_LOCK_STATUS = TRUE - -# -# SEC Phase modules -# -# The code in this FV handles the initial firmware startup, and -# decompresses the PEI and DXE FVs which handles the rest of the boot sequence. -# -INF OvmfPkg/Sec/SecMain.inf - -INF RuleOverride=RESET_VECTOR OvmfPkg/ResetVector/ResetVector.inf - -################################################################################ -[FV.PEIFV] -FvNameGuid = 6938079B-B503-4E3D-9D24-B28337A25806 -BlockSize = 0x10000 -FvAlignment = 16 -ERASE_POLARITY = 1 -MEMORY_MAPPED = TRUE -STICKY_WRITE = TRUE -LOCK_CAP = TRUE -LOCK_STATUS = TRUE -WRITE_DISABLED_CAP = TRUE -WRITE_ENABLED_CAP = TRUE -WRITE_STATUS = TRUE -WRITE_LOCK_CAP = TRUE -WRITE_LOCK_STATUS = TRUE -READ_DISABLED_CAP = TRUE -READ_ENABLED_CAP = TRUE -READ_STATUS = TRUE -READ_LOCK_CAP = TRUE -READ_LOCK_STATUS = TRUE - -APRIORI PEI { - INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf -} - -# -# PEI Phase modules -# -INF MdeModulePkg/Core/Pei/PeiMain.inf -INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf -INF MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouterPei.inf -INF MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCodeHandlerPei.inf -INF OvmfPkg/PlatformPei/PlatformPei.inf -INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf -INF UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf -!if $(SMM_REQUIRE) == TRUE -INF MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf -INF MdeModulePkg/Universal/Variable/Pei/VariablePei.inf -INF OvmfPkg/SmmAccess/SmmAccessPei.inf -!endif -INF UefiCpuPkg/CpuMpPei/CpuMpPei.inf - -!include OvmfPkg/Include/Fdf/OvmfTpmPei.fdf.inc - -################################################################################ - -[FV.DXEFV] -FvForceRebase = FALSE -FvNameGuid = 7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1 -BlockSize = 0x10000 -FvAlignment = 16 -ERASE_POLARITY = 1 -MEMORY_MAPPED = TRUE -STICKY_WRITE = TRUE -LOCK_CAP = TRUE -LOCK_STATUS = TRUE -WRITE_DISABLED_CAP = TRUE -WRITE_ENABLED_CAP = TRUE -WRITE_STATUS = TRUE -WRITE_LOCK_CAP = TRUE -WRITE_LOCK_STATUS = TRUE -READ_DISABLED_CAP = TRUE -READ_ENABLED_CAP = TRUE -READ_STATUS = TRUE -READ_LOCK_CAP = TRUE -READ_LOCK_STATUS = TRUE - -APRIORI DXE { - INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf - INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf -!if $(SMM_REQUIRE) == FALSE - INF OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf -!endif -} - -# -# DXE Phase modules -# -INF MdeModulePkg/Core/Dxe/DxeMain.inf - -INF MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.inf -INF MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf -INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf - -INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf -INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf -INF MdeModulePkg/Universal/EbcDxe/EbcDxe.inf -INF UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf -INF UefiCpuPkg/CpuDxe/CpuDxe.inf -INF OvmfPkg/LocalApicTimerDxe/LocalApicTimerDxe.inf -INF OvmfPkg/IncompatiblePciDeviceSupportDxe/IncompatiblePciDeviceSupport.inf -INF OvmfPkg/PciHotPlugInitDxe/PciHotPlugInit.inf -INF MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf -INF MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf -INF MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf -INF MdeModulePkg/Universal/Metronome/Metronome.inf -INF PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf - -INF OvmfPkg/VirtioPciDeviceDxe/VirtioPciDeviceDxe.inf -INF OvmfPkg/Virtio10Dxe/Virtio10.inf -INF OvmfPkg/VirtioBlkDxe/VirtioBlk.inf -INF OvmfPkg/VirtioScsiDxe/VirtioScsi.inf -INF OvmfPkg/VirtioSerialDxe/VirtioSerial.inf - -!if $(SECURE_BOOT_ENABLE) == TRUE - INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf -!endif - -INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf -INF MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf -INF MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf -INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf -INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf -INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf -INF MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf -INF MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.inf -INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf -INF MdeModulePkg/Application/UiApp/UiApp.inf -INF MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenuApp.inf -INF OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf -INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf -INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf -INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf -INF MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf -INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf -INF MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf -INF MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf -INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf -INF MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf -INF MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf -INF MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf -INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf -INF MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf -INF MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf - -INF OvmfPkg/SioBusDxe/SioBusDxe.inf -!if $(SOURCE_DEBUG_ENABLE) == FALSE -INF MdeModulePkg/Bus/Pci/PciSioSerialDxe/PciSioSerialDxe.inf -!endif -INF MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KeyboardDxe.inf - -INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf -INF OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf - -INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf -INF OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf -INF MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf -INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf -INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf - -INF FatPkg/EnhancedFatDxe/Fat.inf -INF MdeModulePkg/Universal/Disk/UdfDxe/UdfDxe.inf -INF OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf - -INF MdeModulePkg/Logo/LogoDxe.inf - -# -# Hash2 Protocol producer -# -INF SecurityPkg/Hash2DxeCrypto/Hash2DxeCrypto.inf - -# -# Network modules -# -!include NetworkPkg/Network.fdf.inc - INF OvmfPkg/VirtioNetDxe/VirtioNet.inf - -# -# Usb Support -# -INF MdeModulePkg/Bus/Pci/UhciDxe/UhciDxe.inf -INF MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf -INF MdeModulePkg/Bus/Pci/XhciDxe/XhciDxe.inf -INF MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf -INF MdeModulePkg/Bus/Usb/UsbKbDxe/UsbKbDxe.inf -INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf - -INF OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf -INF OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf -INF OvmfPkg/VirtioGpuDxe/VirtioGpu.inf -INF OvmfPkg/PlatformDxe/Platform.inf -INF OvmfPkg/IoMmuDxe/IoMmuDxe.inf -INF OvmfPkg/VirtHstiDxe/VirtHstiDxe.inf - -!if $(SMM_REQUIRE) == TRUE -INF OvmfPkg/SmmAccess/SmmAccess2Dxe.inf -INF OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf -INF OvmfPkg/CpuS3DataDxe/CpuS3DataDxe.inf -INF MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf -INF MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf -INF OvmfPkg/CpuHotplugSmm/CpuHotplugSmm.inf -INF UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf -INF MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf -INF UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf -INF MdeModulePkg/Universal/SmmCommunicationBufferDxe/SmmCommunicationBufferDxe.inf - -# -# Variable driver stack (SMM) -# -INF OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesSmm.inf -INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf -INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf -INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf - -!else - -# -# Variable driver stack (non-SMM) -# -INF OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf -INF OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf -INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf -INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf -!endif - -# -# TPM support -# -!include OvmfPkg/Include/Fdf/OvmfTpmDxe.fdf.inc - -!include OvmfPkg/Include/Fdf/ShellDxe.fdf.inc -!include OvmfPkg/Include/Fdf/MorLock.fdf.inc -!include OvmfPkg/Include/Fdf/OvmfRngDxe.fdf.inc -!include OvmfPkg/Include/Fdf/OvmfOptHw.fdf.inc - -!if $(LOAD_X64_ON_IA32_ENABLE) == TRUE -INF OvmfPkg/CompatImageLoaderDxe/CompatImageLoaderDxe.inf -!endif - -################################################################################ - -[FV.FVMAIN_COMPACT] -FvNameGuid = 48DB5E17-707C-472D-91CD-1613E7EF51B0 -FvAlignment = 16 -ERASE_POLARITY = 1 -MEMORY_MAPPED = TRUE -STICKY_WRITE = TRUE -LOCK_CAP = TRUE -LOCK_STATUS = TRUE -WRITE_DISABLED_CAP = TRUE -WRITE_ENABLED_CAP = TRUE -WRITE_STATUS = TRUE -WRITE_LOCK_CAP = TRUE -WRITE_LOCK_STATUS = TRUE -READ_DISABLED_CAP = TRUE -READ_ENABLED_CAP = TRUE -READ_STATUS = TRUE -READ_LOCK_CAP = TRUE -READ_LOCK_STATUS = TRUE - -FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 { - SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE { - # - # These firmware volumes will have files placed in them uncompressed, - # and then both firmware volumes will be compressed in a single - # compression operation in order to achieve better overall compression. - # - SECTION FV_IMAGE = PEIFV - SECTION FV_IMAGE = DXEFV - } - } - -!include OvmfPkg/Include/Fdf/FvmainCompactScratchEnd.fdf.inc - -################################################################################ - -[Rule.Common.SEC] - FILE SEC = $(NAMED_GUID) { - PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi - UI STRING ="$(MODULE_NAME)" Optional - VERSION STRING ="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) - } - -[Rule.Common.PEI_CORE] - FILE PEI_CORE = $(NAMED_GUID) { - PE32 PE32 Align=Auto $(INF_OUTPUT)/$(MODULE_NAME).efi - UI STRING ="$(MODULE_NAME)" Optional - VERSION STRING ="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) - } - -[Rule.Common.PEIM] - FILE PEIM = $(NAMED_GUID) { - PEI_DEPEX PEI_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex - PE32 PE32 Align=Auto $(INF_OUTPUT)/$(MODULE_NAME).efi - UI STRING="$(MODULE_NAME)" Optional - VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) - } - -[Rule.Common.DXE_CORE] - FILE DXE_CORE = $(NAMED_GUID) { - PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi - UI STRING="$(MODULE_NAME)" Optional - VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) - } - -[Rule.Common.DXE_DRIVER] - FILE DRIVER = $(NAMED_GUID) { - DXE_DEPEX DXE_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex - PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi - UI STRING="$(MODULE_NAME)" Optional - VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) - RAW ACPI Optional |.acpi - RAW ASL Optional |.aml - } - -[Rule.Common.DXE_RUNTIME_DRIVER] - FILE DRIVER = $(NAMED_GUID) { - DXE_DEPEX DXE_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex - PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi - UI STRING="$(MODULE_NAME)" Optional - VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) - } - -[Rule.Common.UEFI_DRIVER] - FILE DRIVER = $(NAMED_GUID) { - DXE_DEPEX DXE_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex - PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi - UI STRING="$(MODULE_NAME)" Optional - VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) - } - -[Rule.Common.UEFI_DRIVER.BINARY] - FILE DRIVER = $(NAMED_GUID) { - DXE_DEPEX DXE_DEPEX Optional |.depex - PE32 PE32 |.efi - UI STRING="$(MODULE_NAME)" Optional - VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) - } - -[Rule.Common.UEFI_APPLICATION] - FILE APPLICATION = $(NAMED_GUID) { - PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi - UI STRING="$(MODULE_NAME)" Optional - VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) - } - -[Rule.Common.UEFI_APPLICATION.BINARY] - FILE APPLICATION = $(NAMED_GUID) { - PE32 PE32 |.efi - UI STRING="$(MODULE_NAME)" Optional - VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) - } - -[Rule.Common.USER_DEFINED.RESET_VECTOR] - FILE RAW = $(NAMED_GUID) { - RAW BIN Align = 16 |.bin - } - -[Rule.Common.SMM_CORE] - FILE SMM_CORE = $(NAMED_GUID) { - PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi - UI STRING="$(MODULE_NAME)" Optional - VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) - } - -[Rule.Common.DXE_SMM_DRIVER] - FILE SMM = $(NAMED_GUID) { - SMM_DEPEX SMM_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex - PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi - UI STRING="$(MODULE_NAME)" Optional - VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) - } diff --git a/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml b/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml index a7a802c3fe07..0272b46d008d 100644 --- a/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml +++ b/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml @@ -29,28 +29,6 @@ jobs: #Use matrix to speed up the build process strategy: matrix: - OVMF_IA32_DEBUG: - Build.File: "$(package)/PlatformCI/PlatformBuild.py" - Build.Arch: "IA32" - Build.Flags: "" - Build.Target: "DEBUG" - Run.Flags: $(run_flags) - Run: $(should_run) - OVMF_IA32_RELEASE: - Build.File: "$(package)/PlatformCI/PlatformBuild.py" - Build.Arch: "IA32" - Build.Flags: "" - Build.Target: "RELEASE" - Run.Flags: $(run_flags) - Run: $(should_run) - OVMF_IA32_NOOPT: - Build.File: "$(package)/PlatformCI/PlatformBuild.py" - Build.Arch: "IA32" - Build.Flags: "" - Build.Target: "NOOPT" - Run.Flags: $(run_flags) - Run: $(should_run) - OVMF_X64_DEBUG: Build.File: "$(package)/PlatformCI/PlatformBuild.py" Build.Arch: "X64" diff --git a/OvmfPkg/PlatformCI/.azurepipelines/Windows-VS.yml b/OvmfPkg/PlatformCI/.azurepipelines/Windows-VS.yml index 9a9bf54b84d4..90634d9f93cc 100644 --- a/OvmfPkg/PlatformCI/.azurepipelines/Windows-VS.yml +++ b/OvmfPkg/PlatformCI/.azurepipelines/Windows-VS.yml @@ -29,28 +29,6 @@ jobs: #Use matrix to speed up the build process strategy: matrix: - OVMF_IA32_DEBUG: - Build.File: "$(package)/PlatformCI/PlatformBuild.py" - Build.Arch: "IA32" - Build.Flags: "" - Build.Target: "DEBUG" - Run.Flags: $(run_flags) - Run: $(should_run) - OVMF_IA32_RELEASE: - Build.File: "$(package)/PlatformCI/PlatformBuild.py" - Build.Arch: "IA32" - Build.Flags: "" - Build.Target: "RELEASE" - Run.Flags: $(run_flags) - Run: $(should_run) - OVMF_IA32_NOOPT: - Build.File: "$(package)/PlatformCI/PlatformBuild.py" - Build.Arch: "IA32" - Build.Flags: "" - Build.Target: "NOOPT" - Run.Flags: $(run_flags) - Run: $(should_run) - OVMF_X64_DEBUG: Build.File: "$(package)/PlatformCI/PlatformBuild.py" Build.Arch: "X64" diff --git a/OvmfPkg/PlatformCI/PlatformBuild.py b/OvmfPkg/PlatformCI/PlatformBuild.py index 6c541cdea4a5..ea9cb4d8cabf 100644 --- a/OvmfPkg/PlatformCI/PlatformBuild.py +++ b/OvmfPkg/PlatformCI/PlatformBuild.py @@ -32,9 +32,9 @@ def GetDscName(cls, ArchCsv: str) -> str: ArchCsv: csv string containing all architectures to build ''' dsc = "OvmfPkg" - if "IA32" in ArchCsv.upper().split(","): - dsc += "Ia32" - if "X64" in ArchCsv.upper().split(","): + if ArchCsv.upper() == "IA32,X64": + dsc += "Ia32X64" + else: dsc += "X64" dsc += ".dsc" return dsc diff --git a/OvmfPkg/PlatformCI/PlatformBuildLib.py b/OvmfPkg/PlatformCI/PlatformBuildLib.py index 19f92ac13ff0..1a25487f1c43 100644 --- a/OvmfPkg/PlatformCI/PlatformBuildLib.py +++ b/OvmfPkg/PlatformCI/PlatformBuildLib.py @@ -123,10 +123,10 @@ def __init__(self): def AddCommandLineOptions(self, parserObj): ''' Add command line options to the argparser ''' - parserObj.add_argument('-a', "--arch", dest="build_arch", type=str, default="IA32,X64", - help="Optional - CSV of architecture to build. IA32 will use IA32 for Pei & Dxe. " + parserObj.add_argument('-a', "--arch", dest="build_arch", type=str, default="X64", + help="Optional - CSV of architecture to build. " "X64 will use X64 for both PEI and DXE. IA32,X64 will use IA32 for PEI and " - "X64 for DXE. default is IA32,X64") + "X64 for DXE. Default is X64") def RetrieveCommandLineOptions(self, args): ''' Retrieve command line options from the argparser ''' diff --git a/OvmfPkg/PlatformCI/ReadMe.md b/OvmfPkg/PlatformCI/ReadMe.md index 50d56c399567..301a79f70450 100644 --- a/OvmfPkg/PlatformCI/ReadMe.md +++ b/OvmfPkg/PlatformCI/ReadMe.md @@ -11,7 +11,6 @@ supported and are described below. | Configuration name | Architectures | DSC File |Additional Flags | | :---- | :----- | :---- | :---- | -| IA32 | IA32 | OvmfPkgIa32.dsc | None | | X64 | X64 | OvmfPkgIa64.dsc | None | | IA32 X64 | PEI-IA32 DXE-X64 | OvmfPkgIa32X64.dsc | None | | IA32 X64 Full | PEI-IA32 DXE-X64 | OvmfPkgIa32X64.dsc | SECURE_BOOT_ENABLE=1 SMM_REQUIRE=1 TPM1_ENABLE=1 TPM2_ENABLE=1 NETWORK_TLS_ENABLE=1 NETWORK_IP6_ENABLE=1 NETWORK_HTTP_BOOT_ENABLE=1 | @@ -79,12 +78,6 @@ the generic set of edk2 [Build Instructions](https://github.com/tianocore/tianoc ``` 7. Compile Firmware - - To build IA32 - - ``` bash - stuart_build -c OvmfPkg/PlatformCI/PlatformBuild.py -a IA32 TOOL_CHAIN_TAG= - ``` - - To build X64 ``` bash diff --git a/OvmfPkg/PlatformPei/MemDetect.c b/OvmfPkg/PlatformPei/MemDetect.c index 19137df7fbb0..c8d0ecaf1c44 100644 --- a/OvmfPkg/PlatformPei/MemDetect.c +++ b/OvmfPkg/PlatformPei/MemDetect.c @@ -126,18 +126,6 @@ AddressWidthInitialization ( PlatformAddressWidthInitialization (PlatformInfoHob); - // - // If DXE is 32-bit, then we're done; PciBusDxe will degrade 64-bit MMIO - // resources to 32-bit anyway. See DegradeResource() in - // "PciResourceSupport.c". - // - #ifdef MDE_CPU_IA32 - if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) { - return; - } - - #endif - if (PlatformInfoHob->PcdPciMmio64Size == 0) { if (PlatformInfoHob->BootMode != BOOT_ON_S3_RESUME) { DEBUG (( @@ -194,16 +182,6 @@ GetPeiMemoryCap ( UINT64 ApStacks; UINT64 MemoryCap; - // - // If DXE is 32-bit, then just return the traditional 64 MB cap. - // - #ifdef MDE_CPU_IA32 - if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) { - return SIZE_64MB; - } - - #endif - // // Dependent on physical address width, PEI memory allocations can be // dominated by the page tables built for 64-bit DXE. So we key the cap off diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf index f47170478900..eab13e6e46a0 100644 --- a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf +++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf @@ -23,7 +23,7 @@ # The following information is for reference only and not required by the build # tools. # -# VALID_ARCHITECTURES = IA32 X64 +# VALID_ARCHITECTURES = X64 # [Sources] diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesSmm.inf b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesSmm.inf index 41926914c8a3..ab8b84363191 100644 --- a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesSmm.inf +++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesSmm.inf @@ -25,7 +25,7 @@ # The following information is for reference only and not required by the build # tools. # -# VALID_ARCHITECTURES = IA32 X64 +# VALID_ARCHITECTURES = X64 # [Sources] diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesStandaloneMm.inf b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesStandaloneMm.inf index f8d36340a80c..c782b6056e83 100644 --- a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesStandaloneMm.inf +++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesStandaloneMm.inf @@ -26,7 +26,7 @@ # The following information is for reference only and not required by the build # tools. # -# VALID_ARCHITECTURES = IA32 X64 +# VALID_ARCHITECTURES = X64 # [Sources] diff --git a/OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf b/OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf index ad911c7e81cb..9bca56ec46c2 100644 --- a/OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf +++ b/OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf @@ -20,7 +20,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC +# VALID_ARCHITECTURES = X64 EBC # # DRIVER_BINDING = gQemuVideoDriverBinding # COMPONENT_NAME = gQemuVideoComponentName diff --git a/OvmfPkg/README b/OvmfPkg/README index c32e82a51b69..a2f4ceb567b3 100644 --- a/OvmfPkg/README +++ b/OvmfPkg/README @@ -10,7 +10,7 @@ http://www.tianocore.org/ovmf/ === STATUS === Current capabilities: -* IA32 and X64 architectures +* X64 architecture (optionally with IA32 SEC/PEI) * QEMU (version 1.7.1 or later, with 1.7 or later machine types) - Video, keyboard, IDE, CD-ROM, serial - Runs UEFI shell @@ -36,13 +36,11 @@ Pre-requisites: Update Conf/target.txt ACTIVE_PLATFORM for OVMF: PEI arch DXE arch UEFI interfaces -* OvmfPkg/OvmfPkgIa32.dsc IA32 IA32 IA32 * OvmfPkg/OvmfPkgIa32X64.dsc IA32 X64 X64 * OvmfPkg/OvmfPkgX64.dsc X64 X64 X64 Update Conf/target.txt TARGET_ARCH based on the .dsc file: TARGET_ARCH -* OvmfPkg/OvmfPkgIa32.dsc IA32 * OvmfPkg/OvmfPkgIa32X64.dsc IA32 X64 * OvmfPkg/OvmfPkgX64.dsc X64 @@ -65,7 +63,7 @@ https://github.com/tianocore/tianocore.github.io/wiki/How%20to%20build%20OVMF === RUNNING OVMF on QEMU === * Be sure to use qemu-system-x86_64, if you are using an X64 firmware. - (qemu-system-x86_64 works for the IA32 firmware as well, of course.) + (qemu-system-x86_64 works for the IA32 SEC/PEI as well, of course.) * Use OVMF for QEMU firmware (3 options available) - Option 1: Use QEMU -pflash parameter * QEMU/OVMF will use emulated flash, and fully support UEFI variables @@ -119,9 +117,6 @@ $ OvmfPkg/build.sh -a X64 qemu And to run a 64-bit UEFI bootable ISO image: $ OvmfPkg/build.sh -a X64 qemu -cdrom /path/to/disk-image.iso -To build a 32-bit OVMF without debug messages using GCC 4.8: -$ OvmfPkg/build.sh -a IA32 -b RELEASE -t GCC48 - === Secure Boot === Secure Boot is a security feature that ensures only trusted and digitally @@ -230,7 +225,6 @@ initialization and runtime phases are distinct from Traditional MM. Due to the nature of Standalone MM, there are some limitations, requirements and considerations when using it in OVMF: -* Standalone MM is only supported in X64 mode and is not available in IA32 mode. * The Standalone MM driver must be built with `-D STANDALONE_MM_ENABLE` flag. * For X64, Standalone MM does not currently support S3 resume or LockBox functionality. While LockBox functionality could be supported in the future @@ -295,9 +289,6 @@ longer.) "unzip" utility on platforms different from Windows as well). - Copy the "APPS/EFI/EFIx64/E3522X2.EFI" driver binary to "Intel3.5/EFIX64/E3522X2.EFI" in your WORKSPACE. - - Intel have stopped distributing an IA32 driver binary (which used to - match the filename pattern "E35??E2.EFI"), thus this method will only - work for the IA32X64 and X64 builds of OVMF. - Include the driver in OVMF during the build: - Add "-D E1000_ENABLE" to your build command (only when building diff --git a/OvmfPkg/RiscVVirt/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.inf b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.inf index abdf5d5d6ddc..0397e8523d1d 100644 --- a/OvmfPkg/RiscVVirt/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.inf +++ b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.inf @@ -20,7 +20,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 +# VALID_ARCHITECTURES = X64 ARM AARCH64 RISCV64 # [Sources] diff --git a/OvmfPkg/SioBusDxe/SioBusDxe.inf b/OvmfPkg/SioBusDxe/SioBusDxe.inf index 2f2dc0bf70a7..0a6fe52d66e6 100644 --- a/OvmfPkg/SioBusDxe/SioBusDxe.inf +++ b/OvmfPkg/SioBusDxe/SioBusDxe.inf @@ -20,7 +20,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC +# VALID_ARCHITECTURES = X64 EBC # [Sources] diff --git a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf index 52689c96e5af..0159282673b2 100644 --- a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf +++ b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf @@ -20,7 +20,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 +# VALID_ARCHITECTURES = X64 EBC ARM AARCH64 # [Sources] diff --git a/OvmfPkg/SmbiosPlatformDxe/XenSmbiosPlatformDxe.inf b/OvmfPkg/SmbiosPlatformDxe/XenSmbiosPlatformDxe.inf index e646c88741b6..b0542a19d263 100644 --- a/OvmfPkg/SmbiosPlatformDxe/XenSmbiosPlatformDxe.inf +++ b/OvmfPkg/SmbiosPlatformDxe/XenSmbiosPlatformDxe.inf @@ -21,7 +21,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 +# VALID_ARCHITECTURES = X64 EBC ARM AARCH64 # [Sources] @@ -30,7 +30,7 @@ Xen.c XenSmbiosPlatformDxe.h -[Sources.IA32, Sources.X64] +[Sources.X64] X86Xen.c [Sources.ARM, Sources.AARCH64] @@ -40,7 +40,7 @@ MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec -[Packages.IA32, Packages.X64] +[Packages.X64] OvmfPkg/OvmfPkg.dec [LibraryClasses] @@ -50,7 +50,7 @@ UefiBootServicesTableLib UefiDriverEntryPoint -[LibraryClasses.IA32, LibraryClasses.X64] +[LibraryClasses.X64] HobLib [Pcd] @@ -61,7 +61,7 @@ [Protocols] gEfiSmbiosProtocolGuid # PROTOCOL ALWAYS_CONSUMED -[Guids.IA32, Guids.X64] +[Guids.X64] gEfiXenInfoGuid [Depex] diff --git a/OvmfPkg/SmmAccess/SmmAccess2Dxe.inf b/OvmfPkg/SmmAccess/SmmAccess2Dxe.inf index d9f01a13c4fd..4b064c0daee6 100644 --- a/OvmfPkg/SmmAccess/SmmAccess2Dxe.inf +++ b/OvmfPkg/SmmAccess/SmmAccess2Dxe.inf @@ -23,7 +23,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 +# VALID_ARCHITECTURES = X64 # [Sources] diff --git a/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf b/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf index c31aee411c0f..9bfa9d7467f3 100644 --- a/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf +++ b/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf @@ -30,7 +30,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 +# VALID_ARCHITECTURES = X64 # [Sources] diff --git a/OvmfPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf b/OvmfPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf index be175d290f92..04f1d59e18cc 100644 --- a/OvmfPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf +++ b/OvmfPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf @@ -18,7 +18,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC +# VALID_ARCHITECTURES = X64 EBC # [Sources] diff --git a/OvmfPkg/XenPlatformPei/MemDetect.c b/OvmfPkg/XenPlatformPei/MemDetect.c index e552e7a55e4f..516f9dc455f3 100644 --- a/OvmfPkg/XenPlatformPei/MemDetect.c +++ b/OvmfPkg/XenPlatformPei/MemDetect.c @@ -215,16 +215,6 @@ GetPeiMemoryCap ( UINT32 PdpEntries; UINTN TotalPages; - // - // If DXE is 32-bit, then just return the traditional 64 MB cap. - // - #ifdef MDE_CPU_IA32 - if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) { - return SIZE_64MB; - } - - #endif - // // Dependent on physical address width, PEI memory allocations can be // dominated by the page tables built for 64-bit DXE. So we key the cap off diff --git a/OvmfPkg/build.sh b/OvmfPkg/build.sh index 279f0d099a50..868b322b70b0 100755 --- a/OvmfPkg/build.sh +++ b/OvmfPkg/build.sh @@ -153,12 +153,6 @@ if [[ "$ARCH_IA32" == "yes" && "$ARCH_X64" == "yes" ]]; then BUILD_OPTIONS="$BUILD_OPTIONS -a IA32 -a X64" PLATFORM_BUILD_DIR=Ovmf3264 BUILD_ROOT_ARCH=X64 -elif [[ "$ARCH_IA32" == "yes" && "$ARCH_X64" == "no" ]]; then - PROCESSOR=IA32 - Processor=Ia32 - BUILD_OPTIONS="$BUILD_OPTIONS -a IA32" - PLATFORM_BUILD_DIR=Ovmf$Processor - BUILD_ROOT_ARCH=$PROCESSOR else PROCESSOR=X64 Processor=X64 @@ -168,23 +162,6 @@ else fi case $PROCESSOR in - IA32) - if [ -n "$QEMU_COMMAND" ]; then - # - # The user set the QEMU_COMMAND variable. We'll use it to run QEMU. - # - : - elif [ -x `which qemu-system-i386` ]; then - QEMU_COMMAND=qemu-system-i386 - elif [ -x `which qemu-system-x86_64` ]; then - QEMU_COMMAND=qemu-system-x86_64 - elif [ -x `which qemu` ]; then - QEMU_COMMAND=qemu - else - echo Unable to find QEMU for IA32 architecture! - exit 1 - fi - ;; X64|IA32X64) if [ -z "$QEMU_COMMAND" ]; then # From b471ed29694c375ea1b6b484eb71af73ed61fece Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 25 Aug 2025 15:25:12 -0700 Subject: [PATCH 0446/1172] ArmVirtPkg: Drop ARM Virtual Platforms Per the additional suggestion in RFC https://edk2.groups.io/g/devel/topic/rfc_remove_ovmf_ia32_and/114152215, this drops ARM 32 bit virtual platforms. The full rationale is included in the RFC. Signed-off-by: Oliver Smith-Denny --- ArmVirtPkg/ArmVirt.dsc.inc | 27 +-- ArmVirtPkg/ArmVirtCloudHv.dsc | 6 +- ArmVirtPkg/ArmVirtCloudHv.fdf | 6 - ArmVirtPkg/ArmVirtKvmTool.dsc | 9 +- ArmVirtPkg/ArmVirtKvmTool.fdf | 19 -- ArmVirtPkg/ArmVirtQemu.dsc | 12 +- ArmVirtPkg/ArmVirtQemu.fdf | 4 - ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 2 - ArmVirtPkg/ArmVirtQemuKernel.dsc | 4 +- ArmVirtPkg/ArmVirtQemuKernel.fdf | 22 -- ArmVirtPkg/ArmVirtStackCookies.dsc.inc | 7 - ArmVirtPkg/ArmVirtXen.dsc | 2 +- ArmVirtPkg/ArmVirtXen.fdf | 24 --- .../{AArch64 => }/ArmPlatformHelper.S | 0 .../ArmPlatformLibQemu/ArmPlatformLibQemu.inf | 4 +- .../ArmVirtPciHostBridgeUtilityLib.inf | 2 +- .../PlatformCI/.azurepipelines/Ubuntu-GCC.yml | 54 ----- ArmVirtPkg/PlatformCI/KvmToolBuild.py | 2 +- ArmVirtPkg/PlatformCI/PlatformBuildLib.py | 9 - ArmVirtPkg/PlatformCI/QemuBuild.py | 2 +- ArmVirtPkg/PlatformCI/QemuKernelBuild.py | 2 +- ArmVirtPkg/PlatformCI/ReadMe.md | 5 - ArmVirtPkg/PrePi/{AArch64 => }/ArchPrePi.c | 0 ArmVirtPkg/PrePi/Arm/ArchPrePi.c | 16 -- ArmVirtPkg/PrePi/Arm/ModuleEntryPoint.S | 188 ------------------ .../PrePi/ArmVirtPrePiUniCoreRelocatable.inf | 13 +- .../PrePi/{AArch64 => }/ModuleEntryPoint.S | 0 27 files changed, 20 insertions(+), 421 deletions(-) rename ArmVirtPkg/Library/ArmPlatformLibQemu/{AArch64 => }/ArmPlatformHelper.S (100%) rename ArmVirtPkg/PrePi/{AArch64 => }/ArchPrePi.c (100%) delete mode 100644 ArmVirtPkg/PrePi/Arm/ArchPrePi.c delete mode 100644 ArmVirtPkg/PrePi/Arm/ModuleEntryPoint.S rename ArmVirtPkg/PrePi/{AArch64 => }/ModuleEntryPoint.S (100%) diff --git a/ArmVirtPkg/ArmVirt.dsc.inc b/ArmVirtPkg/ArmVirt.dsc.inc index 2dc36d69d633..643620371bcf 100644 --- a/ArmVirtPkg/ArmVirt.dsc.inc +++ b/ArmVirtPkg/ArmVirt.dsc.inc @@ -18,7 +18,7 @@ DEFINE DEBUG_PRINT_ERROR_LEVEL = 0x8000004F # Dynamic stack cookies pushes the FD size up slightly over 2MB -!if $(TARGET) != NOOPT && $(ARCH) == ARM +!if $(TARGET) != NOOPT DEFINE FD_SIZE_IN_MB = 2 !else DEFINE FD_SIZE_IN_MB = 3 @@ -37,7 +37,6 @@ GCC:*_*_*_DLINK_FLAGS = -z common-page-size=0x1000 [BuildOptions.common.EDKII.DXE_RUNTIME_DRIVER] - GCC:*_*_ARM_DLINK_FLAGS = -z common-page-size=0x1000 GCC:*_*_AARCH64_DLINK_FLAGS = -z common-page-size=0x10000 [LibraryClasses.common] @@ -95,9 +94,6 @@ # Networking Requirements !include NetworkPkg/NetworkLibs.dsc.inc -!if ($(NETWORK_TLS_ENABLE) == TRUE) AND ($(ARCH) == ARM) - !error "NETWORK_TLS_ENABLE is not supported on ARM build!" -!endif # ARM Architectural Libraries CacheMaintenanceLib|ArmPkg/Library/ArmCacheMaintenanceLib/ArmCacheMaintenanceLib.inf @@ -179,6 +175,9 @@ ReportStatusCodeLib|MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLibNull.inf + BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf + TlsLib|CryptoPkg/Library/TlsLib/TlsLib.inf + [LibraryClasses.common.SEC] PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf @@ -262,24 +261,8 @@ !endif VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolicyLibRuntimeDxe.inf -[LibraryClasses.AARCH64.DXE_RUNTIME_DRIVER] BaseCryptLib|CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf -[LibraryClasses.ARM.DXE_RUNTIME_DRIVER] - BaseCryptLib|CryptoPkg/Library/BaseCryptLibMbedTls/RuntimeCryptLib.inf - -[LibraryClasses.AARCH64] - BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf - TlsLib|CryptoPkg/Library/TlsLib/TlsLib.inf - -[LibraryClasses.ARM] - BaseCryptLib|CryptoPkg/Library/BaseCryptLibMbedTls/BaseCryptLib.inf - MbedTlsLib|CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf - RngLib|MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf - UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf - UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf - DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf - [BuildOptions] GCC:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG @@ -299,7 +282,6 @@ gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob|TRUE -[PcdsFeatureFlag.AARCH64] # # Activate AcpiSdtProtocol # @@ -407,7 +389,6 @@ !include OvmfPkg/Include/Dsc/ShellComponents.dsc.inc -[Components.AARCH64] # # ACPI Support # diff --git a/ArmVirtPkg/ArmVirtCloudHv.dsc b/ArmVirtPkg/ArmVirtCloudHv.dsc index 94a4ff10e40c..2dfd286e2505 100644 --- a/ArmVirtPkg/ArmVirtCloudHv.dsc +++ b/ArmVirtPkg/ArmVirtCloudHv.dsc @@ -15,8 +15,8 @@ PLATFORM_GUID = DFFED32B-DFFE-D32B-DFFE-D32BDFFED32B PLATFORM_VERSION = 0.1 DSC_SPECIFICATION = 0x00010005 - OUTPUT_DIRECTORY = Build/ArmVirtCloudHv-$(ARCH) - SUPPORTED_ARCHITECTURES = AARCH64|ARM + OUTPUT_DIRECTORY = Build/ArmVirtCloudHv-AARCH64 + SUPPORTED_ARCHITECTURES = AARCH64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT FLASH_DEFINITION = ArmVirtPkg/ArmVirtCloudHv.fdf @@ -157,7 +157,6 @@ gEfiMdePkgTokenSpaceGuid.PcdReportStatusCodePropertyMask|3 gEfiShellPkgTokenSpaceGuid.PcdShellFileOperationSize|0x20000 -[PcdsFixedAtBuild.AARCH64] # Clearing BIT0 in this PCD prevents installing a 32-bit SMBIOS entry point, # if the entry point version is >= 3.0. AARCH64 OSes cannot assume the # presence of the 32-bit entry point anyway (because many AARCH64 systems @@ -363,7 +362,6 @@ # ACPI Support # ArmVirtPkg/CloudHvPlatformHasAcpiDtDxe/CloudHvHasAcpiDtDxe.inf -[Components.AARCH64] MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf ArmVirtPkg/CloudHvAcpiPlatformDxe/CloudHvAcpiPlatformDxe.inf { diff --git a/ArmVirtPkg/ArmVirtCloudHv.fdf b/ArmVirtPkg/ArmVirtCloudHv.fdf index 7bad8ed0b295..09f6b7734358 100644 --- a/ArmVirtPkg/ArmVirtCloudHv.fdf +++ b/ArmVirtPkg/ArmVirtCloudHv.fdf @@ -58,11 +58,7 @@ NumBlocks = $(FD_NUM_BLOCKS) # 0x00000000|0x00001000 DATA = { -!if $(ARCH) == AARCH64 0x00, 0x04, 0x00, 0x14 # 'b 0x1000' in AArch64 ASM -!else - 0xfe, 0x03, 0x00, 0xea # 'b 0x1000' in AArch32 ASM -!endif } 0x00001000|$(FVMAIN_COMPACT_SIZE) @@ -188,11 +184,9 @@ READ_LOCK_STATUS = TRUE # ACPI Support # INF ArmVirtPkg/CloudHvPlatformHasAcpiDtDxe/CloudHvHasAcpiDtDxe.inf -!if $(ARCH) == AARCH64 INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf INF ArmVirtPkg/CloudHvAcpiPlatformDxe/CloudHvAcpiPlatformDxe.inf -!endif # # PCI support diff --git a/ArmVirtPkg/ArmVirtKvmTool.dsc b/ArmVirtPkg/ArmVirtKvmTool.dsc index 9d0411d9e0c1..62ee806a0994 100644 --- a/ArmVirtPkg/ArmVirtKvmTool.dsc +++ b/ArmVirtPkg/ArmVirtKvmTool.dsc @@ -20,22 +20,19 @@ !ifdef $(EDK2_OUT_DIR) OUTPUT_DIRECTORY = $(EDK2_OUT_DIR) !else - OUTPUT_DIRECTORY = Build/ArmVirtKvmTool-$(ARCH) + OUTPUT_DIRECTORY = Build/ArmVirtKvmTool-AARCH64 !endif - SUPPORTED_ARCHITECTURES = AARCH64|ARM + SUPPORTED_ARCHITECTURES = AARCH64 BUILD_TARGETS = DEBUG|RELEASE SKUID_IDENTIFIER = DEFAULT FLASH_DEFINITION = ArmVirtPkg/ArmVirtKvmTool.fdf -[Defines.AARCH64] DEFINE ACPIVIEW_ENABLE = TRUE # This comes at the beginning of includes to pick all relevant defines early on. !include ArmVirtPkg/ArmVirtStackCookies.dsc.inc -!if $(ARCH) == AARCH64 !include DynamicTablesPkg/DynamicTables.dsc.inc -!endif !include MdePkg/MdeLibs.dsc.inc @@ -392,9 +389,7 @@ # SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf -!if $(ARCH) == AARCH64 # # ACPI Support # ArmVirtPkg/KvmtoolCfgMgrDxe/ConfigurationManagerDxe.inf -!endif diff --git a/ArmVirtPkg/ArmVirtKvmTool.fdf b/ArmVirtPkg/ArmVirtKvmTool.fdf index b20ef9c8446c..ede74c08a8ff 100644 --- a/ArmVirtPkg/ArmVirtKvmTool.fdf +++ b/ArmVirtPkg/ArmVirtKvmTool.fdf @@ -52,7 +52,6 @@ NumBlocks = 0x200 # 0x00000000|0x00008000 DATA = { -!if $(ARCH) == AARCH64 0x01, 0x00, 0x00, 0x10, # code0: adr x1, . 0xff, 0x1f, 0x00, 0x14, # code1: b 0x8000 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, # text_offset: 512 KB @@ -63,22 +62,6 @@ DATA = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # res4 0x41, 0x52, 0x4d, 0x64, # magic: "ARM\x64" 0x00, 0x00, 0x00, 0x00 # res5 -!else - 0x08, 0x10, 0x4f, 0xe2, # adr r1, . - 0x02, 0x00, 0xa0, 0xe1, # mov r0, r2 (DTB) - 0x00, 0x00, 0xa0, 0xe1, # nop - 0x00, 0x00, 0xa0, 0xe1, # nop - 0x00, 0x00, 0xa0, 0xe1, # nop - 0x00, 0x00, 0xa0, 0xe1, # nop - 0x00, 0x00, 0xa0, 0xe1, # nop - 0x00, 0x00, 0xa0, 0xe1, # nop - - 0xf6, 0x1f, 0x00, 0xea, # b 0x8000 - 0x18, 0x28, 0x6f, 0x01, # magic - 0x00, 0x00, 0x00, 0x00, # start - 0x00, 0x00, 0x20, 0x00, # image size: 2 MB - 0x01, 0x02, 0x03, 0x04 # endiannness flag -!endif } 0x00008000|0x001f8000 @@ -200,7 +183,6 @@ READ_LOCK_STATUS = TRUE INF OvmfPkg/VirtioPciDeviceDxe/VirtioPciDeviceDxe.inf INF OvmfPkg/Virtio10Dxe/Virtio10.inf -!if $(ARCH) == AARCH64 # # ACPI Support # @@ -211,7 +193,6 @@ READ_LOCK_STATUS = TRUE !include DynamicTablesPkg/DynamicTables.fdf.inc INF ArmVirtPkg/KvmtoolCfgMgrDxe/ConfigurationManagerDxe.inf -!endif # # TianoCore logo (splash screen) diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc index c8e8ab2b0545..5e6ad0654b04 100644 --- a/ArmVirtPkg/ArmVirtQemu.dsc +++ b/ArmVirtPkg/ArmVirtQemu.dsc @@ -17,8 +17,8 @@ PLATFORM_GUID = 37d7e986-f7e9-45c2-8067-e371421a626c PLATFORM_VERSION = 0.1 DSC_SPECIFICATION = 0x00010005 - OUTPUT_DIRECTORY = Build/ArmVirtQemu-$(ARCH) - SUPPORTED_ARCHITECTURES = AARCH64|ARM + OUTPUT_DIRECTORY = Build/ArmVirtQemu-AArch64 + SUPPORTED_ARCHITECTURES = AARCH64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT FLASH_DEFINITION = ArmVirtPkg/ArmVirtQemu.fdf @@ -109,12 +109,8 @@ MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf !endif -[LibraryClasses.AARCH64] ArmPlatformLib|ArmVirtPkg/Library/ArmPlatformLibQemu/ArmPlatformLibQemu.inf -[LibraryClasses.ARM] - ArmPlatformLib|ArmPlatformPkg/Library/ArmPlatformLibNull/ArmPlatformLibNull.inf - [LibraryClasses.common.PEIM] ArmVirtMemInfoLib|ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoPeiLib.inf ArmMonitorLib|ArmVirtPkg/Library/ArmVirtMonitorPeiLib/ArmVirtMonitorPeiLib.inf @@ -127,13 +123,9 @@ MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf !endif -[LibraryClasses.AARCH64.PEIM] ArmMmuLib|UefiCpuPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf BaseCryptLib|CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf -[LibraryClasses.ARM.PEIM] - BaseCryptLib|CryptoPkg/Library/BaseCryptLibMbedTls/PeiCryptLib.inf - [LibraryClasses.common.DXE_DRIVER] AcpiPlatformLib|OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf diff --git a/ArmVirtPkg/ArmVirtQemu.fdf b/ArmVirtPkg/ArmVirtQemu.fdf index 1e45d5172991..fc502d19d2a2 100644 --- a/ArmVirtPkg/ArmVirtQemu.fdf +++ b/ArmVirtPkg/ArmVirtQemu.fdf @@ -60,11 +60,7 @@ NumBlocks = $(FD_NUM_BLOCKS) # 0x00000000|0x00001000 DATA = { -!if $(ARCH) == AARCH64 0x00, 0x04, 0x00, 0x14 # 'b 0x1000' in AArch64 ASM -!else - 0xfe, 0x03, 0x00, 0xea # 'b 0x1000' in AArch32 ASM -!endif } 0x00001000|$(FVMAIN_COMPACT_SIZE) diff --git a/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc b/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc index e25d6bbe077f..df9fa67ddf1a 100644 --- a/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc +++ b/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc @@ -147,11 +147,9 @@ READ_LOCK_STATUS = TRUE # ACPI Support # INF OvmfPkg/PlatformHasAcpiDtDxe/PlatformHasAcpiDtDxe.inf -!if $(ARCH) == AARCH64 INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf INF OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf -!endif # # PCI support diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc index eee9590a7ef3..ff424be552f6 100644 --- a/ArmVirtPkg/ArmVirtQemuKernel.dsc +++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc @@ -17,8 +17,8 @@ PLATFORM_GUID = 37d7e986-f7e9-45c2-8067-e371421a626c PLATFORM_VERSION = 0.1 DSC_SPECIFICATION = 0x00010005 - OUTPUT_DIRECTORY = Build/ArmVirtQemuKernel-$(ARCH) - SUPPORTED_ARCHITECTURES = AARCH64|ARM + OUTPUT_DIRECTORY = Build/ArmVirtQemuKernel-AArch64 + SUPPORTED_ARCHITECTURES = AARCH64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT FLASH_DEFINITION = ArmVirtPkg/ArmVirtQemuKernel.fdf diff --git a/ArmVirtPkg/ArmVirtQemuKernel.fdf b/ArmVirtPkg/ArmVirtQemuKernel.fdf index 55e33aba0d55..a6df034da1bf 100644 --- a/ArmVirtPkg/ArmVirtQemuKernel.fdf +++ b/ArmVirtPkg/ArmVirtQemuKernel.fdf @@ -60,7 +60,6 @@ NumBlocks = $(FD_NUM_BLOCKS) # 0x00000000|0x00008000 DATA = { -!if $(ARCH) == AARCH64 0x01, 0x00, 0x00, 0x10, # code0: adr x1, . 0xff, 0x1f, 0x00, 0x14, # code1: b 0x8000 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, # text_offset: 512 KB @@ -76,27 +75,6 @@ DATA = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # res4 0x41, 0x52, 0x4d, 0x64, # magic: "ARM\x64" 0x00, 0x00, 0x00, 0x00 # res5 -!else - 0x08, 0x10, 0x4f, 0xe2, # adr r1, . - 0x02, 0x00, 0xa0, 0xe1, # mov r0, r2 (DTB) - 0x00, 0x00, 0xa0, 0xe1, # nop - 0x00, 0x00, 0xa0, 0xe1, # nop - 0x00, 0x00, 0xa0, 0xe1, # nop - 0x00, 0x00, 0xa0, 0xe1, # nop - 0x00, 0x00, 0xa0, 0xe1, # nop - 0x00, 0x00, 0xa0, 0xe1, # nop - - 0xf6, 0x1f, 0x00, 0xea, # b 0x8000 - 0x18, 0x28, 0x6f, 0x01, # magic - 0x00, 0x00, 0x00, 0x00, # start -!if $(FD_SIZE_IN_MB) == 2 - 0x00, 0x00, 0x20, 0x00, # image size: 2 MB -!endif -!if $(FD_SIZE_IN_MB) == 3 - 0x00, 0x00, 0x30, 0x00, # image size: 3 MB -!endif - 0x01, 0x02, 0x03, 0x04 # endiannness flag -!endif } 0x00008000|$(FVMAIN_COMPACT_SIZE) diff --git a/ArmVirtPkg/ArmVirtStackCookies.dsc.inc b/ArmVirtPkg/ArmVirtStackCookies.dsc.inc index 788fdccc1650..93053afe7c3d 100644 --- a/ArmVirtPkg/ArmVirtStackCookies.dsc.inc +++ b/ArmVirtPkg/ArmVirtStackCookies.dsc.inc @@ -6,11 +6,4 @@ # [Defines] - -# Dynamic stack cookies are not supported on ARM -!if $(ARCH) == ARM - DEFINE CUSTOM_STACK_CHECK_LIB = STATIC -!else DEFINE CUSTOM_STACK_CHECK_LIB = DYNAMIC -!endif - diff --git a/ArmVirtPkg/ArmVirtXen.dsc b/ArmVirtPkg/ArmVirtXen.dsc index 55f418238c88..2ec264a15e90 100644 --- a/ArmVirtPkg/ArmVirtXen.dsc +++ b/ArmVirtPkg/ArmVirtXen.dsc @@ -18,7 +18,7 @@ PLATFORM_VERSION = 0.1 DSC_SPECIFICATION = 0x00010005 OUTPUT_DIRECTORY = Build/ArmVirtXen-$(ARCH) - SUPPORTED_ARCHITECTURES = AARCH64|ARM + SUPPORTED_ARCHITECTURES = AARCH64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT FLASH_DEFINITION = ArmVirtPkg/ArmVirtXen.fdf diff --git a/ArmVirtPkg/ArmVirtXen.fdf b/ArmVirtPkg/ArmVirtXen.fdf index d149f9b6d5fb..dc692ff359af 100644 --- a/ArmVirtPkg/ArmVirtXen.fdf +++ b/ArmVirtPkg/ArmVirtXen.fdf @@ -60,7 +60,6 @@ NumBlocks = $(FD_NUM_BLOCKS) # 0x00000000|0x00002000 DATA = { -!if $(ARCH) == AARCH64 0x01, 0x00, 0x00, 0x10, # code0: adr x1, . 0xff, 0x07, 0x00, 0x14, # code1: b 0x2000 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, # text_offset: 512 KB @@ -76,27 +75,6 @@ DATA = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # res4 0x41, 0x52, 0x4d, 0x64, # magic: "ARM\x64" 0x00, 0x00, 0x00, 0x00 # res5 -!else - 0x08, 0x10, 0x4f, 0xe2, # adr r1, . - 0x02, 0x00, 0xa0, 0xe1, # mov r0, r2 (DTB) - 0x00, 0x00, 0xa0, 0xe1, # nop - 0x00, 0x00, 0xa0, 0xe1, # nop - 0x00, 0x00, 0xa0, 0xe1, # nop - 0x00, 0x00, 0xa0, 0xe1, # nop - 0x00, 0x00, 0xa0, 0xe1, # nop - 0x00, 0x00, 0xa0, 0xe1, # nop - - 0xf6, 0x07, 0x00, 0xea, # b 0x2000 - 0x18, 0x28, 0x6f, 0x01, # magic - 0x00, 0x00, 0x00, 0x00, # start -!if $(FD_SIZE_IN_MB) == 2 - 0x00, 0x00, 0x20, 0x00, # image size: 2 MB -!endif -!if $(FD_SIZE_IN_MB) == 3 - 0x00, 0x00, 0x30, 0x00, # image size: 3 MB -!endif - 0x01, 0x02, 0x03, 0x04 # endiannness flag -!endif } 0x00002000|$(FVMAIN_COMPACT_SIZE) @@ -195,10 +173,8 @@ READ_LOCK_STATUS = TRUE # ACPI support # INF ArmVirtPkg/XenPlatformHasAcpiDtDxe/XenPlatformHasAcpiDtDxe.inf -!if $(ARCH) == AARCH64 INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf INF ArmVirtPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf -!endif # # Ramdisk support diff --git a/ArmVirtPkg/Library/ArmPlatformLibQemu/AArch64/ArmPlatformHelper.S b/ArmVirtPkg/Library/ArmPlatformLibQemu/ArmPlatformHelper.S similarity index 100% rename from ArmVirtPkg/Library/ArmPlatformLibQemu/AArch64/ArmPlatformHelper.S rename to ArmVirtPkg/Library/ArmPlatformLibQemu/ArmPlatformHelper.S diff --git a/ArmVirtPkg/Library/ArmPlatformLibQemu/ArmPlatformLibQemu.inf b/ArmVirtPkg/Library/ArmPlatformLibQemu/ArmPlatformLibQemu.inf index b2ecdfa061cb..040497bdb2f0 100644 --- a/ArmVirtPkg/Library/ArmPlatformLibQemu/ArmPlatformLibQemu.inf +++ b/ArmVirtPkg/Library/ArmPlatformLibQemu/ArmPlatformLibQemu.inf @@ -31,9 +31,7 @@ [Sources.common] ArmPlatformLibQemu.c IdMap.S - -[Sources.AArch64] - AArch64/ArmPlatformHelper.S + ArmPlatformHelper.S [FixedPcd] gArmTokenSpaceGuid.PcdArmPrimaryCoreMask diff --git a/ArmVirtPkg/Library/ArmVirtPciHostBridgeUtilityLib/ArmVirtPciHostBridgeUtilityLib.inf b/ArmVirtPkg/Library/ArmVirtPciHostBridgeUtilityLib/ArmVirtPciHostBridgeUtilityLib.inf index 80fdd2b1e55e..3f6f6193b977 100644 --- a/ArmVirtPkg/Library/ArmVirtPciHostBridgeUtilityLib/ArmVirtPciHostBridgeUtilityLib.inf +++ b/ArmVirtPkg/Library/ArmVirtPciHostBridgeUtilityLib/ArmVirtPciHostBridgeUtilityLib.inf @@ -20,7 +20,7 @@ # The following information is for reference only and not required by the build # tools. # -# VALID_ARCHITECTURES = AARCH64 ARM +# VALID_ARCHITECTURES = AARCH64 # [Sources] diff --git a/ArmVirtPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml b/ArmVirtPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml index 4a63b501b6c8..b3c7aa12227e 100644 --- a/ArmVirtPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml +++ b/ArmVirtPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml @@ -50,27 +50,6 @@ jobs: Build.Target: "NOOPT" Run.Flags: $(run_flags) Run: $(should_run) - QEMU_ARM_DEBUG: - Build.File: "$(package)/PlatformCI/QemuBuild.py" - Build.Arch: "ARM" - Build.Flags: "" - Build.Target: "DEBUG" - Run.Flags: $(run_flags) - Run: $(should_run) - QEMU_ARM_RELEASE: - Build.File: "$(package)/PlatformCI/QemuBuild.py" - Build.Arch: "ARM" - Build.Flags: "" - Build.Target: "RELEASE" - Run.Flags: $(run_flags) - Run: $(should_run) - QEMU_ARM_NOOPT: - Build.File: "$(package)/PlatformCI/QemuBuild.py" - Build.Arch: "ARM" - Build.Flags: "" - Build.Target: "NOOPT" - Run.Flags: $(run_flags) - Run: $(should_run) QEMU_KERNEL_AARCH64_DEBUG: Build.File: "$(package)/PlatformCI/QemuKernelBuild.py" @@ -93,27 +72,6 @@ jobs: Build.Target: "NOOPT" Run.Flags: $(run_flags) Run: $(should_run) - QEMU_KERNEL_ARM_DEBUG: - Build.File: "$(package)/PlatformCI/QemuKernelBuild.py" - Build.Arch: "ARM" - Build.Flags: "" - Build.Target: "DEBUG" - Run.Flags: $(run_flags) - Run: $(should_run) - QEMU_KERNEL_ARM_RELEASE: - Build.File: "$(package)/PlatformCI/QemuKernelBuild.py" - Build.Arch: "ARM" - Build.Flags: "" - Build.Target: "RELEASE" - Run.Flags: $(run_flags) - Run: $(should_run) - QEMU_KERNEL_ARM_NOOPT: - Build.File: "$(package)/PlatformCI/QemuKernelBuild.py" - Build.Arch: "ARM" - Build.Flags: "" - Build.Target: "NOOPT" - Run.Flags: $(run_flags) - Run: $(should_run) KVMTOOL_AARCH64_DEBUG: Build.File: "$(package)/PlatformCI/KvmToolBuild.py" @@ -127,18 +85,6 @@ jobs: Build.Flags: "" Build.Target: "RELEASE" Run: false - KVMTOOL_ARM_DEBUG: - Build.File: "$(package)/PlatformCI/KvmToolBuild.py" - Build.Arch: "ARM" - Build.Flags: "" - Build.Target: "DEBUG" - Run: false - KVMTOOL_ARM_RELEASE: - Build.File: "$(package)/PlatformCI/KvmToolBuild.py" - Build.Arch: "ARM" - Build.Flags: "" - Build.Target: "RELEASE" - Run: false CLOUDHV_AARCH64_DEBUG: Build.File: "$(package)/PlatformCI/CloudHvBuild.py" diff --git a/ArmVirtPkg/PlatformCI/KvmToolBuild.py b/ArmVirtPkg/PlatformCI/KvmToolBuild.py index 4d02dba124ac..d43cfd5c150d 100644 --- a/ArmVirtPkg/PlatformCI/KvmToolBuild.py +++ b/ArmVirtPkg/PlatformCI/KvmToolBuild.py @@ -19,7 +19,7 @@ class CommonPlatform(): for the different parts of stuart ''' PackagesSupported = ("ArmVirtPkg",) - ArchSupported = ("AARCH64", "ARM") + ArchSupported = ("AARCH64",) TargetsSupported = ("DEBUG", "RELEASE") Scopes = ('armvirt', 'edk2-build') WorkspaceRoot = os.path.realpath(os.path.join( diff --git a/ArmVirtPkg/PlatformCI/PlatformBuildLib.py b/ArmVirtPkg/PlatformCI/PlatformBuildLib.py index 3ba6dea5616b..6895677d438f 100644 --- a/ArmVirtPkg/PlatformCI/PlatformBuildLib.py +++ b/ArmVirtPkg/PlatformCI/PlatformBuildLib.py @@ -57,7 +57,6 @@ def GetRequiredSubmodules(self): ret = RunCmd("git", "config --file .gitmodules --get-regexp path", workingdir=self.GetWorkspaceRoot(), outstream=result) # Cmd output is expected to look like: # submodule.CryptoPkg/Library/OpensslLib/openssl.path CryptoPkg/Library/OpensslLib/openssl - # submodule.SoftFloat.path ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3 if ret == 0: for line in result.getvalue().splitlines(): _, _, path = line.partition(" ") @@ -94,8 +93,6 @@ def GetActiveScopes(self): if GetHostInfo().os.upper() == "LINUX" and ActualToolChainTag.upper().startswith("GCC"): if "AARCH64" in self.ActualArchitectures: scopes += ("gcc_aarch64_linux",) - if "ARM" in self.ActualArchitectures: - scopes += ("gcc_arm_linux",) return scopes def FilterPackagesToTest(self, changedFilesList: list, potentialPackagesList: list) -> list: @@ -168,8 +165,6 @@ def GetActiveScopes(self): if GetHostInfo().os.upper() == "LINUX" and ActualToolChainTag.upper().startswith("GCC"): if "AARCH64" == Arch: scopes += ("gcc_aarch64_linux",) - elif "ARM" == Arch: - scopes += ("gcc_arm_linux",) return scopes def GetName(self): @@ -236,10 +231,6 @@ def FlashRomImage(self): cmd = "qemu-system-aarch64" args = "-M virt" args += " -cpu neoverse-n2" # emulate cpu - elif(self.env.GetValue("TARGET_ARCH").upper() == "ARM"): - cmd = "qemu-system-arm" - args = "-M virt,highmem=off" - args += " -cpu cortex-a15" # emulate cpu else: raise NotImplementedError() diff --git a/ArmVirtPkg/PlatformCI/QemuBuild.py b/ArmVirtPkg/PlatformCI/QemuBuild.py index c651a9501fcf..bf3c7b3e2f84 100644 --- a/ArmVirtPkg/PlatformCI/QemuBuild.py +++ b/ArmVirtPkg/PlatformCI/QemuBuild.py @@ -19,7 +19,7 @@ class CommonPlatform(): for the different parts of stuart ''' PackagesSupported = ("ArmVirtPkg",) - ArchSupported = ("AARCH64", "ARM") + ArchSupported = ("AARCH64",) TargetsSupported = ("DEBUG", "RELEASE", "NOOPT") Scopes = ('armvirt', 'edk2-build') WorkspaceRoot = os.path.realpath(os.path.join( diff --git a/ArmVirtPkg/PlatformCI/QemuKernelBuild.py b/ArmVirtPkg/PlatformCI/QemuKernelBuild.py index f340dfac8843..f62bf3d42844 100644 --- a/ArmVirtPkg/PlatformCI/QemuKernelBuild.py +++ b/ArmVirtPkg/PlatformCI/QemuKernelBuild.py @@ -19,7 +19,7 @@ class CommonPlatform(): for the different parts of stuart ''' PackagesSupported = ("ArmVirtPkg",) - ArchSupported = ("AARCH64", "ARM") + ArchSupported = ("AARCH64",) TargetsSupported = ("DEBUG", "RELEASE", "NOOPT") Scopes = ('armvirt', 'edk2-build') WorkspaceRoot = os.path.realpath(os.path.join( diff --git a/ArmVirtPkg/PlatformCI/ReadMe.md b/ArmVirtPkg/PlatformCI/ReadMe.md index 4e3709492b6c..b9196253d9c8 100644 --- a/ArmVirtPkg/PlatformCI/ReadMe.md +++ b/ArmVirtPkg/PlatformCI/ReadMe.md @@ -12,15 +12,10 @@ supported. | Configuration name | Architecture | DSC File | Additional Flags | | :---------- | :----- | :----- | :---- | | AARCH64 - KVM Cloud HV | AARCH64 | ArmVirtCloudHv.dsc | None | -| ARM - KVM Cloud HV | ARM | ArmVirtCloudHv.dsc | None | | AARCH64 - kvmtool | AARCH64 | ArmVirtKvmTool.dsc | None | -| ARM - kvmtool | ARM | ArmVirtKvmTool.dsc | None | | AARCH64 - QEMU | AARCH64 | ArmVirtQemu.dsc | None | -| ARM - QEMU | ARM | ArmVirtQemu.dsc | None | | AARCH64 - QEMU Kernel | AARCH64 | ArmVirtQemuKernel.dsc | None | -| ARM - QEMU Kernel | ARM | ArmVirtQemuKernel.dsc | None | | AARCH64 - Xen HV | AARCH64 | ArmVirtXen.dsc | None | -| ARM - Xen HV | ARM | ArmVirtXen.dsc | None | ## EDK2 Developer environment diff --git a/ArmVirtPkg/PrePi/AArch64/ArchPrePi.c b/ArmVirtPkg/PrePi/ArchPrePi.c similarity index 100% rename from ArmVirtPkg/PrePi/AArch64/ArchPrePi.c rename to ArmVirtPkg/PrePi/ArchPrePi.c diff --git a/ArmVirtPkg/PrePi/Arm/ArchPrePi.c b/ArmVirtPkg/PrePi/Arm/ArchPrePi.c deleted file mode 100644 index 47ca75559946..000000000000 --- a/ArmVirtPkg/PrePi/Arm/ArchPrePi.c +++ /dev/null @@ -1,16 +0,0 @@ -/** @file -* -* Copyright (c) 2011-2013, ARM Limited. All rights reserved. -* -* SPDX-License-Identifier: BSD-2-Clause-Patent -* -**/ - -#include "PrePi.h" - -VOID -ArchInitialize ( - VOID - ) -{ -} diff --git a/ArmVirtPkg/PrePi/Arm/ModuleEntryPoint.S b/ArmVirtPkg/PrePi/Arm/ModuleEntryPoint.S deleted file mode 100644 index 3e94c494478d..000000000000 --- a/ArmVirtPkg/PrePi/Arm/ModuleEntryPoint.S +++ /dev/null @@ -1,188 +0,0 @@ -// -// Copyright (c) 2011-2013, ARM Limited. All rights reserved. -// Copyright (c) 2015-2016, Linaro Limited. All rights reserved. -// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -// - -#include - -ASM_FUNC(_ModuleEntryPoint) - // Do early platform specific actions - bl ASM_PFX(ArmPlatformPeiBootAction) - -#if (FixedPcdGet32 (PcdVFPEnabled)) - // Enable Floating Point. AArch64 uses hardfloat ABI so needs this done before - // calling any C code. Arm does not, but let's keep the ports aligned. - bl ArmEnableVFP -#endif - - // Get ID of this CPU in Multicore system - bl ASM_PFX(ArmReadMpidr) - // Keep a copy of the MpId register value - mov r10, r0 - -// Check if we can install the stack at the top of the System Memory or if we need -// to install the stacks at the bottom of the Firmware Device (case the FD is located -// at the top of the DRAM) -_SetupStackPosition: - // Compute Top of System Memory - LDRL (r1, PcdGet64 (PcdSystemMemoryBase)) - ADRL (r12, PcdGet64 (PcdSystemMemorySize)) - ldrd r2, r3, [r12] - - // calculate the top of memory - adds r2, r2, r1 - sub r2, r2, #1 - addcs r3, r3, #1 - - // truncate the memory used by UEFI to 4 GB range - teq r3, #0 - movne r1, #-1 - moveq r1, r2 - - // Calculate Top of the Firmware Device - LDRL (r2, PcdGet64 (PcdFdBaseAddress)) - MOV32 (r3, FixedPcdGet32 (PcdFdSize) - 1) - add r3, r3, r2 // r3 = FdTop = PcdFdBaseAddress + PcdFdSize - - // UEFI Memory Size (stacks are allocated in this region) - MOV32 (r4, FixedPcdGet32(PcdSystemMemoryUefiRegionSize)) - - // - // Reserve the memory for the UEFI region (contain stacks on its top) - // - - // Calculate how much space there is between the top of the Firmware and the Top of the System Memory - subs r0, r1, r3 // r0 = SystemMemoryTop - FdTop - bmi _SetupStack // Jump if negative (FdTop > SystemMemoryTop). Case when the PrePi is in XIP memory outside of the DRAM - cmp r0, r4 - bge _SetupStack - - // Case the top of stacks is the FdBaseAddress - mov r1, r2 - -_SetupStack: - // r1 contains the top of the stack (and the UEFI Memory) - - // Because the 'push' instruction is equivalent to 'stmdb' (decrement before), we need to increment - // one to the top of the stack. We check if incrementing one does not overflow (case of DRAM at the - // top of the memory space) - adds r11, r1, #1 - bcs _SetupOverflowStack - -_SetupAlignedStack: - mov r1, r11 - b _GetBaseUefiMemory - -_SetupOverflowStack: - // Case memory at the top of the address space. Ensure the top of the stack is EFI_PAGE_SIZE - // aligned (4KB) - MOV32 (r11, (~EFI_PAGE_MASK) & 0xffffffff) - and r1, r1, r11 - -_GetBaseUefiMemory: - // Calculate the Base of the UEFI Memory - sub r11, r1, r4 - -_GetStackBase: - // r1 = The top of the Mpcore Stacks - mov sp, r1 - - // Stack for the primary core = PrimaryCoreStack - MOV32 (r2, FixedPcdGet32(PcdCPUCorePrimaryStackSize)) - sub r9, r1, r2 - - mov r0, r10 - mov r1, r11 - mov r2, r9 - - // Jump to PrePiCore C code - // r0 = MpId - // r1 = UefiMemoryBase - // r2 = StacksBase - bl ASM_PFX(CEntryPoint) - -_NeverReturn: - b _NeverReturn - -ASM_PFX(ArmPlatformPeiBootAction): - // - // If we are booting from RAM using the Linux kernel boot protocol, r0 will - // point to the DTB image in memory. Otherwise, use the default value defined - // by the platform. - // - teq r0, #0 - bne 0f - LDRL (r0, PcdGet64 (PcdDeviceTreeInitialBaseAddress)) - -0:mov r11, r14 // preserve LR - mov r10, r0 // preserve DTB pointer - mov r9, r1 // preserve base of image pointer - - // - // The base of the runtime image has been preserved in r1. Check whether - // the expected magic number can be found in the header. - // - ldr r8, .LArm32LinuxMagic - ldr r7, [r1, #0x24] - cmp r7, r8 - bne .Lout - - // - // - // OK, so far so good. We have confirmed that we likely have a DTB and are - // booting via the ARM Linux boot protocol. Update the base-of-image PCD - // to the actual relocated value, and add the shift of PcdFdBaseAddress to - // PcdFvBaseAddress as well - // - ADRL (r8, PcdGet64 (PcdFdBaseAddress)) - ADRL (r7, PcdGet64 (PcdFvBaseAddress)) - ldr r6, [r8] - ldr r5, [r7] - sub r5, r5, r6 - add r5, r5, r1 - str r1, [r8] - str r5, [r7] - - // - // The runtime address may be different from the link time address so fix - // up the PE/COFF relocations. Since we are calling a C function, use the - // window at the beginning of the FD image as a temp stack. - // - mov r0, r5 - ADRL (r1, PeCoffLoaderImageReadFromMemory) - mov sp, r5 - bl RelocatePeCoffImage - - // - // Discover the memory size and offset from the DTB, and record in the - // respective PCDs. This will also return false if a corrupt DTB is - // encountered. - // - mov r0, r10 - ADRL (r1, PcdGet64 (PcdSystemMemoryBase)) - ADRL (r2, PcdGet64 (PcdSystemMemorySize)) - bl FindMemnode - teq r0, #0 - beq .Lout - - // - // Copy the DTB to the slack space right after the 64 byte arm64/Linux style - // image header at the base of this image (defined in the FDF), and record the - // pointer in PcdDeviceTreeInitialBaseAddress. - // - ADRL (r8, PcdGet64 (PcdDeviceTreeInitialBaseAddress)) - add r9, r9, #0x40 - str r9, [r8] - - mov r0, r9 - mov r1, r10 - bl CopyFdt - -.Lout: - bx r11 - -.LArm32LinuxMagic: - .byte 0x18, 0x28, 0x6f, 0x01 diff --git a/ArmVirtPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf b/ArmVirtPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf index b1b9dcd0e407..54db084d7908 100755 --- a/ArmVirtPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf +++ b/ArmVirtPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf @@ -19,14 +19,8 @@ FdtParser.c PrePi.c PrePi.h - -[Sources.AArch64] - AArch64/ArchPrePi.c - AArch64/ModuleEntryPoint.S - -[Sources.ARM] - Arm/ArchPrePi.c - Arm/ModuleEntryPoint.S + ArchPrePi.c + ModuleEntryPoint.S [Packages] MdePkg/MdePkg.dec @@ -85,9 +79,6 @@ gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiLoaderCode gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiLoaderData -[FixedPcd.ARM] - gArmTokenSpaceGuid.PcdVFPEnabled - [Pcd] gArmTokenSpaceGuid.PcdSystemMemoryBase gArmTokenSpaceGuid.PcdSystemMemorySize diff --git a/ArmVirtPkg/PrePi/AArch64/ModuleEntryPoint.S b/ArmVirtPkg/PrePi/ModuleEntryPoint.S similarity index 100% rename from ArmVirtPkg/PrePi/AArch64/ModuleEntryPoint.S rename to ArmVirtPkg/PrePi/ModuleEntryPoint.S From 9b931ae81fccfb98b800f059132f2a2c4c30f85c Mon Sep 17 00:00:00 2001 From: Damien-Chen Date: Thu, 10 Jul 2025 20:31:19 +0800 Subject: [PATCH 0447/1172] FmpDevicePkg/Library: Correct comment description Correct comment description. Signed-off-by: Damien Chen --- FmpDevicePkg/Library/FmpDependencyLib/FmpDependencyLib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FmpDevicePkg/Library/FmpDependencyLib/FmpDependencyLib.c b/FmpDevicePkg/Library/FmpDependencyLib/FmpDependencyLib.c index 11ee83d3ea8a..7e17fd4d42ab 100644 --- a/FmpDevicePkg/Library/FmpDependencyLib/FmpDependencyLib.c +++ b/FmpDevicePkg/Library/FmpDependencyLib/FmpDependencyLib.c @@ -81,7 +81,7 @@ GrowDepexStack ( if (mDepexEvaluationStack != NULL) { // - // Copy to Old Stack to the New Stack + // Copy from Old Stack to the New Stack // CopyMem ( NewStack, From 10b310f9b2047b7ff935974371eb59c1e0b46594 Mon Sep 17 00:00:00 2001 From: Ray Ni Date: Tue, 9 Sep 2025 16:49:25 +0800 Subject: [PATCH 0448/1172] StandaloneMmPkg/Ipl: Do not check return status of MmCore's entry point Per PI spec the entry point of standalone MM core returns "VOID". So it's not right to check the return status of MM core's entry point. In rare case, it might hit assertion as the MM core's entry point has no responsibility to reset RAX to 0 (in x64 arch). Signed-off-by: Ray Ni Cc: Ard Biesheuvel Cc: Sami Mujawar Cc: Dun Tan Cc: Eduardo Cuevas Farfan --- .../StandaloneMmIplPei/StandaloneMmIplPei.c | 33 +++++++++---------- StandaloneMmPkg/Include/StandaloneMm.h | 12 +++++-- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c index 1ab84ec56eb8..1dc9fd31fd96 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c @@ -674,20 +674,20 @@ ExecuteMmCoreFromMmram ( IN MM_COMM_BUFFER *MmCommBuffer ) { - EFI_STATUS Status; - UINTN PageCount; - VOID *MmHobList; - UINTN MmHobSize; - EFI_GUID MmCoreFileName; - UINTN MmFvSize; - EFI_PHYSICAL_ADDRESS MmFvBase; - PE_COFF_LOADER_IMAGE_CONTEXT ImageContext; - STANDALONE_MM_FOUNDATION_ENTRY_POINT Entry; - EFI_MMRAM_HOB_DESCRIPTOR_BLOCK *Block; - EFI_PEI_MM_ACCESS_PPI *MmAccess; - UINTN Size; - UINTN Index; - UINTN MmramRangeCount; + EFI_STATUS Status; + UINTN PageCount; + VOID *MmHobList; + UINTN MmHobSize; + EFI_GUID MmCoreFileName; + UINTN MmFvSize; + EFI_PHYSICAL_ADDRESS MmFvBase; + PE_COFF_LOADER_IMAGE_CONTEXT ImageContext; + MM_FOUNDATION_ENTRY_POINT Entry; + EFI_MMRAM_HOB_DESCRIPTOR_BLOCK *Block; + EFI_PEI_MM_ACCESS_PPI *MmAccess; + UINTN Size; + UINTN Index; + UINTN MmramRangeCount; MmFvBase = 0; MmFvSize = 0; @@ -808,9 +808,8 @@ ExecuteMmCoreFromMmram ( // // Execute image // - Entry = (STANDALONE_MM_FOUNDATION_ENTRY_POINT)(UINTN)ImageContext.EntryPoint; - Status = Entry (MmHobList); - ASSERT_EFI_ERROR (Status); + Entry = (MM_FOUNDATION_ENTRY_POINT)(UINTN)ImageContext.EntryPoint; + Entry (MmHobList); FreePages (MmHobList, EFI_SIZE_TO_PAGES (MmHobSize)); } } diff --git a/StandaloneMmPkg/Include/StandaloneMm.h b/StandaloneMmPkg/Include/StandaloneMm.h index 05f1da593af3..743ab517f9f7 100644 --- a/StandaloneMmPkg/Include/StandaloneMm.h +++ b/StandaloneMmPkg/Include/StandaloneMm.h @@ -1,7 +1,7 @@ /** @file Standalone MM. -Copyright (c) 2015, Intel Corporation. All rights reserved.
+Copyright (c) 2015 - 2025, Intel Corporation. All rights reserved.
Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -21,9 +21,15 @@ EFI_STATUS ); typedef -EFI_STATUS -(EFIAPI *STANDALONE_MM_FOUNDATION_ENTRY_POINT)( +VOID +(EFIAPI *MM_FOUNDATION_ENTRY_POINT)( IN VOID *HobStart ); +// +// STANDALONE_MM_FOUNDATION_ENTRY_POINT definition is kept for backward compatibility. +// Will remove it once all the code references are removed. +// +typedef MM_FOUNDATION_ENTRY_POINT STANDALONE_MM_FOUNDATION_ENTRY_POINT; + #endif From 502f0dfda4f2c4d1cc091f68b6467b6ef12cab45 Mon Sep 17 00:00:00 2001 From: Richard Lyu Date: Wed, 10 Sep 2025 21:56:11 +0800 Subject: [PATCH 0449/1172] OvmfPkg: Add NETWORK_ISCSI_DEFAULT_ENABLE build flag REF: https://github.com/tianocore/edk2/issues/11483 Introduce a new build flag NETWORK_ISCSI_DEFAULT_ENABLE to control whether iSCSI support is enabled by default without setting fwcfg. This allows developers to decide at build time if the IScsiDxe driver should be included and enabled by default. If NETWORK_ISCSI_DEFAULT_ENABLE is set to FALSE, IScsiDxe will still be built when NETWORK_ISCSI_ENABLE is TRUE, but the default PCD value (gUefiOvmfPkgTokenSpaceGuid.PcdEntryPointOverrideDefaultValue) will be set to "no". This ensures iSCSI remains disabled at runtime unless enabled explicitly by fwcfg. This change provides more flexibility for both build-time and runtime configuration of iSCSI support. Signed-off-by: Richard Lyu --- OvmfPkg/Include/Dsc/NetworkComponents.dsc.inc | 4 +++- OvmfPkg/OvmfPkgX64.dsc | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/Include/Dsc/NetworkComponents.dsc.inc b/OvmfPkg/Include/Dsc/NetworkComponents.dsc.inc index 051fe950ceac..288216373a30 100644 --- a/OvmfPkg/Include/Dsc/NetworkComponents.dsc.inc +++ b/OvmfPkg/Include/Dsc/NetworkComponents.dsc.inc @@ -48,7 +48,9 @@ UefiDriverEntryPoint|OvmfPkg/Library/UefiDriverEntryPointFwCfgOverrideLib/UefiDriverEntryPointFwCfgOverrideLib.inf gUefiOvmfPkgTokenSpaceGuid.PcdEntryPointOverrideFwCfgVarName|"opt/org.tianocore/ISCSISupport" - gUefiOvmfPkgTokenSpaceGuid.PcdEntryPointOverrideDefaultValue|"no" + !if $(NETWORK_ISCSI_DEFAULT_ENABLE) == FALSE + gUefiOvmfPkgTokenSpaceGuid.PcdEntryPointOverrideDefaultValue|"no" + !endif } !endif diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index f859db6acd39..7d7bb5dbb046 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -51,6 +51,7 @@ DEFINE NETWORK_HTTP_BOOT_ENABLE = FALSE DEFINE NETWORK_ALLOW_HTTP_CONNECTIONS = TRUE DEFINE NETWORK_ISCSI_ENABLE = TRUE + DEFINE NETWORK_ISCSI_DEFAULT_ENABLE = FALSE DEFINE NETWORK_PXE_BOOT_ENABLE = TRUE !include NetworkPkg/NetworkDefines.dsc.inc From 9d282ec2d915e35b170827d1991a293f330b2914 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 11 Sep 2025 13:38:41 +0200 Subject: [PATCH 0450/1172] OvmfPkg/MemFd: move MEMFD config from OvmfPkgX64 to include file Signed-off-by: Gerd Hoffmann --- OvmfPkg/Include/Fdf/MemFd.fdf.inc | 120 ++++++++++++++++++++++++++++++ OvmfPkg/OvmfPkgX64.fdf | 62 +-------------- 2 files changed, 121 insertions(+), 61 deletions(-) create mode 100644 OvmfPkg/Include/Fdf/MemFd.fdf.inc diff --git a/OvmfPkg/Include/Fdf/MemFd.fdf.inc b/OvmfPkg/Include/Fdf/MemFd.fdf.inc new file mode 100644 index 000000000000..52cbde8c081b --- /dev/null +++ b/OvmfPkg/Include/Fdf/MemFd.fdf.inc @@ -0,0 +1,120 @@ +## @file +# Open Virtual Machine Firmware: FDF include for MEMFD +# +# Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
+# (C) Copyright 2016 Hewlett Packard Enterprise Development LP
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +########################################################################################## +# MEMFD for OVMF, builds with confidential computing support + +[FD.MEMFD] +BaseAddress = $(MEMFD_BASE_ADDRESS) +Size = 0xF80000 +ErasePolarity = 1 +BlockSize = 0x10000 +NumBlocks = 0xF8 + +# +# initial page tables, created by the reset vector +# +0x000000|0x006000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize + +# +# FIXME +# +0x006000|0x001000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfLockBoxStorageBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfLockBoxStorageSize + +# +# FIXME +# +0x007000|0x001000 +gEfiMdePkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress|gUefiOvmfPkgTokenSpaceGuid.PcdGuidedExtractHandlerTableSize + +# +# SEV: page table, for 2M -> 4k split when mapping GHCB page +# +0x008000|0x001000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbPageTableBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbPageTableSize + +# +# SEV: GHCB page +# TDX: TD HOB page +# +0x009000|0x002000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbSize + +# +# Work Area Page, both TDX and SEV store some confidential guest state there. +# +0x00B000|0x001000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize + +# +# SEV: FIXME +# TDX: TD Mailbox at early boot. +# +0x00C000|0x001000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupSize + +# +# SEV-SNP: secrets page +# +0x00D000|0x001000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSnpSecretsBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSnpSecretsSize + +# +# SEV-SNP: cpuid page +# +0x00E000|0x001000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCpuidBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCpuidSize + +# +# SEV-SNP: CAA page (for communication with SVSM) +# +0x00F000|0x001000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecSvsmCaaBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecSvsmCaaSize + +# +# page table, for 2M -> 4k split when mapping APIC +# +0x010000|0x001000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecApicPageTableBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecApicPageTableSize + +# +# initial memory for SEC+PEI +# +0x011000|0x00F000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize + +# +# PEI firmware volume is uncompressed to this area +# +0x020000|0x0D0000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize +FV = PEIFV + +# +# memory debug log buffer for early boot phase +# +0x0F0000|0x10000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogSize + +# +# DXE firmware volume is uncompressed to this area +# +0x100000|0xE80000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize +FV = DXEFV + +########################################################################################## +# Set the SEV-ES specific work area PCDs (used for all forms of SEV since the +# the SEV STATUS MSR is now saved in the work area) +# +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = $(MEMFD_BASE_ADDRESS) + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf index b332d3bb8ea9..c241a6d3dc7f 100644 --- a/OvmfPkg/OvmfPkgX64.fdf +++ b/OvmfPkg/OvmfPkgX64.fdf @@ -60,67 +60,7 @@ FV = SECFV ################################################################################ -[FD.MEMFD] -BaseAddress = $(MEMFD_BASE_ADDRESS) -Size = 0xF80000 -ErasePolarity = 1 -BlockSize = 0x10000 -NumBlocks = 0xF8 - -0x000000|0x006000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize - -0x006000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfLockBoxStorageBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfLockBoxStorageSize - -0x007000|0x001000 -gEfiMdePkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress|gUefiOvmfPkgTokenSpaceGuid.PcdGuidedExtractHandlerTableSize - -0x008000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbPageTableBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbPageTableSize - -0x009000|0x002000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbSize - -0x00B000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - -0x00C000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupSize - -0x00D000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSnpSecretsBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSnpSecretsSize - -0x00E000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCpuidBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCpuidSize - -0x00F000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecSvsmCaaBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecSvsmCaaSize - -0x010000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecApicPageTableBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecApicPageTableSize - -0x011000|0x00F000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize - -0x020000|0x0D0000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize -FV = PEIFV - -0x0F0000|0x10000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogSize - -0x100000|0xE80000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize -FV = DXEFV - -########################################################################################## -# Set the SEV-ES specific work area PCDs (used for all forms of SEV since the -# the SEV STATUS MSR is now saved in the work area) -# -SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = $(MEMFD_BASE_ADDRESS) + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader -SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader -########################################################################################## +!include OvmfPkg/Include/Fdf/MemFd.fdf.inc ################################################################################ From 4b1711d431a7605eb73c4c9c4f88ca8bf59750e9 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 11 Sep 2025 14:00:36 +0200 Subject: [PATCH 0451/1172] OvmfPkg/MemFd: add AmdSev changes, switch AmdSev build to include Signed-off-by: Gerd Hoffmann --- OvmfPkg/AmdSev/AmdSevX64.fdf | 65 +------------------------------ OvmfPkg/Include/Fdf/MemFd.fdf.inc | 16 +++++++- 2 files changed, 15 insertions(+), 66 deletions(-) diff --git a/OvmfPkg/AmdSev/AmdSevX64.fdf b/OvmfPkg/AmdSev/AmdSevX64.fdf index 89b49ea7682f..dbb733310e7e 100644 --- a/OvmfPkg/AmdSev/AmdSevX64.fdf +++ b/OvmfPkg/AmdSev/AmdSevX64.fdf @@ -34,70 +34,7 @@ FV = SECFV ################################################################################ -[FD.MEMFD] -BaseAddress = $(MEMFD_BASE_ADDRESS) -Size = 0xE00000 -ErasePolarity = 1 -BlockSize = 0x10000 -NumBlocks = 0xE0 - -0x000000|0x006000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize - -0x006000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfLockBoxStorageBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfLockBoxStorageSize - -0x007000|0x001000 -gEfiMdePkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress|gUefiOvmfPkgTokenSpaceGuid.PcdGuidedExtractHandlerTableSize - -0x008000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbPageTableBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbPageTableSize - -0x009000|0x002000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbSize - -0x00B000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - -0x00C000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupSize - -0x00D000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSnpSecretsBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSnpSecretsSize - -0x00E000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCpuidBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCpuidSize - -0x00F000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecSvsmCaaBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecSvsmCaaSize - -0x010000|0x000C00 -gUefiOvmfPkgTokenSpaceGuid.PcdSevLaunchSecretBase|gUefiOvmfPkgTokenSpaceGuid.PcdSevLaunchSecretSize - -0x010C00|0x000400 -gUefiOvmfPkgTokenSpaceGuid.PcdQemuHashTableBase|gUefiOvmfPkgTokenSpaceGuid.PcdQemuHashTableSize - -0x011000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecApicPageTableBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecApicPageTableSize - -0x012000|0x00E000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize - -0x020000|0x0E0000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize -FV = PEIFV - -0x100000|0xD00000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize -FV = DXEFV - -########################################################################################## -# Set the SEV-ES specific work area PCDs (used for all forms of SEV since the -# the SEV STATUS MSR is now saved in the work area) -# -SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = $(MEMFD_BASE_ADDRESS) + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader -SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader -########################################################################################## +!include OvmfPkg/Include/Fdf/MemFd.fdf.inc ################################################################################ diff --git a/OvmfPkg/Include/Fdf/MemFd.fdf.inc b/OvmfPkg/Include/Fdf/MemFd.fdf.inc index 52cbde8c081b..1c9a4df6ae1a 100644 --- a/OvmfPkg/Include/Fdf/MemFd.fdf.inc +++ b/OvmfPkg/Include/Fdf/MemFd.fdf.inc @@ -80,16 +80,28 @@ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCpuidBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCp 0x00F000|0x001000 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecSvsmCaaBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecSvsmCaaSize +# +# SEV-SNP: pass secrets from host (qemu) to guest +# +0x010000|0x000C00 +gUefiOvmfPkgTokenSpaceGuid.PcdSevLaunchSecretBase|gUefiOvmfPkgTokenSpaceGuid.PcdSevLaunchSecretSize + +# +# SEV-SNP: pass hashes for kernel/initrd/cmdline from host (qemu) to guest +# +0x010C00|0x000400 +gUefiOvmfPkgTokenSpaceGuid.PcdQemuHashTableBase|gUefiOvmfPkgTokenSpaceGuid.PcdQemuHashTableSize + # # page table, for 2M -> 4k split when mapping APIC # -0x010000|0x001000 +0x011000|0x001000 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecApicPageTableBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecApicPageTableSize # # initial memory for SEC+PEI # -0x011000|0x00F000 +0x012000|0x00E000 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize # From f8953fd9bdcac89e342c011017457948bc5a69bd Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 11 Sep 2025 14:06:28 +0200 Subject: [PATCH 0452/1172] OvmfPkg/MemFd: switch OvmfPkgIa32X64 build to include Signed-off-by: Gerd Hoffmann --- OvmfPkg/OvmfPkgIa32X64.fdf | 41 +------------------------------------- 1 file changed, 1 insertion(+), 40 deletions(-) diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf index 081faa5ee6d5..2ab9bcf45c3e 100644 --- a/OvmfPkg/OvmfPkgIa32X64.fdf +++ b/OvmfPkg/OvmfPkgIa32X64.fdf @@ -60,46 +60,7 @@ FV = SECFV ################################################################################ -[FD.MEMFD] -BaseAddress = $(MEMFD_BASE_ADDRESS) -Size = 0xF80000 -ErasePolarity = 1 -BlockSize = 0x10000 -NumBlocks = 0xF8 - -0x000000|0x006000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize - -0x006000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfLockBoxStorageBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfLockBoxStorageSize - -0x007000|0x001000 -gEfiMdePkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress|gUefiOvmfPkgTokenSpaceGuid.PcdGuidedExtractHandlerTableSize - -0x008000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - -0x010000|0x010000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize - -0x020000|0x0D0000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize -FV = PEIFV - -0x0F0000|0x10000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogSize - -0x100000|0xE80000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize -FV = DXEFV - -########################################################################################## -# Set the SEV-ES specific work area PCDs (used for all forms of SEV since the -# the SEV STATUS MSR is now saved in the work area) -# -SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = $(MEMFD_BASE_ADDRESS) + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader -SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader -########################################################################################## +!include OvmfPkg/Include/Fdf/MemFd.fdf.inc ################################################################################ From ea5a8582e776860f5697b75ce550254ecbc64fa2 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 11 Sep 2025 14:09:58 +0200 Subject: [PATCH 0453/1172] OvmfPkg/MemFd: switch Microvm build to include Signed-off-by: Gerd Hoffmann --- OvmfPkg/Microvm/MicrovmX64.fdf | 49 +--------------------------------- 1 file changed, 1 insertion(+), 48 deletions(-) diff --git a/OvmfPkg/Microvm/MicrovmX64.fdf b/OvmfPkg/Microvm/MicrovmX64.fdf index 9b1792661015..ff259f811240 100644 --- a/OvmfPkg/Microvm/MicrovmX64.fdf +++ b/OvmfPkg/Microvm/MicrovmX64.fdf @@ -34,54 +34,7 @@ FV = SECFV ################################################################################ -[FD.MEMFD] -BaseAddress = $(MEMFD_BASE_ADDRESS) -Size = 0xD00000 -ErasePolarity = 1 -BlockSize = 0x10000 -NumBlocks = 0xD0 - -0x000000|0x006000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize - -0x006000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfLockBoxStorageBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfLockBoxStorageSize - -0x007000|0x001000 -gEfiMdePkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress|gUefiOvmfPkgTokenSpaceGuid.PcdGuidedExtractHandlerTableSize - -0x008000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbPageTableBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbPageTableSize - -0x009000|0x002000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbSize - -0x00B000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - -0x00C000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupSize - -0x00D000|0x001000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecApicPageTableBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecApicPageTableSize - -0x010000|0x010000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize - -0x020000|0x0E0000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize -FV = PEIFV - -0x100000|0xC00000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize -FV = DXEFV - -########################################################################################## -# Set the SEV-ES specific work area PCDs -# -SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = $(MEMFD_BASE_ADDRESS) + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader -SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader -########################################################################################## +!include OvmfPkg/Include/Fdf/MemFd.fdf.inc ################################################################################ From 6d90162e2803a9627460a0b88548028d46910dba Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 8 Sep 2025 16:34:50 +0200 Subject: [PATCH 0454/1172] OvmfPkg/ResetVector: move ReloadFlat32 call Move the call from IntelTdx.asm to Main.asm. This is needed when using the Main32 entry point. Right now is used in TDX mode only, but this can potentially used by other modes (native, SEV) too. So prepare for that. Signed-off-by: Gerd Hoffmann --- OvmfPkg/ResetVector/Ia32/IntelTdx.asm | 5 ----- OvmfPkg/ResetVector/Main.asm | 5 +++++ 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/OvmfPkg/ResetVector/Ia32/IntelTdx.asm b/OvmfPkg/ResetVector/Ia32/IntelTdx.asm index 7d775591a05b..eb0539dbdebe 100644 --- a/OvmfPkg/ResetVector/Ia32/IntelTdx.asm +++ b/OvmfPkg/ResetVector/Ia32/IntelTdx.asm @@ -154,11 +154,6 @@ jumpToFlat32BitAndLandHere: ; Modified: EAX, EBX, ECX, EDX, EBP, EDI, ESP ; InitTdx: - ; - ; First load the GDT and jump to Flat32 mode - ; - OneTimeCall ReloadFlat32 - ; ; Initialization of Tdx work area ; diff --git a/OvmfPkg/ResetVector/Main.asm b/OvmfPkg/ResetVector/Main.asm index 46cfa87c4c0a..462011d1e100 100644 --- a/OvmfPkg/ResetVector/Main.asm +++ b/OvmfPkg/ResetVector/Main.asm @@ -48,6 +48,11 @@ BITS 32 ; Entry point of Main32 ; Main32: + ; + ; First load the GDT and jump to Flat32 mode + ; + OneTimeCall ReloadFlat32 + OneTimeCall InitTdx SearchBfv: From 4a1dca59f6730da5746597b24c608b001c87486f Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 8 Sep 2025 16:32:38 +0200 Subject: [PATCH 0455/1172] OvmfPkg/ResetVector: reorganize #vc exit handler setup. Move setup + teardown of the #vc exception handler to separate functions. Setup as early as possible (right after entering 32-bit mode). Teardown as late as possible (right before entering 64-bit mode). This makes the cpuid instruction work in all 32-bit code, no matter what mode (native/TDX/SEV) the code is running in. Specifically the TDX probe code works properly in SEV mode because the #vc handler emulates the instruction properly. Signed-off-by: Gerd Hoffmann --- OvmfPkg/ResetVector/Ia32/AmdSev.asm | 47 ++++++++++++--------- OvmfPkg/ResetVector/Ia32/Flat32ToFlat64.asm | 5 +++ OvmfPkg/ResetVector/Main.asm | 8 +++- 3 files changed, 39 insertions(+), 21 deletions(-) diff --git a/OvmfPkg/ResetVector/Ia32/AmdSev.asm b/OvmfPkg/ResetVector/Ia32/AmdSev.asm index 22b696419a90..6d22a37bfe62 100644 --- a/OvmfPkg/ResetVector/Ia32/AmdSev.asm +++ b/OvmfPkg/ResetVector/Ia32/AmdSev.asm @@ -226,16 +226,6 @@ ClearSevEsWorkArea: inc eax loop ClearSevEsWorkArea - ; - ; Set up exception handlers to check for SEV-ES - ; Load temporary RAM stack based on PCDs (see SevEsIdtVmmComm for - ; stack usage) - ; Establish exception handlers - ; - mov esp, SEV_ES_VC_TOP_OF_STACK - mov eax, ADDR_OF(Idtr) - lidt [cs:eax] - ; Check if we have a valid (0x8000_001F) CPUID leaf ; CPUID raises a #VC exception if running as an SEV-ES guest mov eax, 0x80000000 @@ -334,15 +324,6 @@ NoSevPass: xor eax, eax SevExit: - ; - ; Clear exception handlers and stack - ; - push eax - mov eax, ADDR_OF(IdtrClear) - lidt [cs:eax] - pop eax - mov esp, 0 - OneTimeCallRet CheckSevFeatures ; Start of #VC exception handling routines @@ -511,6 +492,34 @@ VmmDoneSnpCpuid: add word [esp], CPUID_INSN_LEN iret +%ifdef ARCH_X64 + +SevCpuidInit: + ; + ; Set up exception handlers to check for SEV-ES + ; Load temporary RAM stack based on PCDs (see SevEsIdtVmmComm for + ; stack usage) + ; Establish exception handlers + ; + mov esp, SEV_ES_VC_TOP_OF_STACK + mov eax, ADDR_OF(Idtr) + lidt [cs:eax] + + OneTimeCallRet SevCpuidInit + +SevCpuidExit: + ; + ; Clear exception handlers and stack + ; + mov eax, ADDR_OF(IdtrClear) + lidt [cs:eax] + xor eax, eax + mov esp, eax + + OneTimeCallRet SevCpuidExit + +%endif + ALIGN 2 Idtr: diff --git a/OvmfPkg/ResetVector/Ia32/Flat32ToFlat64.asm b/OvmfPkg/ResetVector/Ia32/Flat32ToFlat64.asm index 429a58c5efd3..aadbdae1e442 100644 --- a/OvmfPkg/ResetVector/Ia32/Flat32ToFlat64.asm +++ b/OvmfPkg/ResetVector/Ia32/Flat32ToFlat64.asm @@ -77,6 +77,11 @@ EnablePaging: bts eax, 31 ; set PG mov cr0, eax ; enable paging + ; + ; uninstall #vc exception handler + ; + OneTimeCall SevCpuidExit + jmp LINEAR_CODE64_SEL:ADDR_OF(jumpTo64BitAndLandHere) BITS 64 jumpTo64BitAndLandHere: diff --git a/OvmfPkg/ResetVector/Main.asm b/OvmfPkg/ResetVector/Main.asm index 462011d1e100..ad3f2def1418 100644 --- a/OvmfPkg/ResetVector/Main.asm +++ b/OvmfPkg/ResetVector/Main.asm @@ -53,9 +53,13 @@ Main32: ; OneTimeCall ReloadFlat32 - OneTimeCall InitTdx - SearchBfv: + ; + ; install #vc exception handler (for cpuid on sev) + ; + OneTimeCall SevCpuidInit + + OneTimeCall InitTdx %endif From 6b19b447c5b3c8bb5adbf84d56fc9b6e8dda238a Mon Sep 17 00:00:00 2001 From: Leif Lindholm Date: Thu, 10 Jul 2025 13:50:44 +0100 Subject: [PATCH 0456/1172] EmbeddedPkg/PrePiLib: refactor FfsProcessSection () Create some helper functions to make FfsProcessSection at least halfway readable by both humans and compilers. Signed-off-by: Leif Lindholm --- EmbeddedPkg/Library/PrePiLib/FwVol.c | 182 ++++++++++++++++++--------- 1 file changed, 122 insertions(+), 60 deletions(-) diff --git a/EmbeddedPkg/Library/PrePiLib/FwVol.c b/EmbeddedPkg/Library/PrePiLib/FwVol.c index cfb1ff46b7d9..aea122d1d015 100644 --- a/EmbeddedPkg/Library/PrePiLib/FwVol.c +++ b/EmbeddedPkg/Library/PrePiLib/FwVol.c @@ -260,6 +260,95 @@ FindFileEx ( return EFI_NOT_FOUND; } +/** + Return the size of a section whether SECTION or SECTION2 + + @param Section - Pointer to start of section header + + @retval Size in bytes. + **/ +STATIC +UINT32 +GetSectionNSize ( + IN EFI_COMMON_SECTION_HEADER *Section + ) +{ + UINT32 SectionSize; + + if (IS_SECTION2 (Section)) { + ASSERT (SECTION2_SIZE (Section) > 0x00FFFFFF); + SectionSize = SECTION2_SIZE (Section); + } else { + SectionSize = SECTION_SIZE (Section); + } + + return SectionSize; +} + +/** + Return the size of a section header whether SECTION or SECTION2 + + @param Section - Pointer to start of section header + + @retval Size in bytes. + **/ +STATIC +UINT32 +GetCommonSectionNHeaderSize ( + IN EFI_COMMON_SECTION_HEADER *Section + ) +{ + if (IS_SECTION2 (Section)) { + return sizeof (EFI_COMMON_SECTION_HEADER2); + } else { + return sizeof (EFI_COMMON_SECTION_HEADER); + } +} + +/** + Return the size of a compression section header whether SECTION or SECTION2 + + @param Section - Pointer to start of section header + + @retval Size in bytes. + **/ +STATIC +UINT32 +GetCompressionSectionNHeaderSize ( + IN EFI_COMMON_SECTION_HEADER *Section + ) +{ + ASSERT (Section->Type == EFI_SECTION_COMPRESSION); + + if (IS_SECTION2 (Section)) { + return sizeof (EFI_COMPRESSION_SECTION2); + } else { + return sizeof (EFI_COMPRESSION_SECTION); + } +} + +/** + Return the compression type of a section whether SECTION or SECTION2 + + @param Section - Pointer to start of section header + + @retval EFI_SECTION_TYPE + **/ +STATIC +EFI_SECTION_TYPE +GetSectionNCompressionType ( + IN EFI_COMMON_SECTION_HEADER *Section + ) +{ + ASSERT (Section->Type == EFI_SECTION_COMPRESSION); + + if (IS_SECTION2 (Section)) { + return ((EFI_COMPRESSION_SECTION2 *)Section)->CompressionType; + } else { + return ((EFI_COMPRESSION_SECTION *)Section)->CompressionType; + } +} + /** Go through the file to search SectionType section, when meeting an encapsuled section. @@ -281,29 +370,18 @@ FfsProcessSection ( OUT VOID **OutputBuffer ) { - EFI_STATUS Status; - UINT32 SectionLength; - UINTN ParsedLength; - EFI_COMPRESSION_SECTION *CompressionSection; - EFI_COMPRESSION_SECTION2 *CompressionSection2; - UINT32 DstBufferSize; - VOID *ScratchBuffer; - UINT32 ScratchBufferSize; - VOID *DstBuffer; - UINT16 SectionAttribute; - UINT32 AuthenticationStatus; - CHAR8 *CompressedData; - UINT32 CompressedDataLength; - BOOLEAN Found; - - Found = FALSE; - *OutputBuffer = NULL; - ParsedLength = 0; - Status = EFI_NOT_FOUND; + EFI_STATUS Status; + UINT32 SectionLength; + UINTN ParsedLength; + UINT32 DstBufferSize; + VOID *DstBuffer; + + ParsedLength = 0; + while (ParsedLength < SectionSize) { - if (IS_SECTION2 (Section)) { - ASSERT (SECTION2_SIZE (Section) > 0x00FFFFFF); - } + UINT32 SectionHeaderSize; + + SectionHeaderSize = GetCommonSectionNHeaderSize (Section); if (Section->Type == SectionType) { if (SectionCheckHook != NULL) { @@ -313,38 +391,29 @@ FfsProcessSection ( } if (Found) { - if (IS_SECTION2 (Section)) { - *OutputBuffer = (VOID *)((UINT8 *)Section + sizeof (EFI_COMMON_SECTION_HEADER2)); - } else { - *OutputBuffer = (VOID *)((UINT8 *)Section + sizeof (EFI_COMMON_SECTION_HEADER)); - } + *OutputBuffer = (VOID *)((UINT8 *)Section + SectionHeaderSize); return EFI_SUCCESS; } else { goto CheckNextSection; } } else if ((Section->Type == EFI_SECTION_COMPRESSION) || (Section->Type == EFI_SECTION_GUID_DEFINED)) { - if (Section->Type == EFI_SECTION_COMPRESSION) { - if (IS_SECTION2 (Section)) { - CompressionSection2 = (EFI_COMPRESSION_SECTION2 *)Section; - SectionLength = SECTION2_SIZE (Section); + CHAR8 *CompressedData; + UINT32 CompressionSectionHeaderSize; + VOID *ScratchBuffer; + UINT32 ScratchBufferSize; - if (CompressionSection2->CompressionType != EFI_STANDARD_COMPRESSION) { - return EFI_UNSUPPORTED; - } + if (Section->Type == EFI_SECTION_COMPRESSION) { + UINT32 CompressedDataLength; - CompressedData = (CHAR8 *)((EFI_COMPRESSION_SECTION2 *)Section + 1); - CompressedDataLength = SectionLength - sizeof (EFI_COMPRESSION_SECTION2); - } else { - CompressionSection = (EFI_COMPRESSION_SECTION *)Section; - SectionLength = SECTION_SIZE (Section); + CompressionSectionHeaderSize = GetCompressionSectionNHeaderSize (Section); + SectionLength = GetSectionNSize (Section); - if (CompressionSection->CompressionType != EFI_STANDARD_COMPRESSION) { - return EFI_UNSUPPORTED; - } + CompressedData = (CHAR8 *)((UINTN)(Section) + CompressionSectionHeaderSize); + CompressedDataLength = SectionLength - CompressionSectionHeaderSize; - CompressedData = (CHAR8 *)((EFI_COMPRESSION_SECTION *)Section + 1); - CompressedDataLength = SectionLength - sizeof (EFI_COMPRESSION_SECTION); + if (GetSectionNCompressionType (Section) != EFI_STANDARD_COMPRESSION) { + return EFI_UNSUPPORTED; } Status = UefiDecompressGetInfo ( @@ -353,7 +422,10 @@ FfsProcessSection ( &DstBufferSize, &ScratchBufferSize ); - } else if (Section->Type == EFI_SECTION_GUID_DEFINED) { + } else { + // Section->Type == EFI_SECTION_GUID_DEFINED) + UINT16 SectionAttribute; + Status = ExtractGuidedSectionGetInfo ( Section, &DstBufferSize, @@ -390,21 +462,13 @@ FfsProcessSection ( // DstBuffer still is one section. Adjust DstBuffer offset, skip EFI section header // to make section data at page alignment. // - if (IS_SECTION2 (Section)) { - DstBuffer = (UINT8 *)DstBuffer + EFI_PAGE_SIZE - sizeof (EFI_COMMON_SECTION_HEADER2); - } else { - DstBuffer = (UINT8 *)DstBuffer + EFI_PAGE_SIZE - sizeof (EFI_COMMON_SECTION_HEADER); - } + DstBuffer = (UINT8 *)DstBuffer + EFI_PAGE_SIZE - SectionHeaderSize; // // Call decompress function // if (Section->Type == EFI_SECTION_COMPRESSION) { - if (IS_SECTION2 (Section)) { - CompressedData = (CHAR8 *)((EFI_COMPRESSION_SECTION2 *)Section + 1); - } else { - CompressedData = (CHAR8 *)((EFI_COMPRESSION_SECTION *)Section + 1); - } + CompressedData = (CHAR8 *)((UINTN)(Section) + CompressionSectionHeaderSize); Status = UefiDecompress ( CompressedData, @@ -412,6 +476,8 @@ FfsProcessSection ( ScratchBuffer ); } else if (Section->Type == EFI_SECTION_GUID_DEFINED) { + UINT32 AuthenticationStatus; + Status = ExtractGuidedSectionDecode ( Section, &DstBuffer, @@ -438,11 +504,7 @@ FfsProcessSection ( } CheckNextSection: - if (IS_SECTION2 (Section)) { - SectionLength = SECTION2_SIZE (Section); - } else { - SectionLength = SECTION_SIZE (Section); - } + SectionLength = GetSectionNSize (Section); // // SectionLength is adjusted it is 4 byte aligned. From 24fd71dcaa7869b5aecfd3f429e9549d55af9dcb Mon Sep 17 00:00:00 2001 From: Leif Lindholm Date: Thu, 10 Jul 2025 14:18:51 +0100 Subject: [PATCH 0457/1172] EmbeddedPkg/PrePiLib: eliminate unneeded variable in FfsProcessSection () The "Found" variable provided only a deferred form of success handling, so eliminate it to improve readability. Signed-off-by: Leif Lindholm --- EmbeddedPkg/Library/PrePiLib/FwVol.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/EmbeddedPkg/Library/PrePiLib/FwVol.c b/EmbeddedPkg/Library/PrePiLib/FwVol.c index aea122d1d015..f15796b16670 100644 --- a/EmbeddedPkg/Library/PrePiLib/FwVol.c +++ b/EmbeddedPkg/Library/PrePiLib/FwVol.c @@ -385,18 +385,14 @@ FfsProcessSection ( if (Section->Type == SectionType) { if (SectionCheckHook != NULL) { - Found = SectionCheckHook (Section) == EFI_SUCCESS; - } else { - Found = TRUE; + if (SectionCheckHook (Section) != EFI_SUCCESS) { + goto CheckNextSection; + } } - if (Found) { - *OutputBuffer = (VOID *)((UINT8 *)Section + SectionHeaderSize); + *OutputBuffer = (VOID *)((UINT8 *)Section + SectionHeaderSize); - return EFI_SUCCESS; - } else { - goto CheckNextSection; - } + return EFI_SUCCESS; } else if ((Section->Type == EFI_SECTION_COMPRESSION) || (Section->Type == EFI_SECTION_GUID_DEFINED)) { CHAR8 *CompressedData; UINT32 CompressionSectionHeaderSize; From 615e5ca40a0d47d5381bda57821ca8aa1e821b0a Mon Sep 17 00:00:00 2001 From: Leif Lindholm Date: Thu, 10 Jul 2025 12:39:14 +0100 Subject: [PATCH 0458/1172] EmbeddedPkg/PrePiLib: minor cleanup in FfsProcessSection () Drop an else wrapper in FfsProcessSection () on the other side of an if-statemenmt that is an error return. Signed-off-by: Leif Lindholm --- EmbeddedPkg/Library/PrePiLib/FwVol.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/EmbeddedPkg/Library/PrePiLib/FwVol.c b/EmbeddedPkg/Library/PrePiLib/FwVol.c index f15796b16670..38ca4f150656 100644 --- a/EmbeddedPkg/Library/PrePiLib/FwVol.c +++ b/EmbeddedPkg/Library/PrePiLib/FwVol.c @@ -488,15 +488,15 @@ FfsProcessSection ( // DEBUG ((DEBUG_ERROR, "Decompress Failed - %r\n", Status)); return EFI_NOT_FOUND; - } else { - return FfsProcessSection ( - SectionType, - SectionCheckHook, - DstBuffer, - DstBufferSize, - OutputBuffer - ); } + + return FfsProcessSection ( + SectionType, + SectionCheckHook, + DstBuffer, + DstBufferSize, + OutputBuffer + ); } CheckNextSection: From 2558af552d7330e69e7704d7371d640bdbd94423 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Thu, 11 Sep 2025 14:59:31 -0400 Subject: [PATCH 0459/1172] MdeModulePkg/ArmFfaLib: Add HobLib to StMm instances ArmFfaCommon.c is built by both ArmFfaStandaloneMmCoreLib and ArmFfaStandaloneMmLib. It links against HobLiib APIs such as `GetFirstHob()`. Right now, the symbols fail to link: ``` lld-link: error: undefined symbol: GetFirstHob ArmFfaStandaloneMmCoreLib.lib(ArmFfaCommon.obj) ``` Signed-off-by: Michael Kubacki --- MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf | 1 + MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.inf | 1 + 2 files changed, 2 insertions(+) diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf index 67b7b5c24a69..9a4e2db3df4c 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf @@ -33,6 +33,7 @@ BaseLib BaseMemoryLib DebugLib + HobLib MmServicesTableLib [Pcd] diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.inf b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.inf index 532dc195c66b..dc2f444595af 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.inf +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.inf @@ -33,6 +33,7 @@ BaseLib BaseMemoryLib DebugLib + HobLib MmServicesTableLib [Pcd] From 282a324bf43b5c7825e4b1ef946d29178cbd07dc Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Thu, 11 Sep 2025 16:00:01 -0400 Subject: [PATCH 0460/1172] MdeModulePkg/ArmFfaLib: Add MemoryAllocationLib ArmFfaRxTxMap.c is built by both ArmFfaPeiLib and ArmFfaDxeLib. ArmFfaSecRxTxMap.c is built by ArmFfaSecLib. ArmFfaStandaloneMmRxTxMap.c is built by ArmFfaStandaloneMm*Lib. The files depend on `MemoryAllocationLib` APIs such as `AllocateAlignedPages()`. This change adds `MemoryAllocationLib` to those library INF files. Signed-off-by: Michael Kubacki --- MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.inf | 1 + MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.inf | 1 + MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.inf | 1 + MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf | 1 + MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.inf | 1 + 5 files changed, 5 insertions(+) diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.inf b/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.inf index 361ebf6d771b..637f60313d19 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.inf +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.inf @@ -33,6 +33,7 @@ BaseMemoryLib DebugLib HobLib + MemoryAllocationLib [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdFfaLibConduitSmc diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.inf b/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.inf index 53d57506a48f..fcd060df54d4 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.inf +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.inf @@ -33,6 +33,7 @@ BaseMemoryLib DebugLib HobLib + MemoryAllocationLib [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdFfaLibConduitSmc diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.inf b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.inf index 611de85eb44e..f230fd43fe3d 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.inf +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.inf @@ -33,6 +33,7 @@ BaseMemoryLib DebugLib HobLib + MemoryAllocationLib [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdFfaLibConduitSmc diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf index 9a4e2db3df4c..afab6be1d540 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf @@ -34,6 +34,7 @@ BaseMemoryLib DebugLib HobLib + MemoryAllocationLib MmServicesTableLib [Pcd] diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.inf b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.inf index dc2f444595af..914b410ac628 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.inf +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.inf @@ -34,6 +34,7 @@ BaseMemoryLib DebugLib HobLib + MemoryAllocationLib MmServicesTableLib [Pcd] From 1780373897f12c25075f8883e073144506441168 Mon Sep 17 00:00:00 2001 From: Phil Noh Date: Tue, 26 Aug 2025 16:52:43 -0500 Subject: [PATCH 0461/1172] MdeModulePkg/DxeMain: Add debug code for Event Group notify functions There are a lot of notify callback events for Event Groups. Usually they are not reported unless there is a debug code in the callback itself. The debug message helps to check which/when the callback is registered and executed in POST. Also helps to notice the callback sequence. It depends on DEBUG_EVENT flag enabled by PcdFixedDebugPrintErrorLevel PCD token. Signed-off-by: Phil Noh --- MdeModulePkg/Core/Dxe/Event/Event.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/MdeModulePkg/Core/Dxe/Event/Event.c b/MdeModulePkg/Core/Dxe/Event/Event.c index dc82abb02130..dae8e98980cf 100644 --- a/MdeModulePkg/Core/Dxe/Event/Event.c +++ b/MdeModulePkg/Core/Dxe/Event/Event.c @@ -3,6 +3,7 @@ Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.
(C) Copyright 2015 Hewlett Packard Enterprise Development LP
+Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -183,6 +184,13 @@ CoreDispatchEventNotifies ( // Notify this event // ASSERT (Event->NotifyFunction != NULL); + + if ((Event->Type & EVT_NOTIFY_SIGNAL) != 0) { + if (!IsZeroGuid (&Event->EventGroup) && !CompareGuid (&Event->EventGroup, &gIdleLoopEventGuid)) { + DEBUG ((DEBUG_EVENT, "Run Event Group Notify: %g (%p)\n", &Event->EventGroup, Event->NotifyFunction)); + } + } + Event->NotifyFunction (Event, Event->NotifyContext); // @@ -485,7 +493,11 @@ CoreCreateEventInternal ( CoreAcquireEventLock (); - if ((Type & EVT_NOTIFY_SIGNAL) != 0x00000000) { + if ((Type & EVT_NOTIFY_SIGNAL) != 0) { + if (!IsZeroGuid (&IEvent->EventGroup) && !CompareGuid (&IEvent->EventGroup, &gIdleLoopEventGuid)) { + DEBUG ((DEBUG_EVENT, "Register Event Group Notify: %g (%p)\n", &IEvent->EventGroup, IEvent->NotifyFunction)); + } + // // The Event's NotifyFunction must be queued whenever the event is signaled // From 3a53c5796786dc09f26c2ebb2fcc3be65505c148 Mon Sep 17 00:00:00 2001 From: Hongbin1 Zhang Date: Mon, 15 Sep 2025 13:15:37 +0800 Subject: [PATCH 0462/1172] StandaloneMmPkg: Optimize MM core image size alignment It is incorrect for MM core image size alignment, it just add alignment parameter for alignment. It will increase size if the image size is already aligned. After optimize, it will ignore this case. Signed-off-by: Hongbin1 Zhang Cc: Ray Ni Cc: Star Zeng Cc: Dun Tan Cc: Sami Mujawar Cc: Ard Biesheuvel --- .../Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c index 1dc9fd31fd96..778481ab1c71 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c @@ -744,7 +744,10 @@ ExecuteMmCoreFromMmram ( goto Done; } - PageCount = (UINTN)EFI_SIZE_TO_PAGES ((UINTN)ImageContext.ImageSize + ImageContext.SectionAlignment); + // + // Align image size on section boundary and get correct page count + // + PageCount = (UINTN)EFI_SIZE_TO_PAGES ((UINTN)ALIGN_VALUE (ImageContext.ImageSize, ImageContext.SectionAlignment)); // // Allocate memory for the image being loaded from unallocated mmram range From c502e2c58e25f385deeee32bd6bf7edb48661706 Mon Sep 17 00:00:00 2001 From: HemaAnmisha Date: Thu, 11 Sep 2025 22:15:23 -0700 Subject: [PATCH 0463/1172] MdeModulePkg/UnicodeCollation: Fix uninitialized variable usage Build failed with the below error: error: variable 'Status' is used uninitialized when PcdUnicodeCollation2Support is FALSE. Fixing this issue by initializing Status unconditionally. This is a regression issue caused by below Edk2 commit a46697f73532dbaa84babacc887cd5ccd8c4fdc2 Signed-off-by: HemaAnmisha --- .../Disk/UnicodeCollation/EnglishDxe/UnicodeCollationEng.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/UnicodeCollationEng.c b/MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/UnicodeCollationEng.c index 381590261af1..2440f6a8d264 100644 --- a/MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/UnicodeCollationEng.c +++ b/MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/UnicodeCollationEng.c @@ -96,6 +96,8 @@ InitializeUnicodeCollationEng ( UINTN Index; UINTN Index2; + Status = EFI_SUCCESS; + // // Initialize mapping tables for the supported languages // From 1fc19a0d52abd550b0d0208c688a9eaf68aa78d5 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Thu, 11 Sep 2025 12:39:56 -0700 Subject: [PATCH 0464/1172] ArmPkg: ArmPsciMpServicesDxe: Fix core disable/enable if the timer expires When an AP is waken up to perform some operation with a time out period specified, the expired timer will put the core into `CpuStateFinished` state. This will make the subsequent enable/disable AP core fail to proceed, which is unexpected and inconsistent with the rest of the handling in this module (`CpuStateIdle` and `CpuStateFinished` are generally treated the same). This change extends the accepted state of CPU to `CpuStateFinished` for AP enable/disable interface to fix calls on timer expired APs. Signed-off-by: Kun Qin --- ArmPkg/Drivers/ArmPsciMpServicesDxe/ArmPsciMpServicesDxe.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ArmPkg/Drivers/ArmPsciMpServicesDxe/ArmPsciMpServicesDxe.c b/ArmPkg/Drivers/ArmPsciMpServicesDxe/ArmPsciMpServicesDxe.c index 6d075df5c1f0..20ff5d81cd51 100644 --- a/ArmPkg/Drivers/ArmPsciMpServicesDxe/ArmPsciMpServicesDxe.c +++ b/ArmPkg/Drivers/ArmPsciMpServicesDxe/ArmPsciMpServicesDxe.c @@ -887,7 +887,9 @@ EnableDisableAP ( return EFI_INVALID_PARAMETER; } - if (GetApState (CpuData) != CpuStateIdle) { + if ((GetApState (CpuData) != CpuStateIdle) && + (GetApState (CpuData) != CpuStateFinished)) + { return EFI_UNSUPPORTED; } From dfbb7de3c667e6d9c8be54ad538998790029f6c2 Mon Sep 17 00:00:00 2001 From: Shriram Masanamuthu Chinnathurai <25264315+Shrirammc55@users.noreply.github.com> Date: Thu, 11 Sep 2025 11:06:29 -0700 Subject: [PATCH 0465/1172] ArmPkg: ArmPsciMpServicesDxe: Fix MPIDR usage from CoreInfo The `GET_MPIDR_AFFINITY_BITS` macro masks MT_BIT in ArmReadMpidr (), but `CoreInfo[Index].Mpidr` wasn't masked by the same macro which causes a mismatch even if it is the same MPIDR value. This change uses the same `GET_MPIDR_AFFINITY_BITS` macro for `CoreInfo[Index].Mpidr` to fix the core index searching logic. Signed-off-by: Kun Qin --- ArmPkg/Drivers/ArmPsciMpServicesDxe/ArmPsciMpServicesDxe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ArmPkg/Drivers/ArmPsciMpServicesDxe/ArmPsciMpServicesDxe.c b/ArmPkg/Drivers/ArmPsciMpServicesDxe/ArmPsciMpServicesDxe.c index 20ff5d81cd51..c2a1ea274ce9 100644 --- a/ArmPkg/Drivers/ArmPsciMpServicesDxe/ArmPsciMpServicesDxe.c +++ b/ArmPkg/Drivers/ArmPsciMpServicesDxe/ArmPsciMpServicesDxe.c @@ -1333,7 +1333,7 @@ MpServicesInitialize ( ASSERT (gApStacksBase != NULL); for (Index = 0; Index < mCpuMpData.NumberOfProcessors; Index++) { - if (GET_MPIDR_AFFINITY_BITS (ArmReadMpidr ()) == CoreInfo[Index].Mpidr) { + if (GET_MPIDR_AFFINITY_BITS (ArmReadMpidr ()) == GET_MPIDR_AFFINITY_BITS (CoreInfo[Index].Mpidr)) { IsBsp = TRUE; } else { IsBsp = FALSE; From d347a7e8bc729e51814f9151f43265f76e7268dc Mon Sep 17 00:00:00 2001 From: Vishal Oliyil Kunnil Date: Fri, 12 Sep 2025 15:37:03 -0700 Subject: [PATCH 0466/1172] BaseTools/VfrCompile: Fix compiler warning C++17 does not allow register MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The register keyword was deprecated in C++11 and removed in C++17, which causes multiple compiler warnings when building VfrCompile: "ISO C++17 does not allow ‘register’ storage class specifier". Resolve the warnings by removing instances of register keyword. Signed-off-by: Vishal Oliyil Kunnil --- .../Source/C/VfrCompile/Pccts/h/AParser.cpp | 20 +++++++++---------- .../Source/C/VfrCompile/Pccts/h/DLexer.h | 4 ++-- .../C/VfrCompile/Pccts/h/DLexerBase.cpp | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/BaseTools/Source/C/VfrCompile/Pccts/h/AParser.cpp b/BaseTools/Source/C/VfrCompile/Pccts/h/AParser.cpp index 720fe75af1d7..10b06d230637 100644 --- a/BaseTools/Source/C/VfrCompile/Pccts/h/AParser.cpp +++ b/BaseTools/Source/C/VfrCompile/Pccts/h/AParser.cpp @@ -472,15 +472,15 @@ set_deg(SetWordType *a) of elements present in the set. Assumes that all word bits are used in the set */ - register SetWordType *p = a; - register SetWordType *endp = &(a[bsetsize]); - register int degree = 0; + SetWordType *p = a; + SetWordType *endp = &(a[bsetsize]); + int degree = 0; if ( a == NULL ) return 0; while ( p < endp ) { - register SetWordType t = *p; - register SetWordType *b = &(bitmask[0]); + SetWordType t = *p; + SetWordType *b = &(bitmask[0]); do { if (t & *b) ++degree; } while (++b < &(bitmask[sizeof(SetWordType)*8])); @@ -493,14 +493,14 @@ set_deg(SetWordType *a) void ANTLRParser:: edecode(SetWordType *a) { - register SetWordType *p = a; - register SetWordType *endp = &(p[bsetsize]); - register unsigned e = 0; + SetWordType *p = a; + SetWordType *endp = &(p[bsetsize]); + unsigned e = 0; if ( set_deg(a)>1 ) /* MR23 */ printMessage(stderr, " {"); do { - register SetWordType t = *p; - register SetWordType *b = &(bitmask[0]); + SetWordType t = *p; + SetWordType *b = &(bitmask[0]); do { if ( t & *b ) /* MR23 */ printMessage(stderr, " %s", token_tbl[e]); e++; diff --git a/BaseTools/Source/C/VfrCompile/Pccts/h/DLexer.h b/BaseTools/Source/C/VfrCompile/Pccts/h/DLexer.h index f15bff118762..75ce14268573 100644 --- a/BaseTools/Source/C/VfrCompile/Pccts/h/DLexer.h +++ b/BaseTools/Source/C/VfrCompile/Pccts/h/DLexer.h @@ -65,9 +65,9 @@ mode( int m ) ANTLRTokenType DLGLexer:: nextTokenType(void) { - register int state, newstate; + int state, newstate; /* last space reserved for the null char */ - register DLGChar *lastpos; + DLGChar *lastpos; ANTLRTokenType tk; skip: diff --git a/BaseTools/Source/C/VfrCompile/Pccts/h/DLexerBase.cpp b/BaseTools/Source/C/VfrCompile/Pccts/h/DLexerBase.cpp index b218afc03811..d7a37236a14d 100644 --- a/BaseTools/Source/C/VfrCompile/Pccts/h/DLexerBase.cpp +++ b/BaseTools/Source/C/VfrCompile/Pccts/h/DLexerBase.cpp @@ -193,7 +193,7 @@ replchar(DLGChar c) void DLGLexerBase:: replstr(const DLGChar *s) /* MR20 const */ { - register DLGChar *l= &_lextext[_bufsize -1]; + DLGChar *l= &_lextext[_bufsize -1]; nextpos = _begexpr; if (s){ From 6690201491b5d07fc9ea69e1925417d69ac741c5 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Tue, 16 Sep 2025 20:16:41 -0400 Subject: [PATCH 0467/1172] .pytool: Update Uncrustify to 73.0.11 Uncrustify release https://github.com/tianocore/uncrustify/releases/tag/73.0.11 The only functional change in this release from 73.0.10 is to reduce file parsing messages during execution: ``` uncrustify prints each file it is parsing at system error level, which is by default printed. For MdeModulePkg along, this creates 1,000 lines of logs, just saying which file is being parsed. This is noise in the log, so this commit downgrades the print to user information, which is not printed by default. ``` Signed-off-by: Michael Kubacki --- .pytool/Plugin/UncrustifyCheck/uncrustify_ext_dep.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pytool/Plugin/UncrustifyCheck/uncrustify_ext_dep.yaml b/.pytool/Plugin/UncrustifyCheck/uncrustify_ext_dep.yaml index 78b9a40365f7..689ae94323bf 100644 --- a/.pytool/Plugin/UncrustifyCheck/uncrustify_ext_dep.yaml +++ b/.pytool/Plugin/UncrustifyCheck/uncrustify_ext_dep.yaml @@ -9,9 +9,9 @@ "scope": "cibuild", "type": "web", "name": "tianocore-uncrustify-release", - "source": "https://github.com/tianocore/uncrustify/releases/download/73.0.10/uncrustify-release.zip", - "version": "73.0.10", - "sha256": "65d6f0f2e2bba9f25edaa1a9a5e5b9af32ba8d5c2792e467b84abfdf39b5e8ee", + "source": "https://github.com/tianocore/uncrustify/releases/download/73.0.11/uncrustify-release.zip", + "version": "73.0.11", + "sha256": "b16ee03de6551a7aa547626bd895f1f91d04467b6167334f41a2acbef4617c9b", "compression_type": "zip", "internal_path": "/", "flags": ["set_shell_var", "host_specific"], From 11ecff34f3bc6ffbda0fc314ca6f8f224ed1e24f Mon Sep 17 00:00:00 2001 From: Dimitri Daskalakis Date: Sun, 14 Sep 2025 13:26:54 -0700 Subject: [PATCH 0468/1172] ArmVirtPkg/ArmVirtQemu,ArmVirtQemuKernel: Allow users to enable SNP Modern ARM server platforms support SNP for PXE boot. I tested PXE boot with ArmVirtQemu and needed to enable SNP. Signed-off-by: Dimitri Daskalakis --- ArmVirtPkg/ArmVirtQemu.dsc | 4 ---- ArmVirtPkg/ArmVirtQemuKernel.dsc | 4 ---- 2 files changed, 8 deletions(-) diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc index 5e6ad0654b04..9d85ef653bf5 100644 --- a/ArmVirtPkg/ArmVirtQemu.dsc +++ b/ArmVirtPkg/ArmVirtQemu.dsc @@ -48,10 +48,6 @@ # This comes at the beginning of includes to pick all relevant defines early on. !include ArmVirtPkg/ArmVirtStackCookies.dsc.inc -!if $(NETWORK_SNP_ENABLE) == TRUE - !error "NETWORK_SNP_ENABLE is IA32/X64/EBC only" -!endif - !include NetworkPkg/NetworkDefines.dsc.inc !include MdePkg/MdeLibs.dsc.inc diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc index ff424be552f6..ebdb7dc83498 100644 --- a/ArmVirtPkg/ArmVirtQemuKernel.dsc +++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc @@ -45,10 +45,6 @@ # This comes at the beginning of includes to pick all relevant defines early on. !include ArmVirtPkg/ArmVirtStackCookies.dsc.inc -!if $(NETWORK_SNP_ENABLE) == TRUE - !error "NETWORK_SNP_ENABLE is IA32/X64/EBC only" -!endif - !include NetworkPkg/NetworkDefines.dsc.inc !include MdePkg/MdeLibs.dsc.inc From 3a5563593a5cb2998f796511ffa5b5f5b2f9fe73 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Thu, 7 Aug 2025 11:12:25 -0700 Subject: [PATCH 0469/1172] MdePkg: TpmPtp: Add CRB Interface Version 2 Definition Introduces support for CRB Interface Version 2 as defined in the TCG PC Client Platform TPM Profile (PTP) Specification v1.06. This enables firmware to identify TPMs that support the CRB buffer interface. Signed-off-by: Kun Qin --- MdePkg/Include/IndustryStandard/TpmPtp.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/MdePkg/Include/IndustryStandard/TpmPtp.h b/MdePkg/Include/IndustryStandard/TpmPtp.h index 182ad1b780f8..7269e721b3ff 100644 --- a/MdePkg/Include/IndustryStandard/TpmPtp.h +++ b/MdePkg/Include/IndustryStandard/TpmPtp.h @@ -358,8 +358,9 @@ typedef union { /// /// InterfaceVersion /// -#define PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_FIFO 0x0 -#define PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_CRB 0x1 +#define PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_FIFO 0x0 +#define PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_CRB 0x1 +#define PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_CRB_V2 0x2 /// /// InterfaceSelector From b24663ee587c9f9ecb264547a6432faaddbb4e67 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Thu, 7 Aug 2025 11:12:46 -0700 Subject: [PATCH 0470/1172] SecurityPkg: Tpm2DeviceLibDTpm: Recognize CRB Interface Version 2 This change adds the recognition of TPM devices that supports CRB interface v2. Signed-off-by: Kun Qin --- SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c index d3054690e2eb..c11fe88ad560 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c @@ -419,7 +419,8 @@ Tpm2GetPtpInterface ( InterfaceCapability.Uint32 = MmioRead32 ((UINTN)&((PTP_FIFO_REGISTERS *)Register)->InterfaceCapability); if ((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_CRB) && - (InterfaceId.Bits.InterfaceVersion == PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_CRB) && + ((InterfaceId.Bits.InterfaceVersion == PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_CRB) || + (InterfaceId.Bits.InterfaceVersion == PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_CRB_V2)) && (InterfaceId.Bits.CapCRB != 0)) { return Tpm2PtpInterfaceCrb; From b4e6443f89183b811765e772082f360fc945ef4a Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Thu, 7 Aug 2025 11:16:46 -0700 Subject: [PATCH 0471/1172] SecurityPkg: Tpm2DeviceLibFfa: Recognize CRB Interface Version 2 This change adds the recognition of TPM devices that supports CRB interface v2. Signed-off-by: Kun Qin --- SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2Ptp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2Ptp.c b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2Ptp.c index f4574bc3eff2..2af0d6bad9ea 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2Ptp.c +++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2Ptp.c @@ -75,7 +75,8 @@ Tpm2GetPtpInterface ( InterfaceCapability.Uint32 = MmioRead32 ((UINTN)&((PTP_FIFO_REGISTERS *)Register)->InterfaceCapability); if ((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_CRB) && - (InterfaceId.Bits.InterfaceVersion == PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_CRB) && + ((InterfaceId.Bits.InterfaceVersion == PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_CRB) || + (InterfaceId.Bits.InterfaceVersion == PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_CRB_V2)) && (InterfaceId.Bits.CapCRB != 0)) { return Tpm2PtpInterfaceCrb; From 2a8d98d0a5e8d662726b79e632658919cc8321f7 Mon Sep 17 00:00:00 2001 From: Stanislaw Grams Date: Tue, 16 Sep 2025 13:27:50 +0200 Subject: [PATCH 0472/1172] OvmfPkg/IntelTdx: Update TDVF README.md TDVF cannot be mapped as a pflash device. The script referenced in README.md must use the -bios option instead. TDX support in QEMU and KVM has been upstreamed, so the URLs should be updated to point to upstream repositories. Signed-off-by: Stanislaw Grams --- OvmfPkg/IntelTdx/README.md | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/OvmfPkg/IntelTdx/README.md b/OvmfPkg/IntelTdx/README.md index 6e13c1748ee3..83739efed0cc 100644 --- a/OvmfPkg/IntelTdx/README.md +++ b/OvmfPkg/IntelTdx/README.md @@ -79,17 +79,26 @@ Usage ----- Assuming TDX-QEMU/TDX-KVM are already built, one can start a TD virtual -machine as [launching-td-guest](https://github.com/intel/qemu-tdx/blob/tdx-qemu-upstream-rfc-v3/docs/system/i386/tdx.rst#launching-a-td-tdx-vm): +machine as [launching-a-tdx-vm](https://gitlab.com/qemu/qemu/-/blob/master/docs/system/i386/tdx.rst): -`qemu_system_x86 \` -` -machine ...,confidential-guest-support=tdx0 \` -` -object tdx-guest,id=tdx0,[sept-ve-disable=off] \` -` -drive if=pflash,format=raw,unit=0,file=/path/to/OVMF_CODE.fd \` -` -drive if=pflash,format=raw,unit=1,file=/path/to/OVMF_VARS.fd \` +``` +qemu_system_x86 \ + -accel kvm \ + -cpu host \ + -object tdx-guest,id=tdx0 \ + -machine ...,confidential-guest-support=tdx0 \ + -bios /path/to/OVMF.fd +``` Note: -TDX-QEMU/TDX-KVM are still in upstreaming progress. Please refer to: - - kvm : https://github.com/intel/tdx/tree/kvm-upstream - - qemu : https://github.com/intel/qemu-tdx/blob/tdx-qemu-upstream-rfc-v3 +Avoid using the '-pflash' QEMU parameter with TDX configurations, as TDX lacks support for read-only memory slots. + +Linux Software Stack +-------------------- +KVM with TDX support: + - Linux kernel version >= 6.16 + - Source code: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git -Once above 2 upstreaming are completed a minimum qemu/kvm version will be updated here. +QEMU with TDX support: + - QEMU version >= 10.1 + - Source code: https://gitlab.com/qemu-project/qemu.git From 0d26d944d9b47436bbe4742f4700eb9b8a5a89d2 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 20 Aug 2025 17:15:54 -0700 Subject: [PATCH 0473/1172] MdeModulePkg/Universal/DriverSampleDxe: Fix VFR warnings Remove default from checkbox statement that is not part of the checkbox statement syntax to remove VFR compiler warning. Signed-off-by: Michael D Kinney --- MdeModulePkg/Universal/DriverSampleDxe/Vfr.vfr | 1 - 1 file changed, 1 deletion(-) diff --git a/MdeModulePkg/Universal/DriverSampleDxe/Vfr.vfr b/MdeModulePkg/Universal/DriverSampleDxe/Vfr.vfr index 0c376fe9b758..84ece6646e48 100644 --- a/MdeModulePkg/Universal/DriverSampleDxe/Vfr.vfr +++ b/MdeModulePkg/Universal/DriverSampleDxe/Vfr.vfr @@ -186,7 +186,6 @@ formset // CHECKBOX_DEFAULT_MFG indicate EFI_IFR_CHECKBOX_DEFAULT_MFG. // flags = CHECKBOX_DEFAULT | CHECKBOX_DEFAULT_MFG, - default = TRUE, endcheckbox; endif; endif; From b05c8d7b808d06915467649cf4e31668b5e7cd7a Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 21 Aug 2025 09:09:19 -0700 Subject: [PATCH 0474/1172] NetworkPkg/Dhcp6Dxe/GoogleTest: Fix init of complex struct CLANGDWARF generates build error for missing braces when initializing a complex structure. Change initialization of EFI_DHCP6_IA local variable to a call to ZeroMem() instead. Signed-off-by: Michael D Kinney --- NetworkPkg/Dhcp6Dxe/GoogleTest/Dhcp6IoGoogleTest.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/NetworkPkg/Dhcp6Dxe/GoogleTest/Dhcp6IoGoogleTest.cpp b/NetworkPkg/Dhcp6Dxe/GoogleTest/Dhcp6IoGoogleTest.cpp index dc0366920953..7f14bebc440a 100644 --- a/NetworkPkg/Dhcp6Dxe/GoogleTest/Dhcp6IoGoogleTest.cpp +++ b/NetworkPkg/Dhcp6Dxe/GoogleTest/Dhcp6IoGoogleTest.cpp @@ -746,8 +746,9 @@ TEST_F (Dhcp6SeekStsOptionTest, SeekIATAOptionExpectFail) { UINT32 SearchPattern = SEARCH_PATTERN; UINT16 SearchPatternLength = SEARCH_PATTERN_LEN; UINT16 *Len = NULL; - EFI_DHCP6_IA Ia = { 0 }; + EFI_DHCP6_IA Ia; + ZeroMem (&Ia, sizeof (Ia)); Ia.Descriptor.Type = DHCPV6_OPTION_IA_TA; Ia.IaAddressCount = 1; Ia.IaAddress[0].PreferredLifetime = 0xDEADBEEF; @@ -800,8 +801,9 @@ TEST_F (Dhcp6SeekStsOptionTest, SeekIANAOptionExpectSuccess) { UINT8 *Option = NULL; UINT32 SearchPattern = SEARCH_PATTERN; UINT16 SearchPatternLength = SEARCH_PATTERN_LEN; - EFI_DHCP6_IA Ia = { 0 }; + EFI_DHCP6_IA Ia; + ZeroMem (&Ia, sizeof (Ia)); Ia.Descriptor.Type = DHCPV6_OPTION_IA_NA; Ia.IaAddressCount = 1; Ia.IaAddress[0].PreferredLifetime = 0x11111111; From 9ac6e450e40ef1b2db15ba456329c9fe4e986c8a Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 21 Aug 2025 09:12:21 -0700 Subject: [PATCH 0475/1172] NetworkPkg/UefiPceBcDxe/GoogleTest: Add missing EFIAPI CLANGDWARF generates a build error for calling convention mismatch in UdpRead(), UdpWrite(), and Configure() mock functions. Add EFIAPI so mock function matches function prototype of function being mocked. Signed-off-by: Michael D Kinney --- NetworkPkg/UefiPxeBcDxe/GoogleTest/PxeBcDhcp6GoogleTest.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NetworkPkg/UefiPxeBcDxe/GoogleTest/PxeBcDhcp6GoogleTest.cpp b/NetworkPkg/UefiPxeBcDxe/GoogleTest/PxeBcDhcp6GoogleTest.cpp index e529bc6daf1d..f49ee6f7aa44 100644 --- a/NetworkPkg/UefiPxeBcDxe/GoogleTest/PxeBcDhcp6GoogleTest.cpp +++ b/NetworkPkg/UefiPxeBcDxe/GoogleTest/PxeBcDhcp6GoogleTest.cpp @@ -37,6 +37,7 @@ typedef struct { /////////////////////////////////////////////////////////////////////////////// EFI_STATUS +EFIAPI MockUdpWrite ( IN EFI_PXE_BASE_CODE_PROTOCOL *This, IN UINT16 OpFlags, @@ -55,6 +56,7 @@ MockUdpWrite ( } EFI_STATUS +EFIAPI MockUdpRead ( IN EFI_PXE_BASE_CODE_PROTOCOL *This, IN UINT16 OpFlags, @@ -72,6 +74,7 @@ MockUdpRead ( } EFI_STATUS +EFIAPI MockConfigure ( IN EFI_UDP6_PROTOCOL *This, IN EFI_UDP6_CONFIG_DATA *UdpConfigData OPTIONAL From c4ca5ee0910a3f580ecc44032f12aff129505149 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 20 Aug 2025 12:51:22 -0700 Subject: [PATCH 0476/1172] MdeModulePkg/Universal/DisplayEngineDxe: Fix GCCNOLTO error Fix potentially uninitialized local variable Index. Signed-off-by: Michael D Kinney --- MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c | 1 + 1 file changed, 1 insertion(+) diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c b/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c index b2a3ef6205a9..06d64105db5d 100644 --- a/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c +++ b/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c @@ -85,6 +85,7 @@ ReadString ( DimensionsWidth = gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn; DimensionsHeight = gStatementDimensions.BottomRow - gStatementDimensions.TopRow; + Index = 0; NullCharacter = CHAR_NULL; ScreenSize = GetStringWidth (Prompt) / sizeof (CHAR16); Space[0] = L' '; From f57fab9b1de09f1e50dfed68f1fedc54a43402fd Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 21 Aug 2025 09:05:02 -0700 Subject: [PATCH 0477/1172] MdeModulePkg/Test/Include: Fix SecurityManagement include guard Fix mimatched macro name of include guard in MockSecurityManagementLib.h. This was found with unit test build using CLANGDWARF. Signed-off-by: Michael D Kinney --- .../Mock/Include/GoogleTest/Library/MockSecurityManagementLib.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MdeModulePkg/Test/Mock/Include/GoogleTest/Library/MockSecurityManagementLib.h b/MdeModulePkg/Test/Mock/Include/GoogleTest/Library/MockSecurityManagementLib.h index 59ec20518611..4769e0721a4c 100644 --- a/MdeModulePkg/Test/Mock/Include/GoogleTest/Library/MockSecurityManagementLib.h +++ b/MdeModulePkg/Test/Mock/Include/GoogleTest/Library/MockSecurityManagementLib.h @@ -6,7 +6,7 @@ **/ #ifndef MOCK_SECURITY_MANAGEMENT_LIB_H_ -#define MOCK_SECURITY_MANAGEMENT_LIB_LIB_H_ +#define MOCK_SECURITY_MANAGEMENT_LIB_H_ #include #include From 2636488e7bc5379ccffc9eb15848c6ca481be98d Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 21 Aug 2025 09:06:56 -0700 Subject: [PATCH 0478/1172] MdePkg/Test/MockSmmServicesTableLib: Fix struct init CLANGDWARF generates errors for missing braces in initialization of complex structures. Expand the initialization of EFI_SMM_CPU_IO2_PROTOCOL in LocalSmst to set each function pointer to NULL. Signed-off-by: Michael D Kinney --- .../MockSmmServicesTableLib.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/MdePkg/Test/Mock/Library/GoogleTest/MockSmmServicesTableLib/MockSmmServicesTableLib.cpp b/MdePkg/Test/Mock/Library/GoogleTest/MockSmmServicesTableLib/MockSmmServicesTableLib.cpp index 91bf42f8db3c..a66426f6b2ed 100644 --- a/MdePkg/Test/Mock/Library/GoogleTest/MockSmmServicesTableLib/MockSmmServicesTableLib.cpp +++ b/MdePkg/Test/Mock/Library/GoogleTest/MockSmmServicesTableLib/MockSmmServicesTableLib.cpp @@ -24,11 +24,26 @@ MOCK_FUNCTION_DEFINITION (MockSmmServicesTableLib, gSmst_SmmInterruptRegister, 3 MOCK_FUNCTION_DEFINITION (MockSmmServicesTableLib, gSmst_SmmInterruptUnRegister, 1, EFIAPI); static EFI_SMM_SYSTEM_TABLE2 LocalSmst = { - { 0, 0, 0, 0, 0 }, // EFI_TABLE_HEADER + { // EFI_TABLE_HEADER + 0, + 0, + 0, + 0, + 0 + }, NULL, // SmmFirmwareVendor 0, // SmmFirmwareRevision NULL, // EFI_SMM_INSTALL_CONFIGURATION_TABLE2 - { NULL }, // EFI_SMM_CPU_IO2_PROTOCOL + { // EFI_SMM_CPU_IO2_PROTOCOL + { + NULL, + NULL + }, + { + NULL, + NULL + } + }, gSmst_SmmAllocatePool, // EFI_ALLOCATE_POOL gSmst_SmmFreePool, // EFI_FREE_POOL gSmst_SmmAllocatePages, // EFI_ALLOCATE_PAGES From d87583e720ae816c6f81617e54f28b1366301296 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Tue, 16 Sep 2025 13:41:25 -0700 Subject: [PATCH 0479/1172] MdePkg/Library/BaseLib: Remove __chkstk() from BaseLib Remove workaround for GCC compilers that is no longer required. Keeping this implementation of __chkstk() generates duplicate symbol build failures with Windows/CLANGPDB builds host-based unit test builds. Signed-off-by: Michael D Kinney --- MdePkg/Library/BaseLib/BaseLib.inf | 1 - MdePkg/Library/BaseLib/ChkStkGcc.c | 18 ------------------ MdePkg/Library/BaseLib/UnitTestHostBaseLib.inf | 1 - 3 files changed, 20 deletions(-) delete mode 100644 MdePkg/Library/BaseLib/ChkStkGcc.c diff --git a/MdePkg/Library/BaseLib/BaseLib.inf b/MdePkg/Library/BaseLib/BaseLib.inf index ec40349654b3..a149770ae22c 100644 --- a/MdePkg/Library/BaseLib/BaseLib.inf +++ b/MdePkg/Library/BaseLib/BaseLib.inf @@ -331,7 +331,6 @@ X64/XSetBv.nasm X64/VmgExit.nasm X64/VmgExitSvsm.nasm - ChkStkGcc.c | GCC [Sources.EBC] Ebc/CpuBreakpoint.c diff --git a/MdePkg/Library/BaseLib/ChkStkGcc.c b/MdePkg/Library/BaseLib/ChkStkGcc.c deleted file mode 100644 index 9c74e36273f4..000000000000 --- a/MdePkg/Library/BaseLib/ChkStkGcc.c +++ /dev/null @@ -1,18 +0,0 @@ -/** @file - Provides hack function for passng GCC build. - - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
- SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include "BaseLibInternals.h" - -/** - Hack function for passing GCC build. -**/ -VOID -__chkstk ( - ) -{ -} diff --git a/MdePkg/Library/BaseLib/UnitTestHostBaseLib.inf b/MdePkg/Library/BaseLib/UnitTestHostBaseLib.inf index 1d53f940f5d0..452619f5d841 100644 --- a/MdePkg/Library/BaseLib/UnitTestHostBaseLib.inf +++ b/MdePkg/Library/BaseLib/UnitTestHostBaseLib.inf @@ -168,7 +168,6 @@ X86SpeculationBarrier.c X64/GccInline.c | GCC X64/RdRand.nasm - ChkStkGcc.c | GCC X86UnitTestHost.c IntelTdxNull.c From 1e5aeff4179df241b173196a0ca1e2aed95af41f Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 3 Sep 2025 19:41:31 -0700 Subject: [PATCH 0480/1172] UefiCpuPkg/MtrrLib: Update unit tests for CLANGPDB Update [BuildOptions] so CLANGPDB matches MSFT to support Windows/clang builds of MtrrLib host-based unit tests. Signed-off-by: Michael D Kinney --- UefiCpuPkg/Library/MtrrLib/UnitTest/MtrrLibUnitTestHost.inf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/UefiCpuPkg/Library/MtrrLib/UnitTest/MtrrLibUnitTestHost.inf b/UefiCpuPkg/Library/MtrrLib/UnitTest/MtrrLibUnitTestHost.inf index 9009fc278584..17fe10e72084 100644 --- a/UefiCpuPkg/Library/MtrrLib/UnitTest/MtrrLibUnitTestHost.inf +++ b/UefiCpuPkg/Library/MtrrLib/UnitTest/MtrrLibUnitTestHost.inf @@ -40,4 +40,5 @@ gUefiCpuPkgTokenSpaceGuid.PcdCpuNumberOfReservedVariableMtrrs ## SOMETIMES_CONSUMES [BuildOptions] - MSFT:*_*_*_CC_FLAGS = -D _CRT_SECURE_NO_WARNINGS + MSFT:*_*_*_CC_FLAGS = -D _CRT_SECURE_NO_WARNINGS + CLANGPDB:*_*_*_CC_FLAGS = -D _CRT_SECURE_NO_WARNINGS From ae95326c2cae647f8499b68f15414738834b9912 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 3 Sep 2025 19:38:25 -0700 Subject: [PATCH 0481/1172] CryptoPkg/BaseCryptLib: Remove tolower() for unit tests tolower() is always provided by the standard C library. Remove the implementation of tolower() from UnitTestHostCrtWrapper.c that is only used when building host based unit tests. PR https://github.com/tianocore/edk2/pull/11217 attempted to resolve this issue by renaming tolower() to avoid duplicate symbols. This change removes this workaround as well. Signed-off-by: Michael D Kinney --- .../SysCall/UnitTestHostCrtWrapper.c | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/UnitTestHostCrtWrapper.c b/CryptoPkg/Library/BaseCryptLib/SysCall/UnitTestHostCrtWrapper.c index e83d190dd8fd..713171c650c4 100644 --- a/CryptoPkg/Library/BaseCryptLib/SysCall/UnitTestHostCrtWrapper.c +++ b/CryptoPkg/Library/BaseCryptLib/SysCall/UnitTestHostCrtWrapper.c @@ -13,32 +13,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include -/* Convert character to lowercase */ -#ifdef _MSC_VER -// -// Workaround for building NOOPT on Windows systems. Due to disabled -// optimization, the MSVC compiler cannot hide this function -// implementation from the linker. -// -int -tolower_noos ( - int c - ) - #pragma comment(linker, "/alternatename:tolower=tolower_noos") -#else -int -tolower ( - int c - ) -#endif -{ - if (('A' <= (c)) && ((c) <= 'Z')) { - return (c - ('A' - 'a')); - } - - return (c); -} - /* Compare first n bytes of string s1 with string s2, ignoring case */ int strncasecmp ( From ff39a5d2dd51b77a125379e5a83752babc0e0ed7 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 3 Sep 2025 19:39:52 -0700 Subject: [PATCH 0482/1172] CryptoPkg/BaseCryptLib: Fix MODULE_TYPE for unit tests Update INF for BaseCryptLib used with host based unit tests to use a MODULE_TYPE of HOST_APPLICATION to make sure the correct compiler/linker flags are used. Signed-off-by: Michael D Kinney --- CryptoPkg/Library/BaseCryptLib/UnitTestHostBaseCryptLib.inf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CryptoPkg/Library/BaseCryptLib/UnitTestHostBaseCryptLib.inf b/CryptoPkg/Library/BaseCryptLib/UnitTestHostBaseCryptLib.inf index c3d1d61e59c5..867c8658fb5e 100644 --- a/CryptoPkg/Library/BaseCryptLib/UnitTestHostBaseCryptLib.inf +++ b/CryptoPkg/Library/BaseCryptLib/UnitTestHostBaseCryptLib.inf @@ -11,9 +11,9 @@ INF_VERSION = 0x00010005 BASE_NAME = BaseCryptLib FILE_GUID = c97d34aa-caf8-42cd-8261-8705f46304b3 - MODULE_TYPE = DXE_DRIVER + MODULE_TYPE = HOST_APPLICATION VERSION_STRING = 1.0 - LIBRARY_CLASS = BaseCryptLib|HOST_APPLICATION + LIBRARY_CLASS = BaseCryptLib # # The following information is for reference only and not required by the build tools. From 82a03a824824a348fbbff7de680e15284bfc61a4 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 4 Sep 2025 17:03:44 -0700 Subject: [PATCH 0483/1172] RedfishPkg/JsonLib: Define NO_MSABI_VA_FUNCS for GCC X64 For GCC family X64 builds, add -DNO_MSABI_VA_FUNCS to force use of the compiler default vararg macros. This define is required in libraries that use a standard C source submodule and there are one or more vararg functions. The calling convention of the vararg function must match the calling convention of the vararg macros used within the vararg function. In the JsonLib case, jsonp_error_set() is a vararg function and generates the following error for CLANGDWARF X64 builds. RedfishPkg/Library/JsonLib/jansson/src/error.c:37:5: error: '__builtin_ms_va_start' used in System V ABI function 37 | va_start(ap, msg); | ^ This change matches CryptoPkg openssl and mbedtls library INF files that also define NO_MSABI_VA_FUNCS. Signed-off-by: Michael D Kinney --- RedfishPkg/Library/JsonLib/JsonLib.inf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RedfishPkg/Library/JsonLib/JsonLib.inf b/RedfishPkg/Library/JsonLib/JsonLib.inf index 63997f896812..d7cfc0b01641 100644 --- a/RedfishPkg/Library/JsonLib/JsonLib.inf +++ b/RedfishPkg/Library/JsonLib/JsonLib.inf @@ -85,4 +85,4 @@ MSFT:*_*_X64_CC_FLAGS = /wd4204 /wd4244 /wd4090 /wd4334 /wd4706 /DHAVE_CONFIG_H=1 /U_WIN32 /UWIN64 /U_MSC_VER MSFT:*_*_IA32_CC_FLAGS = /wd4204 /wd4244 /wd4090 /wd4706 /DHAVE_CONFIG_H=1 /U_WIN32 /UWIN64 /U_MSC_VER GCC:*_*_*_CC_FLAGS = -Wno-unused-function -Wno-unused-but-set-variable -DHAVE_CONFIG_H=1 -UWIN32 -U_WIN32 -UWIN64 -U_MSC_VER - + GCC:*_*_X64_CC_FLAGS = -DNO_MSABI_VA_FUNCS From 62861fed5d600074ea0e16cab75b3e31faa394ab Mon Sep 17 00:00:00 2001 From: Star Zeng Date: Thu, 18 Sep 2025 07:30:48 +0800 Subject: [PATCH 0484/1172] Maintainers.txt: Replace Swee Aun with Star as reviewer for StandaloneMmPkg Swee Aun has left Intel, replace Swee Aun with Star as reviewer for StandaloneMmPkg. Signed-off-by: Star Zeng --- Maintainers.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Maintainers.txt b/Maintainers.txt index ad8b08784afa..0541e1088624 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -650,7 +650,7 @@ M: Sami Mujawar [samimujawar] M: Ray Ni [niruiyu] R: Jiaxin Wu [jiaxinwu] R: Dun Tan [td36] -R: Khor Swee Aun [sweeaun] +R: Star Zeng [lzeng14] R: Eduardo Cuevas Farfan [ecuevasf] UefiCpuPkg From 0bc550f4660a6d3b2c818ae7a7150cf3767a6dbc Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 20 Aug 2025 20:24:08 -0700 Subject: [PATCH 0485/1172] UnitTestFrameworkPkg/SampleGoogleTest: Add missing override keyword Add missing override keyword to c++ classes. Found by the clang++ compiler. Signed-off-by: Michael D Kinney --- .../GoogleTest/Sample/SampleGoogleTest/SampleGoogleTest.cpp | 2 +- .../SampleGoogleTestExpectFail/SampleGoogleTestExpectFail.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/UnitTestFrameworkPkg/Test/GoogleTest/Sample/SampleGoogleTest/SampleGoogleTest.cpp b/UnitTestFrameworkPkg/Test/GoogleTest/Sample/SampleGoogleTest/SampleGoogleTest.cpp index c13c66f97a52..591e70b6ae96 100644 --- a/UnitTestFrameworkPkg/Test/GoogleTest/Sample/SampleGoogleTest/SampleGoogleTest.cpp +++ b/UnitTestFrameworkPkg/Test/GoogleTest/Sample/SampleGoogleTest/SampleGoogleTest.cpp @@ -66,7 +66,7 @@ class GlobalVarTests : public ::testing::Test { void TearDown ( - ) + ) override { SampleGlobalTestPointer = NULL; } diff --git a/UnitTestFrameworkPkg/Test/GoogleTest/Sample/SampleGoogleTestExpectFail/SampleGoogleTestExpectFail.cpp b/UnitTestFrameworkPkg/Test/GoogleTest/Sample/SampleGoogleTestExpectFail/SampleGoogleTestExpectFail.cpp index bb0e18330570..ab29521f9892 100644 --- a/UnitTestFrameworkPkg/Test/GoogleTest/Sample/SampleGoogleTestExpectFail/SampleGoogleTestExpectFail.cpp +++ b/UnitTestFrameworkPkg/Test/GoogleTest/Sample/SampleGoogleTestExpectFail/SampleGoogleTestExpectFail.cpp @@ -65,7 +65,7 @@ class GlobalVarTests : public ::testing::Test { void TearDown ( - ) + ) override { SampleGlobalTestPointer = NULL; } From 7f557cd133ddcc33c305e3bccfbfbd8405024eb2 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 20 Aug 2025 15:33:44 -0700 Subject: [PATCH 0486/1172] EmulatorPkg/Unix/Host: Fix set but unused variables Signed-off-by: Michael D Kinney --- EmulatorPkg/Unix/Host/BlockIo.c | 7 +-- EmulatorPkg/Unix/Host/Host.c | 12 ++---- EmulatorPkg/Unix/Host/LinuxPacketFilter.c | 52 ----------------------- 3 files changed, 4 insertions(+), 67 deletions(-) diff --git a/EmulatorPkg/Unix/Host/BlockIo.c b/EmulatorPkg/Unix/Host/BlockIo.c index cf2d6b4cda6f..1cef7d01c296 100644 --- a/EmulatorPkg/Unix/Host/BlockIo.c +++ b/EmulatorPkg/Unix/Host/BlockIo.c @@ -215,33 +215,28 @@ EmuBlockIoError ( ) { EFI_STATUS Status; - BOOLEAN ReinstallBlockIoFlag; switch (errno) { case EAGAIN: Status = EFI_NO_MEDIA; Private->Media->ReadOnly = FALSE; Private->Media->MediaPresent = FALSE; - ReinstallBlockIoFlag = FALSE; break; case EACCES: Private->Media->ReadOnly = FALSE; Private->Media->MediaPresent = TRUE; Private->Media->MediaId += 1; - ReinstallBlockIoFlag = TRUE; Status = EFI_MEDIA_CHANGED; break; case EROFS: Private->Media->ReadOnly = TRUE; - ReinstallBlockIoFlag = FALSE; Status = EFI_WRITE_PROTECTED; break; default: - ReinstallBlockIoFlag = FALSE; - Status = EFI_DEVICE_ERROR; + Status = EFI_DEVICE_ERROR; break; } diff --git a/EmulatorPkg/Unix/Host/Host.c b/EmulatorPkg/Unix/Host/Host.c index 548b24d3bca0..26e15e63bfc7 100644 --- a/EmulatorPkg/Unix/Host/Host.c +++ b/EmulatorPkg/Unix/Host/Host.c @@ -93,9 +93,7 @@ main ( UINTN Index; UINTN Index1; UINTN Index2; - UINTN PeiIndex; CHAR8 *FileName; - BOOLEAN Done; EFI_PEI_FILE_HANDLE FileHandle; VOID *SecFile; CHAR16 *MemorySizeStr; @@ -232,7 +230,7 @@ main ( } Index2 = 0; - for (Done = FALSE, Index = 0, PeiIndex = 0, SecFile = NULL; + for (Index = 0, SecFile = NULL; FirmwareVolumesStr[Index2] != 0; Index++) { @@ -286,7 +284,6 @@ main ( if (!EFI_ERROR (Status)) { Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle, &SecFile); if (!EFI_ERROR (Status)) { - PeiIndex = Index; printf (" contains SEC Core"); } } @@ -550,7 +547,6 @@ SecLoadFromCore ( ) { EFI_STATUS Status; - EFI_PHYSICAL_ADDRESS TopOfMemory; VOID *TopOfStack; EFI_PHYSICAL_ADDRESS PeiCoreEntryPoint; EFI_SEC_PEI_HAND_OFF *SecCoreData; @@ -559,7 +555,6 @@ SecLoadFromCore ( // // Compute Top Of Memory for Stack and PEI Core Allocations // - TopOfMemory = LargestRegion + LargestRegionSize; PeiStackSize = (UINTN)RShiftU64 ((UINT64)STACK_SIZE, 1); // @@ -571,11 +566,10 @@ SecLoadFromCore ( // | Stack | // |-----------| <---- TemporaryRamBase // - TopOfStack = (VOID *)(LargestRegion + PeiStackSize); - TopOfMemory = LargestRegion + PeiStackSize; + TopOfStack = (VOID *)(LargestRegion + PeiStackSize); // - // Reservet space for storing PeiCore's parament in stack. + // Reserve space for storing PeiCore's parament in stack. // TopOfStack = (VOID *)((UINTN)TopOfStack - sizeof (EFI_SEC_PEI_HAND_OFF) - CPU_STACK_ALIGNMENT); TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT); diff --git a/EmulatorPkg/Unix/Host/LinuxPacketFilter.c b/EmulatorPkg/Unix/Host/LinuxPacketFilter.c index 87c3dd6be477..c8d202a7a9c2 100644 --- a/EmulatorPkg/Unix/Host/LinuxPacketFilter.c +++ b/EmulatorPkg/Unix/Host/LinuxPacketFilter.c @@ -71,10 +71,6 @@ EmuSnpStart ( IN EMU_SNP_PROTOCOL *This ) { - EMU_SNP_PRIVATE *Private; - - Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This); - return EFI_UNSUPPORTED; } @@ -95,10 +91,6 @@ EmuSnpStop ( IN EMU_SNP_PROTOCOL *This ) { - EMU_SNP_PRIVATE *Private; - - Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This); - return EFI_UNSUPPORTED; } @@ -135,10 +127,6 @@ EmuSnpInitialize ( IN UINTN ExtraTxBufferSize OPTIONAL ) { - EMU_SNP_PRIVATE *Private; - - Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This); - return EFI_UNSUPPORTED; } @@ -164,10 +152,6 @@ EmuSnpReset ( IN BOOLEAN ExtendedVerification ) { - EMU_SNP_PRIVATE *Private; - - Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This); - return EFI_UNSUPPORTED; } @@ -189,10 +173,6 @@ EmuSnpShutdown ( IN EMU_SNP_PROTOCOL *This ) { - EMU_SNP_PRIVATE *Private; - - Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This); - return EFI_UNSUPPORTED; } @@ -230,10 +210,6 @@ EmuSnpReceiveFilters ( IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL ) { - EMU_SNP_PRIVATE *Private; - - Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This); - return EFI_UNSUPPORTED; } @@ -259,10 +235,6 @@ EmuSnpStationAddress ( IN EFI_MAC_ADDRESS *New OPTIONAL ) { - EMU_SNP_PRIVATE *Private; - - Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This); - return EFI_UNSUPPORTED; } @@ -295,10 +267,6 @@ EmuSnpStatistics ( OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL ) { - EMU_SNP_PRIVATE *Private; - - Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This); - return EFI_UNSUPPORTED; } @@ -331,10 +299,6 @@ EmuSnpMCastIpToMac ( OUT EFI_MAC_ADDRESS *MAC ) { - EMU_SNP_PRIVATE *Private; - - Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This); - return EFI_UNSUPPORTED; } @@ -367,10 +331,6 @@ EmuSnpNvData ( IN OUT VOID *Buffer ) { - EMU_SNP_PRIVATE *Private; - - Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This); - return EFI_UNSUPPORTED; } @@ -406,10 +366,6 @@ EmuSnpGetStatus ( OUT VOID **TxBuf OPTIONAL ) { - EMU_SNP_PRIVATE *Private; - - Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This); - return EFI_UNSUPPORTED; } @@ -457,10 +413,6 @@ EmuSnpTransmit ( IN UINT16 *Protocol OPTIONAL ) { - EMU_SNP_PRIVATE *Private; - - Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This); - return EFI_UNSUPPORTED; } @@ -507,10 +459,6 @@ EmuSnpReceive ( OUT UINT16 *Protocol OPTIONAL ) { - EMU_SNP_PRIVATE *Private; - - Private = EMU_SNP_PRIVATE_DATA_FROM_THIS (This); - return EFI_UNSUPPORTED; } From 24803543eaf88898c5faeaeae0b3870991e7bcbe Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 20 Aug 2025 18:38:20 -0700 Subject: [PATCH 0487/1172] EmulatorPkg/Win/Host: Remove set but not used variables Signed-off-by: Michael D Kinney --- EmulatorPkg/Win/Host/WinPacketFilter.c | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/EmulatorPkg/Win/Host/WinPacketFilter.c b/EmulatorPkg/Win/Host/WinPacketFilter.c index a71c7e8c131b..2ebe62a127c8 100644 --- a/EmulatorPkg/Win/Host/WinPacketFilter.c +++ b/EmulatorPkg/Win/Host/WinPacketFilter.c @@ -462,10 +462,6 @@ WinNtSnpStationAddress ( IN EFI_MAC_ADDRESS *New OPTIONAL ) { - WIN_NT_SNP_PRIVATE *Private; - - Private = WIN_NT_SNP_PRIVATE_DATA_FROM_THIS (This); - return EFI_UNSUPPORTED; } @@ -498,10 +494,6 @@ WinNtSnpStatistics ( OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL ) { - WIN_NT_SNP_PRIVATE *Private; - - Private = WIN_NT_SNP_PRIVATE_DATA_FROM_THIS (This); - return EFI_UNSUPPORTED; } @@ -534,10 +526,6 @@ WinNtSnpMCastIpToMac ( OUT EFI_MAC_ADDRESS *MAC ) { - WIN_NT_SNP_PRIVATE *Private; - - Private = WIN_NT_SNP_PRIVATE_DATA_FROM_THIS (This); - return EFI_UNSUPPORTED; } @@ -570,10 +558,6 @@ WinNtSnpNvData ( IN OUT VOID *Buffer ) { - WIN_NT_SNP_PRIVATE *Private; - - Private = WIN_NT_SNP_PRIVATE_DATA_FROM_THIS (This); - return EFI_UNSUPPORTED; } From a9cf21e8353ad83c9b04896db68a3ae73c8a4ad3 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 18 Sep 2025 17:08:26 -0700 Subject: [PATCH 0488/1172] BaseTools/Conf: Fix build_rule.template for CLANGDWARF Signed-off-by: Michael D Kinney --- BaseTools/Conf/build_rule.template | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_rule.template index ccddf7aa206f..86de8953a1f4 100755 --- a/BaseTools/Conf/build_rule.template +++ b/BaseTools/Conf/build_rule.template @@ -338,7 +338,7 @@ "$(DLINK)" $(DLINK_FLAGS) $(DLINK_SPATH) @$(STATIC_LIBRARY_FILES_LIST) - + "$(DLINK)" $(DLINK_FLAGS) -Wl,--start-group,@$(STATIC_LIBRARY_FILES_LIST),--end-group $(DLINK2_FLAGS) @@ -362,7 +362,7 @@ "$(CC)" -o $(OUTPUT_DIR)/Empty_C_File_Host_Application_Build.obj $(CC_FLAGS) $(INC) $(EDK_TOOLS_PATH)/Conf/Empty_C_File_Host_Application_Build.c "$(DLINK)" $(DLINK_FLAGS) $(DLINK_SPATH) $(OUTPUT_DIR)/Empty_C_File_Host_Application_Build.obj @$(STATIC_LIBRARY_FILES_LIST) - + "$(DLINK)" $(DLINK_FLAGS) -Wl,--start-group,@$(STATIC_LIBRARY_FILES_LIST),--end-group $(DLINK2_FLAGS) From a63bbb35d9ce87aa9c7782f5bc6821cbf99db1a1 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 20 Aug 2025 10:27:43 -0700 Subject: [PATCH 0489/1172] EmulatorPkg/Unix/Host: Add CLANGDWARF support and reduce warnings Use GCC family and remove references to specific tool chain tags. This allows all GCC families to be supported including CLANGDWARF. Add -z noexecstack to reduce warnings. Signed-off-by: Michael D Kinney --- EmulatorPkg/Unix/Host/Host.inf | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/EmulatorPkg/Unix/Host/Host.inf b/EmulatorPkg/Unix/Host/Host.inf index 550cb9f6e84d..910b46369e65 100644 --- a/EmulatorPkg/Unix/Host/Host.inf +++ b/EmulatorPkg/Unix/Host/Host.inf @@ -114,22 +114,15 @@ [BuildOptions] - GCC:*_*_IA32_DLINK_FLAGS == -o $(BIN_DIR)/Host -m32 -L/usr/X11R6/lib - GCC:*_*_IA32_CC_FLAGS == -m32 -g -fshort-wchar -fno-strict-aliasing -Wall -malign-double -idirafter/usr/include -c -include $(DEST_DIR_DEBUG)/AutoGen.h -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings - GCC:*_*_IA32_PP_FLAGS == -m32 -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h - GCC:*_*_IA32_ASM_FLAGS == -m32 -c -x assembler -imacros $(DEST_DIR_DEBUG)/AutoGen.h - - GCC:*_*_X64_DLINK_FLAGS == -o $(BIN_DIR)/Host -m64 -L/usr/X11R6/lib - GCC:*_GCC5_X64_DLINK_FLAGS == -flto -o $(BIN_DIR)/Host -m64 -L/usr/X11R6/lib - GCC:*_*_X64_CC_FLAGS == -m64 -g -fshort-wchar -fno-strict-aliasing -Wall -malign-double -idirafter/usr/include -c -include $(DEST_DIR_DEBUG)/AutoGen.h -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings - GCC:*_GCC48_X64_CC_FLAGS = "-DEFIAPI=__attribute__((ms_abi))" - GCC:*_GCC49_X64_CC_FLAGS = "-DEFIAPI=__attribute__((ms_abi))" - GCC:*_GCC5_X64_CC_FLAGS = "-DEFIAPI=__attribute__((ms_abi))" -flto -DUSING_LTO -Os - GCC:*_GCC_X64_CC_FLAGS = "-DEFIAPI=__attribute__((ms_abi))" -flto -DUSING_LTO -Os - GCC:*_*_X64_PP_FLAGS == -m64 -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h - GCC:*_*_X64_ASM_FLAGS == -m64 -c -x assembler -imacros $(DEST_DIR_DEBUG)/AutoGen.h - - GCC:*_*_*_DLINK2_FLAGS == -lpthread -ldl -lXext -lX11 + GCC:*_*_*_CC_FLAGS == -g -fshort-wchar -fno-strict-aliasing -Wall -malign-double -idirafter/usr/include -c -include $(DEST_DIR_DEBUG)/AutoGen.h -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings + GCC:*_*_IA32_CC_FLAGS = -m32 + GCC:*_*_X64_CC_FLAGS = -m64 "-DEFIAPI=__attribute__((ms_abi))" -flto -DUSING_LTO -Os + + GCC:*_*_*_DLINK_FLAGS == -o $(BIN_DIR)/Host -z noexecstack -L/usr/X11R6/lib + GCC:*_*_IA32_DLINK_FLAGS = -m32 + GCC:*_*_X64_DLINK_FLAGS = -m64 -flto + + GCC:*_*_*_DLINK2_FLAGS == -lpthread -ldl -lXext -lX11 # # Need to do this link via gcc and not ld as the pathing to libraries changes from OS version to OS version From 23dd3eafb84e66b4c7878fcf6309e6ae8bf6243c Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 19 Sep 2025 08:00:44 -0700 Subject: [PATCH 0490/1172] BaseTools/Conf: USER_DEFINED/HOST_APPLICATION CLANG support * Add CLANGDWARF support to USER_DEFINED module type rules. * Add CLANGDWARF support to HOST_APPLICATION module type rules. * Add missing -c option to CLANGPDB HOST_APPLICATION module type rules Signed-off-by: Michael D Kinney --- BaseTools/Conf/build_rule.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_rule.template index 86de8953a1f4..426dbfc69001 100755 --- a/BaseTools/Conf/build_rule.template +++ b/BaseTools/Conf/build_rule.template @@ -359,7 +359,7 @@ "$(DLINK)" $(DLINK_FLAGS) $(DLINK_SPATH) $(OUTPUT_DIR)/Empty_C_File_Host_Application_Build.obj @$(STATIC_LIBRARY_FILES_LIST) - "$(CC)" -o $(OUTPUT_DIR)/Empty_C_File_Host_Application_Build.obj $(CC_FLAGS) $(INC) $(EDK_TOOLS_PATH)/Conf/Empty_C_File_Host_Application_Build.c + "$(CC)" -c -o $(OUTPUT_DIR)/Empty_C_File_Host_Application_Build.obj $(CC_FLAGS) $(INC) $(EDK_TOOLS_PATH)/Conf/Empty_C_File_Host_Application_Build.c "$(DLINK)" $(DLINK_FLAGS) $(DLINK_SPATH) $(OUTPUT_DIR)/Empty_C_File_Host_Application_Build.obj @$(STATIC_LIBRARY_FILES_LIST) From 95c5f119bd25096c3a48edb5fd949f7914dd070f Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 19 Sep 2025 08:09:31 -0700 Subject: [PATCH 0491/1172] BaseTools/Conf: Make ASLCC_FLAGS independent of CC_FLAGS Update ASLCC_FLAGS in tools_def.template too provide all the options required to compile ACPI Table source files without any dependencies on CC_FLAGS. This allows CC_FLAGS to only be used to compile C source files and for ASLCC_FLAGS to only be used to compile ACPI Tables source files. No changes are required for the MSFT or XCODE tool chain families. Only the GCC tool chain family requires updates to the ASLCC_FLAGS in tools_def.template along with updates to build_rule.template to not use CC_FLAGS for ACPI Table rules. This change is required to avoid use of ASAN and code coverage flags when building ACPI Table source files that break CLANGDWARF builds of ACPI Table source files. Signed-off-by: Michael D Kinney --- BaseTools/Conf/build_rule.template | 11 ++++++++--- BaseTools/Conf/tools_def.template | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_rule.template index 426dbfc69001..3bbeecdfcbdc 100755 --- a/BaseTools/Conf/build_rule.template +++ b/BaseTools/Conf/build_rule.template @@ -485,10 +485,15 @@ "$(GENFW)" -o ${dst} -c $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll $(GENFW_FLAGS) - "$(ASLCC)" $(DEPS_FLAGS) -c -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(CC_FLAGS) $(ASLCC_FLAGS) $(DEPS_FLAGS) $(INC) ${src} + "$(ASLCC)" $(DEPS_FLAGS) -c -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(ASLCC_FLAGS) $(DEPS_FLAGS) $(INC) ${src} "$(ASLDLINK)" -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll $(ASLDLINK_FLAGS) $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj "$(GENFW)" -o ${dst} -c $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll $(GENFW_FLAGS) + + "$(ASLCC)" $(DEPS_FLAGS) -c -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(ASLCC_FLAGS) $(DEPS_FLAGS) $(INC) ${src} + "$(ASLDLINK)" /OUT:$(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll $(ASLDLINK_FLAGS) $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj + "$(GENFW)" -o ${dst} -c $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll $(GENFW_FLAGS) + [Acpi-Table-Code-File] ?.aslc, ?.act @@ -505,12 +510,12 @@ "$(GENFW)" -o ${dst} -c $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll $(GENFW_FLAGS) - "$(ASLCC)" $(DEPS_FLAGS) -c -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(CC_FLAGS) $(ASLCC_FLAGS) $(DEPS_FLAGS) $(INC) ${src} + "$(ASLCC)" $(DEPS_FLAGS) -c -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(ASLCC_FLAGS) $(DEPS_FLAGS) $(INC) ${src} "$(ASLDLINK)" -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll $(ASLDLINK_FLAGS) $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj "$(GENFW)" -o ${dst} -c $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll $(GENFW_FLAGS) - "$(ASLCC)" $(DEPS_FLAGS) -c -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(CC_FLAGS) $(ASLCC_FLAGS) $(DEPS_FLAGS) $(INC) ${src} + "$(ASLCC)" $(DEPS_FLAGS) -c -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(ASLCC_FLAGS) $(DEPS_FLAGS) $(INC) ${src} "$(ASLDLINK)" /OUT:$(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll $(ASLDLINK_FLAGS) $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj "$(GENFW)" -o ${dst} -c $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll $(GENFW_FLAGS) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index 0caa1c90018f..3dc54ce7006e 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -942,7 +942,7 @@ DEFINE GCC_ASM_FLAGS = -c -x assembler -imacros AutoGen.h DEFINE GCC_PP_FLAGS = -E -x assembler-with-cpp -include AutoGen.h DEFINE GCC_VFRPP_FLAGS = -x c -E -DVFRCOMPILE --include $(MODULE_NAME)StrDefs.h DEFINE GCC_ASLPP_FLAGS = -x c -E -include AutoGen.h -DEFINE GCC_ASLCC_FLAGS = -x c +DEFINE GCC_ASLCC_FLAGS = -x c -include AutoGen.h -fshort-wchar DEFINE GCC_WINDRES_FLAGS = -J rc -O coff DEFINE GCC_DTCPP_FLAGS = -E -x assembler-with-cpp -imacros AutoGen.h -nostdinc -undef DEFINE GCC_IA32_RC_FLAGS = -I binary -O elf32-i386 -B i386 --rename-section .data=.hii From 6e992efa8dde8a1fef73f212d26e731af9ed5bdc Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 19 Sep 2025 08:12:46 -0700 Subject: [PATCH 0492/1172] BaseTools/Conf: Remove -imacros from GCC_ASM_FLAGS All ASM files are processed using PP_FLAGS that includes AutoGen.h. Remove redundant -imacros AutoGen.h option from GCC_ASM_FLAGS. This also removes warnings generated in CLANG builds when an ASM file is processed and an AutoGen.h file is not present. Signed-off-by: Michael D Kinney --- BaseTools/Conf/tools_def.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index 3dc54ce7006e..420a20465525 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -938,7 +938,7 @@ DEFINE GCC_ARM_AARCH64_ASLDLINK_FLAGS = -Wl,--defsym=PECOFF_HEADER_SIZE=0 DEF(GC DEFINE GCC_ARM_ASLDLINK_FLAGS = DEF(GCC_ARM_DLINK_FLAGS) -Wl,--entry,ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) DEF(GCC_ARM_AARCH64_ASLDLINK_FLAGS) DEFINE GCC_AARCH64_ASLDLINK_FLAGS = DEF(GCC_AARCH64_DLINK_FLAGS) -Wl,--entry,ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) DEF(GCC_ARM_AARCH64_ASLDLINK_FLAGS) DEFINE GCC_LOONGARCH64_ASLDLINK_FLAGS = DEF(GCC_LOONGARCH64_DLINK_FLAGS) -Wl,--entry,ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) -DEFINE GCC_ASM_FLAGS = -c -x assembler -imacros AutoGen.h +DEFINE GCC_ASM_FLAGS = -c -x assembler DEFINE GCC_PP_FLAGS = -E -x assembler-with-cpp -include AutoGen.h DEFINE GCC_VFRPP_FLAGS = -x c -E -DVFRCOMPILE --include $(MODULE_NAME)StrDefs.h DEFINE GCC_ASLPP_FLAGS = -x c -E -include AutoGen.h From 5dadbbac0b7b9912124964ec9ce96691ef6aca1d Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 19 Sep 2025 08:14:02 -0700 Subject: [PATCH 0493/1172] BaseTools/Conf: Remove -nostdlib -nostdlibinc for CLANG Remove -nostdlib and -nostdlibinc from CC_FLAGS for CLANG builds to support using CLANGPDB and CLANGDWARF for modules of type HOST_APPLICATION that require use of standard C libs. Signed-off-by: Michael D Kinney --- BaseTools/Conf/tools_def.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index 420a20465525..102b8d330de2 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -1933,7 +1933,7 @@ DEFINE CLANGPDB_IA32_TARGET = -target i686-pc-windows-msvc DEFINE CLANGPDB_X64_TARGET = -target x86_64-pc-windows-msvc DEFINE CLANGPDB_WARNING_OVERRIDES = -Wno-parentheses-equality -Wno-tautological-compare -Wno-tautological-constant-out-of-range-compare -Wno-empty-body -Wno-unused-const-variable -Wno-varargs -Wno-unknown-warning-option -Wno-unused-but-set-variable -Wno-unused-const-variable -Wno-unaligned-access -Wno-microsoft-enum-forward-reference -DEFINE CLANGPDB_ALL_CC_FLAGS = DEF(GCC48_ALL_CC_FLAGS) DEF(CLANGPDB_WARNING_OVERRIDES) -fno-stack-protector -funsigned-char -ftrap-function=undefined_behavior_has_been_optimized_away_by_clang -Wno-address -Wno-shift-negative-value -Wno-unknown-pragmas -Wno-incompatible-library-redeclaration -Wno-null-dereference -mno-implicit-float -mms-bitfields -mno-stack-arg-probe -nostdlib -nostdlibinc -fno-omit-frame-pointer -U _MSC_VER -D __GNUC__ +DEFINE CLANGPDB_ALL_CC_FLAGS = DEF(GCC48_ALL_CC_FLAGS) DEF(CLANGPDB_WARNING_OVERRIDES) -fno-stack-protector -funsigned-char -ftrap-function=undefined_behavior_has_been_optimized_away_by_clang -Wno-address -Wno-shift-negative-value -Wno-unknown-pragmas -Wno-incompatible-library-redeclaration -Wno-null-dereference -mno-implicit-float -mms-bitfields -mno-stack-arg-probe -fno-omit-frame-pointer -U _MSC_VER -D __GNUC__ ########################### # CLANGPDB IA32 definitions From 238a6175fbd7978b4405f0e4236034eff4a7dec3 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 19 Sep 2025 08:23:20 -0700 Subject: [PATCH 0494/1172] BaseTools/Conf: Add support for C++ compiler flags Update build rules to split C file rules from C++ file rules and introduce CXX_FLAGS to provide compiler options that are only used to compile C++ files. This is required because the compiler options to specify the C++ standard generate errors when used to compile C files. Signed-off-by: Michael D Kinney --- BaseTools/Conf/build_rule.template | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_rule.template index 3bbeecdfcbdc..20fcc9b4b287 100755 --- a/BaseTools/Conf/build_rule.template +++ b/BaseTools/Conf/build_rule.template @@ -113,6 +113,24 @@ ?.c ?.C + + + $(MAKE_FILE) + + + $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj + + + "$(CC)" /Fo${dst} $(DEPS_FLAGS) $(CC_FLAGS) $(INC) ${src} + + + "$(CC)" $(DEPS_FLAGS) $(CC_FLAGS) -c -o ${dst} $(INC) ${src} + + + "$(CC)" $(DEPS_FLAGS) $(CC_FLAGS) -o ${dst} $(INC) ${src} + +[Cxx-Code-File] + ?.cc ?.CC ?.cpp @@ -126,13 +144,13 @@ $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj - "$(CC)" /Fo${dst} $(DEPS_FLAGS) $(CC_FLAGS) $(INC) ${src} + "$(CC)" /Fo${dst} $(DEPS_FLAGS) $(CC_FLAGS) $(CXX_FLAGS) $(INC) ${src} - "$(CC)" $(DEPS_FLAGS) $(CC_FLAGS) -c -o ${dst} $(INC) ${src} + "$(CC)" $(DEPS_FLAGS) $(CC_FLAGS) $(CXX_FLAGS) -c -o ${dst} $(INC) ${src} - "$(CC)" $(DEPS_FLAGS) $(CC_FLAGS) -o ${dst} $(INC) ${src} + "$(CC)" $(DEPS_FLAGS) $(CC_FLAGS) $(CXX_FLAGS) -o ${dst} $(INC) ${src} [C-Code-File.BASE.AARCH64,C-Code-File.SEC.AARCH64,C-Code-File.PEI_CORE.AARCH64,C-Code-File.PEIM.AARCH64,C-Code-File.BASE.ARM,C-Code-File.SEC.ARM,C-Code-File.PEI_CORE.ARM,C-Code-File.PEIM.ARM] From bd9cb3342408d8034d5c5de75d28308cc9524c90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81gatha=20Freitas?= Date: Tue, 12 Aug 2025 16:03:15 -0300 Subject: [PATCH 0495/1172] CryptoPkg/BaseCryptLibMbedTls: Fix DateTime conversion from char to int MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ágatha Freitas --- .../Library/BaseCryptLibMbedTls/Pk/CryptX509.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptX509.c b/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptX509.c index 5a9c87d4486b..ab302f47259f 100644 --- a/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptX509.c +++ b/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptX509.c @@ -1932,18 +1932,18 @@ X509FormatDateTime ( Tm = (mbedtls_x509_time *)DateTime; - Tm->year = (DateTimeStr[0] + '0') * 1000 + (DateTimeStr[1] + '0') * 100 + - (DateTimeStr[2] + '0') * 10 + (DateTimeStr[3] + '0') * 1; + Tm->year = (DateTimeStr[0] - '0') * 1000 + (DateTimeStr[1] - '0') * 100 + + (DateTimeStr[2] - '0') * 10 + (DateTimeStr[3] - '0') * 1; - Tm->mon = (DateTimeStr[4] + '0') * 10 + (DateTimeStr[5] + '0') * 1; + Tm->mon = (DateTimeStr[4] - '0') * 10 + (DateTimeStr[5] - '0') * 1; - Tm->day = (DateTimeStr[6] + '0') * 10 + (DateTimeStr[7] + '0') * 1; + Tm->day = (DateTimeStr[6] - '0') * 10 + (DateTimeStr[7] - '0') * 1; - Tm->hour = (DateTimeStr[8] + '0') * 10 + (DateTimeStr[9] + '0') * 1; + Tm->hour = (DateTimeStr[8] - '0') * 10 + (DateTimeStr[9] - '0') * 1; - Tm->min = (DateTimeStr[10] + '0') * 10 + (DateTimeStr[11] + '0') * 1; + Tm->min = (DateTimeStr[10] - '0') * 10 + (DateTimeStr[11] - '0') * 1; - Tm->sec = (DateTimeStr[12] + '0') * 10 + (DateTimeStr[13] + '0') * 1; + Tm->sec = (DateTimeStr[12] - '0') * 10 + (DateTimeStr[13] - '0') * 1; return TRUE; } From 81f9f6d7b36c268a3b5bbf7ce52ab18b7df0ea69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81gatha=20Freitas?= Date: Tue, 12 Aug 2025 15:53:36 -0300 Subject: [PATCH 0496/1172] CryptoPkg/BaseCryptLibMbedTls: Fix wrong return in X509GetIssuerName MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ágatha Freitas --- CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptX509.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptX509.c b/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptX509.c index ab302f47259f..018bcb739f5e 100644 --- a/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptX509.c +++ b/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptX509.c @@ -1138,17 +1138,17 @@ X509GetIssuerName ( Ret = mbedtls_x509_crt_parse_der (&Crt, Cert, CertSize); if (Ret == 0) { - if (*CertIssuerSize < Crt.serial.len) { - *CertIssuerSize = Crt.serial.len; + if (*CertIssuerSize < Crt.issuer_raw.len) { + *CertIssuerSize = Crt.issuer_raw.len; Status = FALSE; goto Cleanup; } if (CertIssuer != NULL) { - CopyMem (CertIssuer, Crt.serial.p, Crt.serial.len); + CopyMem (CertIssuer, Crt.issuer_raw.p, Crt.issuer_raw.len); } - *CertIssuerSize = Crt.serial.len; + *CertIssuerSize = Crt.issuer_raw.len; Status = TRUE; } From 32711df057bdaa34018e31ee9a5eb57431e88eef Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Wed, 10 Sep 2025 06:26:30 +0000 Subject: [PATCH 0497/1172] DynamicTablesPkg: Drop IA32 support All DynamicTablesPkg libraries and drivers execute in the DXE phase, where both AMD and Intel platforms operate in X64 (64-bit) mode. Therefore, IA32 (32-bit) support is no longer required for DynamicTablesPkg. Signed-off-by: Abdul Lateef Attar --- .../DynamicTableManagerDxe/DynamicTableManagerDxe.inf | 2 +- DynamicTablesPkg/DynamicTables.dsc.inc | 6 +++--- DynamicTablesPkg/DynamicTablesPkg.dsc | 2 +- .../Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf | 3 ++- .../Library/Acpi/Common/AcpiFadtLib/AcpiFadtLib.inf | 3 ++- .../Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf | 2 +- .../Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf | 3 ++- .../Library/Acpi/X64/AcpiMadtLib/AcpiMadtLib.inf | 6 +++--- .../Library/Acpi/X64/AcpiWsmtLib/AcpiWsmtLib.inf | 6 +++--- DynamicTablesPkg/Test/DynamicTablesPkgHostTest.dsc | 3 ++- 10 files changed, 20 insertions(+), 16 deletions(-) diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf index 30dc2b82914f..6246a106f787 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf @@ -28,7 +28,7 @@ [Sources.ARM, Sources.AARCH64] Arm/ArmDynamicTableManager.c -[Sources.IA32, Sources.X64] +[Sources.X64] X64/X64DynamicTableManager.c [Packages] diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc index d8c92dece5f2..1b7379c72671 100644 --- a/DynamicTablesPkg/DynamicTables.dsc.inc +++ b/DynamicTablesPkg/DynamicTables.dsc.inc @@ -30,7 +30,7 @@ [LibraryClasses.AARCH64] DynamicTablesScmiInfoLib|DynamicTablesPkg/Library/DynamicTablesScmiInfoLib/DynamicTablesScmiInfoLib.inf -[Components.common] +[Components.ARM, Components.AARCH64, Components.X64] # # Generators (Common) # @@ -59,9 +59,9 @@ # DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf -[Components.IA32, Components.X64] +[Components.X64] # - # Generators (IA32/X64 specific) + # Generators (X64 specific) # DynamicTablesPkg/Library/Acpi/X64/AcpiFacsLib/AcpiFacsLib.inf DynamicTablesPkg/Library/Acpi/X64/AcpiHpetLib/AcpiHpetLib.inf diff --git a/DynamicTablesPkg/DynamicTablesPkg.dsc b/DynamicTablesPkg/DynamicTablesPkg.dsc index d8c04779b936..31eac32c8dbf 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dsc +++ b/DynamicTablesPkg/DynamicTablesPkg.dsc @@ -15,7 +15,7 @@ PLATFORM_VERSION = 0.1 DSC_SPECIFICATION = 0x0001001a OUTPUT_DIRECTORY = Build/DynamicTables - SUPPORTED_ARCHITECTURES = ARM|AARCH64|IA32|X64 + SUPPORTED_ARCHITECTURES = ARM|AARCH64|X64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf index 3a3464e49cb9..6d942f2170a5 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf @@ -2,6 +2,7 @@ # DBG2 Table Generator # # Copyright (c) 2017 - 2020, Arm Limited. All rights reserved.
+# Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. # # SPDX-License-Identifier: BSD-2-Clause-Patent ## @@ -23,7 +24,7 @@ [Sources.ARM, Sources.AARCH64] Arm/ArmDbg2Generator.c -[Sources.IA32, Sources.X86, Sources.X64] +[Sources.X64] Dbg2GeneratorNull.c [Packages.ARM, Packages.AARCH64] diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiFadtLib/AcpiFadtLib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiFadtLib/AcpiFadtLib.inf index b4b899ca1710..7bd7bdb49357 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiFadtLib/AcpiFadtLib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiFadtLib/AcpiFadtLib.inf @@ -2,6 +2,7 @@ # FADT Table Generator # # Copyright (c) 2017 - 2018, ARM Limited. All rights reserved. +# Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. # # SPDX-License-Identifier: BSD-2-Clause-Patent ## @@ -23,7 +24,7 @@ [Sources.ARM, Sources.AARCH64] Arm/ArmFadtGenerator.c -[Sources.IA32, Sources.X64] +[Sources.X64] X64/X64FadtGenerator.c [Packages] diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf index ec2b4ce93507..a9cf509218b4 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf @@ -24,7 +24,7 @@ [Sources.ARM, Sources.AARCH64] Arm/ArmSratGenerator.c -[Sources.IA32, Sources.X64] +[Sources.X64] X64/X64SratGenerator.c [Packages] diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf index fe0be2362ceb..292dc933c15c 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf @@ -2,6 +2,7 @@ # Ssdt Cpu Topology Table Generator # # Copyright (c) 2021, Arm Limited. All rights reserved.
+# Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. # # SPDX-License-Identifier: BSD-2-Clause-Patent ## @@ -23,7 +24,7 @@ [Sources.ARM, Sources.AARCH64] Arm/ArmSsdtCpuTopologyGenerator.c -[Sources.IA32, Sources.X64] +[Sources.X64] X64/X64SsdtCpuTopologyGenerator.c [Packages.ARM, Packages.AARCH64] diff --git a/DynamicTablesPkg/Library/Acpi/X64/AcpiMadtLib/AcpiMadtLib.inf b/DynamicTablesPkg/Library/Acpi/X64/AcpiMadtLib/AcpiMadtLib.inf index 8cca73c55bb9..5a0fd74add86 100644 --- a/DynamicTablesPkg/Library/Acpi/X64/AcpiMadtLib/AcpiMadtLib.inf +++ b/DynamicTablesPkg/Library/Acpi/X64/AcpiMadtLib/AcpiMadtLib.inf @@ -1,7 +1,7 @@ ## @file # MADT Table Generator # -# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved. +# Copyright (C) 2024 - 2025 Advanced Micro Devices, Inc. All rights reserved. # # SPDX-License-Identifier: BSD-2-Clause-Patent ## @@ -19,10 +19,10 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 +# VALID_ARCHITECTURES = X64 # -[Sources.IA32, Sources.X64] +[Sources.X64] MadtGenerator.c [Packages] diff --git a/DynamicTablesPkg/Library/Acpi/X64/AcpiWsmtLib/AcpiWsmtLib.inf b/DynamicTablesPkg/Library/Acpi/X64/AcpiWsmtLib/AcpiWsmtLib.inf index 06e8f8cd3fd0..60490bd81ed8 100644 --- a/DynamicTablesPkg/Library/Acpi/X64/AcpiWsmtLib/AcpiWsmtLib.inf +++ b/DynamicTablesPkg/Library/Acpi/X64/AcpiWsmtLib/AcpiWsmtLib.inf @@ -1,7 +1,7 @@ ## @file # WSMT Table Generator # -# Copyright (c) 2024 Advanced Micro Devices, Inc. All rights reserved. +# Copyright (c) 2024 - 2025 Advanced Micro Devices, Inc. All rights reserved. # # SPDX-License-Identifier: BSD-2-Clause-Patent ## @@ -19,10 +19,10 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 +# VALID_ARCHITECTURES = X64 # -[Sources.IA32, Sources.X64] +[Sources.X64] WsmtGenerator.c [Packages] diff --git a/DynamicTablesPkg/Test/DynamicTablesPkgHostTest.dsc b/DynamicTablesPkg/Test/DynamicTablesPkgHostTest.dsc index cf5dd63c808d..33adde938b18 100644 --- a/DynamicTablesPkg/Test/DynamicTablesPkgHostTest.dsc +++ b/DynamicTablesPkg/Test/DynamicTablesPkgHostTest.dsc @@ -3,6 +3,7 @@ # # Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# Copyright (c) 2019 - 2020, Intel Corporation. All rights reserved.
+# Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. # Copyright (C) Microsoft Corporation. # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -14,7 +15,7 @@ PLATFORM_VERSION = 0.1 DSC_SPECIFICATION = 0x00010005 OUTPUT_DIRECTORY = Build/DynamicTablesPkg/HostTest - SUPPORTED_ARCHITECTURES = IA32|X64 + SUPPORTED_ARCHITECTURES = X64 BUILD_TARGETS = NOOPT SKUID_IDENTIFIER = DEFAULT From 8a07311710acba244a1b44910324b3b4afd5889a Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Thu, 11 Sep 2025 15:51:35 -0400 Subject: [PATCH 0498/1172] MdeModulePkg: Add PcdDelayedDispatchMaxEntries The current fixed value of 8 for `DELAYED_DISPATCH_MAX_ENTRIES` is not large enough to accommodate platform usage. This change replaces the macro with a PCD that can be configured by platforms. In the case the default PCD value is too small, an error message explaining that the PCD should be updated will be printed followed by an assert. Signed-off-by: Michael Kubacki --- MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c | 14 ++++++++++---- MdeModulePkg/Core/Pei/PeiMain.inf | 1 + MdeModulePkg/Include/Guid/DelayedDispatch.h | 9 ++------- MdeModulePkg/MdeModulePkg.dec | 4 ++++ 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c index 4073bad82c16..f488943c95c6 100644 --- a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c +++ b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c @@ -134,9 +134,15 @@ PeiDelayedDispatchRegister ( } // Check for available entry slots - ASSERT (DelayedDispatchTable->Count <= DELAYED_DISPATCH_MAX_ENTRIES); - if (DelayedDispatchTable->Count == DELAYED_DISPATCH_MAX_ENTRIES) { - DEBUG ((DEBUG_ERROR, "%a Too many entries requested\n", __func__)); + if (DelayedDispatchTable->Count >= PcdGet32 (PcdDelayedDispatchMaxEntries)) { + DEBUG (( + DEBUG_ERROR, + "%a DelayedDispatchTable->Count = %d. PcdDelayedDispatchMaxEntries (%d) is too small.\n", + __func__, + DelayedDispatchTable->Count, + PcdGet32 (PcdDelayedDispatchMaxEntries) + )); + ASSERT (DelayedDispatchTable->Count < PcdGet32 (PcdDelayedDispatchMaxEntries)); Status = EFI_OUT_OF_RESOURCES; goto Exit; } @@ -1807,7 +1813,7 @@ PeiDispatcher ( if (GuidHob != NULL) { Private->DelayedDispatchTable = (DELAYED_DISPATCH_TABLE *)(GET_GUID_HOB_DATA (GuidHob)); } else { - TableSize = sizeof (DELAYED_DISPATCH_TABLE) + ((DELAYED_DISPATCH_MAX_ENTRIES - 1) * sizeof (DELAYED_DISPATCH_ENTRY)); + TableSize = sizeof (DELAYED_DISPATCH_TABLE) + (PcdGet32 (PcdDelayedDispatchMaxEntries) * sizeof (DELAYED_DISPATCH_ENTRY)); Private->DelayedDispatchTable = BuildGuidHob (&gEfiDelayedDispatchTableGuid, TableSize); if (Private->DelayedDispatchTable != NULL) { ZeroMem (Private->DelayedDispatchTable, TableSize); diff --git a/MdeModulePkg/Core/Pei/PeiMain.inf b/MdeModulePkg/Core/Pei/PeiMain.inf index 4cd58ee3aaee..27977ea9c098 100644 --- a/MdeModulePkg/Core/Pei/PeiMain.inf +++ b/MdeModulePkg/Core/Pei/PeiMain.inf @@ -121,6 +121,7 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdMigrateTemporaryRamFirmwareVolumes ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdDelayedDispatchMaxDelayUs ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdDelayedDispatchCompletionTimeoutUs ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdDelayedDispatchMaxEntries ## CONSUMES # [BootMode] # S3_RESUME ## SOMETIMES_CONSUMES diff --git a/MdeModulePkg/Include/Guid/DelayedDispatch.h b/MdeModulePkg/Include/Guid/DelayedDispatch.h index 9be5444e3600..0adab217574d 100644 --- a/MdeModulePkg/Include/Guid/DelayedDispatch.h +++ b/MdeModulePkg/Include/Guid/DelayedDispatch.h @@ -1,7 +1,7 @@ /** @file Definition for structure & defines exported by Delayed Dispatch PPI - Copyright (c), Microsoft Corporation. + Copyright (c) Microsoft Corporation. SPDX-License-Identifier: BSD-2-Clause-Patent @@ -15,11 +15,6 @@ 0x4b733449, 0x8eff, 0x488c, { 0x92, 0x1a, 0x15, 0x4a, 0xda, 0x25, 0x18, 0x07 } \ } -// -// Maximal number of Delayed Dispatch entries supported -// -#define DELAYED_DISPATCH_MAX_ENTRIES 8 - // // Internal structure for delayed dispatch entries. // Packing the structures here to save space as they will be stored as HOBs. @@ -37,7 +32,7 @@ typedef struct { typedef struct { UINT32 Count; UINT32 DispCount; - DELAYED_DISPATCH_ENTRY Entry[DELAYED_DISPATCH_MAX_ENTRIES]; + DELAYED_DISPATCH_ENTRY Entry[]; // Number of entries is based on PcdDelayedDispatchMaxEntries } DELAYED_DISPATCH_TABLE; #pragma pack (pop) diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 0cb53f0a8a90..3067cf762e34 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -1735,6 +1735,10 @@ # @Prompt UFS device initial completion timoeout (us), default value is 600ms. gEfiMdeModulePkgTokenSpaceGuid.PcdUfsInitialCompletionTimeout|600000|UINT32|0x00000036 + ## Delayed Dispatch Max Entries + # @Prompt Maximum number of delayed dispatch entries. Default value is 8. + gEfiMdeModulePkgTokenSpaceGuid.PcdDelayedDispatchMaxEntries|8|UINT32|0x00000037 + [PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx] ## This PCD defines the Console output row. The default value is 25 according to UEFI spec. # This PCD could be set to 0 then console output would be at max column and max row. From 0053bbf833bb1612813a4af2ee653cd8b0ba4e19 Mon Sep 17 00:00:00 2001 From: Gao Qihang Date: Mon, 21 Jul 2025 11:12:04 +0800 Subject: [PATCH 0499/1172] MdeModulePkg/TerminalDxe: Add missing types for TestString function Add four newly added terminal types in TerminalConOutTestString, although this function is rarely used. This patch is a supplement to previous patch https://github.com/tianocore/edk2/commit/8a53ea9d9f40aad5504dc6080978a30b1b89ff3e. Signed-off-by: Gao Qihang --- MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c index 54539c329782..10d6695397b9 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c +++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c @@ -404,6 +404,10 @@ TerminalConOutTestString ( case TerminalTypeVt100: case TerminalTypeVt100Plus: case TerminalTypeTtyTerm: + case TerminalTypeLinux: + case TerminalTypeXtermR6: + case TerminalTypeVt400: + case TerminalTypeSCO: Status = AnsiTestString (TerminalDevice, WString); break; From ba41bd096af6fc1c7ad61f32359014bac85540ef Mon Sep 17 00:00:00 2001 From: Gao Qihang Date: Wed, 27 Aug 2025 14:48:24 +0800 Subject: [PATCH 0500/1172] MdeModulePkg/TerminalDxe: Improve the implementation of AnsiTestString Adjust AnsiTestString to be compatible with wide/narrow string in TerminalDxe driver. If WIDE_CHAR or NARROW_CHAR is hit, the string is still valid since OutputString function will correctly handle it. Signed-off-by: Gao Qihang --- MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c | 13 +++++++++---- .../Universal/Console/TerminalDxe/Terminal.h | 4 ++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c b/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c index 0acd8cfde26d..7ecbb666bacc 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c @@ -2,6 +2,7 @@ Implementation of translation upon PC ANSI. Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+Copyright (c) 2025, Loongson Technology Corporation Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -35,8 +36,8 @@ AnsiRawDataToUnicode ( } /** - Check if input string is valid Ascii string, valid EFI control characters - or valid text graphics. + Check if input string is valid Ascii string, valid EFI control characters, + wide/narrow character or valid text graphics. @param TerminalDevice The terminal device. @param WString The input string. @@ -54,10 +55,14 @@ AnsiTestString ( CHAR8 GraphicChar; // - // support three kind of character: - // valid ascii, valid efi control char, valid text graphics. + // support four kind of character: + // valid ascii, valid efi control char, wide/narrow char, valid text graphics. // for ( ; *WString != CHAR_NULL; WString++) { + if ((*WString == WIDE_CHAR) || (*WString == NARROW_CHAR)) { + continue; + } + if ( !(TerminalIsValidAscii (*WString) || TerminalIsValidEfiCntlChar (*WString) || TerminalIsValidTextGraphics (*WString, &GraphicChar, NULL))) diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h index 7a7aa5bb465c..f7806e64f743 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h @@ -1254,8 +1254,8 @@ UnicodeToEfiKey ( ); /** - Check if input string is valid Ascii string, valid EFI control characters - or valid text graphics. + Check if input string is valid Ascii string, valid EFI control characters, + wide/narrow character or valid text graphics. @param TerminalDevice The terminal device. @param WString The input string. From fb43f0c085045771bc2dee2f867d87298de2facb Mon Sep 17 00:00:00 2001 From: "INDIA\\kanagavels" Date: Fri, 19 Sep 2025 20:11:48 +0530 Subject: [PATCH 0501/1172] CryptoPkg: Add support to set TLS security level. Add Edkiicrypto protocol API to set TLS set security level. Signed-off-by: Kanagavel S --- CryptoPkg/Driver/Crypto.c | 27 ++++++++++++- CryptoPkg/Include/Library/TlsLib.h | 20 ++++++++++ .../Pcd/PcdCryptoServiceFamilyEnable.h | 1 + .../BaseCryptLibOnProtocolPpi/CryptLib.c | 24 +++++++++++ CryptoPkg/Library/TlsLib/InternalTlsLib.h | 10 +++++ CryptoPkg/Library/TlsLib/TlsConfig.c | 40 +++++++++++++++++++ CryptoPkg/Library/TlsLib/TlsInit.c | 2 +- CryptoPkg/Library/TlsLibNull/TlsConfigNull.c | 25 ++++++++++++ CryptoPkg/Private/Protocol/Crypto.h | 25 +++++++++++- 9 files changed, 170 insertions(+), 4 deletions(-) diff --git a/CryptoPkg/Driver/Crypto.c b/CryptoPkg/Driver/Crypto.c index e2c49f1399d1..f1cdb72cca13 100644 --- a/CryptoPkg/Driver/Crypto.c +++ b/CryptoPkg/Driver/Crypto.c @@ -5124,6 +5124,30 @@ CryptoServiceTlsSetServerName ( return CALL_BASECRYPTLIB (TlsSet.Services.ServerName, TlsSetServerName, (Tls, SslCtx, HostName), EFI_UNSUPPORTED); } +/** + Set the Tls security level. + + This function Set the Tls security level. + If Tls is NULL, nothing is done. + + @param[in] Tls Pointer to the TLS object. + @param[in] Level The Tls Security level need to set. + + @retval EFI_SUCCESS The Tls security level was set successfully. + @retval EFI_INVALID_PARAMETER The parameters are invalid. + @retval EFI_UNSUPPORTED The requested TLS set security level is not supported. + +**/ +EFI_STATUS +EFIAPI +CryptoServiceTlsSetSecurityLevel ( + IN VOID *Tls, + IN UINT8 Level + ) +{ + return CALL_BASECRYPTLIB (TlsSet.Services.SecurityLevel, TlsSetSecurityLevel, (Tls, Level), EFI_UNSUPPORTED); +} + /** Set the signature algorithm list to used by the TLS object. @@ -7137,6 +7161,7 @@ const EDKII_CRYPTO_PROTOCOL mEdkiiCrypto = { CryptoServicePkcs1v2Decrypt, CryptoServiceRsaOaepEncrypt, CryptoServiceRsaOaepDecrypt, - /// TLS Set (continued) + /// TLS Set (Continued) CryptoServiceTlsSetServerName, + CryptoServiceTlsSetSecurityLevel, }; diff --git a/CryptoPkg/Include/Library/TlsLib.h b/CryptoPkg/Include/Library/TlsLib.h index fab9b5bcdc20..abacbe7fc96e 100644 --- a/CryptoPkg/Include/Library/TlsLib.h +++ b/CryptoPkg/Include/Library/TlsLib.h @@ -644,6 +644,26 @@ TlsSetEcCurve ( IN UINTN DataSize ); +/** + Set the Tls security level. + + This function Set the Tls security level. + If Tls is NULL, nothing is done. + + @param[in] Tls Pointer to the TLS object. + @param[in] Level Tls Security level need to set. + + @retval EFI_SUCCESS The Tls security level was set successfully. + @retval EFI_INVALID_PARAMETER The parameters are invalid. + +**/ +EFI_STATUS +EFIAPI +TlsSetSecurityLevel ( + IN VOID *Tls, + IN UINT8 Level + ); + /** Gets the protocol version used by the specified TLS connection. diff --git a/CryptoPkg/Include/Pcd/PcdCryptoServiceFamilyEnable.h b/CryptoPkg/Include/Pcd/PcdCryptoServiceFamilyEnable.h index ad6a608131f5..5e9287188cb7 100644 --- a/CryptoPkg/Include/Pcd/PcdCryptoServiceFamilyEnable.h +++ b/CryptoPkg/Include/Pcd/PcdCryptoServiceFamilyEnable.h @@ -328,6 +328,7 @@ typedef struct { UINT8 SignatureAlgoList : 1; UINT8 EcCurve : 1; UINT8 ServerName : 1; + UINT8 SecurityLevel : 1; } Services; UINT32 Family; } TlsSet; diff --git a/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/CryptLib.c b/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/CryptLib.c index 28d60614e44c..5162cfd93231 100644 --- a/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/CryptLib.c +++ b/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/CryptLib.c @@ -4402,6 +4402,30 @@ TlsSetEcCurve ( CALL_CRYPTO_SERVICE (TlsSetSignatureAlgoList, (Tls, Data, DataSize), EFI_UNSUPPORTED); } +/** + Set the Tls security level. + + This function Set the Tls security level. + If Tls is NULL, nothing is done. + + @param[in] Tls Pointer to the TLS object. + @param[in] Level Tls Security level need to set. + + @retval EFI_SUCCESS The Tls security level was set successfully. + @retval EFI_INVALID_PARAMETER The parameters are invalid. + @retval EFI_UNSUPPORTED The requested TLS set security level is not supported. + +**/ +EFI_STATUS +EFIAPI +TlsSetSecurityLevel ( + IN VOID *Tls, + IN UINT8 Level + ) +{ + CALL_CRYPTO_SERVICE (TlsSetSecurityLevel, (Tls, Level), EFI_UNSUPPORTED); +} + /** Gets the protocol version used by the specified TLS connection. diff --git a/CryptoPkg/Library/TlsLib/InternalTlsLib.h b/CryptoPkg/Library/TlsLib/InternalTlsLib.h index aca226b5de7d..bdc41325d4bf 100644 --- a/CryptoPkg/Library/TlsLib/InternalTlsLib.h +++ b/CryptoPkg/Library/TlsLib/InternalTlsLib.h @@ -25,6 +25,16 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include +/// +/// TLS Minimum security level +#define MIN_SECURITY_LEVEL 2 +/// + +/// +/// TLS Maximum security level +#define MAX_SECURITY_LEVEL 5 +/// + typedef struct { // // Main SSL Connection which is created by a server or a client diff --git a/CryptoPkg/Library/TlsLib/TlsConfig.c b/CryptoPkg/Library/TlsLib/TlsConfig.c index ac1fe46070cc..9f92f6aba7ef 100644 --- a/CryptoPkg/Library/TlsLib/TlsConfig.c +++ b/CryptoPkg/Library/TlsLib/TlsConfig.c @@ -1191,6 +1191,46 @@ TlsSetEcCurve ( return EFI_SUCCESS; } +/** + Set the Tls security level. + + This function Set the Tls security level. + If Tls is NULL, nothing is done. + + @param[in] Tls Pointer to the TLS object. + @param[in] Level Tls Security level need to set. + + @retval EFI_SUCCESS The Tls security level was set successfully. + @retval EFI_INVALID_PARAMETER The parameters are invalid. + @retval EFI_UNSUPPORTED The requested TLS set security level is not supported. + +**/ +EFI_STATUS +EFIAPI +TlsSetSecurityLevel ( + IN VOID *Tls, + IN UINT8 Level + ) +{ + TLS_CONNECTION *TlsConn; + + TlsConn = (TLS_CONNECTION *)Tls; + + if ((TlsConn == NULL) || (TlsConn->Ssl == NULL)) { + return EFI_INVALID_PARAMETER; + } + + // Check if the security level is within the valid range (2 to 5). + // Return EFI_INVALID_PARAMETER if the level is out of bounds. + if ((Level < MIN_SECURITY_LEVEL) || (Level > MAX_SECURITY_LEVEL)) { + return EFI_INVALID_PARAMETER; + } + + SSL_set_security_level (TlsConn->Ssl, Level); + + return EFI_SUCCESS; +} + /** Gets the protocol version used by the specified TLS connection. diff --git a/CryptoPkg/Library/TlsLib/TlsInit.c b/CryptoPkg/Library/TlsLib/TlsInit.c index 6385f0c831ab..96634cffcc89 100644 --- a/CryptoPkg/Library/TlsLib/TlsInit.c +++ b/CryptoPkg/Library/TlsLib/TlsInit.c @@ -188,7 +188,7 @@ TlsNew ( // // This retains compatibility with previous version of OpenSSL. // - SSL_set_security_level (TlsConn->Ssl, 0); + SSL_set_security_level (TlsConn->Ssl, 3); // // Initialize the created SSL Object diff --git a/CryptoPkg/Library/TlsLibNull/TlsConfigNull.c b/CryptoPkg/Library/TlsLibNull/TlsConfigNull.c index cbf5ee7f4fae..d85a2d843970 100644 --- a/CryptoPkg/Library/TlsLibNull/TlsConfigNull.c +++ b/CryptoPkg/Library/TlsLibNull/TlsConfigNull.c @@ -400,6 +400,31 @@ TlsSetEcCurve ( return EFI_UNSUPPORTED; } +/** + Set the Tls security level. + + This function Set the Tls security level. + If Tls is NULL, nothing is done. + + @param[in] Tls Pointer to the TLS object. + @param[in] Level Tls Security level need to set. + + @retval EFI_SUCCESS The Tls security level was set successfully. + @retval EFI_INVALID_PARAMETER The parameters are invalid. + @retval EFI_UNSUPPORTED The requested TLS set security level is not supported. + +**/ +EFI_STATUS +EFIAPI +TlsSetSecurityLevel ( + IN VOID *Tls, + IN UINT8 Level + ) +{ + ASSERT (FALSE); + return EFI_UNSUPPORTED; +} + /** Gets the protocol version used by the specified TLS connection. diff --git a/CryptoPkg/Private/Protocol/Crypto.h b/CryptoPkg/Private/Protocol/Crypto.h index b3a55537e65f..7d3ff548d606 100644 --- a/CryptoPkg/Private/Protocol/Crypto.h +++ b/CryptoPkg/Private/Protocol/Crypto.h @@ -21,7 +21,7 @@ /// the EDK II Crypto Protocol is extended, this version define must be /// increased. /// -#define EDKII_CRYPTO_VERSION 18 +#define EDKII_CRYPTO_VERSION 19 /// /// EDK II Crypto Protocol forward declaration @@ -3969,6 +3969,26 @@ EFI_STATUS IN CHAR8 *HostName ); +/** + Set the Tls security level. + + This function Set the Tls security level. + If Tls is NULL, nothing is done. + + @param[in] Tls Pointer to the TLS object. + @param[in] Level The Tls Security level need to set. + + @retval EFI_SUCCESS The Tls security level was set successfully. + @retval EFI_INVALID_PARAMETER The parameters are invalid. + +**/ +typedef +EFI_STATUS +(EFIAPI *EDKII_CRYPTO_TLS_SET_SECURITY_LEVEL)( + IN VOID *Tls, + IN UINT8 Level + ); + /** Gets the protocol version used by the specified TLS connection. @@ -5728,8 +5748,9 @@ struct _EDKII_CRYPTO_PROTOCOL { EDKII_CRYPTO_PKCS1V2_DECRYPT Pkcs1v2Decrypt; EDKII_CRYPTO_RSA_OAEP_ENCRYPT RsaOaepEncrypt; EDKII_CRYPTO_RSA_OAEP_DECRYPT RsaOaepDecrypt; - /// TLS Set (continued) + /// TLS Set (Continued) EDKII_CRYPTO_TLS_SET_SERVER_NAME TlsSetServerName; + EDKII_CRYPTO_TLS_SET_SECURITY_LEVEL TlsSetSecurityLevel; }; extern GUID gEdkiiCryptoProtocolGuid; From 18d053d6828ca308824bd64ddea04de789d97edb Mon Sep 17 00:00:00 2001 From: Zhiguang Liu Date: Wed, 17 Sep 2025 17:39:00 +0800 Subject: [PATCH 0502/1172] IntelFsp2Pkg/FspSecCore: Reserve 32B when calling C function in 64bit After bootloader calls FSP API mode, I found the RDI register is changed in some cases. Below is the first line of function FspApiCallingCheck in assembly dump mov qword ptr [rsp+0x8],rbx We can see compiler will use rsp+0x8 for some purpose, while rsp+0x8 is used to save RDI by FSP in code before. According to the x86-64 calling convention, caller is responsible for allocating 32 bytes of "shadow space" on the stack right before calling the function (regardless of the actual number of parameters used). However FSP code doesn't reserve 32 bytes before calling FspApiCallingCheck C function in 64bit. The patch fixes it by reserving the 32 bytes before calling C routine. Also, make sure the stack is 16-byte alignment, sub 0x28 to RSP. Signed-off-by: Zhiguang Liu --- IntelFsp2Pkg/FspSecCore/X64/FspApiEntryCommon.nasm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/IntelFsp2Pkg/FspSecCore/X64/FspApiEntryCommon.nasm b/IntelFsp2Pkg/FspSecCore/X64/FspApiEntryCommon.nasm index dc6b8c99a1d2..bd7997c4683f 100644 --- a/IntelFsp2Pkg/FspSecCore/X64/FspApiEntryCommon.nasm +++ b/IntelFsp2Pkg/FspSecCore/X64/FspApiEntryCommon.nasm @@ -52,7 +52,9 @@ FspApiCommon1: PUSHA_64 mov rdx, rcx ; move ApiParam to rdx mov rcx, rax ; move ApiIdx to rcx + sub rsp, 0x28 call ASM_PFX(FspApiCallingCheck) + add rsp, 0x28 cmp rax, 0 jz FspApiCommon2 mov [rsp + STACK_SAVED_RAX_OFFSET], rax From 17691a2641c2715fc1196aa1b0fe85b85db6c240 Mon Sep 17 00:00:00 2001 From: Antaeus Kleinert-Strand Date: Thu, 18 Sep 2025 01:51:18 +0000 Subject: [PATCH 0503/1172] FmpDevicePkg/FmpDxe: Improve handling of XDR certs The current implementation for XDR certificate handling assumes the PublicKeyDataXdr buffer is 4-byte aligned. This is not always the case. For example, if PublicKeyDataXdr=0x02, and the length is 0x05, the correct offset should be 0x2 + align_up(0x5, 4) -> 0x2 + 0x8 = 0xA. The current logic produces align_up(0x2 + 0x5, 4) -> align_up(0x7, 4) = 0x8. Signed-off-by: Antaeus Kleinert-Strand --- FmpDevicePkg/FmpDxe/FmpDxe.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/FmpDevicePkg/FmpDxe/FmpDxe.c b/FmpDevicePkg/FmpDxe/FmpDxe.c index ae37d3f8c44d..3850e8a82972 100644 --- a/FmpDevicePkg/FmpDxe/FmpDxe.c +++ b/FmpDevicePkg/FmpDxe/FmpDxe.c @@ -923,8 +923,7 @@ CheckTheImageInternal ( break; } - PublicKeyDataXdr += PublicKeyDataLength; - PublicKeyDataXdr = (UINT8 *)ALIGN_POINTER (PublicKeyDataXdr, sizeof (UINT32)); + PublicKeyDataXdr += ALIGN_VALUE (PublicKeyDataLength, 4); } } From b15f98e68fb19c8b9ca5c895c175855023e33585 Mon Sep 17 00:00:00 2001 From: Stanislaw Grams Date: Wed, 17 Sep 2025 17:31:39 +0200 Subject: [PATCH 0504/1172] OvmfPkg/IntelTdx: Fix TDVF boot failure with odd-sized memory below 2816M TDVF boot in QEMU fails when the VMM is configured with odd memory sizes (in MB) below 2816M (e.g., 2815M, 2813M). This is due to the RAM split defined in pc_q35.c: when RAM exceeds 2816M, low memory is truncated to 2048M and the remainder is placed above the 4G boundary. This split causes failures only with odd sizes below 2816M. TDVF uses a default page size of 2M (hugepage), which leads to a corner case where the last 1M may not be accepted. To resolve this, on BSP, always accept any remaining memory using a 4K page size. Signed-off-by: Stanislaw Grams --- OvmfPkg/IntelTdx/TdxHelperLib/SecTdxHelper.c | 27 ++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/OvmfPkg/IntelTdx/TdxHelperLib/SecTdxHelper.c b/OvmfPkg/IntelTdx/TdxHelperLib/SecTdxHelper.c index 67fc8fe7f2bb..e430066549b6 100644 --- a/OvmfPkg/IntelTdx/TdxHelperLib/SecTdxHelper.c +++ b/OvmfPkg/IntelTdx/TdxHelperLib/SecTdxHelper.c @@ -179,12 +179,18 @@ BspApAcceptMemoryResourceRange ( UINT64 Stride; UINT64 AcceptPageSize; EFI_PHYSICAL_ADDRESS PhysicalAddress; + UINT64 TotalSize; + UINT64 ProcessedSize; + UINT64 RemainderSize; + UINT64 RemainderPages; + UINT64 RemainderStart; AcceptPageSize = (UINT64)(UINTN)FixedPcdGet32 (PcdTdxAcceptPageSize); Status = EFI_SUCCESS; Stride = (UINTN)CpusNum * ACCEPT_CHUNK_SIZE; PhysicalAddress = PhysicalStart + ACCEPT_CHUNK_SIZE * (UINTN)CpuIndex; + TotalSize = PhysicalEnd - PhysicalStart; while (!EFI_ERROR (Status) && PhysicalAddress < PhysicalEnd) { Pages = MIN (ACCEPT_CHUNK_SIZE, PhysicalEnd - PhysicalAddress) / AcceptPageSize; @@ -193,6 +199,27 @@ BspApAcceptMemoryResourceRange ( PhysicalAddress += Stride; } + if (CpuIndex == 0) { + ProcessedSize = (TotalSize / AcceptPageSize) * AcceptPageSize; + + RemainderStart = PhysicalStart + ProcessedSize; + RemainderSize = TotalSize % AcceptPageSize; + if (RemainderSize > 0) { + RemainderPages = RemainderSize / SIZE_4KB; + if (RemainderPages > 0) { + Status = TdAcceptPages ( + RemainderStart, + RemainderPages, + SIZE_4KB + ); + ASSERT (!EFI_ERROR (Status)); + if (EFI_ERROR (Status)) { + return Status; + } + } + } + } + return EFI_SUCCESS; } From 21eff866e7a8e7e9669ec3448a4a3f455a67f2f8 Mon Sep 17 00:00:00 2001 From: Phil Noh Date: Fri, 5 Sep 2025 15:11:15 -0500 Subject: [PATCH 0505/1172] SecurityPkg/Tpm2DeviceLibDTpm: Remove global variable for command code As a BASE type library, currently the TCG PEI driver, Tcg2Pei.inf links the library. On edk2-stable202508 version, it is found that the driver includes and updates the global variable of mLastCommandSent in debug build. Also found that the previous commit (460f270) for the library adds and uses the global variable. Updating the global variable in PEI drivers could affect the following issues. To address these issues, remove the global variable usage. PEI ROM Boot : Global variable is not updated PEI RAM Boot : PEI FV integration/security check is failed Signed-off-by: Phil Noh --- .../Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c | 13 +++++-------- SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c | 9 ++++++++- SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.h | 4 +++- SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Tis.c | 9 ++++++++- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c index 7b2e449130da..56a968429984 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpmDump.c @@ -218,8 +218,6 @@ TPM2_CODE_STRING ResponseCodeStrings[] = { }; UINTN ResponseCodeStringsCount = sizeof (ResponseCodeStrings) / sizeof (ResponseCodeStrings[0]); -UINT32 mLastCommandSent = 0; - /** This simple function will dump up to MAX_TPM_BUFFER_DUMP bytes of a TPM data buffer and apppend '...' if buffer is larger. @@ -678,9 +676,6 @@ DumpTpmInputBlock ( // If verbose, dump all of the buffer contents for deeper analysis. DumpTpmBuffer ("DATA: ", MIN (InputBlockSize, NativeSize), InputBlock); - // Update the last command sent so that response parsing can have some context. - mLastCommandSent = NativeCode; - return; } @@ -690,13 +685,15 @@ DumpTpmInputBlock ( @param[in] OutputBlockSize Size of the output buffer. @param[in] OutputBlock Pointer to the output buffer itself. + @param[in] CommandCode Command code for the input block. **/ VOID EFIAPI DumpTpmOutputBlock ( IN UINT32 OutputBlockSize, - IN CONST UINT8 *OutputBlock + IN CONST UINT8 *OutputBlock, + IN UINT32 CommandCode ) { CONST TPM2_RESPONSE_HEADER *RespHeader; @@ -716,8 +713,8 @@ DumpTpmOutputBlock ( DEBUG ((DEBUG_SECURITY, "Size: %d (0x%X)\n", NativeSize, NativeSize)); // Debug anything else based on the Command context. - if (mLastCommandSent != 0x00) { - switch (mLastCommandSent) { + if (CommandCode != 0x00) { + switch (CommandCode) { case TPM_CC_StartAuthSession: DumpTpmStartAuthSessionResponse (OutputBlockSize, OutputBlock); break; diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c index c11fe88ad560..87560b0164b2 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.c @@ -162,6 +162,7 @@ PtpCrbTpmCommand ( UINT16 Data16; UINT32 Data32; UINT8 RetryCnt; + UINT32 CommandCode; DEBUG_CODE_BEGIN (); DumpTpmInputBlock (SizeIn, BufferIn); @@ -336,7 +337,13 @@ PtpCrbTpmCommand ( } DEBUG_CODE_BEGIN (); - DumpTpmOutputBlock (TpmOutSize, BufferOut); + if (SizeIn >= sizeof (TPM2_COMMAND_HEADER)) { + CommandCode = SwapBytes32 (((TPM2_COMMAND_HEADER *)BufferIn)->commandCode); + } else { + CommandCode = 0; + } + + DumpTpmOutputBlock (TpmOutSize, BufferOut, CommandCode); DEBUG_CODE_END (); // diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.h b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.h index 8b7c37bb9bb7..706141404033 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.h +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Ptp.h @@ -73,12 +73,14 @@ DumpTpmInputBlock ( a response from the TPM for maximum user-readability. @param[in] OutputBlockSize Size of the output buffer. @param[in] OutputBlock Pointer to the output buffer itself. + @param[in] CommandCode Command code for the input block. **/ VOID EFIAPI DumpTpmOutputBlock ( IN UINT32 OutputBlockSize, - IN CONST UINT8 *OutputBlock + IN CONST UINT8 *OutputBlock, + IN UINT32 CommandCode ); #endif // TPM2_PTP_H_ diff --git a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Tis.c b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Tis.c index d2f0abd160ca..1e141c9272da 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Tis.c +++ b/SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2Tis.c @@ -223,6 +223,7 @@ Tpm2TisTpmCommand ( UINT32 TpmOutSize; UINT16 Data16; UINT32 Data32; + UINT32 CommandCode; DEBUG_CODE_BEGIN (); DumpTpmInputBlock (SizeIn, BufferIn); @@ -370,7 +371,13 @@ Tpm2TisTpmCommand ( Exit: DEBUG_CODE_BEGIN (); - DumpTpmOutputBlock (TpmOutSize, BufferOut); + if (SizeIn >= sizeof (TPM2_COMMAND_HEADER)) { + CommandCode = SwapBytes32 (((TPM2_COMMAND_HEADER *)BufferIn)->commandCode); + } else { + CommandCode = 0; + } + + DumpTpmOutputBlock (TpmOutSize, BufferOut, CommandCode); DEBUG_CODE_END (); MmioWrite8 ((UINTN)&TisReg->Status, TIS_PC_STS_READY); return Status; From 12797dd337418e9362afcd00344a542a381c8742 Mon Sep 17 00:00:00 2001 From: Nate DeSimone Date: Mon, 4 Aug 2025 17:24:10 -0700 Subject: [PATCH 0506/1172] BaseTools: Align Pre-Processor Macros for CLANGPDB and CLANGDWARF Update the CLANGPDB toolchain to define the __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__, and __MINGW32__ macros with values that match the pre-defined values seen when using the x86_64-unknown-windows-gnu target triple. This minimizes the differences in pre-processor macros between the CLANGPDB and CLANGDWARF targets. Signed-off-by: Nate DeSimone --- BaseTools/Conf/tools_def.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index 102b8d330de2..3f34349ddc57 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -1933,7 +1933,7 @@ DEFINE CLANGPDB_IA32_TARGET = -target i686-pc-windows-msvc DEFINE CLANGPDB_X64_TARGET = -target x86_64-pc-windows-msvc DEFINE CLANGPDB_WARNING_OVERRIDES = -Wno-parentheses-equality -Wno-tautological-compare -Wno-tautological-constant-out-of-range-compare -Wno-empty-body -Wno-unused-const-variable -Wno-varargs -Wno-unknown-warning-option -Wno-unused-but-set-variable -Wno-unused-const-variable -Wno-unaligned-access -Wno-microsoft-enum-forward-reference -DEFINE CLANGPDB_ALL_CC_FLAGS = DEF(GCC48_ALL_CC_FLAGS) DEF(CLANGPDB_WARNING_OVERRIDES) -fno-stack-protector -funsigned-char -ftrap-function=undefined_behavior_has_been_optimized_away_by_clang -Wno-address -Wno-shift-negative-value -Wno-unknown-pragmas -Wno-incompatible-library-redeclaration -Wno-null-dereference -mno-implicit-float -mms-bitfields -mno-stack-arg-probe -fno-omit-frame-pointer -U _MSC_VER -D __GNUC__ +DEFINE CLANGPDB_ALL_CC_FLAGS = DEF(GCC48_ALL_CC_FLAGS) DEF(CLANGPDB_WARNING_OVERRIDES) -fno-stack-protector -funsigned-char -ftrap-function=undefined_behavior_has_been_optimized_away_by_clang -Wno-address -Wno-shift-negative-value -Wno-unknown-pragmas -Wno-incompatible-library-redeclaration -Wno-null-dereference -mno-implicit-float -mms-bitfields -mno-stack-arg-probe -fno-omit-frame-pointer -U _MSC_VER -D __GNUC__=4 -D __GNUC_MINOR__=2 -D __GNUC_PATCHLEVEL__=1 -D __MINGW32__=1 ########################### # CLANGPDB IA32 definitions From f451d187c3a4544f8c4a378f0dc6af2fdd8059b8 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Thu, 18 Sep 2025 16:26:51 -0700 Subject: [PATCH 0507/1172] ShellPkg: AcpiView: Fix CodeQL Error When removing ARM32 code from edk2, a CodeQL error in AcpiView (pointer used without null check) was flagged in GH. This updates the code to eliminate the duplicate code in that function and instead call EfiGetSystemConfigurationTable. Signed-off-by: Oliver Smith-Denny --- .../UefiShellAcpiViewCommandLib/AcpiView.c | 112 +++++++----------- 1 file changed, 46 insertions(+), 66 deletions(-) diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiView.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiView.c index 9cdfcb3fae2a..faac3ac138ae 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiView.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiView.c @@ -192,25 +192,16 @@ AcpiView ( IN EFI_SYSTEM_TABLE *SystemTable ) { - EFI_STATUS Status; - UINTN Index; - EFI_CONFIGURATION_TABLE *EfiConfigurationTable; - BOOLEAN FoundAcpiTable; - UINTN OriginalAttribute; - UINTN PrintAttribute; - EREPORT_OPTION ReportOption; - UINT8 *RsdpPtr; - UINT32 RsdpLength; - UINT8 RsdpRevision; - PARSE_ACPI_TABLE_PROC RsdpParserProc; - BOOLEAN Trace; - SELECTED_ACPI_TABLE *SelectedTable; - - // - // set local variables to suppress incorrect compiler/analyzer warnings - // - EfiConfigurationTable = NULL; - OriginalAttribute = 0; + EFI_STATUS Status; + UINTN OriginalAttribute; + UINTN PrintAttribute; + EREPORT_OPTION ReportOption; + UINT8 *RsdpPtr; + UINT32 RsdpLength; + UINT8 RsdpRevision; + PARSE_ACPI_TABLE_PROC RsdpParserProc; + BOOLEAN Trace; + SELECTED_ACPI_TABLE *SelectedTable; // Reset Table counts mTableCount = 0; @@ -223,67 +214,56 @@ AcpiView ( // Retrieve the user selection of ACPI table to process GetSelectedAcpiTable (&SelectedTable); - // Search the table for an entry that matches the ACPI Table Guid - FoundAcpiTable = FALSE; - for (Index = 0; Index < SystemTable->NumberOfTableEntries; Index++) { - if (CompareGuid ( - &gEfiAcpiTableGuid, - &(SystemTable->ConfigurationTable[Index].VendorGuid) - )) - { - EfiConfigurationTable = &SystemTable->ConfigurationTable[Index]; - FoundAcpiTable = TRUE; - break; - } - } + Status = EfiGetSystemConfigurationTable ( + &gEfiAcpiTableGuid, + (VOID **)&RsdpPtr + ); - if (FoundAcpiTable) { - RsdpPtr = (UINT8 *)EfiConfigurationTable->VendorTable; + if (EFI_ERROR (Status)) { + IncrementErrorCount (); + Print ( + L"ERROR: Failed to find ACPI Table Guid in System Configuration Table.\n" + ); + return EFI_NOT_FOUND; + } - // The RSDP revision is 1 byte starting at offset 15 - RsdpRevision = *(RsdpPtr + RSDP_REVISION_OFFSET); + // The RSDP revision is 1 byte starting at offset 15 + RsdpRevision = *(RsdpPtr + RSDP_REVISION_OFFSET); - if (RsdpRevision < 2) { - Print ( - L"ERROR: RSDP version less than 2 is not supported.\n" - ); - return EFI_UNSUPPORTED; - } + if (RsdpRevision < 2) { + Print ( + L"ERROR: RSDP version less than 2 is not supported.\n" + ); + return EFI_UNSUPPORTED; + } #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) - if (GetMandatoryTableValidate ()) { - ArmSbbrResetTableCounts (); - } + if (GetMandatoryTableValidate ()) { + ArmSbbrResetTableCounts (); + } #endif - // The RSDP length is 4 bytes starting at offset 20 - RsdpLength = *(UINT32 *)(RsdpPtr + RSDP_LENGTH_OFFSET); + // The RSDP length is 4 bytes starting at offset 20 + RsdpLength = *(UINT32 *)(RsdpPtr + RSDP_LENGTH_OFFSET); - Trace = ProcessTableReportOptions (RSDP_TABLE_INFO, RsdpPtr, RsdpLength); - - Status = GetParser (RSDP_TABLE_INFO, &RsdpParserProc); - if (EFI_ERROR (Status)) { - Print ( - L"ERROR: No registered parser found for RSDP.\n" - ); - return Status; - } + Trace = ProcessTableReportOptions (RSDP_TABLE_INFO, RsdpPtr, RsdpLength); - RsdpParserProc ( - Trace, - RsdpPtr, - RsdpLength, - RsdpRevision - ); - } else { - IncrementErrorCount (); + Status = GetParser (RSDP_TABLE_INFO, &RsdpParserProc); + if (EFI_ERROR (Status)) { Print ( - L"ERROR: Failed to find ACPI Table Guid in System Configuration Table.\n" + L"ERROR: No registered parser found for RSDP.\n" ); - return EFI_NOT_FOUND; + return Status; } + RsdpParserProc ( + Trace, + RsdpPtr, + RsdpLength, + RsdpRevision + ); + #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) if (GetMandatoryTableValidate ()) { ArmSbbrReqsValidate ((ARM_SBBR_VERSION)GetMandatoryTableSpec ()); From 215e45bdb35c19e47be13364dafc823ab6c09768 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Sun, 14 Sep 2025 21:11:10 -0700 Subject: [PATCH 0508/1172] .azurepipelines,.github,.pytool: Disable ARM32 at Top Level/Pipelines edk2 is dropping support for the ARM32 architecture. As such, this commit drops ARM32 from running in CI and removes the references to it in the readme and Maintainers.txt. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Oliver Smith-Denny --- .azurepipelines/Ubuntu-GCC.yml | 2 +- .github/workflows/codeql.yml | 2 +- .pytool/CISettings.py | 1 - .../HostUnitTestCompilerPlugin.py | 2 -- .pytool/Readme.md | 4 ++-- Maintainers.txt | 7 ++----- ReadMe.rst | 1 - 7 files changed, 6 insertions(+), 13 deletions(-) diff --git a/.azurepipelines/Ubuntu-GCC.yml b/.azurepipelines/Ubuntu-GCC.yml index 99fb247187a2..ff0dfedce622 100644 --- a/.azurepipelines/Ubuntu-GCC.yml +++ b/.azurepipelines/Ubuntu-GCC.yml @@ -22,5 +22,5 @@ jobs: tool_chain_tag: 'GCC5' vm_image: 'ubuntu-24.04' container: ${{ variables.default_linux_image }} - arch_list: "IA32,X64,ARM,AARCH64,RISCV64,LOONGARCH64" + arch_list: "IA32,X64,AARCH64,RISCV64,LOONGARCH64" usePythonVersion: '' # use Python from the container image diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index c22fa8dd61f2..348a8637f28d 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -277,7 +277,7 @@ jobs: import shutil from pathlib import Path - dirs_to_delete = ['ia32', 'x64', 'arm', 'aarch64'] + dirs_to_delete = ['ia32', 'x64', 'aarch64'] def delete_dirs(path: Path): if path.exists() and path.is_dir(): diff --git a/.pytool/CISettings.py b/.pytool/CISettings.py index 46f61db284cf..e3904a62d2c4 100644 --- a/.pytool/CISettings.py +++ b/.pytool/CISettings.py @@ -98,7 +98,6 @@ def GetArchitecturesSupported(self): return ( "IA32", "X64", - "ARM", "AARCH64", "RISCV64", "LOONGARCH64") diff --git a/.pytool/Plugin/HostUnitTestCompilerPlugin/HostUnitTestCompilerPlugin.py b/.pytool/Plugin/HostUnitTestCompilerPlugin/HostUnitTestCompilerPlugin.py index 76e3392ba179..a4e8e2d6d2ba 100644 --- a/.pytool/Plugin/HostUnitTestCompilerPlugin/HostUnitTestCompilerPlugin.py +++ b/.pytool/Plugin/HostUnitTestCompilerPlugin/HostUnitTestCompilerPlugin.py @@ -65,8 +65,6 @@ def __GetHostUnitTestArch(self, environment): elif GetHostInfo().arch == 'ARM': if GetHostInfo().bit == '64': host.append("AARCH64") - elif GetHostInfo().bit == '32': - host.append("ARM") willrun = set(requested) & set(host) return (len(willrun), " ".join(willrun)) diff --git a/.pytool/Readme.md b/.pytool/Readme.md index d14754927054..e74e50221388 100644 --- a/.pytool/Readme.md +++ b/.pytool/Readme.md @@ -9,7 +9,7 @@ on the TianoCore wiki. ## Basic Status -| Package | Windows VS2022 (IA32/X64)| Ubuntu GCC (IA32/X64/ARM/AARCH64) | Known Issues | +| Package | Windows VS2022 (IA32/X64)| Ubuntu GCC (IA32/X64/AARCH64) | Known Issues | | :---- | :----- | :---- | :--- | | ArmPkg | | :heavy_check_mark: | | ArmPlatformPkg | | :heavy_check_mark: | @@ -272,7 +272,7 @@ few standard scopes. * PatchCheck tests as plugins * MacOS/xcode support * Clang/LLVM support -* Visual Studio AARCH64 and ARM support +* Visual Studio AARCH64 support * BaseTools C tools CI/PR and binary release process * BaseTools Python tools CI/PR process * Extensible private/closed source platform reporting diff --git a/Maintainers.txt b/Maintainers.txt index 0541e1088624..9a7dc0d2ae55 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -83,13 +83,10 @@ M: Liming Gao [lgao4] EDK II Architectures: --------------------- -ARM, AARCH64 +AARCH64 F: MdeModulePkg/*/AArch64/ -F: MdeModulePkg/*/Arm/ F: MdePkg/*/AArch64/ -F: MdePkg/*/Arm/ F: UefiCpuPkg/*/AArch64/ -F: UefiCpuPkg/*/Arm/ M: Leif Lindholm [leiflindholm] M: Ard Biesheuvel [ardbiesheuvel] M: Sami Mujawar [samimujawar] @@ -451,7 +448,7 @@ F: MdePkg/Include/IndustryStandard/SpiNorFlashJedecSfdp.h M: Abner Chang [changab] R: Brit Chesley [BritChesley] -MdePkg: ARM/AARCH64 standard interfaces +MdePkg: AARCH64 standard interfaces F: MdePkg/Include/Library/ArmLib.h M: Leif Lindholm [leiflindholm] M: Ard Biesheuvel [ardbiesheuvel] diff --git a/ReadMe.rst b/ReadMe.rst index ecde5cc2eb03..a694bc9a796d 100644 --- a/ReadMe.rst +++ b/ReadMe.rst @@ -50,7 +50,6 @@ Ubuntu 24.04 Toolchain CONFIG DEBUG RELEASE NOOPT ============================= ================= ============= ============= ============== ArmVirtPkg_Ubuntu_GCC_ | AARCH64 |avAArch64du| |avAArch64ru| |avAArch64nu| -| | ARM |avArmdu| |avArmru| |avArmnu| EmulatorPkg_Ubuntu_GCC_ | IA32 **N/A** **N/A** **N/A** | | X64 |em64du| |em64ru| |em64nu| | | IA32 FULL **N/A** **N/A** **N/A** From 08c27faeed02efaae7a63d1b75d85b8aae11d3c0 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 22 Sep 2025 10:41:08 -0700 Subject: [PATCH 0509/1172] UefiCpuPkg: Drop ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from UefiCpuPkg. It drops irrelevant VALID_ARCHITECTURES fields from infs that are not arch specific. Signed-off-by: Oliver Smith-Denny --- UefiCpuPkg/CpuMmio2Dxe/CpuMmio2Dxe.inf | 6 - .../Library/ArmMmuLib/Arm/ArmMmuLibConvert.c | 32 - .../Library/ArmMmuLib/Arm/ArmMmuLibCore.c | 376 ------------ .../Library/ArmMmuLib/Arm/ArmMmuLibUpdate.c | 561 ------------------ .../ArmMmuLib/Arm/ArmMmuLibV7Support.S | 29 - .../Library/ArmMmuLib/ArmMmuBaseLib.inf | 9 - UefiCpuPkg/UefiCpuPkg.dec | 4 +- UefiCpuPkg/UefiCpuPkg.dsc | 4 +- 8 files changed, 3 insertions(+), 1018 deletions(-) delete mode 100644 UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibConvert.c delete mode 100644 UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c delete mode 100644 UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibUpdate.c delete mode 100644 UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibV7Support.S diff --git a/UefiCpuPkg/CpuMmio2Dxe/CpuMmio2Dxe.inf b/UefiCpuPkg/CpuMmio2Dxe/CpuMmio2Dxe.inf index 32577be7ea25..b6818bd3e257 100644 --- a/UefiCpuPkg/CpuMmio2Dxe/CpuMmio2Dxe.inf +++ b/UefiCpuPkg/CpuMmio2Dxe/CpuMmio2Dxe.inf @@ -18,12 +18,6 @@ VERSION_STRING = 1.0 ENTRY_POINT = CpuMmio2Initialize -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = ARM AARCH64 LOONGARCH64 RISCV64 -# - [Sources] CpuMmio2Dxe.c diff --git a/UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibConvert.c b/UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibConvert.c deleted file mode 100644 index bf3a874822ac..000000000000 --- a/UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibConvert.c +++ /dev/null @@ -1,32 +0,0 @@ -/** @file -* File managing the MMU for ARMv7 architecture -* -* Copyright (c) 2011-2016, ARM Limited. All rights reserved. -* -* SPDX-License-Identifier: BSD-2-Clause-Patent -* -**/ - -#include - -#include - -#include - -UINT32 -ConvertSectionAttributesToPageAttributes ( - IN UINT32 SectionAttributes - ) -{ - UINT32 PageAttributes; - - PageAttributes = 0; - PageAttributes |= TT_DESCRIPTOR_CONVERT_TO_PAGE_CACHE_POLICY (SectionAttributes); - PageAttributes |= TT_DESCRIPTOR_CONVERT_TO_PAGE_AP (SectionAttributes); - PageAttributes |= TT_DESCRIPTOR_CONVERT_TO_PAGE_AF (SectionAttributes); - PageAttributes |= TT_DESCRIPTOR_CONVERT_TO_PAGE_XN (SectionAttributes); - PageAttributes |= TT_DESCRIPTOR_CONVERT_TO_PAGE_NG (SectionAttributes); - PageAttributes |= TT_DESCRIPTOR_CONVERT_TO_PAGE_S (SectionAttributes); - - return PageAttributes; -} diff --git a/UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c b/UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c deleted file mode 100644 index 643541dcb6d8..000000000000 --- a/UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c +++ /dev/null @@ -1,376 +0,0 @@ -/** @file -* File managing the MMU for ARMv7 architecture -* -* Copyright (c) 2011-2016, ARM Limited. All rights reserved. -* -* SPDX-License-Identifier: BSD-2-Clause-Patent -* -**/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define ID_MMFR0_SHARELVL_SHIFT 12 -#define ID_MMFR0_SHARELVL_MASK 0xf -#define ID_MMFR0_SHARELVL_ONE 0 -#define ID_MMFR0_SHARELVL_TWO 1 - -#define ID_MMFR0_INNERSHR_SHIFT 28 -#define ID_MMFR0_INNERSHR_MASK 0xf -#define ID_MMFR0_OUTERSHR_SHIFT 8 -#define ID_MMFR0_OUTERSHR_MASK 0xf - -#define ID_MMFR0_SHR_IMP_UNCACHED 0 -#define ID_MMFR0_SHR_IMP_HW_COHERENT 1 -#define ID_MMFR0_SHR_IGNORED 0xf - -UINTN -EFIAPI -ArmReadIdMmfr0 ( - VOID - ); - -BOOLEAN -EFIAPI -ArmHasMpExtensions ( - VOID - ); - -STATIC -VOID -PopulateLevel2PageTable ( - IN UINT32 *SectionEntry, - IN UINT32 PhysicalBase, - IN UINT32 RemainLength, - IN ARM_MEMORY_REGION_ATTRIBUTES Attributes - ) -{ - UINT32 *PageEntry; - UINT32 Pages; - UINT32 Index; - UINT32 PageAttributes; - UINT32 SectionDescriptor; - UINT32 TranslationTable; - UINT32 BaseSectionAddress; - UINT32 FirstPageOffset; - - switch (Attributes) { - case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK: - PageAttributes = TT_DESCRIPTOR_PAGE_WRITE_BACK; - break; - case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK_NONSHAREABLE: - PageAttributes = TT_DESCRIPTOR_PAGE_WRITE_BACK; - PageAttributes &= ~TT_DESCRIPTOR_PAGE_S_SHARED; - break; - case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK_RO: - PageAttributes = TT_DESCRIPTOR_PAGE_WRITE_BACK; - PageAttributes |= TT_DESCRIPTOR_PAGE_AP_NO_RO; - break; - case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK_XP: - PageAttributes = TT_DESCRIPTOR_PAGE_WRITE_BACK; - PageAttributes |= TT_DESCRIPTOR_PAGE_XN_MASK; - break; - case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH: - PageAttributes = TT_DESCRIPTOR_PAGE_WRITE_THROUGH; - break; - case ARM_MEMORY_REGION_ATTRIBUTE_DEVICE: - PageAttributes = TT_DESCRIPTOR_PAGE_DEVICE; - break; - case ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED: - PageAttributes = TT_DESCRIPTOR_PAGE_UNCACHED; - break; - default: - PageAttributes = TT_DESCRIPTOR_PAGE_UNCACHED; - break; - } - - // Check if the Section Entry has already been populated. Otherwise attach a - // Level 2 Translation Table to it - if (*SectionEntry != 0) { - // The entry must be a page table. Otherwise it exists an overlapping in the memory map - if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE (*SectionEntry)) { - TranslationTable = *SectionEntry & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK; - } else if ((*SectionEntry & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) { - // Case where a virtual memory map descriptor overlapped a section entry - - // Allocate a Level2 Page Table for this Section - TranslationTable = (UINTN)AllocateAlignedPages ( - EFI_SIZE_TO_PAGES (TRANSLATION_TABLE_PAGE_SIZE), - TRANSLATION_TABLE_PAGE_ALIGNMENT - ); - - // Translate the Section Descriptor into Page Descriptor - SectionDescriptor = TT_DESCRIPTOR_PAGE_TYPE_PAGE | ConvertSectionAttributesToPageAttributes (*SectionEntry); - - BaseSectionAddress = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (*SectionEntry); - - // - // Make sure we are not inadvertently hitting in the caches - // when populating the page tables - // - InvalidateDataCacheRange ( - (VOID *)TranslationTable, - TRANSLATION_TABLE_PAGE_SIZE - ); - - // Populate the new Level2 Page Table for the section - PageEntry = (UINT32 *)TranslationTable; - for (Index = 0; Index < TRANSLATION_TABLE_PAGE_COUNT; Index++) { - PageEntry[Index] = TT_DESCRIPTOR_PAGE_BASE_ADDRESS (BaseSectionAddress + (Index << 12)) | SectionDescriptor; - } - - // Overwrite the section entry to point to the new Level2 Translation Table - *SectionEntry = (TranslationTable & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK) | - TT_DESCRIPTOR_SECTION_TYPE_PAGE_TABLE; - } else { - // We do not support the other section type (16MB Section) - ASSERT (0); - return; - } - } else { - TranslationTable = (UINTN)AllocateAlignedPages ( - EFI_SIZE_TO_PAGES (TRANSLATION_TABLE_PAGE_SIZE), - TRANSLATION_TABLE_PAGE_ALIGNMENT - ); - // - // Make sure we are not inadvertently hitting in the caches - // when populating the page tables - // - InvalidateDataCacheRange ( - (VOID *)TranslationTable, - TRANSLATION_TABLE_PAGE_SIZE - ); - ZeroMem ((VOID *)TranslationTable, TRANSLATION_TABLE_PAGE_SIZE); - - *SectionEntry = (TranslationTable & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK) | - TT_DESCRIPTOR_SECTION_TYPE_PAGE_TABLE; - } - - FirstPageOffset = (PhysicalBase & TT_DESCRIPTOR_PAGE_INDEX_MASK) >> TT_DESCRIPTOR_PAGE_BASE_SHIFT; - PageEntry = (UINT32 *)TranslationTable + FirstPageOffset; - Pages = RemainLength / TT_DESCRIPTOR_PAGE_SIZE; - - ASSERT (FirstPageOffset + Pages <= TRANSLATION_TABLE_PAGE_COUNT); - - for (Index = 0; Index < Pages; Index++) { - *PageEntry++ = TT_DESCRIPTOR_PAGE_BASE_ADDRESS (PhysicalBase) | PageAttributes; - PhysicalBase += TT_DESCRIPTOR_PAGE_SIZE; - } - - // - // Invalidate again to ensure that any line fetches that may have occurred - // [speculatively] since the previous invalidate are evicted again. - // - ArmDataMemoryBarrier (); - InvalidateDataCacheRange ( - (UINT32 *)TranslationTable + FirstPageOffset, - RemainLength / TT_DESCRIPTOR_PAGE_SIZE * sizeof (*PageEntry) - ); -} - -STATIC -VOID -FillTranslationTable ( - IN UINT32 *TranslationTable, - IN ARM_MEMORY_REGION_DESCRIPTOR *MemoryRegion - ) -{ - UINT32 *SectionEntry; - UINT32 Attributes; - UINT32 PhysicalBase; - UINT64 RemainLength; - UINT32 PageMapLength; - - ASSERT (MemoryRegion->Length > 0); - - if (MemoryRegion->PhysicalBase >= SIZE_4GB) { - return; - } - - PhysicalBase = (UINT32)MemoryRegion->PhysicalBase; - RemainLength = MIN (MemoryRegion->Length, SIZE_4GB - PhysicalBase); - - switch (MemoryRegion->Attributes) { - case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK: - Attributes = TT_DESCRIPTOR_SECTION_WRITE_BACK; - break; - case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK_NONSHAREABLE: - Attributes = TT_DESCRIPTOR_SECTION_WRITE_BACK; - Attributes &= ~TT_DESCRIPTOR_SECTION_S_SHARED; - break; - case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK_RO: - Attributes = TT_DESCRIPTOR_SECTION_WRITE_BACK; - Attributes |= TT_DESCRIPTOR_SECTION_AP_NO_RO; - break; - case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK_XP: - Attributes = TT_DESCRIPTOR_SECTION_WRITE_BACK; - Attributes |= TT_DESCRIPTOR_SECTION_XN_MASK; - break; - case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH: - Attributes = TT_DESCRIPTOR_SECTION_WRITE_THROUGH; - break; - case ARM_MEMORY_REGION_ATTRIBUTE_DEVICE: - Attributes = TT_DESCRIPTOR_SECTION_DEVICE; - break; - case ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED: - Attributes = TT_DESCRIPTOR_SECTION_UNCACHED; - break; - default: - Attributes = TT_DESCRIPTOR_SECTION_UNCACHED; - break; - } - - // Get the first section entry for this mapping - SectionEntry = TRANSLATION_TABLE_ENTRY_FOR_VIRTUAL_ADDRESS (TranslationTable, MemoryRegion->VirtualBase); - - while (RemainLength != 0) { - if ((PhysicalBase % TT_DESCRIPTOR_SECTION_SIZE == 0) && - (RemainLength >= TT_DESCRIPTOR_SECTION_SIZE)) - { - // Case: Physical address aligned on the Section Size (1MB) && the length - // is greater than the Section Size - *SectionEntry = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (PhysicalBase) | Attributes; - - // - // Issue a DMB to ensure that the page table entry update made it to - // memory before we issue the invalidate, otherwise, a subsequent - // speculative fetch could observe the old value. - // - ArmDataMemoryBarrier (); - ArmInvalidateDataCacheEntryByMVA ((UINTN)SectionEntry++); - - PhysicalBase += TT_DESCRIPTOR_SECTION_SIZE; - RemainLength -= TT_DESCRIPTOR_SECTION_SIZE; - } else { - PageMapLength = MIN ( - (UINT32)RemainLength, - TT_DESCRIPTOR_SECTION_SIZE - - (PhysicalBase % TT_DESCRIPTOR_SECTION_SIZE) - ); - - // Case: Physical address aligned on the Section Size (1MB) && the length - // does not fill a section - // Case: Physical address NOT aligned on the Section Size (1MB) - PopulateLevel2PageTable ( - SectionEntry, - PhysicalBase, - PageMapLength, - MemoryRegion->Attributes - ); - - // - // Issue a DMB to ensure that the page table entry update made it to - // memory before we issue the invalidate, otherwise, a subsequent - // speculative fetch could observe the old value. - // - ArmDataMemoryBarrier (); - ArmInvalidateDataCacheEntryByMVA ((UINTN)SectionEntry++); - - // If it is the last entry - if (RemainLength < TT_DESCRIPTOR_SECTION_SIZE) { - break; - } - - PhysicalBase += PageMapLength; - RemainLength -= PageMapLength; - } - } -} - -RETURN_STATUS -EFIAPI -ArmConfigureMmu ( - IN ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable, - OUT VOID **TranslationTableBase OPTIONAL, - OUT UINTN *TranslationTableSize OPTIONAL - ) -{ - VOID *TranslationTable; - UINT32 TTBRAttributes; - - TranslationTable = AllocateAlignedPages ( - EFI_SIZE_TO_PAGES (TRANSLATION_TABLE_SECTION_SIZE), - TRANSLATION_TABLE_SECTION_ALIGNMENT - ); - if (TranslationTable == NULL) { - return RETURN_OUT_OF_RESOURCES; - } - - if (TranslationTableBase != NULL) { - *TranslationTableBase = TranslationTable; - } - - if (TranslationTableSize != NULL) { - *TranslationTableSize = TRANSLATION_TABLE_SECTION_SIZE; - } - - // - // Make sure we are not inadvertently hitting in the caches - // when populating the page tables - // - InvalidateDataCacheRange (TranslationTable, TRANSLATION_TABLE_SECTION_SIZE); - ZeroMem (TranslationTable, TRANSLATION_TABLE_SECTION_SIZE); - - while (MemoryTable->Length != 0) { - FillTranslationTable (TranslationTable, MemoryTable); - MemoryTable++; - } - - TTBRAttributes = ArmHasMpExtensions () ? TTBR_MP_WRITE_BACK_ALLOC - : TTBR_WRITE_BACK_ALLOC; - - // - // Unlike the S bit in the short descriptors, which implies inner shareable - // on an implementation that supports two levels, the meaning of the S bit - // in the TTBR depends on the NOS bit, which defaults to Outer Shareable. - // However, we should only set this bit after we have confirmed that the - // implementation supports multiple levels, or else the NOS bit is UNK/SBZP - // - if (((ArmReadIdMmfr0 () >> 12) & 0xf) != 0) { - TTBRAttributes |= TTBR_NOT_OUTER_SHAREABLE; - } - - ArmSetTTBR0 ((VOID *)((UINTN)TranslationTable | TTBRAttributes)); - - // - // The TTBCR register value is undefined at reset in the Non-Secure world. - // Writing 0 has the effect of: - // Clearing EAE: Use short descriptors, as mandated by specification. - // Clearing PD0 and PD1: Translation Table Walk Disable is off. - // Clearing N: Perform all translation table walks through TTBR0. - // (0 is the default reset value in systems not implementing - // the Security Extensions.) - // - ArmSetTTBCR (0); - - ArmSetDomainAccessControl ( - DOMAIN_ACCESS_CONTROL_NONE (15) | - DOMAIN_ACCESS_CONTROL_NONE (14) | - DOMAIN_ACCESS_CONTROL_NONE (13) | - DOMAIN_ACCESS_CONTROL_NONE (12) | - DOMAIN_ACCESS_CONTROL_NONE (11) | - DOMAIN_ACCESS_CONTROL_NONE (10) | - DOMAIN_ACCESS_CONTROL_NONE (9) | - DOMAIN_ACCESS_CONTROL_NONE (8) | - DOMAIN_ACCESS_CONTROL_NONE (7) | - DOMAIN_ACCESS_CONTROL_NONE (6) | - DOMAIN_ACCESS_CONTROL_NONE (5) | - DOMAIN_ACCESS_CONTROL_NONE (4) | - DOMAIN_ACCESS_CONTROL_NONE (3) | - DOMAIN_ACCESS_CONTROL_NONE (2) | - DOMAIN_ACCESS_CONTROL_NONE (1) | - DOMAIN_ACCESS_CONTROL_CLIENT (0) - ); - - ArmEnableInstructionCache (); - ArmEnableDataCache (); - ArmEnableMmu (); - return RETURN_SUCCESS; -} diff --git a/UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibUpdate.c b/UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibUpdate.c deleted file mode 100644 index b8b8a7016d71..000000000000 --- a/UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibUpdate.c +++ /dev/null @@ -1,561 +0,0 @@ -/** @file -* File managing the MMU for ARMv7 architecture -* -* Copyright (c) 2011-2021, Arm Limited. All rights reserved.
-* -* SPDX-License-Identifier: BSD-2-Clause-Patent -* -**/ - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -#define __EFI_MEMORY_RWX 0 // no restrictions - -#define CACHE_ATTRIBUTE_MASK (EFI_MEMORY_UC | \ - EFI_MEMORY_WC | \ - EFI_MEMORY_WT | \ - EFI_MEMORY_WB | \ - EFI_MEMORY_UCE | \ - EFI_MEMORY_WP) - -STATIC -EFI_STATUS -ConvertSectionToPages ( - IN EFI_PHYSICAL_ADDRESS BaseAddress - ) -{ - UINT32 FirstLevelIdx; - UINT32 SectionDescriptor; - UINT32 PageTableDescriptor; - UINT32 PageDescriptor; - UINT32 Index; - - volatile ARM_FIRST_LEVEL_DESCRIPTOR *FirstLevelTable; - volatile ARM_PAGE_TABLE_ENTRY *PageTable; - - DEBUG ((DEBUG_PAGE, "Converting section at 0x%x to pages\n", (UINTN)BaseAddress)); - - // Obtain page table base - FirstLevelTable = (ARM_FIRST_LEVEL_DESCRIPTOR *)ArmGetTTBR0BaseAddress (); - - // Calculate index into first level translation table for start of modification - FirstLevelIdx = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (BaseAddress) >> TT_DESCRIPTOR_SECTION_BASE_SHIFT; - ASSERT (FirstLevelIdx < TRANSLATION_TABLE_SECTION_COUNT); - - // Get section attributes and convert to page attributes - SectionDescriptor = FirstLevelTable[FirstLevelIdx]; - PageDescriptor = TT_DESCRIPTOR_PAGE_TYPE_PAGE | ConvertSectionAttributesToPageAttributes (SectionDescriptor); - - // Allocate a page table for the 4KB entries (we use up a full page even though we only need 1KB) - PageTable = (volatile ARM_PAGE_TABLE_ENTRY *)AllocatePages (1); - if (PageTable == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - // Write the page table entries out - for (Index = 0; Index < TRANSLATION_TABLE_PAGE_COUNT; Index++) { - PageTable[Index] = TT_DESCRIPTOR_PAGE_BASE_ADDRESS (BaseAddress + (Index << 12)) | PageDescriptor; - } - - // Formulate page table entry, Domain=0, NS=0 - PageTableDescriptor = (((UINTN)PageTable) & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK) | TT_DESCRIPTOR_SECTION_TYPE_PAGE_TABLE; - - // Write the page table entry out, replacing section entry - FirstLevelTable[FirstLevelIdx] = PageTableDescriptor; - - return EFI_SUCCESS; -} - -STATIC -EFI_STATUS -UpdatePageEntries ( - IN EFI_PHYSICAL_ADDRESS BaseAddress, - IN UINT64 Length, - IN UINT64 Attributes, - IN UINT32 EntryMask, - OUT BOOLEAN *FlushTlbs OPTIONAL - ) -{ - EFI_STATUS Status; - UINT32 EntryValue; - UINT32 FirstLevelIdx; - UINT32 Offset; - UINT32 NumPageEntries; - UINT32 Descriptor; - UINT32 p; - UINT32 PageTableIndex; - UINT32 PageTableEntry; - UINT32 CurrentPageTableEntry; - VOID *Mva; - - volatile ARM_FIRST_LEVEL_DESCRIPTOR *FirstLevelTable; - volatile ARM_PAGE_TABLE_ENTRY *PageTable; - - Status = EFI_SUCCESS; - - // EntryMask: bitmask of values to change (1 = change this value, 0 = leave alone) - // EntryValue: values at bit positions specified by EntryMask - EntryValue = TT_DESCRIPTOR_PAGE_TYPE_PAGE; - - // Although the PI spec is unclear on this, the GCD guarantees that only - // one Attribute bit is set at a time, so the order of the conditionals below - // is irrelevant. If no memory attribute is specified, we preserve whatever - // memory type is set in the page tables, and update the permission attributes - // only. - if ((Attributes & EFI_MEMORY_UC) != 0) { - // modify cacheability attributes - EntryMask |= TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK; - // map to strongly ordered - EntryValue |= TT_DESCRIPTOR_PAGE_CACHE_POLICY_STRONGLY_ORDERED; // TEX[2:0] = 0, C=0, B=0 - } else if ((Attributes & EFI_MEMORY_WC) != 0) { - // modify cacheability attributes - EntryMask |= TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK; - // map to normal non-cacheable - EntryValue |= TT_DESCRIPTOR_PAGE_CACHE_POLICY_NON_CACHEABLE; // TEX [2:0]= 001 = 0x2, B=0, C=0 - } else if ((Attributes & EFI_MEMORY_WT) != 0) { - // modify cacheability attributes - EntryMask |= TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK; - // write through with no-allocate - EntryValue |= TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC; // TEX [2:0] = 0, C=1, B=0 - } else if ((Attributes & EFI_MEMORY_WB) != 0) { - // modify cacheability attributes - EntryMask |= TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK; - // write back (with allocate) - EntryValue |= TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_BACK_ALLOC; // TEX [2:0] = 001, C=1, B=1 - } else if ((Attributes & CACHE_ATTRIBUTE_MASK) != 0) { - // catch unsupported memory type attributes - ASSERT (FALSE); - return EFI_UNSUPPORTED; - } - - if ((Attributes & EFI_MEMORY_RP) == 0) { - EntryValue |= TT_DESCRIPTOR_PAGE_AF; - } - - if ((Attributes & EFI_MEMORY_RO) != 0) { - EntryValue |= TT_DESCRIPTOR_PAGE_AP_RO_RO; - } else { - EntryValue |= TT_DESCRIPTOR_PAGE_AP_RW_RW; - } - - if ((Attributes & EFI_MEMORY_XP) != 0) { - EntryValue |= TT_DESCRIPTOR_PAGE_XN_MASK; - } - - // Obtain page table base - FirstLevelTable = (ARM_FIRST_LEVEL_DESCRIPTOR *)ArmGetTTBR0BaseAddress (); - - // Calculate number of 4KB page table entries to change - NumPageEntries = (UINT32)(Length / TT_DESCRIPTOR_PAGE_SIZE); - - // Iterate for the number of 4KB pages to change - Offset = 0; - for (p = 0; p < NumPageEntries; p++) { - // Calculate index into first level translation table for page table value - - FirstLevelIdx = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (BaseAddress + Offset) >> TT_DESCRIPTOR_SECTION_BASE_SHIFT; - ASSERT (FirstLevelIdx < TRANSLATION_TABLE_SECTION_COUNT); - - // Read the descriptor from the first level page table - Descriptor = FirstLevelTable[FirstLevelIdx]; - - // Does this descriptor need to be converted from section entry to 4K pages? - if (!TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE (Descriptor)) { - // - // If the section mapping covers the requested region with the expected - // attributes, splitting it is unnecessary, and should be avoided as it - // may result in unbounded recursion when using a strict NX policy. - // - if ((EntryValue & ~TT_DESCRIPTOR_PAGE_TYPE_MASK & EntryMask) == - (ConvertSectionAttributesToPageAttributes (Descriptor) & EntryMask)) - { - continue; - } - - Status = ConvertSectionToPages (FirstLevelIdx << TT_DESCRIPTOR_SECTION_BASE_SHIFT); - if (EFI_ERROR (Status)) { - // Exit for loop - break; - } - - // Re-read descriptor - Descriptor = FirstLevelTable[FirstLevelIdx]; - if (FlushTlbs != NULL) { - *FlushTlbs = TRUE; - } - } - - // Obtain page table base address - PageTable = (ARM_PAGE_TABLE_ENTRY *)TT_DESCRIPTOR_PAGE_BASE_ADDRESS (Descriptor); - - // Calculate index into the page table - PageTableIndex = ((BaseAddress + Offset) & TT_DESCRIPTOR_PAGE_INDEX_MASK) >> TT_DESCRIPTOR_PAGE_BASE_SHIFT; - ASSERT (PageTableIndex < TRANSLATION_TABLE_PAGE_COUNT); - - // Get the entry - CurrentPageTableEntry = PageTable[PageTableIndex]; - - // Mask off appropriate fields - PageTableEntry = CurrentPageTableEntry & ~EntryMask; - - // Mask in new attributes and/or permissions - PageTableEntry |= EntryValue; - - if (CurrentPageTableEntry != PageTableEntry) { - Mva = (VOID *)(UINTN)((((UINTN)FirstLevelIdx) << TT_DESCRIPTOR_SECTION_BASE_SHIFT) + (PageTableIndex << TT_DESCRIPTOR_PAGE_BASE_SHIFT)); - - // Only need to update if we are changing the entry - PageTable[PageTableIndex] = PageTableEntry; - ArmUpdateTranslationTableEntry ((VOID *)&PageTable[PageTableIndex], Mva); - } - - Status = EFI_SUCCESS; - Offset += TT_DESCRIPTOR_PAGE_SIZE; - } // End first level translation table loop - - return Status; -} - -STATIC -EFI_STATUS -UpdateSectionEntries ( - IN EFI_PHYSICAL_ADDRESS BaseAddress, - IN UINT64 Length, - IN UINT64 Attributes, - IN UINT32 EntryMask - ) -{ - EFI_STATUS Status; - UINT32 EntryValue; - UINT32 FirstLevelIdx; - UINT32 NumSections; - UINT32 i; - UINT32 CurrentDescriptor; - UINT32 Descriptor; - VOID *Mva; - volatile ARM_FIRST_LEVEL_DESCRIPTOR *FirstLevelTable; - - Status = EFI_SUCCESS; - - // EntryMask: bitmask of values to change (1 = change this value, 0 = leave alone) - // EntryValue: values at bit positions specified by EntryMask - - // Make sure we handle a section range that is unmapped - EntryValue = TT_DESCRIPTOR_SECTION_TYPE_SECTION; - - // Although the PI spec is unclear on this, the GCD guarantees that only - // one Attribute bit is set at a time, so the order of the conditionals below - // is irrelevant. If no memory attribute is specified, we preserve whatever - // memory type is set in the page tables, and update the permission attributes - // only. - if ((Attributes & EFI_MEMORY_UC) != 0) { - // modify cacheability attributes - EntryMask |= TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK; - // map to strongly ordered - EntryValue |= TT_DESCRIPTOR_SECTION_CACHE_POLICY_STRONGLY_ORDERED; // TEX[2:0] = 0, C=0, B=0 - } else if ((Attributes & EFI_MEMORY_WC) != 0) { - // modify cacheability attributes - EntryMask |= TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK; - // map to normal non-cacheable - EntryValue |= TT_DESCRIPTOR_SECTION_CACHE_POLICY_NON_CACHEABLE; // TEX [2:0]= 001 = 0x2, B=0, C=0 - } else if ((Attributes & EFI_MEMORY_WT) != 0) { - // modify cacheability attributes - EntryMask |= TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK; - // write through with no-allocate - EntryValue |= TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC; // TEX [2:0] = 0, C=1, B=0 - } else if ((Attributes & EFI_MEMORY_WB) != 0) { - // modify cacheability attributes - EntryMask |= TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK; - // write back (with allocate) - EntryValue |= TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_BACK_ALLOC; // TEX [2:0] = 001, C=1, B=1 - } else if ((Attributes & CACHE_ATTRIBUTE_MASK) != 0) { - // catch unsupported memory type attributes - ASSERT (FALSE); - return EFI_UNSUPPORTED; - } - - if ((Attributes & EFI_MEMORY_RO) != 0) { - EntryValue |= TT_DESCRIPTOR_SECTION_AP_RO_RO; - } else { - EntryValue |= TT_DESCRIPTOR_SECTION_AP_RW_RW; - } - - if ((Attributes & EFI_MEMORY_XP) != 0) { - EntryValue |= TT_DESCRIPTOR_SECTION_XN_MASK; - } - - if ((Attributes & EFI_MEMORY_RP) == 0) { - EntryValue |= TT_DESCRIPTOR_SECTION_AF; - } - - // obtain page table base - FirstLevelTable = (ARM_FIRST_LEVEL_DESCRIPTOR *)ArmGetTTBR0BaseAddress (); - - // calculate index into first level translation table for start of modification - FirstLevelIdx = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (BaseAddress) >> TT_DESCRIPTOR_SECTION_BASE_SHIFT; - ASSERT (FirstLevelIdx < TRANSLATION_TABLE_SECTION_COUNT); - - // calculate number of 1MB first level entries this applies to - NumSections = (UINT32)(Length / TT_DESCRIPTOR_SECTION_SIZE); - - // iterate through each descriptor - for (i = 0; i < NumSections; i++) { - CurrentDescriptor = FirstLevelTable[FirstLevelIdx + i]; - - // has this descriptor already been converted to pages? - if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE (CurrentDescriptor)) { - // forward this 1MB range to page table function instead - Status = UpdatePageEntries ( - (FirstLevelIdx + i) << TT_DESCRIPTOR_SECTION_BASE_SHIFT, - TT_DESCRIPTOR_SECTION_SIZE, - Attributes, - ConvertSectionAttributesToPageAttributes (EntryMask), - NULL - ); - } else { - // still a section entry - - if (CurrentDescriptor != 0) { - // mask off appropriate fields - Descriptor = CurrentDescriptor & ~EntryMask; - } else { - Descriptor = ((UINTN)FirstLevelIdx + i) << TT_DESCRIPTOR_SECTION_BASE_SHIFT; - } - - // mask in new attributes and/or permissions - Descriptor |= EntryValue; - - if (CurrentDescriptor != Descriptor) { - Mva = (VOID *)(UINTN)(((UINTN)FirstLevelIdx + i) << TT_DESCRIPTOR_SECTION_BASE_SHIFT); - - // Only need to update if we are changing the descriptor - FirstLevelTable[FirstLevelIdx + i] = Descriptor; - ArmUpdateTranslationTableEntry ((VOID *)&FirstLevelTable[FirstLevelIdx + i], Mva); - } - - Status = EFI_SUCCESS; - } - } - - return Status; -} - -/** - Update the permission or memory type attributes on a range of memory. - - @param BaseAddress The start of the region. - @param Length The size of the region. - @param Attributes A mask of EFI_MEMORY_xx constants. - @param SectionMask A mask of short descriptor section attributes - describing which descriptor bits to update. - - @retval EFI_SUCCESS The attributes were set successfully. - @retval EFI_OUT_OF_RESOURCES The operation failed due to insufficient memory. - -**/ -STATIC -EFI_STATUS -SetMemoryAttributes ( - IN EFI_PHYSICAL_ADDRESS BaseAddress, - IN UINT64 Length, - IN UINT64 Attributes, - IN UINT32 SectionMask - ) -{ - EFI_STATUS Status; - UINT64 ChunkLength; - BOOLEAN FlushTlbs; - - if (BaseAddress > (UINT64)MAX_ADDRESS) { - DEBUG (( - DEBUG_ERROR, - "%a BaseAddress: 0x%llx is greater than MAX_ADDRESS: 0x%llx, fail to apply attributes!\n", - __func__, - BaseAddress, - (UINT64)MAX_ADDRESS - )); - return EFI_UNSUPPORTED; - } - - Length = MIN (Length, (UINT64)MAX_ADDRESS - BaseAddress + 1); - if (Length == 0) { - return EFI_SUCCESS; - } - - FlushTlbs = FALSE; - while (Length > 0) { - if ((BaseAddress % TT_DESCRIPTOR_SECTION_SIZE == 0) && - (Length >= TT_DESCRIPTOR_SECTION_SIZE)) - { - ChunkLength = Length - Length % TT_DESCRIPTOR_SECTION_SIZE; - - DEBUG (( - DEBUG_PAGE, - "SetMemoryAttributes(): MMU section 0x%lx length 0x%lx to %lx\n", - BaseAddress, - ChunkLength, - Attributes - )); - - Status = UpdateSectionEntries ( - BaseAddress, - ChunkLength, - Attributes, - SectionMask - ); - - FlushTlbs = TRUE; - } else { - // - // Process page by page until the next section boundary, but only if - // we have more than a section's worth of area to deal with after that. - // - ChunkLength = TT_DESCRIPTOR_SECTION_SIZE - - (BaseAddress % TT_DESCRIPTOR_SECTION_SIZE); - if (ChunkLength + TT_DESCRIPTOR_SECTION_SIZE > Length) { - ChunkLength = Length; - } - - DEBUG (( - DEBUG_PAGE, - "SetMemoryAttributes(): MMU page 0x%lx length 0x%lx to %lx\n", - BaseAddress, - ChunkLength, - Attributes - )); - - Status = UpdatePageEntries ( - BaseAddress, - ChunkLength, - Attributes, - ConvertSectionAttributesToPageAttributes (SectionMask), - &FlushTlbs - ); - } - - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "%a failed to update attributes with status %r for BaseAddress 0x%llx of length 0x%llx\n", - __func__, - Status, - BaseAddress, - ChunkLength - )); - break; - } - - BaseAddress += ChunkLength; - Length -= ChunkLength; - } - - if (FlushTlbs) { - ArmInvalidateTlb (); - } - - return Status; -} - -/** - Set the requested memory permission attributes on a region of memory. - - BaseAddress and Length must be aligned to EFI_PAGE_SIZE. - - If Attributes contains a memory type attribute (EFI_MEMORY_UC/WC/WT/WB), the - region is mapped according to this memory type, and additional memory - permission attributes (EFI_MEMORY_RP/RO/XP) are taken into account as well, - discarding any permission attributes that are currently set for the region. - AttributeMask is ignored in this case, and must be set to 0x0. - - If Attributes contains only a combination of memory permission attributes - (EFI_MEMORY_RP/RO/XP), each page in the region will retain its existing - memory type, even if it is not uniformly set across the region. In this case, - AttributesMask may be set to a mask of permission attributes, and memory - permissions omitted from this mask will not be updated for any page in the - region. All attributes appearing in Attributes must appear in AttributeMask - as well. (Attributes & ~AttributeMask must produce 0x0) - - @param[in] BaseAddress The physical address that is the start address of - a memory region. - @param[in] Length The size in bytes of the memory region. - @param[in] Attributes Mask of memory attributes to set. - @param[in] AttributeMask Mask of memory attributes to take into account. - - @retval EFI_SUCCESS The attributes were set for the memory region. - @retval EFI_INVALID_PARAMETER BaseAddress or Length is not suitably aligned. - Invalid combination of Attributes and - AttributeMask. - @retval EFI_OUT_OF_RESOURCES Requested attributes cannot be applied due to - lack of system resources. - -**/ -EFI_STATUS -ArmSetMemoryAttributes ( - IN EFI_PHYSICAL_ADDRESS BaseAddress, - IN UINT64 Length, - IN UINT64 Attributes, - IN UINT64 AttributeMask - ) -{ - UINT32 TtEntryMask; - - if (((BaseAddress | Length) & EFI_PAGE_MASK) != 0) { - return EFI_INVALID_PARAMETER; - } - - if ((Attributes & EFI_MEMORY_CACHETYPE_MASK) == 0) { - // - // No memory type was set in Attributes, so we are going to update the - // permissions only. - // - if (AttributeMask != 0) { - if (((AttributeMask & ~(UINT64)(EFI_MEMORY_RP|EFI_MEMORY_RO|EFI_MEMORY_XP)) != 0) || - ((Attributes & ~AttributeMask) != 0)) - { - return EFI_INVALID_PARAMETER; - } - } else { - AttributeMask = EFI_MEMORY_RP | EFI_MEMORY_RO | EFI_MEMORY_XP; - } - - TtEntryMask = 0; - if ((AttributeMask & EFI_MEMORY_RP) != 0) { - TtEntryMask |= TT_DESCRIPTOR_SECTION_AF; - } - - if ((AttributeMask & EFI_MEMORY_RO) != 0) { - TtEntryMask |= TT_DESCRIPTOR_SECTION_AP_MASK; - } - - if ((AttributeMask & EFI_MEMORY_XP) != 0) { - TtEntryMask |= TT_DESCRIPTOR_SECTION_XN_MASK; - } - } else { - ASSERT (AttributeMask == 0); - if (AttributeMask != 0) { - return EFI_INVALID_PARAMETER; - } - - TtEntryMask = TT_DESCRIPTOR_SECTION_TYPE_MASK | - TT_DESCRIPTOR_SECTION_XN_MASK | - TT_DESCRIPTOR_SECTION_AP_MASK | - TT_DESCRIPTOR_SECTION_AF; - } - - return SetMemoryAttributes ( - BaseAddress, - Length, - Attributes, - TtEntryMask - ); -} diff --git a/UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibV7Support.S b/UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibV7Support.S deleted file mode 100644 index 05f553aba6ff..000000000000 --- a/UefiCpuPkg/Library/ArmMmuLib/Arm/ArmMmuLibV7Support.S +++ /dev/null @@ -1,29 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2016, Linaro Limited. All rights reserved. -# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -.text -.align 2 - -GCC_ASM_EXPORT (ArmReadIdMmfr0) -GCC_ASM_EXPORT (ArmHasMpExtensions) - -#------------------------------------------------------------------------------ - -ASM_PFX (ArmHasMpExtensions): - mrc p15,0,R0,c0,c0,5 - // Get Multiprocessing extension (bit31) - lsr R0, R0, #31 - bx LR - -ASM_PFX(ArmReadIdMmfr0): - mrc p15, 0, r0, c0, c1, 4 @ Read ID_MMFR0 Register - bx lr - -ASM_FUNCTION_REMOVE_IF_UNREFERENCED diff --git a/UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf b/UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf index 9e92e2e583d1..ab32d45f691e 100644 --- a/UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf +++ b/UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf @@ -14,8 +14,6 @@ MODULE_TYPE = BASE VERSION_STRING = 1.0 LIBRARY_CLASS = ArmMmuLib - -[Defines.AARCH64] CONSTRUCTOR = ArmMmuBaseLibConstructor [Sources.AARCH64] @@ -23,13 +21,6 @@ AArch64/ArmMmuLibCore.c AArch64/ArmMmuLibReplaceEntry.S -[Sources.ARM] - ArmMmuLibInternal.h - Arm/ArmMmuLibConvert.c - Arm/ArmMmuLibCore.c - Arm/ArmMmuLibUpdate.c - Arm/ArmMmuLibV7Support.S |GCC - [Packages] MdePkg/MdePkg.dec UefiCpuPkg/UefiCpuPkg.dec diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec index 3789ee95351c..f23084b79920 100644 --- a/UefiCpuPkg/UefiCpuPkg.dec +++ b/UefiCpuPkg/UefiCpuPkg.dec @@ -88,7 +88,7 @@ ## @libraryclass Provides functions for the memory management unit. CpuMmuLib|Include/Library/CpuMmuLib.h -[LibraryClasses.ARM, LibraryClasses.AARCH64] +[LibraryClasses.AARCH64] ## @libraryclass Provides a Mmu interface. # ArmMmuLib|Include/Library/ArmMmuLib.h @@ -130,7 +130,7 @@ # Include/Guid/MmAcpiS3Enable.h gMmAcpiS3EnableHobGuid = { 0xe7402821, 0x2654, 0x4c1b, { 0x99, 0x0e, 0x04, 0x8f, 0x8d, 0x82, 0xcf, 0x67 }} -[Guids.ARM, Guids.AARCH64] +[Guids.AARCH64] gArmMmuReplaceLiveTranslationEntryFuncGuid = { 0xa8b50ff3, 0x08ec, 0x4dd3, {0xbf, 0x04, 0x28, 0xbf, 0x71, 0x75, 0xc7, 0x4a} } [Protocols] diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc index e011b1839dfe..58ccc37a23d2 100644 --- a/UefiCpuPkg/UefiCpuPkg.dsc +++ b/UefiCpuPkg/UefiCpuPkg.dsc @@ -224,10 +224,8 @@ UefiCpuPkg/CpuDxeRiscV64/CpuDxeRiscV64.inf UefiCpuPkg/CpuMmio2Dxe/CpuMmio2Dxe.inf -[Components.ARM, Components.AARCH64] - UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf - [Components.AARCH64] + UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf UefiCpuPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf UefiCpuPkg/Library/BaseArchSupportLib/BaseArchSupportLib.inf From 3d50e76f0343014e0580f05904836f87bb92e468 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Sun, 14 Sep 2025 21:16:31 -0700 Subject: [PATCH 0510/1172] UefiPayloadPkg: Drop ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 support from UefiPayloadPkg. It removes irrelevant VALID_ARCHITECTURES comments from infs that are not arch specific. Signed-off-by: Oliver Smith-Denny --- UefiPayloadPkg/Library/BuildFdtLib/BuildFdtLib.inf | 1 - UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf | 1 - UefiPayloadPkg/Library/FmpDeviceSmmLib/FmpDeviceSmmLib.inf | 6 ------ UefiPayloadPkg/PayloadLoaderPeim/PayloadLoaderPeim.inf | 1 - UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.inf | 6 ------ UefiPayloadPkg/PlatformCI/PlatformBuild.py | 1 - 6 files changed, 16 deletions(-) diff --git a/UefiPayloadPkg/Library/BuildFdtLib/BuildFdtLib.inf b/UefiPayloadPkg/Library/BuildFdtLib/BuildFdtLib.inf index 12461a96067f..db7f54151076 100644 --- a/UefiPayloadPkg/Library/BuildFdtLib/BuildFdtLib.inf +++ b/UefiPayloadPkg/Library/BuildFdtLib/BuildFdtLib.inf @@ -59,7 +59,6 @@ MSFT:*_*_*_CC_FLAGS = /wd4305 GCC:*_*_IA32_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast GCC:*_*_X64_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast - GCC:*_*_ARM_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast GCC:*_*_AARCH64_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast GCC:*_*_RISCV64_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast GCC:*_*_LOONGARCH64_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast diff --git a/UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf b/UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf index de3feba8ae96..a5e83c2d7dbf 100644 --- a/UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf +++ b/UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf @@ -59,7 +59,6 @@ MSFT:*_*_*_CC_FLAGS = /wd4305 GCC:*_*_IA32_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast GCC:*_*_X64_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast - GCC:*_*_ARM_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast GCC:*_*_AARCH64_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast GCC:*_*_RISCV64_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast GCC:*_*_LOONGARCH64_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast diff --git a/UefiPayloadPkg/Library/FmpDeviceSmmLib/FmpDeviceSmmLib.inf b/UefiPayloadPkg/Library/FmpDeviceSmmLib/FmpDeviceSmmLib.inf index 893e36170eaf..ea84cd5fdb05 100644 --- a/UefiPayloadPkg/Library/FmpDeviceSmmLib/FmpDeviceSmmLib.inf +++ b/UefiPayloadPkg/Library/FmpDeviceSmmLib/FmpDeviceSmmLib.inf @@ -19,12 +19,6 @@ LIBRARY_CLASS = FmpDeviceLib|DXE_DRIVER UEFI_DRIVER CONSTRUCTOR = FmpDeviceSmmLibConstructor -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] FmpDeviceSmmLib.c diff --git a/UefiPayloadPkg/PayloadLoaderPeim/PayloadLoaderPeim.inf b/UefiPayloadPkg/PayloadLoaderPeim/PayloadLoaderPeim.inf index 8db026eaa1b8..1040e01fd583 100644 --- a/UefiPayloadPkg/PayloadLoaderPeim/PayloadLoaderPeim.inf +++ b/UefiPayloadPkg/PayloadLoaderPeim/PayloadLoaderPeim.inf @@ -70,7 +70,6 @@ MSFT:*_*_*_CC_FLAGS = /wd4244 GCC:*_*_IA32_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast GCC:*_*_X64_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast - GCC:*_*_ARM_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast GCC:*_*_AARCH64_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast GCC:*_*_RISCV64_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast GCC:*_*_LOONGARCH64_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast diff --git a/UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.inf b/UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.inf index 9e0ba63de377..cd45f766746e 100644 --- a/UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.inf +++ b/UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.inf @@ -16,12 +16,6 @@ VERSION_STRING = 1.0 ENTRY_POINT = InstallPciPlatformProtocol -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources.common] PciPlatformDxe.h PciPlatformDxe.c diff --git a/UefiPayloadPkg/PlatformCI/PlatformBuild.py b/UefiPayloadPkg/PlatformCI/PlatformBuild.py index b25045870faa..96c40fbe0548 100644 --- a/UefiPayloadPkg/PlatformCI/PlatformBuild.py +++ b/UefiPayloadPkg/PlatformCI/PlatformBuild.py @@ -74,7 +74,6 @@ def GetRequiredSubmodules(self): ret = RunCmd("git", "config --file .gitmodules --get-regexp path", workingdir=self.GetWorkspaceRoot(), outstream=result) # Cmd output is expected to look like: # submodule.CryptoPkg/Library/OpensslLib/openssl.path CryptoPkg/Library/OpensslLib/openssl - # submodule.SoftFloat.path ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3 if ret == 0: for line in result.getvalue().splitlines(): _, _, path = line.partition(" ") From 7cf721dd4d5af623726e5b33de9a5513c0e1e31e Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Sun, 14 Sep 2025 21:17:49 -0700 Subject: [PATCH 0511/1172] StandaloneMmPkg: Drop ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from StandaloneMmPkg. It also removes irrelevant VALID_ARCHITECTURES comments from infs that are not arch specific. Signed-off-by: Oliver Smith-Denny --- StandaloneMmPkg/Core/StandaloneMmCore.inf | 8 ++------ .../StandaloneMmCoreHobLib.inf | 3 --- .../StandaloneMmHobLib/StandaloneMmHobLib.inf | 4 ---- .../StandaloneMmMemLib/StandaloneMmMemLib.inf | 4 ++-- .../StandaloneMmMemoryAllocationLib.inf | 6 ------ .../StandaloneMmPeCoffExtraActionLib.inf | 2 +- .../VariableMmDependency/VariableMmDependency.inf | 7 ------- StandaloneMmPkg/StandaloneMmPkg.dsc | 12 ++++-------- 8 files changed, 9 insertions(+), 37 deletions(-) diff --git a/StandaloneMmPkg/Core/StandaloneMmCore.inf b/StandaloneMmPkg/Core/StandaloneMmCore.inf index bda86dc38a98..0448cdaf4eb9 100644 --- a/StandaloneMmPkg/Core/StandaloneMmCore.inf +++ b/StandaloneMmPkg/Core/StandaloneMmCore.inf @@ -17,8 +17,6 @@ PI_SPECIFICATION_VERSION = 0x00010032 ENTRY_POINT = StandaloneMmMain -# VALID_ARCHITECTURES = IA32 X64 AARCH64 ARM - [Sources] StandaloneMmCore.c StandaloneMmCore.h @@ -95,11 +93,9 @@ # # This configuration fails for CLANGPDB, which does not support PIE in the GCC # sense. Such however is required for ARM family StandaloneMmCore -# self-relocation, and thus the CLANGPDB toolchain is unsupported for ARM and -# AARCH64 for this module. +# self-relocation, and thus the CLANGPDB toolchain is unsupported for AARCH64 +# for this module. # [BuildOptions] - GCC:*_*_ARM_CC_FLAGS = -fpie - GCC:*_*_ARM_DLINK_FLAGS = -Wl,-z,text,-Bsymbolic,-pie GCC:*_*_AARCH64_CC_FLAGS = -fpie GCC:*_*_AARCH64_DLINK_FLAGS = -Wl,-z,text,-Bsymbolic,-pie diff --git a/StandaloneMmPkg/Library/StandaloneMmCoreHobLib/StandaloneMmCoreHobLib.inf b/StandaloneMmPkg/Library/StandaloneMmCoreHobLib/StandaloneMmCoreHobLib.inf index 070018c93aa3..d9bbad73ff77 100644 --- a/StandaloneMmPkg/Library/StandaloneMmCoreHobLib/StandaloneMmCoreHobLib.inf +++ b/StandaloneMmPkg/Library/StandaloneMmCoreHobLib/StandaloneMmCoreHobLib.inf @@ -21,9 +21,6 @@ PI_SPECIFICATION_VERSION = 0x00010032 LIBRARY_CLASS = HobLib|MM_CORE_STANDALONE -# -# VALID_ARCHITECTURES = X64 AARCH64 ARM -# [Sources] Common.c StandaloneMmCoreHobLib.c diff --git a/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.inf b/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.inf index 537393c03c1d..5abeb988322d 100644 --- a/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.inf +++ b/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.inf @@ -20,10 +20,6 @@ LIBRARY_CLASS = HobLib|MM_STANDALONE CONSTRUCTOR = HobLibConstructor -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] StandaloneMmHobLib.c diff --git a/StandaloneMmPkg/Library/StandaloneMmMemLib/StandaloneMmMemLib.inf b/StandaloneMmPkg/Library/StandaloneMmMemLib/StandaloneMmMemLib.inf index 4987deb8c9f2..cb1fcac176a3 100644 --- a/StandaloneMmPkg/Library/StandaloneMmMemLib/StandaloneMmMemLib.inf +++ b/StandaloneMmPkg/Library/StandaloneMmMemLib/StandaloneMmMemLib.inf @@ -28,7 +28,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 AARCH64 ARM +# VALID_ARCHITECTURES = IA32 X64 AARCH64 # [Sources.Common] @@ -38,7 +38,7 @@ [Sources.IA32, Sources.X64] X86StandaloneMmMemLibInternal.c -[Sources.AARCH64, Sources.ARM] +[Sources.AARCH64] ArmStandaloneMmMemLibInternal.c [Packages] diff --git a/StandaloneMmPkg/Library/StandaloneMmMemoryAllocationLib/StandaloneMmMemoryAllocationLib.inf b/StandaloneMmPkg/Library/StandaloneMmMemoryAllocationLib/StandaloneMmMemoryAllocationLib.inf index f5aaff1a2518..c88bf331db7e 100644 --- a/StandaloneMmPkg/Library/StandaloneMmMemoryAllocationLib/StandaloneMmMemoryAllocationLib.inf +++ b/StandaloneMmPkg/Library/StandaloneMmMemoryAllocationLib/StandaloneMmMemoryAllocationLib.inf @@ -18,12 +18,6 @@ PI_SPECIFICATION_VERSION = 0x00010032 LIBRARY_CLASS = MemoryAllocationLib|MM_STANDALONE -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] StandaloneMmMemoryAllocationLib.c diff --git a/StandaloneMmPkg/Library/StandaloneMmPeCoffExtraActionLib/StandaloneMmPeCoffExtraActionLib.inf b/StandaloneMmPkg/Library/StandaloneMmPeCoffExtraActionLib/StandaloneMmPeCoffExtraActionLib.inf index 89083df679a1..02d4d8bc6744 100644 --- a/StandaloneMmPkg/Library/StandaloneMmPeCoffExtraActionLib/StandaloneMmPeCoffExtraActionLib.inf +++ b/StandaloneMmPkg/Library/StandaloneMmPeCoffExtraActionLib/StandaloneMmPeCoffExtraActionLib.inf @@ -20,7 +20,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = ARM +# VALID_ARCHITECTURES = AARCH64 # [Sources.common] diff --git a/StandaloneMmPkg/Library/VariableMmDependency/VariableMmDependency.inf b/StandaloneMmPkg/Library/VariableMmDependency/VariableMmDependency.inf index ffb2a6d083f4..d229798ef7f4 100644 --- a/StandaloneMmPkg/Library/VariableMmDependency/VariableMmDependency.inf +++ b/StandaloneMmPkg/Library/VariableMmDependency/VariableMmDependency.inf @@ -17,13 +17,6 @@ LIBRARY_CLASS = NULL CONSTRUCTOR = VariableMmDependencyLibConstructor -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = AARCH64|ARM -# -# - [Sources] VariableMmDependency.c diff --git a/StandaloneMmPkg/StandaloneMmPkg.dsc b/StandaloneMmPkg/StandaloneMmPkg.dsc index caf0b5078046..a2268c2b0ab5 100644 --- a/StandaloneMmPkg/StandaloneMmPkg.dsc +++ b/StandaloneMmPkg/StandaloneMmPkg.dsc @@ -20,7 +20,7 @@ PLATFORM_VERSION = 1.0 DSC_SPECIFICATION = 0x00010011 OUTPUT_DIRECTORY = Build/StandaloneMm - SUPPORTED_ARCHITECTURES = AARCH64|X64|ARM + SUPPORTED_ARCHITECTURES = AARCH64|X64 BUILD_TARGETS = DEBUG|RELEASE SKUID_IDENTIFIER = DEFAULT @@ -74,7 +74,7 @@ [LibraryClasses.X64] StandaloneMmCoreEntryPoint|MdePkg/Library/StandaloneMmCoreEntryPoint/StandaloneMmCoreEntryPoint.inf -[LibraryClasses.AARCH64, LibraryClasses.ARM] +[LibraryClasses.AARCH64] ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf StandaloneMmCoreEntryPoint|ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.inf StandaloneMmMmuLib|ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.inf @@ -88,7 +88,7 @@ HobLib|StandaloneMmPkg/Library/StandaloneMmCoreHobLib/StandaloneMmCoreHobLib.inf PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf -[LibraryClasses.AARCH64.MM_CORE_STANDALONE, LibraryClasses.ARM.MM_CORE_STANDALONE] +[LibraryClasses.AARCH64.MM_CORE_STANDALONE] ArmFfaLib|MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmCoreLib.inf [LibraryClasses.common.MM_STANDALONE] @@ -152,7 +152,7 @@ StandaloneMmPkg/Drivers/MmCommunicationNotifyDxe/MmCommunicationNotifyDxe.inf StandaloneMmPkg/Library/StandaloneMmExtractGuidedSectionLib/StandaloneMmExtractGuidedSectionLib.inf -[Components.AARCH64, Components.ARM] +[Components.AARCH64] StandaloneMmPkg/Library/StandaloneMmPeCoffExtraActionLib/StandaloneMmPeCoffExtraActionLib.inf [Components.X64] @@ -171,10 +171,6 @@ GCC:*_*_*_DLINK_FLAGS = -z common-page-size=0x1000 -march=armv8-a+nofp -mstrict-align GCC:*_*_*_CC_FLAGS = -mstrict-align -[BuildOptions.ARM] -GCC:*_*_*_DLINK_FLAGS = -z common-page-size=0x1000 -march=armv7-a -GCC:*_*_*_CC_FLAGS = -fno-stack-protector - [BuildOptions.X64] MSFT:*_*_*_DLINK_FLAGS = /ALIGN:4096 GCC:*_GCC*_*_DLINK_FLAGS = -z common-page-size=0x1000 From 18e94d0d4b07198af55a50cfa2d2adfaf23868bb Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Sun, 14 Sep 2025 21:18:51 -0700 Subject: [PATCH 0512/1172] SignedCapsulePkg: Drop ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from SignedCapsulePkg. Signed-off-by: Oliver Smith-Denny --- SignedCapsulePkg/SignedCapsulePkg.dsc | 3 --- 1 file changed, 3 deletions(-) diff --git a/SignedCapsulePkg/SignedCapsulePkg.dsc b/SignedCapsulePkg/SignedCapsulePkg.dsc index b38fd2da15e8..f9e88be8dc40 100644 --- a/SignedCapsulePkg/SignedCapsulePkg.dsc +++ b/SignedCapsulePkg/SignedCapsulePkg.dsc @@ -95,9 +95,6 @@ PlatformFlashAccessLib|SignedCapsulePkg/Library/PlatformFlashAccessLibNull/PlatformFlashAccessLibNull.inf RngLib|MdePkg/Library/BaseRngLib/BaseRngLib.inf -[LibraryClasses.ARM] - RngLib|MdeModulePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf - [LibraryClasses.RISCV64] RngLib|MdeModulePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf From 9c657c36856a47190eeba3bc24a44f575cf6b1a6 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 07:49:54 -0700 Subject: [PATCH 0513/1172] ShellPkg: Remove ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit removes support from ShellPkg. Signed-off-by: Oliver Smith-Denny --- .../Library/UefiShellAcpiViewCommandLib/AcpiTableParser.c | 4 ++-- ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiView.c | 6 +++--- .../UefiShellAcpiViewCommandLib/Parsers/Dsdt/DsdtParser.c | 2 +- .../UefiShellAcpiViewCommandLib/Parsers/Fadt/FadtParser.c | 8 ++++---- .../UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctParser.c | 8 ++++---- .../UefiShellAcpiViewCommandLib/Parsers/Pptt/PpttParser.c | 8 ++++---- .../UefiShellAcpiViewCommandLib/Parsers/Pptt/PpttParser.h | 4 ++-- .../UefiShellAcpiViewCommandLib/Parsers/Rsdp/RsdpParser.c | 4 ++-- .../UefiShellAcpiViewCommandLib/Parsers/Spcr/SpcrParser.c | 4 ++-- .../UefiShellAcpiViewCommandLib.inf | 2 +- ShellPkg/ShellPkg.dsc | 2 +- 11 files changed, 26 insertions(+), 26 deletions(-) diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.c index 75b949429ec9..ab900eb54e9c 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.c @@ -19,7 +19,7 @@ #include "AcpiView.h" #include "AcpiViewConfig.h" -#if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) +#if defined (MDE_CPU_AARCH64) #include "Arm/SbbrValidator.h" #endif @@ -227,7 +227,7 @@ ProcessAcpiTable ( } } - #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) + #if defined (MDE_CPU_AARCH64) if (GetMandatoryTableValidate ()) { ArmSbbrIncrementTableCount (*AcpiTableSignature); } diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiView.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiView.c index faac3ac138ae..c4742f5bbf4f 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiView.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiView.c @@ -23,7 +23,7 @@ #include "AcpiView.h" #include "AcpiViewConfig.h" -#if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) +#if defined (MDE_CPU_AARCH64) #include "Arm/SbbrValidator.h" #endif @@ -237,7 +237,7 @@ AcpiView ( return EFI_UNSUPPORTED; } - #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) + #if defined (MDE_CPU_AARCH64) if (GetMandatoryTableValidate ()) { ArmSbbrResetTableCounts (); } @@ -264,7 +264,7 @@ AcpiView ( RsdpRevision ); - #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) + #if defined (MDE_CPU_AARCH64) if (GetMandatoryTableValidate ()) { ArmSbbrReqsValidate ((ARM_SBBR_VERSION)GetMandatoryTableSpec ()); } diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Dsdt/DsdtParser.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Dsdt/DsdtParser.c index 7f30a8409bb7..000aadf5b795 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Dsdt/DsdtParser.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Dsdt/DsdtParser.c @@ -43,7 +43,7 @@ ParseAcpiDsdt ( // As per 19.6.29 in the version 6.4 of the ACPI spec, a revision less than 2 // restricts integers to 32 bit width. This may not be intended, raise a // warning - #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_ARM) + #if defined (MDE_CPU_AARCH64) if (AcpiTableRevision < 2) { IncrementWarningCount (); Print ( diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Fadt/FadtParser.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Fadt/FadtParser.c index d89fcb13a4b2..0ae6590717c4 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Fadt/FadtParser.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Fadt/FadtParser.c @@ -70,7 +70,7 @@ ValidateFirmwareCtrl ( IN VOID *Context ) { - #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) + #if defined (MDE_CPU_AARCH64) if (*(UINT32 *)Ptr != 0) { IncrementErrorCount (); Print ( @@ -98,7 +98,7 @@ ValidateXFirmwareCtrl ( IN VOID *Context ) { - #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) + #if defined (MDE_CPU_AARCH64) if (*(UINT64 *)Ptr != 0) { IncrementErrorCount (); Print ( @@ -126,7 +126,7 @@ ValidateFlags ( IN VOID *Context ) { - #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) + #if defined (MDE_CPU_AARCH64) if (((*(UINT32 *)Ptr) & HW_REDUCED_ACPI) == 0) { IncrementErrorCount (); Print ( @@ -374,7 +374,7 @@ ParseAcpiFadt ( DsdtPtr = (UINT8 *)(UINTN)(*DsdtAddress); } else { // Both DSDT and X_DSDT cannot be invalid. - #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) + #if defined (MDE_CPU_AARCH64) if (Trace) { // The DSDT Table is mandatory for ARM systems // as the CPU information MUST be presented in diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctParser.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctParser.c index 43c6a9fb6f33..ea2df7e42557 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctParser.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctParser.c @@ -98,9 +98,9 @@ ValidatePccMemoryIoGas ( ) { switch (*(UINT8 *)Ptr) { - #if !(defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)) + #if !(defined (MDE_CPU_AARCH64)) case EFI_ACPI_6_4_SYSTEM_IO: - #endif //if not (defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)) + #endif //if not (defined (MDE_CPU_AARCH64)) case EFI_ACPI_6_4_SYSTEM_MEMORY: return; default: @@ -127,9 +127,9 @@ ValidatePccGas ( ) { switch (*(UINT8 *)Ptr) { - #if !(defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)) + #if !(defined (MDE_CPU_AARCH64)) case EFI_ACPI_6_4_SYSTEM_IO: - #endif //if not (defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)) + #endif //if not (defined (MDE_CPU_AARCH64)) case EFI_ACPI_6_4_FUNCTIONAL_FIXED_HARDWARE: case EFI_ACPI_6_4_SYSTEM_MEMORY: return; diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pptt/PpttParser.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pptt/PpttParser.c index fabe057d056d..f9799a090f5a 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pptt/PpttParser.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pptt/PpttParser.c @@ -23,7 +23,7 @@ STATIC CONST UINT32 *NumberOfPrivateResources; STATIC CONST EFI_ACPI_6_4_PPTT_STRUCTURE_CACHE_FLAGS *CacheFlags; STATIC ACPI_DESCRIPTION_HEADER_INFO AcpiHdrInfo; -#if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) +#if defined (MDE_CPU_AARCH64) /** Increment the error count and print an error that a required flag is missing. @@ -65,7 +65,7 @@ ValidateCacheFlags ( IN VOID *Context ) { - #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) + #if defined (MDE_CPU_AARCH64) CacheFlags = (EFI_ACPI_6_4_PPTT_STRUCTURE_CACHE_FLAGS *)Ptr; if (CacheFlags == NULL) { @@ -140,7 +140,7 @@ ValidateCacheNumberOfSets ( return; } - #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) + #if defined (MDE_CPU_AARCH64) if (NumberOfSets > PPTT_ARM_CCIDX_CACHE_NUMBER_OF_SETS_MAX) { IncrementErrorCount (); Print ( @@ -211,7 +211,7 @@ ValidateCacheLineSize ( IN VOID *Context ) { - #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) + #if defined (MDE_CPU_AARCH64) // Reference: ARM Architecture Reference Manual ARMv8 (D.a) // Section D12.2.25: CCSIDR_EL1, Current Cache Size ID Register // LineSize, bits [2:0] diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pptt/PpttParser.h b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pptt/PpttParser.h index 6bee88084c72..c4f3ffcd1eb7 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pptt/PpttParser.h +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pptt/PpttParser.h @@ -11,7 +11,7 @@ #ifndef PPTT_PARSER_H_ #define PPTT_PARSER_H_ -#if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) +#if defined (MDE_CPU_AARCH64) /// Cache parameters allowed by the architecture with /// ARMv8.3-CCIDX (Cache extended number of sets) @@ -33,6 +33,6 @@ #define PPTT_ARM_CACHE_LINE_SIZE_MAX (1 << 11) #define PPTT_ARM_CACHE_LINE_SIZE_MIN (1 << 4) -#endif // if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) +#endif // if defined (MDE_CPU_AARCH64) #endif // PPTT_PARSER_H_ diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Rsdp/RsdpParser.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Rsdp/RsdpParser.c index 895258bc1de8..68c579723582 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Rsdp/RsdpParser.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Rsdp/RsdpParser.c @@ -32,7 +32,7 @@ ValidateRsdtAddress ( IN VOID *Context ) { - #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) + #if defined (MDE_CPU_AARCH64) // Reference: Server Base Boot Requirements System Software on ARM Platforms // Section: 4.2.1.1 RSDP // Root System Description Pointer (RSDP), ACPI ? 5.2.5. @@ -70,7 +70,7 @@ ValidateXsdtAddress ( IN VOID *Context ) { - #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) + #if defined (MDE_CPU_AARCH64) // Reference: Server Base Boot Requirements System Software on ARM Platforms // Section: 4.2.1.1 RSDP // Root System Description Pointer (RSDP), ACPI ? 5.2.5. diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Spcr/SpcrParser.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Spcr/SpcrParser.c index db44de19faba..4402667fae04 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Spcr/SpcrParser.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Spcr/SpcrParser.c @@ -38,7 +38,7 @@ ValidateInterruptType ( IN VOID *Context ) { - #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) + #if defined (MDE_CPU_AARCH64) UINT8 InterruptType; InterruptType = *Ptr; @@ -73,7 +73,7 @@ ValidateIrq ( IN VOID *Context ) { - #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) + #if defined (MDE_CPU_AARCH64) UINT8 Irq; Irq = *Ptr; diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf index 42ce88e17131..bc12d8ce3226 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf @@ -63,7 +63,7 @@ UefiShellAcpiViewCommandLib.c UefiShellAcpiViewCommandLib.uni -[Sources.ARM, Sources.AARCH64] +[Sources.AARCH64] Arm/SbbrValidator.h Arm/SbbrValidator.c diff --git a/ShellPkg/ShellPkg.dsc b/ShellPkg/ShellPkg.dsc index 7e985f8280a7..94d95de0eb8a 100644 --- a/ShellPkg/ShellPkg.dsc +++ b/ShellPkg/ShellPkg.dsc @@ -16,7 +16,7 @@ PLATFORM_VERSION = 1.02 DSC_SPECIFICATION = 0x00010006 OUTPUT_DIRECTORY = Build/Shell - SUPPORTED_ARCHITECTURES = IA32|X64|EBC|ARM|AARCH64|RISCV64|LOONGARCH64 + SUPPORTED_ARCHITECTURES = IA32|X64|EBC|AARCH64|RISCV64|LOONGARCH64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT From 08ae634ccb4dc5463b3d4473c44269cdd9e0c191 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 07:51:59 -0700 Subject: [PATCH 0514/1172] SecurityPkg: Drop ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code in SecurityPkg. Signed-off-by: Oliver Smith-Denny --- .../StandaloneMmTcg2PhysicalPresenceLib.inf | 4 +- .../RngDxe/Arm/ArmAlgo.c | 51 ------------------- .../RandomNumberGenerator/RngDxe/RngDxe.inf | 9 ++-- SecurityPkg/SecurityPkg.dsc | 11 ++-- .../SecureBootConfigImpl.c | 3 +- 5 files changed, 10 insertions(+), 68 deletions(-) delete mode 100644 SecurityPkg/RandomNumberGenerator/RngDxe/Arm/ArmAlgo.c diff --git a/SecurityPkg/Library/SmmTcg2PhysicalPresenceLib/StandaloneMmTcg2PhysicalPresenceLib.inf b/SecurityPkg/Library/SmmTcg2PhysicalPresenceLib/StandaloneMmTcg2PhysicalPresenceLib.inf index f9a8faecc935..da92054dacfe 100644 --- a/SecurityPkg/Library/SmmTcg2PhysicalPresenceLib/StandaloneMmTcg2PhysicalPresenceLib.inf +++ b/SecurityPkg/Library/SmmTcg2PhysicalPresenceLib/StandaloneMmTcg2PhysicalPresenceLib.inf @@ -36,7 +36,7 @@ [Sources.IA32, Sources.X64] StandaloneMmTcg2PhysicalPresenceLib.c -[Sources.ARM, Sources.AARCH64] +[Sources.AARCH64] StandaloneMmTcg2PhysicalPresenceLibArm.c [Packages] @@ -64,7 +64,7 @@ [Pcd] gEfiSecurityPkgTokenSpaceGuid.PcdTcg2PhysicalPresenceFlags ## SOMETIMES_CONSUMES -[Pcd.ARM, Pcd.AARCH64] +[Pcd.AARCH64] gEfiSecurityPkgTokenSpaceGuid.PcdTcgPhysicalPresenceInterfaceVer [Depex] diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/Arm/ArmAlgo.c b/SecurityPkg/RandomNumberGenerator/RngDxe/Arm/ArmAlgo.c deleted file mode 100644 index 5e621df601fb..000000000000 --- a/SecurityPkg/RandomNumberGenerator/RngDxe/Arm/ArmAlgo.c +++ /dev/null @@ -1,51 +0,0 @@ -/** @file - Arm specific code. - - Copyright (c) 2022, Arm Limited. All rights reserved.
- SPDX-License-Identifier: BSD-2-Clause-Patent -**/ - -#include -#include -#include -#include -#include - -#include "RngDxeInternals.h" - -// Maximum number of Rng algorithms. -#define RNG_AVAILABLE_ALGO_MAX 1 - -/** Allocate and initialize mAvailableAlgoArray with the available - Rng algorithms. Also update mAvailableAlgoArrayCount. - - @retval EFI_SUCCESS The function completed successfully. - @retval EFI_OUT_OF_RESOURCES Could not allocate memory. -**/ -EFI_STATUS -EFIAPI -GetAvailableAlgorithms ( - VOID - ) -{ - UINT16 MajorRevision; - UINT16 MinorRevision; - - // Rng algorithms 2 times, one for the allocation, one to populate. - mAvailableAlgoArray = AllocateZeroPool (RNG_AVAILABLE_ALGO_MAX * sizeof (EFI_RNG_ALGORITHM)); - if (mAvailableAlgoArray == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - // Raw algorithm (Trng) - if (!EFI_ERROR (GetArmTrngVersion (&MajorRevision, &MinorRevision))) { - CopyMem ( - &mAvailableAlgoArray[mAvailableAlgoArrayCount], - &gEfiRngAlgorithmRaw, - sizeof (EFI_RNG_ALGORITHM) - ); - mAvailableAlgoArrayCount++; - } - - return EFI_SUCCESS; -} diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf index 8704a644414f..e22f3aff9301 100644 --- a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf +++ b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf @@ -28,7 +28,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 AARCH64 ARM +# VALID_ARCHITECTURES = IA32 X64 AARCH64 # [Sources.common] @@ -41,16 +41,13 @@ Rand/AesCore.c Rand/AesCore.h -[Sources.AARCH64, Sources.ARM] +[Sources.AARCH64] ArmRngDxe.c ArmTrng.c [Sources.AARCH64] AArch64/AArch64Algo.c -[Sources.ARM] - Arm/ArmAlgo.c - [Packages] MdeModulePkg/MdeModulePkg.dec MdePkg/MdePkg.dec @@ -65,7 +62,7 @@ TimerLib RngLib -[LibraryClasses.AARCH64, LibraryClasses.ARM] +[LibraryClasses.AARCH64] ArmTrngLib [Guids] diff --git a/SecurityPkg/SecurityPkg.dsc b/SecurityPkg/SecurityPkg.dsc index ea6fdc23678a..5639cb067c86 100644 --- a/SecurityPkg/SecurityPkg.dsc +++ b/SecurityPkg/SecurityPkg.dsc @@ -15,7 +15,7 @@ PLATFORM_VERSION = 0.98 DSC_SPECIFICATION = 0x00010005 OUTPUT_DIRECTORY = Build/SecurityPkg - SUPPORTED_ARCHITECTURES = IA32|X64|EBC|ARM|AARCH64|RISCV64|LOONGARCH64 + SUPPORTED_ARCHITECTURES = IA32|X64|EBC|AARCH64|RISCV64|LOONGARCH64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT @@ -89,15 +89,12 @@ PlatformLibWrapper|SecurityPkg/DeviceSecurity/OsStub/PlatformLibWrapper/PlatformLibWrapper.inf MemLibWrapper|SecurityPkg/DeviceSecurity/OsStub/MemLibWrapper/MemLibWrapper.inf -[LibraryClasses.ARM, LibraryClasses.AARCH64] +[LibraryClasses.AARCH64] ArmTrngLib|MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.inf ArmSmcLib|MdePkg/Library/ArmSmcLib/ArmSmcLib.inf ArmSvcLib|MdePkg/Library/ArmSvcLib/ArmSvcLib.inf ArmFfaLib|MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.inf -[LibraryClasses.ARM] - RngLib|MdeModulePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf - [LibraryClasses.RISCV64] RngLib|MdeModulePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf @@ -281,14 +278,14 @@ SecurityPkg/Library/TcgPpVendorLibNull/TcgPpVendorLibNull.inf SecurityPkg/Library/TcgEventLogRecordLib/TcgEventLogRecordLib.inf -[Components.IA32, Components.X64, Components.ARM, Components.AARCH64] +[Components.IA32, Components.X64, Components.AARCH64] SecurityPkg/Library/AuthVariableLib/AuthVariableLib.inf SecurityPkg/Library/SecureBootVariableLib/SecureBootVariableLib.inf SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.inf SecurityPkg/EnrollFromDefaultKeysApp/EnrollFromDefaultKeysApp.inf SecurityPkg/VariableAuthenticated/SecureBootDefaultKeysDxe/SecureBootDefaultKeysDxe.inf -[Components.IA32, Components.X64, Components.AARCH64, Components.ARM] +[Components.IA32, Components.X64, Components.AARCH64] # # Random Number Generator # diff --git a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c index d262904c3138..aad677b7d9bb 100644 --- a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c +++ b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c @@ -1798,8 +1798,7 @@ LoadPeImage ( // Note the size of FileHeader field is constant for both IA32 and X64 arch // if ( (NtHeader32->FileHeader.Machine == EFI_IMAGE_MACHINE_IA32) - || (NtHeader32->FileHeader.Machine == EFI_IMAGE_MACHINE_EBC) - || (NtHeader32->FileHeader.Machine == EFI_IMAGE_MACHINE_ARMTHUMB_MIXED)) + || (NtHeader32->FileHeader.Machine == EFI_IMAGE_MACHINE_EBC)) { // // 32-bits Architecture From 2b0ce49c507d261279d4757621951a3c01725c3d Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 07:53:55 -0700 Subject: [PATCH 0515/1172] PrmPkg: Drop ARM32 Support edk2 is dropping support for the ARM32 architecture. This removes support from PrmPkg. It also removes irrelevant VALID_ARCHITECTURES comments from infs that are not arch specific. Signed-off-by: Oliver Smith-Denny --- PrmPkg/Application/PrmInfo/PrmInfo.inf | 6 ------ PrmPkg/Readme.md | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/PrmPkg/Application/PrmInfo/PrmInfo.inf b/PrmPkg/Application/PrmInfo/PrmInfo.inf index df8fb9ccc0db..25c0d5b02271 100644 --- a/PrmPkg/Application/PrmInfo/PrmInfo.inf +++ b/PrmPkg/Application/PrmInfo/PrmInfo.inf @@ -18,12 +18,6 @@ UEFI_HII_RESOURCE_SECTION = TRUE MODULE_UNI_FILE = PrmInfo.uni -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] PrmInfoStrings.uni PrmInfo.h diff --git a/PrmPkg/Readme.md b/PrmPkg/Readme.md index 557cb9cbeffa..85e6bd352436 100644 --- a/PrmPkg/Readme.md +++ b/PrmPkg/Readme.md @@ -53,7 +53,7 @@ To build `PrmPkg` as a standalone package: 5. Build PrmPkg \ -The PrmPkg can be built targeting the X64 and AArch64 architectures. PRM is not supported on IA32 and ARM primarily +The PrmPkg can be built targeting the X64 and AArch64 architectures. PRM is not supported on IA32 primarily because the OS support for PRM is only in 64 bit OSes. In addition, the MSVC toolchain does not support export tables on IA32 with the unique UEFI configuration required. From 470a80094c7bea460cfb66d2b804d7404ada3345 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 07:55:14 -0700 Subject: [PATCH 0516/1172] RedfishPkg: Drop ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit drops ARM32 code from RedfishPkg. This also drops irrelevant VALID_ARCHITECTURES comments in infs that are not arch specific. Signed-off-by: Oliver Smith-Denny --- RedfishPkg/Include/Library/RedfishCrtLib.h | 8 +------- RedfishPkg/Library/BaseUcs2Utf8Lib/BaseUcs2Utf8Lib.inf | 4 ---- RedfishPkg/Library/JsonLib/JsonLib.inf | 4 ---- .../PlatformCredentialLibNull.inf | 4 ---- .../PlatformHostInterfaceLibNull.inf | 4 ---- .../RedfishContentCodingLibNull.inf | 4 ---- .../RedfishPlatformWantedDeviceLibNull.inf | 4 ---- RedfishPkg/PrivateLibrary/RedfishCrtLib/RedfishCrtLib.inf | 2 +- RedfishPkg/PrivateLibrary/RedfishLib/RedfishLib.inf | 4 ---- .../RedfishConfigHandler/RedfishConfigHandlerDriver.inf | 4 ---- RedfishPkg/RedfishCredentialDxe/RedfishCredentialDxe.inf | 4 ---- .../RedfishHostInterfaceDxe/RedfishHostInterfaceDxe.inf | 4 ---- 12 files changed, 2 insertions(+), 48 deletions(-) diff --git a/RedfishPkg/Include/Library/RedfishCrtLib.h b/RedfishPkg/Include/Library/RedfishCrtLib.h index f2aefbbf5c61..7a706e68f542 100644 --- a/RedfishPkg/Include/Library/RedfishCrtLib.h +++ b/RedfishPkg/Include/Library/RedfishCrtLib.h @@ -34,23 +34,17 @@ // 64-bit. Since using 'long long' works fine on GCC too, just do that. // #define SIXTY_FOUR_BIT -#elif defined (MDE_CPU_IA32) || defined (MDE_CPU_ARM) || defined (MDE_CPU_EBC) +#elif defined (MDE_CPU_IA32) || defined (MDE_CPU_EBC) #define THIRTY_TWO_BIT #endif // // Map all va_xxxx elements to VA_xxx defined in MdePkg/Include/Base.h // -#if !defined (__CC_ARM) // if va_list is not already defined #define va_list VA_LIST #define va_arg VA_ARG #define va_start VA_START #define va_end VA_END -#else // __CC_ARM -#define va_start(Marker, Parameter) __va_start(Marker, Parameter) -#define va_arg(Marker, TYPE) __va_arg(Marker, TYPE) -#define va_end(Marker) ((void)0) -#endif // // Definitions for global constants used by CRT library routines diff --git a/RedfishPkg/Library/BaseUcs2Utf8Lib/BaseUcs2Utf8Lib.inf b/RedfishPkg/Library/BaseUcs2Utf8Lib/BaseUcs2Utf8Lib.inf index beb7e778929d..409bcfe24560 100644 --- a/RedfishPkg/Library/BaseUcs2Utf8Lib/BaseUcs2Utf8Lib.inf +++ b/RedfishPkg/Library/BaseUcs2Utf8Lib/BaseUcs2Utf8Lib.inf @@ -16,10 +16,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = Ucs2Utf8Lib -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 -# - [Sources] BaseUcs2Utf8Lib.c diff --git a/RedfishPkg/Library/JsonLib/JsonLib.inf b/RedfishPkg/Library/JsonLib/JsonLib.inf index d7cfc0b01641..a62da9a6d898 100644 --- a/RedfishPkg/Library/JsonLib/JsonLib.inf +++ b/RedfishPkg/Library/JsonLib/JsonLib.inf @@ -17,10 +17,6 @@ LIBRARY_CLASS = JsonLib|DXE_DRIVER UEFI_APPLICATION UEFI_DRIVER CONSTRUCTOR = JsonLibConstructor -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 -# - [Sources] # # Below are the source code of third diff --git a/RedfishPkg/Library/PlatformCredentialLibNull/PlatformCredentialLibNull.inf b/RedfishPkg/Library/PlatformCredentialLibNull/PlatformCredentialLibNull.inf index 4c22e89718bf..cd82b4946f8f 100644 --- a/RedfishPkg/Library/PlatformCredentialLibNull/PlatformCredentialLibNull.inf +++ b/RedfishPkg/Library/PlatformCredentialLibNull/PlatformCredentialLibNull.inf @@ -15,10 +15,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = RedfishPlatformCredentialLib -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 -# - [Sources] PlatformCredentialLibNull.c diff --git a/RedfishPkg/Library/PlatformHostInterfaceLibNull/PlatformHostInterfaceLibNull.inf b/RedfishPkg/Library/PlatformHostInterfaceLibNull/PlatformHostInterfaceLibNull.inf index b42e5335ee90..c0231eb3091c 100644 --- a/RedfishPkg/Library/PlatformHostInterfaceLibNull/PlatformHostInterfaceLibNull.inf +++ b/RedfishPkg/Library/PlatformHostInterfaceLibNull/PlatformHostInterfaceLibNull.inf @@ -15,10 +15,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = RedfishPlatformHostInterfaceLib -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 -# - [Sources] PlatformHostInterfaceLibNull.c diff --git a/RedfishPkg/Library/RedfishContentCodingLibNull/RedfishContentCodingLibNull.inf b/RedfishPkg/Library/RedfishContentCodingLibNull/RedfishContentCodingLibNull.inf index d8c5cb583ed0..54488359adb8 100644 --- a/RedfishPkg/Library/RedfishContentCodingLibNull/RedfishContentCodingLibNull.inf +++ b/RedfishPkg/Library/RedfishContentCodingLibNull/RedfishContentCodingLibNull.inf @@ -16,10 +16,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = RedfishContentCodingLib -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 -# - [Sources] RedfishContentCodingLibNull.c diff --git a/RedfishPkg/Library/RedfishPlatformWantedDeviceLibNull/RedfishPlatformWantedDeviceLibNull.inf b/RedfishPkg/Library/RedfishPlatformWantedDeviceLibNull/RedfishPlatformWantedDeviceLibNull.inf index 1cad2950ec8f..30deb7505230 100644 --- a/RedfishPkg/Library/RedfishPlatformWantedDeviceLibNull/RedfishPlatformWantedDeviceLibNull.inf +++ b/RedfishPkg/Library/RedfishPlatformWantedDeviceLibNull/RedfishPlatformWantedDeviceLibNull.inf @@ -15,10 +15,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = RedfishPlatformWantedDeviceLib -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 -# - [Sources] RedfishPlatformWantedDeviceLibNull.c diff --git a/RedfishPkg/PrivateLibrary/RedfishCrtLib/RedfishCrtLib.inf b/RedfishPkg/PrivateLibrary/RedfishCrtLib/RedfishCrtLib.inf index 3a5e309d1ae5..be39f67ec493 100644 --- a/RedfishPkg/PrivateLibrary/RedfishCrtLib/RedfishCrtLib.inf +++ b/RedfishPkg/PrivateLibrary/RedfishCrtLib/RedfishCrtLib.inf @@ -18,7 +18,7 @@ LIBRARY_CLASS = RedfishCrtLib|DXE_DRIVER UEFI_APPLICATION UEFI_DRIVER # -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 +# VALID_ARCHITECTURES = IA32 X64 AARCH64 RISCV64 # [Sources] diff --git a/RedfishPkg/PrivateLibrary/RedfishLib/RedfishLib.inf b/RedfishPkg/PrivateLibrary/RedfishLib/RedfishLib.inf index 124ecb1e3aae..c9bc8b2914ed 100644 --- a/RedfishPkg/PrivateLibrary/RedfishLib/RedfishLib.inf +++ b/RedfishPkg/PrivateLibrary/RedfishLib/RedfishLib.inf @@ -17,10 +17,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = RedfishLib| DXE_DRIVER UEFI_APPLICATION UEFI_DRIVER -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 -# - [Sources] edk2libredfish/src/redpath.c edk2libredfish/src/service.c diff --git a/RedfishPkg/RedfishConfigHandler/RedfishConfigHandlerDriver.inf b/RedfishPkg/RedfishConfigHandler/RedfishConfigHandlerDriver.inf index 40ce0561379f..c45bbe70d738 100644 --- a/RedfishPkg/RedfishConfigHandler/RedfishConfigHandlerDriver.inf +++ b/RedfishPkg/RedfishConfigHandler/RedfishConfigHandlerDriver.inf @@ -19,10 +19,6 @@ ENTRY_POINT = RedfishConfigHandlerDriverEntryPoint UNLOAD_IMAGE = RedfishConfigHandlerDriverUnload -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 -# - [Packages] MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec diff --git a/RedfishPkg/RedfishCredentialDxe/RedfishCredentialDxe.inf b/RedfishPkg/RedfishCredentialDxe/RedfishCredentialDxe.inf index c872aa8da3cb..51ba7d452254 100644 --- a/RedfishPkg/RedfishCredentialDxe/RedfishCredentialDxe.inf +++ b/RedfishPkg/RedfishCredentialDxe/RedfishCredentialDxe.inf @@ -17,10 +17,6 @@ ENTRY_POINT = RedfishCredentialDxeDriverEntryPoint UNLOAD_IMAGE = RedfishCredentialDxeDriverUnload -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 -# - [Sources] RedfishCredentialDxe.c RedfishCredentialDxe.h diff --git a/RedfishPkg/RedfishHostInterfaceDxe/RedfishHostInterfaceDxe.inf b/RedfishPkg/RedfishHostInterfaceDxe/RedfishHostInterfaceDxe.inf index f969e75463f6..49b297457414 100644 --- a/RedfishPkg/RedfishHostInterfaceDxe/RedfishHostInterfaceDxe.inf +++ b/RedfishPkg/RedfishHostInterfaceDxe/RedfishHostInterfaceDxe.inf @@ -19,10 +19,6 @@ VERSION_STRING = 1.0 ENTRY_POINT = RedfishHostInterfaceDxeEntryPoint -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 -# - [Sources] RedfishHostInterfaceDxe.c From 1764d4eb2b1cc9e77640453e8465ddb107ea2b1c Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 07:56:45 -0700 Subject: [PATCH 0517/1172] NetworkPkg: Drop ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from NetworkPkg. This also drops irrelevant VALID_ARCHITECTURES comments from infs that are not arch specific. Signed-off-by: Oliver Smith-Denny --- NetworkPkg/HttpBootDxe/HttpBootDhcp4.h | 2 -- NetworkPkg/Library/DxeHttpIoLib/DxeHttpIoLib.inf | 6 ------ NetworkPkg/Network.dsc.inc | 2 +- NetworkPkg/NetworkPkg.dsc | 5 +---- NetworkPkg/Test/NetworkPkgHostTest.dsc | 3 --- 5 files changed, 2 insertions(+), 16 deletions(-) diff --git a/NetworkPkg/HttpBootDxe/HttpBootDhcp4.h b/NetworkPkg/HttpBootDxe/HttpBootDhcp4.h index f00fabead252..2c1c76e12fb4 100644 --- a/NetworkPkg/HttpBootDxe/HttpBootDhcp4.h +++ b/NetworkPkg/HttpBootDxe/HttpBootDhcp4.h @@ -33,8 +33,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_IA32 #elif defined (MDE_CPU_X64) #define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_X64 -#elif defined (MDE_CPU_ARM) -#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_ARM #elif defined (MDE_CPU_AARCH64) #define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_AARCH64 #elif defined (MDE_CPU_RISCV64) diff --git a/NetworkPkg/Library/DxeHttpIoLib/DxeHttpIoLib.inf b/NetworkPkg/Library/DxeHttpIoLib/DxeHttpIoLib.inf index 347f8d5508c4..80bf21398609 100644 --- a/NetworkPkg/Library/DxeHttpIoLib/DxeHttpIoLib.inf +++ b/NetworkPkg/Library/DxeHttpIoLib/DxeHttpIoLib.inf @@ -15,12 +15,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = HttpIoLib| DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARM64 RISCV64 -# - [Sources] DxeHttpIoLib.c diff --git a/NetworkPkg/Network.dsc.inc b/NetworkPkg/Network.dsc.inc index 89db8b7d038a..57495a6d6968 100644 --- a/NetworkPkg/Network.dsc.inc +++ b/NetworkPkg/Network.dsc.inc @@ -42,7 +42,7 @@ !include NetworkPkg/NetworkComponents.dsc.inc !else -[Components.IA32, Components.X64, Components.ARM, Components.AARCH64, Components.RISCV64, Components.LOONGARCH64] +[Components.IA32, Components.X64, Components.AARCH64, Components.RISCV64, Components.LOONGARCH64] !include NetworkPkg/NetworkComponents.dsc.inc !endif diff --git a/NetworkPkg/NetworkPkg.dsc b/NetworkPkg/NetworkPkg.dsc index b3710bf07aca..a1dc3f3eabe1 100644 --- a/NetworkPkg/NetworkPkg.dsc +++ b/NetworkPkg/NetworkPkg.dsc @@ -15,7 +15,7 @@ PLATFORM_VERSION = 0.98 DSC_SPECIFICATION = 0x00010005 OUTPUT_DIRECTORY = Build/NetworkPkg - SUPPORTED_ARCHITECTURES = IA32|X64|EBC|ARM|AARCH64|RISCV64|LOONGARCH64 + SUPPORTED_ARCHITECTURES = IA32|X64|EBC|AARCH64|RISCV64|LOONGARCH64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT @@ -71,9 +71,6 @@ DebugLib|MdePkg/Library/UefiDebugLibStdErr/UefiDebugLibStdErr.inf ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf -[LibraryClasses.ARM] - RngLib|MdeModulePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf - [LibraryClasses.RISCV64] RngLib|MdeModulePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf diff --git a/NetworkPkg/Test/NetworkPkgHostTest.dsc b/NetworkPkg/Test/NetworkPkgHostTest.dsc index 667be9558724..7a46be74a7c3 100644 --- a/NetworkPkg/Test/NetworkPkgHostTest.dsc +++ b/NetworkPkg/Test/NetworkPkgHostTest.dsc @@ -88,9 +88,6 @@ DebugLib|MdePkg/Library/UefiDebugLibStdErr/UefiDebugLibStdErr.inf ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf -[LibraryClasses.ARM] - RngLib|MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf - [LibraryClasses.RISCV64] RngLib|MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf From 2c059facb3772be3ce8a05fccf26323d935719aa Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 07:57:28 -0700 Subject: [PATCH 0518/1172] FmpDevicePkg: Drop ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from FmpDevicePkg. This also drops irrelevant VALID_ARCHITECTURES comments from infs that are not arch specific. Signed-off-by: Oliver Smith-Denny --- FmpDevicePkg/FmpDevicePkg.dsc | 2 +- FmpDevicePkg/FmpDxe/FmpDxe.inf | 6 ------ FmpDevicePkg/FmpDxe/FmpDxeLib.inf | 6 ------ .../CapsuleUpdatePolicyLibNull.inf | 4 ---- .../CapsuleUpdatePolicyLibOnProtocol.inf | 4 ---- .../Library/FmpDependencyCheckLib/FmpDependencyCheckLib.inf | 6 ------ .../FmpDependencyCheckLibNull/FmpDependencyCheckLibNull.inf | 6 ------ .../FmpDependencyDeviceLibNull.inf | 2 +- FmpDevicePkg/Library/FmpDependencyLib/FmpDependencyLib.inf | 6 ------ FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull.inf | 2 +- .../Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.inf | 4 ---- 11 files changed, 3 insertions(+), 45 deletions(-) diff --git a/FmpDevicePkg/FmpDevicePkg.dsc b/FmpDevicePkg/FmpDevicePkg.dsc index f7cadb2e4bfa..b6f8576519e8 100644 --- a/FmpDevicePkg/FmpDevicePkg.dsc +++ b/FmpDevicePkg/FmpDevicePkg.dsc @@ -21,7 +21,7 @@ PLATFORM_VERSION = 0.1 DSC_SPECIFICATION = 0x00010005 OUTPUT_DIRECTORY = Build/FmpDevicePkg - SUPPORTED_ARCHITECTURES = IA32|X64|ARM|AARCH64|RISCV64|LOONGARCH64 + SUPPORTED_ARCHITECTURES = IA32|X64|AARCH64|RISCV64|LOONGARCH64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT diff --git a/FmpDevicePkg/FmpDxe/FmpDxe.inf b/FmpDevicePkg/FmpDxe/FmpDxe.inf index d7a02733dece..659c3bc050a6 100755 --- a/FmpDevicePkg/FmpDxe/FmpDxe.inf +++ b/FmpDevicePkg/FmpDxe/FmpDxe.inf @@ -20,12 +20,6 @@ ENTRY_POINT = FmpDxeEntryPoint UNLOAD_IMAGE = UninstallFmpInstance -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] FmpDxe.c FmpDxe.h diff --git a/FmpDevicePkg/FmpDxe/FmpDxeLib.inf b/FmpDevicePkg/FmpDxe/FmpDxeLib.inf index 9a93b5e6ac40..6ab9eef0feb0 100644 --- a/FmpDevicePkg/FmpDxe/FmpDxeLib.inf +++ b/FmpDevicePkg/FmpDxe/FmpDxeLib.inf @@ -20,12 +20,6 @@ CONSTRUCTOR = FmpDxeEntryPoint DESTRUCTOR = FmpDxeLibDestructor -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] FmpDxe.c FmpDxe.h diff --git a/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibNull.inf b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibNull.inf index 56678ffd3f09..db0355ff7cf6 100644 --- a/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibNull.inf +++ b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibNull.inf @@ -16,10 +16,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = CapsuleUpdatePolicyLib -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] CapsuleUpdatePolicyLibNull.c diff --git a/FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdatePolicyLibOnProtocol.inf b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdatePolicyLibOnProtocol.inf index a56b836d22b7..73555e8fd80e 100644 --- a/FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdatePolicyLibOnProtocol.inf +++ b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibOnProtocol/CapsuleUpdatePolicyLibOnProtocol.inf @@ -20,10 +20,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = CapsuleUpdatePolicyLib -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] CapsuleUpdatePolicyLibOnProtocol.c diff --git a/FmpDevicePkg/Library/FmpDependencyCheckLib/FmpDependencyCheckLib.inf b/FmpDevicePkg/Library/FmpDependencyCheckLib/FmpDependencyCheckLib.inf index 2050cc64903c..0fea2cbe1569 100644 --- a/FmpDevicePkg/Library/FmpDependencyCheckLib/FmpDependencyCheckLib.inf +++ b/FmpDevicePkg/Library/FmpDependencyCheckLib/FmpDependencyCheckLib.inf @@ -16,12 +16,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = FmpDependencyCheckLib|DXE_DRIVER UEFI_DRIVER UEFI_APPLICATION -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] FmpDependencyCheckLib.c diff --git a/FmpDevicePkg/Library/FmpDependencyCheckLibNull/FmpDependencyCheckLibNull.inf b/FmpDevicePkg/Library/FmpDependencyCheckLibNull/FmpDependencyCheckLibNull.inf index 5794d8919168..a6127452772b 100644 --- a/FmpDevicePkg/Library/FmpDependencyCheckLibNull/FmpDependencyCheckLibNull.inf +++ b/FmpDevicePkg/Library/FmpDependencyCheckLibNull/FmpDependencyCheckLibNull.inf @@ -16,12 +16,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = FmpDependencyCheckLib|DXE_DRIVER UEFI_DRIVER UEFI_APPLICATION -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] FmpDependencyCheckLibNull.c diff --git a/FmpDevicePkg/Library/FmpDependencyDeviceLibNull/FmpDependencyDeviceLibNull.inf b/FmpDevicePkg/Library/FmpDependencyDeviceLibNull/FmpDependencyDeviceLibNull.inf index d318cc9a67e3..5874346d7826 100644 --- a/FmpDevicePkg/Library/FmpDependencyDeviceLibNull/FmpDependencyDeviceLibNull.inf +++ b/FmpDevicePkg/Library/FmpDependencyDeviceLibNull/FmpDependencyDeviceLibNull.inf @@ -18,7 +18,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# VALID_ARCHITECTURES = IA32 X64 AARCH64 # [Sources] diff --git a/FmpDevicePkg/Library/FmpDependencyLib/FmpDependencyLib.inf b/FmpDevicePkg/Library/FmpDependencyLib/FmpDependencyLib.inf index b7e5c8d00284..ea403142f2b1 100644 --- a/FmpDevicePkg/Library/FmpDependencyLib/FmpDependencyLib.inf +++ b/FmpDevicePkg/Library/FmpDependencyLib/FmpDependencyLib.inf @@ -15,12 +15,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = FmpDependencyLib -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] FmpDependencyLib.c diff --git a/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull.inf b/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull.inf index 9c77e5bde0aa..2a0d8891d031 100644 --- a/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull.inf +++ b/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull.inf @@ -20,7 +20,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# VALID_ARCHITECTURES = IA32 X64 AARCH64 # [Sources] diff --git a/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.inf b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.inf index 0d6692dcece5..2e24b9bf61b8 100644 --- a/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.inf +++ b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.inf @@ -19,10 +19,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = FmpPayloadHeaderLib|DXE_DRIVER UEFI_DRIVER UEFI_APPLICATION -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] FmpPayloadHeaderLib.c From 45fde549482bc72fa90ca583475e1813bcc87cb7 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 07:58:13 -0700 Subject: [PATCH 0519/1172] EmbeddedPkg: Drop ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from EmbeddedPkg. This also drops irrelevant VALID_ARCHITECTURES comments from infs that are not arch specific. Signed-off-by: Oliver Smith-Denny --- .../AndroidBoot/AndroidBootApp.inf | 2 +- .../AndroidFastboot/AndroidFastbootApp.inf | 4 +- .../Drivers/ConsolePrefDxe/ConsolePrefDxe.inf | 6 - .../Drivers/DtPlatformDxe/DtPlatformDxe.inf | 6 - .../VirtualKeyboardDxe/VirtualKeyboardDxe.inf | 9 - EmbeddedPkg/EmbeddedPkg.dec | 3 - EmbeddedPkg/EmbeddedPkg.dsc | 8 +- EmbeddedPkg/GdbStub/Arm/Processor.c | 682 ------------------ EmbeddedPkg/GdbStub/GdbStub.inf | 3 - EmbeddedPkg/GdbStub/GdbStubInternal.h | 2 - .../AndroidBootImgLib/AndroidBootImgLib.inf | 6 - .../PrePiMemoryAllocationLib.inf | 5 - 12 files changed, 7 insertions(+), 729 deletions(-) delete mode 100644 EmbeddedPkg/GdbStub/Arm/Processor.c diff --git a/EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.inf b/EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.inf index 8ce100f34e72..dd92ca493d5f 100644 --- a/EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.inf +++ b/EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.inf @@ -47,7 +47,7 @@ MdeModulePkg/MdeModulePkg.dec MdePkg/MdePkg.dec -[Packages.ARM, Packages.AARCH64] +[Packages.AARCH64] ArmPkg/ArmPkg.dec ArmPlatformPkg/ArmPlatformPkg.dec diff --git a/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.inf b/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.inf index c80a029fd1f1..535bf2495f93 100644 --- a/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.inf +++ b/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.inf @@ -19,7 +19,7 @@ AndroidFastbootApp.c AndroidBootImg.c -[Sources.ARM, Sources.AARCH64] +[Sources.AARCH64] Arm/BootAndroidBootImg.c [LibraryClasses] @@ -48,6 +48,6 @@ MdeModulePkg/MdeModulePkg.dec EmbeddedPkg/EmbeddedPkg.dec -[Packages.ARM, Packages.AARCH64] +[Packages.AARCH64] ArmPkg/ArmPkg.dec ArmPlatformPkg/ArmPlatformPkg.dec diff --git a/EmbeddedPkg/Drivers/ConsolePrefDxe/ConsolePrefDxe.inf b/EmbeddedPkg/Drivers/ConsolePrefDxe/ConsolePrefDxe.inf index 050e00ca871d..9dddd0d78397 100644 --- a/EmbeddedPkg/Drivers/ConsolePrefDxe/ConsolePrefDxe.inf +++ b/EmbeddedPkg/Drivers/ConsolePrefDxe/ConsolePrefDxe.inf @@ -14,12 +14,6 @@ VERSION_STRING = 1.0 ENTRY_POINT = ConsolePrefDxeEntryPoint -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] ConsolePrefDxe.c ConsolePrefHii.vfr diff --git a/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf b/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf index 450ea29b4a26..79a28ff68e79 100644 --- a/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf +++ b/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf @@ -14,12 +14,6 @@ VERSION_STRING = 1.0 ENTRY_POINT = DtPlatformDxeEntryPoint -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] DtPlatformDxe.c DtPlatformHii.vfr diff --git a/EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboardDxe.inf b/EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboardDxe.inf index bb678f06767a..71a7a2761d36 100644 --- a/EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboardDxe.inf +++ b/EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboardDxe.inf @@ -16,15 +16,6 @@ VERSION_STRING = 1.0 ENTRY_POINT = InitializeVirtualKeyboard -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# -# DRIVER_BINDING = gVirtualKeyboardDriverBinding -# COMPONENT_NAME = gVirtualKeyboardComponentName -# - [Sources.common] ComponentName.c VirtualKeyboard.c diff --git a/EmbeddedPkg/EmbeddedPkg.dec b/EmbeddedPkg/EmbeddedPkg.dec index 666bd710919b..823665189a25 100644 --- a/EmbeddedPkg/EmbeddedPkg.dec +++ b/EmbeddedPkg/EmbeddedPkg.dec @@ -149,9 +149,6 @@ gEmbeddedTokenSpaceGuid.PcdAndroidBootDevicePath|L""|VOID*|0x00000057 -[PcdsFixedAtBuild.ARM] - gEmbeddedTokenSpaceGuid.PcdPrePiCpuIoSize|0|UINT8|0x00000011 - [PcdsFixedAtBuild.AARCH64] gEmbeddedTokenSpaceGuid.PcdPrePiCpuIoSize|0|UINT8|0x00000011 diff --git a/EmbeddedPkg/EmbeddedPkg.dsc b/EmbeddedPkg/EmbeddedPkg.dsc index 4334dd24473c..d9ae13ef4ac2 100644 --- a/EmbeddedPkg/EmbeddedPkg.dsc +++ b/EmbeddedPkg/EmbeddedPkg.dsc @@ -21,7 +21,7 @@ PLATFORM_VERSION = 0.1 DSC_SPECIFICATION = 0x00010005 OUTPUT_DIRECTORY = Build/Embedded - SUPPORTED_ARCHITECTURES = IA32|X64|ARM|AARCH64 + SUPPORTED_ARCHITECTURES = IA32|X64|AARCH64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT @@ -123,7 +123,7 @@ [LibraryClasses.common.SEC] ExtractGuidedSectionLib|EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.inf -[LibraryClasses.ARM, LibraryClasses.AARCH64] +[LibraryClasses.AARCH64] ArmSmcLib|MdePkg/Library/ArmSmcLib/ArmSmcLib.inf SemihostLib|ArmPkg/Library/SemihostLib/SemihostLib.inf @@ -238,11 +238,11 @@ DmaLib|EmbeddedPkg/Library/NonCoherentDmaLib/NonCoherentDmaLib.inf } -[Components.ARM, Components.AARCH64] +[Components.AARCH64] EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.inf EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.inf EmbeddedPkg/Drivers/AndroidFastbootTransportUsbDxe/FastbootTransportUsbDxe.inf EmbeddedPkg/Drivers/AndroidFastbootTransportTcpDxe/FastbootTransportTcpDxe.inf -[Components.IA32, Components.X64, Components.ARM] +[Components.IA32, Components.X64] EmbeddedPkg/GdbStub/GdbStub.inf diff --git a/EmbeddedPkg/GdbStub/Arm/Processor.c b/EmbeddedPkg/GdbStub/Arm/Processor.c deleted file mode 100644 index ed91b6b561d9..000000000000 --- a/EmbeddedPkg/GdbStub/Arm/Processor.c +++ /dev/null @@ -1,682 +0,0 @@ -/** @file - Processor specific parts of the GDB stub - - Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
- - SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include -#include -#include - -// -// Array of exception types that need to be hooked by the debugger -// (efi, gdb) //efi number -// -EFI_EXCEPTION_TYPE_ENTRY gExceptionType[] = { - { EXCEPT_ARM_SOFTWARE_INTERRUPT, GDB_SIGTRAP } - // { EXCEPT_ARM_UNDEFINED_INSTRUCTION, GDB_SIGTRAP }, - // { EXCEPT_ARM_PREFETCH_ABORT, GDB_SIGTRAP }, - // { EXCEPT_ARM_DATA_ABORT, GDB_SIGEMT }, - // { EXCEPT_ARM_RESERVED, GDB_SIGILL } -}; - -UINTN gRegisterOffsets[] = { - OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R0), - OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R1), - OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R2), - OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R3), - OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R4), - OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R5), - OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R6), - OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R7), - OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R8), - OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R9), - OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R10), - OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R11), - OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, R12), - OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, SP), - OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, LR), - OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, PC), - 0x00000F01, // f0 - 0x00000F02, - 0x00000F03, - 0x00000F11, // f1 - 0x00000F12, - 0x00000F13, - 0x00000F21, // f2 - 0x00000F22, - 0x00000F23, - 0x00000F31, // f3 - 0x00000F32, - 0x00000F33, - 0x00000F41, // f4 - 0x00000F42, - 0x00000F43, - 0x00000F51, // f5 - 0x00000F52, - 0x00000F53, - 0x00000F61, // f6 - 0x00000F62, - 0x00000F63, - 0x00000F71, // f7 - 0x00000F72, - 0x00000F73, - 0x00000FFF, // fps - OFFSET_OF (EFI_SYSTEM_CONTEXT_ARM, CPSR) -}; - -/** - Return the number of entries in the gExceptionType[] - - @retval UINTN, the number of entries in the gExceptionType[] array. - **/ -UINTN -MaxEfiException ( - VOID - ) -{ - return sizeof (gExceptionType) / sizeof (EFI_EXCEPTION_TYPE_ENTRY); -} - -/** - Return the number of entries in the gRegisters[] - - @retval UINTN, the number of entries (registers) in the gRegisters[] array. - **/ -UINTN -MaxRegisterCount ( - VOID - ) -{ - return sizeof (gRegisterOffsets) / sizeof (UINTN); -} - -/** - Check to see if the ISA is supported. - ISA = Instruction Set Architecture - - @retval TRUE if Isa is supported - -**/ -BOOLEAN -CheckIsa ( - IN EFI_INSTRUCTION_SET_ARCHITECTURE Isa - ) -{ - if (Isa == IsaArm) { - return TRUE; - } else { - return FALSE; - } -} - -/** - This takes in the register number and the System Context, and returns a pointer to the RegNumber-th register in gdb ordering - It is, by default, set to find the register pointer of the ARM member - @param SystemContext Register content at time of the exception - @param RegNumber The register to which we want to find a pointer - @retval the pointer to the RegNumber-th pointer - **/ -UINTN * -FindPointerToRegister ( - IN EFI_SYSTEM_CONTEXT SystemContext, - IN UINTN RegNumber - ) -{ - UINT8 *TempPtr; - - ASSERT (gRegisterOffsets[RegNumber] < 0xF00); - TempPtr = ((UINT8 *)SystemContext.SystemContextArm) + gRegisterOffsets[RegNumber]; - return (UINT32 *)TempPtr; -} - -/** - Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr - @param SystemContext Register content at time of the exception - @param RegNumber the number of the register that we want to read - @param OutBufPtr pointer to the output buffer's end. the new data will be added from this point on. - @retval the pointer to the next character of the output buffer that is available to be written on. - **/ -CHAR8 * -BasicReadRegister ( - IN EFI_SYSTEM_CONTEXT SystemContext, - IN UINTN RegNumber, - IN CHAR8 *OutBufPtr - ) -{ - UINTN RegSize; - CHAR8 Char; - - if (gRegisterOffsets[RegNumber] > 0xF00) { - AsciiSPrint (OutBufPtr, 9, "00000000"); - OutBufPtr += 8; - return OutBufPtr; - } - - RegSize = 0; - while (RegSize < 32) { - Char = mHexToStr[(UINT8)((*FindPointerToRegister (SystemContext, RegNumber) >> (RegSize+4)) & 0xf)]; - if ((Char >= 'A') && (Char <= 'F')) { - Char = Char - 'A' + 'a'; - } - - *OutBufPtr++ = Char; - - Char = mHexToStr[(UINT8)((*FindPointerToRegister (SystemContext, RegNumber) >> RegSize) & 0xf)]; - if ((Char >= 'A') && (Char <= 'F')) { - Char = Char - 'A' + 'a'; - } - - *OutBufPtr++ = Char; - - RegSize = RegSize + 8; - } - - return OutBufPtr; -} - -/** - Reads the n-th register's value into an output buffer and sends it as a packet - @param SystemContext Register content at time of the exception - @param InBuffer Pointer to the input buffer received from gdb server - **/ -VOID -ReadNthRegister ( - IN EFI_SYSTEM_CONTEXT SystemContext, - IN CHAR8 *InBuffer - ) -{ - UINTN RegNumber; - CHAR8 OutBuffer[9]; // 1 reg=8 hex chars, and the end '\0' (escape seq) - CHAR8 *OutBufPtr; // pointer to the output buffer - - RegNumber = AsciiStrHexToUintn (&InBuffer[1]); - - if (RegNumber >= MaxRegisterCount ()) { - SendError (GDB_EINVALIDREGNUM); - return; - } - - OutBufPtr = OutBuffer; - OutBufPtr = BasicReadRegister (SystemContext, RegNumber, OutBufPtr); - - *OutBufPtr = '\0'; // the end of the buffer - SendPacket (OutBuffer); -} - -/** - Reads the general registers into an output buffer and sends it as a packet - @param SystemContext Register content at time of the exception - **/ -VOID -EFIAPI -ReadGeneralRegisters ( - IN EFI_SYSTEM_CONTEXT SystemContext - ) -{ - UINTN Index; - CHAR8 *OutBuffer; - CHAR8 *OutBufPtr; - UINTN RegisterCount = MaxRegisterCount (); - - // It is not safe to allocate pool here.... - OutBuffer = AllocatePool ((RegisterCount * 8) + 1); // 8 bytes per register in string format plus a null to terminate - OutBufPtr = OutBuffer; - for (Index = 0; Index < RegisterCount; Index++) { - OutBufPtr = BasicReadRegister (SystemContext, Index, OutBufPtr); - } - - *OutBufPtr = '\0'; - SendPacket (OutBuffer); - FreePool (OutBuffer); -} - -/** - Adds the RegNumber-th register's value to the output buffer, starting at the given OutBufPtr - @param SystemContext Register content at time of the exception - @param RegNumber the number of the register that we want to write - @param InBufPtr pointer to the output buffer. the new data will be extracted from the input buffer from this point on. - @retval the pointer to the next character of the input buffer that can be used - **/ -CHAR8 -* -BasicWriteRegister ( - IN EFI_SYSTEM_CONTEXT SystemContext, - IN UINTN RegNumber, - IN CHAR8 *InBufPtr - ) -{ - UINTN RegSize; - UINTN TempValue; // the value transferred from a hex char - UINT32 NewValue; // the new value of the RegNumber-th Register - - if (gRegisterOffsets[RegNumber] > 0xF00) { - return InBufPtr + 8; - } - - NewValue = 0; - RegSize = 0; - while (RegSize < 32) { - TempValue = HexCharToInt (*InBufPtr++); - - if ((INTN)TempValue < 0) { - SendError (GDB_EBADMEMDATA); - return NULL; - } - - NewValue += (TempValue << (RegSize+4)); - TempValue = HexCharToInt (*InBufPtr++); - - if ((INTN)TempValue < 0) { - SendError (GDB_EBADMEMDATA); - return NULL; - } - - NewValue += (TempValue << RegSize); - RegSize = RegSize + 8; - } - - *(FindPointerToRegister (SystemContext, RegNumber)) = NewValue; - return InBufPtr; -} - -/** ‘P n...=r...’ - Writes the new value of n-th register received into the input buffer to the n-th register - @param SystemContext Register content at time of the exception - @param InBuffer Pointer to the input buffer received from gdb server - **/ -VOID -WriteNthRegister ( - IN EFI_SYSTEM_CONTEXT SystemContext, - IN CHAR8 *InBuffer - ) -{ - UINTN RegNumber; - CHAR8 RegNumBuffer[MAX_REG_NUM_BUF_SIZE]; // put the 'n..' part of the message into this array - CHAR8 *RegNumBufPtr; - CHAR8 *InBufPtr; // pointer to the input buffer - - // find the register number to write - InBufPtr = &InBuffer[1]; - RegNumBufPtr = RegNumBuffer; - while (*InBufPtr != '=') { - *RegNumBufPtr++ = *InBufPtr++; - } - - *RegNumBufPtr = '\0'; - RegNumber = AsciiStrHexToUintn (RegNumBuffer); - - // check if this is a valid Register Number - if (RegNumber >= MaxRegisterCount ()) { - SendError (GDB_EINVALIDREGNUM); - return; - } - - InBufPtr++; // skips the '=' character - BasicWriteRegister (SystemContext, RegNumber, InBufPtr); - SendSuccess (); -} - -/** ‘G XX...’ - Writes the new values received into the input buffer to the general registers - @param SystemContext Register content at time of the exception - @param InBuffer Pointer to the input buffer received from gdb server - **/ -VOID -EFIAPI -WriteGeneralRegisters ( - IN EFI_SYSTEM_CONTEXT SystemContext, - IN CHAR8 *InBuffer - ) -{ - UINTN i; - CHAR8 *InBufPtr; /// pointer to the input buffer - UINTN MinLength; - UINTN RegisterCount = MaxRegisterCount (); - - MinLength = (RegisterCount * 8) + 1; // 'G' plus the registers in ASCII format - - if (AsciiStrLen (InBuffer) < MinLength) { - // Bad message. Message is not the right length - SendError (GDB_EBADBUFSIZE); - return; - } - - InBufPtr = &InBuffer[1]; - - // Read the new values for the registers from the input buffer to an array, NewValueArray. - // The values in the array are in the gdb ordering - for (i = 0; i < RegisterCount; i++) { - InBufPtr = BasicWriteRegister (SystemContext, i, InBufPtr); - } - - SendSuccess (); -} - -// What about Thumb? -// Use SWI 0xdbdbdb as the debug instruction -#define GDB_ARM_BKPT 0xefdbdbdb - -BOOLEAN mSingleStepActive = FALSE; -UINT32 mSingleStepPC; -UINT32 mSingleStepData; -UINTN mSingleStepDataSize; - -typedef struct { - LIST_ENTRY Link; - UINT64 Signature; - UINT32 Address; - UINT32 Instruction; -} ARM_SOFTWARE_BREAKPOINT; - -#define ARM_SOFTWARE_BREAKPOINT_SIGNATURE SIGNATURE_64('A', 'R', 'M', 'B', 'R', 'K', 'P', 'T') -#define ARM_SOFTWARE_BREAKPOINT_FROM_LINK(a) CR(a, ARM_SOFTWARE_BREAKPOINT, Link, ARM_SOFTWARE_BREAKPOINT_SIGNATURE) - -LIST_ENTRY BreakpointList; - -/** - Insert Single Step in the SystemContext - - @param SystemContext Register content at time of the exception - **/ -VOID -AddSingleStep ( - IN EFI_SYSTEM_CONTEXT SystemContext - ) -{ - if (mSingleStepActive) { - // Currently don't support nesting - return; - } - - mSingleStepActive = TRUE; - - mSingleStepPC = SystemContext.SystemContextArm->PC; - - mSingleStepDataSize = sizeof (UINT32); - mSingleStepData = (*(UINT32 *)mSingleStepPC); - *(UINT32 *)mSingleStepPC = GDB_ARM_BKPT; - if (*(UINT32 *)mSingleStepPC != GDB_ARM_BKPT) { - // For some reason our breakpoint did not take - mSingleStepActive = FALSE; - } - - InvalidateInstructionCacheRange ((VOID *)mSingleStepPC, mSingleStepDataSize); - // DEBUG((DEBUG_ERROR, "AddSingleStep at 0x%08x (was: 0x%08x is:0x%08x)\n", SystemContext.SystemContextArm->PC, mSingleStepData, *(UINT32 *)mSingleStepPC)); -} - -/** - Remove Single Step in the SystemContext - - @param SystemContext Register content at time of the exception - **/ -VOID -RemoveSingleStep ( - IN EFI_SYSTEM_CONTEXT SystemContext - ) -{ - if (!mSingleStepActive) { - return; - } - - if (mSingleStepDataSize == sizeof (UINT16)) { - *(UINT16 *)mSingleStepPC = (UINT16)mSingleStepData; - } else { - // DEBUG((DEBUG_ERROR, "RemoveSingleStep at 0x%08x (was: 0x%08x is:0x%08x)\n", SystemContext.SystemContextArm->PC, *(UINT32 *)mSingleStepPC, mSingleStepData)); - *(UINT32 *)mSingleStepPC = mSingleStepData; - } - - InvalidateInstructionCacheRange ((VOID *)mSingleStepPC, mSingleStepDataSize); - mSingleStepActive = FALSE; -} - -/** - Continue. addr is Address to resume. If addr is omitted, resume at current - Address. - - @param SystemContext Register content at time of the exception - **/ -VOID -EFIAPI -ContinueAtAddress ( - IN EFI_SYSTEM_CONTEXT SystemContext, - IN CHAR8 *PacketData - ) -{ - if (PacketData[1] != '\0') { - SystemContext.SystemContextArm->PC = AsciiStrHexToUintn (&PacketData[1]); - } -} - -/** ‘s [addr ]’ - Single step. addr is the Address at which to resume. If addr is omitted, resume - at same Address. - - @param SystemContext Register content at time of the exception - **/ -VOID -EFIAPI -SingleStep ( - IN EFI_SYSTEM_CONTEXT SystemContext, - IN CHAR8 *PacketData - ) -{ - SendNotSupported (); -} - -UINTN -GetBreakpointDataAddress ( - IN EFI_SYSTEM_CONTEXT SystemContext, - IN UINTN BreakpointNumber - ) -{ - return 0; -} - -UINTN -GetBreakpointDetected ( - IN EFI_SYSTEM_CONTEXT SystemContext - ) -{ - return 0; -} - -BREAK_TYPE -GetBreakpointType ( - IN EFI_SYSTEM_CONTEXT SystemContext, - IN UINTN BreakpointNumber - ) -{ - return NotSupported; -} - -ARM_SOFTWARE_BREAKPOINT * -SearchBreakpointList ( - IN UINT32 Address - ) -{ - LIST_ENTRY *Current; - ARM_SOFTWARE_BREAKPOINT *Breakpoint; - - Current = GetFirstNode (&BreakpointList); - while (!IsNull (&BreakpointList, Current)) { - Breakpoint = ARM_SOFTWARE_BREAKPOINT_FROM_LINK (Current); - - if (Address == Breakpoint->Address) { - return Breakpoint; - } - - Current = GetNextNode (&BreakpointList, Current); - } - - return NULL; -} - -VOID -SetBreakpoint ( - IN UINT32 Address - ) -{ - ARM_SOFTWARE_BREAKPOINT *Breakpoint; - - Breakpoint = SearchBreakpointList (Address); - - if (Breakpoint != NULL) { - return; - } - - // create and fill breakpoint structure - Breakpoint = AllocatePool (sizeof (ARM_SOFTWARE_BREAKPOINT)); - - Breakpoint->Signature = ARM_SOFTWARE_BREAKPOINT_SIGNATURE; - Breakpoint->Address = Address; - Breakpoint->Instruction = *(UINT32 *)Address; - - // Add it to the list - InsertTailList (&BreakpointList, &Breakpoint->Link); - - // Insert the software breakpoint - *(UINT32 *)Address = GDB_ARM_BKPT; - InvalidateInstructionCacheRange ((VOID *)Address, 4); - - // DEBUG((DEBUG_ERROR, "SetBreakpoint at 0x%08x (was: 0x%08x is:0x%08x)\n", Address, Breakpoint->Instruction, *(UINT32 *)Address)); -} - -VOID -ClearBreakpoint ( - IN UINT32 Address - ) -{ - ARM_SOFTWARE_BREAKPOINT *Breakpoint; - - Breakpoint = SearchBreakpointList (Address); - - if (Breakpoint == NULL) { - return; - } - - // Add it to the list - RemoveEntryList (&Breakpoint->Link); - - // Restore the original instruction - *(UINT32 *)Address = Breakpoint->Instruction; - InvalidateInstructionCacheRange ((VOID *)Address, 4); - - // DEBUG((DEBUG_ERROR, "ClearBreakpoint at 0x%08x (was: 0x%08x is:0x%08x)\n", Address, GDB_ARM_BKPT, *(UINT32 *)Address)); - - FreePool (Breakpoint); -} - -VOID -EFIAPI -InsertBreakPoint ( - IN EFI_SYSTEM_CONTEXT SystemContext, - IN CHAR8 *PacketData - ) -{ - UINTN Type; - UINTN Address; - UINTN Length; - UINTN ErrorCode; - - ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length); - if (ErrorCode > 0) { - SendError ((UINT8)ErrorCode); - return; - } - - switch (Type) { - case 0: // Software breakpoint - break; - - default: - DEBUG ((DEBUG_ERROR, "Insert breakpoint default: %x\n", Type)); - SendError (GDB_EINVALIDBRKPOINTTYPE); - return; - } - - SetBreakpoint (Address); - - SendSuccess (); -} - -VOID -EFIAPI -RemoveBreakPoint ( - IN EFI_SYSTEM_CONTEXT SystemContext, - IN CHAR8 *PacketData - ) -{ - UINTN Type; - UINTN Address; - UINTN Length; - UINTN ErrorCode; - - // Parse breakpoint packet data - ErrorCode = ParseBreakpointPacket (PacketData, &Type, &Address, &Length); - if (ErrorCode > 0) { - SendError ((UINT8)ErrorCode); - return; - } - - switch (Type) { - case 0: // Software breakpoint - break; - - default: - SendError (GDB_EINVALIDBRKPOINTTYPE); - return; - } - - ClearBreakpoint (Address); - - SendSuccess (); -} - -VOID -InitializeProcessor ( - VOID - ) -{ - // Initialize breakpoint list - InitializeListHead (&BreakpointList); -} - -BOOLEAN -ValidateAddress ( - IN VOID *Address - ) -{ - if ((UINT32)Address < 0x80000000) { - return FALSE; - } else { - return TRUE; - } -} - -BOOLEAN -ValidateException ( - IN EFI_EXCEPTION_TYPE ExceptionType, - IN OUT EFI_SYSTEM_CONTEXT SystemContext - ) -{ - UINT32 ExceptionAddress; - UINT32 Instruction; - - // Is it a debugger SWI? - ExceptionAddress = SystemContext.SystemContextArm->PC -= 4; - Instruction = *(UINT32 *)ExceptionAddress; - if (Instruction != GDB_ARM_BKPT) { - return FALSE; - } - - // Special for SWI-based exception handling. SWI sets up the context - // to return to the instruction following the SWI instruction - NOT what we want - // for a debugger! - SystemContext.SystemContextArm->PC = ExceptionAddress; - - return TRUE; -} diff --git a/EmbeddedPkg/GdbStub/GdbStub.inf b/EmbeddedPkg/GdbStub/GdbStub.inf index 6fecedf7c079..3949f4761b51 100644 --- a/EmbeddedPkg/GdbStub/GdbStub.inf +++ b/EmbeddedPkg/GdbStub/GdbStub.inf @@ -27,9 +27,6 @@ GdbStub.c SerialIo.c -[Sources.ARM] - Arm/Processor.c - [Sources.IA32] Ia32/Processor.c diff --git a/EmbeddedPkg/GdbStub/GdbStubInternal.h b/EmbeddedPkg/GdbStub/GdbStubInternal.h index 9c3929c812b3..a10006da241a 100644 --- a/EmbeddedPkg/GdbStub/GdbStubInternal.h +++ b/EmbeddedPkg/GdbStub/GdbStubInternal.h @@ -88,8 +88,6 @@ extern CONST CHAR8 mHexToStr[]; #define REG_SIZE 32 #elif defined (MDE_CPU_X64) #define REG_SIZE 64 -#elif defined (MDE_CPU_ARM) -#define REG_SIZE 32 #endif #define GDB_SERIAL_DEV_SIGNATURE SIGNATURE_32 ('g', 'd', 'b', 's') diff --git a/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.inf b/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.inf index 0973315de7d2..fe859079982d 100644 --- a/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.inf +++ b/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.inf @@ -16,12 +16,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = AndroidBootImgLib -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = ARM AARCH64 -# - [Sources] AndroidBootImgLib.c diff --git a/EmbeddedPkg/Library/PrePiMemoryAllocationLib/PrePiMemoryAllocationLib.inf b/EmbeddedPkg/Library/PrePiMemoryAllocationLib/PrePiMemoryAllocationLib.inf index 9491af9f24c6..cab573dbd642 100644 --- a/EmbeddedPkg/Library/PrePiMemoryAllocationLib/PrePiMemoryAllocationLib.inf +++ b/EmbeddedPkg/Library/PrePiMemoryAllocationLib/PrePiMemoryAllocationLib.inf @@ -13,11 +13,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = MemoryAllocationLib - -# -# VALID_ARCHITECTURES = ARM -# - [Sources] MemoryAllocationLib.c From b1f7c444e177fbc7ac760970f4d42bd07ffc3c37 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 07:58:38 -0700 Subject: [PATCH 0520/1172] DynamicTablesPkg: Drop ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from DynamicTablesPkg. This also drops irrelevant VALID_ARCHITECTURES comments from infs that are not arch specific. Signed-off-by: Oliver Smith-Denny --- .../DynamicTableFactoryDxe/DynamicTableFactoryDxe.inf | 6 ------ .../DynamicTableManagerDxe/DynamicTableManagerDxe.inf | 4 ++-- DynamicTablesPkg/DynamicTables.dsc.inc | 2 +- DynamicTablesPkg/DynamicTablesPkg.dsc | 6 +++--- .../Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf | 6 +++--- .../Library/Acpi/Common/AcpiFadtLib/AcpiFadtLib.inf | 2 +- .../Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf | 2 +- .../Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf | 4 ++-- .../Acpi/Common/AcpiSsdtSerialPortLib/SsdtSerialPortLib.inf | 2 +- .../Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c | 4 ++-- .../SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf | 2 +- .../Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.inf | 2 +- .../Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf | 4 ++-- 13 files changed, 20 insertions(+), 26 deletions(-) diff --git a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.inf b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.inf index b960b2c69c79..3a4a7bab7e8c 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.inf +++ b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.inf @@ -14,12 +14,6 @@ VERSION_STRING = 1.0 ENTRY_POINT = DynamicTableFactoryDxeInitialize -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = ARM AARCH64 -# - [Sources] AcpiTableFactory/AcpiTableFactory.c DeviceTreeTableFactory/DeviceTreeTableFactory.c diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf index 6246a106f787..92529b897be1 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf @@ -18,14 +18,14 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = ARM AARCH64 +# VALID_ARCHITECTURES = X64 AARCH64 # [Sources] DynamicTableManagerDxe.c DynamicTableManagerDxe.h -[Sources.ARM, Sources.AARCH64] +[Sources.AARCH64] Arm/ArmDynamicTableManager.c [Sources.X64] diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc index 1b7379c72671..3920596461d7 100644 --- a/DynamicTablesPkg/DynamicTables.dsc.inc +++ b/DynamicTablesPkg/DynamicTables.dsc.inc @@ -94,7 +94,7 @@ NULL|DynamicTablesPkg/Library/Acpi/X64/AcpiSsdtHpetLib/AcpiSsdtHpetLib.inf } -[Components.ARM, Components.AARCH64] +[Components.AARCH64] # # Generators (Arm specific) # diff --git a/DynamicTablesPkg/DynamicTablesPkg.dsc b/DynamicTablesPkg/DynamicTablesPkg.dsc index 31eac32c8dbf..1c34609bf3f4 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dsc +++ b/DynamicTablesPkg/DynamicTablesPkg.dsc @@ -15,7 +15,7 @@ PLATFORM_VERSION = 0.1 DSC_SPECIFICATION = 0x0001001a OUTPUT_DIRECTORY = Build/DynamicTables - SUPPORTED_ARCHITECTURES = ARM|AARCH64|X64 + SUPPORTED_ARCHITECTURES = AARCH64|X64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT @@ -37,7 +37,7 @@ UefiLib|MdePkg/Library/UefiLib/UefiLib.inf UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf -[LibraryClasses.ARM, LibraryClasses.AARCH64] +[LibraryClasses.AARCH64] PL011UartLib|ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.inf [Components.common] @@ -53,7 +53,7 @@ DynamicTablesPkg/Library/Common/MetadataHandlerLib/MetadataHandlerLib.inf DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.inf -[Components.ARM, Components.AARCH64] +[Components.AARCH64] DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf [Components.AARCH64] diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf index 6d942f2170a5..6f1442192e2a 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf @@ -21,13 +21,13 @@ Dbg2Generator.c Dbg2Generator.h -[Sources.ARM, Sources.AARCH64] +[Sources.AARCH64] Arm/ArmDbg2Generator.c [Sources.X64] Dbg2GeneratorNull.c -[Packages.ARM, Packages.AARCH64] +[Packages.AARCH64] ArmPlatformPkg/ArmPlatformPkg.dec [Packages] @@ -36,7 +36,7 @@ EmbeddedPkg/EmbeddedPkg.dec DynamicTablesPkg/DynamicTablesPkg.dec -[LibraryClasses.ARM, LibraryClasses.AARCH64] +[LibraryClasses.AARCH64] PL011UartLib [LibraryClasses] diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiFadtLib/AcpiFadtLib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiFadtLib/AcpiFadtLib.inf index 7bd7bdb49357..edff640422eb 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiFadtLib/AcpiFadtLib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiFadtLib/AcpiFadtLib.inf @@ -21,7 +21,7 @@ FadtGenerator.c FadtGenerator.h -[Sources.ARM, Sources.AARCH64] +[Sources.AARCH64] Arm/ArmFadtGenerator.c [Sources.X64] diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf index a9cf509218b4..5e6587358eb7 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf @@ -21,7 +21,7 @@ SratGenerator.c SratGenerator.h -[Sources.ARM, Sources.AARCH64] +[Sources.AARCH64] Arm/ArmSratGenerator.c [Sources.X64] diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf index 292dc933c15c..aa1c0c40ab3d 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf @@ -21,13 +21,13 @@ SsdtCpuTopologyGenerator.c SsdtCpuTopologyGenerator.h -[Sources.ARM, Sources.AARCH64] +[Sources.AARCH64] Arm/ArmSsdtCpuTopologyGenerator.c [Sources.X64] X64/X64SsdtCpuTopologyGenerator.c -[Packages.ARM, Packages.AARCH64] +[Packages.AARCH64] ArmPlatformPkg/ArmPlatformPkg.dec [Packages] diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtSerialPortLib/SsdtSerialPortLib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtSerialPortLib/SsdtSerialPortLib.inf index 24d7db5645c1..518c39f74a70 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtSerialPortLib/SsdtSerialPortLib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtSerialPortLib/SsdtSerialPortLib.inf @@ -19,7 +19,7 @@ [Sources] SsdtSerialPortGenerator.c -[Packages.ARM, Packages.AARCH64] +[Packages.AARCH64] ArmPlatformPkg/ArmPlatformPkg.dec [Packages] diff --git a/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c b/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c index fa1e401f9cc7..fd4d4a7dddd0 100644 --- a/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c +++ b/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.c @@ -30,7 +30,7 @@ #include #include -#if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) +#if defined (MDE_CPU_AARCH64) #include #endif @@ -107,7 +107,7 @@ ValidateSerialPortInfo ( return EFI_INVALID_PARAMETER; } - #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) + #if defined (MDE_CPU_AARCH64) // If an interrupt is not wired to the serial port, the Configuration // Manager specifies the interrupt as 0. // Any other value must be within the SPI or extended SPI range. diff --git a/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf b/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf index 1fae71068ae5..54b5f36bb330 100644 --- a/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf +++ b/DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf @@ -24,7 +24,7 @@ EmbeddedPkg/EmbeddedPkg.dec DynamicTablesPkg/DynamicTablesPkg.dec -[Packages.ARM, Packages.AARCH64] +[Packages.AARCH64] ArmPkg/ArmPkg.dec [LibraryClasses] diff --git a/DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.inf b/DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.inf index 6c69a9c24a68..953f8dd2f405 100644 --- a/DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.inf +++ b/DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.inf @@ -24,7 +24,7 @@ EmbeddedPkg/EmbeddedPkg.dec DynamicTablesPkg/DynamicTablesPkg.dec -[Packages.ARM, Packages.AARCH64] +[Packages.AARCH64] ArmPkg/ArmPkg.dec [LibraryClasses] diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf b/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf index 41d12443d43f..a87fbc8f1416 100644 --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf @@ -27,7 +27,7 @@ Serial/SerialPortParser.c Serial/SerialPortParser.h -[Sources.ARM, Sources.AARCH64] +[Sources.AARCH64] Arm/ArmFdtInterrupt.c Arm/ArmFdtHwInfoParser.c Arm/BootArch/ArmBootArchParser.c @@ -47,7 +47,7 @@ Arm/Gic/ArmGicRParser.c Arm/Gic/ArmGicRParser.h -[Packages.ARM, Packages.AARCH64] +[Packages.AARCH64] ArmPkg/ArmPkg.dec [Packages] From 9b8cab36cd853732748045ca60f41b5ca3e405de Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 07:59:04 -0700 Subject: [PATCH 0521/1172] FatPkg: Drop ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from FatPkg. Signed-off-by: Oliver Smith-Denny --- FatPkg/FatPkg.dsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FatPkg/FatPkg.dsc b/FatPkg/FatPkg.dsc index 49b42213aa0c..6b5ba8404b44 100644 --- a/FatPkg/FatPkg.dsc +++ b/FatPkg/FatPkg.dsc @@ -16,7 +16,7 @@ PLATFORM_GUID = 25b55dbc-9d0b-4a32-80da-46e1273d622c PLATFORM_VERSION = 0.3 DSC_SPECIFICATION = 0x00010005 - SUPPORTED_ARCHITECTURES = IA32|X64|EBC|ARM|AARCH64|RISCV64|LOONGARCH64 + SUPPORTED_ARCHITECTURES = IA32|X64|EBC|AARCH64|RISCV64|LOONGARCH64 OUTPUT_DIRECTORY = Build/Fat BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT From 90dc87714c5f10993566753ce321d14bd08e7b56 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 07:59:16 -0700 Subject: [PATCH 0522/1172] EmulatorPkg: Drop ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from EmulatorPkg. Signed-off-by: Oliver Smith-Denny --- EmulatorPkg/PlatformCI/PlatformBuild.py | 1 - 1 file changed, 1 deletion(-) diff --git a/EmulatorPkg/PlatformCI/PlatformBuild.py b/EmulatorPkg/PlatformCI/PlatformBuild.py index aff01189a80c..7cbd935558b2 100644 --- a/EmulatorPkg/PlatformCI/PlatformBuild.py +++ b/EmulatorPkg/PlatformCI/PlatformBuild.py @@ -70,7 +70,6 @@ def GetRequiredSubmodules(self): ret = RunCmd("git", "config --file .gitmodules --get-regexp path", workingdir=self.GetWorkspaceRoot(), outstream=result) # Cmd output is expected to look like: # submodule.CryptoPkg/Library/OpensslLib/openssl.path CryptoPkg/Library/OpensslLib/openssl - # submodule.SoftFloat.path ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3 if ret == 0: for line in result.getvalue().splitlines(): _, _, path = line.partition(" ") From 2ba9441e0b2222d81a186c0742e98c3196371303 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 08:50:44 -0700 Subject: [PATCH 0523/1172] CryptoPkg: Drop ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from CryptoPkg. This also drops irrelevant VALID_ARCHITECTURES comments from infs that are not arch specific. Signed-off-by: Oliver Smith-Denny --- CryptoPkg/CryptoPkg.dsc | 8 ++++---- CryptoPkg/CryptoPkgMbedTls.dsc | 6 +++--- CryptoPkg/Driver/CryptoDxe.inf | 6 ------ CryptoPkg/Driver/CryptoPei.inf | 6 ------ CryptoPkg/Driver/CryptoSmm.inf | 6 ------ CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf | 5 +---- CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf | 6 ------ CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf | 5 +---- CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf | 5 +---- CryptoPkg/Library/BaseCryptLibMbedTls/BaseCryptLib.inf | 6 ------ CryptoPkg/Library/BaseCryptLibMbedTls/RuntimeCryptLib.inf | 6 ------ CryptoPkg/Library/BaseCryptLibMbedTls/SmmCryptLib.inf | 6 ------ .../Library/BaseCryptLibMbedTls/TestBaseCryptLib.inf | 6 ------ CryptoPkg/Library/BaseCryptLibNull/BaseCryptLibNull.inf | 6 ------ .../Library/BaseCryptLibOnProtocolPpi/DxeCryptLib.inf | 6 ------ .../Library/BaseCryptLibOnProtocolPpi/PeiCryptLib.inf | 6 ------ .../Library/BaseCryptLibOnProtocolPpi/SmmCryptLib.inf | 6 ------ .../BaseCryptLibOnProtocolPpi/StandaloneMmCryptLib.inf | 6 ------ CryptoPkg/Library/Include/CrtLibSupport.h | 8 +------- CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf | 7 ------- CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf | 7 ------- CryptoPkg/Library/OpensslLib/OpensslLib.inf | 5 ----- CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf | 5 ----- CryptoPkg/Library/OpensslLib/OpensslLibFull.inf | 5 ----- CryptoPkg/Library/TlsLib/TlsLib.inf | 6 ------ CryptoPkg/Library/TlsLibNull/TlsLibNull.inf | 6 ------ 26 files changed, 11 insertions(+), 145 deletions(-) diff --git a/CryptoPkg/CryptoPkg.dsc b/CryptoPkg/CryptoPkg.dsc index 333ddd2c25fd..a6badc5b83e1 100644 --- a/CryptoPkg/CryptoPkg.dsc +++ b/CryptoPkg/CryptoPkg.dsc @@ -122,7 +122,7 @@ [LibraryClasses.IA32, LibraryClasses.X64, LibraryClasses.AARCH64] RngLib|MdePkg/Library/BaseRngLib/BaseRngLib.inf -[LibraryClasses.ARM, LibraryClasses.AARCH64] +[LibraryClasses.AARCH64] ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf [LibraryClasses.common.SEC] @@ -318,7 +318,7 @@ # available services. # !if $(CRYPTO_SERVICES) == TARGET_UNIT_TESTS -[Components.IA32, Components.X64, Components.ARM, Components.AARCH64] +[Components.IA32, Components.X64, Components.AARCH64] # # Target based unit tests # @@ -437,7 +437,7 @@ OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf } -[Components.IA32, Components.X64, Components.ARM, Components.AARCH64] +[Components.IA32, Components.X64, Components.AARCH64] # # CryptoPei with OpensslLib instance with all services # @@ -508,7 +508,7 @@ OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf } -[Components.IA32, Components.X64, Components.ARM, Components.AARCH64] +[Components.IA32, Components.X64, Components.AARCH64] # # CryptoDxe with OpensslLib instance with all services # diff --git a/CryptoPkg/CryptoPkgMbedTls.dsc b/CryptoPkg/CryptoPkgMbedTls.dsc index 1700aea7e493..db00807e75e0 100644 --- a/CryptoPkg/CryptoPkgMbedTls.dsc +++ b/CryptoPkg/CryptoPkgMbedTls.dsc @@ -18,7 +18,7 @@ PLATFORM_VERSION = 0.98 DSC_SPECIFICATION = 0x00010005 OUTPUT_DIRECTORY = Build/CryptoPkgMbed - SUPPORTED_ARCHITECTURES = IA32|X64|ARM|AARCH64|RISCV64 + SUPPORTED_ARCHITECTURES = IA32|X64|AARCH64|RISCV64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT @@ -89,7 +89,7 @@ [LibraryClasses.IA32.PEIM, LibraryClasses.X64.PEIM] PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf -[LibraryClasses.ARM.PEIM, LibraryClasses.AARCH64.PEIM] +[LibraryClasses.AARCH64.PEIM] PeiServicesTablePointerLib|ArmPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf [LibraryClasses.common.DXE_DRIVER] @@ -215,7 +215,7 @@ ################################################################################################### !if $(CRYPTO_IMG_TYPE) IN "PEI_DEFAULT PEI_PREMEM" -[Components.IA32, Components.X64, Components.ARM, Components.AARCH64] +[Components.IA32, Components.X64, Components.AARCH64] CryptoPkg/Driver/CryptoPei.inf { !if "$(CRYPTO_SERVICES)" == "ALL" diff --git a/CryptoPkg/Driver/CryptoDxe.inf b/CryptoPkg/Driver/CryptoDxe.inf index 0d08f3a190c8..d223cb3613e5 100644 --- a/CryptoPkg/Driver/CryptoDxe.inf +++ b/CryptoPkg/Driver/CryptoDxe.inf @@ -18,12 +18,6 @@ VERSION_STRING = 1.0 ENTRY_POINT = CryptoDxeEntry -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] Crypto.c CryptoDxe.c diff --git a/CryptoPkg/Driver/CryptoPei.inf b/CryptoPkg/Driver/CryptoPei.inf index dfa1ab58b16f..b10c95ef41b7 100644 --- a/CryptoPkg/Driver/CryptoPei.inf +++ b/CryptoPkg/Driver/CryptoPei.inf @@ -19,12 +19,6 @@ VERSION_STRING = 1.0 ENTRY_POINT = CryptoPeiEntry -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] Crypto.c CryptoPei.c diff --git a/CryptoPkg/Driver/CryptoSmm.inf b/CryptoPkg/Driver/CryptoSmm.inf index 9fe8718823d2..1cb362a436c7 100644 --- a/CryptoPkg/Driver/CryptoSmm.inf +++ b/CryptoPkg/Driver/CryptoSmm.inf @@ -18,12 +18,6 @@ VERSION_STRING = 1.0 ENTRY_POINT = CryptoSmmEntry -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] Crypto.c CryptoSmm.c diff --git a/CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf b/CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf index 07b984869629..f0156d3ac850 100644 --- a/CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf +++ b/CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf @@ -25,7 +25,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 LOONGARCH64 +# VALID_ARCHITECTURES = IA32 X64 AARCH64 RISCV64 LOONGARCH64 # [Sources] @@ -72,9 +72,6 @@ [Sources.X64] Rand/CryptRandTsc.c -[Sources.ARM] - Rand/CryptRand.c - [Sources.AARCH64] Rand/CryptRand.c diff --git a/CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf b/CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf index a979652538de..191e8300eff2 100644 --- a/CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf +++ b/CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf @@ -27,12 +27,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = BaseCryptLib|PEIM PEI_CORE -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] InternalCryptLib.h Hash/CryptMd5.c diff --git a/CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf b/CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf index 56b4f7306d30..cc9b610f27c5 100644 --- a/CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf +++ b/CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf @@ -31,7 +31,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# VALID_ARCHITECTURES = IA32 X64 AARCH64 # [Sources] @@ -74,9 +74,6 @@ [Sources.X64] Rand/CryptRandTsc.c -[Sources.ARM] - Rand/CryptRand.c - [Sources.AARCH64] Rand/CryptRand.c diff --git a/CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf b/CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf index 984a5b293a36..85ce7b89b944 100644 --- a/CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf +++ b/CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf @@ -28,7 +28,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# VALID_ARCHITECTURES = IA32 X64 AARCH64 # [Sources] @@ -75,9 +75,6 @@ [Sources.X64] Rand/CryptRandTsc.c -[Sources.ARM] - Rand/CryptRand.c - [Sources.AARCH64] Rand/CryptRand.c diff --git a/CryptoPkg/Library/BaseCryptLibMbedTls/BaseCryptLib.inf b/CryptoPkg/Library/BaseCryptLibMbedTls/BaseCryptLib.inf index b76b4e606771..a62294c8c52f 100644 --- a/CryptoPkg/Library/BaseCryptLibMbedTls/BaseCryptLib.inf +++ b/CryptoPkg/Library/BaseCryptLibMbedTls/BaseCryptLib.inf @@ -19,12 +19,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = BaseCryptLib|DXE_DRIVER DXE_CORE UEFI_APPLICATION UEFI_DRIVER -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] InternalCryptLib.h Hash/CryptMd5.c diff --git a/CryptoPkg/Library/BaseCryptLibMbedTls/RuntimeCryptLib.inf b/CryptoPkg/Library/BaseCryptLibMbedTls/RuntimeCryptLib.inf index 7cf478ad39e4..7fe0e248138c 100644 --- a/CryptoPkg/Library/BaseCryptLibMbedTls/RuntimeCryptLib.inf +++ b/CryptoPkg/Library/BaseCryptLibMbedTls/RuntimeCryptLib.inf @@ -26,12 +26,6 @@ LIBRARY_CLASS = BaseCryptLib|DXE_RUNTIME_DRIVER CONSTRUCTOR = RuntimeCryptLibConstructor -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] InternalCryptLib.h Hash/CryptMd5.c diff --git a/CryptoPkg/Library/BaseCryptLibMbedTls/SmmCryptLib.inf b/CryptoPkg/Library/BaseCryptLibMbedTls/SmmCryptLib.inf index 33e86b453d72..b549474c1c50 100644 --- a/CryptoPkg/Library/BaseCryptLibMbedTls/SmmCryptLib.inf +++ b/CryptoPkg/Library/BaseCryptLibMbedTls/SmmCryptLib.inf @@ -25,12 +25,6 @@ PI_SPECIFICATION_VERSION = 0x0001000A LIBRARY_CLASS = BaseCryptLib|DXE_SMM_DRIVER SMM_CORE MM_STANDALONE -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] InternalCryptLib.h Hash/CryptMd5.c diff --git a/CryptoPkg/Library/BaseCryptLibMbedTls/TestBaseCryptLib.inf b/CryptoPkg/Library/BaseCryptLibMbedTls/TestBaseCryptLib.inf index 30d15a8eff02..3eaca968da38 100644 --- a/CryptoPkg/Library/BaseCryptLibMbedTls/TestBaseCryptLib.inf +++ b/CryptoPkg/Library/BaseCryptLibMbedTls/TestBaseCryptLib.inf @@ -19,12 +19,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = BaseCryptLib|DXE_DRIVER DXE_CORE UEFI_APPLICATION UEFI_DRIVER -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] InternalCryptLib.h Hash/CryptMd5.c diff --git a/CryptoPkg/Library/BaseCryptLibNull/BaseCryptLibNull.inf b/CryptoPkg/Library/BaseCryptLibNull/BaseCryptLibNull.inf index 80afb62f7648..eadea943b2b3 100644 --- a/CryptoPkg/Library/BaseCryptLibNull/BaseCryptLibNull.inf +++ b/CryptoPkg/Library/BaseCryptLibNull/BaseCryptLibNull.inf @@ -22,12 +22,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = BaseCryptLib -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 LOONGARCH64 -# - [Sources] InternalCryptLib.h Hash/CryptMd5Null.c diff --git a/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/DxeCryptLib.inf b/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/DxeCryptLib.inf index 972291574c55..c3314ac6fcc5 100644 --- a/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/DxeCryptLib.inf +++ b/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/DxeCryptLib.inf @@ -20,12 +20,6 @@ LIBRARY_CLASS = TlsLib | DXE_DRIVER UEFI_DRIVER UEFI_APPLICATION CONSTRUCTOR = DxeCryptLibConstructor -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 LOONGARCH64 -# - [Packages] MdePkg/MdePkg.dec CryptoPkg/CryptoPkg.dec diff --git a/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/PeiCryptLib.inf b/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/PeiCryptLib.inf index e7d153db0b2a..b2281097b48c 100644 --- a/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/PeiCryptLib.inf +++ b/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/PeiCryptLib.inf @@ -19,12 +19,6 @@ LIBRARY_CLASS = BaseCryptLib | PEIM LIBRARY_CLASS = TlsLib | PEIM -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 LOONGARCH64 -# - [Packages] MdePkg/MdePkg.dec CryptoPkg/CryptoPkg.dec diff --git a/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/SmmCryptLib.inf b/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/SmmCryptLib.inf index b1285b444710..4ebc024a2723 100644 --- a/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/SmmCryptLib.inf +++ b/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/SmmCryptLib.inf @@ -18,12 +18,6 @@ LIBRARY_CLASS = TlsLib | DXE_SMM_DRIVER CONSTRUCTOR = SmmCryptLibConstructor -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Packages] MdePkg/MdePkg.dec CryptoPkg/CryptoPkg.dec diff --git a/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/StandaloneMmCryptLib.inf b/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/StandaloneMmCryptLib.inf index b229e75582de..975f11e3a83c 100644 --- a/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/StandaloneMmCryptLib.inf +++ b/CryptoPkg/Library/BaseCryptLibOnProtocolPpi/StandaloneMmCryptLib.inf @@ -19,12 +19,6 @@ LIBRARY_CLASS = TlsLib | MM_STANDALONE CONSTRUCTOR = StandaloneMmCryptLibConstructor -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Packages] MdePkg/MdePkg.dec CryptoPkg/CryptoPkg.dec diff --git a/CryptoPkg/Library/Include/CrtLibSupport.h b/CryptoPkg/Library/Include/CrtLibSupport.h index 80e2fa9ca52e..4da2ef61f7f8 100644 --- a/CryptoPkg/Library/Include/CrtLibSupport.h +++ b/CryptoPkg/Library/Include/CrtLibSupport.h @@ -44,7 +44,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent // 64-bit. Since using 'long long' works fine on GCC too, just do that. // #define SIXTY_FOUR_BIT - #elif defined (MDE_CPU_IA32) || defined (MDE_CPU_ARM) || defined (MDE_CPU_EBC) + #elif defined (MDE_CPU_IA32) || defined (MDE_CPU_EBC) #define THIRTY_TWO_BIT #else #error Unknown target architecture @@ -54,16 +54,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent // // Map all va_xxxx elements to VA_xxx defined in MdePkg/Include/Base.h // -#if !defined (__CC_ARM) // if va_list is not already defined #define va_list VA_LIST #define va_arg VA_ARG #define va_start VA_START #define va_end VA_END -#else // __CC_ARM -#define va_start(Marker, Parameter) __va_start(Marker, Parameter) -#define va_arg(Marker, TYPE) __va_arg(Marker, TYPE) -#define va_end(Marker) ((void)0) -#endif // // Definitions for global constants used by CRT library routines diff --git a/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf b/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf index 4ccd173eb0db..3828d517ad83 100644 --- a/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf +++ b/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf @@ -14,12 +14,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = MbedTlsLib -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] Include/mbedtls/mbedtls_config.h mbedtls/library/aes.c @@ -131,7 +125,6 @@ # GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS - GCC:*_*_ARM_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable GCC:*_*_AARCH64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable -Wno-error=format GCC:*_*_RISCV64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable diff --git a/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf b/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf index a26e9ac060ba..2635593aa011 100644 --- a/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf +++ b/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf @@ -14,12 +14,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = MbedTlsLib -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] Include/mbedtls/mbedtls_config.h mbedtls/library/aes.c @@ -135,7 +129,6 @@ # GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS - GCC:*_*_ARM_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable GCC:*_*_AARCH64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable -Wno-error=format GCC:*_*_RISCV64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable diff --git a/CryptoPkg/Library/OpensslLib/OpensslLib.inf b/CryptoPkg/Library/OpensslLib/OpensslLib.inf index 07782362d17c..c2ea42155a79 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLib.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLib.inf @@ -23,10 +23,6 @@ DEFINE OPENSSL_FLAGS = -DL_ENDIAN -DOPENSSL_SMALL_FOOTPRINT -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DEDK2_OPENSSL_NOEC=1 -DOPENSSL_NO_ASM DEFINE OPENSSL_FLAGS_NOASM = -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] OpensslLibConstructor.c $(OPENSSL_PATH)/ms/uplink.h @@ -763,7 +759,6 @@ # GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS - GCC:*_*_ARM_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable GCC:*_*_AARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable -Wno-error=format GCC:*_*_RISCV64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf index 42fb505fa57c..8c001b5e6d04 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf @@ -24,10 +24,6 @@ DEFINE OPENSSL_FLAGS = -DL_ENDIAN -DOPENSSL_SMALL_FOOTPRINT -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DEDK2_OPENSSL_NOEC=1 -DOPENSSL_NO_ASM DEFINE OPENSSL_FLAGS_NOASM = -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] OpensslLibConstructor.c $(OPENSSL_PATH)/ms/uplink.h @@ -713,7 +709,6 @@ # GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS - GCC:*_*_ARM_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable GCC:*_*_AARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable -Wno-error=format GCC:*_*_RISCV64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf index 3bdda0f68693..6a2d332defa5 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf @@ -28,10 +28,6 @@ DEFINE OPENSSL_FLAGS = -DL_ENDIAN -DOPENSSL_SMALL_FOOTPRINT -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DOPENSSL_NO_ASM DEFINE OPENSSL_FLAGS_NOASM = -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] OpensslLibConstructor.c $(OPENSSL_PATH)/ms/uplink.h @@ -820,7 +816,6 @@ # GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS - GCC:*_*_ARM_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable GCC:*_*_AARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable -Wno-error=format GCC:*_*_RISCV64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable diff --git a/CryptoPkg/Library/TlsLib/TlsLib.inf b/CryptoPkg/Library/TlsLib/TlsLib.inf index 4e7b3e535a45..f43e868cab0a 100644 --- a/CryptoPkg/Library/TlsLib/TlsLib.inf +++ b/CryptoPkg/Library/TlsLib/TlsLib.inf @@ -17,12 +17,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = TlsLib|DXE_DRIVER DXE_CORE UEFI_APPLICATION UEFI_DRIVER -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 LOONGARCH64 -# - [Sources] InternalTlsLib.h TlsInit.c diff --git a/CryptoPkg/Library/TlsLibNull/TlsLibNull.inf b/CryptoPkg/Library/TlsLibNull/TlsLibNull.inf index 12d7cc764ad8..2264fb903b76 100644 --- a/CryptoPkg/Library/TlsLibNull/TlsLibNull.inf +++ b/CryptoPkg/Library/TlsLibNull/TlsLibNull.inf @@ -17,12 +17,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = TlsLib -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 LOONGARCH64 -# - [Sources] InternalTlsLib.h TlsInitNull.c From c6ff778056707c9b545ed0cbe2bb099a98263655 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 08:53:51 -0700 Subject: [PATCH 0524/1172] OvmfPkg: Drop ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from OvmfPkg. This drops irrelevant VALID_ARCHITECTURES comments from infs that are not arch specific. Signed-off-by: Oliver Smith-Denny --- OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf | 6 ----- .../SmbiosPlatformDxe/SmbiosPlatformDxe.inf | 6 ----- .../FdtPciHostBridgeLib/FdtPciHostBridgeLib.c | 2 +- .../FdtPciHostBridgeLib.inf | 7 ------ OvmfPkg/Include/IndustryStandard/Xen/xen.h | 2 +- .../BaseCachingPciExpressLib.inf | 4 ---- .../PciHostBridgeUtilityLib.inf | 7 ------ .../PlatformBootManagerLib.inf | 2 +- .../QemuBootOrderLib/QemuBootOrderLib.inf | 7 ------ .../QemuFwCfgLib/QemuFwCfgMmioDxeLib.inf | 7 ------ .../QemuFwCfgS3Lib/BaseQemuFwCfgS3LibNull.inf | 7 ------ .../QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf | 7 ------ .../QemuFwCfgS3Lib/PeiQemuFwCfgS3LibFwCfg.inf | 7 ------ .../DetectSmbiosVersionLib.inf | 7 ------ .../TlsAuthConfigLib/TlsAuthConfigLib.inf | 2 +- .../Library/XenHypercallLib/Arm/Hypercall.S | 22 ------------------- .../XenHypercallLib/XenHypercallLib.inf | 7 ++---- .../LinuxInitrdDynamicShellCommand.inf | 4 ---- OvmfPkg/PlatformCI/PlatformBuildLib.py | 1 - .../Capsule/GenerateCapsule/GenCapsule.py | 2 +- .../Library/FmpDeviceLib/FmpDeviceLib.inf | 6 ----- OvmfPkg/SmbiosPlatformDxe/ArmXen.c | 2 +- .../SmbiosPlatformDxe/SmbiosPlatformDxe.inf | 6 ----- .../XenSmbiosPlatformDxe.inf | 4 ++-- OvmfPkg/Tcg/Tcg2Config/Tcg12ConfigPei.inf | 2 +- OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf | 2 +- 26 files changed, 12 insertions(+), 126 deletions(-) delete mode 100644 OvmfPkg/Library/XenHypercallLib/Arm/Hypercall.S diff --git a/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf b/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf index 928990b43d3a..d770c071cf85 100644 --- a/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf +++ b/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf @@ -14,12 +14,6 @@ VERSION_STRING = 1.0 ENTRY_POINT = AcpiPlatformEntryPoint -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = X64 ARM AARCH64 -# - [Sources] AcpiPlatform.c AcpiPlatform.h diff --git a/OvmfPkg/Bhyve/SmbiosPlatformDxe/SmbiosPlatformDxe.inf b/OvmfPkg/Bhyve/SmbiosPlatformDxe/SmbiosPlatformDxe.inf index f6d7b5b3054c..f9dff152aac9 100644 --- a/OvmfPkg/Bhyve/SmbiosPlatformDxe/SmbiosPlatformDxe.inf +++ b/OvmfPkg/Bhyve/SmbiosPlatformDxe/SmbiosPlatformDxe.inf @@ -18,12 +18,6 @@ ENTRY_POINT = SmbiosTablePublishEntry -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = X64 EBC ARM AARCH64 -# - [Sources] Bhyve.c SmbiosPlatformDxe.h diff --git a/OvmfPkg/Fdt/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c b/OvmfPkg/Fdt/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c index 0d116f60dd4d..9af8c21a21a9 100644 --- a/OvmfPkg/Fdt/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c +++ b/OvmfPkg/Fdt/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c @@ -428,7 +428,7 @@ PciHostBridgeGetRootBridges ( } else { // // UEFI mandates a 1:1 virtual-to-physical mapping, so on a 32-bit - // architecture such as ARM, we will not be able to access 64-bit MMIO + // architecture, we will not be able to access 64-bit MMIO // BARs unless they are allocated below 4 GB. So ignore the range above // 4 GB in this case. // diff --git a/OvmfPkg/Fdt/FdtPciHostBridgeLib/FdtPciHostBridgeLib.inf b/OvmfPkg/Fdt/FdtPciHostBridgeLib/FdtPciHostBridgeLib.inf index e610e3d03f08..26b38b596655 100644 --- a/OvmfPkg/Fdt/FdtPciHostBridgeLib/FdtPciHostBridgeLib.inf +++ b/OvmfPkg/Fdt/FdtPciHostBridgeLib/FdtPciHostBridgeLib.inf @@ -16,13 +16,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = PciHostBridgeLib -# -# The following information is for reference only and not required by the build -# tools. -# -# VALID_ARCHITECTURES = AARCH64 ARM RISCV64 -# - [Sources] FdtPciHostBridgeLib.c diff --git a/OvmfPkg/Include/IndustryStandard/Xen/xen.h b/OvmfPkg/Include/IndustryStandard/Xen/xen.h index fce87ffb584f..7891ccc02450 100644 --- a/OvmfPkg/Include/IndustryStandard/Xen/xen.h +++ b/OvmfPkg/Include/IndustryStandard/Xen/xen.h @@ -20,7 +20,7 @@ #if defined (MDE_CPU_X64) #include "arch-x86/xen.h" -#elif defined (__arm__) || defined (__aarch64__) +#elif defined (__aarch64__) #include "arch-arm/xen.h" #else #error "Unsupported architecture" diff --git a/OvmfPkg/Library/BaseCachingPciExpressLib/BaseCachingPciExpressLib.inf b/OvmfPkg/Library/BaseCachingPciExpressLib/BaseCachingPciExpressLib.inf index 2017b75c6a3c..f3b25a1eca6b 100644 --- a/OvmfPkg/Library/BaseCachingPciExpressLib/BaseCachingPciExpressLib.inf +++ b/OvmfPkg/Library/BaseCachingPciExpressLib/BaseCachingPciExpressLib.inf @@ -20,10 +20,6 @@ LIBRARY_CLASS = PciExpressLib|DXE_DRIVER UEFI_DRIVER UEFI_APPLICATION CONSTRUCTOR = PciExpressLibInitialize -# -# VALID_ARCHITECTURES = ARM AARCH64 RISCV64 -# - [Sources] PciExpressLib.c diff --git a/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf b/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf index 727df4bdd063..83287e20999c 100644 --- a/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf +++ b/OvmfPkg/Library/PciHostBridgeUtilityLib/PciHostBridgeUtilityLib.inf @@ -19,13 +19,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = PciHostBridgeUtilityLib -# -# The following information is for reference only and not required by the build -# tools. -# -# VALID_ARCHITECTURES = X64 AARCH64 ARM -# - [Sources] PciHostBridgeUtilityLib.c diff --git a/OvmfPkg/Library/PlatformBootManagerLibLight/PlatformBootManagerLib.inf b/OvmfPkg/Library/PlatformBootManagerLibLight/PlatformBootManagerLib.inf index 6c5552da16a3..9e89556b1404 100644 --- a/OvmfPkg/Library/PlatformBootManagerLibLight/PlatformBootManagerLib.inf +++ b/OvmfPkg/Library/PlatformBootManagerLibLight/PlatformBootManagerLib.inf @@ -20,7 +20,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = ARM AARCH64 +# VALID_ARCHITECTURES = AARCH64 # [Sources] diff --git a/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.inf b/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.inf index 0f32d8c838b6..8797748ef507 100644 --- a/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.inf +++ b/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.inf @@ -16,13 +16,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = QemuBootOrderLib|DXE_DRIVER -# -# The following information is for reference only and not required by the build -# tools. -# -# VALID_ARCHITECTURES = X64 EBC ARM AARCH64 -# - [Sources] ExtraRootBusMap.c ExtraRootBusMap.h diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxeLib.inf b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxeLib.inf index 633053aaed09..f107ac154093 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxeLib.inf +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxeLib.inf @@ -20,13 +20,6 @@ CONSTRUCTOR = QemuFwCfgInitialize -# -# The following information is for reference only and not required by the build -# tools. -# -# VALID_ARCHITECTURES = ARM AARCH64 RISCV64 LOONGARCH64 -# - [Sources] QemuFwCfgLibMmio.c QemuFwCfgMmioDxe.c diff --git a/OvmfPkg/Library/QemuFwCfgS3Lib/BaseQemuFwCfgS3LibNull.inf b/OvmfPkg/Library/QemuFwCfgS3Lib/BaseQemuFwCfgS3LibNull.inf index c83b78d42f2b..194bff917eef 100644 --- a/OvmfPkg/Library/QemuFwCfgS3Lib/BaseQemuFwCfgS3LibNull.inf +++ b/OvmfPkg/Library/QemuFwCfgS3Lib/BaseQemuFwCfgS3LibNull.inf @@ -19,13 +19,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = QemuFwCfgS3Lib -# -# The following information is for reference only and not required by the build -# tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 EBC -# - [Sources] QemuFwCfgS3Base.c QemuFwCfgS3BasePei.c diff --git a/OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf b/OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf index a552e3cef05c..655e6302328e 100644 --- a/OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf +++ b/OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf @@ -15,13 +15,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = QemuFwCfgS3Lib|DXE_DRIVER DXE_RUNTIME_DRIVER -# -# The following information is for reference only and not required by the build -# tools. -# -# VALID_ARCHITECTURES = X64 ARM AARCH64 EBC -# - [Sources] QemuFwCfgS3Dxe.c QemuFwCfgS3PeiDxe.c diff --git a/OvmfPkg/Library/QemuFwCfgS3Lib/PeiQemuFwCfgS3LibFwCfg.inf b/OvmfPkg/Library/QemuFwCfgS3Lib/PeiQemuFwCfgS3LibFwCfg.inf index 8268828a7615..2c531f256a61 100644 --- a/OvmfPkg/Library/QemuFwCfgS3Lib/PeiQemuFwCfgS3LibFwCfg.inf +++ b/OvmfPkg/Library/QemuFwCfgS3Lib/PeiQemuFwCfgS3LibFwCfg.inf @@ -18,13 +18,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = QemuFwCfgS3Lib|PEIM -# -# The following information is for reference only and not required by the build -# tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 EBC -# - [Sources] QemuFwCfgS3BasePei.c QemuFwCfgS3Pei.c diff --git a/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf b/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf index 37ae827ec761..83cfbc105b26 100644 --- a/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf +++ b/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf @@ -20,13 +20,6 @@ LIBRARY_CLASS = SmbiosVersionLib|DXE_DRIVER CONSTRUCTOR = DetectSmbiosVersion -# -# The following information is for reference only and not required by the build -# tools. -# -# VALID_ARCHITECTURES = X64 ARM AARCH64 -# - [Sources] DetectSmbiosVersionLib.c diff --git a/OvmfPkg/Library/TlsAuthConfigLib/TlsAuthConfigLib.inf b/OvmfPkg/Library/TlsAuthConfigLib/TlsAuthConfigLib.inf index 94f8b94df127..08dc8c283a48 100644 --- a/OvmfPkg/Library/TlsAuthConfigLib/TlsAuthConfigLib.inf +++ b/OvmfPkg/Library/TlsAuthConfigLib/TlsAuthConfigLib.inf @@ -24,7 +24,7 @@ # The following information is for reference only and not required by the build # tools. # -# VALID_ARCHITECTURES = X64 ARM AARCH64 +# VALID_ARCHITECTURES = X64 AARCH64 # [Sources] diff --git a/OvmfPkg/Library/XenHypercallLib/Arm/Hypercall.S b/OvmfPkg/Library/XenHypercallLib/Arm/Hypercall.S deleted file mode 100644 index 06cf1e68a46c..000000000000 --- a/OvmfPkg/Library/XenHypercallLib/Arm/Hypercall.S +++ /dev/null @@ -1,22 +0,0 @@ -/** @file - ARM (AArch32) implementation of XenHypercall2 - - Copyright (C) 2014, Linaro Ltd. - - SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include - - .text - .arch_extension virt - -GCC_ASM_EXPORT(XenHypercall2) - -ASM_PFX(XenHypercall2): - mov r12, r0 - mov r0, r1 - mov r1, r2 - hvc #XEN_HYPERCALL_TAG - bx lr diff --git a/OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf b/OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf index 4d1739660c32..93fb0374f468 100644 --- a/OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf +++ b/OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf @@ -18,7 +18,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = X64 ARM AARCH64 +# VALID_ARCHITECTURES = X64 AARCH64 # [Sources.X64] @@ -27,12 +27,9 @@ [Sources.X64] X64/hypercall.nasm -[Sources.ARM, Sources.AARCH64] +[Sources.AARCH64] ArmXenHypercall.c -[Sources.ARM] - Arm/Hypercall.S - [Sources.AARCH64] AArch64/Hypercall.S diff --git a/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.inf b/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.inf index e547e0018be6..611de149affa 100644 --- a/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.inf +++ b/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.inf @@ -19,10 +19,6 @@ UNLOAD_IMAGE = LinuxInitrdDynamicShellCommandUnload UEFI_HII_RESOURCE_SECTION = TRUE -# -# VALID_ARCHITECTURES = X64 ARM AARCH64 EBC -# - [Sources.common] LinuxInitrdDynamicShellCommand.c LinuxInitrdDynamicShellCommand.uni diff --git a/OvmfPkg/PlatformCI/PlatformBuildLib.py b/OvmfPkg/PlatformCI/PlatformBuildLib.py index 1a25487f1c43..635da877618c 100644 --- a/OvmfPkg/PlatformCI/PlatformBuildLib.py +++ b/OvmfPkg/PlatformCI/PlatformBuildLib.py @@ -54,7 +54,6 @@ def GetRequiredSubmodules(self): ret = RunCmd("git", "config --file .gitmodules --get-regexp path", workingdir=self.GetWorkspaceRoot(), outstream=result) # Cmd output is expected to look like: # submodule.CryptoPkg/Library/OpensslLib/openssl.path CryptoPkg/Library/OpensslLib/openssl - # submodule.SoftFloat.path ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3 if ret == 0: for line in result.getvalue().splitlines(): _, _, path = line.partition(" ") diff --git a/OvmfPkg/RiscVVirt/Feature/Capsule/GenerateCapsule/GenCapsule.py b/OvmfPkg/RiscVVirt/Feature/Capsule/GenerateCapsule/GenCapsule.py index 1889328fb9ba..8f7e0da8e10e 100644 --- a/OvmfPkg/RiscVVirt/Feature/Capsule/GenerateCapsule/GenCapsule.py +++ b/OvmfPkg/RiscVVirt/Feature/Capsule/GenerateCapsule/GenCapsule.py @@ -207,7 +207,7 @@ def GenCapsuleDevice (BaseName, PayloadFileName, Guid, Version, Lsv, CapsulesPat parser.add_argument ( '-a', '--arch', dest = 'Arch', nargs = '+', action = 'append', required = True, - help = '''ARCHS is one of list: IA32, X64, IPF, ARM, AARCH64, RISCV64 + help = '''ARCHS is one of list: IA32, X64, IPF, AARCH64, RISCV64 or EBC, which overrides target.txt's TARGET_ARCH definition. To specify more archs, please repeat this option.''' ) diff --git a/OvmfPkg/RiscVVirt/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.inf b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.inf index 0397e8523d1d..5bc91105e3fb 100644 --- a/OvmfPkg/RiscVVirt/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.inf +++ b/OvmfPkg/RiscVVirt/Feature/Capsule/Library/FmpDeviceLib/FmpDeviceLib.inf @@ -17,12 +17,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = FmpDeviceLib|DXE_DRIVER UEFI_DRIVER -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = X64 ARM AARCH64 RISCV64 -# - [Sources] FmpDeviceLib.c diff --git a/OvmfPkg/SmbiosPlatformDxe/ArmXen.c b/OvmfPkg/SmbiosPlatformDxe/ArmXen.c index 3dd849bbc0b4..8d66294b95e1 100644 --- a/OvmfPkg/SmbiosPlatformDxe/ArmXen.c +++ b/OvmfPkg/SmbiosPlatformDxe/ArmXen.c @@ -1,5 +1,5 @@ /** @file - Detect Xen SMBIOS data on ARM / AARCH64. + Detect Xen SMBIOS data on AARCH64. Copyright (C) 2015, Red Hat, Inc. Copyright (c) 2011, Bei Guan diff --git a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf index 0159282673b2..fa667496f911 100644 --- a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf +++ b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf @@ -17,12 +17,6 @@ ENTRY_POINT = SmbiosTablePublishEntry -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = X64 EBC ARM AARCH64 -# - [Sources] CloudHv.c EntryPoint.c diff --git a/OvmfPkg/SmbiosPlatformDxe/XenSmbiosPlatformDxe.inf b/OvmfPkg/SmbiosPlatformDxe/XenSmbiosPlatformDxe.inf index b0542a19d263..f69b8e60bf2e 100644 --- a/OvmfPkg/SmbiosPlatformDxe/XenSmbiosPlatformDxe.inf +++ b/OvmfPkg/SmbiosPlatformDxe/XenSmbiosPlatformDxe.inf @@ -21,7 +21,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = X64 EBC ARM AARCH64 +# VALID_ARCHITECTURES = X64 EBC AARCH64 # [Sources] @@ -33,7 +33,7 @@ [Sources.X64] X86Xen.c -[Sources.ARM, Sources.AARCH64] +[Sources.AARCH64] ArmXen.c [Packages] diff --git a/OvmfPkg/Tcg/Tcg2Config/Tcg12ConfigPei.inf b/OvmfPkg/Tcg/Tcg2Config/Tcg12ConfigPei.inf index e8e0b88e6058..594eeb89b2d4 100644 --- a/OvmfPkg/Tcg/Tcg2Config/Tcg12ConfigPei.inf +++ b/OvmfPkg/Tcg/Tcg2Config/Tcg12ConfigPei.inf @@ -52,5 +52,5 @@ [Depex.IA32, Depex.X64] gOvmfTpmMmioAccessiblePpiGuid -[Depex.ARM, Depex.AARCH64] +[Depex.AARCH64] gOvmfTpmDiscoveredPpiGuid diff --git a/OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf b/OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf index 0355df9609aa..a26f35b23640 100644 --- a/OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf +++ b/OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf @@ -50,7 +50,7 @@ [Depex.IA32, Depex.X64] gOvmfTpmMmioAccessiblePpiGuid -[Depex.ARM, Depex.AARCH64] +[Depex.AARCH64] gOvmfTpmDiscoveredPpiGuid [Depex.RISCV64] From b9b1365a7645e1056e081b3b2717951c421ef536 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Fri, 19 Sep 2025 20:57:32 -0700 Subject: [PATCH 0525/1172] ArmPlatformPkg: Remove ARM32 Comment and Supported Architecture edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 comments and as a supported architecture in ArmPlatformPkg. It also drops irrelevant VALID_ARCHITECTURES comments from INFs that are not arch specific. Signed-off-by: Oliver Smith-Denny --- ArmPlatformPkg/ArmPlatformPkg.dsc | 2 +- ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf | 6 ------ ArmPlatformPkg/PlatformPei/PlatformPeim.inf | 6 ------ ArmPlatformPkg/Scripts/Makefile | 2 +- 4 files changed, 2 insertions(+), 14 deletions(-) diff --git a/ArmPlatformPkg/ArmPlatformPkg.dsc b/ArmPlatformPkg/ArmPlatformPkg.dsc index 278d3cf1f22b..9576a424ea9e 100644 --- a/ArmPlatformPkg/ArmPlatformPkg.dsc +++ b/ArmPlatformPkg/ArmPlatformPkg.dsc @@ -21,7 +21,7 @@ PLATFORM_VERSION = 0.1 DSC_SPECIFICATION = 0x0001001A OUTPUT_DIRECTORY = Build/ArmPlatform - SUPPORTED_ARCHITECTURES = ARM|AARCH64 + SUPPORTED_ARCHITECTURES = AARCH64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT diff --git a/ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf b/ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf index 3dcca0eddd77..d62545f7e68a 100644 --- a/ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf +++ b/ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf @@ -15,12 +15,6 @@ ENTRY_POINT = InitializeMemory -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 EBC ARM -# - [Sources] MemoryInitPeim.c diff --git a/ArmPlatformPkg/PlatformPei/PlatformPeim.inf b/ArmPlatformPkg/PlatformPei/PlatformPeim.inf index d9e8f32ac985..c6973a6bd06f 100644 --- a/ArmPlatformPkg/PlatformPei/PlatformPeim.inf +++ b/ArmPlatformPkg/PlatformPei/PlatformPeim.inf @@ -16,12 +16,6 @@ ENTRY_POINT = InitializePlatformPeim -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 EBC ARM -# - [Sources] PlatformPeim.c diff --git a/ArmPlatformPkg/Scripts/Makefile b/ArmPlatformPkg/Scripts/Makefile index baa618456413..7a903cf0640b 100644 --- a/ArmPlatformPkg/Scripts/Makefile +++ b/ArmPlatformPkg/Scripts/Makefile @@ -6,7 +6,7 @@ #*/ EDK2_TOOLCHAIN ?= GCC5 -EDK2_ARCH ?= ARM +EDK2_ARCH ?= AARCH64 EDK2_BUILD ?= DEBUG ifndef EDK2_DSC From 737ca4ea4f72273dfe4acc4105e37c568cffc20b Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 22 Sep 2025 10:56:38 -0700 Subject: [PATCH 0526/1172] ArmPlatformPkg: Remove ARM32 Support from PeilessSec edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 files from PeilessSec. Signed-off-by: Oliver Smith-Denny --- .../PeilessSec/Arm/ArchPeilessSec.c | 21 ---- .../PeilessSec/Arm/ModuleEntryPoint.S | 97 ------------------- ArmPlatformPkg/PeilessSec/PeilessSec.inf | 7 -- 3 files changed, 125 deletions(-) delete mode 100644 ArmPlatformPkg/PeilessSec/Arm/ArchPeilessSec.c delete mode 100644 ArmPlatformPkg/PeilessSec/Arm/ModuleEntryPoint.S diff --git a/ArmPlatformPkg/PeilessSec/Arm/ArchPeilessSec.c b/ArmPlatformPkg/PeilessSec/Arm/ArchPeilessSec.c deleted file mode 100644 index e2f6f679040f..000000000000 --- a/ArmPlatformPkg/PeilessSec/Arm/ArchPeilessSec.c +++ /dev/null @@ -1,21 +0,0 @@ -/** @file - - Copyright (c) 2011 - 2013, ARM Limited. All rights reserved. - - SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include "PeilessSec.h" - -/** - Architecture specific initialization routine. -**/ -VOID -ArchInitialize ( - VOID - ) -{ - // Enable program flow prediction, if supported. - ArmEnableBranchPrediction (); -} diff --git a/ArmPlatformPkg/PeilessSec/Arm/ModuleEntryPoint.S b/ArmPlatformPkg/PeilessSec/Arm/ModuleEntryPoint.S deleted file mode 100644 index 9043d8679a91..000000000000 --- a/ArmPlatformPkg/PeilessSec/Arm/ModuleEntryPoint.S +++ /dev/null @@ -1,97 +0,0 @@ -// -// Copyright (c) 2011 - 2020, Arm Limited. All rights reserved.
-// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -// - -#include - -#include - -ASM_FUNC(_ModuleEntryPoint) - // Do early platform specific actions - bl ASM_PFX(ArmPlatformPeiBootAction) - -#if (FixedPcdGet32 (PcdVFPEnabled)) - // Enable Floating Point. This needs to be done before entering C code, which - // may use FP/SIMD registers. - bl ArmEnableVFP -#endif - -// Check if we can install the stack at the top of the System Memory or if we need -// to install the stacks at the bottom of the Firmware Device (case the FD is located -// at the top of the DRAM) -_SystemMemoryEndInit: - ADRL (r1, mSystemMemoryEnd) - ldrd r2, r3, [r1] - teq r3, #0 - moveq r1, r2 - mvnne r1, #0 - -_SetupStackPosition: - // r1 = SystemMemoryTop - - // Calculate Top of the Firmware Device - MOV32 (r2, FixedPcdGet32(PcdFdBaseAddress)) - MOV32 (r3, FixedPcdGet32(PcdFdSize) - 1) - add r3, r3, r2 // r3 = FdTop = PcdFdBaseAddress + PcdFdSize - - // UEFI Memory Size (stacks are allocated in this region) - MOV32 (r4, FixedPcdGet32(PcdSystemMemoryUefiRegionSize)) - - // - // Reserve the memory for the UEFI region (contain stacks on its top) - // - - // Calculate how much space there is between the top of the Firmware and the Top of the System Memory - subs r0, r1, r3 // r0 = SystemMemoryTop - FdTop - bmi _SetupStack // Jump if negative (FdTop > SystemMemoryTop). Case when SEC is in XIP memory outside of the DRAM - cmp r0, r4 - bge _SetupStack - - // Case the top of stacks is the FdBaseAddress - mov r1, r2 - -_SetupStack: - // r1 contains the top of the stack (and the UEFI Memory) - - // Because the 'push' instruction is equivalent to 'stmdb' (decrement before), we need to increment - // one to the top of the stack. We check if incrementing one does not overflow (case of DRAM at the - // top of the memory space) - adds r9, r1, #1 - bcs _SetupOverflowStack - -_SetupAlignedStack: - mov r1, r9 - b _GetBaseUefiMemory - -_SetupOverflowStack: - // Case memory at the top of the address space. Ensure the top of the stack is EFI_PAGE_SIZE - // aligned (4KB) - MOV32 (r9, ~EFI_PAGE_MASK & 0xFFFFFFFF) - and r1, r1, r9 - -_GetBaseUefiMemory: - // Calculate the Base of the UEFI Memory - sub r0, r1, r4 - -_GetStackBase: - // r1 = The top of the stack - mov sp, r1 - - // Stack for the primary core = PrimaryCoreStack - MOV32 (r2, FixedPcdGet32(PcdCPUCorePrimaryStackSize)) - sub r1, r1, r2 - - // Move sec startup address into a data register - // Ensure we're jumping to FV version of the code (not boot remapped alias) - ldr r4, =ASM_PFX(CEntryPoint) - - // Jump to SEC C code - // r0 = UefiMemoryBase - // r1 = StacksBase - blx r4 - -_NeverReturn: - b _NeverReturn diff --git a/ArmPlatformPkg/PeilessSec/PeilessSec.inf b/ArmPlatformPkg/PeilessSec/PeilessSec.inf index db7449f61b29..f5e0726adbf5 100644 --- a/ArmPlatformPkg/PeilessSec/PeilessSec.inf +++ b/ArmPlatformPkg/PeilessSec/PeilessSec.inf @@ -20,10 +20,6 @@ PeilessSec.h PeilessSec.c -[Sources.ARM] - Arm/ArchPeilessSec.c - Arm/ModuleEntryPoint.S - [Sources.AArch64] AArch64/ArchPeilessSec.c AArch64/ModuleEntryPoint.S @@ -74,9 +70,6 @@ gArmTokenSpaceGuid.PcdFvSize gEmbeddedTokenSpaceGuid.PcdPrePiCpuIoSize -[FixedPcd.ARM] - gArmTokenSpaceGuid.PcdVFPEnabled - [Pcd] gArmTokenSpaceGuid.PcdSystemMemoryBase gArmTokenSpaceGuid.PcdSystemMemorySize From dc1ccc9daf56f41f6a60be2df4f78cc629054c76 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 22 Sep 2025 11:06:09 -0700 Subject: [PATCH 0527/1172] ArmPlatformPkg: Remove ARM32 Support from Sec edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 files from Sec. Signed-off-by: Oliver Smith-Denny --- ArmPlatformPkg/Sec/Arm/ArchSec.c | 60 -------------- ArmPlatformPkg/Sec/Arm/Exception.S | 96 ----------------------- ArmPlatformPkg/Sec/Arm/ModuleEntryPoint.S | 46 ----------- ArmPlatformPkg/Sec/Arm/SwitchStack.S | 32 -------- ArmPlatformPkg/Sec/Sec.inf | 9 --- 5 files changed, 243 deletions(-) delete mode 100644 ArmPlatformPkg/Sec/Arm/ArchSec.c delete mode 100644 ArmPlatformPkg/Sec/Arm/Exception.S delete mode 100644 ArmPlatformPkg/Sec/Arm/ModuleEntryPoint.S delete mode 100644 ArmPlatformPkg/Sec/Arm/SwitchStack.S diff --git a/ArmPlatformPkg/Sec/Arm/ArchSec.c b/ArmPlatformPkg/Sec/Arm/ArchSec.c deleted file mode 100644 index 0c1e4998d72e..000000000000 --- a/ArmPlatformPkg/Sec/Arm/ArchSec.c +++ /dev/null @@ -1,60 +0,0 @@ -/** @file - Architecture specific handling of CPU exceptions taken while running in PEI. - - Copyright (c) 2012, ARM Limited. All rights reserved. - - SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include "Sec.h" - -/** - Minimal high level handling of exceptions occurring in PEI. - - @param[in] Entry Type of exception - @param[in] LR Address of instruction where the exception was taken -**/ -VOID -PeiCommonExceptionEntry ( - IN UINT32 Entry, - IN UINTN LR - ) -{ - CHAR8 Buffer[100]; - UINTN CharCount; - - switch (Entry) { - case 0: - CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "Reset Exception at 0x%X\n\r", LR); - break; - case 1: - CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "Undefined Exception at 0x%X\n\r", LR); - break; - case 2: - CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "SWI Exception at 0x%X\n\r", LR); - break; - case 3: - CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "PrefetchAbort Exception at 0x%X\n\r", LR); - break; - case 4: - CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "DataAbort Exception at 0x%X\n\r", LR); - break; - case 5: - CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "Reserved Exception at 0x%X\n\r", LR); - break; - case 6: - CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "IRQ Exception at 0x%X\n\r", LR); - break; - case 7: - CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "FIQ Exception at 0x%X\n\r", LR); - break; - default: - CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "Unknown Exception at 0x%X\n\r", LR); - break; - } - - SerialPortWrite ((UINT8 *)Buffer, CharCount); - while (1) { - } -} diff --git a/ArmPlatformPkg/Sec/Arm/Exception.S b/ArmPlatformPkg/Sec/Arm/Exception.S deleted file mode 100644 index 364b51260424..000000000000 --- a/ArmPlatformPkg/Sec/Arm/Exception.S +++ /dev/null @@ -1,96 +0,0 @@ -// -// Copyright (c) 2011, ARM Limited. All rights reserved. -// -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -# - -#include -#include -#include - -#start of the code section -.text -.align 5 - -# IMPORT -GCC_ASM_IMPORT(PeiCommonExceptionEntry) - -# EXPORT -GCC_ASM_EXPORT(PeiVectorTable) - -//============================================================ -//Default Exception Handlers -//============================================================ - - -ASM_PFX(PeiVectorTable): - b _DefaultResetHandler - b _DefaultUndefined - b _DefaultSWI - b _DefaultPrefetchAbort - b _DefaultDataAbort - b _DefaultReserved - b _DefaultIrq - b _DefaultFiq - -// -// Default Exception handlers: There is no plan to return from any of these exceptions. -// No context saving at all. -// -_DefaultResetHandler: - mov r1, lr - # Switch to SVC for common stack - cps #0x13 - mov r0, #0 - blx ASM_PFX(PeiCommonExceptionEntry) - -_DefaultUndefined: - sub r1, LR, #4 - # Switch to SVC for common stack - cps #0x13 - mov r0, #1 - blx ASM_PFX(PeiCommonExceptionEntry) - -_DefaultSWI: - sub r1, LR, #4 - # Switch to SVC for common stack - cps #0x13 - mov r0, #2 - blx ASM_PFX(PeiCommonExceptionEntry) - -_DefaultPrefetchAbort: - sub r1, LR, #4 - # Switch to SVC for common stack - cps #0x13 - mov r0, #3 - blx ASM_PFX(PeiCommonExceptionEntry) - -_DefaultDataAbort: - sub r1, LR, #8 - # Switch to SVC for common stack - cps #0x13 - mov r0, #4 - blx ASM_PFX(PeiCommonExceptionEntry) - -_DefaultReserved: - mov r1, lr - # Switch to SVC for common stack - cps #0x13 - mov r0, #5 - blx ASM_PFX(PeiCommonExceptionEntry) - -_DefaultIrq: - sub r1, LR, #4 - # Switch to SVC for common stack - cps #0x13 - mov r0, #6 - blx ASM_PFX(PeiCommonExceptionEntry) - -_DefaultFiq: - sub r1, LR, #4 - # Switch to SVC for common stack - cps #0x13 - mov r0, #7 - blx ASM_PFX(PeiCommonExceptionEntry) - diff --git a/ArmPlatformPkg/Sec/Arm/ModuleEntryPoint.S b/ArmPlatformPkg/Sec/Arm/ModuleEntryPoint.S deleted file mode 100644 index 7cb3de7d350a..000000000000 --- a/ArmPlatformPkg/Sec/Arm/ModuleEntryPoint.S +++ /dev/null @@ -1,46 +0,0 @@ -// -// Copyright (c) 2011-2013, ARM Limited. All rights reserved. -// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -// - -#include - -ASM_FUNC(_ModuleEntryPoint) - // Do early platform specific actions - bl ASM_PFX(ArmPlatformPeiBootAction) - -#if (FixedPcdGet32 (PcdVFPEnabled)) - // Enable Floating Point. This needs to be done before entering C code, which - // may use FP/SIMD registers. - bl ArmEnableVFP -#endif - - // Get the top of the primary stacks (and the base of the secondary stacks) - MOV32 (r1, FixedPcdGet64(PcdCPUCoresStackBase) + FixedPcdGet32(PcdCPUCorePrimaryStackSize)) - - // Set up the stack pointer - mov sp, r1 - - // Apply the init value to the entire stack - MOV32 (r8, FixedPcdGet64 (PcdCPUCoresStackBase)) - MOV32 (r9, FixedPcdGet32 (PcdInitValueInTempStack)) - mov r10, r9 - mov r11, r9 - mov r12, r9 -0:stm r8!, {r9-r12} - cmp r8, r1 - blt 0b - - // The PEI Core Entry Point has been computed by GenFV and stored in the second entry of the Reset Vector - MOV32 (r2, FixedPcdGet32(PcdFvBaseAddress)) - ldr r0, [r2, #4] - - // Move sec startup address into a data register - // Ensure we're jumping to FV version of the code (not boot remapped alias) - ldr r3, =ASM_PFX(CEntryPoint) - - // Jump to PrePeiCore C code - // r0 = pei_core_address - blx r3 diff --git a/ArmPlatformPkg/Sec/Arm/SwitchStack.S b/ArmPlatformPkg/Sec/Arm/SwitchStack.S deleted file mode 100644 index 028ee26e89e4..000000000000 --- a/ArmPlatformPkg/Sec/Arm/SwitchStack.S +++ /dev/null @@ -1,32 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.
-# Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -#/** -# This allows the caller to switch the stack and return -# -# @param StackDelta Signed amount by which to modify the stack pointer -# -# @return Nothing. Goes to the Entry Point passing in the new parameters -# -#**/ -#VOID -#EFIAPI -#SecSwitchStack ( -# VOID *StackDelta -# )# -# -ASM_FUNC(SecSwitchStack) - mov R1, R13 - add R1, R0, R1 - mov R13, R1 - bx LR - - - diff --git a/ArmPlatformPkg/Sec/Sec.inf b/ArmPlatformPkg/Sec/Sec.inf index 620670768eb4..3a758736dac9 100644 --- a/ArmPlatformPkg/Sec/Sec.inf +++ b/ArmPlatformPkg/Sec/Sec.inf @@ -18,12 +18,6 @@ Sec.h Sec.c -[Sources.ARM] - Arm/ArchSec.c - Arm/Exception.S - Arm/ModuleEntryPoint.S - Arm/SwitchStack.S - [Sources.AARCH64] AArch64/ArchSec.c AArch64/Exception.S @@ -65,6 +59,3 @@ gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize gEfiMdeModulePkgTokenSpaceGuid.PcdInitValueInTempStack - -[FixedPcd.ARM] - gArmTokenSpaceGuid.PcdVFPEnabled From 45147d3021a52f8b74fae42fb3e7e0235e2a6f73 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 22 Sep 2025 11:11:07 -0700 Subject: [PATCH 0528/1172] ArmPlatformPkg: Remove ARM32 Support from ArmPlatformLibNull edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 files from ArmPlatformLibNull. Signed-off-by: Oliver Smith-Denny --- .../ArmPlatformLibNull/Arm/ArmPlatformHelper.S | 12 ------------ .../ArmPlatformLibNull/ArmPlatformLibNull.inf | 3 --- 2 files changed, 15 deletions(-) delete mode 100644 ArmPlatformPkg/Library/ArmPlatformLibNull/Arm/ArmPlatformHelper.S diff --git a/ArmPlatformPkg/Library/ArmPlatformLibNull/Arm/ArmPlatformHelper.S b/ArmPlatformPkg/Library/ArmPlatformLibNull/Arm/ArmPlatformHelper.S deleted file mode 100644 index 0e11c34af5d1..000000000000 --- a/ArmPlatformPkg/Library/ArmPlatformLibNull/Arm/ArmPlatformHelper.S +++ /dev/null @@ -1,12 +0,0 @@ -// -// Copyright (c) 2012-2013, ARM Limited. All rights reserved. -// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -// - -#include -#include - -ASM_FUNC(ArmPlatformPeiBootAction) - bx lr diff --git a/ArmPlatformPkg/Library/ArmPlatformLibNull/ArmPlatformLibNull.inf b/ArmPlatformPkg/Library/ArmPlatformLibNull/ArmPlatformLibNull.inf index 4a1cd97e3553..1b748b2b5928 100644 --- a/ArmPlatformPkg/Library/ArmPlatformLibNull/ArmPlatformLibNull.inf +++ b/ArmPlatformPkg/Library/ArmPlatformLibNull/ArmPlatformLibNull.inf @@ -27,9 +27,6 @@ ArmPlatformLibNull.c ArmPlatformLibNullMem.c -[Sources.Arm] - Arm/ArmPlatformHelper.S | GCC - [Sources.AArch64] AArch64/ArmPlatformHelper.S From cebf57e7012e901353674d27298d3233a7af97ea Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 08:56:33 -0700 Subject: [PATCH 0529/1172] ArmPkg: Remove ARM32 Comments and Supported Arch edk2 is dropping support for the ARM32 architecture. This commit removes comments mentioning ARM32 and ARM32 as a supported arch in ArmPkg. Signed-off-by: Oliver Smith-Denny --- ArmPkg/ArmPkg.dec | 7 +++---- ArmPkg/ArmPkg.dsc | 2 +- ArmPkg/Drivers/ArmPciCpuIo2Dxe/ArmPciCpuIo2Dxe.inf | 2 +- ArmPkg/Drivers/CpuPei/CpuPei.inf | 2 +- ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.c | 11 +++++------ ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.inf | 2 +- .../DebugPeCoffExtraActionLib.inf | 2 +- .../LinuxBootBootManagerLib.inf | 2 +- .../PlatformBootManagerLib/PlatformBootManagerLib.inf | 2 +- .../ProcessorSubClassDxe/SmbiosProcessorArmCommon.c | 2 +- 10 files changed, 16 insertions(+), 18 deletions(-) diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec index a2b7c173d1ed..ad82faea8b5f 100644 --- a/ArmPkg/ArmPkg.dec +++ b/ArmPkg/ArmPkg.dec @@ -77,7 +77,7 @@ ArmTransferListLib|Include/Library/ArmTransferListLib.h ## @libraryclass Defines a set of interfaces for the MM core entrypoint for - ## AArch64 and ARM. + ## AArch64. StandaloneMmCoreEntryPoint|Include/Library/ArmStandaloneMmCoreEntryPoint.h [Guids.common] @@ -176,9 +176,8 @@ # # Value to add to a host address to obtain a device address, using - # unsigned 64-bit integer arithmetic on both ARM and AArch64. This - # means we can rely on truncation on overflow to specify negative - # offsets. + # unsigned 64-bit integer arithmetic on AArch64. This means we can + # rely on truncation on overflow to specify negative offsets. # gArmTokenSpaceGuid.PcdArmDmaDeviceOffset|0x0|UINT64|0x0000044 diff --git a/ArmPkg/ArmPkg.dsc b/ArmPkg/ArmPkg.dsc index fb418674466a..d4d483cf2bfe 100644 --- a/ArmPkg/ArmPkg.dsc +++ b/ArmPkg/ArmPkg.dsc @@ -22,7 +22,7 @@ PLATFORM_VERSION = 0.1 DSC_SPECIFICATION = 0x00010005 OUTPUT_DIRECTORY = Build/Arm - SUPPORTED_ARCHITECTURES = ARM|AARCH64 + SUPPORTED_ARCHITECTURES = AARCH64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT diff --git a/ArmPkg/Drivers/ArmPciCpuIo2Dxe/ArmPciCpuIo2Dxe.inf b/ArmPkg/Drivers/ArmPciCpuIo2Dxe/ArmPciCpuIo2Dxe.inf index 9339c2b532fb..525e3453fdec 100644 --- a/ArmPkg/Drivers/ArmPciCpuIo2Dxe/ArmPciCpuIo2Dxe.inf +++ b/ArmPkg/Drivers/ArmPciCpuIo2Dxe/ArmPciCpuIo2Dxe.inf @@ -19,7 +19,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = ARM AARCH64 +# VALID_ARCHITECTURES = AARCH64 # [Sources] diff --git a/ArmPkg/Drivers/CpuPei/CpuPei.inf b/ArmPkg/Drivers/CpuPei/CpuPei.inf index a9a238abfee9..8cb683363585 100644 --- a/ArmPkg/Drivers/CpuPei/CpuPei.inf +++ b/ArmPkg/Drivers/CpuPei/CpuPei.inf @@ -22,7 +22,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = ARM +# VALID_ARCHITECTURES = AARCH64 # [Sources] diff --git a/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.c b/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.c index 9832aba4b3a1..e01465392ed8 100644 --- a/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.c +++ b/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.c @@ -36,7 +36,7 @@ ArchVectorConfig ( IN UINTN VectorBaseAddress ); -// these globals are provided by the architecture specific source (Arm or AArch64) +// these globals are provided by the architecture specific source (AArch64) extern UINTN gMaxExceptionNumber; extern EFI_EXCEPTION_CALLBACK gExceptionHandlers[]; extern PHYSICAL_ADDRESS gExceptionVectorAlignmentMask; @@ -70,10 +70,9 @@ InitializeCpuExceptionHandlers ( // The vector table must be aligned for the architecture. If this // assertion fails ensure the appropriate FFS alignment is in effect, // which can be accomplished by ensuring the proper Align=X statement - // in the platform packaging rules. For ARM Align=32 is required and - // for AArch64 Align=4K is required. Align=Auto can be used but this - // is known to cause an issue with populating the reset vector area - // for encapsulated FVs. + // in the platform packaging rules. For AArch64 Align=4K is required. + // Align=Auto can be used but this is known to cause an issue with + // populating the reset vector area for encapsulated FVs. ASSERT (((UINTN)ExceptionHandlersStart & gExceptionVectorAlignmentMask) == 0); VectorBase = (UINT64)(UINTN)ExceptionHandlersStart; @@ -88,7 +87,7 @@ InitializeCpuExceptionHandlers ( } /** -Registers a function to be called from the processor exception handler. (On ARM/AArch64 this only +Registers a function to be called from the processor exception handler. (On AArch64 this only provides exception handlers, not interrupt handling which is provided through the Hardware Interrupt Protocol.) diff --git a/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.inf b/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.inf index 611b49b99c1d..9091df0a0879 100644 --- a/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.inf +++ b/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.inf @@ -1,5 +1,5 @@ ## @file -# Instance of CpuExceptionHandlerLib Library for ARM/AArch64 architectures +# Instance of CpuExceptionHandlerLib Library for AArch64 architectures # # This library instance is used for modules that will implement exception # handlers in-place (by programming VBAR). The exception handlers will be diff --git a/ArmPkg/Library/DebugPeCoffExtraActionLib/DebugPeCoffExtraActionLib.inf b/ArmPkg/Library/DebugPeCoffExtraActionLib/DebugPeCoffExtraActionLib.inf index 42b283d64590..023a122c500c 100644 --- a/ArmPkg/Library/DebugPeCoffExtraActionLib/DebugPeCoffExtraActionLib.inf +++ b/ArmPkg/Library/DebugPeCoffExtraActionLib/DebugPeCoffExtraActionLib.inf @@ -20,7 +20,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = ARM +# VALID_ARCHITECTURES = AARCH64 # [Sources.common] diff --git a/ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBootManagerLib.inf b/ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBootManagerLib.inf index 139b6171990a..20d9f2a144cc 100644 --- a/ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBootManagerLib.inf +++ b/ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBootManagerLib.inf @@ -22,7 +22,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = ARM AARCH64 +# VALID_ARCHITECTURES = AARCH64 # [Sources] diff --git a/ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf b/ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf index 44b9a2503507..b5251e5af4f2 100644 --- a/ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf +++ b/ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf @@ -21,7 +21,7 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = ARM AARCH64 +# VALID_ARCHITECTURES = AARCH64 # [Sources] diff --git a/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/SmbiosProcessorArmCommon.c b/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/SmbiosProcessorArmCommon.c index b961be213358..bc9aa7d174cf 100644 --- a/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/SmbiosProcessorArmCommon.c +++ b/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/SmbiosProcessorArmCommon.c @@ -1,5 +1,5 @@ /** @file - Functions for processor information common to ARM and AARCH64. + Functions for processor information common to AARCH64. Copyright (c) 2021, NUVIA Inc. All rights reserved.
Copyright (c) 2021 - 2022, Ampere Computing LLC. All rights reserved.
From bacb949dd9c774b8368ac727da9023dbdfa4e15c Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 22 Sep 2025 11:27:30 -0700 Subject: [PATCH 0530/1172] ArmPkg: Remove ARM32 Support from SemiHostFs edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 files from SemiHostLib and SemiHostFs. Signed-off-by: Oliver Smith-Denny --- .../SemihostFs/{Arm => AArch64}/SemihostFs.c | 0 .../SemihostFs/{Arm => AArch64}/SemihostFs.h | 0 ArmPkg/Filesystem/SemihostFs/SemihostFs.inf | 4 +- ArmPkg/Library/SemihostLib/Arm/GccSemihost.S | 31 ----- ArmPkg/Library/SemihostLib/SemihostLib.inf | 5 +- ArmPkg/Library/SemihostLib/SemihostPrivate.h | 121 +----------------- 6 files changed, 6 insertions(+), 155 deletions(-) rename ArmPkg/Filesystem/SemihostFs/{Arm => AArch64}/SemihostFs.c (100%) rename ArmPkg/Filesystem/SemihostFs/{Arm => AArch64}/SemihostFs.h (100%) delete mode 100644 ArmPkg/Library/SemihostLib/Arm/GccSemihost.S diff --git a/ArmPkg/Filesystem/SemihostFs/Arm/SemihostFs.c b/ArmPkg/Filesystem/SemihostFs/AArch64/SemihostFs.c similarity index 100% rename from ArmPkg/Filesystem/SemihostFs/Arm/SemihostFs.c rename to ArmPkg/Filesystem/SemihostFs/AArch64/SemihostFs.c diff --git a/ArmPkg/Filesystem/SemihostFs/Arm/SemihostFs.h b/ArmPkg/Filesystem/SemihostFs/AArch64/SemihostFs.h similarity index 100% rename from ArmPkg/Filesystem/SemihostFs/Arm/SemihostFs.h rename to ArmPkg/Filesystem/SemihostFs/AArch64/SemihostFs.h diff --git a/ArmPkg/Filesystem/SemihostFs/SemihostFs.inf b/ArmPkg/Filesystem/SemihostFs/SemihostFs.inf index cd79e18b26cd..825b34850b2d 100644 --- a/ArmPkg/Filesystem/SemihostFs/SemihostFs.inf +++ b/ArmPkg/Filesystem/SemihostFs/SemihostFs.inf @@ -17,8 +17,8 @@ ENTRY_POINT = SemihostFsEntryPoint -[Sources.ARM, Sources.AARCH64] - Arm/SemihostFs.c +[Sources.AARCH64] + AArch64/SemihostFs.c [Packages] MdePkg/MdePkg.dec diff --git a/ArmPkg/Library/SemihostLib/Arm/GccSemihost.S b/ArmPkg/Library/SemihostLib/Arm/GccSemihost.S deleted file mode 100644 index da02a1f1cf0b..000000000000 --- a/ArmPkg/Library/SemihostLib/Arm/GccSemihost.S +++ /dev/null @@ -1,31 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -/* - Semihosting operation request mechanism - - SVC 0x123456 in ARM state (for all architectures) - SVC 0xAB in Thumb state (excluding ARMv7-M) - BKPT 0xAB for ARMv7-M (Thumb-2 only) - - R0 - operation type - R1 - block containing all other parametes - - lr - must be saved as svc instruction will cause an svc exception and write - the svc lr register. That happens to be the one we are using, so we must - save it or we will not be able to return. - */ -ASM_FUNC(GccSemihostCall) - stmfd sp!, {lr} - svc #0x123456 - ldmfd sp!, {lr} - bx lr - - diff --git a/ArmPkg/Library/SemihostLib/SemihostLib.inf b/ArmPkg/Library/SemihostLib/SemihostLib.inf index 2a4409f6573b..e7f3602e9ce2 100644 --- a/ArmPkg/Library/SemihostLib/SemihostLib.inf +++ b/ArmPkg/Library/SemihostLib/SemihostLib.inf @@ -21,15 +21,12 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = ARM AARCH64 +# VALID_ARCHITECTURES = AARCH64 # [Sources.common] SemihostLib.c SemihostPrivate.h -[Sources.ARM] - Arm/GccSemihost.S | GCC - [Sources.AARCH64] AArch64/GccSemihost.S diff --git a/ArmPkg/Library/SemihostLib/SemihostPrivate.h b/ArmPkg/Library/SemihostLib/SemihostPrivate.h index 22abbf3bae7e..d77308db73e5 100644 --- a/ArmPkg/Library/SemihostLib/SemihostPrivate.h +++ b/ArmPkg/Library/SemihostLib/SemihostPrivate.h @@ -50,122 +50,7 @@ typedef struct { UINTN CommandLength; } SEMIHOST_SYSTEM_BLOCK; -#if defined (__CC_ARM) - - #if defined (__thumb__) -#define SWI 0xAB - #else -#define SWI 0x123456 - #endif - -#define SEMIHOST_SUPPORTED TRUE - -__swi (SWI) -INT32 -_Semihost_SYS_OPEN ( - IN UINTN SWI_0x01, - IN SEMIHOST_FILE_OPEN_BLOCK *OpenBlock - ); - -__swi (SWI) -INT32 -_Semihost_SYS_CLOSE ( - IN UINTN SWI_0x02, - IN UINT32 *Handle - ); - -__swi (SWI) -VOID -_Semihost_SYS_WRITEC ( - IN UINTN SWI_0x03, - IN CHAR8 *Character - ); - -__swi (SWI) -VOID -_Semihost_SYS_WRITE0 ( - IN UINTN SWI_0x04, - IN CHAR8 *String - ); - -__swi (SWI) -UINT32 -_Semihost_SYS_WRITE ( - IN UINTN SWI_0x05, - IN OUT SEMIHOST_FILE_READ_WRITE_BLOCK *WriteBlock - ); - -__swi (SWI) -UINT32 -_Semihost_SYS_READ ( - IN UINTN SWI_0x06, - IN OUT SEMIHOST_FILE_READ_WRITE_BLOCK *ReadBlock - ); - -__swi (SWI) -CHAR8 -_Semihost_SYS_READC ( - IN UINTN SWI_0x07, - IN UINTN Zero - ); - -__swi (SWI) -INT32 -_Semihost_SYS_SEEK ( - IN UINTN SWI_0x0A, - IN SEMIHOST_FILE_SEEK_BLOCK *SeekBlock - ); - -__swi (SWI) -INT32 -_Semihost_SYS_FLEN ( - IN UINTN SWI_0x0C, - IN UINT32 *Handle - ); - -__swi (SWI) -UINT32 -_Semihost_SYS_TMPNAME ( - IN UINTN SWI_0x0D, - IN SEMIHOST_FILE_TMPNAME_BLOCK *TmpNameBlock - ); - -__swi (SWI) -UINT32 -_Semihost_SYS_REMOVE ( - IN UINTN SWI_0x0E, - IN SEMIHOST_FILE_REMOVE_BLOCK *RemoveBlock - ); - -__swi (SWI) -UINT32 -_Semihost_SYS_RENAME ( - IN UINTN SWI_0x0F, - IN SEMIHOST_FILE_RENAME_BLOCK *RenameBlock - ); - -__swi (SWI) -UINT32 -_Semihost_SYS_SYSTEM ( - IN UINTN SWI_0x12, - IN SEMIHOST_SYSTEM_BLOCK *SystemBlock - ); - -#define SEMIHOST_SYS_OPEN(OpenBlock) _Semihost_SYS_OPEN(0x01, OpenBlock) -#define SEMIHOST_SYS_CLOSE(Handle) _Semihost_SYS_CLOSE(0x02, Handle) -#define SEMIHOST_SYS_WRITE0(String) _Semihost_SYS_WRITE0(0x04, String) -#define SEMIHOST_SYS_WRITEC(Character) _Semihost_SYS_WRITEC(0x03, Character) -#define SEMIHOST_SYS_WRITE(WriteBlock) _Semihost_SYS_WRITE(0x05, WriteBlock) -#define SEMIHOST_SYS_READ(ReadBlock) _Semihost_SYS_READ(0x06, ReadBlock) -#define SEMIHOST_SYS_READC() _Semihost_SYS_READC(0x07, 0) -#define SEMIHOST_SYS_SEEK(SeekBlock) _Semihost_SYS_SEEK(0x0A, SeekBlock) -#define SEMIHOST_SYS_FLEN(Handle) _Semihost_SYS_FLEN(0x0C, Handle) -#define SEMIHOST_SYS_TMPNAME(TmpNameBlock) _Semihost_SYS_TMPNAME(0x0D, TmpNameBlock) -#define SEMIHOST_SYS_REMOVE(RemoveBlock) _Semihost_SYS_REMOVE(0x0E, RemoveBlock) -#define SEMIHOST_SYS_RENAME(RenameBlock) _Semihost_SYS_RENAME(0x0F, RenameBlock) -#define SEMIHOST_SYS_SYSTEM(SystemBlock) _Semihost_SYS_SYSTEM(0x12, SystemBlock) - -#elif defined (__GNUC__) // __CC_ARM +#if defined (__GNUC__) #define SEMIHOST_SUPPORTED TRUE @@ -189,7 +74,7 @@ GccSemihostCall ( #define SEMIHOST_SYS_RENAME(RenameBlock) GccSemihostCall(0x0F, (UINTN)(RenameBlock)) #define SEMIHOST_SYS_SYSTEM(SystemBlock) GccSemihostCall(0x12, (UINTN)(SystemBlock)) -#else // __CC_ARM +#else // __GNUC__ #define SEMIHOST_SUPPORTED FALSE @@ -207,6 +92,6 @@ GccSemihostCall ( #define SEMIHOST_SYS_RENAME(RenameBlock) (-1) #define SEMIHOST_SYS_SYSTEM(SystemBlock) (-1) -#endif // __CC_ARM +#endif // __GNUC__ #endif // SEMIHOST_PRIVATE_H_ From 3741a42087c587f95611641b8a96cf65b6c2975f Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 22 Sep 2025 11:30:17 -0700 Subject: [PATCH 0531/1172] ArmPkg: Remove ARM32 Support from ArmGicDxe edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 files from ArmGicDxe. Signed-off-by: Oliver Smith-Denny --- ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf | 4 - ArmPkg/Drivers/ArmGicDxe/GicV3/Arm/ArmGicV3.S | 96 ------------------- 2 files changed, 100 deletions(-) delete mode 100644 ArmPkg/Drivers/ArmGicDxe/GicV3/Arm/ArmGicV3.S diff --git a/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf b/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf index 6d4d78456080..510a938c4094 100644 --- a/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf +++ b/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf @@ -24,10 +24,6 @@ GicV2/ArmGicV2Dxe.c GicV3/ArmGicV3Dxe.c -[Sources.ARM] - GicV3/Arm/ArmGicV3.S | GCC - GicV5/Arm/ArmGicV5.c - [Sources.AARCH64] GicV3/AArch64/ArmGicV3.S GicV5/AArch64/ArmGicV5.S diff --git a/ArmPkg/Drivers/ArmGicDxe/GicV3/Arm/ArmGicV3.S b/ArmPkg/Drivers/ArmGicDxe/GicV3/Arm/ArmGicV3.S deleted file mode 100644 index d57e17b901d1..000000000000 --- a/ArmPkg/Drivers/ArmGicDxe/GicV3/Arm/ArmGicV3.S +++ /dev/null @@ -1,96 +0,0 @@ -# -# Copyright (c) 2014, ARM Limited. All rights reserved. -# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -# - -#include -#include - -// For the moment we assume this will run in SVC mode on ARMv7 - -//UINT32 -//EFIAPI -//ArmGicGetControlSystemRegisterEnable ( -// VOID -// ); -ASM_FUNC(ArmGicV3GetControlSystemRegisterEnable) - mrc p15, 0, r0, c12, c12, 5 // ICC_SRE - bx lr - -//VOID -//EFIAPI -//ArmGicSetControlSystemRegisterEnable ( -// IN UINT32 ControlSystemRegisterEnable -// ); -ASM_FUNC(ArmGicV3SetControlSystemRegisterEnable) - mcr p15, 0, r0, c12, c12, 5 // ICC_SRE - isb - bx lr - -//VOID -//ArmGicV3EnableInterruptInterface ( -// VOID -// ); -ASM_FUNC(ArmGicV3EnableInterruptInterface) - mov r0, #1 - mcr p15, 0, r0, c12, c12, 7 // ICC_IGRPEN1 - bx lr - -//VOID -//ArmGicV3DisableInterruptInterface ( -// VOID -// ); -ASM_FUNC(ArmGicV3DisableInterruptInterface) - mov r0, #0 - mcr p15, 0, r0, c12, c12, 7 // ICC_IGRPEN1 - bx lr - -//VOID -//ArmGicV3EndOfInterrupt ( -// IN UINTN InterruptId -// ); -ASM_FUNC(ArmGicV3EndOfInterrupt) - mcr p15, 0, r0, c12, c12, 1 //ICC_EOIR1 - bx lr - -//UINTN -//ArmGicV3AcknowledgeInterrupt ( -// VOID -// ); -ASM_FUNC(ArmGicV3AcknowledgeInterrupt) - mrc p15, 0, r0, c12, c12, 0 //ICC_IAR1 - bx lr - -//VOID -//ArmGicV3SetPriorityMask ( -// IN UINTN Priority -// ); -ASM_FUNC(ArmGicV3SetPriorityMask) - mcr p15, 0, r0, c4, c6, 0 //ICC_PMR - bx lr - -//VOID -//ArmGicV3SetBinaryPointer ( -// IN UINTN BinaryPoint -// ); -ASM_FUNC(ArmGicV3SetBinaryPointer) - mcr p15, 0, r0, c12, c12, 3 //ICC_BPR1 - bx lr - -//UINTN -//ArmGicV3GetControlRegister( -// VOID -// ); -ASM_FUNC(ArmGicV3GetControlRegister) - mrc p15, 0, r0, c12, c12, 4 //ICC_CTLR - bx lr - -//VOID -//ArmGicV3SetControlRegister( -// IN UINTN Value -// ); -ASM_FUNC(ArmGicV3SetControlRegister) - mcr p15, 0, r0, c12, c12, 4 //ICC_CTLR - bx lr From 88b5cb3e126e48ad457193ea6eb830d34a996a05 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 22 Sep 2025 16:15:21 -0700 Subject: [PATCH 0532/1172] ArmPkg: Remove ARM32 Support from DefaultExceptionHandlerLib edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 files from DefaultExceptionHandlerLib. Signed-off-by: Oliver Smith-Denny --- .../Arm/DefaultExceptionHandler.c | 288 ------------------ .../DefaultExceptionHandlerLib.inf | 3 - 2 files changed, 291 deletions(-) delete mode 100644 ArmPkg/Library/DefaultExceptionHandlerLib/Arm/DefaultExceptionHandler.c diff --git a/ArmPkg/Library/DefaultExceptionHandlerLib/Arm/DefaultExceptionHandler.c b/ArmPkg/Library/DefaultExceptionHandlerLib/Arm/DefaultExceptionHandler.c deleted file mode 100644 index 50e4205c2326..000000000000 --- a/ArmPkg/Library/DefaultExceptionHandlerLib/Arm/DefaultExceptionHandler.c +++ /dev/null @@ -1,288 +0,0 @@ -/** @file - Default exception handler - - Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.
- Copyright (c) 2012 - 2021, Arm Ltd. All rights reserved.
- - SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -// -// Maximum number of characters to print to serial (UINT8s) and to console if -// available (as UINT16s) -// -#define MAX_PRINT_CHARS 100 - -// -// The number of elements in a CHAR8 array, including the terminating NUL, that -// is meant to hold the string rendering of the CPSR. -// -#define CPSR_STRING_SIZE 32 - -typedef struct { - UINT32 BIT; - CHAR8 Char; -} CPSR_CHAR; - -STATIC CONST CPSR_CHAR mCpsrChar[] = { - { 31, 'n' }, - { 30, 'z' }, - { 29, 'c' }, - { 28, 'v' }, - - { 9, 'e' }, - { 8, 'a' }, - { 7, 'i' }, - { 6, 'f' }, - { 5, 't' }, - { 0, '?' } -}; - -CHAR8 * -GetImageName ( - IN UINTN FaultAddress, - OUT UINTN *ImageBase, - OUT UINTN *PeCoffSizeOfHeaders - ); - -/** - Convert the Current Program Status Register (CPSR) to a string. The string is - a defacto standard in the ARM world. - - It is possible to add extra bits by adding them to mCpsrChar array. - - @param Cpsr ARM CPSR register value - @param ReturnStr CPSR_STRING_SIZE byte string that contains string - version of CPSR - -**/ -VOID -CpsrString ( - IN UINT32 Cpsr, - OUT CHAR8 *ReturnStr - ) -{ - UINTN Index; - CHAR8 *Str; - CHAR8 *ModeStr; - - Str = ReturnStr; - - for (Index = 0; mCpsrChar[Index].BIT != 0; Index++, Str++) { - *Str = mCpsrChar[Index].Char; - if ((Cpsr & (1 << mCpsrChar[Index].BIT)) != 0) { - // Concert to upper case if bit is set - *Str &= ~0x20; - } - } - - *Str++ = '_'; - *Str = '\0'; - - switch (Cpsr & 0x1f) { - case 0x10: - ModeStr = "usr"; - break; - case 0x011: - ModeStr = "fiq"; - break; - case 0x12: - ModeStr = "irq"; - break; - case 0x13: - ModeStr = "svc"; - break; - case 0x16: - ModeStr = "mon"; - break; - case 0x17: - ModeStr = "abt"; - break; - case 0x1b: - ModeStr = "und"; - break; - case 0x1f: - ModeStr = "sys"; - break; - - default: - ModeStr = "???"; - break; - } - - // - // See the interface contract in the leading comment block. - // - AsciiStrCatS (Str, CPSR_STRING_SIZE - (Str - ReturnStr), ModeStr); -} - -CHAR8 * -FaultStatusToString ( - IN UINT32 Status - ) -{ - CHAR8 *FaultSource; - - switch (Status) { - case 0x01: FaultSource = "Alignment fault"; - break; - case 0x02: FaultSource = "Debug event fault"; - break; - case 0x03: FaultSource = "Access Flag fault on Section"; - break; - case 0x04: FaultSource = "Cache maintenance operation fault[2]"; - break; - case 0x05: FaultSource = "Translation fault on Section"; - break; - case 0x06: FaultSource = "Access Flag fault on Page"; - break; - case 0x07: FaultSource = "Translation fault on Page"; - break; - case 0x08: FaultSource = "Precise External Abort"; - break; - case 0x09: FaultSource = "Domain fault on Section"; - break; - case 0x0b: FaultSource = "Domain fault on Page"; - break; - case 0x0c: FaultSource = "External abort on translation, first level"; - break; - case 0x0d: FaultSource = "Permission fault on Section"; - break; - case 0x0e: FaultSource = "External abort on translation, second level"; - break; - case 0x0f: FaultSource = "Permission fault on Page"; - break; - case 0x16: FaultSource = "Imprecise External Abort"; - break; - default: FaultSource = "No function"; - break; - } - - return FaultSource; -} - -STATIC CHAR8 *gExceptionTypeString[] = { - "Reset", - "Undefined OpCode", - "SVC", - "Prefetch Abort", - "Data Abort", - "Undefined", - "IRQ", - "FIQ" -}; - -/** - This is the default action to take on an unexpected exception - - Since this is exception context don't do anything crazy like try to allocate memory. - - @param ExceptionType Type of the exception - @param SystemContext Register state at the time of the Exception - - -**/ -VOID -DefaultExceptionHandler ( - IN EFI_EXCEPTION_TYPE ExceptionType, - IN OUT EFI_SYSTEM_CONTEXT SystemContext - ) -{ - CHAR8 Buffer[MAX_PRINT_CHARS]; - CHAR16 UnicodeBuffer[MAX_PRINT_CHARS]; - UINTN CharCount; - UINT32 DfsrStatus; - UINT32 IfsrStatus; - BOOLEAN DfsrWrite; - - CharCount = AsciiSPrint ( - Buffer, - sizeof (Buffer), - "\n%a Exception PC at 0x%08x CPSR 0x%08x ", - gExceptionTypeString[ExceptionType], - SystemContext.SystemContextArm->PC, - SystemContext.SystemContextArm->CPSR - ); - SerialPortWrite ((UINT8 *)Buffer, CharCount); - - // Prepare a unicode buffer for ConOut, if applicable, as Buffer is used - // below. - UnicodeSPrintAsciiFormat (UnicodeBuffer, MAX_PRINT_CHARS, Buffer); - - DEBUG_CODE_BEGIN (); - CHAR8 *Pdb; - UINT32 ImageBase; - UINT32 PeCoffSizeOfHeader; - UINT32 Offset; - CHAR8 CpsrStr[CPSR_STRING_SIZE]; - - CpsrString (SystemContext.SystemContextArm->CPSR, CpsrStr); - DEBUG ((DEBUG_ERROR, "%a\n", CpsrStr)); - - Pdb = GetImageName (SystemContext.SystemContextArm->PC, &ImageBase, &PeCoffSizeOfHeader); - Offset = SystemContext.SystemContextArm->PC - ImageBase; - if (Pdb != NULL) { - DEBUG ((DEBUG_ERROR, "%a\n", Pdb)); - - // - // A PE/COFF image loads its headers into memory so the headers are - // included in the linked addresses. ELF and Mach-O images do not - // include the headers so the first byte of the image is usually - // text (code). If you look at link maps from ELF or Mach-O images - // you need to subtract out the size of the PE/COFF header to get - // get the offset that matches the link map. - // - DEBUG ((DEBUG_ERROR, "loaded at 0x%08x (PE/COFF offset) 0x%x (ELF or Mach-O offset) 0x%x", ImageBase, Offset, Offset - PeCoffSizeOfHeader)); - } - - DEBUG_CODE_END (); - DEBUG ((DEBUG_ERROR, "\n R0 0x%08x R1 0x%08x R2 0x%08x R3 0x%08x\n", SystemContext.SystemContextArm->R0, SystemContext.SystemContextArm->R1, SystemContext.SystemContextArm->R2, SystemContext.SystemContextArm->R3)); - DEBUG ((DEBUG_ERROR, " R4 0x%08x R5 0x%08x R6 0x%08x R7 0x%08x\n", SystemContext.SystemContextArm->R4, SystemContext.SystemContextArm->R5, SystemContext.SystemContextArm->R6, SystemContext.SystemContextArm->R7)); - DEBUG ((DEBUG_ERROR, " R8 0x%08x R9 0x%08x R10 0x%08x R11 0x%08x\n", SystemContext.SystemContextArm->R8, SystemContext.SystemContextArm->R9, SystemContext.SystemContextArm->R10, SystemContext.SystemContextArm->R11)); - DEBUG ((DEBUG_ERROR, " R12 0x%08x SP 0x%08x LR 0x%08x PC 0x%08x\n", SystemContext.SystemContextArm->R12, SystemContext.SystemContextArm->SP, SystemContext.SystemContextArm->LR, SystemContext.SystemContextArm->PC)); - DEBUG ((DEBUG_ERROR, "DFSR 0x%08x DFAR 0x%08x IFSR 0x%08x IFAR 0x%08x\n", SystemContext.SystemContextArm->DFSR, SystemContext.SystemContextArm->DFAR, SystemContext.SystemContextArm->IFSR, SystemContext.SystemContextArm->IFAR)); - - // Bit10 is Status[4] Bit3:0 is Status[3:0] - DfsrStatus = (SystemContext.SystemContextArm->DFSR & 0xf) | ((SystemContext.SystemContextArm->DFSR >> 6) & 0x10); - DfsrWrite = (SystemContext.SystemContextArm->DFSR & BIT11) != 0; - if (DfsrStatus != 0x00) { - DEBUG ((DEBUG_ERROR, " %a: %a 0x%08x\n", FaultStatusToString (DfsrStatus), DfsrWrite ? "write to" : "read from", SystemContext.SystemContextArm->DFAR)); - } - - IfsrStatus = (SystemContext.SystemContextArm->IFSR & 0xf) | ((SystemContext.SystemContextArm->IFSR >> 6) & 0x10); - if (IfsrStatus != 0) { - DEBUG ((DEBUG_ERROR, " Instruction %a at 0x%08x\n", FaultStatusToString (SystemContext.SystemContextArm->IFSR & 0xf), SystemContext.SystemContextArm->IFAR)); - } - - DEBUG ((DEBUG_ERROR, "\n")); - - // Attempt to print that we had a synchronous exception to ConOut. We do - // this after the serial logging as ConOut's logging is more complex and we - // aren't guaranteed to succeed. - if (gST->ConOut != NULL) { - gST->ConOut->OutputString (gST->ConOut, UnicodeBuffer); - } - - ASSERT (FALSE); - - CpuDeadLoop (); // may return if executing under a debugger - - // Clear the error registers that we have already displayed incase some one wants to keep going - SystemContext.SystemContextArm->DFSR = 0; - SystemContext.SystemContextArm->IFSR = 0; -} diff --git a/ArmPkg/Library/DefaultExceptionHandlerLib/DefaultExceptionHandlerLib.inf b/ArmPkg/Library/DefaultExceptionHandlerLib/DefaultExceptionHandlerLib.inf index 30291a466320..201ead595024 100644 --- a/ArmPkg/Library/DefaultExceptionHandlerLib/DefaultExceptionHandlerLib.inf +++ b/ArmPkg/Library/DefaultExceptionHandlerLib/DefaultExceptionHandlerLib.inf @@ -19,9 +19,6 @@ [Sources.common] DefaultExceptionHandlerUefi.c -[Sources.ARM] - Arm/DefaultExceptionHandler.c - [Sources.AARCH64] AArch64/DefaultExceptionHandler.c From f75198f5928beb5400848a3594da1416a04428df Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 22 Sep 2025 16:17:09 -0700 Subject: [PATCH 0533/1172] ArmPkg: Remove ARM32 Support from ArmStandaloneMmCoreEntryPoint edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 files from ArmStandaloneMmCoreEntryPoint. Signed-off-by: Oliver Smith-Denny --- .../Arm/ModuleEntryPoint.S | 220 ------------------ .../ArmStandaloneMmCoreEntryPoint.c | 9 +- .../ArmStandaloneMmCoreEntryPoint.inf | 10 +- 3 files changed, 6 insertions(+), 233 deletions(-) delete mode 100644 ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/Arm/ModuleEntryPoint.S diff --git a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/Arm/ModuleEntryPoint.S b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/Arm/ModuleEntryPoint.S deleted file mode 100644 index 28a9e72e1323..000000000000 --- a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/Arm/ModuleEntryPoint.S +++ /dev/null @@ -1,220 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Entrypoint of StandaloneMm. -# -# Copyright (c) 2024, Arm Limited. All rights reserved. -# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -# @par Reference(s): -# - [1] SPM based on the MM interface. -# (https://trustedfirmware-a.readthedocs.io/en/latest/components/ -# secure-partition-manager-mm.html) -# - [2] Arm Firmware Framework for Armv8-A, DEN0077, version 1.2 -# (https://developer.arm.com/documentation/den0077/latest/) -# - [3] FF-A Memory Management Protocol for Armv8-A, DEN0140, version 1.2 -# (https://developer.arm.com/documentation/den0140/latest/) -# -#------------------------------------------------------------------------------ - -#include -#include -#include -#include - -.data -.section .data.stmm_stack, "aw" -.align 12 -// Define a data section to be used for setting up the -// stack for StandaloneMm -stmm_stack: -.zero FixedPcdGet32 (PcdStMmStackSize) - -.text -// -// Check whether it is possible to use FF-A. -// If FF-A can use, return TRUE. otherwise return FALSE. -// -// BOOLEAN -// EFIAPI -// CheckFfaSupport ( -// VOID -// ) -// -ASM_FUNC(CheckFfaSupport) - // - // Try to check FF-A support via FFA_VERSION - // See [2], Section 13.2 FFA_VERSION - // - MOV32 (r0, ARM_FID_FFA_VERSION) - - // Set r1 as request version. - MOV32 (r1, ARM_FFA_CREATE_VERSION ( - ARM_FFA_MAJOR_VERSION, - ARM_FFA_MINOR_VERSION)) - - svc #0 - - // Set r4 as ARM_FFA_RET_NOT_SUPPORTED (-1) - mvn r4, #0x00 - - cmp r0, r4 - movne r0, #0x01 - moveq r0, #0x00 - mov r4, #0x00 - bx lr - -// -// Set write memory permission on StandaloneMm stack area via FF-A request. -// If success, return StMmStackBaseAddr. otherwise return 0. -// -// UINTN -// EFIAPI -// SetStackPermissionFfa ( -// IN UINTN StMmStackTopAddr -// ) -// -ASM_FUNC(SetStackPermissionFfa) - // - // Try to set write permission on stmm_stack with FF-A request - // See [3], Section 2.9 FFA_MEM_PERM_SET - // - MOV32 (r2, FixedPcdGet32 (PcdStMmStackSize)) - - // r1 = stmm_stack top - mov r1, r0 - - // r12 = Compute and save the stack base - add r12, r1, r2 - - // r2 = Count of pages of stmm_stack - lsr r2, r2, #EFI_PAGE_SHIFT - - // r3 = Memory permission - MOV32 (r3, - ARM_FFA_SET_MEM_ATTR_MAKE_PERM_REQUEST ( - ARM_FFA_SET_MEM_ATTR_DATA_PERM_RW, - ARM_FFA_SET_MEM_ATTR_CODE_PERM_XN)) - - MOV32 (r0, ARM_FID_FFA_MEM_PERM_SET) - - // Call FFA_MEM_PERM_SET to set stmm_stack with write permission - // See [3], Section 2.9 FFA_MEM_PERM_SET - svc #0 - - // Check FFA_MEM_PERM_SET operation is success. - MOV32 (r5, ARM_FID_FFA_SUCCESS_AARCH32) - cmp r0, r5 - - // Set return value as base address of stack. - mov r0, r12 - bne .Lout_set_stack_perm_ffa - // If failed, set return value as zero. - mov r0, #0x00 - -.Lout_set_stack_perm_ffa: - // Initialise SP with temp stack - mov r5, #0x00 - mov r12, #0x00 - bx lr - -// -// Set write memory permission on StandaloneMm stack area via SpmMm. -// If success, return StMmStackTopAddr. otherwise return 0. -// -// UINTN -// EFIAPI -// SetStackPermissionSpmMm ( -// IN UINTN StMmStackTopAddr -// ) -// -ASM_FUNC(SetStackPermissionSpmMm) - // - // Try to set write permission on stmm_stack with SPM_MM request - // See [1], Section 4.16.5.5.1 MM_SP_MEMORY_ATTRIBUTES_SET_AARCH64. - // - MOV32 (r2, FixedPcdGet32 (PcdStMmStackSize)) - - // r1 = stmm_stack top - mov r1, r0 - - // r12 = Compute and save the stack base - add r12, r1, r2 - - // r2 = Count of pages of stmm_stack - lsr r2, r2, #EFI_PAGE_SHIFT - - // r3 = Memory permission - MOV32 (r3, - ARM_SPM_MM_SET_MEM_ATTR_MAKE_PERM_REQUEST ( - ARM_SPM_MM_SET_MEM_ATTR_DATA_PERM_RW, - ARM_SPM_MM_SET_MEM_ATTR_CODE_PERM_XN)) - - MOV32 (r0, ARM_FID_SPM_MM_SP_SET_MEM_ATTRIBUTES) - - // Call SPM_MM_SP_SET_MEM_ATTRIBUTES to set stmm_stack with write permission - // See [1], Section 4.16.5.5.1 MM_SP_MEMORY_ATTRIBUTES_SET_AARCH64. - svc #0 - - MOV32 (r5, ARM_SPM_MM_RET_SUCCESS) - cmp r0, r5 - - // Set return value as base address of stack. - mov r0, r12 - beq .Lout_set_stack_perm - // If failed, set return value as zero. - mov r0, #0x00 - -.Lout_set_stack_perm: - mov r5, #0x00 - mov r12, #0x00 - bx lr - -// -// Entry point of StandaloneMm -// -ASM_FUNC(_ModuleEntryPoint) - // Stash boot information registers from the SPMC - mov r8, r0 - mov r9, r1 - mov r10, r2 - mov r11, r3 - - bl CheckFfaSupport - mov r1, r0 - - // Get StandaloneMm Stack top address and save in x0 - LDRL(r0, stmm_stack) - - // Set stack permission - cmp r1, #0x01 - beq .Lset_stack_perm_ffa - bne .Lset_stack_perm_spm - - // If SetStackPermission* failed, x0 is #0x00. - // Otherwise, x0 is base address of stack. -.Lset_stmm_sp: - cmp r0, #0x00 - bne .Lerror - - mov sp, r0 - - // Restore boot information registers from the SPMC - mov r3, r11 - mov r2, r10 - mov r1, r9 - mov r0, r8 - - // Invoke the C entrypoint - b CEntryPoint - -.Lerror: - b . - -.Lset_stack_perm_ffa: - bl SetStackPermissionFfa - b .Lset_stmm_sp - -.Lset_stack_perm_spm: - bl SetStackPermissionSpmMm - b .Lset_stmm_sp diff --git a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c index 86e42140a2eb..85b0bc0a0c45 100644 --- a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c +++ b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c @@ -186,12 +186,9 @@ ValidateSpmMmBootInfo ( if ((RegVersion != 1) || (Arg2 != 0x00) || (TransferListAddress == 0x00)) { return EFI_INVALID_PARAMETER; } - } else if ((Fields & TRANSFER_LIST_SIGNATURE_MASK_32) == TRANSFER_LIST_SIGNATURE_32) { - RegVersion = (Fields >> REGISTER_CONVENTION_VERSION_SHIFT_32) & - REGISTER_CONVENTION_VERSION_MASK; - if ((RegVersion != 1) || (Arg0 != 0x00) || (TransferListAddress == 0x00)) { - return EFI_INVALID_PARAMETER; - } + } else { + // ARM32 is not supported + return EFI_INVALID_PARAMETER; } return EFI_SUCCESS; diff --git a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.inf b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.inf index 711f83d39728..8eb9e18dcd7e 100644 --- a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.inf +++ b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.inf @@ -18,7 +18,7 @@ LIBRARY_CLASS = StandaloneMmCoreEntryPoint|MM_CORE_STANDALONE # -# VALID_ARCHITECTURES = ARM AARCH64 +# VALID_ARCHITECTURES = AARCH64 # [Sources] @@ -28,9 +28,6 @@ [Sources.AARCH64] AArch64/ModuleEntryPoint.S -[Sources.ARM] - Arm/ModuleEntryPoint.S - [Packages] ArmPkg/ArmPkg.dec MdePkg/MdePkg.dec @@ -68,9 +65,8 @@ # # This configuration fails for CLANGPDB, which does not support PIE in the GCC # sense. Such however is required for ARM family StandaloneMmCore -# self-relocation, and thus the CLANGPDB toolchain is unsupported for ARM and -# AARCH64 for this module. +# self-relocation, and thus the CLANGPDB toolchain is unsupported for AARCH64 +# for this module. # [BuildOptions] - GCC:*_*_ARM_CC_FLAGS = -fpie GCC:*_*_AARCH64_CC_FLAGS = -fpie From a40d7f7d0b9fb316f66699e9e575c0f748736283 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 22 Sep 2025 16:18:44 -0700 Subject: [PATCH 0534/1172] ArmPkg: Remove ARM32 Support from CpuDxe edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 files from CpuDxe. Signed-off-by: Oliver Smith-Denny --- ArmPkg/Drivers/CpuDxe/Arm/Mmu.c | 675 ------------------------------- ArmPkg/Drivers/CpuDxe/CpuDxe.inf | 3 - 2 files changed, 678 deletions(-) delete mode 100644 ArmPkg/Drivers/CpuDxe/Arm/Mmu.c diff --git a/ArmPkg/Drivers/CpuDxe/Arm/Mmu.c b/ArmPkg/Drivers/CpuDxe/Arm/Mmu.c deleted file mode 100644 index 8c4de284e160..000000000000 --- a/ArmPkg/Drivers/CpuDxe/Arm/Mmu.c +++ /dev/null @@ -1,675 +0,0 @@ -/*++ - -Copyright (c) 2009, Hewlett-Packard Company. All rights reserved.
-Portions copyright (c) 2010, Apple Inc. All rights reserved.
-Portions copyright (c) 2013-2021, Arm Limited. All rights reserved.
-Copyright (c) 2017, Intel Corporation. All rights reserved.
- -SPDX-License-Identifier: BSD-2-Clause-Patent - - ---*/ - -#include -#include "CpuDxe.h" - -/** - Convert a set of ARM short descriptor section attributes into a mask - of EFI_MEMORY_xx constants. - - @param[in] SectionAttributes The set of page attributes. - @param[out] GcdAttributes Pointer to the return value. - - @retval EFI_SUCCESS The attributes were converted successfully. - @retval EFI_UNSUPPORTED The section attributes did not have a - GCD transation. -**/ -STATIC -EFI_STATUS -SectionToGcdAttributes ( - IN UINT32 SectionAttributes, - OUT UINT64 *GcdAttributes - ) -{ - *GcdAttributes = 0; - - // determine cacheability attributes - switch (SectionAttributes & TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK) { - case TT_DESCRIPTOR_SECTION_CACHE_POLICY_STRONGLY_ORDERED: - *GcdAttributes |= EFI_MEMORY_UC; - break; - case TT_DESCRIPTOR_SECTION_CACHE_POLICY_SHAREABLE_DEVICE: - *GcdAttributes |= EFI_MEMORY_UC; - break; - case TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC: - *GcdAttributes |= EFI_MEMORY_WT; - break; - case TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_BACK_NO_ALLOC: - *GcdAttributes |= EFI_MEMORY_WB; - break; - case TT_DESCRIPTOR_SECTION_CACHE_POLICY_NON_CACHEABLE: - *GcdAttributes |= EFI_MEMORY_WC; - break; - case TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_BACK_ALLOC: - *GcdAttributes |= EFI_MEMORY_WB; - break; - case TT_DESCRIPTOR_SECTION_CACHE_POLICY_NON_SHAREABLE_DEVICE: - *GcdAttributes |= EFI_MEMORY_UC; - break; - default: - return EFI_UNSUPPORTED; - } - - // determine protection attributes - switch (SectionAttributes & TT_DESCRIPTOR_SECTION_AP_MASK) { - case TT_DESCRIPTOR_SECTION_AP_NO_RW: - case TT_DESCRIPTOR_SECTION_AP_RW_RW: - // normal read/write access, do not add additional attributes - break; - - // read only cases map to write-protect - case TT_DESCRIPTOR_SECTION_AP_NO_RO: - case TT_DESCRIPTOR_SECTION_AP_RO_RO: - *GcdAttributes |= EFI_MEMORY_RO; - break; - } - - // now process eXectue Never attribute - if ((SectionAttributes & TT_DESCRIPTOR_SECTION_XN_MASK) != 0) { - *GcdAttributes |= EFI_MEMORY_XP; - } - - if ((SectionAttributes & TT_DESCRIPTOR_SECTION_AF) == 0) { - *GcdAttributes |= EFI_MEMORY_RP; - } - - return EFI_SUCCESS; -} - -/** - Convert an arch specific set of page attributes into a mask - of EFI_MEMORY_xx constants. - - @param[in] PageAttributes The set of page attributes. - - @retval EFI_SUCCESS The attributes were converted successfully. - @retval EFI_UNSUPPORTED The section attributes did not have a - GCD transation. -**/ -UINT64 -RegionAttributeToGcdAttribute ( - IN UINTN PageAttributes - ) -{ - UINT64 Result; - - SectionToGcdAttributes (PageAttributes, &Result); - return Result; -} - -/** - Convert a set of ARM short descriptor page attributes into a mask - of EFI_MEMORY_xx constants. - - @param[in] PageAttributes The set of page attributes. - @param[out] GcdAttributes Pointer to the return value. - - @retval EFI_SUCCESS The attributes were converted successfully. - @retval EFI_UNSUPPORTED The page attributes did not have a GCD transation. -**/ -STATIC -EFI_STATUS -PageToGcdAttributes ( - IN UINT32 PageAttributes, - OUT UINT64 *GcdAttributes - ) -{ - *GcdAttributes = 0; - - // determine cacheability attributes - switch (PageAttributes & TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK) { - case TT_DESCRIPTOR_PAGE_CACHE_POLICY_STRONGLY_ORDERED: - *GcdAttributes |= EFI_MEMORY_UC; - break; - case TT_DESCRIPTOR_PAGE_CACHE_POLICY_SHAREABLE_DEVICE: - *GcdAttributes |= EFI_MEMORY_UC; - break; - case TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC: - *GcdAttributes |= EFI_MEMORY_WT; - break; - case TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_BACK_NO_ALLOC: - *GcdAttributes |= EFI_MEMORY_WB; - break; - case TT_DESCRIPTOR_PAGE_CACHE_POLICY_NON_CACHEABLE: - *GcdAttributes |= EFI_MEMORY_WC; - break; - case TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_BACK_ALLOC: - *GcdAttributes |= EFI_MEMORY_WB; - break; - case TT_DESCRIPTOR_PAGE_CACHE_POLICY_NON_SHAREABLE_DEVICE: - *GcdAttributes |= EFI_MEMORY_UC; - break; - default: - return EFI_UNSUPPORTED; - } - - // determine protection attributes - switch (PageAttributes & TT_DESCRIPTOR_PAGE_AP_MASK) { - case TT_DESCRIPTOR_PAGE_AP_NO_RW: - case TT_DESCRIPTOR_PAGE_AP_RW_RW: - // normal read/write access, do not add additional attributes - break; - - // read only cases map to write-protect - case TT_DESCRIPTOR_PAGE_AP_NO_RO: - case TT_DESCRIPTOR_PAGE_AP_RO_RO: - *GcdAttributes |= EFI_MEMORY_RO; - break; - } - - // now process eXectue Never attribute - if ((PageAttributes & TT_DESCRIPTOR_PAGE_XN_MASK) != 0) { - *GcdAttributes |= EFI_MEMORY_XP; - } - - if ((PageAttributes & TT_DESCRIPTOR_PAGE_AF) == 0) { - *GcdAttributes |= EFI_MEMORY_RP; - } - - return EFI_SUCCESS; -} - -/** - Synchronizes the GCD with the translation table for a specified page. - - This function synchronizes cache configuration for a given page based on its section index - and the first level descriptor. It traverses the second level table entries of the page and - updates the GCD attributes accordingly for each entry. - - @param[in] SectionIndex The index of the section where the page resides. - @param[in] FirstLevelDescriptor The first translation table level of the page. - @param[in] NumberOfDescriptors The number of descriptors in the GCD memory space map. - @param[in] MemorySpaceMap The GCD memory space descriptor. - @param[in, out] NextRegionBase The next region base address. - @param[in, out] NextRegionLength The next region length. - @param[in, out] NextSectionAttributes The next section attributes. - - @retval EFI_STATUS Always return success -**/ -EFI_STATUS -SyncCacheConfigPage ( - IN UINT32 SectionIndex, - IN UINT32 FirstLevelDescriptor, - IN UINTN NumberOfDescriptors, - IN EFI_GCD_MEMORY_SPACE_DESCRIPTOR *MemorySpaceMap, - IN OUT EFI_PHYSICAL_ADDRESS *NextRegionBase, - IN OUT UINT64 *NextRegionLength, - IN OUT UINT32 *NextSectionAttributes - ) -{ - EFI_STATUS Status; - UINT32 i; - volatile ARM_PAGE_TABLE_ENTRY *SecondLevelTable; - UINT32 NextPageAttributes; - UINT32 PageAttributes; - UINT32 BaseAddress; - UINT64 GcdAttributes; - - // Get the Base Address from FirstLevelDescriptor; - BaseAddress = TT_DESCRIPTOR_PAGE_BASE_ADDRESS (SectionIndex << TT_DESCRIPTOR_SECTION_BASE_SHIFT); - - // Convert SectionAttributes into PageAttributes - NextPageAttributes = - TT_DESCRIPTOR_CONVERT_TO_PAGE_CACHE_POLICY (*NextSectionAttributes) | - TT_DESCRIPTOR_CONVERT_TO_PAGE_AF (*NextSectionAttributes) | - TT_DESCRIPTOR_CONVERT_TO_PAGE_AP (*NextSectionAttributes); - - // obtain page table base - SecondLevelTable = (ARM_PAGE_TABLE_ENTRY *)(FirstLevelDescriptor & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK); - - for (i = 0; i < TRANSLATION_TABLE_PAGE_COUNT; i++) { - if ((SecondLevelTable[i] & TT_DESCRIPTOR_PAGE_TYPE_MASK) == TT_DESCRIPTOR_PAGE_TYPE_PAGE) { - // extract attributes (cacheability and permissions) - PageAttributes = SecondLevelTable[i] & (TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK | TT_DESCRIPTOR_PAGE_AP_MASK | TT_DESCRIPTOR_PAGE_AF); - - if (NextPageAttributes == 0) { - // start on a new region - *NextRegionLength = 0; - *NextRegionBase = BaseAddress | (i << TT_DESCRIPTOR_PAGE_BASE_SHIFT); - NextPageAttributes = PageAttributes; - } else if (PageAttributes != NextPageAttributes) { - // Convert Section Attributes into GCD Attributes - Status = PageToGcdAttributes (NextPageAttributes, &GcdAttributes); - if (EFI_ERROR (Status)) { - ASSERT_EFI_ERROR (Status); - GcdAttributes = 0; - } - - // update GCD with these changes (this will recurse into our own CpuSetMemoryAttributes below which is OK) - SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors, *NextRegionBase, *NextRegionLength, GcdAttributes); - - // start on a new region - *NextRegionLength = 0; - *NextRegionBase = BaseAddress | (i << TT_DESCRIPTOR_PAGE_BASE_SHIFT); - NextPageAttributes = PageAttributes; - } - } else if (NextPageAttributes != 0) { - // Convert Page Attributes into GCD Attributes - Status = PageToGcdAttributes (NextPageAttributes, &GcdAttributes); - if (EFI_ERROR (Status)) { - ASSERT_EFI_ERROR (Status); - GcdAttributes = 0; - } - - // update GCD with these changes (this will recurse into our own CpuSetMemoryAttributes below which is OK) - SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors, *NextRegionBase, *NextRegionLength, GcdAttributes); - - *NextRegionLength = 0; - *NextRegionBase = BaseAddress | (i << TT_DESCRIPTOR_PAGE_BASE_SHIFT); - NextPageAttributes = 0; - } - - *NextRegionLength += TT_DESCRIPTOR_PAGE_SIZE; - } - - // Convert back PageAttributes into SectionAttributes - *NextSectionAttributes = - TT_DESCRIPTOR_CONVERT_TO_SECTION_CACHE_POLICY (NextPageAttributes) | - TT_DESCRIPTOR_CONVERT_TO_SECTION_AF (NextPageAttributes) | - TT_DESCRIPTOR_CONVERT_TO_SECTION_AP (NextPageAttributes); - - return EFI_SUCCESS; -} - -/** - Sync the GCD memory space attributes with the translation table. - - @param[in] CpuProtocol The CPU architectural protocol instance. - - @retval EFI_SUCCESS The GCD memory space attributes are synced with the MMU page table. - @retval Others The return value of GetMemorySpaceMap(). -**/ -EFI_STATUS -SyncCacheConfig ( - IN EFI_CPU_ARCH_PROTOCOL *CpuProtocol - ) -{ - EFI_STATUS Status; - UINT32 i; - EFI_PHYSICAL_ADDRESS NextRegionBase; - UINT64 NextRegionLength; - UINT32 NextSectionAttributes; - UINT32 SectionAttributes; - UINT64 GcdAttributes; - volatile ARM_FIRST_LEVEL_DESCRIPTOR *FirstLevelTable; - UINTN NumberOfDescriptors; - EFI_GCD_MEMORY_SPACE_DESCRIPTOR *MemorySpaceMap; - - DEBUG ((DEBUG_PAGE, "SyncCacheConfig()\n")); - - // This code assumes MMU is enabled and filed with section translations - ASSERT (ArmMmuEnabled ()); - - // - // Get the memory space map from GCD - // - MemorySpaceMap = NULL; - Status = gDS->GetMemorySpaceMap (&NumberOfDescriptors, &MemorySpaceMap); - - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "SyncCacheConfig - GetMemorySpaceMap() failed! Status: %r\n", Status)); - ASSERT_EFI_ERROR (Status); - return Status; - } - - // The GCD implementation maintains its own copy of the state of memory space attributes. GCD needs - // to know what the initial memory space attributes are. The CPU Arch. Protocol does not provide a - // GetMemoryAttributes function for GCD to get this so we must resort to calling GCD (as if we were - // a client) to update its copy of the attributes. This is bad architecture and should be replaced - // with a way for GCD to query the CPU Arch. driver of the existing memory space attributes instead. - - // obtain page table base - FirstLevelTable = (ARM_FIRST_LEVEL_DESCRIPTOR *)(ArmGetTTBR0BaseAddress ()); - - // Get the first region - NextSectionAttributes = FirstLevelTable[0] & (TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK | TT_DESCRIPTOR_SECTION_AP_MASK | TT_DESCRIPTOR_SECTION_AF); - - // iterate through each 1MB descriptor - NextRegionBase = NextRegionLength = 0; - for (i = 0; i < TRANSLATION_TABLE_SECTION_COUNT; i++) { - if ((FirstLevelTable[i] & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) { - // extract attributes (cacheability and permissions) - SectionAttributes = FirstLevelTable[i] & (TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK | TT_DESCRIPTOR_SECTION_AP_MASK | TT_DESCRIPTOR_SECTION_AF); - - if (NextSectionAttributes == 0) { - // start on a new region - NextRegionLength = 0; - NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (i << TT_DESCRIPTOR_SECTION_BASE_SHIFT); - NextSectionAttributes = SectionAttributes; - } else if (SectionAttributes != NextSectionAttributes) { - // Convert Section Attributes into GCD Attributes - Status = SectionToGcdAttributes (NextSectionAttributes, &GcdAttributes); - - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "SyncCacheConfig - SectionToGcdAttributes() failed! Status: %r\n", Status)); - ASSERT_EFI_ERROR (Status); - GcdAttributes = 0; - } - - // update GCD with these changes (this will recurse into our own CpuSetMemoryAttributes below which is OK) - SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors, NextRegionBase, NextRegionLength, GcdAttributes); - - // start on a new region - NextRegionLength = 0; - NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (i << TT_DESCRIPTOR_SECTION_BASE_SHIFT); - NextSectionAttributes = SectionAttributes; - } - - NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE; - } else if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE (FirstLevelTable[i])) { - // In this case any bits set in the 'NextSectionAttributes' are garbage and were set from - // bits that are actually part of the pagetable address. We clear it out to zero so that - // the SyncCacheConfigPage will use the page attributes instead of trying to convert the - // section attributes into page attributes - NextSectionAttributes = 0; - Status = SyncCacheConfigPage ( - i, - FirstLevelTable[i], - NumberOfDescriptors, - MemorySpaceMap, - &NextRegionBase, - &NextRegionLength, - &NextSectionAttributes - ); - ASSERT_EFI_ERROR (Status); - } else { - // We do not support yet 16MB sections - ASSERT ((FirstLevelTable[i] & TT_DESCRIPTOR_SECTION_TYPE_MASK) != TT_DESCRIPTOR_SECTION_TYPE_SUPERSECTION); - - // start on a new region - if (NextSectionAttributes != 0) { - // Convert Section Attributes into GCD Attributes - Status = SectionToGcdAttributes (NextSectionAttributes, &GcdAttributes); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "SyncCacheConfig - SectionToGcdAttributes() failed! Status: %r\n", Status)); - ASSERT_EFI_ERROR (Status); - GcdAttributes = 0; - } - - // update GCD with these changes (this will recurse into our own CpuSetMemoryAttributes below which is OK) - SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors, NextRegionBase, NextRegionLength, GcdAttributes); - - NextRegionLength = 0; - NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (i << TT_DESCRIPTOR_SECTION_BASE_SHIFT); - NextSectionAttributes = 0; - } - - NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE; - } - } // section entry loop - - if (NextSectionAttributes != 0) { - // Convert Section Attributes into GCD Attributes - Status = SectionToGcdAttributes (NextSectionAttributes, &GcdAttributes); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "SyncCacheConfig - SectionToGcdAttributes() failed! Status: %r\n", Status)); - ASSERT_EFI_ERROR (Status); - GcdAttributes = 0; - } - - // update GCD with these changes (this will recurse into our own CpuSetMemoryAttributes below which is OK) - SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors, NextRegionBase, NextRegionLength, GcdAttributes); - } - - FreePool (MemorySpaceMap); - - return EFI_SUCCESS; -} - -/** - Convert EFI memory attributes to ARM translation table attributes. - - @param[in] EfiAttributes EFI memory attributes. - - @retval The analogous translation table attributes. -**/ -UINT64 -EfiAttributeToArmAttribute ( - IN UINT64 EfiAttributes - ) -{ - UINT64 ArmAttributes; - - switch (EfiAttributes & EFI_MEMORY_CACHETYPE_MASK) { - case EFI_MEMORY_UC: - // Map to strongly ordered - ArmAttributes = TT_DESCRIPTOR_SECTION_CACHE_POLICY_STRONGLY_ORDERED; // TEX[2:0] = 0, C=0, B=0 - break; - - case EFI_MEMORY_WC: - // Map to normal non-cacheable - ArmAttributes = TT_DESCRIPTOR_SECTION_CACHE_POLICY_NON_CACHEABLE; // TEX [2:0]= 001 = 0x2, B=0, C=0 - break; - - case EFI_MEMORY_WT: - // Write through with no-allocate - ArmAttributes = TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC; // TEX [2:0] = 0, C=1, B=0 - break; - - case EFI_MEMORY_WB: - // Write back (with allocate) - ArmAttributes = TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_BACK_ALLOC; // TEX [2:0] = 001, C=1, B=1 - break; - - case EFI_MEMORY_UCE: - default: - ArmAttributes = TT_DESCRIPTOR_SECTION_TYPE_FAULT; - break; - } - - // Determine protection attributes - if ((EfiAttributes & EFI_MEMORY_RO) != 0) { - ArmAttributes |= TT_DESCRIPTOR_SECTION_AP_RO_RO; - } else { - ArmAttributes |= TT_DESCRIPTOR_SECTION_AP_RW_RW; - } - - // Determine eXecute Never attribute - if ((EfiAttributes & EFI_MEMORY_XP) != 0) { - ArmAttributes |= TT_DESCRIPTOR_SECTION_XN_MASK; - } - - if ((EfiAttributes & EFI_MEMORY_RP) == 0) { - ArmAttributes |= TT_DESCRIPTOR_SECTION_AF; - } - - return ArmAttributes; -} - -/** - This function finds the end of a memory region in a translation table. A - memory region is defined as a contiguous set of pages with the same attributes. - - @param[in] PageTable The translation table to traverse. - @param[in] BaseAddress The address from which to start the search - @param[in] RegionAttributes The attributes of the start of the region. - @param[out] RegionLength The length of the region found. - - @retval EFI_SUCCESS The region was found. - @retval EFI_NOT_FOUND The end of the region was not found. - @retval EFI_NO_MAPPING The region specified by BaseAddress is not mapped - in the input translation table. - @retval EFI_UNSUPPORTED Large pages are not supported. -**/ -STATIC -EFI_STATUS -GetMemoryRegionPage ( - IN UINT32 *PageTable, - IN UINTN *BaseAddress, - IN UINTN *RegionAttributes, - OUT UINTN *RegionLength - ) -{ - UINT32 PageAttributes; - UINT32 TableIndex; - UINT32 PageDescriptor; - EFI_STATUS Status; - - // Convert the section attributes into page attributes - PageAttributes = ConvertSectionAttributesToPageAttributes (*RegionAttributes); - Status = EFI_NOT_FOUND; - *RegionLength = 0; - - // Calculate index into first level translation table for start of modification - TableIndex = ((*BaseAddress) & TT_DESCRIPTOR_PAGE_INDEX_MASK) >> TT_DESCRIPTOR_PAGE_BASE_SHIFT; - ASSERT (TableIndex < TRANSLATION_TABLE_PAGE_COUNT); - - // Go through the page table to find the end of the section - for ( ; TableIndex < TRANSLATION_TABLE_PAGE_COUNT; TableIndex++) { - // Get the section at the given index - PageDescriptor = PageTable[TableIndex]; - - if ((PageDescriptor & TT_DESCRIPTOR_PAGE_TYPE_MASK) == TT_DESCRIPTOR_PAGE_TYPE_FAULT) { - Status = (*RegionLength > 0) ? EFI_SUCCESS : EFI_NO_MAPPING; - break; - } else if ((PageDescriptor & TT_DESCRIPTOR_PAGE_TYPE_PAGE) == TT_DESCRIPTOR_PAGE_TYPE_PAGE) { - if ((PageDescriptor & TT_DESCRIPTOR_PAGE_ATTRIBUTE_MASK) != PageAttributes) { - Status = EFI_SUCCESS; - break; - } - - *RegionLength += TT_DESCRIPTOR_PAGE_SIZE; - } else { - // Large pages are unsupported. - Status = EFI_UNSUPPORTED; - ASSERT (0); - break; - } - } - - return Status; -} - -/** - Get the memory region that contains the specified address. A memory region is defined - as a contiguous set of pages with the same attributes. - - RegionLength and RegionAttributes are only valid if EFI_SUCCESS is returned. - - @param[in, out] BaseAddress On input, the address to search for. - On output, the base address of the region found. - @param[out] RegionLength The length of the region found. - @param[out] RegionAttributes The attributes of the region found. - - @retval EFI_SUCCESS Region found - @retval EFI_NOT_FOUND Region not found - @retval EFI_UNSUPPORTED Large pages are unsupported - @retval EFI_NO_MAPPING The page specified by BaseAddress is unmapped - @retval EFI_INVALID_PARAMETER The BaseAddress exceeds the addressable range of - the translation table. -**/ -EFI_STATUS -GetMemoryRegion ( - IN OUT UINTN *BaseAddress, - OUT UINTN *RegionLength, - OUT UINTN *RegionAttributes - ) -{ - EFI_STATUS Status; - UINT32 TableIndex; - UINT32 PageAttributes; - UINT32 PageTableIndex; - UINT32 SectionDescriptor; - ARM_FIRST_LEVEL_DESCRIPTOR *FirstLevelTable; - UINT32 *PageTable; - UINTN Length; - - // Initialize the arguments - *RegionLength = 0; - - // Obtain page table base - FirstLevelTable = (ARM_FIRST_LEVEL_DESCRIPTOR *)ArmGetTTBR0BaseAddress (); - - // Calculate index into first level translation table for start of modification - TableIndex = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (*BaseAddress) >> TT_DESCRIPTOR_SECTION_BASE_SHIFT; - - if (TableIndex >= TRANSLATION_TABLE_SECTION_COUNT) { - ASSERT (TableIndex < TRANSLATION_TABLE_SECTION_COUNT); - return EFI_INVALID_PARAMETER; - } - - // Get the section at the given index - SectionDescriptor = FirstLevelTable[TableIndex]; - if (!SectionDescriptor) { - return EFI_NOT_FOUND; - } - - // If 'BaseAddress' belongs to the section then round it to the section boundary - if (((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) || - ((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SUPERSECTION)) - { - *BaseAddress = (*BaseAddress) & TT_DESCRIPTOR_SECTION_BASE_ADDRESS_MASK; - *RegionAttributes = SectionDescriptor & TT_DESCRIPTOR_SECTION_ATTRIBUTE_MASK; - } else { - // Otherwise, we round it to the page boundary - *BaseAddress = (*BaseAddress) & TT_DESCRIPTOR_PAGE_BASE_ADDRESS_MASK; - - // Get the attribute at the page table level (Level 2) - PageTable = (UINT32 *)(SectionDescriptor & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK); - - // Calculate index into first level translation table for start of modification - PageTableIndex = ((*BaseAddress) & TT_DESCRIPTOR_PAGE_INDEX_MASK) >> TT_DESCRIPTOR_PAGE_BASE_SHIFT; - ASSERT (PageTableIndex < TRANSLATION_TABLE_PAGE_COUNT); - - PageAttributes = PageTable[PageTableIndex] & TT_DESCRIPTOR_PAGE_ATTRIBUTE_MASK; - *RegionAttributes = TT_DESCRIPTOR_CONVERT_TO_SECTION_CACHE_POLICY (PageAttributes) | - TT_DESCRIPTOR_CONVERT_TO_SECTION_S (PageAttributes) | - TT_DESCRIPTOR_CONVERT_TO_SECTION_XN (PageAttributes) | - TT_DESCRIPTOR_CONVERT_TO_SECTION_AF (PageAttributes) | - TT_DESCRIPTOR_CONVERT_TO_SECTION_AP (PageAttributes); - } - - Status = EFI_NOT_FOUND; - - for ( ; TableIndex < TRANSLATION_TABLE_SECTION_COUNT; TableIndex++) { - // Get the section at the given index - SectionDescriptor = FirstLevelTable[TableIndex]; - - // If the entry is a level-2 page table then we scan it to find the end of the region - if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE (SectionDescriptor)) { - // Extract the page table location from the descriptor - PageTable = (UINT32 *)(SectionDescriptor & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK); - Length = 0; - - // Scan the page table to find the end of the region. - Status = GetMemoryRegionPage (PageTable, BaseAddress, RegionAttributes, &Length); - *RegionLength += Length; - - // Status == EFI_NOT_FOUND implies we have not reached the end of the region. - if ((Status == EFI_NOT_FOUND) && (Length > 0)) { - continue; - } - - break; - } else if (((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) || - ((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SUPERSECTION)) - { - if ((SectionDescriptor & TT_DESCRIPTOR_SECTION_ATTRIBUTE_MASK) != *RegionAttributes) { - // If the attributes of the section differ from the one targeted then we exit the loop - break; - } else { - *RegionLength = *RegionLength + TT_DESCRIPTOR_SECTION_SIZE; - } - } else { - // If we are on an invalid section then it means it is the end of our section. - break; - } - } - - // Check if the region length was updated. - if (*RegionLength > 0) { - Status = EFI_SUCCESS; - } - - return Status; -} diff --git a/ArmPkg/Drivers/CpuDxe/CpuDxe.inf b/ArmPkg/Drivers/CpuDxe/CpuDxe.inf index a19961464ad7..fdb0a40fed3d 100644 --- a/ArmPkg/Drivers/CpuDxe/CpuDxe.inf +++ b/ArmPkg/Drivers/CpuDxe/CpuDxe.inf @@ -25,9 +25,6 @@ Exception.c MemoryAttribute.c -[Sources.ARM] - Arm/Mmu.c - [Sources.AARCH64] AArch64/Mmu.c From 79e9dee6c7849a5f9ee473ae18ebef4f9ade187b Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 22 Sep 2025 16:21:13 -0700 Subject: [PATCH 0535/1172] ArmPkg: Remove ARM32 Support from ArmExceptionLib edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 files from ArmExceptionLib. Signed-off-by: Oliver Smith-Denny --- .../ArmExceptionLib/Arm/ArmException.c | 39 --- .../ArmExceptionLib/Arm/ExceptionSupport.S | 299 ------------------ .../ArmExceptionLib/ArmExceptionLib.inf | 4 - 3 files changed, 342 deletions(-) delete mode 100644 ArmPkg/Library/ArmExceptionLib/Arm/ArmException.c delete mode 100644 ArmPkg/Library/ArmExceptionLib/Arm/ExceptionSupport.S diff --git a/ArmPkg/Library/ArmExceptionLib/Arm/ArmException.c b/ArmPkg/Library/ArmExceptionLib/Arm/ArmException.c deleted file mode 100644 index ddff3e8f32a6..000000000000 --- a/ArmPkg/Library/ArmExceptionLib/Arm/ArmException.c +++ /dev/null @@ -1,39 +0,0 @@ -/** @file -* Exception handling support specific for ARM -* -* Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-* Copyright (c) 2014 - 2021, Arm Limited. All rights reserved.
-* Copyright (c) 2016 HP Development Company, L.P.
-* -* SPDX-License-Identifier: BSD-2-Clause-Patent -* -**/ - -#include - -#include - -#include - -#include // for MAX_ARM_EXCEPTION - -UINTN gMaxExceptionNumber = MAX_ARM_EXCEPTION; -EFI_EXCEPTION_CALLBACK gExceptionHandlers[MAX_ARM_EXCEPTION + 1] = { 0 }; -PHYSICAL_ADDRESS gExceptionVectorAlignmentMask = ARM_VECTOR_TABLE_ALIGNMENT; - -RETURN_STATUS -ArchVectorConfig ( - IN UINTN VectorBaseAddress - ) -{ - // if the vector address corresponds to high vectors - if (VectorBaseAddress == 0xFFFF0000) { - // set SCTLR.V to enable high vectors - ArmSetHighVectors (); - } else { - // Set SCTLR.V to 0 to enable VBAR to be used - ArmSetLowVectors (); - } - - return RETURN_SUCCESS; -} diff --git a/ArmPkg/Library/ArmExceptionLib/Arm/ExceptionSupport.S b/ArmPkg/Library/ArmExceptionLib/Arm/ExceptionSupport.S deleted file mode 100644 index d9ad77593475..000000000000 --- a/ArmPkg/Library/ArmExceptionLib/Arm/ExceptionSupport.S +++ /dev/null @@ -1,299 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Use ARMv6 instruction to operate on a single stack -# -# Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.
-# Copyright (c) 2014, ARM Limited. All rights reserved.
-# Copyright (c) 2016 HP Development Company, L.P.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -/* - -This is the stack constructed by the exception handler (low address to high address) - # R0 - IFAR is EFI_SYSTEM_CONTEXT for ARM - Reg Offset - === ====== - R0 0x00 # stmfd SP!,{R0-R12} - R1 0x04 - R2 0x08 - R3 0x0c - R4 0x10 - R5 0x14 - R6 0x18 - R7 0x1c - R8 0x20 - R9 0x24 - R10 0x28 - R11 0x2c - R12 0x30 - SP 0x34 # reserved via subtraction 0x20 (32) from SP - LR 0x38 - PC 0x3c - CPSR 0x40 - DFSR 0x44 - DFAR 0x48 - IFSR 0x4c - IFAR 0x50 - - LR 0x54 # SVC Link register (we need to restore it) - - LR 0x58 # pushed by srsfd - CPSR 0x5c - - */ - - -GCC_ASM_EXPORT(ExceptionHandlersStart) -GCC_ASM_EXPORT(ExceptionHandlersEnd) -GCC_ASM_EXPORT(CommonExceptionEntry) -GCC_ASM_EXPORT(AsmCommonExceptionEntry) -GCC_ASM_EXPORT(CommonCExceptionHandler) - -.text -.syntax unified -#if !defined(__APPLE__) -.fpu neon @ makes vpush/vpop assemble -#endif -.align 5 - - -// -// This code gets copied to the ARM vector table -// ExceptionHandlersStart - ExceptionHandlersEnd gets copied -// -ASM_PFX(ExceptionHandlersStart): - -ASM_PFX(Reset): - b ASM_PFX(ResetEntry) - -ASM_PFX(UndefinedInstruction): - b ASM_PFX(UndefinedInstructionEntry) - -ASM_PFX(SoftwareInterrupt): - b ASM_PFX(SoftwareInterruptEntry) - -ASM_PFX(PrefetchAbort): - b ASM_PFX(PrefetchAbortEntry) - -ASM_PFX(DataAbort): - b ASM_PFX(DataAbortEntry) - -ASM_PFX(ReservedException): - b ASM_PFX(ReservedExceptionEntry) - -ASM_PFX(Irq): - b ASM_PFX(IrqEntry) - -ASM_PFX(Fiq): - b ASM_PFX(FiqEntry) - -ASM_PFX(ResetEntry): - srsdb #0x13! @ Store return state on SVC stack - @ We are already in SVC mode - - stmfd SP!,{LR} @ Store the link register for the current mode - sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR - stmfd SP!,{R0-R12} @ Store the register state - - mov R0,#0 @ ExceptionType - ldr R1,ASM_PFX(CommonExceptionEntry) - bx R1 - -ASM_PFX(UndefinedInstructionEntry): - sub LR, LR, #4 @ Only -2 for Thumb, adjust in CommonExceptionEntry - srsdb #0x13! @ Store return state on SVC stack - cps #0x13 @ Switch to SVC for common stack - stmfd SP!,{LR} @ Store the link register for the current mode - sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR - stmfd SP!,{R0-R12} @ Store the register state - - mov R0,#1 @ ExceptionType - ldr R1,ASM_PFX(CommonExceptionEntry) - bx R1 - -ASM_PFX(SoftwareInterruptEntry): - srsdb #0x13! @ Store return state on SVC stack - @ We are already in SVC mode - stmfd SP!,{LR} @ Store the link register for the current mode - sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR - stmfd SP!,{R0-R12} @ Store the register state - - mov R0,#2 @ ExceptionType - ldr R1,ASM_PFX(CommonExceptionEntry) - bx R1 - -ASM_PFX(PrefetchAbortEntry): - sub LR,LR,#4 - srsdb #0x13! @ Store return state on SVC stack - cps #0x13 @ Switch to SVC for common stack - stmfd SP!,{LR} @ Store the link register for the current mode - sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR - stmfd SP!,{R0-R12} @ Store the register state - - mov R0,#3 @ ExceptionType - ldr R1,ASM_PFX(CommonExceptionEntry) - bx R1 - -ASM_PFX(DataAbortEntry): - sub LR,LR,#8 - srsdb #0x13! @ Store return state on SVC stack - cps #0x13 @ Switch to SVC for common stack - stmfd SP!,{LR} @ Store the link register for the current mode - sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR - stmfd SP!,{R0-R12} @ Store the register state - - mov R0,#4 - ldr R1,ASM_PFX(CommonExceptionEntry) - bx R1 - -ASM_PFX(ReservedExceptionEntry): - srsdb #0x13! @ Store return state on SVC stack - cps #0x13 @ Switch to SVC for common stack - stmfd SP!,{LR} @ Store the link register for the current mode - sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR - stmfd SP!,{R0-R12} @ Store the register state - - mov R0,#5 - ldr R1,ASM_PFX(CommonExceptionEntry) - bx R1 - -ASM_PFX(IrqEntry): - sub LR,LR,#4 - srsdb #0x13! @ Store return state on SVC stack - cps #0x13 @ Switch to SVC for common stack - stmfd SP!,{LR} @ Store the link register for the current mode - sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR - stmfd SP!,{R0-R12} @ Store the register state - - mov R0,#6 @ ExceptionType - ldr R1,ASM_PFX(CommonExceptionEntry) - bx R1 - -ASM_PFX(FiqEntry): - sub LR,LR,#4 - srsdb #0x13! @ Store return state on SVC stack - cps #0x13 @ Switch to SVC for common stack - stmfd SP!,{LR} @ Store the link register for the current mode - sub SP,SP,#0x20 @ Save space for SP, LR, PC, IFAR - CPSR - stmfd SP!,{R0-R12} @ Store the register state - @ Since we have already switch to SVC R8_fiq - R12_fiq - @ never get used or saved - mov R0,#7 @ ExceptionType - ldr R1,ASM_PFX(CommonExceptionEntry) - bx R1 - -// -// This gets patched by the C code that patches in the vector table -// -ASM_PFX(CommonExceptionEntry): - .word ASM_PFX(AsmCommonExceptionEntry) - -ASM_PFX(ExceptionHandlersEnd): - -// -// This code runs from CpuDxe driver loaded address. It is patched into -// CommonExceptionEntry. -// -ASM_PFX(AsmCommonExceptionEntry): - mrc p15, 0, R1, c6, c0, 2 @ Read IFAR - str R1, [SP, #0x50] @ Store it in EFI_SYSTEM_CONTEXT_ARM.IFAR - - mrc p15, 0, R1, c5, c0, 1 @ Read IFSR - str R1, [SP, #0x4c] @ Store it in EFI_SYSTEM_CONTEXT_ARM.IFSR - - mrc p15, 0, R1, c6, c0, 0 @ Read DFAR - str R1, [SP, #0x48] @ Store it in EFI_SYSTEM_CONTEXT_ARM.DFAR - - mrc p15, 0, R1, c5, c0, 0 @ Read DFSR - str R1, [SP, #0x44] @ Store it in EFI_SYSTEM_CONTEXT_ARM.DFSR - - ldr R1, [SP, #0x5c] @ srsdb saved pre-exception CPSR on the stack - str R1, [SP, #0x40] @ Store it in EFI_SYSTEM_CONTEXT_ARM.CPSR - - add R2, SP, #0x38 @ Make R2 point to EFI_SYSTEM_CONTEXT_ARM.LR - and R3, R1, #0x1f @ Check CPSR to see if User or System Mode - cmp R3, #0x1f @ if ((CPSR == 0x10) || (CPSR == 0x1f)) - cmpne R3, #0x10 @ - stmdaeq R2, {lr}^ @ save unbanked lr - @ else - stmdane R2, {lr} @ save SVC lr - - - ldr R5, [SP, #0x58] @ PC is the LR pushed by srsfd - @ Check to see if we have to adjust for Thumb entry - sub r4, r0, #1 @ if (ExceptionType == 1 || ExceptionType == 2)) { - cmp r4, #1 @ // UND & SVC have different LR adjust for Thumb - bhi NoAdjustNeeded - - tst r1, #0x20 @ if ((CPSR & T)) == T) { // Thumb Mode on entry - addne R5, R5, #2 @ PC += 2; - strne R5,[SP,#0x58] @ Update LR value pushed by srsfd - -NoAdjustNeeded: - - str R5, [SP, #0x3c] @ Store it in EFI_SYSTEM_CONTEXT_ARM.PC - - add R1, SP, #0x60 @ We pushed 0x60 bytes on the stack - str R1, [SP, #0x34] @ Store it in EFI_SYSTEM_CONTEXT_ARM.SP - - @ R0 is ExceptionType - mov R1,SP @ R1 is SystemContext - -#if (FixedPcdGet32(PcdVFPEnabled)) - vpush {d0-d15} @ save vstm registers in case they are used in optimizations -#endif - - mov R4, SP @ Save current SP - tst R4, #4 - subne SP, SP, #4 @ Adjust SP if not 8-byte aligned - -/* -VOID -EFIAPI -CommonCExceptionHandler ( - IN EFI_EXCEPTION_TYPE ExceptionType, R0 - IN OUT EFI_SYSTEM_CONTEXT SystemContext R1 - ) - -*/ - blx ASM_PFX(CommonCExceptionHandler) @ Call exception handler - - mov SP, R4 @ Restore SP - -#if (FixedPcdGet32(PcdVFPEnabled)) - vpop {d0-d15} -#endif - - ldr R1, [SP, #0x4c] @ Restore EFI_SYSTEM_CONTEXT_ARM.IFSR - mcr p15, 0, R1, c5, c0, 1 @ Write IFSR - - ldr R1, [SP, #0x44] @ Restore EFI_SYSTEM_CONTEXT_ARM.DFSR - mcr p15, 0, R1, c5, c0, 0 @ Write DFSR - - ldr R1,[SP,#0x3c] @ EFI_SYSTEM_CONTEXT_ARM.PC - str R1,[SP,#0x58] @ Store it back to srsfd stack slot so it can be restored - - ldr R1,[SP,#0x40] @ EFI_SYSTEM_CONTEXT_ARM.CPSR - str R1,[SP,#0x5c] @ Store it back to srsfd stack slot so it can be restored - - add R3, SP, #0x54 @ Make R3 point to SVC LR saved on entry - add R2, SP, #0x38 @ Make R2 point to EFI_SYSTEM_CONTEXT_ARM.LR - and R1, R1, #0x1f @ Check to see if User or System Mode - cmp R1, #0x1f @ if ((CPSR == 0x10) || (CPSR == 0x1f)) - cmpne R1, #0x10 @ - ldmibeq R2, {lr}^ @ restore unbanked lr - @ else - ldmibne R3, {lr} @ restore SVC lr, via ldmfd SP!, {LR} - - ldmfd SP!,{R0-R12} @ Restore general purpose registers - @ Exception handler can not change SP - - add SP,SP,#0x20 @ Clear out the remaining stack space - ldmfd SP!,{LR} @ restore the link register for this context - rfefd SP! @ return from exception via srsfd stack slot - diff --git a/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.inf b/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.inf index 9091df0a0879..fbd2acbf7565 100644 --- a/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.inf +++ b/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.inf @@ -25,10 +25,6 @@ [Sources.common] ArmExceptionLib.c -[Sources.Arm] - Arm/ArmException.c - Arm/ExceptionSupport.S | GCC - [Sources.AARCH64] AArch64/AArch64Exception.c AArch64/ExceptionSupport.S From 4bd1f476427574469652fab8f755cde551bc9ab7 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 22 Sep 2025 16:23:53 -0700 Subject: [PATCH 0536/1172] ArmPkg: Remove ARM32 Support from SMBIOS edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 files from SMBIOS. Signed-off-by: Oliver Smith-Denny --- .../ProcessorSubClassDxe.inf | 3 - .../ProcessorSubClassDxe/SmbiosProcessorArm.c | 96 ------------------- 2 files changed, 99 deletions(-) delete mode 100644 ArmPkg/Universal/Smbios/ProcessorSubClassDxe/SmbiosProcessorArm.c diff --git a/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf b/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf index c7cacece6f06..939efe655348 100644 --- a/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf +++ b/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf @@ -27,9 +27,6 @@ [Sources.AARCH64] SmbiosProcessorAArch64.c -[Sources.ARM] - SmbiosProcessorArm.c - [Packages] ArmPkg/ArmPkg.dec MdeModulePkg/MdeModulePkg.dec diff --git a/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/SmbiosProcessorArm.c b/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/SmbiosProcessorArm.c deleted file mode 100644 index ddee0e44894a..000000000000 --- a/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/SmbiosProcessorArm.c +++ /dev/null @@ -1,96 +0,0 @@ -/** @file - Functions for ARM processor information - - Copyright (c) 2021, NUVIA Inc. All rights reserved.
- - SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include -#include -#include - -#include "SmbiosProcessor.h" - -/** Gets the size of the specified cache. - - @param CacheLevel The cache level (L1, L2 etc.). - @param DataCache Whether the cache is a dedicated data cache. - @param UnifiedCache Whether the cache is a unified cache. - - @return The cache size. -**/ -UINT64 -SmbiosProcessorGetCacheSize ( - IN UINT8 CacheLevel, - IN BOOLEAN DataCache, - IN BOOLEAN UnifiedCache - ) -{ - CCSIDR_DATA Ccsidr; - CCSIDR2_DATA Ccsidr2; - CSSELR_DATA Csselr; - BOOLEAN CcidxSupported; - UINT64 CacheSize; - - // Read the CCSIDR register to get the cache architecture - Csselr.Data = 0; - Csselr.Bits.Level = CacheLevel - 1; - Csselr.Bits.InD = (!DataCache && !UnifiedCache); - - Ccsidr.Data = ReadCCSIDR (Csselr.Data); - - CcidxSupported = ArmHasCcidx (); - - if (CcidxSupported) { - Ccsidr2.Data = ReadCCSIDR2 (Csselr.Data); - CacheSize = (1 << (Ccsidr.BitsCcidxAA32.LineSize + 4)) * - (Ccsidr.BitsCcidxAA32.Associativity + 1) * - (Ccsidr2.Bits.NumSets + 1); - } else { - CacheSize = (1 << (Ccsidr.BitsNonCcidx.LineSize + 4)) * - (Ccsidr.BitsNonCcidx.Associativity + 1) * - (Ccsidr.BitsNonCcidx.NumSets + 1); - } - - return CacheSize; -} - -/** Gets the associativity of the specified cache. - - @param CacheLevel The cache level (L1, L2 etc.). - @param DataCache Whether the cache is a dedicated data cache. - @param UnifiedCache Whether the cache is a unified cache. - - @return The cache associativity. -**/ -UINT32 -SmbiosProcessorGetCacheAssociativity ( - IN UINT8 CacheLevel, - IN BOOLEAN DataCache, - IN BOOLEAN UnifiedCache - ) -{ - CCSIDR_DATA Ccsidr; - CSSELR_DATA Csselr; - BOOLEAN CcidxSupported; - UINT32 Associativity; - - // Read the CCSIDR register to get the cache architecture - Csselr.Data = 0; - Csselr.Bits.Level = CacheLevel - 1; - Csselr.Bits.InD = (!DataCache && !UnifiedCache); - - Ccsidr.Data = ReadCCSIDR (Csselr.Data); - - CcidxSupported = ArmHasCcidx (); - - if (CcidxSupported) { - Associativity = Ccsidr.BitsCcidxAA32.Associativity + 1; - } else { - Associativity = Ccsidr.BitsNonCcidx.Associativity + 1; - } - - return Associativity; -} From 889676ac603a209376193ee87a1e5c15fe6e53a2 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 22 Sep 2025 16:25:31 -0700 Subject: [PATCH 0537/1172] ArmPkg: Remove ARM32 Support from ArmMonitorLib edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 files from ArmMonitorLib. Signed-off-by: Oliver Smith-Denny --- ArmPkg/Include/Library/ArmMonitorLib.h | 2 - .../Library/ArmMonitorLib/Arm/ArmMonitorLib.S | 49 ------------------- .../Library/ArmMonitorLib/ArmMonitorLib.inf | 3 -- 3 files changed, 54 deletions(-) delete mode 100644 ArmPkg/Library/ArmMonitorLib/Arm/ArmMonitorLib.S diff --git a/ArmPkg/Include/Library/ArmMonitorLib.h b/ArmPkg/Include/Library/ArmMonitorLib.h index 1192ee28888a..cf773fccb27a 100644 --- a/ArmPkg/Include/Library/ArmMonitorLib.h +++ b/ArmPkg/Include/Library/ArmMonitorLib.h @@ -23,7 +23,6 @@ typedef struct { UINTN Arg5; UINTN Arg6; UINTN Arg7; - #ifdef MDE_CPU_AARCH64 UINTN Arg8; UINTN Arg9; UINTN Arg10; @@ -34,7 +33,6 @@ typedef struct { UINTN Arg15; UINTN Arg16; UINTN Arg17; - #endif } ARM_MONITOR_ARGS; /** Monitor call. diff --git a/ArmPkg/Library/ArmMonitorLib/Arm/ArmMonitorLib.S b/ArmPkg/Library/ArmMonitorLib/Arm/ArmMonitorLib.S deleted file mode 100644 index f3605cb8d93c..000000000000 --- a/ArmPkg/Library/ArmMonitorLib/Arm/ArmMonitorLib.S +++ /dev/null @@ -1,49 +0,0 @@ -// -// Copyright (c) 2024, Google Llc. All rights reserved. -// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -// - -#include - -/** Monitor call. - - An HyperVisor Call (HVC) or System Monitor Call (SMC) will be issued - depending on the default conduit. PcdMonitorConduitHvc determines the type - of the call: if true, do an HVC. - - @param [in,out] Args Arguments for the HVC/SMC. -**/ -ASM_FUNC(ArmMonitorCall) - push {r4-r7} - - // Preserve R0 for later use - mov ip, r0 - - // Load the SMCCC arguments values into the appropriate registers - ldm r0, {r0-r7} - -#if !defined(_PCD_VALUE_PcdMonitorConduitHvc) -#error -#elif _PCD_VALUE_PcdMonitorConduitHvc == 0 - .arch_extension sec - smc #0 -#elif _PCD_VALUE_PcdMonitorConduitHvc == 1 - .arch_extension virt - hvc #0 -#else -#error -#endif - - // A SMCCC SMC32/HVC32 call can return up to 8 values. - stm ip, {r0-r7} - - // Clear return values from registers - mov r0, #0 - mov r1, #0 - mov r2, #0 - mov r3, #0 - - pop {r4-r7} - bx lr diff --git a/ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf b/ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf index 06fbab28b6df..36371076de70 100644 --- a/ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf +++ b/ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf @@ -14,9 +14,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = ArmMonitorLib -[Sources.ARM] - Arm/ArmMonitorLib.S - [Sources.AARCH64] AArch64/ArmMonitorLib.S From 4261eb1befd6550f4a9af8109a42e6c84493cfc7 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 22 Sep 2025 16:26:56 -0700 Subject: [PATCH 0538/1172] ArmPkg: Remove ARM32 Support from ArmHvcLib edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 files from ArmHvcLib. Signed-off-by: Oliver Smith-Denny --- ArmPkg/Library/ArmHvcLib/Arm/ArmHvc.S | 45 -------------------------- ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf | 3 -- 2 files changed, 48 deletions(-) delete mode 100644 ArmPkg/Library/ArmHvcLib/Arm/ArmHvc.S diff --git a/ArmPkg/Library/ArmHvcLib/Arm/ArmHvc.S b/ArmPkg/Library/ArmHvcLib/Arm/ArmHvc.S deleted file mode 100644 index 9676529c1763..000000000000 --- a/ArmPkg/Library/ArmHvcLib/Arm/ArmHvc.S +++ /dev/null @@ -1,45 +0,0 @@ -// -// Copyright (c) 2012-2014, ARM Limited. All rights reserved. -// Copyright (c) 2014-2016, Linaro Limited. All rights reserved. -// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -// - -#include - -.arch_extension virt - -ASM_FUNC(ArmCallHvc) - push {r4-r8} - // r0 will be popped just after the HVC call - push {r0} - - // Load the HVC arguments values into the appropriate registers - ldr r7, [r0, #28] - ldr r6, [r0, #24] - ldr r5, [r0, #20] - ldr r4, [r0, #16] - ldr r3, [r0, #12] - ldr r2, [r0, #8] - ldr r1, [r0, #4] - ldr r0, [r0, #0] - - hvc #0 - - // Pop the ARM_HVC_ARGS structure address from the stack into r8 - pop {r8} - - // Load the HVC returned values into the appropriate registers - // A HVC call can return up to 4 values - we do not need to store back r4-r7. - str r3, [r8, #12] - str r2, [r8, #8] - str r1, [r8, #4] - str r0, [r8, #0] - - mov r0, r8 - - // Restore the registers r4-r8 - pop {r4-r8} - - bx lr diff --git a/ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf b/ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf index c5f2a016c0cd..366ae42c8858 100644 --- a/ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf +++ b/ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf @@ -14,9 +14,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = ArmHvcLib -[Sources.ARM] - Arm/ArmHvc.S | GCC - [Sources.AARCH64] AArch64/ArmHvc.S From cdc8858e19fa7f6bb19fd30c827992977b0cd2f6 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 22 Sep 2025 16:29:40 -0700 Subject: [PATCH 0539/1172] ArmPkg: Remove ARM32 Support from ArmLib edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 files from ArmLib. Signed-off-by: Oliver Smith-Denny --- ArmPkg/Library/ArmLib/Arm/ArmLibSupport.S | 153 ------------ ArmPkg/Library/ArmLib/Arm/ArmLibSupportV7.S | 103 -------- .../ArmLib/Arm/ArmV7ArchTimerSupport.S | 92 ------- ArmPkg/Library/ArmLib/Arm/ArmV7Lib.c | 81 ------ ArmPkg/Library/ArmLib/Arm/ArmV7Lib.h | 42 ---- ArmPkg/Library/ArmLib/Arm/ArmV7Support.S | 236 ------------------ ArmPkg/Library/ArmLib/ArmBaseLib.inf | 9 - 7 files changed, 716 deletions(-) delete mode 100644 ArmPkg/Library/ArmLib/Arm/ArmLibSupport.S delete mode 100644 ArmPkg/Library/ArmLib/Arm/ArmLibSupportV7.S delete mode 100644 ArmPkg/Library/ArmLib/Arm/ArmV7ArchTimerSupport.S delete mode 100644 ArmPkg/Library/ArmLib/Arm/ArmV7Lib.c delete mode 100644 ArmPkg/Library/ArmLib/Arm/ArmV7Lib.h delete mode 100644 ArmPkg/Library/ArmLib/Arm/ArmV7Support.S diff --git a/ArmPkg/Library/ArmLib/Arm/ArmLibSupport.S b/ArmPkg/Library/ArmLib/Arm/ArmLibSupport.S deleted file mode 100644 index 86635cc093ee..000000000000 --- a/ArmPkg/Library/ArmLib/Arm/ArmLibSupport.S +++ /dev/null @@ -1,153 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# Copyright (c) 2011 - 2016, ARM Limited. All rights reserved. -# Copyright (c) 2016, Linaro Limited. All rights reserved. -# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -ASM_FUNC(ArmReadMidr) - mrc p15,0,R0,c0,c0,0 - bx LR - -ASM_FUNC(ArmCacheInfo) - mrc p15,0,R0,c0,c0,1 - bx LR - -ASM_FUNC(ArmGetInterruptState) - mrs R0,CPSR - tst R0,#0x80 @Check if IRQ is enabled. - moveq R0,#1 - movne R0,#0 - bx LR - -ASM_FUNC(ArmGetFiqState) - mrs R0,CPSR - tst R0,#0x40 @Check if FIQ is enabled. - moveq R0,#1 - movne R0,#0 - bx LR - -ASM_FUNC(ArmSetDomainAccessControl) - mcr p15,0,r0,c3,c0,0 - bx lr - -ASM_FUNC(CPSRMaskInsert) @ on entry, r0 is the mask and r1 is the field to insert - stmfd sp!, {r4-r12, lr} @ save all the banked registers - mov r3, sp @ copy the stack pointer into a non-banked register - mrs r2, cpsr @ read the cpsr - bic r2, r2, r0 @ clear mask in the cpsr - and r1, r1, r0 @ clear bits outside the mask in the input - orr r2, r2, r1 @ set field - msr cpsr_cxsf, r2 @ write back cpsr (may have caused a mode switch) - isb - mov sp, r3 @ restore stack pointer - ldmfd sp!, {r4-r12, lr} @ restore registers - bx lr @ return (hopefully thumb-safe!) - -ASM_FUNC(CPSRRead) - mrs r0, cpsr - bx lr - -ASM_FUNC(ArmReadCpacr) - mrc p15, 0, r0, c1, c0, 2 - bx lr - -ASM_FUNC(ArmWriteCpacr) - mcr p15, 0, r0, c1, c0, 2 - isb - bx lr - -ASM_FUNC(ArmWriteAuxCr) - mcr p15, 0, r0, c1, c0, 1 - bx lr - -ASM_FUNC(ArmReadAuxCr) - mrc p15, 0, r0, c1, c0, 1 - bx lr - -ASM_FUNC(ArmSetTTBR0) - mcr p15,0,r0,c2,c0,0 - isb - bx lr - -ASM_FUNC(ArmSetTTBCR) - mcr p15, 0, r0, c2, c0, 2 - isb - bx lr - -ASM_FUNC(ArmGetTTBR0BaseAddress) - mrc p15,0,r0,c2,c0,0 - MOV32 (r1, 0xFFFFC000) - and r0, r0, r1 - isb - bx lr - -// -//VOID -//ArmUpdateTranslationTableEntry ( -// IN VOID *TranslationTableEntry // R0 -// IN VOID *MVA // R1 -// ); -ASM_FUNC(ArmUpdateTranslationTableEntry) - mcr p15,0,R1,c8,c7,1 @ TLBIMVA TLB Invalidate MVA - mcr p15,0,R9,c7,c5,6 @ BPIALL Invalidate Branch predictor array. R9 == NoOp - dsb - isb - bx lr - -ASM_FUNC(ArmInvalidateTlb) - mov r0,#0 - mcr p15,0,r0,c8,c7,0 - mcr p15,0,R9,c7,c5,6 @ BPIALL Invalidate Branch predictor array. R9 == NoOp - dsb - isb - bx lr - -ASM_FUNC(ArmReadHVBar) - mrc p15, 4, r0, c12, c0, 0 - bx lr - -ASM_FUNC(ArmWriteHVBar) - mcr p15, 4, r0, c12, c0, 0 - bx lr - -ASM_FUNC(ArmCallWFE) - wfe - bx lr - -ASM_FUNC(ArmCallSEV) - sev - bx lr - -ASM_FUNC(ArmReadSctlr) - mrc p15, 0, r0, c1, c0, 0 @ Read SCTLR into R0 (Read control register configuration data) - bx lr - -ASM_FUNC(ArmWriteSctlr) - mcr p15, 0, r0, c1, c0, 0 - bx lr - -ASM_FUNC(ArmReadCpuActlr) - mrc p15, 0, r0, c1, c0, 1 - bx lr - -ASM_FUNC(ArmWriteCpuActlr) - mcr p15, 0, r0, c1, c0, 1 - dsb - isb - bx lr - -ASM_FUNC (ArmGetPhysicalAddressBits) - mrc p15, 0, r0, c0, c1, 4 // MMFR0 - and r0, r0, #0xf // VMSA [3:0] - cmp r0, #5 // >= 5 implies LPAE support - movlt r0, #32 // 32 bits if no LPAE - movge r0, #40 // 40 bits if LPAE - bx lr - -ASM_FUNCTION_REMOVE_IF_UNREFERENCED diff --git a/ArmPkg/Library/ArmLib/Arm/ArmLibSupportV7.S b/ArmPkg/Library/ArmLib/Arm/ArmLibSupportV7.S deleted file mode 100644 index d207876a2198..000000000000 --- a/ArmPkg/Library/ArmLib/Arm/ArmLibSupportV7.S +++ /dev/null @@ -1,103 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# Copyright (c) 2011-2013, ARM Limited. All rights reserved. -# Copyright (c) 2016, Linaro Limited. All rights reserved. -# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -ASM_FUNC(ArmIsMpCore) - mrc p15,0,R0,c0,c0,5 - // Get Multiprocessing extension (bit31) & U bit (bit30) - and R0, R0, #0xC0000000 - // if (bit31 == 1) && (bit30 == 0) then the processor is part of a multiprocessor system - cmp R0, #0x80000000 - moveq R0, #1 - movne R0, #0 - bx LR - -ASM_FUNC(ArmEnableAsynchronousAbort) - cpsie a - isb - bx LR - -ASM_FUNC(ArmDisableAsynchronousAbort) - cpsid a - isb - bx LR - -ASM_FUNC(ArmEnableIrq) - cpsie i - isb - bx LR - -ASM_FUNC(ArmDisableIrq) - cpsid i - isb - bx LR - -ASM_FUNC(ArmEnableFiq) - cpsie f - isb - bx LR - -ASM_FUNC(ArmDisableFiq) - cpsid f - isb - bx LR - -ASM_FUNC(ArmEnableInterrupts) - cpsie if - isb - bx LR - -ASM_FUNC(ArmDisableInterrupts) - cpsid if - isb - bx LR - -ASM_FUNC(ArmReadIdMmfr4) - mrc p15,0,r0,c0,c2,6 @ Read ID_MMFR4 Register - bx lr - -// UINTN -// ReadCCSIDR ( -// IN UINT32 CSSELR -// ) -ASM_FUNC(ReadCCSIDR) - mcr p15,2,r0,c0,c0,0 @ Write Cache Size Selection Register (CSSELR) - isb - mrc p15,1,r0,c0,c0,0 @ Read current CP15 Cache Size ID Register (CCSIDR) - bx lr - -// UINT32 -// ReadCCSIDR2 ( -// IN UINT32 CSSELR -// ) -ASM_FUNC(ReadCCSIDR2) - mcr p15,2,r0,c0,c0,0 @ Write Cache Size Selection Register (CSSELR) - isb - mrc p15,1,r0,c0,c0,2 @ Read current CP15 Cache Size ID Register (CCSIDR2) - bx lr - -// UINT32 -// ReadCLIDR ( -// IN UINT32 CSSELR -// ) -ASM_FUNC(ReadCLIDR) - mrc p15,1,r0,c0,c0,1 @ Read CP15 Cache Level ID Register - bx lr - -ASM_FUNC(ArmReadNsacr) - mrc p15, 0, r0, c1, c1, 2 - bx lr - -ASM_FUNC(ArmWriteNsacr) - mcr p15, 0, r0, c1, c1, 2 - bx lr - -ASM_FUNCTION_REMOVE_IF_UNREFERENCED diff --git a/ArmPkg/Library/ArmLib/Arm/ArmV7ArchTimerSupport.S b/ArmPkg/Library/ArmLib/Arm/ArmV7ArchTimerSupport.S deleted file mode 100644 index 2ad9b480d195..000000000000 --- a/ArmPkg/Library/ArmLib/Arm/ArmV7ArchTimerSupport.S +++ /dev/null @@ -1,92 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2011, ARM Limited. All rights reserved. -# Copyright (c) 2016, Linaro Limited. All rights reserved. -# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -ASM_FUNC(ArmReadCntFrq) - mrc p15, 0, r0, c14, c0, 0 @ Read CNTFRQ - bx lr - -ASM_FUNC(ArmWriteCntFrq) - mcr p15, 0, r0, c14, c0, 0 @ Write to CNTFRQ - bx lr - -ASM_FUNC(ArmReadCntPct) - mrrc p15, 0, r0, r1, c14 @ Read CNTPT (Physical counter register) - bx lr - -ASM_FUNC(ArmReadCntkCtl) - mrc p15, 0, r0, c14, c1, 0 @ Read CNTK_CTL (Timer PL1 Control Register) - bx lr - -ASM_FUNC(ArmWriteCntkCtl) - mcr p15, 0, r0, c14, c1, 0 @ Write to CNTK_CTL (Timer PL1 Control Register) - bx lr - -ASM_FUNC(ArmReadCntpTval) - mrc p15, 0, r0, c14, c2, 0 @ Read CNTP_TVAL (PL1 physical timer value register) - bx lr - -ASM_FUNC(ArmWriteCntpTval) - mcr p15, 0, r0, c14, c2, 0 @ Write to CNTP_TVAL (PL1 physical timer value register) - bx lr - -ASM_FUNC(ArmReadCntpCtl) - mrc p15, 0, r0, c14, c2, 1 @ Read CNTP_CTL (PL1 Physical Timer Control Register) - bx lr - -ASM_FUNC(ArmWriteCntpCtl) - mcr p15, 0, r0, c14, c2, 1 @ Write to CNTP_CTL (PL1 Physical Timer Control Register) - bx lr - -ASM_FUNC(ArmReadCntvTval) - mrc p15, 0, r0, c14, c3, 0 @ Read CNTV_TVAL (Virtual Timer Value register) - bx lr - -ASM_FUNC(ArmWriteCntvTval) - mcr p15, 0, r0, c14, c3, 0 @ Write to CNTV_TVAL (Virtual Timer Value register) - bx lr - -ASM_FUNC(ArmReadCntvCtl) - mrc p15, 0, r0, c14, c3, 1 @ Read CNTV_CTL (Virtual Timer Control Register) - bx lr - -ASM_FUNC(ArmWriteCntvCtl) - mcr p15, 0, r0, c14, c3, 1 @ Write to CNTV_CTL (Virtual Timer Control Register) - bx lr - -ASM_FUNC(ArmReadCntvCt) - mrrc p15, 1, r0, r1, c14 @ Read CNTVCT (Virtual Count Register) - bx lr - -ASM_FUNC(ArmReadCntpCval) - mrrc p15, 2, r0, r1, c14 @ Read CNTP_CTVAL (Physical Timer Compare Value Register) - bx lr - -ASM_FUNC(ArmWriteCntpCval) - mcrr p15, 2, r0, r1, c14 @ Write to CNTP_CTVAL (Physical Timer Compare Value Register) - bx lr - -ASM_FUNC(ArmReadCntvCval) - mrrc p15, 3, r0, r1, c14 @ Read CNTV_CTVAL (Virtual Timer Compare Value Register) - bx lr - -ASM_FUNC(ArmWriteCntvCval) - mcrr p15, 3, r0, r1, c14 @ write to CNTV_CTVAL (Virtual Timer Compare Value Register) - bx lr - -ASM_FUNC(ArmReadCntvOff) - mrrc p15, 4, r0, r1, c14 @ Read CNTVOFF (virtual Offset register) - bx lr - -ASM_FUNC(ArmWriteCntvOff) - mcrr p15, 4, r0, r1, c14 @ Write to CNTVOFF (Virtual Offset register) - bx lr - -ASM_FUNCTION_REMOVE_IF_UNREFERENCED diff --git a/ArmPkg/Library/ArmLib/Arm/ArmV7Lib.c b/ArmPkg/Library/ArmLib/Arm/ArmV7Lib.c deleted file mode 100644 index ee04294d2210..000000000000 --- a/ArmPkg/Library/ArmLib/Arm/ArmV7Lib.c +++ /dev/null @@ -1,81 +0,0 @@ -/** @file - - Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
- Copyright (c) 2011 - 2014, ARM Limited. All rights reserved. - Copyright (c) 2021, NUVIA Inc. All rights reserved.
- - SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include - -#include -#include - -#include - -#include "ArmV7Lib.h" -#include "ArmLibPrivate.h" - -/** - Check whether the CPU supports the GIC system register interface (any version) - - @return Whether GIC System Register Interface is supported - -**/ -BOOLEAN -EFIAPI -ArmHasGicSystemRegisters ( - VOID - ) -{ - return ((ArmReadIdPfr1 () & ARM_PFR1_GIC) != 0); -} - -/** - Check whether the CPU supports the GICv5 system register interface - - @return Whether GICv5 System Register Interface is supported -**/ -BOOLEAN -EFIAPI -ArmHasGicV5SystemRegisters ( - VOID - ) -{ - // GICv5 not supported in AArch32. - return FALSE; -} - -/** - Check whether the CPU supports the Security extensions - - @return Whether the Security extensions are implemented - -**/ -BOOLEAN -EFIAPI -ArmHasSecurityExtensions ( - VOID - ) -{ - return ((ArmReadIdPfr1 () & ARM_PFR1_SEC) != 0); -} - -/** Checks if CCIDX is implemented. - - @retval TRUE CCIDX is implemented. - @retval FALSE CCIDX is not implemented. -**/ -BOOLEAN -EFIAPI -ArmHasCcidx ( - VOID - ) -{ - UINTN Mmfr4; - - Mmfr4 = ArmReadIdMmfr4 (); - return (((Mmfr4 >> 24) & 0xF) == 1) ? TRUE : FALSE; -} diff --git a/ArmPkg/Library/ArmLib/Arm/ArmV7Lib.h b/ArmPkg/Library/ArmLib/Arm/ArmV7Lib.h deleted file mode 100644 index 548be5cf28b0..000000000000 --- a/ArmPkg/Library/ArmLib/Arm/ArmV7Lib.h +++ /dev/null @@ -1,42 +0,0 @@ -/** @file - - Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
- - SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#ifndef ARM_V7_LIB_H_ -#define ARM_V7_LIB_H_ - -#define ID_MMFR0_SHARELVL_SHIFT 12 -#define ID_MMFR0_SHARELVL_MASK 0xf -#define ID_MMFR0_SHARELVL_ONE 0 -#define ID_MMFR0_SHARELVL_TWO 1 - -#define ID_MMFR0_INNERSHR_SHIFT 28 -#define ID_MMFR0_INNERSHR_MASK 0xf -#define ID_MMFR0_OUTERSHR_SHIFT 8 -#define ID_MMFR0_OUTERSHR_MASK 0xf - -#define ID_MMFR0_SHR_IMP_UNCACHED 0 -#define ID_MMFR0_SHR_IMP_HW_COHERENT 1 -#define ID_MMFR0_SHR_IGNORED 0xf - -/** Reads the ID_MMFR4 register. - - @return The contents of the ID_MMFR4 register. -**/ -UINT32 -EFIAPI -ArmReadIdMmfr4 ( - VOID - ); - -UINTN -EFIAPI -ArmReadIdPfr1 ( - VOID - ); - -#endif // ARM_V7_LIB_H_ diff --git a/ArmPkg/Library/ArmLib/Arm/ArmV7Support.S b/ArmPkg/Library/ArmLib/Arm/ArmV7Support.S deleted file mode 100644 index 0bfb5f1c9971..000000000000 --- a/ArmPkg/Library/ArmLib/Arm/ArmV7Support.S +++ /dev/null @@ -1,236 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.
-# Copyright (c) 2011 - 2014, ARM Limited. All rights reserved. -# Copyright (c) 2016, Linaro Limited. All rights reserved. -# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -.set DC_ON, (0x1<<2) -.set IC_ON, (0x1<<12) -.set CTRL_M_BIT, (1 << 0) -.set CTRL_C_BIT, (1 << 2) -.set CTRL_B_BIT, (1 << 7) -.set CTRL_I_BIT, (1 << 12) -.set CTRL_AFE_BIT,(1 << 29) - - -ASM_FUNC(ArmInvalidateDataCacheEntryByMVA) - mcr p15, 0, r0, c7, c6, 1 @invalidate single data cache line - bx lr - -ASM_FUNC(ArmCleanDataCacheEntryByMVA) - mcr p15, 0, r0, c7, c10, 1 @clean single data cache line - bx lr - - -ASM_FUNC(ArmCleanDataCacheEntryToPoUByMVA) - mcr p15, 0, r0, c7, c11, 1 @clean single data cache line to PoU - bx lr - -ASM_FUNC(ArmInvalidateInstructionCacheEntryToPoUByMVA) - mcr p15, 0, r0, c7, c5, 1 @Invalidate single instruction cache line to PoU - mcr p15, 0, r0, c7, c5, 7 @Invalidate branch predictor - bx lr - -ASM_FUNC(ArmCleanInvalidateDataCacheEntryByMVA) - mcr p15, 0, r0, c7, c14, 1 @clean and invalidate single data cache line - bx lr - - -ASM_FUNC(ArmInvalidateInstructionCache) - mcr p15,0,R0,c7,c5,0 @Invalidate entire instruction cache - dsb - isb - bx LR - -ASM_FUNC(ArmEnableMmu) - mrc p15,0,R0,c1,c0,0 - orr R0,R0,#1 - orr R0,R0,#CTRL_AFE_BIT - mcr p15,0,R0,c1,c0,0 - dsb - isb - bx LR - - -ASM_FUNC(ArmDisableMmu) - mrc p15,0,R0,c1,c0,0 - bic R0,R0,#1 - mcr p15,0,R0,c1,c0,0 @Disable MMU - - mcr p15,0,R0,c8,c7,0 @Invalidate TLB - mcr p15,0,R0,c7,c5,6 @Invalidate Branch predictor array - dsb - isb - bx LR - -ASM_FUNC(ArmDisableCachesAndMmu) - mrc p15, 0, r0, c1, c0, 0 @ Get control register - bic r0, r0, #CTRL_M_BIT @ Disable MMU - bic r0, r0, #CTRL_C_BIT @ Disable D Cache - bic r0, r0, #CTRL_I_BIT @ Disable I Cache - mcr p15, 0, r0, c1, c0, 0 @ Write control register - dsb - isb - bx LR - -ASM_FUNC(ArmMmuEnabled) - mrc p15,0,R0,c1,c0,0 - and R0,R0,#1 - bx LR - -ASM_FUNC(ArmEnableDataCache) - ldr R1,=DC_ON - mrc p15,0,R0,c1,c0,0 @Read control register configuration data - orr R0,R0,R1 @Set C bit - mcr p15,0,r0,c1,c0,0 @Write control register configuration data - dsb - isb - bx LR - -ASM_FUNC(ArmDisableDataCache) - ldr R1,=DC_ON - mrc p15,0,R0,c1,c0,0 @Read control register configuration data - bic R0,R0,R1 @Clear C bit - mcr p15,0,r0,c1,c0,0 @Write control register configuration data - dsb - isb - bx LR - -ASM_FUNC(ArmEnableInstructionCache) - ldr R1,=IC_ON - mrc p15,0,R0,c1,c0,0 @Read control register configuration data - orr R0,R0,R1 @Set I bit - mcr p15,0,r0,c1,c0,0 @Write control register configuration data - dsb - isb - bx LR - -ASM_FUNC(ArmDisableInstructionCache) - ldr R1,=IC_ON - mrc p15,0,R0,c1,c0,0 @Read control register configuration data - bic R0,R0,R1 @Clear I bit. - mcr p15,0,r0,c1,c0,0 @Write control register configuration data - dsb - isb - bx LR - -ASM_FUNC(ArmEnableSWPInstruction) - mrc p15, 0, r0, c1, c0, 0 - orr r0, r0, #0x00000400 - mcr p15, 0, r0, c1, c0, 0 - isb - bx LR - -ASM_FUNC(ArmEnableBranchPrediction) - mrc p15, 0, r0, c1, c0, 0 - orr r0, r0, #0x00000800 - mcr p15, 0, r0, c1, c0, 0 - dsb - isb - bx LR - -ASM_FUNC(ArmDisableBranchPrediction) - mrc p15, 0, r0, c1, c0, 0 - bic r0, r0, #0x00000800 - mcr p15, 0, r0, c1, c0, 0 - dsb - isb - bx LR - -ASM_FUNC(ArmSetLowVectors) - mrc p15, 0, r0, c1, c0, 0 @ Read SCTLR into R0 (Read control register configuration data) - bic r0, r0, #0x00002000 @ clear V bit - mcr p15, 0, r0, c1, c0, 0 @ Write R0 into SCTLR (Write control register configuration data) - isb - bx LR - -ASM_FUNC(ArmSetHighVectors) - mrc p15, 0, r0, c1, c0, 0 @ Read SCTLR into R0 (Read control register configuration data) - orr r0, r0, #0x00002000 @ Set V bit - mcr p15, 0, r0, c1, c0, 0 @ Write R0 into SCTLR (Write control register configuration data) - isb - bx LR - -ASM_FUNC(ArmDataMemoryBarrier) - dmb - bx LR - -ASM_FUNC(ArmDataSynchronizationBarrier) - dsb - bx LR - -ASM_FUNC(ArmInstructionSynchronizationBarrier) - isb - bx LR - -ASM_FUNC(ArmReadVBar) - # Set the Address of the Vector Table in the VBAR register - mrc p15, 0, r0, c12, c0, 0 - bx lr - -ASM_FUNC(ArmWriteVBar) - # Set the Address of the Vector Table in the VBAR register - mcr p15, 0, r0, c12, c0, 0 - # Ensure the SCTLR.V bit is clear - mrc p15, 0, r0, c1, c0, 0 @ Read SCTLR into R0 (Read control register configuration data) - bic r0, r0, #0x00002000 @ clear V bit - mcr p15, 0, r0, c1, c0, 0 @ Write R0 into SCTLR (Write control register configuration data) - isb - bx lr - -ASM_FUNC(ArmEnableVFP) - # Read CPACR (Coprocessor Access Control Register) - mrc p15, 0, r0, c1, c0, 2 - # Enable VPF access (Full Access to CP10, CP11) (V* instructions) - orr r0, r0, #0x00f00000 - # Write back CPACR (Coprocessor Access Control Register) - mcr p15, 0, r0, c1, c0, 2 - isb - # Set EN bit in FPEXC. The Advanced SIMD and VFP extensions are enabled and operate normally. - mov r0, #0x40000000 -#ifndef __clang__ - mcr p10,#0x7,r0,c8,c0,#0 -#else - # Set the FPU model so Clang does not choke on the next instruction - .fpu neon - vmsr fpexc, r0 -#endif - bx lr - -ASM_FUNC(ArmCallWFI) - wfi - bx lr - -#Note: Return 0 in Uniprocessor implementation -ASM_FUNC(ArmReadCbar) - mrc p15, 4, r0, c15, c0, 0 @ Read Configuration Base Address Register - bx lr - -ASM_FUNC(ArmReadMpidr) - mrc p15, 0, r0, c0, c0, 5 @ read MPIDR - bx lr - -ASM_FUNC(ArmReadTpidrurw) - mrc p15, 0, r0, c13, c0, 2 @ read TPIDRURW - bx lr - -ASM_FUNC(ArmWriteTpidrurw) - mcr p15, 0, r0, c13, c0, 2 @ write TPIDRURW - bx lr - -ASM_FUNC(ArmIsArchTimerImplemented) - mrc p15, 0, r0, c0, c1, 1 @ Read ID_PFR1 - and r0, r0, #0x000F0000 - bx lr - -ASM_FUNC(ArmReadIdPfr1) - mrc p15, 0, r0, c0, c1, 1 @ Read ID_PFR1 Register - bx lr - -ASM_FUNCTION_REMOVE_IF_UNREFERENCED diff --git a/ArmPkg/Library/ArmLib/ArmBaseLib.inf b/ArmPkg/Library/ArmLib/ArmBaseLib.inf index 6d1acd281e25..eacb14c66c76 100644 --- a/ArmPkg/Library/ArmLib/ArmBaseLib.inf +++ b/ArmPkg/Library/ArmLib/ArmBaseLib.inf @@ -21,15 +21,6 @@ ArmLibPrivate.h ArmLib.c -[Sources.ARM] - Arm/ArmV7Lib.h - Arm/ArmV7Lib.c - - Arm/ArmLibSupport.S | GCC - Arm/ArmLibSupportV7.S | GCC - Arm/ArmV7Support.S | GCC - Arm/ArmV7ArchTimerSupport.S | GCC - [Sources.AARCH64] AArch64/AArch64Lib.h AArch64/AArch64Lib.c From f73b53c28333956b64716cee518e28028eb63334 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Fri, 19 Sep 2025 21:01:50 -0700 Subject: [PATCH 0540/1172] ArmPkg: Remove Incorrect ArmPkg.dsc Sections Components.common.module_type is not correct DSC syntax. This removes the two instances from ArmPkg.dsc to conform to correct DSC syntax. Signed-off-by: Oliver Smith-Denny --- ArmPkg/ArmPkg.dsc | 2 -- 1 file changed, 2 deletions(-) diff --git a/ArmPkg/ArmPkg.dsc b/ArmPkg/ArmPkg.dsc index d4d483cf2bfe..994ff852ba4b 100644 --- a/ArmPkg/ArmPkg.dsc +++ b/ArmPkg/ArmPkg.dsc @@ -154,10 +154,8 @@ ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.inf -[Components.common.MM_CORE_STANALONE] ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.inf -[Components.common.MM_STANDALONE] ArmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.inf [Components.AARCH64] From 80de048c1b7586cbe6d994413e1517fcc4c9de2b Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Fri, 19 Sep 2025 21:00:20 -0700 Subject: [PATCH 0541/1172] ArmPkg: Remove ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from the remaining parts of ArmPkg. Signed-off-by: Oliver Smith-Denny --- ArmPkg/ArmPkg.dec | 42 ++-------------------- ArmPkg/ArmPkg.dsc | 2 -- ArmPkg/Include/IndustryStandard/ArmMmSvc.h | 9 +---- ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h | 14 -------- 4 files changed, 4 insertions(+), 63 deletions(-) diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec index ad82faea8b5f..d719eacb6f78 100644 --- a/ArmPkg/ArmPkg.dec +++ b/ArmPkg/ArmPkg.dec @@ -193,45 +193,6 @@ # If PcdMonitorConduitHvc = TRUE, conduit = HVC gArmTokenSpaceGuid.PcdMonitorConduitHvc|FALSE|BOOLEAN|0x00000047 -[PcdsFixedAtBuild.common, PcdsPatchableInModule.common] - gArmTokenSpaceGuid.PcdFdBaseAddress|0|UINT64|0x0000002B - gArmTokenSpaceGuid.PcdFvBaseAddress|0|UINT64|0x0000002D - -[PcdsFixedAtBuild.ARM] - # This PCD should be a FeaturePcd. But we used this PCD as an '#if' in an ASM file. - # Using a FeaturePcd make a '(BOOLEAN) casting for its value which is not understood by the preprocessor. - gArmTokenSpaceGuid.PcdVFPEnabled|0|UINT32|0x00000024 - - # - # ARM Security Extension - # - - # Secure Configuration Register - # - BIT0 : NS - Non Secure bit - # - BIT1 : IRQ Handler - # - BIT2 : FIQ Handler - # - BIT3 : EA - External Abort - # - BIT4 : FW - F bit writable - # - BIT5 : AW - A bit writable - # - BIT6 : nET - Not Early Termination - # - BIT7 : SCD - Secure Monitor Call Disable - # - BIT8 : HCE - Hyp Call enable - # - BIT9 : SIF - Secure Instruction Fetch - # 0x31 = NS | EA | FW - gArmTokenSpaceGuid.PcdArmScr|0x31|UINT32|0x00000038 - - # By default we do not do a transition to non-secure mode - gArmTokenSpaceGuid.PcdArmNonSecModeTransition|0x0|UINT32|0x0000003E - - # Non Secure Access Control Register - # - BIT15 : NSASEDIS - Disable Non-secure Advanced SIMD functionality - # - BIT14 : NSD32DIS - Disable Non-secure use of D16-D31 - # - BIT11 : cp11 - Non-secure access to coprocessor 11 enable - # - BIT10 : cp10 - Non-secure access to coprocessor 10 enable - # 0xC00 = cp10 | cp11 - gArmTokenSpaceGuid.PcdArmNsacr|0xC00|UINT32|0x00000039 - -[PcdsFixedAtBuild.AARCH64] # # AArch64 Security Extension # @@ -262,6 +223,9 @@ # not currently supported. gArmTokenSpaceGuid.PcdArmNonSecModeTransition|0x3c9|UINT32|0x0000003E +[PcdsFixedAtBuild.common, PcdsPatchableInModule.common] + gArmTokenSpaceGuid.PcdFdBaseAddress|0|UINT64|0x0000002B + gArmTokenSpaceGuid.PcdFvBaseAddress|0|UINT64|0x0000002D # # These PCDs are also defined as 'PcdsDynamic' or 'PcdsPatchableInModule' to be diff --git a/ArmPkg/ArmPkg.dsc b/ArmPkg/ArmPkg.dsc index 994ff852ba4b..85f431f14a81 100644 --- a/ArmPkg/ArmPkg.dsc +++ b/ArmPkg/ArmPkg.dsc @@ -158,11 +158,9 @@ ArmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.inf -[Components.AARCH64] ArmPkg/Drivers/ArmCrashDumpDxe/ArmCrashDumpDxe.inf ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf ArmPkg/Drivers/ArmPsciMpServicesDxe/ArmPsciMpServicesDxe.inf ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.inf -[Components.AARCH64, Components.ARM] ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.inf diff --git a/ArmPkg/Include/IndustryStandard/ArmMmSvc.h b/ArmPkg/Include/IndustryStandard/ArmMmSvc.h index 0745acbf167f..9db951198621 100644 --- a/ArmPkg/Include/IndustryStandard/ArmMmSvc.h +++ b/ArmPkg/Include/IndustryStandard/ArmMmSvc.h @@ -22,17 +22,10 @@ #define ARM_FID_SPM_MM_SP_GET_MEM_ATTRIBUTES_AARCH64 0xC4000064 #define ARM_FID_SPM_MM_SP_SET_MEM_ATTRIBUTES_AARCH64 0xC4000065 -/* Generic IDs when using AArch32 or AArch64 execution state */ -#ifdef MDE_CPU_AARCH64 +/* Generic IDs for AArch64 execution state */ #define ARM_FID_SPM_MM_SP_EVENT_COMPLETE ARM_FID_SPM_MM_SP_EVENT_COMPLETE_AARCH64 #define ARM_FID_SPM_MM_SP_GET_MEM_ATTRIBUTES ARM_FID_SPM_MM_SP_GET_MEM_ATTRIBUTES_AARCH64 #define ARM_FID_SPM_MM_SP_SET_MEM_ATTRIBUTES ARM_FID_SPM_MM_SP_SET_MEM_ATTRIBUTES_AARCH64 -#endif -#ifdef MDE_CPU_ARM -#define ARM_FID_SPM_MM_SP_EVENT_COMPLETE ARM_FID_SPM_MM_SP_EVENT_COMPLETE_AARCH32 -#define ARM_FID_SPM_MM_SP_GET_MEM_ATTRIBUTES ARM_FID_SPM_MM_SP_GET_MEM_ATTRIBUTES_AARCH32 -#define ARM_FID_SPM_MM_SP_SET_MEM_ATTRIBUTES ARM_FID_SPM_MM_SP_SET_MEM_ATTRIBUTES_AARCH32 -#endif #define ARM_SPM_MM_SET_MEM_ATTR_DATA_PERM_MASK 0x3 #define ARM_SPM_MM_SET_MEM_ATTR_DATA_PERM_SHIFT 0 diff --git a/ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h b/ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h index 8038a968b50f..ef8dd4410a8f 100644 --- a/ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h +++ b/ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h @@ -25,17 +25,6 @@ #define TRNG_REV_MINOR_MASK 0xFFFF #define TRNG_REV_MAJOR_SHIFT 16 -#if defined (MDE_CPU_ARM) - -/** FID to use on AArch32 platform to request entropy. -*/ -#define ARM_SMC_ID_TRNG_RND ARM_SMC_ID_TRNG_RND_AARCH32 - -/** Maximum bits of entropy supported on AArch32. -*/ -#define MAX_ENTROPY_BITS 96 -#elif defined (MDE_CPU_AARCH64) - /** FID to use on AArch64 platform to request entropy. */ #define ARM_SMC_ID_TRNG_RND ARM_SMC_ID_TRNG_RND_AARCH64 @@ -43,8 +32,5 @@ /** Maximum bits of entropy supported on AArch64. */ #define MAX_ENTROPY_BITS 192 -#else - #error "Firmware TRNG not supported. Unknown chipset." -#endif #endif // ARM_FW_TRNG_DEFS_H_ From ef79d5842734e0504f58aef86142079ed26b7238 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 09:26:04 -0700 Subject: [PATCH 0542/1172] MdeModulePkg: Remove ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 support from MdeModulePkg. This also drops irrelevant VALID_ARCHITECTURE comments from infs that are not arch specific. Signed-off-by: Oliver Smith-Denny --- MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf | 10 ---------- MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf | 10 ---------- .../Bus/Pci/SataControllerDxe/SataControllerDxe.inf | 10 ---------- MdeModulePkg/Bus/Pci/UhciDxe/UhciDxe.inf | 10 ---------- MdeModulePkg/Bus/Pci/XhciDxe/XhciDxe.inf | 10 ---------- MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf | 10 ---------- MdeModulePkg/Bus/Usb/UsbKbDxe/UsbKbDxe.inf | 10 ---------- MdeModulePkg/Core/Dxe/Image/Image.c | 13 ++++++------- MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf | 4 ++-- .../Library/BaseHobLibNull/BaseHobLibNull.inf | 5 ----- .../BaseMemoryAllocationLibNull.inf | 5 ----- .../LzmaCustomDecompressLib.inf | 6 ------ MdeModulePkg/Logo/Logo.inf | 6 ------ MdeModulePkg/MdeModulePkg.dec | 2 +- MdeModulePkg/MdeModulePkg.dsc | 8 ++++---- .../CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf | 8 ++++---- .../CapsuleRuntimeDxe/SaveLongModeContext.c | 2 +- .../Universal/Disk/RamDiskDxe/RamDiskDxe.inf | 6 ------ .../FaultTolerantWriteStandaloneMm.inf | 6 ------ .../RegularExpressionDxe/OnigurumaUefiPort.c | 3 --- .../RegularExpressionDxe/OnigurumaUefiPort.h | 5 +---- MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf | 6 ------ .../SmbiosMeasurementDxe/SmbiosMeasurementDxe.inf | 6 ------ .../Variable/RuntimeDxe/VariableStandaloneMm.inf | 7 ------- 24 files changed, 19 insertions(+), 149 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf b/MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf index ffce075c2389..15032ca6bfeb 100644 --- a/MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf +++ b/MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf @@ -25,16 +25,6 @@ ENTRY_POINT = EhcDriverEntryPoint -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 -# -# DRIVER_BINDING = gEhciDriverBinding -# COMPONENT_NAME = gEhciComponentName -# COMPONENT_NAME2 = gEhciComponentName2 -# - [Sources] UsbHcMem.h EhciUrb.c diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf index e317169d9c57..6a0dc08cb7f3 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf @@ -18,16 +18,6 @@ VERSION_STRING = 1.0 ENTRY_POINT = PciBusEntryPoint -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 -# -# DRIVER_BINDING = gPciBusDriverBinding -# COMPONENT_NAME = gPciBusComponentName -# COMPONENT_NAME2 = gPciBusComponentName2 -# - [Sources] PciLib.c PciIo.c diff --git a/MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf b/MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf index e446058e34cb..2100eccf8655 100644 --- a/MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf +++ b/MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf @@ -15,16 +15,6 @@ VERSION_STRING = 1.0 ENTRY_POINT = InitializeSataControllerDriver -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 -# -# DRIVER_BINDING = gSataControllerDriverBinding -# COMPONENT_NAME = gSataControllerComponentName -# COMPONENT_NAME2 = gSataControllerComponentName2 -# - [Sources] ComponentName.c SataController.c diff --git a/MdeModulePkg/Bus/Pci/UhciDxe/UhciDxe.inf b/MdeModulePkg/Bus/Pci/UhciDxe/UhciDxe.inf index a5da1a91201d..6de9e63e77fb 100644 --- a/MdeModulePkg/Bus/Pci/UhciDxe/UhciDxe.inf +++ b/MdeModulePkg/Bus/Pci/UhciDxe/UhciDxe.inf @@ -20,16 +20,6 @@ ENTRY_POINT = UhciDriverEntryPoint -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 -# -# DRIVER_BINDING = gUhciDriverBinding -# COMPONENT_NAME = gUhciComponentName -# COMPONENT_NAME2 = gUhciComponentName2 -# - [Sources] UhciSched.c UhciDebug.c diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/XhciDxe.inf b/MdeModulePkg/Bus/Pci/XhciDxe/XhciDxe.inf index 4ab986a01975..0e0289e8a653 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/XhciDxe.inf +++ b/MdeModulePkg/Bus/Pci/XhciDxe/XhciDxe.inf @@ -21,16 +21,6 @@ ENTRY_POINT = XhcDriverEntryPoint -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 -# -# DRIVER_BINDING = gXhciDriverBinding -# COMPONENT_NAME = gXhciComponentName -# COMPONENT_NAME2 = gXhciComponentName2 -# - [Sources] Xhci.c XhciReg.c diff --git a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf index 1dd0adfed1d7..d7bd52fbc281 100644 --- a/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf +++ b/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf @@ -18,16 +18,6 @@ ENTRY_POINT = UsbBusDriverEntryPoint -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 -# -# DRIVER_BINDING = mUsbBusDriverBinding -# COMPONENT_NAME = mUsbBusComponentName -# COMPONENT_NAME2 = mUsbBusComponentName2 -# - [Sources] UsbDesc.c UsbEnumer.c diff --git a/MdeModulePkg/Bus/Usb/UsbKbDxe/UsbKbDxe.inf b/MdeModulePkg/Bus/Usb/UsbKbDxe/UsbKbDxe.inf index e981a0afc2d9..d2010decabca 100644 --- a/MdeModulePkg/Bus/Usb/UsbKbDxe/UsbKbDxe.inf +++ b/MdeModulePkg/Bus/Usb/UsbKbDxe/UsbKbDxe.inf @@ -28,16 +28,6 @@ VERSION_STRING = 1.0 ENTRY_POINT = USBKeyboardDriverBindingEntryPoint -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 -# -# DRIVER_BINDING = gUsbKeyboardDriverBinding -# COMPONENT_NAME = gUsbKeyboardComponentName -# COMPONENT_NAME2 = gUsbKeyboardComponentName2 -# - [Sources] EfiKey.c EfiKey.h diff --git a/MdeModulePkg/Core/Dxe/Image/Image.c b/MdeModulePkg/Core/Dxe/Image/Image.c index 71d267b3db5c..ed30890599ab 100644 --- a/MdeModulePkg/Core/Dxe/Image/Image.c +++ b/MdeModulePkg/Core/Dxe/Image/Image.c @@ -77,13 +77,12 @@ typedef struct { } MACHINE_TYPE_INFO; GLOBAL_REMOVE_IF_UNREFERENCED MACHINE_TYPE_INFO mMachineTypeInfo[] = { - { EFI_IMAGE_MACHINE_IA32, L"IA32" }, - { EFI_IMAGE_MACHINE_IA64, L"IA64" }, - { EFI_IMAGE_MACHINE_X64, L"X64" }, - { EFI_IMAGE_MACHINE_ARMTHUMB_MIXED, L"ARM" }, - { EFI_IMAGE_MACHINE_AARCH64, L"AARCH64" }, - { EFI_IMAGE_MACHINE_RISCV64, L"RISCV64" }, - { EFI_IMAGE_MACHINE_LOONGARCH64, L"LOONGARCH64" }, + { EFI_IMAGE_MACHINE_IA32, L"IA32" }, + { EFI_IMAGE_MACHINE_IA64, L"IA64" }, + { EFI_IMAGE_MACHINE_X64, L"X64" }, + { EFI_IMAGE_MACHINE_AARCH64, L"AARCH64" }, + { EFI_IMAGE_MACHINE_RISCV64, L"RISCV64" }, + { EFI_IMAGE_MACHINE_LOONGARCH64, L"LOONGARCH64" }, }; UINT16 mDxeCoreImageMachineType = 0; diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf index f1990eac7760..ff2e47b5809e 100644 --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf @@ -45,7 +45,7 @@ X64/VirtualMemory.c X64/DxeLoadFunc.c -[Sources.LOONGARCH64,Sources.RISCV64,Sources.EBC,Sources.ARM,Sources.AARCH64] +[Sources.LOONGARCH64,Sources.RISCV64,Sources.EBC,Sources.AARCH64] DxeHandoff.c [Packages] @@ -108,7 +108,7 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbSize ## CONSUMES -[Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64] +[Pcd.IA32,Pcd.X64,Pcd.AARCH64] gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## SOMETIMES_CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ## SOMETIMES_CONSUMES diff --git a/MdeModulePkg/Library/BaseHobLibNull/BaseHobLibNull.inf b/MdeModulePkg/Library/BaseHobLibNull/BaseHobLibNull.inf index 5faf742c171c..70b93437b737 100644 --- a/MdeModulePkg/Library/BaseHobLibNull/BaseHobLibNull.inf +++ b/MdeModulePkg/Library/BaseHobLibNull/BaseHobLibNull.inf @@ -18,11 +18,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = HobLib - -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] BaseHobLibNull.c diff --git a/MdeModulePkg/Library/BaseMemoryAllocationLibNull/BaseMemoryAllocationLibNull.inf b/MdeModulePkg/Library/BaseMemoryAllocationLibNull/BaseMemoryAllocationLibNull.inf index 00a2b780932c..65392a032e38 100644 --- a/MdeModulePkg/Library/BaseMemoryAllocationLibNull/BaseMemoryAllocationLibNull.inf +++ b/MdeModulePkg/Library/BaseMemoryAllocationLibNull/BaseMemoryAllocationLibNull.inf @@ -18,11 +18,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = MemoryAllocationLib - -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] BaseMemoryAllocationLibNull.c diff --git a/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf b/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf index 39e66136c466..8d525fe73c02 100644 --- a/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf +++ b/MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf @@ -22,12 +22,6 @@ LIBRARY_CLASS = NULL CONSTRUCTOR = LzmaDecompressLibConstructor -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 AARCH64 ARM -# - [Sources] LzmaDecompress.c Sdk/C/LzFind.c diff --git a/MdeModulePkg/Logo/Logo.inf b/MdeModulePkg/Logo/Logo.inf index 294482ccdc37..5fb97e6d4543 100644 --- a/MdeModulePkg/Logo/Logo.inf +++ b/MdeModulePkg/Logo/Logo.inf @@ -19,12 +19,6 @@ MODULE_TYPE = USER_DEFINED VERSION_STRING = 1.0 -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 RISCV64 LOONGARCH64 -# - [Binaries] BIN|Logo.bmp|* diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 3067cf762e34..4e842dde8aa3 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -985,7 +985,7 @@ # @Prompt Enable process non-reset capsule image at runtime. gEfiMdeModulePkgTokenSpaceGuid.PcdSupportProcessCapsuleAtRuntime|FALSE|BOOLEAN|0x00010079 -[PcdsFeatureFlag.IA32, PcdsFeatureFlag.ARM, PcdsFeatureFlag.AARCH64, PcdsFeatureFlag.LOONGARCH64] +[PcdsFeatureFlag.IA32, PcdsFeatureFlag.AARCH64, PcdsFeatureFlag.LOONGARCH64] gEfiMdeModulePkgTokenSpaceGuid.PcdPciDegradeResourceForOptionRom|FALSE|BOOLEAN|0x0001003a [PcdsFeatureFlag.IA32, PcdsFeatureFlag.X64] diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc index 62ece76b18f6..e58595c4c5ad 100644 --- a/MdeModulePkg/MdeModulePkg.dsc +++ b/MdeModulePkg/MdeModulePkg.dsc @@ -16,7 +16,7 @@ PLATFORM_VERSION = 0.98 DSC_SPECIFICATION = 0x00010005 OUTPUT_DIRECTORY = Build/MdeModule - SUPPORTED_ARCHITECTURES = IA32|X64|EBC|ARM|AARCH64|RISCV64|LOONGARCH64 + SUPPORTED_ARCHITECTURES = IA32|X64|EBC|AARCH64|RISCV64|LOONGARCH64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT @@ -182,7 +182,7 @@ VarCheckHiiLibMmDependency|MdeModulePkg/Library/VarCheckHiiLib/VarCheckHiiLibMmDependency.inf VarCheckHiiLib|MdeModulePkg/Library/VarCheckHiiLib/VarCheckHiiLibStandaloneMm.inf -[LibraryClasses.ARM, LibraryClasses.AARCH64] +[LibraryClasses.AARCH64] LockBoxLib|MdeModulePkg/Library/LockBoxNullLib/LockBoxNullLib.inf ArmSmcLib|MdePkg/Library/ArmSmcLib/ArmSmcLib.inf ArmSvcLib|MdePkg/Library/ArmSvcLib/ArmSvcLib.inf @@ -460,7 +460,7 @@ MdeModulePkg/Universal/EbcDxe/EbcDebugger.inf MdeModulePkg/Universal/EbcDxe/EbcDebuggerConfig.inf -[Components.IA32, Components.X64, Components.ARM, Components.AARCH64] +[Components.IA32, Components.X64, Components.AARCH64] MdeModulePkg/Library/BrotliCustomDecompressLib/BrotliCustomDecompressLib.inf MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf @@ -533,7 +533,7 @@ [Components.X64] MdeModulePkg/Universal/CapsulePei/CapsuleX64.inf -[Components.ARM, Components.AARCH64] +[Components.AARCH64] MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.inf MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.inf MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.inf diff --git a/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf index 601eada17035..530f08155aed 100644 --- a/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf +++ b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf @@ -23,23 +23,23 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 RISCV64 LOONGARCH64 +# VALID_ARCHITECTURES = IA32 X64 EBC AARCH64 RISCV64 LOONGARCH64 # [Sources] CapsuleService.c CapsuleService.h -[Sources.Ia32, Sources.EBC, Sources.ARM, Sources.AARCH64, Sources.RISCV64, Sources.LOONGARCH64] +[Sources.Ia32, Sources.EBC, Sources.AARCH64, Sources.RISCV64, Sources.LOONGARCH64] SaveLongModeContext.c -[Sources.Ia32, Sources.X64, Sources.ARM, Sources.AARCH64, Sources.RISCV64, Sources.LOONGARCH64] +[Sources.Ia32, Sources.X64, Sources.AARCH64, Sources.RISCV64, Sources.LOONGARCH64] CapsuleCache.c [Sources.Ia32, Sources.X64, Sources.EBC, Sources.RISCV64, Sources.LOONGARCH64] CapsuleReset.c -[Sources.ARM, Sources.AARCH64] +[Sources.AARCH64] Arm/CapsuleReset.c [Sources.EBC] diff --git a/MdeModulePkg/Universal/CapsuleRuntimeDxe/SaveLongModeContext.c b/MdeModulePkg/Universal/CapsuleRuntimeDxe/SaveLongModeContext.c index 37b388902c7b..77355fd794ef 100644 --- a/MdeModulePkg/Universal/CapsuleRuntimeDxe/SaveLongModeContext.c +++ b/MdeModulePkg/Universal/CapsuleRuntimeDxe/SaveLongModeContext.c @@ -1,5 +1,5 @@ /** @file - Create the NULL function to pass build in IA32/IPF/ARM/EBC. + Create the NULL function to pass build in IA32/IPF/EBC. Copyright (c) 2011, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent diff --git a/MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf b/MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf index bc2e642cf962..83e3947f7fa4 100644 --- a/MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf +++ b/MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf @@ -17,12 +17,6 @@ ENTRY_POINT = RamDiskDxeEntryPoint UNLOAD_IMAGE = RamDiskDxeUnload -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] RamDiskDriver.c RamDiskImpl.c diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStandaloneMm.inf b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStandaloneMm.inf index 0ac6edf771ab..c23ac5c7d39c 100644 --- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStandaloneMm.inf +++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStandaloneMm.inf @@ -22,12 +22,6 @@ PI_SPECIFICATION_VERSION = 0x00010032 ENTRY_POINT = StandaloneMmFaultTolerantWriteInitialize -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] FtwMisc.c UpdateWorkingBlock.c diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/OnigurumaUefiPort.c b/MdeModulePkg/Universal/RegularExpressionDxe/OnigurumaUefiPort.c index 0d8984dde091..a628930cdd46 100644 --- a/MdeModulePkg/Universal/RegularExpressionDxe/OnigurumaUefiPort.c +++ b/MdeModulePkg/Universal/RegularExpressionDxe/OnigurumaUefiPort.c @@ -110,7 +110,6 @@ realloc ( return NULL; } -#if !defined (MDE_CPU_ARM) void * memcpy ( void *dest, @@ -121,8 +120,6 @@ memcpy ( return CopyMem (dest, src, (UINTN)count); } -#endif - void * memset ( void *dest, diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/OnigurumaUefiPort.h b/MdeModulePkg/Universal/RegularExpressionDxe/OnigurumaUefiPort.h index ee173d590618..2e338728b2f7 100644 --- a/MdeModulePkg/Universal/RegularExpressionDxe/OnigurumaUefiPort.h +++ b/MdeModulePkg/Universal/RegularExpressionDxe/OnigurumaUefiPort.h @@ -38,7 +38,7 @@ typedef INT64 ptrdiff_t; #define offsetof OFFSET_OF #endif -#if defined (MDE_CPU_IA32) || defined (MDE_CPU_ARM) || defined (MDE_CPU_EBC) +#if defined (MDE_CPU_IA32) || defined (MDE_CPU_EBC) #define SIZEOF_VOIDP 4 #else #define SIZEOF_VOIDP 8 @@ -108,7 +108,6 @@ realloc ( size_t size ); -#if !defined (MDE_CPU_ARM) void * memcpy ( void *dest, @@ -116,8 +115,6 @@ memcpy ( unsigned int count ); -#endif - void * memset ( void *dest, diff --git a/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf b/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf index c03915a6921f..5946f5758602 100644 --- a/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf +++ b/MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf @@ -18,12 +18,6 @@ ENTRY_POINT = SmbiosDriverEntryPoint -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 -# - [Sources] SmbiosDxe.h SmbiosDxe.c diff --git a/MdeModulePkg/Universal/SmbiosMeasurementDxe/SmbiosMeasurementDxe.inf b/MdeModulePkg/Universal/SmbiosMeasurementDxe/SmbiosMeasurementDxe.inf index 7537bfb519ae..f1374943d4f3 100644 --- a/MdeModulePkg/Universal/SmbiosMeasurementDxe/SmbiosMeasurementDxe.inf +++ b/MdeModulePkg/Universal/SmbiosMeasurementDxe/SmbiosMeasurementDxe.inf @@ -27,12 +27,6 @@ VERSION_STRING = 1.0 ENTRY_POINT = SmbiosMeasurementDriverEntryPoint -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 -# - [Sources] SmbiosMeasurementDxe.c diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.inf b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.inf index 2d651c3c3d50..ed3093700581 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.inf +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.inf @@ -34,13 +34,6 @@ PI_SPECIFICATION_VERSION = 0x00010032 ENTRY_POINT = VariableServiceInitialize -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - - [Sources] Reclaim.c Variable.c From 5f9e2eac7a8a92669e9e2705bec0593500a2d158 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 09:26:53 -0700 Subject: [PATCH 0543/1172] UnitTestFrameworkPkg: Remove ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from UnitTestFrameworkPkg. It also drops irrelevant VALID_ARCHITECTURES comments from infs that are not arch specific. Signed-off-by: Oliver Smith-Denny --- .../Library/UnitTestDebugAssertLib/UnitTestDebugAssertLib.inf | 4 ---- .../UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.inf | 4 ---- UnitTestFrameworkPkg/UnitTestFrameworkPkg.dsc | 2 +- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLib.inf b/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLib.inf index cbcf644d0abe..ec4d740c831f 100644 --- a/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLib.inf +++ b/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLib.inf @@ -15,10 +15,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = NULL -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] UnitTestDebugAssertLib.c diff --git a/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.inf b/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.inf index 7458df794866..96322d7e2fa9 100644 --- a/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.inf +++ b/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.inf @@ -15,10 +15,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = NULL -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] UnitTestDebugAssertLibHost.cpp diff --git a/UnitTestFrameworkPkg/UnitTestFrameworkPkg.dsc b/UnitTestFrameworkPkg/UnitTestFrameworkPkg.dsc index c2ec6db73e6c..0fe700fc626d 100644 --- a/UnitTestFrameworkPkg/UnitTestFrameworkPkg.dsc +++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkg.dsc @@ -15,7 +15,7 @@ PLATFORM_VERSION = 1.00 DSC_SPECIFICATION = 0x00010005 OUTPUT_DIRECTORY = Build/UnitTestFrameworkPkg - SUPPORTED_ARCHITECTURES = IA32|X64|ARM|AARCH64|RISCV64|LOONGARCH64 + SUPPORTED_ARCHITECTURES = IA32|X64|AARCH64|RISCV64|LOONGARCH64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT From 5984676364f21c2f10d313cbe8d82ec8d6943af0 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 09:27:49 -0700 Subject: [PATCH 0544/1172] MdePkg: Remove ARM32 Support from UnitTests edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from UnitTests and moves the AARCH64 files to the top level. Signed-off-by: Oliver Smith-Denny --- .../UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibDxe.inf | 2 +- .../UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibHost.inf | 2 +- .../UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibPei.inf | 2 +- .../UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibSmm.inf | 2 +- .../Library/BaseSafeIntLib/TestBaseSafeIntLibUefiShell.inf | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibDxe.inf b/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibDxe.inf index de67b04bd505..abe6833092df 100644 --- a/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibDxe.inf +++ b/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibDxe.inf @@ -25,7 +25,7 @@ TestBaseSafeIntLib.c TestBaseSafeIntLib.h -[Sources.Ia32, Sources.ARM] +[Sources.Ia32] SafeIntLibUintnIntnUnitTests32.c [Sources.X64, Sources.AARCH64] diff --git a/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibHost.inf b/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibHost.inf index 35c93fdeacb5..23cb448e4ada 100644 --- a/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibHost.inf +++ b/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibHost.inf @@ -24,7 +24,7 @@ TestBaseSafeIntLib.c TestBaseSafeIntLib.h -[Sources.Ia32, Sources.ARM] +[Sources.Ia32] SafeIntLibUintnIntnUnitTests32.c [Sources.X64, Sources.AARCH64] diff --git a/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibPei.inf b/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibPei.inf index c8ba4f44efe9..053c8e74e488 100644 --- a/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibPei.inf +++ b/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibPei.inf @@ -25,7 +25,7 @@ TestBaseSafeIntLib.c TestBaseSafeIntLib.h -[Sources.Ia32, Sources.ARM] +[Sources.Ia32] SafeIntLibUintnIntnUnitTests32.c [Sources.X64, Sources.AARCH64] diff --git a/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibSmm.inf b/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibSmm.inf index df7288501de2..908438ab57b1 100644 --- a/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibSmm.inf +++ b/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibSmm.inf @@ -25,7 +25,7 @@ TestBaseSafeIntLib.c TestBaseSafeIntLib.h -[Sources.Ia32, Sources.ARM] +[Sources.Ia32] SafeIntLibUintnIntnUnitTests32.c [Sources.X64, Sources.AARCH64] diff --git a/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibUefiShell.inf b/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibUefiShell.inf index 5a13c1c845a4..ae6fbd38d218 100644 --- a/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibUefiShell.inf +++ b/MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibUefiShell.inf @@ -25,7 +25,7 @@ TestBaseSafeIntLib.c TestBaseSafeIntLib.h -[Sources.Ia32, Sources.ARM] +[Sources.Ia32] SafeIntLibUintnIntnUnitTests32.c [Sources.X64, Sources.AARCH64] From abfe5b2869903d2577f1f391a7146cb681d511b7 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 09:28:21 -0700 Subject: [PATCH 0545/1172] MdePkg: Remove ARM32 Support from StackCheckLib edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from StackCheckLib and moves the AARCH64 files to the top level. Signed-off-by: Oliver Smith-Denny --- .../StackCheckLib/Arm/StackCookieInterrupt.S | 21 ---------------- .../Arm/StackCookieInterrupt.asm | 25 ------------------- MdePkg/Library/StackCheckLib/Readme.md | 12 +++------ .../Library/StackCheckLib/StackCheckLib.inf | 4 --- 4 files changed, 3 insertions(+), 59 deletions(-) delete mode 100644 MdePkg/Library/StackCheckLib/Arm/StackCookieInterrupt.S delete mode 100644 MdePkg/Library/StackCheckLib/Arm/StackCookieInterrupt.asm diff --git a/MdePkg/Library/StackCheckLib/Arm/StackCookieInterrupt.S b/MdePkg/Library/StackCheckLib/Arm/StackCookieInterrupt.S deleted file mode 100644 index 1f10bb8aea52..000000000000 --- a/MdePkg/Library/StackCheckLib/Arm/StackCookieInterrupt.S +++ /dev/null @@ -1,21 +0,0 @@ -//------------------------------------------------------------------------------ -// Arm/StackCookieInterrupt.S -// -// Copyright (c) Microsoft Corporation. -// SPDX-License-Identifier: BSD-2-Clause-Patent -//------------------------------------------------------------------------------ - - .text - -//------------------------------------------------------------------------------ -// Calls an interrupt using the vector specified by PcdStackCookieExceptionVector -// -// VOID -// TriggerStackCookieInterrupt ( -// VOID -// ); -//------------------------------------------------------------------------------ -.global ASM_PFX(TriggerStackCookieInterrupt) -ASM_PFX(TriggerStackCookieInterrupt): - swi FixedPcdGet8 (PcdStackCookieExceptionVector) - bx lr diff --git a/MdePkg/Library/StackCheckLib/Arm/StackCookieInterrupt.asm b/MdePkg/Library/StackCheckLib/Arm/StackCookieInterrupt.asm deleted file mode 100644 index f1b1e539438a..000000000000 --- a/MdePkg/Library/StackCheckLib/Arm/StackCookieInterrupt.asm +++ /dev/null @@ -1,25 +0,0 @@ -;------------------------------------------------------------------------------ -; Arm/StackCookieInterrupt.asm -; -; Copyright (c) Microsoft Corporation. -; SPDX-License-Identifier: BSD-2-Clause-Patent -;------------------------------------------------------------------------------ - - EXPORT TriggerStackCookieInterrupt - - AREA |.text|, CODE, READONLY - -;------------------------------------------------------------------------------ -; Calls an interrupt using the vector specified by PcdStackCookieExceptionVector -; -; VOID -; TriggerStackCookieInterrupt ( -; VOID -; ); -;------------------------------------------------------------------------------ -TriggerStackCookieInterrupt PROC - SWI FixedPcdGet8 (PcdStackCookieExceptionVector) - BX LR -TriggerStackCookieInterrupt ENDP - - END diff --git a/MdePkg/Library/StackCheckLib/Readme.md b/MdePkg/Library/StackCheckLib/Readme.md index fe16084bd33a..5569ad2e27e9 100644 --- a/MdePkg/Library/StackCheckLib/Readme.md +++ b/MdePkg/Library/StackCheckLib/Readme.md @@ -40,10 +40,9 @@ one of the dynamic stack cookie entry points when possible. `StackCheckLib` provides the stack cookie checking functionality per architecture and toolchain. The currently supported pairs are IA32{GCC,MSVC}, X64{GCC, MSVC}, -ARM{GCC, MSVC}, and AARCH64{GCC, MSVC}. `StackCheckLib` is agnostic as to -whether the stack cookie was updated during build time or run time; it simply -checks the cookie in the MSVC case and in both GCC and MSVC responds to stack -cookie checking failures. +and AARCH64{GCC, MSVC}. `StackCheckLib` is agnostic as to whether the stack cookie was +updated during build time or run time; it simply checks the cookie in the MSVC case and +in both GCC and MSVC responds to stack cookie checking failures. To add support for other architectures/toolchains, additional assembly files should be added to `StackCheckLib.inf` and scoped to that architecture/toolchain. @@ -102,11 +101,6 @@ PcdStackCookieExceptionVector. - On IA32 and X64 platforms, PcdStackCookieExceptionVector is used as an index into the Interrupt Descriptor Table. -- On ARM platforms, a software interrupt (`SWI`) is called with the value of -PcdStackCookieExceptionVector. The value can be retrieved by the handler by reading -bits [7:0] of the instruction opcode which will allow the handler to determine if the -interrupt was triggered by the stack cookie check. Reference: -[Arm A64 Instruction Set Architecture Version 2024-3](https://developer.arm.com/documentation/ddi0597/2024-03/Base-Instructions/SVC--Supervisor-Call-?lang=en) - On AARCH64 platforms, a supervisor call (`SVC`) is called with the value of PcdStackCookieExceptionVector. This value can similarly be retrieved by the handler to determine if the interrupt was triggered by the stack cookie check. Reference: diff --git a/MdePkg/Library/StackCheckLib/StackCheckLib.inf b/MdePkg/Library/StackCheckLib/StackCheckLib.inf index ece291ea0ba0..8ecb9b638ec8 100644 --- a/MdePkg/Library/StackCheckLib/StackCheckLib.inf +++ b/MdePkg/Library/StackCheckLib/StackCheckLib.inf @@ -26,10 +26,6 @@ [Sources.IA32, Sources.X64] IA32/StackCookieInterrupt.nasm -[Sources.ARM] - Arm/StackCookieInterrupt.S |GCC - Arm/StackCookieInterrupt.asm |MSFT - [Sources.AARCH64] AArch64/StackCookieInterrupt.S |GCC AArch64/StackCookieInterrupt.asm |MSFT From 7838ee347bc048f1c9f05fc8872e9c34bcf34d44 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 09:29:25 -0700 Subject: [PATCH 0546/1172] MdePkg: Remove ARM32 Support from Service Table Libs edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from the Service Table Libs. This also removes irrelevant VALID_ARCHITECTURES comments from infs that are not arch specific. Signed-off-by: Oliver Smith-Denny --- MdePkg/Library/DxeServicesLib/DxeServicesLib.inf | 4 ++-- MdePkg/Library/MmServicesTableLib/MmServicesTableLib.inf | 4 ---- .../StandaloneMmServicesTableLib.inf | 4 ---- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf index a93541847f76..b3800501178e 100644 --- a/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf +++ b/MdePkg/Library/DxeServicesLib/DxeServicesLib.inf @@ -22,13 +22,13 @@ LIBRARY_CLASS = DxeServicesLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER SMM_CORE UEFI_APPLICATION UEFI_DRIVER # -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 RISCV64 LOONGARCH64 +# VALID_ARCHITECTURES = IA32 X64 EBC AARCH64 RISCV64 LOONGARCH64 # [Sources] DxeServicesLib.c -[Sources.IA32, Sources.EBC, Sources.ARM, Sources.AARCH64, Sources.RISCV64, Sources.LOONGARCH64] +[Sources.IA32, Sources.EBC, Sources.AARCH64, Sources.RISCV64, Sources.LOONGARCH64] Allocate.c [Sources.X64] diff --git a/MdePkg/Library/MmServicesTableLib/MmServicesTableLib.inf b/MdePkg/Library/MmServicesTableLib/MmServicesTableLib.inf index 2cd5145a5e4c..3cbf5f4a94e8 100644 --- a/MdePkg/Library/MmServicesTableLib/MmServicesTableLib.inf +++ b/MdePkg/Library/MmServicesTableLib/MmServicesTableLib.inf @@ -20,10 +20,6 @@ PI_SPECIFICATION_VERSION = 0x00010032 CONSTRUCTOR = MmServicesTableLibConstructor -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] MmServicesTableLib.c diff --git a/MdePkg/Library/StandaloneMmServicesTableLib/StandaloneMmServicesTableLib.inf b/MdePkg/Library/StandaloneMmServicesTableLib/StandaloneMmServicesTableLib.inf index 5225d64d97f6..d19cd6ac7673 100644 --- a/MdePkg/Library/StandaloneMmServicesTableLib/StandaloneMmServicesTableLib.inf +++ b/MdePkg/Library/StandaloneMmServicesTableLib/StandaloneMmServicesTableLib.inf @@ -20,10 +20,6 @@ PI_SPECIFICATION_VERSION = 0x00010032 CONSTRUCTOR = StandaloneMmServicesTableLibConstructor -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 -# - [Sources] StandaloneMmServicesTableLib.c From f05cf0fd6610c468d3e9000f3cf78a871a4c42ce Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 22 Sep 2025 16:35:24 -0700 Subject: [PATCH 0547/1172] MdePkg: Remove ARM32 Support from ArmS*cLib edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from ArmS*cLib. Signed-off-by: Oliver Smith-Denny --- MdePkg/Include/IndustryStandard/ArmFfaSvc.h | 25 +----------- MdePkg/Include/IndustryStandard/ArmStdSmc.h | 5 --- MdePkg/Library/ArmSmcLib/Arm/ArmSmc.S | 44 --------------------- MdePkg/Library/ArmSmcLib/ArmSmcLib.inf | 3 -- MdePkg/Library/ArmSvcLib/Arm/ArmSvc.S | 36 ----------------- MdePkg/Library/ArmSvcLib/ArmSvcLib.inf | 3 -- 6 files changed, 1 insertion(+), 115 deletions(-) delete mode 100644 MdePkg/Library/ArmSmcLib/Arm/ArmSmc.S delete mode 100644 MdePkg/Library/ArmSvcLib/Arm/ArmSvc.S diff --git a/MdePkg/Include/IndustryStandard/ArmFfaSvc.h b/MdePkg/Include/IndustryStandard/ArmFfaSvc.h index f2b92f8d0fc7..e449353e4beb 100644 --- a/MdePkg/Include/IndustryStandard/ArmFfaSvc.h +++ b/MdePkg/Include/IndustryStandard/ArmFfaSvc.h @@ -78,9 +78,7 @@ #define ARM_FID_FFA_MEM_PERM_SET_AARCH32 0x84000089 #define ARM_FID_FFA_MEM_PERM_SET_AARCH64 0xC4000089 -/* Generic IDs when using AArch32 or AArch64 execution state */ -#if defined (MDE_CPU_AARCH64) - +/* Generic IDs for the AArch64 execution state */ #define ARM_FID_FFA_RXTX_MAP ARM_FID_FFA_RXTX_MAP_AARCH64 #define ARM_FID_FFA_CONSOLE_LOG ARM_FID_FFA_CONSOLE_LOG_AARCH64 @@ -96,27 +94,6 @@ #define ARM_FID_FFA_MEM_PERM_GET ARM_FID_FFA_MEM_PERM_GET_AARCH64 #define ARM_FID_FFA_MEM_PERM_SET ARM_FID_FFA_MEM_PERM_SET_AARCH64 -#elif defined (MDE_CPU_ARM) - -#define ARM_FID_FFA_RXTX_MAP ARM_FID_FFA_RXTX_MAP_AARCH32 -#define ARM_FID_FFA_CONSOLE_LOG ARM_FID_FFA_CONSOLE_LOG_AARCH32 - -#define ARM_FID_FFA_MSG_SEND_DIRECT_REQ ARM_FID_FFA_MSG_SEND_DIRECT_REQ_AARCH32 -#define ARM_FID_FFA_MSG_SEND_DIRECT_RESP ARM_FID_FFA_MSG_SEND_DIRECT_RESP_AARCH32 - -#define ARM_FID_FFA_NOTIFICATION_INFO_GET ARM_FID_FFA_NOTIFICATION_INFO_GET_AARCH32 - -#define ARM_FID_FFA_MEM_DONATE ARM_FID_FFA_MEM_DONATE_AARCH32 -#define ARM_FID_FFA_MEM_LEND ARM_FID_FFA_MEM_LEND_AARCH32 -#define ARM_FID_FFA_MEM_SHARE ARM_FID_FFA_MEM_SHARE_AARCH32 -#define ARM_FID_FFA_MEM_RETRIEVE_REQ ARM_FID_FFA_MEM_RETRIEVE_REQ_AARCH32 -#define ARM_FID_FFA_MEM_PERM_GET ARM_FID_FFA_MEM_PERM_GET_AARCH32 -#define ARM_FID_FFA_MEM_PERM_SET ARM_FID_FFA_MEM_PERM_SET_AARCH32 - -#else - #error "Invalid architecture." -#endif - #define ARM_FFA_MAJOR_VERSION 1 #define ARM_FFA_MINOR_VERSION 2 #define ARM_FFA_MAJOR_VERSION_MASK 0x7FFF diff --git a/MdePkg/Include/IndustryStandard/ArmStdSmc.h b/MdePkg/Include/IndustryStandard/ArmStdSmc.h index f3d78d8e789b..76df804af7b1 100644 --- a/MdePkg/Include/IndustryStandard/ArmStdSmc.h +++ b/MdePkg/Include/IndustryStandard/ArmStdSmc.h @@ -57,12 +57,7 @@ #define ARM_SMC_ID_MM_COMMUNICATE_AARCH64 0xC4000041 /* Generic ID when using AArch32 or AArch64 execution state */ -#ifdef MDE_CPU_AARCH64 #define ARM_SMC_ID_MM_COMMUNICATE ARM_SMC_ID_MM_COMMUNICATE_AARCH64 -#endif -#ifdef MDE_CPU_ARM -#define ARM_SMC_ID_MM_COMMUNICATE ARM_SMC_ID_MM_COMMUNICATE_AARCH32 -#endif /* MM return error codes */ #define ARM_SMC_MM_RET_SUCCESS 0 diff --git a/MdePkg/Library/ArmSmcLib/Arm/ArmSmc.S b/MdePkg/Library/ArmSmcLib/Arm/ArmSmc.S deleted file mode 100644 index 4b3d0db69715..000000000000 --- a/MdePkg/Library/ArmSmcLib/Arm/ArmSmc.S +++ /dev/null @@ -1,44 +0,0 @@ -// -// Copyright (c) 2012-2014, ARM Limited. All rights reserved. -// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -// - -#include - -.arch_extension sec - -ASM_FUNC(ArmCallSmc) - push {r4-r8} - // r0 will be popped just after the SMC call - push {r0} - - // Load the SMC arguments values into the appropriate registers - ldr r7, [r0, #28] - ldr r6, [r0, #24] - ldr r5, [r0, #20] - ldr r4, [r0, #16] - ldr r3, [r0, #12] - ldr r2, [r0, #8] - ldr r1, [r0, #4] - ldr r0, [r0, #0] - - smc #0 - - // Pop the ARM_SMC_ARGS structure address from the stack into r8 - pop {r8} - - // Load the SMC returned values into the appropriate registers - // A SMC call can return up to 4 values - we do not need to store back r4-r7. - str r3, [r8, #12] - str r2, [r8, #8] - str r1, [r8, #4] - str r0, [r8, #0] - - mov r0, r8 - - // Restore the registers r4-r8 - pop {r4-r8} - - bx lr diff --git a/MdePkg/Library/ArmSmcLib/ArmSmcLib.inf b/MdePkg/Library/ArmSmcLib/ArmSmcLib.inf index 4ae9740a19b7..85a4ab94b5a9 100644 --- a/MdePkg/Library/ArmSmcLib/ArmSmcLib.inf +++ b/MdePkg/Library/ArmSmcLib/ArmSmcLib.inf @@ -13,9 +13,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = ArmSmcLib -[Sources.ARM] - Arm/ArmSmc.S | GCC - [Sources.AARCH64] AArch64/ArmSmc.S diff --git a/MdePkg/Library/ArmSvcLib/Arm/ArmSvc.S b/MdePkg/Library/ArmSvcLib/Arm/ArmSvc.S deleted file mode 100644 index e81eb88f2e87..000000000000 --- a/MdePkg/Library/ArmSvcLib/Arm/ArmSvc.S +++ /dev/null @@ -1,36 +0,0 @@ -// -// Copyright (c) 2016 - 2020, ARM Limited. All rights reserved. -// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -// - -.text -.align 3 - -GCC_ASM_EXPORT(ArmCallSvc) - -ASM_PFX(ArmCallSvc): - // r0 will be popped just after the SVC call - push {r0, r4-r8} - - // Load the SVC arguments values into the appropriate registers - ldm r0, {r0-r7} - - svc #0 - // Prevent speculative execution beyond svc instruction - dsb nsh - isb - - // Load the ARM_SVC_ARGS structure address from the stack into r8 - ldr r8, [sp] - - // Load the SVC returned values into the appropriate registers - // A SVC call can return up to 4 values - we do not need to store back r4-r7. - stm r8, {r0-r3} - - mov r0, r8 - - // Restore the registers r4-r8 - pop {r1, r4-r8} - bx lr diff --git a/MdePkg/Library/ArmSvcLib/ArmSvcLib.inf b/MdePkg/Library/ArmSvcLib/ArmSvcLib.inf index 459b90c333b0..4dff96ae0638 100644 --- a/MdePkg/Library/ArmSvcLib/ArmSvcLib.inf +++ b/MdePkg/Library/ArmSvcLib/ArmSvcLib.inf @@ -13,9 +13,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = ArmSvcLib -[Sources.ARM] - Arm/ArmSvc.S | GCC - [Sources.AARCH64] AArch64/ArmSvc.S From 0dc21d1f75fec893707abd7efeab118219f0f892 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 09:34:02 -0700 Subject: [PATCH 0548/1172] MdePkg: Remove ARM32 Support from BaseMemoryLibOptDxe edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from BaseMemoryLibOptDxe. Signed-off-by: Oliver Smith-Denny --- .../{Arm => AArch64}/MemLibGuid.c | 2 +- .../{Arm => AArch64}/ScanMemGeneric.c | 0 .../BaseMemoryLibOptDxe/Arm/CompareGuid.S | 44 ----- .../BaseMemoryLibOptDxe/Arm/CompareGuid.asm | 48 ----- .../BaseMemoryLibOptDxe/Arm/CompareMem.S | 117 ------------ .../BaseMemoryLibOptDxe/Arm/CompareMem.asm | 118 ------------ .../Library/BaseMemoryLibOptDxe/Arm/CopyMem.S | 170 ------------------ .../BaseMemoryLibOptDxe/Arm/CopyMem.asm | 141 --------------- .../Library/BaseMemoryLibOptDxe/Arm/ScanMem.S | 122 ------------- .../BaseMemoryLibOptDxe/Arm/ScanMem.asm | 121 ------------- .../Library/BaseMemoryLibOptDxe/Arm/SetMem.S | 88 --------- .../BaseMemoryLibOptDxe/Arm/SetMem.asm | 90 ---------- .../BaseMemoryLibOptDxe.inf | 17 +- 13 files changed, 5 insertions(+), 1073 deletions(-) rename MdePkg/Library/BaseMemoryLibOptDxe/{Arm => AArch64}/MemLibGuid.c (95%) rename MdePkg/Library/BaseMemoryLibOptDxe/{Arm => AArch64}/ScanMemGeneric.c (100%) delete mode 100644 MdePkg/Library/BaseMemoryLibOptDxe/Arm/CompareGuid.S delete mode 100644 MdePkg/Library/BaseMemoryLibOptDxe/Arm/CompareGuid.asm delete mode 100644 MdePkg/Library/BaseMemoryLibOptDxe/Arm/CompareMem.S delete mode 100644 MdePkg/Library/BaseMemoryLibOptDxe/Arm/CompareMem.asm delete mode 100644 MdePkg/Library/BaseMemoryLibOptDxe/Arm/CopyMem.S delete mode 100644 MdePkg/Library/BaseMemoryLibOptDxe/Arm/CopyMem.asm delete mode 100644 MdePkg/Library/BaseMemoryLibOptDxe/Arm/ScanMem.S delete mode 100644 MdePkg/Library/BaseMemoryLibOptDxe/Arm/ScanMem.asm delete mode 100644 MdePkg/Library/BaseMemoryLibOptDxe/Arm/SetMem.S delete mode 100644 MdePkg/Library/BaseMemoryLibOptDxe/Arm/SetMem.asm diff --git a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/MemLibGuid.c b/MdePkg/Library/BaseMemoryLibOptDxe/AArch64/MemLibGuid.c similarity index 95% rename from MdePkg/Library/BaseMemoryLibOptDxe/Arm/MemLibGuid.c rename to MdePkg/Library/BaseMemoryLibOptDxe/AArch64/MemLibGuid.c index 32d30cb7cecc..8e9d9211d515 100644 --- a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/MemLibGuid.c +++ b/MdePkg/Library/BaseMemoryLibOptDxe/AArch64/MemLibGuid.c @@ -1,5 +1,5 @@ /** @file - Implementation of GUID functions for ARM and AARCH64 + Implementation of GUID functions for AARCH64 Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
Copyright (c) 2016, Linaro Ltd. All rights reserved.
diff --git a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/ScanMemGeneric.c b/MdePkg/Library/BaseMemoryLibOptDxe/AArch64/ScanMemGeneric.c similarity index 100% rename from MdePkg/Library/BaseMemoryLibOptDxe/Arm/ScanMemGeneric.c rename to MdePkg/Library/BaseMemoryLibOptDxe/AArch64/ScanMemGeneric.c diff --git a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/CompareGuid.S b/MdePkg/Library/BaseMemoryLibOptDxe/Arm/CompareGuid.S deleted file mode 100644 index 7de70ae34c23..000000000000 --- a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/CompareGuid.S +++ /dev/null @@ -1,44 +0,0 @@ -// -// Copyright (c) 2016, Linaro Limited -// All rights reserved. -// SPDX-License-Identifier: BSD-2-Clause-Patent -// - - .text - .thumb - .syntax unified - .align 5 - .type ASM_PFX(InternalMemCompareGuid), %function -ASM_GLOBAL ASM_PFX(InternalMemCompareGuid) -ASM_PFX(InternalMemCompareGuid): - push {r4, lr} - ldr r2, [r0] - ldr r3, [r0, #4] - ldr r4, [r0, #8] - ldr r0, [r0, #12] - cbz r1, 1f - ldr ip, [r1] - ldr lr, [r1, #4] - cmp r2, ip - it eq - cmpeq.n r3, lr - beq 0f - movs r0, #0 - pop {r4, pc} - -0: ldr r2, [r1, #8] - ldr r3, [r1, #12] - cmp r4, r2 - it eq - cmpeq.n r0, r3 - bne 2f - movs r0, #1 - pop {r4, pc} - -1: orrs r2, r2, r3 - orrs r4, r4, r0 - movs r0, #1 - orrs r2, r2, r4 -2: it ne - movne.n r0, #0 - pop {r4, pc} diff --git a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/CompareGuid.asm b/MdePkg/Library/BaseMemoryLibOptDxe/Arm/CompareGuid.asm deleted file mode 100644 index 3316b8dc6d6d..000000000000 --- a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/CompareGuid.asm +++ /dev/null @@ -1,48 +0,0 @@ -; -; Copyright (c) 2016, Linaro Limited -; All rights reserved. -; SPDX-License-Identifier: BSD-2-Clause-Patent -; - - EXPORT InternalMemCompareGuid - THUMB - AREA CompareGuid, CODE, READONLY, CODEALIGN, ALIGN=5 - -InternalMemCompareGuid - push {r4, lr} - ldr r2, [r0] - ldr r3, [r0, #4] - ldr r4, [r0, #8] - ldr r0, [r0, #12] - cbz r1, L1 - ldr ip, [r1] - ldr lr, [r1, #4] - cmp r2, ip - it eq - cmpeq r3, lr - beq L0 - movs r0, #0 - pop {r4, pc} - -L0 - ldr r2, [r1, #8] - ldr r3, [r1, #12] - cmp r4, r2 - it eq - cmpeq r0, r3 - bne L2 - movs r0, #1 - pop {r4, pc} - -L1 - orrs r2, r2, r3 - orrs r4, r4, r0 - movs r0, #1 - orrs r2, r2, r4 - -L2 - it ne - movne r0, #0 - pop {r4, pc} - - END diff --git a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/CompareMem.S b/MdePkg/Library/BaseMemoryLibOptDxe/Arm/CompareMem.S deleted file mode 100644 index d32816c7b099..000000000000 --- a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/CompareMem.S +++ /dev/null @@ -1,117 +0,0 @@ -// -// Copyright (c) 2013 - 2016, Linaro Limited -// All rights reserved. -// SPDX-License-Identifier: BSD-2-Clause-Patent -// - -// Parameters and result. -#define src1 r0 -#define src2 r1 -#define limit r2 -#define result r0 - -// Internal variables. -#define data1 r3 -#define data2 r4 -#define limit_wd r5 -#define diff r6 -#define tmp1 r7 -#define tmp2 r12 -#define pos r8 -#define mask r14 - - .text - .thumb - .syntax unified - .align 5 - .type ASM_PFX(InternalMemCompareMem), %function -ASM_GLOBAL ASM_PFX(InternalMemCompareMem) -ASM_PFX(InternalMemCompareMem): - push {r4-r8, lr} - eor tmp1, src1, src2 - tst tmp1, #3 - bne .Lmisaligned4 - ands tmp1, src1, #3 - bne .Lmutual_align - add limit_wd, limit, #3 - nop.w - lsr limit_wd, limit_wd, #2 - - // Start of performance-critical section -- one 32B cache line. -.Lloop_aligned: - ldr data1, [src1], #4 - ldr data2, [src2], #4 -.Lstart_realigned: - subs limit_wd, limit_wd, #1 - eor diff, data1, data2 // Non-zero if differences found. - cbnz diff, 0f - bne .Lloop_aligned - // End of performance-critical section -- one 32B cache line. - - // Not reached the limit, must have found a diff. -0: cbnz limit_wd, .Lnot_limit - - // Limit % 4 == 0 => all bytes significant. - ands limit, limit, #3 - beq .Lnot_limit - - lsl limit, limit, #3 // Bits -> bytes. - mov mask, #~0 - lsl mask, mask, limit - bic data1, data1, mask - bic data2, data2, mask - - orr diff, diff, mask - -.Lnot_limit: - rev diff, diff - rev data1, data1 - rev data2, data2 - - // The MS-non-zero bit of DIFF marks either the first bit - // that is different, or the end of the significant data. - // Shifting left now will bring the critical information into the - // top bits. - clz pos, diff - lsl data1, data1, pos - lsl data2, data2, pos - - // But we need to zero-extend (char is unsigned) the value and then - // perform a signed 32-bit subtraction. - lsr data1, data1, #28 - sub result, data1, data2, lsr #28 - pop {r4-r8, pc} - -.Lmutual_align: - // Sources are mutually aligned, but are not currently at an - // alignment boundary. Round down the addresses and then mask off - // the bytes that precede the start point. - bic src1, src1, #3 - bic src2, src2, #3 - add limit, limit, tmp1 // Adjust the limit for the extra. - lsl tmp1, tmp1, #3 // Bytes beyond alignment -> bits. - ldr data1, [src1], #4 - rsb tmp1, tmp1, #32 // Bits to alignment -32. - ldr data2, [src2], #4 - mov tmp2, #~0 - - // Little-endian. Early bytes are at LSB. - lsr tmp2, tmp2, tmp1 // Shift (tmp1 & 31). - add limit_wd, limit, #3 - orr data1, data1, tmp2 - orr data2, data2, tmp2 - lsr limit_wd, limit_wd, #2 - b .Lstart_realigned - -.Lmisaligned4: - sub limit, limit, #1 -1: - // Perhaps we can do better than this. - ldrb data1, [src1], #1 - ldrb data2, [src2], #1 - subs limit, limit, #1 - it cs - cmpcs.n data1, data2 - beq 1b - sub result, data1, data2 - pop {r4-r8, pc} diff --git a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/CompareMem.asm b/MdePkg/Library/BaseMemoryLibOptDxe/Arm/CompareMem.asm deleted file mode 100644 index 27a1efc8caa3..000000000000 --- a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/CompareMem.asm +++ /dev/null @@ -1,118 +0,0 @@ -; -; Copyright (c) 2013 - 2016, Linaro Limited -; All rights reserved. -; SPDX-License-Identifier: BSD-2-Clause-Patent -; - -; Parameters and result. -#define src1 r0 -#define src2 r1 -#define limit r2 -#define result r0 - -; Internal variables. -#define data1 r3 -#define data2 r4 -#define limit_wd r5 -#define diff r6 -#define tmp1 r7 -#define tmp2 r12 -#define pos r8 -#define mask r14 - - EXPORT InternalMemCompareMem - THUMB - AREA CompareMem, CODE, READONLY - -InternalMemCompareMem - push {r4-r8, lr} - eor tmp1, src1, src2 - tst tmp1, #3 - bne Lmisaligned4 - ands tmp1, src1, #3 - bne Lmutual_align - add limit_wd, limit, #3 - nop.w - lsr limit_wd, limit_wd, #2 - - ; Start of performance-critical section -- one 32B cache line. -Lloop_aligned - ldr data1, [src1], #4 - ldr data2, [src2], #4 -Lstart_realigned - subs limit_wd, limit_wd, #1 - eor diff, data1, data2 ; Non-zero if differences found. - cbnz diff, L0 - bne Lloop_aligned - ; End of performance-critical section -- one 32B cache line. - - ; Not reached the limit, must have found a diff. -L0 - cbnz limit_wd, Lnot_limit - - // Limit % 4 == 0 => all bytes significant. - ands limit, limit, #3 - beq Lnot_limit - - lsl limit, limit, #3 // Bits -> bytes. - mov mask, #~0 - lsl mask, mask, limit - bic data1, data1, mask - bic data2, data2, mask - - orr diff, diff, mask - -Lnot_limit - rev diff, diff - rev data1, data1 - rev data2, data2 - - ; The MS-non-zero bit of DIFF marks either the first bit - ; that is different, or the end of the significant data. - ; Shifting left now will bring the critical information into the - ; top bits. - clz pos, diff - lsl data1, data1, pos - lsl data2, data2, pos - - ; But we need to zero-extend (char is unsigned) the value and then - ; perform a signed 32-bit subtraction. - lsr data1, data1, #28 - sub result, data1, data2, lsr #28 - pop {r4-r8, pc} - -Lmutual_align - ; Sources are mutually aligned, but are not currently at an - ; alignment boundary. Round down the addresses and then mask off - ; the bytes that precede the start point. - bic src1, src1, #3 - bic src2, src2, #3 - add limit, limit, tmp1 ; Adjust the limit for the extra. - lsl tmp1, tmp1, #2 ; Bytes beyond alignment -> bits. - ldr data1, [src1], #4 - neg tmp1, tmp1 ; Bits to alignment -32. - ldr data2, [src2], #4 - mov tmp2, #~0 - - ; Little-endian. Early bytes are at LSB. - lsr tmp2, tmp2, tmp1 ; Shift (tmp1 & 31). - add limit_wd, limit, #3 - orr data1, data1, tmp2 - orr data2, data2, tmp2 - lsr limit_wd, limit_wd, #2 - b Lstart_realigned - -Lmisaligned4 - sub limit, limit, #1 -L1 - // Perhaps we can do better than this. - ldrb data1, [src1], #1 - ldrb data2, [src2], #1 - subs limit, limit, #1 - it cs - cmpcs data1, data2 - beq L1 - sub result, data1, data2 - pop {r4-r8, pc} - - END diff --git a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/CopyMem.S b/MdePkg/Library/BaseMemoryLibOptDxe/Arm/CopyMem.S deleted file mode 100644 index c36af196a097..000000000000 --- a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/CopyMem.S +++ /dev/null @@ -1,170 +0,0 @@ -#------------------------------------------------------------------------------ -# -# CopyMem() worker for ARM -# -# This file started out as C code that did 64 bit moves if the buffer was -# 32-bit aligned, else it does a byte copy. It also does a byte copy for -# any trailing bytes. It was updated to do 32-byte copies using stm/ldm. -# -# Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.
-# Copyright (c) 2016, Linaro Ltd. All rights reserved.
-# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - - .text - .thumb - .syntax unified - -/** - Copy Length bytes from Source to Destination. Overlap is OK. - - This implementation - - @param Destination Target of copy - @param Source Place to copy from - @param Length Number of bytes to copy - - @return Destination - - -VOID * -EFIAPI -InternalMemCopyMem ( - OUT VOID *DestinationBuffer, - IN CONST VOID *SourceBuffer, - IN UINTN Length - ) -**/ - .type ASM_PFX(InternalMemCopyMem), %function -ASM_GLOBAL ASM_PFX(InternalMemCopyMem) -ASM_PFX(InternalMemCopyMem): - push {r4-r11, lr} - // Save the input parameters in extra registers (r11 = destination, r14 = source, r12 = length) - mov r11, r0 - mov r10, r0 - mov r12, r2 - mov r14, r1 - - cmp r11, r1 - // If (dest < source) - bcc memcopy_check_optim_default - - // If (source + length < dest) - rsb r3, r1, r11 - cmp r12, r3 - bcc memcopy_check_optim_default - b memcopy_check_optim_overlap - -memcopy_check_optim_default: - // Check if we can use an optimized path ((length >= 32) && destination word-aligned && source word-aligned) for the memcopy (optimized path if r0 == 1) - tst r0, #0xF - it ne - movne.n r0, #0 - bne memcopy_default - tst r1, #0xF - it ne - movne.n r3, #0 - it eq - moveq.n r3, #1 - cmp r2, #31 - it ls - movls.n r0, #0 - bls memcopy_default - and r0, r3, #1 - b memcopy_default - -memcopy_check_optim_overlap: - // r10 = dest_end, r14 = source_end - add r10, r11, r12 - add r14, r12, r1 - - // Are we in the optimized case ((length >= 32) && dest_end word-aligned && source_end word-aligned) - cmp r2, #31 - it ls - movls.n r0, #0 - it hi - movhi.n r0, #1 - tst r10, #0xF - it ne - movne.n r0, #0 - tst r14, #0xF - it ne - movne.n r0, #0 - b memcopy_overlapped - -memcopy_overlapped_non_optim: - // We read 1 byte from the end of the source buffer - sub r3, r14, #1 - sub r12, r12, #1 - ldrb r3, [r3, #0] - sub r2, r10, #1 - cmp r12, #0 - // We write 1 byte at the end of the dest buffer - sub r10, r10, #1 - sub r14, r14, #1 - strb r3, [r2, #0] - bne memcopy_overlapped_non_optim - b memcopy_end - -// r10 = dest_end, r14 = source_end -memcopy_overlapped: - // Are we in the optimized case ? - cmp r0, #0 - beq memcopy_overlapped_non_optim - - // Optimized Overlapped - Read 32 bytes - sub r14, r14, #32 - sub r12, r12, #32 - cmp r12, #31 - ldmia r14, {r2-r9} - - // If length is less than 32 then disable optim - it ls - movls.n r0, #0 - - cmp r12, #0 - - // Optimized Overlapped - Write 32 bytes - sub r10, r10, #32 - stmia r10, {r2-r9} - - // while (length != 0) - bne memcopy_overlapped - b memcopy_end - -memcopy_default_non_optim: - // Byte copy - ldrb r3, [r14], #1 - sub r12, r12, #1 - strb r3, [r10], #1 - -memcopy_default: - cmp r12, #0 - beq memcopy_end - -// r10 = dest, r14 = source -memcopy_default_loop: - cmp r0, #0 - beq memcopy_default_non_optim - - // Optimized memcopy - Read 32 Bytes - sub r12, r12, #32 - cmp r12, #31 - ldmia r14!, {r2-r9} - - // If length is less than 32 then disable optim - it ls - movls.n r0, #0 - - cmp r12, #0 - - // Optimized memcopy - Write 32 Bytes - stmia r10!, {r2-r9} - - // while (length != 0) - bne memcopy_default_loop - -memcopy_end: - mov r0, r11 - pop {r4-r11, pc} diff --git a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/CopyMem.asm b/MdePkg/Library/BaseMemoryLibOptDxe/Arm/CopyMem.asm deleted file mode 100644 index 3ebcfd5b4cfd..000000000000 --- a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/CopyMem.asm +++ /dev/null @@ -1,141 +0,0 @@ -;------------------------------------------------------------------------------ -; -; CopyMem() worker for ARM -; -; This file started out as C code that did 64 bit moves if the buffer was -; 32-bit aligned, else it does a byte copy. It also does a byte copy for -; any trailing bytes. It was updated to do 32-byte copies using stm/ldm. -; -; Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.
-; Copyright (c) 2016, Linaro Ltd. All rights reserved.
-; SPDX-License-Identifier: BSD-2-Clause-Patent -; -;------------------------------------------------------------------------------ - - EXPORT InternalMemCopyMem - AREA SetMem, CODE, READONLY - THUMB - -InternalMemCopyMem - stmfd sp!, {r4-r11, lr} - // Save the input parameters in extra registers (r11 = destination, r14 = source, r12 = length) - mov r11, r0 - mov r10, r0 - mov r12, r2 - mov r14, r1 - -memcopy_check_overlapped - cmp r11, r1 - // If (dest < source) - bcc memcopy_check_optim_default - - // If (source + length < dest) - rsb r3, r1, r11 - cmp r12, r3 - bcc memcopy_check_optim_default - b memcopy_check_optim_overlap - -memcopy_check_optim_default - // Check if we can use an optimized path ((length >= 32) && destination word-aligned && source word-aligned) for the memcopy (optimized path if r0 == 1) - tst r0, #0xF - movne r0, #0 - bne memcopy_default - tst r1, #0xF - movne r3, #0 - moveq r3, #1 - cmp r2, #31 - movls r0, #0 - andhi r0, r3, #1 - b memcopy_default - -memcopy_check_optim_overlap - // r10 = dest_end, r14 = source_end - add r10, r11, r12 - add r14, r12, r1 - - // Are we in the optimized case ((length >= 32) && dest_end word-aligned && source_end word-aligned) - cmp r2, #31 - movls r0, #0 - movhi r0, #1 - tst r10, #0xF - movne r0, #0 - tst r14, #0xF - movne r0, #0 - b memcopy_overlapped - -memcopy_overlapped_non_optim - // We read 1 byte from the end of the source buffer - sub r3, r14, #1 - sub r12, r12, #1 - ldrb r3, [r3, #0] - sub r2, r10, #1 - cmp r12, #0 - // We write 1 byte at the end of the dest buffer - sub r10, r10, #1 - sub r14, r14, #1 - strb r3, [r2, #0] - bne memcopy_overlapped_non_optim - b memcopy_end - -// r10 = dest_end, r14 = source_end -memcopy_overlapped - // Are we in the optimized case ? - cmp r0, #0 - beq memcopy_overlapped_non_optim - - // Optimized Overlapped - Read 32 bytes - sub r14, r14, #32 - sub r12, r12, #32 - cmp r12, #31 - ldmia r14, {r2-r9} - - // If length is less than 32 then disable optim - movls r0, #0 - - cmp r12, #0 - - // Optimized Overlapped - Write 32 bytes - sub r10, r10, #32 - stmia r10, {r2-r9} - - // while (length != 0) - bne memcopy_overlapped - b memcopy_end - -memcopy_default_non_optim - // Byte copy - ldrb r3, [r14], #1 - sub r12, r12, #1 - strb r3, [r10], #1 - -memcopy_default - cmp r12, #0 - beq memcopy_end - -// r10 = dest, r14 = source -memcopy_default_loop - cmp r0, #0 - beq memcopy_default_non_optim - - // Optimized memcopy - Read 32 Bytes - sub r12, r12, #32 - cmp r12, #31 - ldmia r14!, {r2-r9} - - // If length is less than 32 then disable optim - movls r0, #0 - - cmp r12, #0 - - // Optimized memcopy - Write 32 Bytes - stmia r10!, {r2-r9} - - // while (length != 0) - bne memcopy_default_loop - -memcopy_end - mov r0, r11 - ldmfd sp!, {r4-r11, pc} - - END - diff --git a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/ScanMem.S b/MdePkg/Library/BaseMemoryLibOptDxe/Arm/ScanMem.S deleted file mode 100644 index c0b2dee5d8d0..000000000000 --- a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/ScanMem.S +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright (c) 2010-2011, Linaro Limited -// All rights reserved. -// SPDX-License-Identifier: BSD-2-Clause-Patent -// - -// -// Written by Dave Gilbert -// -// This memchr routine is optimised on a Cortex-A9 and should work on -// all ARMv7 processors. It has a fast past for short sizes, and has -// an optimised path for large data sets; the worst case is finding the -// match early in a large data set. -// - - -// 2011-02-07 david.gilbert@linaro.org -// Extracted from local git a5b438d861 -// 2011-07-14 david.gilbert@linaro.org -// Import endianness fix from local git ea786f1b -// 2011-12-07 david.gilbert@linaro.org -// Removed unneeded cbz from align loop - -// this lets us check a flag in a 00/ff byte easily in either endianness -#define CHARTSTMASK(c) 1<<(c*8) - - .text - .thumb - .syntax unified - - .type ASM_PFX(InternalMemScanMem8), %function -ASM_GLOBAL ASM_PFX(InternalMemScanMem8) -ASM_PFX(InternalMemScanMem8): - // r0 = start of memory to scan - // r1 = length - // r2 = character to look for - // returns r0 = pointer to character or NULL if not found - uxtb r2, r2 // Don't think we can trust the caller to actually pass a char - - cmp r1, #16 // If it's short don't bother with anything clever - blt 20f - - tst r0, #7 // If it's already aligned skip the next bit - beq 10f - - // Work up to an aligned point -5: - ldrb r3, [r0],#1 - subs r1, r1, #1 - cmp r3, r2 - beq 50f // If it matches exit found - tst r0, #7 - bne 5b // If not aligned yet then do next byte - -10: - // At this point, we are aligned, we know we have at least 8 bytes to work with - push {r4-r7} - orr r2, r2, r2, lsl #8 // expand the match word across to all bytes - orr r2, r2, r2, lsl #16 - bic r4, r1, #7 // Number of double words to work with - mvns r7, #0 // all F's - movs r3, #0 - -15: - ldmia r0!, {r5,r6} - subs r4, r4, #8 - eor r5, r5, r2 // Get it so that r5,r6 have 00's where the bytes match the target - eor r6, r6, r2 - uadd8 r5, r5, r7 // Parallel add 0xff - sets the GE bits for anything that wasn't 0 - sel r5, r3, r7 // bytes are 00 for none-00 bytes, or ff for 00 bytes - NOTE INVERSION - uadd8 r6, r6, r7 // Parallel add 0xff - sets the GE bits for anything that wasn't 0 - sel r6, r5, r7 // chained....bytes are 00 for none-00 bytes, or ff for 00 bytes - NOTE INVERSION - cbnz r6, 60f - bne 15b // (Flags from the subs above) If not run out of bytes then go around again - - pop {r4-r7} - and r2, r2, #0xff // Get r2 back to a single character from the expansion above - and r1, r1, #7 // Leave the count remaining as the number after the double words have been done - -20: - cbz r1, 40f // 0 length or hit the end already then not found - -21: // Post aligned section, or just a short call - ldrb r3, [r0], #1 - subs r1, r1, #1 - eor r3, r3, r2 // r3 = 0 if match - doesn't break flags from sub - cbz r3, 50f - bne 21b // on r1 flags - -40: - movs r0, #0 // not found - bx lr - -50: - subs r0, r0, #1 // found - bx lr - -60: // We're here because the fast path found a hit - now we have to track down exactly which word it was - // r0 points to the start of the double word after the one that was tested - // r5 has the 00/ff pattern for the first word, r6 has the chained value - subs r0, r0, #3 - cmp r5, #0 - it eq - moveq.n r5, r6 // the end is in the 2nd word - it ne - subne.n r0, r0, #4 // or 2nd byte of 1st word - - // r0 currently points to the 3rd byte of the word containing the hit - tst r5, #CHARTSTMASK(0) // 1st character - bne 61f - adds r0, r0, #1 - tst r5, #CHARTSTMASK(1) // 2nd character - bne 61f - adds r0, r0 ,#1 - tst r5, #(3 << 15) // 2nd & 3rd character - // If not the 3rd must be the last one - it eq - addeq.n r0, r0, #1 - -61: - pop {r4-r7} - subs r0, r0, #1 - bx lr diff --git a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/ScanMem.asm b/MdePkg/Library/BaseMemoryLibOptDxe/Arm/ScanMem.asm deleted file mode 100644 index 00f4bff19244..000000000000 --- a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/ScanMem.asm +++ /dev/null @@ -1,121 +0,0 @@ -; Copyright (c) 2010-2011, Linaro Limited -; All rights reserved. -; SPDX-License-Identifier: BSD-2-Clause-Patent -; - -; -; Written by Dave Gilbert -; -; This memchr routine is optimised on a Cortex-A9 and should work on -; all ARMv7 processors. It has a fast past for short sizes, and has -; an optimised path for large data sets; the worst case is finding the -; match early in a large data set. -; - - -; 2011-02-07 david.gilbert@linaro.org -; Extracted from local git a5b438d861 -; 2011-07-14 david.gilbert@linaro.org -; Import endianness fix from local git ea786f1b -; 2011-12-07 david.gilbert@linaro.org -; Removed unneeded cbz from align loop - -; this lets us check a flag in a 00/ff byte easily in either endianness -#define CHARTSTMASK(c) 1<<(c*8) - - EXPORT InternalMemScanMem8 - AREA ScanMem, CODE, READONLY - THUMB - -InternalMemScanMem8 - ; r0 = start of memory to scan - ; r1 = length - ; r2 = character to look for - ; returns r0 = pointer to character or NULL if not found - uxtb r2, r2 ; Don't think we can trust the caller to actually pass a char - - cmp r1, #16 ; If it's short don't bother with anything clever - blt L20 - - tst r0, #7 ; If it's already aligned skip the next bit - beq L10 - - ; Work up to an aligned point -L5 - ldrb r3, [r0],#1 - subs r1, r1, #1 - cmp r3, r2 - beq L50 ; If it matches exit found - tst r0, #7 - bne L5 ; If not aligned yet then do next byte - -L10 - ; At this point, we are aligned, we know we have at least 8 bytes to work with - push {r4-r7} - orr r2, r2, r2, lsl #8 ; expand the match word across to all bytes - orr r2, r2, r2, lsl #16 - bic r4, r1, #7 ; Number of double words to work with - mvns r7, #0 ; all F's - movs r3, #0 - -L15 - ldmia r0!, {r5,r6} - subs r4, r4, #8 - eor r5, r5, r2 ; Get it so that r5,r6 have 00's where the bytes match the target - eor r6, r6, r2 - uadd8 r5, r5, r7 ; Parallel add 0xff - sets the GE bits for anything that wasn't 0 - sel r5, r3, r7 ; bytes are 00 for none-00 bytes, or ff for 00 bytes - NOTE INVERSION - uadd8 r6, r6, r7 ; Parallel add 0xff - sets the GE bits for anything that wasn't 0 - sel r6, r5, r7 ; chained....bytes are 00 for none-00 bytes, or ff for 00 bytes - NOTE INVERSION - cbnz r6, L60 - bne L15 ; (Flags from the subs above) If not run out of bytes then go around again - - pop {r4-r7} - and r2, r2, #0xff ; Get r2 back to a single character from the expansion above - and r1, r1, #7 ; Leave the count remaining as the number after the double words have been done - -L20 - cbz r1, L40 ; 0 length or hit the end already then not found - -L21 ; Post aligned section, or just a short call - ldrb r3, [r0], #1 - subs r1, r1, #1 - eor r3, r3, r2 ; r3 = 0 if match - doesn't break flags from sub - cbz r3, L50 - bne L21 ; on r1 flags - -L40 - movs r0, #0 ; not found - bx lr - -L50 - subs r0, r0, #1 ; found - bx lr - -L60 ; We're here because the fast path found a hit - now we have to track down exactly which word it was - ; r0 points to the start of the double word after the one that was tested - ; r5 has the 00/ff pattern for the first word, r6 has the chained value - cmp r5, #0 - itte eq - moveq r5, r6 ; the end is in the 2nd word - subeq r0, r0, #3 ; Points to 2nd byte of 2nd word - subne r0, r0, #7 ; or 2nd byte of 1st word - - ; r0 currently points to the 3rd byte of the word containing the hit - tst r5, #CHARTSTMASK(0) ; 1st character - bne L61 - adds r0, r0, #1 - tst r5, #CHARTSTMASK(1) ; 2nd character - ittt eq - addeq r0, r0 ,#1 - tsteq r5, #(3 << 15) ; 2nd & 3rd character - ; If not the 3rd must be the last one - addeq r0, r0, #1 - -L61 - pop {r4-r7} - subs r0, r0, #1 - bx lr - - END - diff --git a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/SetMem.S b/MdePkg/Library/BaseMemoryLibOptDxe/Arm/SetMem.S deleted file mode 100644 index f6797004effc..000000000000 --- a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/SetMem.S +++ /dev/null @@ -1,88 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2016, Linaro Ltd. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - - .text - .thumb - .syntax unified - .align 5 - .type ASM_PFX(InternalMemSetMem16), %function -ASM_GLOBAL ASM_PFX(InternalMemSetMem16) -ASM_PFX(InternalMemSetMem16): - uxth r2, r2 - lsl r1, r1, #1 - orr r2, r2, r2, lsl #16 - b 0f - - .type ASM_PFX(InternalMemSetMem32), %function -ASM_GLOBAL ASM_PFX(InternalMemSetMem32) -ASM_PFX(InternalMemSetMem32): - lsl r1, r1, #2 - b 0f - - .type ASM_PFX(InternalMemSetMem64), %function -ASM_GLOBAL ASM_PFX(InternalMemSetMem64) -ASM_PFX(InternalMemSetMem64): - lsl r1, r1, #3 - b 1f - - .align 5 - .type ASM_PFX(InternalMemSetMem), %function -ASM_GLOBAL ASM_PFX(InternalMemSetMem) -ASM_PFX(InternalMemSetMem): - uxtb r2, r2 - orr r2, r2, r2, lsl #8 - orr r2, r2, r2, lsl #16 - b 0f - - .type ASM_PFX(InternalMemZeroMem), %function -ASM_GLOBAL ASM_PFX(InternalMemZeroMem) -ASM_PFX(InternalMemZeroMem): - movs r2, #0 -0: mov r3, r2 - -1: push {r4, lr} - cmp r1, #16 // fewer than 16 bytes of input? - add r1, r1, r0 // r1 := dst + length - add lr, r0, #16 - blt 2f - bic lr, lr, #15 // align output pointer - - str r2, [r0] // potentially unaligned store of 4 bytes - str r3, [r0, #4] // potentially unaligned store of 4 bytes - str r2, [r0, #8] // potentially unaligned store of 4 bytes - str r3, [r0, #12] // potentially unaligned store of 4 bytes - beq 1f - -0: add lr, lr, #16 // advance the output pointer by 16 bytes - subs r4, r1, lr // past the output? - blt 3f // break out of the loop - strd r2, r3, [lr, #-16] // aligned store of 16 bytes - strd r2, r3, [lr, #-8] - bne 0b // goto beginning of loop -1: pop {r4, pc} - -2: subs r4, r1, lr -3: adds r4, r4, #16 - subs r1, r1, #8 - cmp r4, #4 // between 4 and 15 bytes? - blt 4f - cmp r4, #8 // between 8 and 15 bytes? - sub r4, lr, #16 - str r2, [r4] // overlapping store of 4 + (4 + 4) + 4 bytes - it gt - strgt.n r3, [r4, #4] - it gt - strgt.n r2, [r1] - str r3, [r1, #4] - pop {r4, pc} - -4: cmp r4, #2 // 2 or 3 bytes? - strb r2, [lr, #-16] // store 1 byte - it ge - strhge.n r2, [r1, #6] // store 2 bytes - pop {r4, pc} diff --git a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/SetMem.asm b/MdePkg/Library/BaseMemoryLibOptDxe/Arm/SetMem.asm deleted file mode 100644 index 9aee8a0cf5d3..000000000000 --- a/MdePkg/Library/BaseMemoryLibOptDxe/Arm/SetMem.asm +++ /dev/null @@ -1,90 +0,0 @@ -;------------------------------------------------------------------------------ -; -; Copyright (c) 2016, Linaro Ltd. All rights reserved.
-; -; SPDX-License-Identifier: BSD-2-Clause-Patent -; -;------------------------------------------------------------------------------ - - EXPORT InternalMemZeroMem - EXPORT InternalMemSetMem - EXPORT InternalMemSetMem16 - EXPORT InternalMemSetMem32 - EXPORT InternalMemSetMem64 - - AREA SetMem, CODE, READONLY, CODEALIGN, ALIGN=5 - THUMB - -InternalMemSetMem16 - uxth r2, r2 - lsl r1, r1, #1 - orr r2, r2, r2, lsl #16 - b B0 - -InternalMemSetMem32 - lsl r1, r1, #2 - b B0 - -InternalMemSetMem64 - lsl r1, r1, #3 - b B1 - - ALIGN 32 -InternalMemSetMem - uxtb r2, r2 - orr r2, r2, r2, lsl #8 - orr r2, r2, r2, lsl #16 - b B0 - -InternalMemZeroMem - movs r2, #0 -B0 - mov r3, r2 - -B1 - push {r4, lr} - cmp r1, #16 ; fewer than 16 bytes of input? - add r1, r1, r0 ; r1 := dst + length - add lr, r0, #16 - blt L2 - bic lr, lr, #15 ; align output pointer - - str r2, [r0] ; potentially unaligned store of 4 bytes - str r3, [r0, #4] ; potentially unaligned store of 4 bytes - str r2, [r0, #8] ; potentially unaligned store of 4 bytes - str r3, [r0, #12] ; potentially unaligned store of 4 bytes - beq L1 - -L0 - add lr, lr, #16 ; advance the output pointer by 16 bytes - subs r4, r1, lr ; past the output? - blt L3 ; break out of the loop - strd r2, r3, [lr, #-16] ; aligned store of 16 bytes - strd r2, r3, [lr, #-8] - bne L0 ; goto beginning of loop -L1 - pop {r4, pc} - -L2 - subs r4, r1, lr -L3 - adds r4, r4, #16 - subs r1, r1, #8 - cmp r4, #4 ; between 4 and 15 bytes? - blt L4 - cmp r4, #8 ; between 8 and 15 bytes? - str r2, [lr, #-16] ; overlapping store of 4 + (4 + 4) + 4 bytes - itt gt - strgt r3, [lr, #-12] - strgt r2, [r1] - str r3, [r1, #4] - pop {r4, pc} - -L4 - cmp r4, #2 ; 2 or 3 bytes? - strb r2, [lr, #-16] ; store 1 byte - it ge - strhge r2, [r1, #6] ; store 2 bytes - pop {r4, pc} - - END diff --git a/MdePkg/Library/BaseMemoryLibOptDxe/BaseMemoryLibOptDxe.inf b/MdePkg/Library/BaseMemoryLibOptDxe/BaseMemoryLibOptDxe.inf index ed10b2e8fa1c..d3de50994513 100644 --- a/MdePkg/Library/BaseMemoryLibOptDxe/BaseMemoryLibOptDxe.inf +++ b/MdePkg/Library/BaseMemoryLibOptDxe/BaseMemoryLibOptDxe.inf @@ -22,7 +22,7 @@ # -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# VALID_ARCHITECTURES = IA32 X64 AARCH64 # [Sources] @@ -58,7 +58,7 @@ X64/IsZeroBuffer.nasm MemLibGuid.c -[Defines.ARM, Defines.AARCH64] +[Defines.AARCH64] # # The ARM implementations of this library may perform unaligned accesses, and # may use DC ZVA instructions that are only allowed when the MMU and D-cache @@ -67,23 +67,14 @@ # LIBRARY_CLASS = BaseMemoryLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_DRIVER UEFI_APPLICATION -[Sources.ARM] - Arm/ScanMem.S |GCC - Arm/SetMem.S |GCC - Arm/CopyMem.S |GCC - Arm/CompareMem.S |GCC - Arm/CompareGuid.S |GCC - [Sources.AARCH64] AArch64/ScanMem.S AArch64/SetMem.S AArch64/CopyMem.S AArch64/CompareMem.S AArch64/CompareGuid.S - -[Sources.ARM, Sources.AARCH64] - Arm/ScanMemGeneric.c - Arm/MemLibGuid.c + AArch64/ScanMemGeneric.c + AArch64/MemLibGuid.c [Sources] ScanMem64Wrapper.c From 673ff79628039a48007da57b368712f0dceffdac Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 09:36:20 -0700 Subject: [PATCH 0549/1172] MdePkg: Remove ARM32 Support from BaseIoIntrinsicLib edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from BaseIoIntrinsicLib. Signed-off-by: Oliver Smith-Denny --- .../BaseIoLibIntrinsic/Arm/ArmVirtMmio.S | 141 ----------------- .../BaseIoLibIntrinsic/Arm/ArmVirtMmio.asm | 145 ------------------ .../BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf | 7 +- .../BaseIoLibIntrinsicArmVirt.inf | 7 +- MdePkg/Library/BaseIoLibIntrinsic/IoLibNoIo.c | 2 +- 5 files changed, 4 insertions(+), 298 deletions(-) delete mode 100644 MdePkg/Library/BaseIoLibIntrinsic/Arm/ArmVirtMmio.S delete mode 100644 MdePkg/Library/BaseIoLibIntrinsic/Arm/ArmVirtMmio.asm diff --git a/MdePkg/Library/BaseIoLibIntrinsic/Arm/ArmVirtMmio.S b/MdePkg/Library/BaseIoLibIntrinsic/Arm/ArmVirtMmio.S deleted file mode 100644 index f82325769033..000000000000 --- a/MdePkg/Library/BaseIoLibIntrinsic/Arm/ArmVirtMmio.S +++ /dev/null @@ -1,141 +0,0 @@ -# -# Copyright (c) 2014-2018, Linaro Limited. All rights reserved. -# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -# - -GCC_ASM_EXPORT(MmioRead8Internal) -GCC_ASM_EXPORT(MmioWrite8Internal) -GCC_ASM_EXPORT(MmioRead16Internal) -GCC_ASM_EXPORT(MmioWrite16Internal) -GCC_ASM_EXPORT(MmioRead32Internal) -GCC_ASM_EXPORT(MmioWrite32Internal) -GCC_ASM_EXPORT(MmioRead64Internal) -GCC_ASM_EXPORT(MmioWrite64Internal) - -// -// Reads an 8-bit MMIO register. -// -// Reads the 8-bit MMIO register specified by Address. The 8-bit read value is -// returned. This function must guarantee that all MMIO read and write -// operations are serialized. -// -// @param Address The MMIO register to read. -// -// @return The value read. -// -ASM_PFX(MmioRead8Internal): - ldrb r0, [r0] - dmb - bx lr - -// -// Writes an 8-bit MMIO register. -// -// Writes the 8-bit MMIO register specified by Address with the value specified -// by Value and returns Value. This function must guarantee that all MMIO read -// and write operations are serialized. -// -// @param Address The MMIO register to write. -// @param Value The value to write to the MMIO register. -// -ASM_PFX(MmioWrite8Internal): - dmb st - strb r1, [r0] - bx lr - -// -// Reads a 16-bit MMIO register. -// -// Reads the 16-bit MMIO register specified by Address. The 16-bit read value is -// returned. This function must guarantee that all MMIO read and write -// operations are serialized. -// -// @param Address The MMIO register to read. -// -// @return The value read. -// -ASM_PFX(MmioRead16Internal): - ldrh r0, [r0] - dmb - bx lr - -// -// Writes a 16-bit MMIO register. -// -// Writes the 16-bit MMIO register specified by Address with the value specified -// by Value and returns Value. This function must guarantee that all MMIO read -// and write operations are serialized. -// -// @param Address The MMIO register to write. -// @param Value The value to write to the MMIO register. -// -ASM_PFX(MmioWrite16Internal): - dmb st - strh r1, [r0] - bx lr - -// -// Reads a 32-bit MMIO register. -// -// Reads the 32-bit MMIO register specified by Address. The 32-bit read value is -// returned. This function must guarantee that all MMIO read and write -// operations are serialized. -// -// @param Address The MMIO register to read. -// -// @return The value read. -// -ASM_PFX(MmioRead32Internal): - ldr r0, [r0] - dmb - bx lr - -// -// Writes a 32-bit MMIO register. -// -// Writes the 32-bit MMIO register specified by Address with the value specified -// by Value and returns Value. This function must guarantee that all MMIO read -// and write operations are serialized. -// -// @param Address The MMIO register to write. -// @param Value The value to write to the MMIO register. -// -ASM_PFX(MmioWrite32Internal): - dmb st - str r1, [r0] - bx lr - -// -// Reads a 64-bit MMIO register. -// -// Reads the 64-bit MMIO register specified by Address. The 64-bit read value is -// returned. This function must guarantee that all MMIO read and write -// operations are serialized. -// -// @param Address The MMIO register to read. -// -// @return The value read. -// -ASM_PFX(MmioRead64Internal): - ldr r1, [r0, #4] - ldr r0, [r0] - dmb - bx lr - -// -// Writes a 64-bit MMIO register. -// -// Writes the 64-bit MMIO register specified by Address with the value specified -// by Value and returns Value. This function must guarantee that all MMIO read -// and write operations are serialized. -// -// @param Address The MMIO register to write. -// @param Value The value to write to the MMIO register. -// -ASM_PFX(MmioWrite64Internal): - dmb st - str r2, [r0] - str r3, [r0, #4] - bx lr diff --git a/MdePkg/Library/BaseIoLibIntrinsic/Arm/ArmVirtMmio.asm b/MdePkg/Library/BaseIoLibIntrinsic/Arm/ArmVirtMmio.asm deleted file mode 100644 index 5a423df16bff..000000000000 --- a/MdePkg/Library/BaseIoLibIntrinsic/Arm/ArmVirtMmio.asm +++ /dev/null @@ -1,145 +0,0 @@ -; -; Copyright (c) 2014-2018, Linaro Limited. All rights reserved. -; -; SPDX-License-Identifier: BSD-2-Clause-Patent -; - - -AREA IoLibMmio, CODE, READONLY - -EXPORT MmioRead8Internal -EXPORT MmioWrite8Internal -EXPORT MmioRead16Internal -EXPORT MmioWrite16Internal -EXPORT MmioRead32Internal -EXPORT MmioWrite32Internal -EXPORT MmioRead64Internal -EXPORT MmioWrite64Internal - -; -; Reads an 8-bit MMIO register. -; -; Reads the 8-bit MMIO register specified by Address. The 8-bit read value is -; returned. This function must guarantee that all MMIO read and write -; operations are serialized. -; -; @param Address The MMIO register to read. -; -; @return The value read. -; -MmioRead8Internal - ldrb r0, [r0] - dmb - bx lr - -; -; Writes an 8-bit MMIO register. -; -; Writes the 8-bit MMIO register specified by Address with the value specified -; by Value and returns Value. This function must guarantee that all MMIO read -; and write operations are serialized. -; -; @param Address The MMIO register to write. -; @param Value The value to write to the MMIO register. -; -MmioWrite8Internal - dmb st - strb r1, [r0] - bx lr - -; -; Reads a 16-bit MMIO register. -; -; Reads the 16-bit MMIO register specified by Address. The 16-bit read value is -; returned. This function must guarantee that all MMIO read and write -; operations are serialized. -; -; @param Address The MMIO register to read. -; -; @return The value read. -; -MmioRead16Internal - ldrh r0, [r0] - dmb - bx lr - -; -; Writes a 16-bit MMIO register. -; -; Writes the 16-bit MMIO register specified by Address with the value specified -; by Value and returns Value. This function must guarantee that all MMIO read -; and write operations are serialized. -; -; @param Address The MMIO register to write. -; @param Value The value to write to the MMIO register. -; -MmioWrite16Internal - dmb st - strh r1, [r0] - bx lr - -; -; Reads a 32-bit MMIO register. -; -; Reads the 32-bit MMIO register specified by Address. The 32-bit read value is -; returned. This function must guarantee that all MMIO read and write -; operations are serialized. -; -; @param Address The MMIO register to read. -; -; @return The value read. -; -MmioRead32Internal - ldr r0, [r0] - dmb - bx lr - -; -; Writes a 32-bit MMIO register. -; -; Writes the 32-bit MMIO register specified by Address with the value specified -; by Value and returns Value. This function must guarantee that all MMIO read -; and write operations are serialized. -; -; @param Address The MMIO register to write. -; @param Value The value to write to the MMIO register. -; -MmioWrite32Internal - dmb st - str r1, [r0] - bx lr - -; -; Reads a 64-bit MMIO register. -; -; Reads the 64-bit MMIO register specified by Address. The 64-bit read value is -; returned. This function must guarantee that all MMIO read and write -; operations are serialized. -; -; @param Address The MMIO register to read. -; -; @return The value read. -; -MmioRead64Internal - ldr r1, [r0, #4] - ldr r0, [r0] - dmb - bx lr - -; -; Writes a 64-bit MMIO register. -; -; Writes the 64-bit MMIO register specified by Address with the value specified -; by Value and returns Value. This function must guarantee that all MMIO read -; and write operations are serialized. -; -; @param Address The MMIO register to write. -; @param Value The value to write to the MMIO register. -; -MmioWrite64Internal - dmb st - str r2, [r0] - str r3, [r0, #4] - bx lr - - END diff --git a/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf b/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf index b587e2cded62..d16ada90b6b4 100644 --- a/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf +++ b/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf @@ -4,7 +4,7 @@ # I/O Library that uses compiler intrinsics to perform IN and OUT instructions # for IA-32 and x64. On IPF, I/O port requests are translated into MMIO requests. # MMIO requests are forwarded directly to memory. For EBC, I/O port requests -# ASSERT(). For ARM, AARCH64, RISCV64 and LoongArch, this I/O library only provides +# ASSERT(). For AARCH64, RISCV64 and LoongArch, this I/O library only provides # non I/O read and write. # # Copyright (c) 2007 - 2021, Intel Corporation. All rights reserved.
@@ -28,7 +28,7 @@ # -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 RISCV64 LOONGARCH64 +# VALID_ARCHITECTURES = IA32 X64 EBC AARCH64 RISCV64 LOONGARCH64 # [Sources] @@ -48,9 +48,6 @@ IoLibEbc.c IoLib.c -[Sources.ARM] - IoLibNoIo.c - [Sources.AARCH64] IoLibNoIo.c diff --git a/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsicArmVirt.inf b/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsicArmVirt.inf index e803abc0b171..507cd78df078 100644 --- a/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsicArmVirt.inf +++ b/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsicArmVirt.inf @@ -20,7 +20,7 @@ LIBRARY_CLASS = IoLib # -# VALID_ARCHITECTURES = ARM AARCH64 +# VALID_ARCHITECTURES = AARCH64 # [Sources] @@ -28,11 +28,6 @@ BaseIoLibIntrinsicInternal.h IoHighLevel.c -[Sources.ARM] - IoLibArmVirt.c - Arm/ArmVirtMmio.S | GCC - -[Sources.AARCH64] IoLibArmVirt.c AArch64/ArmVirtMmio.S | GCC AArch64/ArmVirtMmio.asm | MSFT diff --git a/MdePkg/Library/BaseIoLibIntrinsic/IoLibNoIo.c b/MdePkg/Library/BaseIoLibIntrinsic/IoLibNoIo.c index c51e5da39b6f..f15f30a9e146 100644 --- a/MdePkg/Library/BaseIoLibIntrinsic/IoLibNoIo.c +++ b/MdePkg/Library/BaseIoLibIntrinsic/IoLibNoIo.c @@ -1,6 +1,6 @@ /** @file I/O library for non I/O read and write access (memory map I/O read and - write only) architecture, such as ARM, RISC-V and LoongArch processor. + write only) architecture, such as RISC-V and LoongArch processor. Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.
Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
From 9ca3dc9b0d02e03f017ff4ec9804c67b9bb4a092 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 13:04:26 -0700 Subject: [PATCH 0550/1172] MdePkg: Remove ARM32 Support from BaseSynchronizationLib edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from BaseSynchronizationLib. Signed-off-by: Oliver Smith-Denny --- .../Arm/Synchronization.S | 207 ----------------- .../Arm/Synchronization.asm | 208 ------------------ .../BaseSynchronizationLib.inf | 6 +- 3 files changed, 1 insertion(+), 420 deletions(-) delete mode 100644 MdePkg/Library/BaseSynchronizationLib/Arm/Synchronization.S delete mode 100644 MdePkg/Library/BaseSynchronizationLib/Arm/Synchronization.asm diff --git a/MdePkg/Library/BaseSynchronizationLib/Arm/Synchronization.S b/MdePkg/Library/BaseSynchronizationLib/Arm/Synchronization.S deleted file mode 100644 index 607a1697b2d5..000000000000 --- a/MdePkg/Library/BaseSynchronizationLib/Arm/Synchronization.S +++ /dev/null @@ -1,207 +0,0 @@ -// Implementation of synchronization functions for ARM architecture -// -// Copyright (c) 2012-2015, ARM Limited. All rights reserved. -// Copyright (c) 2015, Linaro Limited. All rights reserved. -// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -// - -.text -.align 3 - -GCC_ASM_EXPORT(InternalSyncCompareExchange16) -GCC_ASM_EXPORT(InternalSyncCompareExchange32) -GCC_ASM_EXPORT(InternalSyncCompareExchange64) -GCC_ASM_EXPORT(InternalSyncIncrement) -GCC_ASM_EXPORT(InternalSyncDecrement) - -/** - Performs an atomic compare exchange operation on a 16-bit unsigned integer. - - Performs an atomic compare exchange operation on the 16-bit unsigned integer - specified by Value. If Value is equal to CompareValue, then Value is set to - ExchangeValue and CompareValue is returned. If Value is not equal to CompareValue, - then Value is returned. The compare exchange operation must be performed using - MP safe mechanisms. - - @param Value A pointer to the 16-bit value for the compare exchange - operation. - @param CompareValue 16-bit value used in compare operation. - @param ExchangeValue 16-bit value used in exchange operation. - - @return The original *Value before exchange. - -**/ -//UINT16 -//EFIAPI -//InternalSyncCompareExchange16 ( -// IN volatile UINT16 *Value, -// IN UINT16 CompareValue, -// IN UINT16 ExchangeValue -// ) -ASM_PFX(InternalSyncCompareExchange16): - dmb - -InternalSyncCompareExchange16Again: - ldrexh r3, [r0] - cmp r3, r1 - bne InternalSyncCompareExchange16Fail - -InternalSyncCompareExchange16Exchange: - strexh ip, r2, [r0] - cmp ip, #0 - bne InternalSyncCompareExchange16Again - -InternalSyncCompareExchange16Fail: - dmb - mov r0, r3 - bx lr - -/** - Performs an atomic compare exchange operation on a 32-bit unsigned integer. - - Performs an atomic compare exchange operation on the 32-bit unsigned integer - specified by Value. If Value is equal to CompareValue, then Value is set to - ExchangeValue and CompareValue is returned. If Value is not equal to CompareValue, - then Value is returned. The compare exchange operation must be performed using - MP safe mechanisms. - - @param Value A pointer to the 32-bit value for the compare exchange - operation. - @param CompareValue 32-bit value used in compare operation. - @param ExchangeValue 32-bit value used in exchange operation. - - @return The original *Value before exchange. - -**/ -//UINT32 -//EFIAPI -//InternalSyncCompareExchange32 ( -// IN volatile UINT32 *Value, -// IN UINT32 CompareValue, -// IN UINT32 ExchangeValue -// ) -ASM_PFX(InternalSyncCompareExchange32): - dmb - -InternalSyncCompareExchange32Again: - ldrex r3, [r0] - cmp r3, r1 - bne InternalSyncCompareExchange32Fail - -InternalSyncCompareExchange32Exchange: - strex ip, r2, [r0] - cmp ip, #0 - bne InternalSyncCompareExchange32Again - -InternalSyncCompareExchange32Fail: - dmb - mov r0, r3 - bx lr - -/** - Performs an atomic compare exchange operation on a 64-bit unsigned integer. - - Performs an atomic compare exchange operation on the 64-bit unsigned integer specified - by Value. If Value is equal to CompareValue, then Value is set to ExchangeValue and - CompareValue is returned. If Value is not equal to CompareValue, then Value is returned. - The compare exchange operation must be performed using MP safe mechanisms. - - @param Value A pointer to the 64-bit value for the compare exchange - operation. - @param CompareValue 64-bit value used in compare operation. - @param ExchangeValue 64-bit value used in exchange operation. - - @return The original *Value before exchange. - -**/ -//UINT64 -//EFIAPI -//InternalSyncCompareExchange64 ( -// IN volatile UINT64 *Value, // r0 -// IN UINT64 CompareValue, // r2-r3 -// IN UINT64 ExchangeValue // stack -// ) -ASM_PFX(InternalSyncCompareExchange64): - push { r4-r7 } - ldrd r4, r5, [sp, #16] - dmb - -InternalSyncCompareExchange64Again: - ldrexd r6, r7, [r0] - cmp r6, r2 - cmpeq r7, r3 - bne InternalSyncCompareExchange64Fail - -InternalSyncCompareExchange64Exchange: - strexd ip, r4, r5, [r0] - cmp ip, #0 - bne InternalSyncCompareExchange64Again - -InternalSyncCompareExchange64Fail: - dmb - mov r0, r6 - mov r1, r7 - pop { r4-r7 } - bx lr - -/** - Performs an atomic increment of an 32-bit unsigned integer. - - Performs an atomic increment of the 32-bit unsigned integer specified by - Value and returns the incremented value. The increment operation must be - performed using MP safe mechanisms. The state of the return value is not - guaranteed to be MP safe. - - @param Value A pointer to the 32-bit value to increment. - - @return The incremented value. - -**/ -//UINT32 -//EFIAPI -//InternalSyncIncrement ( -// IN volatile UINT32 *Value -// ) -ASM_PFX(InternalSyncIncrement): - dmb -TryInternalSyncIncrement: - ldrex r1, [r0] - add r1, r1, #1 - strex r2, r1, [r0] - cmp r2, #0 - bne TryInternalSyncIncrement - dmb - mov r0, r1 - bx lr - -/** - Performs an atomic decrement of an 32-bit unsigned integer. - - Performs an atomic decrement of the 32-bit unsigned integer specified by - Value and returns the decrement value. The decrement operation must be - performed using MP safe mechanisms. The state of the return value is not - guaranteed to be MP safe. - - @param Value A pointer to the 32-bit value to decrement. - - @return The decrement value. - -**/ -//UINT32 -//EFIAPI -//InternalSyncDecrement ( -// IN volatile UINT32 *Value -// ) -ASM_PFX(InternalSyncDecrement): - dmb -TryInternalSyncDecrement: - ldrex r1, [r0] - sub r1, r1, #1 - strex r2, r1, [r0] - cmp r2, #0 - bne TryInternalSyncDecrement - dmb - mov r0, r1 - bx lr diff --git a/MdePkg/Library/BaseSynchronizationLib/Arm/Synchronization.asm b/MdePkg/Library/BaseSynchronizationLib/Arm/Synchronization.asm deleted file mode 100644 index 920b373e2166..000000000000 --- a/MdePkg/Library/BaseSynchronizationLib/Arm/Synchronization.asm +++ /dev/null @@ -1,208 +0,0 @@ -// Implementation of synchronization functions for ARM architecture -// -// Copyright (c) 2012-2015, ARM Limited. All rights reserved. -// Copyright (c) 2015, Linaro Limited. All rights reserved. -// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -// - - EXPORT InternalSyncCompareExchange16 - EXPORT InternalSyncCompareExchange32 - EXPORT InternalSyncCompareExchange64 - EXPORT InternalSyncIncrement - EXPORT InternalSyncDecrement - - AREA ArmSynchronization, CODE, READONLY - -/** - Performs an atomic compare exchange operation on a 16-bit unsigned integer. - - Performs an atomic compare exchange operation on the 16-bit unsigned integer - specified by Value. If Value is equal to CompareValue, then Value is set to - ExchangeValue and CompareValue is returned. If Value is not equal to CompareValue, - then Value is returned. The compare exchange operation must be performed using - MP safe mechanisms. - - @param Value A pointer to the 16-bit value for the compare exchange - operation. - @param CompareValue 16-bit value used in compare operation. - @param ExchangeValue 16-bit value used in exchange operation. - - @return The original *Value before exchange. - -**/ -//UINT16 -//EFIAPI -//InternalSyncCompareExchange16 ( -// IN volatile UINT16 *Value, -// IN UINT16 CompareValue, -// IN UINT16 ExchangeValue -// ) -InternalSyncCompareExchange16 - dmb - -InternalSyncCompareExchange16Again - ldrexh r3, [r0] - cmp r3, r1 - bne InternalSyncCompareExchange16Fail - -InternalSyncCompareExchange16Exchange - strexh ip, r2, [r0] - cmp ip, #0 - bne InternalSyncCompareExchange16Again - -InternalSyncCompareExchange16Fail - dmb - mov r0, r3 - bx lr - -/** - Performs an atomic compare exchange operation on a 32-bit unsigned integer. - - Performs an atomic compare exchange operation on the 32-bit unsigned integer - specified by Value. If Value is equal to CompareValue, then Value is set to - ExchangeValue and CompareValue is returned. If Value is not equal to CompareValue, - then Value is returned. The compare exchange operation must be performed using - MP safe mechanisms. - - @param Value A pointer to the 32-bit value for the compare exchange - operation. - @param CompareValue 32-bit value used in compare operation. - @param ExchangeValue 32-bit value used in exchange operation. - - @return The original *Value before exchange. - -**/ -//UINT32 -//EFIAPI -//InternalSyncCompareExchange32 ( -// IN volatile UINT32 *Value, -// IN UINT32 CompareValue, -// IN UINT32 ExchangeValue -// ) -InternalSyncCompareExchange32 - dmb - -InternalSyncCompareExchange32Again - ldrex r3, [r0] - cmp r3, r1 - bne InternalSyncCompareExchange32Fail - -InternalSyncCompareExchange32Exchange - strex ip, r2, [r0] - cmp ip, #0 - bne InternalSyncCompareExchange32Again - -InternalSyncCompareExchange32Fail - dmb - mov r0, r3 - bx lr - -/** - Performs an atomic compare exchange operation on a 64-bit unsigned integer. - - Performs an atomic compare exchange operation on the 64-bit unsigned integer specified - by Value. If Value is equal to CompareValue, then Value is set to ExchangeValue and - CompareValue is returned. If Value is not equal to CompareValue, then Value is returned. - The compare exchange operation must be performed using MP safe mechanisms. - - @param Value A pointer to the 64-bit value for the compare exchange - operation. - @param CompareValue 64-bit value used in compare operation. - @param ExchangeValue 64-bit value used in exchange operation. - - @return The original *Value before exchange. - -**/ -//UINT64 -//EFIAPI -//InternalSyncCompareExchange64 ( -// IN volatile UINT64 *Value, // r0 -// IN UINT64 CompareValue, // r2-r3 -// IN UINT64 ExchangeValue // stack -// ) -InternalSyncCompareExchange64 - push { r4-r7 } - ldrd r4, r5, [sp, #16] - dmb - -InternalSyncCompareExchange64Again - ldrexd r6, r7, [r0] - cmp r6, r2 - cmpeq r7, r3 - bne InternalSyncCompareExchange64Fail - -InternalSyncCompareExchange64Exchange - strexd ip, r4, r5, [r0] - cmp ip, #0 - bne InternalSyncCompareExchange64Again - -InternalSyncCompareExchange64Fail - dmb - mov r0, r6 - mov r1, r7 - pop { r4-r7 } - bx lr - -/** - Performs an atomic increment of an 32-bit unsigned integer. - - Performs an atomic increment of the 32-bit unsigned integer specified by - Value and returns the incremented value. The increment operation must be - performed using MP safe mechanisms. The state of the return value is not - guaranteed to be MP safe. - - @param Value A pointer to the 32-bit value to increment. - - @return The incremented value. - -**/ -//UINT32 -//EFIAPI -//InternalSyncIncrement ( -// IN volatile UINT32 *Value -// ) -InternalSyncIncrement - dmb -TryInternalSyncIncrement - ldrex r1, [r0] - add r1, r1, #1 - strex r2, r1, [r0] - cmp r2, #0 - bne TryInternalSyncIncrement - dmb - mov r0, r1 - bx lr - -/** - Performs an atomic decrement of an 32-bit unsigned integer. - - Performs an atomic decrement of the 32-bit unsigned integer specified by - Value and returns the decrement value. The decrement operation must be - performed using MP safe mechanisms. The state of the return value is not - guaranteed to be MP safe. - - @param Value A pointer to the 32-bit value to decrement. - - @return The decrement value. - -**/ -//UINT32 -//EFIAPI -//InternalSyncDecrement ( -// IN volatile UINT32 *Value -// ) -InternalSyncDecrement - dmb -TryInternalSyncDecrement - ldrex r1, [r0] - sub r1, r1, #1 - strex r2, r1, [r0] - cmp r2, #0 - bne TryInternalSyncDecrement - dmb - mov r0, r1 - bx lr - - END diff --git a/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf b/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf index 88dfb880fea9..26093bd663ef 100755 --- a/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf +++ b/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf @@ -21,7 +21,7 @@ LIBRARY_CLASS = SynchronizationLib # -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 +# VALID_ARCHITECTURES = IA32 X64 EBC AARCH64 # [Sources] BaseSynchronizationLibInternals.h @@ -70,10 +70,6 @@ Synchronization.c Ebc/Synchronization.c -[Sources.ARM] - Synchronization.c - Arm/Synchronization.S | GCC - [Sources.AARCH64] Synchronization.c AArch64/Synchronization.S | GCC From 756fd38a801dff792d6e6a28399b6243db019e72 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 13:12:20 -0700 Subject: [PATCH 0551/1172] MdePkg: Remove ARM32 Support from PE/COFF Libs edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from the PE/COFF libs. Signed-off-by: Oliver Smith-Denny --- .../PeCoffGetEntryPoint.c | 2 +- .../BasePeCoffLib/Arm/PeCoffLoaderEx.c | 236 ------------------ MdePkg/Library/BasePeCoffLib/BasePeCoff.c | 2 +- .../Library/BasePeCoffLib/BasePeCoffLib.inf | 5 +- 4 files changed, 3 insertions(+), 242 deletions(-) delete mode 100644 MdePkg/Library/BasePeCoffLib/Arm/PeCoffLoaderEx.c diff --git a/MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c b/MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c index 00b645a1011a..9b08e497ca2a 100644 --- a/MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c +++ b/MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c @@ -363,7 +363,7 @@ PeCoffSearchImageBase ( if ((Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) && ((Hdr.Te->Machine == IMAGE_FILE_MACHINE_I386) || (Hdr.Te->Machine == IMAGE_FILE_MACHINE_IA64) || (Hdr.Te->Machine == IMAGE_FILE_MACHINE_EBC) || (Hdr.Te->Machine == IMAGE_FILE_MACHINE_X64) || - (Hdr.Te->Machine == IMAGE_FILE_MACHINE_ARM64) || (Hdr.Te->Machine == IMAGE_FILE_MACHINE_ARMTHUMB_MIXED)) + (Hdr.Te->Machine == IMAGE_FILE_MACHINE_ARM64)) ) { break; diff --git a/MdePkg/Library/BasePeCoffLib/Arm/PeCoffLoaderEx.c b/MdePkg/Library/BasePeCoffLib/Arm/PeCoffLoaderEx.c deleted file mode 100644 index 595377bed661..000000000000 --- a/MdePkg/Library/BasePeCoffLib/Arm/PeCoffLoaderEx.c +++ /dev/null @@ -1,236 +0,0 @@ -/** @file - Specific relocation fixups for ARM architecture. - - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
- Portions copyright (c) 2008 - 2010, Apple Inc. All rights reserved.
- SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include "BasePeCoffLibInternals.h" -#include - -/** - Pass in a pointer to an ARM MOVT or MOVW immediate instruciton and - return the immediate data encoded in the instruction. - - @param Instruction Pointer to ARM MOVT or MOVW immediate instruction - - @return Immediate address encoded in the instruction - -**/ -UINT16 -ThumbMovtImmediateAddress ( - IN UINT16 *Instruction - ) -{ - UINT32 Movt; - UINT16 Address; - - // Thumb2 is two 16-bit instructions working together. Not a single 32-bit instruction - // Example MOVT R0, #0 is 0x0000f2c0 or 0xf2c0 0x0000 - Movt = (*Instruction << 16) | (*(Instruction + 1)); - - // imm16 = imm4:i:imm3:imm8 - // imm4 -> Bit19:Bit16 - // i -> Bit26 - // imm3 -> Bit14:Bit12 - // imm8 -> Bit7:Bit0 - Address = (UINT16)(Movt & 0x000000ff); // imm8 - Address |= (UINT16)((Movt >> 4) & 0x0000f700); // imm4 imm3 - Address |= (((Movt & BIT26) != 0) ? BIT11 : 0); // i - return Address; -} - -/** - Update an ARM MOVT or MOVW immediate instruction immediate data. - - @param Instruction Pointer to ARM MOVT or MOVW immediate instruction - @param Address New addres to patch into the instruction -**/ -VOID -ThumbMovtImmediatePatch ( - IN OUT UINT16 *Instruction, - IN UINT16 Address - ) -{ - UINT16 Patch; - - // First 16-bit chunk of instruciton - Patch = ((Address >> 12) & 0x000f); // imm4 - Patch |= (((Address & BIT11) != 0) ? BIT10 : 0); // i - // Mask out instruction bits and or in address - *(Instruction) = (*Instruction & ~0x040f) | Patch; - - // Second 16-bit chunk of instruction - Patch = Address & 0x000000ff; // imm8 - Patch |= ((Address << 4) & 0x00007000); // imm3 - // Mask out instruction bits and or in address - Instruction++; - *Instruction = (*Instruction & ~0x70ff) | Patch; -} - -/** - Pass in a pointer to an ARM MOVW/MOVT instruciton pair and - return the immediate data encoded in the two` instruction. - - @param Instructions Pointer to ARM MOVW/MOVT insturction pair - - @return Immediate address encoded in the instructions - -**/ -UINT32 -ThumbMovwMovtImmediateAddress ( - IN UINT16 *Instructions - ) -{ - UINT16 *Word; - UINT16 *Top; - - Word = Instructions; // MOVW - Top = Word + 2; // MOVT - - return (ThumbMovtImmediateAddress (Top) << 16) + ThumbMovtImmediateAddress (Word); -} - -/** - Update an ARM MOVW/MOVT immediate instruction instruction pair. - - @param Instructions Pointer to ARM MOVW/MOVT instruction pair - @param Address New addres to patch into the instructions -**/ -VOID -ThumbMovwMovtImmediatePatch ( - IN OUT UINT16 *Instructions, - IN UINT32 Address - ) -{ - UINT16 *Word; - UINT16 *Top; - - Word = Instructions; // MOVW - Top = Word + 2; // MOVT - - ThumbMovtImmediatePatch (Word, (UINT16)(Address & 0xffff)); - ThumbMovtImmediatePatch (Top, (UINT16)(Address >> 16)); -} - -/** - Performs an ARM-based specific relocation fixup and is a no-op on other - instruction sets. - - @param Reloc The pointer to the relocation record. - @param Fixup The pointer to the address to fix up. - @param FixupData The pointer to a buffer to log the fixups. - @param Adjust The offset to adjust the fixup. - - @return Status code. - -**/ -RETURN_STATUS -PeCoffLoaderRelocateImageEx ( - IN UINT16 *Reloc, - IN OUT CHAR8 *Fixup, - IN OUT CHAR8 **FixupData, - IN UINT64 Adjust - ) -{ - UINT16 *Fixup16; - UINT32 FixupVal; - - Fixup16 = (UINT16 *)Fixup; - - switch ((*Reloc) >> 12) { - case EFI_IMAGE_REL_BASED_ARM_MOV32T: - FixupVal = ThumbMovwMovtImmediateAddress (Fixup16) + (UINT32)Adjust; - ThumbMovwMovtImmediatePatch (Fixup16, FixupVal); - - if (*FixupData != NULL) { - *FixupData = ALIGN_POINTER (*FixupData, sizeof (UINT64)); - // Fixup16 is not aligned so we must copy it. Thumb instructions are streams of 16 bytes. - CopyMem (*FixupData, Fixup16, sizeof (UINT64)); - *FixupData = *FixupData + sizeof (UINT64); - } - - break; - - case EFI_IMAGE_REL_BASED_ARM_MOV32A: - ASSERT (FALSE); - // break omitted - ARM instruction encoding not implemented - default: - return RETURN_UNSUPPORTED; - } - - return RETURN_SUCCESS; -} - -/** - Returns TRUE if the machine type of PE/COFF image is supported. Supported - does not mean the image can be executed it means the PE/COFF loader supports - loading and relocating of the image type. It's up to the caller to support - the entry point. - - @param Machine Machine type from the PE Header. - - @return TRUE if this PE/COFF loader can load the image - -**/ -BOOLEAN -PeCoffLoaderImageFormatSupported ( - IN UINT16 Machine - ) -{ - if ((Machine == IMAGE_FILE_MACHINE_ARMTHUMB_MIXED) || (Machine == IMAGE_FILE_MACHINE_EBC)) { - return TRUE; - } - - return FALSE; -} - -/** - Performs an ARM-based specific re-relocation fixup and is a no-op on other - instruction sets. This is used to re-relocated the image into the EFI virtual - space for runtime calls. - - @param Reloc The pointer to the relocation record. - @param Fixup The pointer to the address to fix up. - @param FixupData The pointer to a buffer to log the fixups. - @param Adjust The offset to adjust the fixup. - - @return Status code. - -**/ -RETURN_STATUS -PeHotRelocateImageEx ( - IN UINT16 *Reloc, - IN OUT CHAR8 *Fixup, - IN OUT CHAR8 **FixupData, - IN UINT64 Adjust - ) -{ - UINT16 *Fixup16; - UINT32 FixupVal; - - Fixup16 = (UINT16 *)Fixup; - - switch ((*Reloc) >> 12) { - case EFI_IMAGE_REL_BASED_ARM_MOV32T: - *FixupData = ALIGN_POINTER (*FixupData, sizeof (UINT64)); - if (*(UINT64 *)(*FixupData) == ReadUnaligned64 ((UINT64 *)Fixup16)) { - FixupVal = ThumbMovwMovtImmediateAddress (Fixup16) + (UINT32)Adjust; - ThumbMovwMovtImmediatePatch (Fixup16, FixupVal); - } - - *FixupData = *FixupData + sizeof (UINT64); - break; - - case EFI_IMAGE_REL_BASED_ARM_MOV32A: - ASSERT (FALSE); - // break omitted - ARM instruction encoding not implemented - default: - DEBUG ((DEBUG_ERROR, "PeHotRelocateEx:unknown fixed type\n")); - return RETURN_UNSUPPORTED; - } - - return RETURN_SUCCESS; -} diff --git a/MdePkg/Library/BasePeCoffLib/BasePeCoff.c b/MdePkg/Library/BasePeCoffLib/BasePeCoff.c index f853c8482715..ca02f1b48a60 100644 --- a/MdePkg/Library/BasePeCoffLib/BasePeCoff.c +++ b/MdePkg/Library/BasePeCoffLib/BasePeCoff.c @@ -1,6 +1,6 @@ /** @file Base PE/COFF loader supports loading any PE32/PE32+ or TE image, but - only supports relocating IA32, x64, IPF, ARM, RISC-V, LoongArch and EBC images. + only supports relocating IA32, x64, IPF, RISC-V, LoongArch and EBC images. Caution: This file requires additional review when modified. This library will have external input - PE/COFF image. diff --git a/MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf b/MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf index 6bab9e7acd18..4449579a796c 100644 --- a/MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf +++ b/MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf @@ -32,7 +32,7 @@ # -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 +# VALID_ARCHITECTURES = IA32 X64 EBC AARCH64 # [Sources] @@ -42,9 +42,6 @@ [Sources.IA32, Sources.X64, Sources.EBC, Sources.AARCH64] PeCoffLoaderEx.c -[Sources.ARM] - Arm/PeCoffLoaderEx.c - [Sources.RISCV64] RiscV/PeCoffLoaderEx.c From c7ada42ce4fedcc2b199855a658086310ed18c0c Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 14:07:55 -0700 Subject: [PATCH 0552/1172] MdePkg: Remove ARM32 Support from BaseCpuLib edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from BaseCpuLib. Signed-off-by: Oliver Smith-Denny --- MdePkg/Library/BaseCpuLib/Arm/CpuFlushTlb.S | 30 --------------- MdePkg/Library/BaseCpuLib/Arm/CpuFlushTlb.asm | 31 --------------- MdePkg/Library/BaseCpuLib/Arm/CpuSleep.S | 37 ------------------ MdePkg/Library/BaseCpuLib/Arm/CpuSleep.asm | 38 ------------------- MdePkg/Library/BaseCpuLib/BaseCpuLib.inf | 10 +---- 5 files changed, 2 insertions(+), 144 deletions(-) delete mode 100644 MdePkg/Library/BaseCpuLib/Arm/CpuFlushTlb.S delete mode 100644 MdePkg/Library/BaseCpuLib/Arm/CpuFlushTlb.asm delete mode 100644 MdePkg/Library/BaseCpuLib/Arm/CpuSleep.S delete mode 100644 MdePkg/Library/BaseCpuLib/Arm/CpuSleep.asm diff --git a/MdePkg/Library/BaseCpuLib/Arm/CpuFlushTlb.S b/MdePkg/Library/BaseCpuLib/Arm/CpuFlushTlb.S deleted file mode 100644 index 3bafce6f3f2a..000000000000 --- a/MdePkg/Library/BaseCpuLib/Arm/CpuFlushTlb.S +++ /dev/null @@ -1,30 +0,0 @@ -#------------------------------------------------------------------------------ -# -# CpuFlushTlb() for ARM -# -# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-# Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -.text -.p2align 2 -GCC_ASM_EXPORT(CpuFlushTlb) - -#/** -# Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU. -# -# Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU. -# -#**/ -#VOID -#EFIAPI -#CpuFlushTlb ( -# VOID -# )# -# -ASM_PFX(CpuFlushTlb): - mov r0,#0 - mcr p15,0,r0,c8,c5,0 // Invalidate all the unlocked entried in TLB - bx LR diff --git a/MdePkg/Library/BaseCpuLib/Arm/CpuFlushTlb.asm b/MdePkg/Library/BaseCpuLib/Arm/CpuFlushTlb.asm deleted file mode 100644 index 1f77fc7d5570..000000000000 --- a/MdePkg/Library/BaseCpuLib/Arm/CpuFlushTlb.asm +++ /dev/null @@ -1,31 +0,0 @@ -;------------------------------------------------------------------------------ -; -; CpuFlushTlb() for ARM -; -; Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-; Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-; SPDX-License-Identifier: BSD-2-Clause-Patent -; -;------------------------------------------------------------------------------ - - EXPORT CpuFlushTlb - AREA cpu_flush_tlb, CODE, READONLY - -;/** -; Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU. -; -; Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU. -; -;**/ -;VOID -;EFIAPI -;CpuFlushTlb ( -; VOID -; ); -; -CpuFlushTlb - MOV r0,#0 - MCR p15,0,r0,c8,c5,0 ;Invalidate all the unlocked entried in TLB - BX LR - - END diff --git a/MdePkg/Library/BaseCpuLib/Arm/CpuSleep.S b/MdePkg/Library/BaseCpuLib/Arm/CpuSleep.S deleted file mode 100644 index e2b7349008b0..000000000000 --- a/MdePkg/Library/BaseCpuLib/Arm/CpuSleep.S +++ /dev/null @@ -1,37 +0,0 @@ -#------------------------------------------------------------------------------ -# -# CpuSleep() for ARMv7 -# -# ARMv6 versions was: -# MOV r0,#0 -# MCR p15,0,r0,c7,c0,4 ;Wait for Interrupt instruction -# -# But this is a no-op on ARMv7 -# -# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-# Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -.text -.p2align 2 -GCC_ASM_EXPORT(CpuSleep) - -#/** -# Places the CPU in a sleep state until an interrupt is received. -# -# Places the CPU in a sleep state until an interrupt is received. If interrupts -# are disabled prior to calling this function, then the CPU will be placed in a -# sleep state indefinitely. -# -#**/ -#VOID -#EFIAPI -#CpuSleep ( -# VOID -# ); -# -ASM_PFX(CpuSleep): - wfi - bx lr diff --git a/MdePkg/Library/BaseCpuLib/Arm/CpuSleep.asm b/MdePkg/Library/BaseCpuLib/Arm/CpuSleep.asm deleted file mode 100644 index ae32705a6913..000000000000 --- a/MdePkg/Library/BaseCpuLib/Arm/CpuSleep.asm +++ /dev/null @@ -1,38 +0,0 @@ -;------------------------------------------------------------------------------ -; -; CpuSleep() for ARMv7 -; -; ARMv6 versions was: -; MOV r0,#0 -; MCR p15,0,r0,c7,c0,4 ;Wait for Interrupt instruction -; -; But this is a no-op on ARMv7 -; -; Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-; Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.
-; SPDX-License-Identifier: BSD-2-Clause-Patent -; -;------------------------------------------------------------------------------ - - EXPORT CpuSleep - AREA cpu_sleep, CODE, READONLY - -;/** -; Places the CPU in a sleep state until an interrupt is received. -; -; Places the CPU in a sleep state until an interrupt is received. If interrupts -; are disabled prior to calling this function, then the CPU will be placed in a -; sleep state indefinitely. -; -;**/ -;VOID -;EFIAPI -;CpuSleep ( -; VOID -; ); -; -CpuSleep - WFI - BX LR - - END diff --git a/MdePkg/Library/BaseCpuLib/BaseCpuLib.inf b/MdePkg/Library/BaseCpuLib/BaseCpuLib.inf index 57b60147ba3f..4aae0b61c4ab 100644 --- a/MdePkg/Library/BaseCpuLib/BaseCpuLib.inf +++ b/MdePkg/Library/BaseCpuLib/BaseCpuLib.inf @@ -1,7 +1,7 @@ ## @file # Instance of CPU Library for various architecture. # -# CPU Library implemented using ASM functions for IA32, X64, ARM, AARCH64, +# CPU Library implemented using ASM functions for IA32, X64, AARCH64, # PAL CALLs for IPF, and empty functions for EBC. # # Copyright (c) 2007 - 2022, Intel Corporation. All rights reserved.
@@ -26,7 +26,7 @@ # -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 RISCV64 LOONGARCH64 +# VALID_ARCHITECTURES = IA32 X64 EBC AARCH64 RISCV64 LOONGARCH64 # [Sources.IA32, Sources.X64] @@ -49,12 +49,6 @@ [Sources.EBC] Ebc/CpuSleepFlushTlb.c -[Sources.ARM] - Arm/CpuFlushTlb.asm | MSFT - Arm/CpuSleep.asm | MSFT - Arm/CpuFlushTlb.S | GCC - Arm/CpuSleep.S | GCC - [Sources.AARCH64] AArch64/CpuFlushTlb.S | GCC AArch64/CpuSleep.S | GCC From 84c026111c759abd5649865d6c047d69ea477b3e Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 13:03:50 -0700 Subject: [PATCH 0553/1172] MdePkg: Remove ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit removes the remaining ARM32 code from MdePkg. This also removes irrelevant VALID_ARCHITECTURES comments from infs that are not arch specific. Signed-off-by: Oliver Smith-Denny --- MdePkg/Include/Arm/AArch32.h | 122 --------- MdePkg/Include/Arm/AArch32Mmu.h | 216 ---------------- MdePkg/Include/Arm/AsmMacroLib.h | 38 --- MdePkg/Include/Arm/ProcessorBind.h | 238 ------------------ MdePkg/Include/Guid/Cper.h | 10 +- MdePkg/Include/Library/ArmLib.h | 31 +-- MdePkg/Include/Library/BaseLib.h | 20 -- MdePkg/Include/Pi/PiStatusCode.h | 2 +- MdePkg/Include/Protocol/DebugSupport.h | 1 - MdePkg/Include/Protocol/PxeBaseCode.h | 2 - MdePkg/Include/Uefi/UefiBaseType.h | 11 - MdePkg/Include/Uefi/UefiSpec.h | 5 +- .../BaseArmTrngLibNull/BaseArmTrngLibNull.inf | 4 - .../BaseCacheMaintenanceLib.inf | 5 +- .../BaseCacheMaintenanceLibNull.inf | 4 - .../Library/BaseCpuLibNull/BaseCpuLibNull.inf | 4 - .../Library/BaseMemoryLib/BaseMemoryLib.inf | 2 +- .../BasePciLibPciExpress.inf | 5 - .../Library/BaseRngLibNull/BaseRngLibNull.inf | 4 - .../Library/BaseSafeIntLib/BaseSafeIntLib.inf | 4 +- .../DxeRuntimeDebugLibSerialPort.inf | 4 - MdePkg/MdePkg.dec | 7 +- MdePkg/MdePkg.dsc | 6 +- 23 files changed, 17 insertions(+), 728 deletions(-) delete mode 100644 MdePkg/Include/Arm/AArch32.h delete mode 100644 MdePkg/Include/Arm/AArch32Mmu.h delete mode 100644 MdePkg/Include/Arm/AsmMacroLib.h delete mode 100644 MdePkg/Include/Arm/ProcessorBind.h diff --git a/MdePkg/Include/Arm/AArch32.h b/MdePkg/Include/Arm/AArch32.h deleted file mode 100644 index e7e6e4dcd0a2..000000000000 --- a/MdePkg/Include/Arm/AArch32.h +++ /dev/null @@ -1,122 +0,0 @@ -/** @file - - Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
- Copyright (c) 2011-2021, Arm Limited. All rights reserved.
- - SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#ifndef ARM_V7_H_ -#define ARM_V7_H_ - -#include - -// ARM Interrupt ID in Exception Table -#define ARM_ARCH_EXCEPTION_IRQ EXCEPT_ARM_IRQ - -// ID_PFR1 - ARM Processor Feature Register 1 definitions -#define ARM_PFR1_SEC (0xFUL << 4) -#define ARM_PFR1_TIMER (0xFUL << 16) -#define ARM_PFR1_GIC (0xFUL << 28) - -// Domain Access Control Register -#define DOMAIN_ACCESS_CONTROL_MASK(a) (3UL << (2 * (a))) -#define DOMAIN_ACCESS_CONTROL_NONE(a) (0UL << (2 * (a))) -#define DOMAIN_ACCESS_CONTROL_CLIENT(a) (1UL << (2 * (a))) -#define DOMAIN_ACCESS_CONTROL_RESERVED(a) (2UL << (2 * (a))) -#define DOMAIN_ACCESS_CONTROL_MANAGER(a) (3UL << (2 * (a))) - -// CPSR - Coprocessor Status Register definitions -#define CPSR_MODE_USER 0x10 -#define CPSR_MODE_FIQ 0x11 -#define CPSR_MODE_IRQ 0x12 -#define CPSR_MODE_SVC 0x13 -#define CPSR_MODE_ABORT 0x17 -#define CPSR_MODE_HYP 0x1A -#define CPSR_MODE_UNDEFINED 0x1B -#define CPSR_MODE_SYSTEM 0x1F -#define CPSR_MODE_MASK 0x1F -#define CPSR_ASYNC_ABORT (1 << 8) -#define CPSR_IRQ (1 << 7) -#define CPSR_FIQ (1 << 6) - -// CPACR - Coprocessor Access Control Register definitions -#define CPACR_CP_DENIED(cp) 0x00 -#define CPACR_CP_PRIV(cp) ((0x1 << ((cp) << 1)) & 0x0FFFFFFF) -#define CPACR_CP_FULL(cp) ((0x3 << ((cp) << 1)) & 0x0FFFFFFF) -#define CPACR_ASEDIS (1 << 31) -#define CPACR_D32DIS (1 << 30) -#define CPACR_CP_FULL_ACCESS 0x0FFFFFFF - -// NSACR - Non-Secure Access Control Register definitions -#define NSACR_CP(cp) ((1 << (cp)) & 0x3FFF) -#define NSACR_NSD32DIS (1 << 14) -#define NSACR_NSASEDIS (1 << 15) -#define NSACR_PLE (1 << 16) -#define NSACR_TL (1 << 17) -#define NSACR_NS_SMP (1 << 18) -#define NSACR_RFR (1 << 19) - -// SCR - Secure Configuration Register definitions -#define SCR_NS (1 << 0) -#define SCR_IRQ (1 << 1) -#define SCR_FIQ (1 << 2) -#define SCR_EA (1 << 3) -#define SCR_FW (1 << 4) -#define SCR_AW (1 << 5) - -// MIDR - Main ID Register definitions -#define ARM_CPU_TYPE_SHIFT 4 -#define ARM_CPU_TYPE_MASK 0xFFF -#define ARM_CPU_TYPE_AEMV8 0xD0F -#define ARM_CPU_TYPE_A53 0xD03 -#define ARM_CPU_TYPE_A57 0xD07 -#define ARM_CPU_TYPE_A15 0xC0F -#define ARM_CPU_TYPE_A12 0xC0D -#define ARM_CPU_TYPE_A9 0xC09 -#define ARM_CPU_TYPE_A7 0xC07 -#define ARM_CPU_TYPE_A5 0xC05 - -#define ARM_CPU_REV_MASK ((0xF << 20) | (0xF) ) -#define ARM_CPU_REV(rn, pn) ((((rn) & 0xF) << 20) | ((pn) & 0xF)) - -#define ARM_VECTOR_TABLE_ALIGNMENT ((1 << 5)-1) - -VOID -EFIAPI -ArmEnableSWPInstruction ( - VOID - ); - -UINTN -EFIAPI -ArmReadCbar ( - VOID - ); - -UINTN -EFIAPI -ArmReadTpidrurw ( - VOID - ); - -VOID -EFIAPI -ArmWriteTpidrurw ( - UINTN Value - ); - -UINT32 -EFIAPI -ArmReadNsacr ( - VOID - ); - -VOID -EFIAPI -ArmWriteNsacr ( - IN UINT32 Nsacr - ); - -#endif // ARM_V7_H_ diff --git a/MdePkg/Include/Arm/AArch32Mmu.h b/MdePkg/Include/Arm/AArch32Mmu.h deleted file mode 100644 index 89b81e33d004..000000000000 --- a/MdePkg/Include/Arm/AArch32Mmu.h +++ /dev/null @@ -1,216 +0,0 @@ -/** @file -* -* Copyright (c) 2011-2013, ARM Limited. All rights reserved. -* -* SPDX-License-Identifier: BSD-2-Clause-Patent -* -**/ - -#ifndef ARMV7_MMU_H_ -#define ARMV7_MMU_H_ - -#define TTBR_NOT_OUTER_SHAREABLE BIT5 -#define TTBR_RGN_OUTER_NON_CACHEABLE 0 -#define TTBR_RGN_OUTER_WRITE_BACK_ALLOC BIT3 -#define TTBR_RGN_OUTER_WRITE_THROUGH BIT4 -#define TTBR_RGN_OUTER_WRITE_BACK_NO_ALLOC (BIT3|BIT4) -#define TTBR_SHAREABLE BIT1 -#define TTBR_NON_SHAREABLE 0 -#define TTBR_INNER_CACHEABLE BIT0 -#define TTBR_INNER_NON_CACHEABLE 0 -#define TTBR_RGN_INNER_NON_CACHEABLE 0 -#define TTBR_RGN_INNER_WRITE_BACK_ALLOC BIT6 -#define TTBR_RGN_INNER_WRITE_THROUGH BIT0 -#define TTBR_RGN_INNER_WRITE_BACK_NO_ALLOC (BIT0|BIT6) - -#define TTBR_WRITE_THROUGH ( TTBR_RGN_OUTER_WRITE_THROUGH | TTBR_INNER_CACHEABLE | TTBR_SHAREABLE) -#define TTBR_WRITE_BACK_NO_ALLOC ( TTBR_RGN_OUTER_WRITE_BACK_NO_ALLOC | TTBR_INNER_CACHEABLE | TTBR_SHAREABLE) -#define TTBR_NON_CACHEABLE ( TTBR_RGN_OUTER_NON_CACHEABLE | TTBR_INNER_NON_CACHEABLE ) -#define TTBR_WRITE_BACK_ALLOC ( TTBR_RGN_OUTER_WRITE_BACK_ALLOC | TTBR_INNER_CACHEABLE | TTBR_SHAREABLE) - -#define TTBR_MP_WRITE_THROUGH ( TTBR_RGN_OUTER_WRITE_THROUGH | TTBR_RGN_INNER_WRITE_THROUGH | TTBR_SHAREABLE) -#define TTBR_MP_WRITE_BACK_NO_ALLOC ( TTBR_RGN_OUTER_WRITE_BACK_NO_ALLOC | TTBR_RGN_INNER_WRITE_BACK_NO_ALLOC | TTBR_SHAREABLE) -#define TTBR_MP_NON_CACHEABLE ( TTBR_RGN_OUTER_NON_CACHEABLE | TTBR_RGN_INNER_NON_CACHEABLE ) -#define TTBR_MP_WRITE_BACK_ALLOC ( TTBR_RGN_OUTER_WRITE_BACK_ALLOC | TTBR_RGN_INNER_WRITE_BACK_ALLOC | TTBR_SHAREABLE) - -#define TRANSLATION_TABLE_SECTION_COUNT 4096 -#define TRANSLATION_TABLE_SECTION_SIZE (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT) -#define TRANSLATION_TABLE_SECTION_ALIGNMENT (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT) -#define TRANSLATION_TABLE_SECTION_ALIGNMENT_MASK (TRANSLATION_TABLE_SECTION_ALIGNMENT - 1) - -#define TRANSLATION_TABLE_PAGE_COUNT 256 -#define TRANSLATION_TABLE_PAGE_SIZE (sizeof(UINT32) * TRANSLATION_TABLE_PAGE_COUNT) -#define TRANSLATION_TABLE_PAGE_ALIGNMENT (sizeof(UINT32) * TRANSLATION_TABLE_PAGE_COUNT) -#define TRANSLATION_TABLE_PAGE_ALIGNMENT_MASK (TRANSLATION_TABLE_PAGE_ALIGNMENT - 1) - -#define TRANSLATION_TABLE_ENTRY_FOR_VIRTUAL_ADDRESS(table, address) ((UINT32 *)(table) + (((UINTN)(address)) >> 20)) - -// Translation table descriptor types -#define TT_DESCRIPTOR_SECTION_TYPE_MASK ((1UL << 18) | (3UL << 0)) -#define TT_DESCRIPTOR_SECTION_TYPE_FAULT (0UL << 0) -#define TT_DESCRIPTOR_SECTION_TYPE_PAGE_TABLE (1UL << 0) -#define TT_DESCRIPTOR_SECTION_TYPE_SECTION ((0UL << 18) | (2UL << 0)) -#define TT_DESCRIPTOR_SECTION_TYPE_SUPERSECTION ((1UL << 18) | (2UL << 0)) -#define TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE(Desc) (((Desc) & 3UL) == TT_DESCRIPTOR_SECTION_TYPE_PAGE_TABLE) - -// Translation table descriptor types -#define TT_DESCRIPTOR_PAGE_TYPE_MASK (1UL << 1) -#define TT_DESCRIPTOR_PAGE_TYPE_FAULT (0UL << 1) -#define TT_DESCRIPTOR_PAGE_TYPE_PAGE (1UL << 1) - -// Section descriptor definitions -#define TT_DESCRIPTOR_SECTION_SIZE (0x00100000) - -#define TT_DESCRIPTOR_SECTION_NS_MASK (1UL << 19) -#define TT_DESCRIPTOR_SECTION_NS (1UL << 19) - -#define TT_DESCRIPTOR_SECTION_NG_MASK (1UL << 17) -#define TT_DESCRIPTOR_SECTION_NG_GLOBAL (0UL << 17) -#define TT_DESCRIPTOR_SECTION_NG_LOCAL (1UL << 17) - -#define TT_DESCRIPTOR_PAGE_NG_MASK (1UL << 11) -#define TT_DESCRIPTOR_PAGE_NG_GLOBAL (0UL << 11) -#define TT_DESCRIPTOR_PAGE_NG_LOCAL (1UL << 11) - -#define TT_DESCRIPTOR_SECTION_S_MASK (1UL << 16) -#define TT_DESCRIPTOR_SECTION_S_NOT_SHARED (0UL << 16) -#define TT_DESCRIPTOR_SECTION_S_SHARED (1UL << 16) - -#define TT_DESCRIPTOR_PAGE_S_MASK (1UL << 10) -#define TT_DESCRIPTOR_PAGE_S_NOT_SHARED (0UL << 10) -#define TT_DESCRIPTOR_PAGE_S_SHARED (1UL << 10) - -#define TT_DESCRIPTOR_SECTION_AP_MASK ((1UL << 15) | (1UL << 11)) -#define TT_DESCRIPTOR_SECTION_AP_NO_RW ((0UL << 15) | (0UL << 11)) -#define TT_DESCRIPTOR_SECTION_AP_RW_RW ((0UL << 15) | (1UL << 11)) -#define TT_DESCRIPTOR_SECTION_AP_NO_RO ((1UL << 15) | (0UL << 11)) -#define TT_DESCRIPTOR_SECTION_AP_RO_RO ((1UL << 15) | (1UL << 11)) - -#define TT_DESCRIPTOR_SECTION_AF (1UL << 10) - -#define TT_DESCRIPTOR_PAGE_AP_MASK ((1UL << 9) | (1UL << 5)) -#define TT_DESCRIPTOR_PAGE_AP_NO_RW ((0UL << 9) | (0UL << 5)) -#define TT_DESCRIPTOR_PAGE_AP_RW_RW ((0UL << 9) | (1UL << 5)) -#define TT_DESCRIPTOR_PAGE_AP_NO_RO ((1UL << 9) | (0UL << 5)) -#define TT_DESCRIPTOR_PAGE_AP_RO_RO ((1UL << 9) | (1UL << 5)) - -#define TT_DESCRIPTOR_PAGE_AF (1UL << 4) - -#define TT_DESCRIPTOR_SECTION_XN_MASK (0x1UL << 4) -#define TT_DESCRIPTOR_PAGE_XN_MASK (0x1UL << 0) - -#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK ((3UL << 12) | (1UL << 3) | (1UL << 2)) -#define TT_DESCRIPTOR_SECTION_CACHEABLE_MASK (1UL << 3) -#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_STRONGLY_ORDERED ((0UL << 12) | (0UL << 3) | (0UL << 2)) -#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_SHAREABLE_DEVICE ((0UL << 12) | (0UL << 3) | (1UL << 2)) -#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC ((0UL << 12) | (1UL << 3) | (0UL << 2)) -#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_BACK_NO_ALLOC ((0UL << 12) | (1UL << 3) | (1UL << 2)) -#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_NON_CACHEABLE ((1UL << 12) | (0UL << 3) | (0UL << 2)) -#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_BACK_ALLOC ((1UL << 12) | (1UL << 3) | (1UL << 2)) -#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_NON_SHAREABLE_DEVICE ((2UL << 12) | (0UL << 3) | (0UL << 2)) - -#define TT_DESCRIPTOR_PAGE_SIZE (0x00001000) - -#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK ((3UL << 6) | (1UL << 3) | (1UL << 2)) -#define TT_DESCRIPTOR_PAGE_CACHEABLE_MASK (1UL << 3) -#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_STRONGLY_ORDERED ((0UL << 6) | (0UL << 3) | (0UL << 2)) -#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_SHAREABLE_DEVICE ((0UL << 6) | (0UL << 3) | (1UL << 2)) -#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC ((0UL << 6) | (1UL << 3) | (0UL << 2)) -#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_BACK_NO_ALLOC ((0UL << 6) | (1UL << 3) | (1UL << 2)) -#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_NON_CACHEABLE ((1UL << 6) | (0UL << 3) | (0UL << 2)) -#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_BACK_ALLOC ((1UL << 6) | (1UL << 3) | (1UL << 2)) -#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_NON_SHAREABLE_DEVICE ((2UL << 6) | (0UL << 3) | (0UL << 2)) - -#define TT_DESCRIPTOR_CONVERT_TO_PAGE_AP(Desc) ((((Desc) & TT_DESCRIPTOR_SECTION_AP_MASK) >> 6) & TT_DESCRIPTOR_PAGE_AP_MASK) -#define TT_DESCRIPTOR_CONVERT_TO_PAGE_NG(Desc) ((((Desc) & TT_DESCRIPTOR_SECTION_NG_MASK) >> 6) & TT_DESCRIPTOR_PAGE_NG_MASK) -#define TT_DESCRIPTOR_CONVERT_TO_PAGE_S(Desc) ((((Desc) & TT_DESCRIPTOR_SECTION_S_MASK) >> 6) & TT_DESCRIPTOR_PAGE_S_MASK) -#define TT_DESCRIPTOR_CONVERT_TO_PAGE_AF(Desc) ((((Desc) & TT_DESCRIPTOR_SECTION_AF) >> 6) & TT_DESCRIPTOR_PAGE_AF) -#define TT_DESCRIPTOR_CONVERT_TO_PAGE_XN(Desc) ((((Desc) & TT_DESCRIPTOR_SECTION_XN_MASK) >> 4) & TT_DESCRIPTOR_PAGE_XN_MASK) -#define TT_DESCRIPTOR_CONVERT_TO_PAGE_CACHE_POLICY(Desc) ((((Desc) & (0x3 << 12)) >> 6) | (Desc & (0x3 << 2))) - -#define TT_DESCRIPTOR_CONVERT_TO_SECTION_AP(Desc) ((((Desc) & TT_DESCRIPTOR_PAGE_AP_MASK) << 6) & TT_DESCRIPTOR_SECTION_AP_MASK) -#define TT_DESCRIPTOR_CONVERT_TO_SECTION_S(Desc) ((((Desc) & TT_DESCRIPTOR_PAGE_S_MASK) << 6) & TT_DESCRIPTOR_SECTION_S_MASK) -#define TT_DESCRIPTOR_CONVERT_TO_SECTION_AF(Desc) ((((Desc) & TT_DESCRIPTOR_PAGE_AF) << 6) & TT_DESCRIPTOR_SECTION_AF) -#define TT_DESCRIPTOR_CONVERT_TO_SECTION_XN(Desc) ((((Desc) & TT_DESCRIPTOR_PAGE_XN_MASK) << 4) & TT_DESCRIPTOR_SECTION_XN_MASK) -#define TT_DESCRIPTOR_CONVERT_TO_SECTION_CACHE_POLICY(Desc) ((((Desc) & (0x3 << 6)) << 6) | (Desc & (0x3 << 2))) - -#define TT_DESCRIPTOR_SECTION_ATTRIBUTE_MASK (TT_DESCRIPTOR_SECTION_NS_MASK | TT_DESCRIPTOR_SECTION_NG_MASK | \ - TT_DESCRIPTOR_SECTION_S_MASK | TT_DESCRIPTOR_SECTION_AP_MASK | \ - TT_DESCRIPTOR_SECTION_AF | \ - TT_DESCRIPTOR_SECTION_XN_MASK | TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK) - -#define TT_DESCRIPTOR_PAGE_ATTRIBUTE_MASK (TT_DESCRIPTOR_PAGE_NG_MASK | TT_DESCRIPTOR_PAGE_S_MASK | \ - TT_DESCRIPTOR_PAGE_AP_MASK | TT_DESCRIPTOR_PAGE_XN_MASK | \ - TT_DESCRIPTOR_PAGE_AF | \ - TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK) - -#define TT_DESCRIPTOR_SECTION_DOMAIN_MASK (0x0FUL << 5) -#define TT_DESCRIPTOR_SECTION_DOMAIN(a) (((a) & 0x0FUL) << 5) - -#define TT_DESCRIPTOR_SECTION_BASE_ADDRESS_MASK (0xFFF00000) -#define TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK (0xFFFFFC00) -#define TT_DESCRIPTOR_SECTION_BASE_ADDRESS(a) ((a) & TT_DESCRIPTOR_SECTION_BASE_ADDRESS_MASK) -#define TT_DESCRIPTOR_SECTION_BASE_SHIFT 20 - -#define TT_DESCRIPTOR_PAGE_BASE_ADDRESS_MASK (0xFFFFF000) -#define TT_DESCRIPTOR_PAGE_INDEX_MASK (0x000FF000) -#define TT_DESCRIPTOR_PAGE_BASE_ADDRESS(a) ((a) & TT_DESCRIPTOR_PAGE_BASE_ADDRESS_MASK) -#define TT_DESCRIPTOR_PAGE_BASE_SHIFT 12 - -#define TT_DESCRIPTOR_SECTION_DEFAULT (TT_DESCRIPTOR_SECTION_TYPE_SECTION | \ - TT_DESCRIPTOR_SECTION_NG_GLOBAL | \ - TT_DESCRIPTOR_SECTION_S_SHARED | \ - TT_DESCRIPTOR_SECTION_DOMAIN(0) | \ - TT_DESCRIPTOR_SECTION_AP_RW_RW | \ - TT_DESCRIPTOR_SECTION_AF) - -#define TT_DESCRIPTOR_SECTION_WRITE_BACK (TT_DESCRIPTOR_SECTION_DEFAULT | \ - TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_BACK_ALLOC) - -#define TT_DESCRIPTOR_SECTION_WRITE_THROUGH (TT_DESCRIPTOR_SECTION_DEFAULT | \ - TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC) - -#define TT_DESCRIPTOR_SECTION_DEVICE (TT_DESCRIPTOR_SECTION_DEFAULT | \ - TT_DESCRIPTOR_SECTION_CACHE_POLICY_SHAREABLE_DEVICE) - -#define TT_DESCRIPTOR_SECTION_UNCACHED (TT_DESCRIPTOR_SECTION_DEFAULT | \ - TT_DESCRIPTOR_SECTION_CACHE_POLICY_NON_CACHEABLE) - -#define TT_DESCRIPTOR_PAGE_WRITE_BACK (TT_DESCRIPTOR_PAGE_TYPE_PAGE | \ - TT_DESCRIPTOR_PAGE_NG_GLOBAL | \ - TT_DESCRIPTOR_PAGE_S_SHARED | \ - TT_DESCRIPTOR_PAGE_AP_RW_RW | \ - TT_DESCRIPTOR_PAGE_AF | \ - TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_BACK_ALLOC) -#define TT_DESCRIPTOR_PAGE_WRITE_THROUGH (TT_DESCRIPTOR_PAGE_TYPE_PAGE | \ - TT_DESCRIPTOR_PAGE_NG_GLOBAL | \ - TT_DESCRIPTOR_PAGE_S_SHARED | \ - TT_DESCRIPTOR_PAGE_AP_RW_RW | \ - TT_DESCRIPTOR_PAGE_AF | \ - TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC) -#define TT_DESCRIPTOR_PAGE_DEVICE (TT_DESCRIPTOR_PAGE_TYPE_PAGE | \ - TT_DESCRIPTOR_PAGE_NG_GLOBAL | \ - TT_DESCRIPTOR_PAGE_S_NOT_SHARED | \ - TT_DESCRIPTOR_PAGE_AP_RW_RW | \ - TT_DESCRIPTOR_PAGE_AF | \ - TT_DESCRIPTOR_PAGE_XN_MASK | \ - TT_DESCRIPTOR_PAGE_CACHE_POLICY_SHAREABLE_DEVICE) -#define TT_DESCRIPTOR_PAGE_UNCACHED (TT_DESCRIPTOR_PAGE_TYPE_PAGE | \ - TT_DESCRIPTOR_PAGE_NG_GLOBAL | \ - TT_DESCRIPTOR_PAGE_S_NOT_SHARED | \ - TT_DESCRIPTOR_PAGE_AP_RW_RW | \ - TT_DESCRIPTOR_PAGE_AF | \ - TT_DESCRIPTOR_PAGE_CACHE_POLICY_NON_CACHEABLE) - -// First Level Descriptors -typedef UINT32 ARM_FIRST_LEVEL_DESCRIPTOR; - -// Second Level Descriptors -typedef UINT32 ARM_PAGE_TABLE_ENTRY; - -UINT32 -ConvertSectionAttributesToPageAttributes ( - IN UINT32 SectionAttributes - ); - -#endif // ARMV7_MMU_H_ diff --git a/MdePkg/Include/Arm/AsmMacroLib.h b/MdePkg/Include/Arm/AsmMacroLib.h deleted file mode 100644 index 2493a15b7b1b..000000000000 --- a/MdePkg/Include/Arm/AsmMacroLib.h +++ /dev/null @@ -1,38 +0,0 @@ -/** @file - Macros to work around lack of Apple support for LDR register, =expr - - Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
- Copyright (c) 2011-2012, ARM Ltd. All rights reserved.
- Copyright (c) 2016, Linaro Ltd. All rights reserved.
- - SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#ifndef ASM_MACRO_IO_LIB_H_ -#define ASM_MACRO_IO_LIB_H_ - -#define _ASM_FUNC(Name, Section) \ - .global Name ; \ - .section #Section, "ax" ; \ - .type Name, %function ; \ - .p2align 2 ; \ - Name: - -#define ASM_FUNC(Name) _ASM_FUNC(ASM_PFX(Name), .text. ## Name) - -#define MOV32(Reg, Val) \ - movw Reg, #(Val) & 0xffff ; \ - movt Reg, #(Val) >> 16 - -#define ADRL(Reg, Sym) \ - movw Reg, #:lower16:(Sym) - (. + 16) ; \ - movt Reg, #:upper16:(Sym) - (. + 12) ; \ - add Reg, Reg, pc - -#define LDRL(Reg, Sym) \ - movw Reg, #:lower16:(Sym) - (. + 16) ; \ - movt Reg, #:upper16:(Sym) - (. + 12) ; \ - ldr Reg, [pc, Reg] - -#endif // ASM_MACRO_IO_LIB_H_ diff --git a/MdePkg/Include/Arm/ProcessorBind.h b/MdePkg/Include/Arm/ProcessorBind.h deleted file mode 100644 index 3d924f19a35d..000000000000 --- a/MdePkg/Include/Arm/ProcessorBind.h +++ /dev/null @@ -1,238 +0,0 @@ -/** @file - Processor or Compiler specific defines and types for ARM. - - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
- Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
- SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#ifndef __PROCESSOR_BIND_H__ -#define __PROCESSOR_BIND_H__ - -/// -/// Define the processor type so other code can make processor based choices -/// -#define MDE_CPU_ARM - -// -// Make sure we are using the correct packing rules per EFI specification -// -#if !defined (__GNUC__) && !defined (__ASSEMBLER__) - #pragma pack() -#endif - -#if defined (_MSC_EXTENSIONS) - -// -// Disable some level 4 compilation warnings (same as IA32 and X64) -// - -// -// Disabling bitfield type checking warnings. -// - #pragma warning ( disable : 4214 ) - -// -// Disabling the unreferenced formal parameter warnings. -// - #pragma warning ( disable : 4100 ) - -// -// Disable slightly different base types warning as CHAR8 * can not be set -// to a constant string. -// - #pragma warning ( disable : 4057 ) - -// -// ASSERT(FALSE) or while (TRUE) are legal constructs so suppress this warning -// - #pragma warning ( disable : 4127 ) - -// -// This warning is caused by functions defined but not used. For precompiled header only. -// - #pragma warning ( disable : 4505 ) - -// -// This warning is caused by empty (after preprocessing) source file. For precompiled header only. -// - #pragma warning ( disable : 4206 ) - -// -// Disable 'potentially uninitialized local variable X used' warnings -// - #pragma warning ( disable : 4701 ) - -// -// Disable 'potentially uninitialized local pointer variable X used' warnings -// - #pragma warning ( disable : 4703 ) - -#endif - -// -// MSFT doesn't support the __builtin_unreachable() macro -// -#if defined (_MSC_EXTENSIONS) -#define UNREACHABLE() -#endif - -#if defined (_MSC_EXTENSIONS) -// -// use Microsoft* C compiler dependent integer width types -// -typedef unsigned __int64 UINT64; -typedef __int64 INT64; -typedef unsigned __int32 UINT32; -typedef __int32 INT32; -typedef unsigned short UINT16; -typedef unsigned short CHAR16; -typedef short INT16; -typedef unsigned char BOOLEAN; -typedef unsigned char UINT8; -typedef char CHAR8; -typedef signed char INT8; -#else -// -// Assume standard ARM alignment. -// Need to check portability of long long -// -typedef unsigned long long UINT64; -typedef long long INT64; -typedef unsigned int UINT32; -typedef int INT32; -typedef unsigned short UINT16; -typedef unsigned short CHAR16; -typedef short INT16; -typedef unsigned char BOOLEAN; -typedef unsigned char UINT8; -typedef char CHAR8; -typedef signed char INT8; -#endif - -/// -/// Unsigned value of native width. (4 bytes on supported 32-bit processor instructions, -/// 8 bytes on supported 64-bit processor instructions) -/// -typedef UINT32 UINTN; - -/// -/// Signed value of native width. (4 bytes on supported 32-bit processor instructions, -/// 8 bytes on supported 64-bit processor instructions) -/// -typedef INT32 INTN; - -// -// Processor specific defines -// - -/// -/// A value of native width with the highest bit set. -/// -#define MAX_BIT 0x80000000 - -/// -/// A value of native width with the two highest bits set. -/// -#define MAX_2_BITS 0xC0000000 - -/// -/// Maximum legal ARM address -/// -#define MAX_ADDRESS 0xFFFFFFFF - -/// -/// Maximum usable address at boot time -/// -#define MAX_ALLOC_ADDRESS MAX_ADDRESS - -/// -/// Maximum legal ARM INTN and UINTN values. -/// -#define MAX_INTN ((INTN)0x7FFFFFFF) -#define MAX_UINTN ((UINTN)0xFFFFFFFF) - -/// -/// Minimum legal ARM INTN value. -/// -#define MIN_INTN (((INTN)-2147483647) - 1) - -/// -/// The stack alignment required for ARM -/// -#define CPU_STACK_ALIGNMENT sizeof(UINT64) - -/// -/// Page allocation granularity for ARM -/// -#define DEFAULT_PAGE_ALLOCATION_GRANULARITY (0x1000) -#define RUNTIME_PAGE_ALLOCATION_GRANULARITY (0x1000) - -// -// Modifier to ensure that all protocol member functions and EFI intrinsics -// use the correct C calling convention. All protocol member functions and -// EFI intrinsics are required to modify their member functions with EFIAPI. -// -#define EFIAPI - -// When compiling with Clang, we still use GNU as for the assembler, so we still -// need to define the GCC_ASM* macros. -#if defined (__GNUC__) || defined (__clang__) -/// -/// For GNU assembly code, .global or .globl can declare global symbols. -/// Define this macro to unify the usage. -/// -#define ASM_GLOBAL .globl - - #if !defined (__APPLE__) -/// -/// ARM EABI defines that the linker should not manipulate call relocations -/// (do bl/blx conversion) unless the target symbol has function type. -/// CodeSourcery 2010.09 started requiring the .type to function properly -/// -#define INTERWORK_FUNC(func__) .type ASM_PFX(func__), %function - -#define GCC_ASM_EXPORT(func__) \ - .global _CONCATENATE (__USER_LABEL_PREFIX__, func__) ;\ - .type ASM_PFX(func__), %function - -#define GCC_ASM_IMPORT(func__) \ - .extern _CONCATENATE (__USER_LABEL_PREFIX__, func__) - - #else -// -// .type not supported by Apple Xcode tools -// -#define INTERWORK_FUNC(func__) - -#define GCC_ASM_EXPORT(func__) \ - .globl _CONCATENATE (__USER_LABEL_PREFIX__, func__) \ - -#define GCC_ASM_IMPORT(name) - - #endif -#elif defined (_MSC_EXTENSIONS) -// -// PRESERVE8 is not supported by the MSFT assembler. -// -#define PRESERVE8 -#endif - -/** - Return the pointer to the first instruction of a function given a function pointer. - On ARM CPU architectures, these two pointer values are the same, - so the implementation of this macro is very simple. - - @param FunctionPointer A pointer to a function. - - @return The pointer to the first instruction of a function given a function pointer. - -**/ -#define FUNCTION_ENTRY_POINT(FunctionPointer) (VOID *)(UINTN)(FunctionPointer) - -#ifndef __USER_LABEL_PREFIX__ -#define __USER_LABEL_PREFIX__ -#endif - -#endif diff --git a/MdePkg/Include/Guid/Cper.h b/MdePkg/Include/Guid/Cper.h index be6b86382703..4a31d343996a 100644 --- a/MdePkg/Include/Guid/Cper.h +++ b/MdePkg/Include/Guid/Cper.h @@ -262,18 +262,16 @@ typedef struct { ///@{ #define EFI_GENERIC_ERROR_PROC_TYPE_IA32_X64 0x00 #define EFI_GENERIC_ERROR_PROC_TYPE_IA64 0x01 -#define EFI_GENERIC_ERROR_PROC_TYPE_ARM 0x02 ///@} /// /// The type of the instruction set executing when the error occurred in Proessor /// Generic Error section. ///@{ -#define EFI_GENERIC_ERROR_PROC_ISA_IA32 0x00 -#define EFI_GENERIC_ERROR_PROC_ISA_IA64 0x01 -#define EFI_GENERIC_ERROR_PROC_ISA_X64 0x02 -#define EFI_GENERIC_ERROR_PROC_ISA_ARM_A32_T32 0x03 -#define EFI_GENERIC_ERROR_PROC_ISA_ARM_A64 0x04 +#define EFI_GENERIC_ERROR_PROC_ISA_IA32 0x00 +#define EFI_GENERIC_ERROR_PROC_ISA_IA64 0x01 +#define EFI_GENERIC_ERROR_PROC_ISA_X64 0x02 +#define EFI_GENERIC_ERROR_PROC_ISA_ARM_A64 0x04 ///@} /// diff --git a/MdePkg/Include/Library/ArmLib.h b/MdePkg/Include/Library/ArmLib.h index 52ff1b86b9fe..d0789955419d 100644 --- a/MdePkg/Include/Library/ArmLib.h +++ b/MdePkg/Include/Library/ArmLib.h @@ -12,14 +12,7 @@ #define ARM_LIB_H_ #include - -#ifdef MDE_CPU_ARM - #include -#elif defined (MDE_CPU_AARCH64) - #include -#else - #error "Unknown chipset." -#endif +#include #define EFI_MEMORY_CACHETYPE_MASK (EFI_MEMORY_UC | EFI_MEMORY_WC | \ EFI_MEMORY_WT | EFI_MEMORY_WB | \ @@ -722,7 +715,6 @@ ArmHasCcidx ( VOID ); -#ifdef MDE_CPU_AARCH64 /// /// AArch64-only ID Register Helper functions /// @@ -763,25 +755,4 @@ ArmHasEte ( VOID ); -#endif // MDE_CPU_AARCH64 - -#ifdef MDE_CPU_ARM -/// -/// AArch32-only ID Register Helper functions -/// - -/** - Check whether the CPU supports the Security extensions - - @return Whether the Security extensions are implemented - -**/ -BOOLEAN -EFIAPI -ArmHasSecurityExtensions ( - VOID - ); - -#endif // MDE_CPU_ARM - #endif // ARM_LIB_H_ diff --git a/MdePkg/Include/Library/BaseLib.h b/MdePkg/Include/Library/BaseLib.h index db11732c8b9d..b50a1d5ecda5 100644 --- a/MdePkg/Include/Library/BaseLib.h +++ b/MdePkg/Include/Library/BaseLib.h @@ -77,26 +77,6 @@ typedef struct { #endif // defined (MDE_CPU_EBC) -#if defined (MDE_CPU_ARM) - -typedef struct { - UINT32 R3; ///< A copy of R13. - UINT32 R4; - UINT32 R5; - UINT32 R6; - UINT32 R7; - UINT32 R8; - UINT32 R9; - UINT32 R10; - UINT32 R11; - UINT32 R12; - UINT32 R14; -} BASE_LIBRARY_JUMP_BUFFER; - -#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 4 - -#endif // defined (MDE_CPU_ARM) - #if defined (MDE_CPU_AARCH64) typedef struct { // GP regs diff --git a/MdePkg/Include/Pi/PiStatusCode.h b/MdePkg/Include/Pi/PiStatusCode.h index c083a1bb5224..99f3e0689521 100644 --- a/MdePkg/Include/Pi/PiStatusCode.h +++ b/MdePkg/Include/Pi/PiStatusCode.h @@ -15,7 +15,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #define __PI_STATUS_CODE_H__ // -// Required for IA32, X64, IPF, ARM and EBC defines for CPU exception types +// Required for IA32, X64, IPF, and EBC defines for CPU exception types // #include diff --git a/MdePkg/Include/Protocol/DebugSupport.h b/MdePkg/Include/Protocol/DebugSupport.h index fced5c759f00..bdcfc20c26a9 100644 --- a/MdePkg/Include/Protocol/DebugSupport.h +++ b/MdePkg/Include/Protocol/DebugSupport.h @@ -849,7 +849,6 @@ typedef enum { IsaX64 = IMAGE_FILE_MACHINE_X64, ///< 0x8664 IsaIpf = IMAGE_FILE_MACHINE_IA64, ///< 0x0200 IsaEbc = IMAGE_FILE_MACHINE_EBC, ///< 0x0EBC - IsaArm = IMAGE_FILE_MACHINE_ARMTHUMB_MIXED, ///< 0x01c2 IsaAArch64 = IMAGE_FILE_MACHINE_ARM64 ///< 0xAA64 } EFI_INSTRUCTION_SET_ARCHITECTURE; diff --git a/MdePkg/Include/Protocol/PxeBaseCode.h b/MdePkg/Include/Protocol/PxeBaseCode.h index 239e742940d6..55c943a54bc6 100644 --- a/MdePkg/Include/Protocol/PxeBaseCode.h +++ b/MdePkg/Include/Protocol/PxeBaseCode.h @@ -153,8 +153,6 @@ typedef UINT16 EFI_PXE_BASE_CODE_UDP_PORT; #define EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE 0x0006 #elif defined (MDE_CPU_X64) #define EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE 0x0007 -#elif defined (MDE_CPU_ARM) -#define EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE 0x000A #elif defined (MDE_CPU_AARCH64) #define EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE 0x000B #elif defined (MDE_CPU_RISCV64) diff --git a/MdePkg/Include/Uefi/UefiBaseType.h b/MdePkg/Include/Uefi/UefiBaseType.h index df9a0d37090c..9ebc67d55737 100644 --- a/MdePkg/Include/Uefi/UefiBaseType.h +++ b/MdePkg/Include/Uefi/UefiBaseType.h @@ -232,11 +232,6 @@ typedef union { /// #define EFI_IMAGE_MACHINE_X64 0x8664 -/// -/// PE32+ Machine type for ARM mixed ARM and Thumb/Thumb2 images. -/// -#define EFI_IMAGE_MACHINE_ARMTHUMB_MIXED 0x01C2 - /// /// PE32+ Machine type for AARCH64 A64 images. /// @@ -270,12 +265,6 @@ typedef union { #define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) ((Machine) == EFI_IMAGE_MACHINE_IA32) - #elif defined (MDE_CPU_ARM) - -#define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) ((Machine) == EFI_IMAGE_MACHINE_ARMTHUMB_MIXED) - -#define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) (FALSE) - #elif defined (MDE_CPU_AARCH64) #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \ diff --git a/MdePkg/Include/Uefi/UefiSpec.h b/MdePkg/Include/Uefi/UefiSpec.h index bb395a2cb261..e0b91c242d7e 100644 --- a/MdePkg/Include/Uefi/UefiSpec.h +++ b/MdePkg/Include/Uefi/UefiSpec.h @@ -2267,7 +2267,7 @@ typedef struct { #define EFI_REMOVABLE_MEDIA_FILE_NAME_IA32 L"\\EFI\\BOOT\\BOOTIA32.EFI" #define EFI_REMOVABLE_MEDIA_FILE_NAME_IA64 L"\\EFI\\BOOT\\BOOTIA64.EFI" #define EFI_REMOVABLE_MEDIA_FILE_NAME_X64 L"\\EFI\\BOOT\\BOOTX64.EFI" -#define EFI_REMOVABLE_MEDIA_FILE_NAME_ARM L"\\EFI\\BOOT\\BOOTARM.EFI" +#define EFI_REMOVABLE_MEDIA_FILE_NAME_EBC L"\\EFI\\BOOT\\BOOTARM.EFI" #define EFI_REMOVABLE_MEDIA_FILE_NAME_AARCH64 L"\\EFI\\BOOT\\BOOTAA64.EFI" #define EFI_REMOVABLE_MEDIA_FILE_NAME_RISCV64 L"\\EFI\\BOOT\\BOOTRISCV64.EFI" #define EFI_REMOVABLE_MEDIA_FILE_NAME_LOONGARCH64 L"\\EFI\\BOOT\\BOOTLOONGARCH64.EFI" @@ -2278,8 +2278,7 @@ typedef struct { #elif defined (MDE_CPU_X64) #define EFI_REMOVABLE_MEDIA_FILE_NAME EFI_REMOVABLE_MEDIA_FILE_NAME_X64 #elif defined (MDE_CPU_EBC) - #elif defined (MDE_CPU_ARM) -#define EFI_REMOVABLE_MEDIA_FILE_NAME EFI_REMOVABLE_MEDIA_FILE_NAME_ARM +#define EFI_REMOVABLE_MEDIA_FILE_NAME EFI_REMOVABLE_MEDIA_FILE_NAME_EBC #elif defined (MDE_CPU_AARCH64) #define EFI_REMOVABLE_MEDIA_FILE_NAME EFI_REMOVABLE_MEDIA_FILE_NAME_AARCH64 #elif defined (MDE_CPU_RISCV64) diff --git a/MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.inf b/MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.inf index 256df1373eee..2f9ec5418a27 100644 --- a/MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.inf +++ b/MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.inf @@ -16,10 +16,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = ArmTrngLib -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 -# - [Sources] BaseArmTrngLibNull.c diff --git a/MdePkg/Library/BaseCacheMaintenanceLib/BaseCacheMaintenanceLib.inf b/MdePkg/Library/BaseCacheMaintenanceLib/BaseCacheMaintenanceLib.inf index 601a38d6c109..8f06f7d1705f 100644 --- a/MdePkg/Library/BaseCacheMaintenanceLib/BaseCacheMaintenanceLib.inf +++ b/MdePkg/Library/BaseCacheMaintenanceLib/BaseCacheMaintenanceLib.inf @@ -25,7 +25,7 @@ # -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 RISCV64 LOONGARCH64 +# VALID_ARCHITECTURES = IA32 X64 EBC AARCH64 RISCV64 LOONGARCH64 # [Sources.IA32] @@ -37,9 +37,6 @@ [Sources.EBC] EbcCache.c -[Sources.ARM] - ArmCache.c - [Sources.AARCH64] ArmCache.c diff --git a/MdePkg/Library/BaseCacheMaintenanceLibNull/BaseCacheMaintenanceLibNull.inf b/MdePkg/Library/BaseCacheMaintenanceLibNull/BaseCacheMaintenanceLibNull.inf index 8d6eaaeaa09e..d21d89230f6b 100644 --- a/MdePkg/Library/BaseCacheMaintenanceLibNull/BaseCacheMaintenanceLibNull.inf +++ b/MdePkg/Library/BaseCacheMaintenanceLibNull/BaseCacheMaintenanceLibNull.inf @@ -15,10 +15,6 @@ VERSION_STRING = 1.1 LIBRARY_CLASS = CacheMaintenanceLib -# -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 -# - [Sources] BaseCacheMaintenanceLibNull.c diff --git a/MdePkg/Library/BaseCpuLibNull/BaseCpuLibNull.inf b/MdePkg/Library/BaseCpuLibNull/BaseCpuLibNull.inf index 9f20d6833f56..580d00a050c9 100644 --- a/MdePkg/Library/BaseCpuLibNull/BaseCpuLibNull.inf +++ b/MdePkg/Library/BaseCpuLibNull/BaseCpuLibNull.inf @@ -15,10 +15,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = CpuLib -# -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 RISCV64 -# - [Sources] BaseCpuLibNull.c diff --git a/MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf b/MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf index eac88cf713f8..6e6998b7ce33 100644 --- a/MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf +++ b/MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf @@ -21,7 +21,7 @@ # -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 +# VALID_ARCHITECTURES = IA32 X64 EBC AARCH64 # [Sources] diff --git a/MdePkg/Library/BasePciLibPciExpress/BasePciLibPciExpress.inf b/MdePkg/Library/BasePciLibPciExpress/BasePciLibPciExpress.inf index 488db9fd8ed6..8ddadc85e9fa 100644 --- a/MdePkg/Library/BasePciLibPciExpress/BasePciLibPciExpress.inf +++ b/MdePkg/Library/BasePciLibPciExpress/BasePciLibPciExpress.inf @@ -20,11 +20,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = PciLib - -# -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 -# - [Sources] PciLib.c diff --git a/MdePkg/Library/BaseRngLibNull/BaseRngLibNull.inf b/MdePkg/Library/BaseRngLibNull/BaseRngLibNull.inf index f21e20a9cca8..7db6a7b1b23c 100644 --- a/MdePkg/Library/BaseRngLibNull/BaseRngLibNull.inf +++ b/MdePkg/Library/BaseRngLibNull/BaseRngLibNull.inf @@ -16,10 +16,6 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = RngLib -# -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 EBC -# - [Sources] BaseRngLibNull.c diff --git a/MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf b/MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf index 9d039f2e5b43..d851ded9a492 100644 --- a/MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf +++ b/MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf @@ -26,13 +26,13 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64 LOONGARCH64 +# VALID_ARCHITECTURES = IA32 X64 AARCH64 RISCV64 LOONGARCH64 # [Sources] SafeIntLib.c -[Sources.Ia32, Sources.ARM] +[Sources.Ia32] SafeIntLib32.c [Sources.X64, Sources.AARCH64, Sources.RISCV64, Sources.LOONGARCH64] diff --git a/MdePkg/Library/DxeRuntimeDebugLibSerialPort/DxeRuntimeDebugLibSerialPort.inf b/MdePkg/Library/DxeRuntimeDebugLibSerialPort/DxeRuntimeDebugLibSerialPort.inf index 31d169ad7c07..0727f8aab218 100644 --- a/MdePkg/Library/DxeRuntimeDebugLibSerialPort/DxeRuntimeDebugLibSerialPort.inf +++ b/MdePkg/Library/DxeRuntimeDebugLibSerialPort/DxeRuntimeDebugLibSerialPort.inf @@ -23,10 +23,6 @@ CONSTRUCTOR = DxeRuntimeDebugLibSerialPortConstructor DESTRUCTOR = DxeRuntimeDebugLibSerialPortDestructor -# -# VALID_ARCHITECTURES = AARCH64 ARM IA32 X64 EBC -# - [Sources] DebugLib.c diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index 61f0c217a028..31fce983aafd 100644 --- a/MdePkg/MdePkg.dec +++ b/MdePkg/MdePkg.dec @@ -41,9 +41,6 @@ [Includes.EBC] Include/Ebc -[Includes.ARM] - Include/Arm - [Includes.AARCH64] Include/AArch64 @@ -345,7 +342,7 @@ TdxLib|Include/Library/TdxLib.h [LibraryClasses.X64] - ## @libraryclass Defines a set of interfaces for the MM core entrypoint. The ARM/AARCH64 version lives in ArmPkg + ## @libraryclass Defines a set of interfaces for the MM core entrypoint. The AARCH64 version lives in ArmPkg # StandaloneMmCoreEntryPoint|Include/Library/StandaloneMmCoreEntryPoint.h @@ -353,7 +350,7 @@ ## @libraryclass Provides function to make ecalls to SBI BaseRiscVSbiLib|Include/Library/BaseRiscVSbiLib.h -[LibraryClasses.ARM, LibraryClasses.AARCH64] +[LibraryClasses.AARCH64] ## @libraryclass Provides an interface to Arm registers. # ArmLib|Include/Library/ArmLib.h diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc index d14a3326784b..17ccd35b251a 100644 --- a/MdePkg/MdePkg.dsc +++ b/MdePkg/MdePkg.dsc @@ -16,7 +16,7 @@ PLATFORM_VERSION = 1.08 DSC_SPECIFICATION = 0x00010005 OUTPUT_DIRECTORY = Build/Mde - SUPPORTED_ARCHITECTURES = IA32|X64|EBC|ARM|AARCH64|RISCV64|LOONGARCH64 + SUPPORTED_ARCHITECTURES = IA32|X64|EBC|AARCH64|RISCV64|LOONGARCH64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT @@ -144,7 +144,7 @@ MdePkg/Library/DynamicStackCookieEntryPointLib/UefiApplicationEntryPoint.inf MdePkg/Library/DynamicStackCookieEntryPointLib/UefiDriverEntryPoint.inf -[Components.IA32, Components.X64, Components.ARM, Components.AARCH64] +[Components.IA32, Components.X64, Components.AARCH64] # # Add UEFI Target Based Unit Tests # @@ -200,7 +200,7 @@ MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf -[Components.ARM, Components.AARCH64] +[Components.AARCH64] MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsicArmVirt.inf MdePkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf MdePkg/Library/ArmSmcLib/ArmSmcLib.inf From 49b3eb5907f1a1c17b202cb2195da6fff59ca7dc Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 14:08:25 -0700 Subject: [PATCH 0554/1172] MdePkg: Remove ARM32 Support from BaseLib edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from BaseLib. Signed-off-by: Oliver Smith-Denny --- MdePkg/Include/Base.h | 2 +- .../{Arm => AArch64}/InternalSwitchStack.c | 0 .../BaseLib/{Arm => AArch64}/Unaligned.c | 0 MdePkg/Library/BaseLib/Arm/CpuBreakpoint.S | 30 -- MdePkg/Library/BaseLib/Arm/CpuBreakpoint.asm | 35 --- MdePkg/Library/BaseLib/Arm/CpuPause.asm | 35 --- .../Library/BaseLib/Arm/DisableInterrupts.S | 29 -- .../Library/BaseLib/Arm/DisableInterrupts.asm | 31 --- MdePkg/Library/BaseLib/Arm/EnableInterrupts.S | 30 -- .../Library/BaseLib/Arm/EnableInterrupts.asm | 31 --- .../Library/BaseLib/Arm/GetInterruptsState.S | 37 --- .../BaseLib/Arm/GetInterruptsState.asm | 39 --- MdePkg/Library/BaseLib/Arm/Math64.S | 263 ------------------ MdePkg/Library/BaseLib/Arm/MemoryFence.S | 33 --- MdePkg/Library/BaseLib/Arm/MemoryFence.asm | 33 --- MdePkg/Library/BaseLib/Arm/SetJumpLongJump.S | 65 ----- .../Library/BaseLib/Arm/SetJumpLongJump.asm | 65 ----- .../Library/BaseLib/Arm/SpeculationBarrier.S | 33 --- .../BaseLib/Arm/SpeculationBarrier.asm | 33 --- MdePkg/Library/BaseLib/Arm/SwitchStack.S | 62 ----- MdePkg/Library/BaseLib/Arm/SwitchStack.asm | 39 --- MdePkg/Library/BaseLib/BaseLib.inf | 32 +-- .../Library/BaseLib/UnitTestHostBaseLib.inf | 23 +- 23 files changed, 6 insertions(+), 974 deletions(-) rename MdePkg/Library/BaseLib/{Arm => AArch64}/InternalSwitchStack.c (100%) rename MdePkg/Library/BaseLib/{Arm => AArch64}/Unaligned.c (100%) delete mode 100644 MdePkg/Library/BaseLib/Arm/CpuBreakpoint.S delete mode 100644 MdePkg/Library/BaseLib/Arm/CpuBreakpoint.asm delete mode 100644 MdePkg/Library/BaseLib/Arm/CpuPause.asm delete mode 100644 MdePkg/Library/BaseLib/Arm/DisableInterrupts.S delete mode 100644 MdePkg/Library/BaseLib/Arm/DisableInterrupts.asm delete mode 100644 MdePkg/Library/BaseLib/Arm/EnableInterrupts.S delete mode 100644 MdePkg/Library/BaseLib/Arm/EnableInterrupts.asm delete mode 100644 MdePkg/Library/BaseLib/Arm/GetInterruptsState.S delete mode 100644 MdePkg/Library/BaseLib/Arm/GetInterruptsState.asm delete mode 100755 MdePkg/Library/BaseLib/Arm/Math64.S delete mode 100644 MdePkg/Library/BaseLib/Arm/MemoryFence.S delete mode 100644 MdePkg/Library/BaseLib/Arm/MemoryFence.asm delete mode 100644 MdePkg/Library/BaseLib/Arm/SetJumpLongJump.S delete mode 100644 MdePkg/Library/BaseLib/Arm/SetJumpLongJump.asm delete mode 100644 MdePkg/Library/BaseLib/Arm/SpeculationBarrier.S delete mode 100644 MdePkg/Library/BaseLib/Arm/SpeculationBarrier.asm delete mode 100644 MdePkg/Library/BaseLib/Arm/SwitchStack.S delete mode 100644 MdePkg/Library/BaseLib/Arm/SwitchStack.asm diff --git a/MdePkg/Include/Base.h b/MdePkg/Include/Base.h index ee5940a2d102..0ce635c3b94b 100644 --- a/MdePkg/Include/Base.h +++ b/MdePkg/Include/Base.h @@ -578,7 +578,7 @@ struct _LIST_ENTRY { **/ #define _INT_SIZE_OF(n) ((sizeof (n) + sizeof (UINTN) - 1) &~(sizeof (UINTN) - 1)) -#if defined (_M_ARM) || defined (_M_ARM64) +#if defined (_M_ARM64) // // MSFT ARM variable argument list support. // diff --git a/MdePkg/Library/BaseLib/Arm/InternalSwitchStack.c b/MdePkg/Library/BaseLib/AArch64/InternalSwitchStack.c similarity index 100% rename from MdePkg/Library/BaseLib/Arm/InternalSwitchStack.c rename to MdePkg/Library/BaseLib/AArch64/InternalSwitchStack.c diff --git a/MdePkg/Library/BaseLib/Arm/Unaligned.c b/MdePkg/Library/BaseLib/AArch64/Unaligned.c similarity index 100% rename from MdePkg/Library/BaseLib/Arm/Unaligned.c rename to MdePkg/Library/BaseLib/AArch64/Unaligned.c diff --git a/MdePkg/Library/BaseLib/Arm/CpuBreakpoint.S b/MdePkg/Library/BaseLib/Arm/CpuBreakpoint.S deleted file mode 100644 index 3bc2246a83ec..000000000000 --- a/MdePkg/Library/BaseLib/Arm/CpuBreakpoint.S +++ /dev/null @@ -1,30 +0,0 @@ -#------------------------------------------------------------------------------ -# -# CpuBreakpoint() for ARM -# -# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-# Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -.text -.p2align 2 -GCC_ASM_EXPORT(CpuBreakpoint) - -#/** -# Generates a breakpoint on the CPU. -# -# Generates a breakpoint on the CPU. The breakpoint must be implemented such -# that code can resume normal execution after the breakpoint. -# -#**/ -#VOID -#EFIAPI -#CpuBreakpoint ( -# VOID -# ); -# -ASM_PFX(CpuBreakpoint): - swi 0xdbdbdb - bx lr diff --git a/MdePkg/Library/BaseLib/Arm/CpuBreakpoint.asm b/MdePkg/Library/BaseLib/Arm/CpuBreakpoint.asm deleted file mode 100644 index baf6d2783ded..000000000000 --- a/MdePkg/Library/BaseLib/Arm/CpuBreakpoint.asm +++ /dev/null @@ -1,35 +0,0 @@ -;------------------------------------------------------------------------------ -; -; CpuBreakpoint() for ARM -; -; Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-; Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-; SPDX-License-Identifier: BSD-2-Clause-Patent -; -;------------------------------------------------------------------------------ - - EXPORT CpuBreakpoint - -; Force ARM mode for this section, as MSFT assembler defaults to THUMB - AREA Cpu_Breakpoint, CODE, READONLY, ARM - - ARM - -;/** -; Generates a breakpoint on the CPU. -; -; Generates a breakpoint on the CPU. The breakpoint must be implemented such -; that code can resume normal execution after the breakpoint. -; -;**/ -;VOID -;EFIAPI -;CpuBreakpoint ( -; VOID -; ); -; -CpuBreakpoint - swi 0xdbdbdb - bx lr - - END diff --git a/MdePkg/Library/BaseLib/Arm/CpuPause.asm b/MdePkg/Library/BaseLib/Arm/CpuPause.asm deleted file mode 100644 index a16223c7f854..000000000000 --- a/MdePkg/Library/BaseLib/Arm/CpuPause.asm +++ /dev/null @@ -1,35 +0,0 @@ -;------------------------------------------------------------------------------ -; -; CpuPause() for ARM -; -; Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-; Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-; SPDX-License-Identifier: BSD-2-Clause-Patent -; -;------------------------------------------------------------------------------ - - EXPORT CpuPause - AREA cpu_pause, CODE, READONLY - -;/** -; Requests CPU to pause for a short period of time. -; -; Requests CPU to pause for a short period of time. Typically used in MP -; systems to prevent memory starvation while waiting for a spin lock. -; -;**/ -;VOID -;EFIAPI -;CpuPause ( -; VOID -; ); -; -CpuPause - NOP - NOP - NOP - NOP - NOP - BX LR - - END diff --git a/MdePkg/Library/BaseLib/Arm/DisableInterrupts.S b/MdePkg/Library/BaseLib/Arm/DisableInterrupts.S deleted file mode 100644 index 1f3fe7cc97bb..000000000000 --- a/MdePkg/Library/BaseLib/Arm/DisableInterrupts.S +++ /dev/null @@ -1,29 +0,0 @@ -#------------------------------------------------------------------------------ -# -# DisableInterrupts() for ARM -# -# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-# Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -.text -.p2align 2 -GCC_ASM_EXPORT(DisableInterrupts) - -#/** -# Disables CPU interrupts. -# -#**/ -#VOID -#EFIAPI -#DisableInterrupts ( -# VOID -# ); -# -ASM_PFX(DisableInterrupts): - mrs R0,CPSR - orr R0,R0,#0x80 @Disable IRQ interrupts - msr CPSR_c,R0 - bx LR diff --git a/MdePkg/Library/BaseLib/Arm/DisableInterrupts.asm b/MdePkg/Library/BaseLib/Arm/DisableInterrupts.asm deleted file mode 100644 index e4e90b5f7e6c..000000000000 --- a/MdePkg/Library/BaseLib/Arm/DisableInterrupts.asm +++ /dev/null @@ -1,31 +0,0 @@ -;------------------------------------------------------------------------------ -; -; DisableInterrupts() for ARM -; -; Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-; Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-; SPDX-License-Identifier: BSD-2-Clause-Patent -; -;------------------------------------------------------------------------------ - - EXPORT DisableInterrupts - - AREA Interrupt_disable, CODE, READONLY - -;/** -; Disables CPU interrupts. -; -;**/ -;VOID -;EFIAPI -;DisableInterrupts ( -; VOID -; ); -; -DisableInterrupts - MRS R0,CPSR - ORR R0,R0,#0x80 ;Disable IRQ interrupts - MSR CPSR_c,R0 - BX LR - - END diff --git a/MdePkg/Library/BaseLib/Arm/EnableInterrupts.S b/MdePkg/Library/BaseLib/Arm/EnableInterrupts.S deleted file mode 100644 index 5de3b09459c1..000000000000 --- a/MdePkg/Library/BaseLib/Arm/EnableInterrupts.S +++ /dev/null @@ -1,30 +0,0 @@ -#------------------------------------------------------------------------------ -# -# EnableInterrupts() for ARM -# -# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-# Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -.text -.p2align 2 -GCC_ASM_EXPORT(EnableInterrupts) - - -#/** -# Enables CPU interrupts. -# -#**/ -#VOID -#EFIAPI -#EnableInterrupts ( -# VOID -# ); -# -ASM_PFX(EnableInterrupts): - mrs R0,CPSR - bic R0,R0,#0x80 @Enable IRQ interrupts - msr CPSR_c,R0 - bx LR diff --git a/MdePkg/Library/BaseLib/Arm/EnableInterrupts.asm b/MdePkg/Library/BaseLib/Arm/EnableInterrupts.asm deleted file mode 100644 index 0fcf66f7d450..000000000000 --- a/MdePkg/Library/BaseLib/Arm/EnableInterrupts.asm +++ /dev/null @@ -1,31 +0,0 @@ -;------------------------------------------------------------------------------ -; -; EnableInterrupts() for ARM -; -; Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-; Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-; SPDX-License-Identifier: BSD-2-Clause-Patent -; -;------------------------------------------------------------------------------ - - EXPORT EnableInterrupts - - AREA Interrupt_enable, CODE, READONLY - -;/** -; Enables CPU interrupts. -; -;**/ -;VOID -;EFIAPI -;EnableInterrupts ( -; VOID -; ); -; -EnableInterrupts - MRS R0,CPSR - BIC R0,R0,#0x80 ;Enable IRQ interrupts - MSR CPSR_c,R0 - BX LR - - END diff --git a/MdePkg/Library/BaseLib/Arm/GetInterruptsState.S b/MdePkg/Library/BaseLib/Arm/GetInterruptsState.S deleted file mode 100644 index d5ee7d0e2329..000000000000 --- a/MdePkg/Library/BaseLib/Arm/GetInterruptsState.S +++ /dev/null @@ -1,37 +0,0 @@ -#------------------------------------------------------------------------------ -# -# GetInterruptState() function for ARM -# -# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-# Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -.text -.p2align 2 -GCC_ASM_EXPORT (GetInterruptState) - -#/** -# Retrieves the current CPU interrupt state. -# -# Returns TRUE is interrupts are currently enabled. Otherwise -# returns FALSE. -# -# @retval TRUE CPU interrupts are enabled. -# @retval FALSE CPU interrupts are disabled. -# -#**/ -# -#BOOLEAN -#EFIAPI -#GetInterruptState ( -# VOID -# ); -# -ASM_PFX(GetInterruptState): - mrs R0, CPSR - tst R0, #0x80 @Check if IRQ is enabled. - moveq R0, #1 - movne R0, #0 - bx LR diff --git a/MdePkg/Library/BaseLib/Arm/GetInterruptsState.asm b/MdePkg/Library/BaseLib/Arm/GetInterruptsState.asm deleted file mode 100644 index af7b9d6c6bf9..000000000000 --- a/MdePkg/Library/BaseLib/Arm/GetInterruptsState.asm +++ /dev/null @@ -1,39 +0,0 @@ -;------------------------------------------------------------------------------ -; -; GetInterruptState() function for ARM -; -; Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-; Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-; SPDX-License-Identifier: BSD-2-Clause-Patent -; -;------------------------------------------------------------------------------ - - EXPORT GetInterruptState - - AREA Interrupt_enable, CODE, READONLY - -;/** -; Retrieves the current CPU interrupt state. -; -; Returns TRUE is interrupts are currently enabled. Otherwise -; returns FALSE. -; -; @retval TRUE CPU interrupts are enabled. -; @retval FALSE CPU interrupts are disabled. -; -;**/ -; -;BOOLEAN -;EFIAPI -;GetInterruptState ( -; VOID -; ); -; -GetInterruptState - MRS R0, CPSR - TST R0, #0x80 ;Check if IRQ is enabled. - MOVEQ R0, #1 - MOVNE R0, #0 - BX LR - - END diff --git a/MdePkg/Library/BaseLib/Arm/Math64.S b/MdePkg/Library/BaseLib/Arm/Math64.S deleted file mode 100755 index ec12b10150a3..000000000000 --- a/MdePkg/Library/BaseLib/Arm/Math64.S +++ /dev/null @@ -1,263 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Replacement for Math64.c that is coded to use older GCC intrinsics. -# Doing this reduces the number of intrinsics that are required when -# you port to a new version of gcc. -# -# Need to split this into multple files to size optimize the image. -# -# Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.
-# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - - .text - .align 2 - GCC_ASM_EXPORT(InternalMathLShiftU64) - -ASM_PFX(InternalMathLShiftU64): - stmfd sp!, {r4, r5, r6} - mov r6, r1 - rsb ip, r2, #32 - mov r4, r6, asl r2 - subs r1, r2, #32 - orr r4, r4, r0, lsr ip - mov r3, r0, asl r2 - movpl r4, r0, asl r1 - mov r5, r0 - mov r0, r3 - mov r1, r4 - ldmfd sp!, {r4, r5, r6} - bx lr - - .align 2 - GCC_ASM_EXPORT(InternalMathRShiftU64) - -ASM_PFX(InternalMathRShiftU64): - stmfd sp!, {r4, r5, r6} - mov r5, r0 - rsb ip, r2, #32 - mov r3, r5, lsr r2 - subs r0, r2, #32 - orr r3, r3, r1, asl ip - mov r4, r1, lsr r2 - movpl r3, r1, lsr r0 - mov r6, r1 - mov r0, r3 - mov r1, r4 - ldmfd sp!, {r4, r5, r6} - bx lr - - .align 2 - GCC_ASM_EXPORT(InternalMathARShiftU64) - -ASM_PFX(InternalMathARShiftU64): - stmfd sp!, {r4, r5, r6} - mov r5, r0 - rsb ip, r2, #32 - mov r3, r5, lsr r2 - subs r0, r2, #32 - orr r3, r3, r1, asl ip - mov r4, r1, asr r2 - movpl r3, r1, asr r0 - mov r6, r1 - mov r0, r3 - mov r1, r4 - ldmfd sp!, {r4, r5, r6} - bx lr - - .align 2 - GCC_ASM_EXPORT(InternalMathLRotU64) - -ASM_PFX(InternalMathLRotU64): - stmfd sp!, {r4, r5, r6, r7, lr} - add r7, sp, #12 - mov r6, r1 - rsb ip, r2, #32 - mov r4, r6, asl r2 - rsb lr, r2, #64 - subs r1, r2, #32 - orr r4, r4, r0, lsr ip - mov r3, r0, asl r2 - movpl r4, r0, asl r1 - sub ip, r2, #32 - mov r5, r0 - mov r0, r0, lsr lr - rsbs r2, r2, #32 - orr r0, r0, r6, asl ip - mov r1, r6, lsr lr - movpl r0, r6, lsr r2 - orr r1, r1, r4 - orr r0, r0, r3 - ldmfd sp!, {r4, r5, r6, r7, pc} - - - .align 2 - GCC_ASM_EXPORT(InternalMathRRotU64) - -ASM_PFX(InternalMathRRotU64): - stmfd sp!, {r4, r5, r6, r7, lr} - add r7, sp, #12 - mov r5, r0 - rsb ip, r2, #32 - mov r3, r5, lsr r2 - rsb lr, r2, #64 - subs r0, r2, #32 - orr r3, r3, r1, asl ip - mov r4, r1, lsr r2 - movpl r3, r1, lsr r0 - sub ip, r2, #32 - mov r6, r1 - mov r1, r1, asl lr - rsbs r2, r2, #32 - orr r1, r1, r5, lsr ip - mov r0, r5, asl lr - movpl r1, r5, asl r2 - orr r0, r0, r3 - orr r1, r1, r4 - ldmfd sp!, {r4, r5, r6, r7, pc} - - .align 2 - GCC_ASM_EXPORT(InternalMathMultU64x32) - -ASM_PFX(InternalMathMultU64x32): - stmfd sp!, {r7, lr} - add r7, sp, #0 - mov r3, #0 - mov ip, r0 - mov lr, r1 - umull r0, r1, ip, r2 - mla r1, lr, r2, r1 - mla r1, ip, r3, r1 - ldmfd sp!, {r7, pc} - - .align 2 - GCC_ASM_EXPORT(InternalMathMultU64x64) - -ASM_PFX(InternalMathMultU64x64): - stmfd sp!, {r7, lr} - add r7, sp, #0 - mov ip, r0 - mov lr, r1 - umull r0, r1, ip, r2 - mla r1, lr, r2, r1 - mla r1, ip, r3, r1 - ldmfd sp!, {r7, pc} - - .align 2 - GCC_ASM_EXPORT(InternalMathDivU64x32) - -ASM_PFX(InternalMathDivU64x32): - stmfd sp!, {r7, lr} - add r7, sp, #0 - mov r3, #0 - bl ASM_PFX(__udivdi3) - ldmfd sp!, {r7, pc} - - - .align 2 - GCC_ASM_EXPORT(InternalMathModU64x32) - -ASM_PFX(InternalMathModU64x32): - stmfd sp!, {r7, lr} - add r7, sp, #0 - mov r3, #0 - bl ASM_PFX(__umoddi3) - ldmfd sp!, {r7, pc} - - - .align 2 - GCC_ASM_EXPORT(InternalMathDivRemU64x32) - -ASM_PFX(InternalMathDivRemU64x32): - stmfd sp!, {r4, r5, r6, r7, lr} - add r7, sp, #12 - stmfd sp!, {r10, r11} - subs r6, r3, #0 - mov r10, r0 - mov r11, r1 - moveq r4, r2 - moveq r5, #0 - beq L22 - mov r4, r2 - mov r5, #0 - mov r3, #0 - bl ASM_PFX(__umoddi3) - str r0, [r6, #0] -L22: - mov r0, r10 - mov r1, r11 - mov r2, r4 - mov r3, r5 - bl ASM_PFX(__udivdi3) - ldmfd sp!, {r10, r11} - ldmfd sp!, {r4, r5, r6, r7, pc} - - - .align 2 - GCC_ASM_EXPORT(InternalMathDivRemU64x64) - -ASM_PFX(InternalMathDivRemU64x64): - stmfd sp!, {r4, r5, r6, r7, lr} - add r7, sp, #12 - stmfd sp!, {r10, r11} - ldr r6, [sp, #28] - mov r4, r0 - cmp r6, #0 - mov r5, r1 - mov r10, r2 - mov r11, r3 - beq L26 - bl ASM_PFX(__umoddi3) - stmia r6, {r0-r1} -L26: - mov r0, r4 - mov r1, r5 - mov r2, r10 - mov r3, r11 - bl ASM_PFX(__udivdi3) - ldmfd sp!, {r10, r11} - ldmfd sp!, {r4, r5, r6, r7, pc} - - - .align 2 - GCC_ASM_EXPORT(InternalMathDivRemS64x64) - -ASM_PFX(InternalMathDivRemS64x64): - stmfd sp!, {r4, r5, r6, r7, lr} - add r7, sp, #12 - stmfd sp!, {r10, r11} - ldr r6, [sp, #28] - mov r4, r0 - cmp r6, #0 - mov r5, r1 - mov r10, r2 - mov r11, r3 - beq L30 - bl ASM_PFX(__moddi3) - stmia r6, {r0-r1} -L30: - mov r0, r4 - mov r1, r5 - mov r2, r10 - mov r3, r11 - bl ASM_PFX(__divdi3) - ldmfd sp!, {r10, r11} - ldmfd sp!, {r4, r5, r6, r7, pc} - - - .align 2 - GCC_ASM_EXPORT(InternalMathSwapBytes64) - -ASM_PFX(InternalMathSwapBytes64): - stmfd sp!, {r4, r5, r7, lr} - mov r5, r1 - bl ASM_PFX(SwapBytes32) - mov r4, r0 - mov r0, r5 - bl ASM_PFX(SwapBytes32) - mov r1, r4 - ldmfd sp!, {r4, r5, r7, pc} - - -ASM_FUNCTION_REMOVE_IF_UNREFERENCED diff --git a/MdePkg/Library/BaseLib/Arm/MemoryFence.S b/MdePkg/Library/BaseLib/Arm/MemoryFence.S deleted file mode 100644 index 8bf1a75052f9..000000000000 --- a/MdePkg/Library/BaseLib/Arm/MemoryFence.S +++ /dev/null @@ -1,33 +0,0 @@ -##------------------------------------------------------------------------------ -# -# MemoryFence() for AArch64 -# -# Copyright (c) 2013, ARM Ltd. All rights reserved. -# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -##------------------------------------------------------------------------------ - -.text -.p2align 2 - -GCC_ASM_EXPORT(MemoryFence) - - -#/** -# Used to serialize load and store operations. -# -# All loads and stores that proceed calls to this function are guaranteed to be -# globally visible when this function returns. -# -#**/ -#VOID -#EFIAPI -#MemoryFence ( -# VOID -# ); -# -ASM_PFX(MemoryFence): - // System wide Data Memory Barrier. - dmb - bx lr diff --git a/MdePkg/Library/BaseLib/Arm/MemoryFence.asm b/MdePkg/Library/BaseLib/Arm/MemoryFence.asm deleted file mode 100644 index e751584aa5d8..000000000000 --- a/MdePkg/Library/BaseLib/Arm/MemoryFence.asm +++ /dev/null @@ -1,33 +0,0 @@ -;------------------------------------------------------------------------------ -; -; MemoryFence() for AArch64 -; -; Copyright (c) 2013, ARM Ltd. All rights reserved. -; -; SPDX-License-Identifier: BSD-2-Clause-Patent -; -;------------------------------------------------------------------------------ - - EXPORT MemoryFence - - AREA MemoryBarriers, CODE, READONLY - -;/** -; Used to serialize load and store operations. -; -; All loads and stores that proceed calls to this function are guaranteed to be -; globally visible when this function returns. -; -;**/ -;VOID -;EFIAPI -;MemoryFence ( -; VOID -; ); -; -MemoryFence FUNCTION - dmb - bx lr - ENDFUNC - - END diff --git a/MdePkg/Library/BaseLib/Arm/SetJumpLongJump.S b/MdePkg/Library/BaseLib/Arm/SetJumpLongJump.S deleted file mode 100644 index 14006c6123e3..000000000000 --- a/MdePkg/Library/BaseLib/Arm/SetJumpLongJump.S +++ /dev/null @@ -1,65 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-# Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ -.text -.p2align 2 - -GCC_ASM_EXPORT(SetJump) -GCC_ASM_EXPORT(InternalLongJump) - -#/** -# Saves the current CPU context that can be restored with a call to LongJump() and returns 0.# -# -# Saves the current CPU context in the buffer specified by JumpBuffer and returns 0. The initial -# call to SetJump() must always return 0. Subsequent calls to LongJump() cause a non-zero -# value to be returned by SetJump(). -# -# If JumpBuffer is NULL, then ASSERT(). -# -# @param JumpBuffer A pointer to CPU context buffer. -# -#**/ -# -#UINTN -#EFIAPI -#SetJump ( -# IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer // R0 -# ); -# -ASM_PFX(SetJump): - mov r3, r13 - stmia r0, {r3-r12,r14} - mov r0, #0 - bx lr - -#/** -# Restores the CPU context that was saved with SetJump().# -# -# Restores the CPU context from the buffer specified by JumpBuffer. -# This function never returns to the caller. -# Instead it resumes execution based on the state of JumpBuffer. -# -# @param JumpBuffer A pointer to CPU context buffer. -# @param Value The value to return when the SetJump() context is restored. -# -#**/ -#VOID -#EFIAPI -#InternalLongJump ( -# IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer, // R0 -# IN UINTN Value // R1 -# ); -# -ASM_PFX(InternalLongJump): - ldmia r0, {r3-r12,r14} - mov r13, r3 - cmp r1, #0 - moveq r1, #1 - mov r0, r1 - bx lr - -ASM_FUNCTION_REMOVE_IF_UNREFERENCED diff --git a/MdePkg/Library/BaseLib/Arm/SetJumpLongJump.asm b/MdePkg/Library/BaseLib/Arm/SetJumpLongJump.asm deleted file mode 100644 index f89cfa231bbc..000000000000 --- a/MdePkg/Library/BaseLib/Arm/SetJumpLongJump.asm +++ /dev/null @@ -1,65 +0,0 @@ -;------------------------------------------------------------------------------ -; -; Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-; Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-; SPDX-License-Identifier: BSD-2-Clause-Patent -; -;------------------------------------------------------------------------------ - - EXPORT SetJump - EXPORT InternalLongJump - - AREA BaseLib, CODE, READONLY - -;/** -; Saves the current CPU context that can be restored with a call to LongJump() and returns 0.; -; -; Saves the current CPU context in the buffer specified by JumpBuffer and returns 0. The initial -; call to SetJump() must always return 0. Subsequent calls to LongJump() cause a non-zero -; value to be returned by SetJump(). -; -; If JumpBuffer is NULL, then ASSERT(). -; -; @param JumpBuffer A pointer to CPU context buffer. -; -;**/ -; -;UINTN -;EFIAPI -;SetJump ( -; IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer // R0 -; ) -; -SetJump - MOV R3, R13 - STM R0, {R3-R12,R14} - MOV R0, #0 - BX LR - -;/** -; Restores the CPU context that was saved with SetJump().; -; -; Restores the CPU context from the buffer specified by JumpBuffer. -; This function never returns to the caller. -; Instead it resumes execution based on the state of JumpBuffer. -; -; @param JumpBuffer A pointer to CPU context buffer. -; @param Value The value to return when the SetJump() context is restored. -; -;**/ -;VOID -;EFIAPI -;InternalLongJump ( -; IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer, // R0 -; IN UINTN Value // R1 -; ); -; -InternalLongJump - LDM R0, {R3-R12,R14} - MOV R13, R3 - CMP R1, #0 - MOVEQ R1, #1 - MOV R0, R1 - BX LR - - END diff --git a/MdePkg/Library/BaseLib/Arm/SpeculationBarrier.S b/MdePkg/Library/BaseLib/Arm/SpeculationBarrier.S deleted file mode 100644 index 73f8105e34e8..000000000000 --- a/MdePkg/Library/BaseLib/Arm/SpeculationBarrier.S +++ /dev/null @@ -1,33 +0,0 @@ -##------------------------------------------------------------------------------ -# -# SpeculationBarrier() for AArch64 -# -# Copyright (c) 2019, Linaro Ltd. All rights reserved. -# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -##------------------------------------------------------------------------------ - -.text -.p2align 2 - -GCC_ASM_EXPORT(SpeculationBarrier) - - -#/** -# Uses as a barrier to stop speculative execution. -# -# Ensures that no later instruction will execute speculatively, until all prior -# instructions have completed. -# -#**/ -#VOID -#EFIAPI -#SpeculationBarrier ( -# VOID -# ); -# -ASM_PFX(SpeculationBarrier): - dsb - isb - bx lr diff --git a/MdePkg/Library/BaseLib/Arm/SpeculationBarrier.asm b/MdePkg/Library/BaseLib/Arm/SpeculationBarrier.asm deleted file mode 100644 index 01a64346fd04..000000000000 --- a/MdePkg/Library/BaseLib/Arm/SpeculationBarrier.asm +++ /dev/null @@ -1,33 +0,0 @@ -;------------------------------------------------------------------------------ -; -; SpeculationBarrier() for AArch64 -; -; Copyright (c) 2019, Linaro Ltd. All rights reserved. -; -; SPDX-License-Identifier: BSD-2-Clause-Patent -; -;------------------------------------------------------------------------------ - - EXPORT SpeculationBarrier - - AREA MemoryBarriers, CODE, READONLY - -;/** -; Uses as a barrier to stop speculative execution. -; -; Ensures that no later instruction will execute speculatively, until all prior -; instructions have completed. -; -;**/ -;VOID -;EFIAPI -;SpeculationBarrier ( -; VOID -; ); -; -SpeculationBarrier - dsb - isb - bx lr - - END diff --git a/MdePkg/Library/BaseLib/Arm/SwitchStack.S b/MdePkg/Library/BaseLib/Arm/SwitchStack.S deleted file mode 100644 index 844c9a27f094..000000000000 --- a/MdePkg/Library/BaseLib/Arm/SwitchStack.S +++ /dev/null @@ -1,62 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-// Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-// Portions copyright (c) 2011, ARM Limited. All rights reserved.
-// SPDX-License-Identifier: BSD-2-Clause-Patent -// -//------------------------------------------------------------------------------ - -.text -.align 5 - -GCC_ASM_EXPORT(InternalSwitchStackAsm) -GCC_ASM_EXPORT(CpuPause) - -/** -// -// This allows the caller to switch the stack and goes to the new entry point -// -// @param EntryPoint The pointer to the location to enter -// @param Context Parameter to pass in -// @param Context2 Parameter2 to pass in -// @param NewStack New Location of the stack -// -// @return Nothing. Goes to the Entry Point passing in the new parameters -// -VOID -EFIAPI -InternalSwitchStackAsm ( - SWITCH_STACK_ENTRY_POINT EntryPoint, - VOID *Context, - VOID *Context2, - VOID *NewStack - ); -**/ -ASM_PFX(InternalSwitchStackAsm): - MOV LR, R0 - MOV SP, R3 - MOV R0, R1 - MOV R1, R2 - BX LR - -/** -// -// Requests CPU to pause for a short period of time. -// -// Requests CPU to pause for a short period of time. Typically used in MP -// systems to prevent memory starvation while waiting for a spin lock. -// -VOID -EFIAPI -CpuPause ( - VOID - ) -**/ -ASM_PFX(CpuPause): - nop - nop - nop - nop - nop - BX LR diff --git a/MdePkg/Library/BaseLib/Arm/SwitchStack.asm b/MdePkg/Library/BaseLib/Arm/SwitchStack.asm deleted file mode 100644 index 690f632e6307..000000000000 --- a/MdePkg/Library/BaseLib/Arm/SwitchStack.asm +++ /dev/null @@ -1,39 +0,0 @@ -;------------------------------------------------------------------------------ -; -; Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
-; Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-; SPDX-License-Identifier: BSD-2-Clause-Patent -; -;------------------------------------------------------------------------------ - - EXPORT InternalSwitchStackAsm - - AREA Switch_Stack, CODE, READONLY - -;/** -; This allows the caller to switch the stack and goes to the new entry point -; -; @param EntryPoint The pointer to the location to enter -; @param Context Parameter to pass in -; @param Context2 Parameter2 to pass in -; @param NewStack New Location of the stack -; -; @return Nothing. Goes to the Entry Point passing in the new parameters -; -;**/ -;VOID -;EFIAPI -;InternalSwitchStackAsm ( -; SWITCH_STACK_ENTRY_POINT EntryPoint, -; VOID *Context, -; VOID *Context2, -; VOID *NewStack -; ); -; -InternalSwitchStackAsm - MOV LR, R0 - MOV SP, R3 - MOV R0, R1 - MOV R1, R2 - BX LR - END diff --git a/MdePkg/Library/BaseLib/BaseLib.inf b/MdePkg/Library/BaseLib/BaseLib.inf index a149770ae22c..7925d8cef633 100644 --- a/MdePkg/Library/BaseLib/BaseLib.inf +++ b/MdePkg/Library/BaseLib/BaseLib.inf @@ -21,7 +21,7 @@ LIBRARY_CLASS = BaseLib # -# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 RISCV64 LOONGARCH64 +# VALID_ARCHITECTURES = IA32 X64 EBC AARCH64 RISCV64 LOONGARCH64 # [Sources] @@ -341,35 +341,9 @@ Math64.c IntelTdxNull.c -[Sources.ARM] - Arm/InternalSwitchStack.c - Arm/Unaligned.c - Math64.c | MSFT - - Arm/SwitchStack.asm | MSFT - Arm/SetJumpLongJump.asm | MSFT - Arm/DisableInterrupts.asm | MSFT - Arm/EnableInterrupts.asm | MSFT - Arm/GetInterruptsState.asm | MSFT - Arm/CpuPause.asm | MSFT - Arm/CpuBreakpoint.asm | MSFT - Arm/MemoryFence.asm | MSFT - Arm/SpeculationBarrier.asm | MSFT - - Arm/Math64.S | GCC - Arm/SwitchStack.S | GCC - Arm/EnableInterrupts.S | GCC - Arm/DisableInterrupts.S | GCC - Arm/GetInterruptsState.S | GCC - Arm/SetJumpLongJump.S | GCC - Arm/CpuBreakpoint.S | GCC - Arm/MemoryFence.S | GCC - Arm/SpeculationBarrier.S | GCC - IntelTdxNull.c - [Sources.AARCH64] - Arm/InternalSwitchStack.c - Arm/Unaligned.c + AArch64/InternalSwitchStack.c + AArch64/Unaligned.c Math64.c AArch64/MemoryFence.S | GCC diff --git a/MdePkg/Library/BaseLib/UnitTestHostBaseLib.inf b/MdePkg/Library/BaseLib/UnitTestHostBaseLib.inf index 452619f5d841..190e3b6e03eb 100644 --- a/MdePkg/Library/BaseLib/UnitTestHostBaseLib.inf +++ b/MdePkg/Library/BaseLib/UnitTestHostBaseLib.inf @@ -179,28 +179,9 @@ Unaligned.c Math64.c -[Sources.ARM] - Arm/InternalSwitchStack.c - Arm/Unaligned.c - Math64.c | MSFT - - Arm/SwitchStack.asm | MSFT - Arm/SetJumpLongJump.asm | MSFT - Arm/CpuPause.asm | MSFT - Arm/CpuBreakpoint.asm | MSFT - Arm/MemoryFence.asm | MSFT - Arm/SpeculationBarrier.asm | MSFT - - Arm/Math64.S | GCC - Arm/SwitchStack.S | GCC - Arm/SetJumpLongJump.S | GCC - Arm/CpuBreakpoint.S | GCC - Arm/MemoryFence.S | GCC - Arm/SpeculationBarrier.S | GCC - [Sources.AARCH64] - Arm/InternalSwitchStack.c - Arm/Unaligned.c + AArch64/InternalSwitchStack.c + AArch64/Unaligned.c Math64.c AArch64/MemoryFence.S | GCC From bc31103006cd468ca604f50c18cca7d73be27655 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 15 Sep 2025 14:15:45 -0700 Subject: [PATCH 0555/1172] MdePkg: Remove ARM32 Support from CompilerIntrinsicsLib edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from CompilerIntrinsicsLib. Signed-off-by: Oliver Smith-Denny --- .../CompilerIntrinsicsLib/Arm/ashldi3.S | 27 -- .../CompilerIntrinsicsLib/Arm/ashrdi3.S | 28 -- .../CompilerIntrinsicsLib/Arm/clzsi2.S | 49 --- .../CompilerIntrinsicsLib/Arm/ctzsi2.S | 41 --- .../Library/CompilerIntrinsicsLib/Arm/div.S | 147 --------- .../Library/CompilerIntrinsicsLib/Arm/div.asm | 180 ----------- .../CompilerIntrinsicsLib/Arm/divdi3.S | 41 --- .../CompilerIntrinsicsLib/Arm/divsi3.S | 24 -- .../Library/CompilerIntrinsicsLib/Arm/lasr.S | 30 -- .../CompilerIntrinsicsLib/Arm/ldivmod.S | 50 ---- .../CompilerIntrinsicsLib/Arm/ldivmod.asm | 71 ----- .../Library/CompilerIntrinsicsLib/Arm/llsl.S | 31 -- .../Library/CompilerIntrinsicsLib/Arm/llsr.S | 30 -- .../CompilerIntrinsicsLib/Arm/llsr.asm | 39 --- .../CompilerIntrinsicsLib/Arm/lshrdi3.S | 27 -- .../CompilerIntrinsicsLib/Arm/memmove.S | 40 --- .../CompilerIntrinsicsLib/Arm/moddi3.S | 38 --- .../CompilerIntrinsicsLib/Arm/modsi3.S | 19 -- .../CompilerIntrinsicsLib/Arm/muldi3.S | 50 ---- .../Library/CompilerIntrinsicsLib/Arm/mullu.S | 38 --- .../CompilerIntrinsicsLib/Arm/sourcery.S | 49 --- .../CompilerIntrinsicsLib/Arm/switch16.S | 24 -- .../CompilerIntrinsicsLib/Arm/switch32.S | 23 -- .../CompilerIntrinsicsLib/Arm/switch8.S | 21 -- .../CompilerIntrinsicsLib/Arm/switchu8.S | 21 -- .../CompilerIntrinsicsLib/Arm/ucmpdi2.S | 30 -- .../CompilerIntrinsicsLib/Arm/udivdi3.S | 19 -- .../CompilerIntrinsicsLib/Arm/udivmoddi4.S | 236 --------------- .../CompilerIntrinsicsLib/Arm/udivsi3.S | 51 ---- .../Library/CompilerIntrinsicsLib/Arm/uldiv.S | 261 ---------------- .../CompilerIntrinsicsLib/Arm/uldiv.asm | 282 ------------------ .../CompilerIntrinsicsLib/Arm/umoddi3.S | 21 -- .../CompilerIntrinsicsLib/Arm/umodsi3.S | 20 -- .../Library/CompilerIntrinsicsLib/Arm/uread.S | 54 ---- .../CompilerIntrinsicsLib/Arm/uwrite.S | 53 ---- .../CompilerIntrinsicsLib.inf | 39 --- .../Library/CompilerIntrinsicsLib/memcmp_ms.c | 4 - MdePkg/Library/CompilerIntrinsicsLib/memcpy.c | 28 -- .../Library/CompilerIntrinsicsLib/memcpy_ms.c | 4 - .../CompilerIntrinsicsLib/memmove_ms.c | 4 - MdePkg/Library/CompilerIntrinsicsLib/memset.c | 53 ---- .../Library/CompilerIntrinsicsLib/memset_ms.c | 4 - MdePkg/MdeLibs.dsc.inc | 6 +- 43 files changed, 3 insertions(+), 2304 deletions(-) delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/ashldi3.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/ashrdi3.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/clzsi2.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/ctzsi2.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/div.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/div.asm delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/divdi3.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/divsi3.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/lasr.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/llsl.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/llsr.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/lshrdi3.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/memmove.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/moddi3.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/modsi3.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/muldi3.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/mullu.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/sourcery.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/switch16.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/switch32.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/switch8.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/switchu8.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/ucmpdi2.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/udivdi3.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/udivmoddi4.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/udivsi3.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/uldiv.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/umoddi3.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/umodsi3.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/uread.S delete mode 100644 MdePkg/Library/CompilerIntrinsicsLib/Arm/uwrite.S diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/ashldi3.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/ashldi3.S deleted file mode 100644 index f5f14509c5e9..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/ashldi3.S +++ /dev/null @@ -1,27 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -ASM_FUNC(__ashldi3) - cmp r2, #31 - bls L2 - cmp r2, #63 - subls r2, r2, #32 - movls r2, r0, asl r2 - movhi r2, #0 - mov r1, r2 - mov r0, #0 - bx lr -L2: - cmp r2, #0 - rsbne r3, r2, #32 - movne r3, r0, lsr r3 - movne r0, r0, asl r2 - orrne r1, r3, r1, asl r2 - bx lr diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/ashrdi3.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/ashrdi3.S deleted file mode 100644 index 855497e7d1e4..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/ashrdi3.S +++ /dev/null @@ -1,28 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -ASM_FUNC(__ashrdi3) - cmp r2, #31 - bls L2 - cmp r2, #63 - subls r2, r2, #32 - mov ip, r1, asr #31 - movls r2, r1, asr r2 - movhi r2, ip - mov r0, r2 - mov r1, ip - bx lr -L2: - cmp r2, #0 - rsbne r3, r2, #32 - movne r3, r1, asl r3 - movne r1, r1, asr r2 - orrne r0, r3, r0, lsr r2 - bx lr diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/clzsi2.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/clzsi2.S deleted file mode 100644 index 54a7f3cd8350..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/clzsi2.S +++ /dev/null @@ -1,49 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -ASM_FUNC(__clzsi2) - @ frame_needed = 1, uses_anonymous_args = 0 - stmfd sp!, {r7, lr} - add r7, sp, #0 - movs r3, r0, lsr #16 - movne r3, #16 - moveq r3, #0 - movne r9, #0 - moveq r9, #16 - mov r3, r0, lsr r3 - tst r3, #65280 - movne r0, #8 - moveq r0, #0 - movne lr, #0 - moveq lr, #8 - mov r3, r3, lsr r0 - tst r3, #240 - movne r0, #4 - moveq r0, #0 - movne ip, #0 - moveq ip, #4 - mov r3, r3, lsr r0 - tst r3, #12 - movne r0, #2 - moveq r0, #0 - movne r1, #0 - moveq r1, #2 - mov r2, r3, lsr r0 - add r3, lr, r9 - add r0, r3, ip - add r1, r0, r1 - mov r0, r2, lsr #1 - eor r0, r0, #1 - ands r0, r0, #1 - mvnne r0, #0 - rsb r3, r2, #2 - and r0, r0, r3 - add r0, r1, r0 - ldmfd sp!, {r7, pc} diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/ctzsi2.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/ctzsi2.S deleted file mode 100644 index d1ff500d5dc5..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/ctzsi2.S +++ /dev/null @@ -1,41 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -ASM_FUNC(__ctzsi2) - uxth r3, r0 - cmp r3, #0 - moveq ip, #16 - movne ip, #0 - @ lr needed for prologue - mov r0, r0, lsr ip - tst r0, #255 - movne r3, #0 - moveq r3, #8 - mov r0, r0, lsr r3 - tst r0, #15 - movne r1, #0 - moveq r1, #4 - add r3, r3, ip - mov r0, r0, lsr r1 - tst r0, #3 - movne r2, #0 - moveq r2, #2 - add r3, r3, r1 - mov r0, r0, lsr r2 - and r0, r0, #3 - add r2, r3, r2 - eor r3, r0, #1 - mov r0, r0, lsr #1 - ands r3, r3, #1 - mvnne r3, #0 - rsb r0, r0, #2 - and r0, r3, r0 - add r0, r2, r0 - bx lr diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/div.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/div.S deleted file mode 100644 index d6075ab33a30..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/div.S +++ /dev/null @@ -1,147 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2011, ARM. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -.text -.align 2 -GCC_ASM_EXPORT(__aeabi_uidiv) -GCC_ASM_EXPORT(__aeabi_uidivmod) -GCC_ASM_EXPORT(__aeabi_idiv) -GCC_ASM_EXPORT(__aeabi_idivmod) - -# AREA Math, CODE, READONLY - -# -#UINT32 -#EFIAPI -#__aeabi_uidivmode ( -# IN UINT32 Dividen -# IN UINT32 Divisor -# ); -# - -ASM_PFX(__aeabi_uidiv): -ASM_PFX(__aeabi_uidivmod): - rsbs r12, r1, r0, LSR #4 - mov r2, #0 - bcc ASM_PFX(__arm_div4) - rsbs r12, r1, r0, LSR #8 - bcc ASM_PFX(__arm_div8) - mov r3, #0 - b ASM_PFX(__arm_div_large) - -# -#INT32 -#EFIAPI -#__aeabi_idivmode ( -# IN INT32 Dividen -# IN INT32 Divisor -# ); -# -ASM_PFX(__aeabi_idiv): -ASM_PFX(__aeabi_idivmod): - orrs r12, r0, r1 - bmi ASM_PFX(__arm_div_negative) - rsbs r12, r1, r0, LSR #1 - mov r2, #0 - bcc ASM_PFX(__arm_div1) - rsbs r12, r1, r0, LSR #4 - bcc ASM_PFX(__arm_div4) - rsbs r12, r1, r0, LSR #8 - bcc ASM_PFX(__arm_div8) - mov r3, #0 - b ASM_PFX(__arm_div_large) -ASM_PFX(__arm_div8): - rsbs r12, r1, r0, LSR #7 - subcs r0, r0, r1, LSL #7 - adc r2, r2, r2 - rsbs r12, r1, r0,LSR #6 - subcs r0, r0, r1, LSL #6 - adc r2, r2, r2 - rsbs r12, r1, r0, LSR #5 - subcs r0, r0, r1, LSL #5 - adc r2, r2, r2 - rsbs r12, r1, r0, LSR #4 - subcs r0, r0, r1, LSL #4 - adc r2, r2, r2 -ASM_PFX(__arm_div4): - rsbs r12, r1, r0, LSR #3 - subcs r0, r0, r1, LSL #3 - adc r2, r2, r2 - rsbs r12, r1, r0, LSR #2 - subcs r0, r0, r1, LSL #2 - adcs r2, r2, r2 - rsbs r12, r1, r0, LSR #1 - subcs r0, r0, r1, LSL #1 - adc r2, r2, r2 -ASM_PFX(__arm_div1): - subs r1, r0, r1 - movcc r1, r0 - adc r0, r2, r2 - bx r14 -ASM_PFX(__arm_div_negative): - ands r2, r1, #0x80000000 - rsbmi r1, r1, #0 - eors r3, r2, r0, ASR #32 - rsbcs r0, r0, #0 - rsbs r12, r1, r0, LSR #4 - bcc label1 - rsbs r12, r1, r0, LSR #8 - bcc label2 -ASM_PFX(__arm_div_large): - lsl r1, r1, #6 - rsbs r12, r1, r0, LSR #8 - orr r2, r2, #0xfc000000 - bcc label2 - lsl r1, r1, #6 - rsbs r12, r1, r0, LSR #8 - orr r2, r2, #0x3f00000 - bcc label2 - lsl r1, r1, #6 - rsbs r12, r1, r0, LSR #8 - orr r2, r2, #0xfc000 - orrcs r2, r2, #0x3f00 - lslcs r1, r1, #6 - rsbs r12, r1, #0 - bcs ASM_PFX(__aeabi_idiv0) -label3: - lsrcs r1, r1, #6 -label2: - rsbs r12, r1, r0, LSR #7 - subcs r0, r0, r1, LSL #7 - adc r2, r2, r2 - rsbs r12, r1, r0, LSR #6 - subcs r0, r0, r1, LSL #6 - adc r2, r2, r2 - rsbs r12, r1, r0, LSR #5 - subcs r0, r0, r1, LSL #5 - adc r2, r2, r2 - rsbs r12, r1, r0, LSR #4 - subcs r0, r0, r1, LSL #4 - adc r2, r2, r2 -label1: - rsbs r12, r1, r0, LSR #3 - subcs r0, r0, r1, LSL #3 - adc r2, r2, r2 - rsbs r12, r1, r0, LSR #2 - subcs r0, r0, r1, LSL #2 - adcs r2, r2, r2 - bcs label3 - rsbs r12, r1, r0, LSR #1 - subcs r0, r0, r1, LSL #1 - adc r2, r2, r2 - subs r1, r0, r1 - movcc r1, r0 - adc r0, r2, r2 - asrs r3, r3, #31 - rsbmi r0, r0, #0 - rsbcs r1, r1, #0 - bx r14 - - @ What to do about division by zero? For now, just return. -ASM_PFX(__aeabi_idiv0): - bx r14 diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/div.asm b/MdePkg/Library/CompilerIntrinsicsLib/Arm/div.asm deleted file mode 100644 index 3cbeaa4c1b50..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/div.asm +++ /dev/null @@ -1,180 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-// Copyright (c) 2018, Pete Batard. All rights reserved.
-// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -//------------------------------------------------------------------------------ - - - EXPORT __aeabi_uidiv - EXPORT __aeabi_uidivmod - EXPORT __aeabi_idiv - EXPORT __aeabi_idivmod - EXPORT __rt_udiv - EXPORT __rt_sdiv - - AREA Math, CODE, READONLY - -; -;UINT32 -;EFIAPI -;__aeabi_uidivmod ( -; IN UINT32 Dividend -; IN UINT32 Divisor -; ); -; -__aeabi_uidiv -__aeabi_uidivmod - RSBS r12, r1, r0, LSR #4 - MOV r2, #0 - BCC __arm_div4 - RSBS r12, r1, r0, LSR #8 - BCC __arm_div8 - MOV r3, #0 - B __arm_div_large - -; -;UINT64 -;EFIAPI -;__rt_udiv ( -; IN UINT32 Divisor, -; IN UINT32 Dividend -; ); -; -__rt_udiv - ; Swap R0 and R1 - MOV r12, r0 - MOV r0, r1 - MOV r1, r12 - B __aeabi_uidivmod - -; -;UINT64 -;EFIAPI -;__rt_sdiv ( -; IN INT32 Divisor, -; IN INT32 Dividend -; ); -; -__rt_sdiv - ; Swap R0 and R1 - MOV r12, r0 - MOV r0, r1 - MOV r1, r12 - B __aeabi_idivmod - -; -;INT32 -;EFIAPI -;__aeabi_idivmod ( -; IN INT32 Dividend -; IN INT32 Divisor -; ); -; -__aeabi_idiv -__aeabi_idivmod - ORRS r12, r0, r1 - BMI __arm_div_negative - RSBS r12, r1, r0, LSR #1 - MOV r2, #0 - BCC __arm_div1 - RSBS r12, r1, r0, LSR #4 - BCC __arm_div4 - RSBS r12, r1, r0, LSR #8 - BCC __arm_div8 - MOV r3, #0 - B __arm_div_large -__arm_div8 - RSBS r12, r1, r0, LSR #7 - SUBCS r0, r0, r1, LSL #7 - ADC r2, r2, r2 - RSBS r12, r1, r0,LSR #6 - SUBCS r0, r0, r1, LSL #6 - ADC r2, r2, r2 - RSBS r12, r1, r0, LSR #5 - SUBCS r0, r0, r1, LSL #5 - ADC r2, r2, r2 - RSBS r12, r1, r0, LSR #4 - SUBCS r0, r0, r1, LSL #4 - ADC r2, r2, r2 -__arm_div4 - RSBS r12, r1, r0, LSR #3 - SUBCS r0, r0, r1, LSL #3 - ADC r2, r2, r2 - RSBS r12, r1, r0, LSR #2 - SUBCS r0, r0, r1, LSL #2 - ADCS r2, r2, r2 - RSBS r12, r1, r0, LSR #1 - SUBCS r0, r0, r1, LSL #1 - ADC r2, r2, r2 -__arm_div1 - SUBS r1, r0, r1 - MOVCC r1, r0 - ADC r0, r2, r2 - BX r14 -__arm_div_negative - ANDS r2, r1, #0x80000000 - RSBMI r1, r1, #0 - EORS r3, r2, r0, ASR #32 - RSBCS r0, r0, #0 - RSBS r12, r1, r0, LSR #4 - BCC label1 - RSBS r12, r1, r0, LSR #8 - BCC label2 -__arm_div_large - LSL r1, r1, #6 - RSBS r12, r1, r0, LSR #8 - ORR r2, r2, #0xfc000000 - BCC label2 - LSL r1, r1, #6 - RSBS r12, r1, r0, LSR #8 - ORR r2, r2, #0x3f00000 - BCC label2 - LSL r1, r1, #6 - RSBS r12, r1, r0, LSR #8 - ORR r2, r2, #0xfc000 - ORRCS r2, r2, #0x3f00 - LSLCS r1, r1, #6 - RSBS r12, r1, #0 - BCS __aeabi_idiv0 -label3 - LSRCS r1, r1, #6 -label2 - RSBS r12, r1, r0, LSR #7 - SUBCS r0, r0, r1, LSL #7 - ADC r2, r2, r2 - RSBS r12, r1, r0, LSR #6 - SUBCS r0, r0, r1, LSL #6 - ADC r2, r2, r2 - RSBS r12, r1, r0, LSR #5 - SUBCS r0, r0, r1, LSL #5 - ADC r2, r2, r2 - RSBS r12, r1, r0, LSR #4 - SUBCS r0, r0, r1, LSL #4 - ADC r2, r2, r2 -label1 - RSBS r12, r1, r0, LSR #3 - SUBCS r0, r0, r1, LSL #3 - ADC r2, r2, r2 - RSBS r12, r1, r0, LSR #2 - SUBCS r0, r0, r1, LSL #2 - ADCS r2, r2, r2 - BCS label3 - RSBS r12, r1, r0, LSR #1 - SUBCS r0, r0, r1, LSL #1 - ADC r2, r2, r2 - SUBS r1, r0, r1 - MOVCC r1, r0 - ADC r0, r2, r2 - ASRS r3, r3, #31 - RSBMI r0, r0, #0 - RSBCS r1, r1, #0 - BX r14 - - ; What to do about division by zero? For now, just return. -__aeabi_idiv0 - BX r14 - - END diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/divdi3.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/divdi3.S deleted file mode 100644 index c1c3c77b25dc..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/divdi3.S +++ /dev/null @@ -1,41 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -ASM_FUNC(__divdi3) - @ args = 0, pretend = 0, frame = 0 - @ frame_needed = 1, uses_anonymous_args = 0 - stmfd sp!, {r4, r5, r7, lr} - mov r4, r3, asr #31 - add r7, sp, #8 - stmfd sp!, {r10, r11} - mov r10, r1, asr #31 - sub sp, sp, #8 - mov r11, r10 - mov r5, r4 - eor r0, r0, r10 - eor r1, r1, r10 - eor r2, r2, r4 - eor r3, r3, r4 - subs r2, r2, r4 - sbc r3, r3, r5 - mov ip, #0 - subs r0, r0, r10 - sbc r1, r1, r11 - str ip, [sp, #0] - bl ASM_PFX(__udivmoddi4) - eor r2, r10, r4 - eor r3, r10, r4 - eor r0, r0, r2 - eor r1, r1, r3 - subs r0, r0, r2 - sbc r1, r1, r3 - sub sp, r7, #16 - ldmfd sp!, {r10, r11} - ldmfd sp!, {r4, r5, r7, pc} diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/divsi3.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/divsi3.S deleted file mode 100644 index eb4c30f6a220..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/divsi3.S +++ /dev/null @@ -1,24 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -ASM_FUNC(__divsi3) - eor r3, r0, r0, asr #31 - eor r2, r1, r1, asr #31 - stmfd sp!, {r4, r5, r7, lr} - mov r5, r0, asr #31 - add r7, sp, #8 - mov r4, r1, asr #31 - sub r0, r3, r0, asr #31 - sub r1, r2, r1, asr #31 - bl ASM_PFX(__udivsi3) - eor r1, r5, r4 - eor r0, r0, r1 - rsb r0, r1, r0 - ldmfd sp!, {r4, r5, r7, pc} diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/lasr.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/lasr.S deleted file mode 100644 index 27201de4bef8..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/lasr.S +++ /dev/null @@ -1,30 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -# -#UINT64 -#EFIAPI -#__aeabi_lasr ( -# IN UINT64 Value -# IN UINT32 Shift -# ); -# -ASM_FUNC(__aeabi_lasr) - subs r3,r2,#0x20 - bpl L_Test - rsb r3,r2,#0x20 - lsr r0,r0,r2 - orr r0,r0,r1,LSL r3 - asr r1,r1,r2 - bx lr -L_Test: - asr r0,r1,r3 - asr r1,r1,#31 - bx lr diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.S deleted file mode 100644 index 15c99c5099e8..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.S +++ /dev/null @@ -1,50 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -//------------------------------------------------------------------------------ - -#include - -// -// A pair of (unsigned) long longs is returned in {{r0, r1}, {r2, r3}}, -// the quotient in {r0, r1}, and the remainder in {r2, r3}. -// -//__value_in_regs lldiv_t -//EFIAPI -//__aeabi_ldivmod ( -// IN UINT64 Dividen -// IN UINT64 Divisor -// )// -// - -ASM_FUNC(__aeabi_ldivmod) - push {r4,lr} - asrs r4,r1,#1 - eor r4,r4,r3,LSR #1 - bpl L_Test1 - rsbs r0,r0,#0 - rsc r1,r1,#0 -L_Test1: - tst r3,r3 - bpl L_Test2 - rsbs r2,r2,#0 - rsc r3,r3,#0 -L_Test2: - bl ASM_PFX(__aeabi_uldivmod) - tst r4,#0x40000000 - beq L_Test3 - rsbs r0,r0,#0 - rsc r1,r1,#0 -L_Test3: - tst r4,#0x80000000 - beq L_Exit - rsbs r2,r2,#0 - rsc r3,r3,#0 -L_Exit: - pop {r4,pc} - - - diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm b/MdePkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm deleted file mode 100644 index 310b2e70dbad..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm +++ /dev/null @@ -1,71 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-// Copyright (c) 2018, Pete Batard. All rights reserved.
-// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -//------------------------------------------------------------------------------ - - - IMPORT __aeabi_uldivmod - EXPORT __aeabi_ldivmod - EXPORT __rt_sdiv64 - - AREA s___aeabi_ldivmod, CODE, READONLY, ARM - - ARM - -; -;INT64 -;EFIAPI -;__rt_sdiv64 ( -; IN INT64 Divisor -; IN INT64 Dividend -; ); -; -__rt_sdiv64 - ; Swap r0-r1 and r2-r3 - MOV r12, r0 - MOV r0, r2 - MOV r2, r12 - MOV r12, r1 - MOV r1, r3 - MOV r3, r12 - B __aeabi_ldivmod - -; -;INT64 -;EFIAPI -;__aeabi_ldivmod ( -; IN INT64 Dividend -; IN INT64 Divisor -; ); -; -__aeabi_ldivmod - PUSH {r4,lr} - ASRS r4,r1,#1 - EOR r4,r4,r3,LSR #1 - BPL L_Test1 - RSBS r0,r0,#0 - RSC r1,r1,#0 -L_Test1 - TST r3,r3 - BPL L_Test2 - RSBS r2,r2,#0 - RSC r3,r3,#0 -L_Test2 - BL __aeabi_uldivmod - TST r4,#0x40000000 - BEQ L_Test3 - RSBS r0,r0,#0 - RSC r1,r1,#0 -L_Test3 - TST r4,#0x80000000 - BEQ L_Exit - RSBS r2,r2,#0 - RSC r3,r3,#0 -L_Exit - POP {r4,pc} - - END diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/llsl.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/llsl.S deleted file mode 100644 index d0a4acd8bda4..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/llsl.S +++ /dev/null @@ -1,31 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2013, ARM. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -# -#VOID -#EFIAPI -#__aeabi_llsl ( -# IN VOID *Destination, -# IN VOID *Source, -# IN UINT32 Size -# ); -# -ASM_FUNC(__aeabi_llsl) - subs r3,r2,#0x20 - bpl 1f - rsb r3,r2,#0x20 - lsl r1,r1,r2 - orr r1,r1,r0,lsr r3 - lsl r0,r0,r2 - bx lr -1: - lsl r1,r0,r3 - mov r0,#0 - bx lr diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/llsr.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/llsr.S deleted file mode 100644 index af6fd27028d1..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/llsr.S +++ /dev/null @@ -1,30 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2013, ARM. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -#VOID -#EFIAPI -#__aeabi_llsr ( -# IN VOID *Destination, -# IN VOID *Source, -# IN UINT32 Size -# ); -# -ASM_FUNC(__aeabi_llsr) - subs r3,r2,#0x20 - bpl 1f - rsb r3,r2,#0x20 - lsr r0,r0,r2 - orr r0,r0,r1,lsl r3 - lsr r1,r1,r2 - bx lr -1: - lsr r0,r1,r3 - mov r1,#0 - bx lr diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm b/MdePkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm deleted file mode 100644 index fce1df28f01c..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm +++ /dev/null @@ -1,39 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-// Copyright (c) 2018, Pete Batard. All rights reserved.
-// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -//------------------------------------------------------------------------------ - - EXPORT __aeabi_llsr - EXPORT __rt_srsh - - AREA s___aeabi_llsr, CODE, READONLY, ARM - - ARM - -; -;VOID -;EFIAPI -;__aeabi_llsr ( -; IN UINT64 Value, -; IN UINT32 Shift -;) -; -__aeabi_llsr -__rt_srsh - SUBS r3,r2,#0x20 - BPL __aeabi_llsr_label1 - RSB r3,r2,#0x20 - LSR r0,r0,r2 - ORR r0,r0,r1,LSL r3 - LSR r1,r1,r2 - BX lr -__aeabi_llsr_label1 - LSR r0,r1,r3 - MOV r1,#0 - BX lr - - END diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/lshrdi3.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/lshrdi3.S deleted file mode 100644 index 288573c855d3..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/lshrdi3.S +++ /dev/null @@ -1,27 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -ASM_FUNC(__lshrdi3) - cmp r2, #31 - bls L2 - cmp r2, #63 - subls r2, r2, #32 - movls r2, r1, lsr r2 - movhi r2, #0 - mov r0, r2 - mov r1, #0 - bx lr -L2: - cmp r2, #0 - rsbne r3, r2, #32 - movne r3, r1, asl r3 - movne r1, r1, lsr r2 - orrne r0, r3, r0, lsr r2 - bx lr diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/memmove.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/memmove.S deleted file mode 100644 index d8588d3d98eb..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/memmove.S +++ /dev/null @@ -1,40 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2011-2014, ARM Limited. All rights reserved. -# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -# VOID -# EFIAPI -# memmove ( -# IN VOID *Destination, -# IN CONST VOID *Source, -# IN UINT32 Size -# ); -ASM_FUNC(memmove) - CMP r2, #0 - BXEQ lr - CMP r0, r1 - BXEQ lr - BHI memmove_backward - -memmove_forward: - LDRB r3, [r1], #1 - STRB r3, [r0], #1 - SUBS r2, r2, #1 - BXEQ lr - B memmove_forward - -memmove_backward: - add r0, r2 - add r1, r2 -memmove_backward_loop: - LDRB r3, [r1, #-1]! - STRB r3, [r0, #-1]! - SUBS r2, r2, #1 - BXEQ lr - B memmove_backward_loop diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/moddi3.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/moddi3.S deleted file mode 100644 index e208f8fd2837..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/moddi3.S +++ /dev/null @@ -1,38 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -ASM_FUNC(__moddi3) - stmfd sp!, {r4, r5, r7, lr} - mov r4, r1, asr #31 - add r7, sp, #8 - stmfd sp!, {r10, r11} - mov r10, r3, asr #31 - sub sp, sp, #16 - mov r5, r4 - mov r11, r10 - eor r0, r0, r4 - eor r1, r1, r4 - eor r2, r2, r10 - eor r3, r3, r10 - add ip, sp, #8 - subs r0, r0, r4 - sbc r1, r1, r5 - subs r2, r2, r10 - sbc r3, r3, r11 - str ip, [sp, #0] - bl ASM_PFX(__udivmoddi4) - ldrd r0, [sp, #8] - eor r0, r0, r4 - eor r1, r1, r4 - subs r0, r0, r4 - sbc r1, r1, r5 - sub sp, r7, #16 - ldmfd sp!, {r10, r11} - ldmfd sp!, {r4, r5, r7, pc} diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/modsi3.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/modsi3.S deleted file mode 100644 index d67f88f717a7..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/modsi3.S +++ /dev/null @@ -1,19 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -ASM_FUNC(__modsi3) - stmfd sp!, {r4, r5, r7, lr} - add r7, sp, #8 - mov r5, r0 - mov r4, r1 - bl ASM_PFX(__divsi3) - mul r0, r4, r0 - rsb r0, r0, r5 - ldmfd sp!, {r4, r5, r7, pc} diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/muldi3.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/muldi3.S deleted file mode 100644 index 6fdc527ecce5..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/muldi3.S +++ /dev/null @@ -1,50 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -ASM_FUNC(__muldi3) - stmfd sp!, {r4, r5, r6, r7, lr} - add r7, sp, #12 - stmfd sp!, {r8, r10, r11} - ldr r11, L4 - mov r4, r0, lsr #16 - and r8, r0, r11 - and ip, r2, r11 - mul lr, ip, r8 - mul ip, r4, ip - sub sp, sp, #8 - add r10, ip, lr, lsr #16 - and ip, r10, r11 - and lr, lr, r11 - mov r6, r2, lsr #16 - str r4, [sp, #4] - add r4, lr, ip, asl #16 - mul ip, r8, r6 - mov r5, r10, lsr #16 - add r10, ip, r4, lsr #16 - and ip, r10, r11 - and lr, r4, r11 - add r4, lr, ip, asl #16 - mul r0, r3, r0 - add ip, r5, r10, lsr #16 - ldr r5, [sp, #4] - mla r0, r2, r1, r0 - mla r5, r6, r5, ip - mov r10, r4 - add r11, r0, r5 - mov r1, r11 - mov r0, r4 - sub sp, r7, #24 - ldmfd sp!, {r8, r10, r11} - ldmfd sp!, {r4, r5, r6, r7, pc} - .p2align 2 -L5: - .align 2 -L4: - .long 65535 diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/mullu.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/mullu.S deleted file mode 100644 index a878f3aaf2f7..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/mullu.S +++ /dev/null @@ -1,38 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ -.text - -GCC_ASM_EXPORT(__ARM_ll_mullu) -GCC_ASM_EXPORT(__aeabi_lmul) -# -#INT64 -#EFIAPI -#__aeabi_lmul ( -# IN INT64 Multiplicand -# IN INT32 Multiplier -# ); -# -ASM_PFX(__ARM_ll_mullu): - mov r3, #0 -# Make upper part of INT64 Multiplier 0 and use __aeabi_lmul - -# -#INT64 -#EFIAPI -#__aeabi_lmul ( -# IN INT64 Multiplicand -# IN INT64 Multiplier -# ); -# -ASM_PFX(__aeabi_lmul): - stmdb sp!, {lr} - mov lr, r0 - umull r0, ip, r2, lr - mla r1, r2, r1, ip - mla r1, r3, lr, r1 - ldmia sp!, {pc} diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/sourcery.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/sourcery.S deleted file mode 100644 index 81459fcfcd01..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/sourcery.S +++ /dev/null @@ -1,49 +0,0 @@ -#------s------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - - - .text - .align 2 - GCC_ASM_EXPORT(__aeabi_ulcmp) - -ASM_PFX(__aeabi_ulcmp): - stmfd sp!, {r4, r5, r8} - cmp r3, r1 - mov r8, r0 - mov r9, r1 - mov r4, r2 - mov r5, r3 - bls L16 -L2: - mvn r0, #0 -L1: - ldmfd sp!, {r4, r5, r8} - bx lr -L16: - beq L17 -L4: - cmp r9, r5 - bhi L7 - beq L18 - cmp r8, r4 -L14: - cmpeq r9, r5 - moveq r0, #0 - beq L1 - b L1 -L18: - cmp r8, r4 - bls L14 -L7: - mov r0, #1 - b L1 -L17: - cmp r2, r0 - bhi L2 - b L4 - diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/switch16.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/switch16.S deleted file mode 100644 index 32870878b32a..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/switch16.S +++ /dev/null @@ -1,24 +0,0 @@ -#/** @file -# Compiler intrinsic for ARM compiler -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#**/ -# - -#include - -.syntax unified - -ASM_FUNC(__switch16) - ldrh ip, [lr, #-1] - cmp r0, ip - add r0, lr, r0, lsl #1 - ldrshcc r0, [r0, #1] - add ip, lr, ip, lsl #1 - ldrshcs r0, [ip, #1] - add ip, lr, r0, lsl #1 - bx ip - - diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/switch32.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/switch32.S deleted file mode 100644 index 040d65d6dc27..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/switch32.S +++ /dev/null @@ -1,23 +0,0 @@ -#/** @file -# Compiler intrinsic for ARM compiler -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#**/ -# - -#include - -.syntax unified - -ASM_FUNC(__switch32) - ldr ip, [lr, #-1] - cmp r0, ip - add r0, lr, r0, lsl #2 - ldrcc r0, [r0, #3] - add ip, lr, ip, lsl #2 - ldrcs r0, [ip, #3] - add ip, lr, r0 - bx ip - diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/switch8.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/switch8.S deleted file mode 100644 index 08fec9a8a0f2..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/switch8.S +++ /dev/null @@ -1,21 +0,0 @@ -#/** @file -# Compiler intrinsic for ARM compiler -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#**/ -# - -#include - -.syntax unified - -ASM_FUNC(__switch8) - ldrb ip, [lr, #-1] - cmp r0, ip - ldrsbcc r0, [lr, r0] - ldrsbcs r0, [lr, ip] - add ip, lr, r0, lsl #1 - bx ip - diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/switchu8.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/switchu8.S deleted file mode 100644 index a94b368ef911..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/switchu8.S +++ /dev/null @@ -1,21 +0,0 @@ -#/** @file -# Compiler intrinsic for ARM compiler -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#**/ -# - -#include - -.syntax unified - -ASM_FUNC(__switchu8) - ldrb ip,[lr,#-1] - cmp r0,ip - ldrbcc r0,[lr,r0] - ldrbcs r0,[lr,ip] - add ip,lr,r0,LSL #1 - bx ip - diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/ucmpdi2.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/ucmpdi2.S deleted file mode 100644 index 8d199fb0e288..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/ucmpdi2.S +++ /dev/null @@ -1,30 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -ASM_FUNC(__ucmpdi2) - stmfd sp!, {r4, r5, r8, lr} - cmp r1, r3 - mov r8, r0 - mov r4, r2 - mov r5, r3 - bcc L2 - bhi L4 - cmp r0, r2 - bcc L2 - movls r0, #1 - bls L8 - b L4 -L2: - mov r0, #0 - b L8 -L4: - mov r0, #2 -L8: - ldmfd sp!, {r4, r5, r8, pc} diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/udivdi3.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/udivdi3.S deleted file mode 100644 index ccb6f6c6c0f9..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/udivdi3.S +++ /dev/null @@ -1,19 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -ASM_FUNC(__udivdi3) - stmfd sp!, {r7, lr} - add r7, sp, #0 - sub sp, sp, #8 - mov ip, #0 - str ip, [sp, #0] - bl ASM_PFX(__udivmoddi4) - sub sp, r7, #0 - ldmfd sp!, {r7, pc} diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/udivmoddi4.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/udivmoddi4.S deleted file mode 100644 index edee8fc33687..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/udivmoddi4.S +++ /dev/null @@ -1,236 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - - .syntax unified - -ASM_FUNC(__udivmoddi4) - stmfd sp!, {r4, r5, r6, r7, lr} - add r7, sp, #12 - stmfd sp!, {r10, r11} - sub sp, sp, #20 - stmia sp, {r2-r3} - ldr r6, [sp, #48] - orrs r2, r2, r3 - mov r10, r0 - mov r11, r1 - beq L2 - subs ip, r1, #0 - bne L4 - cmp r3, #0 - bne L6 - cmp r6, #0 - beq L8 - mov r1, r2 - bl ASM_PFX(__umodsi3) - mov r1, #0 - stmia r6, {r0-r1} -L8: - ldr r1, [sp, #0] - mov r0, r10 - b L45 -L6: - cmp r6, #0 - movne r1, #0 - stmiane r6, {r0-r1} - b L2 -L4: - ldr r1, [sp, #0] - cmp r1, #0 - bne L12 - ldr r2, [sp, #4] - cmp r2, #0 - bne L14 - cmp r6, #0 - beq L16 - mov r1, r2 - mov r0, r11 - bl ASM_PFX(__umodsi3) - mov r1, #0 - stmia r6, {r0-r1} -L16: - ldr r1, [sp, #4] - mov r0, r11 -L45: - bl ASM_PFX(__udivsi3) -L46: - mov r10, r0 - mov r11, #0 - b L10 -L14: - subs r1, r0, #0 - bne L18 - cmp r6, #0 - beq L16 - ldr r1, [sp, #4] - mov r0, r11 - bl ASM_PFX(__umodsi3) - mov r4, r10 - mov r5, r0 - stmia r6, {r4-r5} - b L16 -L18: - sub r3, r2, #1 - tst r2, r3 - bne L22 - cmp r6, #0 - movne r4, r0 - andne r5, ip, r3 - stmiane r6, {r4-r5} -L24: - rsb r3, r2, #0 - and r3, r2, r3 - clz r3, r3 - rsb r3, r3, #31 - mov r0, ip, lsr r3 - b L46 -L22: - clz r2, r2 - clz r3, ip - rsb r3, r3, r2 - cmp r3, #30 - bhi L48 - rsb r2, r3, #31 - add lr, r3, #1 - mov r3, r1, asl r2 - str r3, [sp, #12] - mov r3, r1, lsr lr - ldr r0, [sp, #0] - mov r5, ip, lsr lr - orr r4, r3, ip, asl r2 - str r0, [sp, #8] - b L29 -L12: - ldr r3, [sp, #4] - cmp r3, #0 - bne L30 - sub r3, r1, #1 - tst r1, r3 - bne L32 - cmp r6, #0 - andne r3, r3, r0 - movne r2, r3 - movne r3, #0 - stmiane r6, {r2-r3} -L34: - cmp r1, #1 - beq L10 - rsb r3, r1, #0 - and r3, r1, r3 - clz r3, r3 - rsb r0, r3, #31 - mov r1, ip, lsr r0 - rsb r3, r0, #32 - mov r0, r10, lsr r0 - orr ip, r0, ip, asl r3 - str r1, [sp, #12] - str ip, [sp, #8] - ldrd r10, [sp, #8] - b L10 -L32: - clz r2, r1 - clz r3, ip - rsb r3, r3, r2 - rsb r4, r3, #31 - mov r2, r0, asl r4 - mvn r1, r3 - and r2, r2, r1, asr #31 - add lr, r3, #33 - str r2, [sp, #8] - add r2, r3, #1 - mov r3, r3, asr #31 - and r0, r3, r0, asl r1 - mov r3, r10, lsr r2 - orr r3, r3, ip, asl r4 - and r3, r3, r1, asr #31 - orr r0, r0, r3 - mov r3, ip, lsr lr - str r0, [sp, #12] - mov r0, r10, lsr lr - and r5, r3, r2, asr #31 - rsb r3, lr, #31 - mov r3, r3, asr #31 - orr r0, r0, ip, asl r1 - and r3, r3, ip, lsr r2 - and r0, r0, r2, asr #31 - orr r4, r3, r0 - b L29 -L30: - clz r2, r3 - clz r3, ip - rsb r3, r3, r2 - cmp r3, #31 - bls L37 -L48: - cmp r6, #0 - stmiane r6, {r10-r11} - b L2 -L37: - rsb r1, r3, #31 - mov r0, r0, asl r1 - add lr, r3, #1 - mov r2, #0 - str r0, [sp, #12] - mov r0, r10, lsr lr - str r2, [sp, #8] - sub r2, r3, #31 - and r0, r0, r2, asr #31 - mov r3, ip, lsr lr - orr r4, r0, ip, asl r1 - and r5, r3, r2, asr #31 -L29: - mov ip, #0 - mov r10, ip - b L40 -L41: - ldr r1, [sp, #12] - ldr r2, [sp, #8] - mov r3, r4, lsr #31 - orr r5, r3, r5, asl #1 - mov r3, r1, lsr #31 - orr r4, r3, r4, asl #1 - mov r3, r2, lsr #31 - orr r0, r3, r1, asl #1 - orr r1, ip, r2, asl #1 - ldmia sp, {r2-r3} - str r0, [sp, #12] - subs r2, r2, r4 - sbc r3, r3, r5 - str r1, [sp, #8] - subs r0, r2, #1 - sbc r1, r3, #0 - mov r2, r1, asr #31 - ldmia sp, {r0-r1} - mov r3, r2 - and ip, r2, #1 - and r3, r3, r1 - and r2, r2, r0 - subs r4, r4, r2 - sbc r5, r5, r3 - add r10, r10, #1 -L40: - cmp r10, lr - bne L41 - ldrd r0, [sp, #8] - adds r0, r0, r0 - adc r1, r1, r1 - cmp r6, #0 - orr r10, r0, ip - mov r11, r1 - stmiane r6, {r4-r5} - b L10 -L2: - mov r10, #0 - mov r11, #0 -L10: - mov r0, r10 - mov r1, r11 - sub sp, r7, #20 - ldmfd sp!, {r10, r11} - ldmfd sp!, {r4, r5, r6, r7, pc} diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/udivsi3.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/udivsi3.S deleted file mode 100644 index 100a6a00d899..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/udivsi3.S +++ /dev/null @@ -1,51 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - - .syntax unified - -ASM_FUNC(__udivsi3) - cmp r1, #0 - cmpne r0, #0 - stmfd sp!, {r4, r5, r7, lr} - add r7, sp, #8 - beq L2 - clz r2, r1 - clz r3, r0 - rsb r3, r3, r2 - cmp r3, #31 - bhi L2 - ldmfdeq sp!, {r4, r5, r7, pc} - add r5, r3, #1 - rsb r3, r3, #31 - mov lr, #0 - mov r2, r0, asl r3 - mov ip, r0, lsr r5 - mov r4, lr - b L8 -L9: - mov r0, r2, lsr #31 - orr ip, r0, ip, asl #1 - orr r2, r3, lr - rsb r3, ip, r1 - sub r3, r3, #1 - and r0, r1, r3, asr #31 - mov lr, r3, lsr #31 - rsb ip, r0, ip - add r4, r4, #1 -L8: - cmp r4, r5 - mov r3, r2, asl #1 - bne L9 - orr r0, r3, lr - ldmfd sp!, {r4, r5, r7, pc} -L2: - mov r0, #0 - ldmfd sp!, {r4, r5, r7, pc} - diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/uldiv.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/uldiv.S deleted file mode 100644 index f61128301a32..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/uldiv.S +++ /dev/null @@ -1,261 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -//------------------------------------------------------------------------------ - - - - .text - .align 2 - GCC_ASM_EXPORT(__aeabi_uldivmod) - -// -//UINT64 -//EFIAPI -//__aeabi_uldivmod ( -// IN UINT64 Dividend -// IN UINT64 Divisor -// ) -// -ASM_PFX(__aeabi_uldivmod): - stmdb sp!, {r4, r5, r6, lr} - mov r4, r1 - mov r5, r0 - mov r6, #0 // 0x0 - orrs ip, r3, r2, lsr #31 - bne ASM_PFX(__aeabi_uldivmod_label1) - tst r2, r2 - beq ASM_PFX(_ll_div0) - movs ip, r2, lsr #15 - addeq r6, r6, #16 // 0x10 - mov ip, r2, lsl r6 - movs lr, ip, lsr #23 - moveq ip, ip, lsl #8 - addeq r6, r6, #8 // 0x8 - movs lr, ip, lsr #27 - moveq ip, ip, lsl #4 - addeq r6, r6, #4 // 0x4 - movs lr, ip, lsr #29 - moveq ip, ip, lsl #2 - addeq r6, r6, #2 // 0x2 - movs lr, ip, lsr #30 - moveq ip, ip, lsl #1 - addeq r6, r6, #1 // 0x1 - b ASM_PFX(_ll_udiv_small) -ASM_PFX(__aeabi_uldivmod_label1): - tst r3, #-2147483648 // 0x80000000 - bne ASM_PFX(__aeabi_uldivmod_label2) - movs ip, r3, lsr #15 - addeq r6, r6, #16 // 0x10 - mov ip, r3, lsl r6 - movs lr, ip, lsr #23 - moveq ip, ip, lsl #8 - addeq r6, r6, #8 // 0x8 - movs lr, ip, lsr #27 - moveq ip, ip, lsl #4 - addeq r6, r6, #4 // 0x4 - movs lr, ip, lsr #29 - moveq ip, ip, lsl #2 - addeq r6, r6, #2 // 0x2 - movs lr, ip, lsr #30 - addeq r6, r6, #1 // 0x1 - rsb r3, r6, #32 // 0x20 - moveq ip, ip, lsl #1 - orr ip, ip, r2, lsr r3 - mov lr, r2, lsl r6 - b ASM_PFX(_ll_udiv_big) -ASM_PFX(__aeabi_uldivmod_label2): - mov ip, r3 - mov lr, r2 - b ASM_PFX(_ll_udiv_ginormous) - -ASM_PFX(_ll_udiv_small): - cmp r4, ip, lsl #1 - mov r3, #0 // 0x0 - subcs r4, r4, ip, lsl #1 - addcs r3, r3, #2 // 0x2 - cmp r4, ip - subcs r4, r4, ip - adcs r3, r3, #0 // 0x0 - add r2, r6, #32 // 0x20 - cmp r2, #32 // 0x20 - rsb ip, ip, #0 // 0x0 - bcc ASM_PFX(_ll_udiv_small_label1) - orrs r0, r4, r5, lsr #30 - moveq r4, r5 - moveq r5, #0 // 0x0 - subeq r2, r2, #32 // 0x20 -ASM_PFX(_ll_udiv_small_label1): - mov r1, #0 // 0x0 - cmp r2, #16 // 0x10 - bcc ASM_PFX(_ll_udiv_small_label2) - movs r0, r4, lsr #14 - moveq r4, r4, lsl #16 - addeq r1, r1, #16 // 0x10 -ASM_PFX(_ll_udiv_small_label2): - sub lr, r2, r1 - cmp lr, #8 // 0x8 - bcc ASM_PFX(_ll_udiv_small_label3) - movs r0, r4, lsr #22 - moveq r4, r4, lsl #8 - addeq r1, r1, #8 // 0x8 -ASM_PFX(_ll_udiv_small_label3): - rsb r0, r1, #32 // 0x20 - sub r2, r2, r1 - orr r4, r4, r5, lsr r0 - mov r5, r5, lsl r1 - cmp r2, #1 // 0x1 - bcc ASM_PFX(_ll_udiv_small_label5) - sub r2, r2, #1 // 0x1 - and r0, r2, #7 // 0x7 - eor r0, r0, #7 // 0x7 - adds r0, r0, r0, lsl #1 - add pc, pc, r0, lsl #2 - nop // (mov r0,r0) -ASM_PFX(_ll_udiv_small_label4): - adcs r5, r5, r5 - adcs r4, ip, r4, lsl #1 - rsbcc r4, ip, r4 - adcs r5, r5, r5 - adcs r4, ip, r4, lsl #1 - rsbcc r4, ip, r4 - adcs r5, r5, r5 - adcs r4, ip, r4, lsl #1 - rsbcc r4, ip, r4 - adcs r5, r5, r5 - adcs r4, ip, r4, lsl #1 - rsbcc r4, ip, r4 - adcs r5, r5, r5 - adcs r4, ip, r4, lsl #1 - rsbcc r4, ip, r4 - adcs r5, r5, r5 - adcs r4, ip, r4, lsl #1 - rsbcc r4, ip, r4 - adcs r5, r5, r5 - adcs r4, ip, r4, lsl #1 - rsbcc r4, ip, r4 - adcs r5, r5, r5 - adcs r4, ip, r4, lsl #1 - sub r2, r2, #8 // 0x8 - tst r2, r2 - rsbcc r4, ip, r4 - bpl ASM_PFX(_ll_udiv_small_label4) -ASM_PFX(_ll_udiv_small_label5): - mov r2, r4, lsr r6 - bic r4, r4, r2, lsl r6 - adcs r0, r5, r5 - adc r1, r4, r4 - add r1, r1, r3, lsl r6 - mov r3, #0 // 0x0 - ldmia sp!, {r4, r5, r6, pc} - -ASM_PFX(_ll_udiv_big): - subs r0, r5, lr - mov r3, #0 // 0x0 - sbcs r1, r4, ip - movcs r5, r0 - movcs r4, r1 - adcs r3, r3, #0 // 0x0 - subs r0, r5, lr - sbcs r1, r4, ip - movcs r5, r0 - movcs r4, r1 - adcs r3, r3, #0 // 0x0 - subs r0, r5, lr - sbcs r1, r4, ip - movcs r5, r0 - movcs r4, r1 - adcs r3, r3, #0 // 0x0 - mov r1, #0 // 0x0 - rsbs lr, lr, #0 // 0x0 - rsc ip, ip, #0 // 0x0 - cmp r6, #16 // 0x10 - bcc ASM_PFX(_ll_udiv_big_label1) - movs r0, r4, lsr #14 - moveq r4, r4, lsl #16 - addeq r1, r1, #16 // 0x10 -ASM_PFX(_ll_udiv_big_label1): - sub r2, r6, r1 - cmp r2, #8 // 0x8 - bcc ASM_PFX(_ll_udiv_big_label2) - movs r0, r4, lsr #22 - moveq r4, r4, lsl #8 - addeq r1, r1, #8 // 0x8 -ASM_PFX(_ll_udiv_big_label2): - rsb r0, r1, #32 // 0x20 - sub r2, r6, r1 - orr r4, r4, r5, lsr r0 - mov r5, r5, lsl r1 - cmp r2, #1 // 0x1 - bcc ASM_PFX(_ll_udiv_big_label4) - sub r2, r2, #1 // 0x1 - and r0, r2, #3 // 0x3 - rsb r0, r0, #3 // 0x3 - adds r0, r0, r0, lsl #1 - add pc, pc, r0, lsl #3 - nop // (mov r0,r0) -ASM_PFX(_ll_udiv_big_label3): - adcs r5, r5, r5 - adcs r4, r4, r4 - adcs r0, lr, r5 - adcs r1, ip, r4 - movcs r5, r0 - movcs r4, r1 - adcs r5, r5, r5 - adcs r4, r4, r4 - adcs r0, lr, r5 - adcs r1, ip, r4 - movcs r5, r0 - movcs r4, r1 - adcs r5, r5, r5 - adcs r4, r4, r4 - adcs r0, lr, r5 - adcs r1, ip, r4 - movcs r5, r0 - movcs r4, r1 - sub r2, r2, #4 // 0x4 - adcs r5, r5, r5 - adcs r4, r4, r4 - adcs r0, lr, r5 - adcs r1, ip, r4 - tst r2, r2 - movcs r5, r0 - movcs r4, r1 - bpl ASM_PFX(_ll_udiv_big_label3) -ASM_PFX(_ll_udiv_big_label4): - mov r1, #0 // 0x0 - mov r2, r5, lsr r6 - bic r5, r5, r2, lsl r6 - adcs r0, r5, r5 - adc r1, r1, #0 // 0x0 - movs lr, r3, lsl r6 - mov r3, r4, lsr r6 - bic r4, r4, r3, lsl r6 - adc r1, r1, #0 // 0x0 - adds r0, r0, lr - orr r2, r2, r4, ror r6 - adc r1, r1, #0 // 0x0 - ldmia sp!, {r4, r5, r6, pc} - -ASM_PFX(_ll_udiv_ginormous): - subs r2, r5, lr - mov r1, #0 // 0x0 - sbcs r3, r4, ip - adc r0, r1, r1 - movcc r2, r5 - movcc r3, r4 - ldmia sp!, {r4, r5, r6, pc} - -ASM_PFX(_ll_div0): - ldmia sp!, {r4, r5, r6, lr} - mov r0, #0 // 0x0 - mov r1, #0 // 0x0 - b ASM_PFX(__aeabi_ldiv0) - -ASM_PFX(__aeabi_ldiv0): - bx r14 - - diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm b/MdePkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm deleted file mode 100644 index e143052a712f..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm +++ /dev/null @@ -1,282 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-// Copyright (c) 2018, Pete Batard. All rights reserved.
-// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// -//------------------------------------------------------------------------------ - - - EXPORT __aeabi_uldivmod - EXPORT __rt_udiv64 - - AREA s___aeabi_uldivmod, CODE, READONLY, ARM - - ARM - -; -;UINT64 -;EFIAPI -;__rt_udiv64 ( -; IN UINT64 Divisor -; IN UINT64 Dividend -; ) -; -__rt_udiv64 - ; Swap r0-r1 and r2-r3 - mov r12, r0 - mov r0, r2 - mov r2, r12 - mov r12, r1 - mov r1, r3 - mov r3, r12 - b __aeabi_uldivmod - -; -;UINT64 -;EFIAPI -;__aeabi_uldivmod ( -; IN UINT64 Dividend -; IN UINT64 Divisor -; ) -; -__aeabi_uldivmod - stmdb sp!, {r4, r5, r6, lr} - mov r4, r1 - mov r5, r0 - mov r6, #0 ; 0x0 - orrs ip, r3, r2, lsr #31 - bne __aeabi_uldivmod_label1 - tst r2, r2 - beq _ll_div0 - movs ip, r2, lsr #15 - addeq r6, r6, #16 ; 0x10 - mov ip, r2, lsl r6 - movs lr, ip, lsr #23 - moveq ip, ip, lsl #8 - addeq r6, r6, #8 ; 0x8 - movs lr, ip, lsr #27 - moveq ip, ip, lsl #4 - addeq r6, r6, #4 ; 0x4 - movs lr, ip, lsr #29 - moveq ip, ip, lsl #2 - addeq r6, r6, #2 ; 0x2 - movs lr, ip, lsr #30 - moveq ip, ip, lsl #1 - addeq r6, r6, #1 ; 0x1 - b _ll_udiv_small -__aeabi_uldivmod_label1 - tst r3, #-2147483648 ; 0x80000000 - bne __aeabi_uldivmod_label2 - movs ip, r3, lsr #15 - addeq r6, r6, #16 ; 0x10 - mov ip, r3, lsl r6 - movs lr, ip, lsr #23 - moveq ip, ip, lsl #8 - addeq r6, r6, #8 ; 0x8 - movs lr, ip, lsr #27 - moveq ip, ip, lsl #4 - addeq r6, r6, #4 ; 0x4 - movs lr, ip, lsr #29 - moveq ip, ip, lsl #2 - addeq r6, r6, #2 ; 0x2 - movs lr, ip, lsr #30 - addeq r6, r6, #1 ; 0x1 - rsb r3, r6, #32 ; 0x20 - moveq ip, ip, lsl #1 - orr ip, ip, r2, lsr r3 - mov lr, r2, lsl r6 - b _ll_udiv_big -__aeabi_uldivmod_label2 - mov ip, r3 - mov lr, r2 - b _ll_udiv_ginormous - -_ll_udiv_small - cmp r4, ip, lsl #1 - mov r3, #0 ; 0x0 - subcs r4, r4, ip, lsl #1 - addcs r3, r3, #2 ; 0x2 - cmp r4, ip - subcs r4, r4, ip - adcs r3, r3, #0 ; 0x0 - add r2, r6, #32 ; 0x20 - cmp r2, #32 ; 0x20 - rsb ip, ip, #0 ; 0x0 - bcc _ll_udiv_small_label1 - orrs r0, r4, r5, lsr #30 - moveq r4, r5 - moveq r5, #0 ; 0x0 - subeq r2, r2, #32 ; 0x20 -_ll_udiv_small_label1 - mov r1, #0 ; 0x0 - cmp r2, #16 ; 0x10 - bcc _ll_udiv_small_label2 - movs r0, r4, lsr #14 - moveq r4, r4, lsl #16 - addeq r1, r1, #16 ; 0x10 -_ll_udiv_small_label2 - sub lr, r2, r1 - cmp lr, #8 ; 0x8 - bcc _ll_udiv_small_label3 - movs r0, r4, lsr #22 - moveq r4, r4, lsl #8 - addeq r1, r1, #8 ; 0x8 -_ll_udiv_small_label3 - rsb r0, r1, #32 ; 0x20 - sub r2, r2, r1 - orr r4, r4, r5, lsr r0 - mov r5, r5, lsl r1 - cmp r2, #1 ; 0x1 - bcc _ll_udiv_small_label5 - sub r2, r2, #1 ; 0x1 - and r0, r2, #7 ; 0x7 - eor r0, r0, #7 ; 0x7 - adds r0, r0, r0, lsl #1 - add pc, pc, r0, lsl #2 - nop ; (mov r0,r0) -_ll_udiv_small_label4 - adcs r5, r5, r5 - adcs r4, ip, r4, lsl #1 - rsbcc r4, ip, r4 - adcs r5, r5, r5 - adcs r4, ip, r4, lsl #1 - rsbcc r4, ip, r4 - adcs r5, r5, r5 - adcs r4, ip, r4, lsl #1 - rsbcc r4, ip, r4 - adcs r5, r5, r5 - adcs r4, ip, r4, lsl #1 - rsbcc r4, ip, r4 - adcs r5, r5, r5 - adcs r4, ip, r4, lsl #1 - rsbcc r4, ip, r4 - adcs r5, r5, r5 - adcs r4, ip, r4, lsl #1 - rsbcc r4, ip, r4 - adcs r5, r5, r5 - adcs r4, ip, r4, lsl #1 - rsbcc r4, ip, r4 - adcs r5, r5, r5 - adcs r4, ip, r4, lsl #1 - sub r2, r2, #8 ; 0x8 - tst r2, r2 - rsbcc r4, ip, r4 - bpl _ll_udiv_small_label4 -_ll_udiv_small_label5 - mov r2, r4, lsr r6 - bic r4, r4, r2, lsl r6 - adcs r0, r5, r5 - adc r1, r4, r4 - add r1, r1, r3, lsl r6 - mov r3, #0 ; 0x0 - ldmia sp!, {r4, r5, r6, pc} - -_ll_udiv_big - subs r0, r5, lr - mov r3, #0 ; 0x0 - sbcs r1, r4, ip - movcs r5, r0 - movcs r4, r1 - adcs r3, r3, #0 ; 0x0 - subs r0, r5, lr - sbcs r1, r4, ip - movcs r5, r0 - movcs r4, r1 - adcs r3, r3, #0 ; 0x0 - subs r0, r5, lr - sbcs r1, r4, ip - movcs r5, r0 - movcs r4, r1 - adcs r3, r3, #0 ; 0x0 - mov r1, #0 ; 0x0 - rsbs lr, lr, #0 ; 0x0 - rsc ip, ip, #0 ; 0x0 - cmp r6, #16 ; 0x10 - bcc _ll_udiv_big_label1 - movs r0, r4, lsr #14 - moveq r4, r4, lsl #16 - addeq r1, r1, #16 ; 0x10 -_ll_udiv_big_label1 - sub r2, r6, r1 - cmp r2, #8 ; 0x8 - bcc _ll_udiv_big_label2 - movs r0, r4, lsr #22 - moveq r4, r4, lsl #8 - addeq r1, r1, #8 ; 0x8 -_ll_udiv_big_label2 - rsb r0, r1, #32 ; 0x20 - sub r2, r6, r1 - orr r4, r4, r5, lsr r0 - mov r5, r5, lsl r1 - cmp r2, #1 ; 0x1 - bcc _ll_udiv_big_label4 - sub r2, r2, #1 ; 0x1 - and r0, r2, #3 ; 0x3 - rsb r0, r0, #3 ; 0x3 - adds r0, r0, r0, lsl #1 - add pc, pc, r0, lsl #3 - nop ; (mov r0,r0) -_ll_udiv_big_label3 - adcs r5, r5, r5 - adcs r4, r4, r4 - adcs r0, lr, r5 - adcs r1, ip, r4 - movcs r5, r0 - movcs r4, r1 - adcs r5, r5, r5 - adcs r4, r4, r4 - adcs r0, lr, r5 - adcs r1, ip, r4 - movcs r5, r0 - movcs r4, r1 - adcs r5, r5, r5 - adcs r4, r4, r4 - adcs r0, lr, r5 - adcs r1, ip, r4 - movcs r5, r0 - movcs r4, r1 - sub r2, r2, #4 ; 0x4 - adcs r5, r5, r5 - adcs r4, r4, r4 - adcs r0, lr, r5 - adcs r1, ip, r4 - tst r2, r2 - movcs r5, r0 - movcs r4, r1 - bpl _ll_udiv_big_label3 -_ll_udiv_big_label4 - mov r1, #0 ; 0x0 - mov r2, r5, lsr r6 - bic r5, r5, r2, lsl r6 - adcs r0, r5, r5 - adc r1, r1, #0 ; 0x0 - movs lr, r3, lsl r6 - mov r3, r4, lsr r6 - bic r4, r4, r3, lsl r6 - adc r1, r1, #0 ; 0x0 - adds r0, r0, lr - orr r2, r2, r4, ror r6 - adc r1, r1, #0 ; 0x0 - ldmia sp!, {r4, r5, r6, pc} - -_ll_udiv_ginormous - subs r2, r5, lr - mov r1, #0 ; 0x0 - sbcs r3, r4, ip - adc r0, r1, r1 - movcc r2, r5 - movcc r3, r4 - ldmia sp!, {r4, r5, r6, pc} - -_ll_div0 - ldmia sp!, {r4, r5, r6, lr} - mov r0, #0 ; 0x0 - mov r1, #0 ; 0x0 - b __aeabi_ldiv0 - -__aeabi_ldiv0 - bx r14 - - END diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/umoddi3.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/umoddi3.S deleted file mode 100644 index b22a785e0823..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/umoddi3.S +++ /dev/null @@ -1,21 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -ASM_FUNC(__umoddi3) - stmfd sp!, {r7, lr} - add r7, sp, #0 - sub sp, sp, #16 - add ip, sp, #8 - str ip, [sp, #0] - bl ASM_PFX(__udivmoddi4) - ldrd r0, [sp, #8] - sub sp, r7, #0 - ldmfd sp!, {r7, pc} - diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/umodsi3.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/umodsi3.S deleted file mode 100644 index ee548afe17da..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/umodsi3.S +++ /dev/null @@ -1,20 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -ASM_FUNC(__umodsi3) - stmfd sp!, {r4, r5, r7, lr} - add r7, sp, #8 - mov r5, r0 - mov r4, r1 - bl ASM_PFX(__udivsi3) - mul r0, r4, r0 - rsb r0, r0, r5 - ldmfd sp!, {r4, r5, r7, pc} - diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/uread.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/uread.S deleted file mode 100644 index 132975c6a146..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/uread.S +++ /dev/null @@ -1,54 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -# -#UINT32 -#EFIAPI -#__aeabi_uread4 ( -# IN VOID *Pointer -# ); -# -ASM_FUNC(__aeabi_uread4) - ldrb r1, [r0] - ldrb r2, [r0, #1] - ldrb r3, [r0, #2] - ldrb r0, [r0, #3] - orr r1, r1, r2, lsl #8 - orr r1, r1, r3, lsl #16 - orr r0, r1, r0, lsl #24 - bx lr - -# -#UINT64 -#EFIAPI -#__aeabi_uread8 ( -# IN VOID *Pointer -# ); -# -ASM_FUNC(__aeabi_uread8) - mov r3, r0 - - ldrb r1, [r3] - ldrb r2, [r3, #1] - orr r1, r1, r2, lsl #8 - ldrb r2, [r3, #2] - orr r1, r1, r2, lsl #16 - ldrb r0, [r3, #3] - orr r0, r1, r0, lsl #24 - - ldrb r1, [r3, #4] - ldrb r2, [r3, #5] - orr r1, r1, r2, lsl #8 - ldrb r2, [r3, #6] - orr r1, r1, r2, lsl #16 - ldrb r2, [r3, #7] - orr r1, r1, r2, lsl #24 - - bx lr diff --git a/MdePkg/Library/CompilerIntrinsicsLib/Arm/uwrite.S b/MdePkg/Library/CompilerIntrinsicsLib/Arm/uwrite.S deleted file mode 100644 index 2c56ba3e063b..000000000000 --- a/MdePkg/Library/CompilerIntrinsicsLib/Arm/uwrite.S +++ /dev/null @@ -1,53 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - -#include - -# -#UINT32 -#EFIAPI -#__aeabi_uwrite4 ( -# IN UINT32 Data, -# IN VOID *Pointer -# ); -# -ASM_FUNC(__aeabi_uwrite4) - mov r2, r0, lsr #8 - strb r0, [r1] - strb r2, [r1, #1] - mov r2, r0, lsr #16 - strb r2, [r1, #2] - mov r2, r0, lsr #24 - strb r2, [r1, #3] - bx lr - -# -#UINT64 -#EFIAPI -#__aeabi_uwrite8 ( -# IN UINT64 Data, -# IN VOID *Pointer -# ); -# -ASM_FUNC(__aeabi_uwrite8) - mov r3, r0, lsr #8 - strb r0, [r2] - strb r3, [r2, #1] - mov r3, r0, lsr #16 - strb r3, [r2, #2] - mov r3, r0, lsr #24 - strb r3, [r2, #3] - - mov r3, r1, lsr #8 - strb r1, [r2, #4] - strb r3, [r2, #5] - mov r3, r1, lsr #16 - strb r3, [r2, #6] - mov r3, r1, lsr #24 - strb r3, [r2, #7] - bx lr diff --git a/MdePkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf b/MdePkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf index ac48b4624653..d9c22d94e15a 100644 --- a/MdePkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf +++ b/MdePkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf @@ -26,44 +26,6 @@ memcmp_ms.c | MSFT memmove_ms.c | MSFT -[Sources.ARM] - Arm/ashrdi3.S | GCC - Arm/ashldi3.S | GCC - Arm/div.S | GCC - Arm/divdi3.S | GCC - Arm/divsi3.S | GCC - Arm/lshrdi3.S | GCC - Arm/memmove.S | GCC - Arm/modsi3.S | GCC - Arm/moddi3.S | GCC - Arm/muldi3.S | GCC - Arm/mullu.S | GCC - Arm/udivsi3.S | GCC - Arm/umodsi3.S | GCC - Arm/udivdi3.S | GCC - Arm/umoddi3.S | GCC - Arm/udivmoddi4.S | GCC - Arm/clzsi2.S | GCC - Arm/ctzsi2.S | GCC - Arm/ucmpdi2.S | GCC - Arm/switch8.S | GCC - Arm/switchu8.S | GCC - Arm/switch16.S | GCC - Arm/switch32.S | GCC - Arm/sourcery.S | GCC - Arm/uldiv.S | GCC - Arm/ldivmod.S | GCC - Arm/lasr.S | GCC - Arm/llsr.S | GCC - Arm/llsl.S | GCC - Arm/uread.S | GCC - Arm/uwrite.S | GCC - - Arm/div.asm | MSFT - Arm/uldiv.asm | MSFT - Arm/ldivmod.asm | MSFT - Arm/llsr.asm | MSFT - [Sources.AARCH64] AArch64/Atomics.S | GCC AArch64/ashlti3.S | GCC @@ -73,4 +35,3 @@ [BuildOptions] MSFT:*_*_*_CC_FLAGS = /GL- - MSFT:*_*_ARM_ASM_FLAGS = /oldit diff --git a/MdePkg/Library/CompilerIntrinsicsLib/memcmp_ms.c b/MdePkg/Library/CompilerIntrinsicsLib/memcmp_ms.c index cedbfca47139..1932d49d6fdb 100644 --- a/MdePkg/Library/CompilerIntrinsicsLib/memcmp_ms.c +++ b/MdePkg/Library/CompilerIntrinsicsLib/memcmp_ms.c @@ -7,11 +7,7 @@ // // ------------------------------------------------------------------------------ -#if defined (_M_ARM64) typedef unsigned __int64 size_t; -#else -typedef unsigned __int32 size_t; -#endif int memcmp ( diff --git a/MdePkg/Library/CompilerIntrinsicsLib/memcpy.c b/MdePkg/Library/CompilerIntrinsicsLib/memcpy.c index 415146f7f2bf..5c4d6074b280 100644 --- a/MdePkg/Library/CompilerIntrinsicsLib/memcpy.c +++ b/MdePkg/Library/CompilerIntrinsicsLib/memcpy.c @@ -37,31 +37,3 @@ memcpy ( __memcpy (dest, src, n); return dest; } - -#ifdef __arm__ - -__attribute__ ((__alias__ ("__memcpy"))) -void -__aeabi_memcpy ( - void *dest, - const void *src, - size_t n - ); - -__attribute__ ((__alias__ ("__memcpy"))) -void -__aeabi_memcpy4 ( - void *dest, - const void *src, - size_t n - ); - -__attribute__ ((__alias__ ("__memcpy"))) -void -__aeabi_memcpy8 ( - void *dest, - const void *src, - size_t n - ); - -#endif diff --git a/MdePkg/Library/CompilerIntrinsicsLib/memcpy_ms.c b/MdePkg/Library/CompilerIntrinsicsLib/memcpy_ms.c index 0eafa83ed476..6aa37a91ae57 100644 --- a/MdePkg/Library/CompilerIntrinsicsLib/memcpy_ms.c +++ b/MdePkg/Library/CompilerIntrinsicsLib/memcpy_ms.c @@ -7,11 +7,7 @@ // // ------------------------------------------------------------------------------ -#if defined (_M_ARM64) typedef unsigned __int64 size_t; -#else -typedef unsigned __int32 size_t; -#endif void * memcpy ( diff --git a/MdePkg/Library/CompilerIntrinsicsLib/memmove_ms.c b/MdePkg/Library/CompilerIntrinsicsLib/memmove_ms.c index f68eb52a6ca5..b1edb6804323 100644 --- a/MdePkg/Library/CompilerIntrinsicsLib/memmove_ms.c +++ b/MdePkg/Library/CompilerIntrinsicsLib/memmove_ms.c @@ -7,11 +7,7 @@ // // ------------------------------------------------------------------------------ -#if defined (_M_ARM64) typedef unsigned __int64 size_t; -#else -typedef unsigned __int32 size_t; -#endif void * memmove ( diff --git a/MdePkg/Library/CompilerIntrinsicsLib/memset.c b/MdePkg/Library/CompilerIntrinsicsLib/memset.c index 3e45302fe677..c0f03c5822f6 100644 --- a/MdePkg/Library/CompilerIntrinsicsLib/memset.c +++ b/MdePkg/Library/CompilerIntrinsicsLib/memset.c @@ -41,56 +41,3 @@ memset ( int c, size_t n ); - -#ifdef __arm__ - -void -__aeabi_memset ( - void *dest, - size_t n, - int c - ) -{ - __memset (dest, c, n); -} - -__attribute__ ((__alias__ ("__aeabi_memset"))) -void -__aeabi_memset4 ( - void *dest, - size_t n, - int c - ); - -__attribute__ ((__alias__ ("__aeabi_memset"))) -void -__aeabi_memset8 ( - void *dest, - size_t n, - int c - ); - -void -__aeabi_memclr ( - void *dest, - size_t n - ) -{ - __memset (dest, 0, n); -} - -__attribute__ ((__alias__ ("__aeabi_memclr"))) -void -__aeabi_memclr4 ( - void *dest, - size_t n - ); - -__attribute__ ((__alias__ ("__aeabi_memclr"))) -void -__aeabi_memclr8 ( - void *dest, - size_t n - ); - -#endif diff --git a/MdePkg/Library/CompilerIntrinsicsLib/memset_ms.c b/MdePkg/Library/CompilerIntrinsicsLib/memset_ms.c index 5882cd28b06d..ddd07374838d 100644 --- a/MdePkg/Library/CompilerIntrinsicsLib/memset_ms.c +++ b/MdePkg/Library/CompilerIntrinsicsLib/memset_ms.c @@ -7,11 +7,7 @@ // // ------------------------------------------------------------------------------ -#if defined (_M_ARM64) typedef unsigned __int64 size_t; -#else -typedef unsigned __int32 size_t; -#endif void * memset ( diff --git a/MdePkg/MdeLibs.dsc.inc b/MdePkg/MdeLibs.dsc.inc index c55979ec67dc..3131b9fc5d2f 100644 --- a/MdePkg/MdeLibs.dsc.inc +++ b/MdePkg/MdeLibs.dsc.inc @@ -59,12 +59,12 @@ # implements exception handling for SEC and PEI_CORE, it can use StackCheckLib for these phases in its DSC. StackCheckLib|MdePkg/Library/StackCheckLibNull/StackCheckLibNull.inf -[LibraryClasses.ARM, LibraryClasses.AARCH64] +[LibraryClasses.AARCH64] # - # It is not possible to prevent the ARM/AARCH64 compilers from inserting generic intrinsic functions. + # It is not possible to prevent the AARCH64 compilers from inserting generic intrinsic functions. # This library provides the intrinsic functions generated by these compilers. # - # Linking this here as a null library will cause all ARM/AARCH64 files to link against it and have + # Linking this here as a null library will cause all AARCH64 files to link against it and have # definitions for the intrinsic functions. # NULL|MdePkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf From 2ff173af128e707867c6409f2e4ca308c255ca32 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Wed, 17 Sep 2025 14:24:49 -0700 Subject: [PATCH 0556/1172] BaseTools: Remove ARM32 Support edk2 is dropping support for the ARM32 architecture. This commit removes ARM32 code from BaseTools. Signed-off-by: Oliver Smith-Denny --- BaseTools/Bin/GccLto/liblto-arm.a | Bin 2096 -> 0 bytes BaseTools/Bin/GccLto/liblto-arm.s | 55 --- BaseTools/Conf/build_rule.template | 4 +- BaseTools/Conf/target.template | 2 +- BaseTools/Conf/tools_def.template | 336 +----------------- BaseTools/Edk2ToolsBuild.py | 28 +- .../LinuxGccToolChain/LinuxGccToolChain.py | 30 +- .../WindowsVsToolChain/WindowsVsToolChain.py | 12 +- BaseTools/Scripts/ConvertMasmToNasm.py | 2 +- .../EdkPlugins/edk2/model/doxygengen.py | 3 +- .../EdkPlugins/edk2/model/doxygengen_spec.py | 3 +- BaseTools/Scripts/RunMakefile.py | 2 +- BaseTools/Scripts/efi_debugging.py | 1 - BaseTools/Source/C/Common/BasePeCoff.c | 14 - BaseTools/Source/C/Common/PeCoffLib.h | 65 ---- BaseTools/Source/C/Common/PeCoffLoaderEx.c | 156 -------- BaseTools/Source/C/EfiRom/EfiRom.h | 1 - BaseTools/Source/C/GenFv/GenFvInternalLib.c | 125 +------ BaseTools/Source/C/GenFw/Elf32Convert.c | 264 +------------- BaseTools/Source/C/Makefiles/GnuMakeUtils.py | 12 - BaseTools/Source/C/Makefiles/header.makefile | 4 - BaseTools/Source/C/Makefiles/ms.common | 9 - .../C/VfrCompile/Pccts/antlr/AntlrMS.mak | 2 +- .../Source/C/VfrCompile/Pccts/dlg/DlgMS.mak | 2 +- BaseTools/Source/Python/AutoGen/GenC.py | 4 +- .../Python/Capsule/GenerateWindowsDriver.py | 2 +- BaseTools/Source/Python/Common/DataType.py | 19 +- BaseTools/Source/Python/Ecc/Check.py | 2 +- BaseTools/Source/Python/GenFds/GenFds.py | 2 +- .../Source/Python/TargetTool/TargetTool.py | 2 +- .../Source/Python/UPT/Library/DataType.py | 23 +- BaseTools/Source/Python/build/build.py | 12 +- BaseTools/Source/Python/build/buildoptions.py | 2 +- 33 files changed, 57 insertions(+), 1143 deletions(-) delete mode 100644 BaseTools/Bin/GccLto/liblto-arm.a delete mode 100644 BaseTools/Bin/GccLto/liblto-arm.s diff --git a/BaseTools/Bin/GccLto/liblto-arm.a b/BaseTools/Bin/GccLto/liblto-arm.a deleted file mode 100644 index d811c09573a35ea87a8002ecf01be18e1c6e7fd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2096 zcmd6o%WKq76vn?XQ*C|Js#WW|YOD1@u(oJH7cHm=wjd(Xg%C3{sS}#eGD-SEunQLz zT?o1mx)E36&V>ti;!4n^e}Mi6u3h<^n@J{fT}_x@dNmx{6!*W2si#P63O*VzW?IBihqh z=)ig*pojKb#bw326`xc*toV}R>x!op&nRA0ysG%I;^&HAD}JZ=gW^w$zbO8u_=n=3 zihn6C7jA)^cemm`#e<4%#TOM%D88Zij$&7Fpm;^`6UFO_-zdgF4UQAVZgtkF)@Pj= z*ALnp_Y=1vL)@s|sQDwQ6*Mh*7aYIlFNiybaLxo6PTG16rQHlllhBAv-k>#u2@Sol zI=`G}CPrQiN;tRR(ak(*AdNItn6xb{AamTrttlr6972!~lYGJ?&mg`uh4`8leFjDu zR1H=l|GXG+(@3h}e9gF`ML(|A$Jm)#Ny{9*kb6fYIz6K#U~GZXiE;<`AQQJZh#Ex* zvPafpsg(EM+QeEU%F9+!7AJXjt<6BM=oX+)l${4fw*md4-N1n8cCac_8FW^32XIbw zCm?m%V%-}PWwOhnEHdMwdw?sVdjY8%7AKh$-3Qzh-4EOrJpf1@u{il%(L=yJ(ZfJZ z^axNF?FRzUqrklAF(4K_4lIdsu@6KCfmP8Hz#~x>xiwL4;;HB<;F;)Y;DzWJUhHT& zjNJ+~ZlqeztcDlZv9}b%uDP)byAnmP`PA5M95?(*5_=I7{9EHzOij*-d{<&4d*_Y!hx!AINvPBvHw{hmarpIg2NWNZUrI#!p wAAvlV^sI41<6<;hHcoUy=A?e-|05l;7C8giM-Tt9*KBPx@rv+1OG3`f-+dwCzyJUM diff --git a/BaseTools/Bin/GccLto/liblto-arm.s b/BaseTools/Bin/GccLto/liblto-arm.s deleted file mode 100644 index f19fb455519d..000000000000 --- a/BaseTools/Bin/GccLto/liblto-arm.s +++ /dev/null @@ -1,55 +0,0 @@ -// -// Copyright (c) 2016, Linaro Ltd. All rights reserved.
-// -// SPDX-License-Identifier: BSD-2-Clause-Patent -// - -// -// GCC in LTO mode interoperates poorly with non-standard libraries that -// provide implementations of compiler intrinsics such as memcpy/memset -// or the stack protector entry points. -// -// By referencing these functions from a non-LTO object that can be passed -// to the linker via the -plugin-opt=-pass-through=-lxxx options, the -// intrinsics are included in the link in a way that allows them to be -// pruned again if no other references to them exist. -// - - .long memcpy - . - .long memset - . - .long __stack_chk_fail - . - .long __stack_chk_guard - . - .long __ashrdi3 - . - .long __ashldi3 - . - .long __aeabi_idiv - . - .long __aeabi_idivmod - . - .long __aeabi_uidiv - . - .long __aeabi_uidivmod - . - .long __divdi3 - . - .long __divsi3 - . - .long __lshrdi3 - . - .long __aeabi_memcpy - . - .long __aeabi_memset - . - .long memmove - . - .long __modsi3 - . - .long __moddi3 - . - .long __muldi3 - . - .long __aeabi_lmul - . - .long __ARM_ll_mullu - . - .long __udivsi3 - . - .long __umodsi3 - . - .long __udivdi3 - . - .long __umoddi3 - . - .long __udivmoddi4 - . - .long __clzsi2 - . - .long __ctzsi2 - . - .long __ucmpdi2 - . - .long __switch8 - . - .long __switchu8 - . - .long __switch16 - . - .long __switch32 - . - .long __aeabi_ulcmp - . - .long __aeabi_uldivmod - . - .long __aeabi_ldivmod - . - .long __aeabi_llsr - . - .long __aeabi_llsl - . diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_rule.template index 20fcc9b4b287..76263a10659b 100755 --- a/BaseTools/Conf/build_rule.template +++ b/BaseTools/Conf/build_rule.template @@ -152,7 +152,7 @@ "$(CC)" $(DEPS_FLAGS) $(CC_FLAGS) $(CXX_FLAGS) -o ${dst} $(INC) ${src} -[C-Code-File.BASE.AARCH64,C-Code-File.SEC.AARCH64,C-Code-File.PEI_CORE.AARCH64,C-Code-File.PEIM.AARCH64,C-Code-File.BASE.ARM,C-Code-File.SEC.ARM,C-Code-File.PEI_CORE.ARM,C-Code-File.PEIM.ARM] +[C-Code-File.BASE.AARCH64,C-Code-File.SEC.AARCH64,C-Code-File.PEI_CORE.AARCH64,C-Code-File.PEIM.AARCH64] ?.c @@ -198,7 +198,7 @@ Trim --trim-long --source-code -o ${d_path}(+)${s_base}.iiii ${d_path}(+)${s_base}.ii "$(ASM)" $(ASM_FLAGS) -o ${dst} $(INC) ${d_path}(+)${s_base}.iiii -[Assembly-Code-File.COMMON.ARM,Assembly-Code-File.COMMON.AARCH64] +[Assembly-Code-File.COMMON.AARCH64] # Remove --convert-hex for ARM as it breaks MSFT assemblers ?.asm, ?.Asm, ?.ASM diff --git a/BaseTools/Conf/target.template b/BaseTools/Conf/target.template index aa78132e0bb6..57064aae172e 100644 --- a/BaseTools/Conf/target.template +++ b/BaseTools/Conf/target.template @@ -28,7 +28,7 @@ ACTIVE_PLATFORM = EmulatorPkg/EmulatorPkg.dsc TARGET = DEBUG # TARGET_ARCH List Optional What kind of architecture is the binary being target for. -# One, or more, of the following, IA32, X64, EBC, ARM, AARCH64, +# One, or more, of the following, IA32, X64, EBC, AARCH64, # RISCV64 or LOONGARCH64. # Multiple values can be specified on a single line, using # space characters to separate the values. These are used diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index 3f34349ddc57..ab59da016324 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -22,8 +22,9 @@ # - Deprecate GCC48, GCC49 and GCC5. # 3.01 - Add toolchain for VS2022 # 3.02 - Enable stack cookies for IA32, X64, ARM, and AARCH64 builds for GCC and MSVC +# 3.03 - Drop ARM32 Support # -#!VERSION=3.02 +#!VERSION=3.03 IDENTIFIER = Default TOOL_CHAIN_CONF @@ -42,21 +43,18 @@ DEFINE VS2017_BIN = ENV(VS2017_PREFIX)bin DEFINE VS2017_BIN_HOST = DEF(VS2017_BIN)\HostDEF(VS_HOST)\DEF(VS_HOST) DEFINE VS2017_BIN_IA32 = DEF(VS2017_BIN)\HostDEF(VS_HOST)\x86 DEFINE VS2017_BIN_X64 = DEF(VS2017_BIN)\HostDEF(VS_HOST)\x64 -DEFINE VS2017_BIN_ARM = DEF(VS2017_BIN)\HostDEF(VS_HOST)\arm DEFINE VS2017_BIN_AARCH64 = DEF(VS2017_BIN)\HostDEF(VS_HOST)\arm64 DEFINE VS2019_BIN = ENV(VS2019_PREFIX)bin DEFINE VS2019_BIN_HOST = DEF(VS2019_BIN)\HostDEF(VS_HOST)\DEF(VS_HOST) DEFINE VS2019_BIN_IA32 = DEF(VS2019_BIN)\HostDEF(VS_HOST)\x86 DEFINE VS2019_BIN_X64 = DEF(VS2019_BIN)\HostDEF(VS_HOST)\x64 -DEFINE VS2019_BIN_ARM = DEF(VS2019_BIN)\HostDEF(VS_HOST)\arm DEFINE VS2019_BIN_AARCH64 = DEF(VS2019_BIN)\HostDEF(VS_HOST)\arm64 DEFINE VS2022_BIN = ENV(VS2022_PREFIX)bin DEFINE VS2022_BIN_HOST = DEF(VS2022_BIN)\HostDEF(VS_HOST)\DEF(VS_HOST) DEFINE VS2022_BIN_IA32 = DEF(VS2022_BIN)\HostDEF(VS_HOST)\x86 DEFINE VS2022_BIN_X64 = DEF(VS2022_BIN)\HostDEF(VS_HOST)\x64 -DEFINE VS2022_BIN_ARM = DEF(VS2022_BIN)\HostDEF(VS_HOST)\arm DEFINE VS2022_BIN_AARCH64 = DEF(VS2022_BIN)\HostDEF(VS_HOST)\arm64 # @@ -159,8 +157,8 @@ DEFINE DTC_BIN = ENV(DTC_PREFIX)dtc # Intel(r) ACPI Compiler (iasl.exe) from # https://acpica.org/downloads # Note: -# Building of XIP firmware images for ARM/ARM64 is not currently supported (only applications). -# /FILEALIGN:4096 and other changes are needed for ARM firmware builds. +# Building of XIP firmware images for ARM64 is not currently supported (only applications). +# /FILEALIGN:4096 and other changes are needed for ARM64 firmware builds. # VS2019 -win32- Requires: # Microsoft Visual Studio 2019 version 16.2 or later # Optional: @@ -173,13 +171,13 @@ DEFINE DTC_BIN = ENV(DTC_PREFIX)dtc # Required to build EBC drivers: # Intel(r) Compiler for Efi Byte Code (Intel(r) EBC Compiler) # GCCNOLTO -Linux,Windows- Requires: -# GCC 4.9 targeting x86_64-linux-gnu, aarch64-linux-gnu, or arm-linux-gnueabi +# GCC 4.9 targeting x86_64-linux-gnu or aarch64-linux-gnu # Optional: # Required to build platforms or ACPI tables: # Intel(r) ACPI Compiler from # https://acpica.org/downloads # GCC -Linux,Windows- Requires: -# GCC 5 with LTO support, targeting x86_64-linux-gnu, aarch64-linux-gnu, arm-linux-gnueabi, riscv64-linux-gnu or loongarch64-linux-gnu +# GCC 5 with LTO support, targeting x86_64-linux-gnu, aarch64-linux-gnu, riscv64-linux-gnu or loongarch64-linux-gnu # Optional: # Required to build platforms or ACPI tables: # Intel(r) ACPI Compiler from @@ -207,19 +205,19 @@ DEFINE DTC_BIN = ENV(DTC_PREFIX)dtc # Deprecated Tool Chains # ====================== # GCC48 -Linux,Windows- Requires: -# GCC 4.8 targeting x86_64-linux-gnu, aarch64-linux-gnu, or arm-linux-gnueabi +# GCC 4.8 targeting x86_64-linux-gnu or aarch64-linux-gnu # Optional: # Required to build platforms or ACPI tables: # Intel(r) ACPI Compiler from # https://acpica.org/downloads # GCC49 -Linux,Windows- Requires: -# GCC 4.9 targeting x86_64-linux-gnu, aarch64-linux-gnu, or arm-linux-gnueabi +# GCC 4.9 targeting x86_64-linux-gnu or aarch64-linux-gnu # Optional: # Required to build platforms or ACPI tables: # Intel(r) ACPI Compiler from # https://acpica.org/downloads # GCC5 -Linux,Windows- Requires: -# GCC 5 with LTO support, targeting x86_64-linux-gnu, aarch64-linux-gnu, arm-linux-gnueabi, riscv64-linux-gnu or loongarch64-linux-gnu +# GCC 5 with LTO support, targeting x86_64-linux-gnu, aarch64-linux-gnu, riscv64-linux-gnu or loongarch64-linux-gnu # Optional: # Required to build platforms or ACPI tables: # Intel(r) ACPI Compiler from @@ -541,32 +539,6 @@ NOOPT_VS2017_X64_NASM_FLAGS = -O0 -f win64 -g RELEASE_VS2017_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4281 /IGNORE:4254 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /Machine:X64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.rdata=.data NOOPT_VS2017_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4281 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /Machine:X64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /DEBUG -################# -# ARM definitions -################# -*_VS2017_ARM_CC_PATH = DEF(VS2017_BIN_ARM)\cl.exe -*_VS2017_ARM_VFRPP_PATH = DEF(VS2017_BIN_ARM)\cl.exe -*_VS2017_ARM_SLINK_PATH = DEF(VS2017_BIN_ARM)\lib.exe -*_VS2017_ARM_DLINK_PATH = DEF(VS2017_BIN_ARM)\link.exe -*_VS2017_ARM_APP_PATH = DEF(VS2017_BIN_ARM)\cl.exe -*_VS2017_ARM_PP_PATH = DEF(VS2017_BIN_ARM)\cl.exe -*_VS2017_ARM_ASM_PATH = DEF(VS2017_BIN_ARM)\armasm.exe -*_VS2017_ARM_ASLCC_PATH = DEF(VS2017_BIN_ARM)\cl.exe -*_VS2017_ARM_ASLPP_PATH = DEF(VS2017_BIN_ARM)\cl.exe -*_VS2017_ARM_ASLDLINK_PATH = DEF(VS2017_BIN_ARM)\link.exe - - DEBUG_VS2017_ARM_CC_FLAGS = /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Gw /Oi- -RELEASE_VS2017_ARM_CC_FLAGS = /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gw /Oi- -NOOPT_VS2017_ARM_CC_FLAGS = /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Od /Oi- - - DEBUG_VS2017_ARM_ASM_FLAGS = /nologo /g -RELEASE_VS2017_ARM_ASM_FLAGS = /nologo -NOOPT_VS2017_ARM_ASM_FLAGS = /nologo - - DEBUG_VS2017_ARM_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:ARM /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /DEBUG -RELEASE_VS2017_ARM_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4254 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:ARM /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.rdata=.data -NOOPT_VS2017_ARM_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:ARM /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /DEBUG - ##################### # AARCH64 definitions ##################### @@ -682,32 +654,6 @@ NOOPT_VS2019_X64_NASM_FLAGS = -O0 -f win64 -g RELEASE_VS2019_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4281 /IGNORE:4254 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /Machine:X64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.rdata=.data NOOPT_VS2019_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4281 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /Machine:X64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /DEBUG -################# -# ARM definitions -################# -*_VS2019_ARM_CC_PATH = DEF(VS2019_BIN_ARM)\cl.exe -*_VS2019_ARM_VFRPP_PATH = DEF(VS2019_BIN_ARM)\cl.exe -*_VS2019_ARM_SLINK_PATH = DEF(VS2019_BIN_ARM)\lib.exe -*_VS2019_ARM_DLINK_PATH = DEF(VS2019_BIN_ARM)\link.exe -*_VS2019_ARM_APP_PATH = DEF(VS2019_BIN_ARM)\cl.exe -*_VS2019_ARM_PP_PATH = DEF(VS2019_BIN_ARM)\cl.exe -*_VS2019_ARM_ASM_PATH = DEF(VS2019_BIN_ARM)\armasm.exe -*_VS2019_ARM_ASLCC_PATH = DEF(VS2019_BIN_ARM)\cl.exe -*_VS2019_ARM_ASLPP_PATH = DEF(VS2019_BIN_ARM)\cl.exe -*_VS2019_ARM_ASLDLINK_PATH = DEF(VS2019_BIN_ARM)\link.exe - - DEBUG_VS2019_ARM_CC_FLAGS = /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Gw /Oi- -RELEASE_VS2019_ARM_CC_FLAGS = /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gw /Oi- -NOOPT_VS2019_ARM_CC_FLAGS = /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Od /Oi- - - DEBUG_VS2019_ARM_ASM_FLAGS = /nologo /g -RELEASE_VS2019_ARM_ASM_FLAGS = /nologo -NOOPT_VS2019_ARM_ASM_FLAGS = /nologo - - DEBUG_VS2019_ARM_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:ARM /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /DEBUG -RELEASE_VS2019_ARM_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4254 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:ARM /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.rdata=.data -NOOPT_VS2019_ARM_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:ARM /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /DEBUG - ##################### # AARCH64 definitions ##################### @@ -837,39 +783,6 @@ NOOPT_VS2022_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:428 # BaseTools cannot handle XIP modules with different section and file alignment *_VS2022_X64_DLINK_XIPFLAGS = /ALIGN:32 -################# -# ARM definitions -################# -*_VS2022_ARM_CC_PATH = DEF(VS2022_BIN_ARM)\cl.exe -*_VS2022_ARM_VFRPP_PATH = DEF(VS2022_BIN_ARM)\cl.exe -*_VS2022_ARM_SLINK_PATH = DEF(VS2022_BIN_ARM)\lib.exe -*_VS2022_ARM_DLINK_PATH = DEF(VS2022_BIN_ARM)\link.exe -*_VS2022_ARM_APP_PATH = DEF(VS2022_BIN_ARM)\cl.exe -*_VS2022_ARM_PP_PATH = DEF(VS2022_BIN_ARM)\cl.exe -*_VS2022_ARM_ASM_PATH = DEF(VS2022_BIN_ARM)\armasm.exe -*_VS2022_ARM_ASLCC_PATH = DEF(VS2022_BIN_ARM)\cl.exe -*_VS2022_ARM_ASLPP_PATH = DEF(VS2022_BIN_ARM)\cl.exe -*_VS2022_ARM_ASLDLINK_PATH = DEF(VS2022_BIN_ARM)\link.exe - - *_VS2022_ARM_MAKE_FLAGS = /nologo - DEBUG_VS2022_ARM_CC_FLAGS = /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Gw /Oi- -RELEASE_VS2022_ARM_CC_FLAGS = /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gw /Oi- -NOOPT_VS2022_ARM_CC_FLAGS = /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Od /Oi- - - DEBUG_VS2022_ARM_ASM_FLAGS = /nologo /g -RELEASE_VS2022_ARM_ASM_FLAGS = /nologo -NOOPT_VS2022_ARM_ASM_FLAGS = /nologo - -# Linker warning 4210 is disabled globally, because it checks if static initializers are present and the VCRuntime is -# linked. We do not link the VCRuntime (except for HOST_APPLICATIONs) so this warning can be generated erroneously -# whenever there are static initializers, because we will always fail the VCRuntime linking check - DEBUG_VS2022_ARM_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:ARM /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /DEBUG /WX /IGNORE:4210 -RELEASE_VS2022_ARM_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4254 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:ARM /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.rdata=.data /WX /IGNORE:4210 -NOOPT_VS2022_ARM_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:ARM /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /DEBUG /WX /IGNORE:4210 - -# BaseTools cannot handle XIP modules with different section and file alignment -*_VS2022_ARM_DLINK_XIPFLAGS = /ALIGN:64 - ##################### # AARCH64 definitions ##################### @@ -922,21 +835,15 @@ NOOPT_*_*_OBJCOPY_ADDDEBUGFLAG = --add-gnu-debuglink="$(DEBUG_DIR)/$(MODULE_ # All supported GCC archs except LOONGARCH64 support -mstack-protector-guard=global, so set that on everything except LOONGARCH64 DEFINE GCC_ALL_CC_FLAGS = -g -Os -fshort-wchar -fno-builtin -fno-strict-aliasing -Wall -Werror -Wno-array-bounds -include AutoGen.h -fno-common -fstack-protector DEFINE GCC_IA32_X64_CC_FLAGS = -mstack-protector-guard=global -DEFINE GCC_ARM_CC_FLAGS = DEF(GCC_ALL_CC_FLAGS) -mlittle-endian -mabi=aapcs -fno-short-enums -funsigned-char -ffunction-sections -fdata-sections -fomit-frame-pointer -Wno-address -mthumb -fno-pic -fno-pie -mstack-protector-guard=global DEFINE GCC_LOONGARCH64_CC_FLAGS = DEF(GCC_ALL_CC_FLAGS) -mabi=lp64d -fno-asynchronous-unwind-tables -Wno-address -fno-short-enums -fsigned-char -ffunction-sections -fdata-sections -DEFINE GCC_ARM_CC_XIPFLAGS = -mno-unaligned-access DEFINE GCC_AARCH64_CC_FLAGS = DEF(GCC_ALL_CC_FLAGS) -mlittle-endian -fno-short-enums -fverbose-asm -funsigned-char -ffunction-sections -fdata-sections -Wno-address -fno-asynchronous-unwind-tables -fno-unwind-tables -fno-pic -fno-pie -ffixed-x18 -mstack-protector-guard=global DEFINE GCC_AARCH64_CC_XIPFLAGS = -mstrict-align -mgeneral-regs-only DEFINE GCC_RISCV64_CC_XIPFLAGS = -mstrict-align -mgeneral-regs-only DEFINE GCC_DLINK2_FLAGS_COMMON = -Wl,--script=$(EDK_TOOLS_PATH)/Scripts/GccBase.lds -DEFINE GCC_ARM_AARCH64_DLINK_COMMON= -Wl,--emit-relocs -nostdlib -Wl,--gc-sections -u $(IMAGE_ENTRY_POINT) -Wl,-e,$(IMAGE_ENTRY_POINT),-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map DEFINE GCC_LOONGARCH64_DLINK_COMMON= -Wl,--emit-relocs -nostdlib -Wl,--gc-sections -u $(IMAGE_ENTRY_POINT) -Wl,-e,$(IMAGE_ENTRY_POINT),-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map -DEFINE GCC_ARM_DLINK_FLAGS = DEF(GCC_ARM_AARCH64_DLINK_COMMON) -z common-page-size=0x20 -Wl,--pic-veneer -DEFINE GCC_AARCH64_DLINK_FLAGS = DEF(GCC_ARM_AARCH64_DLINK_COMMON) -z common-page-size=0x20 +DEFINE GCC_AARCH64_DLINK_FLAGS = -Wl,--emit-relocs -nostdlib -Wl,--gc-sections -u $(IMAGE_ENTRY_POINT) -Wl,-e,$(IMAGE_ENTRY_POINT),-Map,$(DEST_DIR_DEBUG)/$(BASE_NAME).map -z common-page-size=0x20 DEFINE GCC_LOONGARCH64_DLINK_FLAGS = DEF(GCC_LOONGARCH64_DLINK_COMMON) -z common-page-size=0x20 -DEFINE GCC_ARM_AARCH64_ASLDLINK_FLAGS = -Wl,--defsym=PECOFF_HEADER_SIZE=0 DEF(GCC_DLINK2_FLAGS_COMMON) -z common-page-size=0x20 -DEFINE GCC_ARM_ASLDLINK_FLAGS = DEF(GCC_ARM_DLINK_FLAGS) -Wl,--entry,ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) DEF(GCC_ARM_AARCH64_ASLDLINK_FLAGS) -DEFINE GCC_AARCH64_ASLDLINK_FLAGS = DEF(GCC_AARCH64_DLINK_FLAGS) -Wl,--entry,ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) DEF(GCC_ARM_AARCH64_ASLDLINK_FLAGS) +DEFINE GCC_AARCH64_ASLDLINK_FLAGS = DEF(GCC_AARCH64_DLINK_FLAGS) -Wl,--entry,ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) -Wl,--defsym=PECOFF_HEADER_SIZE=0 DEF(GCC_DLINK2_FLAGS_COMMON) -z common-page-size=0x20 DEFINE GCC_LOONGARCH64_ASLDLINK_FLAGS = DEF(GCC_LOONGARCH64_DLINK_FLAGS) -Wl,--entry,ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT) DEFINE GCC_ASM_FLAGS = -c -x assembler DEFINE GCC_PP_FLAGS = -E -x assembler-with-cpp -include AutoGen.h @@ -947,7 +854,6 @@ DEFINE GCC_WINDRES_FLAGS = -J rc -O coff DEFINE GCC_DTCPP_FLAGS = -E -x assembler-with-cpp -imacros AutoGen.h -nostdinc -undef DEFINE GCC_IA32_RC_FLAGS = -I binary -O elf32-i386 -B i386 --rename-section .data=.hii DEFINE GCC_X64_RC_FLAGS = -I binary -O elf64-x86-64 -B i386 --rename-section .data=.hii -DEFINE GCC_ARM_RC_FLAGS = -I binary -O elf32-littlearm -B arm --rename-section .data=.hii DEFINE GCC_AARCH64_RC_FLAGS = -I binary -O elf64-littleaarch64 -B aarch64 --rename-section .data=.hii DEFINE GCC_AARCH64_RC_BTI_FLAGS = --add-section .note.gnu.property=$(WORKSPACE)/BaseTools/Bin/GnuNoteBti.bin --set-section-flags .note.gnu.property=alloc,readonly DEFINE GCC_RISCV64_RC_FLAGS = -I binary -O elf64-littleriscv -B riscv --rename-section .data=.hii @@ -966,17 +872,11 @@ DEFINE GCC48_IA32_DLINK2_FLAGS = -Wl,--defsym=PECOFF_HEADER_SIZE=0x220 DEF DEFINE GCC48_X64_DLINK_FLAGS = DEF(GCC48_IA32_X64_DLINK_FLAGS) -Wl,-melf_x86_64,--oformat=elf64-x86-64,-pie DEFINE GCC48_X64_DLINK2_FLAGS = -Wl,--defsym=PECOFF_HEADER_SIZE=0x228 DEF(GCC_DLINK2_FLAGS_COMMON) DEFINE GCC48_ASM_FLAGS = DEF(GCC_ASM_FLAGS) -DEFINE GCC48_ARM_ASM_FLAGS = $(PLATFORM_FLAGS) DEF(GCC_ASM_FLAGS) -mlittle-endian DEFINE GCC48_AARCH64_ASM_FLAGS = $(PLATFORM_FLAGS) DEF(GCC_ASM_FLAGS) -mlittle-endian -DEFINE GCC48_ARM_CC_FLAGS = $(PLATFORM_FLAGS) DEF(GCC_ARM_CC_FLAGS) -mword-relocations -DEFINE GCC48_ARM_CC_XIPFLAGS = DEF(GCC_ARM_CC_XIPFLAGS) DEFINE GCC48_AARCH64_CC_FLAGS = $(PLATFORM_FLAGS) -mcmodel=large DEF(GCC_AARCH64_CC_FLAGS) DEFINE GCC48_AARCH64_CC_XIPFLAGS = DEF(GCC_AARCH64_CC_XIPFLAGS) -DEFINE GCC48_ARM_DLINK_FLAGS = DEF(GCC_ARM_DLINK_FLAGS) -Wl,--oformat=elf32-littlearm -DEFINE GCC48_ARM_DLINK2_FLAGS = DEF(GCC_DLINK2_FLAGS_COMMON) -Wl,--defsym=PECOFF_HEADER_SIZE=0x220 DEFINE GCC48_AARCH64_DLINK_FLAGS = DEF(GCC_AARCH64_DLINK_FLAGS) DEFINE GCC48_AARCH64_DLINK2_FLAGS = DEF(GCC_DLINK2_FLAGS_COMMON) -Wl,--defsym=PECOFF_HEADER_SIZE=0x228 -DEFINE GCC48_ARM_ASLDLINK_FLAGS = DEF(GCC_ARM_ASLDLINK_FLAGS) -Wl,--oformat=elf32-littlearm DEFINE GCC48_AARCH64_ASLDLINK_FLAGS = DEF(GCC_AARCH64_ASLDLINK_FLAGS) DEFINE GCC48_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) @@ -989,17 +889,11 @@ DEFINE GCC49_IA32_DLINK2_FLAGS = DEF(GCC48_IA32_DLINK2_FLAGS) DEFINE GCC49_X64_DLINK_FLAGS = DEF(GCC49_IA32_X64_DLINK_FLAGS) -Wl,-melf_x86_64,--oformat=elf64-x86-64,-pie DEFINE GCC49_X64_DLINK2_FLAGS = DEF(GCC48_X64_DLINK2_FLAGS) DEFINE GCC49_ASM_FLAGS = DEF(GCC48_ASM_FLAGS) -DEFINE GCC49_ARM_ASM_FLAGS = DEF(GCC48_ARM_ASM_FLAGS) DEFINE GCC49_AARCH64_ASM_FLAGS = DEF(GCC48_AARCH64_ASM_FLAGS) -DEFINE GCC49_ARM_CC_FLAGS = DEF(GCC48_ARM_CC_FLAGS) -DEFINE GCC49_ARM_CC_XIPFLAGS = DEF(GCC48_ARM_CC_XIPFLAGS) DEFINE GCC49_AARCH64_CC_FLAGS = $(PLATFORM_FLAGS) DEF(GCC48_ALL_CC_FLAGS) DEF(GCC_AARCH64_CC_FLAGS) -mcmodel=small DEFINE GCC49_AARCH64_CC_XIPFLAGS = DEF(GCC48_AARCH64_CC_XIPFLAGS) -DEFINE GCC49_ARM_DLINK_FLAGS = DEF(GCC48_ARM_DLINK_FLAGS) -DEFINE GCC49_ARM_DLINK2_FLAGS = DEF(GCC48_ARM_DLINK2_FLAGS) DEFINE GCC49_AARCH64_DLINK_FLAGS = DEF(GCC48_AARCH64_DLINK_FLAGS) -z common-page-size=0x1000 DEFINE GCC49_AARCH64_DLINK2_FLAGS = DEF(GCC48_AARCH64_DLINK2_FLAGS) -DEFINE GCC49_ARM_ASLDLINK_FLAGS = DEF(GCC48_ARM_ASLDLINK_FLAGS) DEFINE GCC49_AARCH64_ASLDLINK_FLAGS = DEF(GCC48_AARCH64_ASLDLINK_FLAGS) DEFINE GCC49_ASLCC_FLAGS = DEF(GCC48_ASLCC_FLAGS) @@ -1012,17 +906,11 @@ DEFINE GCC5_IA32_DLINK2_FLAGS = DEF(GCC49_IA32_DLINK2_FLAGS) -Wno-error DEFINE GCC5_X64_DLINK_FLAGS = DEF(GCC49_X64_DLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS) DEFINE GCC5_X64_DLINK2_FLAGS = DEF(GCC49_X64_DLINK2_FLAGS) -Wno-error DEFINE GCC5_ASM_FLAGS = DEF(GCC49_ASM_FLAGS) -DEFINE GCC5_ARM_ASM_FLAGS = DEF(GCC49_ARM_ASM_FLAGS) DEFINE GCC5_AARCH64_ASM_FLAGS = DEF(GCC49_AARCH64_ASM_FLAGS) -DEFINE GCC5_ARM_CC_FLAGS = DEF(GCC49_ARM_CC_FLAGS) -DEFINE GCC5_ARM_CC_XIPFLAGS = DEF(GCC49_ARM_CC_XIPFLAGS) DEFINE GCC5_AARCH64_CC_FLAGS = DEF(GCC49_AARCH64_CC_FLAGS) DEFINE GCC5_AARCH64_CC_XIPFLAGS = DEF(GCC49_AARCH64_CC_XIPFLAGS) -DEFINE GCC5_ARM_DLINK_FLAGS = DEF(GCC49_ARM_DLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS) -DEFINE GCC5_ARM_DLINK2_FLAGS = DEF(GCC49_ARM_DLINK2_FLAGS) -Wno-error DEFINE GCC5_AARCH64_DLINK_FLAGS = DEF(GCC49_AARCH64_DLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS) DEFINE GCC5_AARCH64_DLINK2_FLAGS = DEF(GCC49_AARCH64_DLINK2_FLAGS) -Wno-error -DEFINE GCC5_ARM_ASLDLINK_FLAGS = DEF(GCC49_ARM_ASLDLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS) DEFINE GCC5_AARCH64_ASLDLINK_FLAGS = DEF(GCC49_AARCH64_ASLDLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS) DEFINE GCC5_ASLCC_FLAGS = DEF(GCC49_ASLCC_FLAGS) -fno-lto @@ -1126,36 +1014,6 @@ RELEASE_GCC48_IA32_CC_FLAGS = DEF(GCC48_IA32_CC_FLAGS) -Wno-unused-but-set RELEASE_GCC48_X64_CC_FLAGS = DEF(GCC48_X64_CC_FLAGS) -Wno-unused-but-set-variable NOOPT_GCC48_X64_CC_FLAGS = DEF(GCC48_X64_CC_FLAGS) -O0 -################## -# GCC48 ARM definitions -################## -*_GCC48_ARM_CC_PATH = ENV(GCC48_ARM_PREFIX)gcc -*_GCC48_ARM_SLINK_PATH = ENV(GCC48_ARM_PREFIX)ar -*_GCC48_ARM_DLINK_PATH = ENV(GCC48_ARM_PREFIX)gcc -*_GCC48_ARM_ASLDLINK_PATH = ENV(GCC48_ARM_PREFIX)gcc -*_GCC48_ARM_ASM_PATH = ENV(GCC48_ARM_PREFIX)gcc -*_GCC48_ARM_PP_PATH = ENV(GCC48_ARM_PREFIX)gcc -*_GCC48_ARM_VFRPP_PATH = ENV(GCC48_ARM_PREFIX)gcc -*_GCC48_ARM_ASLCC_PATH = ENV(GCC48_ARM_PREFIX)gcc -*_GCC48_ARM_ASLPP_PATH = ENV(GCC48_ARM_PREFIX)gcc -*_GCC48_ARM_RC_PATH = ENV(GCC48_ARM_PREFIX)objcopy - -*_GCC48_ARM_ASLCC_FLAGS = DEF(GCC48_ASLCC_FLAGS) -*_GCC48_ARM_ASLDLINK_FLAGS = DEF(GCC48_ARM_ASLDLINK_FLAGS) -*_GCC48_ARM_ASM_FLAGS = DEF(GCC48_ARM_ASM_FLAGS) -*_GCC48_ARM_DLINK_FLAGS = DEF(GCC48_ARM_DLINK_FLAGS) -*_GCC48_ARM_DLINK2_FLAGS = DEF(GCC48_ARM_DLINK2_FLAGS) -*_GCC48_ARM_DTCPP_FLAGS = DEF(GCC_DTCPP_FLAGS) -*_GCC48_ARM_PLATFORM_FLAGS = -march=armv7-a -*_GCC48_ARM_PP_FLAGS = $(PLATFORM_FLAGS) DEF(GCC_PP_FLAGS) -*_GCC48_ARM_RC_FLAGS = DEF(GCC_ARM_RC_FLAGS) -*_GCC48_ARM_VFRPP_FLAGS = $(PLATFORM_FLAGS) DEF(GCC_VFRPP_FLAGS) -*_GCC48_ARM_CC_XIPFLAGS = DEF(GCC48_ARM_CC_XIPFLAGS) - - DEBUG_GCC48_ARM_CC_FLAGS = DEF(GCC48_ARM_CC_FLAGS) -O0 -RELEASE_GCC48_ARM_CC_FLAGS = DEF(GCC48_ARM_CC_FLAGS) -Wno-unused-but-set-variable - NOOPT_GCC48_ARM_CC_FLAGS = DEF(GCC48_ARM_CC_FLAGS) -O0 - ################## # GCC48 AARCH64 definitions ################## @@ -1263,36 +1121,6 @@ RELEASE_GCC49_IA32_CC_FLAGS = DEF(GCC49_IA32_CC_FLAGS) -Wno-unused-but-set RELEASE_GCC49_X64_CC_FLAGS = DEF(GCC49_X64_CC_FLAGS) -Wno-unused-but-set-variable -Wno-unused-const-variable NOOPT_GCC49_X64_CC_FLAGS = DEF(GCC49_X64_CC_FLAGS) -O0 -################## -# GCC49 ARM definitions -################## -*_GCC49_ARM_CC_PATH = ENV(GCC49_ARM_PREFIX)gcc -*_GCC49_ARM_SLINK_PATH = ENV(GCC49_ARM_PREFIX)ar -*_GCC49_ARM_DLINK_PATH = ENV(GCC49_ARM_PREFIX)gcc -*_GCC49_ARM_ASLDLINK_PATH = ENV(GCC49_ARM_PREFIX)gcc -*_GCC49_ARM_ASM_PATH = ENV(GCC49_ARM_PREFIX)gcc -*_GCC49_ARM_PP_PATH = ENV(GCC49_ARM_PREFIX)gcc -*_GCC49_ARM_VFRPP_PATH = ENV(GCC49_ARM_PREFIX)gcc -*_GCC49_ARM_ASLCC_PATH = ENV(GCC49_ARM_PREFIX)gcc -*_GCC49_ARM_ASLPP_PATH = ENV(GCC49_ARM_PREFIX)gcc -*_GCC49_ARM_RC_PATH = ENV(GCC49_ARM_PREFIX)objcopy - -*_GCC49_ARM_ASLCC_FLAGS = DEF(GCC49_ASLCC_FLAGS) -*_GCC49_ARM_ASLDLINK_FLAGS = DEF(GCC49_ARM_ASLDLINK_FLAGS) -*_GCC49_ARM_ASM_FLAGS = DEF(GCC49_ARM_ASM_FLAGS) -*_GCC49_ARM_DLINK_FLAGS = DEF(GCC49_ARM_DLINK_FLAGS) -*_GCC49_ARM_DLINK2_FLAGS = DEF(GCC49_ARM_DLINK2_FLAGS) -*_GCC49_ARM_DTCPP_FLAGS = DEF(GCC_DTCPP_FLAGS) -*_GCC49_ARM_PLATFORM_FLAGS = -march=armv7-a -*_GCC49_ARM_PP_FLAGS = $(PLATFORM_FLAGS) DEF(GCC_PP_FLAGS) -*_GCC49_ARM_RC_FLAGS = DEF(GCC_ARM_RC_FLAGS) -*_GCC49_ARM_VFRPP_FLAGS = $(PLATFORM_FLAGS) DEF(GCC_VFRPP_FLAGS) -*_GCC49_ARM_CC_XIPFLAGS = DEF(GCC49_ARM_CC_XIPFLAGS) - - DEBUG_GCC49_ARM_CC_FLAGS = DEF(GCC49_ARM_CC_FLAGS) -O0 -RELEASE_GCC49_ARM_CC_FLAGS = DEF(GCC49_ARM_CC_FLAGS) -Wno-unused-but-set-variable -Wno-unused-const-variable - NOOPT_GCC49_ARM_CC_FLAGS = DEF(GCC49_ARM_CC_FLAGS) -O0 - ################## # GCC49 AARCH64 definitions ################## @@ -1407,36 +1235,6 @@ RELEASE_GCCNOLTO_IA32_CC_FLAGS = DEF(GCC49_IA32_CC_FLAGS) -Wno-unused-but- RELEASE_GCCNOLTO_X64_CC_FLAGS = DEF(GCC49_X64_CC_FLAGS) -Wno-unused-but-set-variable -Wno-unused-const-variable NOOPT_GCCNOLTO_X64_CC_FLAGS = DEF(GCC49_X64_CC_FLAGS) -O0 -################## -# GCCNOLTO ARM definitions -################## -*_GCCNOLTO_ARM_CC_PATH = ENV(GCCNOLTO_ARM_PREFIX)gcc -*_GCCNOLTO_ARM_SLINK_PATH = ENV(GCCNOLTO_ARM_PREFIX)ar -*_GCCNOLTO_ARM_DLINK_PATH = ENV(GCCNOLTO_ARM_PREFIX)gcc -*_GCCNOLTO_ARM_ASLDLINK_PATH = ENV(GCCNOLTO_ARM_PREFIX)gcc -*_GCCNOLTO_ARM_ASM_PATH = ENV(GCCNOLTO_ARM_PREFIX)gcc -*_GCCNOLTO_ARM_PP_PATH = ENV(GCCNOLTO_ARM_PREFIX)gcc -*_GCCNOLTO_ARM_VFRPP_PATH = ENV(GCCNOLTO_ARM_PREFIX)gcc -*_GCCNOLTO_ARM_ASLCC_PATH = ENV(GCCNOLTO_ARM_PREFIX)gcc -*_GCCNOLTO_ARM_ASLPP_PATH = ENV(GCCNOLTO_ARM_PREFIX)gcc -*_GCCNOLTO_ARM_RC_PATH = ENV(GCCNOLTO_ARM_PREFIX)objcopy - -*_GCCNOLTO_ARM_ASLCC_FLAGS = DEF(GCC49_ASLCC_FLAGS) -*_GCCNOLTO_ARM_ASLDLINK_FLAGS = DEF(GCC49_ARM_ASLDLINK_FLAGS) -*_GCCNOLTO_ARM_ASM_FLAGS = DEF(GCC49_ARM_ASM_FLAGS) -*_GCCNOLTO_ARM_DLINK_FLAGS = DEF(GCC49_ARM_DLINK_FLAGS) -*_GCCNOLTO_ARM_DLINK2_FLAGS = DEF(GCC49_ARM_DLINK2_FLAGS) -*_GCCNOLTO_ARM_DTCPP_FLAGS = DEF(GCC_DTCPP_FLAGS) -*_GCCNOLTO_ARM_PLATFORM_FLAGS = -march=armv7-a -*_GCCNOLTO_ARM_PP_FLAGS = $(PLATFORM_FLAGS) DEF(GCC_PP_FLAGS) -*_GCCNOLTO_ARM_RC_FLAGS = DEF(GCC_ARM_RC_FLAGS) -*_GCCNOLTO_ARM_VFRPP_FLAGS = $(PLATFORM_FLAGS) DEF(GCC_VFRPP_FLAGS) -*_GCCNOLTO_ARM_CC_XIPFLAGS = DEF(GCC49_ARM_CC_XIPFLAGS) - - DEBUG_GCCNOLTO_ARM_CC_FLAGS = DEF(GCC49_ARM_CC_FLAGS) -O0 -RELEASE_GCCNOLTO_ARM_CC_FLAGS = DEF(GCC49_ARM_CC_FLAGS) -Wno-unused-but-set-variable -Wno-unused-const-variable - NOOPT_GCCNOLTO_ARM_CC_FLAGS = DEF(GCC49_ARM_CC_FLAGS) -O0 - ################## # GCCNOLTO AARCH64 definitions ################## @@ -1559,40 +1357,6 @@ RELEASE_GCC5_X64_DLINK_FLAGS = DEF(GCC5_X64_DLINK_FLAGS) -flto -Os NOOPT_GCC5_X64_CC_FLAGS = DEF(GCC5_X64_CC_FLAGS) -O0 NOOPT_GCC5_X64_DLINK_FLAGS = DEF(GCC5_X64_DLINK_FLAGS) -O0 -################## -# GCC5 ARM definitions -################## -*_GCC5_ARM_CC_PATH = ENV(GCC5_ARM_PREFIX)gcc -*_GCC5_ARM_SLINK_PATH = ENV(GCC5_ARM_PREFIX)gcc-ar -*_GCC5_ARM_DLINK_PATH = ENV(GCC5_ARM_PREFIX)gcc -*_GCC5_ARM_ASLDLINK_PATH = ENV(GCC5_ARM_PREFIX)gcc -*_GCC5_ARM_ASM_PATH = ENV(GCC5_ARM_PREFIX)gcc -*_GCC5_ARM_PP_PATH = ENV(GCC5_ARM_PREFIX)gcc -*_GCC5_ARM_VFRPP_PATH = ENV(GCC5_ARM_PREFIX)gcc -*_GCC5_ARM_ASLCC_PATH = ENV(GCC5_ARM_PREFIX)gcc -*_GCC5_ARM_ASLPP_PATH = ENV(GCC5_ARM_PREFIX)gcc -*_GCC5_ARM_RC_PATH = ENV(GCC5_ARM_PREFIX)objcopy - -*_GCC5_ARM_ASLCC_FLAGS = DEF(GCC5_ASLCC_FLAGS) -*_GCC5_ARM_ASLDLINK_FLAGS = DEF(GCC5_ARM_ASLDLINK_FLAGS) -*_GCC5_ARM_ASM_FLAGS = DEF(GCC5_ARM_ASM_FLAGS) -*_GCC5_ARM_DLINK2_FLAGS = DEF(GCC5_ARM_DLINK2_FLAGS) -*_GCC5_ARM_DTCPP_FLAGS = DEF(GCC_DTCPP_FLAGS) -*_GCC5_ARM_PLATFORM_FLAGS = -march=armv7-a -mfloat-abi=soft -*_GCC5_ARM_PP_FLAGS = $(PLATFORM_FLAGS) DEF(GCC_PP_FLAGS) -*_GCC5_ARM_RC_FLAGS = DEF(GCC_ARM_RC_FLAGS) -*_GCC5_ARM_VFRPP_FLAGS = $(PLATFORM_FLAGS) DEF(GCC_VFRPP_FLAGS) -*_GCC5_ARM_CC_XIPFLAGS = DEF(GCC5_ARM_CC_XIPFLAGS) - - DEBUG_GCC5_ARM_CC_FLAGS = DEF(GCC5_ARM_CC_FLAGS) -flto -Wno-unused-but-set-variable -Wno-unused-const-variable - DEBUG_GCC5_ARM_DLINK_FLAGS = DEF(GCC5_ARM_DLINK_FLAGS) -flto -Os -L$(WORKSPACE)/BaseTools/Bin/GccLto -llto-arm -Wl,-plugin-opt=-pass-through=-llto-arm - -RELEASE_GCC5_ARM_CC_FLAGS = DEF(GCC5_ARM_CC_FLAGS) -flto -Wno-unused-but-set-variable -Wno-unused-const-variable -RELEASE_GCC5_ARM_DLINK_FLAGS = DEF(GCC5_ARM_DLINK_FLAGS) -flto -Os -L$(WORKSPACE)/BaseTools/Bin/GccLto -llto-arm -Wl,-plugin-opt=-pass-through=-llto-arm - - NOOPT_GCC5_ARM_CC_FLAGS = DEF(GCC5_ARM_CC_FLAGS) -O0 - NOOPT_GCC5_ARM_DLINK_FLAGS = DEF(GCC5_ARM_DLINK_FLAGS) -O0 - ################## # GCC5 AARCH64 definitions ################## @@ -1776,40 +1540,6 @@ RELEASE_GCC_X64_DLINK_FLAGS = DEF(GCC5_X64_DLINK_FLAGS) -flto -Os NOOPT_GCC_X64_CC_FLAGS = DEF(GCC5_X64_CC_FLAGS) -O0 NOOPT_GCC_X64_DLINK_FLAGS = DEF(GCC5_X64_DLINK_FLAGS) -O0 -################## -# GCC ARM definitions -################## -*_GCC_ARM_CC_PATH = ENV(GCC_ARM_PREFIX)gcc -*_GCC_ARM_SLINK_PATH = ENV(GCC_ARM_PREFIX)gcc-ar -*_GCC_ARM_DLINK_PATH = ENV(GCC_ARM_PREFIX)gcc -*_GCC_ARM_ASLDLINK_PATH = ENV(GCC_ARM_PREFIX)gcc -*_GCC_ARM_ASM_PATH = ENV(GCC_ARM_PREFIX)gcc -*_GCC_ARM_PP_PATH = ENV(GCC_ARM_PREFIX)gcc -*_GCC_ARM_VFRPP_PATH = ENV(GCC_ARM_PREFIX)gcc -*_GCC_ARM_ASLCC_PATH = ENV(GCC_ARM_PREFIX)gcc -*_GCC_ARM_ASLPP_PATH = ENV(GCC_ARM_PREFIX)gcc -*_GCC_ARM_RC_PATH = ENV(GCC_ARM_PREFIX)objcopy - -*_GCC_ARM_ASLCC_FLAGS = DEF(GCC5_ASLCC_FLAGS) -*_GCC_ARM_ASLDLINK_FLAGS = DEF(GCC5_ARM_ASLDLINK_FLAGS) -*_GCC_ARM_ASM_FLAGS = DEF(GCC5_ARM_ASM_FLAGS) -*_GCC_ARM_DLINK2_FLAGS = DEF(GCC5_ARM_DLINK2_FLAGS) -*_GCC_ARM_DTCPP_FLAGS = DEF(GCC_DTCPP_FLAGS) -*_GCC_ARM_PLATFORM_FLAGS = -march=armv7-a -mfloat-abi=soft -*_GCC_ARM_PP_FLAGS = $(PLATFORM_FLAGS) DEF(GCC_PP_FLAGS) -*_GCC_ARM_RC_FLAGS = DEF(GCC_ARM_RC_FLAGS) -*_GCC_ARM_VFRPP_FLAGS = $(PLATFORM_FLAGS) DEF(GCC_VFRPP_FLAGS) -*_GCC_ARM_CC_XIPFLAGS = DEF(GCC5_ARM_CC_XIPFLAGS) - - DEBUG_GCC_ARM_CC_FLAGS = DEF(GCC5_ARM_CC_FLAGS) -flto -Wno-unused-but-set-variable -Wno-unused-const-variable - DEBUG_GCC_ARM_DLINK_FLAGS = DEF(GCC5_ARM_DLINK_FLAGS) -flto -Os -L$(WORKSPACE)/BaseTools/Bin/GccLto -llto-arm -Wl,-plugin-opt=-pass-through=-llto-arm - -RELEASE_GCC_ARM_CC_FLAGS = DEF(GCC5_ARM_CC_FLAGS) -flto -Wno-unused-but-set-variable -Wno-unused-const-variable -RELEASE_GCC_ARM_DLINK_FLAGS = DEF(GCC5_ARM_DLINK_FLAGS) -flto -Os -L$(WORKSPACE)/BaseTools/Bin/GccLto -llto-arm -Wl,-plugin-opt=-pass-through=-llto-arm - - NOOPT_GCC_ARM_CC_FLAGS = DEF(GCC5_ARM_CC_FLAGS) -O0 - NOOPT_GCC_ARM_DLINK_FLAGS = DEF(GCC5_ARM_DLINK_FLAGS) -O0 - ################## # GCC AARCH64 definitions ################## @@ -2114,50 +1844,6 @@ NOOPT_CLANGDWARF_X64_CC_FLAGS = DEF(CLANGDWARF_ALL_CC_FLAGS) -m64 "-DEFI NOOPT_CLANGDWARF_X64_DLINK_FLAGS = DEF(CLANGDWARF_IA32_X64_DLINK_FLAGS) -Wl,-O0 -Wl,-melf_x86_64 -Wl,--oformat,elf64-x86-64 -Wl,-pie -mcmodel=small -Wl,--apply-dynamic-relocs NOOPT_CLANGDWARF_X64_DLINK2_FLAGS = DEF(CLANGDWARF_X64_DLINK2_FLAGS) -O0 -fuse-ld=lld -################## -# CLANGDWARF ARM definitions -################## -DEFINE CLANGDWARF_ARM_TARGET = -target arm-linux-gnueabi -DEFINE CLANGDWARF_ARM_CC_FLAGS = DEF(GCC_ARM_CC_FLAGS) DEF(CLANGDWARF_ARM_TARGET) DEF(CLANGDWARF_WARNING_OVERRIDES) -mno-movt -fno-stack-protector -DEFINE CLANGDWARF_ARM_DLINK_FLAGS = DEF(CLANGDWARF_ARM_TARGET) DEF(GCC_ARM_DLINK_FLAGS) DEF(CLANGDWARF_DLINK_WARNING_FLAGS) - -*_CLANGDWARF_ARM_PP_FLAGS = DEF(GCC_PP_FLAGS) -*_CLANGDWARF_ARM_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) -*_CLANGDWARF_ARM_APP_FLAGS = -*_CLANGDWARF_ARM_ASL_FLAGS = DEF(IASL_FLAGS) -*_CLANGDWARF_ARM_ASL_OUTFLAGS = DEF(IASL_OUTFLAGS) -*_CLANGDWARF_ARM_DTCPP_FLAGS = DEF(GCC_DTCPP_FLAGS) - -*_CLANGDWARF_ARM_CC_PATH = ENV(CLANGDWARF_BIN)clang -*_CLANGDWARF_ARM_ASM_PATH = ENV(CLANGDWARF_BIN)clang -*_CLANGDWARF_ARM_PP_PATH = ENV(CLANGDWARF_BIN)clang -*_CLANGDWARF_ARM_VFRPP_PATH = ENV(CLANGDWARF_BIN)clang -*_CLANGDWARF_ARM_ASLCC_PATH = ENV(CLANGDWARF_BIN)clang -*_CLANGDWARF_ARM_ASLPP_PATH = ENV(CLANGDWARF_BIN)clang -*_CLANGDWARF_ARM_DLINK_PATH = ENV(CLANGDWARF_BIN)clang -*_CLANGDWARF_ARM_ASLDLINK_PATH = ENV(CLANGDWARF_BIN)clang - -*_CLANGDWARF_ARM_SLINK_PATH = ENV(CLANGDWARF_BIN)llvm-ar -*_CLANGDWARF_ARM_RC_PATH = ENV(CLANGDWARF_BIN)llvm-objcopy - -*_CLANGDWARF_ARM_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) -fno-lto -*_CLANGDWARF_ARM_ASLDLINK_FLAGS = DEF(CLANGDWARF_ARM_TARGET) DEF(GCC_ARM_ASLDLINK_FLAGS) -*_CLANGDWARF_ARM_ASM_FLAGS = DEF(GCC_ASM_FLAGS) DEF(CLANGDWARF_ARM_TARGET) $(PLATFORM_FLAGS) -Qunused-arguments -*_CLANGDWARF_ARM_DLINK2_FLAGS = DEF(GCC_DLINK2_FLAGS_COMMON) -Wl,--defsym=PECOFF_HEADER_SIZE=0x220 -*_CLANGDWARF_ARM_PLATFORM_FLAGS = -march=armv7-a -*_CLANGDWARF_ARM_PP_FLAGS = DEF(GCC_PP_FLAGS) DEF(CLANGDWARF_ARM_TARGET) $(PLATFORM_FLAGS) -*_CLANGDWARF_ARM_RC_FLAGS = DEF(GCC_ARM_RC_FLAGS) -*_CLANGDWARF_ARM_VFRPP_FLAGS = DEF(GCC_VFRPP_FLAGS) DEF(CLANGDWARF_ARM_TARGET) $(PLATFORM_FLAGS) -*_CLANGDWARF_ARM_ASLPP_FLAGS = DEF(GCC_ASLPP_FLAGS) DEF(CLANGDWARF_ARM_TARGET) -*_CLANGDWARF_ARM_CC_XIPFLAGS = DEF(GCC_ARM_CC_XIPFLAGS) - - DEBUG_CLANGDWARF_ARM_CC_FLAGS = DEF(CLANGDWARF_ARM_CC_FLAGS) $(PLATFORM_FLAGS) -flto -O1 - DEBUG_CLANGDWARF_ARM_DLINK_FLAGS = DEF(CLANGDWARF_ARM_DLINK_FLAGS) -flto -Wl,-O1 -fuse-ld=lld -L$(WORKSPACE)/BaseTools/Bin/GccLto -llto-arm -Wl,-plugin-opt=-pass-through=-llto-arm -Wl,--no-pie,--no-relax - NOOPT_CLANGDWARF_ARM_CC_FLAGS = DEF(CLANGDWARF_ARM_CC_FLAGS) $(PLATFORM_FLAGS) -O0 - NOOPT_CLANGDWARF_ARM_DLINK_FLAGS = DEF(CLANGDWARF_ARM_DLINK_FLAGS) -fuse-ld=lld -Wl,--no-pie,--no-relax -RELEASE_CLANGDWARF_ARM_CC_FLAGS = DEF(CLANGDWARF_ARM_CC_FLAGS) $(PLATFORM_FLAGS) -flto -Oz -RELEASE_CLANGDWARF_ARM_DLINK_FLAGS = DEF(CLANGDWARF_ARM_DLINK_FLAGS) -flto -Wl,-O3 -fuse-ld=lld -L$(WORKSPACE)/BaseTools/Bin/GccLto -llto-arm -Wl,-plugin-opt=-pass-through=-llto-arm -Wl,--no-pie,--no-relax - ################## # CLANGDWARF AARCH64 definitions ################## diff --git a/BaseTools/Edk2ToolsBuild.py b/BaseTools/Edk2ToolsBuild.py index 9ed5367d2db8..f5675a60d959 100644 --- a/BaseTools/Edk2ToolsBuild.py +++ b/BaseTools/Edk2ToolsBuild.py @@ -27,7 +27,7 @@ def ParseCommandLineOptions(self): ParserObj = argparse.ArgumentParser() ParserObj.add_argument("-t", "--tool_chain_tag", dest="tct", default="VS2022", help="Set the toolchain used to compile the build tools") - ParserObj.add_argument("-a", "--target_arch", dest="arch", default=None, choices=[None, 'IA32', 'X64', 'ARM', 'AARCH64'], + ParserObj.add_argument("-a", "--target_arch", dest="arch", default=None, choices=[None, 'IA32', 'X64', 'AARCH64'], help="Specify the architecture of the built base tools. Not specifying this will fall back to the default " "behavior, for Windows builds, IA32 target will be built, for Linux builds, target arch will be the same as host arch.") args = ParserObj.parse_args() @@ -43,15 +43,13 @@ def GetWorkspaceRoot(self): def GetActiveScopes(self): ''' return tuple containing scopes that should be active for this process ''' - # Adding scope for cross compilers when building for ARM/AARCH64 + # Adding scope for cross compilers when building for AARCH64 scopes = ('global',) if GetHostInfo().os == "Linux" and self.tool_chain_tag.lower().startswith("gcc"): if self.target_arch is None: return scopes if "AARCH64" in self.target_arch: scopes += ("gcc_aarch64_linux",) - if "ARM" in self.target_arch: - scopes += ("gcc_arm_linux",) return scopes def GetLoggingLevel(self, loggerType): @@ -131,10 +129,6 @@ def Go(self): VcToolChainArch = "x86" TargetInfoArch = "x86" OutputDir = "Win32" - elif self.target_arch == "ARM": - VcToolChainArch = "x86_arm" - TargetInfoArch = "ARM" - OutputDir = "Win32" elif self.target_arch == "X64": VcToolChainArch = "amd64" TargetInfoArch = "x86" @@ -172,10 +166,6 @@ def Go(self): host_arch = "AARCH64" host_toolchain_arch = "amd64_arm64" TempOutputDir = os.path.join(shell_env.get_shell_var("EDK_TOOLS_PATH"), "Bin", "Win64") - elif HostInfo.arch == "ARM" and HostInfo.bit == "32": - host_arch = "ARM" - host_toolchain_arch = "x86_arm" - TempOutputDir = os.path.join(shell_env.get_shell_var("EDK_TOOLS_PATH"), "Bin", "Win32") else: raise Exception("Unsupported host system. %s %s" % (HostInfo.arch, HostInfo.bit)) @@ -275,18 +265,6 @@ def Go(self): shell_environment.GetEnvironment().set_shell_var("GCC_PREFIX", prefix) TargetInfoArch = "ARM" - elif "ARM" in self.target_arch: - prefix = shell_env.get_shell_var("GCC5_ARM_PREFIX") - if prefix == None: - # now check for install dir. If set then set the Prefix - install_path = shell_environment.GetEnvironment().get_shell_var("GCC5_ARM_INSTALL") - - # make GCC5_ARM_PREFIX to align with tools_def.txt - prefix = os.path.join(install_path, "bin", "arm-none-linux-gnueabihf-") - - shell_environment.GetEnvironment().set_shell_var("GCC_PREFIX", prefix) - TargetInfoArch = "ARM" - else: TargetInfoArch = "x86" else: @@ -320,8 +298,6 @@ def Go(self): pack_name = f"util-linux-{ver}" if "AARCH64" in self.target_arch: ret = RunCmd("sh", f"./configure --host=aarch64-linux -disable-all-programs --enable-libuuid CC={prefix}gcc", workingdir=unzip_dir) - elif "ARM" in self.target_arch: - ret = RunCmd("sh", f"./configure --host=arm-linux -disable-all-programs --enable-libuuid CC={prefix}gcc", workingdir=unzip_dir) if ret != 0: raise Exception(f"Failed to configure the util-linux to build with our gcc {ret}") diff --git a/BaseTools/Plugin/LinuxGccToolChain/LinuxGccToolChain.py b/BaseTools/Plugin/LinuxGccToolChain/LinuxGccToolChain.py index e7ef3df3b6ab..b3fbaf37ee22 100644 --- a/BaseTools/Plugin/LinuxGccToolChain/LinuxGccToolChain.py +++ b/BaseTools/Plugin/LinuxGccToolChain/LinuxGccToolChain.py @@ -1,5 +1,5 @@ # @file LinuxGccToolChain.py -# Plugin to configures paths for GCC/GCC5 ARM/AARCH64/RISCV/LOONGARCH64 Toolchain +# Plugin to configures paths for GCC/GCC5 AARCH64/RISCV/LOONGARCH64 Toolchain ## # This plugin sets environment variables used in tools_def.template to specify the GCC compiler # for the requested build architecture. @@ -43,12 +43,6 @@ def do_pre_build(self, thebuilder): self.Logger.critical("Failed in check aarch64") return ret - # Check arm compiler - ret = self._check_arm(toolchain) - if ret != 0: - self.Logger.critical("Failed in check arm") - return ret - # Check RISCV64 compiler ret = self._check_riscv64(toolchain) if ret != 0: @@ -63,28 +57,6 @@ def do_pre_build(self, thebuilder): return 0 - def _check_arm(self, toolchain): - # check to see if full path already configured - if shell_environment.GetEnvironment().get_shell_var(toolchain + "_ARM_PREFIX") is not None: - self.Logger.info(toolchain + "_ARM_PREFIX is already set.") - - else: - # now check for install dir. If set then set the Prefix - install_path = shell_environment.GetEnvironment().get_shell_var(toolchain + "_ARM_INSTALL") - if install_path is None: - return 0 - - # make the PREFIX to align with tools_def.txt - prefix = os.path.join(install_path, "bin", "arm-none-linux-gnueabihf-") - shell_environment.GetEnvironment().set_shell_var(toolchain + "_ARM_PREFIX", prefix) - - # now confirm it exists - if not os.path.exists(shell_environment.GetEnvironment().get_shell_var(toolchain + "_ARM_PREFIX") + "gcc"): - self.Logger.error("Path for " + toolchain + "_ARM_PREFIX toolchain is invalid") - return -2 - - return 0 - def _check_aarch64(self, toolchain): # check to see if full path already configured if shell_environment.GetEnvironment().get_shell_var(toolchain + "_AARCH64_PREFIX") is not None: diff --git a/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py b/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py index 04e59f10f1f0..36fa60ab4e2d 100644 --- a/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py +++ b/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py @@ -43,7 +43,6 @@ def do_pre_build(self, thebuilder): # HostType for VS2017 should be (defined in tools_def): # x86 == 32bit Intel # x64 == 64bit Intel - # arm == 32bit Arm # arm64 == 64bit Arm # HostType = shell_environment.GetEnvironment().get_shell_var("VS2017_HOST") @@ -63,7 +62,7 @@ def do_pre_build(self, thebuilder): # VS2017_HOST options are not exactly the same as QueryVcVariables. This translates. VC_HOST_ARCH_TRANSLATOR = { - "x86": "x86", "x64": "AMD64", "arm": "not supported", "arm64": "not supported"} + "x86": "x86", "x64": "AMD64", "arm64": "not supported"} # check to see if full path already configured if shell_environment.GetEnvironment().get_shell_var("VS2017_PREFIX") != None: @@ -116,7 +115,6 @@ def do_pre_build(self, thebuilder): # HostType for VS2019 should be (defined in tools_def): # x86 == 32bit Intel # x64 == 64bit Intel - # arm == 32bit Arm # arm64 == 64bit Arm # HostType = shell_environment.GetEnvironment().get_shell_var("VS2019_HOST") @@ -136,7 +134,7 @@ def do_pre_build(self, thebuilder): # VS2019_HOST options are not exactly the same as QueryVcVariables. This translates. VC_HOST_ARCH_TRANSLATOR = { - "x86": "x86", "x64": "AMD64", "arm": "not supported", "arm64": "not supported"} + "x86": "x86", "x64": "AMD64", "arm64": "not supported"} # check to see if full path already configured if shell_environment.GetEnvironment().get_shell_var("VS2019_PREFIX") != None: @@ -189,7 +187,6 @@ def do_pre_build(self, thebuilder): # HostType for VS2022 should be (defined in tools_def): # x86 == 32bit Intel # x64 == 64bit Intel - # arm == 32bit Arm # arm64 == 64bit Arm # HostType = shell_environment.GetEnvironment().get_shell_var("VS2022_HOST") @@ -209,7 +206,7 @@ def do_pre_build(self, thebuilder): # VS2022_HOST options are not exactly the same as QueryVcVariables. This translates. VC_HOST_ARCH_TRANSLATOR = { - "x86": "x86", "x64": "AMD64", "arm": "not supported", "arm64": "not supported"} + "x86": "x86", "x64": "AMD64", "arm64": "not supported"} # check to see if full path already configured if shell_environment.GetEnvironment().get_shell_var("VS2022_PREFIX") is not None: @@ -265,7 +262,6 @@ def do_pre_build(self, thebuilder): # HostType for VS tools should be (defined in tools_def): # x86 == 32bit Intel # x64 == 64bit Intel - # arm == 32bit Arm # arm64 == 64bit Arm # HostType = shell_environment.GetEnvironment().get_shell_var("CLANG_VS_HOST") @@ -286,7 +282,7 @@ def do_pre_build(self, thebuilder): # CLANG_VS_HOST options are not exactly the same as QueryVcVariables. This translates. VC_HOST_ARCH_TRANSLATOR = { - "x86": "x86", "x64": "AMD64", "arm": "not supported", "arm64": "not supported"} + "x86": "x86", "x64": "AMD64", "arm64": "not supported"} # now get the environment variables for the platform shell_env = shell_environment.GetEnvironment() diff --git a/BaseTools/Scripts/ConvertMasmToNasm.py b/BaseTools/Scripts/ConvertMasmToNasm.py index 0ef5a8badb94..54876f52c287 100755 --- a/BaseTools/Scripts/ConvertMasmToNasm.py +++ b/BaseTools/Scripts/ConvertMasmToNasm.py @@ -28,7 +28,7 @@ class NoSourceFile(Exception): class UnsupportedArch(Exception): - unsupported = ('aarch64', 'arm', 'ebc', 'ipf') + unsupported = ('aarch64', 'ebc', 'ipf') class CommonUtils: diff --git a/BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/doxygengen.py b/BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/doxygengen.py index 89833043c6b1..45dc54568f82 100644 --- a/BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/doxygengen.py +++ b/BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/doxygengen.py @@ -157,7 +157,6 @@ def InitializeConfigFile(self): self._configFile.AddPreDefined('MDE_CPU_X64') self._configFile.AddPreDefined('MDE_CPU_IPF') self._configFile.AddPreDefined('MDE_CPU_EBC') - self._configFile.AddPreDefined('MDE_CPU_ARM') namestr = self._pObj.GetName() if self._arch is not None: @@ -271,7 +270,7 @@ def GenerateIncludesSubPage(self, pObj, configFile): self.ProcessSourceFileForInclude(fullpath, pObj, configFile) topPage.AddDescription('
  • \link %s\endlink
  • \n' % self._ConvertPathToDoxygen(fullpath, pObj)) else: - if file.lower() in ['library', 'protocol', 'guid', 'ppi', 'ia32', 'x64', 'ipf', 'ebc', 'arm', 'pi', 'uefi', 'aarch64']: + if file.lower() in ['library', 'protocol', 'guid', 'ppi', 'ia32', 'x64', 'ipf', 'ebc', 'pi', 'uefi', 'aarch64']: continue bNeedAddSubPage = False subpage = doxygen.Page(self._ConvertPathToDoxygen(fullpath, pObj), 'public_include_%s' % file) diff --git a/BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/doxygengen_spec.py b/BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/doxygengen_spec.py index e37938c466a2..c49eb2c701f4 100644 --- a/BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/doxygengen_spec.py +++ b/BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/doxygengen_spec.py @@ -155,7 +155,6 @@ def InitializeConfigFile(self): self._configFile.AddPreDefined('MDE_CPU_X64') self._configFile.AddPreDefined('MDE_CPU_IPF') self._configFile.AddPreDefined('MDE_CPU_EBC') - self._configFile.AddPreDefined('MDE_CPU_ARM') for macro in self._macros: self._configFile.AddPreDefined(macro) @@ -272,7 +271,7 @@ def GenerateIncludesSubPage(self, pObj, configFile): self.ProcessSourceFileForInclude(fullpath, pObj, configFile) topPage.AddDescription('
  • \link %s\endlink
  • \n' % self._ConvertPathToDoxygen(fullpath, pObj)) else: - if file.lower() in ['library', 'protocol', 'guid', 'ppi', 'ia32', 'x64', 'ipf', 'ebc', 'arm', 'pi', 'uefi', 'aarch64']: + if file.lower() in ['library', 'protocol', 'guid', 'ppi', 'ia32', 'x64', 'ipf', 'ebc', 'pi', 'uefi', 'aarch64']: continue bNeedAddSubPage = False subpage = doxygen.Page(self._ConvertPathToDoxygen(fullpath, pObj), 'public_include_%s' % file) diff --git a/BaseTools/Scripts/RunMakefile.py b/BaseTools/Scripts/RunMakefile.py index 0e0a0114f9c7..9207cee51db4 100644 --- a/BaseTools/Scripts/RunMakefile.py +++ b/BaseTools/Scripts/RunMakefile.py @@ -58,7 +58,7 @@ def NormalizePath(target): parser.add_argument ( '-a', '--arch', dest = 'Arch', nargs = '+', action = 'append', required = True, - help = '''ARCHS is one of list: IA32, X64, IPF, ARM, AARCH64 or EBC, + help = '''ARCHS is one of list: IA32, X64, IPF, AARCH64 or EBC, which overrides target.txt's TARGET_ARCH definition. To specify more archs, please repeat this option.''' ) diff --git a/BaseTools/Scripts/efi_debugging.py b/BaseTools/Scripts/efi_debugging.py index 1c1446a878e4..58ee129d3664 100755 --- a/BaseTools/Scripts/efi_debugging.py +++ b/BaseTools/Scripts/efi_debugging.py @@ -346,7 +346,6 @@ class EFI_IMAGE_SECTION_HEADER(LittleEndianStructure): 0x0200: "IPF", 0x0EBC: "EBC", 0x8664: "X64", - 0x01c2: "ARM", 0xAA64: "AArch64", 0x5032: "RISC32", 0x5064: "RISC64", diff --git a/BaseTools/Source/C/Common/BasePeCoff.c b/BaseTools/Source/C/Common/BasePeCoff.c index 038bb054e57a..558f55186a1e 100644 --- a/BaseTools/Source/C/Common/BasePeCoff.c +++ b/BaseTools/Source/C/Common/BasePeCoff.c @@ -52,15 +52,6 @@ PeCoffLoaderRelocateIa32Image ( IN UINT64 Adjust ); - -RETURN_STATUS -PeCoffLoaderRelocateArmImage ( - IN UINT16 **Reloc, - IN OUT CHAR8 *Fixup, - IN OUT CHAR8 **FixupData, - IN UINT64 Adjust - ); - RETURN_STATUS PeCoffLoaderRelocateRiscVImage ( IN UINT16 *Reloc, @@ -171,7 +162,6 @@ PeCoffLoaderCheckImageType ( if (ImageContext->Machine != IMAGE_FILE_MACHINE_I386 && \ ImageContext->Machine != IMAGE_FILE_MACHINE_X64 && \ - ImageContext->Machine != IMAGE_FILE_MACHINE_ARMTHUMB_MIXED && \ ImageContext->Machine != IMAGE_FILE_MACHINE_EBC && \ ImageContext->Machine != IMAGE_FILE_MACHINE_ARM64 && \ ImageContext->Machine != IMAGE_FILE_MACHINE_RISCV64 && \ @@ -762,9 +752,6 @@ PeCoffLoaderRelocateImage ( case IMAGE_FILE_MACHINE_I386: Status = PeCoffLoaderRelocateIa32Image (Reloc, Fixup, &FixupData, Adjust); break; - case IMAGE_FILE_MACHINE_ARMTHUMB_MIXED: - Status = PeCoffLoaderRelocateArmImage (&Reloc, Fixup, &FixupData, Adjust); - break; case IMAGE_FILE_MACHINE_RISCV64: Status = PeCoffLoaderRelocateRiscVImage (Reloc, Fixup, &FixupData, Adjust); break; @@ -1256,7 +1243,6 @@ PeCoffLoaderGetPdbPointer ( // switch (Hdr.Pe32->FileHeader.Machine) { case IMAGE_FILE_MACHINE_I386: - case IMAGE_FILE_MACHINE_ARMTHUMB_MIXED: // // Assume PE32 image with IA32 Machine field. // diff --git a/BaseTools/Source/C/Common/PeCoffLib.h b/BaseTools/Source/C/Common/PeCoffLib.h index dd38f442f952..dae9f023a48f 100644 --- a/BaseTools/Source/C/Common/PeCoffLib.h +++ b/BaseTools/Source/C/Common/PeCoffLib.h @@ -145,69 +145,4 @@ PeCoffLoaderGetEntryPoint ( ) ; -// -// These functions are used by the ARM PE/COFF relocation code and by -// the ELF to PE/COFF converter so that is why they are public -// - -/** - Pass in a pointer to an ARM MOVT or MOVW immediate instruction and - return the immediate data encoded in the instruction - - @param Instruction Pointer to ARM MOVT or MOVW immediate instruction - - @return Immediate address encoded in the instruction - -**/ -UINT16 -EFIAPI -ThumbMovtImmediateAddress ( - IN UINT16 *Instruction - ); - -/** - Update an ARM MOVT or MOVW immediate instruction immediate data. - - @param Instruction Pointer to ARM MOVT or MOVW immediate instruction - @param Address New address to patch into the instruction - -**/ -VOID -EFIAPI -ThumbMovtImmediatePatch ( - IN OUT UINT16 *Instruction, - IN UINT16 Address - ); - - -/** - Pass in a pointer to an ARM MOVW/MOVT instruction pair and - return the immediate data encoded in the two` instruction - - @param Instructions Pointer to ARM MOVW/MOVT instruction pair - - @return Immediate address encoded in the instructions - -**/ -UINT32 -EFIAPI -ThumbMovwMovtImmediateAddress ( - IN UINT16 *Instructions - ); - -/** - Update an ARM MOVW/MOVT immediate instruction instruction pair. - - @param Instructions Pointer to ARM MOVW/MOVT instruction pair - @param Address New address to patch into the instructions -**/ -VOID -EFIAPI -ThumbMovwMovtImmediatePatch ( - IN OUT UINT16 *Instructions, - IN UINT32 Address - ); - - - #endif diff --git a/BaseTools/Source/C/Common/PeCoffLoaderEx.c b/BaseTools/Source/C/Common/PeCoffLoaderEx.c index 181192035ef1..23770295fa70 100644 --- a/BaseTools/Source/C/Common/PeCoffLoaderEx.c +++ b/BaseTools/Source/C/Common/PeCoffLoaderEx.c @@ -156,162 +156,6 @@ PeCoffLoaderRelocateRiscVImage ( return RETURN_SUCCESS; } -/** - Pass in a pointer to an ARM MOVT or MOVW immediate instruction and - return the immediate data encoded in the instruction - - @param Instruction Pointer to ARM MOVT or MOVW immediate instruction - - @return Immediate address encoded in the instruction - -**/ -UINT16 -ThumbMovtImmediateAddress ( - IN UINT16 *Instruction - ) -{ - UINT32 Movt; - UINT16 Address; - - // Thumb2 is two 16-bit instructions working together. Not a single 32-bit instruction - // Example MOVT R0, #0 is 0x0000f2c0 or 0xf2c0 0x0000 - Movt = (*Instruction << 16) | (*(Instruction + 1)); - - // imm16 = imm4:i:imm3:imm8 - // imm4 -> Bit19:Bit16 - // i -> Bit26 - // imm3 -> Bit14:Bit12 - // imm8 -> Bit7:Bit0 - Address = (UINT16)(Movt & 0x000000ff); // imm8 - Address |= (UINT16)((Movt >> 4) & 0x0000f700); // imm4 imm3 - Address |= (((Movt & BIT26) != 0) ? BIT11 : 0); // i - return Address; -} - - -/** - Update an ARM MOVT or MOVW immediate instruction immediate data. - - @param Instruction Pointer to ARM MOVT or MOVW immediate instruction - @param Address New address to patch into the instruction -**/ -VOID -ThumbMovtImmediatePatch ( - IN OUT UINT16 *Instruction, - IN UINT16 Address - ) -{ - UINT16 Patch; - - // First 16-bit chunk of instruction - Patch = ((Address >> 12) & 0x000f); // imm4 - Patch |= (((Address & BIT11) != 0) ? BIT10 : 0); // i - *Instruction = (*Instruction & ~0x040f) | Patch; - - // Second 16-bit chunk of instruction - Patch = Address & 0x000000ff; // imm8 - Patch |= ((Address << 4) & 0x00007000); // imm3 - Instruction++; - *Instruction = (*Instruction & ~0x70ff) | Patch; -} - -/** - Pass in a pointer to an ARM MOVW/MOVT instruction pair and - return the immediate data encoded in the two` instruction - - @param Instructions Pointer to ARM MOVW/MOVT instruction pair - - @return Immediate address encoded in the instructions - -**/ -UINT32 -EFIAPI -ThumbMovwMovtImmediateAddress ( - IN UINT16 *Instructions - ) -{ - UINT16 *Word; - UINT16 *Top; - - Word = Instructions; // MOVW - Top = Word + 2; // MOVT - - return (ThumbMovtImmediateAddress (Top) << 16) + ThumbMovtImmediateAddress (Word); -} - - -/** - Update an ARM MOVW/MOVT immediate instruction instruction pair. - - @param Instructions Pointer to ARM MOVW/MOVT instruction pair - @param Address New address to patch into the instructions -**/ -VOID -EFIAPI -ThumbMovwMovtImmediatePatch ( - IN OUT UINT16 *Instructions, - IN UINT32 Address - ) -{ - UINT16 *Word; - UINT16 *Top; - - Word = (UINT16 *)Instructions; // MOVW - Top = Word + 2; // MOVT - - ThumbMovtImmediatePatch (Word, (UINT16)(Address & 0xffff)); - ThumbMovtImmediatePatch (Top, (UINT16)(Address >> 16)); -} - - -/** - Performs an ARM-based specific relocation fixup and is a no-op on other - instruction sets. - - @param Reloc Pointer to the relocation record. - @param Fixup Pointer to the address to fix up. - @param FixupData Pointer to a buffer to log the fixups. - @param Adjust The offset to adjust the fixup. - - @return Status code. - -**/ -RETURN_STATUS -PeCoffLoaderRelocateArmImage ( - IN UINT16 **Reloc, - IN OUT CHAR8 *Fixup, - IN OUT CHAR8 **FixupData, - IN UINT64 Adjust - ) -{ - UINT16 *Fixup16; - UINT32 FixupVal; - - Fixup16 = (UINT16 *) Fixup; - - switch ((**Reloc) >> 12) { - - case EFI_IMAGE_REL_BASED_ARM_MOV32T: - FixupVal = ThumbMovwMovtImmediateAddress (Fixup16) + (UINT32)Adjust; - ThumbMovwMovtImmediatePatch (Fixup16, FixupVal); - - - if (*FixupData != NULL) { - *FixupData = ALIGN_POINTER(*FixupData, sizeof(UINT64)); - CopyMem (*FixupData, Fixup16, sizeof (UINT64)); - *FixupData = *FixupData + sizeof(UINT64); - } - break; - - case EFI_IMAGE_REL_BASED_ARM_MOV32A: - // break omitted - ARM instruction encoding not implemented - default: - return RETURN_UNSUPPORTED; - } - - return RETURN_SUCCESS; -} - /** Performs a LoongArch specific relocation fixup. diff --git a/BaseTools/Source/C/EfiRom/EfiRom.h b/BaseTools/Source/C/EfiRom/EfiRom.h index dfb4c3207794..667ff83e80d7 100644 --- a/BaseTools/Source/C/EfiRom/EfiRom.h +++ b/BaseTools/Source/C/EfiRom/EfiRom.h @@ -111,7 +111,6 @@ static STRING_LOOKUP mMachineTypes[] = { { IMAGE_FILE_MACHINE_I386, "IA32" }, { IMAGE_FILE_MACHINE_X64, "X64" }, { IMAGE_FILE_MACHINE_EBC, "EBC" }, - { IMAGE_FILE_MACHINE_ARMTHUMB_MIXED, "ARM" }, { IMAGE_FILE_MACHINE_ARM64, "AA64" }, { 0, NULL } }; diff --git a/BaseTools/Source/C/GenFv/GenFvInternalLib.c b/BaseTools/Source/C/GenFv/GenFvInternalLib.c index e4f4090ee4c4..f2fb4e04b570 100644 --- a/BaseTools/Source/C/GenFv/GenFvInternalLib.c +++ b/BaseTools/Source/C/GenFv/GenFvInternalLib.c @@ -40,25 +40,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #define ARM64_UNCONDITIONAL_JUMP_INSTRUCTION 0x14000000 -/* - * Arm instruction to jump to Fv entry instruction in Arm or Thumb mode. - * From ARM Arch Ref Manual versions b/c/d, section A8.8.25 BL, BLX (immediate) - * BLX (encoding A2) branches to offset in Thumb instruction set mode. - * BL (encoding A1) branches to offset in Arm instruction set mode. - */ -#define ARM_JUMP_OFFSET_MAX 0xffffff -#define ARM_JUMP_TO_ARM(Offset) (0xeb000000 | ((Offset - 8) >> 2)) - -#define _ARM_JUMP_TO_THUMB(Imm32) (0xfa000000 | \ - (((Imm32) & (1 << 1)) << (24 - 1)) | \ - (((Imm32) >> 2) & 0x7fffff)) -#define ARM_JUMP_TO_THUMB(Offset) _ARM_JUMP_TO_THUMB((Offset) - 8) - -/* - * Arm instruction to return from exception (MOVS PC, LR) - */ -#define ARM_RETURN_FROM_EXCEPTION 0xE1B0F07E - BOOLEAN mArm = FALSE; BOOLEAN mRiscV = FALSE; BOOLEAN mLoongArch = FALSE; @@ -1691,11 +1672,6 @@ if (MachineType == IMAGE_FILE_MACHINE_I386 || MachineType == IMAGE_FILE_MACHINE_ Ia32ResetAddressPtr = (UINT32 *) ((UINTN) FvImage->Eof - 4); *Ia32ResetAddressPtr = (UINT32) (FvInfo->BaseAddress); DebugMsg (NULL, 0, 9, "update BFV base address in the top FV image", "BFV base address = 0x%llX.", (unsigned long long) FvInfo->BaseAddress); - } else if (MachineType == IMAGE_FILE_MACHINE_ARMTHUMB_MIXED) { - // - // Since the ARM reset vector is in the FV Header you really don't need a - // Volume Top File, but if you have one for some reason don't crash... - // } else if (MachineType == IMAGE_FILE_MACHINE_ARM64) { // // Since the AArch64 reset vector is in the FV Header you really don't need a @@ -1977,28 +1953,10 @@ Routine Description: This parses the FV looking for SEC and patches that address into the beginning of the FV header. - For ARM32 the reset vector is at 0x00000000 or 0xFFFF0000. For AArch64 the reset vector is at 0x00000000. - This would commonly map to the first entry in the ROM. - ARM32 Exceptions: - Reset +0 - Undefined +4 - SWI +8 - Prefetch Abort +12 - Data Abort +16 - IRQ +20 - FIQ +24 - - We support two schemes on ARM. - 1) Beginning of the FV is the reset vector - 2) Reset vector is data bytes FDF file and that code branches to reset vector - in the beginning of the FV (fixed size offset). - Need to have the jump for the reset vector at location zero. We also need to store the address or PEI (if it exists). - We stub out a return from interrupt in case the debugger - is using SWI (not done for AArch64, not enough space in struct). The optional entry to the common exception handler is to support full featured exception handling from ROM and is currently not support by this tool. @@ -2091,61 +2049,7 @@ Routine Description: return EFI_SUCCESS; } - if (MachineType == IMAGE_FILE_MACHINE_ARMTHUMB_MIXED) { - // ARM: Array of 4 UINT32s: - // 0 - is branch relative to SEC entry point - // 1 - PEI Entry Point - // 2 - movs pc,lr for a SWI handler - // 3 - Place holder for Common Exception Handler - UINT32 ResetVector[4]; - - memset(ResetVector, 0, sizeof (ResetVector)); - - // if we found an SEC core entry point then generate a branch instruction - // to it and populate a debugger SWI entry as well - if (UpdateVectorSec) { - UINT32 EntryOffset; - - VerboseMsg("UpdateArmResetVectorIfNeeded updating ARM SEC vector"); - - EntryOffset = (INT32)(SecCoreEntryAddress - FvInfo->BaseAddress); - - if (EntryOffset > ARM_JUMP_OFFSET_MAX) { - Error(NULL, 0, 3000, "Invalid", "SEC Entry point offset above 1MB of the start of the FV"); - return EFI_ABORTED; - } - - if ((SecCoreEntryAddress & 1) != 0) { - ResetVector[0] = ARM_JUMP_TO_THUMB(EntryOffset); - } else { - ResetVector[0] = ARM_JUMP_TO_ARM(EntryOffset); - } - - // SWI handler movs pc,lr. Just in case a debugger uses SWI - ResetVector[2] = ARM_RETURN_FROM_EXCEPTION; - - // Place holder to support a common interrupt handler from ROM. - // Currently not supported. For this to be used the reset vector would not be in this FV - // and the exception vectors would be hard coded in the ROM and just through this address - // to find a common handler in the a module in the FV. - ResetVector[3] = 0; - } - - // if a PEI core entry was found place its address in the vector area - if (UpdateVectorPei) { - - VerboseMsg("UpdateArmResetVectorIfNeeded updating ARM PEI address"); - - // Address of PEI Core, if we have one - ResetVector[1] = (UINT32)PeiCoreEntryAddress; - } - - // - // Copy to the beginning of the FV - // - memcpy(FvImage->FileImage, ResetVector, sizeof (ResetVector)); - - } else if (MachineType == IMAGE_FILE_MACHINE_ARM64) { + if (MachineType == IMAGE_FILE_MACHINE_ARM64) { // AArch64: Used as UINT64 ResetVector[2] // 0 - is branch relative to SEC entry point // 1 - PEI Entry Point @@ -2154,13 +2058,12 @@ Routine Description: memset(ResetVector, 0, sizeof (ResetVector)); /* NOTE: - ARMT above has an entry in ResetVector[2] for SWI. The way we are using the ResetVector - array at the moment, for AArch64, does not allow us space for this as the header only - allows for a fixed amount of bytes at the start. If we are sure that UEFI will live - within the first 4GB of addressable RAM we could potentially adopt the same ResetVector - layout as above. But for the moment we replace the four 32bit vectors with two 64bit - vectors in the same area of the Image heasder. This allows UEFI to start from a 64bit - base. + The way we are using the ResetVector array at the moment, for AArch64, does not allow + us space for an SWI entry as the header only allows for a fixed amount of bytes at the + start. If we are sure that UEFI will live within the first 4GB of addressable RAM we + could potentially adopt a different ResetVector layout. But for the moment we replace + the four 32bit vectors with two 64bit vectors in the same area of the Image header. + This allows UEFI to start from a 64bit base. */ // if we found an SEC core entry point then generate a branch instruction to it @@ -2483,8 +2386,8 @@ Routine Description: // Verify machine type is supported // if ((*MachineType != IMAGE_FILE_MACHINE_I386) && (*MachineType != IMAGE_FILE_MACHINE_X64) && (*MachineType != IMAGE_FILE_MACHINE_EBC) && - (*MachineType != IMAGE_FILE_MACHINE_ARMTHUMB_MIXED) && (*MachineType != IMAGE_FILE_MACHINE_ARM64) && - (*MachineType != IMAGE_FILE_MACHINE_RISCV64) && (*MachineType != IMAGE_FILE_MACHINE_LOONGARCH64)) { + (*MachineType != IMAGE_FILE_MACHINE_ARM64) && (*MachineType != IMAGE_FILE_MACHINE_RISCV64) && + (*MachineType != IMAGE_FILE_MACHINE_LOONGARCH64)) { Error (NULL, 0, 3000, "Invalid", "Unrecognized machine type in the PE32 file."); return EFI_UNSUPPORTED; } @@ -3449,8 +3352,8 @@ Routine Description: } // machine type is ARM, set a flag so ARM reset vector processing occurs - if ((MachineType == IMAGE_FILE_MACHINE_ARMTHUMB_MIXED) || (MachineType == IMAGE_FILE_MACHINE_ARM64)) { - VerboseMsg("Located ARM/AArch64 SEC/PEI core in child FV"); + if (MachineType == IMAGE_FILE_MACHINE_ARM64) { + VerboseMsg("Located AArch64 SEC/PEI core in child FV"); mArm = TRUE; } @@ -3608,8 +3511,7 @@ Routine Description: return Status; } - if ( (ImageContext.Machine == IMAGE_FILE_MACHINE_ARMTHUMB_MIXED) || - (ImageContext.Machine == IMAGE_FILE_MACHINE_ARM64) ) { + if (ImageContext.Machine == IMAGE_FILE_MACHINE_ARM64) { mArm = TRUE; } @@ -3893,8 +3795,7 @@ Routine Description: return Status; } - if ( (ImageContext.Machine == IMAGE_FILE_MACHINE_ARMTHUMB_MIXED) || - (ImageContext.Machine == IMAGE_FILE_MACHINE_ARM64) ) { + if (ImageContext.Machine == IMAGE_FILE_MACHINE_ARM64) { mArm = TRUE; } diff --git a/BaseTools/Source/C/GenFw/Elf32Convert.c b/BaseTools/Source/C/GenFw/Elf32Convert.c index 246497a718a4..7b4fb4410a98 100644 --- a/BaseTools/Source/C/GenFw/Elf32Convert.c +++ b/BaseTools/Source/C/GenFw/Elf32Convert.c @@ -142,7 +142,7 @@ InitializeElf32 ( Error (NULL, 0, 3000, "Unsupported", "ELF e_type not ET_EXEC or ET_DYN"); return FALSE; } - if (!((mEhdr->e_machine == EM_386) || (mEhdr->e_machine == EM_ARM) || (mEhdr->e_machine == EM_RISCV))) { + if (!((mEhdr->e_machine == EM_386) || (mEhdr->e_machine == EM_RISCV))) { Warning (NULL, 0, 3000, "Unsupported", "ELF e_machine is not Elf32 machine."); } if (mEhdr->e_version != EV_CURRENT) { @@ -197,20 +197,6 @@ GetShdrByIndex ( return (Elf_Shdr*)((UINT8*)mShdrBase + Num * mEhdr->e_shentsize); } -STATIC -Elf_Phdr* -GetPhdrByIndex ( - UINT32 num - ) -{ - if (num >= mEhdr->e_phnum) { - Error (NULL, 0, 3000, "Invalid", "GetPhdrByIndex: Index %u is too high.", num); - exit(EXIT_FAILURE); - } - - return (Elf_Phdr *)((UINT8*)mPhdrBase + num * mEhdr->e_phentsize); -} - STATIC UINT32 CoffAlign ( @@ -352,7 +338,6 @@ ScanSections32 ( mNtHdrOffset = mCoffOffset; switch (mEhdr->e_machine) { case EM_386: - case EM_ARM: mCoffOffset += sizeof (EFI_IMAGE_NT_HEADERS32); break; default: @@ -558,10 +543,6 @@ ScanSections32 ( NtHdr->Pe32.FileHeader.Machine = IMAGE_FILE_MACHINE_I386; NtHdr->Pe32.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC; break; - case EM_ARM: - NtHdr->Pe32.FileHeader.Machine = IMAGE_FILE_MACHINE_ARMTHUMB_MIXED; - NtHdr->Pe32.OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC; - break; default: VerboseMsg ("%s unknown e_machine type %hu. Assume IA-32", mInImageName, mEhdr->e_machine); NtHdr->Pe32.FileHeader.Machine = IMAGE_FILE_MACHINE_I386; @@ -738,7 +719,6 @@ WriteSections32 ( Elf_Shdr *SymShdr; UINT8 *Targ; - UINT16 Address; // // Check section header index found in symbol table and get the section @@ -790,74 +770,6 @@ WriteSections32 ( default: Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_386 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info)); } - } else if (mEhdr->e_machine == EM_ARM) { - switch (ELF32_R_TYPE(Rel->r_info)) { - case R_ARM_RBASE: - // No relocation - no action required - // break skipped - - case R_ARM_PC24: - case R_ARM_REL32: - case R_ARM_XPC25: - case R_ARM_THM_PC22: - case R_ARM_THM_JUMP19: - case R_ARM_CALL: - case R_ARM_JMP24: - case R_ARM_THM_JUMP24: - case R_ARM_PREL31: - case R_ARM_MOVW_PREL_NC: - case R_ARM_MOVT_PREL: - case R_ARM_THM_MOVW_PREL_NC: - case R_ARM_THM_MOVT_PREL: - case R_ARM_THM_JMP6: - case R_ARM_THM_ALU_PREL_11_0: - case R_ARM_THM_PC12: - case R_ARM_REL32_NOI: - case R_ARM_ALU_PC_G0_NC: - case R_ARM_ALU_PC_G0: - case R_ARM_ALU_PC_G1_NC: - case R_ARM_ALU_PC_G1: - case R_ARM_ALU_PC_G2: - case R_ARM_LDR_PC_G1: - case R_ARM_LDR_PC_G2: - case R_ARM_LDRS_PC_G0: - case R_ARM_LDRS_PC_G1: - case R_ARM_LDRS_PC_G2: - case R_ARM_LDC_PC_G0: - case R_ARM_LDC_PC_G1: - case R_ARM_LDC_PC_G2: - case R_ARM_THM_JUMP11: - case R_ARM_THM_JUMP8: - case R_ARM_TLS_GD32: - case R_ARM_TLS_LDM32: - case R_ARM_TLS_IE32: - // Thease are all PC-relative relocations and don't require modification - // GCC does not seem to have the concept of a application that just needs to get relocated. - break; - - case R_ARM_THM_MOVW_ABS_NC: - // MOVW is only lower 16-bits of the addres - Address = (UINT16)(Sym->st_value - SymShdr->sh_addr + mCoffSectionsOffset[Sym->st_shndx]); - ThumbMovtImmediatePatch ((UINT16 *)Targ, Address); - break; - - case R_ARM_THM_MOVT_ABS: - // MOVT is only upper 16-bits of the addres - Address = (UINT16)((Sym->st_value - SymShdr->sh_addr + mCoffSectionsOffset[Sym->st_shndx]) >> 16); - ThumbMovtImmediatePatch ((UINT16 *)Targ, Address); - break; - - case R_ARM_ABS32: - case R_ARM_RABS32: - // - // Absolute relocation. - // - *(UINT32 *)Targ = *(UINT32 *)Targ - SymShdr->sh_addr + mCoffSectionsOffset[Sym->st_shndx]; - break; - - default: - Error (NULL, 0, 3000, "Invalid", "WriteSections (): %s unsupported ELF EM_ARM relocation 0x%x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info)); - } } } } @@ -877,23 +789,15 @@ WriteRelocations32 ( UINT32 Index; EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; EFI_IMAGE_DATA_DIRECTORY *Dir; - BOOLEAN FoundRelocations; - Elf_Dyn *Dyn; Elf_Rel *Rel; - UINTN RelElementSize; - UINTN RelSize; - UINTN RelOffset; - UINTN K; - Elf32_Phdr *DynamicSegment; - for (Index = 0, FoundRelocations = FALSE; Index < mEhdr->e_shnum; Index++) { + for (Index = 0; Index < mEhdr->e_shnum; Index++) { Elf_Shdr *RelShdr = GetShdrByIndex(Index); if ((RelShdr->sh_type == SHT_REL) || (RelShdr->sh_type == SHT_RELA)) { Elf_Shdr *SecShdr = GetShdrByIndex (RelShdr->sh_info); if (IsTextShdr(SecShdr) || IsDataShdr(SecShdr)) { UINT32 RelIdx; - FoundRelocations = TRUE; for (RelIdx = 0; RelIdx < RelShdr->sh_size; RelIdx += RelShdr->sh_entsize) { Rel = (Elf_Rel *)((UINT8*)mEhdr + RelShdr->sh_offset + RelIdx); @@ -916,80 +820,6 @@ WriteRelocations32 ( default: Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_386 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info)); } - } else if (mEhdr->e_machine == EM_ARM) { - switch (ELF32_R_TYPE(Rel->r_info)) { - case R_ARM_RBASE: - // No relocation - no action required - // break skipped - - case R_ARM_PC24: - case R_ARM_REL32: - case R_ARM_XPC25: - case R_ARM_THM_PC22: - case R_ARM_THM_JUMP19: - case R_ARM_CALL: - case R_ARM_JMP24: - case R_ARM_THM_JUMP24: - case R_ARM_PREL31: - case R_ARM_MOVW_PREL_NC: - case R_ARM_MOVT_PREL: - case R_ARM_THM_MOVW_PREL_NC: - case R_ARM_THM_MOVT_PREL: - case R_ARM_THM_JMP6: - case R_ARM_THM_ALU_PREL_11_0: - case R_ARM_THM_PC12: - case R_ARM_REL32_NOI: - case R_ARM_ALU_PC_G0_NC: - case R_ARM_ALU_PC_G0: - case R_ARM_ALU_PC_G1_NC: - case R_ARM_ALU_PC_G1: - case R_ARM_ALU_PC_G2: - case R_ARM_LDR_PC_G1: - case R_ARM_LDR_PC_G2: - case R_ARM_LDRS_PC_G0: - case R_ARM_LDRS_PC_G1: - case R_ARM_LDRS_PC_G2: - case R_ARM_LDC_PC_G0: - case R_ARM_LDC_PC_G1: - case R_ARM_LDC_PC_G2: - case R_ARM_THM_JUMP11: - case R_ARM_THM_JUMP8: - case R_ARM_TLS_GD32: - case R_ARM_TLS_LDM32: - case R_ARM_TLS_IE32: - // Thease are all PC-relative relocations and don't require modification - break; - - case R_ARM_THM_MOVW_ABS_NC: - CoffAddFixup ( - mCoffSectionsOffset[RelShdr->sh_info] - + (Rel->r_offset - SecShdr->sh_addr), - EFI_IMAGE_REL_BASED_ARM_MOV32T - ); - - // PE/COFF treats MOVW/MOVT relocation as single 64-bit instruction - // Track this address so we can log an error for unsupported sequence of MOVW/MOVT - gMovwOffset = mCoffSectionsOffset[RelShdr->sh_info] + (Rel->r_offset - SecShdr->sh_addr); - break; - - case R_ARM_THM_MOVT_ABS: - if ((gMovwOffset + 4) != (mCoffSectionsOffset[RelShdr->sh_info] + (Rel->r_offset - SecShdr->sh_addr))) { - Error (NULL, 0, 3000, "Not Supported", "PE/COFF requires MOVW+MOVT instruction sequence %x +4 != %x.", gMovwOffset, mCoffSectionsOffset[RelShdr->sh_info] + (Rel->r_offset - SecShdr->sh_addr)); - } - break; - - case R_ARM_ABS32: - case R_ARM_RABS32: - CoffAddFixup ( - mCoffSectionsOffset[RelShdr->sh_info] - + (Rel->r_offset - SecShdr->sh_addr), - EFI_IMAGE_REL_BASED_HIGHLOW - ); - break; - - default: - Error (NULL, 0, 3000, "Invalid", "WriteRelocations(): %s unsupported ELF EM_ARM relocation 0x%x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info)); - } } else { Error (NULL, 0, 3000, "Not Supported", "This tool does not support relocations for ELF with e_machine %u (processor type).", (unsigned) mEhdr->e_machine); } @@ -998,96 +828,6 @@ WriteRelocations32 ( } } - if (!FoundRelocations && (mEhdr->e_machine == EM_ARM)) { - /* Try again, but look for PT_DYNAMIC instead of SHT_REL */ - - for (Index = 0; Index < mEhdr->e_phnum; Index++) { - RelElementSize = 0; - RelSize = 0; - RelOffset = 0; - - DynamicSegment = GetPhdrByIndex (Index); - - if (DynamicSegment->p_type == PT_DYNAMIC) { - Dyn = (Elf32_Dyn *) ((UINT8 *)mEhdr + DynamicSegment->p_offset); - - while (Dyn->d_tag != DT_NULL) { - switch (Dyn->d_tag) { - case DT_REL: - RelOffset = Dyn->d_un.d_val; - break; - - case DT_RELSZ: - RelSize = Dyn->d_un.d_val; - break; - - case DT_RELENT: - RelElementSize = Dyn->d_un.d_val; - break; - - default: - break; - } - Dyn++; - } - if (( RelOffset == 0 ) || ( RelSize == 0 ) || ( RelElementSize == 0 )) { - Error (NULL, 0, 3000, "Invalid", "%s bad ARM dynamic relocations.", mInImageName); - } - - for (Index = 0; Index < mEhdr->e_shnum; Index++) { - Elf_Shdr *shdr = GetShdrByIndex(Index); - - // - // The PT_DYNAMIC section contains DT_REL relocations whose r_offset - // field is relative to the base of a segment (or the entire image), - // and not to the base of an ELF input section as is the case for - // SHT_REL sections. This means that we cannot fix up such relocations - // unless we cross-reference ELF sections and segments, considering - // that the output placement recorded in mCoffSectionsOffset[] is - // section based, not segment based. - // - // Fortunately, there is a simple way around this: we require that the - // in-memory layout of the ELF and PE/COFF versions of the binary is - // identical. That way, r_offset will retain its validity as a PE/COFF - // image offset, and we can record it in the COFF fixup table - // unmodified. - // - if (shdr->sh_addr != mCoffSectionsOffset[Index]) { - Error (NULL, 0, 3000, - "Invalid", "%s: PT_DYNAMIC relocations require identical ELF and PE/COFF section offsets.", - mInImageName); - } - } - - for (K = 0; K < RelSize; K += RelElementSize) { - - if (DynamicSegment->p_paddr == 0) { - // Older versions of the ARM ELF (SWS ESPC 0003 B-02) specification define DT_REL - // as an offset in the dynamic segment. p_paddr is defined to be zero for ARM tools - Rel = (Elf32_Rel *) ((UINT8 *) mEhdr + DynamicSegment->p_offset + RelOffset + K); - } else { - // This is how it reads in the generic ELF specification - Rel = (Elf32_Rel *) ((UINT8 *) mEhdr + RelOffset + K); - } - - switch (ELF32_R_TYPE (Rel->r_info)) { - case R_ARM_RBASE: - break; - - case R_ARM_RABS32: - CoffAddFixup (Rel->r_offset, EFI_IMAGE_REL_BASED_HIGHLOW); - break; - - default: - Error (NULL, 0, 3000, "Invalid", "%s bad ARM dynamic relocations, unknown type %d.", mInImageName, ELF32_R_TYPE (Rel->r_info)); - break; - } - } - break; - } - } - } - // // Pad by adding empty entries. // diff --git a/BaseTools/Source/C/Makefiles/GnuMakeUtils.py b/BaseTools/Source/C/Makefiles/GnuMakeUtils.py index 3924311f4304..6f686fd7aa25 100644 --- a/BaseTools/Source/C/Makefiles/GnuMakeUtils.py +++ b/BaseTools/Source/C/Makefiles/GnuMakeUtils.py @@ -22,7 +22,6 @@ ARCH_IA32 = 'IA32' ARCH_X64 = 'X64' ARCH_AARCH64 = 'AARCH64' -ARCH_ARM = 'ARM' ARCH_RISCV64 = 'RISCV64' ARCH_LOONGARCH64 = 'LOONGARCH64' _Process = namedtuple('Process', ['process_id', 'parent_process_id', 'exe_filename']) @@ -203,21 +202,10 @@ def get_host_arch(): host_arch = ARCH_IA32 elif 'aarch64' in uname_m or 'arm64' in uname_m: host_arch = ARCH_AARCH64 - elif 'arm' in uname_m: - host_arch = ARCH_ARM elif 'riscv64' in uname_m: host_arch = ARCH_RISCV64 elif 'loongarch64' in uname_m: host_arch = ARCH_LOONGARCH64 - # There is a corner case for the Raspberry Pi. Sometimes it has a 64-bit - # kernel paired with an exclusively 32-bit user mode. Check for this case. - if shutil.which("lsb_release") is not None: - res = subprocess.run(["lsb_release", "-i"], universal_newlines=True, - stdout=subprocess.PIPE, stderr=subprocess.STDOUT, - check=True) - distributor = res.stdout.strip() - if distributor == "Distributor ID:\tRaspbian": - host_arch = ARCH_ARM print(host_arch) return 0 diff --git a/BaseTools/Source/C/Makefiles/header.makefile b/BaseTools/Source/C/Makefiles/header.makefile index 55a7307a5ec0..664178f1fb80 100644 --- a/BaseTools/Source/C/Makefiles/header.makefile +++ b/BaseTools/Source/C/Makefiles/header.makefile @@ -3,7 +3,6 @@ # The makefile can be invoked with # HOST_ARCH = x86_64 or x64 for EM64T build # HOST_ARCH = ia32 or IA32 for IA32 build -# HOST_ARCH = Arm or ARM for ARM build # # Copyright (c) 2007 - 2025, Intel Corporation. All rights reserved.
    # SPDX-License-Identifier: BSD-2-Clause-Patent @@ -136,9 +135,6 @@ ARCH_INCLUDE = -I $(EDK2_PATH)/MdePkg/Include/Ia32/ else ifeq ($(HOST_ARCH), X64) ARCH_INCLUDE = -I $(EDK2_PATH)/MdePkg/Include/X64/ -else ifeq ($(HOST_ARCH), ARM) -ARCH_INCLUDE = -I $(EDK2_PATH)/MdePkg/Include/Arm/ - else ifeq ($(HOST_ARCH), AARCH64) ARCH_INCLUDE = -I $(EDK2_PATH)/MdePkg/Include/AArch64/ diff --git a/BaseTools/Source/C/Makefiles/ms.common b/BaseTools/Source/C/Makefiles/ms.common index 2aafe58c1132..4788133d3bd2 100644 --- a/BaseTools/Source/C/Makefiles/ms.common +++ b/BaseTools/Source/C/Makefiles/ms.common @@ -57,15 +57,6 @@ CFLAGS = $(CFLAGS) /wd4267 /wd4244 /wd4334 # Note: Disable flexible array member warnings CFLAGS = $(CFLAGS) /wd4200 -!ELSEIF "$(HOST_ARCH)"=="ARM" -ARCH_INCLUDE = $(EDK2_PATH)\MdePkg\Include\Arm -BIN_PATH = $(BASE_TOOLS_PATH)\Bin\Win32 -LIB_PATH = $(BASE_TOOLS_PATH)\Lib\Win32 -SYS_BIN_PATH = $(EDK_TOOLS_PATH)\Bin\Win32 -SYS_LIB_PATH = $(EDK_TOOLS_PATH)\Lib\Win32 -# Note: Disable flexible array member warnings -CFLAGS = $(CFLAGS) /wd4200 - !ELSEIF "$(HOST_ARCH)"=="AARCH64" ARCH_INCLUDE = $(EDK2_PATH)\MdePkg\Include\AArch64 BIN_PATH = $(BASE_TOOLS_PATH)\Bin\Win64 diff --git a/BaseTools/Source/C/VfrCompile/Pccts/antlr/AntlrMS.mak b/BaseTools/Source/C/VfrCompile/Pccts/antlr/AntlrMS.mak index 26c590adf4b0..5700bc6789d8 100644 --- a/BaseTools/Source/C/VfrCompile/Pccts/antlr/AntlrMS.mak +++ b/BaseTools/Source/C/VfrCompile/Pccts/antlr/AntlrMS.mak @@ -12,7 +12,7 @@ PCCTS_H=$(PCCTS_HOME)\h HOST_ARCH = IA32 !ENDIF -!IF "$(HOST_ARCH)"=="IA32" || "$(HOST_ARCH)"=="ARM" +!IF "$(HOST_ARCH)"=="IA32" SYS_BIN_PATH=$(EDK_TOOLS_PATH)\Bin\Win32 !ELSE SYS_BIN_PATH=$(EDK_TOOLS_PATH)\Bin\Win64 diff --git a/BaseTools/Source/C/VfrCompile/Pccts/dlg/DlgMS.mak b/BaseTools/Source/C/VfrCompile/Pccts/dlg/DlgMS.mak index f2a31a775e2a..d66099eac516 100644 --- a/BaseTools/Source/C/VfrCompile/Pccts/dlg/DlgMS.mak +++ b/BaseTools/Source/C/VfrCompile/Pccts/dlg/DlgMS.mak @@ -16,7 +16,7 @@ SET=$(PCCTS_HOME)\support\set HOST_ARCH = IA32 !ENDIF -!IF "$(HOST_ARCH)"=="IA32" || "$(HOST_ARCH)"=="ARM" +!IF "$(HOST_ARCH)"=="IA32" SYS_BIN_PATH=$(EDK_TOOLS_PATH)\Bin\Win32 !ELSE SYS_BIN_PATH=$(EDK_TOOLS_PATH)\Bin\Win64 diff --git a/BaseTools/Source/Python/AutoGen/GenC.py b/BaseTools/Source/Python/AutoGen/GenC.py index 86991e7675de..1da74813b9d1 100755 --- a/BaseTools/Source/Python/AutoGen/GenC.py +++ b/BaseTools/Source/Python/AutoGen/GenC.py @@ -2042,8 +2042,8 @@ def CreateFooterCode(Info, AutoGenC, AutoGenH): def CreateCode(Info, AutoGenC, AutoGenH, StringH, UniGenCFlag, UniGenBinBuffer, StringIdf, IdfGenCFlag, IdfGenBinBuffer): CreateHeaderCode(Info, AutoGenC, AutoGenH) - # The only 32 bit archs we have are IA32 and ARM, everything else is 64 bit - Bitwidth = 32 if Info.Arch == 'IA32' or Info.Arch == 'ARM' else 64 + # The only 32 bit arch we have is IA32, everything else is 64 bit + Bitwidth = 32 if Info.Arch == 'IA32' else 64 if GlobalData.gStackCookieValues64 == [] and os.path.exists(os.path.join(Info.PlatformInfo.BuildDir, "StackCookieValues64.json")): with open (os.path.join(Info.PlatformInfo.BuildDir, "StackCookieValues64.json"), "r") as file: diff --git a/BaseTools/Source/Python/Capsule/GenerateWindowsDriver.py b/BaseTools/Source/Python/Capsule/GenerateWindowsDriver.py index bea7a0df387c..58a89f4a2f21 100644 --- a/BaseTools/Source/Python/Capsule/GenerateWindowsDriver.py +++ b/BaseTools/Source/Python/Capsule/GenerateWindowsDriver.py @@ -90,7 +90,7 @@ def convert_arg_line_to_args(arg_line): parser.add_argument("--product-fw-desc", dest = "ProductFwDesc", help = "description about resource update driver") parser.add_argument("--capsule-file-name", dest = 'CapsuleFileName', help ="firmware resource image file") parser.add_argument("--pfx-file", dest = 'PfxFile', help = "pfx file path used to sign resource update driver") - parser.add_argument("--arch", dest = 'Arch', help = "supported architecture:arm/x64/amd64/arm64/aarch64", default = 'amd64') + parser.add_argument("--arch", dest = 'Arch', help = "supported architecture:x64/amd64/arm64/aarch64", default = 'amd64') parser.add_argument("--operating-system-string", dest = 'OperatingSystemString', help = "supported operating system:win10/10/10_au/10_rs2/10_rs3/10_rs4/server10/server2016/serverrs2/serverrs3/serverrs4", default = "win10") args = parser.parse_args() diff --git a/BaseTools/Source/Python/Common/DataType.py b/BaseTools/Source/Python/Common/DataType.py index 48dbf16495e6..fb9d63cf9324 100644 --- a/BaseTools/Source/Python/Common/DataType.py +++ b/BaseTools/Source/Python/Common/DataType.py @@ -50,13 +50,12 @@ TAB_ARCH_COMMON = 'COMMON' TAB_ARCH_IA32 = 'IA32' TAB_ARCH_X64 = 'X64' -TAB_ARCH_ARM = 'ARM' TAB_ARCH_EBC = 'EBC' TAB_ARCH_AARCH64 = 'AARCH64' TAB_ARCH_RISCV64 = 'RISCV64' TAB_ARCH_LOONGARCH64 = 'LOONGARCH64' -ARCH_SET_FULL = {TAB_ARCH_IA32, TAB_ARCH_X64, TAB_ARCH_ARM, TAB_ARCH_EBC, TAB_ARCH_AARCH64, TAB_ARCH_RISCV64, TAB_ARCH_LOONGARCH64, TAB_ARCH_COMMON} +ARCH_SET_FULL = {TAB_ARCH_IA32, TAB_ARCH_X64, TAB_ARCH_EBC, TAB_ARCH_AARCH64, TAB_ARCH_RISCV64, TAB_ARCH_LOONGARCH64, TAB_ARCH_COMMON} SUP_MODULE_BASE = 'BASE' SUP_MODULE_SEC = 'SEC' @@ -136,7 +135,6 @@ TAB_SOURCES_COMMON = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_COMMON TAB_SOURCES_IA32 = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_IA32 TAB_SOURCES_X64 = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_X64 -TAB_SOURCES_ARM = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_ARM TAB_SOURCES_EBC = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_EBC TAB_SOURCES_AARCH64 = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_AARCH64 TAB_SOURCES_LOONGARCH64 = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_LOONGARCH64 @@ -145,7 +143,6 @@ TAB_BINARIES_COMMON = TAB_BINARIES + TAB_SPLIT + TAB_ARCH_COMMON TAB_BINARIES_IA32 = TAB_BINARIES + TAB_SPLIT + TAB_ARCH_IA32 TAB_BINARIES_X64 = TAB_BINARIES + TAB_SPLIT + TAB_ARCH_X64 -TAB_BINARIES_ARM = TAB_BINARIES + TAB_SPLIT + TAB_ARCH_ARM TAB_BINARIES_EBC = TAB_BINARIES + TAB_SPLIT + TAB_ARCH_EBC TAB_BINARIES_AARCH64 = TAB_BINARIES + TAB_SPLIT + TAB_ARCH_AARCH64 TAB_BINARIES_LOONGARCH64 = TAB_BINARIES + TAB_SPLIT + TAB_ARCH_LOONGARCH64 @@ -154,7 +151,6 @@ TAB_INCLUDES_COMMON = TAB_INCLUDES + TAB_SPLIT + TAB_ARCH_COMMON TAB_INCLUDES_IA32 = TAB_INCLUDES + TAB_SPLIT + TAB_ARCH_IA32 TAB_INCLUDES_X64 = TAB_INCLUDES + TAB_SPLIT + TAB_ARCH_X64 -TAB_INCLUDES_ARM = TAB_INCLUDES + TAB_SPLIT + TAB_ARCH_ARM TAB_INCLUDES_EBC = TAB_INCLUDES + TAB_SPLIT + TAB_ARCH_EBC TAB_INCLUDES_AARCH64 = TAB_INCLUDES + TAB_SPLIT + TAB_ARCH_AARCH64 TAB_INCLUDES_LOONGARCH64 = TAB_INCLUDES + TAB_SPLIT + TAB_ARCH_LOONGARCH64 @@ -163,7 +159,6 @@ TAB_GUIDS_COMMON = TAB_GUIDS + TAB_SPLIT + TAB_ARCH_COMMON TAB_GUIDS_IA32 = TAB_GUIDS + TAB_SPLIT + TAB_ARCH_IA32 TAB_GUIDS_X64 = TAB_GUIDS + TAB_SPLIT + TAB_ARCH_X64 -TAB_GUIDS_ARM = TAB_GUIDS + TAB_SPLIT + TAB_ARCH_ARM TAB_GUIDS_EBC = TAB_GUIDS + TAB_SPLIT + TAB_ARCH_EBC TAB_GUIDS_AARCH64 = TAB_GUIDS + TAB_SPLIT + TAB_ARCH_AARCH64 TAB_GUIDS_LOONGARCH64 = TAB_GUIDS + TAB_SPLIT + TAB_ARCH_LOONGARCH64 @@ -172,7 +167,6 @@ TAB_PROTOCOLS_COMMON = TAB_PROTOCOLS + TAB_SPLIT + TAB_ARCH_COMMON TAB_PROTOCOLS_IA32 = TAB_PROTOCOLS + TAB_SPLIT + TAB_ARCH_IA32 TAB_PROTOCOLS_X64 = TAB_PROTOCOLS + TAB_SPLIT + TAB_ARCH_X64 -TAB_PROTOCOLS_ARM = TAB_PROTOCOLS + TAB_SPLIT + TAB_ARCH_ARM TAB_PROTOCOLS_EBC = TAB_PROTOCOLS + TAB_SPLIT + TAB_ARCH_EBC TAB_PROTOCOLS_AARCH64 = TAB_PROTOCOLS + TAB_SPLIT + TAB_ARCH_AARCH64 TAB_PROTOCOLS_LOONGARCH64 = TAB_PROTOCOLS + TAB_SPLIT + TAB_ARCH_LOONGARCH64 @@ -181,7 +175,6 @@ TAB_PPIS_COMMON = TAB_PPIS + TAB_SPLIT + TAB_ARCH_COMMON TAB_PPIS_IA32 = TAB_PPIS + TAB_SPLIT + TAB_ARCH_IA32 TAB_PPIS_X64 = TAB_PPIS + TAB_SPLIT + TAB_ARCH_X64 -TAB_PPIS_ARM = TAB_PPIS + TAB_SPLIT + TAB_ARCH_ARM TAB_PPIS_EBC = TAB_PPIS + TAB_SPLIT + TAB_ARCH_EBC TAB_PPIS_AARCH64 = TAB_PPIS + TAB_SPLIT + TAB_ARCH_AARCH64 TAB_PPIS_LOONGARCH64 = TAB_PPIS + TAB_SPLIT + TAB_ARCH_LOONGARCH64 @@ -190,7 +183,6 @@ TAB_LIBRARY_CLASSES_COMMON = TAB_LIBRARY_CLASSES + TAB_SPLIT + TAB_ARCH_COMMON TAB_LIBRARY_CLASSES_IA32 = TAB_LIBRARY_CLASSES + TAB_SPLIT + TAB_ARCH_IA32 TAB_LIBRARY_CLASSES_X64 = TAB_LIBRARY_CLASSES + TAB_SPLIT + TAB_ARCH_X64 -TAB_LIBRARY_CLASSES_ARM = TAB_LIBRARY_CLASSES + TAB_SPLIT + TAB_ARCH_ARM TAB_LIBRARY_CLASSES_EBC = TAB_LIBRARY_CLASSES + TAB_SPLIT + TAB_ARCH_EBC TAB_LIBRARY_CLASSES_AARCH64 = TAB_LIBRARY_CLASSES + TAB_SPLIT + TAB_ARCH_AARCH64 TAB_LIBRARY_CLASSES_LOONGARCH64 = TAB_LIBRARY_CLASSES + TAB_SPLIT + TAB_ARCH_LOONGARCH64 @@ -199,7 +191,6 @@ TAB_PACKAGES_COMMON = TAB_PACKAGES + TAB_SPLIT + TAB_ARCH_COMMON TAB_PACKAGES_IA32 = TAB_PACKAGES + TAB_SPLIT + TAB_ARCH_IA32 TAB_PACKAGES_X64 = TAB_PACKAGES + TAB_SPLIT + TAB_ARCH_X64 -TAB_PACKAGES_ARM = TAB_PACKAGES + TAB_SPLIT + TAB_ARCH_ARM TAB_PACKAGES_EBC = TAB_PACKAGES + TAB_SPLIT + TAB_ARCH_EBC TAB_PACKAGES_AARCH64 = TAB_PACKAGES + TAB_SPLIT + TAB_ARCH_AARCH64 TAB_PACKAGES_LOONGARCH64 = TAB_PACKAGES + TAB_SPLIT + TAB_ARCH_LOONGARCH64 @@ -227,7 +218,6 @@ TAB_PCDS_FIXED_AT_BUILD_COMMON = TAB_PCDS + TAB_PCDS_FIXED_AT_BUILD + TAB_SPLIT + TAB_ARCH_COMMON TAB_PCDS_FIXED_AT_BUILD_IA32 = TAB_PCDS + TAB_PCDS_FIXED_AT_BUILD + TAB_SPLIT + TAB_ARCH_IA32 TAB_PCDS_FIXED_AT_BUILD_X64 = TAB_PCDS + TAB_PCDS_FIXED_AT_BUILD + TAB_SPLIT + TAB_ARCH_X64 -TAB_PCDS_FIXED_AT_BUILD_ARM = TAB_PCDS + TAB_PCDS_FIXED_AT_BUILD + TAB_SPLIT + TAB_ARCH_ARM TAB_PCDS_FIXED_AT_BUILD_EBC = TAB_PCDS + TAB_PCDS_FIXED_AT_BUILD + TAB_SPLIT + TAB_ARCH_EBC TAB_PCDS_FIXED_AT_BUILD_AARCH64 = TAB_PCDS + TAB_PCDS_FIXED_AT_BUILD + TAB_SPLIT + TAB_ARCH_AARCH64 TAB_PCDS_FIXED_AT_BUILD_LOONGARCH64 = TAB_PCDS + TAB_PCDS_FIXED_AT_BUILD + TAB_SPLIT + TAB_ARCH_LOONGARCH64 @@ -236,7 +226,6 @@ TAB_PCDS_PATCHABLE_IN_MODULE_COMMON = TAB_PCDS + TAB_PCDS_PATCHABLE_IN_MODULE + TAB_SPLIT + TAB_ARCH_COMMON TAB_PCDS_PATCHABLE_IN_MODULE_IA32 = TAB_PCDS + TAB_PCDS_PATCHABLE_IN_MODULE + TAB_SPLIT + TAB_ARCH_IA32 TAB_PCDS_PATCHABLE_IN_MODULE_X64 = TAB_PCDS + TAB_PCDS_PATCHABLE_IN_MODULE + TAB_SPLIT + TAB_ARCH_X64 -TAB_PCDS_PATCHABLE_IN_MODULE_ARM = TAB_PCDS + TAB_PCDS_PATCHABLE_IN_MODULE + TAB_SPLIT + TAB_ARCH_ARM TAB_PCDS_PATCHABLE_IN_MODULE_EBC = TAB_PCDS + TAB_PCDS_PATCHABLE_IN_MODULE + TAB_SPLIT + TAB_ARCH_EBC TAB_PCDS_PATCHABLE_IN_MODULE_AARCH64 = TAB_PCDS + TAB_PCDS_PATCHABLE_IN_MODULE + TAB_SPLIT + TAB_ARCH_AARCH64 TAB_PCDS_PATCHABLE_IN_MODULE_LOONGARCH64 = TAB_PCDS + TAB_PCDS_PATCHABLE_IN_MODULE + TAB_SPLIT + TAB_ARCH_LOONGARCH64 @@ -245,7 +234,6 @@ TAB_PCDS_FEATURE_FLAG_COMMON = TAB_PCDS + TAB_PCDS_FEATURE_FLAG + TAB_SPLIT + TAB_ARCH_COMMON TAB_PCDS_FEATURE_FLAG_IA32 = TAB_PCDS + TAB_PCDS_FEATURE_FLAG + TAB_SPLIT + TAB_ARCH_IA32 TAB_PCDS_FEATURE_FLAG_X64 = TAB_PCDS + TAB_PCDS_FEATURE_FLAG + TAB_SPLIT + TAB_ARCH_X64 -TAB_PCDS_FEATURE_FLAG_ARM = TAB_PCDS + TAB_PCDS_FEATURE_FLAG + TAB_SPLIT + TAB_ARCH_ARM TAB_PCDS_FEATURE_FLAG_EBC = TAB_PCDS + TAB_PCDS_FEATURE_FLAG + TAB_SPLIT + TAB_ARCH_EBC TAB_PCDS_FEATURE_FLAG_AARCH64 = TAB_PCDS + TAB_PCDS_FEATURE_FLAG + TAB_SPLIT + TAB_ARCH_AARCH64 TAB_PCDS_FEATURE_FLAG_LOONGARCH64 = TAB_PCDS + TAB_PCDS_FEATURE_FLAG + TAB_SPLIT + TAB_ARCH_LOONGARCH64 @@ -257,7 +245,6 @@ TAB_PCDS_DYNAMIC_EX_COMMON = TAB_PCDS + TAB_PCDS_DYNAMIC_EX + TAB_SPLIT + TAB_ARCH_COMMON TAB_PCDS_DYNAMIC_EX_IA32 = TAB_PCDS + TAB_PCDS_DYNAMIC_EX + TAB_SPLIT + TAB_ARCH_IA32 TAB_PCDS_DYNAMIC_EX_X64 = TAB_PCDS + TAB_PCDS_DYNAMIC_EX + TAB_SPLIT + TAB_ARCH_X64 -TAB_PCDS_DYNAMIC_EX_ARM = TAB_PCDS + TAB_PCDS_DYNAMIC_EX + TAB_SPLIT + TAB_ARCH_ARM TAB_PCDS_DYNAMIC_EX_EBC = TAB_PCDS + TAB_PCDS_DYNAMIC_EX + TAB_SPLIT + TAB_ARCH_EBC TAB_PCDS_DYNAMIC_EX_AARCH64 = TAB_PCDS + TAB_PCDS_DYNAMIC_EX + TAB_SPLIT + TAB_ARCH_AARCH64 TAB_PCDS_DYNAMIC_EX_LOONGARCH64 = TAB_PCDS + TAB_PCDS_DYNAMIC_EX + TAB_SPLIT + TAB_ARCH_LOONGARCH64 @@ -269,7 +256,6 @@ TAB_PCDS_DYNAMIC_COMMON = TAB_PCDS + TAB_PCDS_DYNAMIC + TAB_SPLIT + TAB_ARCH_COMMON TAB_PCDS_DYNAMIC_IA32 = TAB_PCDS + TAB_PCDS_DYNAMIC + TAB_SPLIT + TAB_ARCH_IA32 TAB_PCDS_DYNAMIC_X64 = TAB_PCDS + TAB_PCDS_DYNAMIC + TAB_SPLIT + TAB_ARCH_X64 -TAB_PCDS_DYNAMIC_ARM = TAB_PCDS + TAB_PCDS_DYNAMIC + TAB_SPLIT + TAB_ARCH_ARM TAB_PCDS_DYNAMIC_EBC = TAB_PCDS + TAB_PCDS_DYNAMIC + TAB_SPLIT + TAB_ARCH_EBC TAB_PCDS_DYNAMIC_AARCH64 = TAB_PCDS + TAB_PCDS_DYNAMIC + TAB_SPLIT + TAB_ARCH_AARCH64 TAB_PCDS_DYNAMIC_LOONGARCH64 = TAB_PCDS + TAB_PCDS_DYNAMIC + TAB_SPLIT + TAB_ARCH_LOONGARCH64 @@ -296,7 +282,6 @@ TAB_DEPEX_COMMON = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_COMMON TAB_DEPEX_IA32 = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_IA32 TAB_DEPEX_X64 = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_X64 -TAB_DEPEX_ARM = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_ARM TAB_DEPEX_EBC = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_EBC TAB_DEPEX_AARCH64 = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_AARCH64 TAB_DEPEX_LOONGARCH64 = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_LOONGARCH64 @@ -309,7 +294,6 @@ TAB_LIBRARIES_COMMON = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_COMMON TAB_LIBRARIES_IA32 = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_IA32 TAB_LIBRARIES_X64 = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_X64 -TAB_LIBRARIES_ARM = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_ARM TAB_LIBRARIES_EBC = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_EBC TAB_LIBRARIES_AARCH64 = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_AARCH64 TAB_LIBRARIES_LOONGARCH64 = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_LOONGARCH64 @@ -318,7 +302,6 @@ TAB_COMPONENTS_COMMON = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_COMMON TAB_COMPONENTS_IA32 = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_IA32 TAB_COMPONENTS_X64 = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_X64 -TAB_COMPONENTS_ARM = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_ARM TAB_COMPONENTS_EBC = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_EBC TAB_COMPONENTS_AARCH64 = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_AARCH64 TAB_COMPONENTS_LOONGARCH64 = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_LOONGARCH64 diff --git a/BaseTools/Source/Python/Ecc/Check.py b/BaseTools/Source/Python/Ecc/Check.py index c31ee703a7de..8a4cf34903d1 100644 --- a/BaseTools/Source/Python/Ecc/Check.py +++ b/BaseTools/Source/Python/Ecc/Check.py @@ -1092,7 +1092,7 @@ def MetaDataFileCheckModuleFileNoUse(self): RecordSet = EccGlobalData.gDb.TblInf.Exec(SqlCommand) for Record in RecordSet: Path = Record[1] - Path = Path.upper().replace(r'\X64', '').replace(r'\IA32', '').replace(r'\EBC', '').replace(r'\IPF', '').replace(r'\ARM', '') + Path = Path.upper().replace(r'\X64', '').replace(r'\IA32', '').replace(r'\EBC', '').replace(r'\IPF', '') if Path in InfPathList: if not EccGlobalData.gException.IsException(ERROR_META_DATA_FILE_CHECK_MODULE_FILE_NO_USE, Record[2]): EccGlobalData.gDb.TblReport.Insert(ERROR_META_DATA_FILE_CHECK_MODULE_FILE_NO_USE, OtherMsg="The source file [%s] is existing in module directory but it is not described in INF file." % (Record[2]), BelongsToTable='File', BelongsToItem=Record[0]) diff --git a/BaseTools/Source/Python/GenFds/GenFds.py b/BaseTools/Source/Python/GenFds/GenFds.py index fe53d6b160e1..9c6a38698cde 100644 --- a/BaseTools/Source/Python/GenFds/GenFds.py +++ b/BaseTools/Source/Python/GenFds/GenFds.py @@ -440,7 +440,7 @@ def myOptionParser(): usage = "%prog [options] -f input_file -a arch_list -b build_target -p active_platform -t tool_chain_tag -D \"MacroName [= MacroValue]\"" Parser = OptionParser(usage=usage, description=__copyright__, version="%prog " + str(versionNumber)) Parser.add_option("-f", "--file", dest="filename", type="string", help="Name of FDF file to convert", action="callback", callback=SingleCheckCallback) - Parser.add_option("-a", "--arch", dest="archList", help="comma separated list containing one or more of: IA32, X64, IPF, ARM, AARCH64 or EBC which should be built, overrides target.txt?s TARGET_ARCH") + Parser.add_option("-a", "--arch", dest="archList", help="comma separated list containing one or more of: IA32, X64, IPF, AARCH64 or EBC which should be built, overrides target.txt?s TARGET_ARCH") Parser.add_option("-q", "--quiet", action="store_true", type=None, help="Disable all messages except FATAL ERRORS.") Parser.add_option("-v", "--verbose", action="store_true", type=None, help="Turn on verbose output with informational messages printed.") Parser.add_option("-d", "--debug", action="store", type="int", help="Enable debug messages at specified level.") diff --git a/BaseTools/Source/Python/TargetTool/TargetTool.py b/BaseTools/Source/Python/TargetTool/TargetTool.py index 8b344251fb6b..1bed7e5bf354 100644 --- a/BaseTools/Source/Python/TargetTool/TargetTool.py +++ b/BaseTools/Source/Python/TargetTool/TargetTool.py @@ -198,7 +198,7 @@ def RangeCheckCallback(option, opt_str, value, parser): def MyOptionParser(): parser = OptionParser(version=__version__, prog="TargetTool.exe", usage=__usage__, description=__copyright__) parser.add_option("-a", "--arch", action="append", dest="TARGET_ARCH", - help="ARCHS is one of list: IA32, X64, ARM, AARCH64 or EBC, which replaces target.txt's TARGET_ARCH definition. To specify more archs, please repeat this option. 0 will clear this setting in target.txt and can't combine with other value.") + help="ARCHS is one of list: IA32, X64, AARCH64 or EBC, which replaces target.txt's TARGET_ARCH definition. To specify more archs, please repeat this option. 0 will clear this setting in target.txt and can't combine with other value.") parser.add_option("-p", "--platform", action="callback", type="string", dest="DSCFILE", callback=SingleCheckCallback, help="Specify a DSC file, which replace target.txt's ACTIVE_PLATFORM definition. 0 will clear this setting in target.txt and can't combine with other value.") parser.add_option("-c", "--tooldef", action="callback", type="string", dest="TOOL_DEFINITION_FILE", callback=SingleCheckCallback, diff --git a/BaseTools/Source/Python/UPT/Library/DataType.py b/BaseTools/Source/Python/UPT/Library/DataType.py index 0e47f3567056..13d15921999d 100644 --- a/BaseTools/Source/Python/UPT/Library/DataType.py +++ b/BaseTools/Source/Python/UPT/Library/DataType.py @@ -367,12 +367,11 @@ TAB_ARCH_IA32 = 'IA32' TAB_ARCH_X64 = 'X64' TAB_ARCH_IPF = 'IPF' -TAB_ARCH_ARM = 'ARM' TAB_ARCH_LOONGARCH64 = 'LOONGARCH64' TAB_ARCH_EBC = 'EBC' ARCH_LIST = \ -[TAB_ARCH_IA32, TAB_ARCH_X64, TAB_ARCH_IPF, TAB_ARCH_ARM, TAB_ARCH_LOONGARCH64, TAB_ARCH_EBC] +[TAB_ARCH_IA32, TAB_ARCH_X64, TAB_ARCH_IPF, TAB_ARCH_LOONGARCH64, TAB_ARCH_EBC] SUP_MODULE_BASE = 'BASE' SUP_MODULE_SEC = 'SEC' @@ -455,7 +454,6 @@ TAB_SOURCES_IA32 = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_IA32 TAB_SOURCES_X64 = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_X64 TAB_SOURCES_IPF = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_IPF -TAB_SOURCES_ARM = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_ARM TAB_SOURCES_LOONGARCH64 = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_LOONGARCH64 TAB_SOURCES_EBC = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_EBC @@ -464,7 +462,6 @@ TAB_BINARIES_IA32 = TAB_BINARIES + TAB_SPLIT + TAB_ARCH_IA32 TAB_BINARIES_X64 = TAB_BINARIES + TAB_SPLIT + TAB_ARCH_X64 TAB_BINARIES_IPF = TAB_BINARIES + TAB_SPLIT + TAB_ARCH_IPF -TAB_BINARIES_ARM = TAB_BINARIES + TAB_SPLIT + TAB_ARCH_ARM TAB_BINARIES_LOONGARCH64 = TAB_BINARIES + TAB_SPLIT + TAB_ARCH_LOONGARCH64 TAB_BINARIES_EBC = TAB_BINARIES + TAB_SPLIT + TAB_ARCH_EBC @@ -473,7 +470,6 @@ TAB_INCLUDES_IA32 = TAB_INCLUDES + TAB_SPLIT + TAB_ARCH_IA32 TAB_INCLUDES_X64 = TAB_INCLUDES + TAB_SPLIT + TAB_ARCH_X64 TAB_INCLUDES_IPF = TAB_INCLUDES + TAB_SPLIT + TAB_ARCH_IPF -TAB_INCLUDES_ARM = TAB_INCLUDES + TAB_SPLIT + TAB_ARCH_ARM TAB_INCLUDES_LOONGARCH64 = TAB_INCLUDES + TAB_SPLIT + TAB_ARCH_LOONGARCH64 TAB_INCLUDES_EBC = TAB_INCLUDES + TAB_SPLIT + TAB_ARCH_EBC @@ -482,7 +478,6 @@ TAB_GUIDS_IA32 = TAB_GUIDS + TAB_SPLIT + TAB_ARCH_IA32 TAB_GUIDS_X64 = TAB_GUIDS + TAB_SPLIT + TAB_ARCH_X64 TAB_GUIDS_IPF = TAB_GUIDS + TAB_SPLIT + TAB_ARCH_IPF -TAB_GUIDS_ARM = TAB_GUIDS + TAB_SPLIT + TAB_ARCH_ARM TAB_GUIDS_LOONGARCH64 = TAB_GUIDS + TAB_SPLIT + TAB_ARCH_LOONGARCH64 TAB_GUIDS_EBC = TAB_GUIDS + TAB_SPLIT + TAB_ARCH_EBC @@ -491,7 +486,6 @@ TAB_PROTOCOLS_IA32 = TAB_PROTOCOLS + TAB_SPLIT + TAB_ARCH_IA32 TAB_PROTOCOLS_X64 = TAB_PROTOCOLS + TAB_SPLIT + TAB_ARCH_X64 TAB_PROTOCOLS_IPF = TAB_PROTOCOLS + TAB_SPLIT + TAB_ARCH_IPF -TAB_PROTOCOLS_ARM = TAB_PROTOCOLS + TAB_SPLIT + TAB_ARCH_ARM TAB_PROTOCOLS_LOONGARCH64 = TAB_PROTOCOLS + TAB_SPLIT + TAB_ARCH_LOONGARCH64 TAB_PROTOCOLS_EBC = TAB_PROTOCOLS + TAB_SPLIT + TAB_ARCH_EBC @@ -500,7 +494,6 @@ TAB_PPIS_IA32 = TAB_PPIS + TAB_SPLIT + TAB_ARCH_IA32 TAB_PPIS_X64 = TAB_PPIS + TAB_SPLIT + TAB_ARCH_X64 TAB_PPIS_IPF = TAB_PPIS + TAB_SPLIT + TAB_ARCH_IPF -TAB_PPIS_ARM = TAB_PPIS + TAB_SPLIT + TAB_ARCH_ARM TAB_PPIS_LOONGARCH64 = TAB_PPIS + TAB_SPLIT + TAB_ARCH_LOONGARCH64 TAB_PPIS_EBC = TAB_PPIS + TAB_SPLIT + TAB_ARCH_EBC @@ -509,7 +502,6 @@ TAB_LIBRARY_CLASSES_IA32 = TAB_LIBRARY_CLASSES + TAB_SPLIT + TAB_ARCH_IA32 TAB_LIBRARY_CLASSES_X64 = TAB_LIBRARY_CLASSES + TAB_SPLIT + TAB_ARCH_X64 TAB_LIBRARY_CLASSES_IPF = TAB_LIBRARY_CLASSES + TAB_SPLIT + TAB_ARCH_IPF -TAB_LIBRARY_CLASSES_ARM = TAB_LIBRARY_CLASSES + TAB_SPLIT + TAB_ARCH_ARM TAB_LIBRARY_CLASSES_LOONGARCH64 = TAB_LIBRARY_CLASSES + TAB_SPLIT + TAB_ARCH_LOONGARCH64 TAB_LIBRARY_CLASSES_EBC = TAB_LIBRARY_CLASSES + TAB_SPLIT + TAB_ARCH_EBC @@ -518,7 +510,6 @@ TAB_PACKAGES_IA32 = TAB_PACKAGES + TAB_SPLIT + TAB_ARCH_IA32 TAB_PACKAGES_X64 = TAB_PACKAGES + TAB_SPLIT + TAB_ARCH_X64 TAB_PACKAGES_IPF = TAB_PACKAGES + TAB_SPLIT + TAB_ARCH_IPF -TAB_PACKAGES_ARM = TAB_PACKAGES + TAB_SPLIT + TAB_ARCH_ARM TAB_PACKAGES_LOONGARCH64 = TAB_PACKAGES + TAB_SPLIT + TAB_ARCH_LOONGARCH64 TAB_PACKAGES_EBC = TAB_PACKAGES + TAB_SPLIT + TAB_ARCH_EBC @@ -556,8 +547,6 @@ TAB_SPLIT + TAB_ARCH_X64 TAB_PCDS_FIXED_AT_BUILD_IPF = TAB_PCDS + TAB_PCDS_FIXED_AT_BUILD + \ TAB_SPLIT + TAB_ARCH_IPF -TAB_PCDS_FIXED_AT_BUILD_ARM = TAB_PCDS + TAB_PCDS_FIXED_AT_BUILD + \ -TAB_SPLIT + TAB_ARCH_ARM TAB_PCDS_FIXED_AT_BUILD_LOONGARCH64 = TAB_PCDS + TAB_PCDS_FIXED_AT_BUILD + \ TAB_SPLIT + TAB_ARCH_LOONGARCH64 TAB_PCDS_FIXED_AT_BUILD_EBC = TAB_PCDS + TAB_PCDS_FIXED_AT_BUILD + \ @@ -572,8 +561,6 @@ TAB_SPLIT + TAB_ARCH_X64 TAB_PCDS_PATCHABLE_IN_MODULE_IPF = TAB_PCDS + TAB_PCDS_PATCHABLE_IN_MODULE + \ TAB_SPLIT + TAB_ARCH_IPF -TAB_PCDS_PATCHABLE_IN_MODULE_ARM = TAB_PCDS + TAB_PCDS_PATCHABLE_IN_MODULE + \ -TAB_SPLIT + TAB_ARCH_ARM TAB_PCDS_PATCHABLE_IN_MODULE_LOONGARCH64 = TAB_PCDS + TAB_PCDS_PATCHABLE_IN_MODULE + \ TAB_SPLIT + TAB_ARCH_LOONGARCH64 TAB_PCDS_PATCHABLE_IN_MODULE_EBC = TAB_PCDS + TAB_PCDS_PATCHABLE_IN_MODULE + \ @@ -588,8 +575,6 @@ TAB_ARCH_X64 TAB_PCDS_FEATURE_FLAG_IPF = TAB_PCDS + TAB_PCDS_FEATURE_FLAG + TAB_SPLIT + \ TAB_ARCH_IPF -TAB_PCDS_FEATURE_FLAG_ARM = TAB_PCDS + TAB_PCDS_FEATURE_FLAG + TAB_SPLIT + \ -TAB_ARCH_ARM TAB_PCDS_FEATURE_FLAG_LOONGARCH64 = TAB_PCDS + TAB_PCDS_FEATURE_FLAG + TAB_SPLIT + \ TAB_ARCH_LOONGARCH64 TAB_PCDS_FEATURE_FLAG_EBC = TAB_PCDS + TAB_PCDS_FEATURE_FLAG + TAB_SPLIT + \ @@ -607,8 +592,6 @@ TAB_ARCH_X64 TAB_PCDS_DYNAMIC_EX_IPF = TAB_PCDS + TAB_PCDS_DYNAMIC_EX + TAB_SPLIT + \ TAB_ARCH_IPF -TAB_PCDS_DYNAMIC_EX_ARM = TAB_PCDS + TAB_PCDS_DYNAMIC_EX + TAB_SPLIT + \ -TAB_ARCH_ARM TAB_PCDS_DYNAMIC_EX_LOONGARCH64 = TAB_PCDS + TAB_PCDS_DYNAMIC_EX + TAB_SPLIT + \ TAB_ARCH_LOONGARCH64 TAB_PCDS_DYNAMIC_EX_EBC = TAB_PCDS + TAB_PCDS_DYNAMIC_EX + TAB_SPLIT + \ @@ -623,7 +606,6 @@ TAB_PCDS_DYNAMIC_IA32 = TAB_PCDS + TAB_PCDS_DYNAMIC + TAB_SPLIT + TAB_ARCH_IA32 TAB_PCDS_DYNAMIC_X64 = TAB_PCDS + TAB_PCDS_DYNAMIC + TAB_SPLIT + TAB_ARCH_X64 TAB_PCDS_DYNAMIC_IPF = TAB_PCDS + TAB_PCDS_DYNAMIC + TAB_SPLIT + TAB_ARCH_IPF -TAB_PCDS_DYNAMIC_ARM = TAB_PCDS + TAB_PCDS_DYNAMIC + TAB_SPLIT + TAB_ARCH_ARM TAB_PCDS_DYNAMIC_LOONGARCH64 = TAB_PCDS + TAB_PCDS_DYNAMIC + TAB_SPLIT + TAB_ARCH_LOONGARCH64 TAB_PCDS_DYNAMIC_EBC = TAB_PCDS + TAB_PCDS_DYNAMIC + TAB_SPLIT + TAB_ARCH_EBC @@ -664,7 +646,6 @@ TAB_DEPEX_IA32 = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_IA32 TAB_DEPEX_X64 = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_X64 TAB_DEPEX_IPF = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_IPF -TAB_DEPEX_ARM = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_ARM TAB_DEPEX_LOONGARCH64 = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_LOONGARCH64 TAB_DEPEX_EBC = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_EBC @@ -675,7 +656,6 @@ TAB_LIBRARIES_IA32 = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_IA32 TAB_LIBRARIES_X64 = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_X64 TAB_LIBRARIES_IPF = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_IPF -TAB_LIBRARIES_ARM = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_ARM TAB_LIBRARIES_LOONGARCH64 = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_LOONGARCH64 TAB_LIBRARIES_EBC = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_EBC @@ -684,7 +664,6 @@ TAB_COMPONENTS_IA32 = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_IA32 TAB_COMPONENTS_X64 = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_X64 TAB_COMPONENTS_IPF = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_IPF -TAB_COMPONENTS_ARM = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_ARM TAB_COMPONENTS_LOONGARCH64 = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_LOONGARCH64 TAB_COMPONENTS_EBC = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_EBC diff --git a/BaseTools/Source/Python/build/build.py b/BaseTools/Source/Python/build/build.py index 0ca71e5458c0..b0f333a2f0d8 100755 --- a/BaseTools/Source/Python/build/build.py +++ b/BaseTools/Source/Python/build/build.py @@ -1799,8 +1799,8 @@ def _BuildPlatform(self): # # Check whether the set fix address is above 4G for 32bit image. # - if (Arch == 'IA32' or Arch == 'ARM') and self.LoadFixAddress != 0xFFFFFFFFFFFFFFFF and self.LoadFixAddress >= 0x100000000: - EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS can't be set to larger than or equal to 4G for the platform with IA32 or ARM arch modules") + if Arch == 'IA32' and self.LoadFixAddress != 0xFFFFFFFFFFFFFFFF and self.LoadFixAddress >= 0x100000000: + EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS can't be set to larger than or equal to 4G for the platform with IA32 arch modules") # # Get Module List # @@ -1985,8 +1985,8 @@ def _BuildModule(self): # # Check whether the set fix address is above 4G for 32bit image. # - if (Arch == 'IA32' or Arch == 'ARM') and self.LoadFixAddress != 0xFFFFFFFFFFFFFFFF and self.LoadFixAddress >= 0x100000000: - EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS can't be set to larger than or equal to 4G for the platorm with IA32 or ARM arch modules") + if Arch == 'IA32' and self.LoadFixAddress != 0xFFFFFFFFFFFFFFFF and self.LoadFixAddress >= 0x100000000: + EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS can't be set to larger than or equal to 4G for the platorm with IA32 arch modules") # # Get Module List # @@ -2316,8 +2316,8 @@ def _MultiThreadBuildPlatform(self): # # Check whether the set fix address is above 4G for 32bit image. # - if (Arch == 'IA32' or Arch == 'ARM') and self.LoadFixAddress != 0xFFFFFFFFFFFFFFFF and self.LoadFixAddress >= 0x100000000: - EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS can't be set to larger than or equal to 4G for the platorm with IA32 or ARM arch modules") + if Arch == 'IA32' and self.LoadFixAddress != 0xFFFFFFFFFFFFFFFF and self.LoadFixAddress >= 0x100000000: + EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS can't be set to larger than or equal to 4G for the platorm with IA32 arch modules") # # Rebase module to the preferred memory address before GenFds diff --git a/BaseTools/Source/Python/build/buildoptions.py b/BaseTools/Source/Python/build/buildoptions.py index 5ec561f7ec75..1787d80a44f8 100644 --- a/BaseTools/Source/Python/build/buildoptions.py +++ b/BaseTools/Source/Python/build/buildoptions.py @@ -42,7 +42,7 @@ def __init__(self): def GetOption(self): Parser = OptionParser(description=__copyright__, version=__version__, prog="build.exe", usage="%prog [options] [all|fds|genc|genmake|clean|cleanall|cleanlib|modules|libraries|run]") Parser.add_option("-a", "--arch", action="append", dest="TargetArch", - help="ARCHS is one of list: IA32, X64, ARM, AARCH64, RISCV64, LOONGARCH64 or EBC, which overrides target.txt's TARGET_ARCH definition. To specify more archs, please repeat this option.") + help="ARCHS is one of list: IA32, X64, AARCH64, RISCV64, LOONGARCH64 or EBC, which overrides target.txt's TARGET_ARCH definition. To specify more archs, please repeat this option.") Parser.add_option("-p", "--platform", action="callback", type="string", dest="PlatformFile", callback=SingleCheckCallback, help="Build the platform specified by the DSC file name argument, overriding target.txt's ACTIVE_PLATFORM definition.") Parser.add_option("-m", "--module", action="callback", type="string", dest="ModuleFile", callback=SingleCheckCallback, From 8310dfa9f49bf4eff96a36291bc0028be920f60b Mon Sep 17 00:00:00 2001 From: Amy Chan Date: Wed, 24 Sep 2025 15:35:51 +0800 Subject: [PATCH 0557/1172] CryptoPkg/Library/OpensslLib: Add back PKCS12 support Fix wifi driver fails to configure the private key to CryptoDxe. This enables TlsSetHostPrivateKeyEx() to handle PBES2-encrypted private keys by providing PKCS12_pbe_crypt_ex(). Signed-off-by: Amy Chan --- CryptoPkg/Library/OpensslLib/OpensslLib.inf | 17 ++++++- .../Library/OpensslLib/OpensslLibAccel.inf | 49 ++++++++++++++++++- .../Library/OpensslLib/OpensslLibCrypto.inf | 17 ++++++- .../Library/OpensslLib/OpensslLibFull.inf | 17 ++++++- .../OpensslLib/OpensslLibFullAccel.inf | 49 ++++++++++++++++++- CryptoPkg/Library/OpensslLib/configure.py | 1 - 6 files changed, 144 insertions(+), 6 deletions(-) diff --git a/CryptoPkg/Library/OpensslLib/OpensslLib.inf b/CryptoPkg/Library/OpensslLib/OpensslLib.inf index c2ea42155a79..c4ecd3ad5273 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLib.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLib.inf @@ -391,6 +391,22 @@ $(OPENSSL_PATH)/crypto/pem/pem_x509.c $(OPENSSL_PATH)/crypto/pem/pem_xaux.c $(OPENSSL_PATH)/crypto/pem/pvkfmt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_add.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_asn.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_attr.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_crpt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_crt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_decr.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_init.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_key.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_kiss.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_mutl.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_npas.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_p8d.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_p8e.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_sbag.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_utl.c + $(OPENSSL_PATH)/crypto/pkcs12/pk12err.c $(OPENSSL_PATH)/crypto/pkcs7/bio_pk7.c $(OPENSSL_PATH)/crypto/pkcs7/pk7_asn1.c $(OPENSSL_PATH)/crypto/pkcs7/pk7_attr.c @@ -706,7 +722,6 @@ OpensslStub/EncoderNull.c OpensslStub/SslStatServNull.c OpensslStub/SslExtServNull.c - OpensslStub/Pkcs12Null.c [Packages] MdePkg/MdePkg.dec diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf index 98ff3e8a61fa..7243587067c8 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf @@ -47,7 +47,6 @@ OpensslStub/EncoderNull.c OpensslStub/SslStatServNull.c OpensslStub/SslExtServNull.c - OpensslStub/Pkcs12Null.c [Sources.IA32] # Autogenerated files list starts here @@ -411,6 +410,22 @@ $(OPENSSL_PATH)/crypto/pem/pem_x509.c $(OPENSSL_PATH)/crypto/pem/pem_xaux.c $(OPENSSL_PATH)/crypto/pem/pvkfmt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_add.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_asn.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_attr.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_crpt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_crt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_decr.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_init.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_key.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_kiss.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_mutl.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_npas.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_p8d.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_p8e.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_sbag.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_utl.c + $(OPENSSL_PATH)/crypto/pkcs12/pk12err.c $(OPENSSL_PATH)/crypto/pkcs7/bio_pk7.c $(OPENSSL_PATH)/crypto/pkcs7/pk7_asn1.c $(OPENSSL_PATH)/crypto/pkcs7/pk7_attr.c @@ -1100,6 +1115,22 @@ $(OPENSSL_PATH)/crypto/pem/pem_x509.c $(OPENSSL_PATH)/crypto/pem/pem_xaux.c $(OPENSSL_PATH)/crypto/pem/pvkfmt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_add.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_asn.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_attr.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_crpt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_crt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_decr.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_init.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_key.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_kiss.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_mutl.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_npas.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_p8d.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_p8e.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_sbag.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_utl.c + $(OPENSSL_PATH)/crypto/pkcs12/pk12err.c $(OPENSSL_PATH)/crypto/pkcs7/bio_pk7.c $(OPENSSL_PATH)/crypto/pkcs7/pk7_asn1.c $(OPENSSL_PATH)/crypto/pkcs7/pk7_attr.c @@ -1809,6 +1840,22 @@ $(OPENSSL_PATH)/crypto/pem/pem_x509.c $(OPENSSL_PATH)/crypto/pem/pem_xaux.c $(OPENSSL_PATH)/crypto/pem/pvkfmt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_add.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_asn.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_attr.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_crpt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_crt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_decr.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_init.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_key.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_kiss.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_mutl.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_npas.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_p8d.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_p8e.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_sbag.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_utl.c + $(OPENSSL_PATH)/crypto/pkcs12/pk12err.c $(OPENSSL_PATH)/crypto/pkcs7/bio_pk7.c $(OPENSSL_PATH)/crypto/pkcs7/pk7_asn1.c $(OPENSSL_PATH)/crypto/pkcs7/pk7_attr.c diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf index 8c001b5e6d04..4302ca9af14c 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf @@ -392,6 +392,22 @@ $(OPENSSL_PATH)/crypto/pem/pem_x509.c $(OPENSSL_PATH)/crypto/pem/pem_xaux.c $(OPENSSL_PATH)/crypto/pem/pvkfmt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_add.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_asn.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_attr.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_crpt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_crt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_decr.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_init.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_key.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_kiss.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_mutl.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_npas.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_p8d.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_p8e.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_sbag.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_utl.c + $(OPENSSL_PATH)/crypto/pkcs12/pk12err.c $(OPENSSL_PATH)/crypto/pkcs7/bio_pk7.c $(OPENSSL_PATH)/crypto/pkcs7/pk7_asn1.c $(OPENSSL_PATH)/crypto/pkcs7/pk7_attr.c @@ -656,7 +672,6 @@ OpensslStub/EcSm2Null.c OpensslStub/uefiprov.c OpensslStub/EncoderNull.c - OpensslStub/Pkcs12Null.c [Packages] MdePkg/MdePkg.dec diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf index 6a2d332defa5..b97bb9d3528d 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf @@ -434,6 +434,22 @@ $(OPENSSL_PATH)/crypto/pem/pem_x509.c $(OPENSSL_PATH)/crypto/pem/pem_xaux.c $(OPENSSL_PATH)/crypto/pem/pvkfmt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_add.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_asn.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_attr.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_crpt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_crt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_decr.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_init.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_key.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_kiss.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_mutl.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_npas.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_p8d.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_p8e.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_sbag.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_utl.c + $(OPENSSL_PATH)/crypto/pkcs12/pk12err.c $(OPENSSL_PATH)/crypto/pkcs7/bio_pk7.c $(OPENSSL_PATH)/crypto/pkcs7/pk7_asn1.c $(OPENSSL_PATH)/crypto/pkcs7/pk7_attr.c @@ -763,7 +779,6 @@ OpensslStub/EncoderNull.c OpensslStub/SslStatServNull.c OpensslStub/SslExtServNull.c - OpensslStub/Pkcs12Null.c [Packages] MdePkg/MdePkg.dec diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf index b61abdd811ce..4254882c4508 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf @@ -52,7 +52,6 @@ OpensslStub/EncoderNull.c OpensslStub/SslStatServNull.c OpensslStub/SslExtServNull.c - OpensslStub/Pkcs12Null.c [Sources.IA32] # Autogenerated files list starts here @@ -454,6 +453,22 @@ $(OPENSSL_PATH)/crypto/pem/pem_x509.c $(OPENSSL_PATH)/crypto/pem/pem_xaux.c $(OPENSSL_PATH)/crypto/pem/pvkfmt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_add.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_asn.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_attr.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_crpt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_crt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_decr.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_init.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_key.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_kiss.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_mutl.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_npas.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_p8d.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_p8e.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_sbag.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_utl.c + $(OPENSSL_PATH)/crypto/pkcs12/pk12err.c $(OPENSSL_PATH)/crypto/pkcs7/bio_pk7.c $(OPENSSL_PATH)/crypto/pkcs7/pk7_asn1.c $(OPENSSL_PATH)/crypto/pkcs7/pk7_attr.c @@ -1195,6 +1210,22 @@ $(OPENSSL_PATH)/crypto/pem/pem_x509.c $(OPENSSL_PATH)/crypto/pem/pem_xaux.c $(OPENSSL_PATH)/crypto/pem/pvkfmt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_add.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_asn.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_attr.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_crpt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_crt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_decr.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_init.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_key.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_kiss.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_mutl.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_npas.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_p8d.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_p8e.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_sbag.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_utl.c + $(OPENSSL_PATH)/crypto/pkcs12/pk12err.c $(OPENSSL_PATH)/crypto/pkcs7/bio_pk7.c $(OPENSSL_PATH)/crypto/pkcs7/pk7_asn1.c $(OPENSSL_PATH)/crypto/pkcs7/pk7_attr.c @@ -1956,6 +1987,22 @@ $(OPENSSL_PATH)/crypto/pem/pem_x509.c $(OPENSSL_PATH)/crypto/pem/pem_xaux.c $(OPENSSL_PATH)/crypto/pem/pvkfmt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_add.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_asn.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_attr.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_crpt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_crt.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_decr.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_init.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_key.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_kiss.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_mutl.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_npas.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_p8d.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_p8e.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_sbag.c + $(OPENSSL_PATH)/crypto/pkcs12/p12_utl.c + $(OPENSSL_PATH)/crypto/pkcs12/pk12err.c $(OPENSSL_PATH)/crypto/pkcs7/bio_pk7.c $(OPENSSL_PATH)/crypto/pkcs7/pk7_asn1.c $(OPENSSL_PATH)/crypto/pkcs7/pk7_attr.c diff --git a/CryptoPkg/Library/OpensslLib/configure.py b/CryptoPkg/Library/OpensslLib/configure.py index beb6f3ed61b6..5d0a6d8b409b 100755 --- a/CryptoPkg/Library/OpensslLib/configure.py +++ b/CryptoPkg/Library/OpensslLib/configure.py @@ -258,7 +258,6 @@ def sources_filter_fn(filename): '/store/', '/storemgmt/', '/encode_decode/encode', - '/pkcs12/', 'statem_srvr.c', 'extensions_srvr.c', 'defltprov.c', From f832329addcb199bb4bee6cb6813dca1ebc3802d Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 19 Sep 2025 13:32:18 -0700 Subject: [PATCH 0558/1172] UnitTestFrameworkPkg: Set defines for CLANGPDB builds Set same defines for CLANGPDB tool chain family as all tool chain other families. Signed-off-by: Michael D Kinney --- UnitTestFrameworkPkg/UnitTestFrameworkPkgCommon.dsc.inc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/UnitTestFrameworkPkg/UnitTestFrameworkPkgCommon.dsc.inc b/UnitTestFrameworkPkg/UnitTestFrameworkPkgCommon.dsc.inc index 2c12effed8f6..28863ed3b3ad 100644 --- a/UnitTestFrameworkPkg/UnitTestFrameworkPkgCommon.dsc.inc +++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkgCommon.dsc.inc @@ -18,6 +18,7 @@ gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x1F [BuildOptions] - MSFT:*_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES -D EDKII_UNIT_TEST_FRAMEWORK_ENABLED - GCC:*_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES -D EDKII_UNIT_TEST_FRAMEWORK_ENABLED - XCODE:*_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES -D EDKII_UNIT_TEST_FRAMEWORK_ENABLED + MSFT:*_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES -D EDKII_UNIT_TEST_FRAMEWORK_ENABLED + GCC:*_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES -D EDKII_UNIT_TEST_FRAMEWORK_ENABLED + CLANGPDB:*_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES -D EDKII_UNIT_TEST_FRAMEWORK_ENABLED + XCODE:*_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES -D EDKII_UNIT_TEST_FRAMEWORK_ENABLED From 9731114a00e8360d5b116630c133590108640039 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 19 Sep 2025 13:45:20 -0700 Subject: [PATCH 0559/1172] UnitTestFrameworkPkg: Add CLANGDWARF and CLANGPDB support Update host-based unit test [BuildOptions] to support CLANGDWARF and CLANGPDB. * Use CLANG specific code coverage options * Map CLANG trap function to abort() to resolve link issues when building Google Test based unit tests. The default mapping from tools_def.txt is to an unresolved function to generate a build failure. Mapping to abort() overrides the default mapping. If a unit test introduces undefined behavior in a code path that is executed, then abort() is called and the unit test application exits with an error and fails the unit test. * Update GCC to pass --coverage in link command so the linker automatically includes -lgcov. The explicit linking of -lgcov is removed. * Add /EHs to all MSFT components instead of only components of type HOST_APPLICATION. * Add CXX_FLAGS for all tool chain families. Use c++ 20 for MSFT and GCC and c++ 17 for clang. Clang generates errors compiling Google Test with c++ 20. * Add -z noexecstack to all GCC builds to reduce warnings. * Add UNIT_TESTING_CODE_COVERAGE_ENABLE that is enabled by default. Can be used to temporarily disable code coverage when debugging interactions between unit testing features. Signed-off-by: Michael D Kinney --- .../UnitTestFrameworkPkgHost.dsc.inc | 91 +++++++++++++++---- 1 file changed, 71 insertions(+), 20 deletions(-) diff --git a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc index 0f6851636290..f48998757ccd 100644 --- a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc +++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc @@ -9,6 +9,7 @@ !include UnitTestFrameworkPkg/UnitTestFrameworkPkgCommon.dsc.inc [Defines] + UNIT_TESTING_CODE_COVERAGE_ENABLE = TRUE UNIT_TESTING_ADDRESS_SANITIZER_ENABLE = TRUE [LibraryClasses.common.HOST_APPLICATION] @@ -30,30 +31,62 @@ NULL|MdePkg/Library/StackCheckLibNull/StackCheckLibNullHostApplication.inf [BuildOptions] - MSFT:*_*_*_CC_FLAGS = /MTd - GCC:*_*_*_CC_FLAGS = -fno-pie - GCC:*_*_*_ASLCC_FLAGS = -fpie + MSFT:*_*_*_CC_FLAGS = /MTd /EHs + GCC:*_*_*_CC_FLAGS = -fno-pie + CLANGPDB:*_*_*_CC_FLAGS = -fno-pie + GCC:*_*_*_ASLCC_FLAGS = -fpie !if $(UNIT_TESTING_ADDRESS_SANITIZER_ENABLE) # # Enable Address Sanitizer for VS2019, VS2022, and GCC # MSFT:*_VS2019_*_CC_FLAGS = /fsanitize=address MSFT:*_VS2022_*_CC_FLAGS = /fsanitize=address - GCC:*_*_*_CC_FLAGS = -fsanitize=address + GCC:*_*_*_CC_FLAGS = -fsanitize=address + CLANGPDB:*_*_*_CC_FLAGS = -fsanitize=address !endif !ifdef $(UNIT_TESTING_DEBUG) - MSFT:*_*_*_CC_FLAGS = -D UNIT_TESTING_DEBUG=1 - GCC:*_*_*_CC_FLAGS = -D UNIT_TESTING_DEBUG=1 - XCODE:*_*_*_CC_FLAGS = -D UNIT_TESTING_DEBUG=1 + MSFT:*_*_*_CC_FLAGS = -D UNIT_TESTING_DEBUG=1 + GCC:*_*_*_CC_FLAGS = -D UNIT_TESTING_DEBUG=1 + CLANGPDB:*_*_*_CC_FLAGS = -D UNIT_TESTING_DEBUG=1 + XCODE:*_*_*_CC_FLAGS = -D UNIT_TESTING_DEBUG=1 !endif - GCC:*_*_*_CC_FLAGS = -fexceptions - GCC:*_*_*_CC_FLAGS = --coverage - GCC:*_*_*_DLINK_FLAGS = --coverage + GCC:*_*_*_CC_FLAGS = -fexceptions + CLANGPDB:*_*_*_CC_FLAGS = -fexceptions + +!if $(UNIT_TESTING_CODE_COVERAGE_ENABLE) + # + # Enable code coverage compiler options + # + GCC:*_GCC_*_CC_FLAGS = --coverage + GCC:*_GCC5_*_CC_FLAGS = --coverage + GCC:*_GCCNOLTO_*_CC_FLAGS = --coverage + GCC:*_CLANGDWARF_*_CC_FLAGS = -fprofile-instr-generate -fcoverage-mapping + CLANGPDB:*_*_*_CC_FLAGS = -fprofile-instr-generate -fcoverage-mapping +!endif + + # + # Set C++ language standard version + # + MSFT:*_*_*_CXX_FLAGS = /std:c++20 /Zc:strictStrings- /wd4244 + GCC:*_*_*_CXX_FLAGS = -std=c++20 + GCC:*_CLANGDWARF_*_CXX_FLAGS = -std=c++17 + CLANGPDB:*_*_*_CXX_FLAGS = -std=c++17 + # + # CLANGDWARF and CLANGPDB: Some gtest c++ sources generate undefined + # behavior that is never triggered. Map trap functions to abort() to + # complete link and catch real undefined behavior issues. + # + GCC:*_CLANGDWARF_*_CXX_FLAGS = -ftrap-function=abort + CLANGPDB:*_*_*_CXX_FLAGS = -ftrap-function=abort + # + # CLANGPDB: Disable warning for microsoft-cast in gtest c++ sources + # + CLANGPDB:*_*_*_CXX_FLAGS = -Wno-microsoft-cast -Wno-write-strings + [BuildOptions.common.EDKII.HOST_APPLICATION] # - # MSFT + # Set MSFT HOST_APPLICATION options # - MSFT:*_*_*_CC_FLAGS = /EHs MSFT:*_*_*_DLINK_FLAGS == /nologo /SUBSYSTEM:CONSOLE /DEBUG /out:"$(BIN_DIR)\$(MODULE_NAME_GUID).exe" /pdb:"$(BIN_DIR)\$(MODULE_NAME_GUID).pdb" /WHOLEARCHIVE MSFT:*_VS2015_IA32_DLINK_FLAGS = /LIBPATH:"%VS2015_PREFIX%Lib" /LIBPATH:"%VS2015_PREFIX%VC\Lib" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x86" @@ -69,22 +102,40 @@ MSFT:*_VS2022_X64_DLINK_FLAGS = /LIBPATH:"%VCToolsInstallDir%lib\x64" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x64" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x64" # - # GCC + # Set GCC HOST_APPLICATION options # - GCC:*_*_*_CC_FLAGS = -Wno-write-strings - GCC:*_*_IA32_DLINK_FLAGS == -o $(BIN_DIR)/$(MODULE_NAME_GUID) -m32 -no-pie - GCC:*_*_X64_DLINK_FLAGS == -o $(BIN_DIR)/$(MODULE_NAME_GUID) -m64 -no-pie + GCC:*_*_*_CC_FLAGS = -Wno-write-strings + GCC:*_*_IA32_DLINK_FLAGS == -o $(BIN_DIR)/$(MODULE_NAME_GUID) -z noexecstack -m32 -no-pie + GCC:*_*_X64_DLINK_FLAGS == -o $(BIN_DIR)/$(MODULE_NAME_GUID) -z noexecstack -m64 -no-pie +!if $(UNIT_TESTING_ADDRESS_SANITIZER_ENABLE) + # + # Enable Address Sanitizer linker options + # + GCC:*_*_*_DLINK_FLAGS = -fsanitize=address +!endif +!if $(UNIT_TESTING_CODE_COVERAGE_ENABLE) + # + # Enable code coverage linker options + # + GCC:*_GCC_*_DLINK_FLAGS = --coverage + GCC:*_GCC5_*_DLINK_FLAGS = --coverage + GCC:*_GCCNOLTO_*_DLINK_FLAGS = --coverage + GCC:*_CLANGDWARF_*_DLINK_FLAGS = -fprofile-instr-generate -fcoverage-mapping +!endif # # Surround our static libraries with whole-archive, so constructor-based test registration works properly. # Note that we need to --no-whole-archive before linking system libraries. # GCC:*_*_*_DLINK_FLAGS = -Wl,--whole-archive - GCC:*_*_*_DLINK2_FLAGS == -Wl,--no-whole-archive -lgcov -lpthread -lstdc++ -lm -!if $(UNIT_TESTING_ADDRESS_SANITIZER_ENABLE) + GCC:*_*_*_DLINK2_FLAGS == -Wl,--no-whole-archive -lpthread -lstdc++ -lm + # - # Enable Address Sanitizer for GCC for HOST_APPLICATION + # Set CLANGPDB HOST_APPLICATION options # - GCC:*_*_*_DLINK_FLAGS = -fsanitize=address + CLANGPDB:*_*_*_DLINK_FLAGS == /nologo /SUBSYSTEM:CONSOLE /DEBUG /out:"$(BIN_DIR)\$(MODULE_NAME_GUID).exe" /pdb:"$(BIN_DIR)\$(MODULE_NAME_GUID).pdb" /WHOLEARCHIVE + CLANGPDB:*_*_X64_DLINK_FLAGS = /LIBPATH:"%VCToolsInstallDir%lib\x64" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x64" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x64" +!if $(UNIT_TESTING_ADDRESS_SANITIZER_ENABLE) + CLANGPDB:*_*_X64_DLINK_FLAGS = clang_rt.profile-x86_64.lib clang_rt.asan_dynamic-x86_64.lib clang_rt.asan_dynamic_runtime_thunk-x86_64.lib !endif # From 81a7efddd508e78b867d7efa1333564a8a32725f Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 19 Sep 2025 14:03:23 -0700 Subject: [PATCH 0560/1172] UnitTestFrameworkPkg/Include: Update GoogleTestLib for CLANG Update GoogleTestLib.h to support Windows/CLANGPDB build. When using Windows/CLANGPDB, _MSC_VER is not defined. If it is not defined, then set to 1900 for Visual Studio 2015 or newer compatibility when using windows include files for host based unit test application builds. If _MSC_VER is not set, then those application fail to build. Also address a Windows/CLANG issue when ASAN is enabled by providing an alternate implementation of the EXPECT_THROW_MESSAGE() and ASSERT_THROW_MESSAGE() macros. Without this alternate implementation, an exception is generated due to the description of the ASSERT() condition being NULL. Update all implementations of EXPECT_THROW_MESSAGE() and ASSERT_THROW_MESSAGE() to support parameters to the statement executed to return values. Signed-off-by: Michael D Kinney --- .../Include/Library/GoogleTestLib.h | 52 ++++++++++++++++++- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/UnitTestFrameworkPkg/Include/Library/GoogleTestLib.h b/UnitTestFrameworkPkg/Include/Library/GoogleTestLib.h index 951bbb81020f..a3a8cf1cb811 100644 --- a/UnitTestFrameworkPkg/Include/Library/GoogleTestLib.h +++ b/UnitTestFrameworkPkg/Include/Library/GoogleTestLib.h @@ -9,9 +9,20 @@ #ifndef GOOGLE_TEST_LIB_H_ #define GOOGLE_TEST_LIB_H_ +// +// For Windows/clang builds if _MSC_VER is not defined, then set to +// Visual Studio 2015 value of 1900 +// +#if defined (__clang__) && defined (_WIN32) + #ifndef _MSC_VER +#define _MSC_VER 1900 + #endif +#endif + #include #include #include +#include // // For all use of GoogleTestLib, make sure NULL is defined to nullptr to @@ -31,16 +42,53 @@ using ::testing::HasSubstr; // in the exception message. Typically used to check that the expression // that generates an ASSERT() matches the expected expression. // +// NOTE: Windows/CLANG builds with ASAN enabled generate an exception +// due to the generated exception string being NULL. An alternate implementation +// of these macros is provided for Windows/CLANG builds that disables ASAN +// checks in a function that uses try/catch for the expected exception type +// and provides the correct exception string for comparison. +// +#if defined (__clang__) && defined (_WIN32) +#define EXPECT_THROW_MESSAGE(statement, description) \ + [&]() __attribute__((no_sanitize_address)){ \ + try { \ + (statement); \ + FAIL() << "Exception not thrown"; \ + } catch (const std::runtime_error& ex) { \ + EXPECT_THAT ( \ + std::string(ex.what()), \ + HasSubstr(description) \ + ); \ + } catch(...) { \ + FAIL() << "Unexpected exception"; \ + } \ + }() +#define ASSERT_THROW_MESSAGE(statement, description) \ + [&]() __attribute__((no_sanitize_address)){ \ + try { \ + (statement); \ + FAIL() << "Exception not thrown"; \ + } catch (const std::runtime_error& ex) { \ + ASSERT_THAT ( \ + std::string(ex.what()), \ + HasSubstr(description) \ + ); \ + } catch(...) { \ + FAIL() << "Unexpected exception"; \ + } \ + }() +#else #define EXPECT_THROW_MESSAGE(statement, description) \ EXPECT_THAT ( \ - []() { statement; }, \ + [&]() { statement; }, \ ThrowsMessage(HasSubstr (description)) \ ) #define ASSERT_THROW_MESSAGE(statement, description) \ ASSERT_THAT ( \ - []() { statement; }, \ + [&]() { statement; }, \ ThrowsMessage(HasSubstr (description)) \ ) +#endif extern "C" { #include From 6e65f7df90434c03371790be180becb10e1c30c7 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 19 Sep 2025 13:55:19 -0700 Subject: [PATCH 0561/1172] UnitTestFrameworkPkg/CmockaLib: Add CLANGPDB support Add CLANGPDB family defines to match MSFT family defines. Also add -Wno-deprecated-declarations to CLANGPDB family to ignore warnings detected when building cmocka sources with clang compiler. Signed-off-by: Michael D Kinney --- UnitTestFrameworkPkg/Library/CmockaLib/CmockaLib.inf | 1 + 1 file changed, 1 insertion(+) diff --git a/UnitTestFrameworkPkg/Library/CmockaLib/CmockaLib.inf b/UnitTestFrameworkPkg/Library/CmockaLib/CmockaLib.inf index eeee6bc2b3f5..e0c55e024bb5 100644 --- a/UnitTestFrameworkPkg/Library/CmockaLib/CmockaLib.inf +++ b/UnitTestFrameworkPkg/Library/CmockaLib/CmockaLib.inf @@ -33,3 +33,4 @@ GCC:NOOPT_*_*_CC_FLAGS = -O0 GCC:*_*_IA32_CC_FLAGS = -m32 GCC:*_*_X64_CC_FLAGS = -m64 + GCC:*_CLANGPDB_*_CC_FLAGS = -DHAVE_VSNPRINTF -DHAVE_SNPRINTF -Wno-deprecated-declarations From 0838bf1531b5b6bf1ac8b2bf71c8fe4ce4375141 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 19 Sep 2025 13:52:11 -0700 Subject: [PATCH 0562/1172] UnitTestFrameworkPkg/SubhookLib: Update GCC defines Add -DSUBHOOK_STATIC to all GCC family builds to match defines in MSFT family builds. Also remove /EHsc from MSFT CC_FLAGS. /EHs is added to CC_FLAGS in UnitTestFrameworkPkgHost.dsc.inc for all components. Signed-off-by: Michael D Kinney --- UnitTestFrameworkPkg/Library/SubhookLib/SubhookLib.inf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/UnitTestFrameworkPkg/Library/SubhookLib/SubhookLib.inf b/UnitTestFrameworkPkg/Library/SubhookLib/SubhookLib.inf index a67be890d8cd..376a12354dca 100644 --- a/UnitTestFrameworkPkg/Library/SubhookLib/SubhookLib.inf +++ b/UnitTestFrameworkPkg/Library/SubhookLib/SubhookLib.inf @@ -26,6 +26,6 @@ UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec [BuildOptions] - MSFT:*_*_*_CC_FLAGS == /c /EHsc /Zi /DSUBHOOK_STATIC /Od - GCC:*_*_IA32_CC_FLAGS == -g -c -O0 -m32 - GCC:*_*_X64_CC_FLAGS == -g -c -O0 -m64 + MSFT:*_*_*_CC_FLAGS == /c /Zi /DSUBHOOK_STATIC /Od + GCC:*_*_IA32_CC_FLAGS == -g -c -O0 -m32 -DSUBHOOK_STATIC + GCC:*_*_X64_CC_FLAGS == -g -c -O0 -m64 -DSUBHOOK_STATIC From 07da104cfbe410e5f59791ab9a71fd22241c483c Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 19 Sep 2025 13:56:34 -0700 Subject: [PATCH 0563/1172] UnitTestFrameworkPkg/GoogleTestLib: Remove extra options Update MSFT CC_FLAGS options to remove /EHs and /MTd that are added by UnitTestFrameworkPkgHost.dsc.inc for all components. Signed-off-by: Michael D Kinney --- UnitTestFrameworkPkg/Library/GoogleTestLib/GoogleTestLib.inf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitTestFrameworkPkg/Library/GoogleTestLib/GoogleTestLib.inf b/UnitTestFrameworkPkg/Library/GoogleTestLib/GoogleTestLib.inf index 7835a333ea27..428099685271 100644 --- a/UnitTestFrameworkPkg/Library/GoogleTestLib/GoogleTestLib.inf +++ b/UnitTestFrameworkPkg/Library/GoogleTestLib/GoogleTestLib.inf @@ -28,6 +28,6 @@ UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec [BuildOptions] - MSFT:*_*_*_CC_FLAGS == /c /EHs /Zi /Od /MTd + MSFT:*_*_*_CC_FLAGS == /c /Zi /Od GCC:*_*_IA32_CC_FLAGS == -g -c -fshort-wchar -fexceptions -O0 -m32 -malign-double -fno-pie GCC:*_*_X64_CC_FLAGS == -g -c -fshort-wchar -fexceptions -O0 -m64 -fno-pie "-DEFIAPI=__attribute__((ms_abi))" From 55a5ec63fe20152c237039c54e2957720828cf10 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 19 Sep 2025 13:48:55 -0700 Subject: [PATCH 0564/1172] UnitTestFrameworkPkg/UnitTestDebugAddressLib: Remove extra options Remove /EHsc from CC_FLAGS. /EHs is added to CC_FLAGS in UnitTestFrameworkPkgHost.dsc.inc for all components. Signed-off-by: Michael D Kinney --- .../UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.inf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.inf b/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.inf index 96322d7e2fa9..5fa90f521abe 100644 --- a/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.inf +++ b/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.inf @@ -27,6 +27,6 @@ UnitTestLib [BuildOptions] - MSFT:*_*_*_CC_FLAGS == /c /EHs /Zi /Od /MTd + MSFT:*_*_*_CC_FLAGS == /c /Zi /Od GCC:*_*_IA32_CC_FLAGS == -g -c -fshort-wchar -fexceptions -O0 -m32 -malign-double -fno-pie GCC:*_*_X64_CC_FLAGS == -g -c -fshort-wchar -fexceptions -O0 -m64 -fno-pie "-DEFIAPI=__attribute__((ms_abi))" From 3c454cf7d43c59f7ff0000ca6ac333e8f359673e Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 21 Aug 2025 20:16:47 -0700 Subject: [PATCH 0565/1172] BaseTools/Plugin/HostBasedUnitTestRunner: Add CLANG support Update HostBasedUnitTestRunner to generate merged Cobertura coverage.xml output file using CLANG code coverage data from -fprofile-instr-generate -fcoverage-mapping options. Signed-off-by: Michael D Kinney --- .../HostBasedUnitTestRunner.py | 143 +++++++++++++++++- 1 file changed, 141 insertions(+), 2 deletions(-) diff --git a/BaseTools/Plugin/HostBasedUnitTestRunner/HostBasedUnitTestRunner.py b/BaseTools/Plugin/HostBasedUnitTestRunner/HostBasedUnitTestRunner.py index 91425f1ddf17..54db93fcddac 100644 --- a/BaseTools/Plugin/HostBasedUnitTestRunner/HostBasedUnitTestRunner.py +++ b/BaseTools/Plugin/HostBasedUnitTestRunner/HostBasedUnitTestRunner.py @@ -61,6 +61,10 @@ def do_post_build(self, thebuilder): # Set up the reporting type for Cmocka. shell_env.set_shell_var('CMOCKA_MESSAGE_OUTPUT', 'xml') + # Configure LLVM code coverage collection to generate unique file for + # each host based unit test executable. + shell_env.set_shell_var('LLVM_PROFILE_FILE', '%m.profraw') + for arch in thebuilder.env.GetValue("TARGET_ARCH").split(): logging.log(edk2_logging.get_subsection_level(), "Testing for architecture: " + arch) @@ -138,16 +142,20 @@ def do_post_build(self, thebuilder): failure_count += 1 if thebuilder.env.GetValue("CODE_COVERAGE") != "FALSE": - if thebuilder.env.GetValue("TOOL_CHAIN_TAG") == "GCC5": + if thebuilder.env.GetValue("TOOL_CHAIN_TAG").startswith("GCC"): ret = self.gen_code_coverage_gcc(thebuilder) if ret != 0: failure_count += 1 + elif thebuilder.env.GetValue("TOOL_CHAIN_TAG").startswith("CLANG"): + ret = self.gen_code_coverage_clang(thebuilder) + if ret != 0: + failure_count += 1 elif thebuilder.env.GetValue("TOOL_CHAIN_TAG").startswith ("VS"): ret = self.gen_code_coverage_msvc(thebuilder) if ret != 0: failure_count += 1 else: - logging.info("Skipping code coverage. Currently, support GCC and MSVC compiler.") + logging.info("Skipping code coverage. Currently, support GCC, CLANG, and MSVC compiler.") return failure_count @@ -224,6 +232,137 @@ def gen_code_coverage_gcc(self, thebuilder): return 0 + def gen_code_coverage_clang(self, thebuilder): + logging.info("Generating UnitTest code coverage") + + buildOutputBase = thebuilder.env.GetValue("BUILD_OUTPUT_BASE") + if GetHostInfo().os.upper() == "LINUX": + # Collect test executables with no file extension + testList = glob.glob(os.path.join(buildOutputBase, "**", "*Test*"), recursive=True) + testList = [f for f in testList if os.path.isfile(f) and os.path.splitext(f)[1] == ""] + elif GetHostInfo().os.upper() == "WINDOWS": + # Collect test executables with a .exe file extension + testList = glob.glob(os.path.join(buildOutputBase, "**","*Test*.exe"), recursive=True) + else: + raise NotImplementedError("Unsupported Operating System") + if not testList: + logging.warning("UnitTest Coverage: No test binaries found.") + return 0 + + profrawlistFile = os.path.join(buildOutputBase, 'profrawlist.txt') + mergedProfData = os.path.join(buildOutputBase, 'merged.profdata') + mergedCoverageXml = os.path.join(buildOutputBase, 'coverage.xml') + + with open(profrawlistFile, "w") as f: + f.write("\n".join(glob.glob(os.path.join(buildOutputBase, "**", "*.profraw"), recursive=True))) + # Generate coverage file + ret = RunCmd("llvm-profdata", f"merge -sparse --input-files {profrawlistFile} --output {mergedProfData}") + if ret != 0: + logging.error("UnitTest Coverage: Failed to merge coverage data.") + return 1 + # Generate and LCOV and XML file for each unit test executable + for testFile in testList: + lcovFile = f"{testFile}.lcov" + ret = RunCmd("llvm-cov", f"export -format=lcov --instr-profile={mergedProfData} {testFile} > {lcovFile} ") + if ret != 0: + logging.error("UnitTest Coverage: Failed to generate coverage data for " + testFile) + return 1 + coveragexmlFile = f"{testFile}.coverage.xml" + ret = RunCmd("lcov_cobertura",f"{lcovFile} -o {coveragexmlFile}") + if ret != 0: + logging.error("UnitTest Coverage: Failed generate filtered coverage XML.") + return 1 + # Merge all XML files + ret = self.merge_cobertura_xml_files([f"{testFile}.coverage.xml" for testFile in testList], mergedCoverageXml) + if ret != 0: + logging.error("UnitTest Coverage: Failed to merge coverage XML files.") + return 1 + return 0 + + def merge_cobertura_xml_files(self, xml_file_list, output_file): + """ + Merge multiple Cobertura XML files into a single output file. + + Args: + xml_file_list (list): List of Cobertura XML file paths to merge. + output_file (str): Path to the merged output XML file. + """ + if not xml_file_list: + logging.warning("No Cobertura XML files provided for merging.") + return 1 + + try: + # Parse the first file as the base + base_tree = xml.etree.ElementTree.parse(xml_file_list[0]) + base_root = base_tree.getroot() + base_packages = base_root.find("packages") + if base_packages is None: + base_packages = xml.etree.ElementTree.SubElement(base_root, "packages") + + # Merge the rest + for xml_file in xml_file_list[1:]: + tree = xml.etree.ElementTree.parse(xml_file) + root = tree.getroot() + packages = root.find("packages") + if packages is not None: + for package in packages.findall("package"): + base_packages.append(package) + + # Recalculate line-rate and branch-rate for the merged XML + lines_covered = 0 + lines_valid = 0 + branches_covered = 0 + branches_valid = 0 + + def parse_condition_coverage(cond_cov: str) -> int: + """ + Parse a condition-coverage string like '50% (1/2)'. + Returns the number of covered branches. + """ + try: + inside_parens = cond_cov.split("(", 1)[1].split(")", 1)[0] + covered, total = map(int, inside_parens.split("/")) + return covered + except Exception: + return 0 + + for package in base_packages.findall("package"): + for packageclass in package.findall("classes/class"): + lines = packageclass.find("lines") + if lines is None: + continue + for line in lines.findall("line"): + lines_valid += 1 + # line coverage + if "hits" in line.attrib and int(line.attrib["hits"]) > 0: + lines_covered += 1 + # branch coverage + if "branch" in line.attrib and line.attrib["branch"] == "true": + branches_valid += 1 + if "condition-coverage" in line.attrib: + # Example: "50% (1/2)" + branches_covered += parse_condition_coverage( + line.attrib["condition-coverage"] + ) + + def safe_rate(covered, valid): + return float(covered) / float(valid) if valid else 0.0 + + base_root.set("lines-covered", str(lines_covered)) + base_root.set("lines-valid", str(lines_valid)) + base_root.set("line-rate", str(safe_rate(lines_covered, lines_valid))) + base_root.set("branches-covered", str(branches_covered)) + base_root.set("branches-valid", str(branches_valid)) + base_root.set("branch-rate", str(safe_rate(branches_covered, branches_valid))) + + # Write merged XML + base_tree.write(output_file, encoding="utf-8", xml_declaration=True) + logging.info(f"Merged Cobertura XML written to {output_file}") + return 0 + except Exception as e: + logging.error(f"Failed to merge Cobertura XML files: {e}") + return 1 + def gen_code_coverage_msvc(self, thebuilder): logging.info("Generating UnitTest code coverage") From 7b971810b0ef964276eff4541784ea2f520e66a9 Mon Sep 17 00:00:00 2001 From: Yang Gang Date: Fri, 4 Jul 2025 17:32:46 +0800 Subject: [PATCH 0566/1172] MdeModulePkg: Update to support mouse z-axis in ConSplitterDxe If `AbsoluteMaxZ`/`ResolutionZ` is 0, it means z-axis is not supported. When getting AbsolutePointer/SimplePointer Protocol Interface and mouse state from `gST->ConsoleInHandle`, `AbsoluteMaxZ`/`ResolutionZ` is checked, so AbsState.CurrentZ/SimpleState.RelativeMovementZ is always 0. Assign a valid value to `AbsoluteMaxZ`/`ResolutionZ` to indicate z-axis support. Signed-off-by: Yang Gang --- .../Usb/UsbMouseAbsolutePointerDxe/UsbMouseAbsolutePointer.c | 2 +- MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouse.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Bus/Usb/UsbMouseAbsolutePointerDxe/UsbMouseAbsolutePointer.c b/MdeModulePkg/Bus/Usb/UsbMouseAbsolutePointerDxe/UsbMouseAbsolutePointer.c index c75ce8a172d4..9d0186013386 100644 --- a/MdeModulePkg/Bus/Usb/UsbMouseAbsolutePointerDxe/UsbMouseAbsolutePointer.c +++ b/MdeModulePkg/Bus/Usb/UsbMouseAbsolutePointerDxe/UsbMouseAbsolutePointer.c @@ -671,7 +671,7 @@ InitializeUsbMouseDevice ( UsbMouseAbsolutePointerDev->Mode.AbsoluteMaxX = 1024; UsbMouseAbsolutePointerDev->Mode.AbsoluteMaxY = 1024; - UsbMouseAbsolutePointerDev->Mode.AbsoluteMaxZ = 0; + UsbMouseAbsolutePointerDev->Mode.AbsoluteMaxZ = 1024; UsbMouseAbsolutePointerDev->Mode.AbsoluteMinX = 0; UsbMouseAbsolutePointerDev->Mode.AbsoluteMinY = 0; UsbMouseAbsolutePointerDev->Mode.AbsoluteMinZ = 0; diff --git a/MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouse.c b/MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouse.c index 13c5b2234ddf..e85eb4a6e6ca 100644 --- a/MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouse.c +++ b/MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouse.c @@ -675,7 +675,7 @@ InitializeUsbMouseDevice ( UsbMouseDev->Mode.ResolutionX = 8; UsbMouseDev->Mode.ResolutionY = 8; - UsbMouseDev->Mode.ResolutionZ = 0; + UsbMouseDev->Mode.ResolutionZ = 8; // // Set boot protocol for the USB mouse. From 2a6708a786eb0f0e9b979cd93c5dc12c42e337a1 Mon Sep 17 00:00:00 2001 From: Damien-Chen Date: Fri, 26 Sep 2025 18:27:33 +0800 Subject: [PATCH 0567/1172] OvmfPkg/build.sh: Remove support for IA32 architecture Removes the logic for building the IA32 architecture from the `build.sh` script since AMD and Intel CPU are X64 only. Signed-off-by: Damien Chen --- OvmfPkg/build.sh | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/OvmfPkg/build.sh b/OvmfPkg/build.sh index 868b322b70b0..30f48301733a 100755 --- a/OvmfPkg/build.sh +++ b/OvmfPkg/build.sh @@ -35,7 +35,6 @@ fi # Configure defaults for various options # -ARCH_IA32=no ARCH_X64=no BUILDTARGET=DEBUG BUILD_OPTIONS= @@ -91,6 +90,7 @@ case `uname` in TARGET_TOOLS=GCC5 ;; esac + ;; esac # @@ -119,9 +119,9 @@ do else case $LAST_ARG in -a) - if [[ x"$arg" != x"IA32" && x"$arg" != x"X64" ]]; then + if [[ x"$arg" != x"X64" ]]; then echo Unsupported processor architecture: $arg - echo Only IA32 or X64 is supported + echo Only X64 is supported exit 1 fi eval ARCH_$arg=yes @@ -147,22 +147,14 @@ do shift done -if [[ "$ARCH_IA32" == "yes" && "$ARCH_X64" == "yes" ]]; then - PROCESSOR=IA32X64 - Processor=Ia32X64 - BUILD_OPTIONS="$BUILD_OPTIONS -a IA32 -a X64" - PLATFORM_BUILD_DIR=Ovmf3264 - BUILD_ROOT_ARCH=X64 -else - PROCESSOR=X64 - Processor=X64 - BUILD_OPTIONS="$BUILD_OPTIONS -a X64" - PLATFORM_BUILD_DIR=Ovmf$Processor - BUILD_ROOT_ARCH=X64 -fi +PROCESSOR=X64 +Processor=X64 +BUILD_OPTIONS="$BUILD_OPTIONS -a X64" +PLATFORM_BUILD_DIR=Ovmf$Processor +BUILD_ROOT_ARCH=X64 case $PROCESSOR in - X64|IA32X64) + X64) if [ -z "$QEMU_COMMAND" ]; then # # The user didn't set the QEMU_COMMAND variable. @@ -172,7 +164,7 @@ case $PROCESSOR in ;; *) echo Unsupported processor architecture: $PROCESSOR - echo Only IA32 or X64 is supported + echo Only X64 is supported exit 1 ;; esac @@ -248,4 +240,4 @@ fi # echo Running edk2 build for OvmfPkg$Processor build -p $PLATFORMFILE $BUILD_OPTIONS -b $BUILDTARGET -t $TARGET_TOOLS -n $THREADNUMBER -exit $? +exit $? \ No newline at end of file From 19a72dd1e14e8148513a5e84612868db858202ad Mon Sep 17 00:00:00 2001 From: Sughosh Ganu Date: Fri, 19 Sep 2025 15:12:47 +0530 Subject: [PATCH 0568/1172] MdePkg: AgdiTable: add support for Arm Agdi table Add support for the Arm Global Diagnostic Dump and Reset Interface ACPI table. Information in the table can be used for providing an interface for initiating a non-maskable event from a requesting agent. Signed-off-by: Sughosh Ganu --- .../Include/IndustryStandard/ArmAgdiTable.h | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 MdePkg/Include/IndustryStandard/ArmAgdiTable.h diff --git a/MdePkg/Include/IndustryStandard/ArmAgdiTable.h b/MdePkg/Include/IndustryStandard/ArmAgdiTable.h new file mode 100644 index 000000000000..2608910abcc0 --- /dev/null +++ b/MdePkg/Include/IndustryStandard/ArmAgdiTable.h @@ -0,0 +1,56 @@ +/** @file + Arm Global Diagnostic Dump and Reset Interface Table as defined in + 'ACPI for the Arm Components 1.2 EAC1' Platform Design Document + + Copyright (c) 2025 Arm Limited. + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - ACPI for the Arm Components 1.2 EAC1 Platform Design Document, + dated July 2025. + (https://developer.arm.com/documentation/den0093/1-2eac1/) +**/ + +#ifndef ARM_AGDI_TABLE_H_ +#define ARM_AGDI_TABLE_H_ + +#include + +#define EFI_ACPI_ARM_AGDI_TABLE_SIGNATURE SIGNATURE_32('A', 'G', 'D', 'I') + +#define EFI_ACPI_ARM_AGDI_TABLE_REVISION 0 + +#pragma pack(1) + +/// Signaling Mode Values +typedef enum { + ArmAgdiSdeiSignalingMode = 0x0, + ArmAgdiInterruptSignalingMode = 0x1, + ArmAgdiSdeiAndInterruptSignalingMode = 0x2, + ArmAgdiSignalingModeInval = 0x3, +} ARM_AGDI_SIGNALING_MODE; + +/// Arm AGDI Table definition +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + + /// Signaling Mode bits [1:0] + /// 0x0 - SDEI based signaling mode + /// 0x1 - Interrupt based signaling mode + /// 0x2 - Both SDEI and Interuppt based signaling mode + /// Rest of the bits [7:2] are reserved + UINT8 Flags; + + /// Reserved - Must be zero + UINT8 Reserved[3]; + + /// SDEI event number + UINT32 SdeiEventNum; + + /// GSIV of the interrupt + UINT32 Gsiv; +} EFI_ACPI_ARM_AGDI_TABLE; + +#pragma pack() + +#endif /* ARM_AGDI_TABLE_H_ */ From bc431cece3ab811d44acf8f2a5f8126f5c766b4c Mon Sep 17 00:00:00 2001 From: Sughosh Ganu Date: Fri, 19 Sep 2025 15:18:22 +0530 Subject: [PATCH 0569/1172] ShellPkg: add support for AGDI table in acpiview The AGDI table is a Global Diagnostic Dump and Reset Interface table defined by Arm. Add support for dumping the table contents in the acpiview command. Signed-off-by: Sughosh Ganu --- .../UefiShellAcpiViewCommandLib/AcpiParser.h | 21 +++ .../Parsers/Agdi/AgdiParser.c | 154 ++++++++++++++++++ .../UefiShellAcpiViewCommandLib.c | 2 + .../UefiShellAcpiViewCommandLib.inf | 1 + 4 files changed, 178 insertions(+) create mode 100644 ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Agdi/AgdiParser.c diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h index 0aece822f6a9..caa66757612d 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h @@ -606,6 +606,27 @@ ParseAcpiAest ( IN UINT8 AcpiTableRevision ); +/** + This function parses the ACPI AGDI table. + When trace is enabled this function parses the AGDI table and + traces the ACPI table fields. + + This function also performs validation of the ACPI table fields. + + @param [in] Trace If TRUE, trace the ACPI fields. + @param [in] Ptr Pointer to the start of the buffer. + @param [in] AcpiTableLength Length of the ACPI table. + @param [in] AcpiTableRevision Revision of the ACPI table. +**/ +VOID +EFIAPI +ParseAcpiAgdi ( + IN BOOLEAN Trace, + IN UINT8 *Ptr, + IN UINT32 AcpiTableLength, + IN UINT8 AcpiTableRevision + ); + /** This function parses the ACPI APMT table. When trace is enabled this function parses the APMT table and diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Agdi/AgdiParser.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Agdi/AgdiParser.c new file mode 100644 index 000000000000..253c83d8c383 --- /dev/null +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Agdi/AgdiParser.c @@ -0,0 +1,154 @@ +/** @file + AGDI table parser + + Copyright (c) 2025, Arm Limited. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - ACPI for the Arm Components 1.2 EAC1 Platform Design Document, + dated July 2025. + (https://developer.arm.com/documentation/den0093/1-2eac1/) +**/ + +#include +#include +#include +#include "AcpiParser.h" +#include "AcpiView.h" +#include "AcpiViewConfig.h" + +STATIC ACPI_DESCRIPTION_HEADER_INFO mAcpiHdrInfo; + +/** + Validate Signaling Mode Value. + + @param [in] Ptr Pointer to the start of the field data. + @param [in] Length Length of the field. + @param [in] Context Pointer to context specific information e.g. this + could be a pointer to the ACPI table header. +**/ +STATIC +VOID +EFIAPI +ValidateSignalingFlags ( + IN UINT8 *Ptr, + IN UINT32 Length, + IN VOID *Context + ) +{ + if (*Ptr >= ArmAgdiSignalingModeInval) { + IncrementErrorCount (); + Print (L"\nERROR: Signaling Flags must be either 0, 1 or 2"); + } +} + +/** + Validate that the Reserved field has expected value. + + @param [in] Ptr Pointer to the start of the field data. + @param [in] Length Length of the field. + @param [in] Context Pointer to context specific information e.g. this + could be a pointer to the ACPI table header. +**/ +STATIC +VOID +EFIAPI +ValidateResField ( + IN UINT8 *Ptr, + IN UINT32 Length, + IN VOID *Context + ) +{ + if (*Ptr != 0) { + IncrementErrorCount (); + Print (L"\nERROR: Reserved bits in Flags must be 0"); + } +} + +/** + An ACPI_PARSER array describing the AGDI Signaling Mode Flags field. +**/ +STATIC CONST ACPI_PARSER AgdiSignalingModeFlags[] = { + { L"Signaling Mode", 2, 0, L"%u", NULL, NULL, ValidateSignalingFlags, NULL }, + { L"Reserved", 6, 2, L"%u", NULL, NULL, ValidateResField, NULL }, +}; + +/** + This function dumps the signaling mode flags field. + If no format string is specified the Format must be NULL. + + @param [in] Format Optional format string for tracing the data. + @param [in] Ptr Pointer to the start of the buffer. + @param [in] Length Length of the field. +**/ +STATIC +VOID +EFIAPI +DumpSignalingFlags ( + IN CONST CHAR16 *Format OPTIONAL, + IN UINT8 *Ptr, + IN UINT32 Length + ) +{ + if (Format != NULL) { + Print (Format, *(UINT32 *)Ptr); + return; + } + + Print (L"0x%x\n", *Ptr); + ParseAcpiBitFields ( + TRUE, + 2, + NULL, + Ptr, + 1, + PARSER_PARAMS (AgdiSignalingModeFlags) + ); +} + +/** + An ACPI_PARSER array describing the ACPI AGDI Table. +**/ +STATIC CONST ACPI_PARSER AgdiParser[] = { + PARSE_ACPI_HEADER (&mAcpiHdrInfo), + { L"Signaling mode Flags", 1, 36, NULL, DumpSignalingFlags, NULL, NULL, NULL }, + { L"Reserved", 3, 37, L"0x%x 0x%x 0x%x", Dump3Chars, NULL, NULL, NULL }, + { L"Sdei Event Number", 4, 40, L"0x%x", NULL, NULL, NULL, NULL }, + { L"GSIV", 4, 44, L"0x%x", NULL, NULL, NULL, NULL }, +}; + +/** + This function parses the ACPI AGDI table. + When trace is enabled this function parses the AGDI table and + traces the ACPI table fields. + + This function also performs validation of the ACPI table fields. + + @param [in] Trace If TRUE, trace the ACPI fields. + @param [in] Ptr Pointer to the start of the buffer. + @param [in] AcpiTableLength Length of the ACPI table. + @param [in] AcpiTableRevision Revision of the ACPI table. +**/ +VOID +EFIAPI +ParseAcpiAgdi ( + IN BOOLEAN Trace, + IN UINT8 *Ptr, + IN UINT32 AcpiTableLength, + IN UINT8 AcpiTableRevision + ) +{ + if (!Trace) { + return; + } + + // Parse ACPI Header + RASF "fixed" fields + ParseAcpi ( + Trace, + 0, + "AGDI", + Ptr, + AcpiTableLength, + PARSER_PARAMS (AgdiParser) + ); +} diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c index 37a122c1d8d5..173890fda5c6 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -49,6 +50,7 @@ STATIC CONST ACPI_TABLE_PARSER ParserList[] = { { EFI_ACPI_6_3_ARM_ERROR_SOURCE_TABLE_SIGNATURE, ParseAcpiAest }, + { EFI_ACPI_ARM_AGDI_TABLE_SIGNATURE, ParseAcpiAgdi }, { EFI_ACPI_6_4_ARM_PERFORMANCE_MONITORING_UNIT_TABLE_SIGNATURE, ParseAcpiApmt }, { EFI_ACPI_6_2_BOOT_GRAPHICS_RESOURCE_TABLE_SIGNATURE, ParseAcpiBgrt }, { EFI_ACPI_6_2_DEBUG_PORT_2_TABLE_SIGNATURE, ParseAcpiDbg2 }, diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf index bc12d8ce3226..2536faaa6a91 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf @@ -29,6 +29,7 @@ AcpiViewConfig.c AcpiViewConfig.h Parsers/Aest/AestParser.c + Parsers/Agdi/AgdiParser.c Parsers/Apmt/ApmtParser.c Parsers/Bgrt/BgrtParser.c Parsers/Dbg2/Dbg2Parser.c From e566e1e536e4e1b928852a6f17635587b31423ad Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 8 Aug 2025 10:47:29 +0200 Subject: [PATCH 0570/1172] OvmfPkg/igvm: reserve two pages for igvm support in memfd When loading firmware using the IGVM format the hypervisor can pass parameters -- for example the memory map -- to the firmware by storing that information in a parameter area in guest memory. The IGVM format also allows to load data to guest memory pages, which in turn allows to pack additional data -- for example efi binaries to load -- into the igvm file. This patch reserves two pages in memfd for that. One page for IGVM parameters (as defined in the IGVM spec), and one page where HOBs pointing to additional data can be stored. The patch also adds PCDs for location and size of these areas. Signed-off-by: Gerd Hoffmann --- OvmfPkg/Include/Fdf/MemFd.fdf.inc | 14 +++++++++++++- OvmfPkg/OvmfPkg.dec | 8 ++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/Include/Fdf/MemFd.fdf.inc b/OvmfPkg/Include/Fdf/MemFd.fdf.inc index 1c9a4df6ae1a..d3752f7c22db 100644 --- a/OvmfPkg/Include/Fdf/MemFd.fdf.inc +++ b/OvmfPkg/Include/Fdf/MemFd.fdf.inc @@ -98,10 +98,22 @@ gUefiOvmfPkgTokenSpaceGuid.PcdQemuHashTableBase|gUefiOvmfPkgTokenSpaceGuid.PcdQe 0x011000|0x001000 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecApicPageTableBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecApicPageTableSize +# +# IGVM parameter area +# +0x012000|0x001000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmParamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmParamSize + +# +# IGVM data HOBs +# +0x013000|0x001000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmHobBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmHobSize + # # initial memory for SEC+PEI # -0x012000|0x00E000 +0x014000|0x00C000 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize # diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec index 0a1a09fb70ad..f578d66aec69 100644 --- a/OvmfPkg/OvmfPkg.dec +++ b/OvmfPkg/OvmfPkg.dec @@ -354,6 +354,14 @@ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecValidatedStart|0|UINT32|0x62 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecValidatedEnd|0|UINT32|0x63 + ## The base address and size of the IGVM parameter area. + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmParamBase|0x0|UINT32|0x7d + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmParamSize|0x0|UINT32|0x7e + + ## The base address and size of the IGVM hob area. + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmHobBase|0x0|UINT32|0x7f + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmHobSize|0x0|UINT32|0x80 + ## The Tdx accept page size. 0x1000(4k),0x200000(2M) gUefiOvmfPkgTokenSpaceGuid.PcdTdxAcceptPageSize|0x200000|UINT32|0x65 From 313004a57f9feb02e9abf01ab07326573f60c9bc Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 8 Aug 2025 10:49:09 +0200 Subject: [PATCH 0571/1172] OvmfPkg/igvm: add igvm regions to reset vector Add parameter and HOB regions for IGVM to a new table in the reset vecroe, modeled after the AmdSev table we already have. This allows tools to figure where OVMF expects that data to be placed when generating IGVM files. Signed-off-by: Gerd Hoffmann --- OvmfPkg/ResetVector/Ia16/ResetVectorVtf0.asm | 12 +++++ OvmfPkg/ResetVector/ResetVector.inf | 4 ++ OvmfPkg/ResetVector/ResetVector.nasmb | 7 +++ OvmfPkg/ResetVector/X64/IgvmMetadata.asm | 52 ++++++++++++++++++++ 4 files changed, 75 insertions(+) create mode 100644 OvmfPkg/ResetVector/X64/IgvmMetadata.asm diff --git a/OvmfPkg/ResetVector/Ia16/ResetVectorVtf0.asm b/OvmfPkg/ResetVector/Ia16/ResetVectorVtf0.asm index 8f94da89f770..5d3587b7e6ad 100644 --- a/OvmfPkg/ResetVector/Ia16/ResetVectorVtf0.asm +++ b/OvmfPkg/ResetVector/Ia16/ResetVectorVtf0.asm @@ -48,6 +48,18 @@ TIMES (15 - ((guidedStructureEnd - guidedStructureStart + 15) % 16)) DB 0 guidedStructureStart: %ifdef ARCH_X64 +; +; IGVM Metadata offset block +; +; GUID : 784fa70e-3176-4677-8a20-04b68699e374 +; +igvmMetadataOffsetStart: + DD fourGigabytes - IgvmParamStart + DW igvmMetadataOffsetEnd - igvmMetadataOffsetStart + DB 0x0E, 0xA7, 0x4F, 0x78, 0x76, 0x31, 0x77, 0x46 + DB 0x8A, 0x20, 0x04, 0xB6, 0x86, 0x99, 0xE3, 0x74 +igvmMetadataOffsetEnd: + ; ; TDX Metadata offset block ; diff --git a/OvmfPkg/ResetVector/ResetVector.inf b/OvmfPkg/ResetVector/ResetVector.inf index df0e5f08918c..e15dace7e324 100644 --- a/OvmfPkg/ResetVector/ResetVector.inf +++ b/OvmfPkg/ResetVector/ResetVector.inf @@ -66,4 +66,8 @@ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecSvsmCaaSize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSnpSecretsBase gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSnpSecretsSize + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmParamBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmParamSize + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmHobBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmHobSize gEfiMdeModulePkgTokenSpaceGuid.PcdUse5LevelPageTable diff --git a/OvmfPkg/ResetVector/ResetVector.nasmb b/OvmfPkg/ResetVector/ResetVector.nasmb index 956116fbda7a..913f6c24a2f5 100644 --- a/OvmfPkg/ResetVector/ResetVector.nasmb +++ b/OvmfPkg/ResetVector/ResetVector.nasmb @@ -141,11 +141,18 @@ %define TDX_WORK_AREA_PGTBL_READY (FixedPcdGet32 (PcdOvmfWorkAreaBase) + 4) %define TDX_WORK_AREA_GPAW (FixedPcdGet32 (PcdOvmfWorkAreaBase) + 8) + %define IGVM_PARAM_START (FixedPcdGet32 (PcdOvmfIgvmParamBase)) + %define IGVM_PARAM_SIZE (FixedPcdGet32 (PcdOvmfIgvmParamSize)) + + %define IGVM_HOB_START (FixedPcdGet32 (PcdOvmfIgvmHobBase)) + %define IGVM_HOB_SIZE (FixedPcdGet32 (PcdOvmfIgvmHobSize)) + %include "X64/IntelTdxMetadata.asm" %include "Ia32/Flat32ToFlat64.asm" %include "Ia32/PageTables64.asm" %include "Ia32/IntelTdx.asm" %include "X64/OvmfSevMetadata.asm" + %include "X64/IgvmMetadata.asm" %endif %include "Ia32/AmdSev.asm" diff --git a/OvmfPkg/ResetVector/X64/IgvmMetadata.asm b/OvmfPkg/ResetVector/X64/IgvmMetadata.asm new file mode 100644 index 000000000000..1625a8262806 --- /dev/null +++ b/OvmfPkg/ResetVector/X64/IgvmMetadata.asm @@ -0,0 +1,52 @@ +;----------------------------------------------------------------------------- +; @file +; OVMF metadata for IGVM parameters +; +; Copyright (c) 2021 - 2024, AMD Inc. All rights reserved.
    +; +; SPDX-License-Identifier: BSD-2-Clause-Patent +;----------------------------------------------------------------------------- + +BITS 64 +ALIGN 16 + +%define IGVM_ID_PARAM_AREA 0x100 +%define IGVM_ID_PARAM_MEMORY_MAP 0x101 + +%define IGVM_ID_HOB_AREA 0x200 + +%define MEMORY_MAP_OFFSET 0 +%define MEMORY_MAP_ENTRIES 8 +%define MEMORY_MAP_SIZE (MEMORY_MAP_ENTRIES * 24) + +IgvmParamStart: +_IgvmDescriptor: + DB 'I','G','V','M' ; Signature + DD IgvmParamEnd - IgvmParamStart ; Length + DD 1 ; Version + DD (IgvmParamEnd - IgvmParamStart - 16) / 12 ; Number of sections + +%if (IGVM_PARAM_SIZE > 0) + +_IgvmParamArea: + DD IGVM_PARAM_START + DD IGVM_PARAM_SIZE + DD IGVM_ID_PARAM_AREA + +_IgvmMemoryMap: + DD MEMORY_MAP_OFFSET + DD MEMORY_MAP_SIZE + DD IGVM_ID_PARAM_MEMORY_MAP + +%endif + +%if (IGVM_HOB_SIZE > 0) + +_IgvmHobArea: + DD IGVM_HOB_START + DD IGVM_HOB_SIZE + DD IGVM_ID_HOB_AREA + +%endif + +IgvmParamEnd: From 5e8db785e4732891a4e96d2fbc83079b3e4262cc Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 8 Aug 2025 14:23:34 +0200 Subject: [PATCH 0572/1172] OvmfPkg/igvm: add igvm memory map support. In case a IGVM memory map is present in the parameter area use that when detecting guest memory. Signed-off-by: Gerd Hoffmann --- OvmfPkg/Include/Library/PlatformInitLib.h | 19 +++ OvmfPkg/Library/PlatformInitLib/Igvm.c | 110 ++++++++++++++++++ OvmfPkg/Library/PlatformInitLib/MemDetect.c | 9 +- .../PlatformInitLib/PlatformInitLib.inf | 3 + OvmfPkg/ResetVector/X64/IgvmMetadata.asm | 1 + 5 files changed, 137 insertions(+), 5 deletions(-) create mode 100644 OvmfPkg/Library/PlatformInitLib/Igvm.c diff --git a/OvmfPkg/Include/Library/PlatformInitLib.h b/OvmfPkg/Include/Library/PlatformInitLib.h index dc0c280a4857..074c8c169882 100644 --- a/OvmfPkg/Include/Library/PlatformInitLib.h +++ b/OvmfPkg/Include/Library/PlatformInitLib.h @@ -10,6 +10,7 @@ #define PLATFORM_INIT_LIB_H_ #include +#include #pragma pack(1) @@ -290,4 +291,22 @@ PlatformInitEmuVariableNvStore ( IN VOID *EmuVariableNvStore ); +typedef VOID (*E820_SCAN_CALLBACK) ( + EFI_E820_ENTRY64 *E820Entry, + EFI_HOB_PLATFORM_INFO *PlatformInfoHob + ); + +BOOLEAN +EFIAPI +PlatformIgvmMemoryMapCheck ( + VOID + ); + +EFI_STATUS +EFIAPI +PlatformIgvmScanE820 ( + IN E820_SCAN_CALLBACK Callback, + IN OUT EFI_HOB_PLATFORM_INFO *PlatformInfoHob + ); + #endif // PLATFORM_INIT_LIB_H_ diff --git a/OvmfPkg/Library/PlatformInitLib/Igvm.c b/OvmfPkg/Library/PlatformInitLib/Igvm.c new file mode 100644 index 000000000000..7ca1976c4cbb --- /dev/null +++ b/OvmfPkg/Library/PlatformInitLib/Igvm.c @@ -0,0 +1,110 @@ +/** @file + IGVM Parameter parsing + + Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.
    + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include + +/* keep in sync with OvmfPkg/ResetVector/X64/IgvmMetadata.asm */ +#define MEMORY_MAP_OFFSET 0 +#define MEMORY_MAP_ENTRIES 8 +#define MEMORY_MAP_SIZE (MEMORY_MAP_ENTRIES * sizeof(IGVM_MEMORY_MAP_ENTRY)) + +#define IGVM_MM_ENTRY_TYPE_MEMORY 0x00 +#define IGVM_MM_ENTRY_TYPE_RESERVED 0x01 +#define IGVM_MM_ENTRY_TYPE_PERSISTENT 0x02 + +typedef struct IGVM_MEMORY_MAP_ENTRY { + UINT64 PageStart; + UINT64 PageCount; + UINT16 EntryType; + UINT16 EntryFlags; + UINT32 Reserved; +} IGVM_MEMORY_MAP_ENTRY; + +STATIC +IGVM_MEMORY_MAP_ENTRY * +EFIAPI +PlatformIgvmMemoryMapFind ( + VOID + ) +{ + UINT64 Address; + IGVM_MEMORY_MAP_ENTRY *Map; + + Address = FixedPcdGet64 (PcdOvmfIgvmParamBase); + if (Address == 0) { + // no parameter area + return NULL; + } + + Map = (VOID *)(UINTN)(Address + MEMORY_MAP_OFFSET); + if (Map[0].PageCount == 0) { + // no memory map entries + return NULL; + } + + return Map; +} + +BOOLEAN +EFIAPI +PlatformIgvmMemoryMapCheck ( + VOID + ) +{ + return PlatformIgvmMemoryMapFind () != NULL; +} + +EFI_STATUS +EFIAPI +PlatformIgvmScanE820 ( + IN E820_SCAN_CALLBACK Callback, + IN OUT EFI_HOB_PLATFORM_INFO *PlatformInfoHob + ) +{ + STATIC BOOLEAN First = TRUE; + IGVM_MEMORY_MAP_ENTRY *Map; + EFI_E820_ENTRY64 Entry; + UINT32 Index; + + Map = PlatformIgvmMemoryMapFind (); + + if (Map == NULL) { + return EFI_NOT_FOUND; + } + + for (Index = 0; Map[Index].PageCount > 0; Index++) { + if (First) { + DEBUG (( + DEBUG_INFO, + "%a: IgvmMemoryMap[%d]: PageStart %lx, PageCount %lx, EntryType %d\n", + __func__, + Index, + Map[Index].PageStart, + Map[Index].PageCount, + Map[Index].EntryType + )); + } + + Entry.BaseAddr = LShiftU64 (Map[Index].PageStart, EFI_PAGE_SHIFT); + Entry.Length = LShiftU64 (Map[Index].PageCount, EFI_PAGE_SHIFT); + switch (Map[Index].EntryType) { + case IGVM_MM_ENTRY_TYPE_MEMORY: + Entry.Type = EfiAcpiAddressRangeMemory; + Callback (&Entry, PlatformInfoHob); + break; + case IGVM_MM_ENTRY_TYPE_RESERVED: + Entry.Type = EfiAcpiAddressRangeReserved; + Callback (&Entry, PlatformInfoHob); + break; + } + } + + First = FALSE; + return EFI_SUCCESS; +} diff --git a/OvmfPkg/Library/PlatformInitLib/MemDetect.c b/OvmfPkg/Library/PlatformInitLib/MemDetect.c index 17eaff316065..81fa60ade507 100644 --- a/OvmfPkg/Library/PlatformInitLib/MemDetect.c +++ b/OvmfPkg/Library/PlatformInitLib/MemDetect.c @@ -102,11 +102,6 @@ PlatformQemuUc32BaseInitialization ( } } -typedef VOID (*E820_SCAN_CALLBACK) ( - EFI_E820_ENTRY64 *E820Entry, - EFI_HOB_PLATFORM_INFO *PlatformInfoHob - ); - STATIC EFI_STATUS PlatformScanE820Tdx ( @@ -373,6 +368,10 @@ PlatformScanE820 ( EFI_E820_ENTRY64 E820Entry; UINTN Processed; + if (PlatformIgvmMemoryMapCheck ()) { + return PlatformIgvmScanE820 (Callback, PlatformInfoHob); + } + if (PlatformInfoHob->HostBridgeDevId == CLOUDHV_DEVICE_ID) { return PlatformScanE820Pvh (Callback, PlatformInfoHob); } diff --git a/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf b/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf index fe46dc071775..46c30fa5f1e3 100644 --- a/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf +++ b/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf @@ -24,6 +24,7 @@ [Sources] Cmos.c + Igvm.c MemDetect.c Platform.c @@ -110,5 +111,7 @@ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogBase gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogSize + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmParamBase + [FeaturePcd] gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode diff --git a/OvmfPkg/ResetVector/X64/IgvmMetadata.asm b/OvmfPkg/ResetVector/X64/IgvmMetadata.asm index 1625a8262806..207b9b115310 100644 --- a/OvmfPkg/ResetVector/X64/IgvmMetadata.asm +++ b/OvmfPkg/ResetVector/X64/IgvmMetadata.asm @@ -15,6 +15,7 @@ ALIGN 16 %define IGVM_ID_HOB_AREA 0x200 +; keep in sync with OvmfPkg/Library/PlatformInitLib/Igvm.c %define MEMORY_MAP_OFFSET 0 %define MEMORY_MAP_ENTRIES 8 %define MEMORY_MAP_SIZE (MEMORY_MAP_ENTRIES * 24) From f52a46375bbfb577f6809156d7f1fc3058595103 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 10 Sep 2025 14:02:05 +0200 Subject: [PATCH 0573/1172] OvmfPkg/igvm: add IgvmData struct header + guid Add header file with struct and defines for additional IGVM data HOBs. Also add the GUID for the HOB. Signed-off-by: Gerd Hoffmann --- OvmfPkg/Include/IndustryStandard/IgvmData.h | 29 +++++++++++++++++++++ OvmfPkg/OvmfPkg.dec | 1 + 2 files changed, 30 insertions(+) create mode 100644 OvmfPkg/Include/IndustryStandard/IgvmData.h diff --git a/OvmfPkg/Include/IndustryStandard/IgvmData.h b/OvmfPkg/Include/IndustryStandard/IgvmData.h new file mode 100644 index 000000000000..5816ac5b7f7f --- /dev/null +++ b/OvmfPkg/Include/IndustryStandard/IgvmData.h @@ -0,0 +1,29 @@ +/** @file + IGVM Data hobs + + Copyright (c) 2025, Red Hat. All rights reserved.
    + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef __IGVM_DATA_H__ +#define __IGVM_DATA_H__ + +/* secure boot databases */ +#define EFI_IGVM_DATA_TYPE_PK 0x100 +#define EFI_IGVM_DATA_TYPE_KEK 0x101 +#define EFI_IGVM_DATA_TYPE_DB 0x102 +#define EFI_IGVM_DATA_TYPE_DBX 0x103 + +/* efi binaries for direct kernel boot */ +#define EFI_IGVM_DATA_TYPE_SHIM 0x200 +#define EFI_IGVM_DATA_TYPE_KERNEL 0x201 + +typedef struct { + UINT64 Address; + UINT64 Length; + UINT32 DataType; + UINT32 DataFlags; +} EFI_IGVM_DATA_HOB; + +#endif /* __IGVM_DATA_H__ */ diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec index f578d66aec69..9cf13d3fb216 100644 --- a/OvmfPkg/OvmfPkg.dec +++ b/OvmfPkg/OvmfPkg.dec @@ -188,6 +188,7 @@ gRtcRegisterBaseAddressHobGuid = {0x40435d97, 0xeb37, 0x4a4b, {0x7f, 0xad, 0xb7, 0xed, 0x72, 0xa1, 0x43, 0xc5}} gOvmfFwCfgInfoHobGuid = {0xa291ce0e, 0xdc09, 0x11ee, {0x9e, 0xdb, 0x73, 0x49, 0xd7, 0x92, 0xaf, 0x51}} gMemDebugLogHobGuid = {0x95305139, 0xb20f, 0x4723, {0x84, 0x25, 0x62, 0x7c, 0x88, 0x8f, 0xf1, 0x21}} + gEfiIgvmDataHobGuid = {0x3dd177ff, 0xb632, 0x4e25, {0xbe, 0xf3, 0x06, 0x50, 0x63, 0xd5, 0x5f, 0xc4}} [Ppis] # PPI whose presence in the PPI database signals that the TPM base address From c36111cfcacd7c528aebf552d3e584c352786b8a Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 9 Sep 2025 22:44:03 +0200 Subject: [PATCH 0574/1172] OvmfPkg/igvm: handle igvm data hobs In case HOBs are present in the IGVM data hob area register the memory regions as bootservice data to avoid them being overwritten. Also copy over the HOBs so they can easily be found later using standard HobLib functions. Signed-off-by: Gerd Hoffmann --- OvmfPkg/Include/Library/PlatformInitLib.h | 6 ++ OvmfPkg/Library/PlatformInitLib/Igvm.c | 74 ++++++++++++++++++- OvmfPkg/Library/PlatformInitLib/Platform.c | 2 + .../PlatformInitLib/PlatformInitLib.inf | 3 + 4 files changed, 84 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/Include/Library/PlatformInitLib.h b/OvmfPkg/Include/Library/PlatformInitLib.h index 074c8c169882..e9e86630beaf 100644 --- a/OvmfPkg/Include/Library/PlatformInitLib.h +++ b/OvmfPkg/Include/Library/PlatformInitLib.h @@ -309,4 +309,10 @@ PlatformIgvmScanE820 ( IN OUT EFI_HOB_PLATFORM_INFO *PlatformInfoHob ); +VOID +EFIAPI +PlatformIgvmDataHobs ( + VOID + ); + #endif // PLATFORM_INIT_LIB_H_ diff --git a/OvmfPkg/Library/PlatformInitLib/Igvm.c b/OvmfPkg/Library/PlatformInitLib/Igvm.c index 7ca1976c4cbb..32d0a5b2e9e0 100644 --- a/OvmfPkg/Library/PlatformInitLib/Igvm.c +++ b/OvmfPkg/Library/PlatformInitLib/Igvm.c @@ -1,13 +1,20 @@ /** @file IGVM Parameter parsing - Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.
    + Copyright (c) 2025, Red Hat. All rights reserved.
    SPDX-License-Identifier: BSD-2-Clause-Patent **/ +#include +#include +#include +#include +#include +#include #include #include +#include /* keep in sync with OvmfPkg/ResetVector/X64/IgvmMetadata.asm */ #define MEMORY_MAP_OFFSET 0 @@ -108,3 +115,68 @@ PlatformIgvmScanE820 ( First = FALSE; return EFI_SUCCESS; } + +VOID +EFIAPI +PlatformIgvmDataHobs ( + VOID + ) +{ + UINT64 Start, End; + EFI_PEI_HOB_POINTERS Hob; + EFI_IGVM_DATA_HOB *IgvmData; + + Start = FixedPcdGet64 (PcdOvmfIgvmHobBase); + End = Start + FixedPcdGet64 (PcdOvmfIgvmHobSize); + if (Start == 0) { + // no parameter area + return; + } + + for (Hob.Raw = (VOID *)(UINTN)Start; + ; + Hob.Raw = GET_NEXT_HOB (Hob)) + { + DEBUG (( + DEBUG_VERBOSE, + "%a: hob: ptr=%p type=0x%x length=%u\n", + __func__, + Hob.Raw, + Hob.Header->HobType, + Hob.Header->HobLength + )); + + if (Hob.Header->HobType != EFI_HOB_TYPE_GUID_EXTENSION) { + break; + } + + if ((UINTN)Hob.Raw + Hob.Header->HobLength > End) { + break; + } + + if (CompareMem (&Hob.Guid->Name, &gEfiIgvmDataHobGuid, sizeof (EFI_GUID)) != 0) { + break; + } + + IgvmData = (VOID *)(&Hob.Guid->Name + 1); + DEBUG (( + DEBUG_INFO, + "%a: data: address=0x%x length=0x%x type=0x%x flags=0x%x\n", + __func__, + IgvmData->Address, + IgvmData->Length, + IgvmData->DataType, + IgvmData->DataFlags + )); + + // copy over hob so dxe can easily use it + BuildGuidDataHob (&gEfiIgvmDataHobGuid, IgvmData, sizeof (*IgvmData)); + + // reserve data block memory + BuildMemoryAllocationHob ( + IgvmData->Address, + ALIGN_VALUE (IgvmData->Length, EFI_PAGE_SIZE), + EfiBootServicesData + ); + } +} diff --git a/OvmfPkg/Library/PlatformInitLib/Platform.c b/OvmfPkg/Library/PlatformInitLib/Platform.c index afe8b0abd683..9aea03f2f3da 100644 --- a/OvmfPkg/Library/PlatformInitLib/Platform.c +++ b/OvmfPkg/Library/PlatformInitLib/Platform.c @@ -250,6 +250,8 @@ PlatformMemMapInitialization ( PlatformInfoHob->PcdPciIoBase = PciIoBase; PlatformInfoHob->PcdPciIoSize = PciIoSize; + + PlatformIgvmDataHobs (); } /** diff --git a/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf b/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf index 46c30fa5f1e3..a02959c2cdbe 100644 --- a/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf +++ b/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf @@ -61,6 +61,7 @@ [Guids] gEfiSmmSmramMemoryGuid gEfiAcpiVariableGuid + gEfiIgvmDataHobGuid [Pcd] gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress @@ -112,6 +113,8 @@ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogSize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmParamBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmHobBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmHobSize [FeaturePcd] gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode From 251462324f56c1757aac8837f607890a1a466754 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 10 Sep 2025 15:04:51 +0200 Subject: [PATCH 0575/1172] OvmfPkg/QemuKernelLoaderFsDxe: add support for igvm data blobs In case shim or kernel blobs have been loaded via IGVM, register them as files in the kernel loader pseudo file system. They will be used for direct kernel boot then. Signed-off-by: Gerd Hoffmann --- .../QemuKernelLoaderFsDxe.c | 81 +++++++++++++++++++ .../QemuKernelLoaderFsDxe.inf | 2 + 2 files changed, 83 insertions(+) diff --git a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c index 646a9a5f1546..4598233ec176 100644 --- a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c +++ b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c @@ -15,11 +15,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -1148,6 +1150,69 @@ QemuKernelFetchNamedBlobs ( return EFI_SUCCESS; } +STATIC +EFI_STATUS +QemuKernelRegisterIgvmBlobs ( + VOID + ) +{ + EFI_HOB_GUID_TYPE *Hob; + EFI_IGVM_DATA_HOB *IgvmData; + CHAR16 *Name; + KERNEL_BLOB *Blob; + EFI_STATUS Status; + + Hob = GetFirstGuidHob (&gEfiIgvmDataHobGuid); + while (Hob) { + IgvmData = (VOID *)(Hob + 1); + + switch (IgvmData->DataType) { + case EFI_IGVM_DATA_TYPE_SHIM: + Name = L"shim"; + break; + case EFI_IGVM_DATA_TYPE_KERNEL: + Name = L"kernel"; + break; + default: + Name = NULL; + break; + } + + if (Name != NULL) { + DEBUG (( + DEBUG_INFO, + "%a: address=0x%lx length=0x%lx type=0x%x -> Name=%s\n", + __func__, + IgvmData->Address, + IgvmData->Length, + IgvmData->DataType, + Name + )); + + Blob = AllocatePool (sizeof (*Blob)); + if (Blob == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + ZeroMem (Blob, sizeof (*Blob)); + + Status = StrCpyS (Blob->Name, sizeof (Blob->Name), Name); + ASSERT (!EFI_ERROR (Status)); + Blob->Data = (VOID *)(UINTN)IgvmData->Address; + Blob->Size = (UINT32)IgvmData->Length; + + Blob->Next = mKernelBlobs; + mKernelBlobs = Blob; + mKernelBlobCount++; + mTotalBlobBytes += Blob->Size; + } + + Hob = GetNextGuidHob (&gEfiIgvmDataHobGuid, GET_NEXT_HOB (Hob)); + } + + return EFI_SUCCESS; +} + // // The entry point of the feature. // @@ -1190,6 +1255,21 @@ QemuKernelLoaderFsDxeEntrypoint ( return Status; } + // + // Register IGVM blobs + // + DEBUG ((DEBUG_INFO, "%a: igvm blobs\n", __func__)); + Status = QemuKernelRegisterIgvmBlobs (); + if (EFI_ERROR (Status)) { + goto FreeBlobs; + } + + if (mKernelBlobCount) { + // If we got efi binaries via igvm data blobs: + // Use only those and ignore fw_cfg data. + goto skipFwCfg; + } + // // Fetch named blobs. // @@ -1227,6 +1307,7 @@ QemuKernelLoaderFsDxeEntrypoint ( goto FreeBlobs; } +skipFwCfg: // // Create a new handle with a single VenMedia() node device path protocol on // it, plus a custom SimpleFileSystem protocol on it. diff --git a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf index a2f44bbca1b4..d24bd17c600e 100644 --- a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf +++ b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf @@ -29,6 +29,7 @@ BaseMemoryLib DebugLib DevicePathLib + HobLib MemoryAllocationLib PrintLib QemuFwCfgLib @@ -41,6 +42,7 @@ gEfiFileSystemInfoGuid gEfiFileSystemVolumeLabelInfoIdGuid gQemuKernelLoaderFsMediaGuid + gEfiIgvmDataHobGuid [Protocols] gEfiDevicePathProtocolGuid ## PRODUCES From 38370cf4924205df97b8bcaf0f184983a4b34f66 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 16 Sep 2025 12:55:47 +0200 Subject: [PATCH 0576/1172] OvmfPkg/igvm: add PlatformIgvmVpCount Add support for getting the cpu count via IGVM parameter. Signed-off-by: Gerd Hoffmann --- OvmfPkg/Include/Library/PlatformInitLib.h | 6 +++++ OvmfPkg/Library/PlatformInitLib/Igvm.c | 28 ++++++++++++++++++++++ OvmfPkg/Library/PlatformInitLib/Platform.c | 7 ++++++ OvmfPkg/ResetVector/X64/IgvmMetadata.asm | 9 +++++++ 4 files changed, 50 insertions(+) diff --git a/OvmfPkg/Include/Library/PlatformInitLib.h b/OvmfPkg/Include/Library/PlatformInitLib.h index e9e86630beaf..469c49b6285e 100644 --- a/OvmfPkg/Include/Library/PlatformInitLib.h +++ b/OvmfPkg/Include/Library/PlatformInitLib.h @@ -315,4 +315,10 @@ PlatformIgvmDataHobs ( VOID ); +UINT32 +EFIAPI +PlatformIgvmVpCount ( + VOID + ); + #endif // PLATFORM_INIT_LIB_H_ diff --git a/OvmfPkg/Library/PlatformInitLib/Igvm.c b/OvmfPkg/Library/PlatformInitLib/Igvm.c index 32d0a5b2e9e0..7df0720801d7 100644 --- a/OvmfPkg/Library/PlatformInitLib/Igvm.c +++ b/OvmfPkg/Library/PlatformInitLib/Igvm.c @@ -21,6 +21,9 @@ #define MEMORY_MAP_ENTRIES 8 #define MEMORY_MAP_SIZE (MEMORY_MAP_ENTRIES * sizeof(IGVM_MEMORY_MAP_ENTRY)) +#define VP_COUNT_OFFSET (MEMORY_MAP_OFFSET + MEMORY_MAP_SIZE) +#define VP_COUNT_SIZE 16 + #define IGVM_MM_ENTRY_TYPE_MEMORY 0x00 #define IGVM_MM_ENTRY_TYPE_RESERVED 0x01 #define IGVM_MM_ENTRY_TYPE_PERSISTENT 0x02 @@ -180,3 +183,28 @@ PlatformIgvmDataHobs ( ); } } + +UINT32 +EFIAPI +PlatformIgvmVpCount ( + VOID + ) +{ + UINT64 Address; + UINT32 *VpCount; + + Address = FixedPcdGet64 (PcdOvmfIgvmParamBase); + if (Address == 0) { + // no parameter area + return 0; + } + + VpCount = (VOID *)(UINTN)(Address + VP_COUNT_OFFSET); + if (!(*VpCount)) { + // no vp count + return 0; + } + + DEBUG ((DEBUG_INFO, "%a: vp-count=%d\n", __func__, *VpCount)); + return *VpCount; +} diff --git a/OvmfPkg/Library/PlatformInitLib/Platform.c b/OvmfPkg/Library/PlatformInitLib/Platform.c index 9aea03f2f3da..db01c45c63b2 100644 --- a/OvmfPkg/Library/PlatformInitLib/Platform.c +++ b/OvmfPkg/Library/PlatformInitLib/Platform.c @@ -568,6 +568,13 @@ PlatformMaxCpuCountInitialization ( UINT16 BootCpuCount = 0; UINT32 MaxCpuCount; + MaxCpuCount = PlatformIgvmVpCount (); + if (MaxCpuCount != 0) { + PlatformInfoHob->PcdCpuMaxLogicalProcessorNumber = MaxCpuCount; + PlatformInfoHob->PcdCpuBootLogicalProcessorNumber = MaxCpuCount; + return; + } + if (TdIsEnabled ()) { BootCpuCount = (UINT16)TdVCpuNum (); MaxCpuCount = TdMaxVCpuNum (); diff --git a/OvmfPkg/ResetVector/X64/IgvmMetadata.asm b/OvmfPkg/ResetVector/X64/IgvmMetadata.asm index 207b9b115310..8402f4173b17 100644 --- a/OvmfPkg/ResetVector/X64/IgvmMetadata.asm +++ b/OvmfPkg/ResetVector/X64/IgvmMetadata.asm @@ -12,6 +12,7 @@ ALIGN 16 %define IGVM_ID_PARAM_AREA 0x100 %define IGVM_ID_PARAM_MEMORY_MAP 0x101 +%define IGVM_ID_PARAM_VP_COUNT 0x102 %define IGVM_ID_HOB_AREA 0x200 @@ -20,6 +21,9 @@ ALIGN 16 %define MEMORY_MAP_ENTRIES 8 %define MEMORY_MAP_SIZE (MEMORY_MAP_ENTRIES * 24) +%define VP_COUNT_OFFSET (MEMORY_MAP_OFFSET + MEMORY_MAP_SIZE) +%define VP_COUNT_SIZE 16 + IgvmParamStart: _IgvmDescriptor: DB 'I','G','V','M' ; Signature @@ -39,6 +43,11 @@ _IgvmMemoryMap: DD MEMORY_MAP_SIZE DD IGVM_ID_PARAM_MEMORY_MAP +_IgvmVpCount: + DD VP_COUNT_OFFSET + DD VP_COUNT_SIZE + DD IGVM_ID_PARAM_VP_COUNT + %endif %if (IGVM_HOB_SIZE > 0) From a04994ff640b4bd17165ca2dcf10d05db7c18c43 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 22 Sep 2025 08:15:14 +0200 Subject: [PATCH 0577/1172] OvmfPkg/MemFD: swap memory log buffer and pei firmware volume This places the memory log buffer next to initial memory for heap and stack (TempRamBase) and includes it in the memory descriptor #3 for SEV-SNP (SNP_SEC_MEM_{BASE,SIZE}_DESC_3). This makes sure the memory is pre-validated at launch time, which is needed to make memory debug logging work in SEV-SNP mode. Signed-off-by: Gerd Hoffmann --- OvmfPkg/Include/Fdf/MemFd.fdf.inc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/OvmfPkg/Include/Fdf/MemFd.fdf.inc b/OvmfPkg/Include/Fdf/MemFd.fdf.inc index d3752f7c22db..1e85146daee8 100644 --- a/OvmfPkg/Include/Fdf/MemFd.fdf.inc +++ b/OvmfPkg/Include/Fdf/MemFd.fdf.inc @@ -117,17 +117,17 @@ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmHobBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmf gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize # -# PEI firmware volume is uncompressed to this area +# memory debug log buffer for early boot phase # -0x020000|0x0D0000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize -FV = PEIFV +0x020000|0x10000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogSize # -# memory debug log buffer for early boot phase +# PEI firmware volume is uncompressed to this area # -0x0F0000|0x10000 -gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogSize +0x030000|0x0D0000 +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize +FV = PEIFV # # DXE firmware volume is uncompressed to this area From 1f5faa68ce1a88a3a37a7d03f5fa71171edb1280 Mon Sep 17 00:00:00 2001 From: Mark Wilson Date: Thu, 17 Jul 2025 12:27:41 -0500 Subject: [PATCH 0578/1172] UefiCpuPkg/AmdSysCallLib: Add AmdSysCallLib headers and Null library AMD syscall is used in SMM to transition from CPL3 to CPL0 to access resources. Signed-off-by: Mark Wilson --- UefiCpuPkg/Include/Library/AmdSysCallLib.h | 64 +++++++++++++++++++ .../AmdSysCallLibNull/AmdSysCallLibNull.c | 49 ++++++++++++++ .../AmdSysCallLibNull/AmdSysCallLibNull.inf | 27 ++++++++ UefiCpuPkg/UefiCpuPkg.dec | 5 +- UefiCpuPkg/UefiCpuPkg.dsc | 2 + 5 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 UefiCpuPkg/Include/Library/AmdSysCallLib.h create mode 100644 UefiCpuPkg/Library/AmdSysCallLibNull/AmdSysCallLibNull.c create mode 100644 UefiCpuPkg/Library/AmdSysCallLibNull/AmdSysCallLibNull.inf diff --git a/UefiCpuPkg/Include/Library/AmdSysCallLib.h b/UefiCpuPkg/Include/Library/AmdSysCallLib.h new file mode 100644 index 000000000000..59565e9d0ff9 --- /dev/null +++ b/UefiCpuPkg/Include/Library/AmdSysCallLib.h @@ -0,0 +1,64 @@ +/** @file + Provides function interface to perform syscall. + +Copyright (C) Microsoft Corporation. +Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef AMD_SYS_CALL_LIB_H_ +#define AMD_SYS_CALL_LIB_H_ + +#include + +typedef enum { + SMM_SC_RDMSR = 0, + SMM_SC_WRMSR = 1, + SMM_SC_CLI = 2, + SMM_SC_IO_READ = 3, + SMM_SC_IO_WRITE = 4, + SMM_SC_WBINVD = 5, + SMM_SC_HLT = 6, + SMM_SC_SVST_READ = 7, + SMM_SC_IHV_SUPV_READ = 8, + SMM_SC_IHV_SUPV_WRITE = 9, +} AMD_SMM_SYS_CALL; + +/** + Check if high privilege instruction need go through Syscall. + + + @param NONE + + @return TRUE Syscall required + @return FALSE Syscall not required + +**/ +BOOLEAN +EFIAPI +NeedSysCall ( + VOID + ); + +/** + Use SysCall to access resource. + + @param[in] CallIndex The index of the resource. The AMD_SMM_SYS_CALL resource. + @param[in] Arg1 Value specific to SysCall. This is usually the Logical CPU number. + @param[in] Arg2 Value specific to SysCall. This is usually the resource address. + @param[in] Arg3 Value specific to SysCall. This is usually resource size. + + @return Value of the resource. System may hang or reset if resource value is protected. +**/ + +UINT64 +EFIAPI +SysCall ( + UINTN CallIndex, + UINTN Arg1, + UINTN Arg2, + UINTN Arg3 + ); + +#endif diff --git a/UefiCpuPkg/Library/AmdSysCallLibNull/AmdSysCallLibNull.c b/UefiCpuPkg/Library/AmdSysCallLibNull/AmdSysCallLibNull.c new file mode 100644 index 000000000000..9082fe4ff936 --- /dev/null +++ b/UefiCpuPkg/Library/AmdSysCallLibNull/AmdSysCallLibNull.c @@ -0,0 +1,49 @@ +/** @file + Null Library for AmdSysCallLib + +Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved.
    +SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include + +/** + Check if high privilege instruction need go through Syscall. + + + @param NONE + + @return TRUE Syscall required + @return FALSE Syscall not required + +**/ +BOOLEAN +EFIAPI +NeedSysCall ( + VOID + ) +{ + return FALSE; +} + +/** + Use SysCall to access resource. + + @param[in] CallIndex The index of the resource. The AMD_SMM_SYS_CALL resource. + @param[in] Arg1 Value specific to SysCall. This is usually the Logical CPU number. + @param[in] Arg2 Value specific to SysCall. This is usually the resource address. + @param[in] Arg3 Value specific to SysCall. This is usually resource size. + + @return Value of the resource. System may hang or reset if resource value is protected. +**/ +UINT64 +EFIAPI +SysCall ( + UINTN CallIndex, + UINTN Arg1, + UINTN Arg2, + UINTN Arg3 + ) +{ + return 0; +} diff --git a/UefiCpuPkg/Library/AmdSysCallLibNull/AmdSysCallLibNull.inf b/UefiCpuPkg/Library/AmdSysCallLibNull/AmdSysCallLibNull.inf new file mode 100644 index 000000000000..c237ea787519 --- /dev/null +++ b/UefiCpuPkg/Library/AmdSysCallLibNull/AmdSysCallLibNull.inf @@ -0,0 +1,27 @@ +## @file +# Base Library implementation. +# +# Copyright (c) 2025, AMD Incorporated. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 1.30 + BASE_NAME = AmdSysCallLibNull + FILE_GUID = 0AF486C8-EF8C-4BD9-99AC-F11277861771 + MODULE_TYPE = DXE_SMM_DRIVER + VERSION_STRING = 0.1 + LIBRARY_CLASS = AmdSysCallLib + +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + AmdSysCallLibNull.c + +[Packages] + MdePkg/MdePkg.dec + UefiCpuPkg/UefiCpuPkg.dec diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec index f23084b79920..d9ce6d1497c3 100644 --- a/UefiCpuPkg/UefiCpuPkg.dec +++ b/UefiCpuPkg/UefiCpuPkg.dec @@ -2,7 +2,7 @@ # This Package provides UEFI compatible CPU modules and libraries. # # Copyright (c) 2007 - 2024, Intel Corporation. All rights reserved.
    -# Copyright (C) 2023 - 2024, Advanced Micro Devices, Inc. All rights reserved.
    +# Copyright (C) 2023 - 2025, Advanced Micro Devices, Inc. All rights reserved.
    # Copyright (c) 2024, Loongson Technology Corporation Limited. All rights reserved.
    # # SPDX-License-Identifier: BSD-2-Clause-Patent @@ -79,6 +79,9 @@ ## @libraryclass Provides functions for SMM Relocation Operation. SmmRelocationLib|Include/Library/SmmRelocationLib.h +## @libraryclass Provides functions for AmdSysCallLib + AmdSysCallLib|Include/Library/AmdSysCallLib.h + [LibraryClasses.RISCV64] ## @libraryclass Provides functions to manage MMU features on RISCV64 CPUs. ## diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc index 58ccc37a23d2..ce6d6f306178 100644 --- a/UefiCpuPkg/UefiCpuPkg.dsc +++ b/UefiCpuPkg/UefiCpuPkg.dsc @@ -191,6 +191,7 @@ SmmCpuFeaturesLib|UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.inf MmSaveStateLib|UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveStateLib.inf + AmdSysCallLib|UefiCpuPkg/Library/AmdSysCallLibNull/AmdSysCallLibNull.inf } UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf UefiCpuPkg/ResetVector/Vtf0/Vtf0.inf @@ -208,6 +209,7 @@ UnitTestResultReportLib|UnitTestFrameworkPkg/Library/UnitTestResultReportLib/UnitTestResultReportLibConOut.inf } UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveStateLib.inf + UefiCpuPkg/Library/AmdSysCallLibNull/AmdSysCallLibNull.inf UefiCpuPkg/Library/MmSaveStateLib/IntelMmSaveStateLib.inf UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.inf UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.inf From 3ebcf121dc84cd4f919a9507fae6049b08297452 Mon Sep 17 00:00:00 2001 From: Mark Wilson Date: Thu, 24 Jul 2025 09:58:30 -0500 Subject: [PATCH 0579/1172] OvmfPkg: Add AmdSysCallLibNull in DSC files. Signed-off-by: Mark Wilson --- OvmfPkg/OvmfPkgIa32X64.dsc | 2 ++ OvmfPkg/OvmfPkgX64.dsc | 2 ++ 2 files changed, 4 insertions(+) diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc index 06fc031ab460..5b2f51e49ac6 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc @@ -457,6 +457,7 @@ PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf SmmCpuRendezvousLib|UefiCpuPkg/Library/SmmCpuRendezvousLib/SmmCpuRendezvousLib.inf MmSaveStateLib|UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveStateLib.inf + AmdSysCallLib|UefiCpuPkg/Library/AmdSysCallLibNull/AmdSysCallLibNull.inf [LibraryClasses.common.SMM_CORE] PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf @@ -933,6 +934,7 @@ SmmCpuPlatformHookLib|OvmfPkg/Library/SmmCpuPlatformHookLibQemu/SmmCpuPlatformHookLibQemu.inf SmmCpuFeaturesLib|OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf MmSaveStateLib|UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveStateLib.inf + AmdSysCallLib|UefiCpuPkg/Library/AmdSysCallLibNull/AmdSysCallLibNull.inf SmmCpuSyncLib|UefiCpuPkg/Library/SmmCpuSyncLib/SmmCpuSyncLib.inf } MdeModulePkg/Universal/SmmCommunicationBufferDxe/SmmCommunicationBufferDxe.inf diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index 7d7bb5dbb046..8e3cea72f820 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -1079,6 +1079,7 @@ SmmCpuPlatformHookLib|OvmfPkg/Library/SmmCpuPlatformHookLibQemu/SmmCpuPlatformHookLibQemu.inf SmmCpuFeaturesLib|OvmfPkg/Library/SmmCpuFeaturesLib/StandaloneMmCpuFeaturesLib.inf MmSaveStateLib|UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveStateLib.inf + AmdSysCallLib|UefiCpuPkg/Library/AmdSysCallLibNull/AmdSysCallLibNull.inf SmmCpuSyncLib|UefiCpuPkg/Library/SmmCpuSyncLib/SmmCpuSyncLib.inf } @@ -1107,6 +1108,7 @@ SmmCpuPlatformHookLib|OvmfPkg/Library/SmmCpuPlatformHookLibQemu/SmmCpuPlatformHookLibQemu.inf SmmCpuFeaturesLib|OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf MmSaveStateLib|UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveStateLib.inf + AmdSysCallLib|UefiCpuPkg/Library/AmdSysCallLibNull/AmdSysCallLibNull.inf SmmCpuSyncLib|UefiCpuPkg/Library/SmmCpuSyncLib/SmmCpuSyncLib.inf } From 64b62a08797295b2f5b6a394866be5533d3507d2 Mon Sep 17 00:00:00 2001 From: Mark Wilson Date: Thu, 24 Jul 2025 10:00:52 -0500 Subject: [PATCH 0580/1172] UefiCpuPkg/MmSaveStateLib: On AMD MmSaveStateLib, add support AmdSysCallLib Signed-off-by: Mark Wilson --- .../Library/MmSaveStateLib/AmdMmSaveState.c | 174 +++++++++++++++--- .../MmSaveStateLib/AmdMmSaveStateLib.inf | 4 +- 2 files changed, 149 insertions(+), 29 deletions(-) diff --git a/UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveState.c b/UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveState.c index ac143e64fb03..958feac05c94 100644 --- a/UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveState.c +++ b/UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveState.c @@ -2,7 +2,7 @@ Provides services to access SMRAM Save State Map Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.
    -Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved.
    +Copyright (C) 2023 - 2025 Advanced Micro Devices, Inc. All rights reserved.
    SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -10,7 +10,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include "MmSaveState.h" #include #include -#include +#include #define AMD_MM_SAVE_STATE_REGISTER_SMMREVID_INDEX 1 #define AMD_MM_SAVE_STATE_REGISTER_MAX_INDEX 2 @@ -80,6 +80,15 @@ CONST CPU_MM_SAVE_STATE_LOOKUP_ENTRY mCpuWidthOffset[] = { { 0, 0, 0, 0, 0, FALSE } }; +// Table used by MmSaveStateGetRegisterIndex() to convert an EFI_MM_SAVE_STATE_REGISTER +// value to an index into a table of type CPU_MM_SAVE_STATE_LOOKUP_ENTRY +CONST CPU_MM_SAVE_STATE_REGISTER_RANGE mCpuRegisterRanges[] = { + MM_REGISTER_RANGE (EFI_MM_SAVE_STATE_REGISTER_GDTBASE, EFI_MM_SAVE_STATE_REGISTER_LDTINFO), + MM_REGISTER_RANGE (EFI_MM_SAVE_STATE_REGISTER_ES, EFI_MM_SAVE_STATE_REGISTER_RIP), + MM_REGISTER_RANGE (EFI_MM_SAVE_STATE_REGISTER_RFLAGS, EFI_MM_SAVE_STATE_REGISTER_CR4), + { (EFI_MM_SAVE_STATE_REGISTER)0, (EFI_MM_SAVE_STATE_REGISTER)0, 0} +}; + /** Read a save state register on the target processor. If this function returns EFI_UNSUPPORTED, then the caller is responsible for reading the @@ -107,10 +116,10 @@ MmSaveStateReadRegister ( OUT VOID *Buffer ) { - UINT32 SmmRevId; EFI_MM_SAVE_STATE_IO_INFO *IoInfo; AMD_SMRAM_SAVE_STATE_MAP *CpuSaveState; UINT8 DataWidth; + UINT32 SaveStateIoDword; // Read CPU State CpuSaveState = (AMD_SMRAM_SAVE_STATE_MAP *)gMmst->CpuSaveState[CpuIndex]; @@ -129,20 +138,19 @@ MmSaveStateReadRegister ( // Check for special EFI_MM_SAVE_STATE_REGISTER_IO if (Register == EFI_MM_SAVE_STATE_REGISTER_IO) { - // - // Get SMM Revision ID - // - MmSaveStateReadRegisterByIndex (CpuIndex, AMD_MM_SAVE_STATE_REGISTER_SMMREVID_INDEX, sizeof (SmmRevId), &SmmRevId); - - // - // See if the CPU supports the IOMisc register in the save state - // - if (SmmRevId < AMD_SMM_MIN_REV_ID_X64) { - return EFI_NOT_FOUND; + if (NeedSysCall () == TRUE) { + SaveStateIoDword = (UINT32)SysCall ( + SMM_SC_SVST_READ, + CpuIndex, + (UINTN)&(CpuSaveState->x64.IO_DWord), + sizeof (CpuSaveState->x64.IO_DWord) + ); + } else { + SaveStateIoDword = CpuSaveState->x64.IO_DWord; } // Check if IO Restart Dword [IO Trap] is valid or not using bit 1. - if (!(CpuSaveState->x64.IO_DWord & 0x02u)) { + if (!(SaveStateIoDword & 0x02u)) { return EFI_NOT_FOUND; } @@ -150,12 +158,12 @@ MmSaveStateReadRegister ( IoInfo = (EFI_MM_SAVE_STATE_IO_INFO *)Buffer; ZeroMem (IoInfo, sizeof (EFI_MM_SAVE_STATE_IO_INFO)); - IoInfo->IoPort = (UINT16)(CpuSaveState->x64.IO_DWord >> 16u); + IoInfo->IoPort = (UINT16)(SaveStateIoDword >> 16u); - if (CpuSaveState->x64.IO_DWord & 0x10u) { + if (SaveStateIoDword & 0x10u) { IoInfo->IoWidth = EFI_MM_SAVE_STATE_IO_WIDTH_UINT8; DataWidth = 0x01u; - } else if (CpuSaveState->x64.IO_DWord & 0x20u) { + } else if (SaveStateIoDword & 0x20u) { IoInfo->IoWidth = EFI_MM_SAVE_STATE_IO_WIDTH_UINT16; DataWidth = 0x02u; } else { @@ -163,7 +171,7 @@ MmSaveStateReadRegister ( DataWidth = 0x04u; } - if (CpuSaveState->x64.IO_DWord & 0x01u) { + if (SaveStateIoDword & 0x01u) { IoInfo->IoType = EFI_MM_SAVE_STATE_IO_TYPE_INPUT; } else { IoInfo->IoType = EFI_MM_SAVE_STATE_IO_TYPE_OUTPUT; @@ -177,7 +185,12 @@ MmSaveStateReadRegister ( } // Convert Register to a register lookup table index - return MmSaveStateReadRegisterByIndex (CpuIndex, MmSaveStateGetRegisterIndex (Register, AMD_MM_SAVE_STATE_REGISTER_MAX_INDEX), Width, Buffer); + return MmSaveStateReadRegisterByIndex ( + CpuIndex, + MmSaveStateGetRegisterIndex (Register, AMD_MM_SAVE_STATE_REGISTER_MAX_INDEX), + Width, + Buffer + ); } /** @@ -278,18 +291,125 @@ MmSaveStateGetRegisterLma ( VOID ) { - UINT32 LMAValue; + // + // AMD64 processors support EFI_SMM_SAVE_STATE_REGISTER_LMA_64BIT only + // + return EFI_MM_SAVE_STATE_REGISTER_LMA_64BIT; +} + +/** + Read information from the CPU save state. + + @param Register Specifies the CPU register to read form the save state. + @param RegOffset Offset for the next register index. + + @retval 0 Register is not valid + @retval >0 Index into mCpuWidthOffset[] associated with Register + +**/ +UINTN +MmSaveStateGetRegisterIndex ( + IN EFI_MM_SAVE_STATE_REGISTER Register, + IN UINTN RegOffset + ) +{ + UINTN Index; + UINTN Offset; + + for (Index = 0, Offset = RegOffset; mCpuRegisterRanges[Index].Length != 0; Index++) { + if ((Register >= mCpuRegisterRanges[Index].Start) && (Register <= mCpuRegisterRanges[Index].End)) { + return Register - mCpuRegisterRanges[Index].Start + Offset; + } + + Offset += mCpuRegisterRanges[Index].Length; + } + + return 0; +} + +/** + Read a CPU Save State register on the target processor. + + This function abstracts the differences that whether the CPU Save State register is in the + IA32 CPU Save State Map or X64 CPU Save State Map. + + This function supports reading a CPU Save State register in SMBase relocation handler. + + @param[in] CpuIndex Specifies the zero-based index of the CPU save state. + @param[in] RegisterIndex Index into mCpuWidthOffset[] look up table. + @param[in] Width The number of bytes to read from the CPU save state. + @param[out] Buffer Upon return, this holds the CPU register value read from the save state. + + @retval EFI_SUCCESS The register was read from Save State. + @retval EFI_NOT_FOUND The register is not defined for the Save State of Processor. + @retval EFI_INVALID_PARAMTER This or Buffer is NULL. + +**/ +EFI_STATUS +MmSaveStateReadRegisterByIndex ( + IN UINTN CpuIndex, + IN UINTN RegisterIndex, + IN UINTN Width, + OUT VOID *Buffer + ) +{ + if (RegisterIndex == 0) { + return EFI_NOT_FOUND; + } - MSR_IA32_EFER_REGISTER Msr; + // + // If 64-bit mode width is zero, then the specified register can not be accessed + // + if (mCpuWidthOffset[RegisterIndex].Width64 == 0) { + return EFI_NOT_FOUND; + } - Msr.Uint64 = AsmReadMsr64 (MSR_IA32_EFER); - LMAValue = Msr.Bits.LMA; - if (LMAValue) { - return EFI_MM_SAVE_STATE_REGISTER_LMA_64BIT; + // + // If Width is bigger than the 64-bit mode width, then the specified register can not be accessed + // + if (Width > mCpuWidthOffset[RegisterIndex].Width64) { + return EFI_INVALID_PARAMETER; } // - // AMD64 processors support EFI_SMM_SAVE_STATE_REGISTER_LMA_64BIT only + // Write lower 32-bits of return buffer // - return EFI_MM_SAVE_STATE_REGISTER_LMA_64BIT; + if (NeedSysCall () == TRUE) { + *(UINT32 *)Buffer = (UINT32)SysCall ( + SMM_SC_SVST_READ, + CpuIndex, + (UINTN)((UINT8 *)gMmst->CpuSaveState[CpuIndex] + + mCpuWidthOffset[RegisterIndex].Offset64Lo), + MIN (4, Width) + ); + } else { + CopyMem ( + Buffer, + (UINT8 *)gMmst->CpuSaveState[CpuIndex] + mCpuWidthOffset[RegisterIndex].Offset64Lo, + MIN (4, Width) + ); + } + + if (Width > 4) { + // + // Write upper 32-bits of return buffer + // + if (NeedSysCall () == TRUE) { + *((UINT32 *)Buffer + 1) = (UINT32)SysCall ( + SMM_SC_SVST_READ, + CpuIndex, + (UINTN)((UINT8 *)gMmst->CpuSaveState[CpuIndex] + mCpuWidthOffset[RegisterIndex].Offset64Hi), + Width - 4 + ); + } else { + CopyMem ( + (UINT8 *)Buffer + 4, + (UINT8 *)gMmst->CpuSaveState[CpuIndex] + + mCpuWidthOffset[RegisterIndex].Offset64Hi, + Width - 4 + ); + } + } + + return EFI_SUCCESS; } diff --git a/UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveStateLib.inf b/UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveStateLib.inf index dcee6c401d30..bfeac26a4c84 100644 --- a/UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveStateLib.inf +++ b/UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveStateLib.inf @@ -4,7 +4,7 @@ # This is MM Smram save state service lib that provide service to read and # save savestate area registers. # -# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.
    +# Copyright (C) 2023 - 2025 Advanced Micro Devices, Inc. All rights reserved.
    # # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -20,7 +20,6 @@ [Sources] MmSaveState.h - MmSaveStateCommon.c AmdMmSaveState.c [Packages] @@ -32,3 +31,4 @@ BaseMemoryLib DebugLib MmServicesTableLib + AmdSysCallLib From 4b0ba678eb29f44c8ac4aa8292471f22d06aa8cd Mon Sep 17 00:00:00 2001 From: Sami Mujawar Date: Mon, 17 Oct 2022 11:54:15 +0100 Subject: [PATCH 0581/1172] DynamicTablesPkg: Define a SMBIOS Structure/Table type SMBIOS Structure Types 0 through 127 (7Fh) are reserved for and defined by the SMBIOS specification. Types 128 through 256 (80h to FFh) are available for system and OEM-specific information. Therefore, define a new type 'SMBIOS_TABLE_TYPE' that represents a SMBIOS structure type and include it in the definition of CM_STD_OBJ_SMBIOS_TABLE_INFO. Acked-by: Abner Chang Signed-off-by: Sami Mujawar Cc: Alexei Fedorov Cc: Pierre Gondois Cc: Girish Mahadevan Cc: Jeff Brasen Cc: Ashish Singhal Cc: Nick Ramirez Cc: William Watson Cc: Abner Chang Cc: Samer El-Haj-Mahmoud Cc: Jose Marinho --- .../Include/StandardNameSpaceObjects.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/DynamicTablesPkg/Include/StandardNameSpaceObjects.h b/DynamicTablesPkg/Include/StandardNameSpaceObjects.h index 8ec3238225ab..c81efbc23777 100644 --- a/DynamicTablesPkg/Include/StandardNameSpaceObjects.h +++ b/DynamicTablesPkg/Include/StandardNameSpaceObjects.h @@ -40,6 +40,20 @@ **/ typedef UINTN CM_OBJECT_TOKEN; +/** + A type representing a SMBIOS structure/table type. + + Types 0 through 127 (7Fh) are reserved for and defined by the + SMBIOS specification. + Types 128 through 256 (80h to FFh) are available for system and + OEM-specific information. + + Note: This Dynamic SMBIOS table generation implementation defines + TableType FFh as a NULL table which is used by the Dynamic + SMBIOS table dispatcher to terminate the dependency sequence. +*/ +typedef UINT8 SMBIOS_TABLE_TYPE; + /** The ESTD_OBJECT_ID enum describes the Object IDs in the Standard Namespace. */ @@ -127,6 +141,9 @@ typedef struct CmAStdObjAcpiTableInfo { to NULL. */ typedef struct CmStdObjSmbiosTableInfo { + /// SMBIOS Structure/Table Type + SMBIOS_TABLE_TYPE TableType; + /// The SMBIOS Table Generator ID SMBIOS_TABLE_GENERATOR_ID TableGeneratorId; From 54eabaf6b417fc657c4347ba7de54399c1b743af Mon Sep 17 00:00:00 2001 From: Sami Mujawar Date: Mon, 17 Oct 2022 12:20:56 +0100 Subject: [PATCH 0582/1172] DynamicTablesPkg: Add SMBIOS table dispatcher Some SMBIOS structure/table fields have dependency on other SMBIOS structures/tables. These dependencies are established using handles pointing to the dependent tables. A SMBIOS table handle can be obtained by either installing a SMBIOS table or by allocating a handle, which requires complex management to avoid any clashes. Obtaining a SMBIOS handle by installation requires that the dependent table is installed before the parent SMBIOS table can be installed. Therefore, introduce a SMBIOS table dispatcher that walks the SMBIOS dependency list and schedules the dependent tables to be installed before the parent table is installed. Signed-off-by: Sami Mujawar Cc: Alexei Fedorov Cc: Pierre Gondois Cc: Girish Mahadevan Cc: Jeff Brasen Cc: Ashish Singhal Cc: Nick Ramirez Cc: William Watson Cc: Abner Chang Cc: Samer El-Haj-Mahmoud Cc: Jose Marinho --- .../DynamicTableManagerDxe.inf | 4 +- .../SmbiosTableDispatcher.c | 284 ++++++++++++++++++ .../SmbiosTableDispatcher.h | 158 ++++++++++ 3 files changed, 445 insertions(+), 1 deletion(-) create mode 100644 DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.c create mode 100644 DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.h diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf index 92529b897be1..17358c789b98 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf @@ -1,7 +1,7 @@ ## @file # Module that drives the table generation and installation process. # -# Copyright (c) 2017 - 2019, ARM Limited. All rights reserved. +# Copyright (c) 2017 - 2022, Arm Limited. All rights reserved. # Copyright (c) 2024 Advanced Micro Devices, Inc. All rights reserved. # # SPDX-License-Identifier: BSD-2-Clause-Patent @@ -24,6 +24,8 @@ [Sources] DynamicTableManagerDxe.c DynamicTableManagerDxe.h + SmbiosTableDispatcher.c + SmbiosTableDispatcher.h [Sources.AARCH64] Arm/ArmDynamicTableManager.c diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.c b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.c new file mode 100644 index 000000000000..ed719bcd678e --- /dev/null +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.c @@ -0,0 +1,284 @@ +/** @file + Dynamic Smbios Table Dispatcher + + Copyright (c) 2022 - 2023, Arm Limited. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include +#include + +#include +#include + +/** + The SMBIOS dispatcher state table. + + The SMBIOS dispatcher state table is used to establish the dependency + order in which the SMBIOS tables are installed. This allows the SMBIOS + dispatcher to dispatch the dependent tables for installation before the + parent table is installed. + The SMBIOS_TABLE_DISPATCHER.Dependency[] field is used to establish the + dependency list. + Elements in the Dependency list are resolved by increasing index. However, + all orders are equivalent as: + - the Parent SMBIOS table will only be installed once all dependencies + have been satisfied. + - no cyclic dependency is allowed. + The dependency list is terminated by SMTT_NULL. +*/ +STATIC +SMBIOS_TABLE_DISPATCHER mSmBiosDispatcher[MAX_SMBIOS_TABLES] = { + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BIOS_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BASEBOARD_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_ENCLOSURE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PROCESSOR_INFORMATION, SMBIOS_TYPE_CACHE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_CONTROLLER_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_MODULE_INFORMATON, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_CACHE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_SLOTS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_ONBOARD_DEVICE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_OEM_STRINGS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BIOS_LANGUAGE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_GROUP_ASSOCIATIONS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_EVENT_LOG, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION, SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_DEVICE, SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION, SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_DEVICE_MAPPED_ADDRESS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BUILT_IN_POINTING_DEVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PORTABLE_BATTERY, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_RESET, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_HARDWARE_SECURITY, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_POWER_CONTROLS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_VOLTAGE_PROBE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_COOLING_DEVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_TEMPERATURE_PROBE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_ELECTRICAL_CURRENT_PROBE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_OUT_OF_BAND_REMOTE_ACCESS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BOOT_INTEGRITY_SERVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_DEVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_DEVICE_COMPONENT, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_DEVICE_THRESHOLD_DATA, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_CHANNEL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_IPMI_DEVICE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_POWER_SUPPLY, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_ADDITIONAL_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_ONBOARD_DEVICES_EXTENDED_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_CONTROLLER_HOST_INTERFACE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_TPM_DEVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PROCESSOR_ADDITIONAL_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_FIRMWARE_INVENTORY_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_STRING_PROPERTY_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL) +}; + +/** + A string table describing the SMBIOS dispatcher states. +*/ +STATIC +CONST CHAR8 *SmbiosTableStateTxt[] = { + "StNotPresent", + "StPresent", + "StDispatched" +}; + +#if !defined (MDEPKG_NDEBUG) + +/** + Print the SMBIOS Table Dispatcher state information. + + @param [in] Verbose Print detailed report +**/ +STATIC +VOID +EFIAPI +PrintDispatcherStatus ( + IN BOOLEAN Verbose + ) +{ + UINTN Index; + + DEBUG ((DEBUG_VERBOSE, "Dispatcher Status:\n")); + for (Index = 0; Index < ARRAY_SIZE (mSmBiosDispatcher); Index++) { + if ((!Verbose) && (mSmBiosDispatcher[Index].State == StNotPresent)) { + continue; + } + + DEBUG (( + DEBUG_VERBOSE, + "%02d: %10a [%02d, %02d, %02d, %02d, %02d]\n", + mSmBiosDispatcher[Index].TableType, + SmbiosTableStateTxt[mSmBiosDispatcher[Index].State], + mSmBiosDispatcher[Index].Dependency[0], + mSmBiosDispatcher[Index].Dependency[1], + mSmBiosDispatcher[Index].Dependency[2], + mSmBiosDispatcher[Index].Dependency[3], + mSmBiosDispatcher[Index].Dependency[4] + )); + } // for + + DEBUG ((DEBUG_VERBOSE, "\n")); +} + +#define DEBUG_PRINT_DISPATCHER_STATUS(Verbose) PrintDispatcherStatus (Verbose) +#else +#define DEBUG_PRINT_DISPATCHER_STATUS(x) +#endif + +/** + Initialise the SMBIOS table dispatcher. + + @param [in] SmbiosTableInfo Pointer to the list of SMBIOS tables to be + installed. + @param [in] SmbiosTableCount Count of SMBIOS tables to be installed. +**/ +VOID +EFIAPI +InitSmbiosTableDispatcher ( + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *SmbiosTableInfo, + IN UINT32 SmbiosTableCount + ) +{ + UINTN Index; + SMBIOS_TABLE_TYPE TableType; + + // Search for the list of SMBIOS tables presented + // for installation and update the dispatcher status. + for (Index = 0; Index < SmbiosTableCount; Index++) { + TableType = SmbiosTableInfo[Index].TableType; + ASSERT (TableType < MAX_SMBIOS_TABLES); + ASSERT (mSmBiosDispatcher[TableType].State != StPresent); + mSmBiosDispatcher[TableType].State = StPresent; + } + + DEBUG_PRINT_DISPATCHER_STATUS (FALSE); +} + +/** Schedule the dispatch of a SMBIOS table. + + The SMBIOS dispatcher state table is used to establish the dependency + order in which the SMBIOS tables are installed. This allows the SMBIOS + dispatcher to dispatch the dependent tables for installation before the + parent table is installed. + The SMBIOS_TABLE_DISPATCHER.Dependency[] field is used to establish the + dependency list. + Elements in the Dependency list are resolved by increasing index. However, + all orders are equivalent as: + - the Parent SMBIOS table will only be installed once all dependencies + have been satisfied. + - no cyclic dependency is allowed. + The dependency list is terminated by SMTT_NULL. + + @param [in] TableType The SMBIOS table type to schedule for + dispatch. + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol + interface. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] SmbiosProtocol Pointer to the SMBIOS protocol. + @param [in] SmbiosTableInfo Pointer to the SMBIOS table Info. + @param [in] SmbiosTableCount Count of SMBIOS table info objects. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND Required object is not found. + @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration Manager + is less than the Object size for the + requested object. +**/ +EFI_STATUS +EFIAPI +DispatchSmbiosTable ( + IN CONST SMBIOS_TABLE_TYPE TableType, + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN EFI_SMBIOS_PROTOCOL *SmbiosProtocol, + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo, + IN CONST UINT32 SmbiosTableCount + ) +{ + EFI_STATUS Status; + UINTN Index; + SMBIOS_TABLE_DISPATCHER *Disp; + + DEBUG ((DEBUG_VERBOSE, "->DP %02d\n", TableType)); + Disp = &mSmBiosDispatcher[TableType]; + if (Disp->State == StNotPresent) { + DEBUG ((DEBUG_VERBOSE, "<-DP %02d : EFI_NOT_FOUND\n", TableType)); + return EFI_NOT_FOUND; + } + + if (Disp->State == StDispatched) { + DEBUG ((DEBUG_VERBOSE, "<-DP %02d : EFI_ALREADY_STARTED\n", TableType)); + return EFI_ALREADY_STARTED; + } + + // Table is present so check the dependency. + for (Index = 0; Index < MAX_SMBIOS_DEPENDENCY; Index++) { + // Check if the dependency list is terminated by SMTT_NULL. + if (Disp->Dependency[Index] == SMTT_NULL) { + break; + } + + Status = DispatchSmbiosTable ( + Disp->Dependency[Index], + TableFactoryProtocol, + CfgMgrProtocol, + SmbiosProtocol, + SmbiosTableInfo, + SmbiosTableCount + ); + if (EFI_ERROR (Status)) { + if ((Status == EFI_ALREADY_STARTED) || (Status == EFI_NOT_FOUND)) { + // Some dependencies may already be satisfied + // as other tables may also have similar + // dependencies i.e. EFI_ALREADY_STARTED + // Or + // the dependent table may be optional + // and not provided i.e. EFI_NOT_FOUND. + continue; + } + + DEBUG ((DEBUG_VERBOSE, "<-DP %02d : Status = %d\n", TableType, Status)); + return Status; + } + } + + DEBUG ((DEBUG_VERBOSE, "DP %02d : Status = %d\n", TableType, Status)); + + // All dependencies satisfied - Install SMBIOS table + Disp->State = StDispatched; + // Find the SMBIOS table info matching the TableType + for (Index = 0; Index < SmbiosTableCount; Index++) { + if (SmbiosTableInfo[Index].TableType == TableType) { + break; + } + } + + Status = BuildAndInstallSmbiosTable ( + TableFactoryProtocol, + CfgMgrProtocol, + SmbiosProtocol, + &SmbiosTableInfo[Index] + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to install SMBIOS Table." \ + " Id = %u Status = %r\n", + SmbiosTableInfo[Index].TableGeneratorId, + Status + )); + } + + DEBUG_PRINT_DISPATCHER_STATUS (FALSE); + DEBUG ((DEBUG_VERBOSE, "<-DP %0d\n", TableType)); + return Status; +} diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.h b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.h new file mode 100644 index 000000000000..a8d239aedb47 --- /dev/null +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.h @@ -0,0 +1,158 @@ +/** @file + + Copyright (c) 2022 - 2023, Arm Limited. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef SMBIOS_TABLE_DISPATCHER_H_ +#define SMBIOS_TABLE_DISPATCHER_H_ + +#include +#include + +/** + A SMBIOS Table Type from the OEM range reserved for terminating + the SMBIOS table dispatch dependency. + + Note: According to the SMBIOS specification, Table Types 0 + through 127 (7Fh) are reserved for and defined by the + SMBIOS specification. + Types 128 through 256 (80h to FFh) are available for system and + OEM-specific information. + + This Dynamic SMBIOS table generation implementation defines + TableType FFh as a NULL table which is used by the Dynamic + SMBIOS table dispatcher to terminate the dependency list. +*/ +#define SMTT_NULL 0xFF + +/** + A macro defining the maximum number of dependendant SMBIOS tables + represented by the SMBIOS table dispatcher. +*/ +#define MAX_SMBIOS_DEPENDENCY 5 + +/** + A macro defining the maximum table types handled by the SMBIOS + table dispatcher. +*/ +#define MAX_SMBIOS_TABLES (SMBIOS_TYPE_STRING_PROPERTY_INFORMATION + 1) + +/** + A helper macro to populate the SMBIOS table dispatcher table +*/ +#define SMBIOS_TABLE_DEP(TableId, Dep1, Dep2, Dep3, Dep4, Dep5) \ + { \ + TableId, \ + StNotPresent, \ + { Dep1, Dep2, Dep3, Dep4, Dep5 } \ + } + +/** + An enum describing the states of the SMBIOS table dispatcher. +*/ +typedef enum SmbiosTableState { + StNotPresent, ///< SMBIOS table is not present for installation. + StPresent, ///< SMBIOS table is present for installation. + StDispatched ///< SMBIOS table generators have been dispatched. +} SMBIOS_TABLE_STATE; + +/** + A structure describing the dependencies for a SMBIOS table and + the dispatcher state information. +*/ +typedef struct SmBiosTableDispatcher { + /// SMBIOS Structure/Table Type + SMBIOS_TABLE_TYPE TableType; + /// SMBIOS dispatcher state + SMBIOS_TABLE_STATE State; + /// SMBIOS Structure/Table dependency list + /// The list is terminated using SMTT_NULL. + SMBIOS_TABLE_TYPE Dependency[MAX_SMBIOS_DEPENDENCY]; +} SMBIOS_TABLE_DISPATCHER; + +/** + A helper function to build and install a SMBIOS table. + + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol + interface. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] SmbiosProtocol Pointer to the SMBIOS protocol. + @param [in] SmbiosTableInfo Pointer to the SMBIOS table Info. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND Required object is not found. + @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration Manager + is less than the Object size for the + requested object. +**/ +EFI_STATUS +EFIAPI +BuildAndInstallSmbiosTable ( + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN EFI_SMBIOS_PROTOCOL *SmbiosProtocol, + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo + ); + +/** + Initialise the SMBIOS table dispatcher. + + @param SmbiosTableInfo Pointer to the list of SMBIOS tables to be installed. + @param SmbiosTableCount Count of SMBIOS tables to be installed. +**/ +VOID +EFIAPI +InitSmbiosTableDispatcher ( + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *SmbiosTableInfo, + IN UINT32 SmbiosTableCount + ); + +/** Schedule the dispatch of a SMBIOS table. + + The SMBIOS dispatcher state table is used to establish the dependency + order in which the SMBIOS tables are installed. This allows the SMBIOS + dispatcher to dispatch the dependent tables for installation before the + parent table is installed. + The SMBIOS_TABLE_DISPATCHER.Dependency[] field is used to establish the + dependency list. + Elements in the Dependency list are resolved by increasing index. However, + all orders are equivalent as: + - the Parent SMBIOS table will only be installed once all dependencies + have been satisfied. + - no cyclic dependency is allowed. + The dependency list is terminated by SMTT_NULL. + + @param [in] TableType The SMBIOS table type to schedule for + dispatch. + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol + interface. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] SmbiosProtocol Pointer to the SMBIOS protocol. + @param [in] SmbiosTableInfo Pointer to the SMBIOS table Info. + @param [in] SmbiosTableCount Count of SMBIOS table info objects. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND Required object is not found. + @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration Manager + is less than the Object size for the + requested object. +**/ +EFI_STATUS +EFIAPI +DispatchSmbiosTable ( + IN CONST SMBIOS_TABLE_TYPE TableType, + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN EFI_SMBIOS_PROTOCOL *SmbiosProtocol, + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo, + IN CONST UINT32 SmbiosTableCount + ); + +#endif // SMBIOS_TABLE_DISPATCHER_H_ From 6544b894a9cb5cf6265dc1e6de2424fe1193c765 Mon Sep 17 00:00:00 2001 From: Sami Mujawar Date: Thu, 23 Feb 2023 16:20:01 +0000 Subject: [PATCH 0583/1172] DynamicTablesPkg: Update SMBIOS dispatcher dependency table Update the SMBIOS table dispatcher dependency table to add the table dependencies for SMBIOS table Type 19, Type 20, Type 27, Type 35 and Type 37. The SMBIOS table Type 35 can have dependency on 6 other SMBIOS tables. Therefore, increase the MAX_SMBIOS_DEPENDENCY to 6, and also update the SMBIOS table dispatcher table accordingly. Signed-off-by: Sami Mujawar Cc: Alexei Fedorov Cc: Pierre Gondois Cc: Girish Mahadevan Cc: Jeff Brasen Cc: Ashish Singhal Cc: Nick Ramirez Cc: William Watson Cc: Abner Chang Cc: Samer El-Haj-Mahmoud Cc: Jose Marinho --- .../SmbiosTableDispatcher.c | 94 +++++++++---------- .../SmbiosTableDispatcher.h | 6 +- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.c b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.c index ed719bcd678e..0be21275d751 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.c +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.c @@ -30,53 +30,53 @@ */ STATIC SMBIOS_TABLE_DISPATCHER mSmBiosDispatcher[MAX_SMBIOS_TABLES] = { - SMBIOS_TABLE_DEP (SMBIOS_TYPE_BIOS_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_BASEBOARD_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_ENCLOSURE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_PROCESSOR_INFORMATION, SMBIOS_TYPE_CACHE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_CONTROLLER_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_MODULE_INFORMATON, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_CACHE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_SLOTS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_ONBOARD_DEVICE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_OEM_STRINGS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_BIOS_LANGUAGE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_GROUP_ASSOCIATIONS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_EVENT_LOG, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION, SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_DEVICE, SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION, SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_DEVICE_MAPPED_ADDRESS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_BUILT_IN_POINTING_DEVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_PORTABLE_BATTERY, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_RESET, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_HARDWARE_SECURITY, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_POWER_CONTROLS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_VOLTAGE_PROBE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_COOLING_DEVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_TEMPERATURE_PROBE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_ELECTRICAL_CURRENT_PROBE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_OUT_OF_BAND_REMOTE_ACCESS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_BOOT_INTEGRITY_SERVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_DEVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_DEVICE_COMPONENT, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_DEVICE_THRESHOLD_DATA, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_CHANNEL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_IPMI_DEVICE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_POWER_SUPPLY, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_ADDITIONAL_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_ONBOARD_DEVICES_EXTENDED_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_CONTROLLER_HOST_INTERFACE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_TPM_DEVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_PROCESSOR_ADDITIONAL_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_FIRMWARE_INVENTORY_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_STRING_PROPERTY_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL) + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BIOS_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BASEBOARD_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_ENCLOSURE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PROCESSOR_INFORMATION, SMBIOS_TYPE_CACHE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_CONTROLLER_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_MODULE_INFORMATON, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_CACHE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_SLOTS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_ONBOARD_DEVICE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_OEM_STRINGS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BIOS_LANGUAGE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_GROUP_ASSOCIATIONS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_EVENT_LOG, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION, SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_DEVICE, SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION, SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS, SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_DEVICE_MAPPED_ADDRESS, SMBIOS_TYPE_MEMORY_DEVICE, SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BUILT_IN_POINTING_DEVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PORTABLE_BATTERY, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_RESET, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_HARDWARE_SECURITY, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_POWER_CONTROLS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_VOLTAGE_PROBE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_COOLING_DEVICE, SMBIOS_TYPE_TEMPERATURE_PROBE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_TEMPERATURE_PROBE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_ELECTRICAL_CURRENT_PROBE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_OUT_OF_BAND_REMOTE_ACCESS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BOOT_INTEGRITY_SERVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_DEVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_DEVICE_COMPONENT, SMBIOS_TYPE_MANAGEMENT_DEVICE, SMBIOS_TYPE_VOLTAGE_PROBE, SMBIOS_TYPE_COOLING_DEVICE, SMBIOS_TYPE_TEMPERATURE_PROBE, SMBIOS_TYPE_ELECTRICAL_CURRENT_PROBE, SMBIOS_TYPE_MANAGEMENT_DEVICE_THRESHOLD_DATA), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_DEVICE_THRESHOLD_DATA, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_CHANNEL, SMBIOS_TYPE_MEMORY_DEVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_IPMI_DEVICE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_POWER_SUPPLY, SMBIOS_TYPE_VOLTAGE_PROBE, SMBIOS_TYPE_COOLING_DEVICE, SMBIOS_TYPE_ELECTRICAL_CURRENT_PROBE, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_ADDITIONAL_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_ONBOARD_DEVICES_EXTENDED_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_CONTROLLER_HOST_INTERFACE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_TPM_DEVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PROCESSOR_ADDITIONAL_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_FIRMWARE_INVENTORY_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_STRING_PROPERTY_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL) }; /** diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.h b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.h index a8d239aedb47..b7652e0dbbfe 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.h +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.h @@ -32,7 +32,7 @@ A macro defining the maximum number of dependendant SMBIOS tables represented by the SMBIOS table dispatcher. */ -#define MAX_SMBIOS_DEPENDENCY 5 +#define MAX_SMBIOS_DEPENDENCY 6 /** A macro defining the maximum table types handled by the SMBIOS @@ -43,11 +43,11 @@ /** A helper macro to populate the SMBIOS table dispatcher table */ -#define SMBIOS_TABLE_DEP(TableId, Dep1, Dep2, Dep3, Dep4, Dep5) \ +#define SMBIOS_TABLE_DEP(TableId, Dep1, Dep2, Dep3, Dep4, Dep5, Dep6) \ { \ TableId, \ StNotPresent, \ - { Dep1, Dep2, Dep3, Dep4, Dep5 } \ + { Dep1, Dep2, Dep3, Dep4, Dep5, Dep6 } \ } /** From 8f63fce99410d9bc4fa5c8c6528e41c5317b7f9e Mon Sep 17 00:00:00 2001 From: Sami Mujawar Date: Thu, 23 Feb 2023 16:34:10 +0000 Subject: [PATCH 0584/1172] DynamicTablesPkg: Add Ordered dispatch support for SMBIOS tables Some SMBIOS tables do not have a fixed dependency and can depend on any other SMBIOS tables. Therefore, the SMBIOS dispatcher cannot define a fixed sequence for dispatching these tables. A possible solution is to defer the dispatch of such SMBIOS tables towards the end, assuming that the dependent SMBIOS tables would have been dispatched by then. Therefore, introduce a dispatch order attribute such that SMBIOS tables that have a fixed dependency sequence are configured as Default Ordered, and the SMBIOS tables that do not have a fixed dependency have an Order attribute specifying an Order Level. An Order Level is used to sequence the dispatch of Ordered SMBIOS tables. The Default Ordered SMBIOS tables are dispatched first and a dependency walk is performed to dispatch the dependent tables by iterating through the SMBIOS_TABLE_DISPATCHER.Dependency[]. Once all Default ordered SMBIOS tables have been dispatched, the Ordered SMBIOS tables would be scheduled for dispatch in increasing order as of the Order Level, e.g. OrderL1, OrderL2, ... Note: The dispatcher does not perform a dependency walk for the Ordered SMBIOS tables as the expectation is that the dependent SMBIOS tables would be already dispatched. A top level dispatch function DispatchSmbiosTables() has been introduced to schedule the dispatch of Default Ordered and Ordered SMBIOS tables. Signed-off-by: Sami Mujawar Cc: Alexei Fedorov Cc: Pierre Gondois Cc: Girish Mahadevan Cc: Jeff Brasen Cc: Ashish Singhal Cc: Nick Ramirez Cc: William Watson Cc: Abner Chang Cc: Samer El-Haj-Mahmoud Cc: Jose Marinho --- .../SmbiosTableDispatcher.c | 524 +++++++++++++++--- .../SmbiosTableDispatcher.h | 34 +- 2 files changed, 484 insertions(+), 74 deletions(-) diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.c b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.c index 0be21275d751..1549e2524919 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.c +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.c @@ -27,56 +27,65 @@ have been satisfied. - no cyclic dependency is allowed. The dependency list is terminated by SMTT_NULL. + + The SMBIOS dispatcher dispatches the tables that have the default + order (OrderDef) set before the ordered SMBIOS tables are dispatched. + The SMBIOS_TABLE_DISPATCHER.Order field is used to establish the + dispatch order. + + The order specified in the SMBIOS dispatcher table must be unique for all + orders other than OrderDef. The dependency walk is only done for tables + that have the default dispatch order. */ STATIC SMBIOS_TABLE_DISPATCHER mSmBiosDispatcher[MAX_SMBIOS_TABLES] = { - SMBIOS_TABLE_DEP (SMBIOS_TYPE_BIOS_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_BASEBOARD_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_ENCLOSURE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_PROCESSOR_INFORMATION, SMBIOS_TYPE_CACHE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_CONTROLLER_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_MODULE_INFORMATON, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_CACHE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_SLOTS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_ONBOARD_DEVICE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_OEM_STRINGS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_BIOS_LANGUAGE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_GROUP_ASSOCIATIONS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_EVENT_LOG, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION, SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_DEVICE, SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION, SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS, SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_DEVICE_MAPPED_ADDRESS, SMBIOS_TYPE_MEMORY_DEVICE, SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_BUILT_IN_POINTING_DEVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_PORTABLE_BATTERY, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_RESET, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_HARDWARE_SECURITY, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_POWER_CONTROLS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_VOLTAGE_PROBE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_COOLING_DEVICE, SMBIOS_TYPE_TEMPERATURE_PROBE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_TEMPERATURE_PROBE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_ELECTRICAL_CURRENT_PROBE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_OUT_OF_BAND_REMOTE_ACCESS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_BOOT_INTEGRITY_SERVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_DEVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_DEVICE_COMPONENT, SMBIOS_TYPE_MANAGEMENT_DEVICE, SMBIOS_TYPE_VOLTAGE_PROBE, SMBIOS_TYPE_COOLING_DEVICE, SMBIOS_TYPE_TEMPERATURE_PROBE, SMBIOS_TYPE_ELECTRICAL_CURRENT_PROBE, SMBIOS_TYPE_MANAGEMENT_DEVICE_THRESHOLD_DATA), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_DEVICE_THRESHOLD_DATA, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_CHANNEL, SMBIOS_TYPE_MEMORY_DEVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_IPMI_DEVICE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_POWER_SUPPLY, SMBIOS_TYPE_VOLTAGE_PROBE, SMBIOS_TYPE_COOLING_DEVICE, SMBIOS_TYPE_ELECTRICAL_CURRENT_PROBE, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_ADDITIONAL_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_ONBOARD_DEVICES_EXTENDED_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_CONTROLLER_HOST_INTERFACE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_TPM_DEVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_PROCESSOR_ADDITIONAL_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_FIRMWARE_INVENTORY_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), - SMBIOS_TABLE_DEP (SMBIOS_TYPE_STRING_PROPERTY_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL) + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BIOS_INFORMATION, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_INFORMATION, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BASEBOARD_INFORMATION, OrderL1, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_ENCLOSURE, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PROCESSOR_INFORMATION, OrderDef, SMBIOS_TYPE_CACHE_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_CONTROLLER_INFORMATION, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_MODULE_INFORMATON, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_CACHE_INFORMATION, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_SLOTS, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_ONBOARD_DEVICE_INFORMATION, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_OEM_STRINGS, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BIOS_LANGUAGE_INFORMATION, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_GROUP_ASSOCIATIONS, OrderL4, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_EVENT_LOG, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, OrderDef, SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION, SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_DEVICE, OrderDef, SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION, SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS, OrderDef, SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_DEVICE_MAPPED_ADDRESS, OrderDef, SMBIOS_TYPE_MEMORY_DEVICE, SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BUILT_IN_POINTING_DEVICE, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PORTABLE_BATTERY, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_RESET, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_HARDWARE_SECURITY, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_POWER_CONTROLS, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_VOLTAGE_PROBE, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_COOLING_DEVICE, OrderDef, SMBIOS_TYPE_TEMPERATURE_PROBE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_TEMPERATURE_PROBE, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_ELECTRICAL_CURRENT_PROBE, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_OUT_OF_BAND_REMOTE_ACCESS, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BOOT_INTEGRITY_SERVICE, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_DEVICE, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_DEVICE_COMPONENT, OrderDef, SMBIOS_TYPE_MANAGEMENT_DEVICE, SMBIOS_TYPE_VOLTAGE_PROBE, SMBIOS_TYPE_COOLING_DEVICE, SMBIOS_TYPE_TEMPERATURE_PROBE, SMBIOS_TYPE_ELECTRICAL_CURRENT_PROBE, SMBIOS_TYPE_MANAGEMENT_DEVICE_THRESHOLD_DATA), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_DEVICE_THRESHOLD_DATA, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_CHANNEL, OrderDef, SMBIOS_TYPE_MEMORY_DEVICE, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_IPMI_DEVICE_INFORMATION, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_POWER_SUPPLY, OrderDef, SMBIOS_TYPE_VOLTAGE_PROBE, SMBIOS_TYPE_COOLING_DEVICE, SMBIOS_TYPE_ELECTRICAL_CURRENT_PROBE, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_ADDITIONAL_INFORMATION, OrderL3, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_ONBOARD_DEVICES_EXTENDED_INFORMATION, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_CONTROLLER_HOST_INTERFACE, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_TPM_DEVICE, OrderDef, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PROCESSOR_ADDITIONAL_INFORMATION, OrderDef, SMBIOS_TYPE_PROCESSOR_INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_FIRMWARE_INVENTORY_INFORMATION, OrderL2, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), + SMBIOS_TABLE_DEP (SMBIOS_TYPE_STRING_PROPERTY_INFORMATION, OrderL5, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL) }; /** @@ -161,7 +170,83 @@ InitSmbiosTableDispatcher ( DEBUG_PRINT_DISPATCHER_STATUS (FALSE); } -/** Schedule the dispatch of a SMBIOS table. +/** Dispatch the SMBIOS table. + + @param [in] Disp Pointer to the SMBIOS table dispatcher + object for the table to dispatch. + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol + interface. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] SmbiosProtocol Pointer to the SMBIOS protocol. + @param [in] SmbiosTableInfo Pointer to the SMBIOS table Info. + @param [in] SmbiosTableCount Count of SMBIOS table info objects. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND Required object is not found. + @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration Manager + is less than the Object size for the + requested object. +**/ +STATIC +EFI_STATUS +EFIAPI +DispatchTable ( + IN SMBIOS_TABLE_DISPATCHER *CONST Disp, + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN EFI_SMBIOS_PROTOCOL *SmbiosProtocol, + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo, + IN CONST UINT32 SmbiosTableCount + ) +{ + UINTN Index; + EFI_STATUS Status; + BOOLEAN Found; + + if (Disp == NULL) { + return EFI_INVALID_PARAMETER; + } + + Found = FALSE; + + // Update the dispatcher state to dispatched. + Disp->State = StDispatched; + // Find the SMBIOS table info matching the TableType + for (Index = 0; Index < SmbiosTableCount; Index++) { + if (SmbiosTableInfo[Index].TableType == Disp->TableType) { + Found = TRUE; + break; + } + } + + if (!Found) { + ASSERT (0); + return EFI_NOT_FOUND; + } + + // Install the SMBIOS table + Status = BuildAndInstallSmbiosTable ( + TableFactoryProtocol, + CfgMgrProtocol, + SmbiosProtocol, + &SmbiosTableInfo[Index] + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to install SMBIOS Table." \ + " Id = %d Status = %r\n", + SmbiosTableInfo[Index].TableGeneratorId, + Status + )); + } + + return Status; +} + +/** Schedule the dispatch of a default ordered SMBIOS table. The SMBIOS dispatcher state table is used to establish the dependency order in which the SMBIOS tables are installed. This allows the SMBIOS @@ -192,10 +277,17 @@ InitSmbiosTableDispatcher ( @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration Manager is less than the Object size for the requested object. + @retval EFI_NO_MAPPING A dependent table may be optional and + may not be in the list of tables to install. + @retval EFI_ALREADY_STARTED A table may be in the dependency list of + multiple tables and would have been installed + when one of the other parent table's dependency + list was fulfilled. **/ +STATIC EFI_STATUS EFIAPI -DispatchSmbiosTable ( +DispatchDefaultOrderedSmbiosTable ( IN CONST SMBIOS_TABLE_TYPE TableType, IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, @@ -207,28 +299,56 @@ DispatchSmbiosTable ( EFI_STATUS Status; UINTN Index; SMBIOS_TABLE_DISPATCHER *Disp; + SMBIOS_TABLE_TYPE DepTableType; DEBUG ((DEBUG_VERBOSE, "->DP %02d\n", TableType)); Disp = &mSmBiosDispatcher[TableType]; + + if (Disp->Order != OrderDef) { + DEBUG ((DEBUG_VERBOSE, "<-DP %d : EFI_INVALID_PARAMETER\n", TableType)); + // The table being request for installation is + // not a default ordered table. + return EFI_INVALID_PARAMETER; + } + if (Disp->State == StNotPresent) { - DEBUG ((DEBUG_VERBOSE, "<-DP %02d : EFI_NOT_FOUND\n", TableType)); - return EFI_NOT_FOUND; + DEBUG ((DEBUG_VERBOSE, "<-DP %02d : EFI_NO_MAPPING\n", TableType)); + // A dependent table may be optional and therefore may + // not be in the list of tables to install. + return EFI_NO_MAPPING; } if (Disp->State == StDispatched) { DEBUG ((DEBUG_VERBOSE, "<-DP %02d : EFI_ALREADY_STARTED\n", TableType)); + // This table may be in the dependency list of multiple tables + // and would have been installed when one of the other parent + // table's dependency list was fulfilled. return EFI_ALREADY_STARTED; } // Table is present so check the dependency. for (Index = 0; Index < MAX_SMBIOS_DEPENDENCY; Index++) { + DepTableType = Disp->Dependency[Index]; // Check if the dependency list is terminated by SMTT_NULL. - if (Disp->Dependency[Index] == SMTT_NULL) { + if (DepTableType == SMTT_NULL) { break; } - Status = DispatchSmbiosTable ( - Disp->Dependency[Index], + if (mSmBiosDispatcher[DepTableType].Order != OrderDef) { + // An incorrect dependency has been set. + // The default ordered SMBIOS tables must not have + // a dependency on ordered SMBIOS tables. + DEBUG (( + DEBUG_VERBOSE, + "<-DP %02d : EFI_INVALID_PARAMETER - Invalid dependency\n", + TableType + )); + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + Status = DispatchDefaultOrderedSmbiosTable ( + DepTableType, TableFactoryProtocol, CfgMgrProtocol, SmbiosProtocol, @@ -236,49 +356,317 @@ DispatchSmbiosTable ( SmbiosTableCount ); if (EFI_ERROR (Status)) { - if ((Status == EFI_ALREADY_STARTED) || (Status == EFI_NOT_FOUND)) { + if ((Status == EFI_ALREADY_STARTED) || + (Status == EFI_NO_MAPPING)) + { // Some dependencies may already be satisfied // as other tables may also have similar // dependencies i.e. EFI_ALREADY_STARTED // Or // the dependent table may be optional - // and not provided i.e. EFI_NOT_FOUND. + // and not provided i.e. EFI_NO_MAPPING. + DEBUG (( + DEBUG_VERBOSE, + "<-DP %02d : Status = %r - treated as Success, continue\n", + TableType, + Status + )); + // Therefore, reset Status to success + Status = EFI_SUCCESS; continue; } - DEBUG ((DEBUG_VERBOSE, "<-DP %02d : Status = %d\n", TableType, Status)); + DEBUG (( + DEBUG_VERBOSE, + "<-DP %02d : Status = %r\n", + TableType, + Status + )); return Status; } } - DEBUG ((DEBUG_VERBOSE, "DP %02d : Status = %d\n", TableType, Status)); + // All dependencies satisfied - dispatch SMBIOS table + Status = DispatchTable ( + Disp, + TableFactoryProtocol, + CfgMgrProtocol, + SmbiosProtocol, + SmbiosTableInfo, + SmbiosTableCount + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to install SMBIOS Table." \ + " TableType = %u Status = %r\n", + Disp->TableType, + Status + )); + } - // All dependencies satisfied - Install SMBIOS table - Disp->State = StDispatched; - // Find the SMBIOS table info matching the TableType - for (Index = 0; Index < SmbiosTableCount; Index++) { - if (SmbiosTableInfo[Index].TableType == TableType) { + DEBUG_PRINT_DISPATCHER_STATUS (FALSE); + DEBUG ((DEBUG_VERBOSE, "<-DP %0d\n", TableType)); + return Status; +} + +/** Schedule the dispatch of ordered SMBIOS tables. + + The SMBIOS dispatcher dispatches the tables that have the default + order (OrderDef) set first before the ordered SMBIOS tables are + dispatched. + The SMBIOS_TABLE_DISPATCHER.Order field is used to establish the + dispatch order. + + @param [in] Order The dispatch order for the SMBIOS table type + to be scheduled for dispatch. + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol + interface. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] SmbiosProtocol Pointer to the SMBIOS protocol. + @param [in] SmbiosTableInfo Pointer to the SMBIOS table Info. + @param [in] SmbiosTableCount Count of SMBIOS table info objects. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND Required object is not found. + @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration Manager + is less than the Object size for the + requested object. +**/ +STATIC +EFI_STATUS +EFIAPI +DispatchOrderedSmbiosTables ( + IN CONST DISPATCH_ORDER Order, + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN EFI_SMBIOS_PROTOCOL *SmbiosProtocol, + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo, + IN CONST UINT32 SmbiosTableCount + ) +{ + EFI_STATUS Status; + UINTN Index; + SMBIOS_TABLE_DISPATCHER *Disp; + + DEBUG ((DEBUG_VERBOSE, "->DPO %d\n", Order)); + + if (Order == OrderDef) { + DEBUG ((DEBUG_VERBOSE, "<-DPO %d : EFI_INVALID_PARAMETER\n", Order)); + return EFI_INVALID_PARAMETER; + } + + Disp = NULL; + for (Index = 0; Index < ARRAY_SIZE (mSmBiosDispatcher); Index++) { + if (mSmBiosDispatcher[Index].Order == Order) { + Disp = &mSmBiosDispatcher[Index]; break; } + } // for + + if (Disp == NULL) { + // Table with specified order not found. + DEBUG ((DEBUG_VERBOSE, "<-DPO %d : EFI_INVALID_PARAMETER\n", Order)); + ASSERT (0); + return EFI_INVALID_PARAMETER; + } else if (Disp->State == StNotPresent) { + // An ordered table of this order is not present + // for installation. So, nothing to do here. + DEBUG (( + DEBUG_VERBOSE, + "<-DPO %a - %d {%u}: EFI_SUCCESS\n", + SmbiosTableStateTxt[Disp->State], + Order, + Disp->TableType + )); + return EFI_SUCCESS; + } else if (Disp->State == StDispatched) { + // Ordered tables are dispatched in their dispatch order and + // cannot be in the dependency list of any other table. + // Therefore, the table cannot be already dispatched. + DEBUG (( + DEBUG_VERBOSE, + "<-DPO %a - %d {%u}: EFI_INVALID_PARAMETER\n", + SmbiosTableStateTxt[Disp->State], + Order, + Disp->TableType + )); + + ASSERT (0); + return EFI_INVALID_PARAMETER; + } else if (Disp->State != StPresent) { + // Invalid state, at this point the only valid state + // should be StPresent, otherwise the state machine + // is incorrect. + DEBUG (( + DEBUG_VERBOSE, + "<-DPO %d - %d {%u}: EFI_INVALID_PARAMETER\n", + Disp->State, + Order, + Disp->TableType + )); + ASSERT (0); + return EFI_INVALID_PARAMETER; } - Status = BuildAndInstallSmbiosTable ( + Status = DispatchTable ( + Disp, TableFactoryProtocol, CfgMgrProtocol, SmbiosProtocol, - &SmbiosTableInfo[Index] + SmbiosTableInfo, + SmbiosTableCount ); if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, "ERROR: Failed to install SMBIOS Table." \ - " Id = %u Status = %r\n", - SmbiosTableInfo[Index].TableGeneratorId, + " TableType = %u Status = %r\n", + Disp->TableType, Status )); } DEBUG_PRINT_DISPATCHER_STATUS (FALSE); - DEBUG ((DEBUG_VERBOSE, "<-DP %0d\n", TableType)); + DEBUG ((DEBUG_VERBOSE, "<-DPO %d {%u}\n", Order, Disp->TableType)); + return Status; +} + +/** Schedule the dispatch of SMBIOS tables. + + The SMBIOS dispatcher state table is used to establish the dependency + order in which the SMBIOS tables are installed. This allows the SMBIOS + dispatcher to dispatch the dependent tables for installation before the + parent table is installed. + The SMBIOS_TABLE_DISPATCHER.Dependency[] field is used to establish the + dependency list. + Elements in the Dependency list are resolved by increasing index. However, + all orders are equivalent as: + - the Parent SMBIOS table will only be installed once all dependencies + have been satisfied. + - no cyclic dependency is allowed. + The dependency list is terminated by SMTT_NULL. + + The SMBIOS dispatcher dispatches the tables that have the default + order (OrderDef) set before the ordered SMBIOS tables are dispatched. + The SMBIOS_TABLE_DISPATCHER.Order field is used to establish the + dispatch order. + + The order specified in the SMBIOS dispatcher table must be unique for all + orders other than OrderDef. The dependency walk is only done for tables + that have the default dispatch order. + + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol + interface. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] SmbiosProtocol Pointer to the SMBIOS protocol. + @param [in] SmbiosTableInfo Pointer to the SMBIOS table Info. + @param [in] SmbiosTableCount Count of SMBIOS table info objects. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND Required object is not found. + @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration Manager + is less than the Object size for the + requested object. +**/ +EFI_STATUS +EFIAPI +DispatchSmbiosTables ( + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN EFI_SMBIOS_PROTOCOL *SmbiosProtocol, + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo, + IN CONST UINT32 SmbiosTableCount + ) +{ + EFI_STATUS Status; + UINTN Index; + UINT8 Order; + SMBIOS_TABLE_TYPE TableType; + + if ((TableFactoryProtocol == NULL) || + (CfgMgrProtocol == NULL) || + (SmbiosProtocol == NULL) || + (SmbiosTableInfo == NULL) || + (SmbiosTableCount == 0)) + { + return EFI_INVALID_PARAMETER; + } + + // First dispatch the default ordered SMBIOS tables + for (Index = 0; Index < SmbiosTableCount; Index++) { + TableType = SmbiosTableInfo[Index].TableType; + ASSERT (TableType < MAX_SMBIOS_TABLES); + if (mSmBiosDispatcher[TableType].Order != OrderDef) { + // Skip if the table is not a default order table. + continue; + } + + Status = DispatchDefaultOrderedSmbiosTable ( + TableType, + TableFactoryProtocol, + CfgMgrProtocol, + SmbiosProtocol, + SmbiosTableInfo, + SmbiosTableCount + ); + if (EFI_ERROR (Status)) { + if ((Status == EFI_ALREADY_STARTED) || + (Status == EFI_NO_MAPPING)) + { + // Some dependencies may already be satisfied + // as other tables may also have similar + // dependencies i.e. EFI_ALREADY_STARTED + // Or + // the dependent table may be optional + // and not provided i.e. EFI_NO_MAPPING. + DEBUG (( + DEBUG_VERBOSE, + "TableType %02d : Status = %r - treated as Success, continue\n", + SmbiosTableInfo[Index].TableType, + Status + )); + // Therefore, reset Status to success + Status = EFI_SUCCESS; + continue; + } + + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to install SMBIOS Table." \ + " Id = %d Status = %r\n", + SmbiosTableInfo[Index].TableGeneratorId, + Status + )); + return Status; + } + } + + // Now dispatch the ordered SMBIOS tables + for (Order = OrderL1; Order < OrderMax; Order++) { + Status = DispatchOrderedSmbiosTables ( + (DISPATCH_ORDER)Order, + TableFactoryProtocol, + CfgMgrProtocol, + SmbiosProtocol, + SmbiosTableInfo, + SmbiosTableCount + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to install SMBIOS Table." \ + " Order = %d Status = %r\n", + Order, + Status + )); + break; + } + } + return Status; } diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.h b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.h index b7652e0dbbfe..02860463a5d9 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.h +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.h @@ -43,9 +43,10 @@ /** A helper macro to populate the SMBIOS table dispatcher table */ -#define SMBIOS_TABLE_DEP(TableId, Dep1, Dep2, Dep3, Dep4, Dep5, Dep6) \ +#define SMBIOS_TABLE_DEP(TableId, Order, Dep1, Dep2, Dep3, Dep4, Dep5, Dep6) \ { \ TableId, \ + Order, \ StNotPresent, \ { Dep1, Dep2, Dep3, Dep4, Dep5, Dep6 } \ } @@ -59,6 +60,19 @@ typedef enum SmbiosTableState { StDispatched ///< SMBIOS table generators have been dispatched. } SMBIOS_TABLE_STATE; +/** + An enum describing the dispatch order for the SMBIOS tables. +*/ +typedef enum DispatchOrder { + OrderDef = 0, ///< Default dispatch order. + OrderL1, ///< Dispatch order 1. + OrderL2, ///< Dispatch order 2. + OrderL3, ///< Dispatch order 3. + OrderL4, ///< Dispatch order 4. + OrderL5, ///< Dispatch order 5. + OrderMax ///< Dispatch order Max. +} DISPATCH_ORDER; + /** A structure describing the dependencies for a SMBIOS table and the dispatcher state information. @@ -66,6 +80,8 @@ typedef enum SmbiosTableState { typedef struct SmBiosTableDispatcher { /// SMBIOS Structure/Table Type SMBIOS_TABLE_TYPE TableType; + /// SMBIOS table dispatch order + DISPATCH_ORDER Order; /// SMBIOS dispatcher state SMBIOS_TABLE_STATE State; /// SMBIOS Structure/Table dependency list @@ -112,7 +128,7 @@ InitSmbiosTableDispatcher ( IN UINT32 SmbiosTableCount ); -/** Schedule the dispatch of a SMBIOS table. +/** Schedule the dispatch of SMBIOS tables. The SMBIOS dispatcher state table is used to establish the dependency order in which the SMBIOS tables are installed. This allows the SMBIOS @@ -127,8 +143,15 @@ InitSmbiosTableDispatcher ( - no cyclic dependency is allowed. The dependency list is terminated by SMTT_NULL. - @param [in] TableType The SMBIOS table type to schedule for - dispatch. + The SMBIOS dispatcher dispatches the tables that have the default + order (OrderDef) set before the ordered SMBIOS tables are dispatched. + The SMBIOS_TABLE_DISPATCHER.Order field is used to establish the + dispatch order. + + The order specified in the SMBIOS dispatcher table must be unique for all + orders other than OrderDef. The dependency walk is only done for tables + that have the default dispatch order. + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol interface. @param [in] CfgMgrProtocol Pointer to the Configuration Manager @@ -146,8 +169,7 @@ InitSmbiosTableDispatcher ( **/ EFI_STATUS EFIAPI -DispatchSmbiosTable ( - IN CONST SMBIOS_TABLE_TYPE TableType, +DispatchSmbiosTables ( IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, IN EFI_SMBIOS_PROTOCOL *SmbiosProtocol, From 06a1adf23d9ad2a0742ba4e582b28f23a9b3c0cc Mon Sep 17 00:00:00 2001 From: Girish Mahadevan Date: Tue, 11 Mar 2025 10:23:25 -0600 Subject: [PATCH 0585/1172] MdePkg/SmBios.h: Add New definition for Invalid Handle Add a new definition for invalid or non-existent handle. Signed-off-by: Girish Mahadevan --- MdePkg/Include/IndustryStandard/SmBios.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/MdePkg/Include/IndustryStandard/SmBios.h b/MdePkg/Include/IndustryStandard/SmBios.h index be46e9f4d6ac..4851e8cdde8c 100644 --- a/MdePkg/Include/IndustryStandard/SmBios.h +++ b/MdePkg/Include/IndustryStandard/SmBios.h @@ -30,6 +30,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent /// #define SMBIOS_HANDLE_PI_RESERVED 0xFFFE +/// +/// Reference SMBIOS 3.6, chapter 6.1.2. +/// Unless otherwise specified, when referring to another structure’s handle, the value +/// 0FFFFh is used to indicate that the referenced handle is not applicable or does not +/// exist. +/// +#define SMBIOS_HANDLE_INVALID 0xFFFF + /// /// Reference SMBIOS 2.6, chapter 3.1.3. /// Each text string is limited to 64 significant characters due to system MIF limitations. From a4492241a7dcd44bc71e427d251cad38260c559d Mon Sep 17 00:00:00 2001 From: Girish Mahadevan Date: Tue, 11 Mar 2025 11:46:00 -0600 Subject: [PATCH 0586/1172] DynamicTablesPkg: Move ACPI building & change DEPEX on protocol In preparation to introduce Dynamic SMBIOS support the following 2 changes are required: 1. Use ProtocolNotify Event for generating the ACPI tables and don't include the ACPI protocol in the Depex section for DynamicTableManagerDxe Driver. This is because if a platforms doesn't do ACPI based boot or if doesn't want to install SMBIOS tables we still want the DynamicTableManager to be dispatched to install the SMBIOS or ACPI tables respectively. 2. Split the logic for building the ACPI tables to a separate file. Signed-off-by: Girish Mahadevan --- .../DynamicTableManagerDxe/AcpiTableBuilder.c | 775 ++++++++++++++++++ .../DynamicTableManagerDxe.c | 749 +---------------- .../DynamicTableManagerDxe.h | 17 + .../DynamicTableManagerDxe.inf | 3 +- 4 files changed, 815 insertions(+), 729 deletions(-) create mode 100644 DynamicTablesPkg/Drivers/DynamicTableManagerDxe/AcpiTableBuilder.c diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/AcpiTableBuilder.c b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/AcpiTableBuilder.c new file mode 100644 index 000000000000..c310aec2ede4 --- /dev/null +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/AcpiTableBuilder.c @@ -0,0 +1,775 @@ +/** @file + Acpi Table Builder. + + Copyright (c) 2017 - 2019, ARM Limited. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include + +// Module specific include files. +#include +#include +#include +#include +#include +#include +#include +#include +#include "DynamicTableManagerDxe.h" + +/// +/// We require the FADT, MADT, GTDT and the DSDT tables to boot. +/// This list also include optional ACPI tables: DBG2, SPCR. +/// +STATIC ACPI_TABLE_PRESENCE_INFO *mAcpiVerifyTables; +STATIC UINT32 mAcpiVerifyTablesCount; +STATIC INT32 mAcpiVerifyTablesFadtIndex; + +/** This macro expands to a function that retrieves the ACPI Table + List from the Configuration Manager. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceStandard, + EStdObjAcpiTableList, + CM_STD_OBJ_ACPI_TABLE_INFO + ) + +/** A helper function to build and install a single ACPI table. + + This is a helper function that invokes the Table generator interface + for building an ACPI table. It uses the AcpiTableProtocol to install the + table, then frees the resources allocated for generating it. + + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol + interface. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] Generator Pointer to the AcpiTable generator. + @param [in] AcpiTableProtocol Pointer to the AcpiTable protocol. + @param [in] AcpiTableInfo Pointer to the ACPI table Info. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND Required object is not found. + @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration Manager + is less than the Object size for the + requested object. +**/ +STATIC +EFI_STATUS +EFIAPI +BuildAndInstallSingleAcpiTable ( + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN CONST ACPI_TABLE_GENERATOR *CONST Generator, + IN EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol, + IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo + ) +{ + EFI_STATUS Status; + EFI_STATUS Status1; + EFI_ACPI_DESCRIPTION_HEADER *AcpiTable; + UINTN TableHandle; + + AcpiTable = NULL; + Status = Generator->BuildAcpiTable ( + Generator, + AcpiTableInfo, + CfgMgrProtocol, + &AcpiTable + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to Build Table." \ + " TableGeneratorId = 0x%x. Status = %r\n", + AcpiTableInfo->TableGeneratorId, + Status + )); + // Free any allocated resources. + goto exit_handler; + } + + if (AcpiTable == NULL) { + Status = EFI_NOT_FOUND; + goto exit_handler; + } + + // Dump ACPI Table Header + DUMP_ACPI_TABLE_HEADER (AcpiTable); + + // Install ACPI table + Status = AcpiTableProtocol->InstallAcpiTable ( + AcpiTableProtocol, + AcpiTable, + AcpiTable->Length, + &TableHandle + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to Install ACPI Table. Status = %r\n", + Status + )); + // Free any allocated resources. + goto exit_handler; + } + + DEBUG (( + DEBUG_INFO, + "INFO: ACPI Table installed. Status = %r\n", + Status + )); + +exit_handler: + // Free any resources allocated for generating the tables. + if (Generator->FreeTableResources != NULL) { + Status1 = Generator->FreeTableResources ( + Generator, + AcpiTableInfo, + CfgMgrProtocol, + &AcpiTable + ); + if (EFI_ERROR (Status1)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to Free Table Resources." \ + "TableGeneratorId = 0x%x. Status = %r\n", + AcpiTableInfo->TableGeneratorId, + Status1 + )); + } + + // Return the first error status in case of failure + if (!EFI_ERROR (Status)) { + Status = Status1; + } + } + + return Status; +} + +/** A helper function to build and install multiple ACPI tables. + + This is a helper function that invokes the Table generator interface + for building an ACPI table. It uses the AcpiTableProtocol to install the + table, then frees the resources allocated for generating it. + + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol + interface. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] Generator Pointer to the AcpiTable generator. + @param [in] AcpiTableProtocol Pointer to the AcpiTable protocol. + @param [in] AcpiTableInfo Pointer to the ACPI table Info. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND Required object is not found. + @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration Manager + is less than the Object size for the + requested object. +**/ +STATIC +EFI_STATUS +EFIAPI +BuildAndInstallMultipleAcpiTable ( + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN CONST ACPI_TABLE_GENERATOR *CONST Generator, + IN EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol, + IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo + ) +{ + EFI_STATUS Status; + EFI_STATUS Status1; + EFI_ACPI_DESCRIPTION_HEADER **AcpiTable; + UINTN TableCount; + UINTN TableHandle; + UINTN Index; + + AcpiTable = NULL; + TableCount = 0; + Status = Generator->BuildAcpiTableEx ( + Generator, + AcpiTableInfo, + CfgMgrProtocol, + &AcpiTable, + &TableCount + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to Build Table." \ + " TableGeneratorId = 0x%x. Status = %r\n", + AcpiTableInfo->TableGeneratorId, + Status + )); + // Free any allocated resources. + goto exit_handler; + } + + if ((AcpiTable == NULL) || (TableCount == 0)) { + Status = EFI_NOT_FOUND; + goto exit_handler; + } + + for (Index = 0; Index < TableCount; Index++) { + // Dump ACPI Table Header + DUMP_ACPI_TABLE_HEADER (AcpiTable[Index]); + // Install ACPI table + Status = AcpiTableProtocol->InstallAcpiTable ( + AcpiTableProtocol, + AcpiTable[Index], + AcpiTable[Index]->Length, + &TableHandle + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to Install ACPI Table. Status = %r\n", + Status + )); + // Free any allocated resources. + goto exit_handler; + } + + DEBUG (( + DEBUG_INFO, + "INFO: ACPI Table installed. Status = %r\n", + Status + )); + } + +exit_handler: + // Free any resources allocated for generating the tables. + if (Generator->FreeTableResourcesEx != NULL) { + Status1 = Generator->FreeTableResourcesEx ( + Generator, + AcpiTableInfo, + CfgMgrProtocol, + &AcpiTable, + TableCount + ); + if (EFI_ERROR (Status1)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to Free Table Resources." \ + "TableGeneratorId = 0x%x. Status = %r\n", + AcpiTableInfo->TableGeneratorId, + Status1 + )); + } + + // Return the first error status in case of failure + if (!EFI_ERROR (Status)) { + Status = Status1; + } + } + + return Status; +} + +/** A helper function to invoke a Table generator + + This is a helper function that invokes the Table generator interface + for building an ACPI table. It uses the AcpiTableProtocol to install the + table, then frees the resources allocated for generating it. + + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol + interface. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] AcpiTableProtocol Pointer to the AcpiTable protocol. + @param [in] AcpiTableInfo Pointer to the ACPI table Info. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND Required object is not found. + @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration Manager + is less than the Object size for the + requested object. +**/ +STATIC +EFI_STATUS +EFIAPI +BuildAndInstallAcpiTable ( + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol, + IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo + ) +{ + EFI_STATUS Status; + CONST ACPI_TABLE_GENERATOR *Generator; + + ASSERT (TableFactoryProtocol != NULL); + ASSERT (CfgMgrProtocol != NULL); + ASSERT (AcpiTableProtocol != NULL); + ASSERT (AcpiTableInfo != NULL); + + DEBUG (( + DEBUG_INFO, + "INFO: EStdObjAcpiTableList: Address = 0x%p," \ + " TableGeneratorId = 0x%x\n", + AcpiTableInfo, + AcpiTableInfo->TableGeneratorId + )); + + Generator = NULL; + Status = TableFactoryProtocol->GetAcpiTableGenerator ( + TableFactoryProtocol, + AcpiTableInfo->TableGeneratorId, + &Generator + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Table Generator not found." \ + " TableGeneratorId = 0x%x. Status = %r\n", + AcpiTableInfo->TableGeneratorId, + Status + )); + return Status; + } + + if (Generator == NULL) { + return EFI_NOT_FOUND; + } + + DEBUG (( + DEBUG_INFO, + "INFO: Generator found : %s\n", + Generator->Description + )); + + if (Generator->BuildAcpiTableEx != NULL) { + Status = BuildAndInstallMultipleAcpiTable ( + TableFactoryProtocol, + CfgMgrProtocol, + Generator, + AcpiTableProtocol, + AcpiTableInfo + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to find build and install ACPI Table." \ + " Status = %r\n", + Status + )); + } + } else if (Generator->BuildAcpiTable != NULL) { + Status = BuildAndInstallSingleAcpiTable ( + TableFactoryProtocol, + CfgMgrProtocol, + Generator, + AcpiTableProtocol, + AcpiTableInfo + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to find build and install ACPI Table." \ + " Status = %r\n", + Status + )); + } + } else { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "ERROR: Table Generator does not implement the" \ + " ACPI_TABLE_GENERATOR_BUILD_TABLE interface." \ + " TableGeneratorId = 0x%x. Status = %r\n", + AcpiTableInfo->TableGeneratorId, + Status + )); + } + + return Status; +} + +/** The function checks if the Configuration Manager has provided the + mandatory ACPI tables for installation. + + @param [in] AcpiTableInfo Pointer to the ACPI Table Info list. + @param [in] AcpiTableCount Count of ACPI Table Info. + + @retval EFI_SUCCESS Success. + @retval EFI_NOT_FOUND If mandatory table is not found. + @retval EFI_ALREADY_STARTED If mandatory table found in AcpiTableInfo is already installed. +**/ +STATIC +EFI_STATUS +EFIAPI +VerifyMandatoryTablesArePresent ( + IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo, + IN UINT32 AcpiTableCount + ) +{ + EFI_STATUS Status; + UINTN Handle; + UINTN Index; + UINTN InstalledTableIndex; + EFI_ACPI_DESCRIPTION_HEADER *DescHeader; + EFI_ACPI_TABLE_VERSION Version; + EFI_ACPI_SDT_PROTOCOL *AcpiSdt; + + ASSERT (AcpiTableInfo != NULL); + + Status = EFI_SUCCESS; + + // Check against the statically initialized ACPI tables to see if they are in ACPI info list + while (AcpiTableCount-- != 0) { + for (Index = 0; Index < mAcpiVerifyTablesCount; Index++) { + if (AcpiTableInfo[AcpiTableCount].AcpiTableSignature == mAcpiVerifyTables[Index].AcpiTableSignature) { + mAcpiVerifyTables[Index].Presence |= ACPI_TABLE_PRESENT_INFO_LIST; + // Found this table, skip the rest. + break; + } + } + } + + // They also might be published already, so we can search from there + if (FeaturePcdGet (PcdInstallAcpiSdtProtocol)) { + AcpiSdt = NULL; + Status = gBS->LocateProtocol (&gEfiAcpiSdtProtocolGuid, NULL, (VOID **)&AcpiSdt); + + if (EFI_ERROR (Status) || (AcpiSdt == NULL)) { + DEBUG ((DEBUG_ERROR, "ERROR: Failed to locate ACPI SDT protocol (0x%p) - %r\n", AcpiSdt, Status)); + return Status; + } + + for (Index = 0; Index < mAcpiVerifyTablesCount; Index++) { + Handle = 0; + InstalledTableIndex = 0; + do { + Status = AcpiSdt->GetAcpiTable (InstalledTableIndex, (EFI_ACPI_SDT_HEADER **)&DescHeader, &Version, &Handle); + if (EFI_ERROR (Status)) { + break; + } + + InstalledTableIndex++; + } while (DescHeader->Signature != mAcpiVerifyTables[Index].AcpiTableSignature); + + if (!EFI_ERROR (Status)) { + mAcpiVerifyTables[Index].Presence |= ACPI_TABLE_PRESENT_INSTALLED; + } + } + } + + // Reset the return Status value to EFI_SUCCESS. We do not fully care if the table look up has failed. + Status = EFI_SUCCESS; + for (Index = 0; Index < mAcpiVerifyTablesCount; Index++) { + if (mAcpiVerifyTables[Index].Presence == 0) { + if (mAcpiVerifyTables[Index].IsMandatory) { + DEBUG ((DEBUG_ERROR, "ERROR: %a Table not found.\n", mAcpiVerifyTables[Index].AcpiTableName)); + Status = EFI_NOT_FOUND; + } else { + DEBUG ((DEBUG_WARN, "WARNING: %a Table not found.\n", mAcpiVerifyTables[Index].AcpiTableName)); + } + } else if (mAcpiVerifyTables[Index].Presence == + (ACPI_TABLE_PRESENT_INFO_LIST | ACPI_TABLE_PRESENT_INSTALLED)) + { + DEBUG ((DEBUG_ERROR, "ERROR: %a Table found while already published.\n", mAcpiVerifyTables[Index].AcpiTableName)); + Status = EFI_ALREADY_STARTED; + } + } + + return Status; +} + +/** Generate and install ACPI tables. + + The function gathers the information necessary for installing the + ACPI tables from the Configuration Manager, invokes the generators + and installs them (via BuildAndInstallAcpiTable). + + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol + interface. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + + @retval EFI_SUCCESS Success. + @retval EFI_NOT_FOUND If a mandatory table or a generator is not found. + @retval EFI_ALREADY_STARTED If mandatory table found in AcpiTableInfo is already installed. +**/ +STATIC +EFI_STATUS +EFIAPI +ProcessAcpiTables ( + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol + ) +{ + EFI_STATUS Status; + EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol; + CM_STD_OBJ_ACPI_TABLE_INFO *AcpiTableInfo; + UINT32 AcpiTableCount; + UINT32 Idx; + + ASSERT (TableFactoryProtocol != NULL); + ASSERT (CfgMgrProtocol != NULL); + + // Find the AcpiTable protocol + Status = gBS->LocateProtocol ( + &gEfiAcpiTableProtocolGuid, + NULL, + (VOID **)&AcpiTableProtocol + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to find AcpiTable protocol. Status = %r\n", + Status + )); + return Status; + } + + Status = GetEStdObjAcpiTableList ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &AcpiTableInfo, + &AcpiTableCount + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to get ACPI Table List. Status = %r\n", + Status + )); + return Status; + } + + if (0 == AcpiTableCount) { + DEBUG (( + DEBUG_ERROR, + "ERROR: EStdObjAcpiTableList: AcpiTableCount = %d\n", + AcpiTableCount + )); + return EFI_NOT_FOUND; + } + + DEBUG (( + DEBUG_INFO, + "INFO: EStdObjAcpiTableList: AcpiTableCount = %d\n", + AcpiTableCount + )); + + // Check if mandatory ACPI tables are present. + Status = VerifyMandatoryTablesArePresent ( + AcpiTableInfo, + AcpiTableCount + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to verify mandatory ACPI Table(s) presence." + " Status = %r\n", + Status + )); + return Status; + } + + // Add the FADT Table first. + if ((mAcpiVerifyTablesFadtIndex >= 0) && + ((mAcpiVerifyTables[mAcpiVerifyTablesFadtIndex].Presence & ACPI_TABLE_PRESENT_INSTALLED) == 0)) + { + // FADT is not yet installed + for (Idx = 0; Idx < AcpiTableCount; Idx++) { + if (CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdFadt) == + AcpiTableInfo[Idx].TableGeneratorId) + { + Status = BuildAndInstallAcpiTable ( + TableFactoryProtocol, + CfgMgrProtocol, + AcpiTableProtocol, + &AcpiTableInfo[Idx] + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to find build and install ACPI FADT Table." \ + " Status = %r\n", + Status + )); + return Status; + } + + break; + } + } // for + } + + // Add remaining ACPI Tables + for (Idx = 0; Idx < AcpiTableCount; Idx++) { + DEBUG (( + DEBUG_INFO, + "INFO: AcpiTableInfo[%d].TableGeneratorId = 0x%x\n", + Idx, + AcpiTableInfo[Idx].TableGeneratorId + )); + + // Skip FADT Table since we have already added + if (CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdFadt) == + AcpiTableInfo[Idx].TableGeneratorId) + { + continue; + } + + // Skip the Reserved table Generator ID for standard generators + if ((IS_GENERATOR_NAMESPACE_STD (AcpiTableInfo[Idx].TableGeneratorId)) && + ((CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdReserved) >= + AcpiTableInfo[Idx].TableGeneratorId) || + (CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdMax) <= + AcpiTableInfo[Idx].TableGeneratorId))) + { + DEBUG (( + DEBUG_WARN, + "WARNING: Invalid ACPI Generator table ID = 0x%x, Skipping...\n", + AcpiTableInfo[Idx].TableGeneratorId + )); + continue; + } + + Status = BuildAndInstallAcpiTable ( + TableFactoryProtocol, + CfgMgrProtocol, + AcpiTableProtocol, + &AcpiTableInfo[Idx] + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to find, build, and install ACPI Table." \ + " Status = %r\n", + Status + )); + return Status; + } + } // for + + return Status; +} + +/** ACPI table Protocol ready event handler. + + This event notification indicates that the ACPI protocol is ready. + Therefore, dispatch the building of the ACPI tables. + + @param [in] Event The Event that is signalled. + @param [in] Context The Context information. + + @retval None +**/ +VOID +EFIAPI +AcpiTableProtocolReady ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_STATUS Status; + EDKII_CONFIGURATION_MANAGER_PROTOCOL *CfgMgrProtocol; + CM_STD_OBJ_CONFIGURATION_MANAGER_INFO *CfgMfrInfo; + EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *TableFactoryProtocol; + METADATA_ROOT_HANDLE Root; + + // Locate the Dynamic Table Factory + Status = gBS->LocateProtocol ( + &gEdkiiDynamicTableFactoryProtocolGuid, + NULL, + (VOID **)&TableFactoryProtocol + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to find Dynamic Table Factory protocol." \ + " Status = %r\n", + Status + )); + return; + } + + // Locate the Configuration Manager for the Platform + Status = gBS->LocateProtocol ( + &gEdkiiConfigurationManagerProtocolGuid, + NULL, + (VOID **)&CfgMgrProtocol + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to find Configuration Manager protocol. Status = %r\n", + Status + )); + return; + } + + Status = GetCgfMgrInfo (CfgMgrProtocol, &CfgMfrInfo); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to get Configuration Manager info. Status = %r\n", + Status + )); + return; + } + + DEBUG (( + DEBUG_INFO, + "INFO: Configuration Manager Version = 0x%x, OemID = %c%c%c%c%c%c\n", + CfgMfrInfo->Revision, + CfgMfrInfo->OemId[0], + CfgMfrInfo->OemId[1], + CfgMfrInfo->OemId[2], + CfgMfrInfo->OemId[3], + CfgMfrInfo->OemId[4], + CfgMfrInfo->OemId[5] + )); + + Status = GetAcpiTablePresenceInfo ( + &mAcpiVerifyTables, + &mAcpiVerifyTablesCount, + &mAcpiVerifyTablesFadtIndex + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return; + } + + Status = ProcessAcpiTables (TableFactoryProtocol, CfgMgrProtocol); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: ACPI Table processing failure. Status = %r\n", + Status + )); + ASSERT_EFI_ERROR (Status); + return; + } + + Root = TableFactoryProtocol->GetMetadataRoot (); + + // Validate the collected Metadata. + Status = MetadataHandlerValidate (Root); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return; + } + + MetadataFreeHandle (Root); + + Status = gBS->CloseEvent (Event); + ASSERT_EFI_ERROR (Status); +} diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.c b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.c index ea8b5ba381a7..d29ea7ad2a55 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.c +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.c @@ -8,10 +8,9 @@ **/ #include +#include #include #include -#include -#include // Module specific include files. #include @@ -22,645 +21,10 @@ #include #include #include -#include #include "DynamicTableManagerDxe.h" -/// -/// We require the FADT, MADT, GTDT and the DSDT tables to boot. -/// This list also include optional ACPI tables: DBG2, SPCR. -/// -STATIC ACPI_TABLE_PRESENCE_INFO *mAcpiVerifyTables; -STATIC UINT32 mAcpiVerifyTablesCount; -STATIC INT32 mAcpiVerifyTablesFadtIndex; - -/** This macro expands to a function that retrieves the ACPI Table - List from the Configuration Manager. -*/ -GET_OBJECT_LIST ( - EObjNameSpaceStandard, - EStdObjAcpiTableList, - CM_STD_OBJ_ACPI_TABLE_INFO - ) - -/** A helper function to build and install a single ACPI table. - - This is a helper function that invokes the Table generator interface - for building an ACPI table. It uses the AcpiTableProtocol to install the - table, then frees the resources allocated for generating it. - - @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol - interface. - @param [in] CfgMgrProtocol Pointer to the Configuration Manager - Protocol Interface. - @param [in] Generator Pointer to the AcpiTable generator. - @param [in] AcpiTableProtocol Pointer to the AcpiTable protocol. - @param [in] AcpiTableInfo Pointer to the ACPI table Info. - - @retval EFI_SUCCESS Success. - @retval EFI_INVALID_PARAMETER A parameter is invalid. - @retval EFI_NOT_FOUND Required object is not found. - @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration Manager - is less than the Object size for the - requested object. -**/ -STATIC -EFI_STATUS -EFIAPI -BuildAndInstallSingleAcpiTable ( - IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, - IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, - IN CONST ACPI_TABLE_GENERATOR *CONST Generator, - IN EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol, - IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo - ) -{ - EFI_STATUS Status; - EFI_STATUS Status1; - EFI_ACPI_DESCRIPTION_HEADER *AcpiTable; - UINTN TableHandle; - - AcpiTable = NULL; - Status = Generator->BuildAcpiTable ( - Generator, - AcpiTableInfo, - CfgMgrProtocol, - &AcpiTable - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "ERROR: Failed to Build Table." \ - " TableGeneratorId = 0x%x. Status = %r\n", - AcpiTableInfo->TableGeneratorId, - Status - )); - // Free any allocated resources. - goto exit_handler; - } - - if (AcpiTable == NULL) { - Status = EFI_NOT_FOUND; - goto exit_handler; - } - - // Dump ACPI Table Header - DUMP_ACPI_TABLE_HEADER (AcpiTable); - - // Install ACPI table - Status = AcpiTableProtocol->InstallAcpiTable ( - AcpiTableProtocol, - AcpiTable, - AcpiTable->Length, - &TableHandle - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "ERROR: Failed to Install ACPI Table. Status = %r\n", - Status - )); - // Free any allocated resources. - goto exit_handler; - } - - DEBUG (( - DEBUG_INFO, - "INFO: ACPI Table installed. Status = %r\n", - Status - )); - -exit_handler: - // Free any resources allocated for generating the tables. - if (Generator->FreeTableResources != NULL) { - Status1 = Generator->FreeTableResources ( - Generator, - AcpiTableInfo, - CfgMgrProtocol, - &AcpiTable - ); - if (EFI_ERROR (Status1)) { - DEBUG (( - DEBUG_ERROR, - "ERROR: Failed to Free Table Resources." \ - "TableGeneratorId = 0x%x. Status = %r\n", - AcpiTableInfo->TableGeneratorId, - Status1 - )); - } - - // Return the first error status in case of failure - if (!EFI_ERROR (Status)) { - Status = Status1; - } - } - - return Status; -} - -/** A helper function to build and install multiple ACPI tables. - - This is a helper function that invokes the Table generator interface - for building an ACPI table. It uses the AcpiTableProtocol to install the - table, then frees the resources allocated for generating it. - - @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol - interface. - @param [in] CfgMgrProtocol Pointer to the Configuration Manager - Protocol Interface. - @param [in] Generator Pointer to the AcpiTable generator. - @param [in] AcpiTableProtocol Pointer to the AcpiTable protocol. - @param [in] AcpiTableInfo Pointer to the ACPI table Info. - - @retval EFI_SUCCESS Success. - @retval EFI_INVALID_PARAMETER A parameter is invalid. - @retval EFI_NOT_FOUND Required object is not found. - @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration Manager - is less than the Object size for the - requested object. -**/ -STATIC -EFI_STATUS -EFIAPI -BuildAndInstallMultipleAcpiTable ( - IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, - IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, - IN CONST ACPI_TABLE_GENERATOR *CONST Generator, - IN EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol, - IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo - ) -{ - EFI_STATUS Status; - EFI_STATUS Status1; - EFI_ACPI_DESCRIPTION_HEADER **AcpiTable; - UINTN TableCount; - UINTN TableHandle; - UINTN Index; - - AcpiTable = NULL; - TableCount = 0; - Status = Generator->BuildAcpiTableEx ( - Generator, - AcpiTableInfo, - CfgMgrProtocol, - &AcpiTable, - &TableCount - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "ERROR: Failed to Build Table." \ - " TableGeneratorId = 0x%x. Status = %r\n", - AcpiTableInfo->TableGeneratorId, - Status - )); - // Free any allocated resources. - goto exit_handler; - } - - if ((AcpiTable == NULL) || (TableCount == 0)) { - Status = EFI_NOT_FOUND; - goto exit_handler; - } - - for (Index = 0; Index < TableCount; Index++) { - // Dump ACPI Table Header - DUMP_ACPI_TABLE_HEADER (AcpiTable[Index]); - // Install ACPI table - Status = AcpiTableProtocol->InstallAcpiTable ( - AcpiTableProtocol, - AcpiTable[Index], - AcpiTable[Index]->Length, - &TableHandle - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "ERROR: Failed to Install ACPI Table. Status = %r\n", - Status - )); - // Free any allocated resources. - goto exit_handler; - } - - DEBUG (( - DEBUG_INFO, - "INFO: ACPI Table installed. Status = %r\n", - Status - )); - } - -exit_handler: - // Free any resources allocated for generating the tables. - if (Generator->FreeTableResourcesEx != NULL) { - Status1 = Generator->FreeTableResourcesEx ( - Generator, - AcpiTableInfo, - CfgMgrProtocol, - &AcpiTable, - TableCount - ); - if (EFI_ERROR (Status1)) { - DEBUG (( - DEBUG_ERROR, - "ERROR: Failed to Free Table Resources." \ - "TableGeneratorId = 0x%x. Status = %r\n", - AcpiTableInfo->TableGeneratorId, - Status1 - )); - } - - // Return the first error status in case of failure - if (!EFI_ERROR (Status)) { - Status = Status1; - } - } - - return Status; -} - -/** A helper function to invoke a Table generator - - This is a helper function that invokes the Table generator interface - for building an ACPI table. It uses the AcpiTableProtocol to install the - table, then frees the resources allocated for generating it. - - @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol - interface. - @param [in] CfgMgrProtocol Pointer to the Configuration Manager - Protocol Interface. - @param [in] AcpiTableProtocol Pointer to the AcpiTable protocol. - @param [in] AcpiTableInfo Pointer to the ACPI table Info. - - @retval EFI_SUCCESS Success. - @retval EFI_INVALID_PARAMETER A parameter is invalid. - @retval EFI_NOT_FOUND Required object is not found. - @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration Manager - is less than the Object size for the - requested object. -**/ -STATIC -EFI_STATUS -EFIAPI -BuildAndInstallAcpiTable ( - IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, - IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, - IN EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol, - IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo - ) -{ - EFI_STATUS Status; - CONST ACPI_TABLE_GENERATOR *Generator; - - ASSERT (TableFactoryProtocol != NULL); - ASSERT (CfgMgrProtocol != NULL); - ASSERT (AcpiTableProtocol != NULL); - ASSERT (AcpiTableInfo != NULL); - - DEBUG (( - DEBUG_INFO, - "INFO: EStdObjAcpiTableList: Address = 0x%p," \ - " TableGeneratorId = 0x%x\n", - AcpiTableInfo, - AcpiTableInfo->TableGeneratorId - )); - - Generator = NULL; - Status = TableFactoryProtocol->GetAcpiTableGenerator ( - TableFactoryProtocol, - AcpiTableInfo->TableGeneratorId, - &Generator - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "ERROR: Table Generator not found." \ - " TableGeneratorId = 0x%x. Status = %r\n", - AcpiTableInfo->TableGeneratorId, - Status - )); - return Status; - } - - if (Generator == NULL) { - return EFI_NOT_FOUND; - } - - DEBUG (( - DEBUG_INFO, - "INFO: Generator found : %s\n", - Generator->Description - )); - - if (Generator->BuildAcpiTableEx != NULL) { - Status = BuildAndInstallMultipleAcpiTable ( - TableFactoryProtocol, - CfgMgrProtocol, - Generator, - AcpiTableProtocol, - AcpiTableInfo - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "ERROR: Failed to find build and install ACPI Table." \ - " Status = %r\n", - Status - )); - } - } else if (Generator->BuildAcpiTable != NULL) { - Status = BuildAndInstallSingleAcpiTable ( - TableFactoryProtocol, - CfgMgrProtocol, - Generator, - AcpiTableProtocol, - AcpiTableInfo - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "ERROR: Failed to find build and install ACPI Table." \ - " Status = %r\n", - Status - )); - } - } else { - Status = EFI_INVALID_PARAMETER; - DEBUG (( - DEBUG_ERROR, - "ERROR: Table Generator does not implement the" \ - " ACPI_TABLE_GENERATOR_BUILD_TABLE interface." \ - " TableGeneratorId = 0x%x. Status = %r\n", - AcpiTableInfo->TableGeneratorId, - Status - )); - } - - return Status; -} - -/** The function checks if the Configuration Manager has provided the - mandatory ACPI tables for installation. - - @param [in] AcpiTableInfo Pointer to the ACPI Table Info list. - @param [in] AcpiTableCount Count of ACPI Table Info. - - @retval EFI_SUCCESS Success. - @retval EFI_NOT_FOUND If mandatory table is not found. - @retval EFI_ALREADY_STARTED If mandatory table found in AcpiTableInfo is already installed. -**/ -STATIC -EFI_STATUS -EFIAPI -VerifyMandatoryTablesArePresent ( - IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo, - IN UINT32 AcpiTableCount - ) -{ - EFI_STATUS Status; - UINTN Handle; - UINTN Index; - UINTN InstalledTableIndex; - EFI_ACPI_DESCRIPTION_HEADER *DescHeader; - EFI_ACPI_TABLE_VERSION Version; - EFI_ACPI_SDT_PROTOCOL *AcpiSdt; - - ASSERT (AcpiTableInfo != NULL); - - Status = EFI_SUCCESS; - - // Check against the statically initialized ACPI tables to see if they are in ACPI info list - while (AcpiTableCount-- != 0) { - for (Index = 0; Index < mAcpiVerifyTablesCount; Index++) { - if (AcpiTableInfo[AcpiTableCount].AcpiTableSignature == mAcpiVerifyTables[Index].AcpiTableSignature) { - mAcpiVerifyTables[Index].Presence |= ACPI_TABLE_PRESENT_INFO_LIST; - // Found this table, skip the rest. - break; - } - } - } - - // They also might be published already, so we can search from there - if (FeaturePcdGet (PcdInstallAcpiSdtProtocol)) { - AcpiSdt = NULL; - Status = gBS->LocateProtocol (&gEfiAcpiSdtProtocolGuid, NULL, (VOID **)&AcpiSdt); - - if (EFI_ERROR (Status) || (AcpiSdt == NULL)) { - DEBUG ((DEBUG_ERROR, "ERROR: Failed to locate ACPI SDT protocol (0x%p) - %r\n", AcpiSdt, Status)); - return Status; - } - - for (Index = 0; Index < mAcpiVerifyTablesCount; Index++) { - Handle = 0; - InstalledTableIndex = 0; - do { - Status = AcpiSdt->GetAcpiTable (InstalledTableIndex, (EFI_ACPI_SDT_HEADER **)&DescHeader, &Version, &Handle); - if (EFI_ERROR (Status)) { - break; - } - - InstalledTableIndex++; - } while (DescHeader->Signature != mAcpiVerifyTables[Index].AcpiTableSignature); - - if (!EFI_ERROR (Status)) { - mAcpiVerifyTables[Index].Presence |= ACPI_TABLE_PRESENT_INSTALLED; - } - } - } - - // Reset the return Status value to EFI_SUCCESS. We do not fully care if the table look up has failed. - Status = EFI_SUCCESS; - for (Index = 0; Index < mAcpiVerifyTablesCount; Index++) { - if (mAcpiVerifyTables[Index].Presence == 0) { - if (mAcpiVerifyTables[Index].IsMandatory) { - DEBUG ((DEBUG_ERROR, "ERROR: %a Table not found.\n", mAcpiVerifyTables[Index].AcpiTableName)); - Status = EFI_NOT_FOUND; - } else { - DEBUG ((DEBUG_WARN, "WARNING: %a Table not found.\n", mAcpiVerifyTables[Index].AcpiTableName)); - } - } else if (mAcpiVerifyTables[Index].Presence == - (ACPI_TABLE_PRESENT_INFO_LIST | ACPI_TABLE_PRESENT_INSTALLED)) - { - DEBUG ((DEBUG_ERROR, "ERROR: %a Table found while already published.\n", mAcpiVerifyTables[Index].AcpiTableName)); - Status = EFI_ALREADY_STARTED; - } - } - - return Status; -} - -/** Generate and install ACPI tables. - - The function gathers the information necessary for installing the - ACPI tables from the Configuration Manager, invokes the generators - and installs them (via BuildAndInstallAcpiTable). - - @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol - interface. - @param [in] CfgMgrProtocol Pointer to the Configuration Manager - Protocol Interface. - - @retval EFI_SUCCESS Success. - @retval EFI_NOT_FOUND If a mandatory table or a generator is not found. - @retval EFI_ALREADY_STARTED If mandatory table found in AcpiTableInfo is already installed. -**/ -STATIC -EFI_STATUS -EFIAPI -ProcessAcpiTables ( - IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, - IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol - ) -{ - EFI_STATUS Status; - EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol; - CM_STD_OBJ_ACPI_TABLE_INFO *AcpiTableInfo; - UINT32 AcpiTableCount; - UINT32 Idx; - - ASSERT (TableFactoryProtocol != NULL); - ASSERT (CfgMgrProtocol != NULL); - - // Find the AcpiTable protocol - Status = gBS->LocateProtocol ( - &gEfiAcpiTableProtocolGuid, - NULL, - (VOID **)&AcpiTableProtocol - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "ERROR: Failed to find AcpiTable protocol. Status = %r\n", - Status - )); - return Status; - } - - Status = GetEStdObjAcpiTableList ( - CfgMgrProtocol, - CM_NULL_TOKEN, - &AcpiTableInfo, - &AcpiTableCount - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "ERROR: Failed to get ACPI Table List. Status = %r\n", - Status - )); - return Status; - } - - if (0 == AcpiTableCount) { - DEBUG (( - DEBUG_ERROR, - "ERROR: EStdObjAcpiTableList: AcpiTableCount = %d\n", - AcpiTableCount - )); - return EFI_NOT_FOUND; - } - - DEBUG (( - DEBUG_INFO, - "INFO: EStdObjAcpiTableList: AcpiTableCount = %d\n", - AcpiTableCount - )); - - // Check if mandatory ACPI tables are present. - Status = VerifyMandatoryTablesArePresent ( - AcpiTableInfo, - AcpiTableCount - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "ERROR: Failed to verify mandatory ACPI Table(s) presence." - " Status = %r\n", - Status - )); - return Status; - } - - // Add the FADT Table first. - if ((mAcpiVerifyTablesFadtIndex >= 0) && - ((mAcpiVerifyTables[mAcpiVerifyTablesFadtIndex].Presence & ACPI_TABLE_PRESENT_INSTALLED) == 0)) - { - // FADT is not yet installed - for (Idx = 0; Idx < AcpiTableCount; Idx++) { - if (CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdFadt) == - AcpiTableInfo[Idx].TableGeneratorId) - { - Status = BuildAndInstallAcpiTable ( - TableFactoryProtocol, - CfgMgrProtocol, - AcpiTableProtocol, - &AcpiTableInfo[Idx] - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "ERROR: Failed to find build and install ACPI FADT Table." \ - " Status = %r\n", - Status - )); - return Status; - } - - break; - } - } // for - } - - // Add remaining ACPI Tables - for (Idx = 0; Idx < AcpiTableCount; Idx++) { - DEBUG (( - DEBUG_INFO, - "INFO: AcpiTableInfo[%d].TableGeneratorId = 0x%x\n", - Idx, - AcpiTableInfo[Idx].TableGeneratorId - )); - - // Skip FADT Table since we have already added - if (CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdFadt) == - AcpiTableInfo[Idx].TableGeneratorId) - { - continue; - } - - // Skip the Reserved table Generator ID for standard generators - if ((IS_GENERATOR_NAMESPACE_STD (AcpiTableInfo[Idx].TableGeneratorId)) && - ((CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdReserved) >= - AcpiTableInfo[Idx].TableGeneratorId) || - (CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdMax) <= - AcpiTableInfo[Idx].TableGeneratorId))) - { - DEBUG (( - DEBUG_WARN, - "WARNING: Invalid ACPI Generator table ID = 0x%x, Skipping...\n", - AcpiTableInfo[Idx].TableGeneratorId - )); - continue; - } - - Status = BuildAndInstallAcpiTable ( - TableFactoryProtocol, - CfgMgrProtocol, - AcpiTableProtocol, - &AcpiTableInfo[Idx] - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "ERROR: Failed to find, build, and install ACPI Table." \ - " Status = %r\n", - Status - )); - return Status; - } - } // for - - return Status; -} +STATIC VOID *mAcpiTableProtocolRegistration; /** Entrypoint of Dynamic Table Manager Dxe. @@ -673,13 +37,15 @@ ProcessAcpiTables ( table and invokes another generator interface to free any resources allocated for building the table. - @param ImageHandle - @param SystemTable + Since platforms may support generation of either ACPI or SMBIOS or both + tables, register for notification of the corresponding protocols being + ready and dispatch their table builds accordingly. + + @param ImageHandle Handle to the image. + @param SystemTable Pointer to the system table. @retval EFI_SUCCESS Success. @retval EFI_OUT_OF_RESOURCES Memory allocation failed. - @retval EFI_NOT_FOUND Required interface/object was not found. - @retval EFI_INVALID_PARAMETER Some parameter is incorrect/invalid. **/ EFI_STATUS EFIAPI @@ -688,95 +54,22 @@ DynamicTableManagerDxeInitialize ( IN EFI_SYSTEM_TABLE *SystemTable ) { - EFI_STATUS Status; - EDKII_CONFIGURATION_MANAGER_PROTOCOL *CfgMgrProtocol; - CM_STD_OBJ_CONFIGURATION_MANAGER_INFO *CfgMfrInfo; - EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *TableFactoryProtocol; - METADATA_ROOT_HANDLE Root; - - // Locate the Dynamic Table Factory - Status = gBS->LocateProtocol ( - &gEdkiiDynamicTableFactoryProtocolGuid, - NULL, - (VOID **)&TableFactoryProtocol - ); - if (EFI_ERROR (Status)) { + EFI_EVENT AcpiEvent; + + AcpiEvent = EfiCreateProtocolNotifyEvent ( + &gEfiAcpiTableProtocolGuid, + TPL_CALLBACK, + AcpiTableProtocolReady, + NULL, + &mAcpiTableProtocolRegistration + ); + if (AcpiEvent == NULL) { DEBUG (( DEBUG_ERROR, - "ERROR: Failed to find Dynamic Table Factory protocol." \ - " Status = %r\n", - Status + "Failed to register ACPI protocol notification event.\n" )); - return Status; + return EFI_OUT_OF_RESOURCES; } - // Locate the Configuration Manager for the Platform - Status = gBS->LocateProtocol ( - &gEdkiiConfigurationManagerProtocolGuid, - NULL, - (VOID **)&CfgMgrProtocol - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "ERROR: Failed to find Configuration Manager protocol. Status = %r\n", - Status - )); - return Status; - } - - Status = GetCgfMgrInfo (CfgMgrProtocol, &CfgMfrInfo); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "ERROR: Failed to get Configuration Manager info. Status = %r\n", - Status - )); - return Status; - } - - DEBUG (( - DEBUG_INFO, - "INFO: Configuration Manager Version = 0x%x, OemID = %c%c%c%c%c%c\n", - CfgMfrInfo->Revision, - CfgMfrInfo->OemId[0], - CfgMfrInfo->OemId[1], - CfgMfrInfo->OemId[2], - CfgMfrInfo->OemId[3], - CfgMfrInfo->OemId[4], - CfgMfrInfo->OemId[5] - )); - - Status = GetAcpiTablePresenceInfo ( - &mAcpiVerifyTables, - &mAcpiVerifyTablesCount, - &mAcpiVerifyTablesFadtIndex - ); - if (EFI_ERROR (Status)) { - ASSERT_EFI_ERROR (Status); - return Status; - } - - Status = ProcessAcpiTables (TableFactoryProtocol, CfgMgrProtocol); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "ERROR: ACPI Table processing failure. Status = %r\n", - Status - )); - return Status; - } - - Root = TableFactoryProtocol->GetMetadataRoot (); - - // Validate the collected Metadata. - Status = MetadataHandlerValidate (Root); - if (EFI_ERROR (Status)) { - ASSERT_EFI_ERROR (Status); - return Status; - } - - MetadataFreeHandle (Root); - - return Status; + return EFI_SUCCESS; } diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.h b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.h index a12a775af132..7fed699acfe2 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.h +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.h @@ -60,4 +60,21 @@ GetAcpiTablePresenceInfo ( OUT INT32 *FadtIndex ); +/** ACPI table Protocol ready event handler. + + This event notification indicates that the ACPI protocol is ready. + Therefore, dispatch the building of the ACPI tables. + + @param [in] Event The Event that is signalled. + @param [in] Context The Context information. + + @retval None +**/ +VOID +EFIAPI +AcpiTableProtocolReady ( + IN EFI_EVENT Event, + IN VOID *Context + ); + #endif // DYNAMIC_TABLE_MANAGER_DXE_H_ diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf index 17358c789b98..cdece2cfb692 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf @@ -26,6 +26,7 @@ DynamicTableManagerDxe.h SmbiosTableDispatcher.c SmbiosTableDispatcher.h + AcpiTableBuilder.c [Sources.AARCH64] Arm/ArmDynamicTableManager.c @@ -44,6 +45,7 @@ TableHelperLib UefiBootServicesTableLib UefiDriverEntryPoint + UefiLib [FeaturePcd] gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol ## CONSUMES @@ -56,7 +58,6 @@ gEdkiiDynamicTableFactoryProtocolGuid # PROTOCOL ALWAYS_CONSUMED [Depex] - gEfiAcpiTableProtocolGuid AND gEdkiiConfigurationManagerProtocolGuid AND gEdkiiDynamicTableFactoryProtocolGuid From 5a8411a7b0382e5f5b2412d2fb7e684ac10723b2 Mon Sep 17 00:00:00 2001 From: Girish Mahadevan Date: Tue, 11 Mar 2025 10:24:25 -0600 Subject: [PATCH 0587/1172] DynamicTablesPkg: Add SMBIOS table generation Add the SMBIOS Table generator code to the DynamicTablesPkg. This change includes adding new logic to the DynamicTableManager to process and add SMBIOS tables and augmenting the existing SMBIOS Factory generator to include installing multiple SMBIOS tables. Signed-off-by: Girish Mahadevan --- .../DynamicTableFactory.h | 7 + .../DynamicTableFactoryDxe.c | 9 + .../DynamicTableFactoryDxe.inf | 1 + .../SmbiosTableFactory/SmbiosTableFactory.c | 107 +++ .../DynamicTableManagerDxe.c | 18 + .../DynamicTableManagerDxe.h | 17 + .../DynamicTableManagerDxe.inf | 5 +- .../SmbiosTableBuilder.c | 623 ++++++++++++++++++ DynamicTablesPkg/DynamicTablesPkg.dec | 4 + .../Protocol/DynamicTableFactoryProtocol.h | 9 + .../Include/SmbiosTableGenerator.h | 246 ++++++- 11 files changed, 1026 insertions(+), 20 deletions(-) create mode 100644 DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableBuilder.c diff --git a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactory.h b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactory.h index b160dcf8add8..ec815def9fdb 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactory.h +++ b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactory.h @@ -49,6 +49,13 @@ typedef struct DynamicTableFactoryInfo { CustomDtTableGeneratorList[FixedPcdGet16 ( PcdMaxCustomDTGenerators )]; + + /// An array for holding a map of SMBIOS handles and the CM Object + /// token used to build the SMBIOS record. + SMBIOS_HANDLE_MAP + SmbiosHandleMap[FixedPcdGet16 ( + PcdMaxSmbiosHandleMapEntries + )]; } EDKII_DYNAMIC_TABLE_FACTORY_INFO; /** Return a pointer to the ACPI table generator. diff --git a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.c b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.c index 4f38a062e85b..1c6a8d0bf751 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.c +++ b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.c @@ -65,6 +65,9 @@ EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL DynamicTableFactoryProtocol = { RegisterDtTableGenerator, DeregisterDtTableGenerator, GetMetadataRoot, + AddSmbiosHandle, + FindSmbiosHandle, + FindSmbiosHandleEx, &TableFactoryInfo }; @@ -86,6 +89,12 @@ DynamicTableFactoryDxeInitialize ( ) { EFI_STATUS Status; + UINTN Idx; + + for (Idx = 0; Idx < FixedPcdGet16 (PcdMaxSmbiosHandleMapEntries); Idx++) { + TableFactoryInfo.SmbiosHandleMap[Idx].SmbiosTblHandle = SMBIOS_HANDLE_PI_RESERVED; + TableFactoryInfo.SmbiosHandleMap[Idx].SmbiosCmToken = 0; + } Status = MetadataInitializeHandle (&mMetadataRoot); if (EFI_ERROR (Status)) { diff --git a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.inf b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.inf index 3a4a7bab7e8c..d0f6bfb8c7b6 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.inf +++ b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.inf @@ -39,6 +39,7 @@ gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdMaxCustomACPIGenerators gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdMaxCustomSMBIOSGenerators gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdMaxCustomDTGenerators + gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdMaxSmbiosHandleMapEntries [Protocols] gEdkiiDynamicTableFactoryProtocolGuid # PRODUCES diff --git a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/SmbiosTableFactory/SmbiosTableFactory.c b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/SmbiosTableFactory/SmbiosTableFactory.c index 87795919f846..7b3a71b8e99c 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/SmbiosTableFactory/SmbiosTableFactory.c +++ b/DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/SmbiosTableFactory/SmbiosTableFactory.c @@ -12,6 +12,7 @@ #include #include #include +#include #include // Module specific include files. @@ -24,6 +25,112 @@ extern EDKII_DYNAMIC_TABLE_FACTORY_INFO TableFactoryInfo; +/** Add a new entry to the SMBIOS table Map. + + @param [in] Smbios SMBIOS Protocol pointer. + @param [in] SmbiosHandle SMBIOS Handle to be added. + @param [in] CmObjectToken CmObjectToken of the CM_OBJECT used to build the SMBIOS Table + @param [in] GeneratorId Smbios Table Generator Id. + + @retval EFI_SUCCESS Successfully added/generated the handle. + @retval EFI_OUT_OF_RESOURCES Failure to add/generate the handle. +**/ +EFI_STATUS +EFIAPI +AddSmbiosHandle ( + IN EFI_SMBIOS_PROTOCOL *Smbios, + IN SMBIOS_HANDLE *SmbiosHandle, + IN CM_OBJECT_TOKEN CmObjectToken, + IN SMBIOS_TABLE_GENERATOR_ID GeneratorId + ) +{ + EFI_STATUS Status; + UINTN Index; + + Status = EFI_OUT_OF_RESOURCES; + + for (Index = 0; Index < FixedPcdGet16 (PcdMaxSmbiosHandleMapEntries); Index++) { + if (TableFactoryInfo.SmbiosHandleMap[Index].SmbiosTblHandle == SMBIOS_HANDLE_PI_RESERVED) { + TableFactoryInfo.SmbiosHandleMap[Index].SmbiosTblHandle = *SmbiosHandle; + TableFactoryInfo.SmbiosHandleMap[Index].SmbiosCmToken = CmObjectToken; + TableFactoryInfo.SmbiosHandleMap[Index].SmbiosGeneratorId = GeneratorId; + Status = EFI_SUCCESS; + break; + } + } + + return Status; +} + +/** Return a pointer to the SMBIOS table Map. + + @param [in] GeneratorId The CmObjectToken to look up an SMBIOS Handle. + + @retval SMBIOS_HANDLE_MAP Pointer to the SMBIOS Handle Map if the + CmObjectToken is found. + @retval NULL if CmObjectToken is not found. +**/ +SMBIOS_HANDLE_MAP * +EFIAPI +FindSmbiosHandle ( + CM_OBJECT_TOKEN CmObjectToken + ) +{ + UINTN Index; + SMBIOS_HANDLE_MAP *SmbiosHandleMap; + + SmbiosHandleMap = NULL; + for (Index = 0; Index < FixedPcdGet16 (PcdMaxSmbiosHandleMapEntries); Index++) { + if (TableFactoryInfo.SmbiosHandleMap[Index].SmbiosCmToken == CmObjectToken) { + SmbiosHandleMap = &TableFactoryInfo.SmbiosHandleMap[Index]; + break; + } + } + + return SmbiosHandleMap; +} + +/** Find and return SMBIOS handle based on associated CM object token. + + @param [in] GeneratorId SMBIOS generator ID used to build the SMBIOS Table. + @param [in] CmObjectToken Token of the CM_OBJECT used to build the SMBIOS Table. + + @return SMBIOS handle of the table associated with SmbiosGeneratorId and + CmObjectToken if found. Otherwise, returns SMBIOS_HANDLE_INVALID. +**/ +SMBIOS_HANDLE +EFIAPI +FindSmbiosHandleEx ( + IN SMBIOS_TABLE_GENERATOR_ID GeneratorId, + IN CM_OBJECT_TOKEN CmObjToken + ) +{ + SMBIOS_HANDLE_MAP *HandleMap; + + if (CmObjToken == CM_NULL_TOKEN) { + return SMBIOS_HANDLE_INVALID; + } + + HandleMap = FindSmbiosHandle (CmObjToken); + if (HandleMap == NULL) { + return SMBIOS_HANDLE_INVALID; + } + + if (HandleMap->SmbiosGeneratorId != GeneratorId) { + DEBUG (( + DEBUG_ERROR, + "%a: Expect ID %d but get %d\n", + __func__, + GeneratorId, + HandleMap->SmbiosGeneratorId + )); + ASSERT (FALSE); + return SMBIOS_HANDLE_INVALID; + } + + return HandleMap->SmbiosTblHandle; +} + /** Return a pointer to the SMBIOS table generator. @param [in] This Pointer to the Dynamic Table Factory Protocol. diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.c b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.c index d29ea7ad2a55..9cd48ae3dbe2 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.c +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.c @@ -25,6 +25,7 @@ #include "DynamicTableManagerDxe.h" STATIC VOID *mAcpiTableProtocolRegistration; +STATIC VOID *mSmbiosProtocolRegistration; /** Entrypoint of Dynamic Table Manager Dxe. @@ -55,6 +56,7 @@ DynamicTableManagerDxeInitialize ( ) { EFI_EVENT AcpiEvent; + EFI_EVENT SmbiosEvent; AcpiEvent = EfiCreateProtocolNotifyEvent ( &gEfiAcpiTableProtocolGuid, @@ -71,5 +73,21 @@ DynamicTableManagerDxeInitialize ( return EFI_OUT_OF_RESOURCES; } + SmbiosEvent = EfiCreateProtocolNotifyEvent ( + &gEfiSmbiosProtocolGuid, + TPL_CALLBACK, + SmbiosProtocolReady, + NULL, + &mSmbiosProtocolRegistration + ); + if (SmbiosEvent == NULL) { + DEBUG (( + DEBUG_ERROR, + "Failed to register SMBIOS protocol notification event.\n" + )); + gBS->CloseEvent (AcpiEvent); + return EFI_OUT_OF_RESOURCES; + } + return EFI_SUCCESS; } diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.h b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.h index 7fed699acfe2..4b145c2b0af0 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.h +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.h @@ -77,4 +77,21 @@ AcpiTableProtocolReady ( IN VOID *Context ); +/** SMBIOS table Protocol ready event handler. + + This event notification indicates that the SMBIOS protocol is ready. + Therefore, dispatch the building of the SMBIOS tables. + + @param [in] Event The Event that is signalled. + @param [in] Context The Context information. + + @retval None +**/ +VOID +EFIAPI +SmbiosProtocolReady ( + IN EFI_EVENT Event, + IN VOID *Context + ); + #endif // DYNAMIC_TABLE_MANAGER_DXE_H_ diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf index cdece2cfb692..dcbe95c6c65b 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf @@ -1,5 +1,5 @@ ## @file -# Module that drives the table generation and installation process. +# Module that drives the table generation and installation process. # # Copyright (c) 2017 - 2022, Arm Limited. All rights reserved. # Copyright (c) 2024 Advanced Micro Devices, Inc. All rights reserved. @@ -27,6 +27,7 @@ SmbiosTableDispatcher.c SmbiosTableDispatcher.h AcpiTableBuilder.c + SmbiosTableBuilder.c [Sources.AARCH64] Arm/ArmDynamicTableManager.c @@ -53,7 +54,7 @@ [Protocols] gEfiAcpiTableProtocolGuid # PROTOCOL ALWAYS_CONSUMED gEfiAcpiSdtProtocolGuid # PROTOCOL ALWAYS_CONSUMED - + gEfiSmbiosProtocolGuid # PROTOCOL ALWAYS_CONSUMED gEdkiiConfigurationManagerProtocolGuid # PROTOCOL ALWAYS_CONSUMED gEdkiiDynamicTableFactoryProtocolGuid # PROTOCOL ALWAYS_CONSUMED diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableBuilder.c b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableBuilder.c new file mode 100644 index 000000000000..80a012ca05f5 --- /dev/null +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableBuilder.c @@ -0,0 +1,623 @@ +/** @file + SMBIOS Table Builder. + + Copyright (c) 2017 - 2019, ARM Limited. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include + +// Module specific include files. +#include +#include +#include +#include +#include +#include +#include +#include + +/** This macro expands to a function that retrieves the SMBIOS Table + List from the Configuration Manager. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceStandard, + EStdObjSmbiosTableList, + CM_STD_OBJ_SMBIOS_TABLE_INFO + ) + +/** A helper function to build and install an SMBIOS table. + + This is a helper function that invokes the Table generator interface + for building an SMBIOS table. It uses the SmbiosProtocol to install the + table, then frees the resources allocated for generating it. + + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol + interface. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] Generator Pointer to the SMBIOS table Generator. + @param [in] SmbiosProtocol Pointer to the SMBIOS protocol. + @param [in] SmbiosTableInfo Pointer to the SMBIOS table Info. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND Required object is not found. + @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration Manager + is less than the Object size for the + requested object. +**/ +STATIC +EFI_STATUS +EFIAPI +BuildAndInstallSingleSmbiosTable ( + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN CONST SMBIOS_TABLE_GENERATOR *CONST Generator, + IN EFI_SMBIOS_PROTOCOL *SmbiosProtocol, + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo + ) +{ + EFI_STATUS Status; + EFI_STATUS Status1; + SMBIOS_STRUCTURE *SmbiosTable; + CM_OBJECT_TOKEN CmObjToken; + EFI_SMBIOS_HANDLE TableHandle; + + SmbiosTable = NULL; + Status = Generator->BuildSmbiosTable ( + Generator, + TableFactoryProtocol, + SmbiosTableInfo, + CfgMgrProtocol, + &SmbiosTable, + &CmObjToken + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to Build Table." \ + " TableGeneratorId = 0x%x. Status = %r\n", + SmbiosTableInfo->TableGeneratorId, + Status + )); + // Free any allocated resources. + goto exit_handler; + } + + if (SmbiosTable == NULL) { + Status = EFI_NOT_FOUND; + goto exit_handler; + } + + TableHandle = SMBIOS_HANDLE_PI_RESERVED; + + // Install SMBIOS table + Status = SmbiosProtocol->Add ( + SmbiosProtocol, + NULL, + &TableHandle, + SmbiosTable + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to Install SMBIOS Table. Status = %r\n", + Status + )); + // Free any allocated resources. + goto exit_handler; + } + + Status = TableFactoryProtocol->AddSmbiosHandle ( + SmbiosProtocol, + &TableHandle, + CmObjToken, + SmbiosTableInfo->TableGeneratorId + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to Add SMBIOS Handle. Status = %r\n", + Status + )); + // Free any allocated resources. + goto exit_handler; + } + + DEBUG (( + DEBUG_INFO, + "INFO: SMBIOS Table installed. Status = %r\n", + Status + )); + +exit_handler: + // Free any resources allocated for generating the tables. + if (Generator->FreeTableResources != NULL) { + Status1 = Generator->FreeTableResources ( + Generator, + TableFactoryProtocol, + SmbiosTableInfo, + CfgMgrProtocol, + &SmbiosTable + ); + if (EFI_ERROR (Status1)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to Free Table Resources." \ + "TableGeneratorId = 0x%x. Status = %r\n", + SmbiosTableInfo->TableGeneratorId, + Status1 + )); + } + + // Return the first error status in case of failure + if (!EFI_ERROR (Status)) { + Status = Status1; + } + } + + return Status; +} + +/** A helper function to build and install multiple SMBIOS tables. + + This is a helper function that invokes the Table generator interface + for building SMBIOS tables. It uses the SmbiosProtocol to install the + tables, then frees the resources allocated for generating it. + + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol + interface. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] Generator Pointer to the SmbiosTable generator. + @param [in] SmbiosProtocol Pointer to the Smbios protocol. + @param [in] SmbiosTableInfo Pointer to the SMBIOS table Info. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND Required object is not found. + @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration Manager + is less than the Object size for the + requested object. +**/ +STATIC +EFI_STATUS +EFIAPI +BuildAndInstallMultipleSmbiosTables ( + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN CONST SMBIOS_TABLE_GENERATOR *CONST Generator, + IN EFI_SMBIOS_PROTOCOL *SmbiosProtocol, + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo + ) +{ + EFI_STATUS Status; + EFI_STATUS Status1; + SMBIOS_STRUCTURE **SmbiosTable; + CM_OBJECT_TOKEN *CmObjToken; + EFI_SMBIOS_HANDLE TableHandle; + UINTN TableCount; + UINTN Index; + + TableCount = 0; + Status = Generator->BuildSmbiosTableEx ( + Generator, + TableFactoryProtocol, + SmbiosTableInfo, + CfgMgrProtocol, + &SmbiosTable, + &CmObjToken, + &TableCount + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to Build Table." \ + " TableGeneratorId = 0x%x. Status = %r\n", + SmbiosTableInfo->TableGeneratorId, + Status + )); + // Free any allocated resources. + goto exit_handler; + } + + if ((SmbiosTable == NULL) || (TableCount == 0)) { + Status = EFI_NOT_FOUND; + DEBUG (( + DEBUG_ERROR, + "%a: TableCount %u SmbiosTable %p \n", + __func__, + TableCount, + SmbiosTable + )); + goto exit_handler; + } + + for (Index = 0; Index < TableCount; Index++) { + TableHandle = SMBIOS_HANDLE_PI_RESERVED; + + // Install SMBIOS table + Status = SmbiosProtocol->Add ( + SmbiosProtocol, + NULL, + &TableHandle, + SmbiosTable[Index] + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to Install SMBIOS Table. Status = %r\n", + Status + )); + // Free any allocated resources. + goto exit_handler; + } + + Status = TableFactoryProtocol->AddSmbiosHandle ( + SmbiosProtocol, + &TableHandle, + CmObjToken[Index], + SmbiosTableInfo->TableGeneratorId + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to Add SMBIOS Handle. Status = %r\n", + Status + )); + // Free any allocated resources. + goto exit_handler; + } + + DEBUG (( + DEBUG_INFO, + "INFO: SMBIOS Table installed. Status = %r\n", + Status + )); + } + +exit_handler: + // Free any resources allocated for generating the tables. + if (Generator->FreeTableResourcesEx != NULL) { + Status1 = Generator->FreeTableResourcesEx ( + Generator, + TableFactoryProtocol, + SmbiosTableInfo, + CfgMgrProtocol, + &SmbiosTable, + &CmObjToken, + TableCount + ); + if (EFI_ERROR (Status1)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to Free Table Resources." \ + "TableGeneratorId = 0x%x. Status = %r\n", + SmbiosTableInfo->TableGeneratorId, + Status1 + )); + } + + // Return the first error status in case of failure + if (!EFI_ERROR (Status)) { + Status = Status1; + } + } + + return Status; +} + +/** A helper function to invoke a Table generator + + This is a helper function that invokes the Table generator interface + for building an SMBIOS table. It uses the SmbiosProtocol to install the + table, then frees the resources allocated for generating it. + + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol + interface. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] SmbiosProtocol Pointer to the SMBIOS protocol. + @param [in] SmbiosTableInfo Pointer to the SMBIOS table Info. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND Required object is not found. + @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration Manager + is less than the Object size for the + requested object. +**/ +EFI_STATUS +EFIAPI +BuildAndInstallSmbiosTable ( + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN EFI_SMBIOS_PROTOCOL *SmbiosProtocol, + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo + ) +{ + EFI_STATUS Status; + CONST SMBIOS_TABLE_GENERATOR *Generator; + + ASSERT (TableFactoryProtocol != NULL); + ASSERT (CfgMgrProtocol != NULL); + ASSERT (SmbiosProtocol != NULL); + ASSERT (SmbiosTableInfo != NULL); + + DEBUG (( + DEBUG_INFO, + "INFO: EStdObjSmbiosTableList: Address = 0x%p," \ + " TableGeneratorId = 0x%x\n", + SmbiosTableInfo, + SmbiosTableInfo->TableGeneratorId + )); + + Generator = NULL; + Status = TableFactoryProtocol->GetSmbiosTableGenerator ( + TableFactoryProtocol, + SmbiosTableInfo->TableGeneratorId, + &Generator + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Table Generator not found." \ + " TableGeneratorId = 0x%x. Status = %r\n", + SmbiosTableInfo->TableGeneratorId, + Status + )); + return Status; + } + + if (Generator == NULL) { + return EFI_NOT_FOUND; + } + + DEBUG (( + DEBUG_INFO, + "INFO: Generator found : %s\n", + Generator->Description + )); + + if (Generator->BuildSmbiosTableEx != NULL) { + Status = BuildAndInstallMultipleSmbiosTables ( + TableFactoryProtocol, + CfgMgrProtocol, + Generator, + SmbiosProtocol, + SmbiosTableInfo + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to find build and install SMBIOS Tables." \ + " Status = %r\n", + Status + )); + } + } else if (Generator->BuildSmbiosTable != NULL) { + Status = BuildAndInstallSingleSmbiosTable ( + TableFactoryProtocol, + CfgMgrProtocol, + Generator, + SmbiosProtocol, + SmbiosTableInfo + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to find build and install SMBIOS Table." \ + " Status = %r\n", + Status + )); + } + } else { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "ERROR: Table Generator does not implement the" \ + "SMBIOS_TABLE_GENERATOR_BUILD_TABLE interface." \ + " TableGeneratorId = 0x%x. Status = %r\n", + SmbiosTableInfo->TableGeneratorId, + Status + )); + } + + return Status; +} + +/** Generate and install SMBIOS tables. + + The function gathers the information necessary for installing the + SMBIOS tables from the Configuration Manager, invokes the generators + and installs them (via BuildAndInstallAcpiTable). + + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol + interface. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + + @retval EFI_SUCCESS Success. + @retval EFI_NOT_FOUND If a mandatory table or a generator is not found. +**/ +STATIC +EFI_STATUS +EFIAPI +ProcessSmbiosTables ( + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol + ) +{ + EFI_STATUS Status; + EFI_SMBIOS_PROTOCOL *SmbiosProtocol; + CM_STD_OBJ_SMBIOS_TABLE_INFO *SmbiosTableInfo; + UINT32 SmbiosTableCount; + + Status = gBS->LocateProtocol ( + &gEfiSmbiosProtocolGuid, + NULL, + (VOID **)&SmbiosProtocol + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Could not locate SMBIOS protocol. %r\n", Status)); + return Status; + } + + Status = GetEStdObjSmbiosTableList ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &SmbiosTableInfo, + &SmbiosTableCount + ); + if (EFI_ERROR (Status)) { + if (Status == EFI_NOT_FOUND) { + // If the SMBIOS table list is not found the platform + // may not be publishing SMBIOS tables + // Log a warning and return success. + DEBUG (( + DEBUG_WARN, + "WARNING: Failed to get SMBIOS table List. Status = %r\n", + Status + )); + Status = EFI_SUCCESS; + } else { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to get SMBIOS Table List. Status = %r\n", + Status + )); + } + + return Status; + } + + if (SmbiosTableCount == 0) { + DEBUG (( + DEBUG_ERROR, + "ERROR: EStdObjSmbiosTableList: SmbiosTableCount = %d\n", + SmbiosTableCount + )); + return EFI_NOT_FOUND; + } + + DEBUG (( + DEBUG_INFO, + "INFO: EStdObjSmbiosTableList: SmbiosTableCount = %d\n", + SmbiosTableCount + )); + + InitSmbiosTableDispatcher (SmbiosTableInfo, SmbiosTableCount); + + Status = DispatchSmbiosTables ( + TableFactoryProtocol, + CfgMgrProtocol, + SmbiosProtocol, + SmbiosTableInfo, + SmbiosTableCount + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to install SMBIOS Tables.Status = %r\n", + Status + )); + } + + return Status; +} + +/** SMBIOS table Protocol ready event handler. + + This event notification indicates that the SMBIOS protocol is ready. + Therefore, dispatch the building of the SMBIOS tables. + + @param [in] Event The Event that is signalled. + @param [in] Context The Context information. + + @retval None +**/ +VOID +EFIAPI +SmbiosProtocolReady ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_STATUS Status; + EDKII_CONFIGURATION_MANAGER_PROTOCOL *CfgMgrProtocol; + CM_STD_OBJ_CONFIGURATION_MANAGER_INFO *CfgMfrInfo; + EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *TableFactoryProtocol; + + // Locate the Dynamic Table Factory + Status = gBS->LocateProtocol ( + &gEdkiiDynamicTableFactoryProtocolGuid, + NULL, + (VOID **)&TableFactoryProtocol + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to find Dynamic Table Factory protocol." \ + " Status = %r\n", + Status + )); + return; + } + + // Locate the Configuration Manager for the Platform + Status = gBS->LocateProtocol ( + &gEdkiiConfigurationManagerProtocolGuid, + NULL, + (VOID **)&CfgMgrProtocol + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to find Configuration Manager protocol. Status = %r\n", + Status + )); + return; + } + + Status = GetCgfMgrInfo (CfgMgrProtocol, &CfgMfrInfo); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: Failed to get Configuration Manager info. Status = %r\n", + Status + )); + return; + } + + DEBUG (( + DEBUG_INFO, + "INFO: Configuration Manager Version = 0x%x, OemID = %c%c%c%c%c%c\n", + CfgMfrInfo->Revision, + CfgMfrInfo->OemId[0], + CfgMfrInfo->OemId[1], + CfgMfrInfo->OemId[2], + CfgMfrInfo->OemId[3], + CfgMfrInfo->OemId[4], + CfgMfrInfo->OemId[5] + )); + + Status = ProcessSmbiosTables (TableFactoryProtocol, CfgMgrProtocol); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SMBIOS Table processing failure. Status = %r\n", + Status + )); + } + + Status = gBS->CloseEvent (Event); + ASSERT_EFI_ERROR (Status); +} diff --git a/DynamicTablesPkg/DynamicTablesPkg.dec b/DynamicTablesPkg/DynamicTablesPkg.dec index 71e76e62330d..d0aa4bcf7621 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dec +++ b/DynamicTablesPkg/DynamicTablesPkg.dec @@ -77,6 +77,10 @@ # Maximum number of Custom DT Generators gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdMaxCustomDTGenerators|1|UINT16|0xC0000003 + # Maximum number of Entries in the SMBIOS Handle Map + # Note that a larger value may degrade performance. + gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdMaxSmbiosHandleMapEntries|255|UINT16|0xC0000004 + # Non BSA Compliant 16550 Serial HID gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdNonBsaCompliant16550SerialHid|""|VOID*|0x40000008 diff --git a/DynamicTablesPkg/Include/Protocol/DynamicTableFactoryProtocol.h b/DynamicTablesPkg/Include/Protocol/DynamicTableFactoryProtocol.h index c601e407dc0c..f179bcb77ed0 100644 --- a/DynamicTablesPkg/Include/Protocol/DynamicTableFactoryProtocol.h +++ b/DynamicTablesPkg/Include/Protocol/DynamicTableFactoryProtocol.h @@ -258,6 +258,15 @@ typedef struct DynamicTableFactoryProtocol { EDKII_DYNAMIC_TABLE_FACTORY_GET_METADATA_ROOT GetMetadataRoot; + EDKII_DYNAMIC_TABLE_FACTORY_SMBIOS_TABLE_ADD_HANDLE + AddSmbiosHandle; + + EDKII_DYNAMIC_TABLE_FACTORY_SMBIOS_TABLE_GET_HANDLE + GetSmbiosHandle; + + EDKII_DYNAMIC_TABLE_FACTORY_SMBIOS_TABLE_GET_HANDLE_EX + GetSmbiosHandleEx; + /** Pointer to the data structure that holds the list of registered table generators */ diff --git a/DynamicTablesPkg/Include/SmbiosTableGenerator.h b/DynamicTablesPkg/Include/SmbiosTableGenerator.h index 934d56c90dda..63d03033a90b 100644 --- a/DynamicTablesPkg/Include/SmbiosTableGenerator.h +++ b/DynamicTablesPkg/Include/SmbiosTableGenerator.h @@ -10,7 +10,7 @@ #define SMBIOS_TABLE_GENERATOR_H_ #include - +#include #include #pragma pack(1) @@ -127,68 +127,216 @@ typedef enum StdSmbiosTableGeneratorId { typedef struct ConfigurationManagerProtocol EDKII_CONFIGURATION_MANAGER_PROTOCOL; typedef struct CmStdObjSmbiosTableInfo CM_STD_OBJ_SMBIOS_TABLE_INFO; typedef struct SmbiosTableGenerator SMBIOS_TABLE_GENERATOR; +typedef struct DynamicTableFactoryProtocol EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL; +typedef UINTN CM_OBJECT_TOKEN; + +/** An array for holding a map of SMBIOS handles and the CM Object + token used to build the SMBIOS record for a given SMBIOS Table Generator. + This array is maintained by the Dynamic Table Factory Protocol and is + used by SMBIOS table generators to look up other SMBIOS table handles that + the Table being generated needs to reference. +**/ +typedef struct SmbiosHandleCmObjMap { + SMBIOS_TABLE_GENERATOR_ID SmbiosGeneratorId; + SMBIOS_HANDLE SmbiosTblHandle; + CM_OBJECT_TOKEN SmbiosCmToken; +} SMBIOS_HANDLE_MAP; /** This function pointer describes the interface to SMBIOS table build functions provided by the SMBIOS table generator and called by the Table Manager to build an SMBIOS table. - - @param [in] Generator Pointer to the SMBIOS table generator. - @param [in] SmbiosTableInfo Pointer to the SMBIOS table information. - @param [in] CfgMgrProtocol Pointer to the Configuration Manager - Protocol interface. - @param [out] Table Pointer to the generated SMBIOS table. + The function will return a pointer to the SMBIOS table and a pointer + to the CM_OBJECT_TOKEN of the CM_OBJECT that was used to build the + SMBIOS table. + + @param [in] Generator Pointer to the SMBIOS table generator. + @param [in] TableFactoryProtocol Pointer to the Dynamic TableFactory Protocol. + @param [in] SmbiosTableInfo Pointer to the SMBIOS table information. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol interface. + @param [out] Table Pointer to the generated SMBIOS table. + @param [out] CmObjToken Pointer to the CM_OBJECT_TOKEN + for the SMBIOS table. @return EFI_SUCCESS If the table is generated successfully or other failure codes as returned by the generator. **/ typedef EFI_STATUS (*SMBIOS_TABLE_GENERATOR_BUILD_TABLE) ( IN CONST SMBIOS_TABLE_GENERATOR *Generator, + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo, IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, - OUT SMBIOS_STRUCTURE **Table + OUT SMBIOS_STRUCTURE **Table, + OUT CM_OBJECT_TOKEN *CmObjToken ); /** This function pointer describes the interface to used by the Table Manager to give the generator an opportunity to free any resources allocated for building the SMBIOS table. - @param [in] Generator Pointer to the SMBIOS table generator. - @param [in] SmbiosTableInfo Pointer to the SMBIOS table information. - @param [in] CfgMgrProtocol Pointer to the Configuration Manager - Protocol interface. - @param [in] Table Pointer to the generated SMBIOS table. + @param [in] Generator Pointer to the SMBIOS table generator. + @param [in] TableFactoryProtocol Pointer to the Dynamic TableFactory Protocol. + @param [in] SmbiosTableInfo Pointer to the SMBIOS table information. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol interface. + @param [in] Table Pointer to the generated SMBIOS table. @return EFI_SUCCESS If freed successfully or other failure codes as returned by the generator. **/ typedef EFI_STATUS (*SMBIOS_TABLE_GENERATOR_FREE_TABLE) ( IN CONST SMBIOS_TABLE_GENERATOR *Generator, + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, IN CONST CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo, IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, IN SMBIOS_STRUCTURE **Table ); +/** This function pointer describes an extended interface to build SMBIOS + tables. The SMBIOS Table Generator can build multiple tables and returns + a pointer to the list of SMBIOS tables and to a list of the CM_OBJECT_TOKEN + of the CM_OBJECTS that were used to generate the SMBIOS tables. + Use te FreeTableResourcesEx to free any resources that may have been + allocated using this interface. + + @param [in] Generator Pointer to the SMBIOS table generator. + @param [in] TableFactoryProtocol Pointer to the Dynamic TableFactory Protocol. + @param [in] SmbiosTableInfo Pointer to the SMBIOS table information. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol interface. + @param [out] Table Pointer to a list of generated SMBIOS table(s). + @param [out] CmObjToken Pointer to the CM_OBJECT_TOKEN for the + SMBIOS table. + @param [out] TableCount Number of generated SMBIOS table(s). + + @return EFI_SUCCESS If the table is generated successfully or other + failure codes as returned by the generator. +**/ +typedef EFI_STATUS (*SMBIOS_TABLE_GENERATOR_BUILD_TABLEEX) ( + IN CONST SMBIOS_TABLE_GENERATOR *Generator, + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + OUT SMBIOS_STRUCTURE ***Table, + OUT CM_OBJECT_TOKEN **CmObjectToken, + OUT UINTN *CONST TableCount + ); + +/** This function pointer describes the interface used by the + Table Manager to give the generator an opportunity to free + any resources allocated for building the SMBIOS table. This interface + must be used in conjunction with BuildSmbiosTableEx. + + @param [in] Generator Pointer to the SMBIOS table generator. + @param [in] TableFactoryProtocol Pointer to the Dynamic TableFactory Protocol. + @param [in] SmbiosTableInfo Pointer to the SMBIOS table information. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol interface. + @param [in] Table Pointer to the generated SMBIOS table. + @param [in] CmObjToken Pointer to the CM_OBJECT_TOKEN for the + SMBIOS table. + @param [in] TableCount Number of generated SMBIOS table(s). + + @return EFI_SUCCESS If freed successfully or other failure codes + as returned by the generator. +**/ +typedef EFI_STATUS (*SMBIOS_TABLE_GENERATOR_FREE_TABLEEX) ( + IN CONST SMBIOS_TABLE_GENERATOR *Generator, + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CONST CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN SMBIOS_STRUCTURE ***Table, + IN CM_OBJECT_TOKEN **CmObjectToken, + IN CONST UINTN TableCount + ); + +/** This function pointer describes the interface to used by the + Table Manager to give the generator an opportunity to add + an SMBIOS Handle. + + This function is called by the Dynamic Table Manager to add a newly added + SMBIOS Table OR it can be called by an SMBIOS Table generator to create + and add a new SMBIOS Handle if there is a reference to another table and + if there is a generator for that table that hasn't been called yet. + + @param [in] Smbios Pointer to the SMBIOS protocol. + @param [in] SmbiosHandle Pointer to an SMBIOS handle. + @param [in] CmObjectToken The CM Object token for that is used to generate + SMBIOS record. + @param [in] GeneratorId The SMBIOS table generator Id. + + @retval EFI_SUCCESS Success. + @retval EFI_OUT_OF_RESOURCES Unable to add the handle. + @retval EFI_NOT_FOUND The requested generator is not found + in the list of registered generators. +**/ +typedef EFI_STATUS (EFIAPI *EDKII_DYNAMIC_TABLE_FACTORY_SMBIOS_TABLE_ADD_HANDLE)( + IN EFI_SMBIOS_PROTOCOL *Smbios, + IN SMBIOS_HANDLE *SmbiosHandle, + IN CM_OBJECT_TOKEN CmObjectToken, + IN SMBIOS_TABLE_GENERATOR_ID GeneratorId + ); + +/** This function pointer describes the interface to used by the + Table Manager to give the generator an opportunity to find + an SMBIOS Handle. + + This function is called by the SMBIOS table generator to find an SMBIOS + handle needed as part of generating an SMBIOS Table. + + @param [in] CmObjectToken The CM Object token used to generate the SMBIOS + record. + + @retval SMBIOS_HANDLE_MAP Pointer to the SMBIOS Handle Map if the + CmObjectToken is found. + @retval NULL if CmObjectToken is not found. +**/ +typedef SMBIOS_HANDLE_MAP *(EFIAPI *EDKII_DYNAMIC_TABLE_FACTORY_SMBIOS_TABLE_GET_HANDLE)( + IN CM_OBJECT_TOKEN CmObjectToken + ); + +/** Find and return SMBIOS handle based on associated CM object token. + + @param [in] GeneratorId SMBIOS generator ID used to build the SMBIOS Table. + @param [in] CmObjectToken Token of the CM_OBJECT used to build the SMBIOS Table. + + @return SMBIOS handle of the table associated with SmbiosTableId and + CmObjectToken if found. Otherwise, returns SMBIOS_HANDLE_INVALID. +**/ +typedef SMBIOS_HANDLE (EFIAPI *EDKII_DYNAMIC_TABLE_FACTORY_SMBIOS_TABLE_GET_HANDLE_EX)( + IN SMBIOS_TABLE_GENERATOR_ID GeneratorId, + IN CM_OBJECT_TOKEN CmObjToken + ); + /** The SMBIOS_TABLE_GENERATOR structure provides an interface that the Table Manager can use to invoke the functions to build SMBIOS tables. */ typedef struct SmbiosTableGenerator { /// The SMBIOS table generator ID. - SMBIOS_TABLE_GENERATOR_ID GeneratorID; + SMBIOS_TABLE_GENERATOR_ID GeneratorID; /// String describing the DT table /// generator. - CONST CHAR16 *Description; + CONST CHAR16 *Description; /// The SMBIOS table type. - SMBIOS_TYPE Type; + SMBIOS_TYPE Type; /// SMBIOS table build function pointer. - SMBIOS_TABLE_GENERATOR_BUILD_TABLE BuildSmbiosTable; + SMBIOS_TABLE_GENERATOR_BUILD_TABLE BuildSmbiosTable; + + /** The function to free any resources + allocated for building the SMBIOS table. + */ + SMBIOS_TABLE_GENERATOR_FREE_TABLE FreeTableResources; + + /// SMBIOS table extended build function pointer. + SMBIOS_TABLE_GENERATOR_BUILD_TABLEEX BuildSmbiosTableEx; /** The function to free any resources allocated for building the SMBIOS table. */ - SMBIOS_TABLE_GENERATOR_FREE_TABLE FreeTableResources; + SMBIOS_TABLE_GENERATOR_FREE_TABLEEX FreeTableResourcesEx; } SMBIOS_TABLE_GENERATOR; /** Register SMBIOS table factory generator. @@ -229,6 +377,68 @@ DeregisterSmbiosTableGenerator ( IN CONST SMBIOS_TABLE_GENERATOR *CONST Generator ); +/** Add SMBIOS Handle. + + This function is called by the Dynamic Table Manager to add an entry for + the newly created SMBIOS Table handle and the CM_OBJECT_TOKEN of the CM_OBJECT + used to generate the table for a given SMBIOS generator to the SMBIOS Handle + Map maintained by the DynamicTable Factory. + + @param [in] Smbios Pointer to the SMBIOS protocol. + @param [in] SmbiosHandle Pointer to an SMBIOS handle. + @param [in] CmObjectToken The CM Object token for that is used to generate + SMBIOS record. + @param [in] GeneratorId The SMBIOS table generator Id. + + @retval EFI_SUCCESS Success. + @retval EFI_OUT_OF_RESOURCES Unable to add the handle. + @retval EFI_NOT_FOUND The requested generator is not found + in the list of registered generators. +**/ +EFI_STATUS +EFIAPI +AddSmbiosHandle ( + IN EFI_SMBIOS_PROTOCOL *Smbios, + IN SMBIOS_HANDLE *SmbiosHandle, + IN CM_OBJECT_TOKEN CmObjectToken, + IN SMBIOS_TABLE_GENERATOR_ID GeneratorId + ); + +/** Find SMBIOS Handle given the CM Object token used to generate the SMBIOS + record. + + This function is called by the SMBIOS table generator to find an SMBIOS + handle map to reference a different SMBIOS table. + + @param [in] CmObjectToken The CM Object token used to generate the SMBIOS + record. + + @retval SMBIOS_HANDLE_MAP Pointer to the SMBIOS Handle Map if the + CmObjectToken is found. + @retval NULL if CmObjectToken is not found. +**/ +SMBIOS_HANDLE_MAP * +EFIAPI +FindSmbiosHandle ( + IN CM_OBJECT_TOKEN CmObjectToken + ); + +/** Find and return SMBIOS handle for a given associated CM object token for + an SMBIOS Table Generator. + + @param [in] GeneratorId SMBIOS generator ID used to build the SMBIOS Table. + @param [in] CmObjectToken Token of the CM_OBJECT used to build the SMBIOS Table. + + @return SMBIOS handle of the table associated with SmbiosTableId and + CmObjectToken if found. Otherwise, returns SMBIOS_HANDLE_INVALID. +**/ +SMBIOS_HANDLE +EFIAPI +FindSmbiosHandleEx ( + IN SMBIOS_TABLE_GENERATOR_ID GeneratorId, + IN CM_OBJECT_TOKEN CmObjToken + ); + #pragma pack() #endif // SMBIOS_TABLE_GENERATOR_H_ From fad3450348fedabc0c5ae1b80739aacb3716be57 Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Tue, 18 Feb 2025 15:01:17 +0000 Subject: [PATCH 0588/1172] MdePkg: Smbios: Add AArch64 ProcessorId variant for type 4 table The existing field is x86 only. Re-typedef for AArch64. Signed-off-by: Sarah Walker --- MdePkg/Include/IndustryStandard/SmBios.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/MdePkg/Include/IndustryStandard/SmBios.h b/MdePkg/Include/IndustryStandard/SmBios.h index 4851e8cdde8c..afa50f480e3a 100644 --- a/MdePkg/Include/IndustryStandard/SmBios.h +++ b/MdePkg/Include/IndustryStandard/SmBios.h @@ -997,10 +997,26 @@ typedef union { UINT8 Data; } PROCESSOR_STATUS_DATA; +#ifdef MDE_CPU_AARCH64 +// This structure assumes Arm64 SoC ID is supported +typedef struct { + UINT16 SocId; + UINT8 SipId; + UINT8 SipBankIndex; + UINT32 SocRevision; +} PROCESSOR_ID_DATA; +#elif defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) typedef struct { PROCESSOR_SIGNATURE Signature; PROCESSOR_FEATURE_FLAGS FeatureFlags; } PROCESSOR_ID_DATA; +#else +// Please define PROCESSOR_ID_DATA for your architecture +typedef struct { + PROCESSOR_SIGNATURE Signature; + PROCESSOR_FEATURE_FLAGS FeatureFlags; +} PROCESSOR_ID_DATA; +#endif /// /// Processor Information (Type 4). From a08905a62a3d854d0fe96dbfefe8ebf585a97a7f Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Mon, 17 Feb 2025 14:27:51 +0000 Subject: [PATCH 0589/1172] DynamicTablesPkg: Implement abstract CM_OBJECT_TOKENs Abstract tokens simplify linking of generated tables. They allow for tables to be search for not just by existing ConfigurationManager object references, but also by arbitrary tokens generated by the table generators themselves. Signed-off-by: Sarah Walker --- .../Include/StandardNameSpaceObjects.h | 53 +++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/DynamicTablesPkg/Include/StandardNameSpaceObjects.h b/DynamicTablesPkg/Include/StandardNameSpaceObjects.h index c81efbc23777..e45d31e7cca6 100644 --- a/DynamicTablesPkg/Include/StandardNameSpaceObjects.h +++ b/DynamicTablesPkg/Include/StandardNameSpaceObjects.h @@ -27,9 +27,17 @@ to identify a Configuration Manager object. This can be used to differentiate between instances of - objects of the same types. The identification scheme is - implementation defined and is defined by the Configuration - Manager. + objects of the same types. When bit 0 is clear, the + identification scheme is implementation defined and is + defined by the Configuration Manager. + + Tokens are also used by table generators to look up + previously generated tables. To aid with this, the concept + of an abstract token exists, allowing generators to + define arbitrary tokens to identify generated tables. + When bit 1 is set, the token is an abstract token and + refers to generated tables. The format of an abstract + token is shown below. Typically the token is used to identify a specific instance from a set of objects in a call to the GetObject()/SetObject(), @@ -40,6 +48,45 @@ **/ typedef UINTN CM_OBJECT_TOKEN; +/** The EABSTRACT_TOKEN_ID enum describes the defined namespaces + for Abstract Tokens. +*/ +typedef enum AbstractTokenID { + ETokenNameSpaceUnknown = 0, + ETokenNameSpaceSmbios, + + ETokenNameSpaceMax +} EABSTRACT_TOKEN_ID; + +/** Abstract token generated by table generators + + Description of abstract token format +______________________________________________________________________________ +|31 |30 |29 |28 || 27 | 26 | 25 | 24 || 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16| +------------------------------------------------------------------------------ +| 1 0 1 0 || Name Space ID || Object ID | +______________________________________________________________________________ + +Bits: [31:28] - Must be 1010 (0xa) for abstract token +Bits: [27:24] - Name Space ID + 0000 - Unknown + 0001 - SMBIOS +Bits: [23:16] - Object ID +_______________________________________________________________________________ +|15 |14 |13 |12 || 11 | 10 | 9 | 8 || 7 | 6 | 5 | 4 || 3 | 2 | 1 | 0| +------------------------------------------------------------------------------- +| ID | 1 | +_______________________________________________________________________________ + +Bits: [15:1] - Token ID + Token ID is arbitrary and is defined by the generator +Bit [0] - Must be 1 for abstract token + +Object ID's in the SMBIOS Namespace: + See ESTD_SMBIOS_TABLE_ID. +*/ +#define CM_ABSTRACT_TOKEN_MAKE(ns, obj_id, id) ((CM_OBJECT_TOKEN)((0xa << 28) | ((ns) << 24) | ((obj_id) << 16) | ((id) << 1) | 1)) + /** A type representing a SMBIOS structure/table type. From dfac150bdfc059e486f14072c5249d4d7c200c38 Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Tue, 18 Feb 2025 15:06:31 +0000 Subject: [PATCH 0590/1172] MdePkg: SmBios: Add structs for cache size and configuration data These are used by the Type 7 generator. Signed-off-by: Sarah Walker --- MdePkg/Include/IndustryStandard/SmBios.h | 42 +++++++++++++++++++++--- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/MdePkg/Include/IndustryStandard/SmBios.h b/MdePkg/Include/IndustryStandard/SmBios.h index afa50f480e3a..67fc41c77f1d 100644 --- a/MdePkg/Include/IndustryStandard/SmBios.h +++ b/MdePkg/Include/IndustryStandard/SmBios.h @@ -1200,6 +1200,40 @@ typedef struct { UINT8 ErrorStatus; } SMBIOS_TABLE_TYPE6; +/// +/// Cache Information - Configuration. +/// +typedef struct { + UINT16 CacheLevel : 3; + UINT16 CacheSocketed : 1; + UINT16 Reserved : 1; + UINT16 Location : 2; + UINT16 Enabled : 1; + UINT16 OperationMode : 2; + UINT16 Reserved2 : 6; +} SMBIOS_CACHE_CONFIGURATION_DATA; + +/// +/// Cache Information - Size +/// +typedef struct { + UINT16 Size : 15; + UINT16 Granularity64K : 1; +} SMBIOS_CACHE_SIZE; + +/// Maximum cache size representable in CACHE_SIZE at 1 KiB granularity +#define SMBIOS_CACHE_SIZE_MAX_SIZE_1K_GRANULARITY 32767 +/// Maximum cache size representable in CACHE_SIZE at 64 KiB granularity +#define SMBIOS_CACHE_SIZE_MAX_SIZE_64K_GRANULARITY (32767 * 64) + +/// +/// Cache Information - Size 2 +/// +typedef struct { + UINT32 Size : 31; + UINT32 Granularity64K : 1; +} SMBIOS_CACHE_SIZE_2; + /// /// Cache Information - SRAM Type. /// @@ -1269,8 +1303,8 @@ typedef struct { SMBIOS_STRUCTURE Hdr; SMBIOS_TABLE_STRING SocketDesignation; UINT16 CacheConfiguration; - UINT16 MaximumCacheSize; - UINT16 InstalledSize; + SMBIOS_CACHE_SIZE MaximumCacheSize; + SMBIOS_CACHE_SIZE InstalledSize; CACHE_SRAM_TYPE_DATA SupportedSRAMType; CACHE_SRAM_TYPE_DATA CurrentSRAMType; UINT8 CacheSpeed; @@ -1280,8 +1314,8 @@ typedef struct { // // Add for smbios 3.1.0 // - UINT32 MaximumCacheSize2; - UINT32 InstalledSize2; + SMBIOS_CACHE_SIZE_2 MaximumCacheSize2; + SMBIOS_CACHE_SIZE_2 InstalledSize2; } SMBIOS_TABLE_TYPE7; /// From d755753ef8246a4ebb8f9c066d6911f0ece21234 Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Tue, 18 Feb 2025 15:08:03 +0000 Subject: [PATCH 0591/1172] DynamicTablesPkg: Smbios Cache Information (Type 7) Signed-off-by: Sarah Walker --- DynamicTablesPkg/DynamicTables.dsc.inc | 4 + .../Include/ArchCommonNameSpaceObjects.h | 7 + .../SmbiosType7Lib/SmbiosType7Generator.c | 829 ++++++++++++++++++ .../Smbios/SmbiosType7Lib/SmbiosType7Lib.inf | 35 + 4 files changed, 875 insertions(+) create mode 100644 DynamicTablesPkg/Library/Smbios/SmbiosType7Lib/SmbiosType7Generator.c create mode 100644 DynamicTablesPkg/Library/Smbios/SmbiosType7Lib/SmbiosType7Lib.inf diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc index 3920596461d7..a6420cdc1864 100644 --- a/DynamicTablesPkg/DynamicTables.dsc.inc +++ b/DynamicTablesPkg/DynamicTables.dsc.inc @@ -102,6 +102,8 @@ DynamicTablesPkg/Library/Acpi/Arm/AcpiIortLibArm/AcpiIortLibArm.inf DynamicTablesPkg/Library/Acpi/Arm/AcpiMadtLibArm/AcpiMadtLibArm.inf + DynamicTablesPkg/Library/Smbios/SmbiosType7Lib/SmbiosType7Lib.inf + # AML Fixup (Arm specific) DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCmn600LibArm/SsdtCmn600LibArm.inf @@ -139,4 +141,6 @@ # Common NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieLib.inf + + NULL|DynamicTablesPkg/Library/Smbios/SmbiosType7Lib/SmbiosType7Lib.inf } diff --git a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h index 54bb0467cc44..1c5684ae7388 100644 --- a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h +++ b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h @@ -449,6 +449,8 @@ typedef struct CmArchCommonProcHierarchyInfo { UINT32 OverrideUid; } CM_ARCH_COMMON_PROC_HIERARCHY_INFO; +#define SMBIOS_MAX_STRING_SIZE (1024) + /** A structure that describes the Cache Type Structure (Type 1) in PPTT ID: EArchCommonObjCacheInfo @@ -477,6 +479,11 @@ typedef struct CmArchCommonCacheInfo { UINT16 LineSize; /// Unique ID for the cache UINT32 CacheId; + /// SMBIOS: Level of cache within the processor hierarchy + /// 0-2 = cache level 1-3 + UINT32 Level; + /// SMBIOS: Designation of this cache on this socket + CHAR8 SocketDesignation[SMBIOS_MAX_STRING_SIZE]; } CM_ARCH_COMMON_CACHE_INFO; /** A structure that describes the Cpc information. diff --git a/DynamicTablesPkg/Library/Smbios/SmbiosType7Lib/SmbiosType7Generator.c b/DynamicTablesPkg/Library/Smbios/SmbiosType7Lib/SmbiosType7Generator.c new file mode 100644 index 000000000000..ffe7f75fc85e --- /dev/null +++ b/DynamicTablesPkg/Library/Smbios/SmbiosType7Lib/SmbiosType7Generator.c @@ -0,0 +1,829 @@ +/** @file + SMBIOS Type7 Table Generator. + + Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + Copyright (c) 2020 - 2025, Arm Limited. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include +#include +#include + +// Module specific include files. +#include +#include +#include +#include +#include + +/** + This macro expands to a function that retrieves the Processor Hierarchy + information from the Configuration Manager. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceArchCommon, + EArchCommonObjProcHierarchyInfo, + CM_ARCH_COMMON_PROC_HIERARCHY_INFO + ); + +/** + This macro expands to a function that retrieves the Cache information from the + Configuration Manager. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceArchCommon, + EArchCommonObjCacheInfo, + CM_ARCH_COMMON_CACHE_INFO + ); + +/** + This macro expands to a function that retrieves common object information from the + Configuration Manager. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceArchCommon, + EArchCommonObjCmRef, + CM_ARCH_COMMON_OBJ_REF + ); + +#define SMBIOS_TYPE7_MAX_STRINGS (1) + +/** + * Free any resources allocated when installing SMBIOS Type7 table. + * + * @param [in] This Pointer to the SMBIOS table generator. + * @param [in] TableFactoryProtocol Pointer to the SMBIOS Table Factory + Protocol interface. + + * @param [in] SmbiosTableInfo Pointer to the SMBIOS table information. + * @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol interface. + * @param [in] Table Pointer to the SMBIOS table. + * @param [in] CmObjectToken Pointer to the CM ObjectToken Array. + * @param [in] TableCount Number of SMBIOS tables. + + * @retval EFI_SUCCESS Table generated successfully. + * @retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration + Manager is less than the Object size for + the requested object. + * @retval EFI_INVALID_PARAMETER A parameter is invalid. + * @retval EFI_NOT_FOUND Could not find information. + * @retval EFI_OUT_OF_RESOURCES Could not allocate memory. + * @retval EFI_UNSUPPORTED Unsupported configuration. +**/ +STATIC +EFI_STATUS +FreeSmbiosType7TableEx ( + IN CONST SMBIOS_TABLE_GENERATOR *CONST This, + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CONST CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN SMBIOS_STRUCTURE ***CONST Table, + IN CM_OBJECT_TOKEN **CmObjectToken, + IN CONST UINTN TableCount + ) +{ + UINTN Index; + SMBIOS_STRUCTURE **TableList; + + TableList = *Table; + for (Index = 0; Index < TableCount; Index++) { + if (TableList[Index] != NULL) { + FreePool (TableList[Index]); + } + } + + if (*CmObjectToken != NULL) { + FreePool (*CmObjectToken); + } + + if (TableList != NULL) { + FreePool (TableList); + } + + return EFI_SUCCESS; +} + +/** Get SMBIOS system cache type enum from given ACPI cache attributes + + * @param [in] ACPI cache attributes + + * @return SMBIOS system cache type +**/ +STATIC +CACHE_TYPE_DATA +GetSystemCacheType ( + IN UINT32 Attributes + ) +{ + switch ((Attributes >> 2) & 3) { + case EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_DATA: + return CacheTypeData; + case EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_INSTRUCTION: + return CacheTypeInstruction; + case EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_UNIFIED: + return CacheTypeUnified; + default: + return CacheTypeUnknown; + } +} + +/** Get SMBIOS cache associativity enum from a given associativity level + + * @param [in] Input associativity + + * @return SMBIOS cache associativity +**/ +STATIC +CACHE_ASSOCIATIVITY_DATA +GetCacheAssociativity ( + IN UINT32 Associativity + ) +{ + switch (Associativity) { + case 1: + return CacheAssociativityDirectMapped; + case 2: + return CacheAssociativity2Way; + case 4: + return CacheAssociativity4Way; + case 8: + return CacheAssociativity8Way; + case 12: + return CacheAssociativity12Way; + case 16: + return CacheAssociativity16Way; + case 20: + return CacheAssociativity20Way; + case 24: + return CacheAssociativity24Way; + case 32: + return CacheAssociativity32Way; + case 48: + return CacheAssociativity48Way; + case 64: + return CacheAssociativity64Way; + default: + return CacheAssociativityOther; + } +} + +/** Find all users of a particular cache in the Processor Hierarchy + + * @param [in] CfgMgrProtocol Pointer to the Configuration Manager + * Protocol interface. + * @param [in] CacheToken Token of the cache to search for + * @param [in] ProcHierarchyNodeList Pointer to the Processor Hierarchy node + * list + * @param [in] ProcHierarchyNodeCount Number of nodes in the Processor + * Hierarchy node list + + * @return Number of Processor Hierarchy nodes using the given cache on success + * @return -1 on error +**/ +STATIC +INTN +FindCacheUsers ( + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN CM_OBJECT_TOKEN CacheToken, + IN CM_ARCH_COMMON_PROC_HIERARCHY_INFO *ProcHierarchyNodeList, + IN UINT32 ProcHierarchyNodeCount + ) +{ + EFI_STATUS Status; + CM_ARCH_COMMON_PROC_HIERARCHY_INFO CONST *Node; + CM_ARCH_COMMON_OBJ_REF *PrivResources; + UINT32 Index; + UINT32 Index2; + UINT32 PrivResourcesCount; + INTN Count = 0; + + for (Index = 0; Index < ProcHierarchyNodeCount; Index++) { + Node = &ProcHierarchyNodeList[Index]; + + if (Node->PrivateResourcesArrayToken == CM_NULL_TOKEN) { + continue; + } + + Status = GetEArchCommonObjCmRef ( + CfgMgrProtocol, + Node->PrivateResourcesArrayToken, + &PrivResources, + &PrivResourcesCount + ); + + if (Status == EFI_NOT_FOUND) { + continue; + } else if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return -1; + } + + for (Index2 = 0; Index2 < PrivResourcesCount; Index2++) { + if (PrivResources[Index2].ReferenceToken == CacheToken) { + Count++; + } + } + } + + return Count; +} + +/** Find the Processor Hierarchy node from the associated token. + + * @param [in] ProcHierarchyNodeList Pointer to the Processor Hierarchy node + * list. + * @param [in] ProcHierarchyNodeCount Number of nodes in the Processor + * Hierarchy node list. + * @param [in] Token The token to search for. + + * @return Pointer to the Processor hierarchy node. + * @return NULL if token is not in the Processor Hierarchy node list. +**/ +STATIC +CM_ARCH_COMMON_PROC_HIERARCHY_INFO * +FindProcHierarchyInfoFromToken ( + CM_ARCH_COMMON_PROC_HIERARCHY_INFO *ProcHierarchyNodeList, + UINT32 ProcHierarchyNodeCount, + CM_OBJECT_TOKEN Token + ) +{ + UINTN Index; + + for (Index = 0; Index < ProcHierarchyNodeCount; Index++) { + if (ProcHierarchyNodeList[Index].Token == Token) { + return &ProcHierarchyNodeList[Index]; + } + } + + ASSERT (0); + return NULL; +} + +/** Determine whether the provided cache node is valid for the provided socket node + + * @param [in] CfgMgrProtocol Pointer to the Configuration Manager + * Protocol interface. + * @param [in] ProcHierarchyNodeList Pointer to the Processor Hierarchy node + * list. + * @param [in] ProcHierarchyNodeCount Number of nodes in the Processor + * Hierarchy node list. + * @param [in] CacheNode Pointer to the cache node to search for. + * @param [in] SocketNode Pointer to the socket node to search for. + + * @return EFI_SUCCESS if cache node is valid for socket + * @return EFI_NOT_FOUND if cache node is not valid for socket +**/ +STATIC +EFI_STATUS +IsCacheInSocket ( + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN CM_ARCH_COMMON_PROC_HIERARCHY_INFO *CONST ProcHierarchyNodeList, + IN UINT32 ProcHierarchyNodeCount, + IN CM_ARCH_COMMON_CACHE_INFO *CacheNode, + IN CM_ARCH_COMMON_PROC_HIERARCHY_INFO *SocketNode + ) +{ + CM_ARCH_COMMON_PROC_HIERARCHY_INFO *ProcNode; + CM_ARCH_COMMON_OBJ_REF *PrivResources; + EFI_STATUS Status; + UINTN Index; + UINTN ObjIndex; + UINT32 PrivResourcesCount; + + // Search for a processor hierarchy node using this cache + // Cache use will be indicated by the private resource list + for (Index = 0; Index < ProcHierarchyNodeCount; Index++) { + ProcNode = &ProcHierarchyNodeList[Index]; + + if (ProcNode->PrivateResourcesArrayToken == CM_NULL_TOKEN) { + continue; + } + + Status = GetEArchCommonObjCmRef ( + CfgMgrProtocol, + ProcNode->PrivateResourcesArrayToken, + &PrivResources, + &PrivResourcesCount + ); + + if (Status == EFI_NOT_FOUND) { + continue; + } else if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + for (ObjIndex = 0; ObjIndex < PrivResourcesCount; ObjIndex++) { + if (PrivResources[ObjIndex].ReferenceToken != CacheNode->Token) { + continue; + } + + // Private resources used by this processor node contain this cache + // Walk the processor hierarchy to find the socket + while (ProcNode != NULL && !(ProcNode->Flags & EFI_ACPI_6_3_PPTT_PACKAGE_PHYSICAL)) { + ProcNode = FindProcHierarchyInfoFromToken (ProcHierarchyNodeList, ProcHierarchyNodeCount, ProcNode->ParentToken); + } + + if (ProcNode == SocketNode) { + // Found the socket node, return + return EFI_SUCCESS; + } + } + } + + return EFI_NOT_FOUND; +} + +/** Find an existing type 7 record for a cache on SocketNode of the same level + as CacheNode. + + * @param [in] CacheNode Pointer to cache node currently being + * processed. + * @param [in] SocketNode Pointer to socket node currently being + * processed. + * @param [in] TableList Pointer to list of existing type 7 entries. + * @param [in] SocketCmObjectList Pointer to SocketCmObjectList. + * @param [in] CmObjectCount Number of entries in CmObjectList. + + * @retval Pointer to matching type 7 record if one exists. + * @retval NULL if matching type 7 record does not exist. +**/ +STATIC +SMBIOS_TABLE_TYPE7 * +FindExistingCacheRecord ( + IN CM_ARCH_COMMON_CACHE_INFO *CacheNode, + IN CM_ARCH_COMMON_PROC_HIERARCHY_INFO *SocketNode, + IN SMBIOS_STRUCTURE **TableList, + IN CM_OBJECT_TOKEN *SocketCmObjectList, + IN UINT32 CmObjectCount + ) +{ + SMBIOS_TABLE_TYPE7 *SmbiosRecord; + SMBIOS_CACHE_CONFIGURATION_DATA *ConfigurationData; + UINT32 Index; + + for (Index = 0; Index < CmObjectCount; Index++) { + if (SocketCmObjectList[Index] != SocketNode->Token) { + continue; + } + + SmbiosRecord = (SMBIOS_TABLE_TYPE7 *)TableList[Index]; + ConfigurationData = (SMBIOS_CACHE_CONFIGURATION_DATA *)&SmbiosRecord->CacheConfiguration; + + if (ConfigurationData->CacheLevel == CacheNode->Level) { + return SmbiosRecord; + } + } + + return NULL; +} + +/** Construct SMBIOS Type 7 Table describing caches. + + If this function allocates any resources then they must be freed + in the FreeXXXXTableResources function. + + * @param [in] This Pointer to the SMBIOS table generator. + * @param [in] TableFactoryProtocol Pointer to the SMBIOS Table Factory + * Protocol interface. + * @param [in] SmbiosTableInfo Pointer to the SMBIOS table information. + * @param [in] CfgMgrProtocol Pointer to the Configuration Manager + * Protocol interface. + * @param [out] Table Pointer to the SMBIOS table. + * @param [out] CmObjectToken Pointer to the CM Object Token Array. + * @param [out] TableCount Number of tables installed. + + * @retval EFI_SUCCESS Table generated successfully. + * @retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration + * Manager is less than the Object size for + * the requested object. + * @retval EFI_INVALID_PARAMETER A parameter is invalid. + * @retval EFI_NOT_FOUND Could not find information. + * @retval EFI_OUT_OF_RESOURCES Could not allocate memory. + * @retval EFI_UNSUPPORTED Unsupported configuration. +**/ +STATIC +EFI_STATUS +BuildSmbiosType7TableEx ( + IN CONST SMBIOS_TABLE_GENERATOR *This, + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + OUT SMBIOS_STRUCTURE ***Table, + OUT CM_OBJECT_TOKEN **CmObjectToken, + OUT UINTN *CONST TableCount + ) +{ + EFI_STATUS Status; + SMBIOS_STRUCTURE **TableList; + SMBIOS_TABLE_TYPE7 *SmbiosRecord; + UINTN SmbiosRecordSize; + CM_OBJECT_TOKEN *CmObjectList; + CM_OBJECT_TOKEN *SocketCmObjectList; + UINTN Index; + UINTN ObjIndex; + UINTN SocketIndex; + UINTN SocketListIndex; + UINTN SocketCount; + SMBIOS_CACHE_CONFIGURATION_DATA *ConfigurationData; + + UINT32 ProcHierarchyNodeCount; + UINT32 CacheStructCount; + UINT32 CacheSize; + + CM_ARCH_COMMON_PROC_HIERARCHY_INFO *ProcHierarchyNodeList; + CM_ARCH_COMMON_PROC_HIERARCHY_INFO *SocketNode; + CM_ARCH_COMMON_CACHE_INFO *CacheStructList; + CM_ARCH_COMMON_CACHE_INFO *CacheNode; + + CM_ARCH_COMMON_PROC_HIERARCHY_INFO **SocketNodeList; + + STRING_TABLE StrTable; + UINT8 SocketDesignationRef; + + INTN CacheUsers; + + ASSERT (This != NULL); + ASSERT (SmbiosTableInfo != NULL); + ASSERT (CfgMgrProtocol != NULL); + ASSERT (Table != NULL); + ASSERT (TableCount != NULL); + ASSERT (SmbiosTableInfo->TableGeneratorId == This->GeneratorID); + + if ((This == NULL) || (SmbiosTableInfo == NULL) || (CfgMgrProtocol == NULL) || + (Table == NULL) || (TableCount == NULL) || + (SmbiosTableInfo->TableGeneratorId != This->GeneratorID)) + { + DEBUG ((DEBUG_ERROR, "%a:Invalid Paramater\n ", __func__)); + return EFI_INVALID_PARAMETER; + } + + *Table = NULL; + + TableList = NULL; + CmObjectList = NULL; + SocketCmObjectList = NULL; + SocketNodeList = NULL; + + // Get the processor hierarchy info and update the processor topology + // structure count with Processor Hierarchy Nodes (Type 0) + Status = GetEArchCommonObjProcHierarchyInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &ProcHierarchyNodeList, + &ProcHierarchyNodeCount + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to get processor hierarchy info. Status = %r\n", + __func__, + Status + )); + return Status; + } + + // Get the cache info and update the processor topology structure count with + // Cache Type Structures (Type 1) + Status = GetEArchCommonObjCacheInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &CacheStructList, + &CacheStructCount + ); + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to get cache info. Status = %r\n", + __func__, + Status + )); + return Status; + } + + if ((Status == EFI_NOT_FOUND) || (CacheStructCount == 0)) { + // Nothing to do, just return + return EFI_SUCCESS; + } + + TableList = (SMBIOS_STRUCTURE **)AllocateZeroPool (sizeof (SMBIOS_STRUCTURE *) * CacheStructCount); + if (TableList == NULL) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to alloc memory for %u devices table\n", + __func__, + CacheStructCount + )); + Status = EFI_OUT_OF_RESOURCES; + goto exitErrorBuildSmbiosType7Table; + } + + CmObjectList = (CM_OBJECT_TOKEN *)AllocateZeroPool (sizeof (CM_OBJECT_TOKEN *) * CacheStructCount); + if (CmObjectList == NULL) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to alloc memory for %u CM Objects.\n", + __func__, + CacheStructCount + )); + Status = EFI_OUT_OF_RESOURCES; + goto exitErrorBuildSmbiosType7Table; + } + + SocketCmObjectList = (CM_OBJECT_TOKEN *)AllocateZeroPool (sizeof (CM_OBJECT_TOKEN *) * CacheStructCount); + if (SocketCmObjectList == NULL) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to alloc memory for %u CM Objects.\n", + __func__, + CacheStructCount + )); + Status = EFI_OUT_OF_RESOURCES; + goto exitErrorBuildSmbiosType7Table; + } + + // Find number of sockets + SocketCount = 0; + for (Index = 0; Index < ProcHierarchyNodeCount; Index++) { + SocketNode = &ProcHierarchyNodeList[Index]; + + if (SocketNode->Flags & EFI_ACPI_6_3_PPTT_PACKAGE_PHYSICAL) { + SocketCount++; + } + } + + SocketNodeList = (CM_ARCH_COMMON_PROC_HIERARCHY_INFO **)AllocateZeroPool (sizeof (CM_ARCH_COMMON_PROC_HIERARCHY_INFO *) * SocketCount); + SocketCount = 0; + + for (Index = 0; Index < ProcHierarchyNodeCount; Index++) { + SocketNode = &ProcHierarchyNodeList[Index]; + + if (SocketNode->Flags & EFI_ACPI_6_3_PPTT_PACKAGE_PHYSICAL) { + SocketNodeList[SocketCount] = SocketNode; + SocketCount++; + } + } + + ObjIndex = 0; + + for (Index = 0; Index < CacheStructCount; Index++) { + CacheNode = &CacheStructList[Index]; + + for (SocketListIndex = 0; SocketListIndex < SocketCount; SocketListIndex++) { + SocketNode = SocketNodeList[SocketListIndex]; + + Status = IsCacheInSocket (CfgMgrProtocol, ProcHierarchyNodeList, ProcHierarchyNodeCount, CacheNode, SocketNode); + + if (Status == EFI_NOT_FOUND) { + continue; + } + + if (EFI_ERROR (Status)) { + ASSERT (!EFI_ERROR (Status)); + goto exitErrorBuildSmbiosType7Table; + } + + SocketIndex = ((UINTN)SocketNode - (UINTN)ProcHierarchyNodeList) / sizeof (*SocketNode); + + // A Type 7 table entry contains all caches at a particular level for a + // socket. Check for an existing type 7 table entry for this cache level on + // this socket. + SmbiosRecord = FindExistingCacheRecord ( + CacheNode, + SocketNode, + TableList, + SocketCmObjectList, + ObjIndex + ); + + if (SmbiosRecord) { + // Previous cache found, merge this cache with the previous entry + CacheUsers = FindCacheUsers (CfgMgrProtocol, CacheNode->Token, ProcHierarchyNodeList, ProcHierarchyNodeCount); + if (CacheUsers < 0) { + ASSERT (CacheUsers >= 0); + Status = EFI_INVALID_PARAMETER; + goto exitErrorBuildSmbiosType7Table; + } + + CacheSize = CacheNode->Size * CacheUsers; + + SmbiosRecord->MaximumCacheSize2.Size += CacheSize / 1024; + + if (((GetSystemCacheType (CacheNode->Attributes) == CacheTypeData) && + ((SmbiosRecord->SystemCacheType == CacheTypeInstruction) || (SmbiosRecord->SystemCacheType == CacheTypeUnified))) || + ((GetSystemCacheType (CacheNode->Attributes) == CacheTypeInstruction) && + ((SmbiosRecord->SystemCacheType == CacheTypeData) || (SmbiosRecord->SystemCacheType == CacheTypeUnified)))) + { + SmbiosRecord->SystemCacheType = CacheTypeUnified; + } else if (GetSystemCacheType (CacheNode->Attributes) != SmbiosRecord->SystemCacheType) { + ASSERT (GetSystemCacheType (CacheNode->Attributes) == SmbiosRecord->SystemCacheType); + SmbiosRecord->SystemCacheType = CacheTypeOther; + } + + SmbiosRecord->Associativity = CacheAssociativityOther; + } else { + // No previously seen cache at this level, create new table entry + StringTableInitialize (&StrTable, SMBIOS_TYPE7_MAX_STRINGS); + SocketDesignationRef = 0; + + if (CacheNode->SocketDesignation[0]) { + Status = StringTableAddString (&StrTable, CacheNode->SocketDesignation, &SocketDesignationRef); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to add Socket Designation String %r\n", Status)); + goto exitErrorBuildSmbiosType7Table; + } + } + + SmbiosRecordSize = sizeof (SMBIOS_TABLE_TYPE7) + StringTableGetStringSetSize (&StrTable); + SmbiosRecord = (SMBIOS_TABLE_TYPE7 *)AllocateZeroPool (SmbiosRecordSize); + + // Set up the header + SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_CACHE_INFORMATION; + SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE7); + + SmbiosRecord->SocketDesignation = SocketDesignationRef; + + ConfigurationData = (SMBIOS_CACHE_CONFIGURATION_DATA *)&SmbiosRecord->CacheConfiguration; + ConfigurationData->CacheLevel = CacheNode->Level; + ConfigurationData->CacheSocketed = 0; + ConfigurationData->Location = 0; + ConfigurationData->Enabled = 1; + if (((CacheNode->Attributes >> 4) & 1) == EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK) { + ConfigurationData->OperationMode = 1; + } else { + ConfigurationData->OperationMode = 0; + } + + CacheUsers = FindCacheUsers (CfgMgrProtocol, CacheNode->Token, ProcHierarchyNodeList, ProcHierarchyNodeCount); + if (CacheUsers < 0) { + ASSERT (CacheUsers >= 0); + Status = EFI_INVALID_PARAMETER; + goto exitErrorBuildSmbiosType7Table; + } + + CacheSize = CacheNode->Size * CacheUsers; + + // Store cache size in MaximumCacheSize2.Size in 1K granularity. This will be + // processed once all caches have been accumulated. + SmbiosRecord->MaximumCacheSize2.Size = CacheSize / 1024; + + SmbiosRecord->SupportedSRAMType.Unknown = 1; + SmbiosRecord->CurrentSRAMType.Unknown = 1; + SmbiosRecord->ErrorCorrectionType = CacheErrorUnknown; + + SmbiosRecord->SystemCacheType = GetSystemCacheType (CacheNode->Attributes); + SmbiosRecord->Associativity = GetCacheAssociativity (CacheNode->Associativity); + + StringTablePublishStringSet (&StrTable, (CHAR8 *)(SmbiosRecord + 1), SmbiosRecordSize - sizeof (SMBIOS_TABLE_TYPE7)); + + TableList[ObjIndex] = (SMBIOS_STRUCTURE *)SmbiosRecord; + CmObjectList[ObjIndex] = CM_ABSTRACT_TOKEN_MAKE (ETokenNameSpaceSmbios, EStdSmbiosTableIdType07, CacheNode->Level | (SocketIndex << 2)); + SocketCmObjectList[ObjIndex] = SocketNode->Token; + ObjIndex++; + } + } + } + + // Handle cache size encoding + for (Index = 0; Index < ObjIndex; Index++) { + SmbiosRecord = (SMBIOS_TABLE_TYPE7 *)TableList[Index]; + // Accumulated cache size in 1K granularity + CacheSize = SmbiosRecord->MaximumCacheSize2.Size; + + if (CacheSize > SMBIOS_CACHE_SIZE_MAX_SIZE_64K_GRANULARITY) { + // Cache size greater than can be represented in MaximumCacheSize at 64K granularity + SmbiosRecord->MaximumCacheSize2.Granularity64K = 1; + SmbiosRecord->MaximumCacheSize2.Size = (CacheSize / 64); + + SmbiosRecord->MaximumCacheSize.Granularity64K = 1; + SmbiosRecord->MaximumCacheSize.Size = 0x7fff; + } else if (CacheSize > SMBIOS_CACHE_SIZE_MAX_SIZE_1K_GRANULARITY) { + // Cache size greater than can be represented in MaximumCacheSize at 1K granularity + SmbiosRecord->MaximumCacheSize2.Granularity64K = 1; + SmbiosRecord->MaximumCacheSize2.Size = (CacheSize / 64); + + SmbiosRecord->MaximumCacheSize.Granularity64K = 1; + SmbiosRecord->MaximumCacheSize.Size = (CacheSize / 64); + } else { + SmbiosRecord->MaximumCacheSize2.Granularity64K = 0; + SmbiosRecord->MaximumCacheSize2.Size = CacheSize; + + SmbiosRecord->MaximumCacheSize.Granularity64K = 0; + SmbiosRecord->MaximumCacheSize.Size = CacheSize; + } + + SmbiosRecord->InstalledSize = SmbiosRecord->MaximumCacheSize; + SmbiosRecord->InstalledSize2 = SmbiosRecord->MaximumCacheSize2; + } + + *Table = TableList; + *CmObjectToken = CmObjectList; + *TableCount = ObjIndex; + FreePool (SocketNodeList); + FreePool (SocketCmObjectList); + + return EFI_SUCCESS; + +exitErrorBuildSmbiosType7Table: + if (SocketNodeList) { + FreePool (SocketNodeList); + } + + if (TableList) { + FreePool (TableList); + } + + if (CmObjectList) { + FreePool (CmObjectList); + } + + if (SocketCmObjectList) { + FreePool (SocketCmObjectList); + } + + return Status; +} + +/** The interface for the SMBIOS Type7 Table Generator. +*/ +STATIC +CONST +SMBIOS_TABLE_GENERATOR SmbiosType7Generator = { + // Generator ID + CREATE_STD_SMBIOS_TABLE_GEN_ID (EStdSmbiosTableIdType07), + // Generator Description + L"SMBIOS.TYPE7.GENERATOR", + // SMBIOS Table Type + EFI_SMBIOS_TYPE_CACHE_INFORMATION, + NULL, + NULL, + // Build table function. + BuildSmbiosType7TableEx, + // Free function. + FreeSmbiosType7TableEx, +}; + +/** Register the Generator with the SMBIOS Table Factory. + + @param [in] ImageHandle The handle to the image. + @param [in] SystemTable Pointer to the System Table. + + @retval EFI_SUCCESS The Generator is registered. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_ALREADY_STARTED The Generator for the Table ID + is already registered. +**/ +EFI_STATUS +EFIAPI +SmbiosType7LibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = RegisterSmbiosTableGenerator (&SmbiosType7Generator); + DEBUG (( + DEBUG_INFO, + "SMBIOS Type 7: Register Generator. Status = %r\n", + Status + )); + ASSERT_EFI_ERROR (Status); + + return Status; +} + +/** Deregister the Generator from the SMBIOS Table Factory. + + @param [in] ImageHandle The handle to the image. + @param [in] SystemTable Pointer to the System Table. + + @retval EFI_SUCCESS The Generator is deregistered. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND The Generator is not registered. +**/ +EFI_STATUS +EFIAPI +SmbiosType7LibDestructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = DeregisterSmbiosTableGenerator (&SmbiosType7Generator); + DEBUG (( + DEBUG_INFO, + "SMBIOS Type 7: Deregister Generator. Status = %r\n", + Status + )); + ASSERT_EFI_ERROR (Status); + return Status; +} diff --git a/DynamicTablesPkg/Library/Smbios/SmbiosType7Lib/SmbiosType7Lib.inf b/DynamicTablesPkg/Library/Smbios/SmbiosType7Lib/SmbiosType7Lib.inf new file mode 100644 index 000000000000..43de35da99dc --- /dev/null +++ b/DynamicTablesPkg/Library/Smbios/SmbiosType7Lib/SmbiosType7Lib.inf @@ -0,0 +1,35 @@ +## @file +# SMBIOS Type7 Table Generator +# +# Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2019 - 2025, Arm Limited. All rights reserved.
    +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = SmbiosType7LibArm + FILE_GUID = 5ee509b7-032e-4178-a0b0-1edab8f412a4 + VERSION_STRING = 1.0 + MODULE_TYPE = DXE_DRIVER + LIBRARY_CLASS = NULL|DXE_DRIVER + CONSTRUCTOR = SmbiosType7LibConstructor + DESTRUCTOR = SmbiosType7LibDestructor + +[Sources] + SmbiosType7Generator.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + EmbeddedPkg/EmbeddedPkg.dec + ArmPlatformPkg/ArmPlatformPkg.dec + DynamicTablesPkg/DynamicTablesPkg.dec + +[Protocols] + +[LibraryClasses] + BaseLib + DebugLib + SmbiosStringTableLib From 6979b733acb30df70509dba0472d3b878ef3baa1 Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Tue, 11 Feb 2025 15:22:44 +0000 Subject: [PATCH 0592/1172] DynamicTablesPkg: Smbios Processor Information (Type 4) Signed-off-by: Sarah Walker --- DynamicTablesPkg/DynamicTables.dsc.inc | 2 + .../Include/ArchCommonNameSpaceObjects.h | 22 +- .../SmbiosType4Lib/SmbiosType4Generator.c | 571 ++++++++++++++++++ .../Smbios/SmbiosType4Lib/SmbiosType4Lib.inf | 33 + 4 files changed, 626 insertions(+), 2 deletions(-) create mode 100644 DynamicTablesPkg/Library/Smbios/SmbiosType4Lib/SmbiosType4Generator.c create mode 100644 DynamicTablesPkg/Library/Smbios/SmbiosType4Lib/SmbiosType4Lib.inf diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc index a6420cdc1864..e407592a0a73 100644 --- a/DynamicTablesPkg/DynamicTables.dsc.inc +++ b/DynamicTablesPkg/DynamicTables.dsc.inc @@ -102,6 +102,7 @@ DynamicTablesPkg/Library/Acpi/Arm/AcpiIortLibArm/AcpiIortLibArm.inf DynamicTablesPkg/Library/Acpi/Arm/AcpiMadtLibArm/AcpiMadtLibArm.inf + DynamicTablesPkg/Library/Smbios/SmbiosType4Lib/SmbiosType4Lib.inf DynamicTablesPkg/Library/Smbios/SmbiosType7Lib/SmbiosType7Lib.inf # AML Fixup (Arm specific) @@ -142,5 +143,6 @@ NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieLib.inf + NULL|DynamicTablesPkg/Library/Smbios/SmbiosType4Lib/SmbiosType4Lib.inf NULL|DynamicTablesPkg/Library/Smbios/SmbiosType7Lib/SmbiosType7Lib.inf } diff --git a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h index 1c5684ae7388..7cf73947074c 100644 --- a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h +++ b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h @@ -408,6 +408,8 @@ typedef struct CmArchCommonLpiInfo { CHAR8 StateName[16]; } CM_ARCH_COMMON_LPI_INFO; +#define SMBIOS_MAX_STRING_SIZE (1024) + /** A structure that describes the Processor Hierarchy Node (Type 0) in PPTT ID: EArchCommonObjProcHierarchyInfo @@ -447,10 +449,26 @@ typedef struct CmArchCommonProcHierarchyInfo { /// If OverrideNameUidEnabled is TRUE then this value will be used for /// the UID of processor containers. UINT32 OverrideUid; + /// SMBIOS: Processor ID. See SMBIOS "Processor ID field format" for format details. + UINT64 ProcessorId; + /// SMBIOS: Designation of this CM_ARCH_COMMON_PROC_HIERARCHY_INFO instance. + /// This string (and all that follow) are intended only for instances with + /// EFI_ACPI_6_3_PPTT_PACKAGE_PHYSICAL set, ie describing physical sockets. + CHAR8 SocketDesignation[SMBIOS_MAX_STRING_SIZE]; + /// SMBIOS: String stating processor manufacturer. + CHAR8 ProcessorManufacturer[SMBIOS_MAX_STRING_SIZE]; + /// SMBIOS: String stating processor version / device name. + CHAR8 ProcessorVersion[SMBIOS_MAX_STRING_SIZE]; + /// SMBIOS: String stating processor serial number. + CHAR8 SerialNumber[SMBIOS_MAX_STRING_SIZE]; + /// SMBIOS: String stating processor asset tag. + CHAR8 AssetTag[SMBIOS_MAX_STRING_SIZE]; + /// SMBIOS: String stating processor part number. + CHAR8 PartNumber[SMBIOS_MAX_STRING_SIZE]; + /// SMBIOS: String stating processor socket type. + CHAR8 SocketType[SMBIOS_MAX_STRING_SIZE]; } CM_ARCH_COMMON_PROC_HIERARCHY_INFO; -#define SMBIOS_MAX_STRING_SIZE (1024) - /** A structure that describes the Cache Type Structure (Type 1) in PPTT ID: EArchCommonObjCacheInfo diff --git a/DynamicTablesPkg/Library/Smbios/SmbiosType4Lib/SmbiosType4Generator.c b/DynamicTablesPkg/Library/Smbios/SmbiosType4Lib/SmbiosType4Generator.c new file mode 100644 index 000000000000..7be700cfc6c7 --- /dev/null +++ b/DynamicTablesPkg/Library/Smbios/SmbiosType4Lib/SmbiosType4Generator.c @@ -0,0 +1,571 @@ +/** @file + SMBIOS Type4 Table Generator. + + Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + Copyright (c) 2020 - 2025, Arm Limited. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include +#include +#include + +// Module specific include files. +#include +#include +#include +#include +#include + +/** + This macro expands to a function that retrieves the Processor Hierarchy + information from the Configuration Manager. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceArchCommon, + EArchCommonObjProcHierarchyInfo, + CM_ARCH_COMMON_PROC_HIERARCHY_INFO + ); + +/** + This macro expands to a function that retrieves the Cache information from the + Configuration Manager. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceArchCommon, + EArchCommonObjCacheInfo, + CM_ARCH_COMMON_CACHE_INFO + ); + +#define SMBIOS_TYPE4_MAX_STRINGS (7) + +/** + * Free any resources allocated when installing SMBIOS Type4 table. + * + * @param [in] This Pointer to the SMBIOS table generator. + * @param [in] TableFactoryProtocol Pointer to the SMBIOS Table Factory + Protocol interface. + + * @param [in] SmbiosTableInfo Pointer to the SMBIOS table information. + * @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol interface. + * @param [in] Table Pointer to the SMBIOS table. + * @param [in] CmObjectToken Pointer to the CM ObjectToken Array. + * @param [in] TableCount Number of SMBIOS tables. + + * @retval EFI_SUCCESS Table generated successfully. + * @retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration + Manager is less than the Object size for + the requested object. + * @retval EFI_INVALID_PARAMETER A parameter is invalid. + * @retval EFI_NOT_FOUND Could not find information. + * @retval EFI_OUT_OF_RESOURCES Could not allocate memory. + * @retval EFI_UNSUPPORTED Unsupported configuration. +**/ +STATIC +EFI_STATUS +FreeSmbiosType4TableEx ( + IN CONST SMBIOS_TABLE_GENERATOR *CONST This, + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CONST CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN SMBIOS_STRUCTURE ***CONST Table, + IN CM_OBJECT_TOKEN **CmObjectToken, + IN CONST UINTN TableCount + ) +{ + UINTN Index; + SMBIOS_STRUCTURE **TableList; + + TableList = *Table; + for (Index = 0; Index < TableCount; Index++) { + if (TableList[Index] != NULL) { + FreePool (TableList[Index]); + } + } + + if (*CmObjectToken != NULL) { + FreePool (*CmObjectToken); + } + + if (TableList != NULL) { + FreePool (TableList); + } + + return EFI_SUCCESS; +} + +/** Find the Processor Hierarchy node from the associated token. + + * @param [in] ProcHierarchyNodeList Pointer to the Processor Hierarchy node + * list. + * @param [in] ProcHierarchyNodeCount Number of nodes in the Processor + * Hierarchy node list. + * @param [in] Token The token to search for. + + * @return Pointer to the Processor hierarchy node. + * @return NULL if token is not in the Processor Hierarchy node list. +**/ +STATIC +CM_ARCH_COMMON_PROC_HIERARCHY_INFO * +FindProcHierarchyInfoFromToken ( + CM_ARCH_COMMON_PROC_HIERARCHY_INFO *ProcHierarchyNodeList, + UINT32 ProcHierarchyNodeCount, + CM_OBJECT_TOKEN Token + ) +{ + UINTN Index; + + for (Index = 0; Index < ProcHierarchyNodeCount; Index++) { + if (ProcHierarchyNodeList[Index].Token == Token) { + return &ProcHierarchyNodeList[Index]; + } + } + + ASSERT (0); + return NULL; +} + +/** Construct SMBIOS Type 4 Table describing CPU devices. + + If this function allocates any resources then they must be freed + in the FreeXXXXTableResources function. + + * @param [in] This Pointer to the SMBIOS table generator. + * @param [in] TableFactoryProtocol Pointer to the SMBIOS Table Factory + * Protocol interface. + * @param [in] SmbiosTableInfo Pointer to the SMBIOS table information. + * @param [in] CfgMgrProtocol Pointer to the Configuration Manager + * Protocol interface. + * @param [out] Table Pointer to the SMBIOS table. + * @param [out] CmObjectToken Pointer to the CM Object Token Array. + * @param [out] TableCount Number of tables installed. + + * @retval EFI_SUCCESS Table generated successfully. + * @retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration + * Manager is less than the Object size for + * the requested object. + * @retval EFI_INVALID_PARAMETER A parameter is invalid. + * @retval EFI_NOT_FOUND Could not find information. + * @retval EFI_OUT_OF_RESOURCES Could not allocate memory. + * @retval EFI_UNSUPPORTED Unsupported configuration. +**/ +STATIC +EFI_STATUS +BuildSmbiosType4TableEx ( + IN CONST SMBIOS_TABLE_GENERATOR *This, + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProtocol, + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + OUT SMBIOS_STRUCTURE ***Table, + OUT CM_OBJECT_TOKEN **CmObjectToken, + OUT UINTN *CONST TableCount + ) +{ + EFI_STATUS Status; + SMBIOS_STRUCTURE **TableList = NULL; + SMBIOS_TABLE_TYPE4 *SmbiosRecord; + UINTN SmbiosRecordSize; + UINTN Index; + UINTN ObjIndex; + UINTN CpuIndex; + UINTN CpuIndex2; + PROCESSOR_STATUS_DATA *StatusData; + PROCESSOR_CHARACTERISTIC_FLAGS *CharacteristicFlags; + + UINT32 ProcHierarchyNodeCount; + UINT32 CacheStructCount; + UINT32 SocketCount; + UINT32 CpuCount; + UINT32 ThreadCount; + + EFI_ACPI_6_3_PPTT_STRUCTURE_PROCESSOR_FLAGS *Flags; + CM_ARCH_COMMON_PROC_HIERARCHY_INFO *ProcHierarchyNodeList; + CM_ARCH_COMMON_PROC_HIERARCHY_INFO *Node; + CM_ARCH_COMMON_CACHE_INFO *CacheStructList; + + STRING_TABLE StrTable; + UINT8 SocketDesignationRef; + UINT8 ProcessorManufacturerRef; + UINT8 ProcessorVersionRef; + UINT8 SerialNumberRef; + UINT8 AssetTagRef; + UINT8 PartNumberRef; + UINT8 SocketTypeRef; + + ASSERT (This != NULL); + ASSERT (SmbiosTableInfo != NULL); + ASSERT (CfgMgrProtocol != NULL); + ASSERT (Table != NULL); + ASSERT (TableCount != NULL); + ASSERT (SmbiosTableInfo->TableGeneratorId == This->GeneratorID); + + if ((This == NULL) || (SmbiosTableInfo == NULL) || (CfgMgrProtocol == NULL) || + (Table == NULL) || (TableCount == NULL) || + (SmbiosTableInfo->TableGeneratorId != This->GeneratorID)) + { + DEBUG ((DEBUG_ERROR, "%a:Invalid Paramater\n ", __func__)); + return EFI_INVALID_PARAMETER; + } + + *Table = NULL; + + // Get the processor hierarchy info and update the processor topology + // structure count with Processor Hierarchy Nodes (Type 0) + Status = GetEArchCommonObjProcHierarchyInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &ProcHierarchyNodeList, + &ProcHierarchyNodeCount + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to get processor hierarchy info. Status = %r\n", + __func__, + Status + )); + return EFI_INVALID_PARAMETER; + } + + // Get the cache info and update the processor topology structure count with + // Cache Type Structures (Type 1) + Status = GetEArchCommonObjCacheInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &CacheStructList, + &CacheStructCount + ); + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to get cache info. Status = %r\n", + __func__, + Status + )); + return EFI_INVALID_PARAMETER; + } + + // Count the number of sockets in the current hierarchy. This will determine + // the number of type 4 records that will be generated. + SocketCount = 0; + for (Index = 0; Index < ProcHierarchyNodeCount; Index++) { + if (ProcHierarchyNodeList[Index].Flags & EFI_ACPI_6_3_PPTT_PACKAGE_PHYSICAL) { + SocketCount++; + } + } + + if (SocketCount == 0) { + ASSERT (SocketCount != 0); + return EFI_INVALID_PARAMETER; + } + + TableList = (SMBIOS_STRUCTURE **)AllocateZeroPool (sizeof (SMBIOS_STRUCTURE *) * SocketCount); + if (TableList == NULL) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to alloc memory for %u devices table\n", + __func__, + SocketCount + )); + Status = EFI_OUT_OF_RESOURCES; + goto exitErrorBuildSmbiosType4Table; + } + + ObjIndex = 0; + + for (Index = 0; Index < ProcHierarchyNodeCount; Index++) { + if ((ProcHierarchyNodeList[Index].Flags & EFI_ACPI_6_3_PPTT_PACKAGE_PHYSICAL) == 0) { + continue; + } + + StringTableInitialize (&StrTable, SMBIOS_TYPE4_MAX_STRINGS); + + SocketDesignationRef = 0; + ProcessorManufacturerRef = 0; + ProcessorVersionRef = 0; + SerialNumberRef = 0; + AssetTagRef = 0; + PartNumberRef = 0; + SocketTypeRef = 0; + + if (ProcHierarchyNodeList[Index].SocketDesignation[0]) { + Status = StringTableAddString (&StrTable, ProcHierarchyNodeList[Index].SocketDesignation, &SocketDesignationRef); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to add Socket Designation String %r\n", Status)); + ASSERT (!EFI_ERROR (Status)); + goto exitErrorBuildSmbiosType4Table; + } + } + + if (ProcHierarchyNodeList[Index].ProcessorManufacturer[0]) { + Status = StringTableAddString (&StrTable, ProcHierarchyNodeList[Index].ProcessorManufacturer, &ProcessorManufacturerRef); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to add Processor Manufacturer String %r\n", Status)); + ASSERT (!EFI_ERROR (Status)); + goto exitErrorBuildSmbiosType4Table; + } + } + + if (ProcHierarchyNodeList[Index].ProcessorVersion[0]) { + Status = StringTableAddString (&StrTable, ProcHierarchyNodeList[Index].ProcessorVersion, &ProcessorVersionRef); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to add Processor Version String %r\n", Status)); + ASSERT (!EFI_ERROR (Status)); + goto exitErrorBuildSmbiosType4Table; + } + } + + if (ProcHierarchyNodeList[Index].SerialNumber[0]) { + Status = StringTableAddString (&StrTable, ProcHierarchyNodeList[Index].SerialNumber, &SerialNumberRef); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to add Serial Number String %r\n", Status)); + ASSERT (!EFI_ERROR (Status)); + goto exitErrorBuildSmbiosType4Table; + } + } + + if (ProcHierarchyNodeList[Index].AssetTag[0]) { + Status = StringTableAddString (&StrTable, ProcHierarchyNodeList[Index].AssetTag, &AssetTagRef); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to add Asset Tag String %r\n", Status)); + ASSERT (!EFI_ERROR (Status)); + goto exitErrorBuildSmbiosType4Table; + } + } + + if (ProcHierarchyNodeList[Index].PartNumber[0]) { + Status = StringTableAddString (&StrTable, ProcHierarchyNodeList[Index].PartNumber, &PartNumberRef); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to add Part Number String %r\n", Status)); + ASSERT (!EFI_ERROR (Status)); + goto exitErrorBuildSmbiosType4Table; + } + } + + if (ProcHierarchyNodeList[Index].SocketType[0]) { + Status = StringTableAddString (&StrTable, ProcHierarchyNodeList[Index].SocketType, &SocketTypeRef); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to add Socket Type String %r\n", Status)); + ASSERT (!EFI_ERROR (Status)); + goto exitErrorBuildSmbiosType4Table; + } + } + + SmbiosRecordSize = sizeof (SMBIOS_TABLE_TYPE4) + StringTableGetStringSetSize (&StrTable); + SmbiosRecord = (SMBIOS_TABLE_TYPE4 *)AllocateZeroPool (SmbiosRecordSize); + if (SmbiosRecord == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto exitErrorBuildSmbiosType4Table; + } + + // Set up the header + SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION; + SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE4); + + CpuCount = 0; + ThreadCount = 0; + + SmbiosRecord->L1CacheHandle = FindSmbiosHandleEx ( + CREATE_STD_SMBIOS_TABLE_GEN_ID (EStdSmbiosTableIdType07), + CM_ABSTRACT_TOKEN_MAKE (ETokenNameSpaceSmbios, EStdSmbiosTableIdType07, 0 | (Index << 2)) + ); + SmbiosRecord->L2CacheHandle = FindSmbiosHandleEx ( + CREATE_STD_SMBIOS_TABLE_GEN_ID (EStdSmbiosTableIdType07), + CM_ABSTRACT_TOKEN_MAKE (ETokenNameSpaceSmbios, EStdSmbiosTableIdType07, 1 | (Index << 2)) + ); + SmbiosRecord->L3CacheHandle = FindSmbiosHandleEx ( + CREATE_STD_SMBIOS_TABLE_GEN_ID (EStdSmbiosTableIdType07), + CM_ABSTRACT_TOKEN_MAKE (ETokenNameSpaceSmbios, EStdSmbiosTableIdType07, 2 | (Index << 2)) + ); + + // Find all CPUs on this socket in order to set the cache handles + for (CpuIndex = 0; CpuIndex < ProcHierarchyNodeCount; CpuIndex++) { + Node = &ProcHierarchyNodeList[CpuIndex]; + Flags = (EFI_ACPI_6_3_PPTT_STRUCTURE_PROCESSOR_FLAGS *)&Node->Flags; + + if (!Flags->NodeIsALeaf) { + continue; + } + + // Walk through ParentToken to find the socket node + while (!Flags->PhysicalPackage) { + Node = FindProcHierarchyInfoFromToken (ProcHierarchyNodeList, ProcHierarchyNodeCount, Node->ParentToken); + + if (Node == NULL) { + ASSERT (Node != NULL); + Status = EFI_INVALID_PARAMETER; + goto exitErrorBuildSmbiosType4Table; + } + + Flags = (EFI_ACPI_6_3_PPTT_STRUCTURE_PROCESSOR_FLAGS *)&Node->Flags; + } + + // Is this CPU on the current socket? + if (Node != &ProcHierarchyNodeList[Index]) { + continue; + } + + Node = &ProcHierarchyNodeList[CpuIndex]; + Flags = (EFI_ACPI_6_3_PPTT_STRUCTURE_PROCESSOR_FLAGS *)&Node->Flags; + if (Flags->ProcessorIsAThread) { + // Only increment CPU count on the first leaf node + for (CpuIndex2 = 0; CpuIndex2 < CpuIndex; CpuIndex2++) { + if (ProcHierarchyNodeList[CpuIndex2].ParentToken == Node->ParentToken) { + break; + } + } + + if (CpuIndex == CpuIndex2) { + CpuCount++; + } + } else { + CpuCount++; + } + + ThreadCount++; + } + + SmbiosRecord->ProcessorType = CentralProcessor; + SmbiosRecord->ProcessorUpgrade = ProcessorUpgradeUnknown; + #if defined (MDE_CPU_AARCH64) + SmbiosRecord->ProcessorFamily = ProcessorFamilyIndicatorFamily2; + SmbiosRecord->ProcessorFamily2 = ProcessorFamilyARMv8; + SmbiosRecord->ProcessorId.SocId = ProcHierarchyNodeList[Index].ProcessorId & 0xffff; + SmbiosRecord->ProcessorId.SipId = (ProcHierarchyNodeList[Index].ProcessorId >> 16) & 0xff; + SmbiosRecord->ProcessorId.SipBankIndex = (ProcHierarchyNodeList[Index].ProcessorId >> 24) & 0xff; + SmbiosRecord->ProcessorId.SocRevision = ProcHierarchyNodeList[Index].ProcessorId >> 32; + #else + DEBUG ((DEBUG_ERROR, "SmbiosType4Generator needs extending for your CPU\n")); + #endif + + StatusData = (PROCESSOR_STATUS_DATA *)&SmbiosRecord->Status; + StatusData->Bits.SocketPopulated = 1; + + CharacteristicFlags = (PROCESSOR_CHARACTERISTIC_FLAGS *)&SmbiosRecord->ProcessorCharacteristics; + #if defined (MDE_CPU_AARCH64) + CharacteristicFlags->Processor64BitCapable = 1; + #endif + CharacteristicFlags->ProcessorMultiCore = (CpuCount > 1) ? 1 : 0; + CharacteristicFlags->ProcessorHardwareThread = (ThreadCount > CpuCount) ? 1 : 0; + + SmbiosRecord->CoreCount = (CpuCount < 256) ? CpuCount : 0xff; + SmbiosRecord->CoreCount2 = CpuCount; + SmbiosRecord->EnabledCoreCount = (CpuCount < 256) ? CpuCount : 0xff; + SmbiosRecord->EnabledCoreCount2 = CpuCount; + SmbiosRecord->ThreadCount = (ThreadCount < 256) ? ThreadCount : 0xff; + SmbiosRecord->ThreadCount2 = ThreadCount; + SmbiosRecord->ThreadEnabled = ThreadCount; + + SmbiosRecord->Socket = SocketDesignationRef; + SmbiosRecord->ProcessorManufacturer = ProcessorManufacturerRef; + SmbiosRecord->ProcessorVersion = ProcessorVersionRef; + SmbiosRecord->SerialNumber = SerialNumberRef; + SmbiosRecord->AssetTag = AssetTagRef; + SmbiosRecord->PartNumber = PartNumberRef; + SmbiosRecord->SocketType = SocketTypeRef; + + StringTablePublishStringSet (&StrTable, (CHAR8 *)(SmbiosRecord + 1), SmbiosRecordSize - sizeof (SMBIOS_TABLE_TYPE4)); + + TableList[ObjIndex] = (SMBIOS_STRUCTURE *)SmbiosRecord; + ObjIndex++; + ASSERT (ObjIndex <= SocketCount); + } + + ASSERT (ObjIndex == SocketCount); + + *Table = TableList; + *CmObjectToken = NULL; + *TableCount = SocketCount; + + return EFI_SUCCESS; + +exitErrorBuildSmbiosType4Table: + if (TableList) { + FreePool (TableList); + } + + return Status; +} + +/** The interface for the SMBIOS Type4 Table Generator. +*/ +STATIC +CONST +SMBIOS_TABLE_GENERATOR SmbiosType4Generator = { + // Generator ID + CREATE_STD_SMBIOS_TABLE_GEN_ID (EStdSmbiosTableIdType04), + // Generator Description + L"SMBIOS.TYPE4.GENERATOR", + // SMBIOS Table Type + EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION, + NULL, + NULL, + // Build table function. + BuildSmbiosType4TableEx, + // Free function. + FreeSmbiosType4TableEx, +}; + +/** Register the Generator with the SMBIOS Table Factory. + + @param [in] ImageHandle The handle to the image. + @param [in] SystemTable Pointer to the System Table. + + @retval EFI_SUCCESS The Generator is registered. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_ALREADY_STARTED The Generator for the Table ID + is already registered. +**/ +EFI_STATUS +EFIAPI +SmbiosType4LibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = RegisterSmbiosTableGenerator (&SmbiosType4Generator); + DEBUG (( + DEBUG_INFO, + "SMBIOS Type 4: Register Generator. Status = %r\n", + Status + )); + ASSERT_EFI_ERROR (Status); + + return Status; +} + +/** Deregister the Generator from the SMBIOS Table Factory. + + @param [in] ImageHandle The handle to the image. + @param [in] SystemTable Pointer to the System Table. + + @retval EFI_SUCCESS The Generator is deregistered. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND The Generator is not registered. +**/ +EFI_STATUS +EFIAPI +SmbiosType4LibDestructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = DeregisterSmbiosTableGenerator (&SmbiosType4Generator); + DEBUG (( + DEBUG_INFO, + "SMBIOS Type 4: Deregister Generator. Status = %r\n", + Status + )); + ASSERT_EFI_ERROR (Status); + return Status; +} diff --git a/DynamicTablesPkg/Library/Smbios/SmbiosType4Lib/SmbiosType4Lib.inf b/DynamicTablesPkg/Library/Smbios/SmbiosType4Lib/SmbiosType4Lib.inf new file mode 100644 index 000000000000..488be49aed90 --- /dev/null +++ b/DynamicTablesPkg/Library/Smbios/SmbiosType4Lib/SmbiosType4Lib.inf @@ -0,0 +1,33 @@ +## @file +# SMBIOS Type4 Table Generator +# +# Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2019 - 2025, Arm Limited. All rights reserved.
    +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = SmbiosType4LibArm + FILE_GUID = a256956a-de0b-4aa7-8eac-5ce13bbfbb1f + VERSION_STRING = 1.0 + MODULE_TYPE = DXE_DRIVER + LIBRARY_CLASS = NULL|DXE_DRIVER + CONSTRUCTOR = SmbiosType4LibConstructor + DESTRUCTOR = SmbiosType4LibDestructor + +[Sources] + SmbiosType4Generator.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + EmbeddedPkg/EmbeddedPkg.dec + ArmPlatformPkg/ArmPlatformPkg.dec + DynamicTablesPkg/DynamicTablesPkg.dec + +[LibraryClasses] + BaseLib + DebugLib + SmbiosStringTableLib From 3e62dbf50452fa406e1b0246bcbd9e82685c0013 Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Fri, 18 Jul 2025 14:44:17 +0100 Subject: [PATCH 0593/1172] DynamicTablesPkg: DynamicTableManagerDxe: Fix NULL pointer dereference BuildAndInstallMultipleSmbiosTables() can dereference a NULL pointer if the SMBIOS table builder returns a NULL CmObjToken array. Signed-off-by: Sarah Walker --- .../Drivers/DynamicTableManagerDxe/SmbiosTableBuilder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableBuilder.c b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableBuilder.c index 80a012ca05f5..6cfc9277e752 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableBuilder.c +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableBuilder.c @@ -264,7 +264,7 @@ BuildAndInstallMultipleSmbiosTables ( Status = TableFactoryProtocol->AddSmbiosHandle ( SmbiosProtocol, &TableHandle, - CmObjToken[Index], + CmObjToken ? CmObjToken[Index] : CM_NULL_TOKEN, SmbiosTableInfo->TableGeneratorId ); if (EFI_ERROR (Status)) { From 34e3bd44ffb032eab1ccd4922d991608b5c3144b Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Fri, 18 Jul 2025 15:23:07 +0100 Subject: [PATCH 0594/1172] DynamicTablesPkg: Add SmbiosSmcLib Implement a support library for SMBIOS-related SMC calls. Currently this implements a function to return the SoC ID. Signed-off-by: Sarah Walker --- DynamicTablesPkg/DynamicTablesPkg.ci.yaml | 2 + DynamicTablesPkg/DynamicTablesPkg.dec | 3 + DynamicTablesPkg/DynamicTablesPkg.dsc | 1 + .../Include/Library/SmbiosSmcLib.h | 24 ++++ .../Smbios/Arm/SmbiosSmcLib/SmbiosSmcLib.c | 114 ++++++++++++++++++ .../Smbios/Arm/SmbiosSmcLib/SmbiosSmcLib.inf | 26 ++++ 6 files changed, 170 insertions(+) create mode 100644 DynamicTablesPkg/Include/Library/SmbiosSmcLib.h create mode 100644 DynamicTablesPkg/Library/Smbios/Arm/SmbiosSmcLib/SmbiosSmcLib.c create mode 100644 DynamicTablesPkg/Library/Smbios/Arm/SmbiosSmcLib/SmbiosSmcLib.inf diff --git a/DynamicTablesPkg/DynamicTablesPkg.ci.yaml b/DynamicTablesPkg/DynamicTablesPkg.ci.yaml index 56069e286f6e..2c0dcefefb1a 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.ci.yaml +++ b/DynamicTablesPkg/DynamicTablesPkg.ci.yaml @@ -118,6 +118,7 @@ "lless", "MPIDR", "NAMESPACEID", + "NUVIA", "PASID", "PERIPHBASE", "phandle", @@ -128,6 +129,7 @@ "sapic", "ssdtcmn", "ssdtserialporttemplate", + "SMCCC", "SMMUV", "ssdtpcieosctemplate", "SSDTPC", diff --git a/DynamicTablesPkg/DynamicTablesPkg.dec b/DynamicTablesPkg/DynamicTablesPkg.dec index d0aa4bcf7621..4ed8e834ca2b 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dec +++ b/DynamicTablesPkg/DynamicTablesPkg.dec @@ -55,6 +55,9 @@ ## @libraryclass Defines a set of methods for generating Tpm2 Device Table method. Tpm2DeviceTableLib|Include/Library/Tpm2DeviceTableLib.h + ## @libraryclass Defines a set of SMBIOS related SMC helper methods. + SmcbiosSmbLib|Include/Library/SmbiosSmcLib.h + [LibraryClasses.AARCH64] ## @libraryclass Defines a set of APIs to populate CmObj using SCMI. DynamicTablesScmiInfoLib|Include/Library/DynamicTablesScmiInfoLib.h diff --git a/DynamicTablesPkg/DynamicTablesPkg.dsc b/DynamicTablesPkg/DynamicTablesPkg.dsc index 1c34609bf3f4..e4fcc45f44e5 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dsc +++ b/DynamicTablesPkg/DynamicTablesPkg.dsc @@ -55,6 +55,7 @@ [Components.AARCH64] DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf + DynamicTablesPkg/Library/Smbios/Arm/SmbiosSmcLib/SmbiosSmcLib.inf [Components.AARCH64] DynamicTablesPkg/Library/DynamicTablesScmiInfoLib/DynamicTablesScmiInfoLib.inf diff --git a/DynamicTablesPkg/Include/Library/SmbiosSmcLib.h b/DynamicTablesPkg/Include/Library/SmbiosSmcLib.h new file mode 100644 index 000000000000..f3aef3b88fdb --- /dev/null +++ b/DynamicTablesPkg/Include/Library/SmbiosSmcLib.h @@ -0,0 +1,24 @@ +/** @file +* +* Copyright (c) 2025, ARM Limited. All rights reserved. +* +* SPDX-License-Identifier: BSD-2-Clause-Patent +* +**/ + +#ifndef SMBIOS_SMC_LIB_H_ +#define SMBIOS_SMC_LIB_H_ + +/** Returns the SOC ID, formatted for the SMBIOS Type 4 Processor ID field. + + @param Processor ID. + + @return 0 on success + @return EFI_UNSUPPORTED if SMCCC_ARCH_SOC_ID is not implemented +**/ +UINT64 +SmbiosSmcGetSocId ( + UINT64 *ProcessorId + ); + +#endif // SMBIOS_SMC_LIB_H_ diff --git a/DynamicTablesPkg/Library/Smbios/Arm/SmbiosSmcLib/SmbiosSmcLib.c b/DynamicTablesPkg/Library/Smbios/Arm/SmbiosSmcLib/SmbiosSmcLib.c new file mode 100644 index 000000000000..1e163c86b2df --- /dev/null +++ b/DynamicTablesPkg/Library/Smbios/Arm/SmbiosSmcLib/SmbiosSmcLib.c @@ -0,0 +1,114 @@ +/** @file + SMBIOS SMC helper functions. + + Copyright (c) 2021, NUVIA Inc. All rights reserved.
    + Copyright (c) 2021 - 2022, Ampere Computing LLC. All rights reserved.
    + Copyright (c) 2025, ARM Ltd. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include + +/** Checks if the ARM64 SoC ID SMC call is supported + + @return Whether the ARM64 SoC ID call is supported. +**/ +STATIC +BOOLEAN +HasSmcArm64SocId ( + VOID + ) +{ + INT32 SmcCallStatus; + BOOLEAN Arm64SocIdSupported; + UINTN SmcParam; + + Arm64SocIdSupported = FALSE; + + SmcCallStatus = ArmCallSmc0 (SMCCC_VERSION, NULL, NULL, NULL); + + if ((SmcCallStatus < 0) || ((SmcCallStatus >> 16) >= 1)) { + SmcParam = SMCCC_ARCH_SOC_ID; + SmcCallStatus = ArmCallSmc1 (SMCCC_ARCH_FEATURES, &SmcParam, NULL, NULL); + if (SmcCallStatus >= 0) { + Arm64SocIdSupported = TRUE; + } + } + + return Arm64SocIdSupported; +} + +/** Fetches the JEP106 code and SoC Revision. + + @param Jep106Code JEP 106 code. + @param SocRevision SoC revision. + + @retval EFI_SUCCESS Succeeded. + @retval EFI_UNSUPPORTED Failed. +**/ +STATIC +EFI_STATUS +SmbiosGetSmcArm64SocId ( + OUT UINT32 *Jep106Code, + OUT UINT32 *SocRevision + ) +{ + INT32 SmcCallStatus; + EFI_STATUS Status; + UINTN SmcParam; + + Status = EFI_SUCCESS; + + SmcParam = 0; + SmcCallStatus = ArmCallSmc1 (SMCCC_ARCH_SOC_ID, &SmcParam, NULL, NULL); + + if (SmcCallStatus >= 0) { + *Jep106Code = (UINT32)SmcCallStatus; + } else { + Status = EFI_UNSUPPORTED; + } + + SmcParam = 1; + SmcCallStatus = ArmCallSmc1 (SMCCC_ARCH_SOC_ID, &SmcParam, NULL, NULL); + + if (SmcCallStatus >= 0) { + *SocRevision = (UINT32)SmcCallStatus; + } else { + Status = EFI_UNSUPPORTED; + } + + return Status; +} + +/** Returns the SOC ID, formatted for the SMBIOS Type 4 Processor ID field. + + @param Processor ID. + + @return 0 on success + @return EFI_UNSUPPORTED if SMCCC_ARCH_SOC_ID is not implemented +**/ +UINT64 +SmbiosSmcGetSocId ( + UINT64 *ProcessorId + ) +{ + EFI_STATUS Status; + UINT32 Jep106Code; + UINT32 SocRevision; + + if (HasSmcArm64SocId ()) { + Status = SmbiosGetSmcArm64SocId (&Jep106Code, &SocRevision); + if (!EFI_ERROR (Status)) { + *ProcessorId = ((UINT64)SocRevision << 32) | Jep106Code; + } + } else { + Status = EFI_UNSUPPORTED; + } + + return Status; +} diff --git a/DynamicTablesPkg/Library/Smbios/Arm/SmbiosSmcLib/SmbiosSmcLib.inf b/DynamicTablesPkg/Library/Smbios/Arm/SmbiosSmcLib/SmbiosSmcLib.inf new file mode 100644 index 000000000000..ea43c0784ada --- /dev/null +++ b/DynamicTablesPkg/Library/Smbios/Arm/SmbiosSmcLib/SmbiosSmcLib.inf @@ -0,0 +1,26 @@ +#/** @file +# +# Copyright (c) 2025, ARM Ltd. All rights reserved.
    +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +#**/ + +[Defines] + INF_VERSION = 1.30 + BASE_NAME = SmbiosSmcLib + FILE_GUID = 201d7312-46c8-42f4-a1cf-38897ddfe916 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = SmbiosSmcLib + +[Sources] + SmbiosSmcLib.c + +[Packages] + DynamicTablesPkg/DynamicTablesPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + ArmSmcLib + From ba079eda61be9777211b330ef737986b859212b4 Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Tue, 22 Jul 2025 09:52:53 +0100 Subject: [PATCH 0595/1172] ArmPkg: Smbios: Update ProcessorSubClassDxe for new SMBIOS structures Update ProcessorSubClassDxe to handle the new cache size and AArch64 PROCESSOR_ID_DATA SMBIOS structures. Signed-off-by: Sarah Walker --- .../ProcessorSubClassDxe/ProcessorSubClass.c | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClass.c b/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClass.c index 4f2d42133756..b49caaab4562 100644 --- a/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClass.c +++ b/ArmPkg/Universal/Smbios/ProcessorSubClassDxe/ProcessorSubClass.c @@ -68,12 +68,19 @@ SMBIOS_TABLE_TYPE4 mSmbiosProcessorTableTemplate = { ProcessorFamilyIndicatorFamily2, // ProcessorFamily 2, // ProcessorManufacture { // ProcessorId + #ifdef MDE_CPU_AARCH64 + 0, // SocId + 0, // SipId + 0, // SipBankIndex + 0 // SocRevision + #else { // Signature 0 }, { // FeatureFlags 0 } + #endif }, 3, // ProcessorVersion { // Voltage @@ -192,10 +199,10 @@ ConfigureCacheArchitectureInformation ( OUT SMBIOS_TABLE_TYPE7 *Type7Record ) { - UINT8 Associativity; - UINT32 CacheSize32; - UINT16 CacheSize16; - UINT64 CacheSize64; + UINT8 Associativity; + SMBIOS_CACHE_SIZE_2 CacheSize32; + SMBIOS_CACHE_SIZE CacheSize16; + UINT64 CacheSize64; if (!DataCache && !UnifiedCache) { Type7Record->SystemCacheType = CacheTypeInstruction; @@ -223,19 +230,26 @@ ConfigureCacheArchitectureInformation ( // Encode the cache size into the format SMBIOS wants if (CacheSize64 < MAX_INT16) { - CacheSize16 = CacheSize64; - CacheSize32 = CacheSize16; + CacheSize16.Size = CacheSize64; + CacheSize16.Granularity64K = 0; + CacheSize32.Size = CacheSize64; + CacheSize32.Granularity64K = 0; } else if ((CacheSize64 / 64) < MAX_INT16) { - CacheSize16 = (1 << 15) | (CacheSize64 / 64); - CacheSize32 = (1 << 31) | (CacheSize64 / 64); + CacheSize16.Size = CacheSize64 / 64; + CacheSize16.Granularity64K = 1; + CacheSize32.Size = CacheSize64 / 64; + CacheSize32.Granularity64K = 1; } else { if ((CacheSize64 / 1024) <= 2047) { - CacheSize32 = CacheSize64; + CacheSize32.Size = CacheSize64; + CacheSize32.Granularity64K = 0; } else { - CacheSize32 = (1 << 31) | (CacheSize64 / 64); + CacheSize32.Size = CacheSize64 / 64; + CacheSize32.Granularity64K = 1; } - CacheSize16 = -1; + CacheSize16.Size = 0x7fff; + CacheSize16.Granularity64K = 1; } Type7Record->MaximumCacheSize = CacheSize16; From 9c651ef83a74d83219075316aa5d1c189ed608c8 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Mon, 15 Sep 2025 14:45:36 +0100 Subject: [PATCH 0596/1172] SecurityPkg/Library: introduce HashLibTpm2PeilessSec PeilessSec couldn't use the HasLibTpm2 since: - HashLibTpm2 uses memory allocation/free for Hash interface. But in PeilessSecPhase doesn't support the free memory since the allocation of memory via MemoryAllocation APIs is allocated using HOB which couldn't be freed. - In SEC phase, it couldn't use DynamicPcd -- PcdHashMasks - PeilessSec utilises the algorithm passed in the SpecId event log handed off by TF-A To address theses, introduce HashLibTpm2PeilessSec used for measurements in the PeilessSec. Signed-off-by: Yeoreum Yun --- .../HashLibTpm2/HashLibTpm2PeilessSecLib.c | 623 ++++++++++++++++++ .../HashLibTpm2/HashLibTpm2PeilessSecLib.inf | 47 ++ SecurityPkg/SecurityPkg.ci.yaml | 2 + SecurityPkg/SecurityPkg.dsc | 1 + 4 files changed, 673 insertions(+) create mode 100644 SecurityPkg/Library/HashLibTpm2/HashLibTpm2PeilessSecLib.c create mode 100644 SecurityPkg/Library/HashLibTpm2/HashLibTpm2PeilessSecLib.inf diff --git a/SecurityPkg/Library/HashLibTpm2/HashLibTpm2PeilessSecLib.c b/SecurityPkg/Library/HashLibTpm2/HashLibTpm2PeilessSecLib.c new file mode 100644 index 000000000000..39fff8e90de1 --- /dev/null +++ b/SecurityPkg/Library/HashLibTpm2/HashLibTpm2PeilessSecLib.c @@ -0,0 +1,623 @@ +/** @file + + Copyright (c) 2025, Arm Limited. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define HASH_ALG_ERROR 0x00 +#define BAD_SEQ_HANDLE 0xFFFFFFFF +#define BAD_HASH_HANDLE 0x00 + +typedef struct { + TPM_ALG_ID AlgoId; + UINT32 Mask; + TPMI_DH_OBJECT SequenceHandle; +} TPM2_HASH_MASK; + +STATIC TPM2_HASH_MASK mTpm2HashMask[] = { + { TPM_ALG_SHA1, HASH_ALG_SHA1, BAD_SEQ_HANDLE }, + { TPM_ALG_SHA256, HASH_ALG_SHA256, BAD_SEQ_HANDLE }, + { TPM_ALG_SHA384, HASH_ALG_SHA384, BAD_SEQ_HANDLE }, + { TPM_ALG_SHA512, HASH_ALG_SHA512, BAD_SEQ_HANDLE }, +}; + +STATIC UINT32 mSupportedHashBitmap; +STATIC BOOLEAN mHashLibDisabled; + +/** + Get transfer list header. + + @param[out] TransferList Transfer list header + + @retval EFI_SUCCESS Transfer list is found. + @retval EFI_NOT_FOUND Transfer list is not found. + +**/ +STATIC +EFI_STATUS +EFIAPI +GetTransferList ( + OUT TRANSFER_LIST_HEADER **TransferList + ) +{ + VOID *HobList; + EFI_HOB_GUID_TYPE *GuidHob; + UINTN *GuidHobData; + + *TransferList = NULL; + + HobList = GetHobList (); + if (HobList == NULL) { + return EFI_NOT_FOUND; + } + + GuidHob = GetNextGuidHob (&gArmTransferListHobGuid, HobList); + if (GuidHob == NULL) { + return EFI_NOT_FOUND; + } + + GuidHobData = GET_GUID_HOB_DATA (GuidHob); + + *TransferList = (TRANSFER_LIST_HEADER *)(*GuidHobData); + + return EFI_SUCCESS; +} + +/** + The function get algorithm from hash mask info. + + @param[in] HashMask + + @return Hash algorithm + +**/ +STATIC +TPM_ALG_ID +EFIAPI +Tpm2GetAlgoFromHashMask ( + IN UINT32 HashMask + ) +{ + UINTN Idx; + + for (Idx = 0; Idx < ARRAY_SIZE (mTpm2HashMask); Idx++) { + if (mTpm2HashMask[Idx].Mask == HashMask) { + return mTpm2HashMask[Idx].AlgoId; + } + } + + return TPM_ALG_ERROR; +} + +/** + The function get hashmask from algorithm info. + + @param[in] AlgoId + + @return Hash mask + +**/ +STATIC +UINT32 +EFIAPI +Tpm2GetHashMaskFromAlgo ( + TPM_ALG_ID AlgoId + ) +{ + UINTN Idx; + + for (Idx = 0; Idx < ARRAY_SIZE (mTpm2HashMask); Idx++) { + if (mTpm2HashMask[Idx].AlgoId == AlgoId) { + return mTpm2HashMask[Idx].Mask; + } + } + + return HASH_ALG_ERROR; +} + +/** + Validate hash handle. + + @param[in] HashHandle HashHandle + + @return EFI_SUCCESS + @return EFI_INVALID_PARAMETER Invalidate HashHandle + +**/ +STATIC +EFI_STATUS +EFIAPI +ValidateHashHandle ( + IN HASH_HANDLE HashHandle + ) +{ + UINT32 Idx; + UINT32 HashMask; + + for (Idx = 0; Idx < ARRAY_SIZE (mTpm2HashMask); Idx++) { + HashMask = 1 << Idx; + + if ((HashHandle & HashMask) == 0x00) { + continue; + } + + if (((mSupportedHashBitmap & HashMask) == 0x00) || + (mTpm2HashMask[Idx].SequenceHandle == BAD_SEQ_HANDLE)) + { + return EFI_INVALID_PARAMETER; + } + } + + return EFI_SUCCESS; +} + +/** + Clear Sequence Handles. + +**/ +STATIC +VOID +ClearSequenceHandles ( + IN VOID + ) +{ + UINT32 Idx; + + for (Idx = 0; Idx < ARRAY_SIZE (mTpm2HashMask); Idx++) { + mTpm2HashMask[Idx].SequenceHandle = BAD_SEQ_HANDLE; + } +} + +/** + Start hash sequence. + + @param HashHandle Hash handle. + + @retval EFI_SUCCESS Hash sequence start and HandleHandle returned. + @retval EFI_OUT_OF_RESOURCES No enough resource to start hash. + +**/ +EFI_STATUS +EFIAPI +HashStart ( + OUT HASH_HANDLE *HashHandle + ) +{ + EFI_STATUS Status; + TPM_ALG_ID AlgoId; + UINT32 Idx; + UINT32 HashMask; + HASH_HANDLE Handle; + + if (mHashLibDisabled) { + return EFI_UNSUPPORTED; + } + + Handle = BAD_HASH_HANDLE; + + for (Idx = 0; Idx < ARRAY_SIZE (mTpm2HashMask); Idx++) { + HashMask = 1 << Idx; + + if ((mSupportedHashBitmap & HashMask) == 0x00) { + continue; + } + + if (mTpm2HashMask[Idx].SequenceHandle != BAD_SEQ_HANDLE) { + Status = EFI_ALREADY_STARTED; + Handle = BAD_HASH_HANDLE; + goto ErrorHandler; + } + + AlgoId = Tpm2GetAlgoFromHashMask (HashMask); + ASSERT (AlgoId != TPM_ALG_ERROR); + + Status = Tpm2HashSequenceStart (AlgoId, &mTpm2HashMask[Idx].SequenceHandle); + if (EFI_ERROR (Status)) { + Handle = BAD_HASH_HANDLE; + goto ErrorHandler; + } + + Handle |= HashMask; + } + +ErrorHandler: + *HashHandle = Handle; + if (Handle == BAD_HASH_HANDLE) { + ClearSequenceHandles (); + } + + return Status; +} + +/** + Update hash sequence data. + + @param HashHandle Hash handle. + @param DataToHash Data to be hashed. + @param DataToHashLen Data size. + + @retval EFI_SUCCESS Hash sequence updated. + +**/ +EFI_STATUS +EFIAPI +HashUpdate ( + IN HASH_HANDLE HashHandle, + IN VOID *DataToHash, + IN UINTN DataToHashLen + ) +{ + EFI_STATUS Status; + UINT32 Idx; + UINT32 HashMask; + UINT8 *Buffer; + UINT64 HashLen; + TPM2B_MAX_BUFFER HashBuffer; + + if (mHashLibDisabled) { + return EFI_UNSUPPORTED; + } + + Status = ValidateHashHandle (HashHandle); + if (EFI_ERROR (Status)) { + return Status; + } + + for (Idx = 0; Idx < ARRAY_SIZE (mTpm2HashMask); Idx++) { + HashMask = 1 << Idx; + + if ((HashHandle & HashMask) == 0x00) { + continue; + } + + Buffer = (UINT8 *)(UINTN)DataToHash; + for (HashLen = DataToHashLen; HashLen > sizeof (HashBuffer.buffer); HashLen -= sizeof (HashBuffer.buffer)) { + HashBuffer.size = sizeof (HashBuffer.buffer); + CopyMem (HashBuffer.buffer, Buffer, sizeof (HashBuffer.buffer)); + Buffer += sizeof (HashBuffer.buffer); + + Status = Tpm2SequenceUpdate (mTpm2HashMask[Idx].SequenceHandle, &HashBuffer); + if (EFI_ERROR (Status)) { + return EFI_DEVICE_ERROR; + } + } + + // Last one + HashBuffer.size = (UINT16)HashLen; + CopyMem (HashBuffer.buffer, Buffer, (UINTN)HashLen); + Status = Tpm2SequenceUpdate (mTpm2HashMask[Idx].SequenceHandle, &HashBuffer); + if (EFI_ERROR (Status)) { + return EFI_DEVICE_ERROR; + } + } + + return Status; +} + +/** + Hash sequence complete and extend to PCR. + + @param HashHandle Hash handle. + @param PcrIndex PCR to be extended. + @param DataToHash Data to be hashed. + @param DataToHashLen Data size. + @param DigestList Digest list. + + @retval EFI_SUCCESS Hash sequence complete and DigestList is returned. + +**/ +EFI_STATUS +EFIAPI +HashCompleteAndExtend ( + IN HASH_HANDLE HashHandle, + IN TPMI_DH_PCR PcrIndex, + IN VOID *DataToHash, + IN UINTN DataToHashLen, + OUT TPML_DIGEST_VALUES *DigestList + ) +{ + EFI_STATUS Status; + UINT32 Idx; + UINT32 DigestIdx; + UINT32 HashMask; + UINT8 *Buffer; + UINT64 HashLen; + TPM2B_MAX_BUFFER HashBuffer; + TPM_ALG_ID AlgoId; + TPM2B_DIGEST Result; + + if (mHashLibDisabled) { + return EFI_UNSUPPORTED; + } + + Status = ValidateHashHandle (HashHandle); + if (EFI_ERROR (Status)) { + return Status; + } + + ZeroMem (DigestList, sizeof (*DigestList)); + DigestList->count = HASH_COUNT; + DigestIdx = 0; + + for (Idx = 0; Idx < ARRAY_SIZE (mTpm2HashMask); Idx++) { + HashMask = 1 << Idx; + + if ((HashHandle & HashMask) == 0x00) { + continue; + } + + Buffer = (UINT8 *)(UINTN)DataToHash; + for (HashLen = DataToHashLen; HashLen > sizeof (HashBuffer.buffer); HashLen -= sizeof (HashBuffer.buffer)) { + HashBuffer.size = sizeof (HashBuffer.buffer); + CopyMem (HashBuffer.buffer, Buffer, sizeof (HashBuffer.buffer)); + Buffer += sizeof (HashBuffer.buffer); + + Status = Tpm2SequenceUpdate (mTpm2HashMask[Idx].SequenceHandle, &HashBuffer); + if (EFI_ERROR (Status)) { + return EFI_DEVICE_ERROR; + } + } + + // Last one + HashBuffer.size = (UINT16)HashLen; + CopyMem (HashBuffer.buffer, Buffer, (UINTN)HashLen); + + Status = Tpm2SequenceComplete ( + mTpm2HashMask[Idx].SequenceHandle, + &HashBuffer, + &Result + ); + if (EFI_ERROR (Status)) { + return EFI_DEVICE_ERROR; + } + + AlgoId = Tpm2GetAlgoFromHashMask (HashMask); + ASSERT (AlgoId != TPM_ALG_ERROR); + + // Copy the result of hash. + CopyMem (&DigestList->digests[DigestIdx].digest, Result.buffer, Result.size); + DigestList->digests[DigestIdx].hashAlg = AlgoId; + DigestIdx++; + } + + DigestList->count = DigestIdx; + + Status = Tpm2PcrExtend ( + PcrIndex, + DigestList + ); + if (EFI_ERROR (Status)) { + return EFI_DEVICE_ERROR; + } + + ClearSequenceHandles (); + + return EFI_SUCCESS; +} + +/** + Hash data and extend to PCR. + + @param PcrIndex PCR to be extended. + @param DataToHash Data to be hashed. + @param DataToHashLen Data size. + @param DigestList Digest list. + + @retval EFI_SUCCESS Hash data and DigestList is returned. + +**/ +EFI_STATUS +EFIAPI +HashAndExtend ( + IN TPMI_DH_PCR PcrIndex, + IN VOID *DataToHash, + IN UINTN DataToHashLen, + OUT TPML_DIGEST_VALUES *DigestList + ) +{ + EFI_STATUS Status; + UINT8 *Buffer; + UINT64 HashLen; + TPMI_DH_OBJECT SequenceHandle; + TPM2B_MAX_BUFFER HashBuffer; + TPM2B_DIGEST Result; + TPM_ALG_ID AlgoId; + UINT32 Idx; + UINT32 DigestIdx; + UINT32 HashMask; + + if (mHashLibDisabled) { + return EFI_UNSUPPORTED; + } + + DEBUG ((DEBUG_VERBOSE, "\n HashAndExtend Entry \n")); + + if (mSupportedHashBitmap == 0x00) { + return EFI_DEVICE_ERROR; + } + + ZeroMem (DigestList, sizeof (*DigestList)); + DigestList->count = HASH_COUNT; + DigestIdx = 0; + + for (Idx = 0; Idx < ARRAY_SIZE (mTpm2HashMask); Idx++) { + HashMask = 1 << Idx; + + if ((mSupportedHashBitmap & HashMask) == 0x00) { + continue; + } + + SequenceHandle = BAD_SEQ_HANDLE; // Know bad value + AlgoId = Tpm2GetAlgoFromHashMask (HashMask); + ASSERT (AlgoId != TPM_ALG_ERROR); + + Status = Tpm2HashSequenceStart (AlgoId, &SequenceHandle); + if (EFI_ERROR (Status)) { + return EFI_DEVICE_ERROR; + } + + DEBUG ((DEBUG_VERBOSE, "\n Tpm2HashSequenceStart Success \n")); + + Buffer = (UINT8 *)(UINTN)DataToHash; + for (HashLen = DataToHashLen; HashLen > sizeof (HashBuffer.buffer); HashLen -= sizeof (HashBuffer.buffer)) { + HashBuffer.size = sizeof (HashBuffer.buffer); + CopyMem (HashBuffer.buffer, Buffer, sizeof (HashBuffer.buffer)); + Buffer += sizeof (HashBuffer.buffer); + + Status = Tpm2SequenceUpdate (SequenceHandle, &HashBuffer); + if (EFI_ERROR (Status)) { + return EFI_DEVICE_ERROR; + } + } + + DEBUG ((DEBUG_VERBOSE, "\n Tpm2SequenceUpdate Success \n")); + + HashBuffer.size = (UINT16)HashLen; + CopyMem (HashBuffer.buffer, Buffer, (UINTN)HashLen); + + Status = Tpm2SequenceComplete ( + SequenceHandle, + &HashBuffer, + &Result + ); + if (EFI_ERROR (Status)) { + return EFI_DEVICE_ERROR; + } + + DEBUG ((DEBUG_VERBOSE, "\n Tpm2SequenceComplete Success \n")); + + CopyMem (&DigestList->digests[DigestIdx].digest, Result.buffer, Result.size); + DigestList->digests[DigestIdx].hashAlg = AlgoId; + DigestIdx++; + } + + DigestList->count = DigestIdx; + + Status = Tpm2PcrExtend ( + PcrIndex, + DigestList + ); + if (EFI_ERROR (Status)) { + return EFI_DEVICE_ERROR; + } + + DEBUG ((DEBUG_VERBOSE, "\n Tpm2PcrExtend Success \n")); + + return EFI_SUCCESS; +} + +/** + This service register Hash. + + @param HashInterface Hash interface + + @retval EFI_SUCCESS This hash interface is registered successfully. + @retval EFI_UNSUPPORTED System does not support register this interface. + @retval EFI_ALREADY_STARTED System already register this interface. + +**/ +EFI_STATUS +EFIAPI +RegisterHashInterfaceLib ( + IN HASH_INTERFACE *HashInterface + ) +{ + return EFI_UNSUPPORTED; +} + +/** + Constructor of HashLibTpm2PeilessSecLibConstructor. + +**/ +EFI_STATUS +EFIAPI +HasLibTpm2PeilessSecLibConstructor ( + VOID + ) +{ + EFI_STATUS Status; + TRANSFER_LIST_HEADER *TransferList; + VOID *EventLog; + UINTN EventLogSize; + TCG_PCR_EVENT *TcgPcrEvent; + TCG_EfiSpecIDEventStruct *TcgEfiSpecIdEventStruct; + TCG_EfiSpecIdEventAlgorithmSize *DigestSize; + UINTN Idx; + UINT32 NumberOfAlgorithms; + UINT32 TpmHashBitmap; + UINT32 PcrHashBitmap; + + mHashLibDisabled = TRUE; + + Status = GetTransferList (&TransferList); + if (EFI_ERROR (Status)) { + goto DisableHandler; + } + + if (TransferListCheckHeader (TransferList) == TRANSFER_LIST_OPS_INVALID) { + DEBUG ((DEBUG_ERROR, "Invalid Transfer list..\n")); + goto DisableHandler; + } + + Status = TransferListGetEventLog (TransferList, &EventLog, &EventLogSize, NULL); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: No data for Tpm event log...\n", __func__)); + goto DisableHandler; + } + + TcgPcrEvent = (TCG_PCR_EVENT *)EventLog; + TcgEfiSpecIdEventStruct = (TCG_EfiSpecIDEventStruct *) + (EventLog + OFFSET_OF (TCG_PCR_EVENT, Event)); + + CopyMem (&NumberOfAlgorithms, TcgEfiSpecIdEventStruct + 1, sizeof (NumberOfAlgorithms)); + DigestSize = (TCG_EfiSpecIdEventAlgorithmSize *)((UINT8 *)TcgEfiSpecIdEventStruct + sizeof (*TcgEfiSpecIdEventStruct) + sizeof (NumberOfAlgorithms)); + + for (Idx = 0; Idx < NumberOfAlgorithms; Idx++) { + mSupportedHashBitmap |= Tpm2GetHashMaskFromAlgo (DigestSize[Idx].algorithmId); + } + + Status = Tpm2RequestUseTpm (); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: TPM2 not detected!\n", __func__)); + BuildGuidHob (&gTpmErrorHobGuid, 0); + goto DisableHandler; + } + + Status = Tpm2GetCapabilitySupportedAndActivePcrs (&TpmHashBitmap, &PcrHashBitmap); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to get Tpm capability... Status: %r\n", __func__, Status)); + goto DisableHandler; + } + + mSupportedHashBitmap &= PcrHashBitmap; + if (mSupportedHashBitmap == 0x00) { + DEBUG ((DEBUG_ERROR, "%a: No supported Hash algorithm with event log Spec...!\n", __func__)); + BuildGuidHob (&gTpmErrorHobGuid, 0); + goto DisableHandler; + } + + mHashLibDisabled = FALSE; + +DisableHandler: + return EFI_SUCCESS; +} diff --git a/SecurityPkg/Library/HashLibTpm2/HashLibTpm2PeilessSecLib.inf b/SecurityPkg/Library/HashLibTpm2/HashLibTpm2PeilessSecLib.inf new file mode 100644 index 000000000000..398db536dd31 --- /dev/null +++ b/SecurityPkg/Library/HashLibTpm2/HashLibTpm2PeilessSecLib.inf @@ -0,0 +1,47 @@ +## @file +# SEC library for measurement in PeilessSec. +# +# Copyright (c) 2025, Arm Limited. All rights reserved.
    +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = HashLib + FILE_GUID = 50f7ecfc-4dca-11f0-aa44-075999529161 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = HashLib|SEC + CONSTRUCTOR = HasLibTpm2PeilessSecLibConstructor + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = AARCH64 +# + +[Sources] + HashLibTpm2PeilessSecLib.c + +[Packages] + ArmPkg/ArmPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + SecurityPkg/SecurityPkg.dec + +[LibraryClasses] + ArmLib + ArmFfaLib + BaseLib + BaseMemoryLib + DebugLib + HobLib + PrePiLib + Tpm2DeviceLib + Tpm2CommandLib + +[Guids] + gTpmErrorHobGuid diff --git a/SecurityPkg/SecurityPkg.ci.yaml b/SecurityPkg/SecurityPkg.ci.yaml index a0fa965381c5..79ae94c0c658 100644 --- a/SecurityPkg/SecurityPkg.ci.yaml +++ b/SecurityPkg/SecurityPkg.ci.yaml @@ -46,6 +46,8 @@ }, "DependencyCheck": { "AcceptableDependencies": [ + "ArmPkg/ArmPkg.dec", + "EmbeddedPkg/EmbeddedPkg.dec", "MdePkg/MdePkg.dec", "MdeModulePkg/MdeModulePkg.dec", "UefiCpuPkg/UefiCpuPkg.dec", diff --git a/SecurityPkg/SecurityPkg.dsc b/SecurityPkg/SecurityPkg.dsc index 5639cb067c86..cf020820e2e6 100644 --- a/SecurityPkg/SecurityPkg.dsc +++ b/SecurityPkg/SecurityPkg.dsc @@ -429,6 +429,7 @@ SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceLibFfa.inf SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceSecLibFfa.inf SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InstanceLibFfa.inf + SecurityPkg/Library/HashLibTpm2/HashLibTpm2PeilessSecLib.inf [BuildOptions] MSFT:*_*_IA32_DLINK_FLAGS = /ALIGN:256 From 9bca0ee3b25acc42c9d420494aca9dbabc0edec3 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Mon, 15 Sep 2025 14:50:12 +0100 Subject: [PATCH 0597/1172] SecurityPkg/Library: introduce PeilessSecMeasureLib PeilessSecMeasureLib is library to support measurement and extend PCR in PeilessSec where no PEI phase exist. Signed-off-by: Yeoreum Yun --- .../Include/Library/PeilessSecMeasureLib.h | 26 ++ .../PeilessSecMeasureLib.c | 344 ++++++++++++++++++ .../PeilessSecMeasureLib.inf | 47 +++ .../PeilessSecMeasureNullLib.c | 30 ++ .../PeilessSecMeasureNullLib.inf | 37 ++ SecurityPkg/SecurityPkg.dec | 4 + SecurityPkg/SecurityPkg.dsc | 2 + 7 files changed, 490 insertions(+) create mode 100644 SecurityPkg/Include/Library/PeilessSecMeasureLib.h create mode 100644 SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureLib.c create mode 100644 SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureLib.inf create mode 100644 SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureNullLib.c create mode 100644 SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureNullLib.inf diff --git a/SecurityPkg/Include/Library/PeilessSecMeasureLib.h b/SecurityPkg/Include/Library/PeilessSecMeasureLib.h new file mode 100644 index 000000000000..28a97340f92d --- /dev/null +++ b/SecurityPkg/Include/Library/PeilessSecMeasureLib.h @@ -0,0 +1,26 @@ +/** @file + + Copyright (c) 2025, ARM Limited. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef PEILESS_SEC_MEASURE_LIB_H_ +#define PEILESS_SEC_MEASURE_LIB_H_ + +/** + Measurement for PeilessSec. + + @retval EFI_SUCCESS Operation completed successfully. + @retval EFI_INVALID_PARAMETER Invalid firmware volume information. + @retval EFI_OUT_OF_RESOURCES No enough memory to log the new event. + @retval EFI_DEVICE_ERROR The command was unsuccessful. + +**/ +EFI_STATUS +MeasurePeilessSec ( + VOID + ); + +#endif /* PEILESS_SEC_MEASURE_LIB_H_ */ diff --git a/SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureLib.c b/SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureLib.c new file mode 100644 index 000000000000..5e53d0f743c0 --- /dev/null +++ b/SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureLib.c @@ -0,0 +1,344 @@ +/** @file + + Copyright (c) 2025, Arm Limited. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +/* + * Firmware volume description format which is the same to Tcg2Pei. + */ +#define FV_HANDOFF_TABLE_DESC "Fv(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)" + +#pragma pack (1) + +/* + * TCG PC Client Platform Firmware Profile Specification: + * 10.2.5 UEFI_PLATFORM_FIRMWARE_BLOB2. + */ +typedef struct { + UINT8 BlobDescriptionSize; + UINT8 BlobDescription[sizeof (FV_HANDOFF_TABLE_DESC)]; + EFI_PHYSICAL_ADDRESS BlobBase; + UINT64 BlobLength; +} FV_HANDOFF_TABLE_POINTERS2; + +#pragma pack () + +/** + Add a new entry to the Event Log. + + @param[in] DigestList A list of digest. + @param[in,out] NewEventHdr Pointer to a TCG_PCR_EVENT_HDR data structure. + @param[in] NewEventData Pointer to the new event data. + + @retval EFI_SUCCESS The new event log entry was added. + @retval EFI_OUT_OF_RESOURCES No enough memory to log the new event. +**/ +STATIC +EFI_STATUS +EFIAPI +LogHashEvent ( + IN TPML_DIGEST_VALUES *DigestList, + IN OUT TCG_PCR_EVENT_HDR *NewEventHdr, + IN UINT8 *NewEventData + ) +{ + VOID *HobData; + TCG_PCR_EVENT2 *TcgPcrEvent2; + UINT8 *DigestBuffer; + + // + // Use GetDigestListSize (DigestList) in the GUID HOB DataLength calculation + // to reserve enough buffer to hold TPML_DIGEST_VALUES compact binary. + // + HobData = BuildGuidHob ( + &gTcgEvent2EntryHobGuid, + sizeof (TcgPcrEvent2->PCRIndex) + sizeof (TcgPcrEvent2->EventType) + GetDigestListSize (DigestList) + sizeof (TcgPcrEvent2->EventSize) + NewEventHdr->EventSize + ); + if (HobData == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + TcgPcrEvent2 = HobData; + TcgPcrEvent2->PCRIndex = NewEventHdr->PCRIndex; + TcgPcrEvent2->EventType = NewEventHdr->EventType; + DigestBuffer = (UINT8 *)&TcgPcrEvent2->Digest; + + /* + * TF-A support one digest hash among below hash algo list: + * - TPM_ALG_SHA256 (default) + * - TPM_ALG_SHA384 + * - TPM_ALG_SHA512 + */ + DigestBuffer = CopyDigestListToBuffer ( + DigestBuffer, + DigestList, + TPM_ALG_SHA256 | TPM_ALG_SHA384 | TPM_ALG_SHA512 + ); + CopyMem (DigestBuffer, &NewEventHdr->EventSize, sizeof (TcgPcrEvent2->EventSize)); + DigestBuffer = DigestBuffer + sizeof (TcgPcrEvent2->EventSize); + CopyMem (DigestBuffer, NewEventData, NewEventHdr->EventSize); + + return EFI_SUCCESS; +} + +/** + Do a hash operation on a data buffer, extend a specific TPM PCR with the hash result, + and build a GUIDed HOB recording the event which will be passed to the DXE phase and + added into the Event Log. + + @param[in] HashData If BIT0 of Flags is 0, it is physical address of the + start of the data buffer to be hashed, extended, and logged. + If BIT0 of Flags is 1, it is physical address of the + start of the pre-hash data buffer to be extended, and logged. + The pre-hash data format is TPML_DIGEST_VALUES. + @param[in] HashDataLen The length, in bytes, of the buffer referenced by HashData. + @param[in] NewEventHdr Pointer to a TCG_PCR_EVENT_HDR data structure. + @param[in] NewEventData Pointer to the new event data. + + @retval EFI_SUCCESS Operation completed successfully. + @retval EFI_OUT_OF_RESOURCES No enough memory to log the new event. + @retval EFI_DEVICE_ERROR The command was unsuccessful. + @retval EFI_UNSUPPORTED TPM device is disabled. + +**/ +STATIC +EFI_STATUS +EFIAPI +HashLogExtendEvent ( + IN UINT8 *HashData, + IN UINTN HashDataLen, + IN TCG_PCR_EVENT_HDR *NewEventHdr, + IN UINT8 *NewEventData + ) +{ + EFI_STATUS Status; + TPML_DIGEST_VALUES DigestList; + + if (GetFirstGuidHob (&gTpmErrorHobGuid) != NULL) { + return EFI_UNSUPPORTED; + } + + Status = HashAndExtend ( + NewEventHdr->PCRIndex, + HashData, + HashDataLen, + &DigestList + ); + if (!EFI_ERROR (Status)) { + Status = LogHashEvent (&DigestList, NewEventHdr, NewEventData); + } else { + DEBUG ((DEBUG_ERROR, "%a: %r. Disable TPM.\n", __func__, Status)); + BuildGuidHob (&gTpmErrorHobGuid, 0); + } + + return Status; +} + +/** + Measure FV image. + Add it into the measured FV list after the FV is measured successfully. + + @param[in] FvBase Base address of FV image. + @param[in] FvLength Length of FV image. + + @retval EFI_SUCCESS Fv image is measured successfully + or it has been already measured. + @retval EFI_OUT_OF_RESOURCES No enough memory to log the new event. + @retval EFI_DEVICE_ERROR The command was unsuccessful. + +**/ +STATIC +EFI_STATUS +EFIAPI +MeasureFvImage ( + IN EFI_PHYSICAL_ADDRESS FvBase, + IN UINT64 FvLength + ) +{ + EFI_STATUS Status; + EFI_FIRMWARE_VOLUME_HEADER *FvHeader; + EFI_FIRMWARE_VOLUME_EXT_HEADER *FvExtHeader; + TCG_PCR_EVENT_HDR TcgEventHdr; + EFI_PLATFORM_FIRMWARE_BLOB FvBlob; + FV_HANDOFF_TABLE_POINTERS2 FvBlob2; + VOID *EventData; + VOID *FvName; + + FvName = NULL; + + if ((FvBase >= MAX_ADDRESS) || + (FvLength >= MAX_ADDRESS - FvBase) || + (FvLength < sizeof (EFI_FIRMWARE_VOLUME_HEADER))) + { + return EFI_INVALID_PARAMETER; + } + + FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)FvBase; + if (FvHeader->ExtHeaderOffset >= sizeof (EFI_FIRMWARE_VOLUME_HEADER)) { + if (FvHeader->ExtHeaderOffset + sizeof (EFI_FIRMWARE_VOLUME_EXT_HEADER) > FvLength) { + return EFI_INVALID_PARAMETER; + } + + FvExtHeader = (EFI_FIRMWARE_VOLUME_EXT_HEADER *)(UINTN)(FvBase + FvHeader->ExtHeaderOffset); + FvName = &FvExtHeader->FvName; + } + + // + // Init the log event for FV measurement + // + if (PcdGet32 (PcdTcgPfpMeasurementRevision) >= TCG_EfiSpecIDEventStruct_SPEC_ERRATA_TPM2_REV_105) { + FvBlob2.BlobDescriptionSize = sizeof (FvBlob2.BlobDescription); + CopyMem (FvBlob2.BlobDescription, FV_HANDOFF_TABLE_DESC, sizeof (FvBlob2.BlobDescription)); + if (FvName != NULL) { + AsciiSPrint ((CHAR8 *)FvBlob2.BlobDescription, sizeof (FvBlob2.BlobDescription), "Fv(%g)", FvName); + } + + FvBlob2.BlobBase = FvBase; + FvBlob2.BlobLength = FvLength; + TcgEventHdr.PCRIndex = 0; + TcgEventHdr.EventType = EV_EFI_PLATFORM_FIRMWARE_BLOB2; + TcgEventHdr.EventSize = sizeof (FvBlob2); + EventData = &FvBlob2; + } else { + FvBlob.BlobBase = FvBase; + FvBlob.BlobLength = FvLength; + TcgEventHdr.PCRIndex = 0; + TcgEventHdr.EventType = EV_EFI_PLATFORM_FIRMWARE_BLOB; + TcgEventHdr.EventSize = sizeof (FvBlob); + EventData = &FvBlob; + } + + Status = HashLogExtendEvent ( + (UINT8 *)(UINTN)FvBase, + (UINTN)FvLength, + &TcgEventHdr, + EventData + ); + if (EFI_ERROR (Status)) { + if (Status != EFI_UNSUPPORTED) { + DEBUG ((DEBUG_ERROR, "%a: The FV which failed to be measured starts at: 0x%lx, Status: %r\n", __func__, FvBase, Status)); + } else { + Status = EFI_SUCCESS; + } + } + + return Status; +} + +/** + Measure CRTM version. + + @retval EFI_SUCCESS Operation completed successfully. + @retval EFI_OUT_OF_RESOURCES No enough memory to log the new event. + @retval EFI_DEVICE_ERROR The command was unsuccessful. + +**/ +STATIC +EFI_STATUS +EFIAPI +MeasureCRTMVersion ( + VOID + ) +{ + TCG_PCR_EVENT_HDR TcgEventHdr; + EFI_STATUS Status; + + // + // Use FirmwareVersion string to represent CRTM version. + // OEMs should get real CRTM version string and measure it. + // + TcgEventHdr.PCRIndex = 0; + TcgEventHdr.EventType = EV_S_CRTM_VERSION; + TcgEventHdr.EventSize = (UINT32)StrSize ((CHAR16 *)PcdGetPtr (PcdFirmwareVersionString)); + + Status = HashLogExtendEvent ( + (UINT8 *)PcdGetPtr (PcdFirmwareVersionString), + TcgEventHdr.EventSize, + &TcgEventHdr, + (UINT8 *)PcdGetPtr (PcdFirmwareVersionString) + ); + if (Status == EFI_UNSUPPORTED) { + Status = EFI_SUCCESS; + } + + return Status; +} + +/** + Measure main Firmware Volume. + + @retval EFI_SUCCESS Operation completed successfully. + @retval EFI_INVALID_PARAMETER Invalid firmware volume information. + @retval EFI_OUT_OF_RESOURCES No enough memory to log the new event. + @retval EFI_DEVICE_ERROR The command was unsuccessful. + +**/ +STATIC +EFI_STATUS +MeasureMainFv ( + VOID + ) +{ + EFI_PEI_HOB_POINTERS FvHob; + + /* + * First firmware volume should be "main firmware volume". + */ + FvHob.Raw = GetNextHob (EFI_HOB_TYPE_FV, GetHobList ()); + ASSERT (FvHob.FirmwareVolume != NULL); + + return MeasureFvImage ( + FvHob.FirmwareVolume->BaseAddress, + FvHob.FirmwareVolume->Length + ); +} + +/** + Measurement for PeilessSec. + + @retval EFI_SUCCESS Operation completed successfully. + @retval EFI_INVALID_PARAMETER Invalid firmware volume information. + @retval EFI_OUT_OF_RESOURCES No enough memory to log the new event. + @retval EFI_DEVICE_ERROR The command was unsuccessful. + +**/ +EFI_STATUS +MeasurePeilessSec ( + VOID + ) +{ + EFI_STATUS Status; + + Status = MeasureCRTMVersion (); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = MeasureMainFv (); + if (EFI_ERROR (Status)) { + return Status; + } + + return EFI_SUCCESS; +} diff --git a/SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureLib.inf b/SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureLib.inf new file mode 100644 index 000000000000..ffab3150426f --- /dev/null +++ b/SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureLib.inf @@ -0,0 +1,47 @@ +## @file +# SEC library for measurement in PeilessSec. +# +# Copyright (c) 2025, Arm Limited. All rights reserved.
    +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = PeilessSecMeasureLib + FILE_GUID = 10d55fd8-405f-11f0-b3c3-77bd14582a7a + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = PeilessSecMeasureLib|SEC + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = AARCH64 +# + +[Sources] + PeilessSecMeasureLib.c + +[Packages] + ArmPkg/ArmPkg.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + SecurityPkg/SecurityPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + HobLib + HashLib + PrePiLib + Tpm2CommandLib + +[Guids] + gTcgEvent2EntryHobGuid + +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString + gEfiMdeModulePkgTokenSpaceGuid.PcdTcgPfpMeasurementRevision diff --git a/SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureNullLib.c b/SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureNullLib.c new file mode 100644 index 000000000000..9d2345f7101e --- /dev/null +++ b/SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureNullLib.c @@ -0,0 +1,30 @@ +/** @file + + Copyright (c) 2025, Arm Limited. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include + +/** + Measurement for PeilessSec. + + @retval EFI_SUCCESS Operation completed successfully. + @retval EFI_INVALID_PARAMETER Invalid firmware volume information. + @retval EFI_OUT_OF_RESOURCES No enough memory to log the new event. + @retval EFI_DEVICE_ERROR The command was unsuccessful. + +**/ +EFI_STATUS +MeasurePeilessSec ( + VOID + ) +{ + /* + * Nothing to measure. + */ + return EFI_SUCCESS; +} diff --git a/SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureNullLib.inf b/SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureNullLib.inf new file mode 100644 index 000000000000..0b41642a2969 --- /dev/null +++ b/SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureNullLib.inf @@ -0,0 +1,37 @@ +## @file +# SEC library for measurement in PeilessSec. +# +# Copyright (c) 2025, Arm Limited. All rights reserved.
    +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = PeilessSecMeasureNullLib + FILE_GUID = 0f0f90f8-4062-11f0-9da8-f3bb80081317 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = PeilessSecMeasureLib|SEC + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = AARCH64 +# + +[Sources] + PeilessSecMeasureNullLib.c + +[Packages] + ArmPkg/ArmPkg.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + HobLib + diff --git a/SecurityPkg/SecurityPkg.dec b/SecurityPkg/SecurityPkg.dec index 696a94b871b5..98da4addfae6 100644 --- a/SecurityPkg/SecurityPkg.dec +++ b/SecurityPkg/SecurityPkg.dec @@ -103,6 +103,10 @@ ## SpdmSecurityLib|Include/Library/SpdmSecurityLib.h + ## @libraryclass Provides measurement interface for PeilessSec. + # + PeilessSecMeasureLib|Include/Library/PeilessSecMeasureLib.h + [Guids] ## Security package token space guid. # Include/Guid/SecurityPkgTokenSpace.h diff --git a/SecurityPkg/SecurityPkg.dsc b/SecurityPkg/SecurityPkg.dsc index cf020820e2e6..854f2f2ccd48 100644 --- a/SecurityPkg/SecurityPkg.dsc +++ b/SecurityPkg/SecurityPkg.dsc @@ -430,6 +430,8 @@ SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceSecLibFfa.inf SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InstanceLibFfa.inf SecurityPkg/Library/HashLibTpm2/HashLibTpm2PeilessSecLib.inf + SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureNullLib.inf + SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureLib.inf [BuildOptions] MSFT:*_*_IA32_DLINK_FLAGS = /ALIGN:256 From 289b23ec12e2909df9660c8e14cf7e62e955554e Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Thu, 5 Jun 2025 11:26:07 +0100 Subject: [PATCH 0598/1172] ArmPlatformPkg/PeilessSec: apply PeilessSecMeasureLib in PeilessSec To add event logs like Tcg2Pei, apply PeilessSecMeasureLib in PeilessSec. Signed-off-by: Yeoreum Yun --- ArmPlatformPkg/ArmPlatformPkg.ci.yaml | 1 + ArmPlatformPkg/ArmPlatformPkg.dsc | 7 +++++++ ArmPlatformPkg/PeilessSec/PeilessSec.c | 3 +++ ArmPlatformPkg/PeilessSec/PeilessSec.h | 1 + ArmPlatformPkg/PeilessSec/PeilessSec.inf | 2 ++ 5 files changed, 14 insertions(+) diff --git a/ArmPlatformPkg/ArmPlatformPkg.ci.yaml b/ArmPlatformPkg/ArmPlatformPkg.ci.yaml index e161d2c0fe44..f2f9e6b8224b 100644 --- a/ArmPlatformPkg/ArmPlatformPkg.ci.yaml +++ b/ArmPlatformPkg/ArmPlatformPkg.ci.yaml @@ -50,6 +50,7 @@ "EmbeddedPkg/EmbeddedPkg.dec", "MdeModulePkg/MdeModulePkg.dec", "MdePkg/MdePkg.dec", + "SecurityPkg/SecurityPkg.dec", "UefiCpuPkg/UefiCpuPkg.dec" ], # For host based unit tests diff --git a/ArmPlatformPkg/ArmPlatformPkg.dsc b/ArmPlatformPkg/ArmPlatformPkg.dsc index 9576a424ea9e..d792487c192b 100644 --- a/ArmPlatformPkg/ArmPlatformPkg.dsc +++ b/ArmPlatformPkg/ArmPlatformPkg.dsc @@ -39,6 +39,8 @@ ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf ArmPlatformLib|ArmPlatformPkg/Library/ArmPlatformLibNull/ArmPlatformLibNull.inf ArmMmuLib|UefiCpuPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf + ArmSmcLib|MdePkg/Library/ArmSmcLib/ArmSmcLib.inf + ArmSvcLib|MdePkg/Library/ArmSvcLib/ArmSvcLib.inf BaseLib|MdePkg/Library/BaseLib/BaseLib.inf BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf CacheMaintenanceLib|ArmPkg/Library/ArmCacheMaintenanceLib/ArmCacheMaintenanceLib.inf @@ -80,10 +82,15 @@ PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf [LibraryClasses.common.SEC] + ArmFfaLib|MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.inf ExtractGuidedSectionLib|EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.inf HobLib|EmbeddedPkg/Library/PrePiHobLib/PrePiHobLib.inf MemoryAllocationLib|EmbeddedPkg/Library/PrePiMemoryAllocationLib/PrePiMemoryAllocationLib.inf PrePiHobListPointerLib|ArmPlatformPkg/Library/PrePiHobListPointerLib/PrePiHobListPointerLib.inf + Tpm2CommandLib|SecurityPkg/Library/Tpm2CommandLib/Tpm2CommandLib.inf + Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceSecLibFfa.inf + HashLib|SecurityPkg/Library/HashLibTpm2/HashLibTpm2PeilessSecLib.inf + PeilessSecMeasureLib|SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureLib.inf [LibraryClasses.AARCH64.MM_STANDALONE] HobLib|StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.inf diff --git a/ArmPlatformPkg/PeilessSec/PeilessSec.c b/ArmPlatformPkg/PeilessSec/PeilessSec.c index b9b7196a51a1..267c34397af7 100644 --- a/ArmPlatformPkg/PeilessSec/PeilessSec.c +++ b/ArmPlatformPkg/PeilessSec/PeilessSec.c @@ -180,6 +180,9 @@ SecMain ( Status = DecompressFirstFv (); ASSERT_EFI_ERROR (Status); + Status = MeasurePeilessSec (); + ASSERT_EFI_ERROR (Status); + // Load the DXE Core and transfer control to it Status = LoadDxeCoreFromFv (NULL, 0); ASSERT_EFI_ERROR (Status); diff --git a/ArmPlatformPkg/PeilessSec/PeilessSec.h b/ArmPlatformPkg/PeilessSec/PeilessSec.h index 73b6b25b5a56..abe885e689e3 100644 --- a/ArmPlatformPkg/PeilessSec/PeilessSec.h +++ b/ArmPlatformPkg/PeilessSec/PeilessSec.h @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include diff --git a/ArmPlatformPkg/PeilessSec/PeilessSec.inf b/ArmPlatformPkg/PeilessSec/PeilessSec.inf index f5e0726adbf5..a70afcf91dbf 100644 --- a/ArmPlatformPkg/PeilessSec/PeilessSec.inf +++ b/ArmPlatformPkg/PeilessSec/PeilessSec.inf @@ -30,6 +30,7 @@ EmbeddedPkg/EmbeddedPkg.dec MdeModulePkg/MdeModulePkg.dec MdePkg/MdePkg.dec + SecurityPkg/SecurityPkg.dec [LibraryClasses] ArmLib @@ -40,6 +41,7 @@ DebugLib HobLib MemoryInitPeiLib + PeilessSecMeasureLib PerformanceLib PlatformPeiLib PrePiHobListPointerLib From a51255072e725a517af51b498d51709a49bdf136 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 30 Sep 2025 10:09:45 +0200 Subject: [PATCH 0599/1172] OvmfPkg/EmuVariableFvbRuntimeDxe: initialize emu variable fvb from rom In case the OVMF image has a valid variable store use that as template when initializing the emulated variable fvb instead of initializing an empty variable store. Signed-off-by: Gerd Hoffmann --- OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c | 12 ++++++++++-- OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c b/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c index cc476c7df210..1e4ea0d556ea 100644 --- a/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c +++ b/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c @@ -719,6 +719,7 @@ FvbInitialize ( EFI_HANDLE Handle; EFI_PHYSICAL_ADDRESS Address; RETURN_STATUS PcdStatus; + VOID *Template; DEBUG ((DEBUG_INFO, "EMU Variable FVB Started\n")); @@ -780,8 +781,15 @@ FvbInitialize ( // Initialize the main FV header and variable store header // if (Initialize) { - SetMem (Ptr, EMU_FVB_SIZE, ERASED_UINT8); - InitializeFvAndVariableStoreHeaders (Ptr); + Template = (VOID *)(UINTN)PcdGet32 (PcdOvmfFlashNvStorageVariableBase); + Status = ValidateFvHeader (Template); + if (!EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "EMU Variable FVB: Initialized FV from ROM template.\n")); + CopyMem (Ptr, Template, EMU_FVB_SIZE); + } else { + SetMem (Ptr, EMU_FVB_SIZE, ERASED_UINT8); + InitializeFvAndVariableStoreHeaders (Ptr); + } } PcdStatus = PcdSet64S (PcdFlashNvStorageVariableBase64, (UINTN)Ptr); diff --git a/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf b/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf index 0811545cf7b3..396e6028b405 100644 --- a/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf +++ b/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf @@ -56,6 +56,7 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageVariableBase [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64 From ace36ed376144db2f3d63c849ca88843668ea1b0 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 17 Sep 2025 12:45:57 +0200 Subject: [PATCH 0600/1172] ShellPkg/Dmem: Extract a DisplaySystemTable() function In an effort to simplify the code in the ShellPkg, extract a DisplaySystemTable(). This also lowers the indentation level. No functional change is introduced. Signed-off-by: Pierre Gondois --- .../Library/UefiShellDebug1CommandsLib/Dmem.c | 348 ++++++++++-------- 1 file changed, 185 insertions(+), 163 deletions(-) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c index 37bccea704a1..7246c84a77db 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c @@ -345,6 +345,190 @@ DisplayConformanceProfiles ( return (ShellStatus); } +/** + Display the System Tables. + + @param[in] Package List of input parameters. + @param[in] Address The address of the System Table. +**/ +STATIC +SHELL_STATUS +DisplaySystemTable ( + IN LIST_ENTRY *Package, + IN VOID *Address + ) +{ + UINT64 AcpiTableAddress; + UINT64 Acpi20TableAddress; + UINT64 SalTableAddress; + UINT64 SmbiosTableAddress; + UINT64 MpsTableAddress; + UINT64 DtbTableAddress; + UINT64 MemoryAttributesTableAddress; + UINT64 RtPropertiesTableAddress; + UINT64 SystemResourceTableAddress; + UINT64 DebugImageInfoTableAddress; + UINT64 ImageExecutionTableAddress; + UINT64 JsonConfigDataTableAddress; + UINT64 JsonCapsuleDataTableAddress; + UINT64 JsonCapsuleResultTableAddress; + UINT64 MemoryRangeCapsuleAddress; + UINT64 HiiDatabaseExportBufferAddress; + UINT64 ConformanceProfileTableAddress; + UINTN TableWalker; + SHELL_STATUS ShellStatus; + + ShellStatus = SHELL_SUCCESS; + + Acpi20TableAddress = 0; + AcpiTableAddress = 0; + SalTableAddress = 0; + SmbiosTableAddress = 0; + MpsTableAddress = 0; + DtbTableAddress = 0; + MemoryAttributesTableAddress = 0; + RtPropertiesTableAddress = 0; + SystemResourceTableAddress = 0; + DebugImageInfoTableAddress = 0; + ImageExecutionTableAddress = 0; + JsonConfigDataTableAddress = 0; + JsonCapsuleDataTableAddress = 0; + JsonCapsuleResultTableAddress = 0; + MemoryRangeCapsuleAddress = 0; + HiiDatabaseExportBufferAddress = 0; + ConformanceProfileTableAddress = 0; + for (TableWalker = 0; TableWalker < gST->NumberOfTableEntries; TableWalker++) { + if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiAcpi20TableGuid)) { + Acpi20TableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; + continue; + } + + if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiAcpi10TableGuid)) { + AcpiTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; + continue; + } + + if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiSmbiosTableGuid)) { + SmbiosTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; + continue; + } + + if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiSmbios3TableGuid)) { + SmbiosTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; + continue; + } + + if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiMpsTableGuid)) { + MpsTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; + continue; + } + + if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gFdtTableGuid)) { + DtbTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; + continue; + } + + if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiMemoryAttributesTableGuid)) { + MemoryAttributesTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; + continue; + } + + if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiRtPropertiesTableGuid)) { + RtPropertiesTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; + continue; + } + + if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiSystemResourceTableGuid)) { + SystemResourceTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; + continue; + } + + if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiDebugImageInfoTableGuid)) { + DebugImageInfoTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; + continue; + } + + if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiImageSecurityDatabaseGuid)) { + ImageExecutionTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; + continue; + } + + if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiJsonConfigDataTableGuid)) { + JsonConfigDataTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; + continue; + } + + if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiJsonCapsuleDataTableGuid)) { + JsonCapsuleDataTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; + continue; + } + + if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiJsonCapsuleResultTableGuid)) { + JsonCapsuleResultTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; + continue; + } + + if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiHiiDatabaseProtocolGuid)) { + HiiDatabaseExportBufferAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; + continue; + } + + if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiConfProfilesTableGuid)) { + ConformanceProfileTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; + continue; + } + } + + ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_DMEM_SYSTEM_TABLE), + gShellDebug1HiiHandle, + (UINT64)(UINTN)Address, + gST->Hdr.HeaderSize, + gST->Hdr.Revision, + (UINT64)(UINTN)gST->ConIn, + (UINT64)(UINTN)gST->ConOut, + (UINT64)(UINTN)gST->StdErr, + (UINT64)(UINTN)gST->RuntimeServices, + (UINT64)(UINTN)gST->BootServices, + SalTableAddress, + AcpiTableAddress, + Acpi20TableAddress, + MpsTableAddress, + SmbiosTableAddress, + DtbTableAddress, + MemoryAttributesTableAddress, + RtPropertiesTableAddress, + SystemResourceTableAddress, + DebugImageInfoTableAddress, + ImageExecutionTableAddress, + JsonConfigDataTableAddress, + JsonCapsuleDataTableAddress, + JsonCapsuleResultTableAddress, + MemoryRangeCapsuleAddress, + HiiDatabaseExportBufferAddress, + ConformanceProfileTableAddress + ); + + if (ShellCommandLineGetFlag (Package, L"-verbose")) { + if (ShellStatus == SHELL_SUCCESS) { + ShellStatus = DisplayRtProperties (RtPropertiesTableAddress); + } + + if (ShellStatus == SHELL_SUCCESS) { + ShellStatus = DisplayImageExecutionEntries (ImageExecutionTableAddress); + } + + if (ShellStatus == SHELL_SUCCESS) { + ShellStatus = DisplayConformanceProfiles (ConformanceProfileTableAddress); + } + } + + return ShellStatus; +} + STATIC CONST SHELL_PARAM_ITEM ParamList[] = { { L"-mmio", TypeFlag }, { L"-verbose", TypeFlag }, @@ -371,24 +555,6 @@ ShellCommandRunDmem ( VOID *Address; UINT64 Size; CONST CHAR16 *Temp1; - UINT64 AcpiTableAddress; - UINT64 Acpi20TableAddress; - UINT64 SalTableAddress; - UINT64 SmbiosTableAddress; - UINT64 MpsTableAddress; - UINT64 DtbTableAddress; - UINT64 MemoryAttributesTableAddress; - UINT64 RtPropertiesTableAddress; - UINT64 SystemResourceTableAddress; - UINT64 DebugImageInfoTableAddress; - UINT64 ImageExecutionTableAddress; - UINT64 JsonConfigDataTableAddress; - UINT64 JsonCapsuleDataTableAddress; - UINT64 JsonCapsuleResultTableAddress; - UINT64 MemoryRangeCapsuleAddress; - UINT64 HiiDatabaseExportBufferAddress; - UINT64 ConformanceProfileTableAddress; - UINTN TableWalker; ShellStatus = SHELL_SUCCESS; Status = EFI_SUCCESS; @@ -448,151 +614,7 @@ ShellCommandRunDmem ( ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_HEADER_ROW), gShellDebug1HiiHandle, (UINT64)(UINTN)Address, Size); DumpHex (2, (UINTN)Address, (UINTN)Size, Address); if (Address == (VOID *)gST) { - Acpi20TableAddress = 0; - AcpiTableAddress = 0; - SalTableAddress = 0; - SmbiosTableAddress = 0; - MpsTableAddress = 0; - DtbTableAddress = 0; - MemoryAttributesTableAddress = 0; - RtPropertiesTableAddress = 0; - SystemResourceTableAddress = 0; - DebugImageInfoTableAddress = 0; - ImageExecutionTableAddress = 0; - JsonConfigDataTableAddress = 0; - JsonCapsuleDataTableAddress = 0; - JsonCapsuleResultTableAddress = 0; - MemoryRangeCapsuleAddress = 0; - HiiDatabaseExportBufferAddress = 0; - ConformanceProfileTableAddress = 0; - for (TableWalker = 0; TableWalker < gST->NumberOfTableEntries; TableWalker++) { - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiAcpi20TableGuid)) { - Acpi20TableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiAcpi10TableGuid)) { - AcpiTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiSmbiosTableGuid)) { - SmbiosTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiSmbios3TableGuid)) { - SmbiosTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiMpsTableGuid)) { - MpsTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gFdtTableGuid)) { - DtbTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiMemoryAttributesTableGuid)) { - MemoryAttributesTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiRtPropertiesTableGuid)) { - RtPropertiesTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiSystemResourceTableGuid)) { - SystemResourceTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiDebugImageInfoTableGuid)) { - DebugImageInfoTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiImageSecurityDatabaseGuid)) { - ImageExecutionTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiJsonConfigDataTableGuid)) { - JsonConfigDataTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiJsonCapsuleDataTableGuid)) { - JsonCapsuleDataTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiJsonCapsuleResultTableGuid)) { - JsonCapsuleResultTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiHiiDatabaseProtocolGuid)) { - HiiDatabaseExportBufferAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiConfProfilesTableGuid)) { - ConformanceProfileTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - } - - ShellPrintHiiEx ( - -1, - -1, - NULL, - STRING_TOKEN (STR_DMEM_SYSTEM_TABLE), - gShellDebug1HiiHandle, - (UINT64)(UINTN)Address, - gST->Hdr.HeaderSize, - gST->Hdr.Revision, - (UINT64)(UINTN)gST->ConIn, - (UINT64)(UINTN)gST->ConOut, - (UINT64)(UINTN)gST->StdErr, - (UINT64)(UINTN)gST->RuntimeServices, - (UINT64)(UINTN)gST->BootServices, - SalTableAddress, - AcpiTableAddress, - Acpi20TableAddress, - MpsTableAddress, - SmbiosTableAddress, - DtbTableAddress, - MemoryAttributesTableAddress, - RtPropertiesTableAddress, - SystemResourceTableAddress, - DebugImageInfoTableAddress, - ImageExecutionTableAddress, - JsonConfigDataTableAddress, - JsonCapsuleDataTableAddress, - JsonCapsuleResultTableAddress, - MemoryRangeCapsuleAddress, - HiiDatabaseExportBufferAddress, - ConformanceProfileTableAddress - ); - - if (ShellCommandLineGetFlag (Package, L"-verbose")) { - if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = DisplayRtProperties (RtPropertiesTableAddress); - } - - if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = DisplayImageExecutionEntries (ImageExecutionTableAddress); - } - - if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = DisplayConformanceProfiles (ConformanceProfileTableAddress); - } - } + ShellStatus = DisplaySystemTable (Package, Address); } } else { ShellStatus = DisplayMmioMemory (Address, (UINTN)Size); From cf67a0c78e1497ba64184af67f6760de2f1a7747 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Thu, 18 Sep 2025 09:22:12 +0200 Subject: [PATCH 0601/1172] ShellPkg/Dmem: Remove remaining of SAL System Table The SAL System Table is unsupported and its support was removed in commit: f4c874c45dbc ("ShellPkg/UefiShellDebug1CommandsLib") Remove remaining of SAL System Table handling. Signed-off-by: Pierre Gondois --- ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c | 3 --- .../UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni | 1 - 2 files changed, 4 deletions(-) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c index 7246c84a77db..03f51a420ea9 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c @@ -360,7 +360,6 @@ DisplaySystemTable ( { UINT64 AcpiTableAddress; UINT64 Acpi20TableAddress; - UINT64 SalTableAddress; UINT64 SmbiosTableAddress; UINT64 MpsTableAddress; UINT64 DtbTableAddress; @@ -382,7 +381,6 @@ DisplaySystemTable ( Acpi20TableAddress = 0; AcpiTableAddress = 0; - SalTableAddress = 0; SmbiosTableAddress = 0; MpsTableAddress = 0; DtbTableAddress = 0; @@ -493,7 +491,6 @@ DisplaySystemTable ( (UINT64)(UINTN)gST->StdErr, (UINT64)(UINTN)gST->RuntimeServices, (UINT64)(UINTN)gST->BootServices, - SalTableAddress, AcpiTableAddress, Acpi20TableAddress, MpsTableAddress, diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni index c42ef64e44e8..7dfb6db56c07 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni @@ -109,7 +109,6 @@ "ConIn (%016LX) ConOut (%016LX) StdErr (%016LX)\r\n" "Runtime Services %016LX\r\n" "Boot Services %016LX\r\n" - "SAL System Table %016LX\r\n" "ACPI Table %016LX\r\n" "ACPI 2.0 Table %016LX\r\n" "MPS Table %016LX\r\n" From 0235ac23c516fc29d5fff2e1c2f2c6fb2429c0e0 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Thu, 18 Sep 2025 10:09:15 +0200 Subject: [PATCH 0602/1172] ShellPkg/Dmem: Remove Memory Range Capsule support Memory Range Capsule is described in the UEFI spec 2.9 s8.5.3 Update Capsule with the following GUID: {0DE9F0EC-88B6-428F-977A-258F1D0E5E72} Support to print the EFI_MEMORY_RANGE_CAPSULE address in the EFI Configuration table was added in commit: 42b0443599a6 ("ShellPkg: UefiShellDebug1CommandsLib: Uefi Config Tables in Dmem.c") but EFI_MEMORY_RANGE_CAPSULE type and GUID is not present in edk2. Thus dmem always print a 0 value for this configuration table. Remove support of EFI_MEMORY_RANGE_CAPSULE in dmem. Signed-off-by: Pierre Gondois --- ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c | 3 --- .../UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni | 1 - 2 files changed, 4 deletions(-) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c index 03f51a420ea9..b23619b2b511 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c @@ -371,7 +371,6 @@ DisplaySystemTable ( UINT64 JsonConfigDataTableAddress; UINT64 JsonCapsuleDataTableAddress; UINT64 JsonCapsuleResultTableAddress; - UINT64 MemoryRangeCapsuleAddress; UINT64 HiiDatabaseExportBufferAddress; UINT64 ConformanceProfileTableAddress; UINTN TableWalker; @@ -392,7 +391,6 @@ DisplaySystemTable ( JsonConfigDataTableAddress = 0; JsonCapsuleDataTableAddress = 0; JsonCapsuleResultTableAddress = 0; - MemoryRangeCapsuleAddress = 0; HiiDatabaseExportBufferAddress = 0; ConformanceProfileTableAddress = 0; for (TableWalker = 0; TableWalker < gST->NumberOfTableEntries; TableWalker++) { @@ -504,7 +502,6 @@ DisplaySystemTable ( JsonConfigDataTableAddress, JsonCapsuleDataTableAddress, JsonCapsuleResultTableAddress, - MemoryRangeCapsuleAddress, HiiDatabaseExportBufferAddress, ConformanceProfileTableAddress ); diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni index 7dfb6db56c07..2f00cfd889ad 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni @@ -122,7 +122,6 @@ "Json Config Data Table %016LX\r\n" "Json Capsule Data Table %016LX\r\n" "Json Capsule Results Table %016LX\r\n" - "Memory Range Capsule %016LX\r\n" "Hii Database Export Buffer %016LX\r\n" "Conformance Profile Table %016LX\r\n" #string STR_DMEM_RT_PROPERTIES #language en-US "\r\nRT Properties Table\r\n" From e78453fb5485e8fda9469daa150a0c86ce924ee7 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Thu, 18 Sep 2025 10:28:19 +0200 Subject: [PATCH 0603/1172] ShellPkg/Dmem: Replace per-System Table variable by indexed arrays In an effort to simplify the code in the ShellPkg, remove the per-System Table variables by indexed arrays. The only functional change introduced is that a non-null Smbios3 System Table: - always replaces an Smbios System Table - ASSERT if (Smbios3 != 0) and (Smbios != 0) Otherwise no functional change is introduced. Signed-off-by: Pierre Gondois --- .../Library/UefiShellDebug1CommandsLib/Dmem.c | 197 +++++++----------- 1 file changed, 72 insertions(+), 125 deletions(-) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c index b23619b2b511..655612b0d799 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c @@ -345,6 +345,46 @@ DisplayConformanceProfiles ( return (ShellStatus); } +/** Enum of the System tables to print. */ +typedef enum { + EDstAcpi20Table = 0, + EDstAcpi10Table, + EDstSmbiosTable, + EDstSmbios3Table, + EDstMpsTable, + EDstFdtTable, + EDstMemoryAttributesTable, + EDstRtPropertiesTable, + EDstSystemResourceTable, + EDstDebugImageInfoTable, + EDstImageSecurityDatabase, + EDstJsonConfigDataTable, + EDstJsonCapsuleDataTable, + EDstJsonCapsuleResultTable, + EDstHiiDatabaseProtocol, + EDstConfProfilesTable, + EDstMax +} DISPLAYED_SYSTEM_TABLES; + +STATIC CONST EFI_GUID *GuidArray[] = { + [EDstAcpi20Table] = &gEfiAcpi20TableGuid, + [EDstAcpi10Table] = &gEfiAcpi10TableGuid, + [EDstSmbiosTable] = &gEfiSmbiosTableGuid, + [EDstSmbios3Table] = &gEfiSmbios3TableGuid, + [EDstMpsTable] = &gEfiMpsTableGuid, + [EDstFdtTable] = &gFdtTableGuid, + [EDstMemoryAttributesTable] = &gEfiMemoryAttributesTableGuid, + [EDstRtPropertiesTable] = &gEfiRtPropertiesTableGuid, + [EDstSystemResourceTable] = &gEfiSystemResourceTableGuid, + [EDstDebugImageInfoTable] = &gEfiDebugImageInfoTableGuid, + [EDstImageSecurityDatabase] = &gEfiImageSecurityDatabaseGuid, + [EDstJsonConfigDataTable] = &gEfiJsonConfigDataTableGuid, + [EDstJsonCapsuleDataTable] = &gEfiJsonCapsuleDataTableGuid, + [EDstJsonCapsuleResultTable] = &gEfiJsonCapsuleResultTableGuid, + [EDstHiiDatabaseProtocol] = &gEfiHiiDatabaseProtocolGuid, + [EDstConfProfilesTable] = &gEfiConfProfilesTableGuid, +}; + /** Display the System Tables. @@ -358,121 +398,28 @@ DisplaySystemTable ( IN VOID *Address ) { - UINT64 AcpiTableAddress; - UINT64 Acpi20TableAddress; - UINT64 SmbiosTableAddress; - UINT64 MpsTableAddress; - UINT64 DtbTableAddress; - UINT64 MemoryAttributesTableAddress; - UINT64 RtPropertiesTableAddress; - UINT64 SystemResourceTableAddress; - UINT64 DebugImageInfoTableAddress; - UINT64 ImageExecutionTableAddress; - UINT64 JsonConfigDataTableAddress; - UINT64 JsonCapsuleDataTableAddress; - UINT64 JsonCapsuleResultTableAddress; - UINT64 HiiDatabaseExportBufferAddress; - UINT64 ConformanceProfileTableAddress; + UINTN Index; UINTN TableWalker; + UINTN AddressArray[EDstMax]; SHELL_STATUS ShellStatus; ShellStatus = SHELL_SUCCESS; - Acpi20TableAddress = 0; - AcpiTableAddress = 0; - SmbiosTableAddress = 0; - MpsTableAddress = 0; - DtbTableAddress = 0; - MemoryAttributesTableAddress = 0; - RtPropertiesTableAddress = 0; - SystemResourceTableAddress = 0; - DebugImageInfoTableAddress = 0; - ImageExecutionTableAddress = 0; - JsonConfigDataTableAddress = 0; - JsonCapsuleDataTableAddress = 0; - JsonCapsuleResultTableAddress = 0; - HiiDatabaseExportBufferAddress = 0; - ConformanceProfileTableAddress = 0; - for (TableWalker = 0; TableWalker < gST->NumberOfTableEntries; TableWalker++) { - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiAcpi20TableGuid)) { - Acpi20TableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiAcpi10TableGuid)) { - AcpiTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiSmbiosTableGuid)) { - SmbiosTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiSmbios3TableGuid)) { - SmbiosTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiMpsTableGuid)) { - MpsTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gFdtTableGuid)) { - DtbTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiMemoryAttributesTableGuid)) { - MemoryAttributesTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiRtPropertiesTableGuid)) { - RtPropertiesTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiSystemResourceTableGuid)) { - SystemResourceTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiDebugImageInfoTableGuid)) { - DebugImageInfoTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiImageSecurityDatabaseGuid)) { - ImageExecutionTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiJsonConfigDataTableGuid)) { - JsonConfigDataTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } + ZeroMem (AddressArray, sizeof (AddressArray)); - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiJsonCapsuleDataTableGuid)) { - JsonCapsuleDataTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiJsonCapsuleResultTableGuid)) { - JsonCapsuleResultTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } - - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiHiiDatabaseProtocolGuid)) { - HiiDatabaseExportBufferAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; + for (TableWalker = 0; TableWalker < gST->NumberOfTableEntries; TableWalker++) { + for (Index = 0; Index < EDstMax; Index++) { + if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, GuidArray[Index])) { + AddressArray[Index] = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; + continue; + } } + } - if (CompareGuid (&gST->ConfigurationTable[TableWalker].VendorGuid, &gEfiConfProfilesTableGuid)) { - ConformanceProfileTableAddress = (UINT64)(UINTN)gST->ConfigurationTable[TableWalker].VendorTable; - continue; - } + // If Smbios3 is valid, use it. + if (AddressArray[EDstSmbios3Table]) { + ASSERT (AddressArray[EDstSmbiosTable]); + AddressArray[EDstSmbiosTable] = AddressArray[EDstSmbios3Table]; } ShellPrintHiiEx ( @@ -489,34 +436,34 @@ DisplaySystemTable ( (UINT64)(UINTN)gST->StdErr, (UINT64)(UINTN)gST->RuntimeServices, (UINT64)(UINTN)gST->BootServices, - AcpiTableAddress, - Acpi20TableAddress, - MpsTableAddress, - SmbiosTableAddress, - DtbTableAddress, - MemoryAttributesTableAddress, - RtPropertiesTableAddress, - SystemResourceTableAddress, - DebugImageInfoTableAddress, - ImageExecutionTableAddress, - JsonConfigDataTableAddress, - JsonCapsuleDataTableAddress, - JsonCapsuleResultTableAddress, - HiiDatabaseExportBufferAddress, - ConformanceProfileTableAddress + AddressArray[EDstAcpi10Table], + AddressArray[EDstAcpi20Table], + AddressArray[EDstMpsTable], + AddressArray[EDstSmbiosTable], + AddressArray[EDstFdtTable], + AddressArray[EDstMemoryAttributesTable], + AddressArray[EDstRtPropertiesTable], + AddressArray[EDstSystemResourceTable], + AddressArray[EDstDebugImageInfoTable], + AddressArray[EDstImageSecurityDatabase], + AddressArray[EDstJsonConfigDataTable], + AddressArray[EDstJsonCapsuleDataTable], + AddressArray[EDstJsonCapsuleResultTable], + AddressArray[EDstHiiDatabaseProtocol], + AddressArray[EDstConfProfilesTable] ); if (ShellCommandLineGetFlag (Package, L"-verbose")) { if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = DisplayRtProperties (RtPropertiesTableAddress); + ShellStatus = DisplayRtProperties (AddressArray[EDstRtPropertiesTable]); } if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = DisplayImageExecutionEntries (ImageExecutionTableAddress); + ShellStatus = DisplayImageExecutionEntries (AddressArray[EDstImageSecurityDatabase]); } if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = DisplayConformanceProfiles (ConformanceProfileTableAddress); + ShellStatus = DisplayConformanceProfiles (AddressArray[EDstConfProfilesTable]); } } From 482781a7f95d293c48479f6d6fbb56108fe342c5 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Fri, 19 Sep 2025 15:09:35 +0200 Subject: [PATCH 0604/1172] ShellPkg/Dmem: Simplify logic by inverting Address checks In an effort to simplify the code in the ShellPkg, inverse checks against the 'Address'. This also lowers the indentation level. No functional change is introduced. Signed-off-by: Pierre Gondois --- .../Library/UefiShellDebug1CommandsLib/Dmem.c | 159 +++++++++--------- 1 file changed, 81 insertions(+), 78 deletions(-) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c index 655612b0d799..00fa60bac702 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c @@ -102,39 +102,40 @@ DisplayRtProperties ( ShellStatus = SHELL_SUCCESS; - if (Address != 0) { - EfiGetSystemConfigurationTable (&gEfiRtPropertiesTableGuid, (VOID **)&RtPropertiesTable); - - RtServices = (UINT32)RtPropertiesTable->RuntimeServicesSupported; - Status = ShellPrintHiiEx ( - -1, - -1, - NULL, - STRING_TOKEN (STR_DMEM_RT_PROPERTIES), - gShellDebug1HiiHandle, - EFI_RT_PROPERTIES_TABLE_VERSION, - (RtServices & EFI_RT_SUPPORTED_GET_TIME) ? 1 : 0, - (RtServices & EFI_RT_SUPPORTED_SET_TIME) ? 1 : 0, - (RtServices & EFI_RT_SUPPORTED_GET_WAKEUP_TIME) ? 1 : 0, - (RtServices & EFI_RT_SUPPORTED_SET_WAKEUP_TIME) ? 1 : 0, - (RtServices & EFI_RT_SUPPORTED_GET_VARIABLE) ? 1 : 0, - (RtServices & EFI_RT_SUPPORTED_GET_NEXT_VARIABLE_NAME) ? 1 : 0, - (RtServices & EFI_RT_SUPPORTED_SET_VARIABLE) ? 1 : 0, - (RtServices & EFI_RT_SUPPORTED_SET_VIRTUAL_ADDRESS_MAP) ? 1 : 0, - (RtServices & EFI_RT_SUPPORTED_CONVERT_POINTER) ? 1 : 0, - (RtServices & EFI_RT_SUPPORTED_GET_NEXT_HIGH_MONOTONIC_COUNT) ? 1 : 0, - (RtServices & EFI_RT_SUPPORTED_RESET_SYSTEM) ? 1 : 0, - (RtServices & EFI_RT_SUPPORTED_UPDATE_CAPSULE) ? 1 : 0, - (RtServices & EFI_RT_SUPPORTED_QUERY_CAPSULE_CAPABILITIES) ? 1 : 0, - (RtServices & EFI_RT_SUPPORTED_QUERY_VARIABLE_INFO) ? 1 : 0 - ); - - if (EFI_ERROR (Status)) { - ShellStatus = SHELL_ABORTED; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_GET_FAIL), gShellDebug1HiiHandle, L"RtPropertiesTable"); - } - } else { + if (Address == 0) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_NOT_FOUND), gShellDebug1HiiHandle, L"RtPropertiesTable"); + return ShellStatus; + } + + EfiGetSystemConfigurationTable (&gEfiRtPropertiesTableGuid, (VOID **)&RtPropertiesTable); + + RtServices = (UINT32)RtPropertiesTable->RuntimeServicesSupported; + Status = ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_DMEM_RT_PROPERTIES), + gShellDebug1HiiHandle, + EFI_RT_PROPERTIES_TABLE_VERSION, + (RtServices & EFI_RT_SUPPORTED_GET_TIME) ? 1 : 0, + (RtServices & EFI_RT_SUPPORTED_SET_TIME) ? 1 : 0, + (RtServices & EFI_RT_SUPPORTED_GET_WAKEUP_TIME) ? 1 : 0, + (RtServices & EFI_RT_SUPPORTED_SET_WAKEUP_TIME) ? 1 : 0, + (RtServices & EFI_RT_SUPPORTED_GET_VARIABLE) ? 1 : 0, + (RtServices & EFI_RT_SUPPORTED_GET_NEXT_VARIABLE_NAME) ? 1 : 0, + (RtServices & EFI_RT_SUPPORTED_SET_VARIABLE) ? 1 : 0, + (RtServices & EFI_RT_SUPPORTED_SET_VIRTUAL_ADDRESS_MAP) ? 1 : 0, + (RtServices & EFI_RT_SUPPORTED_CONVERT_POINTER) ? 1 : 0, + (RtServices & EFI_RT_SUPPORTED_GET_NEXT_HIGH_MONOTONIC_COUNT) ? 1 : 0, + (RtServices & EFI_RT_SUPPORTED_RESET_SYSTEM) ? 1 : 0, + (RtServices & EFI_RT_SUPPORTED_UPDATE_CAPSULE) ? 1 : 0, + (RtServices & EFI_RT_SUPPORTED_QUERY_CAPSULE_CAPABILITIES) ? 1 : 0, + (RtServices & EFI_RT_SUPPORTED_QUERY_VARIABLE_INFO) ? 1 : 0 + ); + + if (EFI_ERROR (Status)) { + ShellStatus = SHELL_ABORTED; + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_GET_FAIL), gShellDebug1HiiHandle, L"RtPropertiesTable"); } return (ShellStatus); @@ -258,15 +259,16 @@ DisplayImageExecutionEntries ( ShellStatus = SHELL_SUCCESS; - if (Address != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_IMG_EXE_TABLE), gShellDebug1HiiHandle); - Status = GetImageExecutionInfo (); - if (EFI_ERROR (Status)) { - ShellStatus = SHELL_ABORTED; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_GET_FAIL), gShellDebug1HiiHandle, L"ImageExecutionTable"); - } - } else { + if (Address == 0) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_NOT_FOUND), gShellDebug1HiiHandle, L"ImageExecutionTable"); + return ShellStatus; + } + + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_IMG_EXE_TABLE), gShellDebug1HiiHandle); + Status = GetImageExecutionInfo (); + if (EFI_ERROR (Status)) { + ShellStatus = SHELL_ABORTED; + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_GET_FAIL), gShellDebug1HiiHandle, L"ImageExecutionTable"); } return (ShellStatus); @@ -292,44 +294,7 @@ DisplayConformanceProfiles ( Status = EFI_SUCCESS; ShellStatus = SHELL_SUCCESS; - if (Address != 0) { - EfiGetSystemConfigurationTable (&gEfiConfProfilesTableGuid, (VOID **)&ConfProfTable); - - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_CONF_PRO_TABLE), gShellDebug1HiiHandle); - - EntryGuid = (EFI_GUID *)(ConfProfTable + 1); - - for (Profile = 0; Profile < ConfProfTable->NumberOfProfiles; Profile++, EntryGuid++) { - GuidName = L"Unknown_Profile"; - - if (CompareGuid (EntryGuid, &gEfiConfProfilesUefiSpecGuid)) { - GuidName = L"EFI_CONFORMANCE_PROFILE_UEFI_SPEC_GUID"; - } - - if (CompareGuid (EntryGuid, &gEfiConfProfilesEbbrSpec21Guid)) { - GuidName = L"EBBR_2.1"; - } - - if (CompareGuid (EntryGuid, &gEfiConfProfilesEbbrSpec22Guid)) { - GuidName = L"EBBR_2.2"; - } - - Status = ShellPrintHiiEx ( - -1, - -1, - NULL, - STRING_TOKEN (STR_DMEM_CONF_PRO_ROW), - gShellDebug1HiiHandle, - GuidName, - EntryGuid - ); - } - - if (EFI_ERROR (Status)) { - ShellStatus = SHELL_ABORTED; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_GET_FAIL), gShellDebug1HiiHandle, L"ComformanceProfilesTable"); - } - } else { + if (Address == 0) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_CONF_PRO_TABLE), gShellDebug1HiiHandle); ShellPrintHiiEx ( -1, @@ -340,6 +305,44 @@ DisplayConformanceProfiles ( L"EFI_CONFORMANCE_PROFILES_UEFI_SPEC_GUID", &gEfiConfProfilesUefiSpecGuid ); + return ShellStatus; + } + + EfiGetSystemConfigurationTable (&gEfiConfProfilesTableGuid, (VOID **)&ConfProfTable); + + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_CONF_PRO_TABLE), gShellDebug1HiiHandle); + + EntryGuid = (EFI_GUID *)(ConfProfTable + 1); + + for (Profile = 0; Profile < ConfProfTable->NumberOfProfiles; Profile++, EntryGuid++) { + GuidName = L"Unknown_Profile"; + + if (CompareGuid (EntryGuid, &gEfiConfProfilesUefiSpecGuid)) { + GuidName = L"EFI_CONFORMANCE_PROFILE_UEFI_SPEC_GUID"; + } + + if (CompareGuid (EntryGuid, &gEfiConfProfilesEbbrSpec21Guid)) { + GuidName = L"EBBR_2.1"; + } + + if (CompareGuid (EntryGuid, &gEfiConfProfilesEbbrSpec22Guid)) { + GuidName = L"EBBR_2.2"; + } + + Status = ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_DMEM_CONF_PRO_ROW), + gShellDebug1HiiHandle, + GuidName, + EntryGuid + ); + } + + if (EFI_ERROR (Status)) { + ShellStatus = SHELL_ABORTED; + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_GET_FAIL), gShellDebug1HiiHandle, L"ComformanceProfilesTable"); } return (ShellStatus); From 2bebeb1ad408cc30f4ce717f4ce15eb3b5754053 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Fri, 19 Sep 2025 15:17:06 +0200 Subject: [PATCH 0605/1172] ShellPkg/Dmem: Remove unnecessary EfiGetSystemConfigurationTable() calls In an effort to simplify the code in the ShellPkg, remove EfiGetSystemConfigurationTable() calls fetching Configuration Table addresses that have already been collected. No functional change is introduced. Signed-off-by: Pierre Gondois --- .../Library/UefiShellDebug1CommandsLib/Dmem.c | 70 +++++++++---------- 1 file changed, 32 insertions(+), 38 deletions(-) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c index 00fa60bac702..46e74d42bf3e 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c @@ -88,27 +88,24 @@ DisplayMmioMemory ( /** Display the RtPropertiesTable entries - @param[in] Address The pointer to the RtPropertiesTable. + @param[in] RtPropertiesTable The pointer to the RtPropertiesTable. **/ SHELL_STATUS DisplayRtProperties ( - IN UINT64 Address + IN EFI_RT_PROPERTIES_TABLE *RtPropertiesTable ) { - EFI_RT_PROPERTIES_TABLE *RtPropertiesTable; - UINT32 RtServices; - SHELL_STATUS ShellStatus; - EFI_STATUS Status; + UINT32 RtServices; + SHELL_STATUS ShellStatus; + EFI_STATUS Status; ShellStatus = SHELL_SUCCESS; - if (Address == 0) { + if (RtPropertiesTable == NULL) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_NOT_FOUND), gShellDebug1HiiHandle, L"RtPropertiesTable"); return ShellStatus; } - EfiGetSystemConfigurationTable (&gEfiRtPropertiesTableGuid, (VOID **)&RtPropertiesTable); - RtServices = (UINT32)RtPropertiesTable->RuntimeServicesSupported; Status = ShellPrintHiiEx ( -1, @@ -172,22 +169,22 @@ GetBaseName ( /** Retrieve the ImageExecutionTable entries. + + @param[in] ExecInfoTablePtr The pointer to the ImageExecutionTable. **/ EFI_STATUS GetImageExecutionInfo ( + IN EFI_IMAGE_EXECUTION_INFO_TABLE *ExecInfoTablePtr ) { - EFI_STATUS Status; - EFI_IMAGE_EXECUTION_INFO_TABLE *ExecInfoTablePtr; - EFI_IMAGE_EXECUTION_INFO *InfoPtr; - CHAR8 *ptr; - CHAR16 *ImagePath; - CHAR16 *ImageName; - UINTN Image; - UINTN *NumberOfImages; - CHAR16 *ActionType; - - EfiGetSystemConfigurationTable (&gEfiImageSecurityDatabaseGuid, (VOID **)&ExecInfoTablePtr); + EFI_STATUS Status; + EFI_IMAGE_EXECUTION_INFO *InfoPtr; + CHAR8 *ptr; + CHAR16 *ImagePath; + CHAR16 *ImageName; + UINTN Image; + UINTN *NumberOfImages; + CHAR16 *ActionType; NumberOfImages = &ExecInfoTablePtr->NumberOfImages; @@ -247,11 +244,11 @@ GetImageExecutionInfo ( /** Display the ImageExecutionTable entries - @param[in] Address The pointer to the ImageExecutionTable. + @param[in] ExecInfoTablePtr The pointer to the ImageExecutionTable. **/ SHELL_STATUS DisplayImageExecutionEntries ( - IN UINT64 Address + IN EFI_IMAGE_EXECUTION_INFO_TABLE *ExecInfoTablePtr ) { SHELL_STATUS ShellStatus; @@ -259,13 +256,13 @@ DisplayImageExecutionEntries ( ShellStatus = SHELL_SUCCESS; - if (Address == 0) { + if (ExecInfoTablePtr == NULL) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_NOT_FOUND), gShellDebug1HiiHandle, L"ImageExecutionTable"); return ShellStatus; } ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_IMG_EXE_TABLE), gShellDebug1HiiHandle); - Status = GetImageExecutionInfo (); + Status = GetImageExecutionInfo (ExecInfoTablePtr); if (EFI_ERROR (Status)) { ShellStatus = SHELL_ABORTED; ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_GET_FAIL), gShellDebug1HiiHandle, L"ImageExecutionTable"); @@ -277,24 +274,23 @@ DisplayImageExecutionEntries ( /** Display the ConformanceProfileTable entries - @param[in] Address The pointer to the ConformanceProfileTable. + @param[in] ConfProfTable The pointer to the ConformanceProfileTable. **/ SHELL_STATUS DisplayConformanceProfiles ( - IN UINT64 Address + IN EFI_CONFORMANCE_PROFILES_TABLE *ConfProfTable ) { - SHELL_STATUS ShellStatus; - EFI_STATUS Status; - EFI_GUID *EntryGuid; - CHAR16 *GuidName; - UINTN Profile; - EFI_CONFORMANCE_PROFILES_TABLE *ConfProfTable; + SHELL_STATUS ShellStatus; + EFI_STATUS Status; + EFI_GUID *EntryGuid; + CHAR16 *GuidName; + UINTN Profile; Status = EFI_SUCCESS; ShellStatus = SHELL_SUCCESS; - if (Address == 0) { + if (ConfProfTable == NULL) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_CONF_PRO_TABLE), gShellDebug1HiiHandle); ShellPrintHiiEx ( -1, @@ -308,8 +304,6 @@ DisplayConformanceProfiles ( return ShellStatus; } - EfiGetSystemConfigurationTable (&gEfiConfProfilesTableGuid, (VOID **)&ConfProfTable); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_CONF_PRO_TABLE), gShellDebug1HiiHandle); EntryGuid = (EFI_GUID *)(ConfProfTable + 1); @@ -458,15 +452,15 @@ DisplaySystemTable ( if (ShellCommandLineGetFlag (Package, L"-verbose")) { if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = DisplayRtProperties (AddressArray[EDstRtPropertiesTable]); + ShellStatus = DisplayRtProperties ((EFI_RT_PROPERTIES_TABLE *)AddressArray[EDstRtPropertiesTable]); } if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = DisplayImageExecutionEntries (AddressArray[EDstImageSecurityDatabase]); + ShellStatus = DisplayImageExecutionEntries ((EFI_IMAGE_EXECUTION_INFO_TABLE *)AddressArray[EDstImageSecurityDatabase]); } if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = DisplayConformanceProfiles (AddressArray[EDstConfProfilesTable]); + ShellStatus = DisplayConformanceProfiles ((EFI_CONFORMANCE_PROFILES_TABLE *)AddressArray[EDstConfProfilesTable]); } } From 0f57fc7cf751a960252c06c63190ac3e0ed0b90d Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Fri, 19 Sep 2025 15:22:12 +0200 Subject: [PATCH 0606/1172] ShellPkg/Dmem: Remove return parameter from DisplayXXX() functions In an effort to simplify the code in the ShellPkg, remove the SHELL_STATUS parameter returned by: - DisplayRtProperties() - DisplayImageExecutionEntries() - DisplayConformanceProfiles() These functions are independent display functions. Thus failing to display a configuration table should not prevent from displaying the remaining tables. Signed-off-by: Pierre Gondois --- .../Library/UefiShellDebug1CommandsLib/Dmem.c | 62 ++++++------------- 1 file changed, 20 insertions(+), 42 deletions(-) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c index 46e74d42bf3e..3b74bde0a929 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c @@ -90,20 +90,18 @@ DisplayMmioMemory ( @param[in] RtPropertiesTable The pointer to the RtPropertiesTable. **/ -SHELL_STATUS +STATIC +VOID DisplayRtProperties ( IN EFI_RT_PROPERTIES_TABLE *RtPropertiesTable ) { - UINT32 RtServices; - SHELL_STATUS ShellStatus; - EFI_STATUS Status; - - ShellStatus = SHELL_SUCCESS; + UINT32 RtServices; + EFI_STATUS Status; if (RtPropertiesTable == NULL) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_NOT_FOUND), gShellDebug1HiiHandle, L"RtPropertiesTable"); - return ShellStatus; + return; } RtServices = (UINT32)RtPropertiesTable->RuntimeServicesSupported; @@ -131,11 +129,8 @@ DisplayRtProperties ( ); if (EFI_ERROR (Status)) { - ShellStatus = SHELL_ABORTED; ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_GET_FAIL), gShellDebug1HiiHandle, L"RtPropertiesTable"); } - - return (ShellStatus); } /** @@ -246,29 +241,24 @@ GetImageExecutionInfo ( @param[in] ExecInfoTablePtr The pointer to the ImageExecutionTable. **/ -SHELL_STATUS +STATIC +VOID DisplayImageExecutionEntries ( IN EFI_IMAGE_EXECUTION_INFO_TABLE *ExecInfoTablePtr ) { - SHELL_STATUS ShellStatus; - EFI_STATUS Status; - - ShellStatus = SHELL_SUCCESS; + EFI_STATUS Status; if (ExecInfoTablePtr == NULL) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_NOT_FOUND), gShellDebug1HiiHandle, L"ImageExecutionTable"); - return ShellStatus; + return; } ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_IMG_EXE_TABLE), gShellDebug1HiiHandle); Status = GetImageExecutionInfo (ExecInfoTablePtr); if (EFI_ERROR (Status)) { - ShellStatus = SHELL_ABORTED; ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_GET_FAIL), gShellDebug1HiiHandle, L"ImageExecutionTable"); } - - return (ShellStatus); } /** @@ -276,19 +266,18 @@ DisplayImageExecutionEntries ( @param[in] ConfProfTable The pointer to the ConformanceProfileTable. **/ -SHELL_STATUS +STATIC +VOID DisplayConformanceProfiles ( IN EFI_CONFORMANCE_PROFILES_TABLE *ConfProfTable ) { - SHELL_STATUS ShellStatus; - EFI_STATUS Status; - EFI_GUID *EntryGuid; - CHAR16 *GuidName; - UINTN Profile; + EFI_STATUS Status; + EFI_GUID *EntryGuid; + CHAR16 *GuidName; + UINTN Profile; - Status = EFI_SUCCESS; - ShellStatus = SHELL_SUCCESS; + Status = EFI_SUCCESS; if (ConfProfTable == NULL) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_CONF_PRO_TABLE), gShellDebug1HiiHandle); @@ -301,7 +290,7 @@ DisplayConformanceProfiles ( L"EFI_CONFORMANCE_PROFILES_UEFI_SPEC_GUID", &gEfiConfProfilesUefiSpecGuid ); - return ShellStatus; + return; } ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_CONF_PRO_TABLE), gShellDebug1HiiHandle); @@ -335,11 +324,8 @@ DisplayConformanceProfiles ( } if (EFI_ERROR (Status)) { - ShellStatus = SHELL_ABORTED; ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_GET_FAIL), gShellDebug1HiiHandle, L"ComformanceProfilesTable"); } - - return (ShellStatus); } /** Enum of the System tables to print. */ @@ -451,17 +437,9 @@ DisplaySystemTable ( ); if (ShellCommandLineGetFlag (Package, L"-verbose")) { - if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = DisplayRtProperties ((EFI_RT_PROPERTIES_TABLE *)AddressArray[EDstRtPropertiesTable]); - } - - if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = DisplayImageExecutionEntries ((EFI_IMAGE_EXECUTION_INFO_TABLE *)AddressArray[EDstImageSecurityDatabase]); - } - - if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = DisplayConformanceProfiles ((EFI_CONFORMANCE_PROFILES_TABLE *)AddressArray[EDstConfProfilesTable]); - } + DisplayRtProperties ((EFI_RT_PROPERTIES_TABLE *)AddressArray[EDstRtPropertiesTable]); + DisplayImageExecutionEntries ((EFI_IMAGE_EXECUTION_INFO_TABLE *)AddressArray[EDstImageSecurityDatabase]); + DisplayConformanceProfiles ((EFI_CONFORMANCE_PROFILES_TABLE *)AddressArray[EDstConfProfilesTable]); } return ShellStatus; From 25daa0fcc9297c7ae76fe9e5fe50b9458eb61d4c Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 17 Sep 2025 14:00:10 +0200 Subject: [PATCH 0607/1172] ShellPkg/MemMap: Create array of MemoryType names In an effort to simplify the code in the ShellPkg, replace the MemoryType names that are currently stored in individual variables by an array of names, facilitating access to these names. No functional change is introduced. Signed-off-by: Pierre Gondois --- .../UefiShellDebug1CommandsLib/MemMap.c | 86 ++++++++++--------- 1 file changed, 45 insertions(+), 41 deletions(-) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c index 3f4cada2b7d6..370697539948 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c @@ -11,35 +11,39 @@ // // Need full names for Standard-Format Output // -STATIC CONST CHAR16 NameEfiReservedMemoryType[] = L"Reserved"; -STATIC CONST CHAR16 NameEfiLoaderCode[] = L"LoaderCode"; -STATIC CONST CHAR16 NameEfiLoaderData[] = L"LoaderData"; -STATIC CONST CHAR16 NameEfiBootServicesCode[] = L"BootServiceCode"; -STATIC CONST CHAR16 NameEfiBootServicesData[] = L"BootServiceData"; -STATIC CONST CHAR16 NameEfiRuntimeServicesCode[] = L"RuntimeCode"; -STATIC CONST CHAR16 NameEfiRuntimeServicesData[] = L"RuntimeData"; -STATIC CONST CHAR16 NameEfiConventionalMemory[] = L"Available"; -STATIC CONST CHAR16 NameEfiPersistentMemory[] = L"Persistent"; -STATIC CONST CHAR16 NameEfiUnusableMemory[] = L"UnusableMemory"; -STATIC CONST CHAR16 NameEfiACPIReclaimMemory[] = L"ACPIReclaimMemory"; -STATIC CONST CHAR16 NameEfiACPIMemoryNVS[] = L"ACPIMemoryNVS"; -STATIC CONST CHAR16 NameEfiMemoryMappedIO[] = L"MemoryMappedIO"; -STATIC CONST CHAR16 NameEfiMemoryMappedIOPortSpace[] = L"MemoryMappedIOPortSpace"; -STATIC CONST CHAR16 NameEfiPalCode[] = L"PalCode"; -STATIC CONST CHAR16 NameEfiUnacceptedMemoryType[] = L"Unaccepted"; +STATIC CONST CHAR16 *FullNameEfiMemory[] = { + [EfiReservedMemoryType] = L"Reserved", + [EfiLoaderCode] = L"LoaderCode", + [EfiLoaderData] = L"LoaderData", + [EfiBootServicesCode] = L"BootServiceCode", + [EfiBootServicesData] = L"BootServiceData", + [EfiRuntimeServicesCode] = L"RuntimeCode", + [EfiRuntimeServicesData] = L"RuntimeData", + [EfiConventionalMemory] = L"Available", + [EfiUnusableMemory] = L"UnusableMemory", + [EfiACPIReclaimMemory] = L"ACPIReclaimMemory", + [EfiACPIMemoryNVS] = L"ACPIMemoryNVS", + [EfiMemoryMappedIO] = L"MemoryMappedIO", + [EfiMemoryMappedIOPortSpace] = L"MemoryMappedIOPortSpace", + [EfiPalCode] = L"PalCode", + [EfiPersistentMemory] = L"Persistent", + [EfiUnacceptedMemoryType] = L"Unaccepted", +}; // // Need short names for some memory types // -STATIC CONST CHAR16 NameEfiBootServicesCodeShort[] = L"BS_Code"; -STATIC CONST CHAR16 NameEfiBootServicesDataShort[] = L"BS_Data"; -STATIC CONST CHAR16 NameEfiRuntimeServicesCodeShort[] = L"RT_Code"; -STATIC CONST CHAR16 NameEfiRuntimeServicesDataShort[] = L"RT_Data"; -STATIC CONST CHAR16 NameEfiUnusableMemoryShort[] = L"Unusable"; -STATIC CONST CHAR16 NameEfiACPIReclaimMemoryShort[] = L"ACPI_Recl"; -STATIC CONST CHAR16 NameEfiACPIMemoryNVSShort[] = L"ACPI_NVS"; -STATIC CONST CHAR16 NameEfiMemoryMappedIOShort[] = L"MMIO"; -STATIC CONST CHAR16 NameEfiMemoryMappedIOPortSpaceShort[] = L"MMIO_Port"; +STATIC CONST CHAR16 *ShortNameEfiMemory[] = { + [EfiBootServicesCode] = L"BS_Code", + [EfiBootServicesData] = L"BS_Data", + [EfiRuntimeServicesCode] = L"RT_Code", + [EfiRuntimeServicesData] = L"RT_Data", + [EfiUnusableMemory] = L"Unusable", + [EfiACPIReclaimMemory] = L"ACPI_Recl", + [EfiACPIMemoryNVS] = L"ACPI_NVS", + [EfiMemoryMappedIO] = L"MMIO", + [EfiMemoryMappedIOPortSpace] = L"MMIO_Port", +}; #include "UefiShellDebug1CommandsLib.h" @@ -243,78 +247,78 @@ ShellCommandRunMemMap ( { switch (Walker->Type) { case EfiReservedMemoryType: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiReservedMemoryType, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); + ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, FullNameEfiMemory[EfiReservedMemoryType], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); ReservedPages += Walker->NumberOfPages; break; case EfiLoaderCode: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiLoaderCode, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); + ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, FullNameEfiMemory[EfiLoaderCode], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); LoadCodePages += Walker->NumberOfPages; TotalPages += Walker->NumberOfPages; break; case EfiLoaderData: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiLoaderData, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); + ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, FullNameEfiMemory[EfiLoaderData], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); LoadDataPages += Walker->NumberOfPages; TotalPages += Walker->NumberOfPages; break; case EfiBootServicesCode: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiBootServicesCodeShort : NameEfiBootServicesCode, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); + ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? ShortNameEfiMemory[EfiBootServicesCode] : FullNameEfiMemory[EfiBootServicesCode], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); BSCodePages += Walker->NumberOfPages; TotalPages += Walker->NumberOfPages; break; case EfiBootServicesData: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiBootServicesDataShort : NameEfiBootServicesData, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); + ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? ShortNameEfiMemory[EfiBootServicesData] : FullNameEfiMemory[EfiBootServicesData], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); BSDataPages += Walker->NumberOfPages; TotalPages += Walker->NumberOfPages; break; case EfiRuntimeServicesCode: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiRuntimeServicesCodeShort : NameEfiRuntimeServicesCode, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); + ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? ShortNameEfiMemory[EfiRuntimeServicesCode] : FullNameEfiMemory[EfiRuntimeServicesCode], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); RTCodePages += Walker->NumberOfPages; TotalPages += Walker->NumberOfPages; break; case EfiRuntimeServicesData: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiRuntimeServicesDataShort : NameEfiRuntimeServicesData, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); + ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? ShortNameEfiMemory[EfiRuntimeServicesData] : FullNameEfiMemory[EfiRuntimeServicesData], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); RTDataPages += Walker->NumberOfPages; TotalPages += Walker->NumberOfPages; break; case EfiConventionalMemory: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiConventionalMemory, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); + ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, FullNameEfiMemory[EfiConventionalMemory], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); AvailPages += Walker->NumberOfPages; TotalPages += Walker->NumberOfPages; break; case EfiPersistentMemory: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiPersistentMemory, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); + ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, FullNameEfiMemory[EfiPersistentMemory], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); PersistentPages += Walker->NumberOfPages; TotalPages += Walker->NumberOfPages; break; case EfiUnusableMemory: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiUnusableMemoryShort : NameEfiUnusableMemory, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); + ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? ShortNameEfiMemory[EfiUnusableMemory] : FullNameEfiMemory[EfiUnusableMemory], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); UnusableMemoryPages += Walker->NumberOfPages; break; case EfiACPIReclaimMemory: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiACPIReclaimMemoryShort : NameEfiACPIReclaimMemory, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); + ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? ShortNameEfiMemory[EfiACPIReclaimMemory] : FullNameEfiMemory[EfiACPIReclaimMemory], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); TotalPages += Walker->NumberOfPages; AcpiReclaimPages += Walker->NumberOfPages; break; case EfiACPIMemoryNVS: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiACPIMemoryNVSShort : NameEfiACPIMemoryNVS, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); + ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? ShortNameEfiMemory[EfiACPIMemoryNVS] : FullNameEfiMemory[EfiACPIMemoryNVS], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); TotalPages += Walker->NumberOfPages; AcpiNvsPages += Walker->NumberOfPages; break; case EfiMemoryMappedIO: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiMemoryMappedIOShort : NameEfiMemoryMappedIO, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); + ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? ShortNameEfiMemory[EfiMemoryMappedIO] : FullNameEfiMemory[EfiMemoryMappedIO], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); MmioSpacePages += Walker->NumberOfPages; break; case EfiMemoryMappedIOPortSpace: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiMemoryMappedIOPortSpaceShort : NameEfiMemoryMappedIOPortSpace, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); + ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? ShortNameEfiMemory[EfiMemoryMappedIOPortSpace] : FullNameEfiMemory[EfiMemoryMappedIOPortSpace], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); MmioPortPages += Walker->NumberOfPages; break; case EfiPalCode: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiPalCode, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); + ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, FullNameEfiMemory[EfiPalCode], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); TotalPages += Walker->NumberOfPages; PalCodePages += Walker->NumberOfPages; break; case EfiUnacceptedMemoryType: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiUnacceptedMemoryType, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); + ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, FullNameEfiMemory[EfiUnacceptedMemoryType], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); TotalPages += Walker->NumberOfPages; UnacceptedPages += Walker->NumberOfPages; break; From 5ff8948a12c0bd968a25592c36da028552f177df Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 17 Sep 2025 14:46:51 +0200 Subject: [PATCH 0608/1172] ShellPkg/MemMap: Create arrays of MemoryType configuration and Page In an effort to simplify the code in the ShellPkg: - create a MEMORY_TYPE_INFO struct, storing per-MemoryType configuration information to facilitate the operations to do for each MemoryType. - create a MEMORY_TYPE_PAGES_INFO struct, storing per-MemoryType Pages and PagesSize count. Also use these arrays to facilitate Pages accounting and remove per-MemoryType variables. No functional change is introduced. Signed-off-by: Pierre Gondois --- .../UefiShellDebug1CommandsLib/MemMap.c | 388 ++++++++---------- 1 file changed, 168 insertions(+), 220 deletions(-) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c index 370697539948..e0b6fb873773 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c @@ -45,6 +45,50 @@ STATIC CONST CHAR16 *ShortNameEfiMemory[] = { [EfiMemoryMappedIOPortSpace] = L"MMIO_Port", }; +/** Memory Type information. + + Store some information about the actions to operate on different + Memory Types. +*/ +typedef struct { + /// Whether the MemoryType should contribute to the total number of pages. + BOOLEAN ContributeTotalPages; + + /// Whether the MemoryType has a short name. + BOOLEAN HasShortName; +} MEMORY_TYPE_INFO; + +STATIC CONST MEMORY_TYPE_INFO MemoryPageArray[EfiMaxMemoryType] = { + [EfiReservedMemoryType] = { FALSE, FALSE, }, + [EfiLoaderCode] = { TRUE, FALSE, }, + [EfiLoaderData] = { TRUE, FALSE, }, + [EfiBootServicesCode] = { TRUE, TRUE, }, + [EfiBootServicesData] = { TRUE, TRUE, }, + [EfiRuntimeServicesCode] = { TRUE, TRUE, }, + [EfiRuntimeServicesData] = { TRUE, TRUE, }, + [EfiConventionalMemory] = { TRUE, FALSE, }, + [EfiUnusableMemory] = { FALSE, TRUE, }, + [EfiACPIReclaimMemory] = { TRUE, TRUE, }, + [EfiACPIMemoryNVS] = { TRUE, TRUE, }, + [EfiMemoryMappedIO] = { FALSE, TRUE, }, + [EfiMemoryMappedIOPortSpace] = { FALSE, TRUE, }, + [EfiPalCode] = { TRUE, FALSE, }, + [EfiPersistentMemory] = { TRUE, FALSE, }, + [EfiUnacceptedMemoryType] = { TRUE, FALSE, }, +}; + +/** Memory Type Pages Information. + + Store the number of Pages/PagesSize for each MemoryType. +*/ +typedef struct { + /// Number of pages for this MemoryType. + UINT64 Pages; + + /// Number of Pages * Page Size for this MemoryType. + UINT64 PagesSize; +} MEMORY_TYPE_PAGES_INFO; + #include "UefiShellDebug1CommandsLib.h" typedef struct { @@ -116,78 +160,36 @@ ShellCommandRunMemMap ( IN EFI_SYSTEM_TABLE *SystemTable ) { - EFI_STATUS Status; - LIST_ENTRY *Package; - CHAR16 *ProblemParam; - SHELL_STATUS ShellStatus; - UINTN Size; - EFI_MEMORY_DESCRIPTOR *Descriptors; - UINTN MapKey; - UINTN ItemSize; - UINT32 Version; - EFI_MEMORY_DESCRIPTOR *Walker; - UINT64 ReservedPages; - UINT64 LoadCodePages; - UINT64 LoadDataPages; - UINT64 BSCodePages; - UINT64 BSDataPages; - UINT64 RTDataPages; - UINT64 RTCodePages; - UINT64 AvailPages; - UINT64 TotalPages; - UINT64 ReservedPagesSize; - UINT64 LoadCodePagesSize; - UINT64 LoadDataPagesSize; - UINT64 BSCodePagesSize; - UINT64 BSDataPagesSize; - UINT64 RTDataPagesSize; - UINT64 RTCodePagesSize; - UINT64 AvailPagesSize; - UINT64 TotalPagesSize; - UINT64 AcpiReclaimPages; - UINT64 AcpiNvsPages; - UINT64 MmioSpacePages; - UINT64 AcpiReclaimPagesSize; - UINT64 AcpiNvsPagesSize; - UINT64 MmioSpacePagesSize; - UINT64 MmioPortPages; - UINT64 MmioPortPagesSize; - UINT64 UnusableMemoryPages; - UINT64 UnusableMemoryPagesSize; - UINT64 PalCodePages; - UINT64 PalCodePagesSize; - UINT64 UnacceptedPages; - UINT64 UnacceptedPagesSize; - UINT64 PersistentPages; - UINT64 PersistentPagesSize; - BOOLEAN Sfo; - LIST_ENTRY MemoryList; - MEMORY_LENGTH_ENTRY *Entry; - LIST_ENTRY *Link; - - AcpiReclaimPages = 0; - AcpiNvsPages = 0; - MmioSpacePages = 0; - TotalPages = 0; - ReservedPages = 0; - LoadCodePages = 0; - LoadDataPages = 0; - BSCodePages = 0; - BSDataPages = 0; - RTDataPages = 0; - RTCodePages = 0; - AvailPages = 0; - MmioPortPages = 0; - UnusableMemoryPages = 0; - PalCodePages = 0; - PersistentPages = 0; - Size = 0; - UnacceptedPages = 0; - Descriptors = NULL; - ShellStatus = SHELL_SUCCESS; - Status = EFI_SUCCESS; + EFI_STATUS Status; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + SHELL_STATUS ShellStatus; + UINTN Size; + EFI_MEMORY_DESCRIPTOR *Descriptors; + UINTN MapKey; + UINTN ItemSize; + UINT32 Version; + EFI_MEMORY_DESCRIPTOR *Walker; + BOOLEAN Sfo; + LIST_ENTRY MemoryList; + MEMORY_LENGTH_ENTRY *Entry; + LIST_ENTRY *Link; + CONST CHAR16 *MemoryTypeName; + UINTN Index; + UINT64 TotalPages; + UINT64 TotalPagesSize; + MEMORY_TYPE_PAGES_INFO MemoryPageCount[EfiMaxMemoryType]; + + TotalPages = 0; + Size = 0; + Descriptors = NULL; + ShellStatus = SHELL_SUCCESS; + Status = EFI_SUCCESS; InitializeListHead (&MemoryList); + // Reset the MemoryPageCount array. + ZeroMem (MemoryPageCount, sizeof (MemoryPageCount)); + // // initialize the shell lib (we must be in non-auto-init...) // @@ -245,118 +247,64 @@ ShellCommandRunMemMap ( ; Walker = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)Walker + ItemSize) ) { - switch (Walker->Type) { - case EfiReservedMemoryType: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, FullNameEfiMemory[EfiReservedMemoryType], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); - ReservedPages += Walker->NumberOfPages; - break; - case EfiLoaderCode: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, FullNameEfiMemory[EfiLoaderCode], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); - LoadCodePages += Walker->NumberOfPages; - TotalPages += Walker->NumberOfPages; - break; - case EfiLoaderData: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, FullNameEfiMemory[EfiLoaderData], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); - LoadDataPages += Walker->NumberOfPages; - TotalPages += Walker->NumberOfPages; - break; - case EfiBootServicesCode: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? ShortNameEfiMemory[EfiBootServicesCode] : FullNameEfiMemory[EfiBootServicesCode], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); - BSCodePages += Walker->NumberOfPages; - TotalPages += Walker->NumberOfPages; - break; - case EfiBootServicesData: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? ShortNameEfiMemory[EfiBootServicesData] : FullNameEfiMemory[EfiBootServicesData], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); - BSDataPages += Walker->NumberOfPages; - TotalPages += Walker->NumberOfPages; - break; - case EfiRuntimeServicesCode: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? ShortNameEfiMemory[EfiRuntimeServicesCode] : FullNameEfiMemory[EfiRuntimeServicesCode], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); - RTCodePages += Walker->NumberOfPages; - TotalPages += Walker->NumberOfPages; - break; - case EfiRuntimeServicesData: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? ShortNameEfiMemory[EfiRuntimeServicesData] : FullNameEfiMemory[EfiRuntimeServicesData], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); - RTDataPages += Walker->NumberOfPages; - TotalPages += Walker->NumberOfPages; - break; - case EfiConventionalMemory: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, FullNameEfiMemory[EfiConventionalMemory], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); - AvailPages += Walker->NumberOfPages; - TotalPages += Walker->NumberOfPages; - break; - case EfiPersistentMemory: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, FullNameEfiMemory[EfiPersistentMemory], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); - PersistentPages += Walker->NumberOfPages; - TotalPages += Walker->NumberOfPages; - break; - case EfiUnusableMemory: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? ShortNameEfiMemory[EfiUnusableMemory] : FullNameEfiMemory[EfiUnusableMemory], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); - UnusableMemoryPages += Walker->NumberOfPages; - break; - case EfiACPIReclaimMemory: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? ShortNameEfiMemory[EfiACPIReclaimMemory] : FullNameEfiMemory[EfiACPIReclaimMemory], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); - TotalPages += Walker->NumberOfPages; - AcpiReclaimPages += Walker->NumberOfPages; - break; - case EfiACPIMemoryNVS: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? ShortNameEfiMemory[EfiACPIMemoryNVS] : FullNameEfiMemory[EfiACPIMemoryNVS], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); - TotalPages += Walker->NumberOfPages; - AcpiNvsPages += Walker->NumberOfPages; - break; - case EfiMemoryMappedIO: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? ShortNameEfiMemory[EfiMemoryMappedIO] : FullNameEfiMemory[EfiMemoryMappedIO], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); - MmioSpacePages += Walker->NumberOfPages; - break; - case EfiMemoryMappedIOPortSpace: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? ShortNameEfiMemory[EfiMemoryMappedIOPortSpace] : FullNameEfiMemory[EfiMemoryMappedIOPortSpace], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); - MmioPortPages += Walker->NumberOfPages; - break; - case EfiPalCode: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, FullNameEfiMemory[EfiPalCode], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); - TotalPages += Walker->NumberOfPages; - PalCodePages += Walker->NumberOfPages; - break; - case EfiUnacceptedMemoryType: - ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, FullNameEfiMemory[EfiUnacceptedMemoryType], Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute); - TotalPages += Walker->NumberOfPages; - UnacceptedPages += Walker->NumberOfPages; - break; - default: - // - // Shell Spec defines the SFO format. - // Do not print the OEM/OS memory usage in the SFO format, to avoid conflict with Shell Spec. - // - if (!Sfo) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_LIST_ITEM_OTHER), gShellDebug1HiiHandle, Walker->Type, Walker->PhysicalStart, Walker->PhysicalStart + MultU64x64 (SIZE_4KB, Walker->NumberOfPages) - 1, Walker->NumberOfPages, Walker->Attribute); - } + if (Walker->Type < EfiMaxMemoryType) { + MemoryPageCount[Walker->Type].Pages += Walker->NumberOfPages; + if (MemoryPageArray[Walker->Type].ContributeTotalPages) { TotalPages += Walker->NumberOfPages; - AddMemoryLength (&MemoryList, Walker->Type, Walker->NumberOfPages); - break; + } + + if (!Sfo && MemoryPageArray[Walker->Type].HasShortName) { + MemoryTypeName = ShortNameEfiMemory[Walker->Type]; + } else { + MemoryTypeName = FullNameEfiMemory[Walker->Type]; + } + + ShellPrintHiiEx ( + -1, + -1, + NULL, + (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), + gShellDebug1HiiHandle, + MemoryTypeName, + Walker->PhysicalStart, + Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, + Walker->NumberOfPages, + Walker->Attribute + ); + } else { + // + // Shell Spec defines the SFO format. + // Do not print the OEM/OS memory usage in the SFO format, to avoid conflict with Shell Spec. + // + if (!Sfo) { + ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_MEMMAP_LIST_ITEM_OTHER), + gShellDebug1HiiHandle, + Walker->Type, + Walker->PhysicalStart, + Walker->PhysicalStart + MultU64x64 (SIZE_4KB, Walker->NumberOfPages) - 1, + Walker->NumberOfPages, + Walker->Attribute + ); + } + + TotalPages += Walker->NumberOfPages; + AddMemoryLength (&MemoryList, Walker->Type, Walker->NumberOfPages); } } + TotalPagesSize = MultU64x64 (SIZE_4KB, TotalPages); + for (Index = EfiReservedMemoryType; Index < EfiMaxMemoryType; Index++) { + MemoryPageCount[Index].PagesSize = MultU64x64 (SIZE_4KB, MemoryPageCount[Index].Pages); + } + // // print the summary // - ReservedPagesSize = MultU64x64 (SIZE_4KB, ReservedPages); - LoadCodePagesSize = MultU64x64 (SIZE_4KB, LoadCodePages); - LoadDataPagesSize = MultU64x64 (SIZE_4KB, LoadDataPages); - BSCodePagesSize = MultU64x64 (SIZE_4KB, BSCodePages); - BSDataPagesSize = MultU64x64 (SIZE_4KB, BSDataPages); - RTDataPagesSize = MultU64x64 (SIZE_4KB, RTDataPages); - RTCodePagesSize = MultU64x64 (SIZE_4KB, RTCodePages); - AvailPagesSize = MultU64x64 (SIZE_4KB, AvailPages); - TotalPagesSize = MultU64x64 (SIZE_4KB, TotalPages); - AcpiReclaimPagesSize = MultU64x64 (SIZE_4KB, AcpiReclaimPages); - AcpiNvsPagesSize = MultU64x64 (SIZE_4KB, AcpiNvsPages); - MmioSpacePagesSize = MultU64x64 (SIZE_4KB, MmioSpacePages); - MmioPortPagesSize = MultU64x64 (SIZE_4KB, MmioPortPages); - PalCodePagesSize = MultU64x64 (SIZE_4KB, PalCodePages); - UnacceptedPagesSize = MultU64x64 (SIZE_4KB, UnacceptedPages); - PersistentPagesSize = MultU64x64 (SIZE_4KB, PersistentPages); - UnusableMemoryPagesSize = MultU64x64 (SIZE_4KB, UnusableMemoryPages); if (!Sfo) { ShellPrintHiiEx ( -1, @@ -364,36 +312,36 @@ ShellCommandRunMemMap ( NULL, STRING_TOKEN (STR_MEMMAP_LIST_SUMM), gShellDebug1HiiHandle, - ReservedPages, - ReservedPagesSize, - LoadCodePages, - LoadCodePagesSize, - LoadDataPages, - LoadDataPagesSize, - BSCodePages, - BSCodePagesSize, - BSDataPages, - BSDataPagesSize, - RTCodePages, - RTCodePagesSize, - RTDataPages, - RTDataPagesSize, - AcpiReclaimPages, - AcpiReclaimPagesSize, - AcpiNvsPages, - AcpiNvsPagesSize, - MmioSpacePages, - MmioSpacePagesSize, - MmioPortPages, - MmioPortPagesSize, - PalCodePages, - PalCodePagesSize, - UnacceptedPages, - UnacceptedPagesSize, - AvailPages, - AvailPagesSize, - PersistentPages, - PersistentPagesSize + MemoryPageCount[EfiReservedMemoryType].Pages, + MemoryPageCount[EfiReservedMemoryType].PagesSize, + MemoryPageCount[EfiLoaderCode].Pages, + MemoryPageCount[EfiLoaderCode].PagesSize, + MemoryPageCount[EfiLoaderData].Pages, + MemoryPageCount[EfiLoaderData].PagesSize, + MemoryPageCount[EfiBootServicesCode].Pages, + MemoryPageCount[EfiBootServicesCode].PagesSize, + MemoryPageCount[EfiBootServicesData].Pages, + MemoryPageCount[EfiBootServicesData].PagesSize, + MemoryPageCount[EfiRuntimeServicesCode].Pages, + MemoryPageCount[EfiRuntimeServicesCode].PagesSize, + MemoryPageCount[EfiRuntimeServicesData].Pages, + MemoryPageCount[EfiRuntimeServicesData].PagesSize, + MemoryPageCount[EfiACPIReclaimMemory].Pages, + MemoryPageCount[EfiACPIReclaimMemory].PagesSize, + MemoryPageCount[EfiACPIMemoryNVS].Pages, + MemoryPageCount[EfiACPIMemoryNVS].PagesSize, + MemoryPageCount[EfiMemoryMappedIO].Pages, + MemoryPageCount[EfiMemoryMappedIO].PagesSize, + MemoryPageCount[EfiMemoryMappedIOPortSpace].Pages, + MemoryPageCount[EfiMemoryMappedIOPortSpace].PagesSize, + MemoryPageCount[EfiPalCode].Pages, + MemoryPageCount[EfiPalCode].PagesSize, + MemoryPageCount[EfiUnacceptedMemoryType].Pages, + MemoryPageCount[EfiUnacceptedMemoryType].PagesSize, + MemoryPageCount[EfiConventionalMemory].Pages, + MemoryPageCount[EfiConventionalMemory].PagesSize, + MemoryPageCount[EfiPersistentMemory].Pages, + MemoryPageCount[EfiPersistentMemory].PagesSize ); // @@ -430,22 +378,22 @@ ShellCommandRunMemMap ( STRING_TOKEN (STR_MEMMAP_LIST_SUMM_SFO), gShellDebug1HiiHandle, TotalPagesSize, - ReservedPagesSize, - BSCodePagesSize, - BSDataPagesSize, - RTCodePagesSize, - RTDataPagesSize, - LoadCodePagesSize, - LoadDataPagesSize, - AvailPagesSize, - MmioSpacePagesSize, - MmioPortPagesSize, - UnusableMemoryPagesSize, - AcpiReclaimPagesSize, - AcpiNvsPagesSize, - PalCodePagesSize, - UnacceptedPagesSize, - PersistentPagesSize + MemoryPageCount[EfiReservedMemoryType].PagesSize, + MemoryPageCount[EfiBootServicesCode].PagesSize, + MemoryPageCount[EfiBootServicesData].PagesSize, + MemoryPageCount[EfiRuntimeServicesCode].PagesSize, + MemoryPageCount[EfiRuntimeServicesData].PagesSize, + MemoryPageCount[EfiLoaderCode].PagesSize, + MemoryPageCount[EfiLoaderData].PagesSize, + MemoryPageCount[EfiConventionalMemory].PagesSize, + MemoryPageCount[EfiMemoryMappedIO].PagesSize, + MemoryPageCount[EfiMemoryMappedIOPortSpace].PagesSize, + MemoryPageCount[EfiUnusableMemory].PagesSize, + MemoryPageCount[EfiACPIReclaimMemory].PagesSize, + MemoryPageCount[EfiACPIMemoryNVS].PagesSize, + MemoryPageCount[EfiPalCode].PagesSize, + MemoryPageCount[EfiUnacceptedMemoryType].PagesSize, + MemoryPageCount[EfiPersistentMemory].PagesSize ); } } From 16ffc09be1685f44c75c2869f39af8db5181564d Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 17 Sep 2025 16:34:42 +0200 Subject: [PATCH 0609/1172] ShellPkg/MemMap: Extract a ParseMemoryDescriptors() function In an effort to simplify the code in the ShellPkg, extract a ParseMemoryDescriptors() function. No functional change is introduced. Signed-off-by: Pierre Gondois --- .../UefiShellDebug1CommandsLib/MemMap.c | 394 ++++++++++-------- 1 file changed, 209 insertions(+), 185 deletions(-) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c index e0b6fb873773..8f30a53b7b93 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c @@ -147,6 +147,204 @@ AddMemoryLength ( NewEntry->NumberOfPages += NumberOfPages; } +/** Parse Memory Descriptors + +@param[in] Descriptors Array of pointers to Memory Descriptors. +@param[in] Size Size of the Descriptors array. +@param[in] ItemSize Size of a Memory Descriptor. +@param[in] Sfo Whether 'Standard Format Output' should be used. +**/ +STATIC +SHELL_STATUS +ParseMemoryDescriptors ( + IN EFI_MEMORY_DESCRIPTOR *Descriptors, + IN UINTN Size, + IN UINTN ItemSize, + IN BOOLEAN Sfo + ) +{ + EFI_MEMORY_DESCRIPTOR *Walker; + UINT64 TotalPages; + UINT64 TotalPagesSize; + MEMORY_TYPE_PAGES_INFO MemoryPageCount[EfiMaxMemoryType]; + CONST CHAR16 *MemoryTypeName; + UINTN Index; + LIST_ENTRY MemoryList; + LIST_ENTRY *Link; + MEMORY_LENGTH_ENTRY *Entry; + + InitializeListHead (&MemoryList); + + TotalPages = 0; + + // Reset the MemoryPageCount array. + ZeroMem (MemoryPageCount, sizeof (MemoryPageCount)); + + for (Walker = Descriptors + ; (Walker < (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)Descriptors + Size)) && (Walker != NULL) + ; Walker = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)Walker + ItemSize) + ) + { + if (Walker->Type < EfiMaxMemoryType) { + MemoryPageCount[Walker->Type].Pages += Walker->NumberOfPages; + + if (MemoryPageArray[Walker->Type].ContributeTotalPages) { + TotalPages += Walker->NumberOfPages; + } + + if (!Sfo && MemoryPageArray[Walker->Type].HasShortName) { + MemoryTypeName = ShortNameEfiMemory[Walker->Type]; + } else { + MemoryTypeName = FullNameEfiMemory[Walker->Type]; + } + + ShellPrintHiiEx ( + -1, + -1, + NULL, + (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), + gShellDebug1HiiHandle, + MemoryTypeName, + Walker->PhysicalStart, + Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, + Walker->NumberOfPages, + Walker->Attribute + ); + } else { + // + // Shell Spec defines the SFO format. + // Do not print the OEM/OS memory usage in the SFO format, to avoid conflict with Shell Spec. + // + if (!Sfo) { + ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_MEMMAP_LIST_ITEM_OTHER), + gShellDebug1HiiHandle, + Walker->Type, + Walker->PhysicalStart, + Walker->PhysicalStart + MultU64x64 (SIZE_4KB, Walker->NumberOfPages) - 1, + Walker->NumberOfPages, + Walker->Attribute + ); + } + + TotalPages += Walker->NumberOfPages; + AddMemoryLength (&MemoryList, Walker->Type, Walker->NumberOfPages); + } + } + + TotalPagesSize = MultU64x64 (SIZE_4KB, TotalPages); + for (Index = EfiReservedMemoryType; Index < EfiMaxMemoryType; Index++) { + MemoryPageCount[Index].PagesSize = MultU64x64 (SIZE_4KB, MemoryPageCount[Index].Pages); + } + + // + // print the summary + // + if (!Sfo) { + ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_MEMMAP_LIST_SUMM), + gShellDebug1HiiHandle, + MemoryPageCount[EfiReservedMemoryType].Pages, + MemoryPageCount[EfiReservedMemoryType].PagesSize, + MemoryPageCount[EfiLoaderCode].Pages, + MemoryPageCount[EfiLoaderCode].PagesSize, + MemoryPageCount[EfiLoaderData].Pages, + MemoryPageCount[EfiLoaderData].PagesSize, + MemoryPageCount[EfiBootServicesCode].Pages, + MemoryPageCount[EfiBootServicesCode].PagesSize, + MemoryPageCount[EfiBootServicesData].Pages, + MemoryPageCount[EfiBootServicesData].PagesSize, + MemoryPageCount[EfiRuntimeServicesCode].Pages, + MemoryPageCount[EfiRuntimeServicesCode].PagesSize, + MemoryPageCount[EfiRuntimeServicesData].Pages, + MemoryPageCount[EfiRuntimeServicesData].PagesSize, + MemoryPageCount[EfiACPIReclaimMemory].Pages, + MemoryPageCount[EfiACPIReclaimMemory].PagesSize, + MemoryPageCount[EfiACPIMemoryNVS].Pages, + MemoryPageCount[EfiACPIMemoryNVS].PagesSize, + MemoryPageCount[EfiMemoryMappedIO].Pages, + MemoryPageCount[EfiMemoryMappedIO].PagesSize, + MemoryPageCount[EfiMemoryMappedIOPortSpace].Pages, + MemoryPageCount[EfiMemoryMappedIOPortSpace].PagesSize, + MemoryPageCount[EfiPalCode].Pages, + MemoryPageCount[EfiPalCode].PagesSize, + MemoryPageCount[EfiUnacceptedMemoryType].Pages, + MemoryPageCount[EfiUnacceptedMemoryType].PagesSize, + MemoryPageCount[EfiConventionalMemory].Pages, + MemoryPageCount[EfiConventionalMemory].PagesSize, + MemoryPageCount[EfiPersistentMemory].Pages, + MemoryPageCount[EfiPersistentMemory].PagesSize + ); + + // + // Print out the total memory usage for OEM/OS types in the order of type. + // + for (Link = GetFirstNode (&MemoryList); !IsNull (&MemoryList, Link); Link = GetNextNode (&MemoryList, Link)) { + Entry = BASE_CR (Link, MEMORY_LENGTH_ENTRY, Link); + ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_MEMMAP_LIST_SUMM_OTHER), + gShellDebug1HiiHandle, + Entry->Type, + Entry->NumberOfPages, + MultU64x64 (SIZE_4KB, Entry->NumberOfPages) + ); + } + + ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_MEMMAP_LIST_SUMM2), + gShellDebug1HiiHandle, + DivU64x32 (MultU64x64 (SIZE_4KB, TotalPages), SIZE_1MB), + TotalPagesSize + ); + } else { + ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_MEMMAP_LIST_SUMM_SFO), + gShellDebug1HiiHandle, + TotalPagesSize, + MemoryPageCount[EfiReservedMemoryType].PagesSize, + MemoryPageCount[EfiBootServicesCode].PagesSize, + MemoryPageCount[EfiBootServicesData].PagesSize, + MemoryPageCount[EfiRuntimeServicesCode].PagesSize, + MemoryPageCount[EfiRuntimeServicesData].PagesSize, + MemoryPageCount[EfiLoaderCode].PagesSize, + MemoryPageCount[EfiLoaderData].PagesSize, + MemoryPageCount[EfiConventionalMemory].PagesSize, + MemoryPageCount[EfiMemoryMappedIO].PagesSize, + MemoryPageCount[EfiMemoryMappedIOPortSpace].PagesSize, + MemoryPageCount[EfiUnusableMemory].PagesSize, + MemoryPageCount[EfiACPIReclaimMemory].PagesSize, + MemoryPageCount[EfiACPIMemoryNVS].PagesSize, + MemoryPageCount[EfiPalCode].PagesSize, + MemoryPageCount[EfiUnacceptedMemoryType].PagesSize, + MemoryPageCount[EfiPersistentMemory].PagesSize + ); + } + + // + // Free the memory list. + // + for (Link = GetFirstNode (&MemoryList); !IsNull (&MemoryList, Link); ) { + Link = RemoveEntryList (Link); + } + + return SHELL_SUCCESS; +} + /** Function for 'memmap' command. @@ -160,35 +358,21 @@ ShellCommandRunMemMap ( IN EFI_SYSTEM_TABLE *SystemTable ) { - EFI_STATUS Status; - LIST_ENTRY *Package; - CHAR16 *ProblemParam; - SHELL_STATUS ShellStatus; - UINTN Size; - EFI_MEMORY_DESCRIPTOR *Descriptors; - UINTN MapKey; - UINTN ItemSize; - UINT32 Version; - EFI_MEMORY_DESCRIPTOR *Walker; - BOOLEAN Sfo; - LIST_ENTRY MemoryList; - MEMORY_LENGTH_ENTRY *Entry; - LIST_ENTRY *Link; - CONST CHAR16 *MemoryTypeName; - UINTN Index; - UINT64 TotalPages; - UINT64 TotalPagesSize; - MEMORY_TYPE_PAGES_INFO MemoryPageCount[EfiMaxMemoryType]; + EFI_STATUS Status; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + SHELL_STATUS ShellStatus; + UINTN Size; + EFI_MEMORY_DESCRIPTOR *Descriptors; + UINTN MapKey; + UINTN ItemSize; + UINT32 Version; + BOOLEAN Sfo; - TotalPages = 0; Size = 0; Descriptors = NULL; ShellStatus = SHELL_SUCCESS; Status = EFI_SUCCESS; - InitializeListHead (&MemoryList); - - // Reset the MemoryPageCount array. - ZeroMem (MemoryPageCount, sizeof (MemoryPageCount)); // // initialize the shell lib (we must be in non-auto-init...) @@ -242,160 +426,7 @@ ShellCommandRunMemMap ( ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_SFO_HEADER), gShellDebug1HiiHandle, L"memmap"); } - for ( Walker = Descriptors - ; (Walker < (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)Descriptors + Size)) && (Walker != NULL) - ; Walker = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)Walker + ItemSize) - ) - { - if (Walker->Type < EfiMaxMemoryType) { - MemoryPageCount[Walker->Type].Pages += Walker->NumberOfPages; - - if (MemoryPageArray[Walker->Type].ContributeTotalPages) { - TotalPages += Walker->NumberOfPages; - } - - if (!Sfo && MemoryPageArray[Walker->Type].HasShortName) { - MemoryTypeName = ShortNameEfiMemory[Walker->Type]; - } else { - MemoryTypeName = FullNameEfiMemory[Walker->Type]; - } - - ShellPrintHiiEx ( - -1, - -1, - NULL, - (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), - gShellDebug1HiiHandle, - MemoryTypeName, - Walker->PhysicalStart, - Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, - Walker->NumberOfPages, - Walker->Attribute - ); - } else { - // - // Shell Spec defines the SFO format. - // Do not print the OEM/OS memory usage in the SFO format, to avoid conflict with Shell Spec. - // - if (!Sfo) { - ShellPrintHiiEx ( - -1, - -1, - NULL, - STRING_TOKEN (STR_MEMMAP_LIST_ITEM_OTHER), - gShellDebug1HiiHandle, - Walker->Type, - Walker->PhysicalStart, - Walker->PhysicalStart + MultU64x64 (SIZE_4KB, Walker->NumberOfPages) - 1, - Walker->NumberOfPages, - Walker->Attribute - ); - } - - TotalPages += Walker->NumberOfPages; - AddMemoryLength (&MemoryList, Walker->Type, Walker->NumberOfPages); - } - } - - TotalPagesSize = MultU64x64 (SIZE_4KB, TotalPages); - for (Index = EfiReservedMemoryType; Index < EfiMaxMemoryType; Index++) { - MemoryPageCount[Index].PagesSize = MultU64x64 (SIZE_4KB, MemoryPageCount[Index].Pages); - } - - // - // print the summary - // - if (!Sfo) { - ShellPrintHiiEx ( - -1, - -1, - NULL, - STRING_TOKEN (STR_MEMMAP_LIST_SUMM), - gShellDebug1HiiHandle, - MemoryPageCount[EfiReservedMemoryType].Pages, - MemoryPageCount[EfiReservedMemoryType].PagesSize, - MemoryPageCount[EfiLoaderCode].Pages, - MemoryPageCount[EfiLoaderCode].PagesSize, - MemoryPageCount[EfiLoaderData].Pages, - MemoryPageCount[EfiLoaderData].PagesSize, - MemoryPageCount[EfiBootServicesCode].Pages, - MemoryPageCount[EfiBootServicesCode].PagesSize, - MemoryPageCount[EfiBootServicesData].Pages, - MemoryPageCount[EfiBootServicesData].PagesSize, - MemoryPageCount[EfiRuntimeServicesCode].Pages, - MemoryPageCount[EfiRuntimeServicesCode].PagesSize, - MemoryPageCount[EfiRuntimeServicesData].Pages, - MemoryPageCount[EfiRuntimeServicesData].PagesSize, - MemoryPageCount[EfiACPIReclaimMemory].Pages, - MemoryPageCount[EfiACPIReclaimMemory].PagesSize, - MemoryPageCount[EfiACPIMemoryNVS].Pages, - MemoryPageCount[EfiACPIMemoryNVS].PagesSize, - MemoryPageCount[EfiMemoryMappedIO].Pages, - MemoryPageCount[EfiMemoryMappedIO].PagesSize, - MemoryPageCount[EfiMemoryMappedIOPortSpace].Pages, - MemoryPageCount[EfiMemoryMappedIOPortSpace].PagesSize, - MemoryPageCount[EfiPalCode].Pages, - MemoryPageCount[EfiPalCode].PagesSize, - MemoryPageCount[EfiUnacceptedMemoryType].Pages, - MemoryPageCount[EfiUnacceptedMemoryType].PagesSize, - MemoryPageCount[EfiConventionalMemory].Pages, - MemoryPageCount[EfiConventionalMemory].PagesSize, - MemoryPageCount[EfiPersistentMemory].Pages, - MemoryPageCount[EfiPersistentMemory].PagesSize - ); - - // - // Print out the total memory usage for OEM/OS types in the order of type. - // - for (Link = GetFirstNode (&MemoryList); !IsNull (&MemoryList, Link); Link = GetNextNode (&MemoryList, Link)) { - Entry = BASE_CR (Link, MEMORY_LENGTH_ENTRY, Link); - ShellPrintHiiEx ( - -1, - -1, - NULL, - STRING_TOKEN (STR_MEMMAP_LIST_SUMM_OTHER), - gShellDebug1HiiHandle, - Entry->Type, - Entry->NumberOfPages, - MultU64x64 (SIZE_4KB, Entry->NumberOfPages) - ); - } - - ShellPrintHiiEx ( - -1, - -1, - NULL, - STRING_TOKEN (STR_MEMMAP_LIST_SUMM2), - gShellDebug1HiiHandle, - DivU64x32 (MultU64x64 (SIZE_4KB, TotalPages), SIZE_1MB), - TotalPagesSize - ); - } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, - STRING_TOKEN (STR_MEMMAP_LIST_SUMM_SFO), - gShellDebug1HiiHandle, - TotalPagesSize, - MemoryPageCount[EfiReservedMemoryType].PagesSize, - MemoryPageCount[EfiBootServicesCode].PagesSize, - MemoryPageCount[EfiBootServicesData].PagesSize, - MemoryPageCount[EfiRuntimeServicesCode].PagesSize, - MemoryPageCount[EfiRuntimeServicesData].PagesSize, - MemoryPageCount[EfiLoaderCode].PagesSize, - MemoryPageCount[EfiLoaderData].PagesSize, - MemoryPageCount[EfiConventionalMemory].PagesSize, - MemoryPageCount[EfiMemoryMappedIO].PagesSize, - MemoryPageCount[EfiMemoryMappedIOPortSpace].PagesSize, - MemoryPageCount[EfiUnusableMemory].PagesSize, - MemoryPageCount[EfiACPIReclaimMemory].PagesSize, - MemoryPageCount[EfiACPIMemoryNVS].PagesSize, - MemoryPageCount[EfiPalCode].PagesSize, - MemoryPageCount[EfiUnacceptedMemoryType].PagesSize, - MemoryPageCount[EfiPersistentMemory].PagesSize - ); - } + ParseMemoryDescriptors (Descriptors, Size, ItemSize, Sfo); } } @@ -406,12 +437,5 @@ ShellCommandRunMemMap ( FreePool (Descriptors); } - // - // Free the memory list. - // - for (Link = GetFirstNode (&MemoryList); !IsNull (&MemoryList, Link); ) { - Link = RemoveEntryList (Link); - } - return (ShellStatus); } From 3fcea99da0897f8ddab3a6e3954c8b7d23253977 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 17 Sep 2025 15:09:31 +0200 Subject: [PATCH 0610/1172] ShellPkg/DrvCfg: Extract a ParseBufferConfig() function In an effort to simplify the code in the ShellPkg, extract a ParseBufferConfig(). No functional change is introduced. Signed-off-by: Pierre Gondois --- .../UefiShellDriver1CommandsLib/DrvCfg.c | 200 ++++++++++-------- 1 file changed, 111 insertions(+), 89 deletions(-) diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvCfg.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvCfg.c index 52dbd64b0f45..ab5493b05479 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvCfg.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvCfg.c @@ -294,6 +294,108 @@ ConfigToFile ( return (SHELL_SUCCESS); } +/** Parse the config contained in the input Buffer. + + @param[in] Handle The handle to get info for. + @param[in] MainBuffer Main Buffer, containing the list of package list. + @param[in] MainBufferSize Main Buffer Size. + @param[in] HiiDatabase HII Database. +**/ +STATIC +SHELL_STATUS +ParseBufferConfig ( + IN EFI_HANDLE Handle, + IN VOID *MainBuffer, + IN UINTN MainBufferSize, + IN EFI_HII_DATABASE_PROTOCOL *HiiDatabase + ) +{ + CHAR16 *TempDevPathString; + EFI_DEVICE_PATH_PROTOCOL *DevPath; + EFI_HII_HANDLE HiiHandle; + EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader; + UINTN HandleIndex; + EFI_STATUS Status; + EFI_HII_PACKAGE_HEADER *PackageHeader; + + // + // we need to parse the buffer and try to match the device paths for each item to try to find it's device path. + // + + for (PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER *)MainBuffer + ; PackageListHeader != NULL && ((CHAR8 *)PackageListHeader) < (((CHAR8 *)MainBuffer)+MainBufferSize) + ; PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER *)(((CHAR8 *)(PackageListHeader)) + PackageListHeader->PackageLength)) + { + for (PackageHeader = (EFI_HII_PACKAGE_HEADER *)(((CHAR8 *)(PackageListHeader))+sizeof (EFI_HII_PACKAGE_LIST_HEADER)) + ; PackageHeader != NULL && ((CHAR8 *)PackageHeader) < (((CHAR8 *)MainBuffer)+MainBufferSize) && PackageHeader->Type != EFI_HII_PACKAGE_END + ; PackageHeader = (EFI_HII_PACKAGE_HEADER *)(((CHAR8 *)(PackageHeader))+PackageHeader->Length)) + { + if (PackageHeader->Type == EFI_HII_PACKAGE_DEVICE_PATH) { + HiiHandle = NULL; + Status = FindHiiHandleViaDevPath ((EFI_DEVICE_PATH_PROTOCOL *)(((CHAR8 *)PackageHeader) + sizeof (EFI_HII_PACKAGE_HEADER)), &HiiHandle, HiiDatabase); + if (EFI_ERROR (Status)) { + // + // print out an error. + // + TempDevPathString = ConvertDevicePathToText ((EFI_DEVICE_PATH_PROTOCOL *)(((CHAR8 *)PackageHeader) + sizeof (EFI_HII_PACKAGE_HEADER)), TRUE, TRUE); + if (TempDevPathString == NULL) { + ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_GEN_OUT_MEM), + gShellDriver1HiiHandle, + L"drvcfg" + ); + + return SHELL_OUT_OF_RESOURCES; + } + + ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_DRVCFG_IN_FILE_NF), + gShellDriver1HiiHandle, + TempDevPathString + ); + SHELL_FREE_NON_NULL (TempDevPathString); + } else { + Status = HiiDatabase->UpdatePackageList (HiiDatabase, HiiHandle, PackageListHeader); + if (EFI_ERROR (Status)) { + ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), + gShellDriver1HiiHandle, + L"drvcfg", + L"HiiDatabase->UpdatePackageList", + Status + ); + + return SHELL_DEVICE_ERROR; + } else { + DevPath = (EFI_DEVICE_PATH_PROTOCOL *)(((CHAR8 *)PackageHeader) + sizeof (EFI_HII_PACKAGE_HEADER)); + gBS->LocateDevicePath (&gEfiHiiConfigAccessProtocolGuid, &DevPath, &Handle); + HandleIndex = ConvertHandleToHandleIndex (Handle); + ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_DRVCFG_DONE_HII), + gShellDriver1HiiHandle, + HandleIndex + ); + } + } + } + } + } + + return SHELL_SUCCESS; +} + /** Function to read in HII configuration information from a file. @@ -306,19 +408,14 @@ ConfigFromFile ( IN CONST CHAR16 *FileName ) { - EFI_HII_DATABASE_PROTOCOL *HiiDatabase; - EFI_STATUS Status; - VOID *MainBuffer; - UINT64 Temp; - UINTN MainBufferSize; - EFI_HII_HANDLE HiiHandle; - SHELL_FILE_HANDLE FileHandle; - CHAR16 *TempDevPathString; - EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader; - EFI_HII_PACKAGE_HEADER *PackageHeader; - EFI_DEVICE_PATH_PROTOCOL *DevPath; - UINTN HandleIndex; - SHELL_STATUS ShellStatus; + EFI_HII_DATABASE_PROTOCOL *HiiDatabase; + EFI_STATUS Status; + VOID *MainBuffer; + UINT64 Temp; + UINTN MainBufferSize; + EFI_HII_HANDLE HiiHandle; + SHELL_FILE_HANDLE FileHandle; + SHELL_STATUS ShellStatus; HiiDatabase = NULL; MainBufferSize = 0; @@ -472,82 +569,7 @@ ConfigFromFile ( goto Done; } } else { - // - // we need to parse the buffer and try to match the device paths for each item to try to find it's device path. - // - - for (PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER *)MainBuffer - ; PackageListHeader != NULL && ((CHAR8 *)PackageListHeader) < (((CHAR8 *)MainBuffer)+MainBufferSize) - ; PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER *)(((CHAR8 *)(PackageListHeader)) + PackageListHeader->PackageLength)) - { - for (PackageHeader = (EFI_HII_PACKAGE_HEADER *)(((CHAR8 *)(PackageListHeader))+sizeof (EFI_HII_PACKAGE_LIST_HEADER)) - ; PackageHeader != NULL && ((CHAR8 *)PackageHeader) < (((CHAR8 *)MainBuffer)+MainBufferSize) && PackageHeader->Type != EFI_HII_PACKAGE_END - ; PackageHeader = (EFI_HII_PACKAGE_HEADER *)(((CHAR8 *)(PackageHeader))+PackageHeader->Length)) - { - if (PackageHeader->Type == EFI_HII_PACKAGE_DEVICE_PATH) { - HiiHandle = NULL; - Status = FindHiiHandleViaDevPath ((EFI_DEVICE_PATH_PROTOCOL *)(((CHAR8 *)PackageHeader) + sizeof (EFI_HII_PACKAGE_HEADER)), &HiiHandle, HiiDatabase); - if (EFI_ERROR (Status)) { - // - // print out an error. - // - TempDevPathString = ConvertDevicePathToText ((EFI_DEVICE_PATH_PROTOCOL *)(((CHAR8 *)PackageHeader) + sizeof (EFI_HII_PACKAGE_HEADER)), TRUE, TRUE); - if (TempDevPathString == NULL) { - ShellPrintHiiEx ( - -1, - -1, - NULL, - STRING_TOKEN (STR_GEN_OUT_MEM), - gShellDriver1HiiHandle, - L"drvcfg" - ); - - ShellStatus = SHELL_OUT_OF_RESOURCES; - goto Done; - } - - ShellPrintHiiEx ( - -1, - -1, - NULL, - STRING_TOKEN (STR_DRVCFG_IN_FILE_NF), - gShellDriver1HiiHandle, - TempDevPathString - ); - SHELL_FREE_NON_NULL (TempDevPathString); - } else { - Status = HiiDatabase->UpdatePackageList (HiiDatabase, HiiHandle, PackageListHeader); - if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, - STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), - gShellDriver1HiiHandle, - L"drvcfg", - L"HiiDatabase->UpdatePackageList", - Status - ); - - ShellStatus = SHELL_DEVICE_ERROR; - goto Done; - } else { - DevPath = (EFI_DEVICE_PATH_PROTOCOL *)(((CHAR8 *)PackageHeader) + sizeof (EFI_HII_PACKAGE_HEADER)); - gBS->LocateDevicePath (&gEfiHiiConfigAccessProtocolGuid, &DevPath, &Handle); - HandleIndex = ConvertHandleToHandleIndex (Handle); - ShellPrintHiiEx ( - -1, - -1, - NULL, - STRING_TOKEN (STR_DRVCFG_DONE_HII), - gShellDriver1HiiHandle, - HandleIndex - ); - } - } - } - } - } + ShellStatus = ParseBufferConfig (Handle, MainBuffer, MainBufferSize, HiiDatabase); } Done: From 7ae7bd8ef238c91a9fa213c1fb5b570fd9ad5a0b Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 17 Sep 2025 17:18:49 +0200 Subject: [PATCH 0611/1172] ShellPkg/DrvCfg: Simplify error handling in ParseBufferConfig() In an effort to simplify the code in the ShellPkg, simplify error handling cases in ParseBufferConfig(). No functional change is introduced. Signed-off-by: Pierre Gondois --- .../UefiShellDriver1CommandsLib/DrvCfg.c | 100 +++++++++--------- 1 file changed, 51 insertions(+), 49 deletions(-) diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvCfg.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvCfg.c index ab5493b05479..f50a2c468726 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvCfg.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvCfg.c @@ -330,65 +330,67 @@ ParseBufferConfig ( ; PackageHeader != NULL && ((CHAR8 *)PackageHeader) < (((CHAR8 *)MainBuffer)+MainBufferSize) && PackageHeader->Type != EFI_HII_PACKAGE_END ; PackageHeader = (EFI_HII_PACKAGE_HEADER *)(((CHAR8 *)(PackageHeader))+PackageHeader->Length)) { - if (PackageHeader->Type == EFI_HII_PACKAGE_DEVICE_PATH) { - HiiHandle = NULL; - Status = FindHiiHandleViaDevPath ((EFI_DEVICE_PATH_PROTOCOL *)(((CHAR8 *)PackageHeader) + sizeof (EFI_HII_PACKAGE_HEADER)), &HiiHandle, HiiDatabase); - if (EFI_ERROR (Status)) { - // - // print out an error. - // - TempDevPathString = ConvertDevicePathToText ((EFI_DEVICE_PATH_PROTOCOL *)(((CHAR8 *)PackageHeader) + sizeof (EFI_HII_PACKAGE_HEADER)), TRUE, TRUE); - if (TempDevPathString == NULL) { - ShellPrintHiiEx ( - -1, - -1, - NULL, - STRING_TOKEN (STR_GEN_OUT_MEM), - gShellDriver1HiiHandle, - L"drvcfg" - ); + if (PackageHeader->Type != EFI_HII_PACKAGE_DEVICE_PATH) { + continue; + } - return SHELL_OUT_OF_RESOURCES; - } + HiiHandle = NULL; + Status = FindHiiHandleViaDevPath ((EFI_DEVICE_PATH_PROTOCOL *)(((CHAR8 *)PackageHeader) + sizeof (EFI_HII_PACKAGE_HEADER)), &HiiHandle, HiiDatabase); + if (EFI_ERROR (Status)) { + // + // print out an error. + // + TempDevPathString = ConvertDevicePathToText ((EFI_DEVICE_PATH_PROTOCOL *)(((CHAR8 *)PackageHeader) + sizeof (EFI_HII_PACKAGE_HEADER)), TRUE, TRUE); + if (TempDevPathString == NULL) { + ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_GEN_OUT_MEM), + gShellDriver1HiiHandle, + L"drvcfg" + ); + return SHELL_OUT_OF_RESOURCES; + } + + ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_DRVCFG_IN_FILE_NF), + gShellDriver1HiiHandle, + TempDevPathString + ); + SHELL_FREE_NON_NULL (TempDevPathString); + } else { + Status = HiiDatabase->UpdatePackageList (HiiDatabase, HiiHandle, PackageListHeader); + if (EFI_ERROR (Status)) { ShellPrintHiiEx ( -1, -1, NULL, - STRING_TOKEN (STR_DRVCFG_IN_FILE_NF), + STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellDriver1HiiHandle, - TempDevPathString + L"drvcfg", + L"HiiDatabase->UpdatePackageList", + Status ); - SHELL_FREE_NON_NULL (TempDevPathString); - } else { - Status = HiiDatabase->UpdatePackageList (HiiDatabase, HiiHandle, PackageListHeader); - if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, - STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), - gShellDriver1HiiHandle, - L"drvcfg", - L"HiiDatabase->UpdatePackageList", - Status - ); - return SHELL_DEVICE_ERROR; - } else { - DevPath = (EFI_DEVICE_PATH_PROTOCOL *)(((CHAR8 *)PackageHeader) + sizeof (EFI_HII_PACKAGE_HEADER)); - gBS->LocateDevicePath (&gEfiHiiConfigAccessProtocolGuid, &DevPath, &Handle); - HandleIndex = ConvertHandleToHandleIndex (Handle); - ShellPrintHiiEx ( - -1, - -1, - NULL, - STRING_TOKEN (STR_DRVCFG_DONE_HII), - gShellDriver1HiiHandle, - HandleIndex - ); - } + return SHELL_DEVICE_ERROR; } + + DevPath = (EFI_DEVICE_PATH_PROTOCOL *)(((CHAR8 *)PackageHeader) + sizeof (EFI_HII_PACKAGE_HEADER)); + gBS->LocateDevicePath (&gEfiHiiConfigAccessProtocolGuid, &DevPath, &Handle); + HandleIndex = ConvertHandleToHandleIndex (Handle); + ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_DRVCFG_DONE_HII), + gShellDriver1HiiHandle, + HandleIndex + ); } } } From bcfbaf5f00840f9b48599a4694258876f5151ef7 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 17 Sep 2025 15:24:08 +0200 Subject: [PATCH 0612/1172] ShellPkg/Connect: Simplify error handling in ShellConnectFromDevPaths() In an effort to simplify the code in the ShellPkg, simplify error handling case in ShellConnectFromDevPaths(). No functional change is introduced. Signed-off-by: Pierre Gondois --- .../UefiShellDriver1CommandsLib/Connect.c | 99 ++++++++++--------- 1 file changed, 51 insertions(+), 48 deletions(-) diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c index 3bec32b70297..98922277a5f1 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c @@ -262,66 +262,69 @@ ShellConnectFromDevPaths ( // // connect short form device path // - if ((DevicePathType (Instance) == MESSAGING_DEVICE_PATH) && - ( (DevicePathSubType (Instance) == MSG_USB_CLASS_DP) - || (DevicePathSubType (Instance) == MSG_USB_WWID_DP) - )) + if (!((DevicePathType (Instance) == MESSAGING_DEVICE_PATH) && + ( (DevicePathSubType (Instance) == MSG_USB_CLASS_DP) + || (DevicePathSubType (Instance) == MSG_USB_WWID_DP) + ))) { - Status = ShellConnectPciRootBridge (); - if (EFI_ERROR (Status)) { - FreePool (Instance); - FreePool (DevPath); - return Status; + // + // connect the entire device path + // + Status = ShellConnectDevicePath (Instance); + if (!EFI_ERROR (Status)) { + AtLeastOneConnected = TRUE; } - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiPciIoProtocolGuid, - NULL, - &HandleArrayCount, - &HandleArray - ); + FreePool (Instance); + continue; + } - if (!EFI_ERROR (Status)) { - for (Index = 0; Index < HandleArrayCount; Index++) { - Status = gBS->HandleProtocol ( - HandleArray[Index], - &gEfiPciIoProtocolGuid, - (VOID **)&PciIo - ); + Status = ShellConnectPciRootBridge (); + if (EFI_ERROR (Status)) { + FreePool (Instance); + FreePool (DevPath); + return Status; + } + + Status = gBS->LocateHandleBuffer ( + ByProtocol, + &gEfiPciIoProtocolGuid, + NULL, + &HandleArrayCount, + &HandleArray + ); + if (!EFI_ERROR (Status)) { + for (Index = 0; Index < HandleArrayCount; Index++) { + Status = gBS->HandleProtocol ( + HandleArray[Index], + &gEfiPciIoProtocolGuid, + (VOID **)&PciIo + ); + + if (!EFI_ERROR (Status)) { + Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0x09, 3, &Class); if (!EFI_ERROR (Status)) { - Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0x09, 3, &Class); - if (!EFI_ERROR (Status)) { - if ((PCI_CLASS_SERIAL == Class[2]) && - (PCI_CLASS_SERIAL_USB == Class[1])) - { - Status = gBS->ConnectController ( - HandleArray[Index], - NULL, - Instance, - FALSE - ); - if (!EFI_ERROR (Status)) { - AtLeastOneConnected = TRUE; - } + if ((PCI_CLASS_SERIAL == Class[2]) && + (PCI_CLASS_SERIAL_USB == Class[1])) + { + Status = gBS->ConnectController ( + HandleArray[Index], + NULL, + Instance, + FALSE + ); + if (!EFI_ERROR (Status)) { + AtLeastOneConnected = TRUE; } } } } } + } - if (HandleArray != NULL) { - FreePool (HandleArray); - } - } else { - // - // connect the entire device path - // - Status = ShellConnectDevicePath (Instance); - if (!EFI_ERROR (Status)) { - AtLeastOneConnected = TRUE; - } + if (HandleArray != NULL) { + FreePool (HandleArray); } FreePool (Instance); From 53f83ae00db851c589dc006d3314813ab9237e65 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 17 Sep 2025 15:35:27 +0200 Subject: [PATCH 0613/1172] ShellPkg/Connect: Extract a ConnectConsoles() function In an effort to simplify the code in the ShellPkg, extract a ConnectConsoles() function to connect device consoles. No functional change is introduced. Signed-off-by: Pierre Gondois --- .../UefiShellDriver1CommandsLib/Connect.c | 107 +++++++++++++----- 1 file changed, 76 insertions(+), 31 deletions(-) diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c index 98922277a5f1..a085d32919f5 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c @@ -182,6 +182,73 @@ ConnectControllers ( return (Status2); } +/** + Iterate over the Handles that have a gEfiPciIoProtocol + and try to connect them to the input Instance of the console variable. + + @param[in] HandleArray Array of handles having a gEfiPciIoProtocol. + @param[in] HandleArrayCount Number of handles in HandleArray. + @param[in] Instance Instance of the console variable. + @param[in] AtLeastOneConnected asd + + @retval EFI_SUCCESS The operation was successful. +**/ +STATIC +EFI_STATUS +ConnectConsoles ( + EFI_HANDLE *HandleArray, + UINTN HandleArrayCount, + EFI_DEVICE_PATH_PROTOCOL *Instance, + BOOLEAN *AtLeastOneConnected + ) +{ + UINTN Index; + UINT8 Class[3]; + EFI_STATUS Status; + EFI_PCI_IO_PROTOCOL *PciIo; + + ASSERT (HandleArray != NULL); + ASSERT (HandleArrayCount != 0); + ASSERT (Instance != NULL); + ASSERT (AtLeastOneConnected != NULL); + + for (Index = 0; Index < HandleArrayCount; Index++) { + Status = gBS->HandleProtocol ( + HandleArray[Index], + &gEfiPciIoProtocolGuid, + (VOID **)&PciIo + ); + if (EFI_ERROR (Status)) { + continue; + } + + Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0x09, 3, &Class); + if (EFI_ERROR (Status)) { + continue; + } + + if ((PCI_CLASS_SERIAL != Class[2]) || + (PCI_CLASS_SERIAL_USB != Class[1])) + { + return EFI_NOT_FOUND; + } + + Status = gBS->ConnectController ( + HandleArray[Index], + NULL, + Instance, + FALSE + ); + if (EFI_ERROR (Status)) { + continue; + } + + *AtLeastOneConnected = TRUE; + } + + return EFI_SUCCESS; +} + /** Do a connect from an EFI variable via it's key name. @@ -199,14 +266,11 @@ ShellConnectFromDevPaths ( EFI_DEVICE_PATH_PROTOCOL *Instance; EFI_DEVICE_PATH_PROTOCOL *Next; UINTN Length; - UINTN Index; UINTN HandleArrayCount; UINTN Size; EFI_HANDLE *HandleArray; EFI_STATUS Status; BOOLEAN AtLeastOneConnected; - EFI_PCI_IO_PROTOCOL *PciIo; - UINT8 Class[3]; DevPath = NULL; Length = 0; @@ -293,36 +357,17 @@ ShellConnectFromDevPaths ( &HandleArrayCount, &HandleArray ); - - if (!EFI_ERROR (Status)) { - for (Index = 0; Index < HandleArrayCount; Index++) { - Status = gBS->HandleProtocol ( - HandleArray[Index], - &gEfiPciIoProtocolGuid, - (VOID **)&PciIo - ); - - if (!EFI_ERROR (Status)) { - Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0x09, 3, &Class); - if (!EFI_ERROR (Status)) { - if ((PCI_CLASS_SERIAL == Class[2]) && - (PCI_CLASS_SERIAL_USB == Class[1])) - { - Status = gBS->ConnectController ( - HandleArray[Index], - NULL, - Instance, - FALSE - ); - if (!EFI_ERROR (Status)) { - AtLeastOneConnected = TRUE; - } - } - } - } - } + if (EFI_ERROR (Status)) { + continue; } + Status = ConnectConsoles ( + HandleArray, + HandleArrayCount, + Instance, + &AtLeastOneConnected + ); + if (HandleArray != NULL) { FreePool (HandleArray); } From 9363f199007342f1419e8bd99a7077be3c5aa620 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Thu, 18 Sep 2025 08:45:49 +0200 Subject: [PATCH 0614/1172] ShellPkg/Connect: Extract a ConnectFromEfiVariable() function In an effort to simplify the code in the ShellPkg, extract a ConnectFromEfiVariable() function to connect devices pointed by a list of EFI variables. No functional change is introduced. Signed-off-by: Pierre Gondois --- .../UefiShellDriver1CommandsLib/Connect.c | 66 ++++++++++--------- 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c index a085d32919f5..6e9a6092871d 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c @@ -446,6 +446,40 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] = { { NULL, TypeMax } }; +/** EFI Variable names to connect. */ +STATIC CONST CHAR16 *EfiVariableNames[] = { + L"ConInDev", + L"ConOutDev", + L"ErrOutDev", + L"ErrOut", + L"ConIn", + L"ConOut", +}; + +/** Initiate connections for the EFI variables listed in EfiVariableNames. + */ +STATIC +EFI_STATUS +ConnectFromEfiVariable ( + VOID + ) +{ + UINTN Index; + EFI_STATUS Status; + EFI_STATUS RetStatus; + + RetStatus = EFI_SUCCESS; + + for (Index = 0; Index < ARRAY_SIZE (EfiVariableNames); Index++) { + Status = ShellConnectFromDevPaths (EfiVariableNames[Index]); + if (EFI_ERROR (Status)) { + RetStatus = Status; + } + } + + return RetStatus; +} + /** Function for 'connect' command. @@ -513,37 +547,7 @@ ShellCommandRunConnect ( // do the conin and conout from EFI variables // if the first fails dont 'loose' the error // - Status = ShellConnectFromDevPaths (L"ConInDev"); - if (EFI_ERROR (Status)) { - ShellConnectFromDevPaths (L"ConOutDev"); - } else { - Status = ShellConnectFromDevPaths (L"ConOutDev"); - } - - if (EFI_ERROR (Status)) { - ShellConnectFromDevPaths (L"ErrOutDev"); - } else { - Status = ShellConnectFromDevPaths (L"ErrOutDev"); - } - - if (EFI_ERROR (Status)) { - ShellConnectFromDevPaths (L"ErrOut"); - } else { - Status = ShellConnectFromDevPaths (L"ErrOut"); - } - - if (EFI_ERROR (Status)) { - ShellConnectFromDevPaths (L"ConIn"); - } else { - Status = ShellConnectFromDevPaths (L"ConIn"); - } - - if (EFI_ERROR (Status)) { - ShellConnectFromDevPaths (L"ConOut"); - } else { - Status = ShellConnectFromDevPaths (L"ConOut"); - } - + Status = ConnectFromEfiVariable (); if (EFI_ERROR (Status)) { ShellStatus = SHELL_DEVICE_ERROR; } From 44a3048c7c234be4503dbb916bbaddc6503eaa43 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 17 Sep 2025 15:36:35 +0200 Subject: [PATCH 0615/1172] ShellPkg/ShellLib.h: Add aliases for ShellPrintEx() and ShellPrintHiiEx() Most calls to ShellPrintEx() and ShellPrintHiiEx() are done using the default optional value for the: - location, through the column/row arguments - language Create aliases that automatically populate the col, row and language optional parameters with their default value. This helps to reduce: - the information to read/understand by users - the code size No functional change is introduced. Signed-off-by: Pierre Gondois --- ShellPkg/Include/Library/ShellLib.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ShellPkg/Include/Library/ShellLib.h b/ShellPkg/Include/Library/ShellLib.h index f41bc4851c57..43c3c89b90ae 100644 --- a/ShellPkg/Include/Library/ShellLib.h +++ b/ShellPkg/Include/Library/ShellLib.h @@ -968,6 +968,16 @@ ShellPrintHiiEx ( ... ); +/** Macro aliasing the ShellPrintEx() function and providing default parameters for + the Col and Row position. +**/ +#define ShellPrintDefaultEx(...) ShellPrintEx(-1, -1, __VA_ARGS__) + +/** Macro aliasing the ShellPrintHiiEx() function and providing default parameters for + the Col and Row position + Language. +**/ +#define ShellPrintHiiDefaultEx(...) ShellPrintHiiEx(-1, -1, NULL, __VA_ARGS__) + /** Function to determine if a given filename represents a directory. From 432feb6b56f652decb1e3287554635b6253f52a5 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Thu, 18 Sep 2025 14:12:04 +0200 Subject: [PATCH 0616/1172] NetworkPkg: Use the newly introduced ShellPrintHiiDefaultEx() alias Make use the newly introduced ShellPrintHiiDefaultEx() alias and replace wherever it is possible: - "ShellPrintHiiEx (-1, -1, NULL," with: - "ShellPrintHiiDefaultEx (" No functional change is introduced. Signed-off-by: Pierre Gondois --- NetworkPkg/Application/VConfig/VConfig.c | 45 +++++++++++------------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/NetworkPkg/Application/VConfig/VConfig.c b/NetworkPkg/Application/VConfig/VConfig.c index 2c323e377bec..25074629e8ff 100644 --- a/NetworkPkg/Application/VConfig/VConfig.c +++ b/NetworkPkg/Application/VConfig/VConfig.c @@ -83,7 +83,7 @@ LocateNicHandleBuffer ( HandleBuffer ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_LOCATE_FAIL), mHiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_LOCATE_FAIL), mHiiHandle, Status); } } @@ -148,7 +148,7 @@ NicNameToHandle ( Index = NicNameToIndex (Name); if (Index >= NumberOfHandles) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_INVALID_IF), mHiiHandle, Name); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_INVALID_IF), mHiiHandle, Name); Handle = NULL; } else { Handle = HandleBuffer[Index]; @@ -233,28 +233,25 @@ ShowNicVlanInfo ( MacStr = NULL; Status = NetLibGetMacString (Handle, mImageHandle, &MacStr); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_MAC_FAIL), mHiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_MAC_FAIL), mHiiHandle, Status); goto Exit; } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_ETH_MAC), mHiiHandle, NicIndex, MacStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_ETH_MAC), mHiiHandle, NicIndex, MacStr); Status = VlanConfig->Find (VlanConfig, NULL, &NumberOfVlan, &VlanData); if (EFI_ERROR (Status)) { if (Status == EFI_NOT_FOUND) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_NO_VLAN), mHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_NO_VLAN), mHiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_FIND_FAIL), mHiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_FIND_FAIL), mHiiHandle, Status); } goto Exit; } for (Index = 0; Index < NumberOfVlan; Index++) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_VCONFIG_VLAN_DISPLAY), mHiiHandle, VlanData[Index].VlanId, @@ -375,7 +372,7 @@ AddVlan ( Priority = 0; if (ParamStr == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_NO_IF), mHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_NO_IF), mHiiHandle); return; } @@ -435,13 +432,13 @@ AddVlan ( // Check VLAN ID. // if ((VlanIdStr == NULL) || (*VlanIdStr == 0)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_NO_VID), mHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_NO_VID), mHiiHandle); goto Exit; } VlanId = StrToVlanId (VlanIdStr); if (VlanId > 4094) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_INVALID_VID), mHiiHandle, VlanIdStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_INVALID_VID), mHiiHandle, VlanIdStr); goto Exit; } @@ -451,7 +448,7 @@ AddVlan ( if ((PriorityStr != NULL) && (*PriorityStr != 0)) { Priority = StrDecimalToUintn (PriorityStr); if (Priority > 7) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_INVALID_PRIORITY), mHiiHandle, PriorityStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_INVALID_PRIORITY), mHiiHandle, PriorityStr); goto Exit; } } @@ -461,7 +458,7 @@ AddVlan ( // Status = VlanConfig->Set (VlanConfig, (UINT16)VlanId, (UINT8)Priority); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_SET_FAIL), mHiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_SET_FAIL), mHiiHandle, Status); goto Exit; } @@ -473,7 +470,7 @@ AddVlan ( gBS->ConnectController (VlanHandle, NULL, NULL, TRUE); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_SET_SUCCESS), mHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_SET_SUCCESS), mHiiHandle); Exit: if (VlanConfig != NULL) { @@ -507,7 +504,7 @@ DeleteVlan ( VlanConfig = NULL; if (ParamStr == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_NO_IF), mHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_NO_IF), mHiiHandle); return; } @@ -542,13 +539,13 @@ DeleteVlan ( // Check VLAN ID // if ((VlanIdStr == NULL) || (*VlanIdStr == 0)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_NO_VID), mHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_NO_VID), mHiiHandle); goto Exit; } VlanId = StrToVlanId (VlanIdStr); if (VlanId > 4094) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_INVALID_VID), mHiiHandle, VlanIdStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_INVALID_VID), mHiiHandle, VlanIdStr); goto Exit; } @@ -558,9 +555,9 @@ DeleteVlan ( Status = VlanConfig->Remove (VlanConfig, (UINT16)VlanId); if (EFI_ERROR (Status)) { if (Status == EFI_NOT_FOUND) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_NOT_FOUND), mHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_NOT_FOUND), mHiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_REMOVE_FAIL), mHiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_REMOVE_FAIL), mHiiHandle, Status); } goto Exit; @@ -579,7 +576,7 @@ DeleteVlan ( FreePool (VlanData); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_REMOVE_SUCCESS), mHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_REMOVE_SUCCESS), mHiiHandle); Exit: if (VlanConfig != NULL) { @@ -648,7 +645,7 @@ VlanConfigMain ( List = NULL; ShellCommandLineParseEx (mParamList, &List, NULL, FALSE, FALSE); if (List == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_NO_ARG), mHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_NO_ARG), mHiiHandle); goto Exit; } @@ -673,7 +670,7 @@ VlanConfigMain ( // // No valid argument till now. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_NO_ARG), mHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VCONFIG_NO_ARG), mHiiHandle); Exit: if (List != NULL) { From c4a8b001f34c19cd411566cb4cd672eb1fac5478 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Thu, 18 Sep 2025 14:12:11 +0200 Subject: [PATCH 0617/1172] ShellPkg: Use the newly introduced ShellPrintHiiDefaultEx() alias Make use the newly introduced ShellPrintHiiDefaultEx() alias and replace wherever it is possible: - "ShellPrintHiiEx (-1, -1, NULL," with: - "ShellPrintHiiDefaultEx (" No functional change is introduced. Signed-off-by: Pierre Gondois --- ShellPkg/Application/Shell/Shell.c | 48 +- .../Shell/ShellParametersProtocol.c | 4 +- ShellPkg/Application/Shell/ShellProtocol.c | 10 +- ShellPkg/DynamicCommand/DpDynamicCommand/Dp.c | 54 +- .../DynamicCommand/DpDynamicCommand/DpTrace.c | 153 ++-- .../DynamicCommand/TftpDynamicCommand/Tftp.c | 100 +-- .../VariablePolicy.c | 117 ++- .../VariablePolicy.h | 4 +- .../UefiShellAcpiViewCommandLib.c | 45 +- .../UefiShellBcfgCommandLib.c | 180 ++-- .../Library/UefiShellDebug1CommandsLib/Comp.c | 34 +- .../Library/UefiShellDebug1CommandsLib/Dblk.c | 25 +- .../Library/UefiShellDebug1CommandsLib/Dmem.c | 57 +- .../UefiShellDebug1CommandsLib/DmpStore.c | 95 +-- .../UefiShellDebug1CommandsLib/Edit/Edit.c | 16 +- .../Edit/MainTextEditor.c | 10 +- .../UefiShellDebug1CommandsLib/EditInputBar.c | 2 +- .../UefiShellDebug1CommandsLib/EfiCompress.c | 22 +- .../EfiDecompress.c | 26 +- .../HexEdit/HexEdit.c | 36 +- .../HexEdit/MainHexEditor.c | 16 +- .../UefiShellDebug1CommandsLib/LoadPciRom.c | 28 +- .../UefiShellDebug1CommandsLib/MemMap.c | 42 +- .../Library/UefiShellDebug1CommandsLib/Mm.c | 46 +- .../Library/UefiShellDebug1CommandsLib/Mode.c | 22 +- .../Library/UefiShellDebug1CommandsLib/Pci.c | 793 +++++------------ .../UefiShellDebug1CommandsLib/SerMode.c | 39 +- .../UefiShellDebug1CommandsLib/SetSize.c | 18 +- .../UefiShellDebug1CommandsLib/SetVar.c | 28 +- .../SmbiosView/EventLogInfo.c | 113 ++- .../SmbiosView/LibSmbiosView.c | 8 +- .../SmbiosView/PrintInfo.c | 807 +++++++++--------- .../SmbiosView/QueryTable.c | 153 ++-- .../SmbiosView/SmbiosView.c | 102 ++- .../UefiShellDriver1CommandsLib/Connect.c | 20 +- .../UefiShellDriver1CommandsLib/DevTree.c | 10 +- .../UefiShellDriver1CommandsLib/Devices.c | 8 +- .../Library/UefiShellDriver1CommandsLib/Dh.c | 152 +--- .../UefiShellDriver1CommandsLib/Disconnect.c | 22 +- .../UefiShellDriver1CommandsLib/Drivers.c | 12 +- .../UefiShellDriver1CommandsLib/DrvCfg.c | 291 ++----- .../UefiShellDriver1CommandsLib/DrvDiag.c | 28 +- .../UefiShellDriver1CommandsLib/OpenInfo.c | 24 +- .../UefiShellDriver1CommandsLib/Reconnect.c | 2 +- .../UefiShellDriver1CommandsLib/Unload.c | 12 +- .../Library/UefiShellLevel1CommandsLib/Exit.c | 4 +- .../Library/UefiShellLevel1CommandsLib/For.c | 73 +- .../Library/UefiShellLevel1CommandsLib/Goto.c | 15 +- .../Library/UefiShellLevel1CommandsLib/If.c | 100 +-- .../UefiShellLevel1CommandsLib/Shift.c | 4 +- .../UefiShellLevel1CommandsLib/Stall.c | 10 +- .../UefiShellLevel2CommandsLib/Attrib.c | 23 +- .../Library/UefiShellLevel2CommandsLib/Cd.c | 14 +- .../Library/UefiShellLevel2CommandsLib/Cp.c | 54 +- .../Library/UefiShellLevel2CommandsLib/Load.c | 14 +- .../Library/UefiShellLevel2CommandsLib/Ls.c | 48 +- .../Library/UefiShellLevel2CommandsLib/Map.c | 53 +- .../UefiShellLevel2CommandsLib/MkDir.c | 8 +- .../Library/UefiShellLevel2CommandsLib/Mv.c | 30 +- .../UefiShellLevel2CommandsLib/Parse.c | 12 +- .../UefiShellLevel2CommandsLib/Reset.c | 8 +- .../Library/UefiShellLevel2CommandsLib/Rm.c | 20 +- .../Library/UefiShellLevel2CommandsLib/Set.c | 18 +- .../UefiShellLevel2CommandsLib/TimeDate.c | 102 +-- .../Library/UefiShellLevel2CommandsLib/Vol.c | 24 +- .../UefiShellLevel3CommandsLib/Alias.c | 22 +- .../Library/UefiShellLevel3CommandsLib/Cls.c | 17 +- .../Library/UefiShellLevel3CommandsLib/Echo.c | 6 +- .../UefiShellLevel3CommandsLib/GetMtc.c | 6 +- .../Library/UefiShellLevel3CommandsLib/Help.c | 30 +- .../UefiShellLevel3CommandsLib/Pause.c | 6 +- .../UefiShellLevel3CommandsLib/Touch.c | 18 +- .../Library/UefiShellLevel3CommandsLib/Type.c | 16 +- .../Library/UefiShellLevel3CommandsLib/Ver.c | 16 +- .../UefiShellNetwork1CommandsLib/Ifconfig.c | 143 ++-- .../UefiShellNetwork1CommandsLib/Ping.c | 59 +- .../UefiShellNetwork2CommandsLib/Ifconfig6.c | 120 +-- .../UefiShellNetwork2CommandsLib/Ping6.c | 51 +- 78 files changed, 1949 insertions(+), 3029 deletions(-) diff --git a/ShellPkg/Application/Shell/Shell.c b/ShellPkg/Application/Shell/Shell.c index 206fd7f0f2e3..74573faba20c 100644 --- a/ShellPkg/Application/Shell/Shell.c +++ b/ShellPkg/Application/Shell/Shell.c @@ -278,10 +278,7 @@ InternalEfiShellStartCtrlSMonitor ( EFI_OPEN_PROTOCOL_GET_PROTOCOL ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SHELL_NO_IN_EX), ShellInfoObject.HiiHandle ); @@ -526,19 +523,13 @@ UefiMain ( gEfiShellProtocol->MinorVersion ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_VER_OUTPUT_MAIN_SUPPLIER), ShellInfoObject.HiiHandle, (CHAR16 *)PcdGetPtr (PcdShellSupplier) ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_VER_OUTPUT_MAIN_UEFI), ShellInfoObject.HiiHandle, (gST->Hdr.Revision&0xffff0000)>>16, @@ -1092,10 +1083,7 @@ ProcessCommandLine ( ShellInfoObject.ShellInitSettings.BitUnion.Bits.Exit = TRUE; } else if (StrnCmp (L"-", CurrentArg, 1) == 0) { // Unrecognized option - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PROBLEM), ShellInfoObject.HiiHandle, CurrentArg @@ -1357,7 +1345,7 @@ DoStartupScript ( } } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SHELL_CRLF), ShellInfoObject.HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SHELL_CRLF), ShellInfoObject.HiiHandle); gST->ConOut->EnableCursor (gST->ConOut, TRUE); // @@ -1430,9 +1418,9 @@ DoShellPrompt ( gST->ConOut->SetCursorPosition (gST->ConOut, 0, gST->ConOut->Mode->CursorRow); if ((CurDir != NULL) && (StrLen (CurDir) > 1)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SHELL_CURDIR), ShellInfoObject.HiiHandle, CurDir); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SHELL_CURDIR), ShellInfoObject.HiiHandle, CurDir); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SHELL_SHELL), ShellInfoObject.HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SHELL_SHELL), ShellInfoObject.HiiHandle); } // @@ -2167,7 +2155,7 @@ IsValidSplit ( TempWalker = (CHAR16 *)Temp; if (!EFI_ERROR (GetNextParameter (&TempWalker, &FirstParameter, StrSize (CmdLine), TRUE))) { if (GetOperationType (FirstParameter) == Unknown_Invalid) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SHELL_NOT_FOUND), ShellInfoObject.HiiHandle, FirstParameter); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SHELL_NOT_FOUND), ShellInfoObject.HiiHandle, FirstParameter); SetLastError (SHELL_NOT_FOUND); Status = EFI_NOT_FOUND; } @@ -2262,7 +2250,7 @@ ProcessNewSplitCommandLine ( } if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SHELL_INVALID_SPLIT), ShellInfoObject.HiiHandle, CmdLine); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SHELL_INVALID_SPLIT), ShellInfoObject.HiiHandle, CmdLine); } return (Status); @@ -2298,7 +2286,7 @@ ChangeMappedDrive ( // Report any errors // if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SHELL_INVALID_MAPPING), ShellInfoObject.HiiHandle, CmdLine); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SHELL_INVALID_MAPPING), ShellInfoObject.HiiHandle, CmdLine); } return (Status); @@ -2610,7 +2598,7 @@ RunCommandOrFile ( // This should be impossible now. // ASSERT (CommandWithPath != NULL); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SHELL_NOT_FOUND), ShellInfoObject.HiiHandle, FirstParameter); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SHELL_NOT_FOUND), ShellInfoObject.HiiHandle, FirstParameter); SetLastError (SHELL_NOT_FOUND); return EFI_NOT_FOUND; } @@ -2619,7 +2607,7 @@ RunCommandOrFile ( // Make sure that path is not just a directory (or not found) // if (!EFI_ERROR (ShellIsDirectory (CommandWithPath))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SHELL_NOT_FOUND), ShellInfoObject.HiiHandle, FirstParameter); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SHELL_NOT_FOUND), ShellInfoObject.HiiHandle, FirstParameter); SetLastError (SHELL_NOT_FOUND); } @@ -2741,9 +2729,9 @@ SetupAndRunCommandOrFile ( if (EFI_ERROR (Status)) { ConstScriptFile = ShellCommandGetCurrentScriptFile (); if ((ConstScriptFile == NULL) || (ConstScriptFile->CurrentCommand == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SHELL_ERROR), ShellInfoObject.HiiHandle, (VOID *)(Status)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SHELL_ERROR), ShellInfoObject.HiiHandle, (VOID *)(Status)); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SHELL_ERROR_SCRIPT), ShellInfoObject.HiiHandle, (VOID *)(Status), ConstScriptFile->CurrentCommand->Line); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SHELL_ERROR_SCRIPT), ShellInfoObject.HiiHandle, (VOID *)(Status), ConstScriptFile->CurrentCommand->Line); } } @@ -2863,12 +2851,12 @@ RunShellCommand ( // // Whatever was typed, it was invalid. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SHELL_NOT_FOUND), ShellInfoObject.HiiHandle, FirstParameter); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SHELL_NOT_FOUND), ShellInfoObject.HiiHandle, FirstParameter); SetLastError (SHELL_NOT_FOUND); break; } } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SHELL_NOT_FOUND), ShellInfoObject.HiiHandle, FirstParameter); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SHELL_NOT_FOUND), ShellInfoObject.HiiHandle, FirstParameter); SetLastError (SHELL_NOT_FOUND); } @@ -3175,9 +3163,9 @@ RunScriptFileHandle ( if (ShellCommandGetEchoState ()) { CurDir = ShellInfoObject.NewEfiShellProtocol->GetEnv (L"cwd"); if ((CurDir != NULL) && (StrLen (CurDir) > 1)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SHELL_CURDIR), ShellInfoObject.HiiHandle, CurDir); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SHELL_CURDIR), ShellInfoObject.HiiHandle, CurDir); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SHELL_SHELL), ShellInfoObject.HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SHELL_SHELL), ShellInfoObject.HiiHandle); } ShellPrintEx (-1, -1, L"%s\r\n", CommandLine2); diff --git a/ShellPkg/Application/Shell/ShellParametersProtocol.c b/ShellPkg/Application/Shell/ShellParametersProtocol.c index 1784898169ba..ece7a33f935d 100644 --- a/ShellPkg/Application/Shell/ShellParametersProtocol.c +++ b/ShellPkg/Application/Shell/ShellParametersProtocol.c @@ -1346,9 +1346,9 @@ UpdateStdInStdOutStdErr ( } if (Status == EFI_NOT_FOUND) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SHELL_REDUNDA_REDIR), ShellInfoObject.HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SHELL_REDUNDA_REDIR), ShellInfoObject.HiiHandle); } else if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SHELL_INVALID_REDIR), ShellInfoObject.HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SHELL_INVALID_REDIR), ShellInfoObject.HiiHandle); } return (Status); diff --git a/ShellPkg/Application/Shell/ShellProtocol.c b/ShellPkg/Application/Shell/ShellProtocol.c index 646294d4e6a1..58c4a0361317 100644 --- a/ShellPkg/Application/Shell/ShellProtocol.c +++ b/ShellPkg/Application/Shell/ShellProtocol.c @@ -1555,10 +1555,7 @@ InternalShellExecuteDevicePath ( // If the image is not an app abort it. // if (LoadedImage->ImageCodeType != EfiLoaderCode) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SHELL_IMAGE_NOT_APP), ShellInfoObject.HiiHandle ); @@ -4039,10 +4036,7 @@ InernalEfiShellStartMonitor ( EFI_OPEN_PROTOCOL_GET_PROTOCOL ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SHELL_NO_IN_EX), ShellInfoObject.HiiHandle ); diff --git a/ShellPkg/DynamicCommand/DpDynamicCommand/Dp.c b/ShellPkg/DynamicCommand/DpDynamicCommand/Dp.c index 98c84d2ef938..3ebb63761319 100644 --- a/ShellPkg/DynamicCommand/DpDynamicCommand/Dp.c +++ b/ShellPkg/DynamicCommand/DpDynamicCommand/Dp.c @@ -103,20 +103,17 @@ DumpStatistics ( StringPtr = HiiGetString (mDpHiiHandle, STRING_TOKEN (STR_DP_SECTION_STATISTICS), NULL); StringPtrUnknown = HiiGetString (mDpHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_SECTION_HEADER), mDpHiiHandle, (StringPtr == NULL) ? StringPtrUnknown : StringPtr ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_STATS_NUMTRACE), mDpHiiHandle, SummaryData.NumTrace); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_STATS_NUMINCOMPLETE), mDpHiiHandle, SummaryData.NumIncomplete); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_STATS_NUMPHASES), mDpHiiHandle, SummaryData.NumSummary); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_STATS_NUMHANDLES), mDpHiiHandle, SummaryData.NumHandles, SummaryData.NumTrace - SummaryData.NumHandles); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_STATS_NUMPEIMS), mDpHiiHandle, SummaryData.NumPEIMs); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_STATS_NUMGLOBALS), mDpHiiHandle, SummaryData.NumGlobal); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_STATS_NUMTRACE), mDpHiiHandle, SummaryData.NumTrace); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_STATS_NUMINCOMPLETE), mDpHiiHandle, SummaryData.NumIncomplete); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_STATS_NUMPHASES), mDpHiiHandle, SummaryData.NumSummary); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_STATS_NUMHANDLES), mDpHiiHandle, SummaryData.NumHandles, SummaryData.NumTrace - SummaryData.NumHandles); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_STATS_NUMPEIMS), mDpHiiHandle, SummaryData.NumPEIMs); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_STATS_NUMGLOBALS), mDpHiiHandle, SummaryData.NumGlobal); SHELL_FREE_NON_NULL (StringPtr); SHELL_FREE_NON_NULL (StringPtrUnknown); } @@ -138,7 +135,7 @@ GetBootPerformanceTable ( if (FirmwarePerformanceTable == NULL) { Status = EfiGetSystemConfigurationTable (&gEdkiiFpdtExtendedFirmwarePerformanceGuid, (VOID **)&mBootPerformanceTable); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_GET_ACPI_FPDT_FAIL), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_GET_ACPI_FPDT_FAIL), mDpHiiHandle); return EFI_NOT_FOUND; } } else { @@ -204,7 +201,7 @@ BuildCachedGuidHandleTable ( Status = gBS->LocateHandleBuffer (AllHandles, NULL, NULL, &HandleCount, &HandleBuffer); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_HANDLES_ERROR), mDpHiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_HANDLES_ERROR), mDpHiiHandle, Status); return Status; } @@ -714,10 +711,10 @@ RunDp ( // Status = ShellCommandLineParse (ParamList, &ParamPackage, NULL, TRUE); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_INVALID_ARG), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_INVALID_ARG), mDpHiiHandle); return SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetCount (ParamPackage) > 1) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_TOO_MANY), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_TOO_MANY), mDpHiiHandle); return SHELL_INVALID_PARAMETER; } @@ -733,7 +730,7 @@ RunDp ( CumulativeMode = ShellCommandLineGetFlag (ParamPackage, L"-c"); if (AllMode && RawMode) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_CONFLICT_ARG), mDpHiiHandle, L"-A", L"-R"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_CONFLICT_ARG), mDpHiiHandle, L"-A", L"-R"); return SHELL_INVALID_PARAMETER; } @@ -741,22 +738,22 @@ RunDp ( if (ShellCommandLineGetFlag (ParamPackage, L"-n")) { CmdLineArg = ShellCommandLineGetValue (ParamPackage, L"-n"); if (CmdLineArg == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_TOO_FEW), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_TOO_FEW), mDpHiiHandle); return SHELL_INVALID_PARAMETER; } else { if (!(RawMode || AllMode)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_NO_RAW_ALL), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_NO_RAW_ALL), mDpHiiHandle); return SHELL_INVALID_PARAMETER; } Status = ShellConvertStringToUint64 (CmdLineArg, &Intermediate, FALSE, TRUE); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_INVALID_NUM_ARG), mDpHiiHandle, L"-n"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_INVALID_NUM_ARG), mDpHiiHandle, L"-n"); return SHELL_INVALID_PARAMETER; } else { Number2Display = (UINTN)Intermediate; if ((Number2Display == 0) || (Number2Display > MAXIMUM_DISPLAYCOUNT)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_INVALID_RANGE), mDpHiiHandle, L"-n", 0, MAXIMUM_DISPLAYCOUNT); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_INVALID_RANGE), mDpHiiHandle, L"-n", 0, MAXIMUM_DISPLAYCOUNT); return SHELL_INVALID_PARAMETER; } } @@ -768,12 +765,12 @@ RunDp ( if (ShellCommandLineGetFlag (ParamPackage, L"-t")) { CmdLineArg = ShellCommandLineGetValue (ParamPackage, L"-t"); if (CmdLineArg == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_TOO_FEW), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_TOO_FEW), mDpHiiHandle); return SHELL_INVALID_PARAMETER; } else { Status = ShellConvertStringToUint64 (CmdLineArg, &Intermediate, FALSE, TRUE); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_INVALID_NUM_ARG), mDpHiiHandle, L"-t"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_INVALID_NUM_ARG), mDpHiiHandle, L"-t"); return SHELL_INVALID_PARAMETER; } else { mInterestThreshold = Intermediate; @@ -786,7 +783,7 @@ RunDp ( if (ShellCommandLineGetFlag (ParamPackage, L"-c")) { CustomCumulativeToken = ShellCommandLineGetValue (ParamPackage, L"-c"); if (CustomCumulativeToken == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_TOO_FEW), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_TOO_FEW), mDpHiiHandle); return SHELL_INVALID_PARAMETER; } else { CustomCumulativeData = AllocateZeroPool (sizeof (PERF_CUM_DATA)); @@ -862,7 +859,7 @@ RunDp ( // Status = EfiGetSystemConfigurationTable (&gPerformanceProtocolGuid, (VOID **)&PerformanceProperty); if (EFI_ERROR (Status) || (PerformanceProperty == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PERF_PROPERTY_NOT_FOUND), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PERF_PROPERTY_NOT_FOUND), mDpHiiHandle); goto Done; } @@ -875,10 +872,10 @@ RunDp ( // Print header // // print DP's build version - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_BUILD_REVISION), mDpHiiHandle, DP_MAJOR_VERSION, DP_MINOR_VERSION); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_BUILD_REVISION), mDpHiiHandle, DP_MAJOR_VERSION, DP_MINOR_VERSION); // print performance timer characteristics - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_KHZ), mDpHiiHandle, TimerInfo.Frequency); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_KHZ), mDpHiiHandle, TimerInfo.Frequency); if (VerboseMode && !RawMode) { StringPtr = HiiGetString ( @@ -888,17 +885,14 @@ RunDp ( ); ASSERT (StringPtr != NULL); // Print Timer count range and direction - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_TIMER_PROPERTIES), mDpHiiHandle, StringPtr, TimerInfo.StartCount, TimerInfo.EndCount ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_VERBOSE_THRESHOLD), mDpHiiHandle, mInterestThreshold); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_VERBOSE_THRESHOLD), mDpHiiHandle, mInterestThreshold); } /**************************************************************************** diff --git a/ShellPkg/DynamicCommand/DpDynamicCommand/DpTrace.c b/ShellPkg/DynamicCommand/DpDynamicCommand/DpTrace.c index 9c0a9a06a1c9..1d5bc84580b0 100644 --- a/ShellPkg/DynamicCommand/DpDynamicCommand/DpTrace.c +++ b/ShellPkg/DynamicCommand/DpDynamicCommand/DpTrace.c @@ -206,10 +206,7 @@ DumpAllTrace ( StringPtrUnknown = HiiGetString (mDpHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL); IncFlag = HiiGetString (mDpHiiHandle, STRING_TOKEN (STR_DP_SECTION_ALL), NULL); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_SECTION_HEADER), mDpHiiHandle, (IncFlag == NULL) ? StringPtrUnknown : IncFlag @@ -220,7 +217,7 @@ DumpAllTrace ( // Status = gBS->LocateHandleBuffer (AllHandles, NULL, NULL, &HandleCount, &HandleBuffer); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_HANDLES_ERROR), mDpHiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_HANDLES_ERROR), mDpHiiHandle, Status); } else { // We have successfully populated the HandleBuffer // Display ALL Measurement Records @@ -229,11 +226,11 @@ DumpAllTrace ( // Display driver names in Module field for records with Handles. // if (mShowId) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_ALL_HEADR2), mDpHiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_ALL_DASHES2), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_ALL_HEADR2), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_ALL_DASHES2), mDpHiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_ALL_HEADR), mDpHiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_DASHES), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_ALL_HEADR), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_DASHES), mDpHiiHandle); } LogEntryKey = 0; @@ -293,10 +290,7 @@ DumpAllTrace ( mUnicodeToken[13] = 0; if (mShowId) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_ALL_VARS2), mDpHiiHandle, Index, // 1 based, Which measurement record is being printed @@ -308,10 +302,7 @@ DumpAllTrace ( Measurement.Identifier ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_ALL_VARS), mDpHiiHandle, Index, // 1 based, Which measurement record is being printed @@ -380,10 +371,7 @@ DumpRawTrace ( StringPtrUnknown = HiiGetString (mDpHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL); StringPtr = HiiGetString (mDpHiiHandle, STRING_TOKEN (STR_DP_SECTION_RAWTRACE), NULL); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_SECTION_HEADER), mDpHiiHandle, (StringPtr == NULL) ? StringPtrUnknown : StringPtr @@ -392,11 +380,11 @@ DumpRawTrace ( FreePool (StringPtrUnknown); if (mShowId) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_RAW_HEADR2), mDpHiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_RAW_DASHES2), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_RAW_HEADR2), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_RAW_DASHES2), mDpHiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_RAW_HEADR), mDpHiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_RAW_DASHES), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_RAW_HEADR), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_RAW_DASHES), mDpHiiHandle); } LogEntryKey = 0; @@ -431,10 +419,7 @@ DumpRawTrace ( ++Count; // Count the number of records printed if (mShowId) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_RAW_VARS2), mDpHiiHandle, Index, // 1 based, Which measurement record is being printed @@ -446,10 +431,7 @@ DumpRawTrace ( Measurement.Identifier ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_RAW_VARS), mDpHiiHandle, Index, // 1 based, Which measurement record is being printed @@ -502,10 +484,7 @@ ProcessPhases ( // StringPtrUnknown = HiiGetString (mDpHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL); StringPtr = HiiGetString (mDpHiiHandle, STRING_TOKEN (STR_DP_SECTION_PHASES), NULL); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_SECTION_HEADER), mDpHiiHandle, (StringPtr == NULL) ? StringPtrUnknown : StringPtr @@ -554,7 +533,7 @@ ProcessPhases ( SecTime = SecTime - mResetEnd; // Calculate sec time duration start from the beginning of firmware image execution ElapsedTime = DurationInMicroSeconds (mResetEnd); // Calculate elapsed time in microseconds Total += DivU64x32 (ElapsedTime, 1000); // Accumulate time in milliseconds - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_RESET_END), mDpHiiHandle, ElapsedTime); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_RESET_END), mDpHiiHandle, ElapsedTime); } // print SEC phase duration time @@ -562,7 +541,7 @@ ProcessPhases ( if (SecTime > 0) { ElapsedTime = DurationInMicroSeconds (SecTime); // Calculate elapsed time in microseconds Total += DivU64x32 (ElapsedTime, 1000); // Accumulate time in milliseconds - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_SEC_PHASE), mDpHiiHandle, ElapsedTime); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_SEC_PHASE), mDpHiiHandle, ElapsedTime); } // print PEI phase duration time @@ -570,7 +549,7 @@ ProcessPhases ( if (PeiTime > 0) { ElapsedTime = DivU64x32 (PeiTime, 1000000); Total += ElapsedTime; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_PHASE_DURATION), mDpHiiHandle, ALit_PEI, ElapsedTime); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_PHASE_DURATION), mDpHiiHandle, ALit_PEI, ElapsedTime); } // print DXE phase duration time @@ -578,7 +557,7 @@ ProcessPhases ( if (DxeTime > 0) { ElapsedTime = DivU64x32 (DxeTime, 1000000); Total += ElapsedTime; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_PHASE_DURATION), mDpHiiHandle, ALit_DXE, ElapsedTime); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_PHASE_DURATION), mDpHiiHandle, ALit_DXE, ElapsedTime); } // print BDS phase duration time @@ -586,15 +565,15 @@ ProcessPhases ( if (BdsTime > 0) { ElapsedTime = DivU64x32 (BdsTime, 1000000); Total += ElapsedTime; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_PHASE_DURATION), mDpHiiHandle, ALit_BDS, ElapsedTime); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_PHASE_DURATION), mDpHiiHandle, ALit_BDS, ElapsedTime); } if (BdsTimeoutValue > 0) { ElapsedTime = DivU64x32 (BdsTimeoutValue, 1000000); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_PHASE_BDSTO), mDpHiiHandle, ALit_BdsTO, ElapsedTime); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_PHASE_BDSTO), mDpHiiHandle, ALit_BdsTO, ElapsedTime); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_TOTAL_DURATION), mDpHiiHandle, Total); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_TOTAL_DURATION), mDpHiiHandle, Total); } /** @@ -625,10 +604,7 @@ ProcessHandles ( StringPtrUnknown = HiiGetString (mDpHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL); StringPtr = HiiGetString (mDpHiiHandle, STRING_TOKEN (STR_DP_SECTION_DRIVERS), NULL); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_SECTION_HEADER), mDpHiiHandle, (StringPtr == NULL) ? StringPtrUnknown : StringPtr @@ -638,19 +614,19 @@ ProcessHandles ( Status = gBS->LocateHandleBuffer (AllHandles, NULL, NULL, &HandleCount, &HandleBuffer); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_HANDLES_ERROR), mDpHiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_HANDLES_ERROR), mDpHiiHandle, Status); } else { #if DP_DEBUG == 2 Print (L"There are %,d Handles defined.\n", (Size / sizeof (HandleBuffer[0]))); #endif if (mShowId) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_HANDLE_SECTION2), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_HANDLE_SECTION2), mDpHiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_HANDLE_SECTION), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_HANDLE_SECTION), mDpHiiHandle); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_DASHES), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_DASHES), mDpHiiHandle); LogEntryKey = 0; Count = 0; @@ -692,10 +668,7 @@ ProcessHandles ( if (mGaugeString[0] != 0) { // Display the record if it has a valid handle. if (mShowId) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_HANDLE_VARS2), mDpHiiHandle, Count, // 1 based, Which measurement record is being printed @@ -706,10 +679,7 @@ ProcessHandles ( Measurement.Identifier ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_HANDLE_VARS), mDpHiiHandle, Count, // 1 based, Which measurement record is being printed @@ -761,10 +731,7 @@ ProcessPeims ( StringPtrUnknown = HiiGetString (mDpHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL); StringPtr = HiiGetString (mDpHiiHandle, STRING_TOKEN (STR_DP_SECTION_PEIMS), NULL); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_SECTION_HEADER), mDpHiiHandle, (StringPtr == NULL) ? StringPtrUnknown : StringPtr @@ -773,12 +740,12 @@ ProcessPeims ( FreePool (StringPtrUnknown); if (mShowId) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_PEIM_SECTION2), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_PEIM_SECTION2), mDpHiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_PEIM_SECTION), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_PEIM_SECTION), mDpHiiHandle); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_DASHES), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_DASHES), mDpHiiHandle); TIndex = 0; LogEntryKey = 0; while ((LogEntryKey = GetPerformanceMeasurementRecord ( @@ -804,10 +771,7 @@ ProcessPeims ( if (ElapsedTime >= mInterestThreshold) { // PEIM FILE Handle is the start address of its FFS file that contains its file guid. if (mShowId) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_PEIM_VARS2), mDpHiiHandle, TIndex, // 1 based, Which measurement record is being printed @@ -816,10 +780,7 @@ ProcessPeims ( Measurement.Identifier ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_PEIM_VARS), mDpHiiHandle, TIndex, // 1 based, Which measurement record is being printed @@ -867,10 +828,7 @@ ProcessGlobal ( StringPtrUnknown = HiiGetString (mDpHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL); StringPtr = HiiGetString (mDpHiiHandle, STRING_TOKEN (STR_DP_SECTION_GENERAL), NULL); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_SECTION_HEADER), mDpHiiHandle, (StringPtr == NULL) ? StringPtrUnknown : StringPtr @@ -879,12 +837,12 @@ ProcessGlobal ( FreePool (StringPtrUnknown); if (mShowId) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_GLOBAL_SECTION2), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_GLOBAL_SECTION2), mDpHiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_GLOBAL_SECTION), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_GLOBAL_SECTION), mDpHiiHandle); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_DASHES), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_DASHES), mDpHiiHandle); Index = 1; LogEntryKey = 0; @@ -912,10 +870,7 @@ ProcessGlobal ( ElapsedTime = DurationInMicroSeconds (Duration); if (ElapsedTime >= mInterestThreshold) { if (mShowId) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_GLOBAL_VARS2), mDpHiiHandle, Index, @@ -925,10 +880,7 @@ ProcessGlobal ( Measurement.Identifier ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_GLOBAL_VARS), mDpHiiHandle, Index, @@ -977,10 +929,7 @@ ProcessCumulative ( StringPtrUnknown = HiiGetString (mDpHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL); StringPtr = HiiGetString (mDpHiiHandle, STRING_TOKEN (STR_DP_SECTION_CUMULATIVE), NULL); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_SECTION_HEADER), mDpHiiHandle, (StringPtr == NULL) ? StringPtrUnknown : StringPtr @@ -988,9 +937,9 @@ ProcessCumulative ( FreePool (StringPtr); FreePool (StringPtrUnknown); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_CUMULATIVE_SECT_1), mDpHiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_CUMULATIVE_SECT_2), mDpHiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_DASHES), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_CUMULATIVE_SECT_1), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_CUMULATIVE_SECT_2), mDpHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DP_DASHES), mDpHiiHandle); for ( TIndex = 0; TIndex < NumCum; ++TIndex) { if (CumData[TIndex].Count != 0) { @@ -1000,10 +949,7 @@ ProcessCumulative ( MaxDur = DurationInMicroSeconds (CumData[TIndex].MaxDur); MinDur = DurationInMicroSeconds (CumData[TIndex].MinDur); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_CUMULATIVE_STATS), mDpHiiHandle, CumData[TIndex].Name, @@ -1033,10 +979,7 @@ ProcessCumulative ( MinDur = 0; } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DP_CUMULATIVE_STATS), mDpHiiHandle, CustomCumulativeData->Name, diff --git a/ShellPkg/DynamicCommand/TftpDynamicCommand/Tftp.c b/ShellPkg/DynamicCommand/TftpDynamicCommand/Tftp.c index a60d6be2d6e0..b4789e5ab302 100644 --- a/ShellPkg/DynamicCommand/TftpDynamicCommand/Tftp.c +++ b/ShellPkg/DynamicCommand/TftpDynamicCommand/Tftp.c @@ -329,10 +329,7 @@ RunTftp ( if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PROBLEM), mTftpHiiHandle, L"tftp", @@ -351,10 +348,7 @@ RunTftp ( // ParamCount = ShellCommandLineGetCount (CheckPackage); if (ParamCount > 4) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_TOO_MANY), mTftpHiiHandle, L"tftp" @@ -363,10 +357,7 @@ RunTftp ( } if (ParamCount < 3) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_TOO_FEW), mTftpHiiHandle, L"tftp" @@ -382,10 +373,7 @@ RunTftp ( ValueStr = ShellCommandLineGetRawValue (CheckPackage, 1); Status = NetLibStrToIp4 (ValueStr, &Mtftp4ConfigData.ServerIp); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PARAM_INV), mTftpHiiHandle, L"tftp", @@ -461,10 +449,7 @@ RunTftp ( } if (Mtftp4ConfigData.TimeoutValue == 0) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PARAM_INV), mTftpHiiHandle, L"tftp", @@ -481,10 +466,7 @@ RunTftp ( } if ((BlockSize < MTFTP_MIN_BLKSIZE) || (BlockSize > MTFTP_MAX_BLKSIZE)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PARAM_INV), mTftpHiiHandle, L"tftp", @@ -501,10 +483,7 @@ RunTftp ( } if ((WindowSize < MTFTP_MIN_WINDOWSIZE) || (WindowSize > MTFTP_MAX_WINDOWSIZE)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PARAM_INV), mTftpHiiHandle, L"tftp", @@ -526,10 +505,7 @@ RunTftp ( &Handles ); if (EFI_ERROR (Status) || (HandleCount == 0)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_TFTP_ERR_NO_NIC), mTftpHiiHandle ); @@ -544,10 +520,7 @@ RunTftp ( Status = GetNicName (ControllerHandle, NicNumber, NicName); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_TFTP_ERR_NIC_NAME), mTftpHiiHandle, NicNumber, @@ -572,10 +545,7 @@ RunTftp ( (VOID **)&Mtftp4 ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_TFTP_ERR_OPEN_PROTOCOL), mTftpHiiHandle, NicName, @@ -586,10 +556,7 @@ RunTftp ( Status = Mtftp4->Configure (Mtftp4, &Mtftp4ConfigData); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_TFTP_ERR_CONFIGURE), mTftpHiiHandle, NicName, @@ -600,10 +567,7 @@ RunTftp ( Status = GetFileSize (Mtftp4, AsciiRemoteFilePath, &FileSize); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_TFTP_ERR_FILE_SIZE), mTftpHiiHandle, RemoteFilePath, @@ -615,10 +579,7 @@ RunTftp ( Status = DownloadFile (Mtftp4, RemoteFilePath, AsciiRemoteFilePath, FileSize, BlockSize, WindowSize); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_TFTP_ERR_DOWNLOAD), mTftpHiiHandle, RemoteFilePath, @@ -641,10 +602,7 @@ RunTftp ( } if ((UserNicName != NULL) && (!NicFound)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_TFTP_ERR_NIC_NOT_FOUND), mTftpHiiHandle, UserNicName @@ -689,10 +647,7 @@ StringToUint16 ( Val = ShellStrToUintn (ValueStr); if (Val > MAX_UINT16) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PARAM_INV), mTftpHiiHandle, L"tftp", @@ -1029,10 +984,7 @@ DownloadFile ( Mtftp4Token.OptionCount++; } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_TFTP_DOWNLOADING), mTftpHiiHandle, FilePath @@ -1054,10 +1006,7 @@ DownloadFile ( 0 ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), mTftpHiiHandle, L"tftp", @@ -1067,10 +1016,7 @@ DownloadFile ( } Status = Mtftp4->ReadFile (Mtftp4, &Mtftp4Token); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_CRLF), mTftpHiiHandle ); @@ -1140,19 +1086,13 @@ CheckPacket ( Status = ShellWriteFile (mFileHandle, &DownloadLen, Packet->Data.Data); if (EFI_ERROR (Status)) { if (Context->DownloadedNbOfBytes > 0) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_CRLF), mTftpHiiHandle ); } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_TFTP_ERR_WRITE), mTftpHiiHandle, mLocalFilePath, diff --git a/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePolicy.c b/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePolicy.c index ed991be4ed00..02ef0fae9990 100644 --- a/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePolicy.c +++ b/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePolicy.c @@ -173,12 +173,12 @@ PrintStats ( IN UINTN TotalVariablesSize ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_STATS_HEADER_1), mVarPolicyShellCommandHiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_STATS_HEADER_2), mVarPolicyShellCommandHiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_STATS_HEADER_1), mVarPolicyShellCommandHiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_STATS_TOTAL_VARS), mVarPolicyShellCommandHiiHandle, TotalVariables); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_STATS_TOTAL_SIZE), mVarPolicyShellCommandHiiHandle, TotalVariablesSize, TotalVariablesSize); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_STATS_HEADER_1), mVarPolicyShellCommandHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_STATS_HEADER_1), mVarPolicyShellCommandHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_STATS_HEADER_2), mVarPolicyShellCommandHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_STATS_HEADER_1), mVarPolicyShellCommandHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_STATS_TOTAL_VARS), mVarPolicyShellCommandHiiHandle, TotalVariables); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_STATS_TOTAL_SIZE), mVarPolicyShellCommandHiiHandle, TotalVariablesSize, TotalVariablesSize); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_STATS_HEADER_1), mVarPolicyShellCommandHiiHandle); } /** @@ -259,9 +259,9 @@ PrintNonVerboseVarInfo ( DescriptionStr = CmdVarNamespace->Description; } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_VAR_TYPE), mVarPolicyShellCommandHiiHandle, DescriptionStr); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_VAR_NAME), mVarPolicyShellCommandHiiHandle, VariableName); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_VAR_SIZE), mVarPolicyShellCommandHiiHandle, VariableSize, VariableSize); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_VAR_TYPE), mVarPolicyShellCommandHiiHandle, DescriptionStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_VAR_NAME), mVarPolicyShellCommandHiiHandle, VariableName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_VAR_SIZE), mVarPolicyShellCommandHiiHandle, VariableSize, VariableSize); AttributesStr = AllocatePages (1); if (AttributesStr == NULL) { @@ -272,10 +272,7 @@ PrintNonVerboseVarInfo ( ZeroMem ((VOID *)AttributesStr, EFI_PAGES_TO_SIZE (1)); Status = GetAttributesString (VariableAttributes, EFI_PAGES_TO_SIZE (1), AttributesStr); if (Status == EFI_SUCCESS) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_VAR_POL_VAR_ATTR), mVarPolicyShellCommandHiiHandle, AttributesStr @@ -354,13 +351,13 @@ PrintVariablePolicyInfo ( if ((VariableName == NULL) || (VendorGuid == NULL)) { ASSERT ((VariableName != NULL) && (VendorGuid != NULL)); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_INT_ERR), mVarPolicyShellCommandHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_INT_ERR), mVarPolicyShellCommandHiiHandle); return FALSE; } Status = gBS->LocateProtocol (&gEdkiiVariablePolicyProtocolGuid, NULL, (VOID **)&VariablePolicy); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_NO_PROT), mVarPolicyShellCommandHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_NO_PROT), mVarPolicyShellCommandHiiHandle); return FALSE; } @@ -382,41 +379,41 @@ PrintVariablePolicyInfo ( VariablePolicyVariableName ); if (Status == EFI_NOT_READY) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_NOT_INIT), mVarPolicyShellCommandHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_NOT_INIT), mVarPolicyShellCommandHiiHandle); } else if (Status == EFI_NOT_FOUND) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_NOT_FOUND), mVarPolicyShellCommandHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_NOT_FOUND), mVarPolicyShellCommandHiiHandle); } else if (EFI_ERROR (Status)) { // A different error return code is not expected - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_UNEXP_ERR), mVarPolicyShellCommandHiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_UNEXP_ERR), mVarPolicyShellCommandHiiHandle, Status); } else { PolicyHeaderPresent = TRUE; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_HEADER_1), mVarPolicyShellCommandHiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_HEADER_2), mVarPolicyShellCommandHiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_HEADER_1), mVarPolicyShellCommandHiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_VERSION), mVarPolicyShellCommandHiiHandle, VariablePolicyEntry.Version); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_HEADER_1), mVarPolicyShellCommandHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_HEADER_2), mVarPolicyShellCommandHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_HEADER_1), mVarPolicyShellCommandHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_VERSION), mVarPolicyShellCommandHiiHandle, VariablePolicyEntry.Version); if ((ReturnedVariableNameSize > 0) && (VariablePolicyVariableName[0] != CHAR_NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_VARIABLE), mVarPolicyShellCommandHiiHandle, VariablePolicyVariableName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_VARIABLE), mVarPolicyShellCommandHiiHandle, VariablePolicyVariableName); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_VARIABLE), mVarPolicyShellCommandHiiHandle, L""); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_VARIABLE), mVarPolicyShellCommandHiiHandle, L""); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_NAMESPACE), mVarPolicyShellCommandHiiHandle, &VariablePolicyEntry.Namespace); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_MIN_SIZE), mVarPolicyShellCommandHiiHandle, VariablePolicyEntry.MinSize); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_MAX_SIZE), mVarPolicyShellCommandHiiHandle, VariablePolicyEntry.MaxSize); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_NAMESPACE), mVarPolicyShellCommandHiiHandle, &VariablePolicyEntry.Namespace); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_MIN_SIZE), mVarPolicyShellCommandHiiHandle, VariablePolicyEntry.MinSize); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_MAX_SIZE), mVarPolicyShellCommandHiiHandle, VariablePolicyEntry.MaxSize); switch (VariablePolicyEntry.LockPolicyType) { case VARIABLE_POLICY_TYPE_NO_LOCK: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_LOCK_TYPE), mVarPolicyShellCommandHiiHandle, L"No Lock"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_LOCK_TYPE), mVarPolicyShellCommandHiiHandle, L"No Lock"); break; case VARIABLE_POLICY_TYPE_LOCK_NOW: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_LOCK_TYPE), mVarPolicyShellCommandHiiHandle, L"Lock Now"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_LOCK_TYPE), mVarPolicyShellCommandHiiHandle, L"Lock Now"); break; case VARIABLE_POLICY_TYPE_LOCK_ON_CREATE: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_LOCK_TYPE), mVarPolicyShellCommandHiiHandle, L"On Create"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_LOCK_TYPE), mVarPolicyShellCommandHiiHandle, L"On Create"); break; case VARIABLE_POLICY_TYPE_LOCK_ON_VAR_STATE: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_LOCK_TYPE), mVarPolicyShellCommandHiiHandle, L"On Variable State"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_LOCK_TYPE), mVarPolicyShellCommandHiiHandle, L"On Variable State"); ZeroMem (VariablePolicyVariableName, VariablePolicyVariableNameBufferSize); ReturnedVariableNameSize = VariablePolicyVariableNameBufferSize; @@ -428,21 +425,21 @@ PrintVariablePolicyInfo ( VariablePolicyVariableName ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_UNEXP_ERR), mVarPolicyShellCommandHiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_UNEXP_ERR), mVarPolicyShellCommandHiiHandle, Status); goto Done; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_STATE_NS), mVarPolicyShellCommandHiiHandle, &LockOnVarStatePolicy.Namespace); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_STATE_VAL), mVarPolicyShellCommandHiiHandle, LockOnVarStatePolicy.Value); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_STATE_NS), mVarPolicyShellCommandHiiHandle, &LockOnVarStatePolicy.Namespace); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_STATE_VAL), mVarPolicyShellCommandHiiHandle, LockOnVarStatePolicy.Value); if ((ReturnedVariableNameSize > 0) && (VariablePolicyVariableName[0] != CHAR_NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_STATE_NAME), mVarPolicyShellCommandHiiHandle, VariablePolicyVariableName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_STATE_NAME), mVarPolicyShellCommandHiiHandle, VariablePolicyVariableName); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_STATE_NAME), mVarPolicyShellCommandHiiHandle, L""); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_STATE_NAME), mVarPolicyShellCommandHiiHandle, L""); } } break; default: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_LOCK_TYPE), mVarPolicyShellCommandHiiHandle, L"Unknown"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_LOCK_TYPE), mVarPolicyShellCommandHiiHandle, L"Unknown"); break; } @@ -456,17 +453,11 @@ PrintVariablePolicyInfo ( ZeroMem (VariableAttributesStr, EFI_PAGES_TO_SIZE (1)); Status = GetAttributesString (VariablePolicyEntry.AttributesMustHave, EFI_PAGES_TO_SIZE (1), VariableAttributesStr); if (Status == EFI_SUCCESS) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_VAR_POL_POLICY_ATTR_MUST), mVarPolicyShellCommandHiiHandle ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_VAR_POL_POLICY_ATTR_GEN), mVarPolicyShellCommandHiiHandle, VariableAttributesStr @@ -476,17 +467,11 @@ PrintVariablePolicyInfo ( ZeroMem (VariableAttributesStr, EFI_PAGES_TO_SIZE (1)); Status = GetAttributesString (VariablePolicyEntry.AttributesCantHave, EFI_PAGES_TO_SIZE (1), VariableAttributesStr); if (Status == EFI_SUCCESS) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_VAR_POL_POLICY_ATTR_NOT), mVarPolicyShellCommandHiiHandle ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_VAR_POL_POLICY_ATTR_GEN), mVarPolicyShellCommandHiiHandle, VariableAttributesStr @@ -496,7 +481,7 @@ PrintVariablePolicyInfo ( Done: if (PolicyHeaderPresent) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VAR_POL_POLICY_HEADER_1), mVarPolicyShellCommandHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VAR_POL_POLICY_HEADER_1), mVarPolicyShellCommandHiiHandle); } if (VariableAttributesStr != NULL) { @@ -507,7 +492,7 @@ PrintVariablePolicyInfo ( FreePages (VariablePolicyVariableName, 1); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_LINE_BREAK), mVarPolicyShellCommandHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_LINE_BREAK), mVarPolicyShellCommandHiiHandle); return Status == EFI_SUCCESS; } @@ -674,7 +659,7 @@ DumpVars ( if (!Stats || Verbose) { Status = PrintNonVerboseVarInfo (VariableName, &VariableGuid, DataSize, Attributes); if (!EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_LINE_BREAK), mVarPolicyShellCommandHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_LINE_BREAK), mVarPolicyShellCommandHiiHandle); } } @@ -721,7 +706,7 @@ DumpVars ( } while (!EFI_ERROR (GetNextVariableStatus)); if (TotalVariables == 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VARS), mVarPolicyShellCommandHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VARS), mVarPolicyShellCommandHiiHandle); } else { if (Verbose || Stats) { PrintStats (TotalVariables, TotalDataSize); @@ -730,22 +715,16 @@ DumpVars ( if (Verbose || PolicyCheck) { ASSERT (TotalVariablesWithPolicy <= TotalVariables); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_LINE_BREAK), mVarPolicyShellCommandHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_LINE_BREAK), mVarPolicyShellCommandHiiHandle); if (TotalVariablesWithPolicy == TotalVariables) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_VAR_POL_POLICY_STATS_PASS), mVarPolicyShellCommandHiiHandle, TotalVariablesWithPolicy, TotalVariables ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_VAR_POL_POLICY_STATS_FAIL), mVarPolicyShellCommandHiiHandle, TotalVariablesWithPolicy, @@ -753,7 +732,7 @@ DumpVars ( ); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_LINE_BREAK), mVarPolicyShellCommandHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_LINE_BREAK), mVarPolicyShellCommandHiiHandle); } } @@ -816,7 +795,7 @@ RunVarPolicy ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), mVarPolicyShellCommandHiiHandle, VAR_POLICY_COMMAND_NAME, ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), mVarPolicyShellCommandHiiHandle, VAR_POLICY_COMMAND_NAME, ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; @@ -825,7 +804,7 @@ RunVarPolicy ( } } else { if (ShellCommandLineGetCount (Package) > 1) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), mVarPolicyShellCommandHiiHandle, VAR_POLICY_COMMAND_NAME); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), mVarPolicyShellCommandHiiHandle, VAR_POLICY_COMMAND_NAME); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } diff --git a/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePolicy.h b/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePolicy.h index 049823242659..79784ba04ff3 100644 --- a/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePolicy.h +++ b/ShellPkg/DynamicCommand/VariablePolicyDynamicCommand/VariablePolicy.h @@ -87,12 +87,12 @@ typedef struct { _Val[_DumpHexIndex * 3] = 0; \ _Str[_DumpHexIndex] = 0; \ \ - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_HEX_DUMP_LINE), mVarPolicyShellCommandHiiHandle, _LocalOffset, _Val, _Str); \ + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_HEX_DUMP_LINE), mVarPolicyShellCommandHiiHandle, _LocalOffset, _Val, _Str); \ _DataToDump = (UINT8 *)(((UINTN)_DataToDump) + _Size); \ _LocalOffset += _Size; \ _LocalDataSize -= _Size; \ } \ - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_LINE_BREAK), mVarPolicyShellCommandHiiHandle); \ + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_LINE_BREAK), mVarPolicyShellCommandHiiHandle); \ } /** diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c index 173890fda5c6..cc8a1ee6725f 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c @@ -147,10 +147,7 @@ ShellDumpBufferToFile ( ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_READONLY_MEDIA), gShellAcpiViewHiiHandle, L"acpiview" @@ -225,10 +222,7 @@ ShellCommandRunAcpiView ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PROBLEM), gShellAcpiViewHiiHandle, L"acpiview", @@ -242,20 +236,14 @@ ShellCommandRunAcpiView ( ShellStatus = SHELL_INVALID_PARAMETER; } else { if (ShellCommandLineGetCount (Package) > 1) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_TOO_MANY), gShellAcpiViewHiiHandle, L"acpiview" ); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetFlag (Package, L"-?")) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GET_HELP_ACPIVIEW), gShellAcpiViewHiiHandle, L"acpiview" @@ -263,10 +251,7 @@ ShellCommandRunAcpiView ( } else if (ShellCommandLineGetFlag (Package, L"-s") && (ShellCommandLineGetValue (Package, L"-s") == NULL)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_NO_VALUE), gShellAcpiViewHiiHandle, L"acpiview", @@ -276,10 +261,7 @@ ShellCommandRunAcpiView ( } else if (ShellCommandLineGetFlag (Package, L"-r") && (ShellCommandLineGetValue (Package, L"-r") == NULL)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_NO_VALUE), gShellAcpiViewHiiHandle, L"acpiview", @@ -289,10 +271,7 @@ ShellCommandRunAcpiView ( } else if ((ShellCommandLineGetFlag (Package, L"-s") && ShellCommandLineGetFlag (Package, L"-l"))) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_TOO_MANY), gShellAcpiViewHiiHandle, L"acpiview" @@ -301,10 +280,7 @@ ShellCommandRunAcpiView ( } else if (ShellCommandLineGetFlag (Package, L"-d") && !ShellCommandLineGetFlag (Package, L"-s")) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_MISSING_OPTION), gShellAcpiViewHiiHandle, L"acpiview", @@ -358,10 +334,7 @@ ShellCommandRunAcpiView ( if (EFI_ERROR (Status)) { ShellStatus = SHELL_INVALID_PARAMETER; TmpDumpFileHandle = NULL; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_READONLY_MEDIA), gShellAcpiViewHiiHandle, L"acpiview" diff --git a/ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.c b/ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.c index b5617703c795..99a20c7c26de 100644 --- a/ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.c +++ b/ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.c @@ -319,7 +319,7 @@ GetDevicePathByHandle ( ShellStatus = SHELL_SUCCESS; if (TheHandle == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", L"Handle Number"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", L"Handle Number"); return SHELL_INVALID_PARAMETER; } @@ -350,10 +350,7 @@ GetDevicePathByHandle ( // The handle points to a real controller which has a device path. // if (Target == BcfgTargetDriverOrder) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", @@ -366,10 +363,7 @@ GetDevicePathByHandle ( // The handle points to a driver image. // if (Target == BcfgTargetBootOrder) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", @@ -433,7 +427,7 @@ BcfgMod ( if (BcfgOperation->Type == BcfgTypeModh) { CurHandle = ConvertHandleIndexToHandle (BcfgOperation->HandleIndex); if (CurHandle == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", L"Handle Number"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", L"Handle Number"); return (SHELL_INVALID_PARAMETER); } @@ -450,23 +444,23 @@ BcfgMod ( // // The name of file matched nothing. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellBcfgHiiHandle, L"bcfg", BcfgOperation->FileName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellBcfgHiiHandle, L"bcfg", BcfgOperation->FileName); ShellStatus = SHELL_INVALID_PARAMETER; } else if (FileList->Link.ForwardLink != FileList->Link.BackLink) { // // If the name of file expanded to multiple names, it's fail. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE), gShellBcfgHiiHandle, L"bcfg", BcfgOperation->FileName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_FILE), gShellBcfgHiiHandle, L"bcfg", BcfgOperation->FileName); ShellStatus = SHELL_INVALID_PARAMETER; } else { Arg = (EFI_SHELL_FILE_INFO *)GetFirstNode (&FileList->Link); if (EFI_ERROR (Arg->Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_OPEN), gShellBcfgHiiHandle, L"bcfg", BcfgOperation->FileName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_FILE_OPEN), gShellBcfgHiiHandle, L"bcfg", BcfgOperation->FileName); ShellStatus = SHELL_INVALID_PARAMETER; } else { DevicePathBuffer = gEfiShellProtocol->GetDevicePathFromFilePath (Arg->FullName); if (DevicePathBuffer == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_DP), gShellBcfgHiiHandle, L"bcfg", Arg->FullName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_FILE_DP), gShellBcfgHiiHandle, L"bcfg", Arg->FullName); ShellStatus = SHELL_UNSUPPORTED; } } @@ -508,7 +502,7 @@ BcfgMod ( Status = EfiBootManagerVariableToLoadOption (OptionStr, &LoadOption); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_NONE), gShellBcfgHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_NONE), gShellBcfgHiiHandle); ShellStatus = SHELL_NOT_FOUND; } } @@ -522,14 +516,14 @@ BcfgMod ( if (DevicePath != NULL) { LoadOption.FilePath = DuplicateDevicePath (DevicePath); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (SHELL_OUT_OF_RESOURCES), gShellBcfgHiiHandle, L"bcfg", OptionStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (SHELL_OUT_OF_RESOURCES), gShellBcfgHiiHandle, L"bcfg", OptionStr); goto Done; } } Status = EfiBootManagerLoadOptionToVariable (&LoadOption); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellBcfgHiiHandle, L"bcfg", OptionStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellBcfgHiiHandle, L"bcfg", OptionStr); ShellStatus = SHELL_INVALID_PARAMETER; } } @@ -624,7 +618,7 @@ BcfgAdd ( if (UseHandle) { CurHandle = ConvertHandleIndexToHandle (HandleNumber); if (CurHandle == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", L"Handle Number"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", L"Handle Number"); ShellStatus = SHELL_INVALID_PARAMETER; } else { if (Target == BcfgTargetBootOrder) { @@ -662,7 +656,7 @@ BcfgAdd ( } if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_HANDLE), gShellBcfgHiiHandle, L"bcfg", HandleNumber); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_HANDLE), gShellBcfgHiiHandle, L"bcfg", HandleNumber); ShellStatus = SHELL_INVALID_PARAMETER; } } else { @@ -698,7 +692,7 @@ BcfgAdd ( || (ChildControllerHandleCount > 0) || !EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", L"Handle Number"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", L"Handle Number"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -718,18 +712,18 @@ BcfgAdd ( // // If filename matched nothing fail // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellBcfgHiiHandle, L"bcfg", File); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellBcfgHiiHandle, L"bcfg", File); ShellStatus = SHELL_INVALID_PARAMETER; } else if (FileList->Link.ForwardLink != FileList->Link.BackLink) { // // If filename expanded to multiple names, fail // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE), gShellBcfgHiiHandle, L"bcfg", File); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_FILE), gShellBcfgHiiHandle, L"bcfg", File); ShellStatus = SHELL_INVALID_PARAMETER; } else { Arg = (EFI_SHELL_FILE_INFO *)GetFirstNode (&FileList->Link); if (EFI_ERROR (Arg->Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_OPEN), gShellBcfgHiiHandle, L"bcfg", File); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_FILE_OPEN), gShellBcfgHiiHandle, L"bcfg", File); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -741,7 +735,7 @@ BcfgAdd ( // DevicePath = gEfiShellProtocol->GetDevicePathFromFilePath (Arg->FullName); if (DevicePath == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_DP), gShellBcfgHiiHandle, L"bcfg", Arg->FullName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_FILE_DP), gShellBcfgHiiHandle, L"bcfg", Arg->FullName); ShellStatus = SHELL_UNSUPPORTED; } else { if (UsePath) { @@ -791,9 +785,9 @@ BcfgAdd ( } if (TargetLocation == 0xFFFF) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_TARGET_NF), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_TARGET_NF), gShellBcfgHiiHandle, L"bcfg"); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_TARGET), gShellBcfgHiiHandle, TargetLocation); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_TARGET), gShellBcfgHiiHandle, TargetLocation); } } @@ -840,7 +834,7 @@ BcfgAdd ( } if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellBcfgHiiHandle, L"bcfg", OptionStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellBcfgHiiHandle, L"bcfg", OptionStr); } else { NewOrder = AllocateZeroPool ((OrderCount + 1) * sizeof (NewOrder[0])); if (NewOrder != NULL) { @@ -865,7 +859,7 @@ BcfgAdd ( FreePool (NewOrder); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellBcfgHiiHandle, L"bcfg", Target == BcfgTargetBootOrder ? L"BootOrder" : L"DriverOrder"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellBcfgHiiHandle, L"bcfg", Target == BcfgTargetBootOrder ? L"BootOrder" : L"DriverOrder"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Print (L"bcfg: Add %s as %x\n", OptionStr, Position); @@ -929,7 +923,7 @@ BcfgRemove ( NULL ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellBcfgHiiHandle, L"bcfg", VariableName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellBcfgHiiHandle, L"bcfg", VariableName); return (SHELL_INVALID_PARAMETER); } @@ -953,7 +947,7 @@ BcfgRemove ( } if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellBcfgHiiHandle, L"bcfg", Target == BcfgTargetBootOrder ? (CHAR16 *)L"BootOrder" : (CHAR16 *)L"DriverOrder"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellBcfgHiiHandle, L"bcfg", Target == BcfgTargetBootOrder ? (CHAR16 *)L"BootOrder" : (CHAR16 *)L"DriverOrder"); return (SHELL_INVALID_PARAMETER); } @@ -1017,7 +1011,7 @@ BcfgMove ( FreePool (NewOrder); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellBcfgHiiHandle, L"bcfg", Target == BcfgTargetBootOrder ? (CHAR16 *)L"BootOrder" : (CHAR16 *)L"DriverOrder"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellBcfgHiiHandle, L"bcfg", Target == BcfgTargetBootOrder ? (CHAR16 *)L"BootOrder" : (CHAR16 *)L"DriverOrder"); return (SHELL_INVALID_PARAMETER); } @@ -1080,7 +1074,7 @@ BcfgAddOpt ( // Status = ShellConvertStringToUint64 (Walker, &Intermediate, TRUE, TRUE); if (EFI_ERROR (Status) || (((UINT16)Intermediate) != Intermediate) || (StrStr (Walker, L" ") == NULL) || (((UINT16)Intermediate) > ((UINT16)OrderCount))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", L"Option Index"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", L"Option Index"); ShellStatus = SHELL_INVALID_PARAMETER; return (ShellStatus); } @@ -1105,12 +1099,12 @@ BcfgAddOpt ( // Temp = StrStr (Walker+1, L"\""); if ((Temp == NULL) || (StrLen (Temp) != 1)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", Walker); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", Walker); ShellStatus = SHELL_INVALID_PARAMETER; } else { FileName = StrnCatGrow (&FileName, NULL, Walker+1, 0); if (FileName == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellBcfgHiiHandle, L"bcfg"); ShellStatus = SHELL_OUT_OF_RESOURCES; return (ShellStatus); } @@ -1118,7 +1112,7 @@ BcfgAddOpt ( Temp2 = StrStr (FileName, L"\""); if (Temp2 == NULL) { ASSERT (Temp2 != NULL); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", Walker); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", Walker); ShellStatus = SHELL_INVALID_PARAMETER; return (ShellStatus); } @@ -1126,7 +1120,7 @@ BcfgAddOpt ( Temp2[0] = CHAR_NULL; Temp2++; if (StrLen (Temp2) > 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", Walker); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", Walker); ShellStatus = SHELL_INVALID_PARAMETER; } @@ -1149,14 +1143,14 @@ BcfgAddOpt ( // filename // if (EFI_ERROR (ShellFileExists (Walker))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FIND_FAIL), gShellBcfgHiiHandle, L"bcfg", Walker); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FIND_FAIL), gShellBcfgHiiHandle, L"bcfg", Walker); ShellStatus = SHELL_INVALID_PARAMETER; } else { FileName = StrnCatGrow (&FileName, NULL, Walker, 0); } } else { if (Target != BcfgTargetBootOrder) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_BOOT_ONLY), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_BOOT_ONLY), gShellBcfgHiiHandle, L"bcfg"); ShellStatus = SHELL_INVALID_PARAMETER; } @@ -1166,7 +1160,7 @@ BcfgAddOpt ( // Status = ShellConvertStringToUint64 (Walker, &Intermediate, FALSE, TRUE); if (EFI_ERROR (Status) || (((UINT32)Intermediate) != Intermediate) || (StrStr (Walker, L" ") == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", Walker); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", Walker); ShellStatus = SHELL_INVALID_PARAMETER; } @@ -1188,7 +1182,7 @@ BcfgAddOpt ( // KeyOptionBuffer = AllocatePool (sizeof (EFI_KEY_OPTION) + (sizeof (EFI_INPUT_KEY) * NewKeyOption.KeyData.Options.InputKeyCount)); if (KeyOptionBuffer == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_MEM), gShellBcfgHiiHandle, L"bcfg"); ShellStatus = SHELL_OUT_OF_RESOURCES; return ShellStatus; } @@ -1202,7 +1196,7 @@ BcfgAddOpt ( // Status = ShellConvertStringToUint64 (Walker, &Intermediate, FALSE, TRUE); if (EFI_ERROR (Status) || (((UINT16)Intermediate) != Intermediate) || (StrStr (Walker, L" ") == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", Walker); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", Walker); ShellStatus = SHELL_INVALID_PARAMETER; } @@ -1221,7 +1215,7 @@ BcfgAddOpt ( // Status = ShellConvertStringToUint64 (Walker, &Intermediate, FALSE, TRUE); if (EFI_ERROR (Status) || (((UINT16)Intermediate) != Intermediate)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", Walker); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", Walker); ShellStatus = SHELL_INVALID_PARAMETER; } @@ -1244,7 +1238,7 @@ BcfgAddOpt ( KeyOptionBuffer->BootOption = CurrentOrder[OptionIndex]; Status = GetBootOptionCrc (&(KeyOptionBuffer->BootOptionCrc), KeyOptionBuffer->BootOption); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", L"Option Index"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", L"Option Index"); ShellStatus = SHELL_INVALID_PARAMETER; } } @@ -1271,11 +1265,11 @@ BcfgAddOpt ( KeyOptionBuffer ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellBcfgHiiHandle, L"bcfg", VariableName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellBcfgHiiHandle, L"bcfg", VariableName); ShellStatus = SHELL_INVALID_PARAMETER; } } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_VAR_NO_NUM), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_VAR_NO_NUM), gShellBcfgHiiHandle, L"bcfg"); ShellStatus = SHELL_INVALID_PARAMETER; } @@ -1306,7 +1300,7 @@ BcfgAddOpt ( Data = AllocateZeroPool ((UINTN)Intermediate); if (Data == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_MEM), gShellBcfgHiiHandle, L"bcfg"); ShellStatus = SHELL_OUT_OF_RESOURCES; } @@ -1320,13 +1314,13 @@ BcfgAddOpt ( if (!EFI_ERROR (Status) && (ShellStatus == SHELL_SUCCESS) && (Data != NULL)) { Status = UpdateOptionalData (CurrentOrder[OptionIndex], (UINTN)Intermediate, (UINT8 *)Data, Target); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellBcfgHiiHandle, L"bcfg", VariableName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellBcfgHiiHandle, L"bcfg", VariableName); ShellStatus = SHELL_INVALID_PARAMETER; } } if (EFI_ERROR (Status) && (ShellStatus == SHELL_SUCCESS)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellBcfgHiiHandle, L"bcfg", VariableName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellBcfgHiiHandle, L"bcfg", VariableName); ShellStatus = SHELL_INVALID_PARAMETER; } } @@ -1370,7 +1364,7 @@ BcfgDisplayDump ( UINTN OptionalDataOffset; if (OrderCount == 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_NONE), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_NONE), gShellBcfgHiiHandle, L"bcfg"); return (SHELL_SUCCESS); } @@ -1393,7 +1387,7 @@ BcfgDisplayDump ( if (Status == EFI_BUFFER_TOO_SMALL) { Buffer = AllocateZeroPool (BufferSize); if (Buffer == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_MEM), gShellBcfgHiiHandle, L"bcfg"); ++Errors; goto Cleanup; } @@ -1408,7 +1402,7 @@ BcfgDisplayDump ( } if (EFI_ERROR (Status) || (Buffer == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_READ_FAIL), gShellBcfgHiiHandle, L"bcfg", VariableName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_READ_FAIL), gShellBcfgHiiHandle, L"bcfg", VariableName); ++Errors; goto Cleanup; } @@ -1418,10 +1412,7 @@ BcfgDisplayDump ( // Description fields to be present. // if (BufferSize < sizeof *LoadOption + sizeof (CHAR16)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_BCFG_VAR_CORRUPT), gShellBcfgHiiHandle, L"bcfg", @@ -1439,7 +1430,7 @@ BcfgDisplayDump ( FilePathList = (UINT8 *)Description + DescriptionSize; DevPathString = ConvertDevicePathToText (FilePathList, TRUE, FALSE); if (DevPathString == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_MEM), gShellBcfgHiiHandle, L"bcfg"); ++Errors; goto Cleanup; } @@ -1448,10 +1439,7 @@ BcfgDisplayDump ( OptionalDataOffset = sizeof *LoadOption + DescriptionSize + LoadOption->FilePathListLength; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_BCFG_LOAD_OPTIONS), gShellBcfgHiiHandle, LoopVar, @@ -1556,7 +1544,7 @@ ShellCommandRunBcfg ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellBcfgHiiHandle, L"bcfg", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellBcfgHiiHandle, L"bcfg", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -1569,7 +1557,7 @@ ShellCommandRunBcfg ( if (ShellCommandLineGetFlag (Package, L"-opt")) { CurrentOperation.OptData = ShellCommandLineGetValue (Package, L"-opt"); if (CurrentOperation.OptData == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellBcfgHiiHandle, L"bcfg", L"-opt"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellBcfgHiiHandle, L"bcfg", L"-opt"); ShellStatus = SHELL_INVALID_PARAMETER; } @@ -1583,14 +1571,14 @@ ShellCommandRunBcfg ( ((ShellCommandLineGetCount (Package) < 2) && (CurrentOperation.Type == BcfgTypeOpt)) ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16 *)ShellCommandLineGetRawValue (Package, 1), L"driver") == 0) { CurrentOperation.Target = BcfgTargetDriverOrder; } else if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16 *)ShellCommandLineGetRawValue (Package, 1), L"boot") == 0) { CurrentOperation.Target = BcfgTargetBootOrder; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_DRIVER_BOOT), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_DRIVER_BOOT), gShellBcfgHiiHandle, L"bcfg"); ShellStatus = SHELL_INVALID_PARAMETER; } @@ -1631,7 +1619,7 @@ ShellCommandRunBcfg ( for (ParamNumber = 2; ParamNumber < ShellCommandLineGetCount (Package) && ShellStatus == SHELL_SUCCESS; ParamNumber++) { CurrentParam = ShellCommandLineGetRawValue (Package, ParamNumber); if (CurrentParam == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", L"NULL"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", L"NULL"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -1639,22 +1627,22 @@ ShellCommandRunBcfg ( if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16 *)CurrentParam, L"dump") == 0) { CurrentOperation.Type = BcfgTypeDump; if (ShellCommandLineGetCount (Package) > 3) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellBcfgHiiHandle, L"bcfg"); ShellStatus = SHELL_INVALID_PARAMETER; } } else if (ShellCommandLineGetFlag (Package, L"-v")) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", L"-v (without dump)"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", L"-v (without dump)"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16 *)CurrentParam, L"add") == 0) { if ((ParamNumber + 3) >= ShellCommandLineGetCount (Package)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); ShellStatus = SHELL_INVALID_PARAMETER; } CurrentOperation.Type = BcfgTypeAdd; CurrentParam = ShellCommandLineGetRawValue (Package, ++ParamNumber); if ((CurrentParam == NULL) || !ShellIsHexOrDecimalNumber (CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellConvertStringToUint64 (CurrentParam, &Intermediate, TRUE, FALSE); @@ -1666,14 +1654,14 @@ ShellCommandRunBcfg ( } } else if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16 *)CurrentParam, L"addp") == 0) { if ((ParamNumber + 3) >= ShellCommandLineGetCount (Package)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); ShellStatus = SHELL_INVALID_PARAMETER; } CurrentOperation.Type = BcfgTypeAddp; CurrentParam = ShellCommandLineGetRawValue (Package, ++ParamNumber); if ((CurrentParam == NULL) || !ShellIsHexOrDecimalNumber (CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellConvertStringToUint64 (CurrentParam, &Intermediate, TRUE, FALSE); @@ -1685,21 +1673,21 @@ ShellCommandRunBcfg ( } } else if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16 *)CurrentParam, L"addh") == 0) { if ((ParamNumber + 3) >= ShellCommandLineGetCount (Package)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); ShellStatus = SHELL_INVALID_PARAMETER; } CurrentOperation.Type = BcfgTypeAddh; CurrentParam = ShellCommandLineGetRawValue (Package, ++ParamNumber); if ((CurrentParam == NULL) || !ShellIsHexOrDecimalNumber (CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellConvertStringToUint64 (CurrentParam, &Intermediate, TRUE, FALSE); CurrentOperation.Number1 = (UINT16)Intermediate; CurrentParam = ShellCommandLineGetRawValue (Package, ++ParamNumber); if ((CurrentParam == NULL) || !ShellIsHexOrDecimalNumber (CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellConvertStringToUint64 (CurrentParam, &Intermediate, TRUE, FALSE); @@ -1710,44 +1698,44 @@ ShellCommandRunBcfg ( } } else if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16 *)CurrentParam, L"rm") == 0) { if ((ParamNumber + 1) >= ShellCommandLineGetCount (Package)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); ShellStatus = SHELL_INVALID_PARAMETER; } CurrentOperation.Type = BcfgTypeRm; CurrentParam = ShellCommandLineGetRawValue (Package, ++ParamNumber); if ((CurrentParam == NULL) || !ShellIsHexOrDecimalNumber (CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellConvertStringToUint64 (CurrentParam, &Intermediate, TRUE, FALSE); CurrentOperation.Number1 = (UINT16)Intermediate; if (CurrentOperation.Number1 >= Count) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellBcfgHiiHandle, L"bcfg", Count); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellBcfgHiiHandle, L"bcfg", Count); ShellStatus = SHELL_INVALID_PARAMETER; } } } else if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16 *)CurrentParam, L"mv") == 0) { if ((ParamNumber + 2) >= ShellCommandLineGetCount (Package)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); ShellStatus = SHELL_INVALID_PARAMETER; } CurrentOperation.Type = BcfgTypeMv; CurrentParam = ShellCommandLineGetRawValue (Package, ++ParamNumber); if ((CurrentParam == NULL) || !ShellIsHexOrDecimalNumber (CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellConvertStringToUint64 (CurrentParam, &Intermediate, TRUE, FALSE); CurrentOperation.Number1 = (UINT16)Intermediate; if (CurrentOperation.Number1 >= Count) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellBcfgHiiHandle, L"bcfg", Count); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellBcfgHiiHandle, L"bcfg", Count); ShellStatus = SHELL_INVALID_PARAMETER; } else { CurrentParam = ShellCommandLineGetRawValue (Package, ++ParamNumber); if ((CurrentParam == NULL) || !ShellIsHexOrDecimalNumber (CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellConvertStringToUint64 (CurrentParam, &Intermediate, TRUE, FALSE); @@ -1758,26 +1746,26 @@ ShellCommandRunBcfg ( || (CurrentOperation.Number2 >= Count) ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellBcfgHiiHandle, L"bcfg", Count); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellBcfgHiiHandle, L"bcfg", Count); ShellStatus = SHELL_INVALID_PARAMETER; } } } } else if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16 *)CurrentParam, L"mod") == 0) { if ((ParamNumber + 2) >= ShellCommandLineGetCount (Package)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); ShellStatus = SHELL_INVALID_PARAMETER; } else { CurrentOperation.Type = BcfgTypeMod; CurrentParam = ShellCommandLineGetRawValue (Package, ++ParamNumber); if ((CurrentParam == NULL) || !ShellIsHexOrDecimalNumber (CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellConvertStringToUint64 (CurrentParam, &Intermediate, TRUE, FALSE); CurrentOperation.Number1 = (UINT16)Intermediate; if (CurrentOperation.Number1 >= Count) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellBcfgHiiHandle, L"bcfg", Count); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellBcfgHiiHandle, L"bcfg", Count); ShellStatus = SHELL_INVALID_PARAMETER; } else { ASSERT (CurrentOperation.Description == NULL); @@ -1787,19 +1775,19 @@ ShellCommandRunBcfg ( } } else if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16 *)CurrentParam, L"modf") == 0) { if ((ParamNumber + 2) >= ShellCommandLineGetCount (Package)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); ShellStatus = SHELL_INVALID_PARAMETER; } else { CurrentOperation.Type = BcfgTypeModf; CurrentParam = ShellCommandLineGetRawValue (Package, ++ParamNumber); if ((CurrentParam == NULL) || !ShellIsHexOrDecimalNumber (CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellConvertStringToUint64 (CurrentParam, &Intermediate, TRUE, FALSE); CurrentOperation.Number1 = (UINT16)Intermediate; if (CurrentOperation.Number1 >= Count) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellBcfgHiiHandle, L"bcfg", Count); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellBcfgHiiHandle, L"bcfg", Count); ShellStatus = SHELL_INVALID_PARAMETER; } else { ASSERT (CurrentOperation.FileName == NULL); @@ -1809,19 +1797,19 @@ ShellCommandRunBcfg ( } } else if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16 *)CurrentParam, L"modp") == 0) { if ((ParamNumber + 2) >= ShellCommandLineGetCount (Package)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); ShellStatus = SHELL_INVALID_PARAMETER; } else { CurrentOperation.Type = BcfgTypeModp; CurrentParam = ShellCommandLineGetRawValue (Package, ++ParamNumber); if ((CurrentParam == NULL) || !ShellIsHexOrDecimalNumber (CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellConvertStringToUint64 (CurrentParam, &Intermediate, TRUE, FALSE); CurrentOperation.Number1 = (UINT16)Intermediate; if (CurrentOperation.Number1 >= Count) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellBcfgHiiHandle, L"bcfg", Count); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellBcfgHiiHandle, L"bcfg", Count); ShellStatus = SHELL_INVALID_PARAMETER; } else { ASSERT (CurrentOperation.FileName == NULL); @@ -1831,24 +1819,24 @@ ShellCommandRunBcfg ( } } else if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16 *)CurrentParam, L"modh") == 0) { if ((ParamNumber + 2) >= ShellCommandLineGetCount (Package)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellBcfgHiiHandle, L"bcfg"); ShellStatus = SHELL_INVALID_PARAMETER; } else { CurrentOperation.Type = BcfgTypeModh; CurrentParam = ShellCommandLineGetRawValue (Package, ++ParamNumber); if ((CurrentParam == NULL) || !ShellIsHexOrDecimalNumber (CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellConvertStringToUint64 (CurrentParam, &Intermediate, TRUE, FALSE); CurrentOperation.Number1 = (UINT16)Intermediate; if (CurrentOperation.Number1 >= Count) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellBcfgHiiHandle, L"bcfg", Count); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellBcfgHiiHandle, L"bcfg", Count); ShellStatus = SHELL_INVALID_PARAMETER; } else { CurrentParam = ShellCommandLineGetRawValue (Package, ++ParamNumber); if ((CurrentParam == NULL) || !ShellIsHexOrDecimalNumber (CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellConvertStringToUint64 (CurrentParam, &Intermediate, TRUE, FALSE); @@ -1858,7 +1846,7 @@ ShellCommandRunBcfg ( } } } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellBcfgHiiHandle, L"bcfg", CurrentParam); ShellStatus = SHELL_INVALID_PARAMETER; } } diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Comp.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Comp.c index 26d6653d996b..3d8eae957c03 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Comp.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Comp.c @@ -64,7 +64,7 @@ PrintDifferentPoint ( } if (BufferSize < DifferentBytes) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_COMP_END_OF_FILE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_COMP_END_OF_FILE), gShellDebug1HiiHandle); } ShellPrintEx (-1, -1, L" *"); @@ -265,7 +265,7 @@ ShellCommandRunComp ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"comp", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"comp", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -273,28 +273,28 @@ ShellCommandRunComp ( } } else { if (ShellCommandLineGetCount (Package) > 3) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"comp"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"comp"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetCount (Package) < 3) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"comp"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"comp"); ShellStatus = SHELL_INVALID_PARAMETER; } else { TempParam = ShellCommandLineGetRawValue (Package, 1); if (TempParam == NULL) { ASSERT (TempParam != NULL); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"comp", TempParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"comp", TempParam); ShellStatus = SHELL_INVALID_PARAMETER; goto Exit; } FileName1 = ShellFindFilePath (TempParam); if (FileName1 == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_FIND_FAIL), gShellDebug1HiiHandle, L"comp", TempParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_FIND_FAIL), gShellDebug1HiiHandle, L"comp", TempParam); ShellStatus = SHELL_NOT_FOUND; } else { Status = ShellOpenFileByName (FileName1, &FileHandle1, EFI_FILE_MODE_READ, 0); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"comp", TempParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"comp", TempParam); ShellStatus = SHELL_NOT_FOUND; } } @@ -302,19 +302,19 @@ ShellCommandRunComp ( TempParam = ShellCommandLineGetRawValue (Package, 2); if (TempParam == NULL) { ASSERT (TempParam != NULL); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"comp", TempParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"comp", TempParam); ShellStatus = SHELL_INVALID_PARAMETER; goto Exit; } FileName2 = ShellFindFilePath (TempParam); if (FileName2 == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_FIND_FAIL), gShellDebug1HiiHandle, L"comp", TempParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_FIND_FAIL), gShellDebug1HiiHandle, L"comp", TempParam); ShellStatus = SHELL_NOT_FOUND; } else { Status = ShellOpenFileByName (FileName2, &FileHandle2, EFI_FILE_MODE_READ, 0); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"comp", TempParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"comp", TempParam); ShellStatus = SHELL_NOT_FOUND; } } @@ -328,7 +328,7 @@ ShellCommandRunComp ( if (ShellCommandLineGetFlag (Package, L"-n")) { TempParam = ShellCommandLineGetValue (Package, L"-n"); if (TempParam == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"comp", L"-n"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"comp", L"-n"); ShellStatus = SHELL_INVALID_PARAMETER; } else { if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16 *)TempParam, L"all") == 0) { @@ -336,7 +336,7 @@ ShellCommandRunComp ( } else { Status = ShellConvertStringToUint64 (TempParam, &DifferentCount, FALSE, TRUE); if (EFI_ERROR (Status) || (DifferentCount == 0)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDebug1HiiHandle, L"comp", TempParam, L"-n"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDebug1HiiHandle, L"comp", TempParam, L"-n"); ShellStatus = SHELL_INVALID_PARAMETER; } } @@ -346,12 +346,12 @@ ShellCommandRunComp ( if (ShellCommandLineGetFlag (Package, L"-s")) { TempParam = ShellCommandLineGetValue (Package, L"-s"); if (TempParam == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"comp", L"-s"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"comp", L"-s"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellConvertStringToUint64 (TempParam, &DifferentBytes, FALSE, TRUE); if (EFI_ERROR (Status) || (DifferentBytes == 0)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDebug1HiiHandle, L"comp", TempParam, L"-s"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDebug1HiiHandle, L"comp", TempParam, L"-s"); ShellStatus = SHELL_INVALID_PARAMETER; } else { if (DifferentBytes > MAX (Size1, Size2)) { @@ -447,7 +447,7 @@ ShellCommandRunComp ( ((DataSizeFromFile1 == 0) && (DataSizeFromFile2 == 0)) ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_COMP_DIFFERENCE_POINT), gShellDebug1HiiHandle, ++DiffPointNumber); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_COMP_DIFFERENCE_POINT), gShellDebug1HiiHandle, ++DiffPointNumber); PrintDifferentPoint (FileName1, L"File1", DataFromFile1, InsertPosition1, DiffPointAddress, DifferentBytes); PrintDifferentPoint (FileName2, L"File2", DataFromFile2, InsertPosition2, DiffPointAddress, DifferentBytes); @@ -500,10 +500,10 @@ ShellCommandRunComp ( FileBufferUninit (&FileBuffer2); if (DiffPointNumber == 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_COMP_FOOTER_PASS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_COMP_FOOTER_PASS), gShellDebug1HiiHandle); } else { ShellStatus = SHELL_NOT_EQUAL; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_COMP_FOOTER_FAIL), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_COMP_FOOTER_FAIL), gShellDebug1HiiHandle); } } } diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dblk.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dblk.c index a9aa483e4ce0..6c2ffa707ffd 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dblk.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dblk.c @@ -62,10 +62,7 @@ DisplayTheBlocks ( Status = BlockIo->ReadBlocks (BlockIo, BlockIo->Media->MediaId, Lba, BufferSize, Buffer); if (!EFI_ERROR (Status) && (Buffer != NULL)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DBLK_HEADER), gShellDebug1HiiHandle, Lba, @@ -75,7 +72,7 @@ DisplayTheBlocks ( DumpHex (2, 0, BufferSize, Buffer); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_READ_FAIL), gShellDebug1HiiHandle, L"dblk", L"BlockIo"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_READ_FAIL), gShellDebug1HiiHandle, L"dblk", L"BlockIo"); ShellStatus = SHELL_DEVICE_ERROR; } @@ -131,7 +128,7 @@ ShellCommandRunDblk ( Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"dblk", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"dblk", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -139,10 +136,10 @@ ShellCommandRunDblk ( } } else { if (ShellCommandLineGetCount (Package) > 4) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"dblk"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"dblk"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetCount (Package) < 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"dblk"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"dblk"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -156,12 +153,12 @@ ShellCommandRunDblk ( Lba = 0; } else { if (!ShellIsHexOrDecimalNumber (LbaString, TRUE, FALSE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dblk", LbaString); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dblk", LbaString); ShellStatus = SHELL_INVALID_PARAMETER; } if (EFI_ERROR (ShellConvertStringToUint64 (LbaString, &Lba, TRUE, FALSE))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dblk", LbaString); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dblk", LbaString); ShellStatus = SHELL_INVALID_PARAMETER; } } @@ -170,7 +167,7 @@ ShellCommandRunDblk ( BlockCount = 1; } else { if (!ShellIsHexOrDecimalNumber (BlockCountString, TRUE, FALSE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dblk", BlockCountString); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dblk", BlockCountString); ShellStatus = SHELL_INVALID_PARAMETER; } @@ -178,7 +175,7 @@ ShellCommandRunDblk ( if (BlockCount > 0x10) { BlockCount = 0x10; } else if (BlockCount == 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dblk", BlockCountString); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dblk", BlockCountString); ShellStatus = SHELL_INVALID_PARAMETER; } } @@ -189,12 +186,12 @@ ShellCommandRunDblk ( // do the work if we have a valid block identifier // if ((BlockName == NULL) || (gEfiShellProtocol->GetDevicePathFromMap (BlockName) == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dblk", BlockName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dblk", BlockName); ShellStatus = SHELL_INVALID_PARAMETER; } else { DevPath = (EFI_DEVICE_PATH_PROTOCOL *)gEfiShellProtocol->GetDevicePathFromMap (BlockName); if (gBS->LocateDevicePath (&gEfiBlockIoProtocolGuid, &DevPath, NULL) == EFI_NOT_FOUND) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_MAP_PROTOCOL), gShellDebug1HiiHandle, L"dblk", BlockName, L"BlockIo"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_MAP_PROTOCOL), gShellDebug1HiiHandle, L"dblk", BlockName, L"BlockIo"); ShellStatus = SHELL_INVALID_PARAMETER; } else { ShellStatus = DisplayTheBlocks (gEfiShellProtocol->GetDevicePathFromMap (BlockName), Lba, (UINT8)BlockCount); diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c index 3b74bde0a929..0e89fe069afe 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dmem.c @@ -63,7 +63,7 @@ DisplayMmioMemory ( Status = gBS->LocateProtocol (&gEfiPciRootBridgeIoProtocolGuid, NULL, (VOID **)&PciRbIo); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PCIRBIO_NF), gShellDebug1HiiHandle, L"dmem"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PCIRBIO_NF), gShellDebug1HiiHandle, L"dmem"); return (SHELL_NOT_FOUND); } @@ -74,10 +74,10 @@ DisplayMmioMemory ( Status = PciRbIo->Mem.Read (PciRbIo, EfiPciWidthUint8, (UINT64)(UINTN)Address, Size, Buffer); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PCIRBIO_ER), gShellDebug1HiiHandle, L"dmem"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PCIRBIO_ER), gShellDebug1HiiHandle, L"dmem"); ShellStatus = SHELL_NOT_FOUND; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_MMIO_HEADER_ROW), gShellDebug1HiiHandle, (UINT64)(UINTN)Address, Size); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMEM_MMIO_HEADER_ROW), gShellDebug1HiiHandle, (UINT64)(UINTN)Address, Size); DumpHex (2, (UINTN)Address, Size, Buffer); } @@ -100,15 +100,12 @@ DisplayRtProperties ( EFI_STATUS Status; if (RtPropertiesTable == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_NOT_FOUND), gShellDebug1HiiHandle, L"RtPropertiesTable"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMEM_ERR_NOT_FOUND), gShellDebug1HiiHandle, L"RtPropertiesTable"); return; } RtServices = (UINT32)RtPropertiesTable->RuntimeServicesSupported; - Status = ShellPrintHiiEx ( - -1, - -1, - NULL, + Status = ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DMEM_RT_PROPERTIES), gShellDebug1HiiHandle, EFI_RT_PROPERTIES_TABLE_VERSION, @@ -129,7 +126,7 @@ DisplayRtProperties ( ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_GET_FAIL), gShellDebug1HiiHandle, L"RtPropertiesTable"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMEM_ERR_GET_FAIL), gShellDebug1HiiHandle, L"RtPropertiesTable"); } } @@ -222,10 +219,7 @@ GetImageExecutionInfo ( ActionType = L"invalid action"; } - Status = ShellPrintHiiEx ( - -1, - -1, - NULL, + Status = ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DMEM_IMG_EXE_ENTRY), gShellDebug1HiiHandle, ImageName, @@ -250,14 +244,14 @@ DisplayImageExecutionEntries ( EFI_STATUS Status; if (ExecInfoTablePtr == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_NOT_FOUND), gShellDebug1HiiHandle, L"ImageExecutionTable"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMEM_ERR_NOT_FOUND), gShellDebug1HiiHandle, L"ImageExecutionTable"); return; } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_IMG_EXE_TABLE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMEM_IMG_EXE_TABLE), gShellDebug1HiiHandle); Status = GetImageExecutionInfo (ExecInfoTablePtr); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_GET_FAIL), gShellDebug1HiiHandle, L"ImageExecutionTable"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMEM_ERR_GET_FAIL), gShellDebug1HiiHandle, L"ImageExecutionTable"); } } @@ -280,11 +274,8 @@ DisplayConformanceProfiles ( Status = EFI_SUCCESS; if (ConfProfTable == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_CONF_PRO_TABLE), gShellDebug1HiiHandle); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMEM_CONF_PRO_TABLE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DMEM_CONF_PRO_ROW), gShellDebug1HiiHandle, L"EFI_CONFORMANCE_PROFILES_UEFI_SPEC_GUID", @@ -293,7 +284,7 @@ DisplayConformanceProfiles ( return; } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_CONF_PRO_TABLE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMEM_CONF_PRO_TABLE), gShellDebug1HiiHandle); EntryGuid = (EFI_GUID *)(ConfProfTable + 1); @@ -312,10 +303,7 @@ DisplayConformanceProfiles ( GuidName = L"EBBR_2.2"; } - Status = ShellPrintHiiEx ( - -1, - -1, - NULL, + Status = ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DMEM_CONF_PRO_ROW), gShellDebug1HiiHandle, GuidName, @@ -324,7 +312,7 @@ DisplayConformanceProfiles ( } if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_ERR_GET_FAIL), gShellDebug1HiiHandle, L"ComformanceProfilesTable"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMEM_ERR_GET_FAIL), gShellDebug1HiiHandle, L"ComformanceProfilesTable"); } } @@ -405,10 +393,7 @@ DisplaySystemTable ( AddressArray[EDstSmbiosTable] = AddressArray[EDstSmbios3Table]; } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DMEM_SYSTEM_TABLE), gShellDebug1HiiHandle, (UINT64)(UINTN)Address, @@ -492,7 +477,7 @@ ShellCommandRunDmem ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"dmem", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"dmem", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -500,7 +485,7 @@ ShellCommandRunDmem ( } } else { if (ShellCommandLineGetCount (Package) > 3) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"dmem"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"dmem"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Temp1 = ShellCommandLineGetRawValue (Package, 1); @@ -509,7 +494,7 @@ ShellCommandRunDmem ( Size = sizeof (*gST); } else { if (!ShellIsHexOrDecimalNumber (Temp1, TRUE, FALSE) || EFI_ERROR (ShellConvertStringToUint64 (Temp1, (UINT64 *)&Address, TRUE, FALSE))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dmem", Temp1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dmem", Temp1); ShellStatus = SHELL_INVALID_PARAMETER; } @@ -518,7 +503,7 @@ ShellCommandRunDmem ( Size = 512; } else { if (!ShellIsHexOrDecimalNumber (Temp1, FALSE, FALSE) || EFI_ERROR (ShellConvertStringToUint64 (Temp1, &Size, TRUE, FALSE))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dmem", Temp1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dmem", Temp1); ShellStatus = SHELL_INVALID_PARAMETER; } } @@ -527,7 +512,7 @@ ShellCommandRunDmem ( if (ShellStatus == SHELL_SUCCESS) { if (!ShellCommandLineGetFlag (Package, L"-mmio")) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMEM_HEADER_ROW), gShellDebug1HiiHandle, (UINT64)(UINTN)Address, Size); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMEM_HEADER_ROW), gShellDebug1HiiHandle, (UINT64)(UINTN)Address, Size); DumpHex (2, (UINTN)Address, (UINTN)Size, Address); if (Address == (VOID *)gST) { ShellStatus = DisplaySystemTable (Package, Address); diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/DmpStore.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/DmpStore.c index b81099c7345a..311199e6445f 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/DmpStore.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/DmpStore.c @@ -242,7 +242,7 @@ LoadVariablesFromFile ( } if ((Position != FileSize) || (ShellStatus != SHELL_SUCCESS)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_LOAD_BAD_FILE), gShellDebug1HiiHandle, L"dmpstore"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMPSTORE_LOAD_BAD_FILE), gShellDebug1HiiHandle, L"dmpstore"); if (Position != FileSize) { ShellStatus = SHELL_VOLUME_CORRUPTED; } @@ -260,10 +260,7 @@ LoadVariablesFromFile ( ) { Attributes = GetAttrType (Variable->Attributes); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DMPSTORE_HEADER_LINE), gShellDebug1HiiHandle, Attributes, @@ -282,7 +279,7 @@ LoadVariablesFromFile ( Variable->Data ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_LOAD_GEN_FAIL), gShellDebug1HiiHandle, L"dmpstore", Variable->Name, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMPSTORE_LOAD_GEN_FAIL), gShellDebug1HiiHandle, L"dmpstore", Variable->Name, Status); } } } @@ -527,10 +524,7 @@ CascadeProcessVariables ( if (StandardFormatOutput) { HexString = AllocatePool ((DataSize * 2 + 1) * sizeof (CHAR16)); if (HexString != NULL) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DMPSTORE_VAR_SFO), gShellDebug1HiiHandle, FoundVarName, @@ -551,10 +545,7 @@ CascadeProcessVariables ( } else { Status = gEfiShellProtocol->GetGuidName (&FoundVarGuid, &GuidName); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DMPSTORE_HEADER_LINE), gShellDebug1HiiHandle, AttrString, @@ -563,10 +554,7 @@ CascadeProcessVariables ( DataSize ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DMPSTORE_HEADER_LINE2), gShellDebug1HiiHandle, AttrString, @@ -584,10 +572,7 @@ CascadeProcessVariables ( } else if (Type == DmpStoreSave) { if (!EFI_ERROR (Status) && (DataBuffer != NULL) && (FoundVarName != NULL)) { AttrString = GetAttrType (Atts); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DMPSTORE_HEADER_LINE), gShellDebug1HiiHandle, AttrString, @@ -612,10 +597,7 @@ CascadeProcessVariables ( SetStatus = gRT->SetVariable (FoundVarName, &FoundVarGuid, Atts, 0, NULL); if (StandardFormatOutput) { if (SetStatus == EFI_SUCCESS) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_NG_SFO), gShellDebug1HiiHandle, FoundVarName, @@ -623,10 +605,7 @@ CascadeProcessVariables ( ); } } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DMPSTORE_DELETE_LINE), gShellDebug1HiiHandle, &FoundVarGuid, @@ -685,7 +664,7 @@ ProcessVariables ( ZeroMem (&FoundVarGuid, sizeof (EFI_GUID)); if (StandardFormatOutput) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_SFO_HEADER), gShellDebug1HiiHandle, L"dmpstore"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_SFO_HEADER), gShellDebug1HiiHandle, L"dmpstore"); } if (Type == DmpStoreLoad) { @@ -696,27 +675,27 @@ ProcessVariables ( if (!Found) { if (ShellStatus == SHELL_OUT_OF_RESOURCES) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"dmpstore"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"dmpstore"); return (ShellStatus); } else if ((Name != NULL) && (Guid == NULL)) { if (StandardFormatOutput) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_N_SFO), gShellDebug1HiiHandle, Name); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_N_SFO), gShellDebug1HiiHandle, Name); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_N), gShellDebug1HiiHandle, L"dmpstore", Name); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_N), gShellDebug1HiiHandle, L"dmpstore", Name); } } else if ((Name != NULL) && (Guid != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_GN), gShellDebug1HiiHandle, L"dmpstore", Guid, Name); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_GN), gShellDebug1HiiHandle, L"dmpstore", Guid, Name); } else if ((Name == NULL) && (Guid == NULL)) { if (StandardFormatOutput) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_SFO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_SFO), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND), gShellDebug1HiiHandle, L"dmpstore"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND), gShellDebug1HiiHandle, L"dmpstore"); } } else if ((Name == NULL) && (Guid != NULL)) { if (StandardFormatOutput) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_G_SFO), gShellDebug1HiiHandle, Guid); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_G_SFO), gShellDebug1HiiHandle, Guid); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_G), gShellDebug1HiiHandle, L"dmpstore", Guid); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_G), gShellDebug1HiiHandle, L"dmpstore", Guid); } } @@ -774,7 +753,7 @@ ShellCommandRunDmpStore ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"dmpstore", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"dmpstore", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -782,19 +761,19 @@ ShellCommandRunDmpStore ( } } else { if (ShellCommandLineGetCount (Package) > 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"dmpstore"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"dmpstore"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetFlag (Package, L"-all") && ShellCommandLineGetFlag (Package, L"-guid")) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDebug1HiiHandle, L"dmpstore", L"-all", L"-guid"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDebug1HiiHandle, L"dmpstore", L"-all", L"-guid"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetFlag (Package, L"-s") && ShellCommandLineGetFlag (Package, L"-l")) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDebug1HiiHandle, L"dmpstore", L"-l", L"-s"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDebug1HiiHandle, L"dmpstore", L"-l", L"-s"); ShellStatus = SHELL_INVALID_PARAMETER; } else if ((ShellCommandLineGetFlag (Package, L"-s") || ShellCommandLineGetFlag (Package, L"-l")) && ShellCommandLineGetFlag (Package, L"-d")) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDebug1HiiHandle, L"dmpstore", L"-l or -s", L"-d"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDebug1HiiHandle, L"dmpstore", L"-l or -s", L"-d"); ShellStatus = SHELL_INVALID_PARAMETER; } else if ((ShellCommandLineGetFlag (Package, L"-s") || ShellCommandLineGetFlag (Package, L"-l")) && ShellCommandLineGetFlag (Package, L"-sfo")) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDebug1HiiHandle, L"dmpstore", L"-l or -s", L"-sfo"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDebug1HiiHandle, L"dmpstore", L"-l or -s", L"-sfo"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -805,7 +784,7 @@ ShellCommandRunDmpStore ( if (GuidStr != NULL) { RStatus = StrToGuid (GuidStr, &GuidData); if (RETURN_ERROR (RStatus) || (GuidStr[GUID_STRING_LENGTH] != L'\0')) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dmpstore", GuidStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dmpstore", GuidStr); ShellStatus = SHELL_INVALID_PARAMETER; } @@ -827,7 +806,7 @@ ShellCommandRunDmpStore ( Type = DmpStoreSave; File = ShellCommandLineGetValue (Package, L"-s"); if (File == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"dmpstore", L"-s"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"dmpstore", L"-s"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellOpenFileByName (File, &FileHandle, EFI_FILE_MODE_WRITE | EFI_FILE_MODE_READ, 0); @@ -837,16 +816,16 @@ ShellCommandRunDmpStore ( // FileInfo = ShellGetFileInfo (FileHandle); if (FileInfo == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"dmpstore", File); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"dmpstore", File); Status = EFI_DEVICE_ERROR; } else { if ((FileInfo->Attribute & EFI_FILE_DIRECTORY) == EFI_FILE_DIRECTORY) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_IS_DIRECTORY), gShellDebug1HiiHandle, L"dmpstore", File); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_IS_DIRECTORY), gShellDebug1HiiHandle, L"dmpstore", File); Status = EFI_INVALID_PARAMETER; } else { Status = ShellDeleteFile (&FileHandle); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_DELETE_FAIL), gShellDebug1HiiHandle, L"dmpstore", File); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_DELETE_FAIL), gShellDebug1HiiHandle, L"dmpstore", File); } } @@ -861,13 +840,13 @@ ShellCommandRunDmpStore ( // // Otherwise it's bad. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"dmpstore", File); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"dmpstore", File); } if (!EFI_ERROR (Status)) { Status = ShellOpenFileByName (File, &FileHandle, EFI_FILE_MODE_CREATE | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_READ, 0); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"dmpstore", File); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"dmpstore", File); } } @@ -879,21 +858,21 @@ ShellCommandRunDmpStore ( Type = DmpStoreLoad; File = ShellCommandLineGetValue (Package, L"-l"); if (File == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"dmpstore", L"-l"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"dmpstore", L"-l"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellOpenFileByName (File, &FileHandle, EFI_FILE_MODE_READ, 0); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"dmpstore", File); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"dmpstore", File); ShellStatus = SHELL_INVALID_PARAMETER; } else { FileInfo = ShellGetFileInfo (FileHandle); if (FileInfo == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"dmpstore", File); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"dmpstore", File); ShellStatus = SHELL_DEVICE_ERROR; } else { if ((FileInfo->Attribute & EFI_FILE_DIRECTORY) == EFI_FILE_DIRECTORY) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_IS_DIRECTORY), gShellDebug1HiiHandle, L"dmpstore", File); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_IS_DIRECTORY), gShellDebug1HiiHandle, L"dmpstore", File); ShellStatus = SHELL_INVALID_PARAMETER; } @@ -912,9 +891,9 @@ ShellCommandRunDmpStore ( if (ShellStatus == SHELL_SUCCESS) { if (Type == DmpStoreSave) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_SAVE), gShellDebug1HiiHandle, File); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMPSTORE_SAVE), gShellDebug1HiiHandle, File); } else if (Type == DmpStoreLoad) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_LOAD), gShellDebug1HiiHandle, File); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DMPSTORE_LOAD), gShellDebug1HiiHandle, File); } ShellStatus = ProcessVariables (Name, Guid, Type, FileHandle, StandardFormatOutput); diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Edit/Edit.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Edit/Edit.c index 144007a3d349..c0539eb0acd3 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Edit/Edit.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Edit/Edit.c @@ -54,7 +54,7 @@ ShellCommandRunEdit ( Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"edit", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"edit", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -62,7 +62,7 @@ ShellCommandRunEdit ( } } else { if (ShellCommandLineGetCount (Package) > 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"edit"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"edit"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Cwd = gEfiShellProtocol->GetCurDir (NULL); @@ -92,7 +92,7 @@ ShellCommandRunEdit ( if (EFI_ERROR (Status)) { gST->ConOut->ClearScreen (gST->ConOut); gST->ConOut->EnableCursor (gST->ConOut, TRUE); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_EDIT_MAIN_INIT_FAILED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_EDIT_MAIN_INIT_FAILED), gShellDebug1HiiHandle); } else { MainEditorBackup (); @@ -103,7 +103,7 @@ ShellCommandRunEdit ( TempParam = ShellCommandLineGetRawValue (Package, 1); if (TempParam == NULL) { ASSERT (TempParam != NULL); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"edit"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"edit"); ShellStatus = SHELL_INVALID_PARAMETER; } else { FileBufferSetFileName (TempParam); @@ -138,19 +138,19 @@ ShellCommandRunEdit ( // if (Status == EFI_SUCCESS) { } else if (Status == EFI_OUT_OF_RESOURCES) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"edit"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"edit"); } else { if (Buffer != NULL) { if (StrCmp (Buffer, L"") != 0) { // // print out the status string // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_EDIT_MAIN_BUFFER), gShellDebug1HiiHandle, Buffer); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_EDIT_MAIN_BUFFER), gShellDebug1HiiHandle, Buffer); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_EDIT_MAIN_UNKNOWN_EDITOR_ERR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_EDIT_MAIN_UNKNOWN_EDITOR_ERR), gShellDebug1HiiHandle); } } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_EDIT_MAIN_UNKNOWN_EDITOR_ERR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_EDIT_MAIN_UNKNOWN_EDITOR_ERR), gShellDebug1HiiHandle); } } diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Edit/MainTextEditor.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Edit/MainTextEditor.c index f3ea38438d84..6f7fc55e3898 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Edit/MainTextEditor.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Edit/MainTextEditor.c @@ -1560,20 +1560,20 @@ MainEditorInit ( // Status = MainTitleBarInit (L"UEFI EDIT"); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_EDIT_LIBEDITOR_TITLEBAR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_EDIT_LIBEDITOR_TITLEBAR), gShellDebug1HiiHandle); return EFI_LOAD_ERROR; } Status = ControlHotKeyInit (MainControlBasedMenuFunctions); Status = MenuBarInit (MainMenuItems); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_EDIT_LIBEDITOR_MAINMENU), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_EDIT_LIBEDITOR_MAINMENU), gShellDebug1HiiHandle); return EFI_LOAD_ERROR; } Status = StatusBarInit (); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_EDIT_LIBEDITOR_STATUSBAR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_EDIT_LIBEDITOR_STATUSBAR), gShellDebug1HiiHandle); return EFI_LOAD_ERROR; } @@ -1581,7 +1581,7 @@ MainEditorInit ( Status = FileBufferInit (); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_EDIT_LIBEDITOR_FILEBUFFER), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_EDIT_LIBEDITOR_FILEBUFFER), gShellDebug1HiiHandle); return EFI_LOAD_ERROR; } @@ -1626,7 +1626,7 @@ MainEditorCleanup ( Status = FileBufferCleanup (); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_EDIT_LIBEDITOR_FILEBUFFER_CLEANUP), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_EDIT_LIBEDITOR_FILEBUFFER_CLEANUP), gShellDebug1HiiHandle); } // diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/EditInputBar.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/EditInputBar.c index 0b2596542780..a0cac5a13084 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/EditInputBar.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/EditInputBar.c @@ -154,7 +154,7 @@ InputBarRefresh ( EditorClearLine (LastRow, LastColumn, LastRow); gST->ConOut->SetCursorPosition (gST->ConOut, 0, LastRow - 1); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_EDIT_LIBINPUTBAR_MAININPUTBAR), gShellDebug1HiiHandle, mPrompt); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_EDIT_LIBINPUTBAR_MAININPUTBAR), gShellDebug1HiiHandle, mPrompt); // // this is a selection mPrompt, cursor will stay in edit area diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/EfiCompress.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/EfiCompress.c index ea190d0770f7..f31b4ffd27f2 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/EfiCompress.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/EfiCompress.c @@ -65,7 +65,7 @@ ShellCommandRunEfiCompress ( Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"eficompress", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"eficompress", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -73,16 +73,16 @@ ShellCommandRunEfiCompress ( } } else { if (ShellCommandLineGetCount (Package) > 3) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"eficompress"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"eficompress"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetCount (Package) < 3) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"eficompress"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"eficompress"); ShellStatus = SHELL_INVALID_PARAMETER; } else { TempParam = ShellCommandLineGetRawValue (Package, 1); if (TempParam == NULL) { ASSERT (TempParam != NULL); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"eficompress"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"eficompress"); ShellStatus = SHELL_INVALID_PARAMETER; goto Exit; } @@ -90,29 +90,29 @@ ShellCommandRunEfiCompress ( InFileName = ShellFindFilePath (TempParam); OutFileName = ShellCommandLineGetRawValue (Package, 2); if ((InFileName == NULL) || (OutFileName == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_FIND_FAIL), gShellDebug1HiiHandle, L"eficompress", TempParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_FIND_FAIL), gShellDebug1HiiHandle, L"eficompress", TempParam); ShellStatus = SHELL_NOT_FOUND; } else { if (ShellIsDirectory (InFileName) == EFI_SUCCESS) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, L"eficompress", InFileName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, L"eficompress", InFileName); ShellStatus = SHELL_INVALID_PARAMETER; } if (ShellIsDirectory (OutFileName) == EFI_SUCCESS) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, L"eficompress", OutFileName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, L"eficompress", OutFileName); ShellStatus = SHELL_INVALID_PARAMETER; } if (ShellStatus == SHELL_SUCCESS) { Status = ShellOpenFileByName (InFileName, &InShellFileHandle, EFI_FILE_MODE_READ, 0); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"eficompress", ShellCommandLineGetRawValue (Package, 1)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"eficompress", ShellCommandLineGetRawValue (Package, 1)); ShellStatus = SHELL_NOT_FOUND; } Status = ShellOpenFileByName (OutFileName, &OutShellFileHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE|EFI_FILE_MODE_CREATE, 0); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"eficompress", ShellCommandLineGetRawValue (Package, 2)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"eficompress", ShellCommandLineGetRawValue (Package, 2)); ShellStatus = SHELL_NOT_FOUND; } } @@ -140,13 +140,13 @@ ShellCommandRunEfiCompress ( } if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_EFI_COMPRESS_FAIL), gShellDebug1HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_EFI_COMPRESS_FAIL), gShellDebug1HiiHandle, Status); ShellStatus = ((Status == EFI_OUT_OF_RESOURCES) ? SHELL_OUT_OF_RESOURCES : SHELL_DEVICE_ERROR); } else { OutSize2 = (UINTN)OutSize; Status = gEfiShellProtocol->WriteFile (OutShellFileHandle, &OutSize2, OutBuffer); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_WRITE_FAIL), gShellDebug1HiiHandle, L"eficompress", OutFileName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_WRITE_FAIL), gShellDebug1HiiHandle, L"eficompress", OutFileName); ShellStatus = SHELL_DEVICE_ERROR; } } diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/EfiDecompress.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/EfiDecompress.c index 37f19a156aba..041fef71a8b4 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/EfiDecompress.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/EfiDecompress.c @@ -70,7 +70,7 @@ ShellCommandRunEfiDecompress ( Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"efidecompress", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"efidecompress", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -78,16 +78,16 @@ ShellCommandRunEfiDecompress ( } } else { if (ShellCommandLineGetCount (Package) > 3) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"efidecompress"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"efidecompress"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetCount (Package) < 3) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"efidecompress"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"efidecompress"); ShellStatus = SHELL_INVALID_PARAMETER; } else { TempParam = ShellCommandLineGetRawValue (Package, 1); if (TempParam == NULL) { ASSERT (TempParam != NULL); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"efidecompress"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"efidecompress"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -95,23 +95,23 @@ ShellCommandRunEfiDecompress ( InFileName = ShellFindFilePath (TempParam); OutFileName = ShellCommandLineGetRawValue (Package, 2); if ((InFileName == NULL) || (OutFileName == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_FIND_FAIL), gShellDebug1HiiHandle, L"efidecompress", TempParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_FIND_FAIL), gShellDebug1HiiHandle, L"efidecompress", TempParam); ShellStatus = SHELL_NOT_FOUND; } else { if (ShellIsDirectory (InFileName) == EFI_SUCCESS) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, L"efidecompress", InFileName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, L"efidecompress", InFileName); ShellStatus = SHELL_INVALID_PARAMETER; } if (ShellIsDirectory (OutFileName) == EFI_SUCCESS) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, L"efidecompress", OutFileName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, L"efidecompress", OutFileName); ShellStatus = SHELL_INVALID_PARAMETER; } if (ShellStatus == SHELL_SUCCESS) { Status = ShellOpenFileByName (InFileName, &InFileHandle, EFI_FILE_MODE_READ, 0); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"efidecompress", ShellCommandLineGetRawValue (Package, 1)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"efidecompress", ShellCommandLineGetRawValue (Package, 1)); ShellStatus = SHELL_NOT_FOUND; } } @@ -119,7 +119,7 @@ ShellCommandRunEfiDecompress ( if (ShellStatus == SHELL_SUCCESS) { Status = FileHandleGetSize (InFileHandle, &Temp64Bit); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"efidecompress", ShellCommandLineGetRawValue (Package, 1)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"efidecompress", ShellCommandLineGetRawValue (Package, 1)); ShellStatus = SHELL_NOT_FOUND; } } @@ -150,12 +150,12 @@ ShellCommandRunEfiDecompress ( } if (EFI_ERROR (Status) || (OutSize == 0)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_EFI_DECOMPRESS_NOPE), gShellDebug1HiiHandle, InFileName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_EFI_DECOMPRESS_NOPE), gShellDebug1HiiHandle, InFileName); ShellStatus = SHELL_NOT_FOUND; } else { Status = ShellOpenFileByName (OutFileName, &OutFileHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE|EFI_FILE_MODE_CREATE, 0); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_OPEN_FAIL), gShellDebug1HiiHandle, ShellCommandLineGetRawValue (Package, 2), Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_OPEN_FAIL), gShellDebug1HiiHandle, ShellCommandLineGetRawValue (Package, 2), Status); ShellStatus = SHELL_NOT_FOUND; } else { OutBuffer = AllocateZeroPool (OutSize); @@ -169,14 +169,14 @@ ShellCommandRunEfiDecompress ( } if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_EFI_DECOMPRESS_FAIL), gShellDebug1HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_EFI_DECOMPRESS_FAIL), gShellDebug1HiiHandle, Status); ShellStatus = ((Status == EFI_OUT_OF_RESOURCES) ? SHELL_OUT_OF_RESOURCES : SHELL_DEVICE_ERROR); } else { OutSizeTemp = OutSize; Status = gEfiShellProtocol->WriteFile (OutFileHandle, &OutSizeTemp, OutBuffer); OutSize = (UINT32)OutSizeTemp; if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_WRITE_FAIL), gShellDebug1HiiHandle, L"efidecompress", OutFileName, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_WRITE_FAIL), gShellDebug1HiiHandle, L"efidecompress", OutFileName, Status); ShellStatus = SHELL_DEVICE_ERROR; } } diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/HexEdit.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/HexEdit.c index 9ca675648d62..cc4dcf9f1b60 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/HexEdit.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/HexEdit.c @@ -68,7 +68,7 @@ ShellCommandRunHexEdit ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"hexedit", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"hexedit", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -80,10 +80,10 @@ ShellCommandRunHexEdit ( // if (ShellCommandLineGetFlag (Package, L"-d")) { if (ShellCommandLineGetCount (Package) < 4) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"hexedit"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"hexedit"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetCount (Package) > 4) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"hexedit"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"hexedit"); ShellStatus = SHELL_INVALID_PARAMETER; } else { WhatToDo = FileTypeDiskBuffer; @@ -93,7 +93,7 @@ ShellCommandRunHexEdit ( } if ((Offset == (UINTN)-1) || (Size == (UINTN)-1)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"hexedit", L"-d"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"hexedit", L"-d"); ShellStatus = SHELL_INVALID_PARAMETER; } } @@ -103,15 +103,15 @@ ShellCommandRunHexEdit ( // if (ShellCommandLineGetFlag (Package, L"-f") && (WhatToDo == FileTypeNone)) { if (ShellCommandLineGetCount (Package) < 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"hexedit"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"hexedit"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetCount (Package) > 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"hexedit"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"hexedit"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Name = ShellCommandLineGetRawValue (Package, 1); if ((Name == NULL) || !IsValidFileName (Name)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"hexedit", Name); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"hexedit", Name); ShellStatus = SHELL_INVALID_PARAMETER; } else { WhatToDo = FileTypeFileBuffer; @@ -124,10 +124,10 @@ ShellCommandRunHexEdit ( // if (ShellCommandLineGetFlag (Package, L"-m") && (WhatToDo == FileTypeNone)) { if (ShellCommandLineGetCount (Package) < 3) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"hexedit"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"hexedit"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetCount (Package) > 3) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"hexedit"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"hexedit"); ShellStatus = SHELL_INVALID_PARAMETER; } else { WhatToDo = FileTypeMemBuffer; @@ -139,10 +139,10 @@ ShellCommandRunHexEdit ( Name = ShellCommandLineGetRawValue (Package, 1); if ((WhatToDo == FileTypeNone) && (Name != NULL)) { if (ShellCommandLineGetCount (Package) > 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"hexedit"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"hexedit"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (!IsValidFileName (Name)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"hexedit", Name); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"hexedit", Name); ShellStatus = SHELL_INVALID_PARAMETER; } else { WhatToDo = FileTypeFileBuffer; @@ -150,7 +150,7 @@ ShellCommandRunHexEdit ( } else if (WhatToDo == FileTypeNone) { if (gEfiShellProtocol->GetCurDir (NULL) == NULL) { ShellStatus = SHELL_NOT_FOUND; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellDebug1HiiHandle, L"hexedit"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellDebug1HiiHandle, L"hexedit"); } else { NewName = EditGetDefaultFileName (L"bin"); Name = NewName; @@ -159,10 +159,10 @@ ShellCommandRunHexEdit ( } if ((ShellStatus == SHELL_SUCCESS) && (WhatToDo == FileTypeNone)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"hexedit"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"hexedit"); ShellStatus = SHELL_INVALID_PARAMETER; } else if ((WhatToDo == FileTypeFileBuffer) && (ShellGetCurrentDir (NULL) == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellDebug1HiiHandle, L"hexedit"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellDebug1HiiHandle, L"hexedit"); ShellStatus = SHELL_INVALID_PARAMETER; } @@ -174,7 +174,7 @@ ShellCommandRunHexEdit ( if (EFI_ERROR (Status)) { gST->ConOut->ClearScreen (gST->ConOut); gST->ConOut->EnableCursor (gST->ConOut, TRUE); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_INIT_FAILED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HEXEDIT_INIT_FAILED), gShellDebug1HiiHandle); } else { HMainEditorBackup (); switch (WhatToDo) { @@ -250,7 +250,7 @@ ShellCommandRunHexEdit ( // print editor exit code on screen // if (Status == EFI_OUT_OF_RESOURCES) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"hexedit"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"hexedit"); } else if (EFI_ERROR (Status)) { if (Buffer != NULL) { if (StrCmp (Buffer, L"") != 0) { @@ -259,10 +259,10 @@ ShellCommandRunHexEdit ( // ShellPrintEx (-1, -1, L"%s", Buffer); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_UNKNOWN_EDITOR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HEXEDIT_UNKNOWN_EDITOR), gShellDebug1HiiHandle); } } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_UNKNOWN_EDITOR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HEXEDIT_UNKNOWN_EDITOR), gShellDebug1HiiHandle); } } } diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/MainHexEditor.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/MainHexEditor.c index 51e4ae2f8193..d575cd4219a7 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/MainHexEditor.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/MainHexEditor.c @@ -1751,25 +1751,25 @@ HMainEditorInit ( // Status = MainTitleBarInit (L"UEFI HEXEDIT"); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_TITLE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_TITLE), gShellDebug1HiiHandle); return EFI_LOAD_ERROR; } Status = ControlHotKeyInit (HexMainControlBasedMenuFunctions); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_MAINMENU), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_MAINMENU), gShellDebug1HiiHandle); return EFI_LOAD_ERROR; } Status = MenuBarInit (HexEditorMenuItems); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_MAINMENU), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_MAINMENU), gShellDebug1HiiHandle); return EFI_LOAD_ERROR; } Status = StatusBarInit (); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_STATUS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_STATUS), gShellDebug1HiiHandle); return EFI_LOAD_ERROR; } @@ -1777,13 +1777,13 @@ HMainEditorInit ( Status = HBufferImageInit (); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_BUFFERIMAGE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_BUFFERIMAGE), gShellDebug1HiiHandle); return EFI_LOAD_ERROR; } Status = HClipBoardInit (); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_CLIPBOARD), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_CLIPBOARD), gShellDebug1HiiHandle); return EFI_LOAD_ERROR; } @@ -1829,12 +1829,12 @@ HMainEditorCleanup ( Status = HBufferImageCleanup (); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_BUFFERIMAGE_CLEAN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_BUFFERIMAGE_CLEAN), gShellDebug1HiiHandle); } Status = HClipBoardCleanup (); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_CLIPBOARD_CLEAN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_CLIPBOARD_CLEAN), gShellDebug1HiiHandle); } // diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/LoadPciRom.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/LoadPciRom.c index 40260ea3dc93..81cf8235972c 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/LoadPciRom.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/LoadPciRom.c @@ -87,7 +87,7 @@ ShellCommandRunLoadPciRom ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"loadpcirom", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"loadpcirom", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -95,7 +95,7 @@ ShellCommandRunLoadPciRom ( } } else { if (ShellCommandLineGetCount (Package) < 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"loadpcirom"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"loadpcirom"); ShellStatus = SHELL_INVALID_PARAMETER; } else { if (ShellCommandLineGetFlag (Package, L"-nc")) { @@ -115,7 +115,7 @@ ShellCommandRunLoadPciRom ( { Status = ShellOpenFileMetaArg ((CHAR16 *)Param, EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"loadpcirom", Param); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"loadpcirom", Param); ShellStatus = SHELL_ACCESS_DENIED; break; } @@ -131,13 +131,13 @@ ShellCommandRunLoadPciRom ( ) { if (EFI_ERROR (Node->Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"loadpcirom", Node->FullName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"loadpcirom", Node->FullName); ShellStatus = SHELL_INVALID_PARAMETER; continue; } if (FileHandleIsDirectory (Node->Handle) == EFI_SUCCESS) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, L"loadpcirom", Node->FullName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, L"loadpcirom", Node->FullName); ShellStatus = SHELL_INVALID_PARAMETER; continue; } @@ -145,14 +145,14 @@ ShellCommandRunLoadPciRom ( SourceSize = (UINTN)Node->Info->FileSize; File1Buffer = AllocateZeroPool (SourceSize); if (File1Buffer == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"loadpcirom"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"loadpcirom"); ShellStatus = SHELL_OUT_OF_RESOURCES; continue; } Status = gEfiShellProtocol->ReadFile (Node->Handle, &SourceSize, File1Buffer); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_READ_FAIL), gShellDebug1HiiHandle, L"loadpcirom", Node->FullName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_READ_FAIL), gShellDebug1HiiHandle, L"loadpcirom", Node->FullName); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = LoadEfiDriversFromRomImage ( @@ -161,13 +161,13 @@ ShellCommandRunLoadPciRom ( Node->FullName ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_LOAD_PCI_ROM_RES), gShellDebug1HiiHandle, Node->FullName, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LOAD_PCI_ROM_RES), gShellDebug1HiiHandle, Node->FullName, Status); } FreePool (File1Buffer); } } else if (ShellStatus == SHELL_SUCCESS) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_SPEC), gShellDebug1HiiHandle, "loadpcirom"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_NOT_SPEC), gShellDebug1HiiHandle, "loadpcirom"); ShellStatus = SHELL_NOT_FOUND; } @@ -236,7 +236,7 @@ LoadEfiDriversFromRomImage ( EfiRomHeader = (EFI_PCI_EXPANSION_ROM_HEADER *)(UINTN)RomBarOffset; if (EfiRomHeader->Signature != PCI_EXPANSION_ROM_HEADER_SIGNATURE) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_LOADPCIROM_CORRUPT), gShellDebug1HiiHandle, L"loadpcirom", FileName, ImageIndex); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LOADPCIROM_CORRUPT), gShellDebug1HiiHandle, L"loadpcirom", FileName, ImageIndex); // PrintToken (STRING_TOKEN (STR_LOADPCIROM_IMAGE_CORRUPT), HiiHandle, ImageIndex); return ReturnStatus; } @@ -303,7 +303,7 @@ LoadEfiDriversFromRomImage ( if (!EFI_ERROR (Status)) { DecompressedImageBuffer = AllocateZeroPool (DestinationSize); if (DecompressedImageBuffer == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"loadpcirom"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"loadpcirom"); return EFI_OUT_OF_RESOURCES; } @@ -339,7 +339,7 @@ LoadEfiDriversFromRomImage ( UnicodeSPrint (RomFileName, sizeof (RomFileName), L"%s[%d]", FileName, ImageIndex); FilePath = FileDevicePath (NULL, RomFileName); if (FilePath == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_LOADPCIROM_LOAD_FAIL), gShellDebug1HiiHandle, L"loadpcirom", FileName, ImageIndex); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LOADPCIROM_LOAD_FAIL), gShellDebug1HiiHandle, L"loadpcirom", FileName, ImageIndex); SHELL_FREE_NON_NULL (DecompressedImageBuffer); return EFI_OUT_OF_RESOURCES; } @@ -363,12 +363,12 @@ LoadEfiDriversFromRomImage ( gBS->UnloadImage (ImageHandle); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_LOADPCIROM_LOAD_FAIL), gShellDebug1HiiHandle, L"loadpcirom", FileName, ImageIndex); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LOADPCIROM_LOAD_FAIL), gShellDebug1HiiHandle, L"loadpcirom", FileName, ImageIndex); // PrintToken (STRING_TOKEN (STR_LOADPCIROM_LOAD_IMAGE_ERROR), HiiHandle, ImageIndex, Status); } else { Status = gBS->StartImage (ImageHandle, NULL, NULL); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_LOADPCIROM_START_FAIL), gShellDebug1HiiHandle, L"loadpcirom", FileName, ImageIndex); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LOADPCIROM_START_FAIL), gShellDebug1HiiHandle, L"loadpcirom", FileName, ImageIndex); // PrintToken (STRING_TOKEN (STR_LOADPCIROM_START_IMAGE), HiiHandle, ImageIndex, Status); } else { ReturnStatus = Status; diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c index 8f30a53b7b93..1cf7843434d3 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c @@ -198,10 +198,7 @@ ParseMemoryDescriptors ( MemoryTypeName = FullNameEfiMemory[Walker->Type]; } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, MemoryTypeName, @@ -216,10 +213,7 @@ ParseMemoryDescriptors ( // Do not print the OEM/OS memory usage in the SFO format, to avoid conflict with Shell Spec. // if (!Sfo) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_MEMMAP_LIST_ITEM_OTHER), gShellDebug1HiiHandle, Walker->Type, @@ -244,10 +238,7 @@ ParseMemoryDescriptors ( // print the summary // if (!Sfo) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_MEMMAP_LIST_SUMM), gShellDebug1HiiHandle, MemoryPageCount[EfiReservedMemoryType].Pages, @@ -287,10 +278,7 @@ ParseMemoryDescriptors ( // for (Link = GetFirstNode (&MemoryList); !IsNull (&MemoryList, Link); Link = GetNextNode (&MemoryList, Link)) { Entry = BASE_CR (Link, MEMORY_LENGTH_ENTRY, Link); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_MEMMAP_LIST_SUMM_OTHER), gShellDebug1HiiHandle, Entry->Type, @@ -299,20 +287,14 @@ ParseMemoryDescriptors ( ); } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_MEMMAP_LIST_SUMM2), gShellDebug1HiiHandle, DivU64x32 (MultU64x64 (SIZE_4KB, TotalPages), SIZE_1MB), TotalPagesSize ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_MEMMAP_LIST_SUMM_SFO), gShellDebug1HiiHandle, TotalPagesSize, @@ -389,7 +371,7 @@ ShellCommandRunMemMap ( Status = ShellCommandLineParse (SfoParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"memmap", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"memmap", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -397,7 +379,7 @@ ShellCommandRunMemMap ( } } else { if (ShellCommandLineGetCount (Package) > 1) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"memmap"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"memmap"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = gBS->GetMemoryMap (&Size, Descriptors, &MapKey, &ItemSize, &Version); @@ -405,7 +387,7 @@ ShellCommandRunMemMap ( Size += SIZE_1KB; Descriptors = AllocateZeroPool (Size); if (Descriptors == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"memmap"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"memmap"); ShellCommandLineFreeVarList (Package); return SHELL_OUT_OF_RESOURCES; } @@ -414,16 +396,16 @@ ShellCommandRunMemMap ( } if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_GET_FAILED), gShellDebug1HiiHandle, L"memmap"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MEMMAP_GET_FAILED), gShellDebug1HiiHandle, L"memmap"); ShellStatus = SHELL_ACCESS_DENIED; } else { ASSERT (Version == EFI_MEMORY_DESCRIPTOR_VERSION); Sfo = ShellCommandLineGetFlag (Package, L"-sfo"); if (!Sfo) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_LIST_HEAD), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MEMMAP_LIST_HEAD), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_SFO_HEADER), gShellDebug1HiiHandle, L"memmap"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_SFO_HEADER), gShellDebug1HiiHandle, L"memmap"); } ParseMemoryDescriptors (Descriptors, Size, ItemSize, Sfo); diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Mm.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Mm.c index ce475a6ef06b..2315457a0af2 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Mm.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Mm.c @@ -449,7 +449,7 @@ ShellCommandRunMm ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"mm", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"mm", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; @@ -458,15 +458,15 @@ ShellCommandRunMm ( } } else { if (ShellCommandLineGetCount (Package) < 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"mm"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"mm"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } else if (ShellCommandLineGetCount (Package) > 3) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"mm"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"mm"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } else if (ShellCommandLineGetFlag (Package, L"-w") && (ShellCommandLineGetValue (Package, L"-w") == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"mm", L"-w"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"mm", L"-w"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } else { @@ -478,7 +478,7 @@ ShellCommandRunMm ( || ShellCommandLineGetFlag (Package, L"-pcie") ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"mm"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"mm"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -489,7 +489,7 @@ ShellCommandRunMm ( || ShellCommandLineGetFlag (Package, L"-pcie") ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"mm"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"mm"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -499,7 +499,7 @@ ShellCommandRunMm ( || ShellCommandLineGetFlag (Package, L"-pcie") ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"mm"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"mm"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -508,7 +508,7 @@ ShellCommandRunMm ( if (ShellCommandLineGetFlag (Package, L"-pcie") ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"mm"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"mm"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -531,27 +531,27 @@ ShellCommandRunMm ( } if ((Size != 1) && (Size != 2) && (Size != 4) && (Size != 8)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDebug1HiiHandle, L"mm", Temp, L"-w"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDebug1HiiHandle, L"mm", Temp, L"-w"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } Temp = ShellCommandLineGetRawValue (Package, 1); if (Temp == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"mm", L"NULL"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"mm", L"NULL"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } Status = ShellConvertStringToUint64 (Temp, &Address, TRUE, FALSE); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"mm", Temp); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"mm", Temp); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if ((Address & (Size - 1)) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MM_NOT_ALIGNED), gShellDebug1HiiHandle, L"mm", Address); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MM_NOT_ALIGNED), gShellDebug1HiiHandle, L"mm", Address); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -562,13 +562,13 @@ ShellCommandRunMm ( HasPciRootBridgeIo = ShellMmLocateIoProtocol (AccessType, Address, &CpuIo, &PciRootBridgeIo); if ((AccessType == ShellMmPci) || (AccessType == ShellMmPciExpress)) { if (!HasPciRootBridgeIo) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PCIRBIO_NF), gShellDebug1HiiHandle, L"mm"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PCIRBIO_NF), gShellDebug1HiiHandle, L"mm"); ShellStatus = SHELL_NOT_FOUND; goto Done; } if (PciRootBridgeIo == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MM_PCIE_ADDRESS_RANGE), gShellDebug1HiiHandle, L"mm", Address); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MM_PCIE_ADDRESS_RANGE), gShellDebug1HiiHandle, L"mm", Address); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -581,13 +581,13 @@ ShellCommandRunMm ( if (Temp != NULL) { Status = ShellConvertStringToUint64 (Temp, &Value, TRUE, FALSE); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"mm", Temp); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"mm", Temp); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (Value > mShellMmMaxNumber[Size]) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"mm", Temp); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"mm", Temp); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -601,16 +601,16 @@ ShellCommandRunMm ( // if (!Interactive) { if (!gEfiShellProtocol->BatchIsActive ()) { - ShellPrintHiiEx (-1, -1, NULL, mShellMmAccessTypeStr[AccessType], gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (mShellMmAccessTypeStr[AccessType], gShellDebug1HiiHandle); } ShellMmAccess (AccessType, PciRootBridgeIo, CpuIo, TRUE, Address, Size, &Buffer); if (!gEfiShellProtocol->BatchIsActive ()) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MM_ADDRESS), gShellDebug1HiiHandle, Address); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MM_ADDRESS), gShellDebug1HiiHandle, Address); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MM_BUF), gShellDebug1HiiHandle, Size * 2, Buffer & mShellMmMaxNumber[Size]); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MM_BUF), gShellDebug1HiiHandle, Size * 2, Buffer & mShellMmMaxNumber[Size]); ShellPrintEx (-1, -1, L"\r\n"); goto Done; } @@ -621,9 +621,9 @@ ShellCommandRunMm ( Complete = FALSE; do { ShellMmAccess (AccessType, PciRootBridgeIo, CpuIo, TRUE, Address, Size, &Buffer); - ShellPrintHiiEx (-1, -1, NULL, mShellMmAccessTypeStr[AccessType], gShellDebug1HiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MM_ADDRESS), gShellDebug1HiiHandle, Address); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MM_BUF), gShellDebug1HiiHandle, Size * 2, Buffer & mShellMmMaxNumber[Size]); + ShellPrintHiiDefaultEx (mShellMmAccessTypeStr[AccessType], gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MM_ADDRESS), gShellDebug1HiiHandle, Address); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MM_BUF), gShellDebug1HiiHandle, Size * 2, Buffer & mShellMmMaxNumber[Size]); ShellPrintEx (-1, -1, L" > "); // // wait user input to modify @@ -651,7 +651,7 @@ ShellCommandRunMm ( { ShellMmAccess (AccessType, PciRootBridgeIo, CpuIo, FALSE, Address, Size, &Buffer); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MM_ERROR), gShellDebug1HiiHandle, L"mm"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MM_ERROR), gShellDebug1HiiHandle, L"mm"); continue; } } diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Mode.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Mode.c index c0e288632d91..650300eb8586 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Mode.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Mode.c @@ -52,7 +52,7 @@ ShellCommandRunMode ( Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"mode", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"mode", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -60,28 +60,28 @@ ShellCommandRunMode ( } } else { if (ShellCommandLineGetCount (Package) > 3) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"mode"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"mode"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetCount (Package) == 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"mode"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"mode"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetCount (Package) == 3) { Temp = ShellCommandLineGetRawValue (Package, 1); if (Temp == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"mode", Temp); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"mode", Temp); ShellStatus = SHELL_INVALID_PARAMETER; } else if (!ShellIsHexOrDecimalNumber (Temp, FALSE, FALSE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"mode", Temp); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"mode", Temp); ShellStatus = SHELL_INVALID_PARAMETER; } NewCol = ShellStrToUintn (Temp); Temp = ShellCommandLineGetRawValue (Package, 2); if (Temp == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"mode", Temp); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"mode", Temp); ShellStatus = SHELL_INVALID_PARAMETER; } else if (!ShellIsHexOrDecimalNumber (Temp, FALSE, FALSE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"mode", Temp); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"mode", Temp); ShellStatus = SHELL_INVALID_PARAMETER; } @@ -96,7 +96,7 @@ ShellCommandRunMode ( if ((Col == NewCol) && (Row == NewRow)) { Status = gST->ConOut->SetMode (gST->ConOut, LoopVar); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MODE_SET_FAIL), gShellDebug1HiiHandle, L"mode"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MODE_SET_FAIL), gShellDebug1HiiHandle, L"mode"); ShellStatus = SHELL_DEVICE_ERROR; } else { // worked fine... @@ -108,21 +108,21 @@ ShellCommandRunMode ( } if (!Done) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MODE_NO_MATCH), gShellDebug1HiiHandle, L"mode"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MODE_NO_MATCH), gShellDebug1HiiHandle, L"mode"); ShellStatus = SHELL_INVALID_PARAMETER; } } else if (ShellCommandLineGetCount (Package) == 1) { // // print out valid // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MODE_LIST_HEAD), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MODE_LIST_HEAD), gShellDebug1HiiHandle); for (LoopVar = 0, Done = FALSE; LoopVar < gST->ConOut->Mode->MaxMode && ShellStatus == SHELL_SUCCESS; LoopVar++) { Status = gST->ConOut->QueryMode (gST->ConOut, LoopVar, &Col, &Row); if (EFI_ERROR (Status)) { continue; } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MODE_LIST_ITEM), gShellDebug1HiiHandle, Col, Row, LoopVar == gST->ConOut->Mode->Mode ? L'*' : L' '); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MODE_LIST_ITEM), gShellDebug1HiiHandle, Col, Row, LoopVar == gST->ConOut->Mode->Mode ? L'*' : L' '); } } diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c index 991aed320964..e15bfbd42401 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c @@ -2492,7 +2492,7 @@ ShellCommandRunPci ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"pci", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"pci", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -2500,25 +2500,25 @@ ShellCommandRunPci ( } } else { if (ShellCommandLineGetCount (Package) == 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"pci"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"pci"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (ShellCommandLineGetCount (Package) > 4) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"pci"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"pci"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (ShellCommandLineGetFlag (Package, L"-ec") && (ShellCommandLineGetValue (Package, L"-ec") == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"pci", L"-ec"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"pci", L"-ec"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (ShellCommandLineGetFlag (Package, L"-s") && (ShellCommandLineGetValue (Package, L"-s") == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"pci", L"-s"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"pci", L"-s"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -2531,7 +2531,7 @@ ShellCommandRunPci ( HandleBufSize = sizeof (EFI_HANDLE); HandleBuf = (EFI_HANDLE *)AllocateZeroPool (HandleBufSize); if (HandleBuf == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"pci"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"pci"); ShellStatus = SHELL_OUT_OF_RESOURCES; goto Done; } @@ -2547,7 +2547,7 @@ ShellCommandRunPci ( if (Status == EFI_BUFFER_TOO_SMALL) { HandleBuf = ReallocatePool (sizeof (EFI_HANDLE), HandleBufSize, HandleBuf); if (HandleBuf == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"pci"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"pci"); ShellStatus = SHELL_OUT_OF_RESOURCES; goto Done; } @@ -2562,7 +2562,7 @@ ShellCommandRunPci ( } if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PCIRBIO_NF), gShellDebug1HiiHandle, L"pci"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PCIRBIO_NF), gShellDebug1HiiHandle, L"pci"); ShellStatus = SHELL_NOT_FOUND; goto Done; } @@ -2598,7 +2598,7 @@ ShellCommandRunPci ( &Descriptors ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI_HANDLE_CFG_ERR), gShellDebug1HiiHandle, L"pci"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI_HANDLE_CFG_ERR), gShellDebug1HiiHandle, L"pci"); ShellStatus = SHELL_NOT_FOUND; goto Done; } @@ -2612,7 +2612,7 @@ ShellCommandRunPci ( Status = PciGetNextBusRange (&Descriptors, &MinBus, &MaxBus, &IsEnd); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI_BUS_RANGE_ERR), gShellDebug1HiiHandle, L"pci"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI_BUS_RANGE_ERR), gShellDebug1HiiHandle, L"pci"); ShellStatus = SHELL_NOT_FOUND; goto Done; } @@ -2657,7 +2657,7 @@ ShellCommandRunPci ( if (PciHeader.VendorId != 0xffff) { if (PrintTitle) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI_TITLE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI_TITLE), gShellDebug1HiiHandle); PrintTitle = FALSE; } @@ -2669,10 +2669,7 @@ ShellCommandRunPci ( &PciHeader ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_LINE_P1), gShellDebug1HiiHandle, IoDev->SegmentNumber, @@ -2682,10 +2679,7 @@ ShellCommandRunPci ( ); PciPrintClassCode (PciHeader.ClassCode, FALSE); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_LINE_P2), gShellDebug1HiiHandle, PciHeader.VendorId, @@ -2747,7 +2741,7 @@ ShellCommandRunPci ( if (!EFI_ERROR (ShellConvertStringToUint64 (Temp, &RetVal, TRUE, TRUE))) { Segment = (UINT16)RetVal; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV_HEX), gShellDebug1HiiHandle, L"pci", Temp); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV_HEX), gShellDebug1HiiHandle, L"pci", Temp); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -2765,13 +2759,13 @@ ShellCommandRunPci ( if (!EFI_ERROR (ShellConvertStringToUint64 (Temp, &RetVal, TRUE, TRUE))) { Bus = (UINT16)RetVal; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV_HEX), gShellDebug1HiiHandle, L"pci", Temp); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV_HEX), gShellDebug1HiiHandle, L"pci", Temp); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (Bus > PCI_MAX_BUS) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"pci", Temp); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"pci", Temp); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -2785,13 +2779,13 @@ ShellCommandRunPci ( if (!EFI_ERROR (ShellConvertStringToUint64 (Temp, &RetVal, TRUE, TRUE))) { Device = (UINT16)RetVal; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV_HEX), gShellDebug1HiiHandle, L"pci", Temp); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV_HEX), gShellDebug1HiiHandle, L"pci", Temp); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (Device > PCI_MAX_DEVICE) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"pci", Temp); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"pci", Temp); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -2805,13 +2799,13 @@ ShellCommandRunPci ( if (!EFI_ERROR (ShellConvertStringToUint64 (Temp, &RetVal, TRUE, TRUE))) { Func = (UINT16)RetVal; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV_HEX), gShellDebug1HiiHandle, L"pci", Temp); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV_HEX), gShellDebug1HiiHandle, L"pci", Temp); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (Func > PCI_MAX_FUNC) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"pci", Temp); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"pci", Temp); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -2825,7 +2819,7 @@ ShellCommandRunPci ( if (!EFI_ERROR (ShellConvertStringToUint64 (Temp, &RetVal, TRUE, TRUE))) { ExtendedCapability = (UINT16)RetVal; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV_HEX), gShellDebug1HiiHandle, L"pci", Temp); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV_HEX), gShellDebug1HiiHandle, L"pci", Temp); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -2844,10 +2838,7 @@ ShellCommandRunPci ( ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_NO_FIND), gShellDebug1HiiHandle, L"pci", @@ -2868,16 +2859,13 @@ ShellCommandRunPci ( ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI_NO_CFG), gShellDebug1HiiHandle, L"pci"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI_NO_CFG), gShellDebug1HiiHandle, L"pci"); ShellStatus = SHELL_ACCESS_DENIED; goto Done; } mConfigSpace = &ConfigSpace; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_INFO), gShellDebug1HiiHandle, Segment, @@ -3171,10 +3159,7 @@ PciExplainPci ( // // Print Vendor Id and Device Id // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_LINE_VID_DID), gShellDebug1HiiHandle, INDEX_OF (&(Common->VendorId)), @@ -3197,10 +3182,7 @@ PciExplainPci ( // Print register Revision ID // ShellPrintEx (-1, -1, L"\r\n"); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_LINE_RID), gShellDebug1HiiHandle, INDEX_OF (&(Common->RevisionID)), @@ -3210,20 +3192,17 @@ PciExplainPci ( // // Print register BIST // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI_LINE_BIST), gShellDebug1HiiHandle, INDEX_OF (&(Common->BIST))); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI_LINE_BIST), gShellDebug1HiiHandle, INDEX_OF (&(Common->BIST))); if ((Common->BIST & BIT7) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI_LINE_CAP), gShellDebug1HiiHandle, 0x0f & Common->BIST); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI_LINE_CAP), gShellDebug1HiiHandle, 0x0f & Common->BIST); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI_LINE_CAP_NO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI_LINE_CAP_NO), gShellDebug1HiiHandle); } // // Print register Cache Line Size // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_CACHE_LINE_SIZE), gShellDebug1HiiHandle, INDEX_OF (&(Common->CacheLineSize)), @@ -3233,10 +3212,7 @@ PciExplainPci ( // // Print register Latency Timer // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_LATENCY_TIMER), gShellDebug1HiiHandle, INDEX_OF (&(Common->LatencyTimer)), @@ -3246,10 +3222,7 @@ PciExplainPci ( // // Print register Header Type // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_HEADER_TYPE), gShellDebug1HiiHandle, INDEX_OF (&(Common->HeaderType)), @@ -3257,34 +3230,34 @@ PciExplainPci ( ); if ((Common->HeaderType & BIT7) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_MULTI_FUNCTION), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_MULTI_FUNCTION), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_SINGLE_FUNCTION), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_SINGLE_FUNCTION), gShellDebug1HiiHandle); } HeaderType = (PCI_HEADER_TYPE)(UINT8)(Common->HeaderType & 0x7f); switch (HeaderType) { case PciDevice: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_PCI_DEVICE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_PCI_DEVICE), gShellDebug1HiiHandle); break; case PciP2pBridge: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_P2P_BRIDGE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_P2P_BRIDGE), gShellDebug1HiiHandle); break; case PciCardBusBridge: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_CARDBUS_BRIDGE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_CARDBUS_BRIDGE), gShellDebug1HiiHandle); break; default: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_RESERVED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_RESERVED), gShellDebug1HiiHandle); HeaderType = PciUndefined; } // // Print register Class Code // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_CLASS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_CLASS), gShellDebug1HiiHandle); PciPrintClassCode ((UINT8 *)Common->ClassCode, TRUE); ShellPrintEx (-1, -1, L"\r\n"); } @@ -3315,7 +3288,7 @@ PciExplainDeviceData ( // exist. If these no Bar for this function, print "none", otherwise // list detail information about this Bar. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_BASE_ADDR), gShellDebug1HiiHandle, INDEX_OF (Device->Bar)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_BASE_ADDR), gShellDebug1HiiHandle, INDEX_OF (Device->Bar)); BarExist = FALSE; BarCount = sizeof (Device->Bar) / sizeof (Device->Bar[0]); @@ -3326,7 +3299,7 @@ PciExplainDeviceData ( if (!BarExist) { BarExist = TRUE; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_START_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_START_TYPE), gShellDebug1HiiHandle); ShellPrintEx (-1, -1, L" --------------------------------------------------------------------------"); } @@ -3344,7 +3317,7 @@ PciExplainDeviceData ( } if (!BarExist) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_NONE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_NONE), gShellDebug1HiiHandle); } else { ShellPrintEx (-1, -1, L"\r\n --------------------------------------------------------------------------"); } @@ -3353,12 +3326,9 @@ PciExplainDeviceData ( // Print register Expansion ROM Base Address // if ((Device->ExpansionRomBar & BIT0) == 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_EXPANSION_ROM_DISABLED), gShellDebug1HiiHandle, INDEX_OF (&(Device->ExpansionRomBar))); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_EXPANSION_ROM_DISABLED), gShellDebug1HiiHandle, INDEX_OF (&(Device->ExpansionRomBar))); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_EXPANSION_ROM_BASE), gShellDebug1HiiHandle, INDEX_OF (&(Device->ExpansionRomBar)), @@ -3369,10 +3339,7 @@ PciExplainDeviceData ( // // Print register Cardbus CIS ptr // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_CARDBUS_CIS), gShellDebug1HiiHandle, INDEX_OF (&(Device->CISPtr)), @@ -3382,20 +3349,14 @@ PciExplainDeviceData ( // // Print register Sub-vendor ID and subsystem ID // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_SUB_VENDOR_ID), gShellDebug1HiiHandle, INDEX_OF (&(Device->SubsystemVendorID)), Device->SubsystemVendorID ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_SUBSYSTEM_ID), gShellDebug1HiiHandle, INDEX_OF (&(Device->SubsystemID)), @@ -3405,10 +3366,7 @@ PciExplainDeviceData ( // // Print register Capabilities Ptr // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_CAPABILITIES_PTR), gShellDebug1HiiHandle, INDEX_OF (&(Device->CapabilityPtr)), @@ -3418,20 +3376,14 @@ PciExplainDeviceData ( // // Print register Interrupt Line and interrupt pin // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_INTERRUPT_LINE), gShellDebug1HiiHandle, INDEX_OF (&(Device->InterruptLine)), Device->InterruptLine ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_INTERRUPT_PIN), gShellDebug1HiiHandle, INDEX_OF (&(Device->InterruptPin)), @@ -3441,20 +3393,14 @@ PciExplainDeviceData ( // // Print register Min_Gnt and Max_Lat // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_MIN_GNT), gShellDebug1HiiHandle, INDEX_OF (&(Device->MinGnt)), Device->MinGnt ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_MAX_LAT), gShellDebug1HiiHandle, INDEX_OF (&(Device->MaxLat)), @@ -3491,7 +3437,7 @@ PciExplainBridgeData ( // exist. If these no Bar for this function, print "none", otherwise // list detail information about this Bar. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_BASE_ADDRESS), gShellDebug1HiiHandle, INDEX_OF (&(Bridge->Bar))); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_BASE_ADDRESS), gShellDebug1HiiHandle, INDEX_OF (&(Bridge->Bar))); BarExist = FALSE; BarCount = sizeof (Bridge->Bar) / sizeof (Bridge->Bar[0]); @@ -3503,7 +3449,7 @@ PciExplainBridgeData ( if (!BarExist) { BarExist = TRUE; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_START_TYPE_2), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_START_TYPE_2), gShellDebug1HiiHandle); ShellPrintEx (-1, -1, L" --------------------------------------------------------------------------"); } @@ -3521,7 +3467,7 @@ PciExplainBridgeData ( } if (!BarExist) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_NONE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_NONE), gShellDebug1HiiHandle); } else { ShellPrintEx (-1, -1, L"\r\n --------------------------------------------------------------------------"); } @@ -3530,12 +3476,9 @@ PciExplainBridgeData ( // Expansion register ROM Base Address // if ((Bridge->ExpansionRomBAR & BIT0) == 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_NO_EXPANSION_ROM), gShellDebug1HiiHandle, INDEX_OF (&(Bridge->ExpansionRomBAR))); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_NO_EXPANSION_ROM), gShellDebug1HiiHandle, INDEX_OF (&(Bridge->ExpansionRomBAR))); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_EXPANSION_ROM_BASE_2), gShellDebug1HiiHandle, INDEX_OF (&(Bridge->ExpansionRomBAR)), @@ -3546,10 +3489,7 @@ PciExplainBridgeData ( // // Print Bus Numbers(Primary, Secondary, and Subordinate // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_BUS_NUMBERS), gShellDebug1HiiHandle, INDEX_OF (&(Bridge->PrimaryBus)), @@ -3559,17 +3499,14 @@ PciExplainBridgeData ( ShellPrintEx (-1, -1, L" ------------------------------------------------------\r\n"); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_BRIDGE), gShellDebug1HiiHandle, Bridge->PrimaryBus); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_BRIDGE), gShellDebug1HiiHandle, Bridge->SecondaryBus); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_BRIDGE), gShellDebug1HiiHandle, Bridge->SubordinateBus); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_BRIDGE), gShellDebug1HiiHandle, Bridge->PrimaryBus); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_BRIDGE), gShellDebug1HiiHandle, Bridge->SecondaryBus); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_BRIDGE), gShellDebug1HiiHandle, Bridge->SubordinateBus); // // Print register Secondary Latency Timer // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_SECONDARY_TIMER), gShellDebug1HiiHandle, INDEX_OF (&(Bridge->SecondaryLatencyTimer)), @@ -3586,7 +3523,7 @@ PciExplainBridgeData ( // types: I/O, memory, and pre-fetchable memory. For each resource type, // base and limit address are listed. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_RESOURCE_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_RESOURCE_TYPE), gShellDebug1HiiHandle); ShellPrintEx (-1, -1, L"----------------------------------------------------------------------\r\n"); // @@ -3594,10 +3531,7 @@ PciExplainBridgeData ( // IoAddress32 = (Bridge->IoBaseUpper16 << 16 | Bridge->IoBase << 8); IoAddress32 &= 0xfffff000; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_TWO_VARS), gShellDebug1HiiHandle, INDEX_OF (&(Bridge->IoBase)), @@ -3606,25 +3540,19 @@ PciExplainBridgeData ( IoAddress32 = (Bridge->IoLimitUpper16 << 16 | Bridge->IoLimit << 8); IoAddress32 |= 0x00000fff; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_ONE_VAR), gShellDebug1HiiHandle, IoAddress32); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_ONE_VAR), gShellDebug1HiiHandle, IoAddress32); // // Memory Base & Limit // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_MEMORY), gShellDebug1HiiHandle, INDEX_OF (&(Bridge->MemoryBase)), (Bridge->MemoryBase << 16) & 0xfff00000 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_ONE_VAR), gShellDebug1HiiHandle, (Bridge->MemoryLimit << 16) | 0x000fffff @@ -3633,10 +3561,7 @@ PciExplainBridgeData ( // // Pre-fetch-able Memory Base & Limit // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_PREFETCHABLE), gShellDebug1HiiHandle, INDEX_OF (&(Bridge->PrefetchableMemoryBase)), @@ -3644,10 +3569,7 @@ PciExplainBridgeData ( (Bridge->PrefetchableMemoryBase << 16) & 0xfff00000 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_TWO_VARS_2), gShellDebug1HiiHandle, Bridge->PrefetchableLimitUpper32, @@ -3657,10 +3579,7 @@ PciExplainBridgeData ( // // Print register Capabilities Pointer // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_CAPABILITIES_PTR_2), gShellDebug1HiiHandle, INDEX_OF (&(Bridge->CapabilityPtr)), @@ -3675,20 +3594,14 @@ PciExplainBridgeData ( // // Print register Interrupt Line & PIN // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_INTERRUPT_LINE_2), gShellDebug1HiiHandle, INDEX_OF (&(Bridge->InterruptLine)), Bridge->InterruptLine ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_INTERRUPT_PIN), gShellDebug1HiiHandle, INDEX_OF (&(Bridge->InterruptPin)), @@ -3745,37 +3658,37 @@ PciExplainBar ( IsMem = TRUE; if (((*Bar & BIT1) == 0) && ((*Bar & BIT2) == 0)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_BAR), gShellDebug1HiiHandle, *Bar & 0xfffffff0); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_MEM), gShellDebug1HiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_32_BITS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_BAR), gShellDebug1HiiHandle, *Bar & 0xfffffff0); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_MEM), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_32_BITS), gShellDebug1HiiHandle); } else if (((*Bar & BIT1) == 0) && ((*Bar & BIT2) != 0)) { Bar64 = 0x0; CopyMem (&Bar64, Bar, sizeof (UINT64)); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_ONE_VAR_2), gShellDebug1HiiHandle, (UINT32)RShiftU64 ((Bar64 & 0xfffffffffffffff0ULL), 32)); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_ONE_VAR_3), gShellDebug1HiiHandle, (UINT32)(Bar64 & 0xfffffffffffffff0ULL)); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_MEM), gShellDebug1HiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_64_BITS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_ONE_VAR_2), gShellDebug1HiiHandle, (UINT32)RShiftU64 ((Bar64 & 0xfffffffffffffff0ULL), 32)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_ONE_VAR_3), gShellDebug1HiiHandle, (UINT32)(Bar64 & 0xfffffffffffffff0ULL)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_MEM), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_64_BITS), gShellDebug1HiiHandle); IsBar32 = FALSE; *Index += 1; } else { // // Reserved // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_BAR), gShellDebug1HiiHandle, *Bar & 0xfffffff0); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_MEM_2), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_BAR), gShellDebug1HiiHandle, *Bar & 0xfffffff0); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_MEM_2), gShellDebug1HiiHandle); } if ((*Bar & BIT3) == 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_NO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_NO), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_YES), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_YES), gShellDebug1HiiHandle); } } else { // // This bar is of io type // IsMem = FALSE; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_ONE_VAR_4), gShellDebug1HiiHandle, *Bar & 0xfffffffc); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_ONE_VAR_4), gShellDebug1HiiHandle, *Bar & 0xfffffffc); ShellPrintEx (-1, -1, L"I/O "); } @@ -3842,25 +3755,22 @@ PciExplainBar ( if (IsMem) { if (IsBar32) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_NEWBAR_32), gShellDebug1HiiHandle, NewBar32); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_NEWBAR_32_2), gShellDebug1HiiHandle, NewBar32 + (*Bar & 0xfffffff0) - 1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_NEWBAR_32), gShellDebug1HiiHandle, NewBar32); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_NEWBAR_32_2), gShellDebug1HiiHandle, NewBar32 + (*Bar & 0xfffffff0) - 1); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_RSHIFT), gShellDebug1HiiHandle, (UINT32)RShiftU64 (NewBar64, 32)); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_RSHIFT), gShellDebug1HiiHandle, (UINT32)NewBar64); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_RSHIFT), gShellDebug1HiiHandle, (UINT32)RShiftU64 (NewBar64, 32)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_RSHIFT), gShellDebug1HiiHandle, (UINT32)NewBar64); ShellPrintEx (-1, -1, L" "); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_RSHIFT), gShellDebug1HiiHandle, (UINT32)RShiftU64 ((NewBar64 + (Bar64 & 0xfffffffffffffff0ULL) - 1), 32) ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_RSHIFT), gShellDebug1HiiHandle, (UINT32)(NewBar64 + (Bar64 & 0xfffffffffffffff0ULL) - 1)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_RSHIFT), gShellDebug1HiiHandle, (UINT32)(NewBar64 + (Bar64 & 0xfffffffffffffff0ULL) - 1)); } } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_NEWBAR_32_3), gShellDebug1HiiHandle, NewBar32); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_NEWBAR_32_4), gShellDebug1HiiHandle, NewBar32 + (*Bar & 0xfffffffc) - 1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_NEWBAR_32_3), gShellDebug1HiiHandle, NewBar32); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_NEWBAR_32_4), gShellDebug1HiiHandle, NewBar32 + (*Bar & 0xfffffffc) - 1); } return EFI_SUCCESS; @@ -3885,10 +3795,7 @@ PciExplainCardBusData ( BOOLEAN Io32Bit; PCI_CARDBUS_DATA *CardBusData; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_CARDBUS_SOCKET), gShellDebug1HiiHandle, INDEX_OF (&(CardBus->CardBusSocketReg)), @@ -3904,10 +3811,7 @@ PciExplainCardBusData ( // Print Bus Numbers(Primary bus number, CardBus bus number, and // Subordinate bus number // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_BUS_NUMBERS_2), gShellDebug1HiiHandle, INDEX_OF (&(CardBus->PciBusNumber)), @@ -3917,17 +3821,14 @@ PciExplainCardBusData ( ShellPrintEx (-1, -1, L" ------------------------------------------------------\r\n"); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_CARDBUS), gShellDebug1HiiHandle, CardBus->PciBusNumber); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_CARDBUS_2), gShellDebug1HiiHandle, CardBus->CardBusBusNumber); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_CARDBUS_3), gShellDebug1HiiHandle, CardBus->SubordinateBusNumber); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_CARDBUS), gShellDebug1HiiHandle, CardBus->PciBusNumber); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_CARDBUS_2), gShellDebug1HiiHandle, CardBus->CardBusBusNumber); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_CARDBUS_3), gShellDebug1HiiHandle, CardBus->SubordinateBusNumber); // // Print CardBus Latency Timer // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_CARDBUS_LATENCY), gShellDebug1HiiHandle, INDEX_OF (&(CardBus->CardBusLatencyTimer)), @@ -3937,13 +3838,10 @@ PciExplainCardBusData ( // // Print Memory/Io ranges this cardbus bridge forwards // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_RESOURCE_TYPE_2), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_RESOURCE_TYPE_2), gShellDebug1HiiHandle); ShellPrintEx (-1, -1, L"----------------------------------------------------------------------\r\n"); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_MEM_3), gShellDebug1HiiHandle, INDEX_OF (&(CardBus->MemoryBase0)), @@ -3952,10 +3850,7 @@ PciExplainCardBusData ( CardBus->MemoryLimit0 | 0x00000fff ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_MEM_3), gShellDebug1HiiHandle, INDEX_OF (&(CardBus->MemoryBase1)), @@ -3965,10 +3860,7 @@ PciExplainCardBusData ( ); Io32Bit = (BOOLEAN)(CardBus->IoBase0 & BIT0); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_IO_2), gShellDebug1HiiHandle, INDEX_OF (&(CardBus->IoBase0)), @@ -3978,10 +3870,7 @@ PciExplainCardBusData ( ); Io32Bit = (BOOLEAN)(CardBus->IoBase1 & BIT0); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_IO_2), gShellDebug1HiiHandle, INDEX_OF (&(CardBus->IoBase1)), @@ -3993,10 +3882,7 @@ PciExplainCardBusData ( // // Print register Interrupt Line & PIN // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_INTERRUPT_LINE_3), gShellDebug1HiiHandle, INDEX_OF (&(CardBus->InterruptLine)), @@ -4017,10 +3903,7 @@ PciExplainCardBusData ( // CardBusData = (PCI_CARDBUS_DATA *)((UINT8 *)CardBus + sizeof (PCI_CARDBUS_CONTROL_REGISTER)); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_SUB_VENDOR_ID_2), gShellDebug1HiiHandle, INDEX_OF (&(CardBusData->SubVendorId)), @@ -4029,10 +3912,7 @@ PciExplainCardBusData ( CardBusData->SubSystemId ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_OPTIONAL), gShellDebug1HiiHandle, INDEX_OF (&(CardBusData->LegacyBase)), @@ -4061,90 +3941,72 @@ PciExplainStatus ( ) { if (MainStatus) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_STATUS), gShellDebug1HiiHandle, INDEX_OF (Status), *Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_STATUS), gShellDebug1HiiHandle, INDEX_OF (Status), *Status); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_SECONDARY_STATUS), gShellDebug1HiiHandle, INDEX_OF (Status), *Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_SECONDARY_STATUS), gShellDebug1HiiHandle, INDEX_OF (Status), *Status); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_NEW_CAPABILITIES), gShellDebug1HiiHandle, (*Status & BIT4) != 0); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_NEW_CAPABILITIES), gShellDebug1HiiHandle, (*Status & BIT4) != 0); // // Bit 5 is meaningless for CardBus Bridge // if (HeaderType == PciCardBusBridge) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_66_CAPABLE), gShellDebug1HiiHandle, (*Status & BIT5) != 0); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_66_CAPABLE), gShellDebug1HiiHandle, (*Status & BIT5) != 0); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_66_CAPABLE_2), gShellDebug1HiiHandle, (*Status & BIT5) != 0); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_66_CAPABLE_2), gShellDebug1HiiHandle, (*Status & BIT5) != 0); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_FAST_BACK), gShellDebug1HiiHandle, (*Status & BIT7) != 0); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_FAST_BACK), gShellDebug1HiiHandle, (*Status & BIT7) != 0); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_MASTER_DATA), gShellDebug1HiiHandle, (*Status & BIT8) != 0); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_MASTER_DATA), gShellDebug1HiiHandle, (*Status & BIT8) != 0); // // Bit 9 and bit 10 together decides the DEVSEL timing // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_DEVSEL_TIMING), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_DEVSEL_TIMING), gShellDebug1HiiHandle); if (((*Status & BIT9) == 0) && ((*Status & BIT10) == 0)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_FAST), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_FAST), gShellDebug1HiiHandle); } else if (((*Status & BIT9) != 0) && ((*Status & BIT10) == 0)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_MEDIUM), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_MEDIUM), gShellDebug1HiiHandle); } else if (((*Status & BIT9) == 0) && ((*Status & BIT10) != 0)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_SLOW), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_SLOW), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_RESERVED_2), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_RESERVED_2), gShellDebug1HiiHandle); } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_SIGNALED_TARGET), gShellDebug1HiiHandle, (*Status & BIT11) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_RECEIVED_TARGET), gShellDebug1HiiHandle, (*Status & BIT12) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_RECEIVED_MASTER), gShellDebug1HiiHandle, (*Status & BIT13) != 0 ); if (MainStatus) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_SIGNALED_ERROR), gShellDebug1HiiHandle, (*Status & BIT14) != 0 ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_RECEIVED_ERROR), gShellDebug1HiiHandle, (*Status & BIT14) != 0 ); } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_DETECTED_ERROR), gShellDebug1HiiHandle, (*Status & BIT15) != 0 @@ -4168,96 +4030,66 @@ PciExplainCommand ( // // Print the binary value of register Command // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PCI2_COMMAND), gShellDebug1HiiHandle, INDEX_OF (Command), *Command); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_COMMAND), gShellDebug1HiiHandle, INDEX_OF (Command), *Command); // // Explain register Command bit by bit // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_SPACE_ACCESS_DENIED), gShellDebug1HiiHandle, (*Command & BIT0) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_MEMORY_SPACE), gShellDebug1HiiHandle, (*Command & BIT1) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_BEHAVE_BUS_MASTER), gShellDebug1HiiHandle, (*Command & BIT2) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_MONITOR_SPECIAL_CYCLE), gShellDebug1HiiHandle, (*Command & BIT3) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_MEM_WRITE_INVALIDATE), gShellDebug1HiiHandle, (*Command & BIT4) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_PALETTE_SNOOPING), gShellDebug1HiiHandle, (*Command & BIT5) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_ASSERT_PERR), gShellDebug1HiiHandle, (*Command & BIT6) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_DO_ADDR_STEPPING), gShellDebug1HiiHandle, (*Command & BIT7) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_SERR_DRIVER), gShellDebug1HiiHandle, (*Command & BIT8) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_FAST_BACK_2), gShellDebug1HiiHandle, (*Command & BIT9) != 0 @@ -4280,52 +4112,34 @@ PciExplainBridgeControl ( IN PCI_HEADER_TYPE HeaderType ) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_BRIDGE_CONTROL), gShellDebug1HiiHandle, INDEX_OF (BridgeControl), *BridgeControl ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_PARITY_ERROR), gShellDebug1HiiHandle, (*BridgeControl & BIT0) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_SERR_ENABLE), gShellDebug1HiiHandle, (*BridgeControl & BIT1) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_ISA_ENABLE), gShellDebug1HiiHandle, (*BridgeControl & BIT2) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_VGA_ENABLE), gShellDebug1HiiHandle, (*BridgeControl & BIT3) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_MASTER_ABORT), gShellDebug1HiiHandle, (*BridgeControl & BIT5) != 0 @@ -4336,75 +4150,48 @@ PciExplainBridgeControl ( // and Cardbus bridge from bit 6 to bit 11. // if (HeaderType == PciP2pBridge) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_SECONDARY_BUS_RESET), gShellDebug1HiiHandle, (*BridgeControl & BIT6) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_FAST_ENABLE), gShellDebug1HiiHandle, (*BridgeControl & BIT7) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_PRIMARY_DISCARD_TIMER), gShellDebug1HiiHandle, (*BridgeControl & BIT8) != 0 ? L"2^10" : L"2^15" ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_SECONDARY_DISCARD_TIMER), gShellDebug1HiiHandle, (*BridgeControl & BIT9) != 0 ? L"2^10" : L"2^15" ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_DISCARD_TIMER_STATUS), gShellDebug1HiiHandle, (*BridgeControl & BIT10) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_DISCARD_TIMER_SERR), gShellDebug1HiiHandle, (*BridgeControl & BIT11) != 0 ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_CARDBUS_RESET), gShellDebug1HiiHandle, (*BridgeControl & BIT6) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_IREQ_ENABLE), gShellDebug1HiiHandle, (*BridgeControl & BIT7) != 0 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_WRITE_POSTING_ENABLE), gShellDebug1HiiHandle, (*BridgeControl & BIT10) != 0 @@ -5439,10 +5226,7 @@ PrintInterpretedExtendedCompatibilityLinkControl ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_INTERNAL_LINK_CONTROL *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_LINK_CONTROL), gShellDebug1HiiHandle, Header->RootComplexLinkCapabilities, @@ -5474,10 +5258,7 @@ PrintInterpretedExtendedCompatibilityPowerBudgeting ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_POWER_BUDGETING *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_POWER), gShellDebug1HiiHandle, Header->DataSelect, @@ -5512,10 +5293,7 @@ PrintInterpretedExtendedCompatibilityAcs ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_ACS_EXTENDED *)HeaderAddress; VectorSize = 0; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_ACS), gShellDebug1HiiHandle, Header->AcsCapability, @@ -5528,10 +5306,7 @@ PrintInterpretedExtendedCompatibilityAcs ( } for (LoopCounter = 0; LoopCounter * 8 < VectorSize; LoopCounter++) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_ACS2), gShellDebug1HiiHandle, LoopCounter + 1, @@ -5565,10 +5340,7 @@ PrintInterpretedExtendedCompatibilityLatencyToleranceReporting ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_LATENCE_TOLERANCE_REPORTING *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_LAT), gShellDebug1HiiHandle, Header->MaxSnoopLatency, @@ -5599,10 +5371,7 @@ PrintInterpretedExtendedCompatibilitySerialNumber ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_SERIAL_NUMBER *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_SN), gShellDebug1HiiHandle, Header->SerialNumber @@ -5632,10 +5401,7 @@ PrintInterpretedExtendedCompatibilityRcrb ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_RCRB_HEADER *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_RCRB), gShellDebug1HiiHandle, Header->VendorId, @@ -5668,10 +5434,7 @@ PrintInterpretedExtendedCompatibilityVendorSpecific ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_VENDOR_SPECIFIC *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_VEN), gShellDebug1HiiHandle, Header->VendorSpecificHeader @@ -5701,10 +5464,7 @@ PrintInterpretedExtendedCompatibilityECEA ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_ECEA), gShellDebug1HiiHandle, Header->AssociationBitmap @@ -5734,10 +5494,7 @@ PrintInterpretedExtendedCompatibilityAri ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_ARI_CAPABILITY *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_ARI), gShellDebug1HiiHandle, Header->AriCapability, @@ -5769,10 +5526,7 @@ PrintInterpretedExtendedCompatibilityDynamicPowerAllocation ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_DYNAMIC_POWER_ALLOCATION *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_DPA), gShellDebug1HiiHandle, Header->DpaCapability, @@ -5781,10 +5535,7 @@ PrintInterpretedExtendedCompatibilityDynamicPowerAllocation ( Header->DpaControl ); for (LinkCount = 0; LinkCount < PCI_EXPRESS_EXTENDED_CAPABILITY_DYNAMIC_POWER_ALLOCATION_GET_SUBSTATE_MAX (Header) + (UINT32)1; LinkCount++) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_DPA2), gShellDebug1HiiHandle, LinkCount+1, @@ -5818,20 +5569,14 @@ PrintInterpretedExtendedCompatibilityLinkDeclaration ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_LINK_DECLARATION *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_LINK_DECLAR), gShellDebug1HiiHandle, Header->ElementSelfDescription ); for (LinkCount = 0; LinkCount < PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_DECLARATION_GET_LINK_COUNT (Header); LinkCount++) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_LINK_DECLAR2), gShellDebug1HiiHandle, LinkCount+1, @@ -5864,10 +5609,7 @@ PrintInterpretedExtendedCompatibilityAer ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_ADVANCED_ERROR_REPORTING *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_AER), gShellDebug1HiiHandle, Header->UncorrectableErrorStatus, @@ -5916,10 +5658,7 @@ PrintInterpretedExtendedCompatibilityMulticast ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_MULTICAST *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_MULTICAST), gShellDebug1HiiHandle, Header->MultiCastCapability, @@ -5959,10 +5698,7 @@ PrintInterpretedExtendedCompatibilityVirtualChannel ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_CAPABILITY *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_VC_BASE), gShellDebug1HiiHandle, Header->ExtendedVcCount, @@ -5974,10 +5710,7 @@ PrintInterpretedExtendedCompatibilityVirtualChannel ( ); for (ItemCount = 0; ItemCount < Header->ExtendedVcCount; ItemCount++) { CapabilityItem = &Header->Capability[ItemCount]; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_VC_ITEM), gShellDebug1HiiHandle, ItemCount+1, @@ -6017,10 +5750,7 @@ PrintInterpretedExtendedCompatibilityResizeableBar ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_RESIZABLE_BAR *)HeaderAddress; for (ItemCount = 0; ItemCount < (UINT32)GET_NUMBER_RESIZABLE_BARS (Header); ItemCount++) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_RESIZE_BAR), gShellDebug1HiiHandle, ItemCount+1, @@ -6055,10 +5785,7 @@ PrintInterpretedExtendedCompatibilityTph ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_TPH *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_TPH), gShellDebug1HiiHandle, Header->TphRequesterCapability, @@ -6099,10 +5826,7 @@ PrintInterpretedExtendedCompatibilitySecondary ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_SECONDARY_PCIE *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_SECONDARY), gShellDebug1HiiHandle, Header->LinkControl3.Uint32, @@ -6142,10 +5866,7 @@ PrintInterpretedExtendedCompatibilityAts ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_ATS *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_ATS), gShellDebug1HiiHandle, Header->Capability.Uint16, @@ -6178,10 +5899,7 @@ PrintInterpretedExtendedCompatibilitySriov ( Header = (SR_IOV_CAPABILITY_REGISTER *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_SRIOV), gShellDebug1HiiHandle, Header->Capability, @@ -6198,10 +5916,7 @@ PrintInterpretedExtendedCompatibilitySriov ( Header->SystemPageSize ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_SRIOV_BARS), gShellDebug1HiiHandle, Header->VFBar[0], @@ -6239,10 +5954,7 @@ PrintInterpretedExtendedCompatibilityPri ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_PRI *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_PRI), gShellDebug1HiiHandle, Header->Capability.Uint32, @@ -6276,10 +5988,7 @@ PrintInterpretedExtendedCompatibilityPasid ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_PASID *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_PASID), gShellDebug1HiiHandle, Header->Capability.Uint16, @@ -6312,10 +6021,7 @@ PrintInterpretedExtendedCompatibilityL1PmSubstates ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_L1_PM_SUBSTATES *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_L1_PM_SUBSTATES), gShellDebug1HiiHandle, Header->Capability.Uint32, @@ -6349,10 +6055,7 @@ PrintInterpretedExtendedCompatibilityDesignatedVendorSpecific ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_DESIGNATED_VENDOR_SPECIFIC *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_DESIGNATED_VENDOR_SPECIFIC), gShellDebug1HiiHandle, Header->DesignatedVendorSpecificHeader1.Bits.DvsecVendorId, @@ -6422,20 +6125,14 @@ PrintInterpretedExtendedCompatibilityVfResizableBar ( } // Print header - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_VF_RESIZABLE_BAR_HEADER), gShellDebug1HiiHandle ); // Print each entry for (UINTN Index = 0; Index < EntryCount; Index++) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_VF_RESIZABLE_BAR_ENTRY), gShellDebug1HiiHandle, Index, @@ -6443,10 +6140,7 @@ PrintInterpretedExtendedCompatibilityVfResizableBar ( Header->Capability[Index].VfResizableBarControl.Uint32 ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_VF_RESIZABLE_BAR_DETAILS), gShellDebug1HiiHandle, Header->Capability[Index].VfResizableBarCapability.Bits.VfBarSizeCapability, @@ -6483,10 +6177,7 @@ PrintInterpretedExtendedCompatibilityDataLinkFeature ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_DATA_LINK_FEATURE *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_DATA_LINK_FEATURE), gShellDebug1HiiHandle, Header->Capability.Uint32, @@ -6521,10 +6212,7 @@ PrintInterpretedExtendedCompatibilityPhysicalLayer16 ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_PHYSICAL_LAYER_16_0 *)HeaderAddress; // Print the basic capability information - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_PHYSICAL_LAYER_16), gShellDebug1HiiHandle, Header->Capablities.Uint32, @@ -6533,10 +6221,7 @@ PrintInterpretedExtendedCompatibilityPhysicalLayer16 ( ); // Print detailed status bits - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_PHYSICAL_LAYER_16_STATUS), gShellDebug1HiiHandle, Header->Status.Bits.EqualizationComplete, @@ -6547,10 +6232,7 @@ PrintInterpretedExtendedCompatibilityPhysicalLayer16 ( ); // Print data parity status registers - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_PHYSICAL_LAYER_16_PARITY), gShellDebug1HiiHandle, Header->LocalDataParityMismatchStatus, @@ -6599,10 +6281,7 @@ PrintInterpretedExtendedCompatibilityLaneMargining ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_LANE_MARGINING_AT_RECEIVER *)HeaderAddress; // Print raw register values - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_LANE_MARGINING), gShellDebug1HiiHandle, Header->Capability.Uint8, @@ -6612,20 +6291,14 @@ PrintInterpretedExtendedCompatibilityLaneMargining ( ); // Print decoded capability information - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_LANE_MARGINING_CAPABILITY), gShellDebug1HiiHandle, Header->Capability.Bits.MaxLaneNumber ); // Print decoded control information - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_LANE_MARGINING_CONTROL), gShellDebug1HiiHandle, Header->Control.Bits.LaneNumber, @@ -6634,10 +6307,7 @@ PrintInterpretedExtendedCompatibilityLaneMargining ( ); // Print decoded status information - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_LANE_MARGINING_STATUS), gShellDebug1HiiHandle, Header->Status.Bits.MaxLanesReceivingTestPattern @@ -6671,10 +6341,7 @@ PrintInterpretedExtendedCompatibilityPhysicalLayer32 ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_PHYSICAL_LAYER_32_0 *)HeaderAddress; // Print the basic capability information - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_PHYSICAL_LAYER_32), gShellDebug1HiiHandle, Header->Capablities.Uint32, @@ -6683,10 +6350,7 @@ PrintInterpretedExtendedCompatibilityPhysicalLayer32 ( ); // Print capabilities details - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_PHYSICAL_LAYER_32_CAPABILITIES), gShellDebug1HiiHandle, Header->Capablities.Bits.EqualizationByPassToHighestRateSupport, @@ -6697,10 +6361,7 @@ PrintInterpretedExtendedCompatibilityPhysicalLayer32 ( ); // Print control details - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_PHYSICAL_LAYER_32_CONTROL), gShellDebug1HiiHandle, Header->Control.Bits.EqualizationByPassToHighestRateDisable, @@ -6709,10 +6370,7 @@ PrintInterpretedExtendedCompatibilityPhysicalLayer32 ( ); // Print status details - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_PHYSICAL_LAYER_32_STATUS), gShellDebug1HiiHandle, Header->Status.Bits.EqualizationComplete, @@ -6728,10 +6386,7 @@ PrintInterpretedExtendedCompatibilityPhysicalLayer32 ( ); // Print Modified TS Data - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_PHYSICAL_LAYER_32_TS_DATA), gShellDebug1HiiHandle, Header->RcvdModifiedTs1Data.Uint32, @@ -6780,10 +6435,7 @@ PrintInterpretedExtendedCompatibilityAlternateProtocol ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_ALTERNATE_PROTOCOL *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_ALTERNATE_PROTOCOL), gShellDebug1HiiHandle, Header->AltProtocolCapability, @@ -6817,10 +6469,7 @@ PrintInterpretedExtendedCompatibilityDataObjectExchange ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_DATA_OBJECT_EXCHANGE *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_DATA_OBJECT_EXCHANGE), gShellDebug1HiiHandle, Header->DoeCapabilities, @@ -6855,10 +6504,7 @@ PrintInterpretedExtendedCompatibilityDevice3 ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_DEVICE3 *)HeaderAddress; // Print raw register values - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_DEVICE3), gShellDebug1HiiHandle, Header->Capabilities.Uint32, @@ -6867,10 +6513,7 @@ PrintInterpretedExtendedCompatibilityDevice3 ( ); // Print detailed capability information - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_DEVICE3_CAPABILITY), gShellDebug1HiiHandle, Header->Capabilities.Bits.DmwrRequestRouting, @@ -6882,10 +6525,7 @@ PrintInterpretedExtendedCompatibilityDevice3 ( ); // Print detailed control information - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_DEVICE3_CONTROL), gShellDebug1HiiHandle, Header->Control.Bits.DmwrRequesterEnable, @@ -6896,10 +6536,7 @@ PrintInterpretedExtendedCompatibilityDevice3 ( ); // Print detailed status information - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_DEVICE3_STATUS), gShellDebug1HiiHandle, Header->Status.Bits.InitialLinkWidth, @@ -6945,10 +6582,7 @@ PrintInterpretedExtendedCompatibilityIntegrityEncryption ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_INTEGRITY_DATA_ENCRYPTION *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_INTEGRITY_ENCRYPTION), gShellDebug1HiiHandle, Header->IdeCapabilities, @@ -6983,10 +6617,7 @@ PrintInterpretedExtendedCompatibilityPhysicalLayer64 ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_PHYSICAL_LAYER_64_0 *)HeaderAddress; // Print the basic capability information - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_PHYSICAL_LAYER_64), gShellDebug1HiiHandle, Header->Capablities.Uint32, @@ -6995,10 +6626,7 @@ PrintInterpretedExtendedCompatibilityPhysicalLayer64 ( ); // Print detailed status bits - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_PHYSICAL_LAYER_64_STATUS), gShellDebug1HiiHandle, Header->Status.Bits.EqualizationComplete, @@ -7054,10 +6682,7 @@ PrintInterpretedExtendedCompatibilityFlitLogging ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_FLIT_LOGGING *)HeaderAddress; // Print the Flit Logging capability details - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_FLIT_LOGGING), gShellDebug1HiiHandle, Header->FlitLoggingCapabilities, @@ -7095,10 +6720,7 @@ PrintInterpretedExtendedCompatibilityPTM ( Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_PTM *)HeaderAddress; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_EXT_CAP_PTM), gShellDebug1HiiHandle, Header->Capability.Uint32, @@ -7262,10 +6884,7 @@ PciExplainPciExpress ( break; } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( PcieExplainList[Index].Token, gShellDebug1HiiHandle, PcieExplainList[Index].Offset, diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SerMode.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SerMode.c index a33343dc7250..0fc7a2f9cbf7 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SerMode.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SerMode.c @@ -44,7 +44,7 @@ DisplaySettings ( Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiSerialIoProtocolGuid, NULL, &NoHandles, &Handles); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle, L"sermode"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle, L"sermode"); return SHELL_INVALID_PARAMETER; } @@ -119,10 +119,7 @@ DisplaySettings ( StopBits = L"Unknown"; } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SERMODE_DISPLAY), gShellDebug1HiiHandle, ConvertHandleToHandleIndex (Handles[Index]), @@ -133,7 +130,7 @@ DisplaySettings ( StopBits ); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle, L"sermode"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle, L"sermode"); ShellStatus = SHELL_NOT_FOUND; break; } @@ -145,7 +142,7 @@ DisplaySettings ( if (Index == NoHandles) { if (((NoHandles != 0) && HandleValid) || (0 == NoHandles)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NOT_FOUND), gShellDebug1HiiHandle, L"sermode"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SERMODE_NOT_FOUND), gShellDebug1HiiHandle, L"sermode"); ShellStatus = SHELL_NOT_FOUND; } } @@ -194,7 +191,7 @@ ShellCommandRunSerMode ( Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"sermode", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"sermode", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -202,10 +199,10 @@ ShellCommandRunSerMode ( } } else { if ((ShellCommandLineGetCount (Package) < 6) && (ShellCommandLineGetCount (Package) > 2)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"sermode"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"sermode"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetCount (Package) > 6) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"sermode"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"sermode"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Temp = ShellCommandLineGetRawValue (Package, 1); @@ -232,7 +229,7 @@ ShellCommandRunSerMode ( Temp = ShellCommandLineGetRawValue (Package, 3); if ((Temp == NULL) || (StrLen (Temp) > 1)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp); ShellStatus = SHELL_INVALID_PARAMETER; } else { switch (Temp[0]) { @@ -261,7 +258,7 @@ ShellCommandRunSerMode ( Parity = SpaceParity; break; default: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -283,14 +280,14 @@ ShellCommandRunSerMode ( case 8: break; default: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } Temp = ShellCommandLineGetRawValue (Package, 5); if (Temp == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -314,14 +311,14 @@ ShellCommandRunSerMode ( break; default: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiSerialIoProtocolGuid, NULL, &NoHandles, &Handles); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle, L"sermode"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle, L"sermode"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -344,17 +341,17 @@ ShellCommandRunSerMode ( ); if (EFI_ERROR (Status)) { if (Status == EFI_INVALID_PARAMETER) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_UNSUPPORTED), gShellDebug1HiiHandle, L"sermode", ConvertHandleToHandleIndex (Handles[Index])); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SERMODE_SET_UNSUPPORTED), gShellDebug1HiiHandle, L"sermode", ConvertHandleToHandleIndex (Handles[Index])); ShellStatus = SHELL_UNSUPPORTED; } else if (Status == EFI_DEVICE_ERROR) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_DEV_ERROR), gShellDebug1HiiHandle, L"sermode", ConvertHandleToHandleIndex (Handles[Index])); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SERMODE_SET_DEV_ERROR), gShellDebug1HiiHandle, L"sermode", ConvertHandleToHandleIndex (Handles[Index])); ShellStatus = SHELL_ACCESS_DENIED; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_FAIL), gShellDebug1HiiHandle, L"sermode", ConvertHandleToHandleIndex (Handles[Index])); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SERMODE_SET_FAIL), gShellDebug1HiiHandle, L"sermode", ConvertHandleToHandleIndex (Handles[Index])); ShellStatus = SHELL_ACCESS_DENIED; } } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_HANDLE), gShellDebug1HiiHandle, ConvertHandleToHandleIndex (Handles[Index])); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SERMODE_SET_HANDLE), gShellDebug1HiiHandle, ConvertHandleToHandleIndex (Handles[Index])); } break; @@ -364,7 +361,7 @@ ShellCommandRunSerMode ( } if ((ShellStatus == SHELL_SUCCESS) && (Index == NoHandles)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_BAD_HANDLE), gShellDebug1HiiHandle, L"sermode", HandleIdx); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SERMODE_BAD_HANDLE), gShellDebug1HiiHandle, L"sermode", HandleIdx); ShellStatus = SHELL_INVALID_PARAMETER; } diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SetSize.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SetSize.c index 79c3aaafc419..16e24c664236 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SetSize.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SetSize.c @@ -49,7 +49,7 @@ ShellCommandRunSetSize ( Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"setsize", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"setsize", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -57,17 +57,17 @@ ShellCommandRunSetSize ( } } else { if (ShellCommandLineGetCount (Package) < 3) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"setsize"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"setsize"); ShellStatus = SHELL_INVALID_PARAMETER; NewSize = 0; } else { Temp1 = ShellCommandLineGetRawValue (Package, 1); if (Temp1 == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"setsize"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"setsize"); ShellStatus = SHELL_INVALID_PARAMETER; NewSize = 0; } else if (!ShellIsHexOrDecimalNumber (Temp1, FALSE, FALSE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SIZE_NOT_SPEC), gShellDebug1HiiHandle, L"setsize"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SIZE_NOT_SPEC), gShellDebug1HiiHandle, L"setsize"); ShellStatus = SHELL_INVALID_PARAMETER; NewSize = 0; } else { @@ -82,22 +82,22 @@ ShellCommandRunSetSize ( } if (EFI_ERROR (Status) && (LoopVar == 2)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_SPEC), gShellDebug1HiiHandle, L"setsize"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_FILE_NOT_SPEC), gShellDebug1HiiHandle, L"setsize"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"setsize", ShellCommandLineGetRawValue (Package, LoopVar)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"setsize", ShellCommandLineGetRawValue (Package, LoopVar)); ShellStatus = SHELL_INVALID_PARAMETER; break; } else { Status = FileHandleSetSize (FileHandle, NewSize); if (Status == EFI_VOLUME_FULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VOLUME_FULL), gShellDebug1HiiHandle, L"setsize"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_VOLUME_FULL), gShellDebug1HiiHandle, L"setsize"); ShellStatus = SHELL_VOLUME_FULL; } else if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SET_SIZE_FAIL), gShellDebug1HiiHandle, L"setsize", ShellCommandLineGetRawValue (Package, LoopVar)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_SIZE_FAIL), gShellDebug1HiiHandle, L"setsize", ShellCommandLineGetRawValue (Package, LoopVar)); ShellStatus = SHELL_INVALID_PARAMETER; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SET_SIZE_DONE), gShellDebug1HiiHandle, ShellCommandLineGetRawValue (Package, LoopVar)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_SIZE_DONE), gShellDebug1HiiHandle, ShellCommandLineGetRawValue (Package, LoopVar)); } ShellCloseFile (&FileHandle); diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SetVar.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SetVar.c index 9f8dee2bbe02..eeb285417469 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SetVar.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SetVar.c @@ -229,7 +229,7 @@ ParseParameterData ( DevPath = ConvertTextToDevicePath (Data); if (DevPath == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_DPFT), gShellDebug1HiiHandle, L"setvar"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SETVAR_ERROR_DPFT), gShellDebug1HiiHandle, L"setvar"); Status = EFI_INVALID_PARAMETER; } else { Size = GetDevicePathSize (DevPath); @@ -291,7 +291,7 @@ GetVariableDataFromParameter ( } if (TempData[0] != L'=') { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"setvar", TempData); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"setvar", TempData); return EFI_INVALID_PARAMETER; } @@ -306,9 +306,9 @@ GetVariableDataFromParameter ( TotalSize += Size; } else { if (Status == EFI_INVALID_PARAMETER) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"setvar", TempData); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"setvar", TempData); } else if (Status == EFI_NOT_FOUND) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_DPFT), gShellDebug1HiiHandle, L"setvar"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SETVAR_ERROR_DPFT), gShellDebug1HiiHandle, L"setvar"); } return Status; @@ -388,19 +388,19 @@ ShellCommandRunSetVar ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"setvar", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"setvar", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { ASSERT (FALSE); } } else if (ShellCommandLineCheckDuplicate (Package, &ProblemParam) != EFI_SUCCESS) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_DUPLICATE), gShellDebug1HiiHandle, L"setvar", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_DUPLICATE), gShellDebug1HiiHandle, L"setvar", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { if (ShellCommandLineGetCount (Package) < 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"setvar"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"setvar"); ShellStatus = SHELL_INVALID_PARAMETER; } else { VariableName = ShellCommandLineGetRawValue (Package, 1); @@ -416,13 +416,13 @@ ShellCommandRunSetVar ( if (StringGuid != NULL) { RStatus = StrToGuid (StringGuid, &Guid); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"setvar", StringGuid); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"setvar", StringGuid); ShellCommandLineFreeVarList (Package); return SHELL_INVALID_PARAMETER; } if (RETURN_ERROR (RStatus) || (StringGuid[GUID_STRING_LENGTH] != L'\0')) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"setvar", StringGuid); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"setvar", StringGuid); ShellStatus = SHELL_INVALID_PARAMETER; } } @@ -435,7 +435,7 @@ ShellCommandRunSetVar ( if (Status == EFI_BUFFER_TOO_SMALL) { Buffer = AllocateZeroPool (Size); if (Buffer == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"setvar"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"setvar"); ShellCommandLineFreeVarList (Package); return SHELL_OUT_OF_RESOURCES; } @@ -444,14 +444,14 @@ ShellCommandRunSetVar ( } if (!EFI_ERROR (Status) && (Buffer != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SETVAR_PRINT), gShellDebug1HiiHandle, &Guid, VariableName, Size); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SETVAR_PRINT), gShellDebug1HiiHandle, &Guid, VariableName, Size); for (LoopVar = 0; LoopVar < Size; LoopVar++) { ShellPrintEx (-1, -1, L"%02x ", ((UINT8 *)Buffer)[LoopVar]); } ShellPrintEx (-1, -1, L"\r\n"); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_GET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SETVAR_ERROR_GET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName); ShellStatus = SHELL_ACCESS_DENIED; } } else { @@ -462,7 +462,7 @@ ShellCommandRunSetVar ( if (Status == EFI_BUFFER_TOO_SMALL) { Buffer = AllocateZeroPool (Size); if (Buffer == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"setvar"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"setvar"); ShellCommandLineFreeVarList (Package); return SHELL_OUT_OF_RESOURCES; } @@ -498,7 +498,7 @@ ShellCommandRunSetVar ( } if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SETVAR_ERROR_SET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName); ShellStatus = SHELL_ACCESS_DENIED; } else { ASSERT (ShellStatus == SHELL_SUCCESS); diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/EventLogInfo.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/EventLogInfo.c index 9a38ffddeb46..94d9263a1d2b 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/EventLogInfo.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/EventLogInfo.c @@ -26,7 +26,7 @@ DisplaySELAccessMethod ( // // Print prompt // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_ACCESS_METHOD), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_ACCESS_METHOD), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Key, Option); // @@ -34,30 +34,30 @@ DisplaySELAccessMethod ( // switch (Key) { case 0: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_ONE_EIGHT_BIT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_ONE_EIGHT_BIT), gShellDebug1HiiHandle); break; case 1: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_TWO_EIGHT_BITS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_TWO_EIGHT_BITS), gShellDebug1HiiHandle); break; case 2: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_ONE_SIXTEEN_BIT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_ONE_SIXTEEN_BIT), gShellDebug1HiiHandle); break; case 3: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_MEM_MAPPED_PHYS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_MEM_MAPPED_PHYS), gShellDebug1HiiHandle); break; case 4: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_AVAIL_VIA_GENERAL), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_AVAIL_VIA_GENERAL), gShellDebug1HiiHandle); break; default: if (Key <= 0x7f) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_AVAIL_FOR_FUTURE_ASSIGN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_AVAIL_FOR_FUTURE_ASSIGN), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_BIOS_VENDOR_OEM), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_BIOS_VENDOR_OEM), gShellDebug1HiiHandle); } } } @@ -77,26 +77,26 @@ DisplaySELLogStatus ( // // Print prompt // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_STATUS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_STATUS), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Key, Option); // // Print value info // if ((Key & 0x01) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_AREA_VALID), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_AREA_VALID), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_AREA_VALID), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_AREA_VALID), gShellDebug1HiiHandle); } if ((Key & 0x02) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_AREA_FULL), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_AREA_FULL), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_AREA_NOT_FULL), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_AREA_NOT_FULL), gShellDebug1HiiHandle); } if ((Key & 0xFC) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_RES_BITS_NOT_ZERO), gShellDebug1HiiHandle, Key & 0xFC); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_RES_BITS_NOT_ZERO), gShellDebug1HiiHandle, Key & 0xFC); } } @@ -115,20 +115,20 @@ DisplaySysEventLogHeaderFormat ( // // Print prompt // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_HEADER_FORMAT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_HEADER_FORMAT), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Key, Option); // // Print value info // if (Key == 0x00) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_NO_HEADER), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_NO_HEADER), gShellDebug1HiiHandle); } else if (Key == 0x01) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_TYPE_LOG_HEADER), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_TYPE_LOG_HEADER), gShellDebug1HiiHandle); } else if (Key <= 0x7f) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_AVAIL_FOR_FUTURE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_AVAIL_FOR_FUTURE), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_BIOS_VENDOR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_BIOS_VENDOR), gShellDebug1HiiHandle); } } @@ -144,19 +144,19 @@ DisplaySELLogHeaderLen ( UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_HEADER_LEN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_HEADER_LEN), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Key, Option); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_ONE_VAR_D), gShellDebug1HiiHandle, Key & 0x7F); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_ONE_VAR_D), gShellDebug1HiiHandle, Key & 0x7F); // // The most-significant bit of the field specifies // whether (0) or not (1) the record has been read // if ((Key & 0x80) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_THIS_RECORD_READ), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_THIS_RECORD_READ), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_THIS_RECORD_NOT_READ), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_THIS_RECORD_NOT_READ), gShellDebug1HiiHandle); } } @@ -172,17 +172,14 @@ DisplaySysEventLogHeaderType1 ( { LOG_HEADER_TYPE1_FORMAT *Header; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_SYSTEM_EVENT_LOG), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_SYSTEM_EVENT_LOG), gShellDebug1HiiHandle); // // Print Log Header Type1 Format info // Header = (LOG_HEADER_TYPE1_FORMAT *)(LogHeader); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_OEM_RESERVED), gShellDebug1HiiHandle, Header->OEMReserved[0], @@ -191,23 +188,20 @@ DisplaySysEventLogHeaderType1 ( Header->OEMReserved[3], Header->OEMReserved[4] ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_MULTIPLE_EVENT_TIME), gShellDebug1HiiHandle, Header->Metw); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_MULTIPLE_EVENT_COUNT), gShellDebug1HiiHandle, Header->Meci); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_PREBOOT_ADDRESS), gShellDebug1HiiHandle, Header->CMOSAddress); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_PREBOOT_INDEX), gShellDebug1HiiHandle, Header->CMOSBitIndex); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_CHECKSUM_STARTING_OFF), gShellDebug1HiiHandle, Header->StartingOffset); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_CHECKSUN_BYTE_COUNT), gShellDebug1HiiHandle, Header->ChecksumOffset); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_MULTIPLE_EVENT_TIME), gShellDebug1HiiHandle, Header->Metw); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_MULTIPLE_EVENT_COUNT), gShellDebug1HiiHandle, Header->Meci); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_PREBOOT_ADDRESS), gShellDebug1HiiHandle, Header->CMOSAddress); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_PREBOOT_INDEX), gShellDebug1HiiHandle, Header->CMOSBitIndex); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_CHECKSUM_STARTING_OFF), gShellDebug1HiiHandle, Header->StartingOffset); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_CHECKSUN_BYTE_COUNT), gShellDebug1HiiHandle, Header->ChecksumOffset); + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_RESERVED), gShellDebug1HiiHandle, Header->OEMReserved[0], Header->OEMReserved[1], Header->OEMReserved[2] ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_HEADER_REVISION), gShellDebug1HiiHandle, Header->HeaderRevision); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_HEADER_REVISION), gShellDebug1HiiHandle, Header->HeaderRevision); } /** @@ -225,20 +219,20 @@ DisplaySysEventLogHeader ( // // Print prompt // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_HEADER), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_LOG_HEADER), gShellDebug1HiiHandle); // // Print value info // if (LogHeaderFormat == 0x00) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_NO_HEADER), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_NO_HEADER), gShellDebug1HiiHandle); } else if (LogHeaderFormat == 0x01) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_TYPE_LOG_HEADER), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_TYPE_LOG_HEADER), gShellDebug1HiiHandle); DisplaySysEventLogHeaderType1 (LogHeader); } else if (LogHeaderFormat <= 0x7f) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_AVAIL_FUTURE_ASSIGN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_AVAIL_FUTURE_ASSIGN), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_BIOS_VENDOR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_BIOS_VENDOR), gShellDebug1HiiHandle); } } @@ -267,29 +261,29 @@ DisplayElVdfInfo ( // switch (ElVdfType) { case 0: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_NO_STD_FORMAT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_NO_STD_FORMAT), gShellDebug1HiiHandle); break; case 1: Word = (UINT16 *)(VarData + 1); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_SMBIOS_STRUCT_ASSOC), gShellDebug1HiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_STRUCT_HANDLE), gShellDebug1HiiHandle, *Word); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_SMBIOS_STRUCT_ASSOC), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_STRUCT_HANDLE), gShellDebug1HiiHandle, *Word); break; case 2: Dword = (UINT32 *)(VarData + 1); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_MULT_EVENT_COUNTER), gShellDebug1HiiHandle, *Dword); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_MULT_EVENT_COUNTER), gShellDebug1HiiHandle, *Dword); break; case 3: Word = (UINT16 *)(VarData + 1); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_SMBIOS_STRUCT_ASSOC), gShellDebug1HiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_STRUCT_HANDLE), gShellDebug1HiiHandle, *Word); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_SMBIOS_STRUCT_ASSOC), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_STRUCT_HANDLE), gShellDebug1HiiHandle, *Word); // // Followed by a multiple-event counter // Dword = (UINT32 *)(VarData + 1); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_MULT_EVENT_COUNTER), gShellDebug1HiiHandle, *Dword); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_MULT_EVENT_COUNTER), gShellDebug1HiiHandle, *Dword); break; case 4: @@ -311,14 +305,14 @@ DisplayElVdfInfo ( // Followed by a multiple-event counter // Dword = (UINT32 *)(VarData + 1); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_MULT_EVENT_COUNTER), gShellDebug1HiiHandle, *Dword); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_MULT_EVENT_COUNTER), gShellDebug1HiiHandle, *Dword); break; default: if (ElVdfType <= 0x7F) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_UNUSED_AVAIL_FOR_ASSIGN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_UNUSED_AVAIL_FOR_ASSIGN), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_AVAIL_FOR_SYSTEM), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_AVAIL_FOR_SYSTEM), gShellDebug1HiiHandle); } } } @@ -345,7 +339,7 @@ DisplaySysEventLogData ( // // Print prompt // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_SYSTEM_EVENT_LOG_2), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_SYSTEM_EVENT_LOG_2), gShellDebug1HiiHandle); // // Print Log info @@ -367,13 +361,13 @@ DisplaySysEventLogData ( // (as read from CMOS) of the occurrence of the event // So Print as hex and represent decimal // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_DATE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_DATE), gShellDebug1HiiHandle); if ((Log != NULL) && (Log->Year >= 80) && (Log->Year <= 99)) { Print (L"19"); } else if ((Log != NULL) && (Log->Year <= 79)) { Print (L"20"); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_ERROR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_ERROR), gShellDebug1HiiHandle); // // Get a Event Log Record // @@ -381,10 +375,7 @@ DisplaySysEventLogData ( continue; } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_EVENTLOGINFO_TIME_SIX_VARS), gShellDebug1HiiHandle, Log->Year, diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/LibSmbiosView.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/LibSmbiosView.c index a9ea3e13b0fb..b11fd94b71a6 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/LibSmbiosView.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/LibSmbiosView.c @@ -49,7 +49,7 @@ LibSmbiosInit ( } if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_GET_TABLE_ERROR), gShellDebug1HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_GET_TABLE_ERROR), gShellDebug1HiiHandle, Status); return Status; } @@ -91,7 +91,7 @@ LibSmbios64BitInit ( } if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_GET_TABLE_ERROR), gShellDebug1HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_GET_TABLE_ERROR), gShellDebug1HiiHandle, Status); return Status; } @@ -260,7 +260,7 @@ LibGetSmbiosStructure ( } if ((Buffer == NULL) || (Length == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_NO_BUFF_LEN_SPEC), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_NO_BUFF_LEN_SPEC), gShellDebug1HiiHandle); return DMI_INVALID_HANDLE; } @@ -334,7 +334,7 @@ LibGetSmbios64BitStructure ( } if ((Buffer == NULL) || (Length == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_NO_BUFF_LEN_SPEC), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_NO_BUFF_LEN_SPEC), gShellDebug1HiiHandle); return DMI_INVALID_HANDLE; } diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c index bf68eb12cc94..1c312ad7fe2f 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c @@ -142,7 +142,7 @@ SmbiosPrintEPSInfo ( UINT8 InAnchor[6]; if (SmbiosTable == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SMBIOSTABLE_NULL), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SMBIOSTABLE_NULL), gShellDebug1HiiHandle); return; } @@ -151,60 +151,48 @@ SmbiosPrintEPSInfo ( } if (Option >= SHOW_NORMAL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENTRY_POINT_SIGN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENTRY_POINT_SIGN), gShellDebug1HiiHandle); MemToString (Anchor, SmbiosTable->AnchorString, SMBIOS_ANCHOR_STRING_LENGTH); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ANCHOR_STR), gShellDebug1HiiHandle, Anchor); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ANCHOR_STR), gShellDebug1HiiHandle, Anchor); + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_EPS_CHECKSUM), gShellDebug1HiiHandle, SmbiosTable->EntryPointStructureChecksum ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENTRY_POINT_LEN), gShellDebug1HiiHandle, SmbiosTable->EntryPointLength); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENTRY_POINT_LEN), gShellDebug1HiiHandle, SmbiosTable->EntryPointLength); + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VERSION), gShellDebug1HiiHandle, SmbiosTable->MajorVersion, SmbiosTable->MinorVersion ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NUMBER_STRUCT), gShellDebug1HiiHandle, SmbiosTable->NumberOfSmbiosStructures ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MAX_STRUCT_SIZE), gShellDebug1HiiHandle, SmbiosTable->MaxStructureSize); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TABLE_ADDR), gShellDebug1HiiHandle, SmbiosTable->TableAddress); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TABLE_LENGTH), gShellDebug1HiiHandle, SmbiosTable->TableLength); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MAX_STRUCT_SIZE), gShellDebug1HiiHandle, SmbiosTable->MaxStructureSize); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TABLE_ADDR), gShellDebug1HiiHandle, SmbiosTable->TableAddress); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TABLE_LENGTH), gShellDebug1HiiHandle, SmbiosTable->TableLength); } // // If SHOW_ALL, also print followings. // if (Option >= SHOW_DETAIL) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENTRY_POINT_REVISION), gShellDebug1HiiHandle, SmbiosTable->EntryPointRevision ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BCD_REVISION), gShellDebug1HiiHandle, SmbiosTable->SmbiosBcdRevision); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BCD_REVISION), gShellDebug1HiiHandle, SmbiosTable->SmbiosBcdRevision); // // Since raw data is not string, add a NULL terminater. // MemToString (InAnchor, SmbiosTable->IntermediateAnchorString, 5); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTER_ACHOR), gShellDebug1HiiHandle, InAnchor); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTER_CHECKSUM), gShellDebug1HiiHandle, SmbiosTable->IntermediateChecksum); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FORMATTED_AREA), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTER_ACHOR), gShellDebug1HiiHandle, InAnchor); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTER_CHECKSUM), gShellDebug1HiiHandle, SmbiosTable->IntermediateChecksum); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FORMATTED_AREA), gShellDebug1HiiHandle); DumpHex (2, 0, 5, SmbiosTable->FormattedArea); } @@ -226,7 +214,7 @@ Smbios64BitPrintEPSInfo ( UINT8 Anchor[SMBIOS_3_0_ANCHOR_STRING_LENGTH + 1]; // Including terminating NULL character if (SmbiosTable == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SMBIOSTABLE_NULL), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SMBIOSTABLE_NULL), gShellDebug1HiiHandle); return; } @@ -235,54 +223,42 @@ Smbios64BitPrintEPSInfo ( } if (Option >= SHOW_NORMAL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_64_BIT_ENTRY_POINT_SIGN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_64_BIT_ENTRY_POINT_SIGN), gShellDebug1HiiHandle); MemToString (Anchor, SmbiosTable->AnchorString, SMBIOS_3_0_ANCHOR_STRING_LENGTH); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ANCHOR_STR), gShellDebug1HiiHandle, Anchor); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ANCHOR_STR), gShellDebug1HiiHandle, Anchor); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_EPS_CHECKSUM), gShellDebug1HiiHandle, SmbiosTable->EntryPointStructureChecksum ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENTRY_POINT_LEN), gShellDebug1HiiHandle, SmbiosTable->EntryPointLength); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENTRY_POINT_LEN), gShellDebug1HiiHandle, SmbiosTable->EntryPointLength); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VERSION), gShellDebug1HiiHandle, SmbiosTable->MajorVersion, SmbiosTable->MinorVersion ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DOCREV), gShellDebug1HiiHandle, SmbiosTable->DocRev ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TABLE_MAX_SIZE), gShellDebug1HiiHandle, SmbiosTable->TableMaximumSize); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TABLE_MAX_SIZE), gShellDebug1HiiHandle, SmbiosTable->TableMaximumSize); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TABLE_ADDR), gShellDebug1HiiHandle, SmbiosTable->TableAddress); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TABLE_ADDR), gShellDebug1HiiHandle, SmbiosTable->TableAddress); } // // If SHOW_ALL, also print followings. // if (Option >= SHOW_DETAIL) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENTRY_POINT_REVISION), gShellDebug1HiiHandle, SmbiosTable->EntryPointRevision @@ -327,8 +303,8 @@ SmbiosPrintStructure ( // Display structure header // DisplayStructureTypeInfo (Struct->Hdr->Type, SHOW_DETAIL); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FORMAT_PART_LEN), gShellDebug1HiiHandle, Struct->Hdr->Length); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_STRUCT_HANDLE), gShellDebug1HiiHandle, Struct->Hdr->Handle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FORMAT_PART_LEN), gShellDebug1HiiHandle, Struct->Hdr->Length); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_STRUCT_HANDLE), gShellDebug1HiiHandle, Struct->Hdr->Handle); if (Option == SHOW_OUTLINE) { return EFI_SUCCESS; @@ -344,7 +320,7 @@ SmbiosPrintStructure ( ShellPrintEx (-1, -1, L"BIOS Starting Address Segment: 0x%x\n", Struct->Type0->BiosSegment); ShellPrintEx (-1, -1, L"BIOS Release Date: %a\n", LibGetSmbiosString (Struct, Struct->Type0->BiosReleaseDate)); if ((Struct->Type0->BiosSize != 0xFF) || !(AE_SMBIOS_VERSION (0x3, 0x1))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_SIZE), gShellDebug1HiiHandle, 64 * (Struct->Type0->BiosSize + 1)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_SIZE), gShellDebug1HiiHandle, 64 * (Struct->Type0->BiosSize + 1)); } DisplayBiosCharacteristics (ReadUnaligned64 ((UINT64 *)(UINTN)&(Struct->Type0->BiosCharacteristics)), Option); @@ -365,10 +341,7 @@ SmbiosPrintStructure ( } if (AE_SMBIOS_VERSION (0x3, 0x1) && (Struct->Hdr->Length > 0x18)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_EXTENDED_BIOS_SIZE), gShellDebug1HiiHandle, Struct->Type0->ExtendedBiosSize.Size, @@ -423,13 +396,13 @@ SmbiosPrintStructure ( PRINT_PENDING_STRING (Struct, Type3, Version); PRINT_PENDING_STRING (Struct, Type3, SerialNumber); PRINT_PENDING_STRING (Struct, Type3, AssetTag); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BOOTUP_STATE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BOOTUP_STATE), gShellDebug1HiiHandle); DisplaySystemEnclosureStatus (Struct->Type3->BootupState, Option); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_STATE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_STATE), gShellDebug1HiiHandle); DisplaySystemEnclosureStatus (Struct->Type3->PowerSupplyState, Option); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_THERMAL_STATE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_THERMAL_STATE), gShellDebug1HiiHandle); DisplaySystemEnclosureStatus (Struct->Type3->ThermalState, Option); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SECURITY_STATUS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SECURITY_STATUS), gShellDebug1HiiHandle); DisplaySESecurityStatus (Struct->Type3->SecurityStatus, Option); if (AE_SMBIOS_VERSION (0x2, 0x3)) { if (Struct->Hdr->Length > 0xD) { @@ -454,7 +427,7 @@ SmbiosPrintStructure ( if (Struct->Hdr->Length > 0x15) { for (Index = 0; Index < Struct->Type3->ContainedElementCount; Index++) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CONTAINED_ELEMENT), gShellDebug1HiiHandle, Index+1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CONTAINED_ELEMENT), gShellDebug1HiiHandle, Index+1); for (Index2 = 0; Index2 < Struct->Type3->ContainedElementRecordLength; Index2++) { Print (L"%02X ", Buffer[0x15 + (Index * Struct->Type3->ContainedElementRecordLength) + Index2]); } @@ -478,10 +451,10 @@ SmbiosPrintStructure ( case 4: ShellPrintEx (-1, -1, L"Socket Designation: %a\n", LibGetSmbiosString (Struct, Struct->Type4->Socket)); DisplayProcessorType (Struct->Type4->ProcessorType, Option); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PROCESSOR_FAMILY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PROCESSOR_FAMILY), gShellDebug1HiiHandle); DisplayProcessorFamily (Struct->Type4->ProcessorFamily, Option); ShellPrintEx (-1, -1, L"Processor Manufacturer: %a\n", LibGetSmbiosString (Struct, Struct->Type4->ProcessorManufacturer)); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PROCESSOR_ID), gShellDebug1HiiHandle, 8); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PROCESSOR_ID), gShellDebug1HiiHandle, 8); DumpHex (0, 0, 8, &(Struct->Type4->ProcessorId)); ShellPrintEx (-1, -1, L"Processor Version: %a\n", LibGetSmbiosString (Struct, Struct->Type4->ProcessorVersion)); DisplayProcessorVoltage (*(UINT8 *)&(Struct->Type4->Voltage), Option); @@ -507,7 +480,7 @@ SmbiosPrintStructure ( } if (AE_SMBIOS_VERSION (0x2, 0x6) && (Struct->Hdr->Length > 0x28)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PROCESSOR_FAMILY2), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PROCESSOR_FAMILY2), gShellDebug1HiiHandle); if (Struct->Type4->ProcessorFamily2 >= 0x100) { DisplayProcessorFamily2 (Struct->Type4->ProcessorFamily2, Option); } else { @@ -541,9 +514,9 @@ SmbiosPrintStructure ( DisplayMcErrorDetectMethod (Struct->Type5->ErrDetectMethod, Option); DisplayMcErrorCorrectCapability (*(UINT8 *)&(Struct->Type5->ErrCorrectCapability), Option); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SUPOPRT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SUPOPRT), gShellDebug1HiiHandle); DisplayMcInterleaveSupport (Struct->Type5->SupportInterleave, Option); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CURRENT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CURRENT), gShellDebug1HiiHandle); DisplayMcInterleaveSupport (Struct->Type5->CurrentInterleave, Option); DisplayMaxMemoryModuleSize (Struct->Type5->MaxMemoryModuleSize, SlotNum, Option); DisplayMcMemorySpeeds (*(UINT16 *)&(Struct->Type5->SupportSpeed), Option); @@ -566,9 +539,9 @@ SmbiosPrintStructure ( DisplayMmBankConnections (Struct->Type6->BankConnections, Option); PRINT_STRUCT_VALUE (Struct, Type6, CurrentSpeed); DisplayMmMemoryType (*(UINT16 *)&(Struct->Type6->CurrentMemoryType), Option); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INSTALLED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INSTALLED), gShellDebug1HiiHandle); DisplayMmMemorySize (*(UINT8 *)&(Struct->Type6->InstalledSize), Option); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLED), gShellDebug1HiiHandle); DisplayMmMemorySize (*(UINT8 *)&(Struct->Type6->EnabledSize), Option); DisplayMmErrorStatus (Struct->Type6->ErrorStatus, Option); break; @@ -603,7 +576,7 @@ SmbiosPrintStructure ( Print (L"Internal "); DisplayPortConnectorType (Struct->Type8->InternalConnectorType, Option); PRINT_PENDING_STRING (Struct, Type8, ExternalReferenceDesignator); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_EXTERNAL), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_EXTERNAL), gShellDebug1HiiHandle); DisplayPortConnectorType (Struct->Type8->ExternalConnectorType, Option); DisplayPortType (Struct->Type8->PortType, Option); break; @@ -646,11 +619,11 @@ SmbiosPrintStructure ( PeerGroupCount = Struct->Type9->PeerGroupingCount; PeerGroupPtr = Struct->Type9->PeerGroups; for (Index = 0; Index < PeerGroupCount; Index++) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SLOT_PEER_GROUPS), gShellDebug1HiiHandle, Index + 1); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SEGMENT_GROUP_NUM), gShellDebug1HiiHandle, PeerGroupPtr[Index].SegmentGroupNum); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BUS_NUM), gShellDebug1HiiHandle, PeerGroupPtr[Index].BusNum); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DEV_FUNC_NUM), gShellDebug1HiiHandle, PeerGroupPtr[Index].DevFuncNum); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DATA_BUS_WIDTH), gShellDebug1HiiHandle, PeerGroupPtr[Index].DataBusWidth); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SLOT_PEER_GROUPS), gShellDebug1HiiHandle, Index + 1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SEGMENT_GROUP_NUM), gShellDebug1HiiHandle, PeerGroupPtr[Index].SegmentGroupNum); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BUS_NUM), gShellDebug1HiiHandle, PeerGroupPtr[Index].BusNum); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DEV_FUNC_NUM), gShellDebug1HiiHandle, PeerGroupPtr[Index].DevFuncNum); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DATA_BUS_WIDTH), gShellDebug1HiiHandle, PeerGroupPtr[Index].DataBusWidth); } if (AE_SMBIOS_VERSION (0x3, 0x4)) { @@ -659,7 +632,7 @@ SmbiosPrintStructure ( Type9ExtendedStruct = (SMBIOS_TABLE_TYPE9_EXTENDED *)((UINT8 *)PeerGroupPtr + (PeerGroupCount * sizeof (MISC_SLOT_PEER_GROUP))); DisplaySystemSlotInformation (Type9ExtendedStruct->SlotInformation, Option); DisplaySystemSlotPhysicalWidth (Type9ExtendedStruct->SlotPhysicalWidth, Option); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_SLOT_PITCH), gShellDebug1HiiHandle, Type9ExtendedStruct->SlotPitch); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_SLOT_PITCH), gShellDebug1HiiHandle, Type9ExtendedStruct->SlotPitch); if (AE_SMBIOS_VERSION (0x3, 0x5)) { DisplaySystemSlotHeight (Type9ExtendedStruct->SlotHeight, Option); } @@ -680,7 +653,7 @@ SmbiosPrintStructure ( for (Index = 0; (UINTN)Index < NumOfDevice; Index++) { ShellPrintEx (-1, -1, (((Struct->Type10->Device[Index].DeviceType) & 0x80) != 0) ? L"Device Enabled\n" : L"Device Disabled\n"); DisplayOnboardDeviceTypes ((Struct->Type10->Device[Index].DeviceType) & 0x7F, Option); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DESC_STRING), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DESC_STRING), gShellDebug1HiiHandle); ShellPrintEx (-1, -1, L"%a\n", LibGetSmbiosString (Struct, Struct->Type10->Device[Index].DescriptionString)); } @@ -763,7 +736,7 @@ SmbiosPrintStructure ( // Display all Event Log type descriptors supported by system // for (Index = 0; Index < Count; Index++, Ptr++) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SUPOPRTED_EVENT), gShellDebug1HiiHandle, Index + 1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SUPOPRTED_EVENT), gShellDebug1HiiHandle, Index + 1); DisplaySELTypes (Ptr->LogType, Option); DisplaySELVarDataFormatType (Ptr->DataFormatType, Option); } @@ -779,10 +752,7 @@ SmbiosPrintStructure ( case 02: case 04: default: - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ACCESS_METHOD_NOT_SUPOPRTED), gShellDebug1HiiHandle, Struct->Type15->AccessMethod @@ -1113,7 +1083,7 @@ SmbiosPrintStructure ( // Boot Integrity Services (BIS) Entry Point (Type 31) // case 31: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_STRUCT_TYPE31), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_STRUCT_TYPE31), gShellDebug1HiiHandle); break; // @@ -1186,9 +1156,9 @@ SmbiosPrintStructure ( Count = Struct->Type37->MemoryDeviceCount; Ptr = Struct->Type37->MemoryDevice; for (Index = 0; Index < Count; Index++) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MEM_DEVICE), gShellDebug1HiiHandle, Index + 1); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DEV_LOAD), gShellDebug1HiiHandle, Ptr[Index].DeviceLoad); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DEV_HANDLE), gShellDebug1HiiHandle, Ptr[Index].DeviceHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MEM_DEVICE), gShellDebug1HiiHandle, Index + 1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DEV_LOAD), gShellDebug1HiiHandle, Ptr[Index].DeviceLoad); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DEV_HANDLE), gShellDebug1HiiHandle, Ptr[Index].DeviceHandle); } break; @@ -1200,10 +1170,7 @@ SmbiosPrintStructure ( case 38: DisplayIPMIDIBMCInterfaceType (Struct->Type38->InterfaceType, Option); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_IPMI_SPECIFICATION_REVISION), gShellDebug1HiiHandle, RShiftU64 ((UINT64)Struct->Type38->IPMISpecificationRevision, 4), \ @@ -1213,13 +1180,13 @@ SmbiosPrintStructure ( PRINT_STRUCT_VALUE_H (Struct, Type38, I2CSlaveAddress); if (Struct->Type38->NVStorageDeviceAddress == 0xFF) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NV_STORAGE_DEVICE_NOT_PRESENT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NV_STORAGE_DEVICE_NOT_PRESENT), gShellDebug1HiiHandle); } else { PRINT_STRUCT_VALUE_H (Struct, Type38, NVStorageDeviceAddress); } if (Struct->Type38->InterfaceType == IPMIDeviceInfoInterfaceTypeSSIF) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BASE_ADDRESS), gShellDebug1HiiHandle, RShiftU64 ((UINT64)Struct->Type38->BaseAddress, 1)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BASE_ADDRESS), gShellDebug1HiiHandle, RShiftU64 ((UINT64)Struct->Type38->BaseAddress, 1)); } else { PRINT_STRUCT_VALUE_LH (Struct, Type38, BaseAddress); } @@ -1265,9 +1232,9 @@ SmbiosPrintStructure ( for (Index = 0; Index < NumberOfEntries; Index++) { EntryLength = Entries->EntryLength; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ENTRYLEN), gShellDebug1HiiHandle, EntryLength); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_REFERENCEDHANDLE), gShellDebug1HiiHandle, Entries->ReferencedHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_REFERENCEDOFFSET), gShellDebug1HiiHandle, Entries->ReferencedOffset); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ENTRYLEN), gShellDebug1HiiHandle, EntryLength); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_REFERENCEDHANDLE), gShellDebug1HiiHandle, Entries->ReferencedHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_REFERENCEDOFFSET), gShellDebug1HiiHandle, Entries->ReferencedOffset); PRINT_SMBIOS_STRING (Struct, Entries->EntryString, String); PRINT_SMBIOS_BIT_FIELD (Struct, Entries->Value, Value, EntryLength - 5); Entries = (ADDITIONAL_INFORMATION_ENTRY *)((UINT8 *)Entries + EntryLength); @@ -1377,10 +1344,7 @@ SmbiosPrintStructure ( String = L"Reserved"; } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FIRMWARE_VERSION_FORMAT), gShellDebug1HiiHandle, String @@ -1396,10 +1360,7 @@ SmbiosPrintStructure ( String = L"Reserved"; } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FIRMWARE_ID_FORMAT), gShellDebug1HiiHandle, String @@ -1410,10 +1371,7 @@ SmbiosPrintStructure ( if (Struct->Type45->ImageSize != MAX_UINT64) { PRINT_STRUCT_VALUE_H (Struct, Type45, ImageSize); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_IMAGE_SIZE_UNKNOWN), gShellDebug1HiiHandle ); @@ -1425,7 +1383,7 @@ SmbiosPrintStructure ( PRINT_STRUCT_VALUE_H (Struct, Type45, AssociatedComponentCount); if (Struct->Hdr->Length > sizeof (*Struct->Type45)) { for (Index = 0; Index < Struct->Type45->AssociatedComponentCount; Index++) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FIRMWARE_INVENTORY_ASSOCIATED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FIRMWARE_INVENTORY_ASSOCIATED), gShellDebug1HiiHandle); Print (L" 0x%04X ", Buffer[sizeof (*Struct->Type45) + (Index * sizeof (SMBIOS_HANDLE))]); Print (L"\n"); } @@ -1449,10 +1407,7 @@ SmbiosPrintStructure ( String = L"Reserved"; } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_STRING_PROPERTY_ID), gShellDebug1HiiHandle, String @@ -1464,18 +1419,18 @@ SmbiosPrintStructure ( // Inactive (Type 126) // case 126: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INACTIVE_STRUCT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INACTIVE_STRUCT), gShellDebug1HiiHandle); break; // // End-of-Table (Type 127) // case 127: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_THIS_STRUCT_END_TABLE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_THIS_STRUCT_END_TABLE), gShellDebug1HiiHandle); break; default: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_STRUCT_TYPE_UNDEFINED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_STRUCT_TYPE_UNDEFINED), gShellDebug1HiiHandle); break; } @@ -1497,7 +1452,7 @@ DisplayBiosCharacteristics ( // // Print header // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_CHAR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_CHAR), gShellDebug1HiiHandle); // // print option // @@ -1509,138 +1464,138 @@ DisplayBiosCharacteristics ( // are designed not to deal with UINT64 // if (BIT (Chara, 0) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED_BIT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED_BIT), gShellDebug1HiiHandle); } if (BIT (Chara, 1) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED_BIT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED_BIT), gShellDebug1HiiHandle); } if (BIT (Chara, 2) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN_BIT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN_BIT), gShellDebug1HiiHandle); } if (BIT (Chara, 3) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_CHAR_NOT_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_CHAR_NOT_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Chara, 4) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ISA_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ISA_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Chara, 5) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MCA_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MCA_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Chara, 6) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_EISA_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_EISA_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Chara, 7) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PCI_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PCI_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Chara, 8) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PC_CARD_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PC_CARD_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Chara, 9) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PLUG_PLAY_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PLUG_PLAY_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Chara, 10) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_APM_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_APM_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Chara, 11) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_UPGRADEABLE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_UPGRADEABLE), gShellDebug1HiiHandle); } if (BIT (Chara, 12) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_SHADOWING), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_SHADOWING), gShellDebug1HiiHandle); } if (BIT (Chara, 13) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VESA_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VESA_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Chara, 14) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ECSD_SUPPORT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ECSD_SUPPORT), gShellDebug1HiiHandle); } if (BIT (Chara, 15) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BOOT_FROM_CD_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BOOT_FROM_CD_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Chara, 16) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SELECTED_BOOT_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SELECTED_BOOT_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Chara, 17) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_ROM_SOCKETED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_ROM_SOCKETED), gShellDebug1HiiHandle); } if (BIT (Chara, 18) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BOOT_FROM_PC_CARD), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BOOT_FROM_PC_CARD), gShellDebug1HiiHandle); } if (BIT (Chara, 19) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_EDD_ENHANCED_DRIVER), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_EDD_ENHANCED_DRIVER), gShellDebug1HiiHandle); } if (BIT (Chara, 20) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_JAPANESE_FLOPPY_NEC), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_JAPANESE_FLOPPY_NEC), gShellDebug1HiiHandle); } if (BIT (Chara, 21) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_JAPANESE_FLOPPY_TOSHIBA), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_JAPANESE_FLOPPY_TOSHIBA), gShellDebug1HiiHandle); } if (BIT (Chara, 22) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FLOPPY_SERVICES_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FLOPPY_SERVICES_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Chara, 23) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ONE_POINT_TWO_MB), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ONE_POINT_TWO_MB), gShellDebug1HiiHandle); } if (BIT (Chara, 24) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_720_KB), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_720_KB), gShellDebug1HiiHandle); } if (BIT (Chara, 25) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TWO_POINT_EIGHT_EIGHT_MB), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TWO_POINT_EIGHT_EIGHT_MB), gShellDebug1HiiHandle); } if (BIT (Chara, 26) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PRINT_SCREEN_SUPPORT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PRINT_SCREEN_SUPPORT), gShellDebug1HiiHandle); } if (BIT (Chara, 27) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_KEYBOARD_SERV_SUPPORT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_KEYBOARD_SERV_SUPPORT), gShellDebug1HiiHandle); } if (BIT (Chara, 28) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SERIAL_SERVICES_SUPPORT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SERIAL_SERVICES_SUPPORT), gShellDebug1HiiHandle); } if (BIT (Chara, 29) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PRINTER_SERVICES_SUPPORT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PRINTER_SERVICES_SUPPORT), gShellDebug1HiiHandle); } if (BIT (Chara, 30) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MONO_VIDEO_SUPPORT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MONO_VIDEO_SUPPORT), gShellDebug1HiiHandle); } if (BIT (Chara, 31) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NEC_PC_98), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NEC_PC_98), gShellDebug1HiiHandle); } // // Just print the Reserved // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_32_47), gShellDebug1HiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_48_63), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_32_47), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_48_63), gShellDebug1HiiHandle); } /** @@ -1655,7 +1610,7 @@ DisplayBiosCharacteristicsExt1 ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_CHAR_EXTENSION), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_CHAR_EXTENSION), gShellDebug1HiiHandle); // // Print option // @@ -1665,35 +1620,35 @@ DisplayBiosCharacteristicsExt1 ( // check bit and print // if (BIT (Byte1, 0) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ACPI_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ACPI_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Byte1, 1) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_USB_LEGACY_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_USB_LEGACY_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Byte1, 2) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AGP_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AGP_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Byte1, 3) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_I2O_BOOT_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_I2O_BOOT_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Byte1, 4) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_LS_120_BOOT_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_LS_120_BOOT_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Byte1, 5) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ATAPI_ZIP_DRIVE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ATAPI_ZIP_DRIVE), gShellDebug1HiiHandle); } if (BIT (Byte1, 6) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_1394_BOOT_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_1394_BOOT_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Byte1, 7) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SMART_BATTERY_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SMART_BATTERY_SUPPORTED), gShellDebug1HiiHandle); } } @@ -1709,48 +1664,48 @@ DisplayBiosCharacteristicsExt2 ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_CHAR_EXTENSION_2), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_CHAR_EXTENSION_2), gShellDebug1HiiHandle); // // Print option // PRINT_INFO_OPTION (byte2, Option); if (BIT (byte2, 0) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_BOOT_SPEC_SUPP), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_BOOT_SPEC_SUPP), gShellDebug1HiiHandle); } if (BIT (byte2, 1) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FUNCTION_KEY_INIT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FUNCTION_KEY_INIT), gShellDebug1HiiHandle); } if (AE_SMBIOS_VERSION (0x2, 0x4)) { if (BIT (byte2, 2) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLE_TAR_CONT_DIST), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLE_TAR_CONT_DIST), gShellDebug1HiiHandle); } if (AE_SMBIOS_VERSION (0x2, 0x7)) { if (BIT (byte2, 3) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UEFI_SPEC_SUPPORT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UEFI_SPEC_SUPPORT), gShellDebug1HiiHandle); } if (BIT (byte2, 4) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VIRTUAL_MACHINE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VIRTUAL_MACHINE), gShellDebug1HiiHandle); } if (BIT (byte2, 5) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MCFG_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MCFG_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (byte2, 6) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MCFG_ENABLED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MCFG_ENABLED), gShellDebug1HiiHandle); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_RSVD_FOR_FUTURE), gShellDebug1HiiHandle, 5); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_RSVD_FOR_FUTURE), gShellDebug1HiiHandle, 5); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_RSVD_FOR_FUTURE), gShellDebug1HiiHandle, 3); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_RSVD_FOR_FUTURE), gShellDebug1HiiHandle, 3); } } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_RSVD_FOR_FUTURE), gShellDebug1HiiHandle, 2); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_RSVD_FOR_FUTURE), gShellDebug1HiiHandle, 2); } } @@ -1776,11 +1731,11 @@ DisplayProcessorFamily ( // switch (Family) { case 0x01: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OTHER), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OTHER), gShellDebug1HiiHandle); break; case 0x02: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); break; case 0x03: @@ -1792,11 +1747,11 @@ DisplayProcessorFamily ( break; case 0x05: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL386_PROCESSOR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL386_PROCESSOR), gShellDebug1HiiHandle); break; case 0x06: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL486_PROCESSOR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL486_PROCESSOR), gShellDebug1HiiHandle); break; case 0x07: @@ -1816,35 +1771,35 @@ DisplayProcessorFamily ( break; case 0x0B: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_PROC_FAMILY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_PROC_FAMILY), gShellDebug1HiiHandle); break; case 0x0C: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_PRO_PROC), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_PRO_PROC), gShellDebug1HiiHandle); break; case 0x0D: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_II_PROC), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_II_PROC), gShellDebug1HiiHandle); break; case 0x0E: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_PROC_MMX), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_PROC_MMX), gShellDebug1HiiHandle); break; case 0x0F: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CELERON_PROC), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CELERON_PROC), gShellDebug1HiiHandle); break; case 0x10: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_XEON_PROC), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_XEON_PROC), gShellDebug1HiiHandle); break; case 0x11: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_III_PROC), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_III_PROC), gShellDebug1HiiHandle); break; case 0x12: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_M1_FAMILY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_M1_FAMILY), gShellDebug1HiiHandle); break; case 0x13: @@ -1864,7 +1819,7 @@ DisplayProcessorFamily ( break; case 0x19: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_K5_FAMILY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_K5_FAMILY), gShellDebug1HiiHandle); break; case 0x1A: @@ -1892,23 +1847,23 @@ DisplayProcessorFamily ( break; case 0x20: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_PC_FAMILY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_PC_FAMILY), gShellDebug1HiiHandle); break; case 0x21: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_PC_601), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_PC_601), gShellDebug1HiiHandle); break; case 0x22: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_PC_603), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_PC_603), gShellDebug1HiiHandle); break; case 0x23: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_PC_603_PLUS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_PC_603_PLUS), gShellDebug1HiiHandle); break; case 0x24: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_PC_604), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_PC_604), gShellDebug1HiiHandle); break; case 0x25: @@ -1924,19 +1879,19 @@ DisplayProcessorFamily ( break; case 0x28: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE_DUO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE_DUO), gShellDebug1HiiHandle); break; case 0x29: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE_DUO_MOBILE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE_DUO_MOBILE), gShellDebug1HiiHandle); break; case 0x2A: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE_SOLO_MOBILE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE_SOLO_MOBILE), gShellDebug1HiiHandle); break; case 0x2B: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_ATOM), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_ATOM), gShellDebug1HiiHandle); break; case 0x2C: @@ -1956,7 +1911,7 @@ DisplayProcessorFamily ( break; case 0x30: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ALPHA_FAMILY_2), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ALPHA_FAMILY_2), gShellDebug1HiiHandle); break; case 0x31: @@ -2016,11 +1971,11 @@ DisplayProcessorFamily ( break; case 0x3F: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_FX_SERIES), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_FX_SERIES), gShellDebug1HiiHandle); break; case 0x40: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MIPS_FAMILY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MIPS_FAMILY), gShellDebug1HiiHandle); break; case 0x41: @@ -2060,31 +2015,31 @@ DisplayProcessorFamily ( break; case 0x4A: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_Z_SERIES), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_Z_SERIES), gShellDebug1HiiHandle); break; case 0x4B: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_R_SERIES), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_R_SERIES), gShellDebug1HiiHandle); break; case 0x4C: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_4300_SERIES), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_4300_SERIES), gShellDebug1HiiHandle); break; case 0x4D: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_6300_SERIES), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_6300_SERIES), gShellDebug1HiiHandle); break; case 0x4E: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_3300_SERIES), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_3300_SERIES), gShellDebug1HiiHandle); break; case 0x4F: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_FIREPRO_SERIES), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_FIREPRO_SERIES), gShellDebug1HiiHandle); break; case 0x50: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SPARC_FAMILY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SPARC_FAMILY), gShellDebug1HiiHandle); break; case 0x51: @@ -2120,7 +2075,7 @@ DisplayProcessorFamily ( break; case 0x60: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_68040_FAMILY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_68040_FAMILY), gShellDebug1HiiHandle); break; case 0x61: @@ -2168,7 +2123,7 @@ DisplayProcessorFamily ( break; case 0x70: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_HOBBIT_FAMILY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_HOBBIT_FAMILY), gShellDebug1HiiHandle); break; case 0x78: @@ -2184,7 +2139,7 @@ DisplayProcessorFamily ( break; case 0x80: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_WEITEK), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_WEITEK), gShellDebug1HiiHandle); break; case 0x82: @@ -2220,31 +2175,31 @@ DisplayProcessorFamily ( break; case 0x8A: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_QUAD_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_QUAD_CORE), gShellDebug1HiiHandle); break; case 0x8B: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_THIRD_GENERATION), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_THIRD_GENERATION), gShellDebug1HiiHandle); break; case 0x8C: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_PHENOM_FX_QUAD_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_PHENOM_FX_QUAD_CORE), gShellDebug1HiiHandle); break; case 0x8D: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_PHENOM_X4_QUAD_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_PHENOM_X4_QUAD_CORE), gShellDebug1HiiHandle); break; case 0x8E: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_PHENOM_X2_DUAL_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_PHENOM_X2_DUAL_CORE), gShellDebug1HiiHandle); break; case 0x8F: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_ATHLON_X2_DUAL_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_ATHLON_X2_DUAL_CORE), gShellDebug1HiiHandle); break; case 0x90: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PA_RISC_FAMILY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PA_RISC_FAMILY), gShellDebug1HiiHandle); break; case 0x91: @@ -2272,71 +2227,71 @@ DisplayProcessorFamily ( break; case 0xA0: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_V30_FAMILY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_V30_FAMILY), gShellDebug1HiiHandle); break; case 0xA1: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_3200_SERIES_QUAD_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_3200_SERIES_QUAD_CORE), gShellDebug1HiiHandle); break; case 0xA2: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_3000_SERIES_DUAL_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_3000_SERIES_DUAL_CORE), gShellDebug1HiiHandle); break; case 0xA3: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5300_SERIES_QUAD_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5300_SERIES_QUAD_CORE), gShellDebug1HiiHandle); break; case 0xA4: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5100_SERIES_DUAL_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5100_SERIES_DUAL_CORE), gShellDebug1HiiHandle); break; case 0xA5: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5000_SERIES_DUAL_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5000_SERIES_DUAL_CORE), gShellDebug1HiiHandle); break; case 0xA6: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_LV_DUAL_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_LV_DUAL_CORE), gShellDebug1HiiHandle); break; case 0xA7: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_ULV_DUAL_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_ULV_DUAL_CORE), gShellDebug1HiiHandle); break; case 0xA8: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7100_SERIES_DUAL_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7100_SERIES_DUAL_CORE), gShellDebug1HiiHandle); break; case 0xA9: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5400_SERIES_QUAD_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5400_SERIES_QUAD_CORE), gShellDebug1HiiHandle); break; case 0xAA: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_QUAD_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_QUAD_CORE), gShellDebug1HiiHandle); break; case 0xAB: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5200_SERIES_DUAL_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5200_SERIES_DUAL_CORE), gShellDebug1HiiHandle); break; case 0xAC: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7200_SERIES_DUAL_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7200_SERIES_DUAL_CORE), gShellDebug1HiiHandle); break; case 0xAD: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7300_SERIES_QUAD_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7300_SERIES_QUAD_CORE), gShellDebug1HiiHandle); break; case 0xAE: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7400_SERIES_QUAD_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7400_SERIES_QUAD_CORE), gShellDebug1HiiHandle); break; case 0xAF: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7400_SERIES_MULTI_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7400_SERIES_MULTI_CORE), gShellDebug1HiiHandle); break; case 0xB0: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_III_XEON), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PENTIUM_III_XEON), gShellDebug1HiiHandle); break; case 0xB1: @@ -2396,35 +2351,35 @@ DisplayProcessorFamily ( break; case 0xC0: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE2_SOLO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE2_SOLO), gShellDebug1HiiHandle); break; case 0xC1: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE2_EXTREME), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE2_EXTREME), gShellDebug1HiiHandle); break; case 0xC2: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE2_QUAD), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE2_QUAD), gShellDebug1HiiHandle); break; case 0xC3: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE2_EXTREME), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE2_EXTREME), gShellDebug1HiiHandle); break; case 0xC4: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE2_DUO_MOBILE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE2_DUO_MOBILE), gShellDebug1HiiHandle); break; case 0xC5: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE2_SOLO_MOBILE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE2_SOLO_MOBILE), gShellDebug1HiiHandle); break; case 0xC6: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE_I7), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CORE_I7), gShellDebug1HiiHandle); break; case 0xC7: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CELERON_DUAL_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_CELERON_DUAL_CORE), gShellDebug1HiiHandle); break; case 0xC8: @@ -2480,35 +2435,35 @@ DisplayProcessorFamily ( break; case 0xD6: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_MULTI_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_MULTI_CORE), gShellDebug1HiiHandle); break; case 0xD7: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_3_SERIES_DUAL_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_3_SERIES_DUAL_CORE), gShellDebug1HiiHandle); break; case 0xD8: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_3_SERIES_QUAD_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_3_SERIES_QUAD_CORE), gShellDebug1HiiHandle); break; case 0xDA: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5_SERIES_DUAL_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5_SERIES_DUAL_CORE), gShellDebug1HiiHandle); break; case 0xDB: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5_SERIES_QUAD_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_5_SERIES_QUAD_CORE), gShellDebug1HiiHandle); break; case 0xDD: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7_SERIES_DUAL_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7_SERIES_DUAL_CORE), gShellDebug1HiiHandle); break; case 0xDE: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7_SERIES_QUAD_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7_SERIES_QUAD_CORE), gShellDebug1HiiHandle); break; case 0xDF: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7_SERIES_MULTI_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INTEL_XEON_7_SERIES_MULTI_CORE), gShellDebug1HiiHandle); break; case 0xE0: @@ -2516,35 +2471,35 @@ DisplayProcessorFamily ( break; case 0xE4: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_3000_SERIES), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_OPTERON_3000_SERIES), gShellDebug1HiiHandle); break; case 0xE5: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_SEMPRON_II), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_SEMPRON_II), gShellDebug1HiiHandle); break; case 0xE6: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_EMBEDDED_OPTERON_QUAD_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_EMBEDDED_OPTERON_QUAD_CORE), gShellDebug1HiiHandle); break; case 0xE7: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_PHENOM_TRIPLE_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_PHENOM_TRIPLE_CORE), gShellDebug1HiiHandle); break; case 0xE8: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_TURION_ULTRA_DUAL_CORE_MOBILE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_TURION_ULTRA_DUAL_CORE_MOBILE), gShellDebug1HiiHandle); break; case 0xE9: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_TURION_DUAL_CORE_MOBILE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_TURION_DUAL_CORE_MOBILE), gShellDebug1HiiHandle); break; case 0xEA: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_ATHLON_DUAL_CORE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_ATHLON_DUAL_CORE), gShellDebug1HiiHandle); break; case 0xEB: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_SEMPRON_SI), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AMD_SEMPRON_SI), gShellDebug1HiiHandle); break; case 0xEC: @@ -2576,7 +2531,7 @@ DisplayProcessorFamily ( break; default: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNDEFINED_PROC_FAMILY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNDEFINED_PROC_FAMILY), gShellDebug1HiiHandle); } // @@ -2770,7 +2725,7 @@ DisplayProcessorFamily2 ( break; default: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNDEFINED_PROC_FAMILY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNDEFINED_PROC_FAMILY), gShellDebug1HiiHandle); } } @@ -2802,44 +2757,44 @@ DisplayProcessorVoltage ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PROC_INFO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PROC_INFO), gShellDebug1HiiHandle); // // Print option // PRINT_INFO_OPTION (Voltage, Option); if (BIT (Voltage, 7) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PROC_CURRENT_VOLTAGE), gShellDebug1HiiHandle, (Voltage - 0x80)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PROC_CURRENT_VOLTAGE), gShellDebug1HiiHandle, (Voltage - 0x80)); } else { if (BIT (Voltage, 0) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_5V_SUPOPRTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_5V_SUPOPRTED), gShellDebug1HiiHandle); } if (BIT (Voltage, 1) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_33V_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_33V_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Voltage, 2) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_29V_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_29V_SUPPORTED), gShellDebug1HiiHandle); } // // check the reserved zero bits: // if (BIT (Voltage, 3) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT3_NOT_ZERO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT3_NOT_ZERO), gShellDebug1HiiHandle); } if (BIT (Voltage, 4) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT4_NOT_ZERO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT4_NOT_ZERO), gShellDebug1HiiHandle); } if (BIT (Voltage, 5) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT5_NOT_ZERO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT5_NOT_ZERO), gShellDebug1HiiHandle); } if (BIT (Voltage, 6) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT6_NOT_ZERO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT6_NOT_ZERO), gShellDebug1HiiHandle); } } } @@ -2870,26 +2825,26 @@ DisplayProcessorStatus ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PROC_STATUS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PROC_STATUS), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Status, Option); if (BIT (Status, 7) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT7_NOT_ZERO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT7_NOT_ZERO), gShellDebug1HiiHandle); } else if (BIT (Status, 5) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT5_NOT_ZERO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT5_NOT_ZERO), gShellDebug1HiiHandle); } else if (BIT (Status, 4) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT4_NOT_ZERO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT4_NOT_ZERO), gShellDebug1HiiHandle); } else if (BIT (Status, 3) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT3_NOT_ZERO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT3_NOT_ZERO), gShellDebug1HiiHandle); } // // Check BIT 6 // if (BIT (Status, 6) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_SOCKET_POPULATED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_SOCKET_POPULATED), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_SOCKET_UNPOPULATED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_SOCKET_UNPOPULATED), gShellDebug1HiiHandle); } // @@ -2897,31 +2852,31 @@ DisplayProcessorStatus ( // switch (Status & 0x07) { case 0: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); break; case 1: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_ENABLED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_ENABLED), gShellDebug1HiiHandle); break; case 2: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_DISABLED_BY_USER), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_DISABLED_BY_USER), gShellDebug1HiiHandle); break; case 3: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_DISABLED_BY_BIOS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_DISABLED_BY_BIOS), gShellDebug1HiiHandle); break; case 4: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_IDLE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CPU_IDLE), gShellDebug1HiiHandle); break; case 7: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OTHERS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OTHERS), gShellDebug1HiiHandle); break; default: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED), gShellDebug1HiiHandle); } } @@ -2941,16 +2896,16 @@ DisplayMaxMemoryModuleSize ( { UINTN MaxSize; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SIZE_LARGEST_MEM), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SIZE_LARGEST_MEM), gShellDebug1HiiHandle); // // MaxSize is determined by follow formula // MaxSize = (UINTN)1 << Size; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ONE_VAR_MB), gShellDebug1HiiHandle, MaxSize); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ONE_VAR_MB), gShellDebug1HiiHandle, MaxSize); if (Option >= SHOW_DETAIL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MAX_AMOUNT_MEM), gShellDebug1HiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ONE_VAR_MB), gShellDebug1HiiHandle, MaxSize, SlotNum, MaxSize * SlotNum); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MAX_AMOUNT_MEM), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ONE_VAR_MB), gShellDebug1HiiHandle, MaxSize, SlotNum, MaxSize * SlotNum); } } @@ -2970,7 +2925,7 @@ DisplayMemoryModuleConfigHandles ( { UINT8 Index; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_HANDLES_CONTROLLED), gShellDebug1HiiHandle, SlotNum); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_HANDLES_CONTROLLED), gShellDebug1HiiHandle, SlotNum); if (Option >= SHOW_DETAIL) { // @@ -2980,9 +2935,9 @@ DisplayMemoryModuleConfigHandles ( return; } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_HANDLES_LIST_CONTROLLED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_HANDLES_LIST_CONTROLLED), gShellDebug1HiiHandle); for (Index = 0; Index < SlotNum; Index++) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_HANDLE), gShellDebug1HiiHandle, Index + 1, Handles[Index]); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_HANDLE), gShellDebug1HiiHandle, Index + 1, Handles[Index]); } } } @@ -3002,7 +2957,7 @@ DisplayMmBankConnections ( UINT8 High; UINT8 Low; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BANK_CONNECTIONS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BANK_CONNECTIONS), gShellDebug1HiiHandle); // // Print option // @@ -3015,15 +2970,15 @@ DisplayMmBankConnections ( Low = (UINT8)(BankConnections & 0x0F); if (High != 0xF) { if (Low != 0xF) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BANK_RAS), gShellDebug1HiiHandle, High, Low, High, Low); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BANK_RAS), gShellDebug1HiiHandle, High, Low, High, Low); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BANK_RAS_2), gShellDebug1HiiHandle, High, High); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BANK_RAS_2), gShellDebug1HiiHandle, High, High); } } else { if (Low != 0xF) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BANK_RAS_2), gShellDebug1HiiHandle, Low, Low); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BANK_RAS_2), gShellDebug1HiiHandle, Low, Low); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NO_BANKS_CONNECTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NO_BANKS_CONNECTED), gShellDebug1HiiHandle); } } } @@ -3050,7 +3005,7 @@ DisplayMmMemorySize ( { UINT8 Value; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MEMORY_SIZE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MEMORY_SIZE), gShellDebug1HiiHandle); // // Print option // @@ -3061,19 +3016,19 @@ DisplayMmMemorySize ( // Value = (UINT8)(Size & 0x7F); if (Value == 0x7D) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MEM_SIZE_NOT_DETERMINABLE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MEM_SIZE_NOT_DETERMINABLE), gShellDebug1HiiHandle); } else if (Value == 0x7E) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MODULE_INSTALLED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MODULE_INSTALLED), gShellDebug1HiiHandle); } else if (Value == 0x7F) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NOT_INSTALLED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NOT_INSTALLED), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MEM_SIZE), gShellDebug1HiiHandle, 1 << Value); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MEM_SIZE), gShellDebug1HiiHandle, 1 << Value); } if (BIT (Size, 7) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MEM_MODULE_DOUBLE_BANK), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MEM_MODULE_DOUBLE_BANK), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MEM_MODULE_SINGLE_BANK), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MEM_MODULE_SINGLE_BANK), gShellDebug1HiiHandle); } } @@ -3111,23 +3066,23 @@ DisplayCacheConfiguration ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_CONFIGURATION), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_CONFIGURATION), gShellDebug1HiiHandle); PRINT_INFO_OPTION (CacheConfiguration, Option); if (BIT (CacheConfiguration, 15) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT15_NOT_ZERO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT15_NOT_ZERO), gShellDebug1HiiHandle); } else if (BIT (CacheConfiguration, 14) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT14_NOT_ZERO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT14_NOT_ZERO), gShellDebug1HiiHandle); } else if (BIT (CacheConfiguration, 13) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT13_NOT_ZERO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT13_NOT_ZERO), gShellDebug1HiiHandle); } else if (BIT (CacheConfiguration, 12) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT12_NOT_ZERO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT12_NOT_ZERO), gShellDebug1HiiHandle); } else if (BIT (CacheConfiguration, 11) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT11_NOT_ZERO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT11_NOT_ZERO), gShellDebug1HiiHandle); } else if (BIT (CacheConfiguration, 10) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT10_NOT_ZERO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT10_NOT_ZERO), gShellDebug1HiiHandle); } else if (BIT (CacheConfiguration, 4) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT4_NOT_ZERO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIT4_NOT_ZERO), gShellDebug1HiiHandle); } // @@ -3135,19 +3090,19 @@ DisplayCacheConfiguration ( // switch ((CacheConfiguration & 0x300) >> 8) { case 0: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_WRITE_THROUGH), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_WRITE_THROUGH), gShellDebug1HiiHandle); break; case 1: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_WRITE_BACK), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_WRITE_BACK), gShellDebug1HiiHandle); break; case 2: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_VARIES_WITH_MEM_ADDR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_VARIES_WITH_MEM_ADDR), gShellDebug1HiiHandle); break; case 3: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); break; } @@ -3155,9 +3110,9 @@ DisplayCacheConfiguration ( // Check BIT 7 // if (BIT (CacheConfiguration, 7) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLED), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DISABLED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DISABLED), gShellDebug1HiiHandle); } // @@ -3165,19 +3120,19 @@ DisplayCacheConfiguration ( // switch ((CacheConfiguration & 0x60) >> 5) { case 0: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_INTERNAL), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_INTERNAL), gShellDebug1HiiHandle); break; case 1: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_EXTERNAL), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_EXTERNAL), gShellDebug1HiiHandle); break; case 2: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED), gShellDebug1HiiHandle); break; case 3: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); break; } @@ -3185,12 +3140,12 @@ DisplayCacheConfiguration ( // Check BIT 3 // if (BIT (CacheConfiguration, 3) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_SOCKETED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_SOCKETED), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_NOT_SOCKETED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_NOT_SOCKETED), gShellDebug1HiiHandle); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_LEVEL), gShellDebug1HiiHandle, (CacheConfiguration & 0x07) + 1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CACHE_LEVEL), gShellDebug1HiiHandle, (CacheConfiguration & 0x07) + 1); } /** @@ -3209,7 +3164,7 @@ DisplaySystemSlotId ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SLOT_ID), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SLOT_ID), gShellDebug1HiiHandle); // // print option // @@ -3220,11 +3175,11 @@ DisplaySystemSlotId ( // Slot Type: MCA // case 0x04: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_LOGICAL_MICRO_CHAN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_LOGICAL_MICRO_CHAN), gShellDebug1HiiHandle); if ((SlotId > 0) && (SlotId <= 15)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ONE_VAR_D), gShellDebug1HiiHandle, SlotId); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ONE_VAR_D), gShellDebug1HiiHandle, SlotId); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ERROR_NOT_1_15), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ERROR_NOT_1_15), gShellDebug1HiiHandle); } break; @@ -3233,11 +3188,11 @@ DisplaySystemSlotId ( // Slot Type: EISA // case 0x05: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_LOGICAL_EISA_NUM), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_LOGICAL_EISA_NUM), gShellDebug1HiiHandle); if ((SlotId > 0) && (SlotId <= 15)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ONE_VAR_D), gShellDebug1HiiHandle, SlotId); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ONE_VAR_D), gShellDebug1HiiHandle, SlotId); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ERROR_NOT_1_15), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ERROR_NOT_1_15), gShellDebug1HiiHandle); } break; @@ -3246,14 +3201,14 @@ DisplaySystemSlotId ( // Slot Type: PCI // case 0x06: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VALUE_PRESENT), gShellDebug1HiiHandle, SlotId); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VALUE_PRESENT), gShellDebug1HiiHandle, SlotId); break; // // Slot Type: PCMCIA // case 0x07: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_IDENTIFIES_ADAPTER_NUM), gShellDebug1HiiHandle, SlotId); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_IDENTIFIES_ADAPTER_NUM), gShellDebug1HiiHandle, SlotId); break; // @@ -3264,9 +3219,9 @@ DisplaySystemSlotId ( ((SlotType >= 0x1F) && (SlotType <= 0x25)) || ((SlotType >= 0xA5) && (SlotType <= 0xC6))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VALUE_PRESENT), gShellDebug1HiiHandle, SlotId); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VALUE_PRESENT), gShellDebug1HiiHandle, SlotId); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNDEFINED_SLOT_ID), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNDEFINED_SLOT_ID), gShellDebug1HiiHandle); } } } @@ -3283,7 +3238,7 @@ DisplaySystemBootStatus ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SYSTEM_BOOT_STATUS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SYSTEM_BOOT_STATUS), gShellDebug1HiiHandle); // // Print option // @@ -3293,31 +3248,31 @@ DisplaySystemBootStatus ( // Check value and print // if (Parameter == 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NO_ERRORS_DETECTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NO_ERRORS_DETECTED), gShellDebug1HiiHandle); } else if (Parameter == 1) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NO_BOOTABLE_MEDIA), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NO_BOOTABLE_MEDIA), gShellDebug1HiiHandle); } else if (Parameter == 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NORMAL_OP_SYSTEM), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NORMAL_OP_SYSTEM), gShellDebug1HiiHandle); } else if (Parameter == 3) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FIRMWARE_DETECTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FIRMWARE_DETECTED), gShellDebug1HiiHandle); } else if (Parameter == 4) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OP_SYSTEM), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OP_SYSTEM), gShellDebug1HiiHandle); } else if (Parameter == 5) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_USER_REQUESTED_BOOT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_USER_REQUESTED_BOOT), gShellDebug1HiiHandle); } else if (Parameter == 6) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SYSTEM_SECURITY_VIOLATION), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SYSTEM_SECURITY_VIOLATION), gShellDebug1HiiHandle); } else if (Parameter == 7) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PREV_REQ_IMAGE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PREV_REQ_IMAGE), gShellDebug1HiiHandle); } else if (Parameter == 8) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_WATCHDOG_TIMER), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_WATCHDOG_TIMER), gShellDebug1HiiHandle); } else if ((Parameter >= 9) && (Parameter <= 127)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RSVD_FUTURE_ASSIGNMENT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RSVD_FUTURE_ASSIGNMENT), gShellDebug1HiiHandle); } else if ((Parameter >= 128) && (Parameter <= 191)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VENDOR_OEM_SPECIFIC), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_VENDOR_OEM_SPECIFIC), gShellDebug1HiiHandle); } else if (Parameter >= 192) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PRODUCT_SPEC_IMPLMENTATION), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PRODUCT_SPEC_IMPLMENTATION), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ERROR_VALUE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ERROR_VALUE), gShellDebug1HiiHandle); } } @@ -3344,7 +3299,7 @@ DisplaySBDSManufactureDate ( UINTN Month; UINTN Year; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SBDS_MANUFACTURE_DATE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SBDS_MANUFACTURE_DATE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Date, Option); // // Print date @@ -3352,7 +3307,7 @@ DisplaySBDSManufactureDate ( Day = Date & 0x001F; Month = (Date & 0x01E0) >> 5; Year = ((Date & 0xFE00) >> 9) + 1980; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MONTH_DAY_YEAR), gShellDebug1HiiHandle, Day, Month, Year); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MONTH_DAY_YEAR), gShellDebug1HiiHandle, Day, Month, Year); } /** @@ -3388,45 +3343,45 @@ DisplaySystemResetCapabilities ( { UINTN Temp; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SYSTEM_RESET_CAPABILITIES), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SYSTEM_RESET_CAPABILITIES), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Reset, Option); // // Check reserved bits 7:6 // if ((Reset & 0xC0) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_RESERVED_ZERO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_RESERVED_ZERO), gShellDebug1HiiHandle); } // // Watch dog // if (BIT (Reset, 5) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_WATCHDOG_TIMER_2), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_WATCHDOG_TIMER_2), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SYSTEM_NOT_CONTAIN_TIMER), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SYSTEM_NOT_CONTAIN_TIMER), gShellDebug1HiiHandle); } // // Boot Option on Limit // Temp = (Reset & 0x18) >> 3; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BOOT_OPTION_LIMIT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BOOT_OPTION_LIMIT), gShellDebug1HiiHandle); switch (Temp) { case 0: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED), gShellDebug1HiiHandle); break; case 1: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OP_SYSTEM_2), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OP_SYSTEM_2), gShellDebug1HiiHandle); break; case 2: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SYSTEM_UTIL), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SYSTEM_UTIL), gShellDebug1HiiHandle); break; case 3: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DO_NOT_REBOOT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DO_NOT_REBOOT), gShellDebug1HiiHandle); break; } @@ -3434,22 +3389,22 @@ DisplaySystemResetCapabilities ( // Boot Option // Temp = (Reset & 0x06) >> 1; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BOOT_OPTION), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BOOT_OPTION), gShellDebug1HiiHandle); switch (Temp) { case 0: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED), gShellDebug1HiiHandle); break; case 1: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OP_SYSTEM_2), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OP_SYSTEM_2), gShellDebug1HiiHandle); break; case 2: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SYSTEM_UTIL), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SYSTEM_UTIL), gShellDebug1HiiHandle); break; case 3: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DO_NOT_REBOOT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DO_NOT_REBOOT), gShellDebug1HiiHandle); break; } @@ -3501,29 +3456,29 @@ DisplayHardwareSecuritySettings ( { UINTN Temp; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_HARDWARE_SECURITY_SET), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_HARDWARE_SECURITY_SET), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Settings, Option); // // Power-on Password Status // Temp = (Settings & 0xC0) >> 6; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_ON_PASSWORD), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_ON_PASSWORD), gShellDebug1HiiHandle); switch (Temp) { case 0: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DISABLED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DISABLED), gShellDebug1HiiHandle); break; case 1: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLED_NEWLINE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLED_NEWLINE), gShellDebug1HiiHandle); break; case 2: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NOT_IMPLEMENTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NOT_IMPLEMENTED), gShellDebug1HiiHandle); break; case 3: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); break; } @@ -3531,22 +3486,22 @@ DisplayHardwareSecuritySettings ( // Keyboard Password Status // Temp = (Settings & 0x30) >> 4; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_KEYBOARD_PASSWORD), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_KEYBOARD_PASSWORD), gShellDebug1HiiHandle); switch (Temp) { case 0: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DISABLED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DISABLED), gShellDebug1HiiHandle); break; case 1: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLED_NEWLINE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLED_NEWLINE), gShellDebug1HiiHandle); break; case 2: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NOT_IMPLEMENTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NOT_IMPLEMENTED), gShellDebug1HiiHandle); break; case 3: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); break; } @@ -3554,22 +3509,22 @@ DisplayHardwareSecuritySettings ( // Administrator Password Status // Temp = (Settings & 0x0C) >> 2; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ADMIN_PASSWORD_STATUS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ADMIN_PASSWORD_STATUS), gShellDebug1HiiHandle); switch (Temp) { case 0: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DISABLED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DISABLED), gShellDebug1HiiHandle); break; case 1: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLED_NEWLINE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLED_NEWLINE), gShellDebug1HiiHandle); break; case 2: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NOT_IMPLEMENTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NOT_IMPLEMENTED), gShellDebug1HiiHandle); break; case 3: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); break; } @@ -3577,22 +3532,22 @@ DisplayHardwareSecuritySettings ( // Front Panel Reset Status // Temp = Settings & 0x3; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FRONT_PANEL_RESET), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_FRONT_PANEL_RESET), gShellDebug1HiiHandle); switch (Temp) { case 0: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DISABLED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DISABLED), gShellDebug1HiiHandle); break; case 1: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLED_NEWLINE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ENABLED_NEWLINE), gShellDebug1HiiHandle); break; case 2: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NOT_IMPLEMENTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NOT_IMPLEMENTED), gShellDebug1HiiHandle); break; case 3: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); break; } } @@ -3609,32 +3564,32 @@ DisplayOBRAConnections ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CONNECTIONS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CONNECTIONS), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Connections, Option); // // Check reserved bits 7:2 // if ((Connections & 0xFC) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_RESERVED_ZERO_2), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_RESERVED_ZERO_2), gShellDebug1HiiHandle); } // // Outbound Connection // if (BIT (Connections, 1) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OUTBOUND_CONN_ENABLED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OUTBOUND_CONN_ENABLED), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OTUBOUND_CONN_DISABLED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OTUBOUND_CONN_DISABLED), gShellDebug1HiiHandle); } // // Inbound Connection // if (BIT (Connections, 0) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INBOIUND_CONN_ENABLED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INBOIUND_CONN_ENABLED), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INBOUND_CONN_DISABLED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INBOUND_CONN_DISABLED), gShellDebug1HiiHandle); } } @@ -3652,120 +3607,120 @@ DisplaySPSCharacteristics ( { UINTN Temp; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_CHAR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_CHAR), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Characteristics, Option); // // Check reserved bits 15:14 // if ((Characteristics & 0xC000) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_15_14_RSVD), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_15_14_RSVD), gShellDebug1HiiHandle); } // // Bits 13:10 - DMTF Power Supply Type // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TYPE), gShellDebug1HiiHandle); Temp = (Characteristics & 0x1C00) >> 10; switch (Temp) { case 1: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OTHER_SPACE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OTHER_SPACE), gShellDebug1HiiHandle); break; case 2: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); break; case 3: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_LINEAR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_LINEAR), gShellDebug1HiiHandle); break; case 4: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SWITCHING), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_SWITCHING), gShellDebug1HiiHandle); break; case 5: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BATTERY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BATTERY), gShellDebug1HiiHandle); break; case 6: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UPS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UPS), gShellDebug1HiiHandle); break; case 7: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CONVERTER), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CONVERTER), gShellDebug1HiiHandle); break; case 8: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_REGULATOR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_REGULATOR), gShellDebug1HiiHandle); break; default: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED_2), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED_2), gShellDebug1HiiHandle); } // // Bits 9:7 - Status // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_STATUS_DASH), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_STATUS_DASH), gShellDebug1HiiHandle); Temp = (Characteristics & 0x380) >> 7; switch (Temp) { case 1: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OTHER_SPACE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OTHER_SPACE), gShellDebug1HiiHandle); break; case 2: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); break; case 3: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OK), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OK), gShellDebug1HiiHandle); break; case 4: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NON_CRITICAL), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NON_CRITICAL), gShellDebug1HiiHandle); break; case 5: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CRITICAL_POWER_SUPPLY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CRITICAL_POWER_SUPPLY), gShellDebug1HiiHandle); break; default: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNDEFINED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNDEFINED), gShellDebug1HiiHandle); } // // Bits 6:3 - DMTF Input Voltage Range Switching // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INPUT_VOLTAGE_RANGE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_INPUT_VOLTAGE_RANGE), gShellDebug1HiiHandle); Temp = (Characteristics & 0x78) >> 3; switch (Temp) { case 1: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OTHER_SPACE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_OTHER_SPACE), gShellDebug1HiiHandle); break; case 2: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_UNKNOWN), gShellDebug1HiiHandle); break; case 3: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MANUAL), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_MANUAL), gShellDebug1HiiHandle); break; case 4: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AUTO_SWITCH), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_AUTO_SWITCH), gShellDebug1HiiHandle); break; case 5: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_WIDE_RANGE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_WIDE_RANGE), gShellDebug1HiiHandle); break; case 6: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NOT_APPLICABLE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NOT_APPLICABLE), gShellDebug1HiiHandle); break; default: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED_3), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED_3), gShellDebug1HiiHandle); break; } @@ -3773,27 +3728,27 @@ DisplaySPSCharacteristics ( // Power supply is unplugged from the wall // if (BIT (Characteristics, 2) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_UNPLUGGED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_UNPLUGGED), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_PLUGGED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_PLUGGED), gShellDebug1HiiHandle); } // // Power supply is present // if (BIT (Characteristics, 1) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_PRESENT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_PRESENT), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_NOT_PRESENT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_NOT_PRESENT), gShellDebug1HiiHandle); } // // hot replaceable // if (BIT (Characteristics, 0) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_REPLACE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_REPLACE), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_NOT_REPLACE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_NOT_REPLACE), gShellDebug1HiiHandle); } } @@ -3812,7 +3767,7 @@ DisplayTpmDeviceCharacteristics ( // // Print header // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TPM_DEVICE_CHAR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TPM_DEVICE_CHAR), gShellDebug1HiiHandle); // // print option // @@ -3824,31 +3779,31 @@ DisplayTpmDeviceCharacteristics ( // are designed not to deal with UINT64 // if (BIT (Chara, 0) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED_BIT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED_BIT), gShellDebug1HiiHandle); } if (BIT (Chara, 1) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED_BIT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_RESERVED_BIT), gShellDebug1HiiHandle); } if (BIT (Chara, 2) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TPM_DEVICE_CHAR_NOT_SUPPORTED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TPM_DEVICE_CHAR_NOT_SUPPORTED), gShellDebug1HiiHandle); } if (BIT (Chara, 3) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TPM_DEVICE_CONFIG_FWU), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TPM_DEVICE_CONFIG_FWU), gShellDebug1HiiHandle); } if (BIT (Chara, 4) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TPM_DEVICE_CONFIG_PLAT_SW), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TPM_DEVICE_CONFIG_PLAT_SW), gShellDebug1HiiHandle); } if (BIT (Chara, 5) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TPM_DEVICE_CONFIG_OEM), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_TPM_DEVICE_CONFIG_OEM), gShellDebug1HiiHandle); } // // Just print the Reserved // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_06_63), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BITS_06_63), gShellDebug1HiiHandle); } diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c index 0bb98785e45a..d54422c986fd 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c @@ -4069,14 +4069,11 @@ PrintBitsInfo ( // There is no any info if FirstInfo is still TRUE. // if (FirstInfo) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_NO_INFO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_NO_INFO), gShellDebug1HiiHandle); } if (Value != 0) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_RSVD_BITS_SET), gShellDebug1HiiHandle, Value @@ -4122,7 +4119,7 @@ DisplaySystemWakeupType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_WAKEUP_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_WAKEUP_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Type, Option); PRINT_TABLE_ITEM (SystemWakeupTypeTable, Type); } @@ -4139,7 +4136,7 @@ DisplayBaseBoardFeatureFlags ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_BASE_BOARD_FEATURE_FLAGS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_BASE_BOARD_FEATURE_FLAGS), gShellDebug1HiiHandle); PRINT_INFO_OPTION (FeatureFlags, Option); PRINT_BITS_INFO (BaseBoardFeatureFlagsTable, FeatureFlags); } @@ -4156,7 +4153,7 @@ DisplayBaseBoardBoardType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_BASE_BOARD_BOARD_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_BASE_BOARD_BOARD_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Type, Option); PRINT_TABLE_ITEM (BaseBoardBoardTypeTable, Type); } @@ -4173,7 +4170,7 @@ DisplaySystemEnclosureType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_CHASSIS_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_CHASSIS_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Type, Option); // // query table and print info @@ -4181,7 +4178,7 @@ DisplaySystemEnclosureType ( PRINT_TABLE_ITEM (SystemEnclosureTypeTable, Type); if (BIT (Type, 7) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_CHASSIS_LOCK_PRESENT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_CHASSIS_LOCK_PRESENT), gShellDebug1HiiHandle); } } @@ -4197,7 +4194,7 @@ DisplaySystemEnclosureStatus ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_CHASSIS_STATUS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_CHASSIS_STATUS), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Status, Option); PRINT_TABLE_ITEM (SystemEnclosureStatusTable, Status); } @@ -4214,7 +4211,7 @@ DisplaySESecurityStatus ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_CHASSIS_SECURITY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_CHASSIS_SECURITY), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Status, Option); PRINT_TABLE_ITEM (SESecurityStatusTable, Status); } @@ -4231,7 +4228,7 @@ DisplayProcessorType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PROC_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PROC_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Type, Option); PRINT_TABLE_ITEM (ProcessorTypeTable, Type); } @@ -4248,7 +4245,7 @@ DisplayProcessorUpgrade ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PROC_UPDATE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PROC_UPDATE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Upgrade, Option); PRINT_TABLE_ITEM (ProcessorUpgradeTable, Upgrade); } @@ -4265,7 +4262,7 @@ DisplayProcessorCharacteristics ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PROC_CHARACTERISTICS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PROC_CHARACTERISTICS), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Type, Option); PRINT_BITS_INFO (ProcessorCharacteristicsTable, Type); } @@ -4282,7 +4279,7 @@ DisplayMcErrorDetectMethod ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_DETECTMETHOD), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_DETECTMETHOD), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Method, Option); PRINT_TABLE_ITEM (McErrorDetectMethodTable, Method); } @@ -4299,7 +4296,7 @@ DisplayMcErrorCorrectCapability ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_CORRECT_CAPABILITY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_CORRECT_CAPABILITY), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Capability, Option); PRINT_BITS_INFO (McErrorCorrectCapabilityTable, Capability); } @@ -4316,7 +4313,7 @@ DisplayMcInterleaveSupport ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_INTERLEAVE_SUPPORT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_INTERLEAVE_SUPPORT), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Support, Option); PRINT_TABLE_ITEM (McInterleaveSupportTable, Support); } @@ -4333,7 +4330,7 @@ DisplayMcMemorySpeeds ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_MEMORY_SPEED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_MEMORY_SPEED), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Speed, Option); PRINT_BITS_INFO (McMemorySpeedsTable, Speed); } @@ -4350,7 +4347,7 @@ DisplayMemoryModuleVoltage ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_REQUIRED_VOLTAGES), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_REQUIRED_VOLTAGES), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Voltage, Option); PRINT_BITS_INFO (MemoryModuleVoltageTable, Voltage); } @@ -4367,7 +4364,7 @@ DisplayMmMemoryType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_MODULE_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_MODULE_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Type, Option); PRINT_BITS_INFO (MmMemoryTypeTable, Type); } @@ -4384,7 +4381,7 @@ DisplayMmErrorStatus ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_MODULE_ERROR_STATUS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_MODULE_ERROR_STATUS), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Status, Option); PRINT_BITS_INFO (MmErrorStatusTable, Status); } @@ -4401,7 +4398,7 @@ DisplayCacheSRAMType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_CACHE_SRAM_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_CACHE_SRAM_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION ((UINT8)Type, Option); PRINT_BITS_INFO (CacheSRAMTypeTable, (UINT8)Type); } @@ -4418,7 +4415,7 @@ DisplayCacheErrCorrectingType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_CACHE_ERROR_CORRECTING), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_CACHE_ERROR_CORRECTING), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Type, Option); PRINT_TABLE_ITEM (CacheErrCorrectingTypeTable, Type); } @@ -4435,7 +4432,7 @@ DisplayCacheSystemCacheType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_CACHE_SYSTEM_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_CACHE_SYSTEM_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Type, Option); PRINT_TABLE_ITEM (CacheSystemCacheTypeTable, Type); } @@ -4452,7 +4449,7 @@ DisplayCacheAssociativity ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_CACHE_ASSOCIATIVITY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_CACHE_ASSOCIATIVITY), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Associativity, Option); PRINT_TABLE_ITEM (CacheAssociativityTable, Associativity); } @@ -4469,7 +4466,7 @@ DisplayPortConnectorType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PORT_CONNECTOR_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PORT_CONNECTOR_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Type, Option); PRINT_TABLE_ITEM (PortConnectorTypeTable, Type); } @@ -4486,7 +4483,7 @@ DisplayPortType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PORT_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PORT_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Type, Option); PRINT_TABLE_ITEM (PortTypeTable, Type); } @@ -4503,7 +4500,7 @@ DisplaySystemSlotType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_SLOT_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_SLOT_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Type, Option); PRINT_TABLE_ITEM (SystemSlotTypeTable, Type); } @@ -4520,7 +4517,7 @@ DisplaySystemSlotDataBusWidth ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_SLOT_DATA), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_SLOT_DATA), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Width, Option); PRINT_TABLE_ITEM (SystemSlotDataBusWidthTable, Width); } @@ -4537,7 +4534,7 @@ DisplaySystemSlotCurrentUsage ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_SLOT_CURRENT_USAGE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_SLOT_CURRENT_USAGE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Usage, Option); PRINT_TABLE_ITEM (SystemSlotCurrentUsageTable, Usage); } @@ -4554,7 +4551,7 @@ DisplaySystemSlotLength ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_SLOT_LENGTH), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_SLOT_LENGTH), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Length, Option); PRINT_TABLE_ITEM (SystemSlotLengthTable, Length); } @@ -4571,7 +4568,7 @@ DisplaySlotCharacteristics1 ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SLOT_CHARACTERISTICS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SLOT_CHARACTERISTICS), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Chara1, Option); PRINT_BITS_INFO (SlotCharacteristics1Table, Chara1); } @@ -4588,7 +4585,7 @@ DisplaySlotCharacteristics2 ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SLOT_CHARACTERISTICS_2), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SLOT_CHARACTERISTICS_2), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Chara2, Option); PRINT_BITS_INFO (SlotCharacteristics2Table, Chara2); } @@ -4605,7 +4602,7 @@ DisplaySystemSlotInformation ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_SLOT_INFORMATION), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_SLOT_INFORMATION), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Width, Option); PRINT_TABLE_ITEM (SystemSlotInformationTable, Width); } @@ -4622,7 +4619,7 @@ DisplaySystemSlotPhysicalWidth ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_SLOT_PHYSICAL_WIDTH), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_SLOT_PHYSICAL_WIDTH), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Width, Option); PRINT_TABLE_ITEM (SystemSlotPhysicalWidthTable, Width); } @@ -4639,7 +4636,7 @@ DisplaySystemSlotHeight ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_SLOT_HEIGHT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_SLOT_HEIGHT), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Length, Option); PRINT_TABLE_ITEM (SystemSlotHeightTable, Length); } @@ -4656,7 +4653,7 @@ DisplayOnboardDeviceTypes ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_ONBOARD_DEVICE_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_ONBOARD_DEVICE_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Type, Option); PRINT_TABLE_ITEM (OnboardDeviceTypesTable, Type); } @@ -4673,7 +4670,7 @@ DisplaySELTypes ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_EVENT_LOG_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_EVENT_LOG_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Type, Option); PRINT_TABLE_ITEM (SELTypesTable, Type); } @@ -4690,7 +4687,7 @@ DisplaySELVarDataFormatType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_EVENT_LOG_VAR_DATA_FORMAT), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_EVENT_LOG_VAR_DATA_FORMAT), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Type, Option); PRINT_TABLE_ITEM (SELVarDataFormatTypeTable, Type); } @@ -4707,7 +4704,7 @@ DisplayPostResultsBitmapDw1 ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_POST_RESULTS_BITMAP), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_POST_RESULTS_BITMAP), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Key, Option); PRINT_BITS_INFO (PostResultsBitmapDw1Table, Key); } @@ -4724,7 +4721,7 @@ DisplayPostResultsBitmapDw2 ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_POST_RESULTS_SECOND_DWORD), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_POST_RESULTS_SECOND_DWORD), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Key, Option); PRINT_BITS_INFO (PostResultsBitmapDw2Table, Key); } @@ -4743,20 +4740,20 @@ DisplaySELSysManagementTypes ( { UINT8 Temp; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_MANAGEMENT_TYPES), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_MANAGEMENT_TYPES), gShellDebug1HiiHandle); PRINT_INFO_OPTION (SMType, Option); // // Deal with wide range Value // if (SMType >= 0x80000000) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_OEM_ASSIGNED), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_OEM_ASSIGNED), gShellDebug1HiiHandle); } else if (SMType >= 0x00020000) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_RSVD_FOR_FUTURE_ASSIGN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_RSVD_FOR_FUTURE_ASSIGN), gShellDebug1HiiHandle); } else if (SMType >= 0x00010000) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_MANAGEMENT_PROBE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_MANAGEMENT_PROBE), gShellDebug1HiiHandle); } else if (SMType >= 0x31) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_RSVD_FOR_FUTURE_ASSIGN), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_RSVD_FOR_FUTURE_ASSIGN), gShellDebug1HiiHandle); } else { // // Deal with One byte data @@ -4778,7 +4775,7 @@ DisplayPMALocation ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PHYS_MEM_ARRAY_LOCATION), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PHYS_MEM_ARRAY_LOCATION), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Location, Option); PRINT_TABLE_ITEM (PMALocationTable, Location); } @@ -4795,7 +4792,7 @@ DisplayPMAUse ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PHYS_MEM_ARRAY_USE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PHYS_MEM_ARRAY_USE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Use, Option); PRINT_TABLE_ITEM (PMAUseTable, Use); } @@ -4812,7 +4809,7 @@ DisplayPMAErrorCorrectionTypes ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PHYS_MEM_ARRAY_ERROR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PHYS_MEM_ARRAY_ERROR), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Type, Option); PRINT_TABLE_ITEM (PMAErrorCorrectionTypesTable, Type); } @@ -4829,7 +4826,7 @@ DisplayMemoryDeviceFormFactor ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_DEVICE_FORM_FACTOR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_DEVICE_FORM_FACTOR), gShellDebug1HiiHandle); PRINT_INFO_OPTION (FormFactor, Option); PRINT_TABLE_ITEM (MemoryDeviceFormFactorTable, FormFactor); } @@ -4846,7 +4843,7 @@ DisplayMemoryDeviceType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_DEVICE_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_DEVICE_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Type, Option); PRINT_TABLE_ITEM (MemoryDeviceTypeTable, Type); } @@ -4863,7 +4860,7 @@ DisplayMemoryDeviceTypeDetail ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_DEVICE_TYPE_DETAIL), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_DEVICE_TYPE_DETAIL), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Para, Option); PRINT_BITS_INFO (MemoryDeviceTypeDetailTable, Para); } @@ -4880,7 +4877,7 @@ DisplayMemoryDeviceMemoryTechnology ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_DEVICE_MEMORY_TECHNOLOGY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_DEVICE_MEMORY_TECHNOLOGY), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Para, Option); PRINT_TABLE_ITEM (MemoryDeviceMemoryTechnologyTable, Para); } @@ -4897,7 +4894,7 @@ DisplayMemoryDeviceMemoryOperatingModeCapability ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_DEVICE_MEM_OPER_MODE_CAPA), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_DEVICE_MEM_OPER_MODE_CAPA), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Para, Option); PRINT_BITS_INFO (MemoryDeviceMemoryOperatingModeCapabilityTable, Para); } @@ -4914,7 +4911,7 @@ DisplayMemoryErrorType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_ERROR_INFO), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_ERROR_INFO), gShellDebug1HiiHandle); PRINT_INFO_OPTION (ErrorType, Option); PRINT_TABLE_ITEM (MemoryErrorTypeTable, ErrorType); } @@ -4931,7 +4928,7 @@ DisplayMemoryErrorGranularity ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_ERROR_GRANULARITY), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_ERROR_GRANULARITY), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Granularity, Option); PRINT_TABLE_ITEM (MemoryErrorGranularityTable, Granularity); } @@ -4948,7 +4945,7 @@ DisplayMemoryErrorOperation ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_ERROR_OP), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_ERROR_OP), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Operation, Option); PRINT_TABLE_ITEM (MemoryErrorOperationTable, Operation); } @@ -4965,7 +4962,7 @@ DisplayPointingDeviceType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_POINTING_DEVICE_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_POINTING_DEVICE_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Type, Option); PRINT_TABLE_ITEM (PointingDeviceTypeTable, Type); } @@ -4982,7 +4979,7 @@ DisplayPointingDeviceInterface ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_POINTING_DEVICE_INTERFACE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_POINTING_DEVICE_INTERFACE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Interface, Option); PRINT_TABLE_ITEM (PointingDeviceInterfaceTable, Interface); } @@ -4999,7 +4996,7 @@ DisplayPBDeviceChemistry ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PORTABLE_BATT_DEV_CHEM), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PORTABLE_BATT_DEV_CHEM), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Key, Option); PRINT_TABLE_ITEM (PBDeviceChemistryTable, Key); } @@ -5019,7 +5016,7 @@ DisplayVPLocation ( UINT8 Loc; Loc = (UINT8)((Key & 0xE0) >> 5); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_VOLTAGE_PROBE_LOC), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_VOLTAGE_PROBE_LOC), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Loc, Option); PRINT_TABLE_ITEM (VPLocationTable, Loc); } @@ -5039,7 +5036,7 @@ DisplayVPStatus ( UINT8 Status; Status = (UINT8)(Key & 0x1F); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_VOLTAGE_PROBE_STATUS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_VOLTAGE_PROBE_STATUS), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Status, Option); PRINT_TABLE_ITEM (VPStatusTable, Status); } @@ -5059,7 +5056,7 @@ DisplayCoolingDeviceStatus ( UINT8 Status; Status = (UINT8)((Key & 0xE0) >> 5); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_COOLING_DEV_STATUS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_COOLING_DEV_STATUS), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Status, Option); PRINT_TABLE_ITEM (CoolingDeviceStatusTable, Status); } @@ -5079,7 +5076,7 @@ DisplayCoolingDeviceType ( UINT8 Type; Type = (UINT8)(Key & 0x1F); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_COOLING_DEV_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_COOLING_DEV_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Type, Option); PRINT_TABLE_ITEM (CoolingDeviceTypeTable, Type); } @@ -5099,7 +5096,7 @@ DisplayTemperatureProbeStatus ( UINT8 Status; Status = (UINT8)((Key & 0xE0) >> 5); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_TEMP_PROBE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_TEMP_PROBE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Status, Option); PRINT_TABLE_ITEM (TemperatureProbeStatusTable, Status); } @@ -5119,7 +5116,7 @@ DisplayTemperatureProbeLoc ( UINT8 Loc; Loc = (UINT8)(Key & 0x1F); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_VOLTAGE_PROBE_LOC), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_VOLTAGE_PROBE_LOC), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Loc, Option); PRINT_TABLE_ITEM (TemperatureProbeLocTable, Loc); } @@ -5139,7 +5136,7 @@ DisplayECPStatus ( UINT8 Status; Status = (UINT8)((Key & 0xE0) >> 5); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_ELEC_PROBE_STATUS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_ELEC_PROBE_STATUS), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Status, Option); PRINT_TABLE_ITEM (ECPStatusTable, Status); } @@ -5159,7 +5156,7 @@ DisplayECPLoc ( UINT8 Loc; Loc = (UINT8)(Key & 0x1F); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_ELEC_PROBE_LOC), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_ELEC_PROBE_LOC), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Loc, Option); PRINT_TABLE_ITEM (ECPLocTable, Loc); } @@ -5176,7 +5173,7 @@ DisplayMDType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MANAGEMENT_DEV_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MANAGEMENT_DEV_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Key, Option); PRINT_TABLE_ITEM (MDTypeTable, Key); } @@ -5193,7 +5190,7 @@ DisplayMDAddressType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MANAGEMENT_DEV_ADDR_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MANAGEMENT_DEV_ADDR_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Key, Option); PRINT_TABLE_ITEM (MDAddressTypeTable, Key); } @@ -5210,7 +5207,7 @@ DisplayMemoryChannelType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_CHANNEL_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MEM_CHANNEL_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Key, Option); PRINT_TABLE_ITEM (MemoryChannelTypeTable, Key); } @@ -5227,7 +5224,7 @@ DisplayIPMIDIBMCInterfaceType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_BMC_INTERFACE_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_BMC_INTERFACE_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Key, Option); PRINT_TABLE_ITEM (IPMIDIBMCInterfaceTypeTable, Key); } @@ -5244,7 +5241,7 @@ DisplayMCHostInterfaceType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MC_HOST_INTERFACE_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_MC_HOST_INTERFACE_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Key, Option); PRINT_TABLE_ITEM (MCHostInterfaceTypeTable, Key); } @@ -5261,7 +5258,7 @@ DisplayProcessorArchitectureType ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PROCESSOR_ARCH_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_PROCESSOR_ARCH_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Key, Option); PRINT_TABLE_ITEM (ProcessorArchitectureTypesTable, Key); } @@ -5278,7 +5275,7 @@ DisplayFirmwareCharacteristics ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_FIRMWARE_INVENTORY_CHAR), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_FIRMWARE_INVENTORY_CHAR), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Chara, Option); PRINT_BITS_INFO (FirmwareInventoryCharTable, Chara); } @@ -5295,7 +5292,7 @@ DisplayFirmwareState ( IN UINT8 Option ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_FIRMWARE_INVENTORY_STATE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_FIRMWARE_INVENTORY_STATE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Key, Option); PRINT_TABLE_ITEM (FirmwareInventoryStateTable, Key); } @@ -5315,7 +5312,7 @@ DisplayStructureTypeInfo ( // // display // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_STRUCT_TYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_QUERYTABLE_STRUCT_TYPE), gShellDebug1HiiHandle); PRINT_INFO_OPTION (Key, Option); PRINT_TABLE_ITEM (StructureTypeInfoTable, Key); } diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosView.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosView.c index 982e20ead4bf..6679240fb85f 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosView.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosView.c @@ -64,7 +64,7 @@ ShellCommandRunSmbiosView ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"smbiosview", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"smbiosview", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -72,13 +72,13 @@ ShellCommandRunSmbiosView ( } } else { if (ShellCommandLineGetCount (Package) > 1) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"smbiosview"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"smbiosview"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetFlag (Package, L"-t") && (ShellCommandLineGetValue (Package, L"-t") == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"smbiosview", L"-t"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"smbiosview", L"-t"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetFlag (Package, L"-h") && (ShellCommandLineGetValue (Package, L"-h") == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"smbiosview", L"-h"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"smbiosview", L"-h"); ShellStatus = SHELL_INVALID_PARAMETER; } else if ( (ShellCommandLineGetFlag (Package, L"-t") && ShellCommandLineGetFlag (Package, L"-h")) || @@ -89,7 +89,7 @@ ShellCommandRunSmbiosView ( (ShellCommandLineGetFlag (Package, L"-s") && ShellCommandLineGetFlag (Package, L"-a")) ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"smbiosview"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"smbiosview"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -98,7 +98,7 @@ ShellCommandRunSmbiosView ( Status1 = LibSmbiosInit (); Status2 = LibSmbios64BitInit (); if (EFI_ERROR (Status1) && EFI_ERROR (Status2)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_CANNOT_GET_TABLE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_LIBSMBIOSVIEW_CANNOT_GET_TABLE), gShellDebug1HiiHandle); ShellStatus = SHELL_NOT_FOUND; goto Done; } @@ -260,7 +260,7 @@ SMBiosView ( SMBiosTable = NULL; LibSmbiosGetEPS (&SMBiosTable); if (SMBiosTable == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle); return EFI_BAD_BUFFER_SIZE; } @@ -274,21 +274,21 @@ SMBiosView ( SmbiosMinorVersion = SMBiosTable->MinorVersion; ShellPrintEx (-1, -1, L"=========================================================\n"); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERY_STRUCT_COND), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERY_STRUCT_COND), gShellDebug1HiiHandle); if (QueryType == STRUCTURE_TYPE_RANDOM) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE_RANDOM), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE_RANDOM), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE), gShellDebug1HiiHandle, QueryType); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE), gShellDebug1HiiHandle, QueryType); } if (RandomView) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE_RANDOM), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE_RANDOM), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE), gShellDebug1HiiHandle, QueryHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE), gShellDebug1HiiHandle, QueryHandle); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SHOWTYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SHOWTYPE), gShellDebug1HiiHandle); ShellPrintEx (-1, -1, GetShowTypeString (gShowType)); ShellPrintEx (-1, -1, L"\n\n"); @@ -337,20 +337,17 @@ SMBiosView ( } ShellPrintEx (-1, -1, L"\n=========================================================\n"); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE_HANDLE_DUMP_STRUCT), gShellDebug1HiiHandle, SmbiosStruct.Hdr->Type, SmbiosStruct.Hdr->Handle ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX_LENGTH), gShellDebug1HiiHandle, Index, Length); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX_LENGTH), gShellDebug1HiiHandle, Index, Length); // // Addr of structure in structure in table // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ADDR), gShellDebug1HiiHandle, (UINTN)Buffer); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ADDR), gShellDebug1HiiHandle, (UINTN)Buffer); DumpHex (0, 0, Length, Buffer); /* @@ -438,7 +435,7 @@ SMBios64View ( SMBiosTable = NULL; LibSmbios64BitGetEPS (&SMBiosTable); if (SMBiosTable == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle); return EFI_BAD_BUFFER_SIZE; } @@ -452,21 +449,21 @@ SMBios64View ( SmbiosMinorVersion = SMBiosTable->MinorVersion; ShellPrintEx (-1, -1, L"=========================================================\n"); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERY_STRUCT_COND), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERY_STRUCT_COND), gShellDebug1HiiHandle); if (QueryType == STRUCTURE_TYPE_RANDOM) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE_RANDOM), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE_RANDOM), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE), gShellDebug1HiiHandle, QueryType); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYTYPE), gShellDebug1HiiHandle, QueryType); } if (RandomView) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE_RANDOM), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE_RANDOM), gShellDebug1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE), gShellDebug1HiiHandle, QueryHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERYHANDLE), gShellDebug1HiiHandle, QueryHandle); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SHOWTYPE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SHOWTYPE), gShellDebug1HiiHandle); ShellPrintEx (-1, -1, GetShowTypeString (gShowType)); ShellPrintEx (-1, -1, L"\n\n"); @@ -515,20 +512,17 @@ SMBios64View ( } ShellPrintEx (-1, -1, L"\n=========================================================\n"); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE_HANDLE_DUMP_STRUCT), gShellDebug1HiiHandle, SmbiosStruct.Hdr->Type, SmbiosStruct.Hdr->Handle ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX_LENGTH), gShellDebug1HiiHandle, Index, Length); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX_LENGTH), gShellDebug1HiiHandle, Index, Length); // // Addr of structure in structure in table // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ADDR), gShellDebug1HiiHandle, (UINTN)Buffer); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ADDR), gShellDebug1HiiHandle, (UINTN)Buffer); DumpHex (0, 0, Length, Buffer); /* @@ -609,12 +603,12 @@ InitSmbiosTableStatistics ( SMBiosTable = NULL; LibSmbiosGetEPS (&SMBiosTable); if (SMBiosTable == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle); return EFI_NOT_FOUND; } if (CompareMem (SMBiosTable->AnchorString, SMBIOS_ANCHOR_STRING, SMBIOS_ANCHOR_STRING_LENGTH) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SMBIOS_TABLE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SMBIOS_TABLE), gShellDebug1HiiHandle); return EFI_INVALID_PARAMETER; } @@ -629,7 +623,7 @@ InitSmbiosTableStatistics ( mStatisticsTable = (STRUCTURE_STATISTICS *)AllocateZeroPool (SMBiosTable->NumberOfSmbiosStructures * sizeof (STRUCTURE_STATISTICS)); if (mStatisticsTable == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OUT_OF_MEM), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OUT_OF_MEM), gShellDebug1HiiHandle); return EFI_OUT_OF_RESOURCES; } @@ -750,12 +744,12 @@ InitSmbios64BitTableStatistics ( SMBiosTable = NULL; LibSmbios64BitGetEPS (&SMBiosTable); if (SMBiosTable == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle); return EFI_NOT_FOUND; } if (CompareMem (SMBiosTable->AnchorString, SMBIOS_3_0_ANCHOR_STRING, SMBIOS_3_0_ANCHOR_STRING_LENGTH) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SMBIOS_TABLE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SMBIOS_TABLE), gShellDebug1HiiHandle); return EFI_INVALID_PARAMETER; } @@ -778,7 +772,7 @@ InitSmbios64BitTableStatistics ( mSmbios64BitStatisticsTable = (STRUCTURE_STATISTICS *)AllocateZeroPool (mNumberOfSmbios64BitStructures * sizeof (STRUCTURE_STATISTICS)); if (mSmbios64BitStatisticsTable == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OUT_OF_MEM), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OUT_OF_MEM), gShellDebug1HiiHandle); return EFI_OUT_OF_RESOURCES; } @@ -851,7 +845,7 @@ DisplayStatisticsTable ( // LibSmbiosGetEPS (&SMBiosTable); if (SMBiosTable == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle); return EFI_UNSUPPORTED; } @@ -863,7 +857,7 @@ DisplayStatisticsTable ( } if (mStatisticsTable == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_STATS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_STATS), gShellDebug1HiiHandle); return EFI_NOT_FOUND; } @@ -874,12 +868,12 @@ DisplayStatisticsTable ( // display statistics table content // for (Index = 1; Index <= Num; Index++) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX), gShellDebug1HiiHandle, StatisticsPointer->Index); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE), gShellDebug1HiiHandle, StatisticsPointer->Type); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_HANDLE), gShellDebug1HiiHandle, StatisticsPointer->Handle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX), gShellDebug1HiiHandle, StatisticsPointer->Index); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE), gShellDebug1HiiHandle, StatisticsPointer->Type); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_HANDLE), gShellDebug1HiiHandle, StatisticsPointer->Handle); if (Option >= SHOW_DETAIL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OFFSET), gShellDebug1HiiHandle, StatisticsPointer->Addr); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_LENGTH), gShellDebug1HiiHandle, StatisticsPointer->Length); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OFFSET), gShellDebug1HiiHandle, StatisticsPointer->Addr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_LENGTH), gShellDebug1HiiHandle, StatisticsPointer->Length); } ShellPrintEx (-1, -1, L"\n"); @@ -890,7 +884,7 @@ DisplayStatisticsTable ( // Display 20 lines and wait for a page break // if (Index % 20 == 0) { - ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ENTER_CONTINUE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ENTER_CONTINUE), gShellDebug1HiiHandle); Status = WaitEnter (); if (EFI_ERROR (Status)) { if (Status == EFI_ABORTED) { @@ -933,7 +927,7 @@ DisplaySmbios64BitStatisticsTable ( // LibSmbios64BitGetEPS (&SMBiosTable); if (SMBiosTable == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_TABLE), gShellDebug1HiiHandle); return EFI_UNSUPPORTED; } @@ -945,7 +939,7 @@ DisplaySmbios64BitStatisticsTable ( } if (mSmbios64BitStatisticsTable == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_STATS), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_CANNOT_ACCESS_STATS), gShellDebug1HiiHandle); return EFI_NOT_FOUND; } @@ -956,12 +950,12 @@ DisplaySmbios64BitStatisticsTable ( // display statistics table content // for (Index = 1; Index <= Num; Index++) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX), gShellDebug1HiiHandle, StatisticsPointer->Index); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE), gShellDebug1HiiHandle, StatisticsPointer->Type); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_HANDLE), gShellDebug1HiiHandle, StatisticsPointer->Handle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_INDEX), gShellDebug1HiiHandle, StatisticsPointer->Index); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE), gShellDebug1HiiHandle, StatisticsPointer->Type); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_HANDLE), gShellDebug1HiiHandle, StatisticsPointer->Handle); if (Option >= SHOW_DETAIL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OFFSET), gShellDebug1HiiHandle, StatisticsPointer->Addr); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_LENGTH), gShellDebug1HiiHandle, StatisticsPointer->Length); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_OFFSET), gShellDebug1HiiHandle, StatisticsPointer->Addr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_LENGTH), gShellDebug1HiiHandle, StatisticsPointer->Length); } ShellPrintEx (-1, -1, L"\n"); @@ -972,7 +966,7 @@ DisplaySmbios64BitStatisticsTable ( // Display 20 lines and wait for a page break // if (Index % 20 == 0) { - ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ENTER_CONTINUE), gShellDebug1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_ENTER_CONTINUE), gShellDebug1HiiHandle); Status = WaitEnter (); if (EFI_ERROR (Status)) { if (Status == EFI_ABORTED) { diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c index 6e9a6092871d..760126fbbddf 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c @@ -154,7 +154,7 @@ ConnectControllers ( } if ((Output && !EFI_ERROR (Status)) || AlwaysOutput) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HANDLE_RESULT), gShellDriver1HiiHandle, L"Connect", ConvertHandleToHandleIndex (*HandleWalker), Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HANDLE_RESULT), gShellDriver1HiiHandle, L"Connect", ConvertHandleToHandleIndex (*HandleWalker), Status); } } } else { @@ -164,7 +164,7 @@ ConnectControllers ( } if ((Output && !EFI_ERROR (Status)) || AlwaysOutput) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HANDLE_RESULT), gShellDriver1HiiHandle, L"Connect", ConvertHandleToHandleIndex (ControllerHandle), Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HANDLE_RESULT), gShellDriver1HiiHandle, L"Connect", ConvertHandleToHandleIndex (ControllerHandle), Status); } } @@ -520,7 +520,7 @@ ShellCommandRunConnect ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"connect", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"connect", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -540,7 +540,7 @@ ShellCommandRunConnect ( // // error for too many parameters // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"connect"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"connect"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetFlag (Package, L"-c")) { // @@ -562,7 +562,7 @@ ShellCommandRunConnect ( if (Param1 != NULL) { Status = ShellConvertStringToUint64 (Param1, &Intermediate, TRUE, FALSE); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"connect", Param1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"connect", Param1); ShellStatus = SHELL_INVALID_PARAMETER; if (Package != NULL) { ShellCommandLineFreeVarList (Package); @@ -581,7 +581,7 @@ ShellCommandRunConnect ( if (!EFI_ERROR (Status)) { Handle2 = ConvertHandleIndexToHandle ((UINTN)Intermediate); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"connect", Param2); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"connect", Param2); ShellStatus = SHELL_INVALID_PARAMETER; } } else { @@ -590,18 +590,18 @@ ShellCommandRunConnect ( if (ShellStatus == SHELL_SUCCESS) { if ((Param1 != NULL) && (Handle1 == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"connect", Param1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"connect", Param1); ShellStatus = SHELL_INVALID_PARAMETER; } else if ((Param2 != NULL) && (Handle2 == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"connect", Param2); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"connect", Param2); ShellStatus = SHELL_INVALID_PARAMETER; } else if ((Handle2 != NULL) && (Handle1 != NULL) && EFI_ERROR (gBS->OpenProtocol (Handle2, &gEfiDriverBindingProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"connect", Param2); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"connect", Param2); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ConvertAndConnectControllers (Handle1, Handle2, ShellCommandLineGetFlag (Package, L"-r"), (BOOLEAN)(Count != 0)); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_CONNECT_NONE), gShellDriver1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_CONNECT_NONE), gShellDriver1HiiHandle); ShellStatus = SHELL_DEVICE_ERROR; } } diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/DevTree.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/DevTree.c index 3f14560fda2e..fcb8c20ca476 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/DevTree.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/DevTree.c @@ -179,7 +179,7 @@ ShellCommandRunDevTree ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"devtree", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"devtree", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -187,7 +187,7 @@ ShellCommandRunDevTree ( } } else { if (ShellCommandLineGetCount (Package) > 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"devtree"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"devtree"); ShellCommandLineFreeVarList (Package); return (SHELL_INVALID_PARAMETER); } @@ -196,7 +196,7 @@ ShellCommandRunDevTree ( if (Lang != NULL) { Language = AllocateZeroPool (StrSize (Lang)); if (Language == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"devtree"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"devtree"); ShellCommandLineFreeVarList (Package); return (SHELL_OUT_OF_RESOURCES); } @@ -208,7 +208,7 @@ ShellCommandRunDevTree ( // AsciiSPrint(Language, 10, "en-us"); } else { ASSERT (Language == NULL); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"devtree", L"-l"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"devtree", L"-l"); ShellCommandLineFreeVarList (Package); return (SHELL_INVALID_PARAMETER); } @@ -269,7 +269,7 @@ ShellCommandRunDevTree ( } else { Status = ShellConvertStringToUint64 (Lang, &Intermediate, TRUE, FALSE); if (EFI_ERROR (Status) || (ConvertHandleIndexToHandle ((UINTN)Intermediate) == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"devtree", Lang); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"devtree", Lang); ShellStatus = SHELL_INVALID_PARAMETER; } else { ShellStatus = DoDevTreeForHandle (ConvertHandleIndexToHandle ((UINTN)Intermediate), Language, FlagD, 0, HiiString); diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/Devices.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/Devices.c index 0225b1a6d360..a743961e3e68 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/Devices.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/Devices.c @@ -167,7 +167,7 @@ ShellCommandRunDevices ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"devices", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"devices", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -181,7 +181,7 @@ ShellCommandRunDevices ( // // error for too many parameters // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"devices"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"devices"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -191,7 +191,7 @@ ShellCommandRunDevices ( if (Lang != NULL) { Language = AllocateZeroPool (StrSize (Lang)); if (Language == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"devices"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"devices"); ShellCommandLineFreeVarList (Package); return (SHELL_OUT_OF_RESOURCES); } @@ -203,7 +203,7 @@ ShellCommandRunDevices ( // AsciiSPrint(Language, 10, "en-us"); } else { ASSERT (Language == NULL); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"devices", L"-l"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"devices", L"-l"); ShellCommandLineFreeVarList (Package); return (SHELL_INVALID_PARAMETER); } diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/Dh.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/Dh.c index f8ddb51ab62d..369e51aee0c2 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/Dh.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/Dh.c @@ -493,14 +493,11 @@ DisplayDriverModelHandle ( Status = gBS->HandleProtocol (Handle, &gEfiDevicePathProtocolGuid, (VOID **)&DevicePath); Status = gEfiShellProtocol->GetDeviceName (Handle, EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8 *)Language, &TempStringPointer); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DRIVER1), gShellDriver1HiiHandle, TempStringPointer != NULL ? TempStringPointer : L""); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DH_OUTPUT_DRIVER1), gShellDriver1HiiHandle, TempStringPointer != NULL ? TempStringPointer : L""); SHELL_FREE_NON_NULL (TempStringPointer); TempStringPointer = ConvertDevicePathToText (DevicePath, TRUE, FALSE); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_DRIVER2), gShellDriver1HiiHandle, TempStringPointer != NULL ? TempStringPointer : L"", @@ -512,19 +509,13 @@ DisplayDriverModelHandle ( SHELL_FREE_NON_NULL (TempStringPointer); if (DriverBindingHandleCount == 0) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_DRIVER3), gShellDriver1HiiHandle, L"" ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_DRIVER3), gShellDriver1HiiHandle, L"" @@ -547,20 +538,14 @@ DisplayDriverModelHandle ( } if (Image) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_DRIVER4A), gShellDriver1HiiHandle, ConvertHandleToHandleIndex (DriverBindingHandleBuffer[Index]), DriverName != NULL ? DriverName : L"" ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_DRIVER4B), gShellDriver1HiiHandle, ConvertHandleToHandleIndex (DriverBindingHandleBuffer[Index]), @@ -573,29 +558,20 @@ DisplayDriverModelHandle ( } if (ParentControllerHandleCount == 0) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_DRIVER5), gShellDriver1HiiHandle, L"" ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_DRIVER5), gShellDriver1HiiHandle, L"" ); for (Index = 0; Index < ParentControllerHandleCount; Index++) { Status = gEfiShellProtocol->GetDeviceName (ParentControllerHandleBuffer[Index], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8 *)Language, &TempStringPointer); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_DRIVER5B), gShellDriver1HiiHandle, ConvertHandleToHandleIndex (ParentControllerHandleBuffer[Index]), @@ -606,29 +582,20 @@ DisplayDriverModelHandle ( } if (ChildControllerHandleCount == 0) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_DRIVER6), gShellDriver1HiiHandle, L"" ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_DRIVER6), gShellDriver1HiiHandle, L"" ); for (Index = 0; Index < ChildControllerHandleCount; Index++) { Status = gEfiShellProtocol->GetDeviceName (ChildControllerHandleBuffer[Index], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8 *)Language, &TempStringPointer); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B), gShellDriver1HiiHandle, ConvertHandleToHandleIndex (ChildControllerHandleBuffer[Index]), @@ -688,10 +655,7 @@ DisplayDriverModelHandle ( DriverName = NULL; } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_DRIVER7), gShellDriver1HiiHandle, ConvertHandleToHandleIndex (Handle), @@ -706,20 +670,14 @@ DisplayDriverModelHandle ( DriverName = NULL; } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_DRIVER7B), gShellDriver1HiiHandle, DriverName != NULL ? DriverName : L"" ); SHELL_FREE_NON_NULL (DriverName); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_DRIVER8), gShellDriver1HiiHandle, DriverBinding->Version, @@ -729,19 +687,13 @@ DisplayDriverModelHandle ( ); if (ControllerHandleCount == 0) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_DRIVER9), gShellDriver1HiiHandle, L"None" ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_DRIVER9), gShellDriver1HiiHandle, L"" @@ -749,10 +701,7 @@ DisplayDriverModelHandle ( for (HandleIndex = 0; HandleIndex < ControllerHandleCount; HandleIndex++) { Status = gEfiShellProtocol->GetDeviceName (ControllerHandleBuffer[HandleIndex], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8 *)Language, &TempStringPointer); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_DRIVER9B), gShellDriver1HiiHandle, ConvertHandleToHandleIndex (ControllerHandleBuffer[HandleIndex]), @@ -770,10 +719,7 @@ DisplayDriverModelHandle ( for (ChildIndex = 0; ChildIndex < ChildControllerHandleCount; ChildIndex++) { Status = gEfiShellProtocol->GetDeviceName (ChildControllerHandleBuffer[ChildIndex], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8 *)Language, &TempStringPointer); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_DRIVER6C), gShellDriver1HiiHandle, ConvertHandleToHandleIndex (ChildControllerHandleBuffer[ChildIndex]), @@ -820,10 +766,7 @@ DoDhByHandle ( if (!Sfo) { if (Multiple) { ProtocolInfoString = GetProtocolInfoString (TheHandle, Language, L" ", Verbose, TRUE); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT), gShellDriver1HiiHandle, ConvertHandleToHandleIndex (TheHandle), @@ -832,10 +775,7 @@ DoDhByHandle ( } else { ProtocolInfoString = GetProtocolInfoString (TheHandle, Language, Verbose ? L"\r\n" : L" ", Verbose, TRUE); if (Verbose) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_SINGLE), gShellDriver1HiiHandle, ConvertHandleToHandleIndex (TheHandle), @@ -843,10 +783,7 @@ DoDhByHandle ( ProtocolInfoString == NULL ? L"" : ProtocolInfoString ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_SINGLE_D), gShellDriver1HiiHandle, ConvertHandleToHandleIndex (TheHandle), @@ -860,10 +797,7 @@ DoDhByHandle ( } } else { ProtocolInfoString = GetProtocolInfoString (TheHandle, Language, L";", FALSE, FALSE); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DH_OUTPUT_SFO), gShellDriver1HiiHandle, Multiple ? L"HandlesInfo" : L"HandleInfo", @@ -944,13 +878,13 @@ DoDhByProtocolGuid ( if (!Sfo) { if (Guid == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_ALL_HEADER), gShellDriver1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DH_OUTPUT_ALL_HEADER), gShellDriver1HiiHandle); } else { Name = GetStringNameFromGuid (Guid, NULL); if (Name == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_GUID_HEADER), gShellDriver1HiiHandle, Guid); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DH_OUTPUT_GUID_HEADER), gShellDriver1HiiHandle, Guid); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_NAME_HEADER), gShellDriver1HiiHandle, Name); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DH_OUTPUT_NAME_HEADER), gShellDriver1HiiHandle, Name); } } } @@ -1001,7 +935,7 @@ DoDhByProtocol ( // Status = GetGuidFromStringName (Protocol, Language, &GuidPtr); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_NAME_FOUND), gShellDriver1HiiHandle, Protocol); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DH_NO_NAME_FOUND), gShellDriver1HiiHandle, Protocol); return (SHELL_NOT_FOUND); } } @@ -1049,9 +983,9 @@ DoDecodeByProtocol ( for (Index = 0; Index < Counts; Index++) { Name = GetStringNameFromGuid (&Guids[Index], Language); if (Name != NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Name, &Guids[Index]); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Name, &Guids[Index]); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, &Guids[Index]); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, &Guids[Index]); } SHELL_FREE_NON_NULL (Name); @@ -1064,18 +998,18 @@ DoDecodeByProtocol ( if (ConvertStrToGuid (Protocol, &Guid) == EFI_SUCCESS) { Name = GetStringNameFromGuid (&Guid, Language); if (Name != NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Name, &Guid); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Name, &Guid); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, &Guid); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, &Guid); } SHELL_FREE_NON_NULL (Name); } else { Status = GetGuidFromStringName (Protocol, Language, &Guids); if (Status == EFI_SUCCESS) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Protocol, Guids); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Protocol, Guids); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_NAME_FOUND), gShellDriver1HiiHandle, Protocol); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DH_NO_NAME_FOUND), gShellDriver1HiiHandle, Protocol); } } } @@ -1129,7 +1063,7 @@ ShellCommandRunDh ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"dh", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"dh", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -1137,7 +1071,7 @@ ShellCommandRunDh ( } } else { if (ShellCommandLineGetCount (Package) > 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh"); ShellCommandLineFreeVarList (Package); return (SHELL_INVALID_PARAMETER); } @@ -1147,7 +1081,7 @@ ShellCommandRunDh ( if (Lang != NULL) { Language = AllocateZeroPool (StrSize (Lang)); if (Language == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"dh"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"dh"); ShellCommandLineFreeVarList (Package); return (SHELL_OUT_OF_RESOURCES); } @@ -1155,14 +1089,14 @@ ShellCommandRunDh ( AsciiSPrint (Language, StrSize (Lang), "%S", Lang); } else { ASSERT (Language == NULL); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-l"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-l"); ShellCommandLineFreeVarList (Package); return (SHELL_INVALID_PARAMETER); } } else { Language = AllocateZeroPool (10); if (Language == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"dh"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"dh"); ShellCommandLineFreeVarList (Package); return (SHELL_OUT_OF_RESOURCES); } @@ -1178,7 +1112,7 @@ ShellCommandRunDh ( if (RawValue == NULL) { if (ShellCommandLineGetFlag (Package, L"-p") && (ProtocolVal == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-p"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-p"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -1190,7 +1124,7 @@ ShellCommandRunDh ( (gUnicodeCollation->StriColl (gUnicodeCollation, L"decode", (CHAR16 *)RawValue) == 0)) { if (ShellCommandLineGetFlag (Package, L"-p") && (ProtocolVal == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-p"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-p"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -1200,17 +1134,17 @@ ShellCommandRunDh ( } } else { if (ShellCommandLineGetFlag (Package, L"-p")) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellConvertStringToUint64 (RawValue, &Intermediate, TRUE, FALSE); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"dh", RawValue); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"dh", RawValue); ShellStatus = SHELL_INVALID_PARAMETER; } else { Handle = ConvertHandleIndexToHandle ((UINTN)Intermediate); if (Handle == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"dh", RawValue); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"dh", RawValue); ShellStatus = SHELL_INVALID_PARAMETER; } else { // diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/Disconnect.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/Disconnect.c index 0ff6a40c8c4d..f8ccd325dff7 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/Disconnect.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/Disconnect.c @@ -118,7 +118,7 @@ ShellCommandRunDisconnect ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"disconnect", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"disconnect", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -127,10 +127,10 @@ ShellCommandRunDisconnect ( } else { if (ShellCommandLineGetFlag (Package, L"-r")) { if (ShellCommandLineGetCount (Package) > 1) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"disconnect"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"disconnect"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetCount (Package) < 1) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"disconnect"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"disconnect"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = DisconnectAll (); @@ -147,14 +147,14 @@ ShellCommandRunDisconnect ( } } } else if (ShellCommandLineGetFlag (Package, L"-nc")) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"disconnect"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"disconnect"); ShellStatus = SHELL_INVALID_PARAMETER; } else { if (ShellCommandLineGetCount (Package) > 4) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"disconnect"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"disconnect"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetCount (Package) < 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"disconnect"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"disconnect"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -183,22 +183,22 @@ ShellCommandRunDisconnect ( } if ((Param1 != NULL) && (Handle1 == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"disconnect", Param1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"disconnect", Param1); ShellStatus = SHELL_INVALID_PARAMETER; } else if ((Param2 != NULL) && (Handle2 == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"disconnect", Param2); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"disconnect", Param2); ShellStatus = SHELL_INVALID_PARAMETER; } else if ((Param3 != NULL) && (Handle3 == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"disconnect", Param3); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"disconnect", Param3); ShellStatus = SHELL_INVALID_PARAMETER; } else if ((Handle2 != NULL) && EFI_ERROR (gBS->OpenProtocol (Handle2, &gEfiDriverBindingProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) { ASSERT (Param2 != NULL); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_NOT), gShellDriver1HiiHandle, L"disconnect", ShellStrToUintn (Param2), L"driver handle"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_HANDLE_NOT), gShellDriver1HiiHandle, L"disconnect", ShellStrToUintn (Param2), L"driver handle"); ShellStatus = SHELL_INVALID_PARAMETER; } else { ASSERT (Param1 != NULL); Status = gBS->DisconnectController (Handle1, Handle2, Handle3); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_3P_RESULT), gShellDriver1HiiHandle, L"Disconnect", (UINTN)Intermediate1, (UINTN)Intermediate2, (UINTN)Intermediate3, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_3P_RESULT), gShellDriver1HiiHandle, L"Disconnect", (UINTN)Intermediate1, (UINTN)Intermediate2, (UINTN)Intermediate3, Status); } } } diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/Drivers.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/Drivers.c index 78484aebf6f1..7ef1c0021239 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/Drivers.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/Drivers.c @@ -312,7 +312,7 @@ ShellCommandRunDrivers ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"drivers", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"drivers", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -320,7 +320,7 @@ ShellCommandRunDrivers ( } } else { if (ShellCommandLineGetCount (Package) > 1) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"drivers"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"drivers"); ShellStatus = SHELL_INVALID_PARAMETER; } else { if (ShellCommandLineGetFlag (Package, L"-l")) { @@ -328,7 +328,7 @@ ShellCommandRunDrivers ( if (Lang != NULL) { Language = AllocateZeroPool (StrSize (Lang)); if (Language == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"drivers"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"drivers"); ShellCommandLineFreeVarList (Package); return (SHELL_OUT_OF_RESOURCES); } @@ -336,7 +336,7 @@ ShellCommandRunDrivers ( AsciiSPrint (Language, StrSize (Lang), "%S", Lang); } else { ASSERT (Language == NULL); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drivers", L"-l"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drivers", L"-l"); ShellCommandLineFreeVarList (Package); return (SHELL_INVALID_PARAMETER); } @@ -372,7 +372,7 @@ ShellCommandRunDrivers ( if (FormatString == NULL) { // Assume the string is present because it is hard-coded and report out of memory - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"drivers"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"drivers"); ShellCommandLineFreeVarList (Package); return (SHELL_OUT_OF_RESOURCES); } @@ -396,7 +396,7 @@ ShellCommandRunDrivers ( if (!SfoFlag && (FullDriverName != NULL)) { TruncatedDriverName = AllocateZeroPool ((MAX_LEN_DRIVER_NAME + 1) * sizeof (CHAR16)); if (TruncatedDriverName == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"drivers"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"drivers"); ShellCommandLineFreeVarList (Package); return (SHELL_OUT_OF_RESOURCES); } diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvCfg.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvCfg.c index f50a2c468726..0f8306b57be5 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvCfg.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvCfg.c @@ -179,10 +179,7 @@ ConfigToFile ( Status = ShellOpenFileByName (FileName, &FileHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE|EFI_FILE_MODE_CREATE, 0); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDriver1HiiHandle, L"drvcfg", @@ -202,10 +199,7 @@ ConfigToFile ( ); if (EFI_ERROR (Status) || (HiiDatabase == NULL)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellDriver1HiiHandle, L"drvcfg", @@ -219,10 +213,7 @@ ConfigToFile ( HiiHandle = NULL; Status = ConvertHandleToHiiHandle (Handle, &HiiHandle, HiiDatabase); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_HANDLE_NOT), gShellDriver1HiiHandle, L"drvcfg", @@ -237,10 +228,7 @@ ConfigToFile ( if (Status == EFI_BUFFER_TOO_SMALL) { MainBuffer = AllocateZeroPool (MainBufferSize); if (MainBuffer == NULL) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"drvcfg" @@ -252,10 +240,7 @@ ConfigToFile ( Status = HiiDatabase->ExportPackageLists (HiiDatabase, HiiHandle, &MainBufferSize, MainBuffer); if (EFI_ERROR (Status)) { SHELL_FREE_NON_NULL (MainBuffer); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"drvcfg" @@ -271,10 +256,7 @@ ConfigToFile ( SHELL_FREE_NON_NULL (MainBuffer); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_FILE_WRITE_FAIL), gShellDriver1HiiHandle, L"drvcfg", @@ -283,10 +265,7 @@ ConfigToFile ( return (SHELL_DEVICE_ERROR); } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_COMP), gShellDriver1HiiHandle ); @@ -342,10 +321,7 @@ ParseBufferConfig ( // TempDevPathString = ConvertDevicePathToText ((EFI_DEVICE_PATH_PROTOCOL *)(((CHAR8 *)PackageHeader) + sizeof (EFI_HII_PACKAGE_HEADER)), TRUE, TRUE); if (TempDevPathString == NULL) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"drvcfg" @@ -354,10 +330,7 @@ ParseBufferConfig ( return SHELL_OUT_OF_RESOURCES; } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_IN_FILE_NF), gShellDriver1HiiHandle, TempDevPathString @@ -366,10 +339,7 @@ ParseBufferConfig ( } else { Status = HiiDatabase->UpdatePackageList (HiiDatabase, HiiHandle, PackageListHeader); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellDriver1HiiHandle, L"drvcfg", @@ -383,10 +353,7 @@ ParseBufferConfig ( DevPath = (EFI_DEVICE_PATH_PROTOCOL *)(((CHAR8 *)PackageHeader) + sizeof (EFI_HII_PACKAGE_HEADER)); gBS->LocateDevicePath (&gEfiHiiConfigAccessProtocolGuid, &DevPath, &Handle); HandleIndex = ConvertHandleToHandleIndex (Handle); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_DONE_HII), gShellDriver1HiiHandle, HandleIndex @@ -427,10 +394,7 @@ ConfigFromFile ( Status = ShellOpenFileByName (FileName, &FileHandle, EFI_FILE_MODE_READ, 0); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDriver1HiiHandle, L"drvcfg", @@ -452,10 +416,7 @@ ConfigFromFile ( ); if (EFI_ERROR (Status) || (HiiDatabase == NULL)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellDriver1HiiHandle, L"drvcfg", @@ -470,10 +431,7 @@ ConfigFromFile ( Status = ShellGetFileSize (FileHandle, &Temp); MainBufferSize = (UINTN)Temp; if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_FILE_READ_FAIL), gShellDriver1HiiHandle, L"drvcfg", @@ -486,10 +444,7 @@ ConfigFromFile ( MainBuffer = AllocateZeroPool ((UINTN)MainBufferSize); if (MainBuffer == NULL) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"drvcfg" @@ -500,10 +455,7 @@ ConfigFromFile ( } if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"drvcfg" @@ -515,10 +467,7 @@ ConfigFromFile ( Status = ShellReadFile (FileHandle, &MainBufferSize, MainBuffer); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_FILE_READ_FAIL), gShellDriver1HiiHandle, L"drvcfg", @@ -539,10 +488,7 @@ ConfigFromFile ( HiiHandle = NULL; Status = ConvertHandleToHiiHandle (Handle, &HiiHandle, HiiDatabase); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_HANDLE_NOT), gShellDriver1HiiHandle, L"drvcfg", @@ -556,10 +502,7 @@ ConfigFromFile ( Status = HiiDatabase->UpdatePackageList (HiiDatabase, HiiHandle, MainBuffer); if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellDriver1HiiHandle, L"drvcfg", @@ -582,10 +525,7 @@ ConfigFromFile ( } if (ShellStatus == SHELL_SUCCESS) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_COMP), gShellDriver1HiiHandle ); @@ -616,33 +556,33 @@ ShellCmdDriverConfigurationProcessActionRequired ( switch (ActionRequired) { case EfiDriverConfigurationActionNone: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_NONE), gShellDriver1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DRVCFG_NONE), gShellDriver1HiiHandle); break; case EfiDriverConfigurationActionStopController: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_STOP), gShellDriver1HiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_ENTER_S), gShellDriver1HiiHandle, L"stop controller"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DRVCFG_STOP), gShellDriver1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DRVCFG_ENTER_S), gShellDriver1HiiHandle, L"stop controller"); ShellPromptForResponse (ShellPromptResponseTypeEnterContinue, NULL, NULL); gBS->DisconnectController (ControllerHandle, DriverImageHandle, ChildHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_CTLR_S), gShellDriver1HiiHandle, L"stopped"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DRVCFG_CTLR_S), gShellDriver1HiiHandle, L"stopped"); break; case EfiDriverConfigurationActionRestartController: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_RESTART_S), gShellDriver1HiiHandle, L"controller"); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_ENTER_S), gShellDriver1HiiHandle, L"restart controller"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DRVCFG_RESTART_S), gShellDriver1HiiHandle, L"controller"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DRVCFG_ENTER_S), gShellDriver1HiiHandle, L"restart controller"); ShellPromptForResponse (ShellPromptResponseTypeEnterContinue, NULL, NULL); gBS->DisconnectController (ControllerHandle, DriverImageHandle, ChildHandle); ConnectControllerContextOverride[0] = DriverImageHandle; ConnectControllerContextOverride[1] = NULL; gBS->ConnectController (ControllerHandle, ConnectControllerContextOverride, NULL, TRUE); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_CTLR_S), gShellDriver1HiiHandle, L"restarted"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DRVCFG_CTLR_S), gShellDriver1HiiHandle, L"restarted"); break; case EfiDriverConfigurationActionRestartPlatform: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_RESTART_S), gShellDriver1HiiHandle, L"platform"); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_ENTER_S), gShellDriver1HiiHandle, L"restart platform"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DRVCFG_RESTART_S), gShellDriver1HiiHandle, L"platform"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DRVCFG_ENTER_S), gShellDriver1HiiHandle, L"restart platform"); ShellPromptForResponse (ShellPromptResponseTypeEnterContinue, NULL, NULL); gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); @@ -712,27 +652,18 @@ PreHiiDrvCfg ( } if (ForceDefaults) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_FORCE_D), gShellDriver1HiiHandle, DefaultType ); } else if (ValidateOptions) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_VALIDATE), gShellDriver1HiiHandle ); } else if (SetOptions) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_SET), gShellDriver1HiiHandle ); @@ -790,10 +721,7 @@ PreHiiDrvCfg ( } if (EFI_ERROR (Status)) { - // ShellPrintHiiEx( - // -1, - // -1, - // NULL, + // ShellPrintHiiDefaultEx ( // STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT), // gShellDriver1HiiHandle, // ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]) @@ -810,10 +738,7 @@ PreHiiDrvCfg ( NULL ); if (BestLanguage == NULL) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drvcfg", @@ -845,20 +770,14 @@ PreHiiDrvCfg ( ); gST->ConOut->ClearScreen (gST->ConOut); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_ALL_LANG), gShellDriver1HiiHandle, ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]), DriverConfiguration->SupportedLanguages ); if (!EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_OPTIONS_SET), gShellDriver1HiiHandle ); @@ -873,10 +792,7 @@ PreHiiDrvCfg ( } } } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_NOT_SET), gShellDriver1HiiHandle, Status @@ -898,10 +814,7 @@ PreHiiDrvCfg ( if (ChildHandle == NULL) { HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]); HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_CTRL_LANG), gShellDriver1HiiHandle, HandleIndex1, @@ -919,10 +832,7 @@ PreHiiDrvCfg ( ); if (!EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_DEF_FORCED), gShellDriver1HiiHandle ); @@ -933,10 +843,7 @@ PreHiiDrvCfg ( ActionRequired ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_FORCE_FAILED), gShellDriver1HiiHandle, Status @@ -951,18 +858,12 @@ PreHiiDrvCfg ( ); if (!EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID), gShellDriver1HiiHandle ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_OPTIONS_INV), gShellDriver1HiiHandle, Status @@ -981,10 +882,7 @@ PreHiiDrvCfg ( gST->ConOut->ClearScreen (gST->ConOut); HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]); HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_CTRL_LANG), gShellDriver1HiiHandle, HandleIndex1, @@ -992,10 +890,7 @@ PreHiiDrvCfg ( DriverConfiguration->SupportedLanguages ); if (!EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_OPTIONS_SET), gShellDriver1HiiHandle ); @@ -1007,10 +902,7 @@ PreHiiDrvCfg ( ActionRequired ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_NOT_SET), gShellDriver1HiiHandle, Status @@ -1049,10 +941,7 @@ PreHiiDrvCfg ( HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]); HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]); HandleIndex3 = ConvertHandleToHandleIndex (ChildHandleBuffer[ChildIndex]); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_CHILD_LANG), gShellDriver1HiiHandle, HandleIndex1, @@ -1071,10 +960,7 @@ PreHiiDrvCfg ( ); if (!EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_DEF_FORCED), gShellDriver1HiiHandle ); @@ -1086,10 +972,7 @@ PreHiiDrvCfg ( ActionRequired ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_FORCE_FAILED), gShellDriver1HiiHandle, Status @@ -1104,18 +987,12 @@ PreHiiDrvCfg ( ); if (!EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID), gShellDriver1HiiHandle ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_OPTIONS_INV), gShellDriver1HiiHandle, Status @@ -1135,10 +1012,7 @@ PreHiiDrvCfg ( HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]); HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]); HandleIndex3 = ConvertHandleToHandleIndex (ChildHandleBuffer[ChildIndex]); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_CHILD_LANG), gShellDriver1HiiHandle, HandleIndex1, @@ -1147,10 +1021,7 @@ PreHiiDrvCfg ( DriverConfiguration->SupportedLanguages ); if (!EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_OPTIONS_SET), gShellDriver1HiiHandle ); @@ -1162,10 +1033,7 @@ PreHiiDrvCfg ( ActionRequired ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_NOT_SET), gShellDriver1HiiHandle, Status @@ -1227,10 +1095,7 @@ PrintConfigInfoOnAll ( for (CurrentHandle = HandleList; CurrentHandle != NULL && *CurrentHandle != NULL; CurrentHandle++) { Found = TRUE; Index2 = *CurrentHandle == NULL ? 0 : ConvertHandleToHandleIndex (*CurrentHandle); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_LINE_HII), gShellDriver1HiiHandle, Index2 @@ -1256,7 +1121,7 @@ PrintConfigInfoOnAll ( } if (!Found) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_NONE_FOUND), gShellDriver1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DRVCFG_NONE_FOUND), gShellDriver1HiiHandle); return (SHELL_SUCCESS); } @@ -1346,7 +1211,7 @@ ShellCommandRunDrvCfg ( Status = ShellCommandLineParse (ParamListPreHii, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"drvcfg", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"drvcfg", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; @@ -1358,7 +1223,7 @@ ShellCommandRunDrvCfg ( if (ShellStatus == SHELL_SUCCESS) { if (ShellCommandLineGetCount (Package) > 4) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"drvcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"drvcfg"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -1373,7 +1238,7 @@ ShellCommandRunDrvCfg ( AsciiSPrint (Language, StrSize (Lang), "%S", Lang); } else if (ShellCommandLineGetFlag (Package, L"-l")) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drvcfg", L"-l"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drvcfg", L"-l"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -1395,19 +1260,19 @@ ShellCommandRunDrvCfg ( } if (InFromFile && EFI_ERROR (ShellFileExists (FileName))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FIND_FAIL), gShellDriver1HiiHandle, L"drvcfg", FileName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FIND_FAIL), gShellDriver1HiiHandle, L"drvcfg", FileName); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (OutToFile && !EFI_ERROR (ShellFileExists (FileName))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_EXIST), gShellDriver1HiiHandle, L"drvcfg", FileName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_EXIST), gShellDriver1HiiHandle, L"drvcfg", FileName); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (Force && (ForceTypeString == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drvcfg", L"-f"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drvcfg", L"-f"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -1415,7 +1280,7 @@ ShellCommandRunDrvCfg ( if (Force) { Status = ShellConvertStringToUint64 (ForceTypeString, &Intermediate, FALSE, FALSE); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDriver1HiiHandle, L"drvcfg", ForceTypeString, L"-f"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDriver1HiiHandle, L"drvcfg", ForceTypeString, L"-f"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -1430,7 +1295,7 @@ ShellCommandRunDrvCfg ( if ((HandleIndex1 != NULL) && !EFI_ERROR (ShellConvertStringToUint64 (HandleIndex1, &Intermediate, TRUE, FALSE))) { Handle1 = ConvertHandleIndexToHandle ((UINTN)Intermediate); if ((Handle1 == NULL) || ((UINT64)(UINTN)Intermediate != Intermediate)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"drvcfg", HandleIndex1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"drvcfg", HandleIndex1); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -1441,7 +1306,7 @@ ShellCommandRunDrvCfg ( if ((HandleIndex2 != NULL) && !EFI_ERROR (ShellConvertStringToUint64 (HandleIndex2, &Intermediate, TRUE, FALSE))) { Handle2 = ConvertHandleIndexToHandle ((UINTN)Intermediate); if ((Handle2 == NULL) || ((UINT64)(UINTN)Intermediate != Intermediate)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"drvcfg", HandleIndex2); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"drvcfg", HandleIndex2); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -1452,7 +1317,7 @@ ShellCommandRunDrvCfg ( if ((HandleIndex3 != NULL) && !EFI_ERROR (ShellConvertStringToUint64 (HandleIndex3, &Intermediate, TRUE, FALSE))) { Handle3 = ConvertHandleIndexToHandle ((UINTN)Intermediate); if ((Handle3 == NULL) || ((UINT64)(UINTN)Intermediate != Intermediate)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"drvcfg", HandleIndex3); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"drvcfg", HandleIndex3); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -1460,9 +1325,9 @@ ShellCommandRunDrvCfg ( if ((InFromFile || OutToFile) && (FileName == NULL)) { if (FileName == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drvcfg", InFromFile ? L"-i" : L"-o"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drvcfg", InFromFile ? L"-i" : L"-o"); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_REQ), gShellDriver1HiiHandle, L"drvcfg"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_HANDLE_REQ), gShellDriver1HiiHandle, L"drvcfg"); } ShellStatus = SHELL_INVALID_PARAMETER; @@ -1471,38 +1336,38 @@ ShellCommandRunDrvCfg ( if (!UseHii && (InFromFile || OutToFile)) { if (InFromFile) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDriver1HiiHandle, L"drvcfg", L"-i"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDriver1HiiHandle, L"drvcfg", L"-i"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (OutToFile) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDriver1HiiHandle, L"drvcfg", L"-o"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellDriver1HiiHandle, L"drvcfg", L"-o"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } } if (Validate && Force) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-v", L"-f"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-v", L"-f"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (Validate && Set) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-v", L"-s"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-v", L"-s"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (Set && Force) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-s", L"-f"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-s", L"-f"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (OutToFile && InFromFile) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-i", L"-o"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-i", L"-o"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } @@ -1537,10 +1402,7 @@ ShellCommandRunDrvCfg ( goto Done; } else { if (!EFI_ERROR (gBS->OpenProtocol (Handle1, &gEfiHiiConfigAccessProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_LINE_HII), gShellDriver1HiiHandle, ConvertHandleToHandleIndex (Handle1) @@ -1568,10 +1430,7 @@ ShellCommandRunDrvCfg ( } if (ShellStatus == SHELL_UNSUPPORTED) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT), gShellDriver1HiiHandle, ConvertHandleToHandleIndex (Handle1) diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvDiag.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvDiag.c index cb74983e2806..d02d6b52c49c 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvDiag.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvDiag.c @@ -96,8 +96,8 @@ DoDiagnostics ( } else { DriverHandleList = GetHandleListByProtocolList (DiagGuidList); if (DriverHandleList == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellDriver1HiiHandle, L"drvdiag", L"gEfiDriverDiagnosticsProtocolGuid", &gEfiDriverDiagnosticsProtocolGuid); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellDriver1HiiHandle, L"drvdiag", L"gEfiDriverDiagnostics2ProtocolGuid", &gEfiDriverDiagnostics2ProtocolGuid); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellDriver1HiiHandle, L"drvdiag", L"gEfiDriverDiagnosticsProtocolGuid", &gEfiDriverDiagnosticsProtocolGuid); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellDriver1HiiHandle, L"drvdiag", L"gEfiDriverDiagnostics2ProtocolGuid", &gEfiDriverDiagnostics2ProtocolGuid); return (EFI_NOT_FOUND); } @@ -137,7 +137,7 @@ DoDiagnostics ( } if (Mode == TestModeList) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVDIAG_HEADER), gShellDriver1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DRVDIAG_HEADER), gShellDriver1HiiHandle); } for (DriverHandleListLoop = 0 @@ -146,7 +146,7 @@ DoDiagnostics ( ) { if (Mode == TestModeList) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVDIAG_DRIVER_HEADER), gShellDriver1HiiHandle, ConvertHandleToHandleIndex (DriverHandleList[DriverHandleListLoop])); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DRVDIAG_DRIVER_HEADER), gShellDriver1HiiHandle, ConvertHandleToHandleIndex (DriverHandleList[DriverHandleListLoop])); } if (ControllerHandle == NULL) { @@ -155,7 +155,7 @@ DoDiagnostics ( if ((ControllerHandleListCount == 0) || (ControllerHandleList == NULL)) { if (Mode == TestModeList) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVDIAG_DRIVER_NO_HANDLES), gShellDriver1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DRVDIAG_DRIVER_NO_HANDLES), gShellDriver1HiiHandle); } } else { if (Mode == TestModeList) { @@ -256,10 +256,7 @@ DoDiagnostics ( HandleIndex1 = ConvertHandleToHandleIndex (DriverHandleList[DriverHandleListLoop]); HandleIndex2 = ConvertHandleToHandleIndex (ControllerHandleList[ControllerHandleListLoop]); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_3P_RESULT), gShellDriver1HiiHandle, L"DrvDiag", @@ -283,10 +280,7 @@ DoDiagnostics ( // // Print out the information that this set can be tested // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_DRV_DIAG_ITEM_LINE), gShellDriver1HiiHandle, HandleIndex1, @@ -385,7 +379,7 @@ ShellCommandRunDrvDiag ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"drvdiag", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"drvdiag", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -404,7 +398,7 @@ ShellCommandRunDrvDiag ( // // error for too many parameters // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"drvdiag"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"drvdiag"); ShellStatus = SHELL_INVALID_PARAMETER; } else if ( (ShellCommandLineGetFlag (Package, L"-s")) || (ShellCommandLineGetFlag (Package, L"-e")) @@ -433,13 +427,13 @@ ShellCommandRunDrvDiag ( Lang = ShellCommandLineGetValue (Package, L"-l"); if (ShellCommandLineGetFlag (Package, L"-l") && (Lang == NULL)) { ASSERT (Language == NULL); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drvdiag", L"-l"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drvdiag", L"-l"); ShellCommandLineFreeVarList (Package); return (SHELL_INVALID_PARAMETER); } else if (Lang != NULL) { Language = AllocateZeroPool (StrSize (Lang)); if (Language == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"drvdiag"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellDriver1HiiHandle, L"drvdiag"); ShellCommandLineFreeVarList (Package); return (SHELL_OUT_OF_RESOURCES); } diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/OpenInfo.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/OpenInfo.c index 0d3f901feab9..1c0389c96ea2 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/OpenInfo.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/OpenInfo.c @@ -113,10 +113,7 @@ TraverseHandleDatabase ( Name = GetStringNameFromHandle (OpenInfo[OpenInfoIndex].AgentHandle, NULL); ControllerIndex = ConvertHandleToHandleIndex (OpenInfo[OpenInfoIndex].ControllerHandle); if ((ControllerIndex != 0) && (Name != NULL)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_OPENINFO_LINE), gShellDriver1HiiHandle, HandleIndex, @@ -126,10 +123,7 @@ TraverseHandleDatabase ( Name ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_OPENINFO_MIN_LINE), gShellDriver1HiiHandle, HandleIndex, @@ -188,7 +182,7 @@ ShellCommandRunOpenInfo ( Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"openinfo", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"openinfo", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -199,10 +193,10 @@ ShellCommandRunOpenInfo ( // // error for too many parameters // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"openinfo"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"openinfo"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetCount (Package) == 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"openinfo"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"openinfo"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Param1 = ShellCommandLineGetRawValue (Package, 1); @@ -211,22 +205,22 @@ ShellCommandRunOpenInfo ( } if (EFI_ERROR (Status) || (Param1 == NULL) || (ConvertHandleIndexToHandle ((UINTN)Intermediate) == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"openinfo", Param1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"openinfo", Param1); ShellStatus = SHELL_INVALID_PARAMETER; } else { TheHandle = ConvertHandleIndexToHandle ((UINTN)Intermediate); if (TheHandle == NULL) { ASSERT (TheHandle != NULL); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"openinfo", Param1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"openinfo", Param1); return SHELL_INVALID_PARAMETER; } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_OPENINFO_HEADER_LINE), gShellDriver1HiiHandle, (UINTN)Intermediate, TheHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_OPENINFO_HEADER_LINE), gShellDriver1HiiHandle, (UINTN)Intermediate, TheHandle); Status = TraverseHandleDatabase (TheHandle); if (!EFI_ERROR (Status)) { } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"openinfo", Param1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"openinfo", Param1); ShellStatus = SHELL_NOT_FOUND; } } diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/Reconnect.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/Reconnect.c index ae5f5c71556a..21cf9301c8d2 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/Reconnect.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/Reconnect.c @@ -69,7 +69,7 @@ ShellCommandRunReconnect ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"reconnect", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"reconnect", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/Unload.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/Unload.c index 02e8ee2a023d..efcbf90d9927 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/Unload.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/Unload.c @@ -83,7 +83,7 @@ ShellCommandRunUnload ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"unload", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"unload", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -94,10 +94,10 @@ ShellCommandRunUnload ( // // error for too many parameters // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"unload"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"unload"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetCount (Package) < 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"unload"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"unload"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Param1 = ShellCommandLineGetRawValue (Package, 1); @@ -107,7 +107,7 @@ ShellCommandRunUnload ( } if (EFI_ERROR (Status) || (Param1 == NULL) || (TheHandle == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"unload", Param1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"unload", Param1); ShellStatus = SHELL_INVALID_PARAMETER; } else { ASSERT (TheHandle != NULL); @@ -116,13 +116,13 @@ ShellCommandRunUnload ( } if (!ShellCommandLineGetFlag (Package, L"-n")) { - Status = ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_UNLOAD_CONF), gShellDriver1HiiHandle, (UINTN)TheHandle); + Status = ShellPrintHiiDefaultEx (STRING_TOKEN (STR_UNLOAD_CONF), gShellDriver1HiiHandle, (UINTN)TheHandle); Status = ShellPromptForResponse (ShellPromptResponseTypeYesNo, NULL, (VOID **)&Resp); } if (ShellCommandLineGetFlag (Package, L"-n") || ((Resp != NULL) && (*Resp == ShellPromptResponseYes))) { Status = gBS->UnloadImage (TheHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HANDLE_RESULT), gShellDriver1HiiHandle, L"Unload", (UINTN)TheHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HANDLE_RESULT), gShellDriver1HiiHandle, L"Unload", (UINTN)TheHandle, Status); } SHELL_FREE_NON_NULL (Resp); diff --git a/ShellPkg/Library/UefiShellLevel1CommandsLib/Exit.c b/ShellPkg/Library/UefiShellLevel1CommandsLib/Exit.c index 3a49dbfaa39f..26877524a8b9 100644 --- a/ShellPkg/Library/UefiShellLevel1CommandsLib/Exit.c +++ b/ShellPkg/Library/UefiShellLevel1CommandsLib/Exit.c @@ -51,7 +51,7 @@ ShellCommandRunExit ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel1HiiHandle, L"exit", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel1HiiHandle, L"exit", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -65,7 +65,7 @@ ShellCommandRunExit ( if (Return != NULL) { Status = ShellConvertStringToUint64 (Return, &RetVal, FALSE, FALSE); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel1HiiHandle, L"exit", Return); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel1HiiHandle, L"exit", Return); ShellStatus = SHELL_INVALID_PARAMETER; } else { // diff --git a/ShellPkg/Library/UefiShellLevel1CommandsLib/For.c b/ShellPkg/Library/UefiShellLevel1CommandsLib/For.c index 9cd45c2f4cb3..22d694add3f8 100644 --- a/ShellPkg/Library/UefiShellLevel1CommandsLib/For.c +++ b/ShellPkg/Library/UefiShellLevel1CommandsLib/For.c @@ -69,12 +69,12 @@ ShellCommandRunEndFor ( ASSERT_EFI_ERROR (Status); if (!gEfiShellProtocol->BatchIsActive ()) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"endfor"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"endfor"); return (SHELL_UNSUPPORTED); } if (gEfiShellParametersProtocol->Argc > 1) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel1HiiHandle, L"endfor"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel1HiiHandle, L"endfor"); return (SHELL_INVALID_PARAMETER); } @@ -82,16 +82,13 @@ ShellCommandRunEndFor ( if (!Found) { CurrentScriptFile = ShellCommandGetCurrentScriptFile (); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SYNTAX_NO_MATCHING), gShellLevel1HiiHandle, L"For", L"EndFor", CurrentScriptFile != NULL - && CurrentScriptFile->CurrentCommand != NULL + && CurrentScriptFile->CurrentCommand != NULL ? CurrentScriptFile->CurrentCommand->Line : 0 ); return (SHELL_NOT_FOUND); @@ -324,12 +321,12 @@ ShellCommandRunFor ( ASSERT_EFI_ERROR (Status); if (!gEfiShellProtocol->BatchIsActive ()) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"for"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"for"); return (SHELL_UNSUPPORTED); } if (gEfiShellParametersProtocol->Argc < 4) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel1HiiHandle, L"for"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel1HiiHandle, L"for"); return (SHELL_INVALID_PARAMETER); } @@ -346,10 +343,7 @@ ShellCommandRunFor ( // Make sure that an End exists. // if (!MoveToTag (GetNextNode, L"endfor", L"for", NULL, CurrentScriptFile, TRUE, TRUE, FALSE)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SYNTAX_NO_MATCHING), gShellLevel1HiiHandle, L"EndFor", @@ -367,7 +361,7 @@ ShellCommandRunFor ( || ((gEfiShellParametersProtocol->Argv[1][1] >= L'A') && (gEfiShellParametersProtocol->Argv[1][1] <= L'Z'))) ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_VAR), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[1]); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_INV_VAR), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[1]); return (SHELL_INVALID_PARAMETER); } @@ -491,10 +485,7 @@ ShellCommandRunFor ( Info->CurrentValue = NULL; ArgSetWalker = ArgSet; if (ArgSetWalker[0] != L'(') { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, ArgSet, @@ -517,10 +508,7 @@ ShellCommandRunFor ( } if (TempSpot == NULL) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, CurrentScriptFile->CurrentCommand->Line @@ -534,10 +522,7 @@ ShellCommandRunFor ( } if (!ShellIsValidForNumber (ArgSetWalker)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, ArgSet, @@ -557,10 +542,7 @@ ShellCommandRunFor ( } if ((ArgSetWalker == NULL) || (*ArgSetWalker == CHAR_NULL) || !ShellIsValidForNumber (ArgSetWalker)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, ArgSet, @@ -587,10 +569,7 @@ ShellCommandRunFor ( if ((ArgSetWalker != NULL) && (*ArgSetWalker != CHAR_NULL)) { if ((ArgSetWalker == NULL) || (*ArgSetWalker == CHAR_NULL) || !ShellIsValidForNumber (ArgSetWalker)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, ArgSet, @@ -608,10 +587,7 @@ ShellCommandRunFor ( } if (StrStr (ArgSetWalker, L" ") != NULL) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, ArgSet, @@ -640,15 +616,12 @@ ShellCommandRunFor ( } } } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, ArgSet, CurrentScriptFile != NULL - && CurrentScriptFile->CurrentCommand != NULL + && CurrentScriptFile->CurrentCommand != NULL ? CurrentScriptFile->CurrentCommand->Line : 0 ); ShellStatus = SHELL_INVALID_PARAMETER; @@ -706,16 +679,13 @@ ShellCommandRunFor ( // find the matching endfor (we're done with the loop) // if (!MoveToTag (GetNextNode, L"endfor", L"for", NULL, CurrentScriptFile, TRUE, FALSE, FALSE)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SYNTAX_NO_MATCHING), gShellLevel1HiiHandle, L"EndFor", L"For", CurrentScriptFile != NULL - && CurrentScriptFile->CurrentCommand != NULL + && CurrentScriptFile->CurrentCommand != NULL ? CurrentScriptFile->CurrentCommand->Line : 0 ); ShellStatus = SHELL_DEVICE_ERROR; @@ -776,16 +746,13 @@ ShellCommandRunFor ( // find the matching endfor (we're done with the loop) // if (!MoveToTag (GetNextNode, L"endfor", L"for", NULL, CurrentScriptFile, TRUE, FALSE, FALSE)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SYNTAX_NO_MATCHING), gShellLevel1HiiHandle, L"EndFor", L"For", CurrentScriptFile != NULL - && CurrentScriptFile->CurrentCommand != NULL + && CurrentScriptFile->CurrentCommand != NULL ? CurrentScriptFile->CurrentCommand->Line : 0 ); ShellStatus = SHELL_DEVICE_ERROR; diff --git a/ShellPkg/Library/UefiShellLevel1CommandsLib/Goto.c b/ShellPkg/Library/UefiShellLevel1CommandsLib/Goto.c index 1773f6a751df..408f2ff21bcc 100644 --- a/ShellPkg/Library/UefiShellLevel1CommandsLib/Goto.c +++ b/ShellPkg/Library/UefiShellLevel1CommandsLib/Goto.c @@ -43,7 +43,7 @@ ShellCommandRunGoto ( ASSERT_EFI_ERROR (Status); if (!gEfiShellProtocol->BatchIsActive ()) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"Goto"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"Goto"); return (SHELL_UNSUPPORTED); } @@ -53,7 +53,7 @@ ShellCommandRunGoto ( Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel1HiiHandle, L"goto", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel1HiiHandle, L"goto", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -61,10 +61,10 @@ ShellCommandRunGoto ( } } else { if (ShellCommandLineGetRawValue (Package, 2) != NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel1HiiHandle, L"goto"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel1HiiHandle, L"goto"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetRawValue (Package, 1) == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel1HiiHandle, L"goto"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel1HiiHandle, L"goto"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Size = 0; @@ -81,16 +81,13 @@ ShellCommandRunGoto ( // if (!MoveToTag (GetNextNode, L"endfor", L"for", CompareString, ShellCommandGetCurrentScriptFile (), FALSE, FALSE, TRUE)) { CurrentScriptFile = ShellCommandGetCurrentScriptFile (); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SYNTAX_NO_MATCHING), gShellLevel1HiiHandle, CompareString, L"Goto", CurrentScriptFile != NULL - && CurrentScriptFile->CurrentCommand != NULL + && CurrentScriptFile->CurrentCommand != NULL ? CurrentScriptFile->CurrentCommand->Line : 0 ); ShellStatus = SHELL_NOT_FOUND; diff --git a/ShellPkg/Library/UefiShellLevel1CommandsLib/If.c b/ShellPkg/Library/UefiShellLevel1CommandsLib/If.c index f1953a75d2c3..7f373f08de6e 100644 --- a/ShellPkg/Library/UefiShellLevel1CommandsLib/If.c +++ b/ShellPkg/Library/UefiShellLevel1CommandsLib/If.c @@ -415,7 +415,7 @@ ProcessStatement ( OperationResult = ShellIsHexOrDecimalNumber (StatementWalker, FALSE, FALSE); } else { Status = EFI_INVALID_PARAMETER; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"isint"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"isint"); } } else if ((!EFI_ERROR (IsNextFragment ((CONST CHAR16 **)(&StatementWalker), L"exists", &Match)) && Match) || (!EFI_ERROR (IsNextFragment ((CONST CHAR16 **)(&StatementWalker), L"exist", &Match)) && Match)) @@ -431,7 +431,7 @@ ProcessStatement ( } else if ((StatementWalker[0] == CHAR_NULL) && (StartParameterNumber+1 == EndParameterNumber)) { OperationResult = (BOOLEAN)(ShellFileExists (gEfiShellParametersProtocol->Argv[++StartParameterNumber]) == EFI_SUCCESS); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"exist(s)"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"exist(s)"); Status = EFI_INVALID_PARAMETER; } } else if (!EFI_ERROR (IsNextFragment ((CONST CHAR16 **)(&StatementWalker), L"available", &Match)) && Match) { @@ -444,7 +444,7 @@ ProcessStatement ( // OperationResult = (BOOLEAN)(ShellIsFileInPath (StatementWalker) == EFI_SUCCESS); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"available"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"available"); Status = EFI_INVALID_PARAMETER; } } else if (!EFI_ERROR (IsNextFragment ((CONST CHAR16 **)(&StatementWalker), L"profile", &Match)) && Match) { @@ -457,11 +457,11 @@ ProcessStatement ( StatementWalker[StrLen (StatementWalker)-1] = CHAR_NULL; OperationResult = IsValidProfile (StatementWalker); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"profile"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"profile"); Status = EFI_INVALID_PARAMETER; } } else if (StartParameterNumber+1 >= EndParameterNumber) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[StartParameterNumber]); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[StartParameterNumber]); Status = EFI_INVALID_PARAMETER; } else { // @@ -485,11 +485,11 @@ ProcessStatement ( Compare1 = StrnCatGrow (&Compare1, NULL, HexString, 0); StatementWalker += StrLen (StatementWalker) + 1; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"efierror"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"efierror"); Status = EFI_INVALID_PARAMETER; } } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"efierror"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"efierror"); Status = EFI_INVALID_PARAMETER; } } else if (!EFI_ERROR (IsNextFragment ((CONST CHAR16 **)(&StatementWalker), L"pierror", &Match)) && Match) { @@ -502,11 +502,11 @@ ProcessStatement ( Compare1 = StrnCatGrow (&Compare1, NULL, HexString, 0); StatementWalker += StrLen (StatementWalker) + 1; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"pierror"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"pierror"); Status = EFI_INVALID_PARAMETER; } } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"pierror"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"pierror"); Status = EFI_INVALID_PARAMETER; } } else if (!EFI_ERROR (IsNextFragment ((CONST CHAR16 **)(&StatementWalker), L"oemerror", &Match)) && Match) { @@ -519,17 +519,17 @@ ProcessStatement ( Compare1 = StrnCatGrow (&Compare1, NULL, HexString, 0); StatementWalker += StrLen (StatementWalker) + 1; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"oemerror"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"oemerror"); Status = EFI_INVALID_PARAMETER; } } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"oemerror"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"oemerror"); Status = EFI_INVALID_PARAMETER; } } else { ASSERT (Compare1 == NULL); if (EndParameterNumber - StartParameterNumber > 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_STARTING), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[StartParameterNumber+2]); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_STARTING), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[StartParameterNumber+2]); Status = EFI_INVALID_PARAMETER; } else { // @@ -567,7 +567,7 @@ ProcessStatement ( } else if (!EFI_ERROR (IsNextFragment ((CONST CHAR16 **)(&StatementWalker), L"ule", &Match)) && Match) { BinOp = OperatorUnsignedLessOrEqual; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_INVALID_BINOP), gShellLevel1HiiHandle, StatementWalker); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_INVALID_BINOP), gShellLevel1HiiHandle, StatementWalker); Status = EFI_INVALID_PARAMETER; } @@ -586,11 +586,11 @@ ProcessStatement ( Compare2 = StrnCatGrow (&Compare2, NULL, HexString, 0); StatementWalker += StrLen (StatementWalker) + 1; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"efierror"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"efierror"); Status = EFI_INVALID_PARAMETER; } } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"efierror"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"efierror"); Status = EFI_INVALID_PARAMETER; } @@ -607,11 +607,11 @@ ProcessStatement ( Compare2 = StrnCatGrow (&Compare2, NULL, HexString, 0); StatementWalker += StrLen (StatementWalker) + 1; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"pierror"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"pierror"); Status = EFI_INVALID_PARAMETER; } } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"pierror"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"pierror"); Status = EFI_INVALID_PARAMETER; } } else if (!EFI_ERROR (IsNextFragment ((CONST CHAR16 **)(&StatementWalker), L"oemerror", &Match)) && Match) { @@ -624,11 +624,11 @@ ProcessStatement ( Compare2 = StrnCatGrow (&Compare2, NULL, HexString, 0); StatementWalker += StrLen (StatementWalker) + 1; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"oemerror"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"oemerror"); Status = EFI_INVALID_PARAMETER; } } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"oemerror"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_IN), gShellLevel1HiiHandle, L"oemerror"); Status = EFI_INVALID_PARAMETER; } } else { @@ -886,12 +886,12 @@ ShellCommandRunIf ( ASSERT_EFI_ERROR (Status); if (!gEfiShellProtocol->BatchIsActive ()) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"if"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"if"); return (SHELL_UNSUPPORTED); } if (gEfiShellParametersProtocol->Argc < 3) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel1HiiHandle, L"if"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel1HiiHandle, L"if"); return (SHELL_INVALID_PARAMETER); } @@ -904,16 +904,13 @@ ShellCommandRunIf ( } if (!MoveToTag (GetNextNode, L"endif", L"if", NULL, CurrentScriptFile, TRUE, TRUE, FALSE)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SYNTAX_NO_MATCHING), gShellLevel1HiiHandle, L"EndIf", L"If", CurrentScriptFile != NULL - && CurrentScriptFile->CurrentCommand != NULL + && CurrentScriptFile->CurrentCommand != NULL ? CurrentScriptFile->CurrentCommand->Line : 0 ); return (SHELL_DEVICE_ERROR); @@ -986,12 +983,12 @@ ShellCommandRunIf ( // we are at the then // if (CurrentParameter+1 != gEfiShellParametersProtocol->Argc) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_TEXT_AFTER_THEN), gShellLevel1HiiHandle, L"if"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TEXT_AFTER_THEN), gShellLevel1HiiHandle, L"if"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = PerformResultOperation (CurrentValue); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_AFTER_BAD), gShellLevel1HiiHandle, L"if", gEfiShellParametersProtocol->Argv[CurrentParameter]); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_AFTER_BAD), gShellLevel1HiiHandle, L"if", gEfiShellParametersProtocol->Argv[CurrentParameter]); ShellStatus = SHELL_INVALID_PARAMETER; } } @@ -1002,16 +999,13 @@ ShellCommandRunIf ( // if (!BuildNextStatement (CurrentParameter, &EndParameter, &Ending)) { CurrentScriptFile = ShellCommandGetCurrentScriptFile (); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SYNTAX_NO_MATCHING), gShellLevel1HiiHandle, L"Then", L"If", CurrentScriptFile != NULL - && CurrentScriptFile->CurrentCommand != NULL + && CurrentScriptFile->CurrentCommand != NULL ? CurrentScriptFile->CurrentCommand->Line : 0 ); ShellStatus = SHELL_INVALID_PARAMETER; @@ -1021,7 +1015,7 @@ ShellCommandRunIf ( // Status = ProcessStatement (&CurrentValue, CurrentParameter, EndParameter, PreviousEnding, CaseInsensitive, ForceString); if (EFI_ERROR (Status)) { - // ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_STARTING), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[CurrentParameter]); + // ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_STARTING), gShellLevel1HiiHandle, gEfiShellParametersProtocol->Argv[CurrentParameter]); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -1030,7 +1024,7 @@ ShellCommandRunIf ( if (((Ending == EndTagOr) && CurrentValue) || ((Ending == EndTagAnd) && !CurrentValue)) { Status = PerformResultOperation (CurrentValue); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SYNTAX_AFTER_BAD), gShellLevel1HiiHandle, L"if", gEfiShellParametersProtocol->Argv[CurrentParameter]); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SYNTAX_AFTER_BAD), gShellLevel1HiiHandle, L"if", gEfiShellParametersProtocol->Argv[CurrentParameter]); ShellStatus = SHELL_INVALID_PARAMETER; } @@ -1074,12 +1068,12 @@ ShellCommandRunElse ( ASSERT_EFI_ERROR (Status); if (gEfiShellParametersProtocol->Argc > 1) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel1HiiHandle, L"if"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel1HiiHandle, L"if"); return (SHELL_INVALID_PARAMETER); } if (!gEfiShellProtocol->BatchIsActive ()) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"Else"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"Else"); return (SHELL_UNSUPPORTED); } @@ -1089,48 +1083,39 @@ ShellCommandRunElse ( } if (!MoveToTag (GetPreviousNode, L"if", L"endif", NULL, CurrentScriptFile, FALSE, TRUE, FALSE)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SYNTAX_NO_MATCHING), gShellLevel1HiiHandle, L"If", L"Else", CurrentScriptFile != NULL - && CurrentScriptFile->CurrentCommand != NULL + && CurrentScriptFile->CurrentCommand != NULL ? CurrentScriptFile->CurrentCommand->Line : 0 ); return (SHELL_DEVICE_ERROR); } if (!MoveToTag (GetPreviousNode, L"if", L"else", NULL, CurrentScriptFile, FALSE, TRUE, FALSE)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SYNTAX_NO_MATCHING), gShellLevel1HiiHandle, L"If", L"Else", CurrentScriptFile != NULL - && CurrentScriptFile->CurrentCommand != NULL + && CurrentScriptFile->CurrentCommand != NULL ? CurrentScriptFile->CurrentCommand->Line : 0 ); return (SHELL_DEVICE_ERROR); } if (!MoveToTag (GetNextNode, L"endif", L"if", NULL, CurrentScriptFile, FALSE, FALSE, FALSE)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SYNTAX_NO_MATCHING), gShellLevel1HiiHandle, L"EndIf", "Else", CurrentScriptFile != NULL - && CurrentScriptFile->CurrentCommand != NULL + && CurrentScriptFile->CurrentCommand != NULL ? CurrentScriptFile->CurrentCommand->Line : 0 ); return (SHELL_DEVICE_ERROR); @@ -1159,12 +1144,12 @@ ShellCommandRunEndIf ( ASSERT_EFI_ERROR (Status); if (gEfiShellParametersProtocol->Argc > 1) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel1HiiHandle, L"if"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel1HiiHandle, L"if"); return (SHELL_INVALID_PARAMETER); } if (!gEfiShellProtocol->BatchIsActive ()) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"Endif"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"Endif"); return (SHELL_UNSUPPORTED); } @@ -1174,16 +1159,13 @@ ShellCommandRunEndIf ( } if (!MoveToTag (GetPreviousNode, L"if", L"endif", NULL, CurrentScriptFile, FALSE, TRUE, FALSE)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SYNTAX_NO_MATCHING), gShellLevel1HiiHandle, L"If", L"EndIf", CurrentScriptFile != NULL - && CurrentScriptFile->CurrentCommand != NULL + && CurrentScriptFile->CurrentCommand != NULL ? CurrentScriptFile->CurrentCommand->Line : 0 ); return (SHELL_DEVICE_ERROR); diff --git a/ShellPkg/Library/UefiShellLevel1CommandsLib/Shift.c b/ShellPkg/Library/UefiShellLevel1CommandsLib/Shift.c index d550682421a3..69d1eb19462a 100644 --- a/ShellPkg/Library/UefiShellLevel1CommandsLib/Shift.c +++ b/ShellPkg/Library/UefiShellLevel1CommandsLib/Shift.c @@ -30,7 +30,7 @@ ShellCommandRunShift ( ASSERT_EFI_ERROR (Status); if (!gEfiShellProtocol->BatchIsActive ()) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"shift"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_NO_SCRIPT), gShellLevel1HiiHandle, L"shift"); return (SHELL_UNSUPPORTED); } @@ -41,7 +41,7 @@ ShellCommandRunShift ( } if (CurrentScriptFile->Argc < 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel1HiiHandle, L"shift"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel1HiiHandle, L"shift"); return (SHELL_UNSUPPORTED); } diff --git a/ShellPkg/Library/UefiShellLevel1CommandsLib/Stall.c b/ShellPkg/Library/UefiShellLevel1CommandsLib/Stall.c index fb210ee80d3b..b634cbf4a5b2 100644 --- a/ShellPkg/Library/UefiShellLevel1CommandsLib/Stall.c +++ b/ShellPkg/Library/UefiShellLevel1CommandsLib/Stall.c @@ -45,7 +45,7 @@ ShellCommandRunStall ( Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel1HiiHandle, L"stall", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel1HiiHandle, L"stall", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -53,20 +53,20 @@ ShellCommandRunStall ( } } else { if (ShellCommandLineGetRawValue (Package, 2) != NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel1HiiHandle, L"stall"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel1HiiHandle, L"stall"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetRawValue (Package, 1) == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel1HiiHandle, L"stall"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel1HiiHandle, L"stall"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellConvertStringToUint64 (ShellCommandLineGetRawValue (Package, 1), &Intermediate, FALSE, FALSE); if (EFI_ERROR (Status) || (((UINT64)(UINTN)(Intermediate)) != Intermediate)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel1HiiHandle, L"stall", ShellCommandLineGetRawValue (Package, 1)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel1HiiHandle, L"stall", ShellCommandLineGetRawValue (Package, 1)); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = gBS->Stall ((UINTN)Intermediate); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_STALL_FAILED), gShellLevel1HiiHandle, L"stall"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_STALL_FAILED), gShellLevel1HiiHandle, L"stall"); ShellStatus = SHELL_DEVICE_ERROR; } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Attrib.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Attrib.c index 724dc808aea8..b434f1d2793c 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Attrib.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Attrib.c @@ -64,7 +64,7 @@ ShellCommandRunAttrib ( Status = ShellCommandLineParse (AttribParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"attrib", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"attrib", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -135,7 +135,7 @@ ShellCommandRunAttrib ( ASSERT (ListOfFiles == NULL); Status = ShellOpenFileMetaArg ((CHAR16 *)FileName, EFI_FILE_MODE_READ, &ListOfFiles); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); ShellStatus = SHELL_NOT_FOUND; } else { for (FileNode = (EFI_SHELL_FILE_INFO *)GetFirstNode (&ListOfFiles->Link) @@ -143,10 +143,7 @@ ShellCommandRunAttrib ( ; FileNode = (EFI_SHELL_FILE_INFO *)GetNextNode (&ListOfFiles->Link, &FileNode->Link) ) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_ATTRIB_OUTPUT_LINE), gShellLevel2HiiHandle, FileNode->Info->Attribute&EFI_FILE_DIRECTORY ? L'D' : L' ', @@ -166,7 +163,7 @@ ShellCommandRunAttrib ( Status = ShellCloseFileMetaArg (&ListOfFiles); ListOfFiles = NULL; if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); ShellStatus = SHELL_NOT_FOUND; } } // for loop for handling wildcard filenames @@ -175,7 +172,7 @@ ShellCommandRunAttrib ( // // fail as we have conflcting params. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle, L"attrib"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle, L"attrib"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -193,7 +190,7 @@ ShellCommandRunAttrib ( // make sure we are not failing on the first one we do... if yes that's an error... // if (ParamNumberCount == 1) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"attrib"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"attrib"); ShellStatus = SHELL_INVALID_PARAMETER; } @@ -211,7 +208,7 @@ ShellCommandRunAttrib ( ASSERT (ListOfFiles == NULL); Status = ShellOpenFileMetaArg ((CHAR16 *)FileName, EFI_FILE_MODE_READ, &ListOfFiles); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); ShellStatus = SHELL_NOT_FOUND; } else { for (FileNode = (EFI_SHELL_FILE_INFO *)GetFirstNode (&ListOfFiles->Link) @@ -238,7 +235,7 @@ ShellCommandRunAttrib ( // Status = ShellSetFileInfo (FileNode->Handle, FileInfo); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); ShellStatus = SHELL_ACCESS_DENIED; } } @@ -254,7 +251,7 @@ ShellCommandRunAttrib ( // Status = ShellSetFileInfo (FileNode->Handle, FileInfo); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); ShellStatus = SHELL_ACCESS_DENIED; } @@ -264,7 +261,7 @@ ShellCommandRunAttrib ( Status = ShellCloseFileMetaArg (&ListOfFiles); ListOfFiles = NULL; if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); ShellStatus = SHELL_NOT_FOUND; } } // for loop for handling wildcard filenames diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c index 7052dc33a14e..71c3db8df2f3 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c @@ -213,7 +213,7 @@ ShellCommandRunCd ( Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"cd", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"cd", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -227,7 +227,7 @@ ShellCommandRunCd ( if (ShellCommandLineGetFlag (Package, L"-?")) { ASSERT (FALSE); } else if (ShellCommandLineGetRawValue (Package, 2) != NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"cd"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"cd"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -238,7 +238,7 @@ ShellCommandRunCd ( // Cwd = ShellGetCurrentDir (NULL); if (Cwd == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"cd"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"cd"); ShellStatus = SHELL_NOT_FOUND; } else { Param1 = ShellCommandLineGetRawValue (Package, 1); @@ -246,7 +246,7 @@ ShellCommandRunCd ( // // display the current directory // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_CD_PRINT), gShellLevel2HiiHandle, Cwd); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_CD_PRINT), gShellLevel2HiiHandle, Cwd); } else { Param1Copy = CatSPrint (NULL, L"%s", Param1, NULL); for (Walker = Param1Copy; Walker != NULL && *Walker != CHAR_NULL; Walker++) { @@ -261,7 +261,7 @@ ShellCommandRunCd ( // // Can't use cd command to change filesystem. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_CD_NF), gShellLevel2HiiHandle, L"cd"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_CD_NF), gShellLevel2HiiHandle, L"cd"); Status = EFI_NOT_FOUND; } @@ -314,12 +314,12 @@ ShellCommandRunCd ( if (!EFI_ERROR (Status) && (Drive != NULL) && (Path != NULL)) { if (EFI_ERROR (ShellIsDirectory (Param1Copy))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NOT_DIR), gShellLevel2HiiHandle, L"cd", Param1Copy); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NOT_DIR), gShellLevel2HiiHandle, L"cd", Param1Copy); ShellStatus = SHELL_NOT_FOUND; } else { Status = gEfiShellProtocol->SetCurDir (Drive, Path + 1); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_DIR_NF), gShellLevel2HiiHandle, L"cd", Param1Copy); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_DIR_NF), gShellLevel2HiiHandle, L"cd", Param1Copy); ShellStatus = SHELL_NOT_FOUND; } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c index afa6a502f791..8fb7493d4cb1 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c @@ -131,7 +131,7 @@ CopySingleFile ( if (ShellIsDirectory (Source) == EFI_SUCCESS) { Status = ShellCreateDirectory (Dest, &DestHandle); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_CP_DEST_DIR_FAIL), gShellLevel2HiiHandle, CmdName, Dest); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_CP_DEST_DIR_FAIL), gShellLevel2HiiHandle, CmdName, Dest); return (SHELL_ACCESS_DENIED); } @@ -160,7 +160,7 @@ CopySingleFile ( // Status = ShellOpenFileByName (Dest, &DestHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE|EFI_FILE_MODE_CREATE, 0); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_CP_DEST_OPEN_FAIL), gShellLevel2HiiHandle, CmdName, Dest); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_CP_DEST_OPEN_FAIL), gShellLevel2HiiHandle, CmdName, Dest); return (SHELL_ACCESS_DENIED); } @@ -169,7 +169,7 @@ CopySingleFile ( // Status = ShellOpenFileByName (Source, &SourceHandle, EFI_FILE_MODE_READ, 0); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_CP_SRC_OPEN_FAIL), gShellLevel2HiiHandle, CmdName, Source); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_CP_SRC_OPEN_FAIL), gShellLevel2HiiHandle, CmdName, Source); return (SHELL_ACCESS_DENIED); } @@ -204,7 +204,7 @@ CopySingleFile ( if (Status == EFI_BUFFER_TOO_SMALL) { DestVolumeInfo = AllocateZeroPool (DestVolumeInfoSize); if (DestVolumeInfo == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"cp"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"cp"); ShellStatus = SHELL_OUT_OF_RESOURCES; goto Done; } @@ -225,7 +225,7 @@ CopySingleFile ( // not enough space on destination directory to copy file // SHELL_FREE_NON_NULL (DestVolumeInfo); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_CPY_FAIL), gShellLevel2HiiHandle, CmdName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_CPY_FAIL), gShellLevel2HiiHandle, CmdName); return (SHELL_VOLUME_FULL); } else { // @@ -233,7 +233,7 @@ CopySingleFile ( // Buffer = AllocateZeroPool (ReadSize); if (Buffer == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, CmdName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, CmdName); return SHELL_OUT_OF_RESOURCES; } @@ -243,12 +243,12 @@ CopySingleFile ( Status = ShellWriteFile (DestHandle, &ReadSize, Buffer); if (EFI_ERROR (Status)) { ShellStatus = (SHELL_STATUS)(Status & (~MAX_BIT)); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_CPY_WRITE_ERROR), gShellLevel2HiiHandle, CmdName, Dest); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_CPY_WRITE_ERROR), gShellLevel2HiiHandle, CmdName, Dest); break; } } else { ShellStatus = (SHELL_STATUS)(Status & (~MAX_BIT)); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_CPY_READ_ERROR), gShellLevel2HiiHandle, CmdName, Source); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_CPY_READ_ERROR), gShellLevel2HiiHandle, CmdName, Source); break; } } @@ -353,7 +353,7 @@ ValidateAndCopyFiles ( // // Error for destination not a directory // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NOT_DIR), gShellLevel2HiiHandle, L"cp", CleanFilePathStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NOT_DIR), gShellLevel2HiiHandle, L"cp", CleanFilePathStr); FreePool (CleanFilePathStr); return (SHELL_INVALID_PARAMETER); } @@ -381,7 +381,7 @@ ValidateAndCopyFiles ( // Make sure got -r if required // if (!RecursiveMode && !EFI_ERROR (ShellIsDirectory (Node->FullName))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_CP_DIR_REQ), gShellLevel2HiiHandle, L"cp"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_CP_DIR_REQ), gShellLevel2HiiHandle, L"cp"); FreePool (CleanFilePathStr); return (SHELL_INVALID_PARAMETER); } @@ -393,7 +393,7 @@ ValidateAndCopyFiles ( // // Error for destination not a directory // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NOT_DIR), gShellLevel2HiiHandle, L"cp", CleanFilePathStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NOT_DIR), gShellLevel2HiiHandle, L"cp", CleanFilePathStr); FreePool (CleanFilePathStr); return (SHELL_INVALID_PARAMETER); } @@ -445,7 +445,7 @@ ValidateAndCopyFiles ( StrCpyS (DestPath, PathSize / sizeof (CHAR16), Cwd); StrCatS (DestPath, PathSize / sizeof (CHAR16), L"\\"); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_DIR_NF), gShellLevel2HiiHandle, L"cp", CleanFilePathStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_DIR_NF), gShellLevel2HiiHandle, L"cp", CleanFilePathStr); FreePool (CleanFilePathStr); return (SHELL_INVALID_PARAMETER); } @@ -476,7 +476,7 @@ ValidateAndCopyFiles ( StrCpyS (DestPath, PathSize/sizeof (CHAR16), Cwd); StrCatS (DestPath, PathSize/sizeof (CHAR16), L"\\"); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_DIR_NF), gShellLevel2HiiHandle, L"cp", CleanFilePathStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_DIR_NF), gShellLevel2HiiHandle, L"cp", CleanFilePathStr); FreePool (CleanFilePathStr); return (SHELL_INVALID_PARAMETER); } @@ -491,7 +491,7 @@ ValidateAndCopyFiles ( StrCpyS (DestPath, PathSize/sizeof (CHAR16), Cwd); StrCatS (DestPath, PathSize/sizeof (CHAR16), L"\\"); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_DIR_NF), gShellLevel2HiiHandle, L"cp", CleanFilePathStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_DIR_NF), gShellLevel2HiiHandle, L"cp", CleanFilePathStr); FreePool (CleanFilePathStr); return (SHELL_INVALID_PARAMETER); } @@ -526,7 +526,7 @@ ValidateAndCopyFiles ( // Make sure the path exists // if (EFI_ERROR (VerifyIntermediateDirectories (DestPath))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_CP_DIR_WNF), gShellLevel2HiiHandle, L"cp", DestPath); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_CP_DIR_WNF), gShellLevel2HiiHandle, L"cp", DestPath); ShellStatus = SHELL_DEVICE_ERROR; break; } @@ -536,13 +536,13 @@ ValidateAndCopyFiles ( && (StrniCmp (Node->FullName, DestPath, StrLen (DestPath)) == 0) ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_CP_SD_PARENT), gShellLevel2HiiHandle, L"cp"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_CP_SD_PARENT), gShellLevel2HiiHandle, L"cp"); ShellStatus = SHELL_INVALID_PARAMETER; break; } if (StringNoCaseCompare (&Node->FullName, &DestPath) == 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_CP_SD_SAME), gShellLevel2HiiHandle, L"cp"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_CP_SD_SAME), gShellLevel2HiiHandle, L"cp"); ShellStatus = SHELL_INVALID_PARAMETER; break; } @@ -551,7 +551,7 @@ ValidateAndCopyFiles ( && ((DestPath[StrLen (Node->FullName)] == CHAR_NULL) || (DestPath[StrLen (Node->FullName)] == L'\\')) ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_CP_SD_SAME), gShellLevel2HiiHandle, L"cp"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_CP_SD_SAME), gShellLevel2HiiHandle, L"cp"); ShellStatus = SHELL_INVALID_PARAMETER; break; } @@ -617,7 +617,7 @@ ProcessValidateAndCopyFiles ( ShellOpenFileMetaArg ((CHAR16 *)DestDir, EFI_FILE_MODE_READ, &List); if ((List != NULL) && (List->Link.ForwardLink != List->Link.BackLink)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_MARG_ERROR), gShellLevel2HiiHandle, L"cp", DestDir); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_MARG_ERROR), gShellLevel2HiiHandle, L"cp", DestDir); ShellStatus = SHELL_INVALID_PARAMETER; ShellCloseFileMetaArg (&List); } else if (List != NULL) { @@ -630,7 +630,7 @@ ProcessValidateAndCopyFiles ( if ((FileInfo->Attribute & EFI_FILE_READ_ONLY) == 0) { ShellStatus = ValidateAndCopyFiles (FileList, FullName, SilentMode, RecursiveMode, NULL); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_CP_DEST_ERROR), gShellLevel2HiiHandle, L"cp"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_CP_DEST_ERROR), gShellLevel2HiiHandle, L"cp"); ShellStatus = SHELL_ACCESS_DENIED; } } else { @@ -694,7 +694,7 @@ ShellCommandRunCp ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"cp", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"cp", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -725,7 +725,7 @@ ShellCommandRunCp ( // // we have insufficient parameters // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"cp"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"cp"); ShellStatus = SHELL_INVALID_PARAMETER; break; case 2: @@ -734,17 +734,17 @@ ShellCommandRunCp ( // Cwd = ShellGetCurrentDir (NULL); if (Cwd == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"cp"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"cp"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellOpenFileMetaArg ((CHAR16 *)ShellCommandLineGetRawValue (Package, 1), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList); if ((FileList == NULL) || IsListEmpty (&FileList->Link) || EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"cp", ShellCommandLineGetRawValue (Package, 1)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"cp", ShellCommandLineGetRawValue (Package, 1)); ShellStatus = SHELL_NOT_FOUND; } else { FullCwd = AllocateZeroPool (StrSize (Cwd) + sizeof (CHAR16)); if (FullCwd == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"cp"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"cp"); ShellStatus = SHELL_OUT_OF_RESOURCES; } else { StrCpyS (FullCwd, StrSize (Cwd) / sizeof (CHAR16) + 1, Cwd); @@ -766,7 +766,7 @@ ShellCommandRunCp ( Status = ShellOpenFileMetaArg ((CHAR16 *)ShellCommandLineGetRawValue (Package, LoopCounter), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList); if (EFI_ERROR (Status) || (FileList == NULL) || IsListEmpty (&FileList->Link)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"cp", ShellCommandLineGetRawValue (Package, LoopCounter)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"cp", ShellCommandLineGetRawValue (Package, LoopCounter)); ShellStatus = SHELL_NOT_FOUND; } } @@ -781,7 +781,7 @@ ShellCommandRunCp ( ShellStatus = ProcessValidateAndCopyFiles (FileList, PathCleanUpDirectories ((CHAR16 *)ShellCommandLineGetRawValue (Package, ParamCount)), SilentMode, RecursiveMode); Status = ShellCloseFileMetaArg (&FileList); if (EFI_ERROR (Status) && (ShellStatus == SHELL_SUCCESS)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_FILE), gShellLevel2HiiHandle, L"cp", ShellCommandLineGetRawValue (Package, ParamCount), ShellStatus|MAX_BIT); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_FILE), gShellLevel2HiiHandle, L"cp", ShellCommandLineGetRawValue (Package, ParamCount), ShellStatus|MAX_BIT); ShellStatus = SHELL_ACCESS_DENIED; } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c index f92cfa502df1..2d4ab5298e9d 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c @@ -124,7 +124,7 @@ LoadDriver ( gBS->UnloadImage (LoadedDriverHandle); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_LOAD_NOT_IMAGE), gShellLevel2HiiHandle, FileName, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LOAD_NOT_IMAGE), gShellLevel2HiiHandle, FileName, Status); } else { // // Make sure it is a driver image @@ -138,7 +138,7 @@ LoadDriver ( && (LoadedDriverImage->ImageCodeType != EfiRuntimeServicesCode)) ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_LOAD_NOT_DRIVER), gShellLevel2HiiHandle, FileName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LOAD_NOT_DRIVER), gShellLevel2HiiHandle, FileName); // // Exit and unload the non-driver image @@ -154,9 +154,9 @@ LoadDriver ( // Status = gBS->StartImage (LoadedDriverHandle, NULL, NULL); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_LOAD_ERROR), gShellLevel2HiiHandle, FileName, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LOAD_ERROR), gShellLevel2HiiHandle, FileName, Status); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_LOAD_LOADED), gShellLevel2HiiHandle, FileName, LoadedDriverImage->ImageBase, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LOAD_LOADED), gShellLevel2HiiHandle, FileName, LoadedDriverImage->ImageBase, Status); } } @@ -219,7 +219,7 @@ ShellCommandRunLoad ( Status = ShellCommandLineParse (LoadParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"load", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"load", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -235,7 +235,7 @@ ShellCommandRunLoad ( // // we didnt get a single file to load parameter // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"load"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"load"); ShellStatus = SHELL_INVALID_PARAMETER; } else { for ( ParamCount = 1 @@ -269,7 +269,7 @@ ShellCommandRunLoad ( // // no files found. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"load", (CHAR16 *)ShellCommandLineGetRawValue (Package, ParamCount)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"load", (CHAR16 *)ShellCommandLineGetRawValue (Package, ParamCount)); ShellStatus = SHELL_NOT_FOUND; } } // for loop for params diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c index acfd26cd102f..a4b8c761e910 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c @@ -120,10 +120,7 @@ PrintSfoVolumeInfoTableEntry ( ASSERT_EFI_ERROR (Status); } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_SFO_HEADER), gShellLevel2HiiHandle, L"ls" @@ -216,10 +213,7 @@ PrintFileInformation ( // print this one out... // first print the universal start, next print the type specific name format, last print the CRLF // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_LS_LINE_START_ALL), gShellLevel2HiiHandle, &TheNode->Info->ModificationTime, @@ -229,10 +223,7 @@ PrintFileInformation ( ); if (TheNode->Info->Attribute & EFI_FILE_DIRECTORY) { (*Dirs)++; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_LS_LINE_END_DIR), gShellLevel2HiiHandle, TheNode->FileName @@ -244,19 +235,13 @@ PrintFileInformation ( || (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16 *)L".efi", (CHAR16 *)&(TheNode->FileName[StrLen (TheNode->FileName) - 4])) == 0) ) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_LS_LINE_END_EXE), gShellLevel2HiiHandle, TheNode->FileName ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_LS_LINE_END_FILE), gShellLevel2HiiHandle, TheNode->FileName @@ -317,10 +302,7 @@ PrintNonSfoFooter ( // // print footer // - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_LS_FOOTER_LINE), gShellLevel2HiiHandle, Files, @@ -769,7 +751,7 @@ ShellCommandRunLs ( Status = ShellCommandLineParse (LsParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"ls", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"ls", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -784,7 +766,7 @@ ShellCommandRunLs ( } if (ShellCommandLineGetCount (Package) > 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"ls"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"ls"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -823,7 +805,7 @@ ShellCommandRunLs ( Count++; continue; default: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ATTRIBUTE), gShellLevel2HiiHandle, L"ls", ShellCommandLineGetValue (Package, L"-a")); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ATTRIBUTE), gShellLevel2HiiHandle, L"ls", ShellCommandLineGetValue (Package, L"-a")); ShellStatus = SHELL_INVALID_PARAMETER; break; } // switch @@ -846,7 +828,7 @@ ShellCommandRunLs ( CurDir = gEfiShellProtocol->GetCurDir (NULL); if (CurDir == NULL) { ShellStatus = SHELL_NOT_FOUND; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"ls"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"ls"); } ListUnfiltered = TRUE; @@ -865,7 +847,7 @@ ShellCommandRunLs ( // If we got something and it doesnt have a fully qualified path, then we needed to have a CWD. // ShellStatus = SHELL_NOT_FOUND; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"ls"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"ls"); } else { // // We got a valid fully qualified path or we have a CWD @@ -913,7 +895,7 @@ ShellCommandRunLs ( Status = gRT->GetTime (&TheTime, NULL); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"ls", L"gRT->GetTime", Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"ls", L"gRT->GetTime", Status); TheTime.TimeZone = EFI_UNSPECIFIED_TIMEZONE; } @@ -930,15 +912,15 @@ ShellCommandRunLs ( ListUnfiltered ); if (ShellStatus == SHELL_NOT_FOUND) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_LS_FILE_NOT_FOUND), gShellLevel2HiiHandle, L"ls", FullPath); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LS_FILE_NOT_FOUND), gShellLevel2HiiHandle, L"ls", FullPath); } else if (ShellStatus == SHELL_INVALID_PARAMETER) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"ls", FullPath); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"ls", FullPath); } else if (ShellStatus == SHELL_ABORTED) { // // Ignore aborting. // } else if (ShellStatus != SHELL_SUCCESS) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"ls", FullPath); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"ls", FullPath); } } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c index a031f9c7d1a1..780a737791f0 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c @@ -422,10 +422,7 @@ PerformSingleMappingDisplay ( DevPathString = ConvertDevicePathToText (DevPath, TRUE, FALSE); TempLen = StrLen (CurrentName); if (!SFO) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_MAP_ENTRY), gShellLevel2HiiHandle, CurrentName, @@ -440,10 +437,7 @@ PerformSingleMappingDisplay ( if (((TypeString != NULL) && (MediaType != NULL) && (StrStr (TypeString, MediaType) != NULL)) || (TypeString == NULL)) { Removable = IsRemoveableDevice (DevPath); TempSpot2 = ShellGetCurrentDir (CurrentName); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_MAP_ENTRY_VERBOSE), gShellLevel2HiiHandle, ConvertHandleToHandleIndex (Handle), @@ -456,10 +450,7 @@ PerformSingleMappingDisplay ( SHELL_FREE_NON_NULL (MediaType); } } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_MAP_SFO_MAPPINGS), gShellLevel2HiiHandle, CurrentName, @@ -555,7 +546,7 @@ PerformMappingDisplay ( BOOLEAN Found; if (!Consist && !Normal && (Specific == NULL) && (TypeString == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"map"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"map"); return (SHELL_INVALID_PARAMETER); } @@ -566,7 +557,7 @@ PerformMappingDisplay ( if (StrnCmp (TypeString, Test, StrLen (Test)-1) != 0) { Test = (CHAR16 *)Fp; if (StrnCmp (TypeString, Test, StrLen (Test)-1) != 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", TypeString); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", TypeString); return (SHELL_INVALID_PARAMETER); } } else if (Test == NULL) { @@ -582,9 +573,9 @@ PerformMappingDisplay ( // Print the header // if (!SFO) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MAP_HEADER), gShellLevel2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MAP_HEADER), gShellLevel2HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_SFO_HEADER), gShellLevel2HiiHandle, L"map"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_SFO_HEADER), gShellLevel2HiiHandle, L"map"); } } @@ -1150,7 +1141,7 @@ ShellCommandRunMap ( Status = ShellCommandLineParse (MapParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"map", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"map", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -1166,7 +1157,7 @@ ShellCommandRunMap ( if (ShellCommandLineGetFlag (Package, L"-?")) { ASSERT (FALSE); } else if (ShellCommandLineGetRawValue (Package, 3) != NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"map"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"map"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -1181,7 +1172,7 @@ ShellCommandRunMap ( || ShellCommandLineGetFlag (Package, L"-t") ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle, L"map"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle, L"map"); ShellStatus = SHELL_INVALID_PARAMETER; } else { SName = ShellCommandLineGetValue (Package, L"-d"); @@ -1189,18 +1180,18 @@ ShellCommandRunMap ( Status = PerformMappingDelete (SName); if (EFI_ERROR (Status)) { if (Status == EFI_ACCESS_DENIED) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel2HiiHandle, L"map"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel2HiiHandle, L"map"); ShellStatus = SHELL_ACCESS_DENIED; } else if (Status == EFI_NOT_FOUND) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MAP_NF), gShellLevel2HiiHandle, L"map", SName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MAP_NF), gShellLevel2HiiHandle, L"map", SName); ShellStatus = SHELL_INVALID_PARAMETER; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); ShellStatus = SHELL_UNSUPPORTED; } } } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"map"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"map"); ShellStatus = SHELL_INVALID_PARAMETER; } } @@ -1219,7 +1210,7 @@ ShellCommandRunMap ( // Status = ShellCommandCreateInitialMappingsAndPaths (); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); ShellStatus = SHELL_UNSUPPORTED; } } @@ -1230,7 +1221,7 @@ ShellCommandRunMap ( // Status = ShellCommandUpdateMapping (); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); ShellStatus = SHELL_UNSUPPORTED; } } @@ -1315,12 +1306,12 @@ ShellCommandRunMap ( } if ((MapAsHandle == NULL) && (Mapping[StrLen (Mapping)-1] != L':')) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", Mapping); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", Mapping); ShellStatus = SHELL_INVALID_PARAMETER; } else { TempStringLength = StrLen (SName); if (!IsNumberLetterOnly (SName, TempStringLength-((SName[TempStringLength-1] == L':') ? 1 : 0))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", SName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", SName); ShellStatus = SHELL_INVALID_PARAMETER; } @@ -1334,16 +1325,16 @@ ShellCommandRunMap ( if (ShellStatus != SHELL_SUCCESS) { switch (ShellStatus) { case SHELL_ACCESS_DENIED: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel2HiiHandle, L"map"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel2HiiHandle, L"map"); break; case SHELL_INVALID_PARAMETER: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", Mapping); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", Mapping); break; case SHELL_DEVICE_ERROR: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MAP_NOF), gShellLevel2HiiHandle, L"map", Mapping); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MAP_NOF), gShellLevel2HiiHandle, L"map", Mapping); break; default: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", ShellStatus|MAX_BIT); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", ShellStatus|MAX_BIT); } } else { // diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c index bdc6a0d08d50..fe55ca10c0a2 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c @@ -49,7 +49,7 @@ ShellCommandRunMkDir ( Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"mkdir", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"mkdir", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -70,7 +70,7 @@ ShellCommandRunMkDir ( // // we didnt get a single parameter // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"mkdir"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"mkdir"); ShellStatus = SHELL_INVALID_PARAMETER; } else { for ( DirCreateCount = 1 @@ -99,7 +99,7 @@ ShellCommandRunMkDir ( ); if (!EFI_ERROR (Status)) { ShellCloseFile (&FileHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MKDIR_ALREADY), gShellLevel2HiiHandle, NewDirName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MKDIR_ALREADY), gShellLevel2HiiHandle, NewDirName); ShellStatus = SHELL_INVALID_PARAMETER; } else { ASSERT (FileHandle == NULL); @@ -150,7 +150,7 @@ ShellCommandRunMkDir ( } if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MKDIR_CREATEFAIL), gShellLevel2HiiHandle, NewDirName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MKDIR_CREATEFAIL), gShellLevel2HiiHandle, NewDirName); ShellStatus = SHELL_ACCESS_DENIED; break; } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c index d93facc6f5d7..fafc4e3fc246 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c @@ -160,7 +160,7 @@ IsValidMove ( // // Invalid move // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MV_INV_CWD), gShellLevel2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MV_INV_CWD), gShellLevel2HiiHandle); return FALSE; } } @@ -173,7 +173,7 @@ IsValidMove ( || ((DestAttr & EFI_FILE_READ_ONLY) != 0) ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MV_INV_RO), gShellLevel2HiiHandle, SourcePath); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MV_INV_RO), gShellLevel2HiiHandle, SourcePath); return (FALSE); } @@ -201,7 +201,7 @@ IsValidMove ( ) ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MV_INV_SUB), gShellLevel2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MV_INV_SUB), gShellLevel2HiiHandle); FreePool (DestPathCopy); return (FALSE); } @@ -284,7 +284,7 @@ GetDestinationLocation ( if (StrStr (DestParameter, L":") == NULL) { if (Cwd == NULL) { ShellCloseFileMetaArg (&DestList); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle); return (SHELL_INVALID_PARAMETER); } @@ -320,7 +320,7 @@ GetDestinationLocation ( // if (!IsNodeAtEnd (&DestList->Link, &Node->Link)) { ShellCloseFileMetaArg (&DestList); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_MARG_ERROR), gShellLevel2HiiHandle, L"mv", DestParameter); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_MARG_ERROR), gShellLevel2HiiHandle, L"mv", DestParameter); return (SHELL_INVALID_PARAMETER); } @@ -341,7 +341,7 @@ GetDestinationLocation ( // cant move multiple files onto a single file. // ShellCloseFileMetaArg (&DestList); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_ERROR), gShellLevel2HiiHandle, L"mv", DestParameter); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_ERROR), gShellLevel2HiiHandle, L"mv", DestParameter); return (SHELL_INVALID_PARAMETER); } } @@ -475,7 +475,7 @@ MoveWithinFileSystems ( NewSize += StrSize (Node->FileName) + SIZE_OF_EFI_FILE_INFO + sizeof (CHAR16); NewFileInfo = AllocateZeroPool (NewSize); if (NewFileInfo == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellLevel2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_MEM), gShellLevel2HiiHandle); Status = EFI_OUT_OF_RESOURCES; } else { CopyMem (NewFileInfo, Node->Info, SIZE_OF_EFI_FILE_INFO); @@ -707,7 +707,7 @@ ValidateAndMoveFiles ( // Display error status // if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"mv", Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"mv", Status); } } @@ -782,7 +782,7 @@ ShellCommandRunMv ( Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"mv", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"mv", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -802,7 +802,7 @@ ShellCommandRunMv ( // // we have insufficient parameters // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"mv"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"mv"); ShellStatus = SHELL_INVALID_PARAMETER; break; case 2: @@ -810,12 +810,12 @@ ShellCommandRunMv ( // must have valid CWD for single parameter... // if (ShellGetCurrentDir (NULL) == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"mv"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"mv"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellOpenFileMetaArg ((CHAR16 *)ShellCommandLineGetRawValue (Package, 1), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList); if ((FileList == NULL) || IsListEmpty (&FileList->Link) || EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"mv", ShellCommandLineGetRawValue (Package, 1)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"mv", ShellCommandLineGetRawValue (Package, 1)); ShellStatus = SHELL_NOT_FOUND; } else { // @@ -824,7 +824,7 @@ ShellCommandRunMv ( CwdSize = StrSize (ShellGetCurrentDir (NULL)) + sizeof (CHAR16); Cwd = AllocateZeroPool (CwdSize); if (Cwd == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"mv"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"mv"); ShellStatus = SHELL_OUT_OF_RESOURCES; } else { StrCpyS (Cwd, CwdSize / sizeof (CHAR16), ShellGetCurrentDir (NULL)); @@ -845,7 +845,7 @@ ShellCommandRunMv ( Status = ShellOpenFileMetaArg ((CHAR16 *)ShellCommandLineGetRawValue (Package, LoopCounter), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList); if ((FileList == NULL) || IsListEmpty (&FileList->Link) || EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"mv", ShellCommandLineGetRawValue (Package, LoopCounter)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"mv", ShellCommandLineGetRawValue (Package, LoopCounter)); ShellStatus = SHELL_NOT_FOUND; } else { // @@ -863,7 +863,7 @@ ShellCommandRunMv ( Status = ShellCloseFileMetaArg (&FileList); if (EFI_ERROR (Status) && (ShellStatus == SHELL_SUCCESS)) { ShellStatus = SHELL_ACCESS_DENIED; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_FILE), gShellLevel2HiiHandle, L"mv", ShellCommandLineGetRawValue (Package, 1), ShellStatus|MAX_BIT); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_FILE), gShellLevel2HiiHandle, L"mv", ShellCommandLineGetRawValue (Package, 1), ShellStatus|MAX_BIT); } } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c index 213e28a8294b..78e6ad06ef71 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c @@ -139,10 +139,10 @@ PerformParsing ( Status = ShellOpenFileByName (FileName, &FileHandle, EFI_FILE_MODE_READ, 0); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"parse", FileName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"parse", FileName); ShellStatus = SHELL_NOT_FOUND; } else if (!EFI_ERROR (FileHandleIsDirectory (FileHandle))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NOT_FILE), gShellLevel2HiiHandle, L"parse", FileName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NOT_FILE), gShellLevel2HiiHandle, L"parse", FileName); ShellStatus = SHELL_NOT_FOUND; } else { for (LoopVariable = 0; LoopVariable < ShellCommandInstance && !ShellFileHandleEof (FileHandle);) { @@ -190,7 +190,7 @@ PerformParsing ( if (ColumnLoop == ColumnIndex) { if (ColumnPointer == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"parse", L"Column Index"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"parse", L"Column Index"); ShellStatus = SHELL_INVALID_PARAMETER; } else { TempSpot = StrStr (ColumnPointer, L",\""); @@ -274,7 +274,7 @@ ShellCommandRunParse ( Status = ShellCommandLineParseEx (ParamList, &Package, &ProblemParam, TRUE, FALSE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"parse", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"parse", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -285,12 +285,12 @@ ShellCommandRunParse ( if ((!StreamingUnicode && (ShellCommandLineGetCount (Package) < 4)) || (ShellCommandLineGetCount (Package) < 3)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"parse"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"parse"); ShellStatus = SHELL_INVALID_PARAMETER; } else if ((StreamingUnicode && (ShellCommandLineGetCount (Package) > 3)) || (ShellCommandLineGetCount (Package) > 4)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"parse"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"parse"); ShellStatus = SHELL_INVALID_PARAMETER; } else { if (StreamingUnicode) { diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c index cab9a1da3091..4bafa0abb648 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c @@ -54,7 +54,7 @@ ShellCommandRunReset ( Status = ShellCommandLineParse (ResetParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"reset", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"reset", ProblemParam); FreePool (ProblemParam); return (SHELL_INVALID_PARAMETER); } else { @@ -67,7 +67,7 @@ ShellCommandRunReset ( if (ShellCommandLineGetFlag (Package, L"-?")) { ASSERT (FALSE); } else if (ShellCommandLineGetRawValue (Package, 1) != NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); ShellStatus = SHELL_INVALID_PARAMETER; } else { if (ShellCommandLineGetFlag (Package, L"-fwui")) { @@ -121,7 +121,7 @@ ShellCommandRunReset ( // if (ShellCommandLineGetFlag (Package, L"-w")) { if (ShellCommandLineGetFlag (Package, L"-s") || ShellCommandLineGetFlag (Package, L"-c")) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); ShellStatus = SHELL_INVALID_PARAMETER; } else { String = ShellCommandLineGetValue (Package, L"-w"); @@ -133,7 +133,7 @@ ShellCommandRunReset ( } } else if (ShellCommandLineGetFlag (Package, L"-s")) { if (ShellCommandLineGetFlag (Package, L"-c")) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); ShellStatus = SHELL_INVALID_PARAMETER; } else { String = ShellCommandLineGetValue (Package, L"-s"); diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c index de550b83c014..edf31d6b4a05 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c @@ -82,14 +82,14 @@ CascadeDelete ( Status = EFI_SUCCESS; if ((Node->Info->Attribute & EFI_FILE_READ_ONLY) == EFI_FILE_READ_ONLY) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_RM_LOG_DETELE_RO), gShellLevel2HiiHandle, L"rm", Node->FullName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_RM_LOG_DETELE_RO), gShellLevel2HiiHandle, L"rm", Node->FullName); return (SHELL_ACCESS_DENIED); } if ((Node->Info->Attribute & EFI_FILE_DIRECTORY) == EFI_FILE_DIRECTORY) { if (!IsDirectoryEmpty (Node->Handle)) { if (!Quiet) { - Status = ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_RM_LOG_DELETE_CONF), gShellLevel2HiiHandle, Node->FullName); + Status = ShellPrintHiiDefaultEx (STRING_TOKEN (STR_RM_LOG_DELETE_CONF), gShellLevel2HiiHandle, Node->FullName); Status = ShellPromptForResponse (ShellPromptResponseTypeYesNo, NULL, (VOID **)&Resp); ASSERT (Resp != NULL); if (EFI_ERROR (Status) || (*Resp != ShellPromptResponseYes)) { @@ -173,7 +173,7 @@ CascadeDelete ( // now delete the current node... // if (!Quiet) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_RM_LOG_DELETE), gShellLevel2HiiHandle, Node->FullName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_RM_LOG_DELETE), gShellLevel2HiiHandle, Node->FullName); } Status = gEfiShellProtocol->DeleteFile (Node->Handle); @@ -184,11 +184,11 @@ CascadeDelete ( // We cant allow for the warning here! (Dont use EFI_ERROR Macro). // if (Status != EFI_SUCCESS) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_RM_LOG_DELETE_ERR), gShellLevel2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_RM_LOG_DELETE_ERR), gShellLevel2HiiHandle, Status); return (SHELL_ACCESS_DENIED); } else { if (!Quiet) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_RM_LOG_DELETE_COMP), gShellLevel2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_RM_LOG_DELETE_COMP), gShellLevel2HiiHandle); } return (SHELL_SUCCESS); @@ -307,7 +307,7 @@ ShellCommandRunRm ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"rm", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"rm", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -325,7 +325,7 @@ ShellCommandRunRm ( // // we insufficient parameters // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"rm"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"rm"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -339,7 +339,7 @@ ShellCommandRunRm ( { Status = ShellOpenFileMetaArg ((CHAR16 *)Param, EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList); if (EFI_ERROR (Status) || (FileList == NULL) || IsListEmpty (&FileList->Link)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"rm", (CHAR16 *)Param); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"rm", (CHAR16 *)Param); ShellStatus = SHELL_NOT_FOUND; break; } @@ -365,13 +365,13 @@ ShellCommandRunRm ( // do the deleting of nodes // if (EFI_ERROR (Node->Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_RM_LOG_DELETE_ERR2), gShellLevel2HiiHandle, Node->Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_RM_LOG_DELETE_ERR2), gShellLevel2HiiHandle, Node->Status); ShellStatus = SHELL_ACCESS_DENIED; break; } if (!IsValidDeleteTarget (FileList, Node, Package)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_RM_LOG_DELETE_ERR3), gShellLevel2HiiHandle, Node->FullName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_RM_LOG_DELETE_ERR3), gShellLevel2HiiHandle, Node->FullName); ShellStatus = SHELL_INVALID_PARAMETER; break; } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Set.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Set.c index 79596373d6e3..c2a6ec4484fd 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Set.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Set.c @@ -32,7 +32,7 @@ PrintAllShellEnvVars ( while (*ConstEnvNameList != CHAR_NULL) { Value = gEfiShellProtocol->GetEnv (ConstEnvNameList); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SET_DISP), gShellLevel2HiiHandle, ConstEnvNameList, Value); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_DISP), gShellLevel2HiiHandle, ConstEnvNameList, Value); ConstEnvNameList += StrLen (ConstEnvNameList)+1; } @@ -86,7 +86,7 @@ ShellCommandRunSet ( Status = ShellCommandLineParse (SetParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"set", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"set", ProblemParam); FreePool (ProblemParam); return (SHELL_INVALID_PARAMETER); } else { @@ -99,10 +99,10 @@ ShellCommandRunSet ( if (ShellCommandLineGetFlag (Package, L"-?")) { ASSERT (FALSE); } else if (ShellCommandLineGetRawValue (Package, 3) != NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"set"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"set"); ShellStatus = SHELL_INVALID_PARAMETER; } else if ((ShellCommandLineGetRawValue (Package, 1) != NULL) && ShellCommandLineGetFlag (Package, L"-d")) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"set"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"set"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetFlag (Package, L"-d")) { // @@ -110,12 +110,12 @@ ShellCommandRunSet ( // KeyName = ShellCommandLineGetValue (Package, L"-d"); if (KeyName == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"set", L"-d"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"set", L"-d"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Status = ShellSetEnvironmentVariable (KeyName, L"", ShellCommandLineGetFlag (Package, L"-v")); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SET_ND), gShellLevel2HiiHandle, L"set", KeyName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_ND), gShellLevel2HiiHandle, L"set", KeyName); ShellStatus = SHELL_DEVICE_ERROR; } } @@ -136,7 +136,7 @@ ShellCommandRunSet ( // Status = ShellSetEnvironmentVariable (KeyName, Value, ShellCommandLineGetFlag (Package, L"-v")); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SET_ERROR_SET), gShellLevel2HiiHandle, L"set", KeyName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_ERROR_SET), gShellLevel2HiiHandle, L"set", KeyName); ShellStatus = (SHELL_STATUS)(Status & (~MAX_BIT)); } } else { @@ -146,10 +146,10 @@ ShellCommandRunSet ( // Value = ShellGetEnvironmentVariable (KeyName); if (Value == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SET_NF), gShellLevel2HiiHandle, L"set", KeyName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_NF), gShellLevel2HiiHandle, L"set", KeyName); ShellStatus = SHELL_SUCCESS; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SET_DISP), gShellLevel2HiiHandle, KeyName, Value); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_DISP), gShellLevel2HiiHandle, KeyName, Value); ShellStatus = SHELL_SUCCESS; } } else { diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c index f01f4e450b09..f0c3a5516ea9 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c @@ -102,7 +102,7 @@ CheckAndSetDate ( Status = gRT->GetTime (&TheTime, NULL); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"date", L"gRT->GetTime", Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"date", L"gRT->GetTime", Status); return (SHELL_DEVICE_ERROR); } @@ -201,7 +201,7 @@ ShellCommandRunDate ( Status = ShellCommandLineParse (SfoParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"date", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"date", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -214,7 +214,7 @@ ShellCommandRunDate ( if (ShellCommandLineGetFlag (Package, L"-?")) { ASSERT (FALSE); } else if (ShellCommandLineGetRawValue (Package, 2) != NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"date"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"date"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -227,7 +227,7 @@ ShellCommandRunDate ( // Status = gRT->GetTime (&TheTime, NULL); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"date", L"gRT->GetTime", Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"date", L"gRT->GetTime", Status); return (SHELL_DEVICE_ERROR); } @@ -240,14 +240,14 @@ ShellCommandRunDate ( // ShellCommand,"date" // Date,"DD","MM","YYYY" // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_SFO_HEADER), gShellLevel2HiiHandle, L"date"); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DATE_SFO_FORMAT), gShellLevel2HiiHandle, TheTime.Day, TheTime.Month, TheTime.Year); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_SFO_HEADER), gShellLevel2HiiHandle, L"date"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DATE_SFO_FORMAT), gShellLevel2HiiHandle, TheTime.Day, TheTime.Month, TheTime.Year); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DATE_FORMAT), gShellLevel2HiiHandle, TheTime.Month, TheTime.Day, TheTime.Year); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DATE_FORMAT), gShellLevel2HiiHandle, TheTime.Month, TheTime.Day, TheTime.Year); } } else { if (PcdGet8 (PcdShellSupportLevel) == 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"date"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"date"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -261,7 +261,7 @@ ShellCommandRunDate ( } if (ShellStatus != SHELL_SUCCESS) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"date", Param1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"date", Param1); ShellStatus = SHELL_INVALID_PARAMETER; } } @@ -329,7 +329,7 @@ CheckAndSetTime ( Status = gRT->GetTime (&TheTime, NULL); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"time", L"gRT->GetTime", Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"time", L"gRT->GetTime", Status); return (SHELL_DEVICE_ERROR); } @@ -445,7 +445,7 @@ ShellCommandRunTime ( if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"time", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"time", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -457,14 +457,14 @@ ShellCommandRunTime ( // Status = gRT->GetTime (&TheTime, NULL); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"time", L"gRT->GetTime", Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"time", L"gRT->GetTime", Status); return (SHELL_DEVICE_ERROR); } if (ShellCommandLineGetFlag (Package, L"-?")) { ASSERT (FALSE); } else if (ShellCommandLineGetRawValue (Package, 2) != NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"time"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"time"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -484,10 +484,7 @@ ShellCommandRunTime ( } if (TheTime.TimeZone != EFI_UNSPECIFIED_TIMEZONE) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_TIME_FORMAT), gShellLevel2HiiHandle, TheTime.Hour, @@ -498,10 +495,7 @@ ShellCommandRunTime ( TzMinutes ); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_TIME_FORMAT_LOCAL), gShellLevel2HiiHandle, TheTime.Hour, @@ -510,13 +504,10 @@ ShellCommandRunTime ( ); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_CRLF), gShellLevel2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_CRLF), gShellLevel2HiiHandle); } else if (ShellCommandLineGetFlag (Package, L"-d") && (ShellCommandLineGetValue (Package, L"-d") == NULL)) { if (TheTime.TimeZone == EFI_UNSPECIFIED_TIMEZONE) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_TIME_FORMAT_LOCAL), gShellLevel2HiiHandle, TheTime.Hour, @@ -525,10 +516,7 @@ ShellCommandRunTime ( ); } else { TzMinutes = (ABS (TheTime.TimeZone)) % 60; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_TIME_FORMAT), gShellLevel2HiiHandle, TheTime.Hour, @@ -542,23 +530,23 @@ ShellCommandRunTime ( switch (TheTime.Daylight) { case 0: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_TIME_DST0), gShellLevel2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST0), gShellLevel2HiiHandle); break; case EFI_TIME_ADJUST_DAYLIGHT: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_TIME_DST1), gShellLevel2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST1), gShellLevel2HiiHandle); break; case EFI_TIME_IN_DAYLIGHT: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_TIME_DST2), gShellLevel2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST2), gShellLevel2HiiHandle); break; case EFI_TIME_IN_DAYLIGHT|EFI_TIME_ADJUST_DAYLIGHT: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_TIME_DST3), gShellLevel2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST3), gShellLevel2HiiHandle); break; default: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_ERROR), gShellLevel2HiiHandle, L"time", L"gRT->GetTime", L"TheTime.Daylight", TheTime.Daylight); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_ERROR), gShellLevel2HiiHandle, L"time", L"gRT->GetTime", L"TheTime.Daylight", TheTime.Daylight); } } else { if (PcdGet8 (PcdShellSupportLevel) == 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"time"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"time"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -594,7 +582,7 @@ ShellCommandRunTime ( } if (!((Tz >= -1440) && (Tz <= 1440)) && (Tz != EFI_UNSPECIFIED_TIMEZONE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"time", TempLocation, L"-tz"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"time", TempLocation, L"-tz"); ShellStatus = SHELL_INVALID_PARAMETER; } } else { @@ -617,7 +605,7 @@ ShellCommandRunTime ( } if ((Daylight != 0) && (Daylight != 1) && (Daylight != 3)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"time", TempLocation, L"-d"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"time", TempLocation, L"-d"); ShellStatus = SHELL_INVALID_PARAMETER; } } else { @@ -630,7 +618,7 @@ ShellCommandRunTime ( if (ShellStatus == SHELL_SUCCESS) { ShellStatus = CheckAndSetTime (ShellCommandLineGetRawValue (Package, 1), Tz, Daylight); if (ShellStatus != SHELL_SUCCESS) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"time", ShellCommandLineGetRawValue (Package, 1)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"time", ShellCommandLineGetRawValue (Package, 1)); ShellStatus = SHELL_INVALID_PARAMETER; } } @@ -735,7 +723,7 @@ CheckAndSetTimeZone ( if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16 *)TimeZoneString, L"_local") == 0) { Status = gRT->GetTime (&TheTime, NULL); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"gRT->GetTime", Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"gRT->GetTime", Status); return (SHELL_DEVICE_ERROR); } @@ -754,7 +742,7 @@ CheckAndSetTimeZone ( Status = gRT->GetTime (&TheTime, NULL); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"timezone", L"gRT->GetTime", Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"timezone", L"gRT->GetTime", Status); return (SHELL_DEVICE_ERROR); } @@ -856,7 +844,7 @@ ShellCommandRunTimeZone ( if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"timezone", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"timezone", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -867,18 +855,18 @@ ShellCommandRunTimeZone ( // check for "-?" // if (ShellCommandLineGetCount (Package) > 1) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"timezone"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"timezone"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetFlag (Package, L"-?")) { ASSERT (FALSE); } else if (ShellCommandLineGetFlag (Package, L"-s")) { if ((ShellCommandLineGetFlag (Package, L"-l")) || (ShellCommandLineGetFlag (Package, L"-f"))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"timezone", L"-l or -f"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"timezone", L"-l or -f"); ShellStatus = SHELL_INVALID_PARAMETER; } else { ASSERT (PcdGet8 (PcdShellSupportLevel) == 3); if (ShellCommandLineGetValue (Package, L"-s") == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"timezone", L"-s"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"timezone", L"-s"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -886,7 +874,7 @@ ShellCommandRunTimeZone ( // ShellStatus = CheckAndSetTimeZone (ShellCommandLineGetValue (Package, L"-s")); if (ShellStatus != SHELL_SUCCESS) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"timezone", ShellCommandLineGetValue (Package, L"-s")); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"timezone", ShellCommandLineGetValue (Package, L"-s")); ShellStatus = SHELL_INVALID_PARAMETER; } } @@ -900,7 +888,7 @@ ShellCommandRunTimeZone ( ; LoopVar++ ) { - ShellPrintHiiEx (-1, -1, NULL, TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle); + ShellPrintHiiDefaultEx (TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle); } } else { // @@ -908,7 +896,7 @@ ShellCommandRunTimeZone ( // Status = gRT->GetTime (&TheTime, NULL); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"timezone", L"gRT->GetTime", Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"timezone", L"gRT->GetTime", Status); return (SHELL_DEVICE_ERROR); } @@ -924,17 +912,14 @@ ShellCommandRunTimeZone ( // // Print all info about current time zone // - ShellPrintHiiEx (-1, -1, NULL, TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle); + ShellPrintHiiDefaultEx (TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle); } else { // // Print basic info only // TzMinutes = (ABS (TheTime.TimeZone)) % 60; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_TIMEZONE_SIMPLE), gShellLevel2HiiHandle, (TheTime.TimeZone > 0 ? L"-" : L"+"), @@ -954,10 +939,7 @@ ShellCommandRunTimeZone ( // TzMinutes = (ABS (TheTime.TimeZone)) % 60; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_TIMEZONE_SIMPLE), gShellLevel2HiiHandle, (TheTime.TimeZone > 0 ? L"-" : L"+"), @@ -966,7 +948,7 @@ ShellCommandRunTimeZone ( ); if (ShellCommandLineGetFlag (Package, L"-f")) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_TIMEZONE_NI), gShellLevel2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIMEZONE_NI), gShellLevel2HiiHandle); } } } else { @@ -983,7 +965,7 @@ ShellCommandRunTimeZone ( // // Print all info about current time zone // - ShellPrintHiiEx (-1, -1, NULL, TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle); + ShellPrintHiiDefaultEx (TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle); break; } } @@ -991,7 +973,7 @@ ShellCommandRunTimeZone ( // // Print basic info only // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_TIMEZONE_SIMPLE_LOCAL), gShellLevel2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIMEZONE_SIMPLE_LOCAL), gShellLevel2HiiHandle); } } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c index 768e9e490e66..0279c42b9566 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c @@ -58,7 +58,7 @@ HandleVol ( (StrStr (Name, L" ") != NULL)) ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"vol", Name); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"vol", Name); return (SHELL_INVALID_PARAMETER); } @@ -69,7 +69,7 @@ HandleVol ( ); if (EFI_ERROR (Status) || (ShellFileHandle == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"vol", Path); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"vol", Path); return (SHELL_ACCESS_DENIED); } @@ -89,7 +89,7 @@ HandleVol ( if (Status == EFI_BUFFER_TOO_SMALL) { SysInfo = AllocateZeroPool (SysInfoSize); if (SysInfo == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"vol"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"vol"); ASSERT (FALSE); return SHELL_OUT_OF_RESOURCES; } @@ -117,7 +117,7 @@ HandleVol ( if (Size1 > Size2) { SysInfo = ReallocatePool ((UINTN)SysInfo->Size, (UINTN)SysInfo->Size + Size1 - Size2, SysInfo); if (SysInfo == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"vol"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"vol"); ShellStatus = SHELL_OUT_OF_RESOURCES; } } @@ -142,7 +142,7 @@ HandleVol ( if (Delete || (Name != NULL)) { if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"vol", Path); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"vol", Path); ShellStatus = SHELL_ACCESS_DENIED; } } @@ -160,7 +160,7 @@ HandleVol ( if (Status == EFI_BUFFER_TOO_SMALL) { SysInfo = AllocateZeroPool (SysInfoSize); if (SysInfo == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"vol"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"vol"); return SHELL_OUT_OF_RESOURCES; } @@ -254,7 +254,7 @@ ShellCommandRunVol ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"vol", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"vol", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -269,7 +269,7 @@ ShellCommandRunVol ( } if (ShellCommandLineGetCount (Package) > 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"vol"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"vol"); ShellStatus = SHELL_INVALID_PARAMETER; } else { PathName = ShellCommandLineGetRawValue (Package, 1); @@ -277,7 +277,7 @@ ShellCommandRunVol ( CurDir = gEfiShellProtocol->GetCurDir (NULL); if (CurDir == NULL) { ShellStatus = SHELL_NOT_FOUND; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"vol"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"vol"); } else { PathName = CurDir; } @@ -299,13 +299,13 @@ ShellCommandRunVol ( DeleteMode = ShellCommandLineGetFlag (Package, L"-d"); NewName = ShellCommandLineGetValue (Package, L"-n"); if (DeleteMode && ShellCommandLineGetFlag (Package, L"-n")) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellLevel2HiiHandle, L"vol", L"-d", L"-n"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellLevel2HiiHandle, L"vol", L"-d", L"-n"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetFlag (Package, L"-n") && (NewName == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"vol", L"-n"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"vol", L"-n"); ShellStatus = SHELL_INVALID_PARAMETER; } else if ((NewName != NULL) && (StrLen (NewName) > 11)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"vol", NewName, L"-n"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"vol", NewName, L"-n"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellStatus == SHELL_SUCCESS) { ShellStatus = HandleVol ( diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/Alias.c b/ShellPkg/Library/UefiShellLevel3CommandsLib/Alias.c index 8ad0dd63ad19..7f250021f96d 100644 --- a/ShellPkg/Library/UefiShellLevel3CommandsLib/Alias.c +++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/Alias.c @@ -31,14 +31,14 @@ PrintSingleShellAlias ( ShellStatus = SHELL_SUCCESS; ConstAliasVal = gEfiShellProtocol->GetAlias (Alias, &Volatile); if (ConstAliasVal == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"alias", Alias); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"alias", Alias); ShellStatus = SHELL_INVALID_PARAMETER; } else { if (ShellCommandIsOnAliasList (Alias)) { Volatile = FALSE; } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_ALIAS_OUTPUT), gShellLevel3HiiHandle, !Volatile ? L' ' : L'*', Alias, ConstAliasVal); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_ALIAS_OUTPUT), gShellLevel3HiiHandle, !Volatile ? L' ' : L'*', Alias, ConstAliasVal); } return ShellStatus; @@ -123,13 +123,13 @@ ShellLevel3CommandsLibSetAlias ( Status = gEfiShellProtocol->SetAlias (Command, Alias, Replace, Volatile); if (EFI_ERROR (Status)) { if (Status == EFI_ACCESS_DENIED) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel3HiiHandle, L"alias"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel3HiiHandle, L"alias"); ShellStatus = SHELL_ACCESS_DENIED; } else if (Status == EFI_NOT_FOUND) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_NOT_FOUND), gShellLevel3HiiHandle, L"alias", Command); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_NOT_FOUND), gShellLevel3HiiHandle, L"alias", Command); ShellStatus = SHELL_NOT_FOUND; } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel3HiiHandle, L"alias", Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel3HiiHandle, L"alias", Status); ShellStatus = SHELL_DEVICE_ERROR; } } @@ -186,7 +186,7 @@ ShellCommandRunAlias ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"alias", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"alias", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -233,17 +233,17 @@ ShellCommandRunAlias ( ShellStatus = ShellLevel3CommandsLibSetAlias (CleanParam2, Param1, FALSE, VolatileFlag); break; default: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"alias"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"alias"); ShellStatus = SHELL_INVALID_PARAMETER; } } else if (DeleteFlag) { if (VolatileFlag || (ShellCommandLineGetCount (Package) > 1)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"alias"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"alias"); ShellStatus = SHELL_INVALID_PARAMETER; } else { ParamStrD = ShellCommandLineGetValue (Package, L"-d"); if (ParamStrD == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel3HiiHandle, L"alias"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel3HiiHandle, L"alias"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -261,7 +261,7 @@ ShellCommandRunAlias ( switch (ShellCommandLineGetCount (Package)) { case 1: case 2: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel3HiiHandle, L"alias"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel3HiiHandle, L"alias"); ShellStatus = SHELL_INVALID_PARAMETER; break; case 3: @@ -271,7 +271,7 @@ ShellCommandRunAlias ( ShellStatus = ShellLevel3CommandsLibSetAlias (CleanParam2, Param1, FALSE, VolatileFlag); break; default: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"alias"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"alias"); ShellStatus = SHELL_INVALID_PARAMETER; } } diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/Cls.c b/ShellPkg/Library/UefiShellLevel3CommandsLib/Cls.c index 8c0e232bc9ac..f70b737e8f7f 100644 --- a/ShellPkg/Library/UefiShellLevel3CommandsLib/Cls.c +++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/Cls.c @@ -57,7 +57,7 @@ ShellCommandRunCls ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"cls", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"cls", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -71,16 +71,13 @@ ShellCommandRunCls ( ASSERT (FALSE); } else if (ShellCommandLineGetFlag (Package, L"-sfo")) { if (ShellCommandLineGetCount (Package) > 1) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"cls"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"cls"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Background = (gST->ConOut->Mode->Attribute >> 4) & 0x7; Foreground = gST->ConOut->Mode->Attribute & 0x0F; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_SFO_HEADER), gShellLevel3HiiHandle, L"cls"); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_SFO_HEADER), gShellLevel3HiiHandle, L"cls"); + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_CLS_OUTPUT_SFO), gShellLevel3HiiHandle, gST->ConOut->Mode->Attribute, @@ -101,12 +98,12 @@ ShellCommandRunCls ( // gST->ConOut->ClearScreen (gST->ConOut); } else if (ShellCommandLineGetCount (Package) > 3) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"cls"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"cls"); ShellStatus = SHELL_INVALID_PARAMETER; } else { if (BackColorStr != NULL) { if ((ShellStrToUintn (BackColorStr) > 7) || (StrLen (BackColorStr) > 1) || (!ShellIsDecimalDigitCharacter (*BackColorStr))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"cls", BackColorStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"cls", BackColorStr); ShellStatus = SHELL_INVALID_PARAMETER; } else { switch (ShellStrToUintn (BackColorStr)) { @@ -138,7 +135,7 @@ ShellCommandRunCls ( if (ForeColorStr != NULL) { if ((ShellStrToUintn (ForeColorStr) > 15) || (StrLen (ForeColorStr) > 2) || (!ShellIsDecimalDigitCharacter (*ForeColorStr))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"cls", ForeColorStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"cls", ForeColorStr); ShellStatus = SHELL_INVALID_PARAMETER; } else { switch (ShellStrToUintn (ForeColorStr)) { diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/Echo.c b/ShellPkg/Library/UefiShellLevel3CommandsLib/Echo.c index a055a06a9180..070cba04da1a 100644 --- a/ShellPkg/Library/UefiShellLevel3CommandsLib/Echo.c +++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/Echo.c @@ -55,7 +55,7 @@ ShellCommandRunEcho ( Status = ShellCommandLineParseEx (ParamList, &Package, &ProblemParam, TRUE, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"echo", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"echo", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -84,9 +84,9 @@ ShellCommandRunEcho ( // output its current state // if (ShellCommandGetEchoState ()) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_ECHO_ON), gShellLevel3HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_ECHO_ON), gShellLevel3HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_ECHO_OFF), gShellLevel3HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_ECHO_OFF), gShellLevel3HiiHandle); } } else { // diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/GetMtc.c b/ShellPkg/Library/UefiShellLevel3CommandsLib/GetMtc.c index f3c91cede384..ee1ea4ecbc5b 100644 --- a/ShellPkg/Library/UefiShellLevel3CommandsLib/GetMtc.c +++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/GetMtc.c @@ -45,7 +45,7 @@ ShellCommandRunGetMtc ( Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"getmtc", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"getmtc", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -58,7 +58,7 @@ ShellCommandRunGetMtc ( if (ShellCommandLineGetFlag (Package, L"-?")) { ASSERT (FALSE); } else if (ShellCommandLineGetRawValue (Package, 1) != NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"getmtc"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"getmtc"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -77,7 +77,7 @@ ShellCommandRunGetMtc ( // print it... // if (ShellStatus == SHELL_SUCCESS) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GET_MTC_OUTPUT), gShellLevel3HiiHandle, Mtc); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GET_MTC_OUTPUT), gShellLevel3HiiHandle, Mtc); } } diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/Help.c b/ShellPkg/Library/UefiShellLevel3CommandsLib/Help.c index 076ad1e1986b..54b733ea0fa4 100644 --- a/ShellPkg/Library/UefiShellLevel3CommandsLib/Help.c +++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/Help.c @@ -251,19 +251,13 @@ PrintDynamicCommandHelp ( PrintCommandText ); if (Status == EFI_DEVICE_ERROR) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_HELP_INV), gShellLevel3HiiHandle, DynamicCommand->CommandName ); } else if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_HELP_NF), gShellLevel3HiiHandle, DynamicCommand->CommandName @@ -335,7 +329,7 @@ ShellCommandRunHelp ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"help", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"help", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -350,10 +344,10 @@ ShellCommandRunHelp ( && (ShellCommandLineGetFlag (Package, L"-verbose") || ShellCommandLineGetFlag (Package, L"-v")) ) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel3HiiHandle, L"help"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel3HiiHandle, L"help"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetRawValue (Package, 2) != NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"help"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"help"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -396,8 +390,8 @@ ShellCommandRunHelp ( // // we need info on the special characters // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HELP_SC_HEADER), gShellLevel3HiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HELP_SC_DATA), gShellLevel3HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HELP_SC_HEADER), gShellLevel3HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HELP_SC_DATA), gShellLevel3HiiHandle); Found = TRUE; } else { SortedCommandList = NULL; @@ -432,9 +426,9 @@ ShellCommandRunHelp ( } if (Status == EFI_DEVICE_ERROR) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HELP_INV), gShellLevel3HiiHandle, CurrentCommand); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HELP_INV), gShellLevel3HiiHandle, CurrentCommand); } else if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HELP_NF), gShellLevel3HiiHandle, CurrentCommand); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HELP_NF), gShellLevel3HiiHandle, CurrentCommand); } else { Found = TRUE; } @@ -447,9 +441,9 @@ ShellCommandRunHelp ( if (!Found) { Status = ShellPrintHelp (CommandToGetHelpOn, SectionToGetHelpOn, FALSE); if (Status == EFI_DEVICE_ERROR) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HELP_INV), gShellLevel3HiiHandle, CommandToGetHelpOn); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HELP_INV), gShellLevel3HiiHandle, CommandToGetHelpOn); } else if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HELP_NF), gShellLevel3HiiHandle, CommandToGetHelpOn); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HELP_NF), gShellLevel3HiiHandle, CommandToGetHelpOn); } else { Found = TRUE; } @@ -472,7 +466,7 @@ ShellCommandRunHelp ( // If '*' then the command entered was 'Help' without qualifiers, This footer // provides additional info on help switches // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HELP_FOOTER), gShellLevel3HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HELP_FOOTER), gShellLevel3HiiHandle); } if (CommandToGetHelpOn != NULL) { diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/Pause.c b/ShellPkg/Library/UefiShellLevel3CommandsLib/Pause.c index ca0fe1bdc5d4..af97c797d773 100644 --- a/ShellPkg/Library/UefiShellLevel3CommandsLib/Pause.c +++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/Pause.c @@ -47,7 +47,7 @@ ShellCommandRunPause ( ASSERT_EFI_ERROR (Status); if (!gEfiShellProtocol->BatchIsActive ()) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_NO_SCRIPT), gShellLevel3HiiHandle, L"pause"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_NO_SCRIPT), gShellLevel3HiiHandle, L"pause"); return (SHELL_UNSUPPORTED); } @@ -57,7 +57,7 @@ ShellCommandRunPause ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"pause", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"pause", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -70,7 +70,7 @@ ShellCommandRunPause ( if (ShellCommandLineGetFlag (Package, L"-?")) { ASSERT (FALSE); } else if (ShellCommandLineGetRawValue (Package, 1) != NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"pause"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"pause"); ShellStatus = SHELL_INVALID_PARAMETER; } else { if (!ShellCommandLineGetFlag (Package, L"-q")) { diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c b/ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c index 624641696777..6b70cc4e7e88 100644 --- a/ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c +++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c @@ -34,7 +34,7 @@ TouchFileByHandle ( Status = gRT->GetTime (&FileInfo->ModificationTime, NULL); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"gRT->GetTime", Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"gRT->GetTime", Status); return (SHELL_DEVICE_ERROR); } @@ -94,7 +94,7 @@ DoTouchByHandle ( // Status = TouchFileByHandle (Handle); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel3HiiHandle, L"touch", Name); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel3HiiHandle, L"touch", Name); return (Status); } @@ -126,7 +126,7 @@ DoTouchByHandle ( // Status = gEfiShellProtocol->OpenFileByName (Walker->FullName, &Walker->Handle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel3HiiHandle, L"touch", Walker->FullName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel3HiiHandle, L"touch", Walker->FullName); Status = EFI_ACCESS_DENIED; } else { Status = DoTouchByHandle (Walker->FullName, FS, Walker->Handle, TRUE); @@ -194,7 +194,7 @@ ShellCommandRunTouch ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"touch", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"touch", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -212,7 +212,7 @@ ShellCommandRunTouch ( // // we insufficient parameters // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel3HiiHandle, L"touch"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel3HiiHandle, L"touch"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -226,7 +226,7 @@ ShellCommandRunTouch ( { Status = ShellOpenFileMetaArg ((CHAR16 *)Param, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, &FileList); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"touch", (CHAR16 *)Param); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"touch", (CHAR16 *)Param); ShellStatus = SHELL_NOT_FOUND; break; } @@ -240,7 +240,7 @@ ShellCommandRunTouch ( // check that we have at least 1 file // if ((FileList == NULL) || IsListEmpty (&FileList->Link)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel3HiiHandle, L"touch", Param); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel3HiiHandle, L"touch", Param); continue; } else { // @@ -255,14 +255,14 @@ ShellCommandRunTouch ( // make sure the file opened ok // if (EFI_ERROR (Node->Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel3HiiHandle, L"touch", Node->FileName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel3HiiHandle, L"touch", Node->FileName); ShellStatus = SHELL_NOT_FOUND; continue; } Status = DoTouchByHandle (Node->FullName, NULL, Node->Handle, ShellCommandLineGetFlag (Package, L"-r")); if (EFI_ERROR (Status) && (Status != EFI_ACCESS_DENIED)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel3HiiHandle, L"touch", Node->FileName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel3HiiHandle, L"touch", Node->FileName); ShellStatus = SHELL_NOT_FOUND; } } diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/Type.c b/ShellPkg/Library/UefiShellLevel3CommandsLib/Type.c index 8e3138ad5b6a..68e8ff9bc5b7 100644 --- a/ShellPkg/Library/UefiShellLevel3CommandsLib/Type.c +++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/Type.c @@ -207,7 +207,7 @@ ShellCommandRunType ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"type", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"type", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -225,13 +225,13 @@ ShellCommandRunType ( UnicodeMode = ShellCommandLineGetFlag (Package, L"-u"); if (AsciiMode && UnicodeMode) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"type", L"-a & -u"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"type", L"-a & -u"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetRawValue (Package, 1) == NULL) { // // we insufficient parameters // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel3HiiHandle, L"type"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel3HiiHandle, L"type"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // @@ -245,7 +245,7 @@ ShellCommandRunType ( { Status = ShellOpenFileMetaArg ((CHAR16 *)Param, EFI_FILE_MODE_READ, &FileList); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel3HiiHandle, L"type", (CHAR16 *)Param); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel3HiiHandle, L"type", (CHAR16 *)Param); ShellStatus = SHELL_NOT_FOUND; break; } @@ -259,7 +259,7 @@ ShellCommandRunType ( // check that we have at least 1 file // if ((FileList == NULL) || IsListEmpty (&FileList->Link)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel3HiiHandle, L"type", Param); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel3HiiHandle, L"type", Param); continue; } else { // @@ -278,7 +278,7 @@ ShellCommandRunType ( // make sure the file opened ok // if (EFI_ERROR (Node->Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel3HiiHandle, L"type", Node->FileName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel3HiiHandle, L"type", Node->FileName); ShellStatus = SHELL_NOT_FOUND; continue; } @@ -287,7 +287,7 @@ ShellCommandRunType ( // make sure its not a directory // if (FileHandleIsDirectory (Node->Handle) == EFI_SUCCESS) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_IS_DIR), gShellLevel3HiiHandle, L"type", Node->FileName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_IS_DIR), gShellLevel3HiiHandle, L"type", Node->FileName); ShellStatus = SHELL_NOT_FOUND; continue; } @@ -297,7 +297,7 @@ ShellCommandRunType ( // Status = TypeFileByHandle (Node->Handle, AsciiMode, UnicodeMode); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_TYP_ERROR), gShellLevel3HiiHandle, L"type", Node->FileName); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TYP_ERROR), gShellLevel3HiiHandle, L"type", Node->FileName); ShellStatus = SHELL_INVALID_PARAMETER; } diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/Ver.c b/ShellPkg/Library/UefiShellLevel3CommandsLib/Ver.c index fe6a9ca3de3c..4ec1e20d4860 100644 --- a/ShellPkg/Library/UefiShellLevel3CommandsLib/Ver.c +++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/Ver.c @@ -58,7 +58,7 @@ ShellCommandRunVer ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"ver", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"ver", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -76,12 +76,12 @@ ShellCommandRunVer ( // // we have too many parameters // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"ver"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"ver"); ShellStatus = SHELL_INVALID_PARAMETER; } else { if (ShellCommandLineGetFlag (Package, L"-s")) { if (ShellCommandLineGetFlag (Package, L"-terse") || ShellCommandLineGetFlag (Package, L"-t")) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellLevel3HiiHandle, L"ver", L"-t or -terse", L"-s"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellLevel3HiiHandle, L"ver", L"-t or -terse", L"-s"); ShellStatus = SHELL_INVALID_PARAMETER; } else { ShellPrintHiiEx ( @@ -106,19 +106,13 @@ ShellCommandRunVer ( gEfiShellProtocol->MinorVersion ); if (!ShellCommandLineGetFlag (Package, L"-terse") && !ShellCommandLineGetFlag (Package, L"-t")) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_VER_OUTPUT_SUPPLIER), gShellLevel3HiiHandle, (CHAR16 *)PcdGetPtr (PcdShellSupplier) ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_VER_OUTPUT_UEFI), gShellLevel3HiiHandle, (gST->Hdr.Revision&0xffff0000)>>16, diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c index 71b08bdff153..838cdb321f2d 100644 --- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c +++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c @@ -319,13 +319,13 @@ IfConfigPrintMacAddr ( ASSERT (Size <= MACADDRMAXSIZE); for (Index = 0; Index < Size; Index++) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_BODY), gShellNetwork1HiiHandle, Node[Index]); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_BODY), gShellNetwork1HiiHandle, Node[Index]); if (Index + 1 < Size) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_COLON), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INFO_COLON), gShellNetwork1HiiHandle); } } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle); } /** @@ -553,7 +553,7 @@ IfConfigShowInterfaceInfo ( MediaStatus = EFI_SUCCESS; if (IsListEmpty (IfList)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle); } // @@ -562,39 +562,39 @@ IfConfigShowInterfaceInfo ( NET_LIST_FOR_EACH_SAFE (Entry, Next, IfList) { IfCb = NET_LIST_USER_STRUCT (Entry, IFCONFIG_INTERFACE_CB, Link); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle); // // Print interface name. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IF_NAME), gShellNetwork1HiiHandle, IfCb->IfInfo->Name); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INFO_IF_NAME), gShellNetwork1HiiHandle, IfCb->IfInfo->Name); // // Get Media State. // if (EFI_SUCCESS == NetLibDetectMediaWaitTimeout (IfCb->NicHandle, 0, &MediaStatus)) { if (MediaStatus != EFI_SUCCESS) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media disconnected"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media disconnected"); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media present"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media present"); } } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media state unknown"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INFO_MEDIA_STATE), gShellNetwork1HiiHandle, L"Media state unknown"); } // // Print interface config policy. // if (IfCb->Policy == Ip4Config2PolicyDhcp) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_DHCP), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_DHCP), gShellNetwork1HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_MAN), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_MAN), gShellNetwork1HiiHandle); } // // Print mac address of the interface. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_HEAD), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_HEAD), gShellNetwork1HiiHandle); IfConfigPrintMacAddr ( IfCb->IfInfo->HwAddress.Addr, @@ -604,12 +604,9 @@ IfConfigShowInterfaceInfo ( // // Print IPv4 address list of the interface. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_HEAD), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_HEAD), gShellNetwork1HiiHandle); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), gShellNetwork1HiiHandle, (UINTN)IfCb->IfInfo->StationAddress.Addr[0], @@ -621,12 +618,9 @@ IfConfigShowInterfaceInfo ( // // Print subnet mask list of the interface. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_SUBNET_MASK_HEAD), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INFO_SUBNET_MASK_HEAD), gShellNetwork1HiiHandle); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), gShellNetwork1HiiHandle, (UINTN)IfCb->IfInfo->SubnetMask.Addr[0], @@ -638,7 +632,7 @@ IfConfigShowInterfaceInfo ( // // Print default gateway of the interface. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_GATEWAY_HEAD), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INFO_GATEWAY_HEAD), gShellNetwork1HiiHandle); ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS)); @@ -650,10 +644,7 @@ IfConfigShowInterfaceInfo ( } } - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), gShellNetwork1HiiHandle, (UINTN)Gateway.Addr[0], @@ -665,15 +656,12 @@ IfConfigShowInterfaceInfo ( // // Print route table entry. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, IfCb->IfInfo->RouteTableSize); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, IfCb->IfInfo->RouteTableSize); for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), gShellNetwork1HiiHandle, L"Subnet ", @@ -683,10 +671,7 @@ IfConfigShowInterfaceInfo ( (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[3] ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), gShellNetwork1HiiHandle, L"Netmask", @@ -696,10 +681,7 @@ IfConfigShowInterfaceInfo ( (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[3] ); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), gShellNetwork1HiiHandle, L"Gateway", @@ -713,13 +695,10 @@ IfConfigShowInterfaceInfo ( // // Print dns server addresses list of the interface if has. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_HEAD), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_HEAD), gShellNetwork1HiiHandle); for (Index = 0; Index < IfCb->DnsCnt; Index++) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_BODY), gShellNetwork1HiiHandle, (UINTN)IfCb->DnsAddr[Index].Addr[0], @@ -728,11 +707,11 @@ IfConfigShowInterfaceInfo ( (UINTN)IfCb->DnsAddr[Index].Addr[3] ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle); } } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle); return SHELL_SUCCESS; } @@ -764,7 +743,7 @@ IfConfigClearInterfaceInfo ( ShellStatus = SHELL_SUCCESS; if (IsListEmpty (IfList)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle); } // @@ -785,7 +764,7 @@ IfConfigClearInterfaceInfo ( &Policy ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); ShellStatus = SHELL_ACCESS_DENIED; break; } @@ -800,7 +779,7 @@ IfConfigClearInterfaceInfo ( &Policy ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); ShellStatus = SHELL_ACCESS_DENIED; break; } @@ -848,7 +827,7 @@ IfConfigSetInterfaceInfo ( Dns = NULL; if (IsListEmpty (IfList)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle); return SHELL_INVALID_PARAMETER; } @@ -879,7 +858,7 @@ IfConfigSetInterfaceInfo ( &TimeOutEvt ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); ShellStatus = SHELL_ACCESS_DENIED; goto ON_EXIT; } @@ -892,7 +871,7 @@ IfConfigSetInterfaceInfo ( &MappedEvt ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); ShellStatus = SHELL_ACCESS_DENIED; goto ON_EXIT; } @@ -913,11 +892,11 @@ IfConfigSetInterfaceInfo ( if (VarCheckOk != CheckCode) { switch (CheckCode) { case VarCheckDuplicate: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_DUPLICATE_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_DUPLICATE_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg); break; case VarCheckConflict: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_CONFLICT_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_CONFLICT_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg); break; case VarCheckUnknown: @@ -926,14 +905,14 @@ IfConfigSetInterfaceInfo ( // TempString = PermanentString; if (StringNoCaseCompare (&VarArg->Arg, &TempString) == 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle, PermanentString); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle, PermanentString); goto ON_EXIT; } // // To handle unknown option. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_UNKNOWN_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_UNKNOWN_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg); break; default: @@ -959,7 +938,7 @@ IfConfigSetInterfaceInfo ( &Policy ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); ShellStatus = SHELL_ACCESS_DENIED; goto ON_EXIT; } @@ -968,7 +947,7 @@ IfConfigSetInterfaceInfo ( } else if (StrCmp (VarArg->Arg, L"static") == 0) { VarArg = VarArg->Next; if (VarArg == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -980,7 +959,7 @@ IfConfigSetInterfaceInfo ( // Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.Address); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -990,14 +969,14 @@ IfConfigSetInterfaceInfo ( // VarArg = VarArg->Next; if (VarArg == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.SubnetMask); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1007,14 +986,14 @@ IfConfigSetInterfaceInfo ( // VarArg = VarArg->Next; if (VarArg == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } Status = NetLibStrToIp4 (VarArg->Arg, &Gateway); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, VarArg->Arg); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1031,7 +1010,7 @@ IfConfigSetInterfaceInfo ( (SubnetMask != 0xFFFFFFFFu) && !NetIp4IsUnicast (TempGateway, SubnetMask)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_GATEWAY), gShellNetwork1HiiHandle, VarArg->Arg); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INVALID_GATEWAY), gShellNetwork1HiiHandle, VarArg->Arg); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1047,7 +1026,7 @@ IfConfigSetInterfaceInfo ( &Policy ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); ShellStatus = SHELL_ACCESS_DENIED; goto ON_EXIT; } @@ -1063,7 +1042,7 @@ IfConfigSetInterfaceInfo ( MappedEvt ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_SET_ADDR_FAILED), gShellNetwork1HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_SET_ADDR_FAILED), gShellNetwork1HiiHandle, Status); ShellStatus = SHELL_ACCESS_DENIED; goto ON_EXIT; } @@ -1095,7 +1074,7 @@ IfConfigSetInterfaceInfo ( ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_SET_ADDR_FAILED), gShellNetwork1HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_SET_ADDR_FAILED), gShellNetwork1HiiHandle, Status); ShellStatus = SHELL_ACCESS_DENIED; goto ON_EXIT; } @@ -1112,7 +1091,7 @@ IfConfigSetInterfaceInfo ( &Gateway ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_SET_ADDR_FAILED), gShellNetwork1HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_SET_ADDR_FAILED), gShellNetwork1HiiHandle, Status); ShellStatus = SHELL_ACCESS_DENIED; goto ON_EXIT; } @@ -1132,7 +1111,7 @@ IfConfigSetInterfaceInfo ( Dns = AllocatePool (Index * sizeof (EFI_IPv4_ADDRESS)); if (Dns == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig"); ShellStatus = SHELL_OUT_OF_RESOURCES; goto ON_EXIT; } @@ -1142,7 +1121,7 @@ IfConfigSetInterfaceInfo ( while (Tmp != NULL) { Status = NetLibStrToIp4 (Tmp->Arg, Dns + Index); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, Tmp->Arg); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_INVALID_IPADDRESS), gShellNetwork1HiiHandle, Tmp->Arg); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1165,7 +1144,7 @@ IfConfigSetInterfaceInfo ( Dns ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork1HiiHandle, L"ifconfig"); ShellStatus = SHELL_ACCESS_DENIED; goto ON_EXIT; } @@ -1311,7 +1290,7 @@ ShellCommandRunIfconfig ( Status = ShellCommandLineParseEx (mIfConfigCheckList, &ParamPackage, &ProblemParam, TRUE, FALSE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", ProblemParam); FreePool (ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { @@ -1325,7 +1304,7 @@ ShellCommandRunIfconfig ( // To handle unsupported option. // if (ShellCommandLineGetFlag (ParamPackage, L"-c")) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle, L"-c"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle, L"-c"); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1336,7 +1315,7 @@ ShellCommandRunIfconfig ( if (!ShellCommandLineGetFlag (ParamPackage, L"-r") && !ShellCommandLineGetFlag (ParamPackage, L"-s") && !ShellCommandLineGetFlag (ParamPackage, L"-l")) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_OPTION), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_LACK_OPTION), gShellNetwork1HiiHandle); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1348,7 +1327,7 @@ ShellCommandRunIfconfig ( ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) || ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-l")))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellNetwork1HiiHandle, L"ifconfig"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CON), gShellNetwork1HiiHandle, L"ifconfig"); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1370,7 +1349,7 @@ ShellCommandRunIfconfig ( if (ValueStr != NULL) { Str = AllocateCopyPool (StrSize (ValueStr), ValueStr); if (Str == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig"); ShellStatus = SHELL_OUT_OF_RESOURCES; goto ON_EXIT; } @@ -1388,7 +1367,7 @@ ShellCommandRunIfconfig ( if (ValueStr != NULL) { Str = AllocateCopyPool (StrSize (ValueStr), ValueStr); if (Str == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig"); ShellStatus = SHELL_OUT_OF_RESOURCES; goto ON_EXIT; } @@ -1403,7 +1382,7 @@ ShellCommandRunIfconfig ( if (ShellCommandLineGetFlag (ParamPackage, L"-s")) { ValueStr = ShellCommandLineGetValue (ParamPackage, L"-s"); if (ValueStr == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_INTERFACE), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_LACK_INTERFACE), gShellNetwork1HiiHandle); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1413,7 +1392,7 @@ ShellCommandRunIfconfig ( // ArgList = SplitStrToList (ValueStr, L' '); if (ArgList == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork1HiiHandle, L"ifconfig"); ShellStatus = SHELL_OUT_OF_RESOURCES; goto ON_EXIT; } @@ -1424,7 +1403,7 @@ ShellCommandRunIfconfig ( Private->VarArg = ArgList->Next; if ((Private->IfName == NULL) || (Private->VarArg == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c index 21e09db70df0..421c030c4166 100644 --- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c +++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c @@ -607,10 +607,7 @@ Ping6OnEchoReplyReceived ( Private->RttMin = Private->RttMin > Rtt ? Rtt : Private->RttMin; Private->RttMax = Private->RttMax < Rtt ? Rtt : Private->RttMax; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PING_REPLY_INFO), gShellNetwork1HiiHandle, PayLoad, @@ -637,7 +634,7 @@ Ping6OnEchoReplyReceived ( Status = Private->ProtocolPointers.Receive (Private->IpProtocol, &Private->RxToken); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_RECEIVE), gShellNetwork1HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING_RECEIVE), gShellNetwork1HiiHandle, Status); Private->Status = EFI_ABORTED; } } else { @@ -839,7 +836,7 @@ Ping6ReceiveEchoReply ( Status = Private->ProtocolPointers.Receive (Private->IpProtocol, &Private->RxToken); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_RECEIVE), gShellNetwork1HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING_RECEIVE), gShellNetwork1HiiHandle, Status); } return Status; @@ -879,7 +876,7 @@ Ping6OnTimerRoutine ( Status = PingSendEchoRequest (Private); if (Private->TxCount != 0) { if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_SEND_REQUEST), gShellNetwork1HiiHandle, Private->TxCount + 1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING_SEND_REQUEST), gShellNetwork1HiiHandle, Private->TxCount + 1); } } } @@ -902,7 +899,7 @@ Ping6OnTimerRoutine ( // // Remove the timeout icmp6 echo request from list. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_TIMEOUT), gShellNetwork1HiiHandle, TxInfo->SequenceNum); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING_TIMEOUT), gShellNetwork1HiiHandle, TxInfo->SequenceNum); RemoveEntryList (&TxInfo->Link); PingDestroyTxInfo (TxInfo, Private->IpChoice); @@ -1020,14 +1017,14 @@ PingCreateIpInstance ( // if (Private->IpChoice == PING_IP_CHOICE_IP6) { if (NetIp6IsLinkLocalAddr ((EFI_IPv6_ADDRESS *)&Private->DstAddress) && UnspecifiedSrc) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_INVALID_SOURCE), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING_INVALID_SOURCE), gShellNetwork1HiiHandle); Status = EFI_INVALID_PARAMETER; goto ON_ERROR; } } else { ASSERT (Private->IpChoice == PING_IP_CHOICE_IP4); if (PingNetIp4IsLinkLocalAddr ((EFI_IPv4_ADDRESS *)&Private->DstAddress) && UnspecifiedSrc) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_INVALID_SOURCE), gShellNetwork1HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING_INVALID_SOURCE), gShellNetwork1HiiHandle); Status = EFI_INVALID_PARAMETER; goto ON_ERROR; } @@ -1104,7 +1101,7 @@ PingCreateIpInstance ( } if (Status != EFI_BUFFER_TOO_SMALL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_GETDATA), gShellNetwork1HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING_GETDATA), gShellNetwork1HiiHandle, Status); goto ON_ERROR; } @@ -1135,7 +1132,7 @@ PingCreateIpInstance ( } if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_GETDATA), gShellNetwork1HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING_GETDATA), gShellNetwork1HiiHandle, Status); goto ON_ERROR; } @@ -1195,7 +1192,7 @@ PingCreateIpInstance ( // if (HandleIndex == HandleNum) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_CONFIGD_NIC_NF), gShellNetwork1HiiHandle, L"ping"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING_CONFIGD_NIC_NF), gShellNetwork1HiiHandle, L"ping"); Status = EFI_NOT_FOUND; goto ON_ERROR; } @@ -1243,7 +1240,7 @@ PingCreateIpInstance ( Status = ((EFI_IP6_PROTOCOL *)(Private->IpProtocol))->Configure (Private->IpProtocol, &Ip6Config); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_CONFIG), gShellNetwork1HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING_CONFIG), gShellNetwork1HiiHandle, Status); goto ON_ERROR; } @@ -1285,7 +1282,7 @@ PingCreateIpInstance ( Status = ((EFI_IP4_PROTOCOL *)(Private->IpProtocol))->Configure (Private->IpProtocol, &Ip4Config); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_CONFIG), gShellNetwork1HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING_CONFIG), gShellNetwork1HiiHandle, Status); goto ON_ERROR; } @@ -1409,7 +1406,7 @@ ShellPing ( // // Print the command line itself. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_START), gShellNetwork1HiiHandle, mDstString, Private->BufferSize); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING_START), gShellNetwork1HiiHandle, mDstString, Private->BufferSize); // // Create a ipv6 token to receive the first icmp6 echo reply packet. // @@ -1455,11 +1452,11 @@ ShellPing ( if (EFI_ERROR (Status) && (Status != EFI_NOT_READY)) { ShellStatus = SHELL_ACCESS_DENIED; if (Status == EFI_NOT_FOUND) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_NOSOURCE_INDO), gShellNetwork1HiiHandle, mDstString); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING_NOSOURCE_INDO), gShellNetwork1HiiHandle, mDstString); } else if (Status == RETURN_NO_MAPPING) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_NOROUTE_FOUND), gShellNetwork1HiiHandle, mDstString, mSrcString); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING_NOROUTE_FOUND), gShellNetwork1HiiHandle, mDstString, mSrcString); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_NETWORK_ERROR), gShellNetwork1HiiHandle, L"ping", Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING_NETWORK_ERROR), gShellNetwork1HiiHandle, L"ping", Status); } goto ON_EXIT; @@ -1499,10 +1496,7 @@ ShellPing ( gBS->SetTimer (Private->Timer, TimerCancel, 0); if (Private->TxCount != 0) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PING_STAT), gShellNetwork1HiiHandle, Private->TxCount, @@ -1513,10 +1507,7 @@ ShellPing ( } if (Private->RxCount > Private->FailedCount) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PING_RTT), gShellNetwork1HiiHandle, Private->RttMin, @@ -1609,7 +1600,7 @@ ShellCommandRunPing ( Status = ShellCommandLineParseEx (PingParamList, &ParamPackage, &ProblemParam, TRUE, FALSE); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1629,7 +1620,7 @@ ShellCommandRunPing ( // ShellStrToUintn will return 0 when input is 0 or an invalid input string. // if ((SendNumber == 0) || (SendNumber > MAX_SEND_NUMBER)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1648,7 +1639,7 @@ ShellCommandRunPing ( // ShellStrToUintn will return 0 when input is 0 or an invalid input string. // if ((BufferSize < 16) || (BufferSize > MAX_BUFFER_SIZE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1676,7 +1667,7 @@ ShellCommandRunPing ( } if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1687,13 +1678,13 @@ ShellCommandRunPing ( // NonOptionCount = ShellCommandLineGetCount (ParamPackage); if (NonOptionCount < 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ping"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle, L"ping"); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } if (NonOptionCount > 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellNetwork1HiiHandle, L"ping"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellNetwork1HiiHandle, L"ping"); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1708,7 +1699,7 @@ ShellCommandRunPing ( } if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", ValueStr); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } diff --git a/ShellPkg/Library/UefiShellNetwork2CommandsLib/Ifconfig6.c b/ShellPkg/Library/UefiShellNetwork2CommandsLib/Ifconfig6.c index 7e2326de8f2d..0d21558422e0 100644 --- a/ShellPkg/Library/UefiShellNetwork2CommandsLib/Ifconfig6.c +++ b/ShellPkg/Library/UefiShellNetwork2CommandsLib/Ifconfig6.c @@ -341,13 +341,13 @@ IfConfig6PrintMacAddr ( ASSERT (Size <= MACADDRMAXSIZE); for (Index = 0; Index < Size; Index++) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_MAC_ADDR_BODY), gShellNetwork2HiiHandle, Node[Index]); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_MAC_ADDR_BODY), gShellNetwork2HiiHandle, Node[Index]); if (Index + 1 < Size) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_COLON), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_COLON), gShellNetwork2HiiHandle); } } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle); } /** @@ -377,10 +377,10 @@ IfConfig6PrintIpAddr ( // // :: is at the beginning of the address. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_COLON), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_COLON), gShellNetwork2HiiHandle); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_COLON), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_COLON), gShellNetwork2HiiHandle); while ((Index < PREFIXMAXLEN) && (Ip->Addr[Index] == 0) && (Ip->Addr[Index + 1] == 0)) { Index = Index + 2; @@ -400,17 +400,17 @@ IfConfig6PrintIpAddr ( } if (Index < PREFIXMAXLEN - 1) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_IP_ADDR_BODY), gShellNetwork2HiiHandle, Ip->Addr[Index]); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_IP_ADDR_BODY), gShellNetwork2HiiHandle, Ip->Addr[Index + 1]); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_IP_ADDR_BODY), gShellNetwork2HiiHandle, Ip->Addr[Index]); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_IP_ADDR_BODY), gShellNetwork2HiiHandle, Ip->Addr[Index + 1]); } if (Index + 2 < PREFIXMAXLEN) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_COLON), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_COLON), gShellNetwork2HiiHandle); } } if (PrefixLen != NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_PREFIX_LEN), gShellNetwork2HiiHandle, *PrefixLen); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_PREFIX_LEN), gShellNetwork2HiiHandle, *PrefixLen); } } @@ -792,7 +792,7 @@ IfConfig6GetInterfaceInfo ( ); if (Status != EFI_BUFFER_TOO_SMALL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); goto ON_ERROR; } @@ -814,7 +814,7 @@ IfConfig6GetInterfaceInfo ( ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); goto ON_ERROR; } @@ -838,7 +838,7 @@ IfConfig6GetInterfaceInfo ( ); if ((Status != EFI_BUFFER_TOO_SMALL) && (Status != EFI_NOT_FOUND)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); goto ON_ERROR; } @@ -866,7 +866,7 @@ IfConfig6GetInterfaceInfo ( ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); goto ON_ERROR; } } @@ -889,7 +889,7 @@ IfConfig6GetInterfaceInfo ( ); if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); goto ON_ERROR; } @@ -910,7 +910,7 @@ IfConfig6GetInterfaceInfo ( ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); goto ON_ERROR; } @@ -926,7 +926,7 @@ IfConfig6GetInterfaceInfo ( ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); goto ON_ERROR; } @@ -986,7 +986,7 @@ IfConfig6ShowInterfaceInfo ( Entry = IfList->ForwardLink; if (IsListEmpty (IfList)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_INTERFACE), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_INTERFACE), gShellNetwork2HiiHandle); } // @@ -995,32 +995,32 @@ IfConfig6ShowInterfaceInfo ( while (Entry != IfList) { IfCb = BASE_CR (Entry, IFCONFIG6_INTERFACE_CB, Link); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_BREAK), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_BREAK), gShellNetwork2HiiHandle); // // Print interface name. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_IF_NAME), gShellNetwork2HiiHandle, IfCb->IfInfo->Name); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_IF_NAME), gShellNetwork2HiiHandle, IfCb->IfInfo->Name); // // Print interface config policy. // if (IfCb->Policy == Ip6ConfigPolicyAutomatic) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_POLICY_AUTO), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_POLICY_AUTO), gShellNetwork2HiiHandle); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_POLICY_MAN), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_POLICY_MAN), gShellNetwork2HiiHandle); } // // Print dad transmit. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_DAD_TRANSMITS), gShellNetwork2HiiHandle, IfCb->Xmits); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_DAD_TRANSMITS), gShellNetwork2HiiHandle, IfCb->Xmits); // // Print interface id if has. // if (IfCb->IfId != NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_INTERFACE_ID_HEAD), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_INTERFACE_ID_HEAD), gShellNetwork2HiiHandle); IfConfig6PrintMacAddr ( IfCb->IfId->Id, @@ -1031,7 +1031,7 @@ IfConfig6ShowInterfaceInfo ( // // Print mac address of the interface. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_MAC_ADDR_HEAD), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_MAC_ADDR_HEAD), gShellNetwork2HiiHandle); IfConfig6PrintMacAddr ( IfCb->IfInfo->HwAddress.Addr, @@ -1041,53 +1041,53 @@ IfConfig6ShowInterfaceInfo ( // // Print ip addresses list of the interface. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_IP_ADDR_HEAD), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_IP_ADDR_HEAD), gShellNetwork2HiiHandle); for (Index = 0; Index < IfCb->IfInfo->AddressInfoCount; Index++) { IfConfig6PrintIpAddr ( &IfCb->IfInfo->AddressInfo[Index].Address, &IfCb->IfInfo->AddressInfo[Index].PrefixLength ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle); } // // Print dns server addresses list of the interface if has. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_DNS_ADDR_HEAD), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_DNS_ADDR_HEAD), gShellNetwork2HiiHandle); for (Index = 0; Index < IfCb->DnsCnt; Index++) { IfConfig6PrintIpAddr ( &IfCb->DnsAddr[Index], NULL ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle); } // // Print route table of the interface if has. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_ROUTE_HEAD), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_ROUTE_HEAD), gShellNetwork2HiiHandle); for (Index = 0; Index < IfCb->IfInfo->RouteCount; Index++) { IfConfig6PrintIpAddr ( &IfCb->IfInfo->RouteTable[Index].Destination, &IfCb->IfInfo->RouteTable[Index].PrefixLength ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_JOINT), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_JOINT), gShellNetwork2HiiHandle); IfConfig6PrintIpAddr ( &IfCb->IfInfo->RouteTable[Index].Gateway, NULL ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle); } Entry = Entry->ForwardLink; } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_BREAK), gShellNetwork2HiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_BREAK), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle); return SHELL_SUCCESS; } @@ -1119,7 +1119,7 @@ IfConfig6ClearInterfaceInfo ( ShellStatus = SHELL_SUCCESS; if (IsListEmpty (IfList)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_INTERFACE), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_INTERFACE), gShellNetwork2HiiHandle); } // @@ -1139,7 +1139,7 @@ IfConfig6ClearInterfaceInfo ( &Policy ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork2HiiHandle, L"ifconfig6"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork2HiiHandle, L"ifconfig6"); ShellStatus = SHELL_ACCESS_DENIED; break; } @@ -1155,7 +1155,7 @@ IfConfig6ClearInterfaceInfo ( ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork2HiiHandle, L"ifconfig6"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork2HiiHandle, L"ifconfig6"); ShellStatus = SHELL_ACCESS_DENIED; break; } @@ -1214,7 +1214,7 @@ IfConfig6SetInterfaceInfo ( CurDadXmits = 0; if (IsListEmpty (IfList)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_INTERFACE), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_INTERFACE), gShellNetwork2HiiHandle); return SHELL_INVALID_PARAMETER; } @@ -1277,15 +1277,15 @@ IfConfig6SetInterfaceInfo ( if (VarCheckOk != CheckCode) { switch (CheckCode) { case VarCheckDuplicate: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_DUPLICATE_COMMAND), gShellNetwork2HiiHandle, VarArg->Arg); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_DUPLICATE_COMMAND), gShellNetwork2HiiHandle, VarArg->Arg); break; case VarCheckConflict: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_CONFLICT_COMMAND), gShellNetwork2HiiHandle, VarArg->Arg); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_CONFLICT_COMMAND), gShellNetwork2HiiHandle, VarArg->Arg); break; case VarCheckUnknown: - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_UNKNOWN_COMMAND), gShellNetwork2HiiHandle, VarArg->Arg); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_UNKNOWN_COMMAND), gShellNetwork2HiiHandle, VarArg->Arg); break; default: @@ -1320,15 +1320,15 @@ IfConfig6SetInterfaceInfo ( if (VarArg != NULL) { if (StrCmp (VarArg->Arg, L"host") == 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_IP_CONFIG), gShellNetwork2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_IP_CONFIG), gShellNetwork2HiiHandle, Status); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } else if (StrCmp (VarArg->Arg, L"gw") == 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_GW_CONFIG), gShellNetwork2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_GW_CONFIG), gShellNetwork2HiiHandle, Status); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } else if (StrCmp (VarArg->Arg, L"dns") == 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_DNS_CONFIG), gShellNetwork2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_DNS_CONFIG), gShellNetwork2HiiHandle, Status); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1365,7 +1365,7 @@ IfConfig6SetInterfaceInfo ( if (EFI_ERROR (Status)) { if (Status == EFI_INVALID_PARAMETER) { ShellStatus = SHELL_INVALID_PARAMETER; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_ARGUMENTS), gShellNetwork2HiiHandle, L"host"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_ARGUMENTS), gShellNetwork2HiiHandle, L"host"); continue; } else { ShellStatus = SHELL_ACCESS_DENIED; @@ -1425,7 +1425,7 @@ IfConfig6SetInterfaceInfo ( ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_MAN_HOST), gShellNetwork2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_MAN_HOST), gShellNetwork2HiiHandle, Status); ShellStatus = SHELL_ACCESS_DENIED; goto ON_EXIT; } @@ -1443,7 +1443,7 @@ IfConfig6SetInterfaceInfo ( ); if (Status != EFI_BUFFER_TOO_SMALL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); ShellStatus = SHELL_ACCESS_DENIED; goto ON_EXIT; } @@ -1463,7 +1463,7 @@ IfConfig6SetInterfaceInfo ( ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); ShellStatus = SHELL_ACCESS_DENIED; goto ON_EXIT; } @@ -1487,12 +1487,12 @@ IfConfig6SetInterfaceInfo ( } if (!IsAddressSet) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_ADDRESS_FAILED), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_ADDRESS_FAILED), gShellNetwork2HiiHandle); IfConfig6PrintIpAddr ( &CfgManAddr[Index].Address, &CfgManAddr[Index].PrefixLength ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle); } } } else if (StrCmp (VarArg->Arg, L"gw") == 0) { @@ -1509,7 +1509,7 @@ IfConfig6SetInterfaceInfo ( if (EFI_ERROR (Status)) { if (Status == EFI_INVALID_PARAMETER) { ShellStatus = SHELL_INVALID_PARAMETER; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_ARGUMENTS), gShellNetwork2HiiHandle, L"gw"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_ARGUMENTS), gShellNetwork2HiiHandle, L"gw"); continue; } else { ShellStatus = SHELL_ACCESS_DENIED; @@ -1529,7 +1529,7 @@ IfConfig6SetInterfaceInfo ( if (EFI_ERROR (Status)) { ShellStatus = SHELL_ACCESS_DENIED; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_MAN_GW), gShellNetwork2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_MAN_GW), gShellNetwork2HiiHandle, Status); goto ON_EXIT; } } else if (StrCmp (VarArg->Arg, L"dns") == 0) { @@ -1546,7 +1546,7 @@ IfConfig6SetInterfaceInfo ( if (EFI_ERROR (Status)) { if (Status == EFI_INVALID_PARAMETER) { ShellStatus = SHELL_INVALID_PARAMETER; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_ARGUMENTS), gShellNetwork2HiiHandle, L"dns"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_ARGUMENTS), gShellNetwork2HiiHandle, L"dns"); continue; } else { ShellStatus = SHELL_ACCESS_DENIED; @@ -1791,7 +1791,7 @@ ShellCommandRunIfconfig6 ( Status = ShellCommandLineParseEx (mIfConfig6CheckList, &ParamPackage, &ProblemParam, TRUE, FALSE); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_COMMAND), gShellNetwork2HiiHandle, L"ifconfig6", ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_COMMAND), gShellNetwork2HiiHandle, L"ifconfig6", ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1802,7 +1802,7 @@ ShellCommandRunIfconfig6 ( if (!ShellCommandLineGetFlag (ParamPackage, L"-r") && !ShellCommandLineGetFlag (ParamPackage, L"-s") && !ShellCommandLineGetFlag (ParamPackage, L"-?") && !ShellCommandLineGetFlag (ParamPackage, L"-l")) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_LACK_OPTION), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_LACK_OPTION), gShellNetwork2HiiHandle); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1817,7 +1817,7 @@ ShellCommandRunIfconfig6 ( ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-?"))) || ((ShellCommandLineGetFlag (ParamPackage, L"-l")) && (ShellCommandLineGetFlag (ParamPackage, L"-?")))) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_CONFLICT_OPTIONS), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_CONFLICT_OPTIONS), gShellNetwork2HiiHandle); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1840,7 +1840,7 @@ ShellCommandRunIfconfig6 ( if (ValueStr != NULL) { Str = AllocateCopyPool (StrSize (ValueStr), ValueStr); if (Str == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"ifconfig6"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"ifconfig6"); ShellStatus = SHELL_OUT_OF_RESOURCES; goto ON_EXIT; } @@ -1858,7 +1858,7 @@ ShellCommandRunIfconfig6 ( if (ValueStr != NULL) { Str = AllocateCopyPool (StrSize (ValueStr), ValueStr); if (Str == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"ifconfig6"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"ifconfig6"); ShellStatus = SHELL_OUT_OF_RESOURCES; goto ON_EXIT; } @@ -1873,7 +1873,7 @@ ShellCommandRunIfconfig6 ( if (ShellCommandLineGetFlag (ParamPackage, L"-s")) { ValueStr = ShellCommandLineGetValue (ParamPackage, L"-s"); if (ValueStr == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_INTERFACE), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_INTERFACE), gShellNetwork2HiiHandle); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1883,7 +1883,7 @@ ShellCommandRunIfconfig6 ( // ArgList = IfConfig6SplitStrToList (ValueStr, L' '); if (ArgList == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"ifconfig6"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"ifconfig6"); ShellStatus = SHELL_OUT_OF_RESOURCES; goto ON_EXIT; } @@ -1894,7 +1894,7 @@ ShellCommandRunIfconfig6 ( Private->VarArg = ArgList->Next; if ((Private->IfName == NULL) || (Private->VarArg == NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_COMMAND), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_COMMAND), gShellNetwork2HiiHandle); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } diff --git a/ShellPkg/Library/UefiShellNetwork2CommandsLib/Ping6.c b/ShellPkg/Library/UefiShellNetwork2CommandsLib/Ping6.c index 43d578bd6ad8..35492993f94e 100644 --- a/ShellPkg/Library/UefiShellNetwork2CommandsLib/Ping6.c +++ b/ShellPkg/Library/UefiShellNetwork2CommandsLib/Ping6.c @@ -440,10 +440,7 @@ Ping6OnEchoReplyReceived6 ( Private->RttMin = Private->RttMin > Rtt ? Rtt : Private->RttMin; Private->RttMax = Private->RttMax < Rtt ? Rtt : Private->RttMax; - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PING6_REPLY_INFO), gShellNetwork2HiiHandle, PayLoad, @@ -465,7 +462,7 @@ Ping6OnEchoReplyReceived6 ( Status = Private->Ip6->Receive (Private->Ip6, RxToken); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_IP6_RECEIVE), gShellNetwork2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING6_IP6_RECEIVE), gShellNetwork2HiiHandle, Status); Private->Status = EFI_ABORTED; } } else { @@ -655,7 +652,7 @@ Ping6OnReceiveEchoReply ( Status = Private->Ip6->Receive (Private->Ip6, &Private->RxToken); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_IP6_RECEIVE), gShellNetwork2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING6_IP6_RECEIVE), gShellNetwork2HiiHandle, Status); } return Status; @@ -691,7 +688,7 @@ Ping6OnTimerRoutine6 ( Status = Ping6SendEchoRequest (Private); if (Private->TxCount != 0) { if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_SEND_REQUEST), gShellNetwork2HiiHandle, Private->TxCount + 1); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING6_SEND_REQUEST), gShellNetwork2HiiHandle, Private->TxCount + 1); } } } @@ -714,7 +711,7 @@ Ping6OnTimerRoutine6 ( // // Remove the timeout icmp6 echo request from list. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_TIMEOUT), gShellNetwork2HiiHandle, TxInfo->SequenceNum); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING6_TIMEOUT), gShellNetwork2HiiHandle, TxInfo->SequenceNum); RemoveEntryList (&TxInfo->Link); Ping6DestroyTxInfo (TxInfo); @@ -791,7 +788,7 @@ Ping6CreateIpInstance ( // Source address is required when pinging a link-local address. // if (NetIp6IsLinkLocalAddr (&Private->DstAddress) && UnspecifiedSrc) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_INVALID_SOURCE), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING6_INVALID_SOURCE), gShellNetwork2HiiHandle); Status = EFI_INVALID_PARAMETER; goto ON_ERROR; } @@ -851,7 +848,7 @@ Ping6CreateIpInstance ( ); if (Status != EFI_BUFFER_TOO_SMALL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING6_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); goto ON_ERROR; } @@ -873,7 +870,7 @@ Ping6CreateIpInstance ( ); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING6_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status); goto ON_ERROR; } @@ -915,7 +912,7 @@ Ping6CreateIpInstance ( // if (HandleIndex == HandleNum) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_CONFIGD_NIC_NF), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING6_CONFIGD_NIC_NF), gShellNetwork2HiiHandle); Status = EFI_NOT_FOUND; goto ON_ERROR; } @@ -963,7 +960,7 @@ Ping6CreateIpInstance ( Status = Private->Ip6->Configure (Private->Ip6, &Ip6Config); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_IP6_CONFIG), gShellNetwork2HiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING6_IP6_CONFIG), gShellNetwork2HiiHandle, Status); goto ON_ERROR; } @@ -1051,7 +1048,7 @@ ShellPing6 ( Private = AllocateZeroPool (sizeof (PING6_PRIVATE_DATA)); if (Private == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"Ping6"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"Ping6"); ShellStatus = SHELL_OUT_OF_RESOURCES; goto ON_EXIT; } @@ -1080,7 +1077,7 @@ ShellPing6 ( // // Print the command line itself. // - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_START), gShellNetwork2HiiHandle, mIp6DstString, Private->BufferSize); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING6_START), gShellNetwork2HiiHandle, mIp6DstString, Private->BufferSize); // // Create a ipv6 token to receive the first icmp6 echo reply packet. // @@ -1126,7 +1123,7 @@ ShellPing6 ( if (EFI_ERROR (Status) && (Status != EFI_NOT_READY)) { ShellStatus = SHELL_ACCESS_DENIED; if (Status == EFI_NOT_FOUND) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_NOSOURCE_INDOMAIN), gShellNetwork2HiiHandle, mIp6DstString); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING6_NOSOURCE_INDOMAIN), gShellNetwork2HiiHandle, mIp6DstString); } goto ON_EXIT; @@ -1175,10 +1172,7 @@ ShellPing6 ( gBS->SetTimer (Private->Timer, TimerCancel, 0); if (Private->TxCount != 0) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PING6_STAT), gShellNetwork2HiiHandle, Private->TxCount, @@ -1189,10 +1183,7 @@ ShellPing6 ( } if (Private->RxCount != 0) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PING6_RTT), gShellNetwork2HiiHandle, Private->RttMin, @@ -1276,7 +1267,7 @@ ShellCommandRunPing6 ( Status = ShellCommandLineParseEx (Ping6ParamList, &ParamPackage, &ProblemParam, TRUE, FALSE); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_INVALID_INPUT), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING6_INVALID_INPUT), gShellNetwork2HiiHandle); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1296,7 +1287,7 @@ ShellCommandRunPing6 ( // ShellStrToUintn will return 0 when input is 0 or an invalid input string. // if ((SendNumber == 0) || (SendNumber > PING6_MAX_SEND_NUMBER)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_INVALID_SEND_NUMBER), gShellNetwork2HiiHandle, ValueStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING6_INVALID_SEND_NUMBER), gShellNetwork2HiiHandle, ValueStr); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1314,7 +1305,7 @@ ShellCommandRunPing6 ( // ShellStrToUintn will return 0 when input is 0 or an invalid input string. // if ((BufferSize < 16) || (BufferSize > PING6_MAX_BUFFER_SIZE)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_INVALID_BUFFER_SIZE), gShellNetwork2HiiHandle, ValueStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING6_INVALID_BUFFER_SIZE), gShellNetwork2HiiHandle, ValueStr); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1332,7 +1323,7 @@ ShellCommandRunPing6 ( mIp6SrcString = ValueStr; Status = NetLibStrToIp6 (ValueStrPtr, &SrcAddress); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_INVALID_IP), gShellNetwork2HiiHandle, ValueStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING6_INVALID_IP), gShellNetwork2HiiHandle, ValueStr); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1344,7 +1335,7 @@ ShellCommandRunPing6 ( NonOptionCount = ShellCommandLineGetCount (ParamPackage); ValueStr = ShellCommandLineGetRawValue (ParamPackage, (UINT32)(NonOptionCount-1)); if (NonOptionCount != 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_INVALID_INPUT), gShellNetwork2HiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING6_INVALID_INPUT), gShellNetwork2HiiHandle); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } @@ -1354,7 +1345,7 @@ ShellCommandRunPing6 ( mIp6DstString = ValueStr; Status = NetLibStrToIp6 (ValueStrPtr, &DstAddress); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING6_INVALID_IP), gShellNetwork2HiiHandle, ValueStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PING6_INVALID_IP), gShellNetwork2HiiHandle, ValueStr); ShellStatus = SHELL_INVALID_PARAMETER; goto ON_EXIT; } From c71d0e7153656b3f339c67eba5e2ada6bd164b55 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Thu, 18 Sep 2025 14:10:43 +0200 Subject: [PATCH 0618/1172] PrmPkg: Use the newly introduced ShellPrintHiiDefaultEx() alias Make use the newly introduced ShellPrintHiiDefaultEx() alias and replace wherever it is possible: - "ShellPrintHiiEx (-1, -1, NULL," with: - "ShellPrintHiiDefaultEx (" No functional change is introduced. Signed-off-by: Pierre Gondois --- PrmPkg/Application/PrmInfo/PrmInfo.c | 96 ++++++++++++---------------- 1 file changed, 42 insertions(+), 54 deletions(-) diff --git a/PrmPkg/Application/PrmInfo/PrmInfo.c b/PrmPkg/Application/PrmInfo/PrmInfo.c index d7ce0d03be60..6be240c92a58 100644 --- a/PrmPkg/Application/PrmInfo/PrmInfo.c +++ b/PrmPkg/Application/PrmInfo/PrmInfo.c @@ -127,13 +127,10 @@ PrintMmioRuntimeRangeInfo ( } RuntimeMmioRangeCount = (UINTN)RuntimeMmioRanges->Count; - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_RUNTIME_MMIO_COUNT), mPrmInfoHiiHandle, RuntimeMmioRangeCount); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_RUNTIME_MMIO_COUNT), mPrmInfoHiiHandle, RuntimeMmioRangeCount); for (RuntimeMmioRangeIndex = 0; RuntimeMmioRangeIndex < RuntimeMmioRangeCount; RuntimeMmioRangeIndex++) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PRMINFO_RUNTIME_MMIO_INFO), mPrmInfoHiiHandle, RuntimeMmioRangeIndex, @@ -205,16 +202,13 @@ GatherPrmHandlerInfo ( ASSERT_EFI_ERROR (Status); if (PrintInformation) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PRMINFO_MODULE_NAME), mPrmInfoHiiHandle, (CHAR8 *)((UINTN)CurrentImageAddress + CurrentImageExportDirectory->Name) ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_MODULE_GUID), mPrmInfoHiiHandle, CurrentModuleGuid); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_MODULE_VERSION), mPrmInfoHiiHandle, MajorVersion, MinorVersion); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_MODULE_GUID), mPrmInfoHiiHandle, CurrentModuleGuid); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_MODULE_VERSION), mPrmInfoHiiHandle, MajorVersion, MinorVersion); } // It is currently valid for a PRM module not to use a context buffer @@ -233,11 +227,11 @@ GatherPrmHandlerInfo ( if (CurrentPrmModuleRuntimeMmioRanges != NULL) { PrintMmioRuntimeRangeInfo (CurrentPrmModuleRuntimeMmioRanges); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_NO_MMIO_RANGES), mPrmInfoHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_NO_MMIO_RANGES), mPrmInfoHiiHandle); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_LINE_BREAK), mPrmInfoHiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_HANDLER_COUNT), mPrmInfoHiiHandle, HandlerCount); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_LINE_BREAK), mPrmInfoHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_HANDLER_COUNT), mPrmInfoHiiHandle, HandlerCount); } for (HandlerIndex = 0; HandlerIndex < HandlerCount; HandlerIndex++) { @@ -248,8 +242,8 @@ GatherPrmHandlerInfo ( CurrentHandlerContext.Name = (CHAR8 *)CurrentExportDescriptorStruct->PrmHandlerExportDescriptors[HandlerIndex].PrmHandlerName; if (PrintInformation) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_HANDLER_NAME), mPrmInfoHiiHandle, CurrentHandlerContext.Name); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_HANDLER_GUID), mPrmInfoHiiHandle, CurrentHandlerContext.Guid); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_HANDLER_NAME), mPrmInfoHiiHandle, CurrentHandlerContext.Name); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_HANDLER_GUID), mPrmInfoHiiHandle, CurrentHandlerContext.Guid); } Status = GetExportEntryAddress ( @@ -263,11 +257,11 @@ GatherPrmHandlerInfo ( CurrentHandlerContext.Handler = (PRM_HANDLER *)(UINTN)CurrentHandlerPhysicalAddress; if (PrintInformation) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_HANDLER_PA), mPrmInfoHiiHandle, CurrentHandlerPhysicalAddress); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_HANDLER_PA), mPrmInfoHiiHandle, CurrentHandlerPhysicalAddress); } } else { if (PrintInformation) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_HANDLER_PA_ERROR), mPrmInfoHiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_HANDLER_PA_ERROR), mPrmInfoHiiHandle, Status); } } @@ -282,17 +276,14 @@ GatherPrmHandlerInfo ( if (PrintInformation) { if (CurrentHandlerContext.StaticDataBuffer != NULL) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PRMINFO_STATIC_DATA_BUFFER), mPrmInfoHiiHandle, (UINTN)CurrentHandlerContext.StaticDataBuffer ); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_LINE_BREAK), mPrmInfoHiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_NO_STATIC_BUFFER), mPrmInfoHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_LINE_BREAK), mPrmInfoHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_NO_STATIC_BUFFER), mPrmInfoHiiHandle); } } @@ -391,13 +382,13 @@ PrintExecutionTime ( } if (Sec > 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_SECS), mPrmInfoHiiHandle, Sec, MilliSec, MicroSec, NanoSec); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_SECS), mPrmInfoHiiHandle, Sec, MilliSec, MicroSec, NanoSec); } else if (MilliSec > 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_MILLI_SECS), mPrmInfoHiiHandle, MilliSec, MicroSec, NanoSec); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_MILLI_SECS), mPrmInfoHiiHandle, MilliSec, MicroSec, NanoSec); } else if (MicroSec > 0) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_USECS), mPrmInfoHiiHandle, MicroSec, NanoSec); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_USECS), mPrmInfoHiiHandle, MicroSec, NanoSec); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_NANO_SECS), mPrmInfoHiiHandle, NanoSec); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_NANO_SECS), mPrmInfoHiiHandle, NanoSec); } } @@ -450,17 +441,14 @@ ExecutePrmHandlerByGuid ( HandlerFound = TRUE; Status = PopulateContextBuffer (HandlerContext->StaticDataBuffer, HandlerContext->Guid, &CurrentContextBuffer); if (!EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_LINE_BREAK), mPrmInfoHiiHandle); - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_LINE_BREAK), mPrmInfoHiiHandle); + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PRMINFO_MODULE_NAME), mPrmInfoHiiHandle, HandlerContext->ModuleName ); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_HANDLER_NAME_HL), mPrmInfoHiiHandle, HandlerContext->Name); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_HANDLER_GUID), mPrmInfoHiiHandle, HandlerContext->Guid); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_HANDLER_NAME_HL), mPrmInfoHiiHandle, HandlerContext->Name); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_HANDLER_GUID), mPrmInfoHiiHandle, HandlerContext->Guid); StartTime = 0; EndTime = 0; @@ -474,20 +462,20 @@ ExecutePrmHandlerByGuid ( } if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_HANDLER_ERR_STATUS), mPrmInfoHiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_HANDLER_ERR_STATUS), mPrmInfoHiiHandle, Status); } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_HANDLER_SUCC_STATUS), mPrmInfoHiiHandle, Status); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_HANDLER_SUCC_STATUS), mPrmInfoHiiHandle, Status); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_HANDLER_EXEC_TIME), mPrmInfoHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_HANDLER_EXEC_TIME), mPrmInfoHiiHandle); if ((StartTime == 0) && (EndTime == 0)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_UNKNOWN), mPrmInfoHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_UNKNOWN), mPrmInfoHiiHandle); } else { PrintExecutionTime (GetTimeInNanoSecond (EndTime - StartTime)); } - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_LINE_BREAK), mPrmInfoHiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_LINE_BREAK), mPrmInfoHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_LINE_BREAK), mPrmInfoHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_LINE_BREAK), mPrmInfoHiiHandle); } else { DEBUG (( DEBUG_ERROR, @@ -546,7 +534,7 @@ ParseParameterList ( Status = ShellCommandLineParseEx (mParamList, &Package, &ProblemParam, FALSE, FALSE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_GEN_PROBLEM), mPrmInfoHiiHandle, APPLICATION_NAME, ProblemParam); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_GEN_PROBLEM), mPrmInfoHiiHandle, APPLICATION_NAME, ProblemParam); ReturnStatus = EFI_INVALID_PARAMETER; FreePool (ProblemParam); } else { @@ -556,7 +544,7 @@ ParseParameterList ( goto Done; } else if (Package == NULL) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_NO_ARG), mPrmInfoHiiHandle, APPLICATION_NAME); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_NO_ARG), mPrmInfoHiiHandle, APPLICATION_NAME); ReturnStatus = EFI_INVALID_PARAMETER; goto Done; } @@ -573,13 +561,13 @@ ParseParameterList ( } if (ArgumentCount == 1) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_NO_ARG), mPrmInfoHiiHandle, APPLICATION_NAME); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_NO_ARG), mPrmInfoHiiHandle, APPLICATION_NAME); ReturnStatus = EFI_INVALID_PARAMETER; goto Done; } if (ArgumentCount > 6) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_TOO_MANY), mPrmInfoHiiHandle, APPLICATION_NAME); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_TOO_MANY), mPrmInfoHiiHandle, APPLICATION_NAME); ReturnStatus = EFI_INVALID_PARAMETER; goto Done; } @@ -589,7 +577,7 @@ ParseParameterList ( // if (ShellCommandLineGetFlag (Package, L"-b")) { if (ArgumentCount <= 2) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_PARAM_INV), mPrmInfoHiiHandle, APPLICATION_NAME, L"-b"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_PARAM_INV), mPrmInfoHiiHandle, APPLICATION_NAME, L"-b"); ReturnStatus = EFI_INVALID_PARAMETER; goto Done; } else { @@ -609,13 +597,13 @@ ParseParameterList ( } else { Status = StrToGuid (HandlerGuidStr, &HandlerGuid); if (EFI_ERROR (Status) || (HandlerGuidStr[GUID_STRING_LENGTH] != L'\0')) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_GUID_INV), mPrmInfoHiiHandle, APPLICATION_NAME, HandlerGuidStr); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_GUID_INV), mPrmInfoHiiHandle, APPLICATION_NAME, HandlerGuidStr); ReturnStatus = EFI_INVALID_PARAMETER; goto Done; } } } else { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_NO_VALUE), mPrmInfoHiiHandle, APPLICATION_NAME, L"-t"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_NO_VALUE), mPrmInfoHiiHandle, APPLICATION_NAME, L"-t"); ReturnStatus = EFI_INVALID_PARAMETER; goto Done; } @@ -623,7 +611,7 @@ ParseParameterList ( Status = DiscoverPrmModules (&mPrmModuleCount, &mPrmHandlerCount); if (EFI_ERROR (Status)) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_DISCOVERY_FAILED), mPrmInfoHiiHandle, APPLICATION_NAME); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_DISCOVERY_FAILED), mPrmInfoHiiHandle, APPLICATION_NAME); DEBUG (( DEBUG_ERROR, "%a - %a: An error occurred during PRM module discovery (%r)\n", @@ -636,10 +624,10 @@ ParseParameterList ( } if (PrintHandlerInfo) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_LIST_TITLE), mPrmInfoHiiHandle); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_MODULES_FOUND), mPrmInfoHiiHandle, mPrmModuleCount); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_HANDLERS_FOUND), mPrmInfoHiiHandle, mPrmHandlerCount); - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_LINE_BREAK), mPrmInfoHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_LIST_TITLE), mPrmInfoHiiHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_MODULES_FOUND), mPrmInfoHiiHandle, mPrmModuleCount); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_HANDLERS_FOUND), mPrmInfoHiiHandle, mPrmHandlerCount); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_LINE_BREAK), mPrmInfoHiiHandle); } GatherPrmHandlerInfo (PrintHandlerInfo); @@ -647,7 +635,7 @@ ParseParameterList ( if (HandlerGuidStr != NULL) { Status = ExecutePrmHandlerByGuid (&HandlerGuid); if (Status == EFI_NOT_FOUND) { - ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PRMINFO_HANDLER_NOT_FOUND), mPrmInfoHiiHandle, APPLICATION_NAME, HandlerGuid); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PRMINFO_HANDLER_NOT_FOUND), mPrmInfoHiiHandle, APPLICATION_NAME, HandlerGuid); } } From 9ff74659a8ca73cad7c5c1e32823aad9396ac1be Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Thu, 18 Sep 2025 14:10:49 +0200 Subject: [PATCH 0619/1172] OvmfPkg: Use the newly introduced ShellPrintHiiDefaultEx() alias Make use the newly introduced ShellPrintHiiDefaultEx() alias and replace wherever it is possible: - "ShellPrintHiiEx (-1, -1, NULL," with: - "ShellPrintHiiDefaultEx (" No functional change is introduced. Signed-off-by: Pierre Gondois --- .../LinuxInitrdDynamicShellCommand.c | 30 ++++--------------- 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.c b/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.c index 2edd92c7545c..ab4a827abee6 100644 --- a/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.c +++ b/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.c @@ -266,10 +266,7 @@ RunInitrd ( Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR (Status)) { if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PROBLEM), mLinuxInitrdShellCommandHiiHandle, L"initrd", @@ -281,10 +278,7 @@ RunInitrd ( ASSERT (FALSE); } } else if (IsOtherInitrdDevicePathAlreadyInstalled ()) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_ALREADY_INSTALLED), mLinuxInitrdShellCommandHiiHandle, L"initrd" @@ -292,10 +286,7 @@ RunInitrd ( ShellStatus = SHELL_UNSUPPORTED; } else { if (ShellCommandLineGetCount (Package) > 2) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_TOO_MANY), mLinuxInitrdShellCommandHiiHandle, L"initrd" @@ -306,10 +297,7 @@ RunInitrd ( FreeInitrdFile (); UninstallLoadFile2Protocol (); } else { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_TOO_FEW), mLinuxInitrdShellCommandHiiHandle, L"initrd" @@ -322,10 +310,7 @@ RunInitrd ( Filename = ShellFindFilePath (Param); if (Filename == NULL) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_FIND_FAIL), mLinuxInitrdShellCommandHiiHandle, L"initrd", @@ -346,10 +331,7 @@ RunInitrd ( } if (EFI_ERROR (Status)) { - ShellPrintHiiEx ( - -1, - -1, - NULL, + ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), mLinuxInitrdShellCommandHiiHandle, L"initrd", From aa29d51637d75aaf398fc8bda60af9726690615c Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Thu, 18 Sep 2025 14:13:00 +0200 Subject: [PATCH 0620/1172] ShellPkg: Use the newly introduced ShellPrintDefaultEx() alias Make use the newly introduced ShellPrintDefaultEx() alias and replace wherever it is possible: - "ShellPrintEx (-1, -1," with: - "ShellPrintDefaultEx (" No functional change is introduced. Signed-off-by: Pierre Gondois --- .../Application/Shell/FileHandleWrappers.c | 4 +- ShellPkg/Application/Shell/Shell.c | 2 +- .../DynamicCommand/HttpDynamicCommand/Http.c | 10 +- .../DynamicCommand/TftpDynamicCommand/Tftp.c | 6 +- .../UefiShellCommandLib/UefiShellCommandLib.c | 2 +- .../Library/UefiShellDebug1CommandsLib/Comp.c | 12 +- .../Library/UefiShellDebug1CommandsLib/Dblk.c | 2 +- .../UefiShellDebug1CommandsLib/EditTitleBar.c | 20 +- .../HexEdit/HexEdit.c | 2 +- .../Library/UefiShellDebug1CommandsLib/Mm.c | 6 +- .../Library/UefiShellDebug1CommandsLib/Pci.c | 456 ++++++------------ .../UefiShellDebug1CommandsLib/SetVar.c | 4 +- .../SmbiosView/PrintInfo.c | 152 +++--- .../SmbiosView/SmbiosView.c | 36 +- .../UefiShellDriver1CommandsLib/DevTree.c | 4 +- .../UefiShellDriver1CommandsLib/Drivers.c | 8 +- .../UefiShellDriver1CommandsLib/DrvDiag.c | 2 +- .../UefiShellDriver1CommandsLib/OpenInfo.c | 2 +- .../UefiShellDriver1CommandsLib/Unload.c | 2 +- .../Library/UefiShellLevel2CommandsLib/Cp.c | 4 +- .../Library/UefiShellLevel2CommandsLib/Mv.c | 4 +- .../UefiShellLevel2CommandsLib/Parse.c | 2 +- .../UefiShellLevel2CommandsLib/Reset.c | 2 +- .../Library/UefiShellLevel3CommandsLib/Echo.c | 2 +- .../Library/UefiShellLevel3CommandsLib/Type.c | 10 +- .../Library/UefiShellLevel3CommandsLib/Ver.c | 2 +- ShellPkg/Library/UefiShellLib/UefiShellLib.c | 30 +- 27 files changed, 299 insertions(+), 489 deletions(-) diff --git a/ShellPkg/Application/Shell/FileHandleWrappers.c b/ShellPkg/Application/Shell/FileHandleWrappers.c index f98d86a16f3d..b3a3cfcf9574 100644 --- a/ShellPkg/Application/Shell/FileHandleWrappers.c +++ b/ShellPkg/Application/Shell/FileHandleWrappers.c @@ -1492,7 +1492,7 @@ PrintCommandHistory ( UINTN LineNumber; UINTN LineCount; - ShellPrintEx (-1, -1, L"\n"); + ShellPrintDefaultEx (L"\n"); Index = 0; LineNumber = 0; // @@ -1516,7 +1516,7 @@ PrintCommandHistory ( LineNumber = 0; } - ShellPrintEx (-1, -1, L"%2d. %s\n", Index, Node->Buffer); + ShellPrintDefaultEx (L"%2d. %s\n", Index, Node->Buffer); LineNumber += LineCount; } } diff --git a/ShellPkg/Application/Shell/Shell.c b/ShellPkg/Application/Shell/Shell.c index 74573faba20c..e2dd95b3c47e 100644 --- a/ShellPkg/Application/Shell/Shell.c +++ b/ShellPkg/Application/Shell/Shell.c @@ -3168,7 +3168,7 @@ RunScriptFileHandle ( ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SHELL_SHELL), ShellInfoObject.HiiHandle); } - ShellPrintEx (-1, -1, L"%s\r\n", CommandLine2); + ShellPrintDefaultEx (L"%s\r\n", CommandLine2); } Status = RunCommand (CommandLine3); diff --git a/ShellPkg/DynamicCommand/HttpDynamicCommand/Http.c b/ShellPkg/DynamicCommand/HttpDynamicCommand/Http.c index d67f9af3b715..735e463a14b2 100644 --- a/ShellPkg/DynamicCommand/HttpDynamicCommand/Http.c +++ b/ShellPkg/DynamicCommand/HttpDynamicCommand/Http.c @@ -1216,7 +1216,7 @@ SavePortion ( } if (Context->ContentDownloaded == 0) { - ShellPrintEx (-1, -1, L"%s 0 Kb", HTTP_PROGR_FRAME); + ShellPrintDefaultEx (L"%s 0 Kb", HTTP_PROGR_FRAME); } Context->ContentDownloaded += DownloadLen; @@ -1237,14 +1237,14 @@ SavePortion ( // // Update downloaded size, there is no length info available. // - ShellPrintEx (-1, -1, L"%s", HTTP_KB); - ShellPrintEx (-1, -1, L"%7d Kb", NbOfKb); + ShellPrintDefaultEx (L"%s", HTTP_KB); + ShellPrintDefaultEx (L"%7d Kb", NbOfKb); } return EFI_SUCCESS; } - ShellPrintEx (-1, -1, L"%s", HTTP_PROGRESS_DEL); + ShellPrintDefaultEx (L"%s", HTTP_PROGRESS_DEL); Status = StrCpyS (Progress, HTTP_PROGRESS_MESSAGE_SIZE, HTTP_PROGR_FRAME); if (EFI_ERROR (Status)) { @@ -1266,7 +1266,7 @@ SavePortion ( NbOfKb ); - ShellPrintEx (-1, -1, L"%s", Progress); + ShellPrintDefaultEx (L"%s", Progress); return EFI_SUCCESS; } diff --git a/ShellPkg/DynamicCommand/TftpDynamicCommand/Tftp.c b/ShellPkg/DynamicCommand/TftpDynamicCommand/Tftp.c index b4789e5ab302..66a84648f14a 100644 --- a/ShellPkg/DynamicCommand/TftpDynamicCommand/Tftp.c +++ b/ShellPkg/DynamicCommand/TftpDynamicCommand/Tftp.c @@ -1102,7 +1102,7 @@ CheckPacket ( } if (Context->DownloadedNbOfBytes == 0) { - ShellPrintEx (-1, -1, L"%s 0 Kb", mTftpProgressFrame); + ShellPrintDefaultEx (L"%s 0 Kb", mTftpProgressFrame); } Context->DownloadedNbOfBytes += DownloadLen; @@ -1116,7 +1116,7 @@ CheckPacket ( return EFI_SUCCESS; } - ShellPrintEx (-1, -1, L"%s", mTftpProgressDelete); + ShellPrintDefaultEx (L"%s", mTftpProgressDelete); Status = StrCpyS (Progress, TFTP_PROGRESS_MESSAGE_SIZE, mTftpProgressFrame); if (EFI_ERROR (Status)) { @@ -1137,7 +1137,7 @@ CheckPacket ( ); Context->LastReportedNbOfBytes = Context->DownloadedNbOfBytes; - ShellPrintEx (-1, -1, L"%s", Progress); + ShellPrintDefaultEx (L"%s", Progress); return EFI_SUCCESS; } diff --git a/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c b/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c index 44c2ed91fcb3..ba85efcb7fa1 100644 --- a/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c +++ b/ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.c @@ -1978,7 +1978,7 @@ DumpHex ( Val[Index * 3] = 0; Str[Index] = 0; - ShellPrintEx (-1, -1, L"%*a%08X: %-48a *%a*\r\n", Indent, "", Offset, Val, Str); + ShellPrintDefaultEx (L"%*a%08X: %-48a *%a*\r\n", Indent, "", Offset, Val, Str); Data += Size; Offset += Size; diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Comp.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Comp.c index 3d8eae957c03..5a03b7ccea25 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Comp.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Comp.c @@ -54,36 +54,36 @@ PrintDifferentPoint ( { UINTN Index; - ShellPrintEx (-1, -1, L"%s: %s\r\n %08x:", FileTag, FileName, Address); + ShellPrintDefaultEx (L"%s: %s\r\n %08x:", FileTag, FileName, Address); // // Print data in hex-format. // for (Index = 0; Index < BufferSize; Index++) { - ShellPrintEx (-1, -1, L" %02x", Buffer[Index]); + ShellPrintDefaultEx (L" %02x", Buffer[Index]); } if (BufferSize < DifferentBytes) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_COMP_END_OF_FILE), gShellDebug1HiiHandle); } - ShellPrintEx (-1, -1, L" *"); + ShellPrintDefaultEx (L" *"); // // Print data in char-format. // for (Index = 0; Index < BufferSize; Index++) { if ((Buffer[Index] >= 0x20) && (Buffer[Index] <= 0x7E)) { - ShellPrintEx (-1, -1, L"%c", Buffer[Index]); + ShellPrintDefaultEx (L"%c", Buffer[Index]); } else { // // Print dots for control characters // - ShellPrintEx (-1, -1, L"."); + ShellPrintDefaultEx (L"."); } } - ShellPrintEx (-1, -1, L"*\r\n"); + ShellPrintDefaultEx (L"*\r\n"); } /** diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dblk.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dblk.c index 6c2ffa707ffd..c0543ff9a1f5 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Dblk.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Dblk.c @@ -55,7 +55,7 @@ DisplayTheBlocks ( OriginalBuffer = AllocateZeroPool (BufferSize + BlockIo->Media->IoAlign); Buffer = ALIGN_POINTER (OriginalBuffer, BlockIo->Media->IoAlign); } else { - ShellPrintEx (-1, -1, L" BlockSize: 0x%08x, BlockCount: 0x%08x\r\n", BlockIo->Media->BlockSize, BlockCount); + ShellPrintDefaultEx (L" BlockSize: 0x%08x, BlockCount: 0x%08x\r\n", BlockIo->Media->BlockSize, BlockCount); OriginalBuffer = NULL; Buffer = NULL; } diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/EditTitleBar.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/EditTitleBar.c index 663a872dc2ad..a0c5adc7b299 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/EditTitleBar.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/EditTitleBar.c @@ -143,19 +143,19 @@ MainTitleBarRefresh ( // the space for file name is 20 characters // if (StrLen (FileNameTmp) <= 20) { - ShellPrintEx (-1, -1, L"%s ", FileNameTmp); + ShellPrintDefaultEx (L"%s ", FileNameTmp); for (TempInteger = StrLen (FileNameTmp); TempInteger < 20; TempInteger++) { - ShellPrintEx (-1, -1, L" "); + ShellPrintDefaultEx (L" "); } } else { for (TempInteger = 0; TempInteger < 17; TempInteger++) { - ShellPrintEx (-1, -1, L"%c", FileNameTmp[TempInteger]); + ShellPrintDefaultEx (L"%c", FileNameTmp[TempInteger]); } // // print "..." // - ShellPrintEx (-1, -1, L"... "); + ShellPrintDefaultEx (L"... "); } // @@ -165,18 +165,18 @@ MainTitleBarRefresh ( case FileTypeAscii: case FileTypeUnicode: if (FileType == FileTypeAscii) { - ShellPrintEx (-1, -1, L" ASCII "); + ShellPrintDefaultEx (L" ASCII "); } else { - ShellPrintEx (-1, -1, L" UNICODE "); + ShellPrintDefaultEx (L" UNICODE "); } // // print read-only field for text files // if (ReadOnly) { - ShellPrintEx (-1, -1, L"ReadOnly "); + ShellPrintDefaultEx (L"ReadOnly "); } else { - ShellPrintEx (-1, -1, L" "); + ShellPrintDefaultEx (L" "); } break; @@ -185,7 +185,7 @@ MainTitleBarRefresh ( // // Print the offset. // - ShellPrintEx (-1, -1, L"Offset %X | Size %X", Offset, Size); + ShellPrintDefaultEx (L"Offset %X | Size %X", Offset, Size); case FileTypeFileBuffer: break; default: @@ -196,7 +196,7 @@ MainTitleBarRefresh ( // print modified field // if (Modified) { - ShellPrintEx (-1, -1, L"Modified"); + ShellPrintDefaultEx (L"Modified"); } // diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/HexEdit.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/HexEdit.c index cc4dcf9f1b60..7385ccf88e83 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/HexEdit.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/HexEdit.c @@ -257,7 +257,7 @@ ShellCommandRunHexEdit ( // // print out the status string // - ShellPrintEx (-1, -1, L"%s", Buffer); + ShellPrintDefaultEx (L"%s", Buffer); } else { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HEXEDIT_UNKNOWN_EDITOR), gShellDebug1HiiHandle); } diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Mm.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Mm.c index 2315457a0af2..f021f05479b4 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Mm.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Mm.c @@ -611,7 +611,7 @@ ShellCommandRunMm ( } ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MM_BUF), gShellDebug1HiiHandle, Size * 2, Buffer & mShellMmMaxNumber[Size]); - ShellPrintEx (-1, -1, L"\r\n"); + ShellPrintDefaultEx (L"\r\n"); goto Done; } @@ -624,7 +624,7 @@ ShellCommandRunMm ( ShellPrintHiiDefaultEx (mShellMmAccessTypeStr[AccessType], gShellDebug1HiiHandle); ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MM_ADDRESS), gShellDebug1HiiHandle, Address); ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MM_BUF), gShellDebug1HiiHandle, Size * 2, Buffer & mShellMmMaxNumber[Size]); - ShellPrintEx (-1, -1, L" > "); + ShellPrintDefaultEx (L" > "); // // wait user input to modify // @@ -658,7 +658,7 @@ ShellCommandRunMm ( } Address += Size; - ShellPrintEx (-1, -1, L"\r\n"); + ShellPrintDefaultEx (L"\r\n"); } while (!Complete); } diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c index e15bfbd42401..12c9a5b2276c 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c @@ -1815,9 +1815,7 @@ PciPrintClassCode ( // // Print base class, sub class, and programming inferface name // - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L"%s - %s - %s", ClassStrings.BaseClass, ClassStrings.SubClass, @@ -1827,9 +1825,7 @@ PciPrintClassCode ( // // Only print base class and sub class name // - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L"%s - %s", ClassStrings.BaseClass, ClassStrings.SubClass @@ -2884,7 +2880,7 @@ ShellCommandRunPci ( SizeOfHeader = sizeof (ConfigSpace.Common) + sizeof (ConfigSpace.NonCommon); DumpHex (2, 0, SizeOfHeader, &ConfigSpace); - ShellPrintEx (-1, -1, L"\r\n"); + ShellPrintDefaultEx (L"\r\n"); // // Dump device dependent Part of configuration space @@ -2920,7 +2916,7 @@ ShellCommandRunPci ( // // Print the PciEx extend space in raw bytes ( 0xFF-0xFFF) // - ShellPrintEx (-1, -1, L"\r\n%HStart dumping PCIex extended configuration space (0x100 - 0xFFF).%N\r\n\r\n"); + ShellPrintDefaultEx (L"\r\n%HStart dumping PCIex extended configuration space (0x100 - 0xFFF).%N\r\n\r\n"); DumpHex ( 2, @@ -3154,7 +3150,7 @@ PciExplainPci ( Common = &(ConfigSpace->Common); - ShellPrintEx (-1, -1, L"\r\n"); + ShellPrintDefaultEx (L"\r\n"); // // Print Vendor Id and Device Id @@ -3181,7 +3177,7 @@ PciExplainPci ( // // Print register Revision ID // - ShellPrintEx (-1, -1, L"\r\n"); + ShellPrintDefaultEx (L"\r\n"); ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI_LINE_RID), gShellDebug1HiiHandle, @@ -3259,7 +3255,7 @@ PciExplainPci ( // ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_CLASS), gShellDebug1HiiHandle); PciPrintClassCode ((UINT8 *)Common->ClassCode, TRUE); - ShellPrintEx (-1, -1, L"\r\n"); + ShellPrintDefaultEx (L"\r\n"); } /** @@ -3300,7 +3296,7 @@ PciExplainDeviceData ( if (!BarExist) { BarExist = TRUE; ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_START_TYPE), gShellDebug1HiiHandle); - ShellPrintEx (-1, -1, L" --------------------------------------------------------------------------"); + ShellPrintDefaultEx (L" --------------------------------------------------------------------------"); } Status = PciExplainBar ( @@ -3319,7 +3315,7 @@ PciExplainDeviceData ( if (!BarExist) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_NONE), gShellDebug1HiiHandle); } else { - ShellPrintEx (-1, -1, L"\r\n --------------------------------------------------------------------------"); + ShellPrintDefaultEx (L"\r\n --------------------------------------------------------------------------"); } // @@ -3450,7 +3446,7 @@ PciExplainBridgeData ( if (!BarExist) { BarExist = TRUE; ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_START_TYPE_2), gShellDebug1HiiHandle); - ShellPrintEx (-1, -1, L" --------------------------------------------------------------------------"); + ShellPrintDefaultEx (L" --------------------------------------------------------------------------"); } Status = PciExplainBar ( @@ -3469,7 +3465,7 @@ PciExplainBridgeData ( if (!BarExist) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_NONE), gShellDebug1HiiHandle); } else { - ShellPrintEx (-1, -1, L"\r\n --------------------------------------------------------------------------"); + ShellPrintDefaultEx (L"\r\n --------------------------------------------------------------------------"); } // @@ -3497,7 +3493,7 @@ PciExplainBridgeData ( INDEX_OF (&(Bridge->SubordinateBus)) ); - ShellPrintEx (-1, -1, L" ------------------------------------------------------\r\n"); + ShellPrintDefaultEx (L" ------------------------------------------------------\r\n"); ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_BRIDGE), gShellDebug1HiiHandle, Bridge->PrimaryBus); ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_BRIDGE), gShellDebug1HiiHandle, Bridge->SecondaryBus); @@ -3524,7 +3520,7 @@ PciExplainBridgeData ( // base and limit address are listed. // ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_RESOURCE_TYPE), gShellDebug1HiiHandle); - ShellPrintEx (-1, -1, L"----------------------------------------------------------------------\r\n"); + ShellPrintDefaultEx (L"----------------------------------------------------------------------\r\n"); // // IO Base & Limit @@ -3689,7 +3685,7 @@ PciExplainBar ( // IsMem = FALSE; ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_ONE_VAR_4), gShellDebug1HiiHandle, *Bar & 0xfffffffc); - ShellPrintEx (-1, -1, L"I/O "); + ShellPrintDefaultEx (L"I/O "); } // @@ -3760,7 +3756,7 @@ PciExplainBar ( } else { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_RSHIFT), gShellDebug1HiiHandle, (UINT32)RShiftU64 (NewBar64, 32)); ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_RSHIFT), gShellDebug1HiiHandle, (UINT32)NewBar64); - ShellPrintEx (-1, -1, L" "); + ShellPrintDefaultEx (L" "); ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_RSHIFT), gShellDebug1HiiHandle, @@ -3819,7 +3815,7 @@ PciExplainCardBusData ( INDEX_OF (&(CardBus->SubordinateBusNumber)) ); - ShellPrintEx (-1, -1, L" ------------------------------------------------------\r\n"); + ShellPrintDefaultEx (L" ------------------------------------------------------\r\n"); ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_CARDBUS), gShellDebug1HiiHandle, CardBus->PciBusNumber); ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_CARDBUS_2), gShellDebug1HiiHandle, CardBus->CardBusBusNumber); @@ -3839,7 +3835,7 @@ PciExplainCardBusData ( // Print Memory/Io ranges this cardbus bridge forwards // ShellPrintHiiDefaultEx (STRING_TOKEN (STR_PCI2_RESOURCE_TYPE_2), gShellDebug1HiiHandle); - ShellPrintEx (-1, -1, L"----------------------------------------------------------------------\r\n"); + ShellPrintDefaultEx (L"----------------------------------------------------------------------\r\n"); ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_PCI2_MEM_3), @@ -4274,9 +4270,7 @@ ExplainPcieCapReg ( { CHAR16 *DevicePortType; - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Capability Version(3:0): %E0x%04x%N\r\n", PciExpressCap->Capability.Bits.Version ); @@ -4286,9 +4280,7 @@ ExplainPcieCapReg ( DevicePortType = L"Unknown Type"; } - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Device/PortType(7:4): %E%s%N\r\n", DevicePortType ); @@ -4300,17 +4292,13 @@ ExplainPcieCapReg ( if ((PciExpressCap->Capability.Bits.DevicePortType == PCIE_DEVICE_PORT_TYPE_ROOT_PORT) || (PciExpressCap->Capability.Bits.DevicePortType == PCIE_DEVICE_PORT_TYPE_DOWNSTREAM_PORT)) { - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Slot Implemented(8): %E%d%N\r\n", PciExpressCap->Capability.Bits.SlotImplemented ); } - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Interrupt Message Number(13:9): %E0x%05x%N\r\n", PciExpressCap->Capability.Bits.InterruptMessageNumber ); @@ -4334,22 +4322,18 @@ ExplainPcieDeviceCap ( UINT8 L1Latency; DevicePortType = (UINT8)PciExpressCap->Capability.Bits.DevicePortType; - ShellPrintEx (-1, -1, L" Max_Payload_Size Supported(2:0): "); + ShellPrintDefaultEx (L" Max_Payload_Size Supported(2:0): "); if (PciExpressCap->DeviceCapability.Bits.MaxPayloadSize < 6) { - ShellPrintEx (-1, -1, L"%E%d bytes%N\r\n", 1 << (PciExpressCap->DeviceCapability.Bits.MaxPayloadSize + 7)); + ShellPrintDefaultEx (L"%E%d bytes%N\r\n", 1 << (PciExpressCap->DeviceCapability.Bits.MaxPayloadSize + 7)); } else { - ShellPrintEx (-1, -1, L"%EUnknown%N\r\n"); + ShellPrintDefaultEx (L"%EUnknown%N\r\n"); } - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Phantom Functions Supported(4:3): %E%d%N\r\n", PciExpressCap->DeviceCapability.Bits.PhantomFunctions ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Extended Tag Field Supported(5): %E%d-bit Tag field supported%N\r\n", PciExpressCap->DeviceCapability.Bits.ExtendedTagField ? 8 : 5 ); @@ -4359,28 +4343,26 @@ ExplainPcieDeviceCap ( if (IS_PCIE_ENDPOINT (DevicePortType)) { L0sLatency = (UINT8)PciExpressCap->DeviceCapability.Bits.EndpointL0sAcceptableLatency; L1Latency = (UINT8)PciExpressCap->DeviceCapability.Bits.EndpointL1AcceptableLatency; - ShellPrintEx (-1, -1, L" Endpoint L0s Acceptable Latency(8:6): "); + ShellPrintDefaultEx (L" Endpoint L0s Acceptable Latency(8:6): "); if (L0sLatency < 4) { - ShellPrintEx (-1, -1, L"%EMaximum of %d ns%N\r\n", 1 << (L0sLatency + 6)); + ShellPrintDefaultEx (L"%EMaximum of %d ns%N\r\n", 1 << (L0sLatency + 6)); } else { if (L0sLatency < 7) { - ShellPrintEx (-1, -1, L"%EMaximum of %d us%N\r\n", 1 << (L0sLatency - 3)); + ShellPrintDefaultEx (L"%EMaximum of %d us%N\r\n", 1 << (L0sLatency - 3)); } else { - ShellPrintEx (-1, -1, L"%ENo limit%N\r\n"); + ShellPrintDefaultEx (L"%ENo limit%N\r\n"); } } - ShellPrintEx (-1, -1, L" Endpoint L1 Acceptable Latency(11:9): "); + ShellPrintDefaultEx (L" Endpoint L1 Acceptable Latency(11:9): "); if (L1Latency < 7) { - ShellPrintEx (-1, -1, L"%EMaximum of %d us%N\r\n", 1 << (L1Latency + 1)); + ShellPrintDefaultEx (L"%EMaximum of %d us%N\r\n", 1 << (L1Latency + 1)); } else { - ShellPrintEx (-1, -1, L"%ENo limit%N\r\n"); + ShellPrintDefaultEx (L"%ENo limit%N\r\n"); } } - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Role-based Error Reporting(15): %E%d%N\r\n", PciExpressCap->DeviceCapability.Bits.RoleBasedErrorReporting ); @@ -4390,15 +4372,11 @@ ExplainPcieDeviceCap ( // b) Captured Slot Power Scale // if (DevicePortType == PCIE_DEVICE_PORT_TYPE_UPSTREAM_PORT) { - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Captured Slot Power Limit Value(25:18): %E0x%02x%N\r\n", PciExpressCap->DeviceCapability.Bits.CapturedSlotPowerLimitValue ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Captured Slot Power Limit Scale(27:26): %E%s%N\r\n", SlotPwrLmtScaleTable[PciExpressCap->DeviceCapability.Bits.CapturedSlotPowerLimitScale] ); @@ -4408,9 +4386,7 @@ ExplainPcieDeviceCap ( // Function Level Reset Capability is only valid for Endpoint // if (IS_PCIE_ENDPOINT (DevicePortType)) { - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Function Level Reset Capability(28): %E%d%N\r\n", PciExpressCap->DeviceCapability.Bits.FunctionLevelReset ); @@ -4431,81 +4407,61 @@ ExplainPcieDeviceControl ( IN PCI_CAPABILITY_PCIEXP *PciExpressCap ) { - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Correctable Error Reporting Enable(0): %E%d%N\r\n", PciExpressCap->DeviceControl.Bits.CorrectableError ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Non-Fatal Error Reporting Enable(1): %E%d%N\r\n", PciExpressCap->DeviceControl.Bits.NonFatalError ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Fatal Error Reporting Enable(2): %E%d%N\r\n", PciExpressCap->DeviceControl.Bits.FatalError ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Unsupported Request Reporting Enable(3): %E%d%N\r\n", PciExpressCap->DeviceControl.Bits.UnsupportedRequest ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Enable Relaxed Ordering(4): %E%d%N\r\n", PciExpressCap->DeviceControl.Bits.RelaxedOrdering ); - ShellPrintEx (-1, -1, L" Max_Payload_Size(7:5): "); + ShellPrintDefaultEx (L" Max_Payload_Size(7:5): "); if (PciExpressCap->DeviceControl.Bits.MaxPayloadSize < 6) { - ShellPrintEx (-1, -1, L"%E%d bytes%N\r\n", 1 << (PciExpressCap->DeviceControl.Bits.MaxPayloadSize + 7)); + ShellPrintDefaultEx (L"%E%d bytes%N\r\n", 1 << (PciExpressCap->DeviceControl.Bits.MaxPayloadSize + 7)); } else { - ShellPrintEx (-1, -1, L"%EUnknown%N\r\n"); + ShellPrintDefaultEx (L"%EUnknown%N\r\n"); } - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Extended Tag Field Enable(8): %E%d%N\r\n", PciExpressCap->DeviceControl.Bits.ExtendedTagField ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Phantom Functions Enable(9): %E%d%N\r\n", PciExpressCap->DeviceControl.Bits.PhantomFunctions ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Auxiliary (AUX) Power PM Enable(10): %E%d%N\r\n", PciExpressCap->DeviceControl.Bits.AuxPower ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Enable No Snoop(11): %E%d%N\r\n", PciExpressCap->DeviceControl.Bits.NoSnoop ); - ShellPrintEx (-1, -1, L" Max_Read_Request_Size(14:12): "); + ShellPrintDefaultEx (L" Max_Read_Request_Size(14:12): "); if (PciExpressCap->DeviceControl.Bits.MaxReadRequestSize < 6) { - ShellPrintEx (-1, -1, L"%E%d bytes%N\r\n", 1 << (PciExpressCap->DeviceControl.Bits.MaxReadRequestSize + 7)); + ShellPrintDefaultEx (L"%E%d bytes%N\r\n", 1 << (PciExpressCap->DeviceControl.Bits.MaxReadRequestSize + 7)); } else { - ShellPrintEx (-1, -1, L"%EUnknown%N\r\n"); + ShellPrintDefaultEx (L"%EUnknown%N\r\n"); } // // Read operation is only valid for PCI Express to PCI/PCI-X Bridges // if (PciExpressCap->Capability.Bits.DevicePortType == PCIE_DEVICE_PORT_TYPE_PCIE_TO_PCI_BRIDGE) { - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Bridge Configuration Retry Enable(15): %E%d%N\r\n", PciExpressCap->DeviceControl.Bits.BridgeConfigurationRetryOrFunctionLevelReset ); @@ -4526,39 +4482,27 @@ ExplainPcieDeviceStatus ( IN PCI_CAPABILITY_PCIEXP *PciExpressCap ) { - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Correctable Error Detected(0): %E%d%N\r\n", PciExpressCap->DeviceStatus.Bits.CorrectableError ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Non-Fatal Error Detected(1): %E%d%N\r\n", PciExpressCap->DeviceStatus.Bits.NonFatalError ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Fatal Error Detected(2): %E%d%N\r\n", PciExpressCap->DeviceStatus.Bits.FatalError ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Unsupported Request Detected(3): %E%d%N\r\n", PciExpressCap->DeviceStatus.Bits.UnsupportedRequest ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" AUX Power Detected(4): %E%d%N\r\n", PciExpressCap->DeviceStatus.Bits.AuxPower ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Transactions Pending(5): %E%d%N\r\n", PciExpressCap->DeviceStatus.Bits.TransactionsPending ); @@ -4604,15 +4548,11 @@ ExplainPcieLinkCap ( break; } - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Maximum Link Speed(3:0): %E%s%N\r\n", MaxLinkSpeed ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Maximum Link Width(9:4): %Ex%d%N\r\n", PciExpressCap->LinkCapability.Bits.MaxLinkWidth ); @@ -4634,51 +4574,35 @@ ExplainPcieLinkCap ( break; } - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Active State Power Management Support(11:10): %E%s Supported%N\r\n", AspmValue ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" L0s Exit Latency(14:12): %E%s%N\r\n", L0sLatencyStrTable[PciExpressCap->LinkCapability.Bits.L0sExitLatency] ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" L1 Exit Latency(17:15): %E%s%N\r\n", L1LatencyStrTable[PciExpressCap->LinkCapability.Bits.L1ExitLatency] ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Clock Power Management(18): %E%d%N\r\n", PciExpressCap->LinkCapability.Bits.ClockPowerManagement ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Surprise Down Error Reporting Capable(19): %E%d%N\r\n", PciExpressCap->LinkCapability.Bits.SurpriseDownError ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Data Link Layer Link Active Reporting Capable(20): %E%d%N\r\n", PciExpressCap->LinkCapability.Bits.DataLinkLayerLinkActive ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Link Bandwidth Notification Capability(21): %E%d%N\r\n", PciExpressCap->LinkCapability.Bits.LinkBandwidthNotification ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Port Number(31:24): %E0x%02x%N\r\n", PciExpressCap->LinkCapability.Bits.PortNumber ); @@ -4700,9 +4624,7 @@ ExplainPcieLinkControl ( UINT8 DevicePortType; DevicePortType = (UINT8)PciExpressCap->Capability.Bits.DevicePortType; - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Active State Power Management Control(1:0): %E%s%N\r\n", ASPMCtrlStrTable[PciExpressCap->LinkControl.Bits.AspmControl] ); @@ -4710,9 +4632,7 @@ ExplainPcieLinkControl ( // RCB is not applicable to switches // if (!IS_PCIE_SWITCH (DevicePortType)) { - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Read Completion Boundary (RCB)(3): %E%d byte%N\r\n", 1 << (PciExpressCap->LinkControl.Bits.ReadCompletionBoundary + 6) ); @@ -4728,47 +4648,33 @@ ExplainPcieLinkControl ( (DevicePortType != PCIE_DEVICE_PORT_TYPE_UPSTREAM_PORT) && (DevicePortType != PCIE_DEVICE_PORT_TYPE_PCIE_TO_PCI_BRIDGE)) { - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Link Disable(4): %E%d%N\r\n", PciExpressCap->LinkControl.Bits.LinkDisable ); } - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Common Clock Configuration(6): %E%d%N\r\n", PciExpressCap->LinkControl.Bits.CommonClockConfiguration ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Extended Synch(7): %E%d%N\r\n", PciExpressCap->LinkControl.Bits.ExtendedSynch ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Enable Clock Power Management(8): %E%d%N\r\n", PciExpressCap->LinkControl.Bits.ClockPowerManagement ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Hardware Autonomous Width Disable(9): %E%d%N\r\n", PciExpressCap->LinkControl.Bits.HardwareAutonomousWidthDisable ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Link Bandwidth Management Interrupt Enable(10): %E%d%N\r\n", PciExpressCap->LinkControl.Bits.LinkBandwidthManagementInterrupt ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Link Autonomous Bandwidth Interrupt Enable(11): %E%d%N\r\n", PciExpressCap->LinkControl.Bits.LinkAutonomousBandwidthInterrupt ); @@ -4813,45 +4719,31 @@ ExplainPcieLinkStatus ( break; } - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Current Link Speed(3:0): %E%s%N\r\n", CurLinkSpeed ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Negotiated Link Width(9:4): %Ex%d%N\r\n", PciExpressCap->LinkStatus.Bits.NegotiatedLinkWidth ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Link Training(11): %E%d%N\r\n", PciExpressCap->LinkStatus.Bits.LinkTraining ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Slot Clock Configuration(12): %E%d%N\r\n", PciExpressCap->LinkStatus.Bits.SlotClockConfiguration ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Data Link Layer Link Active(13): %E%d%N\r\n", PciExpressCap->LinkStatus.Bits.DataLinkLayerLinkActive ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Link Bandwidth Management Status(14): %E%d%N\r\n", PciExpressCap->LinkStatus.Bits.LinkBandwidthManagement ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Link Autonomous Bandwidth Status(15): %E%d%N\r\n", PciExpressCap->LinkStatus.Bits.LinkAutonomousBandwidth ); @@ -4870,75 +4762,51 @@ ExplainPcieSlotCap ( IN PCI_CAPABILITY_PCIEXP *PciExpressCap ) { - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Attention Button Present(0): %E%d%N\r\n", PciExpressCap->SlotCapability.Bits.AttentionButton ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Power Controller Present(1): %E%d%N\r\n", PciExpressCap->SlotCapability.Bits.PowerController ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" MRL Sensor Present(2): %E%d%N\r\n", PciExpressCap->SlotCapability.Bits.MrlSensor ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Attention Indicator Present(3): %E%d%N\r\n", PciExpressCap->SlotCapability.Bits.AttentionIndicator ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Power Indicator Present(4): %E%d%N\r\n", PciExpressCap->SlotCapability.Bits.PowerIndicator ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Hot-Plug Surprise(5): %E%d%N\r\n", PciExpressCap->SlotCapability.Bits.HotPlugSurprise ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Hot-Plug Capable(6): %E%d%N\r\n", PciExpressCap->SlotCapability.Bits.HotPlugCapable ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Slot Power Limit Value(14:7): %E0x%02x%N\r\n", PciExpressCap->SlotCapability.Bits.SlotPowerLimitValue ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Slot Power Limit Scale(16:15): %E%s%N\r\n", SlotPwrLmtScaleTable[PciExpressCap->SlotCapability.Bits.SlotPowerLimitScale] ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Electromechanical Interlock Present(17): %E%d%N\r\n", PciExpressCap->SlotCapability.Bits.ElectromechanicalInterlock ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" No Command Completed Support(18): %E%d%N\r\n", PciExpressCap->SlotCapability.Bits.NoCommandCompleted ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Physical Slot Number(31:19): %E%d%N\r\n", PciExpressCap->SlotCapability.Bits.PhysicalSlotNumber ); @@ -4958,73 +4826,53 @@ ExplainPcieSlotControl ( IN PCI_CAPABILITY_PCIEXP *PciExpressCap ) { - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Attention Button Pressed Enable(0): %E%d%N\r\n", PciExpressCap->SlotControl.Bits.AttentionButtonPressed ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Power Fault Detected Enable(1): %E%d%N\r\n", PciExpressCap->SlotControl.Bits.PowerFaultDetected ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" MRL Sensor Changed Enable(2): %E%d%N\r\n", PciExpressCap->SlotControl.Bits.MrlSensorChanged ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Presence Detect Changed Enable(3): %E%d%N\r\n", PciExpressCap->SlotControl.Bits.PresenceDetectChanged ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Command Completed Interrupt Enable(4): %E%d%N\r\n", PciExpressCap->SlotControl.Bits.CommandCompletedInterrupt ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Hot-Plug Interrupt Enable(5): %E%d%N\r\n", PciExpressCap->SlotControl.Bits.HotPlugInterrupt ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Attention Indicator Control(7:6): %E%s%N\r\n", IndicatorTable[ PciExpressCap->SlotControl.Bits.AttentionIndicator] ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Power Indicator Control(9:8): %E%s%N\r\n", IndicatorTable[PciExpressCap->SlotControl.Bits.PowerIndicator] ); - ShellPrintEx (-1, -1, L" Power Controller Control(10): %EPower "); + ShellPrintDefaultEx (L" Power Controller Control(10): %EPower "); if ( PciExpressCap->SlotControl.Bits.PowerController) { - ShellPrintEx (-1, -1, L"Off%N\r\n"); + ShellPrintDefaultEx (L"Off%N\r\n"); } else { - ShellPrintEx (-1, -1, L"On%N\r\n"); + ShellPrintDefaultEx (L"On%N\r\n"); } - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Electromechanical Interlock Control(11): %E%d%N\r\n", PciExpressCap->SlotControl.Bits.ElectromechanicalInterlock ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Data Link Layer State Changed Enable(12): %E%d%N\r\n", PciExpressCap->SlotControl.Bits.DataLinkLayerStateChanged ); @@ -5043,66 +4891,54 @@ ExplainPcieSlotStatus ( IN PCI_CAPABILITY_PCIEXP *PciExpressCap ) { - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Attention Button Pressed(0): %E%d%N\r\n", PciExpressCap->SlotStatus.Bits.AttentionButtonPressed ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Power Fault Detected(1): %E%d%N\r\n", PciExpressCap->SlotStatus.Bits.PowerFaultDetected ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" MRL Sensor Changed(2): %E%d%N\r\n", PciExpressCap->SlotStatus.Bits.MrlSensorChanged ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Presence Detect Changed(3): %E%d%N\r\n", PciExpressCap->SlotStatus.Bits.PresenceDetectChanged ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Command Completed(4): %E%d%N\r\n", PciExpressCap->SlotStatus.Bits.CommandCompleted ); - ShellPrintEx (-1, -1, L" MRL Sensor State(5): %EMRL "); + ShellPrintDefaultEx (L" MRL Sensor State(5): %EMRL "); if ( PciExpressCap->SlotStatus.Bits.MrlSensor) { - ShellPrintEx (-1, -1, L" Opened%N\r\n"); + ShellPrintDefaultEx (L" Opened%N\r\n"); } else { - ShellPrintEx (-1, -1, L" Closed%N\r\n"); + ShellPrintDefaultEx (L" Closed%N\r\n"); } - ShellPrintEx (-1, -1, L" Presence Detect State(6): "); + ShellPrintDefaultEx (L" Presence Detect State(6): "); if ( PciExpressCap->SlotStatus.Bits.PresenceDetect) { - ShellPrintEx (-1, -1, L"%ECard Present in slot%N\r\n"); + ShellPrintDefaultEx (L"%ECard Present in slot%N\r\n"); } else { - ShellPrintEx (-1, -1, L"%ESlot Empty%N\r\n"); + ShellPrintDefaultEx (L"%ESlot Empty%N\r\n"); } - ShellPrintEx (-1, -1, L" Electromechanical Interlock Status(7): %EElectromechanical Interlock "); + ShellPrintDefaultEx (L" Electromechanical Interlock Status(7): %EElectromechanical Interlock "); if ( PciExpressCap->SlotStatus.Bits.ElectromechanicalInterlock) { - ShellPrintEx (-1, -1, L"Engaged%N\r\n"); + ShellPrintDefaultEx (L"Engaged%N\r\n"); } else { - ShellPrintEx (-1, -1, L"Disengaged%N\r\n"); + ShellPrintDefaultEx (L"Disengaged%N\r\n"); } - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" Data Link Layer State Changed(8): %E%d%N\r\n", PciExpressCap->SlotStatus.Bits.DataLinkLayerStateChanged ); @@ -5121,33 +4957,23 @@ ExplainPcieRootControl ( IN PCI_CAPABILITY_PCIEXP *PciExpressCap ) { - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" System Error on Correctable Error Enable(0): %E%d%N\r\n", PciExpressCap->RootControl.Bits.SystemErrorOnCorrectableError ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" System Error on Non-Fatal Error Enable(1): %E%d%N\r\n", PciExpressCap->RootControl.Bits.SystemErrorOnNonFatalError ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" System Error on Fatal Error Enable(2): %E%d%N\r\n", PciExpressCap->RootControl.Bits.SystemErrorOnFatalError ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" PME Interrupt Enable(3): %E%d%N\r\n", PciExpressCap->RootControl.Bits.PmeInterrupt ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" CRS Software Visibility Enable(4): %E%d%N\r\n", PciExpressCap->RootControl.Bits.CrsSoftwareVisibility ); @@ -5167,9 +4993,7 @@ ExplainPcieRootCap ( IN PCI_CAPABILITY_PCIEXP *PciExpressCap ) { - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" CRS Software Visibility(0): %E%d%N\r\n", PciExpressCap->RootCapability.Bits.CrsSoftwareVisibility ); @@ -5189,21 +5013,15 @@ ExplainPcieRootStatus ( IN PCI_CAPABILITY_PCIEXP *PciExpressCap ) { - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" PME Requester ID(15:0): %E0x%04x%N\r\n", PciExpressCap->RootStatus.Bits.PmeRequesterId ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" PME Status(16): %E%d%N\r\n", PciExpressCap->RootStatus.Bits.PmeStatus ); - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L" PME Pending(17): %E%d%N\r\n", PciExpressCap->RootStatus.Bits.PmePending ); @@ -6827,9 +6645,7 @@ PrintPciExtendedCapabilityDetails ( case PCI_EXPRESS_EXTENDED_CAPABILITY_PTM_ID: return PrintInterpretedExtendedCompatibilityPTM (HeaderAddress, HeadersBaseAddress); default: - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( L"Unknown PCIe extended capability ID (%04xh). No interpretation available.\r\n", HeaderAddress->CapabilityId ); @@ -6861,7 +6677,7 @@ PciExplainPciExpress ( DevicePortType = (UINT8)PciExpressCap->Capability.Bits.DevicePortType; - ShellPrintEx (-1, -1, L"\r\nPci Express device capability structure:\r\n"); + ShellPrintDefaultEx (L"\r\nPci Express device capability structure:\r\n"); for (Index = 0; PcieExplainList[Index].Type < PcieExplainTypeMax; Index++) { if (ShellGetExecutionBreakFlag ()) { diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SetVar.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SetVar.c index eeb285417469..61468ec93ae1 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SetVar.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SetVar.c @@ -446,10 +446,10 @@ ShellCommandRunSetVar ( if (!EFI_ERROR (Status) && (Buffer != NULL)) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SETVAR_PRINT), gShellDebug1HiiHandle, &Guid, VariableName, Size); for (LoopVar = 0; LoopVar < Size; LoopVar++) { - ShellPrintEx (-1, -1, L"%02x ", ((UINT8 *)Buffer)[LoopVar]); + ShellPrintDefaultEx (L"%02x ", ((UINT8 *)Buffer)[LoopVar]); } - ShellPrintEx (-1, -1, L"\r\n"); + ShellPrintDefaultEx (L"\r\n"); } else { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SETVAR_ERROR_GET), gShellDebug1HiiHandle, L"setvar", &Guid, VariableName); ShellStatus = SHELL_ACCESS_DENIED; diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c index 1c312ad7fe2f..6d66e475ecbc 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c @@ -315,10 +315,10 @@ SmbiosPrintStructure ( // BIOS Information (Type 0) // case 0: - ShellPrintEx (-1, -1, L"Vendor: %a\n", LibGetSmbiosString (Struct, Struct->Type0->Vendor)); - ShellPrintEx (-1, -1, L"BIOS Version: %a\n", LibGetSmbiosString (Struct, Struct->Type0->BiosVersion)); - ShellPrintEx (-1, -1, L"BIOS Starting Address Segment: 0x%x\n", Struct->Type0->BiosSegment); - ShellPrintEx (-1, -1, L"BIOS Release Date: %a\n", LibGetSmbiosString (Struct, Struct->Type0->BiosReleaseDate)); + ShellPrintDefaultEx (L"Vendor: %a\n", LibGetSmbiosString (Struct, Struct->Type0->Vendor)); + ShellPrintDefaultEx (L"BIOS Version: %a\n", LibGetSmbiosString (Struct, Struct->Type0->BiosVersion)); + ShellPrintDefaultEx (L"BIOS Starting Address Segment: 0x%x\n", Struct->Type0->BiosSegment); + ShellPrintDefaultEx (L"BIOS Release Date: %a\n", LibGetSmbiosString (Struct, Struct->Type0->BiosReleaseDate)); if ((Struct->Type0->BiosSize != 0xFF) || !(AE_SMBIOS_VERSION (0x3, 0x1))) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_BIOS_SIZE), gShellDebug1HiiHandle, 64 * (Struct->Type0->BiosSize + 1)); } @@ -334,10 +334,10 @@ SmbiosPrintStructure ( } if (AE_SMBIOS_VERSION (0x2, 0x4) && (Struct->Hdr->Length > 0x14)) { - ShellPrintEx (-1, -1, L"System BIOS Major Release: %u\n", Struct->Type0->SystemBiosMajorRelease); - ShellPrintEx (-1, -1, L"System BIOS Minor Release: %u\n", Struct->Type0->SystemBiosMinorRelease); - ShellPrintEx (-1, -1, L"Embedded Controller Firmware Major Release: %u\n", Struct->Type0->EmbeddedControllerFirmwareMajorRelease); - ShellPrintEx (-1, -1, L"Embedded Controller Firmware Minor Release: %u\n", Struct->Type0->EmbeddedControllerFirmwareMinorRelease); + ShellPrintDefaultEx (L"System BIOS Major Release: %u\n", Struct->Type0->SystemBiosMajorRelease); + ShellPrintDefaultEx (L"System BIOS Minor Release: %u\n", Struct->Type0->SystemBiosMinorRelease); + ShellPrintDefaultEx (L"Embedded Controller Firmware Major Release: %u\n", Struct->Type0->EmbeddedControllerFirmwareMajorRelease); + ShellPrintDefaultEx (L"Embedded Controller Firmware Minor Release: %u\n", Struct->Type0->EmbeddedControllerFirmwareMinorRelease); } if (AE_SMBIOS_VERSION (0x3, 0x1) && (Struct->Hdr->Length > 0x18)) { @@ -449,33 +449,33 @@ SmbiosPrintStructure ( // Processor Information (Type 4) // case 4: - ShellPrintEx (-1, -1, L"Socket Designation: %a\n", LibGetSmbiosString (Struct, Struct->Type4->Socket)); + ShellPrintDefaultEx (L"Socket Designation: %a\n", LibGetSmbiosString (Struct, Struct->Type4->Socket)); DisplayProcessorType (Struct->Type4->ProcessorType, Option); ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PROCESSOR_FAMILY), gShellDebug1HiiHandle); DisplayProcessorFamily (Struct->Type4->ProcessorFamily, Option); - ShellPrintEx (-1, -1, L"Processor Manufacturer: %a\n", LibGetSmbiosString (Struct, Struct->Type4->ProcessorManufacturer)); + ShellPrintDefaultEx (L"Processor Manufacturer: %a\n", LibGetSmbiosString (Struct, Struct->Type4->ProcessorManufacturer)); ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_PROCESSOR_ID), gShellDebug1HiiHandle, 8); DumpHex (0, 0, 8, &(Struct->Type4->ProcessorId)); - ShellPrintEx (-1, -1, L"Processor Version: %a\n", LibGetSmbiosString (Struct, Struct->Type4->ProcessorVersion)); + ShellPrintDefaultEx (L"Processor Version: %a\n", LibGetSmbiosString (Struct, Struct->Type4->ProcessorVersion)); DisplayProcessorVoltage (*(UINT8 *)&(Struct->Type4->Voltage), Option); - ShellPrintEx (-1, -1, L"External Clock: %u\n", Struct->Type4->ExternalClock); - ShellPrintEx (-1, -1, L"Max Speed: %u\n", Struct->Type4->MaxSpeed); - ShellPrintEx (-1, -1, L"Current Speed: %u\n", Struct->Type4->CurrentSpeed); + ShellPrintDefaultEx (L"External Clock: %u\n", Struct->Type4->ExternalClock); + ShellPrintDefaultEx (L"Max Speed: %u\n", Struct->Type4->MaxSpeed); + ShellPrintDefaultEx (L"Current Speed: %u\n", Struct->Type4->CurrentSpeed); DisplayProcessorStatus (Struct->Type4->Status, Option); DisplayProcessorUpgrade (Struct->Type4->ProcessorUpgrade, Option); - ShellPrintEx (-1, -1, L"L1 Cache Handle: 0x%x\n", Struct->Type4->L1CacheHandle); - ShellPrintEx (-1, -1, L"L2 Cache Handle: 0x%x\n", Struct->Type4->L2CacheHandle); - ShellPrintEx (-1, -1, L"L3 Cache Handle: 0x%x\n", Struct->Type4->L3CacheHandle); + ShellPrintDefaultEx (L"L1 Cache Handle: 0x%x\n", Struct->Type4->L1CacheHandle); + ShellPrintDefaultEx (L"L2 Cache Handle: 0x%x\n", Struct->Type4->L2CacheHandle); + ShellPrintDefaultEx (L"L3 Cache Handle: 0x%x\n", Struct->Type4->L3CacheHandle); if (AE_SMBIOS_VERSION (0x2, 0x3) && (Struct->Hdr->Length > 0x20)) { - ShellPrintEx (-1, -1, L"Serial Number: %a\n", LibGetSmbiosString (Struct, Struct->Type4->SerialNumber)); - ShellPrintEx (-1, -1, L"Asset Tag: %a\n", LibGetSmbiosString (Struct, Struct->Type4->AssetTag)); - ShellPrintEx (-1, -1, L"Part Number: %a\n", LibGetSmbiosString (Struct, Struct->Type4->PartNumber)); + ShellPrintDefaultEx (L"Serial Number: %a\n", LibGetSmbiosString (Struct, Struct->Type4->SerialNumber)); + ShellPrintDefaultEx (L"Asset Tag: %a\n", LibGetSmbiosString (Struct, Struct->Type4->AssetTag)); + ShellPrintDefaultEx (L"Part Number: %a\n", LibGetSmbiosString (Struct, Struct->Type4->PartNumber)); } if (AE_SMBIOS_VERSION (0x2, 0x5) && (Struct->Hdr->Length > 0x23)) { - ShellPrintEx (-1, -1, L"Core Count: %u\n", Struct->Type4->CoreCount); - ShellPrintEx (-1, -1, L"Core Enabled: %u\n", Struct->Type4->EnabledCoreCount); - ShellPrintEx (-1, -1, L"Thread Count: %u\n", Struct->Type4->ThreadCount); + ShellPrintDefaultEx (L"Core Count: %u\n", Struct->Type4->CoreCount); + ShellPrintDefaultEx (L"Core Enabled: %u\n", Struct->Type4->EnabledCoreCount); + ShellPrintDefaultEx (L"Thread Count: %u\n", Struct->Type4->ThreadCount); DisplayProcessorCharacteristics (Struct->Type4->ProcessorCharacteristics, Option); } @@ -489,17 +489,17 @@ SmbiosPrintStructure ( } if ((SmbiosMajorVersion >= 0x3) && (Struct->Hdr->Length > 0x2A)) { - ShellPrintEx (-1, -1, L"Core Count 2: %u\n", Struct->Type4->CoreCount2); - ShellPrintEx (-1, -1, L"Core Enabled 2: %u\n", Struct->Type4->EnabledCoreCount2); - ShellPrintEx (-1, -1, L"Thread Count 2: %u\n", Struct->Type4->ThreadCount2); + ShellPrintDefaultEx (L"Core Count 2: %u\n", Struct->Type4->CoreCount2); + ShellPrintDefaultEx (L"Core Enabled 2: %u\n", Struct->Type4->EnabledCoreCount2); + ShellPrintDefaultEx (L"Thread Count 2: %u\n", Struct->Type4->ThreadCount2); } if (AE_SMBIOS_VERSION (0x3, 0x6) && (Struct->Hdr->Length > 0x30)) { - ShellPrintEx (-1, -1, L"Thread Enabled: %u\n", Struct->Type4->ThreadEnabled); + ShellPrintDefaultEx (L"Thread Enabled: %u\n", Struct->Type4->ThreadEnabled); } if (AE_SMBIOS_VERSION (0x3, 0x8) && (Struct->Hdr->Length > 0x32)) { - ShellPrintEx (-1, -1, L"Socket Type: %a\n", LibGetSmbiosString (Struct, Struct->Type4->SocketType)); + ShellPrintDefaultEx (L"Socket Type: %a\n", LibGetSmbiosString (Struct, Struct->Type4->SocketType)); } break; @@ -651,10 +651,10 @@ SmbiosPrintStructure ( UINTN NumOfDevice; NumOfDevice = (Struct->Type10->Hdr.Length - sizeof (SMBIOS_STRUCTURE)) / (2 * sizeof (UINT8)); for (Index = 0; (UINTN)Index < NumOfDevice; Index++) { - ShellPrintEx (-1, -1, (((Struct->Type10->Device[Index].DeviceType) & 0x80) != 0) ? L"Device Enabled\n" : L"Device Disabled\n"); + ShellPrintDefaultEx ((((Struct->Type10->Device[Index].DeviceType) & 0x80) != 0) ? L"Device Enabled\n" : L"Device Disabled\n"); DisplayOnboardDeviceTypes ((Struct->Type10->Device[Index].DeviceType) & 0x7F, Option); ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_DESC_STRING), gShellDebug1HiiHandle); - ShellPrintEx (-1, -1, L"%a\n", LibGetSmbiosString (Struct, Struct->Type10->Device[Index].DescriptionString)); + ShellPrintDefaultEx (L"%a\n", LibGetSmbiosString (Struct, Struct->Type10->Device[Index].DescriptionString)); } break; @@ -666,7 +666,7 @@ SmbiosPrintStructure ( case 11: PRINT_STRUCT_VALUE (Struct, Type11, StringCount); for (Index = 1; Index <= Struct->Type11->StringCount; Index++) { - ShellPrintEx (-1, -1, L"%a\n", LibGetSmbiosString (Struct, Index)); + ShellPrintDefaultEx (L"%a\n", LibGetSmbiosString (Struct, Index)); } break; @@ -677,7 +677,7 @@ SmbiosPrintStructure ( case 12: PRINT_STRUCT_VALUE (Struct, Type12, StringCount); for (Index = 1; Index <= Struct->Type12->StringCount; Index++) { - ShellPrintEx (-1, -1, L"%a\n", LibGetSmbiosString (Struct, Index)); + ShellPrintDefaultEx (L"%a\n", LibGetSmbiosString (Struct, Index)); } break; @@ -701,8 +701,8 @@ SmbiosPrintStructure ( NumOfItem = (Struct->Type14->Hdr.Length - 5) / 3; PRINT_PENDING_STRING (Struct, Type14, GroupName); for (Index = 0; Index < NumOfItem; Index++) { - ShellPrintEx (-1, -1, L"ItemType %u: %u\n", Index + 1, Struct->Type14->Group[Index].ItemType); - ShellPrintEx (-1, -1, L"ItemHandle %u: %u\n", Index + 1, Struct->Type14->Group[Index].ItemHandle); + ShellPrintDefaultEx (L"ItemType %u: %u\n", Index + 1, Struct->Type14->Group[Index].ItemType); + ShellPrintDefaultEx (L"ItemHandle %u: %u\n", Index + 1, Struct->Type14->Group[Index].ItemHandle); } break; @@ -814,75 +814,75 @@ SmbiosPrintStructure ( // Memory Device (Type 17) // case 17: - ShellPrintEx (-1, -1, L"Physical Memory Array Handle: 0x%x\n", Struct->Type17->MemoryArrayHandle); - ShellPrintEx (-1, -1, L"Memory Error Information Handle: 0x%x\n", Struct->Type17->MemoryErrorInformationHandle); - ShellPrintEx (-1, -1, L"Total Width: 0x%x\n", Struct->Type17->TotalWidth); - ShellPrintEx (-1, -1, L"Data Width: 0x%x\n", Struct->Type17->DataWidth); + ShellPrintDefaultEx (L"Physical Memory Array Handle: 0x%x\n", Struct->Type17->MemoryArrayHandle); + ShellPrintDefaultEx (L"Memory Error Information Handle: 0x%x\n", Struct->Type17->MemoryErrorInformationHandle); + ShellPrintDefaultEx (L"Total Width: 0x%x\n", Struct->Type17->TotalWidth); + ShellPrintDefaultEx (L"Data Width: 0x%x\n", Struct->Type17->DataWidth); PRINT_STRUCT_VALUE (Struct, Type17, Size); DisplayMemoryDeviceFormFactor (Struct->Type17->FormFactor, Option); - ShellPrintEx (-1, -1, L"Device Set: 0x%x\n", Struct->Type17->DeviceSet); - ShellPrintEx (-1, -1, L"Device Locator: %a\n", LibGetSmbiosString (Struct, Struct->Type17->DeviceLocator)); - ShellPrintEx (-1, -1, L"Bank Locator: %a\n", LibGetSmbiosString (Struct, Struct->Type17->BankLocator)); + ShellPrintDefaultEx (L"Device Set: 0x%x\n", Struct->Type17->DeviceSet); + ShellPrintDefaultEx (L"Device Locator: %a\n", LibGetSmbiosString (Struct, Struct->Type17->DeviceLocator)); + ShellPrintDefaultEx (L"Bank Locator: %a\n", LibGetSmbiosString (Struct, Struct->Type17->BankLocator)); DisplayMemoryDeviceType (Struct->Type17->MemoryType, Option); DisplayMemoryDeviceTypeDetail (ReadUnaligned16 ((UINT16 *)(UINTN)&(Struct->Type17->TypeDetail)), Option); PRINT_STRUCT_VALUE_H (Struct, Type17, Speed); PRINT_PENDING_STRING (Struct, Type17, Manufacturer); - ShellPrintEx (-1, -1, L"Serial Number: %a\n", LibGetSmbiosString (Struct, Struct->Type17->SerialNumber)); - ShellPrintEx (-1, -1, L"Asset Tag: %a\n", LibGetSmbiosString (Struct, Struct->Type17->AssetTag)); - ShellPrintEx (-1, -1, L"Part Number: %a\n", LibGetSmbiosString (Struct, Struct->Type17->PartNumber)); + ShellPrintDefaultEx (L"Serial Number: %a\n", LibGetSmbiosString (Struct, Struct->Type17->SerialNumber)); + ShellPrintDefaultEx (L"Asset Tag: %a\n", LibGetSmbiosString (Struct, Struct->Type17->AssetTag)); + ShellPrintDefaultEx (L"Part Number: %a\n", LibGetSmbiosString (Struct, Struct->Type17->PartNumber)); if (AE_SMBIOS_VERSION (0x2, 0x6) && (Struct->Hdr->Length > 0x1B)) { PRINT_STRUCT_VALUE_H (Struct, Type17, Attributes); } if (AE_SMBIOS_VERSION (0x2, 0x7) && (Struct->Hdr->Length > 0x1C)) { - ShellPrintEx (-1, -1, L"Extended Size: %u\n", Struct->Type17->ExtendedSize); - ShellPrintEx (-1, -1, L"Configured Memory Speed: 0x%x\n", Struct->Type17->ConfiguredMemoryClockSpeed); + ShellPrintDefaultEx (L"Extended Size: %u\n", Struct->Type17->ExtendedSize); + ShellPrintDefaultEx (L"Configured Memory Speed: 0x%x\n", Struct->Type17->ConfiguredMemoryClockSpeed); } if (AE_SMBIOS_VERSION (0x2, 0x8) && (Struct->Hdr->Length > 0x22)) { - ShellPrintEx (-1, -1, L"Minimum voltage: %u\n", Struct->Type17->MinimumVoltage); - ShellPrintEx (-1, -1, L"Maximum voltage: %u\n", Struct->Type17->MaximumVoltage); - ShellPrintEx (-1, -1, L"Configured voltage: %u\n", Struct->Type17->ConfiguredVoltage); + ShellPrintDefaultEx (L"Minimum voltage: %u\n", Struct->Type17->MinimumVoltage); + ShellPrintDefaultEx (L"Maximum voltage: %u\n", Struct->Type17->MaximumVoltage); + ShellPrintDefaultEx (L"Configured voltage: %u\n", Struct->Type17->ConfiguredVoltage); } if (AE_SMBIOS_VERSION (0x3, 0x2)) { if (Struct->Hdr->Length > 0x28) { DisplayMemoryDeviceMemoryTechnology (Struct->Type17->MemoryTechnology, Option); DisplayMemoryDeviceMemoryOperatingModeCapability (Struct->Type17->MemoryOperatingModeCapability.Uint16, Option); - ShellPrintEx (-1, -1, L"Firmware Version: %a\n", LibGetSmbiosString (Struct, Struct->Type17->FirmwareVersion)); - ShellPrintEx (-1, -1, L"Module Manufacturer ID: 0x%x\n", Struct->Type17->ModuleManufacturerID); - ShellPrintEx (-1, -1, L"Module Product ID: 0x%x\n", Struct->Type17->ModuleProductID); - ShellPrintEx (-1, -1, L"Memory Subsystem Controller Manufacturer ID: 0x%x\n", Struct->Type17->MemorySubsystemControllerManufacturerID); - ShellPrintEx (-1, -1, L"Memory Subsystem Controller Product ID: 0x%x\n", Struct->Type17->MemorySubsystemControllerProductID); + ShellPrintDefaultEx (L"Firmware Version: %a\n", LibGetSmbiosString (Struct, Struct->Type17->FirmwareVersion)); + ShellPrintDefaultEx (L"Module Manufacturer ID: 0x%x\n", Struct->Type17->ModuleManufacturerID); + ShellPrintDefaultEx (L"Module Product ID: 0x%x\n", Struct->Type17->ModuleProductID); + ShellPrintDefaultEx (L"Memory Subsystem Controller Manufacturer ID: 0x%x\n", Struct->Type17->MemorySubsystemControllerManufacturerID); + ShellPrintDefaultEx (L"Memory Subsystem Controller Product ID: 0x%x\n", Struct->Type17->MemorySubsystemControllerProductID); } if (Struct->Hdr->Length > 0x34) { - ShellPrintEx (-1, -1, L"Non-volatile Size: 0x%lx\n", Struct->Type17->NonVolatileSize); + ShellPrintDefaultEx (L"Non-volatile Size: 0x%lx\n", Struct->Type17->NonVolatileSize); } if (Struct->Hdr->Length > 0x3C) { - ShellPrintEx (-1, -1, L"Volatile Size: 0x%lx\n", Struct->Type17->VolatileSize); + ShellPrintDefaultEx (L"Volatile Size: 0x%lx\n", Struct->Type17->VolatileSize); } if (Struct->Hdr->Length > 0x44) { - ShellPrintEx (-1, -1, L"Cache Size: 0x%lx\n", Struct->Type17->CacheSize); + ShellPrintDefaultEx (L"Cache Size: 0x%lx\n", Struct->Type17->CacheSize); } if (Struct->Hdr->Length > 0x4C) { - ShellPrintEx (-1, -1, L"Logical Size: 0x%lx\n", Struct->Type17->LogicalSize); + ShellPrintDefaultEx (L"Logical Size: 0x%lx\n", Struct->Type17->LogicalSize); } } if (AE_SMBIOS_VERSION (0x3, 0x3) && (Struct->Hdr->Length > 0x54)) { - ShellPrintEx (-1, -1, L"Extended Speed: 0x%x\n", Struct->Type17->ExtendedSpeed); - ShellPrintEx (-1, -1, L"Extended Configured Memory Speed: 0x%x\n", Struct->Type17->ExtendedConfiguredMemorySpeed); + ShellPrintDefaultEx (L"Extended Speed: 0x%x\n", Struct->Type17->ExtendedSpeed); + ShellPrintDefaultEx (L"Extended Configured Memory Speed: 0x%x\n", Struct->Type17->ExtendedConfiguredMemorySpeed); } if (AE_SMBIOS_VERSION (0x3, 0x7) && (Struct->Hdr->Length > 0x5C)) { - ShellPrintEx (-1, -1, L"PMIC0 Manufacturer ID: 0x%x\n", Struct->Type17->Pmic0ManufacturerID); - ShellPrintEx (-1, -1, L"PMIC0 Revision Number: 0x%x\n", Struct->Type17->Pmic0RevisionNumber); - ShellPrintEx (-1, -1, L"RCD Manufacturer ID: 0x%x\n", Struct->Type17->RcdManufacturerID); - ShellPrintEx (-1, -1, L"RCD Revision Number: 0x%x\n", Struct->Type17->RcdRevisionNumber); + ShellPrintDefaultEx (L"PMIC0 Manufacturer ID: 0x%x\n", Struct->Type17->Pmic0ManufacturerID); + ShellPrintDefaultEx (L"PMIC0 Revision Number: 0x%x\n", Struct->Type17->Pmic0RevisionNumber); + ShellPrintDefaultEx (L"RCD Manufacturer ID: 0x%x\n", Struct->Type17->RcdManufacturerID); + ShellPrintDefaultEx (L"RCD Revision Number: 0x%x\n", Struct->Type17->RcdRevisionNumber); } break; @@ -1247,13 +1247,13 @@ SmbiosPrintStructure ( // Onboard Devices Extended Information (Type 41) // case 41: - ShellPrintEx (-1, -1, L"Reference Designation: %a\n", LibGetSmbiosString (Struct, Struct->Type41->ReferenceDesignation)); - ShellPrintEx (-1, -1, (((Struct->Type41->DeviceType) & 0x80) != 0) ? L"Device Enabled\n" : L"Device Disabled\n"); + ShellPrintDefaultEx (L"Reference Designation: %a\n", LibGetSmbiosString (Struct, Struct->Type41->ReferenceDesignation)); + ShellPrintDefaultEx ((((Struct->Type41->DeviceType) & 0x80) != 0) ? L"Device Enabled\n" : L"Device Disabled\n"); DisplayOnboardDeviceTypes ((Struct->Type41->DeviceType) & 0x7F, Option); - ShellPrintEx (-1, -1, L"Device Type Instance: 0x%x\n", Struct->Type41->DeviceTypeInstance); - ShellPrintEx (-1, -1, L"Segment Group Number: 0x%x\n", Struct->Type41->SegmentGroupNum); - ShellPrintEx (-1, -1, L"Bus Number: 0x%x\n", Struct->Type41->BusNum); - ShellPrintEx (-1, -1, L"Device/Function Number: 0x%x\n", Struct->Type41->DevFuncNum); + ShellPrintDefaultEx (L"Device Type Instance: 0x%x\n", Struct->Type41->DeviceTypeInstance); + ShellPrintDefaultEx (L"Segment Group Number: 0x%x\n", Struct->Type41->SegmentGroupNum); + ShellPrintDefaultEx (L"Bus Number: 0x%x\n", Struct->Type41->BusNum); + ShellPrintDefaultEx (L"Device/Function Number: 0x%x\n", Struct->Type41->DevFuncNum); break; // @@ -1265,23 +1265,23 @@ SmbiosPrintStructure ( UINT32 DataValue = 0; PRINT_STRUCT_VALUE_H (Struct, Type42, InterfaceTypeSpecificDataLength); if (Struct->Type42->InterfaceTypeSpecificDataLength < 4) { - ShellPrintEx (-1, -1, L"WARNING: InterfaceTypeSpecificDataLength should be >= 4.\n"); + ShellPrintDefaultEx (L"WARNING: InterfaceTypeSpecificDataLength should be >= 4.\n"); } - ShellPrintEx (-1, -1, L"InterfaceTypeSpecificData\n"); + ShellPrintDefaultEx (L"InterfaceTypeSpecificData\n"); // Decode and interpret InterfaceTypeSpecificData based on the InterfaceType switch (Struct->Type42->InterfaceType) { case MCHostInterfaceTypeOemDefined: // The first four bytes are the vendor ID (MSB first), as assigned by the Internet Assigned Numbers Authority (IANA) as "Enterprise Number". // See https://www.iana.org/assignments/enterprise-numbers.txt - ShellPrintEx (-1, -1, L"Vendor ID (IANA Enterprise Number): %d", (UINT32)*(Struct->Type42->InterfaceTypeSpecificData)); + ShellPrintDefaultEx (L"Vendor ID (IANA Enterprise Number): %d", (UINT32)*(Struct->Type42->InterfaceTypeSpecificData)); break; // As defined in MCTP Host Interface Specification, DSP0256 case MCHostInterfaceTypeMMBI: // For MCTP interface type of MMBI; this defines the pointer to the MMBI capability descriptor, as defined in DSP0282, Section 7.1 DataValue = *(UINT32 *)Struct->Type42->InterfaceTypeSpecificData; - ShellPrintEx (-1, -1, L"Pointer to MMBI capability descriptor: 0x%x\n", DataValue); + ShellPrintDefaultEx (L"Pointer to MMBI capability descriptor: 0x%x\n", DataValue); break; case MCHostInterfaceTypeI2C_SMBUS: @@ -1290,8 +1290,8 @@ SmbiosPrintStructure ( // switch case fall through // For MCTP interface type of I2C, I3C, KCS; this value is reserved and must be 0 DataValue = *(UINT32 *)Struct->Type42->InterfaceTypeSpecificData; - ShellPrintEx (-1, -1, L"For Interface type I2C, I3C or KCS, InterfaceTypeSpecificData is reserved and must be 0.\n"); - ShellPrintEx (-1, -1, L"Actual value is : 0x%x\n", DataValue); + ShellPrintDefaultEx (L"For Interface type I2C, I3C or KCS, InterfaceTypeSpecificData is reserved and must be 0.\n"); + ShellPrintDefaultEx (L"Actual value is : 0x%x\n", DataValue); break; default: diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosView.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosView.c index 6679240fb85f..ee5eb079181d 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosView.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosView.c @@ -273,7 +273,7 @@ SMBiosView ( SmbiosMajorVersion = SMBiosTable->MajorVersion; SmbiosMinorVersion = SMBiosTable->MinorVersion; - ShellPrintEx (-1, -1, L"=========================================================\n"); + ShellPrintDefaultEx (L"=========================================================\n"); ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERY_STRUCT_COND), gShellDebug1HiiHandle); if (QueryType == STRUCTURE_TYPE_RANDOM) { @@ -289,8 +289,8 @@ SMBiosView ( } ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SHOWTYPE), gShellDebug1HiiHandle); - ShellPrintEx (-1, -1, GetShowTypeString (gShowType)); - ShellPrintEx (-1, -1, L"\n\n"); + ShellPrintDefaultEx (GetShowTypeString (gShowType)); + ShellPrintDefaultEx (L"\n\n"); /* // @@ -336,7 +336,7 @@ SMBiosView ( continue; } - ShellPrintEx (-1, -1, L"\n=========================================================\n"); + ShellPrintDefaultEx (L"\n=========================================================\n"); ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE_HANDLE_DUMP_STRUCT), gShellDebug1HiiHandle, @@ -369,7 +369,7 @@ SMBiosView ( // Print structure information // SmbiosPrintStructure (&SmbiosStruct, gShowType); - ShellPrintEx (-1, -1, L"\n"); + ShellPrintDefaultEx (L"\n"); /* // @@ -398,7 +398,7 @@ SMBiosView ( } } - ShellPrintEx (-1, -1, L"\n=========================================================\n"); + ShellPrintDefaultEx (L"\n=========================================================\n"); return EFI_SUCCESS; } @@ -448,7 +448,7 @@ SMBios64View ( SmbiosMajorVersion = SMBiosTable->MajorVersion; SmbiosMinorVersion = SMBiosTable->MinorVersion; - ShellPrintEx (-1, -1, L"=========================================================\n"); + ShellPrintDefaultEx (L"=========================================================\n"); ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_QUERY_STRUCT_COND), gShellDebug1HiiHandle); if (QueryType == STRUCTURE_TYPE_RANDOM) { @@ -464,8 +464,8 @@ SMBios64View ( } ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_SHOWTYPE), gShellDebug1HiiHandle); - ShellPrintEx (-1, -1, GetShowTypeString (gShowType)); - ShellPrintEx (-1, -1, L"\n\n"); + ShellPrintDefaultEx (GetShowTypeString (gShowType)); + ShellPrintDefaultEx (L"\n\n"); /* // @@ -511,7 +511,7 @@ SMBios64View ( continue; } - ShellPrintEx (-1, -1, L"\n=========================================================\n"); + ShellPrintDefaultEx (L"\n=========================================================\n"); ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_TYPE_HANDLE_DUMP_STRUCT), gShellDebug1HiiHandle, @@ -544,7 +544,7 @@ SMBios64View ( // Print structure information // SmbiosPrintStructure (&SmbiosStruct, gShowType); - ShellPrintEx (-1, -1, L"\n"); + ShellPrintDefaultEx (L"\n"); /* // @@ -573,7 +573,7 @@ SMBios64View ( } } - ShellPrintEx (-1, -1, L"\n=========================================================\n"); + ShellPrintDefaultEx (L"\n=========================================================\n"); return EFI_SUCCESS; } @@ -849,7 +849,7 @@ DisplayStatisticsTable ( return EFI_UNSUPPORTED; } - ShellPrintEx (-1, -1, L"\n============================================================\n"); + ShellPrintDefaultEx (L"\n============================================================\n"); SmbiosPrintEPSInfo (SMBiosTable, Option); if (Option < SHOW_NORMAL) { @@ -861,7 +861,7 @@ DisplayStatisticsTable ( return EFI_NOT_FOUND; } - ShellPrintEx (-1, -1, L"============================================================\n"); + ShellPrintDefaultEx (L"============================================================\n"); StatisticsPointer = &mStatisticsTable[0]; Num = SMBiosTable->NumberOfSmbiosStructures; // @@ -876,7 +876,7 @@ DisplayStatisticsTable ( ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_LENGTH), gShellDebug1HiiHandle, StatisticsPointer->Length); } - ShellPrintEx (-1, -1, L"\n"); + ShellPrintDefaultEx (L"\n"); StatisticsPointer = &mStatisticsTable[Index]; /* @@ -931,7 +931,7 @@ DisplaySmbios64BitStatisticsTable ( return EFI_UNSUPPORTED; } - ShellPrintEx (-1, -1, L"\n============================================================\n"); + ShellPrintDefaultEx (L"\n============================================================\n"); Smbios64BitPrintEPSInfo (SMBiosTable, Option); if (Option < SHOW_NORMAL) { @@ -943,7 +943,7 @@ DisplaySmbios64BitStatisticsTable ( return EFI_NOT_FOUND; } - ShellPrintEx (-1, -1, L"============================================================\n"); + ShellPrintDefaultEx (L"============================================================\n"); StatisticsPointer = &mSmbios64BitStatisticsTable[0]; Num = mNumberOfSmbios64BitStructures; // @@ -958,7 +958,7 @@ DisplaySmbios64BitStatisticsTable ( ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_LENGTH), gShellDebug1HiiHandle, StatisticsPointer->Length); } - ShellPrintEx (-1, -1, L"\n"); + ShellPrintDefaultEx (L"\n"); StatisticsPointer = &mSmbios64BitStatisticsTable[Index]; /* diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/DevTree.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/DevTree.c index fcb8c20ca476..2cfae803e57d 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/DevTree.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/DevTree.c @@ -101,9 +101,7 @@ DoDevTreeForHandle ( // // print out the information for ourselves // - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( FormatString, L"", ConvertHandleToHandleIndex (TheHandle), diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/Drivers.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/Drivers.c index 7ef1c0021239..bcaf165bf11a 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/Drivers.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/Drivers.c @@ -405,9 +405,7 @@ ShellCommandRunDrivers ( } if (!SfoFlag) { - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( FormatString, ConvertHandleToHandleIndex (*HandleWalker), DriverVersion, @@ -420,9 +418,7 @@ ShellCommandRunDrivers ( ImageName == NULL ? L"" : ImageName ); } else { - ShellPrintEx ( - -1, - -1, + ShellPrintDefaultEx ( FormatString, ConvertHandleToHandleIndex (*HandleWalker), DriverVersion, diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvDiag.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvDiag.c index d02d6b52c49c..46c7810a7f4d 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvDiag.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/DrvDiag.c @@ -159,7 +159,7 @@ DoDiagnostics ( } } else { if (Mode == TestModeList) { - ShellPrintEx (-1, -1, L"\r\n"); + ShellPrintDefaultEx (L"\r\n"); } for (ControllerHandleListLoop = 0 diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/OpenInfo.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/OpenInfo.c index 1c0389c96ea2..a0de67cb0ee3 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/OpenInfo.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/OpenInfo.c @@ -68,7 +68,7 @@ TraverseHandleDatabase ( continue; } - ShellPrintEx (-1, -1, L"%H%s%N\r\n", TempString); + ShellPrintDefaultEx (L"%H%s%N\r\n", TempString); FreePool (TempString); // diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/Unload.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/Unload.c index efcbf90d9927..6504d36cc221 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/Unload.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/Unload.c @@ -29,7 +29,7 @@ DumpLoadedImageProtocolInfo ( return (EFI_INVALID_PARAMETER); } - ShellPrintEx (-1, -1, L"%s", TheString); + ShellPrintDefaultEx (L"%s", TheString); SHELL_FREE_NON_NULL (TheString); diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c index 8fb7493d4cb1..fcbba7faaffb 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c @@ -559,7 +559,7 @@ ValidateAndCopyFiles ( PathCleanUpDirectories (DestPath); if (!SilentMode) { - ShellPrintEx (-1, -1, HiiOutput, Node->FullName, DestPath); + ShellPrintDefaultEx (HiiOutput, Node->FullName, DestPath); } // @@ -572,7 +572,7 @@ ValidateAndCopyFiles ( } if ((ShellStatus == SHELL_SUCCESS) && (Resp == NULL)) { - ShellPrintEx (-1, -1, L"%s", HiiResultOk); + ShellPrintDefaultEx (L"%s", HiiResultOk); } SHELL_FREE_NON_NULL (DestPath); diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c index fafc4e3fc246..79632a2a03a5 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c @@ -653,7 +653,7 @@ ValidateAndMoveFiles ( continue; } - ShellPrintEx (-1, -1, HiiOutput, Node->FullName, FullDestPath != NULL ? FullDestPath : DestPath); + ShellPrintDefaultEx (HiiOutput, Node->FullName, FullDestPath != NULL ? FullDestPath : DestPath); // // See if destination exists @@ -728,7 +728,7 @@ ValidateAndMoveFiles ( ShellStatus = SHELL_ACCESS_DENIED; } } else { - ShellPrintEx (-1, -1, L"%s", HiiResultOk); + ShellPrintDefaultEx (L"%s", HiiResultOk); } } // main for loop diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c index 78e6ad06ef71..75b93184b0e4 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c @@ -212,7 +212,7 @@ PerformParsing ( SfoString = HandleStringWithEscapeCharForParse (ColumnPointer); if (SfoString != NULL) { - ShellPrintEx (-1, -1, L"%s\r\n", SfoString); + ShellPrintDefaultEx (L"%s\r\n", SfoString); SHELL_FREE_NON_NULL (SfoString); } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c index 4bafa0abb648..a89fcccbc7aa 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c @@ -138,7 +138,7 @@ ShellCommandRunReset ( } else { String = ShellCommandLineGetValue (Package, L"-s"); DEBUG_CODE ( - ShellPrintEx (-1, -1, L"Reset with %s (%d bytes)\n", String, String != NULL ? StrSize (String) : 0); + ShellPrintDefaultEx (L"Reset with %s (%d bytes)\n", String, String != NULL ? StrSize (String) : 0); ); if (String != NULL) { gRT->ResetSystem (EfiResetShutdown, EFI_SUCCESS, StrSize (String), (VOID *)String); diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/Echo.c b/ShellPkg/Library/UefiShellLevel3CommandsLib/Echo.c index 070cba04da1a..8561d93cadb0 100644 --- a/ShellPkg/Library/UefiShellLevel3CommandsLib/Echo.c +++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/Echo.c @@ -103,7 +103,7 @@ ShellCommandRunEcho ( } } - ShellPrintEx (-1, -1, L"%s\r\n", PrintString); + ShellPrintDefaultEx (L"%s\r\n", PrintString); SHELL_FREE_NON_NULL (PrintString); } diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/Type.c b/ShellPkg/Library/UefiShellLevel3CommandsLib/Type.c index 68e8ff9bc5b7..ae04ec34409c 100644 --- a/ShellPkg/Library/UefiShellLevel3CommandsLib/Type.c +++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/Type.c @@ -87,7 +87,7 @@ TypeFileByHandle ( // print CR and LF. This is because Shell 2.0 requires carriage // return with line feed for displaying each new line from left. // - ShellPrintEx (-1, -1, L"\r\n"); + ShellPrintDefaultEx (L"\r\n"); continue; } } else { @@ -99,7 +99,7 @@ TypeFileByHandle ( } } - ShellPrintEx (-1, -1, L"%c", AsciiChar); + ShellPrintDefaultEx (L"%c", AsciiChar); } } else { if (*(UINT16 *)Buffer == gUnicodeFileTag) { @@ -133,7 +133,7 @@ TypeFileByHandle ( // print CR and LF. This is because Shell 2.0 requires carriage // return with line feed for displaying each new line from left. // - ShellPrintEx (-1, -1, L"\r\n"); + ShellPrintDefaultEx (L"\r\n"); continue; } } else if (Ucs2Char < 0x20) { @@ -143,7 +143,7 @@ TypeFileByHandle ( Ucs2Char = L'.'; } - ShellPrintEx (-1, -1, L"%c", Ucs2Char); + ShellPrintDefaultEx (L"%c", Ucs2Char); } } @@ -153,7 +153,7 @@ TypeFileByHandle ( } FreePool (AllocatedBuffer); - ShellPrintEx (-1, -1, L"\r\n"); + ShellPrintDefaultEx (L"\r\n"); return (Status); } diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/Ver.c b/ShellPkg/Library/UefiShellLevel3CommandsLib/Ver.c index 4ec1e20d4860..176380191edd 100644 --- a/ShellPkg/Library/UefiShellLevel3CommandsLib/Ver.c +++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/Ver.c @@ -127,7 +127,7 @@ ShellCommandRunVer ( // implementation specific support for displaying processor architecture // if (ShellCommandLineGetFlag (Package, L"-_pa")) { - ShellPrintEx (-1, -1, L"%d\r\n", sizeof (UINTN) == sizeof (UINT64) ? 64 : 32); + ShellPrintDefaultEx (L"%d\r\n", sizeof (UINTN) == sizeof (UINT64) ? 64 : 32); } } diff --git a/ShellPkg/Library/UefiShellLib/UefiShellLib.c b/ShellPkg/Library/UefiShellLib/UefiShellLib.c index 349436f6788f..fd8f58a5d0fd 100644 --- a/ShellPkg/Library/UefiShellLib/UefiShellLib.c +++ b/ShellPkg/Library/UefiShellLib/UefiShellLib.c @@ -3553,7 +3553,7 @@ ShellPromptForResponse ( switch (Type) { case ShellPromptResponseTypeQuitContinue: if (Prompt != NULL) { - ShellPrintEx (-1, -1, L"%s", Prompt); + ShellPrintDefaultEx (L"%s", Prompt); } // @@ -3565,7 +3565,7 @@ ShellPromptForResponse ( break; } - ShellPrintEx (-1, -1, L"%c", Key.UnicodeChar); + ShellPrintDefaultEx (L"%c", Key.UnicodeChar); if ((Key.UnicodeChar == L'Q') || (Key.UnicodeChar == L'q')) { *Resp = ShellPromptResponseQuit; } else { @@ -3575,7 +3575,7 @@ ShellPromptForResponse ( break; case ShellPromptResponseTypeYesNoCancel: if (Prompt != NULL) { - ShellPrintEx (-1, -1, L"%s", Prompt); + ShellPrintDefaultEx (L"%s", Prompt); } // @@ -3594,7 +3594,7 @@ ShellPromptForResponse ( break; } - ShellPrintEx (-1, -1, L"%c", Key.UnicodeChar); + ShellPrintDefaultEx (L"%c", Key.UnicodeChar); switch (Key.UnicodeChar) { case L'Y': case L'y': @@ -3614,7 +3614,7 @@ ShellPromptForResponse ( break; case ShellPromptResponseTypeYesNoAllCancel: if (Prompt != NULL) { - ShellPrintEx (-1, -1, L"%s", Prompt); + ShellPrintDefaultEx (L"%s", Prompt); } // @@ -3634,7 +3634,7 @@ ShellPromptForResponse ( } if ((Key.UnicodeChar <= 127) && (Key.UnicodeChar >= 32)) { - ShellPrintEx (-1, -1, L"%c", Key.UnicodeChar); + ShellPrintDefaultEx (L"%c", Key.UnicodeChar); } switch (Key.UnicodeChar) { @@ -3661,7 +3661,7 @@ ShellPromptForResponse ( case ShellPromptResponseTypeEnterContinue: case ShellPromptResponseTypeAnyKeyContinue: if (Prompt != NULL) { - ShellPrintEx (-1, -1, L"%s", Prompt); + ShellPrintDefaultEx (L"%s", Prompt); } // @@ -3681,7 +3681,7 @@ ShellPromptForResponse ( break; } - ShellPrintEx (-1, -1, L"%c", Key.UnicodeChar); + ShellPrintDefaultEx (L"%c", Key.UnicodeChar); if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) { *Resp = ShellPromptResponseContinue; break; @@ -3699,7 +3699,7 @@ ShellPromptForResponse ( break; case ShellPromptResponseTypeYesNo: if (Prompt != NULL) { - ShellPrintEx (-1, -1, L"%s", Prompt); + ShellPrintDefaultEx (L"%s", Prompt); } // @@ -3718,7 +3718,7 @@ ShellPromptForResponse ( break; } - ShellPrintEx (-1, -1, L"%c", Key.UnicodeChar); + ShellPrintDefaultEx (L"%c", Key.UnicodeChar); switch (Key.UnicodeChar) { case L'Y': case L'y': @@ -3734,7 +3734,7 @@ ShellPromptForResponse ( break; case ShellPromptResponseTypeFreeform: if (Prompt != NULL) { - ShellPrintEx (-1, -1, L"%s", Prompt); + ShellPrintDefaultEx (L"%s", Prompt); } while (1) { @@ -3749,7 +3749,7 @@ ShellPromptForResponse ( break; } - ShellPrintEx (-1, -1, L"%c", Key.UnicodeChar); + ShellPrintDefaultEx (L"%c", Key.UnicodeChar); if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) { break; } @@ -3785,7 +3785,7 @@ ShellPromptForResponse ( } } - ShellPrintEx (-1, -1, L"\r\n"); + ShellPrintDefaultEx (L"\r\n"); return (Status); } @@ -4515,9 +4515,9 @@ ShellPrintHelp ( // Print this out to the console // if (PrintCommandText) { - ShellPrintEx (-1, -1, L"%H%-14s%N- %s\r\n", CommandToGetHelpOn, OutText); + ShellPrintDefaultEx (L"%H%-14s%N- %s\r\n", CommandToGetHelpOn, OutText); } else { - ShellPrintEx (-1, -1, L"%N%s\r\n", OutText); + ShellPrintDefaultEx (L"%N%s\r\n", OutText); } SHELL_FREE_NON_NULL (OutText); From 8b22c532b37b1c26185fa4e6eb9d465e3cb7e923 Mon Sep 17 00:00:00 2001 From: Leif Lindholm Date: Mon, 22 Sep 2025 17:31:19 +0100 Subject: [PATCH 0621/1172] ShellPkg/Library: rework Shell...CommandsLib Load.c CodeQL incorrectly flags that LoadedDriverImage might be derferenced while NULL, but the actual code paths make that impossible. Strip several levels of success handling to improve readability for humans and static analyzers both. Signed-off-by: Leif Lindholm --- .../Library/UefiShellLevel2CommandsLib/Load.c | 67 +++++++++---------- 1 file changed, 32 insertions(+), 35 deletions(-) diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c index 2d4ab5298e9d..3c0b9912972d 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c @@ -125,54 +125,51 @@ LoadDriver ( } ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LOAD_NOT_IMAGE), gShellLevel2HiiHandle, FileName, Status); - } else { - // - // Make sure it is a driver image - // - Status = gBS->HandleProtocol (LoadedDriverHandle, &gEfiLoadedImageProtocolGuid, (VOID *)&LoadedDriverImage); + goto Exit; + } - ASSERT (LoadedDriverImage != NULL); + // + // Make sure it is a driver image + // + Status = gBS->HandleProtocol (LoadedDriverHandle, &gEfiLoadedImageProtocolGuid, (VOID *)&LoadedDriverImage); - if ( EFI_ERROR (Status) - || ( (LoadedDriverImage->ImageCodeType != EfiBootServicesCode) - && (LoadedDriverImage->ImageCodeType != EfiRuntimeServicesCode)) - ) - { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LOAD_NOT_DRIVER), gShellLevel2HiiHandle, FileName); + ASSERT (LoadedDriverImage != NULL); - // - // Exit and unload the non-driver image - // - gBS->Exit (LoadedDriverHandle, EFI_INVALID_PARAMETER, 0, NULL); - Status = EFI_INVALID_PARAMETER; - } - } + if (EFI_ERROR (Status) || + ((LoadedDriverImage->ImageCodeType != EfiBootServicesCode) && + (LoadedDriverImage->ImageCodeType != EfiRuntimeServicesCode))) + { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LOAD_NOT_DRIVER), gShellLevel2HiiHandle, FileName); - if (!EFI_ERROR (Status)) { // - // Start the image + // Exit and unload the non-driver image // - Status = gBS->StartImage (LoadedDriverHandle, NULL, NULL); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LOAD_ERROR), gShellLevel2HiiHandle, FileName, Status); - } else { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LOAD_LOADED), gShellLevel2HiiHandle, FileName, LoadedDriverImage->ImageBase, Status); - } + gBS->Exit (LoadedDriverHandle, EFI_INVALID_PARAMETER, 0, NULL); + Status = EFI_INVALID_PARAMETER; + goto Exit; } - if (!EFI_ERROR (Status) && Connect) { - // - // Connect it... - // - Status = ConnectAllEfi (); + // + // Start the image + // + Status = gBS->StartImage (LoadedDriverHandle, NULL, NULL); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LOAD_ERROR), gShellLevel2HiiHandle, FileName, Status); + } else { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LOAD_LOADED), gShellLevel2HiiHandle, FileName, LoadedDriverImage->ImageBase, Status); + if (Connect) { + // + // Connect it... + // + Status = ConnectAllEfi (); + } } +Exit: // // clean up memory... // - if (FilePath != NULL) { - FreePool (FilePath); - } + FreePool (FilePath); return (Status); } From 5a6a9f7955f34c7ddf2d045443a9bbb112be4fc7 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 24 Sep 2025 13:27:26 +0200 Subject: [PATCH 0622/1172] OvmfPkg/X86QemuLoadImageLib: do not use the legacy linux loader in CVMs. Do not use the insecure legacy linux loader (which does not enforce secure boot checks) when running in a confidential VM. Signed-off-by: Gerd Hoffmann --- OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c | 6 ++++++ OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf | 3 +++ 2 files changed, 9 insertions(+) diff --git a/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c b/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c index 0ff8354ebdd1..b16bdeb47f8c 100644 --- a/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c +++ b/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c @@ -437,6 +437,12 @@ QemuLoadKernelImage ( "OVMF: command line switch for qemu (available in version 10.0 + newer).\n" "\n" ); + if (PcdGet64 (PcdConfidentialComputingGuestAttr)) { + AsciiPrint ( + "OVMF: Running in confidential VM, not using insecure legacy linux kernel loader.\n" + ); + return EFI_ACCESS_DENIED; + } RetStatus = QemuFwCfgParseBool ( "opt/org.tianocore/EnableLegacyLoader", diff --git a/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf b/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf index 09babd3be8f0..127674ab1538 100644 --- a/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf +++ b/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf @@ -44,3 +44,6 @@ [Guids] gQemuKernelLoaderFsMediaGuid + +[Pcd] + gEfiMdePkgTokenSpaceGuid.PcdConfidentialComputingGuestAttr From fe22ac2932d2f98451c4b3dd61e3c2326954ed0e Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 16 Sep 2025 14:02:56 +0200 Subject: [PATCH 0623/1172] OvmfPkg/igvm: add IgvmSecureBootDxe Enroll the secure boot variables passed in via IGVM data HOBs. Signed-off-by: Gerd Hoffmann --- OvmfPkg/IgvmSecureBootDxe/IgvmSecureBootDxe.c | 253 ++++++++++++++++++ .../IgvmSecureBootDxe/IgvmSecureBootDxe.inf | 43 +++ OvmfPkg/OvmfPkgX64.dsc | 1 + OvmfPkg/OvmfPkgX64.fdf | 1 + 4 files changed, 298 insertions(+) create mode 100644 OvmfPkg/IgvmSecureBootDxe/IgvmSecureBootDxe.c create mode 100644 OvmfPkg/IgvmSecureBootDxe/IgvmSecureBootDxe.inf diff --git a/OvmfPkg/IgvmSecureBootDxe/IgvmSecureBootDxe.c b/OvmfPkg/IgvmSecureBootDxe/IgvmSecureBootDxe.c new file mode 100644 index 000000000000..cb362c12420f --- /dev/null +++ b/OvmfPkg/IgvmSecureBootDxe/IgvmSecureBootDxe.c @@ -0,0 +1,253 @@ +/** @file + Enroll secure boot variables passed in via IGVM + + Copyright (C) 2025, Red Hat, Inc. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include +#include + +STATIC EFI_IGVM_DATA_HOB *mPK; +STATIC EFI_IGVM_DATA_HOB *mKEK; +STATIC EFI_IGVM_DATA_HOB *mDb; +STATIC EFI_IGVM_DATA_HOB *mDbx; + +STATIC +EFI_STATUS +IgvmSecureBootFindBlobs ( + VOID + ) +{ + EFI_HOB_GUID_TYPE *Hob; + EFI_IGVM_DATA_HOB *IgvmData; + CHAR16 *Name; + + for (Hob = GetFirstGuidHob (&gEfiIgvmDataHobGuid); + Hob != NULL; + Hob = GetNextGuidHob (&gEfiIgvmDataHobGuid, GET_NEXT_HOB (Hob))) + { + IgvmData = (VOID *)(Hob + 1); + + switch (IgvmData->DataType) { + case 0x100: + Name = L"PK"; + mPK = IgvmData; + break; + case 0x101: + Name = L"KEK"; + mKEK = IgvmData; + break; + case 0x102: + Name = L"db"; + mDb = IgvmData; + break; + case 0x103: + Name = L"dbx"; + mDbx = IgvmData; + break; + default: + Name = NULL; + break; + } + + if (Name) { + DEBUG (( + DEBUG_INFO, + "%a: address=0x%lx length=0x%lx type=0x%x name=%s\n", + __func__, + IgvmData->Address, + IgvmData->Length, + IgvmData->DataType, + Name + )); + } + } + + if (!mPK) { + DEBUG ((DEBUG_INFO, "%a: missing: PK\n", __func__)); + return EFI_NOT_FOUND; + } + + if (!mKEK) { + DEBUG ((DEBUG_INFO, "%a: missing: KEK\n", __func__)); + return EFI_NOT_FOUND; + } + + if (!mDb) { + DEBUG ((DEBUG_INFO, "%a: missing: db\n", __func__)); + return EFI_NOT_FOUND; + } + + if (!mDbx) { + DEBUG ((DEBUG_INFO, "%a: missing: dbx\n", __func__)); + return EFI_NOT_FOUND; + } + + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +IgvmSecureBootSetVariable ( + IN CHAR16 *Name, + IN EFI_GUID *Guid, + EFI_IGVM_DATA_HOB *Hob + ) +{ + EFI_STATUS Status; + UINT64 Length = Hob->Length; + VOID *Data = (VOID *)(UINTN)Hob->Address; + UINT32 Attributes = (EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS | + EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); + + Status = gRT->SetVariable (Name, Guid, Attributes, Length, Data); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: set %s: %r\n", __func__, Name, Status)); + } + + return Status; +} + +EFI_STATUS +EFIAPI +IgvmSecureBootCustomMode ( + UINT8 Value + ) +{ + EFI_STATUS Status; + + Status = gRT->SetVariable ( + EFI_CUSTOM_MODE_NAME, + &gEfiCustomModeEnableGuid, + (EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS), + sizeof (Value), + &Value + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: %a CustomMode: %r\n", + __func__, + Value ? "enable" : "disable", + Status + )); + } + + return Status; +} + +BOOLEAN +EFIAPI +IgvmSecureBootIsConfigured ( + VOID + ) +{ + EFI_STATUS Status; + BOOLEAN Result; + UINTN Size; + + Status = gRT->GetVariable ( + L"PK", + &gEfiGlobalVariableGuid, + NULL, + &Size, + NULL + ); + + if (Status == EFI_NOT_FOUND) { + Result = FALSE; + } else { + Result = TRUE; + } + + DEBUG ((DEBUG_INFO, "%a: Result=%a\n", __func__, Result ? "Yes" : "No")); + return Result; +} + +EFI_STATUS +EFIAPI +IgvmSecureBootDxeEntrypoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + UINT64 CcAttr; + + CcAttr = PcdGet64 (PcdConfidentialComputingGuestAttr); + + if (!CcAttr) { + /* + * The design idea is that the pages containing the HOBs and the EFI + * security databases are part of the launch measurement of a confidential + * VM. This way the launch measurement will not only prove the guest runs + * the firmware code it is supposed to run, but also prove secure boot is + * configured the way it is supposed to be. + * + * Any code loaded by the firmware will be subject to standard secure boot + * verification: + * - Option one is to use code signing and add the x509 vertificates to + * 'db' (and revocation list to 'dbx'), which is the typical setup in + * non-confidential VMs. + * - More strict option two is to only allow specific efi binaries by + * adding the sha256 authenticode hashes to 'db'. + * + * This workflow can only work in confidential VMs, so error out otherwise. + */ + DEBUG ((DEBUG_ERROR, "%a: ERROR: not running in Confidential VM\n", __func__)); + return EFI_UNSUPPORTED; + } + + if (IgvmSecureBootIsConfigured ()) { + DEBUG ((DEBUG_ERROR, "%a: secure boot is already configured.\n", __func__)); + return EFI_ALREADY_STARTED; + } + + Status = IgvmSecureBootFindBlobs (); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = IgvmSecureBootSetVariable (L"dbx", &gEfiImageSecurityDatabaseGuid, mDbx); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = IgvmSecureBootSetVariable (L"db", &gEfiImageSecurityDatabaseGuid, mDb); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = IgvmSecureBootSetVariable (L"KEK", &gEfiGlobalVariableGuid, mKEK); + if (EFI_ERROR (Status)) { + return Status; + } + + // allow setting a platform key (PK) which is not self-signed + Status = IgvmSecureBootCustomMode (TRUE); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = IgvmSecureBootSetVariable (L"PK", &gEfiGlobalVariableGuid, mPK); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = IgvmSecureBootCustomMode (FALSE); + if (EFI_ERROR (Status)) { + return Status; + } + + DEBUG ((DEBUG_INFO, "%a: secure boot setup complete\n", __func__)); + return EFI_REQUEST_UNLOAD_IMAGE; +} diff --git a/OvmfPkg/IgvmSecureBootDxe/IgvmSecureBootDxe.inf b/OvmfPkg/IgvmSecureBootDxe/IgvmSecureBootDxe.inf new file mode 100644 index 000000000000..be3c8ce0ecdd --- /dev/null +++ b/OvmfPkg/IgvmSecureBootDxe/IgvmSecureBootDxe.inf @@ -0,0 +1,43 @@ +## @file +# Enroll secure boot variables passed in via IGVM +# +# Copyright (c) 2025, Red Hat Inc. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 1.27 + BASE_NAME = IgvmSecureBootDxe + FILE_GUID = 12b8373f-e3df-4851-aa32-77d3fbb77de3 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = IgvmSecureBootDxeEntrypoint + +[Sources] + IgvmSecureBootDxe.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + OvmfPkg/OvmfPkg.dec + SecurityPkg/SecurityPkg.dec + +[LibraryClasses] + BaseLib + DebugLib + HobLib + UefiDriverEntryPoint + +[Pcd] + gEfiMdePkgTokenSpaceGuid.PcdConfidentialComputingGuestAttr + +[Guids] + gEfiCustomModeEnableGuid + gEfiGlobalVariableGuid + gEfiIgvmDataHobGuid + gEfiImageSecurityDatabaseGuid + +[Depex] + gEfiVariableWriteArchProtocolGuid diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index 8e3cea72f820..258093f8a5cf 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -1029,6 +1029,7 @@ !if $(SECURE_BOOT_ENABLE) == TRUE SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf + OvmfPkg/IgvmSecureBootDxe/IgvmSecureBootDxe.inf OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.inf !endif diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf index c241a6d3dc7f..3eec3145adf6 100644 --- a/OvmfPkg/OvmfPkgX64.fdf +++ b/OvmfPkg/OvmfPkgX64.fdf @@ -221,6 +221,7 @@ INF OvmfPkg/VirtioKeyboardDxe/VirtioKeyboard.inf !if $(SECURE_BOOT_ENABLE) == TRUE INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf + INF OvmfPkg/IgvmSecureBootDxe/IgvmSecureBootDxe.inf !endif INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf From 8c50ce60c4be1f82637ac741262f4ecdb9e79a88 Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Mon, 4 Aug 2025 11:14:14 +0100 Subject: [PATCH 0624/1172] MdePkg/AArch64: Add LPA2 related constants Add constants required for LPA2 (52-bit virtual addressing) support. Signed-off-by: Sarah Walker [ardb: touchup for uncrustify] --- MdePkg/Include/AArch64/AArch64.h | 9 +++++++-- MdePkg/Include/AArch64/AArch64Mmu.h | 16 +++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/MdePkg/Include/AArch64/AArch64.h b/MdePkg/Include/AArch64/AArch64.h index a2c554383705..00b058fb2a6c 100644 --- a/MdePkg/Include/AArch64/AArch64.h +++ b/MdePkg/Include/AArch64/AArch64.h @@ -1,7 +1,7 @@ /** @file Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
    - Copyright (c) 2011 - 2021, Arm Limited. All rights reserved.
    + Copyright (c) 2011 - 2025, Arm Limited. All rights reserved.
    SPDX-License-Identifier: BSD-2-Clause-Patent @@ -26,7 +26,12 @@ #define AARCH64_CPTR_RES1 0x33ff #define AARCH64_CPTR_DEFAULT AARCH64_CPTR_RES1 -// ID_AA64MMFR1 - AArch64 Memory Model Feature Register 0 definitions +// ID_AA64MMFR0 - AArch64 Memory Model Feature Register 0 definitions +#define AARCH64_MMFR0_TGRAN4_52BITS (0x1UL << 28) +#define AARCH64_MMFR0_TGRAN4_FIELD (28) +#define AARCH64_MMFR0_TGRAN4_MASK (0xFUL << AARCH64_MMFR0_TGRAN4_FIELD) + +// ID_AA64MMFR1 - AArch64 Memory Model Feature Register 1 definitions #define AARCH64_MMFR1_VH (0xF << 8) // ID_AA64PFR0 - AArch64 Processor Feature Register 0 definitions diff --git a/MdePkg/Include/AArch64/AArch64Mmu.h b/MdePkg/Include/AArch64/AArch64Mmu.h index 763dc53908e2..765ab540a00e 100644 --- a/MdePkg/Include/AArch64/AArch64Mmu.h +++ b/MdePkg/Include/AArch64/AArch64Mmu.h @@ -1,6 +1,6 @@ /** @file * -* Copyright (c) 2011-2021, Arm Limited. All rights reserved.
    +* Copyright (c) 2011-2025, Arm Limited. All rights reserved.
    * * SPDX-License-Identifier: BSD-2-Clause-Patent * @@ -48,6 +48,9 @@ #define TT_ADDRESS_MASK_BLOCK_ENTRY (0xFFFFFFFFFULL << 12) #define TT_ADDRESS_MASK_DESCRIPTION_TABLE (0xFFFFFFFFFULL << 12) +#define TT_ADDRESS_MASK_BLOCK_ENTRY_LPA2 (0x3FFFFFFFFFULL << 12) +#define TT_ADDRESS_MASK_DESCRIPTION_TABLE_LPA2 (0x3FFFFFFFFFULL << 12) + #define TT_TYPE_MASK 0x3 #define TT_TYPE_TABLE_ENTRY 0x3 #define TT_TYPE_BLOCK_ENTRY 0x1 @@ -69,11 +72,15 @@ #define TT_AF BIT10 #define TT_NG BIT11 +// Valid for !FEAT_LPA2 (52-bit output address) #define TT_SH_NON_SHAREABLE (0x0 << 8) #define TT_SH_OUTER_SHAREABLE (0x2 << 8) #define TT_SH_INNER_SHAREABLE (0x3 << 8) #define TT_SH_MASK (0x3 << 8) +// Valid for FEAT_LPA2 (52-bit output address) +#define TT_UPPER_ADDRESS_MASK (0x3 << 8) + #define TT_PXN_MASK BIT53 #define TT_UXN_MASK BIT54 // EL1&0 #define TT_XN_MASK BIT54 // EL2 / EL3 @@ -101,6 +108,7 @@ #define TCR_PS_4TB (3UL << 16) #define TCR_PS_16TB (4UL << 16) #define TCR_PS_256TB (5UL << 16) +#define TCR_PS_4PB (6UL << 16) #define TCR_TG0_4KB (0UL << 14) #define TCR_TG1_4KB (2UL << 30) @@ -111,6 +119,9 @@ #define TCR_IPS_4TB (3ULL << 32) #define TCR_IPS_16TB (4ULL << 32) #define TCR_IPS_256TB (5ULL << 32) +#define TCR_IPS_4PB (6ULL << 32) + +#define TCR_IPS_MASK (7ULL << 32) #define TCR_EPD1 (1UL << 23) @@ -118,6 +129,8 @@ #define TTBR_ASID_MASK (0xFF << TTBR_ASID_FIELD) #define TTBR_BADDR_MASK (0xFFFFFFFFFFFF ) // The width of this field depends on the values in TxSZ. Addr occupies bottom 48bits +#define TCR_DS (1UL << 59) + #define TCR_EL1_T0SZ_FIELD (0) #define TCR_EL1_EPD0_FIELD (7) #define TCR_EL1_IRGN0_FIELD (8) @@ -186,6 +199,7 @@ #define TCR_PASZ_42BITS_4TB (0x3UL) #define TCR_PASZ_44BITS_16TB (0x4UL) #define TCR_PASZ_48BITS_256TB (0x5UL) +#define TCR_PASZ_52BITS_4PB (0x6UL) // The value written to the T*SZ fields are defined as 2^(64-T*SZ). So a 39Bit // Virtual address range for 512GB of virtual space sets T*SZ to 25 From c5e4e7e78a5767e4db548919a60241684c4dd9a5 Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Fri, 8 Aug 2025 10:23:18 +0100 Subject: [PATCH 0625/1172] MdePkg/ArmLib: Add prototype for 52-bit VA support helper Signed-off-by: Sarah Walker --- MdePkg/Include/Library/ArmLib.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/MdePkg/Include/Library/ArmLib.h b/MdePkg/Include/Library/ArmLib.h index d0789955419d..10c214fb17c6 100644 --- a/MdePkg/Include/Library/ArmLib.h +++ b/MdePkg/Include/Library/ArmLib.h @@ -755,4 +755,17 @@ ArmHasEte ( VOID ); +/** + Checks whether the CPU supports 52-bit addressing with 4KiB translation + granule size + + @retval TRUE 52-bit addressing is implemented. + @retval FALSE 52-bit addressing is not implemented. +**/ +BOOLEAN +EFIAPI +ArmHas52BitTgran4 ( + VOID + ); + #endif // ARM_LIB_H_ From 3916260189b7401deaf32d009ab6c7efe1b7ecc0 Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Fri, 8 Aug 2025 10:23:58 +0100 Subject: [PATCH 0626/1172] ArmPkg/ArmLib: Add 52-bit VA support helper (LPA2) Signed-off-by: Sarah Walker --- ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c b/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c index af91c9564e6a..a91879e1c9fc 100644 --- a/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c +++ b/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c @@ -109,3 +109,23 @@ ArmHasEte ( // The ID_AA64DFR0_EL1.TraceVer field identifies the presence of FEAT_ETE. return ((ArmReadIdAA64Dfr0 () & AARCH64_DFR0_TRACEVER) != 0); } + +/** + Checks whether the CPU supports 52-bit addressing with 4KiB translation + granule size + + @retval TRUE 52-bit addressing is implemented. + @retval FALSE 52-bit addressing is not implemented. +**/ +BOOLEAN +EFIAPI +ArmHas52BitTgran4 ( + VOID + ) +{ + UINT64 Mmfr0; + + Mmfr0 = ArmReadIdAA64Mmfr0 (); + + return ((Mmfr0 & AARCH64_MMFR0_TGRAN4_MASK) == AARCH64_MMFR0_TGRAN4_52BITS); +} From 6e01bfcca25f950e73e14678690ced8923c6deaa Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Mon, 4 Aug 2025 11:15:18 +0100 Subject: [PATCH 0627/1172] ArmPkg/CpuDxe: Add support for signed page table levels When 52-bit virtual addressing and 4k pages are in use, the top page table level is level -1. Signed-off-by: Sarah Walker --- ArmPkg/Drivers/CpuDxe/AArch64/Mmu.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ArmPkg/Drivers/CpuDxe/AArch64/Mmu.c b/ArmPkg/Drivers/CpuDxe/AArch64/Mmu.c index ff14c2f814b2..6ba7296a98b7 100644 --- a/ArmPkg/Drivers/CpuDxe/AArch64/Mmu.c +++ b/ArmPkg/Drivers/CpuDxe/AArch64/Mmu.c @@ -2,7 +2,7 @@ Copyright (c) 2009, Hewlett-Packard Company. All rights reserved.
    Portions copyright (c) 2010, Apple Inc. All rights reserved.
    -Portions copyright (c) 2011-2021, Arm Limited. All rights reserved.
    +Portions copyright (c) 2011-2025, Arm Limited. All rights reserved.
    Copyright (c) 2017, Intel Corporation. All rights reserved.
    SPDX-License-Identifier: BSD-2-Clause-Patent @@ -30,12 +30,12 @@ STATIC VOID GetRootTranslationTableInfo ( IN UINTN T0SZ, - OUT UINTN *RootTableLevel, + OUT INTN *RootTableLevel, OUT UINTN *RootTableEntryCount ) { - *RootTableLevel = (T0SZ - MIN_T0SZ) / BITS_PER_LEVEL; - *RootTableEntryCount = TT_ENTRY_COUNT >> (T0SZ - MIN_T0SZ) % BITS_PER_LEVEL; + *RootTableLevel = (INTN)(T0SZ - MIN_T0SZ) / BITS_PER_LEVEL; + *RootTableEntryCount = TT_ENTRY_COUNT >> (INTN)(T0SZ - MIN_T0SZ) % BITS_PER_LEVEL; } /** @@ -167,7 +167,7 @@ UINT64 GetNextEntryAttribute ( IN UINT64 *TableAddress, IN UINTN EntryCount, - IN UINTN TableLevel, + IN INTN TableLevel, IN UINT64 BaseAddress, IN OUT UINT64 *PrevEntryAttribute, IN OUT UINT64 *StartGcdRegion @@ -273,7 +273,7 @@ SyncCacheConfig ( EFI_STATUS Status; UINT64 PageAttribute; UINT64 *FirstLevelTableAddress; - UINTN TableLevel; + INTN TableLevel; UINTN TableCount; UINTN NumberOfDescriptors; EFI_GCD_MEMORY_SPACE_DESCRIPTOR *MemorySpaceMap; @@ -419,7 +419,7 @@ EfiAttributeToArmAttribute ( EFI_STATUS GetMemoryRegionRec ( IN UINT64 *TranslationTable, - IN UINTN TableLevel, + IN INTN TableLevel, IN UINT64 *LastBlockEntry, IN OUT UINTN *BaseAddress, OUT UINTN *RegionLength, @@ -520,7 +520,7 @@ GetMemoryRegion ( { EFI_STATUS Status; UINT64 *TranslationTable; - UINTN TableLevel; + INTN TableLevel; UINTN EntryCount; UINTN T0SZ; From 5ec21149a773a6b34ff151e1d9e76bed0f623916 Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Mon, 29 Sep 2025 15:01:28 +0100 Subject: [PATCH 0628/1172] ArmPkg/CpuDxe: Add support for LPA2 page table entry format Add support for decoding the output address format in page table entries when LPA2 is in use. Signed-off-by: Sarah Walker --- ArmPkg/Drivers/CpuDxe/AArch64/Mmu.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/ArmPkg/Drivers/CpuDxe/AArch64/Mmu.c b/ArmPkg/Drivers/CpuDxe/AArch64/Mmu.c index 6ba7296a98b7..e2a48cccaae2 100644 --- a/ArmPkg/Drivers/CpuDxe/AArch64/Mmu.c +++ b/ArmPkg/Drivers/CpuDxe/AArch64/Mmu.c @@ -18,6 +18,20 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #define MIN_T0SZ 16 #define BITS_PER_LEVEL 9 +STATIC +UINT64 +GetOutputAddress ( + IN UINT64 Entry, + IN BOOLEAN Lpa2Enabled + ) +{ + if (Lpa2Enabled) { + return (Entry & TT_ADDRESS_MASK_DESCRIPTION_TABLE_LPA2) | ((Entry & TT_UPPER_ADDRESS_MASK) << (50 - 8)); + } else { + return Entry & TT_ADDRESS_MASK_DESCRIPTION_TABLE; + } +} + /** Parses T0SZ to determine the level and number of entries at the root of the translation table. @@ -126,8 +140,9 @@ RegionAttributeToGcdAttribute ( STATIC UINT64 GetFirstPageAttribute ( - IN UINT64 *FirstLevelTableAddress, - IN UINTN TableLevel + IN UINT64 *FirstLevelTableAddress, + IN UINTN TableLevel, + IN BOOLEAN Lpa2Enabled ) { UINT64 FirstEntry; @@ -139,7 +154,7 @@ GetFirstPageAttribute ( // Only valid for Levels 0, 1 and 2 // Get the attribute of the subsequent table - return GetFirstPageAttribute ((UINT64 *)(FirstEntry & TT_ADDRESS_MASK_DESCRIPTION_TABLE), TableLevel + 1); + return GetFirstPageAttribute ((UINT64 *)GetOutputAddress (FirstEntry, Lpa2Enabled), TableLevel + 1, Lpa2Enabled); } else if (((FirstEntry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY) || ((TableLevel == 3) && ((FirstEntry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY_LEVEL3))) { @@ -226,7 +241,7 @@ GetNextEntryAttribute ( // Increase the level number and scan the sub-level table GetNextEntryAttribute ( - (UINT64 *)(Entry & TT_ADDRESS_MASK_DESCRIPTION_TABLE), + (UINT64 *)GetOutputAddress (Entry, ArmGetTCR () & TCR_DS), TT_ENTRY_COUNT, TableLevel + 1, (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL (TableLevel))), @@ -314,7 +329,7 @@ SyncCacheConfig ( GetRootTranslationTableInfo (T0SZ, &TableLevel, &TableCount); // First Attribute of the Page Tables - PageAttribute = GetFirstPageAttribute (FirstLevelTableAddress, TableLevel); + PageAttribute = GetFirstPageAttribute (FirstLevelTableAddress, TableLevel, ArmGetTCR () & TCR_DS); // We scan from the start of the memory map (ie: at the address 0x0) BaseAddressGcdRegion = 0x0; @@ -443,7 +458,7 @@ GetMemoryRegionRec ( EntryType = *BlockEntry & TT_TYPE_MASK; if ((TableLevel < 3) && (EntryType == TT_TYPE_TABLE_ENTRY)) { - NextTranslationTable = (UINT64 *)(*BlockEntry & TT_ADDRESS_MASK_DESCRIPTION_TABLE); + NextTranslationTable = (UINT64 *)GetOutputAddress (*BlockEntry, ArmGetTCR () & TCR_DS); // The entry is a page table, so we go to the next level Status = GetMemoryRegionRec ( From 90771630bfe123de8e4bacc96f98ffe4d8308153 Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Mon, 4 Aug 2025 11:18:20 +0100 Subject: [PATCH 0629/1172] UefiCpuPkg/ArmMmuLib: Add support for LPA2 Add support for LPA2 (52-bit physical addressing). Signed-off-by: Sarah Walker --- .../Library/ArmMmuLib/AArch64/ArmMmuLibCore.c | 117 ++++++++++++++---- 1 file changed, 90 insertions(+), 27 deletions(-) diff --git a/UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c b/UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c index 45b7c8134165..568972902701 100644 --- a/UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c +++ b/UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c @@ -1,7 +1,7 @@ /** @file * File managing the MMU for ARMv8 architecture * -* Copyright (c) 2011-2020, ARM Limited. All rights reserved. +* Copyright (c) 2011-2025, ARM Limited. All rights reserved. * Copyright (c) 2016, Linaro Limited. All rights reserved. * Copyright (c) 2017, Intel Corporation. All rights reserved.
    * @@ -91,9 +91,41 @@ ArmMemoryAttributeToPageAttribute ( } } +// T0SZ can be below MIN_T0SZ when LPA2 is in use, meaning the page table starts at level -1 #define MIN_T0SZ 16 #define BITS_PER_LEVEL 9 -#define MAX_VA_BITS 48 +#define MAX_VA_BITS 52 + +STATIC +VOID +SetOutputAddress ( + IN UINTN *Entry, + IN UINTN Address, + IN BOOLEAN Lpa2Enabled + ) +{ + if (Lpa2Enabled) { + *Entry &= ~(TT_ADDRESS_MASK_BLOCK_ENTRY_LPA2 | TT_UPPER_ADDRESS_MASK); + *Entry |= ((UINTN)Address & TT_ADDRESS_MASK_BLOCK_ENTRY_LPA2) | (((UINTN)Address >> 50) << 8); + } else { + *Entry &= ~TT_ADDRESS_MASK_BLOCK_ENTRY; + *Entry |= (Address & TT_ADDRESS_MASK_BLOCK_ENTRY); + } +} + +STATIC +UINT64 +GetOutputAddress ( + IN UINT64 Entry, + IN BOOLEAN Lpa2Enabled + ) +{ + if (Lpa2Enabled) { + return (Entry & TT_ADDRESS_MASK_BLOCK_ENTRY_LPA2) | ((Entry & TT_UPPER_ADDRESS_MASK) << (50 - 8)); + } else { + return Entry & TT_ADDRESS_MASK_BLOCK_ENTRY; + } +} STATIC UINTN @@ -105,12 +137,12 @@ GetRootTableEntryCount ( } STATIC -UINTN +INTN GetRootTableLevel ( IN UINTN T0SZ ) { - return (T0SZ - MIN_T0SZ) / BITS_PER_LEVEL; + return (INTN)(T0SZ - MIN_T0SZ) / BITS_PER_LEVEL; } STATIC @@ -159,8 +191,9 @@ ReplaceTableEntry ( STATIC VOID FreePageTablesRecursive ( - IN UINT64 *TranslationTable, - IN UINTN Level + IN UINT64 *TranslationTable, + IN UINTN Level, + IN BOOLEAN Lpa2Enabled ) { UINTN Index; @@ -171,9 +204,12 @@ FreePageTablesRecursive ( for (Index = 0; Index < TT_ENTRY_COUNT; Index++) { if ((TranslationTable[Index] & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY) { FreePageTablesRecursive ( - (VOID *)(UINTN)(TranslationTable[Index] & - TT_ADDRESS_MASK_BLOCK_ENTRY), - Level + 1 + (VOID *)GetOutputAddress ( + TranslationTable[Index], + Lpa2Enabled + ), + Level + 1, + Lpa2Enabled ); } } @@ -222,8 +258,10 @@ UpdateRegionMappingRecursive ( IN UINT64 AttributeSetMask, IN UINT64 AttributeClearMask, IN UINT64 *PageTable, - IN UINTN Level, - IN BOOLEAN TableIsLive + IN INTN Level, + IN BOOLEAN IsRootTable, + IN BOOLEAN TableIsLive, + IN BOOLEAN Lpa2Enabled ) { UINTN BlockShift; @@ -316,7 +354,9 @@ UpdateRegionMappingRecursive ( 0, TranslationTable, Level + 1, - FALSE + FALSE, + FALSE, + Lpa2Enabled ); if (EFI_ERROR (Status)) { // @@ -331,7 +371,7 @@ UpdateRegionMappingRecursive ( NextTableIsLive = FALSE; } else { - TranslationTable = (VOID *)(UINTN)(*Entry & TT_ADDRESS_MASK_BLOCK_ENTRY); + TranslationTable = (VOID *)GetOutputAddress (*Entry, Lpa2Enabled); NextTableIsLive = TableIsLive; } @@ -345,7 +385,9 @@ UpdateRegionMappingRecursive ( AttributeClearMask, TranslationTable, Level + 1, - NextTableIsLive + FALSE, + NextTableIsLive, + Lpa2Enabled ); if (EFI_ERROR (Status)) { if (!IsTableEntry (*Entry, Level)) { @@ -356,14 +398,16 @@ UpdateRegionMappingRecursive ( // possible for existing table entries, since we cannot revert the // modifications we made to the subhierarchy it represents.) // - FreePageTablesRecursive (TranslationTable, Level + 1); + FreePageTablesRecursive (TranslationTable, Level + 1, Lpa2Enabled); } return Status; } if (!IsTableEntry (*Entry, Level)) { - EntryValue = (UINTN)TranslationTable | TT_TYPE_TABLE_ENTRY; + EntryValue = TT_TYPE_TABLE_ENTRY; + SetOutputAddress (&EntryValue, (UINTN)TranslationTable, Lpa2Enabled); + ReplaceTableEntry ( Entry, EntryValue, @@ -373,8 +417,9 @@ UpdateRegionMappingRecursive ( ); } } else { - EntryValue = (*Entry & AttributeClearMask) | AttributeSetMask; - EntryValue |= RegionStart; + EntryValue = (*Entry & AttributeClearMask) | AttributeSetMask; + // Below clears shareability bits when LPA2 is in use + SetOutputAddress (&EntryValue, RegionStart, Lpa2Enabled); EntryValue |= (Level == 3) ? TT_TYPE_BLOCK_ENTRY_LEVEL3 : TT_TYPE_BLOCK_ENTRY; @@ -393,7 +438,8 @@ UpdateRegionMapping ( IN UINT64 AttributeSetMask, IN UINT64 AttributeClearMask, IN UINT64 *RootTable, - IN BOOLEAN TableIsLive + IN BOOLEAN TableIsLive, + IN BOOLEAN Lpa2Enabled ) { UINTN T0SZ; @@ -418,7 +464,9 @@ UpdateRegionMapping ( AttributeClearMask, RootTable, GetRootTableLevel (T0SZ), - TableIsLive + TRUE, + TableIsLive, + Lpa2Enabled ); } @@ -426,7 +474,8 @@ STATIC EFI_STATUS FillTranslationTable ( IN UINT64 *RootTable, - IN ARM_MEMORY_REGION_DESCRIPTOR *MemoryRegion + IN ARM_MEMORY_REGION_DESCRIPTOR *MemoryRegion, + IN BOOLEAN Lpa2Enabled ) { return UpdateRegionMapping ( @@ -435,7 +484,8 @@ FillTranslationTable ( ArmMemoryAttributeToPageAttribute (MemoryRegion->Attributes) | TT_AF, 0, RootTable, - FALSE + FALSE, + Lpa2Enabled ); } @@ -565,7 +615,8 @@ ArmSetMemoryAttributes ( PageAttributes, PageAttributeMask, ArmGetTTBR0BaseAddress (), - TRUE + TRUE, + ArmGetTCR () & TCR_DS ); } @@ -628,13 +679,15 @@ ArmConfigureMmu ( TCR |= TCR_PS_16TB; } else if (MaxAddress < SIZE_256TB) { TCR |= TCR_PS_256TB; + } else if ((MaxAddress < SIZE_4PB) && ArmHas52BitTgran4 ()) { + TCR |= TCR_PS_4PB | TCR_DS; } else { DEBUG (( DEBUG_ERROR, "ArmConfigureMmu: The MaxAddress 0x%lX is not supported by this MMU configuration.\n", MaxAddress )); - ASSERT (0); // Bigger than 48-bit memory space are not supported + ASSERT (0); // Bigger than 48/52-bit memory space are not supported return EFI_UNSUPPORTED; } } else { @@ -654,13 +707,15 @@ ArmConfigureMmu ( TCR |= TCR_IPS_16TB; } else if (MaxAddress < SIZE_256TB) { TCR |= TCR_IPS_256TB; + } else if ((MaxAddress < SIZE_4PB) && ArmHas52BitTgran4 ()) { + TCR |= TCR_IPS_4PB | TCR_DS; } else { DEBUG (( DEBUG_ERROR, "ArmConfigureMmu: The MaxAddress 0x%lX is not supported by this MMU configuration.\n", MaxAddress )); - ASSERT (0); // Bigger than 48-bit memory space are not supported + ASSERT (0); // Bigger than 48/52-bit memory space are not supported return EFI_UNSUPPORTED; } } @@ -709,7 +764,7 @@ ArmConfigureMmu ( ZeroMem (TranslationTable, RootTableEntryCount * sizeof (UINT64)); while (MemoryTable->Length != 0) { - Status = FillTranslationTable (TranslationTable, MemoryTable); + Status = FillTranslationTable (TranslationTable, MemoryTable, TCR & TCR_DS); if (EFI_ERROR (Status)) { goto FreeTranslationTable; } @@ -730,7 +785,15 @@ ArmConfigureMmu ( MAIR_ATTR (TT_ATTR_INDX_MEMORY_WRITE_BACK, MAIR_ATTR_NORMAL_MEMORY_WRITE_BACK) ); - ArmSetTTBR0 (TranslationTable); + if ((TCR & TCR_IPS_MASK) == TCR_IPS_4PB) { + ArmSetTTBR0 ( + (VOID *) + (((UINTN)TranslationTable & 0xffffffffffc0) | + (((UINTN)TranslationTable >> 48) << 2)) + ); + } else { + ArmSetTTBR0 (TranslationTable); + } if (!ArmMmuEnabled ()) { ArmDisableAlignmentCheck (); From d3a64baf4b6706367c30a4886c01e95589861c9f Mon Sep 17 00:00:00 2001 From: Marc Chen Date: Tue, 30 Sep 2025 13:04:56 +0800 Subject: [PATCH 0630/1172] NetworkPkg/UefiPxeBcDxe: Add buffer check before reporting status code When PxeBcLoadBootFile() fails, it reports a status code to notify listeners (such as telemetry/SEL logging drivers) about the error. However, the current implementation reports the status code for all error conditions, including benign cases, such as where the caller passes Buffer == NULL with EFI_BUFFER_TOO_SMALL to query the required size. This causes false positive error reports in telemetry systems, as EFI_BUFFER_TOO_SMALL with Buffer == NULL is an expected and normal operation for size queries, not an actual error condition. The PXE-E05 error message is already correctly guarded with the condition "(Status == EFI_BUFFER_TOO_SMALL) && (Buffer != NULL)", but the status code reporting was unconditional. Add a buffer null check before REPORT_STATUS_CODE_WITH_EXTENDED_DATA to ensure status codes are only reported for actual errors: - Report when Status != EFI_BUFFER_TOO_SMALL (all other errors) - Report when Status == EFI_BUFFER_TOO_SMALL AND Buffer != NULL (PXE-E05) - Skip when Status == EFI_BUFFER_TOO_SMALL AND Buffer == NULL (size query) This prevents spurious error logs while maintaining proper error reporting for genuine failures including PXE-E05, PXE-E07, PXE-E09, PXE-E99, and all other error conditions. Signed-off-by: Marc Chen --- NetworkPkg/UefiPxeBcDxe/PxeBcBoot.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcBoot.c b/NetworkPkg/UefiPxeBcDxe/PxeBcBoot.c index 0af791dc5f58..431a5effeae7 100644 --- a/NetworkPkg/UefiPxeBcDxe/PxeBcBoot.c +++ b/NetworkPkg/UefiPxeBcDxe/PxeBcBoot.c @@ -1268,12 +1268,19 @@ PxeBcLoadBootFile ( AsciiPrint ("\n PXE-E99: Unexpected network error.\n"); } - REPORT_STATUS_CODE_WITH_EXTENDED_DATA ( - EFI_ERROR_CODE, - (EFI_STATUS_CODE_VALUE)(EFI_IO_BUS_IP_NETWORK | EFI_OEM_SPECIFIC | ((EFI_STATUS_CODE_VALUE)(Status & 0x1F))), - (VOID *)&(PxeBcMode->UsingIpv6), - sizeof (PxeBcMode->UsingIpv6) - ); + // + // Report status code for all errors printed above. + // Skip reporting when Buffer is NULL and Status is EFI_BUFFER_TOO_SMALL, + // as this is an expected size query, not an error. + // + if ((Status != EFI_BUFFER_TOO_SMALL) || (Buffer != NULL)) { + REPORT_STATUS_CODE_WITH_EXTENDED_DATA ( + EFI_ERROR_CODE, + (EFI_STATUS_CODE_VALUE)(EFI_IO_BUS_IP_NETWORK | EFI_OEM_SPECIFIC | ((EFI_STATUS_CODE_VALUE)(Status & 0x1F))), + (VOID *)&(PxeBcMode->UsingIpv6), + sizeof (PxeBcMode->UsingIpv6) + ); + } return Status; } From bfbd5d70e858f24b900555d51de5d2b293e98b79 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Fri, 26 Sep 2025 10:58:33 -0400 Subject: [PATCH 0631/1172] .github/GitHub.py: Add output and env helpers Adds GitHub helper functions so other Python code can more cleanly set output and environment variables. Signed-off-by: Michael Kubacki --- .github/scripts/GitHub.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/.github/scripts/GitHub.py b/.github/scripts/GitHub.py index c6de620a05b5..5c0709e777b0 100644 --- a/.github/scripts/GitHub.py +++ b/.github/scripts/GitHub.py @@ -7,6 +7,7 @@ import git import logging +import os import re from collections import OrderedDict @@ -286,3 +287,35 @@ def add_reviewers_to_pr( pr.create_review_request(reviewers=new_pr_reviewers) return new_pr_reviewers + + +def set_github_output(key: str, value: str): + """Set a GitHub workflow output variable. + + This function writes to the GITHUB_OUTPUT file to set an output variable + that can be used by subsequent steps in a GitHub workflow. + + Args: + key (str): The output variable name. + value (str): The output variable value. + """ + github_output = os.environ.get('GITHUB_OUTPUT') + if github_output: + with open(github_output, 'a') as f: + f.write(f"{key}={value}\n") + + +def set_github_env(key: str, value: str): + """Set a GitHub workflow environment variable. + + This function writes to the GITHUB_ENV file to set an environment variable + that will be available to subsequent steps in a GitHub workflow. + + Args: + key (str): The environment variable name. + value (str): The environment variable value. + """ + github_env = os.environ.get('GITHUB_ENV') + if github_env: + with open(github_env, 'a') as f: + f.write(f"{key}< Date: Wed, 6 Aug 2025 17:11:47 -0400 Subject: [PATCH 0632/1172] .github/workflows: Add PR formatting validator This workflow runs when GitHub PRs are modified (edited, opened, reopened, and synchronized) to perform basic validation of the PR title and description. Right now, this includes: - Checking that the PR title is not empty - Checking that the PR body is not empty - Checking that the PR body meets the minimum text length. Where the minimum text length is defined to be the number of characters in the PR template with empty sections - Checking that PR template placeholder do not remain in the PR description If a check fails, a GitHub comment will be left on the PR and a PR status check failure will be present on the PR until the issue is resolved. Upon future runs of the workflow, existing PR validation message contents are hashed and compared to a new message that may potentially be posted. If the same comment is already posted in the PR, it is not posted again. Signed-off-by: Michael Kubacki --- .github/scripts/validate_pr_formatting.py | 348 ++++++++++++++++++ .../pull-request-formatting-validator.yml | 77 ++++ 2 files changed, 425 insertions(+) create mode 100644 .github/scripts/validate_pr_formatting.py create mode 100644 .github/workflows/pull-request-formatting-validator.yml diff --git a/.github/scripts/validate_pr_formatting.py b/.github/scripts/validate_pr_formatting.py new file mode 100644 index 000000000000..eacba68ed032 --- /dev/null +++ b/.github/scripts/validate_pr_formatting.py @@ -0,0 +1,348 @@ +#!/usr/bin/env python3 +# +# Pull Request Formatting Validator +# +# This script validates basic pull request formatting requirements and can +# optionally post validation comments. +# +# Validation Checks Performed: +# +# 1. PR Title Validation: +# - Ensures the PR title is not empty or whitespace-only +# - Failure comment: "⚠️ Pull request title cannot be empty." +# +# 2. PR Body Validation: +# - Ensures the PR body is not empty, null, or whitespace-only +# - Ensures the PR body meets minimum length requirement (147 characters) +# - The minimum length is based on the PR template with empty sections +# - Empty body failure comment: "⚠️ Add a meaningful pull request +# description using the PR template." +# - Short body failure comment: "⚠️ Provide a more detailed pull request +# description using the PR template (current: X characters)." +# +# 3. PR Template Line Validation: +# - Checks that template placeholder lines are removed from the PR +# description +# - Based on present template lines in the PR template file +# - Failure comment: "⚠️ Remove the following template lines from your +# PR description:" followed by list of remaining template lines +# +# The same comment (based on a body content hash) will not be posted multiple +# times to avoid spamming the PR with duplicate messages. +# +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: BSD-2-Clause-Patent +# + +import base64 +import hashlib +import os +import re +import sys +from typing import List, Optional + +import GitHub + + +class PRValidator: + """Logic for validating pull request formatting.""" + + VALIDATION_HEADER = "Pull Request Formatting Issues" + MIN_BODY_LENGTH = 147 + TEMPLATE_LINE_PATTERN = r'^<_.*_>$' + GITHUB_PR_TEMPLATE_PATH = ".github/pull_request_template.md" + + @property + def GITHUB_PR_TEMPLATE_URL(self) -> str: + """The PR template URL path for the given PR validator instance.""" + return (f"https://github.com/{self.owner}/{self.repo}/blob/master/" + f"{self.GITHUB_PR_TEMPLATE_PATH}") + + def __init__(self, github_token: str, owner: str, repo: str, + pr_number: int): + """Initialize the validator with GitHub context.""" + self.github_token = github_token + self.owner = owner + self.repo = repo + self.pr_number = pr_number + self.validation_messages: List[str] = [] + self.pr = None + + def fetch_pr_data(self) -> tuple[str, str]: + """Fetch PR title and body.""" + self.pr = GitHub._get_pr( + self.github_token, self.owner, self.repo, self.pr_number + ) + + if not self.pr: + print("::error title=Failed to get PR data!::" + "Could not fetch PR information") + sys.exit(1) + + title = self.pr.title or '' + body = self.pr.body or '' + + return title, body + + def fetch_template_content(self) -> Optional[str]: + """Fetch the PR template content if it exists.""" + try: + gh = GitHub._authenticate(self.github_token) + repo = gh.get_repo(f"{self.owner}/{self.repo}") + template_file = repo.get_contents(self.GITHUB_PR_TEMPLATE_PATH) + + # Decode from base64 + if hasattr(template_file, 'content'): + return base64.b64decode(template_file.content).decode('utf-8') + + except Exception: + # Template doesn't exist, so there is nothing to return + pass + + return None + + def validate_title(self, title: str) -> bool: + """Validate that the PR title is not empty.""" + if not title or not title.strip(): + self.validation_messages.append( + "⚠️ Pull request title cannot be empty.") + return False + return True + + def validate_body(self, body: str) -> bool: + """Validate PR body meets minimum requirements.""" + is_valid = True + + # Check if body is empty or just whitespace + if not body or body == "null" or not body.strip(): + self.validation_messages.append( + "⚠️ Add a meaningful pull request description using the " + f"[PR template]({self.GITHUB_PR_TEMPLATE_URL})." + ) + is_valid = False + elif len(body) < self.MIN_BODY_LENGTH: + self.validation_messages.append( + "⚠️ Provide a more detailed pull request description " + f"using the [PR template]({self.GITHUB_PR_TEMPLATE_URL}) " + f"(current: {len(body)} characters)." + ) + is_valid = False + + return is_valid + + def validate_template_lines(self, body: str, + template_content: str) -> bool: + """Check for leftover template lines in the PR body.""" + if not template_content: + return True + + # Find template lines that match the pattern + template_lines = [] + for line in template_content.splitlines(): + if re.match(self.TEMPLATE_LINE_PATTERN, line): + template_lines.append(line) + + if not template_lines: + return True + + # Check if any template lines are still in the PR body + found_template_lines = [] + body_lines = body.splitlines() + + for template_line in template_lines: + if template_line in body_lines: + found_template_lines.append(f"`{template_line}`") + + if found_template_lines: + self.validation_messages.append( + "⚠️ Remove the following template lines from your PR " + "description:\n" + "\n".join(found_template_lines) + ) + return False + + return True + + def validate_pr(self) -> bool: + """Run all validation checks and return whether PR is valid.""" + print("Fetching PR data...") + title, body = self.fetch_pr_data() + + print("Fetching template content...") + template_content = self.fetch_template_content() + + print("Running validation checks...") + title_valid = self.validate_title(title) + body_valid = self.validate_body(body) + template_valid = self.validate_template_lines( + body, template_content or '') + + return title_valid and body_valid and template_valid + + def post_validation_comment_with_dedup(self) -> bool: + """Post a validation comment if there are errors, avoiding duplicates. + + This function uses the existing GitHub.py infrastructure and adds + duplicate detection based on validation hash. + + Returns: + bool: True if comment was posted, False if skipped or failed + """ + if not self.validation_messages: + return False + + # Create comment body + messages_text = "\n".join(self.validation_messages) + comment_body = ( + f"## {self.VALIDATION_HEADER}\n\n" + f"{messages_text}\n\n" + f"Address these issues and the validation will automatically " + f"re-run when you update your pull request." + ) + + # Create an issue comment validation hash to detect duplicate messages + validation_hash = hashlib.sha256(messages_text.encode()).hexdigest() + comment_body_with_hash = ( + f"{comment_body}\n\n" + f"" + ) + + # Check if any existing comments have the same hash + try: + if not self.pr: + self.pr = GitHub._get_pr( + self.github_token, self.owner, self.repo, self.pr_number + ) + + if not self.pr: + print("::error title=Failed to get PR!::" + "Could not fetch PR for comment checking") + return False + + for comment in self.pr.get_issue_comments(): + if (self.VALIDATION_HEADER in comment.body and + f"validation-hash: {validation_hash}" in comment.body): + print(f"::notice title=Skipped Duplicate Comment::" + f"Validation comment already exists (hash: " + f"{validation_hash[:8]}...)") + return False + + except Exception as e: + print(f"::warning title=Comment Check Failed::" + f"Could not check for existing comments: {e}. " + f"Proceeding to post comment.") + + try: + GitHub.leave_pr_comment( + self.github_token, self.owner, self.repo, self.pr_number, + comment_body_with_hash + ) + print(f"::notice title=Posted Validation Comment::" + f"Comment posted with hash: {validation_hash[:8]}...") + return True + + except Exception as e: + print(f"::error title=Failed to Post Comment::" + f"Error posting validation comment: {e}") + return False + + +def post_validation_comment_standalone(): + """Standalone function for posting validation comments from env vars. + + This function can be called independently to post validation comments + when validation has already been performed and environment variables + are set with the validation results. + """ + # Get required environment variables + github_token = os.environ.get('GITHUB_TOKEN') + pr_number_str = os.environ.get('PR_NUMBER') + validation_header = os.environ.get('VALIDATION_HEADER') + validation_messages = os.environ.get('VALIDATION_MESSAGES') + repo_full_name = os.environ.get('GITHUB_REPOSITORY') + + if not all([github_token, pr_number_str, validation_header, + validation_messages, repo_full_name]): + print("::error title=Missing Environment Variables!::" + "Required: GITHUB_TOKEN, PR_NUMBER, VALIDATION_HEADER, " + "VALIDATION_MESSAGES, GITHUB_REPOSITORY") + return False + + try: + pr_number = int(pr_number_str) + except ValueError: + print(f"::error title=Invalid PR Number!::" + f"PR_NUMBER is invalid, got '{pr_number_str}'") + return False + + # Get the current owner/repo from GITHUB_REPOSITORY + try: + owner, repo = repo_full_name.split('/', 1) + except ValueError: + print(f"::error title=Invalid Repository Format!::" + f"GITHUB_REPOSITORY format is invalid: '{repo_full_name}'") + return False + + print(f"::debug title=Posting Validation Comment::" + f"PR #{pr_number} in {owner}/{repo}") + + validator = PRValidator(github_token, owner, repo, pr_number) + validator.validation_messages = validation_messages.split('\n') + + return validator.post_validation_comment_with_dedup() + + +def main(): + """Main entry point for the PR validation script.""" + # Check if we're being called to just post a comment + if len(sys.argv) > 1 and sys.argv[1] == '--post-comment': + success = post_validation_comment_standalone() + return 0 if success else 1 + + # Get required environment variables for validation + github_token = os.environ.get('GITHUB_TOKEN') + owner = os.environ.get('OWNER') + repo = os.environ.get('REPO') + pr_number_str = os.environ.get('PR_NUMBER') + + if not all([github_token, owner, repo, pr_number_str]): + print("::error title=Missing Environment Variables!::" + "Required: GITHUB_TOKEN, OWNER, REPO, PR_NUMBER") + sys.exit(1) + + try: + pr_number = int(pr_number_str) + except ValueError: + print(f"::error title=Invalid PR Number!::" + f"PR_NUMBER must be an integer, got '{pr_number_str}'") + sys.exit(1) + + validator = PRValidator(github_token, owner, repo, pr_number) + + print(f"Validating PR #{pr_number} in {owner}/{repo}") + + is_valid = validator.validate_pr() + + GitHub.set_github_output( + 'validation_error', 'false' if is_valid else 'true' + ) + + if not is_valid: + messages_text = "\n".join(validator.validation_messages) + GitHub.set_github_env('VALIDATION_MESSAGES', messages_text) + GitHub.set_github_env( + 'VALIDATION_HEADER', validator.VALIDATION_HEADER + ) + + print("\nPR formatting validation failed with the following issues:") + for message in validator.validation_messages: + print(f" {message}") + else: + print("\nPR formatting validation passed!") + + # Always return success (0) so outputs are set properly + # The workflow will check the validation_error output to determine failure + return 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/.github/workflows/pull-request-formatting-validator.yml b/.github/workflows/pull-request-formatting-validator.yml new file mode 100644 index 000000000000..bd790756844a --- /dev/null +++ b/.github/workflows/pull-request-formatting-validator.yml @@ -0,0 +1,77 @@ +# This workflow validates basic pull request formatting requirements are met. +# +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: BSD-2-Clause-Patent +# + +name: Validate Pull Request Formatting + +on: + pull_request_target: + branches: + - master + types: + - edited + - opened + - reopened + - synchronize + +concurrency: + group: pr-validation-${{ github.event.number }} + cancel-in-progress: true + +jobs: + validate_pr: + name: Validate Pull Request Formatting + # Do not run on draft PRs and only run on PRs in the tianocore org + if: ${{ github.event.pull_request.draft == false && github.repository_owner == 'tianocore' }} + runs-on: ubuntu-latest + + steps: + - name: Generate Token + id: app-token + uses: actions/create-github-app-token@v2 + with: + app-id: ${{ secrets.TIANOCORE_PR_AUTOMATION_APPLICATION_ID }} + private-key: ${{ secrets.TIANOCORE_PR_AUTOMATION_APPLICATION_PRIVATE_KEY }} + + # Reduce checkout time with sparse-checkout + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 1 + sparse-checkout: | + .github/scripts/ + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + cache: 'pip' + cache-dependency-path: '.github/scripts/requirements.txt' + + - name: Install PIP Modules + run: pip install -r .github/scripts/requirements.txt + + - name: Validate PR Format + id: validate + run: python .github/scripts/validate_pr_formatting.py + env: + GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} + OWNER: ${{ github.repository_owner }} + PR_NUMBER: ${{ github.event.number }} + REPO: ${{ github.event.pull_request.base.repo.name }} + + - name: Post Validation Comment + if: steps.validate.outputs.validation_error == 'true' + run: python .github/scripts/validate_pr_formatting.py --post-comment + env: + GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} + PR_NUMBER: ${{ github.event.number }} + + - name: Check for Validation Errors + if: steps.validate.outputs.validation_error == 'true' + uses: actions/github-script@v7 + with: + script: | + core.setFailed('PR Formatting Validation Check Failed!') From f1f672b89871fe23ee9bd237e7863290b94f8591 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Fri, 19 Sep 2025 17:19:46 +0100 Subject: [PATCH 0633/1172] ArmPkg/SemihostFs: fix crash when file open fails MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since the FileFcb’s list entry is not initialized at allocation, SemihostFs reports the following crash when freeing FileFcb after failing to obtain the file size in FileOpen(): ASSERT [SemihostFs] LinkedList.c(75): List->ForwardLink != ((void *) 0) To fix this, properly initialize the list entry at FCB allocation and move RemoveListEntry() to FileClose(), since the FCB entry will only be on the list when VolumeOpen() or FileOpen() succeeds. Signed-off-by: Yeoreum Yun --- ArmPkg/Filesystem/SemihostFs/AArch64/SemihostFs.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/ArmPkg/Filesystem/SemihostFs/AArch64/SemihostFs.c b/ArmPkg/Filesystem/SemihostFs/AArch64/SemihostFs.c index 7703e52fe35d..c5dbbd34652b 100644 --- a/ArmPkg/Filesystem/SemihostFs/AArch64/SemihostFs.c +++ b/ArmPkg/Filesystem/SemihostFs/AArch64/SemihostFs.c @@ -95,11 +95,14 @@ AllocateFCB ( SEMIHOST_FCB *Fcb; Fcb = AllocateZeroPool (sizeof (SEMIHOST_FCB)); - if (Fcb != NULL) { - CopyMem (&Fcb->File, &gSemihostFsFile, sizeof (gSemihostFsFile)); - Fcb->Signature = SEMIHOST_FCB_SIGNATURE; + if (Fcb == NULL) { + return NULL; } + CopyMem (&Fcb->File, &gSemihostFsFile, sizeof (gSemihostFsFile)); + Fcb->Signature = SEMIHOST_FCB_SIGNATURE; + InitializeListHead (&Fcb->Link); + return Fcb; } @@ -108,9 +111,6 @@ FreeFCB ( IN SEMIHOST_FCB *Fcb ) { - // Remove Fcb from gFileList. - RemoveEntryList (&Fcb->Link); - // To help debugging... Fcb->Signature = 0; @@ -430,6 +430,9 @@ FileClose ( FreePool (Fcb->FileName); } + // Remove Fcb from gFileList. + RemoveEntryList (&Fcb->Link); + FreeFCB (Fcb); return EFI_SUCCESS; From 01b9f27dbb673d9a96a2cc8684532435f7646be9 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Thu, 24 Jul 2025 11:22:38 +0100 Subject: [PATCH 0634/1172] ArmPlatformPkg/PlatformPei: generate TPM event log hobs When measured boot is enabled, TF-A passes the early measurement event log to the BL33 firmware (i.e., UEFI) through a transfer list entry with the tag ID TRANSFER_ENTRY_TAG_ID_TPM_EVENT_LOG. Therefore, generate TPM event log HOBs from the early measurement event log so they can be unified with the Tcg2Dxe event logs. Signed-off-by: Yeoreum Yun --- ArmPlatformPkg/PlatformPei/PlatformPeiLib.c | 40 ++ ArmPlatformPkg/PlatformPei/PlatformPeiLib.inf | 6 + .../PlatformPei/PlatformPeiTpmEventLog.c | 611 ++++++++++++++++++ ArmPlatformPkg/PlatformPei/PlatformPeim.inf | 4 + 4 files changed, 661 insertions(+) create mode 100644 ArmPlatformPkg/PlatformPei/PlatformPeiTpmEventLog.c diff --git a/ArmPlatformPkg/PlatformPei/PlatformPeiLib.c b/ArmPlatformPkg/PlatformPei/PlatformPeiLib.c index db39cd4f2c43..a2cf35897ff8 100644 --- a/ArmPlatformPkg/PlatformPei/PlatformPeiLib.c +++ b/ArmPlatformPkg/PlatformPei/PlatformPeiLib.c @@ -9,16 +9,56 @@ #include #include +#include +#include #include #include +/** + Build event log hob consumed by Tcg2Dxe. + + @param[in] TransferList Transfer list header + + @return EFI_SUCCESS Success to generate HOBs from passed event log. + @return Others Failed to create event log hob + +**/ +EFI_STATUS +EFIAPI +BuildPeiEventLogHobs ( + IN TRANSFER_LIST_HEADER *TransferList + ); + EFI_STATUS EFIAPI PlatformPeim ( VOID ) { + EFI_STATUS Status; + TRANSFER_LIST_HEADER *TransferList; + BuildFvHob (PcdGet64 (PcdFvBaseAddress), PcdGet32 (PcdFvSize)); + Status = TransferListGetFromHobList (&TransferList); + if (EFI_ERROR (Status)) { + // Transfer list is not found, this means + // early event log is not available and + // measured boot may not be enabled. + return EFI_SUCCESS; + } + + if (TransferListCheckHeader (TransferList) == TRANSFER_LIST_OPS_INVALID) { + DEBUG ((DEBUG_ERROR, "%a: Invalid transfer list... Stop boot...\n", __func__)); + return EFI_INVALID_PARAMETER; + } + + // Create HOBs for the early measurement Event logs. + Status = BuildPeiEventLogHobs (TransferList); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to build event log Pei Hobs...: %r\n", __func__, Status)); + return Status; + } + return EFI_SUCCESS; } diff --git a/ArmPlatformPkg/PlatformPei/PlatformPeiLib.inf b/ArmPlatformPkg/PlatformPei/PlatformPeiLib.inf index cce8a142bd0c..3c0946ef78d6 100644 --- a/ArmPlatformPkg/PlatformPei/PlatformPeiLib.inf +++ b/ArmPlatformPkg/PlatformPei/PlatformPeiLib.inf @@ -16,6 +16,7 @@ [Sources] PlatformPeiLib.c + PlatformPeiTpmEventLog.c [Packages] MdePkg/MdePkg.dec @@ -23,11 +24,16 @@ EmbeddedPkg/EmbeddedPkg.dec ArmPkg/ArmPkg.dec ArmPlatformPkg/ArmPlatformPkg.dec + SecurityPkg/SecurityPkg.dec [LibraryClasses] DebugLib HobLib ArmPlatformLib + ArmTransferListLib + +[Guids] + gTcgEvent2EntryHobGuid [Ppis] gEfiPeiMasterBootModePpiGuid # PPI ALWAYS_PRODUCED diff --git a/ArmPlatformPkg/PlatformPei/PlatformPeiTpmEventLog.c b/ArmPlatformPkg/PlatformPei/PlatformPeiTpmEventLog.c new file mode 100644 index 000000000000..c435cb5424d8 --- /dev/null +++ b/ArmPlatformPkg/PlatformPei/PlatformPeiTpmEventLog.c @@ -0,0 +1,611 @@ +/** @file + + Copyright (c) 2025, ARM Limited. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#include +#include +#include +#include +#include + +#include +#include + +typedef struct { + TPMI_ALG_HASH HashAlgo; + UINT32 HashMask; + UINT16 HashSize; + CHAR8 *HashName; +} INTERNAL_HASH_INFO; + +STATIC INTERNAL_HASH_INFO mHashInfo[] = { + { TPM_ALG_SHA1, HASH_ALG_SHA1, SHA1_DIGEST_SIZE, "SHA1" }, + { TPM_ALG_SHA256, HASH_ALG_SHA256, SHA256_DIGEST_SIZE, "SHA256" }, + { TPM_ALG_SHA384, HASH_ALG_SHA384, SHA384_DIGEST_SIZE, "SHA384" }, + { TPM_ALG_SHA512, HASH_ALG_SHA512, SHA512_DIGEST_SIZE, "SHA512" }, +}; + +typedef struct { + UINTN EventLogBase; + UINTN EventLogSize; + VOID *Event; + UINTN EventSize; +} EVENT_LOG_ITERATOR; + +/** + Get hash size based on Algo + + @param[in] HashAlgo Hash Algorithm Id. + @param[out] HashInfo Hash Algorithm Information. + + @return Size of the hash. + +**/ +STATIC +EFI_STATUS +EFIAPI +GetHashInfo ( + IN TPMI_ALG_HASH HashAlgo, + OUT INTERNAL_HASH_INFO **HashInfo + ) +{ + UINTN Idx; + + for (Idx = 0; Idx < ARRAY_SIZE (mHashInfo); Idx++) { + if (mHashInfo[Idx].HashAlgo == HashAlgo) { + *HashInfo = &mHashInfo[Idx]; + return EFI_SUCCESS; + } + } + + return EFI_UNSUPPORTED; +} + +/** + Check Event is SpecId Event. + + @param[in] Event Event + + @return TRUE Event is SpecId event. + @return FALSE Event isn't SpecId event. + + **/ +STATIC +BOOLEAN +EFIAPI +IsSpecIdEvent ( + IN VOID *Event + ) +{ + TCG_PCR_EVENT *TcgPcrEvent; + TCG_EfiSpecIDEventStruct *TcgEfiSpecIdEventStruct; + + TcgPcrEvent = (TCG_PCR_EVENT *)Event; + TcgEfiSpecIdEventStruct = (TCG_EfiSpecIDEventStruct *) + (Event + OFFSET_OF (TCG_PCR_EVENT, Event)); + + if (!((TcgPcrEvent->EventType == EV_NO_ACTION) && + ((CompareMem ( + TcgEfiSpecIdEventStruct->signature, + TCG_EfiSpecIDEventStruct_SIGNATURE_02, + sizeof (TcgEfiSpecIdEventStruct->signature) + ) == 0) || + (CompareMem ( + TcgEfiSpecIdEventStruct->signature, + TCG_EfiSpecIDEventStruct_SIGNATURE_03, + sizeof (TcgEfiSpecIdEventStruct->signature) + ) == 0)))) + { + return FALSE; + } + + return TRUE; +} + +/** + Get size of SpecId Event. + + @param[in] SpecIdEvent SpecId event + + @return Size of SpecId event. + + **/ +STATIC +UINTN +EFIAPI +GetSpecIdEventSize ( + IN VOID *SpecIdEvent + ) +{ + TCG_PCR_EVENT *TcgPcrEvent; + + TcgPcrEvent = (TCG_PCR_EVENT *)SpecIdEvent; + + return OFFSET_OF (TCG_PCR_EVENT, Event) + TcgPcrEvent->EventSize; +} + +/** + Get size of digest list in eventlog. + + @param[in] TcgPcrEvent2 eventlog. + + @return Size of digest list. + + **/ +STATIC +UINTN +EFIAPI +GetDigestListSize ( + IN TCG_PCR_EVENT2 *TcgPcrEvent2 + ) +{ + EFI_STATUS Status; + UINTN Idx; + VOID *Digest; + UINT32 DigestCount; + TPMI_ALG_HASH HashAlgo; + INTERNAL_HASH_INFO *HashInfo; + + /* + * The Digest list is a packed structure composed of a list of + * { {Hash Algorithm, Digest} x DigestCount }, + * wherein the Digest length varies based on the Hash algorithm. + * Therefore, parse to the end of the digest list. + * + * See the TCG EFI Protocol Specification's 5.2 Crypto Agile Log Entry Format. + */ + DigestCount = TcgPcrEvent2->Digest.count; + HashAlgo = TcgPcrEvent2->Digest.digests[0].hashAlg; + Digest = (VOID *)&TcgPcrEvent2->Digest.digests[0].digest; + + for (Idx = 0; Idx < DigestCount; Idx++) { + Status = GetHashInfo (HashAlgo, &HashInfo); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Can't get HashInfo for %d\n", __func__, HashAlgo)); + return 0; + } + + Digest += HashInfo->HashSize; + CopyMem (&HashAlgo, Digest, sizeof (TPMI_ALG_HASH)); + Digest += sizeof (TPMI_ALG_HASH); + } + + Digest -= sizeof (TPMI_ALG_HASH); + + return (UINTN)Digest - (UINTN)&TcgPcrEvent2->Digest.digests[0]; +} + +/** + Initialize event log iterator + + @param[out] Iter Iterator. + @param[in] EventLogBase Event log base address. + @param[in] EventLogSize Total event log size. + +**/ +STATIC +VOID +EFIAPI +EventLogIteratorInit ( + OUT EVENT_LOG_ITERATOR *Iter, + IN VOID *EventLogBase, + IN UINTN EventLogSize + ) +{ + Iter->EventLogBase = (UINTN)EventLogBase; + Iter->EventLogSize = EventLogSize; + Iter->Event = NULL; + Iter->EventSize = 0; +} + +/** + Get next event form event log iterator + + @param[in,out] Iter Iterator + @param[out] NextEvent Next event + @param[out] NextEventSize Size of next event + + @return EFI_SUCCESS Success to get next event. + @return EFI_NOT_FOUND No more event. + @return EFI_INVALID_PARAMETER Invalid event log was found. + +**/ +STATIC +EFI_STATUS +EFIAPI +EventLogIteratorGetNext ( + IN OUT EVENT_LOG_ITERATOR *Iter, + OUT VOID **NextEvent, + OUT UINTN *NextEventSize + ) +{ + EFI_STATUS Status; + TCG_PCR_EVENT2 *TcgPcrEvent2; + VOID *Event; + UINT32 EventSize; + UINTN DigestListSize; + + if (Iter->Event == NULL) { + Iter->Event = (VOID *)Iter->EventLogBase; + } else { + Iter->Event += Iter->EventSize; + } + + if ((UINTN)Iter->Event >= (Iter->EventLogBase + Iter->EventLogSize)) { + Status = EFI_NOT_FOUND; + Iter->Event = NULL; + Iter->EventSize = 0; + goto ExitHandler; + } + + if (IsSpecIdEvent (Iter->Event)) { + Status = EFI_SUCCESS; + Iter->EventSize = GetSpecIdEventSize (Iter->Event); + goto ExitHandler; + } + + TcgPcrEvent2 = ((TCG_PCR_EVENT2 *)Iter->Event); + Event = (VOID *)&TcgPcrEvent2->Digest.digests[0]; + DigestListSize = GetDigestListSize (TcgPcrEvent2); + if (DigestListSize == 0) { + Status = EFI_INVALID_PARAMETER; + Iter->Event = NULL; + Iter->EventSize = 0; + goto ExitHandler; + } + + Event += DigestListSize; + CopyMem (&EventSize, Event, sizeof (TcgPcrEvent2->EventSize)); + Event += sizeof (TcgPcrEvent2->EventSize); + Event += EventSize; + + Iter->EventSize = (UINTN)Event - (UINTN)Iter->Event; + Status = EFI_SUCCESS; + +ExitHandler: + *NextEvent = Iter->Event; + *NextEventSize = Iter->EventSize; + return Status; +} + +/** + This function dump TCG_EfiSpecIDEventStruct. + + @param[in] Event Event + +**/ +STATIC +VOID +EFIAPI +DumpTcgEfiSpecIdEvent ( + IN VOID *Event + ) +{ + TCG_PCR_EVENT *TcgPcrEvent; + TCG_EfiSpecIDEventStruct *TcgEfiSpecIdEventStruct; + TCG_EfiSpecIdEventAlgorithmSize *DigestSize; + UINTN Idx; + UINT8 *VendorInfoSize; + UINT8 *VendorInfo; + UINT32 NumberOfAlgorithms; + + TcgPcrEvent = (TCG_PCR_EVENT *)Event; + TcgEfiSpecIdEventStruct = (TCG_EfiSpecIDEventStruct *) + (Event + OFFSET_OF (TCG_PCR_EVENT, Event)); + + DEBUG ((DEBUG_INFO, " TCG_EfiSpecIDEvent:\n")); + DEBUG ((DEBUG_INFO, " PCRIndex - %d\n", TcgPcrEvent->PCRIndex)); + DEBUG ((DEBUG_INFO, " EventType - 0x%08x\n", TcgPcrEvent->EventType)); + + DEBUG ((DEBUG_INFO, " Digest: ")); + for (Idx = 0; Idx < TPM_SHA1_160_HASH_LEN; Idx++) { + DEBUG ((DEBUG_INFO, "%02x ", TcgPcrEvent->Digest.digest[Idx])); + } + + DEBUG ((DEBUG_INFO, "\n")); + + DEBUG ((DEBUG_INFO, " Signature - '")); + for (Idx = 0; Idx < sizeof (TcgEfiSpecIdEventStruct->signature); Idx++) { + DEBUG ((DEBUG_INFO, "%c", TcgEfiSpecIdEventStruct->signature[Idx])); + } + + DEBUG ((DEBUG_INFO, "'\n")); + + DEBUG ((DEBUG_INFO, " PlatformClass - 0x%08x\n", TcgEfiSpecIdEventStruct->platformClass)); + DEBUG ((DEBUG_INFO, " SpecVersion - %d.%d%d\n", TcgEfiSpecIdEventStruct->specVersionMajor, TcgEfiSpecIdEventStruct->specVersionMinor, TcgEfiSpecIdEventStruct->specErrata)); + DEBUG ((DEBUG_INFO, " UintnSize - 0x%02x\n", TcgEfiSpecIdEventStruct->uintnSize)); + + CopyMem (&NumberOfAlgorithms, TcgEfiSpecIdEventStruct + 1, sizeof (NumberOfAlgorithms)); + DEBUG ((DEBUG_INFO, " NumberOfAlgorithms - 0x%08x\n", NumberOfAlgorithms)); + + DigestSize = (TCG_EfiSpecIdEventAlgorithmSize *)((UINT8 *)TcgEfiSpecIdEventStruct + sizeof (*TcgEfiSpecIdEventStruct) + sizeof (NumberOfAlgorithms)); + for (Idx = 0; Idx < NumberOfAlgorithms; Idx++) { + DEBUG ((DEBUG_INFO, " Digest(%d)\n", Idx)); + DEBUG ((DEBUG_INFO, " AlgorithmId - 0x%04x\n", DigestSize[Idx].algorithmId)); + DEBUG ((DEBUG_INFO, " DigestSize - 0x%04x\n", DigestSize[Idx].digestSize)); + } + + VendorInfoSize = (UINT8 *)&DigestSize[NumberOfAlgorithms]; + DEBUG ((DEBUG_INFO, " VendorInfoSize - 0x%02x\n", *VendorInfoSize)); + VendorInfo = VendorInfoSize + 1; + DEBUG ((DEBUG_INFO, " VendorInfo - ")); + for (Idx = 0; Idx < *VendorInfoSize; Idx++) { + DEBUG ((DEBUG_INFO, "%02x ", VendorInfo[Idx])); + } + + DEBUG ((DEBUG_INFO, "\n")); +} + +/** + This function Dump PCR event 2. + + @param[in] Event Event + +**/ +STATIC +VOID +EFIAPI +DumpEvent ( + IN VOID *Event + ) +{ + EFI_STATUS Status; + UINTN Idx; + UINT32 DigestIdx; + UINT32 DigestCount; + TPMI_ALG_HASH HashAlgo; + INTERNAL_HASH_INFO *HashInfo; + UINT8 *DigestBuffer; + UINT8 *EventBuffer; + UINT32 EventSize; + TCG_EfiStartupLocalityEvent *StartupLocalityEvent; + TCG_PCR_EVENT2 *TcgPcrEvent2; + UINT16 DigestSize; + + TcgPcrEvent2 = ((TCG_PCR_EVENT2 *)Event); + + DEBUG ((DEBUG_INFO, " Event:\n")); + DEBUG ((DEBUG_INFO, " PCRIndex - %d\n", TcgPcrEvent2->PCRIndex)); + DEBUG ((DEBUG_INFO, " EventType - 0x%08x\n", TcgPcrEvent2->EventType)); + + DEBUG ((DEBUG_INFO, " DigestCount: 0x%08x\n", TcgPcrEvent2->Digest.count)); + + DigestCount = TcgPcrEvent2->Digest.count; + HashAlgo = TcgPcrEvent2->Digest.digests[0].hashAlg; + DigestBuffer = (UINT8 *)&TcgPcrEvent2->Digest.digests[0].digest; + + for (DigestIdx = 0; DigestIdx < DigestCount; DigestIdx++) { + Status = GetHashInfo (HashAlgo, &HashInfo); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, " HashAlgo : Unknown(0x%04x)\n", HashAlgo)); + return; + } else { + DEBUG ((DEBUG_INFO, " HashAlgo : %a(0x%04x)\n", HashInfo->HashName, HashAlgo)); + DigestSize = HashInfo->HashSize; + } + + DEBUG ((DEBUG_INFO, " Digest(%d): ", DigestIdx)); + for (Idx = 0; Idx < DigestSize; Idx++) { + DEBUG ((DEBUG_INFO, "%02x ", DigestBuffer[Idx])); + } + + DEBUG ((DEBUG_INFO, "\n")); + + // + // Prepare next + // + CopyMem (&HashAlgo, DigestBuffer + DigestSize, sizeof (TPMI_ALG_HASH)); + DigestBuffer = DigestBuffer + DigestSize + sizeof (TPMI_ALG_HASH); + } + + DEBUG ((DEBUG_INFO, "\n")); + + DigestBuffer = DigestBuffer - sizeof (TPMI_ALG_HASH); + CopyMem (&EventSize, DigestBuffer, sizeof (TcgPcrEvent2->EventSize)); + DEBUG ((DEBUG_INFO, " EventSize - 0x%08x\n", EventSize)); + EventBuffer = DigestBuffer + sizeof (TcgPcrEvent2->EventSize); + StartupLocalityEvent = (TCG_EfiStartupLocalityEvent *)EventBuffer; + + if ((EventSize == sizeof (TCG_EfiStartupLocalityEvent)) && + (CompareMem ( + &StartupLocalityEvent->Signature, + TCG_EfiStartupLocalityEvent_SIGNATURE, + sizeof (StartupLocalityEvent->Signature) + ) == 0)) + { + DEBUG ((DEBUG_INFO, " Signature - %a\n", StartupLocalityEvent->Signature)); + DEBUG ((DEBUG_INFO, " StartupLocality - 0x%08x\n", StartupLocalityEvent->StartupLocality)); + } else { + DEBUG ((DEBUG_INFO, " Event - %a\n", EventBuffer)); + } +} + +/** + Dump passed tpm event log from TF-A. + + @param[in] EventLog TPM eventlog base + @param[in] EventLogSize Size of TPM event log + + **/ +STATIC +VOID +EFIAPI +DumpTpmEventLog ( + IN UINT8 *EventLog, + IN UINTN EventLogSize + ) +{ + EVENT_LOG_ITERATOR Iter; + VOID *NextEvent; + UINTN NextEventSize; + + EventLogIteratorInit (&Iter, EventLog, EventLogSize); + + while (!EFI_ERROR (EventLogIteratorGetNext (&Iter, &NextEvent, &NextEventSize))) { + if (IsSpecIdEvent (NextEvent)) { + DumpTcgEfiSpecIdEvent (NextEvent); + } else { + DumpEvent (NextEvent); + } + } +} + +/** + Build one Event Log Hob. + + @param[in] Event Event + @param[in] EventSize Size of Event + + @return EFI_SUCCESS + @return EFI_UNSUPPORTED + + **/ +STATIC +EFI_STATUS +EFIAPI +BuildOnePeiEventLogHob ( + IN VOID *Event, + IN UINTN EventSize + ) +{ + EFI_STATUS Status; + TCG_PCR_EVENT2 *TcgPcrEvent2; + UINTN Idx; + UINT32 DigestCount; + TPMI_ALG_HASH HashAlgo; + INTERNAL_HASH_INFO *HashInfo; + VOID *GuidHob; + UINT32 EventDataSize; + TCG_EfiStartupLocalityEvent *StartupLocalityEvent; + + TcgPcrEvent2 = ((TCG_PCR_EVENT2 *)Event); + DigestCount = TcgPcrEvent2->Digest.count; + HashAlgo = TcgPcrEvent2->Digest.digests[0].hashAlg; + Event = (VOID *)&TcgPcrEvent2->Digest.digests[0].digest; + + for (Idx = 0; Idx < DigestCount; Idx++) { + Status = GetHashInfo (HashAlgo, &HashInfo); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Can't get HashInfo for %d\n", __func__, HashAlgo)); + return Status; + } + + Event += HashInfo->HashSize; + CopyMem (&HashAlgo, Event, sizeof (TPMI_ALG_HASH)); + Event += sizeof (TPMI_ALG_HASH); + } + + Event -= sizeof (TPMI_ALG_HASH); + CopyMem (&EventDataSize, Event, sizeof (TcgPcrEvent2->EventSize)); + Event += sizeof (TcgPcrEvent2->EventSize); + StartupLocalityEvent = (TCG_EfiStartupLocalityEvent *)Event; + + if ((EventDataSize == sizeof (TCG_EfiStartupLocalityEvent)) && + (CompareMem ( + &StartupLocalityEvent->Signature, + TCG_EfiStartupLocalityEvent_SIGNATURE, + sizeof (StartupLocalityEvent->Signature) + ) == 0) && + (StartupLocalityEvent->StartupLocality != 3)) + { + /* + * StartupLocalityEvent is "EV_NO_ACTION" so it doesn't extend PCR. + * However, some version of tpm2_eventlog application extends + * StartupLocalityEvent, So it would be mismatched when it tries to + * replay with tpm2_eventlog and /sys/class/tpm/{tpm}/pcr{hash}/{NUM}. + * + * StartupLocalityEvent is optional event not mandatory when + * Startup Locality != 3 according to + * TCG PC Client Platform Firmware Profile Specification 3.3.4.1 PCR[0]. + * + * To sustain integration with some version of tpm2_eventlog too, + * Skip the StartupLocality Event. + */ + DEBUG ((DEBUG_INFO, "%a: Skip StartupLocality Event\n", __func__)); + } else { + GuidHob = BuildGuidDataHob (&gTcgEvent2EntryHobGuid, TcgPcrEvent2, EventSize); + if (GuidHob == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Failed to create Event Hob...\n", __func__)); + return EFI_OUT_OF_RESOURCES; + } + } + + return EFI_SUCCESS; +} + +/** + Build event log hob consumed by Tcg2Dxe. + + @param[in] TransferList Transfer list header + + @return EFI_SUCCESS Success to generate HOBs from passed event log + @return EFI_INVALID_PARAMETER Invalid event log + @return Others Failed to create event log hob + +**/ +EFI_STATUS +EFIAPI +BuildPeiEventLogHobs ( + IN TRANSFER_LIST_HEADER *TransferList + ) +{ + EFI_STATUS Status; + VOID *EventLog; + UINTN EventLogSize; + EVENT_LOG_ITERATOR Iter; + VOID *NextEvent; + UINTN NextEventSize; + + Status = TransferListGetEventLog (TransferList, &EventLog, &EventLogSize, NULL); + if (EFI_ERROR (Status)) { + /* + * If there is no event log, skip creating EventLogHobs from TransferList. + */ + return EFI_SUCCESS; + } + + DumpTpmEventLog (EventLog, EventLogSize); + + EventLogIteratorInit (&Iter, EventLog, EventLogSize); + + Status = EventLogIteratorGetNext (&Iter, &NextEvent, &NextEventSize); + if (EFI_ERROR (Status)) { + /* + * If event log is invalid, return error. + */ + DEBUG ((DEBUG_WARN, "%a: Invalid TPM event log...", __func__)); + return EFI_INVALID_PARAMETER; + } + + if (!IsSpecIdEvent (NextEvent)) { + /* + * The first event must be a SpecId event otherwise + * the event log is invalid. + */ + DEBUG ((DEBUG_WARN, "%a: first event log isn't SpecIdEvent", __func__)); + return EFI_INVALID_PARAMETER; + } + + /* + * Tcg2Dxe generates a SpecId Event when it generates the final event log. + * Therefore, skip creating a HOB for the TF-A SpecIdEvent log. + */ + do { + Status = EventLogIteratorGetNext (&Iter, &NextEvent, &NextEventSize); + if (!EFI_ERROR (Status)) { + Status = BuildOnePeiEventLogHob (NextEvent, NextEventSize); + } + } while (!EFI_ERROR (Status)); + + if (Status == EFI_NOT_FOUND) { + Status = EFI_SUCCESS; + } + + return Status; +} diff --git a/ArmPlatformPkg/PlatformPei/PlatformPeim.inf b/ArmPlatformPkg/PlatformPei/PlatformPeim.inf index c6973a6bd06f..8ad3904dd434 100644 --- a/ArmPlatformPkg/PlatformPei/PlatformPeim.inf +++ b/ArmPlatformPkg/PlatformPei/PlatformPeim.inf @@ -18,6 +18,7 @@ [Sources] PlatformPeim.c + PlatformPeiTpmEventLog.c [Packages] MdePkg/MdePkg.dec @@ -25,12 +26,14 @@ EmbeddedPkg/EmbeddedPkg.dec ArmPkg/ArmPkg.dec ArmPlatformPkg/ArmPlatformPkg.dec + SecurityPkg/SecurityPkg.dec [LibraryClasses] PeimEntryPoint DebugLib HobLib ArmPlatformLib + ArmTransferListLib PlatformPeiLib PeiServicesLib @@ -48,6 +51,7 @@ [Guids] gArmTransferListHobGuid + gTcgEvent2EntryHobGuid [Depex] TRUE From d52fa6da6750c66c726ea8bac2a45ee31e20cb47 Mon Sep 17 00:00:00 2001 From: Leif Lindholm Date: Tue, 30 Sep 2025 15:29:38 +0100 Subject: [PATCH 0635/1172] ArmPkg: rename ArmMtlNullLib By edk2 convention, a NULL library should be called *LibNull. ArmMtlNullLib did not follow this convention, so rename it ArmMtlLibNull. Signed-off-by: Leif Lindholm --- ArmPkg/ArmPkg.dsc | 4 ++-- .../ArmMtlNullLib.c => ArmMtlLibNull/ArmMtlLibNull.c} | 0 .../ArmMtlNullLib.inf => ArmMtlLibNull/ArmMtlLibNull.inf} | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename ArmPkg/Library/{ArmMtlNullLib/ArmMtlNullLib.c => ArmMtlLibNull/ArmMtlLibNull.c} (100%) rename ArmPkg/Library/{ArmMtlNullLib/ArmMtlNullLib.inf => ArmMtlLibNull/ArmMtlLibNull.inf} (83%) diff --git a/ArmPkg/ArmPkg.dsc b/ArmPkg/ArmPkg.dsc index 85f431f14a81..5297935065b7 100644 --- a/ArmPkg/ArmPkg.dsc +++ b/ArmPkg/ArmPkg.dsc @@ -87,7 +87,7 @@ ArmTransferListLib|ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.inf ArmFfaLib|MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.inf - ArmMtlLib|ArmPkg/Library/ArmMtlNullLib/ArmMtlNullLib.inf + ArmMtlLib|ArmPkg/Library/ArmMtlLibNull/ArmMtlLibNull.inf OemMiscLib|ArmPkg/Universal/Smbios/OemMiscLibNull/OemMiscLibNull.inf @@ -141,7 +141,7 @@ ArmPkg/Drivers/ArmPciCpuIo2Dxe/ArmPciCpuIo2Dxe.inf ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf ArmPkg/Library/ArmLib/ArmBaseLib.inf - ArmPkg/Library/ArmMtlNullLib/ArmMtlNullLib.inf + ArmPkg/Library/ArmMtlLibNull/ArmMtlLibNull.inf ArmPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBootManagerLib.inf diff --git a/ArmPkg/Library/ArmMtlNullLib/ArmMtlNullLib.c b/ArmPkg/Library/ArmMtlLibNull/ArmMtlLibNull.c similarity index 100% rename from ArmPkg/Library/ArmMtlNullLib/ArmMtlNullLib.c rename to ArmPkg/Library/ArmMtlLibNull/ArmMtlLibNull.c diff --git a/ArmPkg/Library/ArmMtlNullLib/ArmMtlNullLib.inf b/ArmPkg/Library/ArmMtlLibNull/ArmMtlLibNull.inf similarity index 83% rename from ArmPkg/Library/ArmMtlNullLib/ArmMtlNullLib.inf rename to ArmPkg/Library/ArmMtlLibNull/ArmMtlLibNull.inf index 605c272081d2..ddd117f9c13c 100644 --- a/ArmPkg/Library/ArmMtlNullLib/ArmMtlNullLib.inf +++ b/ArmPkg/Library/ArmMtlLibNull/ArmMtlLibNull.inf @@ -6,14 +6,14 @@ [Defines] INF_VERSION = 0x00010019 - BASE_NAME = ArmMtlNullLib + BASE_NAME = ArmMtlLibNull FILE_GUID = 05810525-FDEC-4006-9F1F-37609B3675FA MODULE_TYPE = BASE VERSION_STRING = 1.0 LIBRARY_CLASS = ArmMtlLib [Sources.common] - ArmMtlNullLib.c + ArmMtlLibNull.c [Packages] ArmPkg/ArmPkg.dec From d95e578b253a8624f4b30b06c48de9d482fb4355 Mon Sep 17 00:00:00 2001 From: Leif Lindholm Date: Tue, 30 Sep 2025 15:38:59 +0100 Subject: [PATCH 0636/1172] ArmPlatformPkg: rename LcdHwLibNull and LcdPlatformLibNull By edk2 convention, a NULL library should be called *LibNull. These libraries did not follow this convention, so rename them. Signed-off-by: Leif Lindholm --- ArmPlatformPkg/ArmPlatformPkg.dsc | 8 ++++---- .../LcdHwNullLib.c => LcdHwLibNull/LcdHwLibNull.c} | 0 .../LcdHwNullLib.inf => LcdHwLibNull/LcdHwLibNull.inf} | 4 ++-- .../LcdPlatformLibNull.c} | 0 .../LcdPlatformLibNull.inf} | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) rename ArmPlatformPkg/Library/{LcdHwNullLib/LcdHwNullLib.c => LcdHwLibNull/LcdHwLibNull.c} (100%) rename ArmPlatformPkg/Library/{LcdHwNullLib/LcdHwNullLib.inf => LcdHwLibNull/LcdHwLibNull.inf} (84%) rename ArmPlatformPkg/Library/{LcdPlatformNullLib/LcdPlatformNullLib.c => LcdPlatformLibNull/LcdPlatformLibNull.c} (100%) rename ArmPlatformPkg/Library/{LcdPlatformNullLib/LcdPlatformNullLib.inf => LcdPlatformLibNull/LcdPlatformLibNull.inf} (84%) diff --git a/ArmPlatformPkg/ArmPlatformPkg.dsc b/ArmPlatformPkg/ArmPlatformPkg.dsc index d792487c192b..370cb9aa9414 100644 --- a/ArmPlatformPkg/ArmPlatformPkg.dsc +++ b/ArmPlatformPkg/ArmPlatformPkg.dsc @@ -49,8 +49,8 @@ DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf - LcdHwLib|ArmPlatformPkg/Library/LcdHwNullLib/LcdHwNullLib.inf - LcdPlatformLib|ArmPlatformPkg/Library/LcdPlatformNullLib/LcdPlatformNullLib.inf + LcdHwLib|ArmPlatformPkg/Library/LcdHwLibNull/LcdHwLibNull.inf + LcdPlatformLib|ArmPlatformPkg/Library/LcdPlatformLibNull/LcdPlatformLibNull.inf MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf MemoryInitPeiLib|ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.inf PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf @@ -105,8 +105,8 @@ ArmPlatformPkg/Library/ArmPlatformLibNull/ArmPlatformLibNull.inf ArmPlatformPkg/Library/HdLcd/HdLcd.inf - ArmPlatformPkg/Library/LcdHwNullLib/LcdHwNullLib.inf - ArmPlatformPkg/Library/LcdPlatformNullLib/LcdPlatformNullLib.inf + ArmPlatformPkg/Library/LcdHwLibNull/LcdHwLibNull.inf + ArmPlatformPkg/Library/LcdPlatformLibNull/LcdPlatformLibNull.inf ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf ArmPlatformPkg/Library/PL011UartClockLib/PL011UartClockLib.inf ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.inf diff --git a/ArmPlatformPkg/Library/LcdHwNullLib/LcdHwNullLib.c b/ArmPlatformPkg/Library/LcdHwLibNull/LcdHwLibNull.c similarity index 100% rename from ArmPlatformPkg/Library/LcdHwNullLib/LcdHwNullLib.c rename to ArmPlatformPkg/Library/LcdHwLibNull/LcdHwLibNull.c diff --git a/ArmPlatformPkg/Library/LcdHwNullLib/LcdHwNullLib.inf b/ArmPlatformPkg/Library/LcdHwLibNull/LcdHwLibNull.inf similarity index 84% rename from ArmPlatformPkg/Library/LcdHwNullLib/LcdHwNullLib.inf rename to ArmPlatformPkg/Library/LcdHwLibNull/LcdHwLibNull.inf index 82e10fa69a73..a8488ad79820 100644 --- a/ArmPlatformPkg/Library/LcdHwNullLib/LcdHwNullLib.inf +++ b/ArmPlatformPkg/Library/LcdHwLibNull/LcdHwLibNull.inf @@ -8,14 +8,14 @@ [Defines] INF_VERSION = 0x0001001A - BASE_NAME = LcdHwNullLib + BASE_NAME = LcdHwLibNull FILE_GUID = bb1fde98-1de2-410e-8850-fdcb8e67ebc0 MODULE_TYPE = BASE VERSION_STRING = 1.0 LIBRARY_CLASS = LcdHwLib [Sources] - LcdHwNullLib.c + LcdHwLibNull.c [Packages] ArmPlatformPkg/ArmPlatformPkg.dec diff --git a/ArmPlatformPkg/Library/LcdPlatformNullLib/LcdPlatformNullLib.c b/ArmPlatformPkg/Library/LcdPlatformLibNull/LcdPlatformLibNull.c similarity index 100% rename from ArmPlatformPkg/Library/LcdPlatformNullLib/LcdPlatformNullLib.c rename to ArmPlatformPkg/Library/LcdPlatformLibNull/LcdPlatformLibNull.c diff --git a/ArmPlatformPkg/Library/LcdPlatformNullLib/LcdPlatformNullLib.inf b/ArmPlatformPkg/Library/LcdPlatformLibNull/LcdPlatformLibNull.inf similarity index 84% rename from ArmPlatformPkg/Library/LcdPlatformNullLib/LcdPlatformNullLib.inf rename to ArmPlatformPkg/Library/LcdPlatformLibNull/LcdPlatformLibNull.inf index 21bbe0571f69..e300bedaa4eb 100644 --- a/ArmPlatformPkg/Library/LcdPlatformNullLib/LcdPlatformNullLib.inf +++ b/ArmPlatformPkg/Library/LcdPlatformLibNull/LcdPlatformLibNull.inf @@ -9,14 +9,14 @@ [Defines] INF_VERSION = 0x0001001A - BASE_NAME = LcdPlatformNullLib + BASE_NAME = LcdPlatformLibNull FILE_GUID = f8bb120b-528f-46e2-92c2-130870af1a20 MODULE_TYPE = BASE VERSION_STRING = 1.0 LIBRARY_CLASS = LcdPlatformLib [Sources] - LcdPlatformNullLib.c + LcdPlatformLibNull.c [Packages] ArmPlatformPkg/ArmPlatformPkg.dec From baf0ae3b1d3cd038ab287c3ff9a780ec171808db Mon Sep 17 00:00:00 2001 From: Leif Lindholm Date: Tue, 30 Sep 2025 15:55:49 +0100 Subject: [PATCH 0637/1172] SecurityPkg: rename PeilessSecMeasureNullLib By edk2 convention, a NULL library should be called *LibNull. This library did not follow this convention, so rename i. Signed-off-by: Leif Lindholm --- ...{PeilessSecMeasureNullLib.c => PeilessSecMeasureLibNull.c} | 0 ...lessSecMeasureNullLib.inf => PeilessSecMeasureLibNull.inf} | 4 ++-- SecurityPkg/SecurityPkg.dsc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename SecurityPkg/Library/PeilessSecMeasureLib/{PeilessSecMeasureNullLib.c => PeilessSecMeasureLibNull.c} (100%) rename SecurityPkg/Library/PeilessSecMeasureLib/{PeilessSecMeasureNullLib.inf => PeilessSecMeasureLibNull.inf} (85%) diff --git a/SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureNullLib.c b/SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureLibNull.c similarity index 100% rename from SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureNullLib.c rename to SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureLibNull.c diff --git a/SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureNullLib.inf b/SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureLibNull.inf similarity index 85% rename from SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureNullLib.inf rename to SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureLibNull.inf index 0b41642a2969..33bb3476338b 100644 --- a/SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureNullLib.inf +++ b/SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureLibNull.inf @@ -9,7 +9,7 @@ [Defines] INF_VERSION = 0x0001001B - BASE_NAME = PeilessSecMeasureNullLib + BASE_NAME = PeilessSecMeasureLibNull FILE_GUID = 0f0f90f8-4062-11f0-9da8-f3bb80081317 MODULE_TYPE = BASE VERSION_STRING = 1.0 @@ -22,7 +22,7 @@ # [Sources] - PeilessSecMeasureNullLib.c + PeilessSecMeasureLibNull.c [Packages] ArmPkg/ArmPkg.dec diff --git a/SecurityPkg/SecurityPkg.dsc b/SecurityPkg/SecurityPkg.dsc index 854f2f2ccd48..ff481e94b8d3 100644 --- a/SecurityPkg/SecurityPkg.dsc +++ b/SecurityPkg/SecurityPkg.dsc @@ -430,7 +430,7 @@ SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2DeviceSecLibFfa.inf SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2InstanceLibFfa.inf SecurityPkg/Library/HashLibTpm2/HashLibTpm2PeilessSecLib.inf - SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureNullLib.inf + SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureLibNull.inf SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureLib.inf [BuildOptions] From da44b3b24a448eb8b66f3bf4216353e03fc9ad6a Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Wed, 1 Oct 2025 20:08:03 -0400 Subject: [PATCH 0638/1172] PrmPkg: Set DXE_RUNTIME_DRIVER section alignment Since PRM modules are DXE_RUNTIME_DRIVER images, this change sets the linker flags to the expected section alignment values for runtime code images. This serves as an example for platforms but also results in PRM sample modules in the package having correct section alignment. Signed-off-by: Michael Kubacki --- PrmPkg/PrmPkg.dsc | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/PrmPkg/PrmPkg.dsc b/PrmPkg/PrmPkg.dsc index 86ad1cf90fd8..59164e777b2a 100644 --- a/PrmPkg/PrmPkg.dsc +++ b/PrmPkg/PrmPkg.dsc @@ -149,3 +149,20 @@ [BuildOptions] # Force deprecated interfaces off *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES + +# +# PRM Modules are DXE_RUNTIME_DRIVER modules. Platforms that build PRM Modules should +# ensure sections are page aligned to 4K for X64 and 64K for AARCH64 so paging protections +# can be applied to the memory ranges. +# +[BuildOptions.common.EDKII.DXE_RUNTIME_DRIVER] + MSFT:*_*_*_DLINK_FLAGS = /ALIGN:4096 + CLANGPDB:*_*_*_DLINK_FLAGS = /ALIGN:4096 + XCODE:*_*_*_DLINK_FLAGS = -seg1addr 0x1000 -segalign 0x1000 + XCODE:*_*_*_MTOC_FLAGS = -align 0x1000 + +[BuildOptions.X64.EDKII.DXE_RUNTIME_DRIVER] + GCC:*_*_*_DLINK_FLAGS = -z common-page-size=0x1000 + +[BuildOptions.AARCH64.EDKII.DXE_RUNTIME_DRIVER] + GCC:*_*_*_DLINK_FLAGS = -z common-page-size=0x10000 From 5550d8f0b7ce57450a118864470638ced82ce403 Mon Sep 17 00:00:00 2001 From: Pranav V V Date: Fri, 26 Sep 2025 14:04:57 +0530 Subject: [PATCH 0639/1172] ShellPkg: Add PCIe boundary check and enhance DVSEC size calculation 1. Safe wrapper function for DumpHex that validates PCI configuration space boundaries. This function ensures that hex dumps do not exceed the standard 4KB PCIe configuration space boundary. If the requested dump would exceed this boundary, it prints an error message and truncates the dump size to remain within valid bounds. 2. Enhance DVSEC capability structure size calculation method. Size is now obtained from the DesignatedVendorSpecificHeader1.Bits.DvsecLength register. Issue: https://github.com/tianocore/edk2/issues/11554 Signed-off-by: Pranav V V --- .../Library/UefiShellDebug1CommandsLib/Pci.c | 119 +++++++++++------- 1 file changed, 71 insertions(+), 48 deletions(-) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c index 12c9a5b2276c..bb574e8eefd2 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c @@ -2420,6 +2420,36 @@ CHAR16 *IndicatorTable[] = { L"Off" }; +/** + Safe wrapper function for DumpHex that validates PCI configuration space boundaries. + + This function ensures that hex dumps do not exceed the standard 4KB PCIe configuration + space boundary (0x1000). If the requested dump would exceed this boundary, it prints + an error message and truncates the dump size to remain within valid bounds. + + @param[in] Indent Number of spaces to indent the hex dump output for formatting. + @param[in] Offset Starting offset within the PCI configuration space to begin dumping. + @param[in] DataSize Number of bytes to dump. Will be truncated if it exceeds the 4KB boundary. + @param[in] UserData Pointer to the data buffer containing the PCI configuration space data. + +**/ +VOID +PciConfigSpaceDumpHex ( + IN UINTN Indent, + IN UINTN Offset, + IN UINTN DataSize, + IN VOID *UserData + ) +{ + // Ensure we don't exceed the 4KB config space boundary + if (Offset + DataSize > 0x1000) { + ShellPrintDefaultEx (L"\nError: Requested dump size exceeds PCIe 4KB configuration space boundary (CurrentOffset: 0x%03X, Size: 0x%03X). Truncating to valid range.\n\n", Offset, DataSize); + DataSize = 0x1000 - Offset; + } + + DumpHex (Indent, Offset, DataSize, UserData); +} + /** Function for 'pci' command. @@ -5051,7 +5081,7 @@ PrintInterpretedExtendedCompatibilityLinkControl ( Header->RootComplexLinkControl, Header->RootComplexLinkStatus ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_INTERNAL_LINK_CONTROL), @@ -5083,7 +5113,7 @@ PrintInterpretedExtendedCompatibilityPowerBudgeting ( Header->Data, Header->PowerBudgetCapability ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_POWER_BUDGETING), @@ -5133,7 +5163,7 @@ PrintInterpretedExtendedCompatibilityAcs ( } } - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_ACS_EXTENDED) + (VectorSize / 8) - 1, @@ -5164,7 +5194,7 @@ PrintInterpretedExtendedCompatibilityLatencyToleranceReporting ( Header->MaxSnoopLatency, Header->MaxNoSnoopLatency ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_LATENCE_TOLERANCE_REPORTING), @@ -5194,7 +5224,7 @@ PrintInterpretedExtendedCompatibilitySerialNumber ( gShellDebug1HiiHandle, Header->SerialNumber ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_SERIAL_NUMBER), @@ -5227,7 +5257,7 @@ PrintInterpretedExtendedCompatibilityRcrb ( Header->RcrbCapabilities, Header->RcrbControl ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_RCRB_HEADER), @@ -5257,7 +5287,7 @@ PrintInterpretedExtendedCompatibilityVendorSpecific ( gShellDebug1HiiHandle, Header->VendorSpecificHeader ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), PCI_EXPRESS_EXTENDED_CAPABILITY_VENDOR_SPECIFIC_GET_SIZE (Header), @@ -5287,7 +5317,7 @@ PrintInterpretedExtendedCompatibilityECEA ( gShellDebug1HiiHandle, Header->AssociationBitmap ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION), @@ -5318,7 +5348,7 @@ PrintInterpretedExtendedCompatibilityAri ( Header->AriCapability, Header->AriControl ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_ARI_CAPABILITY), @@ -5361,7 +5391,7 @@ PrintInterpretedExtendedCompatibilityDynamicPowerAllocation ( ); } - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_DYNAMIC_POWER_ALLOCATION) - 1 + PCI_EXPRESS_EXTENDED_CAPABILITY_DYNAMIC_POWER_ALLOCATION_GET_SUBSTATE_MAX (Header), @@ -5402,7 +5432,7 @@ PrintInterpretedExtendedCompatibilityLinkDeclaration ( ); } - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_LINK_DECLARATION) + (PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_DECLARATION_GET_LINK_COUNT (Header)-1)*sizeof (UINT32), @@ -5449,7 +5479,7 @@ PrintInterpretedExtendedCompatibilityAer ( Header->TlpPrefixLog[2], Header->TlpPrefixLog[3] ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_ADVANCED_ERROR_REPORTING), @@ -5488,7 +5518,7 @@ PrintInterpretedExtendedCompatibilityMulticast ( Header->McOverlayBar ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_MULTICAST), @@ -5539,7 +5569,7 @@ PrintInterpretedExtendedCompatibilityVirtualChannel ( ); } - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_CAPABILITY) @@ -5577,7 +5607,7 @@ PrintInterpretedExtendedCompatibilityResizeableBar ( ); } - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), (UINT32)GET_NUMBER_RESIZABLE_BARS (Header) * sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_RESIZABLE_BAR_ENTRY), @@ -5609,14 +5639,14 @@ PrintInterpretedExtendedCompatibilityTph ( Header->TphRequesterCapability, Header->TphRequesterControl ); - DumpHex ( + PciConfigSpaceDumpHex ( 8, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)Header->TphStTable - (UINT8 *)HeadersBaseAddress), GET_TPH_TABLE_SIZE (Header), (VOID *)Header->TphStTable ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_TPH) + GET_TPH_TABLE_SIZE (Header) - sizeof (UINT16), @@ -5650,14 +5680,14 @@ PrintInterpretedExtendedCompatibilitySecondary ( Header->LinkControl3.Uint32, Header->LaneErrorStatus ); - DumpHex ( + PciConfigSpaceDumpHex ( 8, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)Header->EqualizationControl - (UINT8 *)HeadersBaseAddress), PciExpressCap->LinkCapability.Bits.MaxLinkWidth * sizeof (PCI_EXPRESS_REG_LANE_EQUALIZATION_CONTROL), (VOID *)Header->EqualizationControl ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_SECONDARY_PCIE) - sizeof (Header->EqualizationControl) @@ -5691,7 +5721,7 @@ PrintInterpretedExtendedCompatibilityAts ( Header->Control.Uint16 ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_ATS), @@ -5746,7 +5776,7 @@ PrintInterpretedExtendedCompatibilitySriov ( Header->VFMigrationStateArrayOffset ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (SR_IOV_CAPABILITY_REGISTER), @@ -5780,7 +5810,7 @@ PrintInterpretedExtendedCompatibilityPri ( Header->Status.Uint32 ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_PRI), @@ -5813,7 +5843,7 @@ PrintInterpretedExtendedCompatibilityPasid ( Header->Control.Uint16 ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_PASID), @@ -5847,7 +5877,7 @@ PrintInterpretedExtendedCompatibilityL1PmSubstates ( Header->Control2.Uint32 ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_L1_PM_SUBSTATES), @@ -5882,19 +5912,12 @@ PrintInterpretedExtendedCompatibilityDesignatedVendorSpecific ( Header->DesignatedVendorSpecificHeader1.Bits.DvsecLength ); - UINT32 NextCapOffset = HeaderAddress->NextCapabilityOffset; - UINTN Size; + UINTN Size; - if (NextCapOffset == 0) { - // The DVSEC length field plus the PCI Express header - Size = sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER) + - Header->DesignatedVendorSpecificHeader1.Bits.DvsecLength; - } else { - Size = NextCapOffset - (((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress) & 0xFFF); - } + Size = Header->DesignatedVendorSpecificHeader1.Bits.DvsecLength; // Dump the entire structure including the variable-length vendor specific data - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), Size, @@ -5969,7 +5992,7 @@ PrintInterpretedExtendedCompatibilityVfResizableBar ( ); } - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), HeaderSize + EntryCount * EntrySize, @@ -6002,7 +6025,7 @@ PrintInterpretedExtendedCompatibilityDataLinkFeature ( Header->Control.Uint32 ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_DATA_LINK_FEATURE), @@ -6058,7 +6081,7 @@ PrintInterpretedExtendedCompatibilityPhysicalLayer16 ( Header->SecondRetimerDataParityMismatchStatus ); - // Calculate the size for DumpHex + // Calculate the size for PciConfigSpaceDumpHex UINT32 NextCapOffset = HeaderAddress->NextCapabilityOffset; UINTN Size; @@ -6072,7 +6095,7 @@ PrintInterpretedExtendedCompatibilityPhysicalLayer16 ( Size = NextCapOffset - (((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress) & 0xFFF); } - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), Size, @@ -6131,7 +6154,7 @@ PrintInterpretedExtendedCompatibilityLaneMargining ( Header->Status.Bits.MaxLanesReceivingTestPattern ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_LANE_MARGINING_AT_RECEIVER), @@ -6227,7 +6250,7 @@ PrintInterpretedExtendedCompatibilityPhysicalLayer32 ( Size = NextCapOffset - (((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress) & 0xFFF); } - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), Size, @@ -6261,7 +6284,7 @@ PrintInterpretedExtendedCompatibilityAlternateProtocol ( Header->AltProtocolControl ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_ALTERNATE_PROTOCOL), @@ -6295,7 +6318,7 @@ PrintInterpretedExtendedCompatibilityDataObjectExchange ( Header->DoeStatus ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_DATA_OBJECT_EXCHANGE), @@ -6362,7 +6385,7 @@ PrintInterpretedExtendedCompatibilityDevice3 ( Header->Status.Bits.RemoteL0pSupported ); - // Calculate the size for DumpHex + // Calculate the size for PciConfigSpaceDumpHex UINT32 NextCapOffset = HeaderAddress->NextCapabilityOffset; UINTN Size; @@ -6374,7 +6397,7 @@ PrintInterpretedExtendedCompatibilityDevice3 ( Size = NextCapOffset - (((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress) & 0xFFF); } - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), Size, @@ -6408,7 +6431,7 @@ PrintInterpretedExtendedCompatibilityIntegrityEncryption ( Header->IdeStatus ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_INTEGRITY_DATA_ENCRYPTION), @@ -6457,7 +6480,7 @@ PrintInterpretedExtendedCompatibilityPhysicalLayer64 ( Header->Status.Bits.NoEqualizationNeededRcvd ); - // Calculate the size for DumpHex + // Calculate the size for PciConfigSpaceDumpHex UINT32 NextCapOffset = HeaderAddress->NextCapabilityOffset; UINTN Size; @@ -6471,7 +6494,7 @@ PrintInterpretedExtendedCompatibilityPhysicalLayer64 ( Size = NextCapOffset - (((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress) & 0xFFF); } - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), Size, @@ -6512,7 +6535,7 @@ PrintInterpretedExtendedCompatibilityFlitLogging ( Header->FlitErrorData3 ); - DumpHex ( + PciConfigSpaceDumpHex ( 4, EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8 *)HeaderAddress - (UINT8 *)HeadersBaseAddress), sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_FLIT_LOGGING), From 5cf1be671b6869677fe22bebb38ac8519a53089e Mon Sep 17 00:00:00 2001 From: Chasel Chiu Date: Fri, 3 Oct 2025 08:58:24 -0700 Subject: [PATCH 0640/1172] ShellPkg/pci.c: Fix typo in source code. Signed-off-by: Chasel Chiu --- ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c index bb574e8eefd2..f47cc97c31f5 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c @@ -1813,7 +1813,7 @@ PciPrintClassCode ( if (IncludePIF) { // - // Print base class, sub class, and programming inferface name + // Print base class, sub class, and programming interface name // ShellPrintDefaultEx ( L"%s - %s - %s", @@ -1835,7 +1835,7 @@ PciPrintClassCode ( /** This function finds out the protocol which is in charge of the given - segment, and its bus range covers the current bus number. It lookes + segment, and its bus range covers the current bus number. It looks each instances of RootBridgeIoProtocol handle, until the one meets the criteria is found. @@ -2367,7 +2367,7 @@ CHAR16 *DevicePortTypeTable[] = { L"PCI Express Endpoint", L"Legacy PCI Express Endpoint", L"Unknown Type", - L"Unknonw Type", + L"Unknown Type", L"Root Port of PCI Express Root Complex", L"Upstream Port of PCI Express Switch", L"Downstream Port of PCI Express Switch", @@ -2987,7 +2987,7 @@ ShellCommandRunPci ( /** This function finds out the protocol which is in charge of the given - segment, and its bus range covers the current bus number. It lookes + segment, and its bus range covers the current bus number. It looks each instances of RootBridgeIoProtocol handle, until the one meets the criteria is found. @@ -3077,7 +3077,7 @@ PciGetProtocolAndResource ( EFI_STATUS Status; // - // Get inferface from protocol + // Get interface from protocol // Status = gBS->HandleProtocol ( Handle, From f98662c5e35b6ab60f46ee4350fa0e6eab0497cf Mon Sep 17 00:00:00 2001 From: Bob Morgan Date: Tue, 16 Sep 2025 17:58:58 -0700 Subject: [PATCH 0641/1172] MdePkg/MockFdtLib: add FdtLib mock functions Add FdtDelNode() and FdtGetPath() mock functions. Signed-off-by: Bob Morgan --- MdePkg/Include/Library/FdtLib.h | 1 + MdePkg/Library/BaseFdtLib/FdtLib.c | 1 + .../Mock/Include/GoogleTest/Library/MockFdtLib.h | 14 ++++++++++++++ .../Library/GoogleTest/MockFdtLib/MockFdtLib.cpp | 2 ++ 4 files changed, 18 insertions(+) diff --git a/MdePkg/Include/Library/FdtLib.h b/MdePkg/Include/Library/FdtLib.h index e4cd382cf914..22bd5b188dc3 100644 --- a/MdePkg/Include/Library/FdtLib.h +++ b/MdePkg/Include/Library/FdtLib.h @@ -723,6 +723,7 @@ FdtAddSubnode ( **/ INT32 +EFIAPI FdtDelNode ( IN VOID *Fdt, IN INT32 NodeOffset diff --git a/MdePkg/Library/BaseFdtLib/FdtLib.c b/MdePkg/Library/BaseFdtLib/FdtLib.c index 40efe15e8baa..18c9efb53449 100644 --- a/MdePkg/Library/BaseFdtLib/FdtLib.c +++ b/MdePkg/Library/BaseFdtLib/FdtLib.c @@ -635,6 +635,7 @@ FdtAddSubnode ( **/ INT32 +EFIAPI FdtDelNode ( IN VOID *Fdt, IN INT32 NodeOffset diff --git a/MdePkg/Test/Mock/Include/GoogleTest/Library/MockFdtLib.h b/MdePkg/Test/Mock/Include/GoogleTest/Library/MockFdtLib.h index 9e9ddc21ddc2..53d9bd733e08 100644 --- a/MdePkg/Test/Mock/Include/GoogleTest/Library/MockFdtLib.h +++ b/MdePkg/Test/Mock/Include/GoogleTest/Library/MockFdtLib.h @@ -159,6 +159,20 @@ struct MockFdtLib { (IN CONST VOID *Fdt, IN INT32 NodeOffset) ); + MOCK_FUNCTION_DECLARATION ( + INT32, + FdtDelNode, + (IN VOID *Fdt, + IN INT32 NodeOffset) + ); + MOCK_FUNCTION_DECLARATION ( + INT32, + FdtGetPath, + (IN VOID *Fdt, + IN INT32 NodeOffset, + IN VOID *Buffer, + IN UINT32 BufferSize) + ); }; #endif diff --git a/MdePkg/Test/Mock/Library/GoogleTest/MockFdtLib/MockFdtLib.cpp b/MdePkg/Test/Mock/Library/GoogleTest/MockFdtLib/MockFdtLib.cpp index 8be96704b59a..93b4d626bd1c 100644 --- a/MdePkg/Test/Mock/Library/GoogleTest/MockFdtLib/MockFdtLib.cpp +++ b/MdePkg/Test/Mock/Library/GoogleTest/MockFdtLib/MockFdtLib.cpp @@ -32,3 +32,5 @@ MOCK_FUNCTION_DEFINITION (MockFdtLib, FdtAddSubnode, 3, EFIAPI); MOCK_FUNCTION_DEFINITION (MockFdtLib, FdtSetProperty, 5, EFIAPI); MOCK_FUNCTION_DEFINITION (MockFdtLib, FdtGetName, 3, EFIAPI); MOCK_FUNCTION_DEFINITION (MockFdtLib, FdtNodeDepth, 2, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockFdtLib, FdtDelNode, 2, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockFdtLib, FdtGetPath, 4, EFIAPI); From 0cad130cb4885961da201bb9b08424b3fd3d2249 Mon Sep 17 00:00:00 2001 From: "nick.wang" Date: Tue, 15 Apr 2025 19:35:46 +0800 Subject: [PATCH 0642/1172] MdeModulePkg : Clear keyboard queue buffer after reading There is a possibility to retrieve user input keystroke data stored in the queue buffer via the EFI_SIMPLE_TEXT_INPUT_PROTOCOL pointer. To prevent exposure of the password string, clear the queue buffer by filling it with zeros after reading. Signed-off-by: Nick Wang --- MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdCtrller.c | 2 ++ MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdTextIn.c | 1 + MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.c | 2 +- .../Universal/Console/ConSplitterDxe/ConSplitter.c | 1 + .../Universal/Console/TerminalDxe/TerminalConIn.c | 8 ++++++-- 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdCtrller.c b/MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdCtrller.c index 981309f8b02b..32757a7d1547 100644 --- a/MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdCtrller.c +++ b/MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdCtrller.c @@ -650,6 +650,8 @@ PopScancodeBufHead ( if (Buf != NULL) { Buf[Index] = Queue->Buffer[Queue->Head]; } + + Queue->Buffer[Queue->Head] = 0; } return EFI_SUCCESS; diff --git a/MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdTextIn.c b/MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdTextIn.c index 81d3c6eb70ab..e03c88f743e3 100644 --- a/MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdTextIn.c +++ b/MdeModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2KbdTextIn.c @@ -51,6 +51,7 @@ PopEfikeyBufHead ( CopyMem (KeyData, &Queue->Buffer[Queue->Head], sizeof (EFI_KEY_DATA)); } + ZeroMem (&Queue->Buffer[Queue->Head], sizeof (EFI_KEY_DATA)); Queue->Head = (Queue->Head + 1) % KEYBOARD_EFI_KEY_MAX_COUNT; return EFI_SUCCESS; } diff --git a/MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.c b/MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.c index 93608637dfcd..aef1f8cb9bf4 100644 --- a/MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.c +++ b/MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.c @@ -1844,7 +1844,7 @@ Dequeue ( } CopyMem (Item, Queue->Buffer[Queue->Head], ItemSize); - + ZeroMem (Queue->Buffer[Queue->Head], ItemSize); // // Adjust the head pointer of the FIFO keyboard buffer. // diff --git a/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c b/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c index 2dbb7eaeec7e..a3fa8f8e5e36 100644 --- a/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c +++ b/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c @@ -3308,6 +3308,7 @@ ConSplitterTextInExDequeueKey ( &Private->KeyQueue[1], Private->CurrentNumberOfKeys * sizeof (EFI_KEY_DATA) ); + ZeroMem (&Private->KeyQueue[Private->CurrentNumberOfKeys], sizeof (EFI_KEY_DATA)); return EFI_SUCCESS; } diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c index f1d0a3466e95..8aafb4b223d2 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c +++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c @@ -760,7 +760,8 @@ RawFiFoRemoveOneKey ( return FALSE; } - *Output = TerminalDevice->RawFiFo->Data[Head]; + *Output = TerminalDevice->RawFiFo->Data[Head]; + TerminalDevice->RawFiFo->Data[Head] = 0; TerminalDevice->RawFiFo->Head = (UINT8)((Head + 1) % (RAW_FIFO_MAX_NUMBER + 1)); @@ -881,6 +882,7 @@ EfiKeyFiFoForNotifyRemoveOneKey ( } CopyMem (Output, &EfiKeyFiFo->Data[Head], sizeof (EFI_INPUT_KEY)); + ZeroMem (&EfiKeyFiFo->Data[Head], sizeof (EFI_INPUT_KEY)); EfiKeyFiFo->Head = (UINT8)((Head + 1) % (FIFO_MAX_NUMBER + 1)); @@ -1032,6 +1034,7 @@ EfiKeyFiFoRemoveOneKey ( } CopyMem (Output, &TerminalDevice->EfiKeyFiFo->Data[Head], sizeof (EFI_INPUT_KEY)); + ZeroMem (&TerminalDevice->EfiKeyFiFo->Data[Head], sizeof (EFI_INPUT_KEY)); TerminalDevice->EfiKeyFiFo->Head = (UINT8)((Head + 1) % (FIFO_MAX_NUMBER + 1)); @@ -1142,7 +1145,8 @@ UnicodeFiFoRemoveOneKey ( Head = TerminalDevice->UnicodeFiFo->Head; ASSERT (Head < FIFO_MAX_NUMBER + 1); - *Output = TerminalDevice->UnicodeFiFo->Data[Head]; + *Output = TerminalDevice->UnicodeFiFo->Data[Head]; + TerminalDevice->UnicodeFiFo->Data[Head] = 0; TerminalDevice->UnicodeFiFo->Head = (UINT8)((Head + 1) % (FIFO_MAX_NUMBER + 1)); } From ab04d09555b91037b8463ea5fb4387f16a5a5015 Mon Sep 17 00:00:00 2001 From: "nick.wang" Date: Tue, 15 Apr 2025 19:35:46 +0800 Subject: [PATCH 0643/1172] EmbeddedPkg: Clear keyboard queue buffer after reading There is a possibility to retrieve user input keystroke data stored in the queue buffer via the EFI_SIMPLE_TEXT_INPUT_PROTOCOL pointer. To prevent exposure of the password string, clear the queue buffer by filling it with zeros after reading. Signed-off-by: Nick Wang --- EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboard.c | 1 + 1 file changed, 1 insertion(+) diff --git a/EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboard.c b/EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboard.c index 48a99566df63..41d8457dc58e 100644 --- a/EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboard.c +++ b/EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboard.c @@ -348,6 +348,7 @@ Dequeue ( } CopyMem (KeyData, &Queue->Buffer[Queue->Front], sizeof (EFI_KEY_DATA)); + ZeroMem (&Queue->Buffer[Queue->Front], sizeof (EFI_KEY_DATA)); Queue->Front = (Queue->Front + 1) % QUEUE_MAX_COUNT; return EFI_SUCCESS; From 0f0b472ae54bc6ef8e186e7a60670a60b4131d9c Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 6 Oct 2025 15:58:47 +0200 Subject: [PATCH 0644/1172] OvmfPkg/PlatformInitLib: add sanity checks to igvm code With SEV or SEV-ES being active uninitialized memory is random cipher text instead of being zero-initialized. So checking against zero to figure whenever igvm parameters are present or not is not sufficient. Apply more strict sanity checks. Signed-off-by: Gerd Hoffmann --- OvmfPkg/Library/PlatformInitLib/Igvm.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/OvmfPkg/Library/PlatformInitLib/Igvm.c b/OvmfPkg/Library/PlatformInitLib/Igvm.c index 7df0720801d7..1b0d9a9b851a 100644 --- a/OvmfPkg/Library/PlatformInitLib/Igvm.c +++ b/OvmfPkg/Library/PlatformInitLib/Igvm.c @@ -36,6 +36,8 @@ typedef struct IGVM_MEMORY_MAP_ENTRY { UINT32 Reserved; } IGVM_MEMORY_MAP_ENTRY; +STATIC BOOLEAN mIgvmParamsInvalid; + STATIC IGVM_MEMORY_MAP_ENTRY * EFIAPI @@ -46,6 +48,10 @@ PlatformIgvmMemoryMapFind ( UINT64 Address; IGVM_MEMORY_MAP_ENTRY *Map; + if (mIgvmParamsInvalid) { + return NULL; + } + Address = FixedPcdGet64 (PcdOvmfIgvmParamBase); if (Address == 0) { // no parameter area @@ -58,6 +64,14 @@ PlatformIgvmMemoryMapFind ( return NULL; } + if ((Map[0].EntryType & 0xfff0) || + (Map[0].Reserved != 0)) + { + DEBUG ((DEBUG_INFO, "%a: memory map sanity check failed, ignoring\n", __func__)); + mIgvmParamsInvalid = TRUE; + return NULL; + } + return Map; } @@ -193,6 +207,10 @@ PlatformIgvmVpCount ( UINT64 Address; UINT32 *VpCount; + if (mIgvmParamsInvalid) { + return 0; + } + Address = FixedPcdGet64 (PcdOvmfIgvmParamBase); if (Address == 0) { // no parameter area @@ -205,6 +223,12 @@ PlatformIgvmVpCount ( return 0; } + if (*VpCount & 0xffff0000) { + DEBUG ((DEBUG_INFO, "%a: vp-count sanity check failed, ignoring\n", __func__)); + mIgvmParamsInvalid = TRUE; + return 0; + } + DEBUG ((DEBUG_INFO, "%a: vp-count=%d\n", __func__, *VpCount)); return *VpCount; } From 4bb6dd829641db4111a3cc2693e08348516fe554 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 1 Oct 2025 11:54:55 -0700 Subject: [PATCH 0645/1172] CryptoPkg: Simplify MSFT FLINK_FLAGS Remove /FILEALIGN, /SUBSYSTEM, /EXPORT and /BASE options that are not required for UEFI Shell applications. Signed-off-by: Michael D Kinney --- CryptoPkg/CryptoPkg.dsc | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/CryptoPkg/CryptoPkg.dsc b/CryptoPkg/CryptoPkg.dsc index a6badc5b83e1..e657322be367 100644 --- a/CryptoPkg/CryptoPkg.dsc +++ b/CryptoPkg/CryptoPkg.dsc @@ -327,11 +327,6 @@ OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLibFull.inf BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf TlsLib|CryptoPkg/Library/TlsLib/TlsLib.inf - - MSFT:*_*_*_DLINK_FLAGS = /ALIGN:4096 /FILEALIGN:4096 /SUBSYSTEM:CONSOLE - MSFT:DEBUG_*_*_DLINK_FLAGS = /EXPORT:InitializeDriver=$(IMAGE_ENTRY_POINT) /BASE:0x10000 - MSFT:DEBUG_*_*_DLINK_FLAGS = /EXPORT:InitializeDriver=$(IMAGE_ENTRY_POINT) /BASE:0x10000 - MSFT:NOOPT_*_*_DLINK_FLAGS = /EXPORT:InitializeDriver=$(IMAGE_ENTRY_POINT) /BASE:0x10000 } [Components.IA32, Components.X64, Components.AARCH64] @@ -343,10 +338,7 @@ BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf TlsLib|CryptoPkg/Library/TlsLib/TlsLib.inf - MSFT:*_*_*_DLINK_FLAGS = /ALIGN:4096 /FILEALIGN:4096 /SUBSYSTEM:CONSOLE - MSFT:DEBUG_*_*_DLINK_FLAGS = /EXPORT:InitializeDriver=$(IMAGE_ENTRY_POINT) /BASE:0x10000 - MSFT:DEBUG_*_*_DLINK_FLAGS = /EXPORT:InitializeDriver=$(IMAGE_ENTRY_POINT) /BASE:0x10000 - MSFT:NOOPT_*_*_DLINK_FLAGS = /EXPORT:InitializeDriver=$(IMAGE_ENTRY_POINT) /BASE:0x10000 + MSFT:*_*_*_DLINK_FLAGS = /ALIGN:4096 } [Components.RISCV64] From 0070fd1aec65caafda40466f433580c340412438 Mon Sep 17 00:00:00 2001 From: Nate DeSimone Date: Wed, 8 Oct 2025 11:02:01 -0700 Subject: [PATCH 0646/1172] CryptoPkg: Fix build of MbedTlsLib Fixes build failures caused by __USE_MINGW_ANSI_STDIO not being defined when building with CLANG. Signed-off-by: Nate DeSimone --- CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf | 2 +- CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf b/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf index 3828d517ad83..206ae29b1cf4 100644 --- a/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf +++ b/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf @@ -129,7 +129,7 @@ GCC:*_*_RISCV64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_CLANGDWARF_*_CC_FLAGS = -std=gnu99 -Wno-error=uninitialized - GCC:*_CLANGPDB_*_CC_FLAGS = -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize + GCC:*_CLANGPDB_*_CC_FLAGS = -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize -D__USE_MINGW_ANSI_STDIO=0 # suppress the following warnings in mbedtls so we don't break the build with warnings-as-errors: # 1295: Deprecated declaration - give arg types diff --git a/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf b/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf index 2635593aa011..a9bc2c6be014 100644 --- a/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf +++ b/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf @@ -133,7 +133,7 @@ GCC:*_*_RISCV64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_CLANGDWARF_*_CC_FLAGS = -std=gnu99 -Wno-error=uninitialized - GCC:*_CLANGPDB_*_CC_FLAGS = -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize + GCC:*_CLANGPDB_*_CC_FLAGS = -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize -D__USE_MINGW_ANSI_STDIO=0 # suppress the following warnings in mbedtls so we don't break the build with warnings-as-errors: # 1295: Deprecated declaration - give arg types From 3b83fe39589809e18dbeeb22a1baf969243886ff Mon Sep 17 00:00:00 2001 From: Chao Li Date: Mon, 29 Sep 2025 15:36:00 +0800 Subject: [PATCH 0647/1172] BaseTools: Disable GCC relax on LoongArch It might appear some odd problems if enable GCC relax. Disabling it can avoid these problems. Signed-off-by: Chao Li Cc: Rebecca Cran Cc: Liming Gao Cc: Guillermo Antonio Palomino Sosa Cc: Yuwei Chen Cc: Poncho Figueroa --- BaseTools/Conf/tools_def.template | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index ab59da016324..90a389bdff07 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -930,11 +930,11 @@ DEFINE GCC5_RISCV64_DLINK_FLAGS = DEF(GCC5_RISCV_ALL_DLINK_FLAGS) -Wl DEFINE GCC5_RISCV64_DLINK2_FLAGS = DEF(GCC5_RISCV_ALL_DLINK2_FLAGS) DEFINE GCC5_RISCV64_ASM_FLAGS = DEF(GCC5_RISCV_ALL_ASM_FLAGS) -march=DEF(GCC5_RISCV64_ARCH) -mcmodel=medany -mabi=lp64 -DEFINE GCC5_LOONGARCH64_CC_FLAGS = DEF(GCC_LOONGARCH64_CC_FLAGS) -march=loongarch64 -mno-memcpy -Werror -Wno-maybe-uninitialized -Wno-stringop-overflow -Wno-pointer-to-int-cast -no-pie -fno-stack-protector -mno-explicit-relocs -DEFINE GCC5_LOONGARCH64_DLINK_FLAGS = DEF(GCC_LOONGARCH64_DLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS) +DEFINE GCC5_LOONGARCH64_CC_FLAGS = DEF(GCC_LOONGARCH64_CC_FLAGS) -march=loongarch64 -mno-memcpy -Werror -Wno-maybe-uninitialized -Wno-stringop-overflow -Wno-pointer-to-int-cast -no-pie -fno-stack-protector -mno-explicit-relocs -mno-relax +DEFINE GCC5_LOONGARCH64_DLINK_FLAGS = DEF(GCC_LOONGARCH64_DLINK_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS) -Wl,--no-relax DEFINE GCC5_LOONGARCH64_DLINK2_FLAGS = DEF(GCC_DLINK2_FLAGS_COMMON) -Wl,--defsym=PECOFF_HEADER_SIZE=0x228 DEFINE GCC5_LOONGARCH64_ASLDLINK_FLAGS = DEF(GCC_LOONGARCH64_ASLDLINK_FLAGS) DEF(GCC5_LOONGARCH64_DLINK2_FLAGS) DEF(GCC5_DLINK_WARNING_FLAGS) -DEFINE GCC5_LOONGARCH64_ASM_FLAGS = -x assembler-with-cpp -mabi=lp64d -march=loongarch64 -fno-builtin -c -Wall -mno-explicit-relocs +DEFINE GCC5_LOONGARCH64_ASM_FLAGS = -x assembler-with-cpp -mabi=lp64d -march=loongarch64 -fno-builtin -c -Wall -mno-explicit-relocs -mno-relax DEFINE GCC5_LOONGARCH64_PP_FLAGS = -mabi=lp64d -march=loongarch64 DEF(GCC_PP_FLAGS) #################################################################################### From aff203c3ceb1a3967273bba5ca5eba89777c9633 Mon Sep 17 00:00:00 2001 From: Rebecca Cran Date: Thu, 9 Oct 2025 16:45:27 -0600 Subject: [PATCH 0648/1172] Maintainers.txt: Remove myself as BaseTools maintainer Remove myself as a BaseTools maintainer. Signed-off-by: Rebecca Cran --- Maintainers.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/Maintainers.txt b/Maintainers.txt index 9a7dc0d2ae55..f6bd3133d3c5 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -171,7 +171,6 @@ R: Gerd Hoffmann [kraxel] BaseTools F: BaseTools/ W: https://github.com/tianocore/tianocore.github.io/wiki/BaseTools -M: Rebecca Cran [bexcran] M: Liming Gao [lgao4] M: Guillermo Antonio Palomino Sosa [gapalomi] R: Yuwei Chen [YuweiChen1110] From 80eaa563ec1cd2272334134d5fd35d856843fe65 Mon Sep 17 00:00:00 2001 From: Qihang Gao Date: Thu, 18 Sep 2025 20:29:05 +0800 Subject: [PATCH 0649/1172] MdeModulePkg/HiiDatabaseDxe: Avoid unexpected memory free TempBuffer variable is only dynamically allocated when the opcode is EFI_IFR_STRING_OP and the string value is not 0, so it should be freed under the same condition. Otherwise, the variable may be unexpected freed. Signed-off-by: Qihang Gao --- MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c index a282f6da5c6b..9b58f1e3fc68 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c @@ -4298,7 +4298,7 @@ GenerateAltConfigResp ( DefaultString = NULL; } - if ((BlockData->OpCode == EFI_IFR_STRING_OP) && (TmpBuffer != NULL)) { + if ((BlockData->OpCode == EFI_IFR_STRING_OP) && (DefaultValueData->Value.string != 0) && (TmpBuffer != NULL)) { FreePool (TmpBuffer); TmpBuffer = NULL; } From 549b473b2326891fb051cb7cd646808d764f8448 Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Wed, 3 Sep 2025 10:58:01 +0100 Subject: [PATCH 0650/1172] MdePkg/BaseFdtLib: Add FdtGetPhandle wrapper Add wrapper for fdt_get_phandle(). Signed-off-by: Sarah Walker --- MdePkg/Include/Library/FdtLib.h | 15 +++++++++++++++ MdePkg/Library/BaseFdtLib/FdtLib.c | 18 ++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/MdePkg/Include/Library/FdtLib.h b/MdePkg/Include/Library/FdtLib.h index 22bd5b188dc3..a7f63f3d5a03 100644 --- a/MdePkg/Include/Library/FdtLib.h +++ b/MdePkg/Include/Library/FdtLib.h @@ -945,6 +945,21 @@ FdtSizeCells ( IN INT32 NodeOffset ); +/** + Retrieve the phandle of a given node + + @param[in] Fdt The pointer to FDT blob. + @param[in] NodeOffset Offset of node to check. + + @return Phandle of the node at NodeOffset, or 0 on error. +**/ +UINT32 +EFIAPI +FdtGetPhandle ( + IN CONST VOID *Fdt, + IN INT32 NodeOffset + ); + /* Debug functions. */ CONST CHAR8 diff --git a/MdePkg/Library/BaseFdtLib/FdtLib.c b/MdePkg/Library/BaseFdtLib/FdtLib.c index 18c9efb53449..3dacfbee4526 100644 --- a/MdePkg/Library/BaseFdtLib/FdtLib.c +++ b/MdePkg/Library/BaseFdtLib/FdtLib.c @@ -900,6 +900,24 @@ FdtSizeCells ( return fdt_size_cells (Fdt, NodeOffset); } +/** + Retrieve the phandle of a given node + + @param[in] Fdt The pointer to FDT blob. + @param[in] NodeOffset Offset of node to check. + + @return Phandle of the node at NodeOffset, or 0 on error. +**/ +UINT32 +EFIAPI +FdtGetPhandle ( + IN CONST VOID *Fdt, + IN INT32 NodeOffset + ) +{ + return fdt_get_phandle (Fdt, NodeOffset); +} + /* Debug functions. */ CONST CHAR8 From 2ad74b956b1acb1b5a85c57c4f98ea4371cbb7e8 Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Wed, 3 Sep 2025 11:05:37 +0100 Subject: [PATCH 0651/1172] DynamicTablesPkg/FdtHwInfoParserLib: Support 1 PMU IRQ per core The current Arm GICC parser only supports one PMU IRQ shared between all cores. Newer systems use a unique PMU IRQ per core. Signed-off-by: Sarah Walker --- .../Arm/Gic/ArmGicCParser.c | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Gic/ArmGicCParser.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Gic/ArmGicCParser.c index 4bbe7e0d5026..7e30f8139f19 100644 --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Gic/ArmGicCParser.c +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Gic/ArmGicCParser.c @@ -747,26 +747,36 @@ GicCPmuNodeParser ( } Data = FdtGetProp (Fdt, PmuNode, "interrupts", &DataSize); - if ((Data == NULL) || (DataSize != (IntCells * sizeof (UINT32)))) { - // If error or not 1 interrupt. + if ((Data == NULL) || ((DataSize != (GicCCmObjDesc->Count * IntCells * sizeof (UINT32))) && (DataSize != (IntCells * sizeof (UINT32))))) { + // If error, not 1 interrupt or not 1 interrupt per core. ASSERT (Data != NULL); - ASSERT (DataSize == (IntCells * sizeof (UINT32))); + ASSERT (DataSize == (IntCells * sizeof (UINT32)) || DataSize == (GicCCmObjDesc->Count * IntCells * sizeof (UINT32))); return EFI_ABORTED; } - PmuIrq = FdtGetInterruptId ((CONST UINT32 *)Data); + if (DataSize == (IntCells * sizeof (UINT32))) { + // One shared PMU IRQ + PmuIrq = FdtGetInterruptId ((CONST UINT32 *)Data); - // Only supports PPI 23 for now. - // According to BSA 1.0 s3.6 PPI assignments, PMU IRQ ID is 23. A non BSA - // compliant system may assign a different IRQ for the PMU, however this - // is not implemented for now. - if (PmuIrq != BSA_PMU_IRQ) { - ASSERT (PmuIrq == BSA_PMU_IRQ); - return EFI_ABORTED; - } + // Only supports PPI 23 for now. + // According to BSA 1.0 s3.6 PPI assignments, PMU IRQ ID is 23. A non BSA + // compliant system may assign a different IRQ for the PMU, however this + // is not implemented for now. + if (PmuIrq != BSA_PMU_IRQ) { + ASSERT (PmuIrq == BSA_PMU_IRQ); + return EFI_ABORTED; + } - for (Index = 0; Index < GicCCmObjDesc->Count; Index++) { - GicCInfo[Index].PerformanceInterruptGsiv = PmuIrq; + for (Index = 0; Index < GicCCmObjDesc->Count; Index++) { + GicCInfo[Index].PerformanceInterruptGsiv = PmuIrq; + } + } else { + // One PMU IRQ per core + for (Index = 0; Index < GicCCmObjDesc->Count; Index++) { + GicCInfo[Index].PerformanceInterruptGsiv = FdtGetInterruptId ((CONST UINT32 *)Data); + + Data += IntCells * sizeof (UINT32); + } } return EFI_SUCCESS; From 12690ffbb850c540834f0225477c9f3521434271 Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Wed, 3 Sep 2025 11:20:34 +0100 Subject: [PATCH 0652/1172] DynamicTablesPkg: Add helper to add CmObj with given token Implement function to add a CmObj with a token provided by the caller. This is intended to be used with abstract tokens, the value of which is generated by the caller. Signed-off-by: Sarah Walker --- .../Include/Library/DynamicPlatRepoLib.h | 3 + .../Include/Library/HwInfoParserLib.h | 3 + .../DynamicPlatRepoLib/DynamicPlatRepo.c | 10 +++- .../FdtHwInfoParserLib/CmObjectDescUtility.c | 55 +++++++++++++++++++ .../FdtHwInfoParserLib/CmObjectDescUtility.h | 22 ++++++++ 5 files changed, 90 insertions(+), 3 deletions(-) diff --git a/DynamicTablesPkg/Include/Library/DynamicPlatRepoLib.h b/DynamicTablesPkg/Include/Library/DynamicPlatRepoLib.h index bb18215b08bc..028682b0e4da 100644 --- a/DynamicTablesPkg/Include/Library/DynamicPlatRepoLib.h +++ b/DynamicTablesPkg/Include/Library/DynamicPlatRepoLib.h @@ -24,6 +24,8 @@ typedef VOID *DYNAMIC_PLATFORM_REPOSITORY_INFO; @param [in] This This dynamic platform repository. @param [in] CmObjDesc CmObj to add. The data is copied. + @param [in] NewToken Token for this object. If CM_NULL_TOKEN, then + a new token is generated. @param [out] Token If not NULL, token allocated to this CmObj. @retval EFI_SUCCESS Success. @@ -35,6 +37,7 @@ EFIAPI DynPlatRepoAddObject ( IN DYNAMIC_PLATFORM_REPOSITORY_INFO *This, IN CONST CM_OBJ_DESCRIPTOR *CmObjDesc, + IN CM_OBJECT_TOKEN NewToken, OUT CM_OBJECT_TOKEN *Token OPTIONAL ); diff --git a/DynamicTablesPkg/Include/Library/HwInfoParserLib.h b/DynamicTablesPkg/Include/Library/HwInfoParserLib.h index 9710f7466170..9c66ef6eb669 100644 --- a/DynamicTablesPkg/Include/Library/HwInfoParserLib.h +++ b/DynamicTablesPkg/Include/Library/HwInfoParserLib.h @@ -25,6 +25,8 @@ typedef VOID *HW_INFO_PARSER_HANDLE; @param [in] Context A pointer to the caller's context provided in HwInfoParserInit (). @param [in] CmObjDesc CM_OBJ_DESCRIPTOR containing the CmObj(s) to add. + @param [in] NewToken Token for this object. If CM_NULL_TOKEN, then + a new token is generated. @param [out] Token If provided and success, contain the token generated for the CmObj. @@ -37,6 +39,7 @@ EFI_STATUS IN HW_INFO_PARSER_HANDLE ParserHandle, IN VOID *Context, IN CONST CM_OBJ_DESCRIPTOR *CmObjDesc, + IN CONST CM_OBJECT_TOKEN NewToken, OUT CM_OBJECT_TOKEN *Token OPTIONAL ); diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepo.c b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepo.c index 08d11ac96a22..c35cb36fd30e 100644 --- a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepo.c +++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepo.c @@ -113,6 +113,8 @@ FreeCmObjNode ( @param [in] This This dynamic platform repository. @param [in] CmObjDesc CmObj to add. The data is copied. + @param [in] NewToken Token for this object. If CM_NULL_TOKEN, then + a new token is generated. @param [out] Token If not NULL, token allocated to this CmObj. @retval EFI_SUCCESS Success. @@ -124,13 +126,13 @@ EFIAPI DynPlatRepoAddObject ( IN DYNAMIC_PLATFORM_REPOSITORY_INFO *This, IN CONST CM_OBJ_DESCRIPTOR *CmObjDesc, + IN CM_OBJECT_TOKEN NewToken, OUT CM_OBJECT_TOKEN *Token OPTIONAL ) { EFI_STATUS Status; CM_OBJ_NODE *ObjNode; CM_OBJECT_ID ObjId; - CM_OBJECT_TOKEN NewToken; LIST_ENTRY *ObjList; EOBJECT_NAMESPACE_ID NamespaceId; @@ -175,8 +177,10 @@ DynPlatRepoAddObject ( return EFI_INVALID_PARAMETER; } - // Generate a token. - NewToken = GenerateToken (); + // Generate a token if required. + if (NewToken == CM_NULL_TOKEN) { + NewToken = GenerateToken (); + } // Create an ObjNode. Status = AllocCmObjNode (CmObjDesc, NewToken, &ObjNode); diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/CmObjectDescUtility.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/CmObjectDescUtility.c index 120a98c2a9eb..16a2eaa6e0af 100644 --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/CmObjectDescUtility.c +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/CmObjectDescUtility.c @@ -140,12 +140,65 @@ AddSingleCmObj ( FdtParserHandle, FdtParserHandle->Context, &CmObjDesc, + CM_NULL_TOKEN, Token ); ASSERT_EFI_ERROR (Status); return Status; } +/** Add a single CmObj to the Configuration Manager. + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] ObjectId CmObj ObjectId. + @param [in] Data CmObj Data. + @param [in] Size CmObj Size. + @param [out] Token If provided and success, + token generated for this CmObj. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. +**/ +EFI_STATUS +EFIAPI +AddSingleCmObjWithToken ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN CM_OBJECT_ID ObjectId, + IN VOID *Data, + IN UINT32 Size, + IN CONST CM_OBJECT_TOKEN Token + ) +{ + EFI_STATUS Status; + CM_OBJ_DESCRIPTOR CmObjDesc; + + if ((FdtParserHandle == NULL) || + (FdtParserHandle->HwInfoAdd == NULL) || + (Data == NULL) || + (Size == 0)) + { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + CmObjDesc.ObjectId = ObjectId; + CmObjDesc.Count = 1; + CmObjDesc.Data = Data; + CmObjDesc.Size = Size; + + // Add the CmObj. + // Don't ask for a token. + Status = FdtParserHandle->HwInfoAdd ( + FdtParserHandle, + FdtParserHandle->Context, + &CmObjDesc, + Token, + NULL + ); + ASSERT_EFI_ERROR (Status); + return Status; +} + /** Add multiple CmObj to the Configuration Manager. @param [in] FdtParserHandle A handle to the parser instance. @@ -204,6 +257,7 @@ AddMultipleCmObj ( FdtParserHandle, FdtParserHandle->Context, &SingleCmObjDesc, + CM_NULL_TOKEN, (TokenTable != NULL) ? &TokenTable[Index] : NULL @@ -296,6 +350,7 @@ AddMultipleCmObjWithCmObjRef ( FdtParserHandle, FdtParserHandle->Context, &CmObjRef, + CM_NULL_TOKEN, Token ); ASSERT_EFI_ERROR (Status); diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/CmObjectDescUtility.h b/DynamicTablesPkg/Library/FdtHwInfoParserLib/CmObjectDescUtility.h index 14e135335f9e..d0002bb936eb 100644 --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/CmObjectDescUtility.h +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/CmObjectDescUtility.h @@ -71,6 +71,28 @@ AddSingleCmObj ( OUT CM_OBJECT_TOKEN *Token OPTIONAL ); +/** Add a single CmObj to the Configuration Manager. + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] ObjectId CmObj ObjectId. + @param [in] Data CmObj Data. + @param [in] Size CmObj Size. + @param [out] Token If provided and success, + token generated for this CmObj. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. +**/ +EFI_STATUS +EFIAPI +AddSingleCmObjWithToken ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN CM_OBJECT_ID ObjectId, + IN VOID *Data, + IN UINT32 Size, + IN CONST CM_OBJECT_TOKEN Token + ); + /** Add multiple CmObj to the Configuration Manager. @param [in] FdtParserHandle A handle to the parser instance. From b0aac86c0db73349f7c8da71506c70fc409a80ca Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Thu, 2 Oct 2025 17:28:43 +0100 Subject: [PATCH 0653/1172] DynamicTablesPkg: Add helper to add array as a CmObj Implement a helper to add an array as a CmObj. Signed-off-by: Sarah Walker --- .../DynamicPlatRepoLib/DynamicPlatRepo.c | 4 +- .../FdtHwInfoParserLib/CmObjectDescUtility.c | 52 +++++++++++++++++++ .../FdtHwInfoParserLib/CmObjectDescUtility.h | 22 ++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepo.c b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepo.c index c35cb36fd30e..fb8e0b44f530 100644 --- a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepo.c +++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepo.c @@ -286,7 +286,9 @@ GroupCmObjNodes ( if ((CmObjDesc->Count != 1) && ((NamespaceId != EObjNameSpaceArchCommon) || - (ObjIndex != EArchCommonObjCmRef))) + (ObjIndex != EArchCommonObjCmRef)) && + ((NamespaceId != EObjNameSpaceArm) || + (ObjIndex != EArmObjIdMappingArray))) { // We expect each descriptor to contain an individual object. // EArchCommonObjCmRef objects are counted as groups, so +1 as well. diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/CmObjectDescUtility.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/CmObjectDescUtility.c index 16a2eaa6e0af..198300b402c5 100644 --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/CmObjectDescUtility.c +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/CmObjectDescUtility.c @@ -147,6 +147,58 @@ AddSingleCmObj ( return Status; } +/** Add a CmObj representing an array to the Configuration Manager. + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] ObjectId CmObj ObjectId. + @param [in] Data CmObj Data. + @param [in] Size Total size of array, in bytes. + @param [in] Count Count of objects in array. + @param [out] Token If provided and success, + token generated for this CmObj. + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. +**/ +EFI_STATUS +EFIAPI +AddSingleCmObjArray ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN CM_OBJECT_ID ObjectId, + IN VOID *Data, + IN UINT32 Size, + IN UINT32 Count, + OUT CM_OBJECT_TOKEN *Token OPTIONAL + ) +{ + EFI_STATUS Status; + CM_OBJ_DESCRIPTOR CmObjDesc; + + if ((FdtParserHandle == NULL) || + (FdtParserHandle->HwInfoAdd == NULL) || + (Data == NULL) || + (Size == 0)) + { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + CmObjDesc.ObjectId = ObjectId; + CmObjDesc.Count = Count; + CmObjDesc.Data = Data; + CmObjDesc.Size = Size; + + // Add the CmObj. + // Don't ask for a token. + Status = FdtParserHandle->HwInfoAdd ( + FdtParserHandle, + FdtParserHandle->Context, + &CmObjDesc, + CM_NULL_TOKEN, + Token + ); + ASSERT_EFI_ERROR (Status); + return Status; +} + /** Add a single CmObj to the Configuration Manager. @param [in] FdtParserHandle A handle to the parser instance. diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/CmObjectDescUtility.h b/DynamicTablesPkg/Library/FdtHwInfoParserLib/CmObjectDescUtility.h index d0002bb936eb..f2272bf32a48 100644 --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/CmObjectDescUtility.h +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/CmObjectDescUtility.h @@ -71,6 +71,28 @@ AddSingleCmObj ( OUT CM_OBJECT_TOKEN *Token OPTIONAL ); +/** Add a CmObj representing an array to the Configuration Manager. + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] ObjectId CmObj ObjectId. + @param [in] Data CmObj Data. + @param [in] Size Total size of array, in bytes. + @param [in] Count Count of objects in array. + @param [out] Token If provided and success, + token generated for this CmObj. + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. +**/ +EFI_STATUS +EFIAPI +AddSingleCmObjArray ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN CM_OBJECT_ID ObjectId, + IN VOID *Data, + IN UINT32 Size, + IN UINT32 Count, + OUT CM_OBJECT_TOKEN *Token OPTIONAL + ); + /** Add a single CmObj to the Configuration Manager. @param [in] FdtParserHandle A handle to the parser instance. From ba69c6d514ff64b444b8392b4e967925831bd8f2 Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Wed, 3 Sep 2025 11:32:34 +0100 Subject: [PATCH 0654/1172] DynamicTablesPkg: FdtHwInfoParserLib: Generate GIC ITS group objects Add generation of GIC ITS identifier array and group CmObjs. Signed-off-by: Sarah Walker --- .../Include/StandardNameSpaceObjects.h | 8 +++ .../Arm/Gic/ArmGicItsParser.c | 56 ++++++++++++++++++- .../Arm/Gic/ArmGicItsParser.h | 18 +++++- 3 files changed, 76 insertions(+), 6 deletions(-) diff --git a/DynamicTablesPkg/Include/StandardNameSpaceObjects.h b/DynamicTablesPkg/Include/StandardNameSpaceObjects.h index e45d31e7cca6..cf0efe245617 100644 --- a/DynamicTablesPkg/Include/StandardNameSpaceObjects.h +++ b/DynamicTablesPkg/Include/StandardNameSpaceObjects.h @@ -54,10 +54,18 @@ typedef UINTN CM_OBJECT_TOKEN; typedef enum AbstractTokenID { ETokenNameSpaceUnknown = 0, ETokenNameSpaceSmbios, + ETokenNameSpaceFdtHwInfo, ETokenNameSpaceMax } EABSTRACT_TOKEN_ID; +/** The EFDT_HW_INFO_OBJECT_ID enum describes the defined object + types for the ETokenNameSpaceFdtHwInfo namespace. +*/ +typedef enum FdtHwInfoObjectID { + EFdtHwInfoIortObject = 0 +} EFDT_HW_INFO_OBJECT_ID; + /** Abstract token generated by table generators Description of abstract token format diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Gic/ArmGicItsParser.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Gic/ArmGicItsParser.c index 606abca5a70e..ed0c792e2674 100644 --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Gic/ArmGicItsParser.c +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Gic/ArmGicItsParser.c @@ -92,11 +92,23 @@ GicItsIntcNodeParser ( This parser expects FdtBranch to be a Gic interrupt-controller node. Gic version must be v3 or higher. typedef struct CmArmGicItsInfo { - UINT32 GicItsId; // {Populated} - UINT64 PhysicalBaseAddress; // {Populated} - UINT32 ProximityDomain; // {default = 0} + UINT32 GicItsId; // {Populated} + UINT64 PhysicalBaseAddress; // {Populated} + UINT32 ProximityDomain; // {default = 0} + CM_OBJECT_TOKEN ProximityDomainToken; // {default = CM_NULL_TOKEN} } CM_ARM_GIC_ITS_INFO; + typedef struct CmArmItsGroupNode { + CM_OBJECT_TOKEN Token; // {default = CM_NULL_TOKEN} + UINT32 ItsIdCount; // {Populated} + CM_OBJECT_TOKEN ItsIdToken; // {Populated} + UINT32 Identifier; // {default = 0} + } CM_ARM_ITS_GROUP_NODE; + + typedef struct CmArmGicItsIdentifier { + UINT32 ItsId; // {Populated} + } CM_ARM_ITS_IDENTIFIER; + A parser parses a Device Tree to populate a specific CmObj type. None, one or many CmObj can be created by the parser. The created CmObj are then handed to the parser's caller through the @@ -129,6 +141,10 @@ ArmGicItsInfoParser ( UINT32 GicItsNodeCount; VOID *Fdt; + CM_ARM_ITS_GROUP_NODE ItsGroupNodeInfo; + CM_ARM_ITS_IDENTIFIER ItsIdentifier; + CM_OBJECT_TOKEN Token; + if (FdtParserHandle == NULL) { ASSERT (0); return EFI_INVALID_PARAMETER; @@ -174,6 +190,8 @@ ArmGicItsInfoParser ( GicItsNode = FdtBranch; for (Index = 0; Index < GicItsNodeCount; Index++) { ZeroMem (&GicItsInfo, sizeof (CM_ARM_GIC_ITS_INFO)); + ZeroMem (&ItsGroupNodeInfo, sizeof (CM_ARM_ITS_GROUP_NODE)); + ZeroMem (&ItsIdentifier, sizeof (CM_ARM_ITS_IDENTIFIER)); Status = FdtGetNextPropNodeInBranch ( Fdt, @@ -214,6 +232,38 @@ ArmGicItsInfoParser ( ASSERT (0); return Status; } + + ItsIdentifier.ItsId = Index; + + // Add the CmObj to the Configuration Manager. + Status = AddSingleCmObj ( + FdtParserHandle, + CREATE_CM_ARM_OBJECT_ID (EArmObjGicItsIdentifierArray), + &ItsIdentifier, + sizeof (CM_ARM_ITS_IDENTIFIER), + &Token + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + ItsGroupNodeInfo.ItsIdCount = 1; + ItsGroupNodeInfo.ItsIdToken = Token; + + // Add the CmObj to the Configuration Manager. + // Abstract token allows the IORT parser to link to this object + Status = AddSingleCmObjWithToken ( + FdtParserHandle, + CREATE_CM_ARM_OBJECT_ID (EArmObjItsGroup), + &ItsGroupNodeInfo, + sizeof (CM_ARM_ITS_GROUP_NODE), + CM_ABSTRACT_TOKEN_MAKE (ETokenNameSpaceFdtHwInfo, EFdtHwInfoIortObject, FdtGetPhandle (Fdt, GicItsNode)) + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } } // for return Status; diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Gic/ArmGicItsParser.h b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Gic/ArmGicItsParser.h index be944493e4d8..e8bf5251868a 100644 --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Gic/ArmGicItsParser.h +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Gic/ArmGicItsParser.h @@ -16,11 +16,23 @@ This parser expects FdtBranch to be a Gic interrupt-controller node. Gic version must be v3 or higher. typedef struct CmArmGicItsInfo { - UINT32 GicItsId; // {Populated} - UINT64 PhysicalBaseAddress; // {Populated} - UINT32 ProximityDomain; // {default = 0} + UINT32 GicItsId; // {Populated} + UINT64 PhysicalBaseAddress; // {Populated} + UINT32 ProximityDomain; // {default = 0} + CM_OBJECT_TOKEN ProximityDomainToken; // {default = CM_NULL_TOKEN} } CM_ARM_GIC_ITS_INFO; + typedef struct CmArmItsGroupNode { + CM_OBJECT_TOKEN Token; // {default = CM_NULL_TOKEN} + UINT32 ItsIdCount; // {Populated} + CM_OBJECT_TOKEN ItsIdToken; // {Populated} + UINT32 Identifier; // {default = 0} + } CM_ARM_ITS_GROUP_NODE; + + typedef struct CmArmGicItsIdentifier { + UINT32 ItsId; // {Populated} + } CM_ARM_ITS_IDENTIFIER; + A parser parses a Device Tree to populate a specific CmObj type. None, one or many CmObj can be created by the parser. The created CmObj are then handed to the parser's caller through the From 954ee29013899ebdc9c263b3bd6268015dafc07a Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Wed, 3 Sep 2025 11:35:25 +0100 Subject: [PATCH 0655/1172] DynamicTablesPkg/FdtHwInfoParserLib: Add Arm IORT parser Add a parser for IORT. Currently generates PCI Root Complex and SMMUv3 nodes. Signed-off-by: Sarah Walker --- .../Common/DynamicPlatRepoLib/TokenMapper.c | 4 + .../Arm/ArmFdtHwInfoParser.c | 6 +- .../Arm/Iort/ArmIortParser.c | 19 + .../Arm/Iort/ArmIortParser.h | 16 + .../Arm/Iort/RootComplexParser.c | 400 ++++++++++++ .../Arm/Iort/RootComplexParser.h | 56 ++ .../Arm/Iort/SmmuV3Parser.c | 581 ++++++++++++++++++ .../Arm/Iort/SmmuV3Parser.h | 59 ++ .../FdtHwInfoParserLib/FdtHwInfoParserLib.inf | 3 + 9 files changed, 1143 insertions(+), 1 deletion(-) create mode 100644 DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/ArmIortParser.c create mode 100644 DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/ArmIortParser.h create mode 100644 DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/RootComplexParser.c create mode 100644 DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/RootComplexParser.h create mode 100644 DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/SmmuV3Parser.c create mode 100644 DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/SmmuV3Parser.h diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenMapper.c b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenMapper.c index 2300375f0386..f59112e602e9 100644 --- a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenMapper.c +++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenMapper.c @@ -72,6 +72,10 @@ TokenMapperAddObject ( (GET_CM_OBJECT_ID (ObjectId) == EArchCommonObjCmRef)) { CmObjDesc->Count = Size / sizeof (CM_ARCH_COMMON_OBJ_REF); + } else if ((GET_CM_NAMESPACE_ID (ObjectId) == EObjNameSpaceArm) && + (GET_CM_OBJECT_ID (ObjectId) == EArmObjIdMappingArray)) + { + CmObjDesc->Count = Size / sizeof (CM_ARM_ID_MAPPING); } else { CmObjDesc->Count = 1; } diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/ArmFdtHwInfoParser.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/ArmFdtHwInfoParser.c index 2aa09e99adf0..4dbf5fe043a7 100644 --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/ArmFdtHwInfoParser.c +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/ArmFdtHwInfoParser.c @@ -12,6 +12,8 @@ #include "Arm/Gic/ArmGicDispatcher.h" #include "Pci/PciConfigSpaceParser.h" #include "Serial/SerialPortParser.h" +#include "Arm/Iort/RootComplexParser.h" +#include "Arm/Iort/SmmuV3Parser.h" /** Ordered table of parsers/dispatchers. @@ -27,7 +29,9 @@ STATIC CONST FDT_HW_INFO_PARSER_FUNC HwInfoParserTable[] = { ArmGenericTimerInfoParser, ArmGicDispatcher, PciConfigInfoParser, - SerialPortDispatcher + SerialPortDispatcher, + ArmPciRootComplexParser, + ArmSmmuV3Parser }; /** Main dispatcher: sequentially call the parsers/dispatchers diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/ArmIortParser.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/ArmIortParser.c new file mode 100644 index 000000000000..43608955a4ee --- /dev/null +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/ArmIortParser.c @@ -0,0 +1,19 @@ +/** @file + Arm IORT parser common functionality. + + Copyright (c) 2025, ARM Limited. All rights reserved.
    + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include "Arm/Iort/ArmIortParser.h" + +STATIC UINT16 IortIdentifier = 0; + +UINT16 +EFIAPI +GetNextIortIdentifier ( + ) +{ + return IortIdentifier++; +} diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/ArmIortParser.h b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/ArmIortParser.h new file mode 100644 index 000000000000..d1858a9a9e2d --- /dev/null +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/ArmIortParser.h @@ -0,0 +1,16 @@ +/** @file + ARM IORT parser common functionality. + + Copyright (c) 2025, Arm Limited. All rights reserved.
    + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef ARM_IORT_PARSER_H_ +#define ARM_IORT_PARSER_H_ + +UINT16 +EFIAPI +GetNextIortIdentifier ( + ); + +#endif // ARM_IORT_PARSER_H_ diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/RootComplexParser.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/RootComplexParser.c new file mode 100644 index 000000000000..cc5e507d64fb --- /dev/null +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/RootComplexParser.c @@ -0,0 +1,400 @@ +/** @file + Root Complex parser. + + Copyright (c) 2025, ARM Limited. All rights reserved.
    + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - linux/Documentation/devicetree/bindings/pci/host-generic-pci.yaml +**/ + +#include +#include +#include +#include +#include "FdtHwInfoParser.h" +#include "CmObjectDescUtility.h" +#include "Arm/Iort/ArmIortParser.h" +#include "Arm/Iort/RootComplexParser.h" + +#define IOMMU_MAP_CELL_COUNT 4 + +/** List of "compatible" property values for PciRootComplex nodes. + + Other "compatible" values are not supported by this module. +*/ +STATIC CONST COMPATIBILITY_STR RootComplexCompatibleStr[] = { + { "pci-host-ecam-generic" } +}; + +/** PciRootComplex compatiblity information. +*/ +STATIC CONST COMPATIBILITY_INFO RootComplexCompatibleInfo = { + ARRAY_SIZE (RootComplexCompatibleStr), + RootComplexCompatibleStr +}; + +/** Determine the memory address size for the given root complex + + Determine the memory address size based on the dma-ranges property. If this + property is not present then default to 32 bits. + + @param [in] Fdt Pointer to FDT + @param [in] RootComplexNode Offset of root complex node + @param [out] MemoryAddressSize Location to store memory address size + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. +**/ +STATIC +EFI_STATUS +RootComplexNodeGetMemoryAddressSize ( + IN CONST VOID *Fdt, + IN CONST INT32 RootComplexNode, + OUT UINT8 *MemoryAddressSize + ) +{ + CONST UINT32 *DmaRanges; + INT32 ParentNode; + INT32 DataSize; + INT32 AddressCells; + INT32 SizeCells; + INT32 ParentAddressCells; + INT32 Stride; + INTN DataOffset; + INTN SizeOffset; + UINT64 DmaAddressEnd; + UINT64 DmaAddress; + UINT64 Size; + + DmaRanges = FdtGetProp (Fdt, RootComplexNode, "dma-ranges", &DataSize); + if ((DmaRanges == NULL) || (DataSize <= 0)) { + *MemoryAddressSize = 32; + return 0; + } + + AddressCells = FdtAddressCells (Fdt, RootComplexNode); + if (AddressCells < 0) { + ASSERT (AddressCells >= 0); + return EFI_INVALID_PARAMETER; + } + + SizeCells = FdtSizeCells (Fdt, RootComplexNode); + if (SizeCells < 0) { + ASSERT (SizeCells >= 0); + return EFI_INVALID_PARAMETER; + } + + // Find parent node with #address-cells + ParentNode = FdtParentOffset (Fdt, RootComplexNode); + if (ParentNode < 0) { + ASSERT (ParentNode >= 0); + return EFI_INVALID_PARAMETER; + } + + ParentAddressCells = -1; + + do { + ParentAddressCells = FdtAddressCells (Fdt, ParentNode); + if (ParentAddressCells < 0) { + ParentNode = FdtParentOffset (Fdt, ParentNode); + if (ParentNode < 0) { + ASSERT (ParentNode >= 0); + return EFI_INVALID_PARAMETER; + } + } + } while (ParentAddressCells < 0); + + Stride = AddressCells + ParentAddressCells + SizeCells; + SizeOffset = AddressCells + ParentAddressCells; + if ((DataSize < Stride) || ((DataSize % Stride) != 0)) { + ASSERT (DataSize >= Stride && (DataSize % Stride) == 0); + return EFI_INVALID_PARAMETER; + } + + DataOffset = 0; + DmaAddressEnd = 0; + + // Walk dma-ranges and find maximum DMA address + while ((DataOffset + Stride) <= DataSize) { + switch (AddressCells) { + case 1: + DmaAddress = Fdt32ToCpu (DmaRanges[DataOffset]); + break; + case 2: + DmaAddress = Fdt64ToCpu (*(UINT64 *)&DmaRanges[DataOffset]); + break; + case 3: + DmaAddress = Fdt64ToCpu (*(UINT64 *)&DmaRanges[DataOffset + 1]); + break; + default: + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + switch (SizeCells) { + case 1: + Size = Fdt32ToCpu (DmaRanges[DataOffset + SizeOffset]); + break; + case 2: + Size = Fdt64ToCpu (*(UINT64 *)&DmaRanges[DataOffset + SizeOffset]); + break; + default: + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + if (DmaAddressEnd < (DmaAddress + Size)) { + DmaAddressEnd = DmaAddress + Size; + } + + DataOffset += Stride; + } + + // Round up if required + if (DmaAddressEnd & (DmaAddressEnd - 1)) { + *MemoryAddressSize = HighBitSet64 (DmaAddressEnd) + 2; + } else { + *MemoryAddressSize = HighBitSet64 (DmaAddressEnd) + 1; + } + + return EFI_SUCCESS; +} + +/** Parse a PCI root complex node. + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] Fdt Pointer to a Flattened Device Tree (Fdt). + @param [in] RootComplexNode Offset of a root complex node. + @param [in] RootComplexInfo The CM_ARM_ROOT_COMPLEX_NODE to populate. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. +**/ +STATIC +EFI_STATUS +EFIAPI +RootComplexNodeParser ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN CONST VOID *Fdt, + IN INT32 RootComplexNode, + IN CM_ARM_ROOT_COMPLEX_NODE *RootComplexInfo + ) +{ + EFI_STATUS Status; + CONST UINT32 *Data; + INT32 DataSize; + CM_ARM_ID_MAPPING *IdMappings; + INT32 MapIndex; + + if ((Fdt == NULL) || (RootComplexInfo == NULL)) { + ASSERT ((Fdt != NULL) && (RootComplexInfo != NULL)); + return EFI_INVALID_PARAMETER; + } + + /// Memory access properties : Cache coherent attributes + /// Memory access properties : Memory access flags + Data = FdtGetProp (Fdt, RootComplexNode, "dma-coherent", &DataSize); + if ((Data != NULL) && (DataSize >= 0)) { + RootComplexInfo->CacheCoherent = EFI_ACPI_IORT_MEM_ACCESS_PROP_CCA; + RootComplexInfo->MemoryAccessFlags = EFI_ACPI_IORT_MEM_ACCESS_FLAGS_CPM | + EFI_ACPI_IORT_MEM_ACCESS_FLAGS_DACS; + } else { + RootComplexInfo->CacheCoherent = 0; + RootComplexInfo->MemoryAccessFlags = 0; + } + + /// Memory access properties : Allocation hints + RootComplexInfo->AllocationHints = 0; + + /// ATS attributes + Data = FdtGetProp (Fdt, RootComplexNode, "ats-supported", &DataSize); + if ((Data != NULL) && (DataSize >= 0)) { + RootComplexInfo->AtsAttribute = EFI_ACPI_IORT_ROOT_COMPLEX_ATS_SUPPORTED; + } else { + RootComplexInfo->AtsAttribute = EFI_ACPI_IORT_ROOT_COMPLEX_ATS_UNSUPPORTED; + } + + /// PCI segment number + Data = FdtGetProp (Fdt, RootComplexNode, "linux,pci-domain", &DataSize); + if (Data != NULL) { + RootComplexInfo->PciSegmentNumber = *Data; + } + + /// Memory address size limit + Status = RootComplexNodeGetMemoryAddressSize (Fdt, RootComplexNode, &RootComplexInfo->MemoryAddressSize); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + /// PASID capabilities + RootComplexInfo->PasidCapabilities = 0; + + /// Flags + RootComplexInfo->Flags = 0; + + /// Unique identifier for this node. + RootComplexInfo->Identifier = GetNextIortIdentifier (); + + Data = FdtGetProp (Fdt, RootComplexNode, "iommu-map", &DataSize); + if ((Data == NULL) || ((DataSize % (IOMMU_MAP_CELL_COUNT * sizeof (UINT32))) != 0)) { + // If error or invalid number of cells (not multiple of IOMMU_MAP_CELL_COUNT). + ASSERT ((Data != NULL) && ((DataSize % (IOMMU_MAP_CELL_COUNT * sizeof (UINT32))) == 0)); + return EFI_ABORTED; + } + + DataSize /= IOMMU_MAP_CELL_COUNT * sizeof (UINT32); + + IdMappings = AllocateZeroPool (DataSize * sizeof (CM_ARM_ID_MAPPING)); + if (IdMappings == NULL) { + ASSERT (IdMappings != NULL); + return EFI_OUT_OF_RESOURCES; + } + + for (MapIndex = 0; MapIndex < DataSize; MapIndex++) { + IdMappings[MapIndex].InputBase = Fdt32ToCpu (((UINT32 *)Data)[MapIndex * IOMMU_MAP_CELL_COUNT]); + IdMappings[MapIndex].NumIds = Fdt32ToCpu (((UINT32 *)Data)[MapIndex * IOMMU_MAP_CELL_COUNT + 3]); + IdMappings[MapIndex].OutputBase = Fdt32ToCpu (((UINT32 *)Data)[MapIndex * IOMMU_MAP_CELL_COUNT + 2]); + IdMappings[MapIndex].OutputReferenceToken = CM_ABSTRACT_TOKEN_MAKE ( + ETokenNameSpaceFdtHwInfo, + EFdtHwInfoIortObject, + Fdt32ToCpu (((UINT32 *)Data)[MapIndex * IOMMU_MAP_CELL_COUNT + 1]) + ); + } + + // Add the CmObj to the Configuration Manager. + Status = AddSingleCmObjArray ( + FdtParserHandle, + CREATE_CM_ARM_OBJECT_ID (EArmObjIdMappingArray), + IdMappings, + sizeof (CM_ARM_ID_MAPPING) * DataSize, + DataSize, + &RootComplexInfo->IdMappingToken + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + FreePool (IdMappings); + return Status; + } + + /// Number of ID mappings + RootComplexInfo->IdMappingCount = DataSize; + + return EFI_SUCCESS; +} + +/** CM_ARM_ROOT_COMPLEX_NODE parser function. + + The following structure is populated: + typedef struct CmArmRootComplexNode { + CM_OBJECT_TOKEN Token; + UINT32 IdMappingCount; // {Populated} + CM_OBJECT_TOKEN IdMappingToken; // {Populated} + UINT32 CacheCoherent; // {Populated} + UINT8 AllocationHints; // {default = 0} + UINT8 MemoryAccessFlags; // {Populated} + UINT32 AtsAttribute; // {Populated} + UINT32 PciSegmentNumber; // {Populated} + UINT8 MemoryAddressSize; // {Populated} + UINT16 PasidCapabilities; // {default = 0} + UINT32 Flags; // {default = 0} + UINT32 Identifier; // {Populated} + } CM_ARM_ROOT_COMPLEX_NODE; + + A parser parses a Device Tree to populate a specific CmObj type. None, + one or many CmObj can be created by the parser. + The created CmObj are then handed to the parser's caller through the + HW_INFO_ADD_OBJECT interface. + This can also be a dispatcher. I.e. a function that not parsing a + Device Tree but calling other parsers. + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] FdtBranch When searching for DT node name, restrict + the search to this Device Tree branch. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. + @retval EFI_UNSUPPORTED Unsupported. +**/ +EFI_STATUS +EFIAPI +ArmPciRootComplexParser ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN INT32 FdtBranch + ) +{ + EFI_STATUS Status; + UINT32 Index; + INT32 RootComplexNode; + UINT32 RootComplexNodeCount; + CM_ARM_ROOT_COMPLEX_NODE RootComplexInfo; + VOID *Fdt; + + if (FdtParserHandle == NULL) { + ASSERT (FdtParserHandle != NULL); + return EFI_INVALID_PARAMETER; + } + + Fdt = FdtParserHandle->Fdt; + Status = FdtCountCompatNodeInBranch ( + Fdt, + FdtBranch, + &RootComplexCompatibleInfo, + &RootComplexNodeCount + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + if (RootComplexNodeCount == 0) { + return EFI_NOT_FOUND; + } + + // Parse each root complex node in the branch. + RootComplexNode = FdtBranch; + for (Index = 0; Index < RootComplexNodeCount; Index++) { + ZeroMem (&RootComplexInfo, sizeof (CM_ARM_ROOT_COMPLEX_NODE)); + + Status = FdtGetNextCompatNodeInBranch ( + Fdt, + FdtBranch, + &RootComplexCompatibleInfo, + &RootComplexNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + if (Status == EFI_NOT_FOUND) { + // Should have found the node. + Status = EFI_ABORTED; + } + + return Status; + } + + Status = RootComplexNodeParser (FdtParserHandle, Fdt, RootComplexNode, &RootComplexInfo); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + // Add the CmObj to the Configuration Manager. + Status = AddSingleCmObj ( + FdtParserHandle, + CREATE_CM_ARM_OBJECT_ID (EArmObjRootComplex), + &RootComplexInfo, + sizeof (CM_ARM_ROOT_COMPLEX_NODE), + NULL + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + } // for + + return Status; +} diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/RootComplexParser.h b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/RootComplexParser.h new file mode 100644 index 000000000000..1f813f0fb6c1 --- /dev/null +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/RootComplexParser.h @@ -0,0 +1,56 @@ +/** @file + Root Complex parser. + + Copyright (c) 2025, Arm Limited. All rights reserved.
    + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - linux/Documentation/devicetree/bindings/pci/host-generic-pci.yaml +**/ + +#ifndef ROOT_COMPLEX_PARSER_H_ +#define ROOT_COMPLEX_PARSER_H_ + +/** CM_ARM_ROOT_COMPLEX_NODE parser function. + + The following structure is populated: + typedef struct CmArmRootComplexNode { + CM_OBJECT_TOKEN Token; + UINT32 IdMappingCount; // {Populated} + CM_OBJECT_TOKEN IdMappingToken; // {Populated} + UINT32 CacheCoherent; // {Populated} + UINT8 AllocationHints; // {default = 0} + UINT8 MemoryAccessFlags; // {Populated} + UINT32 AtsAttribute; // {Populated} + UINT32 PciSegmentNumber; // {Populated} + UINT8 MemoryAddressSize; // {Populated} + UINT16 PasidCapabilities; // {default = 0} + UINT32 Flags; // {default = 0} + UINT32 Identifier; // {Populated} + } CM_ARM_ROOT_COMPLEX_NODE; + + A parser parses a Device Tree to populate a specific CmObj type. None, + one or many CmObj can be created by the parser. + The created CmObj are then handed to the parser's caller through the + HW_INFO_ADD_OBJECT interface. + This can also be a dispatcher. I.e. a function that not parsing a + Device Tree but calling other parsers. + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] FdtBranch When searching for DT node name, restrict + the search to this Device Tree branch. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. + @retval EFI_UNSUPPORTED Unsupported. +**/ +EFI_STATUS +EFIAPI +ArmPciRootComplexParser ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN INT32 FdtBranch + ); + +#endif // ROOT_COMPLEX_PARSER_H_ diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/SmmuV3Parser.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/SmmuV3Parser.c new file mode 100644 index 000000000000..274c5301c17a --- /dev/null +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/SmmuV3Parser.c @@ -0,0 +1,581 @@ +/** @file + Arm SMMUv3 IORT parser. + + Copyright (c) 2025, ARM Limited. All rights reserved.
    + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - linux/Documentation/devicetree/bindings/iommu/arm,smmu-v3.yaml +**/ + +#include +#include +#include +#include +#include "FdtHwInfoParser.h" +#include "CmObjectDescUtility.h" +#include "Arm/Iort/ArmIortParser.h" +#include "Arm/Iort/SmmuV3Parser.h" + +#define IOMMU_MAP_CELL_COUNT 4 +#define MSI_MAP_CELL_COUNT 4 + +/** Find the interrupt ID specified by the given interrupt name + + @param [in] InterruptNames Pointer to the FDT interrupt-names field + @param [in] InterruptNamesSize Size of the FDT interrupt-names field, in bytes + @param [in] Interrupts Pointer to the FDT interrupts field + @param [in] IntCells Number of cells per interrupt + @param [in] Name Pointer to the name of the interrupt to find + + @return Interrupt ID, or 0 if no matching interrupt found +**/ +STATIC +UINT32 +FdtGetInterruptFromName ( + IN CONST CHAR8 *InterruptNames, + IN CONST UINT32 InterruptNamesSize, + IN CONST UINT32 *Interrupts, + IN CONST UINTN IntCells, + IN CONST CHAR8 *Name + ) +{ + INTN StrIndex; + INTN Index; + INTN StringLength; + + StrIndex = 0; + Index = 0; + + while (Index < InterruptNamesSize) { + StringLength = MIN (AsciiStrSize (Name), InterruptNamesSize - Index); + + if (!AsciiStrnCmp (&InterruptNames[Index], Name, StringLength)) { + break; + } + + StrIndex++; + Index += AsciiStrSize (&InterruptNames[Index]); + } + + if (Index >= InterruptNamesSize) { + return 0; + } + + return FdtGetInterruptId (&Interrupts[StrIndex * IntCells]); +} + +/** List of "compatible" property values for SmmuV3 nodes. + + Other "compatible" values are not supported by this module. +*/ +STATIC CONST COMPATIBILITY_STR SmmuV3CompatibleStr[] = { + { "arm,smmu-v3" } +}; + +/** SmmuV3 compatiblity information. +*/ +STATIC CONST COMPATIBILITY_INFO SmmuV3CompatibleInfo = { + ARRAY_SIZE (SmmuV3CompatibleStr), + SmmuV3CompatibleStr +}; + +/** List of "compatible" property values for PciRootComplex nodes. +*/ +STATIC CONST COMPATIBILITY_STR RootComplexCompatibleStr[] = { + { "pci-host-ecam-generic" } +}; + +/** PciRootComplex compatiblity information. +*/ +STATIC CONST COMPATIBILITY_INFO RootComplexCompatibleInfo = { + ARRAY_SIZE (RootComplexCompatibleStr), + RootComplexCompatibleStr +}; + +/** Find the appropriate msi-map + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] SmmuV3Node Offset of an SmmuV3 node. + @param [out] DataOut Location to store pointer to msi-map property. + @param [out] MapSizeOut Location to store number of entries in msi-map property. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND msi-map not found for this SmmuV3 node. +**/ +STATIC +EFI_STATUS +FindIommuMsiMapForSmmuV3 ( + IN CONST VOID *Fdt, + IN INT32 SmmuV3Node, + OUT CONST UINT32 **IommuMapDataOut, + OUT UINT32 *IommuMapSizeOut, + OUT CONST UINT32 **MsiMapDataOut, + OUT UINT32 *MsiMapSizeOut + ) +{ + EFI_STATUS Status; + UINT32 Index; + UINT32 MapIndex; + UINT32 IommuMapSize; + INT32 RootComplexNode; + UINT32 RootComplexNodeCount; + INT32 IommuMapDataSize; + INT32 MsiMapDataSize; + INT32 Node; + CONST UINT32 *IommuMapData; + CONST UINT32 *MsiMapData; + + Status = FdtCountCompatNodeInBranch ( + Fdt, + -1, // FdtBranch, + &RootComplexCompatibleInfo, + &RootComplexNodeCount + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return EFI_INVALID_PARAMETER; + } + + RootComplexNode = -1; + for (Index = 0; Index < RootComplexNodeCount; Index++) { + Status = FdtGetNextCompatNodeInBranch ( + Fdt, + -1, + &RootComplexCompatibleInfo, + &RootComplexNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + if (Status == EFI_NOT_FOUND) { + // Should have found the node. + Status = EFI_ABORTED; + } + + return Status; + } + + IommuMapData = FdtGetProp (Fdt, RootComplexNode, "iommu-map", &IommuMapDataSize); + if ((IommuMapData == NULL) || ((IommuMapDataSize % (IOMMU_MAP_CELL_COUNT * sizeof (UINT32))) != 0)) { + // If error or invalid number of cells (not multiple of IOMMU_MAP_CELL_COUNT). + ASSERT ((IommuMapData != NULL) && ((IommuMapDataSize % (IOMMU_MAP_CELL_COUNT * sizeof (UINT32))) == 0)); + return EFI_ABORTED; + } + + IommuMapSize = IommuMapDataSize / (IOMMU_MAP_CELL_COUNT * sizeof (UINT32)); + + for (MapIndex = 0; MapIndex < IommuMapSize; MapIndex++) { + Node = FdtNodeOffsetByPhandle (Fdt, Fdt32ToCpu (((UINT32 *)IommuMapData)[MapIndex * IOMMU_MAP_CELL_COUNT + 1])); + if (Node == SmmuV3Node) { + break; // Found node for this SMMU + } + } + + if (MapIndex == IommuMapSize) { + // Not this root complex + continue; + } + + MsiMapData = FdtGetProp (Fdt, RootComplexNode, "msi-map", &MsiMapDataSize); + if ((MsiMapData == NULL) || ((MsiMapDataSize % (MSI_MAP_CELL_COUNT * sizeof (UINT32))) != 0)) { + // If error or invalid number of cells (not multiple of MSI_MAP_CELL_COUNT). + ASSERT ((MsiMapData != NULL) && ((MsiMapDataSize % (MSI_MAP_CELL_COUNT * sizeof (UINT32))) == 0)); + return EFI_ABORTED; + } + + *IommuMapDataOut = IommuMapData; + *IommuMapSizeOut = IommuMapDataSize; + *MsiMapDataOut = MsiMapData; + *MsiMapSizeOut = MsiMapDataSize; + return EFI_SUCCESS; + } // for + + ASSERT (0); + return EFI_NOT_FOUND; +} + +/** Generate ID mappings for SMMUv3 from iommu-map and msi-map arrays + + @param [in] Fdt Pointer to a Flattened Device Tree (Fdt). + @param [in] SmmuV3Node Offset of an SmmuV3 node. + @param [in] IommuMapData Pointer to iommu-map array. + @param [in] IommuMapSize Size of the iommu-map array, in entries. + @param [in] MsiMapData Pointer to msi-map array. + @param [in] MsiMapSize Size of the msi-map array, in entries. + @param [out] IdMappings Location to store ID mappings. + + @retval The number of ID mappings generated +**/ +STATIC +UINT32 +GenerateSmmuV3IdMappings ( + IN CONST VOID *Fdt, + IN CONST UINT32 SmmuV3Node, + IN CONST UINT32 *IommuMapData, + IN CONST UINT32 IommuMapSize, + IN CONST UINT32 *MsiMapData, + IN CONST UINT32 MsiMapSize, + OUT CM_ARM_ID_MAPPING *IdMappings + ) +{ + UINT32 *IommuMapEntry; + UINT32 IommuMapIndex; + UINT32 IommuInputId; + UINT32 IommuOutputId; + UINT32 IommuNumIds; + UINT32 IommuNode; + UINT32 *MsiMapEntry; + UINT32 MsiMapIndex; + UINT32 MsiInputId; + UINT32 MsiOutputId; + UINT32 MsiNumIds; + UINT32 MapIndex; + + MapIndex = 0; + + // Parse msi-map (pci ID -> device ID) and iommu-map (pci ID -> stream ID) + // to construct stream ID -> device ID mapping array + for (MsiMapIndex = 0; MsiMapIndex < MsiMapSize; MsiMapIndex++) { + MsiMapEntry = &((UINT32 *)MsiMapData)[MsiMapIndex * MSI_MAP_CELL_COUNT]; + + MsiInputId = Fdt32ToCpu (MsiMapEntry[0]); + MsiOutputId = Fdt32ToCpu (MsiMapEntry[2]); + MsiNumIds = Fdt32ToCpu (MsiMapEntry[3]); + + for (IommuMapIndex = 0; IommuMapIndex < IommuMapSize && MsiNumIds > 0; IommuMapIndex++) { + IommuMapEntry = &((UINT32 *)IommuMapData)[IommuMapIndex * IOMMU_MAP_CELL_COUNT]; + + IommuNode = FdtNodeOffsetByPhandle (Fdt, Fdt32ToCpu (IommuMapEntry[1])); + + IommuInputId = Fdt32ToCpu (IommuMapEntry[0]); + IommuOutputId = Fdt32ToCpu (IommuMapEntry[2]); + IommuNumIds = Fdt32ToCpu (IommuMapEntry[3]); + + if ((IommuNode == SmmuV3Node) && (MsiInputId < (IommuInputId + IommuNumIds)) && ((MsiInputId + MsiNumIds) > IommuInputId)) { + if (MsiInputId < IommuInputId) { + IdMappings[MapIndex].InputBase = IommuOutputId; + IdMappings[MapIndex].NumIds = MIN ((MsiInputId + MsiNumIds) - IommuInputId, IommuNumIds); + IdMappings[MapIndex].OutputBase = MsiOutputId + (IommuInputId - MsiInputId); + } else { + IdMappings[MapIndex].InputBase = IommuOutputId + (MsiInputId - IommuInputId); + IdMappings[MapIndex].NumIds = MIN ((IommuInputId + IommuNumIds) - MsiInputId, MsiNumIds); + IdMappings[MapIndex].OutputBase = MsiOutputId; + } + + IdMappings[MapIndex].OutputReferenceToken = CM_ABSTRACT_TOKEN_MAKE (ETokenNameSpaceFdtHwInfo, EFdtHwInfoIortObject, Fdt32ToCpu (MsiMapEntry[1])); + + MapIndex++; + } + } + } + + return MapIndex; +} + +/** Parse an SmmuV3 node. + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] Fdt Pointer to a Flattened Device Tree (Fdt). + @param [in] SmmuV3Node Offset of an SmmuV3 node. + @param [in] SmmuV3Info The CM_ARM_SMMUV3_INFO to populate. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. +**/ +STATIC +EFI_STATUS +EFIAPI +SmmuV3NodeParser ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN CONST VOID *Fdt, + IN INT32 SmmuV3Node, + IN CM_ARM_SMMUV3_NODE *SmmuV3Info + ) +{ + EFI_STATUS Status; + CONST UINT32 *Data; + INT32 IntcNode; + INT32 DataSize; + INT32 IntCells; + INT32 AddressCells; + CONST UINT8 *InterruptNames; + INT32 InterruptNamesSize; + CM_ARM_ID_MAPPING *IdMappings; + CONST UINT32 *IommuMapData; + UINT32 IommuMapSize; + CONST UINT32 *MsiMapData; + UINT32 MsiMapSize; + + if ((Fdt == NULL) || (SmmuV3Info == NULL)) { + ASSERT ((Fdt != NULL) && (SmmuV3Info != NULL)); + return EFI_INVALID_PARAMETER; + } + + AddressCells = FdtAddressCells (Fdt, SmmuV3Node); + if (AddressCells < 0) { + ASSERT (AddressCells >= 0); + return EFI_ABORTED; + } + + // Get the associated interrupt-controller. + Status = FdtGetIntcParentNode (Fdt, SmmuV3Node, &IntcNode); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + // Get the number of cells used to encode an interrupt. + Status = FdtGetInterruptCellsInfo (Fdt, IntcNode, &IntCells); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + if (Status == EFI_NOT_FOUND) { + // Should have found the node. + Status = EFI_ABORTED; + } + + return Status; + } + + InterruptNames = FdtGetProp (Fdt, SmmuV3Node, "interrupt-names", &InterruptNamesSize); + + Data = FdtGetProp (Fdt, SmmuV3Node, "interrupts", &DataSize); + if (Data == NULL) { + // If error. + ASSERT (Data != NULL); + return EFI_ABORTED; + } + + /// GSIV of the Event interrupt if SPI based + SmmuV3Info->EventInterrupt = FdtGetInterruptFromName ((CONST CHAR8 *)InterruptNames, InterruptNamesSize, Data, IntCells, "eventq"); + /// PRI Interrupt if SPI based + SmmuV3Info->PriInterrupt = FdtGetInterruptFromName ((CONST CHAR8 *)InterruptNames, InterruptNamesSize, Data, IntCells, "priq"); + /// GERR interrupt if GSIV based + SmmuV3Info->GerrInterrupt = FdtGetInterruptFromName ((CONST CHAR8 *)InterruptNames, InterruptNamesSize, Data, IntCells, "gerror"); + /// Sync interrupt if GSIV based + SmmuV3Info->SyncInterrupt = FdtGetInterruptFromName ((CONST CHAR8 *)InterruptNames, InterruptNamesSize, Data, IntCells, "cmdq-sync"); + + /// SMMU flags + SmmuV3Info->Flags = 0; + /// VATOS address + SmmuV3Info->VatosAddress = 0; + + /// Model + SmmuV3Info->Model = EFI_ACPI_IORT_SMMUv3_MODEL_GENERIC; + + Data = FdtGetProp (Fdt, SmmuV3Node, "hisilicon,broken-prefetch-cmd", &DataSize); + if ((Data != NULL) && (DataSize >= 0)) { + SmmuV3Info->Model = EFI_ACPI_IORT_SMMUv3_MODEL_HISILICON_HI161X; + } + + Data = FdtGetProp (Fdt, SmmuV3Node, "cavium,cn9900-broken-page1-regspace", &DataSize); + if ((Data != NULL) && (DataSize >= 0)) { + SmmuV3Info->Model = EFI_ACPI_IORT_SMMUv3_MODEL_CAVIUM_CN99XX; + } + + Data = FdtGetProp (Fdt, SmmuV3Node, "reg", &DataSize); + if (Data == NULL) { + ASSERT (Data != NULL); + return EFI_ABORTED; + } + + if (AddressCells == 2) { + SmmuV3Info->BaseAddress = Fdt64ToCpu (*((UINT64 *)Data)); + } else { + SmmuV3Info->BaseAddress = Fdt32ToCpu (*((UINT32 *)Data)); + } + + Status = FindIommuMsiMapForSmmuV3 (Fdt, SmmuV3Node, &IommuMapData, &IommuMapSize, &MsiMapData, &MsiMapSize); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + IommuMapSize /= IOMMU_MAP_CELL_COUNT * sizeof (UINT32); + MsiMapSize /= MSI_MAP_CELL_COUNT * sizeof (UINT32); + + // Allocate for worst-case scenario + IdMappings = AllocateZeroPool ((IommuMapSize * MsiMapSize + 1) * sizeof (CM_ARM_ID_MAPPING)); + if (IdMappings == NULL) { + ASSERT (IdMappings != NULL); + return EFI_OUT_OF_RESOURCES; + } + + SmmuV3Info->IdMappingCount = GenerateSmmuV3IdMappings ( + Fdt, + SmmuV3Node, + IommuMapData, + IommuMapSize, + MsiMapData, + MsiMapSize, + IdMappings + ); + + if ((SmmuV3Info->EventInterrupt == 0) || (SmmuV3Info->PriInterrupt == 0) || + (SmmuV3Info->GerrInterrupt == 0) || (SmmuV3Info->SyncInterrupt == 0)) + { + Data = FdtGetProp (Fdt, SmmuV3Node, "msi-parent", &DataSize); + if ((Data == NULL) || (DataSize != 2 * sizeof (UINT32))) { + ASSERT ((Data != NULL) && (DataSize == 2 * sizeof (UINT32))); + FreePool (IdMappings); + return EFI_ABORTED; + } + + IdMappings[SmmuV3Info->IdMappingCount].InputBase = 0; + IdMappings[SmmuV3Info->IdMappingCount].OutputBase = Fdt32ToCpu (((UINT32 *)Data)[1]); + IdMappings[SmmuV3Info->IdMappingCount].OutputReferenceToken = CM_ABSTRACT_TOKEN_MAKE ( + ETokenNameSpaceFdtHwInfo, + EFdtHwInfoIortObject, + Fdt32ToCpu (((UINT32 *)Data)[0]) + ); + IdMappings[SmmuV3Info->IdMappingCount].NumIds = 1; + IdMappings[SmmuV3Info->IdMappingCount].Flags = EFI_ACPI_IORT_ID_MAPPING_FLAGS_SINGLE; + + SmmuV3Info->DeviceIdMappingIndex = SmmuV3Info->IdMappingCount; + SmmuV3Info->IdMappingCount++; + } + + // Add the CmObj to the Configuration Manager. + Status = AddSingleCmObjArray ( + FdtParserHandle, + CREATE_CM_ARM_OBJECT_ID (EArmObjIdMappingArray), + &IdMappings[0], + sizeof (CM_ARM_ID_MAPPING) * SmmuV3Info->IdMappingCount, + SmmuV3Info->IdMappingCount, + &SmmuV3Info->IdMappingToken + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + FreePool (IdMappings); + return Status; + } + + /// Proximity domain flag + SmmuV3Info->ProximityDomain = 0; + + /// Unique identifier for this node. + SmmuV3Info->Identifier = GetNextIortIdentifier (); + + FreePool (IdMappings); + + return EFI_SUCCESS; +} + +/** CM_ARM_SMMUV3_NODE parser function. + + The following structure is populated: + typedef struct CmArmSmmuV3Node { + CM_OBJECT_TOKEN Token; + UINT32 IdMappingCount; // {Populated} + CM_OBJECT_TOKEN IdMappingToken; // {Populated} + UINT64 BaseAddress; // {Populated} + UINT32 Flags; // {default = 0} + UINT64 VatosAddress; // {default = 0} + UINT32 Model; // {Populated} + UINT32 EventInterrupt; // {Populated} + UINT32 PriInterrupt; // {Populated} + UINT32 GerrInterrupt; // {Populated} + UINT32 SyncInterrupt; // {Populated} + UINT32 ProximityDomain; // {default = 0} + UINT32 DeviceIdMappingIndex; // {Populated} + UINT32 Identifier; // {Populated} + CM_OBJECT_TOKEN ProximityDomainToken; // {default = 0} + } CM_ARM_SMMUV3_NODE; + + A parser parses a Device Tree to populate a specific CmObj type. None, + one or many CmObj can be created by the parser. + The created CmObj are then handed to the parser's caller through the + HW_INFO_ADD_OBJECT interface. + This can also be a dispatcher. I.e. a function that not parsing a + Device Tree but calling other parsers. + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] FdtBranch When searching for DT node name, restrict + the search to this Device Tree branch. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. + @retval EFI_UNSUPPORTED Unsupported. +**/ +EFI_STATUS +EFIAPI +ArmSmmuV3Parser ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN INT32 FdtBranch + ) +{ + EFI_STATUS Status; + UINT32 Index; + INT32 SmmuV3Node; + UINT32 SmmuV3NodeCount; + CM_ARM_SMMUV3_NODE SmmuV3Info; + VOID *Fdt; + + if (FdtParserHandle == NULL) { + ASSERT (FdtParserHandle != NULL); + return EFI_INVALID_PARAMETER; + } + + Fdt = FdtParserHandle->Fdt; + Status = FdtCountCompatNodeInBranch ( + Fdt, + FdtBranch, + &SmmuV3CompatibleInfo, + &SmmuV3NodeCount + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + if (SmmuV3NodeCount == 0) { + return EFI_NOT_FOUND; + } + + // Parse each SmmuV3 node in the branch. + SmmuV3Node = FdtBranch; + for (Index = 0; Index < SmmuV3NodeCount; Index++) { + ZeroMem (&SmmuV3Info, sizeof (CM_ARM_SMMUV3_NODE)); + + Status = FdtGetNextCompatNodeInBranch ( + Fdt, + FdtBranch, + &SmmuV3CompatibleInfo, + &SmmuV3Node + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + if (Status == EFI_NOT_FOUND) { + // Should have found the node. + Status = EFI_ABORTED; + } + + return Status; + } + + Status = SmmuV3NodeParser (FdtParserHandle, Fdt, SmmuV3Node, &SmmuV3Info); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + // Add the CmObj to the Configuration Manager. + Status = AddSingleCmObjWithToken ( + FdtParserHandle, + CREATE_CM_ARM_OBJECT_ID (EArmObjSmmuV3), + &SmmuV3Info, + sizeof (CM_ARM_SMMUV3_NODE), + CM_ABSTRACT_TOKEN_MAKE (ETokenNameSpaceFdtHwInfo, EFdtHwInfoIortObject, FdtGetPhandle (Fdt, SmmuV3Node)) + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + } // for + + return Status; +} diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/SmmuV3Parser.h b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/SmmuV3Parser.h new file mode 100644 index 000000000000..ffe493227728 --- /dev/null +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/SmmuV3Parser.h @@ -0,0 +1,59 @@ +/** @file + Arm SMMUv3 parser. + + Copyright (c) 2025, Arm Limited. All rights reserved.
    + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - linux/Documentation/devicetree/bindings/iommu/arm,smmu-v3.yaml +**/ + +#ifndef SMMUV3_PARSER_H_ +#define SMMUV3_PARSER_H_ + +/** CM_ARM_SMMUV3_NODE parser function. + + The following structure is populated: + typedef struct CmArmSmmuV3Node { + CM_OBJECT_TOKEN Token; + UINT32 IdMappingCount; // {Populated} + CM_OBJECT_TOKEN IdMappingToken; // {Populated} + UINT64 BaseAddress; // {Populated} + UINT32 Flags; // {default = 0} + UINT64 VatosAddress; // {default = 0} + UINT32 Model; // {Populated} + UINT32 EventInterrupt; // {Populated} + UINT32 PriInterrupt; // {Populated} + UINT32 GerrInterrupt; // {Populated} + UINT32 SyncInterrupt; // {Populated} + UINT32 ProximityDomain; // {default = 0} + UINT32 DeviceIdMappingIndex; // {Populated} + UINT32 Identifier; // {Populated} + CM_OBJECT_TOKEN ProximityDomainToken; // {default = 0} + } CM_ARM_SMMUV3_NODE; + + A parser parses a Device Tree to populate a specific CmObj type. None, + one or many CmObj can be created by the parser. + The created CmObj are then handed to the parser's caller through the + HW_INFO_ADD_OBJECT interface. + This can also be a dispatcher. I.e. a function that not parsing a + Device Tree but calling other parsers. + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] FdtBranch When searching for DT node name, restrict + the search to this Device Tree branch. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. + @retval EFI_UNSUPPORTED Unsupported. +**/ +EFI_STATUS +EFIAPI +ArmSmmuV3Parser ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN INT32 FdtBranch + ); + +#endif // SMMUV3_PARSER_H_ diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf b/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf index a87fbc8f1416..64afab1ed14a 100644 --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf @@ -46,6 +46,9 @@ Arm/Gic/ArmGicMsiFrameParser.h Arm/Gic/ArmGicRParser.c Arm/Gic/ArmGicRParser.h + Arm/Iort/ArmIortParser.c + Arm/Iort/RootComplexParser.c + Arm/Iort/SmmuV3Parser.c [Packages.AARCH64] ArmPkg/ArmPkg.dec From f09ea5f672b36e6291782801b0cb6b1f1eac555b Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Wed, 1 Oct 2025 09:39:22 +0100 Subject: [PATCH 0656/1172] ArmVirtPkg/KvmtoolCfgMgrDxe: Update DynamicPlatRepoLib usage Update for the new token parameter in DynPlatRepoAddObject() and HW_INFO_ADD_OBJECT. Signed-off-by: Sarah Walker --- ArmVirtPkg/KvmtoolCfgMgrDxe/ConfigurationManager.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ArmVirtPkg/KvmtoolCfgMgrDxe/ConfigurationManager.c b/ArmVirtPkg/KvmtoolCfgMgrDxe/ConfigurationManager.c index 1ad84d634d9d..a6c96546d447 100644 --- a/ArmVirtPkg/KvmtoolCfgMgrDxe/ConfigurationManager.c +++ b/ArmVirtPkg/KvmtoolCfgMgrDxe/ConfigurationManager.c @@ -443,6 +443,8 @@ GetDeviceIdMappingArray ( @param [in] Context A pointer to the caller's context provided in HwInfoParserInit (). @param [in] CmObjDesc CM_OBJ_DESCRIPTOR containing the CmObj(s) to add. + @param [in] NewToken Token for this object. If CM_NULL_TOKEN, then + a new token is generated. @param [out] Token If provided and success, contain the token generated for the CmObj. @@ -456,6 +458,7 @@ HwInfoAdd ( IN HW_INFO_PARSER_HANDLE ParserHandle, IN VOID *Context, IN CONST CM_OBJ_DESCRIPTOR *CmObjDesc, + IN CONST CM_OBJECT_TOKEN NewToken, OUT CM_OBJECT_TOKEN *Token OPTIONAL ) { @@ -484,6 +487,7 @@ HwInfoAdd ( Status = DynPlatRepoAddObject ( PlatformRepo->DynamicPlatformRepo, CmObjDesc, + NewToken, Token ); if (EFI_ERROR (Status)) { From aace3eebd25a701a23ffd31c1e201aecdb771588 Mon Sep 17 00:00:00 2001 From: Sarah Walker Date: Fri, 3 Oct 2025 12:04:49 +0100 Subject: [PATCH 0657/1172] DynamicTablesPkg: Use abstract tokens in token generator Using abstract tokens ensures no collisions with non-generated tokens. Signed-off-by: Sarah Walker --- DynamicTablesPkg/Include/StandardNameSpaceObjects.h | 1 + .../Library/Common/DynamicPlatRepoLib/TokenGenerator.c | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/DynamicTablesPkg/Include/StandardNameSpaceObjects.h b/DynamicTablesPkg/Include/StandardNameSpaceObjects.h index cf0efe245617..25748b9cb89e 100644 --- a/DynamicTablesPkg/Include/StandardNameSpaceObjects.h +++ b/DynamicTablesPkg/Include/StandardNameSpaceObjects.h @@ -55,6 +55,7 @@ typedef enum AbstractTokenID { ETokenNameSpaceUnknown = 0, ETokenNameSpaceSmbios, ETokenNameSpaceFdtHwInfo, + ETokenNameSpaceGenerated, ETokenNameSpaceMax } EABSTRACT_TOKEN_ID; diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenGenerator.c b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenGenerator.c index 7033b5f1b5dd..640c39f696fb 100644 --- a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenGenerator.c +++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenGenerator.c @@ -23,7 +23,9 @@ GenerateToken ( ) { // Start Tokens at 1 to avoid collisions with CM_NULL_TOKEN. - STATIC UINTN CurrentToken = 1; + STATIC UINTN CurrentToken = 0; - return (CM_OBJECT_TOKEN)(CurrentToken++); + CurrentToken++; + + return (CM_OBJECT_TOKEN)CM_ABSTRACT_TOKEN_MAKE (ETokenNameSpaceGenerated, 0, CurrentToken); } From 56989e2d24ec0e6ed81d999548bb41a4fde68c6a Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 13 Oct 2025 16:11:42 -0700 Subject: [PATCH 0658/1172] FatPkg/EnhancedFatDxe: Remove Iso639Language PR #11380 that removed the Unicode Collation Protocol introduced a logic bug in the use of GetBestLanguage(). Iso639Language would always be computed to TRUE when it should always be passed to GetBestLanguage() as FALSE once Unicode Collation Protocol is removed. Update InitializeUnicodeCollationSupportWorker() to remove the local variable Iso639Language and always call GetBestLanguage() with the Iso639Language parameter set to FALSE. Signed-off-by: Michael D Kinney --- FatPkg/EnhancedFatDxe/UnicodeCollation.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/FatPkg/EnhancedFatDxe/UnicodeCollation.c b/FatPkg/EnhancedFatDxe/UnicodeCollation.c index 45cd52345b6f..3113638c94b1 100644 --- a/FatPkg/EnhancedFatDxe/UnicodeCollation.c +++ b/FatPkg/EnhancedFatDxe/UnicodeCollation.c @@ -40,7 +40,6 @@ InitializeUnicodeCollationSupportWorker ( UINTN Index; EFI_HANDLE *Handles; EFI_UNICODE_COLLATION_PROTOCOL *Uci; - BOOLEAN Iso639Language; CHAR8 *Language; CHAR8 *BestLanguage; @@ -55,7 +54,6 @@ InitializeUnicodeCollationSupportWorker ( return Status; } - Iso639Language = (BOOLEAN)(ProtocolGuid == &gEfiUnicodeCollation2ProtocolGuid); GetEfiGlobalVariable2 (VariableName, (VOID **)&Language, NULL); ReturnStatus = EFI_UNSUPPORTED; @@ -81,7 +79,7 @@ InitializeUnicodeCollationSupportWorker ( // BestLanguage = GetBestLanguage ( Uci->SupportedLanguages, - Iso639Language, + FALSE, (Language == NULL) ? "" : Language, DefaultLanguage, NULL From faeee00490bc23b147f1d4b6e70b190d3eb80583 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 13 Oct 2025 16:12:22 -0700 Subject: [PATCH 0659/1172] MdeModulePkg/FvSimpleFileSystemDxe: Remove Iso639Language PR #11380 that removed the Unicode Collation Protocol introduced a logic bug in the use of GetBestLanguage(). Iso639Language would always be computed to TRUE when it should always be passed to GetBestLanguage() as FALSE once Unicode Collation Protocol is removed. Update InitializeUnicodeCollationSupportWorker() to remove the local variable Iso639Language and always call GetBestLanguage() with the Iso639Language parameter set to FALSE. Signed-off-by: Michael D Kinney --- .../FvSimpleFileSystemDxe/FvSimpleFileSystemEntryPoint.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemEntryPoint.c b/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemEntryPoint.c index 17831079dce0..d3e8b8fececa 100644 --- a/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemEntryPoint.c +++ b/MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemEntryPoint.c @@ -256,7 +256,6 @@ InitializeUnicodeCollationSupportWorker ( UINTN Index; EFI_HANDLE *Handles; EFI_UNICODE_COLLATION_PROTOCOL *Uci; - BOOLEAN Iso639Language; CHAR8 *Language; CHAR8 *BestLanguage; @@ -271,7 +270,6 @@ InitializeUnicodeCollationSupportWorker ( return Status; } - Iso639Language = (BOOLEAN)(ProtocolGuid == &gEfiUnicodeCollation2ProtocolGuid); GetEfiGlobalVariable2 (VariableName, (VOID **)&Language, NULL); ReturnStatus = EFI_UNSUPPORTED; @@ -297,7 +295,7 @@ InitializeUnicodeCollationSupportWorker ( // BestLanguage = GetBestLanguage ( Uci->SupportedLanguages, - Iso639Language, + FALSE, (Language == NULL) ? "" : Language, DefaultLanguage, NULL From ff96eb4c2cd823ba52e498bdbc84cba79edb7fa3 Mon Sep 17 00:00:00 2001 From: Vishal Oliyil Kunnil Date: Mon, 13 Oct 2025 14:54:03 -0700 Subject: [PATCH 0660/1172] MdePkg: Restore ARM processor macro in CPER header Commit 84c0261 removed support for ARM32 and inadvertently removed the EFI_GENERIC_ERROR_PROC_TYPE_ARM macro which remains valid for AARCH64. The macro refers to the ARM CPU architecture, not specifically the ARM32 instruction set. Restore the macro to maintain compatibility with downstream modules that rely on Cper.h for AARCH64 platforms. Signed-off-by: Vishal Oliyil Kunnil --- MdePkg/Include/Guid/Cper.h | 1 + 1 file changed, 1 insertion(+) diff --git a/MdePkg/Include/Guid/Cper.h b/MdePkg/Include/Guid/Cper.h index 4a31d343996a..a947301c0583 100644 --- a/MdePkg/Include/Guid/Cper.h +++ b/MdePkg/Include/Guid/Cper.h @@ -262,6 +262,7 @@ typedef struct { ///@{ #define EFI_GENERIC_ERROR_PROC_TYPE_IA32_X64 0x00 #define EFI_GENERIC_ERROR_PROC_TYPE_IA64 0x01 +#define EFI_GENERIC_ERROR_PROC_TYPE_ARM 0x02 ///@} /// From 4883960e5e50c3a01a48d5f3bb51fcb795ff11a9 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Fri, 1 Aug 2025 12:53:46 -0700 Subject: [PATCH 0661/1172] SecurityPkg: Tcg2AcpiFfa: Correct TPM Instance Validation The current implementation checks `PcdTpmInstanceGuid` and enforces the use of the DTPM instance GUID. However, for FFA-specific modules, the correct value should be `gTpm2ServiceFfaGuid`. This update fixes the validation logic to support routing through Tpm2DeviceLibRouter* with the appropriate instance library, which requires the instance ID to be set to `gTpm2ServiceFfaGuid`. Signed-off-by: Kun Qin --- SecurityPkg/Tcg/Tcg2AcpiFfa/Tcg2AcpiFfa.c | 10 ++++++++-- SecurityPkg/Tcg/Tcg2AcpiFfa/Tcg2AcpiFfa.inf | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/SecurityPkg/Tcg/Tcg2AcpiFfa/Tcg2AcpiFfa.c b/SecurityPkg/Tcg/Tcg2AcpiFfa/Tcg2AcpiFfa.c index 2bb33b4a54cd..d7dec5030bbd 100644 --- a/SecurityPkg/Tcg/Tcg2AcpiFfa/Tcg2AcpiFfa.c +++ b/SecurityPkg/Tcg/Tcg2AcpiFfa/Tcg2AcpiFfa.c @@ -447,11 +447,17 @@ InitializeTcgAcpiFfa ( ) { EFI_STATUS Status; + VOID *TpmGuid; DEBUG ((DEBUG_INFO, "TCG ACPI FFA Entry Point!\n")); + TpmGuid = PcdGetPtr (PcdTpmInstanceGuid); + if (TpmGuid == NULL) { + DEBUG ((DEBUG_ERROR, "%a - Driver failed due to no TPM2 instance configured!\n", __func__)); + return EFI_UNSUPPORTED; + } - if (!CompareGuid (PcdGetPtr (PcdTpmInstanceGuid), &gEfiTpmDeviceInstanceTpm20DtpmGuid)) { - DEBUG ((DEBUG_ERROR, "No TPM2 DTPM instance required!\n")); + if (!CompareGuid (PcdGetPtr (PcdTpmInstanceGuid), &gTpm2ServiceFfaGuid)) { + DEBUG ((DEBUG_ERROR, "%a - Driver failed due to no the system does not have a TPM2 FFA instance configured, not supported!!\n", __func__)); return EFI_UNSUPPORTED; } diff --git a/SecurityPkg/Tcg/Tcg2AcpiFfa/Tcg2AcpiFfa.inf b/SecurityPkg/Tcg/Tcg2AcpiFfa/Tcg2AcpiFfa.inf index 2e88a6dc85b8..de94a1809936 100644 --- a/SecurityPkg/Tcg/Tcg2AcpiFfa/Tcg2AcpiFfa.inf +++ b/SecurityPkg/Tcg/Tcg2AcpiFfa/Tcg2AcpiFfa.inf @@ -48,7 +48,7 @@ PcdLib [Guids] - gEfiTpmDeviceInstanceTpm20DtpmGuid ## PRODUCES ## GUID # TPM device identifier + gTpm2ServiceFfaGuid ## PRODUCES ## GUID # TPM device identifier [Protocols] gEfiAcpiTableProtocolGuid ## CONSUMES From 9c06ac56fb7e910943c8cb384aaad72aacbd3efe Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Fri, 1 Aug 2025 13:00:26 -0700 Subject: [PATCH 0662/1172] SecurityPkg: Tcg2StandaloneMmArm: Enable TPM FFA Instance to Register PPI Previously, the implementation restricted usage to TPM instances with the DTPM ID, which worked only if the system supported TPM over FFA but still set the instance ID to DTPM. However, Tpm2InstanceLibFfa requires the `PcdTpmInstanceGuid` to be set to `gTpm2ServiceFfaGuid`. This update expands support by allowing the `PcdTpmInstanceGuid` to include the TPM-over-FFA instance GUID, enabling proper registration of the PPI. Signed-off-by: Kun Qin --- .../Tcg2StandaloneMmArm/Tcg2StandaloneMmArm.c | 24 ++++++++++++------- .../Tcg2StandaloneMmArm.inf | 3 ++- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/SecurityPkg/Tcg/Tcg2StandaloneMmArm/Tcg2StandaloneMmArm.c b/SecurityPkg/Tcg/Tcg2StandaloneMmArm/Tcg2StandaloneMmArm.c index a7ee71b310ca..aed3f6a7eb4e 100644 --- a/SecurityPkg/Tcg/Tcg2StandaloneMmArm/Tcg2StandaloneMmArm.c +++ b/SecurityPkg/Tcg/Tcg2StandaloneMmArm/Tcg2StandaloneMmArm.c @@ -25,13 +25,19 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include /** - This function checks if the required DTPM instance is TPM 2.0. + This function checks if the required instance is a supported TPM 2.0 instance. + It currently supports two instances: dTPM and FFA. - @retval TRUE The required DTPM instance is equal to gEfiTpmDeviceInstanceTpm20DtpmGuid. - @retval FALSE The required DTPM instance is not equal to gEfiTpmDeviceInstanceTpm20DtpmGuid. + Support for gEfiTpmDeviceInstanceTpm20DtpmGuid ensures backward compatibility with platforms + that utilize non-FF-A TPM services, such as those relying on SMC-based startup methods. + + Support for gTpm2ServiceFfaGuid enables PPI integration for TPM service instances based on FF-A. + + @retval TRUE The required DTPM instance is equal to gEfiTpmDeviceInstanceTpm20DtpmGuid or gTpm2ServiceFfaGuid. + @retval FALSE The required DTPM instance is not equal to either gEfiTpmDeviceInstanceTpm20DtpmGuid or gTpm2ServiceFfaGuid. **/ BOOLEAN -IsTpm20Dtpm ( +IsTpm20InstanceSupported ( VOID ) { @@ -39,11 +45,13 @@ IsTpm20Dtpm ( TpmGuid = PcdGetPtr (PcdTpmInstanceGuid); if (TpmGuid != NULL) { - if (CompareGuid ((EFI_GUID *)TpmGuid, &gEfiTpmDeviceInstanceTpm20DtpmGuid)) { + if (CompareGuid ((EFI_GUID *)TpmGuid, &gEfiTpmDeviceInstanceTpm20DtpmGuid) || + CompareGuid ((EFI_GUID *)TpmGuid, &gTpm2ServiceFfaGuid)) + { return TRUE; } - DEBUG ((DEBUG_ERROR, "No TPM2 DTPM instance required! - %g\n", (EFI_GUID *)TpmGuid)); + DEBUG ((DEBUG_ERROR, "Unsupported TPM2 instance configured - %g!\n", (EFI_GUID *)TpmGuid)); } else { DEBUG ((DEBUG_ERROR, "NULL PcdTpmInstanceGuid set!\n")); } @@ -150,8 +158,8 @@ InitializeTcgStandaloneMm ( EFI_STATUS Status; EFI_HANDLE PpSwHandle; - if (!IsTpm20Dtpm ()) { - DEBUG ((DEBUG_ERROR, "No TPM2 DTPM instance required!\n")); + if (!IsTpm20InstanceSupported ()) { + DEBUG ((DEBUG_ERROR, "The system does not have a TPM2 DTPM/FFA instance configured, PPI not supported!\n")); Status = EFI_UNSUPPORTED; goto Cleanup; } diff --git a/SecurityPkg/Tcg/Tcg2StandaloneMmArm/Tcg2StandaloneMmArm.inf b/SecurityPkg/Tcg/Tcg2StandaloneMmArm/Tcg2StandaloneMmArm.inf index c2c810494da4..fe37e9fa9ef5 100644 --- a/SecurityPkg/Tcg/Tcg2StandaloneMmArm/Tcg2StandaloneMmArm.inf +++ b/SecurityPkg/Tcg/Tcg2StandaloneMmArm/Tcg2StandaloneMmArm.inf @@ -54,7 +54,8 @@ MemLib [Guids] - gEfiTpmDeviceInstanceTpm20DtpmGuid ## PRODUCES ## GUID # TPM device identifier + gEfiTpmDeviceInstanceTpm20DtpmGuid ## CONSUMES ## GUID # TPM device identifier for dTPM + gTpm2ServiceFfaGuid ## CONSUMES ## GUID # TPM device identifier for FF-A service gEdkiiTpmInstanceHobGuid gEfiPhysicalPresenceAcpiGuid From 597d061e0979f30d5f65dff72d489c18ddec35c2 Mon Sep 17 00:00:00 2001 From: Pavithra Gurulingappa Date: Tue, 16 Sep 2025 14:44:52 +0530 Subject: [PATCH 0663/1172] MdeModulePkg/DxeCapsuleLibFmp:Added PCD for EmbeddedDriver Support Currently, there is no mechanism for platforms to enable or disable support for EmbeddedDrivers in capsule updates. This patch introduces a new PCD, PcdEmbeddedDriverSupport, allowing platforms to explicitly control whether capsules containing EmbeddedDrivers are supported. This ensures capsules with embedded drivers are rejected on platforms that do not support them. This is a breaking change.By default, PcdEmbeddedDriverSupport is set to FALSE which disables embedded driver support in capsule updates across all platforms unless explicitly enabled. Platforms must opt-in by setting the PcdEmbeddedDriverSupport to TRUE in order to enable support for capsules containing embedded drivers. Signed-off-by: Pavithra Gurulingappa --- MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c | 6 ++++++ MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf | 2 ++ .../Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf | 4 ++++ MdeModulePkg/MdeModulePkg.dec | 9 +++++++++ 4 files changed, 21 insertions(+) diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c index 92813226ad3d..e90747d80f94 100644 --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c +++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c @@ -12,6 +12,7 @@ Copyright (c) 2016 - 2024, Intel Corporation. All rights reserved.
    Copyright (c) 2024, Ampere Computing LLC. All rights reserved.
    + Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. All rights reserved.
    SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -246,6 +247,11 @@ ValidateFmpCapsule ( return EFI_INVALID_PARAMETER; } + if (!PcdGetBool (PcdCapsuleEmbeddedDriverSupport) && (FmpCapsuleHeader->EmbeddedDriverCount != 0)) { + DEBUG ((DEBUG_ERROR, "FMP Capsule with one or more embedded drivers is not supported by this platform\n")); + return EFI_UNSUPPORTED; + } + ItemOffsetList = (UINT64 *)(FmpCapsuleHeader + 1); // No overflow diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf index 095e062a6ee4..9f49a3eb9384 100644 --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf +++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf @@ -4,6 +4,7 @@ # Capsule library instance for DXE_DRIVER module types. # # Copyright (c) 2016 - 2021, Intel Corporation. All rights reserved.
    +# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. All rights reserved.
    # SPDX-License-Identifier: BSD-2-Clause-Patent # ## @@ -68,6 +69,7 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleOnDiskSupport ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdCodRelocationDevPath ## SOMETIMES_CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdCoDRelocationFileName ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleEmbeddedDriverSupport ## CONSUMES [FeaturePcd] gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset ## CONSUMES diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf index ef1fa57c5182..5314bbb07476 100644 --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf +++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf @@ -4,6 +4,7 @@ # Capsule library instance for DXE_RUNTIME_DRIVER module types. # # Copyright (c) 2016 - 2024, Intel Corporation. All rights reserved.
    +# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. All rights reserved.
    # SPDX-License-Identifier: BSD-2-Clause-Patent # ## @@ -70,5 +71,8 @@ gEfiEventVirtualAddressChangeGuid ## CONSUMES ## Event gEdkiiCapsuleOnDiskNameGuid ## SOMETIMES_CONSUMES ## GUID +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleEmbeddedDriverSupport ## CONSUMES + [Depex] gEfiVariableWriteArchProtocolGuid diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 4e842dde8aa3..0775aa954ad6 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -10,6 +10,7 @@ # Copyright (c) 2017, AMD Incorporated. All rights reserved.
    # Copyright (c) Microsoft Corporation.
    # Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.
    +# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. All rights reserved.
    # SPDX-License-Identifier: BSD-2-Clause-Patent # ## @@ -1696,6 +1697,14 @@ # @Prompt Enable Capsule On Disk support. gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleOnDiskSupport|FALSE|BOOLEAN|0x0000002d + ## Indicates whether the platform supports processing Capsules that include EmbeddedDrivers. + # Default value is FALSE, meaning embedded drivers are not supported. + # Platforms that require embedded driver support must explicitly opt-in by setting this PCD to TRUE. + # TRUE - Capsule with EmbeddedDriver is supported.
    + # FALSE - Capsule with EmbeddedDriver is not supported.
    + # @Prompt Enable Capsule with EmbeddedDriver support. + gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleEmbeddedDriverSupport|FALSE|BOOLEAN|0x00010021 + ## Maximum permitted encapsulation levels of sections in a firmware volume, # in the DXE phase. Minimum value is 1. Sections nested more deeply are # rejected. From 2522020ee12b42fabd8b1353b4f89854455d6325 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 15 Oct 2025 08:01:41 -0700 Subject: [PATCH 0664/1172] UnitTestFrameworkPkg: Use 8MB stack for MSFT and CLANGPDB Linux/GCC host-based unit test application builds use a default stack size of 8MB. Windows/VS20xx and Windows/CLANGPDB host-based unit test application builds use a default stack size of 1MB. This can allow Linux unit tests to pass and Windows unit tests to fail with stack overflow if large local variables are used. ASAN increases stack usage, so this condition can occur more frequently when ASAN enabled. Update MSFT and CLANGPDB for host-based unit tests to use a default stack size of 8MB so all tool chains use the same default stack size for host-based unit tests. Signed-off-by: Michael D Kinney --- UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc index f48998757ccd..d047b46af529 100644 --- a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc +++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc @@ -87,7 +87,7 @@ # # Set MSFT HOST_APPLICATION options # - MSFT:*_*_*_DLINK_FLAGS == /nologo /SUBSYSTEM:CONSOLE /DEBUG /out:"$(BIN_DIR)\$(MODULE_NAME_GUID).exe" /pdb:"$(BIN_DIR)\$(MODULE_NAME_GUID).pdb" /WHOLEARCHIVE + MSFT:*_*_*_DLINK_FLAGS == /nologo /SUBSYSTEM:CONSOLE /DEBUG /out:"$(BIN_DIR)\$(MODULE_NAME_GUID).exe" /pdb:"$(BIN_DIR)\$(MODULE_NAME_GUID).pdb" /WHOLEARCHIVE /STACK:0x00800000,0x00800000 MSFT:*_VS2015_IA32_DLINK_FLAGS = /LIBPATH:"%VS2015_PREFIX%Lib" /LIBPATH:"%VS2015_PREFIX%VC\Lib" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x86" MSFT:*_VS2015x86_IA32_DLINK_FLAGS = /LIBPATH:"%VS2015_PREFIX%Lib" /LIBPATH:"%VS2015_PREFIX%VC\Lib" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x86" @@ -132,7 +132,7 @@ # # Set CLANGPDB HOST_APPLICATION options # - CLANGPDB:*_*_*_DLINK_FLAGS == /nologo /SUBSYSTEM:CONSOLE /DEBUG /out:"$(BIN_DIR)\$(MODULE_NAME_GUID).exe" /pdb:"$(BIN_DIR)\$(MODULE_NAME_GUID).pdb" /WHOLEARCHIVE + CLANGPDB:*_*_*_DLINK_FLAGS == /nologo /SUBSYSTEM:CONSOLE /DEBUG /out:"$(BIN_DIR)\$(MODULE_NAME_GUID).exe" /pdb:"$(BIN_DIR)\$(MODULE_NAME_GUID).pdb" /WHOLEARCHIVE /STACK:0x00800000,0x00800000 CLANGPDB:*_*_X64_DLINK_FLAGS = /LIBPATH:"%VCToolsInstallDir%lib\x64" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x64" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x64" !if $(UNIT_TESTING_ADDRESS_SANITIZER_ENABLE) CLANGPDB:*_*_X64_DLINK_FLAGS = clang_rt.profile-x86_64.lib clang_rt.asan_dynamic-x86_64.lib clang_rt.asan_dynamic_runtime_thunk-x86_64.lib From e27cfda33b429762975215cccba5837ee850d18e Mon Sep 17 00:00:00 2001 From: Oliver Steffen Date: Wed, 15 Oct 2025 13:17:36 -0400 Subject: [PATCH 0665/1172] OvmfPkg/IoMmuDxe: Fix 1M and 2M buffer handling The IoMmu keeps a pool of pre-allocated shared buffers in various sizes to serve requests. Usage is tracked in a bitmap. The bitmap masks for the 1M and 2M buffer pools are incorrect, causing the same buffers getting handed out repeatedly, causing corrupted device accesses. The masks needs to be kept in sync with mReservedMemRanges below. This sets the correct values for: - RESERVED_MEM_BITMAP_1M_MASK = (1 << 14) = 0x4000 - RESERVED_MEM_BITMAP_2M_MASK = (1 << 15) | (1 << 16) = 0x18000 Signed-off-by: Oliver Steffen --- OvmfPkg/IoMmuDxe/IoMmuBuffer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OvmfPkg/IoMmuDxe/IoMmuBuffer.c b/OvmfPkg/IoMmuDxe/IoMmuBuffer.c index f8dcd5b7ec92..6b9c38cf0db2 100644 --- a/OvmfPkg/IoMmuDxe/IoMmuBuffer.c +++ b/OvmfPkg/IoMmuDxe/IoMmuBuffer.c @@ -23,8 +23,8 @@ extern BOOLEAN mReservedSharedMemSupported; #define RESERVED_MEM_BITMAP_4K_MASK 0xf #define RESERVED_MEM_BITMAP_32K_MASK 0xff0 #define RESERVED_MEM_BITMAP_128K_MASK 0x3000 -#define RESERVED_MEM_BITMAP_1M_MASK 0x40000 -#define RESERVED_MEM_BITMAP_2M_MASK 0x180000 +#define RESERVED_MEM_BITMAP_1M_MASK 0x4000 +#define RESERVED_MEM_BITMAP_2M_MASK 0x18000 #define RESERVED_MEM_BITMAP_MASK 0x1fffff /** From a0e8b71ee5356d4539199739f52d0af2fe4bc65b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Canupriyak=E2=80=9C?= Date: Mon, 6 Oct 2025 18:58:16 +0530 Subject: [PATCH 0666/1172] ShellPkg: Review SMBIOS 3.9 specification Add new structure members RackType and RackHeight in Smbios Type3. Signed-off-by: Anupriya --- .../UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c index 6d66e475ecbc..3698e0ea1822 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c @@ -443,6 +443,16 @@ SmbiosPrintStructure ( } } + if (AE_SMBIOS_VERSION (0x3, 0x9)) { + if (Struct->Hdr->Length > (0x16 + (Struct->Type3->ContainedElementCount * Struct->Type3->ContainedElementRecordLength))) { + ShellPrintDefaultEx (L"Rack Type: %x\n", Buffer[0x16 + (Struct->Type3->ContainedElementCount * Struct->Type3->ContainedElementRecordLength)]); + } + + if (Struct->Hdr->Length > (0x17 + (Struct->Type3->ContainedElementCount * Struct->Type3->ContainedElementRecordLength))) { + ShellPrintDefaultEx (L"Rack Height: %x\n", Buffer[0x17 + (Struct->Type3->ContainedElementCount * Struct->Type3->ContainedElementRecordLength)]); + } + } + break; // From 28b7a6d5eab8badcf6c5dc119411653817f38468 Mon Sep 17 00:00:00 2001 From: Cassandra Lam Date: Sun, 5 Oct 2025 23:00:28 -0500 Subject: [PATCH 0667/1172] ShellPkg/SmbiosView: Display Type 2 Contained Objects info Add prints for SMBIOS Type 2 "Number of Contained Object Handles" and "Contained Object Handles" fields. Signed-off-by: Cassandra Lam --- .../SmbiosView/PrintInfo.c | 12 ++++++++++++ .../SmbiosView/SmbiosViewStrings.uni | 2 ++ 2 files changed, 14 insertions(+) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c index 3698e0ea1822..71cfbc374068 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c @@ -382,6 +382,18 @@ SmbiosPrintStructure ( PRINT_PENDING_STRING (Struct, Type2, LocationInChassis); PRINT_STRUCT_VALUE_H (Struct, Type2, ChassisHandle); DisplayBaseBoardBoardType (Struct->Type2->BoardType, Option); + ShellPrintHiiDefaultEx ( + STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_NUM_CONTAINED_OBJECTS_HANDLES), + gShellDebug1HiiHandle, + Struct->Type2->NumberOfContainedObjectHandles + ); + for (Index = 0; Index < Struct->Type2->NumberOfContainedObjectHandles; Index++) { + ShellPrintHiiDefaultEx ( + STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_CONTAINED_OBJECTS_HANDLE), + gShellDebug1HiiHandle, + Struct->Type2->ContainedObjectHandles[Index] + ); + } } break; diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosViewStrings.uni b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosViewStrings.uni index 1f90e405fc41..10edc12aa7dd 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosViewStrings.uni +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/SmbiosViewStrings.uni @@ -388,6 +388,8 @@ #string STR_SMBIOSVIEW_PRINTINFO_POWER_SUPPLY_NOT_REPLACE #language en-US "Power supply is not hot replaceable\r\n" #string STR_SMBIOSVIEW_PRINTINFO_BIOS_SIZE #language en-US "BIOS ROM Size: %d KB\r\n" #string STR_SMBIOSVIEW_PRINTINFO_EXTENDED_BIOS_SIZE #language en-US "Extended BIOS ROM Size: %d %s\r\n" +#string STR_SMBIOSVIEW_PRINTINFO_NUM_CONTAINED_OBJECTS_HANDLES #language en-US "Number of Contained Object Handles: %d\r\n" +#string STR_SMBIOSVIEW_PRINTINFO_CONTAINED_OBJECTS_HANDLE #language en-US " Contained Object Handle: 0x%x\r\n" #string STR_SMBIOSVIEW_QUERYTABLE_NO_INFO #language en-US "No Info" #string STR_SMBIOSVIEW_QUERYTABLE_RSVD_BITS_SET #language en-US "\r\nIt also has reserved bits set 1 --- reserved bits: 0x%x" #string STR_SMBIOSVIEW_QUERYTABLE_SYSTEM_WAKEUP_TYPE #language en-US "System Wakeup Type:" From 9e815d789bcd7362a4b409ed58b9df8f5ea6f35c Mon Sep 17 00:00:00 2001 From: Cassandra Lam Date: Sun, 5 Oct 2025 23:06:28 -0500 Subject: [PATCH 0668/1172] ShellPkg/SmbiosView: Display Type 44 "Referenced Handle" field Signed-off-by: Cassandra Lam --- .../UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c index 71cfbc374068..40b33f8996f7 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c @@ -1343,6 +1343,11 @@ SmbiosPrintStructure ( // Processor Additional Information (Type 44) // case 44: + ShellPrintHiiDefaultEx ( + STRING_TOKEN (STR_SMBIOSVIEW_SMBIOSVIEW_REFERENCEDHANDLE), + gShellDebug1HiiHandle, + Struct->Type44->RefHandle + ); DisplayProcessorArchitectureType (Struct->Type44->ProcessorSpecificBlock.ProcessorArchType, Option); break; From 5ca97bf64f6447d935210a54b422656f90e502ce Mon Sep 17 00:00:00 2001 From: Leif Lindholm Date: Thu, 3 Jul 2025 18:30:43 +0100 Subject: [PATCH 0669/1172] BaseTools/build.py: language cleanup around CheckEnvVariable The function CheckEnvVariable in fact checks several environment variables. And the comment at its invocation enumerates a specific set of variables, which defeats half the point of abstracting it out into a helper function. Rename the function to the plural form and turn the comment into a list of examples. Signed-off-by: Leif Lindholm --- BaseTools/Source/Python/build/build.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BaseTools/Source/Python/build/build.py b/BaseTools/Source/Python/build/build.py index b0f333a2f0d8..7c2b96997ac2 100755 --- a/BaseTools/Source/Python/build/build.py +++ b/BaseTools/Source/Python/build/build.py @@ -82,7 +82,7 @@ # If any of above environment variable is not set or has error, the build # will be broken. # -def CheckEnvVariable(): +def CheckEnvVariables(): # check WORKSPACE if "WORKSPACE" not in os.environ: EdkLogger.error("build", ATTRIBUTE_NOT_AVAILABLE, "Environment variable not found", @@ -2615,9 +2615,9 @@ def Main(): ExtraData="Please select one of: %s" % (' '.join(gSupportedTarget))) # - # Check environment variable: EDK_TOOLS_PATH, WORKSPACE, PATH + # Check environment variables: EDK_TOOLS_PATH, WORKSPACE, PATH, etc... # - CheckEnvVariable() + CheckEnvVariables() GlobalData.gCommandLineDefines.update(ParseDefines(Option.Macros)) Workspace = os.getenv("WORKSPACE") From fcc568ca6e828c29bb85c76066cf89d3984a5fa3 Mon Sep 17 00:00:00 2001 From: Leif Lindholm Date: Thu, 3 Jul 2025 19:37:42 +0100 Subject: [PATCH 0670/1172] BaseTools/build.py: set BUILD_TIME_EPOCH if not already in environment Set BUILD_TIME_EPOCH to the current UTC timestamp if not already present in the environment. Use the resulting value to print the "Build start time:" message. Signed-off-by: Leif Lindholm --- BaseTools/Source/Python/build/build.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/BaseTools/Source/Python/build/build.py b/BaseTools/Source/Python/build/build.py index 7c2b96997ac2..ab203122844a 100755 --- a/BaseTools/Source/Python/build/build.py +++ b/BaseTools/Source/Python/build/build.py @@ -5,6 +5,7 @@ # Copyright (c) 2007 - 2021, Intel Corporation. All rights reserved.
    # Copyright (c) 2018, Hewlett Packard Enterprise Development, L.P.
    # Copyright (c) 2020 - 2021, ARM Limited. All rights reserved.
    +# Copyright (c) 2025 Qualcomm Technologies, Inc. All rights reserved.
    # # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -71,6 +72,25 @@ TemporaryTablePattern = re.compile(r'^_\d+_\d+_[a-fA-F0-9]+$') TmpTableDict = {} +## Set build time +# +# Check if SOURCE_DATE_EPOCH is set in environment, or set it to current timestamp. +# Return the resulting value. +# +# @retval float The time in seconds since the epoch as a floating-point number. +# +def GetBuildEpoch(): + # Set SOURCE_DATE_EPOCH to the current time if not already set by environment + if "SOURCE_DATE_EPOCH" not in os.environ: + BuildEpoch = time.time() + BuildEpochString = str(int(BuildEpoch)) + EdkLogger.quiet("SOURCE_DATE_EPOCH not set - using %s" % (BuildEpochString)) + os.environ["SOURCE_DATE_EPOCH"] = BuildEpochString + else: + BuildEpoch = float(os.environ["SOURCE_DATE_EPOCH"]) + + return BuildEpoch + ## Check environment variables # # Check environment variables that must be set for build. Currently they are @@ -2597,7 +2617,8 @@ def Main(): GlobalData.gIsWindows = False EdkLogger.quiet("Build environment: %s" % platform.platform()) - EdkLogger.quiet(time.strftime("Build start time: %H:%M:%S, %b.%d %Y\n", time.localtime())); + BuildStartTime = GetBuildEpoch() + EdkLogger.quiet(time.strftime("Build start time: %H:%M:%S, %b.%d %Y\n", time.localtime(BuildStartTime))); ReturnCode = 0 MyBuild = None BuildError = True From fe5210821190b65f43cea3ada3f021fad9e6e06c Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 19 May 2025 14:03:41 -0700 Subject: [PATCH 0671/1172] EmbeddedPkg/VirtualRealTimeClockLib: Use SOURCE_DATE_EPOCH Change VirtualRealTimeClockLib.inf to use SOURCE_DATE_EPOCH instead of Linux only shell command. This allows this library to be used in Windows build environments. Signed-off-by: Leif Lindholm --- .../VirtualRealTimeClockLib/VirtualRealTimeClockLib.c | 7 +------ .../VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf | 3 +-- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c b/EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c index f066b1f7e1ad..0579e6dcf1dd 100644 --- a/EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c +++ b/EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c @@ -80,12 +80,7 @@ LibGetTime ( if (EFI_ERROR (Status)) { ASSERT (Status != EFI_INVALID_PARAMETER); ASSERT (Status != EFI_BUFFER_TOO_SMALL); - // - // The following is intended to produce a compilation error on build - // environments where BUILD_EPOCH can not be set from inline shell. - // If you are attempting to use this library on such an environment, please - // contact the edk2 mailing list, so we can try to add support for it. - // + EpochSeconds = BUILD_EPOCH; DEBUG (( DEBUG_INFO, diff --git a/EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf b/EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf index 1cc205991fb0..bf6a025cfdf2 100644 --- a/EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf +++ b/EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf @@ -33,6 +33,5 @@ TimeBaseLib UefiRuntimeLib -# Current usage of this library expects GCC in a UNIX-like shell environment with the date command [BuildOptions] - GCC:*_*_*_CC_FLAGS = -DBUILD_EPOCH=`printenv SOURCE_DATE_EPOCH || date +%s` + *_*_*_CC_FLAGS = -DBUILD_EPOCH=$(SOURCE_DATE_EPOCH) From d428ca6fe2ffcddbb39e81cd68d0e7d32c2f360b Mon Sep 17 00:00:00 2001 From: Mayank Kumar Date: Thu, 9 Oct 2025 07:33:13 -0700 Subject: [PATCH 0672/1172] MdePkg: ATAPI: Add ATA_CMD_MODE_SENSE6 Definition ATA_CMD_MODE_SENSE6 is used to query certain properties of an ATA device, including its write protection state. This definition will be used in the next commit of this series to query if a SCSI disk is write protected. Signed-off-by: Oliver Smith-Denny --- MdePkg/Include/IndustryStandard/Atapi.h | 1 + 1 file changed, 1 insertion(+) diff --git a/MdePkg/Include/IndustryStandard/Atapi.h b/MdePkg/Include/IndustryStandard/Atapi.h index 3887027f397b..fdb43dbb590f 100644 --- a/MdePkg/Include/IndustryStandard/Atapi.h +++ b/MdePkg/Include/IndustryStandard/Atapi.h @@ -503,6 +503,7 @@ typedef union { #define ATA_CMD_PREVENT_ALLOW_MEDIA_REMOVAL 0x1E ///< defined in ATAPI Removable Rewritable Media Devices #define ATA_CMD_MODE_SELECT 0x55 ///< defined in ATAPI Removable Rewritable Media Devices +#define ATA_CMD_MODE_SENSE6 0x1A ///< defined in ATAPI Removable Rewritable Media Devices #define ATA_CMD_MODE_SENSE 0x5A ///< defined in ATAPI Removable Rewritable Media Devices #define ATA_PAGE_CODE_READ_WRITE_ERROR 0x01 ///< defined in ATAPI Removable Rewritable Media Devices #define ATA_PAGE_CODE_CACHING_PAGE 0x08 ///< defined in ATAPI Removable Rewritable Media Devices From c9eb3717b46063e0241970425eea292acf6162f2 Mon Sep 17 00:00:00 2001 From: Mayank Kumar Date: Thu, 9 Oct 2025 07:39:20 -0700 Subject: [PATCH 0673/1172] MdeModulePkg: ScsiDiskDxe: Query Write Protected State Currently, only SCSI attached CDROMs are marked as read only SCSI devices. Write failures have been seen to occur when a read only disk is attached as a SCSI device, because the device is never queried for its write protected state and the disk is listed as writeable. This adds a new mode sense query to determine if a SCSI disk is write protected. If so, the proper BlockIO media property is set to read only, to ensure that all layers know this is a read only disk. Signed-off-by: Oliver Smith-Denny --- MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c | 71 ++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c b/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c index e79110c14e11..5cff1d3eefe2 100644 --- a/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c +++ b/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c @@ -196,6 +196,65 @@ ScsiDiskDriverBindingSupported ( return Status; } +/** + Check whether the SCSI disk is write protected. + + @param[in] ScsiDiskDevice The SCSI disk device. + @param[out] WriteProtectionEnabled A pointer to a Boolean that will be set to TRUE if the disk is write protected, + FALSE otherwise. + + @retval EFI_SUCCESS The operation completed successfully. + @retval other An error occurred while executing the SCSI command. + */ +STATIC +EFI_STATUS +IsWriteProtected ( + IN OUT SCSI_DISK_DEV *ScsiDiskDevice, + OUT BOOLEAN *WriteProtectionEnabled + ) +{ + EFI_STATUS Status; + EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket; + UINT8 Cdb[6]; + UINT8 DataBuffer[64]; + + if ((ScsiDiskDevice == NULL) || (ScsiDiskDevice->ScsiIo == NULL) || (WriteProtectionEnabled == NULL)) { + return EFI_INVALID_PARAMETER; + } + + // + // Initialize SCSI REQUEST_PACKET and 6-byte Cdb + // + ZeroMem (&CommandPacket, sizeof (CommandPacket)); + ZeroMem (Cdb, sizeof (Cdb)); + + // Initialize output parameter to default value + *WriteProtectionEnabled = FALSE; + + Cdb[0] = ATA_CMD_MODE_SENSE6; + Cdb[1] = BIT3; // Setting the bit for Disable Block Descriptor + Cdb[2] = ATA_PAGE_CODE_RETURN_ALL_PAGES; + Cdb[4] = sizeof (DataBuffer); + + CommandPacket.Timeout = SCSI_DISK_TIMEOUT; + CommandPacket.Cdb = Cdb; + CommandPacket.CdbLength = (UINT8)sizeof (Cdb); + CommandPacket.InDataBuffer = &DataBuffer; + CommandPacket.InTransferLength = sizeof (DataBuffer); + + Status = ScsiDiskDevice->ScsiIo->ExecuteScsiCommand (ScsiDiskDevice->ScsiIo, &CommandPacket, NULL); + + if (EFI_ERROR (Status)) { + return Status; + } + + // Mode Sense 6 Byte Command returns the Write Protection status in the 3rd byte + // Bit 7 of the 3rd byte indicates the Write Protection status + // See SCSI Block Commands - 3 section 6.3.1 and SCSI-2 Spec, 8.3.3. + *WriteProtectionEnabled = (DataBuffer[2] & BIT7) != 0; + return EFI_SUCCESS; +} + /** Start this driver on ControllerHandle. @@ -234,6 +293,7 @@ ScsiDiskDriverBindingStart ( CHAR8 VendorStr[VENDOR_IDENTIFICATION_LENGTH + 1]; CHAR8 ProductStr[PRODUCT_IDENTIFICATION_LENGTH + 1]; CHAR16 DeviceStr[VENDOR_IDENTIFICATION_LENGTH + PRODUCT_IDENTIFICATION_LENGTH + 2]; + BOOLEAN WriteProtectionEnabled = FALSE; MustReadCapacity = TRUE; @@ -297,6 +357,17 @@ ScsiDiskDriverBindingStart ( break; } + if (ScsiDiskDevice->DeviceType == EFI_SCSI_TYPE_DISK) { + Status = IsWriteProtected (ScsiDiskDevice, &WriteProtectionEnabled); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "ScsiDisk: IsWriteProtected() fails. Status = %r\n", Status)); + } + + if (WriteProtectionEnabled) { + ScsiDiskDevice->BlkIo.Media->ReadOnly = TRUE; + } + } + // // The Sense Data Array's initial size is 6 // From 1e7a83cbb6f26f02f743c06aeafee164a3ec59bf Mon Sep 17 00:00:00 2001 From: Phil Noh Date: Tue, 23 Sep 2025 21:54:54 -0500 Subject: [PATCH 0674/1172] BaseTools/FMMT: Fix errors when operating the FV with CRC32 section Currently the FMMT tool supports CRC32 GUID section (Ref. GuidTools.py). But it is found that there are errors for the FV with CRC32 section. For example, the errors are checked on the following commands. --v : Show FV information except for the FV --a : Show "Target Fv not found!!!" when adding an FFS file to the FV --d : Show "Target Ffs not found!!!" when deleting an FFS file in the FV They are caused by the mismatch for CRC32 section data between the FMMT and GenCrc32 tools. The FMMT tool returns CRC32 section data without CRC checksum field (4 bytes). The GenCrc32 tool (with -d option, verify CRC32 value for the input file) requires CRC32 section data including CRC checksum field (4 bytes). Fix the issue through adjusting the section data to include CRC checksum field. Currently DataOffset field for CRC32 GUID section is reported as 0x1C differently (GUID Section header length: 0x18 + Checksum field: 0x4). Instead of DataOffset field that includes CRC checksum field, configure the section data based on the offset from section header length (0x18) that was previously calculated. This update enables GUID sections to use the same offset consistently. Signed-off-by: Phil Noh --- BaseTools/Source/Python/FMMT/core/BinaryFactoryProduct.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/BaseTools/Source/Python/FMMT/core/BinaryFactoryProduct.py b/BaseTools/Source/Python/FMMT/core/BinaryFactoryProduct.py index 9dd717cfcf16..dc6ae37d4207 100644 --- a/BaseTools/Source/Python/FMMT/core/BinaryFactoryProduct.py +++ b/BaseTools/Source/Python/FMMT/core/BinaryFactoryProduct.py @@ -2,6 +2,7 @@ # This file is used to implement of the various bianry parser. # # Copyright (c) 2021-, Intel Corporation. All rights reserved.
    +# Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved.
    # SPDX-License-Identifier: BSD-2-Clause-Patent ## import copy @@ -136,9 +137,6 @@ def ParserSection(self, ParTree, Whole_Data: bytes, Rel_Whole_Offset: int=0) -> if (Rel_Offset+Section_Info.HeaderLength+len(Section_Info.Data) != Data_Size): Pad_Size = GetPadSize(Section_Info.Size, SECTION_COMMON_ALIGNMENT) Section_Info.PadData = Pad_Size * b'\x00' - if Section_Info.Header.Type == 0x02: - Section_Info.DOffset = Section_Offset + Section_Info.ExtHeader.DataOffset + Rel_Whole_Offset - Section_Info.Data = Whole_Data[Rel_Offset+Section_Info.ExtHeader.DataOffset: Rel_Offset+Section_Info.Size] if Section_Info.Header.Type == 0x14: ParTree.Data.Version = Section_Info.ExtHeader.GetVersionString() if Section_Info.Header.Type == 0x15: @@ -179,9 +177,6 @@ def ParserData(self, ParTree, Whole_Data: bytes, Rel_Whole_Offset: int=0) -> Non if (Rel_Offset+Section_Info.HeaderLength+len(Section_Info.Data) != Data_Size): Pad_Size = GetPadSize(Section_Info.Size, SECTION_COMMON_ALIGNMENT) Section_Info.PadData = Pad_Size * b'\x00' - if Section_Info.Header.Type == 0x02: - Section_Info.DOffset = Section_Offset + Section_Info.ExtHeader.DataOffset + Rel_Whole_Offset - Section_Info.Data = Whole_Data[Rel_Offset+Section_Info.ExtHeader.DataOffset: Rel_Offset+Section_Info.Size] # If Section is Version or UI type, it saves the version and UI info of its parent Ffs. if Section_Info.Header.Type == 0x14: ParTree.Data.Version = Section_Info.ExtHeader.GetVersionString() From b5bab75e58bf8c9ec66243a62b86d5f6b409a69a Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Thu, 25 Sep 2025 11:08:22 -0700 Subject: [PATCH 0675/1172] MdeModulePkg: DXE Core: Correct Usage of EFI_MEMORY_ATTRIBUTE_MASK edk2 commit 3bd5c994c879f78e8e3d5346dc3b627f199291aa added usage of EFI_MEMORY_ATTRIBUTE_MASK to edk2. However, it applied it incorrectly to some places that should instead use EFI_MEMORY_ACCESS_MASK. EFI_MEMORY_ACCESS_MASK contains the actual HW page table access attributes (read protect, read only, no-execute), whereas EFI_MEMORY_ATTRIBUTE_MASK contains the access attributes in addition to some virtual attributes (special purpose and cpu crypto). The GCD has a behavior where if SetMemorySpaceAttributes() is called with only virtual attributes set, it will not call into CpuDxe to change the attributes; 0 is a valid page table attribute set (it means RWX). However, after the above change, this behavior was altered so that if EFI_MEMORY_SP or EFI_MEMORY_CPU_CRYPTO is applied, in attempt to just update these virtual attributes, the GCD will call into CpuDxe and apply RWX instead, which is not the intention of the caller. One other place this was done incorrectly was in CoreGetMemoryMap, but that was fixed in f1567720b13a578ffa54716119f826df622babcd. SetUefiImageMemoryAttributes() is also updated here because that logic was copied from the check the GCD has about whether to call CpuDxe or not. Now that the GCD has been corrected, this also needs to be corrected. Signed-off-by: Oliver Smith-Denny --- MdeModulePkg/Core/Dxe/Gcd/Gcd.c | 4 ++-- MdeModulePkg/Core/Dxe/Misc/MemoryProtection.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Gcd/Gcd.c b/MdeModulePkg/Core/Dxe/Gcd/Gcd.c index f5cac1874a96..42ec2618dfb2 100644 --- a/MdeModulePkg/Core/Dxe/Gcd/Gcd.c +++ b/MdeModulePkg/Core/Dxe/Gcd/Gcd.c @@ -692,7 +692,7 @@ ConverToCpuArchAttributes ( { UINT64 CpuArchAttributes; - CpuArchAttributes = Attributes & EFI_MEMORY_ATTRIBUTE_MASK; + CpuArchAttributes = Attributes & EFI_MEMORY_ACCESS_MASK; if ((Attributes & EFI_MEMORY_UC) == EFI_MEMORY_UC) { CpuArchAttributes |= EFI_MEMORY_UC; @@ -995,7 +995,7 @@ CoreConvertSpace ( // Keep original CPU arch attributes when caller just calls // SetMemorySpaceAttributes() with none CPU arch attributes (for example, RUNTIME). // - Attributes |= (Entry->Attributes & (EFI_CACHE_ATTRIBUTE_MASK | EFI_MEMORY_ATTRIBUTE_MASK)); + Attributes |= (Entry->Attributes & (EFI_CACHE_ATTRIBUTE_MASK | EFI_MEMORY_ACCESS_MASK)); } Entry->Attributes = Attributes; diff --git a/MdeModulePkg/Core/Dxe/Misc/MemoryProtection.c b/MdeModulePkg/Core/Dxe/Misc/MemoryProtection.c index 69d26cb2b3cc..b12047d7ad2b 100644 --- a/MdeModulePkg/Core/Dxe/Misc/MemoryProtection.c +++ b/MdeModulePkg/Core/Dxe/Misc/MemoryProtection.c @@ -281,7 +281,7 @@ SetUefiImageMemoryAttributes ( ASSERT_EFI_ERROR (Status); } - if (((FinalAttributes & (EFI_MEMORY_ATTRIBUTE_MASK | EFI_CACHE_ATTRIBUTE_MASK)) == 0) && (gCpu != NULL)) { + if (((FinalAttributes & (EFI_MEMORY_ACCESS_MASK | EFI_CACHE_ATTRIBUTE_MASK)) == 0) && (gCpu != NULL)) { // if the passed hardware attributes are 0, CoreSetMemorySpaceAttributes() will not call into the CPU Arch protocol // to set the attributes, so we need to do it manually here. This can be the case when we are unprotecting an // image if no caching attributes are set. If gCpu has not been populated yet, we'll still have updated the GCD From 7a3bcd6684c44928ae64d6c9fab8581cd131814c Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 2 Oct 2025 15:46:03 -0700 Subject: [PATCH 0676/1172] BaseTools/Source/C/GenFw: Add no symbols check to --prm When --prm is specified, a search for the symbol with the name PRM_MODULE_EXPORT_DESCRIPTOR_NAME is performed. If the symbol is not found, then GENFW generates an exception due to a loop with a terminal count of -1. Update logic to not search for PRM Handler symbols if the PRM_MODULE_EXPORT_DESCRIPTOR_NAME was not found and add an Error() message when --prm is specified and PRM_MODULE_EXPORT_DESCRIPTOR_NAME was not found. Signed-off-by: Michael D Kinney --- BaseTools/Source/C/GenFw/Elf64Convert.c | 30 +++++++++++++++---------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c b/BaseTools/Source/C/GenFw/Elf64Convert.c index 18594122eaa1..996f91584e63 100644 --- a/BaseTools/Source/C/GenFw/Elf64Convert.c +++ b/BaseTools/Source/C/GenFw/Elf64Convert.c @@ -1063,20 +1063,22 @@ ScanSections64 ( // // Second Get PrmHandler // - for (SymIndex = 0; SymIndex < SymNum; SymIndex++) { - UINT32 ExpIndex; - Sym = (Elf_Sym *)(Symtab + SymIndex * shdr->sh_entsize); - SymName = GetSymName(Sym); - if (SymName == NULL) { - continue; - } + if (mExportSymNum > 0) { + for (SymIndex = 0; SymIndex < SymNum; SymIndex++) { + UINT32 ExpIndex; + Sym = (Elf_Sym *)(Symtab + SymIndex * shdr->sh_entsize); + SymName = GetSymName(Sym); + if (SymName == NULL) { + continue; + } - for (ExpIndex = 0; ExpIndex < (mExportSymNum -1); ExpIndex++) { - if (strcmp((CHAR8*)SymName, mExportSymName[ExpIndex]) != 0) { - continue; + for (ExpIndex = 0; ExpIndex < (mExportSymNum -1); ExpIndex++) { + if (strcmp((CHAR8*)SymName, mExportSymName[ExpIndex]) != 0) { + continue; + } + mExportRVA[ExpIndex] = (UINT32)(Sym->st_value); + mExportSize += 2 * EFI_IMAGE_EXPORT_ADDR_SIZE + EFI_IMAGE_EXPORT_ORDINAL_SIZE + strlen((CHAR8 *)SymName) + 1; } - mExportRVA[ExpIndex] = (UINT32)(Sym->st_value); - mExportSize += 2 * EFI_IMAGE_EXPORT_ADDR_SIZE + EFI_IMAGE_EXPORT_ORDINAL_SIZE + strlen((CHAR8 *)SymName) + 1; } } @@ -2398,6 +2400,10 @@ WriteExport64 ( UINT16 Index; UINT8 *Tdata = NULL; + if (mExportSymNum == 0) { + Error (NULL, 0, 3000, "Invalid", "--prm option set but no export symbols were found in %s", mInImageName); + exit(EXIT_FAILURE); + } ExportDir = (EFI_IMAGE_EXPORT_DIRECTORY*)(mCoffFile + mExportOffset); ExportDir->Characteristics = 0; ExportDir->TimeDateStamp = 0; From 47b0261613388d6ae34613bf505fe0ffb31678b9 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 2 Oct 2025 15:49:32 -0700 Subject: [PATCH 0677/1172] BaseTools/Source/C/GenFw: Add --image-version option Add --image-version option that takes a version value of the form MMMM.mmmm where MMMM and mmmm are decimal values < 65536. The MMMM and mmmm values are used to set the PE/COFF optional header fields MajorImageVersion and MinorImageVersion. If MMMM or mmmm are larger than 65535, then generate Error() condition. Signed-off-by: Michael D Kinney --- BaseTools/Source/C/GenFw/GenFw.c | 68 ++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/BaseTools/Source/C/GenFw/GenFw.c b/BaseTools/Source/C/GenFw/GenFw.c index daf840c3cd65..183914d2dfdc 100644 --- a/BaseTools/Source/C/GenFw/GenFw.c +++ b/BaseTools/Source/C/GenFw/GenFw.c @@ -246,6 +246,9 @@ Routine Description: fprintf (stdout, " --keepoptionalheader Don't zero PE/COFF optional header fields.\n\ This option can be used together with -e or -t.\n\ It doesn't work for other options.\n"); + fprintf (stdout, " --image-version MAJOR.MINOR Set the PE/COFF optional header\n\ + field MajorImageVersion to MAJOR and MinorImageVersion\n\ + to MINOR.\n"); fprintf (stdout, " --keepzeropending Don't strip zero pending of .reloc.\n\ This option can be used together with -e or -t.\n\ It doesn't work for other options.\n"); @@ -1177,6 +1180,10 @@ Routine Description: time_t OutputFileTime; struct stat Stat_Buf; BOOLEAN ZeroDebugFlag; + BOOLEAN ImageVersionFlag; + CHAR8 *ImageVersionDot; + UINT16 ImageMajorVersion; + UINT16 ImageMinorVersion; SetUtilityName (UTILITY_NAME); @@ -1225,6 +1232,10 @@ Routine Description: InputFileTime = 0; OutputFileTime = 0; ZeroDebugFlag = FALSE; + ImageVersionFlag = FALSE; + ImageVersionDot = NULL; + ImageMajorVersion = 0; + ImageMinorVersion = 0; if (argc == 1) { Error (NULL, 0, 1001, "Missing options", "No input options."); @@ -1358,6 +1369,53 @@ Routine Description: continue; } + if (stricmp(argv[0], "--image-version") == 0) { + if (argc == 1) { + Error (NULL, 0, 1003, "Invalid option value", "Image major and minor values missing"); + goto Finish; + } + ImageVersionFlag = TRUE; + // Split argv[1] at '.' + ImageVersionDot = strchr(argv[1], '.'); + if (ImageVersionDot != NULL) { + *ImageVersionDot = '\0'; + // Convert major and minor version strings to UINT16 + if (AsciiStringToUint64(argv[1], FALSE, &Temp64) != EFI_SUCCESS) { + Error (NULL, 0, 1003, "Invalid option value", "Image major version %s is not a valid number", argv[1]); + goto Finish; + } + if (Temp64 > 0xFFFF) { + Error (NULL, 0, 1003, "Invalid option value", "Image major version %s is out of range (0-65535)", argv[1]); + goto Finish; + } + ImageMajorVersion = (UINT16) Temp64; + if (AsciiStringToUint64(ImageVersionDot + 1, FALSE, &Temp64) != EFI_SUCCESS) { + Error (NULL, 0, 1003, "Invalid option value", "Image minor version %s is not a valid number", ImageVersionDot + 1); + goto Finish; + } + if (Temp64 > 0xFFFF) { + Error (NULL, 0, 1003, "Invalid option value", "Image minor version %s is out of range (0-65535)", ImageVersionDot + 1); + goto Finish; + } + ImageMinorVersion = (UINT16) Temp64; + *ImageVersionDot = '.'; + } else { + // Convert major and minor version strings to UINT16 + if (AsciiStringToUint64(argv[1], FALSE, &Temp64) != EFI_SUCCESS) { + Error (NULL, 0, 1003, "Invalid option value", "Image major version %s is not a valid number", argv[1]); + goto Finish; + } + if (Temp64 > 0xFFFF) { + Error (NULL, 0, 1003, "Invalid option value", "Image major version %s is out of range (0-65535)", argv[1]); + goto Finish; + } + ImageMajorVersion = (UINT16) Temp64; + } + argc -= 2; + argv += 2; + continue; + } + if (stricmp (argv[0], "--keepzeropending") == 0) { KeepZeroPendingFlag = TRUE; argc --; @@ -2427,6 +2485,11 @@ Routine Description: Optional32->SizeOfHeapReserve = 0; Optional32->SizeOfHeapCommit = 0; } + if (ImageVersionFlag) { + Optional32->MajorImageVersion = (UINT16) ImageMajorVersion; + Optional32->MinorImageVersion = (UINT16) ImageMinorVersion; + } + TEImageHeader.AddressOfEntryPoint = Optional32->AddressOfEntryPoint; TEImageHeader.BaseOfCode = Optional32->BaseOfCode; TEImageHeader.ImageBase = (UINT64) (Optional32->ImageBase); @@ -2520,6 +2583,11 @@ Routine Description: Optional64->SizeOfHeapReserve = 0; Optional64->SizeOfHeapCommit = 0; } + if (ImageVersionFlag) { + Optional64->MajorImageVersion = (UINT16) ImageMajorVersion; + Optional64->MinorImageVersion = (UINT16) ImageMinorVersion; + } + TEImageHeader.AddressOfEntryPoint = Optional64->AddressOfEntryPoint; TEImageHeader.BaseOfCode = Optional64->BaseOfCode; TEImageHeader.ImageBase = (UINT64) (Optional64->ImageBase); From 3980808abf4599ce601fd39ea70bc1f4385172af Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 2 Oct 2025 15:57:50 -0700 Subject: [PATCH 0678/1172] BaseTools/Scripts: KEEP .prmexportdescriptor data sections Update GCC linker script to always keep .prmexportdescriptor sections and merge them into the .data section. The .prmexportdescriptor section is only used by PRM modules for the PRM Export Descriptor Structure that must be kept in the final image to support adding the PRM Export Descriptor Structure and its associated PRM Handlers APIs to a PE/COFF DLL Export section. Signed-off-by: Michael D Kinney --- BaseTools/Scripts/GccBase.lds | 1 + 1 file changed, 1 insertion(+) diff --git a/BaseTools/Scripts/GccBase.lds b/BaseTools/Scripts/GccBase.lds index 8d6c29d7b6f1..3d2a97ddebe6 100644 --- a/BaseTools/Scripts/GccBase.lds +++ b/BaseTools/Scripts/GccBase.lds @@ -52,6 +52,7 @@ SECTIONS { .data ALIGN(ALIGNOF(.text)) : ALIGN(CONSTANT(COMMONPAGESIZE)) { *(.data .data.* .gnu.linkonce.d.*) *(.bss .bss.*) + KEEP(*(.prmexportdescriptor)) } :data .eh_frame ALIGN(CONSTANT(COMMONPAGESIZE)) : { From c16e88e301d659a962880a898d72b17c5010f2e0 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 2 Oct 2025 16:09:38 -0700 Subject: [PATCH 0679/1172] PrmPkg/Include: Fix GCC/CLANG PRM Module DLL Export issues Use _MSC_EXTENSIONS instead of _MSC_VER when MSC specific extensions are required such as __declspec(dllexport). CLANGPDB builds do not set _MSC_VER but CLANGPDB builds in Windows and Linux do support use of MSC specific extensions. Add PRM_EXPORT_DESCRIPTOR macro that provides attributes required to make sure the PRM Export Descriptor Structure is not optimized away by the compiler/linker. PRM_EXPORT_API can not be used for this because the attributes for code and data may be different with different tool chains. For GCC/CLANGDWARF tool chains, PRM_EXPORT_DESCRIPTOR sets the 'used' and 'section(.prmexportdescriptor)' attributes and depends on the GCC linker script to make sure the `.prmexportdescriptor` section is preserved. Fix incorrect location of ; in PRM_MODULE_EXPORT() macro that was found by CLANG. Signed-off-by: Michael D Kinney --- PrmPkg/Include/Prm.h | 11 +++++++---- PrmPkg/Include/PrmExportDescriptor.h | 8 ++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/PrmPkg/Include/Prm.h b/PrmPkg/Include/Prm.h index 007f73416aac..563c7430ab24 100644 --- a/PrmPkg/Include/Prm.h +++ b/PrmPkg/Include/Prm.h @@ -14,12 +14,15 @@ #include #include -#if defined (_MSC_VER) -#define PRM_EXPORT_API __declspec(dllexport) -#elif defined (__GNUC__) -#define PRM_EXPORT_API __attribute__ ((visibility ("default"))) +#if defined (_MSC_EXTENSIONS) +#define PRM_EXPORT_API __declspec(dllexport) +#define PRM_EXPORT_DESCRIPTOR __declspec(dllexport) +#elif defined (__GNUC__) || defined (__clang__) +#define PRM_EXPORT_API +#define PRM_EXPORT_DESCRIPTOR __attribute__((used)) __attribute__((section(".prmexportdescriptor"))) #else #define PRM_EXPORT_API +#define PRM_EXPORT_DESCRIPTOR #endif #define PRM_HANDLER_NAME_MAXIMUM_LENGTH 128 diff --git a/PrmPkg/Include/PrmExportDescriptor.h b/PrmPkg/Include/PrmExportDescriptor.h index 85b38eace719..8131b5ade913 100644 --- a/PrmPkg/Include/PrmExportDescriptor.h +++ b/PrmPkg/Include/PrmExportDescriptor.h @@ -41,7 +41,7 @@ typedef struct { #pragma pack(pop) -#if defined (_MSC_VER) +#if defined (_MSC_EXTENSIONS) #define PRM_PACKED_STRUCT(definition) \ __pragma(pack(push, 1)) typedef struct definition __pragma(pack(pop)) #elif defined (__GNUC__) || defined (__clang__) @@ -92,10 +92,10 @@ typedef struct { { \ PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_HEADER Header; \ PRM_HANDLER_EXPORT_DESCRIPTOR_STRUCT PrmHandlerExportDescriptors[VA_ARG_COUNT(__VA_ARGS__)]; \ - } PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_ \ - ); \ + } PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_; \ + ) \ \ - PRM_EXPORT_API PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_ PRM_MODULE_EXPORT_DESCRIPTOR_NAME = { \ + PRM_EXPORT_DESCRIPTOR PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_ PRM_MODULE_EXPORT_DESCRIPTOR_NAME = { \ { \ PRM_MODULE_EXPORT_DESCRIPTOR_SIGNATURE, \ PRM_MODULE_EXPORT_REVISION, \ From 12a908e09c2e2999a8c988a53bb44f70a7862bc4 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 2 Oct 2025 16:18:17 -0700 Subject: [PATCH 0680/1172] PrmPkg/Samples: Update INF files for GCC/CLANG * Remove redundant /DLL option from MSFT * Use VERSION_STRING from [Defines] section to set the PE/COFF optional header image version fields. The use of the MSFT linker /VERSION option is removed and replaced with the GenFw --image-version option to use same method for all tool chains and provide better error checking. * Add CLANGPDB tool chain family support that matches MSFT settings. * Add GCC family tool chain support that overrides OBJCOPY_STRIPFLAGS to nothing to prevent symbols from being stripped from PRM Modules so the PRM Export Descriptor Structure can be found by GENFW when the --prm option is used. * Remove all -Wl, options that are not compatible across all support tool chains. This also removes the need to list the PRM Export Descriptor Structure and PRM Handler APIs in the INF file and instead depend in GENFW with --prm option to find these symbols and generate the PE/COFF DLL export section. Signed-off-by: Michael D Kinney --- .../PrmSampleAcpiParameterBufferModule.inf | 12 +++++++----- .../PrmSampleContextBufferModule.inf | 12 +++++++----- .../PrmSampleHardwareAccessModule.inf | 12 +++++++++--- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/PrmPkg/Samples/PrmSampleAcpiParameterBufferModule/PrmSampleAcpiParameterBufferModule.inf b/PrmPkg/Samples/PrmSampleAcpiParameterBufferModule/PrmSampleAcpiParameterBufferModule.inf index e3311d7b8b66..c0aac03dd7e3 100644 --- a/PrmPkg/Samples/PrmSampleAcpiParameterBufferModule/PrmSampleAcpiParameterBufferModule.inf +++ b/PrmPkg/Samples/PrmSampleAcpiParameterBufferModule/PrmSampleAcpiParameterBufferModule.inf @@ -38,10 +38,12 @@ [Depex] TRUE -[BuildOptions.common] - MSFT:*_*_*_DLINK_FLAGS = /DLL /SUBSYSTEM:CONSOLE /VERSION:1.0 +[BuildOptions] + MSFT:*_*_*_DLINK_FLAGS = /SUBSYSTEM:CONSOLE /VERSION:$(VERSION_STRING) MSFT:*_*_*_GENFW_FLAGS = --keepoptionalheader - GCC:*_*_*_GENFW_FLAGS = --prm - GCC:*_*_*_DLINK_FLAGS = -Wl,--no-gc-sections -Wl,--require-defined=PrmModuleExportDescriptor -Wl,--require-defined=CheckParamBufferPrmHandler - GCC:*_*_X64_OBJCOPY_STRIPFLAG = --keep-symbol=PrmModuleExportDescriptor --keep-symbol=CheckParamBufferPrmHandler + CLANGPDB:*_*_*_DLINK_FLAGS = /SUBSYSTEM:CONSOLE /VERSION:$(VERSION_STRING) + CLANGPDB:*_*_*_GENFW_FLAGS = --keepoptionalheader + + GCC:*_*_*_GENFW_FLAGS = --prm --image-version $(VERSION_STRING) + GCC:*_*_*_OBJCOPY_STRIPFLAG == diff --git a/PrmPkg/Samples/PrmSampleContextBufferModule/PrmSampleContextBufferModule.inf b/PrmPkg/Samples/PrmSampleContextBufferModule/PrmSampleContextBufferModule.inf index 31c3863fb4d7..afadc1dbddf0 100644 --- a/PrmPkg/Samples/PrmSampleContextBufferModule/PrmSampleContextBufferModule.inf +++ b/PrmPkg/Samples/PrmSampleContextBufferModule/PrmSampleContextBufferModule.inf @@ -41,10 +41,12 @@ [Depex] TRUE -[BuildOptions.common] - MSFT:*_*_*_DLINK_FLAGS = /DLL /SUBSYSTEM:CONSOLE /VERSION:1.0 +[BuildOptions] + MSFT:*_*_*_DLINK_FLAGS = /SUBSYSTEM:CONSOLE /VERSION:$(VERSION_STRING) MSFT:*_*_*_GENFW_FLAGS = --keepoptionalheader - GCC:*_*_*_GENFW_FLAGS = --keepoptionalheader --prm - GCC:*_*_*_DLINK_FLAGS = -Wl,--no-gc-sections -Wl,--require-defined=PrmModuleExportDescriptor -Wl,--require-defined=CheckStaticDataBufferPrmHandler - GCC:*_*_X64_OBJCOPY_STRIPFLAG = --keep-symbol=PrmModuleExportDescriptor --keep-symbol=CheckStaticDataBufferPrmHandler + CLANGPDB:*_*_*_DLINK_FLAGS = /SUBSYSTEM:CONSOLE /VERSION:$(VERSION_STRING) + CLANGPDB:*_*_*_GENFW_FLAGS = --keepoptionalheader + + GCC:*_*_*_GENFW_FLAGS = --prm --image-version $(VERSION_STRING) + GCC:*_*_*_OBJCOPY_STRIPFLAG == diff --git a/PrmPkg/Samples/PrmSampleHardwareAccessModule/PrmSampleHardwareAccessModule.inf b/PrmPkg/Samples/PrmSampleHardwareAccessModule/PrmSampleHardwareAccessModule.inf index 46d4a88185a9..5984dd9f7415 100644 --- a/PrmPkg/Samples/PrmSampleHardwareAccessModule/PrmSampleHardwareAccessModule.inf +++ b/PrmPkg/Samples/PrmSampleHardwareAccessModule/PrmSampleHardwareAccessModule.inf @@ -38,6 +38,12 @@ [Depex] TRUE -[BuildOptions.common] - MSFT:*_*_*_DLINK_FLAGS = /DLL /SUBSYSTEM:CONSOLE /VERSION:1.0 - MSFT:*_*_*_GENFW_FLAGS = --keepoptionalheader +[BuildOptions] + MSFT:*_*_*_DLINK_FLAGS = /SUBSYSTEM:CONSOLE + MSFT:*_*_*_GENFW_FLAGS = --keepoptionalheader --image-version $(VERSION_STRING) + + CLANGPDB:*_*_*_DLINK_FLAGS = /SUBSYSTEM:CONSOLE + CLANGPDB:*_*_*_GENFW_FLAGS = --keepoptionalheader --image-version $(VERSION_STRING) + + GCC:*_*_*_GENFW_FLAGS = --prm --image-version $(VERSION_STRING) + GCC:*_*_*_OBJCOPY_STRIPFLAG == From 3731699a63e5bc774507d225e812ae0f97701d4f Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 2 Oct 2025 16:20:53 -0700 Subject: [PATCH 0681/1172] PrmPkg: Remove notes from Readme that do not apply Signed-off-by: Michael D Kinney --- PrmPkg/Readme.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/PrmPkg/Readme.md b/PrmPkg/Readme.md index 85e6bd352436..8ad753da5431 100644 --- a/PrmPkg/Readme.md +++ b/PrmPkg/Readme.md @@ -73,11 +73,6 @@ on IA32 with the unique UEFI configuration required. * AArch64 ``build -p PrmPkg/PrmPkg.dsc -a AARCH64 -t GCC5`` - > ***Note***: Only builds with the GCC5 toolchain have been tested. - > ***Note***: For builds with the GCC5 toolchain, the PrmModuleExportDescriptor and any other handler entry points - symbols, to be listed in the PRMT, must be explicitly preserved by enumerating these in the AARCH64 linker flags. - The --require-defined linker flag must be used for each symbol to be preserved. - ### PRM Platform GUID **IMPORTANT** PRM has a concept of a "Platform GUID" which associates a specific platform with a set of PRM modules From f80a406aa9dd9fde80b3e33cd435a1641afde13e Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Fri, 10 Oct 2025 15:28:26 -0700 Subject: [PATCH 0682/1172] MdeModulePkg: CoreGetMemoryMap: Account for Unaccepted Entries Commit 43e306806e3c1ed3ad7e9913492732e893cafa0f added EFIGcdMemoryTypeUnaccepted (as it was later renamed) to be returned in the EFI_MEMORY_MAP. However, it did not add it to the number of entries calculation, so if any EfiGcdMemoryTypeUnaccepted entries exist in the GCD they will overflow the EFI_MEMORY_MAP buffer provided by the bootloader. This resolves that by accounting for unaccepted entries in the number of entries calculation. Signed-off-by: Oliver Smith-Denny --- MdeModulePkg/Core/Dxe/Mem/Page.c | 1 + 1 file changed, 1 insertion(+) diff --git a/MdeModulePkg/Core/Dxe/Mem/Page.c b/MdeModulePkg/Core/Dxe/Mem/Page.c index 27c27882fa7a..8e7381159707 100644 --- a/MdeModulePkg/Core/Dxe/Mem/Page.c +++ b/MdeModulePkg/Core/Dxe/Mem/Page.c @@ -1953,6 +1953,7 @@ CoreGetMemoryMap ( GcdMapEntry = CR (Link, EFI_GCD_MAP_ENTRY, Link, EFI_GCD_MAP_SIGNATURE); if ((GcdMapEntry->GcdMemoryType == EfiGcdMemoryTypePersistent) || (GcdMapEntry->GcdMemoryType == EfiGcdMemoryTypeReserved) || + (GcdMapEntry->GcdMemoryType == EfiGcdMemoryTypeUnaccepted) || ((GcdMapEntry->GcdMemoryType == EfiGcdMemoryTypeMemoryMappedIo) && ((GcdMapEntry->Attributes & EFI_MEMORY_RUNTIME) == EFI_MEMORY_RUNTIME))) { From 1527320ad2a035010612ae9a0a22b0cd45f7ff70 Mon Sep 17 00:00:00 2001 From: Deepak5x Singh Date: Wed, 20 Aug 2025 12:49:45 +0530 Subject: [PATCH 0683/1172] CryptoPkg/BuildOptions : Add CLANGPDB DLINK_FLAGS flags to build options [Issue] : There is no DLINK_FLAGS definition for CLANGPDB, leading to potential discrepancies in build alignments [Resolution] : This change adds a CLANGPDB line for DLINK_FLAGS. Maintaining the alignment with existing standards in place for other compiler packages. Signed-off-by: Deepak5x --- CryptoPkg/CryptoPkg.dsc | 17 +++++++++++++++++ CryptoPkg/CryptoPkgMbedTls.dsc | 1 + 2 files changed, 18 insertions(+) diff --git a/CryptoPkg/CryptoPkg.dsc b/CryptoPkg/CryptoPkg.dsc index e657322be367..2ffba6d62bc0 100644 --- a/CryptoPkg/CryptoPkg.dsc +++ b/CryptoPkg/CryptoPkg.dsc @@ -339,6 +339,7 @@ TlsLib|CryptoPkg/Library/TlsLib/TlsLib.inf MSFT:*_*_*_DLINK_FLAGS = /ALIGN:4096 + CLANGPDB: *_*_*_DLINK_FLAGS = /ALIGN:4096 } [Components.RISCV64] @@ -455,6 +456,8 @@ MSFT:*_*_IA32_DLINK_XIPFLAGS = /ALIGN:64 MSFT:*_*_X64_DLINK_FLAGS = /ALIGN:256 MSFT:*_*_X64_DLINK_XIPFLAGS = /ALIGN:256 + CLANGPDB: *_*_IA32_DLINK_FLAGS = /ALIGN:64 + CLANGPDB: *_*_X64_DLINK_FLAGS = /ALIGN:256 } # @@ -472,6 +475,8 @@ MSFT:*_*_X64_DLINK_FLAGS = /ALIGN:4096 MSFT:*_*_X64_DLINK_XIPFLAGS = /ALIGN:4096 GCC:*_*_AARCH64_DLINK_XIPFLAGS = -z common-page-size=0x1000 + CLANGPDB: *_*_IA32_DLINK_FLAGS = /ALIGN:4096 + CLANGPDB: *_*_X64_DLINK_FLAGS = /ALIGN:4096 } !endif @@ -525,6 +530,8 @@ MSFT:*_*_IA32_DLINK_FLAGS = /ALIGN:64 MSFT:*_*_X64_DLINK_FLAGS = /ALIGN:256 + CLANGPDB: *_*_IA32_DLINK_FLAGS = /ALIGN:64 + CLANGPDB: *_*_X64_DLINK_FLAGS = /ALIGN:256 } # # CryptoDxe with IA32/X64/AARCH64 performance optimized OpensslLib instance with all services. @@ -539,6 +546,8 @@ MSFT:*_*_IA32_DLINK_FLAGS = /ALIGN:4096 MSFT:*_*_X64_DLINK_FLAGS = /ALIGN:4096 GCC:*_*_AARCH64_DLINK_XIPFLAGS = -z common-page-size=0x1000 + CLANGPDB: *_*_IA32_DLINK_FLAGS = /ALIGN:4096 + CLANGPDB: *_*_X64_DLINK_FLAGS = /ALIGN:4096 } # # CryptoSmm with OpensslLib instance with no SSL or EC services @@ -579,6 +588,8 @@ MSFT:*_*_IA32_DLINK_FLAGS = /ALIGN:64 MSFT:*_*_X64_DLINK_FLAGS = /ALIGN:256 + CLANGPDB: *_*_IA32_DLINK_FLAGS = /ALIGN:64 + CLANGPDB: *_*_X64_DLINK_FLAGS = /ALIGN:256 } # # CryptoSmm with IA32/X64/AARCH64 performance optimized OpensslLib instance with all services @@ -593,6 +604,8 @@ MSFT:*_*_IA32_DLINK_FLAGS = /ALIGN:4096 MSFT:*_*_X64_DLINK_FLAGS = /ALIGN:4096 GCC:*_*_AARCH64_DLINK_XIPFLAGS = -z common-page-size=0x1000 + CLANGPDB: *_*_IA32_DLINK_FLAGS = /ALIGN:4096 + CLANGPDB: *_*_X64_DLINK_FLAGS = /ALIGN:4096 } # # CryptoStandaloneMm with OpensslLib instance with no SSL or EC services @@ -633,6 +646,8 @@ MSFT:*_*_IA32_DLINK_FLAGS = /ALIGN:64 MSFT:*_*_X64_DLINK_FLAGS = /ALIGN:256 + CLANGPDB: *_*_IA32_DLINK_FLAGS = /ALIGN:64 + CLANGPDB: *_*_X64_DLINK_FLAGS = /ALIGN:256 } # # CryptoStandaloneMm with IA32/X64/AARCH64 performance optimized OpensslLib instance with all services @@ -646,6 +661,8 @@ MSFT:*_*_IA32_DLINK_FLAGS = /ALIGN:4096 MSFT:*_*_X64_DLINK_FLAGS = /ALIGN:4096 + CLANGPDB: *_*_IA32_DLINK_FLAGS = /ALIGN:4096 + CLANGPDB: *_*_X64_DLINK_FLAGS = /ALIGN:4096 } !endif diff --git a/CryptoPkg/CryptoPkgMbedTls.dsc b/CryptoPkg/CryptoPkgMbedTls.dsc index db00807e75e0..22fd4ae009e7 100644 --- a/CryptoPkg/CryptoPkgMbedTls.dsc +++ b/CryptoPkg/CryptoPkgMbedTls.dsc @@ -262,5 +262,6 @@ RVCT:*_*_*_CC_FLAGS = -DENABLE_MD5_DEPRECATED_INTERFACES !if $(CRYPTO_IMG_TYPE) IN "DXE_SMM" MSFT:*_*_*_DLINK_FLAGS = /ALIGN:4096 + CLANGPDB: *_*_*_DLINK_FLAGS = /ALIGN:4096 GCC:*_GCC*_*_DLINK_FLAGS = -z common-page-size=0x1000 !endif From 519ccd4d593345d454ffd3f2f68bf909dca62ada Mon Sep 17 00:00:00 2001 From: Deepak5x Singh Date: Wed, 8 Oct 2025 09:41:34 +0530 Subject: [PATCH 0684/1172] SecurityPkg/BuildOptions : Add CLANGPDB DLINK_FLAGS flags to build options [Issue] : There is no DLINK_FLAGS definition for CLANGPDB, leading to potential discrepancies in build alignments [Resolution] : This change adds a CLANGPDB line for DLINK_FLAGS. Maintaining the alignment with existing standards in place for other compiler packages. Signed-off-by: Deepak5x --- SecurityPkg/SecurityPkg.dsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/SecurityPkg/SecurityPkg.dsc b/SecurityPkg/SecurityPkg.dsc index ff481e94b8d3..de2c66facbe4 100644 --- a/SecurityPkg/SecurityPkg.dsc +++ b/SecurityPkg/SecurityPkg.dsc @@ -434,7 +434,8 @@ SecurityPkg/Library/PeilessSecMeasureLib/PeilessSecMeasureLib.inf [BuildOptions] - MSFT:*_*_IA32_DLINK_FLAGS = /ALIGN:256 - MSFT:*_*_IA32_DLINK_XIPFLAGS = /ALIGN:256 + MSFT:*_*_IA32_DLINK_FLAGS = /ALIGN:256 + MSFT:*_*_IA32_DLINK_XIPFLAGS = /ALIGN:256 + CLANGPDB: *_*_IA32_DLINK_FLAGS = /ALIGN:256 INTEL:*_*_IA32_DLINK_FLAGS = /ALIGN:256 *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES From ffa859492aac65af7bc8f0dd39f3c21a894063d7 Mon Sep 17 00:00:00 2001 From: Deepak5x Singh Date: Wed, 8 Oct 2025 09:44:26 +0530 Subject: [PATCH 0685/1172] StandaloneMmPkg/BuildOptions : Add CLANGPDB DLINK_FLAGS to build options [Issue] : There is no DLINK_FLAGS definition for CLANGPDB, leading to potential discrepancies in build alignments [Resolution] : This change adds a CLANGPDB line for DLINK_FLAGS. Maintaining the alignment with existing standards in place for other compiler packages. Signed-off-by: Deepak5x --- StandaloneMmPkg/StandaloneMmPkg.dsc | 1 + 1 file changed, 1 insertion(+) diff --git a/StandaloneMmPkg/StandaloneMmPkg.dsc b/StandaloneMmPkg/StandaloneMmPkg.dsc index a2268c2b0ab5..99d056f92c07 100644 --- a/StandaloneMmPkg/StandaloneMmPkg.dsc +++ b/StandaloneMmPkg/StandaloneMmPkg.dsc @@ -174,3 +174,4 @@ GCC:*_*_*_CC_FLAGS = -mstrict-align [BuildOptions.X64] MSFT:*_*_*_DLINK_FLAGS = /ALIGN:4096 GCC:*_GCC*_*_DLINK_FLAGS = -z common-page-size=0x1000 + CLANGPDB: *_*_*_DLINK_FLAGS = /ALIGN:4096 From e49ec97d1221d83cc06a1142a2f666c5019b1628 Mon Sep 17 00:00:00 2001 From: Deepak5x Singh Date: Wed, 8 Oct 2025 09:46:23 +0530 Subject: [PATCH 0686/1172] OvmfPkg/BuildOptions : Add CLANGPDB DLINK_FLAGS flags to build options [Issue] : There is no DLINK_FLAGS definition for CLANGPDB, leading to potential discrepancies in build alignments [Resolution] : This change adds a CLANGPDB line for DLINK_FLAGS. Maintaining the alignment with existing standards in place for other compiler packages. Signed-off-by: Deepak5x --- OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc | 1 + 1 file changed, 1 insertion(+) diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc index c23130a72dc6..a7c4f842bbaa 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc +++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc @@ -88,6 +88,7 @@ [BuildOptions.common.EDKII.DXE_RUNTIME_DRIVER] GCC: *_*_*_DLINK_FLAGS = -z common-page-size=0x1000 MSFT: *_*_*_DLINK_FLAGS = /ALIGN:4096 + CLANGPDB: *_*_*_DLINK_FLAGS = /ALIGN:4096 ################################################################################ # From aeb27b18cecb44f852a322db77a37d2011de3306 Mon Sep 17 00:00:00 2001 From: Deepak5x Singh Date: Wed, 8 Oct 2025 09:52:11 +0530 Subject: [PATCH 0687/1172] EmulatorPkg/BuildOptions: Add CLANGPDB DLINK_FLAGS flags to build options [Issue] : There is no DLINK_FLAGS definition for CLANGPDB, leading to potential discrepancies in build alignments [Resolution] : This change adds a CLANGPDB line for DLINK_FLAGS. Maintaining the alignment with existing standards in place for other compiler packages. Signed-off-by: Deepak5x --- EmulatorPkg/EmulatorPkg.dsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/EmulatorPkg/EmulatorPkg.dsc b/EmulatorPkg/EmulatorPkg.dsc index 5bba746a02e2..639908acd71e 100644 --- a/EmulatorPkg/EmulatorPkg.dsc +++ b/EmulatorPkg/EmulatorPkg.dsc @@ -539,7 +539,7 @@ # # CLANGPDB tool chain depends on WIN_HOST_BUILD flag to generate the windows application. # - GCC:*_CLANGPDB_*_DLINK_FLAGS = /ALIGN:4096 /FILEALIGN:4096 - GCC:DEBUG_CLANGPDB_*_DLINK_FLAGS = /BASE:0x10000 - GCC:NOOPT_CLANGPDB_*_DLINK_FLAGS = /BASE:0x10000 + CLANGPDB: *_*_*_DLINK_FLAGS = /ALIGN:4096 /FILEALIGN:4096 + CLANGPDB:DEBUG_*_*_DLINK_FLAGS = /BASE:0x10000 + CLANGPDB:NOOPT_*_*_DLINK_FLAGS = /BASE:0x10000 !endif From 0fa57975b054b36a90fb8e56f4377c86e672c885 Mon Sep 17 00:00:00 2001 From: Dongyan Qian Date: Fri, 22 Aug 2025 11:11:16 +0800 Subject: [PATCH 0688/1172] MdePkg: Acpi66: Add defined IOVT Signature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ACPI 6.6 introduced new Virtualization Table for LoongArch. This follow-up will provide configuration for IOMMU. REF: https://uefi.org/sites/default/files/resources/ACPI_Spec_6.6.pdf Table5.6: “IOVT” I/O Virtualization Table. Reported-by: Xianglai Li Signed-off-by: Dongyan Qian --- MdePkg/Include/IndustryStandard/Acpi66.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/MdePkg/Include/IndustryStandard/Acpi66.h b/MdePkg/Include/IndustryStandard/Acpi66.h index b7bc8ea63952..780b72cbb3b1 100644 --- a/MdePkg/Include/IndustryStandard/Acpi66.h +++ b/MdePkg/Include/IndustryStandard/Acpi66.h @@ -3424,6 +3424,11 @@ typedef struct { /// #define EFI_ACPI_6_6_IO_REMAPPING_TABLE_SIGNATURE SIGNATURE_32('I', 'O', 'R', 'T') +/// +/// "IOVT" I/O Virtualization Table +/// +#define EFI_ACPI_6_6_IO_VIRTUALIZATION_TABLE_SIGNATURE SIGNATURE_32('I', 'O', 'V', 'T') + /// /// "IVRS" I/O Virtualization Reporting Structure /// From 174933ebf68e2e5caa516158d515fe3c2d290227 Mon Sep 17 00:00:00 2001 From: Christopher Zurcher Date: Fri, 3 Oct 2025 13:08:03 -0700 Subject: [PATCH 0689/1172] IntelFsp2Pkg/GenCfgOpt.py: Fix line endings in Linux environments Signed-off-by: Christopher Zurcher --- IntelFsp2Pkg/Tools/GenCfgOpt.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/IntelFsp2Pkg/Tools/GenCfgOpt.py b/IntelFsp2Pkg/Tools/GenCfgOpt.py index 79923c07ed20..b14eaa071397 100644 --- a/IntelFsp2Pkg/Tools/GenCfgOpt.py +++ b/IntelFsp2Pkg/Tools/GenCfgOpt.py @@ -976,7 +976,7 @@ def CreateSplitUpdTxt (self, UpdTxtFile): self.Error = 'No DSC file change, skip to create UPD TXT file' return 256 - TxtFd = open(UpdTxtFile, "w") + TxtFd = open(UpdTxtFile, "w", newline="\r\n") TxtFd.write("%s\n" % (__copyright_txt__ % date.today().year)) NextOffset = 0 @@ -1421,16 +1421,16 @@ def CreateHeaderFile (self, InputHeaderFile): for item in range(len(UpdRegionCheck)): if UpdRegionCheck[item] == 'FSPT': - HeaderFd = open(os.path.join(FvDir, HeaderTFileName), "w") + HeaderFd = open(os.path.join(FvDir, HeaderTFileName), "w", newline="\r\n") FileBase = os.path.basename(os.path.join(FvDir, HeaderTFileName)) elif UpdRegionCheck[item] == 'FSPM': - HeaderFd = open(os.path.join(FvDir, HeaderMFileName), "w") + HeaderFd = open(os.path.join(FvDir, HeaderMFileName), "w", newline="\r\n") FileBase = os.path.basename(os.path.join(FvDir, HeaderMFileName)) elif UpdRegionCheck[item] == 'FSPS': - HeaderFd = open(os.path.join(FvDir, HeaderSFileName), "w") + HeaderFd = open(os.path.join(FvDir, HeaderSFileName), "w", newline="\r\n") FileBase = os.path.basename(os.path.join(FvDir, HeaderSFileName)) elif UpdRegionCheck[item] == 'FSPI': - HeaderFd = open(os.path.join(FvDir, HeaderIFileName), "w") + HeaderFd = open(os.path.join(FvDir, HeaderIFileName), "w", newline="\r\n") FileBase = os.path.basename(os.path.join(FvDir, HeaderIFileName)) FileName = FileBase.replace(".", "_").upper() HeaderFd.write("%s\n" % (__copyright_h__ % date.today().year)) @@ -1489,7 +1489,7 @@ def CreateHeaderFile (self, InputHeaderFile): HeaderFd.write("#endif\n") HeaderFd.close() - HeaderFd = open(HeaderFile, "w") + HeaderFd = open(HeaderFile, "w", newline="\r\n") FileBase = os.path.basename(HeaderFile) FileName = FileBase.replace(".", "_").upper() HeaderFd.write("%s\n" % (__copyright_h__ % date.today().year)) @@ -1625,7 +1625,7 @@ def GenerateBsfFile (self, BsfFile): Error = 0 OptionDict = {} - BsfFd = open(BsfFile, "w") + BsfFd = open(BsfFile, "w", newline="\r\n") BsfFd.write("%s\n" % (__copyright_bsf__ % date.today().year)) BsfFd.write("%s\n" % self._GlobalDataDef) BsfFd.write("StructDef\n") From 2241651b17de9a03bb1c3ca92c2ff633ddb14c7e Mon Sep 17 00:00:00 2001 From: Nate DeSimone Date: Fri, 17 Oct 2025 14:39:52 -0700 Subject: [PATCH 0690/1172] BaseTools: Add Quoting to Python Path on Windows Building the C BaseTools using Clang on a Windows system that has the Python interpreter installed to a path that contains spaces (for example C:\Program Files\Python314\python.exe) currently fails. This change adds quoting to fix that issue. Signed-off-by: Nate DeSimone --- BaseTools/Source/C/Makefiles/header.makefile | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/BaseTools/Source/C/Makefiles/header.makefile b/BaseTools/Source/C/Makefiles/header.makefile index 664178f1fb80..53e73abe5335 100644 --- a/BaseTools/Source/C/Makefiles/header.makefile +++ b/BaseTools/Source/C/Makefiles/header.makefile @@ -7,7 +7,7 @@ # Copyright (c) 2007 - 2025, Intel Corporation. All rights reserved.
    # SPDX-License-Identifier: BSD-2-Clause-Patent -# Set SEP to the platform specific path seperator +# Set SEP to the platform specific path separator ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) SHELL := cmd.exe SEP:=$(shell echo \) @@ -19,28 +19,29 @@ EDK2_PATH ?= $(MAKEROOT)/../../.. ifndef PYTHON_COMMAND ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) # - # Try using the Python Launcher for Windows to find an interperter. + # Try using the Python Launcher for Windows to find an interpreter. # CHECK_PY := $(shell where py.exe || echo NotFound) ifeq ($(CHECK_PY),NotFound) # - # PYTHON_HOME is the old method of specifying a Python interperter on Windows. - # Check if an interperter can be found using PYTHON_HOME. + # PYTHON_HOME is the old method of specifying a Python interpreter on Windows. + # Check if an interpreter can be found using PYTHON_HOME. # ifdef PYTHON_HOME ifndef (,$(wildcard $(PYTHON_HOME)$(SEP)python.exe)) # Make sure the file exists PYTHON_COMMAND := $(PYTHON_HOME)$(SEP)python.exe else - $(error Unable to find a Python interperter, if one is installed, set the PYTHON_COMMAND environment variable!) + $(error Unable to find a Python interpreter, if one is installed, set the PYTHON_COMMAND environment variable!) endif endif else PYTHON_COMMAND := $(shell py -3 -c "import sys; print(sys.executable)") ifdef (,$(wildcard $(PYTHON_COMMAND))) # Make sure the file exists - $(error Unable to find a Python interperter, if one is installed, set the PYTHON_COMMAND environment variable!) + $(error Unable to find a Python interpreter, if one is installed, set the PYTHON_COMMAND environment variable!) endif endif undefine CHECK_PY + PYTHON_COMMAND := "$(PYTHON_COMMAND)" else # UNIX PYTHON_COMMAND := $(shell /usr/bin/env python3 -c "import sys; print(sys.executable)") ifdef (,$(wildcard $(PYTHON_COMMAND))) # Make sure the file exists From e494b25fe37db164296e711e0a9a2c82fe92740a Mon Sep 17 00:00:00 2001 From: Ashraf Ali S Date: Mon, 13 Oct 2025 10:16:09 +0530 Subject: [PATCH 0691/1172] BaseTools:Remove deprecated ast.Str import for Python 3.14 compatibility - Str is not being used in FvHeader.py - Removed import of ast.Str as it was removed in Python 3.14. - Ensures compatibility with Python 3.14 and later. - https://docs.python.org/3/whatsnew/3.14.html#id9 This addresses ImportError caused by removal of deprecated AST classes including ast.Str. Signed-off-by: Ashraf Ali S --- BaseTools/Source/Python/FirmwareStorageFormat/FvHeader.py | 1 - 1 file changed, 1 deletion(-) diff --git a/BaseTools/Source/Python/FirmwareStorageFormat/FvHeader.py b/BaseTools/Source/Python/FirmwareStorageFormat/FvHeader.py index 078beda9e5c1..35cd5b63698e 100644 --- a/BaseTools/Source/Python/FirmwareStorageFormat/FvHeader.py +++ b/BaseTools/Source/Python/FirmwareStorageFormat/FvHeader.py @@ -4,7 +4,6 @@ # Copyright (c) 2021-, Intel Corporation. All rights reserved.
    # SPDX-License-Identifier: BSD-2-Clause-Patent ## -from ast import Str from struct import * from ctypes import * from FirmwareStorageFormat.Common import * From db4d32390911e393033d69b0d0dfbfa3e8c0f1f7 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Wed, 8 Oct 2025 10:41:20 -0700 Subject: [PATCH 0692/1172] UefiCpuPkg/PeiMpLib: Only allocate ACPI NVS AP loop code buffer on S3 This commit allocated an ACPI NVS buffer in PEI: https://github.com/tianocore/edk2/commit/cdc1a88272237149003d1d1ea301d320f7b3bdf6 This is a RT visible memory type that remains fragmented against the overall `EfiACPIMemoryNVS` memory bucket allocated by the DXE Core. Signed-off-by: Michael Kubacki --- UefiCpuPkg/Library/MpInitLib/PeiMpLib.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c index 443508f9c837..e11dc7600894 100644 --- a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c @@ -439,11 +439,24 @@ InitMpGlobalData ( IN CPU_MP_DATA *CpuMpData ) { - EFI_STATUS Status; + EFI_STATUS Status; + EFI_BOOT_MODE BootMode; BuildMicrocodeCacheHob (CpuMpData); SaveCpuMpData (CpuMpData); - PrepareApLoopCode (CpuMpData); + + Status = PeiServicesGetBootMode (&BootMode); + ASSERT_EFI_ERROR (Status); + + if (!EFI_ERROR (Status) && (BootMode == BOOT_ON_S3_RESUME)) { + // + // Only allocate the AP loop code buffer on S3 resume. + // This allocates ACPI NVS memory which is a RT visible memory type that + // remains fragmented against the overall EfiACPIMemoryNVS memory bucket + // allocated by the DXE Core. + // + PrepareApLoopCode (CpuMpData); + } /// /// Install Notify From 47dc9e310be9e8a585b2ae99b7da4b6596b5bab3 Mon Sep 17 00:00:00 2001 From: Hongbin1 Zhang Date: Fri, 10 Oct 2025 20:42:37 +0800 Subject: [PATCH 0693/1172] IntelFsp2Pkg: Update GenYamlCfg script Update GenYamlScript to generate FSP-T/M/S/I UPD header file And generate FSP-T/M/S/I UPD configuration binaries. Signed-off-by: Hongbin1 Zhang Cc: Ray Ni Cc: Star Zeng Cc: Chasel Chiu Cc: Nate DeSimone Cc: Ted Kuo Cc: Ashraf Ali S --- IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py | 59 +++++++++---------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py b/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py index 3b1f0991252e..489120bcf08c 100644 --- a/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py +++ b/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py @@ -167,7 +167,7 @@ def visit_Name(self, node): return self._namespace[node.id] def visit_Num(self, node): - return node.n + return node.value def visit_NameConstant(self, node): return node.value @@ -624,6 +624,8 @@ class CGenYamlCfg: builtin_option = {'$EN_DIS': [('0', 'Disable'), ('1', 'Enable')]} exclude_struct = ['FSP_UPD_HEADER', 'FSPT_ARCH_UPD', 'FSPM_ARCH_UPD', 'FSPS_ARCH_UPD', + 'FSPI_ARCH_UPD', 'FSPT_ARCH2_UPD', + 'FSPM_ARCH2_UPD', 'FSPS_ARCH2_UPD', 'GPIO_GPP_*', 'GPIO_CFG_DATA', 'GpioConfPad*', 'GpioPinConfig', 'BOOT_OPTION*', 'PLATFORMID_CFG_DATA', '\\w+_Half[01]'] @@ -730,7 +732,11 @@ def format_struct_field_name(input, count=0): if count > 1: name = '%s[%d]' % (name, count) - + # + # FSP[T/M/S]_ARCH2_UPD struct field name is Fsp[t/m/s]Arch2Upd, + # it should change to Fsp[t/m/s]ArchUpd for code compatibility. + # + name = re.sub(r'(Fsp[tms]Arch)2Upd', r'\1Upd', name) return name def get_mode(self): @@ -1597,7 +1603,7 @@ def detect_fsp(self): if len(cfg_segs) == 3: fsp = True for idx, seg in enumerate(cfg_segs): - if not seg[0].endswith('UPD_%s' % 'TMS'[idx]): + if not seg[0].endswith('UPD_%s' % 'TMSI'[idx]): fsp = False break else: @@ -1894,7 +1900,7 @@ def generate_yml_file(self, in_file, out_file): def write_cfg_header_file(self, hdr_file_name, tag_mode, tag_dict, struct_list): lines = [] - lines.append('\n\n') + lines.append ('\n') if self.get_mode() == 'FSP': lines.append('#include \n') @@ -1906,15 +1912,14 @@ def write_cfg_header_file(self, hdr_file_name, tag_mode, continue lines.append('#define %-30s 0x%03X\n' % ( 'CDATA_%s_TAG' % tagname[:-9], tagval)) - lines.append('\n\n') - + lines.append ('\n#pragma pack(1)\n') name_dict = {} new_dict = {} for each in struct_list: if (tag_mode == 0 and each['tag'] >= 0x100) or \ (tag_mode == 1 and each['tag'] < 0x100): continue - new_dict[each['name']] = (each['alias'], each['count']) + new_dict[each['name']] = (each['alias'], each['count'], each['exclude']) if each['alias'] not in name_dict: name_dict[each['alias']] = 1 lines.extend(self.create_struct(each['alias'], @@ -1932,12 +1937,8 @@ def write_header_file(self, txt_body, file_name, type='h'): lines = [] lines.append("%s\n" % get_copyright_header(type)) lines.append("#ifndef __%s__\n" % file_name_def) - lines.append("#define __%s__\n\n" % file_name_def) - if type == 'h': - lines.append("#pragma pack(1)\n\n") + lines.append ("#define __%s__\n" % file_name_def) lines.extend(txt_body) - if type == 'h': - lines.append("#pragma pack()\n\n") lines.append("#endif\n") # Don't rewrite if the contents are the same @@ -2070,8 +2071,8 @@ def create_field(self, item, name, length, offset, struct, bsf_name, help, option, bits_length=None): pos_name = 28 name_line = '' - # help_line = '' - # option_line = '' + help_line='' + option_line='' if length == 0 and name == 'dummy': return '\n' @@ -2115,11 +2116,11 @@ def create_field(self, item, name, length, offset, struct, else: name_line = "N/A\n" - # if help != '': - # help_line = self.process_multilines(help, 80) + if help != '': + help_line = self.process_multilines(help, 80) - # if option != '': - # option_line = self.process_multilines(option, 80) + if option != '': + option_line = self.process_multilines(option, 80) if offset is None: offset_str = '????' @@ -2131,11 +2132,7 @@ def create_field(self, item, name, length, offset, struct, else: bits_length = ' : %d' % bits_length - # return "\n/** %s%s%s**/\n %s%s%s%s;\n" % (name_line, help_line, - # option_line, type, ' ' * space1, name, bits_length) - return "\n /* Offset %s: %s */\n %s%s%s%s;\n" % ( - offset_str, name_line.strip(), type, ' ' * space1, - name, bits_length) + return "\n/** %s%s%s**/\n %s%s%s%s;\n" % (name_line, help_line, option_line, type, ' ' * space1, name, bits_length) def create_struct(self, cname, top, struct_dict): index = 0 @@ -2214,7 +2211,7 @@ def create_struct(self, cname, top, struct_dict): prompt = item['name'] help = item['help'] option = item['option'] - line = self.create_field(item, name, length, offset, struct, + line = self.create_field(item, name, length, offset - off_base, struct, prompt, help, option, bit_length) lines.append(' %s' % line) last = struct @@ -2231,7 +2228,7 @@ def write_fsp_sig_header_file(self, hdr_file_name): "#include \n\n" "#pragma pack(1)\n\n") lines = [] - for fsp_comp in 'TMS': + for fsp_comp in 'TMSI': top = self.locate_cfg_item('FSP%s_UPD' % fsp_comp) if not top: raise Exception('Could not find FSP UPD definition !') @@ -2278,7 +2275,7 @@ def _build_header_struct(name, cfgs, level): else: hdr_mode = 1 - if re.match('FSP[TMS]_UPD', path): + if re.match('FSP[TMSI]_UPD', path): hdr_mode |= 0x80 # filter out the items to be built for tags and structures @@ -2292,11 +2289,11 @@ def _build_header_struct(name, cfgs, level): if each not in CGenYamlCfg.include_tag: del tag_dict[each] break - if not match: - struct_list.append({'name': each, 'alias': '', 'count': 0, - 'level': struct_dict[each][0], - 'tag': struct_dict[each][1], - 'node': struct_dict[each][2]}) + struct_list.append({'name': each, 'alias': '', 'count': 0, + 'level': struct_dict[each][0], + 'tag': struct_dict[each][1], + 'node': struct_dict[each][2], + 'exclude': True if match else False}) # sort by level so that the bottom level struct # will be build first to satisfy dependencies From c22d6957f431358dbf2dca3047233949bb292a49 Mon Sep 17 00:00:00 2001 From: George Liao Date: Thu, 9 Oct 2025 14:28:10 +0800 Subject: [PATCH 0694/1172] MdeModulePkg/AcpiTableDxe:Fixed memory corruption issue Clearing wrong memory content after allocated memory for XSDT, which caused AcpiSdtProtocol cannot be installed and unexpected behavior. According to the UEFI spec and commit message of "PCD switch to avoid using ACPI reclaim memory", so need to add this support in the InstallAcpiTableFromAcpiSiliconHob(). 1. Fixed memory corruption issue in the InstallAcpiTableFromAcpiSiliconHob(). 2. Added "PCD switch to avoid using ACPI reclaim memory" support in the InstallAcpiTableFromAcpiSiliconHob(). Signed-off-by: George Liao --- .../Acpi/AcpiTableDxe/AcpiTableProtocol.c | 60 ++++++++++++++----- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c index 56f3c8bc6528..b3ccbd2e0fea 100644 --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c @@ -1,7 +1,7 @@ /** @file ACPI Table Protocol Implementation - Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.
    + Copyright (c) 2006 - 2025, Intel Corporation. All rights reserved.
    Copyright (c) 2016, Linaro Ltd. All rights reserved.
    SPDX-License-Identifier: BSD-2-Clause-Patent @@ -1960,8 +1960,8 @@ InstallAcpiTableFromHob ( **/ EFI_STATUS InstallAcpiTableFromAcpiSiliconHob ( - EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance, - EFI_HOB_GUID_TYPE *GuidHob + IN OUT EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance, + IN EFI_HOB_GUID_TYPE *GuidHob ) { ACPI_SILICON_HOB *AcpiSiliconHob; @@ -1978,6 +1978,8 @@ InstallAcpiTableFromAcpiSiliconHob ( UINT8 *Buffer; EFI_PHYSICAL_ADDRESS PageAddress; UINTN TotalSocTablesize; + UINT8 *Pointer; + EFI_MEMORY_TYPE AcpiAllocateMemoryType; DEBUG ((DEBUG_INFO, "InstallAcpiTableFromAcpiSiliconHob - Start\n")); // @@ -1989,6 +1991,13 @@ InstallAcpiTableFromAcpiSiliconHob ( Status = EFI_SUCCESS; Version = PcdGet32 (PcdAcpiExposedTableVersions); TableKey = 0; + + if (PcdGetBool (PcdNoACPIReclaimMemory)) { + AcpiAllocateMemoryType = EfiACPIMemoryNVS; + } else { + AcpiAllocateMemoryType = EfiACPIReclaimMemory; + } + // // Got RSDP table from ACPI Silicon Hob. // @@ -2018,26 +2027,47 @@ InstallAcpiTableFromAcpiSiliconHob ( // Calcaue 64bit Acpi table number. // NumOfTblEntries = (SiCommonAcpiTable->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof (UINT64); - DEBUG ((DEBUG_ERROR, "64bit NumOfTblEntries : 0x%x\n", NumOfTblEntries)); + DEBUG ((DEBUG_INFO, "64bit NumOfTblEntries : 0x%x\n", NumOfTblEntries)); // // Reserved the ACPI reclaim memory for XSDT. // - // - TotalSocTablesize = sizeof (EFI_ACPI_DESCRIPTION_HEADER) + sizeof (UINT64); - PageAddress = 0xFFFFFFFF; - Status = gBS->AllocatePages ( - mAcpiTableAllocType, - EfiACPIReclaimMemory, - EFI_SIZE_TO_PAGES (TotalSocTablesize), - &PageAddress - ); + TotalSocTablesize = sizeof (EFI_ACPI_DESCRIPTION_HEADER) + (mEfiAcpiMaxNumTables * sizeof (UINT64)); + if (mAcpiTableAllocType != AllocateAnyPages) { + // + // Allocate memory in the lower 32 bit of address range for + // compatibility with ACPI 1.0 OS. + // + // This is done because ACPI 1.0 pointers are 32 bit values. + // ACPI 2.0 OS and all 64 bit OS must use the 64 bit ACPI table addresses. + // There is no architectural reason these should be below 4GB, it is purely + // for convenience of implementation that we force memory below 4GB. + // + PageAddress = 0xFFFFFFFF; + Status = gBS->AllocatePages ( + mAcpiTableAllocType, + AcpiAllocateMemoryType, + EFI_SIZE_TO_PAGES (TotalSocTablesize), + &PageAddress + ); + } else { + Status = gBS->AllocatePool ( + AcpiAllocateMemoryType, + TotalSocTablesize, + (VOID **)&Pointer + ); + } + if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "Fail to allocate EfiACPIReclaimMemory for XSDT. Status : %r\n", Status)); return EFI_OUT_OF_RESOURCES; } - ZeroMem (&PageAddress, TotalSocTablesize); - AcpiTableInstance->Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)PageAddress; + if (mAcpiTableAllocType != AllocateAnyPages) { + Pointer = (UINT8 *)(UINTN)PageAddress; + } + + ZeroMem (Pointer, TotalSocTablesize); + AcpiTableInstance->Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Pointer; // // Initial XSDT table content. From 9f31aa33d8f83d01372750b219cd9960a8aff7a0 Mon Sep 17 00:00:00 2001 From: George Liao Date: Tue, 21 Oct 2025 16:57:38 +0800 Subject: [PATCH 0695/1172] MdeModulePkg:Completed InstallAcpiTableFromAcpiSiliconHob AddTableList Added "PublishTables()" and "SdtNotifyAcpiList()" for completing AddTableToList behavior in the InstallAcpiTableFromAcpiSiliconHob(). Signed-off-by: George Liao --- .../Acpi/AcpiTableDxe/AcpiTableProtocol.c | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c index b3ccbd2e0fea..73425f038dde 100644 --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c @@ -2142,6 +2142,16 @@ InstallAcpiTableFromAcpiSiliconHob ( DEBUG ((DEBUG_ERROR, "InstallAcpiTableFromAcpiSiliconHob: Fail to add ACPI table at 0x%p\n", SocEntryTable)); ASSERT_EFI_ERROR (Status); break; + } else { + Status = PublishTables (AcpiTableInstance, Version); + if (!EFI_ERROR (Status)) { + // + // Add a new table successfully, notify registed callback + // + if (FeaturePcdGet (PcdInstallAcpiSdtProtocol)) { + SdtNotifyAcpiList (AcpiTableInstance, Version, TableKey); + } + } } if (SocEntryTable->Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) { @@ -2164,7 +2174,17 @@ InstallAcpiTableFromAcpiSiliconHob ( ASSERT_EFI_ERROR (Status); break; } else { - DEBUG ((DEBUG_ERROR, "Installed DSDT in the DXE Table list!\n")); + Status = PublishTables (AcpiTableInstance, Version); + if (!EFI_ERROR (Status)) { + // + // Add a new table successfully, notify registed callback + // + if (FeaturePcdGet (PcdInstallAcpiSdtProtocol)) { + SdtNotifyAcpiList (AcpiTableInstance, Version, TableKey); + } + } + + DEBUG ((DEBUG_INFO, "Installed DSDT in the DXE Table list!\n")); } } else { DEBUG ((DEBUG_ERROR, "The DSDT content is not correct, then skip it!\n")); @@ -2186,7 +2206,17 @@ InstallAcpiTableFromAcpiSiliconHob ( ASSERT_EFI_ERROR (Status); break; } else { - DEBUG ((DEBUG_ERROR, "Installed FACS in the DXE Table list!\n")); + Status = PublishTables (AcpiTableInstance, Version); + if (!EFI_ERROR (Status)) { + // + // Add a new table successfully, notify registed callback + // + if (FeaturePcdGet (PcdInstallAcpiSdtProtocol)) { + SdtNotifyAcpiList (AcpiTableInstance, Version, TableKey); + } + } + + DEBUG ((DEBUG_INFO, "Installed FACS in the DXE Table list!\n")); } } else { DEBUG ((DEBUG_ERROR, "The FACS content is not correct, then skip it!\n")); From 44214c0cdf12bf91df9319c5bc90c640b461f252 Mon Sep 17 00:00:00 2001 From: George Liao Date: Tue, 21 Oct 2025 17:03:32 +0800 Subject: [PATCH 0696/1172] MdeModulePkg/AcpiTableDxe:Improving InitializeAcpiTableDxe behavior. Improving InitializeAcpiTableDxe() behavior. Signed-off-by: George Liao --- .../Universal/Acpi/AcpiTableDxe/AcpiTable.c | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTable.c b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTable.c index f50068d0e0fa..dd5bd17ecb6f 100644 --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTable.c +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTable.c @@ -41,11 +41,15 @@ InitializeAcpiTableDxe ( EFI_ACPI_TABLE_INSTANCE *PrivateData; // - // Initialize our protocol + // Initialize ACPI Table instance // PrivateData = AllocateZeroPool (sizeof (EFI_ACPI_TABLE_INSTANCE)); - ASSERT (PrivateData); - PrivateData->Signature = EFI_ACPI_TABLE_SIGNATURE; + if (PrivateData != NULL) { + PrivateData->Signature = EFI_ACPI_TABLE_SIGNATURE; + } else { + ASSERT (PrivateData); + return EFI_OUT_OF_RESOURCES; + } // // Call all constructors per produced protocols @@ -56,24 +60,24 @@ InitializeAcpiTableDxe ( return EFI_LOAD_ERROR; } + mPrivateData = PrivateData; // // Install ACPI Table protocol // if (FeaturePcdGet (PcdInstallAcpiSdtProtocol)) { - mPrivateData = PrivateData; - Status = gBS->InstallMultipleProtocolInterfaces ( - &mHandle, - &gEfiAcpiTableProtocolGuid, - &PrivateData->AcpiTableProtocol, - &gEfiAcpiSdtProtocolGuid, - &mPrivateData->AcpiSdtProtocol, - NULL - ); + Status = gBS->InstallMultipleProtocolInterfaces ( + &mHandle, + &gEfiAcpiTableProtocolGuid, + &mPrivateData->AcpiTableProtocol, + &gEfiAcpiSdtProtocolGuid, + &mPrivateData->AcpiSdtProtocol, + NULL + ); } else { Status = gBS->InstallMultipleProtocolInterfaces ( &mHandle, &gEfiAcpiTableProtocolGuid, - &PrivateData->AcpiTableProtocol, + &mPrivateData->AcpiTableProtocol, NULL ); } From f64b4065b7d36e188a5ac1d90dc4552e69c11660 Mon Sep 17 00:00:00 2001 From: Luigi Leonardi Date: Tue, 23 Sep 2025 06:36:46 -0400 Subject: [PATCH 0697/1172] UefiCpuPkg/CpuDxe: fix page table walk in confidential VM `PageStartAddress` variable was not set correctly because the encryption bit was not considered, which broke the page walk logic. Get the bitmask and mask the encryption bit. Signed-off-by: Luigi Leonardi --- UefiCpuPkg/CpuDxe/CpuPageTable.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/UefiCpuPkg/CpuDxe/CpuPageTable.c b/UefiCpuPkg/CpuDxe/CpuPageTable.c index 9a519bcb7ec0..433316b4de82 100644 --- a/UefiCpuPkg/CpuDxe/CpuPageTable.c +++ b/UefiCpuPkg/CpuDxe/CpuPageTable.c @@ -975,6 +975,7 @@ RefreshGcdMemoryAttributesFromPaging ( UINT64 Capabilities; UINT64 NewAttributes; UINTN Index; + UINT64 AddressEncMask; // // Assuming that memory space map returned is sorted already; otherwise sort @@ -1055,10 +1056,18 @@ RefreshGcdMemoryAttributesFromPaging ( break; } + // + // Get the mask for the memory encryption bit for Tdx and Sev + // + AddressEncMask = PcdGet64 (PcdPteMemoryEncryptionAddressOrMask); + if (AddressEncMask == 0) { + AddressEncMask = PcdGet64 (PcdTdxSharedBitMask); + } + // // Note current memory space might start in the middle of a page // - PageStartAddress = (*PageEntry) & (UINT64)PageAttributeToMask (PageAttribute); + PageStartAddress = (*PageEntry) & (UINT64)PageAttributeToMask (PageAttribute) & ~AddressEncMask; PageLength = PageAttributeToLength (PageAttribute) - (BaseAddress - PageStartAddress); Attributes = GetAttributesFromPageEntry (PageEntry); } From e67f405713f0cc1e8c4cb266bf9cd11a89ff162f Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Fri, 26 Sep 2025 09:43:44 -0700 Subject: [PATCH 0698/1172] UefiCpuPkg: Always Initialize Separate AP Exception Stacks Today, CpuMpPei and CpuDxe only initialize separate exception stacks for the APs when PcdCpuStackGuard is enabled so that if a stack overflow occurs, hitting the guard page, the exception can be handler with a separate stack. However, this operation also creates a separate GDT for each AP. This is a safer option than all APs sharing the BSP's GDT because there are issues with concurrent access to the structures contained within. Furthermore, even when a stack guard page is not present, stack overflows can still occur and corrupt the stack; if an exception is taken here, it is still valuable to have a separate exception stack for sanity. This commit updates CpuMpPei and CpuDxe to always create separate exception stacks for the APs (and therefore separate GDTs). Signed-off-by: Oliver Smith-Denny --- UefiCpuPkg/CpuDxe/CpuDxe.inf | 1 - UefiCpuPkg/CpuDxe/CpuMp.c | 6 ++---- UefiCpuPkg/CpuMpPei/CpuMpPei.c | 7 ++----- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/UefiCpuPkg/CpuDxe/CpuDxe.inf b/UefiCpuPkg/CpuDxe/CpuDxe.inf index b2954ba23446..7d38840e22de 100644 --- a/UefiCpuPkg/CpuDxe/CpuDxe.inf +++ b/UefiCpuPkg/CpuDxe/CpuDxe.inf @@ -89,7 +89,6 @@ [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask ## CONSUMES - gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdHeapGuardPropertyMask ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdNullPointerDetectionPropertyMask ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdTdxSharedBitMask ## CONSUMES diff --git a/UefiCpuPkg/CpuDxe/CpuMp.c b/UefiCpuPkg/CpuDxe/CpuMp.c index b5478ff7c458..f865a06b2a9e 100644 --- a/UefiCpuPkg/CpuDxe/CpuMp.c +++ b/UefiCpuPkg/CpuDxe/CpuMp.c @@ -761,11 +761,9 @@ InitializeMpExceptionHandlers ( } // - // Setup stack switch for Stack Guard feature. + // Setup stack switch for Stack Guard feature and separate AP GDTs. // - if (PcdGetBool (PcdCpuStackGuard)) { - InitializeMpExceptionStackSwitchHandlers (); - } + InitializeMpExceptionStackSwitchHandlers (); } /** diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.c b/UefiCpuPkg/CpuMpPei/CpuMpPei.c index ad0a715b804b..ed10a1b2df4b 100644 --- a/UefiCpuPkg/CpuMpPei/CpuMpPei.c +++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.c @@ -68,7 +68,8 @@ InitializeExceptionStackSwitchHandlers ( } /** - Initializes MP exceptions handlers for the sake of stack switch requirement. + Initializes MP exceptions handlers for the sake of stack switch requirement and giving the APs + their own GDTs. This function will allocate required resources required to setup stack switch and pass them through SwitchStackData to each logic processor. @@ -86,10 +87,6 @@ InitializeMpExceptionStackSwitchHandlers ( EFI_STATUS Status; UINT8 *Buffer; - if (!PcdGetBool (PcdCpuStackGuard)) { - return; - } - Status = MpInitLibGetNumberOfProcessors (&NumberOfProcessors, NULL); ASSERT_EFI_ERROR (Status); From 34cd1aca46b9d2fec67f3f25c9457fc6179c09ed Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Fri, 26 Sep 2025 09:58:53 -0700 Subject: [PATCH 0699/1172] UefiCpuPkg: MpInitLib: Fix Task Register Race Condition GP Fault TR is used to enable a separate safe stack when a stack overflow occurs. When PEI starts up the APs, TR is non-zero and so each processor has its own GDT. TR is an offset into the GDT and so points to a different TSS entry in each AP. There is a small window in early DXE after MpInitLibInitialize() is called where: - TR is non-zero because it has been inherited from the PEI phase - TR is not restored to 0 - The APs are all switched to using the BSP's GDT - SaveVolatileRegisters() is called from ApWakeupFunction() before the APs go to sleep, which saves the non-zero TR value to CpuMpData->CpuData[].VolatileRegisters.Tr, cause TR to point to the same TSS entry in the BSP's GDT - The next time the APs are woken up, RestoreVolatileRegisters() is called from ApWakeupFunction() which would attempt to load the non-zero TR value into the actual task register, which creates a race condition to a #GP fault because loading the task register sets the busy bit in the TSS descriptor and a #GP fault occurs if the busy bit is already set when loading the task register. To avoid this issue, the task register is only loaded if TR is non-zero and the TSS descriptor is valid and not busy. HW sets the busy bit and does not clear it. edk2 does not clear the busy bit, so the BSP's TSS descriptor will be marked busy forever and the APs will not load the task register until they have their own GDT/TSS set up. Co-authored-by: Ray Ni Signed-off-by: Oliver Smith-Denny --- UefiCpuPkg/Library/MpInitLib/MpLib.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c index 2cf91bff690b..426d998b9a47 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -278,8 +278,30 @@ RestoreVolatileRegisters ( { Tss = (IA32_TSS_DESCRIPTOR *)(VolatileRegisters->Gdtr.Base + VolatileRegisters->Tr); - if (Tss->Bits.P == 1) { - Tss->Bits.Type &= 0xD; // 1101 - Clear busy bit just in case + + if ((Tss->Bits.P == 1) && ((Tss->Bits.Type & BIT1) == 0)) { + // TR is used to enable a separate safe stack when a stack overflow occurs. + // When PEI starts up the APs, TR is non-zero and so each processor has its + // own GDT. TR is an offset into the GDT and so points to a different TSS entry + // in each AP. + // There is a small window in early DXE after MpInitLibInitialize() is called + // where: + // - TR is non-zero because it has been inherited from the PEI phase + // - TR is not restored to 0 + // - The APs are all switched to using the BSP's GDT + // - SaveVolatileRegisters() is called from ApWakeupFunction() before the APs + // go to sleep, which saves the non-zero TR value to CpuMpData->CpuData[].VolatileRegisters.Tr, + // cause TR to point to the same TSS entry in the BSP's GDT + // - The next time the APs are woken up, RestoreVolatileRegisters() is called + // from ApWakeupFunction() which would attempt to load the non-zero TR value into the actual + // task register, which creates a race condition to a #GP fault because loading the task + // register sets the busy bit in the TSS descriptor and a #GP fault occurs if the busy bit + // is already set when loading the task register. + // + // To avoid this issue, the task register is only loaded if TR is non-zero and the + // TSS descriptor is valid and not busy. HW sets the busy bit and does not clear it. edk2 does + // not clear the busy bit, so the BSP's TSS descriptor will be marked busy forever and the APs + // will not load the task register until they have their own GDT/TSS set up. AsmWriteTr (VolatileRegisters->Tr); } } From 1d6f2f0d8d4fb967df4a54d0734f1c4cee32bf88 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Wed, 22 Oct 2025 08:47:33 -0700 Subject: [PATCH 0700/1172] MdeModulePkg: CpuExceptionHandlerLibNull: Return Success On Null Func Currently, CpuExceptionHandlerLibNull returns EFI_UNSUPPORTED for InitializeSeparateExceptionStacks. However, CpuMpPei, CpuDxe, and DXE Core are all moving to call this function unconditionally and expect it returns success. As such, the null lib is updated to return success. This fixes a hang on EmulatorPkg where DXE Core asserts if this function returns an error. Signed-off-by: Oliver Smith-Denny --- .../CpuExceptionHandlerLibNull/CpuExceptionHandlerLibNull.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MdeModulePkg/Library/CpuExceptionHandlerLibNull/CpuExceptionHandlerLibNull.c b/MdeModulePkg/Library/CpuExceptionHandlerLibNull/CpuExceptionHandlerLibNull.c index 74908a379beb..8cc31bd51c40 100644 --- a/MdeModulePkg/Library/CpuExceptionHandlerLibNull/CpuExceptionHandlerLibNull.c +++ b/MdeModulePkg/Library/CpuExceptionHandlerLibNull/CpuExceptionHandlerLibNull.c @@ -102,5 +102,5 @@ InitializeSeparateExceptionStacks ( IN OUT UINTN *BufferSize ) { - return EFI_UNSUPPORTED; + return EFI_SUCCESS; } From cec2c6bbccf7b529266884dbef25ad212bf167d5 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Sun, 19 Oct 2025 20:18:54 -0700 Subject: [PATCH 0701/1172] MdeModulePkg: Always Initialize Separate Exception Stacks Following the APs now always initializing separate exception stacks, this commit always initializes a separate exception stack for the BSP as well. Previously, this was only enabled when PcdCpuStackGuard was set. However, even when a stack guard page is not present, stack overflows can still occur and corrupt the stack; if an exception is taken here, it is still valuable to have a separate exception stack for sanity. Signed-off-by: Oliver Smith-Denny --- MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c b/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c index 50ab5fb844c6..e7b3d0be8465 100644 --- a/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c +++ b/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c @@ -259,12 +259,10 @@ DxeMain ( ASSERT_EFI_ERROR (Status); // - // Setup Stack Guard + // Setup Exception Stack // - if (PcdGetBool (PcdCpuStackGuard)) { - Status = InitializeSeparateExceptionStacks (NULL, NULL); - ASSERT_EFI_ERROR (Status); - } + Status = InitializeSeparateExceptionStacks (NULL, NULL); + ASSERT_EFI_ERROR (Status); // // Initialize Debug Agent to support source level debug in DXE phase From 0a3d688b1b35023414328ec4a711d30f7c424b54 Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Thu, 7 Aug 2025 09:53:43 +0000 Subject: [PATCH 0702/1172] DynamicTablesPkg: Enhance X64 PCIe SSDT _CRS generation X64 platforms supports WordIo and uncached PCIe resources. Hence, include WordIo and uncached PCIe resources in _CRS. Signed-off-by: Abdul Lateef Attar --- .../Include/ArchCommonNameSpaceObjects.h | 5 ++ .../AcpiSsdtPcieLib/SsdtPcieGenerator.c | 71 +++++++++++++++++++ .../AcpiSsdtPcieLib/SsdtPcieGenerator.h | 7 ++ 3 files changed, 83 insertions(+) diff --git a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h index 7cf73947074c..c47a8467cb4c 100644 --- a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h +++ b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h @@ -200,6 +200,11 @@ typedef struct CmArchCommonPciAddressMapInfo { - 1: I/O Space - 2: 32-bit-address Memory Space - 3: 64-bit-address Memory Space + + Custom values: + - 4: Word I/O Space + - 5: 32-bit-address uncache Memory Space + - 6: 64-bit-address uncache Memory Space */ UINT8 SpaceCode; diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.c index 7fe780d27ea3..c8f7137338c6 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.c +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.c @@ -2,6 +2,7 @@ SSDT Pcie Table Generator. Copyright (c) 2021 - 2022, Arm Limited. All rights reserved.
    + Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent @@ -608,7 +609,77 @@ GeneratePciCrs ( NULL ); break; + case PCI_SS_IO_WORD: + ASSERT ((AddrMapInfo->PciAddress & ~MAX_UINT16) == 0); + ASSERT (((AddrMapInfo->PciAddress + AddrMapInfo->AddressSize - 1) & ~MAX_UINT16) == 0); + ASSERT (((Translation ? AddrMapInfo->CpuAddress - AddrMapInfo->PciAddress : 0) & ~MAX_UINT16) == 0); + ASSERT ((AddrMapInfo->AddressSize & ~MAX_UINT16) == 0); + Status = AmlCodeGenRdWordIo ( + FALSE, + TRUE, + TRUE, + IsPosDecode, + 3, + 0, + AddrMapInfo->PciAddress & MAX_UINT16, + (AddrMapInfo->PciAddress + AddrMapInfo->AddressSize - 1) & MAX_UINT16, + (Translation ? AddrMapInfo->CpuAddress - AddrMapInfo->PciAddress : 0) & MAX_UINT16, + AddrMapInfo->AddressSize & MAX_UINT16, + 0, + NULL, + TRUE, + FALSE, + CrsNode, + NULL + ); + break; + case PCI_SS_M32_UC: + ASSERT ((AddrMapInfo->PciAddress & ~MAX_UINT32) == 0); + ASSERT (((AddrMapInfo->PciAddress + AddrMapInfo->AddressSize - 1) & ~MAX_UINT32) == 0); + ASSERT (((Translation ? AddrMapInfo->CpuAddress - AddrMapInfo->PciAddress : 0) & ~MAX_UINT32) == 0); + ASSERT ((AddrMapInfo->AddressSize & ~MAX_UINT32) == 0); + Status = AmlCodeGenRdDWordMemory ( + FALSE, + IsPosDecode, + TRUE, + TRUE, + AmlMemoryNonCacheable, + TRUE, + 0, + (UINT32)(AddrMapInfo->PciAddress), + (UINT32)(AddrMapInfo->PciAddress + AddrMapInfo->AddressSize - 1), + (UINT32)(Translation ? AddrMapInfo->CpuAddress - AddrMapInfo->PciAddress : 0), + (UINT32)(AddrMapInfo->AddressSize), + 0, + NULL, + AmlAddressRangeMemory, + TRUE, + CrsNode, + NULL + ); + break; + case PCI_SS_M64_UC: + Status = AmlCodeGenRdQWordMemory ( + FALSE, + IsPosDecode, + TRUE, + TRUE, + AmlMemoryNonCacheable, + TRUE, + 0, + AddrMapInfo->PciAddress, + AddrMapInfo->PciAddress + AddrMapInfo->AddressSize - 1, + Translation ? AddrMapInfo->CpuAddress - AddrMapInfo->PciAddress : 0, + AddrMapInfo->AddressSize, + 0, + NULL, + AmlAddressRangeMemory, + TRUE, + CrsNode, + NULL + ); + break; default: Status = EFI_INVALID_PARAMETER; } // switch diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.h b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.h index 7410f9ffd4a4..953fa11df2b2 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.h +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.h @@ -2,6 +2,8 @@ SSDT Pcie Table Generator. Copyright (c) 2021, Arm Limited. All rights reserved.
    + Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent @par Reference(s): @@ -25,6 +27,11 @@ #define PCI_SS_M32 2 #define PCI_SS_M64 3 +/* Custom values. */ +#define PCI_SS_IO_WORD 4 +#define PCI_SS_M32_UC 5 +#define PCI_SS_M64_UC 6 + /** Maximum Pci root complexes supported by this generator. Note: This is not a hard limitation and can be extended if needed. From 76c5005ce8506a3c6756e85d74ee72e707d7ca0c Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Tue, 19 Aug 2025 13:46:51 +0000 Subject: [PATCH 0703/1172] DynamicTablesPkg: Add X64 libraries to meta files - Adds AcpiMcfgLib library to X64 DynamicTableFactoryDxe - Adds AcpiSpcrLib library to X64 DynamicTableFactoryDxe - Adds AcpiSsdtPcieLib library to X64 DynamicTableFactoryDxe - Rearrage the libraries in alphabetical order Signed-off-by: Abdul Lateef Attar --- DynamicTablesPkg/DynamicTables.dsc.inc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc index e407592a0a73..5d1649f6530f 100644 --- a/DynamicTablesPkg/DynamicTables.dsc.inc +++ b/DynamicTablesPkg/DynamicTables.dsc.inc @@ -79,9 +79,11 @@ # Common NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiCedtLib/AcpiCedtLib.inf NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiFadtLib/AcpiFadtLib.inf - NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf + NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiMcfgLib/AcpiMcfgLib.inf NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSlitLib/AcpiSlitLib.inf + NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSpcrLib/AcpiSpcrLib.inf NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSpmiLib/AcpiSpmiLib.inf + NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf # X64 specific NULL|DynamicTablesPkg/Library/Acpi/X64/AcpiFacsLib/AcpiFacsLib.inf NULL|DynamicTablesPkg/Library/Acpi/X64/AcpiHpetLib/AcpiHpetLib.inf @@ -90,6 +92,7 @@ # AML Codegen # Common NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf + NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieLib.inf # X64 specific NULL|DynamicTablesPkg/Library/Acpi/X64/AcpiSsdtHpetLib/AcpiSsdtHpetLib.inf } From 8366881b064c6dd259af196cb8182c3855ae4fdd Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Fri, 17 Oct 2025 13:41:45 +0000 Subject: [PATCH 0704/1172] DynamicTablesPkg: Add PCIe root port namespace object Introduce new architecture common namespace object for PCIe root ports in the DynamicTables package. This object holds information: - PCIe root port address in device and function format - Reference token information to the PCIe routing table object - Slot number information for the root port Also updates ConfigurationManagerObjectParser to parse the new object and populate the relevant fields. Signed-off-by: Abdul Lateef Attar --- .../Include/ArchCommonNameSpaceObjects.h | 22 +++++++++++++++++++ .../ConfigurationManagerObjectParser.c | 9 ++++++++ 2 files changed, 31 insertions(+) diff --git a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h index c47a8467cb4c..fa0a386219ef 100644 --- a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h +++ b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h @@ -73,6 +73,7 @@ typedef enum ArchCommonObjectID { EArchCommonObjSpcrInfo, ///< 45 - Serial Terminal and Interrupt Info EArchCommonObjTpm2DeviceInfo, ///< 46 - TPM2 Device Info EArchCommonObjMcfgPciConfigSpaceInfo, ///< 47 - MCFG PCI Configuration Space Info + EArchCommonObjPciRootPortInfo, ///< 48 - PCI root port configuration Info EArchCommonObjMax } EARCH_COMMON_OBJECT_ID; @@ -270,6 +271,27 @@ typedef struct CmArchCommonPciInterruptMapInfo { CM_ARCH_COMMON_GENERIC_INTERRUPT IntcInterrupt; } CM_ARCH_COMMON_PCI_INTERRUPT_MAP_INFO; +/** A structure that describes PCI root port information. + Contains the interrupt map and Slot user name. + + ID: EArchCommonObjPciRootPortInfo +*/ +typedef struct CmArchCommonObjPciRootPortInfo { + /// Address of root port + /// 6.1.1 _ADR (Address) + /// High word-Device #, Low word-Function #. (for example, device 3, function + /// 2 is 0x00030002). To refer to all the functions on a device #, use a function + /// number of FFFF). + UINT32 RootPortAddress; + + /// Token for an array of CM_ARCH_COMMON_PCI_INTERRUPT_MAP_INFO objects. + CM_OBJECT_TOKEN RootPortPrtToken; + + /// 6.1.11 _SUN (Slot User Number) + /// integer value, 0xFFFFFFFF means no slot user number + UINT32 Sun; +} CM_ARCH_COMMON_PCI_ROOT_PORT_INFO; + /** A structure that describes the Memory Affinity Structure (Type 1) in SRAT ID: EArchCommonObjMemoryAffinityInfo diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c index 2ca1b1452ea8..ec12885855a2 100644 --- a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c +++ b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c @@ -882,6 +882,14 @@ STATIC CONST CM_OBJ_PARSER CmArchCommonObjSpcrInfoParser[] = { { "TerminalType", 1, "0x%x", NULL } }; +/** A parser for EArchCommonObjPciRootPortInfo +*/ +STATIC CONST CM_OBJ_PARSER CmArchCommonObjPciRootPortInfoParser[] = { + { "RootPortAddress", 4, "0x%x", NULL }, + { "RootPortPrtToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, + { "Sun", 4, "0x%x", NULL } +}; + /** A parser for Arch Common namespace objects. */ STATIC CONST CM_OBJ_PARSER_ARRAY ArchCommonNamespaceObjectParser[] = { @@ -932,6 +940,7 @@ STATIC CONST CM_OBJ_PARSER_ARRAY ArchCommonNamespaceObjectParser[] = { CM_PARSER_ADD_OBJECT (EArchCommonObjMemoryCacheInfo, CmArchCommonMemoryCacheInfo), CM_PARSER_ADD_OBJECT (EArchCommonObjSpcrInfo, CmArchCommonObjSpcrInfoParser), CM_PARSER_ADD_OBJECT (EArchCommonObjMcfgPciConfigSpaceInfo, CmArchCommonPciConfigSpaceInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjPciRootPortInfo, CmArchCommonObjPciRootPortInfoParser), CM_PARSER_ADD_OBJECT_RESERVED (EArchCommonObjMax) }; From 01d4c1d51ccd09f810d663ece1e21df00e9e5843 Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Fri, 17 Oct 2025 13:57:24 +0000 Subject: [PATCH 0705/1172] DynamicTablesPkg: Update PCIe config space object Adds RootPortInfoToken to PCIe config space object to support addition of root port devices in PCIE SSDT. Updates the ConfigurationManagerObjectParser to include the new token. Signed-off-by: Abdul Lateef Attar --- DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h | 4 ++++ .../Common/TableHelperLib/ConfigurationManagerObjectParser.c | 1 + 2 files changed, 5 insertions(+) diff --git a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h index fa0a386219ef..b10550ca5110 100644 --- a/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h +++ b/DynamicTablesPkg/Include/ArchCommonNameSpaceObjects.h @@ -185,6 +185,10 @@ typedef struct CmArchCommonPciConfigSpaceInfo { /// Optional field: Reference Token for interrupt mapping. /// Token identifying a CM_ARCH_COMMON_OBJ_REF structure. CM_OBJECT_TOKEN InterruptMapToken; + + /// Optional field: Reference Token for PCI root bridge information. + /// Token identifying a CM_ARCH_COMMON_PCI_ROOT_PORT_INFO structure. + CM_OBJECT_TOKEN RootPortInfoToken; } CM_ARCH_COMMON_PCI_CONFIG_SPACE_INFO; /** A structure that describes a PCI Address Map. diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c index ec12885855a2..055a8ca884a2 100644 --- a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c +++ b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c @@ -194,6 +194,7 @@ STATIC CONST CM_OBJ_PARSER CmArchCommonPciConfigSpaceInfoParser[] = { { "EndBusNumber", 1, "0x%x", NULL }, { "AddressMapToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, { "InterruptMapToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, + { "RootPortInfoToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL } }; /** A parser for EArchCommonObjHypervisorVendorIdentity. From e29efd220d58053cedcaf342933998bd560be2de Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Sun, 28 Sep 2025 05:36:35 +0000 Subject: [PATCH 0706/1172] DynamicTablesPkg: PCIE SSDT Add root port devices This change introduces support for root port devices and their corresponding _PRT (PCI Routing Table) entries in the PCIe SSDT. Updates the PCIe SSDT generator to detect and use the root port token. When available, the generator reads the configuration and creates device entries with appropriate _PRT tables. Signed-off-by: Abdul Lateef Attar --- .../AcpiSsdtPcieLib/SsdtPcieGenerator.c | 244 ++++++++++++++++++ 1 file changed, 244 insertions(+) diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.c index c8f7137338c6..280a1001bd7f 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.c +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.c @@ -37,6 +37,7 @@ #define PCI_MAX_DEVICE_COUNT_PER_BUS 32 #define PCI_MAX_FUNCTION_COUNT_PER_DEVICE 8 +#define PCI_MAX_PCI_INTERRUPT_PIN_VALUE 3 /** ARM standard SSDT Pcie Table Generator. @@ -47,6 +48,7 @@ - EArchCommonObjPciConfigSpaceInfo - EArchCommonObjPciAddressMapInfo - EArchCommonObjPciInterruptMapInfo + - EArchCommonObjPciRootPortInfo (OPTIONAL) */ /** This macro expands to a function that retrieves the cross-CM-object- @@ -85,6 +87,15 @@ GET_OBJECT_LIST ( CM_ARCH_COMMON_PCI_INTERRUPT_MAP_INFO ); +/** This macro expands to a function that retrieves the Root Port + Information from the Configuration Manager. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceArchCommon, + EArchCommonObjPciRootPortInfo, + CM_ARCH_COMMON_PCI_ROOT_PORT_INFO + ); + /** Initialize the MappingTable. @param [in] MappingTable The mapping table structure. @@ -434,6 +445,226 @@ GeneratePrt ( return Status; } +/** Generate a root port device objects. + + Cf. ACPI 6.4 specification, s6.2.13 "_PRT (PCI Routing Table)" + + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol interface. + @param [in] PciInfo Pci device information. + @param [in, out] PciNode Pci node to amend. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. +**/ +STATIC +EFI_STATUS +EFIAPI +GenerateRootPortDevices ( + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN CONST CM_ARCH_COMMON_PCI_CONFIG_SPACE_INFO *PciInfo, + IN OUT AML_OBJECT_NODE_HANDLE PciNode + ) +{ + AML_OBJECT_NODE_HANDLE DeviceNode; + AML_OBJECT_NODE_HANDLE PrtNode; + CHAR8 AslName[AML_NAME_SEG_SIZE + 1]; + CM_ARCH_COMMON_PCI_INTERRUPT_MAP_INFO *IrqMapInfo; + CM_ARCH_COMMON_PCI_ROOT_PORT_INFO *RpInfo; + EFI_STATUS Status; + UINT32 DeviceAddress; + UINT32 Index; + UINT32 IrqMapInfoCount; + UINT32 PrtIndex; + UINT32 RpInfoCount; + + if ((CfgMgrProtocol == NULL) || + (PciNode == NULL) || + (PciInfo == NULL)) + { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + Status = GetEArchCommonObjPciRootPortInfo ( + CfgMgrProtocol, + PciInfo->RootPortInfoToken, + &RpInfo, + &RpInfoCount + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + for (Index = 0; Index < RpInfoCount; Index++) { + PrtNode = NULL; + DeviceNode = NULL; + + /// Create root port device + DeviceAddress = RpInfo[Index].RootPortAddress; + if (((DeviceAddress >> 16) > PCI_MAX_DEVICE_COUNT_PER_BUS) || + (((DeviceAddress & 0xFFFF) != 0xFFFF) && + ((DeviceAddress & 0xFFFF) > PCI_MAX_FUNCTION_COUNT_PER_DEVICE))) + { + DEBUG (( + DEBUG_ERROR, + "SSDT:PCIE: Invalid device/function (0x%x)\n", + DeviceAddress + )); + Status = EFI_INVALID_PARAMETER; + ASSERT_EFI_ERROR (Status); + goto exit_handler; + } + + // Generic device name is "Dxxy". + // Where xx is device number + // and y is function number + CopyMem (AslName, "Dxxy", AML_NAME_SEG_SIZE + 1); + AslName[AML_NAME_SEG_SIZE - 3] = AsciiFromHex ((DeviceAddress >> 20) & 0xF); + AslName[AML_NAME_SEG_SIZE - 2] = AsciiFromHex ((DeviceAddress >> 16) & 0xF); + AslName[AML_NAME_SEG_SIZE - 1] = AsciiFromHex (DeviceAddress & 0xF); + + // ASL: + // Device (Dxxy) { + // Name (_ADR,
    ) + // } + Status = AmlCodeGenDevice (AslName, PciNode, &DeviceNode); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto exit_handler; + } + + Status = AmlCodeGenNameInteger ( + "_ADR", + DeviceAddress, + DeviceNode, + NULL + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto exit_handler; + } + + if (RpInfo[Index].Sun != MAX_UINT64) { + // ASL: Name (_SUN, ) + Status = AmlCodeGenNameInteger ( + "_SUN", + RpInfo[Index].Sun, + DeviceNode, + NULL + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto exit_handler; + } + } + + if (RpInfo[Index].RootPortPrtToken == CM_NULL_TOKEN) { + continue; + } + + IrqMapInfo = NULL; + IrqMapInfoCount = 0; + Status = GetEArchCommonObjPciInterruptMapInfo ( + CfgMgrProtocol, + RpInfo[Index].RootPortPrtToken, + &IrqMapInfo, + &IrqMapInfoCount + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto exit_handler; + } + + if ((IrqMapInfo == NULL) || (IrqMapInfoCount == 0)) { + Status = EFI_NOT_FOUND; + ASSERT_EFI_ERROR (Status); + goto exit_handler; + } + + // ASL: Name (_PRT, Package () {}) + Status = AmlCodeGenNamePackage ("_PRT", NULL, &PrtNode); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto exit_handler; + } + + for (PrtIndex = 0; PrtIndex < IrqMapInfoCount; PrtIndex++) { + if (IrqMapInfo[PrtIndex].PciInterrupt > PCI_MAX_PCI_INTERRUPT_PIN_VALUE) { + DEBUG (( + DEBUG_ERROR, + "SSDT:PCIE: Invalid interrupt pin (Index %d, PrtIndex %d): %d\n", + Index, + PrtIndex, + IrqMapInfo[PrtIndex].PciInterrupt + )); + Status = EFI_INVALID_PARAMETER; + ASSERT_EFI_ERROR (Status); + goto exit_handler; + } + + // Check that the interrupts flags are SPIs, level high. + // Cf. Arm BSA v1.0, sE.6 "Legacy interrupts" + if ((IrqMapInfo[PrtIndex].IntcInterrupt.Interrupt >= 32) && + (IrqMapInfo[PrtIndex].IntcInterrupt.Interrupt < 1020) && + ((IrqMapInfo[PrtIndex].IntcInterrupt.Flags & 0xB) != 0)) + { + Status = EFI_INVALID_PARAMETER; + ASSERT_EFI_ERROR (Status); + goto exit_handler; + } + + /* Add a _PRT entry. + ASL + Name (_PRT, Package () { + , + + }) + + Address is set as: + ACPI 6.4 specification, Table 6.2: "ADR Object Address Encodings" + High word-Device #, Low word-Function #. (for example, device 3, + function 2 is 0x00030002). To refer to all the functions on a device #, + use a function number of FFFF). + + Use the second model for _PRT object and describe a hardwired interrupt. + */ + Status = AmlAddPrtEntry ( + DeviceAddress, + IrqMapInfo[PrtIndex].PciInterrupt, + NULL, + IrqMapInfo[PrtIndex].IntcInterrupt.Interrupt, + PrtNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto exit_handler; + } + } + + // Attach the _PRT entry. + Status = AmlAttachNode (DeviceNode, PrtNode); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto exit_handler; + } + } + + return EFI_SUCCESS; +exit_handler: + if (DeviceNode != NULL) { + AmlDetachNode (DeviceNode); + AmlDeleteTree (DeviceNode); + } + + if (PrtNode != NULL) { + AmlDeleteTree (PrtNode); + } + + return Status; +} + /** Generate a _CRS method for the Pci device. @param [in] Generator The SSDT Pci generator. @@ -911,6 +1142,19 @@ GeneratePciDevice ( return Status; } + if (PciInfo->RootPortInfoToken != CM_NULL_TOKEN) { + // Create root port devices + Status = GenerateRootPortDevices ( + CfgMgrProtocol, + PciInfo, + PciNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + } + // Add the template _OSC method. Status = AddOscMethod (PciInfo, PciNode); ASSERT_EFI_ERROR (Status); From 7ce19889f95b39bb05ef7fabed0107ced11eba2f Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Sat, 18 Oct 2025 14:21:20 +0000 Subject: [PATCH 0707/1172] DynamicTablesPkg: Add the parser for EArchCommonObjTpm2DeviceInfo Add the missing parser for EArchCommonObjTpm2DeviceInfo. This missing parser causing assert for EArchCommonObjMcfgPciConfigSpaceInfo and EArchCommonObjPciRootPortInfo parser. Signed-off-by: Abdul Lateef Attar --- .../TableHelperLib/ConfigurationManagerObjectParser.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c index 055a8ca884a2..92d6a3a13dcf 100644 --- a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c +++ b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c @@ -883,6 +883,13 @@ STATIC CONST CM_OBJ_PARSER CmArchCommonObjSpcrInfoParser[] = { { "TerminalType", 1, "0x%x", NULL } }; +/** A Parser for EArchCommonObjTpm2DeviceInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArchCommonObjTpm2DeviceInfoParser[] = { + { "Tpm2DeviceBaseAddress", sizeof (UINT64), "0x%lx", NULL }, + { "Tpm2DeviceSize", sizeof (UINT64), "0x%lx", NULL } +}; + /** A parser for EArchCommonObjPciRootPortInfo */ STATIC CONST CM_OBJ_PARSER CmArchCommonObjPciRootPortInfoParser[] = { @@ -940,6 +947,7 @@ STATIC CONST CM_OBJ_PARSER_ARRAY ArchCommonNamespaceObjectParser[] = { CM_PARSER_ADD_OBJECT (EArchCommonObjMemoryLatBwInfo, CmArchCommonMemoryLatBwInfo), CM_PARSER_ADD_OBJECT (EArchCommonObjMemoryCacheInfo, CmArchCommonMemoryCacheInfo), CM_PARSER_ADD_OBJECT (EArchCommonObjSpcrInfo, CmArchCommonObjSpcrInfoParser), + CM_PARSER_ADD_OBJECT (EArchCommonObjTpm2DeviceInfo, CmArchCommonObjTpm2DeviceInfoParser), CM_PARSER_ADD_OBJECT (EArchCommonObjMcfgPciConfigSpaceInfo, CmArchCommonPciConfigSpaceInfoParser), CM_PARSER_ADD_OBJECT (EArchCommonObjPciRootPortInfo, CmArchCommonObjPciRootPortInfoParser), CM_PARSER_ADD_OBJECT_RESERVED (EArchCommonObjMax) From 64a1aca08fd4e2f50be1564242959189fbf417d6 Mon Sep 17 00:00:00 2001 From: Vitaly Cheptsov Date: Thu, 7 Aug 2025 11:53:07 +0300 Subject: [PATCH 0708/1172] MdeModulePkg: Fix UEFI runtime driver loading after EndOfDxe Memory Attributes Table needs to be updated to contain executable permissions for UEFI runtime drivers loaded after EndOfDxe. Fixes a regression introduced by bb248a9. Signed-off-by: Vitaly Cheptsov --- MdeModulePkg/Core/Dxe/Misc/MemoryAttributesTable.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Misc/MemoryAttributesTable.c b/MdeModulePkg/Core/Dxe/Misc/MemoryAttributesTable.c index a11c455ab598..e1ee7d1d467d 100644 --- a/MdeModulePkg/Core/Dxe/Misc/MemoryAttributesTable.c +++ b/MdeModulePkg/Core/Dxe/Misc/MemoryAttributesTable.c @@ -87,7 +87,6 @@ STATIC IMAGE_PROPERTIES_PRIVATE_DATA mImagePropertiesPrivateData = { STATIC EFI_LOCK mMemoryAttributesTableLock = EFI_INITIALIZE_LOCK_VARIABLE (TPL_NOTIFY); BOOLEAN mMemoryAttributesTableEnable = TRUE; -BOOLEAN mMemoryAttributesTableEndOfDxe = FALSE; EFI_MEMORY_ATTRIBUTES_TABLE *mMemoryAttributesTable = NULL; BOOLEAN mMemoryAttributesTableReadyToBoot = FALSE; BOOLEAN gMemoryAttributesTableForwardCfi = TRUE; @@ -282,7 +281,6 @@ InstallMemoryAttributesTableOnEndOfDxe ( IN VOID *Context ) { - mMemoryAttributesTableEndOfDxe = TRUE; InstallMemoryAttributesTable (); DEBUG_CODE_BEGIN (); @@ -591,11 +589,6 @@ InsertImageRecord ( DEBUG ((DEBUG_VERBOSE, "InsertImageRecord - 0x%x\n", RuntimeImage)); - if (mMemoryAttributesTableEndOfDxe) { - DEBUG ((DEBUG_INFO, "Do not insert runtime image record after EndOfDxe\n")); - return; - } - ImageRecord = AllocatePool (sizeof (*ImageRecord)); if (ImageRecord == NULL) { return; @@ -678,11 +671,6 @@ RemoveImageRecord ( DEBUG ((DEBUG_VERBOSE, "RemoveImageRecord - 0x%x\n", RuntimeImage)); DEBUG ((DEBUG_VERBOSE, "RemoveImageRecord - 0x%016lx - 0x%016lx\n", (EFI_PHYSICAL_ADDRESS)(UINTN)RuntimeImage->ImageBase, RuntimeImage->ImageSize)); - if (mMemoryAttributesTableEndOfDxe) { - DEBUG ((DEBUG_INFO, "Do not remove runtime image record after EndOfDxe\n")); - return; - } - ImageRecord = FindImageRecord ((EFI_PHYSICAL_ADDRESS)(UINTN)RuntimeImage->ImageBase, RuntimeImage->ImageSize, &mImagePropertiesPrivateData.ImageRecordList); if (ImageRecord == NULL) { DEBUG ((DEBUG_ERROR, "!!!!!!!! ImageRecord not found !!!!!!!!\n")); From ff0edeaaa86f24714912129c7ff3f14d4a5ef6a2 Mon Sep 17 00:00:00 2001 From: Damien-Chen Date: Fri, 24 Oct 2025 23:15:58 +0800 Subject: [PATCH 0709/1172] StandaloneMmPkg/Core/Dispatcher: Use more generic MMRAM term in comment In StandaloneMmPkg/Core/Dispatcher.c, a comment referred to SMRAM. SMRAM is specific to the x86 architecture. The StandaloneMmPkg is designed to be architecture-agnostic. This commit updates the comment to use the more generic term MMRAM (Management Mode RAM) to better reflect the nature of the package. Signed-off-by: Damien Chen --- StandaloneMmPkg/Core/Dispatcher.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/StandaloneMmPkg/Core/Dispatcher.c b/StandaloneMmPkg/Core/Dispatcher.c index 086532e84751..403c374336a6 100644 --- a/StandaloneMmPkg/Core/Dispatcher.c +++ b/StandaloneMmPkg/Core/Dispatcher.c @@ -125,7 +125,7 @@ BOOLEAN gDispatcherRunning = FALSE; BOOLEAN gRequestDispatch = FALSE; /** - Loads an EFI image into SMRAM. + Loads an EFI image into MMRAM. @param DriverEntry EFI_MM_DRIVER_ENTRY instance @param ImageContext Allocated ImageContext to be filled out by this function @@ -225,7 +225,7 @@ MmLoadImage ( // // Fill in the remaining fields of the Loaded Image Protocol instance. - // Note: ImageBase is an SMRAM address that can not be accessed outside of SMRAM if SMRAM window is closed. + // Note: ImageBase is an MMRAM address that can not be accessed outside of MMRAM if MMRAM window is closed. // DriverEntry->LoadedImage.Revision = EFI_LOADED_IMAGE_PROTOCOL_REVISION; DriverEntry->LoadedImage.ParentHandle = NULL; From c6cea09e9ad0674bb58e430623407092cdc8ac30 Mon Sep 17 00:00:00 2001 From: Arun Subramanian Baskaran Date: Thu, 23 Oct 2025 22:27:41 -0400 Subject: [PATCH 0710/1172] SecurityPkg: Trace and return status are handled. Added debug trace messages on LocateProtocol failure for gEfiDxeSmmReadyToLockProtocolGuid. Returned device error in case of EfiCreateProtocolNotifyEvent failure. Removed ASSERT due to if condition. Signed-off-by: Arun Subramanian Baskaran --- SecurityPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/SecurityPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.c b/SecurityPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.c index b9ed6cf8f94d..bb479c1771d7 100644 --- a/SecurityPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.c +++ b/SecurityPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.c @@ -43,6 +43,7 @@ SmmReadyToLockEventCallBack ( &Interface ); if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to locate gEfiDxeSmmReadyToLockProtocolGuid.\n")); return; } @@ -79,7 +80,10 @@ Tcg2PlatformDxeEntryPoint ( &Registration ); - ASSERT (Event != NULL); + if (Event == NULL) { + DEBUG ((DEBUG_ERROR, "Failed to create protocol notify event for SmmReadyToLockProtocol.\n")); + return EFI_DEVICE_ERROR; + } return EFI_SUCCESS; } From a074649c6096d6dd36d03db5a55316d129e776b5 Mon Sep 17 00:00:00 2001 From: "INDIA\\kanagavels" Date: Wed, 22 Oct 2025 19:14:26 +0530 Subject: [PATCH 0711/1172] CryptoPkg: Fix coverity warnings in CryptoPkg. Fix the coverity warnings reported in the CryptoPkg. Signed-off-by: Kanagavel S --- CryptoPkg/Library/TlsLib/TlsConfig.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/CryptoPkg/Library/TlsLib/TlsConfig.c b/CryptoPkg/Library/TlsLib/TlsConfig.c index 9f92f6aba7ef..c21b6f70be66 100644 --- a/CryptoPkg/Library/TlsLib/TlsConfig.c +++ b/CryptoPkg/Library/TlsLib/TlsConfig.c @@ -607,6 +607,10 @@ TlsSetServerName ( TlsConn = (TLS_CONNECTION *)Tls; Ctx = (SSL_CTX *)SslCtx; + if (TlsConn == NULL) { + return EFI_INVALID_PARAMETER; + } + TlsExtCtx = AllocateZeroPool (sizeof (TLS_EXT_CTX)); if (TlsExtCtx == NULL) { return EFI_OUT_OF_RESOURCES; @@ -1254,7 +1258,9 @@ TlsGetVersion ( TlsConn = (TLS_CONNECTION *)Tls; - ASSERT (TlsConn != NULL); + if (TlsConn == NULL) { + return 0; + } return (UINT16)(SSL_version (TlsConn->Ssl)); } @@ -1282,7 +1288,9 @@ TlsGetConnectionEnd ( TlsConn = (TLS_CONNECTION *)Tls; - ASSERT (TlsConn != NULL); + if (TlsConn == NULL) { + return 0; + } return (UINT8)SSL_is_server (TlsConn->Ssl); } @@ -1377,7 +1385,9 @@ TlsGetVerify ( TlsConn = (TLS_CONNECTION *)Tls; - ASSERT (TlsConn != NULL); + if (TlsConn == NULL) { + return 0; + } return SSL_get_verify_mode (TlsConn->Ssl); } From 302cc88ab36ffb96622987a55f4abc22a4751fed Mon Sep 17 00:00:00 2001 From: eeshanl Date: Wed, 28 May 2025 23:06:12 +0000 Subject: [PATCH 0712/1172] NetworkPkg/SnpDxe: Update SnpDxe SNP_DRIVER struct out of DMA-able memory. CPB, DB, and CDB structs to use DMA-able memory. Updates the overall SNP_DRIVER allocation to use AllocatePool() instead of PciIo->AllocateBuffer(). This moves this struct out of DMA-able memory. Allocates the PXE_CDB struct as a pointer instead, using PciIo->AllocateBuffer() for DMA-able memory. End result: CPB, DB, and CDB are allocated with individual PciIo->AllocateBuffer() calls with a size of 4096 for CPB and DB. and sizeof(PXE_CDB) for CDB. Each of these members point to locations within the Allocated Buffer, and all of these pointers are at-least 8-Byte aligned. SNP_DRIVER is allocated with AllocatePool() In the SNP_DRIVER structure, the PXE_CDB member is changed to a pointer so we can allocate it with PciIo->AllocateBuffer() Signed-off-by: Eeshan Londhe --- NetworkPkg/SnpDxe/Get_status.c | 49 +++--- NetworkPkg/SnpDxe/Initialize.c | 45 ++--- NetworkPkg/SnpDxe/Mcast_ip_to_mac.c | 41 +++-- NetworkPkg/SnpDxe/Nvdata.c | 39 +++-- NetworkPkg/SnpDxe/Receive.c | 37 +++-- NetworkPkg/SnpDxe/Receive_filters.c | 149 +++++++++-------- NetworkPkg/SnpDxe/Reset.c | 33 ++-- NetworkPkg/SnpDxe/Shutdown.c | 31 ++-- NetworkPkg/SnpDxe/Snp.c | 247 ++++++++++++++++------------ NetworkPkg/SnpDxe/Snp.h | 2 +- NetworkPkg/SnpDxe/Start.c | 37 +++-- NetworkPkg/SnpDxe/Station_address.c | 78 +++++---- NetworkPkg/SnpDxe/Statistics.c | 45 ++--- NetworkPkg/SnpDxe/Stop.c | 33 ++-- NetworkPkg/SnpDxe/Transmit.c | 80 +++++---- NetworkPkg/SnpDxe/WaitForPacket.c | 29 ++-- 16 files changed, 551 insertions(+), 424 deletions(-) diff --git a/NetworkPkg/SnpDxe/Get_status.c b/NetworkPkg/SnpDxe/Get_status.c index 2097fbcbaad1..5f500c01fdc6 100644 --- a/NetworkPkg/SnpDxe/Get_status.c +++ b/NetworkPkg/SnpDxe/Get_status.c @@ -38,49 +38,54 @@ PxeGetStatus ( UINT32 Index; UINT64 *Tmp; - Tmp = NULL; - Db = Snp->Db; - Snp->Cdb.OpCode = PXE_OPCODE_GET_STATUS; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + + Tmp = NULL; + Db = Snp->Db; + Snp->Cdb->OpCode = PXE_OPCODE_GET_STATUS; - Snp->Cdb.OpFlags = 0; + Snp->Cdb->OpFlags = 0; if (GetTransmittedBuf) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_GET_TRANSMITTED_BUFFERS; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_GET_TRANSMITTED_BUFFERS; ZeroMem (Db->TxBuffer, sizeof (Db->TxBuffer)); } if (InterruptStatusPtr != NULL) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_GET_INTERRUPT_STATUS; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_GET_INTERRUPT_STATUS; } if (Snp->MediaStatusSupported) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_GET_MEDIA_STATUS; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_GET_MEDIA_STATUS; } - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.DBsize = (UINT16)sizeof (PXE_DB_GET_STATUS); - Snp->Cdb.DBaddr = (UINT64)(UINTN)Db; + Snp->Cdb->DBsize = (UINT16)sizeof (PXE_DB_GET_STATUS); + Snp->Cdb->DBaddr = (UINT64)(UINTN)Db; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command and check result. // DEBUG ((DEBUG_NET, "\nSnp->undi.get_status() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { DEBUG ( (DEBUG_NET, "\nSnp->undi.get_status() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_DEVICE_ERROR; @@ -90,7 +95,7 @@ PxeGetStatus ( // report the values back.. // if (InterruptStatusPtr != NULL) { - InterruptFlags = (UINT16)(Snp->Cdb.StatFlags & PXE_STATFLAGS_GET_STATUS_INTERRUPT_MASK); + InterruptFlags = (UINT16)(Snp->Cdb->StatFlags & PXE_STATFLAGS_GET_STATUS_INTERRUPT_MASK); *InterruptStatusPtr = 0; @@ -112,7 +117,7 @@ PxeGetStatus ( } if (GetTransmittedBuf) { - if ((Snp->Cdb.StatFlags & PXE_STATFLAGS_GET_STATUS_NO_TXBUFS_WRITTEN) == 0) { + if ((Snp->Cdb->StatFlags & PXE_STATFLAGS_GET_STATUS_NO_TXBUFS_WRITTEN) == 0) { // // UNDI has written some transmitted buffer addresses into the DB. Store them into Snp->RecycledTxBuf. // @@ -150,7 +155,7 @@ PxeGetStatus ( // if (Snp->MediaStatusSupported) { Snp->Snp.Mode->MediaPresent = - (BOOLEAN)(((Snp->Cdb.StatFlags & PXE_STATFLAGS_GET_STATUS_NO_MEDIA) != 0) ? FALSE : TRUE); + (BOOLEAN)(((Snp->Cdb->StatFlags & PXE_STATFLAGS_GET_STATUS_NO_MEDIA) != 0) ? FALSE : TRUE); } return EFI_SUCCESS; diff --git a/NetworkPkg/SnpDxe/Initialize.c b/NetworkPkg/SnpDxe/Initialize.c index c219a1cb20bc..1e2ed67eadf0 100644 --- a/NetworkPkg/SnpDxe/Initialize.c +++ b/NetworkPkg/SnpDxe/Initialize.c @@ -30,6 +30,11 @@ PxeInit ( VOID *Addr; EFI_STATUS Status; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + Status = EFI_SUCCESS; Cpb = Snp->Cpb; @@ -76,41 +81,41 @@ PxeInit ( Cpb->LoopBackMode = LOOPBACK_NORMAL; - Snp->Cdb.OpCode = PXE_OPCODE_INITIALIZE; - Snp->Cdb.OpFlags = CableDetectFlag; + Snp->Cdb->OpCode = PXE_OPCODE_INITIALIZE; + Snp->Cdb->OpFlags = CableDetectFlag; - Snp->Cdb.CPBsize = (UINT16)sizeof (PXE_CPB_INITIALIZE); - Snp->Cdb.DBsize = (UINT16)sizeof (PXE_DB_INITIALIZE); + Snp->Cdb->CPBsize = (UINT16)sizeof (PXE_CPB_INITIALIZE); + Snp->Cdb->DBsize = (UINT16)sizeof (PXE_DB_INITIALIZE); - Snp->Cdb.CPBaddr = (UINT64)(UINTN)Snp->Cpb; - Snp->Cdb.DBaddr = (UINT64)(UINTN)Snp->Db; + Snp->Cdb->CPBaddr = (UINT64)(UINTN)Snp->Cpb; + Snp->Cdb->DBaddr = (UINT64)(UINTN)Snp->Db; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; DEBUG ((DEBUG_NET, "\nSnp->undi.initialize() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); // // There are two fields need to be checked here: - // First is the upper two bits (14 & 15) in the CDB.StatFlags field. Until these bits change to report + // First is the upper two bits (14 & 15) in the Cdb->StatFlags field. Until these bits change to report // PXE_STATFLAGS_COMMAND_COMPLETE or PXE_STATFLAGS_COMMAND_FAILED, the command has not been executed by the UNDI. - // Second is the CDB.StatCode field. After command execution completes, either successfully or not, - // the CDB.StatCode field contains the result of the command execution. + // Second is the Cdb->StatCode field. After command execution completes, either successfully or not, + // the Cdb->StatCode field contains the result of the command execution. // - if ((((Snp->Cdb.StatFlags) & PXE_STATFLAGS_STATUS_MASK) == PXE_STATFLAGS_COMMAND_COMPLETE) && - (Snp->Cdb.StatCode == PXE_STATCODE_SUCCESS)) + if ((((Snp->Cdb->StatFlags) & PXE_STATFLAGS_STATUS_MASK) == PXE_STATFLAGS_COMMAND_COMPLETE) && + (Snp->Cdb->StatCode == PXE_STATCODE_SUCCESS)) { // - // If cable detect feature is enabled in CDB.OpFlags, check the CDB.StatFlags to see if there is an + // If cable detect feature is enabled in Cdb->OpFlags, check the Cdb->StatFlags to see if there is an // active connection to this network device. If the no media StatFlag is set, the UNDI and network // device are still initialized. // if (CableDetectFlag == PXE_OPFLAGS_INITIALIZE_DETECT_CABLE) { - if (((Snp->Cdb.StatFlags) & PXE_STATFLAGS_INITIALIZED_NO_MEDIA) != PXE_STATFLAGS_INITIALIZED_NO_MEDIA) { + if (((Snp->Cdb->StatFlags) & PXE_STATFLAGS_INITIALIZED_NO_MEDIA) != PXE_STATFLAGS_INITIALIZED_NO_MEDIA) { Snp->Mode.MediaPresent = TRUE; } else { Snp->Mode.MediaPresent = FALSE; @@ -123,8 +128,8 @@ PxeInit ( DEBUG ( (DEBUG_WARN, "\nSnp->undi.initialize() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); if (Snp->TxRxBuffer != NULL) { diff --git a/NetworkPkg/SnpDxe/Mcast_ip_to_mac.c b/NetworkPkg/SnpDxe/Mcast_ip_to_mac.c index 2b42e20aaf15..52a9fbb5b41a 100644 --- a/NetworkPkg/SnpDxe/Mcast_ip_to_mac.c +++ b/NetworkPkg/SnpDxe/Mcast_ip_to_mac.c @@ -35,20 +35,25 @@ PxeIp2Mac ( PXE_CPB_MCAST_IP_TO_MAC *Cpb; PXE_DB_MCAST_IP_TO_MAC *Db; - Cpb = Snp->Cpb; - Db = Snp->Db; - Snp->Cdb.OpCode = PXE_OPCODE_MCAST_IP_TO_MAC; - Snp->Cdb.OpFlags = (UINT16)(IPv6 ? PXE_OPFLAGS_MCAST_IPV6_TO_MAC : PXE_OPFLAGS_MCAST_IPV4_TO_MAC); - Snp->Cdb.CPBsize = (UINT16)sizeof (PXE_CPB_MCAST_IP_TO_MAC); - Snp->Cdb.DBsize = (UINT16)sizeof (PXE_DB_MCAST_IP_TO_MAC); + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + + Cpb = Snp->Cpb; + Db = Snp->Db; + Snp->Cdb->OpCode = PXE_OPCODE_MCAST_IP_TO_MAC; + Snp->Cdb->OpFlags = (UINT16)(IPv6 ? PXE_OPFLAGS_MCAST_IPV6_TO_MAC : PXE_OPFLAGS_MCAST_IPV4_TO_MAC); + Snp->Cdb->CPBsize = (UINT16)sizeof (PXE_CPB_MCAST_IP_TO_MAC); + Snp->Cdb->DBsize = (UINT16)sizeof (PXE_DB_MCAST_IP_TO_MAC); - Snp->Cdb.CPBaddr = (UINT64)(UINTN)Cpb; - Snp->Cdb.DBaddr = (UINT64)(UINTN)Db; + Snp->Cdb->CPBaddr = (UINT64)(UINTN)Cpb; + Snp->Cdb->DBaddr = (UINT64)(UINTN)Db; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; CopyMem (&Cpb->IP, IP, sizeof (PXE_IP_ADDR)); @@ -57,9 +62,9 @@ PxeIp2Mac ( // DEBUG ((DEBUG_NET, "\nSnp->undi.mcast_ip_to_mac() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - switch (Snp->Cdb.StatCode) { + switch (Snp->Cdb->StatCode) { case PXE_STATCODE_SUCCESS: break; @@ -70,8 +75,8 @@ PxeIp2Mac ( DEBUG ( (DEBUG_NET, "\nSnp->undi.mcast_ip_to_mac() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_UNSUPPORTED; @@ -83,8 +88,8 @@ PxeIp2Mac ( DEBUG ( (DEBUG_NET, "\nSnp->undi.mcast_ip_to_mac() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_DEVICE_ERROR; diff --git a/NetworkPkg/SnpDxe/Nvdata.c b/NetworkPkg/SnpDxe/Nvdata.c index 54bcec125b77..a0962b441895 100644 --- a/NetworkPkg/SnpDxe/Nvdata.c +++ b/NetworkPkg/SnpDxe/Nvdata.c @@ -33,30 +33,35 @@ PxeNvDataRead ( { PXE_DB_NVDATA *Db; - Db = Snp->Db; - Snp->Cdb.OpCode = PXE_OPCODE_NVDATA; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + + Db = Snp->Db; + Snp->Cdb->OpCode = PXE_OPCODE_NVDATA; - Snp->Cdb.OpFlags = PXE_OPFLAGS_NVDATA_READ; + Snp->Cdb->OpFlags = PXE_OPFLAGS_NVDATA_READ; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.DBsize = (UINT16)sizeof (PXE_DB_NVDATA); - Snp->Cdb.DBaddr = (UINT64)(UINTN)Db; + Snp->Cdb->DBsize = (UINT16)sizeof (PXE_DB_NVDATA); + Snp->Cdb->DBaddr = (UINT64)(UINTN)Db; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command and check result. // DEBUG ((DEBUG_NET, "\nsnp->undi.nvdata () ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - switch (Snp->Cdb.StatCode) { + switch (Snp->Cdb->StatCode) { case PXE_STATCODE_SUCCESS: break; @@ -64,8 +69,8 @@ PxeNvDataRead ( DEBUG ( (DEBUG_NET, "\nsnp->undi.nvdata() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_UNSUPPORTED; @@ -74,8 +79,8 @@ PxeNvDataRead ( DEBUG ( (DEBUG_NET, "\nsnp->undi.nvdata() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_DEVICE_ERROR; diff --git a/NetworkPkg/SnpDxe/Receive.c b/NetworkPkg/SnpDxe/Receive.c index 41601980f25f..e86db89a5f06 100644 --- a/NetworkPkg/SnpDxe/Receive.c +++ b/NetworkPkg/SnpDxe/Receive.c @@ -49,6 +49,11 @@ PxeReceive ( PXE_DB_RECEIVE *Db; UINTN BuffSize; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + Cpb = Snp->Cpb; Db = Snp->Db; BuffSize = *BufferSize; @@ -58,28 +63,28 @@ PxeReceive ( Cpb->reserved = 0; - Snp->Cdb.OpCode = PXE_OPCODE_RECEIVE; - Snp->Cdb.OpFlags = PXE_OPFLAGS_NOT_USED; + Snp->Cdb->OpCode = PXE_OPCODE_RECEIVE; + Snp->Cdb->OpFlags = PXE_OPFLAGS_NOT_USED; - Snp->Cdb.CPBsize = (UINT16)sizeof (PXE_CPB_RECEIVE); - Snp->Cdb.CPBaddr = (UINT64)(UINTN)Cpb; + Snp->Cdb->CPBsize = (UINT16)sizeof (PXE_CPB_RECEIVE); + Snp->Cdb->CPBaddr = (UINT64)(UINTN)Cpb; - Snp->Cdb.DBsize = (UINT16)sizeof (PXE_DB_RECEIVE); - Snp->Cdb.DBaddr = (UINT64)(UINTN)Db; + Snp->Cdb->DBsize = (UINT16)sizeof (PXE_DB_RECEIVE); + Snp->Cdb->DBaddr = (UINT64)(UINTN)Db; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command and check result. // DEBUG ((DEBUG_NET, "\nsnp->undi.receive () ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - switch (Snp->Cdb.StatCode) { + switch (Snp->Cdb->StatCode) { case PXE_STATCODE_SUCCESS: break; @@ -87,8 +92,8 @@ PxeReceive ( DEBUG ( (DEBUG_NET, "\nsnp->undi.receive () %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_NOT_READY; @@ -97,8 +102,8 @@ PxeReceive ( DEBUG ( (DEBUG_ERROR, "\nsnp->undi.receive() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_DEVICE_ERROR; diff --git a/NetworkPkg/SnpDxe/Receive_filters.c b/NetworkPkg/SnpDxe/Receive_filters.c index 4a2116556716..aa947ec49dc5 100644 --- a/NetworkPkg/SnpDxe/Receive_filters.c +++ b/NetworkPkg/SnpDxe/Receive_filters.c @@ -32,41 +32,46 @@ PxeRecvFilterEnable ( EFI_MAC_ADDRESS *MCastAddressList ) { - Snp->Cdb.OpCode = PXE_OPCODE_RECEIVE_FILTERS; - Snp->Cdb.OpFlags = PXE_OPFLAGS_RECEIVE_FILTER_ENABLE; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + + Snp->Cdb->OpCode = PXE_OPCODE_RECEIVE_FILTERS; + Snp->Cdb->OpFlags = PXE_OPFLAGS_RECEIVE_FILTER_ENABLE; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->DBsize = PXE_DBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->DBaddr = PXE_DBADDR_NOT_USED; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; if ((EnableFlags & EFI_SIMPLE_NETWORK_RECEIVE_UNICAST) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_UNICAST; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_UNICAST; } if ((EnableFlags & EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_BROADCAST; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_BROADCAST; } if ((EnableFlags & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_PROMISCUOUS; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_PROMISCUOUS; } if ((EnableFlags & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_ALL_MULTICAST; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_ALL_MULTICAST; } if ((EnableFlags & EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST; } if (MCastAddressCount != 0) { - Snp->Cdb.CPBsize = (UINT16)(MCastAddressCount * sizeof (EFI_MAC_ADDRESS)); - Snp->Cdb.CPBaddr = (UINT64)(UINTN)Snp->Cpb; - CopyMem (Snp->Cpb, MCastAddressList, Snp->Cdb.CPBsize); + Snp->Cdb->CPBsize = (UINT16)(MCastAddressCount * sizeof (EFI_MAC_ADDRESS)); + Snp->Cdb->CPBaddr = (UINT64)(UINTN)Snp->Cpb; + CopyMem (Snp->Cpb, MCastAddressList, Snp->Cdb->CPBsize); } // @@ -74,20 +79,20 @@ PxeRecvFilterEnable ( // DEBUG ((DEBUG_NET, "\nsnp->undi.receive_filters() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { // // UNDI command failed. Return UNDI status to caller. // DEBUG ( (DEBUG_ERROR, "\nsnp->undi.receive_filters() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); - switch (Snp->Cdb.StatCode) { + switch (Snp->Cdb->StatCode) { case PXE_STATCODE_INVALID_CDB: case PXE_STATCODE_INVALID_CPB: case PXE_STATCODE_INVALID_PARAMETER: @@ -122,40 +127,45 @@ PxeRecvFilterDisable ( BOOLEAN ResetMCastList ) { - Snp->Cdb.OpCode = PXE_OPCODE_RECEIVE_FILTERS; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; - - Snp->Cdb.OpFlags = (UINT16)((DisableFlags != 0) ? PXE_OPFLAGS_RECEIVE_FILTER_DISABLE : PXE_OPFLAGS_NOT_USED); + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + + Snp->Cdb->OpCode = PXE_OPCODE_RECEIVE_FILTERS; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->DBsize = PXE_DBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->DBaddr = PXE_DBADDR_NOT_USED; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; + + Snp->Cdb->OpFlags = (UINT16)((DisableFlags != 0) ? PXE_OPFLAGS_RECEIVE_FILTER_DISABLE : PXE_OPFLAGS_NOT_USED); if (ResetMCastList) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_RESET_MCAST_LIST; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_RESET_MCAST_LIST; } if ((DisableFlags & EFI_SIMPLE_NETWORK_RECEIVE_UNICAST) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_UNICAST; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_UNICAST; } if ((DisableFlags & EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_BROADCAST; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_BROADCAST; } if ((DisableFlags & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_PROMISCUOUS; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_PROMISCUOUS; } if ((DisableFlags & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_ALL_MULTICAST; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_ALL_MULTICAST; } if ((DisableFlags & EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST) != 0) { - Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST; + Snp->Cdb->OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST; } // @@ -163,17 +173,17 @@ PxeRecvFilterDisable ( // DEBUG ((DEBUG_NET, "\nsnp->undi.receive_filters() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { // // UNDI command failed. Return UNDI status to caller. // DEBUG ( (DEBUG_ERROR, "\nsnp->undi.receive_filters() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_DEVICE_ERROR; @@ -196,36 +206,41 @@ PxeRecvFilterRead ( SNP_DRIVER *Snp ) { - Snp->Cdb.OpCode = PXE_OPCODE_RECEIVE_FILTERS; - Snp->Cdb.OpFlags = PXE_OPFLAGS_RECEIVE_FILTER_READ; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.DBsize = (UINT16)(Snp->Mode.MaxMCastFilterCount * sizeof (EFI_MAC_ADDRESS)); - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - if (Snp->Cdb.DBsize == 0) { - Snp->Cdb.DBaddr = (UINT64)(UINTN)NULL; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + + Snp->Cdb->OpCode = PXE_OPCODE_RECEIVE_FILTERS; + Snp->Cdb->OpFlags = PXE_OPFLAGS_RECEIVE_FILTER_READ; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->DBsize = (UINT16)(Snp->Mode.MaxMCastFilterCount * sizeof (EFI_MAC_ADDRESS)); + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + if (Snp->Cdb->DBsize == 0) { + Snp->Cdb->DBaddr = (UINT64)(UINTN)NULL; } else { - Snp->Cdb.DBaddr = (UINT64)(UINTN)Snp->Db; - ZeroMem (Snp->Db, Snp->Cdb.DBsize); + Snp->Cdb->DBaddr = (UINT64)(UINTN)Snp->Db; + ZeroMem (Snp->Db, Snp->Cdb->DBsize); } - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; DEBUG ((DEBUG_NET, "\nsnp->undi.receive_filters() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { // // UNDI command failed. Return UNDI status to caller. // DEBUG ( (DEBUG_ERROR, "\nsnp->undi.receive_filters() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_DEVICE_ERROR; @@ -236,27 +251,27 @@ PxeRecvFilterRead ( // Snp->Mode.ReceiveFilterSetting = 0; - if ((Snp->Cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_UNICAST) != 0) { + if ((Snp->Cdb->StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_UNICAST) != 0) { Snp->Mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_UNICAST; } - if ((Snp->Cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_BROADCAST) != 0) { + if ((Snp->Cdb->StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_BROADCAST) != 0) { Snp->Mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST; } - if ((Snp->Cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_PROMISCUOUS) != 0) { + if ((Snp->Cdb->StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_PROMISCUOUS) != 0) { Snp->Mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS; } - if ((Snp->Cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_ALL_MULTICAST) != 0) { + if ((Snp->Cdb->StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_ALL_MULTICAST) != 0) { Snp->Mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST; } - if ((Snp->Cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST) != 0) { + if ((Snp->Cdb->StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST) != 0) { Snp->Mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST; } - CopyMem (Snp->Mode.MCastFilter, Snp->Db, Snp->Cdb.DBsize); + CopyMem (Snp->Mode.MCastFilter, Snp->Db, Snp->Cdb->DBsize); // // Count number of active entries in multicast filter list. diff --git a/NetworkPkg/SnpDxe/Reset.c b/NetworkPkg/SnpDxe/Reset.c index 72f31425d094..3fcc2a19ed6f 100644 --- a/NetworkPkg/SnpDxe/Reset.c +++ b/NetworkPkg/SnpDxe/Reset.c @@ -23,30 +23,35 @@ PxeReset ( SNP_DRIVER *Snp ) { - Snp->Cdb.OpCode = PXE_OPCODE_RESET; - Snp->Cdb.OpFlags = PXE_OPFLAGS_NOT_USED; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + + Snp->Cdb->OpCode = PXE_OPCODE_RESET; + Snp->Cdb->OpFlags = PXE_OPFLAGS_NOT_USED; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->DBsize = PXE_DBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->DBaddr = PXE_DBADDR_NOT_USED; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command and check result. // DEBUG ((DEBUG_NET, "\nsnp->undi.reset() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { DEBUG ( (DEBUG_WARN, "\nsnp->undi32.reset() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); // diff --git a/NetworkPkg/SnpDxe/Shutdown.c b/NetworkPkg/SnpDxe/Shutdown.c index 33fa7cb03322..0f1ad35fed29 100644 --- a/NetworkPkg/SnpDxe/Shutdown.c +++ b/NetworkPkg/SnpDxe/Shutdown.c @@ -22,29 +22,34 @@ PxeShutdown ( IN SNP_DRIVER *Snp ) { - Snp->Cdb.OpCode = PXE_OPCODE_SHUTDOWN; - Snp->Cdb.OpFlags = PXE_OPFLAGS_NOT_USED; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + + Snp->Cdb->OpCode = PXE_OPCODE_SHUTDOWN; + Snp->Cdb->OpFlags = PXE_OPFLAGS_NOT_USED; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->DBsize = PXE_DBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->DBaddr = PXE_DBADDR_NOT_USED; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command and check result. // DEBUG ((DEBUG_NET, "\nsnp->undi.shutdown() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { // // UNDI could not be shutdown. Return UNDI error. // - DEBUG ((DEBUG_WARN, "\nsnp->undi.shutdown() %xh:%xh\n", Snp->Cdb.StatFlags, Snp->Cdb.StatCode)); + DEBUG ((DEBUG_WARN, "\nsnp->undi.shutdown() %xh:%xh\n", Snp->Cdb->StatFlags, Snp->Cdb->StatCode)); return EFI_DEVICE_ERROR; } diff --git a/NetworkPkg/SnpDxe/Snp.c b/NetworkPkg/SnpDxe/Snp.c index 09d6c8fc9944..2b3f943f5acd 100644 --- a/NetworkPkg/SnpDxe/Snp.c +++ b/NetworkPkg/SnpDxe/Snp.c @@ -235,6 +235,54 @@ SimpleNetworkDriverSupported ( return Status; } +/** + Free the SNP_DRIVER structure and all its sub-structures. + + @param Snp Pointer to SNP_DRIVER structure to be freed. +**/ +VOID +SimpleNetworkDriverFree ( + IN SNP_DRIVER *Snp + ) +{ + EFI_PCI_IO_PROTOCOL *PciIo; + + if (Snp != NULL) { + PciIo = Snp->PciIo; + if (PciIo != NULL) { + if (Snp->Cpb != NULL) { + PciIo->FreeBuffer ( + PciIo, + SNP_MEM_PAGES (EFI_PAGE_SIZE), + Snp->Cpb + ); + } + + if (Snp->Db != NULL) { + PciIo->FreeBuffer ( + PciIo, + SNP_MEM_PAGES (EFI_PAGE_SIZE), + Snp->Db + ); + } + + if (Snp->Cdb != NULL) { + PciIo->FreeBuffer ( + PciIo, + SNP_MEM_PAGES (sizeof (PXE_CDB)), + (VOID *)(UINTN)Snp->Cdb + ); + } + } + + if (Snp->RecycledTxBuf != NULL) { + FreePool (Snp->RecycledTxBuf); + } + + FreePool (Snp); + } +} + /** Start this driver on ControllerHandle. This service is called by the EFI boot service ConnectController(). In order to make @@ -266,7 +314,6 @@ SimpleNetworkDriverStart ( EFI_STATUS Status; PXE_UNDI *Pxe; SNP_DRIVER *Snp; - VOID *Address; EFI_HANDLE Handle; UINT8 BarIndex; PXE_STATFLAGS InitStatFlags; @@ -339,7 +386,7 @@ SimpleNetworkDriverStart ( if (Calc8BitCksum (Pxe, Pxe->hw.Len) != 0) { DEBUG ((DEBUG_NET, "\n!PXE checksum is not correct.\n")); - goto NiiError; + goto ErrorDeleteSnp; } if ((Pxe->hw.Implementation & PXE_ROMID_IMP_PROMISCUOUS_RX_SUPPORTED) != 0) { @@ -354,31 +401,19 @@ SimpleNetworkDriverStart ( // } else { DEBUG ((DEBUG_NET, "\nUNDI does not have promiscuous or broadcast support.")); - goto NiiError; + goto ErrorDeleteSnp; } // // OK, we like this UNDI, and we know snp is not already there on this handle // Allocate and initialize a new simple network protocol structure. // - Status = PciIo->AllocateBuffer ( - PciIo, - AllocateAnyPages, - EfiBootServicesData, - SNP_MEM_PAGES (sizeof (SNP_DRIVER)), - &Address, - 0 - ); - - if (Status != EFI_SUCCESS) { + Snp = AllocateZeroPool (sizeof (SNP_DRIVER)); + if (Snp == NULL) { DEBUG ((DEBUG_NET, "\nCould not allocate SNP_DRIVER structure.\n")); - goto NiiError; + goto ErrorDeleteSnp; } - Snp = (SNP_DRIVER *)(UINTN)Address; - - ZeroMem (Snp, sizeof (SNP_DRIVER)); - Snp->PciIo = PciIo; Snp->Signature = SNP_DRIVER_SIGNATURE; @@ -408,7 +443,7 @@ SimpleNetworkDriverStart ( Snp->RecycledTxBuf = AllocatePool (sizeof (UINT64) * SNP_TX_BUFFER_INCREASEMENT); if (Snp->RecycledTxBuf == NULL) { Status = EFI_OUT_OF_RESOURCES; - goto Error_DeleteSNP; + goto ErrorDeleteSnp; } Snp->MaxRecycledTxBuf = SNP_TX_BUFFER_INCREASEMENT; @@ -453,18 +488,47 @@ SimpleNetworkDriverStart ( PciIo, AllocateAnyPages, EfiBootServicesData, - SNP_MEM_PAGES (4096), - &Address, + SNP_MEM_PAGES (EFI_PAGE_SIZE), + &Snp->Cpb, + 0 + ); + + if (Status != EFI_SUCCESS) { + DEBUG ((DEBUG_NET, "\nCould not allocate CPB structure.\n")); + goto ErrorDeleteSnp; + } + + Status = PciIo->AllocateBuffer ( + PciIo, + AllocateAnyPages, + EfiBootServicesData, + SNP_MEM_PAGES (EFI_PAGE_SIZE), + &Snp->Db, 0 ); if (Status != EFI_SUCCESS) { - DEBUG ((DEBUG_NET, "\nCould not allocate CPB and DB structures.\n")); - goto Error_DeleteSNP; + DEBUG ((DEBUG_NET, "\nCould not allocate DB structure.\n")); + goto ErrorDeleteSnp; } - Snp->Cpb = (VOID *)(UINTN)Address; - Snp->Db = (VOID *)((UINTN)Address + 2048); + Status = PciIo->AllocateBuffer ( + PciIo, + AllocateAnyPages, + EfiBootServicesData, + SNP_MEM_PAGES (sizeof (PXE_CDB)), + (VOID **)&Snp->Cdb, + 0 + ); + + if (Status != EFI_SUCCESS) { + DEBUG ((DEBUG_NET, "\nCould not allocate CDB structure.\n")); + goto ErrorDeleteSnp; + } + + ZeroMem (Snp->Cpb, EFI_PAGE_SIZE); + ZeroMem (Snp->Db, EFI_PAGE_SIZE); + ZeroMem (Snp->Cdb, sizeof (PXE_CDB)); // // Find the correct BAR to do IO. @@ -487,7 +551,7 @@ SimpleNetworkDriverStart ( if (Status == EFI_UNSUPPORTED) { continue; } else if (EFI_ERROR (Status)) { - goto Error_DeleteSNP; + goto ErrorDeleteSnp; } if ((!FoundMemoryBar) && (BarDesc->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM)) { @@ -508,37 +572,37 @@ SimpleNetworkDriverStart ( Status = PxeStart (Snp); if (Status != EFI_SUCCESS) { - goto Error_DeleteSNP; + goto ErrorDeleteSnp; } - Snp->Cdb.OpCode = PXE_OPCODE_GET_INIT_INFO; - Snp->Cdb.OpFlags = PXE_OPFLAGS_NOT_USED; + Snp->Cdb->OpCode = PXE_OPCODE_GET_INIT_INFO; + Snp->Cdb->OpFlags = PXE_OPFLAGS_NOT_USED; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_DBADDR_NOT_USED; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_DBADDR_NOT_USED; - Snp->Cdb.DBsize = (UINT16)sizeof (Snp->InitInfo); - Snp->Cdb.DBaddr = (UINT64)(UINTN)(&Snp->InitInfo); + Snp->Cdb->DBsize = (UINT16)sizeof (Snp->InitInfo); + Snp->Cdb->DBaddr = (UINT64)(UINTN)(&Snp->InitInfo); - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; DEBUG ((DEBUG_NET, "\nSnp->undi.get_init_info() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); // // Save the INIT Stat Code... // - InitStatFlags = Snp->Cdb.StatFlags; + InitStatFlags = Snp->Cdb->StatFlags; - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { - DEBUG ((DEBUG_NET, "\nSnp->undi.init_info() %xh:%xh\n", Snp->Cdb.StatFlags, Snp->Cdb.StatCode)); + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { + DEBUG ((DEBUG_NET, "\nSnp->undi.init_info() %xh:%xh\n", Snp->Cdb->StatFlags, Snp->Cdb->StatCode)); PxeStop (Snp); - goto Error_DeleteSNP; + goto ErrorDeleteSnp; } // @@ -623,7 +687,7 @@ SimpleNetworkDriverStart ( if (EFI_ERROR (Status)) { PxeStop (Snp); - goto Error_DeleteSNP; + goto ErrorDeleteSnp; } Status = PxeGetStnAddr (Snp); @@ -632,7 +696,7 @@ SimpleNetworkDriverStart ( DEBUG ((DEBUG_ERROR, "\nSnp->undi.get_station_addr() failed.\n")); PxeShutdown (Snp); PxeStop (Snp); - goto Error_DeleteSNP; + goto ErrorDeleteSnp; } Snp->Mode.MediaPresent = FALSE; @@ -663,7 +727,7 @@ SimpleNetworkDriverStart ( &Snp->ExitBootServicesEvent ); if (EFI_ERROR (Status)) { - goto Error_DeleteSNP; + goto ErrorDeleteSnp; } } @@ -681,24 +745,9 @@ SimpleNetworkDriverStart ( return Status; } - PciIo->FreeBuffer ( - PciIo, - SNP_MEM_PAGES (4096), - Snp->Cpb - ); - -Error_DeleteSNP: - - if (Snp->RecycledTxBuf != NULL) { - FreePool (Snp->RecycledTxBuf); - } +ErrorDeleteSnp: + SimpleNetworkDriverFree (Snp); - PciIo->FreeBuffer ( - PciIo, - SNP_MEM_PAGES (sizeof (SNP_DRIVER)), - Snp - ); -NiiError: gBS->CloseProtocol ( Controller, &gEfiNetworkInterfaceIdentifierProtocolGuid_31, @@ -753,7 +802,6 @@ SimpleNetworkDriverStop ( EFI_STATUS Status; EFI_SIMPLE_NETWORK_PROTOCOL *SnpProtocol; SNP_DRIVER *Snp; - EFI_PCI_IO_PROTOCOL *PciIo; // // Get our context back. @@ -773,54 +821,43 @@ SimpleNetworkDriverStop ( Snp = EFI_SIMPLE_NETWORK_DEV_FROM_THIS (SnpProtocol); - Status = gBS->UninstallProtocolInterface ( - Controller, - &gEfiSimpleNetworkProtocolGuid, - &Snp->Snp - ); - - if (EFI_ERROR (Status)) { - return Status; - } - - if (PcdGetBool (PcdSnpCreateExitBootServicesEvent)) { - // - // Close EXIT_BOOT_SERVICES Event - // - gBS->CloseEvent (Snp->ExitBootServicesEvent); - } + if (Snp != NULL) { + Status = gBS->UninstallProtocolInterface ( + Controller, + &gEfiSimpleNetworkProtocolGuid, + &Snp->Snp + ); - Status = gBS->CloseProtocol ( - Controller, - &gEfiNetworkInterfaceIdentifierProtocolGuid_31, - This->DriverBindingHandle, - Controller - ); + if (EFI_ERROR (Status)) { + return Status; + } - Status = gBS->CloseProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - This->DriverBindingHandle, - Controller - ); + if (PcdGetBool (PcdSnpCreateExitBootServicesEvent)) { + // + // Close EXIT_BOOT_SERVICES Event + // + gBS->CloseEvent (Snp->ExitBootServicesEvent); + } - PxeShutdown (Snp); - PxeStop (Snp); + Status = gBS->CloseProtocol ( + Controller, + &gEfiNetworkInterfaceIdentifierProtocolGuid_31, + This->DriverBindingHandle, + Controller + ); - FreePool (Snp->RecycledTxBuf); + Status = gBS->CloseProtocol ( + Controller, + &gEfiDevicePathProtocolGuid, + This->DriverBindingHandle, + Controller + ); - PciIo = Snp->PciIo; - PciIo->FreeBuffer ( - PciIo, - SNP_MEM_PAGES (4096), - Snp->Cpb - ); + PxeShutdown (Snp); + PxeStop (Snp); - PciIo->FreeBuffer ( - PciIo, - SNP_MEM_PAGES (sizeof (SNP_DRIVER)), - Snp - ); + SimpleNetworkDriverFree (Snp); + } return Status; } diff --git a/NetworkPkg/SnpDxe/Snp.h b/NetworkPkg/SnpDxe/Snp.h index d57804ca2873..74fc3cda40f5 100644 --- a/NetworkPkg/SnpDxe/Snp.h +++ b/NetworkPkg/SnpDxe/Snp.h @@ -100,7 +100,7 @@ typedef struct { // Buffers for command descriptor block, command parameter block // and data block. // - PXE_CDB Cdb; + PXE_CDB *Cdb; VOID *Cpb; VOID *CpbUnmap; VOID *Db; diff --git a/NetworkPkg/SnpDxe/Start.c b/NetworkPkg/SnpDxe/Start.c index 514582b9b971..bd59a573544c 100644 --- a/NetworkPkg/SnpDxe/Start.c +++ b/NetworkPkg/SnpDxe/Start.c @@ -24,28 +24,33 @@ PxeStart ( { PXE_CPB_START_31 *Cpb31; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + Cpb31 = Snp->Cpb; // // Initialize UNDI Start CDB for H/W UNDI // - Snp->Cdb.OpCode = PXE_OPCODE_START; - Snp->Cdb.OpFlags = PXE_OPFLAGS_NOT_USED; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->OpCode = PXE_OPCODE_START; + Snp->Cdb->OpFlags = PXE_OPFLAGS_NOT_USED; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->DBsize = PXE_DBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->DBaddr = PXE_DBADDR_NOT_USED; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Make changes to H/W UNDI Start CDB if this is // a S/W UNDI. // if (Snp->IsSwUndi) { - Snp->Cdb.CPBsize = (UINT16)sizeof (PXE_CPB_START_31); - Snp->Cdb.CPBaddr = (UINT64)(UINTN)Cpb31; + Snp->Cdb->CPBsize = (UINT16)sizeof (PXE_CPB_START_31); + Snp->Cdb->CPBaddr = (UINT64)(UINTN)Cpb31; Cpb31->Delay = (UINT64)(UINTN)&SnpUndi32CallbackDelay; Cpb31->Block = (UINT64)(UINTN)&SnpUndi32CallbackBlock; @@ -68,17 +73,17 @@ PxeStart ( // DEBUG ((DEBUG_NET, "\nsnp->undi.start() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { // // UNDI could not be started. Return UNDI error. // DEBUG ( (DEBUG_ERROR, "\nsnp->undi.start() %xh:%xh\n", - Snp->Cdb.StatCode, - Snp->Cdb.StatFlags) + Snp->Cdb->StatCode, + Snp->Cdb->StatFlags) ); return EFI_DEVICE_ERROR; diff --git a/NetworkPkg/SnpDxe/Station_address.c b/NetworkPkg/SnpDxe/Station_address.c index 66ddbf683114..7411be907fd4 100644 --- a/NetworkPkg/SnpDxe/Station_address.c +++ b/NetworkPkg/SnpDxe/Station_address.c @@ -25,34 +25,39 @@ PxeGetStnAddr ( { PXE_DB_STATION_ADDRESS *Db; - Db = Snp->Db; - Snp->Cdb.OpCode = PXE_OPCODE_STATION_ADDRESS; - Snp->Cdb.OpFlags = PXE_OPFLAGS_STATION_ADDRESS_READ; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + + Db = Snp->Db; + Snp->Cdb->OpCode = PXE_OPCODE_STATION_ADDRESS; + Snp->Cdb->OpFlags = PXE_OPFLAGS_STATION_ADDRESS_READ; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.DBsize = (UINT16)sizeof (PXE_DB_STATION_ADDRESS); - Snp->Cdb.DBaddr = (UINT64)(UINTN)Db; + Snp->Cdb->DBsize = (UINT16)sizeof (PXE_DB_STATION_ADDRESS); + Snp->Cdb->DBaddr = (UINT64)(UINTN)Db; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command and check result. // DEBUG ((DEBUG_NET, "\nsnp->undi.station_addr() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { DEBUG ( (DEBUG_ERROR, "\nsnp->undi.station_addr() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_DEVICE_ERROR; @@ -101,46 +106,51 @@ PxeSetStnAddr ( PXE_CPB_STATION_ADDRESS *Cpb; PXE_DB_STATION_ADDRESS *Db; - Cpb = Snp->Cpb; - Db = Snp->Db; - Snp->Cdb.OpCode = PXE_OPCODE_STATION_ADDRESS; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + + Cpb = Snp->Cpb; + Db = Snp->Db; + Snp->Cdb->OpCode = PXE_OPCODE_STATION_ADDRESS; if (NewMacAddr == NULL) { - Snp->Cdb.OpFlags = PXE_OPFLAGS_STATION_ADDRESS_RESET; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->OpFlags = PXE_OPFLAGS_STATION_ADDRESS_RESET; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; } else { - Snp->Cdb.OpFlags = PXE_OPFLAGS_STATION_ADDRESS_WRITE; + Snp->Cdb->OpFlags = PXE_OPFLAGS_STATION_ADDRESS_WRITE; // // Supplying a new address in the CPB will make undi change the mac address to the new one. // CopyMem (&Cpb->StationAddr, NewMacAddr, Snp->Mode.HwAddressSize); - Snp->Cdb.CPBsize = (UINT16)sizeof (PXE_CPB_STATION_ADDRESS); - Snp->Cdb.CPBaddr = (UINT64)(UINTN)Cpb; + Snp->Cdb->CPBsize = (UINT16)sizeof (PXE_CPB_STATION_ADDRESS); + Snp->Cdb->CPBaddr = (UINT64)(UINTN)Cpb; } - Snp->Cdb.DBsize = (UINT16)sizeof (PXE_DB_STATION_ADDRESS); - Snp->Cdb.DBaddr = (UINT64)(UINTN)Db; + Snp->Cdb->DBsize = (UINT16)sizeof (PXE_DB_STATION_ADDRESS); + Snp->Cdb->DBaddr = (UINT64)(UINTN)Db; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command and check result. // DEBUG ((DEBUG_NET, "\nsnp->undi.station_addr() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { DEBUG ( (DEBUG_ERROR, "\nsnp->undi.station_addr() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); // diff --git a/NetworkPkg/SnpDxe/Statistics.c b/NetworkPkg/SnpDxe/Statistics.c index 34d133252300..97ce1ddf538e 100644 --- a/NetworkPkg/SnpDxe/Statistics.c +++ b/NetworkPkg/SnpDxe/Statistics.c @@ -82,6 +82,11 @@ SnpUndi32Statistics ( Snp = EFI_SIMPLE_NETWORK_DEV_FROM_THIS (This); + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + OldTpl = gBS->RaiseTPL (TPL_CALLBACK); // @@ -112,23 +117,23 @@ SnpUndi32Statistics ( // // Initialize UNDI Statistics CDB // - Snp->Cdb.OpCode = PXE_OPCODE_STATISTICS; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->OpCode = PXE_OPCODE_STATISTICS; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; if (Reset) { - Snp->Cdb.OpFlags = PXE_OPFLAGS_STATISTICS_RESET; - Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED; - Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED; - Db = Snp->Db; + Snp->Cdb->OpFlags = PXE_OPFLAGS_STATISTICS_RESET; + Snp->Cdb->DBsize = PXE_DBSIZE_NOT_USED; + Snp->Cdb->DBaddr = PXE_DBADDR_NOT_USED; + Db = Snp->Db; } else { - Snp->Cdb.OpFlags = PXE_OPFLAGS_STATISTICS_READ; - Snp->Cdb.DBsize = (UINT16)sizeof (PXE_DB_STATISTICS); - Snp->Cdb.DBaddr = (UINT64)(UINTN)(Db = Snp->Db); + Snp->Cdb->OpFlags = PXE_OPFLAGS_STATISTICS_READ; + Snp->Cdb->DBsize = (UINT16)sizeof (PXE_DB_STATISTICS); + Snp->Cdb->DBaddr = (UINT64)(UINTN)(Db = Snp->Db); } // @@ -136,9 +141,9 @@ SnpUndi32Statistics ( // DEBUG ((DEBUG_NET, "\nsnp->undi.statistics() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - switch (Snp->Cdb.StatCode) { + switch (Snp->Cdb->StatCode) { case PXE_STATCODE_SUCCESS: break; @@ -146,8 +151,8 @@ SnpUndi32Statistics ( DEBUG ( (DEBUG_ERROR, "\nsnp->undi.statistics() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); Status = EFI_UNSUPPORTED; @@ -157,8 +162,8 @@ SnpUndi32Statistics ( DEBUG ( (DEBUG_ERROR, "\nsnp->undi.statistics() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); Status = EFI_DEVICE_ERROR; diff --git a/NetworkPkg/SnpDxe/Stop.c b/NetworkPkg/SnpDxe/Stop.c index a3ce530feafd..e3ef79f4adc8 100644 --- a/NetworkPkg/SnpDxe/Stop.c +++ b/NetworkPkg/SnpDxe/Stop.c @@ -22,30 +22,35 @@ PxeStop ( SNP_DRIVER *Snp ) { - Snp->Cdb.OpCode = PXE_OPCODE_STOP; - Snp->Cdb.OpFlags = PXE_OPFLAGS_NOT_USED; - Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED; - Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + + Snp->Cdb->OpCode = PXE_OPCODE_STOP; + Snp->Cdb->OpFlags = PXE_OPFLAGS_NOT_USED; + Snp->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + Snp->Cdb->DBsize = PXE_DBSIZE_NOT_USED; + Snp->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + Snp->Cdb->DBaddr = PXE_DBADDR_NOT_USED; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command // DEBUG ((DEBUG_NET, "\nsnp->undi.stop() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) { + if (Snp->Cdb->StatCode != PXE_STATCODE_SUCCESS) { DEBUG ( (DEBUG_WARN, "\nsnp->undi.stop() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_DEVICE_ERROR; diff --git a/NetworkPkg/SnpDxe/Transmit.c b/NetworkPkg/SnpDxe/Transmit.c index 7947cde4368c..a08c30901225 100644 --- a/NetworkPkg/SnpDxe/Transmit.c +++ b/NetworkPkg/SnpDxe/Transmit.c @@ -38,6 +38,11 @@ PxeFillHeader ( { PXE_CPB_FILL_HEADER_FRAGMENTED *Cpb; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + Cpb = Snp->Cpb; if (SrcAddr != NULL) { CopyMem ( @@ -77,28 +82,28 @@ PxeFillHeader ( Cpb->FragDesc[0].reserved = Cpb->FragDesc[1].reserved = 0; - Snp->Cdb.OpCode = PXE_OPCODE_FILL_HEADER; - Snp->Cdb.OpFlags = PXE_OPFLAGS_FILL_HEADER_FRAGMENTED; + Snp->Cdb->OpCode = PXE_OPCODE_FILL_HEADER; + Snp->Cdb->OpFlags = PXE_OPFLAGS_FILL_HEADER_FRAGMENTED; - Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED; - Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED; + Snp->Cdb->DBsize = PXE_DBSIZE_NOT_USED; + Snp->Cdb->DBaddr = PXE_DBADDR_NOT_USED; - Snp->Cdb.CPBsize = (UINT16)sizeof (PXE_CPB_FILL_HEADER_FRAGMENTED); - Snp->Cdb.CPBaddr = (UINT64)(UINTN)Cpb; + Snp->Cdb->CPBsize = (UINT16)sizeof (PXE_CPB_FILL_HEADER_FRAGMENTED); + Snp->Cdb->CPBaddr = (UINT64)(UINTN)Cpb; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command and check result. // DEBUG ((DEBUG_NET, "\nSnp->undi.fill_header() ")); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); - switch (Snp->Cdb.StatCode) { + switch (Snp->Cdb->StatCode) { case PXE_STATCODE_SUCCESS: return EFI_SUCCESS; @@ -106,8 +111,8 @@ PxeFillHeader ( DEBUG ( (DEBUG_ERROR, "\nSnp->undi.fill_header() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_INVALID_PARAMETER; @@ -116,8 +121,8 @@ PxeFillHeader ( DEBUG ( (DEBUG_ERROR, "\nSnp->undi.fill_header() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); return EFI_DEVICE_ERROR; @@ -145,6 +150,11 @@ PxeTransmit ( PXE_CPB_TRANSMIT *Cpb; EFI_STATUS Status; + if (Snp->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return EFI_DEVICE_ERROR; + } + Cpb = Snp->Cpb; Cpb->FrameAddr = (UINT64)(UINTN)Buffer; Cpb->DataLen = (UINT32)BufferSize; @@ -152,37 +162,37 @@ PxeTransmit ( Cpb->MediaheaderLen = 0; Cpb->reserved = 0; - Snp->Cdb.OpFlags = PXE_OPFLAGS_TRANSMIT_WHOLE; + Snp->Cdb->OpFlags = PXE_OPFLAGS_TRANSMIT_WHOLE; - Snp->Cdb.CPBsize = (UINT16)sizeof (PXE_CPB_TRANSMIT); - Snp->Cdb.CPBaddr = (UINT64)(UINTN)Cpb; + Snp->Cdb->CPBsize = (UINT16)sizeof (PXE_CPB_TRANSMIT); + Snp->Cdb->CPBaddr = (UINT64)(UINTN)Cpb; - Snp->Cdb.OpCode = PXE_OPCODE_TRANSMIT; - Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED; - Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED; + Snp->Cdb->OpCode = PXE_OPCODE_TRANSMIT; + Snp->Cdb->DBsize = PXE_DBSIZE_NOT_USED; + Snp->Cdb->DBaddr = PXE_DBADDR_NOT_USED; - Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - Snp->Cdb.IFnum = Snp->IfNum; - Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + Snp->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + Snp->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + Snp->Cdb->IFnum = Snp->IfNum; + Snp->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Issue UNDI command and check result. // DEBUG ((DEBUG_NET, "\nSnp->undi.transmit() ")); - DEBUG ((DEBUG_NET, "\nSnp->Cdb.OpCode == %x", Snp->Cdb.OpCode)); - DEBUG ((DEBUG_NET, "\nSnp->Cdb.CPBaddr == %LX", Snp->Cdb.CPBaddr)); - DEBUG ((DEBUG_NET, "\nSnp->Cdb.DBaddr == %LX", Snp->Cdb.DBaddr)); + DEBUG ((DEBUG_NET, "\nSnp->Cdb->OpCode == %x", Snp->Cdb->OpCode)); + DEBUG ((DEBUG_NET, "\nSnp->Cdb->CPBaddr == %LX", Snp->Cdb->CPBaddr)); + DEBUG ((DEBUG_NET, "\nSnp->Cdb->DBaddr == %LX", Snp->Cdb->DBaddr)); DEBUG ((DEBUG_NET, "\nCpb->FrameAddr == %LX\n", Cpb->FrameAddr)); - (*Snp->IssueUndi32Command)((UINT64)(UINTN)&Snp->Cdb); + (*Snp->IssueUndi32Command)((UINT64)(UINTN)Snp->Cdb); DEBUG ((DEBUG_NET, "\nexit Snp->undi.transmit() ")); // // we will unmap the buffers in get_status call, not here // - switch (Snp->Cdb.StatCode) { + switch (Snp->Cdb->StatCode) { case PXE_STATCODE_SUCCESS: return EFI_SUCCESS; @@ -193,8 +203,8 @@ PxeTransmit ( DEBUG ( (DEBUG_NET, "\nSnp->undi.transmit() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); break; @@ -202,8 +212,8 @@ PxeTransmit ( DEBUG ( (DEBUG_ERROR, "\nSnp->undi.transmit() %xh:%xh\n", - Snp->Cdb.StatFlags, - Snp->Cdb.StatCode) + Snp->Cdb->StatFlags, + Snp->Cdb->StatCode) ); Status = EFI_DEVICE_ERROR; } diff --git a/NetworkPkg/SnpDxe/WaitForPacket.c b/NetworkPkg/SnpDxe/WaitForPacket.c index f0e904123876..999399d091ef 100644 --- a/NetworkPkg/SnpDxe/WaitForPacket.c +++ b/NetworkPkg/SnpDxe/WaitForPacket.c @@ -31,6 +31,11 @@ SnpWaitForPacketNotify ( return; } + if (((SNP_DRIVER *)SnpPtr)->Cdb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Snp->Cdb is NULL\n", __func__)); + return; + } + // // Do nothing if the SNP interface is not initialized. // @@ -47,16 +52,16 @@ SnpWaitForPacketNotify ( // // Fill in CDB for UNDI GetStatus(). // - ((SNP_DRIVER *)SnpPtr)->Cdb.OpCode = PXE_OPCODE_GET_STATUS; - ((SNP_DRIVER *)SnpPtr)->Cdb.OpFlags = 0; - ((SNP_DRIVER *)SnpPtr)->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED; - ((SNP_DRIVER *)SnpPtr)->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED; - ((SNP_DRIVER *)SnpPtr)->Cdb.DBsize = (UINT16)(sizeof (UINT32) * 2); - ((SNP_DRIVER *)SnpPtr)->Cdb.DBaddr = (UINT64)(UINTN)(((SNP_DRIVER *)SnpPtr)->Db); - ((SNP_DRIVER *)SnpPtr)->Cdb.StatCode = PXE_STATCODE_INITIALIZE; - ((SNP_DRIVER *)SnpPtr)->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; - ((SNP_DRIVER *)SnpPtr)->Cdb.IFnum = ((SNP_DRIVER *)SnpPtr)->IfNum; - ((SNP_DRIVER *)SnpPtr)->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; + ((SNP_DRIVER *)SnpPtr)->Cdb->OpCode = PXE_OPCODE_GET_STATUS; + ((SNP_DRIVER *)SnpPtr)->Cdb->OpFlags = 0; + ((SNP_DRIVER *)SnpPtr)->Cdb->CPBsize = PXE_CPBSIZE_NOT_USED; + ((SNP_DRIVER *)SnpPtr)->Cdb->CPBaddr = PXE_CPBADDR_NOT_USED; + ((SNP_DRIVER *)SnpPtr)->Cdb->DBsize = (UINT16)(sizeof (UINT32) * 2); + ((SNP_DRIVER *)SnpPtr)->Cdb->DBaddr = (UINT64)(UINTN)(((SNP_DRIVER *)SnpPtr)->Db); + ((SNP_DRIVER *)SnpPtr)->Cdb->StatCode = PXE_STATCODE_INITIALIZE; + ((SNP_DRIVER *)SnpPtr)->Cdb->StatFlags = PXE_STATFLAGS_INITIALIZE; + ((SNP_DRIVER *)SnpPtr)->Cdb->IFnum = ((SNP_DRIVER *)SnpPtr)->IfNum; + ((SNP_DRIVER *)SnpPtr)->Cdb->Control = PXE_CONTROL_LAST_CDB_IN_LIST; // // Clear contents of DB buffer. @@ -66,9 +71,9 @@ SnpWaitForPacketNotify ( // // Issue UNDI command and check result. // - (*((SNP_DRIVER *)SnpPtr)->IssueUndi32Command)((UINT64)(UINTN)&((SNP_DRIVER *)SnpPtr)->Cdb); + (*((SNP_DRIVER *)SnpPtr)->IssueUndi32Command)((UINT64)(UINTN)((SNP_DRIVER *)SnpPtr)->Cdb); - if (((SNP_DRIVER *)SnpPtr)->Cdb.StatCode != EFI_SUCCESS) { + if (((SNP_DRIVER *)SnpPtr)->Cdb->StatCode != EFI_SUCCESS) { return; } From d145aef952ebbce9464e9f9d177912f6e67bea7f Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 29 Oct 2025 08:55:05 -0700 Subject: [PATCH 0713/1172] MdeModulePkg/Core/Dxe: Fix TPL inversion from DEBUG() message PR #11443 introduced a regression by adding a DEBUG() message when the lock for events is acquired and that lock is at TPL_HIGH_LEVEL. If DEBUG() messages are routed through Report Status Code, and the Report Status Code Protocol has not been located yet, then a call to gBS->LocateProtocol() is made and that call raises TPL to TPL_NOTIFY which causes a TPL inversion. The event lock is used to atomically update gEventSignalQueue. There is no need for the DEBUG() message to within the event lock scope. The fix is to scope the event lock to only the InsertHeadList() call to update gEventSignalQueue. Signed-off-by: Michael D Kinney --- MdeModulePkg/Core/Dxe/Event/Event.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Event/Event.c b/MdeModulePkg/Core/Dxe/Event/Event.c index dae8e98980cf..b5f7d0683f97 100644 --- a/MdeModulePkg/Core/Dxe/Event/Event.c +++ b/MdeModulePkg/Core/Dxe/Event/Event.c @@ -491,8 +491,6 @@ CoreCreateEventInternal ( InsertTailList (&gRuntime->EventHead, &IEvent->RuntimeData.Link); } - CoreAcquireEventLock (); - if ((Type & EVT_NOTIFY_SIGNAL) != 0) { if (!IsZeroGuid (&IEvent->EventGroup) && !CompareGuid (&IEvent->EventGroup, &gIdleLoopEventGuid)) { DEBUG ((DEBUG_EVENT, "Register Event Group Notify: %g (%p)\n", &IEvent->EventGroup, IEvent->NotifyFunction)); @@ -501,10 +499,12 @@ CoreCreateEventInternal ( // // The Event's NotifyFunction must be queued whenever the event is signaled // + CoreAcquireEventLock (); + InsertHeadList (&gEventSignalQueue, &IEvent->SignalLink); - } - CoreReleaseEventLock (); + CoreReleaseEventLock (); + } // // Done From 29a66468cbabe602c29e770f4382a5979b2d2304 Mon Sep 17 00:00:00 2001 From: Zhiguang Liu Date: Fri, 17 Oct 2025 11:51:44 +0800 Subject: [PATCH 0714/1172] MdePkg: Copy FvLib to MdePkg Copy FvLib from StandaloneMmPkg to MdePkg because it is a common library. Future steps will include: 1. Modify platform code including Edk2Platforms repo to use FvLib from MdePkg. 2. Remove FvLib from StandaloneMmPkg Signed-off-by: Zhiguang Liu --- MdePkg/Include/Library/FvLib.h | 104 +++++++++ MdePkg/Library/FvLib/FvLib.c | 405 +++++++++++++++++++++++++++++++++ MdePkg/Library/FvLib/FvLib.inf | 51 +++++ MdePkg/MdeLibs.dsc.inc | 1 + MdePkg/MdePkg.dec | 3 + MdePkg/MdePkg.dsc | 1 + 6 files changed, 565 insertions(+) create mode 100644 MdePkg/Include/Library/FvLib.h create mode 100644 MdePkg/Library/FvLib/FvLib.c create mode 100644 MdePkg/Library/FvLib/FvLib.inf diff --git a/MdePkg/Include/Library/FvLib.h b/MdePkg/Include/Library/FvLib.h new file mode 100644 index 000000000000..3b603e473d19 --- /dev/null +++ b/MdePkg/Include/Library/FvLib.h @@ -0,0 +1,104 @@ +/** @file + +Copyright (c) 2015, Intel Corporation. All rights reserved.
    +Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
    + +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _FV_LIB_H_ +#define _FV_LIB_H_ + +#include +#include +#include + +/** + Given the input file pointer, search for the next matching file in the + FFS volume as defined by SearchType. The search starts from FileHeader inside + the Firmware Volume defined by FwVolHeader. + + @param SearchType Filter to find only files of this type. + Type EFI_FV_FILETYPE_ALL causes no filtering to be done. + @param FwVolHeader Pointer to the FV header of the volume to search. + This parameter must point to a valid FFS volume. + @param FileHeader Pointer to the current file from which to begin searching. + This pointer will be updated upon return to reflect the file found. + + @retval EFI_NOT_FOUND No files matching the search criteria were found + @retval EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +FfsFindNextFile ( + IN EFI_FV_FILETYPE SearchType, + IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader, + IN OUT EFI_FFS_FILE_HEADER **FileHeader + ); + +/** + Given the input file pointer, search for the next matching section in the + FFS volume. + + @param SearchType Filter to find only sections of this type. + @param FfsFileHeader Pointer to the current file to search. + @param SectionHeader Pointer to the Section matching SectionType in FfsFileHeader. + NULL if section not found + + @retval EFI_NOT_FOUND No files matching the search criteria were found + @retval EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +FfsFindSection ( + IN EFI_SECTION_TYPE SectionType, + IN EFI_FFS_FILE_HEADER *FfsFileHeader, + IN OUT EFI_COMMON_SECTION_HEADER **SectionHeader + ); + +/** + Locates a section within a series of sections + with the specified section type. + + @param[in] Sections The sections to search + @param[in] SizeOfSections Total size of all sections + @param[in] SectionType The section type to locate + @param[out] FoundSection The FFS section if found + + @retval EFI_SUCCESS The file and section was found + @retval EFI_NOT_FOUND The file and section was not found + @retval EFI_VOLUME_CORRUPTED The firmware volume was corrupted +**/ +EFI_STATUS +EFIAPI +FindFfsSectionInSections ( + IN VOID *Sections, + IN UINTN SizeOfSections, + IN EFI_SECTION_TYPE SectionType, + OUT EFI_COMMON_SECTION_HEADER **FoundSection + ); + +/** + Given the input file pointer, search for the next matching section in the + FFS volume. + + @param SearchType Filter to find only sections of this type. + @param FfsFileHeader Pointer to the current file to search. + @param SectionData Pointer to the Section matching SectionType in FfsFileHeader. + NULL if section not found + @param SectionDataSize The size of SectionData, excluding the section header. + + @retval EFI_NOT_FOUND No files matching the search criteria were found + @retval EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +FfsFindSectionData ( + IN EFI_SECTION_TYPE SectionType, + IN EFI_FFS_FILE_HEADER *FfsFileHeader, + OUT VOID **SectionData, + OUT UINTN *SectionDataSize + ); + +#endif diff --git a/MdePkg/Library/FvLib/FvLib.c b/MdePkg/Library/FvLib/FvLib.c new file mode 100644 index 000000000000..2faa7cd054f7 --- /dev/null +++ b/MdePkg/Library/FvLib/FvLib.c @@ -0,0 +1,405 @@ +/** @file + +Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.
    +Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
    + +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#include +#include +#include + +#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \ + (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1)) + +/** + Returns the highest bit set of the State field + + @param ErasePolarity Erase Polarity as defined by EFI_FVB_ERASE_POLARITY + in the Attributes field. + @param FfsHeader Pointer to FFS File Header. + + @return the highest bit in the State field +**/ +EFI_FFS_FILE_STATE +GetFileState ( + IN UINT8 ErasePolarity, + IN EFI_FFS_FILE_HEADER *FfsHeader + ) +{ + EFI_FFS_FILE_STATE FileState; + EFI_FFS_FILE_STATE HighestBit; + + FileState = FfsHeader->State; + + if (ErasePolarity != 0) { + FileState = (EFI_FFS_FILE_STATE) ~FileState; + } + + HighestBit = 0x80; + while (HighestBit != 0 && (HighestBit & FileState) == 0) { + HighestBit >>= 1; + } + + return HighestBit; +} + +/** + Calculates the checksum of the header of a file. + + @param FileHeader Pointer to FFS File Header. + + @return Checksum of the header. +**/ +UINT8 +CalculateHeaderChecksum ( + IN EFI_FFS_FILE_HEADER *FileHeader + ) +{ + UINT8 *ptr; + UINTN Index; + UINT8 Sum; + UINTN Size; + + Sum = 0; + ptr = (UINT8 *)FileHeader; + Size = IS_FFS_FILE2 (FileHeader) ? sizeof (EFI_FFS_FILE_HEADER2) : sizeof (EFI_FFS_FILE_HEADER); + + for (Index = 0; Index < Size - 3; Index += 4) { + Sum = (UINT8)(Sum + ptr[Index]); + Sum = (UINT8)(Sum + ptr[Index + 1]); + Sum = (UINT8)(Sum + ptr[Index + 2]); + Sum = (UINT8)(Sum + ptr[Index + 3]); + } + + for ( ; Index < Size; Index++) { + Sum = (UINT8)(Sum + ptr[Index]); + } + + // + // State field (since this indicates the different state of file). + // + Sum = (UINT8)(Sum - FileHeader->State); + // + // Checksum field of the file is not part of the header checksum. + // + Sum = (UINT8)(Sum - FileHeader->IntegrityCheck.Checksum.File); + + return Sum; +} + +/** + Given the input file pointer, search for the next matching file in the + FFS volume as defined by SearchType. The search starts from FileHeader inside + the Firmware Volume defined by FwVolHeader. + + @param SearchType Filter to find only files of this type. + Type EFI_FV_FILETYPE_ALL causes no filtering to be done. + @param FwVolHeader Pointer to the FV header of the volume to search. + This parameter must point to a valid FFS volume. + @param FileHeader Pointer to the current file from which to begin searching. + This pointer will be updated upon return to reflect the file found. + + @retval EFI_NOT_FOUND No files matching the search criteria were found + @retval EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +FfsFindNextFile ( + IN EFI_FV_FILETYPE SearchType, + IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader, + IN OUT EFI_FFS_FILE_HEADER **FileHeader + ) +{ + EFI_FIRMWARE_VOLUME_EXT_HEADER *FvExtHeader; + + EFI_FFS_FILE_HEADER *FfsFileHeader; + UINT32 FileLength; + UINT32 FileOccupiedSize; + UINT32 FileOffset; + UINT64 FvLength; + UINT8 ErasePolarity; + UINT8 FileState; + + FvLength = FwVolHeader->FvLength; + if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) { + ErasePolarity = 1; + } else { + ErasePolarity = 0; + } + + // + // If FileHeader is not specified (NULL) start with the first file in the + // firmware volume. Otherwise, start from the FileHeader. + // + if (*FileHeader == NULL) { + if (FwVolHeader->ExtHeaderOffset != 0) { + FvExtHeader = (EFI_FIRMWARE_VOLUME_EXT_HEADER *)((UINT8 *)FwVolHeader + + FwVolHeader->ExtHeaderOffset); + + FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FvExtHeader + + FvExtHeader->ExtHeaderSize); + } else { + FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FwVolHeader + + FwVolHeader->HeaderLength); + } + + FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINTN)FwVolHeader + + ALIGN_VALUE ( + (UINTN)FfsFileHeader - + (UINTN)FwVolHeader, + 8 + )); + } else { + // + // Length is 24 bits wide so mask upper 8 bits + // FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned. + // + FileLength = IS_FFS_FILE2 (*FileHeader) ? + FFS_FILE2_SIZE (*FileHeader) : FFS_FILE_SIZE (*FileHeader); + FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8); + FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)*FileHeader + FileOccupiedSize); + } + + FileOffset = (UINT32)((UINT8 *)FfsFileHeader - (UINT8 *)FwVolHeader); + + while ((UINT64)FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) { + // + // Get FileState which is the highest bit of the State + // + FileState = GetFileState (ErasePolarity, FfsFileHeader); + + switch (FileState) { + case EFI_FILE_HEADER_INVALID: + if (IS_FFS_FILE2 (FfsFileHeader)) { + FileOffset += sizeof (EFI_FFS_FILE_HEADER2); + FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER2)); + } else { + FileOffset += sizeof (EFI_FFS_FILE_HEADER); + FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER)); + } + + break; + + case EFI_FILE_DATA_VALID: + case EFI_FILE_MARKED_FOR_UPDATE: + if (CalculateHeaderChecksum (FfsFileHeader) == 0) { + FileLength = IS_FFS_FILE2 (FfsFileHeader) ? + FFS_FILE2_SIZE (FfsFileHeader) : FFS_FILE_SIZE (FfsFileHeader); + FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8); + + if ((SearchType == FfsFileHeader->Type) || (SearchType == EFI_FV_FILETYPE_ALL)) { + *FileHeader = FfsFileHeader; + + return EFI_SUCCESS; + } + + FileOffset += FileOccupiedSize; + FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize); + } else { + return EFI_NOT_FOUND; + } + + break; + + case EFI_FILE_DELETED: + FileLength = IS_FFS_FILE2 (FfsFileHeader) ? + FFS_FILE2_SIZE (FfsFileHeader) : FFS_FILE_SIZE (FfsFileHeader); + FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8); + FileOffset += FileOccupiedSize; + FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize); + break; + + default: + return EFI_NOT_FOUND; + } + } + + return EFI_NOT_FOUND; +} + +/** + Locates a section within a series of sections + with the specified section type. + + @param[in] Sections The sections to search + @param[in] SizeOfSections Total size of all sections + @param[in] SectionType The section type to locate + @param[out] FoundSection The FFS section if found + + @retval EFI_SUCCESS The file and section was found + @retval EFI_NOT_FOUND The file and section was not found + @retval EFI_VOLUME_CORRUPTED The firmware volume was corrupted +**/ +EFI_STATUS +EFIAPI +FindFfsSectionInSections ( + IN VOID *Sections, + IN UINTN SizeOfSections, + IN EFI_SECTION_TYPE SectionType, + OUT EFI_COMMON_SECTION_HEADER **FoundSection + ) +{ + EFI_PHYSICAL_ADDRESS CurrentAddress; + UINT32 Size; + EFI_PHYSICAL_ADDRESS EndOfSections; + EFI_COMMON_SECTION_HEADER *Section; + EFI_PHYSICAL_ADDRESS EndOfSection; + + // + // Loop through the FFS file sections + // + EndOfSection = (EFI_PHYSICAL_ADDRESS)(UINTN)Sections; + EndOfSections = EndOfSection + SizeOfSections; + for ( ; ;) { + if (EndOfSection == EndOfSections) { + break; + } + + CurrentAddress = EndOfSection; + + Section = (EFI_COMMON_SECTION_HEADER *)(UINTN)CurrentAddress; + + Size = IS_SECTION2 (Section) ? SECTION2_SIZE (Section) : SECTION_SIZE (Section); + if (Size < sizeof (*Section)) { + return EFI_VOLUME_CORRUPTED; + } + + EndOfSection = CurrentAddress + Size; + if (EndOfSection > EndOfSections) { + return EFI_VOLUME_CORRUPTED; + } + + Size = GET_OCCUPIED_SIZE (Size, 4); + + // + // Look for the requested section type + // + if (Section->Type == SectionType) { + *FoundSection = Section; + return EFI_SUCCESS; + } + } + + return EFI_NOT_FOUND; +} + +/** + Given the input file pointer, search for the next matching section in the + FFS volume. + + @param SearchType Filter to find only sections of this type. + @param FfsFileHeader Pointer to the current file to search. + @param SectionHeader Pointer to the Section matching SectionType in FfsFileHeader. + NULL if section not found + + @retval EFI_NOT_FOUND No files matching the search criteria were found + @retval EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +FfsFindSection ( + IN EFI_SECTION_TYPE SectionType, + IN EFI_FFS_FILE_HEADER *FfsFileHeader, + IN OUT EFI_COMMON_SECTION_HEADER **SectionHeader + ) +{ + UINT32 FileSize; + EFI_COMMON_SECTION_HEADER *Section; + EFI_STATUS Status; + + // + // Size is 24 bits wide so mask upper 8 bits. + // Does not include FfsFileHeader header size + // FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned. + // + if (IS_FFS_FILE2 (FfsFileHeader)) { + Section = (EFI_COMMON_SECTION_HEADER *)((EFI_FFS_FILE_HEADER2 *)FfsFileHeader + 1); + FileSize = FFS_FILE2_SIZE (FfsFileHeader) - sizeof (EFI_FFS_FILE_HEADER2); + } else { + Section = (EFI_COMMON_SECTION_HEADER *)(FfsFileHeader + 1); + FileSize = FFS_FILE_SIZE (FfsFileHeader) - sizeof (EFI_FFS_FILE_HEADER); + } + + Status = FindFfsSectionInSections ( + Section, + FileSize, + SectionType, + SectionHeader + ); + return Status; +} + +/** + Given the input file pointer, search for the next matching section in the + FFS volume. + + @param[in] SectionType Filter to find only sections of this type. + @param[in] FfsFileHeader Pointer to the current file to search. + @param[in,out] SectionData Pointer to the Section matching SectionType in FfsFileHeader. + NULL if section not found + @param[in,out] SectionDataSize The size of SectionData, excluding the section header. + + @retval EFI_NOT_FOUND No files matching the search criteria were found + @retval EFI_SUCCESS +**/ +EFI_STATUS +EFIAPI +FfsFindSectionData ( + IN EFI_SECTION_TYPE SectionType, + IN EFI_FFS_FILE_HEADER *FfsFileHeader, + IN OUT VOID **SectionData, + IN OUT UINTN *SectionDataSize + ) +{ + UINT32 FileSize; + EFI_COMMON_SECTION_HEADER *Section; + UINT32 SectionLength; + UINT32 ParsedLength; + + // + // Size is 24 bits wide so mask upper 8 bits. + // Does not include FfsFileHeader header size + // FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned. + // + if (IS_FFS_FILE2 (FfsFileHeader)) { + Section = (EFI_COMMON_SECTION_HEADER *)((EFI_FFS_FILE_HEADER2 *)FfsFileHeader + 1); + FileSize = FFS_FILE2_SIZE (FfsFileHeader) - sizeof (EFI_FFS_FILE_HEADER2); + } else { + Section = (EFI_COMMON_SECTION_HEADER *)(FfsFileHeader + 1); + FileSize = FFS_FILE_SIZE (FfsFileHeader) - sizeof (EFI_FFS_FILE_HEADER); + } + + *SectionData = NULL; + ParsedLength = 0; + while (ParsedLength < FileSize) { + if (Section->Type == SectionType) { + if (IS_SECTION2 (Section)) { + *SectionData = (VOID *)((EFI_COMMON_SECTION_HEADER2 *)Section + 1); + *SectionDataSize = SECTION2_SIZE (Section) - sizeof (EFI_COMMON_SECTION_HEADER2); + } else { + *SectionData = (VOID *)(Section + 1); + *SectionDataSize = SECTION_SIZE (Section) - sizeof (EFI_COMMON_SECTION_HEADER); + } + + return EFI_SUCCESS; + } + + // + // Size is 24 bits wide so mask upper 8 bits. + // SectionLength is adjusted it is 4 byte aligned. + // Go to the next section + // + SectionLength = IS_SECTION2 (Section) ? SECTION2_SIZE (Section) : SECTION_SIZE (Section); + SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4); + + ParsedLength += SectionLength; + Section = (EFI_COMMON_SECTION_HEADER *)((UINT8 *)Section + SectionLength); + } + + return EFI_NOT_FOUND; +} diff --git a/MdePkg/Library/FvLib/FvLib.inf b/MdePkg/Library/FvLib/FvLib.inf new file mode 100644 index 000000000000..95dbd5d42b52 --- /dev/null +++ b/MdePkg/Library/FvLib/FvLib.inf @@ -0,0 +1,51 @@ +## @file +# +# Copyright (c) 2015 - 2025, Intel Corporation. All rights reserved.
    +# Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
    +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +################################################################################ +# +# Defines Section - statements that will be processed to create a Makefile. +# +################################################################################ +[Defines] + INF_VERSION = 0x0001001A + BASE_NAME = FvLib + FILE_GUID = 8cf84f59-4c02-451e-ab21-ce5297bcb1f9 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = FvLib + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +################################################################################ +# +# Sources Section - list of files that are required for the build to succeed. +# +################################################################################ + +[Sources] + FvLib.c + +################################################################################ +# +# Package Dependency Section - list of Package files that are required for +# this module. +# +################################################################################ + +[Packages] + MdePkg/MdePkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib diff --git a/MdePkg/MdeLibs.dsc.inc b/MdePkg/MdeLibs.dsc.inc index 3131b9fc5d2f..b063480df727 100644 --- a/MdePkg/MdeLibs.dsc.inc +++ b/MdePkg/MdeLibs.dsc.inc @@ -29,6 +29,7 @@ SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf MmUnblockMemoryLib|MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.inf StackCheckFailureHookLib|MdePkg/Library/StackCheckFailureHookLibNull/StackCheckFailureHookLibNull.inf + FvLib|MdePkg/Library/FvLib/FvLib.inf !if $(CUSTOM_STACK_CHECK_LIB) == STATIC # To only use the static stack cookie, we just include the checking functionality. diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index 31fce983aafd..8f02cf176750 100644 --- a/MdePkg/MdePkg.dec +++ b/MdePkg/MdePkg.dec @@ -341,6 +341,9 @@ ## @libraryclass Provides function to support TDX processing. TdxLib|Include/Library/TdxLib.h + ## @libraryclass Provides function to support FV operatation. + FvLib|Include/Library/FvLib.h + [LibraryClasses.X64] ## @libraryclass Defines a set of interfaces for the MM core entrypoint. The AARCH64 version lives in ArmPkg # diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc index 17ccd35b251a..eb13d67e0096 100644 --- a/MdePkg/MdePkg.dsc +++ b/MdePkg/MdePkg.dsc @@ -143,6 +143,7 @@ MdePkg/Library/DynamicStackCookieEntryPointLib/StandaloneMmDriverEntryPoint.inf MdePkg/Library/DynamicStackCookieEntryPointLib/UefiApplicationEntryPoint.inf MdePkg/Library/DynamicStackCookieEntryPointLib/UefiDriverEntryPoint.inf + MdePkg/Library/FvLib/FvLib.inf [Components.IA32, Components.X64, Components.AARCH64] # From 426da7fb1a2d9155d2abf3a68b93ff37ed6898b1 Mon Sep 17 00:00:00 2001 From: Zhiguang Liu Date: Thu, 25 Sep 2025 16:45:44 +0800 Subject: [PATCH 0715/1172] IntelFsp2WrapperPkg: Rebase FSP-S and FSP-I if Image Base not match FSP Spec says: "The FSP is not Position Independent Code (PIC) and each FSP component has to be rebased if it is placed at a location which is different from the preferred base address specified during the FSP build." Normally, the FSP location in flash is the same preferred base address specified during the FSP build. To avoid FSP-S and FSP-I running directly from flash, platform may copy the FSP binaries into physical memory. This causes FSP location to be different from the preferred base address. To support this, this commit checks the Image Base from FSP header and the FSP base address PCD. If these two are different, This commit assumes the FSP is copied into physical memory and FSP location is changed. In such scenario, the commit will rebase the FSP to the address provided by the PCD. Signed-off-by: Zhiguang Liu --- .../FspiWrapperPeim/FspiWrapperPeim.c | 105 ++++++++++++++++++ .../FspiWrapperPeim/FspiWrapperPeim.inf | 2 + .../FspsWrapperPeim/FspsWrapperPeim.c | 105 ++++++++++++++++++ .../FspsWrapperPeim/FspsWrapperPeim.inf | 2 + 4 files changed, 214 insertions(+) diff --git a/IntelFsp2WrapperPkg/FspiWrapperPeim/FspiWrapperPeim.c b/IntelFsp2WrapperPkg/FspiWrapperPeim/FspiWrapperPeim.c index 211dd26060f7..09d6d878f70e 100644 --- a/IntelFsp2WrapperPkg/FspiWrapperPeim/FspiWrapperPeim.c +++ b/IntelFsp2WrapperPkg/FspiWrapperPeim/FspiWrapperPeim.c @@ -29,6 +29,104 @@ #include #include #include +#include +#include + +/** + Rebase a PE32/TE Image from an FFS file. + + @param FileHeader Pointer to the FFS file header. + + @return Status of the rebase operation. +**/ +EFI_STATUS +RebasePeTeFromFfs ( + EFI_FFS_FILE_HEADER *FileHeader + ) +{ + EFI_STATUS Status; + VOID *ImageBase; + PE_COFF_LOADER_IMAGE_CONTEXT ImageContext; + UINTN ImageSize; + + Status = FfsFindSectionData (EFI_SECTION_PE32, FileHeader, &ImageBase, &ImageSize); + if (EFI_ERROR (Status)) { + Status = FfsFindSectionData (EFI_SECTION_TE, FileHeader, &ImageBase, &ImageSize); + } + + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + ZeroMem (&ImageContext, sizeof (ImageContext)); + ImageContext.Handle = ImageBase; + ImageContext.ImageRead = PeCoffLoaderImageReadFromMemory; + + Status = PeCoffLoaderGetImageInfo (&ImageContext); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + ImageContext.ImageAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)ImageBase; + Status = PeCoffLoaderRelocateImage (&ImageContext); + ASSERT_EFI_ERROR (Status); + + return Status; +} + +/** + Rebase Fsp Fv. + Only SEC and PEI Core FFS files need to be rebased. Other PEIMs will + be rebased by PEI Core when dispatching. + FSP FV must contain SEC FFS and may contains PEI Core FFS files. + + @param PcdFspFvBaseAddress Fsp Fv base address. + + @return Status of the rebase result. +**/ +EFI_STATUS +RebaseFspFv ( + UINT64 PcdFspFvBaseAddress + ) +{ + EFI_STATUS Status; + EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader; + EFI_FFS_FILE_HEADER *FileHeader; + + FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)PcdFspFvBaseAddress; + + // + // Find and rebase SEC FFS file + // + FileHeader = NULL; + Status = FfsFindNextFile (EFI_FV_FILETYPE_SECURITY_CORE, FwVolHeader, &FileHeader); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + Status = RebasePeTeFromFfs (FileHeader); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + // + // Find and rebase PEI Core FFS file + // + FileHeader = NULL; + Status = FfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE, FwVolHeader, &FileHeader); + if (!EFI_ERROR (Status)) { + Status = RebasePeTeFromFfs (FileHeader); + ASSERT_EFI_ERROR (Status); + } else { + return EFI_SUCCESS; + } + + return Status; +} /** Call FspSmmInit API. @@ -59,6 +157,13 @@ FspiWrapperInitApiMode ( return EFI_DEVICE_ERROR; } + if (FspiHeaderPtr->ImageBase != PcdGet32 (PcdFspiBaseAddress)) { + FspiHeaderPtr->ImageBase = PcdGet32 (PcdFspiBaseAddress); + Status = RebaseFspFv (PcdGet32 (PcdFspiBaseAddress)); + ASSERT_EFI_ERROR (Status); + DEBUG ((DEBUG_INFO, "FSP-I Rebase completed.\n")); + } + if ((PcdGet64 (PcdFspiUpdDataAddress) == 0) && (FspiHeaderPtr->CfgRegionSize != 0) && (FspiHeaderPtr->CfgRegionOffset != 0)) { // // Copy default FSP-I UPD data from Flash diff --git a/IntelFsp2WrapperPkg/FspiWrapperPeim/FspiWrapperPeim.inf b/IntelFsp2WrapperPkg/FspiWrapperPeim/FspiWrapperPeim.inf index e03434cccacd..d23e5e0c41df 100644 --- a/IntelFsp2WrapperPkg/FspiWrapperPeim/FspiWrapperPeim.inf +++ b/IntelFsp2WrapperPkg/FspiWrapperPeim/FspiWrapperPeim.inf @@ -41,6 +41,8 @@ FspWrapperApiLib FspWrapperApiTestLib FspMeasurementLib + PeCoffLib + FvLib [Packages] MdePkg/MdePkg.dec diff --git a/IntelFsp2WrapperPkg/FspsWrapperPeim/FspsWrapperPeim.c b/IntelFsp2WrapperPkg/FspsWrapperPeim/FspsWrapperPeim.c index 62b5e4534833..04b7c75e6cb2 100644 --- a/IntelFsp2WrapperPkg/FspsWrapperPeim/FspsWrapperPeim.c +++ b/IntelFsp2WrapperPkg/FspsWrapperPeim/FspsWrapperPeim.c @@ -38,6 +38,8 @@ #include #include #include +#include +#include extern EFI_PEI_NOTIFY_DESCRIPTOR mS3EndOfPeiNotifyDesc; extern EFI_GUID gFspHobGuid; @@ -267,6 +269,102 @@ EFI_PEI_NOTIFY_DESCRIPTOR mPeiMemoryDiscoveredNotifyDesc = { PeiMemoryDiscoveredNotify }; +/** + Rebase a PE32/TE Image from an FFS file. + + @param FileHeader Pointer to the FFS file header. + + @return Status of the rebase operation. +**/ +EFI_STATUS +RebasePeTeFromFfs ( + EFI_FFS_FILE_HEADER *FileHeader + ) +{ + EFI_STATUS Status; + VOID *ImageBase; + PE_COFF_LOADER_IMAGE_CONTEXT ImageContext; + UINTN ImageSize; + + Status = FfsFindSectionData (EFI_SECTION_PE32, FileHeader, &ImageBase, &ImageSize); + if (EFI_ERROR (Status)) { + Status = FfsFindSectionData (EFI_SECTION_TE, FileHeader, &ImageBase, &ImageSize); + } + + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + ZeroMem (&ImageContext, sizeof (ImageContext)); + ImageContext.Handle = ImageBase; + ImageContext.ImageRead = PeCoffLoaderImageReadFromMemory; + + Status = PeCoffLoaderGetImageInfo (&ImageContext); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + ImageContext.ImageAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)ImageBase; + Status = PeCoffLoaderRelocateImage (&ImageContext); + ASSERT_EFI_ERROR (Status); + + return Status; +} + +/** + Rebase Fsp Fv. + Only SEC and PEI Core FFS files need to be rebased. Other PEIMs will + be rebased by PEI Core when dispatching. + FSP FV must contain SEC FFS and may contains PEI Core FFS files. + + @param PcdFspFvBaseAddress Fsp Fv base address. + + @return Status of the rebase result. +**/ +EFI_STATUS +RebaseFspFv ( + UINT64 PcdFspFvBaseAddress + ) +{ + EFI_STATUS Status; + EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader; + EFI_FFS_FILE_HEADER *FileHeader; + + FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)PcdFspFvBaseAddress; + + // + // Find and rebase SEC FFS file + // + FileHeader = NULL; + Status = FfsFindNextFile (EFI_FV_FILETYPE_SECURITY_CORE, FwVolHeader, &FileHeader); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + Status = RebasePeTeFromFfs (FileHeader); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + // + // Find and rebase PEI Core FFS file + // + FileHeader = NULL; + Status = FfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE, FwVolHeader, &FileHeader); + if (!EFI_ERROR (Status)) { + Status = RebasePeTeFromFfs (FileHeader); + ASSERT_EFI_ERROR (Status); + } else { + return EFI_SUCCESS; + } + + return Status; +} + /** This function is called after PEI core discover memory and finish migration. @@ -302,6 +400,13 @@ PeiMemoryDiscoveredNotify ( return EFI_DEVICE_ERROR; } + if (FspsHeaderPtr->ImageBase != PcdGet32 (PcdFspsBaseAddress)) { + FspsHeaderPtr->ImageBase = PcdGet32 (PcdFspsBaseAddress); + Status = RebaseFspFv (PcdGet32 (PcdFspsBaseAddress)); + ASSERT_EFI_ERROR (Status); + DEBUG ((DEBUG_INFO, "FSP-S Rebase completed.\n")); + } + if ((GetFspsUpdDataAddress () == 0) && (FspsHeaderPtr->CfgRegionSize != 0) && (FspsHeaderPtr->CfgRegionOffset != 0)) { // // Copy default FSP-S UPD data from Flash diff --git a/IntelFsp2WrapperPkg/FspsWrapperPeim/FspsWrapperPeim.inf b/IntelFsp2WrapperPkg/FspsWrapperPeim/FspsWrapperPeim.inf index a7b28e56b5f8..fd153e8dabd1 100644 --- a/IntelFsp2WrapperPkg/FspsWrapperPeim/FspsWrapperPeim.inf +++ b/IntelFsp2WrapperPkg/FspsWrapperPeim/FspsWrapperPeim.inf @@ -46,6 +46,8 @@ FspWrapperApiTestLib FspMeasurementLib FspWrapperMultiPhaseProcessLib + PeCoffLib + FvLib [Packages] MdePkg/MdePkg.dec From 59c3e63fc650b3ae428fdb9082f510ea8789ade2 Mon Sep 17 00:00:00 2001 From: Zhiguang Liu Date: Mon, 27 Oct 2025 11:28:24 +0800 Subject: [PATCH 0716/1172] OvmfPkg: Use FvLib from MdePkg FvLib is moving from StandaloneMmPkg to MdePkg. FvLib is already included from MdeLibs.dsc.inc. So, just remove the usage of FvLib from StandaloneMmPkg. Signed-off-by: Zhiguang Liu --- OvmfPkg/OvmfPkgX64.dsc | 1 - 1 file changed, 1 deletion(-) diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index 258093f8a5cf..9180e8864536 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -541,7 +541,6 @@ DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf !endif ExtractGuidedSectionLib|StandaloneMmPkg/Library/StandaloneMmExtractGuidedSectionLib/StandaloneMmExtractGuidedSectionLib.inf - FvLib|StandaloneMmPkg/Library/FvLib/FvLib.inf HobLib|StandaloneMmPkg/Library/StandaloneMmCoreHobLib/StandaloneMmCoreHobLib.inf MemoryAllocationLib|StandaloneMmPkg/Library/StandaloneMmCoreMemoryAllocationLib/StandaloneMmCoreMemoryAllocationLib.inf MemLib|StandaloneMmPkg/Library/StandaloneMmMemLib/StandaloneMmMemLib.inf From 147e9a053e3b7a65ee21c23d5a83338e153a4c3e Mon Sep 17 00:00:00 2001 From: Sathya Ravichandran Date: Tue, 23 Sep 2025 15:37:04 +0530 Subject: [PATCH 0717/1172] MdeModulePkg: Remove DXE_SAL_DRIVER The DXE_SAL_DRIVER module type was introduced to support Itanium (IPF) platforms. Since support for Itanium processors has been dropped, the instances of DXE_SAL_DRIVER have been removed. Ref: [3cb0a311cb7e747d7be5c5076d0fff76ad256d2b] Cc: Sachin Ganesh Signed-off-by: Sathya Ravichandran --- MdeModulePkg/Core/Dxe/Image/Image.c | 1 - .../DxeFileExplorerProtocol/DxeFileExplorerProtocol.inf | 2 +- .../DxePrintLibPrint2Protocol/DxePrintLibPrint2Protocol.inf | 2 +- .../Library/UefiHiiServicesLib/UefiHiiServicesLib.inf | 5 ----- 4 files changed, 2 insertions(+), 8 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Image/Image.c b/MdeModulePkg/Core/Dxe/Image/Image.c index ed30890599ab..735ba04bee10 100644 --- a/MdeModulePkg/Core/Dxe/Image/Image.c +++ b/MdeModulePkg/Core/Dxe/Image/Image.c @@ -627,7 +627,6 @@ CoreLoadPeImage ( Image->ImageContext.ImageDataMemoryType = EfiBootServicesData; break; case EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER: - case EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER: Image->ImageContext.ImageCodeMemoryType = EfiRuntimeServicesCode; Image->ImageContext.ImageDataMemoryType = EfiRuntimeServicesData; break; diff --git a/MdeModulePkg/Library/DxeFileExplorerProtocol/DxeFileExplorerProtocol.inf b/MdeModulePkg/Library/DxeFileExplorerProtocol/DxeFileExplorerProtocol.inf index ddaefca1ab2c..495ec61acc7f 100644 --- a/MdeModulePkg/Library/DxeFileExplorerProtocol/DxeFileExplorerProtocol.inf +++ b/MdeModulePkg/Library/DxeFileExplorerProtocol/DxeFileExplorerProtocol.inf @@ -32,5 +32,5 @@ [Protocols] gEfiFileExplorerProtocolGuid ## CONSUMES -[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SAL_DRIVER, Depex.common.DXE_SMM_DRIVER] +[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SMM_DRIVER] gEfiFileExplorerProtocolGuid diff --git a/MdeModulePkg/Library/DxePrintLibPrint2Protocol/DxePrintLibPrint2Protocol.inf b/MdeModulePkg/Library/DxePrintLibPrint2Protocol/DxePrintLibPrint2Protocol.inf index 800bbd543d37..3afe349a86ac 100644 --- a/MdeModulePkg/Library/DxePrintLibPrint2Protocol/DxePrintLibPrint2Protocol.inf +++ b/MdeModulePkg/Library/DxePrintLibPrint2Protocol/DxePrintLibPrint2Protocol.inf @@ -37,5 +37,5 @@ gEfiMdePkgTokenSpaceGuid.PcdMaximumAsciiStringLength ## SOMETIMES_CONSUMES gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength ## SOMETIMES_CONSUMES -[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SAL_DRIVER, Depex.common.DXE_SMM_DRIVER] +[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SMM_DRIVER] gEfiPrint2SProtocolGuid diff --git a/MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf b/MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf index 005e8c9aff00..ced567dc0004 100644 --- a/MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf +++ b/MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf @@ -51,11 +51,6 @@ gEfiHiiDatabaseProtocolGuid AND gEfiHiiConfigRoutingProtocolGuid -[Depex.common.DXE_SAL_DRIVER] - gEfiHiiStringProtocolGuid AND - gEfiHiiDatabaseProtocolGuid AND - gEfiHiiConfigRoutingProtocolGuid - [Depex.common.DXE_SMM_DRIVER] gEfiHiiStringProtocolGuid AND gEfiHiiDatabaseProtocolGuid AND From c6e5c20cb9afac26be4780c556736b67245dac5c Mon Sep 17 00:00:00 2001 From: Sathya Ravichandran Date: Tue, 23 Sep 2025 15:54:40 +0530 Subject: [PATCH 0718/1172] MdePkg: Remove DXE_SAL_DRIVER The DXE_SAL_DRIVER module type was introduced to support Itanium (IPF) platforms. Since support for Itanium processors has been dropped, the instances of DXE_SAL_DRIVER have been removed. Ref: [3cb0a311cb7e747d7be5c5076d0fff76ad256d2b] Cc: Sachin Ganesh Signed-off-by: Sathya Ravichandran --- MdePkg/Include/IndustryStandard/PeImage.h | 1 - MdePkg/Library/DxePcdLib/DxePcdLib.inf | 2 +- MdePkg/Library/DxeSmbusLib/DxeSmbusLib.inf | 2 +- .../UefiDevicePathLibOptionalDevicePathProtocol.inf | 2 +- .../UefiDevicePathLibDevicePathProtocol.inf | 2 +- .../UefiPciLibPciRootBridgeIo/UefiPciLibPciRootBridgeIo.inf | 2 +- .../UefiPciSegmentLibPciRootBridgeIo.inf | 2 +- 7 files changed, 6 insertions(+), 7 deletions(-) diff --git a/MdePkg/Include/IndustryStandard/PeImage.h b/MdePkg/Include/IndustryStandard/PeImage.h index 596c2fc3cdd3..5a984ab5c4cc 100644 --- a/MdePkg/Include/IndustryStandard/PeImage.h +++ b/MdePkg/Include/IndustryStandard/PeImage.h @@ -25,7 +25,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #define EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION 10 #define EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11 #define EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12 -#define EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER 13///< defined PI Specification, 1.0 // // PE32+ Machine type for EFI images diff --git a/MdePkg/Library/DxePcdLib/DxePcdLib.inf b/MdePkg/Library/DxePcdLib/DxePcdLib.inf index 3d4d21b442b4..ed2e19edbfd7 100644 --- a/MdePkg/Library/DxePcdLib/DxePcdLib.inf +++ b/MdePkg/Library/DxePcdLib/DxePcdLib.inf @@ -58,6 +58,6 @@ gGetPcdInfoProtocolGuid ## SOMETIMES_CONSUMES gEfiGetPcdInfoProtocolGuid ## SOMETIMES_CONSUMES -[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SAL_DRIVER, Depex.common.DXE_SMM_DRIVER] +[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SMM_DRIVER] gEfiPcdProtocolGuid diff --git a/MdePkg/Library/DxeSmbusLib/DxeSmbusLib.inf b/MdePkg/Library/DxeSmbusLib/DxeSmbusLib.inf index 237a839fb54f..5b0758ba4aeb 100644 --- a/MdePkg/Library/DxeSmbusLib/DxeSmbusLib.inf +++ b/MdePkg/Library/DxeSmbusLib/DxeSmbusLib.inf @@ -41,6 +41,6 @@ [Protocols] gEfiSmbusHcProtocolGuid ## CONSUMES -[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SAL_DRIVER, Depex.common.DXE_SMM_DRIVER] +[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SMM_DRIVER] gEfiSmbusHcProtocolGuid diff --git a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.inf b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.inf index 81323bc70061..2d6dd34458e3 100644 --- a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.inf +++ b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.inf @@ -80,6 +80,6 @@ [Pcd] gEfiMdePkgTokenSpaceGuid.PcdMaximumDevicePathNodeCount ## SOMETIMES_CONSUMES -[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SAL_DRIVER, Depex.common.DXE_SMM_DRIVER] +[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SMM_DRIVER] gEfiDevicePathUtilitiesProtocolGuid diff --git a/MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLibDevicePathProtocol.inf b/MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLibDevicePathProtocol.inf index dded21df143f..3e39617ae982 100644 --- a/MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLibDevicePathProtocol.inf +++ b/MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLibDevicePathProtocol.inf @@ -51,6 +51,6 @@ [Pcd] gEfiMdePkgTokenSpaceGuid.PcdMaximumDevicePathNodeCount ## SOMETIMES_CONSUMES -[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SAL_DRIVER, Depex.common.DXE_SMM_DRIVER] +[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SMM_DRIVER] gEfiDevicePathUtilitiesProtocolGuid diff --git a/MdePkg/Library/UefiPciLibPciRootBridgeIo/UefiPciLibPciRootBridgeIo.inf b/MdePkg/Library/UefiPciLibPciRootBridgeIo/UefiPciLibPciRootBridgeIo.inf index 2e4ff823ccfb..00a7aef6db28 100644 --- a/MdePkg/Library/UefiPciLibPciRootBridgeIo/UefiPciLibPciRootBridgeIo.inf +++ b/MdePkg/Library/UefiPciLibPciRootBridgeIo/UefiPciLibPciRootBridgeIo.inf @@ -47,6 +47,6 @@ [Protocols] gEfiPciRootBridgeIoProtocolGuid ## CONSUMES -[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SAL_DRIVER, Depex.common.DXE_SMM_DRIVER] +[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SMM_DRIVER] gEfiPciRootBridgeIoProtocolGuid diff --git a/MdePkg/Library/UefiPciSegmentLibPciRootBridgeIo/UefiPciSegmentLibPciRootBridgeIo.inf b/MdePkg/Library/UefiPciSegmentLibPciRootBridgeIo/UefiPciSegmentLibPciRootBridgeIo.inf index 552f384d5925..7fbdd1c38693 100644 --- a/MdePkg/Library/UefiPciSegmentLibPciRootBridgeIo/UefiPciSegmentLibPciRootBridgeIo.inf +++ b/MdePkg/Library/UefiPciSegmentLibPciRootBridgeIo/UefiPciSegmentLibPciRootBridgeIo.inf @@ -50,6 +50,6 @@ [Protocols] gEfiPciRootBridgeIoProtocolGuid ## CONSUMES -[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SAL_DRIVER, Depex.common.DXE_SMM_DRIVER] +[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SMM_DRIVER] gEfiPciRootBridgeIoProtocolGuid From d36680ad13bc84e274e60729146adb574d4f44f2 Mon Sep 17 00:00:00 2001 From: Sathya Ravichandran Date: Tue, 23 Sep 2025 16:06:13 +0530 Subject: [PATCH 0719/1172] SecurityPkg: Remove DXE_SAL_DRIVER The DXE_SAL_DRIVER module type was introduced to support Itanium (IPF) platforms. Since support for Itanium processors has been dropped, the instances of DXE_SAL_DRIVER have been removed. Ref: [3cb0a311cb7e747d7be5c5076d0fff76ad256d2b] Cc: Sachin Ganesh Signed-off-by: Sathya Ravichandran --- .../Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.inf | 2 +- SecurityPkg/SecurityPkg.dsc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.inf b/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.inf index 28995f438de6..78c8c32c2934 100644 --- a/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.inf +++ b/SecurityPkg/Library/DxeTpm2MeasureBootLib/DxeTpm2MeasureBootLib.inf @@ -26,7 +26,7 @@ FILE_GUID = 778CE4F4-36BD-4ae7-B8F0-10B420B0D174 MODULE_TYPE = DXE_DRIVER VERSION_STRING = 1.0 - LIBRARY_CLASS = NULL|DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER UEFI_APPLICATION UEFI_DRIVER + LIBRARY_CLASS = NULL|DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_APPLICATION UEFI_DRIVER CONSTRUCTOR = DxeTpm2MeasureBootLibConstructor # diff --git a/SecurityPkg/SecurityPkg.dsc b/SecurityPkg/SecurityPkg.dsc index de2c66facbe4..746675a51689 100644 --- a/SecurityPkg/SecurityPkg.dsc +++ b/SecurityPkg/SecurityPkg.dsc @@ -137,7 +137,7 @@ Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf FileExplorerLib|MdeModulePkg/Library/FileExplorerLib/FileExplorerLib.inf -[LibraryClasses.common.UEFI_DRIVER, LibraryClasses.common.DXE_RUNTIME_DRIVER, LibraryClasses.common.DXE_SAL_DRIVER,] +[LibraryClasses.common.UEFI_DRIVER, LibraryClasses.common.DXE_RUNTIME_DRIVER,] HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf DebugLib|MdePkg/Library/UefiDebugLibConOut/UefiDebugLibConOut.inf HashLib|SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.inf From 9e740df0bdee07e25f41b24f27317d44141b2fb7 Mon Sep 17 00:00:00 2001 From: Sathya Ravichandran Date: Tue, 23 Sep 2025 16:26:33 +0530 Subject: [PATCH 0720/1172] ArmPkg: Remove DXE_SAL_DRIVER The DXE_SAL_DRIVER module type was introduced to support Itanium (IPF) platforms. Since support for Itanium processors has been dropped, the instances of DXE_SAL_DRIVER have been removed. Ref: [3cb0a311cb7e747d7be5c5076d0fff76ad256d2b] Cc: Sachin Ganesh Signed-off-by: Sathya Ravichandran --- ArmPkg/ArmPkg.dec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec index d719eacb6f78..245b441fc590 100644 --- a/ArmPkg/ArmPkg.dec +++ b/ArmPkg/ArmPkg.dec @@ -21,7 +21,7 @@ # Comments are used for Keywords and Module Types. # # Supported Module Types: -# BASE SEC PEI_CORE PEIM DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER DXE_SAL_DRIVER UEFI_DRIVER UEFI_APPLICATION +# BASE SEC PEI_CORE PEIM DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_DRIVER UEFI_APPLICATION # ################################################################################ [Includes.common] From 8b00092e3feb1ca90fbc9a422ee37b0154ce2d4a Mon Sep 17 00:00:00 2001 From: Sathya Ravichandran Date: Tue, 23 Sep 2025 16:30:04 +0530 Subject: [PATCH 0721/1172] ArmPlatformPkg: Remove DXE_SAL_DRIVER The DXE_SAL_DRIVER module type was introduced to support Itanium (IPF) platforms. Since support for Itanium processors has been dropped, the instances of DXE_SAL_DRIVER have been removed. Ref: [3cb0a311cb7e747d7be5c5076d0fff76ad256d2b] Cc: Sachin Ganesh Signed-off-by: Sathya Ravichandran --- ArmPlatformPkg/ArmPlatformPkg.dec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ArmPlatformPkg/ArmPlatformPkg.dec b/ArmPlatformPkg/ArmPlatformPkg.dec index e8be550a8aa7..41c0673acaad 100644 --- a/ArmPlatformPkg/ArmPlatformPkg.dec +++ b/ArmPlatformPkg/ArmPlatformPkg.dec @@ -19,7 +19,7 @@ # Comments are used for Keywords and Module Types. # # Supported Module Types: -# BASE SEC PEI_CORE PEIM DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER DXE_SAL_DRIVER UEFI_DRIVER UEFI_APPLICATION +# BASE SEC PEI_CORE PEIM DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_DRIVER UEFI_APPLICATION # ################################################################################ [Includes.common] From 5467d6037d213b99da54a40c6d8ac8726dd97291 Mon Sep 17 00:00:00 2001 From: Sathya Ravichandran Date: Tue, 23 Sep 2025 16:34:15 +0530 Subject: [PATCH 0722/1172] ArmVirtPkg: Remove DXE_SAL_DRIVER The DXE_SAL_DRIVER module type was introduced to support Itanium (IPF) platforms. Since support for Itanium processors has been dropped, the instances of DXE_SAL_DRIVER have been removed. Ref: [3cb0a311cb7e747d7be5c5076d0fff76ad256d2b] Cc: Sachin Ganesh Signed-off-by: Sathya Ravichandran --- ArmVirtPkg/ArmVirtPkg.dec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ArmVirtPkg/ArmVirtPkg.dec b/ArmVirtPkg/ArmVirtPkg.dec index 6aa5ea05f4e9..dfd42bfe2a95 100644 --- a/ArmVirtPkg/ArmVirtPkg.dec +++ b/ArmVirtPkg/ArmVirtPkg.dec @@ -19,7 +19,7 @@ # Comments are used for Keywords and Module Types. # # Supported Module Types: -# BASE SEC PEI_CORE PEIM DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER DXE_SAL_DRIVER UEFI_DRIVER UEFI_APPLICATION +# BASE SEC PEI_CORE PEIM DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_DRIVER UEFI_APPLICATION # ################################################################################ [Includes.common] From b089a6a44577f1b1b330a9bcfb0da608bfd3cb02 Mon Sep 17 00:00:00 2001 From: Sathya Ravichandran Date: Tue, 23 Sep 2025 16:35:26 +0530 Subject: [PATCH 0723/1172] EmbeddedPkg: Remove DXE_SAL_DRIVER The DXE_SAL_DRIVER module type was introduced to support Itanium (IPF) platforms. Since support for Itanium processors has been dropped, the instances of DXE_SAL_DRIVER have been removed. Ref: [3cb0a311cb7e747d7be5c5076d0fff76ad256d2b] Cc: Sachin Ganesh Signed-off-by: Sathya Ravichandran --- EmbeddedPkg/EmbeddedPkg.dec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EmbeddedPkg/EmbeddedPkg.dec b/EmbeddedPkg/EmbeddedPkg.dec index 823665189a25..2be2e7b0b237 100644 --- a/EmbeddedPkg/EmbeddedPkg.dec +++ b/EmbeddedPkg/EmbeddedPkg.dec @@ -23,7 +23,7 @@ # Comments are used for Keywords and Module Types. # # Supported Module Types: -# BASE SEC PEI_CORE PEIM DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER DXE_SAL_DRIVER UEFI_DRIVER UEFI_APPLICATION +# BASE SEC PEI_CORE PEIM DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_DRIVER UEFI_APPLICATION # ################################################################################ [Includes.common] From 41f7c0cd9eb3e999268b43c30b7219563c62c234 Mon Sep 17 00:00:00 2001 From: Sathya Ravichandran Date: Tue, 23 Sep 2025 16:36:36 +0530 Subject: [PATCH 0724/1172] NetworkPkg: Remove DXE_SAL_DRIVER The DXE_SAL_DRIVER module type was introduced to support Itanium (IPF) platforms. Since support for Itanium processors has been dropped, the instances of DXE_SAL_DRIVER have been removed. Ref: [3cb0a311cb7e747d7be5c5076d0fff76ad256d2b] Cc: Sachin Ganesh Signed-off-by: Sathya Ravichandran --- NetworkPkg/Library/DxeDpcLib/DxeDpcLib.inf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NetworkPkg/Library/DxeDpcLib/DxeDpcLib.inf b/NetworkPkg/Library/DxeDpcLib/DxeDpcLib.inf index 423037090beb..9d4ca9eddc20 100644 --- a/NetworkPkg/Library/DxeDpcLib/DxeDpcLib.inf +++ b/NetworkPkg/Library/DxeDpcLib/DxeDpcLib.inf @@ -36,5 +36,5 @@ [Protocols] gEfiDpcProtocolGuid ## CONSUMES -[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SAL_DRIVER, Depex.common.DXE_SMM_DRIVER] +[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SMM_DRIVER] gEfiDpcProtocolGuid From 98d1f8a6fd94c32834087a8ecfc1cce7827496e7 Mon Sep 17 00:00:00 2001 From: Sathya Ravichandran Date: Tue, 23 Sep 2025 16:37:43 +0530 Subject: [PATCH 0725/1172] BaseTools: Remove DXE_SAL_DRIVER The DXE_SAL_DRIVER module type was introduced to support Itanium (IPF) platforms. Since support for Itanium processors has been dropped, the instances of DXE_SAL_DRIVER have been removed. Ref: [3cb0a311cb7e747d7be5c5076d0fff76ad256d2b] Cc: Sachin Ganesh Signed-off-by: Sathya Ravichandran --- BaseTools/Conf/XMLSchema/DistributionPackage.xsd | 7 ------- BaseTools/Source/C/Common/BasePeCoff.c | 3 +-- BaseTools/Source/C/GenFw/GenFw.c | 9 ++------- BaseTools/Source/Python/AutoGen/GenC.py | 11 +++++------ BaseTools/Source/Python/AutoGen/GenDepex.py | 3 +-- BaseTools/Source/Python/AutoGen/ModuleAutoGen.py | 2 +- BaseTools/Source/Python/Common/DataType.py | 5 +---- BaseTools/Source/Python/GenFds/FdfParser.py | 3 +-- BaseTools/Source/Python/UPT/Library/DataType.py | 7 +------ BaseTools/Source/Python/UPT/Logger/StringTable.py | 2 +- .../Source/Python/UPT/PomAdapter/InfPomAlignment.py | 2 +- BaseTools/Source/Python/UPT/Xml/XmlParser.py | 2 +- BaseTools/Source/Python/Workspace/InfBuildData.py | 2 +- BaseTools/Source/Python/build/BuildReport.py | 1 - BaseTools/Source/Python/build/build.py | 2 +- BaseTools/UserManuals/GenDepex_Utility_Man_Page.rtf | 2 +- BaseTools/UserManuals/GenFw_Utility_Man_Page.rtf | 2 +- 17 files changed, 20 insertions(+), 45 deletions(-) diff --git a/BaseTools/Conf/XMLSchema/DistributionPackage.xsd b/BaseTools/Conf/XMLSchema/DistributionPackage.xsd index 67be9c8f3294..ae6eaf1c5ca6 100644 --- a/BaseTools/Conf/XMLSchema/DistributionPackage.xsd +++ b/BaseTools/Conf/XMLSchema/DistributionPackage.xsd @@ -2960,13 +2960,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent - - - - This module is only applicable to an IPF DXE runtime driver. - - - diff --git a/BaseTools/Source/C/Common/BasePeCoff.c b/BaseTools/Source/C/Common/BasePeCoff.c index 558f55186a1e..6bd60927662e 100644 --- a/BaseTools/Source/C/Common/BasePeCoff.c +++ b/BaseTools/Source/C/Common/BasePeCoff.c @@ -184,8 +184,7 @@ PeCoffLoaderCheckImageType ( if (ImageContext->ImageType != EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION && \ ImageContext->ImageType != EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER && \ - ImageContext->ImageType != EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER && \ - ImageContext->ImageType != EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER) { + ImageContext->ImageType != EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER) { // // unsupported PeImage subsystem type // diff --git a/BaseTools/Source/C/GenFw/GenFw.c b/BaseTools/Source/C/GenFw/GenFw.c index 183914d2dfdc..51c8c80e8b18 100644 --- a/BaseTools/Source/C/GenFw/GenFw.c +++ b/BaseTools/Source/C/GenFw/GenFw.c @@ -175,11 +175,11 @@ Routine Description: fprintf (stdout, " -e EFI_FILETYPE, --efiImage EFI_FILETYPE\n\ Create Efi Image. EFI_FILETYPE is one of BASE,SMM_CORE,\n\ PEI_CORE, PEIM, DXE_CORE, DXE_DRIVER, UEFI_APPLICATION,\n\ - SEC, DXE_SAL_DRIVER, UEFI_DRIVER, DXE_RUNTIME_DRIVER,\n\ + SEC, UEFI_DRIVER, DXE_RUNTIME_DRIVER,\n\ DXE_SMM_DRIVER, SECURITY_CORE, COMBINED_PEIM_DRIVER,\n\ MM_STANDALONE, MM_CORE_STANDALONE,\n\ PIC_PEIM, RELOCATABLE_PEIM, BS_DRIVER, RT_DRIVER,\n\ - APPLICATION, SAL_RT_DRIVER to support all module types\n\ + APPLICATION to support all module types\n\ It can only be used together with --keepexceptiontable,\n\ --keepzeropending, --keepoptionalheader, -r, -o option.\n\ It is a action option. If it is combined with other action options,\n\ @@ -2180,11 +2180,6 @@ Routine Description: Type = EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER; VerboseMsg ("Efi Image subsystem type is efi runtime driver."); - } else if (stricmp (ModuleType, "DXE_SAL_DRIVER") == 0 || - stricmp (ModuleType, "SAL_RT_DRIVER") == 0) { - Type = EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER; - VerboseMsg ("Efi Image subsystem type is efi sal runtime driver."); - } else { Error (NULL, 0, 1003, "Invalid option value", "EFI_FILETYPE = %s", ModuleType); goto Finish; diff --git a/BaseTools/Source/Python/AutoGen/GenC.py b/BaseTools/Source/Python/AutoGen/GenC.py index 1da74813b9d1..779992a50ed4 100755 --- a/BaseTools/Source/Python/AutoGen/GenC.py +++ b/BaseTools/Source/Python/AutoGen/GenC.py @@ -773,7 +773,6 @@ SUP_MODULE_DXE_DRIVER : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"], SUP_MODULE_DXE_SMM_DRIVER : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"], SUP_MODULE_DXE_RUNTIME_DRIVER: ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"], - SUP_MODULE_DXE_SAL_DRIVER : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"], SUP_MODULE_UEFI_DRIVER : ["Uefi.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"], SUP_MODULE_UEFI_APPLICATION : ["Uefi.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiApplicationEntryPoint.h"], SUP_MODULE_SMM_CORE : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiDriverEntryPoint.h"], @@ -1348,7 +1347,7 @@ def CreateLibraryConstructorCode(Info, AutoGenC, AutoGenH): ConstructorPrototypeString.Append(gLibraryStructorPrototype['PEI'].Replace(Dict)) ConstructorCallingString.Append(gLibraryStructorCall['PEI'].Replace(Dict)) elif Lib.ModuleType in [SUP_MODULE_DXE_CORE, SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_SMM_DRIVER, SUP_MODULE_DXE_RUNTIME_DRIVER, - SUP_MODULE_DXE_SAL_DRIVER, SUP_MODULE_UEFI_DRIVER, SUP_MODULE_UEFI_APPLICATION, SUP_MODULE_SMM_CORE]: + SUP_MODULE_UEFI_DRIVER, SUP_MODULE_UEFI_APPLICATION, SUP_MODULE_SMM_CORE]: ConstructorPrototypeString.Append(gLibraryStructorPrototype['DXE'].Replace(Dict)) ConstructorCallingString.Append(gLibraryStructorCall['DXE'].Replace(Dict)) elif Lib.ModuleType in [SUP_MODULE_MM_STANDALONE, SUP_MODULE_MM_CORE_STANDALONE]: @@ -1385,7 +1384,7 @@ def CreateLibraryConstructorCode(Info, AutoGenC, AutoGenH): elif Info.ModuleType in SUP_MODULE_SET_PEI: AutoGenC.Append(gLibraryString['PEI'].Replace(Dict)) elif Info.ModuleType in [SUP_MODULE_DXE_CORE, SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_SMM_DRIVER, SUP_MODULE_DXE_RUNTIME_DRIVER, - SUP_MODULE_DXE_SAL_DRIVER, SUP_MODULE_UEFI_DRIVER, SUP_MODULE_UEFI_APPLICATION, SUP_MODULE_SMM_CORE]: + SUP_MODULE_UEFI_DRIVER, SUP_MODULE_UEFI_APPLICATION, SUP_MODULE_SMM_CORE]: AutoGenC.Append(gLibraryString['DXE'].Replace(Dict)) elif Info.ModuleType in [SUP_MODULE_MM_STANDALONE, SUP_MODULE_MM_CORE_STANDALONE]: AutoGenC.Append(gLibraryString['MM'].Replace(Dict)) @@ -1419,7 +1418,7 @@ def CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH): DestructorPrototypeString.Append(gLibraryStructorPrototype['PEI'].Replace(Dict)) DestructorCallingString.Append(gLibraryStructorCall['PEI'].Replace(Dict)) elif Lib.ModuleType in [SUP_MODULE_DXE_CORE, SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_SMM_DRIVER, SUP_MODULE_DXE_RUNTIME_DRIVER, - SUP_MODULE_DXE_SAL_DRIVER, SUP_MODULE_UEFI_DRIVER, SUP_MODULE_UEFI_APPLICATION, SUP_MODULE_SMM_CORE]: + SUP_MODULE_UEFI_DRIVER, SUP_MODULE_UEFI_APPLICATION, SUP_MODULE_SMM_CORE]: DestructorPrototypeString.Append(gLibraryStructorPrototype['DXE'].Replace(Dict)) DestructorCallingString.Append(gLibraryStructorCall['DXE'].Replace(Dict)) elif Lib.ModuleType in [SUP_MODULE_MM_STANDALONE, SUP_MODULE_MM_CORE_STANDALONE]: @@ -1448,7 +1447,7 @@ def CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH): elif Info.ModuleType in SUP_MODULE_SET_PEI: AutoGenC.Append(gLibraryString['PEI'].Replace(Dict)) elif Info.ModuleType in [SUP_MODULE_DXE_CORE, SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_SMM_DRIVER, SUP_MODULE_DXE_RUNTIME_DRIVER, - SUP_MODULE_DXE_SAL_DRIVER, SUP_MODULE_UEFI_DRIVER, SUP_MODULE_UEFI_APPLICATION, SUP_MODULE_SMM_CORE]: + SUP_MODULE_UEFI_DRIVER, SUP_MODULE_UEFI_APPLICATION, SUP_MODULE_SMM_CORE]: AutoGenC.Append(gLibraryString['DXE'].Replace(Dict)) elif Info.ModuleType in [SUP_MODULE_MM_STANDALONE, SUP_MODULE_MM_CORE_STANDALONE]: AutoGenC.Append(gLibraryString['MM'].Replace(Dict)) @@ -1509,7 +1508,7 @@ def CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH): else: AutoGenC.Append(gPeimEntryPointString[2].Replace(Dict)) AutoGenH.Append(gPeimEntryPointPrototype.Replace(Dict)) - elif Info.ModuleType in [SUP_MODULE_DXE_RUNTIME_DRIVER, SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_SAL_DRIVER, SUP_MODULE_UEFI_DRIVER]: + elif Info.ModuleType in [SUP_MODULE_DXE_RUNTIME_DRIVER, SUP_MODULE_DXE_DRIVER, SUP_MODULE_UEFI_DRIVER]: if NumEntryPoints < 2: AutoGenC.Append(gUefiDriverEntryPointString[NumEntryPoints].Replace(Dict)) else: diff --git a/BaseTools/Source/Python/AutoGen/GenDepex.py b/BaseTools/Source/Python/AutoGen/GenDepex.py index b6db6645a4fb..35096ddb9112 100644 --- a/BaseTools/Source/Python/AutoGen/GenDepex.py +++ b/BaseTools/Source/Python/AutoGen/GenDepex.py @@ -35,7 +35,6 @@ SUP_MODULE_DXE_DRIVER : "DXE", SUP_MODULE_DXE_SMM_DRIVER : "DXE", SUP_MODULE_DXE_RUNTIME_DRIVER: "DXE", - SUP_MODULE_DXE_SAL_DRIVER : "DXE", SUP_MODULE_UEFI_DRIVER : "DXE", SUP_MODULE_UEFI_APPLICATION : "DXE", SUP_MODULE_SMM_CORE : "DXE", @@ -301,7 +300,7 @@ def Optimize(self): return # don't generate depex if all operands are architecture protocols - if self.ModuleType in [SUP_MODULE_UEFI_DRIVER, SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_RUNTIME_DRIVER, SUP_MODULE_DXE_SAL_DRIVER, SUP_MODULE_DXE_SMM_DRIVER, SUP_MODULE_MM_STANDALONE] and \ + if self.ModuleType in [SUP_MODULE_UEFI_DRIVER, SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_RUNTIME_DRIVER, SUP_MODULE_DXE_SMM_DRIVER, SUP_MODULE_MM_STANDALONE] and \ Op == DEPEX_OPCODE_AND and \ self.ArchProtocols == set(GuidStructureStringToGuidString(Guid) for Guid in AllOperand): self.PostfixNotation = [] diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py index aa0b71632e8e..764c51789ba9 100755 --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py @@ -1416,7 +1416,7 @@ def CreateAsBuiltInf(self): if self.DepexGenerated: if self.ModuleType in [SUP_MODULE_PEIM]: AsBuiltInfDict['binary_item'].append('PEI_DEPEX|' + self.Name + '.depex') - elif self.ModuleType in [SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_RUNTIME_DRIVER, SUP_MODULE_DXE_SAL_DRIVER, SUP_MODULE_UEFI_DRIVER]: + elif self.ModuleType in [SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_RUNTIME_DRIVER, SUP_MODULE_UEFI_DRIVER]: AsBuiltInfDict['binary_item'].append('DXE_DEPEX|' + self.Name + '.depex') elif self.ModuleType in [SUP_MODULE_DXE_SMM_DRIVER]: AsBuiltInfDict['binary_item'].append('SMM_DEPEX|' + self.Name + '.depex') diff --git a/BaseTools/Source/Python/Common/DataType.py b/BaseTools/Source/Python/Common/DataType.py index fb9d63cf9324..7ef3e9386a77 100644 --- a/BaseTools/Source/Python/Common/DataType.py +++ b/BaseTools/Source/Python/Common/DataType.py @@ -64,7 +64,6 @@ SUP_MODULE_DXE_CORE = 'DXE_CORE' SUP_MODULE_DXE_DRIVER = 'DXE_DRIVER' SUP_MODULE_DXE_RUNTIME_DRIVER = 'DXE_RUNTIME_DRIVER' -SUP_MODULE_DXE_SAL_DRIVER = 'DXE_SAL_DRIVER' SUP_MODULE_DXE_SMM_DRIVER = 'DXE_SMM_DRIVER' SUP_MODULE_UEFI_DRIVER = 'UEFI_DRIVER' SUP_MODULE_UEFI_APPLICATION = 'UEFI_APPLICATION' @@ -75,7 +74,7 @@ SUP_MODULE_MM_CORE_STANDALONE = 'MM_CORE_STANDALONE' SUP_MODULE_LIST = [SUP_MODULE_BASE, SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM, SUP_MODULE_DXE_CORE, SUP_MODULE_DXE_DRIVER, \ - SUP_MODULE_DXE_RUNTIME_DRIVER, SUP_MODULE_DXE_SAL_DRIVER, SUP_MODULE_DXE_SMM_DRIVER, SUP_MODULE_UEFI_DRIVER, \ + SUP_MODULE_DXE_RUNTIME_DRIVER, SUP_MODULE_DXE_SMM_DRIVER, SUP_MODULE_UEFI_DRIVER, \ SUP_MODULE_UEFI_APPLICATION, SUP_MODULE_USER_DEFINED, SUP_MODULE_HOST_APPLICATION, SUP_MODULE_SMM_CORE, SUP_MODULE_MM_STANDALONE, SUP_MODULE_MM_CORE_STANDALONE] SUP_MODULE_LIST_STRING = TAB_VALUE_SPLIT.join(SUP_MODULE_LIST) SUP_MODULE_SET_PEI = {SUP_MODULE_PEIM, SUP_MODULE_PEI_CORE} @@ -88,7 +87,6 @@ EDK_COMPONENT_TYPE_RELOCATABLE_PEIM = 'RELOCATABLE_PEIM' EDK_COMPONENT_TYPE_BS_DRIVER = 'BS_DRIVER' EDK_COMPONENT_TYPE_RT_DRIVER = 'RT_DRIVER' -EDK_COMPONENT_TYPE_SAL_RT_DRIVER = 'SAL_RT_DRIVER' EDK_COMPONENT_TYPE_APPLICATION = 'APPLICATION' EDK_NAME = 'EDK' EDKII_NAME = 'EDKII' @@ -104,7 +102,6 @@ "PE32_PEIM" : SUP_MODULE_PEIM, EDK_COMPONENT_TYPE_BS_DRIVER : SUP_MODULE_DXE_DRIVER, EDK_COMPONENT_TYPE_RT_DRIVER : SUP_MODULE_DXE_RUNTIME_DRIVER, - EDK_COMPONENT_TYPE_SAL_RT_DRIVER : SUP_MODULE_DXE_SAL_DRIVER, EDK_COMPONENT_TYPE_APPLICATION : SUP_MODULE_UEFI_APPLICATION, "LOGO" : SUP_MODULE_BASE, } diff --git a/BaseTools/Source/Python/GenFds/FdfParser.py b/BaseTools/Source/Python/GenFds/FdfParser.py index 63e73a78bfa6..c41fcdba7b22 100644 --- a/BaseTools/Source/Python/GenFds/FdfParser.py +++ b/BaseTools/Source/Python/GenFds/FdfParser.py @@ -3561,7 +3561,7 @@ def _GetModuleType(self): if self._Token.upper() not in { SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM, SUP_MODULE_DXE_CORE, SUP_MODULE_DXE_DRIVER, - SUP_MODULE_DXE_SAL_DRIVER, SUP_MODULE_DXE_SMM_DRIVER, + SUP_MODULE_DXE_SMM_DRIVER, SUP_MODULE_DXE_RUNTIME_DRIVER, SUP_MODULE_UEFI_DRIVER, SUP_MODULE_UEFI_APPLICATION, SUP_MODULE_USER_DEFINED, SUP_MODULE_HOST_APPLICATION, TAB_DEFAULT, SUP_MODULE_BASE, @@ -3570,7 +3570,6 @@ def _GetModuleType(self): EDK_COMPONENT_TYPE_PIC_PEIM, EDK_COMPONENT_TYPE_RELOCATABLE_PEIM, "PE32_PEIM", EDK_COMPONENT_TYPE_BS_DRIVER, EDK_COMPONENT_TYPE_RT_DRIVER, - EDK_COMPONENT_TYPE_SAL_RT_DRIVER, EDK_COMPONENT_TYPE_APPLICATION, "ACPITABLE", SUP_MODULE_SMM_CORE, SUP_MODULE_MM_STANDALONE, SUP_MODULE_MM_CORE_STANDALONE}: diff --git a/BaseTools/Source/Python/UPT/Library/DataType.py b/BaseTools/Source/Python/UPT/Library/DataType.py index 13d15921999d..c1776a944166 100644 --- a/BaseTools/Source/Python/UPT/Library/DataType.py +++ b/BaseTools/Source/Python/UPT/Library/DataType.py @@ -21,7 +21,6 @@ "DXE_DRIVER", "SMM_CORE", "DXE_RUNTIME_DRIVER", - "DXE_SAL_DRIVER", "DXE_SMM_DRIVER", "UEFI_DRIVER", "UEFI_APPLICATION", @@ -31,7 +30,6 @@ "DXE_DRIVER", "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", - "DXE_SAL_DRIVER", "UEFI_DRIVER", ] ## @@ -317,7 +315,6 @@ "PEI_CORE", "RAWFILE", "RT_DRIVER", - "SAL_RT_DRIVER", "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", @@ -380,7 +377,6 @@ SUP_MODULE_DXE_CORE = 'DXE_CORE' SUP_MODULE_DXE_DRIVER = 'DXE_DRIVER' SUP_MODULE_DXE_RUNTIME_DRIVER = 'DXE_RUNTIME_DRIVER' -SUP_MODULE_DXE_SAL_DRIVER = 'DXE_SAL_DRIVER' SUP_MODULE_DXE_SMM_DRIVER = 'DXE_SMM_DRIVER' SUP_MODULE_UEFI_DRIVER = 'UEFI_DRIVER' SUP_MODULE_UEFI_APPLICATION = 'UEFI_APPLICATION' @@ -390,7 +386,7 @@ SUP_MODULE_LIST = \ [SUP_MODULE_BASE, SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM, \ SUP_MODULE_DXE_CORE, SUP_MODULE_DXE_DRIVER, \ - SUP_MODULE_DXE_RUNTIME_DRIVER, SUP_MODULE_DXE_SAL_DRIVER, \ + SUP_MODULE_DXE_RUNTIME_DRIVER, \ SUP_MODULE_DXE_SMM_DRIVER, SUP_MODULE_UEFI_DRIVER, \ SUP_MODULE_UEFI_APPLICATION, SUP_MODULE_USER_DEFINED, \ SUP_MODULE_SMM_CORE] @@ -404,7 +400,6 @@ EDK_COMPONENT_TYPE_RELOCATABLE_PEIM = 'RELOCATABLE_PEIM' EDK_COMPONENT_TYPE_BS_DRIVER = 'BS_DRIVER' EDK_COMPONENT_TYPE_RT_DRIVER = 'RT_DRIVER' -EDK_COMPONENT_TYPE_SAL_RT_DRIVER = 'SAL_RT_DRIVER' EDK_COMPONENT_TYPE_APPLICATION = 'APPLICATION' EDK_NAME = 'EDK' EDKII_NAME = 'EDKII' diff --git a/BaseTools/Source/Python/UPT/Logger/StringTable.py b/BaseTools/Source/Python/UPT/Logger/StringTable.py index 13c015844ea0..90392affa787 100644 --- a/BaseTools/Source/Python/UPT/Logger/StringTable.py +++ b/BaseTools/Source/Python/UPT/Logger/StringTable.py @@ -268,7 +268,7 @@ "Only a Hex Byte Array of UCS-2 format or L\"string\" is allowed): %s %s %s") ERR_XML_INVALID_LIB_SUPMODLIST = _("The LIBRARY_CLASS entry %s must have the list appended using the format as: \n" "BASE SEC PEI_CORE PEIM DXE_CORE DXE_DRIVER SMM_CORE DXE_SMM_DRIVER DXE_RUNTIME_DRIVER " -"DXE_SAL_DRIVER UEFI_DRIVER UEFI_APPLICATION USER_DEFINED\n Current is %s.") +"UEFI_DRIVER UEFI_APPLICATION USER_DEFINED\n Current is %s.") ERR_XML_INVALID_EXTERN_SUPARCHLIST = \ _("There is a mismatch of SupArchList %s between the EntryPoint, UnloadImage, Constructor, " "and Destructor elements in the ModuleSurfaceArea.ModuleProperties: SupArchList: %s. ") diff --git a/BaseTools/Source/Python/UPT/PomAdapter/InfPomAlignment.py b/BaseTools/Source/Python/UPT/PomAdapter/InfPomAlignment.py index 9c406e5f49e3..c4f304bd7bad 100644 --- a/BaseTools/Source/Python/UPT/PomAdapter/InfPomAlignment.py +++ b/BaseTools/Source/Python/UPT/PomAdapter/InfPomAlignment.py @@ -698,7 +698,7 @@ def _GenDepexes(self): PEI_LIST = [DT.SUP_MODULE_PEIM] SMM_LIST = [DT.SUP_MODULE_DXE_SMM_DRIVER] - DXE_LIST = [DT.SUP_MODULE_DXE_DRIVER, DT.SUP_MODULE_DXE_SAL_DRIVER, + DXE_LIST = [DT.SUP_MODULE_DXE_DRIVER, DT.SUP_MODULE_DXE_RUNTIME_DRIVER] IsLibraryClass = self.GetIsLibrary() diff --git a/BaseTools/Source/Python/UPT/Xml/XmlParser.py b/BaseTools/Source/Python/UPT/Xml/XmlParser.py index f23958883180..eb76fd37f616 100644 --- a/BaseTools/Source/Python/UPT/Xml/XmlParser.py +++ b/BaseTools/Source/Python/UPT/Xml/XmlParser.py @@ -551,7 +551,7 @@ def ValidateMS2(Module, TopXmlTreeLevel): # ::= {"BASE"} {"SEC"} {"PEI_CORE"} {"PEIM"} # {"DXE_CORE"} {"DXE_DRIVER"} {"SMM_CORE"} # {"DXE_SMM_DRIVER"} {"DXE_RUNTIME_DRIVER"} - # {"DXE_SAL_DRIVER"} {"UEFI_DRIVER"} + # {"UEFI_DRIVER"} # {"UEFI_APPLICATION"} {"USER_DEFINED"} # if len(Item.SupModuleList) > 0: diff --git a/BaseTools/Source/Python/Workspace/InfBuildData.py b/BaseTools/Source/Python/Workspace/InfBuildData.py index fa047a707d94..cab2231dea73 100644 --- a/BaseTools/Source/Python/Workspace/InfBuildData.py +++ b/BaseTools/Source/Python/Workspace/InfBuildData.py @@ -775,7 +775,7 @@ def Depex(self): # PEIM and DXE drivers must have a valid [Depex] section if len(self.LibraryClass) == 0 and len(RecordList) == 0: if self.ModuleType == SUP_MODULE_DXE_DRIVER or self.ModuleType == SUP_MODULE_PEIM or self.ModuleType == SUP_MODULE_DXE_SMM_DRIVER or \ - self.ModuleType == SUP_MODULE_DXE_SAL_DRIVER or self.ModuleType == SUP_MODULE_DXE_RUNTIME_DRIVER: + self.ModuleType == SUP_MODULE_DXE_RUNTIME_DRIVER: EdkLogger.error('build', RESOURCE_NOT_AVAILABLE, "No [Depex] section or no valid expression in [Depex] section for [%s] module" \ % self.ModuleType, File=self.MetaFile) diff --git a/BaseTools/Source/Python/build/BuildReport.py b/BaseTools/Source/Python/build/BuildReport.py index 2d31be4decbf..884e6413e6f0 100644 --- a/BaseTools/Source/Python/build/BuildReport.py +++ b/BaseTools/Source/Python/build/BuildReport.py @@ -110,7 +110,6 @@ SUP_MODULE_PEIM : '0x6 (PEIM)', SUP_MODULE_DXE_CORE : '0x5 (DXE_CORE)', SUP_MODULE_DXE_DRIVER : '0x7 (DRIVER)', - SUP_MODULE_DXE_SAL_DRIVER : '0x7 (DRIVER)', SUP_MODULE_DXE_SMM_DRIVER : '0x7 (DRIVER)', SUP_MODULE_DXE_RUNTIME_DRIVER: '0x7 (DRIVER)', SUP_MODULE_UEFI_DRIVER : '0x7 (DRIVER)', diff --git a/BaseTools/Source/Python/build/build.py b/BaseTools/Source/Python/build/build.py index ab203122844a..6f35fbd7eaac 100755 --- a/BaseTools/Source/Python/build/build.py +++ b/BaseTools/Source/Python/build/build.py @@ -1645,7 +1645,7 @@ def _CollectModuleMapBuffer (self, MapBuffer, ModuleList): elif Module.ModuleType in [EDK_COMPONENT_TYPE_BS_DRIVER, SUP_MODULE_DXE_DRIVER, SUP_MODULE_UEFI_DRIVER]: BtModuleList[Module.MetaFile] = ImageInfo BtSize += ImageInfo.Image.Size - elif Module.ModuleType in [SUP_MODULE_DXE_RUNTIME_DRIVER, EDK_COMPONENT_TYPE_RT_DRIVER, SUP_MODULE_DXE_SAL_DRIVER, EDK_COMPONENT_TYPE_SAL_RT_DRIVER]: + elif Module.ModuleType in [SUP_MODULE_DXE_RUNTIME_DRIVER, EDK_COMPONENT_TYPE_RT_DRIVER]: RtModuleList[Module.MetaFile] = ImageInfo RtSize += ImageInfo.Image.Size elif Module.ModuleType in [SUP_MODULE_SMM_CORE, SUP_MODULE_DXE_SMM_DRIVER, SUP_MODULE_MM_STANDALONE, SUP_MODULE_MM_CORE_STANDALONE]: diff --git a/BaseTools/UserManuals/GenDepex_Utility_Man_Page.rtf b/BaseTools/UserManuals/GenDepex_Utility_Man_Page.rtf index 2cce9d5d46b4..15f1fd3ce897 100644 --- a/BaseTools/UserManuals/GenDepex_Utility_Man_Page.rtf +++ b/BaseTools/UserManuals/GenDepex_Utility_Man_Page.rtf @@ -104,7 +104,7 @@ dependency_expression_file}{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\i \ltrch\fcs0 \fs18\cf1\insrsid1516182 \hich\af43\dbch\af31505\loch\f43 GenDepex generate}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid3881082 \hich\af43\dbch\af31505\loch\f43 s}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid1516182 \hich\af43\dbch\af31505\loch\f43 the binary PI dependency expression according to module type}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid3881082 \hich\af43\dbch\af31505\loch\f43 by parsing the input dependency expression string or the preprocessed dxs file}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid1516182 \hich\af43\dbch\af31505\loch\f43 -. For PEIM module type, the PEI dependency expression will be generated. For DXE_DRIVER, UEFI_DRIVER, DXE_RUNTIME_DRIVER, DXE_SAL_DRIVER and DXE_SMM_DRIVER, the DXE dependency e\hich\af43\dbch\af31505\loch\f43 xpression will be generated.}{\rtlch\fcs1 +. For PEIM module type, the PEI dependency expression will be generated. For DXE_DRIVER, UEFI_DRIVER, DXE_RUNTIME_DRIVER, DXE_SMM_DRIVER, the DXE dependency e\hich\af43\dbch\af31505\loch\f43 xpression will be generated.}{\rtlch\fcs1 \af0\afs18 \ltrch\fcs0 \f0\fs18\cf1\insrsid1516182 \par }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid1516182 \hich\af43\dbch\af31505\loch\f43 GenDepex tool is not a standalone tool. When [depex] section is specified in module INF, it will be used by }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid15757365 \hich\af43\dbch\af31505\loch\f43 the }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid1516182 \hich\af43\dbch\af31505\loch\f43 Build tool. }{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid15757365 diff --git a/BaseTools/UserManuals/GenFw_Utility_Man_Page.rtf b/BaseTools/UserManuals/GenFw_Utility_Man_Page.rtf index ab7ba045e3ac..a89885067305 100644 --- a/BaseTools/UserManuals/GenFw_Utility_Man_Page.rtf +++ b/BaseTools/UserManuals/GenFw_Utility_Man_Page.rtf @@ -32,7 +32,7 @@ Filename1 [FilenameN]\par \pard\nowidctlpar\sb200\b -e EFI_FILETYPE, --efiImage EFI_FILETYPE\par -\pard\nowidctlpar\li360\sb200\b0 Create Efi Image. EFI_FILETYPE is one of BASE, SEC, PEI_CORE, PEIM, DXE_CORE, SMM_CORE, DXE_DRIVER, UEFI_APPLICATION, DXE_SAL_DRIVER, UEFI_DRIVER, DXE_RUNTIME_DRIVER, DXE_SMM_DRIVER, SECURITY_CORE, COMBINED_PEIM_DRIVER, PIC_PEIM, RELOCATABLE_PEIM, BS_DRIVER, RT_DRIVER, APPLICATION, SAL_RT_DRIVER to support all module types.\f1\par +\pard\nowidctlpar\li360\sb200\b0 Create Efi Image. EFI_FILETYPE is one of BASE, SEC, PEI_CORE, PEIM, DXE_CORE, SMM_CORE, DXE_DRIVER, UEFI_APPLICATION, UEFI_DRIVER, DXE_RUNTIME_DRIVER, DXE_SMM_DRIVER, SECURITY_CORE, COMBINED_PEIM_DRIVER, PIC_PEIM, RELOCATABLE_PEIM, BS_DRIVER, RT_DRIVER, APPLICATION, to support all module types.\f1\par \pard\nowidctlpar\sb200\b\f0 -c, --acpi\par From 05429cbe91118e9123d9556652635d47ebec7d08 Mon Sep 17 00:00:00 2001 From: Alex Haydock Date: Thu, 30 Oct 2025 14:25:57 +0000 Subject: [PATCH 0726/1172] OvmfPkg: Expand EnrollDefaultKeys with Microsoft 2023 keys Expand EnrollDefaultKeys by adding the 2023 Microsoft Secure Boot keys to the existing keys already being enrolled. Signed-off-by: Alex Haydock --- OvmfPkg/EnrollDefaultKeys/AuthData.c | 519 ++++++++++++++++++ OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.c | 12 + OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.h | 12 + 3 files changed, 543 insertions(+) diff --git a/OvmfPkg/EnrollDefaultKeys/AuthData.c b/OvmfPkg/EnrollDefaultKeys/AuthData.c index 53ee7f7003c9..8a215bc29c5f 100644 --- a/OvmfPkg/EnrollDefaultKeys/AuthData.c +++ b/OvmfPkg/EnrollDefaultKeys/AuthData.c @@ -136,6 +136,136 @@ CONST UINT8 mMicrosoftKek[] = { CONST UINTN mSizeOfMicrosoftKek = sizeof mMicrosoftKek; +// +// Third KEK: "Microsoft Corporation KEK 2K CA 2023". +// +CONST UINT8 mMicrosoftKek2023[] = { + 0x30, 0x82, 0x05, 0xb2, 0x30, 0x82, 0x03, 0x9a, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x13, 0x33, 0x00, 0x00, 0x00, 0x13, 0x14, 0x16, 0xb8, 0x61, + 0x6d, 0x82, 0x82, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, + 0x00, 0x30, 0x5a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x55, 0x53, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, + 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x4d, + 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x52, 0x53, 0x41, + 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x52, 0x6f, 0x6f, + 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x32, 0x31, 0x30, 0x1e, 0x17, + 0x0d, 0x32, 0x33, 0x30, 0x33, 0x30, 0x32, 0x32, 0x30, 0x32, 0x31, 0x33, + 0x35, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x33, 0x30, 0x32, 0x32, 0x30, + 0x33, 0x31, 0x33, 0x35, 0x5a, 0x30, 0x5c, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x1e, 0x30, 0x1c, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, + 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x2d, 0x30, 0x2b, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x24, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, + 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x4b, 0x45, 0x4b, 0x20, 0x32, 0x4b, 0x20, 0x43, 0x41, 0x20, 0x32, + 0x30, 0x32, 0x33, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, + 0xe3, 0x5e, 0x88, 0x8b, 0x73, 0x2c, 0xc3, 0x0a, 0xc4, 0xe9, 0xf5, 0xce, + 0x81, 0x2d, 0xf1, 0x0f, 0xf1, 0x26, 0x35, 0x37, 0xd1, 0x49, 0x53, 0x71, + 0xb1, 0x5b, 0x93, 0x52, 0xaf, 0xe1, 0x15, 0xdf, 0xde, 0x8b, 0x39, 0xbd, + 0xaf, 0x4c, 0x65, 0x75, 0x53, 0xe5, 0xda, 0x0a, 0x32, 0x98, 0x2f, 0x33, + 0x26, 0xb6, 0x2b, 0xbe, 0x94, 0x99, 0x9f, 0xec, 0xda, 0xc2, 0x8e, 0x05, + 0x34, 0x92, 0x13, 0x0f, 0x63, 0xbf, 0x74, 0xa2, 0x72, 0xa8, 0x29, 0x7e, + 0x9f, 0x32, 0x21, 0x29, 0x08, 0x59, 0xc4, 0x77, 0xc4, 0x2a, 0x92, 0x4c, + 0x87, 0xb6, 0x03, 0x37, 0xeb, 0x9a, 0xe2, 0xc3, 0xc9, 0xb4, 0x48, 0x21, + 0xc3, 0x61, 0x94, 0xea, 0x17, 0x51, 0xb1, 0xe7, 0x14, 0xe2, 0x24, 0x63, + 0x2e, 0xd5, 0xf2, 0xc6, 0xa5, 0xf2, 0xa2, 0x5e, 0x1f, 0x69, 0xc6, 0x51, + 0x0d, 0xa7, 0x29, 0xfb, 0x52, 0x0a, 0x9b, 0xe3, 0x88, 0xe8, 0x68, 0xff, + 0xbb, 0xfa, 0x92, 0x69, 0xaf, 0xc4, 0x16, 0xff, 0x5d, 0xe5, 0x5f, 0xe0, + 0xdf, 0xec, 0x66, 0x55, 0x0b, 0x61, 0xc2, 0xac, 0x3b, 0x20, 0x6e, 0xdf, + 0xb4, 0x0d, 0xeb, 0x2b, 0xc8, 0xd0, 0xc2, 0x34, 0x4e, 0x82, 0x96, 0x39, + 0xee, 0xf1, 0x31, 0x85, 0x04, 0x3d, 0xef, 0xd6, 0x76, 0xfb, 0xc3, 0xca, + 0xc1, 0xd5, 0x8c, 0x2f, 0x0b, 0x10, 0x28, 0x9b, 0x48, 0x9a, 0xb0, 0x10, + 0x14, 0xa4, 0xd9, 0x94, 0xe5, 0x68, 0x5b, 0xcd, 0x6e, 0xe7, 0x7a, 0xec, + 0xbc, 0xa0, 0x49, 0xb8, 0xa9, 0x53, 0xd8, 0x4d, 0x2f, 0xb2, 0x7b, 0xc8, + 0xda, 0xbc, 0xb2, 0xe7, 0xfc, 0xab, 0x70, 0x10, 0x77, 0x95, 0x45, 0x49, + 0xfd, 0xad, 0xd2, 0x3f, 0x17, 0xcb, 0x66, 0x9a, 0xf2, 0x7d, 0x36, 0xdd, + 0x0a, 0x2c, 0xe2, 0xc0, 0x87, 0x21, 0x2d, 0x93, 0xdb, 0x08, 0x96, 0xd2, + 0xe8, 0x5c, 0x54, 0xe1, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, + 0x6d, 0x30, 0x82, 0x01, 0x69, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, + 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x10, 0x06, + 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x01, 0x04, 0x03, + 0x02, 0x01, 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, + 0x04, 0x14, 0xe0, 0xab, 0x72, 0xbc, 0x96, 0x3e, 0xff, 0xb8, 0x66, 0x9b, + 0x7d, 0x10, 0x5a, 0x43, 0x3e, 0x5c, 0x42, 0x54, 0x87, 0x5f, 0x30, 0x19, + 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14, 0x02, 0x04, + 0x0c, 0x1e, 0x0a, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x43, 0x00, + 0x41, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, + 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, + 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x84, 0x44, 0x86, 0x06, 0x00, + 0x98, 0x3f, 0x2c, 0xaa, 0xb3, 0xc5, 0x89, 0xf3, 0xac, 0x2e, 0xc9, 0xe6, + 0x9d, 0x09, 0x03, 0x30, 0x65, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x5e, + 0x30, 0x5c, 0x30, 0x5a, 0xa0, 0x58, 0xa0, 0x56, 0x86, 0x54, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6d, 0x69, 0x63, + 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, + 0x6b, 0x69, 0x6f, 0x70, 0x73, 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x4d, 0x69, + 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x25, 0x32, 0x30, 0x52, 0x53, + 0x41, 0x25, 0x32, 0x30, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x25, + 0x32, 0x30, 0x52, 0x6f, 0x6f, 0x74, 0x25, 0x32, 0x30, 0x43, 0x41, 0x25, + 0x32, 0x30, 0x32, 0x30, 0x32, 0x31, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x72, + 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x66, + 0x30, 0x64, 0x30, 0x62, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, + 0x30, 0x02, 0x86, 0x56, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x6f, 0x70, 0x73, 0x2f, + 0x63, 0x65, 0x72, 0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, + 0x6f, 0x66, 0x74, 0x25, 0x32, 0x30, 0x52, 0x53, 0x41, 0x25, 0x32, 0x30, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x25, 0x32, 0x30, 0x52, 0x6f, + 0x6f, 0x74, 0x25, 0x32, 0x30, 0x43, 0x41, 0x25, 0x32, 0x30, 0x32, 0x30, + 0x32, 0x31, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, + 0x01, 0x00, 0x85, 0x02, 0x06, 0x12, 0xfa, 0x67, 0xae, 0x4f, 0x39, 0xa9, + 0xb8, 0x34, 0xdc, 0x5d, 0x2a, 0x78, 0x19, 0x7b, 0x38, 0xee, 0x9c, 0x82, + 0x8f, 0x1b, 0xe2, 0x3c, 0x3d, 0x32, 0x0a, 0x5e, 0xbf, 0x58, 0x06, 0xe7, + 0x6f, 0xf8, 0x8d, 0x18, 0xa8, 0x1b, 0x84, 0xf5, 0x9b, 0xca, 0xad, 0x8b, + 0x08, 0x44, 0x0e, 0x26, 0x8d, 0x2c, 0xd8, 0x5f, 0x6e, 0x23, 0x25, 0x07, + 0xfa, 0x5b, 0x4c, 0x26, 0x2e, 0x76, 0x31, 0x43, 0x2e, 0x6e, 0xe8, 0xc8, + 0x31, 0xc1, 0x4a, 0xd2, 0xf2, 0x02, 0xb7, 0xa6, 0xf1, 0x75, 0xe4, 0x96, + 0xed, 0x06, 0xe2, 0xca, 0x95, 0x78, 0x44, 0xa8, 0x33, 0x76, 0xd4, 0x2b, + 0x4d, 0xd7, 0xbc, 0xdc, 0x87, 0x3b, 0xab, 0x4d, 0x29, 0xad, 0x96, 0x89, + 0xb7, 0xd5, 0xc2, 0x8f, 0xab, 0x46, 0xc3, 0x5d, 0xb3, 0xfd, 0xed, 0xa5, + 0x9e, 0xf5, 0x76, 0xb7, 0x2b, 0x85, 0xff, 0x98, 0xa1, 0x9f, 0x6b, 0x1c, + 0x9b, 0x3e, 0xf7, 0xee, 0x0e, 0x17, 0xa3, 0xfd, 0x36, 0x2f, 0xe1, 0xcd, + 0x28, 0x98, 0x1c, 0x40, 0x99, 0x26, 0xca, 0x03, 0x8d, 0xa6, 0x35, 0xea, + 0xd2, 0x0a, 0xa7, 0x8b, 0x16, 0xae, 0x21, 0x01, 0x00, 0x1e, 0x27, 0x0f, + 0xb7, 0x0e, 0xb2, 0x42, 0x31, 0x56, 0x2e, 0xe6, 0xf8, 0x8e, 0xea, 0x0c, + 0x34, 0xf0, 0x4e, 0xdf, 0x70, 0x30, 0x69, 0x04, 0xd1, 0xcf, 0xd3, 0x9c, + 0x64, 0x46, 0x6f, 0xcc, 0x21, 0xcd, 0xcb, 0xef, 0x05, 0x32, 0xbb, 0x08, + 0xa6, 0xd8, 0x9f, 0x45, 0x38, 0x5d, 0x4e, 0xd2, 0x9c, 0x92, 0x89, 0xe9, + 0x73, 0xe4, 0x7a, 0x08, 0x35, 0x1e, 0x4f, 0xa6, 0xc2, 0xba, 0x6b, 0x3e, + 0xb7, 0x1f, 0x54, 0x34, 0x49, 0xfa, 0xb4, 0x7a, 0xcb, 0xda, 0xa0, 0x1f, + 0x59, 0x81, 0x2b, 0x2a, 0xf6, 0x88, 0x26, 0xb0, 0xfa, 0x6c, 0xf2, 0xeb, + 0xc1, 0xd8, 0xae, 0x41, 0xe1, 0x6f, 0xfc, 0xbf, 0x13, 0xe8, 0x6e, 0x14, + 0xe7, 0xe7, 0xc7, 0x03, 0x8b, 0x40, 0x99, 0x10, 0x38, 0x06, 0x6d, 0x70, + 0xbd, 0x01, 0xc8, 0xde, 0x8d, 0x56, 0x1d, 0x38, 0x0f, 0x4f, 0x23, 0xa8, + 0x25, 0x40, 0xde, 0xbb, 0x28, 0x2d, 0x43, 0xaf, 0xa4, 0xbc, 0x20, 0x83, + 0xb5, 0x06, 0xf9, 0x05, 0x21, 0x9f, 0x3b, 0xb9, 0x79, 0x0d, 0x70, 0x6b, + 0x53, 0xc0, 0x75, 0xc2, 0x1b, 0x10, 0x13, 0xb3, 0xe4, 0x6f, 0x09, 0xa8, + 0xcf, 0xd1, 0xb7, 0x0e, 0x71, 0x5c, 0xb7, 0xc9, 0x8f, 0xe5, 0x1c, 0xf0, + 0x13, 0x55, 0xd9, 0x93, 0xb9, 0xae, 0x5d, 0x3f, 0xca, 0x0b, 0xb0, 0x59, + 0x6a, 0x45, 0x4a, 0xc3, 0xe1, 0xe3, 0x27, 0x78, 0x0d, 0x16, 0x81, 0xfc, + 0x58, 0x2d, 0xb1, 0x41, 0xba, 0x18, 0x0d, 0xcf, 0xf0, 0xef, 0xab, 0x08, + 0x1e, 0x4f, 0xf8, 0xfc, 0xc6, 0xfd, 0x4b, 0xdd, 0x1d, 0xef, 0x30, 0x25, + 0x50, 0x39, 0xa3, 0xdf, 0xfe, 0x3f, 0xb9, 0xfa, 0xeb, 0x96, 0x97, 0xd0, + 0xcd, 0xf9, 0x04, 0x26, 0xfb, 0x0d, 0x48, 0x19, 0x08, 0xd8, 0xe1, 0x93, + 0xc1, 0x50, 0xc7, 0x6e, 0x6d, 0xd8, 0xd0, 0x6b, 0x8e, 0x95, 0x72, 0x64, + 0x50, 0xc9, 0xed, 0x55, 0x89, 0x6e, 0xc1, 0x4b, 0xa2, 0x06, 0xd4, 0x32, + 0xb5, 0xa9, 0x6d, 0x65, 0x01, 0x7a, 0xf1, 0x52, 0x57, 0x18, 0x05, 0x30, + 0x5c, 0xb8, 0x28, 0x66, 0x11, 0xb7, 0x7a, 0xf0, 0x71, 0x4e, 0x86, 0x61, + 0x60, 0x7a, 0x6d, 0x56, 0xc7, 0x5b, 0x09, 0x3e, 0xa2, 0xef, 0xd4, 0x0e, + 0x9e, 0x92, 0xd3, 0x1f, 0x99, 0xf6, 0x9d, 0xb1, 0x1d, 0x78, 0x78, 0x6b, + 0xff, 0xe8, 0x2a, 0x04, 0xaf, 0x78, 0x67, 0x3e, 0xf0, 0x2a, 0x0b, 0xa7, + 0xe0, 0x5d, 0x01, 0xe9, 0x87, 0x99, 0x35, 0x30, 0x90, 0xed, 0xd7, 0x45, + 0x6b, 0x9c, 0xcc, 0xe6, 0xa2, 0xe4, 0xe6, 0x17, 0xa7, 0xdd +}; + +CONST UINTN mSizeOfMicrosoftKek2023 = sizeof mMicrosoftKek2023; + // // First DB entry: "Microsoft Windows Production PCA 2011" // SHA1: 58:0a:6f:4c:c4:e4:b6:69:b9:eb:dc:1b:2b:3e:08:7b:80:d0:67:8d @@ -395,6 +525,395 @@ CONST UINT8 mMicrosoftUefiCa[] = { CONST UINTN mSizeOfMicrosoftUefiCa = sizeof mMicrosoftUefiCa; +// +// Third DB entry: "Microsoft UEFI CA 2023" +// +CONST UINT8 mMicrosoftUefiCa2023[] = { + 0x30, 0x82, 0x05, 0xa4, 0x30, 0x82, 0x03, 0x8c, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x13, 0x33, 0x00, 0x00, 0x00, 0x16, 0x36, 0xbf, 0x36, 0x89, + 0x9f, 0x15, 0x75, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, + 0x00, 0x30, 0x5a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x55, 0x53, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, + 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x4d, + 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x52, 0x53, 0x41, + 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x52, 0x6f, 0x6f, + 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x32, 0x31, 0x30, 0x1e, 0x17, + 0x0d, 0x32, 0x33, 0x30, 0x36, 0x31, 0x33, 0x31, 0x39, 0x32, 0x31, 0x34, + 0x37, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x30, 0x36, 0x31, 0x33, 0x31, 0x39, + 0x33, 0x31, 0x34, 0x37, 0x5a, 0x30, 0x4e, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x1e, 0x30, 0x1c, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, + 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x16, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, + 0x20, 0x55, 0x45, 0x46, 0x49, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x32, + 0x33, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, + 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbd, 0x22, + 0x2a, 0xae, 0xef, 0x1a, 0x31, 0x85, 0x13, 0x78, 0x51, 0xa7, 0x9b, 0xfd, + 0xfc, 0x78, 0xd1, 0x63, 0xb8, 0x1a, 0x9b, 0x63, 0xf5, 0x12, 0x06, 0xdb, + 0x4b, 0x41, 0x35, 0x6a, 0x6f, 0xab, 0xf5, 0x6a, 0x04, 0xcc, 0x97, 0xcf, + 0xbb, 0xd4, 0x08, 0x09, 0x1a, 0x61, 0x3a, 0x0d, 0xe6, 0xb3, 0xa0, 0x46, + 0xff, 0x09, 0xad, 0xde, 0x80, 0x24, 0xdc, 0x12, 0x80, 0xf2, 0x5f, 0xd9, + 0x16, 0xed, 0xe2, 0x42, 0x9d, 0xcd, 0x2f, 0x4d, 0x61, 0x02, 0x61, 0x8a, + 0x1c, 0x4b, 0x1d, 0x18, 0x62, 0x39, 0x86, 0x97, 0x71, 0xad, 0x3e, 0x7f, + 0x5d, 0x71, 0x13, 0x4b, 0xe9, 0x2a, 0x00, 0xc1, 0xbe, 0xd5, 0xb7, 0x00, + 0x9f, 0x5e, 0x65, 0xb2, 0x2c, 0x1a, 0xff, 0x74, 0xed, 0xea, 0x83, 0xd2, + 0x39, 0x89, 0x33, 0x35, 0x73, 0x7d, 0xa0, 0xa2, 0xfa, 0x40, 0xe4, 0x66, + 0x50, 0x58, 0xaa, 0xfc, 0x87, 0xe8, 0x5c, 0x20, 0x83, 0x34, 0xec, 0xab, + 0xe2, 0x0b, 0xc5, 0x5f, 0x3e, 0xff, 0x48, 0x2b, 0x11, 0x91, 0x26, 0xef, + 0x18, 0x6e, 0x57, 0xc5, 0x9f, 0x18, 0x73, 0x99, 0xef, 0xe1, 0x6a, 0x74, + 0x2b, 0xbb, 0x2f, 0x7f, 0x50, 0x8e, 0x1d, 0xda, 0x3d, 0x76, 0xb6, 0x04, + 0xe5, 0xcc, 0x2e, 0x10, 0xc7, 0x83, 0x1b, 0x83, 0xa3, 0xe4, 0xa5, 0x13, + 0x13, 0x71, 0x6e, 0x33, 0x78, 0xa3, 0xa8, 0x3c, 0xec, 0x48, 0x26, 0x5e, + 0xc7, 0xc6, 0x5e, 0x0d, 0x87, 0x9a, 0xaa, 0xcc, 0x55, 0x34, 0x81, 0xad, + 0x9d, 0x90, 0xf5, 0xe6, 0x96, 0x63, 0xa6, 0xe8, 0x07, 0x20, 0x17, 0xc8, + 0x93, 0x1e, 0xd2, 0xae, 0xa4, 0xdc, 0xae, 0x7d, 0x59, 0xbf, 0x88, 0x5e, + 0x62, 0x0c, 0xae, 0x5b, 0xf2, 0x29, 0x40, 0x56, 0x1d, 0x26, 0x40, 0xde, + 0x85, 0xa6, 0xad, 0x56, 0xd1, 0xcf, 0x55, 0x47, 0x76, 0x5f, 0x9c, 0x39, + 0xdb, 0x03, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x6d, 0x30, + 0x82, 0x01, 0x69, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, + 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x10, 0x06, 0x09, 0x2b, + 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, + 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0x81, 0xaa, 0x6b, 0x32, 0x44, 0xc9, 0x35, 0xbc, 0xe0, 0xd6, 0x62, 0x8a, + 0xf3, 0x98, 0x27, 0x42, 0x1e, 0x32, 0x49, 0x7d, 0x30, 0x19, 0x06, 0x09, + 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14, 0x02, 0x04, 0x0c, 0x1e, + 0x0a, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x43, 0x00, 0x41, 0x30, + 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, + 0x18, 0x30, 0x16, 0x80, 0x14, 0x84, 0x44, 0x86, 0x06, 0x00, 0x98, 0x3f, + 0x2c, 0xaa, 0xb3, 0xc5, 0x89, 0xf3, 0xac, 0x2e, 0xc9, 0xe6, 0x9d, 0x09, + 0x03, 0x30, 0x65, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x5e, 0x30, 0x5c, + 0x30, 0x5a, 0xa0, 0x58, 0xa0, 0x56, 0x86, 0x54, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, + 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, + 0x6f, 0x70, 0x73, 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x4d, 0x69, 0x63, 0x72, + 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x25, 0x32, 0x30, 0x52, 0x53, 0x41, 0x25, + 0x32, 0x30, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x25, 0x32, 0x30, + 0x52, 0x6f, 0x6f, 0x74, 0x25, 0x32, 0x30, 0x43, 0x41, 0x25, 0x32, 0x30, + 0x32, 0x30, 0x32, 0x31, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x72, 0x06, 0x08, + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x66, 0x30, 0x64, + 0x30, 0x62, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, + 0x86, 0x56, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, + 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x6f, 0x70, 0x73, 0x2f, 0x63, 0x65, + 0x72, 0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, + 0x74, 0x25, 0x32, 0x30, 0x52, 0x53, 0x41, 0x25, 0x32, 0x30, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x25, 0x32, 0x30, 0x52, 0x6f, 0x6f, 0x74, + 0x25, 0x32, 0x30, 0x43, 0x41, 0x25, 0x32, 0x30, 0x32, 0x30, 0x32, 0x31, + 0x2e, 0x63, 0x72, 0x74, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, + 0x07, 0x60, 0x13, 0x2a, 0x53, 0x87, 0x12, 0x0f, 0x1a, 0xf3, 0x5a, 0x14, + 0x95, 0x17, 0xe5, 0xd8, 0xd7, 0x95, 0x54, 0x9b, 0x8b, 0x0e, 0xdd, 0x91, + 0xa5, 0xed, 0xc7, 0x5d, 0x47, 0x50, 0x93, 0x45, 0xb7, 0x95, 0x88, 0x5f, + 0x17, 0x19, 0x41, 0x63, 0x76, 0xb5, 0x82, 0xb0, 0xa8, 0xc5, 0x9d, 0x99, + 0x15, 0x36, 0x89, 0x49, 0xbe, 0x12, 0xc2, 0x66, 0xfb, 0x83, 0x0c, 0xb0, + 0x81, 0xce, 0xe5, 0xa4, 0xab, 0xc2, 0xa0, 0x9a, 0xeb, 0xf5, 0x07, 0x3c, + 0xfe, 0x21, 0xf8, 0x9a, 0xdc, 0x19, 0x21, 0x0c, 0x9e, 0x24, 0x2c, 0xd1, + 0x5c, 0xa2, 0x16, 0x0a, 0x4b, 0xeb, 0xec, 0x48, 0x9c, 0xb1, 0x5b, 0x74, + 0xdb, 0x01, 0x64, 0xc2, 0xe3, 0x80, 0x6a, 0xab, 0x1a, 0xcd, 0x77, 0x1b, + 0x6a, 0x39, 0x9a, 0xb7, 0xba, 0x70, 0x44, 0xff, 0x67, 0x94, 0xc5, 0x81, + 0x06, 0xf0, 0xcb, 0x81, 0x04, 0x93, 0x27, 0x21, 0x99, 0xbd, 0x87, 0x88, + 0x14, 0x9c, 0x22, 0x71, 0x0e, 0x0b, 0x2f, 0x5c, 0xbe, 0xb8, 0x90, 0x54, + 0x7c, 0xc0, 0x1e, 0xbc, 0x2b, 0x9b, 0xa3, 0x56, 0x17, 0x4b, 0x97, 0xe7, + 0xe3, 0x7f, 0x13, 0x34, 0xfa, 0xb0, 0x34, 0x6b, 0x9b, 0xf6, 0xb2, 0x2d, + 0xf7, 0xd8, 0x7b, 0xd8, 0x20, 0xd3, 0x5c, 0xa7, 0x95, 0x4c, 0x4f, 0x2a, + 0xf9, 0xe7, 0x1e, 0x68, 0xaf, 0xfc, 0x6c, 0x8f, 0xc8, 0x86, 0x3d, 0x9f, + 0xc8, 0xd1, 0xef, 0x4d, 0x1a, 0xc8, 0xd1, 0xf6, 0xfd, 0x2d, 0x7c, 0xe3, + 0xe8, 0x41, 0xc1, 0xea, 0x27, 0xc1, 0xfb, 0x8e, 0x25, 0x86, 0x5a, 0x89, + 0xa6, 0x10, 0xbe, 0xce, 0xe3, 0x8f, 0xa5, 0x7b, 0xc4, 0x1a, 0xa0, 0xe8, + 0x75, 0x90, 0xfd, 0x21, 0xb0, 0xc1, 0xa3, 0xc5, 0x16, 0x23, 0x5e, 0x3c, + 0xce, 0x2f, 0xfe, 0x8c, 0x98, 0xbf, 0x08, 0x5c, 0xf6, 0xb9, 0xc5, 0xb2, + 0x3c, 0xb6, 0xcc, 0xc8, 0xec, 0x7f, 0xd2, 0x77, 0x74, 0xcb, 0xed, 0xf3, + 0x96, 0xc9, 0x8b, 0x8d, 0x1c, 0x2a, 0x89, 0x0f, 0xa3, 0x8f, 0xbd, 0xce, + 0x2a, 0x85, 0x46, 0x9a, 0x23, 0xa2, 0x8f, 0x42, 0xc0, 0x99, 0xd6, 0xea, + 0x85, 0x1f, 0x61, 0x19, 0xbe, 0x16, 0x35, 0xb7, 0x75, 0xa0, 0x95, 0x80, + 0x65, 0x06, 0x87, 0xd4, 0x0b, 0x35, 0xc8, 0xc4, 0xaa, 0x0e, 0xce, 0xa2, + 0x0a, 0x63, 0x60, 0xca, 0x4b, 0x2b, 0x5c, 0x27, 0x04, 0x82, 0xaf, 0x3e, + 0x58, 0x83, 0x7a, 0x5a, 0xd8, 0x67, 0x3f, 0x10, 0x53, 0xf5, 0x0c, 0x16, + 0xf7, 0x26, 0x4b, 0x8a, 0x80, 0xb9, 0xc5, 0x1f, 0xa0, 0xde, 0xd8, 0xd3, + 0x61, 0x44, 0x14, 0x45, 0xa7, 0xf5, 0xab, 0x9a, 0x88, 0x17, 0xfd, 0xb7, + 0x94, 0x54, 0x02, 0x8b, 0xe4, 0xb7, 0x53, 0xa1, 0x3e, 0x8d, 0x9e, 0x50, + 0x82, 0xa8, 0x00, 0xe0, 0x78, 0x94, 0x1b, 0xbe, 0xb3, 0xc4, 0x30, 0x1f, + 0xb2, 0x0e, 0xdb, 0xf0, 0x46, 0x90, 0xc1, 0xe6, 0x57, 0xfe, 0x7c, 0xc1, + 0x70, 0xb2, 0x1c, 0x4b, 0x64, 0xd9, 0x10, 0x03, 0x1b, 0x34, 0xfb, 0x66, + 0xcf, 0x82, 0x6e, 0x9e, 0x40, 0xa8, 0x11, 0x37, 0xf2, 0x65, 0x8b, 0x21, + 0x09, 0xaf, 0x3c, 0x93, 0x62, 0x3d, 0xf3, 0xbc, 0x83, 0xdd, 0x3f, 0x55, + 0x90, 0x15, 0xd2, 0x31, 0xaf, 0x11, 0xe7, 0xf8, 0xca, 0xa0, 0x82, 0xe1, + 0xb9, 0xcf, 0xb3, 0x57, 0x93, 0xc7, 0x55, 0x37, 0xac, 0x7f, 0x41, 0xbf, + 0x1f, 0x96, 0x3c, 0xf3, 0x26, 0x94, 0xf9, 0xd8, 0xd2, 0x55, 0x24, 0x8a, + 0x8a, 0xb6, 0x41, 0xf0, 0xe0, 0x16, 0xc0, 0x23, 0x92, 0x8c, 0x71, 0x0a, + 0x4c, 0x6a, 0x0d, 0x19, 0x55, 0xf7, 0x3a, 0x9c, 0x92, 0x21, 0x96, 0xa1, + 0xd5, 0xf8, 0x0a, 0x8c, 0x9d, 0xbf, 0xc9, 0xeb, 0xca, 0x88, 0x42, 0xfc, + 0x4b, 0xb4, 0xef, 0xff, 0x27, 0x30, 0x21, 0x61 +}; + +CONST UINTN mSizeOfMicrosoftUefiCa2023 = sizeof mMicrosoftUefiCa2023; + +// +// Fourth DB entry: "Microsoft Option ROM UEFI CA 2023" +// +CONST UINT8 mMicrosoftUefiOpRom2023[] = { + 0x30, 0x82, 0x05, 0xaf, 0x30, 0x82, 0x03, 0x97, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x13, 0x33, 0x00, 0x00, 0x00, 0x17, 0xb3, 0xec, 0x4d, 0x8f, + 0x01, 0xe2, 0x70, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, + 0x00, 0x30, 0x5a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x55, 0x53, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, + 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x4d, + 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x52, 0x53, 0x41, + 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x52, 0x6f, 0x6f, + 0x74, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x32, 0x31, 0x30, 0x1e, 0x17, + 0x0d, 0x32, 0x33, 0x31, 0x30, 0x32, 0x36, 0x31, 0x39, 0x30, 0x32, 0x32, + 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x38, 0x31, 0x30, 0x32, 0x36, 0x31, 0x39, + 0x31, 0x32, 0x32, 0x30, 0x5a, 0x30, 0x59, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x1e, 0x30, 0x1c, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, + 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x21, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, + 0x20, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x4f, 0x4d, 0x20, + 0x55, 0x45, 0x46, 0x49, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x32, 0x33, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xd3, 0x0b, 0xfe, + 0x89, 0xcd, 0xcd, 0xb6, 0xee, 0xdc, 0xe5, 0x1a, 0x8d, 0xdc, 0xca, 0x21, + 0x1a, 0x0f, 0x22, 0x2f, 0x0b, 0xb5, 0x32, 0x84, 0x35, 0xc0, 0xbe, 0x6f, + 0x70, 0x93, 0x55, 0xb4, 0x47, 0xcc, 0x49, 0x03, 0xc2, 0xfe, 0xcf, 0xba, + 0x32, 0x65, 0x64, 0xb7, 0x35, 0xbd, 0x04, 0x3b, 0x44, 0x64, 0x2f, 0xa0, + 0xf2, 0xdd, 0xe1, 0x5d, 0xba, 0xe7, 0xbd, 0x39, 0x9a, 0xbd, 0xcb, 0x4b, + 0xe1, 0x83, 0xaa, 0x1b, 0xe8, 0x6f, 0x4e, 0x4c, 0x91, 0x52, 0x43, 0xa5, + 0xc4, 0x50, 0x55, 0x68, 0xf5, 0xda, 0xac, 0x48, 0xa2, 0x9c, 0xec, 0x35, + 0xa7, 0x04, 0x56, 0x68, 0x19, 0xe2, 0xb1, 0x62, 0xd4, 0x92, 0xf4, 0x85, + 0x3f, 0x34, 0xa1, 0x15, 0x67, 0x87, 0x21, 0x6e, 0x1f, 0xc9, 0xd8, 0x35, + 0x32, 0xb8, 0x3d, 0xcb, 0x58, 0xca, 0x29, 0x43, 0x54, 0x4a, 0x7e, 0x8b, + 0x55, 0x7b, 0x23, 0x7a, 0x3a, 0xb6, 0x9d, 0x43, 0x07, 0x04, 0x6b, 0x9a, + 0x6b, 0xf4, 0xf0, 0x20, 0xff, 0xfa, 0xa6, 0xdf, 0xa2, 0x9e, 0x49, 0xe8, + 0x55, 0xc5, 0x75, 0x88, 0x44, 0xac, 0xa4, 0x41, 0x3a, 0x03, 0x7c, 0xbb, + 0xe9, 0x93, 0xe4, 0x6c, 0xf1, 0xed, 0x79, 0x26, 0xc7, 0x8b, 0x32, 0xf7, + 0x59, 0x49, 0x25, 0x31, 0x00, 0x67, 0x18, 0x0c, 0x67, 0xfb, 0x40, 0xc5, + 0x5d, 0x76, 0x3d, 0x09, 0x87, 0xc2, 0x2d, 0x8c, 0x5f, 0x2b, 0x5a, 0x1e, + 0x01, 0x0f, 0x33, 0xaf, 0x65, 0x08, 0x90, 0x4f, 0xfc, 0x64, 0x5b, 0x9c, + 0xa3, 0x5c, 0xd6, 0x53, 0x1b, 0x51, 0x01, 0x9f, 0x98, 0xcf, 0xc4, 0x53, + 0xc5, 0xb1, 0xdf, 0xb3, 0x68, 0x6f, 0x45, 0x4b, 0xc8, 0x45, 0x85, 0xc8, + 0x1d, 0xb8, 0x9e, 0xd1, 0x77, 0x71, 0xa0, 0xd5, 0xa2, 0x77, 0x87, 0xec, + 0x67, 0x2e, 0xb9, 0x87, 0x06, 0x46, 0xdd, 0x41, 0x43, 0x40, 0x6a, 0x5f, + 0x2f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x6d, 0x30, 0x82, + 0x01, 0x69, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, + 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x10, 0x06, 0x09, 0x2b, 0x06, + 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x51, + 0x4f, 0xbf, 0x93, 0x7f, 0xa4, 0x6f, 0xb5, 0x7b, 0xf0, 0x7a, 0xf8, 0xbe, + 0xd8, 0x4b, 0x3b, 0x86, 0x4b, 0x17, 0x11, 0x30, 0x19, 0x06, 0x09, 0x2b, + 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14, 0x02, 0x04, 0x0c, 0x1e, 0x0a, + 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x43, 0x00, 0x41, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, + 0x30, 0x16, 0x80, 0x14, 0x84, 0x44, 0x86, 0x06, 0x00, 0x98, 0x3f, 0x2c, + 0xaa, 0xb3, 0xc5, 0x89, 0xf3, 0xac, 0x2e, 0xc9, 0xe6, 0x9d, 0x09, 0x03, + 0x30, 0x65, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x5e, 0x30, 0x5c, 0x30, + 0x5a, 0xa0, 0x58, 0xa0, 0x56, 0x86, 0x54, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, + 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x6f, + 0x70, 0x73, 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x4d, 0x69, 0x63, 0x72, 0x6f, + 0x73, 0x6f, 0x66, 0x74, 0x25, 0x32, 0x30, 0x52, 0x53, 0x41, 0x25, 0x32, + 0x30, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x25, 0x32, 0x30, 0x52, + 0x6f, 0x6f, 0x74, 0x25, 0x32, 0x30, 0x43, 0x41, 0x25, 0x32, 0x30, 0x32, + 0x30, 0x32, 0x31, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x72, 0x06, 0x08, 0x2b, + 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x66, 0x30, 0x64, 0x30, + 0x62, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, + 0x56, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, + 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x6f, 0x70, 0x73, 0x2f, 0x63, 0x65, 0x72, + 0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, + 0x25, 0x32, 0x30, 0x52, 0x53, 0x41, 0x25, 0x32, 0x30, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x25, 0x32, 0x30, 0x52, 0x6f, 0x6f, 0x74, 0x25, + 0x32, 0x30, 0x43, 0x41, 0x25, 0x32, 0x30, 0x32, 0x30, 0x32, 0x31, 0x2e, + 0x63, 0x72, 0x74, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x4a, + 0x4b, 0x80, 0xfc, 0x71, 0xb1, 0x87, 0xdd, 0x06, 0x8b, 0x24, 0x10, 0xd1, + 0x76, 0xf8, 0x10, 0xe4, 0x65, 0x34, 0xa1, 0xbb, 0x81, 0x08, 0x7d, 0x70, + 0xd4, 0x15, 0x24, 0xf9, 0x90, 0x3b, 0x48, 0x6f, 0x6e, 0x4e, 0x23, 0xfe, + 0x85, 0x53, 0xec, 0xa2, 0x99, 0x1f, 0x89, 0xe4, 0x34, 0xbe, 0xd0, 0x98, + 0xaf, 0xf1, 0xf8, 0x2d, 0xf3, 0x47, 0xd1, 0xb5, 0x32, 0x64, 0x9e, 0xde, + 0x72, 0xc0, 0x17, 0x7e, 0x81, 0x20, 0x7a, 0xc1, 0x5f, 0x91, 0xf5, 0x4e, + 0x3a, 0xa6, 0x7b, 0x69, 0xd9, 0xd0, 0xd6, 0xf0, 0xfa, 0x80, 0x63, 0xc5, + 0xc0, 0x44, 0x67, 0xd3, 0x8b, 0x27, 0x61, 0xc1, 0xe5, 0xdc, 0x51, 0x99, + 0x6e, 0x23, 0xc9, 0x29, 0x18, 0xfe, 0x35, 0xbd, 0x45, 0x21, 0xac, 0x0f, + 0xf9, 0x60, 0xe2, 0x0f, 0xd1, 0x5f, 0x70, 0x0f, 0x92, 0x2b, 0x58, 0x4e, + 0xcf, 0xac, 0x64, 0x2f, 0x09, 0x73, 0xed, 0x50, 0x08, 0xc8, 0xe1, 0x85, + 0x73, 0x40, 0x2c, 0x31, 0xa9, 0xb4, 0xb6, 0x23, 0x4b, 0xc0, 0x19, 0x3b, + 0xfd, 0x15, 0xf8, 0xd3, 0xcb, 0x74, 0x54, 0xcd, 0xda, 0xbb, 0x7d, 0x04, + 0x85, 0x9f, 0x70, 0x15, 0x75, 0xf9, 0xb7, 0xf4, 0x61, 0x4b, 0xfe, 0xe4, + 0x9f, 0x45, 0x0e, 0xf5, 0x82, 0xe9, 0xc5, 0xf3, 0x78, 0xbb, 0xaa, 0x6a, + 0xe1, 0xf7, 0xbb, 0x85, 0x92, 0x2b, 0xaf, 0x4b, 0xb5, 0x27, 0x4e, 0x9a, + 0xc9, 0x29, 0x6f, 0x0e, 0xc8, 0xd2, 0x64, 0x63, 0x9b, 0x5d, 0x14, 0x06, + 0xcc, 0x78, 0x7f, 0xe4, 0x12, 0xdd, 0x96, 0xe3, 0x9c, 0x04, 0x42, 0xec, + 0x17, 0xfa, 0x92, 0x21, 0xa7, 0xde, 0xf5, 0x69, 0x8f, 0x20, 0xb2, 0x64, + 0xf3, 0x3f, 0x15, 0xa3, 0x51, 0xaf, 0x27, 0x6f, 0xb7, 0x62, 0x57, 0xaf, + 0x74, 0x17, 0xec, 0xab, 0xb1, 0xee, 0xa8, 0x50, 0xef, 0xaf, 0x83, 0x82, + 0xab, 0x61, 0x04, 0x79, 0x3f, 0x49, 0x8c, 0x40, 0x56, 0xc0, 0x3c, 0xaf, + 0xfb, 0x2a, 0x5a, 0x19, 0x1e, 0xaa, 0xe6, 0x2e, 0x67, 0x24, 0x21, 0xac, + 0x33, 0xf0, 0xd7, 0x4a, 0x8b, 0x0a, 0x24, 0x30, 0x10, 0xa6, 0x52, 0x3e, + 0x1d, 0xc8, 0xfc, 0x91, 0x9c, 0x87, 0x1b, 0xfa, 0x86, 0xe1, 0x9e, 0x6b, + 0xe5, 0x09, 0x61, 0x75, 0xa8, 0xa3, 0x39, 0x5f, 0xe2, 0x9f, 0x6c, 0x0e, + 0x85, 0x21, 0xe6, 0xbd, 0x76, 0xa5, 0xea, 0x45, 0x83, 0x68, 0x1e, 0x2f, + 0x36, 0xbf, 0xe0, 0x68, 0x8a, 0x42, 0xce, 0x1f, 0xb8, 0x8d, 0xe1, 0x60, + 0xe6, 0x93, 0x8a, 0xee, 0xba, 0x4a, 0xad, 0xb3, 0x49, 0x4c, 0xee, 0xa3, + 0x03, 0xc9, 0xa7, 0xa2, 0x86, 0x71, 0x9c, 0x81, 0x01, 0x67, 0x69, 0x0f, + 0xde, 0x80, 0x55, 0xd6, 0xc0, 0xde, 0x72, 0x85, 0xc0, 0x46, 0x60, 0xf0, + 0xce, 0x60, 0x2a, 0x88, 0x08, 0x8d, 0x9c, 0x30, 0xeb, 0xa9, 0x8b, 0x40, + 0xf3, 0x61, 0x25, 0x09, 0xe1, 0xe1, 0x82, 0x32, 0x04, 0xa5, 0x29, 0xf8, + 0x59, 0xec, 0x26, 0xb6, 0xc8, 0xd7, 0x23, 0xf0, 0x0b, 0xd3, 0x6c, 0x63, + 0x6a, 0xda, 0x2f, 0xd2, 0xd3, 0xa5, 0x25, 0x9a, 0x9a, 0x5e, 0xa5, 0xfd, + 0x02, 0xa5, 0xec, 0xa2, 0x90, 0x81, 0x68, 0x3e, 0x3d, 0x45, 0x8e, 0x7c, + 0x05, 0xb2, 0x2e, 0xea, 0x99, 0x01, 0x45, 0xfd, 0x09, 0x30, 0x94, 0x26, + 0xd7, 0x4a, 0x2c, 0xfe, 0x7d, 0x82, 0x44, 0x33, 0x43, 0x55, 0xcb, 0x5a, + 0x43, 0xd2, 0x92, 0x92, 0xfe, 0x4e, 0x47, 0xc6, 0x49, 0x3f, 0x35, 0x1b, + 0x21, 0x9c, 0x6a, 0xda, 0x82, 0xfc, 0x64, 0x37, 0xfb, 0x27, 0xea, 0xf4, + 0x30, 0xdf, 0x65, 0xec, 0xd0, 0xfc, 0x50, 0x01, 0x38, 0x6a, 0xec, 0xdc, + 0x51, 0xf6, 0xf5, 0xee, 0x9b, 0x26, 0xcc, 0xee, 0x6d, 0xfe, 0x2f, 0x56, + 0x0e, 0x3a, 0xe8, 0x38, 0x22, 0x8e, 0xaa +}; + +CONST UINTN mSizeOfMicrosoftUefiOpRom2023 = sizeof mMicrosoftUefiOpRom2023; + +// +// Fifth DB entry: "Windows UEFI CA 2023" +// +CONST UINT8 mWindowsUefi2023[] = { + 0x30, 0x82, 0x05, 0xaa, 0x30, 0x82, 0x03, 0x92, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x13, 0x33, 0x00, 0x00, 0x00, 0x1a, 0x88, 0x8b, 0x98, 0x00, + 0x56, 0x22, 0x84, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, + 0x00, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, + 0x04, 0x08, 0x13, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, + 0x6f, 0x6e, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, + 0x07, 0x52, 0x65, 0x64, 0x6d, 0x6f, 0x6e, 0x64, 0x31, 0x1e, 0x30, 0x1c, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, + 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x13, 0x29, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, + 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x20, 0x32, 0x30, 0x31, 0x30, 0x30, 0x1e, 0x17, 0x0d, + 0x32, 0x33, 0x30, 0x36, 0x31, 0x33, 0x31, 0x38, 0x35, 0x38, 0x32, 0x39, + 0x5a, 0x17, 0x0d, 0x33, 0x35, 0x30, 0x36, 0x31, 0x33, 0x31, 0x39, 0x30, + 0x38, 0x32, 0x39, 0x5a, 0x30, 0x4c, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x1e, 0x30, 0x1c, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, + 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x14, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x20, 0x55, 0x45, + 0x46, 0x49, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x32, 0x33, 0x30, 0x82, + 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, + 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbc, 0xb2, 0x35, 0xd1, 0x54, + 0x79, 0xb4, 0x8f, 0xcc, 0x81, 0x2a, 0x6e, 0xb3, 0x12, 0xd6, 0x93, 0x97, + 0x30, 0x7c, 0x38, 0x5c, 0xbf, 0x79, 0x92, 0x19, 0x0a, 0x0f, 0x2d, 0x0a, + 0xfe, 0xbf, 0xe0, 0xa8, 0xd8, 0x32, 0x3f, 0xd2, 0xab, 0x6f, 0x6f, 0x81, + 0xc1, 0x4d, 0x17, 0x69, 0x45, 0xcf, 0x85, 0x80, 0x27, 0xa3, 0x7c, 0xb3, + 0x31, 0xcc, 0xa5, 0xa7, 0x4d, 0xf9, 0x43, 0xd0, 0x5a, 0x2f, 0xd7, 0x18, + 0x1b, 0xd2, 0x58, 0x96, 0x05, 0x39, 0xa3, 0x95, 0xb7, 0xbc, 0xdd, 0x79, + 0xc1, 0xa0, 0xcf, 0x8f, 0xe2, 0x53, 0x1e, 0x2b, 0x26, 0x62, 0xa8, 0x1c, + 0xae, 0x36, 0x1e, 0x4f, 0xa1, 0xdf, 0xb9, 0x13, 0xba, 0x0c, 0x25, 0xbb, + 0x24, 0x65, 0x67, 0x01, 0xaa, 0x1d, 0x41, 0x10, 0xb7, 0x36, 0xc1, 0x6b, + 0x2e, 0xb5, 0x6c, 0x10, 0xd3, 0x4e, 0x96, 0xd0, 0x9f, 0x2a, 0xa1, 0xf1, + 0xed, 0xa1, 0x15, 0x0b, 0x82, 0x95, 0xc5, 0xff, 0x63, 0x8a, 0x13, 0xb5, + 0x92, 0x34, 0x1e, 0x31, 0x5e, 0x61, 0x11, 0xae, 0x5d, 0xcc, 0xf1, 0x10, + 0xe6, 0x4c, 0x79, 0xc9, 0x72, 0xb2, 0x34, 0x8a, 0x82, 0x56, 0x2d, 0xab, + 0x0f, 0x7c, 0xc0, 0x4f, 0x93, 0x8e, 0x59, 0x75, 0x41, 0x86, 0xac, 0x09, + 0x10, 0x09, 0xf2, 0x51, 0x65, 0x50, 0xb5, 0xf5, 0x21, 0xb3, 0x26, 0x39, + 0x8d, 0xaa, 0xc4, 0x91, 0xb3, 0xdc, 0xac, 0x64, 0x23, 0x06, 0xcd, 0x35, + 0x5f, 0x0d, 0x42, 0x49, 0x9c, 0x4f, 0x0d, 0xce, 0x80, 0x83, 0x82, 0x59, + 0xfe, 0xdf, 0x4b, 0x44, 0xe1, 0x40, 0xc8, 0x3d, 0x63, 0xb6, 0xcf, 0xb4, + 0x42, 0x0d, 0x39, 0x5c, 0xd2, 0x42, 0x10, 0x0c, 0x08, 0xc2, 0x74, 0xeb, + 0x1c, 0xdc, 0x6e, 0xbc, 0x0a, 0xac, 0x98, 0xbb, 0xcc, 0xfa, 0x1e, 0x3c, + 0xa7, 0x83, 0x16, 0xc5, 0xdb, 0x02, 0xda, 0xd9, 0x96, 0xdf, 0x6b, 0x02, + 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x46, 0x30, 0x82, 0x01, 0x42, + 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, + 0x03, 0x02, 0x01, 0x86, 0x30, 0x10, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, + 0x01, 0x82, 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x30, 0x1d, + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xae, 0xfc, 0x5f, + 0xbb, 0xbe, 0x05, 0x5d, 0x8f, 0x8d, 0xaa, 0x58, 0x54, 0x73, 0x49, 0x94, + 0x17, 0xab, 0x5a, 0x52, 0x72, 0x30, 0x19, 0x06, 0x09, 0x2b, 0x06, 0x01, + 0x04, 0x01, 0x82, 0x37, 0x14, 0x02, 0x04, 0x0c, 0x1e, 0x0a, 0x00, 0x53, + 0x00, 0x75, 0x00, 0x62, 0x00, 0x43, 0x00, 0x41, 0x30, 0x0f, 0x06, 0x03, + 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, + 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, + 0x80, 0x14, 0xd5, 0xf6, 0x56, 0xcb, 0x8f, 0xe8, 0xa2, 0x5c, 0x62, 0x68, + 0xd1, 0x3d, 0x94, 0x90, 0x5b, 0xd7, 0xce, 0x9a, 0x18, 0xc4, 0x30, 0x56, + 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x4f, 0x30, 0x4d, 0x30, 0x4b, 0xa0, + 0x49, 0xa0, 0x47, 0x86, 0x45, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x63, 0x72, 0x6c, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, + 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x72, + 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x2f, 0x4d, + 0x69, 0x63, 0x52, 0x6f, 0x6f, 0x43, 0x65, 0x72, 0x41, 0x75, 0x74, 0x5f, + 0x32, 0x30, 0x31, 0x30, 0x2d, 0x30, 0x36, 0x2d, 0x32, 0x33, 0x2e, 0x63, + 0x72, 0x6c, 0x30, 0x5a, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, + 0x01, 0x01, 0x04, 0x4e, 0x30, 0x4c, 0x30, 0x4a, 0x06, 0x08, 0x2b, 0x06, + 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x3e, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, + 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, + 0x2f, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x52, 0x6f, + 0x6f, 0x43, 0x65, 0x72, 0x41, 0x75, 0x74, 0x5f, 0x32, 0x30, 0x31, 0x30, + 0x2d, 0x30, 0x36, 0x2d, 0x32, 0x33, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, + 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x9f, 0xc9, 0xb6, 0xff, 0x6e, 0xe1, + 0x9c, 0x3b, 0x55, 0xf6, 0xfe, 0x8b, 0x39, 0xdd, 0x61, 0x04, 0x6f, 0xd0, + 0xad, 0x63, 0xcd, 0x17, 0x76, 0x4a, 0xa8, 0x43, 0x89, 0x8d, 0xf8, 0xc6, + 0xf2, 0x8c, 0x5e, 0x90, 0xe1, 0xe4, 0x68, 0xa5, 0x15, 0xec, 0xb8, 0xd3, + 0x60, 0x0c, 0x40, 0x57, 0x1f, 0xfb, 0x5e, 0x35, 0x72, 0x61, 0xde, 0x97, + 0x31, 0x6c, 0x79, 0xa0, 0xf5, 0x16, 0xae, 0x4b, 0x1c, 0xed, 0x01, 0x0c, + 0xef, 0xf7, 0x57, 0x0f, 0x42, 0x30, 0x18, 0x69, 0xf8, 0xa1, 0xa3, 0x2e, + 0x97, 0x92, 0xb8, 0xbe, 0x1b, 0xfe, 0x2b, 0x86, 0x5e, 0x42, 0x42, 0x11, + 0x8f, 0x8e, 0x70, 0x4d, 0x90, 0xa7, 0xfd, 0x01, 0x63, 0xf2, 0x64, 0xbf, + 0x9b, 0xe2, 0x7b, 0x08, 0x81, 0xcf, 0x49, 0xf2, 0x37, 0x17, 0xdf, 0xf1, + 0xf9, 0x72, 0xd3, 0xc3, 0x1d, 0xc3, 0x90, 0x45, 0x4d, 0xe6, 0x80, 0x06, + 0xbd, 0xfd, 0xe5, 0x6a, 0x69, 0xce, 0xb3, 0x7e, 0x4e, 0x31, 0x5b, 0x84, + 0x73, 0xa8, 0xe8, 0x72, 0x3f, 0x27, 0x35, 0xc9, 0x7c, 0x20, 0xce, 0x00, + 0x9b, 0x4f, 0xe0, 0x4c, 0xb4, 0x36, 0x69, 0xcb, 0xf7, 0x34, 0x11, 0x11, + 0x74, 0x12, 0x7a, 0xa8, 0x8c, 0x2e, 0x81, 0x6c, 0xa6, 0x50, 0xad, 0x19, + 0xfa, 0xa8, 0x46, 0x45, 0x6f, 0xb1, 0x67, 0x73, 0xc3, 0x6b, 0xe3, 0x40, + 0xe8, 0x2a, 0x69, 0x8f, 0x24, 0x10, 0xe1, 0x29, 0x6e, 0x8d, 0x16, 0x88, + 0xee, 0x8e, 0x7f, 0x66, 0x93, 0x02, 0x6f, 0x5b, 0x9e, 0x04, 0x8c, 0xcc, + 0x81, 0x1c, 0xad, 0x97, 0x54, 0xf1, 0x18, 0x2e, 0x7e, 0x52, 0x90, 0xbc, + 0x51, 0xde, 0x2a, 0x0e, 0xae, 0x66, 0xea, 0xbc, 0x64, 0x6e, 0xa0, 0x91, + 0x64, 0xe4, 0x2f, 0x12, 0xa8, 0xbc, 0xe7, 0x6b, 0xba, 0xc7, 0x1b, 0x9b, + 0x79, 0x1a, 0x64, 0x66, 0xf1, 0x43, 0xb4, 0xd1, 0xc3, 0x46, 0x21, 0x38, + 0x81, 0x79, 0x4c, 0xfa, 0xf0, 0x31, 0x0d, 0xd3, 0x79, 0xff, 0x7a, 0x12, + 0xa5, 0x1d, 0xd9, 0xdd, 0xac, 0xa2, 0x0f, 0x71, 0x82, 0xf7, 0x93, 0xff, + 0x5c, 0xa1, 0x61, 0xae, 0x65, 0xf2, 0x14, 0x81, 0xed, 0x79, 0x5a, 0x9a, + 0x87, 0xea, 0x60, 0x7b, 0xcb, 0xb3, 0x4f, 0x75, 0x34, 0xca, 0xba, 0xa1, + 0xef, 0xa2, 0xf6, 0xa2, 0x80, 0x45, 0xa1, 0x8b, 0x27, 0x81, 0xcd, 0xd5, + 0x77, 0x38, 0x3e, 0xca, 0x4e, 0xdd, 0x28, 0xea, 0x58, 0xba, 0xc5, 0xa0, + 0x29, 0xde, 0x86, 0x8c, 0x88, 0xfc, 0x95, 0x27, 0x51, 0xdd, 0xab, 0xd3, + 0xd0, 0x5b, 0x0d, 0x77, 0xc7, 0x6c, 0x8f, 0x55, 0xd7, 0xd4, 0xa2, 0x0e, + 0x5b, 0xe4, 0x34, 0x46, 0x14, 0x16, 0x1d, 0xe3, 0x1c, 0xd6, 0x6d, 0x99, + 0xad, 0x4c, 0xec, 0x71, 0x73, 0x2f, 0xab, 0xce, 0xb2, 0xb4, 0x29, 0xde, + 0x55, 0x30, 0x53, 0x39, 0x3a, 0x32, 0x8b, 0xf0, 0xea, 0x9c, 0x88, 0x12, + 0x3b, 0x05, 0x68, 0x19, 0xbf, 0xcf, 0x87, 0x52, 0x10, 0xfb, 0xd6, 0x13, + 0x60, 0xf3, 0x41, 0x64, 0xf4, 0x08, 0x57, 0x81, 0xcb, 0x9d, 0x11, 0xa5, + 0x8e, 0xf4, 0xe5, 0x27, 0xf5, 0xa3, 0x3a, 0xec, 0xe4, 0x3d, 0x4a, 0xb7, + 0xce, 0xf9, 0x88, 0x0d, 0x9f, 0xbd, 0xca, 0x6d, 0xd2, 0x4a, 0xbc, 0x58, + 0x76, 0x8e, 0x32, 0x04, 0x94, 0x6e, 0xdd, 0xf4, 0xcf, 0x6d, 0x47, 0x6d, + 0xc2, 0xd7, 0x6a, 0xdc, 0x87, 0x71, 0xea, 0xa4, 0xbf, 0xef, 0x67, 0x97, + 0x9c, 0xb8, 0xc7, 0x80, 0x36, 0x2a, 0x2a, 0x59, 0xc9, 0xc0, 0x0c, 0xa7, + 0x44, 0xa0, 0x73, 0xb5, 0x8c, 0xcf, 0x38, 0x5a, 0xae, 0xf8, 0xbb, 0x86, + 0x95, 0xf0, 0x44, 0xad, 0x66, 0x7a, 0x33, 0xed, 0x71, 0xe4, 0x45, 0x87, + 0x83, 0xe5, 0xa7, 0xce, 0xa2, 0x40, 0xd0, 0x72, 0xd2, 0x48, 0x00, 0xfa, + 0xf9, 0x1a +}; + +CONST UINTN mSizeOfWindowsUefi2023 = sizeof mWindowsUefi2023; + // // The Microsoft.UefiSecureBootLogo.Tests.OutOfBoxConfirmDBXisPresent test case // of the Secure Boot Logo Test in the Microsoft Hardware Certification Kit diff --git a/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.c b/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.c index 88b6bafee8cc..c19764256faa 100644 --- a/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.c +++ b/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.c @@ -702,6 +702,15 @@ ShellAppMain ( mMicrosoftUefiCa, mSizeOfMicrosoftUefiCa, &gMicrosoftVendorGuid, + mMicrosoftUefiCa2023, + mSizeOfMicrosoftUefiCa2023, + &gMicrosoftVendorGuid, + mMicrosoftUefiOpRom2023, + mSizeOfMicrosoftUefiOpRom2023, + &gMicrosoftVendorGuid, + mWindowsUefi2023, + mSizeOfWindowsUefi2023, + &gMicrosoftVendorGuid, NULL ); } @@ -750,6 +759,9 @@ ShellAppMain ( mMicrosoftKek, mSizeOfMicrosoftKek, &gMicrosoftVendorGuid, + mMicrosoftKek2023, + mSizeOfMicrosoftKek2023, + &gMicrosoftVendorGuid, NULL ); } diff --git a/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.h b/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.h index 56da9c71d639..07800ce5712b 100644 --- a/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.h +++ b/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.h @@ -124,12 +124,24 @@ typedef struct { extern CONST UINT8 mMicrosoftKek[]; extern CONST UINTN mSizeOfMicrosoftKek; +extern CONST UINT8 mMicrosoftKek2023[]; +extern CONST UINTN mSizeOfMicrosoftKek2023; + extern CONST UINT8 mMicrosoftPca[]; extern CONST UINTN mSizeOfMicrosoftPca; extern CONST UINT8 mMicrosoftUefiCa[]; extern CONST UINTN mSizeOfMicrosoftUefiCa; +extern CONST UINT8 mMicrosoftUefiCa2023[]; +extern CONST UINTN mSizeOfMicrosoftUefiCa2023; + +extern CONST UINT8 mMicrosoftUefiOpRom2023[]; +extern CONST UINTN mSizeOfMicrosoftUefiOpRom2023; + +extern CONST UINT8 mWindowsUefi2023[]; +extern CONST UINTN mSizeOfWindowsUefi2023; + extern CONST UINT8 mSha256OfDevNull[]; extern CONST UINTN mSizeOfSha256OfDevNull; From 2509b4be74d0f89f202f59a61a7b7467cd69e18b Mon Sep 17 00:00:00 2001 From: Prachotan Bathi Date: Tue, 28 Oct 2025 07:45:13 -0500 Subject: [PATCH 0727/1172] ArmPlatformPkg: Update transfer list register usage before stack setup Previously register x6 was used to temporarily hold the transfer list address before the stack was setup and the jump to C code. This however is not working for RPi3, platform code uses w6 which aliases x6 causing overwrites. Instead we now use TPIDRRO_EL0 to temporarily hold the value. This is inspired by PEI using TPIDR_EL0 to store the PEI services table pointer. Signed-off-by: Prachotan Bathi --- ArmPlatformPkg/PeilessSec/AArch64/ModuleEntryPoint.S | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ArmPlatformPkg/PeilessSec/AArch64/ModuleEntryPoint.S b/ArmPlatformPkg/PeilessSec/AArch64/ModuleEntryPoint.S index 94635ef8d340..89906fa21e90 100644 --- a/ArmPlatformPkg/PeilessSec/AArch64/ModuleEntryPoint.S +++ b/ArmPlatformPkg/PeilessSec/AArch64/ModuleEntryPoint.S @@ -20,8 +20,8 @@ ASM_FUNC(_ModuleEntryPoint) // Skip TransferList init if x2 is not equal to 0 cbnz x2, _SkipTransferList - // Set the TransferList Base Address from register x3 - mov x6, x3 + // Set the TransferList Base Address from register x3 to TPIDRRO_EL0 + msr TPIDRRO_EL0, x3 _SkipTransferList: // Do early platform specific actions @@ -93,7 +93,7 @@ _GetStackBase: sub x1, x1, x2 // Pass Transfer List Base Address - mov x2, x6 + mrs x2, TPIDRRO_EL0 // Move sec startup address into a data register // Ensure we're jumping to FV version of the code (not boot remapped alias) ldr x4, =ASM_PFX(CEntryPoint) From aba2b4e221c49aa60f76c2552967329b1097219e Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 30 Oct 2025 10:49:23 -0700 Subject: [PATCH 0728/1172] EmulatorPkg/Win/Host: Fix loaded DLL page protections The current algorithm evaluates page protection in sections of a PE/COFF image at DWORD granularity and it skips the evaluation of the first DWORD of the PE/COFF image. If a PE/COFF section has a VirtualSize that is ends in first 4 bytes of a 4KB page, then the PE/COFF section protection attributes for that section are not applied to that page due to the DWORD stride. For example, a .text section with a VirtualSize of 0x1001, 0x1002, 0x1003, or 0x1004 followed by non .text section will not apply the PAGE_EXECUTE_READ attribute to the second page of the .text section and execution of code at the end of that .text section generates an access violation exception. The fix is to change the stride for evaluating page protection attributes from DWORD to BYTE. The loop is also updated to include evaluation of the first DWORD of the PE/COFF image. Signed-off-by: Michael D Kinney --- EmulatorPkg/Win/Host/WinHost.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/EmulatorPkg/Win/Host/WinHost.c b/EmulatorPkg/Win/Host/WinHost.c index 9a5201f4d12b..d22265b650cc 100644 --- a/EmulatorPkg/Win/Host/WinHost.c +++ b/EmulatorPkg/Win/Host/WinHost.c @@ -1217,14 +1217,14 @@ PeCoffLoaderRelocateImageExtraAction ( } // - // Loop over every DWORD in memory and compute the union of the memory + // Loop over every byte in memory and compute the union of the memory // access bits. // End = (UINTN)Library + (UINTN)PeCoffImageContext.ImageSize; RegionBase = (UINTN)Library; RegionSize = 0; Flags = 0; - for (Base = (UINTN)Library + sizeof (UINT32); Base < End; Base += sizeof (UINT32)) { + for (Base = (UINTN)Library; Base < End; Base++) { for (Index = 0; Index < NumberOfSections; Index++) { if ((SectionData[Index].Base <= Base) && ((SectionData[Index].Base + SectionData[Index].Size) > Base)) @@ -1234,10 +1234,10 @@ PeCoffLoaderRelocateImageExtraAction ( } // - // When a new page is reached configure the memory access for the - // previous page. + // When end of current page is reached configure the memory access for + // the current page. // - if (Base % SIZE_4KB == 0) { + if (IS_ALIGNED (Base + 1, SIZE_4KB)) { RegionSize += SIZE_4KB; if ((Flags & EFI_IMAGE_SCN_MEM_WRITE) == EFI_IMAGE_SCN_MEM_WRITE) { if ((Flags & EFI_IMAGE_SCN_MEM_EXECUTE) == EFI_IMAGE_SCN_MEM_EXECUTE) { @@ -1263,7 +1263,7 @@ PeCoffLoaderRelocateImageExtraAction ( } Flags = 0; - RegionBase = Base; + RegionBase = Base + 1; RegionSize = 0; } } From ed79e67369982b277b19ea8a83369fd3f27613b9 Mon Sep 17 00:00:00 2001 From: Hongbin1 Zhang Date: Tue, 28 Oct 2025 11:02:01 +0800 Subject: [PATCH 0729/1172] IntelFsp2Pkg: Add check if current OS support tkinter or not current Linux auto test OS did not support python tkinter feature, but windows auto test system supported it as default, so add a check for it. Signed-off-by: Hongbin1 Zhang Cc: Ray Ni Cc: Star Zeng Cc: Chasel Chiu Cc: Nate DeSimone Cc: Ted Kuo Cc: Ashraf Ali S --- IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py | 44 +++++++++++++------ 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py b/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py index 489120bcf08c..4657d09d0257 100644 --- a/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py +++ b/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py @@ -12,8 +12,6 @@ import string import operator as op import ast -import tkinter.messagebox as messagebox -import tkinter from datetime import date from collections import OrderedDict @@ -639,6 +637,7 @@ def __init__(self): self._macro_dict = {} self.binseg_dict = {} self.initialize() + self._tk = self.import_tkinter() def initialize(self): self._old_bin = None @@ -1640,6 +1639,15 @@ def _get_cfg_segment(name, cfgs, level): return cfg_segs + def import_tkinter(self): + try: + import tkinter + import tkinter.messagebox + return tkinter + except ImportError: + print('tkinter is not supported under current OS') + return None + def get_bin_segment(self, bin_data): cfg_segs = self.get_cfg_segment() bin_segs = [] @@ -1654,11 +1662,14 @@ def get_bin_segment(self, bin_data): next_pos = bin_data.find(key, pos + len(seg[0])) if next_pos >= 0: if key == b'$SKLFSP$' or key == b'$BSWFSP$': - string = ('Warning: Multiple matches for %s in ' + string = ('Multiple matches for %s in ' 'binary!\n\nA workaround applied to such ' 'FSP 1.x binary to use second' ' match instead of first match!' % key) - messagebox.showwarning('Warning!', string) + if self._tk: + self._tk.messagebox.showwarning('Warning: ', string) + else: + print('Warning: ', string) pos = next_pos else: print("Warning: Multiple matches for '%s' " @@ -1688,7 +1699,10 @@ def extract_cfg_from_bin(self, bin_data): else: self.missing_fv.append(each[0]) string = each[0] + ' is not availabe.' - messagebox.showinfo('', string) + if self._tk: + self._tk.messagebox.showinfo('', string) + else: + print('warning: ', string) cfg_bins.extend(bytearray(each[2])) Dummy_offset += each[2] return cfg_bins @@ -1715,32 +1729,34 @@ def save_current_to_bin(self): return bin_data def show_data_difference(self, data_diff): + if self._tk is None: + return # Displays if any data difference detected in BSF and Binary file pop_up_text = 'There are differences in Config file and binary '\ 'data detected!\n' pop_up_text += data_diff - window = tkinter.Tk() + window = self._tk.Tk() window.title("Data Difference") window.resizable(1, 1) # Window Size window.geometry("800x400") - frame = tkinter.Frame(window, height=800, width=700) - frame.pack(side=tkinter.BOTTOM) + frame = self._tk.Frame(window, height=800, width=700) + frame.pack(side=self._tk.BOTTOM) # Vertical (y) Scroll Bar - scroll = tkinter.Scrollbar(window) - scroll.pack(side=tkinter.RIGHT, fill=tkinter.Y) + scroll = self._tk.Scrollbar(window) + scroll.pack(side=self._tk.RIGHT, fill=self._tk.Y) - text = tkinter.Text(window, wrap=tkinter.NONE, + text = self._tk.Text(window, wrap=self._tk.NONE, yscrollcommand=scroll.set, width=700, height=400) - text.insert(tkinter.INSERT, pop_up_text) + text.insert(self._tk.INSERT, pop_up_text) text.pack() # Configure the scrollbars scroll.config(command=text.yview) - exit_button = tkinter.Button( + exit_button = self._tk.Button( window, text="Close", command=window.destroy) - exit_button.pack(in_=frame, side=tkinter.RIGHT, padx=20, pady=10) + exit_button.pack(in_=frame, side=self._tk.RIGHT, padx=20, pady=10) def load_default_from_bin(self, bin_data): self._old_bin = bin_data From 94065db3dc726124b5f607896431e47b36707c90 Mon Sep 17 00:00:00 2001 From: kuqin12 <42554914+kuqin12@users.noreply.github.com> Date: Thu, 11 Sep 2025 22:02:42 -0700 Subject: [PATCH 0730/1172] MdeModulePkg: ArmFfaLib: Add FFA_YIELD handling If a secure partition on AArch64 platforms would consume extended time to operate with peripherals, it might elect to yield the control back to normal world and expect the normal world to callback after hinted period of time. This change adds the FFA_YIELD handling from ArmFfaLib to support long operations from secure partitions. Timeout arguments are ignored because systems in this context cannot benefit from the timeout period. Treating FFA_YIELD like FFA_INTERRUPT and expecting the caller to invoke FFA_RUN is the least disruptive approach while achieving the intended behavior. This was tested on proprietary hardware platforms and booted to Windows. Signed-off-by: Kun Qin --- MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c index 0d6f0c1e408c..d43821978846 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c @@ -143,7 +143,7 @@ FfaArgsToEfiStatus ( * FfaStatusToEfiStatus (FfaARgs.Arg2) returns proper EFI_STATUS. */ FfaStatus = ARM_FFA_RET_NOT_SUPPORTED; - } else if (FfaArgs->Arg0 == ARM_FID_FFA_INTERRUPT) { + } else if ((FfaArgs->Arg0 == ARM_FID_FFA_INTERRUPT) || (FfaArgs->Arg0 == ARM_FID_FFA_YIELD)) { FfaStatus = ARM_FFA_RET_INTERRUPTED; } else { FfaStatus = ARM_FFA_RET_SUCCESS; From 9b71501f6c190a3767f50fdfff24bbe7f213a65f Mon Sep 17 00:00:00 2001 From: eeshanl Date: Fri, 31 Oct 2025 17:27:50 +0000 Subject: [PATCH 0731/1172] NetworkPkg/SnpDxe: Fix Snp used uninitialized Ensures the Snp Structure is initialized as NULL. Signed-off-by: Eeshan Londhe --- NetworkPkg/SnpDxe/Snp.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NetworkPkg/SnpDxe/Snp.c b/NetworkPkg/SnpDxe/Snp.c index 2b3f943f5acd..f4337a911359 100644 --- a/NetworkPkg/SnpDxe/Snp.c +++ b/NetworkPkg/SnpDxe/Snp.c @@ -324,6 +324,8 @@ SimpleNetworkDriverStart ( DEBUG ((DEBUG_NET, "\nSnpNotifyNetworkInterfaceIdentifier() ")); + Snp = NULL; + Status = gBS->OpenProtocol ( Controller, &gEfiDevicePathProtocolGuid, From 2ff1029cc38ad1b9955c57c5aa04ce0e2127cb9d Mon Sep 17 00:00:00 2001 From: Qihang Gao Date: Tue, 28 Oct 2025 11:22:12 +0800 Subject: [PATCH 0732/1172] RedfishPkg: Add missing FreePool to fix memory leak issue According to the implementation of `HiiGetSupportedLanguages`, the caller is responsible for freeing the returned string using FreePool(). Signed-off-by: Qihang Gao --- .../RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c index 5aaf4adfd1f3..0d32f16cd9f0 100644 --- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c +++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c @@ -508,12 +508,16 @@ GetSupportedSchema ( } if (Count == 0) { + FreePool (SupportedLanguages); + return EFI_NOT_FOUND; } SupportedSchema->Count = Count; SupportedSchema->SchemaList = AllocatePool (sizeof (CHAR8 *) * Count); if (SupportedSchema->SchemaList == NULL) { + FreePool (SupportedLanguages); + return EFI_OUT_OF_RESOURCES; } @@ -539,6 +543,8 @@ GetSupportedSchema ( ++Index; } + FreePool (SupportedLanguages); + return EFI_SUCCESS; } From 641bd542588cd4e84acffce9b7b3924511e95228 Mon Sep 17 00:00:00 2001 From: Phil Noh Date: Mon, 20 Oct 2025 18:23:14 -0500 Subject: [PATCH 0733/1172] UefiCpuPkg/SmmCpuFeaturesLib: Add Standalone MM support for AMD family Add the INF file of AmdStandaloneMmCpuFeaturesLib for AMD family, which supports building the SmmCpuFeaturesLib code for Standalone MM. It is based on the existing file, StandaloneMmCpuFeaturesLib.inf. Minimal code changes are also made to allow reuse of existing code for Standalone MM. Signed-off-by: Phil Noh --- .../AmdStandaloneMmCpuFeaturesLib.inf | 47 +++++++++++++++++++ UefiCpuPkg/UefiCpuPkg.dsc | 3 +- 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdStandaloneMmCpuFeaturesLib.inf diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdStandaloneMmCpuFeaturesLib.inf b/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdStandaloneMmCpuFeaturesLib.inf new file mode 100644 index 000000000000..72545a9b57db --- /dev/null +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdStandaloneMmCpuFeaturesLib.inf @@ -0,0 +1,47 @@ +## @file +# Standalone MM CPU specific programming. +# +# Copyright (c) 2009 - 2023, Intel Corporation. All rights reserved.
    +# Copyright (c) Microsoft Corporation.
    +# Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved.
    +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = AmdStandaloneMmCpuFeaturesLib + MODULE_UNI_FILE = SmmCpuFeaturesLib.uni + FILE_GUID = 1CDE089F-6038-4C8A-96DF-6B6AE602FC84 + MODULE_TYPE = MM_STANDALONE + VERSION_STRING = 1.0 + PI_SPECIFICATION_VERSION = 0x00010032 + LIBRARY_CLASS = SmmCpuFeaturesLib + CONSTRUCTOR = StandaloneMmCpuFeaturesLibConstructor + +[Sources] + SmmCpuFeaturesLibCommon.c + StandaloneMmCpuFeaturesLib.c + AmdSmmCpuFeaturesLib.c + CpuFeaturesLib.h + +[Packages] + MdePkg/MdePkg.dec + UefiCpuPkg/UefiCpuPkg.dec + +[LibraryClasses] + BaseLib + DebugLib + MemoryAllocationLib + PcdLib + HobLib + MmSaveStateLib + +[Guids] + gSmmBaseHobGuid ## CONSUMES + +[FixedPcd] + gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber ## SOMETIMES_CONSUMES + +[FeaturePcd] + gUefiCpuPkgTokenSpaceGuid.PcdSmrrEnable ## CONSUMES diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc index ce6d6f306178..8de397f2b589 100644 --- a/UefiCpuPkg/UefiCpuPkg.dsc +++ b/UefiCpuPkg/UefiCpuPkg.dsc @@ -2,7 +2,7 @@ # UefiCpuPkg Package # # Copyright (c) 2007 - 2024, Intel Corporation. All rights reserved.
    -# Copyright (C) 2023 - 2024, Advanced Micro Devices, Inc. All rights reserved.
    +# Copyright (C) 2023 - 2025, Advanced Micro Devices, Inc. All rights reserved.
    # # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -212,6 +212,7 @@ UefiCpuPkg/Library/AmdSysCallLibNull/AmdSysCallLibNull.inf UefiCpuPkg/Library/MmSaveStateLib/IntelMmSaveStateLib.inf UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.inf + UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdStandaloneMmCpuFeaturesLib.inf UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.inf UefiCpuPkg/Library/SmmRelocationLib/AmdSmmRelocationLib.inf From cb8c8c928558fa56224dee7e0c393cd663ee1aa3 Mon Sep 17 00:00:00 2001 From: Pethaiyan Madhan Date: Tue, 23 Apr 2024 18:21:24 +0530 Subject: [PATCH 0734/1172] FmpDevicePkg: GetImageInfo Add missing conditions REF: UEFI spec v2.10 23.1.2 REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4660 1.For EFI_FIRMWARE_MANAGEMENT_PROTOCOL.GetImage(): Add the following sentence at the end of the Image parameter description. "May be NULL with a zero ImageSize in order to determine the size of the buffer needed". Modify the description of "EFI_INVALID_PARAMETER" return code as "The ImageSize is not too small and Image is NULL." 2.For EFI_FIRMWARE_MANAGEMENT_PROTOCOL.GetImageInfo(): Add the following sentence at the end of the ImageInfo parameter description."May be NULL with a zero ImageInfoSize in order to determine the size of the buffer needed". Modify the description of "EFI_INVALID_PARAMETER" return code as "The ImageInfoSize is not too small and Image is NULL." and add new descriptions for "EFI_INVALID_PARAMETER" return code. Cc: Michael D Kinney Cc: Liming Gao Cc: Zhiguang Liu Cc: Yi Li Signed-off-by: Pethaiyan Madhan --- FmpDevicePkg/FmpDxe/FmpDxe.c | 68 +++++++++++++++++++++--------------- FmpDevicePkg/FmpDxe/FmpDxe.h | 13 +++++-- 2 files changed, 50 insertions(+), 31 deletions(-) diff --git a/FmpDevicePkg/FmpDxe/FmpDxe.c b/FmpDevicePkg/FmpDxe/FmpDxe.c index 3850e8a82972..57ab2cda04d9 100644 --- a/FmpDevicePkg/FmpDxe/FmpDxe.c +++ b/FmpDevicePkg/FmpDxe/FmpDxe.c @@ -51,38 +51,38 @@ const FIRMWARE_MANAGEMENT_PRIVATE_DATA mFirmwareManagementPrivateDataTemplate = SetPackageInfo }, FALSE, // DescriptorPopulated - { // Desc - 1, // ImageIndex + { // Desc + 1, // ImageIndex // // ImageTypeId // { 0x00000000, 0x0000,0x0000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, - 1, // ImageId - NULL, // ImageIdName - 0, // Version - NULL, // VersionName - 0, // Size - 0, // AttributesSupported - 0, // AttributesSetting - 0, // Compatibilities - 0, // LowestSupportedImageVersion - 0, // LastAttemptVersion - 0, // LastAttemptStatus - 0 // HardwareInstance + 1, // ImageId + NULL, // ImageIdName + 0, // Version + NULL, // VersionName + 0, // Size + 0, // AttributesSupported + 0, // AttributesSetting + 0, // Compatibilities + 0, // LowestSupportedImageVersion + 0, // LastAttemptVersion + 0, // LastAttemptStatus + 0 // HardwareInstance }, - NULL, // ImageIdName - NULL, // VersionName - TRUE, // RuntimeVersionSupported - NULL, // FmpDeviceLockEvent - FALSE, // FmpDeviceLocked - NULL, // FmpDeviceContext - NULL, // VersionVariableName - NULL, // LsvVariableName - NULL, // LastAttemptStatusVariableName - NULL, // LastAttemptVersionVariableName - NULL, // FmpStateVariableName - TRUE // DependenciesSatisfied + NULL, // ImageIdName + NULL, // VersionName + TRUE, // RuntimeVersionSupported + NULL, // FmpDeviceLockEvent + FALSE, // FmpDeviceLocked + NULL, // FmpDeviceContext + NULL, // VersionVariableName + NULL, // LsvVariableName + NULL, // LastAttemptStatusVariableName + NULL, // LastAttemptVersionVariableName + NULL, // FmpStateVariableName + TRUE // DependenciesSatisfied }; /// @@ -422,6 +422,8 @@ PopulateDescriptor ( to contain the image(s) information if the buffer was too small. @param[in, out] ImageInfo A pointer to the buffer in which firmware places the current image(s) information. The information is an array of EFI_FIRMWARE_IMAGE_DESCRIPTORs. + May be NULL with a zero ImageInfoSize in order to determine the size of the + buffer needed. @param[out] DescriptorVersion A pointer to the location in which firmware returns the version number associated with the EFI_FIRMWARE_IMAGE_DESCRIPTOR. @param[out] DescriptorCount A pointer to the location in which firmware returns the number of @@ -442,7 +444,13 @@ PopulateDescriptor ( @retval EFI_SUCCESS The device was successfully updated with the new image. @retval EFI_BUFFER_TOO_SMALL The ImageInfo buffer was too small. The current buffer size needed to hold the image(s) information is returned in ImageInfoSize. - @retval EFI_INVALID_PARAMETER ImageInfoSize is NULL. + @retval EFI_INVALID_PARAMETER ImageInfoSize is not too small and ImageInfo is NULL. + @retval EFI_INVALID_PARAMETER ImageInfoSize is non-zero and DescriptorVersion is NULL. + @retval EFI_INVALID_PARAMETER ImageInfoSize is non-zero and DescriptorCount is NULL. + @retval EFI_INVALID_PARAMETER ImageInfoSize is non-zero and DescriptorSize is NULL. + @retval EFI_INVALID_PARAMETER ImageInfoSize is non-zero and PackageVersion is NULL. + @retval EFI_INVALID_PARAMETER ImageInfoSize is non-zero and PackageVersionName is NULL. + @retval EFI_DEVICE_ERROR Valid information could not be returned. Possible corrupted image. **/ @@ -500,7 +508,7 @@ GetTheImageInfo ( // Confirm that buffer isn't null // if ( (ImageInfo == NULL) || (DescriptorVersion == NULL) || (DescriptorCount == NULL) || (DescriptorSize == NULL) - || (PackageVersion == NULL)) + || (PackageVersion == NULL) || (PackageVersionName == NULL)) { DEBUG ((DEBUG_ERROR, "FmpDxe(%s): GetImageInfo() - Pointer Parameter is NULL.\n", mImageIdName)); Status = EFI_INVALID_PARAMETER; @@ -549,6 +557,8 @@ GetTheImageInfo ( @param[in] ImageIndex A unique number identifying the firmware image(s) within the device. The number is between 1 and DescriptorCount. @param[in, out] Image Points to the buffer where the current image is copied to. + May be NULL with a zero ImageSize in order to determine the size of the + buffer needed. @param[in, out] ImageSize On entry, points to the size of the buffer pointed to by Image, in bytes. On return, points to the length of the image, in bytes. @@ -556,7 +566,7 @@ GetTheImageInfo ( @retval EFI_BUFFER_TOO_SMALL The buffer specified by ImageSize is too small to hold the image. The current buffer size needed to hold the image is returned in ImageSize. - @retval EFI_INVALID_PARAMETER The Image was NULL. + @retval EFI_INVALID_PARAMETER The ImageSize is not too small and Image is NULL. @retval EFI_NOT_FOUND The current image is not copied to the buffer. @retval EFI_UNSUPPORTED The operation is not supported. @retval EFI_SECURITY_VIOLATION The operation could not be completed due to an image corruption. diff --git a/FmpDevicePkg/FmpDxe/FmpDxe.h b/FmpDevicePkg/FmpDxe/FmpDxe.h index 7baf730e690e..5b1d4422389c 100644 --- a/FmpDevicePkg/FmpDxe/FmpDxe.h +++ b/FmpDevicePkg/FmpDxe/FmpDxe.h @@ -114,6 +114,8 @@ DetectTestKey ( to contain the image(s) information if the buffer was too small. @param[in, out] ImageInfo A pointer to the buffer in which firmware places the current image(s) information. The information is an array of EFI_FIRMWARE_IMAGE_DESCRIPTORs. + May be NULL with a zero ImageInfoSize in order to determine the size of the + buffer needed. @param[out] DescriptorVersion A pointer to the location in which firmware returns the version number associated with the EFI_FIRMWARE_IMAGE_DESCRIPTOR. @param[out] DescriptorCount A pointer to the location in which firmware returns the number of @@ -134,7 +136,12 @@ DetectTestKey ( @retval EFI_SUCCESS The device was successfully updated with the new image. @retval EFI_BUFFER_TOO_SMALL The ImageInfo buffer was too small. The current buffer size needed to hold the image(s) information is returned in ImageInfoSize. - @retval EFI_INVALID_PARAMETER ImageInfoSize is NULL. + @retval EFI_INVALID_PARAMETER ImageInfoSize is not too small and ImageInfo is NULL. + @retval EFI_INVALID_PARAMETER ImageInfoSize is non-zero and DescriptorVersion is NULL. + @retval EFI_INVALID_PARAMETER ImageInfoSize is non-zero and DescriptorCount is NULL. + @retval EFI_INVALID_PARAMETER ImageInfoSize is non-zero and DescriptorSize is NULL. + @retval EFI_INVALID_PARAMETER ImageInfoSize is non-zero and PackageVersion is NULL. + @retval EFI_INVALID_PARAMETER ImageInfoSize is non-zero and PackageVersionName is NULL. @retval EFI_DEVICE_ERROR Valid information could not be returned. Possible corrupted image. **/ @@ -161,6 +168,8 @@ GetTheImageInfo ( @param[in] ImageIndex A unique number identifying the firmware image(s) within the device. The number is between 1 and DescriptorCount. @param[in, out] Image Points to the buffer where the current image is copied to. + May be NULL with a zero ImageSize in order to determine the size of the + buffer needed. @param[in, out] ImageSize On entry, points to the size of the buffer pointed to by Image, in bytes. On return, points to the length of the image, in bytes. @@ -168,7 +177,7 @@ GetTheImageInfo ( @retval EFI_BUFFER_TOO_SMALL The buffer specified by ImageSize is too small to hold the image. The current buffer size needed to hold the image is returned in ImageSize. - @retval EFI_INVALID_PARAMETER The Image was NULL. + @retval EFI_INVALID_PARAMETER The ImageSize is not too small and Image is NULL. @retval EFI_NOT_FOUND The current image is not copied to the buffer. @retval EFI_UNSUPPORTED The operation is not supported. @retval EFI_SECURITY_VIOLATION The operation could not be performed due to an authentication failure. From b7d91dbe8a3c25cd208eaf7868435bff3989fa11 Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Wed, 2 Jul 2025 13:35:02 -0700 Subject: [PATCH 0735/1172] BaseTools/GenFW: RISC-V: Detect Zicfilp extension Parse the ELF file for RISC-V Zicfilp extension support to identify forward control flow integrity (FCFI) features. Signed-off-by: Tuan Phan --- BaseTools/Source/C/GenFw/Elf64Convert.c | 5 +++++ BaseTools/Source/C/GenFw/elf_common.h | 3 +++ 2 files changed, 8 insertions(+) diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c b/BaseTools/Source/C/GenFw/Elf64Convert.c index 996f91584e63..83f1b285c20c 100644 --- a/BaseTools/Source/C/GenFw/Elf64Convert.c +++ b/BaseTools/Source/C/GenFw/Elf64Convert.c @@ -802,6 +802,11 @@ ParseNoteSection ( Prop2 = GNU_PROPERTY_X86_FEATURE_1_IBT; break; + case EM_RISCV64: + Prop0 = GNU_PROPERTY_RISCV64_FEATURE_1_AND; + Prop2 = GNU_PROPERTY_RISCV64_FEATURE_1_FCFI; + break; + default: return; } diff --git a/BaseTools/Source/C/GenFw/elf_common.h b/BaseTools/Source/C/GenFw/elf_common.h index e4d0cdac4f31..cafe419a5416 100644 --- a/BaseTools/Source/C/GenFw/elf_common.h +++ b/BaseTools/Source/C/GenFw/elf_common.h @@ -68,6 +68,9 @@ typedef struct { #define GNU_PROPERTY_AARCH64_FEATURE_1_BTI 0x1 #define GNU_PROPERTY_AARCH64_FEATURE_1_PAC 0x2 +#define GNU_PROPERTY_RISCV64_FEATURE_1_AND 0xc0000000 +#define GNU_PROPERTY_RISCV64_FEATURE_1_FCFI 0x1 /* zicfilp */ + /* Indexes into the e_ident array. Keep synced with http://www.sco.com/developers/gabi/latest/ch4.eheader.html */ #define EI_MAG0 0 /* Magic number, byte 0. */ From 8058a94f60a129476a7955ee839cec96467b9bef Mon Sep 17 00:00:00 2001 From: Brit Chesley Date: Mon, 13 Oct 2025 17:14:59 -0500 Subject: [PATCH 0736/1172] MdePkg: Add IPMI Mailbox Size Define Added IPMI boot initiator mailbox define for the block data size. Signed-off-by: Brit Chesley --- MdePkg/Include/IndustryStandard/IpmiNetFnChassis.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/MdePkg/Include/IndustryStandard/IpmiNetFnChassis.h b/MdePkg/Include/IndustryStandard/IpmiNetFnChassis.h index e3b8a6210513..b95e4d585e86 100644 --- a/MdePkg/Include/IndustryStandard/IpmiNetFnChassis.h +++ b/MdePkg/Include/IndustryStandard/IpmiNetFnChassis.h @@ -379,9 +379,14 @@ typedef struct { UINT8 BootInfoTimeStamp[4]; } IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_6; +// +// Constant definitions for the boot initiator mailbox (parameter 7) +// +#define IPMI_BOOT_INITIATOR_MAILBOX_BLOCK_DATA_SIZE 16 + typedef struct { UINT8 SetSelector; - UINT8 BlockData[16]; + UINT8 BlockData[IPMI_BOOT_INITIATOR_MAILBOX_BLOCK_DATA_SIZE]; } IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_7; typedef union { From b98ccecdecec0bb768e6e5bd4df1694de87ad42f Mon Sep 17 00:00:00 2001 From: RARelph <44270374+RARelph@users.noreply.github.com> Date: Thu, 30 Oct 2025 17:02:27 -0500 Subject: [PATCH 0737/1172] MdePkg: Add code to detect running as an SEV guest Similar to Intel's Tdx, we need a mechanism to detect running as an AMD SEV guest that will work in all phases everywhere. This will be immediately used to prevent usage of MTRRs with SEV guests. Signed-off-by: Richard Relph --- MdePkg/Include/Library/BaseLib.h | 12 +++++ MdePkg/Library/BaseLib/AmdSevNull.c | 26 +++++++++++ MdePkg/Library/BaseLib/BaseLib.inf | 6 +++ .../Library/BaseLib/UnitTestHostBaseLib.inf | 2 + MdePkg/Library/BaseLib/X64/SevProbe.c | 45 +++++++++++++++++++ 5 files changed, 91 insertions(+) create mode 100644 MdePkg/Library/BaseLib/AmdSevNull.c create mode 100644 MdePkg/Library/BaseLib/X64/SevProbe.c diff --git a/MdePkg/Include/Library/BaseLib.h b/MdePkg/Include/Library/BaseLib.h index b50a1d5ecda5..a2b5b01f17d1 100644 --- a/MdePkg/Include/Library/BaseLib.h +++ b/MdePkg/Include/Library/BaseLib.h @@ -5396,6 +5396,18 @@ TdIsEnabled ( VOID ); +/** + Probe if running as some kind of SEV guest. + + @return FALSE Not running as a guest under any kind of SEV + @return TRUE Running as a guest under any kind of SEV +**/ +BOOLEAN +EFIAPI +SevGuestIsEnabled ( + VOID + ); + #if defined (MDE_CPU_X64) // // The page size for the PVALIDATE instruction diff --git a/MdePkg/Library/BaseLib/AmdSevNull.c b/MdePkg/Library/BaseLib/AmdSevNull.c new file mode 100644 index 000000000000..7610b6ee437d --- /dev/null +++ b/MdePkg/Library/BaseLib/AmdSevNull.c @@ -0,0 +1,26 @@ +/** @file + + Null stub of SevLib + + Copyright (c) 2025, Advanced Micro Devices, Inc. All rights reserved.
    + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include + +/** + Probe if running as some kind of SEV guest. + + @return FALSE Not running as a guest under any kind of SEV + @return TRUE Running as a guest under any kind of SEV +**/ +BOOLEAN +EFIAPI +SevGuestIsEnabled ( + VOID + ) +{ + return FALSE; +} diff --git a/MdePkg/Library/BaseLib/BaseLib.inf b/MdePkg/Library/BaseLib/BaseLib.inf index 7925d8cef633..aa067a77a5f4 100644 --- a/MdePkg/Library/BaseLib/BaseLib.inf +++ b/MdePkg/Library/BaseLib/BaseLib.inf @@ -213,6 +213,7 @@ X86PatchInstruction.c X86SpeculationBarrier.c IntelTdxNull.c + X64/SevProbe.c [Sources.X64] X64/Thunk16.nasm @@ -299,6 +300,7 @@ X64/TdCall.nasm X64/TdVmcall.nasm X64/TdProbe.c + X64/SevProbe.c X64/Non-existing.c Math64.c @@ -340,6 +342,7 @@ Unaligned.c Math64.c IntelTdxNull.c + AmdSevNull.c [Sources.AARCH64] AArch64/InternalSwitchStack.c @@ -368,6 +371,7 @@ AArch64/ArmReadCntPctReg.asm | MSFT AArch64/ArmReadIdAA64Isar0Reg.asm | MSFT IntelTdxNull.c + AmdSevNull.c [Sources.RISCV64] Math64.c @@ -390,6 +394,7 @@ RiscV64/RiscVMmu.S | GCC RiscV64/SpeculationBarrier.S | GCC IntelTdxNull.c + AmdSevNull.c [Sources.LOONGARCH64] Math64.c @@ -411,6 +416,7 @@ LoongArch64/Cpucfg.S | GCC LoongArch64/ReadStableCounter.S | GCC IntelTdxNull.c + AmdSevNull.c [Packages] MdePkg/MdePkg.dec diff --git a/MdePkg/Library/BaseLib/UnitTestHostBaseLib.inf b/MdePkg/Library/BaseLib/UnitTestHostBaseLib.inf index 190e3b6e03eb..776c7ccb6766 100644 --- a/MdePkg/Library/BaseLib/UnitTestHostBaseLib.inf +++ b/MdePkg/Library/BaseLib/UnitTestHostBaseLib.inf @@ -130,6 +130,7 @@ X86SpeculationBarrier.c X86UnitTestHost.c IntelTdxNull.c + AmdSevNull.c [Sources.X64] X64/LongJump.nasm @@ -170,6 +171,7 @@ X64/RdRand.nasm X86UnitTestHost.c IntelTdxNull.c + AmdSevNull.c [Sources.EBC] Ebc/CpuBreakpoint.c diff --git a/MdePkg/Library/BaseLib/X64/SevProbe.c b/MdePkg/Library/BaseLib/X64/SevProbe.c new file mode 100644 index 000000000000..2d1ab01f7270 --- /dev/null +++ b/MdePkg/Library/BaseLib/X64/SevProbe.c @@ -0,0 +1,45 @@ +/** @file + + Copyright (c) 2025, Advanced Micro Devices, Inc. All rights reserved.
    + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include + +/** + Probe if running as some kind of SEV guest. + + @return FALSE Not running as a guest under any kind of SEV + @return TRUE Running as a guest under any kind of SEV +**/ +BOOLEAN +EFIAPI +SevGuestIsEnabled ( + VOID + ) +{ + UINT32 MaxExtendedLeaf; + MSR_SEV_STATUS_REGISTER SevStatus; + CPUID_MEMORY_ENCRYPTION_INFO_EAX MemoryEncryptionInfoEax; + + // Check max extended CPUID leaf + AsmCpuid (CPUID_EXTENDED_FUNCTION, &MaxExtendedLeaf, NULL, NULL, NULL); + if (MaxExtendedLeaf < CPUID_MEMORY_ENCRYPTION_INFO) { + return FALSE; + } + + // Check SEV support + AsmCpuid (CPUID_MEMORY_ENCRYPTION_INFO, &MemoryEncryptionInfoEax.Uint32, NULL, NULL, NULL); + if (MemoryEncryptionInfoEax.Bits.SevBit == 0) { + return FALSE; + } + + // Read SEV_STATUS MSR + SevStatus.Uint64 = AsmReadMsr64 (MSR_SEV_STATUS); + + return (SevStatus.Bits.SevBit | SevStatus.Bits.SevEsBit | SevStatus.Bits.SevSnpBit) ? TRUE : FALSE; +} From 05b677c9de2cb3c4486736eb795c12e8008c3797 Mon Sep 17 00:00:00 2001 From: RARelph <44270374+RARelph@users.noreply.github.com> Date: Thu, 30 Oct 2025 17:06:25 -0500 Subject: [PATCH 0738/1172] UefiCpuPkg/MtrrLib: Prevent MTRR usage with SEV guests Confidential computing guests do not support MTRR emulation. This is as true for AMD SEV as it is for Intel's Tdx. Signed-off-by: Richard Relph --- UefiCpuPkg/Library/MtrrLib/MtrrLib.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c index bfe02f3cb981..df3ef3fe967e 100644 --- a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c +++ b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c @@ -162,9 +162,9 @@ MtrrLibIsMtrrSupported ( MSR_IA32_MTRRCAP_REGISTER MtrrCap; // - // MTRR is not supported in TD-Guest. + // MTRR is not supported in TD-Guest or any SEV guest. // - if (TdIsEnabled ()) { + if (TdIsEnabled () || SevGuestIsEnabled ()) { return FALSE; } From 059332bda3c08a730394e4a5b8a9b4fade0bf371 Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Tue, 28 Oct 2025 13:04:13 +0530 Subject: [PATCH 0739/1172] ArmPkg/Library: Fix for coverity issue OVERRUN RootCause: SectionSize, SectionLength and FileLength are declared as UINTN, UINTN and UINT32 but are typecast to UINT32 and masked with 0x00FFFFFF to store only the lower 24 bits. Although this approach yields the correct result, it introduces a potential security vulnerability due to unsafe typecasting and dereferencing. Solution: Using the predefined macro FFS_FILE_SIZE() from MdePkg\Include\Pi\PiFirmwareFile.h, which safely performs the same operation by reconstruct the size using individual byte access. Cc: Sachin Ganesh Signed-off-by: Gowtham M --- .../DebugAgentSymbolsBaseLib/DebugAgentSymbolsBaseLib.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ArmPkg/Library/DebugAgentSymbolsBaseLib/DebugAgentSymbolsBaseLib.c b/ArmPkg/Library/DebugAgentSymbolsBaseLib/DebugAgentSymbolsBaseLib.c index 77c92f9ecc11..37416485341b 100644 --- a/ArmPkg/Library/DebugAgentSymbolsBaseLib/DebugAgentSymbolsBaseLib.c +++ b/ArmPkg/Library/DebugAgentSymbolsBaseLib/DebugAgentSymbolsBaseLib.c @@ -141,7 +141,7 @@ GetFfsFile ( return EFI_SUCCESS; } - FileLength = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF; + FileLength = FFS_FILE_SIZE (FfsFileHeader); FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8); FileOffset += FileOccupiedSize; @@ -149,7 +149,7 @@ GetFfsFile ( break; case EFI_FILE_DELETED: - FileLength = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF; + FileLength = FFS_FILE_SIZE (FfsFileHeader); FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8); FileOffset += FileOccupiedSize; FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize); @@ -180,7 +180,7 @@ GetImageContext ( VOID *CodeViewEntryPointer; Section = (EFI_COMMON_SECTION_HEADER *)(FfsHeader + 1); - SectionSize = *(UINT32 *)(FfsHeader->Size) & 0x00FFFFFF; + SectionSize = FFS_FILE_SIZE (FfsHeader); SectionSize -= sizeof (EFI_FFS_FILE_HEADER); ParsedLength = 0; EfiImage = NULL; @@ -196,7 +196,7 @@ GetImageContext ( // SectionLength is adjusted it is 4 byte aligned. // Go to the next section // - SectionLength = *(UINT32 *)Section->Size & 0x00FFFFFF; + SectionLength = FFS_FILE_SIZE (FfsHeader); SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4); ASSERT (SectionLength != 0); ParsedLength += SectionLength; From 6d82549396f19f731920ccbbe3c2691146ae6ec9 Mon Sep 17 00:00:00 2001 From: "Vineel Kovvuri[MSFT]" Date: Mon, 3 Nov 2025 16:12:47 -0800 Subject: [PATCH 0740/1172] BaseTools: Update Brotli Compress to 1.2.0 # Description Update brotli from v1.0.9 to v1.2.0 https://github.com/google/brotli/releases/tag/v1.2.0 - [ ] Breaking change? - **Breaking change** - Does this PR cause a break in build or boot behavior? - Examples: Does it add a new library class or move a module to a different repo. - [x] Impacts security? - **Security** - Does this PR have a direct security impact? - Fixes CVE-2025-6176 reported in brotli < 1.2.0. - [ ] Includes tests? - **Tests** - Does this PR include any explicit test code? - Examples: Unit tests or integration tests. ## How This Was Tested Verified booting on a virtual platform by compressing/decompressing PEI/DXE sections. ## Integration Instructions NA Signed-off-by: Vineel Kovvuri[MSFT] --- BaseTools/Source/C/BrotliCompress/GNUmakefile | 4 ++++ BaseTools/Source/C/BrotliCompress/Makefile | 6 +++++- BaseTools/Source/C/BrotliCompress/brotli | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/BaseTools/Source/C/BrotliCompress/GNUmakefile b/BaseTools/Source/C/BrotliCompress/GNUmakefile index fd8e05c0e673..1799a8baf2b0 100644 --- a/BaseTools/Source/C/BrotliCompress/GNUmakefile +++ b/BaseTools/Source/C/BrotliCompress/GNUmakefile @@ -22,7 +22,9 @@ OBJECTS = \ brotli/c/dec/bit_reader.o \ brotli/c/dec/decode.o \ brotli/c/dec/huffman.o \ + brotli/c/dec/prefix.o \ brotli/c/dec/state.o \ + brotli/c/dec/static_init.o \ brotli/c/enc/backward_references.o \ brotli/c/enc/backward_references_hq.o \ brotli/c/enc/bit_cost.o \ @@ -40,6 +42,8 @@ OBJECTS = \ brotli/c/enc/memory.o \ brotli/c/enc/metablock.o \ brotli/c/enc/static_dict.o \ + brotli/c/enc/static_dict_lut.o \ + brotli/c/enc/static_init.o \ brotli/c/enc/utf8_util.o include $(MAKEROOT)/Makefiles/app.makefile diff --git a/BaseTools/Source/C/BrotliCompress/Makefile b/BaseTools/Source/C/BrotliCompress/Makefile index 36e69aa65676..68c626958b2a 100644 --- a/BaseTools/Source/C/BrotliCompress/Makefile +++ b/BaseTools/Source/C/BrotliCompress/Makefile @@ -24,7 +24,9 @@ DEC_OBJ = \ brotli\c\dec\bit_reader.obj \ brotli\c\dec\decode.obj \ brotli\c\dec\huffman.obj \ - brotli\c\dec\state.obj + brotli\c\dec\prefix.obj \ + brotli\c\dec\state.obj \ + brotli\c\dec\static_init.obj ENC_OBJ = \ brotli\c\enc\command.obj \ brotli\c\enc\compound_dictionary.obj \ @@ -46,6 +48,8 @@ ENC_OBJ = \ brotli\c\enc\memory.obj \ brotli\c\enc\metablock.obj \ brotli\c\enc\static_dict.obj \ + brotli\c\enc\static_dict_lut.obj \ + brotli\c\enc\static_init.obj \ brotli\c\enc\utf8_util.obj OBJECTS = \ diff --git a/BaseTools/Source/C/BrotliCompress/brotli b/BaseTools/Source/C/BrotliCompress/brotli index f4153a09f87c..028fb5a23661 160000 --- a/BaseTools/Source/C/BrotliCompress/brotli +++ b/BaseTools/Source/C/BrotliCompress/brotli @@ -1 +1 @@ -Subproject commit f4153a09f87cbb9c826d8fc12c74642bb2d879ea +Subproject commit 028fb5a23661f123017c060daa546b55cf4bde29 From a3a180e2bc417403e563d2f1204f444afa5e4db7 Mon Sep 17 00:00:00 2001 From: "Vineel Kovvuri[MSFT]" Date: Mon, 3 Nov 2025 16:15:10 -0800 Subject: [PATCH 0741/1172] MdeModulePkg: Update Brotli Compress to 1.2.0 # Description Update brotli from v1.0.9 to v1.2.0 https://github.com/google/brotli/releases/tag/v1.2.0 - [ ] Breaking change? - **Breaking change** - Does this PR cause a break in build or boot behavior? - Examples: Does it add a new library class or move a module to a different repo. - [x] Impacts security? - **Security** - Does this PR have a direct security impact? - Fixes CVE-2025-6176 reported in brotli < 1.2.0. - [ ] Includes tests? - **Tests** - Does this PR include any explicit test code? - Examples: Unit tests or integration tests. ## How This Was Tested Verified booting on a virtual platform by compressing/decompressing PEI/DXE sections. ## Integration Instructions NA Signed-off-by: Vineel Kovvuri[MSFT] --- .../BrotliCustomDecompressLib.inf | 2 ++ MdeModulePkg/Library/BrotliCustomDecompressLib/brotli | 2 +- .../Library/BrotliCustomDecompressLib/sys/types.h | 9 +++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 MdeModulePkg/Library/BrotliCustomDecompressLib/sys/types.h diff --git a/MdeModulePkg/Library/BrotliCustomDecompressLib/BrotliCustomDecompressLib.inf b/MdeModulePkg/Library/BrotliCustomDecompressLib/BrotliCustomDecompressLib.inf index a96d553ccddb..d07163ec7207 100644 --- a/MdeModulePkg/Library/BrotliCustomDecompressLib/BrotliCustomDecompressLib.inf +++ b/MdeModulePkg/Library/BrotliCustomDecompressLib/BrotliCustomDecompressLib.inf @@ -49,7 +49,9 @@ brotli/c/dec/bit_reader.c brotli/c/dec/decode.c brotli/c/dec/huffman.c + brotli/c/dec/prefix.c brotli/c/dec/state.c + brotli/c/dec/static_init.c brotli/c/include/brotli/decode.h brotli/c/include/brotli/port.h brotli/c/include/brotli/types.h diff --git a/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli b/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli index f4153a09f87c..028fb5a23661 160000 --- a/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli +++ b/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli @@ -1 +1 @@ -Subproject commit f4153a09f87cbb9c826d8fc12c74642bb2d879ea +Subproject commit 028fb5a23661f123017c060daa546b55cf4bde29 diff --git a/MdeModulePkg/Library/BrotliCustomDecompressLib/sys/types.h b/MdeModulePkg/Library/BrotliCustomDecompressLib/sys/types.h new file mode 100644 index 000000000000..bd2c4b3fceca --- /dev/null +++ b/MdeModulePkg/Library/BrotliCustomDecompressLib/sys/types.h @@ -0,0 +1,9 @@ +/** @file + Include file to support building the third-party brotli. + +Copyright (c) Microsoft Corporation. +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include From 49d4753385dd4949c2ba3f0f3ab5b941cd817749 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Mon, 3 Nov 2025 16:34:34 -0800 Subject: [PATCH 0742/1172] MdeModulePkg: CoreDxe: Handle multilple MemoryAllocationModules The current implementation from Dxe/Image/Image.c does not handle the configuration where there might be multiple MemoryAllocationModules. Given that the `ModuleName` is included in the hob data and used for targetting the consumer, DXE core should specify the GUID when looking up for its own MemoryAllocationModule. This change adds a check to ensure the located hob is targetting DXE core. Signed-off-by: Kun Qin --- MdeModulePkg/Core/Dxe/Image/Image.c | 4 +++- MdeModulePkg/Core/Dxe/Mem/MemoryProfileRecord.c | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Image/Image.c b/MdeModulePkg/Core/Dxe/Image/Image.c index 735ba04bee10..4fa6e06be065 100644 --- a/MdeModulePkg/Core/Dxe/Image/Image.c +++ b/MdeModulePkg/Core/Dxe/Image/Image.c @@ -200,7 +200,9 @@ CoreInitializeImageServices ( // // Find Dxe Core HOB // - break; + if (CompareGuid (&DxeCoreHob.MemoryAllocationModule->ModuleName, &gEfiCallerIdGuid)) { + break; + } } DxeCoreHob.Raw = GET_NEXT_HOB (DxeCoreHob); diff --git a/MdeModulePkg/Core/Dxe/Mem/MemoryProfileRecord.c b/MdeModulePkg/Core/Dxe/Mem/MemoryProfileRecord.c index 00e33b707d4b..f46703fb4da5 100644 --- a/MdeModulePkg/Core/Dxe/Mem/MemoryProfileRecord.c +++ b/MdeModulePkg/Core/Dxe/Mem/MemoryProfileRecord.c @@ -549,7 +549,9 @@ RegisterDxeCore ( // // Find Dxe Core HOB // - break; + if (CompareGuid (&DxeCoreHob.MemoryAllocationModule->ModuleName, &gEfiCallerIdGuid)) { + break; + } } DxeCoreHob.Raw = GET_NEXT_HOB (DxeCoreHob); From 1c74842bd07a48070d1cf3458f0b6b377e3ec8b9 Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Wed, 5 Nov 2025 11:10:08 +0530 Subject: [PATCH 0743/1172] ArmPkg/Library: fix: Incorrect SectionLength Calculation. Ref:[059332b] Rootcause: The SectionLength was incorrectly computed using the FFS_FILE_SIZE() macro. This macro operates on the EFI_FFS_FILE_HEADER structure, which is incompatible with the SECTION_SIZE header format. This mismatch introduces a potential defect due to inaccurate section size calculation. Solution: To ensure correctness and structural alignment, SectionLength must be computed using the SECTION_SIZE macro defined in MdePkg\Include\Pi\PiFirmwareFile.h. This macro performs size extraction using byte-wise access. Cc: Sachin Ganesh Signed-off-by: Gowtham M --- .../Library/DebugAgentSymbolsBaseLib/DebugAgentSymbolsBaseLib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ArmPkg/Library/DebugAgentSymbolsBaseLib/DebugAgentSymbolsBaseLib.c b/ArmPkg/Library/DebugAgentSymbolsBaseLib/DebugAgentSymbolsBaseLib.c index 37416485341b..10c156b0371c 100644 --- a/ArmPkg/Library/DebugAgentSymbolsBaseLib/DebugAgentSymbolsBaseLib.c +++ b/ArmPkg/Library/DebugAgentSymbolsBaseLib/DebugAgentSymbolsBaseLib.c @@ -196,7 +196,7 @@ GetImageContext ( // SectionLength is adjusted it is 4 byte aligned. // Go to the next section // - SectionLength = FFS_FILE_SIZE (FfsHeader); + SectionLength = SECTION_SIZE (Section); SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4); ASSERT (SectionLength != 0); ParsedLength += SectionLength; From 74467627321735a9d898aa261dccc3c83330d93a Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Thu, 6 Nov 2025 12:43:14 +0000 Subject: [PATCH 0744/1172] MdePkg,UefiCpuPkg: fix wrong DS bit and add helper to check it In FEAT_LPA2, the location of the DS bit in TCR_EL2 depending on the value of HCR_EL2.E2H: 1. When HCR_EL2.E2H = 0, the DS bit is located at bit 32 in TCR_EL2. 2. When HCR_EL2.E2H = 1 (EL0&2), the DS bit is located at bit 59 in TCR_EL2, which matches its position in TCR_EL1. However, the current implementation checks only bit 59 to determine whether LPA2 is enabled, even when HCR_EL2.E2H is not set. To address this issue, this change adds the necessary definitions and a helper function to correctly check whether LPA2 is enabled. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Yeoreum Yun --- MdePkg/Include/AArch64/AArch64Mmu.h | 3 ++- UefiCpuPkg/Include/Library/ArmMmuLib.h | 13 ++++++++++++ .../Library/ArmMmuLib/AArch64/ArmMmuLibCore.c | 21 +++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/MdePkg/Include/AArch64/AArch64Mmu.h b/MdePkg/Include/AArch64/AArch64Mmu.h index 765ab540a00e..6cd26de1f380 100644 --- a/MdePkg/Include/AArch64/AArch64Mmu.h +++ b/MdePkg/Include/AArch64/AArch64Mmu.h @@ -129,7 +129,8 @@ #define TTBR_ASID_MASK (0xFF << TTBR_ASID_FIELD) #define TTBR_BADDR_MASK (0xFFFFFFFFFFFF ) // The width of this field depends on the values in TxSZ. Addr occupies bottom 48bits -#define TCR_DS (1UL << 59) +#define TCR_DS (1UL << 59) +#define TCR_DS_NVHE (1UL << 32) #define TCR_EL1_T0SZ_FIELD (0) #define TCR_EL1_EPD0_FIELD (7) diff --git a/UefiCpuPkg/Include/Library/ArmMmuLib.h b/UefiCpuPkg/Include/Library/ArmMmuLib.h index 2ce948e8db1d..e96bc3990db6 100644 --- a/UefiCpuPkg/Include/Library/ArmMmuLib.h +++ b/UefiCpuPkg/Include/Library/ArmMmuLib.h @@ -71,4 +71,17 @@ ArmSetMemoryAttributes ( IN UINT64 AttributeMask ); +/** + Check whether a 52-bit output address can be described + by the translation tables (FEAT_LPA2). + + @retval TRUE 52-bit output address is enabled (LPA2 enabled). + @retval FALSE 52-bit output address is disabled (LPA2 disabled). + +**/ +BOOLEAN +ArmLpa2Enabled ( + VOID + ); + #endif // ARM_MMU_LIB_H_ diff --git a/UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c b/UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c index 568972902701..269aa7dcba3b 100644 --- a/UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c +++ b/UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c @@ -811,6 +811,27 @@ ArmConfigureMmu ( return Status; } +/** + Check whether a 52-bit output address can be described + by the translation tables (FEAT_LPA2). + @retval TRUE 52-bit output address is enabled (LPA2 enabled). + @retval FALSE 52-bit output address is disabled (LPA2 disabled). + +**/ +BOOLEAN +ArmLpa2Enabled ( + VOID + ) +{ + UINT64 TCR; + + TCR = ArmGetTCR (); + + return !TranslationRegimeIsDual () ? + ((TCR & TCR_DS_NVHE) != 0) : + ((TCR & TCR_DS) != 0); +} + RETURN_STATUS EFIAPI ArmMmuBaseLibConstructor ( From c624a06aa3a9931e7d1ce1a8f51646438b74e4d2 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Thu, 6 Nov 2025 12:50:08 +0000 Subject: [PATCH 0745/1172] ArmPkg,UefiCpuPkg: fix boot failure with LPA2 When FEAT_LPA2 is enabled: 1. The DS bit is located at bit 32, not bit 59, when HCR_EL2.E2H = 0. 2. The root level of the page table should be -1 when using a 52-bit address with a 4KB TxSZ and LPA2 feature is enabled. However, the current implementation does not handle these conditions correctly, causing EFI to fail during boot when CPU is EL0&1 or EL0&2. Fix this boot failure. Fixes: 90771630bfe ("UefiCpuPkg/ArmMmuLib: Add support for LPA2") Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Yeoreum Yun --- ArmPkg/Drivers/CpuDxe/AArch64/Mmu.c | 9 +++++---- .../Library/ArmMmuLib/AArch64/ArmMmuLibCore.c | 15 ++++++++++----- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/ArmPkg/Drivers/CpuDxe/AArch64/Mmu.c b/ArmPkg/Drivers/CpuDxe/AArch64/Mmu.c index e2a48cccaae2..057278fde46f 100644 --- a/ArmPkg/Drivers/CpuDxe/AArch64/Mmu.c +++ b/ArmPkg/Drivers/CpuDxe/AArch64/Mmu.c @@ -48,7 +48,8 @@ GetRootTranslationTableInfo ( OUT UINTN *RootTableEntryCount ) { - *RootTableLevel = (INTN)(T0SZ - MIN_T0SZ) / BITS_PER_LEVEL; + *RootTableLevel = (T0SZ < MIN_T0SZ) ? -1 : (INTN)(T0SZ - MIN_T0SZ) / BITS_PER_LEVEL; + ASSERT (*RootTableLevel >= 0 || ArmLpa2Enabled ()); *RootTableEntryCount = TT_ENTRY_COUNT >> (INTN)(T0SZ - MIN_T0SZ) % BITS_PER_LEVEL; } @@ -241,7 +242,7 @@ GetNextEntryAttribute ( // Increase the level number and scan the sub-level table GetNextEntryAttribute ( - (UINT64 *)GetOutputAddress (Entry, ArmGetTCR () & TCR_DS), + (UINT64 *)GetOutputAddress (Entry, ArmLpa2Enabled ()), TT_ENTRY_COUNT, TableLevel + 1, (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL (TableLevel))), @@ -329,7 +330,7 @@ SyncCacheConfig ( GetRootTranslationTableInfo (T0SZ, &TableLevel, &TableCount); // First Attribute of the Page Tables - PageAttribute = GetFirstPageAttribute (FirstLevelTableAddress, TableLevel, ArmGetTCR () & TCR_DS); + PageAttribute = GetFirstPageAttribute (FirstLevelTableAddress, TableLevel, ArmLpa2Enabled ()); // We scan from the start of the memory map (ie: at the address 0x0) BaseAddressGcdRegion = 0x0; @@ -458,7 +459,7 @@ GetMemoryRegionRec ( EntryType = *BlockEntry & TT_TYPE_MASK; if ((TableLevel < 3) && (EntryType == TT_TYPE_TABLE_ENTRY)) { - NextTranslationTable = (UINT64 *)GetOutputAddress (*BlockEntry, ArmGetTCR () & TCR_DS); + NextTranslationTable = (UINT64 *)GetOutputAddress (*BlockEntry, ArmLpa2Enabled ()); // The entry is a page table, so we go to the next level Status = GetMemoryRegionRec ( diff --git a/UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c b/UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c index 269aa7dcba3b..d111e8c7cd37 100644 --- a/UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c +++ b/UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c @@ -142,7 +142,12 @@ GetRootTableLevel ( IN UINTN T0SZ ) { - return (INTN)(T0SZ - MIN_T0SZ) / BITS_PER_LEVEL; + INTN RootTableLevel; + + RootTableLevel = (T0SZ < MIN_T0SZ) ? -1 : (INTN)(T0SZ - MIN_T0SZ) / BITS_PER_LEVEL; + ASSERT (RootTableLevel >= 0 || ArmLpa2Enabled ()); + + return RootTableLevel; } STATIC @@ -306,7 +311,7 @@ UpdateRegionMappingRecursive ( // the MMU in order to update page table entries safely, so prefer page // mappings in that particular case. // - if ((Level == 0) || (((RegionStart | BlockEnd) & BlockMask) != 0) || + if ((Level <= 0) || (((RegionStart | BlockEnd) & BlockMask) != 0) || ((Level < 3) && (((UINT64)PageTable & ~BlockMask) == RegionStart)) || IsTableEntry (*Entry, Level)) { @@ -616,7 +621,7 @@ ArmSetMemoryAttributes ( PageAttributeMask, ArmGetTTBR0BaseAddress (), TRUE, - ArmGetTCR () & TCR_DS + ArmLpa2Enabled () ); } @@ -680,7 +685,7 @@ ArmConfigureMmu ( } else if (MaxAddress < SIZE_256TB) { TCR |= TCR_PS_256TB; } else if ((MaxAddress < SIZE_4PB) && ArmHas52BitTgran4 ()) { - TCR |= TCR_PS_4PB | TCR_DS; + TCR |= TCR_PS_4PB | TCR_DS_NVHE; } else { DEBUG (( DEBUG_ERROR, @@ -764,7 +769,7 @@ ArmConfigureMmu ( ZeroMem (TranslationTable, RootTableEntryCount * sizeof (UINT64)); while (MemoryTable->Length != 0) { - Status = FillTranslationTable (TranslationTable, MemoryTable, TCR & TCR_DS); + Status = FillTranslationTable (TranslationTable, MemoryTable, ArmLpa2Enabled ()); if (EFI_ERROR (Status)) { goto FreeTranslationTable; } From 6c6d4d2d5205ff62e66b45e2bccf00094b55dd70 Mon Sep 17 00:00:00 2001 From: varung Date: Tue, 16 Sep 2025 17:05:48 +0530 Subject: [PATCH 0746/1172] MdePkg: Add PCI Express 7.0 Header Support PCI Express 7.0 Specification introduces new register bit field. This commit syncs MdePkg PCIe headers with the specification update. Cc: Sachin Ganesh Cc: Dhanaraj V Cc: Sergiy Yakovlev Signed-off-by: Varun G --- MdePkg/Include/IndustryStandard/Pci.h | 2 +- .../Include/IndustryStandard/PciExpress21.h | 3 +- .../Include/IndustryStandard/PciExpress70.h | 82 +++++++++++++++++++ 3 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 MdePkg/Include/IndustryStandard/PciExpress70.h diff --git a/MdePkg/Include/IndustryStandard/Pci.h b/MdePkg/Include/IndustryStandard/Pci.h index 4220ad8a6fd6..20f515219710 100644 --- a/MdePkg/Include/IndustryStandard/Pci.h +++ b/MdePkg/Include/IndustryStandard/Pci.h @@ -9,7 +9,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #ifndef _PCI_H_ #define _PCI_H_ -#include +#include #include #endif diff --git a/MdePkg/Include/IndustryStandard/PciExpress21.h b/MdePkg/Include/IndustryStandard/PciExpress21.h index 749dfea7a841..7d0fa95148f6 100644 --- a/MdePkg/Include/IndustryStandard/PciExpress21.h +++ b/MdePkg/Include/IndustryStandard/PciExpress21.h @@ -348,7 +348,8 @@ typedef union { UINT32 LowerSkpOsReception : 7; UINT32 RetimerPresenceDetect : 1; UINT32 TwoRetimersPresenceDetect : 1; - UINT32 Reserved2 : 6; + UINT32 FRAPresenceDetect : 1; + UINT32 Reserved2 : 5; UINT32 DrsSupported : 1; } Bits; UINT32 Uint32; diff --git a/MdePkg/Include/IndustryStandard/PciExpress70.h b/MdePkg/Include/IndustryStandard/PciExpress70.h new file mode 100644 index 000000000000..e0175c0d9f7a --- /dev/null +++ b/MdePkg/Include/IndustryStandard/PciExpress70.h @@ -0,0 +1,82 @@ +/** @file +Support for the PCI Express 7.0 standard. + +This header file may not define all structures. Please extend as required. + +Copyright (c) 2025, American Megatrends International LLC. All rights reserved.
    +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef PCIEXPRESS70_H_ +#define PCIEXPRESS70_H_ + +#include + +/// The Physical Layer PCI Express Extended Capability definitions. +/// +/// Based on section 7.7.8 of PCI Express Base Specification 7.0 +///@{ +#define PCI_EXPRESS_EXTENDED_CAPABILITY_PHYSICAL_LAYER_128_0_ID 0x0039 +#define PCI_EXPRESS_EXTENDED_CAPABILITY_PHYSICAL_LAYER_128_0_VER1 0x1 + +// Register offsets from Physical Layer PCI-E Ext Cap Header +#define PCI_EXPRESS_REG_PHYSICAL_LAYER_128_0_CAPABILITIES_OFFSET 0x04 +#define PCI_EXPRESS_REG_PHYSICAL_LAYER_128_0_CONTROL_OFFSET 0x08 +#define PCI_EXPRESS_REG_PHYSICAL_LAYER_128_0_STATUS_OFFSET 0x0C +#define PCI_EXPRESS_REG_PHYSICAL_LAYER_128_0_LANE_EQUALIZATION_CONTROL_OFFSET 0x10 + +#pragma pack(1) + +typedef union { + struct { + UINT32 SupportedLinkSpeedsVector2 : 8; // bits 0..7 + UINT32 LowerSkpOsGenLnkSpeedsVect2 : 8; // bits 8..15 + UINT32 LowerSkpOsRecLnkSpeedsVect2 : 8; // bits 16..23 + UINT32 Reserved : 8; // bits 24..31 + } Bits; + UINT32 Uint32; +} PCI_EXPRESS_REG_PHYSICAL_LAYER_128_0_CAPABILITIES; + +typedef union { + struct { + UINT32 Reserved : 32; // Reserved bit 0:31 + } Bits; + UINT32 Uint32; +} PCI_EXPRESS_REG_PHYSICAL_LAYER_128_0_CONTROL; + +typedef union { + struct { + UINT32 EqualizationComplete : 1; // bit 0 + UINT32 EqualizationPhase1Success : 1; // bit 1 + UINT32 EqualizationPhase2Success : 1; // bit 2 + UINT32 EqualizationPhase3Success : 1; // bit 3 + UINT32 LinkEqualizationRequest : 1; // bit 4 + UINT32 TransmitterPrecodingOn : 1; // bit 5 + UINT32 TransmitterPrecodeRequest : 1; // bit 6 + UINT32 NoEqualizationNeededRcvd : 1; // bit 7 + UINT32 Reserved : 24; // Reserved bit 8:31 + } Bits; + UINT32 Uint32; +} PCI_EXPRESS_REG_PHYSICAL_LAYER_128_0_STATUS; + +typedef union { + struct { + UINT8 DownstreamPortTransmitterPreset : 4; // bit 0..3 + UINT8 UpstreamPortTransmitterPreset : 4; // bit 4..7 + } Bits; + UINT8 Uint8; +} PCI_EXPRESS_REG_PHYSICAL_LAYER_128_0_LANE_EQUALIZATION_CONTROL; + +typedef struct { + PCI_EXPRESS_EXTENDED_CAPABILITIES_HEADER Header; + PCI_EXPRESS_REG_PHYSICAL_LAYER_128_0_CAPABILITIES Capablities; + PCI_EXPRESS_REG_PHYSICAL_LAYER_128_0_CONTROL Control; + PCI_EXPRESS_REG_PHYSICAL_LAYER_128_0_STATUS Status; + PCI_EXPRESS_REG_PHYSICAL_LAYER_128_0_LANE_EQUALIZATION_CONTROL LaneEqualizationControl[1]; +} PCI_EXPRESS_EXTENDED_CAPABILITIES_PHYSICAL_LAYER_128_0; +///@} + +#pragma pack() + +#endif From 9e4d3b31631e60fd3e01643323587799e31754a6 Mon Sep 17 00:00:00 2001 From: Dongyan Qian Date: Wed, 12 Nov 2025 10:06:54 +0800 Subject: [PATCH 0747/1172] BaseTools: Update brotli submodule Update the brotli submodule to the commit (e230f474). to avoid build failures in the IA64/LoongArch architecture's native compiler. The fundamental reason is that GCC does not support the __attribute__((model("small"))). REF:https://github.com/google/brotli/pull/1369 Suggested-by: MingcongBai Signed-off-by: Dongyan Qian --- BaseTools/Source/C/BrotliCompress/brotli | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BaseTools/Source/C/BrotliCompress/brotli b/BaseTools/Source/C/BrotliCompress/brotli index 028fb5a23661..e230f474b871 160000 --- a/BaseTools/Source/C/BrotliCompress/brotli +++ b/BaseTools/Source/C/BrotliCompress/brotli @@ -1 +1 @@ -Subproject commit 028fb5a23661f123017c060daa546b55cf4bde29 +Subproject commit e230f474b87134e8c6c85b630084c612057f253e From 46548b1adac82211d8d11da12dd914f41e7aa775 Mon Sep 17 00:00:00 2001 From: Dongyan Qian Date: Fri, 14 Nov 2025 09:48:36 +0800 Subject: [PATCH 0748/1172] MdeModulePkg: Update brotli submodule Update the brotli submodule to the commit (e230f474). to avoid build failures in the IA64/LoongArch architecture's native compiler. The fundamental reason is that GCC does not support the __attribute__((model("small"))). REF:https://github.com/google/brotli/pull/1369 Signed-off-by: Dongyan Qian --- MdeModulePkg/Library/BrotliCustomDecompressLib/brotli | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli b/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli index 028fb5a23661..e230f474b871 160000 --- a/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli +++ b/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli @@ -1 +1 @@ -Subproject commit 028fb5a23661f123017c060daa546b55cf4bde29 +Subproject commit e230f474b87134e8c6c85b630084c612057f253e From b197541f2946d8dd4685243a32599b631e574947 Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Thu, 6 Nov 2025 22:02:05 +0000 Subject: [PATCH 0749/1172] OvmfPkg,ArmVirtPkg,NetworkPkg: Fix build with -D NETWORK_ENABLE=0 Previous PR https://github.com/tianocore/edk2/pull/6087 restored the ability to build OvmfPkg with -D NETWORK_ENABLE=0. b3b3cfab7eb52acd77558a9727196e30d05d1f2a has broken it again, since the .dsc references to OvmfPkg/VirtioNetDxe/VirtioNet.inf were moved from outside !if $(NETWORK_ENABLE) == TRUE to inside it, while the .fdf references remained outside. In discussion in https://github.com/tianocore/edk2/pull/11719 it was decided to move the .fdf references inside the conditional, i.e. not to include VirtioNetDxe unless the rest of the network stack is being built. Removal of VirtioNetDxe driver on -D NETWORK_ENABLE=0 has only been applied to those packages which are already using OvmfPkg/Dsc/Includes/NetworkComponents.dsc.inc. f9408b7cc160030c3bb9627c8086a792cc2d046c introduces new PCDs which also need to be moved inside a NETWORK_ENABLE test in order to allow building with -D NETWORK_ENABLE=0, which is also done here. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Mike Beaton --- ArmVirtPkg/ArmVirtQemu.dsc | 1 - ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 2 ++ ArmVirtPkg/ArmVirtQemuKernel.dsc | 1 - NetworkPkg/NetworkDynamicPcds.dsc.inc | 23 +++++++++++++---------- OvmfPkg/CloudHv/CloudHvX64.fdf | 2 ++ OvmfPkg/Microvm/MicrovmX64.fdf | 2 ++ OvmfPkg/OvmfPkgIa32X64.fdf | 2 ++ OvmfPkg/OvmfPkgX64.fdf | 2 ++ 8 files changed, 23 insertions(+), 12 deletions(-) diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc index 9d85ef653bf5..4d4521e3419a 100644 --- a/ArmVirtPkg/ArmVirtQemu.dsc +++ b/ArmVirtPkg/ArmVirtQemu.dsc @@ -486,7 +486,6 @@ OvmfPkg/Fdt/HighMemDxe/HighMemDxe.inf OvmfPkg/VirtioBlkDxe/VirtioBlk.inf OvmfPkg/VirtioScsiDxe/VirtioScsi.inf - OvmfPkg/VirtioNetDxe/VirtioNet.inf OvmfPkg/VirtioRngDxe/VirtioRng.inf OvmfPkg/VirtioSerialDxe/VirtioSerial.inf { diff --git a/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc b/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc index df9fa67ddf1a..bb3efcb0b0b4 100644 --- a/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc +++ b/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc @@ -101,7 +101,9 @@ READ_LOCK_STATUS = TRUE # Platform Driver # INF OvmfPkg/VirtioBlkDxe/VirtioBlk.inf +!if $(NETWORK_ENABLE) == TRUE INF OvmfPkg/VirtioNetDxe/VirtioNet.inf +!endif INF OvmfPkg/VirtioScsiDxe/VirtioScsi.inf INF OvmfPkg/VirtioRngDxe/VirtioRng.inf INF OvmfPkg/VirtioSerialDxe/VirtioSerial.inf diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc index ebdb7dc83498..d257ca45c51c 100644 --- a/ArmVirtPkg/ArmVirtQemuKernel.dsc +++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc @@ -379,7 +379,6 @@ OvmfPkg/Fdt/HighMemDxe/HighMemDxe.inf OvmfPkg/VirtioBlkDxe/VirtioBlk.inf OvmfPkg/VirtioScsiDxe/VirtioScsi.inf - OvmfPkg/VirtioNetDxe/VirtioNet.inf OvmfPkg/VirtioRngDxe/VirtioRng.inf OvmfPkg/VirtioSerialDxe/VirtioSerial.inf diff --git a/NetworkPkg/NetworkDynamicPcds.dsc.inc b/NetworkPkg/NetworkDynamicPcds.dsc.inc index a3e89e586d7a..e0466c8ffc9d 100644 --- a/NetworkPkg/NetworkDynamicPcds.dsc.inc +++ b/NetworkPkg/NetworkDynamicPcds.dsc.inc @@ -11,15 +11,18 @@ # ## -# -# IPv4 and IPv6 PXE Boot support. -# -!if ($(NETWORK_ENABLE) == TRUE) AND ($(NETWORK_PXE_BOOT_ENABLE) == TRUE) - gEfiNetworkPkgTokenSpaceGuid.PcdIPv4PXESupport|0x01 - gEfiNetworkPkgTokenSpaceGuid.PcdIPv6PXESupport|0x01 -!endif -# -# IPv4 and IPv6 HTTP Boot support. -# +!if $(NETWORK_ENABLE) == TRUE + # + # IPv4 and IPv6 PXE Boot support. + # + !if $(NETWORK_PXE_BOOT_ENABLE) == TRUE + gEfiNetworkPkgTokenSpaceGuid.PcdIPv4PXESupport|0x01 + gEfiNetworkPkgTokenSpaceGuid.PcdIPv6PXESupport|0x01 + !endif + + # + # IPv4 and IPv6 HTTP Boot support. + # gEfiNetworkPkgTokenSpaceGuid.PcdIPv4HttpSupport|TRUE gEfiNetworkPkgTokenSpaceGuid.PcdIPv6HttpSupport|TRUE +!endif diff --git a/OvmfPkg/CloudHv/CloudHvX64.fdf b/OvmfPkg/CloudHv/CloudHvX64.fdf index 346394cf188a..b698395024ca 100644 --- a/OvmfPkg/CloudHv/CloudHvX64.fdf +++ b/OvmfPkg/CloudHv/CloudHvX64.fdf @@ -293,7 +293,9 @@ INF MdeModulePkg/Logo/LogoDxe.inf } !endif !include NetworkPkg/Network.fdf.inc +!if $(NETWORK_ENABLE) == TRUE INF OvmfPkg/VirtioNetDxe/VirtioNet.inf +!endif INF OvmfPkg/PlatformDxe/Platform.inf INF OvmfPkg/AmdSevDxe/AmdSevDxe.inf diff --git a/OvmfPkg/Microvm/MicrovmX64.fdf b/OvmfPkg/Microvm/MicrovmX64.fdf index ff259f811240..3986a8af193d 100644 --- a/OvmfPkg/Microvm/MicrovmX64.fdf +++ b/OvmfPkg/Microvm/MicrovmX64.fdf @@ -224,7 +224,9 @@ INF MdeModulePkg/Logo/LogoDxe.inf } !endif !include NetworkPkg/Network.fdf.inc +!if $(NETWORK_ENABLE) == TRUE INF OvmfPkg/VirtioNetDxe/VirtioNet.inf +!endif # # Usb Support diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf index 2ab9bcf45c3e..99729ead9b9e 100644 --- a/OvmfPkg/OvmfPkgIa32X64.fdf +++ b/OvmfPkg/OvmfPkgIa32X64.fdf @@ -272,7 +272,9 @@ INF SecurityPkg/Hash2DxeCrypto/Hash2DxeCrypto.inf } !endif !include NetworkPkg/Network.fdf.inc +!if $(NETWORK_ENABLE) == TRUE INF OvmfPkg/VirtioNetDxe/VirtioNet.inf +!endif # # Usb Support diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf index 3eec3145adf6..a9af6e4fa34a 100644 --- a/OvmfPkg/OvmfPkgX64.fdf +++ b/OvmfPkg/OvmfPkgX64.fdf @@ -290,7 +290,9 @@ INF SecurityPkg/Hash2DxeCrypto/Hash2DxeCrypto.inf } !endif !include NetworkPkg/Network.fdf.inc +!if $(NETWORK_ENABLE) == TRUE INF OvmfPkg/VirtioNetDxe/VirtioNet.inf +!endif # # Usb Support From 9cb935d50b3ab94e7ed403fbc483bec063369061 Mon Sep 17 00:00:00 2001 From: Oleksandr Tymoshenko Date: Fri, 24 Oct 2025 19:38:49 +0000 Subject: [PATCH 0750/1172] BaseTools: Fix error messages in GnuMakeUtils script Add newlines to the error messages in GnuMakeUtils. writelines function does not add newlines automatically so the print is merged with a line that is printed next. Signed-off-by: Oleksandr Tymoshenko --- BaseTools/Source/C/Makefiles/GnuMakeUtils.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/BaseTools/Source/C/Makefiles/GnuMakeUtils.py b/BaseTools/Source/C/Makefiles/GnuMakeUtils.py index 6f686fd7aa25..dddbf4d46688 100644 --- a/BaseTools/Source/C/Makefiles/GnuMakeUtils.py +++ b/BaseTools/Source/C/Makefiles/GnuMakeUtils.py @@ -229,18 +229,18 @@ def main(): if os.path.isfile(file): os.remove(file) else: - sys.stderr.writelines(['{} is not a file.'.format(file)]) + sys.stderr.writelines(['{} is not a file.\n'.format(file)]) else: - sys.stderr.writelines(['File {} does not exist.'.format(file)]) + sys.stderr.writelines(['File {} does not exist.\n'.format(file)]) elif sys.argv[1] == 'md': path = os.path.normpath(sys.argv[2]) if not os.path.exists(path): os.makedirs(path) else: if os.path.isdir(path): - sys.stderr.writelines(['Directory {} already exists.'.format(path)]) + sys.stderr.writelines(['Directory {} already exists.\n'.format(path)]) else: - sys.stderr.writelines(['{} is a file.'.format(path)]) + sys.stderr.writelines(['{} is a file.\n'.format(path)]) return 1 elif sys.argv[1] == 'rd': paths = [os.path.normpath(x) for x in sys.argv[2:]] @@ -249,9 +249,9 @@ def main(): if os.path.isdir(path): shutil.rmtree(path) else: - sys.stderr.writelines(['{} is not a directory.'.format(path)]) + sys.stderr.writelines(['{} is not a directory.\n'.format(path)]) else: - sys.stderr.writelines(['Directory {} does not exist.'.format(path)]) + sys.stderr.writelines(['Directory {} does not exist.\n'.format(path)]) elif sys.argv[1] == 'rm_pyc_files': path = os.path.normpath(sys.argv[2]) files = glob.glob(os.path.join(path, '*.pyc')) @@ -260,14 +260,14 @@ def main(): if os.path.isfile(file): os.remove(file) else: - sys.stderr.writelines(['{} is not a file.'.format(file)]) + sys.stderr.writelines(['{} is not a file.\n'.format(file)]) else: - sys.stderr.writelines(['File {} does not exist.'.format(file)]) + sys.stderr.writelines(['File {} does not exist.\n'.format(file)]) py_cache = os.path.join(path, '__pycache__') if os.path.isdir(py_cache): shutil.rmtree(py_cache) else: - sys.stderr.writelines(['Unsupported command.']) + sys.stderr.writelines(['Unsupported command.\n']) return 1 return 0 From a501dae5b9d75d40d9f74422f48a95137360e72e Mon Sep 17 00:00:00 2001 From: George Liao Date: Tue, 18 Nov 2025 12:04:24 +0800 Subject: [PATCH 0751/1172] Maintainers.txt: Add George as reviewer for ACPI module Add George as reviewer for ACPI module in MdeModulePkg Signed-off-by: George Liao --- Maintainers.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Maintainers.txt b/Maintainers.txt index f6bd3133d3c5..5ab44b8bceca 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -258,6 +258,7 @@ F: MdeModulePkg/Universal/Acpi/ R: Zhiguang Liu [LiuZhiguang001] R: Dandan Bi [dandanbi] R: Liming Gao [lgao4] +R: George Liao [GeorgeLiao012] MdeModulePkg: BDS modules F: MdeModulePkg/*BootManager*/ From e18609d290d3b3564e7f00a326396b548db62216 Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Thu, 13 Nov 2025 07:31:14 +0000 Subject: [PATCH 0752/1172] OvmfPkg: Add myself to reviewers Signed-off-by: Mike Beaton --- Maintainers.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Maintainers.txt b/Maintainers.txt index 5ab44b8bceca..18fb811336a5 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -474,6 +474,7 @@ W: http://www.tianocore.org/ovmf/ M: Ard Biesheuvel [ardbiesheuvel] M: Jiewen Yao [jyao1] R: Gerd Hoffmann [kraxel] +R: Mike Beaton [mikebeaton] S: Maintained OvmfPkg: bhyve-related modules From b0ff7a035cbc6afbf9065f57c9daed7377f7d96b Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Sun, 16 Nov 2025 15:46:27 +0000 Subject: [PATCH 0753/1172] BaseTools: Add myself to reviewers Signed-off-by: Mike Beaton --- Maintainers.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Maintainers.txt b/Maintainers.txt index 18fb811336a5..16476cf8c221 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -175,6 +175,7 @@ M: Liming Gao [lgao4] M: Guillermo Antonio Palomino Sosa [gapalomi] R: Yuwei Chen [YuweiChen1110] R: Poncho Figueroa [ponchofigueroa] +R: Mike Beaton [mikebeaton] BaseTools: Plugins F: BaseTools/Plugin/ From 9ff73832ea0440b86fa0dfa42158fce1ef3b57d2 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 18 Nov 2025 11:38:52 -0500 Subject: [PATCH 0754/1172] OvmfPkg/PlatformPei: Do not enable S3 support for confidential VMs Signed-off-by: Gerd Hoffmann --- OvmfPkg/PlatformPei/Platform.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/PlatformPei/Platform.c b/OvmfPkg/PlatformPei/Platform.c index a354e0641f0f..1768a24037d1 100644 --- a/OvmfPkg/PlatformPei/Platform.c +++ b/OvmfPkg/PlatformPei/Platform.c @@ -331,7 +331,10 @@ InitializePlatform ( PlatformDebugDumpCmos (); - if (QemuFwCfgS3Enabled ()) { + if (!TdIsEnabled () && + !PlatformInfoHob->SevEsIsEnabled && + QemuFwCfgS3Enabled ()) + { DEBUG ((DEBUG_INFO, "S3 support was detected on QEMU\n")); PlatformInfoHob->S3Supported = TRUE; Status = PcdSetBoolS (PcdAcpiS3Enable, TRUE); From 56f2d5890840aa92e714e056706223f113063cc8 Mon Sep 17 00:00:00 2001 From: Oliver Steffen Date: Wed, 5 Nov 2025 18:35:16 +0100 Subject: [PATCH 0755/1172] SecurityPkg/SpdmSecurityLib: Fix incompatible pointer types GCC 15 enforces stricter type checking for function pointers. When passing SPDM transport layer callbacks to libspdm_register_transport_layer_func, the function pointer types are incompatible due to differences in boolean parameter types. The EDK2 uses BOOLEAN (UINT8) while libspdm uses C99 bool (_Bool). Although these types have the same size and representation, GCC 15 treats them as incompatible. Add explicit casts to libspdm_transport_encode_message_func and libspdm_transport_decode_message_func at the call site to resolve the type mismatch. This is safe as the types have identical binary representation and the functions are only called through these pointers by libspdm. Signed-off-by: Oliver Steffen (cherry picked from commit aca8f995405b2bdc48997ce5b0daa975225164e6) --- .../DeviceSecurity/SpdmSecurityLib/SpdmConnectionInit.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SecurityPkg/DeviceSecurity/SpdmSecurityLib/SpdmConnectionInit.c b/SecurityPkg/DeviceSecurity/SpdmSecurityLib/SpdmConnectionInit.c index 4cf86a30197f..707b7a3aeed6 100644 --- a/SecurityPkg/DeviceSecurity/SpdmSecurityLib/SpdmConnectionInit.c +++ b/SecurityPkg/DeviceSecurity/SpdmSecurityLib/SpdmConnectionInit.c @@ -222,8 +222,8 @@ CreateSpdmDeviceContext ( SpdmDeviceInfo->MaxSpdmMsgSize, SpdmDeviceInfo->TransportHeaderSize, SpdmDeviceInfo->TransportTailSize, - SpdmDeviceInfo->TransportEncodeMessage, - SpdmDeviceInfo->TransportDecodeMessage + (libspdm_transport_encode_message_func)SpdmDeviceInfo->TransportEncodeMessage, + (libspdm_transport_decode_message_func)SpdmDeviceInfo->TransportDecodeMessage ); SpdmRegisterDeviceBufferFunc ( From 8c31bd9487b62e8a00f5840baf5aac377ed693a0 Mon Sep 17 00:00:00 2001 From: Oliver Steffen Date: Wed, 5 Nov 2025 17:47:41 +0100 Subject: [PATCH 0756/1172] MdeModulePkg/DebugSupportDxe: Fix incompatible pointer types GCC 15 enforces stricter type checking for function pointers. When passing EFI_PERIODIC_CALLBACK and EFI_EXCEPTION_CALLBACK to ManageIdtEntryTable, explicit casts to CALLBACK_FUNC are required to avoid incompatible pointer type errors. Add explicit casts at the call sites in RegisterPeriodicCallback and RegisterExceptionCallback functions. Signed-off-by: Oliver Steffen (cherry picked from commit ff28da41c2e23b9d5de34e729ecfb72c37ac63bf) --- MdeModulePkg/Universal/DebugSupportDxe/Ia32/PlDebugSupport.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Universal/DebugSupportDxe/Ia32/PlDebugSupport.c b/MdeModulePkg/Universal/DebugSupportDxe/Ia32/PlDebugSupport.c index 2291985bc73b..08b659b38448 100644 --- a/MdeModulePkg/Universal/DebugSupportDxe/Ia32/PlDebugSupport.c +++ b/MdeModulePkg/Universal/DebugSupportDxe/Ia32/PlDebugSupport.c @@ -192,7 +192,7 @@ RegisterPeriodicCallback ( IN EFI_PERIODIC_CALLBACK PeriodicCallback ) { - return ManageIdtEntryTable (PeriodicCallback, SYSTEM_TIMER_VECTOR); + return ManageIdtEntryTable ((CALLBACK_FUNC)PeriodicCallback, SYSTEM_TIMER_VECTOR); } /** @@ -221,7 +221,7 @@ RegisterExceptionCallback ( IN EFI_EXCEPTION_TYPE ExceptionType ) { - return ManageIdtEntryTable (ExceptionCallback, ExceptionType); + return ManageIdtEntryTable ((CALLBACK_FUNC)ExceptionCallback, ExceptionType); } /** From 53d7f87c9b85bd15c47a1c220b9f555d03e0b2e5 Mon Sep 17 00:00:00 2001 From: Oliver Steffen Date: Fri, 14 Nov 2025 06:48:20 -0500 Subject: [PATCH 0757/1172] EmulatorPkg: Do not require deprecated termio.h The termio.h of glibc has been deprecated for decades and was finally removed in glibc 2.42. EmulatorPkg still pulls it in for no reason (the "new" termios.h is being included already). Remove the include of termio.h. Signed-off-by: Oliver Steffen --- EmulatorPkg/Unix/Host/Host.h | 1 - 1 file changed, 1 deletion(-) diff --git a/EmulatorPkg/Unix/Host/Host.h b/EmulatorPkg/Unix/Host/Host.h index b62496bc7ed3..f46445a71371 100644 --- a/EmulatorPkg/Unix/Host/Host.h +++ b/EmulatorPkg/Unix/Host/Host.h @@ -66,7 +66,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #define _Bool char // for clang debug #endif #else - #include #include #include #endif From 983350825230ef00e57403167387a7d2105dca6e Mon Sep 17 00:00:00 2001 From: Oliver Steffen Date: Fri, 14 Nov 2025 11:30:55 +0100 Subject: [PATCH 0758/1172] .azurepipelines: Use Fedora 43 image for Linux jobs The Fedora 41, which is currently in use for the azurepipelines CI, will be EOL soon. With the fixes for the C23 standard we can use GCC 15 and switch over to the latest Fedora image to run the Linux based CI jobs. Signed-off-by: Oliver Steffen --- .azurepipelines/templates/defaults.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.azurepipelines/templates/defaults.yml b/.azurepipelines/templates/defaults.yml index c7484598853f..e94e6351cbb3 100644 --- a/.azurepipelines/templates/defaults.yml +++ b/.azurepipelines/templates/defaults.yml @@ -9,4 +9,4 @@ variables: default_python_version: "3.12" - default_linux_image: "ghcr.io/tianocore/containers/fedora-41-test:4dbfa9e" + default_linux_image: "ghcr.io/tianocore/containers/fedora-43-test:bde74f8" From 96158b339a1c8937d065bdfdfeeaf168f1ccca4c Mon Sep 17 00:00:00 2001 From: Oliver Steffen Date: Mon, 17 Nov 2025 09:15:46 +0100 Subject: [PATCH 0759/1172] .github: Use Fedora 43 image for BuildPlatform workflow Fedora 40, which is currently in use for the GitHub workflows, is EOL. With the fixes for the C23 standard we can use GCC 15 and switch over to the latest Fedora image. Signed-off-by: Oliver Steffen --- .github/workflows/BuildPlatform.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/BuildPlatform.yml b/.github/workflows/BuildPlatform.yml index c02ac35a5a9f..16d0a70bfe8d 100644 --- a/.github/workflows/BuildPlatform.yml +++ b/.github/workflows/BuildPlatform.yml @@ -61,7 +61,7 @@ jobs: runs-on: ${{ inputs.runs-on }} container: - image: ${{ startswith(inputs.runs-on, 'ubuntu') && 'ghcr.io/tianocore/containers/fedora-40-dev:latest' || '' }} + image: ${{ startswith(inputs.runs-on, 'ubuntu') && 'ghcr.io/tianocore/containers/fedora-43-v:latest' || '' }} steps: - name: Checkout From 48c5926f874e5a5b1d8ea80262d68c4c8875c83b Mon Sep 17 00:00:00 2001 From: Oliver Steffen Date: Mon, 17 Nov 2025 09:16:12 +0100 Subject: [PATCH 0760/1172] .devcontainer: Use Fedora 43 image Fedora 40, which is currently in use as the devcontainer image, is EOL. With the fixes for the C23 standard we can use GCC 15 and switch over to the latest Fedora image. Signed-off-by: Oliver Steffen --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 43694eb38978..ebbc3d07d230 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,5 +1,5 @@ { - "image": "ghcr.io/tianocore/containers/fedora-40-dev:latest", + "image": "ghcr.io/tianocore/containers/fedora-43-dev:latest", "postCreateCommand": "git config --global --add safe.directory '*' && pip install --upgrade -r pip-requirements.txt", "customizations": { "vscode": { From a05741456683623554419debf7e18fc551790b9f Mon Sep 17 00:00:00 2001 From: Michael Escue Date: Wed, 19 Nov 2025 12:17:56 -0800 Subject: [PATCH 0761/1172] MdeModulePkg/PciHostBridgeDxe: Ignore unsupported I/O BARs. Bootup fails when an endpoint requests I/O space BARs and the Root Bridge does not support I/O space causing a resource conflict during bus enumeration. While I/O space is traditionally supported in x86_64, platforms using an Arm architecture may or may not support I/O space. This change adds logic allowing the platform to detect I/O space support for each Root Bridge and prevent submission of the required I/O resources for allocation when unsupported. Endpoints will not receive I/O resources, but they will continue to receive Memory BAR resources. Signed-off-by: Michael Escue Reviewed-by: Joseph Oresko --- MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridge.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridge.c b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridge.c index d573e532bac8..120aef31c0ee 100644 --- a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridge.c +++ b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridge.c @@ -1569,6 +1569,14 @@ SubmitResources ( RootBridge->ResAllocNode[Type].Length = Descriptor->AddrLen; RootBridge->ResAllocNode[Type].Alignment = Descriptor->AddrRangeMax; RootBridge->ResAllocNode[Type].Status = ResSubmitted; + // + // If the PCI root bridge does not support IO space, do not submit requested resources + // for allocation. + // + if ((Type == TypeIo) && (RootBridge->Io.Base > RootBridge->Io.Limit)) { + DEBUG ((DEBUG_INFO, " I/O: Resource not submitted. Unsupported aperture.\n")); + RootBridge->ResAllocNode[Type].Status = ResNone; + } } RootBridge->ResourceSubmitted = TRUE; From e0184abff13fccd9df69bb44fa9edbd4062cc99e Mon Sep 17 00:00:00 2001 From: Philipp Schuster Date: Tue, 4 Nov 2025 08:24:54 +0100 Subject: [PATCH 0762/1172] BaseTools: fix various typos This commit is the first in a series of multiple commits to fix various typos in the code, originating mostly from copy&paste over the years. Most of them only affect documentation and not code. Signed-off-by: Philipp Schuster --- BaseTools/Source/Python/AutoGen/ModuleAutoGen.py | 4 ++-- BaseTools/Source/Python/Workspace/DscBuildData.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py index 764c51789ba9..c358d7f0e3ba 100755 --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py @@ -1850,7 +1850,7 @@ def GenCMakeHash(self): if lines: DependencyFileSet.update(lines) - # Caculate all above dependency files hash + # Calculate all above dependency files hash # Initialze hash object FileList = [] m = hashlib.md5() @@ -1905,7 +1905,7 @@ def GenModuleHash(self): DependencyFileSet.update(rt) - # Caculate all above dependency files hash + # Calculate all above dependency files hash # Initialze hash object FileList = [] m = hashlib.md5() diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py index 248c56295672..014f6d08058c 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -1588,7 +1588,7 @@ def UpdateStructuredPcds(self, TypeList, AllPcds): S_pcd_set = DscBuildData.OverrideByFdf(S_pcd_set,self.WorkspaceDir) S_pcd_set = DscBuildData.OverrideByComm(S_pcd_set) - # Create a tool to caculate structure pcd value + # Create a tool to calculate structure pcd value Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set) if Str_Pcd_Values: From f7cba3671e79bcc5db849f6c65ab1b1aafeb2172 Mon Sep 17 00:00:00 2001 From: Philipp Schuster Date: Tue, 4 Nov 2025 08:25:09 +0100 Subject: [PATCH 0763/1172] CryptoPkg: fix various typos Signed-off-by: Philipp Schuster --- CryptoPkg/Test/UnitTest/Library/BaseCryptLib/UnitTestMain.c | 2 +- CryptoPkg/Test/UnitTest/Library/BaseCryptLib/UnitTestMainHost.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/UnitTestMain.c b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/UnitTestMain.c index 3f2e0b9d09ee..1095a13a8e4a 100644 --- a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/UnitTestMain.c +++ b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/UnitTestMain.c @@ -1,5 +1,5 @@ /** @file - This is a sample to demostrate the usage of the Unit Test Library that + This is a sample to demonstrate the usage of the Unit Test Library that supports the PEI, DXE, SMM, and UEFI Shell environments. Copyright (c) Microsoft Corporation.
    diff --git a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/UnitTestMainHost.c b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/UnitTestMainHost.c index a713bb15fde1..2ada03c100f2 100644 --- a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/UnitTestMainHost.c +++ b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/UnitTestMainHost.c @@ -1,5 +1,5 @@ /** @file - This is a sample to demostrate the usage of the Unit Test Library that + This is a sample to demonstrate the usage of the Unit Test Library that supports the host execution environments. Copyright (c) Microsoft Corporation.
    From d0a6d6c204f5f487b44807f091c4751056eb8a07 Mon Sep 17 00:00:00 2001 From: Philipp Schuster Date: Tue, 4 Nov 2025 08:25:16 +0100 Subject: [PATCH 0764/1172] EmulatorPkg: fix various typos Signed-off-by: Philipp Schuster --- .../Library/GuardUefiMemoryAllocationLib/MemoryAllocationLib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EmulatorPkg/Library/GuardUefiMemoryAllocationLib/MemoryAllocationLib.c b/EmulatorPkg/Library/GuardUefiMemoryAllocationLib/MemoryAllocationLib.c index 515ef1a59bdd..27d8b0728497 100644 --- a/EmulatorPkg/Library/GuardUefiMemoryAllocationLib/MemoryAllocationLib.c +++ b/EmulatorPkg/Library/GuardUefiMemoryAllocationLib/MemoryAllocationLib.c @@ -196,7 +196,7 @@ InternalAllocateAlignedPages ( if (Alignment > EFI_PAGE_SIZE) { // - // Caculate the total number of pages since alignment is larger than page size. + // Calculate the total number of pages since alignment is larger than page size. // AlignmentMask = Alignment - 1; RealPages = Pages + EFI_SIZE_TO_PAGES (Alignment); From 04398aa4b3e6a769ff1b6fd8e2f38746e19b6200 Mon Sep 17 00:00:00 2001 From: Philipp Schuster Date: Tue, 4 Nov 2025 08:25:23 +0100 Subject: [PATCH 0765/1172] MdeModulePkg: fix various typos Signed-off-by: Philipp Schuster --- MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressBlockIo.c | 2 +- MdeModulePkg/Bus/Pci/PciSioSerialDxe/SerialIo.c | 2 +- MdeModulePkg/Include/Library/CustomizedDisplayLib.h | 2 +- .../Library/CustomizedDisplayLib/CustomizedDisplayLib.c | 2 +- MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptSave.c | 2 +- .../FaultTolerantWriteDxe/FaultTolerantWriteSmmDxe.c | 2 +- MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c | 2 +- MdeModulePkg/Universal/PCD/Dxe/Pcd.c | 4 ++-- MdeModulePkg/Universal/PCD/Pei/Service.h | 4 ++-- .../RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.c | 2 +- .../Universal/Variable/RuntimeDxe/VariablePolicySmmDxe.c | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressBlockIo.c b/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressBlockIo.c index e0a85c1cb34e..c7c3a5c0fad4 100644 --- a/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressBlockIo.c +++ b/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressBlockIo.c @@ -358,7 +358,7 @@ NvmeFlush ( } /** - Nonblocking I/O callback funtion when the event is signaled. + Nonblocking I/O callback function when the event is signaled. @param[in] Event The Event this notify function registered to. @param[in] Context Pointer to the context data registered to the diff --git a/MdeModulePkg/Bus/Pci/PciSioSerialDxe/SerialIo.c b/MdeModulePkg/Bus/Pci/PciSioSerialDxe/SerialIo.c index fa54e821d2e2..dcdaa6cf9b9b 100644 --- a/MdeModulePkg/Bus/Pci/PciSioSerialDxe/SerialIo.c +++ b/MdeModulePkg/Bus/Pci/PciSioSerialDxe/SerialIo.c @@ -462,7 +462,7 @@ SerialReceiveTransmit ( @param SerialDevice The device to flush. @retval EFI_SUCCESS The transmit FIFO is completely flushed. - @retval EFI_TIMEOUT A timeout occured waiting for the transmit FIFO to flush. + @retval EFI_TIMEOUT A timeout occurred waiting for the transmit FIFO to flush. **/ EFI_STATUS SerialFlushTransmitFifo ( diff --git a/MdeModulePkg/Include/Library/CustomizedDisplayLib.h b/MdeModulePkg/Include/Library/CustomizedDisplayLib.h index 0607dd1a616a..9e6a41e11ba7 100644 --- a/MdeModulePkg/Include/Library/CustomizedDisplayLib.h +++ b/MdeModulePkg/Include/Library/CustomizedDisplayLib.h @@ -32,7 +32,7 @@ Statement **/ /** - This funtion defines Page Frame and Backgroud. + This function defines Page Frame and Backgroud. Based on the above layout, it will be responsible for HeaderHeight, FooterHeight, StatusBarHeight and Backgroud. And, it will reserve Screen for Statement. diff --git a/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.c b/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.c index 1099b640a2d2..ea5e6f7ffaea 100644 --- a/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.c +++ b/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.c @@ -40,7 +40,7 @@ Statement **/ /** - This funtion defines Page Frame and Backgroud. + This function defines Page Frame and Backgroud. Based on the above layout, it will be responsible for HeaderHeight, FooterHeight, StatusBarHeight and Backgroud. And, it will reserve Screen for Statement. diff --git a/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptSave.c b/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptSave.c index a6af2e848562..484613f6ce42 100644 --- a/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptSave.c +++ b/MdeModulePkg/Library/PiDxeS3BootScriptLib/BootScriptSave.c @@ -650,7 +650,7 @@ S3BootScriptLibDeinitialize ( /** To get the start address from which a new boot time s3 boot script entry will write into. If the table is not exist, the functio will first allocate a buffer for the table - If the table buffer is not enough for the new entry, in non-smm mode, the funtion will + If the table buffer is not enough for the new entry, in non-smm mode, the function will invoke reallocate to enlarge buffer. @param EntryLength the new entry length. diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmmDxe.c b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmmDxe.c index d273e4d27d7e..8364dfecf775 100644 --- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmmDxe.c +++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmmDxe.c @@ -525,7 +525,7 @@ SmmFtwReady ( @param[in] ImageHandle The firmware allocated handle for the UEFI image. @param[in] SystemTable A pointer to the EFI system table. - @retval EFI_SUCCESS This funtion always return EFI_SUCCESS. + @retval EFI_SUCCESS This function always return EFI_SUCCESS. **/ EFI_STATUS diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c index 9b58f1e3fc68..33462f4602fa 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c @@ -2863,7 +2863,7 @@ ParseIfrData ( } } else { // - // When flag is not set, default value is FASLE. + // When flag is not set, default value is FALSE. // DefaultData.Type = DefaultValueFromDefault; if (QuestionReferBitField) { diff --git a/MdeModulePkg/Universal/PCD/Dxe/Pcd.c b/MdeModulePkg/Universal/PCD/Dxe/Pcd.c index 855ba3cceb77..8539e3380f5e 100644 --- a/MdeModulePkg/Universal/PCD/Dxe/Pcd.c +++ b/MdeModulePkg/Universal/PCD/Dxe/Pcd.c @@ -419,7 +419,7 @@ DxePcdGet64 ( @param[in] TokenNumber The PCD token number. - @return The pointer to the buffer to be retrived. + @return The pointer to the buffer to be retrieved. **/ VOID * @@ -623,7 +623,7 @@ DxePcdGet64Ex ( @param[in] Guid The token space for the token number. @param[in] ExTokenNumber The PCD token number. - @return The pointer to the buffer to be retrived. + @return The pointer to the buffer to be retrieved. **/ VOID * diff --git a/MdeModulePkg/Universal/PCD/Pei/Service.h b/MdeModulePkg/Universal/PCD/Pei/Service.h index 8b94bf308e6a..d7a2ebec14d8 100644 --- a/MdeModulePkg/Universal/PCD/Pei/Service.h +++ b/MdeModulePkg/Universal/PCD/Pei/Service.h @@ -204,7 +204,7 @@ PeiPcdGet64 ( @param[in] TokenNumber The PCD token number. - @return The pointer to the buffer to be retrived. + @return The pointer to the buffer to be retrieved. **/ VOID * @@ -344,7 +344,7 @@ PeiPcdGet64Ex ( @param[in] Guid The token space for the token number. @param[in] TokenNumber The PCD token number. - @return The pointer to the buffer to be retrived. + @return The pointer to the buffer to be retrieved. **/ VOID * diff --git a/MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.c b/MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.c index 9a207859bffa..d11d35614b7a 100644 --- a/MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.c +++ b/MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCodeRouterRuntimeDxe.c @@ -133,7 +133,7 @@ Register ( CallbackEntry->Tpl = Tpl; // - // If TPL of registered callback funtion is not TPL_HIGH_LEVEL, then event should be created + // If TPL of registered callback function is not TPL_HIGH_LEVEL, then event should be created // for it, and related buffer for status code data should be prepared. // Here the data buffer must be prepared in advance, because Report Status Code Protocol might // be invoked under TPL_HIGH_LEVEL and no memory allocation is allowed then. diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariablePolicySmmDxe.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariablePolicySmmDxe.c index 60d16e9c5a49..2cd78e428c21 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariablePolicySmmDxe.c +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariablePolicySmmDxe.c @@ -812,7 +812,7 @@ VariablePolicyVirtualAddressCallback ( @param[in] ImageHandle The firmware allocated handle for the EFI image. @retval EFI_SUCCESS The entry point executed successfully. - @retval other Some error occured when executing this entry point. + @retval other Some error occurred when executing this entry point. **/ EFI_STATUS From 1a21b50d6b70e25c349657cbefa1f3fa0b2ef86b Mon Sep 17 00:00:00 2001 From: Philipp Schuster Date: Tue, 4 Nov 2025 08:25:28 +0100 Subject: [PATCH 0766/1172] MdePkg: fix various typos Signed-off-by: Philipp Schuster --- MdePkg/Include/Library/BaseLib.h | 28 ++++++++++++++-------------- MdePkg/Include/Protocol/Pcd.h | 2 +- MdePkg/Library/BaseLib/LinkedList.c | 28 ++++++++++++++-------------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/MdePkg/Include/Library/BaseLib.h b/MdePkg/Include/Library/BaseLib.h index a2b5b01f17d1..aab802a0991e 100644 --- a/MdePkg/Include/Library/BaseLib.h +++ b/MdePkg/Include/Library/BaseLib.h @@ -2967,7 +2967,7 @@ InitializeListHead ( If ListHead is NULL, then ASSERT(). If Entry is NULL, then ASSERT(). - If ListHead was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or + If ListHead was not initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(), then ASSERT(). If PcdMaximumLinkedListLength is not zero, and prior to insertion the number of nodes in ListHead, including the ListHead node, is greater than or @@ -2996,7 +2996,7 @@ InsertHeadList ( If ListHead is NULL, then ASSERT(). If Entry is NULL, then ASSERT(). - If ListHead was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or + If ListHead was not initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(), then ASSERT(). If PcdMaximumLinkedListLength is not zero, and prior to insertion the number of nodes in ListHead, including the ListHead node, is greater than or @@ -3020,11 +3020,11 @@ InsertTailList ( Retrieves the first node of a doubly linked list. Returns the first node of a doubly linked list. List must have been - initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). + initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). If List is empty, then List is returned. If List is NULL, then ASSERT(). - If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or + If List was not initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(), then ASSERT(). If PcdMaximumLinkedListLength is not zero, and the number of nodes in List, including the List node, is greater than or equal to @@ -3046,12 +3046,12 @@ GetFirstNode ( Retrieves the next node of a doubly linked list. Returns the node of a doubly linked list that follows Node. - List must have been initialized with INTIALIZE_LIST_HEAD_VARIABLE() + List must have been initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). If List is empty, then List is returned. If List is NULL, then ASSERT(). If Node is NULL, then ASSERT(). - If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or + If List was not initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(), then ASSERT(). If PcdMaximumLinkedListLength is not zero, and List contains more than PcdMaximumLinkedListLength nodes, then ASSERT(). @@ -3074,12 +3074,12 @@ GetNextNode ( Retrieves the previous node of a doubly linked list. Returns the node of a doubly linked list that precedes Node. - List must have been initialized with INTIALIZE_LIST_HEAD_VARIABLE() + List must have been initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). If List is empty, then List is returned. If List is NULL, then ASSERT(). If Node is NULL, then ASSERT(). - If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or + If List was not initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(), then ASSERT(). If PcdMaximumLinkedListLength is not zero, and List contains more than PcdMaximumLinkedListLength nodes, then ASSERT(). @@ -3105,7 +3105,7 @@ GetPreviousNode ( zero nodes, this function returns TRUE. Otherwise, it returns FALSE. If ListHead is NULL, then ASSERT(). - If ListHead was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or + If ListHead was not initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(), then ASSERT(). If PcdMaximumLinkedListLength is not zero, and the number of nodes in List, including the List node, is greater than or equal to @@ -3130,11 +3130,11 @@ IsListEmpty ( Returns TRUE if Node is equal to List. Returns FALSE if Node is one of the nodes in the doubly linked list specified by List. List must have been - initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). + initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). If List is NULL, then ASSERT(). If Node is NULL, then ASSERT(). - If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(), + If List was not initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(), then ASSERT(). If PcdMaximumLinkedListLength is not zero, and the number of nodes in List, including the List node, is greater than or equal to @@ -3161,11 +3161,11 @@ IsNull ( Returns TRUE if Node is the last node in the doubly linked list specified by List. Otherwise, FALSE is returned. List must have been initialized with - INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). + INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). If List is NULL, then ASSERT(). If Node is NULL, then ASSERT(). - If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or + If List was not initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(), then ASSERT(). If PcdMaximumLinkedListLength is not zero, and the number of nodes in List, including the List node, is greater than or equal to @@ -3194,7 +3194,7 @@ IsNodeAtEnd ( Otherwise, the location of the FirstEntry node is swapped with the location of the SecondEntry node in a doubly linked list. SecondEntry must be in the same double linked list as FirstEntry and that double linked list must have - been initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). + been initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). SecondEntry is returned after the nodes are swapped. If FirstEntry is NULL, then ASSERT(). diff --git a/MdePkg/Include/Protocol/Pcd.h b/MdePkg/Include/Protocol/Pcd.h index 25f73cda1423..67dc04b4aabe 100644 --- a/MdePkg/Include/Protocol/Pcd.h +++ b/MdePkg/Include/Protocol/Pcd.h @@ -130,7 +130,7 @@ UINT64 @param[in] TokenNumber The PCD token number. - @return The pointer to the buffer to be retrived. + @return The pointer to the buffer to be retrieved. **/ typedef diff --git a/MdePkg/Library/BaseLib/LinkedList.c b/MdePkg/Library/BaseLib/LinkedList.c index 3aa20ef8a134..5068ded0efc1 100644 --- a/MdePkg/Library/BaseLib/LinkedList.c +++ b/MdePkg/Library/BaseLib/LinkedList.c @@ -200,7 +200,7 @@ InitializeListHead ( If ListHead is NULL, then ASSERT(). If Entry is NULL, then ASSERT(). - If ListHead was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or + If ListHead was not initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(), then ASSERT(). If PcdMaximumLinkedListLength is not zero, and prior to insertion the number of nodes in ListHead, including the ListHead node, is greater than or @@ -241,7 +241,7 @@ InsertHeadList ( If ListHead is NULL, then ASSERT(). If Entry is NULL, then ASSERT(). - If ListHead was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or + If ListHead was not initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(), then ASSERT(). If PcdMaximumLinkedListLength is not zero, and prior to insertion the number of nodes in ListHead, including the ListHead node, is greater than or @@ -277,11 +277,11 @@ InsertTailList ( Retrieves the first node of a doubly-linked list. Returns the first node of a doubly-linked list. List must have been - initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). + initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). If List is empty, then List is returned. If List is NULL, then ASSERT(). - If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or + If List was not initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(), then ASSERT(). If PcdMaximumLinkedListLength is not zero, and the number of nodes in List, including the List node, is greater than or equal to @@ -311,12 +311,12 @@ GetFirstNode ( Retrieves the next node of a doubly-linked list. Returns the node of a doubly-linked list that follows Node. - List must have been initialized with INTIALIZE_LIST_HEAD_VARIABLE() + List must have been initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). If List is empty, then List is returned. If List is NULL, then ASSERT(). If Node is NULL, then ASSERT(). - If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or + If List was not initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(), then ASSERT(). If PcdMaximumLinkedListLength is not zero, and List contains more than PcdMaximumLinkedListLength nodes, then ASSERT(). @@ -347,12 +347,12 @@ GetNextNode ( Retrieves the previous node of a doubly-linked list. Returns the node of a doubly-linked list that precedes Node. - List must have been initialized with INTIALIZE_LIST_HEAD_VARIABLE() + List must have been initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). If List is empty, then List is returned. If List is NULL, then ASSERT(). If Node is NULL, then ASSERT(). - If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or + If List was not initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(), then ASSERT(). If PcdMaximumLinkedListLength is not zero, and List contains more than PcdMaximumLinkedListLength nodes, then ASSERT(). @@ -386,7 +386,7 @@ GetPreviousNode ( zero nodes, this function returns TRUE. Otherwise, it returns FALSE. If ListHead is NULL, then ASSERT(). - If ListHead was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or + If ListHead was not initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(), then ASSERT(). If PcdMaximumLinkedListLength is not zero, and the number of nodes in List, including the List node, is greater than or equal to @@ -419,11 +419,11 @@ IsListEmpty ( Returns TRUE if Node is equal to List. Returns FALSE if Node is one of the nodes in the doubly-linked list specified by List. List must have been - initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). + initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). If List is NULL, then ASSERT(). If Node is NULL, then ASSERT(). - If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(), + If List was not initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(), then ASSERT(). If PcdMaximumLinkedListLength is not zero, and the number of nodes in List, including the List node, is greater than or equal to @@ -458,11 +458,11 @@ IsNull ( Returns TRUE if Node is the last node in the doubly-linked list specified by List. Otherwise, FALSE is returned. List must have been initialized with - INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). + INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). If List is NULL, then ASSERT(). If Node is NULL, then ASSERT(). - If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or + If List was not initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(), then ASSERT(). If PcdMaximumLinkedListLength is not zero, and the number of nodes in List, including the List node, is greater than or equal to @@ -499,7 +499,7 @@ IsNodeAtEnd ( Otherwise, the location of the FirstEntry node is swapped with the location of the SecondEntry node in a doubly-linked list. SecondEntry must be in the same double linked list as FirstEntry and that double linked list must have - been initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). + been initialized with INITIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). SecondEntry is returned after the nodes are swapped. If FirstEntry is NULL, then ASSERT(). From d5df66e297ae3a3377485a024f8a60256577de5d Mon Sep 17 00:00:00 2001 From: Philipp Schuster Date: Tue, 4 Nov 2025 08:25:33 +0100 Subject: [PATCH 0767/1172] NetworkPkg: fix various typos Signed-off-by: Philipp Schuster --- NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c b/NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c index edb8f580fae9..58bcf07368b2 100644 --- a/NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c +++ b/NetworkPkg/Library/DxeHttpLib/DxeHttpLib.c @@ -1634,7 +1634,7 @@ HttpGetFieldNameAndValue ( } // - // Replace ':' with 0, then FieldName has been retrived from String. + // Replace ':' with 0, then FieldName has been retrieved from String. // *(FieldValueStr - 1) = 0; From 64f9ff1e8c44f4799b0a7a376c766c1a18cad2b9 Mon Sep 17 00:00:00 2001 From: Philipp Schuster Date: Tue, 4 Nov 2025 08:25:39 +0100 Subject: [PATCH 0768/1172] RedfishPkg: fix various typos Signed-off-by: Philipp Schuster --- .../PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c index bb287f2de4c0..c8454a88431d 100644 --- a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c +++ b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/payload.c @@ -220,7 +220,7 @@ getPayloadByIndex ( if (*StatusCode != NULL) { // - // The Payload (members) are retrived from server. + // The Payload (members) are retrieved from server. // FreePool (*StatusCode); *StatusCode = NULL; @@ -231,7 +231,7 @@ getPayloadByIndex ( if ((*StatusCode == NULL) && (ret != NULL) && FromServerFlag) { // // In such a case, the Redfish resource is parsed from the input payload (members) directly. - // Since the members are retrived from server, we still return HTTP_STATUS_200_OK. + // Since the members are retrieved from server, we still return HTTP_STATUS_200_OK. // *StatusCode = AllocateZeroPool (sizeof (EFI_HTTP_STATUS_CODE)); if (*StatusCode == NULL) { @@ -339,7 +339,7 @@ getPayloadForPath ( if ((*StatusCode == NULL) && (tmp != NULL) && FromServerFlag) { // // In such a case, the Redfish resource is parsed from the input payload (ret) directly. - // Since the ret are retrived from server, we still return HTTP_STATUS_200_OK. + // Since the ret are retrieved from server, we still return HTTP_STATUS_200_OK. // *StatusCode = AllocateZeroPool (sizeof (EFI_HTTP_STATUS_CODE)); if (*StatusCode == NULL) { From 5c6b2b8ba6632c308792f81556997f9173ddec13 Mon Sep 17 00:00:00 2001 From: Philipp Schuster Date: Tue, 4 Nov 2025 08:25:44 +0100 Subject: [PATCH 0769/1172] SecurityPkg: fix various typos Signed-off-by: Philipp Schuster --- .../SecureBootConfigDxe/SecureBootConfigImpl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c index aad677b7d9bb..f93967f0f2b0 100644 --- a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c +++ b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c @@ -359,7 +359,7 @@ CheckX509Certificate ( // Status = ReadFileContent (X509FileContext->FHandle, (VOID **)&X509Data, &X509DataSize, 0); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "Error occured while reading the file.\n")); + DEBUG ((DEBUG_ERROR, "Error occurred while reading the file.\n")); goto ON_EXIT; } @@ -367,7 +367,7 @@ CheckX509Certificate ( // Parse the public key context. // if (RsaGetPublicKeyFromX509 (X509Data, X509DataSize, &X509PubKey) == FALSE) { - DEBUG ((DEBUG_ERROR, "Error occured while parsing the pubkey from certificate.\n")); + DEBUG ((DEBUG_ERROR, "Error occurred while parsing the pubkey from certificate.\n")); Status = EFI_INVALID_PARAMETER; *Error = Unsupported_Type; goto ON_EXIT; From 9b7b1f369a5fe4647d5882270b306e874222e2dd Mon Sep 17 00:00:00 2001 From: Philipp Schuster Date: Tue, 11 Nov 2025 14:12:11 +0100 Subject: [PATCH 0770/1172] ShellPkg: fix various typos Signed-off-by: Philipp Schuster --- ShellPkg/DynamicCommand/HttpDynamicCommand/Http.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ShellPkg/DynamicCommand/HttpDynamicCommand/Http.c b/ShellPkg/DynamicCommand/HttpDynamicCommand/Http.c index 735e463a14b2..2cf78dfa13a3 100644 --- a/ShellPkg/DynamicCommand/HttpDynamicCommand/Http.c +++ b/ShellPkg/DynamicCommand/HttpDynamicCommand/Http.c @@ -187,7 +187,7 @@ EFI_HII_HANDLE mHttpHiiHandle; @param[out] Value UINT16 value. @retval TRUE The value was returned. - @retval FALSE A parsing error occured. + @retval FALSE A parsing error occurred. **/ STATIC BOOLEAN @@ -785,7 +785,7 @@ RunHttp ( @param[out] Value UINT16 value @retval TRUE The value was returned. - @retval FALSE A parsing error occured. + @retval FALSE A parsing error occurred. **/ STATIC BOOLEAN From 01677e4d7a6ec5c49208fdfc4c3bfbf84ede0ec0 Mon Sep 17 00:00:00 2001 From: Philipp Schuster Date: Tue, 11 Nov 2025 14:12:17 +0100 Subject: [PATCH 0771/1172] UefiCpuPkg: fix various typos Signed-off-by: Philipp Schuster --- UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h | 2 +- UefiCpuPkg/CpuTimerDxeRiscV64/Timer.c | 6 +++--- UefiCpuPkg/CpuTimerDxeRiscV64/Timer.h | 2 +- UefiCpuPkg/Include/Library/LocalApicLib.h | 4 ++-- UefiCpuPkg/Include/Library/MmSaveStateLib.h | 4 ++-- UefiCpuPkg/Include/Library/MpInitLib.h | 2 +- UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h | 6 +++--- UefiCpuPkg/Include/Protocol/SmMonitorInit.h | 4 ++-- UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c | 4 ++-- UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c | 4 ++-- .../UnitTest/CpuExceptionHandlerTest.h | 2 +- UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableMap.c | 4 ++-- .../CpuPageTableLib/UnitTest/CpuPageTableLibUnitTest.h | 2 +- .../CpuPageTableLib/UnitTest/CpuPageTableLibUnitTestHost.c | 2 +- UefiCpuPkg/Library/CpuPageTableLib/UnitTest/TestHelper.c | 2 +- UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveState.c | 6 +++--- UefiCpuPkg/Library/MmSaveStateLib/IntelMmSaveState.c | 4 ++-- UefiCpuPkg/Library/MmSaveStateLib/MmSaveState.h | 2 +- UefiCpuPkg/Library/MmSaveStateLib/MmSaveStateCommon.c | 2 +- UefiCpuPkg/Library/MpInitLib/DxeMpLib.c | 4 ++-- UefiCpuPkg/Library/MpInitLib/Ia32/CreatePageTable.c | 2 +- UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm | 2 +- UefiCpuPkg/Library/MpInitLib/LoongArch64/MpLib.c | 4 ++-- UefiCpuPkg/Library/MpInitLib/MpLib.c | 4 ++-- UefiCpuPkg/Library/MpInitLib/MpLib.h | 2 +- UefiCpuPkg/Library/MpInitLib/PeiMpLib.c | 2 +- UefiCpuPkg/Library/MpInitLib/X64/CreatePageTable.c | 2 +- UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.c | 2 +- UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.c | 2 +- UefiCpuPkg/Library/SmmCpuFeaturesLib/CpuFeaturesLib.h | 2 +- .../Library/SmmCpuFeaturesLib/IntelSmmCpuFeaturesLib.c | 2 +- UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.c | 4 ++-- UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.h | 4 ++-- UefiCpuPkg/SecCore/SecMain.c | 2 +- UefiCpuPkg/SecCore/SecTemporaryRamDone.c | 2 +- UefiCpuPkg/SecMigrationPei/SecMigrationPei.c | 2 +- UefiCpuPkg/SecMigrationPei/SecMigrationPei.h | 2 +- UefiCpuPkg/UefiCpuPkg.dec | 4 ++-- 38 files changed, 57 insertions(+), 57 deletions(-) diff --git a/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h b/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h index 347c6ed823f3..7b860cb16f0f 100644 --- a/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h +++ b/UefiCpuPkg/CpuDxeRiscV64/CpuDxe.h @@ -179,7 +179,7 @@ CpuGetTimerValue ( ); /** - Set memory cacheability attributes for given range of memeory. + Set memory cacheability attributes for given range of memory. @param This Protocol instance structure @param BaseAddress Specifies the start address of the diff --git a/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.c b/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.c index 14780e4c45d6..4854633f8ee6 100644 --- a/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.c +++ b/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.c @@ -87,8 +87,8 @@ RiscVIsSstcEnabled ( /** Timer Interrupt Handler. - @param InterruptType The type of interrupt that occured - @param SystemContext A pointer to the system context when the interrupt occured + @param InterruptType The type of interrupt that occurred + @param SystemContext A pointer to the system context when the interrupt occurred **/ VOID EFIAPI @@ -304,7 +304,7 @@ TimerDriverGenerateSoftInterrupt ( @retval EFI_SUCCESS Timer Architectural Protocol created @retval EFI_OUT_OF_RESOURCES Not enough resources available to initialize driver. - @retval EFI_DEVICE_ERROR A device error occured attempting to initialize the driver. + @retval EFI_DEVICE_ERROR A device error occurred attempting to initialize the driver. **/ EFI_STATUS diff --git a/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.h b/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.h index 067bbd29f377..2b9131f5ed35 100644 --- a/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.h +++ b/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.h @@ -45,7 +45,7 @@ RiscvSetTimerPeriod ( @retval EFI_SUCCESS Timer Architectural Protocol created @retval EFI_OUT_OF_RESOURCES Not enough resources available to initialize driver. - @retval EFI_DEVICE_ERROR A device error occured attempting to initialize the driver. + @retval EFI_DEVICE_ERROR A device error occurred attempting to initialize the driver. **/ EFI_STATUS diff --git a/UefiCpuPkg/Include/Library/LocalApicLib.h b/UefiCpuPkg/Include/Library/LocalApicLib.h index d7c2ad3f7040..1ff1aa0f9ba1 100644 --- a/UefiCpuPkg/Include/Library/LocalApicLib.h +++ b/UefiCpuPkg/Include/Library/LocalApicLib.h @@ -305,7 +305,7 @@ GetApicTimerCurrentCount ( @param DivideValue The divide value for the DCR. It is one of 1,2,4,8,16,32,64,128. If it is 0, then use the current divide value in the DCR. @param InitCount The initial count value. - @param PeriodicMode If TRUE, timer mode is peridoic. Othewise, timer mode is one-shot. + @param PeriodicMode If TRUE, timer mode is periodic. Othewise, timer mode is one-shot. @param Vector The timer interrupt vector number. **/ VOID @@ -321,7 +321,7 @@ InitializeApicTimer ( Get the state of the local APIC timer. @param DivideValue Return the divide value for the DCR. It is one of 1,2,4,8,16,32,64,128. - @param PeriodicMode Return the timer mode. If TRUE, timer mode is peridoic. Othewise, timer mode is one-shot. + @param PeriodicMode Return the timer mode. If TRUE, timer mode is periodic. Othewise, timer mode is one-shot. @param Vector Return the timer interrupt vector number. **/ VOID diff --git a/UefiCpuPkg/Include/Library/MmSaveStateLib.h b/UefiCpuPkg/Include/Library/MmSaveStateLib.h index db4552e4a809..f4490d9011ef 100644 --- a/UefiCpuPkg/Include/Library/MmSaveStateLib.h +++ b/UefiCpuPkg/Include/Library/MmSaveStateLib.h @@ -32,7 +32,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent from the save state. @retval EFI_SUCCESS The register was read from Save State. - @retval EFI_INVALID_PARAMTER Buffer is NULL. + @retval EFI_INVALID_PARAMETER Buffer is NULL. @retval EFI_UNSUPPORTED This function does not support reading Register. @retval EFI_NOT_FOUND If desired Register not found. **/ @@ -58,7 +58,7 @@ MmSaveStateReadRegister ( @param[in] Buffer Upon entry, this holds the new CPU register value. @retval EFI_SUCCESS The register was written to Save State. - @retval EFI_INVALID_PARAMTER Buffer is NULL. + @retval EFI_INVALID_PARAMETER Buffer is NULL. @retval EFI_UNSUPPORTED This function does not support writing Register. @retval EFI_NOT_FOUND If desired Register not found. **/ diff --git a/UefiCpuPkg/Include/Library/MpInitLib.h b/UefiCpuPkg/Include/Library/MpInitLib.h index 842c6f7ff9a5..bc510f701d9d 100644 --- a/UefiCpuPkg/Include/Library/MpInitLib.h +++ b/UefiCpuPkg/Include/Library/MpInitLib.h @@ -64,7 +64,7 @@ MpInitLibGetNumberOfProcessors ( @param[in] ProcessorNumber The handle number of processor. Lower 24 bits contains the actual processor number. - BIT24 indicates if the EXTENDED_PROCESSOR_INFORMATION will be retrived. + BIT24 indicates if the EXTENDED_PROCESSOR_INFORMATION will be retrieved. @param[out] ProcessorInfoBuffer A pointer to the buffer where information for the requested processor is deposited. @param[out] HealthData Return processor health data. diff --git a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h index 36459afc5e24..40686fe1f3c5 100644 --- a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h +++ b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h @@ -511,7 +511,7 @@ PreSmmCpuRegisterTableWrite ( @param[in] RegisterType Type of the register to program. @param[in] Index Index of the register to program. @param[in] Type The data type name of a register structure. - @param[in] Field The bit fiel name in register structure to write. + @param[in] Field The bit field name in register structure to write. @param[in] Value Value to write to the bit field. @note This service could be called by BSP only. @@ -536,7 +536,7 @@ PreSmmCpuRegisterTableWrite ( @param[in] RegisterType Type of the register to program. @param[in] Index Index of the register to program. @param[in] Type The data type name of a register structure. - @param[in] Field The bit fiel name in register structure to write. + @param[in] Field The bit field name in register structure to write. @param[in] Value Value to write to the bit field. @note This service could be called by BSP only. @@ -595,7 +595,7 @@ PreSmmCpuRegisterTableWrite ( @param[in] RegisterType Type of the register to program. @param[in] Index Index of the register to program. @param[in] Type The data type name of a register structure. - @param[in] Field The bit fiel name in register structure to write. + @param[in] Field The bit field name in register structure to write. @param[in] Value Value to write to the bit field. @note This service could be called by BSP only. diff --git a/UefiCpuPkg/Include/Protocol/SmMonitorInit.h b/UefiCpuPkg/Include/Protocol/SmMonitorInit.h index 0f77897e03ff..d75ff8e986db 100644 --- a/UefiCpuPkg/Include/Protocol/SmMonitorInit.h +++ b/UefiCpuPkg/Include/Protocol/SmMonitorInit.h @@ -48,7 +48,7 @@ EFI_STATUS If 0, list must be terminated by END_OF_RESOURCES. @retval EFI_SUCCESS If resources are added - @retval EFI_INVALID_PARAMETER If nested procedure detected resource failer + @retval EFI_INVALID_PARAMETER If nested procedure detected resource failure @retval EFI_OUT_OF_RESOURCES If nested procedure returned it and we cannot allocate more areas. **/ @@ -69,7 +69,7 @@ EFI_STATUS If 0, list must be terminated by END_OF_RESOURCES. @retval EFI_SUCCESS If resources are deleted - @retval EFI_INVALID_PARAMETER If nested procedure detected resource failer + @retval EFI_INVALID_PARAMETER If nested procedure detected resource failure **/ typedef diff --git a/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c b/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c index 9767e3b48edb..724f96df2239 100644 --- a/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c +++ b/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c @@ -724,7 +724,7 @@ GetApicTimerCurrentCount ( @param DivideValue The divide value for the DCR. It is one of 1,2,4,8,16,32,64,128. If it is 0, then use the current divide value in the DCR. @param InitCount The initial count value. - @param PeriodicMode If TRUE, timer mode is peridoic. Othewise, timer mode is one-shot. + @param PeriodicMode If TRUE, timer mode is periodic. Othewise, timer mode is one-shot. @param Vector The timer interrupt vector number. **/ VOID @@ -782,7 +782,7 @@ InitializeApicTimer ( This function will ASSERT if the local APIC is not software enabled. @param DivideValue Return the divide value for the DCR. It is one of 1,2,4,8,16,32,64,128. - @param PeriodicMode Return the timer mode. If TRUE, timer mode is peridoic. Othewise, timer mode is one-shot. + @param PeriodicMode Return the timer mode. If TRUE, timer mode is periodic. Othewise, timer mode is one-shot. @param Vector Return the timer interrupt vector number. **/ VOID diff --git a/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c b/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c index 7fa997c88296..6ef096ad6d9c 100644 --- a/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c +++ b/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c @@ -963,7 +963,7 @@ GetApicTimerCurrentCount ( @param DivideValue The divide value for the DCR. It is one of 1,2,4,8,16,32,64,128. If it is 0, then use the current divide value in the DCR. @param InitCount The initial count value. - @param PeriodicMode If TRUE, timer mode is peridoic. Othewise, timer mode is one-shot. + @param PeriodicMode If TRUE, timer mode is periodic. Othewise, timer mode is one-shot. @param Vector The timer interrupt vector number. **/ VOID @@ -1021,7 +1021,7 @@ InitializeApicTimer ( This function will ASSERT if the local APIC is not software enabled. @param DivideValue Return the divide value for the DCR. It is one of 1,2,4,8,16,32,64,128. - @param PeriodicMode Return the timer mode. If TRUE, timer mode is peridoic. Othewise, timer mode is one-shot. + @param PeriodicMode Return the timer mode. If TRUE, timer mode is periodic. Othewise, timer mode is one-shot. @param Vector Return the timer interrupt vector number. **/ VOID diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/CpuExceptionHandlerTest.h b/UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/CpuExceptionHandlerTest.h index 292ee50a71cc..b6ef86bec728 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/CpuExceptionHandlerTest.h +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/CpuExceptionHandlerTest.h @@ -24,7 +24,7 @@ 2. Register values in mActualContextAfterException are the same with register values mActualContextAfterException. d.Test if stack overflow can be captured by CpuStackGuard in both Bsp and AP. - In this test case, stack overflow is triggered by a funtion which calls itself continuously. This test case triggers stack + In this test case, stack overflow is triggered by a function which calls itself continuously. This test case triggers stack overflow in both BSP and AP. All AP use same Idt with Bsp. The expectation is: 1. PF exception is triggered (leading to a DF if sepereated stack is not prepared for PF) when Rsp <= StackBase + SIZE_4KB since [StackBase, StackBase + SIZE_4KB] is marked as not present in page table when PcdCpuStackGuard is TRUE. diff --git a/UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableMap.c b/UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableMap.c index bdc411338f92..6f959033ff65 100644 --- a/UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableMap.c +++ b/UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableMap.c @@ -371,7 +371,7 @@ PageTableLibMapInLevel ( RegionMask = RegionLength - 1; // - // ParentPagingEntry ONLY is deferenced for checking Present and MustBeOne bits + // ParentPagingEntry ONLY is dereferenced for checking Present and MustBeOne bits // when Modify is FALSE. // if ((ParentPagingEntry->Pce.Present == 0) || IsPle (ParentPagingEntry, Level + 1)) { @@ -396,7 +396,7 @@ PageTableLibMapInLevel ( // // Check if the attribute, the physical address calculated by ParentPagingEntry is equal to - // the attribute, the physical address calculated by input Attribue and Mask. + // the attribute, the physical address calculated by input Attribute and Mask. // if ((IA32_MAP_ATTRIBUTE_ATTRIBUTES (&PleBAttribute) & IA32_MAP_ATTRIBUTE_ATTRIBUTES (Mask)) == (IA32_MAP_ATTRIBUTE_ATTRIBUTES (Attribute) & IA32_MAP_ATTRIBUTE_ATTRIBUTES (Mask))) diff --git a/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/CpuPageTableLibUnitTest.h b/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/CpuPageTableLibUnitTest.h index 801d718e44ce..c559f2d81c3e 100644 --- a/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/CpuPageTableLibUnitTest.h +++ b/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/CpuPageTableLibUnitTest.h @@ -103,7 +103,7 @@ IsPageTableValid ( ); /** - Get max physical adrress supported by specific page mode + Get max physical address supported by specific page mode @param[in] Mode The paging mode. diff --git a/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/CpuPageTableLibUnitTestHost.c b/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/CpuPageTableLibUnitTestHost.c index 056aabc238c8..00f89b62412c 100644 --- a/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/CpuPageTableLibUnitTestHost.c +++ b/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/CpuPageTableLibUnitTestHost.c @@ -352,7 +352,7 @@ TestCaseManualChangeReadWrite ( // // The latest PageTableMap call should change nothing. - // The memory should be identical before and after the funtion is called. + // The memory should be identical before and after the function is called. // UT_ASSERT_MEM_EQUAL (Buffer, BackupBuffer, BackupPageTableBufferSize); diff --git a/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/TestHelper.c b/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/TestHelper.c index d2c50a6c8a84..fd66ae0c06fc 100644 --- a/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/TestHelper.c +++ b/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/TestHelper.c @@ -296,7 +296,7 @@ GetEntryFromPageTable ( } /** - Get max physical adrress supported by specific page mode + Get max physical address supported by specific page mode @param[in] Mode The paging mode. diff --git a/UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveState.c b/UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveState.c index 958feac05c94..4e0ba246ab7c 100644 --- a/UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveState.c +++ b/UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveState.c @@ -103,7 +103,7 @@ CONST CPU_MM_SAVE_STATE_REGISTER_RANGE mCpuRegisterRanges[] = { from the save state. @retval EFI_SUCCESS The register was read from Save State. - @retval EFI_INVALID_PARAMTER Buffer is NULL. + @retval EFI_INVALID_PARAMETER Buffer is NULL. @retval EFI_UNSUPPORTED This function does not support reading Register. @retval EFI_NOT_FOUND If desired Register not found. **/ @@ -206,7 +206,7 @@ MmSaveStateReadRegister ( @param[in] Buffer Upon entry, this holds the new CPU register value. @retval EFI_SUCCESS The register was written to Save State. - @retval EFI_INVALID_PARAMTER Buffer is NULL. + @retval EFI_INVALID_PARAMETER Buffer is NULL. @retval EFI_UNSUPPORTED This function does not support writing Register. @retval EFI_NOT_FOUND If desired Register not found. **/ @@ -342,7 +342,7 @@ MmSaveStateGetRegisterIndex ( @retval EFI_SUCCESS The register was read from Save State. @retval EFI_NOT_FOUND The register is not defined for the Save State of Processor. - @retval EFI_INVALID_PARAMTER This or Buffer is NULL. + @retval EFI_INVALID_PARAMETER This or Buffer is NULL. **/ EFI_STATUS diff --git a/UefiCpuPkg/Library/MmSaveStateLib/IntelMmSaveState.c b/UefiCpuPkg/Library/MmSaveStateLib/IntelMmSaveState.c index c2ccd65b1dc4..f02d75bdb6b6 100644 --- a/UefiCpuPkg/Library/MmSaveStateLib/IntelMmSaveState.c +++ b/UefiCpuPkg/Library/MmSaveStateLib/IntelMmSaveState.c @@ -139,7 +139,7 @@ STATIC CONST EFI_MM_SAVE_STATE_IO_TYPE mSmmCpuIoType[] = { from the save state. @retval EFI_SUCCESS The register was read from Save State. - @retval EFI_INVALID_PARAMTER Buffer is NULL. + @retval EFI_INVALID_PARAMETER Buffer is NULL. @retval EFI_UNSUPPORTED This function does not support reading Register. @retval EFI_NOT_FOUND If desired Register not found. **/ @@ -258,7 +258,7 @@ MmSaveStateReadRegister ( @param[in] Buffer Upon entry, this holds the new CPU register value. @retval EFI_SUCCESS The register was written to Save State. - @retval EFI_INVALID_PARAMTER Buffer is NULL. + @retval EFI_INVALID_PARAMETER Buffer is NULL. @retval EFI_UNSUPPORTED This function does not support writing Register. @retval EFI_NOT_FOUND If desired Register not found. **/ diff --git a/UefiCpuPkg/Library/MmSaveStateLib/MmSaveState.h b/UefiCpuPkg/Library/MmSaveStateLib/MmSaveState.h index 6c7e8abd5f62..ffcb6d67fb58 100644 --- a/UefiCpuPkg/Library/MmSaveStateLib/MmSaveState.h +++ b/UefiCpuPkg/Library/MmSaveStateLib/MmSaveState.h @@ -80,7 +80,7 @@ MmSaveStateGetRegisterIndex ( @retval EFI_SUCCESS The register was read from Save State. @retval EFI_NOT_FOUND The register is not defined for the Save State of Processor. - @retval EFI_INVALID_PARAMTER This or Buffer is NULL. + @retval EFI_INVALID_PARAMETER This or Buffer is NULL. **/ EFI_STATUS diff --git a/UefiCpuPkg/Library/MmSaveStateLib/MmSaveStateCommon.c b/UefiCpuPkg/Library/MmSaveStateLib/MmSaveStateCommon.c index f66245b82c40..4beb6e5fae04 100644 --- a/UefiCpuPkg/Library/MmSaveStateLib/MmSaveStateCommon.c +++ b/UefiCpuPkg/Library/MmSaveStateLib/MmSaveStateCommon.c @@ -66,7 +66,7 @@ MmSaveStateGetRegisterIndex ( @retval EFI_SUCCESS The register was read from Save State. @retval EFI_NOT_FOUND The register is not defined for the Save State of Processor. - @retval EFI_INVALID_PARAMTER This or Buffer is NULL. + @retval EFI_INVALID_PARAMETER This or Buffer is NULL. **/ EFI_STATUS diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c index f5f607401044..fe7e373d356a 100644 --- a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c @@ -109,7 +109,7 @@ GetWakeupBuffer ( // LegacyBios driver only reports warning when page allocation in range // [0x60000, 0x88000) fails. // This library is consumed by CpuDxe driver to produce CPU Arch protocol. - // LagacyBios driver depends on CPU Arch protocol which guarantees below + // LegacyBios driver depends on CPU Arch protocol which guarantees below // allocation runs earlier than LegacyBios driver. // if (ConfidentialComputingGuestHas (CCAttrAmdSevEs)) { @@ -983,7 +983,7 @@ MpInitLibEnableDisableAP ( } /** - This funtion will try to invoke platform specific microcode shadow logic to + This function will try to invoke platform specific microcode shadow logic to relocate microcode update patches into memory. @param[in, out] CpuMpData The pointer to CPU MP Data structure. diff --git a/UefiCpuPkg/Library/MpInitLib/Ia32/CreatePageTable.c b/UefiCpuPkg/Library/MpInitLib/Ia32/CreatePageTable.c index bec9b247c01c..1bfc7cff7266 100644 --- a/UefiCpuPkg/Library/MpInitLib/Ia32/CreatePageTable.c +++ b/UefiCpuPkg/Library/MpInitLib/Ia32/CreatePageTable.c @@ -1,5 +1,5 @@ /** @file - Function to create page talbe. + Function to create page table. Only create page table for x64, and leave the CreatePageTable empty for Ia32. Copyright (c) 2023, Intel Corporation. All rights reserved.
    SPDX-License-Identifier: BSD-2-Clause-Patent diff --git a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm index c0fe631635a9..1623280d27a0 100644 --- a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm +++ b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm @@ -227,7 +227,7 @@ RendezvousFunnelProcEnd: AsmRelocateApLoopGenericStart: mov eax, cr0 btr eax, 31 ; Clear CR0.PG - mov cr0, eax ; Disable paging since the page table might be unavailiable + mov cr0, eax ; Disable paging since the page table might be unavailable mov eax, esp mov esp, [eax + 12] ; TopOfApStack diff --git a/UefiCpuPkg/Library/MpInitLib/LoongArch64/MpLib.c b/UefiCpuPkg/Library/MpInitLib/LoongArch64/MpLib.c index 03630626db89..ba0b01b92e26 100644 --- a/UefiCpuPkg/Library/MpInitLib/LoongArch64/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/LoongArch64/MpLib.c @@ -230,10 +230,10 @@ CollectProcessorCount ( CpuMpData->ApLoopMode = ApInRunLoop; // - // Beacuse LoongArch does not have SIPI now, the APIC ID must be obtained before + // Because LoongArch does not have SIPI now, the APIC ID must be obtained before // calling IPI to wake up the APs. If NULL is obtained, NODE0 Core0 Mailbox0 is used // as the first broadcast method to wake up all APs, and all of APs will read NODE0 - // Core0 Mailbox0 in an infinit loop. + // Core0 Mailbox0 in an infinite loop. // mProcessorResourceData = GetProcessorResourceDataFromGuidedHob (); diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c index 426d998b9a47..033e14140121 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -2151,7 +2151,7 @@ MpInitLibInitialize ( BufferSize = ApStackSize * MaxLogicalProcessorNumber; // - // Allocate extra ApStackSize to let AP stack align on ApStackSize bounday + // Allocate extra ApStackSize to let AP stack align on ApStackSize boundary // BufferSize += ApStackSize; BufferSize += MonitorFilterSize * MaxLogicalProcessorNumber; @@ -2510,7 +2510,7 @@ MpInitLibInitialize ( @param[in] ProcessorNumber The handle number of processor. Lower 24 bits contains the actual processor number. - BIT24 indicates if the EXTENDED_PROCESSOR_INFORMATION will be retrived. + BIT24 indicates if the EXTENDED_PROCESSOR_INFORMATION will be retrieved. @param[out] ProcessorInfoBuffer A pointer to the buffer where information for the requested processor is deposited. @param[out] HealthData Return processor health data. diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h index 5d10516cd81a..c86f01744e0c 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h @@ -838,7 +838,7 @@ GetProcessorNumber ( ); /** - This funtion will try to invoke platform specific microcode shadow logic to + This function will try to invoke platform specific microcode shadow logic to relocate microcode update patches into memory. @param[in, out] CpuMpData The pointer to CPU MP Data structure. diff --git a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c index e11dc7600894..9a9d44b4630b 100644 --- a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c @@ -741,7 +741,7 @@ MpInitLibEnableDisableAP ( } /** - This funtion will try to invoke platform specific microcode shadow logic to + This function will try to invoke platform specific microcode shadow logic to relocate microcode update patches into memory. @param[in, out] CpuMpData The pointer to CPU MP Data structure. diff --git a/UefiCpuPkg/Library/MpInitLib/X64/CreatePageTable.c b/UefiCpuPkg/Library/MpInitLib/X64/CreatePageTable.c index da8729e752fb..0bfead393bfb 100644 --- a/UefiCpuPkg/Library/MpInitLib/X64/CreatePageTable.c +++ b/UefiCpuPkg/Library/MpInitLib/X64/CreatePageTable.c @@ -1,5 +1,5 @@ /** @file - Function to create page talbe. + Function to create page table. Only create page table for x64, and leave the CreatePageTable empty for Ia32. Copyright (c) 2023, Intel Corporation. All rights reserved.
    SPDX-License-Identifier: BSD-2-Clause-Patent diff --git a/UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.c b/UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.c index 35590fb4e7d6..b97b90dd1389 100644 --- a/UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.c +++ b/UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.c @@ -79,7 +79,7 @@ MpInitLibGetNumberOfProcessors ( @param[in] ProcessorNumber The handle number of processor. Lower 24 bits contains the actual processor number. - BIT24 indicates if the EXTENDED_PROCESSOR_INFORMATION will be retrived. + BIT24 indicates if the EXTENDED_PROCESSOR_INFORMATION will be retrieved. @param[out] ProcessorInfoBuffer A pointer to the buffer where information for the requested processor is deposited. @param[out] HealthData Return processor health data. diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.c b/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.c index dc7095c85838..a4500ad8b989 100644 --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.c +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.c @@ -34,7 +34,7 @@ BOOLEAN mSmmCpuFeaturesSmmRelocated; /** Performs library initialization. - This initialization function contains common functionality shared betwen all + This initialization function contains common functionality shared between all library instance constructors. **/ diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/CpuFeaturesLib.h b/UefiCpuPkg/Library/SmmCpuFeaturesLib/CpuFeaturesLib.h index c2e4fbe96b53..a32c24da753d 100644 --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/CpuFeaturesLib.h +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/CpuFeaturesLib.h @@ -20,7 +20,7 @@ /** Performs library initialization. - This initialization function contains common functionality shared betwen all + This initialization function contains common functionality shared between all library instance constructors. **/ diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/IntelSmmCpuFeaturesLib.c b/UefiCpuPkg/Library/SmmCpuFeaturesLib/IntelSmmCpuFeaturesLib.c index 950056a7143d..077a701f0994 100644 --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/IntelSmmCpuFeaturesLib.c +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/IntelSmmCpuFeaturesLib.c @@ -57,7 +57,7 @@ BOOLEAN *mSmrrEnabled; /** Performs library initialization. - This initialization function contains common functionality shared betwen all + This initialization function contains common functionality shared between all library instance constructors. **/ diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.c b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.c index 6cb1c515c0fd..512516eefa8e 100644 --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.c +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.c @@ -871,7 +871,7 @@ GetResourceSize ( If 0, list must be terminated by END_OF_RESOURCES. @retval EFI_SUCCESS If resources are added - @retval EFI_INVALID_PARAMETER If nested procedure detected resource failer + @retval EFI_INVALID_PARAMETER If nested procedure detected resource failure @retval EFI_OUT_OF_RESOURCES If nested procedure returned it and we cannot allocate more areas. **/ @@ -980,7 +980,7 @@ AddPiResource ( If 0, list must be terminated by END_OF_RESOURCES. @retval EFI_SUCCESS If resources are deleted - @retval EFI_INVALID_PARAMETER If nested procedure detected resource failer + @retval EFI_INVALID_PARAMETER If nested procedure detected resource failure **/ EFI_STATUS diff --git a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.h b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.h index 597c3abf0089..656ccc01cbb7 100644 --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.h +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmStm.h @@ -85,7 +85,7 @@ LoadMonitor ( If 0, list must be terminated by END_OF_RESOURCES. @retval EFI_SUCCESS If resources are added - @retval EFI_INVALID_PARAMETER If nested procedure detected resource failer + @retval EFI_INVALID_PARAMETER If nested procedure detected resource failure @retval EFI_OUT_OF_RESOURCES If nested procedure returned it and we cannot allocate more areas. **/ @@ -106,7 +106,7 @@ AddPiResource ( If 0, list must be terminated by END_OF_RESOURCES. @retval EFI_SUCCESS If resources are deleted - @retval EFI_INVALID_PARAMETER If nested procedure detected resource failer + @retval EFI_INVALID_PARAMETER If nested procedure detected resource failure **/ EFI_STATUS diff --git a/UefiCpuPkg/SecCore/SecMain.c b/UefiCpuPkg/SecCore/SecMain.c index f6917e88d19c..25f4782fb067 100644 --- a/UefiCpuPkg/SecCore/SecMain.c +++ b/UefiCpuPkg/SecCore/SecMain.c @@ -32,7 +32,7 @@ UINT64 mIdtEntryTemplate = 0xffff8e000010ffe4ULL; /** TemporaryRamDone() disables the use of Temporary RAM. If present, this service is invoked - by the PEI Foundation after the EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is installed. + by the PEI Foundation after the EFI_PEI_PERMANENT_MEMORY_INSTALLED_PPI is installed. @retval EFI_SUCCESS Use of Temporary RAM was disabled. @retval EFI_INVALID_PARAMETER Temporary RAM could not be disabled. diff --git a/UefiCpuPkg/SecCore/SecTemporaryRamDone.c b/UefiCpuPkg/SecCore/SecTemporaryRamDone.c index f921d457e88d..996ce103de69 100644 --- a/UefiCpuPkg/SecCore/SecTemporaryRamDone.c +++ b/UefiCpuPkg/SecCore/SecTemporaryRamDone.c @@ -140,7 +140,7 @@ GetMaxAddress ( /** TemporaryRamDone() disables the use of Temporary RAM. If present, this service is invoked - by the PEI Foundation after the EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is installed. + by the PEI Foundation after the EFI_PEI_PERMANENT_MEMORY_INSTALLED_PPI is installed. @retval EFI_SUCCESS Use of Temporary RAM was disabled. @retval EFI_INVALID_PARAMETER Temporary RAM could not be disabled. diff --git a/UefiCpuPkg/SecMigrationPei/SecMigrationPei.c b/UefiCpuPkg/SecMigrationPei/SecMigrationPei.c index 363d44b8ff4c..57238f4297a1 100644 --- a/UefiCpuPkg/SecMigrationPei/SecMigrationPei.c +++ b/UefiCpuPkg/SecMigrationPei/SecMigrationPei.c @@ -72,7 +72,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_PEI_PPI_DESCRIPTOR mSecPerformancePpiDescript Disables the use of Temporary RAM. If present, this service is invoked by the PEI Foundation after - the EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is installed. + the EFI_PEI_PERMANENT_MEMORY_INSTALLED_PPI is installed. @retval EFI_SUCCESS Dummy function, alway return this value. diff --git a/UefiCpuPkg/SecMigrationPei/SecMigrationPei.h b/UefiCpuPkg/SecMigrationPei/SecMigrationPei.h index 9919c8af7673..833eecb41253 100644 --- a/UefiCpuPkg/SecMigrationPei/SecMigrationPei.h +++ b/UefiCpuPkg/SecMigrationPei/SecMigrationPei.h @@ -80,7 +80,7 @@ RepublishSecPpis ( Disables the use of Temporary RAM. If present, this service is invoked by the PEI Foundation after - the EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is installed. + the EFI_PEI_PERMANENT_MEMORY_INSTALLED_PPI is installed. @retval EFI_SUCCESS Dummy function, alway return this value. diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec index d9ce6d1497c3..05baae14455e 100644 --- a/UefiCpuPkg/UefiCpuPkg.dec +++ b/UefiCpuPkg/UefiCpuPkg.dec @@ -435,7 +435,7 @@ ## This PCD indicates whether CPU processor trace is enabled on BSP only when CPU processor trace is enabled.

    # This PCD is ignored if CPU processor trace is disabled.

    # TRUE - CPU processor trace is enabled on BSP only.
    - # FASLE - CPU processor trace is enabled on all CPU.
    + # FALSE - CPU processor trace is enabled on all CPU.
    # @Prompt Enable CPU processor trace only on BSP. gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTraceBspOnly|FALSE|BOOLEAN|0x60000019 @@ -443,7 +443,7 @@ # CYC/TSC timing packets will be generated to collect performance data if this PCD is TRUE. # This PCD is ignored if CPU processor trace is disabled.

    # TRUE - Performance collecting will be enabled in processor trace.
    - # FASLE - Performance collecting will be disabled in processor trace.
    + # FALSE - Performance collecting will be disabled in processor trace.
    # @Prompt Enable performance collecting when processor trace is enabled. gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTracePerformanceCollecting|FALSE|BOOLEAN|0x60000020 From 67ccddb2c98dcd7919db6bc7f22320d636da67e0 Mon Sep 17 00:00:00 2001 From: Philipp Schuster Date: Tue, 11 Nov 2025 14:12:24 +0100 Subject: [PATCH 0772/1172] UefiPayloadPkg: fix various typos Signed-off-by: Philipp Schuster --- UefiPayloadPkg/FvbRuntimeDxe/FvbService.c | 2 +- UefiPayloadPkg/FvbRuntimeDxe/FvbServiceSmm.c | 2 +- .../PayloadLoaderPeim/ElfLib/ElfLib.c | 4 +-- .../UefiPayloadEntry/UefiPayloadEntry.c | 36 +++++++++---------- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/UefiPayloadPkg/FvbRuntimeDxe/FvbService.c b/UefiPayloadPkg/FvbRuntimeDxe/FvbService.c index c6ea6b450e15..786bb3687b2c 100644 --- a/UefiPayloadPkg/FvbRuntimeDxe/FvbService.c +++ b/UefiPayloadPkg/FvbRuntimeDxe/FvbService.c @@ -988,7 +988,7 @@ GetInitialVariableData ( The function does the necessary initialization work for Firmware Volume Block Driver. - @retval EFI_SUCCESS This funtion always return EFI_SUCCESS. + @retval EFI_SUCCESS This function always return EFI_SUCCESS. It will ASSERT on errors. **/ diff --git a/UefiPayloadPkg/FvbRuntimeDxe/FvbServiceSmm.c b/UefiPayloadPkg/FvbRuntimeDxe/FvbServiceSmm.c index 24cb1bc66d74..5a5182e38ac5 100644 --- a/UefiPayloadPkg/FvbRuntimeDxe/FvbServiceSmm.c +++ b/UefiPayloadPkg/FvbRuntimeDxe/FvbServiceSmm.c @@ -122,7 +122,7 @@ InstallFvbProtocol ( @param[in] ImageHandle The firmware allocated handle for the UEFI image. @param[in] SystemTable A pointer to the EFI system table. - @retval EFI_SUCCESS This funtion always return EFI_SUCCESS. + @retval EFI_SUCCESS This function always return EFI_SUCCESS. It will ASSERT on errors. **/ diff --git a/UefiPayloadPkg/PayloadLoaderPeim/ElfLib/ElfLib.c b/UefiPayloadPkg/PayloadLoaderPeim/ElfLib/ElfLib.c index a9bf6f322321..c0400fbecd0b 100644 --- a/UefiPayloadPkg/PayloadLoaderPeim/ElfLib/ElfLib.c +++ b/UefiPayloadPkg/PayloadLoaderPeim/ElfLib/ElfLib.c @@ -114,7 +114,7 @@ IsElfFormat ( @retval EFI_INVALID_PARAMETER ElfCt or SecPos is NULL. @retval EFI_NOT_FOUND Could not find the section. - @retval EFI_SUCCESS Section posistion was filled successfully. + @retval EFI_SUCCESS Section position was filled successfully. **/ EFI_STATUS CalculateElfFileSize ( @@ -167,7 +167,7 @@ CalculateElfFileSize ( @retval EFI_INVALID_PARAMETER ElfCt or SecPos is NULL. @retval EFI_NOT_FOUND Could not find the section. - @retval EFI_SUCCESS Section posistion was filled successfully. + @retval EFI_SUCCESS Section position was filled successfully. **/ EFI_STATUS GetElfSegmentInfo ( diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c index 343676d892c0..921ce7d71641 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c @@ -44,7 +44,7 @@ MemInfoCallbackMmio ( EFI_PHYSICAL_ADDRESS Base; EFI_RESOURCE_TYPE Type; UINT64 Size; - EFI_RESOURCE_ATTRIBUTE_TYPE Attribue; + EFI_RESOURCE_ATTRIBUTE_TYPE Attribute; ACPI_BOARD_INFO *AcpiBoardInfo; AcpiBoardInfo = (ACPI_BOARD_INFO *)Params; @@ -81,15 +81,15 @@ MemInfoCallbackMmio ( Base = MemoryMapEntry->Base; Size = MemoryMapEntry->Size; - Attribue = EFI_RESOURCE_ATTRIBUTE_PRESENT | - EFI_RESOURCE_ATTRIBUTE_INITIALIZED | - EFI_RESOURCE_ATTRIBUTE_TESTED | - EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | - EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE | - EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | - EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE; + Attribute = EFI_RESOURCE_ATTRIBUTE_PRESENT | + EFI_RESOURCE_ATTRIBUTE_INITIALIZED | + EFI_RESOURCE_ATTRIBUTE_TESTED | + EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | + EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE | + EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | + EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE; - BuildResourceDescriptorHob (Type, Attribue, (EFI_PHYSICAL_ADDRESS)Base, Size); + BuildResourceDescriptorHob (Type, Attribute, (EFI_PHYSICAL_ADDRESS)Base, Size); DEBUG ((DEBUG_INFO, "buildhob: base = 0x%lx, size = 0x%lx, type = 0x%x\n", Base, Size, Type)); if ((MemoryMapEntry->Type == E820_UNUSABLE) || @@ -291,7 +291,7 @@ MemInfoCallback ( EFI_PHYSICAL_ADDRESS Base; EFI_RESOURCE_TYPE Type; UINT64 Size; - EFI_RESOURCE_ATTRIBUTE_TYPE Attribue; + EFI_RESOURCE_ATTRIBUTE_TYPE Attribute; // // Skip everything not known to be usable DRAM. @@ -307,15 +307,15 @@ MemInfoCallback ( Base = MemoryMapEntry->Base; Size = MemoryMapEntry->Size; - Attribue = EFI_RESOURCE_ATTRIBUTE_PRESENT | - EFI_RESOURCE_ATTRIBUTE_INITIALIZED | - EFI_RESOURCE_ATTRIBUTE_TESTED | - EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | - EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE | - EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | - EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE; + Attribute = EFI_RESOURCE_ATTRIBUTE_PRESENT | + EFI_RESOURCE_ATTRIBUTE_INITIALIZED | + EFI_RESOURCE_ATTRIBUTE_TESTED | + EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | + EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE | + EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | + EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE; - BuildResourceDescriptorHob (Type, Attribue, (EFI_PHYSICAL_ADDRESS)Base, Size); + BuildResourceDescriptorHob (Type, Attribute, (EFI_PHYSICAL_ADDRESS)Base, Size); DEBUG ((DEBUG_INFO, "buildhob: base = 0x%lx, size = 0x%lx, type = 0x%x\n", Base, Size, Type)); if (MemoryMapEntry->Type == E820_ACPI) { From e8ee86d566ae121027ad83ee94ac9b639ae0a06b Mon Sep 17 00:00:00 2001 From: Philipp Schuster Date: Tue, 11 Nov 2025 14:12:39 +0100 Subject: [PATCH 0773/1172] UnitTestFrameworkPkg: fix various typos Signed-off-by: Philipp Schuster --- .../Test/UnitTest/Sample/SampleUnitTest/SampleUnitTest.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitTestFrameworkPkg/Test/UnitTest/Sample/SampleUnitTest/SampleUnitTest.c b/UnitTestFrameworkPkg/Test/UnitTest/Sample/SampleUnitTest/SampleUnitTest.c index c02a2dba987d..dd010a75a5a6 100644 --- a/UnitTestFrameworkPkg/Test/UnitTest/Sample/SampleUnitTest/SampleUnitTest.c +++ b/UnitTestFrameworkPkg/Test/UnitTest/Sample/SampleUnitTest/SampleUnitTest.c @@ -1,5 +1,5 @@ /** @file - This is a sample to demostrate the usage of the Unit Test Library that + This is a sample to demonstrate the usage of the Unit Test Library that supports the PEI, DXE, SMM, UEFI SHell, and host execution environments. Copyright (c) Microsoft Corporation.
    From 5185e6cb00054a5c45110352be0dd865cfa1cb4a Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Sat, 8 Nov 2025 06:40:48 +0000 Subject: [PATCH 0774/1172] MdeModulePkg: Remove extraneous parentheses XCODE5 toolchain finds these, with errors such as: PxeFunction.c:763:27: error: equality comparison with extraneous parentheses Signed-off-by: Mike Beaton --- MdeModulePkg/Bus/Usb/UsbNetwork/NetworkCommon/PxeFunction.c | 2 +- MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Bus/Usb/UsbNetwork/NetworkCommon/PxeFunction.c b/MdeModulePkg/Bus/Usb/UsbNetwork/NetworkCommon/PxeFunction.c index 62df4e92ea01..049618b6c6cc 100644 --- a/MdeModulePkg/Bus/Usb/UsbNetwork/NetworkCommon/PxeFunction.c +++ b/MdeModulePkg/Bus/Usb/UsbNetwork/NetworkCommon/PxeFunction.c @@ -760,7 +760,7 @@ UndiReceiveFilter ( Cdb->StatFlags = PXE_STATFLAGS_COMMAND_FAILED; } - if ((Cdb->CPBsize == 0)) { + if (Cdb->CPBsize == 0) { Cdb->StatFlags = PXE_STATFLAGS_COMMAND_FAILED; } } diff --git a/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c b/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c index a3fa8f8e5e36..5f9f68cb9e91 100644 --- a/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c +++ b/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c @@ -3165,7 +3165,7 @@ ConSplitterTextOutDeleteDevice ( return EFI_NOT_FOUND; } - if ((Private->CurrentNumberOfGraphicsOutput == 0)) { + if (Private->CurrentNumberOfGraphicsOutput == 0) { // // If there is not any physical GOP in system, // Consplitter GOP protocol will be uninstalled From 3c6960f279cfeea6dc7564ad01ab5634889daef0 Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Sat, 8 Nov 2025 06:41:18 +0000 Subject: [PATCH 0775/1172] SecurityPkg: Remove unused variable XCODE5 toolchain finds this, with error: Tpm2Capability.c:535:23: error: variable 'ActivePcrBankCount' set but not used Fixes: https://github.com/tianocore/edk2/commit/1f2adcbba571faead4795bfbeeb232e82166c901 Signed-off-by: Mike Beaton --- SecurityPkg/Library/Tpm2CommandLib/Tpm2Capability.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/SecurityPkg/Library/Tpm2CommandLib/Tpm2Capability.c b/SecurityPkg/Library/Tpm2CommandLib/Tpm2Capability.c index b15f72cabaa6..5dcac49d5ff9 100644 --- a/SecurityPkg/Library/Tpm2CommandLib/Tpm2Capability.c +++ b/SecurityPkg/Library/Tpm2CommandLib/Tpm2Capability.c @@ -532,13 +532,11 @@ Tpm2GetCapabilitySupportedAndActivePcrs ( EFI_STATUS Status; TPML_PCR_SELECTION Pcrs; UINTN Index; - UINT8 ActivePcrBankCount; // // Get supported PCR // - Status = Tpm2GetCapabilityPcrs (&Pcrs); - ActivePcrBankCount = 0; + Status = Tpm2GetCapabilityPcrs (&Pcrs); // // If error, assume that we have at least SHA-1 (and return the error.) // @@ -546,7 +544,6 @@ Tpm2GetCapabilitySupportedAndActivePcrs ( DEBUG ((DEBUG_ERROR, "GetSupportedAndActivePcrs - Tpm2GetCapabilityPcrs fail!\n")); *TpmHashAlgorithmBitmap = HASH_ALG_SHA1; *ActivePcrBanks = HASH_ALG_SHA1; - ActivePcrBankCount = 1; } // // Otherwise, process the return data to determine what algorithms are supported @@ -563,7 +560,6 @@ Tpm2GetCapabilitySupportedAndActivePcrs ( if (!IsZeroBuffer (Pcrs.pcrSelections[Index].pcrSelect, Pcrs.pcrSelections[Index].sizeofSelect)) { DEBUG ((DEBUG_VERBOSE, "GetSupportedAndActivePcrs - HASH_ALG_SHA1 active.\n")); *ActivePcrBanks |= HASH_ALG_SHA1; - ActivePcrBankCount++; } break; @@ -573,7 +569,6 @@ Tpm2GetCapabilitySupportedAndActivePcrs ( if (!IsZeroBuffer (Pcrs.pcrSelections[Index].pcrSelect, Pcrs.pcrSelections[Index].sizeofSelect)) { DEBUG ((DEBUG_VERBOSE, "GetSupportedAndActivePcrs - HASH_ALG_SHA256 active.\n")); *ActivePcrBanks |= HASH_ALG_SHA256; - ActivePcrBankCount++; } break; @@ -583,7 +578,6 @@ Tpm2GetCapabilitySupportedAndActivePcrs ( if (!IsZeroBuffer (Pcrs.pcrSelections[Index].pcrSelect, Pcrs.pcrSelections[Index].sizeofSelect)) { DEBUG ((DEBUG_VERBOSE, "GetSupportedAndActivePcrs - HASH_ALG_SHA384 active.\n")); *ActivePcrBanks |= HASH_ALG_SHA384; - ActivePcrBankCount++; } break; @@ -593,7 +587,6 @@ Tpm2GetCapabilitySupportedAndActivePcrs ( if (!IsZeroBuffer (Pcrs.pcrSelections[Index].pcrSelect, Pcrs.pcrSelections[Index].sizeofSelect)) { DEBUG ((DEBUG_VERBOSE, "GetSupportedAndActivePcrs - HASH_ALG_SHA512 active.\n")); *ActivePcrBanks |= HASH_ALG_SHA512; - ActivePcrBankCount++; } break; @@ -603,7 +596,6 @@ Tpm2GetCapabilitySupportedAndActivePcrs ( if (!IsZeroBuffer (Pcrs.pcrSelections[Index].pcrSelect, Pcrs.pcrSelections[Index].sizeofSelect)) { DEBUG ((DEBUG_VERBOSE, "GetSupportedAndActivePcrs - HASH_ALG_SM3_256 active.\n")); *ActivePcrBanks |= HASH_ALG_SM3_256; - ActivePcrBankCount++; } break; From 51b58f4cd996ba327f14d67b9b1da20fe7f2a4a4 Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Sat, 8 Nov 2025 15:55:27 +0000 Subject: [PATCH 0776/1172] NetworkPkg: Remove unused variable XCODE5 toolchain finds this, with error: WifiConnectionMgrHiiConfigAccess.c:393:29: error: variable 'AvailableCount' set but not used Fixes: https://github.com/tianocore/edk2/commit/90b24889f9ced53c18b73266d507e45fbd94fab0 Signed-off-by: Mike Beaton --- .../WifiConnectionMgrHiiConfigAccess.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrHiiConfigAccess.c b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrHiiConfigAccess.c index 0ecadbae4616..312bbbfc684f 100644 --- a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrHiiConfigAccess.c +++ b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrHiiConfigAccess.c @@ -390,7 +390,6 @@ WifiMgrRefreshNetworkList ( { EFI_STATUS Status; EFI_TPL OldTpl; - UINT32 AvailableCount; EFI_STRING_ID PortPromptToken; EFI_STRING_ID PortTextToken; EFI_STRING_ID PortHelpToken; @@ -418,7 +417,6 @@ WifiMgrRefreshNetworkList ( } OldTpl = gBS->RaiseTPL (TPL_CALLBACK); - AvailableCount = 0; PortStringSize = sizeof (PortString); ConnectedProfile = NULL; AKMListDisplay = NULL; @@ -433,7 +431,6 @@ WifiMgrRefreshNetworkList ( Private->CurrentNic->CurrentOperateNetwork->IsAvailable) { Profile = Private->CurrentNic->CurrentOperateNetwork; - AvailableCount++; AKMListDisplay = WifiMgrGetStrAKMList (Profile); if (AKMListDisplay == NULL) { @@ -509,8 +506,6 @@ WifiMgrRefreshNetworkList ( } if (Profile->IsAvailable && Profile->CipherSuiteSupported) { - AvailableCount++; - AKMListDisplay = WifiMgrGetStrAKMList (Profile); if (AKMListDisplay == NULL) { Status = EFI_OUT_OF_RESOURCES; @@ -598,8 +593,6 @@ WifiMgrRefreshNetworkList ( } if (Profile->IsAvailable && !Profile->CipherSuiteSupported) { - AvailableCount++; - AKMListDisplay = WifiMgrGetStrAKMList (Profile); if (AKMListDisplay == NULL) { Status = EFI_OUT_OF_RESOURCES; From c75a8d0aaddef555146b8e14af59916d10a95af0 Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Sun, 9 Nov 2025 18:34:14 +0000 Subject: [PATCH 0777/1172] CryptoPkg: Fix non-idiomatic endless loop This was found building ArmVirtQemu using CLANGDWARF with unused-but-set-variable warning enabled. Fixes: https://github.com/tianocore/edk2/commit/40fa5cf2995e9de6c9853945428f407f208be1e1 Signed-off-by: Mike Beaton --- CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptX509.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptX509.c b/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptX509.c index 018bcb739f5e..e1e33145ed6b 100644 --- a/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptX509.c +++ b/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptX509.c @@ -128,7 +128,6 @@ X509ConstructCertificateStackV ( { UINT8 *Cert; UINTN CertSize; - INT32 Index; INT32 Ret; mbedtls_x509_crt *Crt; @@ -148,7 +147,7 @@ X509ConstructCertificateStackV ( *X509Stack = (UINT8 *)Crt; } - for (Index = 0; ; Index++) { + while (TRUE) { // // If Cert is NULL, then it is the end of the list. // From 04cf07b2d301b3e22a4c24491e8b5a76bd186005 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Mon, 3 Nov 2025 16:25:28 -0800 Subject: [PATCH 0778/1172] OvmfPkg: MmPlatformHobProducerLibOvmf: Fixing misplaced PCDs The original implementation misplaced the base addresses and lengths for their corresponding resource descriptor HOBs. It was functional because the size reported was large enough to cover all necessary usages. This change fixed the misplacement and reports the entire FD flash region when launching the MM foundation. Signed-off-by: Kun Qin --- .../MmPlatformHobProducerLibOvmf.c | 8 ++++---- .../MmPlatformHobProducerLibOvmf.inf | 6 ++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/OvmfPkg/Library/MmPlatformHobProducerLibOvmf/MmPlatformHobProducerLibOvmf.c b/OvmfPkg/Library/MmPlatformHobProducerLibOvmf/MmPlatformHobProducerLibOvmf.c index 16197c3bf55f..525857a98584 100644 --- a/OvmfPkg/Library/MmPlatformHobProducerLibOvmf/MmPlatformHobProducerLibOvmf.c +++ b/OvmfPkg/Library/MmPlatformHobProducerLibOvmf/MmPlatformHobProducerLibOvmf.c @@ -103,14 +103,14 @@ CreateMmPlatformHob ( EFI_RESOURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | EFI_RESOURCE_ATTRIBUTE_TESTED; - Hob.PhysicalStart = PcdGet32 (PcdOvmfFlashNvStorageVariableBase); + Hob.PhysicalStart = PcdGet32 (PcdCpuLocalApicBaseAddress); Hob.ResourceLength = SIZE_1MB; ZeroMem (&(Hob.Owner), sizeof (EFI_GUID)); CopyMem ((UINT8 *)Buffer + Size, &Hob, sizeof (EFI_HOB_RESOURCE_DESCRIPTOR)); Size += sizeof (EFI_HOB_RESOURCE_DESCRIPTOR); NumberOfHobResourceDescriptor++; - // Variable Storage + // flash device Hob.Header.HobType = EFI_HOB_TYPE_RESOURCE_DESCRIPTOR; Hob.Header.HobLength = (UINT16)sizeof (EFI_HOB_RESOURCE_DESCRIPTOR); Hob.ResourceType = EFI_RESOURCE_MEMORY_MAPPED_IO; @@ -118,8 +118,8 @@ CreateMmPlatformHob ( EFI_RESOURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | EFI_RESOURCE_ATTRIBUTE_TESTED; - Hob.PhysicalStart = PcdGet32 (PcdCpuLocalApicBaseAddress); - Hob.ResourceLength = PcdGet32 (PcdFlashNvStorageVariableSize); + Hob.PhysicalStart = PcdGet32 (PcdOvmfFdBaseAddress); + Hob.ResourceLength = PcdGet32 (PcdOvmfFirmwareFdSize); ZeroMem (&(Hob.Owner), sizeof (EFI_GUID)); CopyMem ((UINT8 *)Buffer + Size, &Hob, sizeof (EFI_HOB_RESOURCE_DESCRIPTOR)); Size += sizeof (EFI_HOB_RESOURCE_DESCRIPTOR); diff --git a/OvmfPkg/Library/MmPlatformHobProducerLibOvmf/MmPlatformHobProducerLibOvmf.inf b/OvmfPkg/Library/MmPlatformHobProducerLibOvmf/MmPlatformHobProducerLibOvmf.inf index a86010b63d72..b5412a676f8a 100644 --- a/OvmfPkg/Library/MmPlatformHobProducerLibOvmf/MmPlatformHobProducerLibOvmf.inf +++ b/OvmfPkg/Library/MmPlatformHobProducerLibOvmf/MmPlatformHobProducerLibOvmf.inf @@ -42,10 +42,8 @@ [Pcd] gUefiCpuPkgTokenSpaceGuid.PcdCpuLocalApicBaseAddress - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageVariableBase - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize - gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask - gEfiMdePkgTokenSpaceGuid.PcdConfidentialComputingGuestAttr + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFdBaseAddress + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize [Depex] gEfiPeiMmAccessPpiGuid From 45b1f5a87b2a42eea819c7225e8bc34e34de6b86 Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Wed, 12 Nov 2025 21:41:26 +0000 Subject: [PATCH 0779/1172] OvmfPkg/Bhyve: Convert one .sh file from CRLF to LF with dos2unix This matches the format of the remaining 8 .sh files in EDK 2, two of which are also in OvmfPkg, and matches what makes sense as .sh files are to be consumed in *nix (including this one which has a hashbang for /bin/sh). Signed-off-by: Mike Beaton --- OvmfPkg/Bhyve/BhyveRfbDxe/VbeShim.sh | 160 +++++++++++++-------------- 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/OvmfPkg/Bhyve/BhyveRfbDxe/VbeShim.sh b/OvmfPkg/Bhyve/BhyveRfbDxe/VbeShim.sh index 358b56833863..5d65053582f9 100644 --- a/OvmfPkg/Bhyve/BhyveRfbDxe/VbeShim.sh +++ b/OvmfPkg/Bhyve/BhyveRfbDxe/VbeShim.sh @@ -1,80 +1,80 @@ -#!/bin/sh -### -# @file -# Shell script to assemble and dump the fake Int10h handler from NASM source to -# a C array. -# -# Copyright (C) 2020, Rebecca Cran -# Copyright (C) 2014, Red Hat, Inc. -# Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.
    -# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -### - -set -e -u - -STEM=$(dirname -- "$0")/$(basename -- "$0" .sh) - -# -# Install exit handler -- remove temporary files. -# -exit_handler() -{ - rm -f -- "$STEM".bin "$STEM".disasm "$STEM".offsets "$STEM".insns \ - "$STEM".bytes -} -trap exit_handler EXIT - -# -# Assemble the source file. -# -nasm -o "$STEM".bin -- "$STEM".asm - -# -# Disassemble it, in order to get a binary dump associated with the source. -# (ndisasm doesn't recognize the "--" end-of-options delimiter.) -# -ndisasm "$STEM".bin >"$STEM".disasm - -# -# Create three files, each with one column of the disassembly. -# -# The first column contains the offsets, and it starts the comment. -# -cut -c 1-8 -- "$STEM".disasm \ -| sed -e 's,^, /* ,' >"$STEM".offsets - -# -# The second column contains the assembly-language instructions, and it closes -# the comment. We first pad it to 30 characters. -# -cut -c 29- -- "$STEM".disasm \ -| sed -e 's,$, ,' \ - -e 's,^\(.\{30\}\).*$,\1 */,' >"$STEM".insns - -# -# The third column contains the bytes corresponding to the instruction, -# represented as C integer constants. First strip trailing whitespace from the -# middle column of the input disassembly, then process pairs of nibbles. -# -cut -c 11-28 -- "$STEM".disasm \ -| sed -e 's, \+$,,' -e 's/\(..\)/ 0x\1,/g' | sed 's/0x ,//g' >"$STEM".bytes - -# -# Write the output file, recombining the columns. The output should have CRLF -# line endings. -# -{ - printf '//\n' - printf '// THIS FILE WAS GENERATED BY "%s". DO NOT EDIT.\n' \ - "$(basename -- "$0")" - printf '//\n' - printf '#ifndef _VBE_SHIM_H_\n' - printf '#define _VBE_SHIM_H_\n' - printf 'STATIC CONST UINT8 mVbeShim[] = {\n' - paste -d ' ' -- "$STEM".offsets "$STEM".insns "$STEM".bytes - printf '};\n' - printf '#endif\n' -} \ -| unix2dos >"$STEM".h +#!/bin/sh +### +# @file +# Shell script to assemble and dump the fake Int10h handler from NASM source to +# a C array. +# +# Copyright (C) 2020, Rebecca Cran +# Copyright (C) 2014, Red Hat, Inc. +# Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.
    +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +### + +set -e -u + +STEM=$(dirname -- "$0")/$(basename -- "$0" .sh) + +# +# Install exit handler -- remove temporary files. +# +exit_handler() +{ + rm -f -- "$STEM".bin "$STEM".disasm "$STEM".offsets "$STEM".insns \ + "$STEM".bytes +} +trap exit_handler EXIT + +# +# Assemble the source file. +# +nasm -o "$STEM".bin -- "$STEM".asm + +# +# Disassemble it, in order to get a binary dump associated with the source. +# (ndisasm doesn't recognize the "--" end-of-options delimiter.) +# +ndisasm "$STEM".bin >"$STEM".disasm + +# +# Create three files, each with one column of the disassembly. +# +# The first column contains the offsets, and it starts the comment. +# +cut -c 1-8 -- "$STEM".disasm \ +| sed -e 's,^, /* ,' >"$STEM".offsets + +# +# The second column contains the assembly-language instructions, and it closes +# the comment. We first pad it to 30 characters. +# +cut -c 29- -- "$STEM".disasm \ +| sed -e 's,$, ,' \ + -e 's,^\(.\{30\}\).*$,\1 */,' >"$STEM".insns + +# +# The third column contains the bytes corresponding to the instruction, +# represented as C integer constants. First strip trailing whitespace from the +# middle column of the input disassembly, then process pairs of nibbles. +# +cut -c 11-28 -- "$STEM".disasm \ +| sed -e 's, \+$,,' -e 's/\(..\)/ 0x\1,/g' | sed 's/0x ,//g' >"$STEM".bytes + +# +# Write the output file, recombining the columns. The output should have CRLF +# line endings. +# +{ + printf '//\n' + printf '// THIS FILE WAS GENERATED BY "%s". DO NOT EDIT.\n' \ + "$(basename -- "$0")" + printf '//\n' + printf '#ifndef _VBE_SHIM_H_\n' + printf '#define _VBE_SHIM_H_\n' + printf 'STATIC CONST UINT8 mVbeShim[] = {\n' + paste -d ' ' -- "$STEM".offsets "$STEM".insns "$STEM".bytes + printf '};\n' + printf '#endif\n' +} \ +| unix2dos >"$STEM".h From 6bb2423a6f23fad3635278f55dab95adea371eee Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Sat, 8 Nov 2025 14:22:15 +0000 Subject: [PATCH 0780/1172] MdeModulePkg/BrotliCustomDecompressLib: Correct BrotliDecompress DestSize should have been received and passed as a pointer in order to successfully pass the output value. The existence of this error was spotted by XCODE5 toolchain, which gave: BrotliDecompress.c:85:18: error: parameter 'DestSize' set but not used As discussed in https://github.com/tianocore/edk2/pull/11729, since the method is in fact internal and only called in one place, and since the DestSize return value is in fact unused, instead of fixing the parameter and method call we instead remove the parameter, also marking the method STATIC and renaming it to ...Internal. Signed-off-by: Mike Beaton --- .../BrotliCustomDecompressLib/BrotliDecompress.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/MdeModulePkg/Library/BrotliCustomDecompressLib/BrotliDecompress.c b/MdeModulePkg/Library/BrotliCustomDecompressLib/BrotliDecompress.c index 3cb31ab98467..707177233fb5 100644 --- a/MdeModulePkg/Library/BrotliCustomDecompressLib/BrotliDecompress.c +++ b/MdeModulePkg/Library/BrotliCustomDecompressLib/BrotliDecompress.c @@ -68,7 +68,6 @@ BrFree ( @param Source The source buffer containing the compressed data. @param SourceSize The size of source buffer. @param Destination The destination buffer to store the decompressed data. - @param DestSize The destination buffer size. @param BuffInfo The pointer to the BROTLI_BUFF instance. @retval EFI_SUCCESS Decompression completed successfully, and @@ -77,12 +76,12 @@ BrFree ( The source buffer specified by Source is corrupted (not in a valid compressed format). **/ +STATIC EFI_STATUS -BrotliDecompress ( +BrotliDecompressInternal ( IN CONST VOID *Source, IN UINTN SourceSize, IN OUT VOID *Destination, - IN OUT UINTN DestSize, IN VOID *BuffInfo ) { @@ -157,8 +156,6 @@ BrotliDecompress ( CopyMem (Temp, Output, (size_t)(NextOut - Output)); } - DestSize = TotalOut; - BrFree (BuffInfo, Input); BrFree (BuffInfo, Output); BrotliDecoderDestroyInstance (BroState); @@ -276,7 +273,6 @@ BrotliUefiDecompress ( IN OUT VOID *Scratch ) { - UINTN DestSize = 0; EFI_STATUS Status; BROTLI_BUFF BroBuff; UINT64 GetSize; @@ -288,11 +284,10 @@ BrotliUefiDecompress ( BroBuff.Buff = Scratch; BroBuff.BuffSize = (UINTN)GetSize; - Status = BrotliDecompress ( + Status = BrotliDecompressInternal ( (VOID *)((UINT8 *)Source + BROTLI_SCRATCH_MAX), SourceSize - BROTLI_SCRATCH_MAX, Destination, - DestSize, (VOID *)(&BroBuff) ); From f7bbcf8bcf375676cc9e7189603b5ec83a4a12b1 Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Wed, 5 Nov 2025 22:11:48 +0000 Subject: [PATCH 0781/1172] OvmfPkg: Update README instructions for obtaining E3522X2.EFI The oldest available download at the previous URL no longer contains the driver. The oldest available download at the new URL still does. Since there is a jump between the oldest and the next oldest versions at the new URL, it seems plausible that Intel are intentionally keeping the older version alive. Signed-off-by: Mike Beaton --- OvmfPkg/README | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/OvmfPkg/README b/OvmfPkg/README index a2f4ceb567b3..4db2367facc0 100644 --- a/OvmfPkg/README +++ b/OvmfPkg/README @@ -277,16 +277,14 @@ longer.) basic virtio-net driver, located in OvmfPkg/VirtioNetDxe. * Also independently of the iPXE NIC drivers, Intel's proprietary E1000 NIC - driver (from the BootUtil distribution) can be embedded in the OVMF image at - build time: + driver can be embedded in the OVMF image at build time: - - Download BootUtil: + - Download Intel Ethernet Adapter Driver Pack: - Navigate to - https://downloadcenter.intel.com/download/19186/Ethernet-Intel-Ethernet-Connections-Boot-Utility-Preboot-Images-and-EFI-Drivers - - Click the download link for "PREBOOT.EXE". + https://www.intel.com/content/www/us/en/download/15084/intel-ethernet-adapter-complete-driver-pack.html + - Select version 23.5.2 and click the download link for "23_5_2.zip". - Accept the Intel Software License Agreement that appears. - - Unzip "PREBOOT.EXE" into a separate directory (this works with the - "unzip" utility on platforms different from Windows as well). + - Unzip "23_5_2.zip" into a separate directory. - Copy the "APPS/EFI/EFIx64/E3522X2.EFI" driver binary to "Intel3.5/EFIX64/E3522X2.EFI" in your WORKSPACE. @@ -298,11 +296,11 @@ longer.) * When a matching iPXE driver is configured for a NIC as described above, it takes priority over other drivers that could possibly drive the card too: - | e1000 ne2k_pci pcnet rtl8139 virtio-net-pci - ---------------------+------------------------------------------------ - iPXE | x x x x x - VirtioNetDxe | x - Intel BootUtil (X64) | x + | e1000 ne2k_pci pcnet rtl8139 virtio-net-pci + ------------------------+------------------------------------------------ + iPXE | x x x x x + VirtioNetDxe | x + Intel E3522X2.EFI (X64) | x === HTTPS Boot === From a2e0800d54d8130bb924d8a10dcc86069457db15 Mon Sep 17 00:00:00 2001 From: Revathy V Date: Fri, 1 Aug 2025 19:05:00 +0530 Subject: [PATCH 0782/1172] MdeModulePkg/Scsi:Change Index and MaxRetry from UINT8 to UINTN Change Index and MaxRetry to UINTN in ScsiDiskInquiryDevice(). Signed-off-by: Revathy --- MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c b/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c index 5cff1d3eefe2..8f108a51e4eb 100644 --- a/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c +++ b/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c @@ -2606,8 +2606,8 @@ ScsiDiskInquiryDevice ( EFI_SCSI_SENSE_DATA *SenseDataArray; UINTN NumberOfSenseKeys; EFI_STATUS Status; - UINT8 MaxRetry; - UINT8 Index; + UINTN MaxRetry; + UINTN Index; EFI_SCSI_SUPPORTED_VPD_PAGES_VPD_PAGE *SupportedVpdPages; EFI_SCSI_BLOCK_LIMITS_VPD_PAGE *BlockLimits; UINTN PageLength; From 8e90e2cbcfd2e5288b31dff097bd7d6f03515486 Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Sat, 8 Nov 2025 08:02:32 +0000 Subject: [PATCH 0783/1172] SecurityPkg: Update libspdm to 3.7.0 https://github.com/DMTF/libspdm/commit/0f6c6a3e800f487242b973b5858c534186a7db05 fixes incorrectly typed return values in libspdm_hmac_new. Without this commit XCODE5 refuses to build SecurityPkg, with multiple errors corresponding to the lines fixed above, each of the form: libspdm_crypt_hmac.c:31:16: error: expression which evaluates to zero treated as a null pointer constant of type 'void *' I have updated libspdm to the minimum whole build number which includes the required commit, though higher releases than 3.7.0, up to 3.8.1, are available. Signed-off-by: Mike Beaton --- SecurityPkg/DeviceSecurity/SpdmLib/libspdm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SecurityPkg/DeviceSecurity/SpdmLib/libspdm b/SecurityPkg/DeviceSecurity/SpdmLib/libspdm index 98ef964e1e9a..1be116c7b771 160000 --- a/SecurityPkg/DeviceSecurity/SpdmLib/libspdm +++ b/SecurityPkg/DeviceSecurity/SpdmLib/libspdm @@ -1 +1 @@ -Subproject commit 98ef964e1e9a0c39c7efb67143d3a13a819432e0 +Subproject commit 1be116c7b7713fa9003e1bd53b53a34758549eb9 From 6c81acabe25af676c2fb4ce1011ae1f347106d39 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Tue, 14 Oct 2025 17:22:18 -0700 Subject: [PATCH 0784/1172] UefiPayloadPkg: PayloadEntryHelperLib: Adding new helper library This is a newly added helper library to help providing utilities common to UefiPayloadPkg. This change will pave ways to separating standard services such as "MemoryAllocation" into its own library classes. Signed-off-by: Kun Qin --- .../Include/Library/PayloadEntryHelperLib.h | 31 ++++++++ .../PayloadEntryHelperLib.c | 75 +++++++++++++++++++ .../PayloadEntryHelperLib.inf | 33 ++++++++ UefiPayloadPkg/UefiPayloadPkg.dec | 2 + UefiPayloadPkg/UefiPayloadPkg.dsc | 1 + 5 files changed, 142 insertions(+) create mode 100644 UefiPayloadPkg/Include/Library/PayloadEntryHelperLib.h create mode 100644 UefiPayloadPkg/Library/PayloadEntryHelperLib/PayloadEntryHelperLib.c create mode 100644 UefiPayloadPkg/Library/PayloadEntryHelperLib/PayloadEntryHelperLib.inf diff --git a/UefiPayloadPkg/Include/Library/PayloadEntryHelperLib.h b/UefiPayloadPkg/Include/Library/PayloadEntryHelperLib.h new file mode 100644 index 000000000000..d8d6a6532655 --- /dev/null +++ b/UefiPayloadPkg/Include/Library/PayloadEntryHelperLib.h @@ -0,0 +1,31 @@ +/** @file + + Copyright (c) 2010, Apple Inc. All rights reserved.
    + Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.
    + Copyright (c) Microsoft Corporation. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef PAYLOAD_ENTRY_HELPER_LIB_H_ +#define PAYLOAD_ENTRY_HELPER_LIB_H_ + +/** + Add a new HOB to the HOB List. + + @param HobType Type of the new HOB. + @param HobLength Length of the new HOB to allocate. + + @return NULL if there is no space to create a hob. + @return The address point to the new created hob. + +**/ +VOID * +EFIAPI +CreateHob ( + IN UINT16 HobType, + IN UINT16 HobLength + ); + +#endif // PAYLOAD_ENTRY_HELPER_LIB_H_ diff --git a/UefiPayloadPkg/Library/PayloadEntryHelperLib/PayloadEntryHelperLib.c b/UefiPayloadPkg/Library/PayloadEntryHelperLib/PayloadEntryHelperLib.c new file mode 100644 index 000000000000..527eb9f5a5c2 --- /dev/null +++ b/UefiPayloadPkg/Library/PayloadEntryHelperLib/PayloadEntryHelperLib.c @@ -0,0 +1,75 @@ +/** @file + + Copyright (c) 2010, Apple Inc. All rights reserved.
    + Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.
    + Copyright (c) Microsoft Corporation. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#include +#include +#include + +/** + Add a new HOB to the HOB List. + + @param HobType Type of the new HOB. + @param HobLength Length of the new HOB to allocate. + + @return NULL if there is no space to create a hob. + @return The address point to the new created hob. + +**/ +VOID * +EFIAPI +CreateHob ( + IN UINT16 HobType, + IN UINT16 HobLength + ) +{ + EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob; + EFI_HOB_GENERIC_HEADER *HobEnd; + EFI_PHYSICAL_ADDRESS FreeMemory; + VOID *Hob; + + HandOffHob = GetHobList (); + if (HandOffHob == NULL) { + ASSERT (HandOffHob != NULL); + return NULL; + } + + // + // Check Length to avoid data overflow. + // + if (HobLength > MAX_UINT16 - 0x7) { + return NULL; + } + + HobLength = (UINT16)((HobLength + 0x7) & (~0x7)); + + FreeMemory = HandOffHob->EfiFreeMemoryTop - HandOffHob->EfiFreeMemoryBottom; + + if (FreeMemory < HobLength) { + return NULL; + } + + Hob = (VOID *)(UINTN)HandOffHob->EfiEndOfHobList; + ((EFI_HOB_GENERIC_HEADER *)Hob)->HobType = HobType; + ((EFI_HOB_GENERIC_HEADER *)Hob)->HobLength = HobLength; + ((EFI_HOB_GENERIC_HEADER *)Hob)->Reserved = 0; + + HobEnd = (EFI_HOB_GENERIC_HEADER *)((UINTN)Hob + HobLength); + HandOffHob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS)(UINTN)HobEnd; + + HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST; + HobEnd->HobLength = sizeof (EFI_HOB_GENERIC_HEADER); + HobEnd->Reserved = 0; + HobEnd++; + HandOffHob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS)(UINTN)HobEnd; + + return Hob; +} diff --git a/UefiPayloadPkg/Library/PayloadEntryHelperLib/PayloadEntryHelperLib.inf b/UefiPayloadPkg/Library/PayloadEntryHelperLib/PayloadEntryHelperLib.inf new file mode 100644 index 000000000000..4db0922e6e4a --- /dev/null +++ b/UefiPayloadPkg/Library/PayloadEntryHelperLib/PayloadEntryHelperLib.inf @@ -0,0 +1,33 @@ +## @file +# Provides Payload Entry Helper Library. +# +# Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.
    +# Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.
    +# Copyright (c) Microsoft Corporation. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PayloadEntryHelperLib + FILE_GUID = DBBFC366-76C2-4364-8CF4-D09E61733625 + MODULE_TYPE = SEC + VERSION_STRING = 1.0 + LIBRARY_CLASS = PayloadEntryHelperLib + +# +# VALID_ARCHITECTURES = IA32 X64 AARCH64 +# + +[Sources.common] + PayloadEntryHelperLib.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + UefiPayloadPkg/UefiPayloadPkg.dec + +[LibraryClasses] + DebugLib + HobLib diff --git a/UefiPayloadPkg/UefiPayloadPkg.dec b/UefiPayloadPkg/UefiPayloadPkg.dec index 51ddcc58e97a..c333b3302d20 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dec +++ b/UefiPayloadPkg/UefiPayloadPkg.dec @@ -17,6 +17,8 @@ [Includes] Include +[LibraryClasses] + PayloadEntryHelperLib|Include/Library/PayloadEntryHelperLib.h [Guids] # diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index db4875e7c4cd..5c1101250856 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -263,6 +263,7 @@ RngLib|MdePkg/Library/BaseRngLib/BaseRngLib.inf HobLib|UefiPayloadPkg/Library/DxeHobLib/DxeHobLib.inf CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserNullLib/CustomFdtNodeParserNullLib.inf + PayloadEntryHelperLib|UefiPayloadPkg/Library/PayloadEntryHelperLib/PayloadEntryHelperLib.inf # # UEFI & PI From 0240fdaaee4800aaa238021b43736c7e7bcb0644 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Tue, 14 Oct 2025 17:30:10 -0700 Subject: [PATCH 0785/1172] UefiPayloadPkg: PayloadEntryHobLib: Move HobLib to use helper interface This change updates the HobLib for UefiPayloadPkg to use the newly introduced hob creation interface. It also pave ways to separate the memory allocation logic into its designated library classes. Signed-off-by: Kun Qin --- .../Library/PayloadEntryHobLib/Hob.c | 58 +------------------ .../Library/PayloadEntryHobLib/HobLib.inf | 2 + 2 files changed, 3 insertions(+), 57 deletions(-) diff --git a/UefiPayloadPkg/Library/PayloadEntryHobLib/Hob.c b/UefiPayloadPkg/Library/PayloadEntryHobLib/Hob.c index 0e3bf29c8278..6b3d78efe7cb 100644 --- a/UefiPayloadPkg/Library/PayloadEntryHobLib/Hob.c +++ b/UefiPayloadPkg/Library/PayloadEntryHobLib/Hob.c @@ -14,6 +14,7 @@ #include #include #include +#include VOID *mHobList; @@ -85,63 +86,6 @@ HobConstructor ( return Hob; } -/** - Add a new HOB to the HOB List. - - @param HobType Type of the new HOB. - @param HobLength Length of the new HOB to allocate. - - @return NULL if there is no space to create a hob. - @return The address point to the new created hob. - -**/ -VOID * -EFIAPI -CreateHob ( - IN UINT16 HobType, - IN UINT16 HobLength - ) -{ - EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob; - EFI_HOB_GENERIC_HEADER *HobEnd; - EFI_PHYSICAL_ADDRESS FreeMemory; - VOID *Hob; - - HandOffHob = GetHobList (); - ASSERT (HandOffHob != NULL); - - // - // Check Length to avoid data overflow. - // - if (HobLength > MAX_UINT16 - 0x7) { - return NULL; - } - - HobLength = (UINT16)((HobLength + 0x7) & (~0x7)); - - FreeMemory = HandOffHob->EfiFreeMemoryTop - HandOffHob->EfiFreeMemoryBottom; - - if (FreeMemory < HobLength) { - return NULL; - } - - Hob = (VOID *)(UINTN)HandOffHob->EfiEndOfHobList; - ((EFI_HOB_GENERIC_HEADER *)Hob)->HobType = HobType; - ((EFI_HOB_GENERIC_HEADER *)Hob)->HobLength = HobLength; - ((EFI_HOB_GENERIC_HEADER *)Hob)->Reserved = 0; - - HobEnd = (EFI_HOB_GENERIC_HEADER *)((UINTN)Hob + HobLength); - HandOffHob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS)(UINTN)HobEnd; - - HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST; - HobEnd->HobLength = sizeof (EFI_HOB_GENERIC_HEADER); - HobEnd->Reserved = 0; - HobEnd++; - HandOffHob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS)(UINTN)HobEnd; - - return Hob; -} - /** Builds a HOB that describes a chunk of system memory. diff --git a/UefiPayloadPkg/Library/PayloadEntryHobLib/HobLib.inf b/UefiPayloadPkg/Library/PayloadEntryHobLib/HobLib.inf index 496a5c8319da..9d9669567adb 100644 --- a/UefiPayloadPkg/Library/PayloadEntryHobLib/HobLib.inf +++ b/UefiPayloadPkg/Library/PayloadEntryHobLib/HobLib.inf @@ -26,11 +26,13 @@ [Packages] MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec + UefiPayloadPkg/UefiPayloadPkg.dec [LibraryClasses] BaseLib BaseMemoryLib DebugLib + PayloadEntryHelperLib [Guids] gEfiHobMemoryAllocModuleGuid From 5f097636cc36790240bed4cf44bd7f6d07257bb2 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Tue, 14 Oct 2025 17:33:51 -0700 Subject: [PATCH 0786/1172] UefiPayloadPkg: PayloadEntryMemoryAllocationLib: Create allocation library This change creates a new library instance for UefiPayloadPkg. The implementation is inherited from UefiPayloadEntry. It will allow the UefiPayloadEntry to consume memory allocation logic from this instance instead of its own carried copy. Signed-off-by: Kun Qin --- .../MemoryAllocation.c | 253 ++++++++++++++++++ .../PayloadEntryMemoryAllocationLib.inf | 36 +++ UefiPayloadPkg/UefiPayloadPkg.dsc | 1 + 3 files changed, 290 insertions(+) create mode 100644 UefiPayloadPkg/Library/PayloadEntryMemoryAllocationLib/MemoryAllocation.c create mode 100644 UefiPayloadPkg/Library/PayloadEntryMemoryAllocationLib/PayloadEntryMemoryAllocationLib.inf diff --git a/UefiPayloadPkg/Library/PayloadEntryMemoryAllocationLib/MemoryAllocation.c b/UefiPayloadPkg/Library/PayloadEntryMemoryAllocationLib/MemoryAllocation.c new file mode 100644 index 000000000000..5a56f62a68ee --- /dev/null +++ b/UefiPayloadPkg/Library/PayloadEntryMemoryAllocationLib/MemoryAllocation.c @@ -0,0 +1,253 @@ +/** @file + + + Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
    + Copyright (c) 2020, Intel Corporation. All rights reserved.
    + Copyright (c) Microsoft Corporation. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include + +#include +#include +#include +#include +#include + +/** + Allocates one or more pages of type MemoryType. + + Allocates the number of pages of MemoryType and returns a pointer to the + allocated buffer. The buffer returned is aligned on a 4KB boundary. + If Pages is 0, then NULL is returned. + If there is not enough memory availble to satisfy the request, then NULL + is returned. + + @param Pages The number of 4 KB pages to allocate. + @param MemoryType The MemoryType + @return A pointer to the allocated buffer or NULL if allocation fails. +**/ +STATIC +VOID * +EFIAPI +InternalAllocatePages ( + IN UINTN Pages, + IN EFI_MEMORY_TYPE MemoryType + ) +{ + EFI_PEI_HOB_POINTERS Hob; + EFI_PHYSICAL_ADDRESS Offset; + EFI_HOB_HANDOFF_INFO_TABLE *HobTable; + + Hob.Raw = GetHobList (); + HobTable = Hob.HandoffInformationTable; + + if (Pages == 0) { + return NULL; + } + + // Make sure allocation address is page alligned. + Offset = HobTable->EfiFreeMemoryTop & EFI_PAGE_MASK; + if (Offset != 0) { + HobTable->EfiFreeMemoryTop -= Offset; + } + + // + // Check available memory for the allocation + // + if (HobTable->EfiFreeMemoryTop - ((Pages * EFI_PAGE_SIZE) + sizeof (EFI_HOB_MEMORY_ALLOCATION)) < HobTable->EfiFreeMemoryBottom) { + return NULL; + } + + HobTable->EfiFreeMemoryTop -= Pages * EFI_PAGE_SIZE; + BuildMemoryAllocationHob (HobTable->EfiFreeMemoryTop, Pages * EFI_PAGE_SIZE, MemoryType); + + return (VOID *)(UINTN)HobTable->EfiFreeMemoryTop; +} + +/** + Allocates one or more pages of type EfiBootServicesData. + + Allocates the number of pages of MemoryType and returns a pointer to the + allocated buffer. The buffer returned is aligned on a 4KB boundary. + If Pages is 0, then NULL is returned. + If there is not enough memory availble to satisfy the request, then NULL + is returned. + + @param Pages The number of 4 KB pages to allocate. + @return A pointer to the allocated buffer or NULL if allocation fails. +**/ +VOID * +EFIAPI +AllocatePages ( + IN UINTN Pages + ) +{ + return InternalAllocatePages (Pages, EfiBootServicesData); +} + +/** + Allocates one or more 4KB pages of type EfiReservedMemoryType. + + Allocates the number of 4KB pages of type EfiReservedMemoryType and returns a pointer to the + allocated buffer. The buffer returned is aligned on a 4KB boundary. If Pages is 0, then NULL + is returned. If there is not enough memory remaining to satisfy the request, then NULL is + returned. + + @param Pages The number of 4 KB pages to allocate. + + @return A pointer to the allocated buffer or NULL if allocation fails. + +**/ +VOID * +EFIAPI +AllocateReservedPages ( + IN UINTN Pages + ) +{ + return InternalAllocatePages (Pages, EfiReservedMemoryType); +} + +/** + Frees one or more 4KB pages that were previously allocated with one of the page allocation + functions in the Memory Allocation Library. + + Frees the number of 4KB pages specified by Pages from the buffer specified by Buffer. Buffer + must have been allocated on a previous call to the page allocation services of the Memory + Allocation Library. If it is not possible to free allocated pages, then this function will + perform no actions. + + If Buffer was not allocated with a page allocation function in the Memory Allocation Library, + then ASSERT(). + If Pages is zero, then ASSERT(). + + @param Buffer Pointer to the buffer of pages to free. + @param Pages The number of 4 KB pages to free. + +**/ +VOID +EFIAPI +FreePages ( + IN VOID *Buffer, + IN UINTN Pages + ) +{ +} + +/** + Allocates one or more pages of type EfiBootServicesData at a specified alignment. + + Allocates the number of pages specified by Pages of type EfiBootServicesData with an + alignment specified by Alignment. + If Pages is 0, then NULL is returned. + If Alignment is not a power of two and Alignment is not zero, then ASSERT(). + If there is no enough memory at the specified alignment available to satisfy the + request, then NULL is returned. + + @param Pages The number of 4 KB pages to allocate. + @param Alignment The requested alignment of the allocation. + + @return A pointer to the allocated buffer or NULL if allocation fails. +**/ +VOID * +EFIAPI +AllocateAlignedPages ( + IN UINTN Pages, + IN UINTN Alignment + ) +{ + VOID *Memory; + UINTN AlignmentMask; + + // + // Alignment must be a power of two or zero. + // + ASSERT ((Alignment & (Alignment - 1)) == 0); + + if (Pages == 0) { + return NULL; + } + + // + // Check overflow. + // + ASSERT (Pages <= (MAX_ADDRESS - EFI_SIZE_TO_PAGES (Alignment))); + + Memory = (VOID *)(UINTN)AllocatePages (Pages + EFI_SIZE_TO_PAGES (Alignment)); + if (Memory == NULL) { + return NULL; + } + + if (Alignment == 0) { + AlignmentMask = Alignment; + } else { + AlignmentMask = Alignment - 1; + } + + return (VOID *)(UINTN)(((UINTN)Memory + AlignmentMask) & ~AlignmentMask); +} + +/** + Allocates a buffer of type EfiBootServicesData. + + Allocates the number bytes specified by AllocationSize of type EfiBootServicesData and returns a + pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is + returned. If there is not enough memory remaining to satisfy the request, then NULL is returned. + + @param AllocationSize The number of bytes to allocate. + + @return A pointer to the allocated buffer or NULL if allocation fails. + +**/ +VOID * +EFIAPI +AllocatePool ( + IN UINTN AllocationSize + ) +{ + EFI_HOB_MEMORY_POOL *Hob; + + if (AllocationSize > 0x4000) { + // Please use AllocatePages for big allocations + return NULL; + } + + Hob = (EFI_HOB_MEMORY_POOL *)CreateHob (EFI_HOB_TYPE_MEMORY_POOL, (UINT16)(sizeof (EFI_HOB_MEMORY_POOL) + AllocationSize)); + return (VOID *)(Hob + 1); +} + +/** + Allocates and zeros a buffer of type EfiBootServicesData. + + Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, clears the + buffer with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a + valid buffer of 0 size is returned. If there is not enough memory remaining to satisfy the + request, then NULL is returned. + + @param AllocationSize The number of bytes to allocate and zero. + + @return A pointer to the allocated buffer or NULL if allocation fails. + +**/ +VOID * +EFIAPI +AllocateZeroPool ( + IN UINTN AllocationSize + ) +{ + VOID *Buffer; + + Buffer = AllocatePool (AllocationSize); + if (Buffer == NULL) { + return NULL; + } + + ZeroMem (Buffer, AllocationSize); + + return Buffer; +} diff --git a/UefiPayloadPkg/Library/PayloadEntryMemoryAllocationLib/PayloadEntryMemoryAllocationLib.inf b/UefiPayloadPkg/Library/PayloadEntryMemoryAllocationLib/PayloadEntryMemoryAllocationLib.inf new file mode 100644 index 000000000000..d4a96acac516 --- /dev/null +++ b/UefiPayloadPkg/Library/PayloadEntryMemoryAllocationLib/PayloadEntryMemoryAllocationLib.inf @@ -0,0 +1,36 @@ +## @file +# Provides Payload Entry based Memory Allocation Library. +# +# Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.
    +# Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.
    +# Copyright (c) Microsoft Corporation. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = MemoryAllocationLib + FILE_GUID = F883AE99-22AB-4820-A4C3-45F8B91F1E38 + MODULE_TYPE = SEC + VERSION_STRING = 1.0 + LIBRARY_CLASS = MemoryAllocationLib + +# +# VALID_ARCHITECTURES = IA32 X64 EBC +# + +[Sources.common] + MemoryAllocation.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + UefiPayloadPkg/UefiPayloadPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + HobLib + PayloadEntryHelperLib diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index 5c1101250856..fa18876345ea 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -264,6 +264,7 @@ HobLib|UefiPayloadPkg/Library/DxeHobLib/DxeHobLib.inf CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserNullLib/CustomFdtNodeParserNullLib.inf PayloadEntryHelperLib|UefiPayloadPkg/Library/PayloadEntryHelperLib/PayloadEntryHelperLib.inf + MemoryAllocationLib|UefiPayloadPkg/Library/PayloadEntryMemoryAllocationLib/PayloadEntryMemoryAllocationLib.inf # # UEFI & PI From 83f41e81fc79c64a11b632e6bedb240a3022db68 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Tue, 14 Oct 2025 17:35:12 -0700 Subject: [PATCH 0787/1172] UefiPayloadPkg: UefiPayloadEntry: Consume designated MemoryAllocationLib This change updates the UefiPayloadEntry modules to consume the memory allocation logic through the MemoryAllocationLib. This will allow other library classes to consume the same logic through standard defined memory allocation routines. Signed-off-by: Kun Qin --- .../FitUniversalPayloadEntry.c | 2 +- .../FitUniversalPayloadEntry.inf | 2 +- .../UefiPayloadEntry/MemoryAllocation.c | 248 ------------------ .../UefiPayloadEntry/UefiPayloadEntry.inf | 2 +- .../UniversalPayloadEntry.inf | 2 +- 5 files changed, 4 insertions(+), 252 deletions(-) delete mode 100644 UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c index 7af1276d60d2..ae8ee8ad5bc2 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c +++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c @@ -533,7 +533,7 @@ FitUplEntryPoint ( FdtBase = (VOID *)BootloaderParameter; if (FdtCheckHeader (FdtBase) == 0) { CustomFdtNodeParser ((VOID *)FdtBase, (VOID *)HobListPtr); - FdtBaseResvd = PayloadAllocatePages (PcdGet8 (PcdFDTPageSize), EfiReservedMemoryType); + FdtBaseResvd = AllocateReservedPages (PcdGet8 (PcdFDTPageSize)); } } diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf index 8fb223ecd5af..cbf13d4491f2 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf +++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf @@ -24,7 +24,6 @@ [Sources] FitUniversalPayloadEntry.c LoadDxeCore.c - MemoryAllocation.c PrintHob.c AcpiTable.c @@ -67,6 +66,7 @@ CustomFdtNodeParserLib PcdLib StackCheckLib + MemoryAllocationLib [Guids] gEfiMemoryTypeInformationGuid diff --git a/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c b/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c deleted file mode 100644 index 23bbf196ccb4..000000000000 --- a/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c +++ /dev/null @@ -1,248 +0,0 @@ -/** @file - - - Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
    - Copyright (c) 2020, Intel Corporation. All rights reserved.
    - - SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include "UefiPayloadEntry.h" - -/** - Allocates one or more pages of type EfiBootServicesData. - - Allocates the number of pages of MemoryType and returns a pointer to the - allocated buffer. The buffer returned is aligned on a 4KB boundary. - If Pages is 0, then NULL is returned. - If there is not enough memory availble to satisfy the request, then NULL - is returned. - - @param Pages The number of 4 KB pages to allocate. - @param MemoryType The MemoryType - @return A pointer to the allocated buffer or NULL if allocation fails. -**/ -VOID * -EFIAPI -PayloadAllocatePages ( - IN UINTN Pages, - IN EFI_MEMORY_TYPE MemoryType - ) -{ - EFI_PEI_HOB_POINTERS Hob; - EFI_PHYSICAL_ADDRESS Offset; - EFI_HOB_HANDOFF_INFO_TABLE *HobTable; - - Hob.Raw = GetHobList (); - HobTable = Hob.HandoffInformationTable; - - if (Pages == 0) { - return NULL; - } - - // Make sure allocation address is page alligned. - Offset = HobTable->EfiFreeMemoryTop & EFI_PAGE_MASK; - if (Offset != 0) { - HobTable->EfiFreeMemoryTop -= Offset; - } - - // - // Check available memory for the allocation - // - if (HobTable->EfiFreeMemoryTop - ((Pages * EFI_PAGE_SIZE) + sizeof (EFI_HOB_MEMORY_ALLOCATION)) < HobTable->EfiFreeMemoryBottom) { - return NULL; - } - - HobTable->EfiFreeMemoryTop -= Pages * EFI_PAGE_SIZE; - BuildMemoryAllocationHob (HobTable->EfiFreeMemoryTop, Pages * EFI_PAGE_SIZE, MemoryType); - - return (VOID *)(UINTN)HobTable->EfiFreeMemoryTop; -} - -/** - Allocates one or more pages of type EfiBootServicesData. - - Allocates the number of pages of MemoryType and returns a pointer to the - allocated buffer. The buffer returned is aligned on a 4KB boundary. - If Pages is 0, then NULL is returned. - If there is not enough memory availble to satisfy the request, then NULL - is returned. - - @param Pages The number of 4 KB pages to allocate. - @return A pointer to the allocated buffer or NULL if allocation fails. -**/ -VOID * -EFIAPI -AllocatePages ( - IN UINTN Pages - ) -{ - EFI_PEI_HOB_POINTERS Hob; - EFI_PHYSICAL_ADDRESS Offset; - EFI_HOB_HANDOFF_INFO_TABLE *HobTable; - - Hob.Raw = GetHobList (); - HobTable = Hob.HandoffInformationTable; - - if (Pages == 0) { - return NULL; - } - - // Make sure allocation address is page aligned. - Offset = HobTable->EfiFreeMemoryTop & EFI_PAGE_MASK; - if (Offset != 0) { - HobTable->EfiFreeMemoryTop -= Offset; - } - - // - // Check available memory for the allocation - // - if (HobTable->EfiFreeMemoryTop - ((Pages * EFI_PAGE_SIZE) + sizeof (EFI_HOB_MEMORY_ALLOCATION)) < HobTable->EfiFreeMemoryBottom) { - return NULL; - } - - HobTable->EfiFreeMemoryTop -= Pages * EFI_PAGE_SIZE; - BuildMemoryAllocationHob (HobTable->EfiFreeMemoryTop, Pages * EFI_PAGE_SIZE, EfiBootServicesData); - - return (VOID *)(UINTN)HobTable->EfiFreeMemoryTop; -} - -/** - Frees one or more 4KB pages that were previously allocated with one of the page allocation - functions in the Memory Allocation Library. - - Frees the number of 4KB pages specified by Pages from the buffer specified by Buffer. Buffer - must have been allocated on a previous call to the page allocation services of the Memory - Allocation Library. If it is not possible to free allocated pages, then this function will - perform no actions. - - If Buffer was not allocated with a page allocation function in the Memory Allocation Library, - then ASSERT(). - If Pages is zero, then ASSERT(). - - @param Buffer Pointer to the buffer of pages to free. - @param Pages The number of 4 KB pages to free. - -**/ -VOID -EFIAPI -FreePages ( - IN VOID *Buffer, - IN UINTN Pages - ) -{ -} - -/** - Allocates one or more pages of type EfiBootServicesData at a specified alignment. - - Allocates the number of pages specified by Pages of type EfiBootServicesData with an - alignment specified by Alignment. - If Pages is 0, then NULL is returned. - If Alignment is not a power of two and Alignment is not zero, then ASSERT(). - If there is no enough memory at the specified alignment available to satisfy the - request, then NULL is returned. - - @param Pages The number of 4 KB pages to allocate. - @param Alignment The requested alignment of the allocation. - - @return A pointer to the allocated buffer or NULL if allocation fails. -**/ -VOID * -EFIAPI -AllocateAlignedPages ( - IN UINTN Pages, - IN UINTN Alignment - ) -{ - VOID *Memory; - UINTN AlignmentMask; - - // - // Alignment must be a power of two or zero. - // - ASSERT ((Alignment & (Alignment - 1)) == 0); - - if (Pages == 0) { - return NULL; - } - - // - // Check overflow. - // - ASSERT (Pages <= (MAX_ADDRESS - EFI_SIZE_TO_PAGES (Alignment))); - - Memory = (VOID *)(UINTN)AllocatePages (Pages + EFI_SIZE_TO_PAGES (Alignment)); - if (Memory == NULL) { - return NULL; - } - - if (Alignment == 0) { - AlignmentMask = Alignment; - } else { - AlignmentMask = Alignment - 1; - } - - return (VOID *)(UINTN)(((UINTN)Memory + AlignmentMask) & ~AlignmentMask); -} - -/** - Allocates a buffer of type EfiBootServicesData. - - Allocates the number bytes specified by AllocationSize of type EfiBootServicesData and returns a - pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is - returned. If there is not enough memory remaining to satisfy the request, then NULL is returned. - - @param AllocationSize The number of bytes to allocate. - - @return A pointer to the allocated buffer or NULL if allocation fails. - -**/ -VOID * -EFIAPI -AllocatePool ( - IN UINTN AllocationSize - ) -{ - EFI_HOB_MEMORY_POOL *Hob; - - if (AllocationSize > 0x4000) { - // Please use AllocatePages for big allocations - return NULL; - } - - Hob = (EFI_HOB_MEMORY_POOL *)CreateHob (EFI_HOB_TYPE_MEMORY_POOL, (UINT16)(sizeof (EFI_HOB_MEMORY_POOL) + AllocationSize)); - return (VOID *)(Hob + 1); -} - -/** - Allocates and zeros a buffer of type EfiBootServicesData. - - Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, clears the - buffer with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a - valid buffer of 0 size is returned. If there is not enough memory remaining to satisfy the - request, then NULL is returned. - - @param AllocationSize The number of bytes to allocate and zero. - - @return A pointer to the allocated buffer or NULL if allocation fails. - -**/ -VOID * -EFIAPI -AllocateZeroPool ( - IN UINTN AllocationSize - ) -{ - VOID *Buffer; - - Buffer = AllocatePool (AllocationSize); - if (Buffer == NULL) { - return NULL; - } - - ZeroMem (Buffer, AllocationSize); - - return Buffer; -} diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf index 8795f1b17d31..a090e3224140 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf @@ -24,7 +24,6 @@ [Sources] UefiPayloadEntry.c LoadDxeCore.c - MemoryAllocation.c AcpiTable.c [Sources.Ia32] @@ -61,6 +60,7 @@ CpuLib StackCheckLib UefiCpuBaseArchSupportLib + MemoryAllocationLib [Guids] gEfiMemoryTypeInformationGuid diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf index 8f6f0591c180..842081d5d511 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf +++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf @@ -20,7 +20,6 @@ [Sources] UniversalPayloadEntry.c LoadDxeCore.c - MemoryAllocation.c PrintHob.c AcpiTable.c [Sources.Ia32] @@ -52,6 +51,7 @@ HobPrintLib StackCheckLib UefiCpuBaseArchSupportLib + MemoryAllocationLib [Guids] gEfiMemoryTypeInformationGuid From e93ee87643a30df3bffede2f4cdadfc7be88f0bd Mon Sep 17 00:00:00 2001 From: Evgenii Shatokhin Date: Mon, 20 Oct 2025 10:54:59 +0300 Subject: [PATCH 0788/1172] BaseTools: FMMT: Fix incorrect size calculation in ModifyTest() There is another issue in FvHander.py similar to the one fixed by a60334ad59eb ("BaseTools: Fix FMMT FvHandler Padding operation issue"). For a guided section (ParTree.Data.Type == 0x02), the length of ParTree.Data.OriData is used to obtain the original size of the data even after ParTree.Data.OriData has changed, which is incorrect. This caused the following issue I observed. I built OVMF image for Aarch64 and then tried to add a couple FFS modules to it with 'FMMT -a [...]'. The resulting image turned out to be invalid: the total size of the image was less than the size of the firmware volume within it. UEFITool failed to load such firmware image and complained: "parseRawArea: one of objects inside overlaps the end of data". This patch fixes the issue. Signed-off-by: Evgenii Shatokhin --- BaseTools/Source/Python/FMMT/core/FvHandler.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/BaseTools/Source/Python/FMMT/core/FvHandler.py b/BaseTools/Source/Python/FMMT/core/FvHandler.py index 12d52c1ac303..6ecbffa245f8 100644 --- a/BaseTools/Source/Python/FMMT/core/FvHandler.py +++ b/BaseTools/Source/Python/FMMT/core/FvHandler.py @@ -346,7 +346,8 @@ def ModifyTest(self, ParTree, Needed_Space: int) -> None: raise Exception("Process Failed: GuidTool not found!") # Recompress current data, and recalculate the needed space CompressedData = guidtool.pack(ParTree.Data.Data) - Needed_Space = len(CompressedData) - len(ParTree.Data.OriData) + Original_Data_Size = len(ParTree.Data.OriData) + Needed_Space = len(CompressedData) - Original_Data_Size ParTree.Data.OriData = CompressedData New_Size = ParTree.Data.HeaderLength + len(CompressedData) ParTree.Data.Header.Size[0] = New_Size % (16**2) @@ -367,12 +368,12 @@ def ModifyTest(self, ParTree, Needed_Space: int) -> None: if Needed_Space < 0: if ParTree.NextRel: self.Remain_New_Free_Space = ( - len(ParTree.Data.OriData) + Original_Pad_Size - + Original_Data_Size + Original_Pad_Size - len(CompressedData) - New_Pad_Size ) else: self.Remain_New_Free_Space = ( - len(ParTree.Data.OriData) - len(CompressedData) + Original_Data_Size - len(CompressedData) ) # If current section is not guided section elif Needed_Space: From 5be1bccd9cd009e54c75ee31fb8f760dfb7954b1 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Thu, 30 Oct 2025 11:30:23 -0700 Subject: [PATCH 0789/1172] MdeModulePkg: DxeCore: Check overflow before using resource hob memory top Current GCD logic uses plain addition calulation when iterating through the resource descriptor hobs. However, if the resource descriptor is incorrectly prepared, this could cause incorrect memory initialization and other failures down the boot process. This change adds an overflow check before using the value. Signed-off-by: Kun Qin --- MdeModulePkg/Core/Dxe/Gcd/Gcd.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Gcd/Gcd.c b/MdeModulePkg/Core/Dxe/Gcd/Gcd.c index 42ec2618dfb2..76a4463fbe61 100644 --- a/MdeModulePkg/Core/Dxe/Gcd/Gcd.c +++ b/MdeModulePkg/Core/Dxe/Gcd/Gcd.c @@ -2274,6 +2274,7 @@ CoreInitializeMemoryServices ( EFI_HOB_GUID_TYPE *GuidHob; UINT32 ReservedCodePageNumber; UINT64 MinimalMemorySizeNeeded; + EFI_PHYSICAL_ADDRESS ResourceHobMemoryTop; // // Point at the first HOB. This must be the PHIT HOB. @@ -2395,7 +2396,17 @@ CoreInitializeMemoryServices ( continue; } - if (PhitHob->EfiFreeMemoryTop > (ResourceHob->PhysicalStart + ResourceHob->ResourceLength)) { + // + // Check for potential overflow before addition + // + if (ResourceHob->PhysicalStart > MAX_UINT64 - ResourceHob->ResourceLength) { + ASSERT (FALSE); + ResourceHobMemoryTop = MAX_UINT64; + } else { + ResourceHobMemoryTop = ResourceHob->PhysicalStart + ResourceHob->ResourceLength; + } + + if (PhitHob->EfiFreeMemoryTop > ResourceHobMemoryTop) { continue; } @@ -2419,7 +2430,7 @@ CoreInitializeMemoryServices ( // Attributes = PhitResourceHob->ResourceAttribute; BaseAddress = PageAlignAddress (PhitHob->EfiMemoryTop); - Length = PageAlignLength (ResourceHob->PhysicalStart + ResourceHob->ResourceLength - BaseAddress); + Length = PageAlignLength (ResourceHobMemoryTop - BaseAddress); FindLargestFreeRegion (&BaseAddress, &Length, (EFI_HOB_MEMORY_ALLOCATION *)GetFirstHob (EFI_HOB_TYPE_MEMORY_ALLOCATION)); if (Length < MinimalMemorySizeNeeded) { // @@ -2496,7 +2507,17 @@ CoreInitializeMemoryServices ( continue; } - if ((ResourceHob->PhysicalStart + ResourceHob->ResourceLength) > (EFI_PHYSICAL_ADDRESS)MAX_ALLOC_ADDRESS) { + // + // Check for potential overflow before addition + // + if (ResourceHob->PhysicalStart > MAX_UINT64 - ResourceHob->ResourceLength) { + ASSERT (FALSE); + ResourceHobMemoryTop = MAX_UINT64; + } else { + ResourceHobMemoryTop = ResourceHob->PhysicalStart + ResourceHob->ResourceLength; + } + + if (ResourceHobMemoryTop > (EFI_PHYSICAL_ADDRESS)MAX_ALLOC_ADDRESS) { continue; } @@ -2511,7 +2532,7 @@ CoreInitializeMemoryServices ( // Skip Resource Descriptor HOBs that are not large enough to initilize the DXE Core // TestedMemoryBaseAddress = PageAlignAddress (ResourceHob->PhysicalStart); - TestedMemoryLength = PageAlignLength (ResourceHob->PhysicalStart + ResourceHob->ResourceLength - TestedMemoryBaseAddress); + TestedMemoryLength = PageAlignLength (ResourceHobMemoryTop - TestedMemoryBaseAddress); FindLargestFreeRegion (&TestedMemoryBaseAddress, &TestedMemoryLength, (EFI_HOB_MEMORY_ALLOCATION *)GetFirstHob (EFI_HOB_TYPE_MEMORY_ALLOCATION)); if (TestedMemoryLength < MinimalMemorySizeNeeded) { continue; From feeb137d43b7c00623b602a2a3fa7352c712ef81 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Thu, 30 Oct 2025 11:42:53 -0700 Subject: [PATCH 0790/1172] MdeModulePkg: DxeCore: Adding check for underflow before subtraction During DXE core memory service initialization, the system would check available resource descriptor hobs against the memory top from PHIT hob. However, it is possible that a given resource descriptor hob will not be larger than the cover the memory top, causing the Length calculation to underflow. This change adds a check for potential underflow before performing the subtraction. Signed-off-by: Kun Qin --- MdeModulePkg/Core/Dxe/Gcd/Gcd.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Gcd/Gcd.c b/MdeModulePkg/Core/Dxe/Gcd/Gcd.c index 76a4463fbe61..7dfb24b01315 100644 --- a/MdeModulePkg/Core/Dxe/Gcd/Gcd.c +++ b/MdeModulePkg/Core/Dxe/Gcd/Gcd.c @@ -2430,8 +2430,14 @@ CoreInitializeMemoryServices ( // Attributes = PhitResourceHob->ResourceAttribute; BaseAddress = PageAlignAddress (PhitHob->EfiMemoryTop); - Length = PageAlignLength (ResourceHobMemoryTop - BaseAddress); - FindLargestFreeRegion (&BaseAddress, &Length, (EFI_HOB_MEMORY_ALLOCATION *)GetFirstHob (EFI_HOB_TYPE_MEMORY_ALLOCATION)); + + if (BaseAddress > ResourceHobMemoryTop) { + Length = 0; + } else { + Length = PageAlignLength (ResourceHobMemoryTop - BaseAddress); + FindLargestFreeRegion (&BaseAddress, &Length, (EFI_HOB_MEMORY_ALLOCATION *)GetFirstHob (EFI_HOB_TYPE_MEMORY_ALLOCATION)); + } + if (Length < MinimalMemorySizeNeeded) { // // If that range is not large enough to intialize the DXE Core, then From 56032225e36403f4f33bd4f8283aa512fd28699d Mon Sep 17 00:00:00 2001 From: gapandya Date: Sat, 18 Oct 2025 09:42:07 +0000 Subject: [PATCH 0791/1172] MdeModulePkg: Define PCD for SATA ready for operation timeout. Some large capacity SATA HDD requires more time from power on to ready state. Making timeout value configurable by defining PCD PcdSataDeviceReadyTimeout will allow platform.dsc to serve these devices. Defining gEfiMdeModulePkgTokenSpaceGuid.PcdSataDeviceReadyTimeout with default value 16 Seconds in MdeModulePkg.dec. Signed-off-by: gapandya --- MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c | 5 +++-- MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf | 1 + MdeModulePkg/MdeModulePkg.dec | 5 +++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c index c0c8ffbd9ec5..c21872b4fa36 100644 --- a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c +++ b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c @@ -622,9 +622,10 @@ AhciWaitDeviceReady ( // // According to SATA1.0a spec section 5.2, we need to wait for PxTFD.BSY and PxTFD.DRQ - // and PxTFD.ERR to be zero. The maximum wait time is 16s which is defined at ATA spec. + // and PxTFD.ERR to be zero. The maximum wait time is configurable and determined by + // PCD PcdSataDeviceReadyTimeout. // - PhyDetectDelay = 16 * 1000; + PhyDetectDelay = PcdGet8 (PcdSataDeviceReadyTimeout) * 1000; do { Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_SERR; if (AhciReadReg (PciIo, Offset) != 0) { diff --git a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf index 78caa3c45889..1367ea849e42 100644 --- a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf +++ b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf @@ -67,6 +67,7 @@ [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdAtaSmartEnable ## SOMETIMES_CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdAhciCommandRetryCount ## SOMETIMES_CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdSataDeviceReadyTimeout ## CONSUMES # [Event] # EVENT_TYPE_PERIODIC_TIMER ## SOMETIMES_CONSUMES diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 0775aa954ad6..979188e52943 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -1748,6 +1748,11 @@ # @Prompt Maximum number of delayed dispatch entries. Default value is 8. gEfiMdeModulePkgTokenSpaceGuid.PcdDelayedDispatchMaxEntries|8|UINT32|0x00000037 + ## Indicate the default timeout value for SATA device to be ready for operations in seconds. + # + # @Prompt SATA device ready for operations timoeout (s), default value is 16s. + gEfiMdeModulePkgTokenSpaceGuid.PcdSataDeviceReadyTimeout|16|UINT8|0x00000038 + [PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx] ## This PCD defines the Console output row. The default value is 25 according to UEFI spec. # This PCD could be set to 0 then console output would be at max column and max row. From ad961fa9794a9ebd9d99013f29631a03f5fe1281 Mon Sep 17 00:00:00 2001 From: Varshit Pandya Date: Fri, 18 Aug 2023 16:42:53 +0100 Subject: [PATCH 0792/1172] DynamicTablesPkg: Fix always true condition In "if (RpInfo[Index].Sun != MAX_UINT64)", "RpInfo[Index].Sun" is UINT32 type. Which means it is never going to be equal to MAX_UINT64, so use "RpInfo[Index].Sun != MAX_UINT32" instead. Signed-off-by: Varshit Pandya --- .../Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.c index 280a1001bd7f..9876626950bd 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.c +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.c @@ -546,7 +546,7 @@ GenerateRootPortDevices ( goto exit_handler; } - if (RpInfo[Index].Sun != MAX_UINT64) { + if (RpInfo[Index].Sun != MAX_UINT32) { // ASL: Name (_SUN, ) Status = AmlCodeGenNameInteger ( "_SUN", From 57151d88f2901ddc5feed1c9772b7bda54e3eb33 Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Wed, 22 Oct 2025 11:33:02 -0700 Subject: [PATCH 0793/1172] MdeModulePkg: Fix comparison with wider widths. https://codeql.github.com/codeql-query-help/cpp/cpp-comparison-with-wider-type If the narrow type (smaller range) is compared against a wide type (larger range), the narrow value may overflow before reaching the wide value. This can cause unexpected behavior, such as: Infinite loops (loop condition never becomes false). Incorrect logic (comparison results are misleading). Signed-off-by: Aaron Pop --- MdeModulePkg/Core/Pei/FwVol/FwVol.c | 8 ++++---- MdeModulePkg/Core/Pei/Ppi/Ppi.c | 4 ++-- MdeModulePkg/Core/PiSmmCore/SmramProfileRecord.c | 5 +++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/MdeModulePkg/Core/Pei/FwVol/FwVol.c b/MdeModulePkg/Core/Pei/FwVol/FwVol.c index 1c0aa9d121d8..dc9d989ac4f1 100644 --- a/MdeModulePkg/Core/Pei/FwVol/FwVol.c +++ b/MdeModulePkg/Core/Pei/FwVol/FwVol.c @@ -277,7 +277,7 @@ FindFileEx ( EFI_FFS_FILE_HEADER *FfsFileHeader; UINT32 FileLength; UINT32 FileOccupiedSize; - UINT32 FileOffset; + UINT64 FileOffset; UINT64 FvLength; UINT8 ErasePolarity; UINT8 FileState; @@ -335,8 +335,8 @@ FindFileEx ( FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)*FileHeader + FileOccupiedSize); } - FileOffset = (UINT32)((UINT8 *)FfsFileHeader - (UINT8 *)FwVolHeader); - ASSERT (FileOffset <= 0xFFFFFFFF); + FileOffset = ((UINT8 *)FfsFileHeader - (UINT8 *)FwVolHeader); + ASSERT (FileOffset <= MAX_UINT32); while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) { // @@ -817,7 +817,7 @@ ProcessSection ( { EFI_STATUS Status; UINT32 SectionLength; - UINT32 ParsedLength; + UINTN ParsedLength; EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI *GuidSectionPpi; EFI_PEI_DECOMPRESS_PPI *DecompressPpi; VOID *PpiOutput; diff --git a/MdeModulePkg/Core/Pei/Ppi/Ppi.c b/MdeModulePkg/Core/Pei/Ppi/Ppi.c index 0e85264ddb93..df2cb9221d1e 100644 --- a/MdeModulePkg/Core/Pei/Ppi/Ppi.c +++ b/MdeModulePkg/Core/Pei/Ppi/Ppi.c @@ -163,7 +163,7 @@ ConvertPpiPointers ( IN PEI_CORE_INSTANCE *PrivateData ) { - UINT8 Index; + UINTN Index; // // Convert normal PPIs. @@ -217,7 +217,7 @@ ConvertPpiPointersFv ( IN UINTN FvSize ) { - UINT8 Index; + UINTN Index; UINTN Offset; BOOLEAN OffsetPositive; EFI_PEI_FIRMWARE_VOLUME_INFO_PPI *FvInfoPpi; diff --git a/MdeModulePkg/Core/PiSmmCore/SmramProfileRecord.c b/MdeModulePkg/Core/PiSmmCore/SmramProfileRecord.c index b437e4c43309..7c90c91235fb 100644 --- a/MdeModulePkg/Core/PiSmmCore/SmramProfileRecord.c +++ b/MdeModulePkg/Core/PiSmmCore/SmramProfileRecord.c @@ -1686,7 +1686,7 @@ SmramProfileCopyData ( LIST_ENTRY *FreePoolList; FREE_POOL_HEADER *Pool; UINTN PoolListIndex; - UINT32 Index; + UINTN Index; MEMORY_PROFILE_FREE_MEMORY *FreeMemory; MEMORY_PROFILE_MEMORY_RANGE *MemoryRange; MEMORY_PROFILE_DESCRIPTOR *MemoryProfileDescriptor; @@ -1805,7 +1805,8 @@ SmramProfileCopyData ( } } - FreeMemory->FreeMemoryEntryCount = Index; + // if this truncates anything, we have bigger problems + FreeMemory->FreeMemoryEntryCount = (UINT32)Index; RemainingSize -= sizeof (MEMORY_PROFILE_FREE_MEMORY); ProfileBuffer = (UINT8 *)ProfileBuffer + sizeof (MEMORY_PROFILE_FREE_MEMORY); From 5214f931c9a9bed62e1d5324864c60f25b77590d Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Wed, 22 Oct 2025 11:33:02 -0700 Subject: [PATCH 0794/1172] MdeModulePkg: Fix missing NULL tests. https://github.com/github/codeql/blob/codeql-cli-2.7.3/cpp/ql/src/Critical/MissingNullTest.qhelp For items which allocate memory, or get a pointer from another structure, it is important to validate that the pointers are not null before they are dereferenced. Signed-off-by: Aaron Pop --- MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c | 24 ++++++--- MdeModulePkg/Core/Dxe/Gcd/Gcd.c | 41 +++++++++++--- MdeModulePkg/Core/Dxe/Hand/Handle.c | 2 +- MdeModulePkg/Core/Dxe/Image/Image.c | 10 +++- .../Core/Dxe/Mem/MemoryProfileRecord.c | 7 ++- MdeModulePkg/Core/Dxe/Mem/Page.c | 14 +++-- MdeModulePkg/Core/Dxe/Mem/Pool.c | 4 ++ .../Core/Dxe/Misc/MemoryAttributesTable.c | 12 ++++- .../SectionExtraction/CoreSectionExtraction.c | 5 +- MdeModulePkg/Core/DxeIplPeim/DxeLoad.c | 6 ++- .../Core/DxeIplPeim/X64/VirtualMemory.c | 20 +++++-- MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c | 17 ++++-- MdeModulePkg/Core/Pei/Hob/Hob.c | 6 +-- MdeModulePkg/Core/PiSmmCore/HeapGuard.c | 5 +- .../Core/PiSmmCore/MemoryAttributesTable.c | 4 +- MdeModulePkg/Core/PiSmmCore/Page.c | 6 ++- MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c | 54 ++++++++++++++++--- MdeModulePkg/Core/PiSmmCore/Pool.c | 10 ++-- .../Core/PiSmmCore/SmiHandlerProfile.c | 4 +- .../Core/PiSmmCore/SmramProfileRecord.c | 7 ++- 20 files changed, 204 insertions(+), 54 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c b/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c index cf9d55687766..cc5f8836d778 100644 --- a/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c +++ b/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c @@ -773,7 +773,10 @@ FvIsBeingProcessed ( } KnownHandle = AllocateZeroPool (sizeof (KNOWN_HANDLE)); - ASSERT (KnownHandle != NULL); + if (KnownHandle == NULL) { + ASSERT (KnownHandle != NULL); + return NULL; + } KnownHandle->Signature = KNOWN_HANDLE_SIGNATURE; KnownHandle->Handle = FvHandle; @@ -850,6 +853,7 @@ CoreFvToDevicePath ( @retval EFI_ALREADY_STARTED The driver has already been started. Only one DriverName may be active in the system at any one time. + @retval EFI_OUT_OF_RESOURCES If memory could not be allocated for the DriverEntry. **/ EFI_STATUS @@ -867,7 +871,11 @@ CoreAddToDriverList ( // NULL or FALSE. // DriverEntry = AllocateZeroPool (sizeof (EFI_CORE_DRIVER_ENTRY)); - ASSERT (DriverEntry != NULL); + if (DriverEntry == NULL) { + ASSERT (DriverEntry != NULL); + return EFI_OUT_OF_RESOURCES; + } + if (Type == EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE) { DriverEntry->IsFvImage = TRUE; } @@ -1050,13 +1058,15 @@ CoreProcessFvImageFile ( // if (gSecurity != NULL) { FvFileDevicePath = CoreFvToDevicePath (Fv, FvHandle, FileName); - Status = gSecurity->FileAuthenticationState ( - gSecurity, - AuthenticationStatus, - FvFileDevicePath - ); if (FvFileDevicePath != NULL) { + Status = gSecurity->FileAuthenticationState ( + gSecurity, + AuthenticationStatus, + FvFileDevicePath + ); FreePool (FvFileDevicePath); + } else { + Status = EFI_OUT_OF_RESOURCES; } if (Status != EFI_SUCCESS) { diff --git a/MdeModulePkg/Core/Dxe/Gcd/Gcd.c b/MdeModulePkg/Core/Dxe/Gcd/Gcd.c index 7dfb24b01315..6b3248882848 100644 --- a/MdeModulePkg/Core/Dxe/Gcd/Gcd.c +++ b/MdeModulePkg/Core/Dxe/Gcd/Gcd.c @@ -161,7 +161,10 @@ CoreDumpGcdMemorySpaceMap ( } Status = CoreGetMemorySpaceMap (&NumberOfDescriptors, &MemorySpaceMap); - ASSERT (Status == EFI_SUCCESS && MemorySpaceMap != NULL); + if (!((Status == EFI_SUCCESS) && (MemorySpaceMap != NULL))) { + ASSERT ((Status == EFI_SUCCESS) && (MemorySpaceMap != NULL)); + return; + } if (InitialMap) { DEBUG ((DEBUG_GCD, "GCD:Initial GCD Memory Space Map\n")); @@ -214,7 +217,10 @@ CoreDumpGcdIoSpaceMap ( } Status = CoreGetIoSpaceMap (&NumberOfDescriptors, &IoSpaceMap); - ASSERT (Status == EFI_SUCCESS && IoSpaceMap != NULL); + if (!((Status == EFI_SUCCESS) && (IoSpaceMap != NULL))) { + ASSERT ((Status == EFI_SUCCESS) && (IoSpaceMap != NULL)); + return; + } if (InitialMap) { DEBUG ((DEBUG_GCD, "GCD:Initial GCD I/O Space Map\n")); @@ -770,13 +776,14 @@ CoreConvertSpace ( Map = &mGcdIoSpaceMap; } else { ASSERT (FALSE); + return EFI_NOT_FOUND; } // // Search for the list of descriptors that cover the range BaseAddress to BaseAddress+Length // Status = CoreSearchGcdMapEntry (BaseAddress, Length, &StartLink, &EndLink, Map); - if (EFI_ERROR (Status)) { + if (EFI_ERROR (Status) || ((StartLink == NULL) || (EndLink == NULL))) { Status = EFI_UNSUPPORTED; goto Done; @@ -1184,6 +1191,7 @@ CoreAllocateSpace ( Map = &mGcdIoSpaceMap; } else { ASSERT (FALSE); + return EFI_NOT_FOUND; } Found = FALSE; @@ -1351,6 +1359,12 @@ CoreAllocateSpace ( // Convert/Insert the list of descriptors from StartLink to EndLink // Link = StartLink; + if ((Link == NULL) || (EndLink == NULL)) { + ASSERT (Link != NULL); + ASSERT (EndLink != NULL); + goto Done; + } + while (Link != EndLink->ForwardLink) { Entry = CR (Link, EFI_GCD_MAP_ENTRY, Link, EFI_GCD_MAP_SIGNATURE); CoreInsertGcdMapEntry (Link, Entry, *BaseAddress, Length, TopEntry, BottomEntry); @@ -2651,7 +2665,11 @@ CoreInitializeGcdServices ( // Get the number of address lines in the I/O and Memory space for the CPU // CpuHob = GetFirstHob (EFI_HOB_TYPE_CPU); - ASSERT (CpuHob != NULL); + if (CpuHob == NULL) { + ASSERT (CpuHob != NULL); + return EFI_OUT_OF_RESOURCES; + } + SizeOfMemorySpace = CpuHob->SizeOfMemorySpace; SizeOfIoSpace = CpuHob->SizeOfIoSpace; @@ -2659,7 +2677,10 @@ CoreInitializeGcdServices ( // Initialize the GCD Memory Space Map // Entry = AllocateCopyPool (sizeof (EFI_GCD_MAP_ENTRY), &mGcdMemorySpaceMapEntryTemplate); - ASSERT (Entry != NULL); + if (Entry == NULL) { + ASSERT (Entry != NULL); + return EFI_OUT_OF_RESOURCES; + } Entry->EndAddress = LShiftU64 (1, SizeOfMemorySpace) - 1; @@ -2671,7 +2692,10 @@ CoreInitializeGcdServices ( // Initialize the GCD I/O Space Map // Entry = AllocateCopyPool (sizeof (EFI_GCD_MAP_ENTRY), &mGcdIoSpaceMapEntryTemplate); - ASSERT (Entry != NULL); + if (Entry == NULL) { + ASSERT (Entry != NULL); + return EFI_OUT_OF_RESOURCES; + } Entry->EndAddress = LShiftU64 (1, SizeOfIoSpace) - 1; @@ -2897,7 +2921,10 @@ CoreInitializeGcdServices ( (UINTN)PhitHob->EfiFreeMemoryBottom - (UINTN)(*HobStart), *HobStart ); - ASSERT (NewHobList != NULL); + if (NewHobList == NULL) { + ASSERT (NewHobList != NULL); + return EFI_OUT_OF_RESOURCES; + } *HobStart = NewHobList; gHobList = NewHobList; diff --git a/MdeModulePkg/Core/Dxe/Hand/Handle.c b/MdeModulePkg/Core/Dxe/Hand/Handle.c index 93e69eea7315..b03d6b75da35 100644 --- a/MdeModulePkg/Core/Dxe/Hand/Handle.c +++ b/MdeModulePkg/Core/Dxe/Hand/Handle.c @@ -1287,7 +1287,7 @@ CoreOpenProtocol ( // Keep Interface unmodified in case of any Error // except EFI_ALREADY_STARTED and EFI_UNSUPPORTED. // - if (!EFI_ERROR (Status) || (Status == EFI_ALREADY_STARTED)) { + if ((!EFI_ERROR (Status) || (Status == EFI_ALREADY_STARTED)) && (Prot != NULL)) { // // According to above logic, if 'Prot' is NULL, then the 'Status' must be // EFI_UNSUPPORTED. Here the 'Status' is not EFI_UNSUPPORTED, so 'Prot' diff --git a/MdeModulePkg/Core/Dxe/Image/Image.c b/MdeModulePkg/Core/Dxe/Image/Image.c index 4fa6e06be065..5a38e5a596f2 100644 --- a/MdeModulePkg/Core/Dxe/Image/Image.c +++ b/MdeModulePkg/Core/Dxe/Image/Image.c @@ -161,7 +161,10 @@ PeCoffEmuProtocolNotify ( } Entry = AllocateZeroPool (sizeof (*Entry)); - ASSERT (Entry != NULL); + if (Entry == NULL) { + ASSERT (Entry != NULL); + break; + } Entry->Emulator = Emulator; Entry->MachineType = Entry->Emulator->MachineType; @@ -1255,6 +1258,11 @@ CoreLoadImageCommon ( // LoadFile () may cause the device path of the Handle be updated. // OriginalFilePath = AppendDevicePath (DevicePathFromHandle (DeviceHandle), Node); + if (OriginalFilePath == NULL) { + Image = NULL; + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } } } } diff --git a/MdeModulePkg/Core/Dxe/Mem/MemoryProfileRecord.c b/MdeModulePkg/Core/Dxe/Mem/MemoryProfileRecord.c index f46703fb4da5..1f7ad68c3142 100644 --- a/MdeModulePkg/Core/Dxe/Mem/MemoryProfileRecord.c +++ b/MdeModulePkg/Core/Dxe/Mem/MemoryProfileRecord.c @@ -1276,8 +1276,11 @@ CoreUpdateProfileFree ( } } - ASSERT (DriverInfoData != NULL); - ASSERT (AllocInfoData != NULL); + if ((DriverInfoData == NULL) || (AllocInfoData == NULL)) { + ASSERT (DriverInfoData != NULL); + ASSERT (AllocInfoData != NULL); + return EFI_NOT_FOUND; + } Found = TRUE; diff --git a/MdeModulePkg/Core/Dxe/Mem/Page.c b/MdeModulePkg/Core/Dxe/Mem/Page.c index 8e7381159707..1497ae5121d0 100644 --- a/MdeModulePkg/Core/Dxe/Mem/Page.c +++ b/MdeModulePkg/Core/Dxe/Mem/Page.c @@ -339,7 +339,12 @@ CoreFreeMemoryMapStack ( // Entry = AllocateMemoryMapEntry (); - ASSERT (Entry); + // If entry allocation failed once, it is unlikely to succeed moving forward + // However, we can try since we're in the middle of moving list nodes + if (Entry == NULL) { + ASSERT (Entry != NULL); + continue; + } // // Update to proper entry @@ -876,7 +881,7 @@ CoreConvertPagesEx ( } } - if (Link == &gMemoryMap) { + if ((Link == &gMemoryMap) || (Entry == NULL)) { DEBUG ((DEBUG_ERROR | DEBUG_PAGE, "ConvertPages: failed to find range %lx - %lx\n", Start, End)); return EFI_NOT_FOUND; } @@ -898,8 +903,11 @@ CoreConvertPagesEx ( // if that's all we've got // RangeEnd = End; + if (Entry == NULL) { + ASSERT (Entry != NULL); + return EFI_NOT_FOUND; + } - ASSERT (Entry != NULL); if (Entry->End < End) { RangeEnd = Entry->End; } diff --git a/MdeModulePkg/Core/Dxe/Mem/Pool.c b/MdeModulePkg/Core/Dxe/Mem/Pool.c index 72293e6dfe40..f0f8ee247131 100644 --- a/MdeModulePkg/Core/Dxe/Mem/Pool.c +++ b/MdeModulePkg/Core/Dxe/Mem/Pool.c @@ -427,6 +427,10 @@ CoreAllocatePoolI ( NoPages = EFI_SIZE_TO_PAGES (Size) + EFI_SIZE_TO_PAGES (Granularity) - 1; NoPages &= ~(UINTN)(EFI_SIZE_TO_PAGES (Granularity) - 1); Head = CoreAllocatePoolPagesI (PoolType, NoPages, Granularity, NeedGuard); + if (Head == NULL) { + return NULL; + } + if (NeedGuard) { Head = AdjustPoolHeadA ((EFI_PHYSICAL_ADDRESS)(UINTN)Head, NoPages, Size); } diff --git a/MdeModulePkg/Core/Dxe/Misc/MemoryAttributesTable.c b/MdeModulePkg/Core/Dxe/Misc/MemoryAttributesTable.c index e1ee7d1d467d..7f4d70343af4 100644 --- a/MdeModulePkg/Core/Dxe/Misc/MemoryAttributesTable.c +++ b/MdeModulePkg/Core/Dxe/Misc/MemoryAttributesTable.c @@ -148,7 +148,10 @@ InstallMemoryAttributesTable ( do { MemoryMap = AllocatePool (MemoryMapSize); - ASSERT (MemoryMap != NULL); + if (MemoryMap == NULL) { + ASSERT (MemoryMap != NULL); + return; + } Status = CoreGetMemoryMapWithSeparatedImageSection ( &MemoryMapSize, @@ -179,7 +182,12 @@ InstallMemoryAttributesTable ( // Allocate MemoryAttributesTable // MemoryAttributesTable = AllocatePool (sizeof (EFI_MEMORY_ATTRIBUTES_TABLE) + DescriptorSize * RuntimeEntryCount); - ASSERT (MemoryAttributesTable != NULL); + if (MemoryAttributesTable == NULL) { + ASSERT (MemoryAttributesTable != NULL); + FreePool (MemoryMapStart); + return; + } + MemoryAttributesTable->Version = EFI_MEMORY_ATTRIBUTES_TABLE_VERSION; MemoryAttributesTable->NumberOfEntries = RuntimeEntryCount; MemoryAttributesTable->DescriptorSize = (UINT32)DescriptorSize; diff --git a/MdeModulePkg/Core/Dxe/SectionExtraction/CoreSectionExtraction.c b/MdeModulePkg/Core/Dxe/SectionExtraction/CoreSectionExtraction.c index 2152833ff639..bf8d33ef98aa 100644 --- a/MdeModulePkg/Core/Dxe/SectionExtraction/CoreSectionExtraction.c +++ b/MdeModulePkg/Core/Dxe/SectionExtraction/CoreSectionExtraction.c @@ -626,7 +626,10 @@ CreateGuidedExtractionRpnEvent ( // Allocate new event structure and context // Context = AllocatePool (sizeof (RPN_EVENT_CONTEXT)); - ASSERT (Context != NULL); + if (Context == NULL) { + ASSERT (Context != NULL); + return; + } Context->ChildNode = ChildNode; Context->ParentStream = ParentStream; diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c b/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c index 0b3a71f289bf..67d398352242 100644 --- a/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c +++ b/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c @@ -162,7 +162,11 @@ InstallIplPermanentMemoryPpis ( // if (ExtractHandlerNumber > 0) { GuidPpi = (EFI_PEI_PPI_DESCRIPTOR *)AllocatePool (ExtractHandlerNumber * sizeof (EFI_PEI_PPI_DESCRIPTOR)); - ASSERT (GuidPpi != NULL); + if (GuidPpi == NULL) { + ASSERT (GuidPpi != NULL); + return EFI_OUT_OF_RESOURCES; + } + while (ExtractHandlerNumber-- > 0) { GuidPpi->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; GuidPpi->Ppi = (VOID *)&mCustomGuidedSectionExtractionPpi; diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c index ee85b311e957..1e2dfb662cda 100644 --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c @@ -306,7 +306,10 @@ Split2MPageTo4K ( AddressEncMask = PcdGet64 (PcdPteMemoryEncryptionAddressOrMask) & PAGING_1G_ADDRESS_MASK_64; PageTableEntry = AllocatePageTableMemory (1); - ASSERT (PageTableEntry != NULL); + if (PageTableEntry == NULL) { + ASSERT (PageTableEntry != NULL); + return; + } // // Fill in 2M page entry. @@ -388,7 +391,10 @@ Split1GPageTo2M ( AddressEncMask = PcdGet64 (PcdPteMemoryEncryptionAddressOrMask) & PAGING_1G_ADDRESS_MASK_64; PageDirectoryEntry = AllocatePageTableMemory (1); - ASSERT (PageDirectoryEntry != NULL); + if (PageDirectoryEntry == NULL) { + ASSERT (PageDirectoryEntry != NULL); + return; + } // // Fill in 1G page entry. @@ -517,7 +523,10 @@ SetPageTablePoolReadOnly ( ASSERT (Level > 1); NewPageTable = AllocatePageTableMemory (1); - ASSERT (NewPageTable != NULL); + if (NewPageTable == NULL) { + ASSERT (NewPageTable != NULL); + return; + } PhysicalAddress = PageAttr & LevelMask[Level]; for (EntryIndex = 0; @@ -762,7 +771,10 @@ CreateIdentityMappingPageTables ( )); BigPageAddress = (UINTN)AllocatePageTableMemory (TotalPagesNum); - ASSERT (BigPageAddress != 0); + if (BigPageAddress == 0) { + ASSERT (BigPageAddress != 0); + return 0; + } // // By architecture only one PageMapLevel4 exists - so lets allocate storage for it. diff --git a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c index f488943c95c6..088c503d5c8c 100644 --- a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c +++ b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c @@ -448,7 +448,11 @@ DiscoverPeimsAndOrderWithApriori ( TempFileHandles = AllocatePool ( sizeof (EFI_PEI_FILE_HANDLE) * (Private->TempPeimCount + TEMP_FILE_GROWTH_STEP) ); - ASSERT (TempFileHandles != NULL); + if (TempFileHandles == NULL) { + ASSERT (TempFileHandles != NULL); + return; + } + CopyMem ( TempFileHandles, Private->TempFileHandles, @@ -458,7 +462,11 @@ DiscoverPeimsAndOrderWithApriori ( TempFileGuid = AllocatePool ( sizeof (EFI_GUID) * (Private->TempPeimCount + TEMP_FILE_GROWTH_STEP) ); - ASSERT (TempFileGuid != NULL); + if (TempFileGuid == NULL) { + ASSERT (TempFileGuid != NULL); + return; + } + CopyMem ( TempFileGuid, Private->TempFileGuid, @@ -1910,7 +1918,10 @@ PeiDispatcher ( for (FvCount = Private->CurrentPeimFvCount; FvCount < Private->FvCount; FvCount++) { CoreFvHandle = FindNextCoreFvHandle (Private, FvCount); - ASSERT (CoreFvHandle != NULL); + if (CoreFvHandle == NULL) { + ASSERT (CoreFvHandle != NULL); + continue; + } // // If the FV has corresponding EFI_PEI_FIRMWARE_VOLUME_PPI instance, then dispatch it. diff --git a/MdeModulePkg/Core/Pei/Hob/Hob.c b/MdeModulePkg/Core/Pei/Hob/Hob.c index 6d17d7c2f680..131db2ad4372 100644 --- a/MdeModulePkg/Core/Pei/Hob/Hob.c +++ b/MdeModulePkg/Core/Pei/Hob/Hob.c @@ -17,7 +17,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent @retval EFI_SUCCESS Get the pointer of HOB List @retval EFI_NOT_AVAILABLE_YET the HOB List is not yet published - @retval EFI_INVALID_PARAMETER HobList is NULL (in debug mode) + @retval EFI_INVALID_PARAMETER HobList is NULL **/ EFI_STATUS @@ -32,14 +32,10 @@ PeiGetHobList ( // // Only check this parameter in debug mode // - - DEBUG_CODE_BEGIN (); if (HobList == NULL) { return EFI_INVALID_PARAMETER; } - DEBUG_CODE_END (); - PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices); *HobList = PrivateData->HobList.Raw; diff --git a/MdeModulePkg/Core/PiSmmCore/HeapGuard.c b/MdeModulePkg/Core/PiSmmCore/HeapGuard.c index 25310122ca1b..a9471962c56a 100644 --- a/MdeModulePkg/Core/PiSmmCore/HeapGuard.c +++ b/MdeModulePkg/Core/PiSmmCore/HeapGuard.c @@ -268,7 +268,10 @@ FindGuardedMemoryMap ( Size = (mLevelMask[GUARDED_HEAP_MAP_TABLE_DEPTH - mMapLevel - 1] + 1) * GUARDED_HEAP_MAP_ENTRY_BYTES; MapMemory = (UINT64)(UINTN)PageAlloc (EFI_SIZE_TO_PAGES (Size)); - ASSERT (MapMemory != 0); + if (MapMemory == 0) { + ASSERT (MapMemory != 0); + return 0; + } SetMem ((VOID *)(UINTN)MapMemory, Size, 0); diff --git a/MdeModulePkg/Core/PiSmmCore/MemoryAttributesTable.c b/MdeModulePkg/Core/PiSmmCore/MemoryAttributesTable.c index 28fe74ecc421..de930df4c5bb 100644 --- a/MdeModulePkg/Core/PiSmmCore/MemoryAttributesTable.c +++ b/MdeModulePkg/Core/PiSmmCore/MemoryAttributesTable.c @@ -469,7 +469,9 @@ SmmInstallImageRecord ( SmmInsertImageRecord (&DriverEntry); } - FreePool (HandleBuffer); + if (HandleBuffer != NULL) { + FreePool (HandleBuffer); + } } /** diff --git a/MdeModulePkg/Core/PiSmmCore/Page.c b/MdeModulePkg/Core/PiSmmCore/Page.c index 255964c23a2f..dfa9193eb190 100644 --- a/MdeModulePkg/Core/PiSmmCore/Page.c +++ b/MdeModulePkg/Core/PiSmmCore/Page.c @@ -165,7 +165,11 @@ CoreFreeMemoryMapStack ( // Deque an memory map entry from mFreeMemoryMapEntryList // Entry = AllocateMemoryMapEntry (); - ASSERT (Entry); + if (Entry == NULL) { + ASSERT (Entry); + mFreeMapStack -= 1; + return; + } // // Update to proper entry diff --git a/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c b/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c index 749295b0ac81..81d58b16c9a6 100644 --- a/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c +++ b/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c @@ -1650,7 +1650,11 @@ GetFullSmramRanges ( *FullSmramRangeCount = SmramRangeCount + AdditionSmramRangeCount; Size = (*FullSmramRangeCount) * sizeof (EFI_SMRAM_DESCRIPTOR); FullSmramRanges = (EFI_SMRAM_DESCRIPTOR *)AllocateZeroPool (Size); - ASSERT (FullSmramRanges != NULL); + if (FullSmramRanges == NULL) { + ASSERT (FullSmramRanges != NULL); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } Status = mSmmAccess->GetCapabilities (mSmmAccess, &Size, FullSmramRanges); ASSERT_EFI_ERROR (Status); @@ -1697,18 +1701,34 @@ GetFullSmramRanges ( Size = MaxCount * sizeof (EFI_SMM_RESERVED_SMRAM_REGION); SmramReservedRanges = (EFI_SMM_RESERVED_SMRAM_REGION *)AllocatePool (Size); - ASSERT (SmramReservedRanges != NULL); + + if (SmramReservedRanges == NULL) { + ASSERT (SmramReservedRanges != NULL); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + for (Index = 0; Index < SmramReservedCount; Index++) { CopyMem (&SmramReservedRanges[Index], &SmmConfiguration->SmramReservedRegions[Index], sizeof (EFI_SMM_RESERVED_SMRAM_REGION)); } Size = MaxCount * sizeof (EFI_SMRAM_DESCRIPTOR); TempSmramRanges = (EFI_SMRAM_DESCRIPTOR *)AllocatePool (Size); - ASSERT (TempSmramRanges != NULL); + if (TempSmramRanges == NULL) { + ASSERT (TempSmramRanges != NULL); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + TempSmramRangeCount = 0; SmramRanges = (EFI_SMRAM_DESCRIPTOR *)AllocatePool (Size); - ASSERT (SmramRanges != NULL); + if (SmramRanges == NULL) { + ASSERT (SmramRanges != NULL); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + Status = mSmmAccess->GetCapabilities (mSmmAccess, &Size, SmramRanges); ASSERT_EFI_ERROR (Status); @@ -1765,7 +1785,12 @@ GetFullSmramRanges ( // Sort the entries // FullSmramRanges = AllocateZeroPool ((TempSmramRangeCount + AdditionSmramRangeCount) * sizeof (EFI_SMRAM_DESCRIPTOR)); - ASSERT (FullSmramRanges != NULL); + if (FullSmramRanges == NULL) { + ASSERT (FullSmramRanges != NULL); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + *FullSmramRangeCount = 0; do { for (Index = 0; Index < TempSmramRangeCount; Index++) { @@ -1789,9 +1814,22 @@ GetFullSmramRanges ( ASSERT (*FullSmramRangeCount == TempSmramRangeCount); *FullSmramRangeCount += AdditionSmramRangeCount; - FreePool (SmramRanges); - FreePool (SmramReservedRanges); - FreePool (TempSmramRanges); +Done: + if (SmramRanges != NULL) { + FreePool (SmramRanges); + } + + if (SmramReservedRanges != NULL) { + FreePool (SmramReservedRanges); + } + + if (TempSmramRanges != NULL) { + FreePool (TempSmramRanges); + } + + if (EFI_ERROR (Status)) { + return NULL; + } return FullSmramRanges; } diff --git a/MdeModulePkg/Core/PiSmmCore/Pool.c b/MdeModulePkg/Core/PiSmmCore/Pool.c index e1ff40a8ea55..d86bef11074f 100644 --- a/MdeModulePkg/Core/PiSmmCore/Pool.c +++ b/MdeModulePkg/Core/PiSmmCore/Pool.c @@ -191,10 +191,11 @@ InternalAllocPoolByIndex ( @retval EFI_SUCCESS Pool successfully freed. **/ +STATIC EFI_STATUS InternalFreePoolByIndex ( IN FREE_POOL_HEADER *FreePoolHdr, - IN POOL_TAIL *PoolTail + IN POOL_TAIL *PoolTail OPTIONAL ) { UINTN PoolIndex; @@ -210,8 +211,11 @@ InternalFreePoolByIndex ( FreePoolHdr->Header.Signature = 0; FreePoolHdr->Header.Available = TRUE; FreePoolHdr->Header.Type = 0; - PoolTail->Signature = 0; - PoolTail->Size = 0; + if (PoolTail != NULL) { + PoolTail->Signature = 0; + PoolTail->Size = 0; + } + ASSERT (PoolIndex < MAX_POOL_INDEX); InsertHeadList (&mSmmPoolLists[SmmPoolType][PoolIndex], &FreePoolHdr->Link); return EFI_SUCCESS; diff --git a/MdeModulePkg/Core/PiSmmCore/SmiHandlerProfile.c b/MdeModulePkg/Core/PiSmmCore/SmiHandlerProfile.c index e48532c0fb79..f202e7d6795c 100644 --- a/MdeModulePkg/Core/PiSmmCore/SmiHandlerProfile.c +++ b/MdeModulePkg/Core/PiSmmCore/SmiHandlerProfile.c @@ -344,7 +344,9 @@ GetSmmLoadedImage ( if (RealImageBase != 0) { PdbString = PeCoffLoaderGetPdbPointer ((VOID *)(UINTN)RealImageBase); - DEBUG ((DEBUG_INFO, " pdb - %a\n", PdbString)); + if (PdbString != NULL) { + DEBUG ((DEBUG_INFO, " pdb - %a\n", PdbString)); + } } else { PdbString = NULL; } diff --git a/MdeModulePkg/Core/PiSmmCore/SmramProfileRecord.c b/MdeModulePkg/Core/PiSmmCore/SmramProfileRecord.c index 7c90c91235fb..fb9ae9ad55b5 100644 --- a/MdeModulePkg/Core/PiSmmCore/SmramProfileRecord.c +++ b/MdeModulePkg/Core/PiSmmCore/SmramProfileRecord.c @@ -1393,8 +1393,11 @@ SmmCoreUpdateProfileFree ( } } - ASSERT (DriverInfoData != NULL); - ASSERT (AllocInfoData != NULL); + if ((DriverInfoData == NULL) || (AllocInfoData == NULL)) { + ASSERT (DriverInfoData != NULL); + ASSERT (AllocInfoData != NULL); + return EFI_NOT_FOUND; + } Found = TRUE; From dee7ea0bb14e42d0e1f1d23079993a0c66b7c49f Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Wed, 22 Oct 2025 11:33:02 -0700 Subject: [PATCH 0795/1172] MdeModulePkg: Fix comparison with wider widths. https://codeql.github.com/codeql-query-help/cpp/cpp-comparison-with-wider-type If the narrow type (smaller range) is compared against a wide type (larger range), the narrow value may overflow before reaching the wide value. This can cause unexpected behavior, such as: Infinite loops (loop condition never becomes false). Incorrect logic (comparison results are misleading). Signed-off-by: Aaron Pop --- .../Universal/SetupBrowserDxe/Expression.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c b/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c index d21930b31a07..4aa698109ad1 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c @@ -2708,16 +2708,18 @@ EvaluateExpression ( ASSERT (StrPtr != NULL); TempLength = StrLen (StrPtr); if (OpCode->ValueWidth >= ((TempLength + 1) / 2)) { + UINTN Index2; + Value->Type = OpCode->ValueType; TempBuffer = (UINT8 *)&Value->Value; ZeroMem (TempStr, sizeof (TempStr)); - for (Index = 0; Index < TempLength; Index++) { - TempStr[0] = StrPtr[TempLength - Index - 1]; + for (Index2 = 0; Index2 < TempLength; Index2++) { + TempStr[0] = StrPtr[TempLength - Index2 - 1]; DigitUint8 = (UINT8)StrHexToUint64 (TempStr); - if ((Index & 1) == 0) { - TempBuffer[Index/2] = DigitUint8; + if ((Index2 & 1) == 0) { + TempBuffer[Index2/2] = DigitUint8; } else { - TempBuffer[Index/2] = (UINT8)((DigitUint8 << 4) + TempBuffer[Index/2]); + TempBuffer[Index2/2] = (UINT8)((DigitUint8 << 4) + TempBuffer[Index2/2]); } } } @@ -3012,8 +3014,7 @@ EvaluateExpression ( // Value->Value.string = NewString (gEmptyString, FormSet->HiiHandle); } else { - Index = (UINT16)Value->Value.u64; - Value->Value.string = Index; + Value->Value.string = (UINT16)Value->Value.u64; FreePool (StrPtr); } From 8c92e6ee806ff7e7e8f561cc2540c755ed3a3495 Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Wed, 22 Oct 2025 11:33:02 -0700 Subject: [PATCH 0796/1172] MdeModulePkg: Fix missing NULL tests. https://github.com/github/codeql/blob/codeql-cli-2.7.3/cpp/ql/src/Critical/MissingNullTest.qhelp For items which allocate memory, or get a pointer from another structure, it is important to validate that the pointers are not null before they are dereferenced. Signed-off-by: Aaron Pop --- .../Universal/SetupBrowserDxe/Expression.c | 83 ++- .../Universal/SetupBrowserDxe/IfrParse.c | 513 +++++++++++++++--- .../Universal/SetupBrowserDxe/Presentation.c | 78 ++- .../Universal/SetupBrowserDxe/Setup.c | 274 ++++++++-- 4 files changed, 777 insertions(+), 171 deletions(-) diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c b/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c index 4aa698109ad1..0de5eef6f18c 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c @@ -1173,10 +1173,19 @@ IfrToString ( } else { SrcBuf = GetBufferForValue (&Value); SrcLen = GetLengthForValue (&Value); + if ((SrcBuf == NULL) || (SrcLen == 0)) { + ASSERT (SrcBuf != NULL); + ASSERT (SrcLen != 0); + return EFI_NOT_FOUND; + } } TmpBuf = AllocateZeroPool (SrcLen + 3); - ASSERT (TmpBuf != NULL); + if (TmpBuf == NULL) { + ASSERT (TmpBuf != NULL); + return EFI_OUT_OF_RESOURCES; + } + if (Format == EFI_IFR_STRING_ASCII) { CopyMem (TmpBuf, SrcBuf, SrcLen); PrintFormat = L"%a"; @@ -1286,7 +1295,8 @@ IfrToUint ( Evaluate opcode EFI_IFR_CATENATE. @param FormSet Formset which contains this opcode. - @param Result Evaluation result for this opcode. + @param Result Evaluation result for this opcode. Result + will be NULL on a failure. @retval EFI_SUCCESS Opcode evaluation success. @retval Other Opcode evaluation failed. @@ -1350,6 +1360,11 @@ IfrCatenate ( MaxLen = (StrSize (String[1]) + Size) / sizeof (CHAR16); StringPtr = AllocatePool (MaxLen * sizeof (CHAR16)); ASSERT (StringPtr != NULL); + + if (StringPtr == NULL) { + return EFI_OUT_OF_RESOURCES; + } + StrCpyS (StringPtr, MaxLen, String[1]); StrCatS (StringPtr, MaxLen, String[0]); @@ -1365,10 +1380,20 @@ IfrCatenate ( ASSERT (Result->Buffer != NULL); TmpBuf = GetBufferForValue (&Value[0]); - ASSERT (TmpBuf != NULL); + if (TmpBuf == NULL) { + ASSERT (TmpBuf != NULL); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + CopyMem (Result->Buffer, TmpBuf, Length0); TmpBuf = GetBufferForValue (&Value[1]); - ASSERT (TmpBuf != NULL); + if (TmpBuf == NULL) { + ASSERT (TmpBuf != NULL); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + CopyMem (&Result->Buffer[Length0], TmpBuf, Length1); } @@ -1393,6 +1418,10 @@ IfrCatenate ( FreePool (StringPtr); } + if (EFI_ERROR (Status) && (Result != NULL)) { + FreePool (Result); + } + return Status; } @@ -1561,7 +1590,11 @@ IfrMatch2 ( goto Done; } - ASSERT (HandleBuffer != NULL); + if (HandleBuffer == NULL) { + ASSERT (HandleBuffer != NULL); + goto Done; + } + for ( Index = 0; Index < BufferSize / sizeof (EFI_HANDLE); Index++) { Status = gBS->HandleProtocol ( HandleBuffer[Index], @@ -1830,6 +1863,9 @@ IfrMid ( } else { BufferLen = GetLengthForValue (&Value[2]); Buffer = GetBufferForValue (&Value[2]); + if (Buffer == NULL) { + return EFI_INVALID_PARAMETER; + } Result->Type = EFI_IFR_TYPE_BUFFER; if ((Length == 0) || (Base >= BufferLen)) { @@ -2257,6 +2293,9 @@ CompareHiiValue ( Buf1Len = GetLengthForValue (Value1); Buf2 = GetBufferForValue (Value2); Buf2Len = GetLengthForValue (Value2); + if ((Buf1 == NULL) || (Buf2 == NULL)) { + return EFI_INVALID_PARAMETER; + } Len = Buf1Len > Buf2Len ? Buf2Len : Buf1Len; *Result = CompareMem (Buf1, Buf2, Len); @@ -2458,7 +2497,12 @@ GetQuestionValueFromForm ( // Get the formset data include this question. // FormSet = AllocateZeroPool (sizeof (FORM_BROWSER_FORMSET)); - ASSERT (FormSet != NULL); + if (FormSet == NULL) { + ASSERT (FormSet != NULL); + GetTheVal = FALSE; + goto Done; + } + Status = InitializeFormSet (HiiHandle, FormSetGuid, FormSet); if (EFI_ERROR (Status)) { GetTheVal = FALSE; @@ -2490,18 +2534,24 @@ GetQuestionValueFromForm ( Form = NULL; } - ASSERT (Form != NULL); + if (Form == NULL ) { + ASSERT (Form != NULL); + GetTheVal = FALSE; + goto Done; + } // // Get the question value. // - Status = GetQuestionValue (FormSet, Form, Question, GetSetValueWithEditBuffer); - if (EFI_ERROR (Status)) { - GetTheVal = FALSE; - goto Done; - } + if (Question != NULL) { + Status = GetQuestionValue (FormSet, Form, Question, GetSetValueWithEditBuffer); + if (EFI_ERROR (Status)) { + GetTheVal = FALSE; + goto Done; + } - CopyMem (Value, &Question->HiiValue, sizeof (EFI_HII_VALUE)); + CopyMem (Value, &Question->HiiValue, sizeof (EFI_HII_VALUE)); + } Done: // @@ -3170,7 +3220,12 @@ EvaluateExpression ( case EFI_HII_VARSTORE_NAME_VALUE: if (OpCode->ValueType != EFI_IFR_TYPE_STRING) { NameValue = AllocateZeroPool ((OpCode->ValueWidth * 2 + 1) * sizeof (CHAR16)); - ASSERT (NameValue != NULL); + if (NameValue == NULL) { + ASSERT (NameValue != NULL); + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } + // // Convert Buffer to Hex String // diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c b/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c index ed8f9965bec5..f8848f42e1b7 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c @@ -180,14 +180,29 @@ CreateQuestion ( // Insert to Name/Value varstore list // NameValueNode = AllocateZeroPool (sizeof (NAME_VALUE_NODE)); - ASSERT (NameValueNode != NULL); + if (NameValueNode == NULL) { + ASSERT (NameValueNode != NULL); + return NULL; + } + NameValueNode->Signature = NAME_VALUE_NODE_SIGNATURE; NameValueNode->Name = AllocateCopyPool (StrSize (Statement->VariableName), Statement->VariableName); - ASSERT (NameValueNode->Name != NULL); + if (NameValueNode->Name == NULL) { + ASSERT (NameValueNode->Name != NULL); + goto ErrorExit; + } + NameValueNode->Value = AllocateZeroPool (0x10); - ASSERT (NameValueNode->Value != NULL); + if (NameValueNode->Value == NULL) { + ASSERT (NameValueNode->Value != NULL); + goto ErrorExit; + } + NameValueNode->EditValue = AllocateZeroPool (0x10); - ASSERT (NameValueNode->EditValue != NULL); + if (NameValueNode->EditValue == NULL) { + ASSERT (NameValueNode->EditValue != NULL); + goto ErrorExit; + } InsertTailList (&Statement->Storage->NameValueListHead, &NameValueNode->Link); } @@ -195,6 +210,25 @@ CreateQuestion ( } return Statement; + +ErrorExit: + if (NameValueNode != NULL) { + if (NameValueNode->Name != NULL) { + FreePool (NameValueNode->Name); + } + + if (NameValueNode->Value != NULL) { + FreePool (NameValueNode->Value); + } + + if (NameValueNode->EditValue != NULL) { + FreePool (NameValueNode->EditValue); + } + + FreePool (NameValueNode); + } + + return NULL; } /** @@ -215,7 +249,11 @@ CreateExpression ( FORM_EXPRESSION *Expression; Expression = AllocateZeroPool (sizeof (FORM_EXPRESSION)); - ASSERT (Expression != NULL); + if (Expression == NULL) { + ASSERT (Expression != NULL); + return NULL; + } + Expression->Signature = FORM_EXPRESSION_SIGNATURE; InitializeListHead (&Expression->OpCodeListHead); Expression->OpCode = (EFI_IFR_OP_HEADER *)OpCode; @@ -413,7 +451,10 @@ CreateStorage ( } if (StorageType != EFI_HII_VARSTORE_NAME_VALUE) { - ASSERT (StorageName != NULL); + if (StorageName == NULL) { + ASSERT (StorageName != NULL); + goto ErrorExit; + } UnicodeString = AllocateZeroPool (AsciiStrSize (StorageName) * 2); ASSERT (UnicodeString != NULL); @@ -423,14 +464,23 @@ CreateStorage ( } Storage = AllocateZeroPool (sizeof (FORMSET_STORAGE)); - ASSERT (Storage != NULL); + + if (Storage == NULL) { + ASSERT (Storage != NULL); + goto ErrorExit; + } + Storage->Signature = FORMSET_STORAGE_SIGNATURE; InsertTailList (&FormSet->StorageListHead, &Storage->Link); BrowserStorage = FindStorageInList (StorageType, StorageGuid, UnicodeString, FormSet->HiiHandle); if (BrowserStorage == NULL) { BrowserStorage = AllocateZeroPool (sizeof (BROWSER_STORAGE)); - ASSERT (BrowserStorage != NULL); + + if (BrowserStorage == NULL) { + ASSERT (BrowserStorage != NULL); + goto ErrorExit; + } BrowserStorage->Signature = BROWSER_STORAGE_SIGNATURE; InsertTailList (&gBrowserStorageList, &BrowserStorage->Link); @@ -449,9 +499,34 @@ CreateStorage ( Storage->BrowserStorage = BrowserStorage; InitializeConfigHdr (FormSet, Storage); Storage->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigHdr), Storage->ConfigHdr); - Storage->SpareStrLen = 0; + + if (Storage->ConfigRequest == NULL) { + ASSERT (Storage->ConfigRequest != NULL); + goto ErrorExit; + } + + Storage->SpareStrLen = 0; return Storage; + +ErrorExit: + if (UnicodeString != NULL) { + FreePool (UnicodeString); + } + + if (BrowserStorage != NULL) { + FreePool (BrowserStorage); + } + + if (Storage != NULL) { + if (Storage->ConfigRequest != NULL) { + FreePool (Storage->ConfigRequest); + } + + FreePool (Storage); + } + + return NULL; } /** @@ -663,7 +738,11 @@ InitializeRequestElement ( if (!Find) { ConfigInfo = AllocateZeroPool (sizeof (FORM_BROWSER_CONFIG_REQUEST)); - ASSERT (ConfigInfo != NULL); + if (ConfigInfo == NULL) { + ASSERT (ConfigInfo != NULL); + return EFI_OUT_OF_RESOURCES; + } + ConfigInfo->Signature = FORM_BROWSER_CONFIG_REQUEST_SIGNATURE; ConfigInfo->ConfigRequest = AllocateCopyPool (StrSize (FormsetStorage->ConfigHdr), FormsetStorage->ConfigHdr); ASSERT (ConfigInfo->ConfigRequest != NULL); @@ -672,6 +751,10 @@ InitializeRequestElement ( InsertTailList (&Form->ConfigRequestHead, &ConfigInfo->Link); } + if (ConfigInfo == NULL) { + return EFI_NOT_FOUND; + } + StringSize = (ConfigInfo->ConfigRequest != NULL) ? StrSize (ConfigInfo->ConfigRequest) : sizeof (CHAR16); MaxLen = StringSize / sizeof (CHAR16) + ConfigInfo->SpareStrLen; @@ -1374,7 +1457,10 @@ ParseOpCodes ( case EFI_IFR_THIS_OP: ASSERT (ParentStatement != NULL); - ExpressionOpCode->QuestionId = ParentStatement->QuestionId; + if (ParentStatement != NULL) { + ExpressionOpCode->QuestionId = ParentStatement->QuestionId; + } + break; case EFI_IFR_SECURITY_OP: @@ -1551,14 +1637,25 @@ ParseOpCodes ( // if ((CurrentExpression == NULL) && (MapScopeDepth > 0)) { CurrentExpression = CreateExpression (CurrentForm, OpCodeData); + if (CurrentExpression == NULL) { + ASSERT (CurrentExpression != NULL); + return EFI_OUT_OF_RESOURCES; + } + ASSERT (MapExpressionList != NULL); - InsertTailList (MapExpressionList, &CurrentExpression->Link); - if (Scope == 0) { - SingleOpCodeExpression = TRUE; + if (MapExpressionList != NULL) { + InsertTailList (MapExpressionList, &CurrentExpression->Link); + if (Scope == 0) { + SingleOpCodeExpression = TRUE; + } } } - ASSERT (CurrentExpression != NULL); + if (CurrentExpression == NULL) { + ASSERT (CurrentExpression != NULL); + return EFI_INVALID_PARAMETER; + } + InsertTailList (&CurrentExpression->OpCodeListHead, &ExpressionOpCode->Link); if (Operand == EFI_IFR_MAP_OP) { // @@ -1591,12 +1688,16 @@ ParseOpCodes ( // // This is DisableIf expression for Form, it should be a constant expression // - Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression); - if (EFI_ERROR (Status)) { - return Status; - } + if (CurrentForm != NULL) { + Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression); + if (EFI_ERROR (Status)) { + return Status; + } - OpCodeDisabled = IsTrue (&CurrentExpression->Result); + if (CurrentExpression != NULL) { + OpCodeDisabled = IsTrue (&CurrentExpression->Result); + } + } } CurrentExpression = NULL; @@ -1636,7 +1737,11 @@ ParseOpCodes ( // Create a new Form for this FormSet // CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM)); - ASSERT (CurrentForm != NULL); + if (CurrentForm == NULL) { + ASSERT (CurrentForm != NULL); + return EFI_OUT_OF_RESOURCES; + } + CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE; InitializeListHead (&CurrentForm->ExpressionListHead); InitializeListHead (&CurrentForm->StatementListHead); @@ -1655,7 +1760,12 @@ ParseOpCodes ( CurrentForm->SuppressExpression = (FORM_EXPRESSION_LIST *)AllocatePool ( (UINTN)(sizeof (FORM_EXPRESSION_LIST) + ((ConditionalExprCount -1) * sizeof (FORM_EXPRESSION *))) ); - ASSERT (CurrentForm->SuppressExpression != NULL); + if (CurrentForm->SuppressExpression == NULL) { + ASSERT (CurrentForm->SuppressExpression != NULL); + FreePool (CurrentForm); + return EFI_OUT_OF_RESOURCES; + } + CurrentForm->SuppressExpression->Count = (UINTN)ConditionalExprCount; CurrentForm->SuppressExpression->Signature = FORM_EXPRESSION_LIST_SIGNATURE; CopyMem (CurrentForm->SuppressExpression->Expression, GetConditionalExpressionList (ExpressForm), (UINTN)(sizeof (FORM_EXPRESSION *) * ConditionalExprCount)); @@ -1679,7 +1789,11 @@ ParseOpCodes ( // Create a new Form for this FormSet // CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM)); - ASSERT (CurrentForm != NULL); + if (CurrentForm == NULL) { + ASSERT (CurrentForm != NULL); + return EFI_OUT_OF_RESOURCES; + } + CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE; InitializeListHead (&CurrentForm->ExpressionListHead); InitializeListHead (&CurrentForm->StatementListHead); @@ -1725,7 +1839,13 @@ ParseOpCodes ( CurrentForm->SuppressExpression = (FORM_EXPRESSION_LIST *)AllocatePool ( (UINTN)(sizeof (FORM_EXPRESSION_LIST) + ((ConditionalExprCount -1) * sizeof (FORM_EXPRESSION *))) ); - ASSERT (CurrentForm->SuppressExpression != NULL); + + if (CurrentForm->SuppressExpression == NULL) { + ASSERT (CurrentForm->SuppressExpression != NULL); + FreePool (CurrentForm); + return EFI_OUT_OF_RESOURCES; + } + CurrentForm->SuppressExpression->Count = (UINTN)ConditionalExprCount; CurrentForm->SuppressExpression->Signature = FORM_EXPRESSION_LIST_SIGNATURE; CopyMem (CurrentForm->SuppressExpression->Expression, GetConditionalExpressionList (ExpressForm), (UINTN)(sizeof (FORM_EXPRESSION *) * ConditionalExprCount)); @@ -1752,6 +1872,10 @@ ParseOpCodes ( // Create a buffer Storage for this FormSet // Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_BUFFER, OpCodeData); + if (Storage == NULL) { + return EFI_OUT_OF_RESOURCES; + } + CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE *)OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID)); break; @@ -1760,6 +1884,10 @@ ParseOpCodes ( // Create a name/value Storage for this FormSet // Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_NAME_VALUE, OpCodeData); + if (Storage == NULL) { + return EFI_OUT_OF_RESOURCES; + } + CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_NAME_VALUE *)OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID)); break; @@ -1779,6 +1907,10 @@ ParseOpCodes ( Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER, OpCodeData); } + if (Storage == NULL) { + return EFI_OUT_OF_RESOURCES; + } + CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_EFI *)OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID)); break; @@ -1788,7 +1920,11 @@ ParseOpCodes ( case EFI_IFR_DEFAULTSTORE_OP: HaveInserted = FALSE; DefaultStore = AllocateZeroPool (sizeof (FORMSET_DEFAULTSTORE)); - ASSERT (DefaultStore != NULL); + if (DefaultStore == NULL) { + ASSERT (DefaultStore != NULL); + return EFI_OUT_OF_RESOURCES; + } + DefaultStore->Signature = FORMSET_DEFAULTSTORE_SIGNATURE; CopyMem (&DefaultStore->DefaultId, &((EFI_IFR_DEFAULTSTORE *)OpCodeData)->DefaultId, sizeof (UINT16)); @@ -1822,22 +1958,32 @@ ParseOpCodes ( CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm); ASSERT (CurrentStatement != NULL); - CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *)OpCodeData)->Flags; - CurrentStatement->FakeQuestionId = mUsedQuestionId++; + if (CurrentStatement != NULL) { + CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *)OpCodeData)->Flags; + CurrentStatement->FakeQuestionId = mUsedQuestionId++; + } + break; case EFI_IFR_TEXT_OP: CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm); ASSERT (CurrentStatement != NULL); - CurrentStatement->FakeQuestionId = mUsedQuestionId++; - CopyMem (&CurrentStatement->TextTwo, &((EFI_IFR_TEXT *)OpCodeData)->TextTwo, sizeof (EFI_STRING_ID)); + if (CurrentStatement != NULL) { + CurrentStatement->FakeQuestionId = mUsedQuestionId++; + CopyMem (&CurrentStatement->TextTwo, &((EFI_IFR_TEXT *)OpCodeData)->TextTwo, sizeof (EFI_STRING_ID)); + } + break; case EFI_IFR_RESET_BUTTON_OP: CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm); ASSERT (CurrentStatement != NULL); - CurrentStatement->FakeQuestionId = mUsedQuestionId++; - CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *)OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID)); + + if (CurrentStatement != NULL) { + CurrentStatement->FakeQuestionId = mUsedQuestionId++; + CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *)OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID)); + } + break; // @@ -1846,6 +1992,11 @@ ParseOpCodes ( case EFI_IFR_ACTION_OP: CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm); ASSERT (CurrentStatement != NULL); + + if (CurrentStatement == NULL) { + break; + } + CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_ACTION; if (OpCodeLength == sizeof (EFI_IFR_ACTION_1)) { @@ -1861,7 +2012,11 @@ ParseOpCodes ( case EFI_IFR_REF_OP: CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm); - ASSERT (CurrentStatement != NULL); + if (CurrentStatement == NULL) { + ASSERT (CurrentStatement != NULL); + break; + } + Value = &CurrentStatement->HiiValue; Value->Type = EFI_IFR_TYPE_REF; if (OpCodeLength >= sizeof (EFI_IFR_REF)) { @@ -1881,13 +2036,21 @@ ParseOpCodes ( } CurrentStatement->StorageWidth = (UINT16)sizeof (EFI_HII_REF); + if (CurrentForm == NULL) { + break; + } + InitializeRequestElement (FormSet, CurrentStatement, CurrentForm); break; case EFI_IFR_ONE_OF_OP: case EFI_IFR_NUMERIC_OP: CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm); - ASSERT (CurrentStatement != NULL); + + if (CurrentStatement == NULL) { + ASSERT (CurrentStatement != NULL); + break; + } CurrentStatement->Flags = ((EFI_IFR_ONE_OF *)OpCodeData)->Flags; Value = &CurrentStatement->HiiValue; @@ -1981,7 +2144,9 @@ ParseOpCodes ( } } - InitializeRequestElement (FormSet, CurrentStatement, CurrentForm); + if (CurrentForm != NULL) { + InitializeRequestElement (FormSet, CurrentStatement, CurrentForm); + } if ((Operand == EFI_IFR_ONE_OF_OP) && (Scope != 0)) { SuppressForOption = TRUE; @@ -1991,7 +2156,11 @@ ParseOpCodes ( case EFI_IFR_ORDERED_LIST_OP: CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm); - ASSERT (CurrentStatement != NULL); + + if (CurrentStatement == NULL) { + ASSERT (CurrentStatement != NULL); + break; + } CurrentStatement->Flags = ((EFI_IFR_ORDERED_LIST *)OpCodeData)->Flags; CurrentStatement->MaxContainers = ((EFI_IFR_ORDERED_LIST *)OpCodeData)->MaxContainers; @@ -2007,7 +2176,11 @@ ParseOpCodes ( case EFI_IFR_CHECKBOX_OP: CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm); - ASSERT (CurrentStatement != NULL); + + if (CurrentStatement == NULL) { + ASSERT (CurrentStatement != NULL); + break; + } CurrentStatement->Flags = ((EFI_IFR_CHECKBOX *)OpCodeData)->Flags; CurrentStatement->StorageWidth = (UINT16)sizeof (BOOLEAN); @@ -2025,13 +2198,20 @@ ParseOpCodes ( CurrentStatement->StorageWidth = (TotalBits % 8 == 0 ? TotalBits / 8 : TotalBits / 8 + 1); } - InitializeRequestElement (FormSet, CurrentStatement, CurrentForm); + if (CurrentForm != NULL) { + InitializeRequestElement (FormSet, CurrentStatement, CurrentForm); + } break; case EFI_IFR_STRING_OP: CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm); - ASSERT (CurrentStatement != NULL); + + if (CurrentStatement == NULL) { + ASSERT (CurrentStatement != NULL); + break; + } + // // MinSize is the minimum number of characters that can be accepted for this opcode, // MaxSize is the maximum number of characters that can be accepted for this opcode. @@ -2045,13 +2225,20 @@ ParseOpCodes ( CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING; CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth + sizeof (CHAR16)); CurrentStatement->HiiValue.Value.string = NewString ((CHAR16 *)CurrentStatement->BufferValue, FormSet->HiiHandle); + if (CurrentForm != NULL) { + InitializeRequestElement (FormSet, CurrentStatement, CurrentForm); + } - InitializeRequestElement (FormSet, CurrentStatement, CurrentForm); break; case EFI_IFR_PASSWORD_OP: CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm); - ASSERT (CurrentStatement != NULL); + + if (CurrentStatement == NULL) { + ASSERT (CurrentStatement != NULL); + break; + } + // // MinSize is the minimum number of characters that can be accepted for this opcode, // MaxSize is the maximum number of characters that can be accepted for this opcode. @@ -2064,21 +2251,28 @@ ParseOpCodes ( CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING; CurrentStatement->BufferValue = AllocateZeroPool ((CurrentStatement->StorageWidth + sizeof (CHAR16))); CurrentStatement->HiiValue.Value.string = NewString ((CHAR16 *)CurrentStatement->BufferValue, FormSet->HiiHandle); + if (CurrentForm != NULL) { + InitializeRequestElement (FormSet, CurrentStatement, CurrentForm); + } - InitializeRequestElement (FormSet, CurrentStatement, CurrentForm); break; case EFI_IFR_DATE_OP: CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm); - ASSERT (CurrentStatement != NULL); + + if (CurrentStatement == NULL) { + ASSERT (CurrentStatement != NULL); + break; + } CurrentStatement->Flags = ((EFI_IFR_DATE *)OpCodeData)->Flags; CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_DATE; if ((CurrentStatement->Flags & EFI_QF_DATE_STORAGE) == QF_DATE_STORAGE_NORMAL) { CurrentStatement->StorageWidth = (UINT16)sizeof (EFI_HII_DATE); - - InitializeRequestElement (FormSet, CurrentStatement, CurrentForm); + if (CurrentForm != NULL) { + InitializeRequestElement (FormSet, CurrentStatement, CurrentForm); + } } else { // // Don't assign storage for RTC type of date/time @@ -2091,7 +2285,11 @@ ParseOpCodes ( case EFI_IFR_TIME_OP: CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm); - ASSERT (CurrentStatement != NULL); + + if (CurrentStatement == NULL) { + ASSERT (CurrentStatement != NULL); + break; + } CurrentStatement->Flags = ((EFI_IFR_TIME *)OpCodeData)->Flags; CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_TIME; @@ -2099,7 +2297,9 @@ ParseOpCodes ( if ((CurrentStatement->Flags & QF_TIME_STORAGE) == QF_TIME_STORAGE_NORMAL) { CurrentStatement->StorageWidth = (UINT16)sizeof (EFI_HII_TIME); - InitializeRequestElement (FormSet, CurrentStatement, CurrentForm); + if (CurrentForm != NULL) { + InitializeRequestElement (FormSet, CurrentStatement, CurrentForm); + } } else { // // Don't assign storage for RTC type of date/time @@ -2120,7 +2320,11 @@ ParseOpCodes ( // A Question may have more than one Default value which have different default types. // CurrentDefault = AllocateZeroPool (sizeof (QUESTION_DEFAULT)); - ASSERT (CurrentDefault != NULL); + if (CurrentDefault == NULL) { + ASSERT (CurrentDefault != NULL); + return EFI_OUT_OF_RESOURCES; + } + CurrentDefault->Signature = QUESTION_DEFAULT_SIGNATURE; CurrentDefault->Value.Type = ((EFI_IFR_DEFAULT *)OpCodeData)->Type; @@ -2128,7 +2332,11 @@ ParseOpCodes ( if (CurrentDefault->Value.Type == EFI_IFR_TYPE_BUFFER) { CurrentDefault->Value.BufferLen = (UINT16)(OpCodeLength - OFFSET_OF (EFI_IFR_DEFAULT, Value)); CurrentDefault->Value.Buffer = AllocateCopyPool (CurrentDefault->Value.BufferLen, &((EFI_IFR_DEFAULT *)OpCodeData)->Value); - ASSERT (CurrentDefault->Value.Buffer != NULL); + if (CurrentDefault->Value.Buffer == NULL) { + ASSERT (CurrentDefault->Value.Buffer != NULL); + FreePool (CurrentDefault); + return EFI_OUT_OF_RESOURCES; + } } else { CopyMem (&CurrentDefault->Value.Value, &((EFI_IFR_DEFAULT *)OpCodeData)->Value, OpCodeLength - OFFSET_OF (EFI_IFR_DEFAULT, Value)); ExtendValueToU64 (&CurrentDefault->Value); @@ -2137,7 +2345,9 @@ ParseOpCodes ( // // Insert to Default Value list of current Question // - InsertTailList (&ParentStatement->DefaultListHead, &CurrentDefault->Link); + if (ParentStatement != NULL) { + InsertTailList (&ParentStatement->DefaultListHead, &CurrentDefault->Link); + } if (Scope != 0) { InScopeDefault = TRUE; @@ -2149,13 +2359,21 @@ ParseOpCodes ( // Option // case EFI_IFR_ONE_OF_OPTION_OP: - ASSERT (ParentStatement != NULL); + if (ParentStatement == NULL) { + ASSERT (ParentStatement != NULL); + break; + } + if ((ParentStatement->Operand == EFI_IFR_ORDERED_LIST_OP) && ((((EFI_IFR_ONE_OF_OPTION *)OpCodeData)->Flags & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) != 0)) { // // It's keep the default value for ordered list opcode. // CurrentDefault = AllocateZeroPool (sizeof (QUESTION_DEFAULT)); - ASSERT (CurrentDefault != NULL); + if (CurrentDefault == NULL) { + ASSERT (CurrentDefault != NULL); + return EFI_OUT_OF_RESOURCES; + } + CurrentDefault->Signature = QUESTION_DEFAULT_SIGNATURE; CurrentDefault->Value.Type = EFI_IFR_TYPE_BUFFER; @@ -2167,7 +2385,11 @@ ParseOpCodes ( CurrentDefault->Value.BufferLen = (UINT16)(OpCodeLength - OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value)); CurrentDefault->Value.Buffer = AllocateCopyPool (CurrentDefault->Value.BufferLen, &((EFI_IFR_ONE_OF_OPTION *)OpCodeData)->Value); - ASSERT (CurrentDefault->Value.Buffer != NULL); + if (CurrentDefault->Value.Buffer == NULL) { + ASSERT (CurrentDefault->Value.Buffer != NULL); + FreePool (CurrentDefault); + return EFI_OUT_OF_RESOURCES; + } // // Insert to Default Value list of current Question @@ -2181,7 +2403,17 @@ ParseOpCodes ( // It create a selection for use in current Question. // CurrentOption = AllocateZeroPool (sizeof (QUESTION_OPTION)); - ASSERT (CurrentOption != NULL); + if (CurrentOption == NULL) { + ASSERT (CurrentOption != NULL); + if (CurrentDefault != NULL) { + FreePool (CurrentDefault->Value.Buffer); + RemoveEntryList (&CurrentDefault->Link); + FreePool (CurrentDefault); + } + + return EFI_OUT_OF_RESOURCES; + } + CurrentOption->Signature = QUESTION_OPTION_SIGNATURE; CurrentOption->OpCode = (EFI_IFR_ONE_OF_OPTION *)OpCodeData; @@ -2199,7 +2431,18 @@ ParseOpCodes ( CurrentOption->SuppressExpression = (FORM_EXPRESSION_LIST *)AllocatePool ( (UINTN)(sizeof (FORM_EXPRESSION_LIST) + ((ConditionalExprCount -1) * sizeof (FORM_EXPRESSION *))) ); - ASSERT (CurrentOption->SuppressExpression != NULL); + if (CurrentOption->SuppressExpression == NULL) { + ASSERT (CurrentOption->SuppressExpression != NULL); + FreePool (CurrentOption); + if (CurrentDefault != NULL) { + FreePool (CurrentDefault->Value.Buffer); + RemoveEntryList (&CurrentDefault->Link); + FreePool (CurrentDefault); + } + + return EFI_OUT_OF_RESOURCES; + } + CurrentOption->SuppressExpression->Count = (UINTN)ConditionalExprCount; CurrentOption->SuppressExpression->Signature = FORM_EXPRESSION_LIST_SIGNATURE; CopyMem (CurrentOption->SuppressExpression->Expression, GetConditionalExpressionList (ExpressOption), (UINTN)(sizeof (FORM_EXPRESSION *) * ConditionalExprCount)); @@ -2208,6 +2451,10 @@ ParseOpCodes ( // // Insert to Option list of current Question // + if (ParentStatement != NULL) { + break; + } + InsertTailList (&ParentStatement->OptionListHead, &CurrentOption->Link); // // Now we know the Storage width of nested Ordered List @@ -2246,7 +2493,9 @@ ParseOpCodes ( ParentStatement->HiiValue.BufferLen = ParentStatement->StorageWidth; } - InitializeRequestElement (FormSet, ParentStatement, CurrentForm); + if (CurrentForm != NULL) { + InitializeRequestElement (FormSet, ParentStatement, CurrentForm); + } } break; @@ -2260,14 +2509,22 @@ ParseOpCodes ( // Create an Expression node // CurrentExpression = CreateExpression (CurrentForm, OpCodeData); + if (CurrentExpression == NULL) { + return EFI_OUT_OF_RESOURCES; + } + CopyMem (&CurrentExpression->Error, &((EFI_IFR_INCONSISTENT_IF *)OpCodeData)->Error, sizeof (EFI_STRING_ID)); if (Operand == EFI_IFR_NO_SUBMIT_IF_OP) { CurrentExpression->Type = EFI_HII_EXPRESSION_NO_SUBMIT_IF; - InsertTailList (&ParentStatement->NoSubmitListHead, &CurrentExpression->Link); + if (ParentStatement != NULL) { + InsertTailList (&ParentStatement->NoSubmitListHead, &CurrentExpression->Link); + } } else { CurrentExpression->Type = EFI_HII_EXPRESSION_INCONSISTENT_IF; - InsertTailList (&ParentStatement->InconsistentListHead, &CurrentExpression->Link); + if (ParentStatement != NULL) { + InsertTailList (&ParentStatement->InconsistentListHead, &CurrentExpression->Link); + } } // @@ -2285,10 +2542,16 @@ ParseOpCodes ( // Create an Expression node // CurrentExpression = CreateExpression (CurrentForm, OpCodeData); + if (CurrentExpression == NULL) { + return EFI_OUT_OF_RESOURCES; + } + CopyMem (&CurrentExpression->Error, &((EFI_IFR_WARNING_IF *)OpCodeData)->Warning, sizeof (EFI_STRING_ID)); CurrentExpression->TimeOut = ((EFI_IFR_WARNING_IF *)OpCodeData)->TimeOut; CurrentExpression->Type = EFI_HII_EXPRESSION_WARNING_IF; - InsertTailList (&ParentStatement->WarningListHead, &CurrentExpression->Link); + if (ParentStatement != NULL) { + InsertTailList (&ParentStatement->WarningListHead, &CurrentExpression->Link); + } // // Take a look at next OpCode to see whether current expression consists @@ -2304,7 +2567,11 @@ ParseOpCodes ( // // Question and Option will appear in scope of this OpCode // - CurrentExpression = CreateExpression (CurrentForm, OpCodeData); + CurrentExpression = CreateExpression (CurrentForm, OpCodeData); + if (CurrentExpression == NULL) { + return EFI_OUT_OF_RESOURCES; + } + CurrentExpression->Type = EFI_HII_EXPRESSION_SUPPRESS_IF; if (CurrentForm == NULL) { @@ -2335,9 +2602,16 @@ ParseOpCodes ( // // Questions will appear in scope of this OpCode // - CurrentExpression = CreateExpression (CurrentForm, OpCodeData); + CurrentExpression = CreateExpression (CurrentForm, OpCodeData); + if (CurrentExpression == NULL) { + return EFI_OUT_OF_RESOURCES; + } + CurrentExpression->Type = EFI_HII_EXPRESSION_GRAY_OUT_IF; - InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link); + if (CurrentForm != NULL) { + InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link); + } + PushConditionalExpression (CurrentExpression, ExpressStatement); // @@ -2356,7 +2630,11 @@ ParseOpCodes ( // evaluated at initialization and it will not be queued // CurrentExpression = AllocateZeroPool (sizeof (FORM_EXPRESSION)); - ASSERT (CurrentExpression != NULL); + if (CurrentExpression == NULL) { + ASSERT (CurrentExpression != NULL); + return EFI_OUT_OF_RESOURCES; + } + CurrentExpression->Signature = FORM_EXPRESSION_SIGNATURE; CurrentExpression->Type = EFI_HII_EXPRESSION_DISABLE_IF; InitializeListHead (&CurrentExpression->OpCodeListHead); @@ -2385,15 +2663,23 @@ ParseOpCodes ( // Expression // case EFI_IFR_VALUE_OP: - CurrentExpression = CreateExpression (CurrentForm, OpCodeData); + CurrentExpression = CreateExpression (CurrentForm, OpCodeData); + if (CurrentExpression == NULL) { + return EFI_OUT_OF_RESOURCES; + } + CurrentExpression->Type = EFI_HII_EXPRESSION_VALUE; - InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link); + if (CurrentForm != NULL) { + InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link); + } if (InScopeDefault) { // // Used for default (EFI_IFR_DEFAULT) // - CurrentDefault->ValueExpression = CurrentExpression; + if (CurrentDefault != NULL) { + CurrentDefault->ValueExpression = CurrentExpression; + } } else { // // If used for a question, then the question will be read-only @@ -2404,7 +2690,9 @@ ParseOpCodes ( // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler. // ASSERT (ParentStatement != NULL); - ParentStatement->ValueExpression = CurrentExpression; + if (ParentStatement != NULL) { + ParentStatement->ValueExpression = CurrentExpression; + } } // @@ -2418,11 +2706,17 @@ ParseOpCodes ( break; case EFI_IFR_RULE_OP: - CurrentExpression = CreateExpression (CurrentForm, OpCodeData); + CurrentExpression = CreateExpression (CurrentForm, OpCodeData); + if (CurrentExpression == NULL) { + return EFI_OUT_OF_RESOURCES; + } + CurrentExpression->Type = EFI_HII_EXPRESSION_RULE; CurrentExpression->RuleId = ((EFI_IFR_RULE *)OpCodeData)->RuleId; - InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link); + if (CurrentForm != NULL) { + InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link); + } // // Take a look at next OpCode to see whether current expression consists @@ -2435,9 +2729,15 @@ ParseOpCodes ( break; case EFI_IFR_READ_OP: - CurrentExpression = CreateExpression (CurrentForm, OpCodeData); + CurrentExpression = CreateExpression (CurrentForm, OpCodeData); + if (CurrentExpression == NULL) { + return EFI_OUT_OF_RESOURCES; + } + CurrentExpression->Type = EFI_HII_EXPRESSION_READ; - InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link); + if (CurrentForm != NULL) { + InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link); + } // // Make sure CurrentStatement is not NULL. @@ -2445,7 +2745,9 @@ ParseOpCodes ( // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler. // ASSERT (ParentStatement != NULL); - ParentStatement->ReadExpression = CurrentExpression; + if (ParentStatement != NULL) { + ParentStatement->ReadExpression = CurrentExpression; + } // // Take a look at next OpCode to see whether current expression consists @@ -2458,9 +2760,15 @@ ParseOpCodes ( break; case EFI_IFR_WRITE_OP: - CurrentExpression = CreateExpression (CurrentForm, OpCodeData); + CurrentExpression = CreateExpression (CurrentForm, OpCodeData); + if (CurrentExpression == NULL) { + return EFI_OUT_OF_RESOURCES; + } + CurrentExpression->Type = EFI_HII_EXPRESSION_WRITE; - InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link); + if (CurrentForm != NULL) { + InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link); + } // // Make sure CurrentStatement is not NULL. @@ -2468,7 +2776,9 @@ ParseOpCodes ( // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler. // ASSERT (ParentStatement != NULL); - ParentStatement->WriteExpression = CurrentExpression; + if (ParentStatement != NULL) { + ParentStatement->WriteExpression = CurrentExpression; + } // // Take a look at next OpCode to see whether current expression consists @@ -2498,12 +2808,18 @@ ParseOpCodes ( case EFI_IFR_FORM_OP: case EFI_IFR_FORM_MAP_OP: ASSERT (CurrentForm != NULL); - ImageId = &CurrentForm->ImageId; + if (CurrentForm != NULL) { + ImageId = &CurrentForm->ImageId; + } + break; case EFI_IFR_ONE_OF_OPTION_OP: ASSERT (CurrentOption != NULL); - ImageId = &CurrentOption->ImageId; + if (CurrentOption != NULL) { + ImageId = &CurrentOption->ImageId; + } + break; default: @@ -2513,7 +2829,10 @@ ParseOpCodes ( // file is wrongly generated by tools such as VFR Compiler. // ASSERT (ParentStatement != NULL); - ImageId = &ParentStatement->ImageId; + if (ParentStatement != NULL) { + ImageId = &ParentStatement->ImageId; + } + break; } @@ -2526,7 +2845,10 @@ ParseOpCodes ( // case EFI_IFR_REFRESH_OP: ASSERT (ParentStatement != NULL); - ParentStatement->RefreshInterval = ((EFI_IFR_REFRESH *)OpCodeData)->RefreshInterval; + if (ParentStatement != NULL) { + ParentStatement->RefreshInterval = ((EFI_IFR_REFRESH *)OpCodeData)->RefreshInterval; + } + break; // @@ -2543,12 +2865,18 @@ ParseOpCodes ( case EFI_IFR_FORM_OP: case EFI_IFR_FORM_MAP_OP: ASSERT (CurrentForm != NULL); - CopyMem (&CurrentForm->RefreshGuid, &((EFI_IFR_REFRESH_ID *)OpCodeData)->RefreshEventGroupId, sizeof (EFI_GUID)); + if (CurrentForm != NULL) { + CopyMem (&CurrentForm->RefreshGuid, &((EFI_IFR_REFRESH_ID *)OpCodeData)->RefreshEventGroupId, sizeof (EFI_GUID)); + } + break; default: ASSERT (ParentStatement != NULL); - CopyMem (&ParentStatement->RefreshGuid, &((EFI_IFR_REFRESH_ID *)OpCodeData)->RefreshEventGroupId, sizeof (EFI_GUID)); + if (ParentStatement != NULL) { + CopyMem (&ParentStatement->RefreshGuid, &((EFI_IFR_REFRESH_ID *)OpCodeData)->RefreshEventGroupId, sizeof (EFI_GUID)); + } + break; } @@ -2559,7 +2887,10 @@ ParseOpCodes ( // case EFI_IFR_MODAL_TAG_OP: ASSERT (CurrentForm != NULL); - CurrentForm->ModalForm = TRUE; + if (CurrentForm != NULL) { + CurrentForm->ModalForm = TRUE; + } + break; // @@ -2575,12 +2906,18 @@ ParseOpCodes ( case EFI_IFR_FORM_OP: case EFI_IFR_FORM_MAP_OP: ASSERT (CurrentForm != NULL); - CurrentForm->Locked = TRUE; + if (CurrentForm != NULL) { + CurrentForm->Locked = TRUE; + } + break; default: ASSERT (ParentStatement != NULL); - ParentStatement->Locked = TRUE; + + if (ParentStatement != NULL) { + ParentStatement->Locked = TRUE; + } } break; @@ -2705,8 +3042,12 @@ ParseOpCodes ( // // This is DisableIf expression for Form, it should be a constant expression // - ASSERT (CurrentExpression != NULL); - Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression); + if (CurrentExpression == NULL) { + ASSERT (CurrentExpression != NULL); + break; + } + + Status = EvaluateExpression (FormSet, NULL, CurrentExpression); if (EFI_ERROR (Status)) { return Status; } @@ -2734,7 +3075,7 @@ ParseOpCodes ( break; } - if (IsStatementOpCode (Operand)) { + if (IsStatementOpCode (Operand) && (CurrentStatement != NULL)) { CurrentStatement->ParentStatement = ParentStatement; if (Scope != 0) { // diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c b/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c index e44a70c65e8e..adfd8cb1ff81 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c @@ -252,7 +252,11 @@ CreateRefreshEventForStatement ( ASSERT_EFI_ERROR (Status); EventNode = AllocateZeroPool (sizeof (FORM_BROWSER_REFRESH_EVENT_NODE)); - ASSERT (EventNode != NULL); + if (EventNode == NULL) { + ASSERT (EventNode != NULL); + return; + } + EventNode->RefreshEvent = RefreshEvent; InsertTailList (&mRefreshEventList, &EventNode->Link); } @@ -286,7 +290,11 @@ CreateRefreshEventForForm ( ASSERT_EFI_ERROR (Status); EventNode = AllocateZeroPool (sizeof (FORM_BROWSER_REFRESH_EVENT_NODE)); - ASSERT (EventNode != NULL); + if (EventNode == NULL) { + ASSERT (EventNode != NULL); + return; + } + EventNode->RefreshEvent = RefreshEvent; InsertTailList (&mRefreshEventList, &EventNode->Link); } @@ -337,7 +345,10 @@ InitializeDisplayStatement ( } DisplayOption = AllocateZeroPool (sizeof (DISPLAY_QUESTION_OPTION)); - ASSERT (DisplayOption != NULL); + if (DisplayOption == NULL) { + ASSERT (DisplayOption != NULL); + continue; + } DisplayOption->ImageId = Option->ImageId; DisplayOption->Signature = DISPLAY_QUESTION_OPTION_SIGNATURE; @@ -410,7 +421,9 @@ InitializeDisplayStatement ( if (Statement->ParentStatement != NULL) { ParentStatement = GetDisplayStatement (Statement->ParentStatement->OpCode); ASSERT (ParentStatement != NULL); - InsertTailList (&ParentStatement->NestStatementList, &DisplayStatement->DisplayLink); + if (ParentStatement != NULL) { + InsertTailList (&ParentStatement->NestStatementList, &DisplayStatement->DisplayLink); + } } else { InsertTailList (&gDisplayFormData.StatementListHead, &DisplayStatement->DisplayLink); } @@ -555,7 +568,11 @@ AddStatementToDisplayForm ( Link = GetNextNode (&gCurrentSelection->FormSet->StatementListOSF, Link); DisplayStatement = AllocateZeroPool (sizeof (FORM_DISPLAY_ENGINE_STATEMENT)); - ASSERT (DisplayStatement != NULL); + if (DisplayStatement == NULL) { + ASSERT (DisplayStatement != NULL); + return; + } + DisplayStatement->Signature = FORM_DISPLAY_ENGINE_STATEMENT_SIGNATURE; DisplayStatement->Version = FORM_DISPLAY_ENGINE_STATEMENT_VERSION_1; DisplayStatement->OpCode = Statement->OpCode; @@ -570,7 +587,10 @@ AddStatementToDisplayForm ( // treat formset as statement outside the form,get its opcode. // DisplayStatement = AllocateZeroPool (sizeof (FORM_DISPLAY_ENGINE_STATEMENT)); - ASSERT (DisplayStatement != NULL); + if (DisplayStatement == NULL) { + ASSERT (DisplayStatement != NULL); + return; + } DisplayStatement->Signature = FORM_DISPLAY_ENGINE_STATEMENT_SIGNATURE; DisplayStatement->Version = FORM_DISPLAY_ENGINE_STATEMENT_VERSION_1; @@ -605,7 +625,10 @@ AddStatementToDisplayForm ( } DisplayStatement = AllocateZeroPool (sizeof (FORM_DISPLAY_ENGINE_STATEMENT)); - ASSERT (DisplayStatement != NULL); + if (DisplayStatement == NULL) { + ASSERT (DisplayStatement != NULL); + continue; + } // // Initialize this statement and add it to the display form. @@ -641,7 +664,11 @@ AddStatementToDisplayForm ( ASSERT_EFI_ERROR (Status); EventNode = AllocateZeroPool (sizeof (FORM_BROWSER_REFRESH_EVENT_NODE)); - ASSERT (EventNode != NULL); + if (EventNode == NULL) { + ASSERT (EventNode != NULL); + return; + } + EventNode->RefreshEvent = RefreshIntervalEvent; InsertTailList (&mRefreshEventList, &EventNode->Link); } @@ -1097,7 +1124,10 @@ GetFormsetGuidFromHiiHandle ( Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, HiiHandle, &BufferSize, HiiPackageList); if (Status == EFI_BUFFER_TOO_SMALL) { HiiPackageList = AllocatePool (BufferSize); - ASSERT (HiiPackageList != NULL); + if (HiiPackageList == NULL) { + ASSERT (HiiPackageList != NULL); + return FALSE; + } Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, HiiHandle, &BufferSize, HiiPackageList); } @@ -1253,7 +1283,10 @@ FormSetGuidToHiiHandle ( // Get all the Hii handles // HiiHandles = HiiGetHiiHandles (NULL); - ASSERT (HiiHandles != NULL); + if (HiiHandles == NULL ) { + ASSERT (HiiHandles != NULL); + return NULL; + } // // Search for formset of each class type @@ -1558,7 +1591,7 @@ ProcessQuestionConfig ( @param UserInput The user input data. @retval EFI_SUCCESS This function always return successfully for now. - + @retval EFI_NOT_FOUND The satement associated with the userinput was not found. **/ EFI_STATUS ProcessUserInput ( @@ -1582,7 +1615,10 @@ ProcessUserInput ( gCurrentSelection->QuestionId = 0; if (UserInput->SelectedStatement != NULL) { Statement = GetBrowserStatement (UserInput->SelectedStatement); - ASSERT (Statement != NULL); + if (Statement == NULL ) { + ASSERT (Statement != NULL); + return EFI_NOT_FOUND; + } // // This question is the current user select one,record it and later @@ -1606,8 +1642,7 @@ ProcessUserInput ( if (UserInput->Action != 0) { Status = ProcessAction (UserInput->Action, UserInput->DefaultId); gCurrentSelection->Statement = NULL; - } else { - ASSERT (Statement != NULL); + } else if (Statement != NULL) { gCurrentSelection->Statement = Statement; switch (Statement->Operand) { case EFI_IFR_REF_OP: @@ -1715,7 +1750,10 @@ DisplayForm ( gCurrentSelection->FormId, gCurrentSelection->QuestionId ); - ASSERT (CurrentMenu != NULL); + if (CurrentMenu == NULL) { + ASSERT (CurrentMenu != NULL); + return EFI_OUT_OF_RESOURCES; + } } // @@ -2083,7 +2121,10 @@ ProcessCallBackFunction ( // if (HiiValue->Type == EFI_IFR_TYPE_STRING) { NewString = GetToken (Statement->HiiValue.Value.string, FormSet->HiiHandle); - ASSERT (NewString != NULL); + if (NewString == NULL) { + ASSERT (NewString != NULL); + continue; + } ASSERT (StrLen (NewString) * sizeof (CHAR16) <= Statement->StorageWidth); if (StrLen (NewString) * sizeof (CHAR16) <= Statement->StorageWidth) { @@ -2346,7 +2387,10 @@ ProcessRetrieveForQuestion ( ); if (!EFI_ERROR (Status) && (HiiValue->Type == EFI_IFR_TYPE_STRING)) { NewString = GetToken (Statement->HiiValue.Value.string, FormSet->HiiHandle); - ASSERT (NewString != NULL); + if (NewString == NULL) { + ASSERT (NewString != NULL); + return EFI_OUT_OF_RESOURCES; + } ASSERT (StrLen (NewString) * sizeof (CHAR16) <= Statement->StorageWidth); if (StrLen (NewString) * sizeof (CHAR16) <= Statement->StorageWidth) { diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c index 2f7b11b1aaba..f56b0cd20e73 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c @@ -306,7 +306,11 @@ UiCopyMenuList ( Link = GetNextNode (CurrentMenuListHead, Link); NewMenuEntry = AllocateZeroPool (sizeof (FORM_ENTRY_INFO)); - ASSERT (NewMenuEntry != NULL); + if (NewMenuEntry == NULL) { + ASSERT (NewMenuEntry != NULL); + return; + } + NewMenuEntry->Signature = FORM_ENTRY_INFO_SIGNATURE; NewMenuEntry->HiiHandle = MenuList->HiiHandle; CopyMem (&NewMenuEntry->FormSetGuid, &MenuList->FormSetGuid, sizeof (EFI_GUID)); @@ -339,7 +343,10 @@ LoadAllHiiFormset ( // Get all the Hii handles // HiiHandles = HiiGetHiiHandles (NULL); - ASSERT (HiiHandles != NULL); + if (HiiHandles == NULL) { + ASSERT (HiiHandles != NULL); + return; + } // // Search for formset of each class type @@ -356,7 +363,11 @@ LoadAllHiiFormset ( // Initilize FormSet Setting // LocalFormSet = AllocateZeroPool (sizeof (FORM_BROWSER_FORMSET)); - ASSERT (LocalFormSet != NULL); + if (LocalFormSet != NULL ) { + ASSERT (LocalFormSet != NULL); + return; + } + mSystemLevelFormSet = LocalFormSet; ZeroMem (&ZeroGuid, sizeof (ZeroGuid)); @@ -410,7 +421,11 @@ PopupErrorMessage ( if (OpCode != NULL) { Statement = AllocateZeroPool (sizeof (FORM_DISPLAY_ENGINE_STATEMENT)); - ASSERT (Statement != NULL); + if (Statement == NULL) { + ASSERT (Statement != NULL); + return BROWSER_ACTION_NONE; + } + Statement->OpCode = OpCode; gDisplayFormData.HighLightedStatement = Statement; } @@ -505,7 +520,11 @@ SendForm ( for (Index = 0; Index < HandleCount; Index++) { Selection = AllocateZeroPool (sizeof (UI_MENU_SELECTION)); - ASSERT (Selection != NULL); + if (Selection == NULL) { + ASSERT (Selection != NULL); + Status = EFI_OUT_OF_RESOURCES; + break; + } Selection->Handle = Handles[Index]; if (FormSetGuid != NULL) { @@ -517,7 +536,11 @@ SendForm ( do { FormSet = AllocateZeroPool (sizeof (FORM_BROWSER_FORMSET)); - ASSERT (FormSet != NULL); + if (FormSet == NULL) { + ASSERT (FormSet != NULL); + Status = EFI_OUT_OF_RESOURCES; + break; + } // // Validate the HiiHandle @@ -653,7 +676,11 @@ ProcessStorage ( // Also need to consider add "\0" at first time. // StrPtr = StrStr (ConfigResp, L"PATH"); - ASSERT (StrPtr != NULL); + if (StrPtr == NULL) { + ASSERT (StrPtr != NULL); + return EFI_NOT_FOUND; + } + StrPtr = StrStr (StrPtr, L"&"); StrPtr += 1; BufferSize = StrSize (StrPtr); @@ -666,6 +693,7 @@ ProcessStorage ( } *ResultsDataSize = BufferSize; + FreePool (ConfigResp); } else { // @@ -677,7 +705,10 @@ ProcessStorage ( BufferSize = (TmpSize + StrLen (BrowserStorage->ConfigHdr) + 2) * sizeof (CHAR16); MaxLen = BufferSize / sizeof (CHAR16); ConfigResp = AllocateZeroPool (BufferSize); - ASSERT (ConfigResp != NULL); + if (ConfigResp == NULL) { + ASSERT (ConfigResp != NULL); + return EFI_OUT_OF_RESOURCES; + } StrCpyS (ConfigResp, MaxLen, BrowserStorage->ConfigHdr); StrCatS (ConfigResp, MaxLen, L"&"); @@ -1088,7 +1119,10 @@ NewStringCat ( MaxLen = (StrSize (*Dest) + StrSize (Src) - 1) / sizeof (CHAR16); NewString = AllocateZeroPool (MaxLen * sizeof (CHAR16)); - ASSERT (NewString != NULL); + if (NewString == NULL) { + ASSERT (NewString != NULL); + return; + } StrCpyS (NewString, MaxLen, *Dest); StrCatS (NewString, MaxLen, Src); @@ -1823,7 +1857,10 @@ GetQuestionValue ( // Allocate buffer include '\0' MaxLen = Length + 1; ConfigRequest = AllocateZeroPool (MaxLen * sizeof (CHAR16)); - ASSERT (ConfigRequest != NULL); + if (ConfigRequest == NULL) { + ASSERT (ConfigRequest != NULL); + return EFI_OUT_OF_RESOURCES; + } StrCpyS (ConfigRequest, MaxLen, FormsetStorage->ConfigHdr); if (IsBufferStorage) { @@ -2089,7 +2126,11 @@ SetQuestionValue ( Value = NULL; BufferLen = ((StrLen ((CHAR16 *)Src) * 4) + 1) * sizeof (CHAR16); Value = AllocateZeroPool (BufferLen); - ASSERT (Value != NULL); + if (Value == NULL) { + ASSERT (Value != NULL); + return EFI_OUT_OF_RESOURCES; + } + // // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044" // @@ -2108,7 +2149,11 @@ SetQuestionValue ( } else { BufferLen = StorageWidth * 2 + 1; Value = AllocateZeroPool (BufferLen * sizeof (CHAR16)); - ASSERT (Value != NULL); + if (Value == NULL) { + ASSERT (Value != NULL); + return EFI_OUT_OF_RESOURCES; + } + // // Convert Buffer to Hex String // @@ -2153,7 +2198,10 @@ SetQuestionValue ( ASSERT (FormsetStorage != NULL); MaxLen = StrLen (FormsetStorage->ConfigHdr) + Length + 1; ConfigResp = AllocateZeroPool (MaxLen * sizeof (CHAR16)); - ASSERT (ConfigResp != NULL); + if (ConfigResp == NULL) { + ASSERT (ConfigResp != NULL); + return EFI_OUT_OF_RESOURCES; + } StrCpyS (ConfigResp, MaxLen, FormsetStorage->ConfigHdr); if (IsBufferStorage) { @@ -2724,7 +2772,10 @@ ValidateHiiHandle ( Find = FALSE; HiiHandles = HiiGetHiiHandles (NULL); - ASSERT (HiiHandles != NULL); + if (HiiHandles == NULL) { + ASSERT (HiiHandles != NULL); + return Find; + } for (Index = 0; HiiHandles[Index] != NULL; Index++) { if (HiiHandles[Index] == HiiHandle) { @@ -2909,7 +2960,11 @@ FindQuestionFromProgress ( // For Name/Value type, Skip the ConfigHdr part. // EndStr = StrStr (Progress, L"PATH="); - ASSERT (EndStr != NULL); + if (EndStr == NULL) { + ASSERT (EndStr != NULL); + return FALSE; + } + while (*EndStr != '&') { EndStr++; } @@ -2920,7 +2975,11 @@ FindQuestionFromProgress ( // For Buffer type, Skip the ConfigHdr part. // EndStr = StrStr (Progress, L"&OFFSET="); - ASSERT (EndStr != NULL); + if (EndStr == NULL) { + ASSERT (EndStr != NULL); + return FALSE; + } + *EndStr = '\0'; } @@ -2936,7 +2995,11 @@ FindQuestionFromProgress ( // here, just keep the "Fred" string. // EndStr = StrStr (Progress, L"="); - ASSERT (EndStr != NULL); + if (EndStr == NULL) { + ASSERT (EndStr != NULL); + return FALSE; + } + *EndStr = '\0'; } else { // @@ -2944,7 +3007,11 @@ FindQuestionFromProgress ( // here, just keep the "OFFSET=0x####&WIDTH=0x####" string. // EndStr = StrStr (Progress, L"&VALUE="); - ASSERT (EndStr != NULL); + if (EndStr == NULL) { + ASSERT (EndStr != NULL); + return FALSE; + } + *EndStr = '\0'; } @@ -3003,6 +3070,10 @@ FindQuestionFromProgress ( // // restore the OffsetWidth string to the original format. // + if (EndStr == NULL) { + return FALSE; + } + if (Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) { *EndStr = '='; } else { @@ -3059,13 +3130,22 @@ GetSyncRestoreConfigRequest ( // here, just keep the "Fred" string. // EndStr = StrStr (Progress, L"="); - ASSERT (EndStr != NULL); + if (EndStr == NULL) { + ASSERT (EndStr != NULL); + return; + } + *EndStr = L'\0'; + // // Find the ConfigHdr in ConfigRequest. // ConfigHdrEndStr = StrStr (ConfigRequest, L"PATH="); - ASSERT (ConfigHdrEndStr != NULL); + if (ConfigHdrEndStr == NULL) { + ASSERT (ConfigHdrEndStr != NULL); + return; + } + while (*ConfigHdrEndStr != L'&') { ConfigHdrEndStr++; } @@ -3075,8 +3155,13 @@ GetSyncRestoreConfigRequest ( // here, just keep the "OFFSET=0x####&WIDTH=0x####" string. // EndStr = StrStr (Progress, L"&VALUE="); - ASSERT (EndStr != NULL); + if (EndStr == NULL) { + ASSERT (EndStr != NULL); + return; + } + *EndStr = L'\0'; + // // Find the ConfigHdr in ConfigRequest. // @@ -3087,27 +3172,44 @@ GetSyncRestoreConfigRequest ( // Find the first fail pair in the ConfigRequest. // ElementStr = StrStr (ConfigRequest, Progress); - ASSERT (ElementStr != NULL); + if (ElementStr == NULL) { + ASSERT (ElementStr != NULL); + return; + } + // // To get the RestoreConfigRequest. // RestoreEleSize = StrSize (ElementStr); TotalSize = (ConfigHdrEndStr - ConfigRequest) * sizeof (CHAR16) + RestoreEleSize + sizeof (CHAR16); *RestoreConfigRequest = AllocateZeroPool (TotalSize); - ASSERT (*RestoreConfigRequest != NULL); + if (*RestoreConfigRequest == NULL) { + ASSERT (*RestoreConfigRequest != NULL); + return; + } + StrnCpyS (*RestoreConfigRequest, TotalSize / sizeof (CHAR16), ConfigRequest, ConfigHdrEndStr - ConfigRequest); StrCatS (*RestoreConfigRequest, TotalSize / sizeof (CHAR16), ElementStr); + // // To get the SyncConfigRequest. // SyncSize = StrSize (ConfigRequest) - RestoreEleSize + sizeof (CHAR16); *SyncConfigRequest = AllocateZeroPool (SyncSize); - ASSERT (*SyncConfigRequest != NULL); + if (*SyncConfigRequest == NULL) { + ASSERT (*SyncConfigRequest != NULL); + return; + } + StrnCpyS (*SyncConfigRequest, SyncSize / sizeof (CHAR16), ConfigRequest, SyncSize / sizeof (CHAR16) - 1); // // restore the Progress string to the original format. // + if (EndStr == NULL) { + return; + } + if (Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) { *EndStr = L'='; } else { @@ -3134,10 +3236,18 @@ ConfirmSaveFail ( CHAR16 *StringBuffer; UINT32 RetVal; + RetVal = BROWSER_ACTION_UNREGISTER; + FormTitle = GetToken (TitleId, HiiHandle); + if (FormTitle == NULL) { + return RetVal; + } StringBuffer = AllocateZeroPool (256 * sizeof (CHAR16)); - ASSERT (StringBuffer != NULL); + if (StringBuffer == NULL) { + ASSERT (StringBuffer != NULL); + return RetVal; + } UnicodeSPrint ( StringBuffer, @@ -3173,10 +3283,18 @@ ConfirmNoSubmitFail ( CHAR16 *StringBuffer; UINT32 RetVal; + RetVal = BROWSER_ACTION_UNREGISTER; + FormTitle = GetToken (TitleId, HiiHandle); + if (FormTitle == NULL) { + return RetVal; + } StringBuffer = AllocateZeroPool (256 * sizeof (CHAR16)); - ASSERT (StringBuffer != NULL); + if (StringBuffer != NULL) { + ASSERT (StringBuffer != NULL); + return RetVal; + } UnicodeSPrint ( StringBuffer, @@ -3632,7 +3750,11 @@ SubmitForFormSet ( gCurrentSelection->Action = UI_ACTION_REFRESH_FORMSET; gCurrentSelection->Handle = FormSet->HiiHandle; CopyGuid (&gCurrentSelection->FormSetGuid, &FormSet->Guid); - gCurrentSelection->FormId = Form->FormId; + gCurrentSelection->FormId = Form->FormId; + if (Question == NULL) { + return EFI_UNSUPPORTED; + } + gCurrentSelection->QuestionId = Question->QuestionId; Status = EFI_UNSUPPORTED; @@ -4301,7 +4423,10 @@ GetQuestionDefault ( if (!EFI_ERROR (Status)) { if (HiiValue->Type == EFI_IFR_TYPE_STRING) { NewString = GetToken (Question->HiiValue.Value.string, FormSet->HiiHandle); - ASSERT (NewString != NULL); + if (NewString != NULL) { + ASSERT (NewString != NULL); + return EFI_NOT_FOUND; + } ASSERT (StrLen (NewString) * sizeof (CHAR16) <= Question->StorageWidth); if (StrLen (NewString) * sizeof (CHAR16) <= Question->StorageWidth) { @@ -5285,7 +5410,11 @@ RemoveConfigRequest ( // if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_NAME_VALUE) { RequestElement = StrStr (ConfigRequest, L"PATH"); - ASSERT (RequestElement != NULL); + if (RequestElement == NULL) { + ASSERT (RequestElement != NULL); + return; + } + RequestElement = StrStr (RequestElement, SearchKey); } else { RequestElement = StrStr (ConfigRequest, SearchKey); @@ -5493,7 +5622,12 @@ ConfigRequestAdjust ( // if (Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) { RequestElement = StrStr (ConfigRequest, L"PATH"); - ASSERT (RequestElement != NULL); + + if (RequestElement == NULL) { + ASSERT (RequestElement != NULL); + return FALSE; + } + RequestElement = StrStr (RequestElement, SearchKey); } else { RequestElement = StrStr (ConfigRequest, SearchKey); @@ -5510,25 +5644,35 @@ ConfigRequestAdjust ( // if (NextRequestElement != NULL) { if (RespString && (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) { - NextElementBakup = NextRequestElement; - NextRequestElement = StrStr (RequestElement, ValueKey); + NextElementBakup = NextRequestElement; + if (ValueKey != NULL) { + NextRequestElement = StrStr (RequestElement, ValueKey); + } + ASSERT (NextRequestElement != NULL); } - // - // Replace "&" with '\0'. - // - *NextRequestElement = L'\0'; - } else { - if (RespString && (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) { - NextElementBakup = NextRequestElement; - NextRequestElement = StrStr (RequestElement, ValueKey); - ASSERT (NextRequestElement != NULL); + if (NextRequestElement != NULL) { // // Replace "&" with '\0'. // *NextRequestElement = L'\0'; } + } else { + if (RespString && (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) { + NextElementBakup = NextRequestElement; + if (ValueKey != NULL) { + NextRequestElement = StrStr (RequestElement, ValueKey); + } + + ASSERT (NextRequestElement != NULL); + if (NextRequestElement != NULL) { + // + // Replace "&" with '\0'. + // + *NextRequestElement = L'\0'; + } + } } if (!ElementValidation (Storage, RequestElement)) { @@ -5622,7 +5766,11 @@ LoadStorage ( // StrLen = StrSize (Storage->ConfigHdr) + 20 * sizeof (CHAR16); ConfigRequest = AllocateZeroPool (StrLen); - ASSERT (ConfigRequest != NULL); + if (ConfigRequest == NULL) { + ASSERT (ConfigRequest != NULL); + return; + } + UnicodeSPrint ( ConfigRequest, StrLen, @@ -5883,7 +6031,10 @@ GetIfrBinaryData ( Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList); if (Status == EFI_BUFFER_TOO_SMALL) { HiiPackageList = AllocatePool (BufferSize); - ASSERT (HiiPackageList != NULL); + if (HiiPackageList == NULL) { + ASSERT (HiiPackageList != NULL); + return EFI_OUT_OF_RESOURCES; + } Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList); } @@ -5892,7 +6043,10 @@ GetIfrBinaryData ( return Status; } - ASSERT (HiiPackageList != NULL); + if (HiiPackageList == NULL ) { + ASSERT (HiiPackageList != NULL); + return EFI_NOT_FOUND; + } // // Get Form package from this HII package List @@ -6081,7 +6235,10 @@ SaveBrowserContext ( } Context = AllocatePool (sizeof (BROWSER_CONTEXT)); - ASSERT (Context != NULL); + if (Context == NULL) { + ASSERT (Context != NULL); + return; + } Context->Signature = BROWSER_CONTEXT_SIGNATURE; @@ -6303,7 +6460,10 @@ PasswordCheck ( ConfigAccess = gCurrentSelection->FormSet->ConfigAccess; Question = GetBrowserStatement (Statement); - ASSERT (Question != NULL); + if (Question == NULL) { + ASSERT (Question != NULL); + return EFI_NOT_FOUND; + } if ((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK) == EFI_IFR_FLAG_CALLBACK) { if (ConfigAccess == NULL) { @@ -6487,7 +6647,11 @@ RegisterHotKey ( // Create new Key, and add it into List. // HotKey = AllocateZeroPool (sizeof (BROWSER_HOT_KEY)); - ASSERT (HotKey != NULL); + if (HotKey == NULL) { + ASSERT (HotKey != NULL); + return EFI_OUT_OF_RESOURCES; + } + HotKey->Signature = BROWSER_HOT_KEY_SIGNATURE; HotKey->KeyData = AllocateCopyPool (sizeof (EFI_INPUT_KEY), KeyData); InsertTailList (&gBrowserHotKeyList, &HotKey->Link); @@ -6598,18 +6762,20 @@ ExecuteAction ( FORM_BROWSER_FORMSET *FormSet; FORM_BROWSER_FORM *Form; - if ((gBrowserSettingScope < SystemLevel) && (gCurrentSelection == NULL)) { - return EFI_NOT_READY; - } - - Status = EFI_SUCCESS; - FormSet = NULL; - Form = NULL; if (gBrowserSettingScope < SystemLevel) { + if (gCurrentSelection == NULL) { + return EFI_NOT_READY; + } + FormSet = gCurrentSelection->FormSet; Form = gCurrentSelection->Form; + } else { + FormSet = NULL; + Form = NULL; } + Status = EFI_SUCCESS; + // // Executet the discard action. // From 901c4e32c65ded0802f641687ac1601b2c9c14b3 Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Wed, 22 Oct 2025 11:33:02 -0700 Subject: [PATCH 0797/1172] MdeModulePkg: Fix missing NULL tests. https://github.com/github/codeql/blob/codeql-cli-2.7.3/cpp/ql/src/Critical/MissingNullTest.qhelp For items which allocate memory, or get a pointer from another structure, it is important to validate that the pointers are not null before they are dereferenced. Signed-off-by: Aaron Pop --- .../Universal/DisplayEngineDxe/FormDisplay.c | 60 +++++++++++++++---- .../Universal/DisplayEngineDxe/InputHandler.c | 40 ++++++++----- 2 files changed, 72 insertions(+), 28 deletions(-) diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c index 81020b2da6f7..d19b7ddb87eb 100644 --- a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c +++ b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c @@ -1154,6 +1154,9 @@ ProcessStringForDateTime ( Date = (EFI_IFR_DATE *)Statement->OpCode; } else if (Statement->OpCode->OpCode == EFI_IFR_TIME_OP) { Time = (EFI_IFR_TIME *)Statement->OpCode; + } else { + // If not in a time/date opcode, exit. + return; } // @@ -1558,7 +1561,9 @@ FindTopOfScreenMenu ( } } else { TopOfScreen = Link; - *SkipValue = PreviousMenuOption->Skip - Rows; + if (PreviousMenuOption != NULL) { + *SkipValue = PreviousMenuOption->Skip - Rows; + } } return TopOfScreen; @@ -2917,7 +2922,10 @@ UiDisplayMenu ( if (SkipHighLight) { SkipHighLight = FALSE; MenuOption = SavedMenuOption; - RefreshKeyHelp (gFormData, SavedMenuOption->ThisTag, FALSE); + if (SavedMenuOption != NULL) { + RefreshKeyHelp (gFormData, SavedMenuOption->ThisTag, FALSE); + } + break; } @@ -3000,7 +3008,11 @@ UiDisplayMenu ( // // Don't print anything if it is a NULL help token // - ASSERT (MenuOption != NULL); + if (MenuOption == NULL) { + ASSERT (MenuOption != NULL); + break; + } + HelpInfo = ((EFI_IFR_STATEMENT_HEADER *)((CHAR8 *)MenuOption->ThisTag->OpCode + sizeof (EFI_IFR_OP_HEADER)))->Help; Statement = MenuOption->ThisTag; StatementValue = &Statement->CurrentValue; @@ -3257,7 +3269,11 @@ UiDisplayMenu ( // If the screen has no menu items, and the user didn't select UiReset // ignore the selection and go back to reading keys. // - ASSERT (MenuOption != NULL); + if (MenuOption != NULL ) { + ASSERT (MenuOption != NULL); + break; + } + if (IsListEmpty (&gMenuOption) || MenuOption->GrayOut || MenuOption->ReadOnly) { ControlFlag = CfReadKey; break; @@ -3308,7 +3324,11 @@ UiDisplayMenu ( break; } - ASSERT (MenuOption != NULL); + if (MenuOption != NULL) { + ASSERT (MenuOption != NULL); + break; + } + if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_CHECKBOX_OP) && !MenuOption->GrayOut && !MenuOption->ReadOnly) { ScreenOperation = UiSelect; } @@ -3393,8 +3413,11 @@ UiDisplayMenu ( case CfUiSelect: ControlFlag = CfRepaint; + if (MenuOption != NULL ) { + ASSERT (MenuOption != NULL); + break; + } - ASSERT (MenuOption != NULL); Statement = MenuOption->ThisTag; if (Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) { break; @@ -3449,8 +3472,10 @@ UiDisplayMenu ( case CfUiHotKey: ControlFlag = CfRepaint; - - ASSERT (HotKey != NULL); + if (HotKey != NULL ) { + ASSERT (HotKey != NULL); + break; + } if (FxConfirmPopup (HotKey->Action)) { gUserInput->Action = HotKey->Action; @@ -3469,7 +3494,11 @@ UiDisplayMenu ( case CfUiLeft: ControlFlag = CfRepaint; - ASSERT (MenuOption != NULL); + if (MenuOption == NULL) { + ASSERT (MenuOption != NULL); + break; + } + if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP) || (MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP)) { if (MenuOption->Sequence != 0) { // @@ -3484,7 +3513,11 @@ UiDisplayMenu ( case CfUiRight: ControlFlag = CfRepaint; - ASSERT (MenuOption != NULL); + if (MenuOption == NULL) { + ASSERT (MenuOption != NULL); + break; + } + if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP) || (MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP)) { if (MenuOption->Sequence != 2) { // @@ -3934,10 +3967,13 @@ BrowserStatusProcess ( TimeOutEvent = NULL; RefreshIntervalEvent = NULL; OpCodeBuf = NULL; - if (gFormData->HighLightedStatement != NULL) { - OpCodeBuf = gFormData->HighLightedStatement->OpCode; + if (gFormData->HighLightedStatement == NULL) { + // Ensure there is a highlighted statement, otherwise exit + return; } + OpCodeBuf = gFormData->HighLightedStatement->OpCode; + if (gFormData->BrowserStatus == (BROWSER_WARNING_IF)) { ASSERT (OpCodeBuf != NULL && OpCodeBuf->OpCode == EFI_IFR_WARNING_IF_OP); diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c b/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c index 06d64105db5d..aee82f0518c9 100644 --- a/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c +++ b/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c @@ -1300,7 +1300,6 @@ GetSelectionInputPopUp ( BOOLEAN ShowUpArrow; UINTN DimensionsWidth; LIST_ENTRY *Link; - BOOLEAN OrderedList; UINT8 *ValueArray; UINT8 *ReturnValue; UINT8 ValueType; @@ -1327,18 +1326,16 @@ GetSelectionInputPopUp ( OneOfOption = DISPLAY_QUESTION_OPTION_FROM_LINK (Link); ValueArray = Question->CurrentValue.Buffer; ValueType = OneOfOption->OptionOpCode->Type; - OrderedList = TRUE; OrderList = (EFI_IFR_ORDERED_LIST *)Question->OpCode; } else { - OrderedList = FALSE; - OrderList = NULL; + OrderList = NULL; } // // Calculate Option count // PopUpMenuLines = 0; - if (OrderedList) { + if (OrderList != NULL) { AdjustOptionOrder (Question, &PopUpMenuLines); } else { Link = GetFirstNode (&Question->OptionListHead); @@ -1366,7 +1363,7 @@ GetSelectionInputPopUp ( FreePool (StringPtr); HiiValue.Type = OneOfOption->OptionOpCode->Type; SetValuesByType (&HiiValue.Value, &OneOfOption->OptionOpCode->Value, HiiValue.Type); - if (!OrderedList && (CompareHiiValue (&Question->CurrentValue, &HiiValue, &Result, NULL) == EFI_SUCCESS) && (Result == 0)) { + if ((OrderList == NULL) && (CompareHiiValue (&Question->CurrentValue, &HiiValue, &Result, NULL) == EFI_SUCCESS) && (Result == 0)) { // // Find current selected Option for OneOf // @@ -1515,7 +1512,7 @@ GetSelectionInputPopUp ( TheKey: switch (Key.UnicodeChar) { case '+': - if (OrderedList) { + if (OrderList != NULL) { if ((TopOptionIndex > 0) && (TopOptionIndex == HighlightOptionIndex)) { // // Highlight reaches the top of the popup window, scroll one menu item. @@ -1530,8 +1527,11 @@ GetSelectionInputPopUp ( if (HighlightOptionIndex > 0) { HighlightOptionIndex--; + if (CurrentOption == NULL) { + ASSERT (CurrentOption != NULL); + break; + } - ASSERT (CurrentOption != NULL); SwapListEntries (CurrentOption->Link.BackLink, &CurrentOption->Link); } } @@ -1543,7 +1543,7 @@ GetSelectionInputPopUp ( // If an ordered list op-code, we will allow for a popup of +/- keys // to create an ordered list of items // - if (OrderedList) { + if (OrderList != NULL) { if (((TopOptionIndex + MenuLinesInView) < PopUpMenuLines) && (HighlightOptionIndex == (TopOptionIndex + MenuLinesInView - 1))) { @@ -1561,7 +1561,11 @@ GetSelectionInputPopUp ( if (HighlightOptionIndex < (PopUpMenuLines - 1)) { HighlightOptionIndex++; - ASSERT (CurrentOption != NULL); + if (CurrentOption == NULL) { + ASSERT (CurrentOption != NULL); + break; + } + SwapListEntries (&CurrentOption->Link, CurrentOption->Link.ForwardLink); } } @@ -1657,7 +1661,7 @@ GetSelectionInputPopUp ( // // Restore link list order for orderedlist // - if (OrderedList) { + if (OrderList != NULL) { HiiValue.Type = ValueType; HiiValue.Value.u64 = 0; for (Index = 0; Index < OrderList->MaxContainers; Index++) { @@ -1688,7 +1692,7 @@ GetSelectionInputPopUp ( // // return the current selection // - if (OrderedList) { + if (OrderList != NULL) { ReturnValue = AllocateZeroPool (Question->CurrentValue.BufferLen); ASSERT (ReturnValue != NULL); Index = 0; @@ -1713,18 +1717,22 @@ GetSelectionInputPopUp ( gUserInput->InputValue.BufferLen = Question->CurrentValue.BufferLen; } } else { - ASSERT (CurrentOption != NULL); + if (CurrentOption != NULL) { + ASSERT (CurrentOption != NULL); + break; + } + gUserInput->InputValue.Type = CurrentOption->OptionOpCode->Type; if (IsValuesEqual (&Question->CurrentValue.Value, &CurrentOption->OptionOpCode->Value, gUserInput->InputValue.Type)) { return EFI_DEVICE_ERROR; } else { SetValuesByType (&gUserInput->InputValue.Value, &CurrentOption->OptionOpCode->Value, gUserInput->InputValue.Type); } - } - gST->ConOut->SetAttribute (gST->ConOut, SavedAttribute); + gST->ConOut->SetAttribute (gST->ConOut, SavedAttribute); - return EFI_SUCCESS; + return EFI_SUCCESS; + } default: break; From 2fd6884a9b5685d3a1129cb4ad3299b9f3aff84d Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Wed, 22 Oct 2025 11:33:02 -0700 Subject: [PATCH 0798/1172] MdeModulePkg: Fix missing NULL tests. https://github.com/github/codeql/blob/codeql-cli-2.7.3/cpp/ql/src/Critical/MissingNullTest.qhelp For items which allocate memory, or get a pointer from another structure, it is important to validate that the pointers are not null before they are dereferenced. Signed-off-by: Aaron Pop --- .../Universal/HiiDatabaseDxe/ConfigRouting.c | 82 ++++++++++++++++--- .../Universal/HiiDatabaseDxe/Database.c | 62 ++++++++++---- .../Universal/HiiDatabaseDxe/String.c | 11 ++- 3 files changed, 126 insertions(+), 29 deletions(-) diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c index 33462f4602fa..484407f2ef4e 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c @@ -632,13 +632,28 @@ CompareBlockElementDefault ( // Make BlockPtr point to the first with AltConfigHdr in DefaultAltCfgResp. // AltConfigHdrPtr = StrStr (DefaultAltCfgResp, AltConfigHdr); - ASSERT (AltConfigHdrPtr != NULL); + if (AltConfigHdrPtr == NULL ) { + ASSERT (AltConfigHdrPtr != NULL); + Status = EFI_OUT_OF_RESOURCES; + goto Exit; + } + BlockPtr = StrStr (AltConfigHdrPtr, L"&OFFSET="); + if (BlockPtr == NULL) { + ASSERT (BlockPtr != NULL); + Status = EFI_OUT_OF_RESOURCES; + goto Exit; + } + // // Make StringPtr point to the AltConfigHdr in ConfigAltResp. // StringPtr = StrStr (*ConfigAltResp, AltConfigHdr); - ASSERT (StringPtr != NULL); + if (StringPtr == NULL) { + ASSERT (StringPtr != NULL); + Status = EFI_OUT_OF_RESOURCES; + goto Exit; + } while (BlockPtr != NULL) { // @@ -684,6 +699,12 @@ CompareBlockElementDefault ( // if (AppendString == NULL) { AppendString = (EFI_STRING)AllocateZeroPool (AppendSize + sizeof (CHAR16)); + if (AppendString == NULL) { + ASSERT (AppendString != NULL); + Status = EFI_OUT_OF_RESOURCES; + goto Exit; + } + StrnCatS (AppendString, AppendSize / sizeof (CHAR16) + 1, BlockPtrStart, AppendSize / sizeof (CHAR16)); } else { TotalSize = StrSize (AppendString) + AppendSize + sizeof (CHAR16); @@ -778,15 +799,26 @@ CompareNameElementDefault ( // Make NvConfigPtr point to the first with AltConfigHdr in DefaultAltCfgResp. // NvConfigPtr = StrStr (DefaultAltCfgResp, AltConfigHdr); - ASSERT (NvConfigPtr != NULL); + if (NvConfigPtr == NULL) { + ASSERT (NvConfigPtr != NULL); + goto Exit; + } + NvConfigPtr = StrStr (NvConfigPtr + StrLen (AltConfigHdr), L"&"); // // Make StringPtr point to the first with AltConfigHdr in ConfigAltResp. // StringPtr = StrStr (*ConfigAltResp, AltConfigHdr); - ASSERT (StringPtr != NULL); + if (StringPtr == NULL) { + ASSERT (StringPtr != NULL); + goto Exit; + } + StringPtr = StrStr (StringPtr + StrLen (AltConfigHdr), L"&"); - ASSERT (StringPtr != NULL); + if (StringPtr == NULL) { + ASSERT (StringPtr != NULL); + goto Exit; + } while (NvConfigPtr != NULL) { // @@ -795,7 +827,11 @@ CompareNameElementDefault ( // NvConfigStart = NvConfigPtr; NvConfigValuePtr = StrStr (NvConfigPtr + 1, L"="); - ASSERT (NvConfigValuePtr != NULL); + if (NvConfigValuePtr == NULL) { + ASSERT (NvConfigValuePtr != NULL); + goto Exit; + } + TempChar = *NvConfigValuePtr; *NvConfigValuePtr = L'\0'; // @@ -924,7 +960,11 @@ CompareAndMergeDefaultString ( // To find the with AltConfigHdr in DefaultAltCfgResp, ignore other which follow it. // AltConfigHdrPtr = StrStr (DefaultAltCfgResp, AltConfigHdr); - ASSERT (AltConfigHdrPtr != NULL); + if (AltConfigHdrPtr == NULL) { + ASSERT (AltConfigHdrPtr != NULL); + goto Exit; + } + AltConfigHdrPtrNext = StrStr (AltConfigHdrPtr + 1, L"&GUID"); if (AltConfigHdrPtrNext != NULL) { TempChar = *AltConfigHdrPtrNext; @@ -1946,9 +1986,10 @@ GetElementsFromRequest ( TmpRequest = StrStr (ConfigRequest, L"PATH="); ASSERT (TmpRequest != NULL); - - if ((StrStr (TmpRequest, L"&OFFSET=") != NULL) || (StrStr (TmpRequest, L"&") != NULL)) { - return TRUE; + if (TmpRequest != NULL) { + if ((StrStr (TmpRequest, L"&OFFSET=") != NULL) || (StrStr (TmpRequest, L"&") != NULL)) { + return TRUE; + } } return FALSE; @@ -3590,6 +3631,10 @@ GetNameElement ( IFR_BLOCK_DATA *RequestBlockArray; BOOLEAN HasValue; + if (ConfigRequest == NULL) { + return NULL; + } + StringPtr = ConfigRequest; // @@ -3624,6 +3669,8 @@ GetNameElement ( HasValue = TRUE; } else if ((NextTag = StrStr (StringPtr, L"&")) != NULL) { *NextTag = L'\0'; + } else { + goto Done; } // @@ -6457,6 +6504,10 @@ HiiGetAltCfg ( ); if (AltCfgId != NULL) { GenerateSubStr (L"ALTCFG=", sizeof (UINT16), (VOID *)AltCfgId, 3, &AltIdStr); + if (AltIdStr == NULL) { + ASSERT (AltIdStr != NULL); + return EFI_OUT_OF_RESOURCES; + } } if (Name != NULL) { @@ -6465,6 +6516,11 @@ HiiGetAltCfg ( GenerateSubStr (L"NAME=", 0, NULL, 2, &NameStr); } + if (NameStr == NULL) { + ASSERT (NameStr != NULL); + return EFI_OUT_OF_RESOURCES; + } + while (*StringPtr != 0) { // // Try to match the GUID @@ -6558,6 +6614,12 @@ HiiGetAltCfg ( goto Exit; } + if (AltIdStr == NULL) { + ASSERT (AltIdStr != NULL); + Status = EFI_NOT_FOUND; + goto Exit; + } + // // Search the to get the with AltCfgId. // diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c b/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c index 314e40815a97..69e82638d973 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c @@ -959,7 +959,12 @@ UpdateDefaultSettingInFormPackage ( EfiVarStoreMaxNum = EfiVarStoreMaxNum + BASE_NUMBER; } + if (EfiVarStoreList == NULL) { + goto Done; + } + IfrEfiVarStore = (EFI_IFR_VARSTORE_EFI *)IfrOpHdr; + // // Convert VarStore Name from ASCII string to Unicode string. // @@ -985,14 +990,16 @@ UpdateDefaultSettingInFormPackage ( // Reallocate DefaultIdNumber // DefaultIdList = ReallocatePool (DefaultIdMaxNum * sizeof (UINT16), (DefaultIdMaxNum + BASE_NUMBER) * sizeof (UINT16), DefaultIdList); - if (DefaultIdList == NULL) { - goto Done; - } DefaultIdMaxNum = DefaultIdMaxNum + BASE_NUMBER; } + if (DefaultIdList == NULL) { + goto Done; + } + DefaultIdList[DefaultIdNumber++] = ((EFI_IFR_DEFAULTSTORE *)IfrOpHdr)->DefaultId; + break; case EFI_IFR_FORM_OP: case EFI_IFR_FORM_MAP_OP: @@ -1005,13 +1012,22 @@ UpdateDefaultSettingInFormPackage ( break; case EFI_IFR_CHECKBOX_OP: - IfrScope = IfrOpHdr->Scope; - IfrQuestionType = IfrOpHdr->OpCode; - IfrQuestionHdr = (EFI_IFR_QUESTION_HEADER *)(IfrOpHdr + 1); - IfrCheckBox = (EFI_IFR_CHECKBOX *)IfrOpHdr; + IfrScope = IfrOpHdr->Scope; + IfrQuestionType = IfrOpHdr->OpCode; + IfrQuestionHdr = (EFI_IFR_QUESTION_HEADER *)(IfrOpHdr + 1); + IfrCheckBox = (EFI_IFR_CHECKBOX *)IfrOpHdr; + Width = sizeof (BOOLEAN); + + if (EfiVarStoreList == NULL) { + goto Done; + } + EfiVarStoreIndex = IsEfiVarStoreQuestion (IfrQuestionHdr, EfiVarStoreList, EfiVarStoreNumber); - Width = sizeof (BOOLEAN); if (EfiVarStoreIndex < EfiVarStoreNumber) { + if (DefaultIdList == NULL) { + goto Done; + } + for (Index = 0; Index < DefaultIdNumber; Index++) { if (DefaultIdList[Index] == EFI_HII_DEFAULT_CLASS_STANDARD) { Status = FindQuestionDefaultSetting (DefaultIdList[Index], EfiVarStoreList[EfiVarStoreIndex], IfrQuestionHdr, &IfrValue, sizeof (BOOLEAN), QuestionReferBitField); @@ -1057,23 +1073,29 @@ UpdateDefaultSettingInFormPackage ( Width = (UINTN)((UINT32)1 << (((EFI_IFR_ONE_OF *)IfrOpHdr)->Flags & EFI_IFR_NUMERIC_SIZE)); } - EfiVarStoreIndex = IsEfiVarStoreQuestion (IfrQuestionHdr, EfiVarStoreList, EfiVarStoreNumber); StandardDefaultIsSet = FALSE; ManufactDefaultIsSet = FALSE; + if (EfiVarStoreList == NULL) { + goto Done; + } + + EfiVarStoreIndex = IsEfiVarStoreQuestion (IfrQuestionHdr, EfiVarStoreList, EfiVarStoreNumber); // // Find Default and Manufacturing default for OneOf question // if (EfiVarStoreIndex < EfiVarStoreNumber) { for (Index = 0; Index < DefaultIdNumber; Index++) { - if (DefaultIdList[Index] == EFI_HII_DEFAULT_CLASS_STANDARD) { - Status = FindQuestionDefaultSetting (EFI_HII_DEFAULT_CLASS_STANDARD, EfiVarStoreList[EfiVarStoreIndex], IfrQuestionHdr, &IfrValue, Width, QuestionReferBitField); - if (!EFI_ERROR (Status)) { - StandardDefaultIsSet = TRUE; - } - } else if (DefaultIdList[Index] == EFI_HII_DEFAULT_CLASS_MANUFACTURING) { - Status = FindQuestionDefaultSetting (EFI_HII_DEFAULT_CLASS_MANUFACTURING, EfiVarStoreList[EfiVarStoreIndex], IfrQuestionHdr, &IfrManufactValue, Width, QuestionReferBitField); - if (!EFI_ERROR (Status)) { - ManufactDefaultIsSet = TRUE; + if (DefaultIdList != NULL) { + if (DefaultIdList[Index] == EFI_HII_DEFAULT_CLASS_STANDARD) { + Status = FindQuestionDefaultSetting (EFI_HII_DEFAULT_CLASS_STANDARD, EfiVarStoreList[EfiVarStoreIndex], IfrQuestionHdr, &IfrValue, Width, QuestionReferBitField); + if (!EFI_ERROR (Status)) { + StandardDefaultIsSet = TRUE; + } + } else if (DefaultIdList[Index] == EFI_HII_DEFAULT_CLASS_MANUFACTURING) { + Status = FindQuestionDefaultSetting (EFI_HII_DEFAULT_CLASS_MANUFACTURING, EfiVarStoreList[EfiVarStoreIndex], IfrQuestionHdr, &IfrManufactValue, Width, QuestionReferBitField); + if (!EFI_ERROR (Status)) { + ManufactDefaultIsSet = TRUE; + } } } } @@ -1134,6 +1156,10 @@ UpdateDefaultSettingInFormPackage ( // Update the default value // if (Width > 0) { + if (EfiVarStoreList == NULL) { + goto Done; + } + EfiVarStoreIndex = IsEfiVarStoreQuestion (IfrQuestionHdr, EfiVarStoreList, EfiVarStoreNumber); if (EfiVarStoreIndex < EfiVarStoreNumber) { Status = FindQuestionDefaultSetting (IfrDefault->DefaultId, EfiVarStoreList[EfiVarStoreIndex], IfrQuestionHdr, &IfrDefault->Value, Width, QuestionReferBitField); diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/String.c b/MdeModulePkg/Universal/HiiDatabaseDxe/String.c index c70f308a6e6f..96202de4bc3a 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/String.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/String.c @@ -1078,6 +1078,11 @@ SetStringWorker ( return EFI_SUCCESS; } + if (GlobalFont == NULL ) { + ASSERT (GlobalFont != NULL); + return EFI_NOT_FOUND; + } + OldBlockSize = StringPackage->StringPkgHdr->Header.Length - StringPackage->StringPkgHdr->HdrSize; BlockSize = OldBlockSize + sizeof (EFI_HII_SIBT_FONT_BLOCK) - sizeof (CHAR16) + StrSize (GlobalFont->FontInfo->FontName); @@ -1094,6 +1099,10 @@ SetStringWorker ( CopyMem (BlockPtr, &Ext2, sizeof (EFI_HII_SIBT_EXT2_BLOCK)); BlockPtr += sizeof (EFI_HII_SIBT_EXT2_BLOCK); + if (LocalFont == NULL) { + return EFI_INVALID_PARAMETER; + } + *BlockPtr = LocalFont->FontId; BlockPtr++; CopyMem (BlockPtr, &GlobalFont->FontInfo->FontSize, sizeof (UINT16)); @@ -1578,7 +1587,7 @@ HiiNewString ( StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE); StringPackage->MaxStringId = *StringId; } - } else if (NewStringPackageCreated) { + } else if (NewStringPackageCreated && (StringPackage != NULL)) { // // Free the allocated new string Package when new string can't be added. // From 119184aa2c4d9463a1123567104e23773e402397 Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Wed, 22 Oct 2025 11:33:02 -0700 Subject: [PATCH 0799/1172] MdeModulePkg: Fix comparison with wider widths. https://codeql.github.com/codeql-query-help/cpp/cpp-comparison-with-wider-type If the narrow type (smaller range) is compared against a wide type (larger range), the narrow value may overflow before reaching the wide value. This can cause unexpected behavior, such as: Infinite loops (loop condition never becomes false). Incorrect logic (comparison results are misleading). Signed-off-by: Aaron Pop --- MdeModulePkg/Universal/CapsulePei/UefiCapsule.c | 2 +- MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c | 2 +- .../Universal/FaultTolerantWritePei/FaultTolerantWritePei.c | 2 +- .../Universal/RegularExpressionDxe/RegularExpressionDxe.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MdeModulePkg/Universal/CapsulePei/UefiCapsule.c b/MdeModulePkg/Universal/CapsulePei/UefiCapsule.c index 8e26a7d7959e..8e69e7a7fb05 100644 --- a/MdeModulePkg/Universal/CapsulePei/UefiCapsule.c +++ b/MdeModulePkg/Universal/CapsulePei/UefiCapsule.c @@ -1277,7 +1277,7 @@ CreateState ( UINTN Size; EFI_PHYSICAL_ADDRESS NewBuffer; UINTN CapsuleNumber; - UINT32 Index; + UINTN Index; EFI_PHYSICAL_ADDRESS BaseAddress; UINT64 Length; diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c index 5c168c8751dc..859d8ba5ee6b 100644 --- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c +++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c @@ -856,7 +856,7 @@ FtwGetLastWriteRecord ( OUT EFI_FAULT_TOLERANT_WRITE_RECORD **FtwWriteRecord ) { - UINTN Index; + UINT64 Index; EFI_FAULT_TOLERANT_WRITE_RECORD *FtwRecord; *FtwWriteRecord = NULL; diff --git a/MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.c b/MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.c index 8c152dcbad98..8e3a6d14fac1 100644 --- a/MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.c +++ b/MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.c @@ -93,7 +93,7 @@ FtwGetLastWriteRecord ( OUT EFI_FAULT_TOLERANT_WRITE_RECORD **FtwWriteRecord ) { - UINTN Index; + UINT64 Index; EFI_FAULT_TOLERANT_WRITE_RECORD *FtwRecord; *FtwWriteRecord = NULL; diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.c b/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.c index 326a6e688423..54da1a7c68ed 100644 --- a/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.c +++ b/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.c @@ -81,7 +81,7 @@ OnigurumaMatch ( INT32 OnigResult; OnigErrorInfo ErrorInfo; OnigUChar ErrorMessage[ONIG_MAX_ERROR_MESSAGE_LEN]; - UINT32 Index; + UINTN Index; OnigUChar *Start; EFI_STATUS Status; From 61472ad963a22fd108345106e220fcdfcc357207 Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Fri, 7 Nov 2025 14:32:01 -0800 Subject: [PATCH 0800/1172] MdeModulePkg: Correct documentation. Function headers were missing different return statuses which were currently in use. Update the function headers to detail the statuses. Signed-off-by: Aaron Pop --- .../Universal/PlatformDriOverrideDxe/PlatDriOverrideDxe.c | 6 +++++- .../Universal/PlatformDriOverrideDxe/PlatDriOverrideLib.c | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideDxe.c b/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideDxe.c index e30a55f56b3c..519f29fb9ae6 100644 --- a/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideDxe.c +++ b/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideDxe.c @@ -616,6 +616,7 @@ GetDriverBindingHandleFromImageHandle ( @param FakeNvData Pointer to PLAT_OVER_MNGR_DATA. @retval EFI_SUCCESS Always returned. + @retval EFI_NOT_FOUND Handles supporting loaded image protocol. **/ EFI_STATUS @@ -1341,7 +1342,10 @@ PlatOverMngrRouteConfig ( @param Value A pointer to the data being sent to the original exporting driver. @param ActionRequest On return, points to the action requested by the callback function. - @retval EFI_SUCCESS Always returned. + @retval EFI_SUCCESS Changes were completed successfully. + @retval EFI_UNSUPPORTED An action is being passed that is not supported. + @retval EFI_DEVICE_ERROR Changed failed to be commited. + @retval EFI_NOT_FOUND Unable to get data from Hii. **/ EFI_STATUS diff --git a/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideLib.c b/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideLib.c index 9a6050d32298..7767d11ecc43 100644 --- a/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideLib.c +++ b/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideLib.c @@ -157,6 +157,7 @@ CheckExistInStack ( is valid @retval EFI_SUCCESS Successfully updated the invalid DevicePath, and return the updated device path in DevicePath + @retval EFI_NOT_FOUND The FileGuid was not found in any Fv. **/ EFI_STATUS @@ -879,7 +880,8 @@ GetOneItemNeededSize ( Deletes all environment variable(s) that contain the override mappings from Controller Device Path to a set of Driver Device Paths. - @retval EFI_SUCCESS Delete all variable(s) successfully. + @retval EFI_SUCCESS Delete all variable(s) successfully. + @retval EFI_NOT_FOUND The variable was not found; **/ EFI_STATUS From 1097edb4c3eac1daf8161f8618a3eb7c81840c98 Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Wed, 22 Oct 2025 11:33:02 -0700 Subject: [PATCH 0801/1172] MdeModulePkg: Fix missing NULL tests. https://github.com/github/codeql/blob/codeql-cli-2.7.3/cpp/ql/src/Critical/MissingNullTest.qhelp For items which allocate memory, or get a pointer from another structure, it is important to validate that the pointers are not null before they are dereferenced. Signed-off-by: Aaron Pop --- MdeModulePkg/Universal/BdsDxe/BdsEntry.c | 26 ++++++++++------ .../BootManagerPolicyDxe.c | 3 +- .../DriverHealthManagerDxe.c | 21 ++++++++++--- .../EbcDxe/EbcDebugger/EdbSupportString.c | 5 ++- .../Universal/EbcDxe/EbcDebugger/EdbSymbol.c | 5 ++- .../FaultTolerantWritePei.c | 6 +++- .../PlatDriOverrideDxe.c | 24 +++++++++----- .../PlatDriOverrideLib.c | 31 +++++++++++++++---- .../Smm/ReportStatusCodeRouterCommon.c | 5 ++- 9 files changed, 93 insertions(+), 33 deletions(-) diff --git a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c b/MdeModulePkg/Universal/BdsDxe/BdsEntry.c index 78564919f312..5f1ebd71b375 100644 --- a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c +++ b/MdeModulePkg/Universal/BdsDxe/BdsEntry.c @@ -833,7 +833,7 @@ BdsEntry ( // if (PlatformDefaultBootOptionValid && PcdGetBool (PcdPlatformRecoverySupport)) { LoadOptions = EfiBootManagerGetLoadOptions (&LoadOptionCount, LoadOptionTypePlatformRecovery); - if (EfiBootManagerFindLoadOption (&PlatformDefaultBootOption, LoadOptions, LoadOptionCount) == -1) { + if ((LoadOptions != NULL) && (EfiBootManagerFindLoadOption (&PlatformDefaultBootOption, LoadOptions, LoadOptionCount) == -1)) { for (Index = 0; Index < LoadOptionCount; Index++) { // // The PlatformRecovery#### options are sorted by OptionNumber. @@ -901,8 +901,10 @@ BdsEntry ( // Execute Driver Options // LoadOptions = EfiBootManagerGetLoadOptions (&LoadOptionCount, LoadOptionTypeDriver); - ProcessLoadOptions (LoadOptions, LoadOptionCount); - EfiBootManagerFreeLoadOptions (LoadOptions, LoadOptionCount); + if (LoadOptions != NULL) { + ProcessLoadOptions (LoadOptions, LoadOptionCount); + EfiBootManagerFreeLoadOptions (LoadOptions, LoadOptionCount); + } // // Connect consoles @@ -1037,8 +1039,10 @@ BdsEntry ( // Execute SysPrep#### // LoadOptions = EfiBootManagerGetLoadOptions (&LoadOptionCount, LoadOptionTypeSysPrep); - ProcessLoadOptions (LoadOptions, LoadOptionCount); - EfiBootManagerFreeLoadOptions (LoadOptions, LoadOptionCount); + if (LoadOptions != NULL) { + ProcessLoadOptions (LoadOptions, LoadOptionCount); + EfiBootManagerFreeLoadOptions (LoadOptions, LoadOptionCount); + } // // Execute Key#### @@ -1095,8 +1099,10 @@ BdsEntry ( // Retry to boot if any of the boot succeeds // LoadOptions = EfiBootManagerGetLoadOptions (&LoadOptionCount, LoadOptionTypeBoot); - BootSuccess = BootBootOptions (LoadOptions, LoadOptionCount, (BootManagerMenuStatus != EFI_NOT_FOUND) ? &BootManagerMenu : NULL); - EfiBootManagerFreeLoadOptions (LoadOptions, LoadOptionCount); + if (LoadOptions != NULL) { + BootSuccess = BootBootOptions (LoadOptions, LoadOptionCount, (BootManagerMenuStatus != EFI_NOT_FOUND) ? &BootManagerMenu : NULL); + EfiBootManagerFreeLoadOptions (LoadOptions, LoadOptionCount); + } } while (BootSuccess); } @@ -1107,8 +1113,10 @@ BdsEntry ( if (!BootSuccess) { if (PcdGetBool (PcdPlatformRecoverySupport)) { LoadOptions = EfiBootManagerGetLoadOptions (&LoadOptionCount, LoadOptionTypePlatformRecovery); - ProcessLoadOptions (LoadOptions, LoadOptionCount); - EfiBootManagerFreeLoadOptions (LoadOptions, LoadOptionCount); + if (LoadOptions != NULL) { + ProcessLoadOptions (LoadOptions, LoadOptionCount); + EfiBootManagerFreeLoadOptions (LoadOptions, LoadOptionCount); + } } else if (PlatformDefaultBootOptionValid) { // // When platform recovery is not enabled, still boot to platform default file path. diff --git a/MdeModulePkg/Universal/BootManagerPolicyDxe/BootManagerPolicyDxe.c b/MdeModulePkg/Universal/BootManagerPolicyDxe/BootManagerPolicyDxe.c index 2c671f1d3841..67d2154bf4e7 100644 --- a/MdeModulePkg/Universal/BootManagerPolicyDxe/BootManagerPolicyDxe.c +++ b/MdeModulePkg/Universal/BootManagerPolicyDxe/BootManagerPolicyDxe.c @@ -43,8 +43,7 @@ ConnectAllAndCreateNetworkDeviceList ( Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiManagedNetworkServiceBindingProtocolGuid, NULL, &HandleCount, &Handles); if (EFI_ERROR (Status)) { - Handles = NULL; - HandleCount = 0; + return EFI_DEVICE_ERROR; } Devices = NULL; diff --git a/MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.c b/MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.c index d629684780a9..94f4b6281afd 100644 --- a/MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.c +++ b/MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.c @@ -528,8 +528,9 @@ DriverHealthManagerRepairNotify ( @param Handle Handle to the HII package list. @param FormsetGuid Return the formset GUID. - @retval EFI_SUCCESS The formset is found successfully. - @retval EFI_NOT_FOUND The formset cannot be found. + @retval EFI_SUCCESS The formset is found successfully. + @retval EFI_NOT_FOUND The formset cannot be found. + @retval EFI_OUT_OF_RESOURCES Failed to find enough free memory **/ EFI_STATUS DriverHealthManagerGetFormsetId ( @@ -557,7 +558,10 @@ DriverHealthManagerGetFormsetId ( Status = mDriverHealthManagerDatabase->ExportPackageLists (mDriverHealthManagerDatabase, Handle, &BufferSize, HiiPackageList); if (Status == EFI_BUFFER_TOO_SMALL) { HiiPackageList = AllocatePool (BufferSize); - ASSERT (HiiPackageList != NULL); + if (HiiPackageList == NULL) { + ASSERT (HiiPackageList != NULL); + return EFI_OUT_OF_RESOURCES; + } Status = mDriverHealthManagerDatabase->ExportPackageLists (mDriverHealthManagerDatabase, Handle, &BufferSize, HiiPackageList); } @@ -566,7 +570,10 @@ DriverHealthManagerGetFormsetId ( return Status; } - ASSERT (HiiPackageList != NULL); + if (HiiPackageList == NULL) { + ASSERT (HiiPackageList != NULL); + return EFI_NOT_FOUND; + } // // Get Form package from this HII package List @@ -607,6 +614,7 @@ DriverHealthManagerGetFormsetId ( // Form package not found in this Package List // FreePool (HiiPackageList); + return EFI_NOT_FOUND; } @@ -890,7 +898,10 @@ DriverHealthManagerCleanDynamicString ( FixedStringSize = *(UINT32 *)&STRING_ARRAY_NAME - sizeof (UINT32); BufferSize = sizeof (EFI_HII_PACKAGE_LIST_HEADER) + FixedStringSize + sizeof (EFI_HII_PACKAGE_HEADER); HiiPackageList = AllocatePool (BufferSize); - ASSERT (HiiPackageList != NULL); + if (HiiPackageList == NULL) { + ASSERT (HiiPackageList != NULL); + return; + } HiiPackageList->PackageLength = (UINT32)BufferSize; CopyMem (&HiiPackageList->PackageListGuid, &gEfiCallerIdGuid, sizeof (EFI_GUID)); diff --git a/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportString.c b/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportString.c index e450e576625f..68c296ae2d68 100644 --- a/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportString.c +++ b/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportString.c @@ -25,7 +25,10 @@ Xtoi ( CHAR16 TempChar; UINTN MaxVal; - ASSERT (Str != NULL); + if (Str == NULL) { + ASSERT (Str != NULL); + return 0; + } MaxVal = (UINTN)-1 >> 4; // diff --git a/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSymbol.c b/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSymbol.c index cc3b3e3eb18b..f6a9125c9d74 100644 --- a/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSymbol.c +++ b/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSymbol.c @@ -1268,7 +1268,10 @@ EdbLoadCodBySymbolByIec ( // get function name, function name is followed by char 0x09. // FieldBuffer = AsciiStrGetNewTokenField (LineBuffer, Char); - ASSERT (FieldBuffer != NULL); + if (FieldBuffer != NULL) { + break; + } + if (AsciiStriCmp (FieldBuffer, Name) == 0) { BufferStart = FieldBuffer; CodParseState = EdbEbcCodParseStateSymbolStart; diff --git a/MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.c b/MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.c index 8e3a6d14fac1..b0c3c38593ab 100644 --- a/MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.c +++ b/MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.c @@ -260,7 +260,10 @@ PeimFaultTolerantWriteInitialize ( } if (!EFI_ERROR (Status)) { - ASSERT (FtwLastWriteRecord != NULL); + if (FtwLastWriteRecord == NULL) { + goto End; + } + if ((FtwLastWriteRecord->SpareComplete == FTW_VALID_STATE) && (FtwLastWriteRecord->DestinationComplete != FTW_VALID_STATE)) { // // If FTW last write was still in progress with SpareComplete set and DestinationComplete not set. @@ -323,6 +326,7 @@ PeimFaultTolerantWriteInitialize ( } } +End: // // Install gEdkiiFaultTolerantWriteGuid PPI to inform the check for FTW last write data has been done. // diff --git a/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideDxe.c b/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideDxe.c index 519f29fb9ae6..caf3cf8dea46 100644 --- a/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideDxe.c +++ b/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideDxe.c @@ -1225,9 +1225,18 @@ PlatOverMngrExtractConfig ( // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator // ConfigRequestHdr = HiiConstructConfigHdr (&gPlatformOverridesManagerGuid, mVariableName, Private->DriverHandle); - Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); - ConfigRequest = AllocateZeroPool (Size); - ASSERT (ConfigRequest != NULL); + if (ConfigRequestHdr == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); + ConfigRequest = AllocateZeroPool (Size); + if (ConfigRequest == NULL) { + ASSERT (ConfigRequest != NULL); + FreePool (ConfigRequestHdr); + return EFI_OUT_OF_RESOURCES; + } + AllocatedRequest = TRUE; BufferSize = sizeof (PLAT_OVER_MNGR_DATA); UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize); @@ -1346,6 +1355,7 @@ PlatOverMngrRouteConfig ( @retval EFI_UNSUPPORTED An action is being passed that is not supported. @retval EFI_DEVICE_ERROR Changed failed to be commited. @retval EFI_NOT_FOUND Unable to get data from Hii. + @retval EFI_INVALID_PARMETER Input parameters are invalid. **/ EFI_STATUS @@ -1372,6 +1382,10 @@ PlatOverMngrCallback ( return EFI_UNSUPPORTED; } + if (Value == NULL) { + return EFI_INVALID_PARAMETER; + } + Private = EFI_CALLBACK_INFO_FROM_THIS (This); FakeNvData = &Private->FakeNvData; if (!HiiGetBrowserData (&gPlatformOverridesManagerGuid, mVariableName, sizeof (PLAT_OVER_MNGR_DATA), (UINT8 *)FakeNvData)) { @@ -1379,10 +1393,6 @@ PlatOverMngrCallback ( } if (Action == EFI_BROWSER_ACTION_CHANGING) { - if (Value == NULL) { - return EFI_INVALID_PARAMETER; - } - if (KeyValue == KEY_VALUE_DRIVER_GOTO_PREVIOUS) { UpdateDeviceSelectPage (Private, KeyValue, FakeNvData); // diff --git a/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideLib.c b/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideLib.c index 7767d11ecc43..9b79aea9758e 100644 --- a/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideLib.c +++ b/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideLib.c @@ -361,6 +361,10 @@ UpdateFvFileDevicePath ( // Build the shell device path // NewDevicePath = DevicePathFromHandle (FoundFvHandle); + if (NewDevicePath != NULL) { + return EFI_NOT_FOUND; + } + EfiInitializeFwVolDevicepathNode (&FvFileNode, FileGuid); NewDevicePath = AppendDevicePathNode (NewDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&FvFileNode); *DevicePath = NewDevicePath; @@ -1311,7 +1315,7 @@ GetDriverFromMapping ( OverrideItemListIndex = GetNextNode (MappingDataBase, OverrideItemListIndex); } - if (!ControllerFound) { + if (!ControllerFound || (OverrideItem == NULL)) { return EFI_NOT_FOUND; } @@ -1642,7 +1646,7 @@ CheckMapping ( OverrideItemListIndex = GetNextNode (MappingDataBase, OverrideItemListIndex); } - if (!Found) { + if (!Found || (OverrideItem == NULL)) { // // ControllerDevicePath is not in MappingDataBase // @@ -1719,6 +1723,7 @@ CheckMapping ( recorded into the mapping database. @retval EFI_SUCCESS The Controller and DriverImage are inserted into the mapping database successfully. + @retval EFI_OUT_OF_RESOURCES Could not allocate a required resource. **/ EFI_STATUS @@ -1797,18 +1802,30 @@ InsertDriverImage ( // if (!Found) { OverrideItem = AllocateZeroPool (sizeof (PLATFORM_OVERRIDE_ITEM)); - ASSERT (OverrideItem != NULL); + if (OverrideItem == NULL) { + ASSERT (OverrideItem != NULL); + return EFI_OUT_OF_RESOURCES; + } + OverrideItem->Signature = PLATFORM_OVERRIDE_ITEM_SIGNATURE; OverrideItem->ControllerDevicePath = DuplicateDevicePath (ControllerDevicePath); InitializeListHead (&OverrideItem->DriverInfoList); InsertTailList (MappingDataBase, &OverrideItem->Link); } + if (OverrideItem == NULL) { + return EFI_NOT_FOUND; + } + // // Prepare the driver image related DRIVER_IMAGE_INFO structure. // DriverImageInfo = AllocateZeroPool (sizeof (DRIVER_IMAGE_INFO)); - ASSERT (DriverImageInfo != NULL); + if (DriverImageInfo == NULL) { + ASSERT (DriverImageInfo != NULL); + return EFI_OUT_OF_RESOURCES; + } + DriverImageInfo->Signature = DRIVER_IMAGE_INFO_SIGNATURE; DriverImageInfo->DriverImagePath = DuplicateDevicePath (DriverImageDevicePath); // @@ -1921,8 +1938,9 @@ DeleteDriverImage ( OverrideItemListIndex = GetNextNode (MappingDataBase, OverrideItemListIndex); } - ASSERT (Found); - ASSERT (OverrideItem->DriverInfoNum != 0); + if (!Found) { + goto Exit; + } Found = FALSE; ImageInfoListIndex = GetFirstNode (&OverrideItem->DriverInfoList); @@ -1977,6 +1995,7 @@ DeleteDriverImage ( FreePool (OverrideItem); } +Exit: if (!Found) { // // DriverImageDevicePath is not NULL and cannot be found in the controller's diff --git a/MdeModulePkg/Universal/ReportStatusCodeRouter/Smm/ReportStatusCodeRouterCommon.c b/MdeModulePkg/Universal/ReportStatusCodeRouter/Smm/ReportStatusCodeRouterCommon.c index 286378e1d776..f9f5c4e01986 100644 --- a/MdeModulePkg/Universal/ReportStatusCodeRouter/Smm/ReportStatusCodeRouterCommon.c +++ b/MdeModulePkg/Universal/ReportStatusCodeRouter/Smm/ReportStatusCodeRouterCommon.c @@ -66,7 +66,10 @@ Register ( } CallbackEntry = (MM_RSC_HANDLER_CALLBACK_ENTRY *)AllocatePool (sizeof (MM_RSC_HANDLER_CALLBACK_ENTRY)); - ASSERT (CallbackEntry != NULL); + if (CallbackEntry == NULL) { + ASSERT (CallbackEntry != NULL); + return EFI_OUT_OF_RESOURCES; + } CallbackEntry->Signature = MM_RSC_HANDLER_CALLBACK_ENTRY_SIGNATURE; CallbackEntry->RscHandlerCallback = Callback; From 6d4fbc012fb196ddaff32e48f0c0a57307bf1729 Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Wed, 22 Oct 2025 11:33:02 -0700 Subject: [PATCH 0802/1172] MdeModulePkg: Fix unchecked return status. https://github.com/github/codeql/blob/codeql-cli-2.7.3/csharp/ql/src/API%20Abuse/UncheckedReturnValue.qhelp When a function has a return status, it should be checked to verify the function completed successfully. Failing to check the return status can result in null pointer dereferences or use of uninitialized variables. Signed-off-by: Aaron Pop --- MdeModulePkg/Universal/Variable/Pei/Variable.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/MdeModulePkg/Universal/Variable/Pei/Variable.c b/MdeModulePkg/Universal/Variable/Pei/Variable.c index 8bd72f0ecf9c..557d2dc99d48 100644 --- a/MdeModulePkg/Universal/Variable/Pei/Variable.c +++ b/MdeModulePkg/Universal/Variable/Pei/Variable.c @@ -858,6 +858,7 @@ FindVariableEx ( VARIABLE_STORE_HEADER *VariableStoreHeader; VARIABLE_INDEX_TABLE *IndexTable; VARIABLE_HEADER *VariableHeader; + BOOLEAN Valid; VariableStoreHeader = StoreInfo->VariableStoreHeader; @@ -894,8 +895,8 @@ FindVariableEx ( ASSERT (Index < sizeof (IndexTable->Index) / sizeof (IndexTable->Index[0])); Offset += IndexTable->Index[Index]; MaxIndex = (VARIABLE_HEADER *)((UINT8 *)IndexTable->StartPtr + Offset); - GetVariableHeader (StoreInfo, MaxIndex, &VariableHeader); - if (CompareWithValidVariable (StoreInfo, MaxIndex, VariableHeader, VariableName, VendorGuid, PtrTrack) == EFI_SUCCESS) { + Valid = GetVariableHeader (StoreInfo, MaxIndex, &VariableHeader); + if (Valid && (CompareWithValidVariable (StoreInfo, MaxIndex, VariableHeader, VariableName, VendorGuid, PtrTrack) == EFI_SUCCESS)) { if (VariableHeader->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) { InDeletedVariable = PtrTrack->CurrPtr; } else { @@ -1062,6 +1063,7 @@ PeiGetVariable ( EFI_STATUS Status; VARIABLE_STORE_INFO StoreInfo; VARIABLE_HEADER *VariableHeader; + BOOLEAN Valid; if ((VariableName == NULL) || (VariableGuid == NULL) || (DataSize == NULL)) { return EFI_INVALID_PARAMETER; @@ -1081,7 +1083,10 @@ PeiGetVariable ( return Status; } - GetVariableHeader (&StoreInfo, Variable.CurrPtr, &VariableHeader); + Valid = GetVariableHeader (&StoreInfo, Variable.CurrPtr, &VariableHeader); + if (!Valid) { + return EFI_DEVICE_ERROR; + } // // Get data size @@ -1156,6 +1161,7 @@ PeiGetNextVariableName ( VARIABLE_STORE_INFO StoreInfo; VARIABLE_STORE_INFO StoreInfoForNv; VARIABLE_STORE_INFO StoreInfoForHob; + BOOLEAN Valid; if ((VariableName == NULL) || (VariableGuid == NULL) || (VariableNameSize == NULL)) { return EFI_INVALID_PARAMETER; @@ -1172,7 +1178,11 @@ PeiGetNextVariableName ( // // If variable name is not NULL, get next variable // - GetVariableHeader (&StoreInfo, Variable.CurrPtr, &VariableHeader); + Valid = GetVariableHeader (&StoreInfo, Variable.CurrPtr, &VariableHeader); + if (!Valid) { + return EFI_DEVICE_ERROR; + } + Variable.CurrPtr = GetNextVariablePtr (&StoreInfo, Variable.CurrPtr, VariableHeader); } From 33219cef7344efa4fb2d2f4c85e9e47e28d38216 Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Wed, 22 Oct 2025 11:33:02 -0700 Subject: [PATCH 0803/1172] MdeModulePkg: Fix useless tests. https://github.com/github/codeql/blob/codeql-cli-2.7.3/java/ql/src/Language%20Abuse/UselessNullCheck.qhelp These are all recognized as useless checks. if (*TempString != L'\0' && *TempString == L'\\') { if ((*FilePath != L'\0') && (*FilePath == L'\\')) { while (*Str != '\0' && *Str == ' ') { while (*Str != '\0' && *Str == '0') { if ((*Str != '\0') && ((*Str == 'x') || (*Str == 'X'))) { while (*Str != '\0' && *Str == ' ') { For all of these cases, they are checking if the variable is not nil before they check if the character matches an exact character. If the variable matches the exact character, but that virtue, it will not be nil. Signed-off-by: Aaron Pop --- MdeModulePkg/Universal/Disk/UdfDxe/FileName.c | 2 +- .../Disk/UdfDxe/FileSystemOperations.c | 2 +- .../EbcDxe/EbcDebugger/EdbSupportString.c | 22 +++++++++---------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/FileName.c b/MdeModulePkg/Universal/Disk/UdfDxe/FileName.c index 6db34a9c8c8f..d7701ca1347c 100644 --- a/MdeModulePkg/Universal/Disk/UdfDxe/FileName.c +++ b/MdeModulePkg/Universal/Disk/UdfDxe/FileName.c @@ -84,7 +84,7 @@ ExcludeTrailingBackslashes ( } TempString = String; - while (*TempString != L'\0' && *TempString == L'\\') { + while (*TempString == L'\\') { TempString++; } diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c b/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c index 86020de6e092..977285b951f6 100644 --- a/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c +++ b/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c @@ -1939,7 +1939,7 @@ FindFile ( } CopyMem ((VOID *)&PreviousFile, (VOID *)File, sizeof (UDF_FILE_INFO)); - if ((*FilePath != L'\0') && (*FilePath == L'\\')) { + if ((*FilePath == L'\\')) { FilePath++; } } diff --git a/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportString.c b/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportString.c index 68c296ae2d68..586301d8edc8 100644 --- a/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportString.c +++ b/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportString.c @@ -34,21 +34,21 @@ Xtoi ( // // skip preceeding white space // - while (*Str != '\0' && *Str == ' ') { + while (*Str == ' ') { Str += 1; } // // skip preceeding zeros // - while (*Str != '\0' && *Str == '0') { + while (*Str == '0') { Str += 1; } // // skip preceeding white space // - if ((*Str != '\0') && ((*Str == 'x') || (*Str == 'X'))) { + if (((*Str == 'x') || (*Str == 'X'))) { Str += 1; } @@ -101,21 +101,21 @@ LXtoi ( // // skip preceeding white space // - while (*Str != '\0' && *Str == ' ') { + while (*Str == ' ') { Str += 1; } // // skip preceeding zeros // - while (*Str != '\0' && *Str == '0') { + while (*Str == '0') { Str += 1; } // // skip preceeding white space // - if ((*Str != '\0') && ((*Str == 'x') || (*Str == 'X'))) { + if (((*Str == 'x') || (*Str == 'X'))) { Str += 1; } @@ -171,7 +171,7 @@ Atoi ( // // skip preceeding white space // - while (*Str != '\0' && *Str == ' ') { + while (*Str == ' ') { Str += 1; } @@ -220,21 +220,21 @@ AsciiXtoi ( // // skip preceeding white space // - while (*Str != '\0' && *Str == ' ') { + while (*Str == ' ') { Str += 1; } // // skip preceeding zeros // - while (*Str != '\0' && *Str == '0') { + while (*Str == '0') { Str += 1; } // // skip preceeding white space // - if ((*Str != '\0') && ((*Str == 'x') || (*Str == 'X'))) { + if (((*Str == 'x') || (*Str == 'X'))) { Str += 1; } @@ -289,7 +289,7 @@ AsciiAtoi ( // // skip preceeding white space // - while (*Str != '\0' && *Str == ' ') { + while (*Str == ' ') { Str += 1; } From 2fda942498a6de86ca69a7c9f26eeef99bf55dc3 Mon Sep 17 00:00:00 2001 From: Hongbin1 Zhang Date: Wed, 5 Nov 2025 13:20:48 +0800 Subject: [PATCH 0804/1172] IntelFsp2Pkg: Correct ApiIdx type For function FspMultiPhasePlatformGetNumberOfPhases, the type of ApiIdx is not aligned in header file and c function, correct and make it align. Signed-off-by: Hongbin1 Zhang Cc: Ray Ni Cc: Star Zeng Cc: Chasel Chiu Cc: Nate DeSimone Cc: Ted Kuo Cc: Ashraf Ali S --- IntelFsp2Pkg/Include/Library/FspSecPlatformLib.h | 2 +- .../Library/SecFspSecPlatformLibNull/PlatformSecLibNull.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/IntelFsp2Pkg/Include/Library/FspSecPlatformLib.h b/IntelFsp2Pkg/Include/Library/FspSecPlatformLib.h index 598fdb9ec5be..675b3ab02fb3 100644 --- a/IntelFsp2Pkg/Include/Library/FspSecPlatformLib.h +++ b/IntelFsp2Pkg/Include/Library/FspSecPlatformLib.h @@ -112,7 +112,7 @@ FspMultiPhaseSiInitApiHandler ( BOOLEAN EFIAPI FspMultiPhasePlatformGetNumberOfPhases ( - IN UINTN ApiIdx, + IN UINT32 ApiIdx, IN OUT UINT32 *NumberOfPhasesSupported ); diff --git a/IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/PlatformSecLibNull.c b/IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/PlatformSecLibNull.c index 9c1b5b32e931..67b8247510e6 100644 --- a/IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/PlatformSecLibNull.c +++ b/IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/PlatformSecLibNull.c @@ -62,7 +62,7 @@ FspMultiPhaseSiInitApiHandler ( BOOLEAN EFIAPI FspMultiPhasePlatformGetNumberOfPhases ( - IN UINT8 ApiIdx, + IN UINT32 ApiIdx, IN OUT UINT32 *NumberOfPhasesSupported ) { From f12137456ab40ecfcf99ed93126fb3fbd78afb45 Mon Sep 17 00:00:00 2001 From: Zhiguang Liu Date: Mon, 3 Nov 2025 11:54:03 +0800 Subject: [PATCH 0805/1172] IntelFsp2Pkg: Migrate GDT in SecTemporaryRamSupport FSP API mode is using a separate GDT, which may be in NEM or flash. Need to migrate it into permanent memory Signed-off-by: Zhiguang Liu --- IntelFsp2Pkg/FspSecCore/SecMain.c | 47 ++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/IntelFsp2Pkg/FspSecCore/SecMain.c b/IntelFsp2Pkg/FspSecCore/SecMain.c index 94ea3865b45f..164f8230490f 100644 --- a/IntelFsp2Pkg/FspSecCore/SecMain.c +++ b/IntelFsp2Pkg/FspSecCore/SecMain.c @@ -215,16 +215,43 @@ SecTemporaryRamSupport ( IN UINTN CopySize ) { - IA32_DESCRIPTOR IdtDescriptor; - VOID *OldHeap; - VOID *NewHeap; - VOID *OldStack; - VOID *NewStack; - UINTN HeapSize; - UINTN StackSize; - - UINTN CurrentStack; - UINTN FspStackBase; + IA32_DESCRIPTOR IdtDescriptor; + VOID *OldHeap; + VOID *NewHeap; + VOID *OldStack; + VOID *NewStack; + UINTN HeapSize; + UINTN StackSize; + IA32_DESCRIPTOR Gdtr; + EFI_PHYSICAL_ADDRESS GdtBuffer; + EFI_STATUS Status; + UINTN CurrentStack; + UINTN FspStackBase; + + // + // Migrates the Global Descriptor Table (GDT) to permanent memory. + // + AsmReadGdtr (&Gdtr); + + // + // Allocate the permanent memory for GDT. + // + Status = (*PeiServices)->AllocatePages ( + PeiServices, + EfiBootServicesCode, + EFI_SIZE_TO_PAGES (Gdtr.Limit + 1), + &GdtBuffer + ); + + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return EFI_OUT_OF_RESOURCES; + } + + ASSERT ((VOID *)(UINTN)GdtBuffer != NULL); + CopyMem ((VOID *)(UINTN)GdtBuffer, (VOID *)Gdtr.Base, Gdtr.Limit + 1); + Gdtr.Base = (UINTN)GdtBuffer; + AsmWriteGdtr (&Gdtr); // // Override OnSeparateStack to 1 because this function will switch stack to permanent memory From 30b405d79a0be8bb46aa2bdcf242e2653c1ce39c Mon Sep 17 00:00:00 2001 From: George Liao Date: Mon, 10 Nov 2025 17:33:52 +0800 Subject: [PATCH 0806/1172] MdeModulePkg/AcpiTableDxe: Fixed exception when enable SpecialPool In some corner cases the NeedToInstallTable not been initialized well in the InstallAcpiTableFromAcpiSiliconHob, which caused exception when enable special pool function. This patch fixed exception by initialize NeedToInstallTable well. Signed-off-by: George Liao --- .../Acpi/AcpiTableDxe/AcpiTableProtocol.c | 95 +++++++++++-------- 1 file changed, 58 insertions(+), 37 deletions(-) diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c index 73425f038dde..5ea4922651dd 100644 --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c @@ -2162,32 +2162,41 @@ InstallAcpiTableFromAcpiSiliconHob ( NeedToInstallTable = (VOID *)(UINTN)((EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)SocEntryTable)->XDsdt; } else if (((EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)SocEntryTable)->Dsdt != 0) { NeedToInstallTable = (VOID *)(UINTN)((EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)SocEntryTable)->Dsdt; + } else { + // + // The XDsdt or Dsdt not be detected, so set NeedToInstallTable to NULL to skip Dsdt installation. + // + NeedToInstallTable = NULL; } - // - // if signature can not be found from the XDsdt / Dsdt field then skip it. - // - if (((EFI_ACPI_DESCRIPTION_HEADER *)NeedToInstallTable)->Signature == EFI_ACPI_3_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE) { - Status = AddTableToList (AcpiTableInstance, NeedToInstallTable, TRUE, Version, TRUE, &TableKey); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "Fail to add DSDT in the DXE Table list!\n")); - ASSERT_EFI_ERROR (Status); - break; - } else { - Status = PublishTables (AcpiTableInstance, Version); - if (!EFI_ERROR (Status)) { - // - // Add a new table successfully, notify registed callback - // - if (FeaturePcdGet (PcdInstallAcpiSdtProtocol)) { - SdtNotifyAcpiList (AcpiTableInstance, Version, TableKey); + if (NeedToInstallTable != NULL) { + // + // if signature can not be found from the XDsdt / Dsdt field then skip it. + // + if (((EFI_ACPI_DESCRIPTION_HEADER *)NeedToInstallTable)->Signature == EFI_ACPI_3_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE) { + Status = AddTableToList (AcpiTableInstance, NeedToInstallTable, TRUE, Version, TRUE, &TableKey); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Fail to add DSDT in the DXE Table list!\n")); + ASSERT_EFI_ERROR (Status); + break; + } else { + Status = PublishTables (AcpiTableInstance, Version); + if (!EFI_ERROR (Status)) { + // + // Add a new table successfully, notify registed callback + // + if (FeaturePcdGet (PcdInstallAcpiSdtProtocol)) { + SdtNotifyAcpiList (AcpiTableInstance, Version, TableKey); + } } - } - DEBUG ((DEBUG_INFO, "Installed DSDT in the DXE Table list!\n")); + DEBUG ((DEBUG_INFO, "Installed DSDT in the DXE Table list!\n")); + } + } else { + DEBUG ((DEBUG_ERROR, "The DSDT content is not correct, then skip it!\n")); } } else { - DEBUG ((DEBUG_ERROR, "The DSDT content is not correct, then skip it!\n")); + DEBUG ((DEBUG_ERROR, "The DSDT Table not initialized during PEI phase yet.\n")); } // @@ -2197,29 +2206,41 @@ InstallAcpiTableFromAcpiSiliconHob ( NeedToInstallTable = (VOID *)(UINTN)((EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)SocEntryTable)->XFirmwareCtrl; } else if (((EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)SocEntryTable)->FirmwareCtrl != 0) { NeedToInstallTable = (VOID *)(UINTN)((EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)SocEntryTable)->FirmwareCtrl; + } else { + // + // The XFirmwareCtrl or FirmwareCtrl not be detected, so set NeedToInstallTable to NULL to skip Facs installation. + // + NeedToInstallTable = NULL; } - if (((EFI_ACPI_DESCRIPTION_HEADER *)NeedToInstallTable)->Signature == EFI_ACPI_3_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) { - Status = AddTableToList (AcpiTableInstance, NeedToInstallTable, TRUE, Version, TRUE, &TableKey); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "Fail to add FACS in the DXE Table list!\n")); - ASSERT_EFI_ERROR (Status); - break; - } else { - Status = PublishTables (AcpiTableInstance, Version); - if (!EFI_ERROR (Status)) { - // - // Add a new table successfully, notify registed callback - // - if (FeaturePcdGet (PcdInstallAcpiSdtProtocol)) { - SdtNotifyAcpiList (AcpiTableInstance, Version, TableKey); + if (NeedToInstallTable != NULL) { + // + // if signature can not be found from the XFirmwareCtrl / FirmwareCtrl field then skip it. + // + if (((EFI_ACPI_DESCRIPTION_HEADER *)NeedToInstallTable)->Signature == EFI_ACPI_3_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) { + Status = AddTableToList (AcpiTableInstance, NeedToInstallTable, TRUE, Version, TRUE, &TableKey); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Fail to add FACS in the DXE Table list!\n")); + ASSERT_EFI_ERROR (Status); + break; + } else { + Status = PublishTables (AcpiTableInstance, Version); + if (!EFI_ERROR (Status)) { + // + // Add a new table successfully, notify registed callback + // + if (FeaturePcdGet (PcdInstallAcpiSdtProtocol)) { + SdtNotifyAcpiList (AcpiTableInstance, Version, TableKey); + } } - } - DEBUG ((DEBUG_INFO, "Installed FACS in the DXE Table list!\n")); + DEBUG ((DEBUG_INFO, "Installed FACS in the DXE Table list!\n")); + } + } else { + DEBUG ((DEBUG_ERROR, "The FACS content is not correct, then skip it!\n")); } } else { - DEBUG ((DEBUG_ERROR, "The FACS content is not correct, then skip it!\n")); + DEBUG ((DEBUG_ERROR, "The FACS Table not initialized during PEI phase yet.\n")); } } } From 875362bf579486f0b72cf0cd5190d21ded769177 Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Wed, 22 Oct 2025 11:33:02 -0700 Subject: [PATCH 0807/1172] MdeModulePkg: Bds Fix potential infinite loop. Bds will get the List of Boot Options and attempt to boot. If there were no valid load options, the system could infinitely be stuck in the attempt boot loop. Add NULL checks to prevent a protentional infinite boot retry loop. Signed-off-by: Aaron Pop --- MdeModulePkg/Universal/BdsDxe/BdsEntry.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c b/MdeModulePkg/Universal/BdsDxe/BdsEntry.c index 5f1ebd71b375..8a1d8336a049 100644 --- a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c +++ b/MdeModulePkg/Universal/BdsDxe/BdsEntry.c @@ -699,7 +699,6 @@ BdsEntry ( HotkeyTriggered = NULL; Status = EFI_SUCCESS; - BootSuccess = FALSE; // // Insert the performance probe @@ -1098,6 +1097,7 @@ BdsEntry ( // // Retry to boot if any of the boot succeeds // + BootSuccess = FALSE; LoadOptions = EfiBootManagerGetLoadOptions (&LoadOptionCount, LoadOptionTypeBoot); if (LoadOptions != NULL) { BootSuccess = BootBootOptions (LoadOptions, LoadOptionCount, (BootManagerMenuStatus != EFI_NOT_FOUND) ? &BootManagerMenu : NULL); From 40d461d25f32cb33eeeede9068ed1fdc44646f06 Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Thu, 9 Oct 2025 00:10:24 +0530 Subject: [PATCH 0808/1172] ShellPkg/Library: Remove ScsiPassThruProtocolGuid The legacy ScsiPassThruProtocol has been removed as per the UEFI 2.10A specification. This commit, removes references to ScsiPassThruProtocol and transitions the implementation to only use ExtScsiPassThruProtocol, which provides enhanced support for device enumeration, target/LUN discovery, and broader SCSI compatibility. Cc: Sachin Ganesh Signed-off-by: Gowtham M --- ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c | 1 - ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h | 1 - ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf | 1 - 3 files changed, 3 deletions(-) diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c index ea018f51caa2..023a4bce8029 100644 --- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c +++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c @@ -2252,7 +2252,6 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = { { STRING_TOKEN (STR_UC2), &gEfiUnicodeCollation2ProtocolGuid, NULL }, { STRING_TOKEN (STR_PCIRB_IO), &gEfiPciRootBridgeIoProtocolGuid, PciRootBridgeIoDumpInformation }, { STRING_TOKEN (STR_PCI_IO), &gEfiPciIoProtocolGuid, PciIoProtocolDumpInformation }, - { STRING_TOKEN (STR_SCSI_PT), &gEfiScsiPassThruProtocolGuid, NULL }, { STRING_TOKEN (STR_SCSI_IO), &gEfiScsiIoProtocolGuid, NULL }, { STRING_TOKEN (STR_SCSI_PT_EXT), &gEfiExtScsiPassThruProtocolGuid, NULL }, { STRING_TOKEN (STR_ISCSI), &gEfiIScsiInitiatorNameProtocolGuid, NULL }, diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h index 2a0416136613..f4b66b53bf2d 100644 --- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h +++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.h @@ -58,7 +58,6 @@ #include #include #include -#include #include #include #include diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf index 60898da952e7..1c4cfc9c4403 100644 --- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf +++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf @@ -84,7 +84,6 @@ gEfiBlockIoProtocolGuid ## UNDEFINED gEfiPciRootBridgeIoProtocolGuid ## UNDEFINED gEfiPciIoProtocolGuid ## UNDEFINED - gEfiScsiPassThruProtocolGuid ## UNDEFINED gEfiScsiIoProtocolGuid ## UNDEFINED gEfiExtScsiPassThruProtocolGuid ## UNDEFINED gEfiIScsiInitiatorNameProtocolGuid ## UNDEFINED From 18ac0c8e9333dee959cc741dcaf380566dbe1ffa Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Thu, 9 Oct 2025 00:05:50 +0530 Subject: [PATCH 0809/1172] MdeModulePkg/Bus: Remove ScsiPassThruProtocolGuid The legacy ScsiPassThruProtocol has been removed as per the UEFI 2.10A specification. This commit, removes references to ScsiPassThruProtocol and transitions the implementation to only use ExtScsiPassThruProtocol, which provides enhanced support for device enumeration, target/LUN discovery, and broader SCSI compatibility. Cc: Sachin Ganesh Signed-off-by: Gowtham M --- MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.c | 569 ++---------------- MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.h | 5 - .../Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf | 1 - MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c | 16 +- MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.h | 1 - .../Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf | 1 - 6 files changed, 68 insertions(+), 525 deletions(-) diff --git a/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.c b/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.c index d6c965def30b..498bcea9c868 100644 --- a/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.c +++ b/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.c @@ -22,49 +22,6 @@ EFI_DRIVER_BINDING_PROTOCOL gSCSIBusDriverBinding = { VOID *mWorkingBuffer; -/** - Convert EFI_SCSI_IO_SCSI_REQUEST_PACKET packet to EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET packet. - - @param Packet The pointer of EFI_SCSI_IO_SCSI_REQUEST_PACKET - @param CommandPacket The pointer of EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET - -**/ -EFI_STATUS -EFIAPI -ScsiioToPassThruPacket ( - IN EFI_SCSI_IO_SCSI_REQUEST_PACKET *Packet, - OUT EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *CommandPacket - ); - -/** - Convert EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET packet to EFI_SCSI_IO_SCSI_REQUEST_PACKET packet. - - @param ScsiPacket The pointer of EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET - @param Packet The pointer of EFI_SCSI_IO_SCSI_REQUEST_PACKET - -**/ -EFI_STATUS -EFIAPI -PassThruToScsiioPacket ( - IN EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *ScsiPacket, - OUT EFI_SCSI_IO_SCSI_REQUEST_PACKET *Packet - ); - -/** - Notify Function in which convert EFI1.0 PassThru Packet back to UEF2.0 - SCSI IO Packet. - - @param Event The instance of EFI_EVENT. - @param Context The parameter passed in. - -**/ -VOID -EFIAPI -NotifyFunction ( - IN EFI_EVENT Event, - IN VOID *Context - ); - /** Allocates an aligned buffer for SCSI device. @@ -171,7 +128,6 @@ SCSIBusDriverBindingSupported ( ) { EFI_STATUS Status; - EFI_SCSI_PASS_THRU_PROTOCOL *PassThru; EFI_EXT_SCSI_PASS_THRU_PROTOCOL *ExtPassThru; UINT64 Lun; UINT8 *TargetId; @@ -232,41 +188,6 @@ SCSIBusDriverBindingSupported ( } } - // - // Come here in 2 condition: - // 1. ExtPassThru doesn't exist. - // 2. ExtPassThru exists but RemainingDevicePath is invalid. - // - Status = gBS->OpenProtocol ( - Controller, - &gEfiScsiPassThruProtocolGuid, - (VOID **)&PassThru, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - - if (Status == EFI_ALREADY_STARTED) { - return EFI_SUCCESS; - } - - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Test RemainingDevicePath is valid or not. - // - if ((RemainingDevicePath != NULL) && !IsDevicePathEnd (RemainingDevicePath)) { - Status = PassThru->GetTargetLun (PassThru, RemainingDevicePath, &ScsiTargetId.ScsiId.Scsi, &Lun); - } - - gBS->CloseProtocol ( - Controller, - &gEfiScsiPassThruProtocolGuid, - This->DriverBindingHandle, - Controller - ); return Status; } @@ -301,22 +222,17 @@ SCSIBusDriverBindingStart ( UINT8 *TargetId; BOOLEAN ScanOtherPuns; BOOLEAN FromFirstTarget; - BOOLEAN ExtScsiSupport; EFI_STATUS Status; EFI_STATUS DevicePathStatus; - EFI_STATUS PassThruStatus; SCSI_BUS_DEVICE *ScsiBusDev; SCSI_TARGET_ID ScsiTargetId; EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; - EFI_SCSI_PASS_THRU_PROTOCOL *ScsiInterface; EFI_EXT_SCSI_PASS_THRU_PROTOCOL *ExtScsiInterface; EFI_SCSI_BUS_PROTOCOL *BusIdentify; TargetId = NULL; ScanOtherPuns = TRUE; FromFirstTarget = FALSE; - ExtScsiSupport = FALSE; - PassThruStatus = EFI_SUCCESS; TargetId = &ScsiTargetId.ScsiId.ExtScsi[0]; SetMem (TargetId, TARGET_MAX_BYTES, 0xFF); @@ -343,9 +259,7 @@ SCSIBusDriverBindingStart ( ); // - // To keep backward compatibility, UEFI ExtPassThru Protocol is supported as well as - // EFI PassThru Protocol. From priority perspective, ExtPassThru Protocol is firstly - // tried to open on host controller handle. If fails, then PassThru Protocol is tried instead. + // Try ExtPassThru Protocol to open on host controller handle. // Status = gBS->OpenProtocol ( Controller, @@ -355,53 +269,10 @@ SCSIBusDriverBindingStart ( Controller, EFI_OPEN_PROTOCOL_BY_DRIVER ); - // - // Fail to open UEFI ExtendPassThru Protocol, then try to open EFI PassThru Protocol instead. - // - if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) { - Status = gBS->OpenProtocol ( - Controller, - &gEfiScsiPassThruProtocolGuid, - (VOID **)&ScsiInterface, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - // - // Fail to open EFI PassThru Protocol, Close the DevicePathProtocol if it is opened by this time. - // - if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) { - if (!EFI_ERROR (DevicePathStatus)) { - gBS->CloseProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - This->DriverBindingHandle, - Controller - ); - } - - return Status; - } - } else { - // - // Succeed to open ExtPassThru Protocol, and meanwhile open PassThru Protocol - // with BY_DRIVER if it is also present on the handle. The intent is to prevent - // another SCSI Bus Driver to work on the same host handle. - // - ExtScsiSupport = TRUE; - PassThruStatus = gBS->OpenProtocol ( - Controller, - &gEfiScsiPassThruProtocolGuid, - (VOID **)&ScsiInterface, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - } if (Status != EFI_ALREADY_STARTED) { // - // Go through here means either ExtPassThru or PassThru Protocol is successfully opened + // Going through here means that ExtPassThru Protocol is successfully opened // on this handle for this time. Then construct Host controller private data. // ScsiBusDev = NULL; @@ -411,14 +282,9 @@ SCSIBusDriverBindingStart ( goto ErrorExit; } - ScsiBusDev->Signature = SCSI_BUS_DEVICE_SIGNATURE; - ScsiBusDev->ExtScsiSupport = ExtScsiSupport; - ScsiBusDev->DevicePath = ParentDevicePath; - if (ScsiBusDev->ExtScsiSupport) { - ScsiBusDev->ExtScsiInterface = ExtScsiInterface; - } else { - ScsiBusDev->ScsiInterface = ScsiInterface; - } + ScsiBusDev->Signature = SCSI_BUS_DEVICE_SIGNATURE; + ScsiBusDev->DevicePath = ParentDevicePath; + ScsiBusDev->ExtScsiInterface = ExtScsiInterface; // // Install EFI_SCSI_BUS_PROTOCOL to the controller handle, So ScsiBusDev could be @@ -476,11 +342,7 @@ SCSIBusDriverBindingStart ( // If RemainingDevicePath isn't the End of Device Path Node, // only scan the specified device by RemainingDevicePath // - if (ScsiBusDev->ExtScsiSupport) { - Status = ScsiBusDev->ExtScsiInterface->GetTargetLun (ScsiBusDev->ExtScsiInterface, RemainingDevicePath, &TargetId, &Lun); - } else { - Status = ScsiBusDev->ScsiInterface->GetTargetLun (ScsiBusDev->ScsiInterface, RemainingDevicePath, &ScsiTargetId.ScsiId.Scsi, &Lun); - } + Status = ScsiBusDev->ExtScsiInterface->GetTargetLun (ScsiBusDev->ExtScsiInterface, RemainingDevicePath, &TargetId, &Lun); if (EFI_ERROR (Status)) { return Status; @@ -499,11 +361,7 @@ SCSIBusDriverBindingStart ( // Remaining Device Path is NULL, scan all the possible Puns in the // SCSI Channel. // - if (ScsiBusDev->ExtScsiSupport) { - Status = ScsiBusDev->ExtScsiInterface->GetNextTargetLun (ScsiBusDev->ExtScsiInterface, &TargetId, &Lun); - } else { - Status = ScsiBusDev->ScsiInterface->GetNextDevice (ScsiBusDev->ScsiInterface, &ScsiTargetId.ScsiId.Scsi, &Lun); - } + Status = ScsiBusDev->ExtScsiInterface->GetNextTargetLun (ScsiBusDev->ExtScsiInterface, &TargetId, &Lun); if (EFI_ERROR (Status)) { // @@ -518,14 +376,8 @@ SCSIBusDriverBindingStart ( // // Avoid creating handle for the host adapter. // - if (ScsiBusDev->ExtScsiSupport) { - if ((ScsiTargetId.ScsiId.Scsi) == ScsiBusDev->ExtScsiInterface->Mode->AdapterId) { - continue; - } - } else { - if ((ScsiTargetId.ScsiId.Scsi) == ScsiBusDev->ScsiInterface->Mode->AdapterId) { - continue; - } + if ((ScsiTargetId.ScsiId.Scsi) == ScsiBusDev->ExtScsiInterface->Mode->AdapterId) { + continue; } // @@ -546,29 +398,12 @@ SCSIBusDriverBindingStart ( FreePool (ScsiBusDev); } - if (ExtScsiSupport) { - gBS->CloseProtocol ( - Controller, - &gEfiExtScsiPassThruProtocolGuid, - This->DriverBindingHandle, - Controller - ); - if (!EFI_ERROR (PassThruStatus)) { - gBS->CloseProtocol ( - Controller, - &gEfiScsiPassThruProtocolGuid, - This->DriverBindingHandle, - Controller - ); - } - } else { - gBS->CloseProtocol ( - Controller, - &gEfiScsiPassThruProtocolGuid, - This->DriverBindingHandle, - Controller - ); - } + gBS->CloseProtocol ( + Controller, + &gEfiExtScsiPassThruProtocolGuid, + This->DriverBindingHandle, + Controller + ); return Status; } @@ -606,7 +441,7 @@ SCSIBusDriverBindingStop ( UINTN Index; EFI_SCSI_IO_PROTOCOL *ScsiIo; SCSI_IO_DEV *ScsiIoDevice; - VOID *ScsiPassThru; + VOID *ExtScsiPassThru; EFI_SCSI_BUS_PROTOCOL *Scsidentifier; SCSI_BUS_DEVICE *ScsiBusDev; @@ -641,35 +476,15 @@ SCSIBusDriverBindingStop ( // // Close the bus driver // - if (ScsiBusDev->ExtScsiSupport) { - // - // Close ExtPassThru Protocol from this controller handle - // - gBS->CloseProtocol ( - Controller, - &gEfiExtScsiPassThruProtocolGuid, - This->DriverBindingHandle, - Controller - ); - // - // When Start() succeeds to open ExtPassThru, it always tries to open PassThru BY_DRIVER. - // Its intent is to prevent another SCSI Bus Driver from working on the same host handle. - // So Stop() needs to try to close PassThru if present here. - // - gBS->CloseProtocol ( - Controller, - &gEfiScsiPassThruProtocolGuid, - This->DriverBindingHandle, - Controller - ); - } else { - gBS->CloseProtocol ( - Controller, - &gEfiScsiPassThruProtocolGuid, - This->DriverBindingHandle, - Controller - ); - } + // + // Close ExtPassThru Protocol from this controller handle + // + gBS->CloseProtocol ( + Controller, + &gEfiExtScsiPassThruProtocolGuid, + This->DriverBindingHandle, + Controller + ); gBS->CloseProtocol ( Controller, @@ -701,21 +516,12 @@ SCSIBusDriverBindingStop ( // // Close the child handle // - if (ScsiIoDevice->ExtScsiSupport) { - Status = gBS->CloseProtocol ( - Controller, - &gEfiExtScsiPassThruProtocolGuid, - This->DriverBindingHandle, - ChildHandleBuffer[Index] - ); - } else { - Status = gBS->CloseProtocol ( - Controller, - &gEfiScsiPassThruProtocolGuid, - This->DriverBindingHandle, - ChildHandleBuffer[Index] - ); - } + Status = gBS->CloseProtocol ( + Controller, + &gEfiExtScsiPassThruProtocolGuid, + This->DriverBindingHandle, + ChildHandleBuffer[Index] + ); Status = gBS->UninstallMultipleProtocolInterfaces ( ChildHandleBuffer[Index], @@ -727,25 +533,14 @@ SCSIBusDriverBindingStop ( ); if (EFI_ERROR (Status)) { AllChildrenStopped = FALSE; - if (ScsiIoDevice->ExtScsiSupport) { - gBS->OpenProtocol ( - Controller, - &gEfiExtScsiPassThruProtocolGuid, - &ScsiPassThru, - This->DriverBindingHandle, - ChildHandleBuffer[Index], - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER - ); - } else { - gBS->OpenProtocol ( - Controller, - &gEfiScsiPassThruProtocolGuid, - &ScsiPassThru, - This->DriverBindingHandle, - ChildHandleBuffer[Index], - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER - ); - } + gBS->OpenProtocol ( + Controller, + &gEfiExtScsiPassThruProtocolGuid, + &ExtScsiPassThru, + This->DriverBindingHandle, + ChildHandleBuffer[Index], + EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER + ); } else { FreePool (ScsiIoDevice); } @@ -854,10 +649,10 @@ ScsiResetBus ( ScsiIoDevice->ScsiBusDeviceData->DevicePath ); - if (ScsiIoDevice->ExtScsiSupport) { + if (ScsiIoDevice->ExtScsiPassThru != NULL) { return ScsiIoDevice->ExtScsiPassThru->ResetChannel (ScsiIoDevice->ExtScsiPassThru); } else { - return ScsiIoDevice->ScsiPassThru->ResetChannel (ScsiIoDevice->ScsiPassThru); + return EFI_UNSUPPORTED; } } @@ -894,18 +689,14 @@ ScsiResetDevice ( CopyMem (Target, &ScsiIoDevice->Pun, TARGET_MAX_BYTES); - if (ScsiIoDevice->ExtScsiSupport) { + if (ScsiIoDevice->ExtScsiPassThru != NULL) { return ScsiIoDevice->ExtScsiPassThru->ResetTargetLun ( ScsiIoDevice->ExtScsiPassThru, Target, ScsiIoDevice->Lun ); } else { - return ScsiIoDevice->ScsiPassThru->ResetTarget ( - ScsiIoDevice->ScsiPassThru, - ScsiIoDevice->Pun.ScsiId.Scsi, - ScsiIoDevice->Lun - ); + return EFI_UNSUPPORTED; } } @@ -967,11 +758,7 @@ ScsiExecuteSCSICommand ( SCSI_IO_DEV *ScsiIoDevice; EFI_STATUS Status; UINT8 Target[TARGET_MAX_BYTES]; - EFI_EVENT PacketEvent; EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *ExtRequestPacket; - SCSI_EVENT_DATA EventData; - - PacketEvent = NULL; if (Packet == NULL) { return EFI_INVALID_PARAMETER; @@ -980,10 +767,9 @@ ScsiExecuteSCSICommand ( ScsiIoDevice = SCSI_IO_DEV_FROM_THIS (This); CopyMem (Target, &ScsiIoDevice->Pun, TARGET_MAX_BYTES); - if (ScsiIoDevice->ExtScsiSupport) { - ExtRequestPacket = (EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *)Packet; - - if (((ScsiIoDevice->ExtScsiPassThru->Mode->Attributes & EFI_SCSI_PASS_THRU_ATTRIBUTES_NONBLOCKIO) != 0) && (Event != NULL)) { + ExtRequestPacket = (EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *)Packet; + if (ScsiIoDevice->ExtScsiPassThru != NULL) { + if (((ScsiIoDevice->ExtScsiPassThru->Mode->Attributes & EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_NONBLOCKIO) != 0) && (Event != NULL)) { Status = ScsiIoDevice->ExtScsiPassThru->PassThru ( ScsiIoDevice->ExtScsiPassThru, Target, @@ -1011,87 +797,11 @@ ScsiExecuteSCSICommand ( gBS->SignalEvent (Event); } } - } else { - mWorkingBuffer = AllocatePool (sizeof (EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET)); - - if (mWorkingBuffer == NULL) { - return EFI_DEVICE_ERROR; - } - - // - // Convert package into EFI1.0, EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET. - // - Status = ScsiioToPassThruPacket (Packet, (EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *)mWorkingBuffer); - if (EFI_ERROR (Status)) { - FreePool (mWorkingBuffer); - return Status; - } - - if (((ScsiIoDevice->ScsiPassThru->Mode->Attributes & EFI_SCSI_PASS_THRU_ATTRIBUTES_NONBLOCKIO) != 0) && (Event != NULL)) { - EventData.Data1 = (VOID *)Packet; - EventData.Data2 = Event; - // - // Create Event - // - Status = gBS->CreateEvent ( - EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - NotifyFunction, - &EventData, - &PacketEvent - ); - if (EFI_ERROR (Status)) { - FreePool (mWorkingBuffer); - return Status; - } - - Status = ScsiIoDevice->ScsiPassThru->PassThru ( - ScsiIoDevice->ScsiPassThru, - ScsiIoDevice->Pun.ScsiId.Scsi, - ScsiIoDevice->Lun, - mWorkingBuffer, - PacketEvent - ); - if (EFI_ERROR (Status)) { - FreePool (mWorkingBuffer); - gBS->CloseEvent (PacketEvent); - return Status; - } - } else { - // - // If there's no event or SCSI Device doesn't support NON-BLOCKING, just convert - // EFI1.0 PassThru packet back to UEFI2.0 SCSI IO Packet. - // - Status = ScsiIoDevice->ScsiPassThru->PassThru ( - ScsiIoDevice->ScsiPassThru, - ScsiIoDevice->Pun.ScsiId.Scsi, - ScsiIoDevice->Lun, - mWorkingBuffer, - NULL - ); - if (EFI_ERROR (Status)) { - FreePool (mWorkingBuffer); - return Status; - } - - PassThruToScsiioPacket ((EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *)mWorkingBuffer, Packet); - // - // After converting EFI1.0 PassThru Packet back to UEFI2.0 SCSI IO Packet, - // free mWorkingBuffer. - // - FreePool (mWorkingBuffer); - - // - // Signal Event to tell caller to pick up the SCSI IO Packet. - // - if (Event != NULL) { - gBS->SignalEvent (Event); - } - } + return Status; + } else { + return EFI_UNSUPPORTED; } - - return Status; } /** @@ -1134,21 +844,12 @@ ScsiScanCreateDevice ( // // Build Device Path // - if (ScsiBusDev->ExtScsiSupport) { - Status = ScsiBusDev->ExtScsiInterface->BuildDevicePath ( - ScsiBusDev->ExtScsiInterface, - &TargetId->ScsiId.ExtScsi[0], - Lun, - &ScsiDevicePath - ); - } else { - Status = ScsiBusDev->ScsiInterface->BuildDevicePath ( - ScsiBusDev->ScsiInterface, - TargetId->ScsiId.Scsi, - Lun, - &ScsiDevicePath - ); - } + Status = ScsiBusDev->ExtScsiInterface->BuildDevicePath ( + ScsiBusDev->ExtScsiInterface, + &TargetId->ScsiId.ExtScsi[0], + Lun, + &ScsiDevicePath + ); if (EFI_ERROR (Status)) { return Status; @@ -1186,15 +887,8 @@ ScsiScanCreateDevice ( CopyMem (&ScsiIoDevice->Pun, TargetId, TARGET_MAX_BYTES); ScsiIoDevice->Lun = Lun; - if (ScsiBusDev->ExtScsiSupport) { - ScsiIoDevice->ExtScsiPassThru = ScsiBusDev->ExtScsiInterface; - ScsiIoDevice->ExtScsiSupport = TRUE; - ScsiIoDevice->ScsiIo.IoAlign = ScsiIoDevice->ExtScsiPassThru->Mode->IoAlign; - } else { - ScsiIoDevice->ScsiPassThru = ScsiBusDev->ScsiInterface; - ScsiIoDevice->ExtScsiSupport = FALSE; - ScsiIoDevice->ScsiIo.IoAlign = ScsiIoDevice->ScsiPassThru->Mode->IoAlign; - } + ScsiIoDevice->ExtScsiPassThru = ScsiBusDev->ExtScsiInterface; + ScsiIoDevice->ScsiIo.IoAlign = ScsiIoDevice->ExtScsiPassThru->Mode->IoAlign; ScsiIoDevice->ScsiIo.GetDeviceType = ScsiGetDeviceType; ScsiIoDevice->ScsiIo.GetDeviceLocation = ScsiGetDeviceLocation; @@ -1229,25 +923,14 @@ ScsiScanCreateDevice ( if (EFI_ERROR (Status)) { goto ErrorExit; } else { - if (ScsiBusDev->ExtScsiSupport) { - gBS->OpenProtocol ( - Controller, - &gEfiExtScsiPassThruProtocolGuid, - (VOID **)&(ScsiBusDev->ExtScsiInterface), - This->DriverBindingHandle, - ScsiIoDevice->Handle, - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER - ); - } else { - gBS->OpenProtocol ( - Controller, - &gEfiScsiPassThruProtocolGuid, - (VOID **)&(ScsiBusDev->ScsiInterface), - This->DriverBindingHandle, - ScsiIoDevice->Handle, - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER - ); - } + gBS->OpenProtocol ( + Controller, + &gEfiExtScsiPassThruProtocolGuid, + (VOID **)&(ScsiBusDev->ExtScsiInterface), + This->DriverBindingHandle, + ScsiIoDevice->Handle, + EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER + ); } return EFI_SUCCESS; @@ -1256,7 +939,7 @@ ScsiScanCreateDevice ( // // The memory space for ScsiDevicePath is allocated in - // ScsiPassThru->BuildDevicePath() function; It is no longer used + // ExtScsiPassThru->BuildDevicePath() function; It is no longer used // after AppendDevicePathNode,so free the memory it occupies. // FreePool (ScsiDevicePath); @@ -1401,123 +1084,3 @@ DiscoverScsiDevice ( return Status; } - -/** - Convert EFI_SCSI_IO_SCSI_REQUEST_PACKET packet to EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET packet. - - @param Packet The pointer of EFI_SCSI_IO_SCSI_REQUEST_PACKET - @param CommandPacket The pointer of EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET - -**/ -EFI_STATUS -EFIAPI -ScsiioToPassThruPacket ( - IN EFI_SCSI_IO_SCSI_REQUEST_PACKET *Packet, - OUT EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *CommandPacket - ) -{ - // - // EFI 1.10 doesn't support Bi-Direction Command. - // - if (Packet->DataDirection == EFI_SCSI_IO_DATA_DIRECTION_BIDIRECTIONAL) { - return EFI_UNSUPPORTED; - } - - ZeroMem (CommandPacket, sizeof (EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET)); - - CommandPacket->Timeout = Packet->Timeout; - CommandPacket->Cdb = Packet->Cdb; - CommandPacket->CdbLength = Packet->CdbLength; - CommandPacket->DataDirection = Packet->DataDirection; - CommandPacket->HostAdapterStatus = Packet->HostAdapterStatus; - CommandPacket->TargetStatus = Packet->TargetStatus; - CommandPacket->SenseData = Packet->SenseData; - CommandPacket->SenseDataLength = Packet->SenseDataLength; - - if (Packet->DataDirection == EFI_SCSI_IO_DATA_DIRECTION_READ) { - CommandPacket->DataBuffer = Packet->InDataBuffer; - CommandPacket->TransferLength = Packet->InTransferLength; - } else if (Packet->DataDirection == EFI_SCSI_IO_DATA_DIRECTION_WRITE) { - CommandPacket->DataBuffer = Packet->OutDataBuffer; - CommandPacket->TransferLength = Packet->OutTransferLength; - } - - return EFI_SUCCESS; -} - -/** - Convert EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET packet to EFI_SCSI_IO_SCSI_REQUEST_PACKET packet. - - @param ScsiPacket The pointer of EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET - @param Packet The pointer of EFI_SCSI_IO_SCSI_REQUEST_PACKET - -**/ -EFI_STATUS -EFIAPI -PassThruToScsiioPacket ( - IN EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *ScsiPacket, - OUT EFI_SCSI_IO_SCSI_REQUEST_PACKET *Packet - ) -{ - Packet->Timeout = ScsiPacket->Timeout; - Packet->Cdb = ScsiPacket->Cdb; - Packet->CdbLength = ScsiPacket->CdbLength; - Packet->DataDirection = ScsiPacket->DataDirection; - Packet->HostAdapterStatus = ScsiPacket->HostAdapterStatus; - Packet->TargetStatus = ScsiPacket->TargetStatus; - Packet->SenseData = ScsiPacket->SenseData; - Packet->SenseDataLength = ScsiPacket->SenseDataLength; - - if (ScsiPacket->DataDirection == EFI_SCSI_IO_DATA_DIRECTION_READ) { - Packet->InDataBuffer = ScsiPacket->DataBuffer; - Packet->InTransferLength = ScsiPacket->TransferLength; - } else if (Packet->DataDirection == EFI_SCSI_IO_DATA_DIRECTION_WRITE) { - Packet->OutDataBuffer = ScsiPacket->DataBuffer; - Packet->OutTransferLength = ScsiPacket->TransferLength; - } - - return EFI_SUCCESS; -} - -/** - Notify Function in which convert EFI1.0 PassThru Packet back to UEF2.0 - SCSI IO Packet. - - @param Event The instance of EFI_EVENT. - @param Context The parameter passed in. - -**/ -VOID -EFIAPI -NotifyFunction ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - EFI_SCSI_IO_SCSI_REQUEST_PACKET *Packet; - EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *ScsiPacket; - EFI_EVENT CallerEvent; - SCSI_EVENT_DATA *PassData; - - PassData = (SCSI_EVENT_DATA *)Context; - Packet = (EFI_SCSI_IO_SCSI_REQUEST_PACKET *)PassData->Data1; - ScsiPacket = (EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *)mWorkingBuffer; - - // - // Convert EFI1.0 PassThru packet to UEFI2.0 SCSI IO Packet. - // - PassThruToScsiioPacket (ScsiPacket, Packet); - - // - // After converting EFI1.0 PassThru Packet back to UEFI2.0 SCSI IO Packet, - // free mWorkingBuffer. - // - gBS->FreePool (mWorkingBuffer); - - // - // Signal Event to tell caller to pick up UEFI2.0 SCSI IO Packet. - // - CallerEvent = PassData->Data2; - gBS->CloseEvent (Event); - gBS->SignalEvent (CallerEvent); -} diff --git a/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.h b/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.h index 35a8a46ca7a2..999c740f4a20 100644 --- a/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.h +++ b/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.h @@ -11,7 +11,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include -#include #include #include #include @@ -71,8 +70,6 @@ typedef struct _EFI_SCSI_BUS_PROTOCOL { typedef struct _SCSI_BUS_DEVICE { UINTN Signature; EFI_SCSI_BUS_PROTOCOL BusIdentify; - BOOLEAN ExtScsiSupport; - EFI_SCSI_PASS_THRU_PROTOCOL *ScsiInterface; EFI_EXT_SCSI_PASS_THRU_PROTOCOL *ExtScsiInterface; EFI_DEVICE_PATH_PROTOCOL *DevicePath; } SCSI_BUS_DEVICE; @@ -84,8 +81,6 @@ typedef struct { EFI_HANDLE Handle; EFI_SCSI_IO_PROTOCOL ScsiIo; EFI_DEVICE_PATH_PROTOCOL *DevicePath; - BOOLEAN ExtScsiSupport; - EFI_SCSI_PASS_THRU_PROTOCOL *ScsiPassThru; EFI_EXT_SCSI_PASS_THRU_PROTOCOL *ExtScsiPassThru; SCSI_BUS_DEVICE *ScsiBusDeviceData; SCSI_TARGET_ID Pun; diff --git a/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf b/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf index 807ce1320b9a..10f9b903d6f4 100644 --- a/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf +++ b/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf @@ -57,7 +57,6 @@ ## TO_START ## BY_START gEfiDevicePathProtocolGuid - gEfiScsiPassThruProtocolGuid ## TO_START gEfiExtScsiPassThruProtocolGuid ## TO_START [UserExtensions.TianoCore."ExtraFiles"] diff --git a/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c b/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c index 8f108a51e4eb..cf688d6a49d6 100644 --- a/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c +++ b/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c @@ -5922,27 +5922,15 @@ DetermineInstallBlockIo ( IN EFI_HANDLE ChildHandle ) { - EFI_SCSI_PASS_THRU_PROTOCOL *ScsiPassThru; EFI_EXT_SCSI_PASS_THRU_PROTOCOL *ExtScsiPassThru; // - // Firstly, check if ExtScsiPassThru Protocol parent handle exists. If existence, + // Check if ExtScsiPassThru Protocol parent handle exists. If it does, // check its attribute, logic or physical. // ExtScsiPassThru = (EFI_EXT_SCSI_PASS_THRU_PROTOCOL *)GetParentProtocol (&gEfiExtScsiPassThruProtocolGuid, ChildHandle); if (ExtScsiPassThru != NULL) { - if ((ExtScsiPassThru->Mode->Attributes & EFI_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL) != 0) { - return TRUE; - } - } - - // - // Secondly, check if ScsiPassThru Protocol parent handle exists. If existence, - // check its attribute, logic or physical. - // - ScsiPassThru = (EFI_SCSI_PASS_THRU_PROTOCOL *)GetParentProtocol (&gEfiScsiPassThruProtocolGuid, ChildHandle); - if (ScsiPassThru != NULL) { - if ((ScsiPassThru->Mode->Attributes & EFI_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL) != 0) { + if ((ExtScsiPassThru->Mode->Attributes & EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL) != 0) { return TRUE; } } diff --git a/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.h b/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.h index 49a00403695f..9424c530dc9c 100644 --- a/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.h +++ b/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.h @@ -19,7 +19,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include -#include #include #include diff --git a/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf b/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf index 26227132e8c7..194dac50e54d 100644 --- a/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf +++ b/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf @@ -56,7 +56,6 @@ gEfiEraseBlockProtocolGuid ## BY_START gEfiStorageSecurityCommandProtocolGuid ## BY_START gEfiScsiIoProtocolGuid ## TO_START - gEfiScsiPassThruProtocolGuid ## TO_START gEfiExtScsiPassThruProtocolGuid ## TO_START [Guids] From bc7252cc68bbade824f5f0201f56fbf11ded275d Mon Sep 17 00:00:00 2001 From: Gowtham M Date: Thu, 9 Oct 2025 00:08:33 +0530 Subject: [PATCH 0810/1172] MdePkg: Remove ScsiPassThruProtocolGuid The legacy ScsiPassThruProtocol has been removed as per the UEFI 2.10A specification. This commit removes ScsiPassThruProtocol along with its associated headers and Guid definitions. Cc: Sachin Ganesh Signed-off-by: Gowtham M --- MdePkg/Include/Protocol/ScsiPassThru.h | 377 ------------------------- MdePkg/MdePkg.dec | 3 - 2 files changed, 380 deletions(-) delete mode 100644 MdePkg/Include/Protocol/ScsiPassThru.h diff --git a/MdePkg/Include/Protocol/ScsiPassThru.h b/MdePkg/Include/Protocol/ScsiPassThru.h deleted file mode 100644 index c87fb97aeeb1..000000000000 --- a/MdePkg/Include/Protocol/ScsiPassThru.h +++ /dev/null @@ -1,377 +0,0 @@ -/** @file - SCSI Pass Through protocol as defined in EFI 1.1. - This protocol allows information about a SCSI channel to be collected, - and allows SCSI Request Packets to be sent to any SCSI devices on a SCSI - channel even if those devices are not boot devices. This protocol is attached - to the device handle of each SCSI channel in a system that the protocol - supports, and can be used for diagnostics. It may also be used to build - a Block I/O driver for SCSI hard drives and SCSI CD-ROM or DVD drives to - allow those devices to become boot devices. - - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
    - SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#ifndef __SCSI_PASS_THROUGH_H__ -#define __SCSI_PASS_THROUGH_H__ - -#define EFI_SCSI_PASS_THRU_PROTOCOL_GUID \ - { \ - 0xa59e8fcf, 0xbda0, 0x43bb, {0x90, 0xb1, 0xd3, 0x73, 0x2e, 0xca, 0xa8, 0x77 } \ - } - -/// -/// Forward reference for pure ANSI compatability -/// -typedef struct _EFI_SCSI_PASS_THRU_PROTOCOL EFI_SCSI_PASS_THRU_PROTOCOL; - -#define EFI_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL 0x0001 -#define EFI_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL 0x0002 -#define EFI_SCSI_PASS_THRU_ATTRIBUTES_NONBLOCKIO 0x0004 - -// -// SCSI Host Adapter Status definition -// -#define EFI_SCSI_STATUS_HOST_ADAPTER_OK 0x00 -#define EFI_SCSI_STATUS_HOST_ADAPTER_TIMEOUT_COMMAND 0x09 // timeout when processing the command -#define EFI_SCSI_STATUS_HOST_ADAPTER_TIMEOUT 0x0b // timeout when waiting for the command processing -#define EFI_SCSI_STATUS_HOST_ADAPTER_MESSAGE_REJECT 0x0d // a message reject was received when processing command -#define EFI_SCSI_STATUS_HOST_ADAPTER_BUS_RESET 0x0e // a bus reset was detected -#define EFI_SCSI_STATUS_HOST_ADAPTER_PARITY_ERROR 0x0f -#define EFI_SCSI_STATUS_HOST_ADAPTER_REQUEST_SENSE_FAILED 0x10 // the adapter failed in issuing request sense command -#define EFI_SCSI_STATUS_HOST_ADAPTER_SELECTION_TIMEOUT 0x11 // selection timeout -#define EFI_SCSI_STATUS_HOST_ADAPTER_DATA_OVERRUN_UNDERRUN 0x12 // data overrun or data underrun -#define EFI_SCSI_STATUS_HOST_ADAPTER_BUS_FREE 0x13 // Unexepected bus free -#define EFI_SCSI_STATUS_HOST_ADAPTER_PHASE_ERROR 0x14 // Target bus phase sequence failure -#define EFI_SCSI_STATUS_HOST_ADAPTER_OTHER 0x7f - -// -// SCSI Target Status definition -// -#define EFI_SCSI_STATUS_TARGET_GOOD 0x00 -#define EFI_SCSI_STATUS_TARGET_CHECK_CONDITION 0x02 // check condition -#define EFI_SCSI_STATUS_TARGET_CONDITION_MET 0x04 // condition met -#define EFI_SCSI_STATUS_TARGET_BUSY 0x08 // busy -#define EFI_SCSI_STATUS_TARGET_INTERMEDIATE 0x10 // intermediate -#define EFI_SCSI_STATUS_TARGET_INTERMEDIATE_CONDITION_MET 0x14 // intermediate-condition met -#define EFI_SCSI_STATUS_TARGET_RESERVATION_CONFLICT 0x18 // reservation conflict -#define EFI_SCSI_STATUS_TARGET_COMMOND_TERMINATED 0x22 // command terminated -#define EFI_SCSI_STATUS_TARGET_QUEUE_FULL 0x28 // queue full - -typedef struct { - /// - /// The timeout, in 100 ns units, to use for the execution of this SCSI - /// Request Packet. A Timeout value of 0 means that this function - /// will wait indefinitely for the SCSI Request Packet to execute. If - /// Timeout is greater than zero, then this function will return - /// EFI_TIMEOUT if the time required to execute the SCSI Request - /// Packet is greater than Timeout. - /// - UINT64 Timeout; - /// - /// A pointer to the data buffer to transfer between the SCSI - /// controller and the SCSI device. Must be aligned to the boundary - /// specified in the IoAlign field of the - /// EFI_SCSI_PASS_THRU_MODE structure. - /// - VOID *DataBuffer; - /// - /// A pointer to the sense data that was generated by the execution of - /// the SCSI Request Packet. - /// - VOID *SenseData; - /// - /// A pointer to buffer that contains the Command Data Block to - /// send to the SCSI device. - /// - VOID *Cdb; - /// - /// On Input, the size, in bytes, of InDataBuffer. On output, the - /// number of bytes transferred between the SCSI controller and the SCSI device. - /// - UINT32 TransferLength; - /// - /// The length, in bytes, of the buffer Cdb. The standard values are - /// 6, 10, 12, and 16, but other values are possible if a variable length CDB is used. - /// - UINT8 CdbLength; - /// - /// The direction of the data transfer. 0 for reads, 1 for writes. A - /// value of 2 is Reserved for Bi-Directional SCSI commands. - /// - UINT8 DataDirection; - /// - /// The status of the SCSI Host Controller that produces the SCSI - /// bus where the SCSI device attached when the SCSI Request - /// Packet was executed on the SCSI Controller. - /// - UINT8 HostAdapterStatus; - /// - /// The status returned by the SCSI device when the SCSI Request - /// Packet was executed. - /// - UINT8 TargetStatus; - /// - /// On input, the length in bytes of the SenseData buffer. On - /// output, the number of bytes written to the SenseData buffer. - /// - UINT8 SenseDataLength; -} EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET; - -typedef struct { - /// - /// A Null-terminated Unicode string that represents the printable name of the SCSI controller. - /// - CHAR16 *ControllerName; - /// - /// A Null-terminated Unicode string that represents the printable name of the SCSI channel. - /// - CHAR16 *ChannelName; - /// - /// The Target ID of the host adapter on the SCSI channel. - /// - UINT32 AdapterId; - /// - /// Additional information on the attributes of the SCSI channel. - /// - UINT32 Attributes; - /// - /// Supplies the alignment requirement for any buffer used in a data transfer. - /// - UINT32 IoAlign; -} EFI_SCSI_PASS_THRU_MODE; - -/** - Sends a SCSI Request Packet to a SCSI device that is attached to - the SCSI channel. This function supports both blocking I/O and - non-blocking I/O. The blocking I/O functionality is required, - and the non-blocking I/O functionality is optional. - - @param This Protocol instance pointer. - @param Target The Target ID of the SCSI device to - send the SCSI Request Packet. - @param Lun The LUN of the SCSI device to send the - SCSI Request Packet. - @param Packet A pointer to the SCSI Request Packet to send - to the SCSI device specified by Target and Lun. - @param Event If non-blocking I/O is not supported then Event - is ignored, and blocking I/O is performed. - If Event is NULL, then blocking I/O is performed. - If Event is not NULL and non blocking I/O is - supported, then non-blocking I/O is performed, - and Event will be signaled when the SCSI Request - Packet completes - - @retval EFI_SUCCESS The SCSI Request Packet was sent by the host, and - TransferLength bytes were transferred to/from - DataBuffer. See HostAdapterStatus, TargetStatus, - SenseDataLength, and SenseData in that order - for additional status information. - @retval EFI_BAD_BUFFER_SIZE The SCSI Request Packet was executed, but the - entire DataBuffer could not be transferred. - The actual number of bytes transferred is returned - in TransferLength. See HostAdapterStatus, - TargetStatus, SenseDataLength, and SenseData in - that order for additional status information. - @retval EFI_NOT_READY The SCSI Request Packet could not be sent because - there are too many SCSI Request Packets already - queued. The caller may retry again later. - @retval EFI_DEVICE_ERROR A device error occurred while attempting to send - the SCSI Request Packet. See HostAdapterStatus, - TargetStatus, SenseDataLength, and SenseData in - that order for additional status information. - @retval EFI_INVALID_PARAMETER Target, Lun, or the contents of ScsiRequestPacket - are invalid. The SCSI Request Packet was not sent, - so no additional status information is available. - @retval EFI_UNSUPPORTED The command described by the SCSI Request Packet - is not supported by the host adapter. The SCSI - Request Packet was not sent, so no additional - status information is available. - @retval EFI_TIMEOUT A timeout occurred while waiting for the SCSI - Request Packet to execute. See HostAdapterStatus, - TargetStatus, SenseDataLength, and SenseData in - that order for additional status information. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_SCSI_PASS_THRU_PASSTHRU)( - IN EFI_SCSI_PASS_THRU_PROTOCOL *This, - IN UINT32 Target, - IN UINT64 Lun, - IN OUT EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet, - IN EFI_EVENT Event OPTIONAL - ); - -/** - Used to retrieve the list of legal Target IDs for SCSI devices - on a SCSI channel. - - @param This Protocol instance pointer. - @param Target On input, a pointer to the Target ID of a - SCSI device present on the SCSI channel. - On output, a pointer to the Target ID of - the next SCSI device present on a SCSI channel. - An input value of 0xFFFFFFFF retrieves the - Target ID of the first SCSI device present on - a SCSI channel. - @param Lun On input, a pointer to the LUN of a SCSI device - present on the SCSI channel. On output, a pointer - to the LUN of the next SCSI device present on a - SCSI channel. - - @retval EFI_SUCCESS The Target ID of the next SCSI device on the SCSI - channel was returned in Target and Lun. - @retval EFI_NOT_FOUND There are no more SCSI devices on this SCSI channel. - @retval EFI_INVALID_PARAMETER Target is not 0xFFFFFFFF, and Target and Lun were - not returned on a previous call to GetNextDevice(). - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_SCSI_PASS_THRU_GET_NEXT_DEVICE)( - IN EFI_SCSI_PASS_THRU_PROTOCOL *This, - IN OUT UINT32 *Target, - IN OUT UINT64 *Lun - ); - -/** - Used to allocate and build a device path node for a SCSI device - on a SCSI channel. - - @param This Protocol instance pointer. - @param Target The Target ID of the SCSI device for which - a device path node is to be allocated and built. - @param Lun The LUN of the SCSI device for which a device - path node is to be allocated and built. - @param DevicePath A pointer to a single device path node that - describes the SCSI device specified by - Target and Lun. This function is responsible - for allocating the buffer DevicePath with the boot - service AllocatePool(). It is the caller's - responsibility to free DevicePath when the caller - is finished with DevicePath. - - @retval EFI_SUCCESS The device path node that describes the SCSI device - specified by Target and Lun was allocated and - returned in DevicePath. - @retval EFI_NOT_FOUND The SCSI devices specified by Target and Lun does - not exist on the SCSI channel. - @retval EFI_INVALID_PARAMETER DevicePath is NULL. - @retval EFI_OUT_OF_RESOURCES There are not enough resources to allocate - DevicePath. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_SCSI_PASS_THRU_BUILD_DEVICE_PATH)( - IN EFI_SCSI_PASS_THRU_PROTOCOL *This, - IN UINT32 Target, - IN UINT64 Lun, - IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath - ); - -/** - Used to translate a device path node to a Target ID and LUN. - - @param This Protocol instance pointer. - @param DevicePath A pointer to the device path node that - describes a SCSI device on the SCSI channel. - @param Target A pointer to the Target ID of a SCSI device - on the SCSI channel. - @param Lun A pointer to the LUN of a SCSI device on - the SCSI channel. - - @retval EFI_SUCCESS DevicePath was successfully translated to a - Target ID and LUN, and they were returned - in Target and Lun. - @retval EFI_INVALID_PARAMETER DevicePath is NULL. - @retval EFI_INVALID_PARAMETER Target is NULL. - @retval EFI_INVALID_PARAMETER Lun is NULL. - @retval EFI_UNSUPPORTED This driver does not support the device path - node type in DevicePath. - @retval EFI_NOT_FOUND A valid translation from DevicePath to a - Target ID and LUN does not exist. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_SCSI_PASS_THRU_GET_TARGET_LUN)( - IN EFI_SCSI_PASS_THRU_PROTOCOL *This, - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, - OUT UINT32 *Target, - OUT UINT64 *Lun - ); - -/** - Resets a SCSI channel.This operation resets all the - SCSI devices connected to the SCSI channel. - - @param This Protocol instance pointer. - - @retval EFI_SUCCESS The SCSI channel was reset. - @retval EFI_UNSUPPORTED The SCSI channel does not support - a channel reset operation. - @retval EFI_DEVICE_ERROR A device error occurred while - attempting to reset the SCSI channel. - @retval EFI_TIMEOUT A timeout occurred while attempting - to reset the SCSI channel. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_SCSI_PASS_THRU_RESET_CHANNEL)( - IN EFI_SCSI_PASS_THRU_PROTOCOL *This - ); - -/** - Resets a SCSI device that is connected to a SCSI channel. - - @param This Protocol instance pointer. - @param Target The Target ID of the SCSI device to reset. - @param Lun The LUN of the SCSI device to reset. - - @retval EFI_SUCCESS The SCSI device specified by Target and - Lun was reset. - @retval EFI_UNSUPPORTED The SCSI channel does not support a target - reset operation. - @retval EFI_INVALID_PARAMETER Target or Lun are invalid. - @retval EFI_DEVICE_ERROR A device error occurred while attempting - to reset the SCSI device specified by Target - and Lun. - @retval EFI_TIMEOUT A timeout occurred while attempting to reset - the SCSI device specified by Target and Lun. - -**/ -typedef -EFI_STATUS -(EFIAPI *EFI_SCSI_PASS_THRU_RESET_TARGET)( - IN EFI_SCSI_PASS_THRU_PROTOCOL *This, - IN UINT32 Target, - IN UINT64 Lun - ); - -/// -/// The EFI_SCSI_PASS_THRU_PROTOCOL provides information about a SCSI channel and -/// the ability to send SCSI Request Packets to any SCSI device attached to that SCSI channel. The -/// information includes the Target ID of the host controller on the SCSI channel, the attributes of -/// the SCSI channel, the printable name for the SCSI controller, and the printable name of the -/// SCSI channel. -/// -struct _EFI_SCSI_PASS_THRU_PROTOCOL { - /// - /// A pointer to the EFI_SCSI_PASS_THRU_MODE data for this SCSI channel. - /// - EFI_SCSI_PASS_THRU_MODE *Mode; - EFI_SCSI_PASS_THRU_PASSTHRU PassThru; - EFI_SCSI_PASS_THRU_GET_NEXT_DEVICE GetNextDevice; - EFI_SCSI_PASS_THRU_BUILD_DEVICE_PATH BuildDevicePath; - EFI_SCSI_PASS_THRU_GET_TARGET_LUN GetTargetLun; - EFI_SCSI_PASS_THRU_RESET_CHANNEL ResetChannel; - EFI_SCSI_PASS_THRU_RESET_TARGET ResetTarget; -}; - -extern EFI_GUID gEfiScsiPassThruProtocolGuid; - -#endif diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index 8f02cf176750..4b781d659269 100644 --- a/MdePkg/MdePkg.dec +++ b/MdePkg/MdePkg.dec @@ -1625,9 +1625,6 @@ ## Include/Protocol/ScsiPassThruExt.h gEfiExtScsiPassThruProtocolGuid = { 0x143b7632, 0xb81b, 0x4cb7, {0xab, 0xd3, 0xb6, 0x25, 0xa5, 0xb9, 0xbf, 0xfe }} - ## Include/Protocol/ScsiPassThru.h - gEfiScsiPassThruProtocolGuid = { 0xA59E8FCF, 0xBDA0, 0x43BB, { 0x90, 0xB1, 0xD3, 0x73, 0x2E, 0xCA, 0xA8, 0x77 }} - ## Include/Protocol/IScsiInitiatorName.h gEfiIScsiInitiatorNameProtocolGuid = { 0x59324945, 0xEC44, 0x4C0D, { 0xB1, 0xCD, 0x9D, 0xB1, 0x39, 0xDF, 0x07, 0x0C }} From 22e4b846a4e9ea1647697ed284ed6d0089786ea4 Mon Sep 17 00:00:00 2001 From: Krzysztof Drobinski Date: Thu, 11 Sep 2025 15:03:51 +0200 Subject: [PATCH 0811/1172] MdePkg,IndustryStandard: Add RIMT (RISC-V IO Mapping Table) structures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce RIMT (RISC-V IO Mapping Table) structures as specified in [1]. RIMT was introduced as part of ACPI in version 6.6 [2]. [1] RISC-V IO Mapping Table (RIMT) Specification, Version v1.0, 2025-03-31 https://github.com/riscv-non-isa/riscv-acpi-rimt/releases/download/v1.0/rimt-spec.pdf [2] Advanced Configuration and Power Interface specification, Version 6.6 https://uefi.org/specs/ACPI/6.6/ Signed-off-by: Krzysztof Drobiński --- MdePkg/Include/IndustryStandard/Acpi66.h | 5 + .../IndustryStandard/RiscVIoMappingTable.h | 147 ++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 MdePkg/Include/IndustryStandard/RiscVIoMappingTable.h diff --git a/MdePkg/Include/IndustryStandard/Acpi66.h b/MdePkg/Include/IndustryStandard/Acpi66.h index 780b72cbb3b1..3c7a9793d1c8 100644 --- a/MdePkg/Include/IndustryStandard/Acpi66.h +++ b/MdePkg/Include/IndustryStandard/Acpi66.h @@ -3464,6 +3464,11 @@ typedef struct { /// #define EFI_ACPI_6_6_PLATFORM_HEALTH_ASSESSMENT_TABLE_SIGNATURE SIGNATURE_32('P', 'H', 'A', 'T') +/// +/// "RIMT" RISC-V IO Mapping Table +/// +#define EFI_ACPI_6_6_RIMT_TABLE_SIGNATURE SIGNATURE_32('R', 'I', 'M', 'T') + /// /// "RHCT" RISC-V Hart Capabilities Table (RHCT) /// diff --git a/MdePkg/Include/IndustryStandard/RiscVIoMappingTable.h b/MdePkg/Include/IndustryStandard/RiscVIoMappingTable.h new file mode 100644 index 000000000000..74518dcbd896 --- /dev/null +++ b/MdePkg/Include/IndustryStandard/RiscVIoMappingTable.h @@ -0,0 +1,147 @@ +/** @file + RISC-V IO Mapping Table (RIMT) definitions + + Copyright (C) 2025, plasteli.net. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - RISC-V IO Mapping Table (RIMT) Specification, Version v1.0 + (https://github.com/riscv-non-isa/riscv-acpi-rimt/releases/download/v1.0/rimt-spec.pdf) + - Advanced Configuration and Power Interface (ACPI) specification, Version 6.6 + (https://uefi.org/specs/ACPI/6.6/) +**/ + +#ifndef RISCV_IO_MAPPING_TABLE_H_ +#define RISCV_IO_MAPPING_TABLE_H_ + +#include + +// +// Ensure proper structure formats +// +#pragma pack(1) + +/// +/// RISC-V RIMT Interrupt Wire Node +/// +typedef struct { + UINT32 InterruptNumber; + UINT32 Flags; +} EFI_ACPI_6_6_RIMT_INTERRUPT_WIRE_STRUCTURE; + +#define EFI_ACPI_6_6_RIMT_INTERRUPT_WIRE_STRUCTURE_VERSION 1 + +/// +/// RISC-V RIMT Header +/// +typedef struct { + UINT8 Type; + UINT8 Revision; + UINT16 Length; + UINT16 Reserved; + UINT16 Id; +} EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE; + +#define EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE_VERSION 1 + +/// +/// RISC-V IOMMU Node (RIMT) +/// +typedef struct { + EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE Header; + UINT64 HardwareId; + UINT64 BaseAddress; + UINT32 Flags; + UINT32 ProximityDomain; + UINT16 PcieSegmentNumber; + UINT16 PcieBdf; + UINT16 NumberOfInterruptWires; + UINT16 InterruptWireArrayOffset; +} EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE; + +#define EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE_VERSION 1 + +/// +/// RISC-V PCIe Root Complex Node (RIMT) +/// +typedef struct { + EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE Header; + UINT32 Flags; + UINT16 Reserved; + UINT16 PcieSegmentNumber; + UINT16 IdMappingArrayOffset; + UINT16 NumberOfIdMappings; +} EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE; + +#define EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE_VERSION 1 + +/// +/// RISC-V RIMT ID Mapping Structure +/// +typedef struct { + UINT32 SourceIdBase; + UINT32 NumberOfIDs; + UINT32 DestinationDeviceIdBase; + UINT32 DestinationIommuOffset; + UINT32 Flags; +} EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE; + +#define EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE_VERSION 1 + +/// +/// RISC-V Platform Device Node (RIMT) +/// +typedef struct { + EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE Header; + UINT16 IdMappingArrayOffset; + UINT16 NumberOfIdMappings; + CHAR8 DeviceObjectName[]; +} EFI_ACPI_6_6_RIMT_PLATFORM_DEVICE_NODE_STRUCTURE; + +#define EFI_ACPI_6_6_RIMT_PLATFORM_DEVICE_NODE_STRUCTURE_VERSION 1 + +/// +/// RISC-V RIMT +/// +typedef struct { + EFI_ACPI_DESCRIPTION_HEADER Header; + UINT32 NumberOfRimtNodes; + UINT32 OffsetToRimtNodeArray; + UINT32 Reserved; +} EFI_ACPI_6_6_RIMT_STRUCTURE; + +#define EFI_ACPI_6_6_RIMT_STRUCTURE_VERSION 1 + +#pragma pack() + +/// +/// RIMT node structure types as defined in RIMT spec, Chapter 2.1 +/// +typedef enum { + RimtNodeIommu = 0, + RimtNodePcieRc, + RimtNodePlatform, + RimtNodeUnsupported +} RimtNodeTypes; + +/// Minimal number of nodes allowed +/// According to RIMT spec, Chapter 2.1, system with a single IOMMU, +/// should have at least two RIMT nodes +#define RIMT_MINIMAL_NUMBER_OF_NODES_ALLOWED 2 + +#define RIMT_IOMMU_FLAGS_TYPE_BIT_OFFSET 0 +#define RIMT_IOMMU_FLAGS_TYPE_BIT_COUNT 1 +#define RIMT_IOMMU_FLAGS_PROXIMITY_DOMAIN_BIT_OFFSET 1 +#define RIMT_IOMMU_FLAGS_PROXIMITY_DOMAIN_BIT_COUNT 1 + +#define RIMT_ID_MAPPING_FLAGS_ATS_BIT_OFFSET 0 +#define RIMT_ID_MAPPING_FLAGS_ATS_BIT_COUNT 1 +#define RIMT_ID_MAPPING_FLAGS_PRI_BIT_OFFSET 1 +#define RIMT_ID_MAPPING_FLAGS_PRI_BIT_COUNT 1 + +#define RIMT_PCIERC_FLAGS_ATS_BIT_OFFSET 0 +#define RIMT_PCIERC_FLAGS_ATS_BIT_COUNT 1 +#define RIMT_PCIERC_FLAGS_PRI_BIT_OFFSET 1 +#define RIMT_PCIERC_FLAGS_PRI_BIT_COUNT 1 +#endif From 7e9901887e0a533500087d71e80e0ca92bbbb19d Mon Sep 17 00:00:00 2001 From: Krzysztof Drobinski Date: Thu, 11 Sep 2025 15:04:30 +0200 Subject: [PATCH 0812/1172] ShellPkg,acpiview: Add RIMT (RISC-V IO Mapping Table) parser MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implementation tested on Qemu-10.1 virt machine with IOMMU enabled. Signed-off-by: Krzysztof Drobiński --- .../UefiShellAcpiViewCommandLib/AcpiParser.h | 19 + .../Parsers/Rimt/RimtParser.c | 851 ++++++++++++++++++ .../UefiShellAcpiViewCommandLib.c | 1 + .../UefiShellAcpiViewCommandLib.inf | 1 + .../UefiShellAcpiViewCommandLib.uni | 1 + 5 files changed, 873 insertions(+) create mode 100644 ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Rimt/RimtParser.c diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h index caa66757612d..1100d249c173 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h @@ -1073,6 +1073,25 @@ ParseAcpiRasf ( IN UINT8 AcpiTableRevision ); +/** + This function parses the ACPI RIMT table. + When trace is enabled this function parses the RIMT table and + traces the ACPI table fields. + + @param [in] Trace If TRUE, trace the ACPI fields. + @param [in] Ptr Pointer to the start of the buffer. + @param [in] AcpiTableLength Length of the ACPI table. + @param [in] AcpiTableRevision Revision of the ACPI table. +**/ +VOID +EFIAPI +ParseAcpiRimt ( + IN BOOLEAN Trace, + IN UINT8 *Ptr, + IN UINT32 AcpiTableLength, + IN UINT8 AcpiTableRevision + ); + /** This function parses the ACPI RSDP table. diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Rimt/RimtParser.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Rimt/RimtParser.c new file mode 100644 index 000000000000..322737b7a948 --- /dev/null +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Rimt/RimtParser.c @@ -0,0 +1,851 @@ +/** @file + RISC-V IO Mapping Table (RIMT) parser + + Copyright (c) 2025, Plasteli.net. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent + + Reference(s): + - ACPI 6.6 Specification + - RISC-V IO Mapping Table (RIMT) Specification Version v1.0, 2025-03-31: Ratified +**/ + +#include +#include +#include +#include "AcpiParser.h" +#include "AcpiTableParser.h" + +// Local variables +STATIC UINT8 *mRimtNodeType; +STATIC UINT16 *mRimtNodeLength; +STATIC EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE mRimtNodeHeader; +STATIC EFI_ACPI_6_6_RIMT_STRUCTURE mRimtInfo; +STATIC CONST UINT32 *mNumberOfRimtNodes; +STATIC CONST UINT32 *mOffsetToRimtNodeArray; +STATIC EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE mRimtIdMappingNode; +STATIC CONST UINT16 *mNumberOfIdMappings; +STATIC UINT8 *mIdMappingArrayOffset; +STATIC EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE mRimtPcieRootComplexNode; +STATIC EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE mRimtIommuNode; + +/** + This function validates RIMT Node type. + + @param [in] Ptr Pointer to the start of the field data. + @param [in] Length Length of the field. + @param [in] Context Pointer to context specific information e.g. this + could be a pointer to the ACPI table header. +**/ +STATIC +VOID +EFIAPI +RimtValidateNodeType ( + IN UINT8 *Ptr, + IN UINT32 Length, + IN VOID *Context + ) +{ + UINT8 NodeType = *(UINT8 *)Ptr; + + if (NodeType >= RimtNodeUnsupported) { + IncrementErrorCount (); + Print (L"\nERROR: Unrecognized RIMT node type. Type value must be less than %d but got %d", RimtNodeUnsupported, NodeType); + } +} + +/** + This function traces RIMT IOMMU Node Type field and presents in + human-readable form. + + @param [in] Format Optional format string for tracing the data. + @param [in] Ptr Pointer to the start of the buffer. + @param [in] Length Length of the field. +**/ +STATIC +VOID +EFIAPI +RimtNodeTypeToStr ( + CONST CHAR16 *Format, + UINT8 *Ptr, + UINT32 Length + ) +{ + CHAR8 *Str; + UINT8 NodeType; + + NodeType = *(UINT8 *)Ptr; + if (NodeType == RimtNodeIommu) { + Str = "IOMMU"; + } else if (NodeType == RimtNodePcieRc) { + Str = "PCIe Root Complex"; + } else if (NodeType == RimtNodePlatform) { + Str = "Platform Device"; + } else { + Str = "Unknown"; + } + + AsciiPrint (Str); +} + +/** + Helper Macro for populating the RIMT Node header in the ACPI_PARSER array. + Every RIMT Node (IOMMU, PCIe Root Complex, PLatform Device) has this header + common +**/ +#define RIMT_PARSE_NODE_HEADER \ + { L"Type", \ + sizeof(mRimtNodeHeader.Type), \ + OFFSET_OF(EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE, Type), \ + NULL, \ + RimtNodeTypeToStr, \ + (VOID**)&mRimtNodeType, \ + RimtValidateNodeType, \ + NULL \ + }, \ + { L"Revision", \ + sizeof(mRimtNodeHeader.Revision), \ + OFFSET_OF(EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE, Revision),\ + L"%d", \ + NULL, \ + NULL, \ + NULL, \ + NULL \ + }, \ + { L"Length", \ + sizeof(mRimtNodeHeader.Length), \ + OFFSET_OF(EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE, Length), \ + L"%d", \ + NULL, \ + (VOID**)&mRimtNodeLength, \ + NULL, \ + NULL \ + }, \ + { L"Reserved", \ + sizeof(mRimtNodeHeader.Reserved), \ + OFFSET_OF(EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE, Reserved),\ + L"0x%x", \ + NULL, \ + NULL, \ + NULL, \ + NULL \ + }, \ + { L"Id", \ + sizeof(mRimtNodeHeader.Id), \ + OFFSET_OF(EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE, Id), \ + L"%d", \ + NULL, \ + NULL, \ + NULL, \ + NULL \ + } \ + + +/** +An ACPI_PARSER array describing Parser for the RIMT node header structure. +**/ +STATIC CONST ACPI_PARSER mRimtNodeHeaderParser[] = { + RIMT_PARSE_NODE_HEADER +}; + +/** + This function validates number of RIMT nodes. + + According to RIMT spec, Chapter 2.1, system with a single IOMMU, + should have at least two RIMT nodes + + @param [in] Ptr Pointer to the start of the field data. + @param [in] Length Length of the field. + @param [in] Context Pointer to context specific information e.g. this + could be a pointer to the ACPI table header. +**/ +STATIC +VOID +EFIAPI +RimtValidateNumberOfNodes ( + UINT8 *Ptr, + UINT32 Length, + VOID *Context + ) +{ + UINT32 NumNodes; + + NumNodes = *(UINT32 *)Ptr; + if (NumNodes < RIMT_MINIMAL_NUMBER_OF_NODES_ALLOWED) { + IncrementErrorCount (); + Print (L"\nERROR: Minimal Number of RIMT nodes must be at least %d.", RIMT_MINIMAL_NUMBER_OF_NODES_ALLOWED); + } +} + +/** + An ACPI_PARSER array describing the RIMT (RISC-V IO Mapping Table). +**/ +STATIC CONST ACPI_PARSER mRimtParser[] = { + PARSE_ACPI_HEADER (&mRimtInfo.Header), + { + L"Number of RIMT Nodes", + sizeof (mRimtInfo.NumberOfRimtNodes), + OFFSET_OF (EFI_ACPI_6_6_RIMT_STRUCTURE, NumberOfRimtNodes), + L"%d", + NULL, + (VOID **)&mNumberOfRimtNodes, + RimtValidateNumberOfNodes, + NULL + }, + { + L"Offset to RIMT Node Array", + sizeof (mRimtInfo.OffsetToRimtNodeArray), + OFFSET_OF (EFI_ACPI_6_6_RIMT_STRUCTURE, OffsetToRimtNodeArray), + L"0x%x", + NULL, + (VOID **)&mOffsetToRimtNodeArray, + NULL, + NULL + }, + { + L"Reserved", + sizeof (mRimtInfo.Reserved), + OFFSET_OF (EFI_ACPI_6_6_RIMT_STRUCTURE, Reserved), + L"0x%x", + NULL, + NULL, + NULL, + NULL + } +}; + +/** + This macro generates function definition for parser tracing + Flags field of RIMT Node. + + @param [in] Parser An ACPI_PARSER for tracing the data. +**/ +#define RIMT_DECLARE_NODE_FLAGS_PARSER_FUNC(Parser) \ +STATIC \ +VOID \ +EFIAPI \ +_RimtNodeFlagsParser ## Parser ( \ + CONST CHAR16 *Format, \ + UINT8 *Ptr, \ + UINT32 Length \ + ) \ +{ \ + UINT32* Flags; \ + \ + Flags = (UINT32 *)Ptr; \ + Print (L"0x%X\n", *Flags); \ + ParseAcpiBitFields ( \ + TRUE, \ + 2, \ + NULL, \ + (UINT8 *)Flags, \ + sizeof(Flags), \ + PARSER_PARAMS (Parser) \ + ); \ +} \ + +#define RIMT_GET_NODE_FLAGS_PARSER_FUNC(Parser) _RimtNodeFlagsParser ## Parser + +/** + This macro generates function definition which traces bits in Flags field. + + @param [in] Parser Optional format string for tracing the data. + @param [in] Active String to display if interpreted bit is active. + @param [in] Inactive String to display if interpreted bit is inactive. +**/ +#define RIMT_DECLARE_FLAGS_BIT_PARSER_FUNC(Parser, Active, Inactive) \ +STATIC \ +VOID \ +EFIAPI \ +_RimtFlagsToStr ## Parser ( \ + CONST CHAR16 *Format OPTIONAL, \ + UINT8 *Ptr, \ + UINT32 Length \ + ) \ +{ \ + CHAR8 *Str; \ + \ + if ((*(UINT32 *)Ptr & 0x1) == 1) \ + Str = #Active ; \ + else \ + Str = #Inactive ; \ + AsciiPrint (Str); \ +} \ + + +/** + This macro gets generated function name which traces bits in Flags field + defined by DECLARE_FLAG_INTERPRETER() +**/ +#define RIMT_GET_FLAGS_BIT_PARSER_FUNC(interpreter) _RimtFlagsToStr ## interpreter + +/** + This function prints Hardwareld field. + If no format string is specified the Format must be NULL. + + @param [in] Format Optional format string for tracing the data. + @param [in] Ptr Pointer to the start of the buffer. + @param [in] Length Length of the field. +**/ +STATIC +VOID +EFIAPI +RimtHardwareIdToStr ( + CONST CHAR16 *Format, + UINT8 *Ptr, + UINT32 Length + ) +{ + UINT64 *HardwareId; // RIMT specifies HardwareId field as 8-byte long + CHAR8 Buffer[9]; + + HardwareId = (UINT64 *)Ptr; + AsciiStrnCpyS (Buffer, sizeof (Buffer), (CHAR8 *)HardwareId, sizeof (*HardwareId)); + AsciiPrint (Buffer); + Print (L" (0x%lx)", *HardwareId); +} + +RIMT_DECLARE_FLAGS_BIT_PARSER_FUNC (IommuType, "PCIe", "Platform"); +RIMT_DECLARE_FLAGS_BIT_PARSER_FUNC (ProximityDomain, "Valid", "Invalid"); +STATIC CONST ACPI_PARSER RimtIommuFlagParser[] = { + { + L"Device Type", + RIMT_IOMMU_FLAGS_TYPE_BIT_COUNT, + RIMT_IOMMU_FLAGS_TYPE_BIT_OFFSET, + NULL, + RIMT_GET_FLAGS_BIT_PARSER_FUNC (IommuType), + NULL, NULL, NULL + }, + { + L"Proximity Domain", + RIMT_IOMMU_FLAGS_PROXIMITY_DOMAIN_BIT_COUNT, + RIMT_IOMMU_FLAGS_PROXIMITY_DOMAIN_BIT_OFFSET, + NULL, + RIMT_GET_FLAGS_BIT_PARSER_FUNC (ProximityDomain), + NULL, NULL, NULL + }, + { + L"Reserved", + 30, + 2, + L"0x%x", + NULL, + NULL, NULL, NULL + } +}; + +RIMT_DECLARE_NODE_FLAGS_PARSER_FUNC (RimtIommuFlagParser); + +/** +An ACPI_PARSER array describing the IOMMU Node. +**/ +STATIC CONST ACPI_PARSER RimtIommuNodeParser[] = { + RIMT_PARSE_NODE_HEADER, + { + L"Hardware ID", + sizeof (mRimtIommuNode.HardwareId), + OFFSET_OF (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, HardwareId), + NULL, + RimtHardwareIdToStr, + NULL, + NULL, + NULL + }, + { + L"Base Address", + sizeof (mRimtIommuNode.BaseAddress), + OFFSET_OF (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, BaseAddress), + L"0x%lx", + NULL, + NULL, + NULL, + NULL + }, + { + L"Flags", + sizeof (mRimtIommuNode.Flags), + OFFSET_OF (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, Flags), + NULL, + RIMT_GET_NODE_FLAGS_PARSER_FUNC (RimtIommuFlagParser), + NULL, + NULL, + NULL + }, + { + L"Proximity Domain", + sizeof (mRimtIommuNode.ProximityDomain), + OFFSET_OF (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, ProximityDomain), + L"%d", + NULL, + NULL, + NULL, + NULL + }, + { + L"PCIe Segment number", + sizeof (mRimtIommuNode.PcieSegmentNumber), + OFFSET_OF (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, PcieSegmentNumber), + L"0x%x", + NULL, + NULL, + NULL, + NULL + }, + { + L"PCIe B/D/F", + sizeof (mRimtIommuNode.PcieBdf), + OFFSET_OF (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, PcieBdf), + L"%d", + NULL, + NULL, + NULL, + NULL + }, + { + L"Number of interrupt wires", + sizeof (mRimtIommuNode.NumberOfInterruptWires), + OFFSET_OF (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, NumberOfInterruptWires), + L"0x%x", + NULL, + NULL, + NULL, + NULL + }, + { + L"Interrupt wire array offset", + sizeof (mRimtIommuNode.InterruptWireArrayOffset), + OFFSET_OF (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, InterruptWireArrayOffset), + L"0x%x", + NULL, + NULL, + NULL, + NULL + } +}; + +/** + This function parses the RIMT IOMMU node. + + @param [in] Ptr Pointer to the start of the buffer. + @param [in] Length Length of the buffer. +**/ +STATIC +VOID +EFIAPI +RimtParseIommuNode ( + IN UINT8 *Ptr, + IN UINT16 Length, + IN UINT32 Index + ) +{ + CHAR8 Buffer[32]; + + AsciiSPrint ( + Buffer, + sizeof (Buffer), + "RIMT Node [%d]", + Index + ); + ParseAcpi ( + TRUE, + 2, + Buffer, + Ptr, + Length, + PARSER_PARAMS (RimtIommuNodeParser) + ); +} + +RIMT_DECLARE_FLAGS_BIT_PARSER_FUNC (IdMappingAtsSupport, "Required", "Not Required"); +RIMT_DECLARE_FLAGS_BIT_PARSER_FUNC (IdMappingPriSupport, "Required", "Not Required"); +STATIC CONST ACPI_PARSER RimtIdMappingFlagParser[] = { + { + L"ATS", + RIMT_ID_MAPPING_FLAGS_ATS_BIT_COUNT, + RIMT_ID_MAPPING_FLAGS_ATS_BIT_OFFSET, + NULL, + RIMT_GET_FLAGS_BIT_PARSER_FUNC (IdMappingAtsSupport), + NULL, NULL, NULL + }, + { + L"PRI", + RIMT_ID_MAPPING_FLAGS_PRI_BIT_COUNT, + RIMT_ID_MAPPING_FLAGS_PRI_BIT_OFFSET, + NULL, + RIMT_GET_FLAGS_BIT_PARSER_FUNC (IdMappingPriSupport), + NULL, NULL, NULL + }, + { + L"Reserved", + 30, + 2, + L"0x%x", + NULL, + NULL, NULL, NULL + } +}; +RIMT_DECLARE_NODE_FLAGS_PARSER_FUNC (RimtIdMappingFlagParser); + +/** +An ACPI_PARSER array describing the ID Mapping Node. +**/ +STATIC CONST ACPI_PARSER RimtIdMappingNodeParser[] = { + { + L"Source ID Base", + sizeof (mRimtIdMappingNode.SourceIdBase), + OFFSET_OF (EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE, SourceIdBase), + L"0x%x", + NULL, + NULL, NULL, NULL + }, + { + L"Number of IDs", + sizeof (mRimtIdMappingNode.NumberOfIDs), + OFFSET_OF (EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE, NumberOfIDs), + L"%d", + NULL, + NULL, NULL, NULL + }, + { + L"Destination Device ID Base", + sizeof (mRimtIdMappingNode.DestinationDeviceIdBase), + OFFSET_OF (EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE, DestinationDeviceIdBase), + L"%d", + NULL, + NULL, NULL, NULL + }, + { + L"Destination IOMMU Offset", + sizeof (mRimtIdMappingNode.DestinationIommuOffset), + OFFSET_OF (EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE, DestinationIommuOffset), + L"0x%x", + NULL, + NULL, NULL, NULL + }, + { + L"Flags", + sizeof (mRimtIdMappingNode.Flags), + OFFSET_OF (EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE, Flags), + NULL, + RIMT_GET_NODE_FLAGS_PARSER_FUNC (RimtIdMappingFlagParser), + NULL, NULL, NULL + }, +}; + +/** + This function parses the RIMT ID Mapping node. + + @param [in] Ptr Pointer to the start of the buffer. + @param [in] Length Length of the buffer. + @retval Number of bytes parsed. +**/ +STATIC +VOID +EFIAPI +RimtParseIdMappingArray ( + IN UINT8 *Node, + IN UINT16 Length, + IN UINT32 NumberOfIdMappings + ) +{ + UINT32 Index; + UINT32 Offset; + CHAR8 Buffer[32]; + + Index = 0; + Offset = 0; + + while ((Index < NumberOfIdMappings) && + (Offset < Length)) + { + AsciiSPrint ( + Buffer, + sizeof (Buffer), + "ID Mapping [%d]", + Index + ); + Offset += ParseAcpi ( + TRUE, + 4, + Buffer, + Node + Offset, + Length - Offset, + PARSER_PARAMS (RimtIdMappingNodeParser) + ); + ++Index; + } +} + +RIMT_DECLARE_FLAGS_BIT_PARSER_FUNC (PcieRcAtsSupport, "Supported", "Not Supported"); +RIMT_DECLARE_FLAGS_BIT_PARSER_FUNC (PcieRcPriSupport, "Supported", "Not Supported"); +STATIC CONST ACPI_PARSER RimtPcieRcFlagParser[] = { + { + L"ATS", + RIMT_PCIERC_FLAGS_ATS_BIT_COUNT, RIMT_PCIERC_FLAGS_ATS_BIT_OFFSET, + NULL, + RIMT_GET_FLAGS_BIT_PARSER_FUNC (PcieRcAtsSupport), + NULL, NULL, NULL + }, + { + L"PRI", + RIMT_PCIERC_FLAGS_PRI_BIT_COUNT, RIMT_PCIERC_FLAGS_PRI_BIT_OFFSET, + NULL, + RIMT_GET_FLAGS_BIT_PARSER_FUNC (PcieRcPriSupport), + NULL, NULL, NULL + }, + { + L"Reserved", + 30, + 2, + L"0x%x", + NULL, + NULL, NULL, NULL + } +}; +RIMT_DECLARE_NODE_FLAGS_PARSER_FUNC (RimtPcieRcFlagParser); + +/** + An ACPI_PARSER array describing the Pcie Root Complex Node. +**/ +STATIC CONST ACPI_PARSER RimtPcieRcNodeParser[] = { + RIMT_PARSE_NODE_HEADER, + { + L"Flags", + sizeof (mRimtPcieRootComplexNode.Flags), + OFFSET_OF (EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE,Flags), + NULL, + RIMT_GET_NODE_FLAGS_PARSER_FUNC (RimtPcieRcFlagParser), + NULL, + NULL, + NULL + }, + { + L"Reserved", + sizeof (mRimtPcieRootComplexNode.Reserved), + OFFSET_OF (EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE,Reserved), + L"0x%lx", + NULL, + NULL, + NULL, + NULL + }, + { + L"PCIe Segment Number", + sizeof (mRimtPcieRootComplexNode.PcieSegmentNumber), + OFFSET_OF (EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE,PcieSegmentNumber), + L"%d", + NULL, + NULL, + NULL, + NULL + }, + { + L"Id Mapping Array Offset", + sizeof (mRimtPcieRootComplexNode.IdMappingArrayOffset), + OFFSET_OF (EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE,IdMappingArrayOffset), + L"0x%x", + NULL, + (VOID **)&mIdMappingArrayOffset, + NULL, + NULL + }, + { + L"Number Of Id Mappings", + sizeof (mRimtPcieRootComplexNode.NumberOfIdMappings), + OFFSET_OF (EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE,NumberOfIdMappings), + L"%d", + NULL, + (VOID **)&mNumberOfIdMappings, + NULL, + NULL + }, +}; + +/** + This function parses the RIMT Pcie Root Complex node. + + This function parses also Id Mappings related to this PCIe Root Complex + + @param [in] Ptr Pointer to the start of the buffer. + @param [in] Length Length of the buffer. +**/ +STATIC +VOID +EFIAPI +RimtParsePcieRcNode ( + IN UINT8 *Ptr, + IN UINT16 Length, + IN UINT32 Index + ) +{ + UINT8 *IdMappingArray; + UINT8 *PcieRootComplexNode; + CHAR8 Buffer[32]; + + PcieRootComplexNode = Ptr; + AsciiSPrint ( + Buffer, + sizeof (Buffer), + "RIMT Node [%d]", + Index + ); + + ParseAcpi ( + TRUE, + 2, + Buffer, + PcieRootComplexNode, + Length, + PARSER_PARAMS (RimtPcieRcNodeParser) + ); + IdMappingArray = PcieRootComplexNode + *mIdMappingArrayOffset; + RimtParseIdMappingArray ( + IdMappingArray, + Length - *mIdMappingArrayOffset, + *mNumberOfIdMappings + ); +} + +/** + This function parses the RIMT Platform Device node. + + TODO: Add parsers when PLatform Device node generator in Qemu is ready. + + @param [in] Ptr Pointer to the start of the buffer. + @param [in] Length Length of the buffer. +**/ +STATIC +VOID +EFIAPI +RimtParsePlatformDeviceNode ( + IN UINT8 *Ptr, + IN UINT16 Length, + IN UINT32 Index + ) +{ + Print (L"WARNING: Platform type of RIMT Node not supported yet.\n"); +} + +/** + This function parses the ACPI RIMT table. + When trace is enabled this function parses the RIMT table and + traces the ACPI table fields. + + @param [in] Trace If TRUE, trace the ACPI fields. + @param [in] Rimt Pointer to the start of the RIMT buffer. + @param [in] AcpiTableLength Length of the ACPI table. + @param [in] AcpiTableRevision Revision of the ACPI table. +**/ +VOID +EFIAPI +ParseAcpiRimt ( + IN BOOLEAN Trace, + IN UINT8 *Rimt, + IN UINT32 AcpiTableLength, + IN UINT8 AcpiTableRevision + ) +{ + UINT8 *NodePtr; + UINT32 Offset; + UINT32 Index; + + if (!Trace) { + return; + } + + ParseAcpi ( + Trace, + 0, + "RIMT", + Rimt, + AcpiTableLength, + PARSER_PARAMS (mRimtParser) + ); + // Check if the values used to control the parsing logic have been + // successfully read. + if ((mNumberOfRimtNodes == NULL) || + (mOffsetToRimtNodeArray == NULL)) + { + IncrementErrorCount (); + Print ( + L"ERROR: Insufficient table length. AcpiTableLength = %d.\n", + AcpiTableLength + ); + return; + } + + Offset = *mOffsetToRimtNodeArray; + NodePtr = Rimt + Offset; + Index = 0; + while ((Index < *mNumberOfRimtNodes) && + (Offset < AcpiTableLength)) + { + // Parse the RIMT Node Header + ParseAcpi ( + FALSE, + 0, + "RIMT Node Header", + NodePtr, + AcpiTableLength - Offset, + PARSER_PARAMS (mRimtNodeHeaderParser) + ); + // Check if the values used to control the parsing logic have been + // successfully read. + if ((mRimtNodeType == NULL) || + (mRimtNodeLength == NULL)) + { + IncrementErrorCount (); + Print ( + L"ERROR: Insufficient remaining table buffer length to read the " \ + L"RIMT node header. Length = %d.\n", + AcpiTableLength - Offset + ); + return; + } + + // Validate RIMT Node length + if ((*mRimtNodeLength == 0) || + ((Offset + (*mRimtNodeLength)) > AcpiTableLength)) + { + IncrementErrorCount (); + Print ( + L"ERROR: Invalid RIMT Node length. " \ + L"Length = %d. Offset = %d. AcpiTableLength = %d.\n", + *mRimtNodeLength, + Offset, + AcpiTableLength + ); + return; + } + + switch (*mRimtNodeType) { + case RimtNodeIommu: + RimtParseIommuNode ( + NodePtr, + *mRimtNodeLength, + Index + ); + break; + case RimtNodePcieRc: + RimtParsePcieRcNode ( + NodePtr, + *mRimtNodeLength, + Index + ); + break; + case RimtNodePlatform: + RimtParsePlatformDeviceNode ( + NodePtr, + *mRimtNodeLength, + Index + ); + break; + default: + IncrementErrorCount (); + Print (L"ERROR: Unsupported RIMT Node type = %d\n", *mRimtNodeType); + } // switch + + Index++; + NodePtr += (*mRimtNodeLength); + Offset += (*mRimtNodeLength); + } +} diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c index cc8a1ee6725f..53c7c4b49898 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c @@ -75,6 +75,7 @@ ACPI_TABLE_PARSER ParserList[] = { ParseAcpiPptt }, { EFI_ACPI_6_5_ACPI_RAS2_FEATURE_TABLE_SIGNATURE, ParseAcpiRas2 }, { EFI_ACPI_6_5_ACPI_RAS_FEATURE_TABLE_SIGNATURE, ParseAcpiRasf }, + { EFI_ACPI_6_6_RIMT_TABLE_SIGNATURE, ParseAcpiRimt }, { RSDP_TABLE_INFO, ParseAcpiRsdp }, { EFI_ACPI_6_2_SYSTEM_LOCALITY_INFORMATION_TABLE_SIGNATURE, ParseAcpiSlit }, { EFI_ACPI_6_2_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE, ParseAcpiSpcr }, diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf index 2536faaa6a91..432117f381fe 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf @@ -53,6 +53,7 @@ Parsers/Pptt/PpttParser.h Parsers/Ras2/Ras2Parser.c Parsers/Rasf/RasfParser.c + Parsers/Rimt/RimtParser.c Parsers/Rsdp/RsdpParser.c Parsers/Slit/SlitParser.c Parsers/Spcr/SpcrParser.c diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.uni b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.uni index 4079a8e51e34..f9904f92d8b4 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.uni +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.uni @@ -91,6 +91,7 @@ " MCFG - Memory Mapped Config Space Base Address Description Table\r\n" " MPAM - Memory System Resource Partitioning and Monitoring Table\r\n" " PPTT - Processor Properties Topology Table\r\n" +" RIMT - RISC-V IO Mapping Table\r\n" " RSDP - Root System Description Pointer\r\n" " SLIT - System Locality Information Table\r\n" " SPCR - Serial Port Console Redirection Table\r\n" From 797792681137b0971ec81e495807b470671ba518 Mon Sep 17 00:00:00 2001 From: Yuwei Chen Date: Tue, 26 Aug 2025 14:57:48 +0800 Subject: [PATCH 0813/1172] BaseTools: Enable FMMT Rebase function This patch adds and improves the rebase functionality for firmware images (PE/COFF/TE) in the FMMT tool. Key features include: 1.Automatically rebases PE/COFF/TE images within FFS files when the firmware volume (FV) layout is adjusted or FFS files are moved, ensuring correct loading and execution at new addresses. 2.Implements recursive rebase logic for nested sections, guaranteeing all relevant images are properly relocated. 3.Adds support for rebasing subsequent FFS files within the same FV, enhancing compatibility and stability during firmware layout changes. 4.Core code changes are mainly in FvHandler.py, BiosTreeNode.py, and BinaryFactoryProduct.py, covering rebase flag detection, address calculation, and actual relocation operations. 5.This feature improves the flexibility of firmware space management and enhances the automation and reliability of the FMMT tool. Co-Auther: Ashraf Ali S Signed-off-by: Yuwei Chen --- BaseTools/Source/Python/FMMT/README.md | 37 +- .../Python/FMMT/core/BinaryFactoryProduct.py | 43 + BaseTools/Source/Python/FMMT/core/BiosTree.py | 42 +- .../Source/Python/FMMT/core/BiosTreeNode.py | 208 ++++ .../Source/Python/FMMT/core/FMMTParser.py | 12 + .../Source/Python/FMMT/core/FvHandler.py | 130 +++ .../Python/FirmwareStorageFormat/Common.py | 13 + .../FirmwareStorageFormat/FfsFileHeader.py | 34 + .../FirmwareStorageFormat/PECOFFHeader.py | 889 ++++++++++++++++++ .../FirmwareStorageFormat/SectionHeader.py | 18 + 10 files changed, 1400 insertions(+), 26 deletions(-) create mode 100644 BaseTools/Source/Python/FirmwareStorageFormat/PECOFFHeader.py diff --git a/BaseTools/Source/Python/FMMT/README.md b/BaseTools/Source/Python/FMMT/README.md index 87cbff8d7145..e0c45709bf88 100644 --- a/BaseTools/Source/Python/FMMT/README.md +++ b/BaseTools/Source/Python/FMMT/README.md @@ -1,5 +1,7 @@ # FMMT + ## Overview + This FMMT tool is the python implementation of the edk2 FMMT tool which locates at https://github.com/tianocore/edk2-staging/tree/FceFmmt. This implementation has the same usage as the edk2 FMMT, but it's more readable and relaiable. @@ -11,15 +13,12 @@ Important Changes and Updates: - Oct 13, 2021 Initial Draft of FMMT Python Tool - Apr 28, 2022 Optimize functions & Command line +- Aug 26, 2025 Enable PEIM Rebase feature #### Note: - FMMT Python Tool keeps same function with origin FMMT C Tool. It is much easier to maintain and extend other functions. -#### Known issue: - -- Currently, FMMT Python tool does not support PEIM rebase feature, this feature will be added in future update. - # 1. Introduction ## 1.1 Overview @@ -37,17 +36,14 @@ In firmware development, binary file has its firmware layout following the Platf The FMMT tool is capable of: - Parse a FD (Firmware Device) / FV (Firmware Volume) / FFS (Firmware Files) - - Add a new FFS into a FV file (both included in a FD file or not) - - Replace an FFS in a FV file with a new FFS file - - Delete an FFS in a FV file (both included in a FD file or not) - -- Extract the FFS from a FV file (both included in a FD file or not) +- Extract the FFS from a FV file (both included in a FD file or not) ## 1.3 References + | Document | | ------------------------------------------------ | | UEFI Platform Initialization (PI) Specification | @@ -61,15 +57,13 @@ The FMMT tool is capable of: When independent use the FMMT Python Tool, the following files and settings are required: - GuidTool executable files used for Decompress/Compress Firmware data. - - Environment variables path with GuidTool path setting. ### 2.1.2 Use with Build System When use the FMMT Python Tool with Build System: -- If only use Edk2 based GuidTool, do not need other preparation. - +- If only use Edk2 based GuidTool, do not need other preparation. - If use other customized GuidTool, need prepare the config file with GuidTool info. The syntax for GuidTool definition shown as follow: ***ToolsGuid ShortName Command*** @@ -80,21 +74,21 @@ When use the FMMT Python Tool with Build System: ### 2.2.1 Syntax for Parse file - ***-v < Inputfile > < Outputfile > -l < LogFileType > -c < ConfigFilePath >*** +***-v < Inputfile > < Outputfile > -l < LogFileType > -c < ConfigFilePath >*** - Parse *Inputfile*, show its firmware layout with log file. *Outputfile* is optional, if inputs, the *Inputfile* will be encapsulated into *Outputfile* following the parsed firmware layout. *"-l LogFileType"* is optional, it decides the format of log file which saves Binary layout. Currently supports: json, txt. More formats will be added in the future. *"-c ConfigFilePath "* is optional, target FmmtConf.ini file can be selected with this parameter. If not provided, default FmmtConf.ini file will be used. - Ex: py -3 FMMT.py -v test.fd ### 2.2.2 Syntax for Add a new FFS - ***-a < Inputfile > < TargetFvName/TargetFvGuid > < NewFfsFile > < Outputfile >*** +***-a < Inputfile > < TargetFvName/TargetFvGuid > < NewFfsFile > < Outputfile >*** - Add the *NewFfsFile* into *Inputfile*. *TargetFvName/TargetFvGuid* (Name or Guid) is the TargetFv which *NewFfsFile* will be added into. - Ex: py -3 FMMT.py -a Ovmf.fd 6938079b-b503-4e3d-9d24-b28337a25806 NewAdd.ffs output.fd ### 2.2.3 Syntax for Delete an FFS - ***-d < Inputfile > < TargetFvName/TargetFvGuid > < TargetFfsName > < Outputfile >*** +***-d < Inputfile > < TargetFvName/TargetFvGuid > < TargetFfsName > < Outputfile >*** - Delete the Ffs from *Inputfile*. TargetFfsName (Guid) is the TargetFfs which will be deleted. *TargetFvName/TargetFvGuid* is optional, which is the parent of TargetFfs*.* - Ex: py -3 FMMT.py -d Ovmf.fd 6938079b-b503-4e3d-9d24-b28337a25806 S3Resume2Pei output.fd @@ -108,7 +102,7 @@ When use the FMMT Python Tool with Build System: ### 2.2.5 Syntax for Extract an FFS - ***-e < Inputfile > < TargetFvName/TargetFvGuid > < TargetFfsName > < Outputfile >*** +***-e < Inputfile > < TargetFvName/TargetFvGuid > < TargetFfsName > < Outputfile >*** - Extract the Ffs from the Inputfile. TargetFfsName (Guid) is the TargetFfs which will be extracted. *TargetFvName/TargetFvGuid* is optional, which is the parent of TargetFfs*.* - Ex: py -3 FMMT.py -e Ovmf.fd 6938079b-b503-4e3d-9d24-b28337a25806 S3Resume2Pei output.fd @@ -122,7 +116,6 @@ FMMT Python Tool uses the NodeTree saves whole Firmware layout. Each Node have i A whole NodeTree saves all the Firmware info. - Parent & Child relationship figured out the Firmware layout. - - Each Node have several fields. ?Data? field saves an FirmwareClass instance which contains all the data info of the info. ### 3.1.1 NodeTree Format @@ -130,15 +123,10 @@ A whole NodeTree saves all the Firmware info. The NodeTree will be created with parse function. When parse a file, a Root Node will be initialized firstly. The Data split and Tree construction process is described with an FD file shown as ?Figure 2. The NodeTree format?: - A Root Node is initialized. - - Use the ?FV Signature? as FV key to split Whole FD Data. ?FV0?, ?FV1?, ?FV2?? Node created. - - After FV level Node created, use the ?Ffs Data Size? as FFS key to split each FV Data. ?Ffs0?...Node created. - - After FFS level Node created, use the ?Section Data Size? as Section key to split each Ffs Data. ?Section0?...Node created. - - If some of Section includes other Sections, continue use the ?Section Data Size? as Section key to split each Section Data. - - After all Node created, the whole NodeTree saves all the info. (Can be used in other functions or print the whole firmware layout into log file) ![](Img/NodeTreeFormat.png) @@ -158,13 +146,11 @@ There are two ways to set the GuidTool. One from Config file, another from envir Current GuidTool first check if has Config file. - If have, load the config GuidTool Information. - - Else get from environment variables. ### 3.2.1 Get from Config file - Config file should in same folder with FMMT.py or the path in environment variables. - - Content should follow the format: ***ToolsGuid ShortName Command*** @@ -175,10 +161,11 @@ Current GuidTool first check if has Config file. ### 3.2.3 Edk2 Based GuidTool + | ***Guid*** | ***ShortName*** | ***Command*** | | ------------------------------------------ | --------------- | --------------------- | | ***a31280ad-481e-41b6-95e8-127f4c984779*** | ***TIANO*** | ***TianoCompress*** | | ***ee4e5898-3914-4259-9d6e-dc7bd79403cf*** | ***LZMA*** | ***LzmaCompress*** | | ***fc1bcdb0-7d31-49aa-936a-a4600d9dd083*** | ***CRC32*** | ***GenCrc32*** | | ***d42ae6bd-1352-4bfb-909a-ca72a6eae889*** | ***LZMAF86*** | ***LzmaF86Compress*** | -| ***3d532050-5cda-4fd0-879e-0f7f630d5afb*** | ***BROTLI*** | ***BrotliCompress*** | \ No newline at end of file +| ***3d532050-5cda-4fd0-879e-0f7f630d5afb*** | ***BROTLI*** | ***BrotliCompress*** | diff --git a/BaseTools/Source/Python/FMMT/core/BinaryFactoryProduct.py b/BaseTools/Source/Python/FMMT/core/BinaryFactoryProduct.py index dc6ae37d4207..cfa434bb9b19 100644 --- a/BaseTools/Source/Python/FMMT/core/BinaryFactoryProduct.py +++ b/BaseTools/Source/Python/FMMT/core/BinaryFactoryProduct.py @@ -110,6 +110,9 @@ def ParserData(self, Section_Tree, whole_Data: bytes, Rel_Whole_Offset: int=0) - Sec_Fv_Tree.Data.Data = Section_Tree.Data.Data[Sec_Fv_Tree.Data.Header.HeaderLength:] Section_Tree.insertChild(Sec_Fv_Tree) Fv_count += 1 + elif Section_Tree.Data.Type == EFI_SECTION_PE32 or Section_Tree.Data.Type == EFI_SECTION_TE: + if Section_Tree.Parent.Parent.type == FV_TREE or Section_Tree.Parent.Parent.type == ROOT_FV_TREE or Section_Tree.Parent.Parent.type == ROOT_FFS_TREE: + self.ParserPeCoff(Section_Tree, b'') def ParserSection(self, ParTree, Whole_Data: bytes, Rel_Whole_Offset: int=0) -> None: Rel_Offset = 0 @@ -130,6 +133,7 @@ def ParserSection(self, ParTree, Whole_Data: bytes, Rel_Whole_Offset: int=0) -> Section_Info.Data = Whole_Data[Rel_Offset+Section_Info.HeaderLength: Rel_Offset+Section_Info.Size] Section_Info.DOffset = Section_Offset + Section_Info.HeaderLength + Rel_Whole_Offset Section_Info.HOffset = Section_Offset + Rel_Whole_Offset + Section_Info.ROffset = Rel_Offset if Section_Info.Header.Type == 0: break # The final Section in parent Section does not need to add padding, else must be 4-bytes align with parent Section start offset @@ -149,6 +153,20 @@ def ParserSection(self, ParTree, Whole_Data: bytes, Rel_Whole_Offset: int=0) -> Section_Tree.Data = Section_Info ParTree.insertChild(Section_Tree) + def ParserPeCoff(self, ParTree, Whole_Data: bytes, Rel_Whole_Offset: int=0) -> None: + SectionTypeList = [EFI_SECTION_PE32, EFI_SECTION_TE] + if ParTree.Data.Type in SectionTypeList: + # Find Pe Image + PeCoff_Info = PeCoffNode(ParTree.Data.Data, ParTree.Data.DOffset, ParTree.Data.Size-ParTree.Data.HeaderLength) + original_size = len(PeCoff_Info.Data) if hasattr(PeCoff_Info, 'Data') else 0 + original_section_size = ParTree.Data.Size + if PeCoff_Info.IfRebase: + PeCoff_Info.PeCoffRebase() + PeCoff_Tree = BIOSTREE(PeCoff_Info.Name) + PeCoff_Tree.type = PECOFF_TREE + PeCoff_Tree.Data = PeCoff_Info + ParTree.insertChild(PeCoff_Tree) + class FfsProduct(BinaryProduct): # ParserFFs / GetSection def ParserData(self, ParTree, Whole_Data: bytes, Rel_Whole_Offset: int=0) -> None: @@ -170,6 +188,7 @@ def ParserData(self, ParTree, Whole_Data: bytes, Rel_Whole_Offset: int=0) -> Non Section_Info.Data = Whole_Data[Rel_Offset+Section_Info.HeaderLength: Rel_Offset+Section_Info.Size] Section_Info.DOffset = Section_Offset + Section_Info.HeaderLength + Rel_Whole_Offset Section_Info.HOffset = Section_Offset + Rel_Whole_Offset + Section_Info.ROffset = Rel_Offset if Section_Info.Header.Type == 0: break # The final Section in Ffs does not need to add padding, else must be 4-bytes align with Ffs start offset @@ -183,8 +202,22 @@ def ParserData(self, ParTree, Whole_Data: bytes, Rel_Whole_Offset: int=0) -> Non if Section_Info.Header.Type == 0x15: ParTree.Data.UiName = Section_Info.ExtHeader.GetUiString() if Section_Info.Header.Type == 0x19: + if ParTree.Data.IsFsp: + ParTree.Parent.Data.ImageSize = Bytes2Val(Section_Info.Data[24:28]) + ParTree.Parent.Data.BaseAddress = Bytes2Val(Section_Info.Data[28:32]) + print(f'ParTree.Parent.Data.ImageSize : {hex(ParTree.Parent.Data.ImageSize)}') + print(f'ParTree.Parent.Data.BaseAddress : {hex(ParTree.Parent.Data.BaseAddress)}') + elif ParTree.Data.IsVtf: + TargetFv = ParTree.Parent + offset = 0 + while TargetFv: + offset += TargetFv.Data.Size + TargetFv = TargetFv.NextRel + ParTree.Parent.Data.BaseAddress = 0x100000000 - offset if Section_Info.Data.replace(b'\x00', b'') == b'': Section_Info.IsPadSection = True + if Section_Info.Header.Type == EFI_SECTION_PE32 or Section_Info.Header.Type == EFI_SECTION_TE: + ParTree.Data.PeCoffSecIndex = len(ParTree.Child) Section_Offset += Section_Info.Size + Pad_Size Rel_Offset += Section_Info.Size + Pad_Size Section_Tree.Data = Section_Info @@ -219,6 +252,7 @@ def ParserData(self, ParTree, Whole_Data: bytes, Rel_Whole_Offset: int=0) -> Non Ffs_Tree = BIOSTREE(Ffs_Info.Name) Ffs_Info.HOffset = Ffs_Offset + Rel_Whole_Offset Ffs_Info.DOffset = Ffs_Offset + Ffs_Info.Header.HeaderLength + Rel_Whole_Offset + Ffs_Info.ROffset = Rel_Offset if Ffs_Info.Name == PADVECTOR: Ffs_Tree.type = FFS_PAD Ffs_Info.Data = Whole_Data[Rel_Offset+Ffs_Info.Header.HeaderLength: Rel_Offset+Ffs_Info.Size] @@ -354,6 +388,15 @@ def GetFvFromFd(self, whole_data: bytes=b'') -> list: tmp_index += 1 return Fd_Struct +class ElfSectionProduct(BinaryProduct): + ## Decompress the compressed section. + def ParserData(self, Section_Tree, whole_Data: bytes, Rel_Whole_Offset: int=0) -> None: + pass + def ParserSectionData(self, Section_Tree, whole_Data: bytes, Rel_Whole_Offset: int=0) -> None: + pass + def ParserProgramData(self, Section_Tree, whole_Data: bytes, Rel_Whole_Offset: int=0) -> None: + pass + class ElfProduct(BinaryProduct): def ParserData(self, ParTree, Whole_Data: bytes, Rel_Whole_Offset: int=0) -> None: diff --git a/BaseTools/Source/Python/FMMT/core/BiosTree.py b/BaseTools/Source/Python/FMMT/core/BiosTree.py index d99f964e64c2..e1a2fdd8d494 100644 --- a/BaseTools/Source/Python/FMMT/core/BiosTree.py +++ b/BaseTools/Source/Python/FMMT/core/BiosTree.py @@ -23,12 +23,14 @@ SEC_FV_TREE = 'SEC_FV_IMAGE' BINARY_DATA = 'BINARY' ELF_TREE = 'ELF' +PECOFF_TREE = 'PECOFF_TREE' RootType = [ROOT_TREE, ROOT_FV_TREE, ROOT_FFS_TREE, ROOT_SECTION_TREE] FvType = [FV_TREE, SEC_FV_TREE] -FfsType = FFS_TREE +FfsType = [FFS_TREE, FFS_PAD] SecType = SECTION_TREE ElfType = [ROOT_ELF_TREE, ELF_TREE] +PeCoffTree = PECOFF_TREE class BIOSTREE: def __init__(self, NodeName: str) -> None: @@ -72,6 +74,36 @@ def insertChild(self, newNode, pos: int=None) -> None: self.Child.insert(pos, newNode) newNode.Parent = self + # lastNode.insertRel(newNode) + def insertRel(self, newNode) -> None: + if self.Parent: + parentTree = self.Parent + new_index = parentTree.Child.index(self) + 1 + parentTree.Child.insert(new_index, newNode) + self.NextRel = newNode + newNode.LastRel = self + + def deleteNode(self, deletekey: str) -> None: + FindStatus, DeleteTree = self.FindNode(deletekey) + if FindStatus: + parentTree = DeleteTree.Parent + lastTree = DeleteTree.LastRel + nextTree = DeleteTree.NextRel + if parentTree: + index = parentTree.Child.index(DeleteTree) + del parentTree.Child[index] + if lastTree and nextTree: + lastTree.NextRel = nextTree + nextTree.LastRel = lastTree + elif lastTree: + lastTree.NextRel = None + elif nextTree: + nextTree.LastRel = None + return DeleteTree + else: + logger.error('Could not find the target tree') + return None + def FindNode(self, key: str, Findlist: list) -> None: if self.key == key or (self.Data and self.Data.Name == key) or (self.type == FFS_TREE and self.Data.UiName == key): Findlist.append(self) @@ -188,6 +220,14 @@ def ExportTree(self,TreeInfo: dict=None) -> dict: TreeInfo[key]["Size"] = hex(self.Data.Size) TreeInfo[key]["Offset"] = hex(self.Data.HOffset) TreeInfo[key]["FilesNum"] = len(self.Child) + elif self.type == FFS_PAD: + key = str(self.Data.Name) + TreeInfo[key] = collections.OrderedDict() + TreeInfo[key]["Name"] = key + TreeInfo[key]["UiName"] = 'Ffs_pad' + TreeInfo[key]["Type"] = self.type + TreeInfo[key]["Size"] = hex(self.Data.Size) + TreeInfo[key]["Offset"] = hex(self.Data.HOffset) elif self.type == SECTION_TREE and self.Data.Type == 0x02: key = str(self.Data.Name) TreeInfo[key] = collections.OrderedDict() diff --git a/BaseTools/Source/Python/FMMT/core/BiosTreeNode.py b/BaseTools/Source/Python/FMMT/core/BiosTreeNode.py index 92611f8ce99d..0c05354a3ede 100644 --- a/BaseTools/Source/Python/FMMT/core/BiosTreeNode.py +++ b/BaseTools/Source/Python/FMMT/core/BiosTreeNode.py @@ -8,6 +8,7 @@ from FirmwareStorageFormat.FvHeader import * from FirmwareStorageFormat.FfsFileHeader import * from FirmwareStorageFormat.SectionHeader import * +from FirmwareStorageFormat.PECOFFHeader import * from FirmwareStorageFormat.Common import * from utils.FmmtLogger import FmmtLogger as logger import uuid @@ -60,6 +61,7 @@ def __init__(self, buffer: bytes) -> None: self.HeaderLength = len(struct2stream(self.Header)) self.HOffset = 0 self.DOffset = 0 + self.ROffset = 0 self.Data = b'' self.PadData = b'' self.Upld_Info_Align = False @@ -121,6 +123,7 @@ def __init__(self, name, buffer: bytes) -> None: self.HeaderLength = self.Header.HeaderLength self.HOffset = 0 self.DOffset = 0 + self.ROffset = 0 self.Data = b'' if self.Header.Signature != 1213613663: logger.error('Invalid Fv Header! Fv {} signature {} is not "_FVH".'.format(struct2stream(self.Header), self.Header.Signature)) @@ -177,8 +180,15 @@ def __init__(self, buffer: bytes) -> None: self.HeaderLength = self.Header.HeaderLength self.HOffset = 0 self.DOffset = 0 + self.ROffset = 0 self.Data = b'' self.PadData = b'' + self.SectionMaxAlignment = SECTION_COMMON_ALIGNMENT # 4-align + self.PeCoffSecIndex = None + self.IsFsp = False + self.IsVtf = False + self.IfFsp() + self.IfVtf() def ModCheckSum(self) -> None: HeaderData = struct2stream(self.Header) @@ -191,6 +201,14 @@ def ModCheckSum(self) -> None: Header = self.Header.IntegrityCheck.Checksum.Header + 0x100 - HeaderSum % 0x100 self.Header.IntegrityCheck.Checksum.Header = Header % 0x100 + def IfFsp(self) -> None: + if self.Name == EFI_FSP_GUID: + self.IsFsp = True + + def IfVtf(self) -> None: + if self.Name == EFI_FFS_VOLUME_TOP_FILE_GUID: + self.IsVtf = True + class SectionNode: def __init__(self, buffer: bytes) -> None: if buffer[0:3] != b'\xff\xff\xff': @@ -203,6 +221,9 @@ def __init__(self, buffer: bytes) -> None: self.Name = "EFI_SECTION_ALL" else: self.Name = "SECTION" + self.IsPadSection = False + self.IsUiSection = False + self.IsVerSection = False if self.Header.Type in HeaderType: self.ExtHeader = self.GetExtHeader(self.Header.Type, buffer[self.Header.Common_Header_Size():], (self.Header.SECTION_SIZE-self.Header.Common_Header_Size())) self.HeaderLength = self.Header.Common_Header_Size() + self.ExtHeader.ExtHeaderSize() @@ -213,10 +234,13 @@ def __init__(self, buffer: bytes) -> None: self.Type = self.Header.Type self.HOffset = 0 self.DOffset = 0 + self.ROffset = 0 self.Data = b'' self.OriData = b'' + self.OriHeader = b'' self.PadData = b'' self.IsPadSection = False + self.SectionMaxAlignment = SECTION_COMMON_ALIGNMENT # 4-align def GetExtHeader(self, Type: int, buffer: bytes, nums: int=0) -> None: if Type == 0x01: @@ -224,12 +248,195 @@ def GetExtHeader(self, Type: int, buffer: bytes, nums: int=0) -> None: elif Type == 0x02: return EFI_GUID_DEFINED_SECTION.from_buffer_copy(buffer) elif Type == 0x14: + self.IsVerSection = True return Get_VERSION_Header((nums - 2)//2).from_buffer_copy(buffer) elif Type == 0x15: + self.IsUiSection = True return Get_USER_INTERFACE_Header(nums//2).from_buffer_copy(buffer) elif Type == 0x18: return EFI_FREEFORM_SUBTYPE_GUID_SECTION.from_buffer_copy(buffer) +class PeCoffNode: + def __init__(self, buffer: bytes, offset: int, size: int = 0) -> None: + self.Name = 'PeCoff' + self.offset = offset + self.Size = size + self.OriData = buffer + self.Data = buffer + self.IsTeImage = True + self.RelocationsStripped = True + self.PeCoffHeaderOffset = 0 + self.ImageAddress = 0 + self.DestinationAddress = 0 + self.DebugDirectoryEntryVirtualAddress = 0 + self.PeHeader = None + self.TeHeader = None + self.Machine = None + self.ImageType = None + self.OptionalHeader = None + self.BlkHeaderOffset = 0 + self.BlkHeader = None + self.RelocationsFieldSize = 0 + self.RelocationsData = None + self.RelocList = [] + self.SizeOfImage = 0 + self.HOffset = self.offset + self.DOffset = 0 + self.IfRebase = True + + self.TeHeader = EFI_TE_IMAGE_HEADER.from_buffer_copy(self.Data) + if self.TeHeader.Signature == EFI_IMAGE_DOS_SIGNATURE: + self.IsTeImage = False + self.TeHeader = None + self.DOffset = 0 + self.DosHeader = EFI_IMAGE_DOS_HEADER.from_buffer_copy(self.Data) + if self.DosHeader.e_magic == EFI_IMAGE_DOS_SIGNATURE: + self.PeCoffHeaderOffset = self.DosHeader.e_lfanew #0xC0 + self.PeHeader = EFI_IMAGE_OPTIONAL_HEADER_UNION.from_buffer_copy(self.Data[self.PeCoffHeaderOffset:]) + if self.PeHeader.Pe32.Signature != EFI_IMAGE_NT_SIGNATURE: + self.TeHeader = self.PeHeader.Te + if self.TeHeader.Signature != EFI_TE_IMAGE_HEADER_SIGNATURE: + logger.error('Invalid Te Header! Te signature {} is not "VZ".'.format(self.TeHeader.Signature)) + raise Exception('Not support TeHeader which signature is not "VZ"!') + self.IsTeImage = True + self.PeCoffLoaderCheckImageType() + self.PeCoffRebaseFlag() + if self.IfRebase: + self.PeCoffParseReloc() + + def PeCoffLoaderCheckImageType(self) -> None: + MachineTypeList = [EFI_IMAGE_FILE_MACHINE_I386, EFI_IMAGE_FILE_MACHINE_EBC, EFI_IMAGE_FILE_MACHINE_X64, EFI_IMAGE_FILE_MACHINE_ARMT, EFI_IMAGE_FILE_MACHINE_ARM64, EFI_IMAGE_FILE_MACHINE_RISCV64] + ImageTypeList = [EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION, EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER, EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER, EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER] + # Check Machine Type + if self.IsTeImage: + self.Machine = self.TeHeader.Machine + else: + self.Machine = self.PeHeader.Pe32.FileHeader.Machine + if self.Machine not in MachineTypeList: + if self.Machine == EFI_IMAGE_FILE_MACHINE_ARM: + self.Machine = EFI_IMAGE_FILE_MACHINE_ARMT + if self.IsTeImage: + self.TeHeader.Machine = self.Machine + else: + self.PeHeader.Pe32.FileHeader.Machine = self.Machine + else: + logger.error('The Machine Type {} is not supported!'.format(self.Machine)) + raise Exception('The Machine Type {} is not supported!'.format(self.Machine)) + + # Check Image Type + if self.IsTeImage: + self.ImageType = self.TeHeader.Subsystem + else: + self.ImageType = self.PeHeader.Pe32.OptionalHeader.Subsystem + if self.ImageType not in ImageTypeList: + logger.error('The Image Type {} is not supported!'.format(self.ImageType)) + raise Exception('The Image Type {} is not supported!'.format(self.ImageType)) + + def PeCoffRebaseFlag(self): + if self.IsTeImage: + pass + else: + if self.PeHeader.Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC: + self.SizeOfImage = self.PeHeader.Pe32.OptionalHeader.SizeOfImage + else: + self.SizeOfImage = self.PeHeader.Pe32Plus.OptionalHeader.SizeOfImage + if self.SizeOfImage != len(self.Data): + self.IfRebase = False + + def PeCoffParseReloc(self) -> None: + if self.IsTeImage: + self.ImageAddress = self.TeHeader.ImageBase + self.TeHeader.StrippedSize - EFI_TE_IMAGE_HEADER_SIZE + self.BlkHeaderOffset = self.offset + EFI_TE_IMAGE_HEADER_SIZE - self.TeHeader.StrippedSize +self.TeHeader.DataDirectory[0].VirtualAddress + self.BlkSize = self.TeHeader.DataDirectory[0].Size + else: + if self.PeHeader.Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC: + self.ImageAddress = self.PeHeader.Pe32.OptionalHeader.ImageBase + self.BlkHeaderOffset = self.offset + self.PeHeader.Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress + self.BlkSize = self.PeHeader.Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC].Size + else: + self.ImageAddress = self.PeHeader.Pe32Plus.OptionalHeader.ImageBase + self.BlkHeaderOffset = self.offset + self.PeHeader.Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress + self.BlkSize = self.PeHeader.Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC].Size + CurOff = self.BlkHeaderOffset + while CurOff < self.BlkHeaderOffset + self.BlkSize: + if CurOff % 4: + CurOff += 4 - CurOff % 4 + self.BlkHeader = EFI_BLK_HEADER.from_buffer_copy(self.Data[CurOff-self.offset:]) + self.RelocationsFieldSize = self.BlkHeader.BlockSize - EFI_BLK_HEADER_SIZE + self.RelocationsData = (c_uint16 * int(self.RelocationsFieldSize/2)).from_buffer_copy(self.Data[CurOff - self.offset + EFI_BLK_HEADER_SIZE:CurOff - self.offset + EFI_BLK_HEADER_SIZE + self.RelocationsFieldSize]) + for EachDataField in self.RelocationsData: + # Rtype [15:12] Roffset [11:0] + EachRType = EachDataField >> 12 + EachROff = EachDataField & 0xfff + if EachRType == 0: # IMAGE_REL_BASED_ABSOLUTE + continue + if ((EachRType != 3) and (EachRType != 10)): # IMAGE_REL_BASED_HIGHLOW and IMAGE_REL_BASED_DIR64 + logger.error("ERROR: Unsupported relocation type %d!" % EachRType) + raise Exception("ERROR: Unsupported relocation type %d!" % EachRType) + if self.TeHeader: + TarROff = self.offset + self.BlkHeader.PageRVA + EachROff + EFI_TE_IMAGE_HEADER_SIZE - self.TeHeader.StrippedSize + else: + TarROff = self.offset + self.BlkHeader.PageRVA + EachROff + self.RelocList.append((EachRType, TarROff)) + CurOff += self.BlkHeader.BlockSize + + def PeCoffRebase(self, DeltaSize=0, CalcuFlag=0) -> None: # if CalcuFlag is set to 0, DeltaSize is a delta address, if set to 1, DeltaSize is a absolute address + if self.TeHeader: + ImageBase = self.TeHeader.ImageBase + CurOff = self.offset + EFI_TE_IMAGE_HEADER.ImageBase.offset + ImageBaseSize = EFI_TE_IMAGE_HEADER.ImageBase.size + else: + CurOff = self.offset + self.PeCoffHeaderOffset + CurOff += EFI_IMAGE_NT_HEADERS32.OptionalHeader.offset + if self.PeHeader.Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC: # PE32+ image + ImageBase = EFI_IMAGE_OPTIONAL_HEADER64.ImageBase + CurOff += EFI_IMAGE_OPTIONAL_HEADER64.ImageBase.offset + ImageBaseSize = EFI_IMAGE_OPTIONAL_HEADER64.ImageBase.size + else: + ImageBase = EFI_IMAGE_OPTIONAL_HEADER32.ImageBase + CurOff += EFI_IMAGE_OPTIONAL_HEADER32.ImageBase.offset + ImageBaseSize = EFI_IMAGE_OPTIONAL_HEADER32.ImageBase.size + if CalcuFlag: + NewImageBase = DeltaSize + if self.TeHeader: + DeltaSize = DeltaSize - self.TeHeader.ImageBase + self.TeHeader.ImageBase = NewImageBase + self.ImageAddress = self.TeHeader.ImageBase + self.TeHeader.StrippedSize - EFI_TE_IMAGE_HEADER_SIZE + else: + DeltaSize = DeltaSize - self.ImageAddress + if self.PeHeader.Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC: + self.PeHeader.Pe32.OptionalHeader.ImageBase = NewImageBase + self.ImageAddress = self.PeHeader.Pe32.OptionalHeader.ImageBase + else: + self.PeHeader.Pe32Plus.OptionalHeader.ImageBase = NewImageBase + self.ImageAddress = self.PeHeader.Pe32Plus.OptionalHeader.ImageBase + CurValue = NewImageBase + else: + if self.TeHeader: + self.TeHeader.ImageBase += DeltaSize + self.ImageAddress = self.TeHeader.ImageBase + self.TeHeader.StrippedSize - EFI_TE_IMAGE_HEADER_SIZE + CurValue = self.TeHeader.ImageBase + else: + if self.PeHeader.Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC: + self.PeHeader.Pe32.OptionalHeader.ImageBase += DeltaSize + self.ImageAddress = self.PeHeader.Pe32.OptionalHeader.ImageBase + else: + self.PeHeader.Pe32Plus.OptionalHeader.ImageBase += DeltaSize + self.ImageAddress = self.PeHeader.Pe32Plus.OptionalHeader.ImageBase + CurValue = self.ImageAddress + self.Data = self.Data[:CurOff-self.offset] + CurValue.to_bytes(ImageBaseSize, byteorder='little',signed=False) + self.Data[CurOff-self.offset+ImageBaseSize:] + + ## Rebase function + for (EachRType, TarROff) in self.RelocList: + if EachRType == 3: # IMAGE_REL_BASED_HIGHLOW + CurValue = Bytes2Val(self.Data[TarROff-self.offset:TarROff+4-self.offset]) + CurValue += DeltaSize + self.Data = self.Data[:TarROff-self.offset] + CurValue.to_bytes(4, byteorder='little',signed=False) + self.Data[TarROff+4-self.offset:] + elif EachRType == 10: # IMAGE_REL_BASED_DIR64 + CurValue = Bytes2Val(self.Data[TarROff-self.offset:TarROff+8-self.offset]) + CurValue += DeltaSize + self.Data = self.Data[:TarROff-self.offset] + CurValue.to_bytes(8, byteorder='little',signed=False) + self.Data[TarROff+8-self.offset:] + class FreeSpaceNode: def __init__(self, buffer: bytes) -> None: self.Name = 'Free_Space' @@ -237,4 +444,5 @@ def __init__(self, buffer: bytes) -> None: self.Size = len(buffer) self.HOffset = 0 self.DOffset = 0 + self.ROffset = 0 self.PadData = b'' diff --git a/BaseTools/Source/Python/FMMT/core/FMMTParser.py b/BaseTools/Source/Python/FMMT/core/FMMTParser.py index 25a2bde79961..862813555e68 100644 --- a/BaseTools/Source/Python/FMMT/core/FMMTParser.py +++ b/BaseTools/Source/Python/FMMT/core/FMMTParser.py @@ -33,6 +33,18 @@ def Encapsulation(self, rootTree, CompressStatus: bool) -> None: if rootTree.type == ROOT_TREE or rootTree.type == ROOT_FV_TREE or rootTree.type == ROOT_FFS_TREE or rootTree.type == ROOT_SECTION_TREE: logger.debug('Encapsulated successfully!') # If current node do not have Header, just add Data. + elif rootTree.type == PECOFF_TREE: + if hasattr(rootTree.Data, 'Data') and rootTree.Data.Data: + self.FinalData += rootTree.Data.Data + # Handle padding if needed + if hasattr(rootTree.Data, 'PadData') and rootTree.Data.PadData: + self.FinalData += rootTree.Data.PadData + # Add parent padding if this is final child + if rootTree.isFinalChild(): + ParTree = rootTree.Parent + if ParTree and ParTree.type != 'ROOT' and hasattr(ParTree.Data, 'PadData'): + self.FinalData += ParTree.Data.PadData + rootTree.Child = [] # Clear children since we've processed the PE/COFF data elif rootTree.type == BINARY_DATA or rootTree.type == FFS_FREE_SPACE: self.FinalData += rootTree.Data.Data rootTree.Child = [] diff --git a/BaseTools/Source/Python/FMMT/core/FvHandler.py b/BaseTools/Source/Python/FMMT/core/FvHandler.py index 6ecbffa245f8..354862da0944 100644 --- a/BaseTools/Source/Python/FMMT/core/FvHandler.py +++ b/BaseTools/Source/Python/FMMT/core/FvHandler.py @@ -237,6 +237,7 @@ def CompressSectionData(self, TargetTree, pos: int, GuidTool=None) -> None: Size_delta = len(CompressedData) - len(TargetTree.Data.OriData) ChangeSize(TargetTree, -Size_delta) if TargetTree.NextRel: + # Save original pad size before modifying PadData Original_Pad_Size = len(TargetTree.Data.PadData) TargetTree.Data.PadData = b'\x00' * New_Pad_Size self.Remain_New_Free_Space = ( @@ -402,6 +403,7 @@ def ReplaceFfs(self) -> bool: self.NewFfs.Data.Header.State = c_uint8( ~self.NewFfs.Data.Header.State) # NewFfs parsing will not calculate the PadSize, thus recalculate. + self.Ffs_PecoffRebase() self.NewFfs.Data.PadData = b'\xff' * GetPadSize(self.NewFfs.Data.Size, FFS_COMMON_ALIGNMENT) if self.NewFfs.Data.Size >= self.TargetFfs.Data.Size: Needed_Space = self.NewFfs.Data.Size + len(self.NewFfs.Data.PadData) - self.TargetFfs.Data.Size - len(self.TargetFfs.Data.PadData) @@ -700,3 +702,131 @@ def ShrinkFv(self) -> bool: TargetFv.Data.ModCheckSum() self.Status = True return self.Status + + def Ffs_PecoffRebase(self): + new_pe_exist = False + origin_pe_exist = False + # Handle the current FFS being replaced - check for PE32 + for NewSection in self.NewFfs.Child: + if NewSection.Data.Type == EFI_SECTION_PE32 or NewSection.Data.Type == EFI_SECTION_TE: + if NewSection.Child[0].Data.Name == 'PeCoff': + New_Pecoff = NewSection.Child[0] + new_pe_image_address = NewSection.Child[0].Data.ImageAddress if hasattr(NewSection.Child[0].Data, 'ImageAddress') else 0 + new_pe_exist = True + break + # Check original FFS for PE32 or TE + for OriSection in self.TargetFfs.Child: + if OriSection.Data.Type == EFI_SECTION_PE32 or OriSection.Data.Type == EFI_SECTION_TE: + if (len(OriSection.Child) > 0) and OriSection.Child[0].Data.Name == 'PeCoff': + Ori_Pecoff = OriSection.Child[0] + origin_pe_image_address = OriSection.Child[0].Data.ImageAddress if hasattr(OriSection.Child[0].Data, 'ImageAddress') else 0 + origin_pe_exist = True + break + + # Handle PE32 rebasing + if new_pe_exist and origin_pe_exist: + if new_pe_image_address == 0x0 and origin_pe_image_address != 0x0: + New_Pecoff.Data.PeCoffRebase(origin_pe_image_address) + NewSection.Child[0].Data.Data = New_Pecoff.Data.Data + elif origin_pe_image_address != new_pe_image_address: + delta_image_address = origin_pe_image_address - new_pe_image_address + New_Pecoff.Data.PeCoffRebase(delta_image_address) + NewSection.Child[0].Data.Data = New_Pecoff.Data.Data + + # If new PE/TE exist, we need to rebuild the FFS data + # This is necessary to ensure the new PE/TE sections are correctly integrated into the FFS structure + if new_pe_exist: + # Rebuild the FFS data + NewFfs_Data = b'' + for item in self.NewFfs.Child: + if item.type == SECTION_TREE and not item.Data.OriData and item.Data.ExtHeader: + NewFfs_Data += struct2stream(item.Data.Header) + struct2stream(item.Data.ExtHeader) + item.Data.Data + item.Data.PadData + elif item.type == SECTION_TREE and item.Data.OriData and not item.Data.ExtHeader: + NewFfs_Data += struct2stream(item.Data.Header) + item.Data.OriData + item.Data.PadData + elif item.type == SECTION_TREE and item.Data.OriData and item.Data.ExtHeader: + NewFfs_Data += struct2stream(item.Data.Header) + struct2stream(item.Data.ExtHeader) + item.Data.OriData + item.Data.PadData + elif item.type == FFS_FREE_SPACE: + NewFfs_Data += item.Data.Data + item.Data.PadData + else: + NewFfs_Data += struct2stream(item.Data.Header) + item.Data.Data + item.Data.PadData + self.NewFfs.Data.Data = NewFfs_Data + + # Rebase subsequent FFS files in the SAME FV only + self._rebase_subsequent_ffs_in_current_fv() + + def _rebase_subsequent_ffs_in_current_fv(self): + """Rebase PE/COFF images in subsequent FFS files within the current FV only""" + if not hasattr(self, 'TargetFfs') or self.TargetFfs is None: + return + + # Calculate size change from the replacement + old_size = self.TargetFfs.Data.Size + len(self.TargetFfs.Data.PadData) + new_size = self.NewFfs.Data.Size + len(self.NewFfs.Data.PadData) + size_delta = new_size - old_size + + if size_delta == 0: + return # No size change, no rebasing needed + + # Get the current FV (where the replacement is happening) + current_fv = self.TargetFfs.Parent + if not current_fv: + return + + # Find the index of the target FFS in the current FV + try: + target_index = current_fv.Child.index(self.TargetFfs) + except ValueError: + return + + # Process only subsequent FFS files in the SAME FV + for i in range(target_index + 1, len(current_fv.Child)): + subsequent_ffs = current_fv.Child[i] + + # Skip free space entries + if subsequent_ffs.type == FFS_FREE_SPACE: + continue + # Look for PE32 sections in this FFS and rebase them + self._rebase_ffs_pe_sections(subsequent_ffs, size_delta) + + def _rebase_ffs_pe_sections(self, ffs_node, address_delta): + """Rebase PE/COFF and TE images in a specific FFS node""" + found_pe = False + for section in ffs_node.Child: + # Check for PE32 sections + if hasattr(section.Data, 'Type') and (section.Data.Type == EFI_SECTION_PE32 or section.Data.Type == EFI_SECTION_TE): + for child in section.Child: + if hasattr(child.Data, 'Name') and child.Data.Name == 'PeCoff': + old_address = child.Data.ImageAddress if hasattr(child.Data, 'ImageAddress') else 0 + child.Data.PeCoffRebase(address_delta) + section.Data.Data = child.Data.Data + found_pe = True + break + + # Handle nested sections recursively + elif hasattr(section, 'Child') and section.Child: + nested_found = self._rebase_nested_sections(section, address_delta) + found_pe = found_pe or nested_found + + if not found_pe: + logger.debug('No PE/COFF or TE found in this FFS') + + return found_pe + + def _rebase_nested_sections(self, section_node, address_delta): + """Recursively rebase PE/COFF and TE images in nested sections within current FV""" + found_pe = False + for child in section_node.Child: + # Check for PE32 sections + if hasattr(child.Data, 'Type') and (child.Data.Type == EFI_SECTION_PE32 or child.Data.Type == EFI_SECTION_TE): + for pe_child in child.Child: + if hasattr(pe_child.Data, 'Name') and pe_child.Data.Name == 'PeCoff': + old_address = pe_child.Data.ImageAddress if hasattr(pe_child.Data, 'ImageAddress') else 0 + pe_child.Data.PeCoffRebase(address_delta) + found_pe = True + break + # Continue recursing + elif hasattr(child, 'Child') and child.Child: + nested_found = self._rebase_nested_sections(child, address_delta) + found_pe = found_pe or nested_found + + return found_pe diff --git a/BaseTools/Source/Python/FirmwareStorageFormat/Common.py b/BaseTools/Source/Python/FirmwareStorageFormat/Common.py index 5082268a0063..1c7af0a95433 100644 --- a/BaseTools/Source/Python/FirmwareStorageFormat/Common.py +++ b/BaseTools/Source/Python/FirmwareStorageFormat/Common.py @@ -5,6 +5,7 @@ # SPDX-License-Identifier: BSD-2-Clause-Patent ## from ctypes import * +from functools import reduce import uuid # ZeroGuid = uuid.UUID('{00000000-0000-0000-0000-000000000000}') @@ -24,6 +25,8 @@ EFI_FFS_VOLUME_TOP_FILE_GUID_BYTE = b'.\x06\xa0\x1by\xc7\x82E\x85f3j\xe8\xf7\x8f\t' ZEROVECTOR_BYTE = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' PADVECTOR = uuid.UUID("ffffffff-ffff-ffff-ffff-ffffffffffff") +EFI_FSP_GUID = uuid.UUID("912740be-2284-4734-b971-84b027353f0c") + FVH_SIGNATURE = b'_FVH' #Alignment @@ -83,3 +86,13 @@ def GetPadSize(Size: int, alignment: int) -> int: return 0 Pad_Size = alignment - Size % alignment return Pad_Size + +def Bytes2Val (bytes): + return reduce(lambda x,y: (x<<8)|y, bytes[::-1] ) + +def Val2Bytes (value, blen): + BytesList = [hex((value>>(i*8) & 0xff)) for i in range(blen)] + FinalBytes = b'' + for item in BytesList: + FinalBytes += item + return FinalBytes diff --git a/BaseTools/Source/Python/FirmwareStorageFormat/FfsFileHeader.py b/BaseTools/Source/Python/FirmwareStorageFormat/FfsFileHeader.py index e9c619d2240e..b6fc5cf44066 100644 --- a/BaseTools/Source/Python/FirmwareStorageFormat/FfsFileHeader.py +++ b/BaseTools/Source/Python/FirmwareStorageFormat/FfsFileHeader.py @@ -11,6 +11,40 @@ EFI_FFS_FILE_HEADER_LEN = 24 EFI_FFS_FILE_HEADER2_LEN = 32 +## File Types Definitions + +EFI_FV_FILETYPE_ALL = 0x00 +EFI_FV_FILETYPE_RAW = 0x01 +EFI_FV_FILETYPE_FREEFORM = 0x02 +EFI_FV_FILETYPE_SECURITY_CORE = 0x03 +EFI_FV_FILETYPE_PEI_CORE = 0x04 +EFI_FV_FILETYPE_DXE_CORE = 0x05 +EFI_FV_FILETYPE_PEIM = 0x06 +EFI_FV_FILETYPE_DRIVER = 0x07 +EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER = 0x08 +EFI_FV_FILETYPE_APPLICATION = 0x09 +EFI_FV_FILETYPE_SMM = 0x0A +EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE = 0x0B +EFI_FV_FILETYPE_COMBINED_SMM_DXE = 0x0C +EFI_FV_FILETYPE_SMM_CORE = 0x0D +EFI_FV_FILETYPE_MM_STANDALONE = 0x0E +EFI_FV_FILETYPE_MM_CORE_STANDALONE = 0x0F +EFI_FV_FILETYPE_OEM_MIN = 0xc0 +EFI_FV_FILETYPE_OEM_MAX = 0xdf +EFI_FV_FILETYPE_DEBUG_MIN = 0xe0 +EFI_FV_FILETYPE_DEBUG_MAX = 0xef +EFI_FV_FILETYPE_FFS_MIN = 0xf0 +EFI_FV_FILETYPE_FFS_MAX = 0xff +EFI_FV_FILETYPE_FFS_PAD = 0xf0 + +## FFS File Attributes. + +FFS_ATTRIB_LARGE_FILE = 0x01 +FFS_ATTRIB_DATA_ALIGNMENT2 = 0x02 +FFS_ATTRIB_FIXED = 0x04 +FFS_ATTRIB_DATA_ALIGNMENT = 0x38 +FFS_ATTRIB_CHECKSUM = 0x40 + class CHECK_SUM(Structure): _pack_ = 1 _fields_ = [ diff --git a/BaseTools/Source/Python/FirmwareStorageFormat/PECOFFHeader.py b/BaseTools/Source/Python/FirmwareStorageFormat/PECOFFHeader.py new file mode 100644 index 000000000000..2026e3a51296 --- /dev/null +++ b/BaseTools/Source/Python/FirmwareStorageFormat/PECOFFHeader.py @@ -0,0 +1,889 @@ +## @file +# This file is used to define the PECOFF Header C Struct. +# +# Copyright (c) 2023-, Intel Corporation. All rights reserved.
    +# SPDX-License-Identifier: BSD-2-Clause-Patent +## +from struct import * +from ctypes import * +from FirmwareStorageFormat.Common import * + +## Signature +EFI_IMAGE_DOS_SIGNATURE = 0x5A4D # MZ +EFI_IMAGE_OS2_SIGNATURE = 0x454E # NE +EFI_IMAGE_OS2_SIGNATURE_LE = 0x454C # LE +EFI_IMAGE_NT_SIGNATURE = 0x00004550 # PE00 +EFI_IMAGE_EDOS_SIGNATURE = 0x44454550 # PEED +EFI_IMAGE_TE_SIGNATURE = 0x5A56 # VZ + + +## PE32+ Subsystem type for EFI images +## Windows Subsystem +EFI_IMAGE_SUBSYSTEM_UNKNOWN = 0 # An unknown subsystem +EFI_IMAGE_SUBSYSTEM_NATIVE = 1 # Device drivers and native Windows processes +EFI_IMAGE_SUBSYSTEM_WINDOWS_GUI = 2 # The Windows graphical user interface (GUI) subsystem +EFI_IMAGE_SUBSYSTEM_WINDOWS_CUI = 3 # The Windows character subsystem +EFI_IMAGE_SUBSYSTEM_OS2_CUI = 5 # The OS/2 character subsystem +EFI_IMAGE_SUBSYSTEM_POSIX_CUI = 7 # The Posix character subsystem +EFI_IMAGE_SUBSYSTEM_NATIVE_WINDOWS = 8 # Native Win9x driver +EFI_IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9 # Windows CE +EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION = 10 # An Extensible Firmware Interface (EFI) application +EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11 # An EFI driver with boot services +EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12 # An EFI driver with run-time services +EFI_IMAGE_SUBSYSTEM_EFI_ROM = 13 # An EFI ROM image +EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER = 13 +EFI_IMAGE_SUBSYSTEM_XBOX = 14 # XBOX +EFI_IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION = 16 # Windows boot application. + +## Machine Types + +EFI_IMAGE_FILE_MACHINE_UNKNOWN = 0x0 # The content of this field is assumed to be applicable to any machine type +EFI_IMAGE_FILE_MACHINE_AM33 = 0x01d3 # Matsushita AM33 +EFI_IMAGE_FILE_MACHINE_I386 = 0x014c # Intel 386 or later processors and compatible processors +EFI_IMAGE_FILE_MACHINE_EBC = 0x0EBC # EFI byte code +EFI_IMAGE_FILE_MACHINE_X64 = 0x8664 # IMAGE_FILE_MACHINE_AMD64, x64 +EFI_IMAGE_FILE_MACHINE_ARM = 0x01c0 # Thumb only, ARM little endian +EFI_IMAGE_FILE_MACHINE_ARMT = 0x01c2 # 32bit Mixed ARM and Thumb/Thumb 2 Little Endian -- IMAGE_FILE_MACHINE_THUMB +EFI_IMAGE_FILE_MACHINE_ARM64 = 0xAA64 # 64bit ARM Architecture, Little Endian +EFI_IMAGE_FILE_MACHINE_RISCV32 = 0x5032 # RISC-V 32-bit address space +EFI_IMAGE_FILE_MACHINE_RISCV64 = 0x5064 # 64bit RISC-V ISA / RISC-V 64-bit address space +EFI_IMAGE_FILE_MACHINE_RISCV128 = 0x5128 # RISC-V 128-bit address space +EFI_IMAGE_FILE_MACHINE_ARMNT = 0x01c4 # ARM Thumb-2 little endian +EFI_IMAGE_FILE_MACHINE_IA64 = 0x200 # Intel Itanium processor family +EFI_IMAGE_FILE_MACHINE_LOONGARCH32 = 0x6232 # LoongArch 32-bit processor family +EFI_IMAGE_FILE_MACHINE_LOONGARCH64 = 0x6264 # LoongArch 64-bit processor family +EFI_IMAGE_FILE_MACHINE_M32R = 0x9041 # Mitsubishi M32R little endian +EFI_IMAGE_FILE_MACHINE_MIPS16 = 0x266 # MIPS16 +EFI_IMAGE_FILE_MACHINE_MIPSFPU = 0x366 # MIPS with FPU +EFI_IMAGE_FILE_MACHINE_MIPSFPU16 = 0x466 # MIPS16 with FPU +EFI_IMAGE_FILE_MACHINE_POWERPC = 0x1f0 # Power PC little endian +EFI_IMAGE_FILE_MACHINE_POWERPCFP = 0x1f1 # Power PC with floating point support +EFI_IMAGE_FILE_MACHINE_R4000 = 0x166 # MIPS little endian +EFI_IMAGE_FILE_MACHINE_SH3 = 0x1a2 # Hitachi SH3 +EFI_IMAGE_FILE_MACHINE_SH3DSP = 0x1a3 # Hitachi SH3 DSP +EFI_IMAGE_FILE_MACHINE_SH4 = 0x1a6 # Hitachi SH4 +EFI_IMAGE_FILE_MACHINE_SH5 = 0x1a8 # Hitachi SH5 +EFI_IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x169 # MIPS little-endian WCE v2 + + +class EFI_IMAGE_DOS_HEADER(Structure): + _pack_ = 1 + _fields_ = [ + ('e_magic', c_uint16), # Magic number + ('e_cblp', c_uint16), # Bytes on last page of file + ('e_cp', c_uint16), # Pages in file + ('e_crlc', c_uint16), # Relocations + ('e_cparhdr', c_uint16), # Size of header in paragraphs + ('e_minalloc', c_uint16), # Minimum extra paragraphs needed + ('e_maxalloc', c_uint16), # Maximum extra paragraphs needed + ('e_ss', c_uint16), # Initial (relative) SS value + ('e_sp', c_uint16), # Initial SP value + ('e_csum', c_uint16), # Checksum + ('e_ip', c_uint16), # Initial IP value + ('e_cs', c_uint16), # Initial (relative) CS value + ('e_lfarlc', c_uint16), # File address of relocation table 520e 0x70 + ('e_ovno', c_uint16), # Overlay number + ('e_res', ARRAY(c_uint16, 4)), # Reserved words + ('e_oemid', c_uint16), # OEM identifier (for e_oeminfo) + ('e_oeminfo', c_uint16), # OEM information; e_oemid specific + ('e_res2', ARRAY(c_uint16, 10)), # Reserved words + ('e_lfanew', c_uint32), # File address of new exe header 02a0 + ] + + +class EFI_IMAGE_FILE_HEADER(Structure): + _pack_ = 1 + _fields_ = [ + ('Machine', c_uint16), # The number that identifies the type of target machine. + ('NumberOfSections', c_uint16), # The number of sections. This indicates the size of the section table, which immediately follows the headers. + ('TimeDateStamp', c_uint32), # The low 32 bits of the number of seconds since 00:00 January 1, 1970 (a C run-time time_t value), which indicates when the file was created. + ('PointerToSymbolTable', c_uint32), # The file offset of the COFF symbol table, or zero if no COFF symbol table is present. This value should be zero for an image because COFF debugging information is deprecated. + ('NumberOfSymbols', c_uint32), # The number of entries in the symbol table. This data can be used to locate the string table, which immediately follows the symbol table. This value should be zero for an image because COFF debugging information is deprecated. + ('SizeOfOptionalHeader', c_uint16), # The size of the optional header, which is required for executable files but not for object files. This value should be zero for an object file. + ('Characteristics', c_uint16), # The flags that indicate the attributes of the file. + ] + +EFI_IMAGE_SIZEOF_FILE_HEADER = 20 + +## Characteristics +EFI_IMAGE_FILE_RELOCS_STRIPPED = 0x0001 # Image only, Windows CE, and Microsoft Windows NT and later. + # This indicates that the file does not contain base relocations and must therefore be loaded at its preferred base address. + # If the base address is not available, the loader reports an error. The default behavior of the linker is to strip base relocations from executable (EXE) files. +EFI_IMAGE_FILE_EXECUTABLE_IMAGE = 0x0002 # Image only. This indicates that the image file is valid and can be run. If this flag is not set, it indicates a linker error. +EFI_IMAGE_FILE_LINE_NUMS_STRIPPED = 0x0004 # COFF line numbers have been removed. This flag is deprecated and should be zero. +EFI_IMAGE_FILE_LOCAL_SYMS_STRIPPED = 0x0008 # COFF symbol table entries for local symbols have been removed. This flag is deprecated and should be zero. +EFI_IMAGE_FILE_AGGRESSIVE_WS_TRIM = 0x0010 # Obsolete. Aggressively trim working set. This flag is deprecated for Windows 2000 and later and must be zero. +EFI_IMAGE_FILE_LARGE_ADDRESS_AWARE = 0x0020 # Application can handle > 2-GB addresses. +# 0x0040 flag is reserved for future use +EFI_IMAGE_FILE_BYTES_REVERSED_LO = 0x0080 # Little endian: the least significant bit (LSB) precedes the most significant bit (MSB) in memory. This flag is deprecated and should be zero. +EFI_IMAGE_FILE_32BIT_MACHINE = 0x0100 # Machine is based on a 32-bit-word architecture. +EFI_IMAGE_FILE_DEBUG_STRIPPED = 0x0200 # Debugging information is removed from the image file. +EFI_IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = 0x0400 # If the image is on removable media, fully load it and copy it to the swap file. +EFI_IMAGE_FILE_NET_RUN_FROM_SWAP = 0x0800 # If the image is on network media, fully load it and copy it to the swap file. +EFI_IMAGE_FILE_SYSTEM = 0x1000 # The image file is a system file, not a user program. +EFI_IMAGE_FILE_DLL = 0x2000 # The image file is a dynamic-link library (DLL). Such files are considered executable files for almost all purposes, although they cannot be directly run. +EFI_IMAGE_FILE_UP_SYSTEM_ONLY = 0x4000 # The file should be run only on a uniprocessor machine. +EFI_IMAGE_FILE_BYTES_REVERSED_HI = 0x8000 # Big endian: the MSB precedes the LSB in memory. This flag is deprecated and should be zero. + + +# EFI_IMAGE_DATA_DIRECTORY. +class EFI_IMAGE_DATA_DIRECTORY(Structure): + _pack_ = 1 + _fields_ = [ + ('VirtualAddress', c_uint32), + ('Size', c_uint32), + ] + +EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES = 16 + + +# image ROM Option Header +class EFI_IMAGE_ROM_OPTION_HEADER(Structure): + _pack_ = 1 + _fields_ = [ + ('Magic', c_uint16), # The unsigned integer that identifies the state of the image file. The most common number is 0x10B, which identifies it as a normal executable file. 0x107 identifies it as a ROM image, and 0x20B identifies it as a PE32+ executable. + ('MajorLinkerVersion', c_uint8), # The linker major version number. + ('MinorLinkerVersion', c_uint8), # The linker minor version number. + ('SizeOfCode', c_uint32), # The size of the code (text) section, or the sum of all code sections if there are multiple sections. + ('SizeOfInitializedData', c_uint32), # The size of the initialized data section, or the sum of all such sections if there are multiple data sections. + ('SizeOfUninitializedData', c_uint32), # The size of the uninitialized data section (BSS), or the sum of all such sections if there are multiple BSS sections. + ('AddressOfEntryPoint', c_uint32), # The address of the entry point relative to the image base when the executable file is loaded into memory. For program images, this is the starting address. + # For device drivers, this is the address of the initialization function. An entry point is optional for DLLs. + # When no entry point is present, this field must be zero. + ('BaseOfCode', c_uint32), # The address that is relative to the image base of the beginning-of-code section when it is loaded into memory. + ('BaseOfData', c_uint32), # The address that is relative to the image base of the beginning-of-data section when it is loaded into memory. + ('BaseOfBss', c_uint32), # The address that is relative to the image base of the beginning-of-code section when it is loaded into memory. + ('GprMask', c_uint32), # The address that is relative to the image base of the beginning-of-data section when it is loaded into memory. + ('CprMask', ARRAY(c_uint32, 4)), # The address that is relative to the image base of the beginning-of-code section when it is loaded into memory. + ('GpValue', c_uint32), # The address that is relative to the image base of the beginning-of-data section when it is loaded into memory. + ] + +EFI_IMAGE_ROM_OPTIONAL_HDR_MAGIC = 0x107 +EFI_IMAGE_SIZEOF_ROM_OPTIONAL_HEADER = 0x38 + + +class EFI_IMAGE_ROM_HEADERS(Structure): + _pack_ = 1 + _fields_ = [ + ('FileHeader', EFI_IMAGE_FILE_HEADER), # The unsigned integer that identifies the state of the image file. The most common number is 0x10B, which identifies it as a normal executable file. 0x107 identifies it as a ROM image, and 0x20B identifies it as a PE32+ executable. + ('OptionalHeader', EFI_IMAGE_ROM_OPTION_HEADER), # The linker major version number. + ] + + + +EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC = 0x10b + +class EFI_IMAGE_OPTIONAL_HEADER32(Structure): + _pack_ = 1 + _fields_ = [ + # Standard fields + ('Magic', c_uint16), # The unsigned integer that identifies the state of the image file. The most common number is 0x10B, which identifies it as a normal executable file. 0x107 identifies it as a ROM image, and 0x20B identifies it as a PE32+ executable. + ('MajorLinkerVersion', c_uint8), # The linker major version number. + ('MinorLinkerVersion', c_uint8), # The linker minor version number. + ('SizeOfCode', c_uint32), # The size of the code (text) section, or the sum of all code sections if there are multiple sections. + ('SizeOfInitializedData', c_uint32), # The size of the initialized data section, or the sum of all such sections if there are multiple data sections. + ('SizeOfUninitializedData', c_uint32), # The size of the uninitialized data section (BSS), or the sum of all such sections if there are multiple BSS sections. + ('AddressOfEntryPoint', c_uint32), # The address of the entry point relative to the image base when the executable file is loaded into memory. For program images, this is the starting address. + # For device drivers, this is the address of the initialization function. An entry point is optional for DLLs. + # When no entry point is present, this field must be zero. + ('BaseOfCode', c_uint32), # The address that is relative to the image base of the beginning-of-code section when it is loaded into memory. + ('BaseOfData', c_uint32), # The address that is relative to the image base of the beginning-of-data section when it is loaded into memory. + # NT additional fields + ('ImageBase', c_uint32), # The preferred address of the first byte of image when loaded into memory; must be a multiple of 64 K. + # The default for DLLs is 0x10000000. The default for Windows CE EXEs is 0x00010000. + # The default for Windows NT, Windows 2000, Windows XP, Windows 95, Windows 98, and Windows Me is 0x00400000. + ('SectionAlignment', c_uint32), # The alignment (in bytes) of sections when they are loaded into memory. + # It must be greater than or equal to FileAlignment. The default is the page size for the architecture. + ('FileAlignment', c_uint32), # The alignment factor (in bytes) that is used to align the raw data of sections in the image file. + # The value should be a power of 2 between 512 and 64 K, inclusive. The default is 512. + # If the SectionAlignment is less than the architecture's page size, then FileAlignment must match SectionAlignment. + ('MajorOperatingSystemVersion', c_uint16), # The major version number of the required operating system. + ('MinorOperatingSystemVersion', c_uint16), # The minor version number of the required operating system. + ('MajorImageVersion', c_uint16), # The major version number of the image. + ('MinorImageVersion', c_uint16), # The minor version number of the image. + ('MajorSubsystemVersion', c_uint16), # The major version number of the subsystem. + ('MinorSubsystemVersion', c_uint16), # The minor version number of the subsystem. + ('Win32VersionValue', c_uint32), # Reserved, must be zero. + ('SizeOfImage', c_uint32), # The size (in bytes) of the image, including all headers, as the image is loaded in memory. It must be a multiple of SectionAlignment. + ('SizeOfHeaders', c_uint32), # The combined size of an MS-DOS stub, PE header, and section headers rounded up to a multiple of FileAlignment. + ('CheckSum', c_uint32), # The image file checksum. The algorithm for computing the checksum is incorporated into IMAGHELP.DLL. + # The following are checked for validation at load time: all drivers, any DLL loaded at boot time, and any DLL that is loaded into a critical Windows process. + ('Subsystem', c_uint16), # The subsystem that is required to run this image. + ('DllCharacteristics', c_uint16), + ('SizeOfStackReserve', c_uint32), # The size of the stack to reserve. Only SizeOfStackCommit is committed; the rest is made available one page at a time until the reserve size is reached. + ('SizeOfStackCommit', c_uint32), # The size of the stack to commit. + ('SizeOfHeapReserve', c_uint32), # The size of the local heap space to reserve. Only SizeOfHeapCommit is committed; the rest is made available one page at a time until the reserve size is reached. + ('SizeOfHeapCommit', c_uint32), # The size of the local heap space to commit. + ('LoaderFlags', c_uint32), # Reserved, must be zero. + ('NumberOfRvaAndSizes', c_uint32), # The number of data-directory entries in the remainder of the optional header. Each describes a location and size. + ('DataDirectory', ARRAY(EFI_IMAGE_DATA_DIRECTORY, EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES)), + ] + + +EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC = 0x20b + +class EFI_IMAGE_OPTIONAL_HEADER64(Structure): + _pack_ = 1 + _fields_ = [ + # Standard fields + ('Magic', c_uint16), # The unsigned integer that identifies the state of the image file. The most common number is 0x10B, which identifies it as a normal executable file. 0x107 identifies it as a ROM image, and 0x20B identifies it as a PE32+ executable. + ('MajorLinkerVersion', c_uint8), # The linker major version number. + ('MinorLinkerVersion', c_uint8), # The linker minor version number. + ('SizeOfCode', c_uint32), # The size of the code (text) section, or the sum of all code sections if there are multiple sections. + ('SizeOfInitializedData', c_uint32), # The size of the initialized data section, or the sum of all such sections if there are multiple data sections. + ('SizeOfUninitializedData', c_uint32), # The size of the uninitialized data section (BSS), or the sum of all such sections if there are multiple BSS sections. + ('AddressOfEntryPoint', c_uint32), # The address of the entry point relative to the image base when the executable file is loaded into memory. For program images, this is the starting address. + # For device drivers, this is the address of the initialization function. An entry point is optional for DLLs. + # When no entry point is present, this field must be zero. + ('BaseOfCode', c_uint32), # The address that is relative to the image base of the beginning-of-code section when it is loaded into memory. + # NT additional fields + ('ImageBase', c_uint64), # The preferred address of the first byte of image when loaded into memory; must be a multiple of 64 K. + # The default for DLLs is 0x10000000. The default for Windows CE EXEs is 0x00010000. + # The default for Windows NT, Windows 2000, Windows XP, Windows 95, Windows 98, and Windows Me is 0x00400000. + ('SectionAlignment', c_uint32), # The alignment (in bytes) of sections when they are loaded into memory. + # It must be greater than or equal to FileAlignment. The default is the page size for the architecture. + ('FileAlignment', c_uint32), # The alignment factor (in bytes) that is used to align the raw data of sections in the image file. + # The value should be a power of 2 between 512 and 64 K, inclusive. The default is 512. + # If the SectionAlignment is less than the architecture's page size, then FileAlignment must match SectionAlignment. + ('MajorOperatingSystemVersion', c_uint16), # The major version number of the required operating system. + ('MinorOperatingSystemVersion', c_uint16), # The minor version number of the required operating system. + ('MajorImageVersion', c_uint16), # The major version number of the image. + ('MinorImageVersion', c_uint16), # The minor version number of the image. + ('MajorSubsystemVersion', c_uint16), # The major version number of the subsystem. + ('MinorSubsystemVersion', c_uint16), # The minor version number of the subsystem. + ('Win32VersionValue', c_uint32), # Reserved, must be zero. + ('SizeOfImage', c_uint32), # The size (in bytes) of the image, including all headers, as the image is loaded in memory. It must be a multiple of SectionAlignment. + ('SizeOfHeaders', c_uint32), # The combined size of an MS-DOS stub, PE header, and section headers rounded up to a multiple of FileAlignment. + ('CheckSum', c_uint32), # The image file checksum. The algorithm for computing the checksum is incorporated into IMAGHELP.DLL. + # The following are checked for validation at load time: all drivers, any DLL loaded at boot time, and any DLL that is loaded into a critical Windows process. + ('Subsystem', c_uint16), # The subsystem that is required to run this image. + ('DllCharacteristics', c_uint16), + ('SizeOfStackReserve', c_uint64), # The size of the stack to reserve. Only SizeOfStackCommit is committed; the rest is made available one page at a time until the reserve size is reached. + ('SizeOfStackCommit', c_uint64), # The size of the stack to commit. + ('SizeOfHeapReserve', c_uint64), # The size of the local heap space to reserve. Only SizeOfHeapCommit is committed; the rest is made available one page at a time until the reserve size is reached. + ('SizeOfHeapCommit', c_uint64), # The size of the local heap space to commit. + ('LoaderFlags', c_uint32), # Reserved, must be zero. + ('NumberOfRvaAndSizes', c_uint32), # The number of data-directory entries in the remainder of the optional header. Each describes a location and size. + ('DataDirectory', ARRAY(EFI_IMAGE_DATA_DIRECTORY, EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES)), + ] + + +## attension +# EFI_IMAGE_NT_HEADERS32 and EFI_IMAGE_HEADERS64 are for use ONLY +# by tools. All proper EFI code MUST use EFI_IMAGE_NT_HEADERS ONLY!!! +# + +class EFI_IMAGE_NT_HEADERS32(Structure): + _pack_ = 1 + _fields_ = [ + ('Signature', c_uint32), # Size: 4 + ('FileHeader', EFI_IMAGE_FILE_HEADER), # Size: 20 + ('OptionalHeader', EFI_IMAGE_OPTIONAL_HEADER32), # Size: 224 + ] + +EFI_IMAGE_SIZEOF_NT_OPTIONAL32_HEADER = 0xf8 + +class EFI_IMAGE_NT_HEADERS64(Structure): + _pack_ = 1 + _fields_ = [ + ('Signature', c_uint32), # Size: 4 + ('FileHeader', EFI_IMAGE_FILE_HEADER), # Size: 20 + ('OptionalHeader', EFI_IMAGE_OPTIONAL_HEADER64), # Size: 240 + ] + +EFI_IMAGE_SIZEOF_NT_OPTIONAL64_HEADER = 0x108 + + +## Directory Entries + +EFI_IMAGE_DIRECTORY_ENTRY_EXPORT = 0 +EFI_IMAGE_DIRECTORY_ENTRY_IMPORT = 1 +EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE = 2 +EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION = 3 +EFI_IMAGE_DIRECTORY_ENTRY_SECURITY = 4 +EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC = 5 +EFI_IMAGE_DIRECTORY_ENTRY_DEBUG = 6 +EFI_IMAGE_DIRECTORY_ENTRY_COPYRIGHT = 7 +EFI_IMAGE_DIRECTORY_ENTRY_GLOBALPTR = 8 +EFI_IMAGE_DIRECTORY_ENTRY_TLS = 9 +EFI_IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG = 10 + + +class EFI_IMAGE_SECTION_HEADER_MISC(Union): + _pack_ = 1 + _fields_ = [ + ('PhysicalAddress', c_uint32), + ('VirtualSize', c_uint32), # The total size of the section when loaded into memory. If this value is greater than SizeOfRawData, the section is zero-padded. + # This field is valid only for executable images and should be set to zero for object files. + ] + +EFI_IMAGE_SIZEOF_SHORT_NAME = 8 + +class EFI_IMAGE_SECTION_HEADER(Structure): + _pack_ = 1 + _fields_ = [ + ('Name', ARRAY(c_uint8, EFI_IMAGE_SIZEOF_SHORT_NAME)), # An 8-byte, null-padded UTF-8 encoded string. If the string is exactly 8 characters long, there is no terminating null. + # For longer names, this field contains a slash (/) that is followed by an ASCII representation of a decimal number that is an offset into the string table. + # Executable images do not use a string table and do not support section names longer than 8 characters. + # Long names in object files are truncated if they are emitted to an executable file. + ('Misc', EFI_IMAGE_SECTION_HEADER_MISC), # The total size of the section when loaded into memory. If this value is greater than SizeOfRawData, the section is zero-padded. + # This field is valid only for executable images and should be set to zero for object files. + ('VirtualAddress', c_uint32), # For executable images, the address of the first byte of the section relative to the image base when the section is loaded into memory. + # For object files, this field is the address of the first byte before relocation is applied; for simplicity, compilers should set this to zero. + # Otherwise, it is an arbitrary value that is subtracted from offsets during relocation. + ('SizeOfRawData', c_uint32), # The size of the section (for object files) or the size of the initialized data on disk (for image files). + # For executable images, this must be a multiple of FileAlignment from the optional header. + # If this is less than VirtualSize, the remainder of the section is zero-filled. + # Because the SizeOfRawData field is rounded but the VirtualSize field is not, it is possible for SizeOfRawData to be greater than VirtualSize as well. + # When a section contains only uninitialized data, this field should be zero. + ('PointerToRawData', c_uint32), # The file pointer to the first page of the section within the COFF file. For executable images, this must be a multiple of FileAlignment from the optional header. + # For object files, the value should be aligned on a 4-byte boundary for best performance. + # When a section contains only uninitialized data, this field should be zero. + ('PointerToRelocations', c_uint32), # The file pointer to the beginning of relocation entries for the section. This is set to zero for executable images or if there are no relocations. + ('PointerToLinenumbers', c_uint32), # The file pointer to the beginning of line-number entries for the section. This is set to zero if there are no COFF line numbers. + # This value should be zero for an image because COFF debugging information is deprecated. + ('NumberOfRelocations', c_uint16), # The number of relocation entries for the section. This is set to zero for executable images. + ('NumberOfLinenumbers', c_uint16), # The number of line-number entries for the section. This value should be zero for an image because COFF debugging information is deprecated. + ('Characteristics', c_uint32), # The flags that describe the characteristics of the section. See Section Flags + ] + +EFI_IMAGE_SIZEOF_SECTION_HEADER = 40 + +## Section Flags +# 0x00000000 / 0x00000001 / 0x00000002 / 0x00000004 / 0x00000010 / 0x00000400 --- Reserved, must be zero +EFI_IMAGE_SCN_TYPE_NO_PAD = 0x00000008 # The section should not be padded to the next boundary. This flag is obsolete and is replaced by IMAGE_SCN_ALIGN_1BYTES. This is valid only for object files. +EFI_IMAGE_SCN_CNT_CODE = 0x00000020 # The section contains executable code. +EFI_IMAGE_SCN_CNT_INITIALIZED_DATA = 0x00000040 # The section contains initialized data. +EFI_IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080 # The section contains uninitialized data. +EFI_IMAGE_SCN_LNK_OTHER = 0x00000100 # Reserved for future use. +EFI_IMAGE_SCN_LNK_INFO = 0x00000100 # The section contains comments or other information. The .drectve section has this type. This is valid for object files only. +EFI_IMAGE_SCN_LNK_REMOVE = 0x00000800 # The section will not become part of the image. This is valid only for object files. +EFI_IMAGE_SCN_LNK_COMDAT = 0x00001000 # The section contains COMDAT data. For more information, see COMDAT Sections (Object Only). This is valid only for object files. +EFI_IMAGE_SCN_GPREL = 0x00008000 # The section contains data referenced through the global pointer (GP). +EFI_IMAGE_SCN_MEM_PURGEABLE = 0x00010000 # Reserved for future use. +EFI_IMAGE_SCN_MEM_16BIT = 0x00020000 # Reserved for future use. +EFI_IMAGE_SCN_MEM_LOCKED = 0x00040000 # Reserved for future use. +EFI_IMAGE_SCN_MEM_PRELOAD = 0x00080000 # Reserved for future use. +EFI_IMAGE_SCN_ALIGN_1BYTES = 0x00100000 # Align data on a 1-byte boundary. Valid only for object files. +EFI_IMAGE_SCN_ALIGN_2BYTES = 0x00200000 # Align data on a 2-byte boundary. Valid only for object files. +EFI_IMAGE_SCN_ALIGN_4BYTES = 0x00300000 # Align data on a 4-byte boundary. Valid only for object files. +EFI_IMAGE_SCN_ALIGN_8BYTES = 0x00400000 # Align data on an 8-byte boundary. Valid only for object files. +EFI_IMAGE_SCN_ALIGN_16BYTES = 0x00500000 # Align data on a 16-byte boundary. Valid only for object files. +EFI_IMAGE_SCN_ALIGN_32BYTES = 0x00600000 # Align data on a 32-byte boundary. Valid only for object files. +EFI_IMAGE_SCN_ALIGN_64BYTES = 0x00700000 # Align data on a 64-byte boundary. Valid only for object files. +EFI_IMAGE_SCN_ALIGN_128BYTES = 0x00800000 # Align data on a 128-byte boundary. Valid only for object files. +EFI_IMAGE_SCN_ALIGN_256BYTES = 0x00900000 # Align data on a 256-byte boundary. Valid only for object files. +EFI_IMAGE_SCN_ALIGN_512BYTES = 0x00A00000 # Align data on a 512-byte boundary. Valid only for object files. +EFI_IMAGE_SCN_ALIGN_1024BYTES = 0x00B00000 # Align data on a 1024-byte boundary. Valid only for object files. +EFI_IMAGE_SCN_ALIGN_2048BYTES = 0x00C00000 # Align data on a 2048-byte boundary. Valid only for object files. +EFI_IMAGE_SCN_ALIGN_4096BYTES = 0x00D00000 # Align data on a 4096-byte boundary. Valid only for object files. +EFI_IMAGE_SCN_ALIGN_8192BYTES = 0x00E00000 # Align data on an 8192-byte boundary. Valid only for object files. +EFI_IMAGE_SCN_LNK_NRELOC_OVFL = 0x01000000 # The section contains extended relocations. +EFI_IMAGE_SCN_MEM_DISCARDABLE = 0x02000000 # The section can be discarded as needed. +EFI_IMAGE_SCN_MEM_NOT_CACHED = 0x04000000 # The section cannot be cached. +EFI_IMAGE_SCN_MEM_NOT_PAGED = 0x08000000 # The section is not pageable. +EFI_IMAGE_SCN_MEM_SHARED = 0x10000000 # The section can be shared in memory. +EFI_IMAGE_SCN_MEM_EXECUTE = 0x20000000 # The section can be executed as code. +EFI_IMAGE_SCN_MEM_READ = 0x40000000 # The section can be read. +EFI_IMAGE_SCN_MEM_WRITE = 0x80000000 # The section can be written to. + + +EFI_IMAGE_SIZEOF_SYMBOL = 18 + + +## Section Nuber Values: the Section Value field in a symbol table entry is a one-based index into the section table. However, this field is a signed integer and can take negative values. +EFI_IMAGE_SYM_UNDEFINED = 0 # The symbol record is not yet assigned a section. A value of zero indicates that a reference to an external symbol is defined elsewhere. + # A value of non-zero is a common symbol with a size that is specified by the value. +EFI_IMAGE_SYM_ABSOLUTE = -1 # The symbol has an absolute (non-relocatable) value and is not an address. +EFI_IMAGE_SYM_DEBUG = -2 # The symbol provides general type or debugging information but does not correspond to a section. Microsoft tools use this setting along with .file records (storage class FILE). + +## Type Representation: Type (fundamental) values. +EFI_IMAGE_SYM_TYPE_NULL = 0 # No type information or unknown base type. Microsoft tools use this setting +EFI_IMAGE_SYM_TYPE_VOID = 1 # No valid type; used with void pointers and functions +EFI_IMAGE_SYM_TYPE_CHAR = 2 # A character (signed byte) +EFI_IMAGE_SYM_TYPE_SHORT = 3 # A 2-byte signed integer +EFI_IMAGE_SYM_TYPE_INT = 4 # A natural integer type (normally 4 bytes in Windows) +EFI_IMAGE_SYM_TYPE_LONG = 5 # A 4-byte signed integer +EFI_IMAGE_SYM_TYPE_FLOAT = 6 # A 4-byte floating-point number +EFI_IMAGE_SYM_TYPE_DOUBLE = 7 # An 8-byte floating-point number +EFI_IMAGE_SYM_TYPE_STRUCT = 8 # A structure +EFI_IMAGE_SYM_TYPE_UNION = 9 # A union +EFI_IMAGE_SYM_TYPE_ENUM = 10 # An enumerated type +EFI_IMAGE_SYM_TYPE_MOE = 11 # A member of enumeration (a specific value) +EFI_IMAGE_SYM_TYPE_BYTE = 12 # A byte; unsigned 1-byte integer +EFI_IMAGE_SYM_TYPE_WORD = 13 # A word; unsigned 2-byte integer +EFI_IMAGE_SYM_TYPE_UINT = 14 # An unsigned integer of natural size (normally, 4 bytes) +EFI_IMAGE_SYM_TYPE_DWORD = 15 # An unsigned 4-byte integer +## Type Representation: Type (derived) values. +EFI_IMAGE_SYM_DTYPE_NULL = 0 # No derived type; the symbol is a simple scalar variable. +EFI_IMAGE_SYM_DTYPE_POINTER = 1 # The symbol is a pointer to base type. +EFI_IMAGE_SYM_DTYPE_FUNCTION = 2 # The symbol is a function that returns a base type. +EFI_IMAGE_SYM_DTYPE_ARRAY = 3 # The symbol is an array of base type. + +## Storage classes. +# EFI_IMAGE_SYM_CLASS_END_OF_FUNCTION = (UINT8) -1 +EFI_IMAGE_SYM_CLASS_NULL = 0 +EFI_IMAGE_SYM_CLASS_AUTOMATIC = 1 +EFI_IMAGE_SYM_CLASS_EXTERNAL = 2 +EFI_IMAGE_SYM_CLASS_STATIC = 3 +EFI_IMAGE_SYM_CLASS_REGISTER = 4 +EFI_IMAGE_SYM_CLASS_EXTERNAL_DEF = 5 +EFI_IMAGE_SYM_CLASS_LABEL = 6 +EFI_IMAGE_SYM_CLASS_UNDEFINED_LABEL = 7 +EFI_IMAGE_SYM_CLASS_MEMBER_OF_STRUCT = 8 +EFI_IMAGE_SYM_CLASS_ARGUMENT = 9 +EFI_IMAGE_SYM_CLASS_STRUCT_TAG = 10 +EFI_IMAGE_SYM_CLASS_MEMBER_OF_UNION = 11 +EFI_IMAGE_SYM_CLASS_UNION_TAG = 12 +EFI_IMAGE_SYM_CLASS_TYPE_DEFINITION = 13 +EFI_IMAGE_SYM_CLASS_UNDEFINED_STATIC = 14 +EFI_IMAGE_SYM_CLASS_ENUM_TAG = 15 +EFI_IMAGE_SYM_CLASS_MEMBER_OF_ENUM = 16 +EFI_IMAGE_SYM_CLASS_REGISTER_PARAM = 17 +EFI_IMAGE_SYM_CLASS_BIT_FIELD = 18 +EFI_IMAGE_SYM_CLASS_BLOCK = 100 +EFI_IMAGE_SYM_CLASS_FUNCTION = 101 +EFI_IMAGE_SYM_CLASS_END_OF_STRUCT = 102 +EFI_IMAGE_SYM_CLASS_FILE = 103 +EFI_IMAGE_SYM_CLASS_SECTION = 104 +EFI_IMAGE_SYM_CLASS_WEAK_EXTERNAL = 105 + + +## type packing constants +EFI_IMAGE_N_BTMASK = 17 +EFI_IMAGE_N_TMASK = 60 +EFI_IMAGE_N_TMASK1 = 300 +EFI_IMAGE_N_TMASK2 = 360 +EFI_IMAGE_N_BTSHFT = 4 +EFI_IMAGE_N_TSHIFT = 2 + + +## Communal selection types. +EFI_IMAGE_COMDAT_SELECT_NODUPLICATES = 1 +EFI_IMAGE_COMDAT_SELECT_ANY = 2 +EFI_IMAGE_COMDAT_SELECT_SAME_SIZE = 3 +EFI_IMAGE_COMDAT_SELECT_EXACT_MATCH = 4 +EFI_IMAGE_COMDAT_SELECT_ASSOCIATIVE = 5 + +EFI_IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY = 1 +EFI_IMAGE_WEAK_EXTERN_SEARCH_LIBRARY = 2 +EFI_IMAGE_WEAK_EXTERN_SEARCH_ALIAS = 3 + +class EFI_IMAGE_RELOCATION(Structure): + _pack_ = 1 + _fields_ = [ + ('VirtualAddress', c_uint32), # The address of the item to which relocation is applied. + # This is the offset from the beginning of the section, plus the value of the section's RVA/Offset field. + # See Section Table (Section Headers). For example, if the first byte of the section has an address of 0x10, the third byte has an address of 0x12. + ('SymbolTableIndex', c_uint32), # A zero-based index into the symbol table. This symbol gives the address that is to be used for the relocation. + # If the specified symbol has section storage class, then the symbol's address is the address with the first section of the same name. + ('Type', c_uint16), # A value that indicates the kind of relocation that should be performed. Valid relocation types depend on machine type. See Type Indicators. + ] + +EFI_IMAGE_SIZEOF_RELOCATION = 10 + + +## Relocation Type +# for X64 and compatible processors +EFI_IMAGE_REL_AMD64_ABSOLUTE = 0x0000 # The relocation is ignored. +EFI_IMAGE_REL_AMD64_ADDR64 = 0x0001 # The 64-bit VA of the relocation target. +EFI_IMAGE_REL_AMD64_ADDR32 = 0x0002 # The 32-bit VA of the relocation target. +EFI_IMAGE_REL_AMD64_ADDR32NB = 0x0003 # The 32-bit address without an image base (RVA). +EFI_IMAGE_REL_AMD64_REL32 = 0x0004 # The 32-bit relative address from the byte following the relocation. +EFI_IMAGE_REL_AMD64_REL32_1 = 0x0005 # The 32-bit address relative to byte distance 1 from the relocation. +EFI_IMAGE_REL_AMD64_REL32_2 = 0x0006 # The 32-bit address relative to byte distance 2 from the relocation. +EFI_IMAGE_REL_AMD64_REL32_3 = 0x0007 # The 32-bit address relative to byte distance 3 from the relocation. +EFI_IMAGE_REL_AMD64_REL32_4 = 0x0008 # The 32-bit address relative to byte distance 4 from the relocation. +EFI_IMAGE_REL_AMD64_REL32_5 = 0x0009 # The 32-bit address relative to byte distance 5 from the relocation. +EFI_IMAGE_REL_AMD64_SECTION = 0x000A # The 16-bit section index of the section that contains the target. This is used to support debugging information. +EFI_IMAGE_REL_AMD64_SECREL = 0x000B # The 32-bit offset of the target from the beginning of its section. This is used to support debugging information and static thread local storage. +EFI_IMAGE_REL_AMD64_SECREL7 = 0x000C # A 7-bit unsigned offset from the base of the section that contains the target. +EFI_IMAGE_REL_AMD64_TOKEN = 0x000D # CLR tokens. +EFI_IMAGE_REL_AMD64_SREL32 = 0x000E # A 32-bit signed span-dependent value emitted into the object. +EFI_IMAGE_REL_AMD64_PAIR = 0x000F # A pair that must immediately follow every span-dependent value. +EFI_IMAGE_REL_AMD64_SSPAN32 = 0x0010 # A 32-bit signed span-dependent value that is applied at link time. +# for ARM Processors +EFI_IMAGE_REL_ARM_ABSOLUTE = 0x0000 # The relocation is ignored. +EFI_IMAGE_REL_ARM_ADDR32 = 0x0001 # The 32-bit VA of the target. +EFI_IMAGE_REL_ARM_ADDR32NB = 0x0002 # The 32-bit RVA of the target. +EFI_IMAGE_REL_ARM_BRANCH24 = 0x0003 # The 24-bit relative displacement to the target. +EFI_IMAGE_REL_ARM_BRANCH11 = 0x0004 # The reference to a subroutine call. The reference consists of two 16-bit instructions with 11-bit offsets. +EFI_IMAGE_REL_ARM_REL32 = 0x000A # The 32-bit relative address from the byte following the relocation. +EFI_IMAGE_REL_ARM_SECTION = 0x000E # The 16-bit section index of the section that contains the target. This is used to support debugging information. +EFI_IMAGE_REL_ARM_SECREL = 0x000F # The 32-bit offset of the target from the beginning of its section. This is used to support debugging information and static thread local storage. +EFI_IMAGE_REL_ARM_MOV32 = 0x0010 # The 32-bit VA of the target. This relocation is applied using a MOVW instruction for the low 16 bits followed by a MOVT for the high 16 bits. +EFI_IMAGE_REL_THUMB_MOV32 = 0x0011 # The 32-bit VA of the target. This relocation is applied using a MOVW instruction for the low 16 bits followed by a MOVT for the high 16 bits. +EFI_IMAGE_REL_THUMB_BRANCH20 = 0x0012 # The instruction is fixed up with the 21-bit relative displacement to the 2-byte aligned target. + # The least significant bit of the displacement is always zero and is not stored. This relocation corresponds to a Thumb-2 32-bit conditional B instruction. +EFI_IMAGE_REL_THUMB_BRANCH24 = 0x0014 # The instruction is fixed up with the 25-bit relative displacement to the 2-byte aligned target. + # The least significant bit of the displacement is zero and is not stored.This relocation corresponds to a Thumb-2 B instruction. +EFI_IMAGE_REL_THUMB_BLX23 = 0x0015 # The instruction is fixed up with the 25-bit relative displacement to the 4-byte aligned target. The low 2 bits of the displacement are zero and are not stored. + # This relocation corresponds to a Thumb-2 BLX instruction. +EFI_IMAGE_REL_ARM_PAIR = 0x0016 # The relocation is valid only when it immediately follows a ARM_REFHI or THUMB_REFHI. + # Its SymbolTableIndex contains a displacement and not an index into the symbol table. +# for ARM64 Processors +EFI_IMAGE_REL_ARM64_ABSOLUTE = 0x0000 # The relocation is ignored. +EFI_IMAGE_REL_ARM64_ADDR32 = 0x0001 # The 32-bit VA of the target. +EFI_IMAGE_REL_ARM64_ADDR32NB = 0x0002 # The 32-bit RVA of the target. +EFI_IMAGE_REL_ARM64_BRANCH26 = 0x0003 # The 26-bit relative displacement to the target, for B and BL instructions. +EFI_IMAGE_REL_ARM64_PAGEBASE_REL21 = 0x0004 # The page base of the target, for ADRP instruction. +EFI_IMAGE_REL_ARM64_REL21 = 0x0005 # The 12-bit relative displacement to the target, for instruction ADR +EFI_IMAGE_REL_ARM64_PAGEOFFSET_12A = 0x0006 # The 12-bit page offset of the target, for instructions ADD/ADDS (immediate) with zero shift. +EFI_IMAGE_REL_ARM64_PAGEOFFSET_12L = 0x0007 # The 12-bit page offset of the target, for instruction LDR (indexed, unsigned immediate). +EFI_IMAGE_REL_ARM64_SECREL = 0x0008 # The 32-bit offset of the target from the beginning of its section. This is used to support debugging information and static thread local storage. +EFI_IMAGE_REL_ARM64_SECREL_LOW12A = 0x0009 # Bit 0:11 of section offset of the target, for instructions ADD/ADDS (immediate) with zero shift. +EFI_IMAGE_REL_ARM64_SECREL_HIGH12A = 0x000A # Bit 12:23 of section offset of the target, for instructions ADD/ADDS (immediate) with zero shift. +EFI_IMAGE_REL_ARM64_SECREL_LOW12L = 0x000B # Bit 0:11 of section offset of the target, for instruction LDR (indexed, unsigned immediate). +EFI_IMAGE_REL_ARM64_TOKEN = 0x000C # CLR token. +EFI_IMAGE_REL_ARM64_SECTION = 0x000D # The 16-bit section index of the section that contains the target. This is used to support debugging information. +EFI_IMAGE_REL_ARM64_ADDR64 = 0x000E # The 64-bit VA of the relocation target. +EFI_IMAGE_REL_ARM64_BRANCH19 = 0x000F # The 19-bit offset to the relocation target, for conditional B instruction. +EFI_IMAGE_REL_ARM64_BRANCH14 = 0x0010 # The 14-bit offset to the relocation target, for instructions TBZ and TBNZ. +EFI_IMAGE_REL_ARM64_REL32 = 0x0011 # The 32-bit relative address from the byte following the relocation. + +# for IBM PowerPC Processors +EFI_IMAGE_REL_PPC_ABSOLUTE = 0x0000 # The relocation is ignored. +EFI_IMAGE_REL_PPC_ADDR64 = 0x0001 # The 64-bit VA of the target. +EFI_IMAGE_REL_PPC_ADDR32 = 0x0002 # The 32-bit VA of the target. +EFI_IMAGE_REL_PPC_ADDR24 = 0x0003 # The low 24 bits of the VA of the target. This is valid only when the target symbol is absolute and can be sign-extended to its original value. +EFI_IMAGE_REL_PPC_ADDR16 = 0x0004 # The low 16 bits of the target's VA. +EFI_IMAGE_REL_PPC_ADDR14 = 0x0005 # The low 14 bits of the target's VA. This is valid only when the target symbol is absolute and can be sign-extended to its original value. +EFI_IMAGE_REL_PPC_REL24 = 0x0006 # A 24-bit PC-relative offset to the symbol's location. +EFI_IMAGE_REL_PPC_REL14 = 0x0007 # A 14-bit PC-relative offset to the symbol's location. +EFI_IMAGE_REL_PPC_ADDR32NB = 0x000A # The 32-bit RVA of the target. +EFI_IMAGE_REL_PPC_SECREL = 0x000B # The 32-bit offset of the target from the beginning of its section. This is used to support debugging information and static thread local storage. +EFI_IMAGE_REL_PPC_SECTION = 0x000C # The 16-bit section index of the section that contains the target. This is used to support debugging information. +EFI_IMAGE_REL_PPC_SECREL16 = 0x000F # The 16-bit offset of the target from the beginning of its section. This is used to support debugging information and static thread local storage. +EFI_IMAGE_REL_PPC_REFHI = 0x0010 # The high 16 bits of the target's 32-bit VA. This is used for the first instruction in a two-instruction sequence that loads a full address. + # This relocation must be immediately followed by a PAIR relocation whose SymbolTableIndex contains a signed 16-bit displacement that is added to + # the upper 16 bits that was taken from the location that is being relocated. +EFI_IMAGE_REL_PPC_REFLO = 0x0011 # The low 16 bits of the target's VA. +EFI_IMAGE_REL_PPC_PAIR = 0x0012 # A relocation that is valid only when it immediately follows a REFHI or SECRELHI relocation. + # Its SymbolTableIndex contains a displacement and not an index into the symbol table. +EFI_IMAGE_REL_PPC_SECRELLO = 0x0013 # The low 16 bits of the 32-bit offset of the target from the beginning of its section. +EFI_IMAGE_REL_PPC_GPREL = 0x0015 # The 16-bit signed displacement of the target relative to the GP register. +EFI_IMAGE_REL_PPC_TOKEN = 0x0016 # The CLR token. + +# for Intel 386 Processors +EFI_IMAGE_REL_I386_ABSOLUTE = 0x0000 # The relocation is ignored. +EFI_IMAGE_REL_I386_DIR16 = 0x0001 # Not supported. +EFI_IMAGE_REL_I386_REL16 = 0x0002 # Not supported. +EFI_IMAGE_REL_I386_DIR32 = 0x0006 # The target's 32-bit VA. +EFI_IMAGE_REL_I386_DIR32NB = 0x0007 # The target's 32-bit RVA. +EFI_IMAGE_REL_I386_SEG12 = 0x0009 # Not supported. +EFI_IMAGE_REL_I386_SECTION = 0x000A # The 16-bit section index of the section that contains the target. This is used to support debugging information. +EFI_IMAGE_REL_I386_SECREL = 0x000B # The 32-bit offset of the target from the beginning of its section. This is used to support debugging information and static thread local storage. +EFI_IMAGE_REL_I386_TOKEN = 0x000C # The CLR token. +EFI_IMAGE_REL_I386_SECREL7 = 0x000D # A 7-bit offset from the base of the section that contains the target. +EFI_IMAGE_REL_I386_REL32 = 0x0014 # The 32-bit relative displacement to the target. This supports the x86 relative branch and call instructions. + +# SH3, SH4, SHM (Hitachi SuperH Processors); IPF (Intel Itanium Processor Family); MIPS processors; Mitsubishi M32R; These Relocation Types are not listed here. + + +class EFI_IMAGE_BASE_RELOCATION(Structure): + _pack_ = 1 + _fields_ = [ + ('VirtualAddress', c_uint32), + ('SizeOfBlock', c_uint32), + ] + +EFI_IMAGE_SIZEOF_BASE_RELOCATION = 8 + +## Based relocation types. +EFI_IMAGE_REL_BASED_ABSOLUTE = 0 +EFI_IMAGE_REL_BASED_HIGH = 1 +EFI_IMAGE_REL_BASED_LOW = 2 +EFI_IMAGE_REL_BASED_HIGHLOW = 3 +EFI_IMAGE_REL_BASED_HIGHADJ = 4 +EFI_IMAGE_REL_BASED_MIPS_JMPADDR = 5 +EFI_IMAGE_REL_BASED_ARM_MOV32A = 5 +EFI_IMAGE_REL_BASED_RISCV_HI20 = 5 +EFI_IMAGE_REL_BASED_ARM_MOV32T = 7 +EFI_IMAGE_REL_BASED_RISCV_LOW12I = 7 +EFI_IMAGE_REL_BASED_RISCV_LOW12S = 8 +EFI_IMAGE_REL_BASED_IA64_IMM64 = 9 +EFI_IMAGE_REL_BASED_DIR64 = 10 + +class EFI_IMAGE_LINENUMBER_TYPE(Union): + _pack_ = 1 + _fields_ = [ + ('SymbolTableIndex', c_uint32), # Symbol table index of function name if Linenumber is 0. + ('VirtualAddress', c_uint32), # Virtual address of line number. + ] + +class EFI_IMAGE_LINENUMBER(Structure): + _pack_ = 1 + _fields_ = [ + ('Type', EFI_IMAGE_LINENUMBER_TYPE), + ('Linenumber', c_uint16), # Line number. + ] + +EFI_IMAGE_SIZEOF_LINENUMBER = 6 + + +## Archive format. +EFI_IMAGE_ARCHIVE_START_SIZE = 8 +EFI_IMAGE_ARCHIVE_START = "!\n" +EFI_IMAGE_ARCHIVE_END = "`\n" +EFI_IMAGE_ARCHIVE_PAD = "\n" +EFI_IMAGE_ARCHIVE_LINKER_MEMBER = "/ " +EFI_IMAGE_ARCHIVE_LONGNAMES_MEMBER = "// " + +class EFI_IMAGE_ARCHIVE_MEMBER_HEADER(Structure): + _pack_ = 1 + _fields_ = [ + ('Name', ARRAY(c_uint8, 16)), # File member name - `/' terminated. + ('Date', ARRAY(c_uint8, 12)), # + ('UserID', ARRAY(c_uint8, 6)), # + ('GroupID', ARRAY(c_uint8, 6)), # + ('Mode', ARRAY(c_uint8, 8)), # + ('Size', ARRAY(c_uint8, 10)), # + ('EndHeader', ARRAY(c_uint8, 2)), # + ] + +EFI_IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR = 60 + +class EFI_IMAGE_EXPORT_DIRECTORY(Structure): + _pack_ = 1 + _fields_ = [ + ('Characteristics', c_uint32), + ('TimeDateStamp', c_uint32), + ('MajorVersion', c_uint16), + ('MinorVersion', c_uint16), + ('Name', c_uint32), + ('Base', c_uint32), + ('NumberOfFunctions', c_uint32), + ('NumberOfNames', c_uint32), + ('AddressOfFunctions', c_uint32), + ('AddressOfNames', c_uint32), + ('AddressOfNameOrdinals', c_uint32), + ] + +## Based export types. +EFI_IMAGE_EXPORT_ORDINAL_BASE = 1 +EFI_IMAGE_EXPORT_ADDR_SIZE = 4 +EFI_IMAGE_EXPORT_ORDINAL_SIZE = 2 + + +class EFI_IMAGE_IMPORT_BY_NAME(Structure): + _pack_ = 1 + _fields_ = [ + ('Hint', c_uint16), + ('Name', c_uint8), + ] + + +class EFI_IMAGE_THUNK_DATA_UNION(Union): + _pack_ = 1 + _fields_ = [ + ('Function', c_uint32), + ('Ordinal', c_uint32), + ('AddressOfData', EFI_IMAGE_IMPORT_BY_NAME), + ] + + +class EFI_IMAGE_THUNK_DATA(Structure): + _pack_ = 1 + _fields_ = [ + ('u1', EFI_IMAGE_THUNK_DATA_UNION), + ] + +class EFI_IMAGE_IMPORT_DESCRIPTOR(Structure): + _pack_ = 1 + _fields_ = [ + ('Characteristics', c_uint32), + ('TimeDateStamp', c_uint32), + ('ForwarderChain', c_uint32), + ('Name', c_uint32), + ('FirstThunk', EFI_IMAGE_THUNK_DATA), + ] + +EFI_IMAGE_DEBUG_TYPE_CODEVIEW = 2 + +class EFI_IMAGE_DEBUG_DIRECTORY_ENTRY(Structure): + _pack_ = 1 + _fields_ = [ + ('Characteristics', c_uint32), + ('TimeDateStamp', c_uint32), + ('MajorVersion', c_uint16), + ('MinorVersion', c_uint16), + ('Type', c_uint32), + ('SizeOfData', c_uint32), + ('RVA', c_uint32), + ('FileOffset', c_uint32), + ] +EFI_IMAGE_DEBUG_DIRECTORY_ENTRY_STRUCTURE_SIZE = 0x1c + +CODEVIEW_SIGNATURE_NB10 = 0x3031424E # "NB10" + +class EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY(Structure): + _pack_ = 1 + _fields_ = [ + ('Signature', c_uint32), # "NB10" + ('Unknown', c_uint32), + ('Unknown2', c_uint32), + ('Unknown3', c_uint32), + ] + +CODEVIEW_SIGNATURE_RSDS = 0x53445352 # "RSDS" + +class EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY(Structure): + _pack_ = 1 + _fields_ = [ + ('Signature', c_uint32), # "NB10" + ('Unknown', c_uint32), + ('Unknown2', c_uint32), + ('Unknown3', c_uint32), + ('Unknown4', c_uint32), + ('Unknown5', c_uint32), + ] + +class EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY(Structure): + _pack_ = 1 + _fields_ = [ + ('Signature', c_uint32), # "MTOC" + ('MachOUuid', GUID), + ] + +class RUNTIME_FUNCTION(Structure): + _pack_ = 1 + _fields_ = [ + ('FunctionStartAddress', c_uint32), + ('FunctionEndAddress', c_uint32), + ('UnwindInfoAddress', c_uint32), + ] + +class UNWIND_INFO(Structure): + _pack_ = 1 + _fields_ = [ + ('Version_Flag', c_uint8), # Version:3 Flags:5 + ('SizeOfProlog', c_uint8), + ('CountOfUnwindCodes', c_uint8), + ('FrameRegister', c_uint8), # FrameRegister:4 FrameRegisterOffset:4 + ] + + def Get_Version(self): + return self.Version_Flag >> 5 + + def Get_Flag(self): + return self.Version_Flag << 3 + +class EFI_IMAGE_RESOURCE_DIRECTORY(Structure): + _pack_ = 1 + _fields_ = [ + ('Characteristics', c_uint32), + ('TimeDateStamp', c_uint32), + ('MajorVersion', c_uint16), + ('MinorVersion', c_uint16), + ('NumberOfNamedEntries', c_uint16), + ('NumberOfIdEntries', c_uint16), + ] + + +def Get_EFI_IMAGE_RESOURCE_DIRECTORY_STRING(nums: int): + class EFI_IMAGE_RESOURCE_DIRECTORY_STRING(Structure): + _pack_ = 1 + _fields_ = [ + ('Length', c_uint16), + ('String', ARRAY(c_uint8, nums)), + ] + return EFI_IMAGE_RESOURCE_DIRECTORY_STRING + +class EFI_IMAGE_RESOURCE_DATA_ENTRY(Structure): + _pack_ = 1 + _fields_ = [ + ('OffsetToData', c_uint32), + ('Size', c_uint32), + ('CodePage', c_uint32), + ('Reserved', c_uint32), + ] + +class EFI_BLK_HEADER(Structure): + _pack_ = 1 + _fields_ = [ + ('PageRVA', c_uint32), # BlkHeader PageRVA + ('BlockSize', c_uint32), # BlkHeader BlockSize + ] + +EFI_BLK_HEADER_SIZE = 0x8 + +# EFI_TE_IMAGE_HEADER. +class EFI_TE_IMAGE_HEADER(Structure): + _pack_ = 1 + _fields_ = [ + ('Signature', c_uint16), # signature for TE format = "VZ" + ('Machine', c_uint16), # from the original file header + ('NumberOfSections', c_uint8), # from the original file header + ('Subsystem', c_uint8), # from original optional header + ('StrippedSize', c_uint16), # how many bytes we removed from the header + ('AddressOfEntryPoint', c_uint32), # offset to entry point -- from original optional header + ('BaseOfCode', c_uint32), # from original image -- required for ITP debug + ('ImageBase', c_uint64), # from original file header + ('DataDirectory', ARRAY(EFI_IMAGE_DATA_DIRECTORY, 2)), # only base relocation and debug directory + ] + +EFI_TE_IMAGE_HEADER_SIGNATURE = 0x5A56 # "VZ" +EFI_TE_IMAGE_HEADER_SIZE = 0x28 + +## Data directory indexes in our TE image header +EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC = 0 +EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG = 1 + + +# Union of PE32, PE32+, and TE headers +class EFI_IMAGE_OPTIONAL_HEADER_UNION(Union): + _pack_ = 1 + _fields_ = [ + ('Pe32', EFI_IMAGE_NT_HEADERS32), + ('Pe32Plus', EFI_IMAGE_NT_HEADERS64), + ('Te', EFI_TE_IMAGE_HEADER), + ] + +class EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION(Union): + _pack_ = 1 + _fields_ = [ + ('Pe32', EFI_IMAGE_NT_HEADERS32), # these 4 fields should all be pointer + ('Pe32Plus', EFI_IMAGE_NT_HEADERS64), + ('Te', EFI_TE_IMAGE_HEADER), + ('Union', EFI_IMAGE_OPTIONAL_HEADER_UNION), + ] + + +## DLL characteristics +# 0x0001 / 0x0002 / 0x0004 / 0x0008 --- Reserved, must be zero +EFI_IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA = 0x0020 # Image can handle a high entropy 64-bit virtual address space. +EFI_IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE = 0x0040 # DLL can be relocated at load time. +EFI_IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY = 0x0080 # Code Integrity checks are enforced. +EFI_IMAGE_DLLCHARACTERISTICS_NX_COMPAT = 0x0100 # Image is NX compatible. +EFI_IMAGE_DLLCHARACTERISTICS_NO_ISOLATION = 0x0200 # Isolation aware, but do not isolate the image. +EFI_IMAGE_DLLCHARACTERISTICS_NO_SEH = 0x0400 # Does not use structured exception (SE) handling. No SE handler may be called in this image. +EFI_IMAGE_DLLCHARACTERISTICS_NO_BIND = 0x0800 # Do not bind the image. +EFI_IMAGE_DLLCHARACTERISTICS_APPCONTAINER = 0x1000 # Image must execute in an AppContainer. +EFI_IMAGE_DLLCHARACTERISTICS_WDM_DRIVER = 0x2000 # A WDM driver. +EFI_IMAGE_DLLCHARACTERISTICS_GUARD_CF = 0x4000 # Image supports Control Flow Guard. +EFI_IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000 # Terminal Server aware. + + +class EFI_SYMBOL_NAME_REPRESENTATION(Structure): + _pack_ = 1 + _fields_ = [ + ('ShortName', c_uint64), # An array of 8 bytes. This array is padded with nulls on the right if the name is less than 8 bytes long. + ('Zeroes', c_uint32), # A field that is set to all zeros if the name is longer than 8 bytes. + ('Offset', c_uint32), # An offset into the string table. + ] + + +class EFI_COFF_SYMBOL_TABLE(Structure): + _pack_ = 1 + _fields_ = [ + ('Name ', c_uint64), # The name of the symbol, represented by a union of three structures. + # An array of 8 bytes is used if the name is not more than 8 bytes long. For more information, see Symbol Name Representation. + ('Value', c_uint32), # The value that is associated with the symbol. The interpretation of this field depends on SectionNumber and StorageClass. + # A typical meaning is the relocatable address. + ('SectionNumber', c_uint16), # The signed integer that identifies the section, using a one-based index into the section table. + # Some values have special meaning, as defined in section 5.4.2, "Section Number Values." + ('Type', c_uint16), # A number that represents type. Microsoft tools set this field to 0x20 (function) or 0x0 (not a function). For more information, see Type Representation. + ('StorageClass', c_uint8), # An enumerated value that represents storage class. For more information, see Storage Class. + ('NumberOfAuxSymbols', c_uint8), # The number of auxiliary symbol table entries that follow this record. + + ] diff --git a/BaseTools/Source/Python/FirmwareStorageFormat/SectionHeader.py b/BaseTools/Source/Python/FirmwareStorageFormat/SectionHeader.py index ee6a63679d89..d7657ba524f0 100644 --- a/BaseTools/Source/Python/FirmwareStorageFormat/SectionHeader.py +++ b/BaseTools/Source/Python/FirmwareStorageFormat/SectionHeader.py @@ -11,6 +11,24 @@ EFI_COMMON_SECTION_HEADER_LEN = 4 EFI_COMMON_SECTION_HEADER2_LEN = 8 +EFI_SECTION_ALL = 0x00 + +EFI_SECTION_COMPRESSION = 0x01 +EFI_SECTION_GUID_DEFINED = 0x02 + +EFI_SECTION_PE32 = 0x10 +EFI_SECTION_PIC = 0x11 +EFI_SECTION_TE = 0x12 +EFI_SECTION_DXE_DEPEX = 0x13 +EFI_SECTION_VERSION = 0x14 +EFI_SECTION_USER_INTERFACE = 0x15 +EFI_SECTION_COMPATIBILITY16 = 0x16 +EFI_SECTION_FIRMWARE_VOLUME_IMAGE = 0x17 +EFI_SECTION_FREEFORM_SUBTYPE_GUID = 0x18 +EFI_SECTION_RAW = 0x19 +EFI_SECTION_PEI_DEPEX = 0x1B +EFI_SECTION_SMM_DEPEX = 0x1C + class EFI_COMMON_SECTION_HEADER(Structure): _pack_ = 1 _fields_ = [ From d8a171b895e3c79002fa7d991de8bf24cfa32851 Mon Sep 17 00:00:00 2001 From: Yuwei Chen Date: Thu, 9 Oct 2025 16:08:37 +0800 Subject: [PATCH 0814/1172] BaseTools: Enhance FMMT rebase feature with FFS type check 1.Add FFS file type check: Only allow rebase operation for EFI_FV_FILETYPE_SECURITY_CORE, EFI_FV_FILETYPE_PEI_CORE, EFI_FV_FILETYPE_DXE_CORE, EFI_FV_FILETYPE_PEIM, EFI_FV_FILETYPE_DRIVER, EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER,EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE types, improving safety and compliance. 2.Automatically detect and complete the PE/COFF or TE image relocation table (reloc section) to ensure integrity and compatibility of the rebase operation. 3.After rebase, automatically update FFS checksum and FV header information to ensure correct data structure. 4.Support recursive processing for nested FVs, ensuring all related FFS files' PE/TE images are properly rebased and reloc tables are completed. 5.Use table-driven architecture for relocation types, making it easier to extend to more platforms. 6.Improve error handling and logging for better robustness and maintainability. Please attention, only IA32 and X64 PE/COFF image are supported now. For other Arch, will support it after testing. Signed-off-by: Yuwei Chen --- .../Source/Python/FMMT/core/BiosTreeNode.py | 141 ++++++++++++++++-- .../Source/Python/FMMT/core/FvHandler.py | 64 +++++++- 2 files changed, 193 insertions(+), 12 deletions(-) diff --git a/BaseTools/Source/Python/FMMT/core/BiosTreeNode.py b/BaseTools/Source/Python/FMMT/core/BiosTreeNode.py index 0c05354a3ede..3870517d53a6 100644 --- a/BaseTools/Source/Python/FMMT/core/BiosTreeNode.py +++ b/BaseTools/Source/Python/FMMT/core/BiosTreeNode.py @@ -304,6 +304,112 @@ def __init__(self, buffer: bytes, offset: int, size: int = 0) -> None: if self.IfRebase: self.PeCoffParseReloc() + def HasRelocTable(self) -> bool: + """ + Check if the PE/COFF image has a valid relocation table. + Returns True if the relocation table exists and is non-empty, False otherwise. + """ + # For TE image + if self.IsTeImage: + # DataDirectory[0] is Base Relocation Table + if hasattr(self.TeHeader, 'DataDirectory') and self.TeHeader.DataDirectory[0].Size > 0: + return True + return False + # For PE image + if self.PeHeader: + if hasattr(self.PeHeader.Pe32, 'OptionalHeader'): + dir_entry = self.PeHeader.Pe32.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC] + if dir_entry.Size > 0: + return True + if hasattr(self.PeHeader, 'Pe32Plus') and hasattr(self.PeHeader.Pe32Plus, 'OptionalHeader'): + dir_entry = self.PeHeader.Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC] + if dir_entry.Size > 0: + return True + return False + + def FillPeReloc(self) -> bool: + """ + Supplement the PE/COFF relocation table if missing or incomplete. + Returns True if the table was supplemented, False otherwise. + """ + from ctypes import sizeof, c_uint16, c_uint32 + from FirmwareStorageFormat.PECOFFHeader import EFI_IMAGE_BASE_RELOCATION, EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC, EFI_IMAGE_SIZEOF_BASE_RELOCATION + + # If already has a reloc table, do nothing + if self.HasRelocTable(): + return False + + # For TE image + if self.IsTeImage and self.TeHeader: + if hasattr(self.TeHeader, 'DataDirectory') and self.TeHeader.DataDirectory[0].Size == 0: + # Check if Data is valid + if not isinstance(self.Data, (bytes, bytearray)): + logger.error('TE image Data is not bytes/bytearray') + return False + # Construct the minimal valid reloc block + reloc = EFI_IMAGE_BASE_RELOCATION() + reloc.VirtualAddress = 0 + reloc.SizeOfBlock = EFI_IMAGE_SIZEOF_BASE_RELOCATION + 2 # header+1个WORD + reloc_block = bytes(reloc) + (c_uint16(0).value).to_bytes(2, 'little') + # Boundary check: DataDirectory[0].VirtualAddress must not overflow + va = len(self.Data) + if va > 0xFFFFFFFF: + logger.error('Reloc VA overflow for TE image') + return False + self.TeHeader.DataDirectory[0].VirtualAddress = va + self.TeHeader.DataDirectory[0].Size = len(reloc_block) + self.Data += reloc_block + return True + return False + + # For PE image + if self.PeHeader: + # 32-bit PE + if hasattr(self.PeHeader.Pe32, 'OptionalHeader'): + opt = self.PeHeader.Pe32.OptionalHeader + # Check NumberOfRvaAndSizes + if hasattr(opt, 'NumberOfRvaAndSizes') and opt.NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC: + dir_entry = opt.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC] + if dir_entry.Size == 0: + # Check if Data is valid + if not isinstance(self.Data, (bytes, bytearray)): + logger.error('PE image Data is not bytes/bytearray') + return False + reloc = EFI_IMAGE_BASE_RELOCATION() + reloc.VirtualAddress = 0 + reloc.SizeOfBlock = EFI_IMAGE_SIZEOF_BASE_RELOCATION + 2 + reloc_block = bytes(reloc) + (c_uint16(0).value).to_bytes(2, 'little') + va = len(self.Data) + if va > 0xFFFFFFFF: + logger.error('Reloc VA overflow for PE32') + return False + dir_entry.VirtualAddress = va + dir_entry.Size = len(reloc_block) + self.Data += reloc_block + return True + # 64-bit PE + if hasattr(self.PeHeader, 'Pe32Plus') and hasattr(self.PeHeader.Pe32Plus, 'OptionalHeader'): + opt = self.PeHeader.Pe32Plus.OptionalHeader + if hasattr(opt, 'NumberOfRvaAndSizes') and opt.NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC: + dir_entry = opt.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC] + if dir_entry.Size == 0: + if not isinstance(self.Data, (bytes, bytearray)): + logger.error('PE+ image Data is not bytes/bytearray') + return False + reloc = EFI_IMAGE_BASE_RELOCATION() + reloc.VirtualAddress = 0 + reloc.SizeOfBlock = EFI_IMAGE_SIZEOF_BASE_RELOCATION + 2 + reloc_block = bytes(reloc) + (c_uint16(0).value).to_bytes(2, 'little') + va = len(self.Data) + if va > 0xFFFFFFFF: + logger.error('Reloc VA overflow for PE32+') + return False + dir_entry.VirtualAddress = va + dir_entry.Size = len(reloc_block) + self.Data += reloc_block + return True + return False + def PeCoffLoaderCheckImageType(self) -> None: MachineTypeList = [EFI_IMAGE_FILE_MACHINE_I386, EFI_IMAGE_FILE_MACHINE_EBC, EFI_IMAGE_FILE_MACHINE_X64, EFI_IMAGE_FILE_MACHINE_ARMT, EFI_IMAGE_FILE_MACHINE_ARM64, EFI_IMAGE_FILE_MACHINE_RISCV64] ImageTypeList = [EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION, EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER, EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER, EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER] @@ -380,7 +486,25 @@ def PeCoffParseReloc(self) -> None: self.RelocList.append((EachRType, TarROff)) CurOff += self.BlkHeader.BlockSize - def PeCoffRebase(self, DeltaSize=0, CalcuFlag=0) -> None: # if CalcuFlag is set to 0, DeltaSize is a delta address, if set to 1, DeltaSize is a absolute address + def PeCoffRebase(self, DeltaSize=0, CalcuFlag=0, base_address=None, xip_offset=0) -> None: + """ + Support absolute base address (base_address) and XIP offset (xip_offset) parameters, compatible with original DeltaSize/CalcuFlag logic. + base_address has higher priority than DeltaSize/CalcuFlag. + """ + # If base_address is explicitly specified, force absolute relocation + # XIP offset can be used for future extension (if needed) + ## Rebase function + # Architecture relocation type table driven + SUPPORTED_RELOC_TYPES = { + 3: 4, # IMAGE_REL_BASED_HIGHLOW (x86/x64 32bit) + 10: 8, # IMAGE_REL_BASED_DIR64 (x64 64bit) + # Extendable: e.g. ARM/ARM64 etc. + } + # If base_address is explicitly specified, force absolute relocation + if base_address is not None: + CalcuFlag = 1 + DeltaSize = base_address + # XIP offset can be used for future extension (if needed) if self.TeHeader: ImageBase = self.TeHeader.ImageBase CurOff = self.offset + EFI_TE_IMAGE_HEADER.ImageBase.offset @@ -426,16 +550,15 @@ def PeCoffRebase(self, DeltaSize=0, CalcuFlag=0) -> None: # if CalcuFlag is set CurValue = self.ImageAddress self.Data = self.Data[:CurOff-self.offset] + CurValue.to_bytes(ImageBaseSize, byteorder='little',signed=False) + self.Data[CurOff-self.offset+ImageBaseSize:] - ## Rebase function for (EachRType, TarROff) in self.RelocList: - if EachRType == 3: # IMAGE_REL_BASED_HIGHLOW - CurValue = Bytes2Val(self.Data[TarROff-self.offset:TarROff+4-self.offset]) + if EachRType in SUPPORTED_RELOC_TYPES: + size = SUPPORTED_RELOC_TYPES[EachRType] + CurValue = Bytes2Val(self.Data[TarROff-self.offset:TarROff+size-self.offset]) CurValue += DeltaSize - self.Data = self.Data[:TarROff-self.offset] + CurValue.to_bytes(4, byteorder='little',signed=False) + self.Data[TarROff+4-self.offset:] - elif EachRType == 10: # IMAGE_REL_BASED_DIR64 - CurValue = Bytes2Val(self.Data[TarROff-self.offset:TarROff+8-self.offset]) - CurValue += DeltaSize - self.Data = self.Data[:TarROff-self.offset] + CurValue.to_bytes(8, byteorder='little',signed=False) + self.Data[TarROff+8-self.offset:] + self.Data = self.Data[:TarROff-self.offset] + CurValue.to_bytes(size, byteorder='little',signed=False) + self.Data[TarROff+size-self.offset:] + else: + logger.error(f"ERROR: Unsupported relocation type {EachRType}! (please extend SUPPORTED_RELOC_TYPES)") + raise Exception(f"ERROR: Unsupported relocation type {EachRType}! (please extend SUPPORTED_RELOC_TYPES)") class FreeSpaceNode: def __init__(self, buffer: bytes) -> None: diff --git a/BaseTools/Source/Python/FMMT/core/FvHandler.py b/BaseTools/Source/Python/FMMT/core/FvHandler.py index 354862da0944..a1bd4685c67c 100644 --- a/BaseTools/Source/Python/FMMT/core/FvHandler.py +++ b/BaseTools/Source/Python/FMMT/core/FvHandler.py @@ -9,6 +9,7 @@ from core.GuidTools import GUIDTools from core.BiosTreeNode import * from FirmwareStorageFormat.Common import * +from FirmwareStorageFormat.FfsFileHeader import * from utils.FmmtLogger import FmmtLogger as logger EFI_FVB2_ERASE_POLARITY = 0x00000800 @@ -704,6 +705,33 @@ def ShrinkFv(self) -> bool: return self.Status def Ffs_PecoffRebase(self): + # --- FFS type filtering, only do PE/TE rebase for specific FFS types --- + ALLOWED_REBASE_TYPES = { + EFI_FV_FILETYPE_SECURITY_CORE, + EFI_FV_FILETYPE_PEI_CORE, + EFI_FV_FILETYPE_DXE_CORE, + EFI_FV_FILETYPE_PEIM, + EFI_FV_FILETYPE_DRIVER, + EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER, + EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE, + } + if self.NewFfs.Data.Header.Type not in ALLOWED_REBASE_TYPES: + return + + # Recursively process child Fv + if self.NewFfs.Data.Header.Type == EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE: + # Traverse all FFS file nodes in child Fv and recursively rebase + for child in self.NewFfs.Child: + # Only process FFS file type nodes + if hasattr(child, 'Data') and hasattr(child.Data, 'Header') and hasattr(child.Data.Header, 'Type'): + # Avoid infinite recursion, exclude non-FFS types + if child.Data.Header.Type in ALLOWED_REBASE_TYPES: + # Construct recursive FvHandler instance + sub_handler = FvHandler(child) + sub_handler.Ffs_PecoffRebase() + # After recursion, return directly, do not process PE/TE + return + new_pe_exist = False origin_pe_exist = False # Handle the current FFS being replaced - check for PE32 @@ -711,6 +739,15 @@ def Ffs_PecoffRebase(self): if NewSection.Data.Type == EFI_SECTION_PE32 or NewSection.Data.Type == EFI_SECTION_TE: if NewSection.Child[0].Data.Name == 'PeCoff': New_Pecoff = NewSection.Child[0] + # Check and complete the relocation table (reloc section) for PE/COFF or TE image + # If there is no relocation table, complete it; if present, skip + if hasattr(New_Pecoff.Data, 'FillPeReloc'): + # If HasRelocTable method exists, check first; otherwise, complete directly (idempotent) + if hasattr(New_Pecoff.Data, 'HasRelocTable'): + if not New_Pecoff.Data.HasRelocTable(): + New_Pecoff.Data.FillPeReloc() + else: + New_Pecoff.Data.FillPeReloc() new_pe_image_address = NewSection.Child[0].Data.ImageAddress if hasattr(NewSection.Child[0].Data, 'ImageAddress') else 0 new_pe_exist = True break @@ -754,8 +791,23 @@ def Ffs_PecoffRebase(self): # Rebase subsequent FFS files in the SAME FV only self._rebase_subsequent_ffs_in_current_fv() + # Checksum and update + # 1. FFS checksum + if hasattr(self.NewFfs, 'Data') and hasattr(self.NewFfs.Data, 'ModCheckSum'): + self.NewFfs.Data.ModCheckSum() + # 2. FV alignment/capacity refresh (if parent FV node exists) + if hasattr(self.NewFfs, 'Parent') and self.NewFfs.Parent and hasattr(self.NewFfs.Parent, 'Data'): + if hasattr(self.NewFfs.Parent.Data, 'ModFvExt'): + self.NewFfs.Parent.Data.ModFvExt() + if hasattr(self.NewFfs.Parent.Data, 'ModFvSize'): + self.NewFfs.Parent.Data.ModFvSize() + if hasattr(self.NewFfs.Parent.Data, 'ModExtHeaderData'): + self.NewFfs.Parent.Data.ModExtHeaderData() + if hasattr(self.NewFfs.Parent.Data, 'ModCheckSum'): + self.NewFfs.Parent.Data.ModCheckSum() + def _rebase_subsequent_ffs_in_current_fv(self): - """Rebase PE/COFF images in subsequent FFS files within the current FV only""" + # Rebase PE/COFF images in subsequent FFS files within the current FV only if not hasattr(self, 'TargetFfs') or self.TargetFfs is None: return @@ -787,9 +839,12 @@ def _rebase_subsequent_ffs_in_current_fv(self): continue # Look for PE32 sections in this FFS and rebase them self._rebase_ffs_pe_sections(subsequent_ffs, size_delta) + # Checksum update + if hasattr(subsequent_ffs, 'Data') and hasattr(subsequent_ffs.Data, 'ModCheckSum'): + subsequent_ffs.Data.ModCheckSum() def _rebase_ffs_pe_sections(self, ffs_node, address_delta): - """Rebase PE/COFF and TE images in a specific FFS node""" + # Rebase PE/COFF and TE images in a specific FFS node found_pe = False for section in ffs_node.Child: # Check for PE32 sections @@ -800,6 +855,9 @@ def _rebase_ffs_pe_sections(self, ffs_node, address_delta): child.Data.PeCoffRebase(address_delta) section.Data.Data = child.Data.Data found_pe = True + # Checksum update + if hasattr(ffs_node, 'Data') and hasattr(ffs_node.Data, 'ModCheckSum'): + ffs_node.Data.ModCheckSum() break # Handle nested sections recursively @@ -813,7 +871,7 @@ def _rebase_ffs_pe_sections(self, ffs_node, address_delta): return found_pe def _rebase_nested_sections(self, section_node, address_delta): - """Recursively rebase PE/COFF and TE images in nested sections within current FV""" + # Recursively rebase PE/COFF and TE images in nested sections within current FV found_pe = False for child in section_node.Child: # Check for PE32 sections From 4f323d920f564e1030219becf89ae6d03b7c1d53 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Mon, 12 May 2025 09:48:10 -0700 Subject: [PATCH 0815/1172] MdeModulePkg: Acpi cumulative codeql issues. Running Codeql on MdeModulePkg/Universal/Acpi drivers results in codeql errors stemming from missing null tests. Signed-off-by: Aaron Pop Co-authored-by: Michael Kubacki Co-authored-by: Taylor Beebe Co-authored-by: pohanch <125842322+pohanch@users.noreply.github.com> Co-authored-by: kenlautner <85201046+kenlautner@users.noreply.github.com> Co-authored-by: Oliver Smith-Denny Co-authored-by: Sean Brogan Co-authored-by: Aaron --- .../Universal/Acpi/AcpiTableDxe/AcpiSdt.c | 27 ++++++++++++++++--- .../Acpi/AcpiTableDxe/AcpiTableProtocol.c | 8 ++++-- .../Acpi/AcpiTableDxe/AmlNamespace.c | 17 +++++++++--- .../Universal/Acpi/AcpiTableDxe/AmlString.c | 7 +++-- 4 files changed, 49 insertions(+), 10 deletions(-) diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.c b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.c index bb258c9710d9..cc9e4cbe4434 100644 --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.c +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.c @@ -334,7 +334,11 @@ SdtRegisterNotify ( // Create a new list entry // CurrentNotifyList = AllocatePool (sizeof (EFI_ACPI_NOTIFY_LIST)); - ASSERT (CurrentNotifyList != NULL); + if (CurrentNotifyList == NULL) { + ASSERT (CurrentNotifyList != NULL); + DEBUG ((DEBUG_ERROR, "%a Failed to allocate pool\n", __func__)); + return; + } // // Initialize the table contents @@ -483,7 +487,11 @@ SdtOpenSdtTable ( } AmlHandle = AllocatePool (sizeof (*AmlHandle)); - ASSERT (AmlHandle != NULL); + if (AmlHandle == NULL) { + ASSERT (AmlHandle != NULL); + return EFI_NOT_FOUND; + } + AmlHandle->Signature = EFI_AML_ROOT_HANDLE_SIGNATURE; AmlHandle->Buffer = (VOID *)((UINTN)Table->Table + sizeof (EFI_ACPI_SDT_HEADER)); AmlHandle->Size = Table->Table->Length - sizeof (EFI_ACPI_SDT_HEADER); @@ -531,6 +539,7 @@ OpenSdt ( @retval EFI_SUCCESS Success @retval EFI_INVALID_PARAMETER Buffer is NULL or Handle is NULL or Buffer points to an invalid opcode. + @retval EFI_OUT_OF_RESOURCES Could not allocate a required resource. **/ EFI_STATUS @@ -559,7 +568,10 @@ SdtOpenEx ( // Good, find it // AmlHandle = AllocatePool (sizeof (*AmlHandle)); - ASSERT (AmlHandle != NULL); + if (AmlHandle == NULL) { + ASSERT (AmlHandle != NULL); + return EFI_OUT_OF_RESOURCES; + } AmlHandle->Signature = EFI_AML_HANDLE_SIGNATURE; AmlHandle->Buffer = Buffer; @@ -928,6 +940,10 @@ SdtDuplicateHandle ( DstAmlHandle = AllocatePool (sizeof (*DstAmlHandle)); ASSERT (DstAmlHandle != NULL); + if (DstAmlHandle == NULL) { + return NULL; + } + CopyMem (DstAmlHandle, (VOID *)AmlHandle, sizeof (*DstAmlHandle)); return DstAmlHandle; @@ -943,6 +959,7 @@ SdtDuplicateHandle ( @retval EFI_SUCCESS Success @retval EFI_INVALID_PARAMETER HandleIn is NULL or does not refer to a valid ACPI object. + @retval EFI_OUT_OF_RESOURCES Could not allocate a required resource. **/ EFI_STATUS SdtFindPathFromRoot ( @@ -967,6 +984,10 @@ SdtFindPathFromRoot ( // Duplicate RootHandle // *HandleOut = (EFI_ACPI_HANDLE)SdtDuplicateHandle (AmlHandle); + if (*HandleOut == NULL) { + return EFI_OUT_OF_RESOURCES; + } + return EFI_SUCCESS; } diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c index 5ea4922651dd..f7e0fbf87bff 100644 --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c @@ -537,7 +537,11 @@ AddTableToList ( // Create a new list entry // CurrentTableList = AllocatePool (sizeof (EFI_ACPI_TABLE_LIST)); - ASSERT (CurrentTableList); + + if (CurrentTableList == NULL) { + ASSERT (CurrentTableList); + return EFI_OUT_OF_RESOURCES; + } // // Determine table type and size @@ -1273,7 +1277,7 @@ RemoveTableFromRsdt ( // // Check if we have found the corresponding entry in both RSDT and XSDT // - if (((Rsdt == NULL) || (*CurrentRsdtEntry == (UINT32)(UINTN)Table->Table)) && + if (((Rsdt == NULL) || ((CurrentRsdtEntry != NULL) && (*CurrentRsdtEntry == (UINT32)(UINTN)Table->Table))) && ((Xsdt == NULL) || (CurrentTablePointer64 == (UINT64)(UINTN)Table->Table)) ) { diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AmlNamespace.c b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AmlNamespace.c index 61c7273048ad..caa309109419 100644 --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AmlNamespace.c +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AmlNamespace.c @@ -32,7 +32,7 @@ AmlConstructNodeList ( @param[in] Parent AML parent node list. @param[in] AmlByteEncoding AML Byte Encoding. - @return AML Node. + @return AML Node or NULL if insufficient resources to allocate a buffer **/ EFI_AML_NODE_LIST * AmlCreateNode ( @@ -44,7 +44,10 @@ AmlCreateNode ( EFI_AML_NODE_LIST *AmlNodeList; AmlNodeList = AllocatePool (sizeof (*AmlNodeList)); - ASSERT (AmlNodeList != NULL); + if (AmlNodeList == NULL) { + ASSERT (AmlNodeList != NULL); + return NULL; + } AmlNodeList->Signature = EFI_AML_NODE_LIST_SIGNATURE; CopyMem (AmlNodeList->Name, NameSeg, AML_NAME_SEG_SIZE); @@ -65,7 +68,7 @@ AmlCreateNode ( @param[in] AmlParentNodeList AML parent node list. @param[in] Create TRUE means to create node if not found. - @return AmlChildNode whoes name is same as NameSeg. + @return AmlChildNode whoes name is same as NameSeg or NULL if insufficient resources to allocate a buffer. **/ EFI_AML_NODE_LIST * AmlFindNodeInThis ( @@ -108,6 +111,10 @@ AmlFindNodeInThis ( // Create new node with NULL buffer - it means namespace not be returned. // AmlNodeList = AmlCreateNode (NameSeg, AmlParentNodeList, NULL); + if (AmlNodeList == NULL) { + return NULL; + } + InsertTailList (&AmlParentNodeList->Children, &AmlNodeList->Link); return AmlNodeList; @@ -512,6 +519,7 @@ AmlDumpNodeInfo ( @retval EFI_SUCCESS Success @retval EFI_INVALID_PARAMETER HandleIn does not refer to a valid ACPI object. + @retval EFI_OUT_OF_RESOURCES Could not allocate a required resource. **/ EFI_STATUS AmlFindPath ( @@ -538,6 +546,9 @@ AmlFindPath ( RootNameSeg[0] = AML_ROOT_CHAR; RootNameSeg[1] = 0; AmlRootNodeList = AmlCreateNode (RootNameSeg, NULL, AmlHandle->AmlByteEncoding); + if (AmlRootNodeList == NULL) { + return EFI_OUT_OF_RESOURCES; + } Status = AmlConstructNodeList ( AmlHandle, diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AmlString.c b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AmlString.c index 9f6777057847..2519c935bffe 100644 --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AmlString.c +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AmlString.c @@ -379,7 +379,7 @@ AmlUpperCaseCopyMem ( @param[in] AslPath ASL name. - @return AmlName + @return AmlName or NULL if insufficient resources to allocate a buffer **/ UINT8 * AmlNameFromAslName ( @@ -401,7 +401,10 @@ AmlNameFromAslName ( } AmlPath = AllocatePool (TotalLength); - ASSERT (AmlPath != NULL); + if (AmlPath == NULL) { + ASSERT (AmlPath != NULL); + return NULL; + } AmlBuffer = AmlPath; Buffer = AslPath; From a3fef3939952ccf387f94b5fb3f1a05f3a015463 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Fri, 9 May 2025 16:44:03 -0700 Subject: [PATCH 0816/1172] MdeModulePkg: Fix comparison with wider widths. https://codeql.github.com/codeql-query-help/cpp/cpp-comparison-with-wider-type If the narrow type (smaller range) is compared against a wide type (larger range), the narrow value may overflow before reaching the wide value. This can cause unexpected behavior, such as: Infinite loops (loop condition never becomes false). Incorrect logic (comparison results are misleading). Why is this casting instead of just changing the type? Its because the compiler for IA32 will optimize by inserting a 64bit multiply to dereference into the array. This will be turned into an unresoled _allmul that is trying to call into the msvc runtime library, which doesn't exist. Signed-off-by: Aaron Pop Co-authored-by: Michael Kubacki Co-authored-by: Taylor Beebe Co-authored-by: pohanch <125842322+pohanch@users.noreply.github.com> Co-authored-by: kenlautner <85201046+kenlautner@users.noreply.github.com> Co-authored-by: Oliver Smith-Denny Co-authored-by: Sean Brogan Co-authored-by: Aaron --- MdeModulePkg/Universal/PCD/Dxe/Pcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MdeModulePkg/Universal/PCD/Dxe/Pcd.c b/MdeModulePkg/Universal/PCD/Dxe/Pcd.c index 8539e3380f5e..68cc13717287 100644 --- a/MdeModulePkg/Universal/PCD/Dxe/Pcd.c +++ b/MdeModulePkg/Universal/PCD/Dxe/Pcd.c @@ -310,7 +310,7 @@ DxePcdSetSku ( } SkuIdTable = (SKU_ID *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->SkuIdTableOffset); - for (Index = 0; Index < SkuIdTable[0]; Index++) { + for (Index = 0; Index < (UINTN)SkuIdTable[0]; Index++) { if (SkuId == SkuIdTable[Index + 1]) { DEBUG ((DEBUG_INFO, "PcdDxe - SkuId is found in SkuId table.\n")); Status = UpdatePcdDatabase (SkuId, TRUE); From 242156cfb7353aba93e299fd7fdca6a1f8d8bcce Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Fri, 9 May 2025 16:44:03 -0700 Subject: [PATCH 0817/1172] MdeModulePkg: Fix missing NULL tests. https://github.com/github/codeql/blob/codeql-cli-2.7.3/cpp/ql/src/Critical/MissingNullTest.qhelp For items which allocate memory, or get a pointer from another structure, it is important to validate that the pointers are not null before they are dereferenced. Signed-off-by: Aaron Pop --- MdeModulePkg/Universal/PCD/Dxe/Pcd.c | 13 ++++++++++- MdeModulePkg/Universal/PCD/Dxe/Service.c | 28 +++++++++++++++++++----- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/MdeModulePkg/Universal/PCD/Dxe/Pcd.c b/MdeModulePkg/Universal/PCD/Dxe/Pcd.c index 68cc13717287..b11ebd9f474d 100644 --- a/MdeModulePkg/Universal/PCD/Dxe/Pcd.c +++ b/MdeModulePkg/Universal/PCD/Dxe/Pcd.c @@ -1245,7 +1245,10 @@ GetDistinctTokenSpace ( BOOLEAN Match; DistinctTokenSpace = AllocateZeroPool (*ExMapTableSize * sizeof (EFI_GUID *)); - ASSERT (DistinctTokenSpace != NULL); + if (DistinctTokenSpace == NULL) { + ASSERT (DistinctTokenSpace != NULL); + return NULL; + } TsIdx = 0; OldGuidIndex = ExMapTable[0].ExGuidIndex; @@ -1329,6 +1332,11 @@ DxePcdGetNextTokenSpace ( (DYNAMICEX_MAPPING *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->ExMapTableOffset), (EFI_GUID *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->GuidTableOffset) ); + + if (PeiTokenSpaceTable == NULL) { + return EFI_NOT_FOUND; + } + CopyMem (TmpTokenSpaceBuffer, PeiTokenSpaceTable, sizeof (EFI_GUID *) * PeiTokenSpaceTableSize); TmpTokenSpaceBufferCount = PeiTokenSpaceTableSize; FreePool (PeiTokenSpaceTable); @@ -1341,6 +1349,9 @@ DxePcdGetNextTokenSpace ( (DYNAMICEX_MAPPING *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->ExMapTableOffset), (EFI_GUID *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->GuidTableOffset) ); + if (DxeTokenSpaceTable == NULL) { + return EFI_NOT_FOUND; + } // // Make sure EFI_GUID in DxeTokenSpaceTable does not exist in PeiTokenSpaceTable diff --git a/MdeModulePkg/Universal/PCD/Dxe/Service.c b/MdeModulePkg/Universal/PCD/Dxe/Service.c index 1ae06a639c43..d979ede62c66 100644 --- a/MdeModulePkg/Universal/PCD/Dxe/Service.c +++ b/MdeModulePkg/Universal/PCD/Dxe/Service.c @@ -170,7 +170,11 @@ GetPcdName ( // NameSize = AsciiStrSize (TokenSpaceName) + AsciiStrSize (PcdName); Name = AllocateZeroPool (NameSize); - ASSERT (Name != NULL); + if (Name == NULL) { + ASSERT (Name != NULL); + return NULL; + } + // // Catenate TokenSpaceCName and PcdCName with a '.' to form the full PCD name. // @@ -562,7 +566,10 @@ DxeRegisterCallBackWorker ( } FnTableEntry = AllocatePool (sizeof (CALLBACK_FN_ENTRY)); - ASSERT (FnTableEntry != NULL); + if (FnTableEntry == NULL) { + ASSERT (FnTableEntry != NULL); + return EFI_OUT_OF_RESOURCES; + } FnTableEntry->CallbackFn = CallBackFunction; InsertTailList (ListHead, &FnTableEntry->Node); @@ -993,8 +1000,10 @@ GetHiiVariable ( // if (Status == EFI_BUFFER_TOO_SMALL) { Buffer = (UINT8 *)AllocatePool (Size); - - ASSERT (Buffer != NULL); + if (Buffer == NULL) { + ASSERT (Buffer != NULL); + return EFI_OUT_OF_RESOURCES; + } Status = gRT->GetVariable ( VariableName, @@ -1500,7 +1509,10 @@ SetHiiVariable ( } Buffer = AllocatePool (SetSize); - ASSERT (Buffer != NULL); + if (Buffer == NULL) { + ASSERT (Buffer != NULL); + return EFI_OUT_OF_RESOURCES; + } Status = gRT->GetVariable ( VariableName, @@ -1538,7 +1550,11 @@ SetHiiVariable ( // GetVariableSizeAndDataFromHiiPcd (VariableGuid, VariableName, &Size, NULL); Buffer = AllocateZeroPool (Size); - ASSERT (Buffer != NULL); + if (Buffer == NULL) { + ASSERT (Buffer != NULL); + return EFI_OUT_OF_RESOURCES; + } + GetVariableSizeAndDataFromHiiPcd (VariableGuid, VariableName, &Size, Buffer); // From c33aa63b7dcf7f7377f92becef1a792fe2abecd2 Mon Sep 17 00:00:00 2001 From: Leif Lindholm Date: Wed, 17 Sep 2025 12:21:36 +0100 Subject: [PATCH 0818/1172] BaseTools/tools_def.template: add NOOPT CC_FLAGS for LOONGARCH64 NOOPT_GCC5_LOONGARCH64_CC_FLAGS and NOOPT_GCC_LOONGARCH64_CC_FLAGS were missing, causing build failures with these toolchains targets to fail. Add them. Signed-off-by: Leif Lindholm --- BaseTools/Conf/tools_def.template | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index 90a389bdff07..32085ad00af7 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -1453,6 +1453,7 @@ RELEASE_GCC5_AARCH64_DLINK_XIPFLAGS = -z common-page-size=0x20 *_GCC5_LOONGARCH64_PP_FLAGS = DEF(GCC5_LOONGARCH64_PP_FLAGS) DEBUG_GCC5_LOONGARCH64_CC_FLAGS = DEF(GCC5_LOONGARCH64_CC_FLAGS) +NOOPT_GCC5_LOONGARCH64_CC_FLAGS = DEF(GCC5_LOONGARCH64_CC_FLAGS) -O0 RELEASE_GCC5_LOONGARCH64_CC_FLAGS = DEF(GCC5_LOONGARCH64_CC_FLAGS) -Wno-unused-but-set-variable -Wno-unused-variable #################################################################################### @@ -1636,6 +1637,7 @@ RELEASE_GCC_AARCH64_DLINK_XIPFLAGS = -z common-page-size=0x20 *_GCC_LOONGARCH64_PP_FLAGS = DEF(GCC5_LOONGARCH64_PP_FLAGS) DEBUG_GCC_LOONGARCH64_CC_FLAGS = DEF(GCC5_LOONGARCH64_CC_FLAGS) +NOOPT_GCC_LOONGARCH64_CC_FLAGS = DEF(GCC5_LOONGARCH64_CC_FLAGS) -O0 RELEASE_GCC_LOONGARCH64_CC_FLAGS = DEF(GCC5_LOONGARCH64_CC_FLAGS) -Wno-unused-but-set-variable -Wno-unused-variable #################################################################################### From c4eaff95a2771e24aaf54bac0e79ffa864aba912 Mon Sep 17 00:00:00 2001 From: Leif Lindholm Date: Wed, 17 Sep 2025 12:24:19 +0100 Subject: [PATCH 0819/1172] EmbeddedPkg: Add LOONGARCH64 and RISCV64 as supported architectures Both LOONGARCH64 and RISCV64 platforms make use of modules in EmbeddedPkg, for example in OvmfPkg. So add them as supported architectures for the package to simplify build tests. Signed-off-by: Leif Lindholm --- EmbeddedPkg/EmbeddedPkg.dsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EmbeddedPkg/EmbeddedPkg.dsc b/EmbeddedPkg/EmbeddedPkg.dsc index d9ae13ef4ac2..688464b86332 100644 --- a/EmbeddedPkg/EmbeddedPkg.dsc +++ b/EmbeddedPkg/EmbeddedPkg.dsc @@ -21,7 +21,7 @@ PLATFORM_VERSION = 0.1 DSC_SPECIFICATION = 0x00010005 OUTPUT_DIRECTORY = Build/Embedded - SUPPORTED_ARCHITECTURES = IA32|X64|AARCH64 + SUPPORTED_ARCHITECTURES = IA32|X64|AARCH64|RISCV64|LOONGARCH64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT From 9ccf8751a74f26142e584c7b7c7572a182b67997 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 3 Nov 2025 09:56:52 +0100 Subject: [PATCH 0820/1172] UefiCpuPkg/CpuExceptionHandlerLib: fix push instructions Nasm 3.0 complains about 'dword' being invalid. The comment talks about a '8-byte value' so 'qword' should be correct here. With this change the extra comment explaining that the instruction actually pushes an 8-byte value despite the 'dword' keyword is not needed any more. Drop it. Fixes: https://github.com/tianocore/edk2/issues/11635 Signed-off-by: Gerd Hoffmann --- .../CpuExceptionHandlerLib/X64/ExceptionHandlerAsm.nasm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ExceptionHandlerAsm.nasm b/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ExceptionHandlerAsm.nasm index 3d64ac908010..671ed98f8525 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ExceptionHandlerAsm.nasm +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ExceptionHandlerAsm.nasm @@ -57,7 +57,7 @@ ALIGN 8 AsmIdtVectorBegin: %assign Vector 0 %rep 256 - push strict dword %[Vector] ; This instruction pushes sign-extended 8-byte value on stack + push strict qword %[Vector] push rax %ifdef NO_ABSOLUTE_RELOCS_IN_TEXT mov rax, strict qword 0 ; mov rax, ASM_PFX(CommonInterruptEntry) @@ -70,7 +70,7 @@ AsmIdtVectorBegin: AsmIdtVectorEnd: HookAfterStubHeaderBegin: - push strict dword 0 ; 0 will be fixed + push strict qword 0 ; 0 will be fixed VectorNum: push rax %ifdef NO_ABSOLUTE_RELOCS_IN_TEXT From 9afb4b22d2b2ff961e4bc56a7b1a85e131a7737a Mon Sep 17 00:00:00 2001 From: Sathya Ravichandran Date: Fri, 29 Aug 2025 13:15:06 +0530 Subject: [PATCH 0821/1172] MdeModulePkg/Capsule: Replace VariableLock with VariablePolicy Since VariableLock compromises security in the SMM environment, it is deprecated. Used VariablePolicy instead for stronger and more flexible UEFI variable protection. Ref: [acd66e4] Cc: Sachin Ganesh Signed-off-by: Sathya Ravichandran --- .../CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf | 3 +- .../X64/SaveLongModeContext.c | 28 +++++++++++++------ 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf index 530f08155aed..bc32fc38ff8e 100644 --- a/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf +++ b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf @@ -64,6 +64,7 @@ PrintLib BaseMemoryLib CacheMaintenanceLib + VariablePolicyHelperLib [LibraryClasses.X64] UefiLib @@ -81,7 +82,7 @@ [Protocols.X64] ## UNDEFINED ## NOTIFY ## SOMETIMES_CONSUMES - gEdkiiVariableLockProtocolGuid + gEdkiiVariablePolicyProtocolGuid [FeaturePcd] gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset ## CONSUMES diff --git a/MdeModulePkg/Universal/CapsuleRuntimeDxe/X64/SaveLongModeContext.c b/MdeModulePkg/Universal/CapsuleRuntimeDxe/X64/SaveLongModeContext.c index dab297dd0a6c..17fa7bafebf3 100644 --- a/MdeModulePkg/Universal/CapsuleRuntimeDxe/X64/SaveLongModeContext.c +++ b/MdeModulePkg/Universal/CapsuleRuntimeDxe/X64/SaveLongModeContext.c @@ -11,7 +11,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include -#include +#include #include #include @@ -68,7 +68,7 @@ AllocateReservedMemoryBelow4G ( } /** - Register callback function upon VariableLockProtocol + Register callback function upon VariablePolicyProtocol to lock EFI_CAPSULE_LONG_MODE_BUFFER_NAME variable to avoid malicious code to update it. @param[in] Event Event whose notification function is being invoked. @@ -81,15 +81,25 @@ VariableLockCapsuleLongModeBufferVariable ( IN VOID *Context ) { - EFI_STATUS Status; - EDKII_VARIABLE_LOCK_PROTOCOL *VariableLock; + EFI_STATUS Status; + IN EDKII_VARIABLE_POLICY_PROTOCOL *VariablePolicy; // - // Mark EFI_CAPSULE_LONG_MODE_BUFFER_NAME variable to read-only if the Variable Lock protocol exists + // Mark EFI_CAPSULE_LONG_MODE_BUFFER_NAME variable to read-only if the Variable Policy protocol exists // - Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **)&VariableLock); + Status = gBS->LocateProtocol (&gEdkiiVariablePolicyProtocolGuid, NULL, (VOID **)&VariablePolicy); if (!EFI_ERROR (Status)) { - Status = VariableLock->RequestToLock (VariableLock, EFI_CAPSULE_LONG_MODE_BUFFER_NAME, &gEfiCapsuleVendorGuid); + Status = RegisterBasicVariablePolicy ( + VariablePolicy, + &gEfiCapsuleVendorGuid, + EFI_CAPSULE_LONG_MODE_BUFFER_NAME, + VARIABLE_POLICY_NO_MIN_SIZE, + VARIABLE_POLICY_NO_MAX_SIZE, + VARIABLE_POLICY_NO_MUST_ATTR, + VARIABLE_POLICY_NO_CANT_ATTR, + VARIABLE_POLICY_TYPE_LOCK_NOW + ); + DEBUG ((DEBUG_INFO, "Status of RegisterBasicVariablePolicy for (%s) - %r\n", EFI_CAPSULE_LONG_MODE_BUFFER_NAME, Status)); ASSERT_EFI_ERROR (Status); } } @@ -177,11 +187,11 @@ PrepareContextForCapsulePei ( ); if (!EFI_ERROR (Status)) { // - // Register callback function upon VariableLockProtocol + // Register callback function upon VariablePolicyProtocol // to lock EFI_CAPSULE_LONG_MODE_BUFFER_NAME variable to avoid malicious code to update it. // EfiCreateProtocolNotifyEvent ( - &gEdkiiVariableLockProtocolGuid, + &gEdkiiVariablePolicyProtocolGuid, TPL_CALLBACK, VariableLockCapsuleLongModeBufferVariable, NULL, From 7ac93361112e3d6a7cd8c2a07e80f6dfa5842773 Mon Sep 17 00:00:00 2001 From: Sathya Ravichandran Date: Fri, 29 Aug 2025 15:31:40 +0530 Subject: [PATCH 0822/1172] MdeModulePkg/EsrtDxe: Replace VariableLock with VariablePolicy Since VariableLock compromises security in the SMM environment, it is deprecated. Used VariablePolicy instead for stronger and more flexible UEFI variable protection. Ref: [acd66e4] Cc: Sachin Ganesh Signed-off-by: Sathya Ravichandran --- MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c | 32 ++++++++++++++++++---- MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf | 3 +- MdeModulePkg/Universal/EsrtDxe/EsrtImpl.h | 2 +- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c b/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c index 28eb4f210ea6..be3328eb4dba 100644 --- a/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c +++ b/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.c @@ -479,18 +479,38 @@ EsrtDxeLockEsrtRepository ( VOID ) { - EFI_STATUS Status; - EDKII_VARIABLE_LOCK_PROTOCOL *VariableLock; + EFI_STATUS Status; + IN EDKII_VARIABLE_POLICY_PROTOCOL *VariablePolicy; // - // Mark ACPI_GLOBAL_VARIABLE variable to read-only if the Variable Lock protocol exists + // Mark ACPI_GLOBAL_VARIABLE variable to read-only if the Variable Policy protocol exists // - Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **)&VariableLock); + Status = gBS->LocateProtocol (&gEdkiiVariablePolicyProtocolGuid, NULL, (VOID **)&VariablePolicy); if (!EFI_ERROR (Status)) { - Status = VariableLock->RequestToLock (VariableLock, EFI_ESRT_FMP_VARIABLE_NAME, &gEfiCallerIdGuid); + Status = RegisterBasicVariablePolicy ( + VariablePolicy, + &gEfiCallerIdGuid, + EFI_ESRT_FMP_VARIABLE_NAME, + VARIABLE_POLICY_NO_MIN_SIZE, + VARIABLE_POLICY_NO_MAX_SIZE, + VARIABLE_POLICY_NO_MUST_ATTR, + VARIABLE_POLICY_NO_CANT_ATTR, + VARIABLE_POLICY_TYPE_LOCK_NOW + ); + DEBUG ((DEBUG_INFO, "EsrtDxe Lock EsrtFmp Variable Status 0x%x", Status)); - Status = VariableLock->RequestToLock (VariableLock, EFI_ESRT_NONFMP_VARIABLE_NAME, &gEfiCallerIdGuid); + Status = RegisterBasicVariablePolicy ( + VariablePolicy, + &gEfiCallerIdGuid, + EFI_ESRT_NONFMP_VARIABLE_NAME, + VARIABLE_POLICY_NO_MIN_SIZE, + VARIABLE_POLICY_NO_MAX_SIZE, + VARIABLE_POLICY_NO_MUST_ATTR, + VARIABLE_POLICY_NO_CANT_ATTR, + VARIABLE_POLICY_TYPE_LOCK_NOW + ); + DEBUG ((DEBUG_INFO, "EsrtDxe Lock EsrtNonFmp Variable Status 0x%x", Status)); } diff --git a/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf b/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf index 6b9eec95f1d5..e1c39eae6f0d 100644 --- a/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf +++ b/MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf @@ -43,6 +43,7 @@ DxeServicesTableLib UefiBootServicesTableLib UefiRuntimeServicesTableLib + VariablePolicyHelperLib [Guids] gEfiSystemResourceTableGuid ## PRODUCES ## SystemTable @@ -51,7 +52,7 @@ [Protocols] gEfiFirmwareManagementProtocolGuid ## SOMETIMES_CONSUMES gEsrtManagementProtocolGuid ## PRODUCES - gEdkiiVariableLockProtocolGuid ## SOMETIMES_CONSUMES + gEdkiiVariablePolicyProtocolGuid ## SOMETIMES_CONSUMES [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdMaxFmpEsrtCacheNum ## CONSUMES diff --git a/MdeModulePkg/Universal/EsrtDxe/EsrtImpl.h b/MdeModulePkg/Universal/EsrtDxe/EsrtImpl.h index d86231723bc3..0fef8fa7cf6e 100644 --- a/MdeModulePkg/Universal/EsrtDxe/EsrtImpl.h +++ b/MdeModulePkg/Universal/EsrtDxe/EsrtImpl.h @@ -25,7 +25,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include -#include +#include // // Name of Variable for Non-FMP ESRT Repository From 88d3a78171b465a5fd9d022f92697d77827885b2 Mon Sep 17 00:00:00 2001 From: Sathya Ravichandran Date: Fri, 29 Aug 2025 16:22:51 +0530 Subject: [PATCH 0823/1172] MdeModulePkg/PCD: Replace VariableLock with VariablePolicy Since VariableLock compromises security in the SMM environment, it is deprecated. Used VariablePolicy instead for stronger and more flexible UEFI variable protection. Ref: [acd66e4] Cc: Sachin Ganesh Signed-off-by: Sathya Ravichandran --- MdeModulePkg/Universal/PCD/Dxe/Pcd.c | 2 +- MdeModulePkg/Universal/PCD/Dxe/Pcd.inf | 3 ++- MdeModulePkg/Universal/PCD/Dxe/Service.c | 30 ++++++++++++++++-------- MdeModulePkg/Universal/PCD/Dxe/Service.h | 2 +- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/MdeModulePkg/Universal/PCD/Dxe/Pcd.c b/MdeModulePkg/Universal/PCD/Dxe/Pcd.c index b11ebd9f474d..0e37081b1dbb 100644 --- a/MdeModulePkg/Universal/PCD/Dxe/Pcd.c +++ b/MdeModulePkg/Universal/PCD/Dxe/Pcd.c @@ -167,7 +167,7 @@ PcdDxeInit ( // to lock the variables referenced by DynamicHii PCDs with RO property set in *.dsc. // EfiCreateProtocolNotifyEvent ( - &gEdkiiVariableLockProtocolGuid, + &gEdkiiVariablePolicyProtocolGuid, TPL_CALLBACK, VariableLockCallBack, NULL, diff --git a/MdeModulePkg/Universal/PCD/Dxe/Pcd.inf b/MdeModulePkg/Universal/PCD/Dxe/Pcd.inf index eb9f757f14ec..ea438cb2de84 100644 --- a/MdeModulePkg/Universal/PCD/Dxe/Pcd.inf +++ b/MdeModulePkg/Universal/PCD/Dxe/Pcd.inf @@ -322,6 +322,7 @@ BaseLib PcdLib DxeServicesLib + VariablePolicyHelperLib [Guids] gPcdDataBaseHobGuid ## SOMETIMES_CONSUMES ## HOB @@ -335,7 +336,7 @@ gEfiGetPcdInfoProtocolGuid ## SOMETIMES_PRODUCES ## NOTIFY ## SOMETIMES_CONSUMES - gEdkiiVariableLockProtocolGuid + gEdkiiVariablePolicyProtocolGuid [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress ## SOMETIMES_CONSUMES diff --git a/MdeModulePkg/Universal/PCD/Dxe/Service.c b/MdeModulePkg/Universal/PCD/Dxe/Service.c index d979ede62c66..761f4229121f 100644 --- a/MdeModulePkg/Universal/PCD/Dxe/Service.c +++ b/MdeModulePkg/Universal/PCD/Dxe/Service.c @@ -1855,13 +1855,13 @@ SetPtrTypeSize ( @param[in] IsPeiDb If TRUE, the pcd entry is initialized in PEI phase, If FALSE, the pcd entry is initialized in DXE phase. - @param[in] VariableLock Pointer to VariableLockProtocol. + @param[in] VariableLock Pointer to VariablePolicyProtocol. **/ VOID VariableLockDynamicHiiPcd ( - IN BOOLEAN IsPeiDb, - IN EDKII_VARIABLE_LOCK_PROTOCOL *VariableLock + IN BOOLEAN IsPeiDb, + IN EDKII_VARIABLE_POLICY_PROTOCOL *VariablePolicy ) { EFI_STATUS Status; @@ -1906,7 +1906,17 @@ VariableLockDynamicHiiPcd ( GuidTable = (EFI_GUID *)((UINT8 *)Database + Database->GuidTableOffset); Guid = GuidTable + VariableHead->GuidTableIndex; Name = (UINT16 *)(StringTable + VariableHead->StringIndex); - Status = VariableLock->RequestToLock (VariableLock, Name, Guid); + Status = RegisterBasicVariablePolicy ( + VariablePolicy, + Guid, + Name, + VARIABLE_POLICY_NO_MIN_SIZE, + VARIABLE_POLICY_NO_MAX_SIZE, + VARIABLE_POLICY_NO_MUST_ATTR, + VARIABLE_POLICY_NO_CANT_ATTR, + VARIABLE_POLICY_TYPE_LOCK_NOW + ); + ASSERT_EFI_ERROR (Status); } } @@ -1914,7 +1924,7 @@ VariableLockDynamicHiiPcd ( } /** - VariableLockProtocol callback + VariablePolicyProtocol callback to lock the variables referenced by DynamicHii PCDs with RO property set in *.dsc. @param[in] Event Event whose notification function is being invoked. @@ -1928,12 +1938,12 @@ VariableLockCallBack ( IN VOID *Context ) { - EFI_STATUS Status; - EDKII_VARIABLE_LOCK_PROTOCOL *VariableLock; + EFI_STATUS Status; + EDKII_VARIABLE_POLICY_PROTOCOL *VariablePolicy; - Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **)&VariableLock); + Status = gBS->LocateProtocol (&gEdkiiVariablePolicyProtocolGuid, NULL, (VOID **)&VariablePolicy); if (!EFI_ERROR (Status)) { - VariableLockDynamicHiiPcd (TRUE, VariableLock); - VariableLockDynamicHiiPcd (FALSE, VariableLock); + VariableLockDynamicHiiPcd (TRUE, VariablePolicy); + VariableLockDynamicHiiPcd (FALSE, VariablePolicy); } } diff --git a/MdeModulePkg/Universal/PCD/Dxe/Service.h b/MdeModulePkg/Universal/PCD/Dxe/Service.h index 6f4a6c72ffb4..d0c692f6d2fd 100644 --- a/MdeModulePkg/Universal/PCD/Dxe/Service.h +++ b/MdeModulePkg/Universal/PCD/Dxe/Service.h @@ -17,7 +17,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include -#include +#include #include #include #include From 3dbdfd22c703915ea327d46bb364abd0e37a754d Mon Sep 17 00:00:00 2001 From: Sathya Ravichandran Date: Mon, 1 Sep 2025 13:18:34 +0530 Subject: [PATCH 0824/1172] SecurityPkg: Replace VariableLock with VariablePolicy Since VariableLock compromises security in the SMM environment, it is deprecated. Used VariablePolicy instead for stronger and more flexible UEFI variable protection. Ref: [acd66e4] Cc: Sachin Ganesh Signed-off-by: Sathya Ravichandran --- .../DxeTcg2PhysicalPresenceLib.c | 22 +++++++----- .../DxeTcg2PhysicalPresenceLib.inf | 3 +- .../DxeTcgPhysicalPresenceLib.c | 36 +++++++++++-------- .../DxeTcgPhysicalPresenceLib.inf | 3 +- 4 files changed, 39 insertions(+), 25 deletions(-) diff --git a/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c b/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c index de4f5e583d51..93137c329b8a 100644 --- a/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c +++ b/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.c @@ -15,7 +15,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include -#include +#include #include #include #include @@ -918,20 +918,26 @@ Tcg2PhysicalPresenceLibProcessRequest ( EFI_STATUS Status; UINTN DataSize; EFI_TCG2_PHYSICAL_PRESENCE TcgPpData; - EDKII_VARIABLE_LOCK_PROTOCOL *VariableLockProtocol; + EDKII_VARIABLE_POLICY_PROTOCOL *VariablePolicyProtocol; EFI_TCG2_PHYSICAL_PRESENCE_FLAGS PpiFlags; // // This flags variable controls whether physical presence is required for TPM command. // It should be protected from malicious software. We set it as read-only variable here. // - Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **)&VariableLockProtocol); + Status = gBS->LocateProtocol (&gEdkiiVariablePolicyProtocolGuid, NULL, (VOID **)&VariablePolicyProtocol); if (!EFI_ERROR (Status)) { - Status = VariableLockProtocol->RequestToLock ( - VariableLockProtocol, - TCG2_PHYSICAL_PRESENCE_FLAGS_VARIABLE, - &gEfiTcg2PhysicalPresenceGuid - ); + Status = RegisterBasicVariablePolicy ( + VariablePolicyProtocol, + &gEfiTcg2PhysicalPresenceGuid, + TCG2_PHYSICAL_PRESENCE_FLAGS_VARIABLE, + VARIABLE_POLICY_NO_MIN_SIZE, + VARIABLE_POLICY_NO_MAX_SIZE, + VARIABLE_POLICY_NO_MUST_ATTR, + VARIABLE_POLICY_NO_CANT_ATTR, + VARIABLE_POLICY_TYPE_LOCK_NOW + ); + if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "[TPM2] Error when lock variable %s, Status = %r\n", TCG2_PHYSICAL_PRESENCE_FLAGS_VARIABLE, Status)); ASSERT_EFI_ERROR (Status); diff --git a/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.inf b/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.inf index e1c7c20d52f4..4ee13090f933 100644 --- a/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.inf +++ b/SecurityPkg/Library/DxeTcg2PhysicalPresenceLib/DxeTcg2PhysicalPresenceLib.inf @@ -50,10 +50,11 @@ HobLib Tpm2CommandLib Tcg2PpVendorLib + VariablePolicyHelperLib [Protocols] gEfiTcg2ProtocolGuid ## SOMETIMES_CONSUMES - gEdkiiVariableLockProtocolGuid ## SOMETIMES_CONSUMES + gEdkiiVariablePolicyProtocolGuid ## SOMETIMES_CONSUMES [Pcd] gEfiSecurityPkgTokenSpaceGuid.PcdTcg2PhysicalPresenceFlags ## SOMETIMES_CONSUMES diff --git a/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.c b/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.c index 597ce77b4b49..6e81a18a072d 100644 --- a/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.c +++ b/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.c @@ -16,7 +16,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include -#include +#include #include #include #include @@ -1183,14 +1183,14 @@ TcgPhysicalPresenceLibProcessRequest ( VOID ) { - EFI_STATUS Status; - BOOLEAN LifetimeLock; - BOOLEAN CmdEnable; - UINTN DataSize; - EFI_PHYSICAL_PRESENCE TcgPpData; - EFI_TCG_PROTOCOL *TcgProtocol; - EDKII_VARIABLE_LOCK_PROTOCOL *VariableLockProtocol; - EFI_PHYSICAL_PRESENCE_FLAGS PpiFlags; + EFI_STATUS Status; + BOOLEAN LifetimeLock; + BOOLEAN CmdEnable; + UINTN DataSize; + EFI_PHYSICAL_PRESENCE TcgPpData; + EFI_TCG_PROTOCOL *TcgProtocol; + EDKII_VARIABLE_POLICY_PROTOCOL *VariablePolicyProtocol; + EFI_PHYSICAL_PRESENCE_FLAGS PpiFlags; Status = gBS->LocateProtocol (&gEfiTcgProtocolGuid, NULL, (VOID **)&TcgProtocol); if (EFI_ERROR (Status)) { @@ -1229,13 +1229,19 @@ TcgPhysicalPresenceLibProcessRequest ( // This flags variable controls whether physical presence is required for TPM command. // It should be protected from malicious software. We set it as read-only variable here. // - Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **)&VariableLockProtocol); + Status = gBS->LocateProtocol (&gEdkiiVariablePolicyProtocolGuid, NULL, (VOID **)&VariablePolicyProtocol); if (!EFI_ERROR (Status)) { - Status = VariableLockProtocol->RequestToLock ( - VariableLockProtocol, - PHYSICAL_PRESENCE_FLAGS_VARIABLE, - &gEfiPhysicalPresenceGuid - ); + Status = RegisterBasicVariablePolicy ( + VariablePolicyProtocol, + &gEfiPhysicalPresenceGuid, + PHYSICAL_PRESENCE_FLAGS_VARIABLE, + VARIABLE_POLICY_NO_MIN_SIZE, + VARIABLE_POLICY_NO_MAX_SIZE, + VARIABLE_POLICY_NO_MUST_ATTR, + VARIABLE_POLICY_NO_CANT_ATTR, + VARIABLE_POLICY_TYPE_LOCK_NOW + ); + if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "[TPM] Error when lock variable %s, Status = %r\n", PHYSICAL_PRESENCE_FLAGS_VARIABLE, Status)); ASSERT_EFI_ERROR (Status); diff --git a/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.inf b/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.inf index cfe14f20ca35..a597d8c69762 100644 --- a/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.inf +++ b/SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.inf @@ -50,10 +50,11 @@ PrintLib HiiLib TcgPpVendorLib + VariablePolicyHelperLib [Protocols] gEfiTcgProtocolGuid ## SOMETIMES_CONSUMES - gEdkiiVariableLockProtocolGuid ## SOMETIMES_CONSUMES + gEdkiiVariablePolicyProtocolGuid ## SOMETIMES_CONSUMES [Guids] ## SOMETIMES_CONSUMES ## HII From acf5df3ee6b86e19c6979b99cd79d58b50af0109 Mon Sep 17 00:00:00 2001 From: Akshay Behl Date: Fri, 29 Aug 2025 15:16:16 +0530 Subject: [PATCH 0825/1172] UefiPayloadPkg: Fdtparserlib: Enable above 4G support Add support to check the DMA ranges to determine support for DMA above 4G. This change implements parsing of the "dma-ranges" property from the device tree. Reference: https://devicetree-specification.readthedocs.io/en/latest/chapter2-devicetree-basics.html#dma-ranges Signed-off-by: Akshay Behl Co-authored-by: Dhaval Sharma --- .../Library/FdtParserLib/FdtParserLib.c | 87 ++++++++++++++++++- 1 file changed, 85 insertions(+), 2 deletions(-) diff --git a/UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c b/UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c index 41e15e4c8218..b08872d11c4b 100644 --- a/UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c +++ b/UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c @@ -765,7 +765,7 @@ ParsePciRootBridge ( if (AsciiStrCmp (TempStr, "ranges") == 0) { DEBUG ((DEBUG_INFO, " Found ranges Property TempLen (%08X), limit %x\n", TempLen, TempLen / sizeof (UINT32))); - + // TODO: In future we should fetch these values from fdt and avoid using these Pcds mPciRootBridgeInfo->RootBridge[RbIndex].AllocationAttributes = EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM | EFI_PCI_HOST_BRIDGE_MEM64_DECODE; mPciRootBridgeInfo->RootBridge[RbIndex].Supports = ROOT_BRIDGE_SUPPORTS_DEFAULT; mPciRootBridgeInfo->RootBridge[RbIndex].PMemAbove4G.Base = PcdGet64 (PcdPciReservedPMemAbove4GBBase); @@ -774,6 +774,7 @@ ParsePciRootBridge ( mPciRootBridgeInfo->RootBridge[RbIndex].PMem.Limit = PcdGet32 (PcdPciReservedPMemLimit); mPciRootBridgeInfo->RootBridge[RbIndex].UID = RbIndex; mPciRootBridgeInfo->RootBridge[RbIndex].HID = EISA_PNP_ID (0x0A03); + mPciRootBridgeInfo->RootBridge[RbIndex].DmaAbove4G = FALSE; Data32 = (UINT32 *)(PropertyPtr->Data); for (Base = 0; Base < TempLen / sizeof (UINT32); Base = Base + DWORDS_TO_NEXT_ADDR_TYPE) { @@ -803,6 +804,88 @@ ParsePciRootBridge ( DEBUG ((DEBUG_INFO, "PciRootBridge->Io.limit %llx, \n", mPciRootBridgeInfo->RootBridge[RbIndex].Io.Limit)); } + // + // Check for the "dma-ranges" property to determine if the device supports + // DMA (Direct Memory Access) addresses above the 4GiB boundary. + // + if (AsciiStrCmp (TempStr, "dma-ranges") == 0) { + Data32 = (UINT32 *)(PropertyPtr->Data); + + if (TempLen == 0) { + continue; + } + + // + // According to the device tree specification, a dma-ranges entry is a tuple of + // (child-bus-address, parent-bus-address, size). The number of 32-bit cells + // for each part of the tuple is defined by the '#address-cells' and '#size-cells' + // properties. + // + UINT32 ChildAddrCells = AddressCells; + + UINT32 ParentAddrCells = AddressCells; + INT32 ParentNode = FdtParentOffset (Fdt, Node); + if (ParentNode >= 0) { + PropertyPtr = FdtGetProperty (Fdt, ParentNode, "#address-cells", &TempLen); + if ((PropertyPtr != NULL) && (TempLen > 0)) { + ParentAddrCells = Fdt32ToCpu (*(UINT32 *)PropertyPtr->Data); + } + } + + UINT32 SizeCells = 2; + PropertyPtr = FdtGetProperty (Fdt, Node, "#size-cells", &TempLen); + if ((PropertyPtr != NULL) && (TempLen > 0)) { + SizeCells = Fdt32ToCpu (*(UINT32 *)PropertyPtr->Data); + } + + UINT32 TripletCells = ChildAddrCells + ParentAddrCells + SizeCells; + + for (Base = 0; Base < TempLen / sizeof (UINT32); Base = Base + TripletCells) { + UINT64 ChildBusAddress = 0; + UINT64 ParentBusAddress = 0; + UINT64 DmaRangeSize = 0; + + if (ChildAddrCells == 3) { + ChildBusAddress = (UINT64)Fdt32ToCpu (*(Data32 + Base + 1)) << 32 | + (UINT64)Fdt32ToCpu (*(Data32 + Base + 2)); + } else if (ChildAddrCells == 2) { + ChildBusAddress = (UINT64)Fdt32ToCpu (*(Data32 + Base)) << 32 | + (UINT64)Fdt32ToCpu (*(Data32 + Base + 1)); + } else if (ChildAddrCells == 1) { + ChildBusAddress = Fdt32ToCpu (*(Data32 + Base)); + } + + UINT32 ParentBase = Base + ChildAddrCells; + if (ParentAddrCells == 2) { + ParentBusAddress = (UINT64)Fdt32ToCpu (*(Data32 + ParentBase)) << 32 | + (UINT64)Fdt32ToCpu (*(Data32 + ParentBase + 1)); + } else if (ParentAddrCells == 1) { + ParentBusAddress = Fdt32ToCpu (*(Data32 + ParentBase)); + } + + UINT32 SizeBase = Base + ChildAddrCells + ParentAddrCells; + if (SizeCells == 2) { + DmaRangeSize = (UINT64)Fdt32ToCpu (*(Data32 + SizeBase)) << 32 | + (UINT64)Fdt32ToCpu (*(Data32 + SizeBase + 1)); + } else if (SizeCells == 1) { + DmaRangeSize = Fdt32ToCpu (*(Data32 + SizeBase)); + } + + if ((ParentBusAddress > 0xFFFFFFFF) || + ((ParentBusAddress + DmaRangeSize - 1) > 0xFFFFFFFF)) + { + mPciRootBridgeInfo->RootBridge[RbIndex].DmaAbove4G = TRUE; + DEBUG (( + DEBUG_INFO, + "DMA Above 4G supported: Parent=0x%llx, Size=0x%llx\n", + ParentBusAddress, + DmaRangeSize + )); + break; + } + } + } + if (AsciiStrCmp (TempStr, "reg") == 0) { UINT64 *Data64 = (UINT64 *)(PropertyPtr->Data); mUplPciSegmentInfoHob->SegmentInfo[RbIndex].BaseAddress = Fdt64ToCpu (ReadUnaligned64 (Data64)); @@ -913,7 +996,7 @@ ParseDtb ( DEBUG ((DEBUG_INFO, "\n Property(%08X) %a", Property, TempStr)); DEBUG ((DEBUG_INFO, " %016lX %016lX", StartAddress, NumberOfBytes)); if (!IsHobConstructed) { - if ((NumberOfBytes > MinimalNeededSize) && (StartAddress < BASE_4GB)) { + if (NumberOfBytes > MinimalNeededSize) { MemoryBottom = StartAddress + NumberOfBytes - MinimalNeededSize; FreeMemoryBottom = MemoryBottom; FreeMemoryTop = StartAddress + NumberOfBytes; From 783a92f1eabbe8d30595bb713f70e841c52c6fab Mon Sep 17 00:00:00 2001 From: Dhaval Date: Wed, 9 Jul 2025 09:55:13 +0530 Subject: [PATCH 0826/1172] UefiPayloadPkg: Do not allocate hobs from reserved memory With certain combinations of memory when special-purpose memory shows up first during the parsing, it is used for HOB creation and other UEFI memory map requirements which is not desired. So now we check if the parent node is reserved node, do not use it for HOB. Signed-off-by: Akshay Behl Co-authored-by: Dhaval Sharma --- UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c b/UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c index b08872d11c4b..b02f7274b8f2 100644 --- a/UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c +++ b/UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c @@ -956,6 +956,7 @@ ParseDtb ( UINT8 *RbSegNumAlreadyAssigned; UINT8 NumberOfRbSegNumAlreadyAssigned; UINT32 RootAddressCells; + INT32 ParentNode; Fdt = FdtBase; Depth = 0; @@ -995,7 +996,11 @@ ParseDtb ( NumberOfBytes = Fdt64ToCpu (ReadUnaligned64 (Data64 + 1)); DEBUG ((DEBUG_INFO, "\n Property(%08X) %a", Property, TempStr)); DEBUG ((DEBUG_INFO, " %016lX %016lX", StartAddress, NumberOfBytes)); - if (!IsHobConstructed) { + // If parent node type is reserved-memory we are looking at special-purpose memory. Ignore it. + ParentNode = FdtParentOffset (Fdt, Node); + NodePtr = (FDT_NODE_HEADER *)((CONST CHAR8 *)Fdt + ParentNode + Fdt32ToCpu (((FDT_HEADER *)Fdt)->OffsetDtStruct)); + NodeType = CheckNodeType (NodePtr->Name, Depth); + if (!IsHobConstructed && (NodeType != ReservedMemory)) { if (NumberOfBytes > MinimalNeededSize) { MemoryBottom = StartAddress + NumberOfBytes - MinimalNeededSize; FreeMemoryBottom = MemoryBottom; From 1aedb79e9b1c4acbc6563ae984c27d772e95f824 Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Mon, 9 Jun 2025 09:10:59 -0700 Subject: [PATCH 0827/1172] MdeModulePkg: SpiNorFlash update FillWriteBuffer headers. The function headers for FillWriteBuffer have become out of date with the implementation. Update the function headers to more clearly define the interface for recent changes. Signed-off-by: Aaron Pop --- .../Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.c | 2 ++ .../Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.h | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.c b/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.c index ae8abda73479..da499852f93b 100644 --- a/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.c +++ b/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.c @@ -20,6 +20,8 @@ /** Fill Write Buffer with Opcode, Address, Dummy Bytes, and Data. + If WriteBytes is non-zero, WriteBuffer must be a valid buffer. + @param[in] Instance The instance of SPI_NOR_FLASH @param[in] Opcode Opcode for transaction @param[in] DummyBytes The dummy bytes send to SPI flash device diff --git a/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.h b/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.h index fb71e8d56f40..e081dd965651 100644 --- a/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.h +++ b/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.h @@ -16,12 +16,18 @@ #include "SpiNorFlashJedecSfdpInternal.h" /** - Fill Write Buffer with Opcode, Address, Dummy Bytes, and Data - - @param[in] Opcode - Opcode for transaction - @param[in] Address - SPI Offset Start Address - @param[in] WriteBytes - Number of bytes to write to SPI device - @param[in] WriteBuffer - Buffer containing bytes to write to SPI device + Fill Write Buffer with Opcode, Address, Dummy Bytes, and Data. + + If WriteBytes is non-zero, WriteBuffer must be a valid buffer. + + @param[in] Instance The instance of SPI_NOR_FLASH + @param[in] Opcode Opcode for transaction + @param[in] DummyBytes The dummy bytes send to SPI flash device + @param[in] AddressBytesSupported Bytes of address supported by SPI flash device + @param[in] UseAddress Send the address for SPI flash command + @param[in] Address SPI Offset Start Address + @param[in] WriteBytes Number of bytes to write to SPI device + @param[in] WriteBuffer Buffer containing bytes to write to SPI device @retval Size of Data in Buffer **/ From 0199530a52435541f997d60b54177c5fa86b6b3c Mon Sep 17 00:00:00 2001 From: Benjamin Doron Date: Thu, 30 Oct 2025 13:09:49 -0400 Subject: [PATCH 0828/1172] UefiCpuPkg: BaseRiscVMmuLib: Fix the logic toggling the interrupt state `GetInterruptState` ultimately queries the hardware, which means that once the first check disables interrupts, they won't be enabled later. The proper way to do this is with `SaveAndDisableInterrupts`. Signed-off-by: Benjamin Doron --- UefiCpuPkg/Library/BaseRiscVMmuLib/BaseRiscVMmuLib.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/UefiCpuPkg/Library/BaseRiscVMmuLib/BaseRiscVMmuLib.c b/UefiCpuPkg/Library/BaseRiscVMmuLib/BaseRiscVMmuLib.c index 34300dca5c34..1dd8f816a7b8 100644 --- a/UefiCpuPkg/Library/BaseRiscVMmuLib/BaseRiscVMmuLib.c +++ b/UefiCpuPkg/Library/BaseRiscVMmuLib/BaseRiscVMmuLib.c @@ -651,6 +651,7 @@ RiscVMmuSetSatpMode ( UINTN NumberOfDescriptors; UINTN Index; EFI_STATUS Status; + BOOLEAN InterruptState; if (SatpMode > PcdGet32 (PcdCpuRiscVMmuMaxSatpMode)) { return EFI_DEVICE_ERROR; @@ -720,9 +721,7 @@ RiscVMmuSetSatpMode ( FreePool ((VOID *)MemoryMap); - if (GetInterruptState ()) { - DisableInterrupts (); - } + InterruptState = SaveAndDisableInterrupts (); Ppn = (UINT64)TranslationTable >> RISCV_MMU_PAGE_SHIFT; ASSERT (!(Ppn & ~(SATP64_PPN))); @@ -745,9 +744,7 @@ RiscVMmuSetSatpMode ( RiscVLocalTlbFlushAll (); - if (GetInterruptState ()) { - EnableInterrupts (); - } + SetInterruptState (InterruptState); return Status; } From ade0eeb923f496ace74dd818d9b3d8815ad163d7 Mon Sep 17 00:00:00 2001 From: Benjamin Doron Date: Tue, 4 Nov 2025 15:20:47 -0500 Subject: [PATCH 0829/1172] OvmfPkg/RiscVVirt/PlatformSecLib: Actually reserve handoff region An unterminated comment meant that the handoff region wasn't reserved. This will result in stack corruption. Signed-off-by: Benjamin Doron --- OvmfPkg/RiscVVirt/Library/PlatformSecLib/SecEntry.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OvmfPkg/RiscVVirt/Library/PlatformSecLib/SecEntry.S b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/SecEntry.S index b52becdb29cf..d31879177a46 100644 --- a/OvmfPkg/RiscVVirt/Library/PlatformSecLib/SecEntry.S +++ b/OvmfPkg/RiscVVirt/Library/PlatformSecLib/SecEntry.S @@ -15,7 +15,7 @@ li s0, 0 li a2, FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) li a3, FixedPcdGet32 (PcdOvmfSecPeiTempRamSize) -/* Reserve region to store handoff data +/* Reserve region to store handoff data */ li a4, SEC_HANDOFF_DATA_RESERVE_SIZE sub a3, a3, a4 From 61f66314f4f74b3ed1d3639918aea1d1b1d4a4e1 Mon Sep 17 00:00:00 2001 From: Longhaox Lee Date: Mon, 13 Oct 2025 16:40:15 +0800 Subject: [PATCH 0830/1172] CryptoPkg: Update mbedtls submodule for EDKII Update mbedtls submodule from 3.3.0 to 3.6.5 in CryptoPkg. REF: https://github.com/tianocore/edk2/issues/11605 Signed-off-by: Longhaox Lee --- CryptoPkg/Library/MbedTlsLib/mbedtls | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CryptoPkg/Library/MbedTlsLib/mbedtls b/CryptoPkg/Library/MbedTlsLib/mbedtls index 8c89224991ad..e185d7fd8549 160000 --- a/CryptoPkg/Library/MbedTlsLib/mbedtls +++ b/CryptoPkg/Library/MbedTlsLib/mbedtls @@ -1 +1 @@ -Subproject commit 8c89224991adff88d53cd380f42a2baa36f91454 +Subproject commit e185d7fd85499c8ce5ca2a54f5cf8fe7dbe3f8df From c2147ed33ac39164b91e9449c7e097956703124c Mon Sep 17 00:00:00 2001 From: Longhaox Lee Date: Thu, 13 Nov 2025 15:04:28 +0800 Subject: [PATCH 0831/1172] CryptoPkg: EDK2 code update for Mbedtls 3.6.5. 1. mbedtls_config.h header sync with 3.6.5 . 2. Implement mbedtls_ms_time() Get time in milliseconds. 3. Covert some CRT library to EDK Implement and CRT defined. 4. Added and remove file to sync. REF: https://github.com/tianocore/edk2/issues/11605 Signed-off-by: Longhaox Lee --- .../Pk/CryptPkcs7Internal.h | 1 + .../SysCall/ConstantTimeClock.c | 8 + .../SysCall/TimerWrapper.c | 42 + .../SysCall/UnitTestHostCrtWrapper.c | 8 + CryptoPkg/Library/Include/CrtLibSupport.h | 33 + CryptoPkg/Library/MbedTlsLib/EcSm2Null.c | 24 + .../Include/mbedtls/mbedtls_config.h | 1145 +++++++++++++---- CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf | 10 +- .../Library/MbedTlsLib/MbedTlsLibFull.inf | 11 +- 9 files changed, 998 insertions(+), 284 deletions(-) diff --git a/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptPkcs7Internal.h b/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptPkcs7Internal.h index cbdd1dc53011..3f2cab37d28d 100644 --- a/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptPkcs7Internal.h +++ b/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptPkcs7Internal.h @@ -18,6 +18,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include "mbedtls/asn1.h" #include "mbedtls/asn1write.h" #include "mbedtls/x509.h" +#include "x509_internal.h" #include "mbedtls/x509_crt.h" /// diff --git a/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/ConstantTimeClock.c b/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/ConstantTimeClock.c index a4a873271f08..cd723bc249e6 100644 --- a/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/ConstantTimeClock.c +++ b/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/ConstantTimeClock.c @@ -77,3 +77,11 @@ gettimeofday ( tv->tv_usec = 0; return 0; } + +ms_time_t +mbedtls_ms_time ( + void + ) +{ + return 0; +} diff --git a/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/TimerWrapper.c b/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/TimerWrapper.c index 106108c9b499..0db9c8602e68 100644 --- a/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/TimerWrapper.c +++ b/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/TimerWrapper.c @@ -200,3 +200,45 @@ sleep ( { return 0; } + +ms_time_t +mbedtls_ms_time ( + void + ) +{ + EFI_STATUS Status; + EFI_TIME Time; + ms_time_t CalTime; + UINTN Year; + + // + // Get the current time and date information + // + Status = gRT->GetTime (&Time, NULL); + if (EFI_ERROR (Status) || (Time.Year < 1970)) { + return 0; + } + + // + // Years Handling + // UTime should now be set to 00:00:00 on Jan 1 of the current year. + // + for (Year = 1970, CalTime = 0; Year != Time.Year; Year++) { + CalTime = CalTime + (time_t)(CumulativeDays[IsLeap (Year)][13] * SECSPERDAY); + } + + // + // Add in number of seconds for current Month, Day, Hour, Minute, Seconds, and TimeZone adjustment + // + CalTime = CalTime + + (time_t)((Time.TimeZone != EFI_UNSPECIFIED_TIMEZONE) ? (Time.TimeZone * 60) : 0) + + (time_t)(CumulativeDays[IsLeap (Time.Year)][Time.Month] * SECSPERDAY) + + (time_t)(((Time.Day > 0) ? Time.Day - 1 : 0) * SECSPERDAY) + + (time_t)(Time.Hour * SECSPERHOUR) + + (time_t)(Time.Minute * 60) + + (time_t)Time.Second; + + CalTime = CalTime*1000 + (ms_time_t)(Time.Nanosecond/1000000); + + return CalTime; +} diff --git a/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/UnitTestHostCrtWrapper.c b/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/UnitTestHostCrtWrapper.c index cd20309a6d81..812607c79de4 100644 --- a/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/UnitTestHostCrtWrapper.c +++ b/CryptoPkg/Library/BaseCryptLibMbedTls/SysCall/UnitTestHostCrtWrapper.c @@ -61,3 +61,11 @@ getegid ( } int errno = 0; + +ms_time_t +mbedtls_ms_time ( + void + ) +{ + return 0; +} diff --git a/CryptoPkg/Library/Include/CrtLibSupport.h b/CryptoPkg/Library/Include/CrtLibSupport.h index 4da2ef61f7f8..c09a9fabc7b1 100644 --- a/CryptoPkg/Library/Include/CrtLibSupport.h +++ b/CryptoPkg/Library/Include/CrtLibSupport.h @@ -100,6 +100,7 @@ typedef UINTN intptr_t; typedef INTN ptrdiff_t; typedef INTN ssize_t; typedef INT64 time_t; +typedef UINT64 ms_time_t; typedef UINT8 __uint8_t; typedef UINT8 sa_family_t; typedef UINT8 u_char; @@ -448,4 +449,36 @@ strpbrk ( #define offsetof(type, member) OFFSET_OF(type,member) #define atoi(nptr) AsciiStrDecimalToUintn(nptr) +#ifndef _BYTESWAP_DEFINED +#define _BYTESWAP_DEFINED +#define _byteswap_ushort SwapBytes16 +#define _byteswap_ulong SwapBytes32 +#define _byteswap_uint64 SwapBytes64 +#endif + +#ifndef SecureZeroMemory +#define SecureZeroMemory(ptr, sz) memset((ptr), 0, (sz)) +#endif + +#ifndef INT64_MAX +#define INT64_MAX 0x7FFFFFFFFFFFFFFFL +#define INT64_MIN (-0x7FFFFFFFFFFFFFFFL - 1) +#endif + +#ifndef INT16_MAX +#define INT16_MIN (-32768) +#define INT16_MAX (32767) +#define UINT16_MAX (65535) +#endif + +#ifndef UINT64_MAX +#define UINT64_MAX 0xFFFFFFFFFFFFFFFFUL +#endif + +#undef UINTPTR_MAX +#if (UINT_MAX > 0xFFFFFFFFUL) +#define UINTPTR_MAX 0xFFFFFFFFFFFFFFFFUL +#else +#define UINTPTR_MAX 0xFFFFFFFFUL +#endif #endif diff --git a/CryptoPkg/Library/MbedTlsLib/EcSm2Null.c b/CryptoPkg/Library/MbedTlsLib/EcSm2Null.c index 1c9cd72b70ea..d869a2e4895a 100644 --- a/CryptoPkg/Library/MbedTlsLib/EcSm2Null.c +++ b/CryptoPkg/Library/MbedTlsLib/EcSm2Null.c @@ -493,3 +493,27 @@ mbedtls_ecdsa_sign ( ASSERT (FALSE); return -1; } + +int +mbedtls_ecp_write_key_ext ( + const mbedtls_ecp_keypair *key, + size_t *olen, + unsigned char *buf, + size_t buflen + ) +{ + ASSERT (FALSE); + return -1; +} + +int +mbedtls_ecp_read_key ( + mbedtls_ecp_group_id grp_id, + mbedtls_ecp_keypair *key, + const unsigned char *buf, + size_t buflen + ) +{ + ASSERT (FALSE); + return -1; +} diff --git a/CryptoPkg/Library/MbedTlsLib/Include/mbedtls/mbedtls_config.h b/CryptoPkg/Library/MbedTlsLib/Include/mbedtls/mbedtls_config.h index a2e1cfffdda1..7d30e9a2116e 100644 --- a/CryptoPkg/Library/MbedTlsLib/Include/mbedtls/mbedtls_config.h +++ b/CryptoPkg/Library/MbedTlsLib/Include/mbedtls/mbedtls_config.h @@ -30,11 +30,15 @@ * Requires support for asm() in compiler. * * Used in: + * library/aesni.h * library/aria.c * library/bn_mul.h + * library/constant_time.c + * library/padlock.h * * Required by: - * MBEDTLS_AESNI_C + * MBEDTLS_AESCE_C + * MBEDTLS_AESNI_C (on some platforms) * MBEDTLS_PADLOCK_C * * Comment to disable the use of assembly code. @@ -146,19 +150,51 @@ * * Enable the memory allocation layer. * - * By default mbed TLS uses the system-provided calloc() and free(). + * By default Mbed TLS uses the system-provided calloc() and free(). * This allows different allocators (self-implemented or provided) to be * provided to the platform abstraction layer. * - * Enabling MBEDTLS_PLATFORM_MEMORY without the + * Enabling #MBEDTLS_PLATFORM_MEMORY without the * MBEDTLS_PLATFORM_{FREE,CALLOC}_MACROs will provide * "mbedtls_platform_set_calloc_free()" allowing you to set an alternative calloc() and * free() function pointer at runtime. * - * Enabling MBEDTLS_PLATFORM_MEMORY and specifying + * Enabling #MBEDTLS_PLATFORM_MEMORY and specifying * MBEDTLS_PLATFORM_{CALLOC,FREE}_MACROs will allow you to specify the * alternate function at compile time. * + * An overview of how the value of mbedtls_calloc is determined: + * + * - if !MBEDTLS_PLATFORM_MEMORY + * - mbedtls_calloc = calloc + * - if MBEDTLS_PLATFORM_MEMORY + * - if (MBEDTLS_PLATFORM_CALLOC_MACRO && MBEDTLS_PLATFORM_FREE_MACRO): + * - mbedtls_calloc = MBEDTLS_PLATFORM_CALLOC_MACRO + * - if !(MBEDTLS_PLATFORM_CALLOC_MACRO && MBEDTLS_PLATFORM_FREE_MACRO): + * - Dynamic setup via mbedtls_platform_set_calloc_free is now possible with a default value MBEDTLS_PLATFORM_STD_CALLOC. + * - How is MBEDTLS_PLATFORM_STD_CALLOC handled? + * - if MBEDTLS_PLATFORM_NO_STD_FUNCTIONS: + * - MBEDTLS_PLATFORM_STD_CALLOC is not set to anything; + * - MBEDTLS_PLATFORM_STD_MEM_HDR can be included if present; + * - if !MBEDTLS_PLATFORM_NO_STD_FUNCTIONS: + * - if MBEDTLS_PLATFORM_STD_CALLOC is present: + * - User-defined MBEDTLS_PLATFORM_STD_CALLOC is respected; + * - if !MBEDTLS_PLATFORM_STD_CALLOC: + * - MBEDTLS_PLATFORM_STD_CALLOC = calloc + * + * - At this point the presence of MBEDTLS_PLATFORM_STD_CALLOC is checked. + * - if !MBEDTLS_PLATFORM_STD_CALLOC + * - MBEDTLS_PLATFORM_STD_CALLOC = uninitialized_calloc + * + * - mbedtls_calloc = MBEDTLS_PLATFORM_STD_CALLOC. + * + * Defining MBEDTLS_PLATFORM_CALLOC_MACRO and #MBEDTLS_PLATFORM_STD_CALLOC at the same time is not possible. + * MBEDTLS_PLATFORM_CALLOC_MACRO and MBEDTLS_PLATFORM_FREE_MACRO must both be defined or undefined at the same time. + * #MBEDTLS_PLATFORM_STD_CALLOC and #MBEDTLS_PLATFORM_STD_FREE do not have to be defined at the same time, as, if they are used, + * dynamic setup of these functions is possible. See the tree above to see how are they handled in all cases. + * An uninitialized #MBEDTLS_PLATFORM_STD_CALLOC always fails, returning a null pointer. + * An uninitialized #MBEDTLS_PLATFORM_STD_FREE does not do anything. + * * Requires: MBEDTLS_PLATFORM_C * * Enable this layer to allow use of alternative memory allocators. @@ -187,10 +223,10 @@ /** * \def MBEDTLS_PLATFORM_EXIT_ALT * - * MBEDTLS_PLATFORM_XXX_ALT: Uncomment a macro to let mbed TLS support the + * MBEDTLS_PLATFORM_XXX_ALT: Uncomment a macro to let Mbed TLS support the * function in the platform abstraction layer. * - * Example: In case you uncomment MBEDTLS_PLATFORM_PRINTF_ALT, mbed TLS will + * Example: In case you uncomment MBEDTLS_PLATFORM_PRINTF_ALT, Mbed TLS will * provide a function "mbedtls_platform_set_printf()" that allows you to set an * alternative printf function pointer. * @@ -216,6 +252,49 @@ // #define MBEDTLS_PLATFORM_VSNPRINTF_ALT // #define MBEDTLS_PLATFORM_NV_SEED_ALT // #define MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT +// #define MBEDTLS_PLATFORM_MS_TIME_ALT + +/** + * Uncomment the macro to let Mbed TLS use your alternate implementation of + * mbedtls_platform_gmtime_r(). This replaces the default implementation in + * platform_util.c. + * + * gmtime() is not a thread-safe function as defined in the C standard. The + * library will try to use safer implementations of this function, such as + * gmtime_r() when available. However, if Mbed TLS cannot identify the target + * system, the implementation of mbedtls_platform_gmtime_r() will default to + * using the standard gmtime(). In this case, calls from the library to + * gmtime() will be guarded by the global mutex mbedtls_threading_gmtime_mutex + * if MBEDTLS_THREADING_C is enabled. We recommend that calls from outside the + * library are also guarded with this mutex to avoid race conditions. However, + * if the macro MBEDTLS_PLATFORM_GMTIME_R_ALT is defined, Mbed TLS will + * unconditionally use the implementation for mbedtls_platform_gmtime_r() + * supplied at compile time. + */ +// #define MBEDTLS_PLATFORM_GMTIME_R_ALT + +/** + * Uncomment the macro to let Mbed TLS use your alternate implementation of + * mbedtls_platform_zeroize(), to wipe sensitive data in memory. This replaces + * the default implementation in platform_util.c. + * + * By default, the library uses a system function such as memset_s() + * (optional feature of C11), explicit_bzero() (BSD and compatible), or + * SecureZeroMemory (Windows). If no such function is detected, the library + * falls back to a plain C implementation. Compilers are technically + * permitted to optimize this implementation out, meaning that the memory is + * not actually wiped. The library tries to prevent that, but the C language + * makes it impossible to guarantee that the memory will always be wiped. + * + * If your platform provides a guaranteed method to wipe memory which + * `platform_util.c` does not detect, define this macro to the name of + * a function that takes two arguments, a `void *` pointer and a length, + * and wipes that many bytes starting at the specified address. For example, + * if your platform has explicit_bzero() but `platform_util.c` does not + * detect its presence, define `MBEDTLS_PLATFORM_ZEROIZE_ALT` to be + * `explicit_bzero` to use that function as mbedtls_platform_zeroize(). + */ +// #define MBEDTLS_PLATFORM_ZEROIZE_ALT /** * \def MBEDTLS_DEPRECATED_WARNING @@ -247,7 +326,7 @@ /** \} name SECTION: System support */ /** - * \name SECTION: mbed TLS feature support + * \name SECTION: Mbed TLS feature support * * This section sets support for features that are or are not needed * within the modules that are enabled. @@ -270,7 +349,7 @@ /** * \def MBEDTLS_AES_ALT * - * MBEDTLS__MODULE_NAME__ALT: Uncomment a macro to let mbed TLS use your + * MBEDTLS__MODULE_NAME__ALT: Uncomment a macro to let Mbed TLS use your * alternate core implementation of a symmetric crypto, an arithmetic or hash * module (e.g. platform specific assembly optimized implementations). Keep * in mind that the function prototypes should remain the same. @@ -278,7 +357,7 @@ * This replaces the whole module. If you only want to replace one of the * functions, use one of the MBEDTLS__FUNCTION_NAME__ALT flags. * - * Example: In case you uncomment MBEDTLS_AES_ALT, mbed TLS will no longer + * Example: In case you uncomment MBEDTLS_AES_ALT, Mbed TLS will no longer * provide the "struct mbedtls_aes_context" definition and omit the base * function declarations and implementations. "aes_alt.h" will be included from * "aes.h" to include the new function definitions. @@ -326,14 +405,14 @@ /** * \def MBEDTLS_SHA256_PROCESS_ALT * - * MBEDTLS__FUNCTION_NAME__ALT: Uncomment a macro to let mbed TLS use you + * MBEDTLS__FUNCTION_NAME__ALT: Uncomment a macro to let Mbed TLS use you * alternate core implementation of symmetric crypto or hash function. Keep in * mind that function prototypes should remain the same. * - * This replaces only one function. The header file from mbed TLS is still + * This replaces only one function. The header file from Mbed TLS is still * used, in contrast to the MBEDTLS__MODULE_NAME__ALT flags. * - * Example: In case you uncomment MBEDTLS_SHA256_PROCESS_ALT, mbed TLS will + * Example: In case you uncomment MBEDTLS_SHA256_PROCESS_ALT, Mbed TLS will * no longer provide the mbedtls_sha1_process() function, but it will still provide * the other function (using your mbedtls_sha1_process() function) and the definition * of mbedtls_sha1_context, so your implementation of mbedtls_sha1_process must be compatible @@ -383,11 +462,11 @@ * * Expose a part of the internal interface of the Elliptic Curve Point module. * - * MBEDTLS_ECP__FUNCTION_NAME__ALT: Uncomment a macro to let mbed TLS use your + * MBEDTLS_ECP__FUNCTION_NAME__ALT: Uncomment a macro to let Mbed TLS use your * alternative core implementation of elliptic curve arithmetic. Keep in mind * that function prototypes should remain the same. * - * This partially replaces one function. The header file from mbed TLS is still + * This partially replaces one function. The header file from Mbed TLS is still * used, in contrast to the MBEDTLS_ECP_ALT flag. The original implementation * is still present and it is used for group structures not supported by the * alternative. @@ -411,11 +490,11 @@ * implement optimized set up and tear down instructions. * * Example: In case you set MBEDTLS_ECP_INTERNAL_ALT and - * MBEDTLS_ECP_DOUBLE_JAC_ALT, mbed TLS will still provide the ecp_double_jac() + * MBEDTLS_ECP_DOUBLE_JAC_ALT, Mbed TLS will still provide the ecp_double_jac() * function, but will use your mbedtls_internal_ecp_double_jac() if the group * for the operation is supported by your implementation (i.e. your * mbedtls_internal_ecp_grp_capable() function returns 1 for this group). If the - * group is not supported by your implementation, then the original mbed TLS + * group is not supported by your implementation, then the original Mbed TLS * implementation of ecp_double_jac() is used instead, unless this fallback * behaviour is disabled by setting MBEDTLS_ECP_NO_FALLBACK (in which case * ecp_double_jac() will return MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE). @@ -446,7 +525,7 @@ /** * \def MBEDTLS_ENTROPY_HARDWARE_ALT * - * Uncomment this macro to let mbed TLS use your own implementation of a + * Uncomment this macro to let Mbed TLS use your own implementation of a * hardware entropy collector. * * Your function must be called \c mbedtls_hardware_poll(), have the same @@ -495,10 +574,40 @@ * depends on the system and memory details. * * This option is independent of \c MBEDTLS_AES_ROM_TABLES. - * */ // #define MBEDTLS_AES_FEWER_TABLES +/** + * \def MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH + * + * Use only 128-bit keys in AES operations to save ROM. + * + * Uncomment this macro to remove support for AES operations that use 192- + * or 256-bit keys. + * + * Uncommenting this macro reduces the size of AES code by ~300 bytes + * on v8-M/Thumb2. + * + * Module: library/aes.c + * + * Requires: MBEDTLS_AES_C + */ +// #define MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH + +/* + * Disable plain C implementation for AES. + * + * When the plain C implementation is enabled, and an implementation using a + * special CPU feature (such as MBEDTLS_AESCE_C) is also enabled, runtime + * detection will be used to select between them. + * + * If only one implementation is present, runtime detection will not be used. + * This configuration will crash at runtime if running on a CPU without the + * necessary features. It will not build unless at least one of MBEDTLS_AESCE_C + * and/or MBEDTLS_AESNI_C is enabled & present in the build. + */ +// #define MBEDTLS_AES_USE_HARDWARE_ONLY + /** * \def MBEDTLS_CAMELLIA_SMALL_MEMORY * @@ -617,10 +726,23 @@ /** \def MBEDTLS_CTR_DRBG_USE_128_BIT_KEY * * Uncomment this macro to use a 128-bit key in the CTR_DRBG module. - * By default, CTR_DRBG uses a 256-bit key. + * Without this, CTR_DRBG uses a 256-bit key + * unless \c MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH is set. */ // #define MBEDTLS_CTR_DRBG_USE_128_BIT_KEY +/** + * Enable the verified implementations of ECDH primitives from Project Everest + * (currently only Curve25519). This feature changes the layout of ECDH + * contexts and therefore is a compatibility break for applications that access + * fields of a mbedtls_ecdh_context structure directly. See also + * MBEDTLS_ECDH_LEGACY_CONTEXT in include/mbedtls/ecdh.h. + * + * The Everest code is provided under the Apache 2.0 license only; therefore enabling this + * option is not compatible with taking the library under the GPL v2.0-or-later license. + */ +// #define MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED + /** * \def MBEDTLS_ECP_DP_SECP192R1_ENABLED * @@ -672,14 +794,53 @@ * This is useful in non-threaded environments if you want to avoid blocking * for too long on ECC (and, hence, X.509 or SSL/TLS) operations. * - * Uncomment this macro to enable restartable ECC computations. + * This option: + * - Adds xxx_restartable() variants of existing operations in the + * following modules, with corresponding restart context types: + * - ECP (for Short Weierstrass curves only): scalar multiplication (mul), + * linear combination (muladd); + * - ECDSA: signature generation & verification; + * - PK: signature generation & verification; + * - X509: certificate chain verification. + * - Adds mbedtls_ecdh_enable_restart() in the ECDH module. + * - Changes the behaviour of TLS 1.2 clients (not servers) when using the + * ECDHE-ECDSA key exchange (not other key exchanges) to make all ECC + * computations restartable: + * - ECDH operations from the key exchange, only for Short Weierstrass + * curves, only when MBEDTLS_USE_PSA_CRYPTO is not enabled. + * - verification of the server's key exchange signature; + * - verification of the server's certificate chain; + * - generation of the client's signature if client authentication is used, + * with an ECC key/certificate. + * + * \note In the cases above, the usual SSL/TLS functions, such as + * mbedtls_ssl_handshake(), can now return + * MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS. + * + * \note When this option and MBEDTLS_USE_PSA_CRYPTO are both enabled, + * restartable operations in PK, X.509 and TLS (see above) are not + * using PSA. On the other hand, ECDH computations in TLS are using + * PSA, and are not restartable. These are temporary limitations that + * should be lifted in the future. * * \note This option only works with the default software implementation of * elliptic curve functionality. It is incompatible with * MBEDTLS_ECP_ALT, MBEDTLS_ECDH_XXX_ALT, MBEDTLS_ECDSA_XXX_ALT. + * + * Requires: MBEDTLS_ECP_C + * + * Uncomment this macro to enable restartable ECC computations. */ #define MBEDTLS_ECP_RESTARTABLE +/** + * Uncomment to enable using new bignum code in the ECC modules. + * + * \warning This is currently experimental, incomplete and therefore should not + * be used in production. + */ +// #define MBEDTLS_ECP_WITH_MPI_UINT + /** * \def MBEDTLS_ECDSA_DETERMINISTIC * @@ -748,7 +909,7 @@ * * Enable the ECDHE-PSK based ciphersuite modes in SSL / TLS. * - * Requires: MBEDTLS_ECDH_C + * Requires: MBEDTLS_ECDH_C or (MBEDTLS_USE_PSA_CRYPTO and PSA_WANT_ALG_ECDH) * * This enables the following ciphersuites (if other requisites are * enabled as well): @@ -846,7 +1007,9 @@ * * Enable the ECDHE-RSA based ciphersuite modes in SSL / TLS. * - * Requires: MBEDTLS_ECDH_C, MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, + * Requires: MBEDTLS_ECDH_C or (MBEDTLS_USE_PSA_CRYPTO and PSA_WANT_ALG_ECDH) + * MBEDTLS_RSA_C + * MBEDTLS_PKCS1_V15 * MBEDTLS_X509_CRT_PARSE_C * * This enables the following ciphersuites (if other requisites are @@ -869,7 +1032,9 @@ * * Enable the ECDHE-ECDSA based ciphersuite modes in SSL / TLS. * - * Requires: MBEDTLS_ECDH_C, MBEDTLS_ECDSA_C, MBEDTLS_X509_CRT_PARSE_C, + * Requires: MBEDTLS_ECDH_C or (MBEDTLS_USE_PSA_CRYPTO and PSA_WANT_ALG_ECDH) + * MBEDTLS_ECDSA_C or (MBEDTLS_USE_PSA_CRYPTO and PSA_WANT_ALG_ECDSA) + * MBEDTLS_X509_CRT_PARSE_C * * This enables the following ciphersuites (if other requisites are * enabled as well): @@ -891,7 +1056,9 @@ * * Enable the ECDH-ECDSA based ciphersuite modes in SSL / TLS. * - * Requires: MBEDTLS_ECDH_C, MBEDTLS_ECDSA_C, MBEDTLS_X509_CRT_PARSE_C + * Requires: MBEDTLS_ECDH_C or (MBEDTLS_USE_PSA_CRYPTO and PSA_WANT_ALG_ECDH) + * MBEDTLS_ECDSA_C or (MBEDTLS_USE_PSA_CRYPTO and PSA_WANT_ALG_ECDSA) + * MBEDTLS_X509_CRT_PARSE_C * * This enables the following ciphersuites (if other requisites are * enabled as well): @@ -913,7 +1080,9 @@ * * Enable the ECDH-RSA based ciphersuite modes in SSL / TLS. * - * Requires: MBEDTLS_ECDH_C, MBEDTLS_RSA_C, MBEDTLS_X509_CRT_PARSE_C + * Requires: MBEDTLS_ECDH_C or (MBEDTLS_USE_PSA_CRYPTO and PSA_WANT_ALG_ECDH) + * MBEDTLS_RSA_C + * MBEDTLS_X509_CRT_PARSE_C * * This enables the following ciphersuites (if other requisites are * enabled as well): @@ -939,10 +1108,14 @@ * Thread v1.0.0 specification; incompatible changes to the specification * might still happen. For this reason, this is disabled by default. * - * Requires: MBEDTLS_ECJPAKE_C - * SHA-256 (via MD if present, or via PSA, see MBEDTLS_ECJPAKE_C) + * Requires: MBEDTLS_ECJPAKE_C or (MBEDTLS_USE_PSA_CRYPTO and PSA_WANT_ALG_JPAKE) + * SHA-256 (via MBEDTLS_SHA256_C or a PSA driver) * MBEDTLS_ECP_DP_SECP256R1_ENABLED * + * \warning If SHA-256 is provided only by a PSA driver, you must call + * psa_crypto_init() before the first handshake (even if + * MBEDTLS_USE_PSA_CRYPTO is disabled). + * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8 @@ -963,6 +1136,19 @@ */ // #define MBEDTLS_PK_PARSE_EC_EXTENDED +/** + * \def MBEDTLS_PK_PARSE_EC_COMPRESSED + * + * Enable the support for parsing public keys of type Short Weierstrass + * (MBEDTLS_ECP_DP_SECP_XXX and MBEDTLS_ECP_DP_BP_XXX) which are using the + * compressed point format. This parsing is done through ECP module's functions. + * + * \note As explained in the description of MBEDTLS_ECP_PF_COMPRESSED (in ecp.h) + * the only unsupported curves are MBEDTLS_ECP_DP_SECP224R1 and + * MBEDTLS_ECP_DP_SECP224K1. + */ +#define MBEDTLS_PK_PARSE_EC_COMPRESSED + /** * \def MBEDTLS_ERROR_STRERROR_DUMMY * @@ -1123,15 +1309,10 @@ * * Enable support for PKCS#1 v2.1 encoding. * - * Requires: MBEDTLS_RSA_C and (MBEDTLS_MD_C or MBEDTLS_PSA_CRYPTO_C). - * - * \warning If building without MBEDTLS_MD_C, you must call psa_crypto_init() - * before doing any PKCS#1 v2.1 operation. + * Requires: MBEDTLS_RSA_C * - * \warning When building with MBEDTLS_MD_C, all hashes used with this - * need to be available as built-ins (that is, for SHA-256, MBEDTLS_SHA256_C, - * etc.) as opposed to just PSA drivers. So far, PSA drivers are only used by - * this module in builds where MBEDTLS_MD_C is disabled. + * \warning If using a hash that is only provided by PSA drivers, you must + * call psa_crypto_init() before doing any PKCS#1 v2.1 operation. * * This enables support for RSAES-OAEP and RSASSA-PSS operations. */ @@ -1169,18 +1350,6 @@ */ // #define MBEDTLS_PSA_CRYPTO_CLIENT -/** \def MBEDTLS_PSA_CRYPTO_DRIVERS - * - * Enable support for the experimental PSA crypto driver interface. - * - * Requires: MBEDTLS_PSA_CRYPTO_C - * - * \warning This interface is experimental. We intend to maintain backward - * compatibility with application code that relies on drivers, - * but the driver interfaces may change without notice. - */ -// #define MBEDTLS_PSA_CRYPTO_DRIVERS - /** \def MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG * * Make the PSA Crypto module use an external random generator provided @@ -1227,12 +1396,77 @@ * NSPE (Non-Secure Process Environment) and an SPE (Secure Process * Environment). * + * If you enable this option, your build environment must include a header + * file `"crypto_spe.h"` (either in the `psa` subdirectory of the Mbed TLS + * header files, or in another directory on the compiler's include search + * path). Alternatively, your platform may customize the header + * `psa/crypto_platform.h`, in which case it can skip or replace the + * inclusion of `"crypto_spe.h"`. + * * Module: library/psa_crypto.c * Requires: MBEDTLS_PSA_CRYPTO_C * */ // #define MBEDTLS_PSA_CRYPTO_SPM +/** + * \def MBEDTLS_PSA_KEY_STORE_DYNAMIC + * + * Dynamically resize the PSA key store to accommodate any number of + * volatile keys (until the heap memory is exhausted). + * + * If this option is disabled, the key store has a fixed size + * #MBEDTLS_PSA_KEY_SLOT_COUNT for volatile keys and loaded persistent keys + * together. + * + * This option has no effect when #MBEDTLS_PSA_CRYPTO_C is disabled. + * + * Module: library/psa_crypto.c + * Requires: MBEDTLS_PSA_CRYPTO_C + */ +#define MBEDTLS_PSA_KEY_STORE_DYNAMIC + +/** + * Uncomment to enable p256-m. This is an alternative implementation of + * key generation, ECDH and (randomized) ECDSA on the curve SECP256R1. + * Compared to the default implementation: + * + * - p256-m has a much smaller code size and RAM footprint. + * - p256-m is only available via the PSA API. This includes the pk module + * when #MBEDTLS_USE_PSA_CRYPTO is enabled. + * - p256-m does not support deterministic ECDSA, EC-JPAKE, custom protocols + * over the core arithmetic, or deterministic derivation of keys. + * + * We recommend enabling this option if your application uses the PSA API + * and the only elliptic curve support it needs is ECDH and ECDSA over + * SECP256R1. + * + * If you enable this option, you do not need to enable any ECC-related + * MBEDTLS_xxx option. You do need to separately request support for the + * cryptographic mechanisms through the PSA API: + * - #MBEDTLS_PSA_CRYPTO_C and #MBEDTLS_PSA_CRYPTO_CONFIG for PSA-based + * configuration; + * - #MBEDTLS_USE_PSA_CRYPTO if you want to use p256-m from PK, X.509 or TLS; + * - #PSA_WANT_ECC_SECP_R1_256; + * - #PSA_WANT_ALG_ECDH and/or #PSA_WANT_ALG_ECDSA as needed; + * - #PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY, #PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_BASIC, + * #PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_IMPORT, + * #PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_EXPORT and/or + * #PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_GENERATE as needed. + * + * \note To benefit from the smaller code size of p256-m, make sure that you + * do not enable any ECC-related option not supported by p256-m: this + * would cause the built-in ECC implementation to be built as well, in + * order to provide the required option. + * Make sure #PSA_WANT_ALG_DETERMINISTIC_ECDSA, #PSA_WANT_ALG_JPAKE and + * #PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_DERIVE, and curves other than + * SECP256R1 are disabled as they are not supported by this driver. + * Also, avoid defining #MBEDTLS_PK_PARSE_EC_COMPRESSED or + * #MBEDTLS_PK_PARSE_EC_EXTENDED as those currently require a subset of + * the built-in ECC implementation, see docs/driver-only-builds.md. + */ +// #define MBEDTLS_PSA_P256M_DRIVER_ENABLED + /** * \def MBEDTLS_PSA_INJECT_ENTROPY * @@ -1246,6 +1480,26 @@ */ // #define MBEDTLS_PSA_INJECT_ENTROPY +/** + * \def MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS + * + * Assume all buffers passed to PSA functions are owned exclusively by the + * PSA function and are not stored in shared memory. + * + * This option may be enabled if all buffers passed to any PSA function reside + * in memory that is accessible only to the PSA function during its execution. + * + * This option MUST be disabled whenever buffer arguments are in memory shared + * with an untrusted party, for example where arguments to PSA calls are passed + * across a trust boundary. + * + * \note Enabling this option reduces memory usage and code size. + * + * \note Enabling this option causes overlap of input and output buffers + * not to be supported by PSA functions. + */ +// #define MBEDTLS_PSA_ASSUME_EXCLUSIVE_BUFFERS + /** * \def MBEDTLS_RSA_NO_CRT * @@ -1358,9 +1612,50 @@ * module to perform private key operations instead of performing the * operation inside the library. * + * Requires: MBEDTLS_X509_CRT_PARSE_C */ // #define MBEDTLS_SSL_ASYNC_PRIVATE +/** \def MBEDTLS_SSL_CLI_ALLOW_WEAK_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME + * + * In TLS clients, when a client authenticates a server through its + * certificate, the client normally checks three things: + * - the certificate chain must be valid; + * - the chain must start from a trusted CA; + * - the certificate must cover the server name that is expected by the client. + * + * Omitting any of these checks is generally insecure, and can allow a + * malicious server to impersonate a legitimate server. + * + * The third check may be safely skipped in some unusual scenarios, + * such as networks where eavesdropping is a risk but not active attacks, + * or a private PKI where the client equally trusts all servers that are + * accredited by the root CA. + * + * You should call mbedtls_ssl_set_hostname() with the expected server name + * before starting a TLS handshake on a client (unless the client is + * set up to only use PSK-based authentication, which does not rely on the + * host name). This configuration option controls what happens if a TLS client + * is configured with the authentication mode #MBEDTLS_SSL_VERIFY_REQUIRED + * (default), certificate authentication is enabled and the client does not + * call mbedtls_ssl_set_hostname(): + * + * - If this option is unset (default), the connection attempt is aborted + * with the error #MBEDTLS_ERR_SSL_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME. + * - If this option is set, the TLS library does not check the server name + * that the certificate is valid for. This is the historical behavior + * of Mbed TLS, but may be insecure as explained above. + * + * Enable this option for strict backward compatibility if you have + * determined that it is secure in the scenario where you are using + * Mbed TLS. + * + * \deprecated This option exists only for backward compatibility and will + * be removed in the next major version of Mbed TLS. + * + */ +// #define MBEDTLS_SSL_CLI_ALLOW_WEAK_CERTIFICATE_VERIFICATION_WITHOUT_HOSTNAME + /** * \def MBEDTLS_SSL_CONTEXT_SERIALIZATION * @@ -1462,6 +1757,20 @@ */ #define MBEDTLS_SSL_KEEP_PEER_CERTIFICATE +/** + * \def MBEDTLS_SSL_KEYING_MATERIAL_EXPORT + * + * When this option is enabled, the client and server can extract additional + * shared symmetric keys after an SSL handshake using the function + * mbedtls_ssl_export_keying_material(). + * + * The process for deriving the keys is specified in RFC 5705 for TLS 1.2 and + * in RFC 8446, Section 7.5, for TLS 1.3. + * + * Comment this macro to disable mbedtls_ssl_export_keying_material(). + */ +#define MBEDTLS_SSL_KEYING_MATERIAL_EXPORT + /** * \def MBEDTLS_SSL_RENEGOTIATION * @@ -1473,6 +1782,8 @@ * it has been associated with security issues in the past and is easy to * misuse/misunderstand. * + * Requires: MBEDTLS_SSL_PROTO_TLS1_2 + * * Comment this to disable support for renegotiation. * * \note Even if this option is disabled, both client and server are aware @@ -1493,19 +1804,31 @@ */ #define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH +/** + * \def MBEDTLS_SSL_RECORD_SIZE_LIMIT + * + * Enable support for RFC 8449 record_size_limit extension in SSL (TLS 1.3 only). + * + * Requires: MBEDTLS_SSL_PROTO_TLS1_3 + * + * Uncomment this macro to enable support for the record_size_limit extension + */ +// #define MBEDTLS_SSL_RECORD_SIZE_LIMIT + /** * \def MBEDTLS_SSL_PROTO_TLS1_2 * * Enable support for TLS 1.2 (and DTLS 1.2 if DTLS is enabled). * * Requires: Without MBEDTLS_USE_PSA_CRYPTO: MBEDTLS_MD_C and - * (MBEDTLS_SHA1_C or MBEDTLS_SHA256_C or MBEDTLS_SHA512_C) + * (MBEDTLS_SHA256_C or MBEDTLS_SHA384_C or + * SHA-256 or SHA-512 provided by a PSA driver) * With MBEDTLS_USE_PSA_CRYPTO: - * PSA_WANT_ALG_SHA_1 or PSA_WANT_ALG_SHA_256 or - * PSA_WANT_ALG_SHA_512 + * PSA_WANT_ALG_SHA_256 or PSA_WANT_ALG_SHA_384 * - * \warning If building with MBEDTLS_USE_PSA_CRYPTO, you must call - * psa_crypto_init() before doing any TLS operations. + * \warning If building with MBEDTLS_USE_PSA_CRYPTO, or if the hash(es) used + * are only provided by PSA drivers, you must call psa_crypto_init() before + * doing any TLS operations. * * Comment this macro to disable support for TLS 1.2 / DTLS 1.2 */ @@ -1516,19 +1839,26 @@ * * Enable support for TLS 1.3. * - * \note The support for TLS 1.3 is not comprehensive yet, in particular - * pre-shared keys are not supported. - * See docs/architecture/tls13-support.md for a description of the TLS + * \note See docs/architecture/tls13-support.md for a description of the TLS * 1.3 support that this option enables. * * Requires: MBEDTLS_SSL_KEEP_PEER_CERTIFICATE * Requires: MBEDTLS_PSA_CRYPTO_C * - * Note: even though TLS 1.3 depends on PSA Crypto, and uses it unconditionally - * for most operations, if you want it to only use PSA for all crypto - * operations, you need to also enable MBEDTLS_USE_PSA_CRYPTO; otherwise X.509 - * operations, and functions that are common with TLS 1.2 (record protection, - * running handshake hash) will still use non-PSA crypto. + * \note TLS 1.3 uses PSA crypto for cryptographic operations that are + * directly performed by TLS 1.3 code. As a consequence, when TLS 1.3 + * is enabled, a TLS handshake may call psa_crypto_init(), even + * if it ends up negotiating a different TLS version. + * + * \note Cryptographic operations performed indirectly via another module + * (X.509, PK) or by code shared with TLS 1.2 (record protection, + * running handshake hash) only use PSA crypto if + * #MBEDTLS_USE_PSA_CRYPTO is enabled. + * + * \note In multithreaded applications, you must also enable + * #MBEDTLS_THREADING_C, even if individual TLS contexts are not + * shared between threads, unless only one thread ever calls + * TLS functions. * * Uncomment this macro to enable the support for TLS 1.3. */ @@ -1573,8 +1903,11 @@ * * Enable TLS 1.3 ephemeral key exchange mode. * - * Requires: MBEDTLS_ECDH_C, MBEDTLS_X509_CRT_PARSE_C, MBEDTLS_ECDSA_C or - * MBEDTLS_PKCS1_V21 + * Requires: PSA_WANT_ALG_ECDH or PSA_WANT_ALG_FFDH + * MBEDTLS_X509_CRT_PARSE_C + * and at least one of: + * MBEDTLS_ECDSA_C or (MBEDTLS_USE_PSA_CRYPTO and PSA_WANT_ALG_ECDSA) + * MBEDTLS_PKCS1_V21 * * Comment to disable support for the ephemeral key exchange mode in TLS 1.3. * If MBEDTLS_SSL_PROTO_TLS1_3 is not enabled, this option does not have any @@ -1588,7 +1921,7 @@ * * Enable TLS 1.3 PSK ephemeral key exchange mode. * - * Requires: MBEDTLS_ECDH_C + * Requires: PSA_WANT_ALG_ECDH or PSA_WANT_ALG_FFDH * * Comment to disable support for the PSK ephemeral key exchange mode in * TLS 1.3. If MBEDTLS_SSL_PROTO_TLS1_3 is not enabled, this option does not @@ -1598,79 +1931,23 @@ #define MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED /** - * \def MBEDTLS_SSL_TLS1_3_TICKET_AGE_TOLERANCE - * - * Maximum time difference in milliseconds tolerated between the age of a - * ticket from the server and client point of view. - * From the client point of view, the age of a ticket is the time difference - * between the time when the client proposes to the server to use the ticket - * (time of writing of the Pre-Shared Key Extension including the ticket) and - * the time the client received the ticket from the server. - * From the server point of view, the age of a ticket is the time difference - * between the time when the server receives a proposition from the client - * to use the ticket and the time when the ticket was created by the server. - * The server age is expected to be always greater than the client one and - * MBEDTLS_SSL_TLS1_3_TICKET_AGE_TOLERANCE defines the - * maximum difference tolerated for the server to accept the ticket. - * This is not used in TLS 1.2. + * \def MBEDTLS_SSL_EARLY_DATA * - */ -#define MBEDTLS_SSL_TLS1_3_TICKET_AGE_TOLERANCE 6000 - -/** - * \def MBEDTLS_SSL_TLS1_3_TICKET_NONCE_LENGTH + * Enable support for RFC 8446 TLS 1.3 early data. * - * Size in bytes of a ticket nonce. This is not used in TLS 1.2. + * Requires: MBEDTLS_SSL_SESSION_TICKETS and either + * MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED or + * MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED * - * This must be less than 256. - */ -#define MBEDTLS_SSL_TLS1_3_TICKET_NONCE_LENGTH 32 - -/** - * \def MBEDTLS_SSL_TLS1_3_DEFAULT_NEW_SESSION_TICKETS + * Comment this to disable support for early data. If MBEDTLS_SSL_PROTO_TLS1_3 + * is not enabled, this option does not have any effect on the build. * - * Default number of NewSessionTicket messages to be sent by a TLS 1.3 server - * after handshake completion. This is not used in TLS 1.2 and relevant only if - * the MBEDTLS_SSL_SESSION_TICKETS option is enabled. + * \note The maximum amount of early data can be set with + * MBEDTLS_SSL_MAX_EARLY_DATA_SIZE. * */ -#define MBEDTLS_SSL_TLS1_3_DEFAULT_NEW_SESSION_TICKETS 1 - -/** -* \def MBEDTLS_SSL_EARLY_DATA -* -* Enable support for RFC 8446 TLS 1.3 early data. -* -* Requires: MBEDTLS_SSL_SESSION_TICKETS and either -* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED or -* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED -* -* Comment this to disable support for early data. If MBEDTLS_SSL_PROTO_TLS1_3 -* is not enabled, this option does not have any effect on the build. -* -* This feature is experimental, not completed and thus not ready for -* production. -* -*/ // #define MBEDTLS_SSL_EARLY_DATA -/** - * \def MBEDTLS_SSL_MAX_EARLY_DATA_SIZE - * - * The default maximum amount of 0-RTT data. See the documentation of - * \c mbedtls_ssl_tls13_conf_max_early_data_size() for more information. - * - * It must be positive and smaller than UINT32_MAX. - * - * If MBEDTLS_SSL_EARLY_DATA is not defined, this default value does not - * have any impact on the build. - * - * This feature is experimental, not completed and thus not ready for - * production. - * - */ -#define MBEDTLS_SSL_MAX_EARLY_DATA_SIZE 1024 - /** * \def MBEDTLS_SSL_PROTO_DTLS * @@ -1889,22 +2166,32 @@ /** * \def MBEDTLS_USE_PSA_CRYPTO * - * Make the X.509 and TLS library use PSA for cryptographic operations, and - * enable new APIs for using keys handled by PSA Crypto. + * Make the X.509 and TLS libraries use PSA for cryptographic operations as + * much as possible, and enable new APIs for using keys handled by PSA Crypto. * * \note Development of this option is currently in progress, and parts of Mbed * TLS's X.509 and TLS modules are not ported to PSA yet. However, these parts * will still continue to work as usual, so enabling this option should not * break backwards compatibility. * - * \note See docs/use-psa-crypto.md for a complete description of what this - * option currently does, and of parts that are not affected by it so far. - * * \warning If you enable this option, you need to call `psa_crypto_init()` - * before calling any function from the SSL/TLS, X.509 or PK modules. + * before calling any function from the SSL/TLS, X.509 or PK modules, except + * for the various mbedtls_xxx_init() functions which can be called at any time. + * + * \warning In multithreaded applications, you must also enable + * #MBEDTLS_THREADING_C, unless only one thread ever calls PSA functions + * (`psa_xxx()`), including indirect calls through SSL/TLS, X.509 or PK. + * + * \note An important and desirable effect of this option is that it allows + * PK, X.509 and TLS to take advantage of PSA drivers. For example, enabling + * this option is what allows use of drivers for ECDSA, ECDH and EC J-PAKE in + * those modules. However, note that even with this option disabled, some code + * in PK, X.509, TLS or the crypto library might still use PSA drivers, if it + * can determine it's safe to do so; currently that's the case for hashes. + * + * \note See docs/use-psa-crypto.md for a complete description this option. * * Requires: MBEDTLS_PSA_CRYPTO_C. - * Conflicts with: MBEDTLS_ECP_RESTARTABLE * * Uncomment this to enable internal use of PSA Crypto and new associated APIs. */ @@ -1930,8 +2217,15 @@ * If the symbol #MBEDTLS_PSA_CRYPTO_CONFIG_FILE is defined, it specifies * an alternative header to include instead of include/psa/crypto_config.h. * - * This feature is still experimental and is not ready for production since - * it is not completed. + * \warning This option is experimental, in that the set of `PSA_WANT_XXX` + * symbols is not completely finalized yet, and the configuration + * tooling is not ideally adapted to having two separate configuration + * files. + * Future minor releases of Mbed TLS may make minor changes to those + * symbols, but we will endeavor to provide a transition path. + * Nonetheless, this option is considered mature enough to use in + * production, as long as you accept that you may need to make + * minor changes to psa/crypto_config.h when upgrading Mbed TLS. */ // #define MBEDTLS_PSA_CRYPTO_CONFIG @@ -1963,6 +2257,8 @@ * See the documentation of `mbedtls_x509_crt_verify_with_ca_cb()` and * `mbedtls_ssl_conf_ca_cb()` for more information. * + * Requires: MBEDTLS_X509_CRT_PARSE_C + * * Uncomment to enable trusted certificate callbacks. */ // #define MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK @@ -1984,32 +2280,79 @@ * Enable parsing and verification of X.509 certificates, CRLs and CSRS * signed with RSASSA-PSS (aka PKCS#1 v2.1). * + * Requires: MBEDTLS_PKCS1_V21 + * * Comment this macro to disallow using RSASSA-PSS in certificates. */ #define MBEDTLS_X509_RSASSA_PSS_SUPPORT -/** \} name SECTION: mbed TLS feature support */ +/** \} name SECTION: Mbed TLS feature support */ /** - * \name SECTION: mbed TLS modules + * \name SECTION: Mbed TLS modules * - * This section enables or disables entire modules in mbed TLS + * This section enables or disables entire modules in Mbed TLS * \{ */ /** * \def MBEDTLS_AESNI_C * - * Enable AES-NI support on x86-64. + * Enable AES-NI support on x86-64 or x86-32. + * + * \note AESNI is only supported with certain compilers and target options: + * - Visual Studio: supported + * - GCC, x86-64, target not explicitly supporting AESNI: + * requires MBEDTLS_HAVE_ASM. + * - GCC, x86-32, target not explicitly supporting AESNI: + * not supported. + * - GCC, x86-64 or x86-32, target supporting AESNI: supported. + * For this assembly-less implementation, you must currently compile + * `library/aesni.c` and `library/aes.c` with machine options to enable + * SSE2 and AESNI instructions: `gcc -msse2 -maes -mpclmul` or + * `clang -maes -mpclmul`. + * - Non-x86 targets: this option is silently ignored. + * - Other compilers: this option is silently ignored. + * + * \note + * Above, "GCC" includes compatible compilers such as Clang. + * The limitations on target support are likely to be relaxed in the future. * * Module: library/aesni.c * Caller: library/aes.c * - * Requires: MBEDTLS_HAVE_ASM + * Requires: MBEDTLS_HAVE_ASM (on some platforms, see note) * - * This modules adds support for the AES-NI instructions on x86-64 + * This modules adds support for the AES-NI instructions on x86. */ + // #define MBEDTLS_AESNI_C +/** + * \def MBEDTLS_AESCE_C + * + * Enable AES cryptographic extension support on Armv8. + * + * Module: library/aesce.c + * Caller: library/aes.c + * + * Requires: MBEDTLS_AES_C + * + * \warning Runtime detection only works on Linux. For non-Linux operating + * system, Armv8-A Cryptographic Extensions must be supported by + * the CPU when this option is enabled. + * + * \note Minimum compiler versions for this feature when targeting aarch64 + * are Clang 4.0; armclang 6.6; GCC 6.0; or MSVC 2019 version 16.11.2. + * Minimum compiler versions for this feature when targeting 32-bit + * Arm or Thumb are Clang 11.0; armclang 6.20; or GCC 6.0. + * + * \note \c CFLAGS must be set to a minimum of \c -march=armv8-a+crypto for + * armclang <= 6.9 + * + * This module adds support for the AES Armv8-A Cryptographic Extensions on Armv8 systems. + */ +#define MBEDTLS_AESCE_C + /** * \def MBEDTLS_AES_C * @@ -2125,6 +2468,28 @@ */ #define MBEDTLS_BASE64_C +/** + * \def MBEDTLS_BLOCK_CIPHER_NO_DECRYPT + * + * Remove decryption operation for AES, ARIA and Camellia block cipher. + * + * \note This feature is incompatible with insecure block cipher, + * MBEDTLS_DES_C, and cipher modes which always require decryption + * operation, MBEDTLS_CIPHER_MODE_CBC, MBEDTLS_CIPHER_MODE_XTS and + * MBEDTLS_NIST_KW_C. When #MBEDTLS_PSA_CRYPTO_CONFIG is enabled, + * this feature is incompatible with following supported PSA equivalence, + * PSA_WANT_ALG_ECB_NO_PADDING, PSA_WANT_ALG_CBC_NO_PADDING, + * PSA_WANT_ALG_CBC_PKCS7 and PSA_WANT_KEY_TYPE_DES. + * + * Module: library/aes.c + * library/aesce.c + * library/aesni.c + * library/aria.c + * library/camellia.c + * library/cipher.c + */ +// #define MBEDTLS_BLOCK_CIPHER_NO_DECRYPT + /** * \def MBEDTLS_BIGNUM_C * @@ -2304,6 +2669,8 @@ * library/ssl_ciphersuites.c * library/ssl_msg.c * library/ssl_ticket.c (unless MBEDTLS_USE_PSA_CRYPTO is enabled) + * Auto-enabled by: MBEDTLS_PSA_CRYPTO_C depending on which ciphers are enabled + * (see the documentation of that option for details). * * Uncomment to enable generic cipher wrappers. */ @@ -2334,6 +2701,15 @@ * The CTR_DRBG generator uses AES-256 by default. * To use AES-128 instead, enable \c MBEDTLS_CTR_DRBG_USE_128_BIT_KEY above. * + * AES support can either be achieved through builtin (MBEDTLS_AES_C) or PSA. + * Builtin is the default option when MBEDTLS_AES_C is defined otherwise PSA + * is used. + * + * \warning When using PSA, the user should call `psa_crypto_init()` before + * using any CTR_DRBG operation (except `mbedtls_ctr_drbg_init()`). + * + * \note AES-128 will be used if \c MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH is set. + * * \note To achieve a 256-bit security strength with CTR_DRBG, * you must use AES-256 *and* use sufficient entropy. * See ctr_drbg.h for more details. @@ -2341,7 +2717,9 @@ * Module: library/ctr_drbg.c * Caller: * - * Requires: MBEDTLS_AES_C + * Requires: MBEDTLS_AES_C or + * (PSA_WANT_KEY_TYPE_AES and PSA_WANT_ALG_ECB_NO_PADDING and + * MBEDTLS_PSA_CRYPTO_C) * * This module provides the CTR_DRBG AES random number generator. */ @@ -2373,7 +2751,7 @@ * * PEM_PARSE uses DES/3DES for decrypting encrypted keys. * - * \warning DES is considered a weak cipher and its use constitutes a + * \warning DES/3DES are considered weak ciphers and their use constitutes a * security risk. We recommend considering stronger ciphers instead. */ // #define MBEDTLS_DES_C @@ -2452,13 +2830,8 @@ * * Requires: MBEDTLS_ECP_C and either MBEDTLS_MD_C or MBEDTLS_PSA_CRYPTO_C * - * \warning If building without MBEDTLS_MD_C, you must call psa_crypto_init() - * before doing any EC J-PAKE operations. - * - * \warning When building with MBEDTLS_MD_C, all hashes used with this - * need to be available as built-ins (that is, for SHA-256, MBEDTLS_SHA256_C, - * etc.) as opposed to just PSA drivers. So far, PSA drivers are only used by - * this module in builds where MBEDTLS_MD_C is disabled. + * \warning If using a hash that is only provided by PSA drivers, you must + * call psa_crypto_init() before doing any EC J-PAKE operations. */ // #define MBEDTLS_ECJPAKE_C @@ -2517,6 +2890,22 @@ */ #define MBEDTLS_GCM_C +/** + * \def MBEDTLS_GCM_LARGE_TABLE + * + * Enable large pre-computed tables for Galois/Counter Mode (GCM). + * Can significantly increase throughput on systems without GCM hardware + * acceleration (e.g., AESNI, AESCE). + * + * The mbedtls_gcm_context size will increase by 3840 bytes. + * The code size will increase by roughly 344 bytes. + * + * Module: library/gcm.c + * + * Requires: MBEDTLS_GCM_C + */ +// #define MBEDTLS_GCM_LARGE_TABLE + /** * \def MBEDTLS_HKDF_C * @@ -2588,11 +2977,12 @@ /** * \def MBEDTLS_MD_C * - * Enable the generic message digest layer. + * Enable the generic layer for message digest (hashing) and HMAC. * * Requires: one of: MBEDTLS_MD5_C, MBEDTLS_RIPEMD160_C, MBEDTLS_SHA1_C, * MBEDTLS_SHA224_C, MBEDTLS_SHA256_C, MBEDTLS_SHA384_C, - * MBEDTLS_SHA512_C. + * MBEDTLS_SHA512_C, or MBEDTLS_PSA_CRYPTO_C with at least + * one hash. * Module: library/md.c * Caller: library/constant_time.c * library/ecdsa.c @@ -2723,6 +3113,10 @@ * library/x509_csr.c * * Requires: MBEDTLS_BASE64_C + * optionally MBEDTLS_MD5_C, or PSA Crypto with MD5 (see below) + * + * \warning When parsing password-protected files, if MD5 is provided only by + * a PSA driver, you must call psa_crypto_init() before the first file. * * This modules adds support for decoding / parsing PEM files. */ @@ -2771,7 +3165,7 @@ * Caller: library/x509_crt.c * library/x509_csr.c * - * Requires: MBEDTLS_PK_C + * Requires: MBEDTLS_ASN1_PARSE_C, MBEDTLS_OID_C, MBEDTLS_PK_C * * Uncomment to enable generic public key parse functions. */ @@ -2785,7 +3179,7 @@ * Module: library/pkwrite.c * Caller: library/x509write.c * - * Requires: MBEDTLS_PK_C + * Requires: MBEDTLS_ASN1_WRITE_C, MBEDTLS_OID_C, MBEDTLS_PK_C * * Uncomment to enable generic public key write functions. */ @@ -2798,15 +3192,10 @@ * * Module: library/pkcs5.c * - * Requires: MBEDTLS_CIPHER_C and either MBEDTLS_MD_C or MBEDTLS_PSA_CRYPTO_C. - * - * \warning If building without MBEDTLS_MD_C, you must call psa_crypto_init() - * before doing any PKCS5 operation. + * Auto-enables: MBEDTLS_MD_C * - * \warning When building with MBEDTLS_MD_C, all hashes used with this - * need to be available as built-ins (that is, for SHA-256, MBEDTLS_SHA256_C, - * etc.) as opposed to just PSA drivers. So far, PSA drivers are only used by - * this module in builds where MBEDTLS_MD_C is disabled. + * \warning If using a hash that is only provided by PSA drivers, you must + * call psa_crypto_init() before doing any PKCS5 operations. * * This module adds support for the PKCS#5 functions. */ @@ -2815,11 +3204,7 @@ /** * \def MBEDTLS_PKCS7_C * - * This feature is a work in progress and not ready for production. Testing and - * validation is incomplete, and handling of malformed inputs may not be robust. - * The API may change. - * - * Enable PKCS7 core for using PKCS7 formatted signatures. + * Enable PKCS #7 core for using PKCS #7-formatted signatures. * RFC Link - https://tools.ietf.org/html/rfc2315 * * Module: library/pkcs7.c @@ -2828,7 +3213,7 @@ * MBEDTLS_X509_CRT_PARSE_C MBEDTLS_X509_CRL_PARSE_C, * MBEDTLS_BIGNUM_C, MBEDTLS_MD_C * - * This module is required for the PKCS7 parsing modules. + * This module is required for the PKCS #7 parsing modules. */ #define MBEDTLS_PKCS7_C @@ -2841,20 +3226,15 @@ * Module: library/pkcs12.c * Caller: library/pkparse.c * - * Requires: MBEDTLS_ASN1_PARSE_C, MBEDTLS_CIPHER_C and either - * MBEDTLS_MD_C or MBEDTLS_PSA_CRYPTO_C. + * Requires: MBEDTLS_ASN1_PARSE_C and either MBEDTLS_MD_C or + * MBEDTLS_PSA_CRYPTO_C. * - * \warning If building without MBEDTLS_MD_C, you must call psa_crypto_init() - * before doing any PKCS12 operation. - * - * \warning When building with MBEDTLS_MD_C, all hashes used with this - * need to be available as built-ins (that is, for SHA-256, MBEDTLS_SHA256_C, - * etc.) as opposed to just PSA drivers. So far, PSA drivers are only used by - * this module in builds where MBEDTLS_MD_C is disabled. + * \warning If using a hash that is only provided by PSA drivers, you must + * call psa_crypto_init() before doing any PKCS12 operations. * * This module enables PKCS#12 functions. */ -// #define MBEDTLS_PKCS12_C +#define MBEDTLS_PKCS12_C /** * \def MBEDTLS_PLATFORM_C @@ -2889,15 +3269,27 @@ /** * \def MBEDTLS_PSA_CRYPTO_C * - * Enable the Platform Security Architecture cryptography API. + * Enable the Platform Security Architecture (PSA) cryptography API. + * + * \note In multithreaded applications, you must enable #MBEDTLS_THREADING_C, + * unless only one thread ever calls `psa_xxx()` functions. + * That includes indirect calls, such as: + * - performing a TLS handshake if support for TLS 1.3 is enabled; + * - using a TLS 1.3 connection; + * - indirect calls from PK, X.509 or SSL functions when + * #MBEDTLS_USE_PSA_CRYPTO is enabled; + * - indirect calls to calculate a hash when #MBEDTLS_MD_C is disabled; + * - any other call to a function that requires calling psa_crypto_init() + * beforehand. * * Module: library/psa_crypto.c * - * Requires: MBEDTLS_CIPHER_C, - * either MBEDTLS_CTR_DRBG_C and MBEDTLS_ENTROPY_C, + * Requires: either MBEDTLS_CTR_DRBG_C and MBEDTLS_ENTROPY_C, * or MBEDTLS_HMAC_DRBG_C and MBEDTLS_ENTROPY_C, * or MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG. - * + * Auto-enables: MBEDTLS_CIPHER_C if any unauthenticated (ie, non-AEAD) cipher + * is enabled in PSA (unless it's fully accelerated, see + * docs/driver-only-builds.md about that). */ // #define MBEDTLS_PSA_CRYPTO_C @@ -2907,8 +3299,11 @@ * Enable dynamic secure element support in the Platform Security Architecture * cryptography API. * - * \deprecated This feature is deprecated. Please switch to the driver - * interface enabled by #MBEDTLS_PSA_CRYPTO_DRIVERS. + * \deprecated This feature is deprecated. Please switch to the PSA driver + * interface. + * + * \warning This feature is not thread-safe, and should not be used in a + * multi-threaded environment. * * Module: library/psa_crypto_se.c * @@ -2942,6 +3337,26 @@ */ // #define MBEDTLS_PSA_ITS_FILE_C +/** + * \def MBEDTLS_PSA_STATIC_KEY_SLOTS + * + * Statically preallocate memory to store keys' material in PSA instead + * of allocating it dynamically when required. This allows builds without a + * heap, if none of the enabled cryptographic implementations or other features + * require it. + * This feature affects both volatile and persistent keys which means that + * it's not possible to persistently store a key which is larger than + * #MBEDTLS_PSA_STATIC_KEY_SLOT_BUFFER_SIZE. + * + * \note This feature comes with a (potentially) higher RAM usage since: + * - All the key slots are allocated no matter if they are used or not. + * - Each key buffer's length is #MBEDTLS_PSA_STATIC_KEY_SLOT_BUFFER_SIZE bytes. + * + * Requires: MBEDTLS_PSA_CRYPTO_C + * + */ +// #define MBEDTLS_PSA_STATIC_KEY_SLOTS + /** * \def MBEDTLS_RIPEMD160_C * @@ -2997,9 +3412,6 @@ * * Enable the SHA-224 cryptographic hash algorithm. * - * Requires: MBEDTLS_SHA256_C. The library does not currently support enabling - * SHA-224 without SHA-256. - * * Module: library/sha256.c * Caller: library/md.c * library/ssl_cookie.c @@ -3013,9 +3425,6 @@ * * Enable the SHA-256 cryptographic hash algorithm. * - * Requires: MBEDTLS_SHA224_C. The library does not currently support enabling - * SHA-256 without SHA-224. - * * Module: library/sha256.c * Caller: library/entropy.c * library/md.c @@ -3029,53 +3438,85 @@ #define MBEDTLS_SHA256_C /** - * \def MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT + * \def MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT * * Enable acceleration of the SHA-256 and SHA-224 cryptographic hash algorithms * with the ARMv8 cryptographic extensions if they are available at runtime. * If not, the library will fall back to the C implementation. * - * \note If MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT is defined when building - * for a non-Aarch64 build it will be silently ignored. + * \note If MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT is defined when building + * for a non-Armv8-A build it will be silently ignored. + * + * \note Minimum compiler versions for this feature are Clang 4.0, + * armclang 6.6 or GCC 6.0. + * + * \note \c CFLAGS must be set to a minimum of \c -march=armv8-a+crypto for + * armclang <= 6.9 * - * \note The code uses Neon intrinsics, so \c CFLAGS must be set to a minimum - * of \c -march=armv8-a+crypto. + * \note This was previously known as MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT. + * That name is deprecated, but may still be used as an alternative form for this + * option. * - * \warning MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT cannot be defined at the - * same time as MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY. + * \warning MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT cannot be defined at the + * same time as MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY. * * Requires: MBEDTLS_SHA256_C. * * Module: library/sha256.c * - * Uncomment to have the library check for the A64 SHA-256 crypto extensions + * Uncomment to have the library check for the Armv8-A SHA-256 crypto extensions * and use them if available. */ +// #define MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT + +/** + * \def MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT + * + * \deprecated This is now known as MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT. + * This name is now deprecated, but may still be used as an alternative form for + * this option. + */ // #define MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT /** - * \def MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY + * \def MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY * * Enable acceleration of the SHA-256 and SHA-224 cryptographic hash algorithms * with the ARMv8 cryptographic extensions, which must be available at runtime * or else an illegal instruction fault will occur. * * \note This allows builds with a smaller code size than with - * MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT + * MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT + * + * \note Minimum compiler versions for this feature are Clang 4.0, + * armclang 6.6 or GCC 6.0. + * + * \note \c CFLAGS must be set to a minimum of \c -march=armv8-a+crypto for + * armclang <= 6.9 * - * \note The code uses Neon intrinsics, so \c CFLAGS must be set to a minimum - * of \c -march=armv8-a+crypto. + * \note This was previously known as MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY. + * That name is deprecated, but may still be used as an alternative form for this + * option. * - * \warning MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY cannot be defined at the same - * time as MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT. + * \warning MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY cannot be defined at the same + * time as MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_IF_PRESENT. * * Requires: MBEDTLS_SHA256_C. * * Module: library/sha256.c * - * Uncomment to have the library use the A64 SHA-256 crypto extensions + * Uncomment to have the library use the Armv8-A SHA-256 crypto extensions * unconditionally. */ +// #define MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY + +/** + * \def MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY + * + * \deprecated This is now known as MBEDTLS_SHA256_USE_ARMV8_A_CRYPTO_ONLY. + * This name is now deprecated, but may still be used as an alternative form for + * this option. + */ // #define MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY /** @@ -3083,8 +3524,6 @@ * * Enable the SHA-384 cryptographic hash algorithm. * - * Requires: MBEDTLS_SHA512_C - * * Module: library/sha512.c * Caller: library/md.c * library/psa_crypto_hash.c @@ -3111,6 +3550,17 @@ */ #define MBEDTLS_SHA512_C +/** + * \def MBEDTLS_SHA3_C + * + * Enable the SHA3 cryptographic hash algorithm. + * + * Module: library/sha3.c + * + * This module adds support for SHA3. + */ +#define MBEDTLS_SHA3_C + /** * \def MBEDTLS_SHA512_USE_A64_CRYPTO_IF_PRESENT * @@ -3121,10 +3571,11 @@ * \note If MBEDTLS_SHA512_USE_A64_CRYPTO_IF_PRESENT is defined when building * for a non-Aarch64 build it will be silently ignored. * - * \note The code uses the SHA-512 Neon intrinsics, so requires GCC >= 8 or - * Clang >= 7, and \c CFLAGS must be set to a minimum of - * \c -march=armv8.2-a+sha3. An optimisation level of \c -O3 generates the - * fastest code. + * \note Minimum compiler versions for this feature are Clang 7.0, + * armclang 6.9 or GCC 8.0. + * + * \note \c CFLAGS must be set to a minimum of \c -march=armv8.2-a+sha3 for + * armclang 6.9 * * \warning MBEDTLS_SHA512_USE_A64_CRYPTO_IF_PRESENT cannot be defined at the * same time as MBEDTLS_SHA512_USE_A64_CRYPTO_ONLY. @@ -3148,10 +3599,11 @@ * \note This allows builds with a smaller code size than with * MBEDTLS_SHA512_USE_A64_CRYPTO_IF_PRESENT * - * \note The code uses the SHA-512 Neon intrinsics, so requires GCC >= 8 or - * Clang >= 7, and \c CFLAGS must be set to a minimum of - * \c -march=armv8.2-a+sha3. An optimisation level of \c -O3 generates the - * fastest code. + * \note Minimum compiler versions for this feature are Clang 7.0, + * armclang 6.9 or GCC 8.0. + * + * \note \c CFLAGS must be set to a minimum of \c -march=armv8.2-a+sha3 for + * armclang 6.9 * * \warning MBEDTLS_SHA512_USE_A64_CRYPTO_ONLY cannot be defined at the same * time as MBEDTLS_SHA512_USE_A64_CRYPTO_IF_PRESENT. @@ -3248,10 +3700,38 @@ * \def MBEDTLS_THREADING_C * * Enable the threading abstraction layer. - * By default mbed TLS assumes it is used in a non-threaded environment or that - * contexts are not shared between threads. If you do intend to use contexts + * + * Traditionally, Mbed TLS assumes it is used in a non-threaded environment or + * that contexts are not shared between threads. If you do intend to use contexts * between threads, you will need to enable this layer to prevent race - * conditions. See also our Knowledge Base article about threading: + * conditions. + * + * The PSA subsystem has an implicit shared context. Therefore, you must + * enable this option if more than one thread may use any part of + * Mbed TLS that is implemented on top of the PSA subsystem. + * + * You must enable this option in multithreaded applications where more than + * one thread performs any of the following operations: + * + * - Any call to a PSA function (`psa_xxx()`). + * - Any call to a TLS, X.509 or PK function (`mbedtls_ssl_xxx()`, + * `mbedtls_x509_xxx()`, `mbedtls_pkcs7_xxx()`, `mbedtls_pk_xxx()`) + * if `MBEDTLS_USE_PSA_CRYPTO` is enabled (regardless of whether individual + * TLS, X.509 or PK contexts are shared between threads). + * - A TLS 1.3 connection, regardless of the compile-time configuration. + * - Any library feature that calculates a hash, if `MBEDTLS_MD_C` is disabled. + * As an exception, algorithm-specific low-level modules do not require + * threading protection unless the contexts are shared between threads. + * - Any library feature that performs symmetric encryption or decryption, + * if `MBEDTLS_CIPHER_C` is disabled. + * As an exception, algorithm-specific low-level modules do not require + * threading protection unless the contexts are shared between threads. + * - Any use of a cryptographic context if the same context is used in + * multiple threads. + * - Any call to a function where the documentation specifies that + * psa_crypto_init() must be called prior to that function. + * + * See also our Knowledge Base article about threading: * https://mbed-tls.readthedocs.io/en/latest/kb/development/thread-safety-and-multi-threading * * Module: library/threading.c @@ -3408,7 +3888,7 @@ */ #define MBEDTLS_X509_CSR_WRITE_C -/** \} name SECTION: mbed TLS modules */ +/** \} name SECTION: Mbed TLS modules */ /** * \name SECTION: General configuration options @@ -3490,6 +3970,53 @@ */ // #define MBEDTLS_PSA_CRYPTO_USER_CONFIG_FILE "/dev/null" +/** + * \def MBEDTLS_PSA_CRYPTO_PLATFORM_FILE + * + * If defined, this is a header which will be included instead of + * `"psa/crypto_platform.h"`. This file should declare the same identifiers + * as the one in Mbed TLS, but with definitions adapted to the platform on + * which the library code will run. + * + * \note The required content of this header can vary from one version of + * Mbed TLS to the next. Integrators who provide an alternative file + * should review the changes in the original file whenever they + * upgrade Mbed TLS. + * + * This macro is expanded after an \#include directive. This is a popular but + * non-standard feature of the C language, so this feature is only available + * with compilers that perform macro expansion on an \#include line. + * + * The value of this symbol is typically a path in double quotes, either + * absolute or relative to a directory on the include search path. + */ +// #define MBEDTLS_PSA_CRYPTO_PLATFORM_FILE "psa/crypto_platform_alt.h" + +/** + * \def MBEDTLS_PSA_CRYPTO_STRUCT_FILE + * + * If defined, this is a header which will be included instead of + * `"psa/crypto_struct.h"`. This file should declare the same identifiers + * as the one in Mbed TLS, but with definitions adapted to the environment + * in which the library code will run. The typical use for this feature + * is to provide alternative type definitions on the client side in + * client-server integrations of PSA crypto, where operation structures + * contain handles instead of cryptographic data. + * + * \note The required content of this header can vary from one version of + * Mbed TLS to the next. Integrators who provide an alternative file + * should review the changes in the original file whenever they + * upgrade Mbed TLS. + * + * This macro is expanded after an \#include directive. This is a popular but + * non-standard feature of the C language, so this feature is only available + * with compilers that perform macro expansion on an \#include line. + * + * The value of this symbol is typically a path in double quotes, either + * absolute or relative to a directory on the include search path. + */ +// #define MBEDTLS_PSA_CRYPTO_STRUCT_FILE "psa/crypto_struct_alt.h" + /** \} name SECTION: General configuration options */ /** @@ -3542,8 +4069,29 @@ /* Platform options */ // #define MBEDTLS_PLATFORM_STD_MEM_HDR /**< Header to include if MBEDTLS_PLATFORM_NO_STD_FUNCTIONS is defined. Don't define if no header is needed. */ -// #define MBEDTLS_PLATFORM_STD_CALLOC calloc /**< Default allocator to use, can be undefined */ -// #define MBEDTLS_PLATFORM_STD_FREE free /**< Default free to use, can be undefined */ + +/** \def MBEDTLS_PLATFORM_STD_CALLOC + * + * Default allocator to use, can be undefined. + * It must initialize the allocated buffer memory to zeroes. + * The size of the buffer is the product of the two parameters. + * The calloc function returns either a null pointer or a pointer to the allocated space. + * If the product is 0, the function may either return NULL or a valid pointer to an array of size 0 which is a valid input to the deallocation function. + * An uninitialized #MBEDTLS_PLATFORM_STD_CALLOC always fails, returning a null pointer. + * See the description of #MBEDTLS_PLATFORM_MEMORY for more details. + * The corresponding deallocation function is #MBEDTLS_PLATFORM_STD_FREE. + */ +// #define MBEDTLS_PLATFORM_STD_CALLOC calloc + +/** \def MBEDTLS_PLATFORM_STD_FREE + * + * Default free to use, can be undefined. + * NULL is a valid parameter, and the function must do nothing. + * A non-null parameter will always be a pointer previously returned by #MBEDTLS_PLATFORM_STD_CALLOC and not yet freed. + * An uninitialized #MBEDTLS_PLATFORM_STD_FREE does not do anything. + * See the description of #MBEDTLS_PLATFORM_MEMORY for more details (same principles as for MBEDTLS_PLATFORM_STD_CALLOC apply). + */ +// #define MBEDTLS_PLATFORM_STD_FREE free // #define MBEDTLS_PLATFORM_STD_SETBUF setbuf /**< Default setbuf to use, can be undefined */ // #define MBEDTLS_PLATFORM_STD_EXIT exit /**< Default exit to use, can be undefined */ // #define MBEDTLS_PLATFORM_STD_TIME time /**< Default time to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ @@ -3557,10 +4105,10 @@ // #define MBEDTLS_PLATFORM_STD_NV_SEED_WRITE mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function to use, can be undefined */ // #define MBEDTLS_PLATFORM_STD_NV_SEED_FILE "seedfile" /**< Seed file to read/write with default implementation */ -/* To Use Function Macros MBEDTLS_PLATFORM_C must be enabled */ +/* To use the following function macros, MBEDTLS_PLATFORM_C must be enabled. */ /* MBEDTLS_PLATFORM_XXX_MACRO and MBEDTLS_PLATFORM_XXX_ALT cannot both be defined */ -// #define MBEDTLS_PLATFORM_CALLOC_MACRO calloc /**< Default allocator macro to use, can be undefined */ -// #define MBEDTLS_PLATFORM_FREE_MACRO free /**< Default free macro to use, can be undefined */ +// #define MBEDTLS_PLATFORM_CALLOC_MACRO calloc /**< Default allocator macro to use, can be undefined. See MBEDTLS_PLATFORM_STD_CALLOC for requirements. */ +// #define MBEDTLS_PLATFORM_FREE_MACRO free /**< Default free macro to use, can be undefined. See MBEDTLS_PLATFORM_STD_FREE for requirements. */ // #define MBEDTLS_PLATFORM_EXIT_MACRO exit /**< Default exit macro to use, can be undefined */ // #define MBEDTLS_PLATFORM_SETBUF_MACRO setbuf /**< Default setbuf macro to use, can be undefined */ // #define MBEDTLS_PLATFORM_TIME_MACRO time /**< Default time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ @@ -3572,6 +4120,8 @@ // #define MBEDTLS_PLATFORM_VSNPRINTF_MACRO vsnprintf /**< Default vsnprintf macro to use, can be undefined */ // #define MBEDTLS_PLATFORM_NV_SEED_READ_MACRO mbedtls_platform_std_nv_seed_read /**< Default nv_seed_read function to use, can be undefined */ // #define MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function to use, can be undefined */ +#define MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO ms_time_t // #define MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO int64_t /**< Default milliseconds time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled. It must be signed, and at least 64 bits. If it is changed from the default, MBEDTLS_PRINTF_MS_TIME must be updated to match.*/ +// #define MBEDTLS_PRINTF_MS_TIME PRId64 /**< Default fmt for printf. That's avoid compiler warning if mbedtls_ms_time_t is redefined */ extern int my_printf ( @@ -3636,25 +4186,57 @@ mbedtls_free ( * Use HMAC_DRBG with the specified hash algorithm for HMAC_DRBG for the * PSA crypto subsystem. * - * If this option is unset: - * - If CTR_DRBG is available, the PSA subsystem uses it rather than HMAC_DRBG. - * - Otherwise, the PSA subsystem uses HMAC_DRBG with either - * #MBEDTLS_MD_SHA512 or #MBEDTLS_MD_SHA256 based on availability and - * on unspecified heuristics. + * If this option is unset, the library chooses a hash (currently between + * #MBEDTLS_MD_SHA512 and #MBEDTLS_MD_SHA256) based on availability and + * unspecified heuristics. + * + * \note The PSA crypto subsystem uses the first available mechanism amongst + * the following: + * - #MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG if enabled; + * - Entropy from #MBEDTLS_ENTROPY_C plus CTR_DRBG with AES + * if #MBEDTLS_CTR_DRBG_C is enabled; + * - Entropy from #MBEDTLS_ENTROPY_C plus HMAC_DRBG. + * + * A future version may reevaluate the prioritization of DRBG mechanisms. */ // #define MBEDTLS_PSA_HMAC_DRBG_MD_TYPE MBEDTLS_MD_SHA256 /** \def MBEDTLS_PSA_KEY_SLOT_COUNT - * Restrict the PSA library to supporting a maximum amount of simultaneously - * loaded keys. A loaded key is a key stored by the PSA Crypto core as a - * volatile key, or a persistent key which is loaded temporarily by the - * library as part of a crypto operation in flight. * - * If this option is unset, the library will fall back to a default value of - * 32 keys. + * When #MBEDTLS_PSA_KEY_STORE_DYNAMIC is disabled, + * the maximum amount of PSA keys simultaneously in memory. This counts all + * volatile keys, plus loaded persistent keys. + * + * When #MBEDTLS_PSA_KEY_STORE_DYNAMIC is enabled, + * the maximum number of loaded persistent keys. + * + * Currently, persistent keys do not need to be loaded all the time while + * a multipart operation is in progress, only while the operation is being + * set up. This may change in future versions of the library. + * + * Currently, the library traverses of the whole table on each access to a + * persistent key. Therefore large values may cause poor performance. + * + * This option has no effect when #MBEDTLS_PSA_CRYPTO_C is disabled. */ // #define MBEDTLS_PSA_KEY_SLOT_COUNT 32 +/** + * \def MBEDTLS_PSA_STATIC_KEY_SLOT_BUFFER_SIZE + * + * Define the size (in bytes) of each static key buffer when + * #MBEDTLS_PSA_STATIC_KEY_SLOTS is set. If not + * explicitly defined then it's automatically guessed from available PSA keys + * enabled in the build through PSA_WANT_xxx symbols. + * If required by the application this parameter can be set to higher values + * in order to store larger objects (ex: raw keys), but please note that this + * will increase RAM usage. + */ +// #define MBEDTLS_PSA_STATIC_KEY_SLOT_BUFFER_SIZE 256 + +/* RSA OPTIONS */ +// #define MBEDTLS_RSA_GEN_KEY_MIN_BITS 1024 /**< Minimum RSA key size that can be generated in bits (Minimum possible value is 128 bits) */ + /* SSL Cache options */ // #define MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT 86400 /**< 1 day */ // #define MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES 50 /**< Maximum entries in cache */ @@ -3749,7 +4331,7 @@ mbedtls_free ( */ // #define MBEDTLS_SSL_DTLS_MAX_BUFFERING 32768 -// #define MBEDTLS_PSK_MAX_LEN 32 /**< Max size of TLS pre-shared keys, in bytes (default 256 bits) */ +// #define MBEDTLS_PSK_MAX_LEN 32 /**< Max size of TLS pre-shared keys, in bytes (default 256 or 384 bits) */ // #define MBEDTLS_SSL_COOKIE_TIMEOUT 60 /**< Default expiration delay of DTLS cookies, in seconds if HAVE_TIME, or in number of cookies issued */ /** @@ -3766,57 +4348,64 @@ mbedtls_free ( */ // #define MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 -/* X509 options */ -// #define MBEDTLS_X509_MAX_INTERMEDIATE_CA 8 /**< Maximum number of intermediate CAs in a verification chain. */ -// #define MBEDTLS_X509_MAX_FILE_PATH_LEN 512 /**< Maximum length of a path/filename string in bytes including the null terminator character ('\0'). */ +/** + * \def MBEDTLS_SSL_MAX_EARLY_DATA_SIZE + * + * The default maximum amount of 0-RTT data. See the documentation of + * \c mbedtls_ssl_conf_max_early_data_size() for more information. + * + * It must be positive and smaller than UINT32_MAX. + * + * If MBEDTLS_SSL_EARLY_DATA is not defined, this default value does not + * have any impact on the build. + */ +// #define MBEDTLS_SSL_MAX_EARLY_DATA_SIZE 1024 /** - * Uncomment the macro to let mbed TLS use your alternate implementation of - * mbedtls_platform_zeroize(). This replaces the default implementation in - * platform_util.c. + * \def MBEDTLS_SSL_TLS1_3_TICKET_AGE_TOLERANCE + * + * Maximum allowed ticket age difference in milliseconds tolerated between + * server and client. Default value is 6000. This is not used in TLS 1.2. * - * mbedtls_platform_zeroize() is a widely used function across the library to - * zero a block of memory. The implementation is expected to be secure in the - * sense that it has been written to prevent the compiler from removing calls - * to mbedtls_platform_zeroize() as part of redundant code elimination - * optimizations. However, it is difficult to guarantee that calls to - * mbedtls_platform_zeroize() will not be optimized by the compiler as older - * versions of the C language standards do not provide a secure implementation - * of memset(). Therefore, MBEDTLS_PLATFORM_ZEROIZE_ALT enables users to - * configure their own implementation of mbedtls_platform_zeroize(), for - * example by using directives specific to their compiler, features from newer - * C standards (e.g using memset_s() in C11) or calling a secure memset() from - * their system (e.g explicit_bzero() in BSD). + * - The client ticket age is the time difference between the time when the + * client proposes to the server to use the ticket and the time the client + * received the ticket from the server. + * - The server ticket age is the time difference between the time when the + * server receives a proposition from the client to use the ticket and the + * time when the ticket was created by the server. + * + * The ages might be different due to the client and server clocks not running + * at the same pace. The typical accuracy of an RTC crystal is ±100 to ±20 parts + * per million (360 to 72 milliseconds per hour). Default tolerance window is + * 6s, thus in the worst case clients and servers must sync up their system time + * every 6000/360/2~=8 hours. + * + * See section 8.3 of the TLS 1.3 specification(RFC 8446) for more information. */ -// #define MBEDTLS_PLATFORM_ZEROIZE_ALT +// #define MBEDTLS_SSL_TLS1_3_TICKET_AGE_TOLERANCE 6000 /** - * Uncomment the macro to let Mbed TLS use your alternate implementation of - * mbedtls_platform_gmtime_r(). This replaces the default implementation in - * platform_util.c. + * \def MBEDTLS_SSL_TLS1_3_TICKET_NONCE_LENGTH * - * gmtime() is not a thread-safe function as defined in the C standard. The - * library will try to use safer implementations of this function, such as - * gmtime_r() when available. However, if Mbed TLS cannot identify the target - * system, the implementation of mbedtls_platform_gmtime_r() will default to - * using the standard gmtime(). In this case, calls from the library to - * gmtime() will be guarded by the global mutex mbedtls_threading_gmtime_mutex - * if MBEDTLS_THREADING_C is enabled. We recommend that calls from outside the - * library are also guarded with this mutex to avoid race conditions. However, - * if the macro MBEDTLS_PLATFORM_GMTIME_R_ALT is defined, Mbed TLS will - * unconditionally use the implementation for mbedtls_platform_gmtime_r() - * supplied at compile time. + * Size in bytes of a ticket nonce. This is not used in TLS 1.2. + * + * This must be less than 256. */ -// #define MBEDTLS_PLATFORM_GMTIME_R_ALT +// #define MBEDTLS_SSL_TLS1_3_TICKET_NONCE_LENGTH 32 /** - * Enable the verified implementations of ECDH primitives from Project Everest - * (currently only Curve25519). This feature changes the layout of ECDH - * contexts and therefore is a compatibility break for applications that access - * fields of a mbedtls_ecdh_context structure directly. See also - * MBEDTLS_ECDH_LEGACY_CONTEXT in include/mbedtls/ecdh.h. + * \def MBEDTLS_SSL_TLS1_3_DEFAULT_NEW_SESSION_TICKETS + * + * Default number of NewSessionTicket messages to be sent by a TLS 1.3 server + * after handshake completion. This is not used in TLS 1.2 and relevant only if + * the MBEDTLS_SSL_SESSION_TICKETS option is enabled. + * */ -// #define MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED +// #define MBEDTLS_SSL_TLS1_3_DEFAULT_NEW_SESSION_TICKETS 1 + +/* X509 options */ +// #define MBEDTLS_X509_MAX_INTERMEDIATE_CA 8 /**< Maximum number of intermediate CAs in a verification chain. */ +// #define MBEDTLS_X509_MAX_FILE_PATH_LEN 512 /**< Maximum length of a path/filename string in bytes including the null terminator character ('\0'). */ /** \} name SECTION: Module configuration options */ diff --git a/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf b/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf index 206ae29b1cf4..bc78fc2d997f 100644 --- a/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf +++ b/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf @@ -44,7 +44,8 @@ mbedtls/library/ssl_client.c mbedtls/library/ssl_debug_helpers_generated.c mbedtls/library/rsa_alt_helpers.c - mbedtls/library/hash_info.c + mbedtls/library/pk_ecc.c + mbedtls/library/x509write.c mbedtls/library/bignum_core.c mbedtls/library/constant_time.c mbedtls/library/memory_buffer_alloc.c @@ -62,6 +63,7 @@ mbedtls/library/ripemd160.c mbedtls/library/rsa.c mbedtls/library/sha1.c + mbedtls/library/sha3.c mbedtls/library/sha256.c mbedtls/library/sha512.c mbedtls/library/ssl_cache.c @@ -101,9 +103,11 @@ # warning C4245: '=': conversion from 'int' to 'mbedtls_mpi_uint', signed/unsigned mismatch # warning C4310: cast truncates constant value # warning C4204: nonstandard extension used + # warning C4389: '==': signed/unsigned mismatch + # /U_WIN32 : Avoid redfineded with WIN API # - MSFT:*_*_IA32_CC_FLAGS = /DEFI32 /wd4244 /wd4132 /wd4245 /wd4310 /wd4204 - MSFT:*_*_X64_CC_FLAGS = /DEFI32 /wd4244 /wd4132 /wd4245 /wd4310 /wd4204 + MSFT:*_*_IA32_CC_FLAGS = /U_WIN32 /DEFI32 /wd4244 /wd4132 /wd4245 /wd4310 /wd4204 /wd4389 + MSFT:*_*_X64_CC_FLAGS = /U_WIN32 /DEFI32 /wd4244 /wd4132 /wd4245 /wd4310 /wd4204 /wd4389 # # Disable following Visual Studio 2015 compiler warnings brought by mbedtls source, diff --git a/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf b/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf index a9bc2c6be014..3dd8303864cc 100644 --- a/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf +++ b/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf @@ -48,7 +48,8 @@ mbedtls/library/ssl_client.c mbedtls/library/ssl_debug_helpers_generated.c mbedtls/library/rsa_alt_helpers.c - mbedtls/library/hash_info.c + mbedtls/library/pk_ecc.c + mbedtls/library/x509write.c mbedtls/library/bignum_core.c mbedtls/library/constant_time.c mbedtls/library/memory_buffer_alloc.c @@ -66,6 +67,7 @@ mbedtls/library/ripemd160.c mbedtls/library/rsa.c mbedtls/library/sha1.c + mbedtls/library/sha3.c mbedtls/library/sha256.c mbedtls/library/sha512.c mbedtls/library/ssl_cache.c @@ -105,9 +107,12 @@ # warning C4245: '=': conversion from 'int' to 'mbedtls_mpi_uint', signed/unsigned mismatch # warning C4310: cast truncates constant value # warning C4204: nonstandard extension used + # warning C4389: signed/unsigned mismatch + # /U_WIN32 : Avoid redfineded with WIN API # - MSFT:*_*_IA32_CC_FLAGS = /DEFI32 /wd4244 /wd4132 /wd4245 /wd4310 /wd4204 - MSFT:*_*_X64_CC_FLAGS = /DEFI32 /wd4244 /wd4132 /wd4245 /wd4310 /wd4204 + MSFT:*_*_IA32_CC_FLAGS = /U_WIN32 /DEFI32 /wd4244 /wd4132 /wd4245 /wd4310 /wd4204 /wd4389 + MSFT:*_*_X64_CC_FLAGS = /U_WIN32 /DEFI32 /wd4244 /wd4132 /wd4245 /wd4310 /wd4204 /wd4389 + # # Disable following Visual Studio 2015 compiler warnings brought by mbedtls source, From 95838ecb96b0513e8620adcf6f09541518209632 Mon Sep 17 00:00:00 2001 From: Longhaox Lee Date: Thu, 13 Nov 2025 15:00:48 +0800 Subject: [PATCH 0832/1172] CryptoPkg: MbedTls not support content data signature. Pkcs7GetAttachedContent function should always return false. REF: https://github.com/tianocore/edk2/issues/11605 Signed-off-by: Longhaox Lee --- .../Pk/CryptPkcs7VerifyBase.c | 73 +------------------ 1 file changed, 1 insertion(+), 72 deletions(-) diff --git a/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptPkcs7VerifyBase.c b/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptPkcs7VerifyBase.c index 6b62ee2618ae..e23b130db43e 100644 --- a/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptPkcs7VerifyBase.c +++ b/CryptoPkg/Library/BaseCryptLibMbedTls/Pk/CryptPkcs7VerifyBase.c @@ -38,76 +38,5 @@ Pkcs7GetAttachedContent ( OUT UINTN *ContentSize ) { - BOOLEAN Status; - UINT8 *SignedData; - UINTN SignedDataSize; - BOOLEAN Wrapped; - INTN Ret; - mbedtls_pkcs7 Pkcs7; - mbedtls_pkcs7_data *MbedtlsContent; - - mbedtls_pkcs7_init (&Pkcs7); - - // - // Check input parameter. - // - if ((P7Data == NULL) || (P7Length > INT_MAX) || (Content == NULL) || (ContentSize == NULL)) { - return FALSE; - } - - *Content = NULL; - SignedData = NULL; - - Status = WrapPkcs7Data (P7Data, P7Length, &Wrapped, &SignedData, &SignedDataSize); - if (!Status || (SignedDataSize > INT_MAX)) { - goto _Exit; - } - - Status = FALSE; - - Ret = mbedtls_pkcs7_parse_der (&Pkcs7, SignedData, (INT32)SignedDataSize); - - // - // The type of Pkcs7 must be signedData - // - if (Ret != MBEDTLS_PKCS7_SIGNED_DATA) { - goto _Exit; - } - - // - // Check for detached or attached content - // - MbedtlsContent = &(Pkcs7.signed_data.content); - - if (MbedtlsContent == NULL) { - // - // No Content supplied for PKCS7 detached signedData - // - *Content = NULL; - *ContentSize = 0; - } else { - // - // Retrieve the attached content in PKCS7 signedData - // - if ((MbedtlsContent->data.len > 0) && (MbedtlsContent->data.p != NULL)) { - *ContentSize = MbedtlsContent->data.len; - *Content = AllocateZeroPool (*ContentSize); - if (*Content == NULL) { - *ContentSize = 0; - goto _Exit; - } - - CopyMem (*Content, MbedtlsContent->data.p, *ContentSize); - } - } - - Status = TRUE; - -_Exit: - // - // Release Resources - // - mbedtls_pkcs7_free (&Pkcs7); - - return Status; + return FALSE; } From 77f21b70fdd530aabc6a3515deeb6b0f98f1adc8 Mon Sep 17 00:00:00 2001 From: Longhaox Lee Date: Fri, 14 Nov 2025 15:55:23 +0800 Subject: [PATCH 0833/1172] CryptoPkg: Override mbedtls_config header 1.Defended MBEDTLS_PLATFORM_MS_TIME_ALT use alternative implement. 2.Defended MBEDTLS_TEST_SW_INET_PTON use software version INET_PTON, not depend on OS. REF: https://github.com/tianocore/edk2/issues/11605 Signed-off-by: Longhaox Lee --- .../MbedTlsLib/Include/mbedtls/mbedtls_config.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/CryptoPkg/Library/MbedTlsLib/Include/mbedtls/mbedtls_config.h b/CryptoPkg/Library/MbedTlsLib/Include/mbedtls/mbedtls_config.h index 7d30e9a2116e..0cc5c930cc51 100644 --- a/CryptoPkg/Library/MbedTlsLib/Include/mbedtls/mbedtls_config.h +++ b/CryptoPkg/Library/MbedTlsLib/Include/mbedtls/mbedtls_config.h @@ -252,7 +252,7 @@ // #define MBEDTLS_PLATFORM_VSNPRINTF_ALT // #define MBEDTLS_PLATFORM_NV_SEED_ALT // #define MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT -// #define MBEDTLS_PLATFORM_MS_TIME_ALT +#define MBEDTLS_PLATFORM_MS_TIME_ALT /** * Uncomment the macro to let Mbed TLS use your alternate implementation of @@ -4410,3 +4410,11 @@ mbedtls_free ( /** \} name SECTION: Module configuration options */ #define MBEDTLS_ALLOW_PRIVATE_ACCESS + +/** + * \def MBEDTLS_TEST_SW_INET_PTON + * + * Enable to use inet_pton() software version + * + */ +#define MBEDTLS_TEST_SW_INET_PTON From 3e55bab1a5647764f95780d9f8fde6e36a47b369 Mon Sep 17 00:00:00 2001 From: Longhaox Lee Date: Thu, 13 Nov 2025 15:10:27 +0800 Subject: [PATCH 0834/1172] CryptoPkg: Unit test for Pkcs7GetAttachedContent() MbebTls no support signature with content data. test would be fail in below test case: TestPkcs7Attached TestPkcs7Detached TestVerifyPkcs7ContentData REF: https://github.com/tianocore/edk2/issues/11605 Signed-off-by: Longhaox Lee --- .../BaseCryptLib/BaseCryptLibUnitTests.c | 1 + .../Pkcs7AttachedContentSignatures.h | 242 +++++++++++++++++ .../BaseCryptLib/Pkcs7AttachedContentTest.c | 249 ++++++++++++++++++ .../Library/BaseCryptLib/TestBaseCryptLib.h | 3 + .../BaseCryptLib/TestBaseCryptLibHost.inf | 1 + .../BaseCryptLib/TestBaseCryptLibShell.inf | 1 + 6 files changed, 497 insertions(+) create mode 100644 CryptoPkg/Test/UnitTest/Library/BaseCryptLib/Pkcs7AttachedContentSignatures.h create mode 100644 CryptoPkg/Test/UnitTest/Library/BaseCryptLib/Pkcs7AttachedContentTest.c diff --git a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/BaseCryptLibUnitTests.c b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/BaseCryptLibUnitTests.c index 5546259488fe..4546843096f5 100644 --- a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/BaseCryptLibUnitTests.c +++ b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/BaseCryptLibUnitTests.c @@ -30,6 +30,7 @@ SUITE_DESC mSuiteDesc[] = { { "Bn verify tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mBnTestNum, mBnTest }, { "EC verify tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mEcTestNum, mEcTest }, { "X509 Verify tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mX509TestNum, mX509Test }, + { "PKCS7 Attach Content tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mPkcs7ContentTestNum, mPkcs7ContentTest }, }; EFI_STATUS diff --git a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/Pkcs7AttachedContentSignatures.h b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/Pkcs7AttachedContentSignatures.h new file mode 100644 index 000000000000..958cd3d0b9ca --- /dev/null +++ b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/Pkcs7AttachedContentSignatures.h @@ -0,0 +1,242 @@ +/** @file + Application for Pkcs7 Attached Content Validation. + It is header file for Pkcs7 Signatures test case. + +Copyright (c) 2025, Intel Corporation. All rights reserved.
    +SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +// +// This is the Test Pck7 in byte array format. +// Example for Pck7s generate using openssl: +// 1. openssl.exe genrsa -out key.pem 2048 +// 2. openssl.exe req -x509 -new -key key.pem -out cert.pem -days 365 -subj "/CN=Test PKCS7/" +// 3. echo "Test PKCS7" > data.txt +// 3. openssl.exe cms -sign -in data.txt -signer cert.pem -inkey key.pem -outform DER -out pkcs7_mbedtls.der -nodetach -noattr -binary +// 4. output: pkcs7_mbedtls.der + +// +// Attached contents test string: +// "This is the attached content data in PKCS#7 format." +// +CONST UINT8 AttachedContents[] = { + 0x54, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20,0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, + 0x20, 0x63, 0x6F, 0x6E,0x74, 0x65, 0x6E, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x69, 0x6E, + 0x20, 0x50, 0x4B, 0x43,0x53, 0x23, 0x37, 0x20, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x2E +}; + +// +// Pck7s with AttachedContents +// +CONST UINT8 Pck7AttachedTest[] = { + 0x30, 0x82, 0x05, 0x39, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02, 0xA0, + 0x82, 0x05, 0x2A, 0x30, 0x82, 0x05, 0x26, 0x02, 0x01, 0x01, 0x31, 0x0F, 0x30, 0x0D, 0x06, 0x09, + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x30, 0x42, 0x06, 0x09, 0x2A, + 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x01, 0xA0, 0x35, 0x04, 0x33, 0x54, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, + 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x69, 0x6E, + 0x20, 0x50, 0x4B, 0x43, 0x53, 0x23, 0x37, 0x20, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x2E, 0xA0, + 0x82, 0x02, 0xD1, 0x30, 0x82, 0x02, 0xCD, 0x30, 0x82, 0x01, 0xB5, 0xA0, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x04, 0x07, 0x5B, 0xCD, 0x15, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, + 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x1E, 0x31, 0x1C, 0x30, 0x1A, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0C, 0x13, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, + 0x74, 0x43, 0x65, 0x72, 0x74, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x35, 0x31, 0x31, 0x30, 0x34, 0x30, + 0x34, 0x33, 0x38, 0x31, 0x38, 0x5A, 0x17, 0x0D, 0x32, 0x36, 0x31, 0x31, 0x30, 0x34, 0x30, 0x34, + 0x33, 0x38, 0x31, 0x38, 0x5A, 0x30, 0x1E, 0x31, 0x1C, 0x30, 0x1A, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0C, 0x13, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, + 0x74, 0x43, 0x65, 0x72, 0x74, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, + 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, + 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xD4, 0xCA, 0x82, 0x3F, 0x25, 0x57, 0x03, 0x8D, 0x4B, 0x75, + 0xAE, 0x9B, 0x10, 0x5E, 0xF0, 0x59, 0x7A, 0xF7, 0xCC, 0x25, 0x38, 0x58, 0x11, 0x0F, 0xDC, 0x15, + 0xF8, 0x9B, 0x0A, 0x0B, 0x71, 0x87, 0x1A, 0xA1, 0x81, 0xA7, 0x73, 0x4B, 0x1C, 0xBA, 0x5E, 0x30, + 0x63, 0x90, 0x1B, 0xB2, 0x14, 0xC0, 0xA9, 0xF4, 0x8B, 0xA4, 0xE4, 0x56, 0x21, 0xF5, 0x9E, 0xE2, + 0xEC, 0xD5, 0x4E, 0x54, 0xB6, 0x33, 0x3A, 0x97, 0xD8, 0x78, 0xB8, 0xEF, 0xE9, 0x3F, 0xE1, 0xE2, + 0xD9, 0x73, 0x78, 0x68, 0x05, 0x66, 0x07, 0x32, 0xFA, 0x1F, 0xD0, 0x39, 0x08, 0x24, 0x3D, 0x75, + 0xC5, 0xFB, 0xE0, 0x38, 0x25, 0xE3, 0xEA, 0x8D, 0x35, 0x46, 0xBD, 0x57, 0x84, 0x3A, 0x72, 0x09, + 0x2F, 0xFA, 0x17, 0x95, 0x24, 0xD9, 0xE2, 0xA2, 0x68, 0x5A, 0x0E, 0x3A, 0xB7, 0xBA, 0xB8, 0x27, + 0xAE, 0x50, 0xC1, 0x31, 0xB2, 0x4B, 0x2C, 0x05, 0xFE, 0xC4, 0xB0, 0xD5, 0x51, 0x29, 0x1B, 0x87, + 0xB2, 0x85, 0x83, 0xFE, 0x18, 0x7C, 0x59, 0xCD, 0x5D, 0xA9, 0x32, 0x79, 0xE5, 0xD0, 0x29, 0x68, + 0xA4, 0x6A, 0x19, 0x9E, 0x25, 0x20, 0xA7, 0x7F, 0xB7, 0x06, 0x4F, 0x75, 0x54, 0xF8, 0x02, 0x29, + 0x0C, 0x5A, 0x81, 0x0D, 0x59, 0x1A, 0x31, 0x1B, 0x3B, 0xA1, 0x9E, 0x79, 0x8D, 0xDA, 0x28, 0xEC, + 0xDD, 0x81, 0xF3, 0x65, 0x6A, 0xD0, 0x9F, 0x0A, 0x91, 0x33, 0x60, 0xC3, 0x4D, 0x2A, 0xFE, 0xED, + 0x92, 0xE2, 0x63, 0x4D, 0x06, 0xB1, 0xC9, 0x7A, 0x6D, 0x4F, 0xB0, 0x39, 0x3F, 0x66, 0x8B, 0x2F, + 0x17, 0x8E, 0x31, 0x2D, 0x6E, 0x66, 0xF5, 0x8B, 0xA1, 0xC5, 0xD5, 0xC7, 0x19, 0x64, 0x2E, 0x82, + 0xCC, 0x65, 0x44, 0x86, 0xB3, 0x97, 0xEB, 0xFC, 0x38, 0x58, 0xDA, 0xF4, 0xCD, 0xC0, 0xCD, 0x2D, + 0x7A, 0x21, 0xB5, 0xC7, 0x46, 0x89, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x13, 0x30, 0x11, 0x30, + 0x0F, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, + 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x01, 0x00, 0x15, 0x29, 0x26, 0xEA, 0xF0, 0x31, 0x8F, 0x6D, 0x88, 0x8E, 0x9C, 0x85, + 0x10, 0x7E, 0xC4, 0xEE, 0xFA, 0xE6, 0xC0, 0x17, 0x3D, 0xE1, 0x74, 0xB0, 0xD9, 0x0A, 0xC3, 0xAF, + 0x61, 0x9C, 0x9B, 0x9D, 0xEF, 0x04, 0x39, 0x43, 0xB4, 0x11, 0x76, 0xF0, 0x34, 0x0D, 0xD2, 0xCD, + 0xA9, 0xA2, 0x9D, 0x91, 0xD8, 0x4E, 0xFE, 0xDC, 0xEE, 0x48, 0x4A, 0x2E, 0xFF, 0xDC, 0x01, 0x60, + 0x58, 0x2E, 0x9B, 0x81, 0x63, 0x74, 0x93, 0xDE, 0x73, 0x6B, 0xA9, 0xD1, 0x20, 0x5E, 0x0C, 0x2E, + 0x7A, 0x62, 0x62, 0x2F, 0x95, 0x4C, 0x6D, 0x43, 0xEF, 0x22, 0x9F, 0xCA, 0xA4, 0x16, 0x4E, 0xB3, + 0x87, 0x92, 0x0E, 0xF6, 0xA0, 0x89, 0x7C, 0xE3, 0x0F, 0xD5, 0xC6, 0xAD, 0xE2, 0x26, 0x66, 0xD6, + 0xFE, 0x52, 0xEB, 0x89, 0xA3, 0x35, 0x4C, 0xD5, 0xA3, 0x19, 0x26, 0x1E, 0x6F, 0x5D, 0xBC, 0xF0, + 0xE0, 0x20, 0x29, 0x6C, 0xEF, 0x36, 0x44, 0x64, 0x02, 0x49, 0x53, 0xF4, 0x53, 0x52, 0xC8, 0x7F, + 0xB4, 0x35, 0x54, 0x80, 0x93, 0x39, 0x27, 0x4B, 0x8F, 0x10, 0x05, 0x97, 0xAB, 0x8A, 0x18, 0xBB, + 0x67, 0x92, 0xC9, 0x40, 0x30, 0xE5, 0x19, 0x84, 0x91, 0xBC, 0x4A, 0x90, 0x7E, 0x10, 0xA3, 0x41, + 0xDE, 0x29, 0xC0, 0x7C, 0x1C, 0x4F, 0x99, 0x5B, 0x49, 0x69, 0x08, 0x46, 0x04, 0x0F, 0x73, 0x50, + 0x6A, 0xFC, 0x5B, 0x8A, 0x83, 0x18, 0x4A, 0xFC, 0xAB, 0xEF, 0xEB, 0x85, 0x21, 0x77, 0xC6, 0x65, + 0xC3, 0xE5, 0x62, 0x47, 0xE5, 0xC9, 0x15, 0xBB, 0xDA, 0x9A, 0x35, 0xFB, 0x24, 0xF8, 0xB0, 0x80, + 0x7C, 0x0C, 0xC7, 0x50, 0x67, 0x0E, 0x31, 0x64, 0x87, 0x0D, 0xD1, 0x29, 0x13, 0x4F, 0xBD, 0x3A, + 0x32, 0x80, 0x44, 0x62, 0xF0, 0x9C, 0x9B, 0xDA, 0x5B, 0x78, 0x06, 0x39, 0x34, 0x30, 0xB8, 0x02, + 0xBB, 0xFB, 0x06, 0xE0, 0x31, 0x82, 0x01, 0xF5, 0x30, 0x82, 0x01, 0xF1, 0x02, 0x01, 0x01, 0x30, + 0x26, 0x30, 0x1E, 0x31, 0x1C, 0x30, 0x1A, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x13, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x43, 0x65, 0x72, + 0x74, 0x02, 0x04, 0x07, 0x5B, 0xCD, 0x15, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, + 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0xA0, 0x81, 0xA1, 0x30, 0x18, 0x06, 0x09, 0x2A, 0x86, 0x48, + 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x03, 0x31, 0x0B, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, + 0x01, 0x07, 0x01, 0x30, 0x1C, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x05, + 0x31, 0x0F, 0x17, 0x0D, 0x32, 0x35, 0x31, 0x31, 0x30, 0x34, 0x30, 0x34, 0x33, 0x38, 0x31, 0x38, + 0x5A, 0x30, 0x2F, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x04, 0x31, 0x22, + 0x04, 0x20, 0xF7, 0xF9, 0xE4, 0x60, 0xA9, 0xDF, 0xAF, 0x0A, 0x6A, 0x41, 0xAF, 0xB7, 0xFF, 0x37, + 0x28, 0xE4, 0x4F, 0x88, 0x7F, 0x9C, 0x67, 0x1D, 0xAA, 0x39, 0xFF, 0x96, 0xB8, 0xF1, 0xA0, 0x13, + 0xB4, 0x73, 0x30, 0x36, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x0F, 0x31, + 0x29, 0x30, 0x27, 0x30, 0x0B, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2A, + 0x30, 0x0B, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x16, 0x30, 0x0B, 0x06, + 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x02, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, + 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x01, 0x00, 0x22, 0xE2, 0xB0, + 0x0F, 0xFC, 0x43, 0xC4, 0xBC, 0x0B, 0x6E, 0x95, 0x62, 0x1D, 0xEB, 0x61, 0x04, 0xC4, 0xEE, 0xFC, + 0x48, 0x08, 0x7F, 0x0D, 0x20, 0x73, 0x40, 0x18, 0x83, 0x06, 0x07, 0x85, 0x5B, 0x73, 0x4B, 0x96, + 0x8B, 0xA7, 0x7D, 0x42, 0x8E, 0x5C, 0x2E, 0x52, 0xB5, 0x2A, 0xFB, 0x93, 0xC6, 0xC8, 0x0F, 0xC8, + 0x90, 0xAB, 0x49, 0xD6, 0x90, 0x25, 0xA7, 0x08, 0x08, 0x35, 0x72, 0x8E, 0x19, 0xAE, 0xDE, 0x56, + 0x57, 0xAD, 0xFE, 0x7C, 0x0E, 0x2E, 0x88, 0x69, 0x89, 0x3C, 0x0B, 0x2E, 0x85, 0x2A, 0x64, 0x07, + 0xC0, 0x94, 0x29, 0xDE, 0x25, 0x28, 0xBC, 0x34, 0xC3, 0x06, 0xC8, 0x02, 0x0C, 0xDF, 0x87, 0x32, + 0x47, 0xE3, 0x9F, 0x78, 0xC4, 0x5E, 0x31, 0x57, 0x62, 0xD1, 0x3D, 0x84, 0x2B, 0xEE, 0x9D, 0xC4, + 0x80, 0x02, 0xDB, 0x9C, 0x17, 0x04, 0x7E, 0x32, 0xE5, 0xE2, 0xC8, 0x4D, 0xCE, 0x3C, 0x80, 0x7A, + 0xDB, 0x82, 0x34, 0x8A, 0xE7, 0x97, 0x19, 0x50, 0xCF, 0xC0, 0xB7, 0xCD, 0x43, 0xA0, 0xA0, 0x0E, + 0x21, 0xF9, 0x64, 0x83, 0x3C, 0x0A, 0x7D, 0x00, 0x8E, 0xC6, 0x91, 0x13, 0xC0, 0xFC, 0xC2, 0x94, + 0x3F, 0x91, 0xE6, 0xDB, 0xDE, 0xC7, 0x94, 0x80, 0x34, 0x70, 0x64, 0xB8, 0xE6, 0xBE, 0xB8, 0x40, + 0x39, 0x90, 0xCA, 0x8E, 0xF3, 0xEF, 0x3D, 0x08, 0xBE, 0x24, 0x09, 0x8D, 0x8C, 0x1F, 0xC9, 0xD2, + 0x5B, 0xF8, 0x65, 0xC1, 0x12, 0x84, 0x3B, 0x07, 0x1E, 0x02, 0x54, 0x69, 0x27, 0x3B, 0x31, 0xDE, + 0x5B, 0x58, 0x20, 0xB1, 0xA1, 0xCE, 0xFA, 0xB2, 0xCE, 0xDE, 0x59, 0xBB, 0x19, 0x91, 0x69, 0x0B, + 0x59, 0xBE, 0x30, 0xDE, 0xF5, 0xFA, 0xE0, 0x38, 0x19, 0x4E, 0x86, 0xD7, 0xDD, 0x8A, 0x36, 0xF0, + 0x32, 0x85, 0x20, 0x97, 0xE7, 0xCD, 0x21, 0x36, 0x41, 0x60, 0x03, 0xC0, 0x11 +}; + +// +// Pck7s without AttachedContents +// +CONST UINT8 Pck7DetachedTest[] = { + 0x30, 0x82, 0x05, 0x02, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02, 0xA0, + 0x82, 0x04, 0xF3, 0x30, 0x82, 0x04, 0xEF, 0x02, 0x01, 0x01, 0x31, 0x0F, 0x30, 0x0D, 0x06, 0x09, + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x30, 0x0B, 0x06, 0x09, 0x2A, + 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x01, 0xA0, 0x82, 0x02, 0xD1, 0x30, 0x82, 0x02, 0xCD, + 0x30, 0x82, 0x01, 0xB5, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, 0x3A, 0xDE, 0x68, 0xB1, 0x30, + 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x1E, + 0x31, 0x1C, 0x30, 0x1A, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x13, 0x44, 0x65, 0x74, 0x61, 0x63, + 0x68, 0x65, 0x64, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x43, 0x65, 0x72, 0x74, 0x30, 0x1E, + 0x17, 0x0D, 0x32, 0x35, 0x31, 0x31, 0x30, 0x34, 0x30, 0x34, 0x34, 0x30, 0x32, 0x39, 0x5A, 0x17, + 0x0D, 0x32, 0x36, 0x31, 0x31, 0x30, 0x34, 0x30, 0x34, 0x34, 0x30, 0x32, 0x39, 0x5A, 0x30, 0x1E, + 0x31, 0x1C, 0x30, 0x1A, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x13, 0x44, 0x65, 0x74, 0x61, 0x63, + 0x68, 0x65, 0x64, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x43, 0x65, 0x72, 0x74, 0x30, 0x82, + 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xD6, + 0x94, 0x05, 0x7C, 0xEF, 0x17, 0x7D, 0x67, 0xD4, 0x1B, 0x3A, 0xA7, 0xD7, 0xD6, 0xC1, 0xC9, 0xD0, + 0x3B, 0x3B, 0x8A, 0x3E, 0x6F, 0x87, 0x53, 0x88, 0x67, 0xFB, 0xAB, 0x67, 0x19, 0xD0, 0xA4, 0xCB, + 0x78, 0x53, 0x93, 0x7A, 0xE1, 0xD1, 0x76, 0xFF, 0xC2, 0xCC, 0x0D, 0x55, 0x3D, 0xD9, 0x98, 0x6D, + 0x9A, 0xA0, 0xBE, 0x44, 0x3E, 0x34, 0xE4, 0xD8, 0x97, 0x09, 0x09, 0x5E, 0xA6, 0x3D, 0xEF, 0xD9, + 0x23, 0x24, 0xBE, 0x19, 0xA2, 0xE2, 0x67, 0x51, 0xFB, 0x8E, 0x26, 0x70, 0x5E, 0x74, 0x13, 0x04, + 0x60, 0xF8, 0x82, 0xB9, 0xA4, 0x7E, 0xC8, 0xA0, 0xFD, 0xC1, 0x15, 0x74, 0x15, 0x1A, 0xF2, 0x4D, + 0x2E, 0x50, 0x6B, 0x3C, 0xE0, 0x35, 0x38, 0xAA, 0x59, 0xD3, 0x27, 0x3E, 0x7E, 0x20, 0x94, 0xD9, + 0x68, 0x8E, 0x7C, 0x43, 0x13, 0xD9, 0x95, 0xA0, 0xCB, 0x63, 0xDB, 0x97, 0x4B, 0x4B, 0xA2, 0x60, + 0x6B, 0x44, 0x26, 0x6C, 0xFB, 0x61, 0xBD, 0xAD, 0x11, 0x24, 0xF2, 0x72, 0x80, 0x44, 0xD9, 0xF6, + 0x1C, 0x0E, 0xB3, 0x58, 0xAF, 0x9B, 0x03, 0x7F, 0x56, 0xF4, 0xCF, 0x72, 0xAD, 0x09, 0xCE, 0xF1, + 0x8B, 0x99, 0x25, 0x09, 0x4F, 0xD1, 0x66, 0x13, 0x1A, 0x32, 0x4B, 0x6E, 0x34, 0xDA, 0xAD, 0x7C, + 0x6E, 0x08, 0xE0, 0x01, 0xDD, 0x18, 0x1E, 0x5B, 0x91, 0x08, 0x19, 0xFB, 0xE3, 0xB2, 0x46, 0xCE, + 0xCD, 0x35, 0x05, 0xB9, 0x17, 0x62, 0xFF, 0xAB, 0x83, 0x7B, 0xB2, 0x21, 0x49, 0xD6, 0xED, 0xE4, + 0xFE, 0x66, 0x6C, 0x03, 0xDD, 0x64, 0xD3, 0x9D, 0x6A, 0xC4, 0xE5, 0x0E, 0x65, 0xA9, 0xC4, 0x43, + 0x4A, 0xEE, 0x3B, 0x43, 0x99, 0x29, 0x1E, 0x8E, 0xDA, 0x47, 0xFD, 0x29, 0x0B, 0x2E, 0xCA, 0x33, + 0x88, 0x47, 0x09, 0xF0, 0xDD, 0x92, 0x37, 0x69, 0x4A, 0x54, 0x32, 0x57, 0x23, 0x9F, 0x09, 0x02, + 0x03, 0x01, 0x00, 0x01, 0xA3, 0x13, 0x30, 0x11, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, + 0x01, 0xFF, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, + 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x74, 0xCA, 0x3A, + 0x8E, 0x20, 0x35, 0x63, 0xBD, 0xE7, 0x8D, 0x85, 0x79, 0x98, 0x13, 0x37, 0x2E, 0xC4, 0x85, 0x8D, + 0x58, 0x6F, 0xDC, 0x68, 0x6C, 0x4B, 0xAB, 0x8B, 0x33, 0x1F, 0x51, 0x3E, 0xDA, 0xBF, 0xDF, 0x4F, + 0xA3, 0x14, 0x22, 0xC1, 0xA9, 0xDE, 0x93, 0x14, 0x3D, 0xE2, 0xC1, 0x8E, 0x3D, 0x27, 0x98, 0xAC, + 0x2B, 0xD9, 0x0C, 0x13, 0xA4, 0x3B, 0xA0, 0xFC, 0xA6, 0xEF, 0x0E, 0x29, 0xF9, 0x68, 0x5E, 0x8B, + 0xCA, 0xC9, 0xED, 0x86, 0x7F, 0x0F, 0x92, 0x30, 0x1D, 0x5C, 0xAE, 0x2B, 0x6B, 0x25, 0x37, 0x5A, + 0xC8, 0x33, 0x81, 0x5D, 0x10, 0x52, 0x1B, 0x51, 0x90, 0xAC, 0x46, 0xDA, 0x86, 0x1F, 0xC0, 0x18, + 0x08, 0x64, 0x45, 0xC0, 0x27, 0xE4, 0xD9, 0xD7, 0x65, 0xAE, 0xB8, 0x19, 0x34, 0x84, 0x07, 0x74, + 0x3E, 0x5B, 0xD8, 0x02, 0xAA, 0x08, 0x0C, 0x86, 0x3C, 0x99, 0xCB, 0xA8, 0xAC, 0x2F, 0xED, 0xCA, + 0x27, 0x78, 0xBE, 0x4E, 0x9B, 0xD5, 0x9C, 0x35, 0x70, 0x0B, 0x2C, 0x53, 0x47, 0x1A, 0xF2, 0x56, + 0x72, 0x8B, 0xD1, 0x41, 0x5C, 0xAF, 0x6E, 0x3B, 0xAD, 0x5A, 0xEA, 0x1D, 0x00, 0x90, 0xFA, 0x52, + 0x94, 0xDD, 0x82, 0xAB, 0x01, 0x51, 0x6E, 0xD7, 0xB4, 0x81, 0x00, 0x16, 0x57, 0x65, 0xDA, 0xD1, + 0xAC, 0x9A, 0x0A, 0x5C, 0xAD, 0x01, 0x16, 0x20, 0xBC, 0x82, 0xA6, 0x48, 0xDE, 0x1D, 0x43, 0xE9, + 0x80, 0x62, 0x0D, 0xAF, 0xC0, 0x0E, 0x84, 0x48, 0x41, 0x66, 0x32, 0x55, 0xA4, 0x32, 0x91, 0x00, + 0xF0, 0xA4, 0x09, 0x51, 0xAF, 0x02, 0xE4, 0x11, 0x59, 0x33, 0x08, 0x09, 0x7B, 0xC8, 0x4F, 0x82, + 0x55, 0x27, 0xD4, 0x33, 0x5E, 0xBD, 0x53, 0x75, 0x4F, 0x0C, 0x29, 0x8C, 0xDE, 0xBE, 0xFF, 0xBF, + 0x29, 0x44, 0x8F, 0xB6, 0x16, 0xD5, 0x0A, 0xDA, 0x85, 0x90, 0x75, 0x40, 0xBE, 0x31, 0x82, 0x01, + 0xF5, 0x30, 0x82, 0x01, 0xF1, 0x02, 0x01, 0x01, 0x30, 0x26, 0x30, 0x1E, 0x31, 0x1C, 0x30, 0x1A, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x13, 0x44, 0x65, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x43, + 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x43, 0x65, 0x72, 0x74, 0x02, 0x04, 0x3A, 0xDE, 0x68, 0xB1, + 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0xA0, + 0x81, 0xA1, 0x30, 0x18, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x03, 0x31, + 0x0B, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x01, 0x30, 0x1C, 0x06, 0x09, + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x05, 0x31, 0x0F, 0x17, 0x0D, 0x32, 0x35, 0x31, + 0x31, 0x30, 0x34, 0x30, 0x34, 0x34, 0x30, 0x32, 0x39, 0x5A, 0x30, 0x2F, 0x06, 0x09, 0x2A, 0x86, + 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x04, 0x31, 0x22, 0x04, 0x20, 0xE3, 0x0C, 0x67, 0x60, 0x1D, + 0x4F, 0xA4, 0x0D, 0x63, 0x5C, 0x0E, 0x8B, 0xFB, 0x16, 0x80, 0x98, 0xD3, 0x4C, 0xE4, 0x98, 0x37, + 0x67, 0x9D, 0x24, 0xCB, 0x82, 0x12, 0x7E, 0x28, 0xE1, 0x96, 0xEB, 0x30, 0x36, 0x06, 0x09, 0x2A, + 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x0F, 0x31, 0x29, 0x30, 0x27, 0x30, 0x0B, 0x06, 0x09, + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2A, 0x30, 0x0B, 0x06, 0x09, 0x60, 0x86, 0x48, + 0x01, 0x65, 0x03, 0x04, 0x01, 0x16, 0x30, 0x0B, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, + 0x04, 0x01, 0x02, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, + 0x05, 0x00, 0x04, 0x82, 0x01, 0x00, 0x56, 0xE9, 0x8C, 0x9E, 0xA3, 0x91, 0xBF, 0x92, 0xD6, 0xEC, + 0x01, 0x8B, 0xFF, 0x87, 0x26, 0x82, 0xE1, 0xDF, 0x96, 0x50, 0xAA, 0xCB, 0xA1, 0xB2, 0x8E, 0x51, + 0x57, 0x19, 0x56, 0x66, 0x57, 0x80, 0xF2, 0x61, 0x28, 0xF2, 0xBB, 0x83, 0xA4, 0xC1, 0x30, 0x94, + 0xC2, 0xB1, 0x5A, 0x3B, 0xDB, 0x5F, 0x56, 0x97, 0x98, 0x38, 0xE0, 0xA4, 0xAE, 0x65, 0x7B, 0x47, + 0x2D, 0xBF, 0x69, 0x22, 0x71, 0xA7, 0x63, 0x47, 0x59, 0x11, 0xD7, 0x32, 0x77, 0xF4, 0xFD, 0x29, + 0x5F, 0x9A, 0x97, 0x68, 0x2F, 0xC2, 0x71, 0x54, 0x55, 0x35, 0x0A, 0x33, 0xAD, 0xF1, 0x89, 0x93, + 0x14, 0x58, 0x21, 0x31, 0xA7, 0xBB, 0x70, 0x9E, 0xEC, 0xCF, 0xFA, 0xCB, 0x26, 0x1D, 0x78, 0x2E, + 0xB4, 0x60, 0x41, 0x66, 0x51, 0xAA, 0x3E, 0x2F, 0xFC, 0x41, 0x4A, 0xCE, 0xE6, 0x46, 0xDB, 0x54, + 0xA9, 0x35, 0x76, 0x00, 0xC7, 0x68, 0xCF, 0xEE, 0x2C, 0x66, 0x1D, 0x5D, 0xA6, 0xE4, 0xC4, 0x1D, + 0xD6, 0xC2, 0x40, 0x6C, 0x86, 0x94, 0x4D, 0xCB, 0x9D, 0x06, 0xD6, 0x75, 0x97, 0xEE, 0x89, 0x28, + 0x17, 0xCB, 0x2F, 0x4C, 0x33, 0xC7, 0x6C, 0x2B, 0x59, 0x4D, 0x6E, 0x18, 0x0C, 0x5F, 0xB9, 0x1A, + 0x78, 0x70, 0x22, 0xD0, 0xE8, 0x1F, 0xC1, 0xD1, 0x82, 0xE9, 0x8E, 0xDA, 0xC7, 0x89, 0x82, 0x2D, + 0xCC, 0x42, 0x46, 0xF5, 0x89, 0xA8, 0x1B, 0x2E, 0xA6, 0x0B, 0x0F, 0x23, 0x30, 0x9E, 0x29, 0x0E, + 0x22, 0x24, 0x59, 0xC2, 0xD5, 0x6A, 0x21, 0x65, 0x91, 0xF6, 0x95, 0x5A, 0xE5, 0xD3, 0x5E, 0x20, + 0xC3, 0x16, 0xD4, 0x91, 0x23, 0x7B, 0x40, 0x31, 0x38, 0x00, 0xFA, 0x91, 0x55, 0xA8, 0x56, 0x7C, + 0x31, 0x70, 0xC3, 0xEA, 0xA4, 0x41, 0x1F, 0xED, 0x41, 0xCF, 0x04, 0x7B, 0x9A, 0x80, 0x5F, 0xAF, + 0x3A, 0xEF, 0xF5, 0x19, 0x65, 0xB2 +}; + +// +// Pck7s format not correct test +// +CONST UINT8 Pck7FailTest[] = { + 0x30, 0x14, 0x42, 0x06, 0x5D, 0x00, 0x78, 0x87, 0xED, 0x38, + 0x67, 0x7C, 0xBF, 0x9F, 0xB3, 0x6F, 0xF7, 0x8F, 0x82, 0xA8,0xF8, 0xAD, 0x30, 0x1F, 0x06, 0x03, + 0x55, 0x1D, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x42,0x06, 0x5D, 0x00, 0x78, 0x87, 0xED, + 0x38, 0x67, 0x7C, 0xBF, 0x9F, 0xB3, 0x6F, 0xF7, 0x8F, 0x82,0xA8, 0xF8, 0xAD, 0x30, 0x0D, 0x06, + 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05,0x05, 0x00, 0x03, 0x81, 0x81, 0x00, + 0x4D, 0x06, 0xEE, 0xD0, 0x22, 0x69, 0xA7, 0x09, 0xC6, 0xF3,0xF7, 0x7E, 0x11, 0x23, 0xFB, 0x23, + 0xFD, 0x54, 0x3C, 0x4B, 0xD2, 0x89, 0xAB, 0x45, 0x10, 0x04,0x68, 0xC5, 0xF0, 0x59, 0xA0, 0x5F, + 0xFC, 0x68, 0x24, 0xD5, 0x3F, 0xEE, 0xFB, 0xCF, 0xC2, 0x0C,0x07, 0x63, 0xB8, 0x63, 0x42, 0x88, + 0x5E, 0x9C, 0xB6, 0x8A, 0x0A, 0x73, 0xCB, 0xBC, 0x2A, 0x99,0xD9, 0x26, 0xC1, 0xAA, 0x9E, 0x91, + 0x90, 0xE2, 0x7E, 0x8B, 0xD8, 0xA8, 0xD3, 0xB5, 0x15, 0x03,0x87, 0xE8, 0x62, 0x8D, 0xAD, 0x1E, + 0x25, 0x10, 0x45, 0x76, 0x2A, 0xCF, 0x41, 0xED, 0x87, 0x01,0xE6, 0xD0, 0x18, 0x59, 0xE6, 0x3A, + 0x4E, 0x8C, 0x9F, 0xB2, 0xA2, 0x41, 0xF0, 0x48, 0xB0, 0xEC,0xD7, 0x8A, 0x6F, 0xDB, 0x16, 0xA6, + 0x81, 0x49, 0xB7, 0xF4, 0xE9, 0xB2, 0xD3, 0x40, 0xDC, 0x05,0xA2, 0xE4, 0x8E, 0xFA, 0x3C, 0x0E, + 0x31, 0x82, 0x01, 0x25, 0x30, 0x82, 0x01, 0x21, 0x02, 0x01,0x01, 0x30, 0x20, 0x30, 0x0C, 0x31, + 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x01,0x61, 0x02, 0x10, 0x2F, 0xA1, 0x76, + 0xB3, 0x6E, 0xE9, 0xF0, 0x49, 0xF4, 0x44, 0xB4, 0x00, 0x99,0x66, 0x19, 0x45, 0x30, 0x09, 0x06, + 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05, 0x00, 0xA0, 0x5D,0x30, 0x18, 0x06, 0x09, 0x2A, 0x86, + 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x03, 0x31, 0x0B, 0x06,0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, + 0x0D, 0x01, 0x07, 0x01, 0x30, 0x1C, 0x06, 0x09, 0x2A, 0x86,0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, + 0x05, 0x31, 0x0F, 0x17, 0x0D, 0x30, 0x38, 0x31, 0x30, 0x31,0x35, 0x31, 0x35, 0x30, 0x33, 0x34, + 0x33, 0x5A, 0x30, 0x23, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86,0xF7, 0x0D, 0x01, 0x09, 0x04, 0x31, + 0x16, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0D, 0x06,0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, + 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x81, 0x80, 0x74,0x1E, 0xD2, 0x87, 0x23, 0x06, 0x7F, + 0x99, 0x55, 0x75, 0x9B, 0x6F, 0xC0, 0xA9, 0x67, 0x60, 0xB1,0xCC, 0x52, 0xA2, 0x56, 0xB8, 0x19, + 0xC5, 0x93, 0xB6, 0x90, 0xC0, 0x70, 0x26, 0x83, 0x72, 0x67,0x1F, 0xA3, 0x9C, 0x80, 0x87, 0x76, + 0x17, 0xEC, 0x5F, 0x83, 0xAB, 0x70, 0x5E, 0x6F, 0x21, 0x85,0x40, 0x64, 0x84, 0x73, 0xE5, 0x1C, + 0x6A, 0x16, 0x6B, 0x99, 0x10, 0xB4, 0xDF, 0x67, 0xF2, 0xBC,0xF7, 0x36, 0x8A, 0xF3, 0xBD, 0xC3, + 0x3F, 0xD5, 0x7B, 0xFD, 0xFB, 0x41, 0x1A, 0x97, 0xB3, 0x58,0x4A, 0x7D, 0x87, 0x6F, 0x40, 0xB4, + 0x0C, 0xC8, 0xF6, 0x5C, 0xD2, 0x18, 0x1F, 0x60, 0xBA, 0x08,0xB2, 0x07, 0x92, 0x6C, 0xB5, 0x7A, + 0x0C, 0xD4, 0xBF, 0x3B, 0x28, 0x99, 0x93, 0xD3, 0x93, 0x1E,0x67, 0x18, 0x35, 0xA6, 0xFB, 0xC5, + 0x87, 0x0A, 0x35, 0x9B, 0xF4, 0x0E, 0xA5, 0xCA, 0xB3 +}; diff --git a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/Pkcs7AttachedContentTest.c b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/Pkcs7AttachedContentTest.c new file mode 100644 index 000000000000..87ef2c5f6cde --- /dev/null +++ b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/Pkcs7AttachedContentTest.c @@ -0,0 +1,249 @@ +/** @file + Application for Pkcs7 Attached Content Validation. + +Copyright (c) 2025, Intel Corporation. All rights reserved.
    +SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include "TestBaseCryptLib.h" + +#include "Pkcs7AttachedContentSignatures.h" + +/** + TestPkcs7Attached() + + Pass the API a pkcs7 with content data and contents return should not be null. + + @param[in] Framework - Unit-test framework handle. + @param[in] Context - Optional context pointer for this test. + + @retval UNIT_TEST_PASSED - The required pkcs7 contents return not be null. + @retval UNIT_TEST_ERROR_TEST_FAILED - Something failed, check the debug output. +**/ +static +UNIT_TEST_STATUS +EFIAPI +TestPkcs7Attached ( + IN UNIT_TEST_CONTEXT Context + ) +{ + UINTN SignedDataSize; + UINT8 *AttachedData; + UINTN AttachedDataSize; + EFI_STATUS Status; + + SignedDataSize = sizeof (Pck7AttachedTest); + + Status = Pkcs7GetAttachedContent ( + Pck7AttachedTest, + SignedDataSize, + (VOID **)&AttachedData, + &AttachedDataSize + ); + + UT_ASSERT_EQUAL (Status, TRUE); + + // AttachedData != NULL + if (AttachedData == NULL) { + UT_ASSERT_TRUE (FALSE); + } + + return UNIT_TEST_PASSED; +}// TestPkcs7Attached() + +/** + TestPkcs7Detached() + + Pass the API a pkcs7 detached (without content data) and contents return should be null. + + @param[in] Framework - Unit-test framework handle. + @param[in] Context - Optional context pointer for this test. + + @retval UNIT_TEST_PASSED - The required pkcs7 detached contents return be null. + @retval UNIT_TEST_ERROR_TEST_FAILED - Something failed, check the debug output. +**/ +static +UNIT_TEST_STATUS +EFIAPI +TestPkcs7Detached ( + IN UNIT_TEST_CONTEXT Context + ) +{ + UINTN SignedDataSize; + UINT8 *AttachedData; + UINTN AttachedDataSize; + EFI_STATUS Status; + + SignedDataSize = sizeof (Pck7DetachedTest); + + Status = Pkcs7GetAttachedContent ( + Pck7DetachedTest, + SignedDataSize, + (VOID **)&AttachedData, + &AttachedDataSize + ); + UT_ASSERT_EQUAL (Status, TRUE); + + // Check no AttachedData + if ((AttachedData != NULL) || (AttachedDataSize != 0)) { + UT_ASSERT_TRUE (FALSE); + } + + return UNIT_TEST_PASSED; +}// TestPkcs7Detached() + +/** + TestVerifyPkcs7ContentData() + + Pass the API a pkcs7 with content data and verify contents return. + + @param[in] Framework - Unit-test framework handle. + @param[in] Context - Optional context pointer for this test. + + @retval UNIT_TEST_PASSED - The required pkcs7 contents return were correct. + @retval UNIT_TEST_ERROR_TEST_FAILED - Something failed, check the debug output. +**/ +static +UNIT_TEST_STATUS +EFIAPI +TestVerifyPkcs7ContentData ( + IN UNIT_TEST_CONTEXT Context + ) +{ + UINTN SignedDataSize; + UINT8 *AttachedData; + UINTN AttachedDataSize; + EFI_STATUS Status; + + SignedDataSize = sizeof (Pck7AttachedTest); + + Status = Pkcs7GetAttachedContent ( + Pck7AttachedTest, + SignedDataSize, + (VOID **)&AttachedData, + &AttachedDataSize + ); + UT_ASSERT_EQUAL (Status, TRUE); + + // Compare AttachedData + if (CompareMem (AttachedData, &AttachedContents, sizeof (AttachedContents)) != 0) { + UT_ASSERT_TRUE (FALSE); + } + + return UNIT_TEST_PASSED; +}// TestVerifyPkcs7ContentData() + +/** + TestWithInvalidpkcs7() + + Pass the API a Invalid pkcs7 and ensure that they don't pass. + + @param[in] Framework - Unit-test framework handle. + @param[in] Context - Optional context pointer for this test. + + @retval UNIT_TEST_PASSED - The required pkcs7 were found. + @retval UNIT_TEST_ERROR_TEST_FAILED - Something failed, check the debug output. +**/ +static +UNIT_TEST_STATUS +EFIAPI +TestWithInvalidPkcs7 ( + IN UNIT_TEST_CONTEXT Context + ) +{ + UINTN SignedDataSize; + UINT8 *AttachedData; + UINTN AttachedDataSize; + EFI_STATUS Status; + + SignedDataSize = sizeof (Pck7FailTest); + + Status = Pkcs7GetAttachedContent ( + Pck7FailTest, + SignedDataSize, + (VOID **)&AttachedData, + &AttachedDataSize + ); + UT_ASSERT_EQUAL (Status, FALSE); + + return UNIT_TEST_PASSED; +}// TestWithInvalidPkcs7() + +/** + TestWithInvalidParameters() + + Pass the API a Invalid Parameters and checks function error handling. + + @param[in] Framework - Unit-test framework handle. + @param[in] Context - Optional context pointer for this test. + + @retval UNIT_TEST_PASSED - The required API handling invalid parameters good. + @retval UNIT_TEST_ERROR_TEST_FAILED - Something failed, check the debug output. +**/ +static +UNIT_TEST_STATUS +EFIAPI +TestWithInvalidParameters ( + IN UNIT_TEST_CONTEXT Context + ) +{ + UINTN SignedDataSize; + UINT8 *AttachedData; + UINTN AttachedDataSize; + EFI_STATUS Status; + + SignedDataSize = sizeof (Pck7AttachedTest); + + Status = Pkcs7GetAttachedContent ( + NULL, + SignedDataSize, + (VOID **)&AttachedData, + &AttachedDataSize + ); + UT_ASSERT_EQUAL (Status, FALSE); + + SignedDataSize = (UINTN)(2147483647U + 1U); // INT MAX + 1 + + Status = Pkcs7GetAttachedContent ( + Pck7AttachedTest, + SignedDataSize, + (VOID **)&AttachedData, + &AttachedDataSize + ); + UT_ASSERT_EQUAL (Status, FALSE); + + SignedDataSize = sizeof (Pck7AttachedTest); + + Status = Pkcs7GetAttachedContent ( + Pck7AttachedTest, + SignedDataSize, + NULL, + &AttachedDataSize + ); + UT_ASSERT_EQUAL (Status, FALSE); + + SignedDataSize = sizeof (Pck7AttachedTest); + + Status = Pkcs7GetAttachedContent ( + Pck7AttachedTest, + SignedDataSize, + (VOID **)&AttachedData, + NULL + ); + UT_ASSERT_EQUAL (Status, FALSE); + + return UNIT_TEST_PASSED; +}// TestWithInvalidParameters() + +TEST_DESC mPkcs7ContentTest[] = { + // + // -----Description--------------------------------Class----------------------------Function------------------------------Pre---Post--Context + // + { "TestPkcs7Attached()", "CryptoPkg.BaseCryptLib.Pkcs7Content", TestPkcs7Attached, NULL, NULL, NULL }, + { "TestPkcs7Detached()", "CryptoPkg.BaseCryptLib.TestPkcs7Detached", TestPkcs7Detached, NULL, NULL, NULL }, + { "TestVerifyPkcs7ContentData()", "CryptoPkg.BaseCryptLib.TestVerifyPkcs7ContentData", TestVerifyPkcs7ContentData, NULL, NULL, NULL }, + { "TestWithInvalidPkcs7()", "CryptoPkg.BaseCryptLib.TestWithInvalidPkcs7", TestWithInvalidPkcs7, NULL, NULL, NULL }, + { "TestWithInvalidParameters()", "CryptoPkg.BaseCryptLib.TestWithInvalidParameters", TestWithInvalidParameters, NULL, NULL, NULL }, +}; + +UINTN mPkcs7ContentTestNum = ARRAY_SIZE (mPkcs7ContentTest); diff --git a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLib.h b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLib.h index 1a36ac5de355..718699ba2fa7 100644 --- a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLib.h +++ b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLib.h @@ -101,6 +101,9 @@ extern TEST_DESC mEcTest[]; extern UINTN mX509TestNum; extern TEST_DESC mX509Test[]; +extern UINTN mPkcs7ContentTestNum; +extern TEST_DESC mPkcs7ContentTest[]; + /** Creates a framework you can use */ EFI_STATUS EFIAPI diff --git a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLibHost.inf b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLibHost.inf index 92152ccc3477..15dd6efcdc82 100644 --- a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLibHost.inf +++ b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLibHost.inf @@ -35,6 +35,7 @@ DhTests.c RandTests.c Pkcs7EkuTests.c + Pkcs7AttachedContentTest.c OaepEncryptTests.c RsaPssTests.c ParallelhashTests.c diff --git a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLibShell.inf b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLibShell.inf index 0450b8a29c50..956a887a3d33 100644 --- a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLibShell.inf +++ b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLibShell.inf @@ -41,6 +41,7 @@ BnTests.c EcTests.c X509Tests.c + Pkcs7AttachedContentTest.c [Packages] MdePkg/MdePkg.dec From 51e2c18a53afe8f69465c331ed36a4e8c2ace5d0 Mon Sep 17 00:00:00 2001 From: Longhaox Lee Date: Mon, 24 Nov 2025 14:16:46 +0800 Subject: [PATCH 0835/1172] CryptoPkg/BaseCryptLibUnitTest: Separate MbedTls UnitTest Library. Separate Unit test functions for MbedTls. BaseCryptLibMbedTls does not support all Crypto services So deprecate below function for MbedTls Unit test: TestVerifyEKUsWith3CertsInSignature() TestVerifyEKUsWith2CertsInSignature() TestNoEKUsInSignature() TestVerifyRsaCertPkcs1SignVerify TestVerifyPkcs7SignVerifyNonSelfIssued() TestVerifyDhGenerateKey() Pkcs1v2Decrypt Pkcs1v2EncryptDecrypt RsaOaepEncrypt (Interface) RsaOaepEncrypt (NoSeed) RsaOaepEncrypt (Seeded) RsaOaepDecrypt RsaOaepEncryptDecrypt RsaOaepEncryptPkcs1v2Decrypt Pkcs1v2EncryptRsaOaepDecrypt RsaOaepEncrypt (MdDefaultMgf1Default) RsaOaepDecrypt (MdDefaultMgf1Default) RsaOaepEncryptDecrypt (MdDefaultMgf1Default) RsaOaepEncrypt (MdSha1Bgf1Sha1 RsaOaepDecrypt (MdSha1Bgf1Sha1) RsaOaepEncryptDecrypt (MdSha1Bgf1Sha1) RsaOaepEncrypt (MdSha256Bgf1Sha256) RsaOaepDecrypt (MdSha256Bgf1Sha256) RsaOaepEncryptDecrypt (MdSha256Bgf1Sha256) TestVerifyBn() TestVerifyEcKey() TestPkcs7Attached() TestPkcs7Detached() TestVerifyPkcs7ContentData() REF: https://github.com/tianocore/edk2/issues/11605 Signed-off-by: Longhaox Lee --- CryptoPkg/Test/CryptoPkgHostUnitTest.dsc | 2 +- .../BaseCryptLibUnitTestsMbedTls.c | 74 +++++++++++++++++++ .../Library/BaseCryptLib/OaepEncryptTests.c | 12 +++ .../BaseCryptLib/Pkcs7AttachedContentTest.c | 10 +++ .../Library/BaseCryptLib/Pkcs7EkuTests.c | 15 ++++ .../Library/BaseCryptLib/RsaPkcs7Tests.c | 9 +++ .../UnitTest/Library/BaseCryptLib/RsaTests.c | 10 +++ .../Library/BaseCryptLib/TestBaseCryptLib.h | 18 +++++ .../TestBaseCryptLibHostMbedTls.inf | 54 ++++++++++++++ 9 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 CryptoPkg/Test/UnitTest/Library/BaseCryptLib/BaseCryptLibUnitTestsMbedTls.c create mode 100644 CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLibHostMbedTls.inf diff --git a/CryptoPkg/Test/CryptoPkgHostUnitTest.dsc b/CryptoPkg/Test/CryptoPkgHostUnitTest.dsc index d4d9bf008426..672b734db574 100644 --- a/CryptoPkg/Test/CryptoPkgHostUnitTest.dsc +++ b/CryptoPkg/Test/CryptoPkgHostUnitTest.dsc @@ -57,7 +57,7 @@ !endif !if $(CRYPTO_TEST_TYPE) IN "MBEDTLS" - CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLibHost.inf { + CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLibHostMbedTls.inf { BaseCryptLib|CryptoPkg/Library/BaseCryptLibMbedTls/UnitTestHostBaseCryptLib.inf OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLibSm3.inf diff --git a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/BaseCryptLibUnitTestsMbedTls.c b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/BaseCryptLibUnitTestsMbedTls.c new file mode 100644 index 000000000000..2e67dca7e910 --- /dev/null +++ b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/BaseCryptLibUnitTestsMbedTls.c @@ -0,0 +1,74 @@ +/** @file + This is defines the tests that will run on BaseCryptLib + + Copyright (c) Microsoft Corporation.
    + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include "TestBaseCryptLib.h" + +SUITE_DESC mSuiteDesc[] = { + // + // Title--------------------------Package-------------------Sup--Tdn----TestNum------------TestDesc + // + { "EKU verify tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mPkcs7EkuTestMbedTlsNum, mPkcs7EkuTestMbedTls }, + { "HASH verify tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mHashTestNum, mHashTest }, + { "HMAC verify tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mHmacTestNum, mHmacTest }, + { "BlockCipher verify tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mBlockCipherTestNum, mBlockCipherTest }, + { "RSA verify tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mRsaTestMbedTlsNum, mRsaTestMbedTls }, + { "RSA PSS verify tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mRsaPssTestNum, mRsaPssTest }, + { "RSACert verify tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mRsaCertTestNum, mRsaCertTest }, + { "PKCS7 verify tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mPkcs7TestMbedTlsNum, mPkcs7TestMbedTls }, + { "PKCS5 verify tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mPkcs5TestNum, mPkcs5Test }, + { "Authenticode verify tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mAuthenticodeTestNum, mAuthenticodeTest }, + { "ImageTimestamp verify tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mImageTimestampTestNum, mImageTimestampTest }, + { "PRNG verify tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mPrngTestNum, mPrngTest }, + { "OAEP encrypt verify tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mOaepTestMbedTlsNum, mOaepTestMbedTls }, + { "Hkdf extract and expand tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mHkdfTestNum, mHkdfTest }, + { "Aead AES Gcm tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mAeadAesGcmTestNum, mAeadAesGcmTest }, + { "X509 Verify tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mX509TestNum, mX509Test }, + { "PKCS7 Attach Content tests", "CryptoPkg.BaseCryptLib", NULL, NULL, &mPkcs7ContentTestMbedTlsNum, mPkcs7ContentTestMbedTls }, +}; + +EFI_STATUS +EFIAPI +CreateUnitTest ( + IN CHAR8 *UnitTestName, + IN CHAR8 *UnitTestVersion, + IN OUT UNIT_TEST_FRAMEWORK_HANDLE *Framework + ) +{ + EFI_STATUS Status; + UINTN SuiteIndex; + UINTN TestIndex; + + if ((Framework == NULL) || (UnitTestVersion == NULL) || (UnitTestName == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_SUCCESS; + // + // Start setting up the test framework for running the tests. + // + Status = InitUnitTestFramework (Framework, UnitTestName, gEfiCallerBaseName, UnitTestVersion); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed in InitUnitTestFramework. Status = %r\n", Status)); + goto EXIT; + } + + for (SuiteIndex = 0; SuiteIndex < ARRAY_SIZE (mSuiteDesc); SuiteIndex++) { + UNIT_TEST_SUITE_HANDLE Suite = NULL; + Status = CreateUnitTestSuite (&Suite, *Framework, mSuiteDesc[SuiteIndex].Title, mSuiteDesc[SuiteIndex].Package, mSuiteDesc[SuiteIndex].Sup, mSuiteDesc[SuiteIndex].Tdn); + if (EFI_ERROR (Status)) { + Status = EFI_OUT_OF_RESOURCES; + goto EXIT; + } + + for (TestIndex = 0; TestIndex < *mSuiteDesc[SuiteIndex].TestNum; TestIndex++) { + AddTestCase (Suite, (mSuiteDesc[SuiteIndex].TestDesc + TestIndex)->Description, (mSuiteDesc[SuiteIndex].TestDesc + TestIndex)->ClassName, (mSuiteDesc[SuiteIndex].TestDesc + TestIndex)->Func, (mSuiteDesc[SuiteIndex].TestDesc + TestIndex)->PreReq, (mSuiteDesc[SuiteIndex].TestDesc + TestIndex)->CleanUp, (mSuiteDesc[SuiteIndex].TestDesc + TestIndex)->Context); + } + } + +EXIT: + return Status; +} diff --git a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/OaepEncryptTests.c b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/OaepEncryptTests.c index b4ecb4aff080..899a1d366a5e 100644 --- a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/OaepEncryptTests.c +++ b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/OaepEncryptTests.c @@ -920,3 +920,15 @@ TEST_DESC mOaepTest[] = { }; UINTN mOaepTestNum = ARRAY_SIZE (mOaepTest); + +TEST_DESC mOaepTestMbedTls[] = { + // + // -----Description--------------------------------------Class----------------------Function-----------------Pre---Post--Context + // + // Pkcs1v2Encrypt + { "Pkcs1v2Encrypt (Interface)", "CryptoPkg.BaseCryptLib.Pkcs1v2Encrypt.Interface", TestVerifyPkcs1v2EncryptInterface, NULL, NULL, &mTestVerifyPkcs1v2Msg1230 }, + { "Pkcs1v2Encrypt (NoSeed)", "CryptoPkg.BaseCryptLib.Pkcs1v2Encrypt.NoSeed", TestVerifyEncrypt, NULL, NULL, &mTestVerifyPkcs1v2Msg1230 }, + { "Pkcs1v2Encrypt (Seeded)", "CryptoPkg.BaseCryptLib.Pkcs1v2Encrypt.Seeded", TestVerifyEncrypt, NULL, NULL, &mTestVerifyPkcs1v2Msg1230PrngSeed }, +}; + +UINTN mOaepTestMbedTlsNum = ARRAY_SIZE (mOaepTestMbedTls); diff --git a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/Pkcs7AttachedContentTest.c b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/Pkcs7AttachedContentTest.c index 87ef2c5f6cde..a54e6308aee9 100644 --- a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/Pkcs7AttachedContentTest.c +++ b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/Pkcs7AttachedContentTest.c @@ -247,3 +247,13 @@ TEST_DESC mPkcs7ContentTest[] = { }; UINTN mPkcs7ContentTestNum = ARRAY_SIZE (mPkcs7ContentTest); + +TEST_DESC mPkcs7ContentTestMbedTls[] = { + // + // -----Description--------------------------------Class----------------------------Function------------------------------Pre---Post--Context + // + { "TestWithInvalidPkcs7()", "CryptoPkg.BaseCryptLib.TestWithInvalidPkcs7", TestWithInvalidPkcs7, NULL, NULL, NULL }, + { "TestWithInvalidParameters()", "CryptoPkg.BaseCryptLib.TestWithInvalidParameters", TestWithInvalidParameters, NULL, NULL, NULL }, +}; + +UINTN mPkcs7ContentTestMbedTlsNum = ARRAY_SIZE (mPkcs7ContentTestMbedTls); diff --git a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/Pkcs7EkuTests.c b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/Pkcs7EkuTests.c index 7e3dcdc4e6a1..89cf8d324e70 100644 --- a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/Pkcs7EkuTests.c +++ b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/Pkcs7EkuTests.c @@ -541,3 +541,18 @@ TEST_DESC mPkcs7EkuTest[] = { }; UINTN mPkcs7EkuTestNum = ARRAY_SIZE (mPkcs7EkuTest); + +TEST_DESC mPkcs7EkuTestMbedTls[] = { + // + // -----Description--------------------------------Class----------------------------Function------------------------------Pre---Post--Context + // + { "TestVerifyEKUsWith1CertInSignature()", "CryptoPkg.BaseCryptLib.Eku", TestVerifyEKUsWith1CertInSignature, NULL, NULL, NULL }, + { "TestVerifyEKUsWithMultipleEKUsInCert()", "CryptoPkg.BaseCryptLib.Eku", TestVerifyEKUsWithMultipleEKUsInCert, NULL, NULL, NULL }, + { "TestEkusNotPresentInSignature()", "CryptoPkg.BaseCryptLib.Eku", TestEkusNotPresentInSignature, NULL, NULL, NULL }, + { "TestProductId10001PresentInSignature()", "CryptoPkg.BaseCryptLib.Eku", TestProductId10001PresentInSignature, NULL, NULL, NULL }, + { "TestOnlyOneEkuInListRequired()", "CryptoPkg.BaseCryptLib.Eku", TestOnlyOneEkuInListRequired, NULL, NULL, NULL }, + { "TestInvalidParameters()", "CryptoPkg.BaseCryptLib.Eku", TestInvalidParameters, NULL, NULL, NULL }, + { "TestEKUSubsetSupersetFails()", "CryptoPkg.BaseCryptLib.Eku", TestEKUSubsetSupersetFails, NULL, NULL, NULL }, +}; + +UINTN mPkcs7EkuTestMbedTlsNum = ARRAY_SIZE (mPkcs7EkuTestMbedTls); diff --git a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/RsaPkcs7Tests.c b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/RsaPkcs7Tests.c index dcb93236d46b..57663b9adc2a 100644 --- a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/RsaPkcs7Tests.c +++ b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/RsaPkcs7Tests.c @@ -668,3 +668,12 @@ TEST_DESC mPkcs7Test[] = { }; UINTN mPkcs7TestNum = ARRAY_SIZE (mPkcs7Test); + +TEST_DESC mPkcs7TestMbedTls[] = { + // + // -----Description--------------------------------------Class----------------------Function-----------------Pre---Post--Context + // + { "TestVerifyPkcs7SignVerify()", "CryptoPkg.BaseCryptLib.Pkcs7", TestVerifyPkcs7SignVerify, NULL, NULL, NULL }, +}; + +UINTN mPkcs7TestMbedTlsNum = ARRAY_SIZE (mPkcs7TestMbedTls); diff --git a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/RsaTests.c b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/RsaTests.c index f80a9b07df8b..de676b3f7cdf 100644 --- a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/RsaTests.c +++ b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/RsaTests.c @@ -340,3 +340,13 @@ TEST_DESC mRsaTest[] = { }; UINTN mRsaTestNum = ARRAY_SIZE (mRsaTest); + +TEST_DESC mRsaTestMbedTls[] = { + // + // -----Description--------------------------------------Class----------------------Function---------------------------------Pre---------------------Post---------Context + // + { "TestVerifyRsaSetGetKeyComponents()", "CryptoPkg.BaseCryptLib.Rsa", TestVerifyRsaSetGetKeyComponents, TestVerifyRsaPreReq, TestVerifyRsaCleanUp, NULL }, + { "TestVerifyRsaPkcs1SignVerify()", "CryptoPkg.BaseCryptLib.Rsa", TestVerifyRsaPkcs1SignVerify, TestVerifyRsaPreReq, TestVerifyRsaCleanUp, NULL }, +}; + +UINTN mRsaTestMbedTlsNum = ARRAY_SIZE (mRsaTestMbedTls); diff --git a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLib.h b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLib.h index 718699ba2fa7..01e25e83a076 100644 --- a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLib.h +++ b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLib.h @@ -104,6 +104,24 @@ extern TEST_DESC mX509Test[]; extern UINTN mPkcs7ContentTestNum; extern TEST_DESC mPkcs7ContentTest[]; +// +// Test Case only for MbedTls. +// +extern UINTN mPkcs7EkuTestMbedTlsNum; +extern TEST_DESC mPkcs7EkuTestMbedTls[]; + +extern UINTN mRsaTestMbedTlsNum; +extern TEST_DESC mRsaTestMbedTls[]; + +extern UINTN mPkcs7TestMbedTlsNum; +extern TEST_DESC mPkcs7TestMbedTls[]; + +extern UINTN mOaepTestMbedTlsNum; +extern TEST_DESC mOaepTestMbedTls[]; + +extern UINTN mPkcs7ContentTestMbedTlsNum; +extern TEST_DESC mPkcs7ContentTestMbedTls[]; + /** Creates a framework you can use */ EFI_STATUS EFIAPI diff --git a/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLibHostMbedTls.inf b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLibHostMbedTls.inf new file mode 100644 index 000000000000..47c08995d50e --- /dev/null +++ b/CryptoPkg/Test/UnitTest/Library/BaseCryptLib/TestBaseCryptLibHostMbedTls.inf @@ -0,0 +1,54 @@ +## @file +# Host-based UnitTest for BaseCryptLibMbedTls +# +# Copyright (c) 2025, Intel Corporation. All rights reserved.
    +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = BaseCryptLibUnitTestHost + FILE_GUID = ab0bc736-2552-4a3c-a2c5-eb106b8a75d1 + MODULE_TYPE = HOST_APPLICATION + VERSION_STRING = 1.0 + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + UnitTestMain.c + UnitTestMainHost.c + BaseCryptLibUnitTestsMbedTls.c + TestBaseCryptLib.h + HashTests.c + HmacTests.c + BlockCipherTests.c + RsaTests.c + RsaPkcs7Tests.c + Pkcs5Pbkdf2Tests.c + AuthenticodeTests.c + TSTests.c + RandTests.c + Pkcs7EkuTests.c + Pkcs7AttachedContentTest.c + OaepEncryptTests.c + RsaPssTests.c + ParallelhashTests.c + HkdfTests.c + AeadAesGcmTests.c + X509Tests.c + +[Packages] + MdePkg/MdePkg.dec + CryptoPkg/CryptoPkg.dec + +[LibraryClasses] + BaseLib + DebugLib + BaseCryptLib + UnitTestLib + MmServicesTableLib + SynchronizationLib From 6e5835d76ae27859b761003b6d57ab4ec190428f Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Mon, 24 Nov 2025 11:42:07 +0000 Subject: [PATCH 0836/1172] ArmPkg: Remove unused variable Remove unused variable caught by clang builds. Signed-off-by: Mike Beaton --- ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c b/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c index 7032409f057b..e240b7683cb0 100644 --- a/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c +++ b/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c @@ -381,7 +381,6 @@ MmCommunicationPeimCommon ( EFI_MM_COMMUNICATE_HEADER_V3 *CommunicateHeaderV3; EFI_STATUS Status; UINTN BufferSize; - UINTN HeaderSize; // // Check parameters @@ -400,7 +399,6 @@ MmCommunicationPeimCommon ( { // This is a v3 header CommunicateHeaderV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)(UINTN)CommBuffer; - HeaderSize = sizeof (EFI_MM_COMMUNICATE_HEADER_V3); BufferSize = CommunicateHeaderV3->BufferSize; } else { // This is a v1 header, do some checks @@ -429,9 +427,6 @@ MmCommunicationPeimCommon ( return EFI_BAD_BUFFER_SIZE; } - HeaderSize = sizeof (CommunicateHeader->HeaderGuid) + - sizeof (CommunicateHeader->MessageLength); - // CommBuffer is a mandatory parameter. Hence, Rely on // MessageLength + Header to ascertain the // total size of the communication payload rather than From 5d38a20196b9b9d15552ba3617ec7f63f6401a5c Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Tue, 25 Nov 2025 14:29:20 +0100 Subject: [PATCH 0837/1172] BaseTools/tools_def: Use LLD to link ACPI table binaries Currently, the CLANGDWARF toolchain on AARCH64 fails to pass the -fuse-ld=lld compiler option, and so linking ACPI table binaries falls back to the BFD linker. On non-AARCH64 build systems, this will correctly run the cross-linker, based on the -target argument passed to Clang, which therefore needs to be installed. However, the ASLCC invocation fails to pass that same -target argument, therefore producing object files for the native architecture, which the cross-linker cannot link, resulting in a build error. So pass the target in ASLCC_FLAGS as well, which is sufficient to get a working build. And for good measure, pass -fuse-ld=lld so that we don't rely on the BFD cross-linker in the first place. Signed-off-by: Ard Biesheuvel --- BaseTools/Conf/tools_def.template | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index 32085ad00af7..d19624fa4628 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -1872,8 +1872,8 @@ DEFINE CLANGDWARF_AARCH64_DLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_ *_CLANGDWARF_AARCH64_SLINK_PATH = ENV(CLANGDWARF_BIN)llvm-ar *_CLANGDWARF_AARCH64_RC_PATH = ENV(CLANGDWARF_BIN)llvm-objcopy -*_CLANGDWARF_AARCH64_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) -fno-lto -*_CLANGDWARF_AARCH64_ASLDLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_AARCH64_ASLDLINK_FLAGS) DEF(CLANGDWARF_DLINK_WARNING_FLAGS) +*_CLANGDWARF_AARCH64_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) DEF(CLANGDWARF_AARCH64_TARGET) -fno-lto +*_CLANGDWARF_AARCH64_ASLDLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_AARCH64_ASLDLINK_FLAGS) DEF(CLANGDWARF_DLINK_WARNING_FLAGS) -fuse-ld=lld *_CLANGDWARF_AARCH64_ASM_FLAGS = DEF(GCC_ASM_FLAGS) DEF(CLANGDWARF_AARCH64_TARGET) $(PLATFORM_FLAGS) -Qunused-arguments *_CLANGDWARF_AARCH64_DLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_AARCH64_DLINK_FLAGS) -z common-page-size=0x1000 DEF(CLANGDWARF_DLINK_WARNING_FLAGS) *_CLANGDWARF_AARCH64_DLINK_XIPFLAGS = -z common-page-size=0x20 From 2f644968bdc09a2571e63d3c09c429abbede8a3a Mon Sep 17 00:00:00 2001 From: Cosmo Lai Date: Mon, 17 Nov 2025 11:56:46 +0800 Subject: [PATCH 0838/1172] .pytool/HostUnitTestCompilerPlugin: Return failure if dsc path is not valid The HostUnitTestCompilerPlugin currently skips the package if the dsc path described in .ci.yaml is not valid. This change returns failure if dsc path is not valid. Signed-off-by: Cosmo Lai --- .../HostUnitTestCompilerPlugin.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.pytool/Plugin/HostUnitTestCompilerPlugin/HostUnitTestCompilerPlugin.py b/.pytool/Plugin/HostUnitTestCompilerPlugin/HostUnitTestCompilerPlugin.py index a4e8e2d6d2ba..b06f59cc51b8 100644 --- a/.pytool/Plugin/HostUnitTestCompilerPlugin/HostUnitTestCompilerPlugin.py +++ b/.pytool/Plugin/HostUnitTestCompilerPlugin/HostUnitTestCompilerPlugin.py @@ -91,14 +91,19 @@ def RunBuildPlugin(self, packagename, Edk2pathObj, pkgconfig, environment, PLM, tc.LogStdError("DscPath not found in config file. Nothing to compile for HostBasedUnitTests.") return -1 + if pkgconfig["DscPath"].strip() == "": + tc.SetSkipped() + tc.LogStdError("Package HostBasedUnitTest Dsc not assigned.") + return -1 + AP = Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(packagename) APDSC = os.path.join(AP, pkgconfig["DscPath"].strip()) AP_Path = Edk2pathObj.GetEdk2RelativePathFromAbsolutePath(APDSC) if AP is None or AP_Path is None or not os.path.isfile(APDSC): - tc.SetSkipped() + tc.SetFailed("Package HostBasedUnitTest Dsc not found: {0}".format(AP_Path), "FILE_NOT_FOUND") tc.LogStdError("Package HostBasedUnitTest Dsc not found.") - return -1 + return 1 logging.info("Building {0}".format(AP_Path)) self._env.SetValue("ACTIVE_PLATFORM", AP_Path, "Set in Compiler Plugin") From 30e72bc7c796ccf715f76ed1423e566641a16500 Mon Sep 17 00:00:00 2001 From: Zihan Qi Date: Fri, 31 Oct 2025 12:23:15 +0000 Subject: [PATCH 0839/1172] CryptoPkg/OpensslLib: Add NDEBUG flag for GCC Release builds The OpenSSL build system enables debug information by default unless NDEBUG is defined. This results in debug symbols being included in GCC Release builds. Add the NDEBUG flag to the GCC Release build flags to properly disable debug information and align with standard Release build practices. Signed-off-by: Zihan Qi --- CryptoPkg/Library/OpensslLib/OpensslLib.inf | 1 + CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf | 1 + 2 files changed, 2 insertions(+) diff --git a/CryptoPkg/Library/OpensslLib/OpensslLib.inf b/CryptoPkg/Library/OpensslLib/OpensslLib.inf index c4ecd3ad5273..e8201affb22f 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLib.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLib.inf @@ -772,6 +772,7 @@ # types appropriate to the format string specified. # -Werror=unused-but-set-variable: Warn whenever a local variable is assigned to, but otherwise unused (aside from its declaration). # + GCC:RELEASE_*_*_CC_FLAGS = -DNDEBUG GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS GCC:*_*_AARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable -Wno-error=format diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf index 4302ca9af14c..3d9668c17c79 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf @@ -722,6 +722,7 @@ # types appropriate to the format string specified. # -Werror=unused-but-set-variable: Warn whenever a local variable is assigned to, but otherwise unused (aside from its declaration). # + GCC:RELEASE_*_*_CC_FLAGS = -DNDEBUG GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS GCC:*_*_AARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable -Wno-error=format From ad5030d73171d9aae30ee74c4b2cd41686b93bcd Mon Sep 17 00:00:00 2001 From: Kedar Athawale Date: Tue, 25 Nov 2025 21:38:58 -0800 Subject: [PATCH 0840/1172] ArmPkg/ArmPsciMpServices: Prevent SIMD traps on secondary cores On AArch64, PrePi/SEC configures the primary core to avoid trapping VFP/SIMD exceptions.However, when ArmPsciMpServicesDxe enables secondary cores, FP/SIMD access is not configured, causing traps on SIMD instructions. Set FPEN bits 21:20[1] in CPACR_EL1 for secondary cores to allow FP/SIMD instructions at EL1 and prevent VFP exceptions from being trapped. Signed-off-by: Kedar Athawale --- ArmPkg/Drivers/ArmPsciMpServicesDxe/MpFuncs.S | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ArmPkg/Drivers/ArmPsciMpServicesDxe/MpFuncs.S b/ArmPkg/Drivers/ArmPsciMpServicesDxe/MpFuncs.S index 7a52a406e7bb..305e4bb7b417 100644 --- a/ArmPkg/Drivers/ArmPsciMpServicesDxe/MpFuncs.S +++ b/ArmPkg/Drivers/ArmPsciMpServicesDxe/MpFuncs.S @@ -20,6 +20,7 @@ GCC_ASM_IMPORT (gApStackSize) GCC_ASM_IMPORT (gTcr) GCC_ASM_IMPORT (gTtbr0) GCC_ASM_IMPORT (gMair) +GCC_ASM_IMPORT (ArmEnableVFP) GCC_ASM_EXPORT (ApEntryPoint) @@ -65,6 +66,7 @@ ASM_PFX(ApEntryPoint): mul x3, x2, x1 // x3 = (ProcessorIndex + 1) * gApStackSize add sp, x0, x3 // sp = gApStacksBase + x3 mov x29, xzr + bl ArmEnableVFP // Do not trap SIMD instructions bl ApProcedure // doesn't return ProcessorNotFound: From f4505b5262972020b71994ddc9909bb3852e42ea Mon Sep 17 00:00:00 2001 From: Khalid Ali Date: Sat, 8 Nov 2025 06:59:49 +0000 Subject: [PATCH 0841/1172] UefiCpuPkg/ResetVector: Fix wrong comment in Flat32SearchForSecEntryPoint() The comment "Initialize EBP and ESI to 0" indicates that register EBP and ESI are being zeroed however the registers being zeroed actually are EBX and ESI, which makes comment wrong. EBP holds BFV. Update the comment, change "EBP" to "EBX" which is correct register. Signed-off-by: Khalid Ali --- UefiCpuPkg/ResetVector/Vtf0/Ia32/SearchForSecEntry.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UefiCpuPkg/ResetVector/Vtf0/Ia32/SearchForSecEntry.asm b/UefiCpuPkg/ResetVector/Vtf0/Ia32/SearchForSecEntry.asm index 904c22df2fec..455d0ccfcb67 100644 --- a/UefiCpuPkg/ResetVector/Vtf0/Ia32/SearchForSecEntry.asm +++ b/UefiCpuPkg/ResetVector/Vtf0/Ia32/SearchForSecEntry.asm @@ -21,7 +21,7 @@ BITS 32 Flat32SearchForSecEntryPoint: ; - ; Initialize EBP and ESI to 0 + ; Initialize EBX and ESI to 0 ; xor ebx, ebx mov esi, ebx From 122f3f3514406bc176bc298df3c166c258f307ef Mon Sep 17 00:00:00 2001 From: Khalid Ali Date: Sat, 15 Nov 2025 07:29:26 +0000 Subject: [PATCH 0842/1172] UefiCpuPkg/ResetVector: Update outdated ReadMe.txt The path "UefiCpuPkg/ResetVector/Vtf0/ResetVector.inf" which mentioned in ReadMe doesn't exist. The Correct path of INF file is "UefiCpuPkg/ResetVector/Vtf0/Vtf0.inf". Update the mentioned ReadMe paths to correct valid INF path. Signed-off-by: Khalid Ali --- UefiCpuPkg/ResetVector/Vtf0/ReadMe.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UefiCpuPkg/ResetVector/Vtf0/ReadMe.txt b/UefiCpuPkg/ResetVector/Vtf0/ReadMe.txt index 4fcb15c3b13e..4d153fc1a721 100644 --- a/UefiCpuPkg/ResetVector/Vtf0/ReadMe.txt +++ b/UefiCpuPkg/ResetVector/Vtf0/ReadMe.txt @@ -1,10 +1,10 @@ === HOW TO USE VTF0 === Add this line to your DSC [Components.IA32] or [Components.X64] section: - UefiCpuPkg/ResetVector/Vtf0/ResetVector.inf + UefiCpuPkg/ResetVector/Vtf0/Vtf0.inf Add this line to your FDF FV section: - INF RuleOverride=RESET_VECTOR UefiCpuPkg/ResetVector/Vtf0/ResetVector.inf + INF RuleOverride=RESET_VECTOR UefiCpuPkg/ResetVector/Vtf0/Vtf0.inf In your FDF FFS file rules sections add: [Rule.Common.SEC.RESET_VECTOR] From 33e4e73a17bff0823bc916998169b926115b0c6b Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Mon, 24 Nov 2025 20:40:28 +0000 Subject: [PATCH 0843/1172] ArmPkg: Fix errors in MiscChassisManufacturerFunction Initial error found while attempting to implement Azure Pipelines CLANGDWARF CI: ERROR - Compiler #error from /__w/1/s/ArmPkg/Universal/Smbios/SmbiosMiscDx e/Type03/MiscChassisManufacturerFunction.c variable 'ContainedElements' is uninitialized when passed as a const pointer argument here [-Werror,-Wunin itialized-const-pointer] The code in question should copy the optional ContainedElements from InputData, so fix it so that it does. Additionally: - Various size calculations in the original code are incorrect, since the base size for calculations should not include ContainedElements, so fix these. - Since we are calculating Hdr.Length separately as part of the above, add code to ASSERT and return EFI_OUT_OF_RESOURCES if it would overflow the UINT8 location where it will be stored. - Since we are adding a new early exit, fix the fact that no error log message is generated on early exit. Fixes: bfc0fae459543442f3f17e0de655a72aba5b0920 Signed-off-by: Mike Beaton --- .../Type03/MiscChassisManufacturerFunction.c | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c index 6b3b63b0e8d5..363f3bfe30d6 100644 --- a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c @@ -45,6 +45,9 @@ SMBIOS_MISC_TABLE_FUNCTION (MiscChassisManufacturer) { UINTN AssertTagStrLen; UINTN SerialNumStrLen; UINTN ChaNumStrLen; + UINTN BaseSize; + UINTN ExtendLength; + UINTN HdrLength; EFI_STRING Manufacturer; EFI_STRING Version; EFI_STRING SerialNumber; @@ -55,12 +58,6 @@ SMBIOS_MISC_TABLE_FUNCTION (MiscChassisManufacturer) { SMBIOS_TABLE_TYPE3 *InputData; EFI_STATUS Status; - UINT8 ContainedElementCount; - CONTAINED_ELEMENT ContainedElements; - UINT8 ExtendLength; - - ExtendLength = 0; - // // First check for invalid parameters. // @@ -116,14 +113,25 @@ SMBIOS_MISC_TABLE_FUNCTION (MiscChassisManufacturer) { ChassisSkuNumber = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL); ChaNumStrLen = StrLen (ChassisSkuNumber); - ContainedElementCount = InputData->ContainedElementCount; - ExtendLength = ContainedElementCount * sizeof (CONTAINED_ELEMENT); + STATIC_ASSERT (OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElements) == 0x15, "Base size of SMBIOS_TABLE_TYPE3 does not meet SMBIOS specification"); + + BaseSize = OFFSET_OF (SMBIOS_TABLE_TYPE3, ContainedElements); + ExtendLength = (UINTN)InputData->ContainedElementCount * (UINTN)InputData->ContainedElementRecordLength; + + // + // Length of SMBIOS struct includes ContainedElements and SKUNumber. + // + HdrLength = BaseSize + ExtendLength + sizeof (SMBIOS_TABLE_STRING); + if (HdrLength > MAX_UINT8) { + ASSERT (HdrLength <= MAX_UINT8); + Status = EFI_OUT_OF_RESOURCES; + goto Exit; + } // - // Two zeros following the last string. + // Additional zero follows the last string. // - RecordLength = sizeof (SMBIOS_TABLE_TYPE3) + - ExtendLength + 1 + + RecordLength = HdrLength + ManuStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + @@ -135,25 +143,20 @@ SMBIOS_MISC_TABLE_FUNCTION (MiscChassisManufacturer) { goto Exit; } - (VOID)CopyMem (SmbiosRecord, InputData, sizeof (SMBIOS_TABLE_TYPE3)); + // Copy base record plus ContainedElements. + (VOID)CopyMem (SmbiosRecord, InputData, BaseSize + ExtendLength); - SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE3) + ExtendLength + 1; + SmbiosRecord->Hdr.Length = HdrLength; SmbiosRecord->Type = OemGetChassisType (); - // ContainedElements - ASSERT (ContainedElementCount < 2); - (VOID)CopyMem (SmbiosRecord + 1, &ContainedElements, ExtendLength); - // ChassisSkuNumber - SkuNumberField = (UINT8 *)SmbiosRecord + - sizeof (SMBIOS_TABLE_TYPE3) - - sizeof (CONTAINED_ELEMENT) + ExtendLength; + SkuNumberField = (UINT8 *)SmbiosRecord + BaseSize + ExtendLength; + // The string numbers in the fixed position portion of the record are populated in the input data. *SkuNumberField = 5; - OptionalStrStart = (CHAR8 *)((UINT8 *)SmbiosRecord + sizeof (SMBIOS_TABLE_TYPE3) + - ExtendLength + 1); + OptionalStrStart = (CHAR8 *)((UINT8 *)SmbiosRecord + HdrLength); UnicodeStrToAsciiStrS (Manufacturer, OptionalStrStart, ManuStrLen + 1); StrStart = OptionalStrStart + ManuStrLen + 1; UnicodeStrToAsciiStrS (Version, StrStart, VerStrLen + 1); @@ -175,6 +178,10 @@ SMBIOS_MISC_TABLE_FUNCTION (MiscChassisManufacturer) { // Now we have got the full smbios record, call smbios protocol to add this record. // Status = SmbiosMiscAddRecord ((UINT8 *)SmbiosRecord, NULL); + + FreePool (SmbiosRecord); + +Exit: if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, @@ -185,9 +192,6 @@ SMBIOS_MISC_TABLE_FUNCTION (MiscChassisManufacturer) { )); } - FreePool (SmbiosRecord); - -Exit: if (Manufacturer != NULL) { FreePool (Manufacturer); } From 04972ca2cf5e70a9f443a55353276fcc3a0e957c Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Mon, 24 Nov 2025 21:10:18 +0000 Subject: [PATCH 0844/1172] ArmPkg: Switch to AllocatePool in MiscChassisManufacturerFunction There was only one byte uninitialized in the function as fixed in the previous commit. Explicitly initialize it and switch to AllocatePool. Signed-off-by: Mike Beaton --- .../Type03/MiscChassisManufacturerFunction.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c index 363f3bfe30d6..2b814717638e 100644 --- a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c @@ -36,7 +36,6 @@ **/ SMBIOS_MISC_TABLE_FUNCTION (MiscChassisManufacturer) { - CHAR8 *OptionalStrStart; CHAR8 *StrStart; UINT8 *SkuNumberField; UINTN RecordLength; @@ -137,7 +136,7 @@ SMBIOS_MISC_TABLE_FUNCTION (MiscChassisManufacturer) { SerialNumStrLen + 1 + AssertTagStrLen + 1 + ChaNumStrLen + 1 + 1; - SmbiosRecord = AllocateZeroPool (RecordLength); + SmbiosRecord = AllocatePool (RecordLength); if (SmbiosRecord == NULL) { Status = EFI_OUT_OF_RESOURCES; goto Exit; @@ -156,9 +155,9 @@ SMBIOS_MISC_TABLE_FUNCTION (MiscChassisManufacturer) { // The string numbers in the fixed position portion of the record are populated in the input data. *SkuNumberField = 5; - OptionalStrStart = (CHAR8 *)((UINT8 *)SmbiosRecord + HdrLength); - UnicodeStrToAsciiStrS (Manufacturer, OptionalStrStart, ManuStrLen + 1); - StrStart = OptionalStrStart + ManuStrLen + 1; + StrStart = (CHAR8 *)((UINT8 *)SmbiosRecord + HdrLength); + UnicodeStrToAsciiStrS (Manufacturer, StrStart, ManuStrLen + 1); + StrStart += ManuStrLen + 1; UnicodeStrToAsciiStrS (Version, StrStart, VerStrLen + 1); StrStart += VerStrLen + 1; UnicodeStrToAsciiStrS (SerialNumber, StrStart, SerialNumStrLen + 1); @@ -166,6 +165,8 @@ SMBIOS_MISC_TABLE_FUNCTION (MiscChassisManufacturer) { UnicodeStrToAsciiStrS (AssertTag, StrStart, AssertTagStrLen + 1); StrStart += AssertTagStrLen + 1; UnicodeStrToAsciiStrS (ChassisSkuNumber, StrStart, ChaNumStrLen + 1); + StrStart += ChaNumStrLen + 1; + *StrStart = '\0'; SmbiosRecord->BootupState = OemGetChassisBootupState (); SmbiosRecord->PowerSupplyState = OemGetChassisPowerSupplyState (); From 68d8f3a3d2c78ee301f73d484f04e1f00926846b Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Mon, 24 Nov 2025 21:13:02 +0000 Subject: [PATCH 0845/1172] ArmPkg: Add additional ASSERT in MiscChassisManufacturerFunction In this revised version of the code, we start with a pointer immediately past the end of the parts of the struct specified in the input data, and hopefully end up with a pointer at the end of the entire SMBIOS struct (version dependent part(s) and all), plus appended strings. If we switch to doing this fully incrementally - always updating where we are by adding to the previous pointer - then it seems worth adding an ASSERT to confirm that we got to the end correctly. The other change applied here in addition to the ASSERT is in order to make each next pointer be calculated strictly by adding the intended size to the immediately previous one, as all the other pointer changes already were. Signed-off-by: Mike Beaton --- .../Type03/MiscChassisManufacturerFunction.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c index 2b814717638e..bdb8f609d977 100644 --- a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c @@ -155,7 +155,7 @@ SMBIOS_MISC_TABLE_FUNCTION (MiscChassisManufacturer) { // The string numbers in the fixed position portion of the record are populated in the input data. *SkuNumberField = 5; - StrStart = (CHAR8 *)((UINT8 *)SmbiosRecord + HdrLength); + StrStart = (CHAR8 *)((UINT8 *)SkuNumberField + sizeof (SMBIOS_TABLE_STRING)); UnicodeStrToAsciiStrS (Manufacturer, StrStart, ManuStrLen + 1); StrStart += ManuStrLen + 1; UnicodeStrToAsciiStrS (Version, StrStart, VerStrLen + 1); @@ -165,8 +165,10 @@ SMBIOS_MISC_TABLE_FUNCTION (MiscChassisManufacturer) { UnicodeStrToAsciiStrS (AssertTag, StrStart, AssertTagStrLen + 1); StrStart += AssertTagStrLen + 1; UnicodeStrToAsciiStrS (ChassisSkuNumber, StrStart, ChaNumStrLen + 1); - StrStart += ChaNumStrLen + 1; - *StrStart = '\0'; + StrStart += ChaNumStrLen + 1; + *StrStart++ = '\0'; + + ASSERT ((UINT8 *)StrStart - (UINT8 *)SmbiosRecord == RecordLength); SmbiosRecord->BootupState = OemGetChassisBootupState (); SmbiosRecord->PowerSupplyState = OemGetChassisPowerSupplyState (); From af9cc80359e320690877e4add870aa13fe889fbe Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Tue, 25 Nov 2025 20:57:32 +0000 Subject: [PATCH 0846/1172] ArmPkg: Update type for SkuNumberField in MiscChassisManufacturerFunction SMBIOS_TABLE_STRING is the correct type for the field, even though that is itself defined as UINT8. There are five strings handled by this function. Their string numbers are stored in the five SMBIOS_TABLE_STRING values in the SMBIOS_TABLE_TYPE3 struct. Four of these are defined, with that type, in the fixed-position portion of the struct, before ContainedElements, and the fifth is the field which this pointer references (as can be discovered from the comments on the SMBIOS_TABLE_TYPE3, as well as the usage of this value). This is clearer when reading the code when the correct type is used. Signed-off-by: Mike Beaton --- .../Type03/MiscChassisManufacturerFunction.c | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c index bdb8f609d977..16f3e8618815 100644 --- a/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c +++ b/ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c @@ -36,26 +36,26 @@ **/ SMBIOS_MISC_TABLE_FUNCTION (MiscChassisManufacturer) { - CHAR8 *StrStart; - UINT8 *SkuNumberField; - UINTN RecordLength; - UINTN ManuStrLen; - UINTN VerStrLen; - UINTN AssertTagStrLen; - UINTN SerialNumStrLen; - UINTN ChaNumStrLen; - UINTN BaseSize; - UINTN ExtendLength; - UINTN HdrLength; - EFI_STRING Manufacturer; - EFI_STRING Version; - EFI_STRING SerialNumber; - EFI_STRING AssertTag; - EFI_STRING ChassisSkuNumber; - EFI_STRING_ID TokenToGet; - SMBIOS_TABLE_TYPE3 *SmbiosRecord; - SMBIOS_TABLE_TYPE3 *InputData; - EFI_STATUS Status; + CHAR8 *StrStart; + SMBIOS_TABLE_STRING *SkuNumberField; + UINTN RecordLength; + UINTN ManuStrLen; + UINTN VerStrLen; + UINTN AssertTagStrLen; + UINTN SerialNumStrLen; + UINTN ChaNumStrLen; + UINTN BaseSize; + UINTN ExtendLength; + UINTN HdrLength; + EFI_STRING Manufacturer; + EFI_STRING Version; + EFI_STRING SerialNumber; + EFI_STRING AssertTag; + EFI_STRING ChassisSkuNumber; + EFI_STRING_ID TokenToGet; + SMBIOS_TABLE_TYPE3 *SmbiosRecord; + SMBIOS_TABLE_TYPE3 *InputData; + EFI_STATUS Status; // // First check for invalid parameters. @@ -150,7 +150,7 @@ SMBIOS_MISC_TABLE_FUNCTION (MiscChassisManufacturer) { SmbiosRecord->Type = OemGetChassisType (); // ChassisSkuNumber - SkuNumberField = (UINT8 *)SmbiosRecord + BaseSize + ExtendLength; + SkuNumberField = (SMBIOS_TABLE_STRING *)((UINT8 *)SmbiosRecord + BaseSize + ExtendLength); // The string numbers in the fixed position portion of the record are populated in the input data. *SkuNumberField = 5; From aacfbe667ecd17c156228ba64e537355ce44e62e Mon Sep 17 00:00:00 2001 From: Longhaox Lee Date: Thu, 27 Nov 2025 16:16:34 +0800 Subject: [PATCH 0847/1172] CryptoPkg : Added CRT defined for big number support for Mbedtls. defined ULLONG_MAX in CrtLibSupport header file. Signed-off-by: Longhaox Lee --- CryptoPkg/Library/Include/CrtLibSupport.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CryptoPkg/Library/Include/CrtLibSupport.h b/CryptoPkg/Library/Include/CrtLibSupport.h index c09a9fabc7b1..613d4184933e 100644 --- a/CryptoPkg/Library/Include/CrtLibSupport.h +++ b/CryptoPkg/Library/Include/CrtLibSupport.h @@ -475,6 +475,10 @@ strpbrk ( #define UINT64_MAX 0xFFFFFFFFFFFFFFFFUL #endif +#ifndef ULLONG_MAX +#define ULLONG_MAX 0xFFFFFFFFFFFFFFFFUL +#endif + #undef UINTPTR_MAX #if (UINT_MAX > 0xFFFFFFFFUL) #define UINTPTR_MAX 0xFFFFFFFFFFFFFFFFUL From 7410754041bb994c685874a3bb62992c9da7d30a Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Sat, 29 Nov 2025 14:37:07 +0000 Subject: [PATCH 0848/1172] SecurityPkg/HashLibTpm2: Fix unused variable usage There is an unused variable in SecurityPkg/Library/HashLibTpm2/HashLibTpm2PeilessSecLib.c which is spotted by CLANG builds. The correct fix here is not to just remove the unused assignment, but rather to fix the line following it, which should have been using the unused value in the way that it now does. Fixes: https://github.com/tianocore/edk2/commit/9c651ef83a74d83219075316aa5d1c189ed608c8 Co-authored-by: Ard Biesheuvel Signed-off-by: Mike Beaton --- SecurityPkg/Library/HashLibTpm2/HashLibTpm2PeilessSecLib.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/SecurityPkg/Library/HashLibTpm2/HashLibTpm2PeilessSecLib.c b/SecurityPkg/Library/HashLibTpm2/HashLibTpm2PeilessSecLib.c index 39fff8e90de1..5d07d0e5ec33 100644 --- a/SecurityPkg/Library/HashLibTpm2/HashLibTpm2PeilessSecLib.c +++ b/SecurityPkg/Library/HashLibTpm2/HashLibTpm2PeilessSecLib.c @@ -586,9 +586,7 @@ HasLibTpm2PeilessSecLibConstructor ( } TcgPcrEvent = (TCG_PCR_EVENT *)EventLog; - TcgEfiSpecIdEventStruct = (TCG_EfiSpecIDEventStruct *) - (EventLog + OFFSET_OF (TCG_PCR_EVENT, Event)); - + TcgEfiSpecIdEventStruct = (TCG_EfiSpecIDEventStruct *)TcgPcrEvent->Event; CopyMem (&NumberOfAlgorithms, TcgEfiSpecIdEventStruct + 1, sizeof (NumberOfAlgorithms)); DigestSize = (TCG_EfiSpecIdEventAlgorithmSize *)((UINT8 *)TcgEfiSpecIdEventStruct + sizeof (*TcgEfiSpecIdEventStruct) + sizeof (NumberOfAlgorithms)); From 73f4f53defca37fc959a4ec5d789e8095e34ef96 Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Sat, 22 Nov 2025 20:27:08 +0000 Subject: [PATCH 0849/1172] .azurepipelines: Upgrade CmdLine@1 to CmdLine@2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit During CI, Azure Pipelines is producing warnings such as: ``` Task 'Command Line' version 1 (CmdLine@1) is dependent on a Node version (6) that is end-of-life. Contact the extension owner for an updated version of the task. Task maintainers should review Node upgrade guidance: https://aka.ms/node-runner-guidance Build_GCC5 TARGET_CRYPTO_RELEASE • Initialize job ``` Here we upgrade CmdLine@1 to CmdLine@2, which is the current latest version listed at: https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/ From a quick check with grep, all other tasks in use, namely ``` - task: CopyFiles@2 - task: PublishBuildArtifacts@1 - task: PublishTestResults@2 ``` are already at latest versions, except for `NodeTool@0` which is updated in the following commit. Signed-off-by: Mike Beaton --- .../templates/basetools-build-steps.yml | 6 ++-- .../templates/platform-build-run-steps.yml | 30 +++++++++---------- .azurepipelines/templates/pr-gate-steps.yml | 24 +++++++-------- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/.azurepipelines/templates/basetools-build-steps.yml b/.azurepipelines/templates/basetools-build-steps.yml index a72758bc3395..a93decaf9689 100644 --- a/.azurepipelines/templates/basetools-build-steps.yml +++ b/.azurepipelines/templates/basetools-build-steps.yml @@ -10,11 +10,11 @@ parameters: tool_chain_tag: '' steps: -- task: CmdLine@1 +- task: CmdLine@2 displayName: Build Base Tools from source inputs: - filename: python - arguments: BaseTools/Edk2ToolsBuild.py -t ${{ parameters.tool_chain_tag }} + script: | + python BaseTools/Edk2ToolsBuild.py -t ${{ parameters.tool_chain_tag }} condition: and(gt(variables.pkg_count, 0), succeeded()) - task: CopyFiles@2 diff --git a/.azurepipelines/templates/platform-build-run-steps.yml b/.azurepipelines/templates/platform-build-run-steps.yml index 480979b5f82f..5190cf298cde 100644 --- a/.azurepipelines/templates/platform-build-run-steps.yml +++ b/.azurepipelines/templates/platform-build-run-steps.yml @@ -73,27 +73,27 @@ steps: condition: eq(variables['Build.Reason'], 'PullRequest') # trim the package list if this is a PR -- task: CmdLine@1 +- task: CmdLine@2 displayName: Check if ${{ parameters.build_pkg }} need testing inputs: - filename: stuart_pr_eval - arguments: -c ${{ parameters.build_file }} -t ${{ parameters.build_target}} -a ${{ parameters.build_arch}} --pr-target origin/$(System.PullRequest.targetBranch) --output-count-format-string "##vso[task.setvariable variable=pkg_count;isOutpout=true]{pkgcount}" + script: | + stuart_pr_eval -c ${{ parameters.build_file }} -t ${{ parameters.build_target}} -a ${{ parameters.build_arch}} --pr-target origin/$(System.PullRequest.targetBranch) --output-count-format-string "##vso[task.setvariable variable=pkg_count;isOutpout=true]{pkgcount}" condition: eq(variables['Build.Reason'], 'PullRequest') # Setup repo -- task: CmdLine@1 +- task: CmdLine@2 displayName: Setup inputs: - filename: stuart_setup - arguments: -c ${{ parameters.build_file }} TOOL_CHAIN_TAG=${{ parameters.tool_chain_tag}} -t ${{ parameters.build_target}} -a ${{ parameters.build_arch}} ${{ parameters.build_flags}} + script: | + stuart_setup -c ${{ parameters.build_file }} TOOL_CHAIN_TAG=${{ parameters.tool_chain_tag}} -t ${{ parameters.build_target}} -a ${{ parameters.build_arch}} ${{ parameters.build_flags}} condition: and(gt(variables.pkg_count, 0), succeeded()) # Stuart Update -- task: CmdLine@1 +- task: CmdLine@2 displayName: Update inputs: - filename: stuart_update - arguments: -c ${{ parameters.build_file }} TOOL_CHAIN_TAG=${{ parameters.tool_chain_tag}} -t ${{ parameters.build_target}} -a ${{ parameters.build_arch}} ${{ parameters.build_flags}} + script: | + stuart_update -c ${{ parameters.build_file }} TOOL_CHAIN_TAG=${{ parameters.tool_chain_tag}} -t ${{ parameters.build_target}} -a ${{ parameters.build_arch}} ${{ parameters.build_flags}} condition: and(gt(variables.pkg_count, 0), succeeded()) # build basetools @@ -107,19 +107,19 @@ steps: - ${{ parameters.extra_install_step }} # Build -- task: CmdLine@1 +- task: CmdLine@2 displayName: Build inputs: - filename: stuart_build - arguments: -c ${{ parameters.build_file }} TOOL_CHAIN_TAG=${{ parameters.tool_chain_tag}} TARGET=${{ parameters.build_target}} -a ${{ parameters.build_arch}} ${{ parameters.build_flags}} + script: | + stuart_build -c ${{ parameters.build_file }} TOOL_CHAIN_TAG=${{ parameters.tool_chain_tag}} TARGET=${{ parameters.build_target}} -a ${{ parameters.build_arch}} ${{ parameters.build_flags}} condition: and(gt(variables.pkg_count, 0), succeeded()) # Run -- task: CmdLine@1 +- task: CmdLine@2 displayName: Run to shell inputs: - filename: stuart_build - arguments: -c ${{ parameters.build_file }} TOOL_CHAIN_TAG=${{ parameters.tool_chain_tag}} TARGET=${{ parameters.build_target}} -a ${{ parameters.build_arch}} ${{ parameters.build_flags}} ${{ parameters.run_flags }} --FlashOnly + script: | + stuart_build -c ${{ parameters.build_file }} TOOL_CHAIN_TAG=${{ parameters.tool_chain_tag}} TARGET=${{ parameters.build_target}} -a ${{ parameters.build_arch}} ${{ parameters.build_flags}} ${{ parameters.run_flags }} --FlashOnly condition: and(and(gt(variables.pkg_count, 0), succeeded()), eq(variables['Run'], true)) timeoutInMinutes: 2 diff --git a/.azurepipelines/templates/pr-gate-steps.yml b/.azurepipelines/templates/pr-gate-steps.yml index 944b91412da6..21bf37ac512a 100644 --- a/.azurepipelines/templates/pr-gate-steps.yml +++ b/.azurepipelines/templates/pr-gate-steps.yml @@ -54,29 +54,29 @@ steps: - ${{ parameters.extra_install_step }} # trim the package list if this is a PR -- task: CmdLine@1 +- task: CmdLine@2 displayName: Check if ${{ parameters.build_pkgs }} need testing inputs: - filename: stuart_pr_eval - arguments: -c .pytool/CISettings.py -p ${{ parameters.build_pkgs }} --pr-target origin/$(System.PullRequest.targetBranch) --output-csv-format-string "##vso[task.setvariable variable=pkgs_to_build;isOutpout=true]{pkgcsv}" --output-count-format-string "##vso[task.setvariable variable=pkg_count;isOutpout=true]{pkgcount}" + script: | + stuart_pr_eval -c .pytool/CISettings.py -p ${{ parameters.build_pkgs }} --pr-target origin/$(System.PullRequest.targetBranch) --output-csv-format-string "##vso[task.setvariable variable=pkgs_to_build;isOutpout=true]{pkgcsv}" --output-count-format-string "##vso[task.setvariable variable=pkg_count;isOutpout=true]{pkgcount}" condition: eq(variables['Build.Reason'], 'PullRequest') # install spell check prereqs - template: spell-check-prereq-steps.yml # Build repo -- task: CmdLine@1 +- task: CmdLine@2 displayName: Setup ${{ parameters.build_pkgs }} ${{ parameters.build_archs}} inputs: - filename: stuart_setup - arguments: -c .pytool/CISettings.py -p $(pkgs_to_build) -t ${{ parameters.build_targets}} -a ${{ parameters.build_archs}} TOOL_CHAIN_TAG=${{ parameters.tool_chain_tag}} + script: | + stuart_setup -c .pytool/CISettings.py -p $(pkgs_to_build) -t ${{ parameters.build_targets}} -a ${{ parameters.build_archs}} TOOL_CHAIN_TAG=${{ parameters.tool_chain_tag}} condition: and(gt(variables.pkg_count, 0), succeeded()) -- task: CmdLine@1 +- task: CmdLine@2 displayName: Update ${{ parameters.build_pkgs }} ${{ parameters.build_archs}} inputs: - filename: stuart_update - arguments: -c .pytool/CISettings.py -p $(pkgs_to_build) -t ${{ parameters.build_targets}} -a ${{ parameters.build_archs}} TOOL_CHAIN_TAG=${{ parameters.tool_chain_tag}} + script: | + stuart_update -c .pytool/CISettings.py -p $(pkgs_to_build) -t ${{ parameters.build_targets}} -a ${{ parameters.build_archs}} TOOL_CHAIN_TAG=${{ parameters.tool_chain_tag}} condition: and(gt(variables.pkg_count, 0), succeeded()) # build basetools @@ -86,11 +86,11 @@ steps: parameters: tool_chain_tag: ${{ parameters.tool_chain_tag }} -- task: CmdLine@1 +- task: CmdLine@2 displayName: Build and Test ${{ parameters.build_pkgs }} ${{ parameters.build_archs}} inputs: - filename: stuart_ci_build - arguments: -c .pytool/CISettings.py -p $(pkgs_to_build) -t ${{ parameters.build_targets}} -a ${{ parameters.build_archs}} TOOL_CHAIN_TAG=${{ parameters.tool_chain_tag}} + script: | + stuart_ci_build -c .pytool/CISettings.py -p $(pkgs_to_build) -t ${{ parameters.build_targets}} -a ${{ parameters.build_archs}} TOOL_CHAIN_TAG=${{ parameters.tool_chain_tag}} condition: and(gt(variables.pkg_count, 0), succeeded()) # Publish Test Results to Azure Pipelines/TFS From d22277be6e8ca461396ed443bbe0e9db19a0c3bf Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Sun, 23 Nov 2025 19:25:42 +0000 Subject: [PATCH 0850/1172] .azurepipelines: Upgrade NodeTool@0 to UseNode@1 In addition to upgrading from CmdLine@1 to CmdLine@2 in the previous commit, there is one further Azure Pipelines task in use in CI which is as of now has a newer version available: https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/node-tool-v0 https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/use-node-v1 so we upgrade that in this commit. Note that `checkLatest` is described in exactly the same terms in both versions, so it is assumed that the commented out line `#checkLatest: false # Optional` is valid to leave in place for commenting in if required. Signed-off-by: Mike Beaton --- .azurepipelines/templates/spell-check-prereq-steps.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.azurepipelines/templates/spell-check-prereq-steps.yml b/.azurepipelines/templates/spell-check-prereq-steps.yml index 226909d54c4e..cffa166cefe7 100644 --- a/.azurepipelines/templates/spell-check-prereq-steps.yml +++ b/.azurepipelines/templates/spell-check-prereq-steps.yml @@ -11,9 +11,9 @@ parameters: none: '' steps: -- task: NodeTool@0 +- task: UseNode@1 inputs: - versionSpec: '14.x' + version: '14.x' #checkLatest: false # Optional condition: and(gt(variables.pkg_count, 0), succeeded()) From e15fd3af7275eed486f322f6e33a32a5bec2d63a Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Tue, 25 Nov 2025 20:12:48 +0000 Subject: [PATCH 0851/1172] DynamicTablesPkg,.azurepipelines: Upgrade Node from 14.x to LTS 24.x Apparently cspell was not properly working with the previous node version, which means some cspell failures have crept in, so we also introduce new required spellcheck exceptions: cavium https://github.com/tianocore/edk2/blob/2f644968bdc09a2571e63d3c09c429abbede8a3a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/SmmuV3Parser.c#L373 eventq https://github.com/tianocore/edk2/blob/2f644968bdc09a2571e63d3c09c429abbede8a3a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/SmmuV3Parser.c#L352 gerror https://github.com/tianocore/edk2/blob/2f644968bdc09a2571e63d3c09c429abbede8a3a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/Iort/SmmuV3Parser.c#L356 All introduced in 954ee29013899ebdc9c263b3bd6268015dafc07a . Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Mike Beaton --- .azurepipelines/templates/spell-check-prereq-steps.yml | 2 +- DynamicTablesPkg/DynamicTablesPkg.ci.yaml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.azurepipelines/templates/spell-check-prereq-steps.yml b/.azurepipelines/templates/spell-check-prereq-steps.yml index cffa166cefe7..94873d807681 100644 --- a/.azurepipelines/templates/spell-check-prereq-steps.yml +++ b/.azurepipelines/templates/spell-check-prereq-steps.yml @@ -13,7 +13,7 @@ parameters: steps: - task: UseNode@1 inputs: - version: '14.x' + version: '24.x' #checkLatest: false # Optional condition: and(gt(variables.pkg_count, 0), succeeded()) diff --git a/DynamicTablesPkg/DynamicTablesPkg.ci.yaml b/DynamicTablesPkg/DynamicTablesPkg.ci.yaml index 2c0dcefefb1a..f011cc2c25a6 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.ci.yaml +++ b/DynamicTablesPkg/DynamicTablesPkg.ci.yaml @@ -103,6 +103,7 @@ "AMLDBG", "EISAID", "cacheablity", + "cavium", "CCIDX", "CCSIDR", "cfmws", @@ -110,7 +111,9 @@ "deviceid", "EArch", "edynamic", + "eventq", "EOBJECT", + "gerror", "invoc", "ITARGETSR", "GTBLOCK", From 4411321f7009854eed61a4c03ec9660502daf2eb Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Tue, 25 Nov 2025 19:56:57 +0000 Subject: [PATCH 0852/1172] .pytool: Add link to wiki How to Build With Stuart page https://github.com/tianocore/tianocore.github.io/wiki/EDK-II-Code-Formatting#installing-uncrustify provides no detailed, actionable information on actually installing uncrustify (IMO), but does link to https://github.com/tianocore/edk2/tree/master/.pytool#running-ci-locally , which again provides no detailed actionable information on running CI locally (IMO). This commit adds a link from the second document above to https://github.com/tianocore/tianocore.github.io/wiki/How-to-Build-With-Stuart , which provides detailed, actionable information on how to install working, local CI, including working uncrustify. Hopefully this allows anyone who ends up on either of the linked sections in the first two docs to fairly easily get to the actionable information in the third, if they need it. Signed-off-by: Mike Beaton --- .pytool/Readme.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.pytool/Readme.md b/.pytool/Readme.md index e74e50221388..da64d3d01678 100644 --- a/.pytool/Readme.md +++ b/.pytool/Readme.md @@ -86,8 +86,10 @@ per package configuration which comes from this file. The EDKII Tools environment (and by extension the ci) is designed to support easily and consistently running locally and in a cloud ci environment. To do -that a few steps should be followed. Details of EDKII Tools can be found in the -[docs folder here](https://github.com/tianocore/edk2-pytool-extensions/tree/master/docs) +that a few steps should be followed. These steps are detailed on the +[How to Build With Stuart](https://github.com/tianocore/tianocore.github.io/wiki/How-to-Build-With-Stuart) +page. Details of EDKII Tools can be found in the +[docs folder here](https://github.com/tianocore/edk2-pytool-extensions/tree/master/docs). ### Running CI From 43e86ce5d5fcca1c4b6b45067ccd8a6cfab0e2b5 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Tue, 25 Nov 2025 20:22:17 -0500 Subject: [PATCH 0853/1172] .github/scripts: Make reviewer filtering case insensitive The `add_reviewers_to_pr()` function in GitHub.py did not compare all usernames without case sensitivity which could cause a reviewer that has already reviewed a pull request to be re-requested. The occurred under the following conditions: - GetMaintainer.py returns usernames from Maintainers.txt (e.g. "user") - GitHub API returns usernames in their actual case (e.g. "User") - The exclusion filter used case-sensitive comparison so the match is not detected Fixed by converting the exclusion set to lowercase and performing case-insensitive comparison when filtering for new reviewers. Signed-off-by: Michael Kubacki --- .github/scripts/GitHub.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/scripts/GitHub.py b/.github/scripts/GitHub.py index 5c0709e777b0..3268a81178ca 100644 --- a/.github/scripts/GitHub.py +++ b/.github/scripts/GitHub.py @@ -232,8 +232,13 @@ def add_reviewers_to_pr( repo_collaborators = [c.login.strip().lower() for c in repo_gh.get_collaborators() if c] non_collaborators = [u for u in user_names if u.lower() not in repo_collaborators] - excluded_pr_reviewers = [pr_author] + current_pr_reviewers + non_collaborators - new_pr_reviewers = [u for u in user_names if u not in excluded_pr_reviewers] + excluded_pr_reviewers = { + e.lower() + for e in [pr_author] + current_pr_reviewers + non_collaborators + } + new_pr_reviewers = [ + u for u in user_names if u.lower() not in excluded_pr_reviewers + ] # Notify the admins of the repository if non-collaborators are requested. if non_collaborators: From 3af7eccf472d2308201fccc805db7e06acabd47c Mon Sep 17 00:00:00 2001 From: Jeremy Compostella Date: Wed, 26 Nov 2025 10:35:13 -0800 Subject: [PATCH 0854/1172] BaseTools: AutoGen: Optimize tuple creation using tuple() for PcdDbBuffer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace manual loop-based tuple construction with the built-in tuple() function when converting PcdDbBuffer to a tuple. This change significantly improves performance—approximately three times faster—resulting in substantial build time savings in large environments. Previously, the code iterated over each byte in PcdDbBuffer, unpacking and appending it to a tuple. The new approach leverages tuple(PcdDbBuffer) to achieve the same result more efficiently. The generated tuple remains identical to the original implementation. TEST=The generated tuple is the same than with to original code Signed-off-by: Jeremy Compostella --- BaseTools/Source/Python/AutoGen/GenPcdDb.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/BaseTools/Source/Python/AutoGen/GenPcdDb.py b/BaseTools/Source/Python/AutoGen/GenPcdDb.py index 28df647bfe4e..d2cac62d1cf3 100644 --- a/BaseTools/Source/Python/AutoGen/GenPcdDb.py +++ b/BaseTools/Source/Python/AutoGen/GenPcdDb.py @@ -942,9 +942,7 @@ def prune_sku(pcd, skuname): if DynamicPcdSet_Sku: for skuname, skuid in DynamicPcdSet_Sku: AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer, VarCheckTab = CreatePcdDatabasePhaseSpecificAutoGen (Platform, DynamicPcdSet_Sku[(skuname, skuid)], Phase) - final_data = () - for item in range(len(PcdDbBuffer)): - final_data += unpack("B", PcdDbBuffer[item:item+1]) + final_data = tuple(PcdDbBuffer) PcdDBData[(skuname, skuid)] = (PcdDbBuffer, final_data) PcdDriverAutoGenData[(skuname, skuid)] = (AdditionalAutoGenH, AdditionalAutoGenC) VarCheckTableData[(skuname, skuid)] = VarCheckTab @@ -955,9 +953,7 @@ def prune_sku(pcd, skuname): AdditionalAutoGenH, AdditionalAutoGenC = CreateAutoGen(PcdDriverAutoGenData) else: AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer, VarCheckTab = CreatePcdDatabasePhaseSpecificAutoGen (Platform, {}, Phase) - final_data = () - for item in range(len(PcdDbBuffer)): - final_data += unpack("B", PcdDbBuffer[item:item + 1]) + final_data = tuple(PcdDbBuffer) PcdDBData[(TAB_DEFAULT, "0")] = (PcdDbBuffer, final_data) return AdditionalAutoGenH, AdditionalAutoGenC, CreatePcdDataBase(PcdDBData) From ce88903374a9be9cbc15ee80b189cef5dc2e90d8 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Sat, 20 Sep 2025 19:56:38 +0200 Subject: [PATCH 0855/1172] ShellPkg/UefiShellLevel2: Return if ShellCommandLineParse() failed This patch aims to help breaking down the long function present in the ShellPkg and reduce complexity/nested code and conditions. Return directly if ShellCommandLineParse() returned an error Status. In such case, the "Package" that should be allocated by ShellCommandLineParse() is already freed in: ShellCommandLineParse() \-ShellCommandLineParseEx() \-InternalCommandLineParse() so there is no need to free it with ShellCommandLineFreeVarList(). Note: Cd: Return directly if ShellCommandLineParse() returned an error Status. The initial code was ignoring the error status. Cp: Only check for ShellGetExecutionBreakFlag() if ShellCommandLineParse() returned successfully. If the command line failed to be parsed, there should be no need to check for the execution break flag. No functional change should be induced by this patch. Signed-off-by: Pierre Gondois --- .../UefiShellLevel2CommandsLib/Attrib.c | 318 +++++----- .../Library/UefiShellLevel2CommandsLib/Cd.c | 2 + .../Library/UefiShellLevel2CommandsLib/Cp.c | 166 ++--- .../Library/UefiShellLevel2CommandsLib/Load.c | 96 +-- .../Library/UefiShellLevel2CommandsLib/Ls.c | 276 ++++---- .../Library/UefiShellLevel2CommandsLib/Map.c | 354 +++++------ .../UefiShellLevel2CommandsLib/MkDir.c | 166 ++--- .../Library/UefiShellLevel2CommandsLib/Mv.c | 154 ++--- .../UefiShellLevel2CommandsLib/Parse.c | 72 +-- .../UefiShellLevel2CommandsLib/Reset.c | 152 ++--- .../Library/UefiShellLevel2CommandsLib/Rm.c | 122 ++-- .../Library/UefiShellLevel2CommandsLib/Set.c | 106 ++-- .../UefiShellLevel2CommandsLib/TimeDate.c | 594 +++++++++--------- .../Library/UefiShellLevel2CommandsLib/Vol.c | 100 +-- 14 files changed, 1355 insertions(+), 1323 deletions(-) diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Attrib.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Attrib.c index b434f1d2793c..89678a418256 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Attrib.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Attrib.c @@ -70,182 +70,169 @@ ShellCommandRunAttrib ( } else { ASSERT (FALSE); } + + return ShellStatus; + } + + // + // check for "-?" + // + if (ShellCommandLineGetFlag (Package, L"-?")) { + ASSERT (FALSE); } else { + FileAttributesToAdd = 0; + FileAttributesToRemove = 0; + // - // check for "-?" + // apply or remove each flag // - if (ShellCommandLineGetFlag (Package, L"-?")) { - ASSERT (FALSE); - } else { - FileAttributesToAdd = 0; - FileAttributesToRemove = 0; + if (ShellCommandLineGetFlag (Package, L"+a")) { + FileAttributesToAdd |= EFI_FILE_ARCHIVE; + } - // - // apply or remove each flag - // - if (ShellCommandLineGetFlag (Package, L"+a")) { - FileAttributesToAdd |= EFI_FILE_ARCHIVE; - } + if (ShellCommandLineGetFlag (Package, L"-a")) { + FileAttributesToRemove |= EFI_FILE_ARCHIVE; + } - if (ShellCommandLineGetFlag (Package, L"-a")) { - FileAttributesToRemove |= EFI_FILE_ARCHIVE; - } + if (ShellCommandLineGetFlag (Package, L"+s")) { + FileAttributesToAdd |= EFI_FILE_SYSTEM; + } - if (ShellCommandLineGetFlag (Package, L"+s")) { - FileAttributesToAdd |= EFI_FILE_SYSTEM; - } + if (ShellCommandLineGetFlag (Package, L"-s")) { + FileAttributesToRemove |= EFI_FILE_SYSTEM; + } - if (ShellCommandLineGetFlag (Package, L"-s")) { - FileAttributesToRemove |= EFI_FILE_SYSTEM; - } + if (ShellCommandLineGetFlag (Package, L"+h")) { + FileAttributesToAdd |= EFI_FILE_HIDDEN; + } - if (ShellCommandLineGetFlag (Package, L"+h")) { - FileAttributesToAdd |= EFI_FILE_HIDDEN; - } + if (ShellCommandLineGetFlag (Package, L"-h")) { + FileAttributesToRemove |= EFI_FILE_HIDDEN; + } - if (ShellCommandLineGetFlag (Package, L"-h")) { - FileAttributesToRemove |= EFI_FILE_HIDDEN; - } + if (ShellCommandLineGetFlag (Package, L"+r")) { + FileAttributesToAdd |= EFI_FILE_READ_ONLY; + } - if (ShellCommandLineGetFlag (Package, L"+r")) { - FileAttributesToAdd |= EFI_FILE_READ_ONLY; - } + if (ShellCommandLineGetFlag (Package, L"-r")) { + FileAttributesToRemove |= EFI_FILE_READ_ONLY; + } - if (ShellCommandLineGetFlag (Package, L"-r")) { - FileAttributesToRemove |= EFI_FILE_READ_ONLY; - } + if ((FileAttributesToRemove == 0) && (FileAttributesToAdd == 0)) { + // + // Do display as we have no attributes to change + // + for ( ParamNumberCount = 1 + ; + ; ParamNumberCount++ + ) + { + FileName = ShellCommandLineGetRawValue (Package, ParamNumberCount); + // if we dont have anything left, move on... + if ((FileName == NULL) && (ParamNumberCount == 1)) { + FileName = (CHAR16 *)AllFiles; + } else if (FileName == NULL) { + break; + } - if ((FileAttributesToRemove == 0) && (FileAttributesToAdd == 0)) { - // - // Do display as we have no attributes to change - // - for ( ParamNumberCount = 1 - ; - ; ParamNumberCount++ - ) - { - FileName = ShellCommandLineGetRawValue (Package, ParamNumberCount); - // if we dont have anything left, move on... - if ((FileName == NULL) && (ParamNumberCount == 1)) { - FileName = (CHAR16 *)AllFiles; - } else if (FileName == NULL) { - break; + ASSERT (ListOfFiles == NULL); + Status = ShellOpenFileMetaArg ((CHAR16 *)FileName, EFI_FILE_MODE_READ, &ListOfFiles); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); + ShellStatus = SHELL_NOT_FOUND; + } else { + for (FileNode = (EFI_SHELL_FILE_INFO *)GetFirstNode (&ListOfFiles->Link) + ; !IsNull (&ListOfFiles->Link, &FileNode->Link) + ; FileNode = (EFI_SHELL_FILE_INFO *)GetNextNode (&ListOfFiles->Link, &FileNode->Link) + ) + { + ShellPrintHiiDefaultEx ( + STRING_TOKEN (STR_ATTRIB_OUTPUT_LINE), + gShellLevel2HiiHandle, + FileNode->Info->Attribute&EFI_FILE_DIRECTORY ? L'D' : L' ', + FileNode->Info->Attribute&EFI_FILE_ARCHIVE ? L'A' : L' ', + FileNode->Info->Attribute&EFI_FILE_SYSTEM ? L'S' : L' ', + FileNode->Info->Attribute&EFI_FILE_HIDDEN ? L'H' : L' ', + FileNode->Info->Attribute&EFI_FILE_READ_ONLY ? L'R' : L' ', + FileNode->FileName + ); + + if (ShellGetExecutionBreakFlag ()) { + ShellStatus = SHELL_ABORTED; + break; + } } - ASSERT (ListOfFiles == NULL); - Status = ShellOpenFileMetaArg ((CHAR16 *)FileName, EFI_FILE_MODE_READ, &ListOfFiles); + Status = ShellCloseFileMetaArg (&ListOfFiles); + ListOfFiles = NULL; if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); ShellStatus = SHELL_NOT_FOUND; - } else { - for (FileNode = (EFI_SHELL_FILE_INFO *)GetFirstNode (&ListOfFiles->Link) - ; !IsNull (&ListOfFiles->Link, &FileNode->Link) - ; FileNode = (EFI_SHELL_FILE_INFO *)GetNextNode (&ListOfFiles->Link, &FileNode->Link) - ) - { - ShellPrintHiiDefaultEx ( - STRING_TOKEN (STR_ATTRIB_OUTPUT_LINE), - gShellLevel2HiiHandle, - FileNode->Info->Attribute&EFI_FILE_DIRECTORY ? L'D' : L' ', - FileNode->Info->Attribute&EFI_FILE_ARCHIVE ? L'A' : L' ', - FileNode->Info->Attribute&EFI_FILE_SYSTEM ? L'S' : L' ', - FileNode->Info->Attribute&EFI_FILE_HIDDEN ? L'H' : L' ', - FileNode->Info->Attribute&EFI_FILE_READ_ONLY ? L'R' : L' ', - FileNode->FileName - ); - - if (ShellGetExecutionBreakFlag ()) { - ShellStatus = SHELL_ABORTED; - break; - } - } + } + } // for loop for handling wildcard filenames + } // for loop for printing out the info + } else if ((FileAttributesToRemove & FileAttributesToAdd) != 0) { + // + // fail as we have conflcting params. + // + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle, L"attrib"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + // + // enumerate through all the files/directories and apply the attributes + // + for ( ParamNumberCount = 1 + ; + ; ParamNumberCount++ + ) + { + FileName = ShellCommandLineGetRawValue (Package, ParamNumberCount); + // if we dont have anything left, move on... + if (FileName == NULL) { + // + // make sure we are not failing on the first one we do... if yes that's an error... + // + if (ParamNumberCount == 1) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"attrib"); + ShellStatus = SHELL_INVALID_PARAMETER; + } + + break; + } - Status = ShellCloseFileMetaArg (&ListOfFiles); - ListOfFiles = NULL; - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); - ShellStatus = SHELL_NOT_FOUND; - } - } // for loop for handling wildcard filenames - } // for loop for printing out the info - } else if ((FileAttributesToRemove & FileAttributesToAdd) != 0) { // - // fail as we have conflcting params. + // OpenFileByName / GetFileInfo / Change attributes / SetFileInfo / CloseFile / free memory + // for each file or directory on the line. // - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle, L"attrib"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { + // - // enumerate through all the files/directories and apply the attributes + // Open the file(s) // - for ( ParamNumberCount = 1 - ; - ; ParamNumberCount++ - ) - { - FileName = ShellCommandLineGetRawValue (Package, ParamNumberCount); - // if we dont have anything left, move on... - if (FileName == NULL) { + ASSERT (ListOfFiles == NULL); + Status = ShellOpenFileMetaArg ((CHAR16 *)FileName, EFI_FILE_MODE_READ, &ListOfFiles); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); + ShellStatus = SHELL_NOT_FOUND; + } else { + for (FileNode = (EFI_SHELL_FILE_INFO *)GetFirstNode (&ListOfFiles->Link) + ; !IsNull (&ListOfFiles->Link, &FileNode->Link) + ; FileNode = (EFI_SHELL_FILE_INFO *)GetNextNode (&ListOfFiles->Link, &FileNode->Link) + ) + { // - // make sure we are not failing on the first one we do... if yes that's an error... + // skip the directory traversing stuff... // - if (ParamNumberCount == 1) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"attrib"); - ShellStatus = SHELL_INVALID_PARAMETER; + if ((StrCmp (FileNode->FileName, L".") == 0) || (StrCmp (FileNode->FileName, L"..") == 0)) { + continue; } - break; - } - - // - // OpenFileByName / GetFileInfo / Change attributes / SetFileInfo / CloseFile / free memory - // for each file or directory on the line. - // - - // - // Open the file(s) - // - ASSERT (ListOfFiles == NULL); - Status = ShellOpenFileMetaArg ((CHAR16 *)FileName, EFI_FILE_MODE_READ, &ListOfFiles); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); - ShellStatus = SHELL_NOT_FOUND; - } else { - for (FileNode = (EFI_SHELL_FILE_INFO *)GetFirstNode (&ListOfFiles->Link) - ; !IsNull (&ListOfFiles->Link, &FileNode->Link) - ; FileNode = (EFI_SHELL_FILE_INFO *)GetNextNode (&ListOfFiles->Link, &FileNode->Link) - ) - { - // - // skip the directory traversing stuff... - // - if ((StrCmp (FileNode->FileName, L".") == 0) || (StrCmp (FileNode->FileName, L"..") == 0)) { - continue; - } - - FileInfo = gEfiShellProtocol->GetFileInfo (FileNode->Handle); - - // - // if we are removing Read-Only we need to do that alone - // - if ((FileAttributesToRemove & EFI_FILE_READ_ONLY) == EFI_FILE_READ_ONLY) { - FileInfo->Attribute &= ~EFI_FILE_READ_ONLY; - // - // SetFileInfo - // - Status = ShellSetFileInfo (FileNode->Handle, FileInfo); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); - ShellStatus = SHELL_ACCESS_DENIED; - } - } - - // - // change the attribute - // - FileInfo->Attribute &= ~FileAttributesToRemove; - FileInfo->Attribute |= FileAttributesToAdd; + FileInfo = gEfiShellProtocol->GetFileInfo (FileNode->Handle); + // + // if we are removing Read-Only we need to do that alone + // + if ((FileAttributesToRemove & EFI_FILE_READ_ONLY) == EFI_FILE_READ_ONLY) { + FileInfo->Attribute &= ~EFI_FILE_READ_ONLY; // // SetFileInfo // @@ -254,18 +241,33 @@ ShellCommandRunAttrib ( ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); ShellStatus = SHELL_ACCESS_DENIED; } - - SHELL_FREE_NON_NULL (FileInfo); } - Status = ShellCloseFileMetaArg (&ListOfFiles); - ListOfFiles = NULL; + // + // change the attribute + // + FileInfo->Attribute &= ~FileAttributesToRemove; + FileInfo->Attribute |= FileAttributesToAdd; + + // + // SetFileInfo + // + Status = ShellSetFileInfo (FileNode->Handle, FileInfo); if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); - ShellStatus = SHELL_NOT_FOUND; + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); + ShellStatus = SHELL_ACCESS_DENIED; } - } // for loop for handling wildcard filenames - } + + SHELL_FREE_NON_NULL (FileInfo); + } + + Status = ShellCloseFileMetaArg (&ListOfFiles); + ListOfFiles = NULL; + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); + ShellStatus = SHELL_NOT_FOUND; + } + } // for loop for handling wildcard filenames } } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c index 71c3db8df2f3..639425f27f51 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c @@ -219,6 +219,8 @@ ShellCommandRunCd ( } else { ASSERT (FALSE); } + + return ShellStatus; } // diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c index fcbba7faaffb..cf321eb0dc6f 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c @@ -700,106 +700,108 @@ ShellCommandRunCp ( } else { ASSERT (FALSE); } - } else { - // - // check for "-?" - // - if (ShellCommandLineGetFlag (Package, L"-?")) { - ASSERT (FALSE); - } - // - // Initialize SilentMode and RecursiveMode - // - if (gEfiShellProtocol->BatchIsActive ()) { - SilentMode = TRUE; - } else { - SilentMode = ShellCommandLineGetFlag (Package, L"-q"); - } + return ShellStatus; + } - RecursiveMode = ShellCommandLineGetFlag (Package, L"-r"); + // + // check for "-?" + // + if (ShellCommandLineGetFlag (Package, L"-?")) { + ASSERT (FALSE); + } - switch (ParamCount = ShellCommandLineGetCount (Package)) { - case 0: - case 1: - // - // we have insufficient parameters - // - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"cp"); + // + // Initialize SilentMode and RecursiveMode + // + if (gEfiShellProtocol->BatchIsActive ()) { + SilentMode = TRUE; + } else { + SilentMode = ShellCommandLineGetFlag (Package, L"-q"); + } + + RecursiveMode = ShellCommandLineGetFlag (Package, L"-r"); + + switch (ParamCount = ShellCommandLineGetCount (Package)) { + case 0: + case 1: + // + // we have insufficient parameters + // + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"cp"); + ShellStatus = SHELL_INVALID_PARAMETER; + break; + case 2: + // + // must have valid CWD for single parameter... + // + Cwd = ShellGetCurrentDir (NULL); + if (Cwd == NULL) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"cp"); ShellStatus = SHELL_INVALID_PARAMETER; - break; - case 2: - // - // must have valid CWD for single parameter... - // - Cwd = ShellGetCurrentDir (NULL); - if (Cwd == NULL) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"cp"); - ShellStatus = SHELL_INVALID_PARAMETER; + } else { + Status = ShellOpenFileMetaArg ((CHAR16 *)ShellCommandLineGetRawValue (Package, 1), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList); + if ((FileList == NULL) || IsListEmpty (&FileList->Link) || EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"cp", ShellCommandLineGetRawValue (Package, 1)); + ShellStatus = SHELL_NOT_FOUND; } else { - Status = ShellOpenFileMetaArg ((CHAR16 *)ShellCommandLineGetRawValue (Package, 1), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList); - if ((FileList == NULL) || IsListEmpty (&FileList->Link) || EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"cp", ShellCommandLineGetRawValue (Package, 1)); - ShellStatus = SHELL_NOT_FOUND; + FullCwd = AllocateZeroPool (StrSize (Cwd) + sizeof (CHAR16)); + if (FullCwd == NULL) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"cp"); + ShellStatus = SHELL_OUT_OF_RESOURCES; } else { - FullCwd = AllocateZeroPool (StrSize (Cwd) + sizeof (CHAR16)); - if (FullCwd == NULL) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"cp"); - ShellStatus = SHELL_OUT_OF_RESOURCES; - } else { - StrCpyS (FullCwd, StrSize (Cwd) / sizeof (CHAR16) + 1, Cwd); - ShellStatus = ProcessValidateAndCopyFiles (FileList, FullCwd, SilentMode, RecursiveMode); - FreePool (FullCwd); - } + StrCpyS (FullCwd, StrSize (Cwd) / sizeof (CHAR16) + 1, Cwd); + ShellStatus = ProcessValidateAndCopyFiles (FileList, FullCwd, SilentMode, RecursiveMode); + FreePool (FullCwd); } } + } - break; - default: - // - // Make a big list of all the files... - // - for (ParamCount--, LoopCounter = 1; LoopCounter < ParamCount && ShellStatus == SHELL_SUCCESS; LoopCounter++) { - if (ShellGetExecutionBreakFlag ()) { - break; - } + break; + default: + // + // Make a big list of all the files... + // + for (ParamCount--, LoopCounter = 1; LoopCounter < ParamCount && ShellStatus == SHELL_SUCCESS; LoopCounter++) { + if (ShellGetExecutionBreakFlag ()) { + break; + } - Status = ShellOpenFileMetaArg ((CHAR16 *)ShellCommandLineGetRawValue (Package, LoopCounter), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList); - if (EFI_ERROR (Status) || (FileList == NULL) || IsListEmpty (&FileList->Link)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"cp", ShellCommandLineGetRawValue (Package, LoopCounter)); - ShellStatus = SHELL_NOT_FOUND; - } + Status = ShellOpenFileMetaArg ((CHAR16 *)ShellCommandLineGetRawValue (Package, LoopCounter), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList); + if (EFI_ERROR (Status) || (FileList == NULL) || IsListEmpty (&FileList->Link)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"cp", ShellCommandLineGetRawValue (Package, LoopCounter)); + ShellStatus = SHELL_NOT_FOUND; } + } - if (ShellStatus != SHELL_SUCCESS) { - Status = ShellCloseFileMetaArg (&FileList); - } else { - // - // now copy them all... - // - if ((FileList != NULL) && !IsListEmpty (&FileList->Link)) { - ShellStatus = ProcessValidateAndCopyFiles (FileList, PathCleanUpDirectories ((CHAR16 *)ShellCommandLineGetRawValue (Package, ParamCount)), SilentMode, RecursiveMode); - Status = ShellCloseFileMetaArg (&FileList); - if (EFI_ERROR (Status) && (ShellStatus == SHELL_SUCCESS)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_FILE), gShellLevel2HiiHandle, L"cp", ShellCommandLineGetRawValue (Package, ParamCount), ShellStatus|MAX_BIT); - ShellStatus = SHELL_ACCESS_DENIED; - } + if (ShellStatus != SHELL_SUCCESS) { + Status = ShellCloseFileMetaArg (&FileList); + } else { + // + // now copy them all... + // + if ((FileList != NULL) && !IsListEmpty (&FileList->Link)) { + ShellStatus = ProcessValidateAndCopyFiles (FileList, PathCleanUpDirectories ((CHAR16 *)ShellCommandLineGetRawValue (Package, ParamCount)), SilentMode, RecursiveMode); + Status = ShellCloseFileMetaArg (&FileList); + if (EFI_ERROR (Status) && (ShellStatus == SHELL_SUCCESS)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_FILE), gShellLevel2HiiHandle, L"cp", ShellCommandLineGetRawValue (Package, ParamCount), ShellStatus|MAX_BIT); + ShellStatus = SHELL_ACCESS_DENIED; } } + } - break; - } // switch on parameter count - - if (FileList != NULL) { - ShellCloseFileMetaArg (&FileList); - } + break; + } // switch on parameter count - // - // free the command line package - // - ShellCommandLineFreeVarList (Package); + if (FileList != NULL) { + ShellCloseFileMetaArg (&FileList); } + // + // free the command line package + // + ShellCommandLineFreeVarList (Package); + if (ShellGetExecutionBreakFlag ()) { return (SHELL_ABORTED); } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c index 3c0b9912972d..981d9a58b2b4 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c @@ -222,62 +222,64 @@ ShellCommandRunLoad ( } else { ASSERT (FALSE); } - } else { + + return ShellStatus; + } + + // + // check for "-?" + // + if (ShellCommandLineGetFlag (Package, L"-?")) { + ASSERT (FALSE); + } else if (ShellCommandLineGetRawValue (Package, 1) == NULL) { // - // check for "-?" + // we didnt get a single file to load parameter // - if (ShellCommandLineGetFlag (Package, L"-?")) { - ASSERT (FALSE); - } else if (ShellCommandLineGetRawValue (Package, 1) == NULL) { - // - // we didnt get a single file to load parameter - // - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"load"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - for ( ParamCount = 1 - ; ShellCommandLineGetRawValue (Package, ParamCount) != NULL - ; ParamCount++ - ) - { - Status = ShellOpenFileMetaArg ((CHAR16 *)ShellCommandLineGetRawValue (Package, ParamCount), EFI_FILE_MODE_READ, &ListHead); - if (!EFI_ERROR (Status)) { - for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode (&ListHead->Link) - ; !IsNull (&ListHead->Link, &Node->Link) - ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode (&ListHead->Link, &Node->Link) - ) - { - // - // once we have an error preserve that value, but finish the loop. - // - if (EFI_ERROR (Status)) { - LoadDriver (Node->FullName, (BOOLEAN)(ShellCommandLineGetFlag (Package, L"-nc") == FALSE)); - } else { - Status = LoadDriver (Node->FullName, (BOOLEAN)(ShellCommandLineGetFlag (Package, L"-nc") == FALSE)); - } - } // for loop for multi-open - + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"load"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + for ( ParamCount = 1 + ; ShellCommandLineGetRawValue (Package, ParamCount) != NULL + ; ParamCount++ + ) + { + Status = ShellOpenFileMetaArg ((CHAR16 *)ShellCommandLineGetRawValue (Package, ParamCount), EFI_FILE_MODE_READ, &ListHead); + if (!EFI_ERROR (Status)) { + for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode (&ListHead->Link) + ; !IsNull (&ListHead->Link, &Node->Link) + ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode (&ListHead->Link, &Node->Link) + ) + { + // + // once we have an error preserve that value, but finish the loop. + // if (EFI_ERROR (Status)) { - ShellCloseFileMetaArg (&ListHead); + LoadDriver (Node->FullName, (BOOLEAN)(ShellCommandLineGetFlag (Package, L"-nc") == FALSE)); } else { - Status = ShellCloseFileMetaArg (&ListHead); + Status = LoadDriver (Node->FullName, (BOOLEAN)(ShellCommandLineGetFlag (Package, L"-nc") == FALSE)); } + } // for loop for multi-open + + if (EFI_ERROR (Status)) { + ShellCloseFileMetaArg (&ListHead); } else { - // - // no files found. - // - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"load", (CHAR16 *)ShellCommandLineGetRawValue (Package, ParamCount)); - ShellStatus = SHELL_NOT_FOUND; + Status = ShellCloseFileMetaArg (&ListHead); } - } // for loop for params - } - - // - // free the command line package - // - ShellCommandLineFreeVarList (Package); + } else { + // + // no files found. + // + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"load", (CHAR16 *)ShellCommandLineGetRawValue (Package, ParamCount)); + ShellStatus = SHELL_NOT_FOUND; + } + } // for loop for params } + // + // free the command line package + // + ShellCommandLineFreeVarList (Package); + if (EFI_ERROR (Status) && (ShellStatus == SHELL_SUCCESS)) { ShellStatus = SHELL_DEVICE_ERROR; } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c index a4b8c761e910..c72db4178809 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c @@ -757,171 +757,173 @@ ShellCommandRunLs ( } else { ASSERT (FALSE); } + + return ShellStatus; + } + + // + // check for "-?" + // + if (ShellCommandLineGetFlag (Package, L"-?")) { + ASSERT (FALSE); + } + + if (ShellCommandLineGetCount (Package) > 2) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"ls"); + ShellStatus = SHELL_INVALID_PARAMETER; } else { // - // check for "-?" + // check for -a // - if (ShellCommandLineGetFlag (Package, L"-?")) { - ASSERT (FALSE); - } + if (ShellCommandLineGetFlag (Package, L"-a")) { + for ( Attribs = ShellCommandLineGetValue (Package, L"-a") + ; Attribs != NULL && *Attribs != CHAR_NULL && ShellStatus == SHELL_SUCCESS + ; Attribs++ + ) + { + switch (*Attribs) { + case L'a': + case L'A': + RequiredAttributes |= EFI_FILE_ARCHIVE; + Count++; + continue; + case L's': + case L'S': + RequiredAttributes |= EFI_FILE_SYSTEM; + Count++; + continue; + case L'h': + case L'H': + RequiredAttributes |= EFI_FILE_HIDDEN; + Count++; + continue; + case L'r': + case L'R': + RequiredAttributes |= EFI_FILE_READ_ONLY; + Count++; + continue; + case L'd': + case L'D': + RequiredAttributes |= EFI_FILE_DIRECTORY; + Count++; + continue; + default: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ATTRIBUTE), gShellLevel2HiiHandle, L"ls", ShellCommandLineGetValue (Package, L"-a")); + ShellStatus = SHELL_INVALID_PARAMETER; + break; + } // switch + } // for loop - if (ShellCommandLineGetCount (Package) > 2) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"ls"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { // - // check for -a + // if nothing is specified all are specified // - if (ShellCommandLineGetFlag (Package, L"-a")) { - for ( Attribs = ShellCommandLineGetValue (Package, L"-a") - ; Attribs != NULL && *Attribs != CHAR_NULL && ShellStatus == SHELL_SUCCESS - ; Attribs++ - ) - { - switch (*Attribs) { - case L'a': - case L'A': - RequiredAttributes |= EFI_FILE_ARCHIVE; - Count++; - continue; - case L's': - case L'S': - RequiredAttributes |= EFI_FILE_SYSTEM; - Count++; - continue; - case L'h': - case L'H': - RequiredAttributes |= EFI_FILE_HIDDEN; - Count++; - continue; - case L'r': - case L'R': - RequiredAttributes |= EFI_FILE_READ_ONLY; - Count++; - continue; - case L'd': - case L'D': - RequiredAttributes |= EFI_FILE_DIRECTORY; - Count++; - continue; - default: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ATTRIBUTE), gShellLevel2HiiHandle, L"ls", ShellCommandLineGetValue (Package, L"-a")); - ShellStatus = SHELL_INVALID_PARAMETER; - break; - } // switch - } // for loop + if (RequiredAttributes == 0) { + RequiredAttributes = EFI_FILE_VALID_ATTR; + } + } // if -a present + if (ShellStatus == SHELL_SUCCESS) { + PathName = ShellCommandLineGetRawValue (Package, 1); + if (PathName == NULL) { // - // if nothing is specified all are specified + // Nothing specified... must start from current directory // - if (RequiredAttributes == 0) { - RequiredAttributes = EFI_FILE_VALID_ATTR; + CurDir = gEfiShellProtocol->GetCurDir (NULL); + if (CurDir == NULL) { + ShellStatus = SHELL_NOT_FOUND; + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"ls"); } - } // if -a present - if (ShellStatus == SHELL_SUCCESS) { - PathName = ShellCommandLineGetRawValue (Package, 1); - if (PathName == NULL) { + ListUnfiltered = TRUE; + // + // Copy to the 2 strings for starting path and file search string + // + ASSERT (SearchString == NULL); + ASSERT (FullPath == NULL); + StrnCatGrow (&SearchString, NULL, L"*", 0); + StrnCatGrow (&FullPath, NULL, CurDir, 0); + Size = FullPath != NULL ? StrSize (FullPath) : 0; + StrnCatGrow (&FullPath, &Size, L"\\", 0); + } else { + if ((StrStr (PathName, L":") == NULL) && (gEfiShellProtocol->GetCurDir (NULL) == NULL)) { // - // Nothing specified... must start from current directory + // If we got something and it doesnt have a fully qualified path, then we needed to have a CWD. // - CurDir = gEfiShellProtocol->GetCurDir (NULL); - if (CurDir == NULL) { - ShellStatus = SHELL_NOT_FOUND; - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"ls"); - } - - ListUnfiltered = TRUE; + ShellStatus = SHELL_NOT_FOUND; + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"ls"); + } else { // - // Copy to the 2 strings for starting path and file search string + // We got a valid fully qualified path or we have a CWD // - ASSERT (SearchString == NULL); - ASSERT (FullPath == NULL); - StrnCatGrow (&SearchString, NULL, L"*", 0); - StrnCatGrow (&FullPath, NULL, CurDir, 0); - Size = FullPath != NULL ? StrSize (FullPath) : 0; - StrnCatGrow (&FullPath, &Size, L"\\", 0); - } else { - if ((StrStr (PathName, L":") == NULL) && (gEfiShellProtocol->GetCurDir (NULL) == NULL)) { + ASSERT ((FullPath == NULL && Size == 0) || (FullPath != NULL)); + if (StrStr (PathName, L":") == NULL) { + StrnCatGrow (&FullPath, &Size, gEfiShellProtocol->GetCurDir (NULL), 0); + if (FullPath == NULL) { + ShellCommandLineFreeVarList (Package); + return SHELL_OUT_OF_RESOURCES; + } + + Size = FullPath != NULL ? StrSize (FullPath) : 0; + StrnCatGrow (&FullPath, &Size, L"\\", 0); + } + + StrnCatGrow (&FullPath, &Size, PathName, 0); + if (FullPath == NULL) { + ShellCommandLineFreeVarList (Package); + return SHELL_OUT_OF_RESOURCES; + } + + if (ShellIsDirectory (PathName) == EFI_SUCCESS) { // - // If we got something and it doesnt have a fully qualified path, then we needed to have a CWD. + // is listing ends with a directory, then we list all files in that directory // - ShellStatus = SHELL_NOT_FOUND; - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"ls"); + ListUnfiltered = TRUE; + StrnCatGrow (&SearchString, NULL, L"*", 0); } else { // - // We got a valid fully qualified path or we have a CWD + // must split off the search part that applies to files from the end of the directory part // - ASSERT ((FullPath == NULL && Size == 0) || (FullPath != NULL)); - if (StrStr (PathName, L":") == NULL) { - StrnCatGrow (&FullPath, &Size, gEfiShellProtocol->GetCurDir (NULL), 0); - if (FullPath == NULL) { - ShellCommandLineFreeVarList (Package); - return SHELL_OUT_OF_RESOURCES; - } - - Size = FullPath != NULL ? StrSize (FullPath) : 0; - StrnCatGrow (&FullPath, &Size, L"\\", 0); - } - - StrnCatGrow (&FullPath, &Size, PathName, 0); - if (FullPath == NULL) { + StrnCatGrow (&SearchString, NULL, FullPath, 0); + if (SearchString == NULL) { + FreePool (FullPath); ShellCommandLineFreeVarList (Package); return SHELL_OUT_OF_RESOURCES; } - if (ShellIsDirectory (PathName) == EFI_SUCCESS) { - // - // is listing ends with a directory, then we list all files in that directory - // - ListUnfiltered = TRUE; - StrnCatGrow (&SearchString, NULL, L"*", 0); - } else { - // - // must split off the search part that applies to files from the end of the directory part - // - StrnCatGrow (&SearchString, NULL, FullPath, 0); - if (SearchString == NULL) { - FreePool (FullPath); - ShellCommandLineFreeVarList (Package); - return SHELL_OUT_OF_RESOURCES; - } - - PathRemoveLastItem (FullPath); - CopyMem (SearchString, SearchString + StrLen (FullPath), StrSize (SearchString + StrLen (FullPath))); - } + PathRemoveLastItem (FullPath); + CopyMem (SearchString, SearchString + StrLen (FullPath), StrSize (SearchString + StrLen (FullPath))); } } + } - Status = gRT->GetTime (&TheTime, NULL); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"ls", L"gRT->GetTime", Status); - TheTime.TimeZone = EFI_UNSPECIFIED_TIMEZONE; - } + Status = gRT->GetTime (&TheTime, NULL); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"ls", L"gRT->GetTime", Status); + TheTime.TimeZone = EFI_UNSPECIFIED_TIMEZONE; + } - if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = PrintLsOutput ( - ShellCommandLineGetFlag (Package, L"-r"), - RequiredAttributes, - ShellCommandLineGetFlag (Package, L"-sfo"), - FullPath, - SearchString, - NULL, - Count, - TheTime.TimeZone, - ListUnfiltered - ); - if (ShellStatus == SHELL_NOT_FOUND) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LS_FILE_NOT_FOUND), gShellLevel2HiiHandle, L"ls", FullPath); - } else if (ShellStatus == SHELL_INVALID_PARAMETER) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"ls", FullPath); - } else if (ShellStatus == SHELL_ABORTED) { - // - // Ignore aborting. - // - } else if (ShellStatus != SHELL_SUCCESS) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"ls", FullPath); - } + if (ShellStatus == SHELL_SUCCESS) { + ShellStatus = PrintLsOutput ( + ShellCommandLineGetFlag (Package, L"-r"), + RequiredAttributes, + ShellCommandLineGetFlag (Package, L"-sfo"), + FullPath, + SearchString, + NULL, + Count, + TheTime.TimeZone, + ListUnfiltered + ); + if (ShellStatus == SHELL_NOT_FOUND) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LS_FILE_NOT_FOUND), gShellLevel2HiiHandle, L"ls", FullPath); + } else if (ShellStatus == SHELL_INVALID_PARAMETER) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"ls", FullPath); + } else if (ShellStatus == SHELL_ABORTED) { + // + // Ignore aborting. + // + } else if (ShellStatus != SHELL_SUCCESS) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"ls", FullPath); } } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c index 780a737791f0..98f5ac92943e 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c @@ -1147,131 +1147,98 @@ ShellCommandRunMap ( } else { ASSERT (FALSE); } + + return ShellStatus; + } + + // + // check for "-?" + // + SfoMode = ShellCommandLineGetFlag (Package, L"-sfo"); + ConstMode = ShellCommandLineGetFlag (Package, L"-c"); + NormlMode = ShellCommandLineGetFlag (Package, L"-f"); + if (ShellCommandLineGetFlag (Package, L"-?")) { + ASSERT (FALSE); + } else if (ShellCommandLineGetRawValue (Package, 3) != NULL) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"map"); + ShellStatus = SHELL_INVALID_PARAMETER; } else { // - // check for "-?" + // Deleting a map name... // - SfoMode = ShellCommandLineGetFlag (Package, L"-sfo"); - ConstMode = ShellCommandLineGetFlag (Package, L"-c"); - NormlMode = ShellCommandLineGetFlag (Package, L"-f"); - if (ShellCommandLineGetFlag (Package, L"-?")) { - ASSERT (FALSE); - } else if (ShellCommandLineGetRawValue (Package, 3) != NULL) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"map"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - // - // Deleting a map name... - // - if (ShellCommandLineGetFlag (Package, L"-d")) { - if ( ShellCommandLineGetFlag (Package, L"-r") - || ShellCommandLineGetFlag (Package, L"-v") - || ConstMode - || NormlMode - || ShellCommandLineGetFlag (Package, L"-u") - || ShellCommandLineGetFlag (Package, L"-t") - ) - { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle, L"map"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - SName = ShellCommandLineGetValue (Package, L"-d"); - if (SName != NULL) { - Status = PerformMappingDelete (SName); - if (EFI_ERROR (Status)) { - if (Status == EFI_ACCESS_DENIED) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel2HiiHandle, L"map"); - ShellStatus = SHELL_ACCESS_DENIED; - } else if (Status == EFI_NOT_FOUND) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MAP_NF), gShellLevel2HiiHandle, L"map", SName); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); - ShellStatus = SHELL_UNSUPPORTED; - } - } - } else { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"map"); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } - } else if ( ShellCommandLineGetFlag (Package, L"-r") - // || ShellCommandLineGetFlag(Package, L"-v") - || ConstMode - || NormlMode - || ShellCommandLineGetFlag (Package, L"-u") - || ShellCommandLineGetFlag (Package, L"-t") - ) + if (ShellCommandLineGetFlag (Package, L"-d")) { + if ( ShellCommandLineGetFlag (Package, L"-r") + || ShellCommandLineGetFlag (Package, L"-v") + || ConstMode + || NormlMode + || ShellCommandLineGetFlag (Package, L"-u") + || ShellCommandLineGetFlag (Package, L"-t") + ) { - ProbeForMediaChange (); - if ( ShellCommandLineGetFlag (Package, L"-r")) { - // - // Do the reset - // - Status = ShellCommandCreateInitialMappingsAndPaths (); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle, L"map"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + SName = ShellCommandLineGetValue (Package, L"-d"); + if (SName != NULL) { + Status = PerformMappingDelete (SName); if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); - ShellStatus = SHELL_UNSUPPORTED; + if (Status == EFI_ACCESS_DENIED) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel2HiiHandle, L"map"); + ShellStatus = SHELL_ACCESS_DENIED; + } else if (Status == EFI_NOT_FOUND) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MAP_NF), gShellLevel2HiiHandle, L"map", SName); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); + ShellStatus = SHELL_UNSUPPORTED; + } } + } else { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"map"); + ShellStatus = SHELL_INVALID_PARAMETER; } - - if ((ShellStatus == SHELL_SUCCESS) && ShellCommandLineGetFlag (Package, L"-u")) { - // - // Do the Update - // - Status = ShellCommandUpdateMapping (); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); - ShellStatus = SHELL_UNSUPPORTED; - } + } + } else if ( ShellCommandLineGetFlag (Package, L"-r") + // || ShellCommandLineGetFlag(Package, L"-v") + || ConstMode + || NormlMode + || ShellCommandLineGetFlag (Package, L"-u") + || ShellCommandLineGetFlag (Package, L"-t") + ) + { + ProbeForMediaChange (); + if ( ShellCommandLineGetFlag (Package, L"-r")) { + // + // Do the reset + // + Status = ShellCommandCreateInitialMappingsAndPaths (); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); + ShellStatus = SHELL_UNSUPPORTED; } + } - if (ShellStatus == SHELL_SUCCESS) { - Param1 = ShellCommandLineGetRawValue (Package, 1); - TypeString = ShellCommandLineGetValue (Package, L"-t"); - if ( !ConstMode - && !NormlMode - && (TypeString == NULL) - ) - { - // - // now do the display... - // - ShellStatus = PerformMappingDisplay ( - ShellCommandLineGetFlag (Package, L"-v"), - TRUE, - TRUE, - NULL, - SfoMode, - Param1, - TRUE - ); - } else { - // - // now do the display... - // - ShellStatus = PerformMappingDisplay2 ( - ShellCommandLineGetFlag (Package, L"-v"), - ConstMode, - NormlMode, - TypeString, - SfoMode, - Param1 - ); - } - } - } else { + if ((ShellStatus == SHELL_SUCCESS) && ShellCommandLineGetFlag (Package, L"-u")) { // - // adding or displaying (there were no flags) + // Do the Update // - SName = ShellCommandLineGetRawValue (Package, 1); - Mapping = ShellCommandLineGetRawValue (Package, 2); - if ( (SName == NULL) - && (Mapping == NULL) + Status = ShellCommandUpdateMapping (); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); + ShellStatus = SHELL_UNSUPPORTED; + } + } + + if (ShellStatus == SHELL_SUCCESS) { + Param1 = ShellCommandLineGetRawValue (Package, 1); + TypeString = ShellCommandLineGetValue (Package, L"-t"); + if ( !ConstMode + && !NormlMode + && (TypeString == NULL) ) { // - // display only since no flags + // now do the display... // ShellStatus = PerformMappingDisplay ( ShellCommandLineGetFlag (Package, L"-v"), @@ -1279,83 +1246,118 @@ ShellCommandRunMap ( TRUE, NULL, SfoMode, - NULL, + Param1, TRUE ); - } else if ( (SName == NULL) - || (Mapping == NULL) - ) - { + } else { // - // Display only the one specified + // now do the display... // - ShellStatus = PerformMappingDisplay ( - FALSE, - FALSE, - FALSE, - NULL, + ShellStatus = PerformMappingDisplay2 ( + ShellCommandLineGetFlag (Package, L"-v"), + ConstMode, + NormlMode, + TypeString, SfoMode, - SName, // note the variable here... - TRUE + Param1 ); + } + } + } else { + // + // adding or displaying (there were no flags) + // + SName = ShellCommandLineGetRawValue (Package, 1); + Mapping = ShellCommandLineGetRawValue (Package, 2); + if ( (SName == NULL) + && (Mapping == NULL) + ) + { + // + // display only since no flags + // + ShellStatus = PerformMappingDisplay ( + ShellCommandLineGetFlag (Package, L"-v"), + TRUE, + TRUE, + NULL, + SfoMode, + NULL, + TRUE + ); + } else if ( (SName == NULL) + || (Mapping == NULL) + ) + { + // + // Display only the one specified + // + ShellStatus = PerformMappingDisplay ( + FALSE, + FALSE, + FALSE, + NULL, + SfoMode, + SName, // note the variable here... + TRUE + ); + } else { + if (ShellIsHexOrDecimalNumber (Mapping, TRUE, FALSE)) { + MapAsHandle = ConvertHandleIndexToHandle (ShellStrToUintn (Mapping)); } else { - if (ShellIsHexOrDecimalNumber (Mapping, TRUE, FALSE)) { - MapAsHandle = ConvertHandleIndexToHandle (ShellStrToUintn (Mapping)); - } else { - MapAsHandle = NULL; - } + MapAsHandle = NULL; + } - if ((MapAsHandle == NULL) && (Mapping[StrLen (Mapping)-1] != L':')) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", Mapping); + if ((MapAsHandle == NULL) && (Mapping[StrLen (Mapping)-1] != L':')) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", Mapping); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + TempStringLength = StrLen (SName); + if (!IsNumberLetterOnly (SName, TempStringLength-((SName[TempStringLength-1] == L':') ? 1 : 0))) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", SName); ShellStatus = SHELL_INVALID_PARAMETER; - } else { - TempStringLength = StrLen (SName); - if (!IsNumberLetterOnly (SName, TempStringLength-((SName[TempStringLength-1] == L':') ? 1 : 0))) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", SName); - ShellStatus = SHELL_INVALID_PARAMETER; + } + + if (ShellStatus == SHELL_SUCCESS) { + if (MapAsHandle != NULL) { + ShellStatus = AddMappingFromHandle (MapAsHandle, SName); + } else { + ShellStatus = AddMappingFromMapping (Mapping, SName); } - if (ShellStatus == SHELL_SUCCESS) { - if (MapAsHandle != NULL) { - ShellStatus = AddMappingFromHandle (MapAsHandle, SName); - } else { - ShellStatus = AddMappingFromMapping (Mapping, SName); + if (ShellStatus != SHELL_SUCCESS) { + switch (ShellStatus) { + case SHELL_ACCESS_DENIED: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel2HiiHandle, L"map"); + break; + case SHELL_INVALID_PARAMETER: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", Mapping); + break; + case SHELL_DEVICE_ERROR: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MAP_NOF), gShellLevel2HiiHandle, L"map", Mapping); + break; + default: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", ShellStatus|MAX_BIT); } - - if (ShellStatus != SHELL_SUCCESS) { - switch (ShellStatus) { - case SHELL_ACCESS_DENIED: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel2HiiHandle, L"map"); - break; - case SHELL_INVALID_PARAMETER: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", Mapping); - break; - case SHELL_DEVICE_ERROR: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MAP_NOF), gShellLevel2HiiHandle, L"map", Mapping); - break; - default: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", ShellStatus|MAX_BIT); - } - } else { - // - // now do the display... - // - ShellStatus = PerformMappingDisplay ( - FALSE, - FALSE, - FALSE, - NULL, - SfoMode, - SName, - TRUE - ); - } // we were successful so do an output - } - } // got a valid map target - } // got 2 variables - } // we are adding a mapping - } // got valid parameters - } + } else { + // + // now do the display... + // + ShellStatus = PerformMappingDisplay ( + FALSE, + FALSE, + FALSE, + NULL, + SfoMode, + SName, + TRUE + ); + } // we were successful so do an output + } + } // got a valid map target + } // got 2 variables + } // we are adding a mapping + } // got valid parameters // // free the command line package diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c index fe55ca10c0a2..37ad2327d910 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c @@ -55,108 +55,110 @@ ShellCommandRunMkDir ( } else { ASSERT (FALSE); } - } else { - // - // check for "-?" - // - if (ShellCommandLineGetFlag (Package, L"-?")) { - ASSERT (FALSE); - } + return ShellStatus; + } + + // + // check for "-?" + // + if (ShellCommandLineGetFlag (Package, L"-?")) { + ASSERT (FALSE); + } + + // + // create a set of directories + // + if (ShellCommandLineGetRawValue (Package, 1) == NULL) { // - // create a set of directories + // we didnt get a single parameter // - if (ShellCommandLineGetRawValue (Package, 1) == NULL) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"mkdir"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + for ( DirCreateCount = 1 + ; + ; DirCreateCount++ + ) + { // - // we didnt get a single parameter + // loop through each directory specified // - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"mkdir"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - for ( DirCreateCount = 1 - ; - ; DirCreateCount++ - ) - { + + NewDirName = ShellCommandLineGetRawValue (Package, DirCreateCount); + if (NewDirName == NULL) { + break; + } + + // + // check if that already exists... if yes fail + // + FileHandle = NULL; + Status = ShellOpenFileByName ( + NewDirName, + &FileHandle, + EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE, + EFI_FILE_DIRECTORY + ); + if (!EFI_ERROR (Status)) { + ShellCloseFile (&FileHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MKDIR_ALREADY), gShellLevel2HiiHandle, NewDirName); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ASSERT (FileHandle == NULL); // - // loop through each directory specified + // create the nested directory from parent to child. + // if NewDirName = test1\test2\test3, first create "test1\" directory, then "test1\test2\", finally "test1\test2\test3". // - - NewDirName = ShellCommandLineGetRawValue (Package, DirCreateCount); - if (NewDirName == NULL) { + NewDirNameCopy = AllocateCopyPool (StrSize (NewDirName), NewDirName); + NewDirNameCopy = PathCleanUpDirectories (NewDirNameCopy); + if (NewDirNameCopy == NULL) { + ShellStatus = SHELL_OUT_OF_RESOURCES; break; } - // - // check if that already exists... if yes fail - // - FileHandle = NULL; - Status = ShellOpenFileByName ( - NewDirName, - &FileHandle, - EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE, - EFI_FILE_DIRECTORY - ); - if (!EFI_ERROR (Status)) { - ShellCloseFile (&FileHandle); - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MKDIR_ALREADY), gShellLevel2HiiHandle, NewDirName); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ASSERT (FileHandle == NULL); - // - // create the nested directory from parent to child. - // if NewDirName = test1\test2\test3, first create "test1\" directory, then "test1\test2\", finally "test1\test2\test3". - // - NewDirNameCopy = AllocateCopyPool (StrSize (NewDirName), NewDirName); - NewDirNameCopy = PathCleanUpDirectories (NewDirNameCopy); - if (NewDirNameCopy == NULL) { - ShellStatus = SHELL_OUT_OF_RESOURCES; - break; + SplitName = NewDirNameCopy; + while (SplitName != NULL) { + SplitName = StrStr (SplitName + 1, L"\\"); + if (SplitName != NULL) { + SaveSplitChar = *(SplitName + 1); + *(SplitName + 1) = '\0'; } - SplitName = NewDirNameCopy; - while (SplitName != NULL) { - SplitName = StrStr (SplitName + 1, L"\\"); - if (SplitName != NULL) { - SaveSplitChar = *(SplitName + 1); - *(SplitName + 1) = '\0'; - } - - // - // check if current nested directory already exists... continue to create the child directory. - // - Status = ShellOpenFileByName ( - NewDirNameCopy, - &FileHandle, - EFI_FILE_MODE_READ, - EFI_FILE_DIRECTORY - ); - if (!EFI_ERROR (Status)) { - ShellCloseFile (&FileHandle); - } else { - Status = ShellCreateDirectory (NewDirNameCopy, &FileHandle); - if (EFI_ERROR (Status)) { - break; - } - - if (FileHandle != NULL) { - gEfiShellProtocol->CloseFile (FileHandle); - } + // + // check if current nested directory already exists... continue to create the child directory. + // + Status = ShellOpenFileByName ( + NewDirNameCopy, + &FileHandle, + EFI_FILE_MODE_READ, + EFI_FILE_DIRECTORY + ); + if (!EFI_ERROR (Status)) { + ShellCloseFile (&FileHandle); + } else { + Status = ShellCreateDirectory (NewDirNameCopy, &FileHandle); + if (EFI_ERROR (Status)) { + break; } - if (SplitName != NULL) { - *(SplitName + 1) = SaveSplitChar; + if (FileHandle != NULL) { + gEfiShellProtocol->CloseFile (FileHandle); } } - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MKDIR_CREATEFAIL), gShellLevel2HiiHandle, NewDirName); - ShellStatus = SHELL_ACCESS_DENIED; - break; + if (SplitName != NULL) { + *(SplitName + 1) = SaveSplitChar; } + } - SHELL_FREE_NON_NULL (NewDirNameCopy); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MKDIR_CREATEFAIL), gShellLevel2HiiHandle, NewDirName); + ShellStatus = SHELL_ACCESS_DENIED; + break; } + + SHELL_FREE_NON_NULL (NewDirNameCopy); } } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c index 79632a2a03a5..76a31efaa52b 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c @@ -788,99 +788,101 @@ ShellCommandRunMv ( } else { ASSERT (FALSE); } - } else { - // - // check for "-?" - // - if (ShellCommandLineGetFlag (Package, L"-?")) { - ASSERT (FALSE); - } - switch (ParamCount = ShellCommandLineGetCount (Package)) { - case 0: - case 1: - // - // we have insufficient parameters - // - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"mv"); + return ShellStatus; + } + + // + // check for "-?" + // + if (ShellCommandLineGetFlag (Package, L"-?")) { + ASSERT (FALSE); + } + + switch (ParamCount = ShellCommandLineGetCount (Package)) { + case 0: + case 1: + // + // we have insufficient parameters + // + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"mv"); + ShellStatus = SHELL_INVALID_PARAMETER; + break; + case 2: + // + // must have valid CWD for single parameter... + // + if (ShellGetCurrentDir (NULL) == NULL) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"mv"); ShellStatus = SHELL_INVALID_PARAMETER; - break; - case 2: - // - // must have valid CWD for single parameter... - // - if (ShellGetCurrentDir (NULL) == NULL) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"mv"); - ShellStatus = SHELL_INVALID_PARAMETER; + } else { + Status = ShellOpenFileMetaArg ((CHAR16 *)ShellCommandLineGetRawValue (Package, 1), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList); + if ((FileList == NULL) || IsListEmpty (&FileList->Link) || EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"mv", ShellCommandLineGetRawValue (Package, 1)); + ShellStatus = SHELL_NOT_FOUND; } else { - Status = ShellOpenFileMetaArg ((CHAR16 *)ShellCommandLineGetRawValue (Package, 1), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList); - if ((FileList == NULL) || IsListEmpty (&FileList->Link) || EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"mv", ShellCommandLineGetRawValue (Package, 1)); - ShellStatus = SHELL_NOT_FOUND; + // + // ValidateAndMoveFiles will report errors to the screen itself + // + CwdSize = StrSize (ShellGetCurrentDir (NULL)) + sizeof (CHAR16); + Cwd = AllocateZeroPool (CwdSize); + if (Cwd == NULL) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"mv"); + ShellStatus = SHELL_OUT_OF_RESOURCES; } else { - // - // ValidateAndMoveFiles will report errors to the screen itself - // - CwdSize = StrSize (ShellGetCurrentDir (NULL)) + sizeof (CHAR16); - Cwd = AllocateZeroPool (CwdSize); - if (Cwd == NULL) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"mv"); - ShellStatus = SHELL_OUT_OF_RESOURCES; - } else { - StrCpyS (Cwd, CwdSize / sizeof (CHAR16), ShellGetCurrentDir (NULL)); - StrCatS (Cwd, CwdSize / sizeof (CHAR16), L"\\"); - ShellStatus = ValidateAndMoveFiles (FileList, &Response, Cwd); - FreePool (Cwd); - } + StrCpyS (Cwd, CwdSize / sizeof (CHAR16), ShellGetCurrentDir (NULL)); + StrCatS (Cwd, CwdSize / sizeof (CHAR16), L"\\"); + ShellStatus = ValidateAndMoveFiles (FileList, &Response, Cwd); + FreePool (Cwd); } } + } - break; - default: - /// @todo make sure this works with error half way through and continues... - for (ParamCount--, LoopCounter = 1; LoopCounter < ParamCount; LoopCounter++) { - if (ShellGetExecutionBreakFlag ()) { - break; - } + break; + default: + /// @todo make sure this works with error half way through and continues... + for (ParamCount--, LoopCounter = 1; LoopCounter < ParamCount; LoopCounter++) { + if (ShellGetExecutionBreakFlag ()) { + break; + } - Status = ShellOpenFileMetaArg ((CHAR16 *)ShellCommandLineGetRawValue (Package, LoopCounter), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList); - if ((FileList == NULL) || IsListEmpty (&FileList->Link) || EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"mv", ShellCommandLineGetRawValue (Package, LoopCounter)); - ShellStatus = SHELL_NOT_FOUND; + Status = ShellOpenFileMetaArg ((CHAR16 *)ShellCommandLineGetRawValue (Package, LoopCounter), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList); + if ((FileList == NULL) || IsListEmpty (&FileList->Link) || EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"mv", ShellCommandLineGetRawValue (Package, LoopCounter)); + ShellStatus = SHELL_NOT_FOUND; + } else { + // + // ValidateAndMoveFiles will report errors to the screen itself + // Only change ShellStatus if it's successful + // + if (ShellStatus == SHELL_SUCCESS) { + ShellStatus = ValidateAndMoveFiles (FileList, &Response, ShellCommandLineGetRawValue (Package, ParamCount)); } else { - // - // ValidateAndMoveFiles will report errors to the screen itself - // Only change ShellStatus if it's successful - // - if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = ValidateAndMoveFiles (FileList, &Response, ShellCommandLineGetRawValue (Package, ParamCount)); - } else { - ValidateAndMoveFiles (FileList, &Response, ShellCommandLineGetRawValue (Package, ParamCount)); - } + ValidateAndMoveFiles (FileList, &Response, ShellCommandLineGetRawValue (Package, ParamCount)); } + } - if ((FileList != NULL) && !IsListEmpty (&FileList->Link)) { - Status = ShellCloseFileMetaArg (&FileList); - if (EFI_ERROR (Status) && (ShellStatus == SHELL_SUCCESS)) { - ShellStatus = SHELL_ACCESS_DENIED; - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_FILE), gShellLevel2HiiHandle, L"mv", ShellCommandLineGetRawValue (Package, 1), ShellStatus|MAX_BIT); - } + if ((FileList != NULL) && !IsListEmpty (&FileList->Link)) { + Status = ShellCloseFileMetaArg (&FileList); + if (EFI_ERROR (Status) && (ShellStatus == SHELL_SUCCESS)) { + ShellStatus = SHELL_ACCESS_DENIED; + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_FILE), gShellLevel2HiiHandle, L"mv", ShellCommandLineGetRawValue (Package, 1), ShellStatus|MAX_BIT); } } + } - break; - } // switch on parameter count - - if (FileList != NULL) { - ShellCloseFileMetaArg (&FileList); - } + break; + } // switch on parameter count - // - // free the command line package - // - ShellCommandLineFreeVarList (Package); + if (FileList != NULL) { + ShellCloseFileMetaArg (&FileList); } + // + // free the command line package + // + ShellCommandLineFreeVarList (Package); + SHELL_FREE_NON_NULL (Response); if (ShellGetExecutionBreakFlag ()) { diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c index 75b93184b0e4..a91e75a05df8 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c @@ -280,46 +280,48 @@ ShellCommandRunParse ( } else { ASSERT (FALSE); } + + return ShellStatus; + } + + StreamingUnicode = IsStdInDataAvailable (); + if ((!StreamingUnicode && (ShellCommandLineGetCount (Package) < 4)) || + (ShellCommandLineGetCount (Package) < 3)) + { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"parse"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else if ((StreamingUnicode && (ShellCommandLineGetCount (Package) > 3)) || + (ShellCommandLineGetCount (Package) > 4)) + { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"parse"); + ShellStatus = SHELL_INVALID_PARAMETER; } else { - StreamingUnicode = IsStdInDataAvailable (); - if ((!StreamingUnicode && (ShellCommandLineGetCount (Package) < 4)) || - (ShellCommandLineGetCount (Package) < 3)) - { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"parse"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else if ((StreamingUnicode && (ShellCommandLineGetCount (Package) > 3)) || - (ShellCommandLineGetCount (Package) > 4)) - { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"parse"); - ShellStatus = SHELL_INVALID_PARAMETER; + if (StreamingUnicode) { + FileName = L">i"; + TableName = ShellCommandLineGetRawValue (Package, 1); + ColumnString = ShellCommandLineGetRawValue (Package, 2); } else { - if (StreamingUnicode) { - FileName = L">i"; - TableName = ShellCommandLineGetRawValue (Package, 1); - ColumnString = ShellCommandLineGetRawValue (Package, 2); - } else { - FileName = ShellCommandLineGetRawValue (Package, 1); - TableName = ShellCommandLineGetRawValue (Package, 2); - ColumnString = ShellCommandLineGetRawValue (Package, 3); - } + FileName = ShellCommandLineGetRawValue (Package, 1); + TableName = ShellCommandLineGetRawValue (Package, 2); + ColumnString = ShellCommandLineGetRawValue (Package, 3); + } - if (ShellCommandLineGetValue (Package, L"-i") == NULL) { - TableNameInstance = (UINTN)-1; - } else { - TableNameInstance = ShellStrToUintn (ShellCommandLineGetValue (Package, L"-i")); - } + if (ShellCommandLineGetValue (Package, L"-i") == NULL) { + TableNameInstance = (UINTN)-1; + } else { + TableNameInstance = ShellStrToUintn (ShellCommandLineGetValue (Package, L"-i")); + } - if (ShellCommandLineGetValue (Package, L"-s") == NULL) { - ShellCommandInstance = 1; - } else { - ShellCommandInstance = ShellStrToUintn (ShellCommandLineGetValue (Package, L"-s")); - } + if (ShellCommandLineGetValue (Package, L"-s") == NULL) { + ShellCommandInstance = 1; + } else { + ShellCommandInstance = ShellStrToUintn (ShellCommandLineGetValue (Package, L"-s")); + } - if ((FileName != NULL) && (TableName != NULL) && (ColumnString != NULL)) { - ShellStatus = PerformParsing (FileName, TableName, ShellStrToUintn (ColumnString), TableNameInstance, ShellCommandInstance, StreamingUnicode); - } else { - ShellStatus = SHELL_INVALID_PARAMETER; - } + if ((FileName != NULL) && (TableName != NULL) && (ColumnString != NULL)) { + ShellStatus = PerformParsing (FileName, TableName, ShellStrToUintn (ColumnString), TableNameInstance, ShellCommandInstance, StreamingUnicode); + } else { + ShellStatus = SHELL_INVALID_PARAMETER; } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c index a89fcccbc7aa..13f3bfa27544 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c @@ -60,20 +60,38 @@ ShellCommandRunReset ( } else { ASSERT (FALSE); } + + return ShellStatus; + } + + // + // check for "-?" + // + if (ShellCommandLineGetFlag (Package, L"-?")) { + ASSERT (FALSE); + } else if (ShellCommandLineGetRawValue (Package, 1) != NULL) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); + ShellStatus = SHELL_INVALID_PARAMETER; } else { - // - // check for "-?" - // - if (ShellCommandLineGetFlag (Package, L"-?")) { - ASSERT (FALSE); - } else if (ShellCommandLineGetRawValue (Package, 1) != NULL) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - if (ShellCommandLineGetFlag (Package, L"-fwui")) { + if (ShellCommandLineGetFlag (Package, L"-fwui")) { + DataSize = sizeof (OsIndications); + Status = gRT->GetVariable ( + EFI_OS_INDICATIONS_SUPPORT_VARIABLE_NAME, + &gEfiGlobalVariableGuid, + &Attr, + &DataSize, + &OsIndications + ); + + if (EFI_ERROR (Status)) { + ShellStatus = SHELL_UNSUPPORTED; + goto Error; + } + + if ((OsIndications & EFI_OS_INDICATIONS_BOOT_TO_FW_UI) != 0) { DataSize = sizeof (OsIndications); Status = gRT->GetVariable ( - EFI_OS_INDICATIONS_SUPPORT_VARIABLE_NAME, + EFI_OS_INDICATIONS_VARIABLE_NAME, &gEfiGlobalVariableGuid, &Attr, &DataSize, @@ -81,82 +99,66 @@ ShellCommandRunReset ( ); if (EFI_ERROR (Status)) { - ShellStatus = SHELL_UNSUPPORTED; - goto Error; + OsIndications = EFI_OS_INDICATIONS_BOOT_TO_FW_UI; + } else { + OsIndications |= EFI_OS_INDICATIONS_BOOT_TO_FW_UI; } - if ((OsIndications & EFI_OS_INDICATIONS_BOOT_TO_FW_UI) != 0) { - DataSize = sizeof (OsIndications); - Status = gRT->GetVariable ( - EFI_OS_INDICATIONS_VARIABLE_NAME, - &gEfiGlobalVariableGuid, - &Attr, - &DataSize, - &OsIndications - ); - - if (EFI_ERROR (Status)) { - OsIndications = EFI_OS_INDICATIONS_BOOT_TO_FW_UI; - } else { - OsIndications |= EFI_OS_INDICATIONS_BOOT_TO_FW_UI; - } - - Status = gRT->SetVariable ( - EFI_OS_INDICATIONS_VARIABLE_NAME, - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - sizeof (OsIndications), - &OsIndications - ); - } + Status = gRT->SetVariable ( + EFI_OS_INDICATIONS_VARIABLE_NAME, + &gEfiGlobalVariableGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + sizeof (OsIndications), + &OsIndications + ); + } - if (EFI_ERROR (Status)) { - ShellStatus = SHELL_UNSUPPORTED; - goto Error; - } + if (EFI_ERROR (Status)) { + ShellStatus = SHELL_UNSUPPORTED; + goto Error; } + } - // - // check for warm reset flag, then shutdown reset flag, then cold (default) reset flag - // - if (ShellCommandLineGetFlag (Package, L"-w")) { - if (ShellCommandLineGetFlag (Package, L"-s") || ShellCommandLineGetFlag (Package, L"-c")) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - String = ShellCommandLineGetValue (Package, L"-w"); - if (String != NULL) { - gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, StrSize (String), (VOID *)String); - } else { - gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL); - } - } - } else if (ShellCommandLineGetFlag (Package, L"-s")) { - if (ShellCommandLineGetFlag (Package, L"-c")) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); - ShellStatus = SHELL_INVALID_PARAMETER; + // + // check for warm reset flag, then shutdown reset flag, then cold (default) reset flag + // + if (ShellCommandLineGetFlag (Package, L"-w")) { + if (ShellCommandLineGetFlag (Package, L"-s") || ShellCommandLineGetFlag (Package, L"-c")) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + String = ShellCommandLineGetValue (Package, L"-w"); + if (String != NULL) { + gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, StrSize (String), (VOID *)String); } else { - String = ShellCommandLineGetValue (Package, L"-s"); - DEBUG_CODE ( - ShellPrintDefaultEx (L"Reset with %s (%d bytes)\n", String, String != NULL ? StrSize (String) : 0); - ); - if (String != NULL) { - gRT->ResetSystem (EfiResetShutdown, EFI_SUCCESS, StrSize (String), (VOID *)String); - } else { - gRT->ResetSystem (EfiResetShutdown, EFI_SUCCESS, 0, NULL); - } + gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL); } + } + } else if (ShellCommandLineGetFlag (Package, L"-s")) { + if (ShellCommandLineGetFlag (Package, L"-c")) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); + ShellStatus = SHELL_INVALID_PARAMETER; } else { - // - // this is default so dont worry about flag... - // - String = ShellCommandLineGetValue (Package, L"-c"); + String = ShellCommandLineGetValue (Package, L"-s"); + DEBUG_CODE ( + ShellPrintDefaultEx (L"Reset with %s (%d bytes)\n", String, String != NULL ? StrSize (String) : 0); + ); if (String != NULL) { - gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, StrSize (String), (VOID *)String); + gRT->ResetSystem (EfiResetShutdown, EFI_SUCCESS, StrSize (String), (VOID *)String); } else { - gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); + gRT->ResetSystem (EfiResetShutdown, EFI_SUCCESS, 0, NULL); } } + } else { + // + // this is default so dont worry about flag... + // + String = ShellCommandLineGetValue (Package, L"-c"); + if (String != NULL) { + gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, StrSize (String), (VOID *)String); + } else { + gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); + } } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c index edf31d6b4a05..e1105a4ecce9 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c @@ -313,88 +313,90 @@ ShellCommandRunRm ( } else { ASSERT (FALSE); } + + return ShellStatus; + } + + // + // check for "-?" + // + if (ShellCommandLineGetFlag (Package, L"-?")) { + ASSERT (FALSE); + } + + if (ShellCommandLineGetRawValue (Package, 1) == NULL) { + // + // we insufficient parameters + // + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"rm"); + ShellStatus = SHELL_INVALID_PARAMETER; } else { // - // check for "-?" + // get a list with each file specified by parameters + // if parameter is a directory then add all the files below it to the list // - if (ShellCommandLineGetFlag (Package, L"-?")) { - ASSERT (FALSE); + for ( ParamCount = 1, Param = ShellCommandLineGetRawValue (Package, ParamCount) + ; Param != NULL + ; ParamCount++, Param = ShellCommandLineGetRawValue (Package, ParamCount) + ) + { + Status = ShellOpenFileMetaArg ((CHAR16 *)Param, EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList); + if (EFI_ERROR (Status) || (FileList == NULL) || IsListEmpty (&FileList->Link)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"rm", (CHAR16 *)Param); + ShellStatus = SHELL_NOT_FOUND; + break; + } } - if (ShellCommandLineGetRawValue (Package, 1) == NULL) { - // - // we insufficient parameters - // - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"rm"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { + if (ShellStatus == SHELL_SUCCESS) { // - // get a list with each file specified by parameters - // if parameter is a directory then add all the files below it to the list + // loop through the list and make sure we are not aborting... // - for ( ParamCount = 1, Param = ShellCommandLineGetRawValue (Package, ParamCount) - ; Param != NULL - ; ParamCount++, Param = ShellCommandLineGetRawValue (Package, ParamCount) + for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode (&FileList->Link) + ; !IsNull (&FileList->Link, &Node->Link) && !ShellGetExecutionBreakFlag () + ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode (&FileList->Link, &Node->Link) ) { - Status = ShellOpenFileMetaArg ((CHAR16 *)Param, EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList); - if (EFI_ERROR (Status) || (FileList == NULL) || IsListEmpty (&FileList->Link)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"rm", (CHAR16 *)Param); - ShellStatus = SHELL_NOT_FOUND; - break; + // + // skip the directory traversing stuff... + // + if ((StrCmp (Node->FileName, L".") == 0) || (StrCmp (Node->FileName, L"..") == 0)) { + continue; } - } - if (ShellStatus == SHELL_SUCCESS) { // - // loop through the list and make sure we are not aborting... + // do the deleting of nodes // - for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode (&FileList->Link) - ; !IsNull (&FileList->Link, &Node->Link) && !ShellGetExecutionBreakFlag () - ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode (&FileList->Link, &Node->Link) - ) - { - // - // skip the directory traversing stuff... - // - if ((StrCmp (Node->FileName, L".") == 0) || (StrCmp (Node->FileName, L"..") == 0)) { - continue; - } - - // - // do the deleting of nodes - // - if (EFI_ERROR (Node->Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_RM_LOG_DELETE_ERR2), gShellLevel2HiiHandle, Node->Status); - ShellStatus = SHELL_ACCESS_DENIED; - break; - } - - if (!IsValidDeleteTarget (FileList, Node, Package)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_RM_LOG_DELETE_ERR3), gShellLevel2HiiHandle, Node->FullName); - ShellStatus = SHELL_INVALID_PARAMETER; - break; - } + if (EFI_ERROR (Node->Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_RM_LOG_DELETE_ERR2), gShellLevel2HiiHandle, Node->Status); + ShellStatus = SHELL_ACCESS_DENIED; + break; + } - ShellStatus = CascadeDelete (Node, ShellCommandLineGetFlag (Package, L"-q")); + if (!IsValidDeleteTarget (FileList, Node, Package)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_RM_LOG_DELETE_ERR3), gShellLevel2HiiHandle, Node->FullName); + ShellStatus = SHELL_INVALID_PARAMETER; + break; } - } - // - // Free the fileList - // - if (FileList != NULL) { - Status = ShellCloseFileMetaArg (&FileList); + ShellStatus = CascadeDelete (Node, ShellCommandLineGetFlag (Package, L"-q")); } - - FileList = NULL; } // - // free the command line package + // Free the fileList // - ShellCommandLineFreeVarList (Package); + if (FileList != NULL) { + Status = ShellCloseFileMetaArg (&FileList); + } + + FileList = NULL; } + // + // free the command line package + // + ShellCommandLineFreeVarList (Package); + return (ShellStatus); } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Set.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Set.c index c2a6ec4484fd..1f907a50ce21 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Set.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Set.c @@ -92,69 +92,71 @@ ShellCommandRunSet ( } else { ASSERT (FALSE); } - } else { + + return ShellStatus; + } + + // + // check for "-?" + // + if (ShellCommandLineGetFlag (Package, L"-?")) { + ASSERT (FALSE); + } else if (ShellCommandLineGetRawValue (Package, 3) != NULL) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"set"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else if ((ShellCommandLineGetRawValue (Package, 1) != NULL) && ShellCommandLineGetFlag (Package, L"-d")) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"set"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else if (ShellCommandLineGetFlag (Package, L"-d")) { // - // check for "-?" + // delete a environment variable // - if (ShellCommandLineGetFlag (Package, L"-?")) { - ASSERT (FALSE); - } else if (ShellCommandLineGetRawValue (Package, 3) != NULL) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"set"); + KeyName = ShellCommandLineGetValue (Package, L"-d"); + if (KeyName == NULL) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"set", L"-d"); ShellStatus = SHELL_INVALID_PARAMETER; - } else if ((ShellCommandLineGetRawValue (Package, 1) != NULL) && ShellCommandLineGetFlag (Package, L"-d")) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"set"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else if (ShellCommandLineGetFlag (Package, L"-d")) { - // - // delete a environment variable - // - KeyName = ShellCommandLineGetValue (Package, L"-d"); - if (KeyName == NULL) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"set", L"-d"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Status = ShellSetEnvironmentVariable (KeyName, L"", ShellCommandLineGetFlag (Package, L"-v")); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_ND), gShellLevel2HiiHandle, L"set", KeyName); - ShellStatus = SHELL_DEVICE_ERROR; - } + } else { + Status = ShellSetEnvironmentVariable (KeyName, L"", ShellCommandLineGetFlag (Package, L"-v")); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_ND), gShellLevel2HiiHandle, L"set", KeyName); + ShellStatus = SHELL_DEVICE_ERROR; } - } else if (ShellCommandLineGetRawValue (Package, 1) == NULL) { + } + } else if (ShellCommandLineGetRawValue (Package, 1) == NULL) { + // + // print out all current environment variables + // + return (PrintAllShellEnvVars ()); + } else { + // + // we are either printing one or assigning one + // + KeyName = ShellCommandLineGetRawValue (Package, 1); + Value = ShellCommandLineGetRawValue (Package, 2); + if ((KeyName != NULL) && (Value != NULL)) { // - // print out all current environment variables + // assigning one // - return (PrintAllShellEnvVars ()); + Status = ShellSetEnvironmentVariable (KeyName, Value, ShellCommandLineGetFlag (Package, L"-v")); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_ERROR_SET), gShellLevel2HiiHandle, L"set", KeyName); + ShellStatus = (SHELL_STATUS)(Status & (~MAX_BIT)); + } } else { - // - // we are either printing one or assigning one - // - KeyName = ShellCommandLineGetRawValue (Package, 1); - Value = ShellCommandLineGetRawValue (Package, 2); - if ((KeyName != NULL) && (Value != NULL)) { + if (KeyName != NULL) { // - // assigning one + // print out value for this one only. // - Status = ShellSetEnvironmentVariable (KeyName, Value, ShellCommandLineGetFlag (Package, L"-v")); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_ERROR_SET), gShellLevel2HiiHandle, L"set", KeyName); - ShellStatus = (SHELL_STATUS)(Status & (~MAX_BIT)); - } - } else { - if (KeyName != NULL) { - // - // print out value for this one only. - // - Value = ShellGetEnvironmentVariable (KeyName); - if (Value == NULL) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_NF), gShellLevel2HiiHandle, L"set", KeyName); - ShellStatus = SHELL_SUCCESS; - } else { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_DISP), gShellLevel2HiiHandle, KeyName, Value); - ShellStatus = SHELL_SUCCESS; - } + Value = ShellGetEnvironmentVariable (KeyName); + if (Value == NULL) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_NF), gShellLevel2HiiHandle, L"set", KeyName); + ShellStatus = SHELL_SUCCESS; } else { - ASSERT (FALSE); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_DISP), gShellLevel2HiiHandle, KeyName, Value); + ShellStatus = SHELL_SUCCESS; } + } else { + ASSERT (FALSE); } } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c index f0c3a5516ea9..761d88f9a30d 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c @@ -207,63 +207,65 @@ ShellCommandRunDate ( } else { ASSERT (FALSE); } + + return ShellStatus; + } + + // + // check for "-?" + // + if (ShellCommandLineGetFlag (Package, L"-?")) { + ASSERT (FALSE); + } else if (ShellCommandLineGetRawValue (Package, 2) != NULL) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"date"); + ShellStatus = SHELL_INVALID_PARAMETER; } else { // - // check for "-?" + // If there are 0 value parameters, then print the current date + // else If there are any value paramerers, then print error // - if (ShellCommandLineGetFlag (Package, L"-?")) { - ASSERT (FALSE); - } else if (ShellCommandLineGetRawValue (Package, 2) != NULL) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"date"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { + if (ShellCommandLineGetRawValue (Package, 1) == NULL) { // - // If there are 0 value parameters, then print the current date - // else If there are any value paramerers, then print error + // get the current date // - if (ShellCommandLineGetRawValue (Package, 1) == NULL) { - // - // get the current date - // - Status = gRT->GetTime (&TheTime, NULL); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"date", L"gRT->GetTime", Status); - return (SHELL_DEVICE_ERROR); - } + Status = gRT->GetTime (&TheTime, NULL); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"date", L"gRT->GetTime", Status); + return (SHELL_DEVICE_ERROR); + } + // + // ShellPrintEx the date in SFO or regular format + // + if (ShellCommandLineGetFlag (Package, L"-sfo")) { // - // ShellPrintEx the date in SFO or regular format + // Match UEFI Shell spec: + // ShellCommand,"date" + // Date,"DD","MM","YYYY" // - if (ShellCommandLineGetFlag (Package, L"-sfo")) { - // - // Match UEFI Shell spec: - // ShellCommand,"date" - // Date,"DD","MM","YYYY" - // - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_SFO_HEADER), gShellLevel2HiiHandle, L"date"); - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DATE_SFO_FORMAT), gShellLevel2HiiHandle, TheTime.Day, TheTime.Month, TheTime.Year); - } else { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DATE_FORMAT), gShellLevel2HiiHandle, TheTime.Month, TheTime.Day, TheTime.Year); - } + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_SFO_HEADER), gShellLevel2HiiHandle, L"date"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DATE_SFO_FORMAT), gShellLevel2HiiHandle, TheTime.Day, TheTime.Month, TheTime.Year); + } else { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DATE_FORMAT), gShellLevel2HiiHandle, TheTime.Month, TheTime.Day, TheTime.Year); + } + } else { + if (PcdGet8 (PcdShellSupportLevel) == 2) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"date"); + ShellStatus = SHELL_INVALID_PARAMETER; } else { - if (PcdGet8 (PcdShellSupportLevel) == 2) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"date"); + // + // perform level 3 operation here. + // + Param1 = ShellCommandLineGetRawValue (Package, 1); + if (Param1 == NULL) { ShellStatus = SHELL_INVALID_PARAMETER; } else { - // - // perform level 3 operation here. - // - Param1 = ShellCommandLineGetRawValue (Package, 1); - if (Param1 == NULL) { - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ShellStatus = CheckAndSetDate (Param1); - } + ShellStatus = CheckAndSetDate (Param1); + } - if (ShellStatus != SHELL_SUCCESS) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"date", Param1); - ShellStatus = SHELL_INVALID_PARAMETER; - } + if (ShellStatus != SHELL_SUCCESS) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"date", Param1); + ShellStatus = SHELL_INVALID_PARAMETER; } } } @@ -451,176 +453,178 @@ ShellCommandRunTime ( } else { ASSERT (FALSE); } + + return ShellStatus; + } + + // + // check for "-?" + // + Status = gRT->GetTime (&TheTime, NULL); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"time", L"gRT->GetTime", Status); + return (SHELL_DEVICE_ERROR); + } + + if (ShellCommandLineGetFlag (Package, L"-?")) { + ASSERT (FALSE); + } else if (ShellCommandLineGetRawValue (Package, 2) != NULL) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"time"); + ShellStatus = SHELL_INVALID_PARAMETER; } else { // - // check for "-?" + // If there are no parameters, then print the current time // - Status = gRT->GetTime (&TheTime, NULL); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"time", L"gRT->GetTime", Status); - return (SHELL_DEVICE_ERROR); - } - - if (ShellCommandLineGetFlag (Package, L"-?")) { - ASSERT (FALSE); - } else if (ShellCommandLineGetRawValue (Package, 2) != NULL) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"time"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { + if ( (ShellCommandLineGetRawValue (Package, 1) == NULL) + && !ShellCommandLineGetFlag (Package, L"-d") + && !ShellCommandLineGetFlag (Package, L"-tz")) + { // - // If there are no parameters, then print the current time + // ShellPrintEx the current time // - if ( (ShellCommandLineGetRawValue (Package, 1) == NULL) - && !ShellCommandLineGetFlag (Package, L"-d") - && !ShellCommandLineGetFlag (Package, L"-tz")) - { - // - // ShellPrintEx the current time - // - if (TheTime.TimeZone == EFI_UNSPECIFIED_TIMEZONE) { - TzMinutes = 0; - } else { - TzMinutes = (ABS (TheTime.TimeZone)) % 60; - } + if (TheTime.TimeZone == EFI_UNSPECIFIED_TIMEZONE) { + TzMinutes = 0; + } else { + TzMinutes = (ABS (TheTime.TimeZone)) % 60; + } - if (TheTime.TimeZone != EFI_UNSPECIFIED_TIMEZONE) { - ShellPrintHiiDefaultEx ( - STRING_TOKEN (STR_TIME_FORMAT), - gShellLevel2HiiHandle, - TheTime.Hour, - TheTime.Minute, - TheTime.Second, - (TheTime.TimeZone > 0 ? L"-" : L"+"), - ((ABS (TheTime.TimeZone)) / 60), - TzMinutes - ); - } else { - ShellPrintHiiDefaultEx ( - STRING_TOKEN (STR_TIME_FORMAT_LOCAL), - gShellLevel2HiiHandle, - TheTime.Hour, - TheTime.Minute, - TheTime.Second - ); - } + if (TheTime.TimeZone != EFI_UNSPECIFIED_TIMEZONE) { + ShellPrintHiiDefaultEx ( + STRING_TOKEN (STR_TIME_FORMAT), + gShellLevel2HiiHandle, + TheTime.Hour, + TheTime.Minute, + TheTime.Second, + (TheTime.TimeZone > 0 ? L"-" : L"+"), + ((ABS (TheTime.TimeZone)) / 60), + TzMinutes + ); + } else { + ShellPrintHiiDefaultEx ( + STRING_TOKEN (STR_TIME_FORMAT_LOCAL), + gShellLevel2HiiHandle, + TheTime.Hour, + TheTime.Minute, + TheTime.Second + ); + } - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_CRLF), gShellLevel2HiiHandle); - } else if (ShellCommandLineGetFlag (Package, L"-d") && (ShellCommandLineGetValue (Package, L"-d") == NULL)) { - if (TheTime.TimeZone == EFI_UNSPECIFIED_TIMEZONE) { - ShellPrintHiiDefaultEx ( - STRING_TOKEN (STR_TIME_FORMAT_LOCAL), - gShellLevel2HiiHandle, - TheTime.Hour, - TheTime.Minute, - TheTime.Second - ); - } else { - TzMinutes = (ABS (TheTime.TimeZone)) % 60; - ShellPrintHiiDefaultEx ( - STRING_TOKEN (STR_TIME_FORMAT), - gShellLevel2HiiHandle, - TheTime.Hour, - TheTime.Minute, - TheTime.Second, - (TheTime.TimeZone > 0 ? L"-" : L"+"), - ((ABS (TheTime.TimeZone)) / 60), - TzMinutes - ); - } + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_CRLF), gShellLevel2HiiHandle); + } else if (ShellCommandLineGetFlag (Package, L"-d") && (ShellCommandLineGetValue (Package, L"-d") == NULL)) { + if (TheTime.TimeZone == EFI_UNSPECIFIED_TIMEZONE) { + ShellPrintHiiDefaultEx ( + STRING_TOKEN (STR_TIME_FORMAT_LOCAL), + gShellLevel2HiiHandle, + TheTime.Hour, + TheTime.Minute, + TheTime.Second + ); + } else { + TzMinutes = (ABS (TheTime.TimeZone)) % 60; + ShellPrintHiiDefaultEx ( + STRING_TOKEN (STR_TIME_FORMAT), + gShellLevel2HiiHandle, + TheTime.Hour, + TheTime.Minute, + TheTime.Second, + (TheTime.TimeZone > 0 ? L"-" : L"+"), + ((ABS (TheTime.TimeZone)) / 60), + TzMinutes + ); + } - switch (TheTime.Daylight) { - case 0: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST0), gShellLevel2HiiHandle); - break; - case EFI_TIME_ADJUST_DAYLIGHT: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST1), gShellLevel2HiiHandle); - break; - case EFI_TIME_IN_DAYLIGHT: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST2), gShellLevel2HiiHandle); - break; - case EFI_TIME_IN_DAYLIGHT|EFI_TIME_ADJUST_DAYLIGHT: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST3), gShellLevel2HiiHandle); - break; - default: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_ERROR), gShellLevel2HiiHandle, L"time", L"gRT->GetTime", L"TheTime.Daylight", TheTime.Daylight); - } + switch (TheTime.Daylight) { + case 0: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST0), gShellLevel2HiiHandle); + break; + case EFI_TIME_ADJUST_DAYLIGHT: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST1), gShellLevel2HiiHandle); + break; + case EFI_TIME_IN_DAYLIGHT: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST2), gShellLevel2HiiHandle); + break; + case EFI_TIME_IN_DAYLIGHT|EFI_TIME_ADJUST_DAYLIGHT: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST3), gShellLevel2HiiHandle); + break; + default: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_ERROR), gShellLevel2HiiHandle, L"time", L"gRT->GetTime", L"TheTime.Daylight", TheTime.Daylight); + } + } else { + if (PcdGet8 (PcdShellSupportLevel) == 2) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"time"); + ShellStatus = SHELL_INVALID_PARAMETER; } else { - if (PcdGet8 (PcdShellSupportLevel) == 2) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"time"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - // - // perform level 3 operation here. - // - if ((TempLocation = ShellCommandLineGetValue (Package, L"-tz")) != NULL) { - if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16 *)TempLocation, L"_local") == 0) { - Tz = EFI_UNSPECIFIED_TIMEZONE; - } else if (TempLocation[0] == L'-') { + // + // perform level 3 operation here. + // + if ((TempLocation = ShellCommandLineGetValue (Package, L"-tz")) != NULL) { + if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16 *)TempLocation, L"_local") == 0) { + Tz = EFI_UNSPECIFIED_TIMEZONE; + } else if (TempLocation[0] == L'-') { + Tz = (INT16)ShellStrToUintn (++TempLocation); + // + // When the argument of "time [-tz tz]" is not numeric, ShellStrToUintn() returns "-1". + // Here we can detect the argument error by checking the return of ShellStrToUintn(). + // + if (Tz == -1) { + Tz = 1441; // make it to be out of bounds value + } else { + Tz *= (-1); // sign convert + } + } else { + if (TempLocation[0] == L'+') { Tz = (INT16)ShellStrToUintn (++TempLocation); - // - // When the argument of "time [-tz tz]" is not numeric, ShellStrToUintn() returns "-1". - // Here we can detect the argument error by checking the return of ShellStrToUintn(). - // - if (Tz == -1) { - Tz = 1441; // make it to be out of bounds value - } else { - Tz *= (-1); // sign convert - } } else { - if (TempLocation[0] == L'+') { - Tz = (INT16)ShellStrToUintn (++TempLocation); - } else { - Tz = (INT16)ShellStrToUintn (TempLocation); - } - - // - // Detect the return of ShellStrToUintn() to make sure the argument is valid. - // - if (Tz == -1) { - Tz = 1441; // make it to be out of bounds value - } + Tz = (INT16)ShellStrToUintn (TempLocation); } - if (!((Tz >= -1440) && (Tz <= 1440)) && (Tz != EFI_UNSPECIFIED_TIMEZONE)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"time", TempLocation, L"-tz"); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } else { // - // intentionally out of bounds value will prevent changing it... + // Detect the return of ShellStrToUintn() to make sure the argument is valid. // - Tz = 1441; + if (Tz == -1) { + Tz = 1441; // make it to be out of bounds value + } } - TempLocation = ShellCommandLineGetValue (Package, L"-d"); - if (TempLocation != NULL) { - Daylight = (UINT8)ShellStrToUintn (TempLocation); - // - // The argument of "time [-d dl]" is unsigned, if the first character is '-', - // the argument is incorrect. That's because ShellStrToUintn() will skip past - // any '-' sign and convert what's next, forgetting the sign is here. - // - if (TempLocation[0] == '-') { - Daylight = 0xff; // make it invalid = will not use - } + if (!((Tz >= -1440) && (Tz <= 1440)) && (Tz != EFI_UNSPECIFIED_TIMEZONE)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"time", TempLocation, L"-tz"); + ShellStatus = SHELL_INVALID_PARAMETER; + } + } else { + // + // intentionally out of bounds value will prevent changing it... + // + Tz = 1441; + } - if ((Daylight != 0) && (Daylight != 1) && (Daylight != 3)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"time", TempLocation, L"-d"); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } else { - // - // invalid = will not use - // - Daylight = 0xFF; + TempLocation = ShellCommandLineGetValue (Package, L"-d"); + if (TempLocation != NULL) { + Daylight = (UINT8)ShellStrToUintn (TempLocation); + // + // The argument of "time [-d dl]" is unsigned, if the first character is '-', + // the argument is incorrect. That's because ShellStrToUintn() will skip past + // any '-' sign and convert what's next, forgetting the sign is here. + // + if (TempLocation[0] == '-') { + Daylight = 0xff; // make it invalid = will not use } - if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = CheckAndSetTime (ShellCommandLineGetRawValue (Package, 1), Tz, Daylight); - if (ShellStatus != SHELL_SUCCESS) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"time", ShellCommandLineGetRawValue (Package, 1)); - ShellStatus = SHELL_INVALID_PARAMETER; - } + if ((Daylight != 0) && (Daylight != 1) && (Daylight != 3)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"time", TempLocation, L"-d"); + ShellStatus = SHELL_INVALID_PARAMETER; + } + } else { + // + // invalid = will not use + // + Daylight = 0xFF; + } + + if (ShellStatus == SHELL_SUCCESS) { + ShellStatus = CheckAndSetTime (ShellCommandLineGetRawValue (Package, 1), Tz, Daylight); + if (ShellStatus != SHELL_SUCCESS) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"time", ShellCommandLineGetRawValue (Package, 1)); + ShellStatus = SHELL_INVALID_PARAMETER; } } } @@ -850,131 +854,133 @@ ShellCommandRunTimeZone ( } else { ASSERT (FALSE); } - } else { - // - // check for "-?" - // - if (ShellCommandLineGetCount (Package) > 1) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"timezone"); + + return ShellStatus; + } + + // + // check for "-?" + // + if (ShellCommandLineGetCount (Package) > 1) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"timezone"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else if (ShellCommandLineGetFlag (Package, L"-?")) { + ASSERT (FALSE); + } else if (ShellCommandLineGetFlag (Package, L"-s")) { + if ((ShellCommandLineGetFlag (Package, L"-l")) || (ShellCommandLineGetFlag (Package, L"-f"))) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"timezone", L"-l or -f"); ShellStatus = SHELL_INVALID_PARAMETER; - } else if (ShellCommandLineGetFlag (Package, L"-?")) { - ASSERT (FALSE); - } else if (ShellCommandLineGetFlag (Package, L"-s")) { - if ((ShellCommandLineGetFlag (Package, L"-l")) || (ShellCommandLineGetFlag (Package, L"-f"))) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"timezone", L"-l or -f"); + } else { + ASSERT (PcdGet8 (PcdShellSupportLevel) == 3); + if (ShellCommandLineGetValue (Package, L"-s") == NULL) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"timezone", L"-s"); ShellStatus = SHELL_INVALID_PARAMETER; } else { - ASSERT (PcdGet8 (PcdShellSupportLevel) == 3); - if (ShellCommandLineGetValue (Package, L"-s") == NULL) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"timezone", L"-s"); + // + // Set the time zone + // + ShellStatus = CheckAndSetTimeZone (ShellCommandLineGetValue (Package, L"-s")); + if (ShellStatus != SHELL_SUCCESS) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"timezone", ShellCommandLineGetValue (Package, L"-s")); ShellStatus = SHELL_INVALID_PARAMETER; - } else { - // - // Set the time zone - // - ShellStatus = CheckAndSetTimeZone (ShellCommandLineGetValue (Package, L"-s")); - if (ShellStatus != SHELL_SUCCESS) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"timezone", ShellCommandLineGetValue (Package, L"-s")); - ShellStatus = SHELL_INVALID_PARAMETER; - } } } - } else if (ShellCommandLineGetFlag (Package, L"-l")) { - // - // Print a list of all time zones - // + } + } else if (ShellCommandLineGetFlag (Package, L"-l")) { + // + // Print a list of all time zones + // + for ( LoopVar = 0 + ; LoopVar < sizeof (TimeZoneList) / sizeof (TimeZoneList[0]) + ; LoopVar++ + ) + { + ShellPrintHiiDefaultEx (TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle); + } + } else { + // + // Get Current Time Zone Info + // + Status = gRT->GetTime (&TheTime, NULL); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"timezone", L"gRT->GetTime", Status); + return (SHELL_DEVICE_ERROR); + } + + if (TheTime.TimeZone != EFI_UNSPECIFIED_TIMEZONE) { + Found = FALSE; for ( LoopVar = 0 ; LoopVar < sizeof (TimeZoneList) / sizeof (TimeZoneList[0]) ; LoopVar++ ) { - ShellPrintHiiDefaultEx (TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle); + if (TheTime.TimeZone == TimeZoneList[LoopVar].TimeZone) { + if (ShellCommandLineGetFlag (Package, L"-f")) { + // + // Print all info about current time zone + // + ShellPrintHiiDefaultEx (TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle); + } else { + // + // Print basic info only + // + TzMinutes = (ABS (TheTime.TimeZone)) % 60; + + ShellPrintHiiDefaultEx ( + STRING_TOKEN (STR_TIMEZONE_SIMPLE), + gShellLevel2HiiHandle, + (TheTime.TimeZone > 0 ? L"-" : L"+"), + (ABS (TheTime.TimeZone)) / 60, + TzMinutes + ); + } + + Found = TRUE; + break; + } + } + + if (!Found) { + // + // Print basic info only + // + TzMinutes = (ABS (TheTime.TimeZone)) % 60; + + ShellPrintHiiDefaultEx ( + STRING_TOKEN (STR_TIMEZONE_SIMPLE), + gShellLevel2HiiHandle, + (TheTime.TimeZone > 0 ? L"-" : L"+"), + (ABS (TheTime.TimeZone)) / 60, + TzMinutes + ); + + if (ShellCommandLineGetFlag (Package, L"-f")) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIMEZONE_NI), gShellLevel2HiiHandle); + } } } else { // - // Get Current Time Zone Info + // TimeZone was EFI_UNSPECIFIED_TIMEZONE (local) from GetTime() // - Status = gRT->GetTime (&TheTime, NULL); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"timezone", L"gRT->GetTime", Status); - return (SHELL_DEVICE_ERROR); - } - - if (TheTime.TimeZone != EFI_UNSPECIFIED_TIMEZONE) { - Found = FALSE; + if (ShellCommandLineGetFlag (Package, L"-f")) { for ( LoopVar = 0 - ; LoopVar < sizeof (TimeZoneList) / sizeof (TimeZoneList[0]) + ; LoopVar < ARRAY_SIZE (TimeZoneList) ; LoopVar++ ) { if (TheTime.TimeZone == TimeZoneList[LoopVar].TimeZone) { - if (ShellCommandLineGetFlag (Package, L"-f")) { - // - // Print all info about current time zone - // - ShellPrintHiiDefaultEx (TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle); - } else { - // - // Print basic info only - // - TzMinutes = (ABS (TheTime.TimeZone)) % 60; - - ShellPrintHiiDefaultEx ( - STRING_TOKEN (STR_TIMEZONE_SIMPLE), - gShellLevel2HiiHandle, - (TheTime.TimeZone > 0 ? L"-" : L"+"), - (ABS (TheTime.TimeZone)) / 60, - TzMinutes - ); - } - - Found = TRUE; + // + // Print all info about current time zone + // + ShellPrintHiiDefaultEx (TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle); break; } } - - if (!Found) { - // - // Print basic info only - // - TzMinutes = (ABS (TheTime.TimeZone)) % 60; - - ShellPrintHiiDefaultEx ( - STRING_TOKEN (STR_TIMEZONE_SIMPLE), - gShellLevel2HiiHandle, - (TheTime.TimeZone > 0 ? L"-" : L"+"), - (ABS (TheTime.TimeZone)) / 60, - TzMinutes - ); - - if (ShellCommandLineGetFlag (Package, L"-f")) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIMEZONE_NI), gShellLevel2HiiHandle); - } - } } else { // - // TimeZone was EFI_UNSPECIFIED_TIMEZONE (local) from GetTime() + // Print basic info only // - if (ShellCommandLineGetFlag (Package, L"-f")) { - for ( LoopVar = 0 - ; LoopVar < ARRAY_SIZE (TimeZoneList) - ; LoopVar++ - ) - { - if (TheTime.TimeZone == TimeZoneList[LoopVar].TimeZone) { - // - // Print all info about current time zone - // - ShellPrintHiiDefaultEx (TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle); - break; - } - } - } else { - // - // Print basic info only - // - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIMEZONE_SIMPLE_LOCAL), gShellLevel2HiiHandle); - } + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIMEZONE_SIMPLE_LOCAL), gShellLevel2HiiHandle); } } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c index 0279c42b9566..c2d61f1964e4 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c @@ -260,60 +260,62 @@ ShellCommandRunVol ( } else { ASSERT (FALSE); } + + return ShellStatus; + } + + // + // check for "-?" + // + if (ShellCommandLineGetFlag (Package, L"-?")) { + ASSERT (FALSE); + } + + if (ShellCommandLineGetCount (Package) > 2) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"vol"); + ShellStatus = SHELL_INVALID_PARAMETER; } else { - // - // check for "-?" - // - if (ShellCommandLineGetFlag (Package, L"-?")) { - ASSERT (FALSE); + PathName = ShellCommandLineGetRawValue (Package, 1); + if (PathName == NULL) { + CurDir = gEfiShellProtocol->GetCurDir (NULL); + if (CurDir == NULL) { + ShellStatus = SHELL_NOT_FOUND; + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"vol"); + } else { + PathName = CurDir; + } } - if (ShellCommandLineGetCount (Package) > 2) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"vol"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - PathName = ShellCommandLineGetRawValue (Package, 1); - if (PathName == NULL) { - CurDir = gEfiShellProtocol->GetCurDir (NULL); - if (CurDir == NULL) { - ShellStatus = SHELL_NOT_FOUND; - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"vol"); - } else { - PathName = CurDir; - } + if (PathName != NULL) { + TempSpot = StrStr (PathName, L":"); + if (TempSpot != NULL) { + *TempSpot = CHAR_NULL; } - if (PathName != NULL) { - TempSpot = StrStr (PathName, L":"); - if (TempSpot != NULL) { - *TempSpot = CHAR_NULL; - } - - TempSpot = StrStr (PathName, L"\\"); - if (TempSpot != NULL) { - *TempSpot = CHAR_NULL; - } - - StrnCatGrow (&FullPath, &Length, PathName, 0); - StrnCatGrow (&FullPath, &Length, L":\\", 0); - DeleteMode = ShellCommandLineGetFlag (Package, L"-d"); - NewName = ShellCommandLineGetValue (Package, L"-n"); - if (DeleteMode && ShellCommandLineGetFlag (Package, L"-n")) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellLevel2HiiHandle, L"vol", L"-d", L"-n"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else if (ShellCommandLineGetFlag (Package, L"-n") && (NewName == NULL)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"vol", L"-n"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else if ((NewName != NULL) && (StrLen (NewName) > 11)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"vol", NewName, L"-n"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = HandleVol ( - FullPath, - DeleteMode, - NewName - ); - } + TempSpot = StrStr (PathName, L"\\"); + if (TempSpot != NULL) { + *TempSpot = CHAR_NULL; + } + + StrnCatGrow (&FullPath, &Length, PathName, 0); + StrnCatGrow (&FullPath, &Length, L":\\", 0); + DeleteMode = ShellCommandLineGetFlag (Package, L"-d"); + NewName = ShellCommandLineGetValue (Package, L"-n"); + if (DeleteMode && ShellCommandLineGetFlag (Package, L"-n")) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellLevel2HiiHandle, L"vol", L"-d", L"-n"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else if (ShellCommandLineGetFlag (Package, L"-n") && (NewName == NULL)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"vol", L"-n"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else if ((NewName != NULL) && (StrLen (NewName) > 11)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"vol", NewName, L"-n"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else if (ShellStatus == SHELL_SUCCESS) { + ShellStatus = HandleVol ( + FullPath, + DeleteMode, + NewName + ); } } } From 531b0aa00211656a738ee9612112b0dbce2658e1 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Sat, 20 Sep 2025 20:06:44 +0200 Subject: [PATCH 0856/1172] ShellPkg/UefiShellLevel2: Extract MainCmdXXX() function This patch aims to help breaking down the long function present in the ShellPkg and reduce complexity/nested code and conditions. Extract a MainCmdXXX() function for each shell command. This command contains the possible operations the command aims to operate. The ShellCommandRunXXX() function from which it is extracted is only responsible of: - initializing the shell/command environment - parsing the command parameter and creating a Package - freeing the Package No functional change should be induced by this patch. Signed-off-by: Pierre Gondois --- .../UefiShellLevel2CommandsLib/Attrib.c | 90 ++++-- .../Library/UefiShellLevel2CommandsLib/Cd.c | 106 ++++--- .../Library/UefiShellLevel2CommandsLib/Cp.c | 98 +++--- .../Library/UefiShellLevel2CommandsLib/Load.c | 90 ++++-- .../Library/UefiShellLevel2CommandsLib/Ls.c | 105 +++--- .../Library/UefiShellLevel2CommandsLib/Map.c | 100 +++--- .../UefiShellLevel2CommandsLib/MkDir.c | 84 +++-- .../Library/UefiShellLevel2CommandsLib/Mv.c | 98 +++--- .../UefiShellLevel2CommandsLib/Parse.c | 87 +++-- .../UefiShellLevel2CommandsLib/Reset.c | 95 +++--- .../Library/UefiShellLevel2CommandsLib/Rm.c | 92 +++--- .../Library/UefiShellLevel2CommandsLib/Set.c | 112 ++++--- .../UefiShellLevel2CommandsLib/TimeDate.c | 300 +++++++++++------- .../Library/UefiShellLevel2CommandsLib/Vol.c | 121 ++++--- 14 files changed, 951 insertions(+), 627 deletions(-) diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Attrib.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Attrib.c index 89678a418256..cb69b183bc59 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Attrib.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Attrib.c @@ -23,24 +23,19 @@ STATIC CONST SHELL_PARAM_ITEM AttribParamList[] = { { NULL, TypeMax } }; -/** - Function for 'attrib' command. +/** Main function of the 'Attrib' command. - @param[in] ImageHandle Handle to the Image (NULL if Internal). - @param[in] SystemTable Pointer to the System Table (NULL if Internal). + @param[in] Package List of input parameter for the command. **/ +STATIC SHELL_STATUS -EFIAPI -ShellCommandRunAttrib ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +MainCmdAttrib ( + LIST_ENTRY *Package ) { UINT64 FileAttributesToAdd; UINT64 FileAttributesToRemove; EFI_STATUS Status; - LIST_ENTRY *Package; - CHAR16 *ProblemParam; SHELL_STATUS ShellStatus; UINTN ParamNumberCount; CONST CHAR16 *FileName; @@ -48,31 +43,8 @@ ShellCommandRunAttrib ( EFI_SHELL_FILE_INFO *FileNode; EFI_FILE_INFO *FileInfo; - ListOfFiles = NULL; - ShellStatus = SHELL_SUCCESS; - ProblemParam = NULL; - - // - // initialize the shell lib (we must be in non-auto-init...) - // - Status = ShellInitialize (); - ASSERT_EFI_ERROR (Status); - - // - // parse the command line - // - Status = ShellCommandLineParse (AttribParamList, &Package, &ProblemParam, TRUE); - if (EFI_ERROR (Status)) { - if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"attrib", ProblemParam); - FreePool (ProblemParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ASSERT (FALSE); - } - - return ShellStatus; - } + ListOfFiles = NULL; + ShellStatus = SHELL_SUCCESS; // // check for "-?" @@ -272,6 +244,54 @@ ShellCommandRunAttrib ( } } + return ShellStatus; +} + +/** + Function for 'attrib' command. + + @param[in] ImageHandle Handle to the Image (NULL if Internal). + @param[in] SystemTable Pointer to the System Table (NULL if Internal). +**/ +SHELL_STATUS +EFIAPI +ShellCommandRunAttrib ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + SHELL_STATUS ShellStatus; + + ShellStatus = SHELL_SUCCESS; + ProblemParam = NULL; + + // + // initialize the shell lib (we must be in non-auto-init...) + // + Status = ShellInitialize (); + ASSERT_EFI_ERROR (Status); + + // + // parse the command line + // + Status = ShellCommandLineParse (AttribParamList, &Package, &ProblemParam, TRUE); + if (EFI_ERROR (Status)) { + if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"attrib", ProblemParam); + FreePool (ProblemParam); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ASSERT (FALSE); + } + + return ShellStatus; + } + + ShellStatus = MainCmdAttrib (Package); + // // free the command line package // diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c index 639425f27f51..0960e06b5b20 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c @@ -162,25 +162,20 @@ ExtractDriveAndPath ( return EFI_SUCCESS; } -/** - Function for 'cd' command. +/** Main function of the 'Cd' command. - @param[in] ImageHandle Handle to the Image (NULL if Internal). - @param[in] SystemTable Pointer to the System Table (NULL if Internal). + @param[in] Package List of input parameter for the command. **/ +STATIC SHELL_STATUS -EFIAPI -ShellCommandRunCd ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +MainCmdCd ( + LIST_ENTRY *Package ) { EFI_STATUS Status; - LIST_ENTRY *Package; CONST CHAR16 *Cwd; CHAR16 *Path; CHAR16 *Drive; - CHAR16 *ProblemParam; SHELL_STATUS ShellStatus; CONST CHAR16 *Param1; CHAR16 *Param1Copy; @@ -189,39 +184,13 @@ ShellCommandRunCd ( CHAR16 *TempBuffer; UINTN TotalSize; - ProblemParam = NULL; - ShellStatus = SHELL_SUCCESS; - Cwd = NULL; - Path = NULL; - Drive = NULL; - Splitter = NULL; - TempBuffer = NULL; - TotalSize = 0; - - Status = CommandInit (); - ASSERT_EFI_ERROR (Status); - - // - // initialize the shell lib (we must be in non-auto-init...) - // - Status = ShellInitialize (); - ASSERT_EFI_ERROR (Status); - - // - // parse the command line - // - Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); - if (EFI_ERROR (Status)) { - if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"cd", ProblemParam); - FreePool (ProblemParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ASSERT (FALSE); - } - - return ShellStatus; - } + ShellStatus = SHELL_SUCCESS; + Cwd = NULL; + Path = NULL; + Drive = NULL; + Splitter = NULL; + TempBuffer = NULL; + TotalSize = 0; // // check for "-?" @@ -340,6 +309,57 @@ ShellCommandRunCd ( } } + return ShellStatus; +} + +/** + Function for 'cd' command. + + @param[in] ImageHandle Handle to the Image (NULL if Internal). + @param[in] SystemTable Pointer to the System Table (NULL if Internal). +**/ +SHELL_STATUS +EFIAPI +ShellCommandRunCd ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + SHELL_STATUS ShellStatus; + + ProblemParam = NULL; + ShellStatus = SHELL_SUCCESS; + + Status = CommandInit (); + ASSERT_EFI_ERROR (Status); + + // + // initialize the shell lib (we must be in non-auto-init...) + // + Status = ShellInitialize (); + ASSERT_EFI_ERROR (Status); + + // + // parse the command line + // + Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); + if (EFI_ERROR (Status)) { + if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"cd", ProblemParam); + FreePool (ProblemParam); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ASSERT (FALSE); + } + + return ShellStatus; + } + + ShellStatus = MainCmdCd (Package); + // // free the command line package // diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c index cf321eb0dc6f..8830e11c3ad8 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cp.c @@ -649,22 +649,17 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] = { { NULL, TypeMax } }; -/** - Function for 'cp' command. +/** Main function of the 'Cp' command. - @param[in] ImageHandle Handle to the Image (NULL if Internal). - @param[in] SystemTable Pointer to the System Table (NULL if Internal). + @param[in] Package List of input parameter for the command. **/ +STATIC SHELL_STATUS -EFIAPI -ShellCommandRunCp ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +MainCmdCp ( + LIST_ENTRY *Package ) { EFI_STATUS Status; - LIST_ENTRY *Package; - CHAR16 *ProblemParam; SHELL_STATUS ShellStatus; UINTN ParamCount; UINTN LoopCounter; @@ -674,35 +669,9 @@ ShellCommandRunCp ( CONST CHAR16 *Cwd; CHAR16 *FullCwd; - ProblemParam = NULL; - ShellStatus = SHELL_SUCCESS; - ParamCount = 0; - FileList = NULL; - - // - // initialize the shell lib (we must be in non-auto-init...) - // - Status = ShellInitialize (); - ASSERT_EFI_ERROR (Status); - - Status = CommandInit (); - ASSERT_EFI_ERROR (Status); - - // - // parse the command line - // - Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); - if (EFI_ERROR (Status)) { - if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"cp", ProblemParam); - FreePool (ProblemParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ASSERT (FALSE); - } - - return ShellStatus; - } + ShellStatus = SHELL_SUCCESS; + ParamCount = 0; + FileList = NULL; // // check for "-?" @@ -797,6 +766,57 @@ ShellCommandRunCp ( ShellCloseFileMetaArg (&FileList); } + return ShellStatus; +} + +/** + Function for 'cp' command. + + @param[in] ImageHandle Handle to the Image (NULL if Internal). + @param[in] SystemTable Pointer to the System Table (NULL if Internal). +**/ +SHELL_STATUS +EFIAPI +ShellCommandRunCp ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + SHELL_STATUS ShellStatus; + + ProblemParam = NULL; + ShellStatus = SHELL_SUCCESS; + + // + // initialize the shell lib (we must be in non-auto-init...) + // + Status = ShellInitialize (); + ASSERT_EFI_ERROR (Status); + + Status = CommandInit (); + ASSERT_EFI_ERROR (Status); + + // + // parse the command line + // + Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); + if (EFI_ERROR (Status)) { + if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"cp", ProblemParam); + FreePool (ProblemParam); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ASSERT (FALSE); + } + + return ShellStatus; + } + + ShellStatus = MainCmdCp (Package); + // // free the command line package // diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c index 981d9a58b2b4..aa7e54a8b425 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c @@ -179,52 +179,24 @@ STATIC CONST SHELL_PARAM_ITEM LoadParamList[] = { { NULL, TypeMax } }; -/** - Function for 'load' command. +/** Main function of the 'Load' command. - @param[in] ImageHandle Handle to the Image (NULL if Internal). - @param[in] SystemTable Pointer to the System Table (NULL if Internal). + @param[in] Package List of input parameter for the command. **/ +STATIC SHELL_STATUS -EFIAPI -ShellCommandRunLoad ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +MainCmdLoad ( + LIST_ENTRY *Package ) { EFI_STATUS Status; - LIST_ENTRY *Package; - CHAR16 *ProblemParam; SHELL_STATUS ShellStatus; UINTN ParamCount; EFI_SHELL_FILE_INFO *ListHead; EFI_SHELL_FILE_INFO *Node; - ListHead = NULL; - ProblemParam = NULL; - ShellStatus = SHELL_SUCCESS; - - // - // initialize the shell lib (we must be in non-auto-init...) - // - Status = ShellInitialize (); - ASSERT_EFI_ERROR (Status); - - // - // parse the command line - // - Status = ShellCommandLineParse (LoadParamList, &Package, &ProblemParam, TRUE); - if (EFI_ERROR (Status)) { - if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"load", ProblemParam); - FreePool (ProblemParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ASSERT (FALSE); - } - - return ShellStatus; - } + ListHead = NULL; + ShellStatus = SHELL_SUCCESS; // // check for "-?" @@ -275,6 +247,54 @@ ShellCommandRunLoad ( } // for loop for params } + return ShellStatus; +} + +/** + Function for 'load' command. + + @param[in] ImageHandle Handle to the Image (NULL if Internal). + @param[in] SystemTable Pointer to the System Table (NULL if Internal). +**/ +SHELL_STATUS +EFIAPI +ShellCommandRunLoad ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + SHELL_STATUS ShellStatus; + + ProblemParam = NULL; + ShellStatus = SHELL_SUCCESS; + + // + // initialize the shell lib (we must be in non-auto-init...) + // + Status = ShellInitialize (); + ASSERT_EFI_ERROR (Status); + + // + // parse the command line + // + Status = ShellCommandLineParse (LoadParamList, &Package, &ProblemParam, TRUE); + if (EFI_ERROR (Status)) { + if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"load", ProblemParam); + FreePool (ProblemParam); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ASSERT (FALSE); + } + + return ShellStatus; + } + + ShellStatus = MainCmdLoad (Package); + // // free the command line package // diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c index c72db4178809..423bbcec2c89 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c @@ -693,22 +693,18 @@ STATIC CONST SHELL_PARAM_ITEM LsParamList[] = { { NULL, TypeMax } }; -/** - Function for 'ls' command. +/** Main function of the 'Ls' command. - @param[in] ImageHandle Handle to the Image (NULL if Internal). - @param[in] SystemTable Pointer to the System Table (NULL if Internal). + @param[in] Package List of input parameter for the command. **/ +STATIC SHELL_STATUS -EFIAPI -ShellCommandRunLs ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +MainCmdLs ( + LIST_ENTRY *Package ) { - EFI_STATUS Status; - LIST_ENTRY *Package; - CHAR16 *ProblemParam; + EFI_STATUS Status; + CONST CHAR16 *Attribs; SHELL_STATUS ShellStatus; UINT64 RequiredAttributes; @@ -723,7 +719,6 @@ ShellCommandRunLs ( Size = 0; FullPath = NULL; - ProblemParam = NULL; Attribs = NULL; ShellStatus = SHELL_SUCCESS; RequiredAttributes = 0; @@ -733,34 +728,6 @@ ShellCommandRunLs ( Count = 0; ListUnfiltered = FALSE; - // - // initialize the shell lib (we must be in non-auto-init...) - // - Status = ShellInitialize (); - ASSERT_EFI_ERROR (Status); - - // - // Fix local copies of the protocol pointers - // - Status = CommandInit (); - ASSERT_EFI_ERROR (Status); - - // - // parse the command line - // - Status = ShellCommandLineParse (LsParamList, &Package, &ProblemParam, TRUE); - if (EFI_ERROR (Status)) { - if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"ls", ProblemParam); - FreePool (ProblemParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ASSERT (FALSE); - } - - return ShellStatus; - } - // // check for "-?" // @@ -934,6 +901,64 @@ ShellCommandRunLs ( // SHELL_FREE_NON_NULL (SearchString); SHELL_FREE_NON_NULL (FullPath); + + return ShellStatus; +} + +/** + Function for 'ls' command. + + @param[in] ImageHandle Handle to the Image (NULL if Internal). + @param[in] SystemTable Pointer to the System Table (NULL if Internal). +**/ +SHELL_STATUS +EFIAPI +ShellCommandRunLs ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + SHELL_STATUS ShellStatus; + + ProblemParam = NULL; + ShellStatus = SHELL_SUCCESS; + + // + // initialize the shell lib (we must be in non-auto-init...) + // + Status = ShellInitialize (); + ASSERT_EFI_ERROR (Status); + + // + // Fix local copies of the protocol pointers + // + Status = CommandInit (); + ASSERT_EFI_ERROR (Status); + + // + // parse the command line + // + Status = ShellCommandLineParse (LsParamList, &Package, &ProblemParam, TRUE); + if (EFI_ERROR (Status)) { + if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"ls", ProblemParam); + FreePool (ProblemParam); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ASSERT (FALSE); + } + + return ShellStatus; + } + + ShellStatus = MainCmdLs (Package); + + // + // Free memory allocated + // ShellCommandLineFreeVarList (Package); return (ShellStatus); diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c index 98f5ac92943e..d15e2b16743a 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c @@ -1093,22 +1093,17 @@ ProbeForMediaChange ( } } -/** - Function for 'map' command. +/** Main function of the 'Map' command. - @param[in] ImageHandle Handle to the Image (NULL if Internal). - @param[in] SystemTable Pointer to the System Table (NULL if Internal). + @param[in] Package List of input parameter for the command. **/ +STATIC SHELL_STATUS -EFIAPI -ShellCommandRunMap ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +MainCmdMap ( + LIST_ENTRY *Package ) { EFI_STATUS Status; - LIST_ENTRY *Package; - CHAR16 *ProblemParam; CONST CHAR16 *SName; CONST CHAR16 *Mapping; EFI_HANDLE MapAsHandle; @@ -1120,36 +1115,10 @@ ShellCommandRunMap ( CONST CHAR16 *TypeString; UINTN TempStringLength; - ProblemParam = NULL; - Mapping = NULL; - SName = NULL; - ShellStatus = SHELL_SUCCESS; - MapAsHandle = NULL; - - // - // initialize the shell lib (we must be in non-auto-init...) - // - Status = ShellInitialize (); - ASSERT_EFI_ERROR (Status); - - Status = CommandInit (); - ASSERT_EFI_ERROR (Status); - - // - // parse the command line - // - Status = ShellCommandLineParse (MapParamList, &Package, &ProblemParam, TRUE); - if (EFI_ERROR (Status)) { - if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"map", ProblemParam); - FreePool (ProblemParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ASSERT (FALSE); - } - - return ShellStatus; - } + Mapping = NULL; + SName = NULL; + ShellStatus = SHELL_SUCCESS; + MapAsHandle = NULL; // // check for "-?" @@ -1359,6 +1328,57 @@ ShellCommandRunMap ( } // we are adding a mapping } // got valid parameters + return ShellStatus; +} + +/** + Function for 'map' command. + + @param[in] ImageHandle Handle to the Image (NULL if Internal). + @param[in] SystemTable Pointer to the System Table (NULL if Internal). +**/ +SHELL_STATUS +EFIAPI +ShellCommandRunMap ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + SHELL_STATUS ShellStatus; + + ProblemParam = NULL; + ShellStatus = SHELL_SUCCESS; + + // + // initialize the shell lib (we must be in non-auto-init...) + // + Status = ShellInitialize (); + ASSERT_EFI_ERROR (Status); + + Status = CommandInit (); + ASSERT_EFI_ERROR (Status); + + // + // parse the command line + // + Status = ShellCommandLineParse (MapParamList, &Package, &ProblemParam, TRUE); + if (EFI_ERROR (Status)) { + if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"map", ProblemParam); + FreePool (ProblemParam); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ASSERT (FALSE); + } + + return ShellStatus; + } + + ShellStatus = MainCmdMap (Package); + // // free the command line package // diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c index 37ad2327d910..62acb4f77069 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c @@ -9,17 +9,14 @@ #include "UefiShellLevel2CommandsLib.h" -/** - Function for 'mkdir' command. +/** Main function of the 'MkDir' command. - @param[in] ImageHandle Handle to the Image (NULL if Internal). - @param[in] SystemTable Pointer to the System Table (NULL if Internal). + @param[in] Package List of input parameter for the command. **/ +STATIC SHELL_STATUS -EFIAPI -ShellCommandRunMkDir ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +MainCmdMkdir ( + LIST_ENTRY *Package ) { EFI_STATUS Status; @@ -28,8 +25,6 @@ ShellCommandRunMkDir ( CHAR16 *SplitName; CHAR16 SaveSplitChar; UINTN DirCreateCount; - LIST_ENTRY *Package; - CHAR16 *ProblemParam; SHELL_FILE_HANDLE FileHandle; SHELL_STATUS ShellStatus; @@ -37,33 +32,14 @@ ShellCommandRunMkDir ( NewDirNameCopy = NULL; SplitName = NULL; SaveSplitChar = CHAR_NULL; - // - // initialize the shell lib (we must be in non-auto-init...) - // - Status = ShellInitialize (); - ASSERT_EFI_ERROR (Status); // - // parse the command line - // - Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); - if (EFI_ERROR (Status)) { - if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"mkdir", ProblemParam); - FreePool (ProblemParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ASSERT (FALSE); - } - - return ShellStatus; - } - // // check for "-?" // if (ShellCommandLineGetFlag (Package, L"-?")) { ASSERT (FALSE); + return ShellStatus; } // @@ -163,6 +139,54 @@ ShellCommandRunMkDir ( } } + return ShellStatus; +} + +/** + Function for 'mkdir' command. + + @param[in] ImageHandle Handle to the Image (NULL if Internal). + @param[in] SystemTable Pointer to the System Table (NULL if Internal). +**/ +SHELL_STATUS +EFIAPI +ShellCommandRunMkDir ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + SHELL_STATUS ShellStatus; + + ProblemParam = NULL; + ShellStatus = SHELL_SUCCESS; + + // + // initialize the shell lib (we must be in non-auto-init...) + // + Status = ShellInitialize (); + ASSERT_EFI_ERROR (Status); + + // + // parse the command line + // + Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); + if (EFI_ERROR (Status)) { + if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"mkdir", ProblemParam); + FreePool (ProblemParam); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ASSERT (FALSE); + } + + return ShellStatus; + } + + ShellStatus = MainCmdMkdir (Package); + // // free the command line package // diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c index 76a31efaa52b..fcd001e5abe1 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c @@ -740,22 +740,17 @@ ValidateAndMoveFiles ( return (ShellStatus); } -/** - Function for 'mv' command. +/** Main function of the 'Mv' command. - @param[in] ImageHandle Handle to the Image (NULL if Internal). - @param[in] SystemTable Pointer to the System Table (NULL if Internal). + @param[in] Package List of input parameter for the command. **/ +STATIC SHELL_STATUS -EFIAPI -ShellCommandRunMv ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +MainCmdMv ( + LIST_ENTRY *Package ) { EFI_STATUS Status; - LIST_ENTRY *Package; - CHAR16 *ProblemParam; CHAR16 *Cwd; UINTN CwdSize; SHELL_STATUS ShellStatus; @@ -764,33 +759,10 @@ ShellCommandRunMv ( EFI_SHELL_FILE_INFO *FileList; VOID *Response; - ProblemParam = NULL; - ShellStatus = SHELL_SUCCESS; - ParamCount = 0; - FileList = NULL; - Response = NULL; - - // - // initialize the shell lib (we must be in non-auto-init...) - // - Status = ShellInitialize (); - ASSERT_EFI_ERROR (Status); - - // - // parse the command line - // - Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); - if (EFI_ERROR (Status)) { - if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"mv", ProblemParam); - FreePool (ProblemParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ASSERT (FALSE); - } - - return ShellStatus; - } + ShellStatus = SHELL_SUCCESS; + ParamCount = 0; + FileList = NULL; + Response = NULL; // // check for "-?" @@ -878,13 +850,61 @@ ShellCommandRunMv ( ShellCloseFileMetaArg (&FileList); } + SHELL_FREE_NON_NULL (Response); + + return ShellStatus; +} + +/** + Function for 'mv' command. + + @param[in] ImageHandle Handle to the Image (NULL if Internal). + @param[in] SystemTable Pointer to the System Table (NULL if Internal). +**/ +SHELL_STATUS +EFIAPI +ShellCommandRunMv ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + SHELL_STATUS ShellStatus; + + ProblemParam = NULL; + ShellStatus = SHELL_SUCCESS; + + // + // initialize the shell lib (we must be in non-auto-init...) + // + Status = ShellInitialize (); + ASSERT_EFI_ERROR (Status); + + // + // parse the command line + // + Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); + if (EFI_ERROR (Status)) { + if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"mv", ProblemParam); + FreePool (ProblemParam); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ASSERT (FALSE); + } + + return ShellStatus; + } + + ShellStatus = MainCmdMv (Package); + // // free the command line package // ShellCommandLineFreeVarList (Package); - SHELL_FREE_NON_NULL (Response); - if (ShellGetExecutionBreakFlag ()) { return (SHELL_ABORTED); } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c index a91e75a05df8..d20d0fb1c85b 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c @@ -234,22 +234,16 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] = { { NULL, TypeMax } }; -/** - Function for 'parse' command. +/** Main function of the 'Parse' command. - @param[in] ImageHandle Handle to the Image (NULL if Internal). - @param[in] SystemTable Pointer to the System Table (NULL if Internal). + @param[in] Package List of input parameter for the command. **/ +STATIC SHELL_STATUS -EFIAPI -ShellCommandRunParse ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +MainCmdParse ( + LIST_ENTRY *Package ) { - EFI_STATUS Status; - LIST_ENTRY *Package; - CHAR16 *ProblemParam; CONST CHAR16 *FileName; CONST CHAR16 *TableName; CONST CHAR16 *ColumnString; @@ -259,31 +253,8 @@ ShellCommandRunParse ( BOOLEAN StreamingUnicode; ShellStatus = SHELL_SUCCESS; - ProblemParam = NULL; StreamingUnicode = FALSE; - // - // initialize the shell lib (we must be in non-auto-init...) - // - Status = ShellInitialize (); - ASSERT_EFI_ERROR (Status); - - // - // parse the command line - // - Status = ShellCommandLineParseEx (ParamList, &Package, &ProblemParam, TRUE, FALSE); - if (EFI_ERROR (Status)) { - if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"parse", ProblemParam); - FreePool (ProblemParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ASSERT (FALSE); - } - - return ShellStatus; - } - StreamingUnicode = IsStdInDataAvailable (); if ((!StreamingUnicode && (ShellCommandLineGetCount (Package) < 4)) || (ShellCommandLineGetCount (Package) < 3)) @@ -325,6 +296,54 @@ ShellCommandRunParse ( } } + return ShellStatus; +} + +/** + Function for 'parse' command. + + @param[in] ImageHandle Handle to the Image (NULL if Internal). + @param[in] SystemTable Pointer to the System Table (NULL if Internal). +**/ +SHELL_STATUS +EFIAPI +ShellCommandRunParse ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + SHELL_STATUS ShellStatus; + + ShellStatus = SHELL_SUCCESS; + ProblemParam = NULL; + + // + // initialize the shell lib (we must be in non-auto-init...) + // + Status = ShellInitialize (); + ASSERT_EFI_ERROR (Status); + + // + // parse the command line + // + Status = ShellCommandLineParseEx (ParamList, &Package, &ProblemParam, TRUE, FALSE); + if (EFI_ERROR (Status)) { + if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"parse", ProblemParam); + FreePool (ProblemParam); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ASSERT (FALSE); + } + + return ShellStatus; + } + + ShellStatus = MainCmdParse (Package); + // // free the command line package // diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c index 13f3bfa27544..e5642b6d658b 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c @@ -17,52 +17,24 @@ STATIC CONST SHELL_PARAM_ITEM ResetParamList[] = { { NULL, TypeMax } }; -/** - Function for 'reset' command. +/** Main function of the 'Reset' command. - @param[in] ImageHandle Handle to the Image (NULL if Internal). - @param[in] SystemTable Pointer to the System Table (NULL if Internal). + @param[in] Package List of input parameter for the command. **/ +STATIC SHELL_STATUS -EFIAPI -ShellCommandRunReset ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +MainCmdReset ( + LIST_ENTRY *Package ) { EFI_STATUS Status; - LIST_ENTRY *Package; CONST CHAR16 *String; - CHAR16 *ProblemParam; SHELL_STATUS ShellStatus; UINT64 OsIndications; UINT32 Attr; UINTN DataSize; - ShellStatus = SHELL_SUCCESS; - ProblemParam = NULL; - - // - // initialize the shell lib (we must be in non-auto-init...) - // - Status = ShellInitialize (); - ASSERT_EFI_ERROR (Status); - - // - // parse the command line - // - Status = ShellCommandLineParse (ResetParamList, &Package, &ProblemParam, TRUE); - if (EFI_ERROR (Status)) { - if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"reset", ProblemParam); - FreePool (ProblemParam); - return (SHELL_INVALID_PARAMETER); - } else { - ASSERT (FALSE); - } - - return ShellStatus; - } + ShellStatus = SHELL_SUCCESS; // // check for "-?" @@ -84,8 +56,7 @@ ShellCommandRunReset ( ); if (EFI_ERROR (Status)) { - ShellStatus = SHELL_UNSUPPORTED; - goto Error; + return SHELL_UNSUPPORTED; } if ((OsIndications & EFI_OS_INDICATIONS_BOOT_TO_FW_UI) != 0) { @@ -114,8 +85,7 @@ ShellCommandRunReset ( } if (EFI_ERROR (Status)) { - ShellStatus = SHELL_UNSUPPORTED; - goto Error; + return SHELL_UNSUPPORTED; } } @@ -162,12 +132,59 @@ ShellCommandRunReset ( } } + return ShellStatus; +} + +/** + Function for 'reset' command. + + @param[in] ImageHandle Handle to the Image (NULL if Internal). + @param[in] SystemTable Pointer to the System Table (NULL if Internal). +**/ +SHELL_STATUS +EFIAPI +ShellCommandRunReset ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + SHELL_STATUS ShellStatus; + + ShellStatus = SHELL_SUCCESS; + ProblemParam = NULL; + + // + // initialize the shell lib (we must be in non-auto-init...) + // + Status = ShellInitialize (); + ASSERT_EFI_ERROR (Status); + + // + // parse the command line + // + Status = ShellCommandLineParse (ResetParamList, &Package, &ProblemParam, TRUE); + if (EFI_ERROR (Status)) { + if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"reset", ProblemParam); + FreePool (ProblemParam); + return (SHELL_INVALID_PARAMETER); + } else { + ASSERT (FALSE); + } + + return ShellStatus; + } + + ShellStatus = MainCmdReset (Package); + // // we should never get here... so the free and return are for formality more than use // as the ResetSystem function should not return... // -Error: // // free the command line package // diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c index e1105a4ecce9..b18401f0d42f 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c @@ -268,54 +268,26 @@ IsValidDeleteTarget ( return (RetVal); } -/** - Function for 'rm' command. +/** Main function of the 'Rm' command. - @param[in] ImageHandle Handle to the Image (NULL if Internal). - @param[in] SystemTable Pointer to the System Table (NULL if Internal). + @param[in] Package List of input parameter for the command. **/ +STATIC SHELL_STATUS -EFIAPI -ShellCommandRunRm ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +MainCmdRm ( + LIST_ENTRY *Package ) { EFI_STATUS Status; - LIST_ENTRY *Package; - CHAR16 *ProblemParam; CONST CHAR16 *Param; SHELL_STATUS ShellStatus; UINTN ParamCount; EFI_SHELL_FILE_INFO *FileList; EFI_SHELL_FILE_INFO *Node; - ProblemParam = NULL; - ShellStatus = SHELL_SUCCESS; - ParamCount = 0; - FileList = NULL; - - // - // initialize the shell lib (we must be in non-auto-init...) - // - Status = ShellInitialize (); - ASSERT_EFI_ERROR (Status); - - // - // parse the command line - // - Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); - if (EFI_ERROR (Status)) { - if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"rm", ProblemParam); - FreePool (ProblemParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ASSERT (FALSE); - } - - return ShellStatus; - } + ShellStatus = SHELL_SUCCESS; + ParamCount = 0; + FileList = NULL; // // check for "-?" @@ -393,6 +365,54 @@ ShellCommandRunRm ( FileList = NULL; } + return ShellStatus; +} + +/** + Function for 'rm' command. + + @param[in] ImageHandle Handle to the Image (NULL if Internal). + @param[in] SystemTable Pointer to the System Table (NULL if Internal). +**/ +SHELL_STATUS +EFIAPI +ShellCommandRunRm ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + SHELL_STATUS ShellStatus; + + ProblemParam = NULL; + ShellStatus = SHELL_SUCCESS; + + // + // initialize the shell lib (we must be in non-auto-init...) + // + Status = ShellInitialize (); + ASSERT_EFI_ERROR (Status); + + // + // parse the command line + // + Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); + if (EFI_ERROR (Status)) { + if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"rm", ProblemParam); + FreePool (ProblemParam); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ASSERT (FALSE); + } + + return ShellStatus; + } + + ShellStatus = MainCmdRm (Package); + // // free the command line package // diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Set.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Set.c index 1f907a50ce21..2cca3a2158ec 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Set.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Set.c @@ -39,62 +39,22 @@ PrintAllShellEnvVars ( return (SHELL_SUCCESS); } -STATIC CONST SHELL_PARAM_ITEM SetParamList[] = { - { L"-d", TypeValue }, - { L"-v", TypeFlag }, - { NULL, TypeMax } -}; +/** Main function of the 'Set' command. -/** - Function for 'set' command. - - @param[in] ImageHandle Handle to the Image (NULL if Internal). - @param[in] SystemTable Pointer to the System Table (NULL if Internal). + @param[in] Package List of input parameter for the command. **/ +STATIC SHELL_STATUS -EFIAPI -ShellCommandRunSet ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +MainCmdSet ( + LIST_ENTRY *Package ) { EFI_STATUS Status; - LIST_ENTRY *Package; CONST CHAR16 *KeyName; CONST CHAR16 *Value; - CHAR16 *ProblemParam; SHELL_STATUS ShellStatus; - ProblemParam = NULL; - ShellStatus = SHELL_SUCCESS; - - // - // initialize the shell lib (we must be in non-auto-init...) - // - Status = ShellInitialize (); - ASSERT_EFI_ERROR (Status); - - // - // Make sure globals are good... - // - Status = CommandInit (); - ASSERT_EFI_ERROR (Status); - - // - // parse the command line - // - Status = ShellCommandLineParse (SetParamList, &Package, &ProblemParam, TRUE); - if (EFI_ERROR (Status)) { - if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"set", ProblemParam); - FreePool (ProblemParam); - return (SHELL_INVALID_PARAMETER); - } else { - ASSERT (FALSE); - } - - return ShellStatus; - } + ShellStatus = SHELL_SUCCESS; // // check for "-?" @@ -161,6 +121,66 @@ ShellCommandRunSet ( } } + return ShellStatus; +} + +STATIC CONST SHELL_PARAM_ITEM SetParamList[] = { + { L"-d", TypeValue }, + { L"-v", TypeFlag }, + { NULL, TypeMax } +}; + +/** + Function for 'set' command. + + @param[in] ImageHandle Handle to the Image (NULL if Internal). + @param[in] SystemTable Pointer to the System Table (NULL if Internal). +**/ +SHELL_STATUS +EFIAPI +ShellCommandRunSet ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + SHELL_STATUS ShellStatus; + + ProblemParam = NULL; + ShellStatus = SHELL_SUCCESS; + + // + // initialize the shell lib (we must be in non-auto-init...) + // + Status = ShellInitialize (); + ASSERT_EFI_ERROR (Status); + + // + // Make sure globals are good... + // + Status = CommandInit (); + ASSERT_EFI_ERROR (Status); + + // + // parse the command line + // + Status = ShellCommandLineParse (SetParamList, &Package, &ProblemParam, TRUE); + if (EFI_ERROR (Status)) { + if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"set", ProblemParam); + FreePool (ProblemParam); + return (SHELL_INVALID_PARAMETER); + } else { + ASSERT (FALSE); + } + + return ShellStatus; + } + + ShellStatus = MainCmdSet (Package); + // // free the command line package // diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c index 761d88f9a30d..fa951210ce60 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c @@ -166,50 +166,22 @@ CheckAndSetDate ( return (SHELL_INVALID_PARAMETER); } -/** - Function for 'date' command. +/** Main function of the 'Date' command. - @param[in] ImageHandle Handle to the Image (NULL if Internal). - @param[in] SystemTable Pointer to the System Table (NULL if Internal). + @param[in] Package List of input parameter for the command. **/ +STATIC SHELL_STATUS -EFIAPI -ShellCommandRunDate ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +MainCmdDate ( + LIST_ENTRY *Package ) { EFI_STATUS Status; - LIST_ENTRY *Package; EFI_TIME TheTime; - CHAR16 *ProblemParam; SHELL_STATUS ShellStatus; CONST CHAR16 *Param1; - ShellStatus = SHELL_SUCCESS; - ProblemParam = NULL; - - // - // initialize the shell lib (we must be in non-auto-init...) - // - Status = ShellInitialize (); - ASSERT_EFI_ERROR (Status); - - // - // parse the command line - // - Status = ShellCommandLineParse (SfoParamList, &Package, &ProblemParam, TRUE); - if (EFI_ERROR (Status)) { - if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"date", ProblemParam); - FreePool (ProblemParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ASSERT (FALSE); - } - - return ShellStatus; - } + ShellStatus = SHELL_SUCCESS; // // check for "-?" @@ -271,6 +243,54 @@ ShellCommandRunDate ( } } + return ShellStatus; +} + +/** + Function for 'date' command. + + @param[in] ImageHandle Handle to the Image (NULL if Internal). + @param[in] SystemTable Pointer to the System Table (NULL if Internal). +**/ +SHELL_STATUS +EFIAPI +ShellCommandRunDate ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + SHELL_STATUS ShellStatus; + + ShellStatus = SHELL_SUCCESS; + ProblemParam = NULL; + + // + // initialize the shell lib (we must be in non-auto-init...) + // + Status = ShellInitialize (); + ASSERT_EFI_ERROR (Status); + + // + // parse the command line + // + Status = ShellCommandLineParse (SfoParamList, &Package, &ProblemParam, TRUE); + if (EFI_ERROR (Status)) { + if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"date", ProblemParam); + FreePool (ProblemParam); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ASSERT (FALSE); + } + + return ShellStatus; + } + + ShellStatus = MainCmdDate (Package); + // // free the command line package // @@ -400,62 +420,25 @@ CheckAndSetTime ( return (SHELL_INVALID_PARAMETER); } -/** - Function for 'time' command. +/** Main function of the 'Time' command. - @param[in] ImageHandle Handle to the Image (NULL if Internal). - @param[in] SystemTable Pointer to the System Table (NULL if Internal). + @param[in] Package List of input parameter for the command. **/ +STATIC SHELL_STATUS -EFIAPI -ShellCommandRunTime ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +MainCmdTime ( + LIST_ENTRY *Package ) { EFI_STATUS Status; - LIST_ENTRY *Package; EFI_TIME TheTime; - CHAR16 *ProblemParam; SHELL_STATUS ShellStatus; INT16 Tz; UINT8 Daylight; CONST CHAR16 *TempLocation; UINTN TzMinutes; - // - // Initialize variables - // - ShellStatus = SHELL_SUCCESS; - ProblemParam = NULL; - - // - // initialize the shell lib (we must be in non-auto-init...) - // - Status = ShellInitialize (); - ASSERT_EFI_ERROR (Status); - - // - // parse the command line - // - if (PcdGet8 (PcdShellSupportLevel) == 2) { - Status = ShellCommandLineParseEx (TimeParamList2, &Package, &ProblemParam, TRUE, TRUE); - } else { - ASSERT (PcdGet8 (PcdShellSupportLevel) == 3); - Status = ShellCommandLineParseEx (TimeParamList3, &Package, &ProblemParam, TRUE, TRUE); - } - - if (EFI_ERROR (Status)) { - if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"time", ProblemParam); - FreePool (ProblemParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ASSERT (FALSE); - } - - return ShellStatus; - } + ShellStatus = SHELL_SUCCESS; // // check for "-?" @@ -631,6 +614,63 @@ ShellCommandRunTime ( } } + return ShellStatus; +} + +/** + Function for 'time' command. + + @param[in] ImageHandle Handle to the Image (NULL if Internal). + @param[in] SystemTable Pointer to the System Table (NULL if Internal). +**/ +SHELL_STATUS +EFIAPI +ShellCommandRunTime ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + SHELL_STATUS ShellStatus; + + // + // Initialize variables + // + ShellStatus = SHELL_SUCCESS; + ProblemParam = NULL; + + // + // initialize the shell lib (we must be in non-auto-init...) + // + Status = ShellInitialize (); + ASSERT_EFI_ERROR (Status); + + // + // parse the command line + // + if (PcdGet8 (PcdShellSupportLevel) == 2) { + Status = ShellCommandLineParseEx (TimeParamList2, &Package, &ProblemParam, TRUE, TRUE); + } else { + ASSERT (PcdGet8 (PcdShellSupportLevel) == 3); + Status = ShellCommandLineParseEx (TimeParamList3, &Package, &ProblemParam, TRUE, TRUE); + } + + if (EFI_ERROR (Status)) { + if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"time", ProblemParam); + FreePool (ProblemParam); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ASSERT (FALSE); + } + + return ShellStatus; + } + + ShellStatus = MainCmdTime (Package); + // // free the command line package // @@ -802,61 +842,24 @@ CheckAndSetTimeZone ( return (SHELL_INVALID_PARAMETER); } -/** - Function for 'timezone' command. +/** Main function of the 'TimeZone' command. - @param[in] ImageHandle Handle to the Image (NULL if Internal). - @param[in] SystemTable Pointer to the System Table (NULL if Internal). + @param[in] Package List of input parameter for the command. **/ +STATIC SHELL_STATUS -EFIAPI -ShellCommandRunTimeZone ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +MainCmdTimeZone ( + LIST_ENTRY *Package ) { - // - // non interactive - // EFI_STATUS Status; - LIST_ENTRY *Package; - CHAR16 *ProblemParam; SHELL_STATUS ShellStatus; UINT8 LoopVar; EFI_TIME TheTime; BOOLEAN Found; UINTN TzMinutes; - ShellStatus = SHELL_SUCCESS; - ProblemParam = NULL; - - // - // initialize the shell lib (we must be in non-auto-init...) - // - Status = ShellInitialize (); - ASSERT_EFI_ERROR (Status); - - // - // parse the command line - // - if (PcdGet8 (PcdShellSupportLevel) == 2) { - Status = ShellCommandLineParse (TimeZoneParamList2, &Package, &ProblemParam, TRUE); - } else { - ASSERT (PcdGet8 (PcdShellSupportLevel) == 3); - Status = ShellCommandLineParseEx (TimeZoneParamList3, &Package, &ProblemParam, TRUE, TRUE); - } - - if (EFI_ERROR (Status)) { - if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"timezone", ProblemParam); - FreePool (ProblemParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ASSERT (FALSE); - } - - return ShellStatus; - } + ShellStatus = SHELL_SUCCESS; // // check for "-?" @@ -985,6 +988,63 @@ ShellCommandRunTimeZone ( } } + return ShellStatus; +} + +/** + Function for 'timezone' command. + + @param[in] ImageHandle Handle to the Image (NULL if Internal). + @param[in] SystemTable Pointer to the System Table (NULL if Internal). +**/ +SHELL_STATUS +EFIAPI +ShellCommandRunTimeZone ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + // + // non interactive + // + EFI_STATUS Status; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + SHELL_STATUS ShellStatus; + + ShellStatus = SHELL_SUCCESS; + ProblemParam = NULL; + + // + // initialize the shell lib (we must be in non-auto-init...) + // + Status = ShellInitialize (); + ASSERT_EFI_ERROR (Status); + + // + // parse the command line + // + if (PcdGet8 (PcdShellSupportLevel) == 2) { + Status = ShellCommandLineParse (TimeZoneParamList2, &Package, &ProblemParam, TRUE); + } else { + ASSERT (PcdGet8 (PcdShellSupportLevel) == 3); + Status = ShellCommandLineParseEx (TimeZoneParamList3, &Package, &ProblemParam, TRUE, TRUE); + } + + if (EFI_ERROR (Status)) { + if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"timezone", ProblemParam); + FreePool (ProblemParam); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ASSERT (FALSE); + } + + return ShellStatus; + } + + ShellStatus = MainCmdTimeZone (Package); + // // free the command line package // diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c index c2d61f1964e4..eb44ef578df2 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c @@ -198,28 +198,16 @@ HandleVol ( return (ShellStatus); } -STATIC CONST SHELL_PARAM_ITEM ParamList[] = { - { L"-d", TypeFlag }, - { L"-n", TypeValue }, - { NULL, TypeMax } -}; - -/** - Function for 'Vol' command. +/** Main function of the 'Vol' command. - @param[in] ImageHandle Handle to the Image (NULL if Internal). - @param[in] SystemTable Pointer to the System Table (NULL if Internal). + @param[in] Package List of input parameter for the command. **/ +STATIC SHELL_STATUS -EFIAPI -ShellCommandRunVol ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +MainCmdVol ( + LIST_ENTRY *Package ) { - EFI_STATUS Status; - LIST_ENTRY *Package; - CHAR16 *ProblemParam; SHELL_STATUS ShellStatus; CONST CHAR16 *PathName; CONST CHAR16 *CurDir; @@ -229,40 +217,11 @@ ShellCommandRunVol ( UINTN Length; CONST CHAR16 *NewName; - Length = 0; - ProblemParam = NULL; - ShellStatus = SHELL_SUCCESS; - PathName = NULL; - CurDir = NULL; - FullPath = NULL; - - // - // initialize the shell lib (we must be in non-auto-init...) - // - Status = ShellInitialize (); - ASSERT_EFI_ERROR (Status); - - // - // Fix local copies of the protocol pointers - // - Status = CommandInit (); - ASSERT_EFI_ERROR (Status); - - // - // parse the command line - // - Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); - if (EFI_ERROR (Status)) { - if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"vol", ProblemParam); - FreePool (ProblemParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ASSERT (FALSE); - } - - return ShellStatus; - } + Length = 0; + ShellStatus = SHELL_SUCCESS; + PathName = NULL; + CurDir = NULL; + FullPath = NULL; // // check for "-?" @@ -322,6 +281,66 @@ ShellCommandRunVol ( SHELL_FREE_NON_NULL (FullPath); + return ShellStatus; +} + +STATIC CONST SHELL_PARAM_ITEM ParamList[] = { + { L"-d", TypeFlag }, + { L"-n", TypeValue }, + { NULL, TypeMax } +}; + +/** + Function for 'Vol' command. + + @param[in] ImageHandle Handle to the Image (NULL if Internal). + @param[in] SystemTable Pointer to the System Table (NULL if Internal). +**/ +SHELL_STATUS +EFIAPI +ShellCommandRunVol ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + SHELL_STATUS ShellStatus; + + ProblemParam = NULL; + ShellStatus = SHELL_SUCCESS; + + // + // initialize the shell lib (we must be in non-auto-init...) + // + Status = ShellInitialize (); + ASSERT_EFI_ERROR (Status); + + // + // Fix local copies of the protocol pointers + // + Status = CommandInit (); + ASSERT_EFI_ERROR (Status); + + // + // parse the command line + // + Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); + if (EFI_ERROR (Status)) { + if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"vol", ProblemParam); + FreePool (ProblemParam); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ASSERT (FALSE); + } + + return ShellStatus; + } + + ShellStatus = MainCmdVol (Package); + // // free the command line package // From 5b1530e5adb3b24224a9a3a92b1dab6395d2dc58 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Thu, 27 Nov 2025 21:28:22 +0100 Subject: [PATCH 0857/1172] ShellPkg/UefiShellLevel2: Lower indentation level in MainCmdXXX() This patch aims to help breaking down the long function present in the ShellPkg and reduce complexity/nested code and conditions. Lower the indentation level in the newly created MainCmdXXX() functions. No functional change should be induced by this patch. Signed-off-by: Pierre Gondois --- .../UefiShellLevel2CommandsLib/Attrib.c | 311 +++++------ .../Library/UefiShellLevel2CommandsLib/Cd.c | 157 +++--- .../Library/UefiShellLevel2CommandsLib/Load.c | 65 +-- .../Library/UefiShellLevel2CommandsLib/Ls.c | 262 ++++----- .../Library/UefiShellLevel2CommandsLib/Map.c | 335 ++++++------ .../UefiShellLevel2CommandsLib/MkDir.c | 138 +++-- .../UefiShellLevel2CommandsLib/Parse.c | 52 +- .../UefiShellLevel2CommandsLib/Reset.c | 133 ++--- .../Library/UefiShellLevel2CommandsLib/Rm.c | 96 ++-- .../Library/UefiShellLevel2CommandsLib/Set.c | 57 +- .../UefiShellLevel2CommandsLib/TimeDate.c | 509 +++++++++--------- 11 files changed, 1062 insertions(+), 1053 deletions(-) diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Attrib.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Attrib.c index cb69b183bc59..0a7b36c86e6c 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Attrib.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Attrib.c @@ -51,176 +51,162 @@ MainCmdAttrib ( // if (ShellCommandLineGetFlag (Package, L"-?")) { ASSERT (FALSE); - } else { - FileAttributesToAdd = 0; - FileAttributesToRemove = 0; + return ShellStatus; + } - // - // apply or remove each flag - // - if (ShellCommandLineGetFlag (Package, L"+a")) { - FileAttributesToAdd |= EFI_FILE_ARCHIVE; - } + FileAttributesToAdd = 0; + FileAttributesToRemove = 0; - if (ShellCommandLineGetFlag (Package, L"-a")) { - FileAttributesToRemove |= EFI_FILE_ARCHIVE; - } + // + // apply or remove each flag + // + if (ShellCommandLineGetFlag (Package, L"+a")) { + FileAttributesToAdd |= EFI_FILE_ARCHIVE; + } - if (ShellCommandLineGetFlag (Package, L"+s")) { - FileAttributesToAdd |= EFI_FILE_SYSTEM; - } + if (ShellCommandLineGetFlag (Package, L"-a")) { + FileAttributesToRemove |= EFI_FILE_ARCHIVE; + } - if (ShellCommandLineGetFlag (Package, L"-s")) { - FileAttributesToRemove |= EFI_FILE_SYSTEM; - } + if (ShellCommandLineGetFlag (Package, L"+s")) { + FileAttributesToAdd |= EFI_FILE_SYSTEM; + } - if (ShellCommandLineGetFlag (Package, L"+h")) { - FileAttributesToAdd |= EFI_FILE_HIDDEN; - } + if (ShellCommandLineGetFlag (Package, L"-s")) { + FileAttributesToRemove |= EFI_FILE_SYSTEM; + } - if (ShellCommandLineGetFlag (Package, L"-h")) { - FileAttributesToRemove |= EFI_FILE_HIDDEN; - } + if (ShellCommandLineGetFlag (Package, L"+h")) { + FileAttributesToAdd |= EFI_FILE_HIDDEN; + } - if (ShellCommandLineGetFlag (Package, L"+r")) { - FileAttributesToAdd |= EFI_FILE_READ_ONLY; - } + if (ShellCommandLineGetFlag (Package, L"-h")) { + FileAttributesToRemove |= EFI_FILE_HIDDEN; + } - if (ShellCommandLineGetFlag (Package, L"-r")) { - FileAttributesToRemove |= EFI_FILE_READ_ONLY; - } + if (ShellCommandLineGetFlag (Package, L"+r")) { + FileAttributesToAdd |= EFI_FILE_READ_ONLY; + } - if ((FileAttributesToRemove == 0) && (FileAttributesToAdd == 0)) { - // - // Do display as we have no attributes to change - // - for ( ParamNumberCount = 1 - ; - ; ParamNumberCount++ - ) - { - FileName = ShellCommandLineGetRawValue (Package, ParamNumberCount); - // if we dont have anything left, move on... - if ((FileName == NULL) && (ParamNumberCount == 1)) { - FileName = (CHAR16 *)AllFiles; - } else if (FileName == NULL) { - break; + if (ShellCommandLineGetFlag (Package, L"-r")) { + FileAttributesToRemove |= EFI_FILE_READ_ONLY; + } + + if ((FileAttributesToRemove == 0) && (FileAttributesToAdd == 0)) { + // + // Do display as we have no attributes to change + // + for ( ParamNumberCount = 1 + ; + ; ParamNumberCount++ + ) + { + FileName = ShellCommandLineGetRawValue (Package, ParamNumberCount); + // if we dont have anything left, move on... + if ((FileName == NULL) && (ParamNumberCount == 1)) { + FileName = (CHAR16 *)AllFiles; + } else if (FileName == NULL) { + break; + } + + ASSERT (ListOfFiles == NULL); + Status = ShellOpenFileMetaArg ((CHAR16 *)FileName, EFI_FILE_MODE_READ, &ListOfFiles); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); + ShellStatus = SHELL_NOT_FOUND; + } else { + for (FileNode = (EFI_SHELL_FILE_INFO *)GetFirstNode (&ListOfFiles->Link) + ; !IsNull (&ListOfFiles->Link, &FileNode->Link) + ; FileNode = (EFI_SHELL_FILE_INFO *)GetNextNode (&ListOfFiles->Link, &FileNode->Link) + ) + { + ShellPrintHiiDefaultEx ( + STRING_TOKEN (STR_ATTRIB_OUTPUT_LINE), + gShellLevel2HiiHandle, + FileNode->Info->Attribute&EFI_FILE_DIRECTORY ? L'D' : L' ', + FileNode->Info->Attribute&EFI_FILE_ARCHIVE ? L'A' : L' ', + FileNode->Info->Attribute&EFI_FILE_SYSTEM ? L'S' : L' ', + FileNode->Info->Attribute&EFI_FILE_HIDDEN ? L'H' : L' ', + FileNode->Info->Attribute&EFI_FILE_READ_ONLY ? L'R' : L' ', + FileNode->FileName + ); + + if (ShellGetExecutionBreakFlag ()) { + ShellStatus = SHELL_ABORTED; + break; + } } - ASSERT (ListOfFiles == NULL); - Status = ShellOpenFileMetaArg ((CHAR16 *)FileName, EFI_FILE_MODE_READ, &ListOfFiles); + Status = ShellCloseFileMetaArg (&ListOfFiles); + ListOfFiles = NULL; if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); ShellStatus = SHELL_NOT_FOUND; - } else { - for (FileNode = (EFI_SHELL_FILE_INFO *)GetFirstNode (&ListOfFiles->Link) - ; !IsNull (&ListOfFiles->Link, &FileNode->Link) - ; FileNode = (EFI_SHELL_FILE_INFO *)GetNextNode (&ListOfFiles->Link, &FileNode->Link) - ) - { - ShellPrintHiiDefaultEx ( - STRING_TOKEN (STR_ATTRIB_OUTPUT_LINE), - gShellLevel2HiiHandle, - FileNode->Info->Attribute&EFI_FILE_DIRECTORY ? L'D' : L' ', - FileNode->Info->Attribute&EFI_FILE_ARCHIVE ? L'A' : L' ', - FileNode->Info->Attribute&EFI_FILE_SYSTEM ? L'S' : L' ', - FileNode->Info->Attribute&EFI_FILE_HIDDEN ? L'H' : L' ', - FileNode->Info->Attribute&EFI_FILE_READ_ONLY ? L'R' : L' ', - FileNode->FileName - ); - - if (ShellGetExecutionBreakFlag ()) { - ShellStatus = SHELL_ABORTED; - break; - } - } + } + } // for loop for handling wildcard filenames + } // for loop for printing out the info + } else if ((FileAttributesToRemove & FileAttributesToAdd) != 0) { + // + // fail as we have conflcting params. + // + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle, L"attrib"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + // + // enumerate through all the files/directories and apply the attributes + // + for ( ParamNumberCount = 1 + ; + ; ParamNumberCount++ + ) + { + FileName = ShellCommandLineGetRawValue (Package, ParamNumberCount); + // if we dont have anything left, move on... + if (FileName == NULL) { + // + // make sure we are not failing on the first one we do... if yes that's an error... + // + if (ParamNumberCount == 1) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"attrib"); + ShellStatus = SHELL_INVALID_PARAMETER; + } + + break; + } - Status = ShellCloseFileMetaArg (&ListOfFiles); - ListOfFiles = NULL; - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); - ShellStatus = SHELL_NOT_FOUND; - } - } // for loop for handling wildcard filenames - } // for loop for printing out the info - } else if ((FileAttributesToRemove & FileAttributesToAdd) != 0) { // - // fail as we have conflcting params. + // OpenFileByName / GetFileInfo / Change attributes / SetFileInfo / CloseFile / free memory + // for each file or directory on the line. // - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle, L"attrib"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { + // - // enumerate through all the files/directories and apply the attributes + // Open the file(s) // - for ( ParamNumberCount = 1 - ; - ; ParamNumberCount++ - ) - { - FileName = ShellCommandLineGetRawValue (Package, ParamNumberCount); - // if we dont have anything left, move on... - if (FileName == NULL) { + ASSERT (ListOfFiles == NULL); + Status = ShellOpenFileMetaArg ((CHAR16 *)FileName, EFI_FILE_MODE_READ, &ListOfFiles); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); + ShellStatus = SHELL_NOT_FOUND; + } else { + for (FileNode = (EFI_SHELL_FILE_INFO *)GetFirstNode (&ListOfFiles->Link) + ; !IsNull (&ListOfFiles->Link, &FileNode->Link) + ; FileNode = (EFI_SHELL_FILE_INFO *)GetNextNode (&ListOfFiles->Link, &FileNode->Link) + ) + { // - // make sure we are not failing on the first one we do... if yes that's an error... + // skip the directory traversing stuff... // - if (ParamNumberCount == 1) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"attrib"); - ShellStatus = SHELL_INVALID_PARAMETER; + if ((StrCmp (FileNode->FileName, L".") == 0) || (StrCmp (FileNode->FileName, L"..") == 0)) { + continue; } - break; - } - - // - // OpenFileByName / GetFileInfo / Change attributes / SetFileInfo / CloseFile / free memory - // for each file or directory on the line. - // - - // - // Open the file(s) - // - ASSERT (ListOfFiles == NULL); - Status = ShellOpenFileMetaArg ((CHAR16 *)FileName, EFI_FILE_MODE_READ, &ListOfFiles); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); - ShellStatus = SHELL_NOT_FOUND; - } else { - for (FileNode = (EFI_SHELL_FILE_INFO *)GetFirstNode (&ListOfFiles->Link) - ; !IsNull (&ListOfFiles->Link, &FileNode->Link) - ; FileNode = (EFI_SHELL_FILE_INFO *)GetNextNode (&ListOfFiles->Link, &FileNode->Link) - ) - { - // - // skip the directory traversing stuff... - // - if ((StrCmp (FileNode->FileName, L".") == 0) || (StrCmp (FileNode->FileName, L"..") == 0)) { - continue; - } - - FileInfo = gEfiShellProtocol->GetFileInfo (FileNode->Handle); - - // - // if we are removing Read-Only we need to do that alone - // - if ((FileAttributesToRemove & EFI_FILE_READ_ONLY) == EFI_FILE_READ_ONLY) { - FileInfo->Attribute &= ~EFI_FILE_READ_ONLY; - // - // SetFileInfo - // - Status = ShellSetFileInfo (FileNode->Handle, FileInfo); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); - ShellStatus = SHELL_ACCESS_DENIED; - } - } - - // - // change the attribute - // - FileInfo->Attribute &= ~FileAttributesToRemove; - FileInfo->Attribute |= FileAttributesToAdd; + FileInfo = gEfiShellProtocol->GetFileInfo (FileNode->Handle); + // + // if we are removing Read-Only we need to do that alone + // + if ((FileAttributesToRemove & EFI_FILE_READ_ONLY) == EFI_FILE_READ_ONLY) { + FileInfo->Attribute &= ~EFI_FILE_READ_ONLY; // // SetFileInfo // @@ -229,18 +215,33 @@ MainCmdAttrib ( ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); ShellStatus = SHELL_ACCESS_DENIED; } - - SHELL_FREE_NON_NULL (FileInfo); } - Status = ShellCloseFileMetaArg (&ListOfFiles); - ListOfFiles = NULL; + // + // change the attribute + // + FileInfo->Attribute &= ~FileAttributesToRemove; + FileInfo->Attribute |= FileAttributesToAdd; + + // + // SetFileInfo + // + Status = ShellSetFileInfo (FileNode->Handle, FileInfo); if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); - ShellStatus = SHELL_NOT_FOUND; + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); + ShellStatus = SHELL_ACCESS_DENIED; } - } // for loop for handling wildcard filenames - } + + SHELL_FREE_NON_NULL (FileInfo); + } + + Status = ShellCloseFileMetaArg (&ListOfFiles); + ListOfFiles = NULL; + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount)); + ShellStatus = SHELL_NOT_FOUND; + } + } // for loop for handling wildcard filenames } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c index 0960e06b5b20..ff3ea8d5edab 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Cd.c @@ -197,115 +197,116 @@ MainCmdCd ( // if (ShellCommandLineGetFlag (Package, L"-?")) { ASSERT (FALSE); + return ShellStatus; } else if (ShellCommandLineGetRawValue (Package, 2) != NULL) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"cd"); - ShellStatus = SHELL_INVALID_PARAMETER; + return SHELL_INVALID_PARAMETER; + } + + // + // remember that param 0 is the command name + // If there are 0 value parameters, then print the current directory + // else If there are 2 value parameters, then print the error message + // else If there is 1 value paramerer , then change the directory + // + Cwd = ShellGetCurrentDir (NULL); + if (Cwd == NULL) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"cd"); + ShellStatus = SHELL_NOT_FOUND; } else { - // - // remember that param 0 is the command name - // If there are 0 value parameters, then print the current directory - // else If there are 2 value parameters, then print the error message - // else If there is 1 value paramerer , then change the directory - // - Cwd = ShellGetCurrentDir (NULL); - if (Cwd == NULL) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"cd"); - ShellStatus = SHELL_NOT_FOUND; + Param1 = ShellCommandLineGetRawValue (Package, 1); + if (Param1 == NULL) { + // + // display the current directory + // + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_CD_PRINT), gShellLevel2HiiHandle, Cwd); } else { - Param1 = ShellCommandLineGetRawValue (Package, 1); - if (Param1 == NULL) { + Param1Copy = CatSPrint (NULL, L"%s", Param1, NULL); + for (Walker = Param1Copy; Walker != NULL && *Walker != CHAR_NULL; Walker++) { + if (*Walker == L'\"') { + CopyMem (Walker, Walker + 1, StrSize (Walker) - sizeof (Walker[0])); + } + } + + if ((Param1Copy != NULL) && IsCurrentFileSystem (Param1Copy, Cwd)) { + Status = ReplaceDriveWithCwd (&Param1Copy, Cwd); + } else { // - // display the current directory + // Can't use cd command to change filesystem. // - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_CD_PRINT), gShellLevel2HiiHandle, Cwd); - } else { - Param1Copy = CatSPrint (NULL, L"%s", Param1, NULL); - for (Walker = Param1Copy; Walker != NULL && *Walker != CHAR_NULL; Walker++) { - if (*Walker == L'\"') { - CopyMem (Walker, Walker + 1, StrSize (Walker) - sizeof (Walker[0])); - } - } + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_CD_NF), gShellLevel2HiiHandle, L"cd"); + Status = EFI_NOT_FOUND; + } - if ((Param1Copy != NULL) && IsCurrentFileSystem (Param1Copy, Cwd)) { - Status = ReplaceDriveWithCwd (&Param1Copy, Cwd); - } else { + if (!EFI_ERROR (Status) && (Param1Copy != NULL)) { + Splitter = StrStr (Cwd, L":"); + if (Param1Copy[0] == L'\\') { // - // Can't use cd command to change filesystem. + // Absolute Path on current drive letter. // - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_CD_NF), gShellLevel2HiiHandle, L"cd"); - Status = EFI_NOT_FOUND; - } + TotalSize = ((Splitter - Cwd + 1) * sizeof (CHAR16)) + StrSize (Param1Copy); + TempBuffer = AllocateZeroPool (TotalSize); + if (TempBuffer == NULL) { + Status = EFI_OUT_OF_RESOURCES; + } else { + StrnCpyS (TempBuffer, TotalSize / sizeof (CHAR16), Cwd, (Splitter - Cwd + 1)); + StrCatS (TempBuffer, TotalSize / sizeof (CHAR16), Param1Copy); - if (!EFI_ERROR (Status) && (Param1Copy != NULL)) { - Splitter = StrStr (Cwd, L":"); - if (Param1Copy[0] == L'\\') { - // - // Absolute Path on current drive letter. - // - TotalSize = ((Splitter - Cwd + 1) * sizeof (CHAR16)) + StrSize (Param1Copy); + FreePool (Param1Copy); + Param1Copy = TempBuffer; + TempBuffer = NULL; + } + } else { + if (StrStr (Param1Copy, L":") == NULL) { + TotalSize = StrSize (Cwd) + StrSize (Param1Copy); TempBuffer = AllocateZeroPool (TotalSize); if (TempBuffer == NULL) { Status = EFI_OUT_OF_RESOURCES; } else { - StrnCpyS (TempBuffer, TotalSize / sizeof (CHAR16), Cwd, (Splitter - Cwd + 1)); + StrCpyS (TempBuffer, TotalSize / sizeof (CHAR16), Cwd); + StrCatS (TempBuffer, TotalSize / sizeof (CHAR16), L"\\"); StrCatS (TempBuffer, TotalSize / sizeof (CHAR16), Param1Copy); FreePool (Param1Copy); Param1Copy = TempBuffer; TempBuffer = NULL; } - } else { - if (StrStr (Param1Copy, L":") == NULL) { - TotalSize = StrSize (Cwd) + StrSize (Param1Copy); - TempBuffer = AllocateZeroPool (TotalSize); - if (TempBuffer == NULL) { - Status = EFI_OUT_OF_RESOURCES; - } else { - StrCpyS (TempBuffer, TotalSize / sizeof (CHAR16), Cwd); - StrCatS (TempBuffer, TotalSize / sizeof (CHAR16), L"\\"); - StrCatS (TempBuffer, TotalSize / sizeof (CHAR16), Param1Copy); - - FreePool (Param1Copy); - Param1Copy = TempBuffer; - TempBuffer = NULL; - } - } } } + } - if (!EFI_ERROR (Status)) { - Param1Copy = PathCleanUpDirectories (Param1Copy); - if (Param1Copy == NULL) { - Status = EFI_NOT_FOUND; - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Status = ExtractDriveAndPath (Param1Copy, &Drive, &Path); - } + if (!EFI_ERROR (Status)) { + Param1Copy = PathCleanUpDirectories (Param1Copy); + if (Param1Copy == NULL) { + Status = EFI_NOT_FOUND; + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + Status = ExtractDriveAndPath (Param1Copy, &Drive, &Path); } + } - if (!EFI_ERROR (Status) && (Drive != NULL) && (Path != NULL)) { - if (EFI_ERROR (ShellIsDirectory (Param1Copy))) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NOT_DIR), gShellLevel2HiiHandle, L"cd", Param1Copy); + if (!EFI_ERROR (Status) && (Drive != NULL) && (Path != NULL)) { + if (EFI_ERROR (ShellIsDirectory (Param1Copy))) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NOT_DIR), gShellLevel2HiiHandle, L"cd", Param1Copy); + ShellStatus = SHELL_NOT_FOUND; + } else { + Status = gEfiShellProtocol->SetCurDir (Drive, Path + 1); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_DIR_NF), gShellLevel2HiiHandle, L"cd", Param1Copy); ShellStatus = SHELL_NOT_FOUND; - } else { - Status = gEfiShellProtocol->SetCurDir (Drive, Path + 1); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_DIR_NF), gShellLevel2HiiHandle, L"cd", Param1Copy); - ShellStatus = SHELL_NOT_FOUND; - } } } + } - if (Drive != NULL) { - FreePool (Drive); - } - - if (Path != NULL) { - FreePool (Path); - } + if (Drive != NULL) { + FreePool (Drive); + } - FreePool (Param1Copy); + if (Path != NULL) { + FreePool (Path); } + + FreePool (Param1Copy); } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c index aa7e54a8b425..ce6548e6110c 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Load.c @@ -203,49 +203,50 @@ MainCmdLoad ( // if (ShellCommandLineGetFlag (Package, L"-?")) { ASSERT (FALSE); + return ShellStatus; } else if (ShellCommandLineGetRawValue (Package, 1) == NULL) { // // we didnt get a single file to load parameter // ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"load"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - for ( ParamCount = 1 - ; ShellCommandLineGetRawValue (Package, ParamCount) != NULL - ; ParamCount++ - ) - { - Status = ShellOpenFileMetaArg ((CHAR16 *)ShellCommandLineGetRawValue (Package, ParamCount), EFI_FILE_MODE_READ, &ListHead); - if (!EFI_ERROR (Status)) { - for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode (&ListHead->Link) - ; !IsNull (&ListHead->Link, &Node->Link) - ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode (&ListHead->Link, &Node->Link) - ) - { - // - // once we have an error preserve that value, but finish the loop. - // - if (EFI_ERROR (Status)) { - LoadDriver (Node->FullName, (BOOLEAN)(ShellCommandLineGetFlag (Package, L"-nc") == FALSE)); - } else { - Status = LoadDriver (Node->FullName, (BOOLEAN)(ShellCommandLineGetFlag (Package, L"-nc") == FALSE)); - } - } // for loop for multi-open + return SHELL_INVALID_PARAMETER; + } + for ( ParamCount = 1 + ; ShellCommandLineGetRawValue (Package, ParamCount) != NULL + ; ParamCount++ + ) + { + Status = ShellOpenFileMetaArg ((CHAR16 *)ShellCommandLineGetRawValue (Package, ParamCount), EFI_FILE_MODE_READ, &ListHead); + if (!EFI_ERROR (Status)) { + for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode (&ListHead->Link) + ; !IsNull (&ListHead->Link, &Node->Link) + ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode (&ListHead->Link, &Node->Link) + ) + { + // + // once we have an error preserve that value, but finish the loop. + // if (EFI_ERROR (Status)) { - ShellCloseFileMetaArg (&ListHead); + LoadDriver (Node->FullName, (BOOLEAN)(ShellCommandLineGetFlag (Package, L"-nc") == FALSE)); } else { - Status = ShellCloseFileMetaArg (&ListHead); + Status = LoadDriver (Node->FullName, (BOOLEAN)(ShellCommandLineGetFlag (Package, L"-nc") == FALSE)); } + } // for loop for multi-open + + if (EFI_ERROR (Status)) { + ShellCloseFileMetaArg (&ListHead); } else { - // - // no files found. - // - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"load", (CHAR16 *)ShellCommandLineGetRawValue (Package, ParamCount)); - ShellStatus = SHELL_NOT_FOUND; + Status = ShellCloseFileMetaArg (&ListHead); } - } // for loop for params - } + } else { + // + // no files found. + // + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"load", (CHAR16 *)ShellCommandLineGetRawValue (Package, ParamCount)); + ShellStatus = SHELL_NOT_FOUND; + } + } // for loop for params return ShellStatus; } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c index 423bbcec2c89..bae7d5a10d40 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c @@ -737,161 +737,161 @@ MainCmdLs ( if (ShellCommandLineGetCount (Package) > 2) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"ls"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { + return SHELL_INVALID_PARAMETER; + } + + // + // check for -a + // + if (ShellCommandLineGetFlag (Package, L"-a")) { + for ( Attribs = ShellCommandLineGetValue (Package, L"-a") + ; Attribs != NULL && *Attribs != CHAR_NULL && ShellStatus == SHELL_SUCCESS + ; Attribs++ + ) + { + switch (*Attribs) { + case L'a': + case L'A': + RequiredAttributes |= EFI_FILE_ARCHIVE; + Count++; + continue; + case L's': + case L'S': + RequiredAttributes |= EFI_FILE_SYSTEM; + Count++; + continue; + case L'h': + case L'H': + RequiredAttributes |= EFI_FILE_HIDDEN; + Count++; + continue; + case L'r': + case L'R': + RequiredAttributes |= EFI_FILE_READ_ONLY; + Count++; + continue; + case L'd': + case L'D': + RequiredAttributes |= EFI_FILE_DIRECTORY; + Count++; + continue; + default: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ATTRIBUTE), gShellLevel2HiiHandle, L"ls", ShellCommandLineGetValue (Package, L"-a")); + ShellStatus = SHELL_INVALID_PARAMETER; + break; + } // switch + } // for loop + // - // check for -a + // if nothing is specified all are specified // - if (ShellCommandLineGetFlag (Package, L"-a")) { - for ( Attribs = ShellCommandLineGetValue (Package, L"-a") - ; Attribs != NULL && *Attribs != CHAR_NULL && ShellStatus == SHELL_SUCCESS - ; Attribs++ - ) - { - switch (*Attribs) { - case L'a': - case L'A': - RequiredAttributes |= EFI_FILE_ARCHIVE; - Count++; - continue; - case L's': - case L'S': - RequiredAttributes |= EFI_FILE_SYSTEM; - Count++; - continue; - case L'h': - case L'H': - RequiredAttributes |= EFI_FILE_HIDDEN; - Count++; - continue; - case L'r': - case L'R': - RequiredAttributes |= EFI_FILE_READ_ONLY; - Count++; - continue; - case L'd': - case L'D': - RequiredAttributes |= EFI_FILE_DIRECTORY; - Count++; - continue; - default: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ATTRIBUTE), gShellLevel2HiiHandle, L"ls", ShellCommandLineGetValue (Package, L"-a")); - ShellStatus = SHELL_INVALID_PARAMETER; - break; - } // switch - } // for loop + if (RequiredAttributes == 0) { + RequiredAttributes = EFI_FILE_VALID_ATTR; + } + } // if -a present + if (ShellStatus == SHELL_SUCCESS) { + PathName = ShellCommandLineGetRawValue (Package, 1); + if (PathName == NULL) { // - // if nothing is specified all are specified + // Nothing specified... must start from current directory // - if (RequiredAttributes == 0) { - RequiredAttributes = EFI_FILE_VALID_ATTR; + CurDir = gEfiShellProtocol->GetCurDir (NULL); + if (CurDir == NULL) { + ShellStatus = SHELL_NOT_FOUND; + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"ls"); } - } // if -a present - if (ShellStatus == SHELL_SUCCESS) { - PathName = ShellCommandLineGetRawValue (Package, 1); - if (PathName == NULL) { + ListUnfiltered = TRUE; + // + // Copy to the 2 strings for starting path and file search string + // + ASSERT (SearchString == NULL); + ASSERT (FullPath == NULL); + StrnCatGrow (&SearchString, NULL, L"*", 0); + StrnCatGrow (&FullPath, NULL, CurDir, 0); + Size = FullPath != NULL ? StrSize (FullPath) : 0; + StrnCatGrow (&FullPath, &Size, L"\\", 0); + } else { + if ((StrStr (PathName, L":") == NULL) && (gEfiShellProtocol->GetCurDir (NULL) == NULL)) { // - // Nothing specified... must start from current directory + // If we got something and it doesnt have a fully qualified path, then we needed to have a CWD. // - CurDir = gEfiShellProtocol->GetCurDir (NULL); - if (CurDir == NULL) { - ShellStatus = SHELL_NOT_FOUND; - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"ls"); - } - - ListUnfiltered = TRUE; + ShellStatus = SHELL_NOT_FOUND; + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"ls"); + } else { // - // Copy to the 2 strings for starting path and file search string + // We got a valid fully qualified path or we have a CWD // - ASSERT (SearchString == NULL); - ASSERT (FullPath == NULL); - StrnCatGrow (&SearchString, NULL, L"*", 0); - StrnCatGrow (&FullPath, NULL, CurDir, 0); - Size = FullPath != NULL ? StrSize (FullPath) : 0; - StrnCatGrow (&FullPath, &Size, L"\\", 0); - } else { - if ((StrStr (PathName, L":") == NULL) && (gEfiShellProtocol->GetCurDir (NULL) == NULL)) { + ASSERT ((FullPath == NULL && Size == 0) || (FullPath != NULL)); + if (StrStr (PathName, L":") == NULL) { + StrnCatGrow (&FullPath, &Size, gEfiShellProtocol->GetCurDir (NULL), 0); + if (FullPath == NULL) { + ShellCommandLineFreeVarList (Package); + return SHELL_OUT_OF_RESOURCES; + } + + Size = FullPath != NULL ? StrSize (FullPath) : 0; + StrnCatGrow (&FullPath, &Size, L"\\", 0); + } + + StrnCatGrow (&FullPath, &Size, PathName, 0); + if (FullPath == NULL) { + ShellCommandLineFreeVarList (Package); + return SHELL_OUT_OF_RESOURCES; + } + + if (ShellIsDirectory (PathName) == EFI_SUCCESS) { // - // If we got something and it doesnt have a fully qualified path, then we needed to have a CWD. + // is listing ends with a directory, then we list all files in that directory // - ShellStatus = SHELL_NOT_FOUND; - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"ls"); + ListUnfiltered = TRUE; + StrnCatGrow (&SearchString, NULL, L"*", 0); } else { // - // We got a valid fully qualified path or we have a CWD + // must split off the search part that applies to files from the end of the directory part // - ASSERT ((FullPath == NULL && Size == 0) || (FullPath != NULL)); - if (StrStr (PathName, L":") == NULL) { - StrnCatGrow (&FullPath, &Size, gEfiShellProtocol->GetCurDir (NULL), 0); - if (FullPath == NULL) { - ShellCommandLineFreeVarList (Package); - return SHELL_OUT_OF_RESOURCES; - } - - Size = FullPath != NULL ? StrSize (FullPath) : 0; - StrnCatGrow (&FullPath, &Size, L"\\", 0); - } - - StrnCatGrow (&FullPath, &Size, PathName, 0); - if (FullPath == NULL) { + StrnCatGrow (&SearchString, NULL, FullPath, 0); + if (SearchString == NULL) { + FreePool (FullPath); ShellCommandLineFreeVarList (Package); return SHELL_OUT_OF_RESOURCES; } - if (ShellIsDirectory (PathName) == EFI_SUCCESS) { - // - // is listing ends with a directory, then we list all files in that directory - // - ListUnfiltered = TRUE; - StrnCatGrow (&SearchString, NULL, L"*", 0); - } else { - // - // must split off the search part that applies to files from the end of the directory part - // - StrnCatGrow (&SearchString, NULL, FullPath, 0); - if (SearchString == NULL) { - FreePool (FullPath); - ShellCommandLineFreeVarList (Package); - return SHELL_OUT_OF_RESOURCES; - } - - PathRemoveLastItem (FullPath); - CopyMem (SearchString, SearchString + StrLen (FullPath), StrSize (SearchString + StrLen (FullPath))); - } + PathRemoveLastItem (FullPath); + CopyMem (SearchString, SearchString + StrLen (FullPath), StrSize (SearchString + StrLen (FullPath))); } } + } - Status = gRT->GetTime (&TheTime, NULL); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"ls", L"gRT->GetTime", Status); - TheTime.TimeZone = EFI_UNSPECIFIED_TIMEZONE; - } + Status = gRT->GetTime (&TheTime, NULL); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"ls", L"gRT->GetTime", Status); + TheTime.TimeZone = EFI_UNSPECIFIED_TIMEZONE; + } - if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = PrintLsOutput ( - ShellCommandLineGetFlag (Package, L"-r"), - RequiredAttributes, - ShellCommandLineGetFlag (Package, L"-sfo"), - FullPath, - SearchString, - NULL, - Count, - TheTime.TimeZone, - ListUnfiltered - ); - if (ShellStatus == SHELL_NOT_FOUND) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LS_FILE_NOT_FOUND), gShellLevel2HiiHandle, L"ls", FullPath); - } else if (ShellStatus == SHELL_INVALID_PARAMETER) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"ls", FullPath); - } else if (ShellStatus == SHELL_ABORTED) { - // - // Ignore aborting. - // - } else if (ShellStatus != SHELL_SUCCESS) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"ls", FullPath); - } + if (ShellStatus == SHELL_SUCCESS) { + ShellStatus = PrintLsOutput ( + ShellCommandLineGetFlag (Package, L"-r"), + RequiredAttributes, + ShellCommandLineGetFlag (Package, L"-sfo"), + FullPath, + SearchString, + NULL, + Count, + TheTime.TimeZone, + ListUnfiltered + ); + if (ShellStatus == SHELL_NOT_FOUND) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LS_FILE_NOT_FOUND), gShellLevel2HiiHandle, L"ls", FullPath); + } else if (ShellStatus == SHELL_INVALID_PARAMETER) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"ls", FullPath); + } else if (ShellStatus == SHELL_ABORTED) { + // + // Ignore aborting. + // + } else if (ShellStatus != SHELL_SUCCESS) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"ls", FullPath); } } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c index d15e2b16743a..dabbe1585260 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c @@ -1128,122 +1128,88 @@ MainCmdMap ( NormlMode = ShellCommandLineGetFlag (Package, L"-f"); if (ShellCommandLineGetFlag (Package, L"-?")) { ASSERT (FALSE); + return ShellStatus; } else if (ShellCommandLineGetRawValue (Package, 3) != NULL) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"map"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - // - // Deleting a map name... - // - if (ShellCommandLineGetFlag (Package, L"-d")) { - if ( ShellCommandLineGetFlag (Package, L"-r") - || ShellCommandLineGetFlag (Package, L"-v") - || ConstMode - || NormlMode - || ShellCommandLineGetFlag (Package, L"-u") - || ShellCommandLineGetFlag (Package, L"-t") - ) - { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle, L"map"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - SName = ShellCommandLineGetValue (Package, L"-d"); - if (SName != NULL) { - Status = PerformMappingDelete (SName); - if (EFI_ERROR (Status)) { - if (Status == EFI_ACCESS_DENIED) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel2HiiHandle, L"map"); - ShellStatus = SHELL_ACCESS_DENIED; - } else if (Status == EFI_NOT_FOUND) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MAP_NF), gShellLevel2HiiHandle, L"map", SName); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); - ShellStatus = SHELL_UNSUPPORTED; - } - } - } else { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"map"); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } - } else if ( ShellCommandLineGetFlag (Package, L"-r") - // || ShellCommandLineGetFlag(Package, L"-v") - || ConstMode - || NormlMode - || ShellCommandLineGetFlag (Package, L"-u") - || ShellCommandLineGetFlag (Package, L"-t") - ) + return SHELL_INVALID_PARAMETER; + } + + // + // Deleting a map name... + // + if (ShellCommandLineGetFlag (Package, L"-d")) { + if ( ShellCommandLineGetFlag (Package, L"-r") + || ShellCommandLineGetFlag (Package, L"-v") + || ConstMode + || NormlMode + || ShellCommandLineGetFlag (Package, L"-u") + || ShellCommandLineGetFlag (Package, L"-t") + ) { - ProbeForMediaChange (); - if ( ShellCommandLineGetFlag (Package, L"-r")) { - // - // Do the reset - // - Status = ShellCommandCreateInitialMappingsAndPaths (); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle, L"map"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + SName = ShellCommandLineGetValue (Package, L"-d"); + if (SName != NULL) { + Status = PerformMappingDelete (SName); if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); - ShellStatus = SHELL_UNSUPPORTED; + if (Status == EFI_ACCESS_DENIED) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel2HiiHandle, L"map"); + ShellStatus = SHELL_ACCESS_DENIED; + } else if (Status == EFI_NOT_FOUND) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MAP_NF), gShellLevel2HiiHandle, L"map", SName); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); + ShellStatus = SHELL_UNSUPPORTED; + } } + } else { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"map"); + ShellStatus = SHELL_INVALID_PARAMETER; } - - if ((ShellStatus == SHELL_SUCCESS) && ShellCommandLineGetFlag (Package, L"-u")) { - // - // Do the Update - // - Status = ShellCommandUpdateMapping (); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); - ShellStatus = SHELL_UNSUPPORTED; - } + } + } else if ( ShellCommandLineGetFlag (Package, L"-r") + // || ShellCommandLineGetFlag(Package, L"-v") + || ConstMode + || NormlMode + || ShellCommandLineGetFlag (Package, L"-u") + || ShellCommandLineGetFlag (Package, L"-t") + ) + { + ProbeForMediaChange (); + if ( ShellCommandLineGetFlag (Package, L"-r")) { + // + // Do the reset + // + Status = ShellCommandCreateInitialMappingsAndPaths (); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); + ShellStatus = SHELL_UNSUPPORTED; } + } - if (ShellStatus == SHELL_SUCCESS) { - Param1 = ShellCommandLineGetRawValue (Package, 1); - TypeString = ShellCommandLineGetValue (Package, L"-t"); - if ( !ConstMode - && !NormlMode - && (TypeString == NULL) - ) - { - // - // now do the display... - // - ShellStatus = PerformMappingDisplay ( - ShellCommandLineGetFlag (Package, L"-v"), - TRUE, - TRUE, - NULL, - SfoMode, - Param1, - TRUE - ); - } else { - // - // now do the display... - // - ShellStatus = PerformMappingDisplay2 ( - ShellCommandLineGetFlag (Package, L"-v"), - ConstMode, - NormlMode, - TypeString, - SfoMode, - Param1 - ); - } - } - } else { + if ((ShellStatus == SHELL_SUCCESS) && ShellCommandLineGetFlag (Package, L"-u")) { // - // adding or displaying (there were no flags) + // Do the Update // - SName = ShellCommandLineGetRawValue (Package, 1); - Mapping = ShellCommandLineGetRawValue (Package, 2); - if ( (SName == NULL) - && (Mapping == NULL) + Status = ShellCommandUpdateMapping (); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); + ShellStatus = SHELL_UNSUPPORTED; + } + } + + if (ShellStatus == SHELL_SUCCESS) { + Param1 = ShellCommandLineGetRawValue (Package, 1); + TypeString = ShellCommandLineGetValue (Package, L"-t"); + if ( !ConstMode + && !NormlMode + && (TypeString == NULL) ) { // - // display only since no flags + // now do the display... // ShellStatus = PerformMappingDisplay ( ShellCommandLineGetFlag (Package, L"-v"), @@ -1251,82 +1217,117 @@ MainCmdMap ( TRUE, NULL, SfoMode, - NULL, + Param1, TRUE ); - } else if ( (SName == NULL) - || (Mapping == NULL) - ) - { + } else { // - // Display only the one specified + // now do the display... // - ShellStatus = PerformMappingDisplay ( - FALSE, - FALSE, - FALSE, - NULL, + ShellStatus = PerformMappingDisplay2 ( + ShellCommandLineGetFlag (Package, L"-v"), + ConstMode, + NormlMode, + TypeString, SfoMode, - SName, // note the variable here... - TRUE + Param1 ); + } + } + } else { + // + // adding or displaying (there were no flags) + // + SName = ShellCommandLineGetRawValue (Package, 1); + Mapping = ShellCommandLineGetRawValue (Package, 2); + if ( (SName == NULL) + && (Mapping == NULL) + ) + { + // + // display only since no flags + // + ShellStatus = PerformMappingDisplay ( + ShellCommandLineGetFlag (Package, L"-v"), + TRUE, + TRUE, + NULL, + SfoMode, + NULL, + TRUE + ); + } else if ( (SName == NULL) + || (Mapping == NULL) + ) + { + // + // Display only the one specified + // + ShellStatus = PerformMappingDisplay ( + FALSE, + FALSE, + FALSE, + NULL, + SfoMode, + SName, // note the variable here... + TRUE + ); + } else { + if (ShellIsHexOrDecimalNumber (Mapping, TRUE, FALSE)) { + MapAsHandle = ConvertHandleIndexToHandle (ShellStrToUintn (Mapping)); } else { - if (ShellIsHexOrDecimalNumber (Mapping, TRUE, FALSE)) { - MapAsHandle = ConvertHandleIndexToHandle (ShellStrToUintn (Mapping)); - } else { - MapAsHandle = NULL; - } + MapAsHandle = NULL; + } - if ((MapAsHandle == NULL) && (Mapping[StrLen (Mapping)-1] != L':')) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", Mapping); + if ((MapAsHandle == NULL) && (Mapping[StrLen (Mapping)-1] != L':')) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", Mapping); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + TempStringLength = StrLen (SName); + if (!IsNumberLetterOnly (SName, TempStringLength-((SName[TempStringLength-1] == L':') ? 1 : 0))) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", SName); ShellStatus = SHELL_INVALID_PARAMETER; - } else { - TempStringLength = StrLen (SName); - if (!IsNumberLetterOnly (SName, TempStringLength-((SName[TempStringLength-1] == L':') ? 1 : 0))) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", SName); - ShellStatus = SHELL_INVALID_PARAMETER; + } + + if (ShellStatus == SHELL_SUCCESS) { + if (MapAsHandle != NULL) { + ShellStatus = AddMappingFromHandle (MapAsHandle, SName); + } else { + ShellStatus = AddMappingFromMapping (Mapping, SName); } - if (ShellStatus == SHELL_SUCCESS) { - if (MapAsHandle != NULL) { - ShellStatus = AddMappingFromHandle (MapAsHandle, SName); - } else { - ShellStatus = AddMappingFromMapping (Mapping, SName); + if (ShellStatus != SHELL_SUCCESS) { + switch (ShellStatus) { + case SHELL_ACCESS_DENIED: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel2HiiHandle, L"map"); + break; + case SHELL_INVALID_PARAMETER: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", Mapping); + break; + case SHELL_DEVICE_ERROR: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MAP_NOF), gShellLevel2HiiHandle, L"map", Mapping); + break; + default: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", ShellStatus|MAX_BIT); } - - if (ShellStatus != SHELL_SUCCESS) { - switch (ShellStatus) { - case SHELL_ACCESS_DENIED: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel2HiiHandle, L"map"); - break; - case SHELL_INVALID_PARAMETER: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", Mapping); - break; - case SHELL_DEVICE_ERROR: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MAP_NOF), gShellLevel2HiiHandle, L"map", Mapping); - break; - default: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", ShellStatus|MAX_BIT); - } - } else { - // - // now do the display... - // - ShellStatus = PerformMappingDisplay ( - FALSE, - FALSE, - FALSE, - NULL, - SfoMode, - SName, - TRUE - ); - } // we were successful so do an output - } - } // got a valid map target - } // got 2 variables - } // we are adding a mapping - } // got valid parameters + } else { + // + // now do the display... + // + ShellStatus = PerformMappingDisplay ( + FALSE, + FALSE, + FALSE, + NULL, + SfoMode, + SName, + TRUE + ); + } // we were successful so do an output + } + } // got a valid map target + } // got 2 variables + } // we are adding a mapping return ShellStatus; } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c index 62acb4f77069..49f52212e1cf 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c @@ -50,92 +50,88 @@ MainCmdMkdir ( // we didnt get a single parameter // ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"mkdir"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - for ( DirCreateCount = 1 - ; - ; DirCreateCount++ - ) - { + return SHELL_INVALID_PARAMETER; + } + + for (DirCreateCount = 1; ; DirCreateCount++) { + // + // loop through each directory specified + // + + NewDirName = ShellCommandLineGetRawValue (Package, DirCreateCount); + if (NewDirName == NULL) { + break; + } + + // + // check if that already exists... if yes fail + // + FileHandle = NULL; + Status = ShellOpenFileByName ( + NewDirName, + &FileHandle, + EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE, + EFI_FILE_DIRECTORY + ); + if (!EFI_ERROR (Status)) { + ShellCloseFile (&FileHandle); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MKDIR_ALREADY), gShellLevel2HiiHandle, NewDirName); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ASSERT (FileHandle == NULL); // - // loop through each directory specified + // create the nested directory from parent to child. + // if NewDirName = test1\test2\test3, first create "test1\" directory, then "test1\test2\", finally "test1\test2\test3". // - - NewDirName = ShellCommandLineGetRawValue (Package, DirCreateCount); - if (NewDirName == NULL) { + NewDirNameCopy = AllocateCopyPool (StrSize (NewDirName), NewDirName); + NewDirNameCopy = PathCleanUpDirectories (NewDirNameCopy); + if (NewDirNameCopy == NULL) { + ShellStatus = SHELL_OUT_OF_RESOURCES; break; } - // - // check if that already exists... if yes fail - // - FileHandle = NULL; - Status = ShellOpenFileByName ( - NewDirName, - &FileHandle, - EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE, - EFI_FILE_DIRECTORY - ); - if (!EFI_ERROR (Status)) { - ShellCloseFile (&FileHandle); - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MKDIR_ALREADY), gShellLevel2HiiHandle, NewDirName); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ASSERT (FileHandle == NULL); - // - // create the nested directory from parent to child. - // if NewDirName = test1\test2\test3, first create "test1\" directory, then "test1\test2\", finally "test1\test2\test3". - // - NewDirNameCopy = AllocateCopyPool (StrSize (NewDirName), NewDirName); - NewDirNameCopy = PathCleanUpDirectories (NewDirNameCopy); - if (NewDirNameCopy == NULL) { - ShellStatus = SHELL_OUT_OF_RESOURCES; - break; + SplitName = NewDirNameCopy; + while (SplitName != NULL) { + SplitName = StrStr (SplitName + 1, L"\\"); + if (SplitName != NULL) { + SaveSplitChar = *(SplitName + 1); + *(SplitName + 1) = '\0'; } - SplitName = NewDirNameCopy; - while (SplitName != NULL) { - SplitName = StrStr (SplitName + 1, L"\\"); - if (SplitName != NULL) { - SaveSplitChar = *(SplitName + 1); - *(SplitName + 1) = '\0'; - } - - // - // check if current nested directory already exists... continue to create the child directory. - // - Status = ShellOpenFileByName ( - NewDirNameCopy, - &FileHandle, - EFI_FILE_MODE_READ, - EFI_FILE_DIRECTORY - ); - if (!EFI_ERROR (Status)) { - ShellCloseFile (&FileHandle); - } else { - Status = ShellCreateDirectory (NewDirNameCopy, &FileHandle); - if (EFI_ERROR (Status)) { - break; - } - - if (FileHandle != NULL) { - gEfiShellProtocol->CloseFile (FileHandle); - } + // + // check if current nested directory already exists... continue to create the child directory. + // + Status = ShellOpenFileByName ( + NewDirNameCopy, + &FileHandle, + EFI_FILE_MODE_READ, + EFI_FILE_DIRECTORY + ); + if (!EFI_ERROR (Status)) { + ShellCloseFile (&FileHandle); + } else { + Status = ShellCreateDirectory (NewDirNameCopy, &FileHandle); + if (EFI_ERROR (Status)) { + break; } - if (SplitName != NULL) { - *(SplitName + 1) = SaveSplitChar; + if (FileHandle != NULL) { + gEfiShellProtocol->CloseFile (FileHandle); } } - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MKDIR_CREATEFAIL), gShellLevel2HiiHandle, NewDirName); - ShellStatus = SHELL_ACCESS_DENIED; - break; + if (SplitName != NULL) { + *(SplitName + 1) = SaveSplitChar; } + } - SHELL_FREE_NON_NULL (NewDirNameCopy); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_MKDIR_CREATEFAIL), gShellLevel2HiiHandle, NewDirName); + ShellStatus = SHELL_ACCESS_DENIED; + break; } + + SHELL_FREE_NON_NULL (NewDirNameCopy); } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c index d20d0fb1c85b..61740a6e9453 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Parse.c @@ -260,40 +260,40 @@ MainCmdParse ( (ShellCommandLineGetCount (Package) < 3)) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"parse"); - ShellStatus = SHELL_INVALID_PARAMETER; + return SHELL_INVALID_PARAMETER; } else if ((StreamingUnicode && (ShellCommandLineGetCount (Package) > 3)) || (ShellCommandLineGetCount (Package) > 4)) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"parse"); - ShellStatus = SHELL_INVALID_PARAMETER; + return SHELL_INVALID_PARAMETER; + } + + if (StreamingUnicode) { + FileName = L">i"; + TableName = ShellCommandLineGetRawValue (Package, 1); + ColumnString = ShellCommandLineGetRawValue (Package, 2); } else { - if (StreamingUnicode) { - FileName = L">i"; - TableName = ShellCommandLineGetRawValue (Package, 1); - ColumnString = ShellCommandLineGetRawValue (Package, 2); - } else { - FileName = ShellCommandLineGetRawValue (Package, 1); - TableName = ShellCommandLineGetRawValue (Package, 2); - ColumnString = ShellCommandLineGetRawValue (Package, 3); - } + FileName = ShellCommandLineGetRawValue (Package, 1); + TableName = ShellCommandLineGetRawValue (Package, 2); + ColumnString = ShellCommandLineGetRawValue (Package, 3); + } - if (ShellCommandLineGetValue (Package, L"-i") == NULL) { - TableNameInstance = (UINTN)-1; - } else { - TableNameInstance = ShellStrToUintn (ShellCommandLineGetValue (Package, L"-i")); - } + if (ShellCommandLineGetValue (Package, L"-i") == NULL) { + TableNameInstance = (UINTN)-1; + } else { + TableNameInstance = ShellStrToUintn (ShellCommandLineGetValue (Package, L"-i")); + } - if (ShellCommandLineGetValue (Package, L"-s") == NULL) { - ShellCommandInstance = 1; - } else { - ShellCommandInstance = ShellStrToUintn (ShellCommandLineGetValue (Package, L"-s")); - } + if (ShellCommandLineGetValue (Package, L"-s") == NULL) { + ShellCommandInstance = 1; + } else { + ShellCommandInstance = ShellStrToUintn (ShellCommandLineGetValue (Package, L"-s")); + } - if ((FileName != NULL) && (TableName != NULL) && (ColumnString != NULL)) { - ShellStatus = PerformParsing (FileName, TableName, ShellStrToUintn (ColumnString), TableNameInstance, ShellCommandInstance, StreamingUnicode); - } else { - ShellStatus = SHELL_INVALID_PARAMETER; - } + if ((FileName != NULL) && (TableName != NULL) && (ColumnString != NULL)) { + ShellStatus = PerformParsing (FileName, TableName, ShellStrToUintn (ColumnString), TableNameInstance, ShellCommandInstance, StreamingUnicode); + } else { + ShellStatus = SHELL_INVALID_PARAMETER; } return ShellStatus; diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c index e5642b6d658b..0d254923888d 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Reset.c @@ -41,14 +41,30 @@ MainCmdReset ( // if (ShellCommandLineGetFlag (Package, L"-?")) { ASSERT (FALSE); + return ShellStatus; } else if (ShellCommandLineGetRawValue (Package, 1) != NULL) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - if (ShellCommandLineGetFlag (Package, L"-fwui")) { + return SHELL_INVALID_PARAMETER; + } + + if (ShellCommandLineGetFlag (Package, L"-fwui")) { + DataSize = sizeof (OsIndications); + Status = gRT->GetVariable ( + EFI_OS_INDICATIONS_SUPPORT_VARIABLE_NAME, + &gEfiGlobalVariableGuid, + &Attr, + &DataSize, + &OsIndications + ); + + if (EFI_ERROR (Status)) { + return SHELL_UNSUPPORTED; + } + + if ((OsIndications & EFI_OS_INDICATIONS_BOOT_TO_FW_UI) != 0) { DataSize = sizeof (OsIndications); Status = gRT->GetVariable ( - EFI_OS_INDICATIONS_SUPPORT_VARIABLE_NAME, + EFI_OS_INDICATIONS_VARIABLE_NAME, &gEfiGlobalVariableGuid, &Attr, &DataSize, @@ -56,80 +72,65 @@ MainCmdReset ( ); if (EFI_ERROR (Status)) { - return SHELL_UNSUPPORTED; + OsIndications = EFI_OS_INDICATIONS_BOOT_TO_FW_UI; + } else { + OsIndications |= EFI_OS_INDICATIONS_BOOT_TO_FW_UI; } - if ((OsIndications & EFI_OS_INDICATIONS_BOOT_TO_FW_UI) != 0) { - DataSize = sizeof (OsIndications); - Status = gRT->GetVariable ( - EFI_OS_INDICATIONS_VARIABLE_NAME, - &gEfiGlobalVariableGuid, - &Attr, - &DataSize, - &OsIndications - ); - - if (EFI_ERROR (Status)) { - OsIndications = EFI_OS_INDICATIONS_BOOT_TO_FW_UI; - } else { - OsIndications |= EFI_OS_INDICATIONS_BOOT_TO_FW_UI; - } - - Status = gRT->SetVariable ( - EFI_OS_INDICATIONS_VARIABLE_NAME, - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - sizeof (OsIndications), - &OsIndications - ); - } + Status = gRT->SetVariable ( + EFI_OS_INDICATIONS_VARIABLE_NAME, + &gEfiGlobalVariableGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + sizeof (OsIndications), + &OsIndications + ); + } - if (EFI_ERROR (Status)) { - return SHELL_UNSUPPORTED; - } + if (EFI_ERROR (Status)) { + return SHELL_UNSUPPORTED; } + } - // - // check for warm reset flag, then shutdown reset flag, then cold (default) reset flag - // - if (ShellCommandLineGetFlag (Package, L"-w")) { - if (ShellCommandLineGetFlag (Package, L"-s") || ShellCommandLineGetFlag (Package, L"-c")) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - String = ShellCommandLineGetValue (Package, L"-w"); - if (String != NULL) { - gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, StrSize (String), (VOID *)String); - } else { - gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL); - } - } - } else if (ShellCommandLineGetFlag (Package, L"-s")) { - if (ShellCommandLineGetFlag (Package, L"-c")) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); - ShellStatus = SHELL_INVALID_PARAMETER; + // + // check for warm reset flag, then shutdown reset flag, then cold (default) reset flag + // + if (ShellCommandLineGetFlag (Package, L"-w")) { + if (ShellCommandLineGetFlag (Package, L"-s") || ShellCommandLineGetFlag (Package, L"-c")) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + String = ShellCommandLineGetValue (Package, L"-w"); + if (String != NULL) { + gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, StrSize (String), (VOID *)String); } else { - String = ShellCommandLineGetValue (Package, L"-s"); - DEBUG_CODE ( - ShellPrintDefaultEx (L"Reset with %s (%d bytes)\n", String, String != NULL ? StrSize (String) : 0); - ); - if (String != NULL) { - gRT->ResetSystem (EfiResetShutdown, EFI_SUCCESS, StrSize (String), (VOID *)String); - } else { - gRT->ResetSystem (EfiResetShutdown, EFI_SUCCESS, 0, NULL); - } + gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL); } + } + } else if (ShellCommandLineGetFlag (Package, L"-s")) { + if (ShellCommandLineGetFlag (Package, L"-c")) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); + ShellStatus = SHELL_INVALID_PARAMETER; } else { - // - // this is default so dont worry about flag... - // - String = ShellCommandLineGetValue (Package, L"-c"); + String = ShellCommandLineGetValue (Package, L"-s"); + DEBUG_CODE ( + ShellPrintDefaultEx (L"Reset with %s (%d bytes)\n", String, String != NULL ? StrSize (String) : 0); + ); if (String != NULL) { - gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, StrSize (String), (VOID *)String); + gRT->ResetSystem (EfiResetShutdown, EFI_SUCCESS, StrSize (String), (VOID *)String); } else { - gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); + gRT->ResetSystem (EfiResetShutdown, EFI_SUCCESS, 0, NULL); } } + } else { + // + // this is default so dont worry about flag... + // + String = ShellCommandLineGetValue (Package, L"-c"); + if (String != NULL) { + gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, StrSize (String), (VOID *)String); + } else { + gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); + } } return ShellStatus; diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c index b18401f0d42f..49c746ceeb76 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c @@ -301,68 +301,66 @@ MainCmdRm ( // we insufficient parameters // ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"rm"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { + return SHELL_INVALID_PARAMETER; + } + + // + // get a list with each file specified by parameters + // if parameter is a directory then add all the files below it to the list + // + for ( ParamCount = 1, Param = ShellCommandLineGetRawValue (Package, ParamCount) + ; Param != NULL + ; ParamCount++, Param = ShellCommandLineGetRawValue (Package, ParamCount) + ) + { + Status = ShellOpenFileMetaArg ((CHAR16 *)Param, EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList); + if (EFI_ERROR (Status) || (FileList == NULL) || IsListEmpty (&FileList->Link)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"rm", (CHAR16 *)Param); + ShellStatus = SHELL_NOT_FOUND; + break; + } + } + + if (ShellStatus == SHELL_SUCCESS) { // - // get a list with each file specified by parameters - // if parameter is a directory then add all the files below it to the list + // loop through the list and make sure we are not aborting... // - for ( ParamCount = 1, Param = ShellCommandLineGetRawValue (Package, ParamCount) - ; Param != NULL - ; ParamCount++, Param = ShellCommandLineGetRawValue (Package, ParamCount) + for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode (&FileList->Link) + ; !IsNull (&FileList->Link, &Node->Link) && !ShellGetExecutionBreakFlag () + ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode (&FileList->Link, &Node->Link) ) { - Status = ShellOpenFileMetaArg ((CHAR16 *)Param, EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList); - if (EFI_ERROR (Status) || (FileList == NULL) || IsListEmpty (&FileList->Link)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, L"rm", (CHAR16 *)Param); - ShellStatus = SHELL_NOT_FOUND; - break; + // + // skip the directory traversing stuff... + // + if ((StrCmp (Node->FileName, L".") == 0) || (StrCmp (Node->FileName, L"..") == 0)) { + continue; } - } - if (ShellStatus == SHELL_SUCCESS) { // - // loop through the list and make sure we are not aborting... + // do the deleting of nodes // - for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode (&FileList->Link) - ; !IsNull (&FileList->Link, &Node->Link) && !ShellGetExecutionBreakFlag () - ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode (&FileList->Link, &Node->Link) - ) - { - // - // skip the directory traversing stuff... - // - if ((StrCmp (Node->FileName, L".") == 0) || (StrCmp (Node->FileName, L"..") == 0)) { - continue; - } - - // - // do the deleting of nodes - // - if (EFI_ERROR (Node->Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_RM_LOG_DELETE_ERR2), gShellLevel2HiiHandle, Node->Status); - ShellStatus = SHELL_ACCESS_DENIED; - break; - } - - if (!IsValidDeleteTarget (FileList, Node, Package)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_RM_LOG_DELETE_ERR3), gShellLevel2HiiHandle, Node->FullName); - ShellStatus = SHELL_INVALID_PARAMETER; - break; - } + if (EFI_ERROR (Node->Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_RM_LOG_DELETE_ERR2), gShellLevel2HiiHandle, Node->Status); + ShellStatus = SHELL_ACCESS_DENIED; + break; + } - ShellStatus = CascadeDelete (Node, ShellCommandLineGetFlag (Package, L"-q")); + if (!IsValidDeleteTarget (FileList, Node, Package)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_RM_LOG_DELETE_ERR3), gShellLevel2HiiHandle, Node->FullName); + ShellStatus = SHELL_INVALID_PARAMETER; + break; } - } - // - // Free the fileList - // - if (FileList != NULL) { - Status = ShellCloseFileMetaArg (&FileList); + ShellStatus = CascadeDelete (Node, ShellCommandLineGetFlag (Package, L"-q")); } + } - FileList = NULL; + // + // Free the fileList + // + if (FileList != NULL) { + Status = ShellCloseFileMetaArg (&FileList); } return ShellStatus; diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Set.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Set.c index 2cca3a2158ec..fef877c31882 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Set.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Set.c @@ -61,12 +61,13 @@ MainCmdSet ( // if (ShellCommandLineGetFlag (Package, L"-?")) { ASSERT (FALSE); + return ShellStatus; } else if (ShellCommandLineGetRawValue (Package, 3) != NULL) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"set"); - ShellStatus = SHELL_INVALID_PARAMETER; + return SHELL_INVALID_PARAMETER; } else if ((ShellCommandLineGetRawValue (Package, 1) != NULL) && ShellCommandLineGetFlag (Package, L"-d")) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"set"); - ShellStatus = SHELL_INVALID_PARAMETER; + return SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetFlag (Package, L"-d")) { // // delete a environment variable @@ -82,42 +83,44 @@ MainCmdSet ( ShellStatus = SHELL_DEVICE_ERROR; } } + + return ShellStatus; } else if (ShellCommandLineGetRawValue (Package, 1) == NULL) { // // print out all current environment variables // return (PrintAllShellEnvVars ()); - } else { + } + + // + // we are either printing one or assigning one + // + KeyName = ShellCommandLineGetRawValue (Package, 1); + Value = ShellCommandLineGetRawValue (Package, 2); + if ((KeyName != NULL) && (Value != NULL)) { // - // we are either printing one or assigning one + // assigning one // - KeyName = ShellCommandLineGetRawValue (Package, 1); - Value = ShellCommandLineGetRawValue (Package, 2); - if ((KeyName != NULL) && (Value != NULL)) { + Status = ShellSetEnvironmentVariable (KeyName, Value, ShellCommandLineGetFlag (Package, L"-v")); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_ERROR_SET), gShellLevel2HiiHandle, L"set", KeyName); + ShellStatus = (SHELL_STATUS)(Status & (~MAX_BIT)); + } + } else { + if (KeyName != NULL) { // - // assigning one + // print out value for this one only. // - Status = ShellSetEnvironmentVariable (KeyName, Value, ShellCommandLineGetFlag (Package, L"-v")); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_ERROR_SET), gShellLevel2HiiHandle, L"set", KeyName); - ShellStatus = (SHELL_STATUS)(Status & (~MAX_BIT)); - } - } else { - if (KeyName != NULL) { - // - // print out value for this one only. - // - Value = ShellGetEnvironmentVariable (KeyName); - if (Value == NULL) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_NF), gShellLevel2HiiHandle, L"set", KeyName); - ShellStatus = SHELL_SUCCESS; - } else { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_DISP), gShellLevel2HiiHandle, KeyName, Value); - ShellStatus = SHELL_SUCCESS; - } + Value = ShellGetEnvironmentVariable (KeyName); + if (Value == NULL) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_NF), gShellLevel2HiiHandle, L"set", KeyName); + ShellStatus = SHELL_SUCCESS; } else { - ASSERT (FALSE); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_SET_DISP), gShellLevel2HiiHandle, KeyName, Value); + ShellStatus = SHELL_SUCCESS; } + } else { + ASSERT (FALSE); } } diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c index fa951210ce60..8535484b63b5 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c @@ -188,57 +188,58 @@ MainCmdDate ( // if (ShellCommandLineGetFlag (Package, L"-?")) { ASSERT (FALSE); + return ShellStatus; } else if (ShellCommandLineGetRawValue (Package, 2) != NULL) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"date"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { + return SHELL_INVALID_PARAMETER; + } + + // + // If there are 0 value parameters, then print the current date + // else If there are any value paramerers, then print error + // + if (ShellCommandLineGetRawValue (Package, 1) == NULL) { // - // If there are 0 value parameters, then print the current date - // else If there are any value paramerers, then print error + // get the current date // - if (ShellCommandLineGetRawValue (Package, 1) == NULL) { - // - // get the current date - // - Status = gRT->GetTime (&TheTime, NULL); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"date", L"gRT->GetTime", Status); - return (SHELL_DEVICE_ERROR); - } + Status = gRT->GetTime (&TheTime, NULL); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"date", L"gRT->GetTime", Status); + return (SHELL_DEVICE_ERROR); + } + // + // ShellPrintEx the date in SFO or regular format + // + if (ShellCommandLineGetFlag (Package, L"-sfo")) { // - // ShellPrintEx the date in SFO or regular format + // Match UEFI Shell spec: + // ShellCommand,"date" + // Date,"DD","MM","YYYY" // - if (ShellCommandLineGetFlag (Package, L"-sfo")) { - // - // Match UEFI Shell spec: - // ShellCommand,"date" - // Date,"DD","MM","YYYY" - // - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_SFO_HEADER), gShellLevel2HiiHandle, L"date"); - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DATE_SFO_FORMAT), gShellLevel2HiiHandle, TheTime.Day, TheTime.Month, TheTime.Year); - } else { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DATE_FORMAT), gShellLevel2HiiHandle, TheTime.Month, TheTime.Day, TheTime.Year); - } + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_SFO_HEADER), gShellLevel2HiiHandle, L"date"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DATE_SFO_FORMAT), gShellLevel2HiiHandle, TheTime.Day, TheTime.Month, TheTime.Year); } else { - if (PcdGet8 (PcdShellSupportLevel) == 2) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"date"); + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_DATE_FORMAT), gShellLevel2HiiHandle, TheTime.Month, TheTime.Day, TheTime.Year); + } + } else { + if (PcdGet8 (PcdShellSupportLevel) == 2) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"date"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + // + // perform level 3 operation here. + // + Param1 = ShellCommandLineGetRawValue (Package, 1); + if (Param1 == NULL) { ShellStatus = SHELL_INVALID_PARAMETER; } else { - // - // perform level 3 operation here. - // - Param1 = ShellCommandLineGetRawValue (Package, 1); - if (Param1 == NULL) { - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ShellStatus = CheckAndSetDate (Param1); - } + ShellStatus = CheckAndSetDate (Param1); + } - if (ShellStatus != SHELL_SUCCESS) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"date", Param1); - ShellStatus = SHELL_INVALID_PARAMETER; - } + if (ShellStatus != SHELL_SUCCESS) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"date", Param1); + ShellStatus = SHELL_INVALID_PARAMETER; } } } @@ -451,164 +452,165 @@ MainCmdTime ( if (ShellCommandLineGetFlag (Package, L"-?")) { ASSERT (FALSE); + return ShellStatus; } else if (ShellCommandLineGetRawValue (Package, 2) != NULL) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"time"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { + return SHELL_INVALID_PARAMETER; + } + + // + // If there are no parameters, then print the current time + // + if ( (ShellCommandLineGetRawValue (Package, 1) == NULL) + && !ShellCommandLineGetFlag (Package, L"-d") + && !ShellCommandLineGetFlag (Package, L"-tz")) + { // - // If there are no parameters, then print the current time + // ShellPrintEx the current time // - if ( (ShellCommandLineGetRawValue (Package, 1) == NULL) - && !ShellCommandLineGetFlag (Package, L"-d") - && !ShellCommandLineGetFlag (Package, L"-tz")) - { - // - // ShellPrintEx the current time - // - if (TheTime.TimeZone == EFI_UNSPECIFIED_TIMEZONE) { - TzMinutes = 0; - } else { - TzMinutes = (ABS (TheTime.TimeZone)) % 60; - } + if (TheTime.TimeZone == EFI_UNSPECIFIED_TIMEZONE) { + TzMinutes = 0; + } else { + TzMinutes = (ABS (TheTime.TimeZone)) % 60; + } - if (TheTime.TimeZone != EFI_UNSPECIFIED_TIMEZONE) { - ShellPrintHiiDefaultEx ( - STRING_TOKEN (STR_TIME_FORMAT), - gShellLevel2HiiHandle, - TheTime.Hour, - TheTime.Minute, - TheTime.Second, - (TheTime.TimeZone > 0 ? L"-" : L"+"), - ((ABS (TheTime.TimeZone)) / 60), - TzMinutes - ); - } else { - ShellPrintHiiDefaultEx ( - STRING_TOKEN (STR_TIME_FORMAT_LOCAL), - gShellLevel2HiiHandle, - TheTime.Hour, - TheTime.Minute, - TheTime.Second - ); - } + if (TheTime.TimeZone != EFI_UNSPECIFIED_TIMEZONE) { + ShellPrintHiiDefaultEx ( + STRING_TOKEN (STR_TIME_FORMAT), + gShellLevel2HiiHandle, + TheTime.Hour, + TheTime.Minute, + TheTime.Second, + (TheTime.TimeZone > 0 ? L"-" : L"+"), + ((ABS (TheTime.TimeZone)) / 60), + TzMinutes + ); + } else { + ShellPrintHiiDefaultEx ( + STRING_TOKEN (STR_TIME_FORMAT_LOCAL), + gShellLevel2HiiHandle, + TheTime.Hour, + TheTime.Minute, + TheTime.Second + ); + } - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_CRLF), gShellLevel2HiiHandle); - } else if (ShellCommandLineGetFlag (Package, L"-d") && (ShellCommandLineGetValue (Package, L"-d") == NULL)) { - if (TheTime.TimeZone == EFI_UNSPECIFIED_TIMEZONE) { - ShellPrintHiiDefaultEx ( - STRING_TOKEN (STR_TIME_FORMAT_LOCAL), - gShellLevel2HiiHandle, - TheTime.Hour, - TheTime.Minute, - TheTime.Second - ); - } else { - TzMinutes = (ABS (TheTime.TimeZone)) % 60; - ShellPrintHiiDefaultEx ( - STRING_TOKEN (STR_TIME_FORMAT), - gShellLevel2HiiHandle, - TheTime.Hour, - TheTime.Minute, - TheTime.Second, - (TheTime.TimeZone > 0 ? L"-" : L"+"), - ((ABS (TheTime.TimeZone)) / 60), - TzMinutes - ); - } + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_CRLF), gShellLevel2HiiHandle); + } else if (ShellCommandLineGetFlag (Package, L"-d") && (ShellCommandLineGetValue (Package, L"-d") == NULL)) { + if (TheTime.TimeZone == EFI_UNSPECIFIED_TIMEZONE) { + ShellPrintHiiDefaultEx ( + STRING_TOKEN (STR_TIME_FORMAT_LOCAL), + gShellLevel2HiiHandle, + TheTime.Hour, + TheTime.Minute, + TheTime.Second + ); + } else { + TzMinutes = (ABS (TheTime.TimeZone)) % 60; + ShellPrintHiiDefaultEx ( + STRING_TOKEN (STR_TIME_FORMAT), + gShellLevel2HiiHandle, + TheTime.Hour, + TheTime.Minute, + TheTime.Second, + (TheTime.TimeZone > 0 ? L"-" : L"+"), + ((ABS (TheTime.TimeZone)) / 60), + TzMinutes + ); + } - switch (TheTime.Daylight) { - case 0: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST0), gShellLevel2HiiHandle); - break; - case EFI_TIME_ADJUST_DAYLIGHT: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST1), gShellLevel2HiiHandle); - break; - case EFI_TIME_IN_DAYLIGHT: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST2), gShellLevel2HiiHandle); - break; - case EFI_TIME_IN_DAYLIGHT|EFI_TIME_ADJUST_DAYLIGHT: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST3), gShellLevel2HiiHandle); - break; - default: - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_ERROR), gShellLevel2HiiHandle, L"time", L"gRT->GetTime", L"TheTime.Daylight", TheTime.Daylight); - } + switch (TheTime.Daylight) { + case 0: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST0), gShellLevel2HiiHandle); + break; + case EFI_TIME_ADJUST_DAYLIGHT: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST1), gShellLevel2HiiHandle); + break; + case EFI_TIME_IN_DAYLIGHT: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST2), gShellLevel2HiiHandle); + break; + case EFI_TIME_IN_DAYLIGHT|EFI_TIME_ADJUST_DAYLIGHT: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIME_DST3), gShellLevel2HiiHandle); + break; + default: + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_ERROR), gShellLevel2HiiHandle, L"time", L"gRT->GetTime", L"TheTime.Daylight", TheTime.Daylight); + } + } else { + if (PcdGet8 (PcdShellSupportLevel) == 2) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"time"); + ShellStatus = SHELL_INVALID_PARAMETER; } else { - if (PcdGet8 (PcdShellSupportLevel) == 2) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"time"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - // - // perform level 3 operation here. - // - if ((TempLocation = ShellCommandLineGetValue (Package, L"-tz")) != NULL) { - if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16 *)TempLocation, L"_local") == 0) { - Tz = EFI_UNSPECIFIED_TIMEZONE; - } else if (TempLocation[0] == L'-') { + // + // perform level 3 operation here. + // + if ((TempLocation = ShellCommandLineGetValue (Package, L"-tz")) != NULL) { + if (gUnicodeCollation->StriColl (gUnicodeCollation, (CHAR16 *)TempLocation, L"_local") == 0) { + Tz = EFI_UNSPECIFIED_TIMEZONE; + } else if (TempLocation[0] == L'-') { + Tz = (INT16)ShellStrToUintn (++TempLocation); + // + // When the argument of "time [-tz tz]" is not numeric, ShellStrToUintn() returns "-1". + // Here we can detect the argument error by checking the return of ShellStrToUintn(). + // + if (Tz == -1) { + Tz = 1441; // make it to be out of bounds value + } else { + Tz *= (-1); // sign convert + } + } else { + if (TempLocation[0] == L'+') { Tz = (INT16)ShellStrToUintn (++TempLocation); - // - // When the argument of "time [-tz tz]" is not numeric, ShellStrToUintn() returns "-1". - // Here we can detect the argument error by checking the return of ShellStrToUintn(). - // - if (Tz == -1) { - Tz = 1441; // make it to be out of bounds value - } else { - Tz *= (-1); // sign convert - } } else { - if (TempLocation[0] == L'+') { - Tz = (INT16)ShellStrToUintn (++TempLocation); - } else { - Tz = (INT16)ShellStrToUintn (TempLocation); - } - - // - // Detect the return of ShellStrToUintn() to make sure the argument is valid. - // - if (Tz == -1) { - Tz = 1441; // make it to be out of bounds value - } + Tz = (INT16)ShellStrToUintn (TempLocation); } - if (!((Tz >= -1440) && (Tz <= 1440)) && (Tz != EFI_UNSPECIFIED_TIMEZONE)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"time", TempLocation, L"-tz"); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } else { // - // intentionally out of bounds value will prevent changing it... + // Detect the return of ShellStrToUintn() to make sure the argument is valid. // - Tz = 1441; + if (Tz == -1) { + Tz = 1441; // make it to be out of bounds value + } } - TempLocation = ShellCommandLineGetValue (Package, L"-d"); - if (TempLocation != NULL) { - Daylight = (UINT8)ShellStrToUintn (TempLocation); - // - // The argument of "time [-d dl]" is unsigned, if the first character is '-', - // the argument is incorrect. That's because ShellStrToUintn() will skip past - // any '-' sign and convert what's next, forgetting the sign is here. - // - if (TempLocation[0] == '-') { - Daylight = 0xff; // make it invalid = will not use - } + if (!((Tz >= -1440) && (Tz <= 1440)) && (Tz != EFI_UNSPECIFIED_TIMEZONE)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"time", TempLocation, L"-tz"); + ShellStatus = SHELL_INVALID_PARAMETER; + } + } else { + // + // intentionally out of bounds value will prevent changing it... + // + Tz = 1441; + } - if ((Daylight != 0) && (Daylight != 1) && (Daylight != 3)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"time", TempLocation, L"-d"); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } else { - // - // invalid = will not use - // - Daylight = 0xFF; + TempLocation = ShellCommandLineGetValue (Package, L"-d"); + if (TempLocation != NULL) { + Daylight = (UINT8)ShellStrToUintn (TempLocation); + // + // The argument of "time [-d dl]" is unsigned, if the first character is '-', + // the argument is incorrect. That's because ShellStrToUintn() will skip past + // any '-' sign and convert what's next, forgetting the sign is here. + // + if (TempLocation[0] == '-') { + Daylight = 0xff; // make it invalid = will not use } - if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = CheckAndSetTime (ShellCommandLineGetRawValue (Package, 1), Tz, Daylight); - if (ShellStatus != SHELL_SUCCESS) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"time", ShellCommandLineGetRawValue (Package, 1)); - ShellStatus = SHELL_INVALID_PARAMETER; - } + if ((Daylight != 0) && (Daylight != 1) && (Daylight != 3)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"time", TempLocation, L"-d"); + ShellStatus = SHELL_INVALID_PARAMETER; + } + } else { + // + // invalid = will not use + // + Daylight = 0xFF; + } + + if (ShellStatus == SHELL_SUCCESS) { + ShellStatus = CheckAndSetTime (ShellCommandLineGetRawValue (Package, 1), Tz, Daylight); + if (ShellStatus != SHELL_SUCCESS) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"time", ShellCommandLineGetRawValue (Package, 1)); + ShellStatus = SHELL_INVALID_PARAMETER; } } } @@ -866,9 +868,10 @@ MainCmdTimeZone ( // if (ShellCommandLineGetCount (Package) > 1) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"timezone"); - ShellStatus = SHELL_INVALID_PARAMETER; + return SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetFlag (Package, L"-?")) { ASSERT (FALSE); + return ShellStatus; } else if (ShellCommandLineGetFlag (Package, L"-s")) { if ((ShellCommandLineGetFlag (Package, L"-l")) || (ShellCommandLineGetFlag (Package, L"-f"))) { ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"timezone", L"-l or -f"); @@ -889,6 +892,8 @@ MainCmdTimeZone ( } } } + + return ShellStatus; } else if (ShellCommandLineGetFlag (Package, L"-l")) { // // Print a list of all time zones @@ -900,91 +905,93 @@ MainCmdTimeZone ( { ShellPrintHiiDefaultEx (TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle); } + + return ShellStatus; + } + + // + // Get Current Time Zone Info + // + Status = gRT->GetTime (&TheTime, NULL); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"timezone", L"gRT->GetTime", Status); + return (SHELL_DEVICE_ERROR); + } + + if (TheTime.TimeZone != EFI_UNSPECIFIED_TIMEZONE) { + Found = FALSE; + for ( LoopVar = 0 + ; LoopVar < sizeof (TimeZoneList) / sizeof (TimeZoneList[0]) + ; LoopVar++ + ) + { + if (TheTime.TimeZone == TimeZoneList[LoopVar].TimeZone) { + if (ShellCommandLineGetFlag (Package, L"-f")) { + // + // Print all info about current time zone + // + ShellPrintHiiDefaultEx (TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle); + } else { + // + // Print basic info only + // + TzMinutes = (ABS (TheTime.TimeZone)) % 60; + + ShellPrintHiiDefaultEx ( + STRING_TOKEN (STR_TIMEZONE_SIMPLE), + gShellLevel2HiiHandle, + (TheTime.TimeZone > 0 ? L"-" : L"+"), + (ABS (TheTime.TimeZone)) / 60, + TzMinutes + ); + } + + Found = TRUE; + break; + } + } + + if (!Found) { + // + // Print basic info only + // + TzMinutes = (ABS (TheTime.TimeZone)) % 60; + + ShellPrintHiiDefaultEx ( + STRING_TOKEN (STR_TIMEZONE_SIMPLE), + gShellLevel2HiiHandle, + (TheTime.TimeZone > 0 ? L"-" : L"+"), + (ABS (TheTime.TimeZone)) / 60, + TzMinutes + ); + + if (ShellCommandLineGetFlag (Package, L"-f")) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIMEZONE_NI), gShellLevel2HiiHandle); + } + } } else { // - // Get Current Time Zone Info + // TimeZone was EFI_UNSPECIFIED_TIMEZONE (local) from GetTime() // - Status = gRT->GetTime (&TheTime, NULL); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"timezone", L"gRT->GetTime", Status); - return (SHELL_DEVICE_ERROR); - } - - if (TheTime.TimeZone != EFI_UNSPECIFIED_TIMEZONE) { - Found = FALSE; + if (ShellCommandLineGetFlag (Package, L"-f")) { for ( LoopVar = 0 - ; LoopVar < sizeof (TimeZoneList) / sizeof (TimeZoneList[0]) + ; LoopVar < ARRAY_SIZE (TimeZoneList) ; LoopVar++ ) { if (TheTime.TimeZone == TimeZoneList[LoopVar].TimeZone) { - if (ShellCommandLineGetFlag (Package, L"-f")) { - // - // Print all info about current time zone - // - ShellPrintHiiDefaultEx (TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle); - } else { - // - // Print basic info only - // - TzMinutes = (ABS (TheTime.TimeZone)) % 60; - - ShellPrintHiiDefaultEx ( - STRING_TOKEN (STR_TIMEZONE_SIMPLE), - gShellLevel2HiiHandle, - (TheTime.TimeZone > 0 ? L"-" : L"+"), - (ABS (TheTime.TimeZone)) / 60, - TzMinutes - ); - } - - Found = TRUE; + // + // Print all info about current time zone + // + ShellPrintHiiDefaultEx (TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle); break; } } - - if (!Found) { - // - // Print basic info only - // - TzMinutes = (ABS (TheTime.TimeZone)) % 60; - - ShellPrintHiiDefaultEx ( - STRING_TOKEN (STR_TIMEZONE_SIMPLE), - gShellLevel2HiiHandle, - (TheTime.TimeZone > 0 ? L"-" : L"+"), - (ABS (TheTime.TimeZone)) / 60, - TzMinutes - ); - - if (ShellCommandLineGetFlag (Package, L"-f")) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIMEZONE_NI), gShellLevel2HiiHandle); - } - } } else { // - // TimeZone was EFI_UNSPECIFIED_TIMEZONE (local) from GetTime() + // Print basic info only // - if (ShellCommandLineGetFlag (Package, L"-f")) { - for ( LoopVar = 0 - ; LoopVar < ARRAY_SIZE (TimeZoneList) - ; LoopVar++ - ) - { - if (TheTime.TimeZone == TimeZoneList[LoopVar].TimeZone) { - // - // Print all info about current time zone - // - ShellPrintHiiDefaultEx (TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle); - break; - } - } - } else { - // - // Print basic info only - // - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIMEZONE_SIMPLE_LOCAL), gShellLevel2HiiHandle); - } + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_TIMEZONE_SIMPLE_LOCAL), gShellLevel2HiiHandle); } } From 0b982813c756569be8f54f177bde090b76e9638e Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Mon, 1 Dec 2025 16:22:30 +0100 Subject: [PATCH 0858/1172] ShellPkg/UefiShellLevel2/Ls: Flatten MainCmdLs() Remove some of the success handling conditions to flatten the MainCmdLs() function. No functional change should be induced by this patch. Signed-off-by: Pierre Gondois --- .../Library/UefiShellLevel2CommandsLib/Ls.c | 179 +++++++++--------- 1 file changed, 92 insertions(+), 87 deletions(-) diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c index bae7d5a10d40..f09b140223f4 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c @@ -790,112 +790,117 @@ MainCmdLs ( } } // if -a present - if (ShellStatus == SHELL_SUCCESS) { - PathName = ShellCommandLineGetRawValue (Package, 1); - if (PathName == NULL) { - // - // Nothing specified... must start from current directory - // - CurDir = gEfiShellProtocol->GetCurDir (NULL); - if (CurDir == NULL) { - ShellStatus = SHELL_NOT_FOUND; - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"ls"); - } + if (ShellStatus != SHELL_SUCCESS) { + return ShellStatus; + } + + PathName = ShellCommandLineGetRawValue (Package, 1); + if (PathName == NULL) { + // + // Nothing specified... must start from current directory + // + CurDir = gEfiShellProtocol->GetCurDir (NULL); + if (CurDir == NULL) { + ShellStatus = SHELL_NOT_FOUND; + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"ls"); + } - ListUnfiltered = TRUE; + ListUnfiltered = TRUE; + // + // Copy to the 2 strings for starting path and file search string + // + ASSERT (SearchString == NULL); + ASSERT (FullPath == NULL); + StrnCatGrow (&SearchString, NULL, L"*", 0); + StrnCatGrow (&FullPath, NULL, CurDir, 0); + Size = FullPath != NULL ? StrSize (FullPath) : 0; + StrnCatGrow (&FullPath, &Size, L"\\", 0); + } else { + if ((StrStr (PathName, L":") == NULL) && (gEfiShellProtocol->GetCurDir (NULL) == NULL)) { // - // Copy to the 2 strings for starting path and file search string + // If we got something and it doesnt have a fully qualified path, then we needed to have a CWD. // - ASSERT (SearchString == NULL); - ASSERT (FullPath == NULL); - StrnCatGrow (&SearchString, NULL, L"*", 0); - StrnCatGrow (&FullPath, NULL, CurDir, 0); - Size = FullPath != NULL ? StrSize (FullPath) : 0; - StrnCatGrow (&FullPath, &Size, L"\\", 0); + ShellStatus = SHELL_NOT_FOUND; + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"ls"); } else { - if ((StrStr (PathName, L":") == NULL) && (gEfiShellProtocol->GetCurDir (NULL) == NULL)) { + // + // We got a valid fully qualified path or we have a CWD + // + ASSERT ((FullPath == NULL && Size == 0) || (FullPath != NULL)); + if (StrStr (PathName, L":") == NULL) { + StrnCatGrow (&FullPath, &Size, gEfiShellProtocol->GetCurDir (NULL), 0); + if (FullPath == NULL) { + ShellCommandLineFreeVarList (Package); + return SHELL_OUT_OF_RESOURCES; + } + + Size = FullPath != NULL ? StrSize (FullPath) : 0; + StrnCatGrow (&FullPath, &Size, L"\\", 0); + } + + StrnCatGrow (&FullPath, &Size, PathName, 0); + if (FullPath == NULL) { + ShellCommandLineFreeVarList (Package); + return SHELL_OUT_OF_RESOURCES; + } + + if (ShellIsDirectory (PathName) == EFI_SUCCESS) { // - // If we got something and it doesnt have a fully qualified path, then we needed to have a CWD. + // is listing ends with a directory, then we list all files in that directory // - ShellStatus = SHELL_NOT_FOUND; - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"ls"); + ListUnfiltered = TRUE; + StrnCatGrow (&SearchString, NULL, L"*", 0); } else { // - // We got a valid fully qualified path or we have a CWD + // must split off the search part that applies to files from the end of the directory part // - ASSERT ((FullPath == NULL && Size == 0) || (FullPath != NULL)); - if (StrStr (PathName, L":") == NULL) { - StrnCatGrow (&FullPath, &Size, gEfiShellProtocol->GetCurDir (NULL), 0); - if (FullPath == NULL) { - ShellCommandLineFreeVarList (Package); - return SHELL_OUT_OF_RESOURCES; - } - - Size = FullPath != NULL ? StrSize (FullPath) : 0; - StrnCatGrow (&FullPath, &Size, L"\\", 0); - } - - StrnCatGrow (&FullPath, &Size, PathName, 0); - if (FullPath == NULL) { + StrnCatGrow (&SearchString, NULL, FullPath, 0); + if (SearchString == NULL) { + FreePool (FullPath); ShellCommandLineFreeVarList (Package); return SHELL_OUT_OF_RESOURCES; } - if (ShellIsDirectory (PathName) == EFI_SUCCESS) { - // - // is listing ends with a directory, then we list all files in that directory - // - ListUnfiltered = TRUE; - StrnCatGrow (&SearchString, NULL, L"*", 0); - } else { - // - // must split off the search part that applies to files from the end of the directory part - // - StrnCatGrow (&SearchString, NULL, FullPath, 0); - if (SearchString == NULL) { - FreePool (FullPath); - ShellCommandLineFreeVarList (Package); - return SHELL_OUT_OF_RESOURCES; - } - - PathRemoveLastItem (FullPath); - CopyMem (SearchString, SearchString + StrLen (FullPath), StrSize (SearchString + StrLen (FullPath))); - } + PathRemoveLastItem (FullPath); + CopyMem (SearchString, SearchString + StrLen (FullPath), StrSize (SearchString + StrLen (FullPath))); } } + } - Status = gRT->GetTime (&TheTime, NULL); - if (EFI_ERROR (Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"ls", L"gRT->GetTime", Status); - TheTime.TimeZone = EFI_UNSPECIFIED_TIMEZONE; - } + Status = gRT->GetTime (&TheTime, NULL); + if (EFI_ERROR (Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"ls", L"gRT->GetTime", Status); + TheTime.TimeZone = EFI_UNSPECIFIED_TIMEZONE; + } - if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = PrintLsOutput ( - ShellCommandLineGetFlag (Package, L"-r"), - RequiredAttributes, - ShellCommandLineGetFlag (Package, L"-sfo"), - FullPath, - SearchString, - NULL, - Count, - TheTime.TimeZone, - ListUnfiltered - ); - if (ShellStatus == SHELL_NOT_FOUND) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LS_FILE_NOT_FOUND), gShellLevel2HiiHandle, L"ls", FullPath); - } else if (ShellStatus == SHELL_INVALID_PARAMETER) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"ls", FullPath); - } else if (ShellStatus == SHELL_ABORTED) { - // - // Ignore aborting. - // - } else if (ShellStatus != SHELL_SUCCESS) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"ls", FullPath); - } - } + if (ShellStatus != SHELL_SUCCESS) { + goto Exit; + } + + ShellStatus = PrintLsOutput ( + ShellCommandLineGetFlag (Package, L"-r"), + RequiredAttributes, + ShellCommandLineGetFlag (Package, L"-sfo"), + FullPath, + SearchString, + NULL, + Count, + TheTime.TimeZone, + ListUnfiltered + ); + if (ShellStatus == SHELL_NOT_FOUND) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_LS_FILE_NOT_FOUND), gShellLevel2HiiHandle, L"ls", FullPath); + } else if (ShellStatus == SHELL_INVALID_PARAMETER) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"ls", FullPath); + } else if (ShellStatus == SHELL_ABORTED) { + // + // Ignore aborting. + // + } else if (ShellStatus != SHELL_SUCCESS) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"ls", FullPath); } +Exit: // // Free memory allocated // From 8e822d5d262b63a17315f1156e2277b3837b59bf Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Mon, 1 Dec 2025 16:33:39 +0100 Subject: [PATCH 0859/1172] ShellPkg/UefiShellLevel2/Ls: Bail out early in MainCmdLs() If RootPath is NULL, PrintLsOutput() will return an error code of SHELL_OUT_OF_RESOURCES and not print anything: PrintLsOutput() \-StrnCatGrow() if (Source == NULL) { return (*Destination); } Remove paths where FullPath ends up being NULL and bail out early. Signed-off-by: Pierre Gondois --- .../Library/UefiShellLevel2CommandsLib/Ls.c | 72 +++++++++---------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c index f09b140223f4..981dc301a895 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c @@ -801,8 +801,8 @@ MainCmdLs ( // CurDir = gEfiShellProtocol->GetCurDir (NULL); if (CurDir == NULL) { - ShellStatus = SHELL_NOT_FOUND; ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"ls"); + return SHELL_NOT_FOUND; } ListUnfiltered = TRUE; @@ -820,50 +820,50 @@ MainCmdLs ( // // If we got something and it doesnt have a fully qualified path, then we needed to have a CWD. // - ShellStatus = SHELL_NOT_FOUND; ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"ls"); - } else { - // - // We got a valid fully qualified path or we have a CWD - // - ASSERT ((FullPath == NULL && Size == 0) || (FullPath != NULL)); - if (StrStr (PathName, L":") == NULL) { - StrnCatGrow (&FullPath, &Size, gEfiShellProtocol->GetCurDir (NULL), 0); - if (FullPath == NULL) { - ShellCommandLineFreeVarList (Package); - return SHELL_OUT_OF_RESOURCES; - } - - Size = FullPath != NULL ? StrSize (FullPath) : 0; - StrnCatGrow (&FullPath, &Size, L"\\", 0); - } + return SHELL_NOT_FOUND; + } - StrnCatGrow (&FullPath, &Size, PathName, 0); + // + // We got a valid fully qualified path or we have a CWD + // + ASSERT ((FullPath == NULL && Size == 0) || (FullPath != NULL)); + if (StrStr (PathName, L":") == NULL) { + StrnCatGrow (&FullPath, &Size, gEfiShellProtocol->GetCurDir (NULL), 0); if (FullPath == NULL) { ShellCommandLineFreeVarList (Package); return SHELL_OUT_OF_RESOURCES; } - if (ShellIsDirectory (PathName) == EFI_SUCCESS) { - // - // is listing ends with a directory, then we list all files in that directory - // - ListUnfiltered = TRUE; - StrnCatGrow (&SearchString, NULL, L"*", 0); - } else { - // - // must split off the search part that applies to files from the end of the directory part - // - StrnCatGrow (&SearchString, NULL, FullPath, 0); - if (SearchString == NULL) { - FreePool (FullPath); - ShellCommandLineFreeVarList (Package); - return SHELL_OUT_OF_RESOURCES; - } + Size = FullPath != NULL ? StrSize (FullPath) : 0; + StrnCatGrow (&FullPath, &Size, L"\\", 0); + } - PathRemoveLastItem (FullPath); - CopyMem (SearchString, SearchString + StrLen (FullPath), StrSize (SearchString + StrLen (FullPath))); + StrnCatGrow (&FullPath, &Size, PathName, 0); + if (FullPath == NULL) { + ShellCommandLineFreeVarList (Package); + return SHELL_OUT_OF_RESOURCES; + } + + if (ShellIsDirectory (PathName) == EFI_SUCCESS) { + // + // is listing ends with a directory, then we list all files in that directory + // + ListUnfiltered = TRUE; + StrnCatGrow (&SearchString, NULL, L"*", 0); + } else { + // + // must split off the search part that applies to files from the end of the directory part + // + StrnCatGrow (&SearchString, NULL, FullPath, 0); + if (SearchString == NULL) { + FreePool (FullPath); + ShellCommandLineFreeVarList (Package); + return SHELL_OUT_OF_RESOURCES; } + + PathRemoveLastItem (FullPath); + CopyMem (SearchString, SearchString + StrLen (FullPath), StrSize (SearchString + StrLen (FullPath))); } } From 95476665c4fcb41a7eb43542e375830ada04d636 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Mon, 1 Dec 2025 17:45:59 +0100 Subject: [PATCH 0860/1172] ShellPkg/UefiShellLevel2/Ls: Remove ShellStatus check in MainCmdLs() Remove a check against ShellStatus in MainCmdLs() as there are two consecutive checks without any modification of ShellStatus. Suggested-by: Leif Lindholm Signed-off-by: Pierre Gondois --- ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c index 981dc301a895..f2587f67a4a3 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c @@ -873,10 +873,6 @@ MainCmdLs ( TheTime.TimeZone = EFI_UNSPECIFIED_TIMEZONE; } - if (ShellStatus != SHELL_SUCCESS) { - goto Exit; - } - ShellStatus = PrintLsOutput ( ShellCommandLineGetFlag (Package, L"-r"), RequiredAttributes, @@ -900,7 +896,6 @@ MainCmdLs ( ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"ls", FullPath); } -Exit: // // Free memory allocated // From 19c62fd3acd869c36dc514b5facb1ad797c366ae Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Mon, 1 Dec 2025 15:00:21 +0100 Subject: [PATCH 0861/1172] ShellPkg/UefiShellLevel2: Fix CodeQl issues Fix CodeQl issue triggered by the previous patches. - Rm: FileList might be NULL Signed-off-by: Pierre Gondois --- .../Library/UefiShellLevel2CommandsLib/Rm.c | 59 ++++++++++--------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c index 49c746ceeb76..fa71b312967c 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Rm.c @@ -321,41 +321,44 @@ MainCmdRm ( } } - if (ShellStatus == SHELL_SUCCESS) { + if ((ShellStatus != SHELL_SUCCESS) || (FileList == NULL)) { + goto Exit; + } + + // + // loop through the list and make sure we are not aborting... + // + for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode (&FileList->Link) + ; !IsNull (&FileList->Link, &Node->Link) && !ShellGetExecutionBreakFlag () + ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode (&FileList->Link, &Node->Link) + ) + { // - // loop through the list and make sure we are not aborting... + // skip the directory traversing stuff... // - for ( Node = (EFI_SHELL_FILE_INFO *)GetFirstNode (&FileList->Link) - ; !IsNull (&FileList->Link, &Node->Link) && !ShellGetExecutionBreakFlag () - ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode (&FileList->Link, &Node->Link) - ) - { - // - // skip the directory traversing stuff... - // - if ((StrCmp (Node->FileName, L".") == 0) || (StrCmp (Node->FileName, L"..") == 0)) { - continue; - } - - // - // do the deleting of nodes - // - if (EFI_ERROR (Node->Status)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_RM_LOG_DELETE_ERR2), gShellLevel2HiiHandle, Node->Status); - ShellStatus = SHELL_ACCESS_DENIED; - break; - } + if ((StrCmp (Node->FileName, L".") == 0) || (StrCmp (Node->FileName, L"..") == 0)) { + continue; + } - if (!IsValidDeleteTarget (FileList, Node, Package)) { - ShellPrintHiiDefaultEx (STRING_TOKEN (STR_RM_LOG_DELETE_ERR3), gShellLevel2HiiHandle, Node->FullName); - ShellStatus = SHELL_INVALID_PARAMETER; - break; - } + // + // do the deleting of nodes + // + if (EFI_ERROR (Node->Status)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_RM_LOG_DELETE_ERR2), gShellLevel2HiiHandle, Node->Status); + ShellStatus = SHELL_ACCESS_DENIED; + break; + } - ShellStatus = CascadeDelete (Node, ShellCommandLineGetFlag (Package, L"-q")); + if (!IsValidDeleteTarget (FileList, Node, Package)) { + ShellPrintHiiDefaultEx (STRING_TOKEN (STR_RM_LOG_DELETE_ERR3), gShellLevel2HiiHandle, Node->FullName); + ShellStatus = SHELL_INVALID_PARAMETER; + break; } + + ShellStatus = CascadeDelete (Node, ShellCommandLineGetFlag (Package, L"-q")); } +Exit: // // Free the fileList // From c75d79faae0ec0b884b39c0931ea317110f66dd8 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Tue, 4 Nov 2025 09:47:21 -0800 Subject: [PATCH 0862/1172] StandaloneMmPkg: StandaloneMmIplPei: Improve handling of MmAccess returns Previously, if an MmAccess call failed during locking and closing a MMRAM region, the logic would bail out the entire loop, leaving subsequent regions open. Additionally, the failure status was stored in `Status`, overwriting values from earlier steps. This update introduces proper handling for MmAccess PPI failures and ensures best-effort attempts to close and lock all regions when possible. Signed-off-by: Kun Qin --- .../StandaloneMmIplPei/StandaloneMmIplPei.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c index 778481ab1c71..826b1b2b19c6 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c @@ -675,6 +675,7 @@ ExecuteMmCoreFromMmram ( ) { EFI_STATUS Status; + EFI_STATUS AccessStatus; UINTN PageCount; VOID *MmHobList; UINTN MmHobSize; @@ -823,11 +824,10 @@ ExecuteMmCoreFromMmram ( // Close all MMRAM ranges, if MmAccess is available. // for (Index = 0; Index < MmramRangeCount; Index++) { - Status = MmAccess->Close ((EFI_PEI_SERVICES **)GetPeiServicesTablePointer (), MmAccess, Index); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "MM IPL failed to close MMRAM windows index %d - %r\n", Index, Status)); + AccessStatus = MmAccess->Close ((EFI_PEI_SERVICES **)GetPeiServicesTablePointer (), MmAccess, Index); + if (EFI_ERROR (AccessStatus)) { + DEBUG ((DEBUG_ERROR, "MM IPL failed to close MMRAM windows index %d - %r\n", Index, AccessStatus)); ASSERT (FALSE); - return Status; } // @@ -838,18 +838,17 @@ ExecuteMmCoreFromMmram ( // // Lock the MMRAM (Note: Locking MMRAM may not be supported on all platforms) // - Status = MmAccess->Lock ((EFI_PEI_SERVICES **)GetPeiServicesTablePointer (), MmAccess, Index); - if (EFI_ERROR (Status)) { + AccessStatus = MmAccess->Lock ((EFI_PEI_SERVICES **)GetPeiServicesTablePointer (), MmAccess, Index); + if (EFI_ERROR (AccessStatus) && (AccessStatus != EFI_UNSUPPORTED)) { // // Print error message that the MMRAM failed to lock... // - DEBUG ((DEBUG_ERROR, "MM IPL could not lock MMRAM (Index %d) after executing MM Core %r\n", Index, Status)); + DEBUG ((DEBUG_ERROR, "MM IPL could not lock MMRAM (Index %d) after executing MM Core %r\n", Index, AccessStatus)); ASSERT (FALSE); - return Status; } // - // Print debug message that the MMRAM window is now closed. + // Print debug message that the MMRAM window is now locked. // DEBUG ((DEBUG_INFO, "MM IPL locked MMRAM window index %d\n", Index)); } From 22a27c1a49f4a8cdba44127548d3a70388b331bb Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Mon, 1 Dec 2025 11:55:35 -0800 Subject: [PATCH 0863/1172] OvmfPkg/RisvVVirt: Add missing Tcg2ConfigPei and Tcg2Pei modules in FV Resolve an issue where the TPM2 device failed to be detected because the Tcg2ConfigPei and Tcg2Pei modules were not included in the firmware volume. Signed-off-by: Tuan Phan --- OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc | 4 +++- OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc index a7c4f842bbaa..db2efccab743 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc +++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc @@ -322,7 +322,6 @@ NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf } !if $(TPM2_ENABLE) == TRUE - OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.inf { Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibRouter/Tpm2DeviceLibRouterPei.inf @@ -338,6 +337,9 @@ TpmPlatformHierarchyLib|SecurityPkg/Library/PeiDxeTpmPlatformHierarchyLib/PeiDxeTpmPlatformHierarchyLib.inf } +!if $(TPM2_CONFIG_ENABLE) == TRUE + OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf +!endif !endif !else UefiCpuPkg/SecCore/SecCoreNative.inf { diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf b/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf index 1f37eb68945f..eebab647fa43 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf +++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.fdf @@ -283,6 +283,12 @@ INF UefiCpuPkg/SecCore/SecCoreNative.inf INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf INF MdeModulePkg/Universal/Variable/Pei/VariablePei.inf INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf +!if $(TPM2_ENABLE) == TRUE + INF SecurityPkg/Tcg/Tcg2Pei/Tcg2Pei.inf +!if $(TPM2_CONFIG_ENABLE) == TRUE + INF OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf +!endif +!endif !endif FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 { From 947ed6b34aa54e62e405548a456e2141589ab406 Mon Sep 17 00:00:00 2001 From: Joey Vagedes Date: Mon, 1 Dec 2025 09:47:02 -0800 Subject: [PATCH 0864/1172] .github: Use valid Fedora 43 image for BuildPlatform workflow commit 96158b3 had a typo that updated fedora to an invalid container. This was not caught in the workflows pre-CI as this particular workflow only runs post-merge. Signed-off-by: Joey Vagedes --- .github/workflows/BuildPlatform.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/BuildPlatform.yml b/.github/workflows/BuildPlatform.yml index 16d0a70bfe8d..c2b64e2d4bc3 100644 --- a/.github/workflows/BuildPlatform.yml +++ b/.github/workflows/BuildPlatform.yml @@ -61,7 +61,7 @@ jobs: runs-on: ${{ inputs.runs-on }} container: - image: ${{ startswith(inputs.runs-on, 'ubuntu') && 'ghcr.io/tianocore/containers/fedora-43-v:latest' || '' }} + image: ${{ startswith(inputs.runs-on, 'ubuntu') && 'ghcr.io/tianocore/containers/fedora-43-dev:latest' || '' }} steps: - name: Checkout From ede299f2413db9af81dc1d2cc8d315ece90afbfd Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Tue, 25 Nov 2025 15:03:51 -0800 Subject: [PATCH 0865/1172] MdeModulePkg: Fix recently introduced uninitialized variable usage. Address the build regressions, introduced in #11724, #11688, #11686 #11685. These build regressions are for uninitialized variables before use. Signed-off-by: Aaron Pop --- MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c | 8 ++++++-- MdeModulePkg/Universal/BdsDxe/BdsEntry.c | 1 + MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c | 1 + MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c | 7 +++++-- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c b/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c index 81d58b16c9a6..5c5e7aabe617 100644 --- a/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c +++ b/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c @@ -1607,11 +1607,15 @@ GetFullSmramRanges ( UINTN MaxCount; BOOLEAN Rescan; + SmmConfiguration = NULL; + TempSmramRanges = NULL; + SmramReservedRanges = NULL; + SmramRanges = NULL; + // // Get SMM Configuration Protocol if it is present. // - SmmConfiguration = NULL; - Status = gBS->LocateProtocol (&gEfiSmmConfigurationProtocolGuid, NULL, (VOID **)&SmmConfiguration); + Status = gBS->LocateProtocol (&gEfiSmmConfigurationProtocolGuid, NULL, (VOID **)&SmmConfiguration); // // Get SMRAM information. diff --git a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c b/MdeModulePkg/Universal/BdsDxe/BdsEntry.c index 8a1d8336a049..3dcc2951069d 100644 --- a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c +++ b/MdeModulePkg/Universal/BdsDxe/BdsEntry.c @@ -699,6 +699,7 @@ BdsEntry ( HotkeyTriggered = NULL; Status = EFI_SUCCESS; + BootSuccess = FALSE; // // Insert the performance probe diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c index 484407f2ef4e..809a3f9707e1 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c @@ -795,6 +795,7 @@ CompareNameElementDefault ( AppendString = NULL; NvConfigExist = NULL; + Status = EFI_OUT_OF_RESOURCES; // // Make NvConfigPtr point to the first with AltConfigHdr in DefaultAltCfgResp. // diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c b/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c index f8848f42e1b7..aec12c2c38fc 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c @@ -430,8 +430,11 @@ CreateStorage ( EFI_GUID *StorageGuid; CHAR8 *StorageName; - UnicodeString = NULL; - StorageName = NULL; + UnicodeString = NULL; + StorageName = NULL; + BrowserStorage = NULL; + Storage = NULL; + switch (StorageType) { case EFI_HII_VARSTORE_BUFFER: StorageGuid = (EFI_GUID *)(CHAR8 *)&((EFI_IFR_VARSTORE *)OpCodeData)->Guid; From 303faa460c868184c0a4757e9de87ff8092c9e0f Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Fri, 31 Oct 2025 10:23:13 +0530 Subject: [PATCH 0866/1172] MdePkg: Acpi66: Add few more RISC-V definitions Update the header with few more definitions for RISC-V released in ACPI 6.6 spec. Signed-off-by: Sunil V L --- MdePkg/Include/IndustryStandard/Acpi66.h | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/MdePkg/Include/IndustryStandard/Acpi66.h b/MdePkg/Include/IndustryStandard/Acpi66.h index 3c7a9793d1c8..49cd2686a2d7 100644 --- a/MdePkg/Include/IndustryStandard/Acpi66.h +++ b/MdePkg/Include/IndustryStandard/Acpi66.h @@ -767,7 +767,8 @@ typedef struct { #define EFI_ACPI_6_6_RINTC_STRUCTURE_VERSION 1 -#define EFI_ACPI_6_6_RINTC_FLAG_ENABLE 1 +#define EFI_ACPI_6_6_RINTC_FLAG_ENABLE BIT0 +#define EFI_ACPI_6_6_RINTC_FLAG_ONLINE_CAPABLE BIT1 /// /// RISC-V Incoming MSI Controller (IMSIC) @@ -788,6 +789,19 @@ typedef struct { #define EFI_ACPI_6_6_IMSIC_STRUCTURE_VERSION 1 +#define IMSIC_MIN_NUM_IDS 63 +#define IMSIC_MAX_NUM_IDS 2047 +#define IMSIC_MIN_NUM_GUEST_IDS 63 +#define IMSIC_MAX_NUM_GUEST_IDS 2047 +#define IMSIC_MIN_GUEST_INDEX_BITS 0 +#define IMSIC_MAX_GUEST_INDEX_BITS 7 +#define IMSIC_MIN_HART_INDEX_BITS 0 +#define IMSIC_MAX_HART_INDEX_BITS 15 +#define IMSIC_MIN_GROUP_INDEX_BITS 0 +#define IMSIC_MAX_GROUP_INDEX_BITS 7 +#define IMSIC_MIN_GROUP_INDEX_SHIFT 0 +#define IMSIC_MAX_GROUP_INDEX_SHIFT 55 + /// /// RISC-V APLIC /// @@ -3132,7 +3146,7 @@ typedef struct { // // RHCT Flags // -#define EFI_ACPI_6_6_RHCT_FLAG_TIMER_CANNOT_WAKEUP_CPU 1 +#define EFI_ACPI_6_6_RHCT_FLAG_TIMER_CANNOT_WAKEUP_CPU BIT0 // // RHCT subtables From 89327d3fd1e6d0bd5a62e0c6dea52c87cdb75c15 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Thu, 25 Jul 2024 20:12:05 +0530 Subject: [PATCH 0867/1172] DynamicTablesPkg/AcpiSsdtPcieLib: Restrict IRQ range check to ARM only Modify the interrupt flags SPI range validation to apply only for ARM architectures. This check ensures that interrupt flags are valid SPIs, but it is ARM-specific and may cause false assertions on other architectures. By enabling this check exclusively for ARM, we avoid erroneous assertions on non-ARM platforms. Signed-off-by: Sunil V L --- .../Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.c index 9876626950bd..2465e0da9f17 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.c +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieGenerator.c @@ -376,6 +376,7 @@ GeneratePrt ( goto exit_handler; } + #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) // Check that the interrupts flags are SPIs, level high. // Cf. Arm BSA v1.0, sE.6 "Legacy interrupts" if ((Index > 0) && @@ -388,6 +389,8 @@ GeneratePrt ( goto exit_handler; } + #endif + // Add the device to the DeviceTable. MappingTableAdd (&Generator->DeviceTable, IrqMapInfo->PciDevice); From f43f1f2f56fd398bd0dbd168edc7fb673d1895a2 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Tue, 2 Jul 2024 11:03:15 +0530 Subject: [PATCH 0868/1172] DynamicTablesPkg: Add RISC-V Namespace header Add a new header file to define RISC-V Namespace objects used by the Configuration Manager. Include the new header in the main Configuration Manager Object header to ensure the definitions are available where needed. Signed-off-by: Sunil V L --- .../Include/ConfigurationManagerObject.h | 13 + .../Include/RiscVNameSpaceObjects.h | 268 ++++++++++++++++++ 2 files changed, 281 insertions(+) create mode 100644 DynamicTablesPkg/Include/RiscVNameSpaceObjects.h diff --git a/DynamicTablesPkg/Include/ConfigurationManagerObject.h b/DynamicTablesPkg/Include/ConfigurationManagerObject.h index bf45af029883..c1577ea16300 100644 --- a/DynamicTablesPkg/Include/ConfigurationManagerObject.h +++ b/DynamicTablesPkg/Include/ConfigurationManagerObject.h @@ -16,6 +16,7 @@ #include #include +#include #include #include @@ -36,6 +37,7 @@ Bits: [31:28] - Name Space ID 0001 - Arch Common 0010 - ARM 0011 - X64 + 0100 - RISC-V 1111 - Custom/OEM All other values are reserved. @@ -88,6 +90,7 @@ typedef enum ObjectNameSpaceID { EObjNameSpaceArchCommon, ///< Arch Common Objects Namespace EObjNameSpaceArm, ///< ARM Objects Namespace EObjNameSpaceX64, ///< X64 Objects Namespace + EObjNameSpaceRiscV, ///< RISC-V Objects Namespace EObjNameSpaceOem = 0xF, ///< OEM Objects Namespace EObjNameSpaceMax, } EOBJECT_NAMESPACE_ID; @@ -163,6 +166,16 @@ typedef struct CmObjDescriptor { #define CREATE_CM_ARM_OBJECT_ID(ObjectId) \ (CREATE_CM_OBJECT_ID (EObjNameSpaceArm, ObjectId)) +/** This macro returns a Configuration Manager Object ID + in the RISC-V Object Namespace. + + @param [in] ObjectId The Object ID. + + @retval Returns an RISC-V Configuration Manager Object ID. +**/ +#define CREATE_CM_RISCV_OBJECT_ID(ObjectId) \ + (CREATE_CM_OBJECT_ID (EObjNameSpaceRiscV, ObjectId)) + /** This macro returns a Configuration Manager Object ID in the Arch Common Object Namespace. diff --git a/DynamicTablesPkg/Include/RiscVNameSpaceObjects.h b/DynamicTablesPkg/Include/RiscVNameSpaceObjects.h new file mode 100644 index 000000000000..8fd4813355ff --- /dev/null +++ b/DynamicTablesPkg/Include/RiscVNameSpaceObjects.h @@ -0,0 +1,268 @@ +/** @file + + Copyright (c) 2024, Ventana Micro Systems Inc. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Glossary: + - Cm or CM - Configuration Manager + - Obj or OBJ - Object + - Std or STD - Standard +**/ + +#ifndef RISCV_NAMESPACE_OBJECTS_H_ +#define RISCV_NAMESPACE_OBJECTS_H_ + +#include +#include + +#define MAX_ISA_STRING_LENGTH 1024 +#define RISCV_HWID_LENGTH 8 + +#pragma pack(1) + +/** The ERISCV_OBJECT_ID enum describes the Object IDs + in the RISCV Namespace + + Note: Whenever an entry in this enum is updated, + the following data structures must also be + updated: + - CM_OBJECT_TOKEN_FIXER TokenFixer[] in + Library\Common\DynamicPlatRepoLib\CmObjectTokenFixer.c +*/ +typedef enum RiscVObjectID { + ERiscVObjReserved, ///< 0 - Reserved + ERiscVObjRintcInfo, ///< 1 - RISC-V RINTC Info + ERiscVObjImsicInfo, ///< 2 - RISC-V IMSIC Info + ERiscVObjAplicInfo, ///< 3 - RISC-V APLIC Frame Info + ERiscVObjPlicInfo, ///< 4 - RISC-V PLIC Info + ERiscVObjIsaStringInfo, ///< 5 - RISC-V ISA String Info + ERiscVObjCmoInfo, ///< 6 - RISC-V CMO Info + ERiscVObjMmuInfo, ///< 7 - RISC-V MMU Type Info + ERiscVObjTimerInfo, ///< 8 - RISC-V Timer Type Info + ERiscVObjMax +} ERISCV_OBJECT_ID; + +/** A structure that describes the + RINTC for the Platform. + + ID: ERiscVObjRintcInfo +*/ +typedef struct CmRiscVRintcInfo { + /// Version + UINT8 Version; + + /** The flags field as described by the RINTC structure + in the ACPI Specification. + */ + UINT32 Flags; + + /// Hart ID + UINT64 HartId; + + /** The ACPI Processor UID. This must match the + _UID of the CPU Device object information described + in the DSDT/SSDT for the CPU. + */ + UINT32 AcpiProcessorUid; + + /// External Interrupt Controller ID + UINT32 ExtIntcId; + + /// IMSIC Base address + UINT64 ImsicBaseAddress; + + /// IMSIC Size + UINT32 ImsicSize; + + /** The proximity domain to which the logical processor belongs. + This field is used to populate the RINTC affinity structure + in the SRAT table. + */ + UINT32 ProximityDomain; + + /** The clock domain to which the logical processor belongs. + This field is used to populate the RINTC affinity structure + in the SRAT table. + */ + UINT32 ClockDomain; + + /** The RINTC Affinity flags field as described by the RINTC Affinity structure + in the SRAT table. + */ + UINT32 AffinityFlags; + + /// Reference Token for the CMO info of this processor. + CM_OBJECT_TOKEN CmoInfoToken; + + /// Reference Token for the ISA String info of this processor. + CM_OBJECT_TOKEN IsaStringInfoToken; + + /// Reference Token for the MMU info of this processor. + CM_OBJECT_TOKEN MmuInfoToken; + + /// Reference Token for the CPC info of this processor. + CM_OBJECT_TOKEN CpcToken; + + /** Optional field: Reference Token to the ProximityDomain this object + belongs to. If set to CM_NULL_TOKEN, the following field is used: + CM_RISCV_RINTC_INFO.ProximityDomain + */ + CM_OBJECT_TOKEN ProximityDomainToken; + + /** Optional field: Reference Token to the ClockDomain this object belongs to. + If set to CM_NULL_TOKEN, the following field is used: + CM_RISCV_RINTC_INFO.ClockDomain + */ + CM_OBJECT_TOKEN ClockDomainToken; +} CM_RISCV_RINTC_INFO; + +/** A structure that describes the + IMSIC information for the Platform. + + ID: ERiscVObjImsicInfo +*/ +typedef struct CmRiscVImsicInfo { + /// Version + UINT8 Version; + + /** The flags field as described by the IMSIC structure + in the ACPI Specification. + */ + UINT32 Flags; + + /// Number of S-mode Interrupt Identities + UINT16 NumIds; + + /// Number of guest mode Interrupt Identities + UINT16 NumGuestIds; + + /// Guest Index Bits + UINT8 GuestIndexBits; + + /// Hart Index Bits + UINT8 HartIndexBits; + + /// Group Index Bits + UINT8 GroupIndexBits; + + /// Group Index Shift + UINT8 GroupIndexShift; +} CM_RISCV_IMSIC_INFO; + +typedef struct CmRiscVPlicAplicCommonInfo { + /// Version + UINT8 Version; + + /// PLIC/APLIC ID + UINT8 Id; + + /// Number of Interrupt Sources + UINT16 NumSources; + + /** The flags field as described by the PLIC/APLIC structure + in the ACPI Specification. + */ + UINT32 Flags; + + /// Hardware ID + UINT64 Hid; + + /// Base address + UINT64 BaseAddress; + + /// Size + UINT32 Size; + + /// GSI Base + UINT32 GsiBase; +} PLIC_APLIC_COMMON_INFO; + +/** A structure that describes the + APLIC information for the Platform. + + ID: ERiscVObjAplicInfo +*/ +typedef struct CmRiscVAplicInfo { + PLIC_APLIC_COMMON_INFO PlicAplicCommonInfo; + + /// Number of IDCs + UINT16 NumIdcs; +} CM_RISCV_APLIC_INFO; + +/** A structure that describes the + PLIC information for the Platform. + + ID: ERiscVObjPlicInfo +*/ +typedef struct CmRiscVPlicInfo { + PLIC_APLIC_COMMON_INFO PlicAplicCommonInfo; + + /// Max Priority + UINT16 MaxPriority; +} CM_RISCV_PLIC_INFO; + +/** A structure that describes the + ISA string for the Platform. + + ID: ERiscVObjIsaStringInfo +*/ +typedef struct CmRiscVIsaStringInfo { + /// Reference Token + CM_OBJECT_TOKEN Token; + + /// ISA Length + UINT16 Length; + + /// ISA String + CHAR8 IsaString[MAX_ISA_STRING_LENGTH]; +} CM_RISCV_ISA_STRING_NODE; + +/** A structure that describes the + CMO of the CPU. + + ID: ERiscVObjCmoInfo +*/ +typedef struct CmRiscVCmoInfo { + /// Reference Token + CM_OBJECT_TOKEN Token; + + /// Cbom Block Size + UINT8 CbomBlockSize; + + /// Cbop Block Size + UINT8 CbopBlockSize; + + /// Cboz Block Size + UINT8 CbozBlockSize; +} CM_RISCV_CMO_NODE; + +/** A structure that describes the + MMU of the CPU. + + ID: ERiscVObjMmuInfo +*/ +typedef struct CmRiscVMmuInfo { + /// Reference Token + CM_OBJECT_TOKEN Token; + + /// MMU Type + UINT8 MmuType; +} CM_RISCV_MMU_NODE; + +/** A structure that describes the + Timer for the Platform. + + ID: ERiscVObjTimerInfo +*/ +typedef struct CmRiscVTimerInfo { + /// Flags + UINT32 Flags; + + /// Time Base Frequency + UINT64 TimeBaseFrequency; +} CM_RISCV_TIMER_INFO; + +#pragma pack() + +#endif // RISCV_NAMESPACE_OBJECTS_H_ From 8b4cca46da3373ab2dbd885ed31a77da33f69b5d Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Tue, 2 Jul 2024 11:03:55 +0530 Subject: [PATCH 0869/1172] DynamicTablesPkg/TableHelperLib: Add RISC-V structure parsers Add support for parsing RISC-V-specific structures in TableHelperLib. These parsers assist in interpreting and processing Configuration Manager (CM) objects related to RISC-V hardware components. Signed-off-by: Sunil V L --- .../ConfigurationManagerObjectParser.c | 128 +++++++++++++++++- 1 file changed, 127 insertions(+), 1 deletion(-) diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c index 92d6a3a13dcf..3eb1e43aed6b 100644 --- a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c +++ b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c @@ -880,7 +880,103 @@ STATIC CONST CM_OBJ_PARSER CmArchCommonMemoryCacheInfo[] = { */ STATIC CONST CM_OBJ_PARSER CmArchCommonObjSpcrInfoParser[] = { { "InterruptType", 1, "0x%x", NULL }, - { "TerminalType", 1, "0x%x", NULL } + { "TerminalType", 1, "0x%x", NULL }, +}; + +/** A parser for ERiscVObjRintcInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmRiscVRintcInfoParser[] = { + { "Version", 1, "0x%x", NULL }, + { "Flags", 4, "0x%x", NULL }, + { "HartId", 8, "0x%llx", NULL }, + { "AcpiProcessorUid", 4, "0x%x", NULL }, + { "ExtIntcId", 4, "0x%x", NULL }, + { "ImsicBaseAddress", 8, "0x%llx", NULL }, + { "ImsicSize", 4, "0x%llx", NULL }, + { "ProximityDomain", 4, "0x%llx", NULL }, + { "ClockDomain", 4, "0x%llx", NULL }, + { "AffinityFlags", 4, "0x%llx", NULL }, + { "CmoToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, + { "IsaStringToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, + { "MmuToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, + { "CpcToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, + { "ProximityDomainToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, + { "ClockDomainToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, +}; + +/** A parser for ERiscVObjImsicInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmRiscVImsicInfoParser[] = { + { "Version", 1, "0x%x", NULL }, + { "Flags", 4, "0x%x", NULL }, + { "NumSmodeIds", 2, "0x%x", NULL }, + { "NumGmodeIds", 2, "0x%x", NULL }, + { "GuestIndexBits", 1, "0x%x", NULL }, + { "HartIndexBits", 1, "0x%x", NULL }, + { "GroupIndexBits", 1, "0x%x", NULL }, + { "GroupIndexShift", 1, "0x%x", NULL }, +}; + +/** A parser for PLIC_APLIC_COMMON_INFO. +*/ +STATIC CONST CM_OBJ_PARSER CmPlicAplicCommonInfoParser[] = { + { "Version", 1, "0x%x", NULL }, + { "Id", 1, "0x%x", NULL }, + { "NumIrqs", 2, "0x%x", NULL }, + { "Flags", 4, "0x%x", NULL }, + { "HardwareId", 8, NULL, PrintChars }, + { "Address", 8, "0x%lx", NULL }, + { "Size", 4, "0x%x", NULL }, + { "GsiBase", 4, "0x%x", NULL }, +}; + +/** A parser for ERiscVObjAplicInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmRiscVAplicInfoParser[] = { + { "Aplic", sizeof (PLIC_APLIC_COMMON_INFO), + NULL, NULL, CmPlicAplicCommonInfoParser, + ARRAY_SIZE (CmPlicAplicCommonInfoParser) }, + { "NumIdcs", 2, "0x%x",NULL }, +}; + +/** A parser for ERiscVObjPlicInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmRiscVPlicInfoParser[] = { + { "Plic", sizeof (PLIC_APLIC_COMMON_INFO), + NULL, NULL, CmPlicAplicCommonInfoParser, + ARRAY_SIZE (CmPlicAplicCommonInfoParser) }, + { "MaxPriority", 2, "0x%x",NULL }, +}; + +/** A parser for ERiscVObjIsaStringInfo +*/ +STATIC CONST CM_OBJ_PARSER CmRiscVIsaStringInfoParser[] = { + { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, + { "ISA Length", 2, "0x%x", NULL }, + { "Isa String", MAX_ISA_STRING_LENGTH, NULL, PrintString }, +}; + +/** A parser for ERiscVObjCmoInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmRiscVCmoInfoParser[] = { + { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, + { "CBOM Block Size", 1, "0x%x", NULL }, + { "CBOP Block Size", 1, "0x%x", NULL }, + { "CBOZ Block Size", 1, "0x%x", NULL }, +}; + +/** A parser for ERiscVObjMmuInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmRiscVMmuInfoParser[] = { + { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, + { "MMU Type", 1, "0x%x", NULL }, +}; + +/** A parser for ERiscVObjTimerInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmRiscVTimerInfoParser[] = { + { "Flags", 4, "0x%x", NULL }, + { "Timer Base Frequency", 8, "0x%lx", NULL }, }; /** A Parser for EArchCommonObjTpm2DeviceInfo. @@ -1202,6 +1298,21 @@ STATIC CONST CM_OBJ_PARSER_ARRAY X64NamespaceObjectParser[] = { CM_PARSER_ADD_OBJECT_RESERVED (EX64ObjMax) }; +/** A parser for RISC-V namespace objects. +*/ +STATIC CONST CM_OBJ_PARSER_ARRAY RiscVNamespaceObjectParser[] = { + CM_PARSER_ADD_OBJECT_RESERVED (ERiscVObjReserved), + CM_PARSER_ADD_OBJECT (ERiscVObjRintcInfo, CmRiscVRintcInfoParser), + CM_PARSER_ADD_OBJECT (ERiscVObjImsicInfo, CmRiscVImsicInfoParser), + CM_PARSER_ADD_OBJECT (ERiscVObjAplicInfo, CmRiscVAplicInfoParser), + CM_PARSER_ADD_OBJECT (ERiscVObjPlicInfo, CmRiscVPlicInfoParser), + CM_PARSER_ADD_OBJECT (ERiscVObjIsaStringInfo, CmRiscVIsaStringInfoParser), + CM_PARSER_ADD_OBJECT (ERiscVObjCmoInfo, CmRiscVCmoInfoParser), + CM_PARSER_ADD_OBJECT (ERiscVObjMmuInfo, CmRiscVMmuInfoParser), + CM_PARSER_ADD_OBJECT (ERiscVObjTimerInfo, CmRiscVTimerInfoParser), + CM_PARSER_ADD_OBJECT_RESERVED (ERiscVObjMax) +}; + /** A parser for EStdObjCfgMgrInfo. */ STATIC CONST CM_OBJ_PARSER StdObjCfgMgrInfoParser[] = { @@ -1502,6 +1613,21 @@ ParseCmObjDesc ( ParserArray = &ArmNamespaceObjectParser[ObjId]; break; + case EObjNameSpaceRiscV: + if (ObjId >= ERiscVObjMax) { + ASSERT (0); + return; + } + + if (ObjId >= ARRAY_SIZE (RiscVNamespaceObjectParser)) { + DEBUG ((DEBUG_ERROR, "ObjId 0x%x is missing from the RiscVNamespaceObjectParser array\n", ObjId)); + ASSERT (0); + return; + } + + ParserArray = &RiscVNamespaceObjectParser[ObjId]; + break; + case EObjNameSpaceArchCommon: if (ObjId >= EArchCommonObjMax) { ASSERT (0); From ce5d42269186b526d68cdbbf928aae69e4aca240 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Tue, 2 Jul 2024 10:16:55 +0530 Subject: [PATCH 0870/1172] DynamicTablesPkg: Update DynamicPlatRepo for RISC-V namespace Update DynamicPlatRepo to incorporate the newly introduced RISC-V namespace. This change ensures that platform repository data aligns with RISC-V specific object definitions and structures. Currently only ARM command objects are supported to fix up the self token. However, some of the RISC-V command objects also need token fixers. Add support for RISC-V token fixers. This update is necessary to support RISC-V ACPI table generation and platform configuration management. Signed-off-by: Sunil V L --- .../DynamicPlatRepoLib/CmObjectTokenFixer.c | 123 ++++++++++++++++-- .../DynamicPlatRepoLib/DynamicPlatRepo.c | 89 ++++++++++++- .../DynamicPlatRepoInternal.h | 9 ++ 3 files changed, 211 insertions(+), 10 deletions(-) diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTokenFixer.c b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTokenFixer.c index 5325b20743e8..319ca6866a56 100644 --- a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTokenFixer.c +++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTokenFixer.c @@ -136,13 +136,85 @@ TokenFixerSmmuV3Node ( return EFI_SUCCESS; } +/** ERiscVObjIsaString token fixer. + + CmObjectToken fixer function that updates the Tokens in the CmObjects. + + @param [in] CmObject Pointer to the Configuration Manager Object. + @param [in] Token Token to be updated in the CmObject. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_UNSUPPORTED Not supported. +**/ +STATIC +EFI_STATUS +EFIAPI +TokenFixerIsaStringNode ( + IN CM_OBJ_DESCRIPTOR *CmObject, + IN CM_OBJECT_TOKEN Token + ) +{ + ASSERT (CmObject != NULL); + ((CM_RISCV_ISA_STRING_NODE *)CmObject->Data)->Token = Token; + return EFI_SUCCESS; +} + +/** ERiscVObjCmoNode token fixer. + + CmObjectToken fixer function that updates the Tokens in the CmObjects. + + @param [in] CmObject Pointer to the Configuration Manager Object. + @param [in] Token Token to be updated in the CmObject. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_UNSUPPORTED Not supported. +**/ +STATIC +EFI_STATUS +EFIAPI +TokenFixerCmoNode ( + IN CM_OBJ_DESCRIPTOR *CmObject, + IN CM_OBJECT_TOKEN Token + ) +{ + ASSERT (CmObject != NULL); + ((CM_RISCV_CMO_NODE *)CmObject->Data)->Token = Token; + return EFI_SUCCESS; +} + +/** ERiscVObjMmuNode token fixer. + + CmObjectToken fixer function that updates the Tokens in the CmObjects. + + @param [in] CmObject Pointer to the Configuration Manager Object. + @param [in] Token Token to be updated in the CmObject. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_UNSUPPORTED Not supported. +**/ +STATIC +EFI_STATUS +EFIAPI +TokenFixerMmuNode ( + IN CM_OBJ_DESCRIPTOR *CmObject, + IN CM_OBJECT_TOKEN Token + ) +{ + ASSERT (CmObject != NULL); + ((CM_RISCV_MMU_NODE *)CmObject->Data)->Token = Token; + return EFI_SUCCESS; +} + /** TokenFixer functions table. A CmObj having a CM_OBJECT_TOKEN field might need to have its Token fixed. Each CmObj can have its Token in a specific way. */ CONST -CM_OBJECT_TOKEN_FIXER TokenFixer[EArmObjMax] = { +CM_OBJECT_TOKEN_FIXER ArmTokenFixer[EArmObjMax] = { NULL, ///< 0 - Reserved NULL, ///< 1 - Boot Architecture Info NULL, ///< 2 - GIC CPU Interface Info @@ -169,6 +241,24 @@ CM_OBJECT_TOKEN_FIXER TokenFixer[EArmObjMax] = { NULL ///< 23 - Embedded Trace Extension/Module Info }; +/** TokenFixer functions table for RISC-V. + + A CmObj having a CM_OBJECT_TOKEN field might need to have its + Token fixed. Each CmObj can have its Token in a specific way. +*/ +CONST +CM_OBJECT_TOKEN_FIXER RiscVTokenFixer[ERiscVObjMax] = { + NULL, ///< 0 - Reserved + NULL, ///< 1 - RINTC Info + NULL, ///< 2 - IMSIC Info + NULL, ///< 3 - APLIC Info + NULL, ///< 4 - PLIC Info + TokenFixerIsaStringNode, ///< 5 - ISA String Info + TokenFixerCmoNode, ///< 6 - CMO Info + TokenFixerMmuNode, ///< 7 - MMU Info + NULL, ///< 8 - Timer Type Info +}; + /** CmObj token fixer. Some CmObj structures have a self-token, i.e. they are storing their own @@ -192,26 +282,41 @@ FixupCmObjectSelfToken ( EFI_STATUS Status; CM_OBJECT_TOKEN_FIXER TokenFixerFunc; CM_OBJECT_ID ArmNamespaceObjId; + CM_OBJECT_ID RiscVNamespaceObjId; if (CmObjDesc == NULL) { ASSERT (0); return EFI_INVALID_PARAMETER; } - // Only support Arm objects for now. - if (GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId) != EObjNameSpaceArm) { + // Only support Arm and RISC-V objects for now. + if ((GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId) != EObjNameSpaceArm) && + (GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId) != EObjNameSpaceRiscV)) + { ASSERT (0); return EFI_UNSUPPORTED; } - ArmNamespaceObjId = GET_CM_OBJECT_ID (CmObjDesc->ObjectId); - if (ArmNamespaceObjId >= EArmObjMax) { - ASSERT (0); - return EFI_INVALID_PARAMETER; + if (GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId) == EObjNameSpaceArm) { + ArmNamespaceObjId = GET_CM_OBJECT_ID (CmObjDesc->ObjectId); + if (ArmNamespaceObjId >= EArmObjMax) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + // Fixup self-token if necessary. + TokenFixerFunc = ArmTokenFixer[ArmNamespaceObjId]; + } else if (GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId) == EObjNameSpaceRiscV) { + RiscVNamespaceObjId = GET_CM_OBJECT_ID (CmObjDesc->ObjectId); + if (RiscVNamespaceObjId >= ERiscVObjMax) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + // Fixup self-token if necessary. + TokenFixerFunc = RiscVTokenFixer[RiscVNamespaceObjId]; } - // Fixup self-token if necessary. - TokenFixerFunc = TokenFixer[ArmNamespaceObjId]; if (TokenFixerFunc != NULL) { Status = TokenFixerFunc (CmObjDesc, Token); if (EFI_ERROR (Status)) { diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepo.c b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepo.c index fb8e0b44f530..b7b246979ba8 100644 --- a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepo.c +++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepo.c @@ -163,6 +163,13 @@ DynPlatRepoAddObject ( } ObjList = &This->ArmCmObjList[ObjId]; + } else if (EObjNameSpaceRiscV == NamespaceId) { + if (ObjId >= ERiscVObjMax) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + ObjList = &This->RiscVCmObjList[ObjId]; } else if (EObjNameSpaceArchCommon == NamespaceId) { if ((ObjId >= EArchCommonObjMax) || ((CmObjDesc->Count > 1) && (ObjId != EArchCommonObjCmRef))) @@ -190,7 +197,7 @@ DynPlatRepoAddObject ( } // Fixup self-token if necessary. - if (EObjNameSpaceArm == NamespaceId) { + if ((EObjNameSpaceArm == NamespaceId) || (EObjNameSpaceRiscV == NamespaceId)) { Status = FixupCmObjectSelfToken (&ObjNode->CmObjDesc, NewToken); if (EFI_ERROR (Status)) { FreeCmObjNode (ObjNode); @@ -257,6 +264,14 @@ GroupCmObjNodes ( ListHead = &This->ArmCmObjList[ObjIndex]; ObjArray = &This->ArmCmObjArray[ObjIndex]; + } else if (NamespaceId == EObjNameSpaceRiscV) { + if (ObjIndex >= ERiscVObjMax) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + ListHead = &This->RiscVCmObjList[ObjIndex]; + ObjArray = &This->RiscVCmObjArray[ObjIndex]; } else if (NamespaceId == EObjNameSpaceArchCommon) { if (ObjIndex >= EArchCommonObjMax) { ASSERT (0); @@ -402,6 +417,14 @@ DynamicPlatRepoFinalise ( } } // for + for (ObjIndex = 0; ObjIndex < ERiscVObjMax; ObjIndex++) { + Status = GroupCmObjNodes (This, EObjNameSpaceRiscV, (UINT32)ObjIndex); + if (EFI_ERROR (Status)) { + ASSERT (0); + goto error_handler; + } + } // for + for (ObjIndex = 0; ObjIndex < EArchCommonObjMax; ObjIndex++) { Status = GroupCmObjNodes (This, EObjNameSpaceArchCommon, (UINT32)ObjIndex); if (EFI_ERROR (Status)) { @@ -464,6 +487,13 @@ DynamicPlatRepoGetObject ( } Desc = &This->ArmCmObjArray[ObjId]; + } else if (NamespaceId == EObjNameSpaceRiscV) { + if (ObjId >= ERiscVObjMax) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + Desc = &This->RiscVCmObjArray[ObjId]; } else if (NamespaceId == EObjNameSpaceArchCommon) { if ((ObjId >= EArchCommonObjMax) || ((ObjId == EArchCommonObjCmRef) && @@ -540,6 +570,10 @@ DynamicPlatRepoInit ( InitializeListHead (&Repo->ArmCmObjList[Index]); } + for (Index = 0; Index < ERiscVObjMax; Index++) { + InitializeListHead (&Repo->RiscVCmObjList[Index]); + } + for (Index = 0; Index < EArchCommonObjMax; Index++) { InitializeListHead (&Repo->ArchCommonCmObjList[Index]); } @@ -552,6 +586,8 @@ DynamicPlatRepoInit ( return EFI_SUCCESS; } +#if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) + /** Free Arm Namespace objects. Free all the memory allocated for the Arm namespace objects in the @@ -593,6 +629,53 @@ DynamicPlatRepoFreeArmObjects ( } // for } +#endif + +#if defined (MDE_CPU_RISCV64) + +/** Free RISC-V Namespace objects. + + Free all the memory allocated for the Arm namespace objects in the + dynamic platform repository. + + @param [in] DynPlatRepo The dynamic platform repository. + +**/ +STATIC +VOID +EFIAPI +DynamicPlatRepoFreeRiscVObjects ( + IN DYNAMIC_PLATFORM_REPOSITORY_INFO *DynPlatRepo + ) +{ + UINT32 Index; + LIST_ENTRY *ListHead; + CM_OBJ_DESCRIPTOR *CmObjDesc; + VOID *Data; + + ASSERT (DynPlatRepo != NULL); + + // Free the list of objects. + for (Index = 0; Index < ERiscVObjMax; Index++) { + // Free all the nodes with this object Id. + ListHead = &DynPlatRepo->RiscVCmObjList[Index]; + while (!IsListEmpty (ListHead)) { + FreeCmObjNode ((CM_OBJ_NODE *)GetFirstNode (ListHead)); + } // while + } // for + + // Free the arrays. + CmObjDesc = DynPlatRepo->RiscVCmObjArray; + for (Index = 0; Index < ERiscVObjMax; Index++) { + Data = CmObjDesc[Index].Data; + if (Data != NULL) { + FreePool (Data); + } + } // for +} + +#endif + /** Free Arch Common Namespace objects. Free all the memory allocated for the Arch Common namespace objects in the @@ -656,7 +739,11 @@ DynamicPlatRepoShutdown ( return EFI_INVALID_PARAMETER; } + #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) DynamicPlatRepoFreeArmObjects (DynPlatRepo); + #elif defined (MDE_CPU_RISCV64) + DynamicPlatRepoFreeRiscVObjects (DynPlatRepo); + #endif DynamicPlatRepoFreeArchCommonObjects (DynPlatRepo); // Free the TokenMapper diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepoInternal.h b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepoInternal.h index 0c842bc2d535..7ec16607335f 100644 --- a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepoInternal.h +++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepoInternal.h @@ -67,6 +67,15 @@ typedef struct DynamicPlatformRepositoryInfo { /// This array is populated when the Repo is finalized. CM_OBJ_DESCRIPTOR ArmCmObjArray[EArmObjMax]; + /// Link lists of CmObj from the RiscVNameSpace + /// that are added in the Transient state. + LIST_ENTRY RiscVCmObjList[ERiscVObjMax]; + + /// Structure Members used in Finalized state. + /// An array of CmObj Descriptors from the RiscVNameSpace + /// This array is populated when the Repo is finalized. + CM_OBJ_DESCRIPTOR RiscVCmObjArray[ERiscVObjMax]; + /// Link lists of CmObj from the ArchCommon Namespace /// that are added in the Transient state. LIST_ENTRY ArchCommonCmObjList[EArchCommonObjMax]; From 261e7715a1a302ad2b44d10d357a9ef456b9c7ee Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Thu, 20 Jun 2024 17:36:16 +0530 Subject: [PATCH 0871/1172] DynamicTablesPkg/AcpiSsdtCpuTopologyLib: Add RISC-V support Add support for generating CPU topology information for RISC-V platforms based on RINTC structures. Signed-off-by: Sunil V L --- .../RiscV/RiscVSsdtCpuTopologyGenerator.c | 189 ++++++++++++++++++ .../SsdtCpuTopologyLib.inf | 3 + 2 files changed, 192 insertions(+) create mode 100644 DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/RiscV/RiscVSsdtCpuTopologyGenerator.c diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/RiscV/RiscVSsdtCpuTopologyGenerator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/RiscV/RiscVSsdtCpuTopologyGenerator.c new file mode 100644 index 000000000000..2e90e8310004 --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/RiscV/RiscVSsdtCpuTopologyGenerator.c @@ -0,0 +1,189 @@ +/** @file + RISC-V SSDT Cpu Topology Table Generator Helpers. + + Copyright (c) 2024, Ventana Micro Systems Inc. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - TBD + + @par Glossary: +**/ + +#include +#include +#include +#include +#include +#include + +// Module specific include files. +#include +#include +#include +#include +#include +#include +#include + +#include "SsdtCpuTopologyGenerator.h" + +/** This macro expands to a function that retrieves the RINTC + CPU interface Information from the Configuration Manager. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceRiscV, + ERiscVObjRintcInfo, + CM_RISCV_RINTC_INFO + ); + +/** Create the processor hierarchy AML tree from CM_RISCV_RINTC_INFO + CM objects. + + A processor container is by extension any non-leave device in the cpu topology. + + @param [in] Generator The SSDT Cpu Topology generator. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] ScopeNode Scope node handle ('\_SB' scope). + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. +**/ +EFI_STATUS +EFIAPI +CreateTopologyFromIntC ( + IN ACPI_CPU_TOPOLOGY_GENERATOR *Generator, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN AML_OBJECT_NODE_HANDLE ScopeNode + ) +{ + EFI_STATUS Status; + CM_RISCV_RINTC_INFO *RintcInfo; + UINT32 RintcInfoCount; + UINT32 Index; + AML_OBJECT_NODE_HANDLE CpuNode; + + ASSERT (Generator != NULL); + ASSERT (CfgMgrProtocol != NULL); + ASSERT (ScopeNode != NULL); + + Status = GetERiscVObjRintcInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &RintcInfo, + &RintcInfoCount + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + // For each CM_RISCV_RINTC_INFO object, create an AML node. + for (Index = 0; Index < RintcInfoCount; Index++) { + Status = CreateAmlCpu ( + Generator, + ScopeNode, + RintcInfo[Index].AcpiProcessorUid, + Index, + &CpuNode + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + break; + } + + // If a CPC info is associated with the + // Rintcinfo, create an _CPC method returning them. + if (RintcInfo[Index].CpcToken != CM_NULL_TOKEN) { + Status = CreateAmlCpcNode (Generator, CfgMgrProtocol, RintcInfo[Index].CpcToken, CpuNode); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + break; + } + } + } // for + + return Status; +} + +/** Get UID, CpcToken and EtToken from local interrupt controller structure. + + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] IntCToken Unique Local INTC token to find the correct + INTC info structure. + @param [out] AcpiProcessorUid UID of the CPU. + @param [out] CpcToken CpcToken of the CPU / local INTC. + @param [out] EtToken EtToken of the CPU / local INTC. + + @retval EFI_SUCCESS Success. + @retval EFI_NOT_FOUND INTC structure not found. +**/ +EFI_STATUS +EFIAPI +GetIntCInfo ( + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN CM_OBJECT_TOKEN IntCToken, + OUT UINT32 *AcpiProcessorUid, + OUT CM_OBJECT_TOKEN *CpcToken, + OUT CM_OBJECT_TOKEN *EtToken + ) +{ + EFI_STATUS Status; + CM_RISCV_RINTC_INFO *RintcInfo; + + Status = GetERiscVObjRintcInfo ( + CfgMgrProtocol, + IntCToken, + &RintcInfo, + NULL + ); + if (EFI_ERROR (Status)) { + return Status; + } + + if (AcpiProcessorUid != NULL) { + *AcpiProcessorUid = RintcInfo->AcpiProcessorUid; + } + + if (CpcToken != NULL) { + *CpcToken = RintcInfo->CpcToken; + } + + *EtToken = CM_NULL_TOKEN; // RISC-V doesn't have EtToken + + return Status; +} + +/** Add arch specific information to a CPU node in the asl description. + + @param [in] Generator The SSDT Cpu Topology generator. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] AcpiIdObjectToken AcpiIdObjectToken identifying the CPU to fetch the + other fields from. + @param [in] CpuName Value used to generate the CPU node name. + @param [out] CpuNode CPU Node to which the ET device node is + attached. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. + @retval EFI_UNSUPPORTED Feature Unsupported. + @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. +**/ +EFI_STATUS +EFIAPI +AddArchAmlCpuInfo ( + IN ACPI_CPU_TOPOLOGY_GENERATOR *Generator, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN CM_OBJECT_TOKEN AcpiIdObjectToken, + IN UINT32 CpuName, + OUT AML_OBJECT_NODE_HANDLE *CpuNode + ) +{ + return EFI_SUCCESS; +} diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf index aa1c0c40ab3d..5ad55d74d2f8 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf @@ -27,6 +27,9 @@ [Sources.X64] X64/X64SsdtCpuTopologyGenerator.c +[Sources.RISCV64] + RiscV/RiscVSsdtCpuTopologyGenerator.c + [Packages.AARCH64] ArmPlatformPkg/ArmPlatformPkg.dec From 7cd967bb6318a4203c13dd6345e8c2152c9c515e Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Tue, 2 Jul 2024 11:30:19 +0530 Subject: [PATCH 0872/1172] DynamicTablesPkg/AcpiFadtLib: Add RISC-V support Add support for generating the Fixed ACPI Description Table (FADT) for RISC-V platforms using the common FADT generator. Signed-off-by: Sunil V L --- .../Acpi/Common/AcpiFadtLib/AcpiFadtLib.inf | 3 + .../AcpiFadtLib/RiscV/RiscVFadtGenerator.c | 58 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 DynamicTablesPkg/Library/Acpi/Common/AcpiFadtLib/RiscV/RiscVFadtGenerator.c diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiFadtLib/AcpiFadtLib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiFadtLib/AcpiFadtLib.inf index edff640422eb..e39b959aa54d 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiFadtLib/AcpiFadtLib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiFadtLib/AcpiFadtLib.inf @@ -27,6 +27,9 @@ [Sources.X64] X64/X64FadtGenerator.c +[Sources.RISCV64] + RiscV/RiscVFadtGenerator.c + [Packages] MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiFadtLib/RiscV/RiscVFadtGenerator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiFadtLib/RiscV/RiscVFadtGenerator.c new file mode 100644 index 000000000000..00d229c76685 --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiFadtLib/RiscV/RiscVFadtGenerator.c @@ -0,0 +1,58 @@ +/** @file + RISC-V FADT Table Helpers + + Copyright (c) 2024-2025, Ventana Micro Systems Inc. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - ACPI 6.6 Specification, May, 2025 + +**/ + +#include +#include +#include + +// Module specific include files. +#include +#include +#include +#include +#include +#include "FadtGenerator.h" + +/** This macro defines the FADT flag options for RISC-V Platforms. + * REVISIT: We should use FADT v6.6 for RISC-V but it needs entire + * DynamicTablesPkg to move to ACPI 6.6. The flags are same in 6.5 + * and 6.6. So, use 6.6 flags itself to avoid future change. +*/ +#define FADT_FLAGS (EFI_ACPI_6_6_HW_REDUCED_ACPI | \ + EFI_ACPI_6_6_LOW_POWER_S0_IDLE_CAPABLE) + +/** Updates the Architecture specific information in the FADT Table. + + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in, out] Fadt Pointer to the constructed ACPI Table. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND The required object was not found. + @retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration + Manager is less than the Object size for the + requested object. +**/ +EFI_STATUS +EFIAPI +FadtArchUpdate ( + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN OUT EFI_ACPI_6_5_FIXED_ACPI_DESCRIPTION_TABLE *Fadt + ) +{ + ASSERT (CfgMgrProtocol != NULL); + ASSERT (Fadt != NULL); + + Fadt->Flags = FADT_FLAGS; + + return EFI_SUCCESS; +} From 7b6ba9f31f7c5c3d6dcaed67babc2adba2147bd9 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Mon, 24 Jun 2024 21:51:46 +0530 Subject: [PATCH 0873/1172] DynamicTablesPkg/AcpiDbg2Lib: Add RISC-V support Add support for generating the ACPI DBG2 (Debug Port Table) for RISC-V platforms. Signed-off-by: Sunil V L --- .../Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf | 5 +- .../AcpiDbg2Lib/RiscV/RiscVDbg2Generator.c | 59 +++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/RiscV/RiscVDbg2Generator.c diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf index 6f1442192e2a..88be8419cdb7 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf @@ -27,7 +27,10 @@ [Sources.X64] Dbg2GeneratorNull.c -[Packages.AARCH64] +[Sources.RISCV64] + RiscV/RiscVDbg2Generator.c + +[Packages.ARM, Packages.AARCH64] ArmPlatformPkg/ArmPlatformPkg.dec [Packages] diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/RiscV/RiscVDbg2Generator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/RiscV/RiscVDbg2Generator.c new file mode 100644 index 000000000000..a6727c8caf18 --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/RiscV/RiscVDbg2Generator.c @@ -0,0 +1,59 @@ +/** @file + RISC-V DBG2 Table Generator + + Copyright (c) 2024, Ventana Micro Systems Inc. All rights reserved.
    + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - Microsoft Debug Port Table 2 (DBG2) Specification +**/ + +#include +#include +#include "Dbg2Generator.h" + +/** + Initialise the serial port to the specified settings. + The serial port is re-configured only if the specified settings + are different from the current settings. + All unspecified settings will be set to the default values. + + @param SerialPortInfo CM_ARCH_COMMON_SERIAL_PORT_INFO object describing + the serial port. + @param BaudRate The baud rate of the serial device. If the + baud rate is not supported, the speed will be + reduced to the nearest supported one and the + variable's value will be updated accordingly. + @param ReceiveFifoDepth The number of characters the device will + buffer on input. Value of 0 will use the + device's default FIFO depth. + @param Parity If applicable, this is the EFI_PARITY_TYPE + that is computed or checked as each character + is transmitted or received. If the device + does not support parity, the value is the + default parity value. + @param DataBits The number of data bits in each character. + @param StopBits If applicable, the EFI_STOP_BITS_TYPE number + of stop bits per character. + If the device does not support stop bits, the + value is the default stop bit value. + + @retval RETURN_SUCCESS All attributes were set correctly on the + serial device. + @retval RETURN_INVALID_PARAMETER One or more of the attributes has an + unsupported value. +**/ +RETURN_STATUS +EFIAPI +Dbg2InitializePort ( + IN CONST CM_ARCH_COMMON_SERIAL_PORT_INFO *SerialPortInfo, + IN OUT UINT64 *BaudRate, + IN OUT UINT32 *ReceiveFifoDepth, + IN OUT EFI_PARITY_TYPE *Parity, + IN OUT UINT8 *DataBits, + IN OUT EFI_STOP_BITS_TYPE *StopBits + ) +{ + // Nothing to do. + return EFI_SUCCESS; +} From 2ad2a4d07631598e187da3730df730516f977e24 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Mon, 24 Jun 2024 21:52:29 +0530 Subject: [PATCH 0874/1172] DynamicTablesPkg/AcpiSratLib: Add RISC-V support Add support for generating the ACPI SRAT (System Resource Affinity Table) for RISC-V platforms. Signed-off-by: Sunil V L --- .../Acpi/Common/AcpiSratLib/AcpiSratLib.inf | 5 +- .../AcpiSratLib/RiscV/RiscVSratGenerator.c | 200 ++++++++++++++++++ 2 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/RiscV/RiscVSratGenerator.c diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf index 5e6587358eb7..56adb9850a76 100644 --- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf @@ -24,9 +24,12 @@ [Sources.AARCH64] Arm/ArmSratGenerator.c -[Sources.X64] +[Sources.IA32, Sources.X64] X64/X64SratGenerator.c +[Sources.RISCV64] + RiscV/RiscVSratGenerator.c + [Packages] EmbeddedPkg/EmbeddedPkg.dec DynamicTablesPkg/DynamicTablesPkg.dec diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/RiscV/RiscVSratGenerator.c b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/RiscV/RiscVSratGenerator.c new file mode 100644 index 000000000000..6a4da0c9dc0a --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/RiscV/RiscVSratGenerator.c @@ -0,0 +1,200 @@ +/** @file + RISC-V SRAT Table Generator + + Copyright (c) 2024 Ventana Micro Systems Inc. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - ACPI 6.6 Specification + + @par Glossary: + - Cm or CM - Configuration Manager + - Obj or OBJ - Object +**/ + +#include +#include +#include +#include +#include +#include + +// Module specific include files. +#include +#include +#include +#include +#include +#include + +#include "SratGenerator.h" + +/** + RISC-V standard SRAT Generator + + Requirements: + The following Configuration Manager Object(s) are used by this Generator: + - ERiscVObjRintcInfo (REQUIRED) +*/ + +/** This macro expands to a function that retrieves the RINTC + Information from the Configuration Manager. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceRiscV, + ERiscVObjRintcInfo, + CM_RISCV_RINTC_INFO + ); + +typedef struct SratSubTable { + /// Start offset of the arch specific sub-table. + UINT32 Offset; + + /// Count + UINT32 Count; + + /// Array of CmInfo objects of the relevant type. + VOID *CmInfo; +} SRAT_SUB_TABLE; + +STATIC SRAT_SUB_TABLE mSratSubTable; + +/** Reserve arch sub-tables space. + + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + @param [in, out] ArchOffset On input, contains the offset where arch specific + sub-tables can be written. It is expected that + there enough space to write all the arch specific + sub-tables from this offset onward. + On ouput, contains the ending offset of the arch + specific sub-tables. + + @retval EFI_SUCCESS Table generated successfully. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND The required object information is not found. + @retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration + Manager is less than the Object size for the + requested object. +**/ +EFI_STATUS +EFIAPI +ArchReserveOffsets ( + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN OUT UINT32 *ArchOffset + ) +{ + EFI_STATUS Status; + + ASSERT (CfgMgrProtocol != NULL); + ASSERT (ArchOffset != NULL); + + Status = GetERiscVObjRintcInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + (CM_RISCV_RINTC_INFO **)&mSratSubTable.CmInfo, + &mSratSubTable.Count + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SRAT: Failed to get RINTC Info. Status = %r\n", + Status + )); + return Status; + } + + if (mSratSubTable.Count == 0) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SRAT: RINTC information not provided.\n" + )); + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + mSratSubTable.Offset = *ArchOffset; + *ArchOffset += (sizeof (EFI_ACPI_6_6_RINTC_AFFINITY_STRUCTURE) * mSratSubTable.Count); + + return EFI_SUCCESS; +} + +/** Add the RINTC Affinity Structures in the SRAT Table. + + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] Srat Pointer to the SRAT Table. +**/ +STATIC +VOID +EFIAPI +AddRINTCAffinity ( + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN EFI_ACPI_6_3_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER *CONST Srat + ) +{ + EFI_ACPI_6_6_RINTC_AFFINITY_STRUCTURE *RintcAff; + CM_RISCV_RINTC_INFO *RintcInfo; + EFI_STATUS Status; + + RintcInfo = mSratSubTable.CmInfo; + RintcAff = (EFI_ACPI_6_6_RINTC_AFFINITY_STRUCTURE *)((UINT8 *)Srat + mSratSubTable.Offset); + + while (mSratSubTable.Count-- != 0) { + DEBUG ((DEBUG_INFO, "SRAT: RintcAff = 0x%p\n", RintcAff)); + + RintcAff->Type = EFI_ACPI_6_6_RINTC_AFFINITY; + RintcAff->Length = sizeof (EFI_ACPI_6_6_RINTC_AFFINITY_STRUCTURE); + RintcAff->AcpiProcessorUid = RintcInfo->AcpiProcessorUid; + RintcAff->Flags = RintcInfo->AffinityFlags; + + Status = GetProximityDomainId ( + CfgMgrProtocol, + RintcInfo->ProximityDomain, + RintcInfo->ProximityDomainToken, + &RintcAff->ProximityDomain + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return; + } + + Status = GetProximityDomainId ( + CfgMgrProtocol, + RintcInfo->ClockDomain, + RintcInfo->ClockDomainToken, + &RintcAff->ClockDomain + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return; + } + + // Next + RintcAff++; + RintcInfo++; + }// while +} + +/** Add the arch specific sub-tables to the SRAT table. + + These sub-tables are written in the space reserved beforehand. + + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in] Srat Pointer to the SRAT Table. + + @retval EFI_SUCCESS Table generated successfully. +**/ +EFI_STATUS +EFIAPI +AddArchObjects ( + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN EFI_ACPI_6_3_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER *CONST Srat + ) +{ + ASSERT (CfgMgrProtocol != NULL); + ASSERT (Srat != NULL); + + AddRINTCAffinity (CfgMgrProtocol, Srat); + return EFI_SUCCESS; +} From 58f59f60d68a961c733db1438834e01d6ab5513a Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Wed, 27 Nov 2024 10:19:11 +0530 Subject: [PATCH 0875/1172] DynamicTablesPkg: Add basic RISC-V support to DynamicTables.dsc.inc Add initial support for RISC-V in DynamicTables.dsc.inc by including common ACPI table generators required for RISC-V platforms. This lays the groundwork for enabling RISC-V-specific dynamic table generation in the platform firmware. Signed-off-by: Sunil V L --- DynamicTablesPkg/DynamicTables.dsc.inc | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc index 5d1649f6530f..0739044d2a73 100644 --- a/DynamicTablesPkg/DynamicTables.dsc.inc +++ b/DynamicTablesPkg/DynamicTables.dsc.inc @@ -30,7 +30,7 @@ [LibraryClasses.AARCH64] DynamicTablesScmiInfoLib|DynamicTablesPkg/Library/DynamicTablesScmiInfoLib/DynamicTablesScmiInfoLib.inf -[Components.ARM, Components.AARCH64, Components.X64] +[Components.ARM, Components.AARCH64, Components.X64, Components.RISCV64] # # Generators (Common) # @@ -149,3 +149,26 @@ NULL|DynamicTablesPkg/Library/Smbios/SmbiosType4Lib/SmbiosType4Lib.inf NULL|DynamicTablesPkg/Library/Smbios/SmbiosType7Lib/SmbiosType7Lib.inf } + +[Components.RISCV64] + # + # Dynamic Table Factory Dxe + # + DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.inf { + + NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiDbg2Lib/AcpiDbg2Lib.inf + NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiFadtLib/AcpiFadtLib.inf + NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiMcfgLib/AcpiMcfgLib.inf + NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiPcctLib/AcpiPcctLib.inf + NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiPpttLib/AcpiPpttLib.inf + NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiRawLib/AcpiRawLib.inf + NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSpcrLib/AcpiSpcrLib.inf + NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf + + # AML Fixup + NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtSerialPortLib/SsdtSerialPortLib.inf + + # AML Codegen + NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf + NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieLib.inf + } From 36670a4bda6d50b1146c297ba9bf3f4e3be5333c Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Thu, 20 Jun 2024 18:20:33 +0530 Subject: [PATCH 0876/1172] DynamicTablesPkg/DynamicTableManagerDxe: Add RISC-V support Add RISC-V-specific mAcpiVerifyTables entries to enable verification of RISC-V ACPI tables during Dynamic Table Manager execution. This ensures that RISC-V ACPI tables such as MADT, RHCT, and others are properly validated and integrated at runtime. Signed-off-by: Sunil V L --- .../DynamicTableManagerDxe.inf | 3 + .../RiscV/RiscVDynamicTableManagerDxe.c | 64 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 DynamicTablesPkg/Drivers/DynamicTableManagerDxe/RiscV/RiscVDynamicTableManagerDxe.c diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf index dcbe95c6c65b..a933d83998a5 100644 --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.inf @@ -35,6 +35,9 @@ [Sources.X64] X64/X64DynamicTableManager.c +[Sources.RISCV64] + RiscV/RiscVDynamicTableManagerDxe.c + [Packages] MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/RiscV/RiscVDynamicTableManagerDxe.c b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/RiscV/RiscVDynamicTableManagerDxe.c new file mode 100644 index 000000000000..463b0e974923 --- /dev/null +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/RiscV/RiscVDynamicTableManagerDxe.c @@ -0,0 +1,64 @@ +/** @file + RISC-V Dynamic Table Manager Dxe + + Copyright (c) 2024, Ventana Micro Systems Inc. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include + +// Module specific include files. +#include +#include +#include +#include +#include +#include +#include +#include "DynamicTableManagerDxe.h" + +/// +/// Array containing the ACPI tables to check. +/// We require the FADT, MADT, RHCT and the DSDT tables to boot. +/// This list also include optional ACPI tables: DBG2, SPCR. +/// The FADT table must be placed at index 0. +/// +STATIC ACPI_TABLE_PRESENCE_INFO mAcpiVerifyTables[] = { + { EStdAcpiTableIdFadt, EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE, "FADT", TRUE, 0 }, + { EStdAcpiTableIdMadt, EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE, "MADT", TRUE, 0 }, + { EStdAcpiTableIdDsdt, EFI_ACPI_6_2_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, "DSDT", TRUE, 0 }, + { EStdAcpiTableIdRhct, EFI_ACPI_6_6_RISCV_HART_CAPABILITIES_TABLE_SIGNATURE, "RHCT", TRUE, 0 }, + { EStdAcpiTableIdDbg2, EFI_ACPI_6_2_DEBUG_PORT_2_TABLE_SIGNATURE, "DBG2", FALSE, 0 }, + { EStdAcpiTableIdSpcr, EFI_ACPI_6_2_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE, "SPCR", FALSE, 0 }, +}; + +/** Get the arch specific ACPI table presence information. + + @param [out] PresenceArray Array containing the ACPI tables to check. + @param [out] PresenceArrayCount Count of elements in the PresenceArray. + @param [out] FadtIndex Index of the FADT table in the PresenceArray. + -1 if absent. + + @retval EFI_SUCCESS Success. +**/ +EFI_STATUS +EFIAPI +GetAcpiTablePresenceInfo ( + OUT ACPI_TABLE_PRESENCE_INFO **PresenceArray, + OUT UINT32 *PresenceArrayCount, + OUT INT32 *FadtIndex + ) +{ + *PresenceArray = mAcpiVerifyTables; + *PresenceArrayCount = ARRAY_SIZE (mAcpiVerifyTables); + *FadtIndex = ACPI_TABLE_VERIFY_FADT; + + return EFI_SUCCESS; +} From 319114e477d72bc55d36267548344f66fbd24d89 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Wed, 27 Nov 2024 10:21:46 +0530 Subject: [PATCH 0877/1172] DynamicTablesPkg/Acpi: Add MADT generator for RISC-V Add a MADT (Multiple APIC Description Table) generator implementation for RISC-V. RISC-V platforms may use one or more of the following interrupt controllers: RINTC, IMSIC, PLIC, and APLIC. This generator constructs the appropriate MADT entries for the supported controllers and enables MADT generation for RISC-V platforms. Signed-off-by: Sunil V L --- DynamicTablesPkg/DynamicTables.dsc.inc | 7 + .../AcpiMadtLibRiscV/AcpiMadtLibRiscV.inf | 29 + .../RiscV/AcpiMadtLibRiscV/MadtGenerator.c | 781 ++++++++++++++++++ 3 files changed, 817 insertions(+) create mode 100644 DynamicTablesPkg/Library/Acpi/RiscV/AcpiMadtLibRiscV/AcpiMadtLibRiscV.inf create mode 100644 DynamicTablesPkg/Library/Acpi/RiscV/AcpiMadtLibRiscV/MadtGenerator.c diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc index 0739044d2a73..99358d28a7e0 100644 --- a/DynamicTablesPkg/DynamicTables.dsc.inc +++ b/DynamicTablesPkg/DynamicTables.dsc.inc @@ -151,6 +151,11 @@ } [Components.RISCV64] + # + # Generators (RISC-V specific) + # + DynamicTablesPkg/Library/Acpi/RiscV/AcpiMadtLibRiscV/AcpiMadtLibRiscV.inf + # # Dynamic Table Factory Dxe # @@ -164,6 +169,8 @@ NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiRawLib/AcpiRawLib.inf NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSpcrLib/AcpiSpcrLib.inf NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf + # RISC-V specific + NULL|DynamicTablesPkg/Library/Acpi/RiscV/AcpiMadtLibRiscV/AcpiMadtLibRiscV.inf # AML Fixup NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtSerialPortLib/SsdtSerialPortLib.inf diff --git a/DynamicTablesPkg/Library/Acpi/RiscV/AcpiMadtLibRiscV/AcpiMadtLibRiscV.inf b/DynamicTablesPkg/Library/Acpi/RiscV/AcpiMadtLibRiscV/AcpiMadtLibRiscV.inf new file mode 100644 index 000000000000..da17aed783ec --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/RiscV/AcpiMadtLibRiscV/AcpiMadtLibRiscV.inf @@ -0,0 +1,29 @@ +## @file +# MADT Table Generator +# +# Copyright (c) 2024, Ventana Micro Systems Inc. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x00010019 + BASE_NAME = AcpiMadtLibRiscV + FILE_GUID = 4696C865-9751-4811-832E-3DA8287F168A + VERSION_STRING = 1.0 + MODULE_TYPE = DXE_DRIVER + LIBRARY_CLASS = NULL|DXE_DRIVER + CONSTRUCTOR = AcpiMadtLibConstructor + DESTRUCTOR = AcpiMadtLibDestructor + +[Sources] + MadtGenerator.c + +[Packages] + DynamicTablesPkg/DynamicTablesPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + BaseLib diff --git a/DynamicTablesPkg/Library/Acpi/RiscV/AcpiMadtLibRiscV/MadtGenerator.c b/DynamicTablesPkg/Library/Acpi/RiscV/AcpiMadtLibRiscV/MadtGenerator.c new file mode 100644 index 000000000000..171174ad2e6e --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/RiscV/AcpiMadtLibRiscV/MadtGenerator.c @@ -0,0 +1,781 @@ +/** @file + MADT Table Generator for RISC-V + + Copyright (c) 2024, Ventana Micro Systems Inc. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - TBD - ACPI 6.6 Specification + +**/ + +#include +#include +#include +#include +#include +#include +#include + +// Module specific include files. +#include +#include +#include +#include +#include + +/** RISC-V standard MADT Generator + +Requirements: + The following Configuration Manager Object(s) are required by + this Generator: + - ERiscVObjRintcInfo + - ERiscVObjImsicInfo (OPTIONAL) + - ERiscVObjAplicInfo (OPTIONAL) + - ERiscVObjPlicInfo (OPTIONAL) +*/ + +/** This macro expands to a function that retrieves the RINTC + Information from the Configuration Manager. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceRiscV, + ERiscVObjRintcInfo, + CM_RISCV_RINTC_INFO + ); + +/** This macro expands to a function that retrieves the IMSIC + Information from the Configuration Manager. +*/ + +GET_OBJECT_LIST ( + EObjNameSpaceRiscV, + ERiscVObjImsicInfo, + CM_RISCV_IMSIC_INFO + ); + +/** This macro expands to a function that retrieves the APLIC + Information from the Configuration Manager. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceRiscV, + ERiscVObjAplicInfo, + CM_RISCV_APLIC_INFO + ); + +/** This macro expands to a function that retrieves the PLIC + Information from the Configuration Manager. +*/ + +GET_OBJECT_LIST ( + EObjNameSpaceRiscV, + ERiscVObjPlicInfo, + CM_RISCV_PLIC_INFO + ); + +/** This function updates the RINTC Information in the + EFI_ACPI_6_6_RINTC_STRUCTURE structure. + + @param [in] Rintc Pointer to RINTC structure. + @param [in] RintcInfo Pointer to the RINTC Information. +**/ +STATIC +VOID +AddRINTC ( + IN EFI_ACPI_6_6_RINTC_STRUCTURE *CONST Rintc, + IN CONST CM_RISCV_RINTC_INFO *CONST RintcInfo + ) +{ + ASSERT (Rintc != NULL); + ASSERT (RintcInfo != NULL); + + // UINT8 Type + Rintc->Type = EFI_ACPI_6_6_RINTC; + // UINT8 Length + Rintc->Length = sizeof (EFI_ACPI_6_6_RINTC_STRUCTURE); + // UINT8 Version + Rintc->Version = EFI_ACPI_6_6_RINTC_STRUCTURE_VERSION; + // UINT8 Reserved + Rintc->Reserved = EFI_ACPI_RESERVED_BYTE; + + ASSERT ((RintcInfo->Flags & ~(UINT32)(EFI_ACPI_6_6_RINTC_FLAG_ENABLE)) == 0); + + // UINT32 Flags + Rintc->Flags = RintcInfo->Flags; + // UINT64 HartID + Rintc->HartId = RintcInfo->HartId; + // UINT32 AcpiProcessorUid + Rintc->Uid = RintcInfo->AcpiProcessorUid; + // UINT32 ExtIntcId + Rintc->ExtIntcId = RintcInfo->ExtIntcId; + // UINT64 ImsicBaseAddress + Rintc->ImsicAddr = RintcInfo->ImsicBaseAddress; + // UINT32 ImsicSize + Rintc->ImsicSize = RintcInfo->ImsicSize; +} + +/** + Function to test if two RINTC information structures have the + same ACPI Processor UID. + + @param [in] RintcInfo1 Pointer to the first RINTC info structure. + @param [in] RintcInfo2 Pointer to the second RINTC info structure. + @param [in] Index1 Index of RintcInfo1 in the shared list of RINTC + Info structures. + @param [in] Index2 Index of RintcInfo2 in the shared list of RINTC + Info structures. + + @retval TRUE RintcInfo1 and RintcInfo2 have the same UID. + @retval FALSE RintcInfo1 and RintcInfo2 have different UIDs. +**/ +BOOLEAN +EFIAPI +IsAcpiUidEqual ( + IN CONST VOID *RintcInfo1, + IN CONST VOID *RintcInfo2, + IN UINTN Index1, + IN UINTN Index2 + ) +{ + UINT32 Uid1; + UINT32 Uid2; + + ASSERT (RintcInfo1 != NULL); + ASSERT (RintcInfo2 != NULL); + + Uid1 = ((CM_RISCV_RINTC_INFO *)RintcInfo1)->AcpiProcessorUid; + Uid2 = ((CM_RISCV_RINTC_INFO *)RintcInfo2)->AcpiProcessorUid; + + if (Uid1 == Uid2) { + DEBUG ( + ( + DEBUG_ERROR, + "ERROR: MADT: RINTC Info Structures %d and %d have the same ACPI " \ + "Processor UID: 0x%x.\n", + Index1, + Index2, + Uid1 + ) + ); + return TRUE; + } + + return FALSE; +} + +/** Add the RINTC Information to the MADT Table. + + This function also checks for duplicate ACPI Processor UIDs. + + @param [in] Rintc Pointer to RINTC structure list. + @param [in] RintcInfo Pointer to the RINTC Information list. + @param [in] RintcCount Count of RINTC. + + @retval EFI_SUCCESS RINTC Information was added successfully. + @retval EFI_INVALID_PARAMETER One or more invalid RINTC Info values were + provided and the generator failed to add the + information to the table. +**/ +STATIC +EFI_STATUS +AddRINTCList ( + IN EFI_ACPI_6_6_RINTC_STRUCTURE *Rintc, + IN CONST CM_RISCV_RINTC_INFO *RintcInfo, + IN UINT32 RintcCount + ) +{ + BOOLEAN IsAcpiProcUidDuplicated; + + ASSERT (Rintc != NULL); + ASSERT (RintcInfo != NULL); + + IsAcpiProcUidDuplicated = FindDuplicateValue ( + RintcInfo, + RintcCount, + sizeof (CM_RISCV_RINTC_INFO), + IsAcpiUidEqual + ); + // Duplicate ACPI Processor UID was found so the RINTC info provided + // is invalid + if (IsAcpiProcUidDuplicated) { + return EFI_INVALID_PARAMETER; + } + + while (RintcCount-- != 0) { + AddRINTC (Rintc++, RintcInfo++); + } + + return EFI_SUCCESS; +} + +/** Update the IMSIC Information in the MADT Table. + + @param [in] Imsic Pointer to IMSIC structure. + @param [in] ImsicInfo Pointer to the IMSIC Information. +**/ +STATIC +VOID +AddIMSIC ( + EFI_ACPI_6_6_IMSIC_STRUCTURE *CONST Imsic, + CONST CM_RISCV_IMSIC_INFO *CONST ImsicInfo + ) +{ + ASSERT (Imsic != NULL); + ASSERT (ImsicInfo != NULL); + + // UINT8 Type + Imsic->Type = EFI_ACPI_6_6_IMSIC; + // UINT8 Length + Imsic->Length = sizeof (EFI_ACPI_6_6_IMSIC_STRUCTURE); + // UINT8 Version + Imsic->Version = EFI_ACPI_6_6_IMSIC_STRUCTURE_VERSION; + // UINT8 Reserved + Imsic->Reserved = EFI_ACPI_RESERVED_BYTE; + + // UINT32 Flags + Imsic->Flags = ImsicInfo->Flags; + + // UINT16 NumIds + ASSERT ( + ((ImsicInfo->NumIds >= IMSIC_MIN_NUM_IDS) && + (ImsicInfo->NumIds <= IMSIC_MAX_NUM_IDS) && + ((ImsicInfo->NumIds + 1) % 64 == 0)) + ); + Imsic->NumIds = ImsicInfo->NumIds; + + // UINT16 NumGuestIds + ASSERT ( + ((ImsicInfo->NumGuestIds >= IMSIC_MIN_NUM_GUEST_IDS) && + (ImsicInfo->NumGuestIds <= IMSIC_MAX_NUM_GUEST_IDS) && + ((ImsicInfo->NumGuestIds + 1) % 64 == 0)) + ); + Imsic->NumGuestIds = ImsicInfo->NumGuestIds; + + // UINT8 GuestIndexBits + ASSERT ( + ImsicInfo->GuestIndexBits >= IMSIC_MIN_GUEST_INDEX_BITS && + ImsicInfo->GuestIndexBits <= IMSIC_MAX_GUEST_INDEX_BITS + ); + Imsic->GuestIndexBits = ImsicInfo->GuestIndexBits; + + // UINT8 HartIndexBits + ASSERT ( + ImsicInfo->HartIndexBits >= IMSIC_MIN_HART_INDEX_BITS && + ImsicInfo->HartIndexBits <= IMSIC_MAX_HART_INDEX_BITS + ); + Imsic->HartIndexBits = ImsicInfo->HartIndexBits; + + // UINT8 GroupIndexBits + ASSERT ( + ImsicInfo->GroupIndexBits >= IMSIC_MIN_GROUP_INDEX_BITS && + ImsicInfo->GroupIndexBits <= IMSIC_MAX_GROUP_INDEX_BITS + ); + Imsic->GroupIndexBits = ImsicInfo->GroupIndexBits; + + // UINT8 GroupIndexShift + ASSERT ( + ImsicInfo->GroupIndexShift >= IMSIC_MIN_GROUP_INDEX_SHIFT && + ImsicInfo->GroupIndexShift <= IMSIC_MAX_GROUP_INDEX_SHIFT + ); + Imsic->GroupIndexShift = ImsicInfo->GroupIndexShift; +} + +/** Update the APLIC Information. + + @param [in] Aplic Pointer to APLIC structure. + @param [in] AplicInfo Pointer to the APLIC Info. +**/ +STATIC +VOID +AddAPLIC ( + IN EFI_ACPI_6_6_APLIC_STRUCTURE *CONST Aplic, + IN CONST CM_RISCV_APLIC_INFO *CONST AplicInfo + ) +{ + ASSERT (Aplic != NULL); + ASSERT (AplicInfo != NULL); + + Aplic->Type = EFI_ACPI_6_6_APLIC; + Aplic->Length = sizeof (EFI_ACPI_6_6_APLIC_STRUCTURE); + Aplic->Version = EFI_ACPI_6_6_APLIC_STRUCTURE_VERSION; + Aplic->Id = AplicInfo->PlicAplicCommonInfo.Id; + Aplic->Flags = AplicInfo->PlicAplicCommonInfo.Flags; + CopyMem (&Aplic->HwId, &AplicInfo->PlicAplicCommonInfo.Hid, RISCV_HWID_LENGTH); + ASSERT (IsValidAcpiId ((CHAR8 *)Aplic->HwId) != 0); + Aplic->NumIdcs = AplicInfo->NumIdcs; + Aplic->NumSources = AplicInfo->PlicAplicCommonInfo.NumSources; + Aplic->GsiBase = AplicInfo->PlicAplicCommonInfo.GsiBase; + Aplic->BaseAddr = AplicInfo->PlicAplicCommonInfo.BaseAddress; + Aplic->Size = AplicInfo->PlicAplicCommonInfo.Size; +} + +/** Add the APLIC Information to the MADT Table. + + @param [in] Aplic Pointer to APLIC structure list. + @param [in] AplicInfo Pointer to the APLIC info list. + @param [in] AplicCount Count of APLICs. +**/ +STATIC +VOID +AddAPLICList ( + IN EFI_ACPI_6_6_APLIC_STRUCTURE *Aplic, + IN CONST CM_RISCV_APLIC_INFO *AplicInfo, + IN UINT32 AplicCount + ) +{ + ASSERT (Aplic != NULL); + ASSERT (AplicInfo != NULL); + + while (AplicCount-- != 0) { + AddAPLIC (Aplic++, AplicInfo++); + } +} + +/** Update the PLIC Information. + + @param [in] Plic Pointer to PLIC structure. + @param [in] PlicInfo Pointer to the PLIC Info. +**/ +STATIC +VOID +AddPLIC ( + IN EFI_ACPI_6_6_PLIC_STRUCTURE *CONST Plic, + IN CONST CM_RISCV_PLIC_INFO *CONST PlicInfo + ) +{ + ASSERT (Plic != NULL); + ASSERT (PlicInfo != NULL); + + Plic->Type = EFI_ACPI_6_6_PLIC; + Plic->Length = sizeof (EFI_ACPI_6_6_PLIC_STRUCTURE); + Plic->Version = EFI_ACPI_6_6_PLIC_STRUCTURE_VERSION; + Plic->Id = PlicInfo->PlicAplicCommonInfo.Id; + CopyMem (&Plic->HwId, &PlicInfo->PlicAplicCommonInfo.Hid, RISCV_HWID_LENGTH); + ASSERT (IsValidAcpiId ((CHAR8 *)Plic->HwId) != 0); + Plic->NumIrqs = PlicInfo->PlicAplicCommonInfo.NumSources; + Plic->MaxPrio = PlicInfo->MaxPriority; + Plic->Flags = PlicInfo->PlicAplicCommonInfo.Flags; + Plic->Size = PlicInfo->PlicAplicCommonInfo.Size; + Plic->BaseAddr = PlicInfo->PlicAplicCommonInfo.BaseAddress; + Plic->GsiBase = PlicInfo->PlicAplicCommonInfo.GsiBase; +} + +/** Add the PLIC Information to the MADT Table. + + @param [in] Plic Pointer to PLIC structure list. + @param [in] PlicInfo Pointer to the PLIC info list. + @param [in] PlicCount Count of PLICs. +**/ +STATIC +VOID +AddPLICList ( + IN EFI_ACPI_6_6_PLIC_STRUCTURE *Plic, + IN CONST CM_RISCV_PLIC_INFO *PlicInfo, + IN UINT32 PlicCount + ) +{ + ASSERT (Plic != NULL); + ASSERT (PlicInfo != NULL); + + while (PlicCount-- != 0) { + AddPLIC (Plic++, PlicInfo++); + } +} + +/** Construct the MADT ACPI table. + + This function invokes the Configuration Manager protocol interface + to get the required hardware information for generating the ACPI + table. + + If this function allocates any resources then they must be freed + in the FreeXXXXTableResources function. + + @param [in] This Pointer to the table generator. + @param [in] AcpiTableInfo Pointer to the ACPI Table Info. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [out] Table Pointer to the constructed ACPI Table. + + @retval EFI_SUCCESS Table generated successfully. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND The required object was not found. + @retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration + Manager is less than the Object size for the + requested object. +**/ +STATIC +EFI_STATUS +EFIAPI +BuildMadtTable ( + IN CONST ACPI_TABLE_GENERATOR *CONST This, + IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + OUT EFI_ACPI_DESCRIPTION_HEADER **CONST Table + ) +{ + CM_RISCV_RINTC_INFO *RintcInfo; + CM_RISCV_IMSIC_INFO *ImsicInfo; + CM_RISCV_APLIC_INFO *AplicInfo; + CM_RISCV_PLIC_INFO *PlicInfo; + EFI_STATUS Status; + UINT32 TableSize; + UINT32 RintcCount; + UINT32 ImsicCount; + UINT32 AplicCount; + UINT32 PlicCount; + UINT32 RintcOffset; + UINT32 ImsicOffset; + UINT32 AplicOffset; + UINT32 PlicOffset; + + EFI_ACPI_6_6_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *Madt; + + ASSERT (This != NULL); + ASSERT (AcpiTableInfo != NULL); + ASSERT (CfgMgrProtocol != NULL); + ASSERT (Table != NULL); + ASSERT (AcpiTableInfo->TableGeneratorId == This->GeneratorID); + ASSERT (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature); + + if ((AcpiTableInfo->AcpiTableRevision < This->MinAcpiTableRevision) || + (AcpiTableInfo->AcpiTableRevision > This->AcpiTableRevision)) + { + DEBUG ( + ( + DEBUG_ERROR, + "ERROR: MADT: Requested table revision = %d, is not supported." + "Supported table revision: Minimum = %d, Maximum = %d\n", + AcpiTableInfo->AcpiTableRevision, + This->MinAcpiTableRevision, + This->AcpiTableRevision + ) + ); + return EFI_INVALID_PARAMETER; + } + + *Table = NULL; + + Status = GetERiscVObjRintcInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &RintcInfo, + &RintcCount + ); + if (EFI_ERROR (Status)) { + DEBUG ( + ( + DEBUG_ERROR, + "ERROR: MADT: Failed to get RINTC Info. Status = %r\n", + Status + ) + ); + goto error_handler; + } + + if (RintcCount == 0) { + DEBUG ( + ( + DEBUG_ERROR, + "ERROR: MADT: RINTC information not provided.\n" + ) + ); + ASSERT (RintcCount != 0); + Status = EFI_INVALID_PARAMETER; + goto error_handler; + } + + Status = GetERiscVObjImsicInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &ImsicInfo, + &ImsicCount + ); + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { + DEBUG ( + ( + DEBUG_ERROR, + "ERROR: MADT: Failed to get IMSIC Info. Status = %r\n", + Status + ) + ); + goto error_handler; + } + + if (ImsicCount > 1) { + DEBUG ( + ( + DEBUG_ERROR, + "ERROR: MADT: One, and only one, IMSIC must be present." + "ImsicCount = %d\n", + ImsicCount + ) + ); + ASSERT (ImsicCount <= 1); + Status = EFI_INVALID_PARAMETER; + goto error_handler; + } + + Status = GetERiscVObjAplicInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &AplicInfo, + &AplicCount + ); + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { + DEBUG ( + ( + DEBUG_ERROR, + "ERROR: MADT: Failed to get APLIC Info. Status = %r\n", + Status + ) + ); + goto error_handler; + } + + Status = GetERiscVObjPlicInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &PlicInfo, + &PlicCount + ); + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { + DEBUG ( + ( + DEBUG_ERROR, + "ERROR: MADT: Failed to get PLIC Info. Status = %r\n", + Status + ) + ); + goto error_handler; + } + + TableSize = sizeof (EFI_ACPI_6_6_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER); + + RintcOffset = TableSize; + TableSize += (sizeof (EFI_ACPI_6_6_RINTC_STRUCTURE) * RintcCount); + + ImsicOffset = TableSize; + TableSize += (sizeof (EFI_ACPI_6_6_IMSIC_STRUCTURE) * ImsicCount); + + AplicOffset = TableSize; + TableSize += (sizeof (EFI_ACPI_6_6_APLIC_STRUCTURE) * AplicCount); + + PlicOffset = TableSize; + TableSize += (sizeof (EFI_ACPI_6_6_PLIC_STRUCTURE) * PlicCount); + + // Allocate the Buffer for MADT table + *Table = (EFI_ACPI_DESCRIPTION_HEADER *)AllocateZeroPool (TableSize); + if (*Table == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG ( + ( + DEBUG_ERROR, + "ERROR: MADT: Failed to allocate memory for MADT Table, Size = %d," \ + " Status = %r\n", + TableSize, + Status + ) + ); + goto error_handler; + } + + Madt = (EFI_ACPI_6_6_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *)*Table; + + DEBUG ( + ( + DEBUG_INFO, + "MADT: Madt = 0x%p TableSize = 0x%x\n", + Madt, + TableSize + ) + ); + + Status = AddAcpiHeader ( + CfgMgrProtocol, + This, + &Madt->Header, + AcpiTableInfo, + TableSize + ); + if (EFI_ERROR (Status)) { + DEBUG ( + ( + DEBUG_ERROR, + "ERROR: MADT: Failed to add ACPI header. Status = %r\n", + Status + ) + ); + goto error_handler; + } + + Status = AddRINTCList ( + (EFI_ACPI_6_6_RINTC_STRUCTURE *)((UINT8 *)Madt + RintcOffset), + RintcInfo, + RintcCount + ); + if (EFI_ERROR (Status)) { + DEBUG ( + ( + DEBUG_ERROR, + "ERROR: MADT: Failed to add RINTC structures. Status = %r\n", + Status + ) + ); + goto error_handler; + } + + if (ImsicCount != 0) { + AddIMSIC ( + (EFI_ACPI_6_6_IMSIC_STRUCTURE *)((UINT8 *)Madt + ImsicOffset), + ImsicInfo + ); + } + + if (AplicCount != 0) { + AddAPLICList ( + (EFI_ACPI_6_6_APLIC_STRUCTURE *)((UINT8 *)Madt + AplicOffset), + AplicInfo, + AplicCount + ); + } + + if (PlicCount != 0) { + AddPLICList ( + (EFI_ACPI_6_6_PLIC_STRUCTURE *)((UINT8 *)Madt + PlicOffset), + PlicInfo, + PlicCount + ); + } + + return EFI_SUCCESS; + +error_handler: + if (*Table != NULL) { + FreePool (*Table); + *Table = NULL; + } + + return Status; +} + +/** Free any resources allocated for constructing the MADT + + @param [in] This Pointer to the table generator. + @param [in] AcpiTableInfo Pointer to the ACPI Table Info. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in, out] Table Pointer to the ACPI Table. + + @retval EFI_SUCCESS The resources were freed successfully. + @retval EFI_INVALID_PARAMETER The table pointer is NULL or invalid. +**/ +STATIC +EFI_STATUS +FreeMadtTableResources ( + IN CONST ACPI_TABLE_GENERATOR *CONST This, + IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN OUT EFI_ACPI_DESCRIPTION_HEADER **CONST Table + ) +{ + ASSERT (This != NULL); + ASSERT (AcpiTableInfo != NULL); + ASSERT (CfgMgrProtocol != NULL); + ASSERT (AcpiTableInfo->TableGeneratorId == This->GeneratorID); + ASSERT (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature); + + if ((Table == NULL) || (*Table == NULL)) { + DEBUG ((DEBUG_ERROR, "ERROR: MADT: Invalid Table Pointer\n")); + ASSERT ((Table != NULL) && (*Table != NULL)); + return EFI_INVALID_PARAMETER; + } + + FreePool (*Table); + *Table = NULL; + return EFI_SUCCESS; +} + +/** The MADT Table Generator revision. +*/ +#define MADT_GENERATOR_REVISION CREATE_REVISION (1, 0) + +/** The interface for the MADT Table Generator. +*/ +STATIC +CONST +ACPI_TABLE_GENERATOR MadtGenerator = { + // Generator ID + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdMadt), + // Generator Description + L"ACPI.STD.MADT.GENERATOR", + // ACPI Table Signature + EFI_ACPI_6_6_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE, + // ACPI Table Revision supported by this Generator + EFI_ACPI_6_6_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION, + // Minimum supported ACPI Table Revision + EFI_ACPI_6_6_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION, + // Creator ID + TABLE_GENERATOR_CREATOR_ID, + // Creator Revision + MADT_GENERATOR_REVISION, + // Build Table function + BuildMadtTable, + // Free Resource function + FreeMadtTableResources, + // Extended build function not needed + NULL, + // Extended build function not implemented by the generator. + // Hence extended free resource function is not required. + NULL +}; + +/** Register the Generator with the ACPI Table Factory. + + @param [in] ImageHandle The handle to the image. + @param [in] SystemTable Pointer to the System Table. + + @retval EFI_SUCCESS The Generator is registered. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_ALREADY_STARTED The Generator for the Table ID + is already registered. +**/ +EFI_STATUS +EFIAPI +AcpiMadtLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = RegisterAcpiTableGenerator (&MadtGenerator); + DEBUG ((DEBUG_INFO, "MADT: Register Generator. Status = %r\n", Status)); + ASSERT_EFI_ERROR (Status); + return Status; +} + +/** Deregister the Generator from the ACPI Table Factory. + + @param [in] ImageHandle The handle to the image. + @param [in] SystemTable Pointer to the System Table. + + @retval EFI_SUCCESS The Generator is deregistered. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND The Generator is not registered. +**/ +EFI_STATUS +EFIAPI +AcpiMadtLibDestructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = DeregisterAcpiTableGenerator (&MadtGenerator); + DEBUG ((DEBUG_INFO, "MADT: Deregister Generator. Status = %r\n", Status)); + ASSERT_EFI_ERROR (Status); + return Status; +} From d612fd272f2680b28854fd18e51027fc1ac2628a Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Wed, 27 Nov 2024 10:23:53 +0530 Subject: [PATCH 0878/1172] DynamicTablesPkg/Acpi: Add RHCT generator for RISC-V Add a generator for the RISC-V Hart Capabilities Table (RHCT), a new ACPI table used to convey CPU feature information to the operating system. This generator enables firmware to describe RISC-V hart capabilities in a standardized way as part of the ACPI table set. Signed-off-by: Sunil V L --- DynamicTablesPkg/DynamicTables.dsc.inc | 2 + DynamicTablesPkg/Include/AcpiTableGenerator.h | 1 + .../AcpiRhctLibRiscV/AcpiRhctLibRiscV.inf | 31 + .../RiscV/AcpiRhctLibRiscV/RhctGenerator.c | 1212 +++++++++++++++++ .../RiscV/AcpiRhctLibRiscV/RhctGenerator.h | 44 + 5 files changed, 1290 insertions(+) create mode 100644 DynamicTablesPkg/Library/Acpi/RiscV/AcpiRhctLibRiscV/AcpiRhctLibRiscV.inf create mode 100644 DynamicTablesPkg/Library/Acpi/RiscV/AcpiRhctLibRiscV/RhctGenerator.c create mode 100644 DynamicTablesPkg/Library/Acpi/RiscV/AcpiRhctLibRiscV/RhctGenerator.h diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc index 99358d28a7e0..75871829e15f 100644 --- a/DynamicTablesPkg/DynamicTables.dsc.inc +++ b/DynamicTablesPkg/DynamicTables.dsc.inc @@ -155,6 +155,7 @@ # Generators (RISC-V specific) # DynamicTablesPkg/Library/Acpi/RiscV/AcpiMadtLibRiscV/AcpiMadtLibRiscV.inf + DynamicTablesPkg/Library/Acpi/RiscV/AcpiRhctLibRiscV/AcpiRhctLibRiscV.inf # # Dynamic Table Factory Dxe @@ -171,6 +172,7 @@ NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf # RISC-V specific NULL|DynamicTablesPkg/Library/Acpi/RiscV/AcpiMadtLibRiscV/AcpiMadtLibRiscV.inf + NULL|DynamicTablesPkg/Library/Acpi/RiscV/AcpiRhctLibRiscV/AcpiRhctLibRiscV.inf # AML Fixup NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtSerialPortLib/SsdtSerialPortLib.inf diff --git a/DynamicTablesPkg/Include/AcpiTableGenerator.h b/DynamicTablesPkg/Include/AcpiTableGenerator.h index 972fc0275b8c..9d9e76058622 100755 --- a/DynamicTablesPkg/Include/AcpiTableGenerator.h +++ b/DynamicTablesPkg/Include/AcpiTableGenerator.h @@ -120,6 +120,7 @@ typedef enum StdAcpiTableId { EStdAcpiTableIdFacs, ///< FACS Generator EStdAcpiTableIdCedt, ///< CEDT Generator EStdAcpiTableIdSlit, ///< SLIT Generator + EStdAcpiTableIdRhct, ///< RHCT Generator EStdAcpiTableIdMax } ESTD_ACPI_TABLE_ID; diff --git a/DynamicTablesPkg/Library/Acpi/RiscV/AcpiRhctLibRiscV/AcpiRhctLibRiscV.inf b/DynamicTablesPkg/Library/Acpi/RiscV/AcpiRhctLibRiscV/AcpiRhctLibRiscV.inf new file mode 100644 index 000000000000..8d63c8ccc9d9 --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/RiscV/AcpiRhctLibRiscV/AcpiRhctLibRiscV.inf @@ -0,0 +1,31 @@ +## @file +# RHCT Table Generator +# +# Copyright (c) 2024, Ventana Micro Systems Inc. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x00010019 + BASE_NAME = AcpiRhctLibRiscV + FILE_GUID = A3C3A90D-7F06-47EA-B78E-ED41B47D7153 + VERSION_STRING = 1.0 + MODULE_TYPE = DXE_DRIVER + LIBRARY_CLASS = NULL|DXE_DRIVER + CONSTRUCTOR = AcpiRhctLibConstructor + DESTRUCTOR = AcpiRhctLibDestructor + +[Sources] + RhctGenerator.c + RhctGenerator.h + +[Packages] + DynamicTablesPkg/DynamicTablesPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib diff --git a/DynamicTablesPkg/Library/Acpi/RiscV/AcpiRhctLibRiscV/RhctGenerator.c b/DynamicTablesPkg/Library/Acpi/RiscV/AcpiRhctLibRiscV/RhctGenerator.c new file mode 100644 index 000000000000..5fbd04b814fe --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/RiscV/AcpiRhctLibRiscV/RhctGenerator.c @@ -0,0 +1,1212 @@ +/** @file + RHCT Table Generator + + Copyright (c) 2024, Ventana Micro Systems Inc. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - ACPI specification 6.6, Section 5.2.37 + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include + +// Module specific include files. +#include +#include +#include +#include +#include + +#include "RhctGenerator.h" + +/** RISC-V standard RHCT Generator + +Requirements: + The following Configuration Manager Object(s) are required by + this Generator: + - ERiscVObjMmuInfo, + - ERiscVObjCmoInfo, + - ERiscVObjTimerInfo, + - ERiscVObjRintcInfo, + - ERiscVObjIsaStringInfo +*/ + +GET_OBJECT_LIST ( + EObjNameSpaceRiscV, + ERiscVObjMmuInfo, + CM_RISCV_MMU_NODE + ); + +GET_OBJECT_LIST ( + EObjNameSpaceRiscV, + ERiscVObjCmoInfo, + CM_RISCV_CMO_NODE + ); + +GET_OBJECT_LIST ( + EObjNameSpaceRiscV, + ERiscVObjTimerInfo, + CM_RISCV_TIMER_INFO + ); + +GET_OBJECT_LIST ( + EObjNameSpaceRiscV, + ERiscVObjRintcInfo, + CM_RISCV_RINTC_INFO + ); + +/** This macro expands to a function that retrieves the + CMO node information from the Configuration Manager. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceRiscV, + ERiscVObjIsaStringInfo, + CM_RISCV_ISA_STRING_NODE + ); + +/** Returns the offset of the Node referenced by the Token. + + @param [in] NodeIndexer Pointer to node indexer array. + @param [in] NodeCount Count of the nodes. + @param [in] Token Reference token for the node. + @param [out] NodeOffset Offset of the node from the + start of the RHCT table. + + @retval EFI_SUCCESS Success. + @retval EFI_NOT_FOUND No matching token reference + found in node indexer array. +**/ +STATIC +EFI_STATUS +GetNodeOffsetReferencedByToken ( + IN RHCT_NODE_INDEXER *NodeIndexer, + IN UINT32 NodeCount, + IN CM_OBJECT_TOKEN Token, + OUT UINT32 *NodeOffset + ) +{ + if (Token == CM_NULL_TOKEN) { + DEBUG ((DEBUG_ERROR, "ERROR: RHCT: Invalid NULL token.\n")); + return EFI_INVALID_PARAMETER; + } + + while (NodeCount-- != 0) { + DEBUG (( + DEBUG_INFO, + "RHCT: Node Indexer: NodeIndexer->Token = %p, Offset = %d\n", + NodeIndexer->Token, + NodeIndexer->Offset + )); + if (NodeIndexer->Token == Token) { + *NodeOffset = NodeIndexer->Offset; + DEBUG (( + DEBUG_INFO, + "RHCT: Node Indexer: Token = %p, Found\n", + Token + )); + return EFI_SUCCESS; + } + + NodeIndexer++; + } + + DEBUG (( + DEBUG_INFO, + "RHCT: Node Indexer: Token = %p, Not Found\n", + Token + )); + return EFI_NOT_FOUND; +} + +/** Returns the total size required for the MMU nodes and + updates the Node Indexer. + + This function calculates the size required for the node group + and also populates the Node Indexer array with offsets for the + individual nodes. + + @param [in] NodeStartOffset Offset from the start of the + RHCT where this node group starts. + @param [in] NodeList Pointer to MMU node list. + @param [in] NodeCount Count of the MMU nodes. + @param [in, out] NodeIndexer Pointer to the next Node Indexer. + + @retval Total size of the MMU Node. +**/ +STATIC +UINT64 +GetSizeofMmuNodes ( + IN CONST UINT32 NodeStartOffset, + IN CONST CM_RISCV_MMU_NODE *NodeList, + IN UINT32 NodeCount, + IN OUT RHCT_NODE_INDEXER **CONST NodeIndexer + ) +{ + UINT64 Size; + + ASSERT (NodeList != NULL); + ASSERT (NodeIndexer != NULL); + + Size = 0; + while (NodeCount-- != 0) { + (*NodeIndexer)->Token = NodeList->Token; + (*NodeIndexer)->Object = (VOID *)NodeList; + (*NodeIndexer)->Offset = (UINT32)(Size + NodeStartOffset); + DEBUG (( + DEBUG_INFO, + "RHCT: Node Indexer = %p, Token = %p, Object = %p," + " Offset = %d\n", + *NodeIndexer, + (*NodeIndexer)->Token, + (*NodeIndexer)->Object, + (*NodeIndexer)->Offset + )); + + Size += sizeof (EFI_ACPI_6_6_RHCT_MMU_NODE); + (*NodeIndexer)++; + NodeList++; + } + + return Size; +} + +/** Returns the total size required for the CMO nodes and + updates the Node Indexer. + + This function calculates the size required for the node group + and also populates the Node Indexer array with offsets for the + individual nodes. + + @param [in] NodeStartOffset Offset from the start of the + RHCT where this node group starts. + @param [in] NodeList Pointer to CMO node list. + @param [in] NodeCount Count of the CMO nodes. + @param [in, out] NodeIndexer Pointer to the next Node Indexer. + + @retval Total size of the CMO Node. +**/ +STATIC +UINT64 +GetSizeofCmoNodes ( + IN CONST UINT32 NodeStartOffset, + IN CONST CM_RISCV_CMO_NODE *NodeList, + IN UINT32 NodeCount, + IN OUT RHCT_NODE_INDEXER **CONST NodeIndexer + ) +{ + UINT64 Size; + + ASSERT (NodeList != NULL); + ASSERT (NodeIndexer != NULL); + + Size = 0; + while (NodeCount-- != 0) { + (*NodeIndexer)->Token = NodeList->Token; + (*NodeIndexer)->Object = (VOID *)NodeList; + (*NodeIndexer)->Offset = (UINT32)(Size + NodeStartOffset); + DEBUG (( + DEBUG_INFO, + "RHCT: Node Indexer = %p, Token = %p, Object = %p," + " Offset = %d\n", + *NodeIndexer, + (*NodeIndexer)->Token, + (*NodeIndexer)->Object, + (*NodeIndexer)->Offset + )); + + Size += sizeof (EFI_ACPI_6_6_RHCT_CMO_NODE); + (*NodeIndexer)++; + NodeList++; + } + + return Size; +} + +/** Returns the total size required for the ISA string nodes and + updates the Node Indexer. + + This function calculates the size required for the node group + and also populates the Node Indexer array with offsets for the + individual nodes. + + @param [in] NodeStartOffset Offset from the start of the + RHCT where this node group starts. + @param [in] NodeList Pointer to ISA String node list. + @param [in] NodeCount Count of the ISA String nodes. + @param [in, out] NodeIndexer Pointer to the next Node Indexer. + + @retval Total size of the ISA String Node. +**/ +STATIC +UINT64 +GetIsaStringNodeSize ( + IN CONST UINT32 NodeStartOffset, + IN CONST CM_RISCV_ISA_STRING_NODE *NodeList, + IN UINT32 NodeCount, + IN OUT RHCT_NODE_INDEXER **CONST NodeIndexer + ) +{ + UINT64 Size; + + ASSERT (NodeList != NULL); + ASSERT (NodeIndexer != NULL); + + Size = 0; + while (NodeCount-- != 0) { + (*NodeIndexer)->Token = NodeList->Token; + (*NodeIndexer)->Object = (VOID *)NodeList; + (*NodeIndexer)->Offset = (UINT32)(Size + NodeStartOffset); + DEBUG (( + DEBUG_INFO, + "RHCT: Node Indexer = %p, Token = %p, Object = %p," + " Offset = %d\n", + *NodeIndexer, + (*NodeIndexer)->Token, + (*NodeIndexer)->Object, + (*NodeIndexer)->Offset + )); + + Size += (UINT32)(sizeof (EFI_ACPI_6_6_RHCT_ISA_STRING_NODE)) + + ALIGN_VALUE ((AsciiStrSize (NodeList->IsaString)), 2); + (*NodeIndexer)++; + NodeList++; + } + + return Size; +} + +/** Returns the total size required for the Hart Info nodes and + updates the Node Indexer. + + This function calculates the size required for the node group + and also populates the Node Indexer array with offsets for the + individual nodes. + + @param [in] Generator Pointer to the table Generator. + @param [in] NodeStartOffset Offset from the start of the + RHCT where this node group starts. + @param [in] NodeList Pointer to Hart Info node list. + @param [in] NodeCount Count of the Hart Info nodes. + @param [in, out] NodeIndexer Pointer to the next Node Indexer. + + @retval Total size of the Hart Info nodes. +**/ +STATIC +UINT64 +GetSizeofHartInfoNodes ( + IN ACPI_RHCT_GENERATOR *Generator, + IN CONST UINT32 NodeStartOffset, + IN CONST CM_RISCV_RINTC_INFO *NodeList, + IN UINT32 NodeCount, + IN OUT RHCT_NODE_INDEXER **CONST NodeIndexer + ) +{ + UINT64 Size; + UINT32 NumOffsets; + UINT32 IsaStringNodeOffset; + UINT32 CmoNodeOffset; + UINT32 MmuNodeOffset; + EFI_STATUS Status; + + ASSERT (NodeList != NULL); + + Size = 0; + while (NodeCount-- != 0) { + NumOffsets = 0; + Status = GetNodeOffsetReferencedByToken ( + Generator->NodeIndexer, + Generator->RhctNodeCount, + NodeList->IsaStringInfoToken, + &IsaStringNodeOffset + ); + if ((Status == EFI_SUCCESS) && (IsaStringNodeOffset != 0)) { + NumOffsets++; + } + + Status = GetNodeOffsetReferencedByToken ( + Generator->NodeIndexer, + Generator->RhctNodeCount, + NodeList->CmoInfoToken, + &CmoNodeOffset + ); + if ((Status == EFI_SUCCESS) && (CmoNodeOffset != 0)) { + NumOffsets++; + } + + Status = GetNodeOffsetReferencedByToken ( + Generator->NodeIndexer, + Generator->RhctNodeCount, + NodeList->MmuInfoToken, + &MmuNodeOffset + ); + if ((Status == EFI_SUCCESS) && (MmuNodeOffset != 0)) { + NumOffsets++; + } + + (*NodeIndexer)->Object = (VOID *)NodeList; + (*NodeIndexer)->Offset = (UINT32)(Size + NodeStartOffset); + DEBUG (( + DEBUG_INFO, + "RHCT: Node Indexer = %p, Object = %p," + " Offset = %d\n", + *NodeIndexer, + (*NodeIndexer)->Object, + (*NodeIndexer)->Offset + )); + + Size += sizeof (EFI_ACPI_6_6_RHCT_HART_INFO_NODE) + + (sizeof (UINT32) * NumOffsets); + (*NodeIndexer)++; + NodeList++; + } + + return Size; +} + +/** Update the MMU Node Information. + + @param [in] Rhct Pointer to RHCT table structure. + @param [in] NodesStartOffset Offset for the start of the MMU Nodes. + @param [in] NodeList Pointer to an array of MMU Node Objects. + @param [in] NodeCount Number of MMU Node Objects. + + @retval EFI_SUCCESS Table generated successfully. +**/ +STATIC +EFI_STATUS +AddMmuNodes ( + IN CONST EFI_ACPI_6_6_RISCV_HART_CAPABILITIES_TABLE *Rhct, + IN CONST UINT32 NodesStartOffset, + IN CONST CM_RISCV_MMU_NODE *NodeList, + IN UINT32 NodeCount + ) +{ + EFI_ACPI_6_6_RHCT_MMU_NODE *MmuNode; + UINT64 NodeLength; + + ASSERT (Rhct != NULL); + ASSERT (NodeList != NULL); + ASSERT (NodeCount != 0); + + MmuNode = (EFI_ACPI_6_6_RHCT_MMU_NODE *)((UINT8 *)Rhct + NodesStartOffset); + + while (NodeCount-- != 0) { + NodeLength = sizeof (EFI_ACPI_6_6_RHCT_MMU_NODE); + + // Populate the node header + MmuNode->Node.Type = EFI_ACPI_6_6_RHCT_NODE_TYPE_MMU; + MmuNode->Node.Length = (UINT16)NodeLength; + MmuNode->Node.Revision = EFI_ACPI_6_6_RHCT_MMU_NODE_STRUCTURE_VERSION; + + // RHCT specific data + MmuNode->MmuType = NodeList->MmuType; + MmuNode = (EFI_ACPI_6_6_RHCT_MMU_NODE *)((CHAR8 *)MmuNode + NodeLength); + NodeList++; + } + + return EFI_SUCCESS; +} + +/** Update the CMO Node Information. + + @param [in] Rhct Pointer to RHCT table structure. + @param [in] NodesStartOffset Offset for the start of the CMO Nodes. + @param [in] NodeList Pointer to an array of CMO Node Objects. + @param [in] NodeCount Number of CMO Node Objects. + + @retval EFI_SUCCESS Table generated successfully. +**/ +STATIC +EFI_STATUS +AddCmoNodes ( + IN CONST EFI_ACPI_6_6_RISCV_HART_CAPABILITIES_TABLE *Rhct, + IN CONST UINT32 NodesStartOffset, + IN CONST CM_RISCV_CMO_NODE *NodeList, + IN UINT32 NodeCount + ) +{ + EFI_ACPI_6_6_RHCT_CMO_NODE *CmoNode; + UINT64 NodeLength; + + ASSERT (Rhct != NULL); + ASSERT (NodeList != NULL); + ASSERT (NodeCount != 0); + + CmoNode = (EFI_ACPI_6_6_RHCT_CMO_NODE *)((UINT8 *)Rhct + NodesStartOffset); + + while (NodeCount-- != 0) { + NodeLength = sizeof (EFI_ACPI_6_6_RHCT_CMO_NODE); + + // Populate the node header + CmoNode->Node.Type = EFI_ACPI_6_6_RHCT_NODE_TYPE_CMO; + CmoNode->Node.Length = (UINT16)NodeLength; + CmoNode->Node.Revision = EFI_ACPI_6_6_RHCT_CMO_NODE_STRUCTURE_VERSION; + + // RHCT specific data + CmoNode->CbomBlockSize = NodeList->CbomBlockSize; + CmoNode->CbopBlockSize = NodeList->CbopBlockSize; + CmoNode->CbozBlockSize = NodeList->CbozBlockSize; + CmoNode = (EFI_ACPI_6_6_RHCT_CMO_NODE *)((CHAR8 *)CmoNode + NodeLength); + NodeList++; + } + + return EFI_SUCCESS; +} + +/** Update the ISA Node Information. + + @param [in] Rhct Pointer to RHCT table structure. + @param [in] NodesStartOffset Offset for the start of the ISA String Nodes. + @param [in] NodeList Pointer to an array of ISA String Node Objects. + @param [in] NodeCount Number of ISA String Node Objects. + + @retval EFI_SUCCESS Table generated successfully. +**/ +STATIC +EFI_STATUS +AddIsaStringNodes ( + IN CONST EFI_ACPI_6_6_RISCV_HART_CAPABILITIES_TABLE *Rhct, + IN CONST UINT32 NodesStartOffset, + IN CONST CM_RISCV_ISA_STRING_NODE *NodeList, + IN UINT32 NodeCount + ) +{ + EFI_ACPI_6_6_RHCT_ISA_STRING_NODE *IsaStringNode; + EFI_STATUS Status; + UINT32 NodeLength; + UINT16 IsaLength; + + ASSERT (Rhct != NULL); + + IsaStringNode = (EFI_ACPI_6_6_RHCT_ISA_STRING_NODE *)((UINT8 *)Rhct + NodesStartOffset); + + while (NodeCount-- != 0) { + IsaLength = AsciiStrSize (NodeList->IsaString); + IsaStringNode->IsaLength = IsaLength; + NodeLength = sizeof (EFI_ACPI_6_6_RHCT_ISA_STRING_NODE) + ALIGN_VALUE (AsciiStrSize (NodeList->IsaString), 2); + + // Populate the node header + IsaStringNode->Node.Type = EFI_ACPI_6_6_RHCT_NODE_TYPE_ISA_STRING; + IsaStringNode->Node.Length = (UINT16)NodeLength; + IsaStringNode->Node.Revision = EFI_ACPI_6_6_RHCT_ISA_NODE_STRUCTURE_VERSION; + Status = AsciiStrCpyS ( + IsaStringNode->Isa, + IsaLength, + NodeList->IsaString + ); + IsaStringNode = (EFI_ACPI_6_6_RHCT_ISA_STRING_NODE *)((CHAR8 *)IsaStringNode + NodeLength); + NodeList++; + } + + return EFI_SUCCESS; +} + +#define MAX_OFFSETS_PER_HART 3 + +/** Update the Hart Info Node Information. + + @param [in] Generator Pointer to the table Generator. + @param [in] Rhct Pointer to RHCT table structure. + @param [in] NodesStartOffset Offset for the start of the Hart Info + Nodes. + @param [in] NodeList Pointer to an array of Hart Info Node + Objects. + @param [in] NodeCount Number of Hart Info Node Objects. + + @retval EFI_SUCCESS Added Hart Info node successfully. + @retval EFI_INVALID_PARAMETER A parameter is invalid. +**/ +STATIC +EFI_STATUS +AddHartInfoNodes ( + IN CONST ACPI_RHCT_GENERATOR *CONST Generator, + IN CONST EFI_ACPI_6_6_RISCV_HART_CAPABILITIES_TABLE *Rhct, + IN CONST UINT32 NodesStartOffset, + IN CONST CM_RISCV_RINTC_INFO *NodeList, + IN UINT32 NodeCount + ) +{ + EFI_ACPI_6_6_RHCT_HART_INFO_NODE *HartInfoNode; + EFI_STATUS Status; + UINT64 NodeLength; + UINT32 NumOffsets; + UINT32 Offsets[MAX_OFFSETS_PER_HART]; + UINT32 IsaStringNodeOffset; + UINT32 CmoNodeOffset; + UINT32 MmuNodeOffset; + UINTN Idx; + + ASSERT (Rhct != NULL); + + IsaStringNodeOffset = 0; + CmoNodeOffset = 0; + HartInfoNode = (EFI_ACPI_6_6_RHCT_HART_INFO_NODE *)((UINT8 *)Rhct + NodesStartOffset); + Idx = 0; + while (NodeCount-- != 0) { + NumOffsets = 0; + Status = GetNodeOffsetReferencedByToken ( + Generator->NodeIndexer, + Generator->RhctNodeCount, + NodeList->IsaStringInfoToken, + &IsaStringNodeOffset + ); + if (Status == EFI_SUCCESS) { + NumOffsets++; + } + + Status = GetNodeOffsetReferencedByToken ( + Generator->NodeIndexer, + Generator->RhctNodeCount, + NodeList->CmoInfoToken, + &CmoNodeOffset + ); + if (Status == EFI_SUCCESS) { + NumOffsets++; + } + + Status = GetNodeOffsetReferencedByToken ( + Generator->NodeIndexer, + Generator->RhctNodeCount, + NodeList->MmuInfoToken, + &MmuNodeOffset + ); + if (Status == EFI_SUCCESS) { + NumOffsets++; + } + + Idx = 0; + if (IsaStringNodeOffset > 0) { + Offsets[Idx++] = IsaStringNodeOffset; + } + + if (CmoNodeOffset > 0) { + Offsets[Idx++] = CmoNodeOffset; + } + + if (MmuNodeOffset > 0) { + Offsets[Idx++] = MmuNodeOffset; + } + + NodeLength = sizeof (EFI_ACPI_6_6_RHCT_HART_INFO_NODE) + + (sizeof (UINT32) * NumOffsets); + if (NodeLength > MAX_UINT16) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "ERROR: RHCT: HartInfo Node length 0x%lx > MAX_UINT16." + " Status = %r\n", + NodeLength, + Status + )); + } + + // Populate the node header + HartInfoNode->Node.Type = EFI_ACPI_6_6_RHCT_NODE_TYPE_HART_INFO; + HartInfoNode->Node.Length = (UINT16)NodeLength; + HartInfoNode->Node.Revision = EFI_ACPI_6_6_RHCT_HART_INFO_NODE_STRUCTURE_VERSION; + + // RHCT specific data + HartInfoNode->NumOffsets = NumOffsets; + HartInfoNode->Uid = NodeList->AcpiProcessorUid; + CopyMem ((VOID *)HartInfoNode->Offsets, (VOID *)Offsets, sizeof (UINT32) * NumOffsets); + HartInfoNode = (EFI_ACPI_6_6_RHCT_HART_INFO_NODE *)((CHAR8 *)HartInfoNode + NodeLength); + NodeList++; + } // RHCT Group Node + + return EFI_SUCCESS; +} + +/** Construct the RHCT ACPI table. + + This function invokes the Configuration Manager protocol interface + to get the required hardware information for generating the ACPI + table. + + If this function allocates any resources then they must be freed + in the FreeXXXXTableResources function. + + @param [in] This Pointer to the table generator. + @param [in] AcpiTableInfo Pointer to the ACPI Table Info. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [out] Table Pointer to the constructed ACPI Table. + + @retval EFI_SUCCESS Table generated successfully. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND The required object was not found. + @retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration + Manager is less than the Object size for the + requested object. +**/ +STATIC +EFI_STATUS +EFIAPI +BuildRhctTable ( + IN CONST ACPI_TABLE_GENERATOR *CONST This, + IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + OUT EFI_ACPI_DESCRIPTION_HEADER **CONST Table + ) +{ + EFI_ACPI_6_6_RISCV_HART_CAPABILITIES_TABLE *Rhct; + CM_RISCV_ISA_STRING_NODE *IsaStringNodeList; + CM_RISCV_TIMER_INFO *TimerInfo; + CM_RISCV_RINTC_INFO *RintcInfoNodeList; + ACPI_RHCT_GENERATOR *Generator; + RHCT_NODE_INDEXER *NodeIndexer; + CM_RISCV_CMO_NODE *CmoNodeList; + CM_RISCV_MMU_NODE *MmuNodeList; + EFI_STATUS Status; + UINT32 TableSize; + UINT32 NodeSize; + UINT32 RhctNodeCount; + UINT32 IsaStringNodeCount; + UINT32 IsaStringOffset; + UINT32 CmoNodeCount; + UINT32 CmoOffset; + UINT32 MmuNodeCount; + UINT32 MmuOffset; + UINT32 HartInfoNodeCount; + UINT32 HartInfoOffset; + UINT32 TimerInfoCount; + + ASSERT (This != NULL); + ASSERT (AcpiTableInfo != NULL); + ASSERT (CfgMgrProtocol != NULL); + ASSERT (Table != NULL); + ASSERT (AcpiTableInfo->TableGeneratorId == This->GeneratorID); + ASSERT (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature); + + if ((AcpiTableInfo->AcpiTableRevision < This->MinAcpiTableRevision) || + (AcpiTableInfo->AcpiTableRevision > This->AcpiTableRevision)) + { + DEBUG (( + DEBUG_ERROR, + "ERROR: RHCT: Requested table revision = %d, is not supported." + "Supported table revision: Minimum = %d, Maximum = %d\n", + AcpiTableInfo->AcpiTableRevision, + This->MinAcpiTableRevision, + This->AcpiTableRevision + )); + return EFI_INVALID_PARAMETER; + } + + Generator = (ACPI_RHCT_GENERATOR *)This; + *Table = NULL; + + Status = GetERiscVObjTimerInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &TimerInfo, + &TimerInfoCount + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: RHCT: Failed to get Timer Info. Status = %r\n", + Status + )); + goto error_handler; + } + + // Get the Isa String node info + Status = GetERiscVObjIsaStringInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &IsaStringNodeList, + &IsaStringNodeCount + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: RHCT: Failed to get ISA string Node Info. Status = %r\n", + Status + )); + goto error_handler; + } + + // Add the ISA string node count + RhctNodeCount = IsaStringNodeCount; + + // Get the CMO node info + Status = GetERiscVObjCmoInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &CmoNodeList, + &CmoNodeCount + ); + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: RHCT: Failed to get CMO Node Info. Status = %r\n", + Status + )); + goto error_handler; + } + + // Add the CMO node count + RhctNodeCount += CmoNodeCount; + + // Get the MMU node info + Status = GetERiscVObjMmuInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &MmuNodeList, + &MmuNodeCount + ); + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: RHCT: Failed to get MMU Node Info. Status = %r\n", + Status + )); + goto error_handler; + } + + // Add the MMU node count + RhctNodeCount += MmuNodeCount; + + // Get the hart info node info + Status = GetERiscVObjRintcInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &RintcInfoNodeList, + &HartInfoNodeCount + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: RHCT: Failed to get Hart Info Node Info. Status = %r\n", + Status + )); + goto error_handler; + } + + // Add the Hart Info node count + RhctNodeCount += HartInfoNodeCount; + + // Allocate Node Indexer array + NodeIndexer = (RHCT_NODE_INDEXER *)AllocateZeroPool ( + (sizeof (RHCT_NODE_INDEXER) * + RhctNodeCount) + ); + if (NodeIndexer == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG (( + DEBUG_ERROR, + "ERROR: RHCT: Failed to allocate memory for Node Indexer" \ + " Status = %r\n", + Status + )); + goto error_handler; + } + + Generator->RhctNodeCount = RhctNodeCount; + Generator->NodeIndexer = NodeIndexer; + + // Calculate the size of the RHCT table + TableSize = sizeof (EFI_ACPI_6_6_RISCV_HART_CAPABILITIES_TABLE); + + if (IsaStringNodeCount > 0) { + IsaStringOffset = (UINT32)TableSize; + NodeSize = GetIsaStringNodeSize ( + IsaStringOffset, + IsaStringNodeList, + IsaStringNodeCount, + &NodeIndexer + ); + if (NodeSize > MAX_UINT32) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "ERROR: RHCT: Invalid Size of ISA string Nodes. Status = %r\n", + Status + )); + goto error_handler; + } + + TableSize += NodeSize; + + DEBUG (( + DEBUG_INFO, + " IsaStringNodeCount = %d\n" \ + " IsaStringOffset = %d\n", + IsaStringNodeCount, + IsaStringOffset + )); + } + + // CMO Nodes + if (CmoNodeCount > 0) { + CmoOffset = (UINT32)TableSize; + // Size of CMO node list. + NodeSize = GetSizeofCmoNodes ( + CmoOffset, + CmoNodeList, + CmoNodeCount, + &NodeIndexer + ); + if (NodeSize > MAX_UINT32) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "ERROR: RHCT: Invalid Size of CMO Nodes. Status = %r\n", + Status + )); + goto error_handler; + } + + TableSize += NodeSize; + + DEBUG (( + DEBUG_INFO, + " CmoNodeCount = %d\n" \ + " CmoOffset = %d\n", + CmoNodeCount, + CmoOffset + )); + } + + // MMU Nodes + if (MmuNodeCount > 0) { + MmuOffset = (UINT32)TableSize; + // Size of MMU node list. + NodeSize = GetSizeofMmuNodes ( + MmuOffset, + MmuNodeList, + MmuNodeCount, + &NodeIndexer + ); + if (NodeSize > MAX_UINT32) { + Status = EFI_INVALID_PARAMETER; + DEBUG (( + DEBUG_ERROR, + "ERROR: RHCT: Invalid Size of MMU Nodes. Status = %r\n", + Status + )); + goto error_handler; + } + + TableSize += NodeSize; + + DEBUG (( + DEBUG_INFO, + " MmuNodeCount = %d\n" \ + " MmuOffset = %d\n", + MmuNodeCount, + MmuOffset + )); + } + + // Hart Info Nodes + if (HartInfoNodeCount > 0) { + HartInfoOffset = (UINT32)TableSize; + // Size of Hart Info node list. + NodeSize = GetSizeofHartInfoNodes ( + Generator, + HartInfoOffset, + RintcInfoNodeList, + HartInfoNodeCount, + &NodeIndexer + ); + TableSize += NodeSize; + + DEBUG (( + DEBUG_INFO, + " HartInfoNodeCount = %d\n" \ + " HartInfoOffset = %d\n", + HartInfoNodeCount, + HartInfoOffset + )); + } + + DEBUG (( + DEBUG_INFO, + "INFO: RHCT:\n" \ + " RhctNodeCount = %d\n" \ + " TableSize = 0x%x\n", + RhctNodeCount, + TableSize + )); + + // Allocate the Buffer for RHCT table + *Table = (EFI_ACPI_DESCRIPTION_HEADER *)AllocateZeroPool (TableSize); + if (*Table == NULL) { + Status = EFI_OUT_OF_RESOURCES; + DEBUG (( + DEBUG_ERROR, + "ERROR: RHCT: Failed to allocate memory for RHCT Table, Size = %d," \ + " Status = %r\n", + TableSize, + Status + )); + goto error_handler; + } + + Rhct = (EFI_ACPI_6_6_RISCV_HART_CAPABILITIES_TABLE *)*Table; + + DEBUG (( + DEBUG_INFO, + "RHCT: Rhct = 0x%p TableSize = 0x%lx\n", + Rhct, + TableSize + )); + + Status = AddAcpiHeader ( + CfgMgrProtocol, + This, + &Rhct->Header, + AcpiTableInfo, + (UINT32)TableSize + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: RHCT: Failed to add ACPI header. Status = %r\n", + Status + )); + goto error_handler; + } + + // Update RHCT table + Rhct->NodeCount = RhctNodeCount; + Rhct->NodeOffset = sizeof (EFI_ACPI_6_6_RISCV_HART_CAPABILITIES_TABLE); + Rhct->TimeBaseFreq = TimerInfo->TimeBaseFrequency; + ASSERT ((TimerInfo->Flags & ~EFI_ACPI_6_6_RHCT_FLAG_TIMER_CANNOT_WAKEUP_CPU) == 0); + Rhct->Flags = TimerInfo->Flags; + + if (IsaStringNodeCount < 1) { + DEBUG ((DEBUG_ERROR, "ERROR: RHCT: Atleast one ISA node is required\n")); + Status = EFI_NOT_FOUND; + goto error_handler; + } + + if (IsaStringNodeCount > 0) { + Status = AddIsaStringNodes ( + Rhct, + IsaStringOffset, + IsaStringNodeList, + IsaStringNodeCount + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: RHCT: Failed to add ISA stirng Node. Status = %r\n", + Status + )); + } + } + + if (CmoNodeCount > 0) { + Status = AddCmoNodes ( + Rhct, + CmoOffset, + CmoNodeList, + CmoNodeCount + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: RHCT: Failed to add CMO Node. Status = %r\n", + Status + )); + } + } + + if (MmuNodeCount > 0) { + Status = AddMmuNodes ( + Rhct, + MmuOffset, + MmuNodeList, + MmuNodeCount + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: RHCT: Failed to add CMO Node. Status = %r\n", + Status + )); + } + } + + if (HartInfoNodeCount > 0) { + Status = AddHartInfoNodes ( + Generator, + Rhct, + HartInfoOffset, + RintcInfoNodeList, + HartInfoNodeCount + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: RHCT: Failed to add Hart Info Node. Status = %r\n", + Status + )); + goto error_handler; + } + } + + return EFI_SUCCESS; + +error_handler: + if (Generator->NodeIndexer != NULL) { + FreePool (Generator->NodeIndexer); + Generator->NodeIndexer = NULL; + } + + if (*Table != NULL) { + FreePool (*Table); + *Table = NULL; + } + + return Status; +} + +/** Free any resources allocated for constructing the RHCT + + @param [in] This Pointer to the table generator. + @param [in] AcpiTableInfo Pointer to the ACPI Table Info. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in, out] Table Pointer to the ACPI Table. + + @retval EFI_SUCCESS The resources were freed successfully. + @retval EFI_INVALID_PARAMETER The table pointer is NULL or invalid. +**/ +STATIC +EFI_STATUS +FreeRhctTableResources ( + IN CONST ACPI_TABLE_GENERATOR *CONST This, + IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN OUT EFI_ACPI_DESCRIPTION_HEADER **CONST Table + ) +{ + ACPI_RHCT_GENERATOR *Generator; + + ASSERT (This != NULL); + ASSERT (AcpiTableInfo != NULL); + ASSERT (CfgMgrProtocol != NULL); + ASSERT (AcpiTableInfo->TableGeneratorId == This->GeneratorID); + ASSERT (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature); + + Generator = (ACPI_RHCT_GENERATOR *)This; + + // Free any memory allocated by the generator + if (Generator->NodeIndexer != NULL) { + FreePool (Generator->NodeIndexer); + Generator->NodeIndexer = NULL; + } + + if ((Table == NULL) || (*Table == NULL)) { + DEBUG ((DEBUG_ERROR, "ERROR: RHCT: Invalid Table Pointer\n")); + ASSERT ((Table != NULL) && (*Table != NULL)); + return EFI_INVALID_PARAMETER; + } + + FreePool (*Table); + *Table = NULL; + return EFI_SUCCESS; +} + +/** The RHCT Table Generator revision. +*/ +#define RHCT_GENERATOR_REVISION CREATE_REVISION (1, 0) + +/** The interface for the MADT Table Generator. +*/ +STATIC +ACPI_RHCT_GENERATOR RhctGenerator = { + // ACPI table generator header + { + // Generator ID + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdRhct), + // Generator Description + L"ACPI.STD.RHCT.GENERATOR", + // ACPI Table Signature + EFI_ACPI_6_6_RISCV_HART_CAPABILITIES_TABLE_SIGNATURE, + // ACPI Table Revision supported by this Generator + EFI_ACPI_6_6_RHCT_TABLE_REVISION, + // Minimum supported ACPI Table Revision + EFI_ACPI_6_6_RHCT_TABLE_REVISION, + // Creator ID + TABLE_GENERATOR_CREATOR_ID, + // Creator Revision + RHCT_GENERATOR_REVISION, + // Build Table function + BuildRhctTable, + // Free Resource function + FreeRhctTableResources, + // Extended build function not needed + NULL, + // Extended build function not implemented by the generator. + // Hence extended free resource function is not required. + NULL + }, + + // RHCT Generator private data + + // Rhct Node count + 0, + // Pointer to Rhct node indexer + NULL +}; + +/** Register the Generator with the ACPI Table Factory. + + @param [in] ImageHandle The handle to the image. + @param [in] SystemTable Pointer to the System Table. + + @retval EFI_SUCCESS The Generator is registered. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_ALREADY_STARTED The Generator for the Table ID + is already registered. +**/ +EFI_STATUS +EFIAPI +AcpiRhctLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = RegisterAcpiTableGenerator (&RhctGenerator.Header); + DEBUG ((DEBUG_INFO, "RHCT: Register Generator. Status = %r\n", Status)); + ASSERT_EFI_ERROR (Status); + return Status; +} + +/** Deregister the Generator from the ACPI Table Factory. + + @param [in] ImageHandle The handle to the image. + @param [in] SystemTable Pointer to the System Table. + + @retval EFI_SUCCESS The Generator is deregistered. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND The Generator is not registered. +**/ +EFI_STATUS +EFIAPI +AcpiRhctLibDestructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = DeregisterAcpiTableGenerator (&RhctGenerator.Header); + DEBUG ((DEBUG_INFO, "Rhct: Deregister Generator. Status = %r\n", Status)); + ASSERT_EFI_ERROR (Status); + return Status; +} diff --git a/DynamicTablesPkg/Library/Acpi/RiscV/AcpiRhctLibRiscV/RhctGenerator.h b/DynamicTablesPkg/Library/Acpi/RiscV/AcpiRhctLibRiscV/RhctGenerator.h new file mode 100644 index 000000000000..a6055939dc3c --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/RiscV/AcpiRhctLibRiscV/RhctGenerator.h @@ -0,0 +1,44 @@ +/** @file + + Copyright (c) 2024, Ventana Micro Systems Inc. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Glossary: + - Cm or CM - Configuration Manager + - Obj or OBJ - Object + - Std or STD - Standard +**/ + +#ifndef RHCT_GENERATOR_H_ +#define RHCT_GENERATOR_H_ + +#pragma pack(1) + +/** A structure that describes the Node indexer + used for indexing the RHCT nodes. +*/ +typedef struct RhctNodeIndexer { + /// Index token for the Node + CM_OBJECT_TOKEN Token; + /// Pointer to the node + VOID *Object; + /// Node offset from the start of the RHCT table + UINT32 Offset; +} RHCT_NODE_INDEXER; + +typedef struct AcpiRhctGenerator { + /// ACPI Table generator header + ACPI_TABLE_GENERATOR Header; + + // RHCT Generator private data + + /// RHCT node count + UINT32 RhctNodeCount; + /// Pointer to the node indexer array + RHCT_NODE_INDEXER *NodeIndexer; +} ACPI_RHCT_GENERATOR; + +#pragma pack() + +#endif // RHCT_GENERATOR_H_ From 3a026170a48d72c3da2a5ff736f5dd1855fd0666 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Tue, 23 Jul 2024 20:39:33 +0530 Subject: [PATCH 0879/1172] DynamicTablesPkg/RISC-V: Add AcpiSsdtPlicAplicLib library Add AcpiSsdtPlicAplicLib to create PLIC and APLIC device entries in the RISC-V namespace. These interrupt controller devices are essential for accurate ACPI namespace representation on RISC-V platforms. This library facilitates SSDT generation for PLIC and APLIC, enabling proper OS discovery and configuration. Signed-off-by: Sunil V L --- DynamicTablesPkg/DynamicTables.dsc.inc | 2 + DynamicTablesPkg/Include/AcpiTableGenerator.h | 1 + .../AcpiSsdtPlicAplicLib.inf | 30 ++ .../SsdtPlicAplicGenerator.c | 441 ++++++++++++++++++ 4 files changed, 474 insertions(+) create mode 100644 DynamicTablesPkg/Library/Acpi/RiscV/AcpiSsdtPlicAplicLib/AcpiSsdtPlicAplicLib.inf create mode 100644 DynamicTablesPkg/Library/Acpi/RiscV/AcpiSsdtPlicAplicLib/SsdtPlicAplicGenerator.c diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc index 75871829e15f..998528bd02a2 100644 --- a/DynamicTablesPkg/DynamicTables.dsc.inc +++ b/DynamicTablesPkg/DynamicTables.dsc.inc @@ -156,6 +156,7 @@ # DynamicTablesPkg/Library/Acpi/RiscV/AcpiMadtLibRiscV/AcpiMadtLibRiscV.inf DynamicTablesPkg/Library/Acpi/RiscV/AcpiRhctLibRiscV/AcpiRhctLibRiscV.inf + DynamicTablesPkg/Library/Acpi/RiscV/AcpiSsdtPlicAplicLib/AcpiSsdtPlicAplicLib.inf # # Dynamic Table Factory Dxe @@ -180,4 +181,5 @@ # AML Codegen NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtCpuTopologyLib/SsdtCpuTopologyLib.inf NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtPcieLib/SsdtPcieLib.inf + NULL|DynamicTablesPkg/Library/Acpi/RiscV/AcpiSsdtPlicAplicLib/AcpiSsdtPlicAplicLib.inf } diff --git a/DynamicTablesPkg/Include/AcpiTableGenerator.h b/DynamicTablesPkg/Include/AcpiTableGenerator.h index 9d9e76058622..0cbc74c964f8 100755 --- a/DynamicTablesPkg/Include/AcpiTableGenerator.h +++ b/DynamicTablesPkg/Include/AcpiTableGenerator.h @@ -111,6 +111,7 @@ typedef enum StdAcpiTableId { EStdAcpiTableIdSsdtCmn600, ///< SSDT Cmn-600 Generator EStdAcpiTableIdSsdtCpuTopology, ///< SSDT Cpu Topology EStdAcpiTableIdSsdtPciExpress, ///< SSDT Pci Express Generator + EStdAcpiTableIdSsdtPlicAplic, ///< SSDT Plic/Aplic Generator EStdAcpiTableIdPcct, ///< PCCT Generator EStdAcpiTableIdTpm2, ///< TPM2 Generator EStdAcpiTableIdWsmt, ///< WSMT Generator diff --git a/DynamicTablesPkg/Library/Acpi/RiscV/AcpiSsdtPlicAplicLib/AcpiSsdtPlicAplicLib.inf b/DynamicTablesPkg/Library/Acpi/RiscV/AcpiSsdtPlicAplicLib/AcpiSsdtPlicAplicLib.inf new file mode 100644 index 000000000000..44b1c7227fbf --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/RiscV/AcpiSsdtPlicAplicLib/AcpiSsdtPlicAplicLib.inf @@ -0,0 +1,30 @@ +## @file +# Ssdt PLIC/APLIC Generator +# +# Copyright (c) 2024, Ventana Micro Systems Inc. All rights reserved.
    +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = SsdtPlicAplicLib + FILE_GUID = 5f9983fc-7dd3-552c-8580-d6d5b4a9a40e + VERSION_STRING = 1.0 + MODULE_TYPE = DXE_DRIVER + LIBRARY_CLASS = NULL|DXE_DRIVER + CONSTRUCTOR = AcpiSsdtPlicAplicLibConstructor + DESTRUCTOR = AcpiSsdtPlicAplicLibDestructor + +[Sources] + SsdtPlicAplicGenerator.c + +[Packages] + DynamicTablesPkg/DynamicTablesPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + AcpiHelperLib + AmlLib + BaseLib diff --git a/DynamicTablesPkg/Library/Acpi/RiscV/AcpiSsdtPlicAplicLib/SsdtPlicAplicGenerator.c b/DynamicTablesPkg/Library/Acpi/RiscV/AcpiSsdtPlicAplicLib/SsdtPlicAplicGenerator.c new file mode 100644 index 000000000000..7df3905f91f5 --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/RiscV/AcpiSsdtPlicAplicLib/SsdtPlicAplicGenerator.c @@ -0,0 +1,441 @@ +/** @file + RISC-V SSDT PLIC/APLIC namespace Generator. + + Copyright (c) 2024-2025, Ventana Micro Systems Inc. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - RISC-V Boot and Runtime Services (BRS) Specification : Section 6.2 + +**/ + +#include +#include +#include +#include +#include +#include + +// Module specific include files. +#include +#include +#include +#include +#include +#include +#include + +// _SB scope of the AML namespace. +#define SB_SCOPE "\\_SB_" + +/** RISC-V SSDT PLIC/APLIC namespace device Generator. + +Requirements: + The following Configuration Manager Object(s) are used by + this Generator: + - ERiscVObjAplicInfo + - ERiscVObjPlicInfo +*/ + +/** This macro expands to a function that retrieves the APLIC + Information from the Configuration Manager. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceRiscV, + ERiscVObjAplicInfo, + CM_RISCV_APLIC_INFO + ); + +/** This macro expands to a function that retrieves the PLIC + Information from the Configuration Manager. +*/ + +GET_OBJECT_LIST ( + EObjNameSpaceRiscV, + ERiscVObjPlicInfo, + CM_RISCV_PLIC_INFO + ); + +/** Generate a PLIC/APLIC device. + + @param [in] Generator The SSDT PlicAplic generator. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol interface. + @param [in] BaseAddress MMIO base of the PLIC/APLIC device. + @param [in] Size MMIO size of the PLIC/APLIC device. + @param [in] GsiBase GSI Base of the PLIC/APLIC device. + @param [in] Uid Unique Id of the PlicAplic device. + @param [in] Hid HID/CID of the interrupt controller device. + @param [in, out] ScopeNode ScopeNode of the AML tree to populate. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_OUT_OF_RESOURCES Could not allocate memory. +**/ +STATIC +EFI_STATUS +EFIAPI +GeneratePlicAplicDevice ( + IN PLIC_APLIC_COMMON_INFO *PlicAplicInfo, + IN CHAR8 *Hid, + IN UINT32 Uid, + IN AML_OBJECT_NODE_HANDLE ScopeNode + ) +{ + AML_OBJECT_NODE_HANDLE IcNode; + AML_OBJECT_NODE_HANDLE CrsNode; + EFI_STATUS Status; + CHAR8 AslName[AML_NAME_SEG_SIZE + 1]; + + ASSERT (PlicAplicInfo != NULL); + ASSERT (Hid != NULL); + ASSERT (Uid <= 0xFF); + + IcNode = NULL; + + // Write the name of the Interrupt Controller device. + CopyMem (AslName, "ICxx", AML_NAME_SEG_SIZE + 1); + AslName[AML_NAME_SEG_SIZE - 1] = AsciiFromHex (Uid & 0xF); + AslName[AML_NAME_SEG_SIZE - 2] = AsciiFromHex ((Uid >> 4) & 0xF); + + // ASL: Device (ICxx) {} + Status = AmlCodeGenDevice (AslName, ScopeNode, &IcNode); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + // ASL: Name (_UID, ) + Status = AmlCodeGenNameInteger ("_UID", Uid, IcNode, NULL); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + Status = AmlCodeGenNameString ( + "_HID", + Hid, + IcNode, + NULL + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + // ASL: Name (_CRS, ResourceTemplate () {}) + Status = AmlCodeGenNameResourceTemplate ("_CRS", IcNode, &CrsNode); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + Status = AmlCodeGenRdMemory32Fixed ( + TRUE, + PlicAplicInfo->BaseAddress, + PlicAplicInfo->Size, + CrsNode, + NULL + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + Status = AmlCodeGenNameInteger ("_GSB", PlicAplicInfo->GsiBase, IcNode, NULL); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + return Status; +} + +/** Construct SSDT tables describing PLIC/APLIC devices + + This function invokes the Configuration Manager protocol interface + to get the required hardware information for generating the ACPI + table. + + If this function allocates any resources then they must be freed + in the FreeXXXXTableResourcesEx function. + + @param [in] This Pointer to the ACPI table generator. + @param [in] AcpiTableInfo Pointer to the ACPI table information. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol interface. + @param [out] Table Pointer to a list of generated ACPI table(s). + + @retval EFI_SUCCESS Table generated successfully. + @retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration + Manager is less than the Object size for + the requested object. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND Could not find information. + @retval EFI_OUT_OF_RESOURCES Could not allocate memory. + @retval EFI_UNSUPPORTED Unsupported configuration. +**/ +STATIC +EFI_STATUS +EFIAPI +BuildSsdtPlicAplicTable ( + IN CONST ACPI_TABLE_GENERATOR *This, + IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + OUT EFI_ACPI_DESCRIPTION_HEADER **Table + ) +{ + AML_ROOT_NODE_HANDLE RootNode; + AML_OBJECT_NODE_HANDLE ScopeNode; + ACPI_TABLE_GENERATOR *Generator; + CM_RISCV_APLIC_INFO *AplicInfo; + CM_RISCV_PLIC_INFO *PlicInfo; + EFI_STATUS Status; + EFI_STATUS Status1; + UINT32 Index; + UINT32 PlicCount; + UINT32 AplicCount; + UINT32 Count; + UINT32 Uid; + + ASSERT (This != NULL); + ASSERT (AcpiTableInfo != NULL); + ASSERT (CfgMgrProtocol != NULL); + ASSERT (Table != NULL); + ASSERT (AcpiTableInfo->TableGeneratorId == This->GeneratorID); + ASSERT (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature); + + Generator = (ACPI_TABLE_GENERATOR *)This; + + Status = GetERiscVObjAplicInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &AplicInfo, + &AplicCount + ); + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { + ASSERT (0); + return Status; + } else if (Status == EFI_NOT_FOUND) { + Status = GetERiscVObjPlicInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &PlicInfo, + &PlicCount + ); + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { + ASSERT (0); + return Status; + } + } + + Count = (AplicCount != 0) ? AplicCount : PlicCount; + + if (Count == 0) { + Status = EFI_NOT_FOUND; + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-PLIC-APLIC: Failed to find any PLIC or APLIC." + " Status = %r\n", + Status + )); + return Status; + } + + // Create a new Ssdt table. + Status = AddSsdtAcpiHeader ( + CfgMgrProtocol, + Generator, + AcpiTableInfo, + &RootNode + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + // ASL: Scope (\_SB) {} + Status = AmlCodeGenScope (SB_SCOPE, RootNode, &ScopeNode); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + for (Index = 0; Index < Count; Index++) { + Uid = Index; + Status = GeneratePlicAplicDevice ( + AplicCount ? &AplicInfo[Index].PlicAplicCommonInfo : + &PlicInfo[Index].PlicAplicCommonInfo, + AplicCount ? "RSCV0002" : "RSCV0001", + Uid, + ScopeNode + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + goto exit_handler; + } + + // Serialize the tree. + Status = AmlSerializeDefinitionBlock ( + RootNode, + Table + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-PLIC: Failed to Serialize SSDT Table Data." + " Status = %r\n", + Status + )); + } + } // for + +exit_handler: + // Cleanup + Status1 = AmlDeleteTree (RootNode); + if (EFI_ERROR (Status1)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-PLIC: Failed to cleanup AML tree." + " Status = %r\n", + Status1 + )); + // If Status was success but we failed to delete the AML Tree + // return Status1 else return the original error code, i.e. Status. + if (!EFI_ERROR (Status)) { + return Status1; + } + } + + return Status; +} + +/** Free any resources allocated for constructing the tables. + + @param [in] This Pointer to the ACPI table generator. + @param [in] AcpiTableInfo Pointer to the ACPI Table Info. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in, out] Table Pointer to an array of pointers + to ACPI Table(s). + + @retval EFI_SUCCESS The resources were freed successfully. + @retval EFI_INVALID_PARAMETER The table pointer is NULL or invalid. +**/ +STATIC +EFI_STATUS +EFIAPI +FreeSsdtPlicAplicTable ( + IN CONST ACPI_TABLE_GENERATOR *CONST This, + IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN OUT EFI_ACPI_DESCRIPTION_HEADER **CONST Table + ) +{ + ASSERT (This != NULL); + ASSERT (AcpiTableInfo != NULL); + ASSERT (CfgMgrProtocol != NULL); + ASSERT (AcpiTableInfo->TableGeneratorId == This->GeneratorID); + ASSERT (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature); + + if ((Table == NULL) || (*Table == NULL)) { + DEBUG ((DEBUG_ERROR, "ERROR: SSDT-PLIC-APLIC: Invalid Table Pointer\n")); + return EFI_INVALID_PARAMETER; + } + + // Free the table list. + FreePool (*Table); + *Table = NULL; + return EFI_SUCCESS; +} + +/** This macro defines the SSDT PlicAplic Table Generator revision. +*/ +#define SSDT_PLIC_APLIC_GENERATOR_REVISION CREATE_REVISION (1, 0) + +/** The interface for the RISC-V SSDT PLIC/APLIC Table Generator. +*/ +STATIC +CONST +ACPI_TABLE_GENERATOR SsdtPlicAplicGenerator = { + // Generator ID + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdSsdtPlicAplic), + // Generator Description + L"ACPI.STD.SSDT.PLIC.APLIC.GENERATOR", + // ACPI Table Signature + EFI_ACPI_6_3_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, + // ACPI Table Revision - Unused + 0, + // Minimum ACPI Table Revision - Unused + 0, + // Creator ID + TABLE_GENERATOR_CREATOR_ID, + // Creator Revision + SSDT_PLIC_APLIC_GENERATOR_REVISION, + // Build table function. Use the extended version instead. + BuildSsdtPlicAplicTable, + // Free table function. Use the extended version instead. + FreeSsdtPlicAplicTable, + // Extended Build table function. + NULL, + // Extended free function. + NULL, +}; + +/** Register the Generator with the ACPI Table Factory. + + @param [in] ImageHandle The handle to the image. + @param [in] SystemTable Pointer to the System Table. + + @retval EFI_SUCCESS The Generator is registered. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_ALREADY_STARTED The Generator for the Table ID + is already registered. +**/ +EFI_STATUS +EFIAPI +AcpiSsdtPlicAplicLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = RegisterAcpiTableGenerator (&SsdtPlicAplicGenerator); + DEBUG (( + DEBUG_INFO, + "SSDT-PLIC-APLIC: Register Generator. Status = %r\n", + Status + )); + ASSERT_EFI_ERROR (Status); + return Status; +} + +/** Deregister the Generator from the ACPI Table Factory. + + @param [in] ImageHandle The handle to the image. + @param [in] SystemTable Pointer to the System Table. + + @retval EFI_SUCCESS The Generator is deregistered. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND The Generator is not registered. +**/ +EFI_STATUS +EFIAPI +AcpiSsdtPlicAplicLibDestructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = DeregisterAcpiTableGenerator (&SsdtPlicAplicGenerator); + DEBUG (( + DEBUG_INFO, + "SSDT-PLIC-APLIC: Deregister Generator. Status = %r\n", + Status + )); + ASSERT_EFI_ERROR (Status); + return Status; +} From b6c60927c45ff311b3adc6a6c44a3628c5f7a062 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Thu, 20 Jun 2024 17:12:24 +0530 Subject: [PATCH 0880/1172] DynamicTablesPkg/FdtHwInfoParserLib: Add RISC-V FDT parsers Add FDT parsers for RISC-V that extract hardware information from the Flattened Device Tree (FDT) and create corresponding Configuration Manager (CM) objects. These CM objects provide the necessary data for ACPI table generators, such as MADT, RHCT, and SSDT, to construct RISC-V-specific tables. Signed-off-by: Sunil V L --- .../FdtHwInfoParserLib/FdtHwInfoParserLib.inf | 13 +- .../Library/FdtHwInfoParserLib/FdtUtility.h | 42 +- .../RiscV/HartInfo/RiscVTimerDispatcher.c | 142 ++ .../RiscV/HartInfo/RiscVTimerDispatcher.h | 39 + .../RiscV/Intc/RiscVExtIntcData.c | 132 ++ .../RiscV/Intc/RiscVIntcParser.c | 1379 +++++++++++++++++ .../RiscV/Intc/RiscVIntcParser.h | 47 + .../RiscV/RiscVFdtHwInfoParser.c | 84 + .../RiscV/RiscVFdtInterrupt.c | 92 ++ 9 files changed, 1966 insertions(+), 4 deletions(-) create mode 100644 DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/HartInfo/RiscVTimerDispatcher.c create mode 100644 DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/HartInfo/RiscVTimerDispatcher.h create mode 100644 DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/Intc/RiscVExtIntcData.c create mode 100644 DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/Intc/RiscVIntcParser.c create mode 100644 DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/Intc/RiscVIntcParser.h create mode 100644 DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/RiscVFdtHwInfoParser.c create mode 100644 DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/RiscVFdtInterrupt.c diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf b/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf index 64afab1ed14a..2821895e49ec 100644 --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf @@ -14,6 +14,9 @@ MODULE_TYPE = DXE_DRIVER LIBRARY_CLASS = HwInfoParserLib +[Defines.RISCV64] + DESTRUCTOR = RiscVExtIntcDataDestructor + [Sources] CmObjectDescUtility.c CmObjectDescUtility.h @@ -50,7 +53,15 @@ Arm/Iort/RootComplexParser.c Arm/Iort/SmmuV3Parser.c -[Packages.AARCH64] +[Sources.RISCV64] + RiscV/RiscVFdtInterrupt.c + RiscV/RiscVFdtHwInfoParser.c + RiscV/Intc/RiscVIntcParser.c + RiscV/Intc/RiscVIntcParser.h + RiscV/Intc/RiscVExtIntcData.c + RiscV/HartInfo/RiscVTimerDispatcher.c + +[Packages.ARM, Packages.AARCH64] ArmPkg/ArmPkg.dec [Packages] diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtUtility.h b/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtUtility.h index 2d7048753b9f..73441ea7aa6a 100644 --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtUtility.h +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtUtility.h @@ -62,9 +62,11 @@ #define DT_SPI_IRQ (0U) #define DT_IRQ_IS_EDGE_TRIGGERED(x) ((((x) & (BIT0 | BIT1)) != 0)) #define DT_IRQ_IS_ACTIVE_LOW(x) ((((x) & (BIT1 | BIT3)) != 0)) -#define IRQ_TYPE_OFFSET (0U) -#define IRQ_NUMBER_OFFSET (1U) -#define IRQ_FLAGS_OFFSET (2U) +#define IRQ_TYPE_OFFSET (0U) +#define IRQ_NUMBER_OFFSET (1U) +#define IRQ_FLAGS_OFFSET (2U) +#define RISCV_IRQ_NUMBER_OFFSET (0U) +#define RISCV_IRQ_FLAGS_OFFSET (1U) /** Get the interrupt Id of an interrupt described in a fdt. @@ -485,4 +487,38 @@ FdtGetIntcAddressCells ( OUT INT32 *SizeCells OPTIONAL ); +/** Convert the IRQ number in DT to ACPI GSI number + + In RISC-V, GSI space is divided among PLIC/APLICs. Hence, based + on the parent interrupt controller, the IRQ number need to be + converted into appropriate GSI number. + + @param [in] ExtIntcNode Parent interrupt controller node. + @param [in] Irq Irq number to convert. + +**/ +UINT32 +FdtConvertToGsi ( + IN INT32 ExtIntcNode, + IN UINT32 Irq + ); + +/** Create list of external interrupt controllers. + + In RISC-V, GSI space is divided among PLIC/APLICs. To convert + the IRQ number in DT of a device to appropriate GSI number, + create a list of external interrupt controllers. + + @param [in] ExtIntcNode External interrupt controller node. + @param [in] GsiBase GSI base of the interrupt controller. + + @retval EFI_SUCCESS External interript controller node is added in the list. + @retval EFI_OUT_OF_RESOURCES Failed to allocate memory for the list. +**/ +EFI_STATUS +FdtCreateExtIntcList ( + INT32 ExtIntcNode, + UINT32 GsiBase + ); + #endif // FDT_UTILITY_H_ diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/HartInfo/RiscVTimerDispatcher.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/HartInfo/RiscVTimerDispatcher.c new file mode 100644 index 000000000000..19a13bbbb12b --- /dev/null +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/HartInfo/RiscVTimerDispatcher.c @@ -0,0 +1,142 @@ +/** @file + RISC-V Hart Information dispatcher. + + Copyright (c) 2024, Ventana Micro Systems Inc. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): +**/ + +#include +#include +#include +#include "FdtHwInfoParser.h" +#include "CmObjectDescUtility.h" +#include "HartInfo/RiscVTimerDispatcher.h" + +/** List of "compatible" property values for timer node. + + Any other "compatible" value is not supported by this module. +*/ +STATIC CONST COMPATIBILITY_STR TimerCompatibleStr[] = { + { "riscv,timer" } +}; + +/** COMPATIBILITY_INFO structure for timer node. +*/ +STATIC CONST COMPATIBILITY_INFO TimerCompatibleInfo = { + ARRAY_SIZE (TimerCompatibleStr), + TimerCompatibleStr +}; + +/** Create Timer Info structure. + + Create Timer info structure with time base frequency and flag. + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] CpusNode cpus node. +**/ +STATIC +EFI_STATUS +EFIAPI +RiscVTimerInfoParser ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN INT32 CpusNode + ) +{ + CM_RISCV_TIMER_INFO TimerInfo; + CONST UINT64 *Prop; + EFI_STATUS Status; + INT32 Len; + INT32 TimerNode; + VOID *Fdt; + + Fdt = FdtParserHandle->Fdt; + + ZeroMem (&TimerInfo, sizeof (CM_RISCV_TIMER_INFO)); + if (CpusNode < 0) { + return EFI_INVALID_PARAMETER; + } + + Prop = FdtGetProp (Fdt, CpusNode, "timebase-frequency", &Len); + if (Prop) { + TimerInfo.TimeBaseFrequency = Fdt32ToCpu (*(const UINT32 *)Prop); + } else { + DEBUG ((DEBUG_ERROR, "Failed to parse cpu node:timebase-frequency\n")); + return EFI_NOT_FOUND; + } + + TimerNode = -1; + Status = FdtGetNextCompatNodeInBranch (Fdt, -1, &TimerCompatibleInfo, &TimerNode); + if (!EFI_ERROR (Status)) { + Prop = FdtGetProp (Fdt, TimerNode, "riscv,timer-cannot-wake-cpu", &Len); + if (Prop) { + TimerInfo.Flags = EFI_ACPI_6_6_RHCT_FLAG_TIMER_CANNOT_WAKEUP_CPU; + } + } + + Status = AddSingleCmObj ( + FdtParserHandle, + CREATE_CM_RISCV_OBJECT_ID (ERiscVObjTimerInfo), + &TimerInfo, + sizeof (CM_RISCV_TIMER_INFO), + NULL + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + } + + return Status; +} + +/** Timer dispatcher. + + A parser parses a Device Tree to populate a specific CmObj type. None, + one or many CmObj can be created by the parser. + The created CmObj are then handed to the parser's caller through the + HW_INFO_ADD_OBJECT interface. + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] FdtBranch When searching for DT node name, restrict + the search to this Device Tree branch. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. + @retval EFI_UNSUPPORTED Unsupported. +**/ +EFI_STATUS +EFIAPI +RiscVTimerDispatcher ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN INT32 FdtBranch + ) +{ + EFI_STATUS Status; + INT32 CpusNode; + VOID *Fdt; + + if (FdtParserHandle == NULL) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + Fdt = FdtParserHandle->Fdt; + + // The "cpus" node resides at the root of the DT. Fetch it. + CpusNode = FdtPathOffset (Fdt, "/cpus"); + if (CpusNode < 0) { + return EFI_NOT_FOUND; + } + + Status = RiscVTimerInfoParser (FdtParserHandle, CpusNode); + if (EFI_ERROR (Status)) { + // EFI_NOT_FOUND is not tolerated at this point. + ASSERT (0); + return Status; + } + + return EFI_SUCCESS; +} diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/HartInfo/RiscVTimerDispatcher.h b/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/HartInfo/RiscVTimerDispatcher.h new file mode 100644 index 000000000000..656906250148 --- /dev/null +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/HartInfo/RiscVTimerDispatcher.h @@ -0,0 +1,39 @@ +/** @file + RISC-V Hart Info dispatcher. + + Copyright (c) 2024, Ventana Micro Systems Inc. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef RISCV_TIMER_DISPATCHER_H_ +#define RISCV_TIMER_DISPATCHER_H_ + +#include + +/** RISC-V timer dispatcher. + + A parser parses a Device Tree to populate a specific CmObj type. None, + one or many CmObj can be created by the parser. + The created CmObj are then handed to the parser's caller through the + HW_INFO_ADD_OBJECT interface. + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] FdtBranch When searching for DT node name, restrict + the search to this Device Tree branch. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. + @retval EFI_UNSUPPORTED Unsupported. +**/ +EFI_STATUS +EFIAPI +RiscVTimerDispatcher ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN INT32 FdtBranch + ); + +#endif // RISCV_TIMER_DISPATCHER_H_ diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/Intc/RiscVExtIntcData.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/Intc/RiscVExtIntcData.c new file mode 100644 index 000000000000..42a75d763f87 --- /dev/null +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/Intc/RiscVExtIntcData.c @@ -0,0 +1,132 @@ +/** @file + RISC-V Interrupt Controllers parser. + + Copyright (c) 2025, Ventana Micro Systems Inc. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include + +typedef struct { + UINT32 Signature; + LIST_ENTRY Link; + INT32 ExtIntcNode; + UINT32 GsiBase; +} RISCV_EXT_INTC_DATA; + +// +// Unique signature for private data structure. +// +#define RISCV_EXT_INTC_DATA_SIGNATURE SIGNATURE_32 ('R','S','I','C') + +#define RISCV_EXT_INTC_INFO_FROM_THIS(a) \ + CR (a, \ + RISCV_EXT_INTC_DATA, \ + Link, \ + RISCV_EXT_INTC_DATA_SIGNATURE \ + ); + +STATIC LIST_ENTRY mExtIntcList; + +/** Create list of external interrupt controllers. + + In RISC-V, GSI space is divided among PLIC/APLICs. To convert + the IRQ number in DT of a device to appropriate GSI number, + create a list of external interrupt controllers. + + @param [in] ExtIntcNode External interrupt controller node. + @param [in] GsiBase GSI base of the interrupt controller. + + @retval EFI_SUCCESS External interript controller node is added in the list. + @retval EFI_OUT_OF_RESOURCES Failed to allocate memory for the list. +**/ +EFI_STATUS +FdtCreateExtIntcList ( + INT32 ExtIntcNode, + UINT32 GsiBase + ) +{ + RISCV_EXT_INTC_DATA *Node; + + Node = AllocateZeroPool (sizeof (RISCV_EXT_INTC_DATA)); + if (Node == NULL) { + ASSERT (0); + return EFI_OUT_OF_RESOURCES; + } + + // Initialise the list head. + InitializeListHead (&mExtIntcList); + Node->Signature = RISCV_EXT_INTC_DATA_SIGNATURE; + Node->ExtIntcNode = ExtIntcNode; + Node->GsiBase = GsiBase; + InsertTailList (&mExtIntcList, &Node->Link); + return EFI_SUCCESS; +} + +/** Convert the IRQ number in DT to ACPI GSI number + + In RISC-V, GSI space is divided among PLIC/APLICs. Hence, based + on the parent interrupt controller, the IRQ number need to be + converted into appropriate GSI number. + + @param [in] ExtIntcNode Parent interrupt controller node. + @param [in] Irq Irq number to convert. + +**/ +UINT32 +FdtConvertToGsi ( + INT32 ExtIntcNode, + UINT32 Irq + ) +{ + LIST_ENTRY *Node; + RISCV_EXT_INTC_DATA *Data; + + Node = GetFirstNode (&mExtIntcList); + while (!IsNull (&mExtIntcList, Node)) { + Data = RISCV_EXT_INTC_INFO_FROM_THIS (Node); + if (Data->ExtIntcNode == ExtIntcNode) { + return Data->GsiBase + Irq; + } + + Node = GetNextNode (&mExtIntcList, Node); + } + + return Irq; +} + +/** Free the external interrupt controller/GSI base list + + @param [in] ImageHandle The handle to the image. + @param [in] SystemTable Pointer to the System Table. + + @retval EFI_SUCCESS The list is freed up. +**/ +EFI_STATUS +EFIAPI +RiscVExtIntcDataDestructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + RISCV_EXT_INTC_DATA *Data; + LIST_ENTRY *NextNode; + LIST_ENTRY *Node; + + Node = GetFirstNode (&mExtIntcList); + while (!IsNull (&mExtIntcList, Node)) { + Data = RISCV_EXT_INTC_INFO_FROM_THIS (Node); + NextNode = GetNextNode (&mExtIntcList, Node); + RemoveEntryList (&Data->Link); + FreePool (Data); + + Node = NextNode; + } + + return EFI_SUCCESS; +} diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/Intc/RiscVIntcParser.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/Intc/RiscVIntcParser.c new file mode 100644 index 000000000000..6619e6ee79ca --- /dev/null +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/Intc/RiscVIntcParser.c @@ -0,0 +1,1379 @@ +/** @file + RISC-V Interrupt Controllers parser. + + Copyright (c) 2024, Ventana Micro Systems Inc. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - linux/Documentation/devicetree/bindings/riscv/cpus.yaml +**/ + +#include +#include +#include +#include +#include "FdtHwInfoParser.h" +#include "CmObjectDescUtility.h" +#include "RiscV/Intc/RiscVIntcParser.h" + +#define ACPI_BUILD_EXT_INTC_ID(PlicAplicId, CtxIdcId) \ + ((PlicAplicId << 24) | (CtxIdcId)) + +/** List of "compatible" property values for CPU nodes. + + Any other "compatible" value is not supported by this module. +*/ +STATIC CONST COMPATIBILITY_STR CpuCompatibleStr[] = { + { "riscv" } +}; + +/** COMPATIBILITY_INFO structure for CPU nodes. +*/ +STATIC CONST COMPATIBILITY_INFO CpuCompatibleInfo = { + ARRAY_SIZE (CpuCompatibleStr), + CpuCompatibleStr +}; + +/** List of "compatible" property values for IMSIC node. + + Any other "compatible" value is not supported by this module. +*/ +STATIC CONST COMPATIBILITY_STR ImsicCompatibleStr[] = { + { "riscv,imsics" } +}; + +/** COMPATIBILITY_INFO structure for IMSIC node. +*/ +STATIC CONST COMPATIBILITY_INFO ImsicCompatibleInfo = { + ARRAY_SIZE (ImsicCompatibleStr), + ImsicCompatibleStr +}; + +/** List of "compatible" property values for APLIC node. + + Any other "compatible" value is not supported by this module. +*/ +STATIC CONST COMPATIBILITY_STR AplicCompatibleStr[] = { + { "riscv,aplic" } +}; + +/** COMPATIBILITY_INFO structure for APLIC node. +*/ +STATIC CONST COMPATIBILITY_INFO AplicCompatibleInfo = { + ARRAY_SIZE (AplicCompatibleStr), + AplicCompatibleStr +}; + +/** List of "compatible" property values for PLIC node. + + Any other "compatible" value is not supported by this module. +*/ +STATIC CONST COMPATIBILITY_STR PlicCompatibleStr[] = { + { "riscv,plic0" } +}; + +/** COMPATIBILITY_INFO structure for IMSIC node. +*/ +STATIC CONST COMPATIBILITY_INFO PlicCompatibleInfo = { + ARRAY_SIZE (PlicCompatibleStr), + PlicCompatibleStr +}; + +/** Create MMU info structure + + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] CpuNode cpu node. + +**/ +STATIC +EFI_STATUS +EFIAPI +MmuInfoParser ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN INT32 CpuNode, + OUT CM_OBJECT_TOKEN *Token + ) +{ + CM_RISCV_MMU_NODE MmuInfo; + CONST VOID *Prop; + EFI_STATUS Status; + INT32 PropSize; + VOID *Fdt; + + Fdt = FdtParserHandle->Fdt; + ZeroMem (&MmuInfo, sizeof (CM_RISCV_MMU_NODE)); + Prop = FdtGetProp (Fdt, CpuNode, "mmu-type", &PropSize); + if (!Prop) { + return EFI_NOT_FOUND; + } + + if (AsciiStrnCmp (Prop, "riscv,sv39", 10) == 0) { + MmuInfo.MmuType = EFI_ACPI_6_6_RHCT_MMU_TYPE_SV39; + } else if (AsciiStrnCmp (Prop, "riscv,sv48", 10) == 0) { + MmuInfo.MmuType = EFI_ACPI_6_6_RHCT_MMU_TYPE_SV48; + } else if (AsciiStrnCmp (Prop, "riscv,sv57", 10) == 0) { + MmuInfo.MmuType = EFI_ACPI_6_6_RHCT_MMU_TYPE_SV57; + } + + // Add the CmObj to the Configuration Manager. + Status = AddSingleCmObj ( + FdtParserHandle, + CREATE_CM_RISCV_OBJECT_ID (ERiscVObjMmuInfo), + &MmuInfo, + sizeof (CM_RISCV_MMU_NODE), + Token + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + } + + return Status; +} + +/** Create CMO info structure if CMO extension present + + Create CMO structure with CBOM, CBOP and CBOZ sizes. + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] CpusNode cpus node. + +**/ +STATIC +EFI_STATUS +EFIAPI +CmoInfoParser ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN INT32 CpuNode, + OUT CM_OBJECT_TOKEN *Token + ) +{ + CM_RISCV_CMO_NODE CmoInfo; + EFI_STATUS Status; + CONST VOID *Prop; + BOOLEAN CmoSupported; + INT32 PropSize; + VOID *Fdt; + + Fdt = FdtParserHandle->Fdt; + ZeroMem (&CmoInfo, sizeof (CM_RISCV_CMO_NODE)); + CmoSupported = FALSE; + Prop = FdtGetProp (Fdt, CpuNode, "riscv,cbom-block-size", &PropSize); + if (Prop) { + CmoSupported = TRUE; + CmoInfo.CbomBlockSize = LowBitSet32 (Fdt32ToCpu (*(const UINT32 *)Prop)); + } + + Prop = FdtGetProp (Fdt, CpuNode, "riscv,cboz-block-size", &PropSize); + if (Prop) { + CmoSupported = TRUE; + CmoInfo.CbozBlockSize = LowBitSet32 (Fdt32ToCpu (*(const UINT32 *)Prop)); + } + + Prop = FdtGetProp (Fdt, CpuNode, "riscv,cbop-block-size", &PropSize); + if (Prop) { + CmoSupported = TRUE; + CmoInfo.CbopBlockSize = LowBitSet32 (Fdt32ToCpu (*(const UINT32 *)Prop)); + } + + if (CmoSupported == TRUE) { + // Add the CmObj to the Configuration Manager. + Status = AddSingleCmObj ( + FdtParserHandle, + CREATE_CM_RISCV_OBJECT_ID (ERiscVObjCmoInfo), + &CmoInfo, + sizeof (CM_RISCV_CMO_NODE), + Token + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + } + + return Status; + } + + return EFI_NOT_FOUND; +} + +/** Create ISA string Info structure + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] CpusNode cpus node. +**/ +STATIC +EFI_STATUS +EFIAPI +IsaStringInfoParser ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN INT32 CpuNode, + OUT CM_OBJECT_TOKEN *Token + ) +{ + CM_RISCV_ISA_STRING_NODE IsaStringInfo; + CONST VOID *Prop; + EFI_STATUS Status; + INT32 PropSize; + VOID *Fdt; + + Fdt = FdtParserHandle->Fdt; + ZeroMem (&IsaStringInfo, sizeof (CM_RISCV_ISA_STRING_NODE)); + Prop = FdtGetProp (Fdt, CpuNode, "riscv,isa", &PropSize); + if (!Prop) { + DEBUG ((DEBUG_ERROR, "Failed to parse cpu node: riscv,isa\n")); + ASSERT (0); + return EFI_ABORTED; + } + + IsaStringInfo.Length = PropSize + 1; + AsciiStrCpyS (IsaStringInfo.IsaString, PropSize + 1, (CHAR8 *)Prop); + + // Add the CmObj to the Configuration Manager. + Status = AddSingleCmObj ( + FdtParserHandle, + CREATE_CM_RISCV_OBJECT_ID (ERiscVObjIsaStringInfo), + &IsaStringInfo, + sizeof (CM_RISCV_ISA_STRING_NODE), + Token + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + } + + return Status; +} + +/** Parse a "cpu" node. + + CPU node parser. + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] CpuNode cpu node. + @param [in] AddressCells AddressCells info. + @param [out] RintcInfo Pointer to RINTC Info structure. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. + @retval EFI_UNSUPPORTED Unsupported. +**/ +STATIC +EFI_STATUS +EFIAPI +CpuNodeParser ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN INT32 CpuNode, + IN UINT32 AddressCells, + OUT CM_RISCV_RINTC_INFO *RintcInfo + ) +{ + CONST CHAR8 *CpuName; + CONST VOID *Prop; + EFI_STATUS Status; + UINT64 HartId; + INT32 PropSize; + INT32 IntcNode; + UINTN ProcUid; + VOID *Fdt; + + if (RintcInfo == NULL) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + Fdt = FdtParserHandle->Fdt; + Prop = FdtGetProp (Fdt, CpuNode, "reg", &PropSize); + if ((Prop == NULL) || + ((PropSize != sizeof (UINT32)) && + (PropSize != sizeof (UINT64)))) + { + ASSERT (0); + return EFI_ABORTED; + } + + IntcNode = CpuNode; + Status = FdtGetNextNamedNodeInBranch (Fdt, CpuNode, "interrupt-controller", &IntcNode); + if (EFI_ERROR (Status)) { + ASSERT (0); + if (Status == EFI_NOT_FOUND) { + // Should have found the node. + Status = EFI_ABORTED; + } + } + + CpuName = FdtGetName (Fdt, CpuNode, &PropSize); + ProcUid = AsciiStrDecimalToUintn (&CpuName[4]); + if (AddressCells == 2) { + HartId = Fdt64ToCpu (*((UINT64 *)Prop)); + } else { + HartId = Fdt32ToCpu (*((UINT32 *)Prop)); + } + + /* + * Check for disabled cpu and mark appropriately in MADT. + */ + Prop = FdtGetProp (Fdt, CpuNode, "status", &PropSize); + if (!Prop || (Prop && + ((AsciiStrnCmp ((const CHAR8 *)Prop, "okay", PropSize) == 0) || + (AsciiStrnCmp ((const CHAR8 *)Prop, "ok", PropSize) == 0)))) + { + RintcInfo->Flags = EFI_ACPI_6_6_RINTC_FLAG_ENABLE; + } else { + RintcInfo->Flags = 0; + } + + RintcInfo->HartId = HartId; + RintcInfo->Version = EFI_ACPI_6_6_RINTC_STRUCTURE_VERSION; + RintcInfo->AcpiProcessorUid = ProcUid; + RintcInfo->ExtIntcId = 0; // Will be updated later + + Status = IsaStringInfoParser (FdtParserHandle, CpuNode, &RintcInfo->IsaStringInfoToken); + if (EFI_ERROR (Status)) { + ASSERT (0); + if (Status == EFI_NOT_FOUND) { + // Should have found the node. + Status = EFI_ABORTED; + } + + return Status; + } + + Status = CmoInfoParser (FdtParserHandle, CpuNode, &RintcInfo->CmoInfoToken); + if (EFI_ERROR (Status)) { + if (Status != EFI_NOT_FOUND) { + ASSERT (0); + return Status; + } + } + + Status = MmuInfoParser (FdtParserHandle, CpuNode, &RintcInfo->MmuInfoToken); + if (EFI_ERROR (Status)) { + if (Status != EFI_NOT_FOUND) { + ASSERT (0); + } + } + + return Status; +} + +/** CPU node parser + + CPU node parser. + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] CpusNode cpus node. + @param [out] NewRintcCmObjDesc Pointer to array of RINTC CM objects. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. + @retval EFI_UNSUPPORTED Unsupported. +**/ +STATIC +EFI_STATUS +EFIAPI +CpusNodeParser ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN INT32 CpusNode, + OUT CM_OBJ_DESCRIPTOR **NewRintcCmObjDesc + ) +{ + EFI_STATUS Status; + UINT32 CpuNodeCount; + INT32 CpuNode; + INT32 AddressCells; + + UINT32 Index; + CM_RISCV_RINTC_INFO *RintcInfoBuffer; + UINT32 RintcInfoBufferSize; + VOID *Fdt; + + if (NewRintcCmObjDesc == NULL) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + Fdt = FdtParserHandle->Fdt; + AddressCells = FdtAddressCells (Fdt, CpusNode); + if (AddressCells < 0) { + ASSERT (0); + return EFI_ABORTED; + } + + // Count the number of "cpu" nodes under the "cpus" node. + Status = FdtCountNamedNodeInBranch (Fdt, CpusNode, "cpu", &CpuNodeCount); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + if (CpuNodeCount == 0) { + ASSERT (0); + return EFI_NOT_FOUND; + } + + RintcInfoBufferSize = CpuNodeCount * sizeof (CM_RISCV_RINTC_INFO); + RintcInfoBuffer = AllocateZeroPool (RintcInfoBufferSize); + if (RintcInfoBuffer == NULL) { + ASSERT (0); + return EFI_OUT_OF_RESOURCES; + } + + CpuNode = CpusNode; + for (Index = 0; Index < CpuNodeCount; Index++) { + Status = FdtGetNextNamedNodeInBranch (Fdt, CpusNode, "cpu", &CpuNode); + if (EFI_ERROR (Status)) { + ASSERT (0); + if (Status == EFI_NOT_FOUND) { + // Should have found the node. + Status = EFI_ABORTED; + } + + goto exit_handler; + } + + // Parse the "cpu" node. + if (!FdtNodeIsCompatible (Fdt, CpuNode, &CpuCompatibleInfo)) { + ASSERT (0); + Status = EFI_UNSUPPORTED; + goto exit_handler; + } + + Status = CpuNodeParser ( + FdtParserHandle, + CpuNode, + AddressCells, + &RintcInfoBuffer[Index] + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + goto exit_handler; + } + } // for + + Status = CreateCmObjDesc ( + CREATE_CM_RISCV_OBJECT_ID (ERiscVObjRintcInfo), + CpuNodeCount, + RintcInfoBuffer, + RintcInfoBufferSize, + NewRintcCmObjDesc + ); + ASSERT_EFI_ERROR (Status); + +exit_handler: + FreePool (RintcInfoBuffer); + return Status; +} + +/** Find the RINTC structure for a phandle + + @param [in] NewRintcCmObjDesc Pointer to array of RINTC CM objects. + @param [in] Phandle Phandle to search + +**/ +STATIC +CM_RISCV_RINTC_INFO * +RiscVFindRintc ( + IN CM_OBJ_DESCRIPTOR *NewRintcCmObjDesc, + IN UINTN HartId + ) +{ + CM_RISCV_RINTC_INFO *RintcInfo; + INT32 Idx; + + RintcInfo = (CM_RISCV_RINTC_INFO *)NewRintcCmObjDesc->Data; + + for (Idx = 0; Idx < NewRintcCmObjDesc->Count; Idx++) { + if (RintcInfo[Idx].HartId == HartId) { + return &RintcInfo[Idx]; + } + } + + return NULL; +} + +/** Check if it is a PLIC + + + @param [in] Fdt Pointer to device tree. + @param [in] AplicNode Node with APLIC compatible property. + + @retval TRUE The AplicNode is S-mode APLIC + @retval FALSE The AplicNode is not S-mode APLIC +**/ +STATIC +BOOLEAN +IsPlicNode ( + IN VOID *Fdt, + IN INT32 ExtIntcNode + ) +{ + return FdtNodeIsCompatible (Fdt, ExtIntcNode, &PlicCompatibleInfo); +} + +/** Check if it is S-mode IMSIC + + FDT will have entries for both M-mode and S-mode IMSIC. We + need only S-mode IMSIC. + + @param [in] Fdt Pointer to device tree. + @param [in] Node Node with IMSIC compatible property. + + @retval TRUE The Node is S-mode IMSIC + @retval FALSE The Node is not S-mode IMSIC +**/ +STATIC +BOOLEAN +IsImsicNode ( + IN VOID *Fdt, + IN INT32 Node + ) +{ + INT32 *IrqProp; + INT32 Len; + + if (!FdtNodeIsCompatible (Fdt, Node, &ImsicCompatibleInfo)) { + return FALSE; + } + + IrqProp = (INT32 *)FdtGetProp (Fdt, Node, "interrupts-extended", &Len); + if (!IrqProp || (Len < 4) || + (Fdt32ToCpu (IrqProp[1]) != IRQ_S_EXT)) + { + return FALSE; + } + + return TRUE; +} + +/** Check if it is S-mode APLIC + + FDT will have entries for both M-mode and S-mode APLIC. We + need only S-mode APLIC. + + @param [in] Fdt Pointer to device tree. + @param [in] AplicNode Node with APLIC compatible property. + + @retval TRUE The AplicNode is S-mode APLIC + @retval FALSE The AplicNode is not S-mode APLIC +**/ +STATIC +BOOLEAN +IsAplicNode ( + IN VOID *Fdt, + IN INT32 ExtIntcNode + ) +{ + INT32 *IrqProp; + INT32 *MsiProp; + INT32 ImsicNode; + INT32 Len; + + if (!FdtNodeIsCompatible (Fdt, ExtIntcNode, &AplicCompatibleInfo)) { + return FALSE; + } + + IrqProp = (INT32 *)FdtGetProp (Fdt, ExtIntcNode, "interrupts-extended", &Len); + if ((IrqProp > 0) && (Len >= 4) && + (Fdt32ToCpu (IrqProp[1]) == IRQ_S_EXT)) + { + return TRUE; + } + + MsiProp = (INT32 *)FdtGetProp (Fdt, ExtIntcNode, "msi-parent", &Len); + if (!MsiProp || (Len < sizeof (INT32))) { + return FALSE; + } + + ImsicNode = FdtNodeOffsetByPhandle (Fdt, Fdt32ToCpu (*MsiProp)); + if (ImsicNode < 0) { + return FALSE; + } + + IrqProp = (INT32 *)FdtGetProp (Fdt, ImsicNode, "interrupts-extended", &Len); + if ((!IrqProp) || (Len < 4) || + (Fdt32ToCpu (IrqProp[1]) != IRQ_S_EXT)) + { + return FALSE; + } + + return TRUE; +} + +/** Update Rintc Info CM object + + Find the RINTC CM object of the CPU and update the + External Interrupt controller ID. + + @param [in] Fdt Pointer to device tree. + @param [in] NewRintcCmObjDesc Pointer to array of RINTC CM objects. + @param [in] CpuNode Node with APLIC compatible property. + @param [in] ExtIntcId External Interrupt controller (PLIC/APLIC) ID + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_NOT_FOUND Not found. +**/ +STATIC +EFI_STATUS +RiscVUpdateRintc ( + IN CONST VOID *Fdt, + IN OUT CM_OBJ_DESCRIPTOR *NewRintcCmObjDesc, + IN INT32 CpuNode, + IN UINT32 ExtIntcId + ) +{ + CM_RISCV_RINTC_INFO *RintcInfo; + CONST INT32 *Data; + UINT32 AddressCells; + INT32 DataSize; + UINTN HartId; + INT32 CpusNode; + + CpusNode = FdtParentOffset (Fdt, CpuNode); + AddressCells = FdtAddressCells (Fdt, CpusNode); + if (AddressCells < 0) { + ASSERT (0); + return EFI_ABORTED; + } + + Data = FdtGetProp (Fdt, CpuNode, "reg", &DataSize); + if ((Data == NULL) || + ((DataSize != sizeof (UINT32)) && + (DataSize != sizeof (UINT64)))) + { + ASSERT (0); + return EFI_ABORTED; + } + + if (AddressCells == 2) { + HartId = Fdt64ToCpu (*((UINT64 *)Data)); + } else { + HartId = Fdt32ToCpu (*((UINT32 *)Data)); + } + + RintcInfo = RiscVFindRintc (NewRintcCmObjDesc, HartId); + if (RintcInfo == NULL) { + ASSERT (0); + return EFI_NOT_FOUND; + } + + /* Update RINTC EXT INTC ID */ + RintcInfo->ExtIntcId = ExtIntcId; + + return EFI_SUCCESS; +} + +/** + PLIC parser and update RINTC + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] ExtIntcNode PLIC node. + @param [in] Id PLIC ID. + @param [in] PlicAplicCommonInfo Common information for PLIC and APLIC. + @param [in] NewRintcCmObjDesc Pointer to array of RINTC CM objects. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. + @retval EFI_UNSUPPORTED Unsupported. +**/ +STATIC +EFI_STATUS +EFIAPI +PlicInfoParser ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN INT32 ExtIntcNode, + IN UINT32 *Id, + IN PLIC_APLIC_COMMON_INFO *PlicAplicCommonInfo, + IN CM_OBJ_DESCRIPTOR *NewRintcCmObjDesc + ) +{ + CM_RISCV_PLIC_INFO *PlicInfo; + CONST UINT32 *IntExtProp; + EFI_STATUS Status; + INT32 LocalCpuId; + INT32 ExtIntcId; + INT32 IntcNode; + INT32 CpuNode; + INT32 Phandle; + INT32 Len; + INT32 Idx1; + INT32 Idx2; + VOID *Fdt; + + ASSERT (Id != NULL); + ASSERT (PlicAplicCommonInfo != NULL); + + if (FdtParserHandle == NULL) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + Fdt = FdtParserHandle->Fdt; + IntExtProp = FdtGetProp (Fdt, ExtIntcNode, "interrupts-extended", &Len); + if ((IntExtProp == NULL) || (Len < 4)) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } else { + PlicInfo = AllocateZeroPool (sizeof (CM_RISCV_PLIC_INFO)); + if (PlicInfo == NULL) { + ASSERT (0); + return EFI_OUT_OF_RESOURCES; + } + + Len = Len / 4; + for (Idx1 = 0, Idx2 = 0; Idx1 < Len; Idx1 += 2, Idx2++) { + if (Fdt32ToCpu (IntExtProp[Idx1 + 1]) == IRQ_S_EXT) { + Phandle = Fdt32ToCpu (IntExtProp[Idx1]); + IntcNode = FdtNodeOffsetByPhandle (Fdt, Phandle); + CpuNode = FdtParentOffset (Fdt, IntcNode); + LocalCpuId = Idx2 / 2; + ExtIntcId = ACPI_BUILD_EXT_INTC_ID (*Id, 2 * LocalCpuId + 1); + Status = RiscVUpdateRintc (Fdt, NewRintcCmObjDesc, CpuNode, ExtIntcId); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + } + } + + CopyMem (&PlicAplicCommonInfo->Hid, "RSCV0001", RISCV_HWID_LENGTH); + CopyMem (&PlicInfo->PlicAplicCommonInfo, PlicAplicCommonInfo, sizeof (PLIC_APLIC_COMMON_INFO)); + // Add the CmObj to the Configuration Manager. + Status = AddSingleCmObj ( + FdtParserHandle, + CREATE_CM_RISCV_OBJECT_ID (ERiscVObjPlicInfo), + PlicInfo, + sizeof (CM_RISCV_PLIC_INFO), + NULL + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + } + + return EFI_SUCCESS; +} + +/** + APLIC parser and update RINTC + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] ExtIntcNode APLIC node. + @param [in] Id APLIC ID. + @param [in] PlicAplicCommonInfo Common information for PLIC and APLIC. + @param [in, out] NewRintcCmObjDesc Pointer to array of RINTC CM objects. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. + @retval EFI_UNSUPPORTED Unsupported. +**/ +STATIC +EFI_STATUS +EFIAPI +AplicInfoParser ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN INT32 ExtIntcNode, + IN UINT32 *Id, + IN PLIC_APLIC_COMMON_INFO *PlicAplicCommonInfo, + IN OUT CM_OBJ_DESCRIPTOR *NewRintcCmObjDesc + ) +{ + CM_RISCV_APLIC_INFO *AplicInfo; + CONST UINT32 *IntExtProp; + EFI_STATUS Status; + INT32 ExtIntcId; + INT32 IntcNode; + INT32 CpuNode; + INT32 Phandle; + INT32 Len; + INT32 Idx; + VOID *Fdt; + + ASSERT (Id != NULL); + ASSERT (PlicAplicCommonInfo != NULL); + + if (FdtParserHandle == NULL) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + Fdt = FdtParserHandle->Fdt; + AplicInfo = AllocateZeroPool (sizeof (CM_RISCV_APLIC_INFO)); + if (AplicInfo == NULL) { + ASSERT (0); + return EFI_OUT_OF_RESOURCES; + } + + IntExtProp = FdtGetProp (Fdt, ExtIntcNode, "interrupts-extended", &Len); + if ((IntExtProp != 0) && ((Len / sizeof (UINT32)) % 2 == 0)) { + Len = Len / 4; + AplicInfo->NumIdcs = Len / 2; + for (Idx = 0; Idx < Len; Idx += 2) { + Phandle = Fdt32ToCpu (IntExtProp[Idx]); + IntcNode = FdtNodeOffsetByPhandle (Fdt, Phandle); + CpuNode = FdtParentOffset (Fdt, IntcNode); + ExtIntcId = ACPI_BUILD_EXT_INTC_ID (*Id, Idx / 2); + Status = RiscVUpdateRintc (Fdt, NewRintcCmObjDesc, CpuNode, ExtIntcId); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + } + } + + CopyMem (&PlicAplicCommonInfo->Hid, "RSCV0002", RISCV_HWID_LENGTH); + CopyMem (&AplicInfo->PlicAplicCommonInfo, PlicAplicCommonInfo, sizeof (PLIC_APLIC_COMMON_INFO)); + // Add the CmObj to the Configuration Manager. + Status = AddSingleCmObj ( + FdtParserHandle, + CREATE_CM_RISCV_OBJECT_ID (ERiscVObjAplicInfo), + AplicInfo, + sizeof (CM_RISCV_APLIC_INFO), + NULL + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + return EFI_SUCCESS; +} + +/** + PLIC/APLIC parser and update RINTC + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] NewRintcCmObjDesc Pointer to array of RINTC CM objects. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. + @retval EFI_UNSUPPORTED Unsupported. +**/ +STATIC +EFI_STATUS +EFIAPI +PlicAplicInfoParser ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN CM_OBJ_DESCRIPTOR *NewRintcCmObjDesc + ) +{ + PLIC_APLIC_COMMON_INFO PlicAplicCommonInfo; + CONST UINT32 *Prop; + EFI_STATUS Status; + UINT32 Id; + UINT32 GsiBase; + INT32 Len; + INT32 Prev; + INT32 ExtIntcNode; + VOID *Fdt; + + if (FdtParserHandle == NULL) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + Fdt = FdtParserHandle->Fdt; + GsiBase = 0; + Id = 0; + + for (Prev = 0; ; Prev = ExtIntcNode) { + ExtIntcNode = FdtNextNode (Fdt, Prev, NULL); + if (ExtIntcNode < 0) { + return EFI_SUCCESS; + } + + if (!(IsPlicNode (Fdt, ExtIntcNode) || IsAplicNode (Fdt, ExtIntcNode))) { + continue; + } + + FdtCreateExtIntcList (ExtIntcNode, GsiBase); + + PlicAplicCommonInfo.Version = 1; + PlicAplicCommonInfo.Id = Id; + Prop = FdtGetProp (Fdt, ExtIntcNode, "riscv,num-sources", &Len); + if (!Prop) { + Prop = FdtGetProp (Fdt, ExtIntcNode, "riscv,ndev", &Len); + if (!Prop) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + } + + PlicAplicCommonInfo.NumSources = Fdt32ToCpu (*(const UINT32 *)Prop); + + Prop = FdtGetProp (Fdt, ExtIntcNode, "reg", &Len); + if ((Prop == NULL) || (Len % 4 > 0)) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + PlicAplicCommonInfo.BaseAddress = Fdt64ToCpu (*(const UINT64 *)Prop); + PlicAplicCommonInfo.Size = Fdt64ToCpu (*((const UINT64 *)Prop + 1)); + PlicAplicCommonInfo.GsiBase = GsiBase; + GsiBase += PlicAplicCommonInfo.NumSources; + + if (FdtNodeIsCompatible (Fdt, ExtIntcNode, &PlicCompatibleInfo)) { + Status = PlicInfoParser ( + FdtParserHandle, + ExtIntcNode, + &Id, + &PlicAplicCommonInfo, + NewRintcCmObjDesc + ); + } else if (FdtNodeIsCompatible (Fdt, ExtIntcNode, &AplicCompatibleInfo)) { + Status = AplicInfoParser ( + FdtParserHandle, + ExtIntcNode, + &Id, + &PlicAplicCommonInfo, + NewRintcCmObjDesc + ); + } + + Id++; + } + + return EFI_SUCCESS; +} + +/** + RINTC parser using IMSIC node + + Parse RINTC information using IMSIC. + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in, out] NewRintcCmObjDesc Pointer to array of RINTC CM objects. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. + @retval EFI_UNSUPPORTED Unsupported. +**/ +STATIC +EFI_STATUS +EFIAPI +UpdateRintcInfo ( + IN CONST VOID *Fdt, + IN CONST INT32 ImsicNode, + IN OUT CM_OBJ_DESCRIPTOR *NewRintcCmObjDesc + ) +{ + CM_RISCV_RINTC_INFO *RintcInfoBuffer; + CONST UINT32 *IntExtProp; + CONST UINT64 *ImsicRegProp; + CONST INT32 *Data; + UINT64 ImsicBaseAddr; + UINT64 ImsicBaseLen; + UINT64 ImsicCpuBaseAddr; + UINT64 ImsicCpuBaseLen; + INT32 NumPhandle; + INT32 Len; + INT32 AddressCells; + INT32 CpusNode; + INT32 CpuNode; + INT32 DataSize; + INT32 IntcNode; + INT32 Phandle; + UINTN HartId; + UINTN NumImsicBase; + INTN Limit; + INTN Idx; + INTN Idx1; + INTN Idx2; + + IntExtProp = (UINT32 *)FdtGetProp (Fdt, ImsicNode, "interrupts-extended", &Len); + if ((IntExtProp == 0) || ((Len / sizeof (UINT32)) % 2 != 0)) { + /* interrupts-extended: , */ + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + NumPhandle = (Len / sizeof (UINT32)) / 2; + if (NumPhandle == 0) { + ASSERT (0); + return EFI_NOT_FOUND; + } + + ImsicRegProp = FdtGetProp (Fdt, ImsicNode, "reg", &Len); + if ((ImsicRegProp == 0) || (((Len / sizeof (UINT32)) % 4) != 0)) { + // address-cells and size-cells are always 2 + DEBUG ((DEBUG_ERROR, "Failed to parse imsic node: reg\n")); + return EFI_INVALID_PARAMETER; + } + + NumImsicBase = (Len / sizeof (UINT32)) / 4; + Idx2 = 0; + for (Idx = 0; Idx < NumImsicBase; Idx++) { + ImsicBaseAddr = Fdt64ToCpu (ImsicRegProp[Idx * 2]); + ImsicBaseLen = Fdt64ToCpu (ImsicRegProp[Idx * 2 + 1]); + // Calculate the limit of number of cpu nodes this imsic can handle + Limit = ImsicBaseLen / IMSIC_MMIO_PAGE_SZ; + for (Idx1 = 0; Idx1 < Limit && Idx2 < NumPhandle; Idx1++, Idx2++) { + Phandle = Fdt32ToCpu (IntExtProp[Idx2 * 2]); + IntcNode = FdtNodeOffsetByPhandle (Fdt, Phandle); + CpuNode = FdtParentOffset (Fdt, IntcNode); + CpusNode = FdtParentOffset (Fdt, CpuNode); + AddressCells = FdtAddressCells (Fdt, CpusNode); + if (AddressCells < 0) { + ASSERT (0); + return EFI_ABORTED; + } + + Data = FdtGetProp (Fdt, CpuNode, "reg", &DataSize); + if (Data == NULL) { + ASSERT (0); + } + + if ((Data == NULL) || + ((DataSize != sizeof (UINT32)) && + (DataSize != sizeof (UINT64)))) + { + ASSERT (0); + return EFI_ABORTED; + } + + if (AddressCells == 2) { + HartId = Fdt64ToCpu (*((UINT64 *)Data)); + } else { + HartId = Fdt32ToCpu (*((UINT32 *)Data)); + } + + RintcInfoBuffer = RiscVFindRintc (NewRintcCmObjDesc, HartId); + if (RintcInfoBuffer == NULL) { + return EFI_NOT_FOUND; + } + + ImsicCpuBaseAddr = ImsicBaseAddr + Idx1 * IMSIC_MMIO_PAGE_SZ; + ImsicCpuBaseLen = IMSIC_MMIO_PAGE_SZ; + RintcInfoBuffer->ImsicBaseAddress = ImsicCpuBaseAddr; + RintcInfoBuffer->ImsicSize = ImsicCpuBaseLen; + } + } + + return EFI_SUCCESS; +} + +/** + Get IMSIC information + + @param [in] Fdt FDT Base pointer. + @param [in] ImsicNode IMSIC node in FDT. + @param [in, out] ImsicInfo Pointer to IMSIC info structure. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. + @retval EFI_UNSUPPORTED Unsupported. +**/ +STATIC +EFI_STATUS +EFIAPI +ImsicGetInfo ( + IN CONST VOID *Fdt, + IN CONST INT32 ImsicNode, + IN OUT CM_RISCV_IMSIC_INFO *ImsicInfo + ) +{ + CONST UINT32 *IntExtProp; + CONST UINT64 *Prop; + INT32 Len; + INT32 NumPhandle; + UINTN NumImsicBase; + + if (ImsicInfo == NULL) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + IntExtProp = FdtGetProp (Fdt, ImsicNode, "interrupts-extended", &Len); + if ((IntExtProp == 0) || ((Len / sizeof (UINT32)) % 2 != 0)) { + /* interrupts-extended: , */ + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + /* There can be M-mode IMSIC in DT. Consider only S-mode */ + if (Fdt32ToCpu (IntExtProp[1]) != IRQ_S_EXT) { + ASSERT (0); + return EFI_NOT_FOUND; + } + + NumPhandle = (Len / sizeof (UINT32)) / 2; + if (NumPhandle == 0) { + ASSERT (0); + return EFI_NOT_FOUND; + } + + Prop = FdtGetProp (Fdt, ImsicNode, "riscv,num-ids", &Len); + if (Prop == 0) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + ImsicInfo->NumIds = Fdt32ToCpu (*(const UINT32 *)Prop); + Prop = FdtGetProp (Fdt, ImsicNode, "riscv,num-guest-ids", &Len); + if (Prop == 0) { + ImsicInfo->NumGuestIds = ImsicInfo->NumIds; + } else { + ImsicInfo->NumGuestIds = Fdt32ToCpu (*(const UINT32 *)Prop); + } + + Prop = FdtGetProp (Fdt, ImsicNode, "riscv,guest-index-bits", &Len); + if (Prop == 0) { + ImsicInfo->GuestIndexBits = 0; + } else { + ImsicInfo->GuestIndexBits = Fdt32ToCpu (*(const UINT32 *)Prop); + } + + Prop = FdtGetProp (Fdt, ImsicNode, "riscv,hart-index-bits", &Len); + if (Prop == 0) { + ImsicInfo->HartIndexBits = 0; // update default value later + } else { + ImsicInfo->HartIndexBits = Fdt32ToCpu (*(const UINT32 *)Prop); + } + + Prop = FdtGetProp (Fdt, ImsicNode, "riscv,group-index-bits", &Len); + if (Prop == 0) { + ImsicInfo->GroupIndexBits = 0; + } else { + ImsicInfo->GroupIndexBits = Fdt32ToCpu (*(const UINT32 *)Prop); + } + + Prop = FdtGetProp (Fdt, ImsicNode, "riscv,group-index-shift", &Len); + if (Prop == 0) { + ImsicInfo->GroupIndexShift = IMSIC_MMIO_PAGE_SHIFT * 2; + } else { + ImsicInfo->GroupIndexShift = Fdt32ToCpu (*(const UINT32 *)Prop); + } + + ImsicInfo->Version = 1; + ImsicInfo->Flags = 0; + Prop = FdtGetProp (Fdt, ImsicNode, "reg", &Len); + if ((Prop == 0) || (((Len / sizeof (UINT32)) % 4) != 0)) { + // address-cells and size-cells are always 2 + DEBUG ((DEBUG_ERROR, "Failed to parse imsic node: reg\n")); + return EFI_INVALID_PARAMETER; + } + + NumImsicBase = (Len / sizeof (UINT32)) / 4; + if (ImsicInfo->HartIndexBits == 0) { + Len = NumPhandle; + while (Len > 0) { + ImsicInfo->HartIndexBits++; + Len = Len >> 1; + } + } + + return EFI_SUCCESS; +} + +/** + IMSIC parser using IMSIC node + + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in, out] NewRintcCmObjDesc Pointer to array of RINTC CM objects. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. + @retval EFI_UNSUPPORTED Unsupported. +**/ +STATIC +EFI_STATUS +EFIAPI +ImsicInfoParser ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN OUT CM_OBJ_DESCRIPTOR *NewRintcCmObjDesc + ) +{ + CM_RISCV_IMSIC_INFO ImsicInfo; + EFI_STATUS Status; + INT32 Prev; + INT32 ImsicNode; + VOID *Fdt; + + if (NewRintcCmObjDesc == NULL) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + Fdt = FdtParserHandle->Fdt; + ZeroMem (&ImsicInfo, sizeof (CM_RISCV_IMSIC_INFO)); + + for (Prev = 0; ; Prev = ImsicNode) { + ImsicNode = FdtNextNode (Fdt, Prev, NULL); + if (ImsicNode < 0) { + return EFI_NOT_FOUND; + } + + if (IsImsicNode (Fdt, ImsicNode) == FALSE) { + continue; + } + + Status = ImsicGetInfo (Fdt, ImsicNode, &ImsicInfo); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + Status = UpdateRintcInfo (Fdt, ImsicNode, NewRintcCmObjDesc); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + // Add the CmObj to the Configuration Manager. + Status = AddSingleCmObj ( + FdtParserHandle, + CREATE_CM_RISCV_OBJECT_ID (ERiscVObjImsicInfo), + &ImsicInfo, + sizeof (CM_RISCV_IMSIC_INFO), + NULL + ); + if (EFI_ERROR (Status)) { + ASSERT (0); + } + + return Status; + } +} + +/** CM_RISCV_RINTC_INFO and CM_RISCV_IMSIC_INFO parser function. + + A parser parses a Device Tree to populate a specific CmObj type. None, + one or many CmObj can be created by the parser. + The created CmObj are then handed to the parser's caller through the + HW_INFO_ADD_OBJECT interface. + This can also be a dispatcher. I.e. a function that not parsing a + Device Tree but calling other parsers. + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] FdtBranch When searching for DT node name, restrict + the search to this Device Tree branch. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. + @retval EFI_UNSUPPORTED Unsupported. +**/ +STATIC +EFI_STATUS +EFIAPI +RiscVIntcInfoParser ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN INT32 FdtBranch + ) +{ + CM_OBJ_DESCRIPTOR *NewCmObjDesc; + EFI_STATUS Status; + VOID *Fdt; + + if (FdtParserHandle == NULL) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + Fdt = FdtParserHandle->Fdt; + NewCmObjDesc = NULL; + + // Parse the "cpus" nodes and its children "cpu" nodes, + // and create a CM_OBJ_DESCRIPTOR. + Status = CpusNodeParser (FdtParserHandle, FdtBranch, &NewCmObjDesc); + if (EFI_ERROR (Status)) { + ASSERT (0); + return Status; + } + + /* Search for IMSIC presence and update RINTC structures if so */ + Status = ImsicInfoParser (FdtParserHandle, NewCmObjDesc); + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { + ASSERT_EFI_ERROR (Status); + goto exit_handler; + } + + /* Search for APLIC/PLIC presence and update RINTC structures if so */ + Status = PlicAplicInfoParser (FdtParserHandle, NewCmObjDesc); + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { + ASSERT_EFI_ERROR (Status); + goto exit_handler; + } + + // Finally, add all the RINTC CmObjs to the Configuration Manager. + Status = AddMultipleCmObj (FdtParserHandle, NewCmObjDesc, 0, NULL); + if (EFI_ERROR (Status)) { + ASSERT (0); + goto exit_handler; + } + +exit_handler: + FreeCmObjDesc (NewCmObjDesc); + return Status; +} + +/** MADT dispatcher. + + A parser parses a Device Tree to populate a specific CmObj type. None, + one or many CmObj can be created by the parser. + The created CmObj are then handed to the parser's caller through the + HW_INFO_ADD_OBJECT interface. + This can also be a dispatcher. I.e. a function that not parsing a + Device Tree but calling other parsers. + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] FdtBranch When searching for DT node name, restrict + the search to this Device Tree branch. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. + @retval EFI_UNSUPPORTED Unsupported. +**/ +EFI_STATUS +EFIAPI +RiscVIntcDispatcher ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN INT32 FdtBranch + ) +{ + EFI_STATUS Status; + INT32 CpusNode; + VOID *Fdt; + + if (FdtParserHandle == NULL) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + Fdt = FdtParserHandle->Fdt; + + // The "cpus" node resides at the root of the DT. Fetch it. + CpusNode = FdtPathOffset (Fdt, "/cpus"); + if (CpusNode < 0) { + return EFI_NOT_FOUND; + } + + Status = RiscVIntcInfoParser (FdtParserHandle, CpusNode); + if (EFI_ERROR (Status)) { + // EFI_NOT_FOUND is not tolerated at this point. + ASSERT (0); + return Status; + } + + return EFI_SUCCESS; +} diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/Intc/RiscVIntcParser.h b/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/Intc/RiscVIntcParser.h new file mode 100644 index 000000000000..e01816f7a7cf --- /dev/null +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/Intc/RiscVIntcParser.h @@ -0,0 +1,47 @@ +/** @file + RISC-V RINTC and IMSIC parser. + + Copyright (c) 2024, Ventana Micro Systems Inc. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): +**/ + +#ifndef RISCV_RINTC_PARSER_H_ +#define RISCV_RINTC_PARSER_H_ + +#include + +#define IMSIC_MMIO_PAGE_SHIFT 12 +#define IMSIC_MMIO_PAGE_SZ (1 << IMSIC_MMIO_PAGE_SHIFT) +#define IRQ_S_EXT 9 + +/** RISC-V MADT dispatcher. + + + A parser parses a Device Tree to populate a specific CmObj type. None, + one or many CmObj can be created by the parser. + The created CmObj are then handed to the parser's caller through the + HW_INFO_ADD_OBJECT interface. + This can also be a dispatcher. I.e. a function that not parsing a + Device Tree but calling other parsers. + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] FdtBranch When searching for DT node name, restrict + the search to this Device Tree branch. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. + @retval EFI_UNSUPPORTED Unsupported. +**/ +EFI_STATUS +EFIAPI +RiscVIntcDispatcher ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN INT32 FdtBranch + ); + +#endif // RISCV_RINTC_PARSER_H_ diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/RiscVFdtHwInfoParser.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/RiscVFdtHwInfoParser.c new file mode 100644 index 000000000000..0475031f45c8 --- /dev/null +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/RiscVFdtHwInfoParser.c @@ -0,0 +1,84 @@ +/** @file + Flattened Device Tree parser library for RISC-V. + + Copyright (c) 2024, Ventana Micro Systems Inc. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include "FdtHwInfoParser.h" +#include "Pci/PciConfigSpaceParser.h" +#include "Serial/SerialPortParser.h" +#include "Intc/RiscVIntcParser.h" +#include "HartInfo/RiscVTimerDispatcher.h" + +/** Ordered table of parsers/dispatchers. + + A parser parses a Device Tree to populate a specific CmObj type. None, + one or many CmObj can be created by the parser. + The created CmObj are then handed to the parser's caller through the + HW_INFO_ADD_OBJECT interface. + This can also be a dispatcher. I.e. a function that not parsing a + Device Tree but calling other parsers. + RiscVIntcDispatcher must be the first entry to populate the GSI map. +*/ +STATIC CONST FDT_HW_INFO_PARSER_FUNC HwInfoParserTable[] = { + RiscVIntcDispatcher, + RiscVTimerDispatcher, + PciConfigInfoParser, + SerialPortDispatcher +}; + +/** Main dispatcher: sequentially call the parsers/dispatchers + of the HwInfoParserTable. + + A parser parses a Device Tree to populate a specific CmObj type. None, + one or many CmObj can be created by the parser. + The created CmObj are then handed to the parser's caller through the + HW_INFO_ADD_OBJECT interface. + This can also be a dispatcher. I.e. a function that not parsing a + Device Tree but calling other parsers. + + @param [in] FdtParserHandle A handle to the parser instance. + @param [in] FdtBranch When searching for DT node name, restrict + the search to this Device Tree branch. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_NOT_FOUND Not found. + @retval EFI_UNSUPPORTED Unsupported. +**/ +EFI_STATUS +EFIAPI +ArchFdtHwInfoMainDispatcher ( + IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, + IN INT32 FdtBranch + ) +{ + EFI_STATUS Status; + UINT32 Index; + + if (FdtCheckHeader (FdtParserHandle->Fdt) < 0) { + ASSERT (0); + return EFI_INVALID_PARAMETER; + } + + for (Index = 0; Index < ARRAY_SIZE (HwInfoParserTable); Index++) { + Status = HwInfoParserTable[Index]( + FdtParserHandle, + FdtBranch + ); + if (EFI_ERROR (Status) && + (Status != EFI_NOT_FOUND)) + { + // If EFI_NOT_FOUND, the parser didn't find information in the DT. + // Don't trigger an error. + ASSERT (0); + return Status; + } + } // for + + return EFI_SUCCESS; +} diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/RiscVFdtInterrupt.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/RiscVFdtInterrupt.c new file mode 100644 index 000000000000..bef289c96fb1 --- /dev/null +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/RiscVFdtInterrupt.c @@ -0,0 +1,92 @@ +/** @file + RISC-V Flattened device tree utility for Interrupts. + + Copyright (c) 2024, Ventana Micro Systems Inc. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - Device tree Specification - Release v0.3 +**/ + +#include +#include +#include "FdtUtility.h" + +/** Get the interrupt Id of an interrupt described in a fdt. + + @param [in] Data Pointer to the first cell of an "interrupts" property. + + @retval The interrupt id. +**/ +UINT32 +EFIAPI +FdtGetInterruptId ( + UINT32 CONST *Data + ) +{ + ASSERT (Data != NULL); + + return Fdt32ToCpu (Data[RISCV_IRQ_NUMBER_OFFSET]); +} + +/** Get the ACPI interrupt flags of an interrupt described in a fdt. + + @param [in] Data Pointer to the first cell of an "interrupts" property. + + @retval The interrupt flags (for ACPI). +**/ +UINT32 +EFIAPI +FdtGetInterruptFlags ( + UINT32 CONST *Data + ) +{ + UINT32 IrqFlags; + UINT32 AcpiIrqFlags; + + ASSERT (Data != NULL); + + IrqFlags = Fdt32ToCpu (Data[RISCV_IRQ_FLAGS_OFFSET]); + + AcpiIrqFlags = DT_IRQ_IS_EDGE_TRIGGERED (IrqFlags) ? BIT0 : 0; + AcpiIrqFlags |= DT_IRQ_IS_ACTIVE_LOW (IrqFlags) ? BIT1 : 0; + + return AcpiIrqFlags; +} + +/** Get the Address cell info of the INTC node + + @param [in] Fdt Pointer to a Flattened Device Tree. + @param [in] Node Offset of the node having to get the + "#address-cells" and "#size-cells" + properties from. + @param [out] AddressCells If success, number of address-cells. + If the property is not available, + default value is 2. + @param [out] SizeCells If success, number of size-cells. + If the property is not available, + default value is 1. + @retval EFI_SUCCESS The function always returns SUCCESS + +**/ +EFI_STATUS +EFIAPI +FdtGetIntcAddressCells ( + IN CONST VOID *Fdt, + IN INT32 Node, + OUT INT32 *AddressCells, OPTIONAL + OUT INT32 *SizeCells OPTIONAL + ) +{ + /* Address Cells is zero for RISC-V */ + if (AddressCells != NULL) { + *AddressCells = 0; + } + + if (SizeCells != NULL) { + *SizeCells = 0; + } + + return EFI_SUCCESS; +} From 0411b05771e58719b94e09e51c1d0ae8a263b3b4 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Sun, 4 Aug 2024 12:33:44 +0530 Subject: [PATCH 0881/1172] DynamicTablesPkg/FdtHwInfoParserLib: Detect IRQ type based on IntcCells MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For some architectures and interrupt controllers, such as RISC-V’s PLIC, the PCI interrupt map does not include an explicit IRQ type. Update the parser to set the IRQ type to 0 when the interrupt controller’s 'interrupt-cells' property has a count of 1 or less, indicating no IRQ type information is provided. This change improves compatibility with RISC-V and similar platforms. Signed-off-by: Sunil V L --- .../Library/FdtHwInfoParserLib/Pci/PciConfigSpaceParser.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Pci/PciConfigSpaceParser.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Pci/PciConfigSpaceParser.c index f7b8dc98f621..928959ea36ac 100644 --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Pci/PciConfigSpaceParser.c +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Pci/PciConfigSpaceParser.c @@ -443,8 +443,12 @@ ParseIrqMap ( // Interrupt controller interrupt and flags PciInterruptMapInfo[Index].IntcInterrupt.Interrupt = FdtGetInterruptId ((UINT32 *)&Data[Offset]); - PciInterruptMapInfo[Index].IntcInterrupt.Flags = - FdtGetInterruptFlags ((UINT32 *)&Data[Offset]); + if (IntcCells > 1) { + PciInterruptMapInfo[Index].IntcInterrupt.Flags = + FdtGetInterruptFlags ((UINT32 *)&Data[Offset]); + } else { + PciInterruptMapInfo[Index].IntcInterrupt.Flags = 0x0; + } } // for PciInfo->Mapping[PciMappingTableInterrupt].ObjectId = From 524e4c8a0586ef7ea874300c63a8fd8335bdafe3 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Mon, 5 Aug 2024 02:54:27 +0530 Subject: [PATCH 0882/1172] DynamicTablesPkg/FdtHwInfoParserLib/Pci: Convert IRQ to GSI for RISC-V MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On RISC-V platforms, the Global System Interrupt (GSI) space is divided across multiple PLIC/APLIC interrupt controllers. The IRQ number in the device tree (DT) needs to be translated to the corresponding GSI by: 1. Mapping the IRQ number to its parent interrupt controller using the phandle from the 'interrupt-map' property. 2. Converting the IRQ to a GSI number using the interrupt controller’s GSI base. This change ensures accurate IRQ-to-GSI translation for PCI devices, enabling correct interrupt routing on RISC-V systems. Signed-off-by: Sunil V L --- .../FdtHwInfoParserLib/Pci/PciConfigSpaceParser.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Pci/PciConfigSpaceParser.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Pci/PciConfigSpaceParser.c index 928959ea36ac..e67b38d287b2 100644 --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Pci/PciConfigSpaceParser.c +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Pci/PciConfigSpaceParser.c @@ -443,6 +443,16 @@ ParseIrqMap ( // Interrupt controller interrupt and flags PciInterruptMapInfo[Index].IntcInterrupt.Interrupt = FdtGetInterruptId ((UINT32 *)&Data[Offset]); + + /* + * In RISC-V, GSI space can be divided among multiple APLIC/PLICs. + * So, convert the interrupt number in DT to appropriate GSI number + * using the parent interrupt controller information. + */ + #if defined (MDE_CPU_RISCV64) + PciInterruptMapInfo[Index].IntcInterrupt.Interrupt = + FdtConvertToGsi (IntcNode, PciInterruptMapInfo[Index].IntcInterrupt.Interrupt); + #endif if (IntcCells > 1) { PciInterruptMapInfo[Index].IntcInterrupt.Flags = FdtGetInterruptFlags ((UINT32 *)&Data[Offset]); From d6748c514b1f04ecf4e4ed71bb41a159462cde77 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Fri, 12 Sep 2025 17:57:08 +0530 Subject: [PATCH 0883/1172] DynamicTablesPkg/FdtHwInfoParserLib/Serial: RISC-V: Convert to GSI In RISC-V, the GSI space is spread across multiple PLICs/APLICs. Hence, any device's IRQ number in the FDT should be appropriately converted to a GSI number based on its parent interrupt controller. Do this for UART parsing in RISC-V. Signed-off-by: Sunil V L --- .../Library/FdtHwInfoParserLib/Serial/SerialPortParser.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Serial/SerialPortParser.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Serial/SerialPortParser.c index 8a25d5b3f91d..6a26effd1391 100644 --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Serial/SerialPortParser.c +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Serial/SerialPortParser.c @@ -182,6 +182,15 @@ SerialPortNodeParser ( SerialPortInfo->Interrupt = FdtGetInterruptId ((CONST UINT32 *)Data); + /* + * In RISC-V, GSI space can be divided among multiple APLIC/PLICs. + * So, convert the interrupt number in DT to appropriate GSI number + * using the parent interrupt controller information. + */ + #if defined (MDE_CPU_RISCV64) + SerialPortInfo->Interrupt = FdtConvertToGsi (IntcNode, SerialPortInfo->Interrupt); + #endif + // Note: clock-frequency is optional for SBSA UART. Data = FdtGetProp (Fdt, SerialPortNode, "clock-frequency", &DataSize); if (Data != NULL) { From 8b3b2a64886f6ce6a987421668d1beb8ddff1e49 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Tue, 6 Aug 2024 16:00:51 +0530 Subject: [PATCH 0884/1172] DynamicTablesPkg: Add RISC-V terms to spell check ignore list Update the spell check ignore list to include RISC-V specific words and terminology. This prevents false-positive spelling errors for RISC-V related terms during automated checks. Signed-off-by: Sunil V L --- DynamicTablesPkg/DynamicTablesPkg.ci.yaml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/DynamicTablesPkg/DynamicTablesPkg.ci.yaml b/DynamicTablesPkg/DynamicTablesPkg.ci.yaml index f011cc2c25a6..e99da8a61804 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.ci.yaml +++ b/DynamicTablesPkg/DynamicTablesPkg.ci.yaml @@ -141,7 +141,15 @@ "TNSID", "Vatos", "WBINVD", - "xapic" + "xapic", + "aplic", + "aplics", + "eriscv", + "gmode", + "imsic", + "imsics", + "plics", + "rintc" ], # words to extend to the dictionary for this package "IgnoreStandardPaths": [], # Standard Plugin defined paths that # should be ignore From eb4c151bc6a6c7b07b5691742fc7ee6ce5001046 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Wed, 3 Dec 2025 09:38:40 +0100 Subject: [PATCH 0885/1172] CryptoPkg: Suppress VS2022 warning #4319 when building OpenSSL CI builds have started to fail with ERROR - Compiler #2220 from D:\a\1\s\CryptoPkg\Library\OpensslLib\openssl\crypto\bn\bn_gcd.c(659): the following warning is treated as an error WARNING - Compiler #4319 from D:\a\1\s\CryptoPkg\Library\OpensslLib\openssl\crypto\bn\bn_gcd.c(659): '~': zero extending 'unsigned int' to 'unsigned __int64' of greater size WARNING - Compiler #4319 from D:\a\1\s\CryptoPkg\Library\OpensslLib\openssl\crypto\bn\bn_gcd.c(671): '~': zero extending 'unsigned int' to 'unsigned __int64' of greater size which was not flagged before. Suppress the warning in CryptoPkg so the builds will succeed again. If this is a real issue, it should be reported to and fixed in the upstream project. Signed-off-by: Ard Biesheuvel --- CryptoPkg/Library/OpensslLib/OpensslLib.inf | 5 +++-- CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf | 5 +++-- CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf | 5 +++-- CryptoPkg/Library/OpensslLib/OpensslLibFull.inf | 5 +++-- CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf | 5 +++-- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/CryptoPkg/Library/OpensslLib/OpensslLib.inf b/CryptoPkg/Library/OpensslLib/OpensslLib.inf index e8201affb22f..e633d44bcbd4 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLib.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLib.inf @@ -750,9 +750,10 @@ # C4706: assignment within conditional expression # C4819: The file contains a character that cannot be represented in the current code page # C4133: incompatible types - from 'ASN1_TYPE *' to 'const ASN1_STRING *' (v3_genn.c(101)) + # C4319: zero extending type to type of greater size # - MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 - MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 + MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 /wd4319 + MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 /wd4319 # # Disable following Visual Studio 2015 compiler warnings brought by openssl source, diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf index 7243587067c8..e5543276e437 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf @@ -2204,9 +2204,10 @@ # C4706: assignment within conditional expression # C4819: The file contains a character that cannot be represented in the current code page # C4133: incompatible types - from 'ASN1_TYPE *' to 'const ASN1_STRING *' (v3_genn.c(101)) + # C4319: zero extending type to type of greater size # - MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 - MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 + MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 /wd4319 + MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 /wd4319 # # Disable following Visual Studio 2015 compiler warnings brought by openssl source, diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf index 3d9668c17c79..4269228562f1 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf @@ -700,9 +700,10 @@ # C4706: assignment within conditional expression # C4819: The file contains a character that cannot be represented in the current code page # C4133: incompatible types - from 'ASN1_TYPE *' to 'const ASN1_STRING *' (v3_genn.c(101)) + # C4319: zero extending type to type of greater size # - MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 - MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 + MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 /wd4319 + MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 /wd4319 # # Disable following Visual Studio 2015 compiler warnings brought by openssl source, diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf index b97bb9d3528d..9408d0924779 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf @@ -807,9 +807,10 @@ # C4706: assignment within conditional expression # C4819: The file contains a character that cannot be represented in the current code page # C4133: incompatible types - from 'ASN1_TYPE *' to 'const ASN1_STRING *' (v3_genn.c(101)) + # C4319: zero extending type to type of greater size # - MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 - MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 + MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 /wd4319 + MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 /wd4319 # # Disable following Visual Studio 2015 compiler warnings brought by openssl source, diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf index 4254882c4508..0a0673094bec 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf @@ -2365,9 +2365,10 @@ # C4706: assignment within conditional expression # C4819: The file contains a character that cannot be represented in the current code page # C4133: incompatible types - from 'ASN1_TYPE *' to 'const ASN1_STRING *' (v3_genn.c(101)) + # C4319: zero extending type to type of greater size # - MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 - MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 + MSFT:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4310 /wd4389 /wd4700 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 /wd4319 + MSFT:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) /wd4090 /wd4132 /wd4210 /wd4244 /wd4245 /wd4267 /wd4306 /wd4310 /wd4700 /wd4389 /wd4702 /wd4706 /wd4819 /wd4130 /wd4133 /wd4189 /wd4319 # # Disable following Visual Studio 2015 compiler warnings brought by openssl source, From bd4bb10d8070635db8921707678a9a902cf82667 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Wed, 3 Dec 2025 10:29:40 +0100 Subject: [PATCH 0886/1172] MdeModulePkg: Remove ambiguous negation of narrower type Replace UINTN casts with EFI_PHYSICAL_ADDRESS in places where the result is negated, as otherwise, the top bits may remain 0 unexpectedly. VS2022 started warning about this, and thus breaking the IA32 CI build. Signed-off-by: Ard Biesheuvel --- MdeModulePkg/Core/Dxe/Image/Image.c | 2 +- MdeModulePkg/Core/Pei/Image/Image.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Image/Image.c b/MdeModulePkg/Core/Dxe/Image/Image.c index 5a38e5a596f2..e39bb6a5afd9 100644 --- a/MdeModulePkg/Core/Dxe/Image/Image.c +++ b/MdeModulePkg/Core/Dxe/Image/Image.c @@ -742,7 +742,7 @@ CoreLoadPeImage ( if (!Image->ImageContext.IsTeImage) { Image->ImageContext.ImageAddress = (Image->ImageContext.ImageAddress + Image->ImageContext.SectionAlignment - 1) & - ~((UINTN)Image->ImageContext.SectionAlignment - 1); + ~((EFI_PHYSICAL_ADDRESS)Image->ImageContext.SectionAlignment - 1); } // diff --git a/MdeModulePkg/Core/Pei/Image/Image.c b/MdeModulePkg/Core/Pei/Image/Image.c index f74406f4e71d..5c6640d45cce 100644 --- a/MdeModulePkg/Core/Pei/Image/Image.c +++ b/MdeModulePkg/Core/Pei/Image/Image.c @@ -402,7 +402,7 @@ LoadAndRelocatePeCoffImage ( if (ImageContext.SectionAlignment > EFI_PAGE_SIZE) { ImageContext.ImageAddress = (ImageContext.ImageAddress + ImageContext.SectionAlignment - 1) & - ~((UINTN)ImageContext.SectionAlignment - 1); + ~((EFI_PHYSICAL_ADDRESS)ImageContext.SectionAlignment - 1); } // From 4b213ff6d121fb1bdd1ab242abf99586168f79e4 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Wed, 3 Dec 2025 10:44:33 +0100 Subject: [PATCH 0887/1172] Readme: Remove OVMF IA32X64 builds from dashboard Signed-off-by: Ard Biesheuvel --- ReadMe.rst | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/ReadMe.rst b/ReadMe.rst index a694bc9a796d..f2313ea0d041 100644 --- a/ReadMe.rst +++ b/ReadMe.rst @@ -39,8 +39,6 @@ EmulatorPkg_Win_VS_ | IA32 |em32d| |em32r| |em3 | | X64 FULL |em64fd| |em64fr| |em64fn| OvmfPkg_Win_VS_ | IA32 |op32d| |op32r| |op32n| | | X64 |op64d| |op64r| |op64n| -| | IA32 X64 |op3264d| |op3264r| |op3264n| -| | IA32 X64 FULL |op3264fd| |op3264fr| **N/A** ============================= ================= ============= ============= ============== Ubuntu 24.04 @@ -56,8 +54,6 @@ EmulatorPkg_Ubuntu_GCC_ | IA32 **N/A** **N/A** **N/ | | X64 FULL |em64fdu| |em64fru| |em64fnu| OvmfPkg_Ubuntu_GCC_ | IA32 |op32du| |op32ru| |op32nu| | | X64 |op64du| |op64ru| |op64nu| -| | IA32 X64 |op3264du| |op3264ru| |op3264nu| -| | IA32 X64 FULL |op3264fdu| |op3264fru| **N/A** ============================= ================= ============= ============= ============== |TCBZ_2639|_ - EmulatorPkg Ubuntu GCC5 Segfaults during execution. @@ -349,17 +345,3 @@ use. .. |op64ru| image:: https://dev.azure.com/tianocore/edk2-ci/_apis/build/status%2FCI%2FOvmfPkg%20-%20Ubuntu%20GCC%20-%20CI?branchName=master&jobName=Platform_CI&configuration=Platform_CI%20OVMF_X64_RELEASE .. |op64n| image:: https://dev.azure.com/tianocore/edk2-ci/_apis/build/status%2FCI%2FOvmfPkg%20-%20Windows%20VS%20-%20CI?branchName=master&jobName=Platform_CI&configuration=Platform_CI%20OVMF_X64_NOOPT .. |op64nu| image:: https://dev.azure.com/tianocore/edk2-ci/_apis/build/status%2FCI%2FOvmfPkg%20-%20Ubuntu%20GCC%20-%20CI?branchName=master&jobName=Platform_CI&configuration=Platform_CI%20OVMF_X64_NOOPT - -.. |op3264d| image:: https://dev.azure.com/tianocore/edk2-ci/_apis/build/status%2FCI%2FOvmfPkg%20-%20Windows%20VS%20-%20CI?branchName=master&jobName=Platform_CI&configuration=Platform_CI%20OVMF_IA32X64_DEBUG -.. |op3264du| image:: https://dev.azure.com/tianocore/edk2-ci/_apis/build/status%2FCI%2FOvmfPkg%20-%20Ubuntu%20GCC%20-%20CI?branchName=master&jobName=Platform_CI&configuration=Platform_CI%20OVMF_IA32X64_DEBUG -.. |op3264r| image:: https://dev.azure.com/tianocore/edk2-ci/_apis/build/status%2FCI%2FOvmfPkg%20-%20Windows%20VS%20-%20CI?branchName=master&jobName=Platform_CI&configuration=Platform_CI%20OVMF_IA32X64_RELEASE -.. |op3264ru| image:: https://dev.azure.com/tianocore/edk2-ci/_apis/build/status%2FCI%2FOvmfPkg%20-%20Ubuntu%20GCC%20-%20CI?branchName=master&jobName=Platform_CI&configuration=Platform_CI%20OVMF_IA32X64_RELEASE -.. |op3264n| image:: https://dev.azure.com/tianocore/edk2-ci/_apis/build/status%2FCI%2FOvmfPkg%20-%20Windows%20VS%20-%20CI?branchName=master&jobName=Platform_CI&configuration=Platform_CI%20OVMF_IA32X64_NOOPT -.. |op3264nu| image:: https://dev.azure.com/tianocore/edk2-ci/_apis/build/status%2FCI%2FOvmfPkg%20-%20Ubuntu%20GCC%20-%20CI?branchName=master&jobName=Platform_CI&configuration=Platform_CI%20OVMF_IA32X64_NOOPT - -.. |op3264fd| image:: https://dev.azure.com/tianocore/edk2-ci/_apis/build/status%2FCI%2FOvmfPkg%20-%20Windows%20VS%20-%20CI?branchName=master&jobName=Platform_CI&configuration=Platform_CI%20OVMF_IA32X64_FULL_DEBUG -.. |op3264fdu| image:: https://dev.azure.com/tianocore/edk2-ci/_apis/build/status%2FCI%2FOvmfPkg%20-%20Ubuntu%20GCC%20-%20CI?branchName=master&jobName=Platform_CI&configuration=Platform_CI%20OVMF_IA32X64_FULL_DEBUG -.. |op3264fr| image:: https://dev.azure.com/tianocore/edk2-ci/_apis/build/status%2FCI%2FOvmfPkg%20-%20Windows%20VS%20-%20CI?branchName=master&jobName=Platform_CI&configuration=Platform_CI%20OVMF_IA32X64_FULL_RELEASE -.. |op3264fru| image:: https://dev.azure.com/tianocore/edk2-ci/_apis/build/status%2FCI%2FOvmfPkg%20-%20Ubuntu%20GCC%20-%20CI?branchName=master&jobName=Platform_CI&configuration=Platform_CI%20OVMF_IA32X64_FULL_RELEASE -.. |op3264fn| image:: https://dev.azure.com/tianocore/edk2-ci/_apis/build/status%2FCI%2FOvmfPkg%20-%20Windows%20VS%20-%20CI?branchName=master&jobName=Platform_CI&configuration=Platform_CI%20OVMF_IA32X64_FULL_NOOPT -.. |op3264fnu| image:: https://dev.azure.com/tianocore/edk2-ci/_apis/build/status%2FCI%2FOvmfPkg%20-%20Ubuntu%20GCC%20-%20CI?branchName=master&jobName=Platform_CI&configuration=Platform_CI%20OVMF_IA32X64_FULL_NOOPT From e17e5ddd14dae81f8aa9f1fa0b2fc9e03c177344 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Wed, 3 Dec 2025 10:42:37 +0100 Subject: [PATCH 0888/1172] OvmfPkg: Drop mixed IA32/X64 builds from platform CI Signed-off-by: Ard Biesheuvel --- .../PlatformCI/.azurepipelines/Ubuntu-GCC.yml | 47 ------------------ .../PlatformCI/.azurepipelines/Windows-VS.yml | 48 ------------------- 2 files changed, 95 deletions(-) diff --git a/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml b/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml index 0272b46d008d..d6986910e3db 100644 --- a/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml +++ b/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml @@ -51,53 +51,6 @@ jobs: Run.Flags: $(run_flags) Run: $(should_run) - OVMF_IA32X64_DEBUG: - Build.File: "$(package)/PlatformCI/PlatformBuild.py" - Build.Arch: "IA32,X64" - Build.Flags: "" - Build.Target: "DEBUG" - Run.Flags: $(run_flags) - Run: $(should_run) - OVMF_IA32X64_RELEASE: - Build.File: "$(package)/PlatformCI/PlatformBuild.py" - Build.Arch: "IA32,X64" - Build.Flags: "" - Build.Target: "RELEASE" - Run.Flags: $(run_flags) - Run: $(should_run) - OVMF_IA32X64_NOOPT: - Build.File: "$(package)/PlatformCI/PlatformBuild.py" - Build.Arch: "IA32,X64" - Build.Flags: "" - Build.Target: "NOOPT" - Run.Flags: $(run_flags) - Run: $(should_run) - - OVMF_IA32X64_FULL_DEBUG: - Build.File: "$(package)/PlatformCI/PlatformBuild.py" - Build.Arch: "IA32,X64" - Build.Flags: "BLD_*_SECURE_BOOT_ENABLE=1 BLD_*_SMM_REQUIRE=1 BLD_*_TPM2_ENABLE=1 BLD_*_NETWORK_TLS_ENABLE=1 BLD_*_NETWORK_IP6_ENABLE=1 BLD_*_NETWORK_HTTP_BOOT_ENABLE=1" - Build.Target: "DEBUG" - Run.Flags: $(run_flags) - Run: $(should_run) - OVMF_IA32X64_FULL_RELEASE: - Build.File: "$(package)/PlatformCI/PlatformBuild.py" - Build.Arch: "IA32,X64" - Build.Flags: "BLD_*_SECURE_BOOT_ENABLE=1 BLD_*_SMM_REQUIRE=1 BLD_*_TPM2_ENABLE=1 BLD_*_NETWORK_TLS_ENABLE=1 BLD_*_NETWORK_IP6_ENABLE=1 BLD_*_NETWORK_HTTP_BOOT_ENABLE=1" - Build.Target: "RELEASE" - Run.Flags: $(run_flags) - Run: $(should_run) - # This currently creates a very large image which is too big for the FDF declared range, - # skip this build for now. - # - # OVMF_IA32X64_FULL_NOOPT: - # Build.File: "$(package)/PlatformCI/PlatformBuild.py" - # Build.Arch: "IA32,X64" - # Build.Flags: "BLD_*_SECURE_BOOT_ENABLE=1 BLD_*_SMM_REQUIRE=1 BLD_*_TPM2_ENABLE=1 BLD_*_NETWORK_TLS_ENABLE=1 BLD_*_NETWORK_IP6_ENABLE=1 BLD_*_NETWORK_HTTP_BOOT_ENABLE=1" - # Build.Target: "NOOPT" - # Run.Flags: $(run_flags) - # Run: $(should_run) - OVMF_X64_MM_DEBUG: Build.File: "$(package)/PlatformCI/PlatformBuild.py" Build.Arch: "X64" diff --git a/OvmfPkg/PlatformCI/.azurepipelines/Windows-VS.yml b/OvmfPkg/PlatformCI/.azurepipelines/Windows-VS.yml index 90634d9f93cc..b3a165cfd864 100644 --- a/OvmfPkg/PlatformCI/.azurepipelines/Windows-VS.yml +++ b/OvmfPkg/PlatformCI/.azurepipelines/Windows-VS.yml @@ -51,54 +51,6 @@ jobs: Run.Flags: $(run_flags) Run: $(should_run) - OVMF_IA32X64_DEBUG: - Build.File: "$(package)/PlatformCI/PlatformBuild.py" - Build.Arch: "IA32,X64" - Build.Flags: "" - Build.Target: "DEBUG" - Run.Flags: $(run_flags) - Run: $(should_run) - OVMF_IA32X64_RELEASE: - Build.File: "$(package)/PlatformCI/PlatformBuild.py" - Build.Arch: "IA32,X64" - Build.Flags: "" - Build.Target: "RELEASE" - Run.Flags: $(run_flags) - Run: $(should_run) - OVMF_IA32X64_NOOPT: - Build.File: "$(package)/PlatformCI/PlatformBuild.py" - Build.Arch: "IA32,X64" - Build.Flags: "" - Build.Target: "NOOPT" - Run.Flags: $(run_flags) - Run: $(should_run) - - OVMF_IA32X64_FULL_DEBUG: - Build.File: "$(package)/PlatformCI/PlatformBuild.py" - Build.Arch: "IA32,X64" - Build.Flags: "BLD_*_SECURE_BOOT_ENABLE=1 BLD_*_SMM_REQUIRE=1 BLD_*_TPM2_ENABLE=1 BLD_*_NETWORK_TLS_ENABLE=1 BLD_*_NETWORK_IP6_ENABLE=1 BLD_*_NETWORK_HTTP_BOOT_ENABLE=1" - Build.Target: "DEBUG" - Run.Flags: $(run_flags) - Run: $(should_run) - OVMF_IA32X64_FULL_RELEASE: - Build.File: "$(package)/PlatformCI/PlatformBuild.py" - Build.Arch: "IA32,X64" - Build.Flags: "BLD_*_SECURE_BOOT_ENABLE=1 BLD_*_SMM_REQUIRE=1 BLD_*_TPM2_ENABLE=1 BLD_*_NETWORK_TLS_ENABLE=1 BLD_*_NETWORK_IP6_ENABLE=1 BLD_*_NETWORK_HTTP_BOOT_ENABLE=1" - Build.Target: "RELEASE" - Run.Flags: $(run_flags) - Run: $(should_run) - - # This currently creates a very large image which is too big for the FDF declared range - # Ovmf maintainers suggest to skip this build for now. - # - # OVMF_IA32X64_FULL_NOOPT: - # Build.File: "$(package)/PlatformCI/PlatformBuild.py" - # Build.Arch: "IA32,X64" - # Build.Flags: "BLD_*_SECURE_BOOT_ENABLE=1 BLD_*_SMM_REQUIRE=1 BLD_*_TPM2_ENABLE=1 BLD_*_NETWORK_TLS_ENABLE=1 BLD_*_NETWORK_IP6_ENABLE=1 BLD_*_NETWORK_HTTP_BOOT_ENABLE=1" - # Build.Target: "NOOPT" - # Run.Flags: $(run_flags) - # Run: $(should_run) - OVMF_X64_MM_DEBUG: Build.File: "$(package)/PlatformCI/PlatformBuild.py" Build.Arch: "X64" From 95c4d1e17224ea06ccbf31acbc67c12d9c94e0c2 Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Wed, 19 Nov 2025 07:03:58 +0000 Subject: [PATCH 0889/1172] BaseTools: Update OFFSET_OF macro for use with UBSan Without this change, the macro causes unwanted 'member access within null pointer' warnings with UBSan. This is the same macro definition as used in MdePkg/Include/Base.h, except for removing the legacy `__GNUC__ >= 4` test. Ideally the orginal macro should have this removed too, as should the several other instances with similar tests around the codebase, but we leave that for a separate commit. Signed-off-by: Mike Beaton --- BaseTools/Source/C/Include/Common/BaseTypes.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/BaseTools/Source/C/Include/Common/BaseTypes.h b/BaseTools/Source/C/Include/Common/BaseTypes.h index 5093a2f1f9f5..8175cc8dc601 100644 --- a/BaseTools/Source/C/Include/Common/BaseTypes.h +++ b/BaseTools/Source/C/Include/Common/BaseTypes.h @@ -151,7 +151,13 @@ typedef struct { // // Macro that returns the byte offset of a field in a data structure. // -#define OFFSET_OF(TYPE, Field) ((UINTN) &(((TYPE *)0)->Field)) +#if defined (__GNUC__) || defined (__clang__) +#define OFFSET_OF(TYPE, Field) ((UINTN) __builtin_offsetof(TYPE, Field)) +#endif + +#ifndef OFFSET_OF +#define OFFSET_OF(TYPE, Field) ((UINTN) &(((TYPE *)0)->Field)) +#endif /// /// _CR - returns a pointer to the structure From 939ebe48e6d6e157b0768368445a51172fee53b9 Mon Sep 17 00:00:00 2001 From: Vitaly Cheptsov Date: Mon, 28 Apr 2025 18:09:39 +0300 Subject: [PATCH 0890/1172] BaseTools/VfrCompile: Fix memory issues Using GCC 13.3.0 discovers an out of bounds memory access in VfrCompile when building DriverSampleDxe. This is also discoverable with ASan. The issue here is that EFI_IFR_TYPE_VALUE is a flexible type and when passed by value for string types only the header part is accessible. Assuming the remainder is zero seems to be ok as gZeroEfiIfrTypeValue is used as a variable source. This change also fixes a warning for new[]/delete[] mismatch discovered by ASan. Co-authored-by: Vitaly Cheptsov Signed-off-by: Mike Beaton --- BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp b/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp index 11470de45cce..d0ef0d8f265d 100644 --- a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp +++ b/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp @@ -80,6 +80,12 @@ SConfigInfo::SConfigInfo ( return; } + memset (mValue, 0, mWidth); + + if (mWidth > sizeof(EFI_IFR_TYPE_VALUE)) { + mWidth = sizeof(EFI_IFR_TYPE_VALUE); + } + switch (Type) { case EFI_IFR_TYPE_NUM_SIZE_8 : memcpy (mValue, &Value.u8, mWidth); @@ -2380,7 +2386,7 @@ CVfrDefaultStore::ReRegisterDefaultStoreById ( } if (RefName != NULL) { - delete pNode->mRefName; + delete [] pNode->mRefName; pNode->mRefName = new CHAR8[strlen (RefName) + 1]; if (pNode->mRefName != NULL) { strcpy (pNode->mRefName, RefName); From 12751d48e215de110a245151f76d3deff39bfe70 Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Wed, 26 Nov 2025 21:45:23 +0000 Subject: [PATCH 0891/1172] BaseTools/VfrCompile: Fix EFI_GUID unaligned access The memmove in SetClassGuid at line 684 generates a `store to misaligned address` runtime warning when VfrCompile is compiled with clang UBSan. We can avoid generating code which stores to a misaligned address in a least a couple of other ways than done here, including casting the destination pointer of the memmove to (VOID *), or compiling with `-fno-builtin-memmove`. However, maintaining an unaligned pointer to an aligned type is, strictly speaking, undefined behaviour in the c/c++ standard (regardless of how it is or is not then accessed). So here we resolve the actual incorrect semantics of this part of the code (and thereby fix the unaligned access) by introducing a PACKED_EFI_GUID type in VfrUtilityLib.h, and using it for this unaligned access. Signed-off-by: Mike Beaton --- BaseTools/Source/C/VfrCompile/VfrFormPkg.h | 6 +++--- BaseTools/Source/C/VfrCompile/VfrUtilityLib.h | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/BaseTools/Source/C/VfrCompile/VfrFormPkg.h b/BaseTools/Source/C/VfrCompile/VfrFormPkg.h index 9ef6f0778711..2646c89b48f6 100644 --- a/BaseTools/Source/C/VfrCompile/VfrFormPkg.h +++ b/BaseTools/Source/C/VfrCompile/VfrFormPkg.h @@ -655,8 +655,8 @@ static BOOLEAN gIsStringOp = FALSE; */ class CIfrFormSet : public CIfrObj, public CIfrOpHeader { private: - EFI_IFR_FORM_SET *mFormSet; - EFI_GUID *mClassGuid; + EFI_IFR_FORM_SET *mFormSet; + PACKED_EFI_GUID *mClassGuid; public: CIfrFormSet (UINT8 Size) : CIfrObj (EFI_IFR_FORM_SET_OP, (CHAR8 **)NULL, Size), @@ -665,7 +665,7 @@ class CIfrFormSet : public CIfrObj, public CIfrOpHeader { mFormSet->FormSetTitle = EFI_STRING_ID_INVALID; mFormSet->Flags = 0; memset (&mFormSet->Guid, 0, sizeof (EFI_GUID)); - mClassGuid = (EFI_GUID *) (mFormSet + 1); + mClassGuid = (PACKED_EFI_GUID *) (mFormSet + 1); } VOID SetGuid (IN EFI_GUID *Guid) { diff --git a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h b/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h index 57bb0c424daf..97a6740fe442 100644 --- a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h +++ b/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h @@ -15,6 +15,12 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include "EfiVfr.h" #include "VfrError.h" +#pragma pack(1) +typedef struct { + EFI_GUID Guid; +} PACKED_EFI_GUID; +#pragma pack() + static EFI_GUID gEdkiiIfrBitVarGuid = EDKII_IFR_BIT_VARSTORE_GUID; #define MAX_BIT_WIDTH 32 From 618868512e7ac0457d052fc73f670bfede15b657 Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Fri, 21 Nov 2025 22:23:52 +0000 Subject: [PATCH 0892/1172] BaseTools/VfrCompile: Prevent uninitialized memory access When traversing through the field definition of a nested type, such as "MY_EFI_BITS_VARSTORE_DATA.BitsData.NestBitCheckbox", in method CVfrVarDataTypeDB::GetDataFieldInfo, the mBitWidth member of the parent (e.g. BitsData) of a bitfield is accessed, even though it is not itself a bit field and thus its mBitWidth has never been initialised. This is not necessary, the Size and Type of each parent object were being calculated then overwritten by the next lower object, so we can just avoid calculating these until the final one which we actually need. This behaviour was caught by clang MSan. Signed-off-by: Mike Beaton --- .../Source/C/VfrCompile/VfrUtilityLib.cpp | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp b/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp index d0ef0d8f265d..9a3a2e6d1a7d 100644 --- a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp +++ b/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp @@ -1403,22 +1403,25 @@ CVfrVarDataTypeDB::GetDataFieldInfo ( // // if it is not struct data type // - Type = pType->mType; - Size = pType->mTotalSize; - - while (*VarStr != '\0') { - CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr, FName, ArrayIdx), VFR_RETURN_SUCCESS); - CHECK_ERROR_RETURN(GetTypeField (FName, pType, pField), VFR_RETURN_SUCCESS); - pType = pField->mFieldType; - CHECK_ERROR_RETURN(GetFieldOffset (pField, ArrayIdx, Tmp, pField->mIsBitField), VFR_RETURN_SUCCESS); - if (BitField && !pField->mIsBitField) { - Offset = (UINT16) (Offset + Tmp * 8); - } else { - Offset = (UINT16) (Offset + Tmp); + if (*VarStr == '\0') { + Type = pType->mType; + Size = pType->mTotalSize; + } else { + while (*VarStr != '\0') { + CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr, FName, ArrayIdx), VFR_RETURN_SUCCESS); + CHECK_ERROR_RETURN(GetTypeField (FName, pType, pField), VFR_RETURN_SUCCESS); + pType = pField->mFieldType; + CHECK_ERROR_RETURN(GetFieldOffset (pField, ArrayIdx, Tmp, pField->mIsBitField), VFR_RETURN_SUCCESS); + if (BitField && !pField->mIsBitField) { + Offset = (UINT16) (Offset + Tmp * 8); + } else { + Offset = (UINT16) (Offset + Tmp); + } } Type = GetFieldWidth (pField); Size = GetFieldSize (pField, ArrayIdx, BitField); } + return VFR_RETURN_SUCCESS; } From 5701cf673d39ea15a2c632e140884c8fa241aec8 Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Tue, 18 Nov 2025 23:11:00 +0000 Subject: [PATCH 0893/1172] BaseTools/VfrCompile: Fix bit field access logic The previous logic for accessing bit fields is wrong when the bit field starts beyond the first byte, in a storage unit larger than a byte. This caused unaligned memory accesses which can be caught by sanitizers. We also bump the tool minor version number to reflect a functional bugfix. Signed-off-by: Mike Beaton --- BaseTools/Source/C/VfrCompile/VfrCompiler.h | 2 +- BaseTools/Source/C/VfrCompile/VfrSyntax.g | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/BaseTools/Source/C/VfrCompile/VfrCompiler.h b/BaseTools/Source/C/VfrCompile/VfrCompiler.h index b6e207d2ce1a..e4efbf6358a1 100644 --- a/BaseTools/Source/C/VfrCompile/VfrCompiler.h +++ b/BaseTools/Source/C/VfrCompile/VfrCompiler.h @@ -17,7 +17,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include "ParseInf.h" #define PROGRAM_NAME "VfrCompile" -#define VFR_COMPILER_VERSION " 2.01 (UEFI 2.4) " +#define VFR_COMPILER_VERSION " 2.02 (UEFI 2.4) " // // This is how we invoke the C preprocessor on the VFR source file // to resolve #defines, #includes, etc. To make C source files diff --git a/BaseTools/Source/C/VfrCompile/VfrSyntax.g b/BaseTools/Source/C/VfrCompile/VfrSyntax.g index 0f17b9dabc72..4eea0d7d2f9e 100644 --- a/BaseTools/Source/C/VfrCompile/VfrSyntax.g +++ b/BaseTools/Source/C/VfrCompile/VfrSyntax.g @@ -895,8 +895,8 @@ vfrExtensionData[UINT8 *DataBuff, UINT32 Size, CHAR8 *TypeName, UINT32 TypeSize, gCVfrVarDataTypeDB.GetDataFieldInfo(TFName, FieldOffset, FieldType, FieldSize, BitField); if (BitField) { Mask = (1 << FieldSize) - 1; - Offset = FieldOffset / 8; - PreBits = FieldOffset % 8; + PreBits = FieldOffset % (1 << (FieldType + 3)); ///< Relies on field types for 8,16,32,64 bits having values 0,1,2,3 + Offset = (FieldOffset - PreBits) / 8; Mask <<= PreBits; } switch (FieldType) { From f79cfc8eafa56dbc4619e2e764e5cf56a4babc6d Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Tue, 18 Nov 2025 23:18:23 +0000 Subject: [PATCH 0894/1172] BaseTools/VfrCompile: Fix null pointer deref when dumping internal types Internal types such as pFormIdField, pFormSetGuidField have no associated field type, however the Dump command assumes that all types do. This causes null pointer dereferencing which can be caught by sanitizers. De facto, the field type for these types was already dumped as , this achieves the same safely. Signed-off-by: Mike Beaton --- BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp b/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp index 9a3a2e6d1a7d..82ec7b5b927d 100644 --- a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp +++ b/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp @@ -1491,6 +1491,7 @@ CVfrVarDataTypeDB::Dump ( { SVfrDataType *pTNode; SVfrDataField *pFNode; + CHAR8 *FieldTypeName; fprintf (File, "\n\n***************************************************************\n"); fprintf (File, "\t\tmPackAlign = %x\n", mPackAlign); @@ -1498,12 +1499,13 @@ CVfrVarDataTypeDB::Dump ( fprintf (File, "\t\tstruct %s : mAlign [%d] mTotalSize [0x%x]\n\n", pTNode->mTypeName, pTNode->mAlign, pTNode->mTotalSize); fprintf (File, "\t\tstruct %s {\n", pTNode->mTypeName); for (pFNode = pTNode->mMembers; pFNode != NULL; pFNode = pFNode->mNext) { + FieldTypeName = (pFNode->mFieldType == NULL) ? NULL : pFNode->mFieldType->mTypeName; if (pFNode->mArrayNum > 0) { fprintf (File, "\t\t\t+%08d[%08x] %s[%d] <%s>\n", pFNode->mOffset, pFNode->mOffset, - pFNode->mFieldName, pFNode->mArrayNum, pFNode->mFieldType->mTypeName); + pFNode->mFieldName, pFNode->mArrayNum, FieldTypeName); } else { fprintf (File, "\t\t\t+%08d[%08x] %s <%s>\n", pFNode->mOffset, pFNode->mOffset, - pFNode->mFieldName, pFNode->mFieldType->mTypeName); + pFNode->mFieldName, FieldTypeName); } } fprintf (File, "\t\t};\n"); From 53cca9ed9995abdac9fed01aa54c4bf5195f48aa Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Thu, 20 Nov 2025 07:46:51 +0000 Subject: [PATCH 0895/1172] BaseTools/VfrCompile: Minor code cleanup There are no functional changes in this commit. It adds non-functional minor code cleanups made while tracking down the bugs fixed in the preceding commits. - Fix spelling 'arrary' -> 'array' where it occurs in the tool code and comments. - When renaming ExtractFieldNameAndArrary to ExtractFieldNameAndArrayIdx, we fix the typo and also clarify what the method does: it returns the field name and the array index when present. Since it is always used to populate a local variable named ArrayIdx, we stick to that spelling in the renamed method. - Add comment clarifying that mArrayNum holds array length (but again, don't go for a bigger global rename). - Rename CVfrVarDataTypeDB::GetFieldWidth to GetFieldType. It is only used once, and the new name correctly matches what it does. Signed-off-by: Mike Beaton --- BaseTools/Source/C/VfrCompile/VfrError.cpp | 2 +- BaseTools/Source/C/VfrCompile/VfrError.h | 2 +- BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp | 2 +- BaseTools/Source/C/VfrCompile/VfrSyntax.g | 2 +- .../Source/C/VfrCompile/VfrUtilityLib.cpp | 20 +++++++++---------- BaseTools/Source/C/VfrCompile/VfrUtilityLib.h | 6 +++--- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/BaseTools/Source/C/VfrCompile/VfrError.cpp b/BaseTools/Source/C/VfrCompile/VfrError.cpp index 65bb8e34fde9..1c06fab521d2 100644 --- a/BaseTools/Source/C/VfrCompile/VfrError.cpp +++ b/BaseTools/Source/C/VfrCompile/VfrError.cpp @@ -35,7 +35,7 @@ static SVFR_ERROR_HANDLE VFR_ERROR_HANDLE_TABLE [] = { { VFR_RETURN_GET_NVVARSTORE_ERROR, ": get name value varstore error" }, { VFR_RETURN_QVAR_REUSE, ": variable reused by more than one question" }, { VFR_RETURN_FLAGS_UNSUPPORTED, ": flags unsupported" }, - { VFR_RETURN_ERROR_ARRARY_NUM, ": array number error, the valid value is in (0 ~ MAX_INDEX-1) for UEFI vfr and in (1 ~ MAX_INDEX) for Framework Vfr" }, + { VFR_RETURN_ERROR_ARRAY_NUM, ": array number error, the valid value is in (0 ~ MAX_INDEX-1) for UEFI vfr and in (1 ~ MAX_INDEX) for Framework Vfr" }, { VFR_RETURN_DATA_STRING_ERROR, ": data field string error or not support"}, { VFR_RETURN_DEFAULT_VALUE_REDEFINED, ": default value re-defined with different value"}, { VFR_RETURN_CONSTANT_ONLY, ": only constant is allowed in the expression"}, diff --git a/BaseTools/Source/C/VfrCompile/VfrError.h b/BaseTools/Source/C/VfrCompile/VfrError.h index 7d16bd5f74cb..3298a44ef440 100644 --- a/BaseTools/Source/C/VfrCompile/VfrError.h +++ b/BaseTools/Source/C/VfrCompile/VfrError.h @@ -33,7 +33,7 @@ typedef enum { VFR_RETURN_GET_NVVARSTORE_ERROR, VFR_RETURN_QVAR_REUSE, VFR_RETURN_FLAGS_UNSUPPORTED, - VFR_RETURN_ERROR_ARRARY_NUM, + VFR_RETURN_ERROR_ARRAY_NUM, VFR_RETURN_DATA_STRING_ERROR, VFR_RETURN_DEFAULT_VALUE_REDEFINED, VFR_RETURN_CONSTANT_ONLY, diff --git a/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp b/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp index 36d3baaf10f8..48cab9b443ad 100644 --- a/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp +++ b/BaseTools/Source/C/VfrCompile/VfrFormPkg.cpp @@ -853,7 +853,7 @@ CFormPkg::DeclarePendingQuestion ( // // Get Question Info, framework vfr VarName == StructName // - ReturnCode = lCVfrVarDataTypeDB.ExtractFieldNameAndArrary (VarStr, FName, ArrayIdx); + ReturnCode = lCVfrVarDataTypeDB.ExtractFieldNameAndArrayIdx (VarStr, FName, ArrayIdx); if (ReturnCode != VFR_RETURN_SUCCESS) { gCVfrErrorHandle.PrintMsg (pNode->mLineNo, pNode->mKey, "Error", "Var string is not the valid C variable"); return ReturnCode; diff --git a/BaseTools/Source/C/VfrCompile/VfrSyntax.g b/BaseTools/Source/C/VfrCompile/VfrSyntax.g index 4eea0d7d2f9e..433a4e82003e 100644 --- a/BaseTools/Source/C/VfrCompile/VfrSyntax.g +++ b/BaseTools/Source/C/VfrCompile/VfrSyntax.g @@ -904,7 +904,7 @@ vfrExtensionData[UINT8 *DataBuff, UINT32 Size, CHAR8 *TypeName, UINT32 TypeSize, Data_U8 = _STOU8(RD->getText(), RD->getLine()); if (BitField) { // - // Set the value to the bit fileds. + // Set the value to the bit fields. // Value = *(UINT8*) (ByteOffset + Offset); Data_U8 <<= PreBits; diff --git a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp b/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp index 82ec7b5b927d..29fffa55c257 100644 --- a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp +++ b/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp @@ -649,7 +649,7 @@ CVfrVarDataTypeDB::IsThisBitField ( CHECK_ERROR_RETURN (GetDataType (TName, &pType), VFR_RETURN_SUCCESS); while (*VarStr != '\0') { - CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr, FName, ArrayIdx), VFR_RETURN_SUCCESS); + CHECK_ERROR_RETURN(ExtractFieldNameAndArrayIdx(VarStr, FName, ArrayIdx), VFR_RETURN_SUCCESS); CHECK_ERROR_RETURN(GetTypeField (FName, pType, pField), VFR_RETURN_SUCCESS); pType = pField->mFieldType; } @@ -661,7 +661,7 @@ CVfrVarDataTypeDB::IsThisBitField ( } EFI_VFR_RETURN_CODE -CVfrVarDataTypeDB::ExtractFieldNameAndArrary ( +CVfrVarDataTypeDB::ExtractFieldNameAndArrayIdx ( IN CHAR8 *&VarStr, IN CHAR8 *FName, OUT UINT32 &ArrayIdx @@ -766,17 +766,17 @@ CVfrVarDataTypeDB::GetFieldOffset ( } if ((ArrayIdx != INVALID_ARRAY_INDEX) && ((Field->mArrayNum == 0) || (Field->mArrayNum <= ArrayIdx))) { - return VFR_RETURN_ERROR_ARRARY_NUM; + return VFR_RETURN_ERROR_ARRAY_NUM; } // // Be compatible with the current usage - // If ArraryIdx is not specified, the first one is used. + // If ArrayIdx is not specified, the first one is used. // - // if ArrayNum is larger than zero, ArraryIdx must be specified. + // if ArrayNum is larger than zero, ArrayIdx must be specified. // // if ((ArrayIdx == INVALID_ARRAY_INDEX) && (Field->mArrayNum > 0)) { - // return VFR_RETURN_ERROR_ARRARY_NUM; + // return VFR_RETURN_ERROR_ARRAY_NUM; // } // if (IsBitField) { @@ -788,7 +788,7 @@ CVfrVarDataTypeDB::GetFieldOffset ( } UINT8 -CVfrVarDataTypeDB::GetFieldWidth ( +CVfrVarDataTypeDB::GetFieldType ( IN SVfrDataField *Field ) { @@ -1183,7 +1183,7 @@ CVfrVarDataTypeDB::DataTypeAddBitField ( } } else { // - // The bit filed start a new memory + // The bit field start a new memory // pNewField->mBitOffset = mNewDataType->mTotalSize * 8; UpdateTotalSize = TRUE; @@ -1408,7 +1408,7 @@ CVfrVarDataTypeDB::GetDataFieldInfo ( Size = pType->mTotalSize; } else { while (*VarStr != '\0') { - CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr, FName, ArrayIdx), VFR_RETURN_SUCCESS); + CHECK_ERROR_RETURN(ExtractFieldNameAndArrayIdx(VarStr, FName, ArrayIdx), VFR_RETURN_SUCCESS); CHECK_ERROR_RETURN(GetTypeField (FName, pType, pField), VFR_RETURN_SUCCESS); pType = pField->mFieldType; CHECK_ERROR_RETURN(GetFieldOffset (pField, ArrayIdx, Tmp, pField->mIsBitField), VFR_RETURN_SUCCESS); @@ -1418,7 +1418,7 @@ CVfrVarDataTypeDB::GetDataFieldInfo ( Offset = (UINT16) (Offset + Tmp); } } - Type = GetFieldWidth (pField); + Type = GetFieldType (pField); Size = GetFieldSize (pField, ArrayIdx, BitField); } diff --git a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h b/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h index 97a6740fe442..713c7434e2c8 100644 --- a/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h +++ b/BaseTools/Source/C/VfrCompile/VfrUtilityLib.h @@ -116,7 +116,7 @@ struct SVfrDataField { CHAR8 mFieldName[MAX_NAME_LEN]; SVfrDataType *mFieldType; UINT32 mOffset; - UINT32 mArrayNum; + UINT32 mArrayNum; ///< Holds array length, or zero for non-array. BOOLEAN mIsBitField; UINT8 mBitWidth; UINT32 mBitOffset; @@ -201,7 +201,7 @@ class CVfrVarDataTypeDB { EFI_VFR_RETURN_CODE ExtractStructTypeName (IN CHAR8 *&, OUT CHAR8 *); EFI_VFR_RETURN_CODE GetTypeField (IN CONST CHAR8 *, IN SVfrDataType *, IN SVfrDataField *&); EFI_VFR_RETURN_CODE GetFieldOffset (IN SVfrDataField *, IN UINT32, OUT UINT32 &, IN BOOLEAN); - UINT8 GetFieldWidth (IN SVfrDataField *); + UINT8 GetFieldType (IN SVfrDataField *); UINT32 GetFieldSize (IN SVfrDataField *, IN UINT32, IN BOOLEAN); public: @@ -220,7 +220,7 @@ class CVfrVarDataTypeDB { EFI_VFR_RETURN_CODE GetDataFieldInfo (IN CHAR8 *, OUT UINT16 &, OUT UINT8 &, OUT UINT32 &, OUT BOOLEAN &); EFI_VFR_RETURN_CODE GetUserDefinedTypeNameList (OUT CHAR8 ***, OUT UINT32 *); - EFI_VFR_RETURN_CODE ExtractFieldNameAndArrary (IN CHAR8 *&, OUT CHAR8 *, OUT UINT32 &); + EFI_VFR_RETURN_CODE ExtractFieldNameAndArrayIdx (IN CHAR8 *&, OUT CHAR8 *, OUT UINT32 &); BOOLEAN DataTypeHasBitField (IN CHAR8 *); BOOLEAN IsThisBitField (IN CHAR8 *); From 7aaf742d2dc3f188b0307544cc767e6879df9c9e Mon Sep 17 00:00:00 2001 From: Ayden Meng Date: Thu, 27 Nov 2025 19:55:31 +0800 Subject: [PATCH 0896/1172] BaseTools: Handle file descriptor exhaustion during parallel build Previously, when file descriptors were exhausted in high-concurrency builds (e.g., 512 threads with 1024 FD limit), the build would hang or fail silently without clear indication of the root cause. This change catches relevant OSError instances and terminates the build, ensuring failures due to resource limits are explicit. Signed-off-by: Ayden Meng --- BaseTools/Source/Python/build/build.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/BaseTools/Source/Python/build/build.py b/BaseTools/Source/Python/build/build.py index 6f35fbd7eaac..947eeab7455f 100755 --- a/BaseTools/Source/Python/build/build.py +++ b/BaseTools/Source/Python/build/build.py @@ -24,6 +24,7 @@ import platform import traceback import multiprocessing +import errno from threading import Thread,Event,BoundedSemaphore import threading from linecache import getlines @@ -871,6 +872,10 @@ def StartAutoGen(self,mqueue, DataPipe,SkipAutoGen,PcdMaList,cqueue): if not rt: err = UNKNOWN_ERROR return rt, err + except OSError as e: + if e.errno == errno.EMFILE: + EdkLogger.warn("build", RESOURCE_OVERFLOW, ExtraData="Reached file descriptor limit!\n") + raise except FatalError as e: return False, e.args[0] except: @@ -2693,6 +2698,8 @@ def Main(): # All job done, no error found and no exception raised # BuildError = False + except OSError as X: + ReturnCode = RESOURCE_UNKNOWN_ERROR except FatalError as X: if MyBuild is not None: # for multi-thread build exits safely From a058a2856dec7d3e837ca5034fe892c83bc8077e Mon Sep 17 00:00:00 2001 From: Ayden Meng Date: Thu, 27 Nov 2025 20:57:59 +0800 Subject: [PATCH 0897/1172] BaseTools: Cap AutoGen thread count to avoid file descriptor exhaustion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the number of build threads multiplied by per-thread file descriptor usage exceeds the system's open file descriptor limit, some threads may fail to acquire necessary resources (e.g., pipes or semaphores), leading to deadlocks or hangs during parallel builds. To prevent this situation, calculate the safety upper limit of concurrency by dividing the system's maximum file descriptor limit by 3 (An empirical value derived from balancing performance overhead against the theoretical number of file descriptors consumed per thread). The actual thread count is then clamped to this safe value. Other usages of ThreadNum()—such as during actual compilation or log queue creation—do not significantly contribute to file descriptor consumption. Therefore, adjusting ThreadNum() globally would be unwarranted, as it could unnecessarily restrict parallelism in stages that are not FD-bound. This ensures stable parallel builds even under constrained resource limits. Signed-off-by: Ayden Meng --- BaseTools/Source/Python/build/build.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/BaseTools/Source/Python/build/build.py b/BaseTools/Source/Python/build/build.py index 947eeab7455f..d403851d5130 100755 --- a/BaseTools/Source/Python/build/build.py +++ b/BaseTools/Source/Python/build/build.py @@ -838,13 +838,22 @@ def StartAutoGen(self,mqueue, DataPipe,SkipAutoGen,PcdMaList,cqueue): try: if SkipAutoGen: return True,0 + if sys.platform == "win32": + SafeThreadNumber = self.ThreadNumber + else: + import resource + soft = resource.getrlimit(resource.RLIMIT_NOFILE)[0] + SafeThreadNumber = min(self.ThreadNumber, soft // 3) + if SafeThreadNumber < self.ThreadNumber: + EdkLogger.verbose("AutoGen workers limited to %d to avoid file descriptor exhaustion" % SafeThreadNumber) feedback_q = mp.Queue() error_event = mp.Event() FfsCmd = DataPipe.Get("FfsCommand") if FfsCmd is None: FfsCmd = {} GlobalData.FfsCmd = FfsCmd - auto_workers = [AutoGenWorkerInProcess(mqueue,DataPipe.dump_file,feedback_q,GlobalData.file_lock,cqueue,self.log_q,error_event) for _ in range(self.ThreadNumber)] + + auto_workers = [AutoGenWorkerInProcess(mqueue,DataPipe.dump_file,feedback_q,GlobalData.file_lock,cqueue,self.log_q,error_event) for _ in range(SafeThreadNumber)] self.AutoGenMgr = AutoGenManager(auto_workers,feedback_q,error_event) self.AutoGenMgr.start() for w in auto_workers: From ee0084a071b9836cbea07c469483b5f0c10d6abf Mon Sep 17 00:00:00 2001 From: Mingjie Shen Date: Fri, 31 Oct 2025 06:31:00 +0000 Subject: [PATCH 0898/1172] ShellPkg/Mv: Harden and optimize trailing-slash trimming MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove redundant null check in IsValidMove() per CodeQL cpp/redundant-null-check-simple. Specifically, drop the "DestPathWalker != NULL" condition from the trimming loop. Rationale: "DestPathCopy" is allocated at line 181 and checked for NULL at lines 182–183; "DestPathWalker" is initialized from "DestPathCopy" at line 186, so it cannot be NULL. - Cache length once in IsValidMove() and ValidateAndMoveFiles() so the trimming loop avoids repeated StrLen() calls. - Guard the zero-length case before indexing the last character to prevent out-of-bounds access. Signed-off-by: Mingjie Shen --- ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c index fcd001e5abe1..b92fafb94bd1 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c @@ -154,6 +154,7 @@ IsValidMove ( { CHAR16 *DestPathCopy; CHAR16 *DestPathWalker; + UINTN WalkerLen; if ((Cwd != NULL) && ((Attribute & EFI_FILE_DIRECTORY) == EFI_FILE_DIRECTORY)) { if (!IsSoucePathValid (SourcePath, Cwd)) { @@ -185,8 +186,10 @@ IsValidMove ( for (DestPathWalker = DestPathCopy; *DestPathWalker == L'\\'; DestPathWalker++) { } - while (DestPathWalker != NULL && DestPathWalker[StrLen (DestPathWalker)-1] == L'\\') { - DestPathWalker[StrLen (DestPathWalker)-1] = CHAR_NULL; + WalkerLen = StrLen (DestPathWalker); + while ((WalkerLen > 0) && (DestPathWalker[WalkerLen - 1] == L'\\')) { + DestPathWalker[WalkerLen - 1] = CHAR_NULL; + WalkerLen--; } ASSERT (DestPathWalker != NULL); @@ -544,6 +547,7 @@ ValidateAndMoveFiles ( CHAR16 *HiiOutput; CHAR16 *HiiResultOk; CHAR16 *DestPath; + UINTN DestPathLen; CHAR16 *FullDestPath; CONST CHAR16 *Cwd; CHAR16 *FullCwd; @@ -696,8 +700,12 @@ ValidateAndMoveFiles ( } if (IsBetweenFileSystem (Node->FullName, FullCwd, DestPath)) { - while (FullDestPath == NULL && DestPath != NULL && DestPath[0] != CHAR_NULL && DestPath[StrLen (DestPath) - 1] == L'\\') { - DestPath[StrLen (DestPath) - 1] = CHAR_NULL; + if ((FullDestPath == NULL) && (DestPath != NULL)) { + DestPathLen = StrLen (DestPath); + while ((DestPathLen > 0) && (DestPath[DestPathLen - 1] == L'\\')) { + DestPath[DestPathLen - 1] = CHAR_NULL; + DestPathLen--; + } } Status = MoveBetweenFileSystems (Node, FullDestPath != NULL ? FullDestPath : DestPath, &Response); From 2b47c81fe6f723100ab2fa893a74b429fe8bbe7e Mon Sep 17 00:00:00 2001 From: Mingjie Shen Date: Sun, 2 Nov 2025 05:52:54 +0000 Subject: [PATCH 0899/1172] ShellPkg/For: Remove redundant null/empty checks on ArgSetWalker Fix CodeQL cpp/redundant-null-check-simple warning in ShellPkg/Library/UefiShellLevel1CommandsLib/For.c at line 571 by removing redundant null and empty-string checks on ArgSetWalker. The outer guard at line 570 ensures that ArgSetWalker is non-NULL and non-empty, so the inner condition only needs ShellIsValidForNumber(ArgSetWalker). Signed-off-by: Mingjie Shen --- ShellPkg/Library/UefiShellLevel1CommandsLib/For.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ShellPkg/Library/UefiShellLevel1CommandsLib/For.c b/ShellPkg/Library/UefiShellLevel1CommandsLib/For.c index 22d694add3f8..e8753ac568f2 100644 --- a/ShellPkg/Library/UefiShellLevel1CommandsLib/For.c +++ b/ShellPkg/Library/UefiShellLevel1CommandsLib/For.c @@ -568,7 +568,7 @@ ShellCommandRunFor ( } if ((ArgSetWalker != NULL) && (*ArgSetWalker != CHAR_NULL)) { - if ((ArgSetWalker == NULL) || (*ArgSetWalker == CHAR_NULL) || !ShellIsValidForNumber (ArgSetWalker)) { + if (!ShellIsValidForNumber (ArgSetWalker)) { ShellPrintHiiDefaultEx ( STRING_TOKEN (STR_GEN_PROBLEM_SCRIPT), gShellLevel1HiiHandle, From 3bc03ff552c81259cb838cd286a5a7c074c1aaba Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Wed, 26 Nov 2025 13:33:00 +0100 Subject: [PATCH 0900/1172] ShellPkg/AcpiView: Fix unused variable warnings in RimtParser Clang complains about unused variables: ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Rimt/RimtParser.c:21:60: error: variable 'mRimtNodeHeader' is not needed and will not be emitted [-Werror,-Wunneeded-internal-declaration] 21 | STATIC EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE mRimtNodeHeader; | ^~~~~~~~~~~~~~~ ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Rimt/RimtParser.c:25:60: error: variable 'mRimtIdMappingNode' is not needed and will not be emitted [-Werror,-Wunneeded-internal-declaration] 25 | STATIC EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE mRimtIdMappingNode; | ^~~~~~~~~~~~~~~~~~ 28 | STATIC EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE mRimtPcieRootComplexNode; | ^~~~~~~~~~~~~~~~~~~~~~~~ ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Rimt/RimtParser.c:29:60: error: variable 'mRimtIommuNode' is not needed and will not be emitted [-Werror,-Wunneeded-internal-declaration] 29 | STATIC EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE mRimtIommuNode; | ^~~~~~~~~~~~~~ 4 errors generated. This is because these variables are only used to take the size of their fields using the sizeof() operator, which does not support type names directly. So create a helper macro SIZE_OF_T () that provides the functionality we need, and drop the unused variables. Signed-off-by: Ard Biesheuvel --- .../Parsers/Rimt/RimtParser.c | 78 +++++++++---------- 1 file changed, 38 insertions(+), 40 deletions(-) diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Rimt/RimtParser.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Rimt/RimtParser.c index 322737b7a948..733e544ba7db 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Rimt/RimtParser.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Rimt/RimtParser.c @@ -15,18 +15,16 @@ #include "AcpiParser.h" #include "AcpiTableParser.h" +#define SIZE_OF_T(TYPE, Field) ((UINTN)sizeof(((TYPE *)0)->Field)) + // Local variables -STATIC UINT8 *mRimtNodeType; -STATIC UINT16 *mRimtNodeLength; -STATIC EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE mRimtNodeHeader; -STATIC EFI_ACPI_6_6_RIMT_STRUCTURE mRimtInfo; -STATIC CONST UINT32 *mNumberOfRimtNodes; -STATIC CONST UINT32 *mOffsetToRimtNodeArray; -STATIC EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE mRimtIdMappingNode; -STATIC CONST UINT16 *mNumberOfIdMappings; -STATIC UINT8 *mIdMappingArrayOffset; -STATIC EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE mRimtPcieRootComplexNode; -STATIC EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE mRimtIommuNode; +STATIC UINT8 *mRimtNodeType; +STATIC UINT16 *mRimtNodeLength; +STATIC EFI_ACPI_6_6_RIMT_STRUCTURE mRimtInfo; +STATIC CONST UINT32 *mNumberOfRimtNodes; +STATIC CONST UINT32 *mOffsetToRimtNodeArray; +STATIC CONST UINT16 *mNumberOfIdMappings; +STATIC UINT8 *mIdMappingArrayOffset; /** This function validates RIMT Node type. @@ -94,7 +92,7 @@ RimtNodeTypeToStr ( **/ #define RIMT_PARSE_NODE_HEADER \ { L"Type", \ - sizeof(mRimtNodeHeader.Type), \ + SIZE_OF_T(EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE, Type), \ OFFSET_OF(EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE, Type), \ NULL, \ RimtNodeTypeToStr, \ @@ -103,7 +101,7 @@ RimtNodeTypeToStr ( NULL \ }, \ { L"Revision", \ - sizeof(mRimtNodeHeader.Revision), \ + SIZE_OF_T(EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE, Revision),\ OFFSET_OF(EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE, Revision),\ L"%d", \ NULL, \ @@ -112,7 +110,7 @@ RimtNodeTypeToStr ( NULL \ }, \ { L"Length", \ - sizeof(mRimtNodeHeader.Length), \ + SIZE_OF_T(EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE, Length), \ OFFSET_OF(EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE, Length), \ L"%d", \ NULL, \ @@ -121,7 +119,7 @@ RimtNodeTypeToStr ( NULL \ }, \ { L"Reserved", \ - sizeof(mRimtNodeHeader.Reserved), \ + SIZE_OF_T(EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE, Reserved),\ OFFSET_OF(EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE, Reserved),\ L"0x%x", \ NULL, \ @@ -130,7 +128,7 @@ RimtNodeTypeToStr ( NULL \ }, \ { L"Id", \ - sizeof(mRimtNodeHeader.Id), \ + SIZE_OF_T(EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE, Id), \ OFFSET_OF(EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE, Id), \ L"%d", \ NULL, \ @@ -183,8 +181,8 @@ STATIC CONST ACPI_PARSER mRimtParser[] = { PARSE_ACPI_HEADER (&mRimtInfo.Header), { L"Number of RIMT Nodes", - sizeof (mRimtInfo.NumberOfRimtNodes), - OFFSET_OF (EFI_ACPI_6_6_RIMT_STRUCTURE, NumberOfRimtNodes), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_STRUCTURE,NumberOfRimtNodes), + OFFSET_OF (EFI_ACPI_6_6_RIMT_STRUCTURE,NumberOfRimtNodes), L"%d", NULL, (VOID **)&mNumberOfRimtNodes, @@ -193,8 +191,8 @@ STATIC CONST ACPI_PARSER mRimtParser[] = { }, { L"Offset to RIMT Node Array", - sizeof (mRimtInfo.OffsetToRimtNodeArray), - OFFSET_OF (EFI_ACPI_6_6_RIMT_STRUCTURE, OffsetToRimtNodeArray), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_STRUCTURE,OffsetToRimtNodeArray), + OFFSET_OF (EFI_ACPI_6_6_RIMT_STRUCTURE,OffsetToRimtNodeArray), L"0x%x", NULL, (VOID **)&mOffsetToRimtNodeArray, @@ -203,8 +201,8 @@ STATIC CONST ACPI_PARSER mRimtParser[] = { }, { L"Reserved", - sizeof (mRimtInfo.Reserved), - OFFSET_OF (EFI_ACPI_6_6_RIMT_STRUCTURE, Reserved), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_STRUCTURE,Reserved), + OFFSET_OF (EFI_ACPI_6_6_RIMT_STRUCTURE,Reserved), L"0x%x", NULL, NULL, @@ -342,7 +340,7 @@ STATIC CONST ACPI_PARSER RimtIommuNodeParser[] = { RIMT_PARSE_NODE_HEADER, { L"Hardware ID", - sizeof (mRimtIommuNode.HardwareId), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, HardwareId), OFFSET_OF (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, HardwareId), NULL, RimtHardwareIdToStr, @@ -352,7 +350,7 @@ STATIC CONST ACPI_PARSER RimtIommuNodeParser[] = { }, { L"Base Address", - sizeof (mRimtIommuNode.BaseAddress), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, BaseAddress), OFFSET_OF (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, BaseAddress), L"0x%lx", NULL, @@ -362,7 +360,7 @@ STATIC CONST ACPI_PARSER RimtIommuNodeParser[] = { }, { L"Flags", - sizeof (mRimtIommuNode.Flags), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, Flags), OFFSET_OF (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, Flags), NULL, RIMT_GET_NODE_FLAGS_PARSER_FUNC (RimtIommuFlagParser), @@ -372,7 +370,7 @@ STATIC CONST ACPI_PARSER RimtIommuNodeParser[] = { }, { L"Proximity Domain", - sizeof (mRimtIommuNode.ProximityDomain), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, ProximityDomain), OFFSET_OF (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, ProximityDomain), L"%d", NULL, @@ -382,7 +380,7 @@ STATIC CONST ACPI_PARSER RimtIommuNodeParser[] = { }, { L"PCIe Segment number", - sizeof (mRimtIommuNode.PcieSegmentNumber), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, PcieSegmentNumber), OFFSET_OF (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, PcieSegmentNumber), L"0x%x", NULL, @@ -392,7 +390,7 @@ STATIC CONST ACPI_PARSER RimtIommuNodeParser[] = { }, { L"PCIe B/D/F", - sizeof (mRimtIommuNode.PcieBdf), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, PcieBdf), OFFSET_OF (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, PcieBdf), L"%d", NULL, @@ -402,7 +400,7 @@ STATIC CONST ACPI_PARSER RimtIommuNodeParser[] = { }, { L"Number of interrupt wires", - sizeof (mRimtIommuNode.NumberOfInterruptWires), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, NumberOfInterruptWires), OFFSET_OF (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, NumberOfInterruptWires), L"0x%x", NULL, @@ -412,7 +410,7 @@ STATIC CONST ACPI_PARSER RimtIommuNodeParser[] = { }, { L"Interrupt wire array offset", - sizeof (mRimtIommuNode.InterruptWireArrayOffset), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, InterruptWireArrayOffset), OFFSET_OF (EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE, InterruptWireArrayOffset), L"0x%x", NULL, @@ -491,7 +489,7 @@ An ACPI_PARSER array describing the ID Mapping Node. STATIC CONST ACPI_PARSER RimtIdMappingNodeParser[] = { { L"Source ID Base", - sizeof (mRimtIdMappingNode.SourceIdBase), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE, SourceIdBase), OFFSET_OF (EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE, SourceIdBase), L"0x%x", NULL, @@ -499,7 +497,7 @@ STATIC CONST ACPI_PARSER RimtIdMappingNodeParser[] = { }, { L"Number of IDs", - sizeof (mRimtIdMappingNode.NumberOfIDs), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE, NumberOfIDs), OFFSET_OF (EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE, NumberOfIDs), L"%d", NULL, @@ -507,7 +505,7 @@ STATIC CONST ACPI_PARSER RimtIdMappingNodeParser[] = { }, { L"Destination Device ID Base", - sizeof (mRimtIdMappingNode.DestinationDeviceIdBase), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE, DestinationDeviceIdBase), OFFSET_OF (EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE, DestinationDeviceIdBase), L"%d", NULL, @@ -515,7 +513,7 @@ STATIC CONST ACPI_PARSER RimtIdMappingNodeParser[] = { }, { L"Destination IOMMU Offset", - sizeof (mRimtIdMappingNode.DestinationIommuOffset), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE, DestinationIommuOffset), OFFSET_OF (EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE, DestinationIommuOffset), L"0x%x", NULL, @@ -523,7 +521,7 @@ STATIC CONST ACPI_PARSER RimtIdMappingNodeParser[] = { }, { L"Flags", - sizeof (mRimtIdMappingNode.Flags), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE, Flags), OFFSET_OF (EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE, Flags), NULL, RIMT_GET_NODE_FLAGS_PARSER_FUNC (RimtIdMappingFlagParser), @@ -610,7 +608,7 @@ STATIC CONST ACPI_PARSER RimtPcieRcNodeParser[] = { RIMT_PARSE_NODE_HEADER, { L"Flags", - sizeof (mRimtPcieRootComplexNode.Flags), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE,Flags), OFFSET_OF (EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE,Flags), NULL, RIMT_GET_NODE_FLAGS_PARSER_FUNC (RimtPcieRcFlagParser), @@ -620,7 +618,7 @@ STATIC CONST ACPI_PARSER RimtPcieRcNodeParser[] = { }, { L"Reserved", - sizeof (mRimtPcieRootComplexNode.Reserved), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE,Reserved), OFFSET_OF (EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE,Reserved), L"0x%lx", NULL, @@ -630,7 +628,7 @@ STATIC CONST ACPI_PARSER RimtPcieRcNodeParser[] = { }, { L"PCIe Segment Number", - sizeof (mRimtPcieRootComplexNode.PcieSegmentNumber), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE,PcieSegmentNumber), OFFSET_OF (EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE,PcieSegmentNumber), L"%d", NULL, @@ -640,7 +638,7 @@ STATIC CONST ACPI_PARSER RimtPcieRcNodeParser[] = { }, { L"Id Mapping Array Offset", - sizeof (mRimtPcieRootComplexNode.IdMappingArrayOffset), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE,IdMappingArrayOffset), OFFSET_OF (EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE,IdMappingArrayOffset), L"0x%x", NULL, @@ -650,7 +648,7 @@ STATIC CONST ACPI_PARSER RimtPcieRcNodeParser[] = { }, { L"Number Of Id Mappings", - sizeof (mRimtPcieRootComplexNode.NumberOfIdMappings), + SIZE_OF_T (EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE,NumberOfIdMappings), OFFSET_OF (EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE,NumberOfIdMappings), L"%d", NULL, From a9309b6589e0e6c8984c5d80c702d0f22b4fc5fb Mon Sep 17 00:00:00 2001 From: Zhiguang Liu Date: Thu, 4 Dec 2025 11:33:54 +0800 Subject: [PATCH 0901/1172] StandaloneMmPkg: Remove FvLib from StandaloneMmPkg In https://github.com/tianocore/edk2/pull/11658, FvLib is already copied into MdePkg. Signed-off-by: Zhiguang Liu --- StandaloneMmPkg/Include/Library/FvLib.h | 104 ------ StandaloneMmPkg/Library/FvLib/FvLib.c | 405 ------------------------ StandaloneMmPkg/Library/FvLib/FvLib.inf | 52 --- StandaloneMmPkg/StandaloneMmPkg.dec | 3 - StandaloneMmPkg/StandaloneMmPkg.dsc | 2 - 5 files changed, 566 deletions(-) delete mode 100644 StandaloneMmPkg/Include/Library/FvLib.h delete mode 100644 StandaloneMmPkg/Library/FvLib/FvLib.c delete mode 100644 StandaloneMmPkg/Library/FvLib/FvLib.inf diff --git a/StandaloneMmPkg/Include/Library/FvLib.h b/StandaloneMmPkg/Include/Library/FvLib.h deleted file mode 100644 index 3b603e473d19..000000000000 --- a/StandaloneMmPkg/Include/Library/FvLib.h +++ /dev/null @@ -1,104 +0,0 @@ -/** @file - -Copyright (c) 2015, Intel Corporation. All rights reserved.
    -Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
    - -SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#ifndef _FV_LIB_H_ -#define _FV_LIB_H_ - -#include -#include -#include - -/** - Given the input file pointer, search for the next matching file in the - FFS volume as defined by SearchType. The search starts from FileHeader inside - the Firmware Volume defined by FwVolHeader. - - @param SearchType Filter to find only files of this type. - Type EFI_FV_FILETYPE_ALL causes no filtering to be done. - @param FwVolHeader Pointer to the FV header of the volume to search. - This parameter must point to a valid FFS volume. - @param FileHeader Pointer to the current file from which to begin searching. - This pointer will be updated upon return to reflect the file found. - - @retval EFI_NOT_FOUND No files matching the search criteria were found - @retval EFI_SUCCESS -**/ -EFI_STATUS -EFIAPI -FfsFindNextFile ( - IN EFI_FV_FILETYPE SearchType, - IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader, - IN OUT EFI_FFS_FILE_HEADER **FileHeader - ); - -/** - Given the input file pointer, search for the next matching section in the - FFS volume. - - @param SearchType Filter to find only sections of this type. - @param FfsFileHeader Pointer to the current file to search. - @param SectionHeader Pointer to the Section matching SectionType in FfsFileHeader. - NULL if section not found - - @retval EFI_NOT_FOUND No files matching the search criteria were found - @retval EFI_SUCCESS -**/ -EFI_STATUS -EFIAPI -FfsFindSection ( - IN EFI_SECTION_TYPE SectionType, - IN EFI_FFS_FILE_HEADER *FfsFileHeader, - IN OUT EFI_COMMON_SECTION_HEADER **SectionHeader - ); - -/** - Locates a section within a series of sections - with the specified section type. - - @param[in] Sections The sections to search - @param[in] SizeOfSections Total size of all sections - @param[in] SectionType The section type to locate - @param[out] FoundSection The FFS section if found - - @retval EFI_SUCCESS The file and section was found - @retval EFI_NOT_FOUND The file and section was not found - @retval EFI_VOLUME_CORRUPTED The firmware volume was corrupted -**/ -EFI_STATUS -EFIAPI -FindFfsSectionInSections ( - IN VOID *Sections, - IN UINTN SizeOfSections, - IN EFI_SECTION_TYPE SectionType, - OUT EFI_COMMON_SECTION_HEADER **FoundSection - ); - -/** - Given the input file pointer, search for the next matching section in the - FFS volume. - - @param SearchType Filter to find only sections of this type. - @param FfsFileHeader Pointer to the current file to search. - @param SectionData Pointer to the Section matching SectionType in FfsFileHeader. - NULL if section not found - @param SectionDataSize The size of SectionData, excluding the section header. - - @retval EFI_NOT_FOUND No files matching the search criteria were found - @retval EFI_SUCCESS -**/ -EFI_STATUS -EFIAPI -FfsFindSectionData ( - IN EFI_SECTION_TYPE SectionType, - IN EFI_FFS_FILE_HEADER *FfsFileHeader, - OUT VOID **SectionData, - OUT UINTN *SectionDataSize - ); - -#endif diff --git a/StandaloneMmPkg/Library/FvLib/FvLib.c b/StandaloneMmPkg/Library/FvLib/FvLib.c deleted file mode 100644 index 2faa7cd054f7..000000000000 --- a/StandaloneMmPkg/Library/FvLib/FvLib.c +++ /dev/null @@ -1,405 +0,0 @@ -/** @file - -Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.
    -Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
    - -SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include - -#include -#include -#include - -#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \ - (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1)) - -/** - Returns the highest bit set of the State field - - @param ErasePolarity Erase Polarity as defined by EFI_FVB_ERASE_POLARITY - in the Attributes field. - @param FfsHeader Pointer to FFS File Header. - - @return the highest bit in the State field -**/ -EFI_FFS_FILE_STATE -GetFileState ( - IN UINT8 ErasePolarity, - IN EFI_FFS_FILE_HEADER *FfsHeader - ) -{ - EFI_FFS_FILE_STATE FileState; - EFI_FFS_FILE_STATE HighestBit; - - FileState = FfsHeader->State; - - if (ErasePolarity != 0) { - FileState = (EFI_FFS_FILE_STATE) ~FileState; - } - - HighestBit = 0x80; - while (HighestBit != 0 && (HighestBit & FileState) == 0) { - HighestBit >>= 1; - } - - return HighestBit; -} - -/** - Calculates the checksum of the header of a file. - - @param FileHeader Pointer to FFS File Header. - - @return Checksum of the header. -**/ -UINT8 -CalculateHeaderChecksum ( - IN EFI_FFS_FILE_HEADER *FileHeader - ) -{ - UINT8 *ptr; - UINTN Index; - UINT8 Sum; - UINTN Size; - - Sum = 0; - ptr = (UINT8 *)FileHeader; - Size = IS_FFS_FILE2 (FileHeader) ? sizeof (EFI_FFS_FILE_HEADER2) : sizeof (EFI_FFS_FILE_HEADER); - - for (Index = 0; Index < Size - 3; Index += 4) { - Sum = (UINT8)(Sum + ptr[Index]); - Sum = (UINT8)(Sum + ptr[Index + 1]); - Sum = (UINT8)(Sum + ptr[Index + 2]); - Sum = (UINT8)(Sum + ptr[Index + 3]); - } - - for ( ; Index < Size; Index++) { - Sum = (UINT8)(Sum + ptr[Index]); - } - - // - // State field (since this indicates the different state of file). - // - Sum = (UINT8)(Sum - FileHeader->State); - // - // Checksum field of the file is not part of the header checksum. - // - Sum = (UINT8)(Sum - FileHeader->IntegrityCheck.Checksum.File); - - return Sum; -} - -/** - Given the input file pointer, search for the next matching file in the - FFS volume as defined by SearchType. The search starts from FileHeader inside - the Firmware Volume defined by FwVolHeader. - - @param SearchType Filter to find only files of this type. - Type EFI_FV_FILETYPE_ALL causes no filtering to be done. - @param FwVolHeader Pointer to the FV header of the volume to search. - This parameter must point to a valid FFS volume. - @param FileHeader Pointer to the current file from which to begin searching. - This pointer will be updated upon return to reflect the file found. - - @retval EFI_NOT_FOUND No files matching the search criteria were found - @retval EFI_SUCCESS -**/ -EFI_STATUS -EFIAPI -FfsFindNextFile ( - IN EFI_FV_FILETYPE SearchType, - IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader, - IN OUT EFI_FFS_FILE_HEADER **FileHeader - ) -{ - EFI_FIRMWARE_VOLUME_EXT_HEADER *FvExtHeader; - - EFI_FFS_FILE_HEADER *FfsFileHeader; - UINT32 FileLength; - UINT32 FileOccupiedSize; - UINT32 FileOffset; - UINT64 FvLength; - UINT8 ErasePolarity; - UINT8 FileState; - - FvLength = FwVolHeader->FvLength; - if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) { - ErasePolarity = 1; - } else { - ErasePolarity = 0; - } - - // - // If FileHeader is not specified (NULL) start with the first file in the - // firmware volume. Otherwise, start from the FileHeader. - // - if (*FileHeader == NULL) { - if (FwVolHeader->ExtHeaderOffset != 0) { - FvExtHeader = (EFI_FIRMWARE_VOLUME_EXT_HEADER *)((UINT8 *)FwVolHeader + - FwVolHeader->ExtHeaderOffset); - - FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FvExtHeader + - FvExtHeader->ExtHeaderSize); - } else { - FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FwVolHeader + - FwVolHeader->HeaderLength); - } - - FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINTN)FwVolHeader + - ALIGN_VALUE ( - (UINTN)FfsFileHeader - - (UINTN)FwVolHeader, - 8 - )); - } else { - // - // Length is 24 bits wide so mask upper 8 bits - // FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned. - // - FileLength = IS_FFS_FILE2 (*FileHeader) ? - FFS_FILE2_SIZE (*FileHeader) : FFS_FILE_SIZE (*FileHeader); - FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8); - FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)*FileHeader + FileOccupiedSize); - } - - FileOffset = (UINT32)((UINT8 *)FfsFileHeader - (UINT8 *)FwVolHeader); - - while ((UINT64)FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) { - // - // Get FileState which is the highest bit of the State - // - FileState = GetFileState (ErasePolarity, FfsFileHeader); - - switch (FileState) { - case EFI_FILE_HEADER_INVALID: - if (IS_FFS_FILE2 (FfsFileHeader)) { - FileOffset += sizeof (EFI_FFS_FILE_HEADER2); - FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER2)); - } else { - FileOffset += sizeof (EFI_FFS_FILE_HEADER); - FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER)); - } - - break; - - case EFI_FILE_DATA_VALID: - case EFI_FILE_MARKED_FOR_UPDATE: - if (CalculateHeaderChecksum (FfsFileHeader) == 0) { - FileLength = IS_FFS_FILE2 (FfsFileHeader) ? - FFS_FILE2_SIZE (FfsFileHeader) : FFS_FILE_SIZE (FfsFileHeader); - FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8); - - if ((SearchType == FfsFileHeader->Type) || (SearchType == EFI_FV_FILETYPE_ALL)) { - *FileHeader = FfsFileHeader; - - return EFI_SUCCESS; - } - - FileOffset += FileOccupiedSize; - FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize); - } else { - return EFI_NOT_FOUND; - } - - break; - - case EFI_FILE_DELETED: - FileLength = IS_FFS_FILE2 (FfsFileHeader) ? - FFS_FILE2_SIZE (FfsFileHeader) : FFS_FILE_SIZE (FfsFileHeader); - FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8); - FileOffset += FileOccupiedSize; - FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize); - break; - - default: - return EFI_NOT_FOUND; - } - } - - return EFI_NOT_FOUND; -} - -/** - Locates a section within a series of sections - with the specified section type. - - @param[in] Sections The sections to search - @param[in] SizeOfSections Total size of all sections - @param[in] SectionType The section type to locate - @param[out] FoundSection The FFS section if found - - @retval EFI_SUCCESS The file and section was found - @retval EFI_NOT_FOUND The file and section was not found - @retval EFI_VOLUME_CORRUPTED The firmware volume was corrupted -**/ -EFI_STATUS -EFIAPI -FindFfsSectionInSections ( - IN VOID *Sections, - IN UINTN SizeOfSections, - IN EFI_SECTION_TYPE SectionType, - OUT EFI_COMMON_SECTION_HEADER **FoundSection - ) -{ - EFI_PHYSICAL_ADDRESS CurrentAddress; - UINT32 Size; - EFI_PHYSICAL_ADDRESS EndOfSections; - EFI_COMMON_SECTION_HEADER *Section; - EFI_PHYSICAL_ADDRESS EndOfSection; - - // - // Loop through the FFS file sections - // - EndOfSection = (EFI_PHYSICAL_ADDRESS)(UINTN)Sections; - EndOfSections = EndOfSection + SizeOfSections; - for ( ; ;) { - if (EndOfSection == EndOfSections) { - break; - } - - CurrentAddress = EndOfSection; - - Section = (EFI_COMMON_SECTION_HEADER *)(UINTN)CurrentAddress; - - Size = IS_SECTION2 (Section) ? SECTION2_SIZE (Section) : SECTION_SIZE (Section); - if (Size < sizeof (*Section)) { - return EFI_VOLUME_CORRUPTED; - } - - EndOfSection = CurrentAddress + Size; - if (EndOfSection > EndOfSections) { - return EFI_VOLUME_CORRUPTED; - } - - Size = GET_OCCUPIED_SIZE (Size, 4); - - // - // Look for the requested section type - // - if (Section->Type == SectionType) { - *FoundSection = Section; - return EFI_SUCCESS; - } - } - - return EFI_NOT_FOUND; -} - -/** - Given the input file pointer, search for the next matching section in the - FFS volume. - - @param SearchType Filter to find only sections of this type. - @param FfsFileHeader Pointer to the current file to search. - @param SectionHeader Pointer to the Section matching SectionType in FfsFileHeader. - NULL if section not found - - @retval EFI_NOT_FOUND No files matching the search criteria were found - @retval EFI_SUCCESS -**/ -EFI_STATUS -EFIAPI -FfsFindSection ( - IN EFI_SECTION_TYPE SectionType, - IN EFI_FFS_FILE_HEADER *FfsFileHeader, - IN OUT EFI_COMMON_SECTION_HEADER **SectionHeader - ) -{ - UINT32 FileSize; - EFI_COMMON_SECTION_HEADER *Section; - EFI_STATUS Status; - - // - // Size is 24 bits wide so mask upper 8 bits. - // Does not include FfsFileHeader header size - // FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned. - // - if (IS_FFS_FILE2 (FfsFileHeader)) { - Section = (EFI_COMMON_SECTION_HEADER *)((EFI_FFS_FILE_HEADER2 *)FfsFileHeader + 1); - FileSize = FFS_FILE2_SIZE (FfsFileHeader) - sizeof (EFI_FFS_FILE_HEADER2); - } else { - Section = (EFI_COMMON_SECTION_HEADER *)(FfsFileHeader + 1); - FileSize = FFS_FILE_SIZE (FfsFileHeader) - sizeof (EFI_FFS_FILE_HEADER); - } - - Status = FindFfsSectionInSections ( - Section, - FileSize, - SectionType, - SectionHeader - ); - return Status; -} - -/** - Given the input file pointer, search for the next matching section in the - FFS volume. - - @param[in] SectionType Filter to find only sections of this type. - @param[in] FfsFileHeader Pointer to the current file to search. - @param[in,out] SectionData Pointer to the Section matching SectionType in FfsFileHeader. - NULL if section not found - @param[in,out] SectionDataSize The size of SectionData, excluding the section header. - - @retval EFI_NOT_FOUND No files matching the search criteria were found - @retval EFI_SUCCESS -**/ -EFI_STATUS -EFIAPI -FfsFindSectionData ( - IN EFI_SECTION_TYPE SectionType, - IN EFI_FFS_FILE_HEADER *FfsFileHeader, - IN OUT VOID **SectionData, - IN OUT UINTN *SectionDataSize - ) -{ - UINT32 FileSize; - EFI_COMMON_SECTION_HEADER *Section; - UINT32 SectionLength; - UINT32 ParsedLength; - - // - // Size is 24 bits wide so mask upper 8 bits. - // Does not include FfsFileHeader header size - // FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned. - // - if (IS_FFS_FILE2 (FfsFileHeader)) { - Section = (EFI_COMMON_SECTION_HEADER *)((EFI_FFS_FILE_HEADER2 *)FfsFileHeader + 1); - FileSize = FFS_FILE2_SIZE (FfsFileHeader) - sizeof (EFI_FFS_FILE_HEADER2); - } else { - Section = (EFI_COMMON_SECTION_HEADER *)(FfsFileHeader + 1); - FileSize = FFS_FILE_SIZE (FfsFileHeader) - sizeof (EFI_FFS_FILE_HEADER); - } - - *SectionData = NULL; - ParsedLength = 0; - while (ParsedLength < FileSize) { - if (Section->Type == SectionType) { - if (IS_SECTION2 (Section)) { - *SectionData = (VOID *)((EFI_COMMON_SECTION_HEADER2 *)Section + 1); - *SectionDataSize = SECTION2_SIZE (Section) - sizeof (EFI_COMMON_SECTION_HEADER2); - } else { - *SectionData = (VOID *)(Section + 1); - *SectionDataSize = SECTION_SIZE (Section) - sizeof (EFI_COMMON_SECTION_HEADER); - } - - return EFI_SUCCESS; - } - - // - // Size is 24 bits wide so mask upper 8 bits. - // SectionLength is adjusted it is 4 byte aligned. - // Go to the next section - // - SectionLength = IS_SECTION2 (Section) ? SECTION2_SIZE (Section) : SECTION_SIZE (Section); - SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4); - - ParsedLength += SectionLength; - Section = (EFI_COMMON_SECTION_HEADER *)((UINT8 *)Section + SectionLength); - } - - return EFI_NOT_FOUND; -} diff --git a/StandaloneMmPkg/Library/FvLib/FvLib.inf b/StandaloneMmPkg/Library/FvLib/FvLib.inf deleted file mode 100644 index dc942587ec2c..000000000000 --- a/StandaloneMmPkg/Library/FvLib/FvLib.inf +++ /dev/null @@ -1,52 +0,0 @@ -## @file -# -# Copyright (c) 2015, Intel Corporation. All rights reserved.
    -# Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
    -# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -## - -################################################################################ -# -# Defines Section - statements that will be processed to create a Makefile. -# -################################################################################ -[Defines] - INF_VERSION = 0x0001001A - BASE_NAME = FvLib - FILE_GUID = C20085E9-E3AB-4938-A727-C10935FEEE2B - MODULE_TYPE = BASE - VERSION_STRING = 1.0 - LIBRARY_CLASS = FvLib - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 -# - -################################################################################ -# -# Sources Section - list of files that are required for the build to succeed. -# -################################################################################ - -[Sources] - FvLib.c - -################################################################################ -# -# Package Dependency Section - list of Package files that are required for -# this module. -# -################################################################################ - -[Packages] - MdePkg/MdePkg.dec - StandaloneMmPkg/StandaloneMmPkg.dec - -[LibraryClasses] - BaseLib - BaseMemoryLib - DebugLib diff --git a/StandaloneMmPkg/StandaloneMmPkg.dec b/StandaloneMmPkg/StandaloneMmPkg.dec index 03ccaca67796..27605d099369 100644 --- a/StandaloneMmPkg/StandaloneMmPkg.dec +++ b/StandaloneMmPkg/StandaloneMmPkg.dec @@ -20,9 +20,6 @@ [LibraryClasses] - ## @libraryclass Defines a set of helper methods. - FvLib|Include/Library/FvLib.h - ## @libraryclass Defines a set of interfaces that provides services for ## MM Memory Operation. MemLib|Include/Library/StandaloneMmMemLib.h diff --git a/StandaloneMmPkg/StandaloneMmPkg.dsc b/StandaloneMmPkg/StandaloneMmPkg.dsc index 99d056f92c07..155000669bc4 100644 --- a/StandaloneMmPkg/StandaloneMmPkg.dsc +++ b/StandaloneMmPkg/StandaloneMmPkg.dsc @@ -45,7 +45,6 @@ DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf ExtractGuidedSectionLib|StandaloneMmPkg/Library/StandaloneMmExtractGuidedSectionLib/StandaloneMmExtractGuidedSectionLib.inf - FvLib|StandaloneMmPkg/Library/FvLib/FvLib.inf HobLib|StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.inf IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf MemLib|StandaloneMmPkg/Library/StandaloneMmMemLib/StandaloneMmMemLib.inf @@ -139,7 +138,6 @@ # MM Core # StandaloneMmPkg/Core/StandaloneMmCore.inf - StandaloneMmPkg/Library/FvLib/FvLib.inf StandaloneMmPkg/Library/StandaloneMmCoreHobLib/StandaloneMmCoreHobLib.inf StandaloneMmPkg/Library/StandaloneMmCoreMemoryAllocationLib/StandaloneMmCoreMemoryAllocationLib.inf StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.inf From 0917ddad25294095145fd7263aa70c2d5f5ecec3 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 19 Nov 2025 08:02:18 +0100 Subject: [PATCH 0902/1172] OvmfPkg/EmuVariableFvbRuntimeDxe: avoid accessing varstore header with cmp Use explicit MmioReadXX() calls to enforce use of instructions supported by #VC exception handler emulator. Does also work in case the varstore header is located in RAM or ROM because x86 has no special mmio instructions and non-x86 architectures do not use this code. Signed-off-by: Gerd Hoffmann --- OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c b/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c index 1e4ea0d556ea..66e3929ec819 100644 --- a/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c +++ b/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c @@ -26,6 +26,7 @@ #include #include #include +#include #include "Fvb.h" #define EFI_AUTHENTICATED_VARIABLE_GUID \ @@ -572,10 +573,10 @@ ValidateFvHeader ( // Length of FvBlock cannot be 2**64-1 // HeaderLength cannot be an odd number // - if ((FwVolHeader->Revision != EFI_FVH_REVISION) || - (FwVolHeader->Signature != EFI_FVH_SIGNATURE) || - (FwVolHeader->FvLength != EMU_FVB_SIZE) || - (FwVolHeader->HeaderLength != EMU_FV_HEADER_LENGTH) + if ((MmioRead8 ((UINTN)(&FwVolHeader->Revision)) != EFI_FVH_REVISION) || + (MmioRead32 ((UINTN)(&FwVolHeader->Signature)) != EFI_FVH_SIGNATURE) || + (MmioRead64 ((UINTN)(&FwVolHeader->FvLength)) != EMU_FVB_SIZE) || + (MmioRead16 ((UINTN)(&FwVolHeader->HeaderLength)) != EMU_FV_HEADER_LENGTH) ) { DEBUG ((DEBUG_INFO, "EMU Variable FVB: Basic FV headers were invalid\n")); From 4ff51f3780f92f66c995e276fea8b49f5a02b889 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 3 Dec 2025 10:40:11 +0100 Subject: [PATCH 0903/1172] OvmfPkg/MemDebugLogLib: use AcquireSpinLockOrFail Drop log lines if we can't get the spin lock. Not nice, but better than risking a deadlock. Some background: Most of edk2 runs single-threaded on the BSP, so if something holds the lock it is rather unlikely that waiting is going to help. Specifically I think a deadlock can happen if (a) a timer interrupt arrives while the lock is held, and (b) some higher-TPL timer handler tries to print something to the debug log. Signed-off-by: Gerd Hoffmann --- OvmfPkg/Library/MemDebugLogLib/MemDebugLogCommon.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogCommon.c b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogCommon.c index 8c9ce61cb6d2..b737cb0f709b 100644 --- a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogCommon.c +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogCommon.c @@ -29,12 +29,12 @@ MemDebugLogLockInit ( } STATIC -VOID +BOOLEAN MemDebugLogLockAcquire ( IN volatile UINT64 *MemDebugLogLock ) { - AcquireSpinLock ((SPIN_LOCK *)MemDebugLogLock); + return AcquireSpinLockOrFail ((SPIN_LOCK *)MemDebugLogLock); } STATIC @@ -90,7 +90,9 @@ MemDebugLogWriteBuffer ( return EFI_INVALID_PARAMETER; } - MemDebugLogLockAcquire (MemDebugLogLock); + if (!MemDebugLogLockAcquire (MemDebugLogLock)) { + return EFI_NOT_READY; + } BufStart = (CHAR8 *)(UINTN)(MemDebugLogBufAddr + MemDebugLogHdr->HeaderSize); BufEnd = (CHAR8 *)(UINTN)(MemDebugLogBufAddr + MemDebugLogHdr->HeaderSize + MemDebugLogHdr->DebugLogSize) - 1; From faa0ebc839745f63c4f4948230fa17401f8b46f1 Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Wed, 26 Nov 2025 11:57:03 -0800 Subject: [PATCH 0904/1172] MdeModulePkg: Fix regressions from 11686, 11687, 11688, 11689. 11686, 11687, 11688, 11689 included some inverted conditionals during the refactor. While the system booted, some behavior was incorrect based on the inverted conditionals. Signed-off-by: Aaron Pop --- .../Universal/DisplayEngineDxe/FormDisplay.c | 8 ++--- .../Universal/DisplayEngineDxe/InputHandler.c | 2 +- .../Universal/EbcDxe/EbcDebugger/EdbSymbol.c | 3 +- .../Universal/HiiDatabaseDxe/Database.c | 5 +++- .../PlatDriOverrideDxe.c | 1 - .../PlatDriOverrideLib.c | 4 +-- .../Universal/SetupBrowserDxe/Expression.c | 29 ++++++++++++------- .../Universal/SetupBrowserDxe/IfrParse.c | 3 +- .../Universal/SetupBrowserDxe/Presentation.c | 5 +++- .../Universal/SetupBrowserDxe/Setup.c | 6 ++-- 10 files changed, 40 insertions(+), 26 deletions(-) diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c index d19b7ddb87eb..950570368b9f 100644 --- a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c +++ b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c @@ -3269,7 +3269,7 @@ UiDisplayMenu ( // If the screen has no menu items, and the user didn't select UiReset // ignore the selection and go back to reading keys. // - if (MenuOption != NULL ) { + if (MenuOption == NULL ) { ASSERT (MenuOption != NULL); break; } @@ -3324,7 +3324,7 @@ UiDisplayMenu ( break; } - if (MenuOption != NULL) { + if (MenuOption == NULL) { ASSERT (MenuOption != NULL); break; } @@ -3413,7 +3413,7 @@ UiDisplayMenu ( case CfUiSelect: ControlFlag = CfRepaint; - if (MenuOption != NULL ) { + if (MenuOption == NULL ) { ASSERT (MenuOption != NULL); break; } @@ -3472,7 +3472,7 @@ UiDisplayMenu ( case CfUiHotKey: ControlFlag = CfRepaint; - if (HotKey != NULL ) { + if (HotKey == NULL ) { ASSERT (HotKey != NULL); break; } diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c b/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c index aee82f0518c9..b3ba0a7eae05 100644 --- a/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c +++ b/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c @@ -1717,7 +1717,7 @@ GetSelectionInputPopUp ( gUserInput->InputValue.BufferLen = Question->CurrentValue.BufferLen; } } else { - if (CurrentOption != NULL) { + if (CurrentOption == NULL) { ASSERT (CurrentOption != NULL); break; } diff --git a/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSymbol.c b/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSymbol.c index f6a9125c9d74..de223d4dbc6d 100644 --- a/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSymbol.c +++ b/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSymbol.c @@ -1268,7 +1268,8 @@ EdbLoadCodBySymbolByIec ( // get function name, function name is followed by char 0x09. // FieldBuffer = AsciiStrGetNewTokenField (LineBuffer, Char); - if (FieldBuffer != NULL) { + if (FieldBuffer == NULL) { + ASSERT (FieldBuffer != NULL); break; } diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c b/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c index 69e82638d973..d2ac258015d1 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c @@ -1085,7 +1085,10 @@ UpdateDefaultSettingInFormPackage ( // if (EfiVarStoreIndex < EfiVarStoreNumber) { for (Index = 0; Index < DefaultIdNumber; Index++) { - if (DefaultIdList != NULL) { + if (DefaultIdList == NULL) { + ASSERT (DefaultIdList != NULL); + break; + } else { if (DefaultIdList[Index] == EFI_HII_DEFAULT_CLASS_STANDARD) { Status = FindQuestionDefaultSetting (EFI_HII_DEFAULT_CLASS_STANDARD, EfiVarStoreList[EfiVarStoreIndex], IfrQuestionHdr, &IfrValue, Width, QuestionReferBitField); if (!EFI_ERROR (Status)) { diff --git a/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideDxe.c b/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideDxe.c index caf3cf8dea46..eaf7a2b02855 100644 --- a/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideDxe.c +++ b/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideDxe.c @@ -1232,7 +1232,6 @@ PlatOverMngrExtractConfig ( Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); ConfigRequest = AllocateZeroPool (Size); if (ConfigRequest == NULL) { - ASSERT (ConfigRequest != NULL); FreePool (ConfigRequestHdr); return EFI_OUT_OF_RESOURCES; } diff --git a/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideLib.c b/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideLib.c index 9b79aea9758e..17cbe0acd262 100644 --- a/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideLib.c +++ b/MdeModulePkg/Universal/PlatformDriOverrideDxe/PlatDriOverrideLib.c @@ -361,9 +361,6 @@ UpdateFvFileDevicePath ( // Build the shell device path // NewDevicePath = DevicePathFromHandle (FoundFvHandle); - if (NewDevicePath != NULL) { - return EFI_NOT_FOUND; - } EfiInitializeFwVolDevicepathNode (&FvFileNode, FileGuid); NewDevicePath = AppendDevicePathNode (NewDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&FvFileNode); @@ -1939,6 +1936,7 @@ DeleteDriverImage ( } if (!Found) { + ASSERT (Found); goto Exit; } diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c b/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c index 0de5eef6f18c..90ed2bb113d8 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c @@ -2289,14 +2289,19 @@ CompareHiiValue ( // Take types(date, time, ref, buffer) as buffer // if (IsTypeInBuffer (Value1) && IsTypeInBuffer (Value2)) { - Buf1 = GetBufferForValue (Value1); + Buf1 = GetBufferForValue (Value1); + if (Buf1 == NULL) { + return EFI_INVALID_PARAMETER; + } + Buf1Len = GetLengthForValue (Value1); Buf2 = GetBufferForValue (Value2); - Buf2Len = GetLengthForValue (Value2); - if ((Buf1 == NULL) || (Buf2 == NULL)) { + if (Buf2 == NULL) { return EFI_INVALID_PARAMETER; } + Buf2Len = GetLengthForValue (Value2); + Len = Buf1Len > Buf2Len ? Buf2Len : Buf1Len; *Result = CompareMem (Buf1, Buf2, Len); if ((*Result == 0) && (Buf1Len != Buf2Len)) { @@ -2543,16 +2548,20 @@ GetQuestionValueFromForm ( // // Get the question value. // - if (Question != NULL) { - Status = GetQuestionValue (FormSet, Form, Question, GetSetValueWithEditBuffer); - if (EFI_ERROR (Status)) { - GetTheVal = FALSE; - goto Done; - } + if (Question == NULL) { + ASSERT (Question != NULL); + GetTheVal = FALSE; + goto Done; + } - CopyMem (Value, &Question->HiiValue, sizeof (EFI_HII_VALUE)); + Status = GetQuestionValue (FormSet, Form, Question, GetSetValueWithEditBuffer); + if (EFI_ERROR (Status)) { + GetTheVal = FALSE; + goto Done; } + CopyMem (Value, &Question->HiiValue, sizeof (EFI_HII_VALUE)); + Done: // // Clean the formset structure and restore the global parameter. diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c b/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c index aec12c2c38fc..d4c18bfa6df2 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c @@ -2454,7 +2454,8 @@ ParseOpCodes ( // // Insert to Option list of current Question // - if (ParentStatement != NULL) { + if (ParentStatement == NULL) { + ASSERT (ParentStatement != NULL); break; } diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c b/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c index adfd8cb1ff81..05163b2cf20c 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c @@ -1642,7 +1642,10 @@ ProcessUserInput ( if (UserInput->Action != 0) { Status = ProcessAction (UserInput->Action, UserInput->DefaultId); gCurrentSelection->Statement = NULL; - } else if (Statement != NULL) { + } else if (Statement == NULL) { + ASSERT (Statement != NULL); + return EFI_NOT_FOUND; + } else { gCurrentSelection->Statement = Statement; switch (Statement->Operand) { case EFI_IFR_REF_OP: diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c index f56b0cd20e73..f57421cd74d7 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c @@ -363,7 +363,7 @@ LoadAllHiiFormset ( // Initilize FormSet Setting // LocalFormSet = AllocateZeroPool (sizeof (FORM_BROWSER_FORMSET)); - if (LocalFormSet != NULL ) { + if (LocalFormSet == NULL ) { ASSERT (LocalFormSet != NULL); return; } @@ -3291,7 +3291,7 @@ ConfirmNoSubmitFail ( } StringBuffer = AllocateZeroPool (256 * sizeof (CHAR16)); - if (StringBuffer != NULL) { + if (StringBuffer == NULL) { ASSERT (StringBuffer != NULL); return RetVal; } @@ -4423,7 +4423,7 @@ GetQuestionDefault ( if (!EFI_ERROR (Status)) { if (HiiValue->Type == EFI_IFR_TYPE_STRING) { NewString = GetToken (Question->HiiValue.Value.string, FormSet->HiiHandle); - if (NewString != NULL) { + if (NewString == NULL) { ASSERT (NewString != NULL); return EFI_NOT_FOUND; } From 3f94056b30b1e6949fd4263b594e10609b04096e Mon Sep 17 00:00:00 2001 From: Joey Vagedes Date: Mon, 1 Dec 2025 09:02:31 -0800 Subject: [PATCH 0905/1172] .pytool/SpellCheck: Fix silent cspell run error In the implementation of the SpellCheck prior to this commit, the logic assumed that if it was able to successfully call `cspell --version` to get the version, then any future usage of cspell would work without error. PR #11783 brought to light an issue in this logic where if the node version was too out of date, `cspell` could successfully run `cspell --version` but would hit a runtime error when actually performing a spell check on a package. This ultimetly resulted in cspell not running for any package but still reporting a "Success". This commit updates the error handling logic in the SpellCheck when running cspell to ensure that when cspell error lines were reported, at least one misspelled word must be found. In the scenario where error lines are reported, but no misspelled words were found, we now assume a runtime error occurred in cspell, log it, and fail the plugin. Signed-off-by: Joey Vagedes --- .pytool/Plugin/SpellCheck/SpellCheck.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.pytool/Plugin/SpellCheck/SpellCheck.py b/.pytool/Plugin/SpellCheck/SpellCheck.py index d5408479e7e7..576b7f675bd8 100644 --- a/.pytool/Plugin/SpellCheck/SpellCheck.py +++ b/.pytool/Plugin/SpellCheck/SpellCheck.py @@ -163,12 +163,14 @@ def RunBuildPlugin(self, packagename, Edk2pathObj, pkgconfig, environment, PLM, # result is a list of strings like this # C:\src\sp-edk2\edk2\FmpDevicePkg\FmpDevicePkg.dec:53:9 - Unknown word (Capule) EasyFix = [] + MisspelledWordFound = False results = self._check_spelling(cpsell_paths, config_file_path) for r in results: path, _, word = r.partition(" - Unknown word ") if len(word) == 0: # didn't find pattern continue + MisspelledWordFound = True pathinfo = path.rsplit(":", 2) # remove the line no info if(ignore(pathinfo[0])): # check against ignore list @@ -179,6 +181,14 @@ def RunBuildPlugin(self, packagename, Edk2pathObj, pkgconfig, environment, PLM, EasyFix.append(word.strip().strip("()")) Errors.append(r) + # _check_spelling reported errors lines, but none of them were misspelled words + # This indicates a different kind of error occured, e.g. an error in running cspell + if len(results) > 0 and not MisspelledWordFound: + tc.LogStdError("Error running cspell. See output below:") + tc.LogStdError("\n".join(results)) + tc.SetFailed(f"SpellCheck for {packagename} Failed to run cspell.", "CHECK_FAILED") + return -1 + # Log all errors tc StdError for l in Errors: tc.LogStdError(l.strip()) From ffcea707082f6833864e762f9fe210502bb8de43 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Thu, 4 Dec 2025 19:54:54 -0500 Subject: [PATCH 0906/1172] BaseTools: Update nasm to 2.16.01 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #11842 Updates the nasm ext dep to pick up the following fix: > Fix the invalid use of RELA–type relocations instead of REL–type > relocations when generating DWARF debug information for the elf32 > output format. Signed-off-by: Michael Kubacki --- BaseTools/Bin/nasm_ext_dep.yaml | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/BaseTools/Bin/nasm_ext_dep.yaml b/BaseTools/Bin/nasm_ext_dep.yaml index 56703d4c18e7..a039e8442e7c 100644 --- a/BaseTools/Bin/nasm_ext_dep.yaml +++ b/BaseTools/Bin/nasm_ext_dep.yaml @@ -1,8 +1,16 @@ ## @file -# Download nasm x86 assembler executable tool from a nuget.org package -# - package contains different binaries based on host -# Put on the tool on the path +# Download nasm from a NuGet feed. # +# Note: +# - The NuGet package contains different binaries for different host OSes. +# +# The versioning scheme for this nasm package is as follows: +# +# - Major version of the NuGet package encodes nasm's major and minor version (nasm_major * 10000 + nasm_minor). +# - Minor version represents the nasm revision number. +# - Revision tracks the NuGet package’s own revision (number of pushes). +# +# For example, nasm version 2.16.1 becomes 20016.1.x, where x increments with each push. # # Copyright (c) Microsoft Corporation. # SPDX-License-Identifier: BSD-2-Clause-Patent @@ -12,7 +20,7 @@ "scope": "edk2-build", "type": "nuget", "name": "mu_nasm", - "source": "https://api.nuget.org/v3/index.json", - "version": "2.15.5", + "source": "https://pkgs.dev.azure.com/projectmu/mu/_packaging/Basetools-Binary/nuget/v3/index.json", + "version": "20016.1.1", "flags": ["set_path", "host_specific"] } From 409194be0342608ee0d240decd25c081ade6ecf0 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 3 Dec 2025 08:55:30 +0100 Subject: [PATCH 0907/1172] OvmfPkg/VirtioSerialDxe: drop Get/SetControl logging Left over from development. The messages do not serve much value and spam the logs. Drop them. Signed-off-by: Gerd Hoffmann --- OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c b/OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c index e4a58deff162..0b4c71c7dbf0 100644 --- a/OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c +++ b/OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c @@ -121,7 +121,6 @@ VirtioSerialIoSetControl ( IN UINT32 Control ) { - DEBUG ((DEBUG_INFO, "%a:%d: Control 0x%x\n", __func__, __LINE__, Control)); return EFI_SUCCESS; } @@ -133,7 +132,6 @@ VirtioSerialIoGetControl ( OUT UINT32 *Control ) { - DEBUG ((DEBUG_VERBOSE, "%a:%d: Control 0x%x\n", __func__, __LINE__, *Control)); return EFI_SUCCESS; } From 62d8723eace01567b9f4c902b5464fb00df0b5bd Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 4 Dec 2025 15:01:25 +0100 Subject: [PATCH 0908/1172] OvmfPkg/VirtioSerialDxe: explitly clear return value in GetControl The function does not return any flags. Make that explicit instead of leaving the return value unmodified, so we do not depend on the caller initializing it. Signed-off-by: Gerd Hoffmann --- OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c | 1 + 1 file changed, 1 insertion(+) diff --git a/OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c b/OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c index 0b4c71c7dbf0..bf1eb2cb6b76 100644 --- a/OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c +++ b/OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c @@ -132,6 +132,7 @@ VirtioSerialIoGetControl ( OUT UINT32 *Control ) { + *Control = 0; return EFI_SUCCESS; } From 8b11d8b1cc49374a178e23c3d6b42fca7c803d66 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 4 Dec 2025 21:45:44 +0100 Subject: [PATCH 0909/1172] OvmfPkg/VirtioSerialDxe: factor out VirtioSerialIoWriteFlush Next patch needs this function. No functional change. Signed-off-by: Gerd Hoffmann --- OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c | 41 ++++++++++++++-------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c b/OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c index bf1eb2cb6b76..c8aaf92ce816 100644 --- a/OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c +++ b/OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c @@ -88,6 +88,31 @@ VirtioSerialIoReset ( return EFI_SUCCESS; } +STATIC +VOID +VirtioSerialIoWriteFlush ( + IN EFI_SERIAL_IO_PROTOCOL *This + ) +{ + VIRTIO_SERIAL_IO_PROTOCOL *SerialIo = (VIRTIO_SERIAL_IO_PROTOCOL *)This; + EFI_TPL OldTpl; + + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); + if (SerialIo->WriteOffset) { + DEBUG ((DEBUG_VERBOSE, "%a:%d: WriteFlush %d\n", __func__, __LINE__, SerialIo->WriteOffset)); + VirtioSerialRingSendBuffer ( + SerialIo->Dev, + PortTx (SerialIo->PortId), + SerialIo->WriteBuffer, + SerialIo->WriteOffset, + TRUE + ); + SerialIo->WriteOffset = 0; + } + + gBS->RestoreTPL (OldTpl); +} + STATIC EFI_STATUS EFIAPI @@ -194,26 +219,12 @@ VirtioSerialIoRead ( VIRTIO_SERIAL_PORT *Port = SerialIo->Dev->Ports + SerialIo->PortId; BOOLEAN HasData; UINT32 Length; - EFI_TPL OldTpl; if (!Port->DeviceOpen) { goto NoData; } - OldTpl = gBS->RaiseTPL (TPL_NOTIFY); - if (SerialIo->WriteOffset) { - DEBUG ((DEBUG_VERBOSE, "%a:%d: WriteFlush %d\n", __func__, __LINE__, SerialIo->WriteOffset)); - VirtioSerialRingSendBuffer ( - SerialIo->Dev, - PortTx (SerialIo->PortId), - SerialIo->WriteBuffer, - SerialIo->WriteOffset, - TRUE - ); - SerialIo->WriteOffset = 0; - } - - gBS->RestoreTPL (OldTpl); + VirtioSerialIoWriteFlush (This); if (SerialIo->ReadOffset == SerialIo->ReadSize) { HasData = VirtioSerialRingGetBuffer ( From 471c15b396a3f24fefbc377fe84a5c5f7bc26b1e Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 4 Dec 2025 21:10:41 +0100 Subject: [PATCH 0910/1172] OvmfPkg/VirtioSerialDxe: set EFI_SERIAL_INPUT_BUFFER_EMPTY Check if there is data available for read, set the EFI_SERIAL_INPUT_BUFFER_EMPTY flag accordingly. With proper status returned VirtioSerialIoRead() will only be called if there is actual data to read, so we must call VirtioSerialIoWriteFlush() to make sure pending writes get flushed to the host properly. Signed-off-by: Gerd Hoffmann --- OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c b/OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c index c8aaf92ce816..d39e68c68ef7 100644 --- a/OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c +++ b/OvmfPkg/VirtioSerialDxe/VirtioSerialPort.c @@ -157,7 +157,29 @@ VirtioSerialIoGetControl ( OUT UINT32 *Control ) { + VIRTIO_SERIAL_IO_PROTOCOL *SerialIo = (VIRTIO_SERIAL_IO_PROTOCOL *)This; + BOOLEAN HaveData = FALSE; + + VirtioSerialIoWriteFlush (This); + *Control = 0; + + if (SerialIo->ReadOffset < SerialIo->ReadSize) { + // have unread data in current buffer + HaveData = TRUE; + } else if (VirtioSerialRingHasBuffer ( + SerialIo->Dev, + PortRx (SerialIo->PortId) + )) + { + // have unread buffers in rx ring + HaveData = TRUE; + } + + if (!HaveData) { + *Control |= EFI_SERIAL_INPUT_BUFFER_EMPTY; + } + return EFI_SUCCESS; } From 741ef9cec35fe392c8846aa428a9070895e6bc46 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Sat, 6 Dec 2025 20:25:47 +0100 Subject: [PATCH 0911/1172] MdePkg/UefiLib: Use CompareMem() to compare ISO639 language codes ISO 639-3 language codes are 3 letter abbreviations that identify natural languages. Comparing them for equality involves performing a byte by byte check, without taking case into account. So use CompareMem() rather than the peculiar ReadUnaligned24 () API, given that we are not dealing with 24-bit integers here. Signed-off-by: Ard Biesheuvel --- MdePkg/Library/UefiLib/UefiLib.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/MdePkg/Library/UefiLib/UefiLib.c b/MdePkg/Library/UefiLib/UefiLib.c index 95d0319d3a33..debb176ea3b9 100644 --- a/MdePkg/Library/UefiLib/UefiLib.c +++ b/MdePkg/Library/UefiLib/UefiLib.c @@ -12,6 +12,8 @@ #include "UefiLibInternal.h" +#define ISO_639_3_LANG_CODE_LEN 3 + /** Empty constructor function that is required to resolve dependencies between libraries. @@ -50,13 +52,7 @@ CompareIso639LanguageCode ( IN CONST CHAR8 *Language2 ) { - UINT32 Name1; - UINT32 Name2; - - Name1 = ReadUnaligned24 ((CONST UINT32 *)Language1); - Name2 = ReadUnaligned24 ((CONST UINT32 *)Language2); - - return (BOOLEAN)(Name1 == Name2); + return (CompareMem (Language1, Language2, ISO_639_3_LANG_CODE_LEN) == 0); } /** From 2ba7e5be6cc6b83d5d4ce67d3225e87466c4ecf7 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Fri, 5 Dec 2025 16:22:53 +0100 Subject: [PATCH 0912/1172] MdePkg/BaseLib: Avoid undefined behavior in Unaligned() accessors The C standard qualifies misaligned pointers as undefined behavior. This means it is fundamentally impossible to define a conformant C API for unaligned access that is expressed in terms of types with a minimum alignment greater than 1 byte. Undefined behavior means that the compiler is free to generate code that assumes that only the defined behavior occurs. This means that a C implementation of ReadUnaligned64() might be emitted using a 64-bit load operation that does not tolerate misalignment, depending on the CPU architecture. So the only correct way to define such an API is in terms of types such as VOID* that have no implied alignment. Then, given that compilers today are perfectly capable of generating the right code, given accurate annotations, let's rely on those in the generic implementation. This will ensure that the correct access sequences are used, depending on the CPU architecture, and on the compiler flags (e.g., AArch64 uses -mstrict-align in XIP code as it may execute with the MMU disabled). Signed-off-by: Ard Biesheuvel --- MdePkg/Include/Library/BaseLib.h | 16 +++++------ MdePkg/Library/BaseLib/Unaligned.c | 45 +++++++++++++++++++----------- 2 files changed, 36 insertions(+), 25 deletions(-) diff --git a/MdePkg/Include/Library/BaseLib.h b/MdePkg/Include/Library/BaseLib.h index aab802a0991e..800b918aebeb 100644 --- a/MdePkg/Include/Library/BaseLib.h +++ b/MdePkg/Include/Library/BaseLib.h @@ -3839,7 +3839,7 @@ DivS64x64Remainder ( UINT16 EFIAPI ReadUnaligned16 ( - IN CONST UINT16 *Buffer + IN CONST VOID *Buffer ); /** @@ -3860,7 +3860,7 @@ ReadUnaligned16 ( UINT16 EFIAPI WriteUnaligned16 ( - OUT UINT16 *Buffer, + OUT VOID *Buffer, IN UINT16 Value ); @@ -3880,7 +3880,7 @@ WriteUnaligned16 ( UINT32 EFIAPI ReadUnaligned24 ( - IN CONST UINT32 *Buffer + IN CONST VOID *Buffer ); /** @@ -3901,7 +3901,7 @@ ReadUnaligned24 ( UINT32 EFIAPI WriteUnaligned24 ( - OUT UINT32 *Buffer, + OUT VOID *Buffer, IN UINT32 Value ); @@ -3921,7 +3921,7 @@ WriteUnaligned24 ( UINT32 EFIAPI ReadUnaligned32 ( - IN CONST UINT32 *Buffer + IN CONST VOID *Buffer ); /** @@ -3942,7 +3942,7 @@ ReadUnaligned32 ( UINT32 EFIAPI WriteUnaligned32 ( - OUT UINT32 *Buffer, + OUT VOID *Buffer, IN UINT32 Value ); @@ -3962,7 +3962,7 @@ WriteUnaligned32 ( UINT64 EFIAPI ReadUnaligned64 ( - IN CONST UINT64 *Buffer + IN CONST VOID *Buffer ); /** @@ -3983,7 +3983,7 @@ ReadUnaligned64 ( UINT64 EFIAPI WriteUnaligned64 ( - OUT UINT64 *Buffer, + OUT VOID *Buffer, IN UINT64 Value ); diff --git a/MdePkg/Library/BaseLib/Unaligned.c b/MdePkg/Library/BaseLib/Unaligned.c index 74d76e831698..efb793852f45 100644 --- a/MdePkg/Library/BaseLib/Unaligned.c +++ b/MdePkg/Library/BaseLib/Unaligned.c @@ -8,6 +8,16 @@ #include "BaseLibInternals.h" +#pragma pack(1) +typedef union { + UINT16 Val16; + UINT32 Val32; + UINT64 Val64; +} MISALIGNED; +#pragma pack() + +STATIC_ASSERT (ALIGNOF (MISALIGNED) == 1, "Alignment error"); + /** Reads a 16-bit value from memory that may be unaligned. @@ -24,12 +34,12 @@ UINT16 EFIAPI ReadUnaligned16 ( - IN CONST UINT16 *Buffer + IN CONST VOID *Buffer ) { ASSERT (Buffer != NULL); - return *Buffer; + return ((CONST MISALIGNED *)Buffer)->Val16; } /** @@ -50,13 +60,13 @@ ReadUnaligned16 ( UINT16 EFIAPI WriteUnaligned16 ( - OUT UINT16 *Buffer, + OUT VOID *Buffer, IN UINT16 Value ) { ASSERT (Buffer != NULL); - return *Buffer = Value; + return ((MISALIGNED *)Buffer)->Val16 = Value; } /** @@ -75,12 +85,12 @@ WriteUnaligned16 ( UINT32 EFIAPI ReadUnaligned24 ( - IN CONST UINT32 *Buffer + IN CONST VOID *Buffer ) { ASSERT (Buffer != NULL); - return *Buffer & 0xffffff; + return ((UINT32)((UINT8 *)Buffer)[2] << 16) | ReadUnaligned16 (Buffer); } /** @@ -101,14 +111,15 @@ ReadUnaligned24 ( UINT32 EFIAPI WriteUnaligned24 ( - OUT UINT32 *Buffer, + OUT VOID *Buffer, IN UINT32 Value ) { ASSERT (Buffer != NULL); - *Buffer = BitFieldWrite32 (*Buffer, 0, 23, Value); - return Value; + WriteUnaligned16 (Buffer, (UINT16)Value); + ((UINT8 *)Buffer)[2] = (UINT8)(Value >> 16); + return Value & 0xffffff; } /** @@ -127,12 +138,12 @@ WriteUnaligned24 ( UINT32 EFIAPI ReadUnaligned32 ( - IN CONST UINT32 *Buffer + IN CONST VOID *Buffer ) { ASSERT (Buffer != NULL); - return *Buffer; + return ((CONST MISALIGNED *)Buffer)->Val32; } /** @@ -153,13 +164,13 @@ ReadUnaligned32 ( UINT32 EFIAPI WriteUnaligned32 ( - OUT UINT32 *Buffer, + OUT VOID *Buffer, IN UINT32 Value ) { ASSERT (Buffer != NULL); - return *Buffer = Value; + return ((MISALIGNED *)Buffer)->Val32 = Value; } /** @@ -178,12 +189,12 @@ WriteUnaligned32 ( UINT64 EFIAPI ReadUnaligned64 ( - IN CONST UINT64 *Buffer + IN CONST VOID *Buffer ) { ASSERT (Buffer != NULL); - return *Buffer; + return ((CONST MISALIGNED *)Buffer)->Val64; } /** @@ -204,11 +215,11 @@ ReadUnaligned64 ( UINT64 EFIAPI WriteUnaligned64 ( - OUT UINT64 *Buffer, + OUT VOID *Buffer, IN UINT64 Value ) { ASSERT (Buffer != NULL); - return *Buffer = Value; + return ((MISALIGNED *)Buffer)->Val64 = Value; } From 3e7107c7da655b0b65425ba99f066366b5b7a230 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Fri, 5 Dec 2025 16:32:31 +0100 Subject: [PATCH 0913/1172] MdePkg/BaseLib AARCH64: Drop special Unaligned.c version Now that the generic code takes alignment constraints into account, there is no longer a need for a special AArch64 version that performs byte by byte access in C. Signed-off-by: Ard Biesheuvel --- MdePkg/Library/BaseLib/AArch64/Unaligned.c | 246 --------------------- MdePkg/Library/BaseLib/BaseLib.inf | 7 +- 2 files changed, 1 insertion(+), 252 deletions(-) delete mode 100644 MdePkg/Library/BaseLib/AArch64/Unaligned.c diff --git a/MdePkg/Library/BaseLib/AArch64/Unaligned.c b/MdePkg/Library/BaseLib/AArch64/Unaligned.c deleted file mode 100644 index 73b7a78f5b5e..000000000000 --- a/MdePkg/Library/BaseLib/AArch64/Unaligned.c +++ /dev/null @@ -1,246 +0,0 @@ -/** @file - Unaligned access functions of BaseLib for ARM. - - volatile was added to work around optimization issues. - - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
    - Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
    - SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include "BaseLibInternals.h" - -/** - Reads a 16-bit value from memory that may be unaligned. - - This function returns the 16-bit value pointed to by Buffer. The function - guarantees that the read operation does not produce an alignment fault. - - If the Buffer is NULL, then ASSERT(). - - @param Buffer The pointer to a 16-bit value that may be unaligned. - - @return The 16-bit value read from Buffer. - -**/ -UINT16 -EFIAPI -ReadUnaligned16 ( - IN CONST UINT16 *Buffer - ) -{ - volatile UINT8 LowerByte; - volatile UINT8 HigherByte; - - ASSERT (Buffer != NULL); - - LowerByte = ((UINT8 *)Buffer)[0]; - HigherByte = ((UINT8 *)Buffer)[1]; - - return (UINT16)(LowerByte | (HigherByte << 8)); -} - -/** - Writes a 16-bit value to memory that may be unaligned. - - This function writes the 16-bit value specified by Value to Buffer. Value is - returned. The function guarantees that the write operation does not produce - an alignment fault. - - If the Buffer is NULL, then ASSERT(). - - @param Buffer The pointer to a 16-bit value that may be unaligned. - @param Value 16-bit value to write to Buffer. - - @return The 16-bit value to write to Buffer. - -**/ -UINT16 -EFIAPI -WriteUnaligned16 ( - OUT UINT16 *Buffer, - IN UINT16 Value - ) -{ - ASSERT (Buffer != NULL); - - ((volatile UINT8 *)Buffer)[0] = (UINT8)Value; - ((volatile UINT8 *)Buffer)[1] = (UINT8)(Value >> 8); - - return Value; -} - -/** - Reads a 24-bit value from memory that may be unaligned. - - This function returns the 24-bit value pointed to by Buffer. The function - guarantees that the read operation does not produce an alignment fault. - - If the Buffer is NULL, then ASSERT(). - - @param Buffer The pointer to a 24-bit value that may be unaligned. - - @return The 24-bit value read from Buffer. - -**/ -UINT32 -EFIAPI -ReadUnaligned24 ( - IN CONST UINT32 *Buffer - ) -{ - ASSERT (Buffer != NULL); - - return (UINT32)( - ReadUnaligned16 ((UINT16 *)Buffer) | - (((UINT8 *)Buffer)[2] << 16) - ); -} - -/** - Writes a 24-bit value to memory that may be unaligned. - - This function writes the 24-bit value specified by Value to Buffer. Value is - returned. The function guarantees that the write operation does not produce - an alignment fault. - - If the Buffer is NULL, then ASSERT(). - - @param Buffer The pointer to a 24-bit value that may be unaligned. - @param Value 24-bit value to write to Buffer. - - @return The 24-bit value to write to Buffer. - -**/ -UINT32 -EFIAPI -WriteUnaligned24 ( - OUT UINT32 *Buffer, - IN UINT32 Value - ) -{ - ASSERT (Buffer != NULL); - - WriteUnaligned16 ((UINT16 *)Buffer, (UINT16)Value); - *(UINT8 *)((UINT16 *)Buffer + 1) = (UINT8)(Value >> 16); - return Value; -} - -/** - Reads a 32-bit value from memory that may be unaligned. - - This function returns the 32-bit value pointed to by Buffer. The function - guarantees that the read operation does not produce an alignment fault. - - If the Buffer is NULL, then ASSERT(). - - @param Buffer The pointer to a 32-bit value that may be unaligned. - - @return The 32-bit value read from Buffer. - -**/ -UINT32 -EFIAPI -ReadUnaligned32 ( - IN CONST UINT32 *Buffer - ) -{ - UINT16 LowerBytes; - UINT16 HigherBytes; - - ASSERT (Buffer != NULL); - - LowerBytes = ReadUnaligned16 ((UINT16 *)Buffer); - HigherBytes = ReadUnaligned16 ((UINT16 *)Buffer + 1); - - return (UINT32)(LowerBytes | (HigherBytes << 16)); -} - -/** - Writes a 32-bit value to memory that may be unaligned. - - This function writes the 32-bit value specified by Value to Buffer. Value is - returned. The function guarantees that the write operation does not produce - an alignment fault. - - If the Buffer is NULL, then ASSERT(). - - @param Buffer The pointer to a 32-bit value that may be unaligned. - @param Value 32-bit value to write to Buffer. - - @return The 32-bit value to write to Buffer. - -**/ -UINT32 -EFIAPI -WriteUnaligned32 ( - OUT UINT32 *Buffer, - IN UINT32 Value - ) -{ - ASSERT (Buffer != NULL); - - WriteUnaligned16 ((UINT16 *)Buffer, (UINT16)Value); - WriteUnaligned16 ((UINT16 *)Buffer + 1, (UINT16)(Value >> 16)); - return Value; -} - -/** - Reads a 64-bit value from memory that may be unaligned. - - This function returns the 64-bit value pointed to by Buffer. The function - guarantees that the read operation does not produce an alignment fault. - - If the Buffer is NULL, then ASSERT(). - - @param Buffer The pointer to a 64-bit value that may be unaligned. - - @return The 64-bit value read from Buffer. - -**/ -UINT64 -EFIAPI -ReadUnaligned64 ( - IN CONST UINT64 *Buffer - ) -{ - UINT32 LowerBytes; - UINT32 HigherBytes; - - ASSERT (Buffer != NULL); - - LowerBytes = ReadUnaligned32 ((UINT32 *)Buffer); - HigherBytes = ReadUnaligned32 ((UINT32 *)Buffer + 1); - - return (UINT64)(LowerBytes | LShiftU64 (HigherBytes, 32)); -} - -/** - Writes a 64-bit value to memory that may be unaligned. - - This function writes the 64-bit value specified by Value to Buffer. Value is - returned. The function guarantees that the write operation does not produce - an alignment fault. - - If the Buffer is NULL, then ASSERT(). - - @param Buffer The pointer to a 64-bit value that may be unaligned. - @param Value 64-bit value to write to Buffer. - - @return The 64-bit value to write to Buffer. - -**/ -UINT64 -EFIAPI -WriteUnaligned64 ( - OUT UINT64 *Buffer, - IN UINT64 Value - ) -{ - ASSERT (Buffer != NULL); - - WriteUnaligned32 ((UINT32 *)Buffer, (UINT32)Value); - WriteUnaligned32 ((UINT32 *)Buffer + 1, (UINT32)RShiftU64 (Value, 32)); - return Value; -} diff --git a/MdePkg/Library/BaseLib/BaseLib.inf b/MdePkg/Library/BaseLib/BaseLib.inf index aa067a77a5f4..b4d3d084a95f 100644 --- a/MdePkg/Library/BaseLib/BaseLib.inf +++ b/MdePkg/Library/BaseLib/BaseLib.inf @@ -61,6 +61,7 @@ LinkedList.c SafeString.c String.c + Unaligned.c FilePaths.c BaseLibInternals.h @@ -194,7 +195,6 @@ Ia32/InternalSwitchStack.c | MSFT Ia32/InternalSwitchStack.nasm | GCC Ia32/Non-existing.c - Unaligned.c X86WriteIdtr.c X86WriteGdtr.c X86Thunk.c @@ -304,7 +304,6 @@ X64/Non-existing.c Math64.c - Unaligned.c X86WriteIdtr.c X86WriteGdtr.c X86Thunk.c @@ -339,14 +338,12 @@ Ebc/SetJumpLongJump.c Ebc/SwitchStack.c Ebc/SpeculationBarrier.c - Unaligned.c Math64.c IntelTdxNull.c AmdSevNull.c [Sources.AARCH64] AArch64/InternalSwitchStack.c - AArch64/Unaligned.c Math64.c AArch64/MemoryFence.S | GCC @@ -375,7 +372,6 @@ [Sources.RISCV64] Math64.c - Unaligned.c RiscV64/InternalSwitchStack.c RiscV64/CpuBreakpoint.c RiscV64/GetInterruptState.c @@ -398,7 +394,6 @@ [Sources.LOONGARCH64] Math64.c - Unaligned.c LoongArch64/Csr.c LoongArch64/InternalSwitchStack.c LoongArch64/AsmCsr.S | GCC From b38fea51eb65b1e7f67a6016d07d6ee05da1c5fd Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Sun, 7 Dec 2025 14:12:20 +0000 Subject: [PATCH 0914/1172] Global: Update CI from GCC5 to GCC Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Mike Beaton --- .azurepipelines/Ubuntu-GCC.yml | 2 +- .azurepipelines/templates/platform-build-run-steps.yml | 2 +- .azurepipelines/templates/pr-gate-build-job.yml | 4 ++-- .azurepipelines/templates/pr-gate-steps.yml | 2 +- ArmVirtPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml | 2 +- BaseTools/Edk2ToolsBuild.py | 8 ++++---- EmulatorPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml | 2 +- OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.azurepipelines/Ubuntu-GCC.yml b/.azurepipelines/Ubuntu-GCC.yml index ff0dfedce622..2472925f3080 100644 --- a/.azurepipelines/Ubuntu-GCC.yml +++ b/.azurepipelines/Ubuntu-GCC.yml @@ -19,7 +19,7 @@ variables: jobs: - template: templates/pr-gate-build-job.yml parameters: - tool_chain_tag: 'GCC5' + tool_chain_tag: GCC vm_image: 'ubuntu-24.04' container: ${{ variables.default_linux_image }} arch_list: "IA32,X64,AARCH64,RISCV64,LOONGARCH64" diff --git a/.azurepipelines/templates/platform-build-run-steps.yml b/.azurepipelines/templates/platform-build-run-steps.yml index 5190cf298cde..d012e10aea19 100644 --- a/.azurepipelines/templates/platform-build-run-steps.yml +++ b/.azurepipelines/templates/platform-build-run-steps.yml @@ -43,7 +43,7 @@ steps: echo "##vso[task.prependpath]${HOME}/.local/bin" echo "new PATH=${PATH}" displayName: Set PATH - condition: eq('${{ parameters.tool_chain_tag }}', 'GCC5') + condition: eq('${{ parameters.tool_chain_tag }}', 'GCC') - checkout: self clean: true diff --git a/.azurepipelines/templates/pr-gate-build-job.yml b/.azurepipelines/templates/pr-gate-build-job.yml index bb098fa695ca..e55cb0b2ca2e 100644 --- a/.azurepipelines/templates/pr-gate-build-job.yml +++ b/.azurepipelines/templates/pr-gate-build-job.yml @@ -24,7 +24,7 @@ jobs: #Use matrix to speed up the build process strategy: matrix: - ${{ if eq(parameters.tool_chain_tag, 'GCC5') }}: + ${{ if eq(parameters.tool_chain_tag, 'GCC') }}: TARGET_GCC_ONLY: Build.Pkgs: 'EmbeddedPkg' Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT' @@ -77,7 +77,7 @@ jobs: Build.Pkgs: 'UefiPayloadPkg' Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT' Build.Archlist: 'IA32,X64' - ${{ if eq(parameters.tool_chain_tag, 'GCC5') }}: + ${{ if eq(parameters.tool_chain_tag, 'GCC') }}: TARGET_UEFIPAYLOAD_AARCH64_GCC_ONLY: Build.Pkgs: 'UefiPayloadPkg' Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT' diff --git a/.azurepipelines/templates/pr-gate-steps.yml b/.azurepipelines/templates/pr-gate-steps.yml index 21bf37ac512a..55eb1ef7e71d 100644 --- a/.azurepipelines/templates/pr-gate-steps.yml +++ b/.azurepipelines/templates/pr-gate-steps.yml @@ -20,7 +20,7 @@ steps: echo "##vso[task.prependpath]${HOME}/.local/bin" echo "new PATH=${PATH}" displayName: Set PATH - condition: eq('${{ parameters.tool_chain_tag }}', 'GCC5') + condition: eq('${{ parameters.tool_chain_tag }}', 'GCC') - checkout: self clean: true diff --git a/ArmVirtPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml b/ArmVirtPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml index b3c7aa12227e..3186ec619a79 100644 --- a/ArmVirtPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml +++ b/ArmVirtPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml @@ -110,7 +110,7 @@ jobs: steps: - template: ../../../.azurepipelines/templates/platform-build-run-steps.yml parameters: - tool_chain_tag: GCC5 + tool_chain_tag: GCC build_pkg: $(package) build_target: $(Build.Target) build_arch: $(Build.Arch) diff --git a/BaseTools/Edk2ToolsBuild.py b/BaseTools/Edk2ToolsBuild.py index f5675a60d959..1490a36a8f04 100644 --- a/BaseTools/Edk2ToolsBuild.py +++ b/BaseTools/Edk2ToolsBuild.py @@ -1,7 +1,7 @@ # @file Edk2ToolsBuild.py # Invocable class that builds the basetool c files. # -# Supports VS2019, VS2022, and GCC5 +# Supports VS2019, VS2022, and GCC ## # Copyright (c) Microsoft Corporation # @@ -254,12 +254,12 @@ def Go(self): shell_env.set_shell_var('HOST_ARCH', self.target_arch) if "AARCH64" in self.target_arch: - prefix = shell_env.get_shell_var("GCC5_AARCH64_PREFIX") + prefix = shell_env.get_shell_var("GCC_AARCH64_PREFIX") if prefix == None: # now check for install dir. If set then set the Prefix - install_path = shell_environment.GetEnvironment().get_shell_var("GCC5_AARCH64_INSTALL") + install_path = shell_environment.GetEnvironment().get_shell_var("GCC_AARCH64_INSTALL") - # make GCC5_AARCH64_PREFIX to align with tools_def.txt + # make GCC_AARCH64_PREFIX to align with tools_def.txt prefix = os.path.join(install_path, "bin", "aarch64-none-linux-gnu-") shell_environment.GetEnvironment().set_shell_var("GCC_PREFIX", prefix) diff --git a/EmulatorPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml b/EmulatorPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml index 21d3aade00c4..5fc297be0b45 100644 --- a/EmulatorPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml +++ b/EmulatorPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml @@ -84,7 +84,7 @@ jobs: steps: - template: ../../../.azurepipelines/templates/platform-build-run-steps.yml parameters: - tool_chain_tag: GCC5 + tool_chain_tag: GCC build_pkg: $(package) build_target: $(Build.Target) build_arch: $(Build.Arch) diff --git a/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml b/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml index d6986910e3db..82eb6062d0a3 100644 --- a/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml +++ b/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml @@ -152,7 +152,7 @@ jobs: steps: - template: ../../../.azurepipelines/templates/platform-build-run-steps.yml parameters: - tool_chain_tag: GCC5 + tool_chain_tag: GCC build_pkg: $(package) build_target: $(Build.Target) build_arch: $(Build.Arch) From c20483b928d9c923d7c5e0a6c321cf32ac13d590 Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Sun, 7 Dec 2025 15:49:53 +0000 Subject: [PATCH 0915/1172] Global: Make additional upgrades from GCC5 to GCC Following on from the previous commit upgrading the CI from GCC5 to GCC, in this commit we make the same upgrade in additional locations where it appears appropriate. Potential candidates discovered by simple `grep -r GCC5` in the project. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Mike Beaton --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- ArmPlatformPkg/Scripts/Makefile | 2 +- EmulatorPkg/build.sh | 2 +- OvmfPkg/build.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index bdacdd8a2abb..a362eacbd30e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -129,7 +129,7 @@ body: description: | Examples: - **OS**: Ubuntu 24.04 or Windows 11... - - **Tool Chain**: GCC5 or VS2022 or CLANGPDB... + - **Tool Chain**: GCC or VS2022 or CLANGPDB... value: | - OS(s): - Tool Chain(s): diff --git a/ArmPlatformPkg/Scripts/Makefile b/ArmPlatformPkg/Scripts/Makefile index 7a903cf0640b..6134c45e1b83 100644 --- a/ArmPlatformPkg/Scripts/Makefile +++ b/ArmPlatformPkg/Scripts/Makefile @@ -5,7 +5,7 @@ # #*/ -EDK2_TOOLCHAIN ?= GCC5 +EDK2_TOOLCHAIN ?= GCC EDK2_ARCH ?= AARCH64 EDK2_BUILD ?= DEBUG diff --git a/EmulatorPkg/build.sh b/EmulatorPkg/build.sh index 76c22dfaf8d4..8373087803a2 100755 --- a/EmulatorPkg/build.sh +++ b/EmulatorPkg/build.sh @@ -98,7 +98,7 @@ case `uname` in TARGET_TOOLS=GCC49 ;; *) - TARGET_TOOLS=GCC5 + TARGET_TOOLS=GCC ;; esac ;; diff --git a/OvmfPkg/build.sh b/OvmfPkg/build.sh index 30f48301733a..164c11f641d3 100755 --- a/OvmfPkg/build.sh +++ b/OvmfPkg/build.sh @@ -87,7 +87,7 @@ case `uname` in TARGET_TOOLS=GCC49 ;; *) - TARGET_TOOLS=GCC5 + TARGET_TOOLS=GCC ;; esac ;; From ff3c1adf20ffcb4fc994806eb9825b3662d6dd4c Mon Sep 17 00:00:00 2001 From: Qihang Gao Date: Wed, 26 Nov 2025 17:20:17 +0800 Subject: [PATCH 0916/1172] MdeModulePkg: Load the native Option ROM image if the native one exists Issue:https://github.com/tianocore/edk2/issues/11800 If there are multiple Option ROM images existed, current code will load the first image that the emulator supports. Usually, x86 ROM image is the first one and non-x86 ROM image is behind x86 ROM image. When the emulator is introduced, x86 ROM image instead of native image is loaded on non-x86 platforms. This patch introduces a mechanism to prioritize the loading of native images. Firstly, search the native image. If the native one is found, just finish the process since the goal is reached. Otherwise, search the foriegn images that the platform may support. Signed-off-by: Qihang Gao Signed-off-by: Chao Li Suggested-by: Ard Biesheuvel Tested-by: Chen Zhang Cc: Dongyan Qian --- MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c | 11 ++++++++++- MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c | 12 +++++++++++- MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.h | 4 +++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c index 581e9075ad41..409c01d1076f 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c @@ -329,7 +329,16 @@ RegisterPciDevice ( // or loaded from device in the previous round of bus enumeration // if (HasEfiImage) { - ProcessOpRomImage (PciIoDevice); + // + // Try to searching native OpRom first + // + Status = ProcessOpRomImage (PciIoDevice, TRUE); + // + // If the native OpRom is not found, try to searching foreign OpRom + // + if (Status == EFI_NOT_FOUND) { + ProcessOpRomImage (PciIoDevice, FALSE); + } } } diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c index 8bb6c1205819..64100a96a1f3 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c @@ -642,6 +642,7 @@ RomDecode ( Load and start the Option Rom image. @param PciDevice Pci device instance. + @param NativeOnly Whether to consider only the native image. @retval EFI_SUCCESS Successfully loaded and started PCI Option Rom image. @retval EFI_NOT_FOUND Failed to process PCI Option Rom image. @@ -649,7 +650,8 @@ RomDecode ( **/ EFI_STATUS ProcessOpRomImage ( - IN PCI_IO_DEVICE *PciDevice + IN PCI_IO_DEVICE *PciDevice, + IN BOOLEAN NativeOnly ) { UINT8 Indicator; @@ -700,6 +702,14 @@ ProcessOpRomImage ( goto NextImage; } + // + // Skip the EFI PCI Option ROM image if it's machine type is not supported + // and the native image is only considered. + // + if (!EFI_IMAGE_MACHINE_TYPE_SUPPORTED (EfiRomHeader->EfiMachineType) && (NativeOnly == TRUE)) { + goto NextImage; + } + // // Ignore the EFI PCI Option ROM image if it is an EFI application // diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.h b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.h index 0ddad05b8572..18db717d0df1 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.h +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.h @@ -122,6 +122,7 @@ RomDecode ( Load and start the Option Rom image. @param PciDevice Pci device instance. + @param NativeOnly Whether to consider only the native image. @retval EFI_SUCCESS Successfully loaded and started PCI Option Rom image. @retval EFI_NOT_FOUND Failed to process PCI Option Rom image. @@ -129,7 +130,8 @@ RomDecode ( **/ EFI_STATUS ProcessOpRomImage ( - IN PCI_IO_DEVICE *PciDevice + IN PCI_IO_DEVICE *PciDevice, + IN BOOLEAN NativeOnly ); #endif From e4f99a85545f41ef7ae23cd939484d69a84b6176 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 5 Dec 2025 13:59:18 +0100 Subject: [PATCH 0917/1172] OvmfPkg/PlatformInitLib: reserve igvm parameter area Signed-off-by: Gerd Hoffmann --- OvmfPkg/Include/Library/PlatformInitLib.h | 6 +++++ OvmfPkg/Library/PlatformInitLib/Igvm.c | 27 +++++++++++++++++++ OvmfPkg/Library/PlatformInitLib/MemDetect.c | 2 ++ .../PlatformInitLib/PlatformInitLib.inf | 1 + 4 files changed, 36 insertions(+) diff --git a/OvmfPkg/Include/Library/PlatformInitLib.h b/OvmfPkg/Include/Library/PlatformInitLib.h index 469c49b6285e..884e381928a0 100644 --- a/OvmfPkg/Include/Library/PlatformInitLib.h +++ b/OvmfPkg/Include/Library/PlatformInitLib.h @@ -321,4 +321,10 @@ PlatformIgvmVpCount ( VOID ); +VOID +EFIAPI +PlatformIgvmParamReserve ( + VOID + ); + #endif // PLATFORM_INIT_LIB_H_ diff --git a/OvmfPkg/Library/PlatformInitLib/Igvm.c b/OvmfPkg/Library/PlatformInitLib/Igvm.c index 1b0d9a9b851a..dd5a94ef38f6 100644 --- a/OvmfPkg/Library/PlatformInitLib/Igvm.c +++ b/OvmfPkg/Library/PlatformInitLib/Igvm.c @@ -75,6 +75,33 @@ PlatformIgvmMemoryMapFind ( return Map; } +VOID +EFIAPI +PlatformIgvmParamReserve ( + VOID + ) +{ + UINT64 Base; + UINT64 Size; + + Base = FixedPcdGet64 (PcdOvmfIgvmParamBase); + Size = FixedPcdGet64 (PcdOvmfIgvmParamSize); + + if (Base && Size) { + // + // Reserve igvm parameter area as runtime data, to make sure the OS isn't + // going to use it, otherwise we can get corrupted IGVM parameters after + // guest reboot. + // + DEBUG ((DEBUG_INFO, "%a: 0x%x +0x%x\n", __func__, Base, Size)); + BuildMemoryAllocationHob ( + Base, + Size, + EfiRuntimeServicesData + ); + } +} + BOOLEAN EFIAPI PlatformIgvmMemoryMapCheck ( diff --git a/OvmfPkg/Library/PlatformInitLib/MemDetect.c b/OvmfPkg/Library/PlatformInitLib/MemDetect.c index 81fa60ade507..937e2b77a553 100644 --- a/OvmfPkg/Library/PlatformInitLib/MemDetect.c +++ b/OvmfPkg/Library/PlatformInitLib/MemDetect.c @@ -1240,6 +1240,8 @@ PlatformQemuInitializeRam ( DEBUG ((DEBUG_INFO, "%a called\n", __func__)); + PlatformIgvmParamReserve (); + // // Determine total memory size available // diff --git a/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf b/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf index a02959c2cdbe..9df218c65c7a 100644 --- a/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf +++ b/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf @@ -113,6 +113,7 @@ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfEarlyMemDebugLogSize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmParamBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmParamSize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmHobBase gUefiOvmfPkgTokenSpaceGuid.PcdOvmfIgvmHobSize From 7772a2a3471b4b408f8d5dfba6cda88d78668848 Mon Sep 17 00:00:00 2001 From: lijunwei Date: Thu, 25 Sep 2025 10:33:09 +0800 Subject: [PATCH 0918/1172] SecurityPkg: Correct misspelled variable name Fix the misspelled variable name `mTcg2ConfigPrivateDate` and rename it to `mTcg2ConfigPrivateData` to improve code readability and maintainability. The word "Date" (calendar date) was incorrectly used instead of "Data" (information data). Signed-off-by: lijunwei <542095246@qq.com> --- SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c | 4 ++-- SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.c | 10 +++++----- SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.h | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c index edf5f0fc77ca..a8de10ff7499 100644 --- a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c +++ b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c @@ -281,9 +281,9 @@ Tcg2ConfigDriverEntryPoint ( // // Create a private data structure. // - PrivateData = AllocateCopyPool (sizeof (TCG2_CONFIG_PRIVATE_DATA), &mTcg2ConfigPrivateDateTemplate); + PrivateData = AllocateCopyPool (sizeof (TCG2_CONFIG_PRIVATE_DATA), &mTcg2ConfigPrivateDataTemplate); ASSERT (PrivateData != NULL); - mTcg2ConfigPrivateDate = PrivateData; + mTcg2ConfigPrivateData = PrivateData; // // Install private GUID. // diff --git a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.c b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.c index aec7a903cf89..fc7cfc788b3e 100644 --- a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.c +++ b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.c @@ -22,8 +22,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent TPM_INSTANCE_ID mTpmInstanceId[TPM_DEVICE_MAX + 1] = TPM_INSTANCE_ID_LIST; -TCG2_CONFIG_PRIVATE_DATA *mTcg2ConfigPrivateDate; -TCG2_CONFIG_PRIVATE_DATA mTcg2ConfigPrivateDateTemplate = { +TCG2_CONFIG_PRIVATE_DATA *mTcg2ConfigPrivateData; +TCG2_CONFIG_PRIVATE_DATA mTcg2ConfigPrivateDataTemplate = { TCG2_CONFIG_PRIVATE_DATA_SIGNATURE, { Tcg2ExtractConfig, @@ -297,12 +297,12 @@ SaveTcg2PCRBanksRequest ( EFI_STATUS Status; if (Enable) { - mTcg2ConfigPrivateDate->PCRBanksDesired |= (0x1 << PCRBankIndex); + mTcg2ConfigPrivateData->PCRBanksDesired |= (0x1 << PCRBankIndex); } else { - mTcg2ConfigPrivateDate->PCRBanksDesired &= ~(0x1 << PCRBankIndex); + mTcg2ConfigPrivateData->PCRBanksDesired &= ~(0x1 << PCRBankIndex); } - ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (TCG2_PHYSICAL_PRESENCE_SET_PCR_BANKS, mTcg2ConfigPrivateDate->PCRBanksDesired); + ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (TCG2_PHYSICAL_PRESENCE_SET_PCR_BANKS, mTcg2ConfigPrivateData->PCRBanksDesired); if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) { Status = EFI_SUCCESS; } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) { diff --git a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.h b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.h index 3e0d5f31dfae..8360bc2e93fc 100644 --- a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.h +++ b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.h @@ -67,8 +67,8 @@ typedef struct { UINT32 PCRBanksDesired; } TCG2_CONFIG_PRIVATE_DATA; -extern TCG2_CONFIG_PRIVATE_DATA mTcg2ConfigPrivateDateTemplate; -extern TCG2_CONFIG_PRIVATE_DATA *mTcg2ConfigPrivateDate; +extern TCG2_CONFIG_PRIVATE_DATA mTcg2ConfigPrivateDataTemplate; +extern TCG2_CONFIG_PRIVATE_DATA *mTcg2ConfigPrivateData; #define TCG2_CONFIG_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('T', 'r', 'E', 'D') #define TCG2_CONFIG_PRIVATE_DATA_FROM_THIS(a) CR (a, TCG2_CONFIG_PRIVATE_DATA, ConfigAccess, TCG2_CONFIG_PRIVATE_DATA_SIGNATURE) From 5ac93b22274bc8a4fc926894346ceaf4f6067d6d Mon Sep 17 00:00:00 2001 From: Xin Xie Date: Thu, 4 Dec 2025 13:34:26 -0800 Subject: [PATCH 0919/1172] ArmPlatformPkg/PL011SerialPortLib: Add hardware flow control support This change introduces hardware flow control capabilities for the PL011 serial port Library. Signed-off-by: Xin Xie --- .../Library/PL011SerialPortLib/PL011SerialPortLib.c | 10 ++++++++++ .../Library/PL011SerialPortLib/PL011SerialPortLib.inf | 1 + 2 files changed, 11 insertions(+) diff --git a/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.c b/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.c index afa3fc410c67..f87995384771 100644 --- a/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.c +++ b/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.c @@ -57,6 +57,16 @@ SerialPortInitialize ( return Status; } + if (PcdGetBool (PcdSerialUseHardwareFlowControl)) { + Status = PL011UartSetControl ( + (UINTN)PcdGet64 (PcdSerialRegisterBase), + EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE + ); + if (EFI_ERROR (Status)) { + return Status; + } + } + while (SerialPortPoll ()) { SerialPortRead (&Scratch, sizeof (Scratch)); } diff --git a/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf b/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf index 07424cccb3f8..45263826e15e 100644 --- a/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf +++ b/ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf @@ -32,6 +32,7 @@ [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseHardwareFlowControl [Pcd] gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate From 4c8ba6aed8698f5e7abd3282b4132ddd4a3c8416 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 10 Dec 2025 15:49:07 +0100 Subject: [PATCH 0920/1172] OvmfPkg/QemuFwCfgLib: do not log cache lookups Logging each and every successful cache lookup is not very useful and floods the log. The much better approach is to log everything which gets added to the cache, so the logfile can tell you what is in the cache with /much/ less log lines. The cache initialization code already does that. So drop the lookup message without any replacement. Signed-off-by: Gerd Hoffmann --- OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgCache.c | 1 - 1 file changed, 1 deletion(-) diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgCache.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgCache.c index 6cb302a1ed4a..9a6cc3d1861e 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgCache.c +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgCache.c @@ -171,6 +171,5 @@ InternalQemuFwCfgCacheReadBytes ( CopyMem (Buffer, (UINT8 *)CachedItem + sizeof (FW_CFG_CACHED_ITEM) + QemuFwCfgWorkArea->Offset, ReadSize); QemuFwCfgWorkArea->Offset += (UINT32)ReadSize; - DEBUG ((DEBUG_VERBOSE, "%a: found Item 0x%x in FwCfg Cache\n", __func__, QemuFwCfgWorkArea->FwCfgItem)); return RETURN_SUCCESS; } From 02c88f25f3626aa85545d73b8183e9e39e089ced Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Tue, 9 Dec 2025 11:11:09 +0000 Subject: [PATCH 0921/1172] DynamicTablesPkg: Fix used uninitialized warning from CLANG toolchains The compiler is not spotting that the inverse of the same conditions has already been checked, therefore either the 'if' or the 'else if' has to happen. On the other hand, it is misleading coding to use 'else if' for something that has to happen given earlier checks. This fixes the misleading coding and the warning. We definitely want to keep the warning enabled, as it has caught several genuine cases of uninitialized use. Signed-off-by: Mike Beaton --- .../Common/DynamicPlatRepoLib/CmObjectTokenFixer.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTokenFixer.c b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTokenFixer.c index 319ca6866a56..aa21a0bb3961 100644 --- a/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTokenFixer.c +++ b/DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/CmObjectTokenFixer.c @@ -290,13 +290,6 @@ FixupCmObjectSelfToken ( } // Only support Arm and RISC-V objects for now. - if ((GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId) != EObjNameSpaceArm) && - (GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId) != EObjNameSpaceRiscV)) - { - ASSERT (0); - return EFI_UNSUPPORTED; - } - if (GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId) == EObjNameSpaceArm) { ArmNamespaceObjId = GET_CM_OBJECT_ID (CmObjDesc->ObjectId); if (ArmNamespaceObjId >= EArmObjMax) { @@ -315,6 +308,12 @@ FixupCmObjectSelfToken ( // Fixup self-token if necessary. TokenFixerFunc = RiscVTokenFixer[RiscVNamespaceObjId]; + } else { + ASSERT ( + (GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId) == EObjNameSpaceArm) || + (GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId) == EObjNameSpaceRiscV) + ); + return EFI_UNSUPPORTED; } if (TokenFixerFunc != NULL) { From ba8296810c6c0f411f158955574c8ae8ffe283f0 Mon Sep 17 00:00:00 2001 From: Liqi Qi Date: Mon, 8 Dec 2025 15:30:00 -0800 Subject: [PATCH 0922/1172] SecurityPkg: Fix Tcg2SubmitCommand in TPM field upgrade scenario MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There's a bug that after the device was forced shut down during the tpm firmware update process, then the TPM will stay in field upgrade mode and refuse to work properly. This will block TPM startup and cause the device to bootloop. Now in the TCG_DXE_DATA struct we don’t have a flag to indicate the current TPM mode, and we will simply treat the upper Scenario with this DEVICE_ERROR and set the TPMPresentFlag to FALSE. Later in Tcg2SubmitCommand we will just return DEVICE_ERROR and skip the actual TPM recovery. We should have an extra flag that check for the TPM response code and if it's TPM_RC_UPGRADE, we knew the device is in field upgrade mode and should continue the workflow. We should only return EFI_DEVICE_ERROR when both TPMPresentFlag and TpmUpdateFlag are false. The field upgrade is part of TCG spec, and the capsule update/recovery is part of UEFI spec. Make this PR to bring in the fix for this corner case. Signed-off-by: Liqi Qi --- SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c | 70 ++++++++++++++++++++++++++----- 1 file changed, 59 insertions(+), 11 deletions(-) diff --git a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c index 85a852842d50..6975da952737 100644 --- a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c +++ b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c @@ -79,8 +79,17 @@ typedef struct { UINTN Next800155EventOffset; } TCG_EVENT_LOG_AREA_STRUCT; +// Mapping of TPM return status to BIOS/OS TPM support and related flags (TPMPresentFlag, TpmUpdateFlag) +// +-------------------+---------------------+-------------------+----------------+---------------+ +// | TPM Return Status | Support TPM in BIOS | Support TPM in OS | TPMPresentFlag | TpmUpdateFlag | +// |-------------------|---------------------|-------------------|----------------|---------------| +// | SUCCESS | YES | YES | TRUE | FALSE | +// | FIELD_UPGRADE | YES | NO | FALSE | TRUE | +// | Other FAIL | NO | NO | FALSE | FALSE | +// +-------------------+---------------------+-------------------+----------------+---------------+ typedef struct _TCG_DXE_DATA { EFI_TCG2_BOOT_SERVICE_CAPABILITY BsCap; + BOOLEAN TpmUpdateFlag; TCG_EVENT_LOG_AREA_STRUCT EventLogAreaStruct[TCG_EVENT_LOG_AREA_COUNT_MAX]; BOOLEAN GetEventLogCalled[TCG_EVENT_LOG_AREA_COUNT_MAX]; TCG_EVENT_LOG_AREA_STRUCT FinalEventLogAreaStruct[TCG_EVENT_LOG_AREA_COUNT_MAX]; @@ -101,6 +110,7 @@ TCG_DXE_DATA mTcgDxeData = { 0, // NumberOfPCRBanks 0, // ActivePcrBanks }, + FALSE, }; UINTN mBootAttempts = 0; @@ -1407,6 +1417,8 @@ Tcg2SubmitCommand ( ) { EFI_STATUS Status; + TPM_RC ResponseCode; + UINT32 CurrentOutputBlockSize; if ((This == NULL) || (InputParameterBlockSize == 0) || (InputParameterBlock == NULL) || @@ -1415,10 +1427,6 @@ Tcg2SubmitCommand ( return EFI_INVALID_PARAMETER; } - if (!mTcgDxeData.BsCap.TPMPresentFlag) { - return EFI_DEVICE_ERROR; - } - if (InputParameterBlockSize > mTcgDxeData.BsCap.MaxCommandSize) { return EFI_INVALID_PARAMETER; } @@ -1427,13 +1435,53 @@ Tcg2SubmitCommand ( return EFI_INVALID_PARAMETER; } - Status = Tpm2SubmitCommand ( - InputParameterBlockSize, - InputParameterBlock, - &OutputParameterBlockSize, - OutputParameterBlock - ); - return Status; + // + // Always attempt to submit the command, but if the TPM is already flagged + // as not present, we expect it to fail other than the capsule update scenario. + // + CurrentOutputBlockSize = OutputParameterBlockSize; + Status = Tpm2SubmitCommand ( + InputParameterBlockSize, + InputParameterBlock, + &CurrentOutputBlockSize, + OutputParameterBlock + ); + if (EFI_ERROR (Status)) { + return mTcgDxeData.BsCap.TPMPresentFlag ? Status : EFI_DEVICE_ERROR; + } + + if (CurrentOutputBlockSize < sizeof (TPM2_RESPONSE_HEADER)) { + DEBUG ((DEBUG_ERROR, "%a: Response buffer too small!\n", __func__)); + return EFI_DEVICE_ERROR; + } + + // + // Correctly read the response code and swap bytes from Big-Endian to Host order. + // The responseCode field is at offset 6 of the response header. + // + ResponseCode = SwapBytes32 (ReadUnaligned32 ((UINT32 *)(OutputParameterBlock + 6))); + DEBUG ((DEBUG_ERROR, "Response code is %x", ResponseCode)); + // If the response code ever equals to TPM_RC_UPGRADE, it means the TPM is in field + // upgrade mode, we set TpmUpdateFlag to TRUE. + if (ResponseCode == TPM_RC_UPGRADE) { + DEBUG ((DEBUG_INFO, "TPM response code TPM_RC_UPDATE received. Setting flag.\n")); + mTcgDxeData.TpmUpdateFlag = TRUE; + } + + // Now that we have set the TPMPresentFlag, it should be able to reflect the actual TPM presence + // as long as the device is not in field update mode. + if ((mTcgDxeData.BsCap.TPMPresentFlag == FALSE) && (mTcgDxeData.TpmUpdateFlag == FALSE)) { + DEBUG ((DEBUG_WARN, "%a: TPMPresentFlag is FALSE. Expecting command to fail.\n", __func__)); + return EFI_DEVICE_ERROR; + } + + // If the response code is not TPM_RC_SUCCESS and the device is not in field update mode, return error. + if ((ResponseCode != TPM_RC_SUCCESS) && (mTcgDxeData.TpmUpdateFlag == FALSE)) { + DEBUG ((DEBUG_ERROR, "%a: Command failed with response code 0x%x\n", __func__, ResponseCode)); + return EFI_DEVICE_ERROR; + } + + return EFI_SUCCESS; } /** From d2cbaefc082294eadaa30a3d5f0fa8ba264a574a Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 10 Dec 2025 11:16:08 +0100 Subject: [PATCH 0923/1172] OvmfPkg/X86QemuLoadImageLib: flip default for EnableLegacyLoader to false What happened since commit 1549bf11cc94 ("OvmfPkg/X86QemuLoadImageLib: make legacy loader configurable.") ? First, qemu 10.0 has been released, which brings support for the -shim command line option so direct kernel boot with secure boot works. Second, support has been added to libvirt (version v11.2.0 and newer). Third, we got a bunch of linux distro releases. Latest debian, ubuntu and fedora releases all have new enough edk2+qemu+libvirt packages to support direct kernel boot with shim.efi loading and proper secure boot verification. Lastly, the edk2 security advisory GHSA-6pp6-cm5h-86g5 and CVE-2025-2296 have been published. Time for the next step in tightening the screws: Flip the default for the EnableLegacyLoader config option from true to false. Also update the documentation accordingly. The documentation for the config option is here: https://github.com/tianocore/edk2/blob/master/OvmfPkg/RUNTIME_CONFIG.md#user-content-security-optorgtianocoreenablelegacyloader Upcoming final step, in a year or two: remove the legacy loader from the code base (drop X86QemuLoadImageLib, migrade all users to use GenericQemuLoadImageLib instead). Signed-off-by: Gerd Hoffmann --- .../X86QemuLoadImageLib/X86QemuLoadImageLib.c | 2 +- OvmfPkg/RUNTIME_CONFIG.md | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c b/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c index b16bdeb47f8c..f98f8ab885b4 100644 --- a/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c +++ b/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c @@ -449,7 +449,7 @@ QemuLoadKernelImage ( &Enabled ); if (EFI_ERROR (RetStatus)) { - Enabled = TRUE; + Enabled = FALSE; } if (!Enabled) { diff --git a/OvmfPkg/RUNTIME_CONFIG.md b/OvmfPkg/RUNTIME_CONFIG.md index b75a5dacadf5..57d0dd96111a 100644 --- a/OvmfPkg/RUNTIME_CONFIG.md +++ b/OvmfPkg/RUNTIME_CONFIG.md @@ -153,16 +153,19 @@ without EFI stub. If you are using kernels that old secure boot support is the least of your problems though ... The linux kernel is typically signed by the distro secure boot keys -and is verified by the distro `shim.efi` binary. qemu release 10.0 -(ETA ~ March 2025) will get support for passing the shim binary +and is verified by the distro `shim.efi` binary. qemu version 10.0 +(released in April 2025) got support for passing the shim binary (additionally to kernel + initrd) to the firmware, so the usual secure boot verification can work with direct kernel load too. -For now the legacy loader is enabled by default. Once the new qemu -release is available in most linux distros the defaut will be flipped -to disabled. +In edk2-stable202502 and newer the EnableLegacyLoader config option is +available and enabled by default. -Usage (qemu 10.0+): +In edk2-stable202602 and newer the EnableLegacyLoader config option is +disabled by default. + +Here is the qemu command line for direct kernel boot with secure boot +verification: ``` qemu-system-x86_64 \ From 14aa197f71cc7bc7bb7ecd8184dfb062fd581d03 Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Sun, 7 Dec 2025 06:57:29 +0000 Subject: [PATCH 0924/1172] DynamicTablesPkg/AmlLib: Remove invalid ASSERT for IRQ macro generation The ACPI specification does not require legacy IRQs (x86) to be ActiveLow when EdgeTriggered or vice-versa. Hence the ASSERT checking for ActiveLow when EdgeTriggered is removed for IRQ macro generation non-ARM architecture. The IRQNoFlags macro defaults to EdgeTrigger and ActiveHigh configuration, demonstrating that this combination is valid. Reference: ACPI Specification 6.5 - Section 19.6.66: IRQ (Interrupt Resource Descriptor Macro) - Section 19.6.67: IRQNoFlags (Interrupt Resource Descriptor Macro) Signed-off-by: Abdul Lateef Attar --- .../Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c index 8be5eabf3a92..2984a65ad812 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlResourceDataCodeGen.c @@ -1724,6 +1724,7 @@ AmlCodeGenRdIrq ( return EFI_INVALID_PARAMETER; } + #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) if ((IsEdgeTriggered && !IsActiveLow) || (!IsEdgeTriggered && IsActiveLow)) { @@ -1731,6 +1732,8 @@ AmlCodeGenRdIrq ( return EFI_INVALID_PARAMETER; } + #endif + if ((IrqList == NULL) || (IrqCount == 0) || (IrqCount > 16)) { ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); return EFI_INVALID_PARAMETER; From 84e7054790d128c7c9b2dd9d8059ccf54066c70c Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Thu, 11 Dec 2025 19:36:43 +0000 Subject: [PATCH 0925/1172] ArmVirtPkg: Increase firmware size Although almost all tool chain plus package combinations currently stay under the 2MB firmware size, except for NOOPT builds, ArmVirtQemu DEBUG built with CLANGDWARF now sneaks over. Noting that images will be padded to 64MB for before use anyway, we now choose 3MB as the default for all. But keep the 2MB vs. 3MB code which checks FD_SIZE_IN_MB, in this and other files, available for reference the next time a size change is needed. Signed-off-by: Mike Beaton --- ArmVirtPkg/ArmVirt.dsc.inc | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/ArmVirtPkg/ArmVirt.dsc.inc b/ArmVirtPkg/ArmVirt.dsc.inc index 643620371bcf..a08b6ddbc293 100644 --- a/ArmVirtPkg/ArmVirt.dsc.inc +++ b/ArmVirtPkg/ArmVirt.dsc.inc @@ -17,12 +17,8 @@ DEFINE DEBUG_PRINT_ERROR_LEVEL = 0x8000004F -# Dynamic stack cookies pushes the FD size up slightly over 2MB -!if $(TARGET) != NOOPT - DEFINE FD_SIZE_IN_MB = 2 -!else - DEFINE FD_SIZE_IN_MB = 3 -!endif +# Various builds now exceed 2MB so choose 3MB as the default. +DEFINE FD_SIZE_IN_MB = 3 !if $(FD_SIZE_IN_MB) == 2 DEFINE FD_SIZE = 0x200000 From 66ea00be1bf3b3d91b1d98f84d3180ee56a3146f Mon Sep 17 00:00:00 2001 From: Ajan Zhong Date: Fri, 21 Nov 2025 10:28:23 +0800 Subject: [PATCH 0926/1172] UefiPayloadPkg: Setup temporary GDT for x64 UniversalPayload Separate Exception Stacks has been enabled by default in commit [1], in this case, TSS will be appended to original GDT. As secondary bootloader, UniversalPayload solution has different boot flow from original EDK2. When DxeMain tries to append TSS after original GDT, the original GDT is empty. It leads to system reboot when DxeMain tries to install new GDT which is appended with TSS. To fix this issue, set up temporary GDT with 64-bit code and data descriptors. [1] https://github.com/tianocore/edk2/commit/cec2c6 Signed-off-by: Ajan Zhong --- .../UefiPayloadEntry/X64/DxeLoadFuncFit.c | 39 ++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c index 37528d5fe2a4..9f3daf311fa9 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c +++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c @@ -21,6 +21,29 @@ extern VOID *mHobList; +// +// Global Descriptor Table (GDT) - 8-byte aligned +// GDT with 3 entries: NULL, 64-bit Code, 64-bit Data +// +GLOBAL_REMOVE_IF_UNREFERENCED IA32_GDT gGdtEntries[3] = { + // NULL descriptor (entry 0) + { .Uint64 = 0 }, + // .short 0xffff /* limit 15:00 */ + // .short 0x0000 /* base 15:00 */ + // .byte 0x00 /* base 23:16 */ + // .byte 0b10011010 /* P(1) DPL(00) S(1) 1 C(0) R(1) A(0) */ + // .byte 0b10101111 /* G(1) D(0) L(1) AVL(0) limit 19:16 */ + // .byte 0x0 /* base 31:24 */ + { .Uint64 = 0x00AF9A000000FFFFULL }, + // .short 0xffff /* limit 15:00 */ + // .short 0x0000 /* base 15:00 */ + // .byte 0x00 /* base 23:16 */ + // .byte 0b10010010 /* P(1) DPL(00) S(1) 1 E(0) W(1) A(0) */ + // .byte 0b11001111 /* G(1) B(1) 0 AVL(0) limit 19:16 */ + // .byte 0x0 /* base 31:24 */ + { .Uint64 = 0x00CF92000000FFFFULL } +}; + /** Transfers control to DxeCore. @@ -38,11 +61,17 @@ HandOffToDxeCore ( IN EFI_PEI_HOB_POINTERS HobList ) { - VOID *BaseOfStack; - VOID *TopOfStack; - UINTN PageTables; - VOID *GhcbBase; - UINTN GhcbSize; + VOID *BaseOfStack; + VOID *TopOfStack; + UINTN PageTables; + VOID *GhcbBase; + UINTN GhcbSize; + IA32_DESCRIPTOR Gdtr; + + // Set up temporary GDT + Gdtr.Base = (UINTN)gGdtEntries; + Gdtr.Limit = (UINT16)(sizeof (gGdtEntries) - 1); + AsmWriteGdtr (&Gdtr); // Initialize floating point operating environment to be compliant with UEFI spec. InitializeFloatingPointUnits (); From 88dbd249dac4df4681c4c5c58204e2c8b77d8d3d Mon Sep 17 00:00:00 2001 From: Ajan Zhong Date: Mon, 1 Dec 2025 10:32:26 +0800 Subject: [PATCH 0927/1172] UefiPayloadPkg: Remove unused variable to fix build error Variable ChildBusAddress is not used in function ParsePciRootBridge, it triggers build error on GCC version gcc version 13.3.0. Remove this variable to fix build error. Signed-off-by: Ajan Zhong --- UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c b/UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c index b02f7274b8f2..1a97414f421f 100644 --- a/UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c +++ b/UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c @@ -841,21 +841,9 @@ ParsePciRootBridge ( UINT32 TripletCells = ChildAddrCells + ParentAddrCells + SizeCells; for (Base = 0; Base < TempLen / sizeof (UINT32); Base = Base + TripletCells) { - UINT64 ChildBusAddress = 0; UINT64 ParentBusAddress = 0; UINT64 DmaRangeSize = 0; - - if (ChildAddrCells == 3) { - ChildBusAddress = (UINT64)Fdt32ToCpu (*(Data32 + Base + 1)) << 32 | - (UINT64)Fdt32ToCpu (*(Data32 + Base + 2)); - } else if (ChildAddrCells == 2) { - ChildBusAddress = (UINT64)Fdt32ToCpu (*(Data32 + Base)) << 32 | - (UINT64)Fdt32ToCpu (*(Data32 + Base + 1)); - } else if (ChildAddrCells == 1) { - ChildBusAddress = Fdt32ToCpu (*(Data32 + Base)); - } - - UINT32 ParentBase = Base + ChildAddrCells; + UINT32 ParentBase = Base + ChildAddrCells; if (ParentAddrCells == 2) { ParentBusAddress = (UINT64)Fdt32ToCpu (*(Data32 + ParentBase)) << 32 | (UINT64)Fdt32ToCpu (*(Data32 + ParentBase + 1)); From be9136d40defbc265b6900f75e9269becc1d8911 Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Thu, 11 Dec 2025 19:01:25 +0000 Subject: [PATCH 0928/1172] RedfishPkg: Fix CLANGPDB _fltused build error Without this fix CLANGPDB X64 and IA32 builds of RedfishPkg fail with: lld-link: error: undefined symbol: _fltused Fixes: #11881 Signed-off-by: Mike Beaton --- RedfishPkg/PrivateLibrary/RedfishCrtLib/RedfishCrtLib.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/RedfishPkg/PrivateLibrary/RedfishCrtLib/RedfishCrtLib.c b/RedfishPkg/PrivateLibrary/RedfishCrtLib/RedfishCrtLib.c index 902dd0b3a04b..4b0a1e0710b2 100644 --- a/RedfishPkg/PrivateLibrary/RedfishCrtLib/RedfishCrtLib.c +++ b/RedfishPkg/PrivateLibrary/RedfishCrtLib/RedfishCrtLib.c @@ -18,8 +18,13 @@ int errno = 0; char errnum_message[] = "We don't support to map errnum to the error message on edk2 Redfish\n"; -// This is required to keep VC++ happy if you use floating-point -int _fltused = 1; +// This is required to keep MSVC-mode toolchains happy if you use floating-point. +#if defined (__GNUC__) || defined (__clang__) +#define GLOBAL_USED __attribute__((used)) +#else +#define GLOBAL_USED +#endif +int GLOBAL_USED _fltused; /** Determine if a particular character is an alphanumeric character From 786de8636a28affa76de24cea3ed48da0393841b Mon Sep 17 00:00:00 2001 From: Khalid Ali Date: Sun, 14 Dec 2025 07:35:52 +0000 Subject: [PATCH 0929/1172] MdeModulePkg/PciBusDxe: Fix boot hang introduced by ff3c1ad The changes introduced by ff3c1ad which made two calls to ProcessOpRomImage() resulted a platform where single OpRom present, the same image to be loaded and started. Prevent loading and starting same image twice. Signed-off-by: Khalid Ali Suggested-by: Ard Biesheuvel --- MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c index 64100a96a1f3..53e8189b87a3 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c @@ -706,7 +706,7 @@ ProcessOpRomImage ( // Skip the EFI PCI Option ROM image if it's machine type is not supported // and the native image is only considered. // - if (!EFI_IMAGE_MACHINE_TYPE_SUPPORTED (EfiRomHeader->EfiMachineType) && (NativeOnly == TRUE)) { + if (EFI_IMAGE_MACHINE_TYPE_SUPPORTED (EfiRomHeader->EfiMachineType) ^ (NativeOnly == TRUE)) { goto NextImage; } From f9326a4fece7b15da77b1099a0f149dbb067fa7e Mon Sep 17 00:00:00 2001 From: aaronpop Date: Tue, 16 Dec 2025 11:23:41 -0800 Subject: [PATCH 0930/1172] MdeModulePkg: Fix regressions from 11687, 11689. 11687 introduced a null check and break on the orderedlist carriage return input handler. The carriage return is a special case that should result in exiting the menu, but the null check that prevented null pointer access changed the logic to continue in the input wait loop. Removed the break while still preventing null variable access and allow function to exit. 11689 introduced checks on the call to EfiBootManagerGetLoadOptions, but this encounterd a problem with the way that a default platform recovery option was created. The default platform recovery option was attempting to go through existing recovery options to get the next available recovery option number. The introduced null check short circuited these additional calls and resulted in the platform recovery option not being created. Modified the logic to no longer attempt to access recovery options when non exist, and still create the default platform recovery option. Signed-off-by: Aaron Pop --- MdeModulePkg/Universal/BdsDxe/BdsEntry.c | 31 ++++++++++++------- .../Universal/DisplayEngineDxe/InputHandler.c | 19 ++++++------ 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c b/MdeModulePkg/Universal/BdsDxe/BdsEntry.c index 3dcc2951069d..4ac3a88e8494 100644 --- a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c +++ b/MdeModulePkg/Universal/BdsDxe/BdsEntry.c @@ -832,24 +832,31 @@ BdsEntry ( // file path for removable media if the platform supports Platform Recovery. // if (PlatformDefaultBootOptionValid && PcdGetBool (PcdPlatformRecoverySupport)) { + // + // Get the current PlatformRecovery options. Check if the platform recovery already exists, or + // find the next unused platform recovery option number so it can be created + // + Index = 0; LoadOptions = EfiBootManagerGetLoadOptions (&LoadOptionCount, LoadOptionTypePlatformRecovery); - if ((LoadOptions != NULL) && (EfiBootManagerFindLoadOption (&PlatformDefaultBootOption, LoadOptions, LoadOptionCount) == -1)) { - for (Index = 0; Index < LoadOptionCount; Index++) { - // - // The PlatformRecovery#### options are sorted by OptionNumber. - // Find the the smallest unused number as the new OptionNumber. - // - if (LoadOptions[Index].OptionNumber != Index) { - break; + if (LoadOptions != NULL) { + if (EfiBootManagerFindLoadOption (&PlatformDefaultBootOption, LoadOptions, LoadOptionCount) == -1) { + for ( ; Index < LoadOptionCount; Index++) { + // + // The PlatformRecovery#### options are sorted by OptionNumber. + // Find the the smallest unused number as the new OptionNumber. + // + if (LoadOptions[Index].OptionNumber != Index) { + break; + } } } - PlatformDefaultBootOption.OptionNumber = Index; - Status = EfiBootManagerLoadOptionToVariable (&PlatformDefaultBootOption); - ASSERT_EFI_ERROR (Status); + EfiBootManagerFreeLoadOptions (LoadOptions, LoadOptionCount); } - EfiBootManagerFreeLoadOptions (LoadOptions, LoadOptionCount); + PlatformDefaultBootOption.OptionNumber = Index; + Status = EfiBootManagerLoadOptionToVariable (&PlatformDefaultBootOption); + ASSERT_EFI_ERROR (Status); } FreePool (FilePath); diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c b/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c index b3ba0a7eae05..b7f2d8a6280f 100644 --- a/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c +++ b/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c @@ -1719,20 +1719,19 @@ GetSelectionInputPopUp ( } else { if (CurrentOption == NULL) { ASSERT (CurrentOption != NULL); - break; - } - - gUserInput->InputValue.Type = CurrentOption->OptionOpCode->Type; - if (IsValuesEqual (&Question->CurrentValue.Value, &CurrentOption->OptionOpCode->Value, gUserInput->InputValue.Type)) { - return EFI_DEVICE_ERROR; } else { - SetValuesByType (&gUserInput->InputValue.Value, &CurrentOption->OptionOpCode->Value, gUserInput->InputValue.Type); + gUserInput->InputValue.Type = CurrentOption->OptionOpCode->Type; + if (IsValuesEqual (&Question->CurrentValue.Value, &CurrentOption->OptionOpCode->Value, gUserInput->InputValue.Type)) { + return EFI_DEVICE_ERROR; + } else { + SetValuesByType (&gUserInput->InputValue.Value, &CurrentOption->OptionOpCode->Value, gUserInput->InputValue.Type); + } } + } - gST->ConOut->SetAttribute (gST->ConOut, SavedAttribute); + gST->ConOut->SetAttribute (gST->ConOut, SavedAttribute); - return EFI_SUCCESS; - } + return EFI_SUCCESS; default: break; From 9013d867ae337aef91e88c479119955de070dc52 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Sat, 6 Dec 2025 18:18:03 -0800 Subject: [PATCH 0931/1172] UnitTestFrameworkPkg: Fix spelling issues Add "uintn" to extended words in ci.yaml and fix typos. Signed-off-by: Michael D Kinney --- UnitTestFrameworkPkg/ReadMe.md | 4 ++-- UnitTestFrameworkPkg/UnitTestFrameworkPkg.ci.yaml | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/UnitTestFrameworkPkg/ReadMe.md b/UnitTestFrameworkPkg/ReadMe.md index 9c069fb7a7f9..7a5b35fe8f2f 100644 --- a/UnitTestFrameworkPkg/ReadMe.md +++ b/UnitTestFrameworkPkg/ReadMe.md @@ -1034,7 +1034,7 @@ file. This provides the default defines and library class mappings requires for Lastly, in the case that the test build has specific dependent libraries associated with it, they should be added in the \ sub-section for the INF file in the `[Components]` section of the DSC file. Note that it is within this sub-section where you can -control whether the design or mock version of a component is linked into the test exectuable. +control whether the design or mock version of a component is linked into the test executable. See this example in `SecurityPkgHostTest.dsc` where the `SecureBootVariableLib` design is being tested using mock versions of `UefiRuntimeServicesTableLib`, `PlatformPKProtectionLib`, @@ -1263,7 +1263,7 @@ uses the same test fixture and makes use of its `RtServicesMock`, `Status`, and `SecureBootMode` variables. ```cpp -TEST_F(SetSecureBootModeTest, PropogateModeToSetVar) { +TEST_F(SetSecureBootModeTest, PropagateModeToSetVar) { EXPECT_CALL(RtServicesMock, gRT_SetVariable( Char16StrEq(EFI_CUSTOM_MODE_NAME), diff --git a/UnitTestFrameworkPkg/UnitTestFrameworkPkg.ci.yaml b/UnitTestFrameworkPkg/UnitTestFrameworkPkg.ci.yaml index 970ba900b820..0e3fd4411a3d 100644 --- a/UnitTestFrameworkPkg/UnitTestFrameworkPkg.ci.yaml +++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkg.ci.yaml @@ -117,7 +117,8 @@ "fexceptions", # build flag for gtest "corthon", # Contact GitHub account in Readme "mdkinney", # Contact GitHub account in Readme - "spbrogan" # Contact GitHub account in Readme + "spbrogan", # Contact GitHub account in Readme + "uintn" ], "IgnoreStandardPaths": [], # Standard Plugin defined paths that should be ignore "AdditionalIncludePaths": [] # Additional paths to spell check (wildcards supported) From 1e3e575ee2fae5da5fb3df6f9e37b31f8fc0d540 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Sat, 6 Dec 2025 18:20:16 -0800 Subject: [PATCH 0932/1172] SourceLevelDebugPkg: Update SpellCheck Extended words Add "usbsts" to extended words in ci.yaml file. Signed-off-by: Michael D Kinney --- SourceLevelDebugPkg/SourceLevelDebugPkg.ci.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SourceLevelDebugPkg/SourceLevelDebugPkg.ci.yaml b/SourceLevelDebugPkg/SourceLevelDebugPkg.ci.yaml index 0ddf60cd434c..295a11640ecc 100644 --- a/SourceLevelDebugPkg/SourceLevelDebugPkg.ci.yaml +++ b/SourceLevelDebugPkg/SourceLevelDebugPkg.ci.yaml @@ -112,7 +112,8 @@ "stosq", "ttach", "urb's", - "xhc's" + "xhc's", + "usbsts" ], "IgnoreStandardPaths": [], # Standard Plugin defined paths that should be ignore "AdditionalIncludePaths": [] # Additional paths to spell check (wildcards supported) From 542d2f2ed4e066fc5280e3cc1322e16e2f438ea8 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 8 Dec 2025 11:45:43 -0800 Subject: [PATCH 0933/1172] PrmPkg/Library/DxePrmContextBufferLib/UnitTest: Fix CLANG error Fix uninitialized variable errors in unit tests discovered by CLANG by zeroing local variable structures before use in unit test cases. Signed-off-by: Michael D Kinney --- .../UnitTest/DxePrmContextBufferLibUnitTest.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PrmPkg/Library/DxePrmContextBufferLib/UnitTest/DxePrmContextBufferLibUnitTest.c b/PrmPkg/Library/DxePrmContextBufferLib/UnitTest/DxePrmContextBufferLibUnitTest.c index 212c4cf6aaba..321b0b69ad54 100644 --- a/PrmPkg/Library/DxePrmContextBufferLib/UnitTest/DxePrmContextBufferLibUnitTest.c +++ b/PrmPkg/Library/DxePrmContextBufferLib/UnitTest/DxePrmContextBufferLibUnitTest.c @@ -236,6 +236,9 @@ NullPointerArgumentsShouldFailGracefully ( PRM_MODULE_CONTEXT_BUFFERS ModuleContextBuffers; PRM_MODULE_CONTEXT_BUFFERS *ModuleContextBuffersPtr; + ZeroMem (&ModuleContextBuffers, sizeof (ModuleContextBuffers)); + ZeroMem (&Guid, sizeof (Guid)); + UT_ASSERT_EQUAL (FindContextBufferInModuleBuffers (NULL, NULL, NULL), EFI_INVALID_PARAMETER); UT_ASSERT_EQUAL (FindContextBufferInModuleBuffers (NULL, &ModuleContextBuffers, (CONST PRM_CONTEXT_BUFFER **)&ContextBufferPtr), EFI_INVALID_PARAMETER); UT_ASSERT_EQUAL (FindContextBufferInModuleBuffers (&Guid, NULL, (CONST PRM_CONTEXT_BUFFER **)&ContextBufferPtr), EFI_INVALID_PARAMETER); From 4cf6f2f32d3b0bba5d4ea2dc14baa688fb50f583 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Sat, 6 Dec 2025 17:55:35 -0800 Subject: [PATCH 0934/1172] PrmPkg: Update SpellCheck Extended words Add extended words to ci.yaml file for words noted by spell check when doing stuart_ci_build NO-TARGET build against PrmPkg. Signed-off-by: Michael D Kinney --- PrmPkg/PrmPkg.ci.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/PrmPkg/PrmPkg.ci.yaml b/PrmPkg/PrmPkg.ci.yaml index a55abd221662..0c6e4c9e01ee 100644 --- a/PrmPkg/PrmPkg.ci.yaml +++ b/PrmPkg/PrmPkg.ci.yaml @@ -100,6 +100,12 @@ "keepoptionalheader", "odule", # note: appears in buffer ascii dump in documentation "oemid", + "prmconfig", + "prmcontextbufferlib", + "prmexportdescriptor", + "prminfo", + "prmloader", + "prmmodulediscoverylib", "prmopreg", "prmpecofflib", "prmpkg", From 7c9fd884be4e94bd4ad8e998d85bb52d6f319e72 Mon Sep 17 00:00:00 2001 From: 20000419 Date: Thu, 18 Dec 2025 16:38:49 +0800 Subject: [PATCH 0935/1172] BaseTools: Fix multiple security vulnerabilities (Defense in Depth) Signed-off-by: 20000419 --- .../Source/C/BrotliCompress/BrotliCompress.c | 108 +++++++----------- BaseTools/Source/C/Common/EfiUtilityMsgs.c | 20 ++-- BaseTools/Source/C/GenFw/Elf64Convert.c | 6 +- .../Source/C/VfrCompile/Pccts/dlg/dlg_a.c | 14 ++- .../Source/C/VfrCompile/Pccts/dlg/output.c | 6 +- .../Source/C/VfrCompile/Pccts/dlg/support.c | 15 ++- BaseTools/Source/C/VfrCompile/VfrCompiler.cpp | 79 ++++++++++--- BaseTools/Source/C/VolInfo/VolInfo.c | 51 +++++---- 8 files changed, 173 insertions(+), 126 deletions(-) diff --git a/BaseTools/Source/C/BrotliCompress/BrotliCompress.c b/BaseTools/Source/C/BrotliCompress/BrotliCompress.c index c6b018905a5d..4a6db1a2cd55 100644 --- a/BaseTools/Source/C/BrotliCompress/BrotliCompress.c +++ b/BaseTools/Source/C/BrotliCompress/BrotliCompress.c @@ -407,8 +407,6 @@ int main(int argc, char** argv) { FILE *OutputHandle; int Quality; int Gap; - int OutputFileLength; - int InputFileLength; int Ret; size_t InputFileSize; uint8_t *Buffer; @@ -440,87 +438,71 @@ int main(int argc, char** argv) { Version(); return 0; } - while (argc > 1) { - if (strcmp(argv[1], "-e") == 0 || strcmp(argv[1], "--compress") == 0 ) { + int i = 1; + while (i < argc) { + const char* arg = argv[i]; + if (strcmp(arg, "-e") == 0 || strcmp(arg, "--compress") == 0) { CompressBool = BROTLI_TRUE; if (DecompressBool) { - printf("Can't use -e/--compress with -d/--decompess on the same time\n"); + fprintf(stderr, "Can't use -e/--compress with -d/--decompress at the same time\n"); return 1; } - argc--; - argv++; + i++; continue; } - if (strcmp(argv[1], "-d") == 0 || strcmp(argv[1], "--decompress") == 0 ) { + if (strcmp(arg, "-d") == 0 || strcmp(arg, "--decompress") == 0) { DecompressBool = BROTLI_TRUE; if (CompressBool) { - printf("Can't use -e/--compress with -d/--decompess on the same time\n"); + fprintf(stderr, "Can't use -e/--compress with -d/--decompress at the same time\n"); return 1; } - argc--; - argv++; + i++; continue; } - if (strcmp(argv[1], "-o") == 0 || strncmp(argv[1], "--output", 8) == 0) { - if (strcmp(argv[1], "-o") == 0) { - OutputFileLength = strlen(argv[2]); - if (OutputFileLength > _MAX_PATH) { - printf ("The file path %s is too long\n", argv[2]); - return 1; - } - OutputFile = argv[2]; - if (OutputFile == NULL) { - fprintf(stderr, "Input file can't be null\n"); - return 1; - } - argc--; - argv++; - } else { - OutputFileLength = strlen(argv[1] - 9); - OutputFile = (char *)argv[1] + 9; + if (strcmp(arg, "-o") == 0) { + if (i + 1 >= argc) { + fprintf(stderr, "-o requires an argument\n"); + return 1; } - argc--; - argv++; + OutputFile = argv[i + 1]; + i += 2; continue; } - if (strcmp(argv[1], "-q") == 0 || strncmp(argv[1], "--quality", 9) == 0) { - if (strcmp(argv[1], "-q") == 0) { - Quality = strtol(argv[2], NULL, 16); - argc--; - argv++; - } else { - Quality = strtol((char *)argv[1] + 10, NULL, 16); - } - argc--; - argv++; + if (strncmp(arg, "--output=", 9) == 0) { + OutputFile = (char*)arg + 9; + i++; continue; } - if (strcmp(argv[1], "-g") == 0 || strncmp(argv[1], "--gap", 5) == 0) { - if (strcmp(argv[1], "-g") == 0) { - Gap = strtol(argv[2], NULL, 16); - argc--; - argv++; - } else { - Gap = strtol((char *)argv[1] + 6, NULL, 16); + if (strcmp(arg, "-q") == 0) { + if (i + 1 >= argc) { + fprintf(stderr, "-q requires an argument\n"); + return 1; } - argc--; - argv++; + Quality = strtol(argv[i + 1], NULL, 0); + i += 2; + continue; + } + if (strncmp(arg, "--quality=", 10) == 0) { + Quality = strtol(arg + 10, NULL, 0); + i++; continue; } - if (argc > 1) { - InputFileLength = strlen(argv[1]); - if (InputFileLength > _MAX_PATH - 1) { - printf ("The file path %s is too long\n", argv[2]); + if (strcmp(arg, "-g") == 0) { + if (i + 1 >= argc) { + fprintf(stderr, "-g requires an argument\n"); return 1; } - InputFile = argv[1]; - if (InputFile == NULL) { - printf("Input file can't be null\n"); - return 1; - } - argc--; - argv++; + Gap = strtol(argv[i + 1], NULL, 0); + i += 2; + continue; } + if (strncmp(arg, "--gap=", 6) == 0) { + Gap = strtol(arg + 6, NULL, 0); + i++; + continue; + } + InputFile = argv[i]; + i++; } Buffer = (uint8_t*)malloc(kFileBufferSize * 2); @@ -543,14 +525,12 @@ int main(int argc, char** argv) { // // Decompress file for get Outputfile size // - strcpy (OutputTmpFile, OutputFile); - if (strlen(InputFile) + strlen(".tmp") < _MAX_PATH) { - strcat(OutputTmpFile, ".tmp"); - } else { + if (strlen(OutputFile) + strlen(".tmp") >= _MAX_PATH) { printf ("Output file path is too long[%s]\n", OutputFile); Ret = BROTLI_FALSE; goto Finish; } + snprintf(OutputTmpFile, _MAX_PATH, "%s.tmp", OutputFile); memset(Buffer, 0, kFileBufferSize*2); Ret = DecompressFile(OutputFile, InputBuffer, OutputTmpFile, OutputBuffer, Quality, Gap); if (!Ret) { diff --git a/BaseTools/Source/C/Common/EfiUtilityMsgs.c b/BaseTools/Source/C/Common/EfiUtilityMsgs.c index faf354064c25..80e1f3d20e41 100644 --- a/BaseTools/Source/C/Common/EfiUtilityMsgs.c +++ b/BaseTools/Source/C/Common/EfiUtilityMsgs.c @@ -403,12 +403,12 @@ PrintMessage ( ); } if (Cptr != NULL) { - strcpy (Line, ": "); - strncat (Line, Cptr, MAX_LINE_LEN - strlen (Line) - 1); if (LineNumber != 0) { - sprintf (Line2, "(%u)", (unsigned) LineNumber); - strncat (Line, Line2, MAX_LINE_LEN - strlen (Line) - 1); + snprintf(Line, MAX_LINE_LEN, ": %s(%u)", Cptr, (unsigned) LineNumber); + } else { + snprintf(Line, MAX_LINE_LEN, ": %s", Cptr); } + } } else { // @@ -421,7 +421,8 @@ PrintMessage ( strncpy (Line, Cptr, MAX_LINE_LEN - 1); Line[MAX_LINE_LEN - 1] = 0; if (LineNumber != 0) { - sprintf (Line2, "(%u)", (unsigned) LineNumber); + snprintf (Line2, MAX_LINE_LEN, "(%u)", (unsigned) LineNumber); + strncat (Line, Line2, MAX_LINE_LEN - strlen (Line) - 1); } } else { @@ -448,7 +449,8 @@ PrintMessage ( strncat (Line, ": ", MAX_LINE_LEN - strlen (Line) - 1); strncat (Line, Type, MAX_LINE_LEN - strlen (Line) - 1); if (MessageCode != 0) { - sprintf (Line2, " %04u", (unsigned) MessageCode); + snprintf (Line2, MAX_LINE_LEN, " %04u", (unsigned) MessageCode); + strncat (Line, Line2, MAX_LINE_LEN - strlen (Line) - 1); } fprintf (stdout, "%s", Line); @@ -464,7 +466,8 @@ PrintMessage ( // Print formatted message if provided // if (MsgFmt != NULL) { - vsprintf (Line2, MsgFmt, List); + vsnprintf (Line2, MAX_LINE_LEN, MsgFmt, List); + fprintf (stdout, " %s\n", Line2); } @@ -489,7 +492,8 @@ PrintSimpleMessage ( // Print formatted message if provided // if (MsgFmt != NULL) { - vsprintf (Line, MsgFmt, List); + vsnprintf (Line, MAX_LINE_LEN, MsgFmt, List); + fprintf (stdout, "%s\n", Line); } } diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c b/BaseTools/Source/C/GenFw/Elf64Convert.c index 83f1b285c20c..ec809ac4a9e8 100644 --- a/BaseTools/Source/C/GenFw/Elf64Convert.c +++ b/BaseTools/Source/C/GenFw/Elf64Convert.c @@ -390,7 +390,8 @@ FindPrmHandler ( PrmHandler = (PRM_HANDLER_EXPORT_DESCRIPTOR_STRUCT *)(PrmExport + 1); for (HandlerNum = 0; HandlerNum < PrmExport->NumberPrmHandlers; HandlerNum++) { - strcpy(mExportSymName[mExportSymNum], PrmHandler->PrmHandlerName); + snprintf(mExportSymName[mExportSymNum], PRM_HANDLER_NAME_MAXIMUM_LENGTH, "%s", PrmHandler->PrmHandlerName); + mExportSymNum ++; PrmHandler += 1; @@ -1057,7 +1058,8 @@ ScanSections64 ( // FindPrmHandler(Sym->st_value); - strcpy(mExportSymName[mExportSymNum], (CHAR8*)SymName); + snprintf(mExportSymName[mExportSymNum], PRM_HANDLER_NAME_MAXIMUM_LENGTH, "%s", (CHAR8*)SymName); + mExportRVA[mExportSymNum] = (UINT32)(Sym->st_value); mExportSize += 2 * EFI_IMAGE_EXPORT_ADDR_SIZE + EFI_IMAGE_EXPORT_ORDINAL_SIZE + strlen((CHAR8 *)SymName) + 1; mExportSymNum ++; diff --git a/BaseTools/Source/C/VfrCompile/Pccts/dlg/dlg_a.c b/BaseTools/Source/C/VfrCompile/Pccts/dlg/dlg_a.c index 0b8982cf2a09..d550b2a3fa23 100644 --- a/BaseTools/Source/C/VfrCompile/Pccts/dlg/dlg_a.c +++ b/BaseTools/Source/C/VfrCompile/Pccts/dlg/dlg_a.c @@ -56,8 +56,8 @@ int lexMember = 0; /* <<%%lexmemeber ...>> MR1 */ int lexAction = 0; /* <<%%lexaction ...>> MR1 */ int parserClass = 0; /* <<%%parserclass ...>> MR1 */ int lexPrefix = 0; /* <<%%lexprefix ...>> MR1 */ -char theClassName[100]; /* MR11 */ -char *pClassName=theClassName; /* MR11 */ +char theClassName[128]; /* MR11 */ +size_t class_len=0; int firstLexMember=1; /* MR1 */ #ifdef __USE_PROTOS @@ -67,9 +67,11 @@ void xxputc(int c) { /* MR1 */ int c; /* MR1 */ { /* MR1 */ #endif - if (parserClass) { /* MR1 */ - *pClassName++=c; /* MR1 */ - *pClassName=0; /* MR1 */ + if (parserClass) { + if (class_len < sizeof(theClassName) - 1) { + theClassName[class_len++] = c; + theClassName[class_len] = '\0'; + } } else if (lexMember || lexPrefix) { /* MR1 */ if (class_stream != NULL) fputc(c,class_stream); /* MR1 */ } else { /* MR1 */ @@ -155,6 +157,8 @@ static void act9() { NLA = PARSERCLASS; parserClass=1; /* MR1 */ + class_len = 0; + theClassName[0] = '\0'; zzmode(ACT); /* MR1 */ } diff --git a/BaseTools/Source/C/VfrCompile/Pccts/dlg/output.c b/BaseTools/Source/C/VfrCompile/Pccts/dlg/output.c index 2e56a6d8c190..3cd64af2f28a 100644 --- a/BaseTools/Source/C/VfrCompile/Pccts/dlg/output.c +++ b/BaseTools/Source/C/VfrCompile/Pccts/dlg/output.c @@ -122,7 +122,8 @@ char *name; #endif { static char buf[100]; - sprintf(buf, "%s_h", name); + snprintf(buf, sizeof(buf), "%s_h", name); + return buf; } @@ -712,7 +713,8 @@ char *suffix; static char buf[200]; extern char *class_name; - sprintf(buf, "%s%s", class_name, suffix); + snprintf(buf, sizeof(buf), "%s%s", class_name, suffix); + return buf; } diff --git a/BaseTools/Source/C/VfrCompile/Pccts/dlg/support.c b/BaseTools/Source/C/VfrCompile/Pccts/dlg/support.c index 84fe99d69cb8..3a2073eb429b 100644 --- a/BaseTools/Source/C/VfrCompile/Pccts/dlg/support.c +++ b/BaseTools/Source/C/VfrCompile/Pccts/dlg/support.c @@ -227,14 +227,13 @@ char *n; p = n; /* Copy new output directory into newname[] */ - strcpy(newname, OutputDirectory); - - /* if new output directory does not have trailing dir_sym, add it! */ - if (newname[strlen(newname)-1] != *dir_sym) - strcat(newname, dir_sym); - - /* contatenate FILE NAME ONLY to new output directory */ - strcat(newname, p); + if (snprintf(newname, sizeof(newname), "%s%s%s", + OutputDirectory, + (OutputDirectory[strlen(OutputDirectory)-1] == *dir_sym ? "" : dir_sym), + p) >= (int)sizeof(newname)) { + fprintf(stderr, "dlg: warning: output directory or filename is too long\n"); + return n; /* Return original name if path is too long */ + } return newname; } diff --git a/BaseTools/Source/C/VfrCompile/VfrCompiler.cpp b/BaseTools/Source/C/VfrCompile/VfrCompiler.cpp index 5f4d262d85c5..0c5355cb69c7 100644 --- a/BaseTools/Source/C/VfrCompile/VfrCompiler.cpp +++ b/BaseTools/Source/C/VfrCompile/VfrCompiler.cpp @@ -594,9 +594,13 @@ CVfrCompiler::PreProcess ( VOID ) { - FILE *pVfrFile = NULL; UINT32 CmdLen = 0; CHAR8 *PreProcessCmd = NULL; + FILE *pVfrFile = NULL; + FILE *pPipe = NULL; + FILE *pOutFile = NULL; + int RetVal = -1; + char ReadBuf[256]; if (!IS_RUN_STATUS(STATUS_INITIALIZED)) { goto Fail; @@ -612,8 +616,9 @@ CVfrCompiler::PreProcess ( } fclose (pVfrFile); + // Safely calculate command length CmdLen = strlen (mPreProcessCmd) + strlen (mPreProcessOpt) + - strlen (mOptions.VfrFileName) + strlen (mOptions.PreprocessorOutputFileName); + strlen (mOptions.VfrFileName) + 20; // Extra space for spaces and null terminator if (mOptions.CPreprocessorOptions != NULL) { CmdLen += strlen (mOptions.CPreprocessorOptions); } @@ -621,38 +626,82 @@ CVfrCompiler::PreProcess ( CmdLen += strlen (mOptions.IncludePaths); } - PreProcessCmd = new CHAR8[CmdLen + 10]; + PreProcessCmd = new CHAR8[CmdLen]; if (PreProcessCmd == NULL) { DebugError (NULL, 0, 4001, "Resource: memory can't be allocated", NULL); goto Fail; } - strcpy (PreProcessCmd, mPreProcessCmd), strcat (PreProcessCmd, " "); - strcat (PreProcessCmd, mPreProcessOpt), strcat (PreProcessCmd, " "); - if (mOptions.IncludePaths != NULL) { - strcat (PreProcessCmd, mOptions.IncludePaths), strcat (PreProcessCmd, " "); + + // Safely build command string for popen + // Quote VfrFileName to mitigate command injection + snprintf(PreProcessCmd, CmdLen, "%s %s %s %s \"%s\"", + mPreProcessCmd, + mPreProcessOpt, + mOptions.IncludePaths ? mOptions.IncludePaths : "", + mOptions.CPreprocessorOptions ? mOptions.CPreprocessorOptions : "", + mOptions.VfrFileName); + + // + // Execute the command via a pipe and redirect its output to the destination file. + // Using popen allows capturing output. We quote the filename to mitigate + // command injection, although popen still invokes a shell. + // + #ifdef _WIN32 + pPipe = _popen(PreProcessCmd, "r"); + #else + pPipe = popen(PreProcessCmd, "r"); + #endif + + if (pPipe == NULL) { + DebugError (NULL, 0, 0003, "Error parsing file", "failed to spawn C preprocessor on VFR file %s\n", PreProcessCmd); + goto Fail; } - if (mOptions.CPreprocessorOptions != NULL) { - strcat (PreProcessCmd, mOptions.CPreprocessorOptions), strcat (PreProcessCmd, " "); + + pOutFile = fopen(mOptions.PreprocessorOutputFileName, "w"); + if (pOutFile == NULL) { + DebugError(NULL, 0, 0001, "Error opening output file for writing", mOptions.PreprocessorOutputFileName); + #ifdef _WIN32 + _pclose(pPipe); + #else + pclose(pPipe); + #endif + goto Fail; } - strcat (PreProcessCmd, mOptions.VfrFileName), strcat (PreProcessCmd, " > "); - strcat (PreProcessCmd, mOptions.PreprocessorOutputFileName); - if (system (PreProcessCmd) != 0) { - DebugError (NULL, 0, 0003, "Error parsing file", "failed to spawn C preprocessor on VFR file %s\n", PreProcessCmd); + while (fgets(ReadBuf, sizeof(ReadBuf), pPipe) != NULL) { + fputs(ReadBuf, pOutFile); + } + + fclose(pOutFile); + pOutFile = NULL; + + #ifdef _WIN32 + RetVal = _pclose(pPipe); + #else + RetVal = pclose(pPipe); + #endif + pPipe = NULL; + + if (RetVal != 0) { + DebugError (NULL, 0, 0003, "Error parsing file", "C preprocessor returned non-zero exit status for VFR file %s\n", mOptions.VfrFileName); goto Fail; } - delete[] PreProcessCmd; + if (PreProcessCmd != NULL) { + delete[] PreProcessCmd; + } Out: SET_RUN_STATUS (STATUS_PREPROCESSED); return; Fail: + if (PreProcessCmd != NULL) { + delete[] PreProcessCmd; + } if (!IS_RUN_STATUS(STATUS_DEAD)) { SET_RUN_STATUS (STATUS_FAILED); } - delete[] PreProcessCmd; } extern UINT8 VfrParserStart (IN FILE *, IN INPUT_INFO_TO_SYNTAX *); diff --git a/BaseTools/Source/C/VolInfo/VolInfo.c b/BaseTools/Source/C/VolInfo/VolInfo.c index 428011ca046c..d145182e3370 100644 --- a/BaseTools/Source/C/VolInfo/VolInfo.c +++ b/BaseTools/Source/C/VolInfo/VolInfo.c @@ -39,6 +39,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include "ParseInf.h" #include "PeCoffLib.h" +#ifndef NATIVE_PATH_SEP +#ifdef _WIN32 +#define NATIVE_PATH_SEP '\\' +#else +#define NATIVE_PATH_SEP '/' +#endif +#endif + // // Utility global variables // @@ -141,7 +149,8 @@ EFI_STATUS CombinePath ( IN CHAR8* DefaultPath, IN CHAR8* AppendPath, - OUT CHAR8* NewPath + OUT CHAR8* NewPath, + IN size_t NewPathLen ); void @@ -335,12 +344,18 @@ Routine Description: // // We add quotes to the Openssl Path in case it has space characters // - OpenSslPath = malloc(2+strlen(OpenSslEnv)+strlen(OpenSslCommand)+1); + size_t need = strlen(OpenSslEnv) + strlen(OpenSslCommand) + 1 /*sep*/ + 2 /*quotes*/ + 1 /*NUL*/; + OpenSslPath = malloc(need); if (OpenSslPath == NULL) { Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!"); return GetUtilityStatus (); } - CombinePath(OpenSslEnv, OpenSslCommand, OpenSslPath); + if (CombinePath(OpenSslEnv, OpenSslCommand, OpenSslPath, need) != EFI_SUCCESS) { + free(OpenSslPath); + OpenSslPath = NULL; + Error (NULL, 0, 3001, "OpenSSL path combine failed", NULL); + return GetUtilityStatus(); + } } if (OpenSslPath == NULL){ Error (NULL, 0, 3000, "Open SSL command not available. Please verify PATH or set OPENSSL_PATH.", NULL); @@ -1665,29 +1680,21 @@ EFI_STATUS CombinePath ( IN CHAR8* DefaultPath, IN CHAR8* AppendPath, - OUT CHAR8* NewPath + OUT CHAR8* NewPath, + IN size_t NewPathLen ) { - UINT32 DefaultPathLen; - UINT64 Index; - CHAR8 QuotesStr[] = "\""; - strcpy(NewPath, QuotesStr); - DefaultPathLen = strlen(DefaultPath); - strcat(NewPath, DefaultPath); - Index = 0; - for (; Index < DefaultPathLen + 1; Index ++) { - if (NewPath[Index] == '\\' || NewPath[Index] == '/') { - if (NewPath[Index + 1] != '\0') { - NewPath[Index] = '/'; - } - } + if (NewPath == NULL || AppendPath == NULL) return EFI_INVALID_PARAMETER; + if (DefaultPath == NULL || DefaultPath[0] == '\0') { + if (snprintf(NewPath, NewPathLen, "%s", AppendPath) >= (int)NewPathLen) return EFI_ABORTED; + return EFI_SUCCESS; } - if (NewPath[Index -1] != '/') { - NewPath[Index] = '/'; - NewPath[Index + 1] = '\0'; + int needQuote = (strchr(DefaultPath, ' ') != NULL); + if (needQuote) { + if (snprintf(NewPath, NewPathLen, "\"%s%c%s\"", DefaultPath, NATIVE_PATH_SEP, AppendPath) >= (int)NewPathLen) return EFI_ABORTED; + } else { + if (snprintf(NewPath, NewPathLen, "%s%c%s", DefaultPath, NATIVE_PATH_SEP, AppendPath) >= (int)NewPathLen) return EFI_ABORTED; } - strcat(NewPath, AppendPath); - strcat(NewPath, QuotesStr); return EFI_SUCCESS; } From 9e1a3bb474c9722bee1199b0da301dad55b602d9 Mon Sep 17 00:00:00 2001 From: Cosmo Lai Date: Fri, 28 Nov 2025 18:00:51 +0800 Subject: [PATCH 0936/1172] BaseTools/Plugin/HostBasedUnitTestRunner: Merge clang coverage files For clang build, enable to generate coverage file under Build folder to merge coverage files of all module. Signed-off-by: Cosmo Lai --- .../HostBasedUnitTestRunner.py | 185 ++++++++---------- 1 file changed, 86 insertions(+), 99 deletions(-) diff --git a/BaseTools/Plugin/HostBasedUnitTestRunner/HostBasedUnitTestRunner.py b/BaseTools/Plugin/HostBasedUnitTestRunner/HostBasedUnitTestRunner.py index 54db93fcddac..92f309be7a26 100644 --- a/BaseTools/Plugin/HostBasedUnitTestRunner/HostBasedUnitTestRunner.py +++ b/BaseTools/Plugin/HostBasedUnitTestRunner/HostBasedUnitTestRunner.py @@ -224,7 +224,7 @@ def gen_code_coverage_gcc(self, thebuilder): logging.error("UnitTest Coverage: Failed generate all coverage file.") return 1 - # Generate and XML file if requested.for all package + # Generate and XML file if requested for all package if os.path.isfile(f"{workspace}/Build/coverage.xml"): os.remove(f"{workspace}/Build/coverage.xml") ret = RunCmd("lcov_cobertura",f"{workspace}/Build/all-coverage.info --excludes ^.*UnitTest\|^.*MU\|^.*Mock\|^.*DEBUG -o {workspace}/Build/coverage.xml") @@ -236,13 +236,18 @@ def gen_code_coverage_clang(self, thebuilder): logging.info("Generating UnitTest code coverage") buildOutputBase = thebuilder.env.GetValue("BUILD_OUTPUT_BASE") + workspace = thebuilder.env.GetValue("WORKSPACE") + if GetHostInfo().os.upper() == "LINUX": # Collect test executables with no file extension testList = glob.glob(os.path.join(buildOutputBase, "**", "*Test*"), recursive=True) testList = [f for f in testList if os.path.isfile(f) and os.path.splitext(f)[1] == ""] + allTestList = glob.glob(os.path.join(workspace, "Build", "**", "*Test*"), recursive=True) + allTestList = [f for f in allTestList if os.path.isfile(f) and os.path.splitext(f)[1] == ""] elif GetHostInfo().os.upper() == "WINDOWS": # Collect test executables with a .exe file extension testList = glob.glob(os.path.join(buildOutputBase, "**","*Test*.exe"), recursive=True) + allTestList = glob.glob(os.path.join(workspace, "Build", "**","*Test*.exe"), recursive=True) else: raise NotImplementedError("Unsupported Operating System") if not testList: @@ -251,117 +256,99 @@ def gen_code_coverage_clang(self, thebuilder): profrawlistFile = os.path.join(buildOutputBase, 'profrawlist.txt') mergedProfData = os.path.join(buildOutputBase, 'merged.profdata') + mergedCoverageLcov = os.path.join(buildOutputBase, 'coverage.lcov') mergedCoverageXml = os.path.join(buildOutputBase, 'coverage.xml') - with open(profrawlistFile, "w") as f: - f.write("\n".join(glob.glob(os.path.join(buildOutputBase, "**", "*.profraw"), recursive=True))) - # Generate coverage file - ret = RunCmd("llvm-profdata", f"merge -sparse --input-files {profrawlistFile} --output {mergedProfData}") - if ret != 0: - logging.error("UnitTest Coverage: Failed to merge coverage data.") + # Generate LCOV and XML file for each unit test executable + if self.clang_gen_profdata(buildOutputBase, profrawlistFile, mergedProfData) != 0: return 1 - # Generate and LCOV and XML file for each unit test executable for testFile in testList: - lcovFile = f"{testFile}.lcov" - ret = RunCmd("llvm-cov", f"export -format=lcov --instr-profile={mergedProfData} {testFile} > {lcovFile} ") - if ret != 0: - logging.error("UnitTest Coverage: Failed to generate coverage data for " + testFile) + if self.clang_gen_lcov_xml(mergedProfData, [testFile], f"{testFile}.coverage.lcov", f"{testFile}.coverage.xml") != 0: return 1 - coveragexmlFile = f"{testFile}.coverage.xml" - ret = RunCmd("lcov_cobertura",f"{lcovFile} -o {coveragexmlFile}") - if ret != 0: - logging.error("UnitTest Coverage: Failed generate filtered coverage XML.") - return 1 - # Merge all XML files - ret = self.merge_cobertura_xml_files([f"{testFile}.coverage.xml" for testFile in testList], mergedCoverageXml) - if ret != 0: - logging.error("UnitTest Coverage: Failed to merge coverage XML files.") + + # Generate LCOV and XML for the package + if self.clang_gen_lcov_xml(mergedProfData, testList, mergedCoverageLcov, mergedCoverageXml) != 0: return 1 + + allProfrawlistFile = os.path.join(workspace, 'Build', 'profrawlist.txt') + allMergedProfData = os.path.join(workspace, 'Build', 'merged.profdata') + allCoverageLcov = os.path.join(workspace, 'Build', 'coverage.lcov') + allCoverageXml = os.path.join(workspace, 'Build', 'coverage.xml') + + # Generate LCOV and XML for all packages + if self.clang_gen_profdata(workspace, allProfrawlistFile, allMergedProfData) != 0: + return 1 + if self.clang_gen_lcov_xml(allMergedProfData, allTestList, allCoverageLcov, allCoverageXml) != 0: + return 1 + return 0 - def merge_cobertura_xml_files(self, xml_file_list, output_file): + def clang_gen_profdata(self, basepath, output_profrawlistfile, output_profdata): + """ + Merge multiple LLVM profraw files into a single profdata file. """ - Merge multiple Cobertura XML files into a single output file. + if not os.path.isdir(basepath): + logging.error(f"clang_gen_profdata: Base path {basepath} is not a directory.") + return 1 + if not output_profrawlistfile: + logging.error("clang_gen_profdata: No profraw list file provided.") + return 1 + if not output_profdata: + logging.error("clang_gen_profdata: No output profdata file provided.") + return 1 + + for file in [output_profrawlistfile, output_profdata]: + if os.path.isfile(file): + os.remove(file) - Args: - xml_file_list (list): List of Cobertura XML file paths to merge. - output_file (str): Path to the merged output XML file. + with open(output_profrawlistfile, "w") as f: + f.write("\n".join(glob.glob(os.path.join(basepath, "**", "*.profraw"), recursive=True))) + ret = RunCmd("llvm-profdata", f"merge -sparse --input-files {output_profrawlistfile} --output {output_profdata}") + if ret != 0: + logging.error(f"clang_gen_profdata: Failed to merge coverage data for {basepath}.") + return 1 + return 0 + + def clang_gen_lcov_xml(self, profdata, testfiles, output_lcov, output_xml): + """ + Generate lcov coverage data from LLVM profdata and test files. """ - if not xml_file_list: - logging.warning("No Cobertura XML files provided for merging.") + if not profdata or not os.path.isfile(profdata): + logging.error(f"clang_gen_lcov_xml: Invalid profdata file provided. {profdata}") + return 1 + if not testfiles: + logging.error("clang_gen_lcov_xml: No test files provided.") + return 1 + if not output_lcov: + logging.error("clang_gen_lcov_xml: No output lcov file provided.") + return 1 + if not output_xml: + logging.error("clang_gen_lcov_xml: No output xml file provided.") return 1 - try: - # Parse the first file as the base - base_tree = xml.etree.ElementTree.parse(xml_file_list[0]) - base_root = base_tree.getroot() - base_packages = base_root.find("packages") - if base_packages is None: - base_packages = xml.etree.ElementTree.SubElement(base_root, "packages") - - # Merge the rest - for xml_file in xml_file_list[1:]: - tree = xml.etree.ElementTree.parse(xml_file) - root = tree.getroot() - packages = root.find("packages") - if packages is not None: - for package in packages.findall("package"): - base_packages.append(package) - - # Recalculate line-rate and branch-rate for the merged XML - lines_covered = 0 - lines_valid = 0 - branches_covered = 0 - branches_valid = 0 - - def parse_condition_coverage(cond_cov: str) -> int: - """ - Parse a condition-coverage string like '50% (1/2)'. - Returns the number of covered branches. - """ - try: - inside_parens = cond_cov.split("(", 1)[1].split(")", 1)[0] - covered, total = map(int, inside_parens.split("/")) - return covered - except Exception: - return 0 - - for package in base_packages.findall("package"): - for packageclass in package.findall("classes/class"): - lines = packageclass.find("lines") - if lines is None: - continue - for line in lines.findall("line"): - lines_valid += 1 - # line coverage - if "hits" in line.attrib and int(line.attrib["hits"]) > 0: - lines_covered += 1 - # branch coverage - if "branch" in line.attrib and line.attrib["branch"] == "true": - branches_valid += 1 - if "condition-coverage" in line.attrib: - # Example: "50% (1/2)" - branches_covered += parse_condition_coverage( - line.attrib["condition-coverage"] - ) - - def safe_rate(covered, valid): - return float(covered) / float(valid) if valid else 0.0 - - base_root.set("lines-covered", str(lines_covered)) - base_root.set("lines-valid", str(lines_valid)) - base_root.set("line-rate", str(safe_rate(lines_covered, lines_valid))) - base_root.set("branches-covered", str(branches_covered)) - base_root.set("branches-valid", str(branches_valid)) - base_root.set("branch-rate", str(safe_rate(branches_covered, branches_valid))) - - # Write merged XML - base_tree.write(output_file, encoding="utf-8", xml_declaration=True) - logging.info(f"Merged Cobertura XML written to {output_file}") - return 0 - except Exception as e: - logging.error(f"Failed to merge Cobertura XML files: {e}") + for file in [output_lcov, output_xml]: + if os.path.isfile(file): + os.remove(file) + + resp_file = output_lcov + ".rsp" + with open(resp_file, "w") as f: + f.write('\n-object\n'.join(testfiles)) + + # llvm-cov supports response file with '@' to pass list of object files. + # Use response file to avoid command line length limit. + ret = RunCmd("llvm-cov", f"export -format=lcov --instr-profile={profdata} @{resp_file} > {output_lcov}") + if ret != 0: + logging.error(f"clang_gen_lcov_xml: Failed to generate coverage lcov. {output_lcov}") return 1 + ret = RunCmd("lcov_cobertura",f"{output_lcov} --excludes ^.*UnitTest\|^.*MU\|^.*Mock\|^.*DEBUG -o {output_xml}") + if ret != 0: + logging.error(f"clang_gen_lcov_xml: Failed generate filtered coverage XML. {output_xml}") + return 1 + + if os.path.isfile(resp_file): + os.remove(resp_file) + + return 0 def gen_code_coverage_msvc(self, thebuilder): logging.info("Generating UnitTest code coverage") @@ -394,7 +381,7 @@ def gen_code_coverage_msvc(self, thebuilder): logging.error("UnitTest Coverage: Failed to collect coverage data.") return 1 - # Generate and XML file if requested.by each package + # Generate XML file if requested by each package ret = RunCmd( "OpenCppCoverage", f"--export_type cobertura:{os.path.join(buildOutputBase, 'coverage.xml')} " + From 1e3ea767281799f0f8938404836511e27a0791ca Mon Sep 17 00:00:00 2001 From: Dongyan Qian Date: Fri, 12 Dec 2025 14:39:54 +0800 Subject: [PATCH 0937/1172] UefiCpuPkg/CpuExceptionHandlerLib: Add LOONGARCH_IOCSR_MBUF3 RereadCount If the multi-core IPI trapping into an SMP_CALL_FUNCTION interrupt is used, then the Context will be allowed to be null. Cc: Chao Li Signed-off-by: Dongyan Qian --- .../LoongArch/LoongArch64/ArchExceptionHandler.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/LoongArch/LoongArch64/ArchExceptionHandler.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/LoongArch/LoongArch64/ArchExceptionHandler.c index 44ee9b917028..23cb20cdd3bd 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/LoongArch/LoongArch64/ArchExceptionHandler.c +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/LoongArch/LoongArch64/ArchExceptionHandler.c @@ -244,6 +244,7 @@ IpiInterruptHandler ( UINTN ResumeVector = 0; UINTN Parameter = 0; UINTN IpiStatus = 0; + UINT8 RereadCount = 10; IpiStatus = IoCsrRead32 (LOONGARCH_IOCSR_IPI_STATUS); @@ -277,7 +278,7 @@ IpiInterruptHandler ( // do { Parameter = IoCsrRead32 (LOONGARCH_IOCSR_MBUF3); - } while (!Parameter); + } while (!Parameter && --RereadCount); // // Get the parameter if populated. From 40849b8c4324b147e21a6287eccebb503bacfc2b Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Sun, 21 Dec 2025 16:47:32 -0800 Subject: [PATCH 0938/1172] ShellPkg/TftpDynamicCommand: Update BASE_NAME to follow code style Change BASE_NAME from "tftpDynamicCommand" to "TftpDynamicCommand" to follow code style for names. The use of 'T' in the directory name and INF file name and the use of 't' in BASE_NAME causes build failures on Linux platforms due to a mismatch in file/directory names in the build output directory. Following the code style resolves this issue. Signed-off-by: Michael D Kinney --- .../DynamicCommand/TftpDynamicCommand/TftpDynamicCommand.inf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ShellPkg/DynamicCommand/TftpDynamicCommand/TftpDynamicCommand.inf b/ShellPkg/DynamicCommand/TftpDynamicCommand/TftpDynamicCommand.inf index b0c8e8f84b6a..80495f26e61c 100644 --- a/ShellPkg/DynamicCommand/TftpDynamicCommand/TftpDynamicCommand.inf +++ b/ShellPkg/DynamicCommand/TftpDynamicCommand/TftpDynamicCommand.inf @@ -11,7 +11,7 @@ [Defines] INF_VERSION = 0x00010006 - BASE_NAME = tftpDynamicCommand + BASE_NAME = TftpDynamicCommand FILE_GUID = A487A478-51EF-48AA-8794-7BEE2A0562F1 MODULE_TYPE = DXE_DRIVER VERSION_STRING = 1.0 From 5eec446ba6854c77cdb2b982be4ca9bda4f902e2 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Sat, 6 Dec 2025 20:03:49 -0800 Subject: [PATCH 0939/1172] DynamicTablesPkg: Fix spelling issues Add "smcbios" to extended works in ci.yaml file and fix typos. Signed-off-by: Michael D Kinney --- DynamicTablesPkg/DynamicTablesPkg.ci.yaml | 3 ++- .../Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.c | 2 +- DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtUtility.h | 2 +- .../Library/FdtHwInfoParserLib/RiscV/Intc/RiscVExtIntcData.c | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/DynamicTablesPkg/DynamicTablesPkg.ci.yaml b/DynamicTablesPkg/DynamicTablesPkg.ci.yaml index e99da8a61804..2f5dccf2e62f 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.ci.yaml +++ b/DynamicTablesPkg/DynamicTablesPkg.ci.yaml @@ -149,7 +149,8 @@ "imsic", "imsics", "plics", - "rintc" + "rintc", + "smcbios" ], # words to extend to the dictionary for this package "IgnoreStandardPaths": [], # Standard Plugin defined paths that # should be ignore diff --git a/DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.c b/DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.c index 22bd0018a8da..49a40f1c7816 100644 --- a/DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.c +++ b/DynamicTablesPkg/Library/Common/Tpm2DeviceTableLib/Tpm2DeviceTableLib.c @@ -212,7 +212,7 @@ FixupTpm2DeviceInfo ( /** Build a SSDT table describing the TPM2 device. - The table created by this function must be freed by FreeSImpleTpm2DeviceTable. + The table created by this function must be freed by FreeSimpleTpm2DeviceTable. @param [in] TpmDevInfo TPM2 device info to describe in the SSDT table. @param [in] Name The Name to give to the Device. diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtUtility.h b/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtUtility.h index 73441ea7aa6a..c515891d507a 100644 --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtUtility.h +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtUtility.h @@ -512,7 +512,7 @@ FdtConvertToGsi ( @param [in] ExtIntcNode External interrupt controller node. @param [in] GsiBase GSI base of the interrupt controller. - @retval EFI_SUCCESS External interript controller node is added in the list. + @retval EFI_SUCCESS External interrupt controller node is added in the list. @retval EFI_OUT_OF_RESOURCES Failed to allocate memory for the list. **/ EFI_STATUS diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/Intc/RiscVExtIntcData.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/Intc/RiscVExtIntcData.c index 42a75d763f87..522f128d7385 100644 --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/Intc/RiscVExtIntcData.c +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/RiscV/Intc/RiscVExtIntcData.c @@ -42,7 +42,7 @@ STATIC LIST_ENTRY mExtIntcList; @param [in] ExtIntcNode External interrupt controller node. @param [in] GsiBase GSI base of the interrupt controller. - @retval EFI_SUCCESS External interript controller node is added in the list. + @retval EFI_SUCCESS External interrupt controller node is added in the list. @retval EFI_OUT_OF_RESOURCES Failed to allocate memory for the list. **/ EFI_STATUS From ec1ae4e55eddc634e038df120cf607388b164b15 Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Mon, 22 Dec 2025 17:12:05 +0000 Subject: [PATCH 0940/1172] .azurepipelines: Fix incorrect filename in comment For reference, this minor incorrect naming was present when file was added: https://github.com/tianocore/edk2/commit/357955173463b0a3c884ef9b5a9e8370e3d46f9a Signed-off-by: Mike Beaton --- .azurepipelines/templates/defaults.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.azurepipelines/templates/defaults.yml b/.azurepipelines/templates/defaults.yml index e94e6351cbb3..33d2e09a3957 100644 --- a/.azurepipelines/templates/defaults.yml +++ b/.azurepipelines/templates/defaults.yml @@ -1,5 +1,5 @@ ## @file -# File templates/default.yml +# File templates/defaults.yml # # template file containing common default values # From d57edbe06095f528035ea47977e3c12541023013 Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Mon, 22 Dec 2025 17:13:09 +0000 Subject: [PATCH 0941/1172] ArmVirtPkg: Fix incorrect filename in README For reference, this minor incorrect naming was present when the relevant line in the README was added: https://github.com/tianocore/edk2/commit/a6871b53599e2bf23bfa16adae638cc9a6f0755f Signed-off-by: Mike Beaton --- ArmVirtPkg/PlatformCI/ReadMe.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ArmVirtPkg/PlatformCI/ReadMe.md b/ArmVirtPkg/PlatformCI/ReadMe.md index b9196253d9c8..8ea880e18b40 100644 --- a/ArmVirtPkg/PlatformCI/ReadMe.md +++ b/ArmVirtPkg/PlatformCI/ReadMe.md @@ -35,7 +35,7 @@ available in this GitHub container registry feed [fedora-37-test](https://github.com/tianocore/containers/pkgs/container/containers%2Ffedora-37-test). The exact container version tested in CI is maintained in this file -[edk2/.azurepipelines/templates/default.yml](https://github.com/tianocore/edk2/blob/HEAD/.azurepipelines/templates/defaults.yml). +[edk2/.azurepipelines/templates/defaults.yml](https://github.com/tianocore/edk2/blob/HEAD/.azurepipelines/templates/defaults.yml). ## Building with Pytools for ArmVirtPkg From 8c8aea0e0aa728d8f891deae8645c6031a16d97d Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 22 Dec 2025 11:35:49 -0800 Subject: [PATCH 0942/1172] UnitTestFrameworkPkg/UnitTestLib: Fix printf() error from clang Update UnitTestLib to not pass UnitTest->Log as the format string to printf(). If UnitTest->Log contains any printf() format specifiers, then printf() will look for arguments that are not present and will read beyond the stack frame. Change use of printf() to an fwrite() to stdout followed by an fflush() to stdout. Signed-off-by: Michael D Kinney --- UnitTestFrameworkPkg/Library/UnitTestLib/RunTestsCmocka.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/UnitTestFrameworkPkg/Library/UnitTestLib/RunTestsCmocka.c b/UnitTestFrameworkPkg/Library/UnitTestLib/RunTestsCmocka.c index 5788a75b7f48..68432731cd45 100644 --- a/UnitTestFrameworkPkg/Library/UnitTestLib/RunTestsCmocka.c +++ b/UnitTestFrameworkPkg/Library/UnitTestLib/RunTestsCmocka.c @@ -117,7 +117,8 @@ CmockaUnitTestTeardownFunctionRunner ( // printf ("UnitTest: %s - %s\n", UnitTest->Name, UnitTest->Description); printf ("Log Output Start\n"); - printf (UnitTest->Log); + fwrite (UnitTest->Log, 1, strlen (UnitTest->Log), stdout); + fflush (stdout); printf ("Log Output End\n"); } From d29ff296fb7a07d7b7f200684078cb6d69ae2bf9 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 22 Dec 2025 11:38:42 -0800 Subject: [PATCH 0943/1172] UnitTestFrameworkPkg/UnitTestDebugAssertLibHost: Fix clang error Fix error reported by clang in UnitTestDebugAssertLibHost that the function snprintf() is undefined. Add include of to resolve error. Signed-off-by: Michael D Kinney --- .../UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.cpp b/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.cpp index 8ed7c0988c6c..54bbc3ca80ee 100644 --- a/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.cpp +++ b/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.cpp @@ -17,6 +17,7 @@ extern "C" { #include #include #include + #include // // If address sanitizer is enabled, then declare the function that is used to From 8635ea07be4231b005bd3febf751f885f8417193 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 8 Dec 2025 11:46:25 -0800 Subject: [PATCH 0944/1172] SecurityPkg/Library/SecureBootVariableLib/UnitTest: Fix CLANG Fix uninitialized variable error in unit tests detected by clang by zeroing local variable structure before use in unit test cases. Signed-off-by: Michael D Kinney --- .../UnitTest/SecureBootVariableLibUnitTest.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SecurityPkg/Library/SecureBootVariableLib/UnitTest/SecureBootVariableLibUnitTest.c b/SecurityPkg/Library/SecureBootVariableLib/UnitTest/SecureBootVariableLibUnitTest.c index 386a79c2abb5..a867ee586f78 100644 --- a/SecurityPkg/Library/SecureBootVariableLib/UnitTest/SecureBootVariableLibUnitTest.c +++ b/SecurityPkg/Library/SecureBootVariableLib/UnitTest/SecureBootVariableLibUnitTest.c @@ -1342,6 +1342,8 @@ SetSecureBootVariablesShouldStopWhenSecure ( UINT8 TargetMode = SECURE_BOOT_MODE_ENABLE; SECURE_BOOT_PAYLOAD_INFO PayloadInfo; + ZeroMem (&PayloadInfo, sizeof (PayloadInfo)); + expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); expect_value (MockGetVariable, *DataSize, 0); From 9fa1a35e56e028c786ebbf295bac769ed2559b9f Mon Sep 17 00:00:00 2001 From: Jeremy Compostella Date: Tue, 23 Dec 2025 10:24:31 -0800 Subject: [PATCH 0945/1172] MdeModulePkg/Universal/DebugServicePei: Correct function and entry point Correct a typographical error in the DebugServicePei module by renaming the function and entry point from DebugSerivceInitialize to DebugServiceInitialize in both the C source file and the INF configuration file. Signed-off-by: Jeremy Compostella --- MdeModulePkg/Universal/DebugServicePei/DebugServicePei.c | 2 +- MdeModulePkg/Universal/DebugServicePei/DebugServicePei.inf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Universal/DebugServicePei/DebugServicePei.c b/MdeModulePkg/Universal/DebugServicePei/DebugServicePei.c index cc3257e5ae44..219a0404e5df 100644 --- a/MdeModulePkg/Universal/DebugServicePei/DebugServicePei.c +++ b/MdeModulePkg/Universal/DebugServicePei/DebugServicePei.c @@ -84,7 +84,7 @@ PeiDebugAssert ( **/ EFI_STATUS EFIAPI -DebugSerivceInitialize ( +DebugServiceInitialize ( IN EFI_PEI_FILE_HANDLE FileHandle, IN CONST EFI_PEI_SERVICES **PeiServices ) diff --git a/MdeModulePkg/Universal/DebugServicePei/DebugServicePei.inf b/MdeModulePkg/Universal/DebugServicePei/DebugServicePei.inf index eb76af03433c..91b35b187040 100644 --- a/MdeModulePkg/Universal/DebugServicePei/DebugServicePei.inf +++ b/MdeModulePkg/Universal/DebugServicePei/DebugServicePei.inf @@ -17,7 +17,7 @@ MODULE_TYPE = PEIM VERSION_STRING = 1.0 - ENTRY_POINT = DebugSerivceInitialize + ENTRY_POINT = DebugServiceInitialize # # The following information is for reference only and not required by the build tools. From 79fdd2b82af96963cd38d157494df1668f16a281 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Tue, 16 Dec 2025 12:33:10 -0800 Subject: [PATCH 0946/1172] BaseTools: GNUMakefiles must use CMD.EXE in Windows Use $(OS) in all GNUMakefiles to detect if the GNUMakefile is being used in a Windows OS. If a Windows OS is detected, then override SHELL to use cmd.exe. This prevents make utility from using sh.exe if sh.exe happens to be in PATH. If sh.exe is used, then backslash (\) characters in file paths are removed and builds break for files not found. Signed-off-by: Michael D Kinney --- BaseTools/Source/C/DevicePath/GNUmakefile | 2 +- BaseTools/Source/C/GNUmakefile | 2 +- BaseTools/Source/C/Makefiles/app.makefile | 4 ++-- BaseTools/Source/C/Makefiles/header.makefile | 10 +++++----- BaseTools/Source/C/VfrCompile/GNUmakefile | 4 ++-- BaseTools/Source/C/VfrCompile/Pccts/antlr/makefile | 6 +++--- BaseTools/Source/C/VfrCompile/Pccts/dlg/makefile | 2 +- BaseTools/Source/Python/AutoGen/GenMake.py | 10 +++++++++- BaseTools/Tests/GNUmakefile | 2 +- 9 files changed, 25 insertions(+), 17 deletions(-) diff --git a/BaseTools/Source/C/DevicePath/GNUmakefile b/BaseTools/Source/C/DevicePath/GNUmakefile index 40cf277b34c2..a792d8e82545 100644 --- a/BaseTools/Source/C/DevicePath/GNUmakefile +++ b/BaseTools/Source/C/DevicePath/GNUmakefile @@ -13,7 +13,7 @@ OBJECTS = DevicePath.o UefiDevicePathLib.o DevicePathFromText.o DevicePathUtili include $(MAKEROOT)/Makefiles/app.makefile -ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) +ifeq (Windows, $(findstring Windows,$(OS))) GCCVERSION := $(shell for /f "tokens=1 delims=." %%a in ("$(shell $(CC) -dumpversion)") do echo %%a) else GCCVERSION := $(shell $(CC) -dumpversion | awk -F'.' '{print $$1}') diff --git a/BaseTools/Source/C/GNUmakefile b/BaseTools/Source/C/GNUmakefile index 0ea314ef9623..59cde7b208d1 100644 --- a/BaseTools/Source/C/GNUmakefile +++ b/BaseTools/Source/C/GNUmakefile @@ -6,7 +6,7 @@ # SPDX-License-Identifier: BSD-2-Clause-Patent # -ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) +ifeq (Windows, $(findstring Windows,$(OS))) SHELL := cmd.exe MAKEROOT := $(shell echo %CD%) else diff --git a/BaseTools/Source/C/Makefiles/app.makefile b/BaseTools/Source/C/Makefiles/app.makefile index 0ad1378e3290..b66e564b3bcf 100644 --- a/BaseTools/Source/C/Makefiles/app.makefile +++ b/BaseTools/Source/C/Makefiles/app.makefile @@ -16,7 +16,7 @@ all: $(MAKEROOT)/bin $(APPLICATION) $(APPLICATION): $(OBJECTS) $(LINKER) -o $(APPLICATION) $(LDFLAGS) $(OBJECTS) -L$(MAKEROOT)/libs $(LIBS) -ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) +ifeq (Windows, $(findstring Windows,$(OS))) $(CP) $(APPLICATION).exe $(BIN_PATH) endif @@ -25,7 +25,7 @@ $(OBJECTS): $(MAKEROOT)/Include/Common/BuildVersion.h clean: appClean appClean: -ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) +ifeq (Windows, $(findstring Windows,$(OS))) $(RM) $(BIN_PATH)/$(APPNAME).exe endif diff --git a/BaseTools/Source/C/Makefiles/header.makefile b/BaseTools/Source/C/Makefiles/header.makefile index 53e73abe5335..d63f487724a5 100644 --- a/BaseTools/Source/C/Makefiles/header.makefile +++ b/BaseTools/Source/C/Makefiles/header.makefile @@ -8,7 +8,7 @@ # SPDX-License-Identifier: BSD-2-Clause-Patent # Set SEP to the platform specific path separator -ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) +ifeq (Windows, $(findstring Windows,$(OS))) SHELL := cmd.exe SEP:=$(shell echo \) else @@ -17,7 +17,7 @@ endif EDK2_PATH ?= $(MAKEROOT)/../../.. ifndef PYTHON_COMMAND - ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) + ifeq (Windows, $(findstring Windows,$(OS))) # # Try using the Python Launcher for Windows to find an interpreter. # @@ -71,7 +71,7 @@ ifndef HOST_ARCH # try to figure out the appropriate HOST_ARCH. # GET_GNU_HOST_ARCH_PY:=$(MAKEROOT)$(SEP)Makefiles$(SEP)GnuMakeUtils.py get_host_arch - ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) + ifeq (Windows, $(findstring Windows,$(OS))) HOST_ARCH:=$(shell if defined PYTHON_COMMAND $(PYTHON_COMMAND) $(GET_GNU_HOST_ARCH_PY)) else HOST_ARCH:=$(shell if command -v $(PYTHON_COMMAND) >/dev/null 1; then $(PYTHON_COMMAND) $(GET_GNU_HOST_ARCH_PY); else python $(GET_GNU_HOST_ARCH_PY); fi) @@ -90,7 +90,7 @@ ifndef HOST_ARCH endif #Set up BaseTools binary path for Windows builds -ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) +ifeq (Windows, $(findstring Windows,$(OS))) ifndef BIN_PATH BIN_PATH_BASE=$(MAKEROOT)/../../Bin ifeq ($(HOST_ARCH),X64) @@ -211,6 +211,6 @@ $(MAKEROOT)/libs: $(MAKEROOT)/bin: $(MD) $(MAKEROOT)/bin -ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) +ifeq (Windows, $(findstring Windows,$(OS))) $(MD) $(BIN_PATH) endif diff --git a/BaseTools/Source/C/VfrCompile/GNUmakefile b/BaseTools/Source/C/VfrCompile/GNUmakefile index ad6c3508761f..b469bd3f303f 100644 --- a/BaseTools/Source/C/VfrCompile/GNUmakefile +++ b/BaseTools/Source/C/VfrCompile/GNUmakefile @@ -46,7 +46,7 @@ all: $(MAKEROOT)/bin $(APPLICATION) $(APPLICATION): $(OBJECTS) $(LINKER) -o $(APPLICATION) $(VFR_LFLAGS) $(OBJECTS) -L$(MAKEROOT)/libs $(LIBS) -ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) +ifeq (Windows, $(findstring Windows,$(OS))) $(CP) $(APPLICATION).exe $(BIN_PATH) endif @@ -84,6 +84,6 @@ localClean: $(MAKE) -C Pccts/antlr clean $(MAKE) -C Pccts/dlg clean $(RM) $(EXTRA_CLEAN_OBJECTS) -ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) +ifeq (Windows, $(findstring Windows,$(OS))) $(RM) $(BIN_PATH)/$(APPNAME).exe endif diff --git a/BaseTools/Source/C/VfrCompile/Pccts/antlr/makefile b/BaseTools/Source/C/VfrCompile/Pccts/antlr/makefile index 87eedf3cf755..ca0783b52ef3 100644 --- a/BaseTools/Source/C/VfrCompile/Pccts/antlr/makefile +++ b/BaseTools/Source/C/VfrCompile/Pccts/antlr/makefile @@ -8,7 +8,7 @@ # company may do whatever they wish with source code distributed with # PCCTS or the code generated by PCCTS, including the incorporation of # PCCTS, or its output, into commerical software. -# +# # We encourage users to develop software with PCCTS. However, we do ask # that credit is given to us for developing PCCTS. By "credit", # we mean that if you incorporate our source code into one of your @@ -159,7 +159,7 @@ PCCTS_H=../h #set.$(OBJ_EXT): $(SET)/set.c # $(CC) $(CFLAGS) -c $(OUT_OBJ)set.$(OBJ_EXT) $(SET)/set.c -ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) +ifeq (Windows, $(findstring Windows,$(OS))) SHELL := cmd.exe SEP := $(shell echo \) RM := del /f /q @@ -211,7 +211,7 @@ scan.o : scan.c mode.h tokens.h set.o : $(SET)/set.c $(CC) $(CFLAGS) -c -o set.o $(SET)/set.c -%.o : %.c +%.o : %.c $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ # diff --git a/BaseTools/Source/C/VfrCompile/Pccts/dlg/makefile b/BaseTools/Source/C/VfrCompile/Pccts/dlg/makefile index e56b69041ee1..303ebe43f246 100644 --- a/BaseTools/Source/C/VfrCompile/Pccts/dlg/makefile +++ b/BaseTools/Source/C/VfrCompile/Pccts/dlg/makefile @@ -114,7 +114,7 @@ PCCTS_H=../h # # UNIX # -ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) +ifeq (Windows, $(findstring Windows,$(OS))) SHELL := cmd.exe SEP := $(shell echo \) RM := del /f /q diff --git a/BaseTools/Source/Python/AutoGen/GenMake.py b/BaseTools/Source/Python/AutoGen/GenMake.py index e5f282c4acce..b729103efd8a 100755 --- a/BaseTools/Source/Python/AutoGen/GenMake.py +++ b/BaseTools/Source/Python/AutoGen/GenMake.py @@ -98,10 +98,18 @@ def getMakefileName(self): # ''' + ## Fixed header string for makefile + _GMAKE_MAKEFILE_HEADER = ''' +ifeq (Windows, $(findstring Windows,$(OS))) + SHELL := cmd.exe +endif + ''' + + ## Header string for each type of build file _FILE_HEADER_ = { NMAKE_FILETYPE : _MAKEFILE_HEADER % _FILE_NAME_[NMAKE_FILETYPE], - GMAKE_FILETYPE : _MAKEFILE_HEADER % _FILE_NAME_[GMAKE_FILETYPE] + GMAKE_FILETYPE : (_MAKEFILE_HEADER + _GMAKE_MAKEFILE_HEADER) % _FILE_NAME_[GMAKE_FILETYPE] } ## shell commands which can be used in build file in the form of macro diff --git a/BaseTools/Tests/GNUmakefile b/BaseTools/Tests/GNUmakefile index e62afe0abda4..2ff3b77e063d 100644 --- a/BaseTools/Tests/GNUmakefile +++ b/BaseTools/Tests/GNUmakefile @@ -8,7 +8,7 @@ all: test ifndef PYTHON_COMMAND - ifeq (Windows, $(findstring Windows,$(MAKE_HOST))) + ifeq (Windows, $(findstring Windows,$(OS))) SHELL := cmd.exe MAKEROOT := $(shell echo %CD%) SEP:=$(shell echo \) From 55be609c09f86e7144ae6a9886b32dfd79d08567 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 19 Dec 2025 16:45:55 -0800 Subject: [PATCH 0947/1172] CryptoPkg/Library/OpensslLib: Undefined _MSC_VER for GCC Family Update GCC Family to undefined _MSC_VER to match settings used by other compilers. This addresses clang compatibility issues for host-based unit test builds. Signed-off-by: Michael D Kinney --- CryptoPkg/Library/OpensslLib/OpensslLib.inf | 4 ++-- CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf | 4 ++-- CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf | 4 ++-- CryptoPkg/Library/OpensslLib/OpensslLibFull.inf | 4 ++-- CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/CryptoPkg/Library/OpensslLib/OpensslLib.inf b/CryptoPkg/Library/OpensslLib/OpensslLib.inf index e633d44bcbd4..ec945175dcb1 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLib.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLib.inf @@ -774,8 +774,8 @@ # -Werror=unused-but-set-variable: Warn whenever a local variable is assigned to, but otherwise unused (aside from its declaration). # GCC:RELEASE_*_*_CC_FLAGS = -DNDEBUG - GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable - GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS + GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable + GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS GCC:*_*_AARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable -Wno-error=format GCC:*_*_RISCV64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf index e5543276e437..4fc17cee16c7 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf @@ -2227,8 +2227,8 @@ # types appropriate to the format string specified. # -Werror=unused-but-set-variable: Warn whenever a local variable is assigned to, but otherwise unused (aside from its declaration). # - GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable - GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS + GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable + GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS GCC:*_CLANGDWARF_*_CC_FLAGS = -std=gnu99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize GCC:*_CLANGPDB_*_CC_FLAGS = -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize -Wno-error=unused-function # Revisit after switching to 3.0 branch diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf index 4269228562f1..63c913a88606 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf @@ -724,8 +724,8 @@ # -Werror=unused-but-set-variable: Warn whenever a local variable is assigned to, but otherwise unused (aside from its declaration). # GCC:RELEASE_*_*_CC_FLAGS = -DNDEBUG - GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable - GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS + GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable + GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS GCC:*_*_AARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable -Wno-error=format GCC:*_*_RISCV64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf index 9408d0924779..ad60744e18cd 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf @@ -830,8 +830,8 @@ # types appropriate to the format string specified. # -Werror=unused-but-set-variable: Warn whenever a local variable is assigned to, but otherwise unused (aside from its declaration). # - GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable - GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS + GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable + GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS GCC:*_*_AARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable -Wno-error=format GCC:*_*_RISCV64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf index 0a0673094bec..0ebbddd79655 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf @@ -2388,8 +2388,8 @@ # types appropriate to the format string specified. # -Werror=unused-but-set-variable: Warn whenever a local variable is assigned to, but otherwise unused (aside from its declaration). # - GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable - GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS + GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable + GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS GCC:*_CLANGDWARF_*_CC_FLAGS = -std=gnu99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize GCC:*_CLANGPDB_*_CC_FLAGS = -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize -Wno-error=unused-function # Revisit after switching to 3.0 branch From 16669a19615714ae572b8240b319476342d550be Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Sun, 7 Dec 2025 08:47:15 -0800 Subject: [PATCH 0948/1172] CryptoPkg/Library/MbedTlsLib: Undefined _MSC_VER for GCC Family Update GCC Family to undefined _MSC_VER to match settings used by other compilers. This addresses clang compatibility issues for host-based unit test builds. Signed-off-by: Michael D Kinney --- CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf | 4 ++-- CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf b/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf index bc78fc2d997f..2498ac38a176 100644 --- a/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf +++ b/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf @@ -127,8 +127,8 @@ # types appropriate to the format string specified. # -Werror=unused-but-set-variable: Warn whenever a local variable is assigned to, but otherwise unused (aside from its declaration). # - GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable - GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS + GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable + GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS GCC:*_*_AARCH64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable -Wno-error=format GCC:*_*_RISCV64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable diff --git a/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf b/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf index 3dd8303864cc..8485f9920a1b 100644 --- a/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf +++ b/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf @@ -132,8 +132,8 @@ # types appropriate to the format string specified. # -Werror=unused-but-set-variable: Warn whenever a local variable is assigned to, but otherwise unused (aside from its declaration). # - GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable - GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS + GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable + GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS GCC:*_*_AARCH64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable -Wno-error=format GCC:*_*_RISCV64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable From 17cb2f90b62b0840f75099ccaba4b8b50e9e2ead Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Sun, 7 Dec 2025 12:03:39 -0800 Subject: [PATCH 0949/1172] MdeModulePkg/BrotliCustomDecompressLib: Undefine _MSC_VER for GCC Update GCC Family to undefined _MSC_VER to match settings used by other compilers. This addresses clang compatibility issues for host-based unit test builds. Signed-off-by: Michael D Kinney --- .../BrotliCustomDecompressLib/BrotliCustomDecompressLib.inf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MdeModulePkg/Library/BrotliCustomDecompressLib/BrotliCustomDecompressLib.inf b/MdeModulePkg/Library/BrotliCustomDecompressLib/BrotliCustomDecompressLib.inf index d07163ec7207..bb2e8f19cd96 100644 --- a/MdeModulePkg/Library/BrotliCustomDecompressLib/BrotliCustomDecompressLib.inf +++ b/MdeModulePkg/Library/BrotliCustomDecompressLib/BrotliCustomDecompressLib.inf @@ -78,3 +78,6 @@ DebugLib BaseMemoryLib ExtractGuidedSectionLib + +[BuildOptions] + GCC:*_*_*_CC_FLAGS = -U_MSC_VER From 8592546f66fb5b4766d21e25f9c4b95be1811b22 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 19 Dec 2025 16:50:35 -0800 Subject: [PATCH 0950/1172] BaseTools/Conf: Remove -U _MSC_VER from CLANGPDB Remove -U _MSC_VER from CLANGPDB tool chain in tools_def.template. _MSC_VER should only be undefined in specific components that require it to be undefined. -U _MSC_VER in tools_def.txt for CLANGPDB breaks host-based unit test builds on Windows. Signed-off-by: Michael D Kinney --- BaseTools/Conf/tools_def.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index d19624fa4628..aaff2c308d1f 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -1665,7 +1665,7 @@ DEFINE CLANGPDB_IA32_TARGET = -target i686-pc-windows-msvc DEFINE CLANGPDB_X64_TARGET = -target x86_64-pc-windows-msvc DEFINE CLANGPDB_WARNING_OVERRIDES = -Wno-parentheses-equality -Wno-tautological-compare -Wno-tautological-constant-out-of-range-compare -Wno-empty-body -Wno-unused-const-variable -Wno-varargs -Wno-unknown-warning-option -Wno-unused-but-set-variable -Wno-unused-const-variable -Wno-unaligned-access -Wno-microsoft-enum-forward-reference -DEFINE CLANGPDB_ALL_CC_FLAGS = DEF(GCC48_ALL_CC_FLAGS) DEF(CLANGPDB_WARNING_OVERRIDES) -fno-stack-protector -funsigned-char -ftrap-function=undefined_behavior_has_been_optimized_away_by_clang -Wno-address -Wno-shift-negative-value -Wno-unknown-pragmas -Wno-incompatible-library-redeclaration -Wno-null-dereference -mno-implicit-float -mms-bitfields -mno-stack-arg-probe -fno-omit-frame-pointer -U _MSC_VER -D __GNUC__=4 -D __GNUC_MINOR__=2 -D __GNUC_PATCHLEVEL__=1 -D __MINGW32__=1 +DEFINE CLANGPDB_ALL_CC_FLAGS = DEF(GCC48_ALL_CC_FLAGS) DEF(CLANGPDB_WARNING_OVERRIDES) -fno-stack-protector -funsigned-char -ftrap-function=undefined_behavior_has_been_optimized_away_by_clang -Wno-address -Wno-shift-negative-value -Wno-unknown-pragmas -Wno-incompatible-library-redeclaration -Wno-null-dereference -mno-implicit-float -mms-bitfields -mno-stack-arg-probe -fno-omit-frame-pointer -D __GNUC__=4 -D __GNUC_MINOR__=2 -D __GNUC_PATCHLEVEL__=1 -D __MINGW32__=1 ########################### # CLANGPDB IA32 definitions From e6fa2e32689bd6b0de5908da89a3cfd31c806345 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 19 Dec 2025 16:53:32 -0800 Subject: [PATCH 0951/1172] UnitTestFrameworkPkg/Include/Library: Remove _MSC_VER workaround Remove workaround to define _MSC_VER when it is not defined when building with clang on Windows. This workaround was required when CLANGPDB undefined _MSC_VER in tools_def.txt. With -U _MSC_VER removed from tools_def.txt, this workaround for host-based unit test builds is no longer required. Signed-off-by: Michael D Kinney --- UnitTestFrameworkPkg/Include/Library/GoogleTestLib.h | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/UnitTestFrameworkPkg/Include/Library/GoogleTestLib.h b/UnitTestFrameworkPkg/Include/Library/GoogleTestLib.h index a3a8cf1cb811..b6850c9ffb8a 100644 --- a/UnitTestFrameworkPkg/Include/Library/GoogleTestLib.h +++ b/UnitTestFrameworkPkg/Include/Library/GoogleTestLib.h @@ -9,16 +9,6 @@ #ifndef GOOGLE_TEST_LIB_H_ #define GOOGLE_TEST_LIB_H_ -// -// For Windows/clang builds if _MSC_VER is not defined, then set to -// Visual Studio 2015 value of 1900 -// -#if defined (__clang__) && defined (_WIN32) - #ifndef _MSC_VER -#define _MSC_VER 1900 - #endif -#endif - #include #include #include From 1e1edf4d6cd41f6539808c85cc5220f211a4206f Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Sun, 21 Dec 2025 10:54:39 -0800 Subject: [PATCH 0952/1172] MdePkg/Library/BaseLib: Use PcdControlFlowEnforcementPropertyMask as fixed Always access PcdControlFlowEnforcementPropertyMask using FixedPcdGet() in NASM source files and update INFs to correctly declare that PcdControlFlowEnforcementPropertyMask is always accessed as a Fixed PCD. PcdControlFlowEnforcementPropertyMask is declared in MdePkg.dec in the [PcdsFixedAtBuild] section, so this PCD does not support any other PCD access types. This change resolves ld warnings from GCC and CLANGDWARF builds for relocations in read-only text sections because use of PcdGet() in NASM source files reads the value into eax from the memory location of a const global variable that requires a relocation fixup. By changing PcdGet() to FixedPcdGet(), eax is loaded with an immediate value known at build time and no relocation fixups for PcdControlFlowEnforcementPropertyMask are required. Signed-off-by: Michael D Kinney --- MdePkg/Library/BaseLib/BaseLib.inf | 4 +++- MdePkg/Library/BaseLib/Ia32/LongJump.nasm | 2 +- MdePkg/Library/BaseLib/Ia32/SetJump.nasm | 2 +- MdePkg/Library/BaseLib/UnitTestHostBaseLib.inf | 4 +++- MdePkg/Library/BaseLib/X64/LongJump.nasm | 2 +- MdePkg/Library/BaseLib/X64/SetJump.nasm | 2 +- 6 files changed, 10 insertions(+), 6 deletions(-) diff --git a/MdePkg/Library/BaseLib/BaseLib.inf b/MdePkg/Library/BaseLib/BaseLib.inf index b4d3d084a95f..b3ced777ad5b 100644 --- a/MdePkg/Library/BaseLib/BaseLib.inf +++ b/MdePkg/Library/BaseLib/BaseLib.inf @@ -428,8 +428,10 @@ gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength ## SOMETIMES_CONSUMES gEfiMdePkgTokenSpaceGuid.PcdMaximumAsciiStringLength ## SOMETIMES_CONSUMES gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength ## SOMETIMES_CONSUMES - gEfiMdePkgTokenSpaceGuid.PcdControlFlowEnforcementPropertyMask ## SOMETIMES_CONSUMES gEfiMdePkgTokenSpaceGuid.PcdSpeculationBarrierType ## SOMETIMES_CONSUMES +[FixedPcd] + gEfiMdePkgTokenSpaceGuid.PcdControlFlowEnforcementPropertyMask ## SOMETIMES_CONSUMES + [FeaturePcd] gEfiMdePkgTokenSpaceGuid.PcdVerifyNodeInList ## CONSUMES diff --git a/MdePkg/Library/BaseLib/Ia32/LongJump.nasm b/MdePkg/Library/BaseLib/Ia32/LongJump.nasm index 6c13dfe307d7..ecdda785e22d 100644 --- a/MdePkg/Library/BaseLib/Ia32/LongJump.nasm +++ b/MdePkg/Library/BaseLib/Ia32/LongJump.nasm @@ -30,7 +30,7 @@ extern ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask)) global ASM_PFX(InternalLongJump) ASM_PFX(InternalLongJump): - mov eax, [ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))] + mov eax, FixedPcdGet32 (PcdControlFlowEnforcementPropertyMask) test eax, eax jz CetDone mov eax, cr4 diff --git a/MdePkg/Library/BaseLib/Ia32/SetJump.nasm b/MdePkg/Library/BaseLib/Ia32/SetJump.nasm index 257737324120..4fe1b0fa9476 100644 --- a/MdePkg/Library/BaseLib/Ia32/SetJump.nasm +++ b/MdePkg/Library/BaseLib/Ia32/SetJump.nasm @@ -38,7 +38,7 @@ ASM_PFX(SetJump): xor eax, eax mov [edx + 24], eax ; save 0 to SSP - mov eax, [ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))] + mov eax, FixedPcdGet32 (PcdControlFlowEnforcementPropertyMask) test eax, eax jz CetDone mov eax, cr4 diff --git a/MdePkg/Library/BaseLib/UnitTestHostBaseLib.inf b/MdePkg/Library/BaseLib/UnitTestHostBaseLib.inf index 776c7ccb6766..74eec7355537 100644 --- a/MdePkg/Library/BaseLib/UnitTestHostBaseLib.inf +++ b/MdePkg/Library/BaseLib/UnitTestHostBaseLib.inf @@ -222,8 +222,10 @@ gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength ## SOMETIMES_CONSUMES gEfiMdePkgTokenSpaceGuid.PcdMaximumAsciiStringLength ## SOMETIMES_CONSUMES gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength ## SOMETIMES_CONSUMES - gEfiMdePkgTokenSpaceGuid.PcdControlFlowEnforcementPropertyMask ## SOMETIMES_CONSUMES gEfiMdePkgTokenSpaceGuid.PcdSpeculationBarrierType ## SOMETIMES_CONSUMES +[FixedPcd] + gEfiMdePkgTokenSpaceGuid.PcdControlFlowEnforcementPropertyMask ## SOMETIMES_CONSUMES + [FeaturePcd] gEfiMdePkgTokenSpaceGuid.PcdVerifyNodeInList ## CONSUMES diff --git a/MdePkg/Library/BaseLib/X64/LongJump.nasm b/MdePkg/Library/BaseLib/X64/LongJump.nasm index 2002f65cba57..665c59d71122 100644 --- a/MdePkg/Library/BaseLib/X64/LongJump.nasm +++ b/MdePkg/Library/BaseLib/X64/LongJump.nasm @@ -31,7 +31,7 @@ extern ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask)) global ASM_PFX(InternalLongJump) ASM_PFX(InternalLongJump): - mov eax, [ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))] + mov eax, FixedPcdGet32 (PcdControlFlowEnforcementPropertyMask) test eax, eax jz CetDone mov rax, cr4 diff --git a/MdePkg/Library/BaseLib/X64/SetJump.nasm b/MdePkg/Library/BaseLib/X64/SetJump.nasm index 5943a5ebe59f..7d109aa1710e 100644 --- a/MdePkg/Library/BaseLib/X64/SetJump.nasm +++ b/MdePkg/Library/BaseLib/X64/SetJump.nasm @@ -40,7 +40,7 @@ ASM_PFX(SetJump): xor rax, rax mov [rcx + 0xF8], rax ; save 0 to SSP - mov eax, [ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))] + mov eax, FixedPcdGet32 (PcdControlFlowEnforcementPropertyMask) test eax, eax jz CetDone mov rax, cr4 From 7ca8b1b4c7b5c1f0c96485acdf5ee2d6c98ff27e Mon Sep 17 00:00:00 2001 From: "Black.Li" Date: Wed, 10 Dec 2025 11:31:01 +0800 Subject: [PATCH 0953/1172] MdeModulePkg/UfsPassThruDxe:Fix Ufs DM Command issue After Execute UFS SCSI Commands, the Trd->PRDTL is dirty. It will cause issue when next UFS DM Command is executed. According to UFSHCI Spec, for UFS DeviceManagement function Trd->PRDTL must be set to Zero. Signed-off-by: Black.Li --- MdeModulePkg/Bus/Ufs/UfsBlockIoPei/UfsHci.c | 3 +++ MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/MdeModulePkg/Bus/Ufs/UfsBlockIoPei/UfsHci.c b/MdeModulePkg/Bus/Ufs/UfsBlockIoPei/UfsHci.c index 88798919af44..805037e94297 100644 --- a/MdeModulePkg/Bus/Ufs/UfsBlockIoPei/UfsHci.c +++ b/MdeModulePkg/Bus/Ufs/UfsBlockIoPei/UfsHci.c @@ -606,6 +606,9 @@ UfsCreateDMCommandDesc ( Trd->RuO = (UINT16)DivU64x32 ((UINT64)ROUNDUP8 (sizeof (UTP_QUERY_REQ_UPIU)), sizeof (UINT32)); } + // UFS DM Command, PRDT Length must be Zero. + Trd->PrdtL = 0x00; + return EFI_SUCCESS; } diff --git a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c index c1072afafe10..a67994000cb8 100644 --- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c +++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c @@ -647,6 +647,9 @@ UfsCreateDMCommandDesc ( Trd->RuO = (UINT16)DivU64x32 ((UINT64)ROUNDUP8 (sizeof (UTP_QUERY_REQ_UPIU)), sizeof (UINT32)); } + // UFS DM Command, PRDT Length must be Zero. + Trd->PrdtL = 0x00; + return EFI_SUCCESS; } From ddd7855a7a7d387ed8ab6cdb2d88163b7ba9e5c2 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Mon, 15 Dec 2025 12:35:16 +0100 Subject: [PATCH 0954/1172] BaseTools,UefiPayloadPkg: Replace deprecated R_AARCH64_NONE value For nebulous reasons, the original ELF psABI deviated from common sense, and decided to #define R_AARCH64_NONE as '256', in spite of the fact that no other architecture uses anything other than 0x0. This has now been fixed in the psABI, so fix it in our code as well. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Ard Biesheuvel --- BaseTools/Source/C/GenFw/elf_common.h | 2 +- UefiPayloadPkg/PayloadLoaderPeim/ElfLib/ElfCommon.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BaseTools/Source/C/GenFw/elf_common.h b/BaseTools/Source/C/GenFw/elf_common.h index cafe419a5416..2a9d03882a7e 100644 --- a/BaseTools/Source/C/GenFw/elf_common.h +++ b/BaseTools/Source/C/GenFw/elf_common.h @@ -556,7 +556,7 @@ typedef struct { #define R_386_TLS_TPOFF32 37 /* GOT entry of -ve static TLS offset */ /* Null relocation */ -#define R_AARCH64_NONE 256 /* No relocation */ +#define R_AARCH64_NONE 0 /* No relocation */ /* Static AArch64 relocations */ /* Static data relocations */ #define R_AARCH64_ABS64 257 /* S + A */ diff --git a/UefiPayloadPkg/PayloadLoaderPeim/ElfLib/ElfCommon.h b/UefiPayloadPkg/PayloadLoaderPeim/ElfLib/ElfCommon.h index 7559f229ef2e..b5d4ab4bfaf9 100644 --- a/UefiPayloadPkg/PayloadLoaderPeim/ElfLib/ElfCommon.h +++ b/UefiPayloadPkg/PayloadLoaderPeim/ElfLib/ElfCommon.h @@ -539,7 +539,7 @@ typedef struct { #define R_386_TLS_TPOFF32 37 /* GOT entry of -ve static TLS offset */ /* Null relocation */ -#define R_AARCH64_NONE 256 /* No relocation */ +#define R_AARCH64_NONE 0 /* No relocation */ /* Static AArch64 relocations */ /* Static data relocations */ #define R_AARCH64_ABS64 257 /* S + A */ From 8d0afac1d225290f5bc6948b34cf268820dab5c8 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Mon, 15 Dec 2025 12:41:36 +0100 Subject: [PATCH 0955/1172] BaseTools/GenFw: Ignore R_*_NONE relocations on all architectures The ELF psABIs for all architectures stipulate that R_*_NONE relocations require no action at relocation time, and merely exist to declare a dependency on a symbol in a way that cannot be conveyed by the code itself (i.e., using an actual symbol reference). Given that EFI PE/COFF images are always fully linked binaries, such a dependency cannot be translated, and there are no known reasons why this would be necessary. So instead of ignoring such relocations specifically on x86_64 only, ignore them on all architectures when converting ELF binaries to PE/COFF. Fixes: #11878 Signed-off-by: Ard Biesheuvel --- BaseTools/Source/C/GenFw/Elf64Convert.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c b/BaseTools/Source/C/GenFw/Elf64Convert.c index ec809ac4a9e8..bf4baf05d7f8 100644 --- a/BaseTools/Source/C/GenFw/Elf64Convert.c +++ b/BaseTools/Source/C/GenFw/Elf64Convert.c @@ -1407,16 +1407,14 @@ WriteSections64 ( SymName = (const UINT8 *)""; } - if (mEhdr->e_machine == EM_X86_64) { - // - // For x86_64, we can ignore R_X86_64_NONE relocations. - // They are used to indicate that the symbol is not defined - // in the current module, but in a shared library that may be - // used when building modules for inclusion in host-based unit tests. - // - if (ELF_R_TYPE(Rel->r_info) == R_X86_64_NONE) { - continue; - } + // + // We can ignore R_*_NONE relocations (which always have numeric + // value 0x0). They are used to indicate that the symbol is not + // defined in the current module, but in a shared library that may be + // used when building modules for inclusion in host-based unit tests. + // + if (ELF_R_TYPE(Rel->r_info) == 0x0) { + continue; } // @@ -2000,6 +1998,7 @@ WriteRelocations64 ( } else if (mEhdr->e_machine == EM_AARCH64) { switch (ELF_R_TYPE(Rel->r_info)) { + case R_AARCH64_NONE: case R_AARCH64_ADR_PREL_LO21: case R_AARCH64_CONDBR19: case R_AARCH64_LD_PREL_LO19: From 85e2fef2a8dfcdc64235e783abd827f33f2664b3 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 24 Dec 2025 12:52:02 -0800 Subject: [PATCH 0956/1172] BaseTools: Add CLANG support to Edk2ToolsBuild.py Update Edk2ToolsBuild.py to support using Linux/CLANG and Windows Mingw/CLANG environments to build C tools within the BaseTools directory. The environment variable settings CC=clang and CXX=clang++ must also be set before running Edk2ToolsBuild.py to enable the use of the clang compiler. PATH must also be set to include the path to the installed version of clang and clang++ to use. If CC and CXX are not set, the the default compiler is used. When Mingw CLANG environment is being used, CLANG_BIN must be set to the path to the CLANG tools so the mingw-make.exe utility can be used to process BaseTools makefiles. Signed-off-by: Michael D Kinney --- BaseTools/Edk2ToolsBuild.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/BaseTools/Edk2ToolsBuild.py b/BaseTools/Edk2ToolsBuild.py index 1490a36a8f04..86b5c47084e5 100644 --- a/BaseTools/Edk2ToolsBuild.py +++ b/BaseTools/Edk2ToolsBuild.py @@ -244,7 +244,7 @@ def Go(self): self.WritePathEnvFile(self.OutputDir) return ret - elif self.tool_chain_tag.lower().startswith("gcc"): + elif self.tool_chain_tag.lower().startswith("gcc") or self.tool_chain_tag.lower().startswith("clang"): # Note: This HOST_ARCH is in respect to the BUILT base tools, not the host arch where # this script is BUILDING the base tools. HostInfo = GetHostInfo() @@ -272,6 +272,12 @@ def Go(self): TargetInfoArch = HostInfo.arch # Otherwise, the built binary arch will be consistent with the host system + make_command = 'make' + clang_bin = shell_env.get_shell_var("CLANG_BIN") + if clang_bin is not None: + if os.path.exists(os.path.join(clang_bin, "mingw32-make.exe")): + make_command = 'mingw32-make' + # Added logic to support cross compilation scenarios if TargetInfoArch != HostInfo.arch: # this is defaulting to the version that comes with Ubuntu 20.04 @@ -301,21 +307,21 @@ def Go(self): if ret != 0: raise Exception(f"Failed to configure the util-linux to build with our gcc {ret}") - ret = RunCmd("make", "", workingdir=unzip_dir) + ret = RunCmd(make_command, "", workingdir=unzip_dir) if ret != 0: raise Exception(f"Failed to build the libuuid with our gcc {ret}") shell_environment.GetEnvironment().set_shell_var("CROSS_LIB_UUID", unzip_dir) shell_environment.GetEnvironment().set_shell_var("CROSS_LIB_UUID_INC", os.path.join(unzip_dir, "libuuid", "src")) - ret = RunCmd("make", "clean", workingdir=shell_env.get_shell_var("EDK_TOOLS_PATH")) + ret = RunCmd(make_command, "clean", workingdir=shell_env.get_shell_var("EDK_TOOLS_PATH")) if ret != 0: raise Exception("Failed to build.") cpu_count = self.GetCpuThreads() output_stream = edk2_logging.create_output_stream() - ret = RunCmd("make", f"-C . -j {cpu_count}", workingdir=shell_env.get_shell_var("EDK_TOOLS_PATH")) + ret = RunCmd(make_command, f"-C . -j {cpu_count}", workingdir=shell_env.get_shell_var("EDK_TOOLS_PATH")) edk2_logging.remove_output_stream(output_stream) problems = edk2_logging.scan_compiler_output(output_stream) for level, problem in problems: From fe9447553858acbbf1446d3e18362c1c74cdfd93 Mon Sep 17 00:00:00 2001 From: Qihang Gao Date: Mon, 29 Dec 2025 16:10:03 +0800 Subject: [PATCH 0957/1172] NetworkPkg: Add RngLib mapping for LOONGARCH64 NetworkPkg will build failed on LOONGARCH64 platform, because LOONGARCH64 don't support MdePkg/Library/BaseRngLib. So add MdeModulePkg/Library/BaseRngLibTimerLib as BaseRngLib of LOONGARCH64 platform. Signed-off-by: Qihang Gao Cc: Chao Li --- NetworkPkg/NetworkPkg.dsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NetworkPkg/NetworkPkg.dsc b/NetworkPkg/NetworkPkg.dsc index a1dc3f3eabe1..96d13050ebb6 100644 --- a/NetworkPkg/NetworkPkg.dsc +++ b/NetworkPkg/NetworkPkg.dsc @@ -74,6 +74,9 @@ [LibraryClasses.RISCV64] RngLib|MdeModulePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf +[LibraryClasses.LOONGARCH64] + RngLib|MdeModulePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf + [PcdsFeatureFlag] gEfiMdePkgTokenSpaceGuid.PcdComponentName2Disable|TRUE gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnostics2Disable|TRUE From 66346d5edeac2a00d3cf2f2f3b5f66d423c07b3e Mon Sep 17 00:00:00 2001 From: Piotr Wejman Date: Wed, 3 Dec 2025 16:14:57 +0100 Subject: [PATCH 0958/1172] MdeModulePkg: Fix FreePages not existent memory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Commit 2d69507a4dde02f1abf20c7eb3a43d1d3ef6b98f added an attribute check to prevent freeing memory that is read-only, read-protected, or for which attribute retrieval fails. In such cases the code returned EFI_SUCCESS and leaked the memory. This introduced a regression in the System Architecture Compliance Suite (ACS) BS.FreePages – Not Existent Memory test. Link: https://github.com/tianocore/edk2-test/blob/edk2-test-stable202509/uefi-sct/Doc/TestCaseSpec/03_Services_Boot_Services.md#freepages Test number: 5.1.2.2.1 GetMemoryAttributes() returns EFI_UNSUPPORTED for memory regions outside system memory. The previous change treated all errors as a reason to leak memory, while only the EFI_NO_MAPPING error code should trigger that behavior. As a result, freeing non-existent memory incorrectly returned EFI_SUCCESS instead of EFI_NOT_FOUND. To fix this, memory is now leaked only when: - GetMemoryAttributes() returns EFI_NO_MAPPING (inconsistent attributes), or - GetMemoryAttributes() succeeds and the pages are marked RO or RP. All other errors fall through to CoreInternalFreePages(), restoring the previous and correct behavior. Signed-off-by: Piotr Wejman --- MdeModulePkg/Core/Dxe/Mem/Page.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MdeModulePkg/Core/Dxe/Mem/Page.c b/MdeModulePkg/Core/Dxe/Mem/Page.c index 1497ae5121d0..38291e1abcc6 100644 --- a/MdeModulePkg/Core/Dxe/Mem/Page.c +++ b/MdeModulePkg/Core/Dxe/Mem/Page.c @@ -1772,7 +1772,9 @@ CoreFreePages ( // free memory that is marked RO, which can crash the core if DebugClearMemory is enabled or can be passed out to a // driver in the next AllocatePages() call, which can cause a crash later on. It is deemed lower risk to leak the // memory than to attempt to fix up the attributes as that requires syncing the GCD and the page table. - if (EFI_ERROR (Status) || (Attributes & EFI_MEMORY_RO) || (Attributes & EFI_MEMORY_RP)) { + if ((Status == EFI_NO_MAPPING) || + (!EFI_ERROR (Status) && ((Attributes & EFI_MEMORY_RO) || (Attributes & EFI_MEMORY_RP)))) + { DEBUG (( DEBUG_WARN, "%a: Memory %llx for %llx Pages failed to get attributes with status %r or it is read-only or read-protected. " From 81c95449749469480f0124a1416f22b4ecc67584 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 1 Jan 2026 09:19:01 -0800 Subject: [PATCH 0959/1172] CryptoPkg/Library/OpensslLib: Add -UWIN32 to GCC Family Undefine WIN32 for GCC family compilers in OpensslLib INF files to remove use of GetLastError() and SetLastError() in OpensslLib builds. Mingw CLANG compilers have a builtin define called WIN32. When building OpensslLib, this define causes the Windows APIs GetLastError() and SetLastError() to be referenced which causes compilers warnings for undefined functions. Mingw CLANG NOOPT builds generate link errors not finding GetLastError() and SetLastError(). The MSFT family compilers do not define WIN32. As a result, this issue is not observed with VS20xx tool chains. Removing the WIN32 define aligns the GCC family with the MSFT family. Signed-off-by: Michael D Kinney --- CryptoPkg/Library/OpensslLib/OpensslLib.inf | 4 ++-- CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf | 4 ++-- CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf | 4 ++-- CryptoPkg/Library/OpensslLib/OpensslLibFull.inf | 4 ++-- CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/CryptoPkg/Library/OpensslLib/OpensslLib.inf b/CryptoPkg/Library/OpensslLib/OpensslLib.inf index ec945175dcb1..e4b19233950d 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLib.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLib.inf @@ -774,8 +774,8 @@ # -Werror=unused-but-set-variable: Warn whenever a local variable is assigned to, but otherwise unused (aside from its declaration). # GCC:RELEASE_*_*_CC_FLAGS = -DNDEBUG - GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable - GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS + GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -UWIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable + GCC:*_*_X64_CC_FLAGS = -U_WIN32 -UWIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS GCC:*_*_AARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable -Wno-error=format GCC:*_*_RISCV64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf index 4fc17cee16c7..3743ffd8db98 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf @@ -2227,8 +2227,8 @@ # types appropriate to the format string specified. # -Werror=unused-but-set-variable: Warn whenever a local variable is assigned to, but otherwise unused (aside from its declaration). # - GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable - GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS + GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -UWIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable + GCC:*_*_X64_CC_FLAGS = -U_WIN32 -UWIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS GCC:*_CLANGDWARF_*_CC_FLAGS = -std=gnu99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize GCC:*_CLANGPDB_*_CC_FLAGS = -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize -Wno-error=unused-function # Revisit after switching to 3.0 branch diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf index 63c913a88606..200e5de73425 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf @@ -724,8 +724,8 @@ # -Werror=unused-but-set-variable: Warn whenever a local variable is assigned to, but otherwise unused (aside from its declaration). # GCC:RELEASE_*_*_CC_FLAGS = -DNDEBUG - GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable - GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS + GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -UWIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable + GCC:*_*_X64_CC_FLAGS = -U_WIN32 -UWIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS GCC:*_*_AARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable -Wno-error=format GCC:*_*_RISCV64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf index ad60744e18cd..32f24619513d 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf @@ -830,8 +830,8 @@ # types appropriate to the format string specified. # -Werror=unused-but-set-variable: Warn whenever a local variable is assigned to, but otherwise unused (aside from its declaration). # - GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable - GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS + GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -UWIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable + GCC:*_*_X64_CC_FLAGS = -U_WIN32 -UWIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_NOASM) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS GCC:*_*_AARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable -Wno-error=format GCC:*_*_RISCV64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf index 0ebbddd79655..c5961fbfb62c 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf @@ -2388,8 +2388,8 @@ # types appropriate to the format string specified. # -Werror=unused-but-set-variable: Warn whenever a local variable is assigned to, but otherwise unused (aside from its declaration). # - GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable - GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS + GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -UWIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable + GCC:*_*_X64_CC_FLAGS = -U_WIN32 -UWIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS GCC:*_CLANGDWARF_*_CC_FLAGS = -std=gnu99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize GCC:*_CLANGPDB_*_CC_FLAGS = -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize -Wno-error=unused-function # Revisit after switching to 3.0 branch From e622a4221adaab60e1e815f7b2c1e953011e89e3 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 26 Dec 2025 11:24:56 -0800 Subject: [PATCH 0960/1172] UnitTestFrameworkPkg: Fix StackCheckLib class mapping Update UnitTestFrameworkPkgHost.dsc.inc DSC file to use the correct StackCheckLib class instead of NULL. This guarantees that the StackCheckLib is only linked with modules that have a StackCheckLib class dependency. Must also add -fno-stack-protector to GCC and CLANGPDB to disable use of stack checks by the compiler. ASAN provides better coverage for access outside stack frames. Signed-off-by: Michael D Kinney --- UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc index d047b46af529..0f931d973377 100644 --- a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc +++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc @@ -28,13 +28,20 @@ UefiBootServicesTableLib|UnitTestFrameworkPkg/Library/UnitTestUefiBootServicesTableLib/UnitTestUefiBootServicesTableLib.inf PeiServicesTablePointerLib|UnitTestFrameworkPkg/Library/UnitTestPeiServicesTablePointerLib/UnitTestPeiServicesTablePointerLib.inf NULL|UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.inf - NULL|MdePkg/Library/StackCheckLibNull/StackCheckLibNullHostApplication.inf + StackCheckLib|MdePkg/Library/StackCheckLibNull/StackCheckLibNullHostApplication.inf [BuildOptions] MSFT:*_*_*_CC_FLAGS = /MTd /EHs GCC:*_*_*_CC_FLAGS = -fno-pie CLANGPDB:*_*_*_CC_FLAGS = -fno-pie GCC:*_*_*_ASLCC_FLAGS = -fpie + + # + # Disable stack protector for unit tests because ASAN provides better coverage + # + GCC:*_*_*_CC_FLAGS = -fno-stack-protector + CLANGPDB:*_*_*_CC_FLAGS = -fno-stack-protector + !if $(UNIT_TESTING_ADDRESS_SANITIZER_ENABLE) # # Enable Address Sanitizer for VS2019, VS2022, and GCC From 30af21720355de9d6ff1b5118c3f862339565ac3 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Tue, 23 Dec 2025 10:34:54 -0800 Subject: [PATCH 0961/1172] EmulatorPkg/Sec: Port SwitchRam to NASM Update EmulatorPkg SEC to use NASM implementation of SwitchRam and remove the .asm and .S implementations. Signed-off-by: Michael D Kinney --- EmulatorPkg/Sec/Ia32/SwitchRam.S | 89 ------------------- .../Ia32/{SwitchRam.asm => SwitchRam.nasm} | 44 ++++----- EmulatorPkg/Sec/Sec.inf | 6 +- EmulatorPkg/Sec/X64/SwitchRam.S | 66 -------------- .../Sec/X64/{SwitchRam.asm => SwitchRam.nasm} | 42 ++++----- 5 files changed, 42 insertions(+), 205 deletions(-) delete mode 100644 EmulatorPkg/Sec/Ia32/SwitchRam.S rename EmulatorPkg/Sec/Ia32/{SwitchRam.asm => SwitchRam.nasm} (57%) delete mode 100644 EmulatorPkg/Sec/X64/SwitchRam.S rename EmulatorPkg/Sec/X64/{SwitchRam.asm => SwitchRam.nasm} (61%) diff --git a/EmulatorPkg/Sec/Ia32/SwitchRam.S b/EmulatorPkg/Sec/Ia32/SwitchRam.S deleted file mode 100644 index d8298223a9b0..000000000000 --- a/EmulatorPkg/Sec/Ia32/SwitchRam.S +++ /dev/null @@ -1,89 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2007, Intel Corporation. All rights reserved.
    -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -# Module Name: -# -# Stack.asm -# -# Abstract: -# -# Switch the stack from temporary memory to permanent memory. -# -#------------------------------------------------------------------------------ - - .text - - -//------------------------------------------------------------------------------ -// VOID -// EFIAPI -// SecSwitchStack ( -// UINT32 TemporaryMemoryBase, -// UINT32 PermenentMemoryBase -// )// -//------------------------------------------------------------------------------ -ASM_GLOBAL ASM_PFX(SecSwitchStack) -ASM_PFX(SecSwitchStack): -# -# Save three register: eax, ebx, ecx -# - push %eax - push %ebx - push %ecx - push %edx - -# -# !!CAUTION!! this function address's is pushed into stack after -# migration of whole temporary memory, so need save it to permanent -# memory at first! -# - - movl 20(%esp), %ebx # Save the first parameter - movl 24(%esp), %ecx # Save the second parameter - -# -# Save this function's return address into permanent memory at first. -# Then, Fixup the esp point to permanent memory -# - - movl %esp, %eax - subl %ebx, %eax - addl %ecx, %eax - movl (%esp), %edx # copy pushed register's value to permanent memory - movl %edx, (%eax) - movl 4(%esp), %edx - movl %edx, 4(%eax) - movl 8(%esp), %edx - movl %edx, 8(%eax) - movl 12(%esp), %edx - movl %edx, 12(%eax) - movl 16(%esp), %edx - movl %edx, 16(%eax) - movl %eax, %esp # From now, esp is pointed to permanent memory - -# -# Fixup the ebp point to permanent memory -# -#ifndef __APPLE__ - movl %ebp, %eax - subl %ebx, %eax - addl %ecx, %eax - movl %eax, %ebp # From now, ebp is pointed to permanent memory - -# -# Fixup callee's ebp point for PeiDispatch -# - movl (%ebp), %eax - subl %ebx, %eax - addl %ecx, %eax - movl %eax, (%ebp) # From now, Temporary's PPI caller's stack is in permanent memory -#endif - - pop %edx - pop %ecx - pop %ebx - pop %eax - ret - diff --git a/EmulatorPkg/Sec/Ia32/SwitchRam.asm b/EmulatorPkg/Sec/Ia32/SwitchRam.nasm similarity index 57% rename from EmulatorPkg/Sec/Ia32/SwitchRam.asm rename to EmulatorPkg/Sec/Ia32/SwitchRam.nasm index 99ef00298069..9172c31ebe6a 100644 --- a/EmulatorPkg/Sec/Ia32/SwitchRam.asm +++ b/EmulatorPkg/Sec/Ia32/SwitchRam.nasm @@ -1,21 +1,15 @@ ;------------------------------------------------------------------------------ ; -; Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.
    +; Copyright (c) 2007, Intel Corporation. All rights reserved.
    ; SPDX-License-Identifier: BSD-2-Clause-Patent ; -; Module Name: -; -; Stack.asm -; ; Abstract: ; ; Switch the stack from temporary memory to permanent memory. ; ;------------------------------------------------------------------------------ - .586p - .model flat,C - .code + SECTION .text ;------------------------------------------------------------------------------ ; VOID @@ -25,7 +19,8 @@ ; UINT32 PermenentMemoryBase ; ); ;------------------------------------------------------------------------------ -SecSwitchStack PROC +global ASM_PFX(SecSwitchStack) +ASM_PFX(SecSwitchStack): ; ; Save three register: eax, ebx, ecx ; @@ -50,17 +45,17 @@ SecSwitchStack PROC mov eax, esp sub eax, ebx add eax, ecx - mov edx, dword ptr [esp] ; copy pushed register's value to permanent memory - mov dword ptr [eax], edx - mov edx, dword ptr [esp + 4] - mov dword ptr [eax + 4], edx - mov edx, dword ptr [esp + 8] - mov dword ptr [eax + 8], edx - mov edx, dword ptr [esp + 12] - mov dword ptr [eax + 12], edx - mov edx, dword ptr [esp + 16] ; Update this function's return address into permanent memory - mov dword ptr [eax + 16], edx - mov esp, eax ; From now, esp is pointed to permanent memory + mov edx, [esp] ; copy pushed register's value to permanent memory + mov [eax], edx + mov edx, [esp + 4] + mov [eax + 4], edx + mov edx, [esp + 8] + mov [eax + 8], edx + mov edx, [esp + 12] + mov [eax + 12], edx + mov edx, [esp + 16] ; Update this function's return address into permanent memory + mov [eax + 16], edx + mov esp, eax ; From now, esp is pointed to permanent memory ; ; Fixup the ebp point to permanent memory @@ -68,21 +63,18 @@ SecSwitchStack PROC mov eax, ebp sub eax, ebx add eax, ecx - mov ebp, eax ; From now, ebp is pointed to permanent memory + mov ebp, eax ; From now, ebp is pointed to permanent memory ; ; Fixup callee's ebp point for PeiDispatch ; - mov eax, dword ptr [ebp] + mov eax, [ebp] sub eax, ebx add eax, ecx - mov dword ptr [ebp], eax ; From now, Temporary's PPI caller's stack is in permanent memory + mov [ebp], eax ; From now, Temporary's PPI caller's stack is in permanent memory pop edx pop ecx pop ebx pop eax ret -SecSwitchStack ENDP - - END diff --git a/EmulatorPkg/Sec/Sec.inf b/EmulatorPkg/Sec/Sec.inf index 5d47eed7aea3..ce2d70ea06e9 100644 --- a/EmulatorPkg/Sec/Sec.inf +++ b/EmulatorPkg/Sec/Sec.inf @@ -22,13 +22,11 @@ Sec.c [Sources.X64] - X64/SwitchRam.asm - X64/SwitchRam.S + X64/SwitchRam.nasm [Sources.IA32] Ia32/TempRam.c - Ia32/SwitchRam.asm - Ia32/SwitchRam.S + Ia32/SwitchRam.nasm [Packages] MdePkg/MdePkg.dec diff --git a/EmulatorPkg/Sec/X64/SwitchRam.S b/EmulatorPkg/Sec/X64/SwitchRam.S deleted file mode 100644 index 59d4e2edef2a..000000000000 --- a/EmulatorPkg/Sec/X64/SwitchRam.S +++ /dev/null @@ -1,66 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.
    -# Portions copyright (c) 2011, Apple Inc. All rights reserved. -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -#------------------------------------------------------------------------------ - - - -// EFI_STATUS -// EFIAPI -// SecTemporaryRamSupport ( -// IN CONST EFI_PEI_SERVICES **PeiServices, // %rcx -// IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase, // %rdx -// IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase, // %r8 -// IN UINTN CopySize // %r9 -// ) -// -ASM_GLOBAL ASM_PFX(SecTemporaryRamSupport) -ASM_PFX(SecTemporaryRamSupport): - // Adjust callers %rbp to account for stack move - subq %rdx, %rbp // Calc offset of %rbp in Temp Memory - addq %r8, %rbp // add in permanent base to offset - - pushq %rbp // stack frame is for the debugger - movq %rsp, %rbp - - pushq %rdx // Save TemporaryMemoryBase - pushq %r8 // Save PermanentMemoryBase - pushq %r9 // Save CopySize - - // - // Copy all of temp RAM to permanent memory, including stack - // - // CopyMem (PermanentMemoryBase, TemporaryMemoryBase, CopySize); - // %rcx, %rdx, %r8 - movq %r8, %rcx // Shift arguments - movq %r9, %r8 - subq $0x28, %rsp // Allocate register spill area & 16-byte align stack - call ASM_PFX(CopyMem) - // Temp mem stack now copied to permanent location. %esp still in temp memory - addq $0x28, %rsp - - popq %r9 // CopySize (old stack) - popq %r8 // PermanentMemoryBase (old stack) - popq %rdx // TemporaryMemoryBase (old stack) - - movq %rsp, %rcx // Move to new stack - subq %rdx, %rcx // Calc offset of stack in Temp Memory - addq %r8, %rcx // Calc PermanentMemoryBase address - movq %rcx, %rsp // Update stack - // Stack now points to permanent memory - - // ZeroMem (TemporaryMemoryBase /* rcx */, CopySize /* rdx */); - movq %rdx, %rcx - movq %r9, %rdx - subq $0x28, %rsp // Allocate register spill area & 16-byte align stack - call ASM_PFX(ZeroMem) - addq $0x28, %rsp - - // This data comes off the NEW stack - popq %rbp - ret - - diff --git a/EmulatorPkg/Sec/X64/SwitchRam.asm b/EmulatorPkg/Sec/X64/SwitchRam.nasm similarity index 61% rename from EmulatorPkg/Sec/X64/SwitchRam.asm rename to EmulatorPkg/Sec/X64/SwitchRam.nasm index e66bda5bf4e6..852fd9e01ba0 100644 --- a/EmulatorPkg/Sec/X64/SwitchRam.asm +++ b/EmulatorPkg/Sec/X64/SwitchRam.nasm @@ -1,29 +1,34 @@ ;------------------------------------------------------------------------------ ; -; Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
    +; Copyright (c) 2006, Intel Corporation. All rights reserved.
    ; Portions copyright (c) 2011, Apple Inc. All rights reserved. ; SPDX-License-Identifier: BSD-2-Clause-Patent ; +; Abstract: +; +; Switch the stack from temporary memory to permanent memory. +; ;------------------------------------------------------------------------------ -EXTERN CopyMem:PROC -EXTERN ZeroMem:PROC +SECTION .text - .code +extern ASM_PFX(CopyMem) +extern ASM_PFX(ZeroMem) ;------------------------------------------------------------------------------ ; EFI_STATUS ; EFIAPI ; SecTemporaryRamSupport ( -; IN CONST EFI_PEI_SERVICES **PeiServices, // %rcx -; IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase, // %rdx -; IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase, // %r8 -; IN UINTN CopySize // %r9 +; IN CONST EFI_PEI_SERVICES **PeiServices, // rcx +; IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase, // rdx +; IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase, // r8 +; IN UINTN CopySize // r9 ; ) ;------------------------------------------------------------------------------ -SecTemporaryRamSupport PROC - ; Adjust callers %rbp to account for stack move - sub rbp, rdx ; Calc offset of %rbp in Temp Memory +global ASM_PFX(SecTemporaryRamSupport) +ASM_PFX(SecTemporaryRamSupport): + ; Adjust callers rbp to account for stack move + sub rbp, rdx ; Calc offset of rbp in Temp Memory add rbp, r8 ; add in permanent base to offset push rbp ; stack frame is for the debugger @@ -37,13 +42,13 @@ SecTemporaryRamSupport PROC ; Copy all of temp RAM to permanent memory, including stack ; ; CopyMem (PermanentMemoryBase, TemporaryMemoryBase, CopySize); - ; %rcx, %rdx, %r8 + ; rcx, rdx, r8 mov rcx, r8 ; Shift arguments mov r8, r9 - sub rsp, 028h ; Allocate register spill area & 16-byte align stack + sub rsp, 0x28 ; Allocate register spill area & 16-byte align stack call CopyMem - ; Temp mem stack now copied to permanent location. %esp still in temp memory - add rsp, 028h + ; Temp mem stack now copied to permanent location. rsp still in temp memory + add rsp, 0x28 pop r9 ; CopySize (old stack) pop r8 ; PermanentMemoryBase (old stack) @@ -58,13 +63,10 @@ SecTemporaryRamSupport PROC ; ZeroMem (TemporaryMemoryBase /* rcx */, CopySize /* rdx */); mov rcx, rdx mov rdx, r9 - sub rsp, 028h ; Allocate register spill area & 16-byte align stack + sub rsp, 0x28 ; Allocate register spill area & 16-byte align stack call ZeroMem - add rsp, 028h + add rsp, 0x28 ; This data comes off the NEW stack pop rbp ret -SecTemporaryRamSupport ENDP - - END From 1aaa37e00a71446adc7a7e78018715c91fbd173e Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 22 Dec 2025 11:57:16 -0800 Subject: [PATCH 0962/1172] EmulatorPkg/Unix/Host: Fix symbol loading with clang Fix symbol loading issues with clang compilers where SecGdbSciptBreak() is optimized away and the gdb/lldb breakpoint on that symbol is never hit and no symbols are loaded for any modules. Update the implementation of SecGdbScriptBreak() so it is never inlined and add code to the implementation of SecGdbScriptBreak() to guarantee that the entire function is never optimized away by using a volatile loop variable. Signed-off-by: Michael D Kinney --- EmulatorPkg/Unix/Host/Host.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/EmulatorPkg/Unix/Host/Host.c b/EmulatorPkg/Unix/Host/Host.c index 26e15e63bfc7..882514ea49dd 100644 --- a/EmulatorPkg/Unix/Host/Host.c +++ b/EmulatorPkg/Unix/Host/Host.c @@ -1112,9 +1112,7 @@ DlLoadImage ( #endif } -#ifdef __APPLE__ __attribute__ ((noinline)) -#endif VOID SecGdbScriptBreak ( char *FileName, @@ -1123,6 +1121,17 @@ SecGdbScriptBreak ( int AddSymbolFlag ) { + volatile UINTN Index; + + // + // Disable inline and have this function do some work to prevent + // optimizing this function away. It must always be in symbol table to + // set breakpoint for gdb script to run, load symbols, and set pending + // breakpoints. + // + for (Index = 0; Index < 1; Index++) { + } + return; } From a02ebcfed88da72d73ae65f16c914e5c31788e9e Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 22 Dec 2025 12:08:46 -0800 Subject: [PATCH 0963/1172] EmulatorPkg/Unix/Host: Fix gPpiList multiply defined Multiple defined symbols are reported by clang builds for the symbol gPpiList. Change the name of the variable gPpiList in Host.c to mPpiList to guarantee unique symbols names within the Unit/Host component. Signed-off-by: Michael D Kinney --- EmulatorPkg/Unix/Host/Host.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/EmulatorPkg/Unix/Host/Host.c b/EmulatorPkg/Unix/Host/Host.c index 882514ea49dd..c9a633b20e06 100644 --- a/EmulatorPkg/Unix/Host/Host.c +++ b/EmulatorPkg/Unix/Host/Host.c @@ -47,7 +47,7 @@ EMU_SYSTEM_MEMORY *gSystemMemory; UINTN mImageContextModHandleArraySize = 0; IMAGE_CONTEXT_TO_MOD_HANDLE *mImageContextModHandleArray = NULL; -EFI_PEI_PPI_DESCRIPTOR *gPpiList; +EFI_PEI_PPI_DESCRIPTOR *mPpiList; int gInXcode = 0; @@ -166,7 +166,7 @@ main ( // EmuSecLibConstructor (); - gPpiList = GetThunkPpiList (); + mPpiList = GetThunkPpiList (); // // Allocate space for gSystemMemory Array @@ -602,7 +602,7 @@ SecLoadFromCore ( PeiSwitchStacks ( (SWITCH_STACK_ENTRY_POINT)(UINTN)PeiCoreEntryPoint, SecCoreData, - (VOID *)gPpiList, + (VOID *)mPpiList, TopOfStack ); // From 0890baeaa329d2987e07e43393c63ac319a5081d Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Tue, 23 Dec 2025 10:41:18 -0800 Subject: [PATCH 0964/1172] EmulatorPkg/Win/Host: Fix WinNtBlockIoError() parameter type Fix incorrect parameter type passed to WinNtBlockIoError() caught by clang compiler. Signed-off-by: Michael D Kinney --- EmulatorPkg/Win/Host/WinBlockIo.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/EmulatorPkg/Win/Host/WinBlockIo.c b/EmulatorPkg/Win/Host/WinBlockIo.c index e90376d5fb78..0fa23fee5728 100644 --- a/EmulatorPkg/Win/Host/WinBlockIo.c +++ b/EmulatorPkg/Win/Host/WinBlockIo.c @@ -302,12 +302,12 @@ WinNtBlockIoReadBlocks ( if (EFI_ERROR (Status) || (DistanceToMove != DistanceMoved)) { DEBUG ((DEBUG_INIT, "ReadBlocks: SetFilePointer failed\n")); - return WinNtBlockIoError (Private->Media); + return WinNtBlockIoError (Private); } Flag = ReadFile (Private->NtHandle, Buffer, (DWORD)BufferSize, (LPDWORD)&BytesRead, NULL); if (!Flag || (BytesRead != BufferSize)) { - return WinNtBlockIoError (Private->Media); + return WinNtBlockIoError (Private); } Private->Media->MediaPresent = TRUE; @@ -372,12 +372,12 @@ WinNtBlockIoWriteBlocks ( if (EFI_ERROR (Status) || (DistanceToMove != DistanceMoved)) { DEBUG ((DEBUG_INIT, "WriteBlocks: SetFilePointer failed\n")); - return WinNtBlockIoError (Private->Media); + return WinNtBlockIoError (Private); } Success = WriteFile (Private->NtHandle, Buffer, (DWORD)BufferSize, &BytesWritten, NULL); if (!Success || (BytesWritten != BufferSize)) { - return WinNtBlockIoError (Private->Media); + return WinNtBlockIoError (Private); } // From 8dca04c5ffdf6ad4662d716eaceb97d43f91ac66 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Tue, 23 Dec 2025 10:42:39 -0800 Subject: [PATCH 0965/1172] EmulatorPkg/Win/Host: Fix WinNtOpenVolume() uninitialized variable Fix uninitialized variable error for the local variable Status in a WinNtOpenVolume() error path. This issue was caught by the clang compiler. Signed-off-by: Michael D Kinney --- EmulatorPkg/Win/Host/WinFileSystem.c | 1 + 1 file changed, 1 insertion(+) diff --git a/EmulatorPkg/Win/Host/WinFileSystem.c b/EmulatorPkg/Win/Host/WinFileSystem.c index 5ca404020cdb..e6da61c375fe 100644 --- a/EmulatorPkg/Win/Host/WinFileSystem.c +++ b/EmulatorPkg/Win/Host/WinFileSystem.c @@ -245,6 +245,7 @@ WinNtOpenVolume ( Size += StrSize (L"\\*"); TempFileName = AllocatePool (Size); if (TempFileName == NULL) { + Status = EFI_OUT_OF_RESOURCES; goto Done; } From 771137625b198b53a8d7c25e71f217e3b6c00129 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Tue, 23 Dec 2025 10:45:25 -0800 Subject: [PATCH 0966/1172] EmulatorPkg/Win/Host: Fix main() return type and error paths Update main() to have a return type of int to match Windows console application requirements. Also update error paths to consistently call exit(1) instead of returning an EFI_ERROR status that does not match Windows console applications error values. These issues were caught with clang compiler. Signed-off-by: Michael D Kinney --- EmulatorPkg/Win/Host/WinHost.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/EmulatorPkg/Win/Host/WinHost.c b/EmulatorPkg/Win/Host/WinHost.c index d22265b650cc..baa130b7cd39 100644 --- a/EmulatorPkg/Win/Host/WinHost.c +++ b/EmulatorPkg/Win/Host/WinHost.c @@ -407,7 +407,7 @@ Routine Description: return EFI_SUCCESS; } -INTN +int EFIAPI main ( IN INT Argc, @@ -460,7 +460,7 @@ Routine Description: // EmuMagicPage = (VOID *)(UINTN)(FixedPcdGet64 (PcdPeiServicesTablePage) & MAX_UINTN); if (EmuMagicPage != NULL) { - UINT64 Size; + UINTN Size; Status = WinNtOpenFile ( NULL, SIZE_4KB, @@ -470,7 +470,7 @@ Routine Description: ); if (EFI_ERROR (Status)) { SecPrint ("ERROR : Could not allocate PeiServicesTablePage @ %p\n\r", EmuMagicPage); - return EFI_DEVICE_ERROR; + exit (1); } } @@ -554,7 +554,8 @@ Routine Description: gSystemMemory[Index].Size = ((UINT64)_wtoi (MemorySizeStr)) * ((UINT64)SIZE_1MB); gSystemMemory[Index].Memory = (EFI_PHYSICAL_ADDRESS)(UINTN)VirtualAlloc (NULL, (SIZE_T)(gSystemMemory[Index].Size), MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (gSystemMemory[Index].Memory == 0) { - return EFI_OUT_OF_RESOURCES; + SecPrint ("ERROR : Can not allocate memory for %S. Exiting.\n\r", MemorySizeStr); + exit (1); } // From a5a9df01f56d80e26ca65d076ff35251aef618b7 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Tue, 23 Dec 2025 10:49:50 -0800 Subject: [PATCH 0967/1172] EmulatorPkg/Win/Host: Fix Receive() parameter type Update call to Receive() in WinNtSnpReceive() to pass in the correct 32-bit sized parameter for both IA32 and X64 builds. In X64 builds, the upper 32-bits of BufferSize would not be cleared by Receive() and could result in unexpected values return values. This type mismatch was found by the clang compiler. Signed-off-by: Michael D Kinney --- EmulatorPkg/Win/Host/WinPacketFilter.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/EmulatorPkg/Win/Host/WinPacketFilter.c b/EmulatorPkg/Win/Host/WinPacketFilter.c index 2ebe62a127c8..41a0795560f0 100644 --- a/EmulatorPkg/Win/Host/WinPacketFilter.c +++ b/EmulatorPkg/Win/Host/WinPacketFilter.c @@ -749,6 +749,7 @@ WinNtSnpReceive ( WIN_NT_SNP_PRIVATE *Private; INT32 ReturnValue; UINTN BufSize; + UINT32 BufferSize32; Private = WIN_NT_SNP_PRIVATE_DATA_FROM_THIS (This); @@ -756,11 +757,13 @@ WinNtSnpReceive ( ASSERT (Private->NtNetUtilityTable.Receive != NULL); - ReturnValue = Private->NtNetUtilityTable.Receive ( - Private->Instance.InterfaceInfo.InterfaceIndex, - BufferSize, - Buffer - ); + BufferSize32 = (UINT32)(*BufferSize); + ReturnValue = Private->NtNetUtilityTable.Receive ( + Private->Instance.InterfaceInfo.InterfaceIndex, + &BufferSize32, + Buffer + ); + *BufferSize = BufferSize32; if (ReturnValue < 0) { if (ReturnValue == -100) { From cd68b0087399cb90ae7cf136509a5ffa16540ee9 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Tue, 23 Dec 2025 10:56:31 -0800 Subject: [PATCH 0968/1172] EmulatorPkg/Win/Host: Fix GetProcessAffinityMask() param types Update call to GetProcessAffinityMask() to typecast parameters to the types required by the Windows API. This type mismatch was caught by the clang compiler. Signed-off-by: Michael D Kinney --- EmulatorPkg/Win/Host/WinHost.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/EmulatorPkg/Win/Host/WinHost.c b/EmulatorPkg/Win/Host/WinHost.c index baa130b7cd39..ce35229ecf4f 100644 --- a/EmulatorPkg/Win/Host/WinHost.c +++ b/EmulatorPkg/Win/Host/WinHost.c @@ -492,7 +492,7 @@ Routine Description: // // Determine the first thread available to this process. // - if (GetProcessAffinityMask (GetCurrentProcess (), &ProcessAffinityMask, &SystemAffinityMask)) { + if (GetProcessAffinityMask (GetCurrentProcess (), (PDWORD_PTR)&ProcessAffinityMask, (PDWORD_PTR)&SystemAffinityMask)) { LowBit = (INT32)LowBitSet32 ((UINT32)ProcessAffinityMask); if (LowBit != -1) { // @@ -512,7 +512,7 @@ Routine Description: SecInitializeThunk (); // - // PPIs pased into PEI_CORE + // PPIs passed into PEI_CORE // SecEmuThunkPpi = AllocateZeroPool (sizeof (EMU_THUNK_PPI) + FixedPcdGet32 (PcdPersistentMemorySize)); if (SecEmuThunkPpi == NULL) { From 892a99aa02f659dcfe4ef8f47187c41739793cfc Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Tue, 23 Dec 2025 11:00:31 -0800 Subject: [PATCH 0969/1172] EmulatorPkg/Win/Host: Fix CLANG windows include issues CLANG compiler does not support VS20xx specific #pragma warning statements. Remove #pragma warning statements that are no longer required for VS20xx/SDKs. Add logic to correct case mismatch in the define value for IMAGE_FILE_MACHINE_ARM64 between edk2, SDKs, and Mingw ucrt includes. Signed-off-by: Michael D Kinney --- EmulatorPkg/Win/Host/WinInclude.h | 32 +++++++++++++++++-------------- EmulatorPkg/Win/Host/WinThunk.c | 3 --- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/EmulatorPkg/Win/Host/WinInclude.h b/EmulatorPkg/Win/Host/WinInclude.h index 877d2b0ed016..f78a8be557ab 100644 --- a/EmulatorPkg/Win/Host/WinInclude.h +++ b/EmulatorPkg/Win/Host/WinInclude.h @@ -8,17 +8,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #ifndef __WIN_NT_INCLUDE_H__ #define __WIN_NT_INCLUDE_H__ -// -// Win32 include files do not compile clean with /W4, so we use the warning -// pragma to suppress the warnings for Win32 only. This way our code can still -// compile at /W4 (highest warning level) with /WX (warnings cause build -// errors). -// -#pragma warning(disable : 4115) -#pragma warning(disable : 4201) -#pragma warning(disable : 4028) -#pragma warning(disable : 4133) - #define GUID _WINNT_DUP_GUID_____ #define _LIST_ENTRY _WINNT_DUP_LIST_ENTRY_FORWARD #define LIST_ENTRY _WINNT_DUP_LIST_ENTRY @@ -52,6 +41,7 @@ typedef UINT32 size_t; #undef InterlockedCompareExchange64 #undef InterlockedCompareExchangePointer #undef CreateEventEx +#undef IMAGE_FILE_MACHINE_ARM64 #define VOID void @@ -63,9 +53,23 @@ typedef UINT32 size_t; #undef FAR // -// Set the warnings back on as the EFI code must be /W4. +// Windows SDKs define IMAGE_FILE_MACHINE_ARM64 as "0xAA64" +// MdePkg defines EFI_IMAGE_FILE_MACHINE_ARM64 as "0xAA64" +// Mingw ucrt winnt.h defines IMAGE_FILE_MACHINE_ARM64 as "0xaa64" which is not +// the exact same string as "0xAA64". This generates a macro redefinition error +// with Mingw clang builds. // -#pragma warning(default : 4115) -#pragma warning(default : 4201) +// Redefining a macro to the exact same string is not flagged an error. +// +// If IMAGE_FILE_MACHINE_ARM64 is defined, check if it matches the unexpected +// value of "0xaa64". If "0xaa64" is detected, then undefine and redefine to +// "0xAA64" which is the same value used in Windows SDKs and MdePkg includes. +// +#if defined (IMAGE_FILE_MACHINE_ARM64) + #if IMAGE_FILE_MACHINE_ARM64 == 0xaa64 + #undef IMAGE_FILE_MACHINE_ARM64 +#define IMAGE_FILE_MACHINE_ARM64 0xAA64 + #endif +#endif #endif diff --git a/EmulatorPkg/Win/Host/WinThunk.c b/EmulatorPkg/Win/Host/WinThunk.c index e1b158c2daa6..ff87e7ffb85e 100644 --- a/EmulatorPkg/Win/Host/WinThunk.c +++ b/EmulatorPkg/Win/Host/WinThunk.c @@ -607,6 +607,3 @@ EMU_THUNK_PROTOCOL gEmuThunkProtocol = { SecSetTimer, GetNextThunkProtocol }; - -#pragma warning(default : 4996) -#pragma warning(default : 4232) From 135e06911fc666a7d0f6970a2b353b15efef1e8c Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Tue, 23 Dec 2025 13:54:29 -0800 Subject: [PATCH 0970/1172] EmulatorPkg/Win/Host: Remove workarounds for older VS20xx/SDKs Remove workarounds for older VS20xx/SDK versions that are no longer supported. This simplifies the number of workarounds required to mix windows and edk2 includes. Signed-off-by: Michael D Kinney --- EmulatorPkg/Win/Host/WinInclude.h | 31 +++---------------------------- 1 file changed, 3 insertions(+), 28 deletions(-) diff --git a/EmulatorPkg/Win/Host/WinInclude.h b/EmulatorPkg/Win/Host/WinInclude.h index f78a8be557ab..76bc3acde953 100644 --- a/EmulatorPkg/Win/Host/WinInclude.h +++ b/EmulatorPkg/Win/Host/WinInclude.h @@ -8,26 +8,12 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #ifndef __WIN_NT_INCLUDE_H__ #define __WIN_NT_INCLUDE_H__ +#undef VOID + #define GUID _WINNT_DUP_GUID_____ #define _LIST_ENTRY _WINNT_DUP_LIST_ENTRY_FORWARD #define LIST_ENTRY _WINNT_DUP_LIST_ENTRY #define RUNTIME_FUNCTION _WINNT_DUP_RUNTIME_FUNCTION -#if defined (MDE_CPU_IA32) && (_MSC_VER < 1800) -#define InterlockedIncrement _WINNT_DUP_InterlockedIncrement -#define InterlockedDecrement _WINNT_DUP_InterlockedDecrement -#define InterlockedCompareExchange64 _WINNT_DUP_InterlockedCompareExchange64 -#endif -#undef UNALIGNED -#undef CONST -#undef VOID -#undef DEBUG_EVENT - -// WQBugBug: This typedef is to make "windows.h" buildable. -// It should be removed after the root cause why -// size_t is undefined when go into the line below is found. -#if defined (MDE_CPU_IA32) -typedef UINT32 size_t; -#endif #include "windows.h" #include "windowsx.h" @@ -36,20 +22,9 @@ typedef UINT32 size_t; #undef _LIST_ENTRY #undef LIST_ENTRY #undef RUNTIME_FUNCTION -#undef InterlockedIncrement -#undef InterlockedDecrement -#undef InterlockedCompareExchange64 -#undef InterlockedCompareExchangePointer -#undef CreateEventEx -#undef IMAGE_FILE_MACHINE_ARM64 - -#define VOID void - // -// Prevent collisions with Windows API name macros that deal with Unicode/Not issues +// Prevent collision with FAR field of EFI_SYSTEM_CONTEXT_AARCH64 // -#undef LoadImage -#undef CreateEvent #undef FAR // From 185e424602002e30c1d6c1ad21892d1af0c162a8 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 2 Jan 2026 16:28:10 -0800 Subject: [PATCH 0971/1172] CryptoPkg/Library/IntrinsicLib: IA32 CLANGPDB missing functions Intrinsic functions __aullrem and __alldiv are missing in CLANGPDB IA32 builds due to these functions only being implemented in ASM, and CLANGPDB builds require NASM. * Convert MathLldiv.asm to MathLldiv.nasm * Convert MathUllrem.asm to MathUllrem.nasm * Update IntrinsicLib.inf to use NASM for MSFT and CLANGPDB These missing functions were found with CLANGPDB IA32 build of the EmulatorPkg with -D SECURE_BOOT_ENABLE. Can also be seen with CLANGPDB IA32 build of OpensslLib under Windows and Linux by reviewing the external functions in .lib. Resolves a similar issue with __aulldiv addressed by https://github.com/tianocore/edk2/pull/11266 Signed-off-by: Michael D Kinney --- .../Ia32/{MathLldiv.asm => MathLldiv.nasm} | 28 ++++++++---------- .../Ia32/{MathUllrem.asm => MathUllrem.nasm} | 29 +++++++++---------- .../Library/IntrinsicLib/IntrinsicLib.inf | 7 +++-- 3 files changed, 30 insertions(+), 34 deletions(-) rename CryptoPkg/Library/IntrinsicLib/Ia32/{MathLldiv.asm => MathLldiv.nasm} (91%) rename CryptoPkg/Library/IntrinsicLib/Ia32/{MathUllrem.asm => MathUllrem.nasm} (89%) diff --git a/CryptoPkg/Library/IntrinsicLib/Ia32/MathLldiv.asm b/CryptoPkg/Library/IntrinsicLib/Ia32/MathLldiv.nasm similarity index 91% rename from CryptoPkg/Library/IntrinsicLib/Ia32/MathLldiv.asm rename to CryptoPkg/Library/IntrinsicLib/Ia32/MathLldiv.nasm index 2fccfd6dc014..bb5ca0d967e0 100644 --- a/CryptoPkg/Library/IntrinsicLib/Ia32/MathLldiv.asm +++ b/CryptoPkg/Library/IntrinsicLib/Ia32/MathLldiv.nasm @@ -1,5 +1,5 @@ ;*** -;lldiv.asm - signed long divide routine +;lldiv.nasm - signed long divide routine ; ; Copyright (c) Microsoft Corporation. All rights reserved. ; SPDX-License-Identifier: BSD-2-Clause-Patent @@ -11,11 +11,7 @@ ;Original Implemenation: MSVC 14.29.30133 ; ;******************************************************************************* - .686 - .model flat,C - .code - - + SECTION .text ;*** ;lldiv - signed long divide @@ -39,10 +35,12 @@ ;Exceptions: ; ;******************************************************************************* -_alldiv PROC NEAR -HIWORD EQU [4] ; -LOWORD EQU [0] +global ASM_PFX(_alldiv) +ASM_PFX(_alldiv): + +%define HIWORD(x) [x + 4] +%define LOWORD(x) [x + 0] push edi push esi @@ -73,8 +71,10 @@ LOWORD EQU [0] ; ----------------- ; -DVND equ [esp + 16] ; stack address of dividend (a) -DVSR equ [esp + 24] ; stack address of divisor (b) +; stack address of dividend (a) +%define DVND esp + 16 +; stack address of divisor (b) +%define DVSR esp + 24 ; Determine sign of the result (edi = 0 if result is positive, non-zero @@ -151,7 +151,7 @@ L5: ; dividend is close to 2**64 and the quotient is off by 1. ; - mul dword ptr HIWORD(DVSR) ; QUOT * HIWORD(DVSR) + mul dword HIWORD(DVSR) ; QUOT * HIWORD(DVSR) mov ecx,eax mov eax,LOWORD(DVSR) mul esi ; QUOT * LOWORD(DVSR) @@ -197,7 +197,3 @@ L8: pop edi ret 16 - -_alldiv ENDP - -end diff --git a/CryptoPkg/Library/IntrinsicLib/Ia32/MathUllrem.asm b/CryptoPkg/Library/IntrinsicLib/Ia32/MathUllrem.nasm similarity index 89% rename from CryptoPkg/Library/IntrinsicLib/Ia32/MathUllrem.asm rename to CryptoPkg/Library/IntrinsicLib/Ia32/MathUllrem.nasm index 755fef24d067..5826787ea353 100644 --- a/CryptoPkg/Library/IntrinsicLib/Ia32/MathUllrem.asm +++ b/CryptoPkg/Library/IntrinsicLib/Ia32/MathUllrem.nasm @@ -1,5 +1,5 @@ ;*** -;ullrem.asm - unsigned long remainder routine +;ullrem.nasm - unsigned long remainder routine ; ; Copyright (c) Microsoft Corporation. All rights reserved. ; SPDX-License-Identifier: BSD-2-Clause-Patent @@ -11,10 +11,7 @@ ;Original Implemenation: MSVC 14.29.30133 ; ;******************************************************************************* - .686 - .model flat,C - .code - + SECTION .text ;*** ;ullrem - unsigned long remainder @@ -38,10 +35,12 @@ ;Exceptions: ; ;******************************************************************************* -_aullrem PROC NEAR -HIWORD EQU [4] ; -LOWORD EQU [0] +global ASM_PFX(_aullrem) +ASM_PFX(_aullrem): + +%define HIWORD(x) [x + 4] +%define LOWORD(x) [x + 0] push ebx @@ -66,8 +65,10 @@ LOWORD EQU [0] ; ----------------- ; -DVND equ [esp + 8] ; stack address of dividend (a) -DVSR equ [esp + 16] ; stack address of divisor (b) +; stack address of dividend (a) +%define DVND esp + 8 +; stack address of divisor (b) +%define DVSR esp + 16 ; Now do the divide. First look to see if the divisor is less than 4194304K. ; If so, then we can use a simple algorithm with word divides, otherwise @@ -113,9 +114,9 @@ L3: ; mov ecx,eax ; save a copy of quotient in ECX - mul dword ptr HIWORD(DVSR) + mul dword HIWORD(DVSR) xchg ecx,eax ; put partial product in ECX, get quotient in EAX - mul dword ptr LOWORD(DVSR) + mul dword LOWORD(DVSR) add edx,ecx ; EDX:EAX = QUOT * DVSR jc short L4 ; carry means Quotient is off by 1 @@ -157,7 +158,3 @@ L2: pop ebx ret 16 - -_aullrem ENDP - - end diff --git a/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf b/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf index 8c3951d8c0ff..6dd9f5d5b9e0 100644 --- a/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf +++ b/CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf @@ -35,8 +35,8 @@ Ia32/MathLlshr.asm | MSFT Ia32/MathUlldiv.nasm | MSFT Ia32/MathUlldvrm.asm | MSFT - Ia32/MathLldiv.asm | MSFT - Ia32/MathUllrem.asm | MSFT + Ia32/MathLldiv.nasm | MSFT + Ia32/MathUllrem.nasm | MSFT Ia32/MathLShiftS64.c | INTEL Ia32/MathRShiftU64.c | INTEL @@ -50,6 +50,9 @@ Ia32/MathModU64x64.c | GCC Ia32/MathUlldiv.nasm | CLANGPDB + Ia32/MathLldiv.nasm | CLANGPDB + Ia32/MathUllrem.nasm | CLANGPDB + [Sources.X64] CopyMem.c Math.c | GCC From a0002ddc5342c7bb34fb3a0bb87c1235c8d8821d Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 26 Dec 2025 10:57:44 -0800 Subject: [PATCH 0972/1172] BaseTools/build: Add defines for Windows build environments The stuart tools automatically add -D WIN_HOST_BUILD to edk2 build command line if a Windows build environment is detected. This behavior is added to build.py so that builds of the EmulatorPkg using build.py are not required to add the option -D WIN_HOST_BUILD when building in a Windows environment. This aligns Linux and Windows builds of the EmulatorPkg removing the need to specify extra defines. In order to build the EmulatorPkg for Windows Mingw environments, EmulatorPkg DSC/FDF files require a way to detect if Windows Mingw environment is present. The Windows Mingw environment can be detected if CLANG_BIN is set and mingw32-make.exe is detected in the CLANG_BIN directory. If a Windows Mingw environment is detected, add -D WIN_MINGW32_BUILD to the edk2 build command line. Signed-off-by: Michael D Kinney --- BaseTools/Source/Python/build/build.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/BaseTools/Source/Python/build/build.py b/BaseTools/Source/Python/build/build.py index d403851d5130..6b6b60e9bffb 100755 --- a/BaseTools/Source/Python/build/build.py +++ b/BaseTools/Source/Python/build/build.py @@ -2627,6 +2627,11 @@ def Main(): if platform.platform().find("Windows") >= 0: GlobalData.gIsWindows = True + GlobalData.gCommandLineDefines['WIN_HOST_BUILD'] = 'TRUE' + clang_bin = os.getenv("CLANG_BIN") + if clang_bin: + if os.path.exists(os.path.join(clang_bin, "mingw32-make.exe")): + GlobalData.gCommandLineDefines['WIN_MINGW32_BUILD'] = 'TRUE' else: GlobalData.gIsWindows = False From f26760f5e20326cae5dc645a9be14928cca59ad7 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 1 Jan 2026 12:50:52 -0800 Subject: [PATCH 0973/1172] BaseTools/Source/C/Makefiles: Detect cycle in pids Update _get_win32_parent_processes() to detect a cycle in parent process ids that can cause _get_win32_parent_processes() to never return. If a pid cycle is detected, then return the list of parent process ids detected up to the point the cycle is detected. GitHub Actions builds using windows-2025 can reproduce this issue once in a while. It shows up as job that runs until a timeout. If the job is canceled, the logs show a python stack in the loop in _get_win32_parent_processes(). Signed-off-by: Michael D Kinney --- BaseTools/Source/C/Makefiles/GnuMakeUtils.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/BaseTools/Source/C/Makefiles/GnuMakeUtils.py b/BaseTools/Source/C/Makefiles/GnuMakeUtils.py index dddbf4d46688..28430c2604a9 100644 --- a/BaseTools/Source/C/Makefiles/GnuMakeUtils.py +++ b/BaseTools/Source/C/Makefiles/GnuMakeUtils.py @@ -171,7 +171,11 @@ def _get_win32_parent_processes(): pid = GetCurrentProcessId() parent_processes = [] found_parent = True + seen_pids = set() while found_parent: + if pid in seen_pids: + break + seen_pids.add(pid) found_parent = False for process in process_list: if process.process_id == pid: From b874f927dcb1658fbd2fd3f42dda842bc86ed7aa Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 24 Dec 2025 09:54:02 -0800 Subject: [PATCH 0974/1172] BaseTools/Conf: Update CLANG NASM flags for IA32/X64 Update NASM flags for IA32/X64 in CLANGDWARF and CLANGPDB tool chains to set the correct NASM options for DEBUG, RELEASE, and NOOPT profiles. * NOOPT: Optimizations disabled and generate symbols * DEBUG: Optimizations enabled and generate symbols * RELEASE: Optimizations enabled and do not generate symbols Signed-off-by: Michael D Kinney --- BaseTools/Conf/tools_def.template | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index aaff2c308d1f..6697016574da 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -1684,7 +1684,11 @@ DEFINE CLANGPDB_ALL_CC_FLAGS = DEF(GCC48_ALL_CC_FLAGS) DEF(CLANGPDB_WARN *_CLANGPDB_IA32_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) -m32 -fno-lto DEF(CLANGPDB_IA32_TARGET) *_CLANGPDB_IA32_ASM_FLAGS = DEF(GCC_ASM_FLAGS) -m32 -march=i386 DEF(CLANGPDB_IA32_TARGET) *_CLANGPDB_IA32_OBJCOPY_FLAGS = -*_CLANGPDB_IA32_NASM_FLAGS = -f win32 + + DEBUG_CLANGPDB_IA32_NASM_FLAGS = -Ox -f win32 -g +RELEASE_CLANGPDB_IA32_NASM_FLAGS = -Ox -f win32 +NOOPT_CLANGPDB_IA32_NASM_FLAGS = -O0 -f win32 -g + *_CLANGPDB_IA32_PP_FLAGS = DEF(GCC_PP_FLAGS) DEF(CLANGPDB_IA32_TARGET) *_CLANGPDB_IA32_ASLPP_FLAGS = DEF(GCC_ASLPP_FLAGS) DEF(CLANGPDB_IA32_TARGET) *_CLANGPDB_IA32_VFRPP_FLAGS = DEF(GCC_VFRPP_FLAGS) DEF(CLANGPDB_IA32_TARGET) @@ -1718,7 +1722,11 @@ NOOPT_CLANGPDB_IA32_DLINK2_FLAGS = *_CLANGPDB_X64_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) -m64 -fno-lto DEF(CLANGPDB_X64_TARGET) *_CLANGPDB_X64_ASM_FLAGS = DEF(GCC_ASM_FLAGS) -m64 DEF(CLANGPDB_X64_TARGET) *_CLANGPDB_X64_OBJCOPY_FLAGS = -*_CLANGPDB_X64_NASM_FLAGS = -f win64 + + DEBUG_CLANGPDB_X64_NASM_FLAGS = -Ox -f win64 -g +RELEASE_CLANGPDB_X64_NASM_FLAGS = -Ox -f win64 +NOOPT_CLANGPDB_X64_NASM_FLAGS = -O0 -f win64 -g + *_CLANGPDB_X64_PP_FLAGS = DEF(GCC_PP_FLAGS) DEF(CLANGPDB_X64_TARGET) *_CLANGPDB_X64_ASLPP_FLAGS = DEF(GCC_ASLPP_FLAGS) DEF(CLANGPDB_X64_TARGET) *_CLANGPDB_X64_VFRPP_FLAGS = DEF(GCC_VFRPP_FLAGS) DEF(CLANGPDB_X64_TARGET) @@ -1793,7 +1801,11 @@ DEFINE CLANGDWARF_ALL_CC_FLAGS = DEF(GCC48_ALL_CC_FLAGS) DEF(CLANGDWARF_ *_CLANGDWARF_IA32_ASM_FLAGS = DEF(GCC5_ASM_FLAGS) -m32 -march=i386 DEF(CLANGDWARF_IA32_TARGET) *_CLANGDWARF_IA32_RC_FLAGS = DEF(GCC_IA32_RC_FLAGS) *_CLANGDWARF_IA32_OBJCOPY_FLAGS = -*_CLANGDWARF_IA32_NASM_FLAGS = -f elf32 + + DEBUG_CLANGDWARF_IA32_NASM_FLAGS = -Ox -f elf32 -g +RELEASE_CLANGDWARF_IA32_NASM_FLAGS = -Ox -f elf32 +NOOPT_CLANGDWARF_IA32_NASM_FLAGS = -O0 -f elf32 -g + *_CLANGDWARF_IA32_PP_FLAGS = DEF(GCC_PP_FLAGS) DEF(CLANGDWARF_IA32_TARGET) *_CLANGDWARF_IA32_ASLPP_FLAGS = DEF(GCC_ASLPP_FLAGS) DEF(CLANGDWARF_IA32_TARGET) *_CLANGDWARF_IA32_VFRPP_FLAGS = DEF(GCC_VFRPP_FLAGS) DEF(CLANGDWARF_IA32_TARGET) @@ -1829,7 +1841,11 @@ NOOPT_CLANGDWARF_IA32_DLINK2_FLAGS = DEF(CLANGDWARF_IA32_DLINK2_FLAGS) -O0 - *_CLANGDWARF_X64_ASM_FLAGS = DEF(GCC5_ASM_FLAGS) -m64 DEF(CLANGDWARF_X64_TARGET) *_CLANGDWARF_X64_RC_FLAGS = DEF(GCC_X64_RC_FLAGS) *_CLANGDWARF_X64_OBJCOPY_FLAGS = -*_CLANGDWARF_X64_NASM_FLAGS = -f elf64 + + DEBUG_CLANGDWARF_X64_NASM_FLAGS = -Ox -f elf64 -g +RELEASE_CLANGDWARF_X64_NASM_FLAGS = -Ox -f elf64 +NOOPT_CLANGDWARF_X64_NASM_FLAGS = -O0 -f elf64 -g + *_CLANGDWARF_X64_PP_FLAGS = DEF(GCC_PP_FLAGS) DEF(CLANGDWARF_X64_TARGET) *_CLANGDWARF_X64_ASLPP_FLAGS = DEF(GCC_ASLPP_FLAGS) DEF(CLANGDWARF_X64_TARGET) *_CLANGDWARF_X64_VFRPP_FLAGS = DEF(GCC_VFRPP_FLAGS) DEF(CLANGDWARF_X64_TARGET) From 20233f156c2e561333ce35e195e00bd58fca38a3 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 24 Dec 2025 09:50:00 -0800 Subject: [PATCH 0975/1172] BaseTools/Conf: Align CLANGDWARF with GCC .efi rules Update CLANGDWARF to work just like GCC for build rules that convert ELF images to PE/COFF images. This common build rule uses OBJCOPY. Add OBJCOPY_PATH to CLANGDWARF for all CPU architectures in tools_def.template. Signed-off-by: Michael D Kinney --- BaseTools/Conf/build_rule.template | 12 ++---------- BaseTools/Conf/tools_def.template | 4 ++++ 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_rule.template index 76263a10659b..b12ff5995a2f 100755 --- a/BaseTools/Conf/build_rule.template +++ b/BaseTools/Conf/build_rule.template @@ -403,16 +403,7 @@ -$(CP) $(DEBUG_DIR)(+)*.map $(OUTPUT_DIR) -$(CP) $(DEBUG_DIR)(+)*.pdb $(OUTPUT_DIR) - - $(CP) ${src} $(DEBUG_DIR)(+)$(MODULE_NAME).debug - -$(CP) $(DEBUG_DIR)(+)$(MODULE_NAME).debug $(BIN_DIR)(+)$(MODULE_NAME_GUID).debug - - "$(GENFW)" -e $(MODULE_TYPE) -o ${dst} ${src} $(GENFW_FLAGS) - $(CP) ${dst} $(DEBUG_DIR) - $(CP) ${dst} $(BIN_DIR)(+)$(MODULE_NAME_GUID).efi - -$(CP) $(DEBUG_DIR)(+)*.map $(OUTPUT_DIR) - - + $(CP) ${src} $(DEBUG_DIR)(+)$(MODULE_NAME).debug "$(OBJCOPY)" $(OBJCOPY_STRIPFLAG) ${src} @@ -426,6 +417,7 @@ $(CP) ${dst} $(DEBUG_DIR) $(CP) ${dst} $(BIN_DIR)(+)$(MODULE_NAME_GUID).efi -$(CP) $(DEBUG_DIR)(+)*.map $(OUTPUT_DIR) + -$(CP) $(DEBUG_DIR)(+)*.pdb $(OUTPUT_DIR) # tool to convert Mach-O to PE/COFF diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index 6697016574da..b2c10db72c9f 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -1785,6 +1785,7 @@ DEFINE CLANGDWARF_ALL_CC_FLAGS = DEF(GCC48_ALL_CC_FLAGS) DEF(CLANGDWARF_ ########################### # CLANGDWARF IA32 definitions ########################### +*_CLANGDWARF_IA32_OBJCOPY_PATH = ENV(CLANGDWARF_IA32_PREFIX)llvm-objcopy *_CLANGDWARF_IA32_CC_PATH = DEF(CLANGDWARF_IA32_PREFIX)clang *_CLANGDWARF_IA32_SLINK_PATH = DEF(CLANGDWARF_IA32_PREFIX)llvm-ar *_CLANGDWARF_IA32_DLINK_PATH = DEF(CLANGDWARF_IA32_PREFIX)clang @@ -1825,6 +1826,7 @@ NOOPT_CLANGDWARF_IA32_DLINK2_FLAGS = DEF(CLANGDWARF_IA32_DLINK2_FLAGS) -O0 - ########################## # CLANGDWARF X64 definitions ########################## +*_CLANGDWARF_X64_OBJCOPY_PATH = ENV(CLANGDWARF_X64_PREFIX)llvm-objcopy *_CLANGDWARF_X64_CC_PATH = DEF(CLANGDWARF_X64_PREFIX)clang *_CLANGDWARF_X64_SLINK_PATH = DEF(CLANGDWARF_X64_PREFIX)llvm-ar *_CLANGDWARF_X64_DLINK_PATH = DEF(CLANGDWARF_X64_PREFIX)clang @@ -1876,6 +1878,7 @@ DEFINE CLANGDWARF_AARCH64_DLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_ *_CLANGDWARF_AARCH64_ASL_OUTFLAGS = DEF(IASL_OUTFLAGS) *_CLANGDWARF_AARCH64_DTCPP_FLAGS = DEF(GCC_DTCPP_FLAGS) +*_CLANGDWARF_AARCH64_OBJCOPY_PATH = ENV(CLANGDWARF_BIN)llvm-objcopy *_CLANGDWARF_AARCH64_CC_PATH = ENV(CLANGDWARF_BIN)clang *_CLANGDWARF_AARCH64_ASM_PATH = ENV(CLANGDWARF_BIN)clang *_CLANGDWARF_AARCH64_PP_PATH = ENV(CLANGDWARF_BIN)clang @@ -1928,6 +1931,7 @@ DEFINE CLANGDWARF_RISCV64_DLINK_FLAGS = DEF(CLANGDWARF_RISCV64_TARGET) DEF *_CLANGDWARF_RISCV64_DTCPP_FLAGS = DEF(GCC_DTCPP_FLAGS) *_CLANGDWARF_RISCV64_DEPS_FLAGS = DEF(GCC_DEPS_FLAGS) +*_CLANGDWARF_RISCV64_OBJCOPY_PATH = ENV(CLANGDWARF_BIN)llvm-objcopy *_CLANGDWARF_RISCV64_CC_PATH = ENV(CLANGDWARF_BIN)clang *_CLANGDWARF_RISCV64_ASM_PATH = ENV(CLANGDWARF_BIN)clang *_CLANGDWARF_RISCV64_PP_PATH = ENV(CLANGDWARF_BIN)clang From 85d3fc596bcc0193cac6b57140a622b8ac5c2b8e Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 24 Dec 2025 10:03:46 -0800 Subject: [PATCH 0976/1172] BaseTools/Conf: Use common rule for Hii-Binary-Package Update the Hii-Binary-Package rules to use a common rule for all toolchains except XCODE. This adds GENFWHII_FLAGS to tools_def.template and supports the use of either a resource compiler from VS20xx/LLMV or the use of objcopy for tool chains that do not provide a resource compiler. There are cases where CLANGDWARF needs to use llvm-rc, so the same rule must be compatible with objcopy, rc, and llvm-rc. Signed-off-by: Michael D Kinney --- BaseTools/Conf/build_rule.template | 36 ++++++++++++++++++++++++------ BaseTools/Conf/tools_def.template | 18 ++++++++++++--- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_rule.template index b12ff5995a2f..7513ecb9566c 100755 --- a/BaseTools/Conf/build_rule.template +++ b/BaseTools/Conf/build_rule.template @@ -692,18 +692,40 @@ *.hpk - + $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.lib $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc - - "$(GENFW)" -o $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc -g $(MODULE_GUID) --hiipackage $(HII_BINARY_PACKAGES) $(GENFW_FLAGS) - "$(RC)" /Fo${dst} $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc + # + # RC tool for MSFT and CLANGPDB is typically rc or llvm-rc: + # rc [options] .RC input file + # llvm-rc [options] file... + # + # RC tool for GCC and CLANGDWARF is typically objcopy: + # objcopy [option(s)] in-file [out-file] + # + # In the objcopy form, the [out-file] is optional. If it is not provided + # then the input file is used as the output file. + # + # In the rc form, if /FO option is not provided then the output is generated + # in the same file path as the input file with a .res extension. + # + # There are cases where CLANGDWARF needs to use llvm-rc, so the same rule + # must be compatible with objcopy, rc, and llvm-rc. The common form does + # not specify an output file and the default output file behavior is used. + # + # In order to generate the final {dst} in all cases, a copy command that + # is allowed to fail without error is used to copy the .res file to the + # .rc file so when the rc or llvm-rc command is used the result is the same + # as objcopy. Finally, the .rc file produced in all cases is copied to {dst}. + # + + "$(GENFW)" -o $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc -g $(MODULE_GUID) $(GENFWHII_FLAGS) $(HII_BINARY_PACKAGES) $(GENFW_FLAGS) + "$(RC)" $(RC_FLAGS) $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc + -$(CP) $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.res $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc + $(CP) $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc ${dst} - - "$(GENFW)" -o $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc -g $(MODULE_GUID) --hiibinpackage $(HII_BINARY_PACKAGES) $(GENFW_FLAGS) - "$(RC)" $(RC_FLAGS) $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc ${dst} "$(GENFW)" -o $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc -g $(MODULE_GUID) --hiibinpackage $(HII_BINARY_PACKAGES) $(GENFW_FLAGS) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index b2c10db72c9f..90924fcd946d 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -280,7 +280,8 @@ DEFINE DTC_BIN = ENV(DTC_PREFIX)dtc *_VS2015_*_PP_FLAGS = /nologo /E /TC /FIAutoGen.h *_VS2015_*_VFRPP_FLAGS = /nologo /E /TC /DVFRCOMPILE /FI$(MODULE_NAME)StrDefs.h *_VS2015_*_DLINK2_FLAGS = -*_VS2015_*_DEPS_FLAGS = DEF(MSFT_DEPS_FLAGS) +*_VS2015_*_DEPS_FLAGS = DEF(MSFT_DEPS_FLAGS) +*_VS2015_*_GENFWHII_FLAGS = --hiipackage *_VS2015_*_ASM16_PATH = DEF(VS2015_BIN)\ml.exe ################## @@ -374,6 +375,7 @@ NOOPT_VS2015_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /OPT:REF /OPT *_VS2015x86_*_VFRPP_FLAGS = /nologo /E /TC /DVFRCOMPILE /FI$(MODULE_NAME)StrDefs.h *_VS2015x86_*_DLINK2_FLAGS = *_VS2015x86_*_DEPS_FLAGS = DEF(MSFT_DEPS_FLAGS) +*_VS2015x86_*_GENFWHII_FLAGS = --hiipackage *_VS2015x86_*_ASM16_PATH = DEF(VS2015x86_BIN)\ml.exe ################## @@ -468,6 +470,7 @@ NOOPT_VS2015x86_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /OPT:REF *_VS2017_*_VFRPP_FLAGS = /nologo /E /TC /DVFRCOMPILE /FI$(MODULE_NAME)StrDefs.h *_VS2017_*_DLINK2_FLAGS = /WHOLEARCHIVE *_VS2017_*_ASM16_PATH = DEF(VS2017_BIN_IA32)\ml.exe +*_VS2017_*_GENFWHII_FLAGS = --hiipackage *_VS2017_*_DEPS_FLAGS = DEF(MSFT_DEPS_FLAGS) ################## # ASL definitions @@ -583,6 +586,7 @@ NOOPT_VS2017_AARCH64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /OPT:REF *_VS2019_*_VFRPP_FLAGS = /nologo /E /TC /DVFRCOMPILE /FI$(MODULE_NAME)StrDefs.h *_VS2019_*_DLINK2_FLAGS = /WHOLEARCHIVE *_VS2019_*_ASM16_PATH = DEF(VS2019_BIN_IA32)\ml.exe +*_VS2019_*_GENFWHII_FLAGS = --hiipackage *_VS2019_*_DEPS_FLAGS = DEF(MSFT_DEPS_FLAGS) ################## # ASL definitions @@ -699,6 +703,7 @@ NOOPT_VS2019_AARCH64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /OPT:REF *_VS2022_*_VFRPP_FLAGS = /nologo /E /TC /DVFRCOMPILE /FI$(MODULE_NAME)StrDefs.h *_VS2022_*_DLINK2_FLAGS = /WHOLEARCHIVE *_VS2022_*_ASM16_PATH = DEF(VS2022_BIN_IA32)\ml.exe +*_VS2022_*_GENFWHII_FLAGS = --hiipackage *_VS2022_*_DEPS_FLAGS = DEF(MSFT_DEPS_FLAGS) ################## # ASL definitions @@ -957,6 +962,7 @@ DEFINE GCC5_LOONGARCH64_PP_FLAGS = -mabi=lp64d -march=loongarch64 DEF( *_GCC48_*_ASL_FLAGS = DEF(IASL_FLAGS) *_GCC48_*_ASL_OUTFLAGS = DEF(IASL_OUTFLAGS) *_GCC48_*_DEPS_FLAGS = DEF(GCC_DEPS_FLAGS) +*_GCC48_*_GENFWHII_FLAGS = --hiibinpackage ################## # GCC48 IA32 definitions @@ -1064,6 +1070,7 @@ RELEASE_GCC48_AARCH64_CC_FLAGS = DEF(GCC48_AARCH64_CC_FLAGS) -Wno-unused-but-s *_GCC49_*_ASL_FLAGS = DEF(IASL_FLAGS) *_GCC49_*_ASL_OUTFLAGS = DEF(IASL_OUTFLAGS) *_GCC49_*_DEPS_FLAGS = DEF(GCC_DEPS_FLAGS) +*_GCC49_*_GENFWHII_FLAGS = --hiibinpackage ################## # GCC49 IA32 definitions @@ -1178,6 +1185,7 @@ RELEASE_GCC49_AARCH64_DLINK_XIPFLAGS = -z common-page-size=0x20 *_GCCNOLTO_*_ASL_FLAGS = DEF(IASL_FLAGS) *_GCCNOLTO_*_ASL_OUTFLAGS = DEF(IASL_OUTFLAGS) *_GCCNOLTO_*_DEPS_FLAGS = DEF(GCC_DEPS_FLAGS) +*_GCCNOLTO_*_GENFWHII_FLAGS = --hiibinpackage ################## # GCCNOLTO IA32 definitions @@ -1291,7 +1299,8 @@ RELEASE_GCCNOLTO_AARCH64_DLINK_XIPFLAGS = -z common-page-size=0x20 *_GCC5_*_APP_FLAGS = *_GCC5_*_ASL_FLAGS = DEF(IASL_FLAGS) *_GCC5_*_ASL_OUTFLAGS = DEF(IASL_OUTFLAGS) -*_GCC5_*_DEPS_FLAGS = DEF(GCC_DEPS_FLAGS) +*_GCC5_*_DEPS_FLAGS = DEF(GCC_DEPS_FLAGS) +*_GCC5_*_GENFWHII_FLAGS = --hiibinpackage ################## # GCC5 IA32 definitions @@ -1475,7 +1484,8 @@ RELEASE_GCC5_LOONGARCH64_CC_FLAGS = DEF(GCC5_LOONGARCH64_CC_FLAGS) -Wno-un *_GCC_*_APP_FLAGS = *_GCC_*_ASL_FLAGS = DEF(IASL_FLAGS) *_GCC_*_ASL_OUTFLAGS = DEF(IASL_OUTFLAGS) -*_GCC_*_DEPS_FLAGS = DEF(GCC_DEPS_FLAGS) +*_GCC_*_DEPS_FLAGS = DEF(GCC_DEPS_FLAGS) +*_GCC_*_GENFWHII_FLAGS = --hiibinpackage ################## # GCC IA32 definitions @@ -1657,6 +1667,7 @@ RELEASE_GCC_LOONGARCH64_CC_FLAGS = DEF(GCC5_LOONGARCH64_CC_FLAGS) -Wno-unu *_CLANGPDB_*_ASL_OUTFLAGS = DEF(DEFAULT_WIN_ASL_OUTFLAGS) *_CLANGPDB_*_ASLDLINK_FLAGS = DEF(MSFT_ASLDLINK_FLAGS) *_CLANGPDB_*_DEPS_FLAGS = DEF(GCC_DEPS_FLAGS) +*_CLANGPDB_*_GENFWHII_FLAGS = --hiipackage DEFINE CLANGPDB_IA32_PREFIX = ENV(CLANG_BIN) DEFINE CLANGPDB_X64_PREFIX = ENV(CLANG_BIN) @@ -1762,6 +1773,7 @@ NOOPT_CLANGPDB_X64_GENFW_FLAGS = --keepexceptiontable *_CLANGDWARF_*_APP_FLAGS = *_CLANGDWARF_*_ASL_FLAGS = DEF(IASL_FLAGS) *_CLANGDWARF_*_ASL_OUTFLAGS = DEF(IASL_OUTFLAGS) +*_CLANGDWARF_*_GENFWHII_FLAGS = --hiibinpackage DEFINE CLANGDWARF_IA32_PREFIX = ENV(CLANG_BIN) DEFINE CLANGDWARF_X64_PREFIX = ENV(CLANG_BIN) From ccfc888f06d8f1b7013001eabd86f0735cbbdb7e Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 24 Dec 2025 09:43:06 -0800 Subject: [PATCH 0977/1172] BaseTools/Conf: Add target to CLANGDWARF for IA32/X64 The CLANGDWARF tool chain requires the target to be provided to both the compiler and linker. Update tools_def.template to add CLANGDWARF_IA32_TARGET and CLAGDWARF_X64_TARGET to CLANGDWARF DLINK2_FLAGS. This aligns IA32/X64 with other CLANGDWARF CPU profiles. Signed-off-by: Michael D Kinney --- BaseTools/Conf/tools_def.template | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index 90924fcd946d..9b34e80dadfe 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -1824,15 +1824,15 @@ NOOPT_CLANGDWARF_IA32_NASM_FLAGS = -O0 -f elf32 -g *_CLANGDWARF_IA32_VFRPP_FLAGS = DEF(GCC_VFRPP_FLAGS) DEF(CLANGDWARF_IA32_TARGET) DEBUG_CLANGDWARF_IA32_CC_FLAGS = DEF(CLANGDWARF_ALL_CC_FLAGS) -fno-pic -fno-pie -m32 -Oz -flto -march=i586 DEF(CLANGDWARF_IA32_TARGET) -g -malign-double -DEBUG_CLANGDWARF_IA32_DLINK_FLAGS = DEF(CLANGDWARF_IA32_X64_DLINK_FLAGS) -flto -Wl,-O3 -Wl,-melf_i386 -Wl,--oformat,elf32-i386 +DEBUG_CLANGDWARF_IA32_DLINK_FLAGS = DEF(CLANGDWARF_IA32_TARGET) DEF(CLANGDWARF_IA32_X64_DLINK_FLAGS) -flto -Wl,-O3 -Wl,-melf_i386 -Wl,--oformat,elf32-i386 DEBUG_CLANGDWARF_IA32_DLINK2_FLAGS = DEF(CLANGDWARF_IA32_DLINK2_FLAGS) -O3 -fuse-ld=lld -no-pie RELEASE_CLANGDWARF_IA32_CC_FLAGS = DEF(CLANGDWARF_ALL_CC_FLAGS) -fno-pic -fno-pie -m32 -Oz -flto -march=i586 DEF(CLANGDWARF_IA32_TARGET) -malign-double -RELEASE_CLANGDWARF_IA32_DLINK_FLAGS = DEF(CLANGDWARF_IA32_X64_DLINK_FLAGS) -flto -Wl,-O3 -Wl,-melf_i386 -Wl,--oformat,elf32-i386 +RELEASE_CLANGDWARF_IA32_DLINK_FLAGS = DEF(CLANGDWARF_IA32_TARGET) DEF(CLANGDWARF_IA32_X64_DLINK_FLAGS) -flto -Wl,-O3 -Wl,-melf_i386 -Wl,--oformat,elf32-i386 RELEASE_CLANGDWARF_IA32_DLINK2_FLAGS = DEF(CLANGDWARF_IA32_DLINK2_FLAGS) -O3 -fuse-ld=lld -no-pie NOOPT_CLANGDWARF_IA32_CC_FLAGS = DEF(CLANGDWARF_ALL_CC_FLAGS) -fno-pic -fno-pie -m32 -O0 -march=i586 DEF(CLANGDWARF_IA32_TARGET) -g -malign-double -NOOPT_CLANGDWARF_IA32_DLINK_FLAGS = DEF(CLANGDWARF_IA32_X64_DLINK_FLAGS) -Wl,-O0 -Wl,-melf_i386 -Wl,--oformat,elf32-i386 +NOOPT_CLANGDWARF_IA32_DLINK_FLAGS = DEF(CLANGDWARF_IA32_TARGET) DEF(CLANGDWARF_IA32_X64_DLINK_FLAGS) -Wl,-O0 -Wl,-melf_i386 -Wl,--oformat,elf32-i386 NOOPT_CLANGDWARF_IA32_DLINK2_FLAGS = DEF(CLANGDWARF_IA32_DLINK2_FLAGS) -O0 -fuse-ld=lld -no-pie ########################## @@ -1865,15 +1865,15 @@ NOOPT_CLANGDWARF_X64_NASM_FLAGS = -O0 -f elf64 -g *_CLANGDWARF_X64_VFRPP_FLAGS = DEF(GCC_VFRPP_FLAGS) DEF(CLANGDWARF_X64_TARGET) DEBUG_CLANGDWARF_X64_CC_FLAGS = DEF(CLANGDWARF_ALL_CC_FLAGS) -m64 "-DEFIAPI=__attribute__((ms_abi))" -mno-red-zone -mcmodel=small -fpie -fdirect-access-external-data -Oz -flto DEF(CLANGDWARF_X64_TARGET) -g -DEBUG_CLANGDWARF_X64_DLINK_FLAGS = DEF(CLANGDWARF_IA32_X64_DLINK_FLAGS) -flto -Wl,-O3 -Wl,-melf_x86_64 -Wl,--oformat,elf64-x86-64 -Wl,-pie -mcmodel=small -Wl,--apply-dynamic-relocs +DEBUG_CLANGDWARF_X64_DLINK_FLAGS = DEF(CLANGDWARF_X64_TARGET) DEF(CLANGDWARF_IA32_X64_DLINK_FLAGS) -flto -Wl,-O3 -Wl,-melf_x86_64 -Wl,--oformat,elf64-x86-64 -Wl,-pie -mcmodel=small -Wl,--apply-dynamic-relocs DEBUG_CLANGDWARF_X64_DLINK2_FLAGS = DEF(CLANGDWARF_X64_DLINK2_FLAGS) -O3 -fuse-ld=lld RELEASE_CLANGDWARF_X64_CC_FLAGS = DEF(CLANGDWARF_ALL_CC_FLAGS) -m64 "-DEFIAPI=__attribute__((ms_abi))" -mno-red-zone -mcmodel=small -fpie -fdirect-access-external-data -Oz -flto DEF(CLANGDWARF_X64_TARGET) -RELEASE_CLANGDWARF_X64_DLINK_FLAGS = DEF(CLANGDWARF_IA32_X64_DLINK_FLAGS) -flto -Wl,-O3 -Wl,-melf_x86_64 -Wl,--oformat,elf64-x86-64 -Wl,-pie -mcmodel=small -Wl,--apply-dynamic-relocs +RELEASE_CLANGDWARF_X64_DLINK_FLAGS = DEF(CLANGDWARF_X64_TARGET) DEF(CLANGDWARF_IA32_X64_DLINK_FLAGS) -flto -Wl,-O3 -Wl,-melf_x86_64 -Wl,--oformat,elf64-x86-64 -Wl,-pie -mcmodel=small -Wl,--apply-dynamic-relocs RELEASE_CLANGDWARF_X64_DLINK2_FLAGS = DEF(CLANGDWARF_X64_DLINK2_FLAGS) -O3 -fuse-ld=lld NOOPT_CLANGDWARF_X64_CC_FLAGS = DEF(CLANGDWARF_ALL_CC_FLAGS) -m64 "-DEFIAPI=__attribute__((ms_abi))" -mno-red-zone -mcmodel=small -fpie -fdirect-access-external-data -O0 DEF(CLANGDWARF_X64_TARGET) -g -NOOPT_CLANGDWARF_X64_DLINK_FLAGS = DEF(CLANGDWARF_IA32_X64_DLINK_FLAGS) -Wl,-O0 -Wl,-melf_x86_64 -Wl,--oformat,elf64-x86-64 -Wl,-pie -mcmodel=small -Wl,--apply-dynamic-relocs +NOOPT_CLANGDWARF_X64_DLINK_FLAGS = DEF(CLANGDWARF_X64_TARGET) DEF(CLANGDWARF_IA32_X64_DLINK_FLAGS) -Wl,-O0 -Wl,-melf_x86_64 -Wl,--oformat,elf64-x86-64 -Wl,-pie -mcmodel=small -Wl,--apply-dynamic-relocs NOOPT_CLANGDWARF_X64_DLINK2_FLAGS = DEF(CLANGDWARF_X64_DLINK2_FLAGS) -O0 -fuse-ld=lld ################## From 27020f33a1b218facfb2c740ebd37cb90cfad2c7 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 26 Dec 2025 11:34:44 -0800 Subject: [PATCH 0978/1172] UnitTestFrameworkPkg: Add Windows host-based unit test define There are cases where DSC files must have logic to detect if host-based unit tests are being built in a Windows environment. Add HOST_BASED_UNIT_TESTING_ENABLED define set to TRUE if that condition is detected. One example is the optimized assembly files from Openssl project that generate NASM source files that assume Windows calling convention. Those NASM files must be used for both firmware builds where the default compiler calling convention is the Windows calling convention and host-based unit tests built using any of the compilers supported in Windows environment. Also update UnitTestFrameworkPkgHost.dsc.inc to set BUILD_TARGETS to NOOPT because host-based unit tests only support NOOPT. If the DSC file that includes UnitTestFrameworkPkgHost.dsc.inc uses a BUILD_TARGETS other than NOOPT, this will override the DSC setting. Signed-off-by: Michael D Kinney --- UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc index 0f931d973377..a56cb21925ce 100644 --- a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc +++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc @@ -9,6 +9,16 @@ !include UnitTestFrameworkPkg/UnitTestFrameworkPkgCommon.dsc.inc [Defines] + HOST_BASED_UNIT_TESTING_ENABLED = TRUE + + # + # Host based unit test builds only support NOOPT build target + # + BUILD_TARGETS = NOOPT + + # + # Always enable code coverage and address sanitizers + # UNIT_TESTING_CODE_COVERAGE_ENABLE = TRUE UNIT_TESTING_ADDRESS_SANITIZER_ENABLE = TRUE From 706a3f989e0cda2d5b9bb4d9d91edb8e3da93709 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 26 Dec 2025 11:41:39 -0800 Subject: [PATCH 0979/1172] CryptoPkg: Use Openssl NASM for Windows host-based unit tests The optimized NASM assembly files from Openssl project for IA32/X64 assume a Windows calling convention. Those NASM files must be used for both firmware builds where the default compiler calling convention is the Windows calling convention and host-based unit tests built using any of the compilers supported in Windows environment. All the VS20xx tool chains in the MSFT tool family use a Windows calling convention. The CLANGPDB tool chain under both Windows and Linux environments also use a Windows calling convention. Set PcdOpensslLibAssemblySourceStyleNasm to TRUE for these conditions. Host-based unit tests built in a Windows environment also use a Windows calling convention. If WIN_HOST_BUILD is set indicating a Windows build environment and HOST_BASED_UNIT_TESTING_ENABLED is also set indicating host-based unit tests, then PcdOpensslLibAssemblySourceStyleNasm must be set to TRUE. Otherwise a Linux calling convention is assumed and PcdOpensslLibAssemblySourceStyleNasm uses its DEC default value of FALSE that uses the Openssl project optimized .S files that assume a Linux calling convention. Signed-off-by: Michael D Kinney --- CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc b/CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc index 662aaf2ff292..c3eb8049ca5f 100644 --- a/CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc +++ b/CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc @@ -8,6 +8,17 @@ ## [PcdsFeatureFlag] +# +# Use Openssl NASM assembly source files that assume Windows calling convention +# if the family is MSFT or the toolchain is CLANGPDB for Windows or Linux. +# Also use Openssl NASM assembly source files that assume Windows calling +# convention if host-based unit tests are being build for Windows. +# Otherwise, the Openssl .S assembly source files that assume the Linux calling +# convention. +# !if "$(FAMILY)" == "MSFT" || "$(TOOL_CHAIN_TAG)" == "CLANGPDB" gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm|TRUE !endif +!if $(HOST_BASED_UNIT_TESTING_ENABLED) AND $(WIN_HOST_BUILD) +gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm|TRUE +!endif From 4febebe9c2e8c6b53c2814b2ac113bac1ca335c6 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Mon, 5 Jan 2026 15:39:35 -0500 Subject: [PATCH 0980/1172] .pytool: Add uncrustify disable/enable inline strings Adds strings that can be specified in files to disable/enable uncrustify processing inline. For example: ``` // BEGIN_UNCRUSTIFY_DISABLE ...code that should not be processed by uncrustify... // END_UNCRUSTIFY_DISABLE ``` Signed-off-by: Michael Kubacki --- .pytool/Plugin/UncrustifyCheck/Readme.md | 16 ++++++++++++++++ .pytool/Plugin/UncrustifyCheck/uncrustify.cfg | 7 +++++++ 2 files changed, 23 insertions(+) diff --git a/.pytool/Plugin/UncrustifyCheck/Readme.md b/.pytool/Plugin/UncrustifyCheck/Readme.md index e64bf9b7a5a0..43ff7ba5f85a 100644 --- a/.pytool/Plugin/UncrustifyCheck/Readme.md +++ b/.pytool/Plugin/UncrustifyCheck/Readme.md @@ -142,3 +142,19 @@ indicates a formatting issue was found and the test is marked failed (unless `Au The test case log will contain a report of which files failed to format properly, allowing the user to run Uncrustify against the file locally to fix the issue. If the `OutputFileDiffs` configuration option is set to `True`, the plugin will output diff chunks for all code formatting issues in the test case log. + +## Disabling Uncrustify for Code Sections + +Due to the number of scenarios presented to Uncrustify, there may be cases when it simply does not format the code as +expected. While the Uncrustify plugin allows the file to be ignored, in the case where only a small section of code +needs to be ignored, the following comments can be used to disable Uncrustify processing for a section of code. + +```c +// BEGIN_UNCRUSTIFY_DISABLE +// Core ignored by Uncrustify... +// END_UNCRUSTIFY_DISABLE +``` + +These marker values are defined in the Uncrustify configuration file used by this plugin. + +See: [.pytool/Plugin/UncrustifyCheck/uncrustify.cfg](https://github.com/tianocore/edk2/blob/master/.pytool/Plugin/UncrustifyCheck/uncrustify.cfg). diff --git a/.pytool/Plugin/UncrustifyCheck/uncrustify.cfg b/.pytool/Plugin/UncrustifyCheck/uncrustify.cfg index d7e86a6e57e6..6cea3373c8c4 100644 --- a/.pytool/Plugin/UncrustifyCheck/uncrustify.cfg +++ b/.pytool/Plugin/UncrustifyCheck/uncrustify.cfg @@ -460,3 +460,10 @@ set QUALIFIER OUT # Explicitly define EDK II types set TYPE EFI_STATUS set TYPE VOID + +# Specify the marker used in comments to disable processing of part of the +# file. +disable_processing_cmt = "BEGIN_UNCRUSTIFY_DISABLE" + +# Specify the marker used in comments to (re)enable processing in a file. +enable_processing_cmt = "END_UNCRUSTIFY_DISABLE" From 0f59a2a287dec7b74b138a6a0a8d43814cd82d0b Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 26 Dec 2025 11:07:41 -0800 Subject: [PATCH 0981/1172] BaseTools/WindowsVsToolChain: Add CLANG support Add logic to detect CLANG environments and set the required environment variables. The CLANGPDB tool chain tag in Windows environments can be used with Visual Studio compiler or Mingw CLANG compiler. Add detection of Mingw CLANG compiler first and if Mingw not detected, then use the existing logic for using Visual Studio. The CLANGDWARF tool chain tag in Windows environments can only be used with Mingw CLANG compiler. Add detection of Mingw CLANG compiler first and if Mingw not detected, then fail with an error. Signed-off-by: Michael D Kinney --- .../WindowsVsToolChain/WindowsVsToolChain.py | 181 ++++++++++++------ 1 file changed, 127 insertions(+), 54 deletions(-) diff --git a/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py b/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py index 36fa60ab4e2d..611b9899f72c 100644 --- a/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py +++ b/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py @@ -256,74 +256,147 @@ def do_pre_build(self, thebuilder): # If CLANG_VS_HOST is not set then find the host type based on Host Info. ## elif thebuilder.env.GetValue("TOOL_CHAIN_TAG") == "CLANGPDB": - HostInfo = GetHostInfo() - # check to see if host is configured - # HostType for VS tools should be (defined in tools_def): - # x86 == 32bit Intel - # x64 == 64bit Intel - # arm64 == 64bit Arm # - HostType = shell_environment.GetEnvironment().get_shell_var("CLANG_VS_HOST") - if HostType is not None: - HostType = HostType.lower() - self.Logger.info( - f"CLANG_VS_HOST defined by environment. Value is {HostType}") - else: - #figure it out based on host info - if HostInfo.arch == "x86": - if HostInfo.bit == "32": - HostType = "x86" - elif HostInfo.bit == "64": - HostType = "x64" + # Look for $(CLANG_BIN)/mingw32-make.exe to determine if we are in a + # mingw32 environment + # + clang_bin = shell_environment.GetEnvironment().get_shell_var("CLANG_BIN") + is_mingw32_env = (clang_bin and os.path.exists(os.path.join(clang_bin, "mingw32-make.exe"))) + if is_mingw32_env: + self.Logger.debug("CLANG_BIN is set to a mingw32 toolchain.") + + # + # CLANGPDB requires lld-link.exe to generate PE/COFF images. If + # the mingw32 environment installed does not have lld-link.exe + # then error out. + # + if not os.path.exists(os.path.join(clang_bin, "lld-link.exe")): + self.Logger.error("CLANG_BIN is set to a mingw32 toolchain but lld-link.exe not found.") + return -1 + + # + # Set environment variables for mingw32 CLANGPDB environment + # + basetools_mingw_build = shell_environment.GetEnvironment().get_shell_var("BASETOOLS_MINGW_BUILD") or 'TRUE' + if basetools_mingw_build.upper() != 'TRUE': + self.Logger.error("BASETOOLS_MINGW_BUILD must be set to TRUE for CLANGPDB toolchain.") + return -1 + shell_environment.GetEnvironment().set_shell_var("BASETOOLS_MINGW_BUILD", basetools_mingw_build) + + clang_host_bin = shell_environment.GetEnvironment().get_shell_var("CLANG_HOST_BIN") + if clang_host_bin: + self.Logger.debug("CLANG_HOST_BIN is already set.") else: - # anything other than x86 or x64 is not supported - raise NotImplementedError() + # The environment is mingw32 make add "mingw32-" to the end of the path. + # The rest of the command is derived from definitions in tools.def. + clang_host_bin = 'mingw32-' + shell_environment.GetEnvironment().set_shell_var("CLANG_HOST_BIN", clang_host_bin) - # CLANG_VS_HOST options are not exactly the same as QueryVcVariables. This translates. - VC_HOST_ARCH_TRANSLATOR = { - "x86": "x86", "x64": "AMD64", "arm64": "not supported"} + else: + HostInfo = GetHostInfo() - # now get the environment variables for the platform - shell_env = shell_environment.GetEnvironment() - # Use the tools lib to determine the correct values for the vars that interest us. - vs_vars = locate_tools.QueryVcVariables( - interesting_keys, VC_HOST_ARCH_TRANSLATOR[HostType]) - for (k, v) in vs_vars.items(): - shell_env.set_shell_var(k, v) + # check to see if host is configured + # HostType for VS tools should be (defined in tools_def): + # x86 == 32bit Intel + # x64 == 64bit Intel + # arm64 == 64bit Arm + # + HostType = shell_environment.GetEnvironment().get_shell_var("CLANG_VS_HOST") + if HostType: + HostType = HostType.lower() + self.Logger.info( + f"CLANG_VS_HOST defined by environment. Value is {HostType}") + else: + #figure it out based on host info + if HostInfo.arch == "x86": + if HostInfo.bit == "32": + HostType = "x86" + elif HostInfo.bit == "64": + HostType = "x64" + else: + # anything other than x86 or x64 is not supported + self.Logger.error(f"CLANGPDB not supported for detected host [{HostType.arch}-{HostType.bit}]") + return -1 + + # CLANG_VS_HOST options are not exactly the same as QueryVcVariables. This translates. + VC_HOST_ARCH_TRANSLATOR = { + "x86": "x86", "x64": "AMD64", "arm64": "not supported"} + + # now get the environment variables for the platform + shell_env = shell_environment.GetEnvironment() + # Use the tools lib to determine the correct values for the vars that interest us. + vs_vars = locate_tools.QueryVcVariables( + interesting_keys, VC_HOST_ARCH_TRANSLATOR[HostType]) + for (k, v) in vs_vars.items(): + shell_env.set_shell_var(k, v) + + ## + # If environment already has CLANG_HOST_BIN set then user has already + # set the path to the mingw32 make utility + ## + if shell_environment.GetEnvironment().get_shell_var("CLANG_HOST_BIN") is not None: + self.Logger.debug("CLANG_HOST_BIN is already set.") + else: + install_path = self._get_vs_install_path(None, None) + vc_ver = self._get_vc_version(install_path, None) + + if install_path is None or vc_ver is None: + self.Logger.error("Failed to configure environment for VS") + return -1 + + version_aggregator.GetVersionAggregator().ReportVersion( + "Visual Studio Install Path", install_path, version_aggregator.VersionTypes.INFO) + version_aggregator.GetVersionAggregator().ReportVersion( + "VC Version", vc_ver, version_aggregator.VersionTypes.TOOL) + + # make path align with tools_def.txt + prefix = os.path.join(install_path, "VC", "Tools", "MSVC", vc_ver) + clang_host_bin_prefix = os.path.join(prefix, "bin", "Host%s" % HostType, HostType) + + # now confirm it exists + if not os.path.exists(clang_host_bin_prefix): + self.Logger.error("Path for VS toolchain is invalid") + return -2 + + # The environment is using nmake (not make) so add "n" to the end of the path. + # The rest of the command is derived from definitions in tools.def. + shell_environment.GetEnvironment().set_shell_var("CLANG_HOST_BIN", os.path.join(clang_host_bin_prefix, "n")) + elif thebuilder.env.GetValue("TOOL_CHAIN_TAG") == "CLANGDWARF": ## # If environment already has CLANG_HOST_BIN set then user has already - # set the path to the VS tools like nmake.exe + # set the path to the mingw32 make utility ## - if shell_environment.GetEnvironment().get_shell_var("CLANG_HOST_BIN") is not None: - self.Logger.debug("CLANG_HOST_BIN is already set.") - - else: - install_path = self._get_vs_install_path(None, None) - vc_ver = self._get_vc_version(install_path, None) - if install_path is None or vc_ver is None: - self.Logger.error("Failed to configure environment for VS") - return -1 + basetools_mingw_build = shell_environment.GetEnvironment().get_shell_var("BASETOOLS_MINGW_BUILD") or 'TRUE' + if basetools_mingw_build.upper() != 'TRUE': + self.Logger.error("BASETOOLS_MINGW_BUILD must be set to TRUE for CLANGDWARF toolchain.") + return -1 + shell_environment.GetEnvironment().set_shell_var("BASETOOLS_MINGW_BUILD", basetools_mingw_build) - version_aggregator.GetVersionAggregator().ReportVersion( - "Visual Studio Install Path", install_path, version_aggregator.VersionTypes.INFO) - version_aggregator.GetVersionAggregator().ReportVersion( - "VC Version", vc_ver, version_aggregator.VersionTypes.TOOL) + clang_host_bin = shell_environment.GetEnvironment().get_shell_var("CLANG_HOST_BIN") + if clang_host_bin: + self.Logger.debug("CLANG_HOST_BIN is already set.") + else: + # The environment is mingw32 make add "mingw32-" to the end of the path. + # The rest of the command is derived from definitions in tools.def. + clang_host_bin = 'mingw32-' + shell_environment.GetEnvironment().set_shell_var("CLANG_HOST_BIN", clang_host_bin) - # make path align with tools_def.txt - prefix = os.path.join(install_path, "VC", "Tools", "MSVC", vc_ver) - clang_host_bin_prefix = os.path.join(prefix, "bin", "Host%s" % HostType, HostType) + clang_bin = shell_environment.GetEnvironment().get_shell_var("CLANG_BIN") + if clang_bin: + self.Logger.debug("CLANG_BIN is already set.") + else: + # Assume default installation "c:\edk2-clang\bin\" + clang_bin = "c:\\edk2-clang\\bin\\" - # now confirm it exists - if not os.path.exists(clang_host_bin_prefix): - self.Logger.error("Path for VS toolchain is invalid") - return -2 + # now confirm it exists + if not os.path.exists(os.path.join(clang_bin, clang_host_bin + "make.exe")): + self.Logger.error(f"mingw32 toolchain not found in CLANG_BIN path {clang_bin}") + return -2 - # The environment is using nmake (not make) so add "n" to the end of the path. - # The rest of the command is derived from definitions in tools.def. - shell_environment.GetEnvironment().set_shell_var("CLANG_HOST_BIN", os.path.join(clang_host_bin_prefix, "n")) + shell_environment.GetEnvironment().set_shell_var("CLANG_BIN", clang_bin) return 0 From 923a951e8a77ab62b089295a7e73b78b39940ab8 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Tue, 6 Jan 2026 11:31:07 -0800 Subject: [PATCH 0982/1172] BaseTools/Plugin/HostBasedUnitTestRunner: Add missing quotes for Windows Add missing double quotes for lcov_cobertura --excludes option. Signed-off-by: Michael D Kinney --- .../Plugin/HostBasedUnitTestRunner/HostBasedUnitTestRunner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BaseTools/Plugin/HostBasedUnitTestRunner/HostBasedUnitTestRunner.py b/BaseTools/Plugin/HostBasedUnitTestRunner/HostBasedUnitTestRunner.py index 92f309be7a26..af97c3eaa415 100644 --- a/BaseTools/Plugin/HostBasedUnitTestRunner/HostBasedUnitTestRunner.py +++ b/BaseTools/Plugin/HostBasedUnitTestRunner/HostBasedUnitTestRunner.py @@ -340,7 +340,7 @@ def clang_gen_lcov_xml(self, profdata, testfiles, output_lcov, output_xml): if ret != 0: logging.error(f"clang_gen_lcov_xml: Failed to generate coverage lcov. {output_lcov}") return 1 - ret = RunCmd("lcov_cobertura",f"{output_lcov} --excludes ^.*UnitTest\|^.*MU\|^.*Mock\|^.*DEBUG -o {output_xml}") + ret = RunCmd("lcov_cobertura",f'{output_lcov} --excludes "^.*UnitTest\|^.*MU\|^.*Mock\|^.*DEBUG" -o {output_xml}') if ret != 0: logging.error(f"clang_gen_lcov_xml: Failed generate filtered coverage XML. {output_xml}") return 1 From d97d93bba8a89566065437e6cd9b7771dfda7b98 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Sun, 28 Dec 2025 13:53:16 -0800 Subject: [PATCH 0983/1172] UnitTestFrameworkPkg: Add MINGW CLANG Support * Add checks for supported tool chains with error messages. * Add support for MINGW CLANGDWARF builds * Fix IA32 C++ alignment errors using CLANGDWARF * Add CLANG native code coverage compiler/linker options * Reduce Visual Studio support to VS2019 and VS2022 and simplify linker options for VS20xx and CLANGPDB using VS libraries. * Add correct ASAN libraries for IA32/X64 CLANGPDB builds * Add -z noexectstack linker option for all Linux builds. Signed-off-by: Michael D Kinney --- .../UnitTestFrameworkPkgHost.dsc.inc | 190 +++++++++++++++--- 1 file changed, 157 insertions(+), 33 deletions(-) diff --git a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc index a56cb21925ce..f16ff44e64d2 100644 --- a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc +++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc @@ -40,9 +40,98 @@ NULL|UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.inf StackCheckLib|MdePkg/Library/StackCheckLibNull/StackCheckLibNullHostApplication.inf +# +# Fail with error message if the OS/Compiler combination is not supported +# +# Operating System and Compiler Compatibility Matrix for Host-based unit tests +# NOTE: Only NOOPT build target is supported for unit test builds +# +# +--------------------+--------+----------+------------+-----+----+--------+ +# | OS/Compiler | VS2019 | CLANGPDB | CLANGDWARF | GCC | XCODE5 | +# | | VS2022 | | | GCC5 | | +# | | | | | GCCNOLTO | | +# +--------------------+--------+----------+------------+----------+--------+ +# | Windows/VS |IA32/X64| | | | | +# | Windows/LLVM/VS | | IA32/X64 | | | | +# | Windows/LLVM/MSYS2 | | | X64 | | | +# | Windows/LLVM/MINGW | | | IA32/X64 | | | +# | Linux/LLVM | | | IA32/X64 | | | +# | Linux/GCC | | | | IA32/X64 | | +# | macOS/XCODE5 | | | | |IA32/X64| +# +--------------------+--------+----------+------------+----------+--------+ +# +# * Windows/VS: Windows environment with Visual Studio installed +# * Windows/LLVM/VS: Windows environment with Visual Studio and LLVM 20.1.8 or +# higher installed. The default version of LLVM installed with Visual Studio +# is not supported. +# * https://github.com/llvm/llvm-project/releases +# * Host-based unit tests depend on Visual Studio includes/libraries +# * Windows/LLVM/MSYS2: Windows environment with MSYS2 based LLVM 20.1.8 or +# higher installed. +# * https://github.com/tianocore/edk2-edkrepo/releases?q=clang +# * Host-based unit tests do not use any Visual Studio includes/libraries +# * MSYS2 based LLVM 20.1.8 does not provide IA32 includes/libraries +# * Windows/LLVM/MINGW: Windows environment with LLVM MINGW 20.1.8 or higher +# installed with UCRT includes/libraries. +# * https://github.com/mstorsjo/llvm-mingw/releases +# * Host-based unit tests do not use any Visual Studio includes/libraries +# * UCRT release provide IA32 and X64 includes/libraries +# * Linux/LLVM or Linux/GCC: Linux environment with GCC 13 or higher and +# LLVM 20.1.8 or higher installed. Not all Linux distributions provide IA32 +# includes/libraries for Host-based unit tests. +# * Host-based unit tests use GCC and LLVM includes/libraries +# * Ubuntu 24.04 apt modules for IA32 and X64 includes/libraries: +# build-essential uuid-dev lcov +# g++-13 gcc-13 +# g++-13-x86-64-linux-gnux32 gcc-13-x86-64-linux-gnux32 +# llvm-20 clang-20 lld-20 libclang-rt-20-dev +# gcc-multilib g++-multilib libx11-dev libx11-6 libxext6 libxext-dev +# libc6-i386 libc6-dev-i386 libxext6:i386 libxext-dev:i386 linux-libc-dev:i386 +# macOS/XCODE: macOS environment with XCODE5 installed. +# +!if $(WIN_MINGW32_BUILD) + !if $(TOOL_CHAIN_TAG) in "VS2019 VS2022" + !error Host-based Unit Tests not supported for Mingw/VS20xx builds + !endif + !if $(TOOL_CHAIN_TAG) in "CLANGPDB" + !error Host-based Unit Tests not supported for Mingw/CLANGPDB builds + !endif + !if $(TOOL_CHAIN_TAG) in "GCC GCC5 GCCNOLTO" + !error Host-based Unit Tests not supported for Mingw/GCC builds + !endif +!else + !if $(WIN_HOST_BUILD) + !if $(TOOL_CHAIN_TAG) in "GCC GCC5 GCCNOLTO" + !error Host-based Unit Tests not supported for Windows/GCC builds + !endif + !if $(TOOL_CHAIN_TAG) in "CLANGDWARF" + !error Host-based Unit Tests not supported for Windows/CLANGDWARF builds + !endif + !else + !if $(TOOL_CHAIN_TAG) in "VS2019 VS2022" + !error Host-based Unit Tests not supported for Linux/VS20xx builds + !endif + !if $(TOOL_CHAIN_TAG) in "CLANGPDB" + !error Host-based Unit Tests not supported for Linux/CLANGPDB builds + !endif + !endif +!endif + [BuildOptions] +!if $(WIN_MINGW32_BUILD) + GCC:*_CLANGDWARF_IA32_PP_FLAGS = -target i686-w64-mingw32 + GCC:*_CLANGDWARF_X64_PP_FLAGS = -target x86_64-w64-mingw32 + + GCC:*_CLANGDWARF_X64_CC_FLAGS = -target x86_64-w64-mingw32 + GCC:*_CLANGDWARF_IA32_CC_FLAGS = -target i686-w64-mingw32 + GCC:*_CLANGDWARF_*_CC_FLAGS = -O0 -fno-omit-frame-pointer -fexceptions -g3 -gcodeview -fdebug-macro -fno-lto + + GCC:*_CLANGDWARF_X64_NASM_FLAGS = -f win64 + GCC:*_CLANGDWARF_IA32_NASM_FLAGS = -f win32 +!endif + MSFT:*_*_*_CC_FLAGS = /MTd /EHs - GCC:*_*_*_CC_FLAGS = -fno-pie + GCC:*_*_*_CC_FLAGS = -fpie CLANGPDB:*_*_*_CC_FLAGS = -fno-pie GCC:*_*_*_ASLCC_FLAGS = -fpie @@ -52,6 +141,12 @@ GCC:*_*_*_CC_FLAGS = -fno-stack-protector CLANGPDB:*_*_*_CC_FLAGS = -fno-stack-protector + # + # Force long double to be 64-bits for CLANGDWARF IA32 builds to address + # alignment errors from c++ math libraries + # + GCC:*_CLANGDWARF_IA32_CC_FLAGS = -mlong-double-64 + !if $(UNIT_TESTING_ADDRESS_SANITIZER_ENABLE) # # Enable Address Sanitizer for VS2019, VS2022, and GCC @@ -61,12 +156,14 @@ GCC:*_*_*_CC_FLAGS = -fsanitize=address CLANGPDB:*_*_*_CC_FLAGS = -fsanitize=address !endif + !ifdef $(UNIT_TESTING_DEBUG) MSFT:*_*_*_CC_FLAGS = -D UNIT_TESTING_DEBUG=1 GCC:*_*_*_CC_FLAGS = -D UNIT_TESTING_DEBUG=1 CLANGPDB:*_*_*_CC_FLAGS = -D UNIT_TESTING_DEBUG=1 XCODE:*_*_*_CC_FLAGS = -D UNIT_TESTING_DEBUG=1 !endif + GCC:*_*_*_CC_FLAGS = -fexceptions CLANGPDB:*_*_*_CC_FLAGS = -fexceptions @@ -74,10 +171,11 @@ # # Enable code coverage compiler options # - GCC:*_GCC_*_CC_FLAGS = --coverage - GCC:*_GCC5_*_CC_FLAGS = --coverage - GCC:*_GCCNOLTO_*_CC_FLAGS = --coverage +!if $(TOOL_CHAIN_TAG) in "CLANGDWARF" GCC:*_CLANGDWARF_*_CC_FLAGS = -fprofile-instr-generate -fcoverage-mapping +!else + GCC:*_*_*_CC_FLAGS = --coverage +!endif CLANGPDB:*_*_*_CC_FLAGS = -fprofile-instr-generate -fcoverage-mapping !endif @@ -100,30 +198,64 @@ # CLANGPDB:*_*_*_CXX_FLAGS = -Wno-microsoft-cast -Wno-write-strings +[Defines] + # + # Defines for settings that are common between MSFT and CLANGPDB tool chain + # families that must use Visual Studio specific defines and libraries when + # building modules of type HOST_APPLICATION + # + DEFINE VISUAL_STUDIO_DEFINES = -D UNICODE -D _CRT_SECURE_NO_WARNINGS -D _CRT_SECURE_NO_DEPRECATE + DEFINE VISUAL_STUDIO_IA32_LIB_PATHS = /LIBPATH:"%VCToolsInstallDir%lib\x86" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%um\x86" + DEFINE VISUAL_STUDIO_X64_LIB_PATHS = /LIBPATH:"%VCToolsInstallDir%lib\X64" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\X64" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%um\X64" + [BuildOptions.common.EDKII.HOST_APPLICATION] # # Set MSFT HOST_APPLICATION options # - MSFT:*_*_*_DLINK_FLAGS == /nologo /SUBSYSTEM:CONSOLE /DEBUG /out:"$(BIN_DIR)\$(MODULE_NAME_GUID).exe" /pdb:"$(BIN_DIR)\$(MODULE_NAME_GUID).pdb" /WHOLEARCHIVE /STACK:0x00800000,0x00800000 - - MSFT:*_VS2015_IA32_DLINK_FLAGS = /LIBPATH:"%VS2015_PREFIX%Lib" /LIBPATH:"%VS2015_PREFIX%VC\Lib" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x86" - MSFT:*_VS2015x86_IA32_DLINK_FLAGS = /LIBPATH:"%VS2015_PREFIX%Lib" /LIBPATH:"%VS2015_PREFIX%VC\Lib" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x86" - MSFT:*_VS2017_IA32_DLINK_FLAGS = /LIBPATH:"%VCToolsInstallDir%lib\x86" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x86" - MSFT:*_VS2019_IA32_DLINK_FLAGS = /LIBPATH:"%VCToolsInstallDir%lib\x86" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x86" - MSFT:*_VS2022_IA32_DLINK_FLAGS = /LIBPATH:"%VCToolsInstallDir%lib\x86" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x86" + MSFT:*_*_*_CC_FLAGS = $(VISUAL_STUDIO_DEFINES) + # + # Must override DLINK_FLAGS to remove /DLL when linking .exe + # + MSFT:*_*_*_DLINK_FLAGS == /out:"$(BIN_DIR)\$(MODULE_NAME_GUID).exe" /NOLOGO /SUBSYSTEM:CONSOLE /WHOLEARCHIVE /STACK:0x00800000,0x00800000 /SAFESEH:NO + MSFT:*_*_IA32_DLINK_FLAGS = $(VISUAL_STUDIO_IA32_LIB_PATHS) + MSFT:*_*_X64_DLINK_FLAGS = $(VISUAL_STUDIO_X64_LIB_PATHS) + MSFT:*_*_*_DLINK_FLAGS = /DEBUG /pdb:"$(BIN_DIR)\$(MODULE_NAME_GUID).pdb" - MSFT:*_VS2015_X64_DLINK_FLAGS = /LIBPATH:"%VS2015_PREFIX%VC\Lib\AMD64" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x64" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x64" - MSFT:*_VS2015x86_X64_DLINK_FLAGS = /LIBPATH:"%VS2015_PREFIX%VC\Lib\AMD64" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x64" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x64" - MSFT:*_VS2017_X64_DLINK_FLAGS = /LIBPATH:"%VCToolsInstallDir%lib\x64" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x64" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x64" - MSFT:*_VS2019_X64_DLINK_FLAGS = /LIBPATH:"%VCToolsInstallDir%lib\x64" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x64" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x64" - MSFT:*_VS2022_X64_DLINK_FLAGS = /LIBPATH:"%VCToolsInstallDir%lib\x64" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x64" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x64" + # + # Set CLANGPDB HOST_APPLICATION options + # + CLANGPDB:*_*_*_CC_FLAGS = $(VISUAL_STUDIO_DEFINES) + # + # Must override DLINK_FLAGS to remove /DLL when linking .exe + # + CLANGPDB:*_*_*_DLINK_FLAGS == /out:"$(BIN_DIR)\$(MODULE_NAME_GUID).exe" /NOLOGO /SUBSYSTEM:CONSOLE /WHOLEARCHIVE /STACK:0x00800000,0x00800000 /IGNORE:4099 /SAFESEH:NO + CLANGPDB:*_*_IA32_DLINK_FLAGS = $(VISUAL_STUDIO_IA32_LIB_PATHS) + CLANGPDB:*_*_X64_DLINK_FLAGS = $(VISUAL_STUDIO_X64_LIB_PATHS) + CLANGPDB:*_*_*_DLINK_FLAGS = /DEBUG /pdb:"$(BIN_DIR)\$(MODULE_NAME_GUID).pdb" +!if $(UNIT_TESTING_ADDRESS_SANITIZER_ENABLE) + # + # Remove default library clang_rt.profile.lib that is not includes with Visual Studio + # + CLANGPDB:*_*_IA32_DLINK_FLAGS = /NODEFAULTLIB:clang_rt.profile.lib + # + # Add Address Sanitizer runtime libraries for IA32/X64 architectures + # + CLANGPDB:*_*_IA32_DLINK_FLAGS = clang_rt.profile-i386.lib clang_rt.asan_dynamic-i386.lib clang_rt.asan_dynamic_runtime_thunk-i386.lib + CLANGPDB:*_*_X64_DLINK_FLAGS = clang_rt.profile-x86_64.lib clang_rt.asan_dynamic-x86_64.lib clang_rt.asan_dynamic_runtime_thunk-x86_64.lib +!endif # # Set GCC HOST_APPLICATION options # - GCC:*_*_*_CC_FLAGS = -Wno-write-strings - GCC:*_*_IA32_DLINK_FLAGS == -o $(BIN_DIR)/$(MODULE_NAME_GUID) -z noexecstack -m32 -no-pie - GCC:*_*_X64_DLINK_FLAGS == -o $(BIN_DIR)/$(MODULE_NAME_GUID) -z noexecstack -m64 -no-pie + GCC:*_*_*_CC_FLAGS = -Wno-write-strings -fpie + GCC:*_*_IA32_DLINK_FLAGS == -o $(BIN_DIR)/$(MODULE_NAME_GUID) -m32 + GCC:*_*_X64_DLINK_FLAGS == -o $(BIN_DIR)/$(MODULE_NAME_GUID) -m64 +!if $(WIN_MINGW32_BUILD) + GCC:*_CLANGDWARF_*_DLINK_FLAGS = -Wl,--pdb,$(BIN_DIR)\$(MODULE_NAME_GUID).pdb -g3 +!else + GCC:*_*_*_DLINK_FLAGS = -z noexecstack +!endif + !if $(UNIT_TESTING_ADDRESS_SANITIZER_ENABLE) # # Enable Address Sanitizer linker options @@ -134,27 +266,19 @@ # # Enable code coverage linker options # - GCC:*_GCC_*_DLINK_FLAGS = --coverage - GCC:*_GCC5_*_DLINK_FLAGS = --coverage - GCC:*_GCCNOLTO_*_DLINK_FLAGS = --coverage +!if $(TOOL_CHAIN_TAG) in "CLANGDWARF" GCC:*_CLANGDWARF_*_DLINK_FLAGS = -fprofile-instr-generate -fcoverage-mapping +!else + GCC:*_*_*_DLINK_FLAGS = --coverage +!endif !endif # - # Surround our static libraries with whole-archive, so constructor-based test registration works properly. - # Note that we need to --no-whole-archive before linking system libraries. + # Surround static libraries with whole-archive, so constructor-based test registration works properly. + # Change to --no-whole-archive before linking system libraries. # GCC:*_*_*_DLINK_FLAGS = -Wl,--whole-archive GCC:*_*_*_DLINK2_FLAGS == -Wl,--no-whole-archive -lpthread -lstdc++ -lm - # - # Set CLANGPDB HOST_APPLICATION options - # - CLANGPDB:*_*_*_DLINK_FLAGS == /nologo /SUBSYSTEM:CONSOLE /DEBUG /out:"$(BIN_DIR)\$(MODULE_NAME_GUID).exe" /pdb:"$(BIN_DIR)\$(MODULE_NAME_GUID).pdb" /WHOLEARCHIVE /STACK:0x00800000,0x00800000 - CLANGPDB:*_*_X64_DLINK_FLAGS = /LIBPATH:"%VCToolsInstallDir%lib\x64" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x64" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x64" -!if $(UNIT_TESTING_ADDRESS_SANITIZER_ENABLE) - CLANGPDB:*_*_X64_DLINK_FLAGS = clang_rt.profile-x86_64.lib clang_rt.asan_dynamic-x86_64.lib clang_rt.asan_dynamic_runtime_thunk-x86_64.lib -!endif - # # Need to do this link via gcc and not ld as the pathing to libraries changes from OS version to OS version # From 1a4c4fb5a76fb15a5a50706685dc4ba36f1c2260 Mon Sep 17 00:00:00 2001 From: Vishnu Pajjuri Date: Tue, 30 Dec 2025 00:36:16 -0800 Subject: [PATCH 0984/1172] ArmPkg, UefiCpuPkg: Fix boot failure on FEAT_LPA-only systems without LPA2 Commit 9077163 added support for 52-bit PA/VA (LPA2) in EDK2. The previous change treated the presence of FEAT_LPA as sufficient to enable 52-bit VA for 4K page granularity. Some platforms advertise FEAT_LPA but do not implement full LPA2 support for 4K PAGE_SIZE; enabling 52-bit VA on those platforms produced an invalid MMU configuration and caused boot failures. This patch tightens the detection logic so 52-bit PA/VA (LPA2) is enabled only when the platform explicitly advertises LPA2 support. When LPA2 is not present we fall back to the previous 48-bit address limit for 4K pages, preserving correct behavior on non-LPA2 systems. Fixes: 9077163 ("UefiCpuPkg/ArmMmuLib: Add support for LPA2") Co-authored-by: Ganapatrao Kulkarni Signed-off-by: Vishnu Pajjuri --- UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c b/UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c index d111e8c7cd37..2353adf50736 100644 --- a/UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c +++ b/UefiCpuPkg/Library/ArmMmuLib/AArch64/ArmMmuLibCore.c @@ -94,6 +94,7 @@ ArmMemoryAttributeToPageAttribute ( // T0SZ can be below MIN_T0SZ when LPA2 is in use, meaning the page table starts at level -1 #define MIN_T0SZ 16 #define BITS_PER_LEVEL 9 +#define MAX_VA_BITS_48 48 #define MAX_VA_BITS 52 STATIC @@ -658,8 +659,13 @@ ArmConfigureMmu ( // into account the architectural limitations that result from UEFI's // use of 4 KB pages. // - MaxAddressBits = MIN (ArmGetPhysicalAddressBits (), MAX_VA_BITS); - MaxAddress = LShiftU64 (1ULL, MaxAddressBits) - 1; + if (ArmHas52BitTgran4 ()) { + MaxAddressBits = MIN (ArmGetPhysicalAddressBits (), MAX_VA_BITS); + } else { + MaxAddressBits = MIN (ArmGetPhysicalAddressBits (), MAX_VA_BITS_48); + } + + MaxAddress = LShiftU64 (1ULL, MaxAddressBits) - 1; T0SZ = 64 - MaxAddressBits; RootTableEntryCount = GetRootTableEntryCount (T0SZ); From f99a7af7c61cbdee6341875ddf3d669f6873cf84 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Sun, 28 Dec 2025 14:04:28 -0800 Subject: [PATCH 0985/1172] EmulatorPkg/Unix: Load symbols when modules are loaded Update GdbRun.sh to load symbols as modules are loaded and executed in the EmulatorPkg by executing a command each time the function SecGdbScriptBreak is executed. Set PcdEmulatorLazyLoadSymbols to FALSE to disable lazy symbol loading. With these changes, a break point can be set in any source file that is part of the EmulatorPkg build before the EmulatorPkg is executed. Signed-off-by: Michael D Kinney --- EmulatorPkg/EmulatorPkg.dsc | 1 + EmulatorPkg/Unix/.gdbinit | 8 -------- EmulatorPkg/Unix/GdbRun.sh | 13 +++++++++++++ 3 files changed, 14 insertions(+), 8 deletions(-) delete mode 100644 EmulatorPkg/Unix/.gdbinit diff --git a/EmulatorPkg/EmulatorPkg.dsc b/EmulatorPkg/EmulatorPkg.dsc index 639908acd71e..14b811428178 100644 --- a/EmulatorPkg/EmulatorPkg.dsc +++ b/EmulatorPkg/EmulatorPkg.dsc @@ -216,6 +216,7 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreImageLoaderSearchTeSectionFirst|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables|FALSE + gEmulatorPkgTokenSpaceGuid.PcdEmulatorLazyLoadSymbols|FALSE [PcdsFixedAtBuild] gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy|0x00000000 diff --git a/EmulatorPkg/Unix/.gdbinit b/EmulatorPkg/Unix/.gdbinit deleted file mode 100644 index 173818c0e721..000000000000 --- a/EmulatorPkg/Unix/.gdbinit +++ /dev/null @@ -1,8 +0,0 @@ -set confirm off -set output-radix 16 -b SecGdbScriptBreak -command -silent -source SecMain.gdb -c -end diff --git a/EmulatorPkg/Unix/GdbRun.sh b/EmulatorPkg/Unix/GdbRun.sh index b050ad5e2c5c..e7c6c4bff723 100644 --- a/EmulatorPkg/Unix/GdbRun.sh +++ b/EmulatorPkg/Unix/GdbRun.sh @@ -61,6 +61,19 @@ define RemoveFirmwareSymbolFile end end +add-auto-load-safe-path . +set auto-load local-gdbinit on +set breakpoint pending on + +set confirm off +set output-radix 16 +b SecGdbScriptBreak +command +silent +source Host.gdb +c +end + if gInXcode == 1 # in Xcode the program is already running. Issuing a run command # will cause a fatal debugger error. The break point script that From b294da34ad84250207ed41948a8725e4fb486af3 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Sun, 28 Dec 2025 14:06:16 -0800 Subject: [PATCH 0986/1172] EmulatorPkg: Increase FD and FvRecovery size to ~12MB EmulatorPkg CLANGDWARF NOOPT built with SECURE_BOOT_ENABLE is ~10MB. Increase size of FvRecovery and FD to ~12MB so the FD and FvRecovery are ~80% full to allow headroom for future size variations. Signed-off-by: Michael D Kinney --- EmulatorPkg/EmulatorPkg.fdf | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/EmulatorPkg/EmulatorPkg.fdf b/EmulatorPkg/EmulatorPkg.fdf index 73d5b0068d3f..fa73250f99de 100644 --- a/EmulatorPkg/EmulatorPkg.fdf +++ b/EmulatorPkg/EmulatorPkg.fdf @@ -14,16 +14,16 @@ # relocated in place (works, but not a great idea). # BaseAddress = 0x102000000|gEmulatorPkgTokenSpaceGuid.PcdEmuFdBaseAddress #The base address of the FLASH Device. -Size = 0x005a0000|gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareFdSize #The size in bytes of the FLASH Device +Size = 0x00ca0000|gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareFdSize #The size in bytes of the FLASH Device ErasePolarity = 1 BlockSize = 0x10000 -NumBlocks = 0x5a +NumBlocks = 0xca -0x00000000|0x00580000 +0x00000000|0x00c80000 gEmulatorPkgTokenSpaceGuid.PcdEmuFlashFvRecoveryBase|gEmulatorPkgTokenSpaceGuid.PcdEmuFlashFvRecoverySize FV = FvRecovery -0x00580000|0x0000c000 +0x00c80000|0x0000c000 gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageVariableBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize #NV_VARIABLE_STORE DATA = { @@ -64,11 +64,11 @@ DATA = { 0x5A, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } -0x0058c000|0x00002000 +0x00c8c000|0x00002000 #NV_EVENT_LOG gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageEventLogBase|gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageEventLogSize -0x0058e000|0x00002000 +0x00c8e000|0x00002000 gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageFtwWorkingBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize #NV_FTW_WORKING DATA = { @@ -82,7 +82,7 @@ DATA = { 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } -0x00590000|0x00010000 +0x00c90000|0x00010000 #NV_FTW_SPARE gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageFtwSpareBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize From deeeaa76c0773c31bfe9994ef551d78d0f5e9e85 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Sun, 28 Dec 2025 14:19:43 -0800 Subject: [PATCH 0987/1172] EmulatorPkg: Use HOST_APPLICATION and add MINGW CLANG * Update EmulatorPkg to use HOST_APPLICATION module type instead of USER_DEFINED to align with UnitTestFrameworkPkg that uses HOST_APPLICATION for all Host-based unit tests. * Move [BuildOptions] from host module INFs files to EmulatorPkg DSC file. This is required to have finer control over build options for MINGW CLANG builds. * Add support for MINGW CLANG builds. * Use WIN_HOST_BUILD to simplify the selection of the Windows host module or the Linux host module. * Add missing StackCheckLib mapping * Override PcdOpensslLibAssemblySourceStyleNasm to TRUE for MINGW CLANG builds that use Windows calling convention. * Add checks for support tool chains with error messages * Set linker BASE to correct values for DLLs and Applications for 32-bit and 64-bit Windows builds. * Update DEBUG, RELEASE, and NOOPT profiles with correct optimization settings and source level debug settings. * Reduce Visual Studio support to VS2019 and VS2022 * Simplify linker settings for Visual Studio builds. Signed-off-by: Michael D Kinney --- EmulatorPkg/EmulatorPkg.dsc | 271 ++++++++++++++++++++++++++++--- EmulatorPkg/Unix/Host/Host.inf | 27 +-- EmulatorPkg/Win/Host/WinHost.inf | 29 +--- 3 files changed, 254 insertions(+), 73 deletions(-) diff --git a/EmulatorPkg/EmulatorPkg.dsc b/EmulatorPkg/EmulatorPkg.dsc index 14b811428178..3e4df619d038 100644 --- a/EmulatorPkg/EmulatorPkg.dsc +++ b/EmulatorPkg/EmulatorPkg.dsc @@ -17,7 +17,11 @@ PLATFORM_GUID = 05FD064D-1073-E844-936C-A0E16317107D PLATFORM_VERSION = 0.3 DSC_SPECIFICATION = 0x00010005 +!if $(WIN_MINGW32_BUILD) + OUTPUT_DIRECTORY = Build/Emulator$(ARCH)Mingw +!else OUTPUT_DIRECTORY = Build/Emulator$(ARCH) +!endif SUPPORTED_ARCHITECTURES = X64|IA32 BUILD_TARGETS = DEBUG|RELEASE|NOOPT @@ -45,6 +49,7 @@ 0|DEFAULT !include MdePkg/MdeLibs.dsc.inc +!include CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc [LibraryClasses] # @@ -152,7 +157,7 @@ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf TimerLib|EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf -[LibraryClasses.common.USER_DEFINED, LibraryClasses.common.BASE] +[LibraryClasses.common.HOST_APPLICATION, LibraryClasses.common.BASE] DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf @@ -163,7 +168,7 @@ PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf PpiListLib|EmulatorPkg/Library/SecPpiListLib/SecPpiListLib.inf PeiServicesLib|EmulatorPkg/Library/SecPeiServicesLib/SecPeiServicesLib.inf - + StackCheckLib|MdePkg/Library/StackCheckLibNull/StackCheckLibNullHostApplication.inf [LibraryClasses.common.PEIM, LibraryClasses.common.PEI_CORE] HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf @@ -217,6 +222,14 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreImageLoaderSearchTeSectionFirst|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables|FALSE gEmulatorPkgTokenSpaceGuid.PcdEmulatorLazyLoadSymbols|FALSE +!if $(WIN_MINGW32_BUILD) + # + # When WIN_MINGW32_BUILD is set, -target is set to build Windows application. + # Set PcdOpensslLibAssemblySourceStyleNasm to TRUE to use Openssl NASM + # source files that assume a Windows calling convention. + # + gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm|TRUE +!endif [PcdsFixedAtBuild] gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy|0x00000000 @@ -315,23 +328,15 @@ [Components] !if "IA32" in $(ARCH) || "X64" in $(ARCH) - !if "MSFT" in $(FAMILY) || $(WIN_HOST_BUILD) == TRUE + !if $(WIN_HOST_BUILD) ## # Emulator, OS WIN application - # CLANGPDB is cross OS tool chain. It depends on WIN_HOST_BUILD flag - # to build WinHost application. # - # USER_DEFINED components skip normal NULL lib linking, so we have to link this - # specially here for the libs that have stack guard enabled - ## EmulatorPkg/Win/Host/WinHost.inf !else ## # Emulator, OS POSIX application # - # USER_DEFINED components skip normal NULL lib linking, so we have to link this - # specially here for the libs that have stack guard enabled - ## EmulatorPkg/Unix/Host/Host.inf !endif !endif @@ -522,25 +527,253 @@ !endif !include RedfishPkg/Redfish.dsc.inc +# +# Fail with error message if the OS/Compiler combination is not supported +# +# Operating System and Compiler Compatibility Matrix for EmulatorPkg +# +# +--------------------+--------+----------+------------+-----+----+--------+ +# | OS/Compiler | VS2019 | CLANGPDB | CLANGDWARF | GCC | XCODE5 | +# | | VS2022 | | | GCC5 | | +# | | | | | GCCNOLTO | | +# +--------------------+--------+----------+------------+----------+--------+ +# | Windows/VS |IA32/X64| | | | | +# | Windows/LLVM/VS | | IA32/X64 | | | | +# | Windows/LLVM/MSYS2 | | | X64 | | | +# | Windows/LLVM/MINGW | | | IA32/X64 | | | +# | Linux/LLVM | | | IA32/X64 | | | +# | Linux/GCC | | | | IA32/X64 | | +# | macOS/XCODE5 | | | | |IA32/X64| +# +--------------------+--------+----------+------------+----------+--------+ +# +# * Windows/VS: Windows environment with Visual Studio installed +# * Windows/LLVM/VS: Windows environment with Visual Studio and LLVM 20.1.8 or +# higher installed. The default version of LLVM installed with Visual Studio +# is not supported. +# * https://github.com/llvm/llvm-project/releases +# * EmulatorPkg builds depend on Visual Studio includes/libraries +# * Windows/LLVM/MSYS2: Windows environment with MSYS2 based LLVM 20.1.8 or +# higher installed. +# * https://github.com/tianocore/edk2-edkrepo/releases?q=clang +# * EmulatorPkg builds do not use any Visual Studio includes/libraries +# * MSYS2 based LLVM 20.1.8 does not provide IA32 includes/libraries +# * Windows/LLVM/MINGW: Windows environment with LLVM MINGW 20.1.8 or higher +# installed with UCRT includes/libraries. +# * https://github.com/mstorsjo/llvm-mingw/releases +# * EmulatorPkg builds do not use any Visual Studio includes/libraries +# * UCRT release provide IA32 and X64 includes/libraries +# * Linux/LLVM or Linux/GCC: Linux environment with GCC 13 or higher and +# LLVM 20.1.8 or higher installed. Not all Linux distributions provide IA32 +# includes/libraries for Host-based unit tests. +# * EmulatorPkg builds use GCC and LLVM includes/libraries +# * Ubuntu 24.04 apt modules for IA32 and X64 includes/libraries: +# build-essential uuid-dev lcov +# g++-13 gcc-13 +# g++-13-x86-64-linux-gnux32 gcc-13-x86-64-linux-gnux32 +# llvm-20 clang-20 lld-20 libclang-rt-20-dev +# gcc-multilib g++-multilib libx11-dev libx11-6 libxext6 libxext-dev +# libc6-i386 libc6-dev-i386 libxext6:i386 libxext-dev:i386 linux-libc-dev:i386 +# macOS/XCODE: macOS environment with XCODE5 installed. +# +!if $(WIN_MINGW32_BUILD) + !if $(TOOL_CHAIN_TAG) in "VS2019 VS2022" + !error EmulatorPkg not supported for Mingw/VS20xx builds + !endif + !if $(TOOL_CHAIN_TAG) in "CLANGPDB" + !error EmulatorPkg not supported for Mingw/CLANGPDB builds + !endif + !if $(TOOL_CHAIN_TAG) in "GCC GCC5 GCCNOLTO" + !error EmulatorPkg not supported for Mingw/GCC builds + !endif +!else + !if $(WIN_HOST_BUILD) + !if $(TOOL_CHAIN_TAG) in "GCC GCC5 GCCNOLTO" + !error EmulatorPkg not supported for Windows/GCC builds + !endif + !if $(TOOL_CHAIN_TAG) in "CLANGDWARF" + !error EmulatorPkg not supported for Windows/CLANGDWARF builds + !endif + !else + !if $(TOOL_CHAIN_TAG) in "VS2019 VS2022" + !error EmulatorPkg not supported for Linux/VS20xx builds + !endif + !if $(TOOL_CHAIN_TAG) in "CLANGPDB" + !error EmulatorPkg not supported for Linux/CLANGPDB builds + !endif + !endif +!endif + [BuildOptions] # # Disable deprecated APIs. # *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES + # + # Windows/VS20xx using Visual Studio includes and libraries + # MSFT:DEBUG_*_*_CC_FLAGS = /Od /Oy- MSFT:NOOPT_*_*_CC_FLAGS = /Od /Oy- - GCC:DEBUG_CLANGPDB_*_CC_FLAGS =-O0 -Wno-unused-command-line-argument -Wno-incompatible-pointer-types -Wno-enum-conversion -Wno-incompatible-pointer-types -Wno-sometimes-uninitialized -Wno-constant-conversion -Wno-main-return-type MSFT:*_*_*_DLINK_FLAGS = /ALIGN:4096 /FILEALIGN:4096 - MSFT:DEBUG_*_*_DLINK_FLAGS = /BASE:0x10000 - MSFT:NOOPT_*_*_DLINK_FLAGS = /BASE:0x10000 + MSFT:*_*_IA32_DLINK_FLAGS = /BASE:0x010000000 + MSFT:*_*_X64_DLINK_FLAGS = /BASE:0x180000000 + + # + # Windows/CLANGPDB using Visual Studio includes and libraries + # + CLANGPDB:RELEASE_*_*_CC_FLAGS = -g0 + CLANGPDB:DEBUG_*_*_CC_FLAGS = -g3 -fno-lto -O0 + CLANGPDB:NOOPT_*_*_CC_FLAGS = -g3 -fno-lto + + CLANGPDB:*_*_*_DLINK_FLAGS = /ALIGN:4096 /FILEALIGN:4096 + CLANGPDB:*_*_IA32_DLINK_FLAGS = /BASE:0x010000000 + CLANGPDB:*_*_X64_DLINK_FLAGS = /BASE:0x180000000 + +!if $(WIN_MINGW32_BUILD) + # + # Windows/Mingw CLANGDWARF using Mingw CLANG includes and libraries + # + GCC:*_CLANGDWARF_IA32_PP_FLAGS = -target i686-w64-mingw32 + GCC:*_CLANGDWARF_X64_PP_FLAGS = -target x86_64-w64-mingw32 + + GCC:*_CLANGDWARF_X64_CC_FLAGS = -target x86_64-w64-mingw32 -mno-stack-arg-probe + GCC:*_CLANGDWARF_IA32_CC_FLAGS = -target i686-w64-mingw32 -mno-stack-arg-probe + GCC:RELEASE_CLANGDWARF_*_CC_FLAGS = -g0 + GCC:DEBUG_CLANGDWARF_*_CC_FLAGS = -g3 -gcodeview -fdebug-macro -fno-omit-frame-pointer -fexceptions -fno-lto -O0 + GCC:NOOPT_CLANGDWARF_*_CC_FLAGS = -g3 -gcodeview -fdebug-macro -fno-omit-frame-pointer -fexceptions -fno-lto -!if $(WIN_HOST_BUILD) == TRUE + GCC:*_CLANGDWARF_X64_NASM_FLAGS = -f win64 + GCC:*_CLANGDWARF_IA32_NASM_FLAGS = -f win32 + + # + # Change Windows/Mingw CLANGDWARF to use llvm-rc instead of objcopy to + # produce HII resources as a PE/COFF library + # + GCC:*_CLANGDWARF_*_GENFWHII_FLAGS == --hiipackage + GCC:*_CLANGDWARF_*_RC_PATH = llvm-rc + GCC:*_CLANGDWARF_*_RC_FLAGS == + + # + # Must override DLINK to use options compatible with Mingw CLANG that is + # subset of GCC options for Windows application targets. + # + # DLINK action does not support -gcodeview that must be set in CC_FLAGS + # to generate PDB symbol information. -Wno-unused-command-line-argument + # is added to ignore the error generated by -gcodeview in DLINK action. # - # CLANGPDB tool chain depends on WIN_HOST_BUILD flag to generate the windows application. + GCC:*_CLANGDWARF_*_DLINK_FLAGS == -nostdlib -shared -Wl,--section-alignment=0x1000 -Wl,--file-alignment=0x1000 + GCC:*_CLANGDWARF_IA32_DLINK_FLAGS = -target i686-w64-mingw32 -Wl,--entry,__ModuleEntryPoint + GCC:*_CLANGDWARF_X64_DLINK_FLAGS = -target x86_64-w64-mingw32 -Wl,--entry,_ModuleEntryPoint + GCC:DEBUG_CLANGDWARF_*_DLINK_FLAGS = -g -Wl,--pdb,$(DEBUG_DIR)/$(BASE_NAME).pdb -Wno-unused-command-line-argument + GCC:NOOPT_CLANGDWARF_*_DLINK_FLAGS = -g -Wl,--pdb,$(DEBUG_DIR)/$(BASE_NAME).pdb -Wno-unused-command-line-argument # - CLANGPDB: *_*_*_DLINK_FLAGS = /ALIGN:4096 /FILEALIGN:4096 - CLANGPDB:DEBUG_*_*_DLINK_FLAGS = /BASE:0x10000 - CLANGPDB:NOOPT_*_*_DLINK_FLAGS = /BASE:0x10000 + # Set DLINK2_FLAGS to empyty string to disable use of linker script + # + GCC:*_CLANGDWARF_X64_DLINK2_FLAGS == + GCC:*_CLANGDWARF_IA32_DLINK2_FLAGS == +!endif + + GCC:RELEASE_*_*_CC_FLAGS = -g0 + GCC:DEBUG_*_*_CC_FLAGS = -g3 -fno-lto -O0 + GCC:NOOPT_*_*_CC_FLAGS = -g3 -fno-lto + + # + # GCC IA32 CLANGDWARF does not work with -flto. + # Disable LTO for this specific tool chain configuration + # + GCC:RELEASE_CLANGDWARF_IA32_CC_FLAGS = -fno-lto + +[Defines] + # + # Defines for settings that are common between MSFT and CLANGPDB tool chain + # families that must use Visual Studio specific defines and libraries when + # building modules of type HOST_APPLICATION + # +!if $(ARCH) in "X64" + DEFINE VS_ARCH_DIR = x64 +!endif +!if $(ARCH) in "IA32" + DEFINE VS_ARCH_DIR = x86 +!endif + DEFINE VISUAL_STUDIO_DEFINES = -D UNICODE -D _CRT_SECURE_NO_WARNINGS -D _CRT_SECURE_NO_DEPRECATE + DEFINE VISUAL_STUDIO_LIB_PATHS = /LIBPATH:"%VCToolsInstallDir%lib\$(VS_ARCH_DIR)" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\$(VS_ARCH_DIR)" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%um\$(VS_ARCH_DIR)" + DEFINE VISUAL_STUDIO_LIBS = Kernel32.lib MSVCRTD.lib vcruntimed.lib ucrtd.lib Gdi32.lib User32.lib Winmm.lib Advapi32.lib + +[BuildOptions.common.EDKII.HOST_APPLICATION] + MSFT:*_*_*_CC_FLAGS = $(VISUAL_STUDIO_DEFINES) + # + # Must ovveride DLINK_FLAGS to remove /DLL when linking .exe + # + MSFT:*_*_*_DLINK_FLAGS == /out:"$(BIN_DIR)\$(BASE_NAME).exe" /NOLOGO /SUBSYSTEM:CONSOLE /IGNORE:4086 /MAP /OPT:REF /LTCG + MSFT:*_*_*_DLINK_FLAGS = $(VISUAL_STUDIO_LIB_PATHS) $(VISUAL_STUDIO_LIBS) + MSFT:DEBUG_*_*_DLINK_FLAGS = /DEBUG /pdb:"$(BIN_DIR)\$(BASE_NAME).pdb" + MSFT:NOOPT_*_*_DLINK_FLAGS = /DEBUG /pdb:"$(BIN_DIR)\$(BASE_NAME).pdb" + + CLANGPDB:*_*_*_CC_FLAGS = $(VISUAL_STUDIO_DEFINES) + # + # Must ovveride DLINK_FLAGS to remove /DLL when linking .exe + # + CLANGPDB:*_*_*_DLINK_FLAGS == /OUT:"$(BIN_DIR)\$(BASE_NAME).exe" /NOLOGO /SUBSYSTEM:CONSOLE /IGNORE:4086 /OPT:REF /LLDMAP + CLANGPDB:*_*_*_DLINK_FLAGS = $(VISUAL_STUDIO_LIB_PATHS) $(VISUAL_STUDIO_LIBS) + CLANGPDB:DEBUG_*_*_DLINK_FLAGS = /DEBUG /pdb:"$(BIN_DIR)\$(BASE_NAME).pdb" + CLANGPDB:NOOPT_*_*_DLINK_FLAGS = /DEBUG /pdb:"$(BIN_DIR)\$(BASE_NAME).pdb" + + # + # GCC RELEASE X64 Host application does not work with -flto. + # Disable LTO for this specific tool chain configuration + # + GCC:RELEASE_*_X64_CC_FLAGS = -fno-lto + # + # Must override DLINK flags to remove -nostdlib because Host application must + # link against standard libraries + # + GCC:*_*_*_DLINK_FLAGS == -o $(BIN_DIR)/Host -z noexecstack + GCC:RELEASE_*_*_DLINK_FLAGS = -flto + GCC:*_*_IA32_DLINK_FLAGS = -m32 + GCC:*_*_X64_DLINK_FLAGS = -m64 + + GCC:*_*_*_DLINK2_FLAGS == -lpthread -ldl -lXext -lX11 + +!if $(WIN_MINGW32_BUILD) + # + # Windows Mingw CLANGDWARF + # + GCC:*_CLANGDWARF_*_CC_FLAGS = -D UNICODE -D _CRT_SECURE_NO_DEPRECATE -Wno-incompatible-pointer-types + GCC:RELEASE_CLANGDWARF_*_CC_FLAGS = -g0 + GCC:DEBUG_CLANGDWARF_*_CC_FLAGS = -g3 -gcodeview -fdebug-macro -fno-omit-frame-pointer -fexceptions -fno-lto -O0 + GCC:NOOPT_CLANGDWARF_*_CC_FLAGS = -g3 -gcodeview -fdebug-macro -fno-omit-frame-pointer -fexceptions -fno-lto + + # + # Must override DLINK to use options compatible with Mingw CLANG that is + # subset of GCC options for Windows application targets. + # + # DLINK action does not support -gcodeview that must be set in CC_FLAGS + # to generate PDB symbol information. -Wno-unused-command-line-argument + # is added to ignore the error generated by -gcodeview in DLINK action. + # + GCC:*_CLANGDWARF_*_DLINK_FLAGS == -o $(BIN_DIR)/$(BASE_NAME).exe -Wl,--entry,main -lwinmm -lgdi32 + GCC:*_CLANGDWARF_IA32_DLINK_FLAGS = -target i686-w64-mingw32 + GCC:*_CLANGDWARF_X64_DLINK_FLAGS = -target x86_64-w64-mingw32 + GCC:DEBUG_CLANGDWARF_*_DLINK_FLAGS = -g -Wl,--pdb,$(BIN_DIR)/$(BASE_NAME).pdb -Wno-unused-command-line-argument + GCC:NOOPT_CLANGDWARF_*_DLINK_FLAGS = -g -Wl,--pdb,$(BIN_DIR)/$(BASE_NAME).pdb -Wno-unused-command-line-argument + # + # DLINK2_FLAGS must be set to empty string to disable use of linker script + # + GCC:*_CLANGDWARF_IA32_DLINK2_FLAGS == + GCC:*_CLANGDWARF_X64_DLINK2_FLAGS == !endif + + # + # Need to do XCODE link via gcc and not ld as the pathing to libraries changes + # from OS version to OS version + # + XCODE:*_*_IA32_DLINK_PATH == gcc + XCODE:*_*_IA32_CC_FLAGS = -I$(WORKSPACE)/EmulatorPkg/Unix/Host/X11IncludeHack + XCODE:*_*_IA32_DLINK_FLAGS == -arch i386 -o $(BIN_DIR)/Host -L/usr/X11R6/lib -lXext -lX11 -framework Carbon + XCODE:*_*_IA32_ASM_FLAGS == -arch i386 -g + + XCODE:*_*_X64_DLINK_PATH == gcc + XCODE:*_*_X64_DLINK_FLAGS == -o $(BIN_DIR)/Host -L/usr/X11R6/lib -lXext -lX11 -framework Carbon -Wl,-no_pie + XCODE:*_*_X64_ASM_FLAGS == -g + XCODE:*_*_X64_CC_FLAGS = -O0 -target x86_64-apple-darwin -I$(WORKSPACE)/EmulatorPkg/Unix/Host/X11IncludeHack "-DEFIAPI=__attribute__((ms_abi))" diff --git a/EmulatorPkg/Unix/Host/Host.inf b/EmulatorPkg/Unix/Host/Host.inf index 910b46369e65..467f6eceb911 100644 --- a/EmulatorPkg/Unix/Host/Host.inf +++ b/EmulatorPkg/Unix/Host/Host.inf @@ -14,7 +14,7 @@ INF_VERSION = 0x00010005 BASE_NAME = Host FILE_GUID = 8863C0AD-7724-C84B-88E5-A33B116D1485 - MODULE_TYPE = USER_DEFINED + MODULE_TYPE = HOST_APPLICATION VERSION_STRING = 1.0 # @@ -111,28 +111,3 @@ [FeaturePcd] gEmulatorPkgTokenSpaceGuid.PcdEmulatorLazyLoadSymbols - - -[BuildOptions] - GCC:*_*_*_CC_FLAGS == -g -fshort-wchar -fno-strict-aliasing -Wall -malign-double -idirafter/usr/include -c -include $(DEST_DIR_DEBUG)/AutoGen.h -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings - GCC:*_*_IA32_CC_FLAGS = -m32 - GCC:*_*_X64_CC_FLAGS = -m64 "-DEFIAPI=__attribute__((ms_abi))" -flto -DUSING_LTO -Os - - GCC:*_*_*_DLINK_FLAGS == -o $(BIN_DIR)/Host -z noexecstack -L/usr/X11R6/lib - GCC:*_*_IA32_DLINK_FLAGS = -m32 - GCC:*_*_X64_DLINK_FLAGS = -m64 -flto - - GCC:*_*_*_DLINK2_FLAGS == -lpthread -ldl -lXext -lX11 - -# -# Need to do this link via gcc and not ld as the pathing to libraries changes from OS version to OS version -# - XCODE:*_*_IA32_DLINK_PATH == gcc - XCODE:*_*_IA32_CC_FLAGS = -I$(WORKSPACE)/EmulatorPkg/Unix/Host/X11IncludeHack - XCODE:*_*_IA32_DLINK_FLAGS == -arch i386 -o $(BIN_DIR)/Host -L/usr/X11R6/lib -lXext -lX11 -framework Carbon - XCODE:*_*_IA32_ASM_FLAGS == -arch i386 -g - - XCODE:*_*_X64_DLINK_PATH == gcc - XCODE:*_*_X64_DLINK_FLAGS == -o $(BIN_DIR)/Host -L/usr/X11R6/lib -lXext -lX11 -framework Carbon -Wl,-no_pie - XCODE:*_*_X64_ASM_FLAGS == -g - XCODE:*_*_X64_CC_FLAGS = -O0 -target x86_64-apple-darwin -I$(WORKSPACE)/EmulatorPkg/Unix/Host/X11IncludeHack "-DEFIAPI=__attribute__((ms_abi))" diff --git a/EmulatorPkg/Win/Host/WinHost.inf b/EmulatorPkg/Win/Host/WinHost.inf index b123ea9dcfdf..f697a5fc753f 100644 --- a/EmulatorPkg/Win/Host/WinHost.inf +++ b/EmulatorPkg/Win/Host/WinHost.inf @@ -15,7 +15,7 @@ INF_VERSION = 0x00010005 BASE_NAME = WinHost FILE_GUID = 62E8F833-2B0A-4C19-A966-63C180588BE7 - MODULE_TYPE = USER_DEFINED + MODULE_TYPE = HOST_APPLICATION VERSION_STRING = 1.0 # @@ -85,30 +85,3 @@ gEmulatorPkgTokenSpaceGuid.PcdEmuFileSystem gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage gEmulatorPkgTokenSpaceGuid.PcdEmuNetworkInterface|L"0" - -[BuildOptions] - MSFT:*_*_*_DLINK_FLAGS == /out:"$(BIN_DIR)\$(BASE_NAME).exe" /base:0x10000000 /pdb:"$(BIN_DIR)\$(BASE_NAME).pdb" /EXPORT:InitializeDriver=$(IMAGE_ENTRY_POINT) - MSFT:*_*_*_CC_FLAGS = /nologo /W4 /WX /Gy /c /D UNICODE /Od /Oy- /FIAutoGen.h /EHs-c- /GF /D _CRT_SECURE_NO_WARNINGS /D _CRT_SECURE_NO_DEPRECATE - MSFT:*_*_*_PP_FLAGS == /nologo /E /TC /FIAutoGen.h - - MSFT:*_VS2015_IA32_DLINK_FLAGS = /LIBPATH:"%VS2015_PREFIX%Lib" /LIBPATH:"%VS2015_PREFIX%VC\Lib" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x86" /NOLOGO /SUBSYSTEM:CONSOLE /NODEFAULTLIB /IGNORE:4086 /MAP /OPT:REF /DEBUG /MACHINE:I386 /LTCG Kernel32.lib MSVCRTD.lib Gdi32.lib User32.lib Winmm.lib Advapi32.lib vcruntimed.lib ucrtd.lib - MSFT:*_VS2015x86_IA32_DLINK_FLAGS = /LIBPATH:"%VS2015_PREFIX%Lib" /LIBPATH:"%VS2015_PREFIX%VC\Lib" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x86" /NOLOGO /SUBSYSTEM:CONSOLE /NODEFAULTLIB /IGNORE:4086 /MAP /OPT:REF /DEBUG /MACHINE:I386 /LTCG Kernel32.lib MSVCRTD.lib Gdi32.lib User32.lib Winmm.lib Advapi32.lib vcruntimed.lib ucrtd.lib - MSFT:*_VS2017_IA32_DLINK_FLAGS = /LIBPATH:"%VCToolsInstallDir%lib\x86" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x86" /NOLOGO /SUBSYSTEM:CONSOLE /NODEFAULTLIB /IGNORE:4086 /MAP /OPT:REF /DEBUG /MACHINE:I386 /LTCG Kernel32.lib MSVCRTD.lib vcruntimed.lib ucrtd.lib Gdi32.lib User32.lib Winmm.lib Advapi32.lib - MSFT:*_VS2019_IA32_DLINK_FLAGS = /LIBPATH:"%VCToolsInstallDir%lib\x86" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x86" /NOLOGO /SUBSYSTEM:CONSOLE /NODEFAULTLIB /IGNORE:4086 /MAP /OPT:REF /DEBUG /MACHINE:I386 /LTCG Kernel32.lib MSVCRTD.lib vcruntimed.lib ucrtd.lib Gdi32.lib User32.lib Winmm.lib Advapi32.lib - MSFT:*_VS2022_IA32_DLINK_FLAGS = /LIBPATH:"%VCToolsInstallDir%lib\x86" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x86" /NOLOGO /SUBSYSTEM:CONSOLE /NODEFAULTLIB /IGNORE:4086 /MAP /OPT:REF /DEBUG /MACHINE:I386 /LTCG Kernel32.lib MSVCRTD.lib vcruntimed.lib ucrtd.lib Gdi32.lib User32.lib Winmm.lib Advapi32.lib - MSFT:*_*_IA32_ASM_FLAGS == /nologo /W3 /WX /c /coff /Cx /Zd /W0 /Zi - MSFT:*_*_IA32_ASMLINK_FLAGS == /link /nologo /tiny - - MSFT:*_VS2015_X64_DLINK_FLAGS = /LIBPATH:"%VS2015_PREFIX%VC\Lib\AMD64" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x64" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x64" /NOLOGO /SUBSYSTEM:CONSOLE /NODEFAULTLIB /IGNORE:4086 /MAP /OPT:REF /DEBUG /MACHINE:AMD64 /LTCG Kernel32.lib MSVCRTD.lib vcruntimed.lib ucrtd.lib Gdi32.lib User32.lib Winmm.lib Advapi32.lib - MSFT:*_VS2015x86_X64_DLINK_FLAGS = /LIBPATH:"%VS2015_PREFIX%VC\Lib\AMD64" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x64" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x64" /NOLOGO /SUBSYSTEM:CONSOLE /NODEFAULTLIB /IGNORE:4086 /MAP /OPT:REF /DEBUG /MACHINE:AMD64 /LTCG Kernel32.lib MSVCRTD.lib vcruntimed.lib ucrtd.lib Gdi32.lib User32.lib Winmm.lib Advapi32.lib - MSFT:*_VS2017_X64_DLINK_FLAGS = /LIBPATH:"%VCToolsInstallDir%lib\x64" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x64" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x64" /NOLOGO /SUBSYSTEM:CONSOLE /NODEFAULTLIB /IGNORE:4086 /MAP /OPT:REF /DEBUG /MACHINE:AMD64 /LTCG Kernel32.lib MSVCRTD.lib vcruntimed.lib ucrtd.lib Gdi32.lib User32.lib Winmm.lib Advapi32.lib - MSFT:*_VS2019_X64_DLINK_FLAGS = /LIBPATH:"%VCToolsInstallDir%lib\x64" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x64" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x64" /NOLOGO /SUBSYSTEM:CONSOLE /NODEFAULTLIB /IGNORE:4086 /MAP /OPT:REF /DEBUG /MACHINE:AMD64 /LTCG Kernel32.lib MSVCRTD.lib vcruntimed.lib ucrtd.lib Gdi32.lib User32.lib Winmm.lib Advapi32.lib - MSFT:*_VS2022_X64_DLINK_FLAGS = /LIBPATH:"%VCToolsInstallDir%lib\x64" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x64" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x64" /NOLOGO /SUBSYSTEM:CONSOLE /NODEFAULTLIB /IGNORE:4086 /MAP /OPT:REF /DEBUG /MACHINE:AMD64 /LTCG Kernel32.lib MSVCRTD.lib vcruntimed.lib ucrtd.lib Gdi32.lib User32.lib Winmm.lib Advapi32.lib - MSFT:*_*_X64_ASM_FLAGS == /nologo /W3 /WX /c /Cx /Zd /W0 /Zi - MSFT:*_*_X64_ASMLINK_FLAGS == /link /nologo - - GCC:*_CLANGPDB_X64_DLINK_FLAGS == /out:"$(BIN_DIR)\$(BASE_NAME).exe" /base:0x10000000 /pdb:"$(BIN_DIR)\$(BASE_NAME).pdb" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x64" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x64" /LIBPATH:"%VCToolsInstallDir%lib\x64" /NOLOGO /SUBSYSTEM:CONSOLE /NODEFAULTLIB /IGNORE:4086 /OPT:REF /DEBUG /MACHINE:AMD64 Kernel32.lib MSVCRTD.lib vcruntimed.lib ucrtd.lib Gdi32.lib User32.lib Winmm.lib Advapi32.lib /lldmap /EXPORT:InitializeDriver=_ModuleEntryPoint - GCC:*_CLANGPDB_X64_CC_FLAGS == -m64 -g -fshort-wchar -fno-strict-aliasing -Wall -c -include AutoGen.h -D _CRT_SECURE_NO_WARNINGS -Wnonportable-include-path -D UNICODE -D _CRT_SECURE_NO_DEPRECATE - - GCC:*_CLANGPDB_IA32_DLINK_FLAGS == /out:"$(BIN_DIR)\$(BASE_NAME).exe" /base:0x10000000 /pdb:"$(BIN_DIR)\$(BASE_NAME).pdb" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x86" /LIBPATH:"%VCToolsInstallDir%ib\x86" /NOLOGO /SUBSYSTEM:CONSOLE /NODEFAULTLIB /IGNORE:4086 /OPT:REF /DEBUG /MACHINE:I386 Kernel32.lib MSVCRTD.lib vcruntimed.lib ucrtd.lib Gdi32.lib User32.lib Winmm.lib Advapi32.lib /lldmap /EXPORT:InitializeDriver=_ModuleEntryPoint - GCC:*_CLANGPDB_IA32_CC_FLAGS == -m32 -g -fshort-wchar -fno-strict-aliasing -Wall -c -include AutoGen.h -D _CRT_SECURE_NO_WARNINGS -Wnonportable-include-path -D UNICODE -D _CRT_SECURE_NO_DEPRECATE From 19fc4b7f50bce930395ab60bfc05f141a566e8d8 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 6 Jan 2026 15:55:06 +0100 Subject: [PATCH 0988/1172] NetworkPkg: Add VS2026 toolchain support * Add VS2026 to toolchain check in NetworkPkgHostTest.dsc. Signed-off-by: Daniel Grobert --- NetworkPkg/Test/NetworkPkgHostTest.dsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NetworkPkg/Test/NetworkPkgHostTest.dsc b/NetworkPkg/Test/NetworkPkgHostTest.dsc index 7a46be74a7c3..2fe74da54bca 100644 --- a/NetworkPkg/Test/NetworkPkgHostTest.dsc +++ b/NetworkPkg/Test/NetworkPkgHostTest.dsc @@ -73,7 +73,7 @@ SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf -!if $(TOOL_CHAIN_TAG) == VS2019 or $(TOOL_CHAIN_TAG) == VS2022 +!if $(TOOL_CHAIN_TAG) == VS2019 or $(TOOL_CHAIN_TAG) == VS2022 or $(TOOL_CHAIN_TAG) == VS2026 [LibraryClasses.X64] # Provide StackCookie support lib so that we can link to /GS exports for VS builds RngLib|MdePkg/Library/BaseRngLib/BaseRngLib.inf From 52d54e0b440febab36686223d02cbe1467c3ca82 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 18 Dec 2025 14:56:10 +0100 Subject: [PATCH 0989/1172] BaseTools: Add VS2026 support. Adding tools_def for VS2026. Update WindowsVsToolChain to support VS2026. Update set_vsPrefix_envs and toolsetup and edksetup to support VS2026. Signed-off-by: Daniel Grobert --- BaseTools/Conf/tools_def.template | 152 +++++++++++++++++- .../WindowsVsToolChain/WindowsVsToolChain.py | 74 ++++++++- BaseTools/set_vsprefix_envs.bat | 76 +++++++++ BaseTools/toolsetup.bat | 14 +- edksetup.bat | 4 +- 5 files changed, 314 insertions(+), 6 deletions(-) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index 9b34e80dadfe..57837fc11f4b 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -23,8 +23,9 @@ # 3.01 - Add toolchain for VS2022 # 3.02 - Enable stack cookies for IA32, X64, ARM, and AARCH64 builds for GCC and MSVC # 3.03 - Drop ARM32 Support +# 3.04 - Add toolchain for VS2026 # -#!VERSION=3.03 +#!VERSION=3.04 IDENTIFIER = Default TOOL_CHAIN_CONF @@ -57,6 +58,12 @@ DEFINE VS2022_BIN_IA32 = DEF(VS2022_BIN)\HostDEF(VS_HOST)\x86 DEFINE VS2022_BIN_X64 = DEF(VS2022_BIN)\HostDEF(VS_HOST)\x64 DEFINE VS2022_BIN_AARCH64 = DEF(VS2022_BIN)\HostDEF(VS_HOST)\arm64 +DEFINE VS2026_BIN = ENV(VS2026_PREFIX)bin +DEFINE VS2026_BIN_HOST = DEF(VS2026_BIN)\HostDEF(VS_HOST)\DEF(VS_HOST) +DEFINE VS2026_BIN_IA32 = DEF(VS2026_BIN)\HostDEF(VS_HOST)\x86 +DEFINE VS2026_BIN_X64 = DEF(VS2026_BIN)\HostDEF(VS_HOST)\x64 +DEFINE VS2026_BIN_AARCH64 = DEF(VS2026_BIN)\HostDEF(VS_HOST)\arm64 + # # Resource compiler # @@ -69,7 +76,7 @@ DEFINE WINSDKx86_BIN = ENV(WINSDKx86_PREFIX) DEFINE WINSDK81_BIN = ENV(WINSDK81_PREFIX)x64 DEFINE WINSDK81x86_BIN = ENV(WINSDK81x86_PREFIX)x86 -# Microsoft Visual Studio 2017/2019/2022 Professional Edition +# Microsoft Visual Studio 2017/2019/2022/2026 Professional Edition DEFINE WINSDK10_BIN = ENV(WINSDK10_PREFIX)DEF(VS_HOST) # These defines are needed for certain Microsoft Visual Studio tools that @@ -170,6 +177,11 @@ DEFINE DTC_BIN = ENV(DTC_PREFIX)dtc # Optional: # Required to build EBC drivers: # Intel(r) Compiler for Efi Byte Code (Intel(r) EBC Compiler) +# VS2026 -win32,win64- Requires: +# Microsoft Visual Studio 2026 version 18.0 or later +# Optional: +# Required to build EBC drivers: +# Intel(r) Compiler for Efi Byte Code (Intel(r) EBC Compiler) # GCCNOLTO -Linux,Windows- Requires: # GCC 4.9 targeting x86_64-linux-gnu or aarch64-linux-gnu # Optional: @@ -821,6 +833,142 @@ NOOPT_VS2022_AARCH64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE: # BaseTools cannot handle XIP modules with different section and file alignment *_VS2022_AARCH64_DLINK_XIPFLAGS = /ALIGN:64 +#################################################################################### +# VS2026 - Microsoft Visual Studio 2026 with Intel ASL +# ASL - Intel ACPI Source Language Compiler (iasl.exe) +#################################################################################### +# VS2026 - Microsoft Visual Studio 2026 with Intel ASL +*_VS2026_*_*_FAMILY = MSFT +*_VS2026_*_*_DLL = DEF(VS2026_BIN_HOST) + +*_VS2026_*_MAKE_PATH = DEF(VS2026_BIN_HOST)\nmake.exe +*_VS2026_*_MAKE_FLAG = /nologo +*_VS2026_*_RC_PATH = DEF(RC_PATH) + +*_VS2026_*_MAKE_FLAGS = /nologo +*_VS2026_*_SLINK_FLAGS = /NOLOGO /LTCG +*_VS2026_*_APP_FLAGS = /nologo /E /TC +*_VS2026_*_PP_FLAGS = /nologo /E /TC /FIAutoGen.h +*_VS2026_*_VFRPP_FLAGS = /nologo /E /TC /DVFRCOMPILE /FI$(MODULE_NAME)StrDefs.h +*_VS2026_*_DLINK2_FLAGS = /WHOLEARCHIVE +*_VS2026_*_ASM16_PATH = DEF(VS2026_BIN_IA32)\ml.exe +*_VS2026_*_DEPS_FLAGS = DEF(MSFT_DEPS_FLAGS) +################## +# ASL definitions +################## +*_VS2026_*_ASL_PATH = DEF(WIN_IASL_BIN) +*_VS2026_*_ASL_FLAGS = DEF(DEFAULT_WIN_ASL_FLAGS) +*_VS2026_*_ASL_OUTFLAGS = DEF(DEFAULT_WIN_ASL_OUTFLAGS) +*_VS2026_*_ASLCC_FLAGS = DEF(MSFT_ASLCC_FLAGS) +*_VS2026_*_ASLPP_FLAGS = DEF(MSFT_ASLPP_FLAGS) +*_VS2026_*_ASLDLINK_FLAGS = DEF(MSFT_ASLDLINK_FLAGS) + +################## +# IA32 definitions +################## +*_VS2026_IA32_CC_PATH = DEF(VS2026_BIN_IA32)\cl.exe +*_VS2026_IA32_VFRPP_PATH = DEF(VS2026_BIN_IA32)\cl.exe +*_VS2026_IA32_ASLCC_PATH = DEF(VS2026_BIN_IA32)\cl.exe +*_VS2026_IA32_ASLPP_PATH = DEF(VS2026_BIN_IA32)\cl.exe +*_VS2026_IA32_SLINK_PATH = DEF(VS2026_BIN_IA32)\lib.exe +*_VS2026_IA32_DLINK_PATH = DEF(VS2026_BIN_IA32)\link.exe +*_VS2026_IA32_ASLDLINK_PATH= DEF(VS2026_BIN_IA32)\link.exe +*_VS2026_IA32_APP_PATH = DEF(VS2026_BIN_IA32)\cl.exe +*_VS2026_IA32_PP_PATH = DEF(VS2026_BIN_IA32)\cl.exe +*_VS2026_IA32_ASM_PATH = DEF(VS2026_BIN_IA32)\ml.exe + + *_VS2026_IA32_MAKE_FLAGS = /nologo + DEBUG_VS2026_IA32_CC_FLAGS = /nologo /arch:IA32 /c /WX /GS /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Z7 /Gw +RELEASE_VS2026_IA32_CC_FLAGS = /nologo /arch:IA32 /c /WX /GS /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gw +NOOPT_VS2026_IA32_CC_FLAGS = /nologo /arch:IA32 /c /WX /GS /W4 /Gs32768 /D UNICODE /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Z7 /Od + + DEBUG_VS2026_IA32_ASM_FLAGS = /nologo /c /WX /W3 /Cx /coff /Zd /Zi +RELEASE_VS2026_IA32_ASM_FLAGS = /nologo /c /WX /W3 /Cx /coff /Zd +NOOPT_VS2026_IA32_ASM_FLAGS = /nologo /c /WX /W3 /Cx /coff /Zd /Zi + + DEBUG_VS2026_IA32_NASM_FLAGS = -Ox -f win32 -g +RELEASE_VS2026_IA32_NASM_FLAGS = -Ox -f win32 +NOOPT_VS2026_IA32_NASM_FLAGS = -O0 -f win32 -g + +# Linker warning 4210 is disabled globally, because it checks if static initializers are present and the VCRuntime is +# linked. We do not link the VCRuntime (except for HOST_APPLICATIONs) so this warning can be generated erroneously +# whenever there are static initializers, because we will always fail the VCRuntime linking check + DEBUG_VS2026_IA32_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:X86 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /DEBUG /WX /IGNORE:4210 +RELEASE_VS2026_IA32_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4254 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:X86 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.rdata=.data /WX /IGNORE:4210 +NOOPT_VS2026_IA32_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:X86 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /DEBUG /WX /IGNORE:4210 + +# BaseTools cannot handle XIP modules with different section and file alignment +*_VS2026_IA32_DLINK_XIPFLAGS = /ALIGN:32 + +################## +# X64 definitions +################## +*_VS2026_X64_CC_PATH = DEF(VS2026_BIN_X64)\cl.exe +*_VS2026_X64_PP_PATH = DEF(VS2026_BIN_X64)\cl.exe +*_VS2026_X64_APP_PATH = DEF(VS2026_BIN_X64)\cl.exe +*_VS2026_X64_VFRPP_PATH = DEF(VS2026_BIN_X64)\cl.exe +*_VS2026_X64_ASLCC_PATH = DEF(VS2026_BIN_X64)\cl.exe +*_VS2026_X64_ASLPP_PATH = DEF(VS2026_BIN_X64)\cl.exe +*_VS2026_X64_ASM_PATH = DEF(VS2026_BIN_X64)\ml64.exe +*_VS2026_X64_SLINK_PATH = DEF(VS2026_BIN_X64)\lib.exe +*_VS2026_X64_DLINK_PATH = DEF(VS2026_BIN_X64)\link.exe +*_VS2026_X64_ASLDLINK_PATH = DEF(VS2026_BIN_X64)\link.exe + + DEBUG_VS2026_X64_CC_FLAGS = /nologo /c /WX /GS /W4 /Gs32768 /D UNICODE /O1b2s /GL /Gy /FIAutoGen.h /EHs-c- /GR- /GF /Z7 /Gw /volatileMetadata- +RELEASE_VS2026_X64_CC_FLAGS = /nologo /c /WX /GS /W4 /Gs32768 /D UNICODE /O1b2s /GL /Gy /FIAutoGen.h /EHs-c- /GR- /GF /Gw /volatileMetadata- +NOOPT_VS2026_X64_CC_FLAGS = /nologo /c /WX /GS /W4 /Gs32768 /D UNICODE /Gy /FIAutoGen.h /EHs-c- /GR- /GF /Z7 /Od /volatileMetadata- + + DEBUG_VS2026_X64_ASM_FLAGS = /nologo /c /WX /W3 /Cx /Zd /Zi +RELEASE_VS2026_X64_ASM_FLAGS = /nologo /c /WX /W3 /Cx /Zd +NOOPT_VS2026_X64_ASM_FLAGS = /nologo /c /WX /W3 /Cx /Zd /Zi + + DEBUG_VS2026_X64_NASM_FLAGS = -Ox -f win64 -g +RELEASE_VS2026_X64_NASM_FLAGS = -Ox -f win64 +NOOPT_VS2026_X64_NASM_FLAGS = -O0 -f win64 -g + +# Linker warning 4210 is disabled globally, because it checks if static initializers are present and the VCRuntime is +# linked. We do not link the VCRuntime (except for HOST_APPLICATIONs) so this warning can be generated erroneously +# whenever there are static initializers, because we will always fail the VCRuntime linking check + DEBUG_VS2026_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4281 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /Machine:X64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /DEBUG /ALIGN:4096 /DLL /WX /IGNORE:4210 +RELEASE_VS2026_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4281 /IGNORE:4254 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /Machine:X64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.rdata=.data /ALIGN:4096 /DLL /WX /IGNORE:4210 +NOOPT_VS2026_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4281 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /Machine:X64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /DEBUG /ALIGN:4096 /DLL /WX /IGNORE:4210 + +# BaseTools cannot handle XIP modules with different section and file alignment +*_VS2026_X64_DLINK_XIPFLAGS = /ALIGN:32 + +##################### +# AARCH64 definitions +##################### +*_VS2026_AARCH64_CC_PATH = DEF(VS2026_BIN_AARCH64)\cl.exe +*_VS2026_AARCH64_VFRPP_PATH = DEF(VS2026_BIN_AARCH64)\cl.exe +*_VS2026_AARCH64_SLINK_PATH = DEF(VS2026_BIN_AARCH64)\lib.exe +*_VS2026_AARCH64_DLINK_PATH = DEF(VS2026_BIN_AARCH64)\link.exe +*_VS2026_AARCH64_APP_PATH = DEF(VS2026_BIN_AARCH64)\cl.exe +*_VS2026_AARCH64_PP_PATH = DEF(VS2026_BIN_AARCH64)\cl.exe +*_VS2026_AARCH64_ASM_PATH = DEF(VS2026_BIN_AARCH64)\armasm64.exe +*_VS2026_AARCH64_ASLCC_PATH = DEF(VS2026_BIN_AARCH64)\cl.exe +*_VS2026_AARCH64_ASLPP_PATH = DEF(VS2026_BIN_AARCH64)\cl.exe +*_VS2026_AARCH64_ASLDLINK_PATH = DEF(VS2026_BIN_AARCH64)\link.exe + + *_VS2026_AARCH64_MAKE_FLAGS = /nologo + DEBUG_VS2026_AARCH64_CC_FLAGS = /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Gw /Oi- +RELEASE_VS2026_AARCH64_CC_FLAGS = /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gw /Oi- +NOOPT_VS2026_AARCH64_CC_FLAGS = /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Od /Oi- + + DEBUG_VS2026_AARCH64_ASM_FLAGS = /nologo /g +RELEASE_VS2026_AARCH64_ASM_FLAGS = /nologo +NOOPT_VS2026_AARCH64_ASM_FLAGS = /nologo + +# Linker warning 4210 is disabled globally, because it checks if static initializers are present and the VCRuntime is +# linked. We do not link the VCRuntime (except for HOST_APPLICATIONs) so this warning can be generated erroneously +# whenever there are static initializers, because we will always fail the VCRuntime linking check + DEBUG_VS2026_AARCH64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4226 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:ARM64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /DRIVER /DEBUG /WX /IGNORE:4210 +RELEASE_VS2026_AARCH64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4226 /IGNORE:4254 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:ARM64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /DRIVER /MERGE:.rdata=.data /WX /IGNORE:4210 +NOOPT_VS2026_AARCH64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4226 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:ARM64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /DRIVER /DEBUG /WX /IGNORE:4210 + +# BaseTools cannot handle XIP modules with different section and file alignment +*_VS2026_AARCH64_DLINK_XIPFLAGS = /ALIGN:64 + #################################################################################### # GCC Common #################################################################################### diff --git a/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py b/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py index 611b9899f72c..472a63719765 100644 --- a/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py +++ b/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py @@ -1,5 +1,5 @@ # @file WindowsVsToolChain.py -# Plugin to configure the environment for the VS2017, VS2019, and VS2022 toolchains +# Plugin to configure the environment for the VS2017, VS2019, VS2022, and VS2026 toolchains # # This plugin also runs for CLANGPDB toolchain on Windows as that toolchain # leverages nmake from VS and needs to the SDK paths for unit tests @@ -246,6 +246,78 @@ def do_pre_build(self, thebuilder): self.Logger.error("Path for VS2022 toolchain is invalid") return -2 + # + # VS2026 - VS2026 allows a user to install many copies/versions of the tools. + # If a specific version is required then the user must set both env variables: + # VS170INSTALLPATH: base install path on system to VC install dir. Here you will find the VC folder, etc + # VS170TOOLVER: version number for the VC compiler tools + # VS2026_PREFIX: path to MSVC compiler folder with trailing slash (can be used instead of two vars above) + # VS2026_HOST: set the host architecture to use for host tools, and host libs, etc + elif thebuilder.env.GetValue("TOOL_CHAIN_TAG") == "VS2026": + + # check to see if host is configured + # HostType for VS2026 should be (defined in tools_def): + # x86 == 32bit Intel + # x64 == 64bit Intel + # arm64 == 64bit Arm + # + HostType = shell_environment.GetEnvironment().get_shell_var("VS2026_HOST") + if HostType is not None: + HostType = HostType.lower() + self.Logger.info( + f"HOST TYPE defined by environment. Host Type is {HostType}") + else: + HostInfo = GetHostInfo() + if HostInfo.arch == "x86": + if HostInfo.bit == "32": + HostType = "x86" + elif HostInfo.bit == "64": + HostType = "x64" + else: + raise NotImplementedError() + + # VS2026_HOST options are not exactly the same as QueryVcVariables. This translates. + VC_HOST_ARCH_TRANSLATOR = { + "x86": "x86", "x64": "AMD64", "arm64": "not supported"} + + # check to see if full path already configured + if shell_environment.GetEnvironment().get_shell_var("VS2026_PREFIX") is not None: + self.Logger.debug("VS2026_PREFIX is already set.") + + else: + install_path = self._get_vs_install_path( + "VS2026".lower(), "VS180INSTALLPATH") + vc_ver = self._get_vc_version(install_path, "VS180TOOLVER") + + if install_path is None or vc_ver is None: + self.Logger.error( + "Failed to configure environment for VS2026") + return -1 + + version_aggregator.GetVersionAggregator().ReportVersion( + "Visual Studio Install Path", install_path, version_aggregator.VersionTypes.INFO) + version_aggregator.GetVersionAggregator().ReportVersion( + "VC Version", vc_ver, version_aggregator.VersionTypes.TOOL) + + # make VS2026_PREFIX to align with tools_def.txt + prefix = os.path.join(install_path, "VC", + "Tools", "MSVC", vc_ver) + prefix = prefix + os.path.sep + shell_environment.GetEnvironment().set_shell_var("VS2026_PREFIX", prefix) + shell_environment.GetEnvironment().set_shell_var("VS2026_HOST", HostType) + + shell_env = shell_environment.GetEnvironment() + # Use the tools lib to determine the correct values for the vars that interest us. + vs_vars = locate_tools.QueryVcVariables( + interesting_keys, VC_HOST_ARCH_TRANSLATOR[HostType], vs_version="VS2026") + for (k, v) in vs_vars.items(): + shell_env.set_shell_var(k, v) + + # now confirm it exists + if not os.path.exists(shell_environment.GetEnvironment().get_shell_var("VS2026_PREFIX")): + self.Logger.error("Path for VS2026 toolchain is invalid") + return -2 + # # CLANGPDB on Windows uses nmake from # the VS compiler toolchain. Find a version and set diff --git a/BaseTools/set_vsprefix_envs.bat b/BaseTools/set_vsprefix_envs.bat index 5565f615f1c4..acf259831262 100644 --- a/BaseTools/set_vsprefix_envs.bat +++ b/BaseTools/set_vsprefix_envs.bat @@ -18,6 +18,7 @@ set SCRIPT_ERROR=1 goto :EOF :main +if /I "%1"=="VS2026" goto SetVS2026 if /I "%1"=="VS2022" goto SetVS2022 if /I "%1"=="VS2019" goto SetVS2019 if /I "%1"=="VS2017" goto SetVS2017 @@ -250,4 +251,79 @@ if not defined IASL_PREFIX ( ) ) +:SetVS2026 +if not defined VS180COMNTOOLS ( + @REM clear two envs so that vcvars32.bat can run successfully. + set VSINSTALLDIR= + set VCToolsVersion= + if exist "%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" ( + if exist "%ProgramFiles(x86)%\Microsoft Visual Studio\2026\BuildTools" ( + call "%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -products Microsoft.VisualStudio.Product.BuildTools -version 18,19 > vswhereInfo + for /f "usebackq tokens=1* delims=: " %%i in (vswhereInfo) do ( + if /i "%%i"=="installationPath" call "%%j\VC\Auxiliary\Build\vcvars32.bat" + ) + del vswhereInfo + ) else ( + call "%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -version 18,19 > vswhereInfo + for /f "usebackq tokens=1* delims=: " %%i in (vswhereInfo) do ( + if /i "%%i"=="installationPath" call "%%j\VC\Auxiliary\Build\vcvars32.bat" + ) + del vswhereInfo + ) + ) else if exist "%ProgramFiles%\Microsoft Visual Studio\Installer\vswhere.exe" ( + if exist "%ProgramFiles%\Microsoft Visual Studio\2026\BuildTools" ( + call "%ProgramFiles%\Microsoft Visual Studio\Installer\vswhere.exe" -products Microsoft.VisualStudio.Product.BuildTools -version 18,19 > vswhereInfo + for /f "usebackq tokens=1* delims=: " %%i in (vswhereInfo) do ( + if /i "%%i"=="installationPath" call "%%j\VC\Auxiliary\Build\vcvars32.bat" + ) + del vswhereInfo + ) else ( + call "%ProgramFiles%\Microsoft Visual Studio\Installer\vswhere.exe" -version 18,19 > vswhereInfo + for /f "usebackq tokens=1* delims=: " %%i in (vswhereInfo) do ( + if /i "%%i"=="installationPath" call "%%j\VC\Auxiliary\Build\vcvars32.bat" + ) + del vswhereInfo + ) + ) else ( + if /I "%1"=="VS2026" goto ToolNotInstall + goto SetWinDDK + ) +) + +if defined VCToolsInstallDir ( + if not defined VS2026_PREFIX ( + set "VS2026_PREFIX=%VCToolsInstallDir%" + ) + if not defined WINSDK10_PREFIX ( + if defined WindowsSdkVerBinPath ( + set "WINSDK10_PREFIX=%WindowsSdkVerBinPath%" + ) else if exist "%ProgramFiles(x86)%\Windows Kits\10\bin" ( + set "WINSDK10_PREFIX=%ProgramFiles(x86)%\Windows Kits\10\bin\" + ) else if exist "%ProgramFiles%\Windows Kits\10\bin" ( + set "WINSDK10_PREFIX=%ProgramFiles%\Windows Kits\10\bin\" + ) + ) +) +if not defined WINSDK_PATH_FOR_RC_EXE ( + if defined WINSDK10_PREFIX ( + set "WINSDK_PATH_FOR_RC_EXE=%WINSDK10_PREFIX%x86" + ) +) + +if /I "%1"=="VS2026" goto SetWinDDK + +:SetWinDDK +if not defined WINDDK3790_PREFIX ( + set WINDDK3790_PREFIX=C:\WINDDK\3790.1830\bin\ +) + +if not defined IASL_PREFIX ( + if exist "C:\ASL\" ( + set IASL_PREFIX=C:\ASL\ + ) else ( + @echo. + @echo !!! WARNING !!! IASL_PREFIX environment variable is not set + ) +) + popd diff --git a/BaseTools/toolsetup.bat b/BaseTools/toolsetup.bat index 92eb6823a1bf..b3a778f4f1d2 100755 --- a/BaseTools/toolsetup.bat +++ b/BaseTools/toolsetup.bat @@ -49,6 +49,12 @@ if /I "%1"=="/?" goto Usage set BASETOOLS_MINGW_BUILD=TRUE goto loop ) + if /I "%1"=="VS2026" ( + shift + set VS2026=TRUE + set VSTool=VS2026 + goto loop + ) if /I "%1"=="VS2022" ( shift set VS2022=TRUE @@ -320,7 +326,9 @@ IF NOT exist "%EDK_TOOLS_PATH%\set_vsprefix_envs.bat" ( @echo. goto end ) -if defined VS2022 ( +if defined VS2026 ( + call %EDK_TOOLS_PATH%\set_vsprefix_envs.bat VS2026 +) else if defined VS2022 ( call %EDK_TOOLS_PATH%\set_vsprefix_envs.bat VS2022 ) else if defined VS2019 ( call %EDK_TOOLS_PATH%\set_vsprefix_envs.bat VS2019 @@ -582,7 +590,7 @@ endlocal :Usage @echo. - @echo Usage: "%0 [-h | -help | --help | /h | /help | /?] [ Rebuild | ForceRebuild ] [Reconfig] [Mingw-w64] [base_tools_path [edk_tools_path]] [VS2022] [VS2019] [VS2017] [VS2015]" + @echo Usage: "%0 [-h | -help | --help | /h | /help | /?] [ Rebuild | ForceRebuild ] [Reconfig] [Mingw-w64] [base_tools_path [edk_tools_path]] [VS2026] [VS2022] [VS2019] [VS2017] [VS2015]" @echo. @echo base_tools_path BaseTools project path, BASE_TOOLS_PATH will be set to this path. @echo edk_tools_path EDK_TOOLS_PATH will be set to this path. @@ -596,12 +604,14 @@ endlocal @echo VS2017 Set the env for VS2017 build. @echo VS2019 Set the env for VS2019 build. @echo VS2022 Set the env for VS2022 build. + @echo VS2026 Set the env for VS2026 build. @echo. :end set REBUILD= set FORCE_REBUILD= set RECONFIG= +set VS2026= set VS2022= set VS2019= set VS2017= diff --git a/edksetup.bat b/edksetup.bat index 8ee17c112c09..d0b06241e849 100755 --- a/edksetup.bat +++ b/edksetup.bat @@ -135,6 +135,7 @@ if defined CYGWIN_HOME ( if /I "%1"=="Rebuild" shift if /I "%1"=="ForceRebuild" shift if /I "%1"=="Mingw-w64" shift +if /I "%1"=="VS2026" shift if /I "%1"=="VS2022" shift if /I "%1"=="VS2019" shift if /I "%1"=="VS2017" shift @@ -143,7 +144,7 @@ if "%1"=="" goto end :Usage @echo. - @echo Usage: "%0 [-h | -help | --help | /h | /help | /?] [Reconfig] [Rebuild] [ForceRebuild] [Mingw-w64] [VS2022] [VS2019] [VS2017] [VS2015]" + @echo Usage: "%0 [-h | -help | --help | /h | /help | /?] [Reconfig] [Rebuild] [ForceRebuild] [Mingw-w64] [VS2026] [VS2022] [VS2019] [VS2017] [VS2015]" @echo. @echo Reconfig Reinstall target.txt, tools_def.txt and build_rule.txt. @echo Rebuild Perform incremental rebuild of BaseTools binaries. @@ -153,6 +154,7 @@ if "%1"=="" goto end @echo VS2017 Set the env for VS2017 build. @echo VS2019 Set the env for VS2019 build. @echo VS2022 Set the env for VS2022 build. + @echo VS2026 Set the env for VS2026 build. @echo. @echo Note that target.template, tools_def.template and build_rules.template @echo will only be copied to target.txt, tools_def.txt and build_rule.txt From adccced058d9637f117dc19dc7306afeccbdfa40 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 22 Dec 2025 21:15:30 +0100 Subject: [PATCH 0990/1172] BaseTools: Drop AArch64 definitions, Linker aligning and EBC info * Drop AArch64 definitions * Drop /ALIGN:32 from X64 linker flags * Drop ancient EBC compiler information Signed-off-by: Daniel Grobert --- BaseTools/Conf/tools_def.template | 42 +++---------------------------- 1 file changed, 3 insertions(+), 39 deletions(-) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index 57837fc11f4b..fc5a4da0ca11 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -179,9 +179,6 @@ DEFINE DTC_BIN = ENV(DTC_PREFIX)dtc # Intel(r) Compiler for Efi Byte Code (Intel(r) EBC Compiler) # VS2026 -win32,win64- Requires: # Microsoft Visual Studio 2026 version 18.0 or later -# Optional: -# Required to build EBC drivers: -# Intel(r) Compiler for Efi Byte Code (Intel(r) EBC Compiler) # GCCNOLTO -Linux,Windows- Requires: # GCC 4.9 targeting x86_64-linux-gnu or aarch64-linux-gnu # Optional: @@ -929,46 +926,13 @@ NOOPT_VS2026_X64_NASM_FLAGS = -O0 -f win64 -g # Linker warning 4210 is disabled globally, because it checks if static initializers are present and the VCRuntime is # linked. We do not link the VCRuntime (except for HOST_APPLICATIONs) so this warning can be generated erroneously # whenever there are static initializers, because we will always fail the VCRuntime linking check - DEBUG_VS2026_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4281 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /Machine:X64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /DEBUG /ALIGN:4096 /DLL /WX /IGNORE:4210 -RELEASE_VS2026_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4281 /IGNORE:4254 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /Machine:X64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.rdata=.data /ALIGN:4096 /DLL /WX /IGNORE:4210 -NOOPT_VS2026_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4281 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /Machine:X64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /DEBUG /ALIGN:4096 /DLL /WX /IGNORE:4210 + DEBUG_VS2026_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4281 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /Machine:X64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /DEBUG /ALIGN:4096 /DLL /WX /IGNORE:4210 +RELEASE_VS2026_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4281 /IGNORE:4254 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /Machine:X64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.rdata=.data /ALIGN:4096 /DLL /WX /IGNORE:4210 +NOOPT_VS2026_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4281 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /Machine:X64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /DEBUG /ALIGN:4096 /DLL /WX /IGNORE:4210 # BaseTools cannot handle XIP modules with different section and file alignment *_VS2026_X64_DLINK_XIPFLAGS = /ALIGN:32 -##################### -# AARCH64 definitions -##################### -*_VS2026_AARCH64_CC_PATH = DEF(VS2026_BIN_AARCH64)\cl.exe -*_VS2026_AARCH64_VFRPP_PATH = DEF(VS2026_BIN_AARCH64)\cl.exe -*_VS2026_AARCH64_SLINK_PATH = DEF(VS2026_BIN_AARCH64)\lib.exe -*_VS2026_AARCH64_DLINK_PATH = DEF(VS2026_BIN_AARCH64)\link.exe -*_VS2026_AARCH64_APP_PATH = DEF(VS2026_BIN_AARCH64)\cl.exe -*_VS2026_AARCH64_PP_PATH = DEF(VS2026_BIN_AARCH64)\cl.exe -*_VS2026_AARCH64_ASM_PATH = DEF(VS2026_BIN_AARCH64)\armasm64.exe -*_VS2026_AARCH64_ASLCC_PATH = DEF(VS2026_BIN_AARCH64)\cl.exe -*_VS2026_AARCH64_ASLPP_PATH = DEF(VS2026_BIN_AARCH64)\cl.exe -*_VS2026_AARCH64_ASLDLINK_PATH = DEF(VS2026_BIN_AARCH64)\link.exe - - *_VS2026_AARCH64_MAKE_FLAGS = /nologo - DEBUG_VS2026_AARCH64_CC_FLAGS = /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Gw /Oi- -RELEASE_VS2026_AARCH64_CC_FLAGS = /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gw /Oi- -NOOPT_VS2026_AARCH64_CC_FLAGS = /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Od /Oi- - - DEBUG_VS2026_AARCH64_ASM_FLAGS = /nologo /g -RELEASE_VS2026_AARCH64_ASM_FLAGS = /nologo -NOOPT_VS2026_AARCH64_ASM_FLAGS = /nologo - -# Linker warning 4210 is disabled globally, because it checks if static initializers are present and the VCRuntime is -# linked. We do not link the VCRuntime (except for HOST_APPLICATIONs) so this warning can be generated erroneously -# whenever there are static initializers, because we will always fail the VCRuntime linking check - DEBUG_VS2026_AARCH64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4226 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:ARM64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /DRIVER /DEBUG /WX /IGNORE:4210 -RELEASE_VS2026_AARCH64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4226 /IGNORE:4254 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:ARM64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /DRIVER /MERGE:.rdata=.data /WX /IGNORE:4210 -NOOPT_VS2026_AARCH64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4226 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:ARM64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /DRIVER /DEBUG /WX /IGNORE:4210 - -# BaseTools cannot handle XIP modules with different section and file alignment -*_VS2026_AARCH64_DLINK_XIPFLAGS = /ALIGN:64 - #################################################################################### # GCC Common #################################################################################### From 99f93277405da8f8851f31483af3281ed7aff41d Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 7 Jan 2026 15:54:54 +0100 Subject: [PATCH 0991/1172] UnitTestFrameworkPkg: Add VS2026 Support * Add checks for VS2026. * Enable Address Sanitizer for VS2026. Signed-off-by: Daniel Grobert --- UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc index f16ff44e64d2..ce20aa7c1cf2 100644 --- a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc +++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc @@ -49,7 +49,7 @@ # +--------------------+--------+----------+------------+-----+----+--------+ # | OS/Compiler | VS2019 | CLANGPDB | CLANGDWARF | GCC | XCODE5 | # | | VS2022 | | | GCC5 | | -# | | | | | GCCNOLTO | | +# | | VS2026 | | | GCCNOLTO | | # +--------------------+--------+----------+------------+----------+--------+ # | Windows/VS |IA32/X64| | | | | # | Windows/LLVM/VS | | IA32/X64 | | | | @@ -90,7 +90,7 @@ # macOS/XCODE: macOS environment with XCODE5 installed. # !if $(WIN_MINGW32_BUILD) - !if $(TOOL_CHAIN_TAG) in "VS2019 VS2022" + !if $(TOOL_CHAIN_TAG) in "VS2019 VS2022 VS2026" !error Host-based Unit Tests not supported for Mingw/VS20xx builds !endif !if $(TOOL_CHAIN_TAG) in "CLANGPDB" @@ -108,7 +108,7 @@ !error Host-based Unit Tests not supported for Windows/CLANGDWARF builds !endif !else - !if $(TOOL_CHAIN_TAG) in "VS2019 VS2022" + !if $(TOOL_CHAIN_TAG) in "VS2019 VS2022 VS2026" !error Host-based Unit Tests not supported for Linux/VS20xx builds !endif !if $(TOOL_CHAIN_TAG) in "CLANGPDB" @@ -149,10 +149,11 @@ !if $(UNIT_TESTING_ADDRESS_SANITIZER_ENABLE) # - # Enable Address Sanitizer for VS2019, VS2022, and GCC + # Enable Address Sanitizer for VS2019, VS2022, VS2026, and GCC # MSFT:*_VS2019_*_CC_FLAGS = /fsanitize=address MSFT:*_VS2022_*_CC_FLAGS = /fsanitize=address + MSFT:*_VS2026_*_CC_FLAGS = /fsanitize=address GCC:*_*_*_CC_FLAGS = -fsanitize=address CLANGPDB:*_*_*_CC_FLAGS = -fsanitize=address !endif From 6310b11b41500cb796246d4504fcb1dc0bc3ba2e Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Tue, 4 Nov 2025 12:07:27 -0800 Subject: [PATCH 0992/1172] ArmPlatformPkg: MemoryInitPeiLib: Read PCDs into local variable Current MemoryPeim has excessive amount of PCD get notations. This makes the code less readable and introduced long if statements. This change reads most of the PCD get calls into local variables and reference the variables instead. Signed-off-by: Kun Qin --- .../MemoryInitPei/MemoryInitPeiLib.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.c b/ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.c index d7afccfb854b..d6a6ffe766ff 100644 --- a/ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.c +++ b/ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.c @@ -66,6 +66,7 @@ MemoryPeim ( UINT64 ResourceLength; EFI_PEI_HOB_POINTERS NextHob; EFI_PHYSICAL_ADDRESS FdTop; + EFI_PHYSICAL_ADDRESS SystemMemoryBase; EFI_PHYSICAL_ADDRESS SystemMemoryTop; EFI_PHYSICAL_ADDRESS ResourceTop; BOOLEAN Found; @@ -88,6 +89,12 @@ MemoryPeim ( EFI_RESOURCE_ATTRIBUTE_TESTED ); + // + // Use local variable to avoid multiple PcdGet64 calls + // + SystemMemoryBase = (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdSystemMemoryBase); + SystemMemoryTop = SystemMemoryBase + (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdSystemMemorySize); + // // Check if the resource for the main system memory has been declared // @@ -95,8 +102,8 @@ MemoryPeim ( NextHob.Raw = GetHobList (); while ((NextHob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, NextHob.Raw)) != NULL) { if ((NextHob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) && - (PcdGet64 (PcdSystemMemoryBase) >= NextHob.ResourceDescriptor->PhysicalStart) && - (NextHob.ResourceDescriptor->PhysicalStart + NextHob.ResourceDescriptor->ResourceLength <= PcdGet64 (PcdSystemMemoryBase) + PcdGet64 (PcdSystemMemorySize))) + (SystemMemoryBase >= NextHob.ResourceDescriptor->PhysicalStart) && + (NextHob.ResourceDescriptor->PhysicalStart + NextHob.ResourceDescriptor->ResourceLength <= SystemMemoryTop)) { Found = TRUE; break; @@ -110,7 +117,7 @@ MemoryPeim ( BuildResourceDescriptorHob ( EFI_RESOURCE_SYSTEM_MEMORY, ResourceAttributes, - PcdGet64 (PcdSystemMemoryBase), + SystemMemoryBase, PcdGet64 (PcdSystemMemorySize) ); } @@ -119,13 +126,12 @@ MemoryPeim ( // Reserved the memory space occupied by the firmware volume // - SystemMemoryTop = (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdSystemMemoryBase) + (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdSystemMemorySize); - FdTop = (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdFdBaseAddress) + (EFI_PHYSICAL_ADDRESS)PcdGet32 (PcdFdSize); + FdTop = (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdFdBaseAddress) + (EFI_PHYSICAL_ADDRESS)PcdGet32 (PcdFdSize); // EDK2 does not have the concept of boot firmware copied into DRAM. To avoid the DXE // core to overwrite this area we must create a memory allocation HOB for the region, // but this only works if we split off the underlying resource descriptor as well. - if ((PcdGet64 (PcdFdBaseAddress) >= PcdGet64 (PcdSystemMemoryBase)) && (FdTop <= SystemMemoryTop)) { + if ((PcdGet64 (PcdFdBaseAddress) >= SystemMemoryBase) && (FdTop <= SystemMemoryTop)) { Found = FALSE; // Search for System Memory Hob that contains the firmware From 7ccc418c23be1109aba8649ca2b08ef217f1d9e6 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Wed, 31 Dec 2025 00:35:33 +0000 Subject: [PATCH 0993/1172] ArmPkg: MmCommunicationDxe: Handle when the region is already reported When the memory region for MM communication buffer is reported, the current driver will reject further procession. This change is added to cover such usage so that we do not need to poke holes in the main system memory. Signed-off-by: Kun Qin --- .../MmCommunicationDxe/MmCommunication.c | 52 ++++++++++++++++++- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c index c2a3bd1a84dc..2777d9d47736 100644 --- a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c +++ b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c @@ -763,13 +763,61 @@ MmCommunication2Initialize ( EFI_MEMORY_XP | EFI_MEMORY_RUNTIME ); - if (EFI_ERROR (Status)) { + if (EFI_ERROR (Status) && (Status != EFI_ACCESS_DENIED)) { DEBUG (( DEBUG_ERROR, "MmCommunicateInitialize: " - "Failed to add MM-NS Buffer Memory Space\n" + "Failed to add MM-NS Buffer Memory Space - %r\n", + Status )); goto ReturnErrorStatus; + } else if (Status == EFI_ACCESS_DENIED) { + Status = gDS->FreeMemorySpace ( + mNsCommBuffMemRegion.PhysicalBase, + mNsCommBuffMemRegion.Length + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "MmCommunicateInitialize: " + "Failed to free existing MM-NS Buffer Memory Space - %r\n", + Status + )); + goto ReturnErrorStatus; + } + + Status = gDS->RemoveMemorySpace ( + mNsCommBuffMemRegion.PhysicalBase, + mNsCommBuffMemRegion.Length + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "MmCommunicateInitialize: " + "Failed to remove existing MM-NS Buffer Memory Space - %r\n", + Status + )); + goto ReturnErrorStatus; + } + + // Try to add the memory space again + Status = gDS->AddMemorySpace ( + EfiGcdMemoryTypeReserved, + mNsCommBuffMemRegion.PhysicalBase, + mNsCommBuffMemRegion.Length, + EFI_MEMORY_WB | + EFI_MEMORY_XP | + EFI_MEMORY_RUNTIME + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "MmCommunicateInitialize: " + "Failed to add MM-NS Buffer Memory Space (second attempt) - %r\n", + Status + )); + goto ReturnErrorStatus; + } } Status = gDS->SetMemorySpaceAttributes ( From 4e92a6a9d473ce71a87648538958c59e5b1af24d Mon Sep 17 00:00:00 2001 From: Qihang Gao Date: Sun, 4 Jan 2026 17:11:50 +0800 Subject: [PATCH 0994/1172] MdeModulePkg: Fix issue that French package is unexpectedly cleaned The DriverHealthManagerStrings.uni file defines both English and French languages, resulting in the generation of two Unicode string packages: the first for English and the second for French. When cleaning the dynamic strings from the HII package list, the pointer which should point to dynamic string package incorrectly points to the static French package, causing it to be unexpectedly cleaned. This patch fixes the pointer of EFI_HII_PACKAGE_END type PackageHeader. This way, there is no need for concern regarding the number of language packages available. Signed-off-by: Qihang Gao --- .../Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.c b/MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.c index 94f4b6281afd..cb471b34cdb6 100644 --- a/MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.c +++ b/MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.c @@ -909,7 +909,7 @@ DriverHealthManagerCleanDynamicString ( PackageHeader = (EFI_HII_PACKAGE_HEADER *)(HiiPackageList + 1); CopyMem (PackageHeader, STRING_ARRAY_NAME + sizeof (UINT32), FixedStringSize); - PackageHeader = (EFI_HII_PACKAGE_HEADER *)((UINT8 *)PackageHeader + PackageHeader->Length); + PackageHeader = (EFI_HII_PACKAGE_HEADER *)((UINT8 *)PackageHeader + FixedStringSize); PackageHeader->Type = EFI_HII_PACKAGE_END; PackageHeader->Length = sizeof (EFI_HII_PACKAGE_HEADER); From a3c1ea0d0ce0a19cc33a0f9cdbc55a5010f3cda5 Mon Sep 17 00:00:00 2001 From: Qihang Gao Date: Sun, 4 Jan 2026 17:28:28 +0800 Subject: [PATCH 0995/1172] MdeModulePkg: Optimize the process while cleaning dynamic string In the current code, the HiiPackageList will be created and destroyed each time the form is closed, which is unneccessary. This patch makes a function that produces the origin HiiPackageList. The function will only be called when the driver is initialized and the HiiPackageList will be directly updated in DriverHealthManagerCleanDynamicString function. This approach can avoid the unneccessary creation and destruction of the HiiPackageList. Signed-off-by: Qihang Gao --- .../DriverHealthManagerDxe.c | 70 +++++++++++-------- 1 file changed, 41 insertions(+), 29 deletions(-) diff --git a/MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.c b/MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.c index cb471b34cdb6..4b7df76eeecd 100644 --- a/MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.c +++ b/MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.c @@ -47,6 +47,7 @@ EFI_HII_HANDLE mDriverHealthManagerHiiHandle; EFI_BOOT_MANAGER_DRIVER_HEALTH_INFO *mDriverHealthManagerHealthInfo = NULL; UINTN mDriverHealthManagerHealthInfoCount = 0; EFI_HII_DATABASE_PROTOCOL *mDriverHealthManagerDatabase; +EFI_HII_PACKAGE_LIST_HEADER *mBackupHiiPackageList = NULL; extern UINT8 DriverHealthManagerVfrBin[]; extern UINT8 DriverHealthConfigureVfrBin[]; @@ -123,6 +124,42 @@ DriverHealthManagerFakeRouteConfig ( return EFI_NOT_FOUND; } +/** + Create a default HiiPackageList that only contains static STRING_ARRAY_NAME data + once the driver is initialized. This HiiPackageList is used to be updated in + DriverHealthManagerCleanDynamicString function. +**/ +EFI_HII_PACKAGE_LIST_HEADER * +CreateBackupStringPackageList ( + VOID + ) +{ + EFI_HII_PACKAGE_LIST_HEADER *BackupHiiPackageList; + UINTN BufferSize; + EFI_HII_PACKAGE_HEADER *PackageHeader; + UINT32 FixedStringSize; + + FixedStringSize = *(UINT32 *)&STRING_ARRAY_NAME - sizeof (UINT32); + BufferSize = sizeof (EFI_HII_PACKAGE_LIST_HEADER) + FixedStringSize + sizeof (EFI_HII_PACKAGE_HEADER); + BackupHiiPackageList = AllocateZeroPool (BufferSize); + if (BackupHiiPackageList == NULL) { + ASSERT (BackupHiiPackageList != NULL); + return NULL; + } + + BackupHiiPackageList->PackageLength = (UINT32)BufferSize; + CopyMem (&BackupHiiPackageList->PackageListGuid, &gEfiCallerIdGuid, sizeof (EFI_GUID)); + + PackageHeader = (EFI_HII_PACKAGE_HEADER *)(BackupHiiPackageList + 1); + CopyMem (PackageHeader, STRING_ARRAY_NAME + sizeof (UINT32), FixedStringSize); + + PackageHeader = (EFI_HII_PACKAGE_HEADER *)((UINT8 *)PackageHeader + FixedStringSize); + PackageHeader->Type = EFI_HII_PACKAGE_END; + PackageHeader->Length = sizeof (EFI_HII_PACKAGE_HEADER); + + return BackupHiiPackageList; +} + /** Install the health manager forms. @@ -177,6 +214,8 @@ InitializeDriverHealthManager ( ); ASSERT (mDriverHealthManagerHiiHandle != NULL); + mBackupHiiPackageList = CreateBackupStringPackageList (); + return EFI_SUCCESS; } @@ -889,41 +928,14 @@ DriverHealthManagerCleanDynamicString ( VOID ) { - EFI_STATUS Status; - EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList; - UINTN BufferSize; - EFI_HII_PACKAGE_HEADER *PackageHeader; - UINT32 FixedStringSize; - - FixedStringSize = *(UINT32 *)&STRING_ARRAY_NAME - sizeof (UINT32); - BufferSize = sizeof (EFI_HII_PACKAGE_LIST_HEADER) + FixedStringSize + sizeof (EFI_HII_PACKAGE_HEADER); - HiiPackageList = AllocatePool (BufferSize); - if (HiiPackageList == NULL) { - ASSERT (HiiPackageList != NULL); - return; - } - - HiiPackageList->PackageLength = (UINT32)BufferSize; - CopyMem (&HiiPackageList->PackageListGuid, &gEfiCallerIdGuid, sizeof (EFI_GUID)); - - PackageHeader = (EFI_HII_PACKAGE_HEADER *)(HiiPackageList + 1); - CopyMem (PackageHeader, STRING_ARRAY_NAME + sizeof (UINT32), FixedStringSize); - - PackageHeader = (EFI_HII_PACKAGE_HEADER *)((UINT8 *)PackageHeader + FixedStringSize); - PackageHeader->Type = EFI_HII_PACKAGE_END; - PackageHeader->Length = sizeof (EFI_HII_PACKAGE_HEADER); + EFI_STATUS Status; Status = mDriverHealthManagerDatabase->UpdatePackageList ( mDriverHealthManagerDatabase, mDriverHealthManagerHiiHandle, - HiiPackageList + mBackupHiiPackageList ); ASSERT_EFI_ERROR (Status); - - // - // Form package not found in this Package List - // - FreePool (HiiPackageList); } /** From ec43dcc0857aaa8d01c1edfa3364d514390f5abf Mon Sep 17 00:00:00 2001 From: Qihang Gao Date: Tue, 23 Dec 2025 19:00:08 +0800 Subject: [PATCH 0996/1172] MdePkg: Fix incorrect mask in PostCode Fixes https://github.com/tianocore/edk2/issues/11898 According to the comment of macro, bits 5..7 of PostCode are mapped to bits 24..26 of status code value, so the correct number should be 0xe0 instead of 0x03. Signed-off-by: Qihang Gao --- MdePkg/Library/PeiDxePostCodeLibReportStatusCode/PostCode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MdePkg/Library/PeiDxePostCodeLibReportStatusCode/PostCode.c b/MdePkg/Library/PeiDxePostCodeLibReportStatusCode/PostCode.c index bf2da0c0cf25..de57c885794e 100644 --- a/MdePkg/Library/PeiDxePostCodeLibReportStatusCode/PostCode.c +++ b/MdePkg/Library/PeiDxePostCodeLibReportStatusCode/PostCode.c @@ -27,7 +27,7 @@ **/ #define POST_CODE_TO_STATUS_CODE_VALUE(PostCode) \ - ((EFI_STATUS_CODE_VALUE) (((PostCode & 0x1f) << 16) | ((PostCode & 0x3) << 19))) + ((EFI_STATUS_CODE_VALUE) (((PostCode & 0x1f) << 16) | ((PostCode & 0xe0) << 19))) /** Sends an 32-bit value to a POST card. From eea64c7fcd7f8d6dddb0173e6c4e43590afe460d Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Sat, 16 Aug 2025 21:40:33 +0100 Subject: [PATCH 0997/1172] MdePkg, MdeModulePkg/ArmFfaLib: add funcs to get partition info via regs Starting from FF-A v1.2 [0], the FFA_PARTITION_INFO_GET_REGS interface was added to retrieve partition information through registers. This ABI is useful in environments where the Rx/Tx buffer does not need to be mapped, or where buffer mapping is not supported for retrieving partition information. To support this, two new APIs are introduced: ArmFfaLibPartitionInfoGetRegs() and ArmFfaLibPartitionCountGetRegs(). Link: https://developer.arm.com/documentation/den0077/latest [0] Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Yeoreum Yun --- MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c | 159 ++++++++++++++++++ .../Include/IndustryStandard/ArmFfaPartInfo.h | 4 +- MdePkg/Include/Library/ArmFfaLib.h | 46 +++++ 3 files changed, 208 insertions(+), 1 deletion(-) diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c index d43821978846..0a147d07991f 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c @@ -530,6 +530,165 @@ ArmFfaLibPartitionInfoGet ( return Status; } +/** + Get number of Partitions via registers. + This function is supported by aarch64 only. + + @param [in] ServiceGuid Service guid. + @param [out] PartDescCount Return number of partition info related to + ServiceGuid. + + @retval EFI_SUCCESS + @retval EFI_UNSUPPORTED + @retval EFI_INVALID_PARAMETER + @retval Other Error + +**/ +EFI_STATUS +EFIAPI +ArmFfaLibPartitionCountGetRegs ( + IN EFI_GUID *ServiceGuid, + OUT UINT32 *PartDescCount + ) +{ + EFI_STATUS Status; + ARM_FFA_ARGS FfaArgs; + UINT64 Uuid[2]; + + if (PartDescCount == NULL) { + return EFI_INVALID_PARAMETER; + } + + if (ServiceGuid != NULL) { + ConvertGuidToUuid (ServiceGuid, (GUID *)Uuid); + } else { + ZeroMem (Uuid, sizeof (Uuid)); + } + + ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); + + FfaArgs.Arg0 = ARM_FID_FFA_PARTITION_INFO_GET_REGS; + FfaArgs.Arg1 = Uuid[0]; + FfaArgs.Arg2 = Uuid[1]; + + ArmCallFfa (&FfaArgs); + + Status = FfaArgsToEfiStatus (&FfaArgs); + if (EFI_ERROR (Status)) { + return Status; + } + + *PartDescCount = ((FfaArgs.Arg2 >> FFA_PART_INFO_METADATA_LAST_IDX_SHIFT) & + FFA_PART_INFO_IDX_MASK) + 1; + + return EFI_SUCCESS; +} + +/** + Get Partition info via registers. + This function is supported by aarch64 only. + + @param [in] ServiceGuid Service guid. + @param [in,out] PartDescCount Number of PartDesc. + It'll return the copied number of + partition info in PartDesc. + @param [out] PartDesc Partition information Buffer + + @retval EFI_SUCCESS + @retval EFI_UNSUPPORTED + @retval EFI_INVALID_PARAMETER + @retval EFI_BUFFER_TOO_SMALL + @retval Other Error + +**/ +EFI_STATUS +EFIAPI +ArmFfaLibPartitionInfoGetRegs ( + IN EFI_GUID *ServiceGuid, + IN OUT UINT32 *PartDescCount, + OUT EFI_FFA_PART_INFO_DESC *PartDesc + ) +{ + EFI_STATUS Status; + ARM_FFA_ARGS FfaArgs; + UINT64 Uuid[2]; + UINT32 DescCount; + UINT16 Count; + UINT16 PrevIdx; + UINT16 StartIdx; + UINT16 CurIdx; + UINT16 Tag; + UINT16 Idx; + UINT16 DescSize; + UINTN *Regs; + + if ((PartDescCount == NULL) || (PartDesc == NULL)) { + return EFI_INVALID_PARAMETER; + } + + if (*PartDescCount == 0) { + return EFI_BUFFER_TOO_SMALL; + } + + if (ServiceGuid != NULL) { + ConvertGuidToUuid (ServiceGuid, (GUID *)Uuid); + } else { + ZeroMem (Uuid, sizeof (Uuid)); + } + + PrevIdx = 0; + Tag = 0; + DescCount = *PartDescCount; + + do { + StartIdx = (PrevIdx == 0) ? 0 : PrevIdx + 1; + + ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); + + FfaArgs.Arg0 = ARM_FID_FFA_PARTITION_INFO_GET_REGS; + FfaArgs.Arg1 = Uuid[0]; + FfaArgs.Arg2 = Uuid[1]; + FfaArgs.Arg3 = (Tag << FFA_PART_INFO_START_TAG_SHIFT) | StartIdx; + + ArmCallFfa (&FfaArgs); + + Status = FfaArgsToEfiStatus (&FfaArgs); + if (EFI_ERROR (Status)) { + return Status; + } + + Count = ((FfaArgs.Arg2 >> FFA_PART_INFO_METADATA_LAST_IDX_SHIFT) & + FFA_PART_INFO_IDX_MASK) + 1; + + CurIdx = ((FfaArgs.Arg2 >> FFA_PART_INFO_METADATA_CURRENT_IDX_SHIFT) & + FFA_PART_INFO_IDX_MASK); + Tag = ((FfaArgs.Arg2 >> FFA_PART_INFO_METADATA_TAG_SHIFT) & + FFA_PART_INFO_TAG_MASK); + DescSize = ((FfaArgs.Arg2 >> FFA_PART_INFO_METADATA_DESC_SIZE_SHIFT) & + FFA_PART_INFO_DESC_SIZE_MASK); + + if (DescSize != sizeof (EFI_FFA_PART_INFO_DESC)) { + return EFI_INVALID_PARAMETER; + } + + Regs = &FfaArgs.Arg3; + for (Idx = 0; Idx < (CurIdx - StartIdx) + 1; Idx++) { + CopyMem (PartDesc, Regs, DescSize); + Regs += sizeof (EFI_FFA_PART_INFO_DESC) / sizeof (UINTN); + PartDesc++; + if (--DescCount == 0) { + break; + } + } + + PrevIdx = CurIdx; + } while (CurIdx < (Count - 1) && (DescCount != 0)); + + *PartDescCount -= DescCount; + + return EFI_SUCCESS; +} + /** Restore the context which was interrupted with FFA_INTERRUPT (EFI_INTERRUPT_PENDING). diff --git a/MdePkg/Include/IndustryStandard/ArmFfaPartInfo.h b/MdePkg/Include/IndustryStandard/ArmFfaPartInfo.h index fcee5575ac5d..be6bb9ceffb4 100644 --- a/MdePkg/Include/IndustryStandard/ArmFfaPartInfo.h +++ b/MdePkg/Include/IndustryStandard/ArmFfaPartInfo.h @@ -33,7 +33,8 @@ #define FFA_PART_INFO_FLAG_TYPE_DESC 0 #define FFA_PART_INFO_IDX_MASK 0xffff -#define FFA_PART_INFO_START_TAG_MASK 0xffff +#define FFA_PART_INFO_TAG_MASK 0xffff +#define FFA_PART_INFO_DESC_SIZE_MASK 0xffff /** macro used in FFA_PARTITION_INFO_GET_REGS request * See FF-A spec chapter 13.9 FFA_PARTITION_INFO_GET_REGS @@ -47,6 +48,7 @@ #define FFA_PART_INFO_METADATA_LAST_IDX_SHIFT 0 #define FFA_PART_INFO_METADATA_CURRENT_IDX_SHIFT 16 #define FFA_PART_INFO_METADATA_TAG_SHIFT 32 +#define FFA_PART_INFO_METADATA_DESC_SIZE_SHIFT 48 /** Partition properties values in EFI_FFA_PART_INFO_DESC->PartitionProps * See FF-A spec chapter 6.2 partition discovery. diff --git a/MdePkg/Include/Library/ArmFfaLib.h b/MdePkg/Include/Library/ArmFfaLib.h index 190a943e5bda..0c780038d93a 100644 --- a/MdePkg/Include/Library/ArmFfaLib.h +++ b/MdePkg/Include/Library/ArmFfaLib.h @@ -265,6 +265,52 @@ ArmFfaLibPartitionInfoGet ( OUT UINT32 *Size OPTIONAL ); +/** + Get number of Partitions via registers. + This function is supported by aarch64 only. + + @param [in] ServiceGuid Service guid. + @param [out] PartDescCount Return number of partition info related to + ServiceGuid. + + @retval EFI_SUCCESS + @retval EFI_UNSUPPORTED + @retval EFI_INVALID_PARAMETER + @retval Other Error + +**/ +EFI_STATUS +EFIAPI +ArmFfaLibPartitionCountGetRegs ( + IN EFI_GUID *ServiceGuid, + OUT UINT32 *PartDescCount + ); + +/** + Get Partition info via registers. + This function is supported by aarch64 only. + + @param [in] ServiceGuid Service guid. + @param [in, out] PartDescCount Return number of partition info related to + Service guid when PartDesc == NULL. + Otherwise return number of partition info + copied in ParcDesc + @param [out] PartDesc Partition information Buffer + + @retval EFI_SUCCESS + @retval EFI_UNSUPPORTED + @retval EFI_INVALID_PARAMETER + @retval Other Error + +**/ +EFI_STATUS +EFIAPI +ArmFfaLibPartitionInfoGetRegs ( + IN EFI_GUID *ServiceGuid, + IN OUT UINT32 *PartDescCount, + OUT EFI_FFA_PART_INFO_DESC *PartDesc OPTIONAL + ); + /** Get partition or VM id. This function is only called in ArmFfaLibConstructor. From 898ae481d94e696da0f679c79bf61d54747e46ac Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Sat, 16 Aug 2025 22:55:41 +0100 Subject: [PATCH 0998/1172] MdeModulePkg/ArmFfaLib: support ArmFfaLib wihtout Rx/Tx buffer In the normal world, it is possible to communicate with a secure partition using the ARM_FFA_PARTITION_INFO_GET_REGS ABI, even when the Rx/Tx buffer ABI is not supported. Therefore, treat the EFI_UNSUPPORTED error returned during Rx/Tx buffer mapping as a valid result when the ARM_FFA_PARTITION_INFO_GET_REGS ABI is supported. Signed-off-by: Yeoreum Yun --- MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c | 19 ++++++++++++++++ MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c | 22 +++++++++++++++++++ MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c | 22 +++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c index ad2ed2f1fdef..94a4a215600d 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c @@ -75,6 +75,8 @@ ArmFfaDxeLibConstructor ( EFI_STATUS Status; EFI_HOB_GUID_TYPE *RxTxBufferHob; ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo; + UINTN Property1; + UINTN Property2; Status = ArmFfaLibCommonInit (); if (EFI_ERROR (Status)) { @@ -126,6 +128,23 @@ ArmFfaDxeLibConstructor ( } } else { Status = ArmFfaLibRxTxMap (); + if (Status == EFI_UNSUPPORTED) { + /* + * When ARM_FID_FFA_PARTITION_INFO_GET_REGS is supported, + * Rx/Tx buffer might not be required to request service to + * secure partition. + * So, consider EFI_UNSUPPORTED for Rx/Tx buffer as SUCCESS. + */ + Status = ArmFfaLibGetFeatures ( + ARM_FID_FFA_PARTITION_INFO_GET_REGS, + 0x00, + &Property1, + &Property2 + ); + if (!EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "%a Rx/Tx buffer doesn't support.\n", __func__)); + } + } /* * When first Dxe instance (library or driver) which uses ArmFfaLib loaded, diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c index e2dd99be673d..c21d5f2ba08a 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c @@ -100,6 +100,8 @@ ArmFfaPeiLibConstructor ( ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo; VOID *Dummy; EFI_HOB_MEMORY_ALLOCATION *RxTxBufferAllocationHob; + UINTN Property1; + UINTN Property2; Status = ArmFfaLibCommonInit (); if (EFI_ERROR (Status)) { @@ -124,6 +126,26 @@ ArmFfaPeiLibConstructor ( if (RxTxBufferHob == NULL) { Status = ArmFfaLibRxTxMap (); if (EFI_ERROR (Status)) { + if (Status != EFI_UNSUPPORTED) { + return Status; + } + + /* + * When ARM_FID_FFA_PARTITION_INFO_GET_REGS is supported, + * Rx/Tx buffer might not be required to request service to + * secure partition. + * So, consider EFI_UNSUPPORTED for Rx/Tx buffer as SUCCESS. + */ + Status = ArmFfaLibGetFeatures ( + ARM_FID_FFA_PARTITION_INFO_GET_REGS, + 0x00, + &Property1, + &Property2 + ); + if (!EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "%a Rx/Tx buffer doesn't support.\n", __func__)); + } + return Status; } diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c index 7c3d39d270fd..4ee471d7956e 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c @@ -51,6 +51,8 @@ ArmFfaSecLibConstructor ( EFI_STATUS Status; ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo; EFI_HOB_MEMORY_ALLOCATION *RxTxBufferAllocationHob; + UINTN Property1; + UINTN Property2; Status = ArmFfaLibCommonInit (); if (EFI_ERROR (Status)) { @@ -72,6 +74,26 @@ ArmFfaSecLibConstructor ( Status = ArmFfaLibRxTxMap (); if (EFI_ERROR (Status)) { + if (Status != EFI_UNSUPPORTED) { + return Status; + } + + /* + * When ARM_FID_FFA_PARTITION_INFO_GET_REGS is supported, + * Rx/Tx buffer might not be required to request service to + * secure partition. + * So, consider EFI_UNSUPPORTED for Rx/Tx buffer as SUCCESS. + */ + Status = ArmFfaLibGetFeatures ( + ARM_FID_FFA_PARTITION_INFO_GET_REGS, + 0x00, + &Property1, + &Property2 + ); + if (!EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "%a Rx/Tx buffer doesn't support.\n", __func__)); + } + return Status; } From c16f1cc6843b4ec5f246f9d115c37ed12e4bad2c Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Sun, 12 Oct 2025 22:02:44 +0100 Subject: [PATCH 0999/1172] MdePkg,MdeModulePkg/ArmFfaLib: introduce ArmFfaGetPartitionInfo() Introduce ArmFfaGetPartitionInfo(), which retrieves the first partition associated with the service GUID. This allows us to remove duplicated code previously used to obtain the partition ID. Signed-off-by: Yeoreum Yun Continuous-integration-options: PatchCheck.ignore-multi-package --- MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c | 80 +++++++++++++++++++ MdePkg/Include/Library/ArmFfaLib.h | 24 ++++++ 2 files changed, 104 insertions(+) diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c index 0a147d07991f..d0fb95123051 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c @@ -950,6 +950,86 @@ ArmFfaLibCommonInit ( return EFI_SUCCESS; } +/** + Helper to retrieve the first partition information associated with + a service GUID via registers. + + @param [in] ServiceGuid Service guid. + @param [in, out] PartDescCount Return number of partition info related to + Service guid when PartDesc == NULL. + Otherwise return number of partition info + copied in ParcDesc + @param [out] PartDesc Partition information Buffer + + @retval EFI_SUCCESS + @retval EFI_UNSUPPORTED + @retval EFI_INVALID_PARAMETER + @retval Other Error + +**/ +EFI_STATUS +EFIAPI +ArmFfaLibGetPartitionInfo ( + IN EFI_GUID *ServiceGuid, + OUT EFI_FFA_PART_INFO_DESC *PartDesc + ) +{ + EFI_STATUS Status; + VOID *TxBuffer; + UINT64 TxBufferSize; + VOID *RxBuffer; + UINT64 RxBufferSize; + UINT32 Count; + UINT32 Size; + + if (PartDesc == NULL) { + return EFI_INVALID_PARAMETER; + } + + Count = 1; + + Status = ArmFfaLibPartitionInfoGetRegs (ServiceGuid, &Count, PartDesc); + if (!EFI_ERROR (Status)) { + return EFI_SUCCESS; + } + + Status = ArmFfaLibGetRxTxBuffers ( + &TxBuffer, + &TxBufferSize, + &RxBuffer, + &RxBufferSize + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to get Rx/Tx Buffer. Status: %r\n", + __func__, + Status + )); + return Status; + } + + Status = ArmFfaLibPartitionInfoGet ( + ServiceGuid, + FFA_PART_INFO_FLAG_TYPE_DESC, + &Count, + &Size + ); + if (EFI_ERROR (Status)) { + return Status; + } + + if ((Size < sizeof (EFI_FFA_PART_INFO_DESC))) { + ArmFfaLibRxRelease (gPartId); + return EFI_INVALID_PARAMETER; + } + + CopyMem (PartDesc, RxBuffer, sizeof (EFI_FFA_PART_INFO_DESC)); + ArmFfaLibRxRelease (gPartId); + + return EFI_SUCCESS; +} + /** Get first Rx/Tx Buffer allocation hob. If UseGuid is TRUE, BufferAddr and BufferSize parameters are ignored. diff --git a/MdePkg/Include/Library/ArmFfaLib.h b/MdePkg/Include/Library/ArmFfaLib.h index 0c780038d93a..10611e27117c 100644 --- a/MdePkg/Include/Library/ArmFfaLib.h +++ b/MdePkg/Include/Library/ArmFfaLib.h @@ -401,4 +401,28 @@ ArmFfaLibMsgSendDirectReq2 ( IN OUT DIRECT_MSG_ARGS *ImpDefArgs ); +/** + Helper to retrieve the first partition information associated with + a service GUID via registers. + + @param [in] ServiceGuid Service guid. + @param [in, out] PartDescCount Return number of partition info related to + Service guid when PartDesc == NULL. + Otherwise return number of partition info + copied in ParcDesc + @param [out] PartDesc Partition information Buffer + + @retval EFI_SUCCESS + @retval EFI_UNSUPPORTED + @retval EFI_INVALID_PARAMETER + @retval Other Error + +**/ +EFI_STATUS +EFIAPI +ArmFfaLibGetPartitionInfo ( + IN EFI_GUID *ServiceGuid, + OUT EFI_FFA_PART_INFO_DESC *PartDesc + ); + #endif // ARM_FFA_LIB_H_ From 8955d8db328686a0224c882cd3b45114439f62b6 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Sun, 12 Oct 2025 22:03:26 +0100 Subject: [PATCH 1000/1172] ArmPkg/Driver: use ArmFfaGetPartitionInfo() in Mmcommunication Use ArmFfaGetPartitionInfo() to get partition information. This simplifies the code to get partition information. Signed-off-by: Yeoreum Yun --- .../MmCommunicationDxe/MmCommunication.c | 56 +++---------------- .../MmCommunicationPei/MmCommunicationPei.c | 50 ++--------------- 2 files changed, 12 insertions(+), 94 deletions(-) diff --git a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c index 2777d9d47736..edbd29409545 100644 --- a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c +++ b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c @@ -547,13 +547,7 @@ InitializeFfaCommunication ( ) { EFI_STATUS Status; - VOID *TxBuffer; - UINT64 TxBufferSize; - VOID *RxBuffer; - UINT64 RxBufferSize; - EFI_FFA_PART_INFO_DESC *StmmPartInfo; - UINT32 Count; - UINT32 Size; + EFI_FFA_PART_INFO_DESC StmmPartInfo; Status = ArmFfaLibPartitionIdGet (&mPartId); if (EFI_ERROR (Status)) { @@ -565,62 +559,26 @@ InitializeFfaCommunication ( return Status; } - Status = ArmFfaLibGetRxTxBuffers ( - &TxBuffer, - &TxBufferSize, - &RxBuffer, - &RxBufferSize - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "Failed to get Rx/Tx Buffer. Status: %r\n", - Status - )); - return Status; - } - - Status = ArmFfaLibPartitionInfoGet ( - &gEfiMmCommunication2ProtocolGuid, - FFA_PART_INFO_FLAG_TYPE_DESC, - &Count, - &Size - ); + Status = ArmFfaLibGetPartitionInfo (&gEfiMmCommunication2ProtocolGuid, &StmmPartInfo); if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, - "Failed to get Stmm(%g) partition Info. Status: %r\n", + "Failed to get partition Info(%g). Status: %r\n", &gEfiMmCommunication2ProtocolGuid, Status )); return Status; } - if ((Count != 1) || (Size < sizeof (EFI_FFA_PART_INFO_DESC))) { - Status = EFI_INVALID_PARAMETER; - DEBUG (( - DEBUG_ERROR, - "Invalid partition Info(%g). Count: %d, Size: %d\n", - &gEfiMmCommunication2ProtocolGuid, - Count, - Size - )); - goto ErrorHandler; - } - - StmmPartInfo = (EFI_FFA_PART_INFO_DESC *)RxBuffer; - - if ((StmmPartInfo->PartitionProps & FFA_PART_PROP_RECV_DIRECT_REQ) == 0x00) { + if ((StmmPartInfo.PartitionProps & FFA_PART_PROP_RECV_DIRECT_REQ) == 0x00) { Status = EFI_UNSUPPORTED; DEBUG ((DEBUG_ERROR, "StandaloneMm doesn't receive DIRECT_MSG_REQ...\n")); - goto ErrorHandler; + return Status; } - mStMmPartId = StmmPartInfo->PartitionId; + mStMmPartId = StmmPartInfo.PartitionId; -ErrorHandler: - ArmFfaLibRxRelease (mPartId); - return Status; + return EFI_SUCCESS; } /** diff --git a/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c b/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c index e240b7683cb0..3f64fb3419ca 100644 --- a/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c +++ b/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c @@ -142,13 +142,7 @@ InitializeFfaCommunication ( ) { EFI_STATUS Status; - VOID *TxBuffer; - UINT64 TxBufferSize; - VOID *RxBuffer; - UINT64 RxBufferSize; - EFI_FFA_PART_INFO_DESC *StmmPartInfo; - UINT32 Count; - UINT32 Size; + EFI_FFA_PART_INFO_DESC StmmPartInfo; Status = ArmFfaLibPartitionIdGet (&mPartId); if (EFI_ERROR (Status)) { @@ -160,58 +154,24 @@ InitializeFfaCommunication ( return Status; } - Status = ArmFfaLibGetRxTxBuffers ( - &TxBuffer, - &TxBufferSize, - &RxBuffer, - &RxBufferSize - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "Failed to get Rx/Tx Buffer. Status: %r\n", - Status - )); - return Status; - } - - Status = ArmFfaLibPartitionInfoGet ( - &gEfiMmCommunication2ProtocolGuid, - FFA_PART_INFO_FLAG_TYPE_DESC, - &Count, - &Size - ); + Status = ArmFfaLibGetPartitionInfo (&gEfiMmCommunication2ProtocolGuid, &StmmPartInfo); if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, - "Failed to get Stmm(%g) partition Info. Status: %r\n", + "Failed to get partition Info(%g). Status: %r\n", &gEfiMmCommunication2ProtocolGuid, Status )); return Status; } - if ((Count != 1) || (Size < sizeof (EFI_FFA_PART_INFO_DESC))) { - Status = EFI_INVALID_PARAMETER; - DEBUG (( - DEBUG_ERROR, - "Invalid partition Info(%g). Count: %d, Size: %d\n", - &gEfiMmCommunication2ProtocolGuid, - Count, - Size - )); - goto ErrorHandler; - } - - StmmPartInfo = (EFI_FFA_PART_INFO_DESC *)RxBuffer; - - if ((StmmPartInfo->PartitionProps & FFA_PART_PROP_RECV_DIRECT_REQ) == 0x00) { + if ((StmmPartInfo.PartitionProps & FFA_PART_PROP_RECV_DIRECT_REQ) == 0x00) { Status = EFI_UNSUPPORTED; DEBUG ((DEBUG_ERROR, "StandaloneMm doesn't receive DIRECT_MSG_REQ...\n")); goto ErrorHandler; } - mStMmPartId = StmmPartInfo->PartitionId; + mStMmPartId = StmmPartInfo.PartitionId; ErrorHandler: ArmFfaLibRxRelease (mPartId); From b80000847abbefe5c263d35e515c3acc11a96059 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Sun, 12 Oct 2025 22:04:03 +0100 Subject: [PATCH 1001/1172] SecurityPkg/Library: use ArmFfaGetPartitionInfo() in Tpm2ServiceFfaLib Use ArmFfaGetPartitionInfo() in Tpm2ServiceFfaLib. This simplifies the code line to get partition information. Signed-off-by: Yeoreum Yun --- .../Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c | 66 ++++--------------- 1 file changed, 11 insertions(+), 55 deletions(-) diff --git a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c index d6ece59f547d..7dd1fb594f16 100644 --- a/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c +++ b/SecurityPkg/Library/Tpm2DeviceLibFfa/Tpm2ServiceFfaRaw.c @@ -101,71 +101,27 @@ FfaTpm2GetServicePartitionId ( ) { EFI_STATUS Status; - UINT32 Count; - UINT32 Size; - EFI_FFA_PART_INFO_DESC *TpmPartInfo; - VOID *TxBuffer; - UINT64 TxBufferSize; - VOID *RxBuffer; - UINT64 RxBufferSize; - UINT16 PartId; + EFI_FFA_PART_INFO_DESC TpmPartInfo; if (PartitionId == NULL) { - Status = EFI_INVALID_PARAMETER; - goto Exit; - } - - Status = ArmFfaLibPartitionIdGet (&PartId); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "Failed to get partition id. Status: %r\n", - Status - )); - goto Exit; + return EFI_INVALID_PARAMETER; } - Status = ArmFfaLibGetRxTxBuffers ( - &TxBuffer, - &TxBufferSize, - &RxBuffer, - &RxBufferSize - ); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "Failed to get Rx/Tx Buffer. Status: %r\n", Status)); - goto Exit; - } - - Status = ArmFfaLibPartitionInfoGet ( - &gTpm2ServiceFfaGuid, - FFA_PART_INFO_FLAG_TYPE_DESC, - &Count, - &Size - ); + Status = ArmFfaLibGetPartitionInfo (&gTpm2ServiceFfaGuid, &TpmPartInfo); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "Failed to get Tpm2 partition info. Status: %r\n", Status)); - goto RxRelease; + return Status; } - if ((Count != 1) || (Size < sizeof (EFI_FFA_PART_INFO_DESC))) { - Status = EFI_INVALID_PARAMETER; - DEBUG ((DEBUG_ERROR, "Invalid partition Info(%g). Count: %d, Size: %d\n", &gTpm2ServiceFfaGuid, Count, Size)); - } else { - TpmPartInfo = (EFI_FFA_PART_INFO_DESC *)RxBuffer; - *PartitionId = TpmPartInfo->PartitionId; - if (TpmPartInfo->PartitionId == TPM2_FFA_PARTITION_ID_INVALID) { - /* - * Tpm partition id never be TPM2_FFA_PARTITION_ID_INVALID. - */ - Status = EFI_DEVICE_ERROR; - } + *PartitionId = TpmPartInfo.PartitionId; + if (TpmPartInfo.PartitionId == TPM2_FFA_PARTITION_ID_INVALID) { + /* + * Tpm partition id never be TPM2_FFA_PARTITION_ID_INVALID. + */ + return EFI_DEVICE_ERROR; } -RxRelease: - ArmFfaLibRxRelease (PartId); - -Exit: - return Status; + return EFI_SUCCESS; } /** From 96ad9bd397ca721a78fd0d41021f4621c4a04082 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Sun, 12 Oct 2025 22:04:22 +0100 Subject: [PATCH 1002/1172] SecurityPkg/Tcg2Config: use ArmFfaGetPartitionInfo() in Tcg2ConfigFfaPeim Use ArmFfaGetPartitionInfo() in Tcg2ConfigFfaPeim. This simplifies the code line to get partition information. Signed-off-by: Yeoreum Yun --- .../Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c | 43 ++----------------- 1 file changed, 3 insertions(+), 40 deletions(-) diff --git a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c index 73a0f9a94416..80df9db70000 100644 --- a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c +++ b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigFfaPeim.c @@ -115,14 +115,8 @@ Tcg2ConfigFfaPeimEntryPoint ( { EFI_STATUS Status; UINTN Size; - UINT16 PartId; UINT16 TpmPartId; - EFI_FFA_PART_INFO_DESC *TpmPartInfo; - VOID *TxBuffer; - UINT64 TxBufferSize; - VOID *RxBuffer; - UINT64 RxBufferSize; - UINT32 Count; + EFI_FFA_PART_INFO_DESC TpmPartInfo; CONST EFI_PEI_PPI_DESCRIPTOR *PpiList; GUID *TpmInstanceGuid; @@ -131,44 +125,13 @@ Tcg2ConfigFfaPeimEntryPoint ( TpmInstanceGuid = &gEfiTpmDeviceInstanceNoneGuid; PpiList = &mTpmInitializationDonePpiList; - Status = ArmFfaLibPartitionIdGet (&PartId); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "Failed to get partition-id. Status: %r\n", Status)); - goto Cleanup; - } - - Status = ArmFfaLibGetRxTxBuffers ( - &TxBuffer, - &TxBufferSize, - &RxBuffer, - &RxBufferSize - ); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "Failed to get Rx/Tx Buffer. Status: %r\n", Status)); - goto Cleanup; - } - - Status = ArmFfaLibPartitionInfoGet ( - &gTpm2ServiceFfaGuid, - FFA_PART_INFO_FLAG_TYPE_DESC, - &Count, - (UINT32 *)&Size - ); + Status = ArmFfaLibGetPartitionInfo (&gTpm2ServiceFfaGuid, &TpmPartInfo); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "Failed to get Tpm2 partition info. Status: %r\n", Status)); goto Cleanup; } - if ((Count != 1) || (Size < sizeof (EFI_FFA_PART_INFO_DESC))) { - Status = EFI_INVALID_PARAMETER; - DEBUG ((DEBUG_ERROR, "Invalid partition Info(%g). Count: %d, Size: %d\n", &gTpm2ServiceFfaGuid, Count, Size)); - ArmFfaLibRxRelease (PartId); - goto Cleanup; - } - - TpmPartInfo = (EFI_FFA_PART_INFO_DESC *)RxBuffer; - TpmPartId = TpmPartInfo->PartitionId; - ArmFfaLibRxRelease (PartId); + TpmPartId = TpmPartInfo.PartitionId; Status = Tpm2FfaCheckInterfaceVersion (TpmPartId); if (EFI_ERROR (Status)) { From 800a46db98e6973348b804e6c85b7dbc972f7990 Mon Sep 17 00:00:00 2001 From: Qihang Gao Date: Mon, 29 Dec 2025 17:57:50 +0800 Subject: [PATCH 1003/1172] RedfishPkg: Add LOONGARCH64 as supported architecture Add LOONGARCH64 as supported architecture in RedfishPkg. Signed-off-by: Qihang Gao --- RedfishPkg/Include/Library/RedfishCrtLib.h | 2 +- RedfishPkg/RedfishPkg.dsc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/RedfishPkg/Include/Library/RedfishCrtLib.h b/RedfishPkg/Include/Library/RedfishCrtLib.h index 7a706e68f542..1e18b978fc9f 100644 --- a/RedfishPkg/Include/Library/RedfishCrtLib.h +++ b/RedfishPkg/Include/Library/RedfishCrtLib.h @@ -27,7 +27,7 @@ // We dont support double on edk2 #define HUGE_VAL 0 -#if defined (MDE_CPU_X64) || defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) +#if defined (MDE_CPU_X64) || defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64) // // With GCC we would normally use SIXTY_FOUR_BIT_LONG, but MSVC needs // SIXTY_FOUR_BIT, because 'long' is 32-bit and only 'long long' is diff --git a/RedfishPkg/RedfishPkg.dsc b/RedfishPkg/RedfishPkg.dsc index 5412cc23f2de..fd7ac6525a3c 100644 --- a/RedfishPkg/RedfishPkg.dsc +++ b/RedfishPkg/RedfishPkg.dsc @@ -16,7 +16,7 @@ PLATFORM_VERSION = 1.0 DSC_SPECIFICATION = 0x0001001c OUTPUT_DIRECTORY = Build/RedfishPkg - SUPPORTED_ARCHITECTURES = IA32|X64|AARCH64|RISCV64 + SUPPORTED_ARCHITECTURES = IA32|X64|AARCH64|RISCV64|LOONGARCH64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT From a9d076d7d04e10c0ca397d4ca13a90e53a60bf94 Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Sun, 30 Nov 2025 05:20:16 +0000 Subject: [PATCH 1004/1172] BaseTools/PatchCheck.py: Disallow commit subject lines that end with period Signed-off-by: Mike Beaton --- BaseTools/Scripts/PatchCheck.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BaseTools/Scripts/PatchCheck.py b/BaseTools/Scripts/PatchCheck.py index 0094794de295..60eee34c3403 100755 --- a/BaseTools/Scripts/PatchCheck.py +++ b/BaseTools/Scripts/PatchCheck.py @@ -224,6 +224,9 @@ def check_subject(self, updated_packages): elif num_found != len(updated_packages): self.error("Subject line not in \"package,package: description\" format!") + if self.subject.endswith('.'): + self.error("Subject line should not end with a period") + def check_signed_off_by(self): sob='Signed-off-by' if self.msg.find(sob) < 0: From f25d437f265f4f29b82665964bc9d286b6ae6146 Mon Sep 17 00:00:00 2001 From: "levi.yun" Date: Tue, 23 Dec 2025 12:20:03 +0000 Subject: [PATCH 1005/1172] DynamicTablesPkg: fix typo SmbiosSmcLib Fix typo SmbiosSmcLib in DynamicTablePkg.dec. Signed-off-by: Yeoreum Yun --- DynamicTablesPkg/DynamicTablesPkg.dec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DynamicTablesPkg/DynamicTablesPkg.dec b/DynamicTablesPkg/DynamicTablesPkg.dec index 4ed8e834ca2b..3aae6e92a29b 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.dec +++ b/DynamicTablesPkg/DynamicTablesPkg.dec @@ -56,7 +56,7 @@ Tpm2DeviceTableLib|Include/Library/Tpm2DeviceTableLib.h ## @libraryclass Defines a set of SMBIOS related SMC helper methods. - SmcbiosSmbLib|Include/Library/SmbiosSmcLib.h + SmbiosSmcLib|Include/Library/SmbiosSmcLib.h [LibraryClasses.AARCH64] ## @libraryclass Defines a set of APIs to populate CmObj using SCMI. From 6696ff97b5bfb3ae2fbb5656f5f7e292b4785809 Mon Sep 17 00:00:00 2001 From: Chao Li Date: Fri, 9 Jan 2026 09:42:10 +0800 Subject: [PATCH 1006/1172] MdePkg: Add LoongArch64 instance in BaseRngLib LoongArch64 currently dose not support HW or a standards-compliant RNG. Read the stable time twice performs an XOR, and then use xorshift algorithm(from Marsaglia's xorshift generator) to generate a pseudo-random number. It's not random enough, but it's definitely better than just using a timer(BaseRngLibTimerLib). Signed-off-by: Chao Li Cc: Michael D Kinney Cc: Liming Gao --- MdePkg/Library/BaseRngLib/BaseRngLib.inf | 6 +- .../Library/BaseRngLib/LoongArch64/AsmRdRng.S | 105 ++++++++++++ MdePkg/Library/BaseRngLib/LoongArch64/Rng.c | 153 ++++++++++++++++++ 3 files changed, 263 insertions(+), 1 deletion(-) create mode 100644 MdePkg/Library/BaseRngLib/LoongArch64/AsmRdRng.S create mode 100644 MdePkg/Library/BaseRngLib/LoongArch64/Rng.c diff --git a/MdePkg/Library/BaseRngLib/BaseRngLib.inf b/MdePkg/Library/BaseRngLib/BaseRngLib.inf index 53833a76b211..268e89bfd099 100644 --- a/MdePkg/Library/BaseRngLib/BaseRngLib.inf +++ b/MdePkg/Library/BaseRngLib/BaseRngLib.inf @@ -24,7 +24,7 @@ CONSTRUCTOR = BaseRngLibConstructor # -# VALID_ARCHITECTURES = IA32 X64 AARCH64 +# VALID_ARCHITECTURES = IA32 X64 AARCH64 LOONGARCH64 # [Sources] @@ -42,6 +42,10 @@ AArch64/ArmRng.asm | MSFT +[Sources.LOONGARCH64] + LoongArch64/Rng.c + LoongArch64/AsmRdRng.S | GCC + [Guids.AARCH64] gEfiRngAlgorithmArmRndr diff --git a/MdePkg/Library/BaseRngLib/LoongArch64/AsmRdRng.S b/MdePkg/Library/BaseRngLib/LoongArch64/AsmRdRng.S new file mode 100644 index 000000000000..247865f3f2a9 --- /dev/null +++ b/MdePkg/Library/BaseRngLib/LoongArch64/AsmRdRng.S @@ -0,0 +1,105 @@ +#------------------------------------------------------------------------------ +# +# Read RNG for LoongArch64 +# +# Copyright (c) 2026, Loongson Technology Corporation Limited. All rights reserved.
    +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +#------------------------------------------------------------------------------ + +ASM_GLOBAL ASM_PFX(AsmRdRng16) +ASM_GLOBAL ASM_PFX(AsmRdRng32) +ASM_GLOBAL ASM_PFX(AsmRdRng64) + +#/** +# Readed timer register and XOR, mixed the high and low bits, +# then use the xorshift64 algorithm to generate a 64-bit +# pseudo-random number. +#**/ +ASM_PFX(AsmRdTimerRng64): + rdtime.d $t0, $zero + rdtimeh.w $t1, $zero + xor $t0, $t0, $t1 + + // + // Mix low 32-bit to high 32-bit + // + slli.d $t1, $t0, 32 + xor $t0, $t0, $t1 + + // + // A xorshift64 step is applied to decorrelate timer bits. + // The shft constants (13, 7, 17) are taken from Marsaglia's + // xorshift generator and provide a maximal-period 64-bit + // linear PRNG suitable for non-cryptographic use. + // + slli.d $t1, $t0, 13 + xor $t0, $t0, $t1 + srli.d $t1, $t0, 7 + xor $t0, $t0, $t1 + slli.d $t1, $t0, 17 + xor $a0, $t0, $t1 + + jirl $zero, $ra, 0 + +#/** +# Generates a 16-bit random number. +#**/ +ASM_PFX(AsmRdRng16): + addi.d $sp, $sp, -16 + st.d $s0, $sp, 0 + st.d $ra, $sp, 8 + + move $s0, $a0 + bl AsmRdTimerRng64 + st.h $a0, $s0, 0 + + ld.d $ra, $sp, 8 + ld.d $s0, $sp, 0 + addi.d $sp, $sp, 16 + + li.d $a0, 1 + + jirl $zero, $ra, 0 + +#/** +# Generates a 32-bit random number. +#**/ +ASM_PFX(AsmRdRng32): + addi.d $sp, $sp, -16 + st.d $s0, $sp, 0 + st.d $ra, $sp, 8 + + move $s0, $a0 + bl AsmRdTimerRng64 + st.w $a0, $s0, 0 + + ld.d $ra, $sp, 8 + ld.d $s0, $sp, 0 + addi.d $sp, $sp, 16 + + li.d $a0, 1 + + jirl $zero, $ra, 0 + +#/** +# Generates a 64-bit random number. +#**/ +ASM_PFX(AsmRdRng64): + addi.d $sp, $sp, -16 + st.d $s0, $sp, 0 + st.d $ra, $sp, 8 + + move $s0, $a0 + bl AsmRdTimerRng64 + st.d $a0, $s0, 0 + + ld.d $ra, $sp, 8 + ld.d $s0, $sp, 0 + addi.d $sp, $sp, 16 + + li.d $a0, 1 + + jirl $zero, $ra, 0 +.end diff --git a/MdePkg/Library/BaseRngLib/LoongArch64/Rng.c b/MdePkg/Library/BaseRngLib/LoongArch64/Rng.c new file mode 100644 index 000000000000..f63354bb1a41 --- /dev/null +++ b/MdePkg/Library/BaseRngLib/LoongArch64/Rng.c @@ -0,0 +1,153 @@ +/** @file + Random number generator services. + +Copyright (c) 2026, Loongson Technology Corporation Limited. All rights reserved.
    +Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.
    +Copyright (c) 2023, Arm Limited. All rights reserved.
    +Copyright (c) 2022, Pedro Falcato. All rights reserved.
    +Copyright (c) 2021, NUVIA Inc. All rights reserved.
    +Copyright (c) 2015, Intel Corporation. All rights reserved.
    + +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include + +#include "BaseRngLibInternals.h" + +BOOLEAN +EFIAPI +AsmRdRng16 ( + OUT UINT16 * + ); + +BOOLEAN +EFIAPI +AsmRdRng32 ( + OUT UINT32 * + ); + +BOOLEAN +EFIAPI +AsmRdRng64 ( + OUT UINT64 * + ); + +/** + The constructor function checks whether or not RNG functions is supported + by the host hardware. + + It will always return EFI_SUCCESS because LoongArch64 currently uses the + `rdtime` instruction. + + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +BaseRngLibConstructor ( + VOID + ) +{ + return EFI_SUCCESS; +} + +/** + Generates a 16-bit random number. + + @param[out] Rand Buffer pointer to store the 16-bit random value. + + @retval TRUE Random number generated successfully. + @retval FALSE Failed to generate the random number. + +**/ +BOOLEAN +EFIAPI +ArchGetRandomNumber16 ( + OUT UINT16 *Rand + ) +{ + return AsmRdRng16 (Rand); +} + +/** + Generates a 32-bit random number. + + @param[out] Rand Buffer pointer to store the 32-bit random value. + + @retval TRUE Random number generated successfully. + @retval FALSE Failed to generate the random number. + +**/ +BOOLEAN +EFIAPI +ArchGetRandomNumber32 ( + OUT UINT32 *Rand + ) +{ + return AsmRdRng32 (Rand); +} + +/** + Generates a 64-bit random number. + + @param[out] Rand Buffer pointer to store the 64-bit random value. + + @retval TRUE Random number generated successfully. + @retval FALSE Failed to generate the random number. + +**/ +BOOLEAN +EFIAPI +ArchGetRandomNumber64 ( + OUT UINT64 *Rand + ) +{ + return AsmRdRng64 (Rand); +} + +/** + Checks whether RNG is supported. + + Currently, LoongArch64 RNG uses the `rdtime` instruction, so it is + always supported. + + @retval TRUE RDRAND is supported. + @retval FALSE RDRAND is not supported. + +**/ +BOOLEAN +EFIAPI +ArchIsRngSupported ( + VOID + ) +{ + return TRUE; +} + +/** + Get a GUID identifying the RNG algorithm implementation. + + LoongArch64 currently does not supported the HW or standards-compliant + RNG. Therefore only BaseRngLib is implemented as a best-effort entropy + source, and no EFI_RNG_PROTOCOL or algorithm GUID is exposed. + + @param [out] RngGuid If success, contains the GUID identifying + the RNG algorithm implementation. + + @retval EFI_SUCCESS Success. + @retval EFI_UNSUPPORTED Not supported. + @retval EFI_INVALID_PARAMETER Invalid parameter. +**/ +EFI_STATUS +EFIAPI +GetRngGuid ( + GUID *RngGuid + ) +{ + return EFI_UNSUPPORTED; +} From 1588d5b9f0112a448ff76e80a872e35c1628176e Mon Sep 17 00:00:00 2001 From: Chao Li Date: Thu, 8 Jan 2026 19:45:04 +0800 Subject: [PATCH 1007/1172] MdePkg: Enable BaseRngLib for LoongArch64 The BaseRngLib has been supported LoongArch64, enable it in MdePkg.dsc now. Signed-off-by: Chao Li Cc: Michael D Kinney Cc: Liming Gao --- MdePkg/MdePkg.dsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc index eb13d67e0096..abe999c234a5 100644 --- a/MdePkg/MdePkg.dsc +++ b/MdePkg/MdePkg.dsc @@ -159,7 +159,7 @@ MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibSmm.inf MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibUefiShell.inf -[Components.IA32, Components.X64, Components.AARCH64] +[Components.IA32, Components.X64, Components.AARCH64, Components.LOONGARCH64] MdePkg/Library/BaseRngLib/BaseRngLib.inf [Components.IA32, Components.X64] From ce61d5f327d54f34e3937ffe0c75efefdd5d9195 Mon Sep 17 00:00:00 2001 From: Joey Vagedes Date: Thu, 18 Dec 2025 22:22:06 +0000 Subject: [PATCH 1008/1172] MdeModulePkg: DxeReportStatusCodeLib: Do not query protocol This commit stops the library from querying the protocol database for the status code protocol at the time of library function use. This logic can result in a TPL inversion if the protocol has not yet been cached and the caller is calling the library function when the TPL is higher then TPL_NOTIFY. Instead, the protocol is now located during the constructor of the library. If the protocol is not found, then an on-protocol install event is registered which will cache the protocol. A destructor is also added to close the event in the scenario that the driver is unloaded before the protocol is installed. Signed-off-by: Joey Vagedes --- .../DxeReportStatusCodeLib.inf | 2 + .../ReportStatusCodeLib.c | 105 +++++++++++++++++- 2 files changed, 105 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf b/MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf index 620763a737d1..0b56099326df 100644 --- a/MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf +++ b/MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf @@ -18,6 +18,8 @@ MODULE_TYPE = DXE_DRIVER VERSION_STRING = 1.0 LIBRARY_CLASS = ReportStatusCodeLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER SMM_CORE + CONSTRUCTOR = ReportStatusCodeLibConstructor + DESTRUCTOR = ReportStatusCodeLibDestructor # # The following information is for reference only and not required by the build tools. diff --git a/MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c b/MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c index da254b755fa6..af3e7f81d4b6 100644 --- a/MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c +++ b/MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c @@ -2,6 +2,7 @@ Report Status Code Library for DXE Phase. Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
    + Copyright (c) Microsoft Corporation. SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -20,6 +21,7 @@ #include EFI_STATUS_CODE_PROTOCOL *mReportStatusCodeLibStatusCodeProtocol = NULL; +EFI_EVENT mOnStatusCodeProtocolInstallEvent; /** Locate the report status code service. @@ -86,9 +88,8 @@ InternalReportStatusCode ( (ReportDebugCodeEnabled () && (((Type) & EFI_STATUS_CODE_TYPE_MASK) == EFI_DEBUG_CODE))) { // - // If mReportStatusCodeLibStatusCodeProtocol is NULL, then check if Report Status Code Protocol is available in system. + // If mReportStatusCodeLibStatusCodeProtocol is NULL, the protocol has not yet been registered. Return immediately. // - InternalGetReportStatusCode (); if (mReportStatusCodeLibStatusCodeProtocol == NULL) { return EFI_UNSUPPORTED; } @@ -611,3 +612,103 @@ ReportDebugCodeEnabled ( { return (BOOLEAN)((PcdGet8 (PcdReportStatusCodePropertyMask) & REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED) != 0); } + +/** + Notification function called when the Status Code Runtime protocol is installed. Locates and caches the protocol. + + @param Event Not Used. + @param Context Not Used. + + @retval none + **/ +VOID +EFIAPI +OnStatusCodeRuntimeProtocolInstalledNotification ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + InternalGetReportStatusCode (); + + if (mReportStatusCodeLibStatusCodeProtocol != NULL) { + gBS->CloseEvent (mOnStatusCodeProtocolInstallEvent); + } +} + +/** + The constructor attempts to locate and cache StatusCode Protocol. If not found, it will + register a notify event triggered + + @param ImageHandle The firmware allocated handle for the EFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +ReportStatusCodeLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + VOID *Registration; + + InternalGetReportStatusCode (); + + // + // Register for protocol installation notification if the protocol is not found + // + if ((mReportStatusCodeLibStatusCodeProtocol == NULL) && (gBS != NULL)) { + // + // Create the event + // + Status = gBS->CreateEvent ( + EVT_NOTIFY_SIGNAL, + TPL_CALLBACK, + OnStatusCodeRuntimeProtocolInstalledNotification, + NULL, + &mOnStatusCodeProtocolInstallEvent + ); + ASSERT_EFI_ERROR (Status); + + // + // Register for protocol notifications on this event + // + Status = gBS->RegisterProtocolNotify ( + &gEfiStatusCodeRuntimeProtocolGuid, + mOnStatusCodeProtocolInstallEvent, + &Registration + ); + ASSERT_EFI_ERROR (Status); + } + + return EFI_SUCCESS; +} + +/** + Closes the protocol notification event, if still open, when the library is unloaded. + + @param ImageHandle The firmware allocated handle for the EFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +ReportStatusCodeLibDestructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + if (mReportStatusCodeLibStatusCodeProtocol == NULL) { + Status = gBS->CloseEvent (mOnStatusCodeProtocolInstallEvent); + ASSERT_EFI_ERROR (Status); + } + + return EFI_SUCCESS; +} From 3fe8cad23cede8e3c0d82a8ddb275427dcaccbef Mon Sep 17 00:00:00 2001 From: Joey Vagedes Date: Thu, 18 Dec 2025 22:48:10 +0000 Subject: [PATCH 1009/1172] MdeModulePkg: RuntimeDxeReportStatusCodeLib: Do not query protocol This commit stops the library from querying the protocol database for the status code protocol at the time of library function use. This logic can result in a TPL inversion if the protocol has not yet been cached and the caller is calling the library function when the TPL is higher then TPL_NOTIFY. Instead, the protocol is now located during the constructor of the library. If the protocol is not found, then an on-protocol install event is registered which will cache the protocol. A destructor is also added to close the event in the scenario that the driver is unloaded before the protocol is installed. Signed-off-by: Joey Vagedes --- .../ReportStatusCodeLib.c | 14 ++--- .../ReportStatusCodeLib.c | 61 ++++++++++++++++++- 2 files changed, 66 insertions(+), 9 deletions(-) diff --git a/MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c b/MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c index af3e7f81d4b6..04221a92edb5 100644 --- a/MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c +++ b/MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c @@ -616,10 +616,10 @@ ReportDebugCodeEnabled ( /** Notification function called when the Status Code Runtime protocol is installed. Locates and caches the protocol. - @param Event Not Used. - @param Context Not Used. + @param[in] Event Not Used. + @param[in] Context Not Used. - @retval none + @retval none **/ VOID EFIAPI @@ -639,8 +639,8 @@ OnStatusCodeRuntimeProtocolInstalledNotification ( The constructor attempts to locate and cache StatusCode Protocol. If not found, it will register a notify event triggered - @param ImageHandle The firmware allocated handle for the EFI image. - @param SystemTable A pointer to the EFI System Table. + @param[in] ImageHandle The firmware allocated handle for the EFI image. + @param[in] SystemTable A pointer to the EFI System Table. @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. @@ -690,8 +690,8 @@ ReportStatusCodeLibConstructor ( /** Closes the protocol notification event, if still open, when the library is unloaded. - @param ImageHandle The firmware allocated handle for the EFI image. - @param SystemTable A pointer to the EFI System Table. + @param[in] ImageHandle The firmware allocated handle for the EFI image. + @param[in] SystemTable A pointer to the EFI System Table. @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. diff --git a/MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/ReportStatusCodeLib.c b/MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/ReportStatusCodeLib.c index 8fd20ff239f2..218031aa7e88 100644 --- a/MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/ReportStatusCodeLib.c +++ b/MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/ReportStatusCodeLib.c @@ -2,6 +2,7 @@ API implementation for instance of Report Status Code Library. Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
    + Copyright (c) Microsoft Corporation. SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -22,6 +23,7 @@ #include EFI_STATUS_CODE_PROTOCOL *mReportStatusCodeLibStatusCodeProtocol = NULL; +EFI_EVENT mOnStatusCodeProtocolInstallEvent; EFI_EVENT mReportStatusCodeLibVirtualAddressChangeEvent; EFI_EVENT mReportStatusCodeLibExitBootServicesEvent; BOOLEAN mHaveExitedBootServices = FALSE; @@ -58,6 +60,28 @@ InternalGetReportStatusCode ( } } +/** + Notification function called when the Status Code Runtime protocol is installed. Locates and caches the protocol. + + @param[in] Event Not Used. + @param[in] Context Not Used. + + @retval none + **/ +VOID +EFIAPI +OnStatusCodeRuntimeProtocolInstalledNotification ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + InternalGetReportStatusCode (); + + if (mReportStatusCodeLibStatusCodeProtocol != NULL) { + gBS->CloseEvent (mOnStatusCodeProtocolInstallEvent); + } +} + /** Notification function of EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE. @@ -121,12 +145,40 @@ ReportStatusCodeLibConstructor ( ) { EFI_STATUS Status; + VOID *Registration; // // Cache the report status code service // InternalGetReportStatusCode (); + // + // Register for protocol installation notification if the protocol is not found + // + if (mReportStatusCodeLibStatusCodeProtocol == NULL) { + // + // Create the event + // + Status = gBS->CreateEvent ( + EVT_NOTIFY_SIGNAL, + TPL_CALLBACK, + OnStatusCodeRuntimeProtocolInstalledNotification, + NULL, + &mOnStatusCodeProtocolInstallEvent + ); + ASSERT_EFI_ERROR (Status); + + // + // Register for protocol notifications on this event + // + Status = gBS->RegisterProtocolNotify ( + &gEfiStatusCodeRuntimeProtocolGuid, + mOnStatusCodeProtocolInstallEvent, + &Registration + ); + ASSERT_EFI_ERROR (Status); + } + // // Register notify function for EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE // @@ -178,6 +230,12 @@ ReportStatusCodeLibDestructor ( EFI_STATUS Status; ASSERT (gBS != NULL); + + if (mReportStatusCodeLibStatusCodeProtocol == NULL) { + Status = gBS->CloseEvent (mOnStatusCodeProtocolInstallEvent); + ASSERT_EFI_ERROR (Status); + } + Status = gBS->CloseEvent (mReportStatusCodeLibVirtualAddressChangeEvent); ASSERT_EFI_ERROR (Status); @@ -224,9 +282,8 @@ InternalReportStatusCode ( (ReportDebugCodeEnabled () && (((Type) & EFI_STATUS_CODE_TYPE_MASK) == EFI_DEBUG_CODE))) { // - // If mReportStatusCodeLibStatusCodeProtocol is NULL, then check if Report Status Code Protocol is available in system. + // If mReportStatusCodeLibStatusCodeProtocol is NULL, the protocol has not yet been registered. Return immediately. // - InternalGetReportStatusCode (); if (mReportStatusCodeLibStatusCodeProtocol == NULL) { return EFI_UNSUPPORTED; } From 0ab766c6b6ef76d6f4278c6ce7c0ca7cf446a641 Mon Sep 17 00:00:00 2001 From: Joey Vagedes Date: Mon, 29 Dec 2025 21:28:41 +0000 Subject: [PATCH 1010/1172] MdeModulePkg: Add unit tests for DxeReportStatusCodeLib This commit adds a host based unit test for DxeReportStatusCodeLib that ensures that the platform cannot invert the TPL on an initial call to ReportStatusCode functionality. Signed-off-by: Joey Vagedes --- .../DxeReportStatusCodeLibGoogleTest.cpp | 47 +++++++++++++++++++ .../DxeReportStatusCodeLibGoogleTest.inf | 32 +++++++++++++ MdeModulePkg/Test/MdeModulePkgHostTest.dsc | 7 +++ 3 files changed, 86 insertions(+) create mode 100644 MdeModulePkg/Library/DxeReportStatusCodeLib/GoogleTest/DxeReportStatusCodeLibGoogleTest.cpp create mode 100644 MdeModulePkg/Library/DxeReportStatusCodeLib/GoogleTest/DxeReportStatusCodeLibGoogleTest.inf diff --git a/MdeModulePkg/Library/DxeReportStatusCodeLib/GoogleTest/DxeReportStatusCodeLibGoogleTest.cpp b/MdeModulePkg/Library/DxeReportStatusCodeLib/GoogleTest/DxeReportStatusCodeLibGoogleTest.cpp new file mode 100644 index 000000000000..a823b1c813a5 --- /dev/null +++ b/MdeModulePkg/Library/DxeReportStatusCodeLib/GoogleTest/DxeReportStatusCodeLibGoogleTest.cpp @@ -0,0 +1,47 @@ +/** @file + UEFI based application for unit testing the DxeReportStatusCodeLib. + + Copyright (c) Microsoft Corporation. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include +#include +#include + +extern "C" { + #include + #include + #include +} + +using namespace testing; + +class DxeReportStatusCodeLibGeneralTest : public Test { +protected: + StrictMock BsMock; +}; + +// Verify that ReportStatusCode does not attempt to locate the ReportStatusCode protocol +// on demand if not cached. It should only be updated via events outside of a call to +// ReportStatusCode to prevent possible TPL inversion. +TEST_F (DxeReportStatusCodeLibGeneralTest, DoNotCallLocateProtocol) { + EFI_STATUS Status; + + // LocateProtocol should never be called + EXPECT_CALL (BsMock, gBS_LocateProtocol (_, _, _)) + .Times (0); + + Status = ReportStatusCode (EFI_PROGRESS_CODE, 0x0); + ASSERT_EQ (Status, EFI_UNSUPPORTED); // We have not located the protocol, so this is expected. +} + +int +main ( + int argc, + char *argv[] + ) +{ + testing::InitGoogleTest (&argc, argv); + return RUN_ALL_TESTS (); +} diff --git a/MdeModulePkg/Library/DxeReportStatusCodeLib/GoogleTest/DxeReportStatusCodeLibGoogleTest.inf b/MdeModulePkg/Library/DxeReportStatusCodeLib/GoogleTest/DxeReportStatusCodeLibGoogleTest.inf new file mode 100644 index 000000000000..96ddf92c2f76 --- /dev/null +++ b/MdeModulePkg/Library/DxeReportStatusCodeLib/GoogleTest/DxeReportStatusCodeLibGoogleTest.inf @@ -0,0 +1,32 @@ +## @file +# Host based Application that Unit Tests DxeReportStatusCodeLib +# +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x00010017 + BASE_NAME = DxeReportStatusCodeLibGoogleTest + FILE_GUID = D7F3EA2A-1868-4107-82AB-B737BF9FD6B0 + MODULE_TYPE = HOST_APPLICATION + VERSION_STRING = 1.0 + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + DxeReportStatusCodeLibGoogleTest.cpp + +[Packages] + MdePkg/MdePkg.dec + UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec + +[LibraryClasses] + GoogleTestLib + BaseLib + ReportStatusCodeLib + UefiBootServicesTableLib diff --git a/MdeModulePkg/Test/MdeModulePkgHostTest.dsc b/MdeModulePkg/Test/MdeModulePkgHostTest.dsc index 236137470acd..a749107809a4 100644 --- a/MdeModulePkg/Test/MdeModulePkgHostTest.dsc +++ b/MdeModulePkg/Test/MdeModulePkgHostTest.dsc @@ -65,6 +65,13 @@ NvmExpressDxe|MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf } + MdeModulePkg/Library/DxeReportStatusCodeLib/GoogleTest/DxeReportStatusCodeLibGoogleTest.inf { + + ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf + DevicePathLib|MdePkg/Test/Mock/Library/GoogleTest/MockDevicePathLib/MockDevicePathLib.inf + UefiBootServicesTableLib|MdePkg/Test/Mock/Library/GoogleTest/MockUefiBootServicesTableLib/MockUefiBootServicesTableLib.inf + } + # # Build HOST_APPLICATION Libraries # From b220ba807e749aa9b0c5c6b7b853fd7c9418d892 Mon Sep 17 00:00:00 2001 From: Arkadiusz Filipowski Date: Mon, 15 Dec 2025 10:45:35 +0100 Subject: [PATCH 1011/1172] MdeModulePkg: Fix overflow in PciAllocateBusNumber When StartBusNumber is 0xFF NextNumber would overflow and wrap back to 0. This will be bypass check NextNumber > MaxNumberInRange as a result PCI enumeration will continue instead of breaking due to lack of resources. Signed-off-by: Arkadiusz Filipowski --- MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c index 28840deaf314..25bf44c5cc2e 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c @@ -1025,7 +1025,7 @@ PciAllocateBusNumber ( { PCI_IO_DEVICE *RootBridge; EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *BusNumberRanges; - UINT8 NextNumber; + UINT16 NextNumber; UINT64 MaxNumberInRange; // @@ -1043,18 +1043,18 @@ PciAllocateBusNumber ( while (BusNumberRanges->Desc != ACPI_END_TAG_DESCRIPTOR) { MaxNumberInRange = BusNumberRanges->AddrRangeMin + BusNumberRanges->AddrLen - 1; if ((StartBusNumber >= BusNumberRanges->AddrRangeMin) && (StartBusNumber <= MaxNumberInRange)) { - NextNumber = (UINT8)(StartBusNumber + NumberOfBuses); + NextNumber = (StartBusNumber + NumberOfBuses); while (NextNumber > MaxNumberInRange) { ++BusNumberRanges; if (BusNumberRanges->Desc == ACPI_END_TAG_DESCRIPTOR) { return EFI_OUT_OF_RESOURCES; } - NextNumber = (UINT8)(NextNumber + (BusNumberRanges->AddrRangeMin - (MaxNumberInRange + 1))); + NextNumber = (UINT16)(NextNumber + (BusNumberRanges->AddrRangeMin - (MaxNumberInRange + 1))); MaxNumberInRange = BusNumberRanges->AddrRangeMin + BusNumberRanges->AddrLen - 1; } - *NextBusNumber = NextNumber; + *NextBusNumber = (UINT8)NextNumber; return EFI_SUCCESS; } From 8ba02634ecaa6ff5d0edcea266198f42eca90c53 Mon Sep 17 00:00:00 2001 From: Thomas Prescher Date: Tue, 13 Jan 2026 09:14:12 +0100 Subject: [PATCH 1012/1172] OvmfPkg/VirtioRngDxe: protect VirtioRngGetRNG against timer callbacks On-behalf-of: SAP thomas.prescher@sap.com Signed-off-by: Thomas Prescher --- OvmfPkg/VirtioRngDxe/VirtioRng.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/OvmfPkg/VirtioRngDxe/VirtioRng.c b/OvmfPkg/VirtioRngDxe/VirtioRng.c index 8959e51faf71..39d07eef0e1c 100644 --- a/OvmfPkg/VirtioRngDxe/VirtioRng.c +++ b/OvmfPkg/VirtioRngDxe/VirtioRng.c @@ -136,6 +136,7 @@ VirtioRngGetRNG ( EFI_STATUS Status; EFI_PHYSICAL_ADDRESS DeviceAddress; VOID *Mapping; + EFI_TPL CurrentTpl; if ((This == NULL) || (RNGValueLength == 0) || (RNGValue == NULL)) { return EFI_INVALID_PARAMETER; @@ -177,6 +178,8 @@ VirtioRngGetRNG ( goto FreeBuffer; } + CurrentTpl = gBS->RaiseTPL (TPL_NOTIFY); + // // The Virtio RNG device may return less data than we asked it to, and can // only return MAX_UINT32 bytes per invocation. So loop as long as needed to @@ -198,6 +201,7 @@ VirtioRngGetRNG ( EFI_SUCCESS) { Status = EFI_DEVICE_ERROR; + gBS->RestoreTPL (CurrentTpl); goto UnmapBuffer; } @@ -205,6 +209,8 @@ VirtioRngGetRNG ( ASSERT (Len <= BufferSize); } + gBS->RestoreTPL (CurrentTpl); + // // Unmap the device buffer before accessing it. // From 3e5942ea5b022a6b148b207b2e81a72f1725d7b7 Mon Sep 17 00:00:00 2001 From: Khalid Ali Date: Tue, 13 Jan 2026 16:45:52 +0000 Subject: [PATCH 1013/1172] OvmfPkg: Fix dependency issue when StandaloneMm enabled When enabled support of StandaloneMm on OVMF, ovmf boot manager depends on S3SaveStateDxe. However, the support of StandaloneMm currently doesn't include that driver. This causes assertion on ovmf with DEBUG and exception on RELEASE. PlatformBootManagerLib requires S3SaveStateDxe which produces EFI_S3_SAVE_STATE_PROTOCOL to successfully able to store boot secript. Given the commit b017b1b that introduced didn't indicate any potential issue. Also enabling that library, there is no other issues observed. S3SaveStateDxe should always be built with OVMF whether StandaloneMm is enabled or not. Observations: OVMF DEBUG build has been observed to trigger this assertions: ASSERT_EFI_ERROR (Status = Not Found) ASSERT BdsPlatform.c(1583): !(((RETURN_STATUS)(Status)) >= 0x8000000000000000ULL) On OVMF RELEASE build due missing null check BootScript is dereferenced while it is NULL. Which caused following exception: !!!! X64 Exception Type - 06(#UD - Invalid Opcode) CPU Apic ID - 00000000 !!!! RIP - 00000000000E0000, CS - 0000000000000038, RFLAGS - 0000000000010246 RAX - 0000000000000000, RCX - 0000000000000000, RDX - 000000000000000A RBX - 0000000000000000, RSP - 0000000007E8E968, RBP - 0000000007E8EE50 RSI - 0000000006B9ADE3, RDI - 0000000006BA2670 R8 - 0000000000000004, R9 - 0000000006BA1DD5, R10 - 00000000076DF100 R11 - 00000000076DE295, R12 - 0000000007E8EAA8, R13 - 0000000007E8EED8 R14 - 0000000000000600, R15 - 000000008000F880 DS - 0000000000000030, ES - 0000000000000030, FS - 0000000000000030 GS - 0000000000000030, SS - 0000000000000030 CR0 - 0000000080010033, CR2 - 0000000000000000, CR3 - 0000000007801000 CR4 - 0000000000000668, CR8 - 0000000000000000 DR0 - 0000000000000000, DR1 - 0000000000000000, DR2 - 0000000000000000 DR3 - 0000000000000000, DR6 - 00000000FFFF0FF0, DR7 - 0000000000000400 GDTR - 00000000075DA000 0000000000000057, LDTR - 0000000000000000 IDTR - 0000000007270018 0000000000000FFF, TR - 0000000000000048 FXSAVE_STATE - 0000000007E8E5C0 !!!! Can't find image information. !!!! Signed-off-by: Khalid Ali --- OvmfPkg/OvmfPkgX64.dsc | 2 +- OvmfPkg/OvmfPkgX64.fdf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index 9180e8864536..9a9565122399 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -977,6 +977,7 @@ MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf + MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf OvmfPkg/QemuRamfbDxe/QemuRamfbDxe.inf @@ -1005,7 +1006,6 @@ MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf !if $(STANDALONE_MM_ENABLE) != TRUE - MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf !endif MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf index a9af6e4fa34a..fef0b63f4f6e 100644 --- a/OvmfPkg/OvmfPkgX64.fdf +++ b/OvmfPkg/OvmfPkgX64.fdf @@ -250,6 +250,7 @@ INF MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf INF MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf INF MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf +INF MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf INF OvmfPkg/SioBusDxe/SioBusDxe.inf !if $(SOURCE_DEBUG_ENABLE) == FALSE @@ -263,7 +264,6 @@ INF OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf INF OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf !if $(STANDALONE_MM_ENABLE) != TRUE -INF MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveStateDxe.inf INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf !endif INF MdeModulePkg/Universal/Acpi/BootGraphicsResourceTableDxe/BootGraphicsResourceTableDxe.inf From 4743d8d9925654a3f4d150e3bc502a02979f3892 Mon Sep 17 00:00:00 2001 From: "Aaron Pop (from Dev Box)" Date: Tue, 18 Nov 2025 14:00:25 -0800 Subject: [PATCH 1014/1172] MdeModulePkg: StatusCodeHandler Stmm remove assert In StandaloneMM mode, IsStatusCodeUsingSerialPort is expecting to find gMmStatusCodeUseSerialHobGuid, and will assert if it is not found. Change the logic so that if the Guided Hob is not found, to let the function return FALSE and progress to proceed. Signed-off-by: Aaron Pop --- .../StatusCodeHandler/Smm/StatusCodeHandlerStandalone.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/MdeModulePkg/Universal/StatusCodeHandler/Smm/StatusCodeHandlerStandalone.c b/MdeModulePkg/Universal/StatusCodeHandler/Smm/StatusCodeHandlerStandalone.c index 67ff33f71ae6..fbdb66defc4a 100644 --- a/MdeModulePkg/Universal/StatusCodeHandler/Smm/StatusCodeHandlerStandalone.c +++ b/MdeModulePkg/Universal/StatusCodeHandler/Smm/StatusCodeHandlerStandalone.c @@ -29,11 +29,12 @@ IsStatusCodeUsingSerialPort ( MM_STATUS_CODE_USE_SERIAL *StatusCodeUseSerialHob; Hob = GetFirstGuidHob (&gMmStatusCodeUseSerialHobGuid); - ASSERT (Hob != NULL); + if (Hob != NULL) { + StatusCodeUseSerialHob = (MM_STATUS_CODE_USE_SERIAL *)GET_GUID_HOB_DATA (Hob); + return StatusCodeUseSerialHob->StatusCodeUseSerial; + } - StatusCodeUseSerialHob = (MM_STATUS_CODE_USE_SERIAL *)GET_GUID_HOB_DATA (Hob); - - return StatusCodeUseSerialHob->StatusCodeUseSerial; + return FALSE; } /** From 5eeac91bc4fdaa8e998264c6e3e8b12e26e9ccd2 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Wed, 17 Dec 2025 10:49:01 -0800 Subject: [PATCH 1015/1172] MdePkg: AArch64Mmu.h: Fix define shifts Building AARCH64 under CLANGPDB catches an error in AArch64Mmu.h where some shifts were being applied on 32 bit integers that were greater than or equal to 32 bits. This commit fixes that by making these 64 bit integers. Signed-off-by: Oliver Smith-Denny --- MdePkg/Include/AArch64/AArch64Mmu.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MdePkg/Include/AArch64/AArch64Mmu.h b/MdePkg/Include/AArch64/AArch64Mmu.h index 6cd26de1f380..0ca084e75bd2 100644 --- a/MdePkg/Include/AArch64/AArch64Mmu.h +++ b/MdePkg/Include/AArch64/AArch64Mmu.h @@ -129,8 +129,8 @@ #define TTBR_ASID_MASK (0xFF << TTBR_ASID_FIELD) #define TTBR_BADDR_MASK (0xFFFFFFFFFFFF ) // The width of this field depends on the values in TxSZ. Addr occupies bottom 48bits -#define TCR_DS (1UL << 59) -#define TCR_DS_NVHE (1UL << 32) +#define TCR_DS (1ULL << 59) +#define TCR_DS_NVHE (1ULL << 32) #define TCR_EL1_T0SZ_FIELD (0) #define TCR_EL1_EPD0_FIELD (7) From a9faf07bc089c75b0e3e1bf05b2117240a1fafb1 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Wed, 17 Dec 2025 09:59:01 -0800 Subject: [PATCH 1016/1172] MdePkg: Add PE Target Support to AArch64 PE targets do not support the ELF style .type, .size, or .previous directives and have different name mangling, so this commit updates MdePkg AArch64 code to support PE targets. PE targets also don't support the fixup_aarch64_ldr_pcrel_imm19 relocation type, which is created doing ldr . This introduces a new set of macros, LDR_LIT nad LDR_LIT_TMP, which will use the direct ldr for ELF targets and ADRP/LDR for PE targets, because the ADRP/LDR version requires 4KB alignment, which is guaranteed on CLANGPDB. Signed-off-by: Oliver Smith-Denny --- MdePkg/Include/AArch64/AArch64.h | 2 +- MdePkg/Include/AArch64/AsmMacroLib.h | 23 +++++++++++++++++-- MdePkg/Include/AArch64/ProcessorBind.h | 11 +++++++-- .../CompilerIntrinsicsLib/AArch64/Atomics.S | 14 +++++++++++ MdePkg/Library/CompilerIntrinsicsLib/memset.c | 10 ++++++-- 5 files changed, 53 insertions(+), 7 deletions(-) diff --git a/MdePkg/Include/AArch64/AArch64.h b/MdePkg/Include/AArch64/AArch64.h index 00b058fb2a6c..893bee0bb694 100644 --- a/MdePkg/Include/AArch64/AArch64.h +++ b/MdePkg/Include/AArch64/AArch64.h @@ -152,7 +152,7 @@ #define VECTOR_END(tbl) \ .org 0x800; \ - .previous + .section .text VOID EFIAPI diff --git a/MdePkg/Include/AArch64/AsmMacroLib.h b/MdePkg/Include/AArch64/AsmMacroLib.h index 11844c95e461..048ab8bfa36f 100644 --- a/MdePkg/Include/AArch64/AsmMacroLib.h +++ b/MdePkg/Include/AArch64/AsmMacroLib.h @@ -26,14 +26,14 @@ #define _ASM_FUNC(Name, Section) \ .global Name ; \ .section #Section, "ax" ; \ - .type Name, %function ; \ + _ASM_TYPE(Name) ; \ Name: ; \ AARCH64_BTI(c) #define _ASM_FUNC_ALIGN(Name, Section, Align) \ .global Name ; \ .section #Section, "ax" ; \ - .type Name, %function ; \ + _ASM_TYPE(Name) ; \ .balign Align ; \ Name: ; \ AARCH64_BTI(c) @@ -53,4 +53,23 @@ movk Reg, ((Val) >> 16) & 0xffff, lsl #16 ; \ movk Reg, (Val) & 0xffff +// CLANGPDB does not support the fixup_aarch64_ldr_pcrel_imm19 +// relocation used for LDR literal loads, so we need to expand +// LDR literal loads into ADRP + LDR instructions for PE targets. +#ifdef __ELF__ +#define LDR_LIT(dst, sym) \ + ldr dst, sym + +#define LDR_LIT_TMP(dst, sym, tmp) \ + ldr dst, sym +#else +#define LDR_LIT(dst, sym) \ + adrp dst, sym ;\ + ldr dst, [dst, :lo12:sym] + +#define LDR_LIT_TMP(dst, sym, tmp) \ + adrp tmp, sym ;\ + ldr dst, [tmp, :lo12:sym] +#endif + #endif // ASM_MACRO_IO_LIBV8_H_ diff --git a/MdePkg/Include/AArch64/ProcessorBind.h b/MdePkg/Include/AArch64/ProcessorBind.h index c03594d9240f..903b005e1bf3 100644 --- a/MdePkg/Include/AArch64/ProcessorBind.h +++ b/MdePkg/Include/AArch64/ProcessorBind.h @@ -179,9 +179,16 @@ typedef INT64 INTN; /// #define ASM_GLOBAL .globl +// PE targets (i.e. building with CLANGPDB) do not support the ELF style .type directive + #ifdef __ELF__ +#define _ASM_TYPE(Name) .type Name, %function + #else +#define _ASM_TYPE(Name) + #endif // __ELF__ + #define GCC_ASM_EXPORT(func__) \ - .global _CONCATENATE (__USER_LABEL_PREFIX__, func__) ;\ - .type ASM_PFX(func__), %function + .global ASM_PFX(func__) ;\ + _ASM_TYPE(ASM_PFX(func__)) #define GCC_ASM_IMPORT(func__) \ .extern _CONCATENATE (__USER_LABEL_PREFIX__, func__) diff --git a/MdePkg/Library/CompilerIntrinsicsLib/AArch64/Atomics.S b/MdePkg/Library/CompilerIntrinsicsLib/AArch64/Atomics.S index 3792020ab817..15b77156abb4 100644 --- a/MdePkg/Library/CompilerIntrinsicsLib/AArch64/Atomics.S +++ b/MdePkg/Library/CompilerIntrinsicsLib/AArch64/Atomics.S @@ -32,12 +32,26 @@ .macro fn_start, name:req .section .text.\name .globl \name + + /* + * PE targets (e.g. building with CLANGPDB) do not support ELF style + * .type directives + */ +#ifdef __ELF__ .type \name, %function +#endif \name\(): .endm .macro fn_end, name:req + + /* + * PE targets (e.g. building with CLANGPDB) do not support ELF style + * .size directives + */ +#ifdef __ELF__ .size \name, . - \name +#endif .endm /* diff --git a/MdePkg/Library/CompilerIntrinsicsLib/memset.c b/MdePkg/Library/CompilerIntrinsicsLib/memset.c index c0f03c5822f6..1fcfaf9fee19 100644 --- a/MdePkg/Library/CompilerIntrinsicsLib/memset.c +++ b/MdePkg/Library/CompilerIntrinsicsLib/memset.c @@ -33,11 +33,17 @@ __memset ( // implementation of memset(), which may conflict with this one if this // object was pulled into the link due to the definitions below. So make // our memset() 'weak' to let the other implementation take precedence. +// PE targets (i.e. building with CLANGPDB) have different name mangling +// and as such don't recognize __memset here, so we provide a weak alias +// that simply calls the internal __memset implementation. // -__attribute__ ((__weak__, __alias__ ("__memset"))) +__attribute__ ((__weak__)) void * memset ( void *dest, int c, size_t n - ); + ) +{ + return __memset (dest, c, n); +} From 047819264109f84d81acc835cb131e3583fc7319 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Fri, 9 Jan 2026 10:41:32 -0800 Subject: [PATCH 1017/1172] ArmPkg: ArmExceptionLib: Drop ExceptionHandlersEnd The ExceptionHandlersEnd symbol is placed in the wrong section because it comes after the VECTOR_END macro. However, this symbol is also completely unused, so this commit removes it. Signed-off-by: Oliver Smith-Denny --- ArmPkg/Library/ArmExceptionLib/AArch64/ExceptionSupport.S | 4 ---- ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.c | 5 ----- 2 files changed, 9 deletions(-) diff --git a/ArmPkg/Library/ArmExceptionLib/AArch64/ExceptionSupport.S b/ArmPkg/Library/ArmExceptionLib/AArch64/ExceptionSupport.S index 714ead608f39..9be44536fcfd 100644 --- a/ArmPkg/Library/ArmExceptionLib/AArch64/ExceptionSupport.S +++ b/ArmPkg/Library/ArmExceptionLib/AArch64/ExceptionSupport.S @@ -92,7 +92,6 @@ UINT64 Padding;0x328 // Required for stack alignment */ -GCC_ASM_EXPORT(ExceptionHandlersEnd) GCC_ASM_EXPORT(CommonCExceptionHandler) .text @@ -244,9 +243,6 @@ ASM_PFX(SErrorA32): VECTOR_END(ExceptionHandlersStart) -ASM_PFX(ExceptionHandlersEnd): - - ASM_PFX(CommonExceptionEntry): EL1_OR_EL2(x1) diff --git a/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.c b/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.c index e01465392ed8..3aa2209e2998 100644 --- a/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.c +++ b/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.c @@ -26,11 +26,6 @@ ExceptionHandlersStart ( VOID ); -VOID -ExceptionHandlersEnd ( - VOID - ); - RETURN_STATUS ArchVectorConfig ( IN UINTN VectorBaseAddress From 969879cb28d15a4de562ad9b63b0f6b72b8cb7c2 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Fri, 9 Jan 2026 10:43:30 -0800 Subject: [PATCH 1018/1172] MdePkg, ArmPkg, ArmPlatformPkg: Create VECTOR_TABLE Macro Currently, there exists VECTOR_BASE, VECTOR_ENTRY, and VECTOR_END macros for defining things such as exception vectors. They are intended to be used as follows: VECTOR_BASE() VECTOR_ENTRY() VECTOR_END() This creates a non-enforceable requirement to do this, if VECTOR_END isn't used, the vector size isn't enforced and the image section won't be restored to .text. This commit removes VECTOR_BASE and VECTOR_END and creates a VECTOR_TABLE macro that encapsulates the behavior of the two macros, sandwiching the developer provided VECTOR_ENTRY and code pairings inbetween. This enforces that VECTOR_BASE and VECTOR_END are used together and correctly set up/tear down the vector area. This commit also updates the only users of these macros at the same time to avoid a build breakage. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Oliver Smith-Denny --- .../AArch64/ExceptionSupport.S | 149 ++++++++-------- ArmPlatformPkg/Sec/AArch64/Exception.S | 165 +++++++++--------- MdePkg/Include/AArch64/AArch64.h | 20 ++- 3 files changed, 166 insertions(+), 168 deletions(-) diff --git a/ArmPkg/Library/ArmExceptionLib/AArch64/ExceptionSupport.S b/ArmPkg/Library/ArmExceptionLib/AArch64/ExceptionSupport.S index 9be44536fcfd..81b5225ac16b 100644 --- a/ArmPkg/Library/ArmExceptionLib/AArch64/ExceptionSupport.S +++ b/ArmPkg/Library/ArmExceptionLib/AArch64/ExceptionSupport.S @@ -108,8 +108,6 @@ GCC_ASM_EXPORT(CommonCExceptionHandler) // exception vector initialization method is used. // -VECTOR_BASE(ExceptionHandlersStart) - .macro ExceptionEntry, val, sp=SPx // // Our backtrace and register dump code is written in C and so it requires @@ -165,83 +163,76 @@ VECTOR_BASE(ExceptionHandlersStart) b ASM_PFX(CommonExceptionEntry) .endm -// -// Current EL with SP0 : 0x0 - 0x180 -// -VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SP0_SYNC) -ASM_PFX(SynchronousExceptionSP0): - ExceptionEntry EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS - -VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SP0_IRQ) -ASM_PFX(IrqSP0): - ExceptionEntry EXCEPT_AARCH64_IRQ - -VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SP0_FIQ) -ASM_PFX(FiqSP0): - ExceptionEntry EXCEPT_AARCH64_FIQ - -VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SP0_SERR) -ASM_PFX(SErrorSP0): - ExceptionEntry EXCEPT_AARCH64_SERROR - -// -// Current EL with SPx: 0x200 - 0x380 -// -VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SPX_SYNC) -ASM_PFX(SynchronousExceptionSPx): - ExceptionEntry EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS, SP0 - -VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SPX_IRQ) -ASM_PFX(IrqSPx): - ExceptionEntry EXCEPT_AARCH64_IRQ - -VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SPX_FIQ) -ASM_PFX(FiqSPx): - ExceptionEntry EXCEPT_AARCH64_FIQ - -VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SPX_SERR) -ASM_PFX(SErrorSPx): - ExceptionEntry EXCEPT_AARCH64_SERROR - -// -// Lower EL using AArch64 : 0x400 - 0x580 -// -VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A64_SYNC) -ASM_PFX(SynchronousExceptionA64): - ExceptionEntry EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS - -VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A64_IRQ) -ASM_PFX(IrqA64): - ExceptionEntry EXCEPT_AARCH64_IRQ - -VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A64_FIQ) -ASM_PFX(FiqA64): - ExceptionEntry EXCEPT_AARCH64_FIQ - -VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A64_SERR) -ASM_PFX(SErrorA64): - ExceptionEntry EXCEPT_AARCH64_SERROR - -// -// Lower EL using AArch32 : 0x600 - 0x780 -// -VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A32_SYNC) -ASM_PFX(SynchronousExceptionA32): - ExceptionEntry EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS - -VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A32_IRQ) -ASM_PFX(IrqA32): - ExceptionEntry EXCEPT_AARCH64_IRQ - -VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A32_FIQ) -ASM_PFX(FiqA32): - ExceptionEntry EXCEPT_AARCH64_FIQ - -VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A32_SERR) -ASM_PFX(SErrorA32): - ExceptionEntry EXCEPT_AARCH64_SERROR - -VECTOR_END(ExceptionHandlersStart) +#define EXCEPTION_VECTOR \ +/* Current EL with SP0 : 0x0 - 0x180 */ \ +VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SP0_SYNC) \ +ASM_PFX(SynchronousExceptionSP0): \ + ExceptionEntry EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS ;\ + \ +VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SP0_IRQ) \ +ASM_PFX(IrqSP0): \ + ExceptionEntry EXCEPT_AARCH64_IRQ ;\ + \ +VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SP0_FIQ) \ +ASM_PFX(FiqSP0): \ + ExceptionEntry EXCEPT_AARCH64_FIQ ;\ + \ +VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SP0_SERR) \ +ASM_PFX(SErrorSP0): \ + ExceptionEntry EXCEPT_AARCH64_SERROR ;\ + \ +/* Current EL with SPx: 0x200 - 0x380 */ \ +VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SPX_SYNC) \ +ASM_PFX(SynchronousExceptionSPx): \ + ExceptionEntry EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS, SP0 ;\ + \ +VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SPX_IRQ) \ +ASM_PFX(IrqSPx): \ + ExceptionEntry EXCEPT_AARCH64_IRQ ;\ + \ +VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SPX_FIQ) \ +ASM_PFX(FiqSPx): \ + ExceptionEntry EXCEPT_AARCH64_FIQ ;\ + \ +VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SPX_SERR) \ +ASM_PFX(SErrorSPx): \ + ExceptionEntry EXCEPT_AARCH64_SERROR ;\ + \ +/* Lower EL using AArch64 : 0x400 - 0x580 */ \ +VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A64_SYNC) \ +ASM_PFX(SynchronousExceptionA64): \ + ExceptionEntry EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS ;\ + \ +VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A64_IRQ) \ +ASM_PFX(IrqA64): \ + ExceptionEntry EXCEPT_AARCH64_IRQ ;\ + \ +VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A64_FIQ) \ +ASM_PFX(FiqA64): \ + ExceptionEntry EXCEPT_AARCH64_FIQ ;\ + \ +VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A64_SERR) \ +ASM_PFX(SErrorA64): \ + ExceptionEntry EXCEPT_AARCH64_SERROR ;\ + \ +/* Lower EL using AArch32 : 0x600 - 0x780 */ \ +VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A32_SYNC) \ +ASM_PFX(SynchronousExceptionA32): \ + ExceptionEntry EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS ;\ + \ +VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A32_IRQ) \ +ASM_PFX(IrqA32): \ + ExceptionEntry EXCEPT_AARCH64_IRQ ;\ + \ +VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A32_FIQ) \ +ASM_PFX(FiqA32): \ + ExceptionEntry EXCEPT_AARCH64_FIQ ;\ + \ +VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A32_SERR) \ +ASM_PFX(SErrorA32): \ + ExceptionEntry EXCEPT_AARCH64_SERROR ;\ + +VECTOR_TABLE(ExceptionHandlersStart, EXCEPTION_VECTOR) ASM_PFX(CommonExceptionEntry): diff --git a/ArmPlatformPkg/Sec/AArch64/Exception.S b/ArmPlatformPkg/Sec/AArch64/Exception.S index 433761e3eb72..82647edbeeb5 100644 --- a/ArmPlatformPkg/Sec/AArch64/Exception.S +++ b/ArmPlatformPkg/Sec/AArch64/Exception.S @@ -24,93 +24,92 @@ 3: bl ASM_PFX(PeiCommonExceptionEntry) ; +#define EXCEPTION_VECTOR \ +VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SP0_SYNC) \ +_DefaultSyncExceptHandler_t: \ + mov x0, #EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS ;\ + TO_HANDLER ;\ + \ +VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SP0_IRQ) \ +_DefaultIrq_t: \ + mov x0, #EXCEPT_AARCH64_IRQ ;\ + TO_HANDLER ;\ + \ +VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SP0_FIQ) \ +_DefaultFiq_t: \ + mov x0, #EXCEPT_AARCH64_FIQ ;\ + TO_HANDLER ;\ + \ +VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SP0_SERR) \ +_DefaultSError_t: \ + mov x0, #EXCEPT_AARCH64_SERROR ;\ + TO_HANDLER ;\ + \ +VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SPX_SYNC) \ +_DefaultSyncExceptHandler_h: \ + mov x0, #EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS ;\ + TO_HANDLER ;\ + \ +VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SPX_IRQ) \ +_DefaultIrq_h: \ + mov x0, #EXCEPT_AARCH64_IRQ ;\ + TO_HANDLER ;\ + \ +VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SPX_FIQ) \ +_DefaultFiq_h: \ + mov x0, #EXCEPT_AARCH64_FIQ ;\ + TO_HANDLER ;\ + \ +VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SPX_SERR) \ +_DefaultSError_h: \ + mov x0, #EXCEPT_AARCH64_SERROR ;\ + TO_HANDLER ;\ + \ +VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_LOW_A64_SYNC) \ +_DefaultSyncExceptHandler_LowerA64: \ + mov x0, #EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS ;\ + TO_HANDLER ;\ + \ +VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_LOW_A64_IRQ) \ +_DefaultIrq_LowerA64: \ + mov x0, #EXCEPT_AARCH64_IRQ ;\ + TO_HANDLER ;\ + \ +VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_LOW_A64_FIQ) \ +_DefaultFiq_LowerA64: \ + mov x0, #EXCEPT_AARCH64_FIQ ;\ + TO_HANDLER ;\ + \ +VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_LOW_A64_SERR) \ +_DefaultSError_LowerA64: \ + mov x0, #EXCEPT_AARCH64_SERROR ;\ + TO_HANDLER ;\ + \ +VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_LOW_A32_SYNC) \ +_DefaultSyncExceptHandler_LowerA32: \ + mov x0, #EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS ;\ + TO_HANDLER ;\ + \ +VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_LOW_A32_IRQ) \ +_DefaultIrq_LowerA32: \ + mov x0, #EXCEPT_AARCH64_IRQ ;\ + TO_HANDLER ;\ + \ +VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_LOW_A32_FIQ) \ +_DefaultFiq_LowerA32: \ + mov x0, #EXCEPT_AARCH64_FIQ ;\ + TO_HANDLER ;\ + \ +VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_LOW_A32_SERR) \ +_DefaultSError_LowerA32: \ + mov x0, #EXCEPT_AARCH64_SERROR ;\ + TO_HANDLER ; + // // Default Exception handlers: There is no plan to return from any of these exceptions. // No context saving at all. // -VECTOR_BASE(PeiVectorTable) - -VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SP0_SYNC) -_DefaultSyncExceptHandler_t: - mov x0, #EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS - TO_HANDLER - -VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SP0_IRQ) -_DefaultIrq_t: - mov x0, #EXCEPT_AARCH64_IRQ - TO_HANDLER - -VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SP0_FIQ) -_DefaultFiq_t: - mov x0, #EXCEPT_AARCH64_FIQ - TO_HANDLER - -VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SP0_SERR) -_DefaultSError_t: - mov x0, #EXCEPT_AARCH64_SERROR - TO_HANDLER - -VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SPX_SYNC) -_DefaultSyncExceptHandler_h: - mov x0, #EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS - TO_HANDLER - -VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SPX_IRQ) -_DefaultIrq_h: - mov x0, #EXCEPT_AARCH64_IRQ - TO_HANDLER - -VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SPX_FIQ) -_DefaultFiq_h: - mov x0, #EXCEPT_AARCH64_FIQ - TO_HANDLER - -VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SPX_SERR) -_DefaultSError_h: - mov x0, #EXCEPT_AARCH64_SERROR - TO_HANDLER - -VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_LOW_A64_SYNC) -_DefaultSyncExceptHandler_LowerA64: - mov x0, #EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS - TO_HANDLER - -VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_LOW_A64_IRQ) -_DefaultIrq_LowerA64: - mov x0, #EXCEPT_AARCH64_IRQ - TO_HANDLER - -VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_LOW_A64_FIQ) -_DefaultFiq_LowerA64: - mov x0, #EXCEPT_AARCH64_FIQ - TO_HANDLER - -VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_LOW_A64_SERR) -_DefaultSError_LowerA64: - mov x0, #EXCEPT_AARCH64_SERROR - TO_HANDLER - -VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_LOW_A32_SYNC) -_DefaultSyncExceptHandler_LowerA32: - mov x0, #EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS - TO_HANDLER - -VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_LOW_A32_IRQ) -_DefaultIrq_LowerA32: - mov x0, #EXCEPT_AARCH64_IRQ - TO_HANDLER - -VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_LOW_A32_FIQ) -_DefaultFiq_LowerA32: - mov x0, #EXCEPT_AARCH64_FIQ - TO_HANDLER - -VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_LOW_A32_SERR) -_DefaultSError_LowerA32: - mov x0, #EXCEPT_AARCH64_SERROR - TO_HANDLER - -VECTOR_END(PeiVectorTable) +VECTOR_TABLE(PeiVectorTable, EXCEPTION_VECTOR) AARCH64_BTI_NOTE() diff --git a/MdePkg/Include/AArch64/AArch64.h b/MdePkg/Include/AArch64/AArch64.h index 893bee0bb694..8607b5c6424b 100644 --- a/MdePkg/Include/AArch64/AArch64.h +++ b/MdePkg/Include/AArch64/AArch64.h @@ -140,20 +140,28 @@ #define ID_AA64PFR2_EL1 S3_0_C0_C4_2 -#define VECTOR_BASE(tbl) \ +// This macro defines a vector table +// It is intended to be used as follows: +// +// #define MY_VECTOR +// VECTOR_ENTRY(MY_VECTOR, ) +// +// +// +// VECTOR_TABLE (MY_VECTOR_TABLE_NAME, MY_VECTOR) +#define VECTOR_TABLE(tbl, entries) \ .section .text.##tbl##,"ax"; \ .align 11; \ .org 0x0; \ GCC_ASM_EXPORT(tbl); \ ASM_PFX(tbl): \ - -#define VECTOR_ENTRY(tbl, off) \ - .org off - -#define VECTOR_END(tbl) \ + entries \ .org 0x800; \ .section .text +#define VECTOR_ENTRY(tbl, off) \ + .org off; + VOID EFIAPI ArmEnableSWPInstruction ( From a7eac73b97509e44cf02ed776e6e4f3f56519d61 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Wed, 17 Dec 2025 14:52:40 -0800 Subject: [PATCH 1019/1172] ArmPkg: ArmPsciMpServices: Support PE Targets CLANGPDB cannot use the direct symbol load syntax supported in ELF targets for this type of relocation (fixup_aarch64_ldr_pcrel_imm19). This switches to the LDR_LIT macro to use direct symbol load syntax for ELF targets and ADRP/LDR for PE targets. Signed-off-by: Oliver Smith-Denny --- ArmPkg/Drivers/ArmPsciMpServicesDxe/MpFuncs.S | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ArmPkg/Drivers/ArmPsciMpServicesDxe/MpFuncs.S b/ArmPkg/Drivers/ArmPsciMpServicesDxe/MpFuncs.S index 305e4bb7b417..d3ce20310ebe 100644 --- a/ArmPkg/Drivers/ArmPsciMpServicesDxe/MpFuncs.S +++ b/ArmPkg/Drivers/ArmPsciMpServicesDxe/MpFuncs.S @@ -31,11 +31,11 @@ GCC_ASM_EXPORT (ApEntryPoint) // ); ASM_PFX(ApEntryPoint): // Configure the MMU and caches - ldr x0, gTcr + LDR_LIT(x0, gTcr) bl ArmSetTCR - ldr x0, gTtbr0 + LDR_LIT(x0, gTtbr0) bl ArmSetTTBR0 - ldr x0, gMair + LDR_LIT(x0, gMair) bl ArmSetMAIR bl ArmDisableAlignmentCheck bl ArmEnableStackAlignmentCheck @@ -47,7 +47,7 @@ ASM_PFX(ApEntryPoint): // Mask the non-affinity bits bic x0, x0, 0x00ff000000 and x0, x0, 0xffffffffff - ldr x1, gProcessorIDs + LDR_LIT(x1, gProcessorIDs) mov x2, 0 // x2 = processor index // Find index in gProcessorIDs for current processor @@ -61,8 +61,8 @@ ASM_PFX(ApEntryPoint): // Calculate stack address // x2 contains the index for the current processor plus 1 - ldr x0, gApStacksBase - ldr x1, gApStackSize + LDR_LIT(x0, gApStacksBase) + LDR_LIT(x1, gApStackSize) mul x3, x2, x1 // x3 = (ProcessorIndex + 1) * gApStackSize add sp, x0, x3 // sp = gApStacksBase + x3 mov x29, xzr From de4593ca00be4dc4ab21a15d23461b261f9d3980 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Sun, 11 Jan 2026 04:26:19 +0000 Subject: [PATCH 1020/1172] ArmPkg: ArmStandaloneMmCoreEntryPoint: Add CLANGPDB Support ArmStandaloneMmCoreEntryPoint supports a scenario of building StandaloneMmCore into OP-TEE and doing self-relocation. This requires a PIE image, which PE targets do not support. As such, this scenario is not supported for CLANGPDB. This commit updates the comment and scopes -fpie to GCC/CLANGDWARF. Signed-off-by: Oliver Smith-Denny --- .../ArmStandaloneMmCoreEntryPoint.inf | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.inf b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.inf index 8eb9e18dcd7e..eab1a865b068 100644 --- a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.inf +++ b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.inf @@ -62,11 +62,10 @@ [Pcd] gArmTokenSpaceGuid.PcdStMmStackSize -# -# This configuration fails for CLANGPDB, which does not support PIE in the GCC -# sense. Such however is required for ARM family StandaloneMmCore -# self-relocation, and thus the CLANGPDB toolchain is unsupported for AARCH64 -# for this module. -# +# Standalone MM Core can be used as an OP-TEE trusted application and needs to do runtime^M +# relocation in that scenario. It needs to be built as a position independent executable (PIE)^M +# for this use case. However, PE targets do not support PIE, so only ELF targets^M +# are built with these flags and support this scenario. [BuildOptions] - GCC:*_*_AARCH64_CC_FLAGS = -fpie + GCC:*_GCC_AARCH64_CC_FLAGS = -fpie + CLANGDWARF:*_CLANGDWARF_AARCH64_CC_FLAGS = -fpie From 5d9e6e2ad1d2ecc2f95e21a8c20aab758d32802f Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Wed, 17 Dec 2025 14:57:02 -0800 Subject: [PATCH 1021/1172] ArmPlatformPkg: PeilessSec: Support PE Targets CLANGPDB cannot use the direct symbol load syntax supported in ELF targets for this type of relocation (fixup_aarch64_ldr_pcrel_imm19). This commit switches to the LDR_LIT macro to directly use LDR for ELF targets and ADRP/LDR for PE targets. Signed-off-by: Oliver Smith-Denny --- ArmPlatformPkg/PeilessSec/AArch64/ModuleEntryPoint.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ArmPlatformPkg/PeilessSec/AArch64/ModuleEntryPoint.S b/ArmPlatformPkg/PeilessSec/AArch64/ModuleEntryPoint.S index 89906fa21e90..4dd14da5eca3 100644 --- a/ArmPlatformPkg/PeilessSec/AArch64/ModuleEntryPoint.S +++ b/ArmPlatformPkg/PeilessSec/AArch64/ModuleEntryPoint.S @@ -35,7 +35,7 @@ _SkipTransferList: // to install the stacks at the bottom of the Firmware Device (case the FD is located // at the top of the DRAM) _SystemMemoryEndInit: - ldr x1, mSystemMemoryEnd + LDR_LIT(x1, mSystemMemoryEnd) _SetupStackPosition: // r1 = SystemMemoryTop From ed99c195b347320d17e59ce8753a979e6915977b Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Fri, 19 Dec 2025 19:06:44 +0000 Subject: [PATCH 1022/1172] ArmVirtPkg: PrePi: Support PE Targets CLANGPDB cannot use the direct symbol load syntax supported in ELF targets for this type of relocation (fixup_aarch64_ldr_pcrel_imm19). This commit updates to use the LDR_LIT macro to use LDR on ELF targets and ADRP/LDR on PE targets. Signed-off-by: Oliver Smith-Denny --- ArmVirtPkg/PrePi/ModuleEntryPoint.S | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ArmVirtPkg/PrePi/ModuleEntryPoint.S b/ArmVirtPkg/PrePi/ModuleEntryPoint.S index 210d2fa67b8a..92272eaf526a 100644 --- a/ArmVirtPkg/PrePi/ModuleEntryPoint.S +++ b/ArmVirtPkg/PrePi/ModuleEntryPoint.S @@ -15,7 +15,7 @@ ASM_FUNC(_ModuleEntryPoint) // by the platform. // cbnz x0, 0f - ldr x0, PcdGet64 (PcdDeviceTreeInitialBaseAddress) + LDR_LIT(x0, PcdGet64 (PcdDeviceTreeInitialBaseAddress)) 0:mov x28, x0 // preserve DTB pointer mov x27, x1 // preserve base of image pointer @@ -36,13 +36,13 @@ ASM_FUNC(_ModuleEntryPoint) // at the top of the DRAM) _SetupStackPosition: // Compute Top of System Memory - ldr x1, PcdGet64 (PcdSystemMemoryBase) - ldr x2, PcdGet64 (PcdSystemMemorySize) + LDR_LIT(x1, PcdGet64 (PcdSystemMemoryBase)) + LDR_LIT(x2, PcdGet64 (PcdSystemMemorySize)) sub x2, x2, #1 add x1, x1, x2 // x1 = SystemMemoryTop = PcdSystemMemoryBase + PcdSystemMemorySize // Calculate Top of the Firmware Device - ldr x2, PcdGet64 (PcdFdBaseAddress) + LDR_LIT(x2, PcdGet64 (PcdFdBaseAddress)) MOV32 (w3, FixedPcdGet32 (PcdFdSize) - 1) add x3, x3, x2 // x3 = FdTop = PcdFdBaseAddress + PcdFdSize @@ -120,7 +120,7 @@ ASM_PFX(DiscoverDramFromDt): // The base of the runtime image has been preserved in x27. Check whether // the expected magic number can be found in the header. // - ldr w8, .LArm64LinuxMagic + LDR_LIT_TMP(w8, .LArm64LinuxMagic, x8) ldr w9, [x27, #0x38] cmp w8, w9 bne .Lout From 237ba0204c219ad5ac95a2825d765bee9007eaf3 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Wed, 17 Dec 2025 14:58:08 -0800 Subject: [PATCH 1023/1172] ArmPkg: Add Required Library Classes for ArmTransferListLib CLANGPDB catches that ArmTransferListLib does not include all of the libraries it requires. This adds them. Signed-off-by: Oliver Smith-Denny --- ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.inf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.inf b/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.inf index 5ffb1a4d9c46..41aa3cbed310 100644 --- a/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.inf +++ b/ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.inf @@ -25,6 +25,8 @@ [LibraryClasses] BaseLib + DebugLib + HobLib [Guids] gArmTransferListHobGuid From 2eed2bf8f0076862f2bee505860eb31ce678b5d3 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Wed, 17 Dec 2025 14:59:36 -0800 Subject: [PATCH 1024/1172] ArmVirtPkg: Add CLANGPDB Support This fixes the build options in ArmVirt.dsc.inc to scope GCC style syntax to GCC and CLANGDWARF and use MSVC style syntax for CLANGPDB. It also removes usage of %progbits which is not supported in PE targets and not required for ELF targets. Signed-off-by: Oliver Smith-Denny --- ArmVirtPkg/ArmVirt.dsc.inc | 8 ++++++-- ArmVirtPkg/Library/ArmPlatformLibQemu/IdMap.S | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/ArmVirtPkg/ArmVirt.dsc.inc b/ArmVirtPkg/ArmVirt.dsc.inc index a08b6ddbc293..1af61ed916c9 100644 --- a/ArmVirtPkg/ArmVirt.dsc.inc +++ b/ArmVirtPkg/ArmVirt.dsc.inc @@ -30,10 +30,14 @@ DEFINE FD_SIZE_IN_MB = 3 !endif [BuildOptions.common.EDKII.DXE_CORE,BuildOptions.common.EDKII.DXE_DRIVER,BuildOptions.common.EDKII.UEFI_DRIVER,BuildOptions.common.EDKII.UEFI_APPLICATION] - GCC:*_*_*_DLINK_FLAGS = -z common-page-size=0x1000 + GCC:*_GCC_*_DLINK_FLAGS = -z common-page-size=0x1000 + GCC:*_CLANGDWARF_*_DLINK_FLAGS = -z common-page-size=0x1000 + CLANGPDB:*_*_*_DLINK_FLAGS = /ALIGN:0x1000 [BuildOptions.common.EDKII.DXE_RUNTIME_DRIVER] - GCC:*_*_AARCH64_DLINK_FLAGS = -z common-page-size=0x10000 + GCC:*_GCC_*_DLINK_FLAGS = -z common-page-size=0x10000 + GCC:*_CLANGDWARF_*_DLINK_FLAGS = -z common-page-size=0x10000 + CLANGPDB:*_*_*_DLINK_FLAGS = /ALIGN:0x10000 [LibraryClasses.common] !if $(TARGET) == RELEASE diff --git a/ArmVirtPkg/Library/ArmPlatformLibQemu/IdMap.S b/ArmVirtPkg/Library/ArmPlatformLibQemu/IdMap.S index ba65809e7f98..d9dcaae2bf7f 100644 --- a/ArmVirtPkg/Library/ArmPlatformLibQemu/IdMap.S +++ b/ArmVirtPkg/Library/ArmPlatformLibQemu/IdMap.S @@ -20,7 +20,7 @@ .set BLOCK_MEM, TT_TYPE_BLOCK | TT_MT_MEM | TT_AF | TT_XN | TT_NG .globl idmap - .section ".rodata.idmap", "a", %progbits + .section ".rodata.idmap", "a" .align 12 idmap: /* level 0 */ From 1f33246fe92f49a8b2abda99ff11e35a06bb5b8f Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Wed, 17 Dec 2025 15:04:12 -0800 Subject: [PATCH 1025/1172] CryptoPkg: Add CLANGPDB AArch64 Support CryptoPkg needed various updates to support CLANGPDB AARCH64: - Scope a feature PCD to IA32/X64 only - Ensure that OpenSSL and MbedTls have the Windows defines unset so they don't try to build for Windows instead of UEFI Signed-off-by: Oliver Smith-Denny --- CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc | 2 +- CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf | 2 +- CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf | 2 +- CryptoPkg/Library/OpensslLib/OpensslLib.inf | 2 +- CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf | 2 +- CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf | 2 +- CryptoPkg/Library/OpensslLib/OpensslLibFull.inf | 2 +- CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc b/CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc index c3eb8049ca5f..a61d77a4ea16 100644 --- a/CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc +++ b/CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc @@ -7,7 +7,7 @@ # ## -[PcdsFeatureFlag] +[PcdsFeatureFlag.IA32, PcdsFeatureFlag.X64] # # Use Openssl NASM assembly source files that assume Windows calling convention # if the family is MSFT or the toolchain is CLANGPDB for Windows or Linux. diff --git a/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf b/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf index 2498ac38a176..39ea31a34b50 100644 --- a/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf +++ b/CryptoPkg/Library/MbedTlsLib/MbedTlsLib.inf @@ -129,7 +129,7 @@ # GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS - GCC:*_*_AARCH64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable -Wno-error=format + GCC:*_*_AARCH64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable -Wno-error=format GCC:*_*_RISCV64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_CLANGDWARF_*_CC_FLAGS = -std=gnu99 -Wno-error=uninitialized diff --git a/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf b/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf index 8485f9920a1b..e489cadd5d19 100644 --- a/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf +++ b/CryptoPkg/Library/MbedTlsLib/MbedTlsLibFull.inf @@ -134,7 +134,7 @@ # GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable GCC:*_*_X64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS - GCC:*_*_AARCH64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable -Wno-error=format + GCC:*_*_AARCH64_CC_FLAGS = -U_WIN32 -U_WIN64 -U_MSC_VER -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable -Wno-error=format GCC:*_*_RISCV64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_CLANGDWARF_*_CC_FLAGS = -std=gnu99 -Wno-error=uninitialized diff --git a/CryptoPkg/Library/OpensslLib/OpensslLib.inf b/CryptoPkg/Library/OpensslLib/OpensslLib.inf index e4b19233950d..3bdc80a02687 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLib.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLib.inf @@ -780,7 +780,7 @@ GCC:*_*_RISCV64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_CLANGDWARF_*_CC_FLAGS = -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize - GCC:*_CLANGPDB_*_CC_FLAGS = -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize -Wno-error=unused-function + GCC:*_CLANGPDB_*_CC_FLAGS = -U_WIN32 -UWIN32 -U_WIN64 -U_MSC_VER -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize -Wno-error=unused-function # Revisit after switching to 3.0 branch GCC:*_GCC5_*_CC_FLAGS = -Wno-unused-but-set-variable diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf index 3743ffd8db98..a348377dab97 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf @@ -2230,7 +2230,7 @@ GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -UWIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable GCC:*_*_X64_CC_FLAGS = -U_WIN32 -UWIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS GCC:*_CLANGDWARF_*_CC_FLAGS = -std=gnu99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize - GCC:*_CLANGPDB_*_CC_FLAGS = -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize -Wno-error=unused-function + GCC:*_CLANGPDB_*_CC_FLAGS = -U_WIN32 -UWIN32 -U_WIN64 -U_MSC_VER -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize -Wno-error=unused-function # Revisit after switching to 3.0 branch GCC:*_GCC5_*_CC_FLAGS = -Wno-unused-but-set-variable diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf index 200e5de73425..2c66b58ecb50 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf @@ -730,7 +730,7 @@ GCC:*_*_RISCV64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_CLANGDWARF_*_CC_FLAGS = -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize - GCC:*_CLANGPDB_*_CC_FLAGS = -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize -Wno-error=unused-function + GCC:*_CLANGPDB_*_CC_FLAGS = -U_WIN32 -UWIN32 -U_WIN64 -U_MSC_VER -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize -Wno-error=unused-function # Revisit after switching to 3.0 branch GCC:*_GCC5_*_CC_FLAGS = -Wno-unused-but-set-variable diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf index 32f24619513d..138e962e30c8 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibFull.inf @@ -836,7 +836,7 @@ GCC:*_*_RISCV64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_*_LOONGARCH64_CC_FLAGS = $(OPENSSL_FLAGS) -Wno-error=maybe-uninitialized -Wno-format -Wno-error=unused-but-set-variable GCC:*_CLANGDWARF_*_CC_FLAGS = -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize - GCC:*_CLANGPDB_*_CC_FLAGS = -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize -Wno-error=unused-function + GCC:*_CLANGPDB_*_CC_FLAGS = -U_WIN32 -UWIN32 -U_WIN64 -U_MSC_VER -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize -Wno-error=unused-function # Revisit after switching to 3.0 branch GCC:*_GCC5_*_CC_FLAGS = -Wno-unused-but-set-variable diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf index c5961fbfb62c..91b5dd6c29df 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf @@ -2391,7 +2391,7 @@ GCC:*_*_IA32_CC_FLAGS = -U_WIN32 -UWIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_IA32) -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable GCC:*_*_X64_CC_FLAGS = -U_WIN32 -UWIN32 -U_WIN64 -U_MSC_VER $(OPENSSL_FLAGS) $(OPENSSL_FLAGS_X64) -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS GCC:*_CLANGDWARF_*_CC_FLAGS = -std=gnu99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize - GCC:*_CLANGPDB_*_CC_FLAGS = -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize -Wno-error=unused-function + GCC:*_CLANGPDB_*_CC_FLAGS = -U_WIN32 -UWIN32 -U_WIN64 -U_MSC_VER -std=c99 -Wno-error=uninitialized -Wno-error=incompatible-pointer-types -Wno-error=pointer-sign -Wno-error=implicit-function-declaration -Wno-error=ignored-pragma-optimize -Wno-error=unused-function # Revisit after switching to 3.0 branch GCC:*_GCC5_*_CC_FLAGS = -Wno-unused-but-set-variable From 3f677aa69ec03c0b7198a628ae3908ffbc67d4e5 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Mon, 5 Jan 2026 16:14:22 -0800 Subject: [PATCH 1026/1172] CryptoPkg: Add AARCH64-PE Target to OpenSSL Gen CLANGPDB does not support the same asm syntax as GCC/CLANGDWARF. As a result, the autogenerated ASM files in CryptoPkg need a new flavor for CLANGPDB, which is supported by OpenSSL. This adds support to the autogeneration script to support the new flavor, as well as running the script and checking in the generated asm files. To reflect the intention better than toolchain name (as AARCH64-GCC is already out of date), the directories are renamed to AARCH64-ELF (the former AARCH64-GCC) and AARCH64-PE (what CLANGPDB uses). In order to support this, a new PCD is introduced in CryptoPkg, gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe which instructs the build system to include the PE target asm files or the ELF target asm files. GCC and CLANGDWARF will use the ELF target files and CLANGPDB uses the PE target files. This matches the X64 behavior to toggle between the asm files. Signed-off-by: Oliver Smith-Denny --- CryptoPkg/CryptoPkg.dec | 9 + CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc | 10 + .../crypto/aes/aesv8-armx.S | 0 .../crypto/aes/bsaes-armv8.S | 0 .../crypto/aes/vpaes-armv8.S | 0 .../crypto/arm64cpuid.S | 0 .../crypto/bn/armv8-mont.S | 0 .../crypto/ec/ecp_nistz256-armv8.S | 0 .../crypto/md5/md5-aarch64.S | 0 .../crypto/modes/aes-gcm-armv8-unroll8_64.S | 0 .../crypto/modes/aes-gcm-armv8_64.S | 0 .../crypto/modes/ghashv8-armx.S | 0 .../crypto/sha/keccak1600-armv8.S | 0 .../crypto/sha/sha1-armv8.S | 0 .../crypto/sha/sha256-armv8.S | 0 .../crypto/sha/sha512-armv8.S | 0 .../crypto/sm3/sm3-armv8.S | 0 .../AARCH64-PE/crypto/aes/aesv8-armx.S | 3936 ++++++++ .../AARCH64-PE/crypto/aes/bsaes-armv8.S | 2369 +++++ .../AARCH64-PE/crypto/aes/vpaes-armv8.S | 1258 +++ .../OpensslGen/AARCH64-PE/crypto/arm64cpuid.S | 310 + .../AARCH64-PE/crypto/bn/armv8-mont.S | 2144 +++++ .../AARCH64-PE/crypto/ec/ecp_nistz256-armv8.S | 4338 +++++++++ .../AARCH64-PE/crypto/md5/md5-aarch64.S | 677 ++ .../crypto/modes/aes-gcm-armv8-unroll8_64.S | 8499 +++++++++++++++++ .../crypto/modes/aes-gcm-armv8_64.S | 6408 +++++++++++++ .../AARCH64-PE/crypto/modes/ghashv8-armx.S | 652 ++ .../AARCH64-PE/crypto/sha/keccak1600-armv8.S | 1033 ++ .../AARCH64-PE/crypto/sha/sha1-armv8.S | 1222 +++ .../AARCH64-PE/crypto/sha/sha256-armv8.S | 2068 ++++ .../AARCH64-PE/crypto/sha/sha512-armv8.S | 1618 ++++ .../AARCH64-PE/crypto/sm3/sm3-armv8.S | 507 + .../Library/OpensslLib/OpensslLibAccel.inf | 42 +- .../OpensslLib/OpensslLibFullAccel.inf | 42 +- CryptoPkg/Library/OpensslLib/UefiAsm.conf | 7 +- CryptoPkg/Library/OpensslLib/configure.py | 12 +- 36 files changed, 37128 insertions(+), 33 deletions(-) rename CryptoPkg/Library/OpensslLib/OpensslGen/{AARCH64-GCC => AARCH64-ELF}/crypto/aes/aesv8-armx.S (100%) rename CryptoPkg/Library/OpensslLib/OpensslGen/{AARCH64-GCC => AARCH64-ELF}/crypto/aes/bsaes-armv8.S (100%) rename CryptoPkg/Library/OpensslLib/OpensslGen/{AARCH64-GCC => AARCH64-ELF}/crypto/aes/vpaes-armv8.S (100%) rename CryptoPkg/Library/OpensslLib/OpensslGen/{AARCH64-GCC => AARCH64-ELF}/crypto/arm64cpuid.S (100%) rename CryptoPkg/Library/OpensslLib/OpensslGen/{AARCH64-GCC => AARCH64-ELF}/crypto/bn/armv8-mont.S (100%) rename CryptoPkg/Library/OpensslLib/OpensslGen/{AARCH64-GCC => AARCH64-ELF}/crypto/ec/ecp_nistz256-armv8.S (100%) rename CryptoPkg/Library/OpensslLib/OpensslGen/{AARCH64-GCC => AARCH64-ELF}/crypto/md5/md5-aarch64.S (100%) rename CryptoPkg/Library/OpensslLib/OpensslGen/{AARCH64-GCC => AARCH64-ELF}/crypto/modes/aes-gcm-armv8-unroll8_64.S (100%) rename CryptoPkg/Library/OpensslLib/OpensslGen/{AARCH64-GCC => AARCH64-ELF}/crypto/modes/aes-gcm-armv8_64.S (100%) rename CryptoPkg/Library/OpensslLib/OpensslGen/{AARCH64-GCC => AARCH64-ELF}/crypto/modes/ghashv8-armx.S (100%) rename CryptoPkg/Library/OpensslLib/OpensslGen/{AARCH64-GCC => AARCH64-ELF}/crypto/sha/keccak1600-armv8.S (100%) rename CryptoPkg/Library/OpensslLib/OpensslGen/{AARCH64-GCC => AARCH64-ELF}/crypto/sha/sha1-armv8.S (100%) rename CryptoPkg/Library/OpensslLib/OpensslGen/{AARCH64-GCC => AARCH64-ELF}/crypto/sha/sha256-armv8.S (100%) rename CryptoPkg/Library/OpensslLib/OpensslGen/{AARCH64-GCC => AARCH64-ELF}/crypto/sha/sha512-armv8.S (100%) rename CryptoPkg/Library/OpensslLib/OpensslGen/{AARCH64-GCC => AARCH64-ELF}/crypto/sm3/sm3-armv8.S (100%) create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/aes/aesv8-armx.S create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/aes/bsaes-armv8.S create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/aes/vpaes-armv8.S create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/arm64cpuid.S create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/bn/armv8-mont.S create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/ec/ecp_nistz256-armv8.S create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/md5/md5-aarch64.S create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/modes/aes-gcm-armv8-unroll8_64.S create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/modes/aes-gcm-armv8_64.S create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/modes/ghashv8-armx.S create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sha/keccak1600-armv8.S create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sha/sha1-armv8.S create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sha/sha256-armv8.S create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sha/sha512-armv8.S create mode 100644 CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sm3/sm3-armv8.S diff --git a/CryptoPkg/CryptoPkg.dec b/CryptoPkg/CryptoPkg.dec index 9519b288fd11..2493b716da95 100644 --- a/CryptoPkg/CryptoPkg.dec +++ b/CryptoPkg/CryptoPkg.dec @@ -85,6 +85,15 @@ # @Prompt Use NASM assembly source files for optimized version of OpensslLib for IA32/X64 gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm|FALSE|BOOLEAN|0x00000003 +[PcdsFeatureFlag.AARCH64] + ## Enable the use of PE target assembly source files when building an optimized + # version of OpensslLib from generated assembly source files for AARCH64. + # The generated PE target assembly source files only work with the CLANGPDB toolchain. + # GCC and CLANGDWARF must use the ELF target assembly source files. + # The default setting is to not use the PE target assembly source files. + # @Prompt Use PE target assembly source files for optimized version of OpensslLib for AARCH64 + gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe|FALSE|BOOLEAN|0x00000004 + [PcdsFixedAtBuild] ## Enable/Disable the families and individual services produced by the # EDK II Crypto Protocols/PPIs. The default is all services disabled. diff --git a/CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc b/CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc index a61d77a4ea16..1f33089a7b02 100644 --- a/CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc +++ b/CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc @@ -22,3 +22,13 @@ gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm|TRUE !if $(HOST_BASED_UNIT_TESTING_ENABLED) AND $(WIN_HOST_BUILD) gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm|TRUE !endif + +[PcdsFeatureFlag.AARCH64] +# +# Use the PE target assembly source files when building with the CLANGPDB +# toolchain. +# GCC and CLANGDWARF use the default PCD value of ELF target assembly source files. +# +!if "$(TOOL_CHAIN_TAG)" == "CLANGPDB" +gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe|TRUE +!endif diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/aesv8-armx.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/aes/aesv8-armx.S similarity index 100% rename from CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/aesv8-armx.S rename to CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/aes/aesv8-armx.S diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/bsaes-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/aes/bsaes-armv8.S similarity index 100% rename from CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/bsaes-armv8.S rename to CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/aes/bsaes-armv8.S diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/vpaes-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/aes/vpaes-armv8.S similarity index 100% rename from CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/aes/vpaes-armv8.S rename to CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/aes/vpaes-armv8.S diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/arm64cpuid.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/arm64cpuid.S similarity index 100% rename from CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/arm64cpuid.S rename to CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/arm64cpuid.S diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/bn/armv8-mont.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/bn/armv8-mont.S similarity index 100% rename from CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/bn/armv8-mont.S rename to CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/bn/armv8-mont.S diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/ec/ecp_nistz256-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/ec/ecp_nistz256-armv8.S similarity index 100% rename from CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/ec/ecp_nistz256-armv8.S rename to CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/ec/ecp_nistz256-armv8.S diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/md5/md5-aarch64.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/md5/md5-aarch64.S similarity index 100% rename from CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/md5/md5-aarch64.S rename to CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/md5/md5-aarch64.S diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/aes-gcm-armv8-unroll8_64.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/modes/aes-gcm-armv8-unroll8_64.S similarity index 100% rename from CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/aes-gcm-armv8-unroll8_64.S rename to CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/modes/aes-gcm-armv8-unroll8_64.S diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/aes-gcm-armv8_64.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/modes/aes-gcm-armv8_64.S similarity index 100% rename from CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/aes-gcm-armv8_64.S rename to CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/modes/aes-gcm-armv8_64.S diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/ghashv8-armx.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/modes/ghashv8-armx.S similarity index 100% rename from CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/modes/ghashv8-armx.S rename to CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/modes/ghashv8-armx.S diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/keccak1600-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/sha/keccak1600-armv8.S similarity index 100% rename from CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/keccak1600-armv8.S rename to CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/sha/keccak1600-armv8.S diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha1-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/sha/sha1-armv8.S similarity index 100% rename from CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha1-armv8.S rename to CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/sha/sha1-armv8.S diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha256-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/sha/sha256-armv8.S similarity index 100% rename from CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha256-armv8.S rename to CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/sha/sha256-armv8.S diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha512-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/sha/sha512-armv8.S similarity index 100% rename from CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sha/sha512-armv8.S rename to CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/sha/sha512-armv8.S diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sm3/sm3-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/sm3/sm3-armv8.S similarity index 100% rename from CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-GCC/crypto/sm3/sm3-armv8.S rename to CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-ELF/crypto/sm3/sm3-armv8.S diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/aes/aesv8-armx.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/aes/aesv8-armx.S new file mode 100644 index 000000000000..29925f1531f1 --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/aes/aesv8-armx.S @@ -0,0 +1,3936 @@ +#include "arm_arch.h" + +#if __ARM_MAX_ARCH__>=7 +.arch armv8-a+crypto +.text +.section .rodata +.align 5 +Lrcon: +.long 0x01,0x01,0x01,0x01 +.long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d // rotate-n-splat +.long 0x1b,0x1b,0x1b,0x1b +.text +.globl aes_v8_set_encrypt_key +.def aes_v8_set_encrypt_key + .type 32 +.endef +.align 5 +aes_v8_set_encrypt_key: +Lenc_key: + AARCH64_VALID_CALL_TARGET + // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + mov x3,#-1 + cmp x0,#0 + b.eq Lenc_key_abort + cmp x2,#0 + b.eq Lenc_key_abort + mov x3,#-2 + cmp w1,#128 + b.lt Lenc_key_abort + cmp w1,#256 + b.gt Lenc_key_abort + tst w1,#0x3f + b.ne Lenc_key_abort + + adrp x3,Lrcon + add x3,x3,:lo12:Lrcon + cmp w1,#192 + + eor v0.16b,v0.16b,v0.16b + ld1 {v3.16b},[x0],#16 + mov w1,#8 // reuse w1 + ld1 {v1.4s,v2.4s},[x3],#32 + + b.lt Loop128 + b.eq L192 + b L256 + +.align 4 +Loop128: + tbl v6.16b,{v3.16b},v2.16b + ext v5.16b,v0.16b,v3.16b,#12 + st1 {v3.4s},[x2],#16 + aese v6.16b,v0.16b + subs w1,w1,#1 + + eor v3.16b,v3.16b,v5.16b + ext v5.16b,v0.16b,v5.16b,#12 + eor v3.16b,v3.16b,v5.16b + ext v5.16b,v0.16b,v5.16b,#12 + eor v6.16b,v6.16b,v1.16b + eor v3.16b,v3.16b,v5.16b + shl v1.16b,v1.16b,#1 + eor v3.16b,v3.16b,v6.16b + b.ne Loop128 + + ld1 {v1.4s},[x3] + + tbl v6.16b,{v3.16b},v2.16b + ext v5.16b,v0.16b,v3.16b,#12 + st1 {v3.4s},[x2],#16 + aese v6.16b,v0.16b + + eor v3.16b,v3.16b,v5.16b + ext v5.16b,v0.16b,v5.16b,#12 + eor v3.16b,v3.16b,v5.16b + ext v5.16b,v0.16b,v5.16b,#12 + eor v6.16b,v6.16b,v1.16b + eor v3.16b,v3.16b,v5.16b + shl v1.16b,v1.16b,#1 + eor v3.16b,v3.16b,v6.16b + + tbl v6.16b,{v3.16b},v2.16b + ext v5.16b,v0.16b,v3.16b,#12 + st1 {v3.4s},[x2],#16 + aese v6.16b,v0.16b + + eor v3.16b,v3.16b,v5.16b + ext v5.16b,v0.16b,v5.16b,#12 + eor v3.16b,v3.16b,v5.16b + ext v5.16b,v0.16b,v5.16b,#12 + eor v6.16b,v6.16b,v1.16b + eor v3.16b,v3.16b,v5.16b + eor v3.16b,v3.16b,v6.16b + st1 {v3.4s},[x2] + add x2,x2,#0x50 + + mov w12,#10 + b Ldone + +.align 4 +L192: + ld1 {v4.8b},[x0],#8 + movi v6.16b,#8 // borrow v6.16b + st1 {v3.4s},[x2],#16 + sub v2.16b,v2.16b,v6.16b // adjust the mask + +Loop192: + tbl v6.16b,{v4.16b},v2.16b + ext v5.16b,v0.16b,v3.16b,#12 +#ifdef __AARCH64EB__ + st1 {v4.4s},[x2],#16 + sub x2,x2,#8 +#else + st1 {v4.8b},[x2],#8 +#endif + aese v6.16b,v0.16b + subs w1,w1,#1 + + eor v3.16b,v3.16b,v5.16b + ext v5.16b,v0.16b,v5.16b,#12 + eor v3.16b,v3.16b,v5.16b + ext v5.16b,v0.16b,v5.16b,#12 + eor v3.16b,v3.16b,v5.16b + + dup v5.4s,v3.s[3] + eor v5.16b,v5.16b,v4.16b + eor v6.16b,v6.16b,v1.16b + ext v4.16b,v0.16b,v4.16b,#12 + shl v1.16b,v1.16b,#1 + eor v4.16b,v4.16b,v5.16b + eor v3.16b,v3.16b,v6.16b + eor v4.16b,v4.16b,v6.16b + st1 {v3.4s},[x2],#16 + b.ne Loop192 + + mov w12,#12 + add x2,x2,#0x20 + b Ldone + +.align 4 +L256: + ld1 {v4.16b},[x0] + mov w1,#7 + mov w12,#14 + st1 {v3.4s},[x2],#16 + +Loop256: + tbl v6.16b,{v4.16b},v2.16b + ext v5.16b,v0.16b,v3.16b,#12 + st1 {v4.4s},[x2],#16 + aese v6.16b,v0.16b + subs w1,w1,#1 + + eor v3.16b,v3.16b,v5.16b + ext v5.16b,v0.16b,v5.16b,#12 + eor v3.16b,v3.16b,v5.16b + ext v5.16b,v0.16b,v5.16b,#12 + eor v6.16b,v6.16b,v1.16b + eor v3.16b,v3.16b,v5.16b + shl v1.16b,v1.16b,#1 + eor v3.16b,v3.16b,v6.16b + st1 {v3.4s},[x2],#16 + b.eq Ldone + + dup v6.4s,v3.s[3] // just splat + ext v5.16b,v0.16b,v4.16b,#12 + aese v6.16b,v0.16b + + eor v4.16b,v4.16b,v5.16b + ext v5.16b,v0.16b,v5.16b,#12 + eor v4.16b,v4.16b,v5.16b + ext v5.16b,v0.16b,v5.16b,#12 + eor v4.16b,v4.16b,v5.16b + + eor v4.16b,v4.16b,v6.16b + b Loop256 + +Ldone: + str w12,[x2] + mov x3,#0 + +Lenc_key_abort: + mov x0,x3 // return value + ldr x29,[sp],#16 + ret + + +.globl aes_v8_set_decrypt_key +.def aes_v8_set_decrypt_key + .type 32 +.endef +.align 5 +aes_v8_set_decrypt_key: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + bl Lenc_key + + cmp x0,#0 + b.ne Ldec_key_abort + + sub x2,x2,#240 // restore original x2 + mov x4,#-16 + add x0,x2,x12,lsl#4 // end of key schedule + + ld1 {v0.4s},[x2] + ld1 {v1.4s},[x0] + st1 {v0.4s},[x0],x4 + st1 {v1.4s},[x2],#16 + +Loop_imc: + ld1 {v0.4s},[x2] + ld1 {v1.4s},[x0] + aesimc v0.16b,v0.16b + aesimc v1.16b,v1.16b + st1 {v0.4s},[x0],x4 + st1 {v1.4s},[x2],#16 + cmp x0,x2 + b.hi Loop_imc + + ld1 {v0.4s},[x2] + aesimc v0.16b,v0.16b + st1 {v0.4s},[x0] + + eor x0,x0,x0 // return value +Ldec_key_abort: + ldp x29,x30,[sp],#16 + AARCH64_VALIDATE_LINK_REGISTER + ret + +.globl aes_v8_encrypt +.def aes_v8_encrypt + .type 32 +.endef +.align 5 +aes_v8_encrypt: + AARCH64_VALID_CALL_TARGET + ldr w3,[x2,#240] + ld1 {v0.4s},[x2],#16 + ld1 {v2.16b},[x0] + sub w3,w3,#2 + ld1 {v1.4s},[x2],#16 + +Loop_enc: + aese v2.16b,v0.16b + aesmc v2.16b,v2.16b + ld1 {v0.4s},[x2],#16 + subs w3,w3,#2 + aese v2.16b,v1.16b + aesmc v2.16b,v2.16b + ld1 {v1.4s},[x2],#16 + b.gt Loop_enc + + aese v2.16b,v0.16b + aesmc v2.16b,v2.16b + ld1 {v0.4s},[x2] + aese v2.16b,v1.16b + eor v2.16b,v2.16b,v0.16b + + st1 {v2.16b},[x1] + ret + +.globl aes_v8_decrypt +.def aes_v8_decrypt + .type 32 +.endef +.align 5 +aes_v8_decrypt: + AARCH64_VALID_CALL_TARGET + ldr w3,[x2,#240] + ld1 {v0.4s},[x2],#16 + ld1 {v2.16b},[x0] + sub w3,w3,#2 + ld1 {v1.4s},[x2],#16 + +Loop_dec: + aesd v2.16b,v0.16b + aesimc v2.16b,v2.16b + ld1 {v0.4s},[x2],#16 + subs w3,w3,#2 + aesd v2.16b,v1.16b + aesimc v2.16b,v2.16b + ld1 {v1.4s},[x2],#16 + b.gt Loop_dec + + aesd v2.16b,v0.16b + aesimc v2.16b,v2.16b + ld1 {v0.4s},[x2] + aesd v2.16b,v1.16b + eor v2.16b,v2.16b,v0.16b + + st1 {v2.16b},[x1] + ret + +.globl aes_v8_ecb_encrypt +.def aes_v8_ecb_encrypt + .type 32 +.endef +.align 5 +aes_v8_ecb_encrypt: + AARCH64_VALID_CALL_TARGET + subs x2,x2,#16 + // Original input data size bigger than 16, jump to big size processing. + b.ne Lecb_big_size + ld1 {v0.16b},[x0] + cmp w4,#0 // en- or decrypting? + ldr w5,[x3,#240] + ld1 {v5.4s,v6.4s},[x3],#32 // load key schedule... + + b.eq Lecb_small_dec + aese v0.16b,v5.16b + aesmc v0.16b,v0.16b + ld1 {v16.4s,v17.4s},[x3],#32 // load key schedule... + aese v0.16b,v6.16b + aesmc v0.16b,v0.16b + subs w5,w5,#10 // if rounds==10, jump to aes-128-ecb processing + b.eq Lecb_128_enc +Lecb_round_loop: + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + ld1 {v16.4s},[x3],#16 // load key schedule... + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + ld1 {v17.4s},[x3],#16 // load key schedule... + subs w5,w5,#2 // bias + b.gt Lecb_round_loop +Lecb_128_enc: + ld1 {v18.4s,v19.4s},[x3],#32 // load key schedule... + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + ld1 {v20.4s,v21.4s},[x3],#32 // load key schedule... + aese v0.16b,v18.16b + aesmc v0.16b,v0.16b + aese v0.16b,v19.16b + aesmc v0.16b,v0.16b + ld1 {v22.4s,v23.4s},[x3],#32 // load key schedule... + aese v0.16b,v20.16b + aesmc v0.16b,v0.16b + aese v0.16b,v21.16b + aesmc v0.16b,v0.16b + ld1 {v7.4s},[x3] + aese v0.16b,v22.16b + aesmc v0.16b,v0.16b + aese v0.16b,v23.16b + eor v0.16b,v0.16b,v7.16b + st1 {v0.16b},[x1] + b Lecb_Final_abort +Lecb_small_dec: + aesd v0.16b,v5.16b + aesimc v0.16b,v0.16b + ld1 {v16.4s,v17.4s},[x3],#32 // load key schedule... + aesd v0.16b,v6.16b + aesimc v0.16b,v0.16b + subs w5,w5,#10 // bias + b.eq Lecb_128_dec +Lecb_dec_round_loop: + aesd v0.16b,v16.16b + aesimc v0.16b,v0.16b + ld1 {v16.4s},[x3],#16 // load key schedule... + aesd v0.16b,v17.16b + aesimc v0.16b,v0.16b + ld1 {v17.4s},[x3],#16 // load key schedule... + subs w5,w5,#2 // bias + b.gt Lecb_dec_round_loop +Lecb_128_dec: + ld1 {v18.4s,v19.4s},[x3],#32 // load key schedule... + aesd v0.16b,v16.16b + aesimc v0.16b,v0.16b + aesd v0.16b,v17.16b + aesimc v0.16b,v0.16b + ld1 {v20.4s,v21.4s},[x3],#32 // load key schedule... + aesd v0.16b,v18.16b + aesimc v0.16b,v0.16b + aesd v0.16b,v19.16b + aesimc v0.16b,v0.16b + ld1 {v22.4s,v23.4s},[x3],#32 // load key schedule... + aesd v0.16b,v20.16b + aesimc v0.16b,v0.16b + aesd v0.16b,v21.16b + aesimc v0.16b,v0.16b + ld1 {v7.4s},[x3] + aesd v0.16b,v22.16b + aesimc v0.16b,v0.16b + aesd v0.16b,v23.16b + eor v0.16b,v0.16b,v7.16b + st1 {v0.16b},[x1] + b Lecb_Final_abort +Lecb_big_size: + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + mov x8,#16 + b.lo Lecb_done + csel x8,xzr,x8,eq + + cmp w4,#0 // en- or decrypting? + ldr w5,[x3,#240] + and x2,x2,#-16 + ld1 {v0.16b},[x0],x8 + + ld1 {v16.4s,v17.4s},[x3] // load key schedule... + sub w5,w5,#6 + add x7,x3,x5,lsl#4 // pointer to last 7 round keys + sub w5,w5,#2 + ld1 {v18.4s,v19.4s},[x7],#32 + ld1 {v20.4s,v21.4s},[x7],#32 + ld1 {v22.4s,v23.4s},[x7],#32 + ld1 {v7.4s},[x7] + + add x7,x3,#32 + mov w6,w5 + b.eq Lecb_dec + + ld1 {v1.16b},[x0],#16 + subs x2,x2,#32 // bias + add w6,w5,#2 + orr v3.16b,v1.16b,v1.16b + orr v24.16b,v1.16b,v1.16b + orr v1.16b,v0.16b,v0.16b + b.lo Lecb_enc_tail + + orr v1.16b,v3.16b,v3.16b + ld1 {v24.16b},[x0],#16 + cmp x2,#32 + b.lo Loop3x_ecb_enc + + ld1 {v25.16b},[x0],#16 + ld1 {v26.16b},[x0],#16 + sub x2,x2,#32 // bias + mov w6,w5 + +Loop5x_ecb_enc: + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + aese v1.16b,v16.16b + aesmc v1.16b,v1.16b + aese v24.16b,v16.16b + aesmc v24.16b,v24.16b + aese v25.16b,v16.16b + aesmc v25.16b,v25.16b + aese v26.16b,v16.16b + aesmc v26.16b,v26.16b + ld1 {v16.4s},[x7],#16 + subs w6,w6,#2 + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + aese v1.16b,v17.16b + aesmc v1.16b,v1.16b + aese v24.16b,v17.16b + aesmc v24.16b,v24.16b + aese v25.16b,v17.16b + aesmc v25.16b,v25.16b + aese v26.16b,v17.16b + aesmc v26.16b,v26.16b + ld1 {v17.4s},[x7],#16 + b.gt Loop5x_ecb_enc + + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + aese v1.16b,v16.16b + aesmc v1.16b,v1.16b + aese v24.16b,v16.16b + aesmc v24.16b,v24.16b + aese v25.16b,v16.16b + aesmc v25.16b,v25.16b + aese v26.16b,v16.16b + aesmc v26.16b,v26.16b + cmp x2,#0x40 // because Lecb_enc_tail4x + sub x2,x2,#0x50 + + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + aese v1.16b,v17.16b + aesmc v1.16b,v1.16b + aese v24.16b,v17.16b + aesmc v24.16b,v24.16b + aese v25.16b,v17.16b + aesmc v25.16b,v25.16b + aese v26.16b,v17.16b + aesmc v26.16b,v26.16b + csel x6,xzr,x2,gt // borrow x6, w6, "gt" is not typo + mov x7,x3 + + aese v0.16b,v18.16b + aesmc v0.16b,v0.16b + aese v1.16b,v18.16b + aesmc v1.16b,v1.16b + aese v24.16b,v18.16b + aesmc v24.16b,v24.16b + aese v25.16b,v18.16b + aesmc v25.16b,v25.16b + aese v26.16b,v18.16b + aesmc v26.16b,v26.16b + add x0,x0,x6 // x0 is adjusted in such way that + // at exit from the loop v1.16b-v26.16b + // are loaded with last "words" + add x6,x2,#0x60 // because Lecb_enc_tail4x + + aese v0.16b,v19.16b + aesmc v0.16b,v0.16b + aese v1.16b,v19.16b + aesmc v1.16b,v1.16b + aese v24.16b,v19.16b + aesmc v24.16b,v24.16b + aese v25.16b,v19.16b + aesmc v25.16b,v25.16b + aese v26.16b,v19.16b + aesmc v26.16b,v26.16b + + aese v0.16b,v20.16b + aesmc v0.16b,v0.16b + aese v1.16b,v20.16b + aesmc v1.16b,v1.16b + aese v24.16b,v20.16b + aesmc v24.16b,v24.16b + aese v25.16b,v20.16b + aesmc v25.16b,v25.16b + aese v26.16b,v20.16b + aesmc v26.16b,v26.16b + + aese v0.16b,v21.16b + aesmc v0.16b,v0.16b + aese v1.16b,v21.16b + aesmc v1.16b,v1.16b + aese v24.16b,v21.16b + aesmc v24.16b,v24.16b + aese v25.16b,v21.16b + aesmc v25.16b,v25.16b + aese v26.16b,v21.16b + aesmc v26.16b,v26.16b + + aese v0.16b,v22.16b + aesmc v0.16b,v0.16b + aese v1.16b,v22.16b + aesmc v1.16b,v1.16b + aese v24.16b,v22.16b + aesmc v24.16b,v24.16b + aese v25.16b,v22.16b + aesmc v25.16b,v25.16b + aese v26.16b,v22.16b + aesmc v26.16b,v26.16b + + aese v0.16b,v23.16b + ld1 {v2.16b},[x0],#16 + aese v1.16b,v23.16b + ld1 {v3.16b},[x0],#16 + aese v24.16b,v23.16b + ld1 {v27.16b},[x0],#16 + aese v25.16b,v23.16b + ld1 {v28.16b},[x0],#16 + aese v26.16b,v23.16b + ld1 {v29.16b},[x0],#16 + cbz x6,Lecb_enc_tail4x + ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] + eor v4.16b,v7.16b,v0.16b + orr v0.16b,v2.16b,v2.16b + eor v5.16b,v7.16b,v1.16b + orr v1.16b,v3.16b,v3.16b + eor v17.16b,v7.16b,v24.16b + orr v24.16b,v27.16b,v27.16b + eor v30.16b,v7.16b,v25.16b + orr v25.16b,v28.16b,v28.16b + eor v31.16b,v7.16b,v26.16b + st1 {v4.16b},[x1],#16 + orr v26.16b,v29.16b,v29.16b + st1 {v5.16b},[x1],#16 + mov w6,w5 + st1 {v17.16b},[x1],#16 + ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] + st1 {v30.16b},[x1],#16 + st1 {v31.16b},[x1],#16 + b.hs Loop5x_ecb_enc + + add x2,x2,#0x50 + cbz x2,Lecb_done + + add w6,w5,#2 + subs x2,x2,#0x30 + orr v0.16b,v27.16b,v27.16b + orr v1.16b,v28.16b,v28.16b + orr v24.16b,v29.16b,v29.16b + b.lo Lecb_enc_tail + + b Loop3x_ecb_enc + +.align 4 +Lecb_enc_tail4x: + eor v5.16b,v7.16b,v1.16b + eor v17.16b,v7.16b,v24.16b + eor v30.16b,v7.16b,v25.16b + eor v31.16b,v7.16b,v26.16b + st1 {v5.16b},[x1],#16 + st1 {v17.16b},[x1],#16 + st1 {v30.16b},[x1],#16 + st1 {v31.16b},[x1],#16 + + b Lecb_done +.align 4 +Loop3x_ecb_enc: + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + aese v1.16b,v16.16b + aesmc v1.16b,v1.16b + aese v24.16b,v16.16b + aesmc v24.16b,v24.16b + ld1 {v16.4s},[x7],#16 + subs w6,w6,#2 + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + aese v1.16b,v17.16b + aesmc v1.16b,v1.16b + aese v24.16b,v17.16b + aesmc v24.16b,v24.16b + ld1 {v17.4s},[x7],#16 + b.gt Loop3x_ecb_enc + + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + aese v1.16b,v16.16b + aesmc v1.16b,v1.16b + aese v24.16b,v16.16b + aesmc v24.16b,v24.16b + subs x2,x2,#0x30 + csel x6,x2,x6,lo // x6, w6, is zero at this point + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + aese v1.16b,v17.16b + aesmc v1.16b,v1.16b + aese v24.16b,v17.16b + aesmc v24.16b,v24.16b + add x0,x0,x6 // x0 is adjusted in such way that + // at exit from the loop v1.16b-v24.16b + // are loaded with last "words" + mov x7,x3 + aese v0.16b,v20.16b + aesmc v0.16b,v0.16b + aese v1.16b,v20.16b + aesmc v1.16b,v1.16b + aese v24.16b,v20.16b + aesmc v24.16b,v24.16b + ld1 {v2.16b},[x0],#16 + aese v0.16b,v21.16b + aesmc v0.16b,v0.16b + aese v1.16b,v21.16b + aesmc v1.16b,v1.16b + aese v24.16b,v21.16b + aesmc v24.16b,v24.16b + ld1 {v3.16b},[x0],#16 + aese v0.16b,v22.16b + aesmc v0.16b,v0.16b + aese v1.16b,v22.16b + aesmc v1.16b,v1.16b + aese v24.16b,v22.16b + aesmc v24.16b,v24.16b + ld1 {v27.16b},[x0],#16 + aese v0.16b,v23.16b + aese v1.16b,v23.16b + aese v24.16b,v23.16b + ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] + add w6,w5,#2 + eor v4.16b,v7.16b,v0.16b + eor v5.16b,v7.16b,v1.16b + eor v24.16b,v24.16b,v7.16b + ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] + st1 {v4.16b},[x1],#16 + orr v0.16b,v2.16b,v2.16b + st1 {v5.16b},[x1],#16 + orr v1.16b,v3.16b,v3.16b + st1 {v24.16b},[x1],#16 + orr v24.16b,v27.16b,v27.16b + b.hs Loop3x_ecb_enc + + cmn x2,#0x30 + b.eq Lecb_done + nop + +Lecb_enc_tail: + aese v1.16b,v16.16b + aesmc v1.16b,v1.16b + aese v24.16b,v16.16b + aesmc v24.16b,v24.16b + ld1 {v16.4s},[x7],#16 + subs w6,w6,#2 + aese v1.16b,v17.16b + aesmc v1.16b,v1.16b + aese v24.16b,v17.16b + aesmc v24.16b,v24.16b + ld1 {v17.4s},[x7],#16 + b.gt Lecb_enc_tail + + aese v1.16b,v16.16b + aesmc v1.16b,v1.16b + aese v24.16b,v16.16b + aesmc v24.16b,v24.16b + aese v1.16b,v17.16b + aesmc v1.16b,v1.16b + aese v24.16b,v17.16b + aesmc v24.16b,v24.16b + aese v1.16b,v20.16b + aesmc v1.16b,v1.16b + aese v24.16b,v20.16b + aesmc v24.16b,v24.16b + cmn x2,#0x20 + aese v1.16b,v21.16b + aesmc v1.16b,v1.16b + aese v24.16b,v21.16b + aesmc v24.16b,v24.16b + aese v1.16b,v22.16b + aesmc v1.16b,v1.16b + aese v24.16b,v22.16b + aesmc v24.16b,v24.16b + aese v1.16b,v23.16b + aese v24.16b,v23.16b + b.eq Lecb_enc_one + eor v5.16b,v7.16b,v1.16b + eor v17.16b,v7.16b,v24.16b + st1 {v5.16b},[x1],#16 + st1 {v17.16b},[x1],#16 + b Lecb_done + +Lecb_enc_one: + eor v5.16b,v7.16b,v24.16b + st1 {v5.16b},[x1],#16 + b Lecb_done +.align 5 +Lecb_dec: + ld1 {v1.16b},[x0],#16 + subs x2,x2,#32 // bias + add w6,w5,#2 + orr v3.16b,v1.16b,v1.16b + orr v24.16b,v1.16b,v1.16b + orr v1.16b,v0.16b,v0.16b + b.lo Lecb_dec_tail + + orr v1.16b,v3.16b,v3.16b + ld1 {v24.16b},[x0],#16 + cmp x2,#32 + b.lo Loop3x_ecb_dec + + ld1 {v25.16b},[x0],#16 + ld1 {v26.16b},[x0],#16 + sub x2,x2,#32 // bias + mov w6,w5 + +Loop5x_ecb_dec: + aesd v0.16b,v16.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v16.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v16.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v16.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v16.16b + aesimc v26.16b,v26.16b + ld1 {v16.4s},[x7],#16 + subs w6,w6,#2 + aesd v0.16b,v17.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v17.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v17.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v17.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v17.16b + aesimc v26.16b,v26.16b + ld1 {v17.4s},[x7],#16 + b.gt Loop5x_ecb_dec + + aesd v0.16b,v16.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v16.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v16.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v16.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v16.16b + aesimc v26.16b,v26.16b + cmp x2,#0x40 // because Lecb_tail4x + sub x2,x2,#0x50 + + aesd v0.16b,v17.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v17.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v17.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v17.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v17.16b + aesimc v26.16b,v26.16b + csel x6,xzr,x2,gt // borrow x6, w6, "gt" is not typo + mov x7,x3 + + aesd v0.16b,v18.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v18.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v18.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v18.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v18.16b + aesimc v26.16b,v26.16b + add x0,x0,x6 // x0 is adjusted in such way that + // at exit from the loop v1.16b-v26.16b + // are loaded with last "words" + add x6,x2,#0x60 // because Lecb_tail4x + + aesd v0.16b,v19.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v19.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v19.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v19.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v19.16b + aesimc v26.16b,v26.16b + + aesd v0.16b,v20.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v20.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v20.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v20.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v20.16b + aesimc v26.16b,v26.16b + + aesd v0.16b,v21.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v21.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v21.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v21.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v21.16b + aesimc v26.16b,v26.16b + + aesd v0.16b,v22.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v22.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v22.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v22.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v22.16b + aesimc v26.16b,v26.16b + + aesd v0.16b,v23.16b + ld1 {v2.16b},[x0],#16 + aesd v1.16b,v23.16b + ld1 {v3.16b},[x0],#16 + aesd v24.16b,v23.16b + ld1 {v27.16b},[x0],#16 + aesd v25.16b,v23.16b + ld1 {v28.16b},[x0],#16 + aesd v26.16b,v23.16b + ld1 {v29.16b},[x0],#16 + cbz x6,Lecb_tail4x + ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] + eor v4.16b,v7.16b,v0.16b + orr v0.16b,v2.16b,v2.16b + eor v5.16b,v7.16b,v1.16b + orr v1.16b,v3.16b,v3.16b + eor v17.16b,v7.16b,v24.16b + orr v24.16b,v27.16b,v27.16b + eor v30.16b,v7.16b,v25.16b + orr v25.16b,v28.16b,v28.16b + eor v31.16b,v7.16b,v26.16b + st1 {v4.16b},[x1],#16 + orr v26.16b,v29.16b,v29.16b + st1 {v5.16b},[x1],#16 + mov w6,w5 + st1 {v17.16b},[x1],#16 + ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] + st1 {v30.16b},[x1],#16 + st1 {v31.16b},[x1],#16 + b.hs Loop5x_ecb_dec + + add x2,x2,#0x50 + cbz x2,Lecb_done + + add w6,w5,#2 + subs x2,x2,#0x30 + orr v0.16b,v27.16b,v27.16b + orr v1.16b,v28.16b,v28.16b + orr v24.16b,v29.16b,v29.16b + b.lo Lecb_dec_tail + + b Loop3x_ecb_dec + +.align 4 +Lecb_tail4x: + eor v5.16b,v7.16b,v1.16b + eor v17.16b,v7.16b,v24.16b + eor v30.16b,v7.16b,v25.16b + eor v31.16b,v7.16b,v26.16b + st1 {v5.16b},[x1],#16 + st1 {v17.16b},[x1],#16 + st1 {v30.16b},[x1],#16 + st1 {v31.16b},[x1],#16 + + b Lecb_done +.align 4 +Loop3x_ecb_dec: + aesd v0.16b,v16.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v16.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v16.16b + aesimc v24.16b,v24.16b + ld1 {v16.4s},[x7],#16 + subs w6,w6,#2 + aesd v0.16b,v17.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v17.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v17.16b + aesimc v24.16b,v24.16b + ld1 {v17.4s},[x7],#16 + b.gt Loop3x_ecb_dec + + aesd v0.16b,v16.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v16.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v16.16b + aesimc v24.16b,v24.16b + subs x2,x2,#0x30 + csel x6,x2,x6,lo // x6, w6, is zero at this point + aesd v0.16b,v17.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v17.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v17.16b + aesimc v24.16b,v24.16b + add x0,x0,x6 // x0 is adjusted in such way that + // at exit from the loop v1.16b-v24.16b + // are loaded with last "words" + mov x7,x3 + aesd v0.16b,v20.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v20.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v20.16b + aesimc v24.16b,v24.16b + ld1 {v2.16b},[x0],#16 + aesd v0.16b,v21.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v21.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v21.16b + aesimc v24.16b,v24.16b + ld1 {v3.16b},[x0],#16 + aesd v0.16b,v22.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v22.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v22.16b + aesimc v24.16b,v24.16b + ld1 {v27.16b},[x0],#16 + aesd v0.16b,v23.16b + aesd v1.16b,v23.16b + aesd v24.16b,v23.16b + ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] + add w6,w5,#2 + eor v4.16b,v7.16b,v0.16b + eor v5.16b,v7.16b,v1.16b + eor v24.16b,v24.16b,v7.16b + ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] + st1 {v4.16b},[x1],#16 + orr v0.16b,v2.16b,v2.16b + st1 {v5.16b},[x1],#16 + orr v1.16b,v3.16b,v3.16b + st1 {v24.16b},[x1],#16 + orr v24.16b,v27.16b,v27.16b + b.hs Loop3x_ecb_dec + + cmn x2,#0x30 + b.eq Lecb_done + nop + +Lecb_dec_tail: + aesd v1.16b,v16.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v16.16b + aesimc v24.16b,v24.16b + ld1 {v16.4s},[x7],#16 + subs w6,w6,#2 + aesd v1.16b,v17.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v17.16b + aesimc v24.16b,v24.16b + ld1 {v17.4s},[x7],#16 + b.gt Lecb_dec_tail + + aesd v1.16b,v16.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v16.16b + aesimc v24.16b,v24.16b + aesd v1.16b,v17.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v17.16b + aesimc v24.16b,v24.16b + aesd v1.16b,v20.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v20.16b + aesimc v24.16b,v24.16b + cmn x2,#0x20 + aesd v1.16b,v21.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v21.16b + aesimc v24.16b,v24.16b + aesd v1.16b,v22.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v22.16b + aesimc v24.16b,v24.16b + aesd v1.16b,v23.16b + aesd v24.16b,v23.16b + b.eq Lecb_dec_one + eor v5.16b,v7.16b,v1.16b + eor v17.16b,v7.16b,v24.16b + st1 {v5.16b},[x1],#16 + st1 {v17.16b},[x1],#16 + b Lecb_done + +Lecb_dec_one: + eor v5.16b,v7.16b,v24.16b + st1 {v5.16b},[x1],#16 + +Lecb_done: + ldr x29,[sp],#16 +Lecb_Final_abort: + ret + +.globl aes_v8_cbc_encrypt +.def aes_v8_cbc_encrypt + .type 32 +.endef +.align 5 +aes_v8_cbc_encrypt: + AARCH64_VALID_CALL_TARGET + // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + subs x2,x2,#16 + mov x8,#16 + b.lo Lcbc_abort + csel x8,xzr,x8,eq + + cmp w5,#0 // en- or decrypting? + ldr w5,[x3,#240] + and x2,x2,#-16 + ld1 {v6.16b},[x4] + ld1 {v0.16b},[x0],x8 + + ld1 {v16.4s,v17.4s},[x3] // load key schedule... + sub w5,w5,#6 + add x7,x3,x5,lsl#4 // pointer to last 7 round keys + sub w5,w5,#2 + ld1 {v18.4s,v19.4s},[x7],#32 + ld1 {v20.4s,v21.4s},[x7],#32 + ld1 {v22.4s,v23.4s},[x7],#32 + ld1 {v7.4s},[x7] + + add x7,x3,#32 + mov w6,w5 + b.eq Lcbc_dec + + cmp w5,#2 + eor v0.16b,v0.16b,v6.16b + eor v5.16b,v16.16b,v7.16b + b.eq Lcbc_enc128 + + ld1 {v2.4s,v3.4s},[x7] + add x7,x3,#16 + add x6,x3,#16*4 + add x12,x3,#16*5 + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + add x14,x3,#16*6 + add x3,x3,#16*7 + b Lenter_cbc_enc + +.align 4 +Loop_cbc_enc: + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + st1 {v6.16b},[x1],#16 +Lenter_cbc_enc: + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + aese v0.16b,v2.16b + aesmc v0.16b,v0.16b + ld1 {v16.4s},[x6] + cmp w5,#4 + aese v0.16b,v3.16b + aesmc v0.16b,v0.16b + ld1 {v17.4s},[x12] + b.eq Lcbc_enc192 + + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + ld1 {v16.4s},[x14] + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + ld1 {v17.4s},[x3] + nop + +Lcbc_enc192: + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + subs x2,x2,#16 + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + csel x8,xzr,x8,eq + aese v0.16b,v18.16b + aesmc v0.16b,v0.16b + aese v0.16b,v19.16b + aesmc v0.16b,v0.16b + ld1 {v16.16b},[x0],x8 + aese v0.16b,v20.16b + aesmc v0.16b,v0.16b + eor v16.16b,v16.16b,v5.16b + aese v0.16b,v21.16b + aesmc v0.16b,v0.16b + ld1 {v17.4s},[x7] // re-pre-load rndkey[1] + aese v0.16b,v22.16b + aesmc v0.16b,v0.16b + aese v0.16b,v23.16b + eor v6.16b,v0.16b,v7.16b + b.hs Loop_cbc_enc + + st1 {v6.16b},[x1],#16 + b Lcbc_done + +.align 5 +Lcbc_enc128: + ld1 {v2.4s,v3.4s},[x7] + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + b Lenter_cbc_enc128 +Loop_cbc_enc128: + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + st1 {v6.16b},[x1],#16 +Lenter_cbc_enc128: + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + subs x2,x2,#16 + aese v0.16b,v2.16b + aesmc v0.16b,v0.16b + csel x8,xzr,x8,eq + aese v0.16b,v3.16b + aesmc v0.16b,v0.16b + aese v0.16b,v18.16b + aesmc v0.16b,v0.16b + aese v0.16b,v19.16b + aesmc v0.16b,v0.16b + ld1 {v16.16b},[x0],x8 + aese v0.16b,v20.16b + aesmc v0.16b,v0.16b + aese v0.16b,v21.16b + aesmc v0.16b,v0.16b + aese v0.16b,v22.16b + aesmc v0.16b,v0.16b + eor v16.16b,v16.16b,v5.16b + aese v0.16b,v23.16b + eor v6.16b,v0.16b,v7.16b + b.hs Loop_cbc_enc128 + + st1 {v6.16b},[x1],#16 + b Lcbc_done +.align 5 +Lcbc_dec: + ld1 {v24.16b},[x0],#16 + subs x2,x2,#32 // bias + add w6,w5,#2 + orr v3.16b,v0.16b,v0.16b + orr v1.16b,v0.16b,v0.16b + orr v27.16b,v24.16b,v24.16b + b.lo Lcbc_dec_tail + + orr v1.16b,v24.16b,v24.16b + ld1 {v24.16b},[x0],#16 + orr v2.16b,v0.16b,v0.16b + orr v3.16b,v1.16b,v1.16b + orr v27.16b,v24.16b,v24.16b + cmp x2,#32 + b.lo Loop3x_cbc_dec + + ld1 {v25.16b},[x0],#16 + ld1 {v26.16b},[x0],#16 + sub x2,x2,#32 // bias + mov w6,w5 + orr v28.16b,v25.16b,v25.16b + orr v29.16b,v26.16b,v26.16b + +Loop5x_cbc_dec: + aesd v0.16b,v16.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v16.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v16.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v16.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v16.16b + aesimc v26.16b,v26.16b + ld1 {v16.4s},[x7],#16 + subs w6,w6,#2 + aesd v0.16b,v17.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v17.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v17.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v17.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v17.16b + aesimc v26.16b,v26.16b + ld1 {v17.4s},[x7],#16 + b.gt Loop5x_cbc_dec + + aesd v0.16b,v16.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v16.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v16.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v16.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v16.16b + aesimc v26.16b,v26.16b + cmp x2,#0x40 // because Lcbc_tail4x + sub x2,x2,#0x50 + + aesd v0.16b,v17.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v17.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v17.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v17.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v17.16b + aesimc v26.16b,v26.16b + csel x6,xzr,x2,gt // borrow x6, w6, "gt" is not typo + mov x7,x3 + + aesd v0.16b,v18.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v18.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v18.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v18.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v18.16b + aesimc v26.16b,v26.16b + add x0,x0,x6 // x0 is adjusted in such way that + // at exit from the loop v1.16b-v26.16b + // are loaded with last "words" + add x6,x2,#0x60 // because Lcbc_tail4x + + aesd v0.16b,v19.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v19.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v19.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v19.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v19.16b + aesimc v26.16b,v26.16b + + aesd v0.16b,v20.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v20.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v20.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v20.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v20.16b + aesimc v26.16b,v26.16b + + aesd v0.16b,v21.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v21.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v21.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v21.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v21.16b + aesimc v26.16b,v26.16b + + aesd v0.16b,v22.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v22.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v22.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v22.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v22.16b + aesimc v26.16b,v26.16b + + eor v4.16b,v6.16b,v7.16b + aesd v0.16b,v23.16b + eor v5.16b,v2.16b,v7.16b + ld1 {v2.16b},[x0],#16 + aesd v1.16b,v23.16b + eor v17.16b,v3.16b,v7.16b + ld1 {v3.16b},[x0],#16 + aesd v24.16b,v23.16b + eor v30.16b,v27.16b,v7.16b + ld1 {v27.16b},[x0],#16 + aesd v25.16b,v23.16b + eor v31.16b,v28.16b,v7.16b + ld1 {v28.16b},[x0],#16 + aesd v26.16b,v23.16b + orr v6.16b,v29.16b,v29.16b + ld1 {v29.16b},[x0],#16 + cbz x6,Lcbc_tail4x + ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] + eor v4.16b,v4.16b,v0.16b + orr v0.16b,v2.16b,v2.16b + eor v5.16b,v5.16b,v1.16b + orr v1.16b,v3.16b,v3.16b + eor v17.16b,v17.16b,v24.16b + orr v24.16b,v27.16b,v27.16b + eor v30.16b,v30.16b,v25.16b + orr v25.16b,v28.16b,v28.16b + eor v31.16b,v31.16b,v26.16b + st1 {v4.16b},[x1],#16 + orr v26.16b,v29.16b,v29.16b + st1 {v5.16b},[x1],#16 + mov w6,w5 + st1 {v17.16b},[x1],#16 + ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] + st1 {v30.16b},[x1],#16 + st1 {v31.16b},[x1],#16 + b.hs Loop5x_cbc_dec + + add x2,x2,#0x50 + cbz x2,Lcbc_done + + add w6,w5,#2 + subs x2,x2,#0x30 + orr v0.16b,v27.16b,v27.16b + orr v2.16b,v27.16b,v27.16b + orr v1.16b,v28.16b,v28.16b + orr v3.16b,v28.16b,v28.16b + orr v24.16b,v29.16b,v29.16b + orr v27.16b,v29.16b,v29.16b + b.lo Lcbc_dec_tail + + b Loop3x_cbc_dec + +.align 4 +Lcbc_tail4x: + eor v5.16b,v4.16b,v1.16b + eor v17.16b,v17.16b,v24.16b + eor v30.16b,v30.16b,v25.16b + eor v31.16b,v31.16b,v26.16b + st1 {v5.16b},[x1],#16 + st1 {v17.16b},[x1],#16 + st1 {v30.16b},[x1],#16 + st1 {v31.16b},[x1],#16 + + b Lcbc_done +.align 4 +Loop3x_cbc_dec: + aesd v0.16b,v16.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v16.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v16.16b + aesimc v24.16b,v24.16b + ld1 {v16.4s},[x7],#16 + subs w6,w6,#2 + aesd v0.16b,v17.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v17.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v17.16b + aesimc v24.16b,v24.16b + ld1 {v17.4s},[x7],#16 + b.gt Loop3x_cbc_dec + + aesd v0.16b,v16.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v16.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v16.16b + aesimc v24.16b,v24.16b + eor v4.16b,v6.16b,v7.16b + subs x2,x2,#0x30 + eor v5.16b,v2.16b,v7.16b + csel x6,x2,x6,lo // x6, w6, is zero at this point + aesd v0.16b,v17.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v17.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v17.16b + aesimc v24.16b,v24.16b + eor v17.16b,v3.16b,v7.16b + add x0,x0,x6 // x0 is adjusted in such way that + // at exit from the loop v1.16b-v24.16b + // are loaded with last "words" + orr v6.16b,v27.16b,v27.16b + mov x7,x3 + aesd v0.16b,v20.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v20.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v20.16b + aesimc v24.16b,v24.16b + ld1 {v2.16b},[x0],#16 + aesd v0.16b,v21.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v21.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v21.16b + aesimc v24.16b,v24.16b + ld1 {v3.16b},[x0],#16 + aesd v0.16b,v22.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v22.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v22.16b + aesimc v24.16b,v24.16b + ld1 {v27.16b},[x0],#16 + aesd v0.16b,v23.16b + aesd v1.16b,v23.16b + aesd v24.16b,v23.16b + ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] + add w6,w5,#2 + eor v4.16b,v4.16b,v0.16b + eor v5.16b,v5.16b,v1.16b + eor v24.16b,v24.16b,v17.16b + ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] + st1 {v4.16b},[x1],#16 + orr v0.16b,v2.16b,v2.16b + st1 {v5.16b},[x1],#16 + orr v1.16b,v3.16b,v3.16b + st1 {v24.16b},[x1],#16 + orr v24.16b,v27.16b,v27.16b + b.hs Loop3x_cbc_dec + + cmn x2,#0x30 + b.eq Lcbc_done + nop + +Lcbc_dec_tail: + aesd v1.16b,v16.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v16.16b + aesimc v24.16b,v24.16b + ld1 {v16.4s},[x7],#16 + subs w6,w6,#2 + aesd v1.16b,v17.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v17.16b + aesimc v24.16b,v24.16b + ld1 {v17.4s},[x7],#16 + b.gt Lcbc_dec_tail + + aesd v1.16b,v16.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v16.16b + aesimc v24.16b,v24.16b + aesd v1.16b,v17.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v17.16b + aesimc v24.16b,v24.16b + aesd v1.16b,v20.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v20.16b + aesimc v24.16b,v24.16b + cmn x2,#0x20 + aesd v1.16b,v21.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v21.16b + aesimc v24.16b,v24.16b + eor v5.16b,v6.16b,v7.16b + aesd v1.16b,v22.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v22.16b + aesimc v24.16b,v24.16b + eor v17.16b,v3.16b,v7.16b + aesd v1.16b,v23.16b + aesd v24.16b,v23.16b + b.eq Lcbc_dec_one + eor v5.16b,v5.16b,v1.16b + eor v17.16b,v17.16b,v24.16b + orr v6.16b,v27.16b,v27.16b + st1 {v5.16b},[x1],#16 + st1 {v17.16b},[x1],#16 + b Lcbc_done + +Lcbc_dec_one: + eor v5.16b,v5.16b,v24.16b + orr v6.16b,v27.16b,v27.16b + st1 {v5.16b},[x1],#16 + +Lcbc_done: + st1 {v6.16b},[x4] +Lcbc_abort: + ldr x29,[sp],#16 + ret + +.globl aes_v8_ctr32_encrypt_blocks_unroll12_eor3 +.def aes_v8_ctr32_encrypt_blocks_unroll12_eor3 + .type 32 +.endef +.align 5 +aes_v8_ctr32_encrypt_blocks_unroll12_eor3: + AARCH64_VALID_CALL_TARGET + // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. + stp x29,x30,[sp,#-80]! + stp d8,d9,[sp, #16] + stp d10,d11,[sp, #32] + stp d12,d13,[sp, #48] + stp d14,d15,[sp, #64] + add x29,sp,#0 + + ldr w5,[x3,#240] + + ldr w8, [x4, #12] +#ifdef __AARCH64EB__ + ld1 {v24.16b},[x4] +#else + ld1 {v24.4s},[x4] +#endif + ld1 {v2.4s,v3.4s},[x3] // load key schedule... + sub w5,w5,#4 + cmp x2,#2 + add x7,x3,x5,lsl#4 // pointer to last round key + sub w5,w5,#2 + add x7, x7, #64 + ld1 {v1.4s},[x7] + add x7,x3,#32 + mov w6,w5 +#ifndef __AARCH64EB__ + rev w8, w8 +#endif + + orr v25.16b,v24.16b,v24.16b + add w10, w8, #1 + orr v26.16b,v24.16b,v24.16b + add w8, w8, #2 + orr v0.16b,v24.16b,v24.16b + rev w10, w10 + mov v25.s[3],w10 + b.ls Lctr32_tail_unroll + cmp x2,#6 + rev w12, w8 + sub x2,x2,#3 // bias + mov v26.s[3],w12 + b.lo Loop3x_ctr32_unroll + cmp x2,#9 + orr v27.16b,v24.16b,v24.16b + add w11, w8, #1 + orr v28.16b,v24.16b,v24.16b + add w13, w8, #2 + rev w11, w11 + orr v29.16b,v24.16b,v24.16b + add w8, w8, #3 + rev w13, w13 + mov v27.s[3],w11 + rev w14, w8 + mov v28.s[3],w13 + mov v29.s[3],w14 + sub x2,x2,#3 + b.lo Loop6x_ctr32_unroll + + // push regs to stack when 12 data chunks are interleaved + stp x19,x20,[sp,#-16]! + stp x21,x22,[sp,#-16]! + stp x23,x24,[sp,#-16]! + stp d8,d9,[sp,#-32]! + stp d10,d11,[sp,#-32]! + + add w15,w8,#1 + add w19,w8,#2 + add w20,w8,#3 + add w21,w8,#4 + add w22,w8,#5 + add w8,w8,#6 + orr v30.16b,v24.16b,v24.16b + rev w15,w15 + orr v31.16b,v24.16b,v24.16b + rev w19,w19 + orr v8.16b,v24.16b,v24.16b + rev w20,w20 + orr v9.16b,v24.16b,v24.16b + rev w21,w21 + orr v10.16b,v24.16b,v24.16b + rev w22,w22 + orr v11.16b,v24.16b,v24.16b + rev w23,w8 + + sub x2,x2,#6 // bias + mov v30.s[3],w15 + mov v31.s[3],w19 + mov v8.s[3],w20 + mov v9.s[3],w21 + mov v10.s[3],w22 + mov v11.s[3],w23 + b Loop12x_ctr32_unroll + +.align 4 +Loop12x_ctr32_unroll: + aese v24.16b,v2.16b + aesmc v24.16b,v24.16b + aese v25.16b,v2.16b + aesmc v25.16b,v25.16b + aese v26.16b,v2.16b + aesmc v26.16b,v26.16b + aese v27.16b,v2.16b + aesmc v27.16b,v27.16b + aese v28.16b,v2.16b + aesmc v28.16b,v28.16b + aese v29.16b,v2.16b + aesmc v29.16b,v29.16b + aese v30.16b,v2.16b + aesmc v30.16b,v30.16b + aese v31.16b,v2.16b + aesmc v31.16b,v31.16b + aese v8.16b,v2.16b + aesmc v8.16b,v8.16b + aese v9.16b,v2.16b + aesmc v9.16b,v9.16b + aese v10.16b,v2.16b + aesmc v10.16b,v10.16b + aese v11.16b,v2.16b + aesmc v11.16b,v11.16b + ld1 {v2.4s},[x7],#16 + subs w6,w6,#2 + aese v24.16b,v3.16b + aesmc v24.16b,v24.16b + aese v25.16b,v3.16b + aesmc v25.16b,v25.16b + aese v26.16b,v3.16b + aesmc v26.16b,v26.16b + aese v27.16b,v3.16b + aesmc v27.16b,v27.16b + aese v28.16b,v3.16b + aesmc v28.16b,v28.16b + aese v29.16b,v3.16b + aesmc v29.16b,v29.16b + aese v30.16b,v3.16b + aesmc v30.16b,v30.16b + aese v31.16b,v3.16b + aesmc v31.16b,v31.16b + aese v8.16b,v3.16b + aesmc v8.16b,v8.16b + aese v9.16b,v3.16b + aesmc v9.16b,v9.16b + aese v10.16b,v3.16b + aesmc v10.16b,v10.16b + aese v11.16b,v3.16b + aesmc v11.16b,v11.16b + ld1 {v3.4s},[x7],#16 + b.gt Loop12x_ctr32_unroll + + aese v24.16b,v2.16b + aesmc v24.16b,v24.16b + aese v25.16b,v2.16b + aesmc v25.16b,v25.16b + aese v26.16b,v2.16b + aesmc v26.16b,v26.16b + aese v27.16b,v2.16b + aesmc v27.16b,v27.16b + aese v28.16b,v2.16b + aesmc v28.16b,v28.16b + aese v29.16b,v2.16b + aesmc v29.16b,v29.16b + aese v30.16b,v2.16b + aesmc v30.16b,v30.16b + aese v31.16b,v2.16b + aesmc v31.16b,v31.16b + aese v8.16b,v2.16b + aesmc v8.16b,v8.16b + aese v9.16b,v2.16b + aesmc v9.16b,v9.16b + aese v10.16b,v2.16b + aesmc v10.16b,v10.16b + aese v11.16b,v2.16b + aesmc v11.16b,v11.16b + ld1 {v2.4s},[x7],#16 + + aese v24.16b,v3.16b + aesmc v24.16b,v24.16b + aese v25.16b,v3.16b + aesmc v25.16b,v25.16b + aese v26.16b,v3.16b + aesmc v26.16b,v26.16b + aese v27.16b,v3.16b + aesmc v27.16b,v27.16b + aese v28.16b,v3.16b + aesmc v28.16b,v28.16b + aese v29.16b,v3.16b + aesmc v29.16b,v29.16b + aese v30.16b,v3.16b + aesmc v30.16b,v30.16b + aese v31.16b,v3.16b + aesmc v31.16b,v31.16b + aese v8.16b,v3.16b + aesmc v8.16b,v8.16b + aese v9.16b,v3.16b + aesmc v9.16b,v9.16b + aese v10.16b,v3.16b + aesmc v10.16b,v10.16b + aese v11.16b,v3.16b + aesmc v11.16b,v11.16b + ld1 {v3.4s},[x7],#16 + + aese v24.16b,v2.16b + aesmc v24.16b,v24.16b + add w9,w8,#1 + add w10,w8,#2 + aese v25.16b,v2.16b + aesmc v25.16b,v25.16b + add w12,w8,#3 + add w11,w8,#4 + aese v26.16b,v2.16b + aesmc v26.16b,v26.16b + add w13,w8,#5 + add w14,w8,#6 + rev w9,w9 + aese v27.16b,v2.16b + aesmc v27.16b,v27.16b + add w15,w8,#7 + add w19,w8,#8 + rev w10,w10 + rev w12,w12 + aese v28.16b,v2.16b + aesmc v28.16b,v28.16b + add w20,w8,#9 + add w21,w8,#10 + rev w11,w11 + rev w13,w13 + aese v29.16b,v2.16b + aesmc v29.16b,v29.16b + add w22,w8,#11 + add w23,w8,#12 + rev w14,w14 + rev w15,w15 + aese v30.16b,v2.16b + aesmc v30.16b,v30.16b + rev w19,w19 + rev w20,w20 + aese v31.16b,v2.16b + aesmc v31.16b,v31.16b + rev w21,w21 + rev w22,w22 + aese v8.16b,v2.16b + aesmc v8.16b,v8.16b + rev w23,w23 + aese v9.16b,v2.16b + aesmc v9.16b,v9.16b + aese v10.16b,v2.16b + aesmc v10.16b,v10.16b + aese v11.16b,v2.16b + aesmc v11.16b,v11.16b + ld1 {v2.4s},[x7],#16 + + aese v24.16b,v3.16b + aesmc v24.16b,v24.16b + aese v25.16b,v3.16b + aesmc v25.16b,v25.16b + aese v26.16b,v3.16b + aesmc v26.16b,v26.16b + aese v27.16b,v3.16b + aesmc v27.16b,v27.16b + ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x0],#64 + aese v28.16b,v3.16b + aesmc v28.16b,v28.16b + aese v29.16b,v3.16b + aesmc v29.16b,v29.16b + aese v30.16b,v3.16b + aesmc v30.16b,v30.16b + aese v31.16b,v3.16b + aesmc v31.16b,v31.16b + ld1 {v16.16b,v17.16b,v18.16b,v19.16b},[x0],#64 + aese v8.16b,v3.16b + aesmc v8.16b,v8.16b + aese v9.16b,v3.16b + aesmc v9.16b,v9.16b + aese v10.16b,v3.16b + aesmc v10.16b,v10.16b + aese v11.16b,v3.16b + aesmc v11.16b,v11.16b + ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x0],#64 + ld1 {v3.4s},[x7],#16 + + mov x7, x3 + aese v24.16b,v2.16b + aesmc v24.16b,v24.16b + aese v25.16b,v2.16b + aesmc v25.16b,v25.16b + aese v26.16b,v2.16b + aesmc v26.16b,v26.16b + aese v27.16b,v2.16b + aesmc v27.16b,v27.16b + aese v28.16b,v2.16b + aesmc v28.16b,v28.16b + aese v29.16b,v2.16b + aesmc v29.16b,v29.16b + aese v30.16b,v2.16b + aesmc v30.16b,v30.16b + aese v31.16b,v2.16b + aesmc v31.16b,v31.16b + aese v8.16b,v2.16b + aesmc v8.16b,v8.16b + aese v9.16b,v2.16b + aesmc v9.16b,v9.16b + aese v10.16b,v2.16b + aesmc v10.16b,v10.16b + aese v11.16b,v2.16b + aesmc v11.16b,v11.16b + ld1 {v2.4s},[x7],#16 // re-pre-load rndkey[0] + + aese v24.16b,v3.16b +.long 0xce016084 //eor3 v4.16b,v4.16b,v1.16b,v24.16b + orr v24.16b,v0.16b,v0.16b + aese v25.16b,v3.16b +.long 0xce0164a5 //eor3 v5.16b,v5.16b,v1.16b,v25.16b + orr v25.16b,v0.16b,v0.16b + aese v26.16b,v3.16b +.long 0xce0168c6 //eor3 v6.16b,v6.16b,v1.16b,v26.16b + orr v26.16b,v0.16b,v0.16b + aese v27.16b,v3.16b +.long 0xce016ce7 //eor3 v7.16b,v7.16b,v1.16b,v27.16b + orr v27.16b,v0.16b,v0.16b + aese v28.16b,v3.16b +.long 0xce017210 //eor3 v16.16b,v16.16b,v1.16b,v28.16b + orr v28.16b,v0.16b,v0.16b + aese v29.16b,v3.16b +.long 0xce017631 //eor3 v17.16b,v17.16b,v1.16b,v29.16b + orr v29.16b,v0.16b,v0.16b + aese v30.16b,v3.16b +.long 0xce017a52 //eor3 v18.16b,v18.16b,v1.16b,v30.16b + orr v30.16b,v0.16b,v0.16b + aese v31.16b,v3.16b +.long 0xce017e73 //eor3 v19.16b,v19.16b,v1.16b,v31.16b + orr v31.16b,v0.16b,v0.16b + aese v8.16b,v3.16b +.long 0xce012294 //eor3 v20.16b,v20.16b,v1.16b,v8.16b + orr v8.16b,v0.16b,v0.16b + aese v9.16b,v3.16b +.long 0xce0126b5 //eor3 v21.16b,v21.16b,v1.16b,v9.16b + orr v9.16b,v0.16b,v0.16b + aese v10.16b,v3.16b +.long 0xce012ad6 //eor3 v22.16b,v22.16b,v1.16b,v10.16b + orr v10.16b,v0.16b,v0.16b + aese v11.16b,v3.16b +.long 0xce012ef7 //eor3 v23.16b,v23.16b,v1.16b,v11.16b + orr v11.16b,v0.16b,v0.16b + ld1 {v3.4s},[x7],#16 // re-pre-load rndkey[1] + + mov v24.s[3],w9 + mov v25.s[3],w10 + mov v26.s[3],w12 + mov v27.s[3],w11 + st1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64 + mov v28.s[3],w13 + mov v29.s[3],w14 + mov v30.s[3],w15 + mov v31.s[3],w19 + st1 {v16.16b,v17.16b,v18.16b,v19.16b},[x1],#64 + mov v8.s[3],w20 + mov v9.s[3],w21 + mov v10.s[3],w22 + mov v11.s[3],w23 + st1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64 + + mov w6,w5 + + add w8,w8,#12 + subs x2,x2,#12 + b.hs Loop12x_ctr32_unroll + + // pop regs from stack when 12 data chunks are interleaved + ldp d10,d11,[sp],#32 + ldp d8,d9,[sp],#32 + ldp x23,x24,[sp],#16 + ldp x21,x22,[sp],#16 + ldp x19,x20,[sp],#16 + + add x2,x2,#12 + cbz x2,Lctr32_done_unroll + sub w8,w8,#12 + + cmp x2,#2 + b.ls Lctr32_tail_unroll + + cmp x2,#6 + sub x2,x2,#3 // bias + add w8,w8,#3 + b.lo Loop3x_ctr32_unroll + + sub x2,x2,#3 + add w8,w8,#3 + b.lo Loop6x_ctr32_unroll + +.align 4 +Loop6x_ctr32_unroll: + aese v24.16b,v2.16b + aesmc v24.16b,v24.16b + aese v25.16b,v2.16b + aesmc v25.16b,v25.16b + aese v26.16b,v2.16b + aesmc v26.16b,v26.16b + aese v27.16b,v2.16b + aesmc v27.16b,v27.16b + aese v28.16b,v2.16b + aesmc v28.16b,v28.16b + aese v29.16b,v2.16b + aesmc v29.16b,v29.16b + ld1 {v2.4s},[x7],#16 + subs w6,w6,#2 + aese v24.16b,v3.16b + aesmc v24.16b,v24.16b + aese v25.16b,v3.16b + aesmc v25.16b,v25.16b + aese v26.16b,v3.16b + aesmc v26.16b,v26.16b + aese v27.16b,v3.16b + aesmc v27.16b,v27.16b + aese v28.16b,v3.16b + aesmc v28.16b,v28.16b + aese v29.16b,v3.16b + aesmc v29.16b,v29.16b + ld1 {v3.4s},[x7],#16 + b.gt Loop6x_ctr32_unroll + + aese v24.16b,v2.16b + aesmc v24.16b,v24.16b + aese v25.16b,v2.16b + aesmc v25.16b,v25.16b + aese v26.16b,v2.16b + aesmc v26.16b,v26.16b + aese v27.16b,v2.16b + aesmc v27.16b,v27.16b + aese v28.16b,v2.16b + aesmc v28.16b,v28.16b + aese v29.16b,v2.16b + aesmc v29.16b,v29.16b + ld1 {v2.4s},[x7],#16 + + aese v24.16b,v3.16b + aesmc v24.16b,v24.16b + aese v25.16b,v3.16b + aesmc v25.16b,v25.16b + aese v26.16b,v3.16b + aesmc v26.16b,v26.16b + aese v27.16b,v3.16b + aesmc v27.16b,v27.16b + aese v28.16b,v3.16b + aesmc v28.16b,v28.16b + aese v29.16b,v3.16b + aesmc v29.16b,v29.16b + ld1 {v3.4s},[x7],#16 + + aese v24.16b,v2.16b + aesmc v24.16b,v24.16b + add w9,w8,#1 + add w10,w8,#2 + aese v25.16b,v2.16b + aesmc v25.16b,v25.16b + add w12,w8,#3 + add w11,w8,#4 + aese v26.16b,v2.16b + aesmc v26.16b,v26.16b + add w13,w8,#5 + add w14,w8,#6 + rev w9,w9 + aese v27.16b,v2.16b + aesmc v27.16b,v27.16b + rev w10,w10 + rev w12,w12 + aese v28.16b,v2.16b + aesmc v28.16b,v28.16b + rev w11,w11 + rev w13,w13 + aese v29.16b,v2.16b + aesmc v29.16b,v29.16b + rev w14,w14 + ld1 {v2.4s},[x7],#16 + + aese v24.16b,v3.16b + aesmc v24.16b,v24.16b + aese v25.16b,v3.16b + aesmc v25.16b,v25.16b + ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x0],#64 + aese v26.16b,v3.16b + aesmc v26.16b,v26.16b + aese v27.16b,v3.16b + aesmc v27.16b,v27.16b + ld1 {v16.16b,v17.16b},[x0],#32 + aese v28.16b,v3.16b + aesmc v28.16b,v28.16b + aese v29.16b,v3.16b + aesmc v29.16b,v29.16b + ld1 {v3.4s},[x7],#16 + + mov x7, x3 + aese v24.16b,v2.16b + aesmc v24.16b,v24.16b + aese v25.16b,v2.16b + aesmc v25.16b,v25.16b + aese v26.16b,v2.16b + aesmc v26.16b,v26.16b + aese v27.16b,v2.16b + aesmc v27.16b,v27.16b + aese v28.16b,v2.16b + aesmc v28.16b,v28.16b + aese v29.16b,v2.16b + aesmc v29.16b,v29.16b + ld1 {v2.4s},[x7],#16 // re-pre-load rndkey[0] + + aese v24.16b,v3.16b +.long 0xce016084 //eor3 v4.16b,v4.16b,v1.16b,v24.16b + aese v25.16b,v3.16b +.long 0xce0164a5 //eor3 v5.16b,v5.16b,v1.16b,v25.16b + aese v26.16b,v3.16b +.long 0xce0168c6 //eor3 v6.16b,v6.16b,v1.16b,v26.16b + aese v27.16b,v3.16b +.long 0xce016ce7 //eor3 v7.16b,v7.16b,v1.16b,v27.16b + aese v28.16b,v3.16b +.long 0xce017210 //eor3 v16.16b,v16.16b,v1.16b,v28.16b + aese v29.16b,v3.16b +.long 0xce017631 //eor3 v17.16b,v17.16b,v1.16b,v29.16b + ld1 {v3.4s},[x7],#16 // re-pre-load rndkey[1] + + orr v24.16b,v0.16b,v0.16b + orr v25.16b,v0.16b,v0.16b + orr v26.16b,v0.16b,v0.16b + orr v27.16b,v0.16b,v0.16b + orr v28.16b,v0.16b,v0.16b + orr v29.16b,v0.16b,v0.16b + + mov v24.s[3],w9 + mov v25.s[3],w10 + st1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64 + mov v26.s[3],w12 + mov v27.s[3],w11 + st1 {v16.16b,v17.16b},[x1],#32 + mov v28.s[3],w13 + mov v29.s[3],w14 + + cbz x2,Lctr32_done_unroll + mov w6,w5 + + cmp x2,#2 + b.ls Lctr32_tail_unroll + + sub x2,x2,#3 // bias + add w8,w8,#3 + b Loop3x_ctr32_unroll + +.align 4 +Loop3x_ctr32_unroll: + aese v24.16b,v2.16b + aesmc v24.16b,v24.16b + aese v25.16b,v2.16b + aesmc v25.16b,v25.16b + aese v26.16b,v2.16b + aesmc v26.16b,v26.16b + ld1 {v2.4s},[x7],#16 + subs w6,w6,#2 + aese v24.16b,v3.16b + aesmc v24.16b,v24.16b + aese v25.16b,v3.16b + aesmc v25.16b,v25.16b + aese v26.16b,v3.16b + aesmc v26.16b,v26.16b + ld1 {v3.4s},[x7],#16 + b.gt Loop3x_ctr32_unroll + + aese v24.16b,v2.16b + aesmc v9.16b,v24.16b + aese v25.16b,v2.16b + aesmc v10.16b,v25.16b + ld1 {v4.16b,v5.16b,v6.16b},[x0],#48 + orr v24.16b,v0.16b,v0.16b + aese v26.16b,v2.16b + aesmc v26.16b,v26.16b + ld1 {v2.4s},[x7],#16 + orr v25.16b,v0.16b,v0.16b + aese v9.16b,v3.16b + aesmc v9.16b,v9.16b + aese v10.16b,v3.16b + aesmc v10.16b,v10.16b + aese v26.16b,v3.16b + aesmc v11.16b,v26.16b + ld1 {v3.4s},[x7],#16 + orr v26.16b,v0.16b,v0.16b + add w9,w8,#1 + aese v9.16b,v2.16b + aesmc v9.16b,v9.16b + aese v10.16b,v2.16b + aesmc v10.16b,v10.16b + add w10,w8,#2 + aese v11.16b,v2.16b + aesmc v11.16b,v11.16b + ld1 {v2.4s},[x7],#16 + add w8,w8,#3 + aese v9.16b,v3.16b + aesmc v9.16b,v9.16b + aese v10.16b,v3.16b + aesmc v10.16b,v10.16b + + rev w9,w9 + aese v11.16b,v3.16b + aesmc v11.16b,v11.16b + ld1 {v3.4s},[x7],#16 + mov v24.s[3], w9 + mov x7,x3 + rev w10,w10 + aese v9.16b,v2.16b + aesmc v9.16b,v9.16b + + aese v10.16b,v2.16b + aesmc v10.16b,v10.16b + mov v25.s[3], w10 + rev w12,w8 + aese v11.16b,v2.16b + aesmc v11.16b,v11.16b + mov v26.s[3], w12 + + aese v9.16b,v3.16b + aese v10.16b,v3.16b + aese v11.16b,v3.16b + +.long 0xce012484 //eor3 v4.16b,v4.16b,v1.16b,v9.16b + ld1 {v2.4s},[x7],#16 // re-pre-load rndkey[0] +.long 0xce0128a5 //eor3 v5.16b,v5.16b,v1.16b,v10.16b + mov w6,w5 +.long 0xce012cc6 //eor3 v6.16b,v6.16b,v1.16b,v11.16b + ld1 {v3.4s},[x7],#16 // re-pre-load rndkey[1] + st1 {v4.16b,v5.16b,v6.16b},[x1],#48 + + cbz x2,Lctr32_done_unroll + +Lctr32_tail_unroll: + cmp x2,#1 + b.eq Lctr32_tail_1_unroll + +Lctr32_tail_2_unroll: + aese v24.16b,v2.16b + aesmc v24.16b,v24.16b + aese v25.16b,v2.16b + aesmc v25.16b,v25.16b + ld1 {v2.4s},[x7],#16 + subs w6,w6,#2 + aese v24.16b,v3.16b + aesmc v24.16b,v24.16b + aese v25.16b,v3.16b + aesmc v25.16b,v25.16b + ld1 {v3.4s},[x7],#16 + b.gt Lctr32_tail_2_unroll + + aese v24.16b,v2.16b + aesmc v24.16b,v24.16b + aese v25.16b,v2.16b + aesmc v25.16b,v25.16b + ld1 {v2.4s},[x7],#16 + aese v24.16b,v3.16b + aesmc v24.16b,v24.16b + aese v25.16b,v3.16b + aesmc v25.16b,v25.16b + ld1 {v3.4s},[x7],#16 + ld1 {v4.16b,v5.16b},[x0],#32 + aese v24.16b,v2.16b + aesmc v24.16b,v24.16b + aese v25.16b,v2.16b + aesmc v25.16b,v25.16b + ld1 {v2.4s},[x7],#16 + aese v24.16b,v3.16b + aesmc v24.16b,v24.16b + aese v25.16b,v3.16b + aesmc v25.16b,v25.16b + ld1 {v3.4s},[x7],#16 + aese v24.16b,v2.16b + aesmc v24.16b,v24.16b + aese v25.16b,v2.16b + aesmc v25.16b,v25.16b + aese v24.16b,v3.16b + aese v25.16b,v3.16b + +.long 0xce016084 //eor3 v4.16b,v4.16b,v1.16b,v24.16b +.long 0xce0164a5 //eor3 v5.16b,v5.16b,v1.16b,v25.16b + st1 {v4.16b,v5.16b},[x1],#32 + b Lctr32_done_unroll + +Lctr32_tail_1_unroll: + aese v24.16b,v2.16b + aesmc v24.16b,v24.16b + ld1 {v2.4s},[x7],#16 + subs w6,w6,#2 + aese v24.16b,v3.16b + aesmc v24.16b,v24.16b + ld1 {v3.4s},[x7],#16 + b.gt Lctr32_tail_1_unroll + + aese v24.16b,v2.16b + aesmc v24.16b,v24.16b + ld1 {v2.4s},[x7],#16 + aese v24.16b,v3.16b + aesmc v24.16b,v24.16b + ld1 {v3.4s},[x7],#16 + ld1 {v4.16b},[x0] + aese v24.16b,v2.16b + aesmc v24.16b,v24.16b + ld1 {v2.4s},[x7],#16 + aese v24.16b,v3.16b + aesmc v24.16b,v24.16b + ld1 {v3.4s},[x7],#16 + aese v24.16b,v2.16b + aesmc v24.16b,v24.16b + aese v24.16b,v3.16b + +.long 0xce016084 //eor3 v4.16b,v4.16b,v1.16b,v24.16b + st1 {v4.16b},[x1],#16 + +Lctr32_done_unroll: + ldp d8,d9,[sp, #16] + ldp d10,d11,[sp, #32] + ldp d12,d13,[sp, #48] + ldp d14,d15,[sp, #64] + ldr x29,[sp],#80 + ret + +.globl aes_v8_ctr32_encrypt_blocks +.def aes_v8_ctr32_encrypt_blocks + .type 32 +.endef +.align 5 +aes_v8_ctr32_encrypt_blocks: + AARCH64_VALID_CALL_TARGET + // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + ldr w5,[x3,#240] + + ldr w8, [x4, #12] +#ifdef __AARCH64EB__ + ld1 {v0.16b},[x4] +#else + ld1 {v0.4s},[x4] +#endif + ld1 {v16.4s,v17.4s},[x3] // load key schedule... + sub w5,w5,#4 + mov x12,#16 + cmp x2,#2 + add x7,x3,x5,lsl#4 // pointer to last 5 round keys + sub w5,w5,#2 + ld1 {v20.4s,v21.4s},[x7],#32 + ld1 {v22.4s,v23.4s},[x7],#32 + ld1 {v7.4s},[x7] + add x7,x3,#32 + mov w6,w5 + csel x12,xzr,x12,lo +#ifndef __AARCH64EB__ + rev w8, w8 +#endif + orr v1.16b,v0.16b,v0.16b + add w10, w8, #1 + orr v18.16b,v0.16b,v0.16b + add w8, w8, #2 + orr v6.16b,v0.16b,v0.16b + rev w10, w10 + mov v1.s[3],w10 + b.ls Lctr32_tail + rev w12, w8 + sub x2,x2,#3 // bias + mov v18.s[3],w12 + cmp x2,#32 + b.lo Loop3x_ctr32 + + add w13,w8,#1 + add w14,w8,#2 + orr v24.16b,v0.16b,v0.16b + rev w13,w13 + orr v25.16b,v0.16b,v0.16b + rev w14,w14 + mov v24.s[3],w13 + sub x2,x2,#2 // bias + mov v25.s[3],w14 + add w8,w8,#2 + b Loop5x_ctr32 + +.align 4 +Loop5x_ctr32: + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + aese v1.16b,v16.16b + aesmc v1.16b,v1.16b + aese v18.16b,v16.16b + aesmc v18.16b,v18.16b + aese v24.16b,v16.16b + aesmc v24.16b,v24.16b + aese v25.16b,v16.16b + aesmc v25.16b,v25.16b + ld1 {v16.4s},[x7],#16 + subs w6,w6,#2 + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + aese v1.16b,v17.16b + aesmc v1.16b,v1.16b + aese v18.16b,v17.16b + aesmc v18.16b,v18.16b + aese v24.16b,v17.16b + aesmc v24.16b,v24.16b + aese v25.16b,v17.16b + aesmc v25.16b,v25.16b + ld1 {v17.4s},[x7],#16 + b.gt Loop5x_ctr32 + + mov x7,x3 + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + aese v1.16b,v16.16b + aesmc v1.16b,v1.16b + aese v18.16b,v16.16b + aesmc v18.16b,v18.16b + aese v24.16b,v16.16b + aesmc v24.16b,v24.16b + aese v25.16b,v16.16b + aesmc v25.16b,v25.16b + ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] + + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + aese v1.16b,v17.16b + aesmc v1.16b,v1.16b + aese v18.16b,v17.16b + aesmc v18.16b,v18.16b + aese v24.16b,v17.16b + aesmc v24.16b,v24.16b + aese v25.16b,v17.16b + aesmc v25.16b,v25.16b + ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] + + aese v0.16b,v20.16b + aesmc v0.16b,v0.16b + add w9,w8,#1 + add w10,w8,#2 + aese v1.16b,v20.16b + aesmc v1.16b,v1.16b + add w12,w8,#3 + add w13,w8,#4 + aese v18.16b,v20.16b + aesmc v18.16b,v18.16b + add w14,w8,#5 + rev w9,w9 + aese v24.16b,v20.16b + aesmc v24.16b,v24.16b + rev w10,w10 + rev w12,w12 + aese v25.16b,v20.16b + aesmc v25.16b,v25.16b + rev w13,w13 + rev w14,w14 + + aese v0.16b,v21.16b + aesmc v0.16b,v0.16b + aese v1.16b,v21.16b + aesmc v1.16b,v1.16b + aese v18.16b,v21.16b + aesmc v18.16b,v18.16b + aese v24.16b,v21.16b + aesmc v24.16b,v24.16b + aese v25.16b,v21.16b + aesmc v25.16b,v25.16b + + aese v0.16b,v22.16b + aesmc v0.16b,v0.16b + ld1 {v2.16b},[x0],#16 + aese v1.16b,v22.16b + aesmc v1.16b,v1.16b + ld1 {v3.16b},[x0],#16 + aese v18.16b,v22.16b + aesmc v18.16b,v18.16b + ld1 {v19.16b},[x0],#16 + aese v24.16b,v22.16b + aesmc v24.16b,v24.16b + ld1 {v26.16b},[x0],#16 + aese v25.16b,v22.16b + aesmc v25.16b,v25.16b + ld1 {v27.16b},[x0],#16 + + aese v0.16b,v23.16b + eor v2.16b,v2.16b,v7.16b + aese v1.16b,v23.16b + eor v3.16b,v3.16b,v7.16b + aese v18.16b,v23.16b + eor v19.16b,v19.16b,v7.16b + aese v24.16b,v23.16b + eor v26.16b,v26.16b,v7.16b + aese v25.16b,v23.16b + eor v27.16b,v27.16b,v7.16b + + eor v2.16b,v2.16b,v0.16b + orr v0.16b,v6.16b,v6.16b + eor v3.16b,v3.16b,v1.16b + orr v1.16b,v6.16b,v6.16b + eor v19.16b,v19.16b,v18.16b + orr v18.16b,v6.16b,v6.16b + eor v26.16b,v26.16b,v24.16b + orr v24.16b,v6.16b,v6.16b + eor v27.16b,v27.16b,v25.16b + orr v25.16b,v6.16b,v6.16b + + st1 {v2.16b},[x1],#16 + mov v0.s[3],w9 + st1 {v3.16b},[x1],#16 + mov v1.s[3],w10 + st1 {v19.16b},[x1],#16 + mov v18.s[3],w12 + st1 {v26.16b},[x1],#16 + mov v24.s[3],w13 + st1 {v27.16b},[x1],#16 + mov v25.s[3],w14 + + mov w6,w5 + cbz x2,Lctr32_done + + add w8,w8,#5 + subs x2,x2,#5 + b.hs Loop5x_ctr32 + + add x2,x2,#5 + sub w8,w8,#5 + + cmp x2,#2 + mov x12,#16 + csel x12,xzr,x12,lo + b.ls Lctr32_tail + + sub x2,x2,#3 // bias + add w8,w8,#3 + b Loop3x_ctr32 + +.align 4 +Loop3x_ctr32: + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + aese v1.16b,v16.16b + aesmc v1.16b,v1.16b + aese v18.16b,v16.16b + aesmc v18.16b,v18.16b + ld1 {v16.4s},[x7],#16 + subs w6,w6,#2 + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + aese v1.16b,v17.16b + aesmc v1.16b,v1.16b + aese v18.16b,v17.16b + aesmc v18.16b,v18.16b + ld1 {v17.4s},[x7],#16 + b.gt Loop3x_ctr32 + + aese v0.16b,v16.16b + aesmc v4.16b,v0.16b + aese v1.16b,v16.16b + aesmc v5.16b,v1.16b + ld1 {v2.16b},[x0],#16 + orr v0.16b,v6.16b,v6.16b + aese v18.16b,v16.16b + aesmc v18.16b,v18.16b + ld1 {v3.16b},[x0],#16 + orr v1.16b,v6.16b,v6.16b + aese v4.16b,v17.16b + aesmc v4.16b,v4.16b + aese v5.16b,v17.16b + aesmc v5.16b,v5.16b + ld1 {v19.16b},[x0],#16 + mov x7,x3 + aese v18.16b,v17.16b + aesmc v17.16b,v18.16b + orr v18.16b,v6.16b,v6.16b + add w9,w8,#1 + aese v4.16b,v20.16b + aesmc v4.16b,v4.16b + aese v5.16b,v20.16b + aesmc v5.16b,v5.16b + eor v2.16b,v2.16b,v7.16b + add w10,w8,#2 + aese v17.16b,v20.16b + aesmc v17.16b,v17.16b + eor v3.16b,v3.16b,v7.16b + add w8,w8,#3 + aese v4.16b,v21.16b + aesmc v4.16b,v4.16b + aese v5.16b,v21.16b + aesmc v5.16b,v5.16b + eor v19.16b,v19.16b,v7.16b + rev w9,w9 + aese v17.16b,v21.16b + aesmc v17.16b,v17.16b + mov v0.s[3], w9 + rev w10,w10 + aese v4.16b,v22.16b + aesmc v4.16b,v4.16b + aese v5.16b,v22.16b + aesmc v5.16b,v5.16b + mov v1.s[3], w10 + rev w12,w8 + aese v17.16b,v22.16b + aesmc v17.16b,v17.16b + mov v18.s[3], w12 + subs x2,x2,#3 + aese v4.16b,v23.16b + aese v5.16b,v23.16b + aese v17.16b,v23.16b + + eor v2.16b,v2.16b,v4.16b + ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] + st1 {v2.16b},[x1],#16 + eor v3.16b,v3.16b,v5.16b + mov w6,w5 + st1 {v3.16b},[x1],#16 + eor v19.16b,v19.16b,v17.16b + ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] + st1 {v19.16b},[x1],#16 + b.hs Loop3x_ctr32 + + adds x2,x2,#3 + b.eq Lctr32_done + cmp x2,#1 + mov x12,#16 + csel x12,xzr,x12,eq + +Lctr32_tail: + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + aese v1.16b,v16.16b + aesmc v1.16b,v1.16b + ld1 {v16.4s},[x7],#16 + subs w6,w6,#2 + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + aese v1.16b,v17.16b + aesmc v1.16b,v1.16b + ld1 {v17.4s},[x7],#16 + b.gt Lctr32_tail + + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + aese v1.16b,v16.16b + aesmc v1.16b,v1.16b + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + aese v1.16b,v17.16b + aesmc v1.16b,v1.16b + ld1 {v2.16b},[x0],x12 + aese v0.16b,v20.16b + aesmc v0.16b,v0.16b + aese v1.16b,v20.16b + aesmc v1.16b,v1.16b + ld1 {v3.16b},[x0] + aese v0.16b,v21.16b + aesmc v0.16b,v0.16b + aese v1.16b,v21.16b + aesmc v1.16b,v1.16b + eor v2.16b,v2.16b,v7.16b + aese v0.16b,v22.16b + aesmc v0.16b,v0.16b + aese v1.16b,v22.16b + aesmc v1.16b,v1.16b + eor v3.16b,v3.16b,v7.16b + aese v0.16b,v23.16b + aese v1.16b,v23.16b + + cmp x2,#1 + eor v2.16b,v2.16b,v0.16b + eor v3.16b,v3.16b,v1.16b + st1 {v2.16b},[x1],#16 + b.eq Lctr32_done + st1 {v3.16b},[x1] + +Lctr32_done: + ldr x29,[sp],#16 + ret + +.globl aes_v8_xts_encrypt +.def aes_v8_xts_encrypt + .type 32 +.endef +.align 5 +aes_v8_xts_encrypt: + AARCH64_VALID_CALL_TARGET + cmp x2,#16 + // Original input data size bigger than 16, jump to big size processing. + b.ne Lxts_enc_big_size + // Encrypt the iv with key2, as the first XEX iv. + ldr w6,[x4,#240] + ld1 {v0.4s},[x4],#16 + ld1 {v6.16b},[x5] + sub w6,w6,#2 + ld1 {v1.4s},[x4],#16 + +Loop_enc_iv_enc: + aese v6.16b,v0.16b + aesmc v6.16b,v6.16b + ld1 {v0.4s},[x4],#16 + subs w6,w6,#2 + aese v6.16b,v1.16b + aesmc v6.16b,v6.16b + ld1 {v1.4s},[x4],#16 + b.gt Loop_enc_iv_enc + + aese v6.16b,v0.16b + aesmc v6.16b,v6.16b + ld1 {v0.4s},[x4] + aese v6.16b,v1.16b + eor v6.16b,v6.16b,v0.16b + + ld1 {v0.16b},[x0] + eor v0.16b,v6.16b,v0.16b + + ldr w6,[x3,#240] + ld1 {v28.4s,v29.4s},[x3],#32 // load key schedule... + + aese v0.16b,v28.16b + aesmc v0.16b,v0.16b + ld1 {v16.4s,v17.4s},[x3],#32 // load key schedule... + aese v0.16b,v29.16b + aesmc v0.16b,v0.16b + subs w6,w6,#10 // if rounds==10, jump to aes-128-xts processing + b.eq Lxts_128_enc +Lxts_enc_round_loop: + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + ld1 {v16.4s},[x3],#16 // load key schedule... + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + ld1 {v17.4s},[x3],#16 // load key schedule... + subs w6,w6,#2 // bias + b.gt Lxts_enc_round_loop +Lxts_128_enc: + ld1 {v18.4s,v19.4s},[x3],#32 // load key schedule... + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + ld1 {v20.4s,v21.4s},[x3],#32 // load key schedule... + aese v0.16b,v18.16b + aesmc v0.16b,v0.16b + aese v0.16b,v19.16b + aesmc v0.16b,v0.16b + ld1 {v22.4s,v23.4s},[x3],#32 // load key schedule... + aese v0.16b,v20.16b + aesmc v0.16b,v0.16b + aese v0.16b,v21.16b + aesmc v0.16b,v0.16b + ld1 {v7.4s},[x3] + aese v0.16b,v22.16b + aesmc v0.16b,v0.16b + aese v0.16b,v23.16b + eor v0.16b,v0.16b,v7.16b + eor v0.16b,v0.16b,v6.16b + st1 {v0.16b},[x1] + b Lxts_enc_final_abort + +.align 4 +Lxts_enc_big_size: + stp x19,x20,[sp,#-64]! + stp x21,x22,[sp,#48] + stp d8,d9,[sp,#32] + stp d10,d11,[sp,#16] + + // tailcnt store the tail value of length%16. + and x21,x2,#0xf + and x2,x2,#-16 + subs x2,x2,#16 + mov x8,#16 + b.lo Lxts_abort + csel x8,xzr,x8,eq + + // Firstly, encrypt the iv with key2, as the first iv of XEX. + ldr w6,[x4,#240] + ld1 {v0.4s},[x4],#16 + ld1 {v6.16b},[x5] + sub w6,w6,#2 + ld1 {v1.4s},[x4],#16 + +Loop_iv_enc: + aese v6.16b,v0.16b + aesmc v6.16b,v6.16b + ld1 {v0.4s},[x4],#16 + subs w6,w6,#2 + aese v6.16b,v1.16b + aesmc v6.16b,v6.16b + ld1 {v1.4s},[x4],#16 + b.gt Loop_iv_enc + + aese v6.16b,v0.16b + aesmc v6.16b,v6.16b + ld1 {v0.4s},[x4] + aese v6.16b,v1.16b + eor v6.16b,v6.16b,v0.16b + + // The iv for second block + // x9- iv(low), x10 - iv(high) + // the five ivs stored into, v6.16b,v8.16b,v9.16b,v10.16b,v11.16b + fmov x9,d6 + fmov x10,v6.d[1] + mov w19,#0x87 + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr#31 + eor x9,x11,x9,lsl#1 + fmov d8,x9 + fmov v8.d[1],x10 + + ldr w5,[x3,#240] // next starting point + ld1 {v0.16b},[x0],x8 + + ld1 {v16.4s,v17.4s},[x3] // load key schedule... + sub w5,w5,#6 + add x7,x3,x5,lsl#4 // pointer to last 7 round keys + sub w5,w5,#2 + ld1 {v18.4s,v19.4s},[x7],#32 + ld1 {v20.4s,v21.4s},[x7],#32 + ld1 {v22.4s,v23.4s},[x7],#32 + ld1 {v7.4s},[x7] + + add x7,x3,#32 + mov w6,w5 + + // Encryption +Lxts_enc: + ld1 {v24.16b},[x0],#16 + subs x2,x2,#32 // bias + add w6,w5,#2 + orr v3.16b,v0.16b,v0.16b + orr v1.16b,v0.16b,v0.16b + orr v28.16b,v0.16b,v0.16b + orr v27.16b,v24.16b,v24.16b + orr v29.16b,v24.16b,v24.16b + b.lo Lxts_inner_enc_tail + eor v0.16b,v0.16b,v6.16b // before encryption, xor with iv + eor v24.16b,v24.16b,v8.16b + + // The iv for third block + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr#31 + eor x9,x11,x9,lsl#1 + fmov d9,x9 + fmov v9.d[1],x10 + + + orr v1.16b,v24.16b,v24.16b + ld1 {v24.16b},[x0],#16 + orr v2.16b,v0.16b,v0.16b + orr v3.16b,v1.16b,v1.16b + eor v27.16b,v24.16b,v9.16b // the third block + eor v24.16b,v24.16b,v9.16b + cmp x2,#32 + b.lo Lxts_outer_enc_tail + + // The iv for fourth block + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr#31 + eor x9,x11,x9,lsl#1 + fmov d10,x9 + fmov v10.d[1],x10 + + ld1 {v25.16b},[x0],#16 + // The iv for fifth block + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr#31 + eor x9,x11,x9,lsl#1 + fmov d11,x9 + fmov v11.d[1],x10 + + ld1 {v26.16b},[x0],#16 + eor v25.16b,v25.16b,v10.16b // the fourth block + eor v26.16b,v26.16b,v11.16b + sub x2,x2,#32 // bias + mov w6,w5 + b Loop5x_xts_enc + +.align 4 +Loop5x_xts_enc: + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + aese v1.16b,v16.16b + aesmc v1.16b,v1.16b + aese v24.16b,v16.16b + aesmc v24.16b,v24.16b + aese v25.16b,v16.16b + aesmc v25.16b,v25.16b + aese v26.16b,v16.16b + aesmc v26.16b,v26.16b + ld1 {v16.4s},[x7],#16 + subs w6,w6,#2 + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + aese v1.16b,v17.16b + aesmc v1.16b,v1.16b + aese v24.16b,v17.16b + aesmc v24.16b,v24.16b + aese v25.16b,v17.16b + aesmc v25.16b,v25.16b + aese v26.16b,v17.16b + aesmc v26.16b,v26.16b + ld1 {v17.4s},[x7],#16 + b.gt Loop5x_xts_enc + + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + aese v1.16b,v16.16b + aesmc v1.16b,v1.16b + aese v24.16b,v16.16b + aesmc v24.16b,v24.16b + aese v25.16b,v16.16b + aesmc v25.16b,v25.16b + aese v26.16b,v16.16b + aesmc v26.16b,v26.16b + subs x2,x2,#0x50 // because Lxts_enc_tail4x + + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + aese v1.16b,v17.16b + aesmc v1.16b,v1.16b + aese v24.16b,v17.16b + aesmc v24.16b,v24.16b + aese v25.16b,v17.16b + aesmc v25.16b,v25.16b + aese v26.16b,v17.16b + aesmc v26.16b,v26.16b + csel x6,xzr,x2,gt // borrow x6, w6, "gt" is not typo + mov x7,x3 + + aese v0.16b,v18.16b + aesmc v0.16b,v0.16b + aese v1.16b,v18.16b + aesmc v1.16b,v1.16b + aese v24.16b,v18.16b + aesmc v24.16b,v24.16b + aese v25.16b,v18.16b + aesmc v25.16b,v25.16b + aese v26.16b,v18.16b + aesmc v26.16b,v26.16b + add x0,x0,x6 // x0 is adjusted in such way that + // at exit from the loop v1.16b-v26.16b + // are loaded with last "words" + add x6,x2,#0x60 // because Lxts_enc_tail4x + + aese v0.16b,v19.16b + aesmc v0.16b,v0.16b + aese v1.16b,v19.16b + aesmc v1.16b,v1.16b + aese v24.16b,v19.16b + aesmc v24.16b,v24.16b + aese v25.16b,v19.16b + aesmc v25.16b,v25.16b + aese v26.16b,v19.16b + aesmc v26.16b,v26.16b + + aese v0.16b,v20.16b + aesmc v0.16b,v0.16b + aese v1.16b,v20.16b + aesmc v1.16b,v1.16b + aese v24.16b,v20.16b + aesmc v24.16b,v24.16b + aese v25.16b,v20.16b + aesmc v25.16b,v25.16b + aese v26.16b,v20.16b + aesmc v26.16b,v26.16b + + aese v0.16b,v21.16b + aesmc v0.16b,v0.16b + aese v1.16b,v21.16b + aesmc v1.16b,v1.16b + aese v24.16b,v21.16b + aesmc v24.16b,v24.16b + aese v25.16b,v21.16b + aesmc v25.16b,v25.16b + aese v26.16b,v21.16b + aesmc v26.16b,v26.16b + + aese v0.16b,v22.16b + aesmc v0.16b,v0.16b + aese v1.16b,v22.16b + aesmc v1.16b,v1.16b + aese v24.16b,v22.16b + aesmc v24.16b,v24.16b + aese v25.16b,v22.16b + aesmc v25.16b,v25.16b + aese v26.16b,v22.16b + aesmc v26.16b,v26.16b + + eor v4.16b,v7.16b,v6.16b + aese v0.16b,v23.16b + // The iv for first block of one iteration + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr#31 + eor x9,x11,x9,lsl#1 + fmov d6,x9 + fmov v6.d[1],x10 + eor v5.16b,v7.16b,v8.16b + ld1 {v2.16b},[x0],#16 + aese v1.16b,v23.16b + // The iv for second block + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr#31 + eor x9,x11,x9,lsl#1 + fmov d8,x9 + fmov v8.d[1],x10 + eor v17.16b,v7.16b,v9.16b + ld1 {v3.16b},[x0],#16 + aese v24.16b,v23.16b + // The iv for third block + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr#31 + eor x9,x11,x9,lsl#1 + fmov d9,x9 + fmov v9.d[1],x10 + eor v30.16b,v7.16b,v10.16b + ld1 {v27.16b},[x0],#16 + aese v25.16b,v23.16b + // The iv for fourth block + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr#31 + eor x9,x11,x9,lsl#1 + fmov d10,x9 + fmov v10.d[1],x10 + eor v31.16b,v7.16b,v11.16b + ld1 {v28.16b},[x0],#16 + aese v26.16b,v23.16b + + // The iv for fifth block + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr #31 + eor x9,x11,x9,lsl #1 + fmov d11,x9 + fmov v11.d[1],x10 + + ld1 {v29.16b},[x0],#16 + cbz x6,Lxts_enc_tail4x + ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] + eor v4.16b,v4.16b,v0.16b + eor v0.16b,v2.16b,v6.16b + eor v5.16b,v5.16b,v1.16b + eor v1.16b,v3.16b,v8.16b + eor v17.16b,v17.16b,v24.16b + eor v24.16b,v27.16b,v9.16b + eor v30.16b,v30.16b,v25.16b + eor v25.16b,v28.16b,v10.16b + eor v31.16b,v31.16b,v26.16b + st1 {v4.16b},[x1],#16 + eor v26.16b,v29.16b,v11.16b + st1 {v5.16b},[x1],#16 + mov w6,w5 + st1 {v17.16b},[x1],#16 + ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] + st1 {v30.16b},[x1],#16 + st1 {v31.16b},[x1],#16 + b.hs Loop5x_xts_enc + + + // If left 4 blocks, borrow the five block's processing. + cmn x2,#0x10 + b.ne Loop5x_enc_after + orr v11.16b,v10.16b,v10.16b + orr v10.16b,v9.16b,v9.16b + orr v9.16b,v8.16b,v8.16b + orr v8.16b,v6.16b,v6.16b + fmov x9,d11 + fmov x10,v11.d[1] + eor v0.16b,v6.16b,v2.16b + eor v1.16b,v8.16b,v3.16b + eor v24.16b,v27.16b,v9.16b + eor v25.16b,v28.16b,v10.16b + eor v26.16b,v29.16b,v11.16b + b.eq Loop5x_xts_enc + +Loop5x_enc_after: + add x2,x2,#0x50 + cbz x2,Lxts_enc_done + + add w6,w5,#2 + subs x2,x2,#0x30 + b.lo Lxts_inner_enc_tail + + eor v0.16b,v6.16b,v27.16b + eor v1.16b,v8.16b,v28.16b + eor v24.16b,v29.16b,v9.16b + b Lxts_outer_enc_tail + +.align 4 +Lxts_enc_tail4x: + add x0,x0,#16 + eor v5.16b,v1.16b,v5.16b + st1 {v5.16b},[x1],#16 + eor v17.16b,v24.16b,v17.16b + st1 {v17.16b},[x1],#16 + eor v30.16b,v25.16b,v30.16b + eor v31.16b,v26.16b,v31.16b + st1 {v30.16b,v31.16b},[x1],#32 + + b Lxts_enc_done +.align 4 +Lxts_outer_enc_tail: + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + aese v1.16b,v16.16b + aesmc v1.16b,v1.16b + aese v24.16b,v16.16b + aesmc v24.16b,v24.16b + ld1 {v16.4s},[x7],#16 + subs w6,w6,#2 + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + aese v1.16b,v17.16b + aesmc v1.16b,v1.16b + aese v24.16b,v17.16b + aesmc v24.16b,v24.16b + ld1 {v17.4s},[x7],#16 + b.gt Lxts_outer_enc_tail + + aese v0.16b,v16.16b + aesmc v0.16b,v0.16b + aese v1.16b,v16.16b + aesmc v1.16b,v1.16b + aese v24.16b,v16.16b + aesmc v24.16b,v24.16b + eor v4.16b,v6.16b,v7.16b + subs x2,x2,#0x30 + // The iv for first block + fmov x9,d9 + fmov x10,v9.d[1] + //mov w19,#0x87 + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr#31 + eor x9,x11,x9,lsl#1 + fmov d6,x9 + fmov v6.d[1],x10 + eor v5.16b,v8.16b,v7.16b + csel x6,x2,x6,lo // x6, w6, is zero at this point + aese v0.16b,v17.16b + aesmc v0.16b,v0.16b + aese v1.16b,v17.16b + aesmc v1.16b,v1.16b + aese v24.16b,v17.16b + aesmc v24.16b,v24.16b + eor v17.16b,v9.16b,v7.16b + + add x6,x6,#0x20 + add x0,x0,x6 + mov x7,x3 + + aese v0.16b,v20.16b + aesmc v0.16b,v0.16b + aese v1.16b,v20.16b + aesmc v1.16b,v1.16b + aese v24.16b,v20.16b + aesmc v24.16b,v24.16b + aese v0.16b,v21.16b + aesmc v0.16b,v0.16b + aese v1.16b,v21.16b + aesmc v1.16b,v1.16b + aese v24.16b,v21.16b + aesmc v24.16b,v24.16b + aese v0.16b,v22.16b + aesmc v0.16b,v0.16b + aese v1.16b,v22.16b + aesmc v1.16b,v1.16b + aese v24.16b,v22.16b + aesmc v24.16b,v24.16b + aese v0.16b,v23.16b + aese v1.16b,v23.16b + aese v24.16b,v23.16b + ld1 {v27.16b},[x0],#16 + add w6,w5,#2 + ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] + eor v4.16b,v4.16b,v0.16b + eor v5.16b,v5.16b,v1.16b + eor v24.16b,v24.16b,v17.16b + ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] + st1 {v4.16b},[x1],#16 + st1 {v5.16b},[x1],#16 + st1 {v24.16b},[x1],#16 + cmn x2,#0x30 + b.eq Lxts_enc_done +Lxts_encxor_one: + orr v28.16b,v3.16b,v3.16b + orr v29.16b,v27.16b,v27.16b + nop + +Lxts_inner_enc_tail: + cmn x2,#0x10 + eor v1.16b,v28.16b,v6.16b + eor v24.16b,v29.16b,v8.16b + b.eq Lxts_enc_tail_loop + eor v24.16b,v29.16b,v6.16b +Lxts_enc_tail_loop: + aese v1.16b,v16.16b + aesmc v1.16b,v1.16b + aese v24.16b,v16.16b + aesmc v24.16b,v24.16b + ld1 {v16.4s},[x7],#16 + subs w6,w6,#2 + aese v1.16b,v17.16b + aesmc v1.16b,v1.16b + aese v24.16b,v17.16b + aesmc v24.16b,v24.16b + ld1 {v17.4s},[x7],#16 + b.gt Lxts_enc_tail_loop + + aese v1.16b,v16.16b + aesmc v1.16b,v1.16b + aese v24.16b,v16.16b + aesmc v24.16b,v24.16b + aese v1.16b,v17.16b + aesmc v1.16b,v1.16b + aese v24.16b,v17.16b + aesmc v24.16b,v24.16b + aese v1.16b,v20.16b + aesmc v1.16b,v1.16b + aese v24.16b,v20.16b + aesmc v24.16b,v24.16b + cmn x2,#0x20 + aese v1.16b,v21.16b + aesmc v1.16b,v1.16b + aese v24.16b,v21.16b + aesmc v24.16b,v24.16b + eor v5.16b,v6.16b,v7.16b + aese v1.16b,v22.16b + aesmc v1.16b,v1.16b + aese v24.16b,v22.16b + aesmc v24.16b,v24.16b + eor v17.16b,v8.16b,v7.16b + aese v1.16b,v23.16b + aese v24.16b,v23.16b + b.eq Lxts_enc_one + eor v5.16b,v5.16b,v1.16b + st1 {v5.16b},[x1],#16 + eor v17.16b,v17.16b,v24.16b + orr v6.16b,v8.16b,v8.16b + st1 {v17.16b},[x1],#16 + fmov x9,d8 + fmov x10,v8.d[1] + mov w19,#0x87 + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr #31 + eor x9,x11,x9,lsl #1 + fmov d6,x9 + fmov v6.d[1],x10 + b Lxts_enc_done + +Lxts_enc_one: + eor v5.16b,v5.16b,v24.16b + orr v6.16b,v6.16b,v6.16b + st1 {v5.16b},[x1],#16 + fmov x9,d6 + fmov x10,v6.d[1] + mov w19,#0x87 + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr #31 + eor x9,x11,x9,lsl #1 + fmov d6,x9 + fmov v6.d[1],x10 + b Lxts_enc_done +.align 5 +Lxts_enc_done: + // Process the tail block with cipher stealing. + tst x21,#0xf + b.eq Lxts_abort + + mov x20,x0 + mov x13,x1 + sub x1,x1,#16 +.composite_enc_loop: + subs x21,x21,#1 + ldrb w15,[x1,x21] + ldrb w14,[x20,x21] + strb w15,[x13,x21] + strb w14,[x1,x21] + b.gt .composite_enc_loop +Lxts_enc_load_done: + ld1 {v26.16b},[x1] + eor v26.16b,v26.16b,v6.16b + + // Encrypt the composite block to get the last second encrypted text block + ldr w6,[x3,#240] // load key schedule... + ld1 {v0.4s},[x3],#16 + sub w6,w6,#2 + ld1 {v1.4s},[x3],#16 // load key schedule... +Loop_final_enc: + aese v26.16b,v0.16b + aesmc v26.16b,v26.16b + ld1 {v0.4s},[x3],#16 + subs w6,w6,#2 + aese v26.16b,v1.16b + aesmc v26.16b,v26.16b + ld1 {v1.4s},[x3],#16 + b.gt Loop_final_enc + + aese v26.16b,v0.16b + aesmc v26.16b,v26.16b + ld1 {v0.4s},[x3] + aese v26.16b,v1.16b + eor v26.16b,v26.16b,v0.16b + eor v26.16b,v26.16b,v6.16b + st1 {v26.16b},[x1] + +Lxts_abort: + ldp x21,x22,[sp,#48] + ldp d8,d9,[sp,#32] + ldp d10,d11,[sp,#16] + ldp x19,x20,[sp],#64 +Lxts_enc_final_abort: + ret + +.globl aes_v8_xts_decrypt +.def aes_v8_xts_decrypt + .type 32 +.endef +.align 5 +aes_v8_xts_decrypt: + AARCH64_VALID_CALL_TARGET + cmp x2,#16 + // Original input data size bigger than 16, jump to big size processing. + b.ne Lxts_dec_big_size + // Encrypt the iv with key2, as the first XEX iv. + ldr w6,[x4,#240] + ld1 {v0.4s},[x4],#16 + ld1 {v6.16b},[x5] + sub w6,w6,#2 + ld1 {v1.4s},[x4],#16 + +Loop_dec_small_iv_enc: + aese v6.16b,v0.16b + aesmc v6.16b,v6.16b + ld1 {v0.4s},[x4],#16 + subs w6,w6,#2 + aese v6.16b,v1.16b + aesmc v6.16b,v6.16b + ld1 {v1.4s},[x4],#16 + b.gt Loop_dec_small_iv_enc + + aese v6.16b,v0.16b + aesmc v6.16b,v6.16b + ld1 {v0.4s},[x4] + aese v6.16b,v1.16b + eor v6.16b,v6.16b,v0.16b + + ld1 {v0.16b},[x0] + eor v0.16b,v6.16b,v0.16b + + ldr w6,[x3,#240] + ld1 {v28.4s,v29.4s},[x3],#32 // load key schedule... + + aesd v0.16b,v28.16b + aesimc v0.16b,v0.16b + ld1 {v16.4s,v17.4s},[x3],#32 // load key schedule... + aesd v0.16b,v29.16b + aesimc v0.16b,v0.16b + subs w6,w6,#10 // bias + b.eq Lxts_128_dec +Lxts_dec_round_loop: + aesd v0.16b,v16.16b + aesimc v0.16b,v0.16b + ld1 {v16.4s},[x3],#16 // load key schedule... + aesd v0.16b,v17.16b + aesimc v0.16b,v0.16b + ld1 {v17.4s},[x3],#16 // load key schedule... + subs w6,w6,#2 // bias + b.gt Lxts_dec_round_loop +Lxts_128_dec: + ld1 {v18.4s,v19.4s},[x3],#32 // load key schedule... + aesd v0.16b,v16.16b + aesimc v0.16b,v0.16b + aesd v0.16b,v17.16b + aesimc v0.16b,v0.16b + ld1 {v20.4s,v21.4s},[x3],#32 // load key schedule... + aesd v0.16b,v18.16b + aesimc v0.16b,v0.16b + aesd v0.16b,v19.16b + aesimc v0.16b,v0.16b + ld1 {v22.4s,v23.4s},[x3],#32 // load key schedule... + aesd v0.16b,v20.16b + aesimc v0.16b,v0.16b + aesd v0.16b,v21.16b + aesimc v0.16b,v0.16b + ld1 {v7.4s},[x3] + aesd v0.16b,v22.16b + aesimc v0.16b,v0.16b + aesd v0.16b,v23.16b + eor v0.16b,v0.16b,v7.16b + eor v0.16b,v6.16b,v0.16b + st1 {v0.16b},[x1] + b Lxts_dec_final_abort +Lxts_dec_big_size: + stp x19,x20,[sp,#-64]! + stp x21,x22,[sp,#48] + stp d8,d9,[sp,#32] + stp d10,d11,[sp,#16] + + and x21,x2,#0xf + and x2,x2,#-16 + subs x2,x2,#16 + mov x8,#16 + b.lo Lxts_dec_abort + + // Encrypt the iv with key2, as the first XEX iv + ldr w6,[x4,#240] + ld1 {v0.4s},[x4],#16 + ld1 {v6.16b},[x5] + sub w6,w6,#2 + ld1 {v1.4s},[x4],#16 + +Loop_dec_iv_enc: + aese v6.16b,v0.16b + aesmc v6.16b,v6.16b + ld1 {v0.4s},[x4],#16 + subs w6,w6,#2 + aese v6.16b,v1.16b + aesmc v6.16b,v6.16b + ld1 {v1.4s},[x4],#16 + b.gt Loop_dec_iv_enc + + aese v6.16b,v0.16b + aesmc v6.16b,v6.16b + ld1 {v0.4s},[x4] + aese v6.16b,v1.16b + eor v6.16b,v6.16b,v0.16b + + // The iv for second block + // x9- iv(low), x10 - iv(high) + // the five ivs stored into, v6.16b,v8.16b,v9.16b,v10.16b,v11.16b + fmov x9,d6 + fmov x10,v6.d[1] + mov w19,#0x87 + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr #31 + eor x9,x11,x9,lsl #1 + fmov d8,x9 + fmov v8.d[1],x10 + + ldr w5,[x3,#240] // load rounds number + + // The iv for third block + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr #31 + eor x9,x11,x9,lsl #1 + fmov d9,x9 + fmov v9.d[1],x10 + + ld1 {v16.4s,v17.4s},[x3] // load key schedule... + sub w5,w5,#6 + add x7,x3,x5,lsl#4 // pointer to last 7 round keys + sub w5,w5,#2 + ld1 {v18.4s,v19.4s},[x7],#32 // load key schedule... + ld1 {v20.4s,v21.4s},[x7],#32 + ld1 {v22.4s,v23.4s},[x7],#32 + ld1 {v7.4s},[x7] + + // The iv for fourth block + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr #31 + eor x9,x11,x9,lsl #1 + fmov d10,x9 + fmov v10.d[1],x10 + + add x7,x3,#32 + mov w6,w5 + b Lxts_dec + + // Decryption +.align 5 +Lxts_dec: + tst x21,#0xf + b.eq Lxts_dec_begin + subs x2,x2,#16 + csel x8,xzr,x8,eq + ld1 {v0.16b},[x0],#16 + b.lo Lxts_done + sub x0,x0,#16 +Lxts_dec_begin: + ld1 {v0.16b},[x0],x8 + subs x2,x2,#32 // bias + add w6,w5,#2 + orr v3.16b,v0.16b,v0.16b + orr v1.16b,v0.16b,v0.16b + orr v28.16b,v0.16b,v0.16b + ld1 {v24.16b},[x0],#16 + orr v27.16b,v24.16b,v24.16b + orr v29.16b,v24.16b,v24.16b + b.lo Lxts_inner_dec_tail + eor v0.16b,v0.16b,v6.16b // before decryt, xor with iv + eor v24.16b,v24.16b,v8.16b + + orr v1.16b,v24.16b,v24.16b + ld1 {v24.16b},[x0],#16 + orr v2.16b,v0.16b,v0.16b + orr v3.16b,v1.16b,v1.16b + eor v27.16b,v24.16b,v9.16b // third block xox with third iv + eor v24.16b,v24.16b,v9.16b + cmp x2,#32 + b.lo Lxts_outer_dec_tail + + ld1 {v25.16b},[x0],#16 + + // The iv for fifth block + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr #31 + eor x9,x11,x9,lsl #1 + fmov d11,x9 + fmov v11.d[1],x10 + + ld1 {v26.16b},[x0],#16 + eor v25.16b,v25.16b,v10.16b // the fourth block + eor v26.16b,v26.16b,v11.16b + sub x2,x2,#32 // bias + mov w6,w5 + b Loop5x_xts_dec + +.align 4 +Loop5x_xts_dec: + aesd v0.16b,v16.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v16.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v16.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v16.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v16.16b + aesimc v26.16b,v26.16b + ld1 {v16.4s},[x7],#16 // load key schedule... + subs w6,w6,#2 + aesd v0.16b,v17.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v17.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v17.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v17.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v17.16b + aesimc v26.16b,v26.16b + ld1 {v17.4s},[x7],#16 // load key schedule... + b.gt Loop5x_xts_dec + + aesd v0.16b,v16.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v16.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v16.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v16.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v16.16b + aesimc v26.16b,v26.16b + subs x2,x2,#0x50 // because Lxts_dec_tail4x + + aesd v0.16b,v17.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v17.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v17.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v17.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v17.16b + aesimc v26.16b,v26.16b + csel x6,xzr,x2,gt // borrow x6, w6, "gt" is not typo + mov x7,x3 + + aesd v0.16b,v18.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v18.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v18.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v18.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v18.16b + aesimc v26.16b,v26.16b + add x0,x0,x6 // x0 is adjusted in such way that + // at exit from the loop v1.16b-v26.16b + // are loaded with last "words" + add x6,x2,#0x60 // because Lxts_dec_tail4x + + aesd v0.16b,v19.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v19.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v19.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v19.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v19.16b + aesimc v26.16b,v26.16b + + aesd v0.16b,v20.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v20.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v20.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v20.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v20.16b + aesimc v26.16b,v26.16b + + aesd v0.16b,v21.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v21.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v21.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v21.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v21.16b + aesimc v26.16b,v26.16b + + aesd v0.16b,v22.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v22.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v22.16b + aesimc v24.16b,v24.16b + aesd v25.16b,v22.16b + aesimc v25.16b,v25.16b + aesd v26.16b,v22.16b + aesimc v26.16b,v26.16b + + eor v4.16b,v7.16b,v6.16b + aesd v0.16b,v23.16b + // The iv for first block of next iteration. + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr #31 + eor x9,x11,x9,lsl #1 + fmov d6,x9 + fmov v6.d[1],x10 + eor v5.16b,v7.16b,v8.16b + ld1 {v2.16b},[x0],#16 + aesd v1.16b,v23.16b + // The iv for second block + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr #31 + eor x9,x11,x9,lsl #1 + fmov d8,x9 + fmov v8.d[1],x10 + eor v17.16b,v7.16b,v9.16b + ld1 {v3.16b},[x0],#16 + aesd v24.16b,v23.16b + // The iv for third block + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr #31 + eor x9,x11,x9,lsl #1 + fmov d9,x9 + fmov v9.d[1],x10 + eor v30.16b,v7.16b,v10.16b + ld1 {v27.16b},[x0],#16 + aesd v25.16b,v23.16b + // The iv for fourth block + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr #31 + eor x9,x11,x9,lsl #1 + fmov d10,x9 + fmov v10.d[1],x10 + eor v31.16b,v7.16b,v11.16b + ld1 {v28.16b},[x0],#16 + aesd v26.16b,v23.16b + + // The iv for fifth block + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr #31 + eor x9,x11,x9,lsl #1 + fmov d11,x9 + fmov v11.d[1],x10 + + ld1 {v29.16b},[x0],#16 + cbz x6,Lxts_dec_tail4x + ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] + eor v4.16b,v4.16b,v0.16b + eor v0.16b,v2.16b,v6.16b + eor v5.16b,v5.16b,v1.16b + eor v1.16b,v3.16b,v8.16b + eor v17.16b,v17.16b,v24.16b + eor v24.16b,v27.16b,v9.16b + eor v30.16b,v30.16b,v25.16b + eor v25.16b,v28.16b,v10.16b + eor v31.16b,v31.16b,v26.16b + st1 {v4.16b},[x1],#16 + eor v26.16b,v29.16b,v11.16b + st1 {v5.16b},[x1],#16 + mov w6,w5 + st1 {v17.16b},[x1],#16 + ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] + st1 {v30.16b},[x1],#16 + st1 {v31.16b},[x1],#16 + b.hs Loop5x_xts_dec + + cmn x2,#0x10 + b.ne Loop5x_dec_after + // If x2(x2) equal to -0x10, the left blocks is 4. + // After specially processing, utilize the five blocks processing again. + // It will use the following IVs: v6.16b,v6.16b,v8.16b,v9.16b,v10.16b. + orr v11.16b,v10.16b,v10.16b + orr v10.16b,v9.16b,v9.16b + orr v9.16b,v8.16b,v8.16b + orr v8.16b,v6.16b,v6.16b + fmov x9,d11 + fmov x10,v11.d[1] + eor v0.16b,v6.16b,v2.16b + eor v1.16b,v8.16b,v3.16b + eor v24.16b,v27.16b,v9.16b + eor v25.16b,v28.16b,v10.16b + eor v26.16b,v29.16b,v11.16b + b.eq Loop5x_xts_dec + +Loop5x_dec_after: + add x2,x2,#0x50 + cbz x2,Lxts_done + + add w6,w5,#2 + subs x2,x2,#0x30 + b.lo Lxts_inner_dec_tail + + eor v0.16b,v6.16b,v27.16b + eor v1.16b,v8.16b,v28.16b + eor v24.16b,v29.16b,v9.16b + b Lxts_outer_dec_tail + +.align 4 +Lxts_dec_tail4x: + add x0,x0,#16 + tst x21,#0xf + eor v5.16b,v1.16b,v4.16b + st1 {v5.16b},[x1],#16 + eor v17.16b,v24.16b,v17.16b + st1 {v17.16b},[x1],#16 + eor v30.16b,v25.16b,v30.16b + eor v31.16b,v26.16b,v31.16b + st1 {v30.16b,v31.16b},[x1],#32 + + b.eq Lxts_dec_abort + ld1 {v0.16b},[x0],#16 + b Lxts_done +.align 4 +Lxts_outer_dec_tail: + aesd v0.16b,v16.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v16.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v16.16b + aesimc v24.16b,v24.16b + ld1 {v16.4s},[x7],#16 + subs w6,w6,#2 + aesd v0.16b,v17.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v17.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v17.16b + aesimc v24.16b,v24.16b + ld1 {v17.4s},[x7],#16 + b.gt Lxts_outer_dec_tail + + aesd v0.16b,v16.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v16.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v16.16b + aesimc v24.16b,v24.16b + eor v4.16b,v6.16b,v7.16b + subs x2,x2,#0x30 + // The iv for first block + fmov x9,d9 + fmov x10,v9.d[1] + mov w19,#0x87 + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr #31 + eor x9,x11,x9,lsl #1 + fmov d6,x9 + fmov v6.d[1],x10 + eor v5.16b,v8.16b,v7.16b + csel x6,x2,x6,lo // x6, w6, is zero at this point + aesd v0.16b,v17.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v17.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v17.16b + aesimc v24.16b,v24.16b + eor v17.16b,v9.16b,v7.16b + // The iv for second block + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr #31 + eor x9,x11,x9,lsl #1 + fmov d8,x9 + fmov v8.d[1],x10 + + add x6,x6,#0x20 + add x0,x0,x6 // x0 is adjusted to the last data + + mov x7,x3 + + // The iv for third block + extr x22,x10,x10,#32 + extr x10,x10,x9,#63 + and w11,w19,w22,asr #31 + eor x9,x11,x9,lsl #1 + fmov d9,x9 + fmov v9.d[1],x10 + + aesd v0.16b,v20.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v20.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v20.16b + aesimc v24.16b,v24.16b + aesd v0.16b,v21.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v21.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v21.16b + aesimc v24.16b,v24.16b + aesd v0.16b,v22.16b + aesimc v0.16b,v0.16b + aesd v1.16b,v22.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v22.16b + aesimc v24.16b,v24.16b + ld1 {v27.16b},[x0],#16 + aesd v0.16b,v23.16b + aesd v1.16b,v23.16b + aesd v24.16b,v23.16b + ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] + add w6,w5,#2 + eor v4.16b,v4.16b,v0.16b + eor v5.16b,v5.16b,v1.16b + eor v24.16b,v24.16b,v17.16b + ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] + st1 {v4.16b},[x1],#16 + st1 {v5.16b},[x1],#16 + st1 {v24.16b},[x1],#16 + + cmn x2,#0x30 + add x2,x2,#0x30 + b.eq Lxts_done + sub x2,x2,#0x30 + orr v28.16b,v3.16b,v3.16b + orr v29.16b,v27.16b,v27.16b + nop + +Lxts_inner_dec_tail: + // x2 == -0x10 means two blocks left. + cmn x2,#0x10 + eor v1.16b,v28.16b,v6.16b + eor v24.16b,v29.16b,v8.16b + b.eq Lxts_dec_tail_loop + eor v24.16b,v29.16b,v6.16b +Lxts_dec_tail_loop: + aesd v1.16b,v16.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v16.16b + aesimc v24.16b,v24.16b + ld1 {v16.4s},[x7],#16 + subs w6,w6,#2 + aesd v1.16b,v17.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v17.16b + aesimc v24.16b,v24.16b + ld1 {v17.4s},[x7],#16 + b.gt Lxts_dec_tail_loop + + aesd v1.16b,v16.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v16.16b + aesimc v24.16b,v24.16b + aesd v1.16b,v17.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v17.16b + aesimc v24.16b,v24.16b + aesd v1.16b,v20.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v20.16b + aesimc v24.16b,v24.16b + cmn x2,#0x20 + aesd v1.16b,v21.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v21.16b + aesimc v24.16b,v24.16b + eor v5.16b,v6.16b,v7.16b + aesd v1.16b,v22.16b + aesimc v1.16b,v1.16b + aesd v24.16b,v22.16b + aesimc v24.16b,v24.16b + eor v17.16b,v8.16b,v7.16b + aesd v1.16b,v23.16b + aesd v24.16b,v23.16b + b.eq Lxts_dec_one + eor v5.16b,v5.16b,v1.16b + eor v17.16b,v17.16b,v24.16b + orr v6.16b,v9.16b,v9.16b + orr v8.16b,v10.16b,v10.16b + st1 {v5.16b},[x1],#16 + st1 {v17.16b},[x1],#16 + add x2,x2,#16 + b Lxts_done + +Lxts_dec_one: + eor v5.16b,v5.16b,v24.16b + orr v6.16b,v8.16b,v8.16b + orr v8.16b,v9.16b,v9.16b + st1 {v5.16b},[x1],#16 + add x2,x2,#32 + +Lxts_done: + tst x21,#0xf + b.eq Lxts_dec_abort + // Processing the last two blocks with cipher stealing. + mov x7,x3 + cbnz x2,Lxts_dec_1st_done + ld1 {v0.16b},[x0],#16 + + // Decrypt the last second block to get the last plain text block +Lxts_dec_1st_done: + eor v26.16b,v0.16b,v8.16b + ldr w6,[x3,#240] + ld1 {v0.4s},[x3],#16 + sub w6,w6,#2 + ld1 {v1.4s},[x3],#16 +Loop_final_2nd_dec: + aesd v26.16b,v0.16b + aesimc v26.16b,v26.16b + ld1 {v0.4s},[x3],#16 // load key schedule... + subs w6,w6,#2 + aesd v26.16b,v1.16b + aesimc v26.16b,v26.16b + ld1 {v1.4s},[x3],#16 // load key schedule... + b.gt Loop_final_2nd_dec + + aesd v26.16b,v0.16b + aesimc v26.16b,v26.16b + ld1 {v0.4s},[x3] + aesd v26.16b,v1.16b + eor v26.16b,v26.16b,v0.16b + eor v26.16b,v26.16b,v8.16b + st1 {v26.16b},[x1] + + mov x20,x0 + add x13,x1,#16 + + // Composite the tailcnt "16 byte not aligned block" into the last second plain blocks + // to get the last encrypted block. +.composite_dec_loop: + subs x21,x21,#1 + ldrb w15,[x1,x21] + ldrb w14,[x20,x21] + strb w15,[x13,x21] + strb w14,[x1,x21] + b.gt .composite_dec_loop +Lxts_dec_load_done: + ld1 {v26.16b},[x1] + eor v26.16b,v26.16b,v6.16b + + // Decrypt the composite block to get the last second plain text block + ldr w6,[x7,#240] + ld1 {v0.4s},[x7],#16 + sub w6,w6,#2 + ld1 {v1.4s},[x7],#16 +Loop_final_dec: + aesd v26.16b,v0.16b + aesimc v26.16b,v26.16b + ld1 {v0.4s},[x7],#16 // load key schedule... + subs w6,w6,#2 + aesd v26.16b,v1.16b + aesimc v26.16b,v26.16b + ld1 {v1.4s},[x7],#16 // load key schedule... + b.gt Loop_final_dec + + aesd v26.16b,v0.16b + aesimc v26.16b,v26.16b + ld1 {v0.4s},[x7] + aesd v26.16b,v1.16b + eor v26.16b,v26.16b,v0.16b + eor v26.16b,v26.16b,v6.16b + st1 {v26.16b},[x1] + +Lxts_dec_abort: + ldp x21,x22,[sp,#48] + ldp d8,d9,[sp,#32] + ldp d10,d11,[sp,#16] + ldp x19,x20,[sp],#64 + +Lxts_dec_final_abort: + ret + +#endif diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/aes/bsaes-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/aes/bsaes-armv8.S new file mode 100644 index 000000000000..11632a56ee47 --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/aes/bsaes-armv8.S @@ -0,0 +1,2369 @@ +// Copyright 2021-2025 The OpenSSL Project Authors. All Rights Reserved. +// +// Licensed under the OpenSSL license (the "License"). You may not use +// this file except in compliance with the License. You can obtain a copy +// in the file LICENSE in the source distribution or at +// https://www.openssl.org/source/license.html +// +// ==================================================================== +// Written by Ben Avison for the OpenSSL +// project. Rights for redistribution and usage in source and binary +// forms are granted according to the OpenSSL license. +// ==================================================================== +// +// This implementation is a translation of bsaes-armv7 for AArch64. +// No attempt has been made to carry across the build switches for +// kernel targets, since the Linux kernel crypto support has moved on +// from when it was based on OpenSSL. + +// A lot of hand-scheduling has been performed. Consequently, this code +// doesn't factor out neatly into macros in the same way that the +// AArch32 version did, and there is little to be gained by wrapping it +// up in Perl, and it is presented as pure assembly. + + +#include "crypto/arm_arch.h" + +.text + + + + + +.def _bsaes_decrypt8 + .type 32 +.endef +.align 4 +// On entry: +// x9 -> key (previously expanded using _bsaes_key_convert) +// x10 = number of rounds +// v0-v7 input data +// On exit: +// x9-x11 corrupted +// other general-purpose registers preserved +// v0-v7 output data +// v11-v15 preserved +// other SIMD registers corrupted +_bsaes_decrypt8: + ldr q8, [x9], #16 + adrp x11, LM0ISR + add x11, x11, #:lo12:LM0ISR + movi v9.16b, #0x55 + ldr q10, [x11], #16 + movi v16.16b, #0x33 + movi v17.16b, #0x0f + sub x10, x10, #1 + eor v0.16b, v0.16b, v8.16b + eor v1.16b, v1.16b, v8.16b + eor v2.16b, v2.16b, v8.16b + eor v4.16b, v4.16b, v8.16b + eor v3.16b, v3.16b, v8.16b + eor v5.16b, v5.16b, v8.16b + tbl v0.16b, {v0.16b}, v10.16b + tbl v1.16b, {v1.16b}, v10.16b + tbl v2.16b, {v2.16b}, v10.16b + tbl v4.16b, {v4.16b}, v10.16b + eor v6.16b, v6.16b, v8.16b + eor v7.16b, v7.16b, v8.16b + tbl v3.16b, {v3.16b}, v10.16b + tbl v5.16b, {v5.16b}, v10.16b + tbl v6.16b, {v6.16b}, v10.16b + ushr v8.2d, v0.2d, #1 + tbl v7.16b, {v7.16b}, v10.16b + ushr v10.2d, v4.2d, #1 + ushr v18.2d, v2.2d, #1 + eor v8.16b, v8.16b, v1.16b + ushr v19.2d, v6.2d, #1 + eor v10.16b, v10.16b, v5.16b + eor v18.16b, v18.16b, v3.16b + and v8.16b, v8.16b, v9.16b + eor v19.16b, v19.16b, v7.16b + and v10.16b, v10.16b, v9.16b + and v18.16b, v18.16b, v9.16b + eor v1.16b, v1.16b, v8.16b + shl v8.2d, v8.2d, #1 + and v9.16b, v19.16b, v9.16b + eor v5.16b, v5.16b, v10.16b + shl v10.2d, v10.2d, #1 + eor v3.16b, v3.16b, v18.16b + shl v18.2d, v18.2d, #1 + eor v0.16b, v0.16b, v8.16b + shl v8.2d, v9.2d, #1 + eor v7.16b, v7.16b, v9.16b + eor v4.16b, v4.16b, v10.16b + eor v2.16b, v2.16b, v18.16b + ushr v9.2d, v1.2d, #2 + eor v6.16b, v6.16b, v8.16b + ushr v8.2d, v0.2d, #2 + ushr v10.2d, v5.2d, #2 + ushr v18.2d, v4.2d, #2 + eor v9.16b, v9.16b, v3.16b + eor v8.16b, v8.16b, v2.16b + eor v10.16b, v10.16b, v7.16b + eor v18.16b, v18.16b, v6.16b + and v9.16b, v9.16b, v16.16b + and v8.16b, v8.16b, v16.16b + and v10.16b, v10.16b, v16.16b + and v16.16b, v18.16b, v16.16b + eor v3.16b, v3.16b, v9.16b + shl v9.2d, v9.2d, #2 + eor v2.16b, v2.16b, v8.16b + shl v8.2d, v8.2d, #2 + eor v7.16b, v7.16b, v10.16b + shl v10.2d, v10.2d, #2 + eor v6.16b, v6.16b, v16.16b + shl v16.2d, v16.2d, #2 + eor v1.16b, v1.16b, v9.16b + eor v0.16b, v0.16b, v8.16b + eor v5.16b, v5.16b, v10.16b + eor v4.16b, v4.16b, v16.16b + ushr v8.2d, v3.2d, #4 + ushr v9.2d, v2.2d, #4 + ushr v10.2d, v1.2d, #4 + ushr v16.2d, v0.2d, #4 + eor v8.16b, v8.16b, v7.16b + eor v9.16b, v9.16b, v6.16b + eor v10.16b, v10.16b, v5.16b + eor v16.16b, v16.16b, v4.16b + and v8.16b, v8.16b, v17.16b + and v9.16b, v9.16b, v17.16b + and v10.16b, v10.16b, v17.16b + and v16.16b, v16.16b, v17.16b + eor v7.16b, v7.16b, v8.16b + shl v8.2d, v8.2d, #4 + eor v6.16b, v6.16b, v9.16b + shl v9.2d, v9.2d, #4 + eor v5.16b, v5.16b, v10.16b + shl v10.2d, v10.2d, #4 + eor v4.16b, v4.16b, v16.16b + shl v16.2d, v16.2d, #4 + eor v3.16b, v3.16b, v8.16b + eor v2.16b, v2.16b, v9.16b + eor v1.16b, v1.16b, v10.16b + eor v0.16b, v0.16b, v16.16b + b Ldec_sbox +.align 4 +Ldec_loop: + ld1 {v16.16b, v17.16b, v18.16b, v19.16b}, [x9], #64 + ldp q8, q9, [x9], #32 + eor v0.16b, v16.16b, v0.16b + ldr q10, [x9], #16 + eor v1.16b, v17.16b, v1.16b + ldr q16, [x9], #16 + eor v2.16b, v18.16b, v2.16b + eor v3.16b, v19.16b, v3.16b + eor v4.16b, v8.16b, v4.16b + eor v5.16b, v9.16b, v5.16b + eor v6.16b, v10.16b, v6.16b + eor v7.16b, v16.16b, v7.16b + tbl v0.16b, {v0.16b}, v28.16b + tbl v1.16b, {v1.16b}, v28.16b + tbl v2.16b, {v2.16b}, v28.16b + tbl v3.16b, {v3.16b}, v28.16b + tbl v4.16b, {v4.16b}, v28.16b + tbl v5.16b, {v5.16b}, v28.16b + tbl v6.16b, {v6.16b}, v28.16b + tbl v7.16b, {v7.16b}, v28.16b +Ldec_sbox: + eor v1.16b, v1.16b, v4.16b + eor v3.16b, v3.16b, v4.16b + subs x10, x10, #1 + eor v4.16b, v4.16b, v7.16b + eor v2.16b, v2.16b, v7.16b + eor v1.16b, v1.16b, v6.16b + eor v6.16b, v6.16b, v4.16b + eor v2.16b, v2.16b, v5.16b + eor v0.16b, v0.16b, v1.16b + eor v7.16b, v7.16b, v6.16b + eor v8.16b, v6.16b, v2.16b + and v9.16b, v4.16b, v6.16b + eor v10.16b, v2.16b, v6.16b + eor v3.16b, v3.16b, v0.16b + eor v5.16b, v5.16b, v0.16b + eor v16.16b, v7.16b, v4.16b + eor v17.16b, v4.16b, v0.16b + and v18.16b, v0.16b, v2.16b + eor v19.16b, v7.16b, v4.16b + eor v1.16b, v1.16b, v3.16b + eor v20.16b, v3.16b, v0.16b + eor v21.16b, v5.16b, v2.16b + eor v22.16b, v3.16b, v7.16b + and v8.16b, v17.16b, v8.16b + orr v17.16b, v3.16b, v5.16b + eor v23.16b, v1.16b, v6.16b + eor v24.16b, v20.16b, v16.16b + eor v25.16b, v1.16b, v5.16b + orr v26.16b, v20.16b, v21.16b + and v20.16b, v20.16b, v21.16b + and v27.16b, v7.16b, v1.16b + eor v21.16b, v21.16b, v23.16b + orr v28.16b, v16.16b, v23.16b + orr v29.16b, v22.16b, v25.16b + eor v26.16b, v26.16b, v8.16b + and v16.16b, v16.16b, v23.16b + and v22.16b, v22.16b, v25.16b + and v21.16b, v24.16b, v21.16b + eor v8.16b, v28.16b, v8.16b + eor v23.16b, v5.16b, v2.16b + eor v24.16b, v1.16b, v6.16b + eor v16.16b, v16.16b, v22.16b + eor v22.16b, v3.16b, v0.16b + eor v25.16b, v29.16b, v21.16b + eor v21.16b, v26.16b, v21.16b + eor v8.16b, v8.16b, v20.16b + eor v26.16b, v23.16b, v24.16b + eor v16.16b, v16.16b, v20.16b + eor v28.16b, v22.16b, v19.16b + eor v20.16b, v25.16b, v20.16b + eor v9.16b, v21.16b, v9.16b + eor v8.16b, v8.16b, v18.16b + eor v18.16b, v5.16b, v1.16b + eor v21.16b, v16.16b, v17.16b + eor v16.16b, v16.16b, v17.16b + eor v17.16b, v20.16b, v27.16b + eor v20.16b, v3.16b, v7.16b + eor v25.16b, v9.16b, v8.16b + eor v27.16b, v0.16b, v4.16b + and v29.16b, v9.16b, v17.16b + eor v30.16b, v8.16b, v29.16b + eor v31.16b, v21.16b, v29.16b + eor v29.16b, v21.16b, v29.16b + bsl v30.16b, v17.16b, v21.16b + bsl v31.16b, v9.16b, v8.16b + bsl v16.16b, v30.16b, v29.16b + bsl v21.16b, v29.16b, v30.16b + eor v8.16b, v31.16b, v30.16b + and v1.16b, v1.16b, v31.16b + and v9.16b, v16.16b, v31.16b + and v6.16b, v6.16b, v30.16b + eor v16.16b, v17.16b, v21.16b + and v4.16b, v4.16b, v30.16b + eor v17.16b, v8.16b, v30.16b + and v21.16b, v24.16b, v8.16b + eor v9.16b, v9.16b, v25.16b + and v19.16b, v19.16b, v8.16b + eor v24.16b, v30.16b, v16.16b + eor v25.16b, v30.16b, v16.16b + and v7.16b, v7.16b, v17.16b + and v10.16b, v10.16b, v16.16b + eor v29.16b, v9.16b, v16.16b + eor v30.16b, v31.16b, v9.16b + and v0.16b, v24.16b, v0.16b + and v9.16b, v18.16b, v9.16b + and v2.16b, v25.16b, v2.16b + eor v10.16b, v10.16b, v6.16b + eor v18.16b, v29.16b, v16.16b + and v5.16b, v30.16b, v5.16b + eor v24.16b, v8.16b, v29.16b + and v25.16b, v26.16b, v29.16b + and v26.16b, v28.16b, v29.16b + eor v8.16b, v8.16b, v29.16b + eor v17.16b, v17.16b, v18.16b + eor v5.16b, v1.16b, v5.16b + and v23.16b, v24.16b, v23.16b + eor v21.16b, v21.16b, v25.16b + eor v19.16b, v19.16b, v26.16b + eor v0.16b, v4.16b, v0.16b + and v3.16b, v17.16b, v3.16b + eor v1.16b, v9.16b, v1.16b + eor v9.16b, v25.16b, v23.16b + eor v5.16b, v5.16b, v21.16b + eor v2.16b, v6.16b, v2.16b + and v6.16b, v8.16b, v22.16b + eor v3.16b, v7.16b, v3.16b + and v8.16b, v20.16b, v18.16b + eor v10.16b, v10.16b, v9.16b + eor v0.16b, v0.16b, v19.16b + eor v9.16b, v1.16b, v9.16b + eor v1.16b, v2.16b, v21.16b + eor v3.16b, v3.16b, v19.16b + and v16.16b, v27.16b, v16.16b + eor v17.16b, v26.16b, v6.16b + eor v6.16b, v8.16b, v7.16b + eor v7.16b, v1.16b, v9.16b + eor v1.16b, v5.16b, v3.16b + eor v2.16b, v10.16b, v3.16b + eor v4.16b, v16.16b, v4.16b + eor v8.16b, v6.16b, v17.16b + eor v5.16b, v9.16b, v3.16b + eor v9.16b, v0.16b, v1.16b + eor v6.16b, v7.16b, v1.16b + eor v0.16b, v4.16b, v17.16b + eor v4.16b, v8.16b, v7.16b + eor v7.16b, v9.16b, v2.16b + eor v8.16b, v3.16b, v0.16b + eor v7.16b, v7.16b, v5.16b + eor v3.16b, v4.16b, v7.16b + eor v4.16b, v7.16b, v0.16b + eor v7.16b, v8.16b, v3.16b + bcc Ldec_done + ext v8.16b, v0.16b, v0.16b, #8 + ext v9.16b, v1.16b, v1.16b, #8 + ldr q28, [x11] // load from LISR in common case (x10 > 0) + ext v10.16b, v6.16b, v6.16b, #8 + ext v16.16b, v3.16b, v3.16b, #8 + ext v17.16b, v5.16b, v5.16b, #8 + ext v18.16b, v4.16b, v4.16b, #8 + eor v8.16b, v8.16b, v0.16b + eor v9.16b, v9.16b, v1.16b + eor v10.16b, v10.16b, v6.16b + eor v16.16b, v16.16b, v3.16b + eor v17.16b, v17.16b, v5.16b + ext v19.16b, v2.16b, v2.16b, #8 + ext v20.16b, v7.16b, v7.16b, #8 + eor v18.16b, v18.16b, v4.16b + eor v6.16b, v6.16b, v8.16b + eor v8.16b, v2.16b, v10.16b + eor v4.16b, v4.16b, v9.16b + eor v2.16b, v19.16b, v2.16b + eor v9.16b, v20.16b, v7.16b + eor v0.16b, v0.16b, v16.16b + eor v1.16b, v1.16b, v16.16b + eor v6.16b, v6.16b, v17.16b + eor v8.16b, v8.16b, v16.16b + eor v7.16b, v7.16b, v18.16b + eor v4.16b, v4.16b, v16.16b + eor v2.16b, v3.16b, v2.16b + eor v1.16b, v1.16b, v17.16b + eor v3.16b, v5.16b, v9.16b + eor v5.16b, v8.16b, v17.16b + eor v7.16b, v7.16b, v17.16b + ext v8.16b, v0.16b, v0.16b, #12 + ext v9.16b, v6.16b, v6.16b, #12 + ext v10.16b, v4.16b, v4.16b, #12 + ext v16.16b, v1.16b, v1.16b, #12 + ext v17.16b, v5.16b, v5.16b, #12 + ext v18.16b, v7.16b, v7.16b, #12 + eor v0.16b, v0.16b, v8.16b + eor v6.16b, v6.16b, v9.16b + eor v4.16b, v4.16b, v10.16b + ext v19.16b, v2.16b, v2.16b, #12 + ext v20.16b, v3.16b, v3.16b, #12 + eor v1.16b, v1.16b, v16.16b + eor v5.16b, v5.16b, v17.16b + eor v7.16b, v7.16b, v18.16b + eor v2.16b, v2.16b, v19.16b + eor v16.16b, v16.16b, v0.16b + eor v3.16b, v3.16b, v20.16b + eor v17.16b, v17.16b, v4.16b + eor v10.16b, v10.16b, v6.16b + ext v0.16b, v0.16b, v0.16b, #8 + eor v9.16b, v9.16b, v1.16b + ext v1.16b, v1.16b, v1.16b, #8 + eor v8.16b, v8.16b, v3.16b + eor v16.16b, v16.16b, v3.16b + eor v18.16b, v18.16b, v5.16b + eor v19.16b, v19.16b, v7.16b + ext v21.16b, v5.16b, v5.16b, #8 + ext v5.16b, v7.16b, v7.16b, #8 + eor v7.16b, v20.16b, v2.16b + ext v4.16b, v4.16b, v4.16b, #8 + ext v20.16b, v3.16b, v3.16b, #8 + eor v17.16b, v17.16b, v3.16b + ext v2.16b, v2.16b, v2.16b, #8 + eor v3.16b, v10.16b, v3.16b + ext v10.16b, v6.16b, v6.16b, #8 + eor v0.16b, v0.16b, v8.16b + eor v1.16b, v1.16b, v16.16b + eor v5.16b, v5.16b, v18.16b + eor v3.16b, v3.16b, v4.16b + eor v7.16b, v20.16b, v7.16b + eor v6.16b, v2.16b, v19.16b + eor v4.16b, v21.16b, v17.16b + eor v2.16b, v10.16b, v9.16b + bne Ldec_loop + ldr q28, [x11, #16]! // load from LISRM0 on last round (x10 == 0) + b Ldec_loop +.align 4 +Ldec_done: + ushr v8.2d, v0.2d, #1 + movi v9.16b, #0x55 + ldr q10, [x9] + ushr v16.2d, v2.2d, #1 + movi v17.16b, #0x33 + ushr v18.2d, v6.2d, #1 + movi v19.16b, #0x0f + eor v8.16b, v8.16b, v1.16b + ushr v20.2d, v3.2d, #1 + eor v16.16b, v16.16b, v7.16b + eor v18.16b, v18.16b, v4.16b + and v8.16b, v8.16b, v9.16b + eor v20.16b, v20.16b, v5.16b + and v16.16b, v16.16b, v9.16b + and v18.16b, v18.16b, v9.16b + shl v21.2d, v8.2d, #1 + eor v1.16b, v1.16b, v8.16b + and v8.16b, v20.16b, v9.16b + eor v7.16b, v7.16b, v16.16b + shl v9.2d, v16.2d, #1 + eor v4.16b, v4.16b, v18.16b + shl v16.2d, v18.2d, #1 + eor v0.16b, v0.16b, v21.16b + shl v18.2d, v8.2d, #1 + eor v5.16b, v5.16b, v8.16b + eor v2.16b, v2.16b, v9.16b + eor v6.16b, v6.16b, v16.16b + ushr v8.2d, v1.2d, #2 + eor v3.16b, v3.16b, v18.16b + ushr v9.2d, v0.2d, #2 + ushr v16.2d, v7.2d, #2 + ushr v18.2d, v2.2d, #2 + eor v8.16b, v8.16b, v4.16b + eor v9.16b, v9.16b, v6.16b + eor v16.16b, v16.16b, v5.16b + eor v18.16b, v18.16b, v3.16b + and v8.16b, v8.16b, v17.16b + and v9.16b, v9.16b, v17.16b + and v16.16b, v16.16b, v17.16b + and v17.16b, v18.16b, v17.16b + eor v4.16b, v4.16b, v8.16b + shl v8.2d, v8.2d, #2 + eor v6.16b, v6.16b, v9.16b + shl v9.2d, v9.2d, #2 + eor v5.16b, v5.16b, v16.16b + shl v16.2d, v16.2d, #2 + eor v3.16b, v3.16b, v17.16b + shl v17.2d, v17.2d, #2 + eor v1.16b, v1.16b, v8.16b + eor v0.16b, v0.16b, v9.16b + eor v7.16b, v7.16b, v16.16b + eor v2.16b, v2.16b, v17.16b + ushr v8.2d, v4.2d, #4 + ushr v9.2d, v6.2d, #4 + ushr v16.2d, v1.2d, #4 + ushr v17.2d, v0.2d, #4 + eor v8.16b, v8.16b, v5.16b + eor v9.16b, v9.16b, v3.16b + eor v16.16b, v16.16b, v7.16b + eor v17.16b, v17.16b, v2.16b + and v8.16b, v8.16b, v19.16b + and v9.16b, v9.16b, v19.16b + and v16.16b, v16.16b, v19.16b + and v17.16b, v17.16b, v19.16b + eor v5.16b, v5.16b, v8.16b + shl v8.2d, v8.2d, #4 + eor v3.16b, v3.16b, v9.16b + shl v9.2d, v9.2d, #4 + eor v7.16b, v7.16b, v16.16b + shl v16.2d, v16.2d, #4 + eor v2.16b, v2.16b, v17.16b + shl v17.2d, v17.2d, #4 + eor v4.16b, v4.16b, v8.16b + eor v6.16b, v6.16b, v9.16b + eor v7.16b, v7.16b, v10.16b + eor v1.16b, v1.16b, v16.16b + eor v2.16b, v2.16b, v10.16b + eor v0.16b, v0.16b, v17.16b + eor v4.16b, v4.16b, v10.16b + eor v6.16b, v6.16b, v10.16b + eor v3.16b, v3.16b, v10.16b + eor v5.16b, v5.16b, v10.16b + eor v1.16b, v1.16b, v10.16b + eor v0.16b, v0.16b, v10.16b + ret + + +.section .rodata + +.align 6 +_bsaes_consts: +// InvShiftRows constants +// Used in _bsaes_decrypt8, which assumes contiguity +// .LM0ISR used with round 0 key +// .LISR used with middle round keys +// .LISRM0 used with final round key +LM0ISR: +.quad 0x0a0e0206070b0f03, 0x0004080c0d010509 +LISR: +.quad 0x0504070602010003, 0x0f0e0d0c080b0a09 +LISRM0: +.quad 0x01040b0e0205080f, 0x0306090c00070a0d + +// ShiftRows constants +// Used in _bsaes_encrypt8, which assumes contiguity +// .LM0SR used with round 0 key +// .LSR used with middle round keys +// .LSRM0 used with final round key +LM0SR: +.quad 0x0a0e02060f03070b, 0x0004080c05090d01 +LSR: +.quad 0x0504070600030201, 0x0f0e0d0c0a09080b +LSRM0: +.quad 0x0304090e00050a0f, 0x01060b0c0207080d + +LM0_bigendian: +.quad 0x02060a0e03070b0f, 0x0004080c0105090d +LM0_littleendian: +.quad 0x0105090d0004080c, 0x03070b0f02060a0e + +// Used in ossl_bsaes_ctr32_encrypt_blocks, prior to dropping into +// _bsaes_encrypt8_alt, for round 0 key in place of .LM0SR +LREVM0SR: +.quad 0x090d01050c000408, 0x03070b0f060a0e02 + +.align 6 + + +.text + +.def _bsaes_encrypt8 + .type 32 +.endef +.align 4 +// On entry: +// x9 -> key (previously expanded using _bsaes_key_convert) +// x10 = number of rounds +// v0-v7 input data +// On exit: +// x9-x11 corrupted +// other general-purpose registers preserved +// v0-v7 output data +// v11-v15 preserved +// other SIMD registers corrupted +_bsaes_encrypt8: + ldr q8, [x9], #16 + adrp x11, LM0SR + add x11, x11, #:lo12:LM0SR + ldr q9, [x11], #16 +_bsaes_encrypt8_alt: + eor v0.16b, v0.16b, v8.16b + eor v1.16b, v1.16b, v8.16b + sub x10, x10, #1 + eor v2.16b, v2.16b, v8.16b + eor v4.16b, v4.16b, v8.16b + eor v3.16b, v3.16b, v8.16b + eor v5.16b, v5.16b, v8.16b + tbl v0.16b, {v0.16b}, v9.16b + tbl v1.16b, {v1.16b}, v9.16b + tbl v2.16b, {v2.16b}, v9.16b + tbl v4.16b, {v4.16b}, v9.16b + eor v6.16b, v6.16b, v8.16b + eor v7.16b, v7.16b, v8.16b + tbl v3.16b, {v3.16b}, v9.16b + tbl v5.16b, {v5.16b}, v9.16b + tbl v6.16b, {v6.16b}, v9.16b + ushr v8.2d, v0.2d, #1 + movi v10.16b, #0x55 + tbl v7.16b, {v7.16b}, v9.16b + ushr v9.2d, v4.2d, #1 + movi v16.16b, #0x33 + ushr v17.2d, v2.2d, #1 + eor v8.16b, v8.16b, v1.16b + movi v18.16b, #0x0f + ushr v19.2d, v6.2d, #1 + eor v9.16b, v9.16b, v5.16b + eor v17.16b, v17.16b, v3.16b + and v8.16b, v8.16b, v10.16b + eor v19.16b, v19.16b, v7.16b + and v9.16b, v9.16b, v10.16b + and v17.16b, v17.16b, v10.16b + eor v1.16b, v1.16b, v8.16b + shl v8.2d, v8.2d, #1 + and v10.16b, v19.16b, v10.16b + eor v5.16b, v5.16b, v9.16b + shl v9.2d, v9.2d, #1 + eor v3.16b, v3.16b, v17.16b + shl v17.2d, v17.2d, #1 + eor v0.16b, v0.16b, v8.16b + shl v8.2d, v10.2d, #1 + eor v7.16b, v7.16b, v10.16b + eor v4.16b, v4.16b, v9.16b + eor v2.16b, v2.16b, v17.16b + ushr v9.2d, v1.2d, #2 + eor v6.16b, v6.16b, v8.16b + ushr v8.2d, v0.2d, #2 + ushr v10.2d, v5.2d, #2 + ushr v17.2d, v4.2d, #2 + eor v9.16b, v9.16b, v3.16b + eor v8.16b, v8.16b, v2.16b + eor v10.16b, v10.16b, v7.16b + eor v17.16b, v17.16b, v6.16b + and v9.16b, v9.16b, v16.16b + and v8.16b, v8.16b, v16.16b + and v10.16b, v10.16b, v16.16b + and v16.16b, v17.16b, v16.16b + eor v3.16b, v3.16b, v9.16b + shl v9.2d, v9.2d, #2 + eor v2.16b, v2.16b, v8.16b + shl v8.2d, v8.2d, #2 + eor v7.16b, v7.16b, v10.16b + shl v10.2d, v10.2d, #2 + eor v6.16b, v6.16b, v16.16b + shl v16.2d, v16.2d, #2 + eor v1.16b, v1.16b, v9.16b + eor v0.16b, v0.16b, v8.16b + eor v5.16b, v5.16b, v10.16b + eor v4.16b, v4.16b, v16.16b + ushr v8.2d, v3.2d, #4 + ushr v9.2d, v2.2d, #4 + ushr v10.2d, v1.2d, #4 + ushr v16.2d, v0.2d, #4 + eor v8.16b, v8.16b, v7.16b + eor v9.16b, v9.16b, v6.16b + eor v10.16b, v10.16b, v5.16b + eor v16.16b, v16.16b, v4.16b + and v8.16b, v8.16b, v18.16b + and v9.16b, v9.16b, v18.16b + and v10.16b, v10.16b, v18.16b + and v16.16b, v16.16b, v18.16b + eor v7.16b, v7.16b, v8.16b + shl v8.2d, v8.2d, #4 + eor v6.16b, v6.16b, v9.16b + shl v9.2d, v9.2d, #4 + eor v5.16b, v5.16b, v10.16b + shl v10.2d, v10.2d, #4 + eor v4.16b, v4.16b, v16.16b + shl v16.2d, v16.2d, #4 + eor v3.16b, v3.16b, v8.16b + eor v2.16b, v2.16b, v9.16b + eor v1.16b, v1.16b, v10.16b + eor v0.16b, v0.16b, v16.16b + b Lenc_sbox +.align 4 +Lenc_loop: + ld1 {v16.16b, v17.16b, v18.16b, v19.16b}, [x9], #64 + ldp q8, q9, [x9], #32 + eor v0.16b, v16.16b, v0.16b + ldr q10, [x9], #16 + eor v1.16b, v17.16b, v1.16b + ldr q16, [x9], #16 + eor v2.16b, v18.16b, v2.16b + eor v3.16b, v19.16b, v3.16b + eor v4.16b, v8.16b, v4.16b + eor v5.16b, v9.16b, v5.16b + eor v6.16b, v10.16b, v6.16b + eor v7.16b, v16.16b, v7.16b + tbl v0.16b, {v0.16b}, v28.16b + tbl v1.16b, {v1.16b}, v28.16b + tbl v2.16b, {v2.16b}, v28.16b + tbl v3.16b, {v3.16b}, v28.16b + tbl v4.16b, {v4.16b}, v28.16b + tbl v5.16b, {v5.16b}, v28.16b + tbl v6.16b, {v6.16b}, v28.16b + tbl v7.16b, {v7.16b}, v28.16b +Lenc_sbox: + eor v5.16b, v5.16b, v6.16b + eor v3.16b, v3.16b, v0.16b + subs x10, x10, #1 + eor v2.16b, v2.16b, v1.16b + eor v5.16b, v5.16b, v0.16b + eor v8.16b, v3.16b, v7.16b + eor v6.16b, v6.16b, v2.16b + eor v7.16b, v7.16b, v5.16b + eor v8.16b, v8.16b, v4.16b + eor v3.16b, v6.16b, v3.16b + eor v4.16b, v4.16b, v5.16b + eor v6.16b, v1.16b, v5.16b + eor v2.16b, v2.16b, v7.16b + eor v1.16b, v8.16b, v1.16b + eor v8.16b, v7.16b, v4.16b + eor v9.16b, v3.16b, v0.16b + eor v10.16b, v7.16b, v6.16b + eor v16.16b, v5.16b, v3.16b + eor v17.16b, v6.16b, v2.16b + eor v18.16b, v5.16b, v1.16b + eor v19.16b, v2.16b, v4.16b + eor v20.16b, v1.16b, v0.16b + orr v21.16b, v8.16b, v9.16b + orr v22.16b, v10.16b, v16.16b + eor v23.16b, v8.16b, v17.16b + eor v24.16b, v9.16b, v18.16b + and v19.16b, v19.16b, v20.16b + orr v20.16b, v17.16b, v18.16b + and v8.16b, v8.16b, v9.16b + and v9.16b, v17.16b, v18.16b + and v17.16b, v23.16b, v24.16b + and v10.16b, v10.16b, v16.16b + eor v16.16b, v21.16b, v19.16b + eor v18.16b, v20.16b, v19.16b + and v19.16b, v2.16b, v1.16b + and v20.16b, v6.16b, v5.16b + eor v21.16b, v22.16b, v17.16b + eor v9.16b, v9.16b, v10.16b + eor v10.16b, v16.16b, v17.16b + eor v16.16b, v18.16b, v8.16b + and v17.16b, v4.16b, v0.16b + orr v18.16b, v7.16b, v3.16b + eor v21.16b, v21.16b, v8.16b + eor v8.16b, v9.16b, v8.16b + eor v9.16b, v10.16b, v19.16b + eor v10.16b, v3.16b, v0.16b + eor v16.16b, v16.16b, v17.16b + eor v17.16b, v5.16b, v1.16b + eor v19.16b, v21.16b, v20.16b + eor v20.16b, v8.16b, v18.16b + eor v8.16b, v8.16b, v18.16b + eor v18.16b, v7.16b, v4.16b + eor v21.16b, v9.16b, v16.16b + eor v22.16b, v6.16b, v2.16b + and v23.16b, v9.16b, v19.16b + eor v24.16b, v10.16b, v17.16b + eor v25.16b, v0.16b, v1.16b + eor v26.16b, v7.16b, v6.16b + eor v27.16b, v18.16b, v22.16b + eor v28.16b, v3.16b, v5.16b + eor v29.16b, v16.16b, v23.16b + eor v30.16b, v20.16b, v23.16b + eor v23.16b, v20.16b, v23.16b + eor v31.16b, v4.16b, v2.16b + bsl v29.16b, v19.16b, v20.16b + bsl v30.16b, v9.16b, v16.16b + bsl v8.16b, v29.16b, v23.16b + bsl v20.16b, v23.16b, v29.16b + eor v9.16b, v30.16b, v29.16b + and v5.16b, v5.16b, v30.16b + and v8.16b, v8.16b, v30.16b + and v1.16b, v1.16b, v29.16b + eor v16.16b, v19.16b, v20.16b + and v2.16b, v2.16b, v29.16b + eor v19.16b, v9.16b, v29.16b + and v17.16b, v17.16b, v9.16b + eor v8.16b, v8.16b, v21.16b + and v20.16b, v22.16b, v9.16b + eor v21.16b, v29.16b, v16.16b + eor v22.16b, v29.16b, v16.16b + and v23.16b, v25.16b, v16.16b + and v6.16b, v6.16b, v19.16b + eor v25.16b, v8.16b, v16.16b + eor v29.16b, v30.16b, v8.16b + and v4.16b, v21.16b, v4.16b + and v8.16b, v28.16b, v8.16b + and v0.16b, v22.16b, v0.16b + eor v21.16b, v23.16b, v1.16b + eor v22.16b, v9.16b, v25.16b + eor v9.16b, v9.16b, v25.16b + eor v23.16b, v25.16b, v16.16b + and v3.16b, v29.16b, v3.16b + and v24.16b, v24.16b, v25.16b + and v25.16b, v27.16b, v25.16b + and v10.16b, v22.16b, v10.16b + and v9.16b, v9.16b, v18.16b + eor v18.16b, v19.16b, v23.16b + and v19.16b, v26.16b, v23.16b + eor v3.16b, v5.16b, v3.16b + eor v17.16b, v17.16b, v24.16b + eor v10.16b, v24.16b, v10.16b + and v16.16b, v31.16b, v16.16b + eor v20.16b, v20.16b, v25.16b + eor v9.16b, v25.16b, v9.16b + eor v4.16b, v2.16b, v4.16b + and v7.16b, v18.16b, v7.16b + eor v18.16b, v19.16b, v6.16b + eor v5.16b, v8.16b, v5.16b + eor v0.16b, v1.16b, v0.16b + eor v1.16b, v21.16b, v10.16b + eor v8.16b, v3.16b, v17.16b + eor v2.16b, v16.16b, v2.16b + eor v3.16b, v6.16b, v7.16b + eor v6.16b, v18.16b, v9.16b + eor v4.16b, v4.16b, v20.16b + eor v10.16b, v5.16b, v10.16b + eor v0.16b, v0.16b, v17.16b + eor v9.16b, v2.16b, v9.16b + eor v3.16b, v3.16b, v20.16b + eor v7.16b, v6.16b, v1.16b + eor v5.16b, v8.16b, v4.16b + eor v6.16b, v10.16b, v1.16b + eor v2.16b, v4.16b, v0.16b + eor v4.16b, v3.16b, v10.16b + eor v9.16b, v9.16b, v7.16b + eor v3.16b, v0.16b, v5.16b + eor v0.16b, v1.16b, v4.16b + eor v1.16b, v4.16b, v8.16b + eor v4.16b, v9.16b, v5.16b + eor v6.16b, v6.16b, v3.16b + bcc Lenc_done + ext v8.16b, v0.16b, v0.16b, #12 + ext v9.16b, v4.16b, v4.16b, #12 + ldr q28, [x11] + ext v10.16b, v6.16b, v6.16b, #12 + ext v16.16b, v1.16b, v1.16b, #12 + ext v17.16b, v3.16b, v3.16b, #12 + ext v18.16b, v7.16b, v7.16b, #12 + eor v0.16b, v0.16b, v8.16b + eor v4.16b, v4.16b, v9.16b + eor v6.16b, v6.16b, v10.16b + ext v19.16b, v2.16b, v2.16b, #12 + ext v20.16b, v5.16b, v5.16b, #12 + eor v1.16b, v1.16b, v16.16b + eor v3.16b, v3.16b, v17.16b + eor v7.16b, v7.16b, v18.16b + eor v2.16b, v2.16b, v19.16b + eor v16.16b, v16.16b, v0.16b + eor v5.16b, v5.16b, v20.16b + eor v17.16b, v17.16b, v6.16b + eor v10.16b, v10.16b, v4.16b + ext v0.16b, v0.16b, v0.16b, #8 + eor v9.16b, v9.16b, v1.16b + ext v1.16b, v1.16b, v1.16b, #8 + eor v8.16b, v8.16b, v5.16b + eor v16.16b, v16.16b, v5.16b + eor v18.16b, v18.16b, v3.16b + eor v19.16b, v19.16b, v7.16b + ext v3.16b, v3.16b, v3.16b, #8 + ext v7.16b, v7.16b, v7.16b, #8 + eor v20.16b, v20.16b, v2.16b + ext v6.16b, v6.16b, v6.16b, #8 + ext v21.16b, v5.16b, v5.16b, #8 + eor v17.16b, v17.16b, v5.16b + ext v2.16b, v2.16b, v2.16b, #8 + eor v10.16b, v10.16b, v5.16b + ext v22.16b, v4.16b, v4.16b, #8 + eor v0.16b, v0.16b, v8.16b + eor v1.16b, v1.16b, v16.16b + eor v5.16b, v7.16b, v18.16b + eor v4.16b, v3.16b, v17.16b + eor v3.16b, v6.16b, v10.16b + eor v7.16b, v21.16b, v20.16b + eor v6.16b, v2.16b, v19.16b + eor v2.16b, v22.16b, v9.16b + bne Lenc_loop + ldr q28, [x11, #16]! // load from LSRM0 on last round (x10 == 0) + b Lenc_loop +.align 4 +Lenc_done: + ushr v8.2d, v0.2d, #1 + movi v9.16b, #0x55 + ldr q10, [x9] + ushr v16.2d, v3.2d, #1 + movi v17.16b, #0x33 + ushr v18.2d, v4.2d, #1 + movi v19.16b, #0x0f + eor v8.16b, v8.16b, v1.16b + ushr v20.2d, v2.2d, #1 + eor v16.16b, v16.16b, v7.16b + eor v18.16b, v18.16b, v6.16b + and v8.16b, v8.16b, v9.16b + eor v20.16b, v20.16b, v5.16b + and v16.16b, v16.16b, v9.16b + and v18.16b, v18.16b, v9.16b + shl v21.2d, v8.2d, #1 + eor v1.16b, v1.16b, v8.16b + and v8.16b, v20.16b, v9.16b + eor v7.16b, v7.16b, v16.16b + shl v9.2d, v16.2d, #1 + eor v6.16b, v6.16b, v18.16b + shl v16.2d, v18.2d, #1 + eor v0.16b, v0.16b, v21.16b + shl v18.2d, v8.2d, #1 + eor v5.16b, v5.16b, v8.16b + eor v3.16b, v3.16b, v9.16b + eor v4.16b, v4.16b, v16.16b + ushr v8.2d, v1.2d, #2 + eor v2.16b, v2.16b, v18.16b + ushr v9.2d, v0.2d, #2 + ushr v16.2d, v7.2d, #2 + ushr v18.2d, v3.2d, #2 + eor v8.16b, v8.16b, v6.16b + eor v9.16b, v9.16b, v4.16b + eor v16.16b, v16.16b, v5.16b + eor v18.16b, v18.16b, v2.16b + and v8.16b, v8.16b, v17.16b + and v9.16b, v9.16b, v17.16b + and v16.16b, v16.16b, v17.16b + and v17.16b, v18.16b, v17.16b + eor v6.16b, v6.16b, v8.16b + shl v8.2d, v8.2d, #2 + eor v4.16b, v4.16b, v9.16b + shl v9.2d, v9.2d, #2 + eor v5.16b, v5.16b, v16.16b + shl v16.2d, v16.2d, #2 + eor v2.16b, v2.16b, v17.16b + shl v17.2d, v17.2d, #2 + eor v1.16b, v1.16b, v8.16b + eor v0.16b, v0.16b, v9.16b + eor v7.16b, v7.16b, v16.16b + eor v3.16b, v3.16b, v17.16b + ushr v8.2d, v6.2d, #4 + ushr v9.2d, v4.2d, #4 + ushr v16.2d, v1.2d, #4 + ushr v17.2d, v0.2d, #4 + eor v8.16b, v8.16b, v5.16b + eor v9.16b, v9.16b, v2.16b + eor v16.16b, v16.16b, v7.16b + eor v17.16b, v17.16b, v3.16b + and v8.16b, v8.16b, v19.16b + and v9.16b, v9.16b, v19.16b + and v16.16b, v16.16b, v19.16b + and v17.16b, v17.16b, v19.16b + eor v5.16b, v5.16b, v8.16b + shl v8.2d, v8.2d, #4 + eor v2.16b, v2.16b, v9.16b + shl v9.2d, v9.2d, #4 + eor v7.16b, v7.16b, v16.16b + shl v16.2d, v16.2d, #4 + eor v3.16b, v3.16b, v17.16b + shl v17.2d, v17.2d, #4 + eor v6.16b, v6.16b, v8.16b + eor v4.16b, v4.16b, v9.16b + eor v7.16b, v7.16b, v10.16b + eor v1.16b, v1.16b, v16.16b + eor v3.16b, v3.16b, v10.16b + eor v0.16b, v0.16b, v17.16b + eor v6.16b, v6.16b, v10.16b + eor v4.16b, v4.16b, v10.16b + eor v2.16b, v2.16b, v10.16b + eor v5.16b, v5.16b, v10.16b + eor v1.16b, v1.16b, v10.16b + eor v0.16b, v0.16b, v10.16b + ret + + +.def _bsaes_key_convert + .type 32 +.endef +.align 4 +// On entry: +// x9 -> input key (big-endian) +// x10 = number of rounds +// x17 -> output key (native endianness) +// On exit: +// x9, x10 corrupted +// x11 -> .LM0_bigendian +// x17 -> last quadword of output key +// other general-purpose registers preserved +// v2-v6 preserved +// v7.16b[] = 0x63 +// v8-v14 preserved +// v15 = last round key (converted to native endianness) +// other SIMD registers corrupted +_bsaes_key_convert: +#ifdef __AARCH64EL__ + adrp x11, LM0_littleendian + add x11, x11, #:lo12:LM0_littleendian +#else + adrp x11, LM0_bigendian + add x11, x11, #:lo12:LM0_bigendian +#endif + ldr q0, [x9], #16 // load round 0 key + ldr q1, [x11] // LM0 + ldr q15, [x9], #16 // load round 1 key + + movi v7.16b, #0x63 // compose L63 + movi v16.16b, #0x01 // bit masks + movi v17.16b, #0x02 + movi v18.16b, #0x04 + movi v19.16b, #0x08 + movi v20.16b, #0x10 + movi v21.16b, #0x20 + movi v22.16b, #0x40 + movi v23.16b, #0x80 + +#ifdef __AARCH64EL__ + rev32 v0.16b, v0.16b +#endif + sub x10, x10, #1 + str q0, [x17], #16 // save round 0 key + +.align 4 +Lkey_loop: + tbl v0.16b, {v15.16b}, v1.16b + ldr q15, [x9], #16 // load next round key + + eor v0.16b, v0.16b, v7.16b + cmtst v24.16b, v0.16b, v16.16b + cmtst v25.16b, v0.16b, v17.16b + cmtst v26.16b, v0.16b, v18.16b + cmtst v27.16b, v0.16b, v19.16b + cmtst v28.16b, v0.16b, v20.16b + cmtst v29.16b, v0.16b, v21.16b + cmtst v30.16b, v0.16b, v22.16b + cmtst v31.16b, v0.16b, v23.16b + sub x10, x10, #1 + st1 {v24.16b,v25.16b,v26.16b,v27.16b}, [x17], #64 // write bit-sliced round key + st1 {v28.16b,v29.16b,v30.16b,v31.16b}, [x17], #64 + cbnz x10, Lkey_loop + + // don't save last round key +#ifdef __AARCH64EL__ + rev32 v15.16b, v15.16b + adrp x11, LM0_bigendian + add x11, x11, #:lo12:LM0_bigendian +#endif + ret + + +.globl ossl_bsaes_cbc_encrypt +.def ossl_bsaes_cbc_encrypt + .type 32 +.endef +.align 4 +// On entry: +// x0 -> input ciphertext +// x1 -> output plaintext +// x2 = size of ciphertext and plaintext in bytes (assumed a multiple of 16) +// x3 -> key +// x4 -> 128-bit initialisation vector (or preceding 128-bit block of ciphertext if continuing after an earlier call) +// w5 must be == 0 +// On exit: +// Output plaintext filled in +// Initialisation vector overwritten with last quadword of ciphertext +// No output registers, usual AAPCS64 register preservation +ossl_bsaes_cbc_encrypt: + AARCH64_VALID_CALL_TARGET + cmp x2, #128 + bhs Lcbc_do_bsaes + b AES_cbc_encrypt +Lcbc_do_bsaes: + + // it is up to the caller to make sure we are called with enc == 0 + + stp x29, x30, [sp, #-48]! + stp d8, d9, [sp, #16] + stp d10, d15, [sp, #32] + lsr x2, x2, #4 // len in 16 byte blocks + + ldr w15, [x3, #240] // get # of rounds + mov x14, sp + + // allocate the key schedule on the stack + add x17, sp, #96 + sub x17, x17, x15, lsl #7 // 128 bytes per inner round key, less 96 bytes + + // populate the key schedule + mov x9, x3 // pass key + mov x10, x15 // pass # of rounds + mov sp, x17 // sp is sp + bl _bsaes_key_convert + ldr q6, [sp] + str q15, [x17] // save last round key + eor v6.16b, v6.16b, v7.16b // fix up round 0 key (by XORing with 0x63) + str q6, [sp] + + ldr q15, [x4] // load IV + b Lcbc_dec_loop + +.align 4 +Lcbc_dec_loop: + subs x2, x2, #0x8 + bmi Lcbc_dec_loop_finish + + ldr q0, [x0], #16 // load input + mov x9, sp // pass the key + ldr q1, [x0], #16 + mov x10, x15 + ldr q2, [x0], #16 + ldr q3, [x0], #16 + ldr q4, [x0], #16 + ldr q5, [x0], #16 + ldr q6, [x0], #16 + ldr q7, [x0], #-7*16 + + bl _bsaes_decrypt8 + + ldr q16, [x0], #16 // reload input + eor v0.16b, v0.16b, v15.16b // ^= IV + eor v1.16b, v1.16b, v16.16b + str q0, [x1], #16 // write output + ldr q0, [x0], #16 + str q1, [x1], #16 + ldr q1, [x0], #16 + eor v1.16b, v4.16b, v1.16b + ldr q4, [x0], #16 + eor v2.16b, v2.16b, v4.16b + eor v0.16b, v6.16b, v0.16b + ldr q4, [x0], #16 + str q0, [x1], #16 + str q1, [x1], #16 + eor v0.16b, v7.16b, v4.16b + ldr q1, [x0], #16 + str q2, [x1], #16 + ldr q2, [x0], #16 + ldr q15, [x0], #16 + str q0, [x1], #16 + eor v0.16b, v5.16b, v2.16b + eor v1.16b, v3.16b, v1.16b + str q1, [x1], #16 + str q0, [x1], #16 + + b Lcbc_dec_loop + +Lcbc_dec_loop_finish: + adds x2, x2, #8 + beq Lcbc_dec_done + + ldr q0, [x0], #16 // load input + cmp x2, #2 + blo Lcbc_dec_one + ldr q1, [x0], #16 + mov x9, sp // pass the key + mov x10, x15 + beq Lcbc_dec_two + ldr q2, [x0], #16 + cmp x2, #4 + blo Lcbc_dec_three + ldr q3, [x0], #16 + beq Lcbc_dec_four + ldr q4, [x0], #16 + cmp x2, #6 + blo Lcbc_dec_five + ldr q5, [x0], #16 + beq Lcbc_dec_six + ldr q6, [x0], #-6*16 + + bl _bsaes_decrypt8 + + ldr q5, [x0], #16 // reload input + eor v0.16b, v0.16b, v15.16b // ^= IV + ldr q8, [x0], #16 + ldr q9, [x0], #16 + ldr q10, [x0], #16 + str q0, [x1], #16 // write output + ldr q0, [x0], #16 + eor v1.16b, v1.16b, v5.16b + ldr q5, [x0], #16 + eor v6.16b, v6.16b, v8.16b + ldr q15, [x0] + eor v4.16b, v4.16b, v9.16b + eor v2.16b, v2.16b, v10.16b + str q1, [x1], #16 + eor v0.16b, v7.16b, v0.16b + str q6, [x1], #16 + eor v1.16b, v3.16b, v5.16b + str q4, [x1], #16 + str q2, [x1], #16 + str q0, [x1], #16 + str q1, [x1] + b Lcbc_dec_done +.align 4 +Lcbc_dec_six: + sub x0, x0, #0x60 + bl _bsaes_decrypt8 + ldr q3, [x0], #16 // reload input + eor v0.16b, v0.16b, v15.16b // ^= IV + ldr q5, [x0], #16 + ldr q8, [x0], #16 + ldr q9, [x0], #16 + str q0, [x1], #16 // write output + ldr q0, [x0], #16 + eor v1.16b, v1.16b, v3.16b + ldr q15, [x0] + eor v3.16b, v6.16b, v5.16b + eor v4.16b, v4.16b, v8.16b + eor v2.16b, v2.16b, v9.16b + str q1, [x1], #16 + eor v0.16b, v7.16b, v0.16b + str q3, [x1], #16 + str q4, [x1], #16 + str q2, [x1], #16 + str q0, [x1] + b Lcbc_dec_done +.align 4 +Lcbc_dec_five: + sub x0, x0, #0x50 + bl _bsaes_decrypt8 + ldr q3, [x0], #16 // reload input + eor v0.16b, v0.16b, v15.16b // ^= IV + ldr q5, [x0], #16 + ldr q7, [x0], #16 + ldr q8, [x0], #16 + str q0, [x1], #16 // write output + ldr q15, [x0] + eor v0.16b, v1.16b, v3.16b + eor v1.16b, v6.16b, v5.16b + eor v3.16b, v4.16b, v7.16b + str q0, [x1], #16 + eor v0.16b, v2.16b, v8.16b + str q1, [x1], #16 + str q3, [x1], #16 + str q0, [x1] + b Lcbc_dec_done +.align 4 +Lcbc_dec_four: + sub x0, x0, #0x40 + bl _bsaes_decrypt8 + ldr q2, [x0], #16 // reload input + eor v0.16b, v0.16b, v15.16b // ^= IV + ldr q3, [x0], #16 + ldr q5, [x0], #16 + str q0, [x1], #16 // write output + ldr q15, [x0] + eor v0.16b, v1.16b, v2.16b + eor v1.16b, v6.16b, v3.16b + eor v2.16b, v4.16b, v5.16b + str q0, [x1], #16 + str q1, [x1], #16 + str q2, [x1] + b Lcbc_dec_done +.align 4 +Lcbc_dec_three: + sub x0, x0, #0x30 + bl _bsaes_decrypt8 + ldr q2, [x0], #16 // reload input + eor v0.16b, v0.16b, v15.16b // ^= IV + ldr q3, [x0], #16 + ldr q15, [x0] + str q0, [x1], #16 // write output + eor v0.16b, v1.16b, v2.16b + eor v1.16b, v6.16b, v3.16b + str q0, [x1], #16 + str q1, [x1] + b Lcbc_dec_done +.align 4 +Lcbc_dec_two: + sub x0, x0, #0x20 + bl _bsaes_decrypt8 + ldr q2, [x0], #16 // reload input + eor v0.16b, v0.16b, v15.16b // ^= IV + ldr q15, [x0] + str q0, [x1], #16 // write output + eor v0.16b, v1.16b, v2.16b + str q0, [x1] + b Lcbc_dec_done +.align 4 +Lcbc_dec_one: + sub x0, x0, #0x10 + stp x1, x4, [sp, #-32]! + str x14, [sp, #16] + mov v8.16b, v15.16b + mov v15.16b, v0.16b + mov x2, x3 + bl AES_decrypt + ldr x14, [sp, #16] + ldp x1, x4, [sp], #32 + ldr q0, [x1] // load result + eor v0.16b, v0.16b, v8.16b // ^= IV + str q0, [x1] // write output + +.align 4 +Lcbc_dec_done: + movi v0.16b, #0 + movi v1.16b, #0 +Lcbc_dec_bzero: // wipe key schedule [if any] + stp q0, q1, [sp], #32 + cmp sp, x14 + bne Lcbc_dec_bzero + str q15, [x4] // return IV + ldp d8, d9, [sp, #16] + ldp d10, d15, [sp, #32] + ldp x29, x30, [sp], #48 + ret + + +.globl ossl_bsaes_ctr32_encrypt_blocks +.def ossl_bsaes_ctr32_encrypt_blocks + .type 32 +.endef +.align 4 +// On entry: +// x0 -> input text (whole 16-byte blocks) +// x1 -> output text (whole 16-byte blocks) +// x2 = number of 16-byte blocks to encrypt/decrypt (> 0) +// x3 -> key +// x4 -> initial value of 128-bit counter (stored big-endian) which increments, modulo 2^32, for each block +// On exit: +// Output text filled in +// No output registers, usual AAPCS64 register preservation +ossl_bsaes_ctr32_encrypt_blocks: + AARCH64_VALID_CALL_TARGET + cmp x2, #8 // use plain AES for + blo Lctr_enc_short // small sizes + + stp x29, x30, [sp, #-80]! + stp d8, d9, [sp, #16] + stp d10, d11, [sp, #32] + stp d12, d13, [sp, #48] + stp d14, d15, [sp, #64] + + ldr w15, [x3, #240] // get # of rounds + mov x14, sp + + // allocate the key schedule on the stack + add x17, sp, #96 + sub x17, x17, x15, lsl #7 // 128 bytes per inner round key, less 96 bytes + + // populate the key schedule + mov x9, x3 // pass key + mov x10, x15 // pass # of rounds + mov sp, x17 // sp is sp + bl _bsaes_key_convert + eor v7.16b, v7.16b, v15.16b // fix up last round key + str q7, [x17] // save last round key + + ldr q0, [x4] // load counter + add x13, x11, #LREVM0SR-LM0_bigendian + ldr q4, [sp] // load round0 key + + movi v8.4s, #1 // compose 1<<96 + movi v9.16b, #0 + rev32 v15.16b, v0.16b + rev32 v0.16b, v0.16b + ext v11.16b, v9.16b, v8.16b, #4 + rev32 v4.16b, v4.16b + add v12.4s, v11.4s, v11.4s // compose 2<<96 + str q4, [sp] // save adjusted round0 key + add v13.4s, v11.4s, v12.4s // compose 3<<96 + add v14.4s, v12.4s, v12.4s // compose 4<<96 + b Lctr_enc_loop + +.align 4 +Lctr_enc_loop: + // Intermix prologue from _bsaes_encrypt8 to use the opportunity + // to flip byte order in 32-bit counter + + add v1.4s, v15.4s, v11.4s // +1 + add x9, sp, #0x10 // pass next round key + add v2.4s, v15.4s, v12.4s // +2 + ldr q9, [x13] // LREVM0SR + ldr q8, [sp] // load round0 key + add v3.4s, v15.4s, v13.4s // +3 + mov x10, x15 // pass rounds + sub x11, x13, #LREVM0SR-LSR // pass constants + add v6.4s, v2.4s, v14.4s + add v4.4s, v15.4s, v14.4s // +4 + add v7.4s, v3.4s, v14.4s + add v15.4s, v4.4s, v14.4s // next counter + add v5.4s, v1.4s, v14.4s + + bl _bsaes_encrypt8_alt + + subs x2, x2, #8 + blo Lctr_enc_loop_done + + ldr q16, [x0], #16 + ldr q17, [x0], #16 + eor v1.16b, v1.16b, v17.16b + ldr q17, [x0], #16 + eor v0.16b, v0.16b, v16.16b + eor v4.16b, v4.16b, v17.16b + str q0, [x1], #16 + ldr q16, [x0], #16 + str q1, [x1], #16 + mov v0.16b, v15.16b + str q4, [x1], #16 + ldr q1, [x0], #16 + eor v4.16b, v6.16b, v16.16b + eor v1.16b, v3.16b, v1.16b + ldr q3, [x0], #16 + eor v3.16b, v7.16b, v3.16b + ldr q6, [x0], #16 + eor v2.16b, v2.16b, v6.16b + ldr q6, [x0], #16 + eor v5.16b, v5.16b, v6.16b + str q4, [x1], #16 + str q1, [x1], #16 + str q3, [x1], #16 + str q2, [x1], #16 + str q5, [x1], #16 + + bne Lctr_enc_loop + b Lctr_enc_done + +.align 4 +Lctr_enc_loop_done: + add x2, x2, #8 + ldr q16, [x0], #16 // load input + eor v0.16b, v0.16b, v16.16b + str q0, [x1], #16 // write output + cmp x2, #2 + blo Lctr_enc_done + ldr q17, [x0], #16 + eor v1.16b, v1.16b, v17.16b + str q1, [x1], #16 + beq Lctr_enc_done + ldr q18, [x0], #16 + eor v4.16b, v4.16b, v18.16b + str q4, [x1], #16 + cmp x2, #4 + blo Lctr_enc_done + ldr q19, [x0], #16 + eor v6.16b, v6.16b, v19.16b + str q6, [x1], #16 + beq Lctr_enc_done + ldr q20, [x0], #16 + eor v3.16b, v3.16b, v20.16b + str q3, [x1], #16 + cmp x2, #6 + blo Lctr_enc_done + ldr q21, [x0], #16 + eor v7.16b, v7.16b, v21.16b + str q7, [x1], #16 + beq Lctr_enc_done + ldr q22, [x0] + eor v2.16b, v2.16b, v22.16b + str q2, [x1], #16 + +Lctr_enc_done: + movi v0.16b, #0 + movi v1.16b, #0 +Lctr_enc_bzero: // wipe key schedule [if any] + stp q0, q1, [sp], #32 + cmp sp, x14 + bne Lctr_enc_bzero + + ldp d8, d9, [sp, #16] + ldp d10, d11, [sp, #32] + ldp d12, d13, [sp, #48] + ldp d14, d15, [sp, #64] + ldp x29, x30, [sp], #80 + ret + +Lctr_enc_short: + stp x29, x30, [sp, #-96]! + stp x19, x20, [sp, #16] + stp x21, x22, [sp, #32] + str x23, [sp, #48] + + mov x19, x0 // copy arguments + mov x20, x1 + mov x21, x2 + mov x22, x3 + ldr w23, [x4, #12] // load counter LSW + ldr q1, [x4] // load whole counter value +#ifdef __AARCH64EL__ + rev w23, w23 +#endif + str q1, [sp, #80] // copy counter value + +Lctr_enc_short_loop: + add x0, sp, #80 // input counter value + add x1, sp, #64 // output on the stack + mov x2, x22 // key + + bl AES_encrypt + + ldr q0, [x19], #16 // load input + ldr q1, [sp, #64] // load encrypted counter + add x23, x23, #1 +#ifdef __AARCH64EL__ + rev w0, w23 + str w0, [sp, #80+12] // next counter value +#else + str w23, [sp, #80+12] // next counter value +#endif + eor v0.16b, v0.16b, v1.16b + str q0, [x20], #16 // store output + subs x21, x21, #1 + bne Lctr_enc_short_loop + + movi v0.16b, #0 + movi v1.16b, #0 + stp q0, q1, [sp, #64] + + ldr x23, [sp, #48] + ldp x21, x22, [sp, #32] + ldp x19, x20, [sp, #16] + ldp x29, x30, [sp], #96 + ret + + +.globl ossl_bsaes_xts_encrypt +.def ossl_bsaes_xts_encrypt + .type 32 +.endef +.align 4 +// On entry: +// x0 -> input plaintext +// x1 -> output ciphertext +// x2 -> length of text in bytes (must be at least 16) +// x3 -> key1 (used to encrypt the XORed plaintext blocks) +// x4 -> key2 (used to encrypt the initial vector to yield the initial tweak) +// x5 -> 16-byte initial vector (typically, sector number) +// On exit: +// Output ciphertext filled in +// No output registers, usual AAPCS64 register preservation +ossl_bsaes_xts_encrypt: + AARCH64_VALID_CALL_TARGET + // Stack layout: + // sp -> + // nrounds*128-96 bytes: key schedule + // x19 -> + // 16 bytes: frame record + // 4*16 bytes: tweak storage across _bsaes_encrypt8 + // 6*8 bytes: storage for 5 callee-saved general-purpose registers + // 8*8 bytes: storage for 8 callee-saved SIMD registers + stp x29, x30, [sp, #-192]! + stp x19, x20, [sp, #80] + stp x21, x22, [sp, #96] + str x23, [sp, #112] + stp d8, d9, [sp, #128] + stp d10, d11, [sp, #144] + stp d12, d13, [sp, #160] + stp d14, d15, [sp, #176] + + mov x19, sp + mov x20, x0 + mov x21, x1 + mov x22, x2 + mov x23, x3 + + // generate initial tweak + sub sp, sp, #16 + mov x0, x5 // iv[] + mov x1, sp + mov x2, x4 // key2 + bl AES_encrypt + ldr q11, [sp], #16 + + ldr w1, [x23, #240] // get # of rounds + // allocate the key schedule on the stack + add x17, sp, #96 + sub x17, x17, x1, lsl #7 // 128 bytes per inner round key, less 96 bytes + + // populate the key schedule + mov x9, x23 // pass key + mov x10, x1 // pass # of rounds + mov sp, x17 + bl _bsaes_key_convert + eor v15.16b, v15.16b, v7.16b // fix up last round key + str q15, [x17] // save last round key + + subs x22, x22, #0x80 + blo Lxts_enc_short + b Lxts_enc_loop + +.align 4 +Lxts_enc_loop: + ldr q8, Lxts_magic + mov x10, x1 // pass rounds + add x2, x19, #16 + ldr q0, [x20], #16 + sshr v1.2d, v11.2d, #63 + mov x9, sp // pass key schedule + ldr q6, Lxts_magic+16 + add v2.2d, v11.2d, v11.2d + cmtst v3.2d, v11.2d, v6.2d + and v1.16b, v1.16b, v8.16b + ext v1.16b, v1.16b, v1.16b, #8 + and v3.16b, v3.16b, v8.16b + ldr q4, [x20], #16 + eor v12.16b, v2.16b, v1.16b + eor v1.16b, v4.16b, v12.16b + eor v0.16b, v0.16b, v11.16b + cmtst v2.2d, v12.2d, v6.2d + add v4.2d, v12.2d, v12.2d + add x0, x19, #16 + ext v3.16b, v3.16b, v3.16b, #8 + and v2.16b, v2.16b, v8.16b + eor v13.16b, v4.16b, v3.16b + ldr q3, [x20], #16 + ext v4.16b, v2.16b, v2.16b, #8 + eor v2.16b, v3.16b, v13.16b + ldr q3, [x20], #16 + add v5.2d, v13.2d, v13.2d + cmtst v7.2d, v13.2d, v6.2d + and v7.16b, v7.16b, v8.16b + ldr q9, [x20], #16 + ext v7.16b, v7.16b, v7.16b, #8 + ldr q10, [x20], #16 + eor v14.16b, v5.16b, v4.16b + ldr q16, [x20], #16 + add v4.2d, v14.2d, v14.2d + eor v3.16b, v3.16b, v14.16b + eor v15.16b, v4.16b, v7.16b + add v5.2d, v15.2d, v15.2d + ldr q7, [x20], #16 + cmtst v4.2d, v14.2d, v6.2d + and v17.16b, v4.16b, v8.16b + cmtst v18.2d, v15.2d, v6.2d + eor v4.16b, v9.16b, v15.16b + ext v9.16b, v17.16b, v17.16b, #8 + eor v9.16b, v5.16b, v9.16b + add v17.2d, v9.2d, v9.2d + and v18.16b, v18.16b, v8.16b + eor v5.16b, v10.16b, v9.16b + str q9, [x2], #16 + ext v10.16b, v18.16b, v18.16b, #8 + cmtst v9.2d, v9.2d, v6.2d + and v9.16b, v9.16b, v8.16b + eor v10.16b, v17.16b, v10.16b + cmtst v17.2d, v10.2d, v6.2d + eor v6.16b, v16.16b, v10.16b + str q10, [x2], #16 + ext v9.16b, v9.16b, v9.16b, #8 + add v10.2d, v10.2d, v10.2d + eor v9.16b, v10.16b, v9.16b + str q9, [x2], #16 + eor v7.16b, v7.16b, v9.16b + add v9.2d, v9.2d, v9.2d + and v8.16b, v17.16b, v8.16b + ext v8.16b, v8.16b, v8.16b, #8 + eor v8.16b, v9.16b, v8.16b + str q8, [x2] // next round tweak + + bl _bsaes_encrypt8 + + ldr q8, [x0], #16 + eor v0.16b, v0.16b, v11.16b + eor v1.16b, v1.16b, v12.16b + ldr q9, [x0], #16 + eor v4.16b, v4.16b, v13.16b + eor v6.16b, v6.16b, v14.16b + ldr q10, [x0], #16 + eor v3.16b, v3.16b, v15.16b + subs x22, x22, #0x80 + str q0, [x21], #16 + ldr q11, [x0] // next round tweak + str q1, [x21], #16 + eor v0.16b, v7.16b, v8.16b + eor v1.16b, v2.16b, v9.16b + str q4, [x21], #16 + eor v2.16b, v5.16b, v10.16b + str q6, [x21], #16 + str q3, [x21], #16 + str q0, [x21], #16 + str q1, [x21], #16 + str q2, [x21], #16 + bpl Lxts_enc_loop + +Lxts_enc_short: + adds x22, x22, #0x70 + bmi Lxts_enc_done + + ldr q8, Lxts_magic + sshr v1.2d, v11.2d, #63 + add v2.2d, v11.2d, v11.2d + ldr q9, Lxts_magic+16 + subs x22, x22, #0x10 + ldr q0, [x20], #16 + and v1.16b, v1.16b, v8.16b + cmtst v3.2d, v11.2d, v9.2d + ext v1.16b, v1.16b, v1.16b, #8 + and v3.16b, v3.16b, v8.16b + eor v12.16b, v2.16b, v1.16b + ext v1.16b, v3.16b, v3.16b, #8 + add v2.2d, v12.2d, v12.2d + cmtst v3.2d, v12.2d, v9.2d + eor v13.16b, v2.16b, v1.16b + and v22.16b, v3.16b, v8.16b + bmi Lxts_enc_1 + + ext v2.16b, v22.16b, v22.16b, #8 + add v3.2d, v13.2d, v13.2d + ldr q1, [x20], #16 + cmtst v4.2d, v13.2d, v9.2d + subs x22, x22, #0x10 + eor v14.16b, v3.16b, v2.16b + and v23.16b, v4.16b, v8.16b + bmi Lxts_enc_2 + + ext v3.16b, v23.16b, v23.16b, #8 + add v4.2d, v14.2d, v14.2d + ldr q2, [x20], #16 + cmtst v5.2d, v14.2d, v9.2d + eor v0.16b, v0.16b, v11.16b + subs x22, x22, #0x10 + eor v15.16b, v4.16b, v3.16b + and v24.16b, v5.16b, v8.16b + bmi Lxts_enc_3 + + ext v4.16b, v24.16b, v24.16b, #8 + add v5.2d, v15.2d, v15.2d + ldr q3, [x20], #16 + cmtst v6.2d, v15.2d, v9.2d + eor v1.16b, v1.16b, v12.16b + subs x22, x22, #0x10 + eor v16.16b, v5.16b, v4.16b + and v25.16b, v6.16b, v8.16b + bmi Lxts_enc_4 + + ext v5.16b, v25.16b, v25.16b, #8 + add v6.2d, v16.2d, v16.2d + add x0, x19, #16 + cmtst v7.2d, v16.2d, v9.2d + ldr q4, [x20], #16 + eor v2.16b, v2.16b, v13.16b + str q16, [x0], #16 + subs x22, x22, #0x10 + eor v17.16b, v6.16b, v5.16b + and v26.16b, v7.16b, v8.16b + bmi Lxts_enc_5 + + ext v7.16b, v26.16b, v26.16b, #8 + add v18.2d, v17.2d, v17.2d + ldr q5, [x20], #16 + eor v3.16b, v3.16b, v14.16b + str q17, [x0], #16 + subs x22, x22, #0x10 + eor v18.16b, v18.16b, v7.16b + bmi Lxts_enc_6 + + ldr q6, [x20], #16 + eor v4.16b, v4.16b, v15.16b + eor v5.16b, v5.16b, v16.16b + str q18, [x0] // next round tweak + mov x9, sp // pass key schedule + mov x10, x1 + add x0, x19, #16 + sub x22, x22, #0x10 + eor v6.16b, v6.16b, v17.16b + + bl _bsaes_encrypt8 + + ldr q16, [x0], #16 + eor v0.16b, v0.16b, v11.16b + eor v1.16b, v1.16b, v12.16b + ldr q17, [x0], #16 + eor v4.16b, v4.16b, v13.16b + eor v6.16b, v6.16b, v14.16b + eor v3.16b, v3.16b, v15.16b + ldr q11, [x0] // next round tweak + str q0, [x21], #16 + str q1, [x21], #16 + eor v0.16b, v7.16b, v16.16b + eor v1.16b, v2.16b, v17.16b + str q4, [x21], #16 + str q6, [x21], #16 + str q3, [x21], #16 + str q0, [x21], #16 + str q1, [x21], #16 + b Lxts_enc_done + +.align 4 +Lxts_enc_6: + eor v4.16b, v4.16b, v15.16b + eor v5.16b, v5.16b, v16.16b + mov x9, sp // pass key schedule + mov x10, x1 // pass rounds + add x0, x19, #16 + + bl _bsaes_encrypt8 + + ldr q16, [x0], #16 + eor v0.16b, v0.16b, v11.16b + eor v1.16b, v1.16b, v12.16b + eor v4.16b, v4.16b, v13.16b + eor v6.16b, v6.16b, v14.16b + ldr q11, [x0] // next round tweak + eor v3.16b, v3.16b, v15.16b + str q0, [x21], #16 + str q1, [x21], #16 + eor v0.16b, v7.16b, v16.16b + str q4, [x21], #16 + str q6, [x21], #16 + str q3, [x21], #16 + str q0, [x21], #16 + b Lxts_enc_done + +.align 4 +Lxts_enc_5: + eor v3.16b, v3.16b, v14.16b + eor v4.16b, v4.16b, v15.16b + mov x9, sp // pass key schedule + mov x10, x1 // pass rounds + add x0, x19, #16 + + bl _bsaes_encrypt8 + + eor v0.16b, v0.16b, v11.16b + eor v1.16b, v1.16b, v12.16b + ldr q11, [x0] // next round tweak + eor v4.16b, v4.16b, v13.16b + eor v6.16b, v6.16b, v14.16b + eor v3.16b, v3.16b, v15.16b + str q0, [x21], #16 + str q1, [x21], #16 + str q4, [x21], #16 + str q6, [x21], #16 + str q3, [x21], #16 + b Lxts_enc_done + +.align 4 +Lxts_enc_4: + eor v2.16b, v2.16b, v13.16b + eor v3.16b, v3.16b, v14.16b + mov x9, sp // pass key schedule + mov x10, x1 // pass rounds + add x0, x19, #16 + + bl _bsaes_encrypt8 + + eor v0.16b, v0.16b, v11.16b + eor v1.16b, v1.16b, v12.16b + eor v4.16b, v4.16b, v13.16b + eor v6.16b, v6.16b, v14.16b + mov v11.16b, v15.16b // next round tweak + str q0, [x21], #16 + str q1, [x21], #16 + str q4, [x21], #16 + str q6, [x21], #16 + b Lxts_enc_done + +.align 4 +Lxts_enc_3: + eor v1.16b, v1.16b, v12.16b + eor v2.16b, v2.16b, v13.16b + mov x9, sp // pass key schedule + mov x10, x1 // pass rounds + add x0, x19, #16 + + bl _bsaes_encrypt8 + + eor v0.16b, v0.16b, v11.16b + eor v1.16b, v1.16b, v12.16b + eor v4.16b, v4.16b, v13.16b + mov v11.16b, v14.16b // next round tweak + str q0, [x21], #16 + str q1, [x21], #16 + str q4, [x21], #16 + b Lxts_enc_done + +.align 4 +Lxts_enc_2: + eor v0.16b, v0.16b, v11.16b + eor v1.16b, v1.16b, v12.16b + mov x9, sp // pass key schedule + mov x10, x1 // pass rounds + add x0, x19, #16 + + bl _bsaes_encrypt8 + + eor v0.16b, v0.16b, v11.16b + eor v1.16b, v1.16b, v12.16b + mov v11.16b, v13.16b // next round tweak + str q0, [x21], #16 + str q1, [x21], #16 + b Lxts_enc_done + +.align 4 +Lxts_enc_1: + eor v0.16b, v0.16b, v11.16b + sub x0, sp, #16 + sub x1, sp, #16 + mov x2, x23 + mov v13.d[0], v11.d[1] // just in case AES_encrypt corrupts top half of callee-saved SIMD registers + mov v14.d[0], v12.d[1] + str q0, [sp, #-16]! + + bl AES_encrypt + + ldr q0, [sp], #16 + trn1 v13.2d, v11.2d, v13.2d + trn1 v11.2d, v12.2d, v14.2d // next round tweak + eor v0.16b, v0.16b, v13.16b + str q0, [x21], #16 + +Lxts_enc_done: + adds x22, x22, #0x10 + beq Lxts_enc_ret + + sub x6, x21, #0x10 + // Penultimate plaintext block produces final ciphertext part-block + // plus remaining part of final plaintext block. Move ciphertext part + // to final position and reuse penultimate ciphertext block buffer to + // construct final plaintext block +Lxts_enc_steal: + ldrb w0, [x20], #1 + ldrb w1, [x21, #-0x10] + strb w0, [x21, #-0x10] + strb w1, [x21], #1 + + subs x22, x22, #1 + bhi Lxts_enc_steal + + // Finally encrypt the penultimate ciphertext block using the + // last tweak + ldr q0, [x6] + eor v0.16b, v0.16b, v11.16b + str q0, [sp, #-16]! + mov x0, sp + mov x1, sp + mov x2, x23 + mov x21, x6 + mov v13.d[0], v11.d[1] // just in case AES_encrypt corrupts top half of callee-saved SIMD registers + + bl AES_encrypt + + trn1 v11.2d, v11.2d, v13.2d + ldr q0, [sp], #16 + eor v0.16b, v0.16b, v11.16b + str q0, [x21] + +Lxts_enc_ret: + + movi v0.16b, #0 + movi v1.16b, #0 +Lxts_enc_bzero: // wipe key schedule + stp q0, q1, [sp], #32 + cmp sp, x19 + bne Lxts_enc_bzero + + ldp x19, x20, [sp, #80] + ldp x21, x22, [sp, #96] + ldr x23, [sp, #112] + ldp d8, d9, [sp, #128] + ldp d10, d11, [sp, #144] + ldp d12, d13, [sp, #160] + ldp d14, d15, [sp, #176] + ldp x29, x30, [sp], #192 + ret + + +// The assembler doesn't seem capable of de-duplicating these when expressed +// using `ldr qd,=` syntax, so assign a symbolic address +.align 5 +Lxts_magic: +.quad 1, 0x87, 0x4000000000000000, 0x4000000000000000 + +.globl ossl_bsaes_xts_decrypt +.def ossl_bsaes_xts_decrypt + .type 32 +.endef +.align 4 +// On entry: +// x0 -> input ciphertext +// x1 -> output plaintext +// x2 -> length of text in bytes (must be at least 16) +// x3 -> key1 (used to decrypt the XORed ciphertext blocks) +// x4 -> key2 (used to encrypt the initial vector to yield the initial tweak) +// x5 -> 16-byte initial vector (typically, sector number) +// On exit: +// Output plaintext filled in +// No output registers, usual AAPCS64 register preservation +ossl_bsaes_xts_decrypt: + AARCH64_VALID_CALL_TARGET + // Stack layout: + // sp -> + // nrounds*128-96 bytes: key schedule + // x19 -> + // 16 bytes: frame record + // 4*16 bytes: tweak storage across _bsaes_decrypt8 + // 6*8 bytes: storage for 5 callee-saved general-purpose registers + // 8*8 bytes: storage for 8 callee-saved SIMD registers + stp x29, x30, [sp, #-192]! + stp x19, x20, [sp, #80] + stp x21, x22, [sp, #96] + str x23, [sp, #112] + stp d8, d9, [sp, #128] + stp d10, d11, [sp, #144] + stp d12, d13, [sp, #160] + stp d14, d15, [sp, #176] + + mov x19, sp + mov x20, x0 + mov x21, x1 + mov x22, x2 + mov x23, x3 + + // generate initial tweak + sub sp, sp, #16 + mov x0, x5 // iv[] + mov x1, sp + mov x2, x4 // key2 + bl AES_encrypt + ldr q11, [sp], #16 + + ldr w1, [x23, #240] // get # of rounds + // allocate the key schedule on the stack + add x17, sp, #96 + sub x17, x17, x1, lsl #7 // 128 bytes per inner round key, less 96 bytes + + // populate the key schedule + mov x9, x23 // pass key + mov x10, x1 // pass # of rounds + mov sp, x17 + bl _bsaes_key_convert + ldr q6, [sp] + str q15, [x17] // save last round key + eor v6.16b, v6.16b, v7.16b // fix up round 0 key (by XORing with 0x63) + str q6, [sp] + + sub x30, x22, #0x10 + tst x22, #0xf // if not multiple of 16 + csel x22, x30, x22, ne // subtract another 16 bytes + subs x22, x22, #0x80 + + blo Lxts_dec_short + b Lxts_dec_loop + +.align 4 +Lxts_dec_loop: + ldr q8, Lxts_magic + mov x10, x1 // pass rounds + add x2, x19, #16 + ldr q0, [x20], #16 + sshr v1.2d, v11.2d, #63 + mov x9, sp // pass key schedule + ldr q6, Lxts_magic+16 + add v2.2d, v11.2d, v11.2d + cmtst v3.2d, v11.2d, v6.2d + and v1.16b, v1.16b, v8.16b + ext v1.16b, v1.16b, v1.16b, #8 + and v3.16b, v3.16b, v8.16b + ldr q4, [x20], #16 + eor v12.16b, v2.16b, v1.16b + eor v1.16b, v4.16b, v12.16b + eor v0.16b, v0.16b, v11.16b + cmtst v2.2d, v12.2d, v6.2d + add v4.2d, v12.2d, v12.2d + add x0, x19, #16 + ext v3.16b, v3.16b, v3.16b, #8 + and v2.16b, v2.16b, v8.16b + eor v13.16b, v4.16b, v3.16b + ldr q3, [x20], #16 + ext v4.16b, v2.16b, v2.16b, #8 + eor v2.16b, v3.16b, v13.16b + ldr q3, [x20], #16 + add v5.2d, v13.2d, v13.2d + cmtst v7.2d, v13.2d, v6.2d + and v7.16b, v7.16b, v8.16b + ldr q9, [x20], #16 + ext v7.16b, v7.16b, v7.16b, #8 + ldr q10, [x20], #16 + eor v14.16b, v5.16b, v4.16b + ldr q16, [x20], #16 + add v4.2d, v14.2d, v14.2d + eor v3.16b, v3.16b, v14.16b + eor v15.16b, v4.16b, v7.16b + add v5.2d, v15.2d, v15.2d + ldr q7, [x20], #16 + cmtst v4.2d, v14.2d, v6.2d + and v17.16b, v4.16b, v8.16b + cmtst v18.2d, v15.2d, v6.2d + eor v4.16b, v9.16b, v15.16b + ext v9.16b, v17.16b, v17.16b, #8 + eor v9.16b, v5.16b, v9.16b + add v17.2d, v9.2d, v9.2d + and v18.16b, v18.16b, v8.16b + eor v5.16b, v10.16b, v9.16b + str q9, [x2], #16 + ext v10.16b, v18.16b, v18.16b, #8 + cmtst v9.2d, v9.2d, v6.2d + and v9.16b, v9.16b, v8.16b + eor v10.16b, v17.16b, v10.16b + cmtst v17.2d, v10.2d, v6.2d + eor v6.16b, v16.16b, v10.16b + str q10, [x2], #16 + ext v9.16b, v9.16b, v9.16b, #8 + add v10.2d, v10.2d, v10.2d + eor v9.16b, v10.16b, v9.16b + str q9, [x2], #16 + eor v7.16b, v7.16b, v9.16b + add v9.2d, v9.2d, v9.2d + and v8.16b, v17.16b, v8.16b + ext v8.16b, v8.16b, v8.16b, #8 + eor v8.16b, v9.16b, v8.16b + str q8, [x2] // next round tweak + + bl _bsaes_decrypt8 + + eor v6.16b, v6.16b, v13.16b + eor v0.16b, v0.16b, v11.16b + ldr q8, [x0], #16 + eor v7.16b, v7.16b, v8.16b + str q0, [x21], #16 + eor v0.16b, v1.16b, v12.16b + ldr q1, [x0], #16 + eor v1.16b, v3.16b, v1.16b + subs x22, x22, #0x80 + eor v2.16b, v2.16b, v15.16b + eor v3.16b, v4.16b, v14.16b + ldr q4, [x0], #16 + str q0, [x21], #16 + ldr q11, [x0] // next round tweak + eor v0.16b, v5.16b, v4.16b + str q6, [x21], #16 + str q3, [x21], #16 + str q2, [x21], #16 + str q7, [x21], #16 + str q1, [x21], #16 + str q0, [x21], #16 + bpl Lxts_dec_loop + +Lxts_dec_short: + adds x22, x22, #0x70 + bmi Lxts_dec_done + + ldr q8, Lxts_magic + sshr v1.2d, v11.2d, #63 + add v2.2d, v11.2d, v11.2d + ldr q9, Lxts_magic+16 + subs x22, x22, #0x10 + ldr q0, [x20], #16 + and v1.16b, v1.16b, v8.16b + cmtst v3.2d, v11.2d, v9.2d + ext v1.16b, v1.16b, v1.16b, #8 + and v3.16b, v3.16b, v8.16b + eor v12.16b, v2.16b, v1.16b + ext v1.16b, v3.16b, v3.16b, #8 + add v2.2d, v12.2d, v12.2d + cmtst v3.2d, v12.2d, v9.2d + eor v13.16b, v2.16b, v1.16b + and v22.16b, v3.16b, v8.16b + bmi Lxts_dec_1 + + ext v2.16b, v22.16b, v22.16b, #8 + add v3.2d, v13.2d, v13.2d + ldr q1, [x20], #16 + cmtst v4.2d, v13.2d, v9.2d + subs x22, x22, #0x10 + eor v14.16b, v3.16b, v2.16b + and v23.16b, v4.16b, v8.16b + bmi Lxts_dec_2 + + ext v3.16b, v23.16b, v23.16b, #8 + add v4.2d, v14.2d, v14.2d + ldr q2, [x20], #16 + cmtst v5.2d, v14.2d, v9.2d + eor v0.16b, v0.16b, v11.16b + subs x22, x22, #0x10 + eor v15.16b, v4.16b, v3.16b + and v24.16b, v5.16b, v8.16b + bmi Lxts_dec_3 + + ext v4.16b, v24.16b, v24.16b, #8 + add v5.2d, v15.2d, v15.2d + ldr q3, [x20], #16 + cmtst v6.2d, v15.2d, v9.2d + eor v1.16b, v1.16b, v12.16b + subs x22, x22, #0x10 + eor v16.16b, v5.16b, v4.16b + and v25.16b, v6.16b, v8.16b + bmi Lxts_dec_4 + + ext v5.16b, v25.16b, v25.16b, #8 + add v6.2d, v16.2d, v16.2d + add x0, x19, #16 + cmtst v7.2d, v16.2d, v9.2d + ldr q4, [x20], #16 + eor v2.16b, v2.16b, v13.16b + str q16, [x0], #16 + subs x22, x22, #0x10 + eor v17.16b, v6.16b, v5.16b + and v26.16b, v7.16b, v8.16b + bmi Lxts_dec_5 + + ext v7.16b, v26.16b, v26.16b, #8 + add v18.2d, v17.2d, v17.2d + ldr q5, [x20], #16 + eor v3.16b, v3.16b, v14.16b + str q17, [x0], #16 + subs x22, x22, #0x10 + eor v18.16b, v18.16b, v7.16b + bmi Lxts_dec_6 + + ldr q6, [x20], #16 + eor v4.16b, v4.16b, v15.16b + eor v5.16b, v5.16b, v16.16b + str q18, [x0] // next round tweak + mov x9, sp // pass key schedule + mov x10, x1 + add x0, x19, #16 + sub x22, x22, #0x10 + eor v6.16b, v6.16b, v17.16b + + bl _bsaes_decrypt8 + + ldr q16, [x0], #16 + eor v0.16b, v0.16b, v11.16b + eor v1.16b, v1.16b, v12.16b + ldr q17, [x0], #16 + eor v6.16b, v6.16b, v13.16b + eor v4.16b, v4.16b, v14.16b + eor v2.16b, v2.16b, v15.16b + ldr q11, [x0] // next round tweak + str q0, [x21], #16 + str q1, [x21], #16 + eor v0.16b, v7.16b, v16.16b + eor v1.16b, v3.16b, v17.16b + str q6, [x21], #16 + str q4, [x21], #16 + str q2, [x21], #16 + str q0, [x21], #16 + str q1, [x21], #16 + b Lxts_dec_done + +.align 4 +Lxts_dec_6: + eor v4.16b, v4.16b, v15.16b + eor v5.16b, v5.16b, v16.16b + mov x9, sp // pass key schedule + mov x10, x1 // pass rounds + add x0, x19, #16 + + bl _bsaes_decrypt8 + + ldr q16, [x0], #16 + eor v0.16b, v0.16b, v11.16b + eor v1.16b, v1.16b, v12.16b + eor v6.16b, v6.16b, v13.16b + eor v4.16b, v4.16b, v14.16b + ldr q11, [x0] // next round tweak + eor v2.16b, v2.16b, v15.16b + str q0, [x21], #16 + str q1, [x21], #16 + eor v0.16b, v7.16b, v16.16b + str q6, [x21], #16 + str q4, [x21], #16 + str q2, [x21], #16 + str q0, [x21], #16 + b Lxts_dec_done + +.align 4 +Lxts_dec_5: + eor v3.16b, v3.16b, v14.16b + eor v4.16b, v4.16b, v15.16b + mov x9, sp // pass key schedule + mov x10, x1 // pass rounds + add x0, x19, #16 + + bl _bsaes_decrypt8 + + eor v0.16b, v0.16b, v11.16b + eor v1.16b, v1.16b, v12.16b + ldr q11, [x0] // next round tweak + eor v6.16b, v6.16b, v13.16b + eor v4.16b, v4.16b, v14.16b + eor v2.16b, v2.16b, v15.16b + str q0, [x21], #16 + str q1, [x21], #16 + str q6, [x21], #16 + str q4, [x21], #16 + str q2, [x21], #16 + b Lxts_dec_done + +.align 4 +Lxts_dec_4: + eor v2.16b, v2.16b, v13.16b + eor v3.16b, v3.16b, v14.16b + mov x9, sp // pass key schedule + mov x10, x1 // pass rounds + add x0, x19, #16 + + bl _bsaes_decrypt8 + + eor v0.16b, v0.16b, v11.16b + eor v1.16b, v1.16b, v12.16b + eor v6.16b, v6.16b, v13.16b + eor v4.16b, v4.16b, v14.16b + mov v11.16b, v15.16b // next round tweak + str q0, [x21], #16 + str q1, [x21], #16 + str q6, [x21], #16 + str q4, [x21], #16 + b Lxts_dec_done + +.align 4 +Lxts_dec_3: + eor v1.16b, v1.16b, v12.16b + eor v2.16b, v2.16b, v13.16b + mov x9, sp // pass key schedule + mov x10, x1 // pass rounds + add x0, x19, #16 + + bl _bsaes_decrypt8 + + eor v0.16b, v0.16b, v11.16b + eor v1.16b, v1.16b, v12.16b + eor v6.16b, v6.16b, v13.16b + mov v11.16b, v14.16b // next round tweak + str q0, [x21], #16 + str q1, [x21], #16 + str q6, [x21], #16 + b Lxts_dec_done + +.align 4 +Lxts_dec_2: + eor v0.16b, v0.16b, v11.16b + eor v1.16b, v1.16b, v12.16b + mov x9, sp // pass key schedule + mov x10, x1 // pass rounds + add x0, x19, #16 + + bl _bsaes_decrypt8 + + eor v0.16b, v0.16b, v11.16b + eor v1.16b, v1.16b, v12.16b + mov v11.16b, v13.16b // next round tweak + str q0, [x21], #16 + str q1, [x21], #16 + b Lxts_dec_done + +.align 4 +Lxts_dec_1: + eor v0.16b, v0.16b, v11.16b + sub x0, sp, #16 + sub x1, sp, #16 + mov x2, x23 + mov v13.d[0], v11.d[1] // just in case AES_decrypt corrupts top half of callee-saved SIMD registers + mov v14.d[0], v12.d[1] + str q0, [sp, #-16]! + + bl AES_decrypt + + ldr q0, [sp], #16 + trn1 v13.2d, v11.2d, v13.2d + trn1 v11.2d, v12.2d, v14.2d // next round tweak + eor v0.16b, v0.16b, v13.16b + str q0, [x21], #16 + +Lxts_dec_done: + adds x22, x22, #0x10 + beq Lxts_dec_ret + + // calculate one round of extra tweak for the stolen ciphertext + ldr q8, Lxts_magic + sshr v6.2d, v11.2d, #63 + and v6.16b, v6.16b, v8.16b + add v12.2d, v11.2d, v11.2d + ext v6.16b, v6.16b, v6.16b, #8 + eor v12.16b, v12.16b, v6.16b + + // perform the final decryption with the last tweak value + ldr q0, [x20], #16 + eor v0.16b, v0.16b, v12.16b + str q0, [sp, #-16]! + mov x0, sp + mov x1, sp + mov x2, x23 + mov v13.d[0], v11.d[1] // just in case AES_decrypt corrupts top half of callee-saved SIMD registers + mov v14.d[0], v12.d[1] + + bl AES_decrypt + + trn1 v12.2d, v12.2d, v14.2d + trn1 v11.2d, v11.2d, v13.2d + ldr q0, [sp], #16 + eor v0.16b, v0.16b, v12.16b + str q0, [x21] + + mov x6, x21 + // Penultimate ciphertext block produces final plaintext part-block + // plus remaining part of final ciphertext block. Move plaintext part + // to final position and reuse penultimate plaintext block buffer to + // construct final ciphertext block +Lxts_dec_steal: + ldrb w1, [x21] + ldrb w0, [x20], #1 + strb w1, [x21, #0x10] + strb w0, [x21], #1 + + subs x22, x22, #1 + bhi Lxts_dec_steal + + // Finally decrypt the penultimate plaintext block using the + // penultimate tweak + ldr q0, [x6] + eor v0.16b, v0.16b, v11.16b + str q0, [sp, #-16]! + mov x0, sp + mov x1, sp + mov x2, x23 + mov x21, x6 + + bl AES_decrypt + + trn1 v11.2d, v11.2d, v13.2d + ldr q0, [sp], #16 + eor v0.16b, v0.16b, v11.16b + str q0, [x21] + +Lxts_dec_ret: + + movi v0.16b, #0 + movi v1.16b, #0 +Lxts_dec_bzero: // wipe key schedule + stp q0, q1, [sp], #32 + cmp sp, x19 + bne Lxts_dec_bzero + + ldp x19, x20, [sp, #80] + ldp x21, x22, [sp, #96] + ldr x23, [sp, #112] + ldp d8, d9, [sp, #128] + ldp d10, d11, [sp, #144] + ldp d12, d13, [sp, #160] + ldp d14, d15, [sp, #176] + ldp x29, x30, [sp], #192 + ret + diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/aes/vpaes-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/aes/vpaes-armv8.S new file mode 100644 index 000000000000..8f5d5a363ad2 --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/aes/vpaes-armv8.S @@ -0,0 +1,1258 @@ +#include "arm_arch.h" + +.section .rodata + + +.align 7 // totally strategic alignment +_vpaes_consts: +Lk_mc_forward: // mc_forward +.quad 0x0407060500030201, 0x0C0F0E0D080B0A09 +.quad 0x080B0A0904070605, 0x000302010C0F0E0D +.quad 0x0C0F0E0D080B0A09, 0x0407060500030201 +.quad 0x000302010C0F0E0D, 0x080B0A0904070605 +Lk_mc_backward: // mc_backward +.quad 0x0605040702010003, 0x0E0D0C0F0A09080B +.quad 0x020100030E0D0C0F, 0x0A09080B06050407 +.quad 0x0E0D0C0F0A09080B, 0x0605040702010003 +.quad 0x0A09080B06050407, 0x020100030E0D0C0F +Lk_sr: // sr +.quad 0x0706050403020100, 0x0F0E0D0C0B0A0908 +.quad 0x030E09040F0A0500, 0x0B06010C07020D08 +.quad 0x0F060D040B020900, 0x070E050C030A0108 +.quad 0x0B0E0104070A0D00, 0x0306090C0F020508 + +// +// "Hot" constants +// +Lk_inv: // inv, inva +.quad 0x0E05060F0D080180, 0x040703090A0B0C02 +.quad 0x01040A060F0B0780, 0x030D0E0C02050809 +Lk_ipt: // input transform (lo, hi) +.quad 0xC2B2E8985A2A7000, 0xCABAE09052227808 +.quad 0x4C01307D317C4D00, 0xCD80B1FCB0FDCC81 +Lk_sbo: // sbou, sbot +.quad 0xD0D26D176FBDC700, 0x15AABF7AC502A878 +.quad 0xCFE474A55FBB6A00, 0x8E1E90D1412B35FA +Lk_sb1: // sb1u, sb1t +.quad 0x3618D415FAE22300, 0x3BF7CCC10D2ED9EF +.quad 0xB19BE18FCB503E00, 0xA5DF7A6E142AF544 +Lk_sb2: // sb2u, sb2t +.quad 0x69EB88400AE12900, 0xC2A163C8AB82234A +.quad 0xE27A93C60B712400, 0x5EB7E955BC982FCD + +// +// Decryption stuff +// +Lk_dipt: // decryption input transform +.quad 0x0F505B040B545F00, 0x154A411E114E451A +.quad 0x86E383E660056500, 0x12771772F491F194 +Lk_dsbo: // decryption sbox final output +.quad 0x1387EA537EF94000, 0xC7AA6DB9D4943E2D +.quad 0x12D7560F93441D00, 0xCA4B8159D8C58E9C +Lk_dsb9: // decryption sbox output *9*u, *9*t +.quad 0x851C03539A86D600, 0xCAD51F504F994CC9 +.quad 0xC03B1789ECD74900, 0x725E2C9EB2FBA565 +Lk_dsbd: // decryption sbox output *D*u, *D*t +.quad 0x7D57CCDFE6B1A200, 0xF56E9B13882A4439 +.quad 0x3CE2FAF724C6CB00, 0x2931180D15DEEFD3 +Lk_dsbb: // decryption sbox output *B*u, *B*t +.quad 0xD022649296B44200, 0x602646F6B0F2D404 +.quad 0xC19498A6CD596700, 0xF3FF0C3E3255AA6B +Lk_dsbe: // decryption sbox output *E*u, *E*t +.quad 0x46F2929626D4D000, 0x2242600464B4F6B0 +.quad 0x0C55A6CDFFAAC100, 0x9467F36B98593E32 + +// +// Key schedule constants +// +Lk_dksd: // decryption key schedule: invskew x*D +.quad 0xFEB91A5DA3E44700, 0x0740E3A45A1DBEF9 +.quad 0x41C277F4B5368300, 0x5FDC69EAAB289D1E +Lk_dksb: // decryption key schedule: invskew x*B +.quad 0x9A4FCA1F8550D500, 0x03D653861CC94C99 +.quad 0x115BEDA7B6FC4A00, 0xD993256F7E3482C8 +Lk_dkse: // decryption key schedule: invskew x*E + 0x63 +.quad 0xD5031CCA1FC9D600, 0x53859A4C994F5086 +.quad 0xA23196054FDC7BE8, 0xCD5EF96A20B31487 +Lk_dks9: // decryption key schedule: invskew x*9 +.quad 0xB6116FC87ED9A700, 0x4AED933482255BFC +.quad 0x4576516227143300, 0x8BB89FACE9DAFDCE + +Lk_rcon: // rcon +.quad 0x1F8391B9AF9DEEB6, 0x702A98084D7C7D81 + +Lk_opt: // output transform +.quad 0xFF9F4929D6B66000, 0xF7974121DEBE6808 +.quad 0x01EDBD5150BCEC00, 0xE10D5DB1B05C0CE0 +Lk_deskew: // deskew tables: inverts the sbox's "skew" +.quad 0x07E4A34047A4E300, 0x1DFEB95A5DBEF91A +.quad 0x5F36B5DC83EA6900, 0x2841C2ABF49D1E77 + +.byte 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105,111,110,32,65,69,83,32,102,111,114,32,65,82,77,118,56,44,32,77,105,107,101,32,72,97,109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105,118,101,114,115,105,116,121,41,0 +.align 2 + +.align 6 + +.text + +// +// _aes_preheat +// +// Fills register %r10 -> .aes_consts (so you can -fPIC) +// and %xmm9-%xmm15 as specified below. +// +.def _vpaes_encrypt_preheat + .type 32 +.endef +.align 4 +_vpaes_encrypt_preheat: + adrp x10, Lk_inv + add x10, x10, :lo12:Lk_inv + movi v17.16b, #0x0f + ld1 {v18.2d,v19.2d}, [x10],#32 // Lk_inv + ld1 {v20.2d,v21.2d,v22.2d,v23.2d}, [x10],#64 // Lk_ipt, Lk_sbo + ld1 {v24.2d,v25.2d,v26.2d,v27.2d}, [x10] // Lk_sb1, Lk_sb2 + ret + + +// +// _aes_encrypt_core +// +// AES-encrypt %xmm0. +// +// Inputs: +// %xmm0 = input +// %xmm9-%xmm15 as in _vpaes_preheat +// (%rdx) = scheduled keys +// +// Output in %xmm0 +// Clobbers %xmm1-%xmm5, %r9, %r10, %r11, %rax +// Preserves %xmm6 - %xmm8 so you get some local vectors +// +// +.def _vpaes_encrypt_core + .type 32 +.endef +.align 4 +_vpaes_encrypt_core: + mov x9, x2 + ldr w8, [x2,#240] // pull rounds + adrp x11, Lk_mc_forward+16 + add x11, x11, :lo12:Lk_mc_forward+16 + // vmovdqa .Lk_ipt(%rip), %xmm2 # iptlo + ld1 {v16.2d}, [x9], #16 // vmovdqu (%r9), %xmm5 # round0 key + and v1.16b, v7.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 + ushr v0.16b, v7.16b, #4 // vpsrlb $4, %xmm0, %xmm0 + tbl v1.16b, {v20.16b}, v1.16b // vpshufb %xmm1, %xmm2, %xmm1 + // vmovdqa .Lk_ipt+16(%rip), %xmm3 # ipthi + tbl v2.16b, {v21.16b}, v0.16b // vpshufb %xmm0, %xmm3, %xmm2 + eor v0.16b, v1.16b, v16.16b // vpxor %xmm5, %xmm1, %xmm0 + eor v0.16b, v0.16b, v2.16b // vpxor %xmm2, %xmm0, %xmm0 + b Lenc_entry + +.align 4 +Lenc_loop: + // middle of middle round + add x10, x11, #0x40 + tbl v4.16b, {v25.16b}, v2.16b // vpshufb %xmm2, %xmm13, %xmm4 # 4 = sb1u + ld1 {v1.2d}, [x11], #16 // vmovdqa -0x40(%r11,%r10), %xmm1 # Lk_mc_forward[] + tbl v0.16b, {v24.16b}, v3.16b // vpshufb %xmm3, %xmm12, %xmm0 # 0 = sb1t + eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k + tbl v5.16b, {v27.16b}, v2.16b // vpshufb %xmm2, %xmm15, %xmm5 # 4 = sb2u + eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A + tbl v2.16b, {v26.16b}, v3.16b // vpshufb %xmm3, %xmm14, %xmm2 # 2 = sb2t + ld1 {v4.2d}, [x10] // vmovdqa (%r11,%r10), %xmm4 # Lk_mc_backward[] + tbl v3.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm3 # 0 = B + eor v2.16b, v2.16b, v5.16b // vpxor %xmm5, %xmm2, %xmm2 # 2 = 2A + tbl v0.16b, {v0.16b}, v4.16b // vpshufb %xmm4, %xmm0, %xmm0 # 3 = D + eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 # 0 = 2A+B + tbl v4.16b, {v3.16b}, v1.16b // vpshufb %xmm1, %xmm3, %xmm4 # 0 = 2B+C + eor v0.16b, v0.16b, v3.16b // vpxor %xmm3, %xmm0, %xmm0 # 3 = 2A+B+D + and x11, x11, #~(1<<6) // and $0x30, %r11 # ... mod 4 + eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = 2A+3B+C+D + sub w8, w8, #1 // nr-- + +Lenc_entry: + // top of round + and v1.16b, v0.16b, v17.16b // vpand %xmm0, %xmm9, %xmm1 # 0 = k + ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 # 1 = i + tbl v5.16b, {v19.16b}, v1.16b // vpshufb %xmm1, %xmm11, %xmm5 # 2 = a/k + eor v1.16b, v1.16b, v0.16b // vpxor %xmm0, %xmm1, %xmm1 # 0 = j + tbl v3.16b, {v18.16b}, v0.16b // vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i + tbl v4.16b, {v18.16b}, v1.16b // vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j + eor v3.16b, v3.16b, v5.16b // vpxor %xmm5, %xmm3, %xmm3 # 3 = iak = 1/i + a/k + eor v4.16b, v4.16b, v5.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = jak = 1/j + a/k + tbl v2.16b, {v18.16b}, v3.16b // vpshufb %xmm3, %xmm10, %xmm2 # 2 = 1/iak + tbl v3.16b, {v18.16b}, v4.16b // vpshufb %xmm4, %xmm10, %xmm3 # 3 = 1/jak + eor v2.16b, v2.16b, v1.16b // vpxor %xmm1, %xmm2, %xmm2 # 2 = io + eor v3.16b, v3.16b, v0.16b // vpxor %xmm0, %xmm3, %xmm3 # 3 = jo + ld1 {v16.2d}, [x9],#16 // vmovdqu (%r9), %xmm5 + cbnz w8, Lenc_loop + + // middle of last round + add x10, x11, #0x80 + // vmovdqa -0x60(%r10), %xmm4 # 3 : sbou .Lk_sbo + // vmovdqa -0x50(%r10), %xmm0 # 0 : sbot .Lk_sbo+16 + tbl v4.16b, {v22.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbou + ld1 {v1.2d}, [x10] // vmovdqa 0x40(%r11,%r10), %xmm1 # Lk_sr[] + tbl v0.16b, {v23.16b}, v3.16b // vpshufb %xmm3, %xmm0, %xmm0 # 0 = sb1t + eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k + eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A + tbl v0.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm0 + ret + + +.globl vpaes_encrypt +.def vpaes_encrypt + .type 32 +.endef +.align 4 +vpaes_encrypt: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + + ld1 {v7.16b}, [x0] + bl _vpaes_encrypt_preheat + bl _vpaes_encrypt_core + st1 {v0.16b}, [x1] + + ldp x29,x30,[sp],#16 + AARCH64_VALIDATE_LINK_REGISTER + ret + + +.def _vpaes_encrypt_2x + .type 32 +.endef +.align 4 +_vpaes_encrypt_2x: + mov x9, x2 + ldr w8, [x2,#240] // pull rounds + adrp x11, Lk_mc_forward+16 + add x11, x11, :lo12:Lk_mc_forward+16 + // vmovdqa .Lk_ipt(%rip), %xmm2 # iptlo + ld1 {v16.2d}, [x9], #16 // vmovdqu (%r9), %xmm5 # round0 key + and v1.16b, v14.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 + ushr v0.16b, v14.16b, #4 // vpsrlb $4, %xmm0, %xmm0 + and v9.16b, v15.16b, v17.16b + ushr v8.16b, v15.16b, #4 + tbl v1.16b, {v20.16b}, v1.16b // vpshufb %xmm1, %xmm2, %xmm1 + tbl v9.16b, {v20.16b}, v9.16b + // vmovdqa .Lk_ipt+16(%rip), %xmm3 # ipthi + tbl v2.16b, {v21.16b}, v0.16b // vpshufb %xmm0, %xmm3, %xmm2 + tbl v10.16b, {v21.16b}, v8.16b + eor v0.16b, v1.16b, v16.16b // vpxor %xmm5, %xmm1, %xmm0 + eor v8.16b, v9.16b, v16.16b + eor v0.16b, v0.16b, v2.16b // vpxor %xmm2, %xmm0, %xmm0 + eor v8.16b, v8.16b, v10.16b + b Lenc_2x_entry + +.align 4 +Lenc_2x_loop: + // middle of middle round + add x10, x11, #0x40 + tbl v4.16b, {v25.16b}, v2.16b // vpshufb %xmm2, %xmm13, %xmm4 # 4 = sb1u + tbl v12.16b, {v25.16b}, v10.16b + ld1 {v1.2d}, [x11], #16 // vmovdqa -0x40(%r11,%r10), %xmm1 # Lk_mc_forward[] + tbl v0.16b, {v24.16b}, v3.16b // vpshufb %xmm3, %xmm12, %xmm0 # 0 = sb1t + tbl v8.16b, {v24.16b}, v11.16b + eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k + eor v12.16b, v12.16b, v16.16b + tbl v5.16b, {v27.16b}, v2.16b // vpshufb %xmm2, %xmm15, %xmm5 # 4 = sb2u + tbl v13.16b, {v27.16b}, v10.16b + eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A + eor v8.16b, v8.16b, v12.16b + tbl v2.16b, {v26.16b}, v3.16b // vpshufb %xmm3, %xmm14, %xmm2 # 2 = sb2t + tbl v10.16b, {v26.16b}, v11.16b + ld1 {v4.2d}, [x10] // vmovdqa (%r11,%r10), %xmm4 # Lk_mc_backward[] + tbl v3.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm3 # 0 = B + tbl v11.16b, {v8.16b}, v1.16b + eor v2.16b, v2.16b, v5.16b // vpxor %xmm5, %xmm2, %xmm2 # 2 = 2A + eor v10.16b, v10.16b, v13.16b + tbl v0.16b, {v0.16b}, v4.16b // vpshufb %xmm4, %xmm0, %xmm0 # 3 = D + tbl v8.16b, {v8.16b}, v4.16b + eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 # 0 = 2A+B + eor v11.16b, v11.16b, v10.16b + tbl v4.16b, {v3.16b}, v1.16b // vpshufb %xmm1, %xmm3, %xmm4 # 0 = 2B+C + tbl v12.16b, {v11.16b},v1.16b + eor v0.16b, v0.16b, v3.16b // vpxor %xmm3, %xmm0, %xmm0 # 3 = 2A+B+D + eor v8.16b, v8.16b, v11.16b + and x11, x11, #~(1<<6) // and $0x30, %r11 # ... mod 4 + eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = 2A+3B+C+D + eor v8.16b, v8.16b, v12.16b + sub w8, w8, #1 // nr-- + +Lenc_2x_entry: + // top of round + and v1.16b, v0.16b, v17.16b // vpand %xmm0, %xmm9, %xmm1 # 0 = k + ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 # 1 = i + and v9.16b, v8.16b, v17.16b + ushr v8.16b, v8.16b, #4 + tbl v5.16b, {v19.16b},v1.16b // vpshufb %xmm1, %xmm11, %xmm5 # 2 = a/k + tbl v13.16b, {v19.16b},v9.16b + eor v1.16b, v1.16b, v0.16b // vpxor %xmm0, %xmm1, %xmm1 # 0 = j + eor v9.16b, v9.16b, v8.16b + tbl v3.16b, {v18.16b},v0.16b // vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i + tbl v11.16b, {v18.16b},v8.16b + tbl v4.16b, {v18.16b},v1.16b // vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j + tbl v12.16b, {v18.16b},v9.16b + eor v3.16b, v3.16b, v5.16b // vpxor %xmm5, %xmm3, %xmm3 # 3 = iak = 1/i + a/k + eor v11.16b, v11.16b, v13.16b + eor v4.16b, v4.16b, v5.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = jak = 1/j + a/k + eor v12.16b, v12.16b, v13.16b + tbl v2.16b, {v18.16b},v3.16b // vpshufb %xmm3, %xmm10, %xmm2 # 2 = 1/iak + tbl v10.16b, {v18.16b},v11.16b + tbl v3.16b, {v18.16b},v4.16b // vpshufb %xmm4, %xmm10, %xmm3 # 3 = 1/jak + tbl v11.16b, {v18.16b},v12.16b + eor v2.16b, v2.16b, v1.16b // vpxor %xmm1, %xmm2, %xmm2 # 2 = io + eor v10.16b, v10.16b, v9.16b + eor v3.16b, v3.16b, v0.16b // vpxor %xmm0, %xmm3, %xmm3 # 3 = jo + eor v11.16b, v11.16b, v8.16b + ld1 {v16.2d}, [x9],#16 // vmovdqu (%r9), %xmm5 + cbnz w8, Lenc_2x_loop + + // middle of last round + add x10, x11, #0x80 + // vmovdqa -0x60(%r10), %xmm4 # 3 : sbou .Lk_sbo + // vmovdqa -0x50(%r10), %xmm0 # 0 : sbot .Lk_sbo+16 + tbl v4.16b, {v22.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbou + tbl v12.16b, {v22.16b}, v10.16b + ld1 {v1.2d}, [x10] // vmovdqa 0x40(%r11,%r10), %xmm1 # Lk_sr[] + tbl v0.16b, {v23.16b}, v3.16b // vpshufb %xmm3, %xmm0, %xmm0 # 0 = sb1t + tbl v8.16b, {v23.16b}, v11.16b + eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k + eor v12.16b, v12.16b, v16.16b + eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A + eor v8.16b, v8.16b, v12.16b + tbl v0.16b, {v0.16b},v1.16b // vpshufb %xmm1, %xmm0, %xmm0 + tbl v1.16b, {v8.16b},v1.16b + ret + + +.def _vpaes_decrypt_preheat + .type 32 +.endef +.align 4 +_vpaes_decrypt_preheat: + adrp x10, Lk_inv + add x10, x10, :lo12:Lk_inv + movi v17.16b, #0x0f + adrp x11, Lk_dipt + add x11, x11, :lo12:Lk_dipt + ld1 {v18.2d,v19.2d}, [x10],#32 // Lk_inv + ld1 {v20.2d,v21.2d,v22.2d,v23.2d}, [x11],#64 // Lk_dipt, Lk_dsbo + ld1 {v24.2d,v25.2d,v26.2d,v27.2d}, [x11],#64 // Lk_dsb9, Lk_dsbd + ld1 {v28.2d,v29.2d,v30.2d,v31.2d}, [x11] // Lk_dsbb, Lk_dsbe + ret + + +// +// Decryption core +// +// Same API as encryption core. +// +.def _vpaes_decrypt_core + .type 32 +.endef +.align 4 +_vpaes_decrypt_core: + mov x9, x2 + ldr w8, [x2,#240] // pull rounds + + // vmovdqa .Lk_dipt(%rip), %xmm2 # iptlo + lsl x11, x8, #4 // mov %rax, %r11; shl $4, %r11 + eor x11, x11, #0x30 // xor $0x30, %r11 + adrp x10, Lk_sr + add x10, x10, :lo12:Lk_sr + and x11, x11, #0x30 // and $0x30, %r11 + add x11, x11, x10 + adrp x10, Lk_mc_forward+48 + add x10, x10, :lo12:Lk_mc_forward+48 + + ld1 {v16.2d}, [x9],#16 // vmovdqu (%r9), %xmm4 # round0 key + and v1.16b, v7.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 + ushr v0.16b, v7.16b, #4 // vpsrlb $4, %xmm0, %xmm0 + tbl v2.16b, {v20.16b}, v1.16b // vpshufb %xmm1, %xmm2, %xmm2 + ld1 {v5.2d}, [x10] // vmovdqa Lk_mc_forward+48(%rip), %xmm5 + // vmovdqa .Lk_dipt+16(%rip), %xmm1 # ipthi + tbl v0.16b, {v21.16b}, v0.16b // vpshufb %xmm0, %xmm1, %xmm0 + eor v2.16b, v2.16b, v16.16b // vpxor %xmm4, %xmm2, %xmm2 + eor v0.16b, v0.16b, v2.16b // vpxor %xmm2, %xmm0, %xmm0 + b Ldec_entry + +.align 4 +Ldec_loop: +// +// Inverse mix columns +// + // vmovdqa -0x20(%r10),%xmm4 # 4 : sb9u + // vmovdqa -0x10(%r10),%xmm1 # 0 : sb9t + tbl v4.16b, {v24.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sb9u + tbl v1.16b, {v25.16b}, v3.16b // vpshufb %xmm3, %xmm1, %xmm1 # 0 = sb9t + eor v0.16b, v4.16b, v16.16b // vpxor %xmm4, %xmm0, %xmm0 + // vmovdqa 0x00(%r10),%xmm4 # 4 : sbdu + eor v0.16b, v0.16b, v1.16b // vpxor %xmm1, %xmm0, %xmm0 # 0 = ch + // vmovdqa 0x10(%r10),%xmm1 # 0 : sbdt + + tbl v4.16b, {v26.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbdu + tbl v0.16b, {v0.16b}, v5.16b // vpshufb %xmm5, %xmm0, %xmm0 # MC ch + tbl v1.16b, {v27.16b}, v3.16b // vpshufb %xmm3, %xmm1, %xmm1 # 0 = sbdt + eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 4 = ch + // vmovdqa 0x20(%r10), %xmm4 # 4 : sbbu + eor v0.16b, v0.16b, v1.16b // vpxor %xmm1, %xmm0, %xmm0 # 0 = ch + // vmovdqa 0x30(%r10), %xmm1 # 0 : sbbt + + tbl v4.16b, {v28.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbbu + tbl v0.16b, {v0.16b}, v5.16b // vpshufb %xmm5, %xmm0, %xmm0 # MC ch + tbl v1.16b, {v29.16b}, v3.16b // vpshufb %xmm3, %xmm1, %xmm1 # 0 = sbbt + eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 4 = ch + // vmovdqa 0x40(%r10), %xmm4 # 4 : sbeu + eor v0.16b, v0.16b, v1.16b // vpxor %xmm1, %xmm0, %xmm0 # 0 = ch + // vmovdqa 0x50(%r10), %xmm1 # 0 : sbet + + tbl v4.16b, {v30.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbeu + tbl v0.16b, {v0.16b}, v5.16b // vpshufb %xmm5, %xmm0, %xmm0 # MC ch + tbl v1.16b, {v31.16b}, v3.16b // vpshufb %xmm3, %xmm1, %xmm1 # 0 = sbet + eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 4 = ch + ext v5.16b, v5.16b, v5.16b, #12 // vpalignr $12, %xmm5, %xmm5, %xmm5 + eor v0.16b, v0.16b, v1.16b // vpxor %xmm1, %xmm0, %xmm0 # 0 = ch + sub w8, w8, #1 // sub $1,%rax # nr-- + +Ldec_entry: + // top of round + and v1.16b, v0.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 # 0 = k + ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 # 1 = i + tbl v2.16b, {v19.16b}, v1.16b // vpshufb %xmm1, %xmm11, %xmm2 # 2 = a/k + eor v1.16b, v1.16b, v0.16b // vpxor %xmm0, %xmm1, %xmm1 # 0 = j + tbl v3.16b, {v18.16b}, v0.16b // vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i + tbl v4.16b, {v18.16b}, v1.16b // vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j + eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 # 3 = iak = 1/i + a/k + eor v4.16b, v4.16b, v2.16b // vpxor %xmm2, %xmm4, %xmm4 # 4 = jak = 1/j + a/k + tbl v2.16b, {v18.16b}, v3.16b // vpshufb %xmm3, %xmm10, %xmm2 # 2 = 1/iak + tbl v3.16b, {v18.16b}, v4.16b // vpshufb %xmm4, %xmm10, %xmm3 # 3 = 1/jak + eor v2.16b, v2.16b, v1.16b // vpxor %xmm1, %xmm2, %xmm2 # 2 = io + eor v3.16b, v3.16b, v0.16b // vpxor %xmm0, %xmm3, %xmm3 # 3 = jo + ld1 {v16.2d}, [x9],#16 // vmovdqu (%r9), %xmm0 + cbnz w8, Ldec_loop + + // middle of last round + // vmovdqa 0x60(%r10), %xmm4 # 3 : sbou + tbl v4.16b, {v22.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbou + // vmovdqa 0x70(%r10), %xmm1 # 0 : sbot + ld1 {v2.2d}, [x11] // vmovdqa -0x160(%r11), %xmm2 # Lk_sr-Lk_dsbd=-0x160 + tbl v1.16b, {v23.16b}, v3.16b // vpshufb %xmm3, %xmm1, %xmm1 # 0 = sb1t + eor v4.16b, v4.16b, v16.16b // vpxor %xmm0, %xmm4, %xmm4 # 4 = sb1u + k + eor v0.16b, v1.16b, v4.16b // vpxor %xmm4, %xmm1, %xmm0 # 0 = A + tbl v0.16b, {v0.16b}, v2.16b // vpshufb %xmm2, %xmm0, %xmm0 + ret + + +.globl vpaes_decrypt +.def vpaes_decrypt + .type 32 +.endef +.align 4 +vpaes_decrypt: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + + ld1 {v7.16b}, [x0] + bl _vpaes_decrypt_preheat + bl _vpaes_decrypt_core + st1 {v0.16b}, [x1] + + ldp x29,x30,[sp],#16 + AARCH64_VALIDATE_LINK_REGISTER + ret + + +// v14-v15 input, v0-v1 output +.def _vpaes_decrypt_2x + .type 32 +.endef +.align 4 +_vpaes_decrypt_2x: + mov x9, x2 + ldr w8, [x2,#240] // pull rounds + + // vmovdqa .Lk_dipt(%rip), %xmm2 # iptlo + lsl x11, x8, #4 // mov %rax, %r11; shl $4, %r11 + eor x11, x11, #0x30 // xor $0x30, %r11 + adrp x10, Lk_sr + add x10, x10, :lo12:Lk_sr + and x11, x11, #0x30 // and $0x30, %r11 + add x11, x11, x10 + adrp x10, Lk_mc_forward+48 + add x10, x10, :lo12:Lk_mc_forward+48 + + ld1 {v16.2d}, [x9],#16 // vmovdqu (%r9), %xmm4 # round0 key + and v1.16b, v14.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 + ushr v0.16b, v14.16b, #4 // vpsrlb $4, %xmm0, %xmm0 + and v9.16b, v15.16b, v17.16b + ushr v8.16b, v15.16b, #4 + tbl v2.16b, {v20.16b},v1.16b // vpshufb %xmm1, %xmm2, %xmm2 + tbl v10.16b, {v20.16b},v9.16b + ld1 {v5.2d}, [x10] // vmovdqa Lk_mc_forward+48(%rip), %xmm5 + // vmovdqa .Lk_dipt+16(%rip), %xmm1 # ipthi + tbl v0.16b, {v21.16b},v0.16b // vpshufb %xmm0, %xmm1, %xmm0 + tbl v8.16b, {v21.16b},v8.16b + eor v2.16b, v2.16b, v16.16b // vpxor %xmm4, %xmm2, %xmm2 + eor v10.16b, v10.16b, v16.16b + eor v0.16b, v0.16b, v2.16b // vpxor %xmm2, %xmm0, %xmm0 + eor v8.16b, v8.16b, v10.16b + b Ldec_2x_entry + +.align 4 +Ldec_2x_loop: +// +// Inverse mix columns +// + // vmovdqa -0x20(%r10),%xmm4 # 4 : sb9u + // vmovdqa -0x10(%r10),%xmm1 # 0 : sb9t + tbl v4.16b, {v24.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sb9u + tbl v12.16b, {v24.16b}, v10.16b + tbl v1.16b, {v25.16b}, v3.16b // vpshufb %xmm3, %xmm1, %xmm1 # 0 = sb9t + tbl v9.16b, {v25.16b}, v11.16b + eor v0.16b, v4.16b, v16.16b // vpxor %xmm4, %xmm0, %xmm0 + eor v8.16b, v12.16b, v16.16b + // vmovdqa 0x00(%r10),%xmm4 # 4 : sbdu + eor v0.16b, v0.16b, v1.16b // vpxor %xmm1, %xmm0, %xmm0 # 0 = ch + eor v8.16b, v8.16b, v9.16b // vpxor %xmm1, %xmm0, %xmm0 # 0 = ch + // vmovdqa 0x10(%r10),%xmm1 # 0 : sbdt + + tbl v4.16b, {v26.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbdu + tbl v12.16b, {v26.16b}, v10.16b + tbl v0.16b, {v0.16b},v5.16b // vpshufb %xmm5, %xmm0, %xmm0 # MC ch + tbl v8.16b, {v8.16b},v5.16b + tbl v1.16b, {v27.16b}, v3.16b // vpshufb %xmm3, %xmm1, %xmm1 # 0 = sbdt + tbl v9.16b, {v27.16b}, v11.16b + eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 4 = ch + eor v8.16b, v8.16b, v12.16b + // vmovdqa 0x20(%r10), %xmm4 # 4 : sbbu + eor v0.16b, v0.16b, v1.16b // vpxor %xmm1, %xmm0, %xmm0 # 0 = ch + eor v8.16b, v8.16b, v9.16b + // vmovdqa 0x30(%r10), %xmm1 # 0 : sbbt + + tbl v4.16b, {v28.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbbu + tbl v12.16b, {v28.16b}, v10.16b + tbl v0.16b, {v0.16b},v5.16b // vpshufb %xmm5, %xmm0, %xmm0 # MC ch + tbl v8.16b, {v8.16b},v5.16b + tbl v1.16b, {v29.16b}, v3.16b // vpshufb %xmm3, %xmm1, %xmm1 # 0 = sbbt + tbl v9.16b, {v29.16b}, v11.16b + eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 4 = ch + eor v8.16b, v8.16b, v12.16b + // vmovdqa 0x40(%r10), %xmm4 # 4 : sbeu + eor v0.16b, v0.16b, v1.16b // vpxor %xmm1, %xmm0, %xmm0 # 0 = ch + eor v8.16b, v8.16b, v9.16b + // vmovdqa 0x50(%r10), %xmm1 # 0 : sbet + + tbl v4.16b, {v30.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbeu + tbl v12.16b, {v30.16b}, v10.16b + tbl v0.16b, {v0.16b},v5.16b // vpshufb %xmm5, %xmm0, %xmm0 # MC ch + tbl v8.16b, {v8.16b},v5.16b + tbl v1.16b, {v31.16b}, v3.16b // vpshufb %xmm3, %xmm1, %xmm1 # 0 = sbet + tbl v9.16b, {v31.16b}, v11.16b + eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 4 = ch + eor v8.16b, v8.16b, v12.16b + ext v5.16b, v5.16b, v5.16b, #12 // vpalignr $12, %xmm5, %xmm5, %xmm5 + eor v0.16b, v0.16b, v1.16b // vpxor %xmm1, %xmm0, %xmm0 # 0 = ch + eor v8.16b, v8.16b, v9.16b + sub w8, w8, #1 // sub $1,%rax # nr-- + +Ldec_2x_entry: + // top of round + and v1.16b, v0.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 # 0 = k + ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 # 1 = i + and v9.16b, v8.16b, v17.16b + ushr v8.16b, v8.16b, #4 + tbl v2.16b, {v19.16b},v1.16b // vpshufb %xmm1, %xmm11, %xmm2 # 2 = a/k + tbl v10.16b, {v19.16b},v9.16b + eor v1.16b, v1.16b, v0.16b // vpxor %xmm0, %xmm1, %xmm1 # 0 = j + eor v9.16b, v9.16b, v8.16b + tbl v3.16b, {v18.16b},v0.16b // vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i + tbl v11.16b, {v18.16b},v8.16b + tbl v4.16b, {v18.16b},v1.16b // vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j + tbl v12.16b, {v18.16b},v9.16b + eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 # 3 = iak = 1/i + a/k + eor v11.16b, v11.16b, v10.16b + eor v4.16b, v4.16b, v2.16b // vpxor %xmm2, %xmm4, %xmm4 # 4 = jak = 1/j + a/k + eor v12.16b, v12.16b, v10.16b + tbl v2.16b, {v18.16b},v3.16b // vpshufb %xmm3, %xmm10, %xmm2 # 2 = 1/iak + tbl v10.16b, {v18.16b},v11.16b + tbl v3.16b, {v18.16b},v4.16b // vpshufb %xmm4, %xmm10, %xmm3 # 3 = 1/jak + tbl v11.16b, {v18.16b},v12.16b + eor v2.16b, v2.16b, v1.16b // vpxor %xmm1, %xmm2, %xmm2 # 2 = io + eor v10.16b, v10.16b, v9.16b + eor v3.16b, v3.16b, v0.16b // vpxor %xmm0, %xmm3, %xmm3 # 3 = jo + eor v11.16b, v11.16b, v8.16b + ld1 {v16.2d}, [x9],#16 // vmovdqu (%r9), %xmm0 + cbnz w8, Ldec_2x_loop + + // middle of last round + // vmovdqa 0x60(%r10), %xmm4 # 3 : sbou + tbl v4.16b, {v22.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbou + tbl v12.16b, {v22.16b}, v10.16b + // vmovdqa 0x70(%r10), %xmm1 # 0 : sbot + tbl v1.16b, {v23.16b}, v3.16b // vpshufb %xmm3, %xmm1, %xmm1 # 0 = sb1t + tbl v9.16b, {v23.16b}, v11.16b + ld1 {v2.2d}, [x11] // vmovdqa -0x160(%r11), %xmm2 # Lk_sr-Lk_dsbd=-0x160 + eor v4.16b, v4.16b, v16.16b // vpxor %xmm0, %xmm4, %xmm4 # 4 = sb1u + k + eor v12.16b, v12.16b, v16.16b + eor v0.16b, v1.16b, v4.16b // vpxor %xmm4, %xmm1, %xmm0 # 0 = A + eor v8.16b, v9.16b, v12.16b + tbl v0.16b, {v0.16b},v2.16b // vpshufb %xmm2, %xmm0, %xmm0 + tbl v1.16b, {v8.16b},v2.16b + ret + +//////////////////////////////////////////////////////// +// // +// AES key schedule // +// // +//////////////////////////////////////////////////////// +.def _vpaes_key_preheat + .type 32 +.endef +.align 4 +_vpaes_key_preheat: + adrp x10, Lk_inv + add x10, x10, :lo12:Lk_inv + movi v16.16b, #0x5b // Lk_s63 + adrp x11, Lk_sb1 + add x11, x11, :lo12:Lk_sb1 + movi v17.16b, #0x0f // Lk_s0F + ld1 {v18.2d,v19.2d,v20.2d,v21.2d}, [x10] // Lk_inv, Lk_ipt + adrp x10, Lk_dksd + add x10, x10, :lo12:Lk_dksd + ld1 {v22.2d,v23.2d}, [x11] // Lk_sb1 + adrp x11, Lk_mc_forward + add x11, x11, :lo12:Lk_mc_forward + ld1 {v24.2d,v25.2d,v26.2d,v27.2d}, [x10],#64 // Lk_dksd, Lk_dksb + ld1 {v28.2d,v29.2d,v30.2d,v31.2d}, [x10],#64 // Lk_dkse, Lk_dks9 + ld1 {v8.2d}, [x10] // Lk_rcon + ld1 {v9.2d}, [x11] // Lk_mc_forward[0] + ret + + +.def _vpaes_schedule_core + .type 32 +.endef +.align 4 +_vpaes_schedule_core: + AARCH64_SIGN_LINK_REGISTER + stp x29, x30, [sp,#-16]! + add x29,sp,#0 + + bl _vpaes_key_preheat // load the tables + + ld1 {v0.16b}, [x0],#16 // vmovdqu (%rdi), %xmm0 # load key (unaligned) + + // input transform + mov v3.16b, v0.16b // vmovdqa %xmm0, %xmm3 + bl _vpaes_schedule_transform + mov v7.16b, v0.16b // vmovdqa %xmm0, %xmm7 + + adrp x10, Lk_sr // lea Lk_sr(%rip),%r10 + add x10, x10, :lo12:Lk_sr + add x8, x8, x10 + cbnz w3, Lschedule_am_decrypting + + // encrypting, output zeroth round key after transform + st1 {v0.2d}, [x2] // vmovdqu %xmm0, (%rdx) + b Lschedule_go + +Lschedule_am_decrypting: + // decrypting, output zeroth round key after shiftrows + ld1 {v1.2d}, [x8] // vmovdqa (%r8,%r10), %xmm1 + tbl v3.16b, {v3.16b}, v1.16b // vpshufb %xmm1, %xmm3, %xmm3 + st1 {v3.2d}, [x2] // vmovdqu %xmm3, (%rdx) + eor x8, x8, #0x30 // xor $0x30, %r8 + +Lschedule_go: + cmp w1, #192 // cmp $192, %esi + b.hi Lschedule_256 + b.eq Lschedule_192 + // 128: fall though + +// +// .schedule_128 +// +// 128-bit specific part of key schedule. +// +// This schedule is really simple, because all its parts +// are accomplished by the subroutines. +// +Lschedule_128: + mov x0, #10 // mov $10, %esi + +Loop_schedule_128: + sub x0, x0, #1 // dec %esi + bl _vpaes_schedule_round + cbz x0, Lschedule_mangle_last + bl _vpaes_schedule_mangle // write output + b Loop_schedule_128 + +// +// .aes_schedule_192 +// +// 192-bit specific part of key schedule. +// +// The main body of this schedule is the same as the 128-bit +// schedule, but with more smearing. The long, high side is +// stored in %xmm7 as before, and the short, low side is in +// the high bits of %xmm6. +// +// This schedule is somewhat nastier, however, because each +// round produces 192 bits of key material, or 1.5 round keys. +// Therefore, on each cycle we do 2 rounds and produce 3 round +// keys. +// +.align 4 +Lschedule_192: + sub x0, x0, #8 + ld1 {v0.16b}, [x0] // vmovdqu 8(%rdi),%xmm0 # load key part 2 (very unaligned) + bl _vpaes_schedule_transform // input transform + mov v6.16b, v0.16b // vmovdqa %xmm0, %xmm6 # save short part + eor v4.16b, v4.16b, v4.16b // vpxor %xmm4, %xmm4, %xmm4 # clear 4 + ins v6.d[0], v4.d[0] // vmovhlps %xmm4, %xmm6, %xmm6 # clobber low side with zeros + mov x0, #4 // mov $4, %esi + +Loop_schedule_192: + sub x0, x0, #1 // dec %esi + bl _vpaes_schedule_round + ext v0.16b, v6.16b, v0.16b, #8 // vpalignr $8,%xmm6,%xmm0,%xmm0 + bl _vpaes_schedule_mangle // save key n + bl _vpaes_schedule_192_smear + bl _vpaes_schedule_mangle // save key n+1 + bl _vpaes_schedule_round + cbz x0, Lschedule_mangle_last + bl _vpaes_schedule_mangle // save key n+2 + bl _vpaes_schedule_192_smear + b Loop_schedule_192 + +// +// .aes_schedule_256 +// +// 256-bit specific part of key schedule. +// +// The structure here is very similar to the 128-bit +// schedule, but with an additional "low side" in +// %xmm6. The low side's rounds are the same as the +// high side's, except no rcon and no rotation. +// +.align 4 +Lschedule_256: + ld1 {v0.16b}, [x0] // vmovdqu 16(%rdi),%xmm0 # load key part 2 (unaligned) + bl _vpaes_schedule_transform // input transform + mov x0, #7 // mov $7, %esi + +Loop_schedule_256: + sub x0, x0, #1 // dec %esi + bl _vpaes_schedule_mangle // output low result + mov v6.16b, v0.16b // vmovdqa %xmm0, %xmm6 # save cur_lo in xmm6 + + // high round + bl _vpaes_schedule_round + cbz x0, Lschedule_mangle_last + bl _vpaes_schedule_mangle + + // low round. swap xmm7 and xmm6 + dup v0.4s, v0.s[3] // vpshufd $0xFF, %xmm0, %xmm0 + movi v4.16b, #0 + mov v5.16b, v7.16b // vmovdqa %xmm7, %xmm5 + mov v7.16b, v6.16b // vmovdqa %xmm6, %xmm7 + bl _vpaes_schedule_low_round + mov v7.16b, v5.16b // vmovdqa %xmm5, %xmm7 + + b Loop_schedule_256 + +// +// .aes_schedule_mangle_last +// +// Mangler for last round of key schedule +// Mangles %xmm0 +// when encrypting, outputs out(%xmm0) ^ 63 +// when decrypting, outputs unskew(%xmm0) +// +// Always called right before return... jumps to cleanup and exits +// +.align 4 +Lschedule_mangle_last: + // schedule last round key from xmm0 + adrp x11, Lk_deskew // lea Lk_deskew(%rip),%r11 # prepare to deskew + add x11, x11, :lo12:Lk_deskew + cbnz w3, Lschedule_mangle_last_dec + + // encrypting + ld1 {v1.2d}, [x8] // vmovdqa (%r8,%r10),%xmm1 + adrp x11, Lk_opt // lea Lk_opt(%rip), %r11 # prepare to output transform + add x11, x11, :lo12:Lk_opt + add x2, x2, #32 // add $32, %rdx + tbl v0.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm0 # output permute + +Lschedule_mangle_last_dec: + ld1 {v20.2d,v21.2d}, [x11] // reload constants + sub x2, x2, #16 // add $-16, %rdx + eor v0.16b, v0.16b, v16.16b // vpxor Lk_s63(%rip), %xmm0, %xmm0 + bl _vpaes_schedule_transform // output transform + st1 {v0.2d}, [x2] // vmovdqu %xmm0, (%rdx) # save last key + + // cleanup + eor v0.16b, v0.16b, v0.16b // vpxor %xmm0, %xmm0, %xmm0 + eor v1.16b, v1.16b, v1.16b // vpxor %xmm1, %xmm1, %xmm1 + eor v2.16b, v2.16b, v2.16b // vpxor %xmm2, %xmm2, %xmm2 + eor v3.16b, v3.16b, v3.16b // vpxor %xmm3, %xmm3, %xmm3 + eor v4.16b, v4.16b, v4.16b // vpxor %xmm4, %xmm4, %xmm4 + eor v5.16b, v5.16b, v5.16b // vpxor %xmm5, %xmm5, %xmm5 + eor v6.16b, v6.16b, v6.16b // vpxor %xmm6, %xmm6, %xmm6 + eor v7.16b, v7.16b, v7.16b // vpxor %xmm7, %xmm7, %xmm7 + ldp x29, x30, [sp],#16 + AARCH64_VALIDATE_LINK_REGISTER + ret + + +// +// .aes_schedule_192_smear +// +// Smear the short, low side in the 192-bit key schedule. +// +// Inputs: +// %xmm7: high side, b a x y +// %xmm6: low side, d c 0 0 +// %xmm13: 0 +// +// Outputs: +// %xmm6: b+c+d b+c 0 0 +// %xmm0: b+c+d b+c b a +// +.def _vpaes_schedule_192_smear + .type 32 +.endef +.align 4 +_vpaes_schedule_192_smear: + movi v1.16b, #0 + dup v0.4s, v7.s[3] + ins v1.s[3], v6.s[2] // vpshufd $0x80, %xmm6, %xmm1 # d c 0 0 -> c 0 0 0 + ins v0.s[0], v7.s[2] // vpshufd $0xFE, %xmm7, %xmm0 # b a _ _ -> b b b a + eor v6.16b, v6.16b, v1.16b // vpxor %xmm1, %xmm6, %xmm6 # -> c+d c 0 0 + eor v1.16b, v1.16b, v1.16b // vpxor %xmm1, %xmm1, %xmm1 + eor v6.16b, v6.16b, v0.16b // vpxor %xmm0, %xmm6, %xmm6 # -> b+c+d b+c b a + mov v0.16b, v6.16b // vmovdqa %xmm6, %xmm0 + ins v6.d[0], v1.d[0] // vmovhlps %xmm1, %xmm6, %xmm6 # clobber low side with zeros + ret + + +// +// .aes_schedule_round +// +// Runs one main round of the key schedule on %xmm0, %xmm7 +// +// Specifically, runs subbytes on the high dword of %xmm0 +// then rotates it by one byte and xors into the low dword of +// %xmm7. +// +// Adds rcon from low byte of %xmm8, then rotates %xmm8 for +// next rcon. +// +// Smears the dwords of %xmm7 by xoring the low into the +// second low, result into third, result into highest. +// +// Returns results in %xmm7 = %xmm0. +// Clobbers %xmm1-%xmm4, %r11. +// +.def _vpaes_schedule_round + .type 32 +.endef +.align 4 +_vpaes_schedule_round: + // extract rcon from xmm8 + movi v4.16b, #0 // vpxor %xmm4, %xmm4, %xmm4 + ext v1.16b, v8.16b, v4.16b, #15 // vpalignr $15, %xmm8, %xmm4, %xmm1 + ext v8.16b, v8.16b, v8.16b, #15 // vpalignr $15, %xmm8, %xmm8, %xmm8 + eor v7.16b, v7.16b, v1.16b // vpxor %xmm1, %xmm7, %xmm7 + + // rotate + dup v0.4s, v0.s[3] // vpshufd $0xFF, %xmm0, %xmm0 + ext v0.16b, v0.16b, v0.16b, #1 // vpalignr $1, %xmm0, %xmm0, %xmm0 + + // fall through... + + // low round: same as high round, but no rotation and no rcon. +_vpaes_schedule_low_round: + // smear xmm7 + ext v1.16b, v4.16b, v7.16b, #12 // vpslldq $4, %xmm7, %xmm1 + eor v7.16b, v7.16b, v1.16b // vpxor %xmm1, %xmm7, %xmm7 + ext v4.16b, v4.16b, v7.16b, #8 // vpslldq $8, %xmm7, %xmm4 + + // subbytes + and v1.16b, v0.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 # 0 = k + ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 # 1 = i + eor v7.16b, v7.16b, v4.16b // vpxor %xmm4, %xmm7, %xmm7 + tbl v2.16b, {v19.16b}, v1.16b // vpshufb %xmm1, %xmm11, %xmm2 # 2 = a/k + eor v1.16b, v1.16b, v0.16b // vpxor %xmm0, %xmm1, %xmm1 # 0 = j + tbl v3.16b, {v18.16b}, v0.16b // vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i + eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 # 3 = iak = 1/i + a/k + tbl v4.16b, {v18.16b}, v1.16b // vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j + eor v7.16b, v7.16b, v16.16b // vpxor Lk_s63(%rip), %xmm7, %xmm7 + tbl v3.16b, {v18.16b}, v3.16b // vpshufb %xmm3, %xmm10, %xmm3 # 2 = 1/iak + eor v4.16b, v4.16b, v2.16b // vpxor %xmm2, %xmm4, %xmm4 # 4 = jak = 1/j + a/k + tbl v2.16b, {v18.16b}, v4.16b // vpshufb %xmm4, %xmm10, %xmm2 # 3 = 1/jak + eor v3.16b, v3.16b, v1.16b // vpxor %xmm1, %xmm3, %xmm3 # 2 = io + eor v2.16b, v2.16b, v0.16b // vpxor %xmm0, %xmm2, %xmm2 # 3 = jo + tbl v4.16b, {v23.16b}, v3.16b // vpshufb %xmm3, %xmm13, %xmm4 # 4 = sbou + tbl v1.16b, {v22.16b}, v2.16b // vpshufb %xmm2, %xmm12, %xmm1 # 0 = sb1t + eor v1.16b, v1.16b, v4.16b // vpxor %xmm4, %xmm1, %xmm1 # 0 = sbox output + + // add in smeared stuff + eor v0.16b, v1.16b, v7.16b // vpxor %xmm7, %xmm1, %xmm0 + eor v7.16b, v1.16b, v7.16b // vmovdqa %xmm0, %xmm7 + ret + + +// +// .aes_schedule_transform +// +// Linear-transform %xmm0 according to tables at (%r11) +// +// Requires that %xmm9 = 0x0F0F... as in preheat +// Output in %xmm0 +// Clobbers %xmm1, %xmm2 +// +.def _vpaes_schedule_transform + .type 32 +.endef +.align 4 +_vpaes_schedule_transform: + and v1.16b, v0.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 + ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 + // vmovdqa (%r11), %xmm2 # lo + tbl v2.16b, {v20.16b}, v1.16b // vpshufb %xmm1, %xmm2, %xmm2 + // vmovdqa 16(%r11), %xmm1 # hi + tbl v0.16b, {v21.16b}, v0.16b // vpshufb %xmm0, %xmm1, %xmm0 + eor v0.16b, v0.16b, v2.16b // vpxor %xmm2, %xmm0, %xmm0 + ret + + +// +// .aes_schedule_mangle +// +// Mangle xmm0 from (basis-transformed) standard version +// to our version. +// +// On encrypt, +// xor with 0x63 +// multiply by circulant 0,1,1,1 +// apply shiftrows transform +// +// On decrypt, +// xor with 0x63 +// multiply by "inverse mixcolumns" circulant E,B,D,9 +// deskew +// apply shiftrows transform +// +// +// Writes out to (%rdx), and increments or decrements it +// Keeps track of round number mod 4 in %r8 +// Preserves xmm0 +// Clobbers xmm1-xmm5 +// +.def _vpaes_schedule_mangle + .type 32 +.endef +.align 4 +_vpaes_schedule_mangle: + mov v4.16b, v0.16b // vmovdqa %xmm0, %xmm4 # save xmm0 for later + // vmovdqa .Lk_mc_forward(%rip),%xmm5 + cbnz w3, Lschedule_mangle_dec + + // encrypting + eor v4.16b, v0.16b, v16.16b // vpxor Lk_s63(%rip), %xmm0, %xmm4 + add x2, x2, #16 // add $16, %rdx + tbl v4.16b, {v4.16b}, v9.16b // vpshufb %xmm5, %xmm4, %xmm4 + tbl v1.16b, {v4.16b}, v9.16b // vpshufb %xmm5, %xmm4, %xmm1 + tbl v3.16b, {v1.16b}, v9.16b // vpshufb %xmm5, %xmm1, %xmm3 + eor v4.16b, v4.16b, v1.16b // vpxor %xmm1, %xmm4, %xmm4 + ld1 {v1.2d}, [x8] // vmovdqa (%r8,%r10), %xmm1 + eor v3.16b, v3.16b, v4.16b // vpxor %xmm4, %xmm3, %xmm3 + + b Lschedule_mangle_both +.align 4 +Lschedule_mangle_dec: + // inverse mix columns + // lea .Lk_dksd(%rip),%r11 + ushr v1.16b, v4.16b, #4 // vpsrlb $4, %xmm4, %xmm1 # 1 = hi + and v4.16b, v4.16b, v17.16b // vpand %xmm9, %xmm4, %xmm4 # 4 = lo + + // vmovdqa 0x00(%r11), %xmm2 + tbl v2.16b, {v24.16b}, v4.16b // vpshufb %xmm4, %xmm2, %xmm2 + // vmovdqa 0x10(%r11), %xmm3 + tbl v3.16b, {v25.16b}, v1.16b // vpshufb %xmm1, %xmm3, %xmm3 + eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 + tbl v3.16b, {v3.16b}, v9.16b // vpshufb %xmm5, %xmm3, %xmm3 + + // vmovdqa 0x20(%r11), %xmm2 + tbl v2.16b, {v26.16b}, v4.16b // vpshufb %xmm4, %xmm2, %xmm2 + eor v2.16b, v2.16b, v3.16b // vpxor %xmm3, %xmm2, %xmm2 + // vmovdqa 0x30(%r11), %xmm3 + tbl v3.16b, {v27.16b}, v1.16b // vpshufb %xmm1, %xmm3, %xmm3 + eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 + tbl v3.16b, {v3.16b}, v9.16b // vpshufb %xmm5, %xmm3, %xmm3 + + // vmovdqa 0x40(%r11), %xmm2 + tbl v2.16b, {v28.16b}, v4.16b // vpshufb %xmm4, %xmm2, %xmm2 + eor v2.16b, v2.16b, v3.16b // vpxor %xmm3, %xmm2, %xmm2 + // vmovdqa 0x50(%r11), %xmm3 + tbl v3.16b, {v29.16b}, v1.16b // vpshufb %xmm1, %xmm3, %xmm3 + eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 + + // vmovdqa 0x60(%r11), %xmm2 + tbl v2.16b, {v30.16b}, v4.16b // vpshufb %xmm4, %xmm2, %xmm2 + tbl v3.16b, {v3.16b}, v9.16b // vpshufb %xmm5, %xmm3, %xmm3 + // vmovdqa 0x70(%r11), %xmm4 + tbl v4.16b, {v31.16b}, v1.16b // vpshufb %xmm1, %xmm4, %xmm4 + ld1 {v1.2d}, [x8] // vmovdqa (%r8,%r10), %xmm1 + eor v2.16b, v2.16b, v3.16b // vpxor %xmm3, %xmm2, %xmm2 + eor v3.16b, v4.16b, v2.16b // vpxor %xmm2, %xmm4, %xmm3 + + sub x2, x2, #16 // add $-16, %rdx + +Lschedule_mangle_both: + tbl v3.16b, {v3.16b}, v1.16b // vpshufb %xmm1, %xmm3, %xmm3 + add x8, x8, #64-16 // add $-16, %r8 + and x8, x8, #~(1<<6) // and $0x30, %r8 + st1 {v3.2d}, [x2] // vmovdqu %xmm3, (%rdx) + ret + + +.globl vpaes_set_encrypt_key +.def vpaes_set_encrypt_key + .type 32 +.endef +.align 4 +vpaes_set_encrypt_key: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + stp d8,d9,[sp,#-16]! // ABI spec says so + + lsr w9, w1, #5 // shr $5,%eax + add w9, w9, #5 // $5,%eax + str w9, [x2,#240] // mov %eax,240(%rdx) # AES_KEY->rounds = nbits/32+5; + + mov w3, #0 // mov $0,%ecx + mov x8, #0x30 // mov $0x30,%r8d + bl _vpaes_schedule_core + eor x0, x0, x0 + + ldp d8,d9,[sp],#16 + ldp x29,x30,[sp],#16 + AARCH64_VALIDATE_LINK_REGISTER + ret + + +.globl vpaes_set_decrypt_key +.def vpaes_set_decrypt_key + .type 32 +.endef +.align 4 +vpaes_set_decrypt_key: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + stp d8,d9,[sp,#-16]! // ABI spec says so + + lsr w9, w1, #5 // shr $5,%eax + add w9, w9, #5 // $5,%eax + str w9, [x2,#240] // mov %eax,240(%rdx) # AES_KEY->rounds = nbits/32+5; + lsl w9, w9, #4 // shl $4,%eax + add x2, x2, #16 // lea 16(%rdx,%rax),%rdx + add x2, x2, x9 + + mov w3, #1 // mov $1,%ecx + lsr w8, w1, #1 // shr $1,%r8d + and x8, x8, #32 // and $32,%r8d + eor x8, x8, #32 // xor $32,%r8d # nbits==192?0:32 + bl _vpaes_schedule_core + + ldp d8,d9,[sp],#16 + ldp x29,x30,[sp],#16 + AARCH64_VALIDATE_LINK_REGISTER + ret + +.globl vpaes_cbc_encrypt +.def vpaes_cbc_encrypt + .type 32 +.endef +.align 4 +vpaes_cbc_encrypt: + AARCH64_SIGN_LINK_REGISTER + cbz x2, Lcbc_abort + cmp w5, #0 // check direction + b.eq vpaes_cbc_decrypt + + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + + mov x17, x2 // reassign + mov x2, x3 // reassign + + ld1 {v0.16b}, [x4] // load ivec + bl _vpaes_encrypt_preheat + b Lcbc_enc_loop + +.align 4 +Lcbc_enc_loop: + ld1 {v7.16b}, [x0],#16 // load input + eor v7.16b, v7.16b, v0.16b // xor with ivec + bl _vpaes_encrypt_core + st1 {v0.16b}, [x1],#16 // save output + subs x17, x17, #16 + b.hi Lcbc_enc_loop + + st1 {v0.16b}, [x4] // write ivec + + ldp x29,x30,[sp],#16 +Lcbc_abort: + AARCH64_VALIDATE_LINK_REGISTER + ret + + +.def vpaes_cbc_decrypt + .type 32 +.endef +.align 4 +vpaes_cbc_decrypt: + // Not adding AARCH64_SIGN_LINK_REGISTER here because vpaes_cbc_decrypt is jumped to + // only from vpaes_cbc_encrypt which has already signed the return address. + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + stp d8,d9,[sp,#-16]! // ABI spec says so + stp d10,d11,[sp,#-16]! + stp d12,d13,[sp,#-16]! + stp d14,d15,[sp,#-16]! + + mov x17, x2 // reassign + mov x2, x3 // reassign + ld1 {v6.16b}, [x4] // load ivec + bl _vpaes_decrypt_preheat + tst x17, #16 + b.eq Lcbc_dec_loop2x + + ld1 {v7.16b}, [x0], #16 // load input + bl _vpaes_decrypt_core + eor v0.16b, v0.16b, v6.16b // xor with ivec + orr v6.16b, v7.16b, v7.16b // next ivec value + st1 {v0.16b}, [x1], #16 + subs x17, x17, #16 + b.ls Lcbc_dec_done + +.align 4 +Lcbc_dec_loop2x: + ld1 {v14.16b,v15.16b}, [x0], #32 + bl _vpaes_decrypt_2x + eor v0.16b, v0.16b, v6.16b // xor with ivec + eor v1.16b, v1.16b, v14.16b + orr v6.16b, v15.16b, v15.16b + st1 {v0.16b,v1.16b}, [x1], #32 + subs x17, x17, #32 + b.hi Lcbc_dec_loop2x + +Lcbc_dec_done: + st1 {v6.16b}, [x4] + + ldp d14,d15,[sp],#16 + ldp d12,d13,[sp],#16 + ldp d10,d11,[sp],#16 + ldp d8,d9,[sp],#16 + ldp x29,x30,[sp],#16 + AARCH64_VALIDATE_LINK_REGISTER + ret + +.globl vpaes_ecb_encrypt +.def vpaes_ecb_encrypt + .type 32 +.endef +.align 4 +vpaes_ecb_encrypt: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + stp d8,d9,[sp,#-16]! // ABI spec says so + stp d10,d11,[sp,#-16]! + stp d12,d13,[sp,#-16]! + stp d14,d15,[sp,#-16]! + + mov x17, x2 + mov x2, x3 + bl _vpaes_encrypt_preheat + tst x17, #16 + b.eq Lecb_enc_loop + + ld1 {v7.16b}, [x0],#16 + bl _vpaes_encrypt_core + st1 {v0.16b}, [x1],#16 + subs x17, x17, #16 + b.ls Lecb_enc_done + +.align 4 +Lecb_enc_loop: + ld1 {v14.16b,v15.16b}, [x0], #32 + bl _vpaes_encrypt_2x + st1 {v0.16b,v1.16b}, [x1], #32 + subs x17, x17, #32 + b.hi Lecb_enc_loop + +Lecb_enc_done: + ldp d14,d15,[sp],#16 + ldp d12,d13,[sp],#16 + ldp d10,d11,[sp],#16 + ldp d8,d9,[sp],#16 + ldp x29,x30,[sp],#16 + AARCH64_VALIDATE_LINK_REGISTER + ret + + +.globl vpaes_ecb_decrypt +.def vpaes_ecb_decrypt + .type 32 +.endef +.align 4 +vpaes_ecb_decrypt: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + stp d8,d9,[sp,#-16]! // ABI spec says so + stp d10,d11,[sp,#-16]! + stp d12,d13,[sp,#-16]! + stp d14,d15,[sp,#-16]! + + mov x17, x2 + mov x2, x3 + bl _vpaes_decrypt_preheat + tst x17, #16 + b.eq Lecb_dec_loop + + ld1 {v7.16b}, [x0],#16 + bl _vpaes_encrypt_core + st1 {v0.16b}, [x1],#16 + subs x17, x17, #16 + b.ls Lecb_dec_done + +.align 4 +Lecb_dec_loop: + ld1 {v14.16b,v15.16b}, [x0], #32 + bl _vpaes_decrypt_2x + st1 {v0.16b,v1.16b}, [x1], #32 + subs x17, x17, #32 + b.hi Lecb_dec_loop + +Lecb_dec_done: + ldp d14,d15,[sp],#16 + ldp d12,d13,[sp],#16 + ldp d10,d11,[sp],#16 + ldp d8,d9,[sp],#16 + ldp x29,x30,[sp],#16 + AARCH64_VALIDATE_LINK_REGISTER + ret + diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/arm64cpuid.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/arm64cpuid.S new file mode 100644 index 000000000000..13de97fb316e --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/arm64cpuid.S @@ -0,0 +1,310 @@ +#include "arm_arch.h" + +.text +.arch armv8-a+crypto + +.align 5 +.globl _armv7_neon_probe +.def _armv7_neon_probe + .type 32 +.endef +_armv7_neon_probe: + AARCH64_VALID_CALL_TARGET + orr v15.16b, v15.16b, v15.16b + ret + + +.globl _armv7_tick +.def _armv7_tick + .type 32 +.endef +_armv7_tick: + AARCH64_VALID_CALL_TARGET +#ifdef __APPLE__ + mrs x0, CNTPCT_EL0 +#else + mrs x0, CNTVCT_EL0 +#endif + ret + + +.globl _armv8_aes_probe +.def _armv8_aes_probe + .type 32 +.endef +_armv8_aes_probe: + AARCH64_VALID_CALL_TARGET + aese v0.16b, v0.16b + ret + + +.globl _armv8_sha1_probe +.def _armv8_sha1_probe + .type 32 +.endef +_armv8_sha1_probe: + AARCH64_VALID_CALL_TARGET + sha1h s0, s0 + ret + + +.globl _armv8_sha256_probe +.def _armv8_sha256_probe + .type 32 +.endef +_armv8_sha256_probe: + AARCH64_VALID_CALL_TARGET + sha256su0 v0.4s, v0.4s + ret + + +.globl _armv8_pmull_probe +.def _armv8_pmull_probe + .type 32 +.endef +_armv8_pmull_probe: + AARCH64_VALID_CALL_TARGET + pmull v0.1q, v0.1d, v0.1d + ret + + +.globl _armv8_sm4_probe +.def _armv8_sm4_probe + .type 32 +.endef +_armv8_sm4_probe: + AARCH64_VALID_CALL_TARGET +.long 0xcec08400 // sm4e v0.4s, v0.4s + ret + + +.globl _armv8_sha512_probe +.def _armv8_sha512_probe + .type 32 +.endef +_armv8_sha512_probe: + AARCH64_VALID_CALL_TARGET +.long 0xcec08000 // sha512su0 v0.2d,v0.2d + ret + + +.globl _armv8_eor3_probe +.def _armv8_eor3_probe + .type 32 +.endef +_armv8_eor3_probe: + AARCH64_VALID_CALL_TARGET +.long 0xce010800 // eor3 v0.16b, v0.16b, v1.16b, v2.16b + ret + + +.globl _armv8_sve_probe +.def _armv8_sve_probe + .type 32 +.endef +_armv8_sve_probe: + AARCH64_VALID_CALL_TARGET +.long 0x04a03000 // eor z0.d,z0.d,z0.d + ret + + +.globl _armv8_sve2_probe +.def _armv8_sve2_probe + .type 32 +.endef +_armv8_sve2_probe: + AARCH64_VALID_CALL_TARGET +.long 0x04e03400 // xar z0.d,z0.d,z0.d + ret + + +.globl _armv8_cpuid_probe +.def _armv8_cpuid_probe + .type 32 +.endef +_armv8_cpuid_probe: + AARCH64_VALID_CALL_TARGET + mrs x0, midr_el1 + ret + + +.globl _armv8_sm3_probe +.def _armv8_sm3_probe + .type 32 +.endef +_armv8_sm3_probe: + AARCH64_VALID_CALL_TARGET +.long 0xce63c004 // sm3partw1 v4.4s, v0.4s, v3.4s + ret + + +.globl OPENSSL_cleanse +.def OPENSSL_cleanse + .type 32 +.endef +.align 5 +OPENSSL_cleanse: + AARCH64_VALID_CALL_TARGET + cbz x1,Lret // len==0? + cmp x1,#15 + b.hi Lot // len>15 + nop +Little: + strb wzr,[x0],#1 // store byte-by-byte + subs x1,x1,#1 + b.ne Little +Lret: ret + +.align 4 +Lot: tst x0,#7 + b.eq Laligned // inp is aligned + strb wzr,[x0],#1 // store byte-by-byte + sub x1,x1,#1 + b Lot + +.align 4 +Laligned: + str xzr,[x0],#8 // store word-by-word + sub x1,x1,#8 + tst x1,#-8 + b.ne Laligned // len>=8 + cbnz x1,Little // len!=0? + ret + + +.globl CRYPTO_memcmp +.def CRYPTO_memcmp + .type 32 +.endef +.align 4 +CRYPTO_memcmp: + AARCH64_VALID_CALL_TARGET + eor w3,w3,w3 + cbz x2,Lno_data // len==0? + cmp x2,#16 + b.ne Loop_cmp + ldp x8,x9,[x0] + ldp x10,x11,[x1] + eor x8,x8,x10 + eor x9,x9,x11 + orr x8,x8,x9 + mov x0,#1 + cmp x8,#0 + csel x0,xzr,x0,eq + ret + +.align 4 +Loop_cmp: + ldrb w4,[x0],#1 + ldrb w5,[x1],#1 + eor w4,w4,w5 + orr w3,w3,w4 + subs x2,x2,#1 + b.ne Loop_cmp + +Lno_data: + neg w0,w3 + lsr w0,w0,#31 + ret + + +.globl _armv8_rng_probe +.def _armv8_rng_probe + .type 32 +.endef +_armv8_rng_probe: + AARCH64_VALID_CALL_TARGET + mrs x0, s3_3_c2_c4_0 // rndr + mrs x0, s3_3_c2_c4_1 // rndrrs + ret + +// Fill buffer with Randomly Generated Bytes +// inputs: char * in x0 - Pointer to buffer +// size_t in x1 - Number of bytes to write to buffer +// outputs: size_t in x0 - Number of bytes successfully written to buffer +.globl OPENSSL_rndr_asm +.def OPENSSL_rndr_asm + .type 32 +.endef +.align 4 +OPENSSL_rndr_asm: + AARCH64_VALID_CALL_TARGET + mov x2,xzr + mov x3,xzr + +.align 4 +Loop_rndr: + cmp x1,#0 + b.eq .rndr_done + mov x3,xzr + mrs x3,s3_3_c2_c4_0 + b.eq .rndr_done + + cmp x1,#8 + b.lt Loop_single_byte_rndr + + str x3,[x0] + add x0,x0,#8 + add x2,x2,#8 + subs x1,x1,#8 + b.ge Loop_rndr + +.align 4 +Loop_single_byte_rndr: + strb w3,[x0] + lsr x3,x3,#8 + add x2,x2,#1 + add x0,x0,#1 + subs x1,x1,#1 + b.gt Loop_single_byte_rndr + +.align 4 +.rndr_done: + mov x0,x2 + ret + +// Fill buffer with Randomly Generated Bytes +// inputs: char * in x0 - Pointer to buffer +// size_t in x1 - Number of bytes to write to buffer +// outputs: size_t in x0 - Number of bytes successfully written to buffer +.globl OPENSSL_rndrrs_asm +.def OPENSSL_rndrrs_asm + .type 32 +.endef +.align 4 +OPENSSL_rndrrs_asm: + AARCH64_VALID_CALL_TARGET + mov x2,xzr + mov x3,xzr + +.align 4 +Loop_rndrrs: + cmp x1,#0 + b.eq .rndrrs_done + mov x3,xzr + mrs x3,s3_3_c2_c4_1 + b.eq .rndrrs_done + + cmp x1,#8 + b.lt Loop_single_byte_rndrrs + + str x3,[x0] + add x0,x0,#8 + add x2,x2,#8 + subs x1,x1,#8 + b.ge Loop_rndrrs + +.align 4 +Loop_single_byte_rndrrs: + strb w3,[x0] + lsr x3,x3,#8 + add x2,x2,#1 + add x0,x0,#1 + subs x1,x1,#1 + b.gt Loop_single_byte_rndrrs + +.align 4 +.rndrrs_done: + mov x0,x2 + ret + diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/bn/armv8-mont.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/bn/armv8-mont.S new file mode 100644 index 000000000000..9ad1f8897097 --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/bn/armv8-mont.S @@ -0,0 +1,2144 @@ +#include "arm_arch.h" +#ifndef __KERNEL__ + + +#endif +.text + +.globl bn_mul_mont +.def bn_mul_mont + .type 32 +.endef +.align 5 +bn_mul_mont: + AARCH64_SIGN_LINK_REGISTER +Lbn_mul_mont: + tst x5,#3 + b.ne Lmul_mont + cmp x5,#32 + b.le Lscalar_impl +#ifndef __KERNEL__ +#ifndef __AARCH64EB__ + adrp x17,OPENSSL_armv8_rsa_neonized + ldr w17,[x17,#:lo12:OPENSSL_armv8_rsa_neonized] + cbnz w17, bn_mul8x_mont_neon +#endif +#endif + +Lscalar_impl: + tst x5,#7 + b.eq __bn_sqr8x_mont + tst x5,#3 + b.eq __bn_mul4x_mont + +Lmul_mont: + stp x29,x30,[sp,#-64]! + add x29,sp,#0 + stp x19,x20,[sp,#16] + stp x21,x22,[sp,#32] + stp x23,x24,[sp,#48] + + ldr x9,[x2],#8 // bp[0] + sub x22,sp,x5,lsl#3 + ldp x7,x8,[x1],#16 // ap[0..1] + lsl x5,x5,#3 + ldr x4,[x4] // *n0 + and x22,x22,#-16 // ABI says so + ldp x13,x14,[x3],#16 // np[0..1] + + mul x6,x7,x9 // ap[0]*bp[0] + sub x21,x5,#16 // j=num-2 + umulh x7,x7,x9 + mul x10,x8,x9 // ap[1]*bp[0] + umulh x11,x8,x9 + + mul x15,x6,x4 // "tp[0]"*n0 + mov sp,x22 // alloca + + // (*) mul x12,x13,x15 // np[0]*m1 + umulh x13,x13,x15 + mul x16,x14,x15 // np[1]*m1 + // (*) adds x12,x12,x6 // discarded + // (*) As for removal of first multiplication and addition + // instructions. The outcome of first addition is + // guaranteed to be zero, which leaves two computationally + // significant outcomes: it either carries or not. Then + // question is when does it carry? Is there alternative + // way to deduce it? If you follow operations, you can + // observe that condition for carry is quite simple: + // x6 being non-zero. So that carry can be calculated + // by adding -1 to x6. That's what next instruction does. + subs xzr,x6,#1 // (*) + umulh x17,x14,x15 + adc x13,x13,xzr + cbz x21,L1st_skip + +L1st: + ldr x8,[x1],#8 + adds x6,x10,x7 + sub x21,x21,#8 // j-- + adc x7,x11,xzr + + ldr x14,[x3],#8 + adds x12,x16,x13 + mul x10,x8,x9 // ap[j]*bp[0] + adc x13,x17,xzr + umulh x11,x8,x9 + + adds x12,x12,x6 + mul x16,x14,x15 // np[j]*m1 + adc x13,x13,xzr + umulh x17,x14,x15 + str x12,[x22],#8 // tp[j-1] + cbnz x21,L1st + +L1st_skip: + adds x6,x10,x7 + sub x1,x1,x5 // rewind x1 + adc x7,x11,xzr + + adds x12,x16,x13 + sub x3,x3,x5 // rewind x3 + adc x13,x17,xzr + + adds x12,x12,x6 + sub x20,x5,#8 // i=num-1 + adcs x13,x13,x7 + + adc x19,xzr,xzr // upmost overflow bit + stp x12,x13,[x22] + +Louter: + ldr x9,[x2],#8 // bp[i] + ldp x7,x8,[x1],#16 + ldr x23,[sp] // tp[0] + add x22,sp,#8 + + mul x6,x7,x9 // ap[0]*bp[i] + sub x21,x5,#16 // j=num-2 + umulh x7,x7,x9 + ldp x13,x14,[x3],#16 + mul x10,x8,x9 // ap[1]*bp[i] + adds x6,x6,x23 + umulh x11,x8,x9 + adc x7,x7,xzr + + mul x15,x6,x4 + sub x20,x20,#8 // i-- + + // (*) mul x12,x13,x15 // np[0]*m1 + umulh x13,x13,x15 + mul x16,x14,x15 // np[1]*m1 + // (*) adds x12,x12,x6 + subs xzr,x6,#1 // (*) + umulh x17,x14,x15 + cbz x21,Linner_skip + +Linner: + ldr x8,[x1],#8 + adc x13,x13,xzr + ldr x23,[x22],#8 // tp[j] + adds x6,x10,x7 + sub x21,x21,#8 // j-- + adc x7,x11,xzr + + adds x12,x16,x13 + ldr x14,[x3],#8 + adc x13,x17,xzr + + mul x10,x8,x9 // ap[j]*bp[i] + adds x6,x6,x23 + umulh x11,x8,x9 + adc x7,x7,xzr + + mul x16,x14,x15 // np[j]*m1 + adds x12,x12,x6 + umulh x17,x14,x15 + stur x12,[x22,#-16] // tp[j-1] + cbnz x21,Linner + +Linner_skip: + ldr x23,[x22],#8 // tp[j] + adc x13,x13,xzr + adds x6,x10,x7 + sub x1,x1,x5 // rewind x1 + adc x7,x11,xzr + + adds x12,x16,x13 + sub x3,x3,x5 // rewind x3 + adcs x13,x17,x19 + adc x19,xzr,xzr + + adds x6,x6,x23 + adc x7,x7,xzr + + adds x12,x12,x6 + adcs x13,x13,x7 + adc x19,x19,xzr // upmost overflow bit + stp x12,x13,[x22,#-16] + + cbnz x20,Louter + + // Final step. We see if result is larger than modulus, and + // if it is, subtract the modulus. But comparison implies + // subtraction. So we subtract modulus, see if it borrowed, + // and conditionally copy original value. + ldr x23,[sp] // tp[0] + add x22,sp,#8 + ldr x14,[x3],#8 // np[0] + subs x21,x5,#8 // j=num-1 and clear borrow + mov x1,x0 +Lsub: + sbcs x8,x23,x14 // tp[j]-np[j] + ldr x23,[x22],#8 + sub x21,x21,#8 // j-- + ldr x14,[x3],#8 + str x8,[x1],#8 // rp[j]=tp[j]-np[j] + cbnz x21,Lsub + + sbcs x8,x23,x14 + sbcs x19,x19,xzr // did it borrow? + str x8,[x1],#8 // rp[num-1] + + ldr x23,[sp] // tp[0] + add x22,sp,#8 + ldr x8,[x0],#8 // rp[0] + sub x5,x5,#8 // num-- + nop +Lcond_copy: + sub x5,x5,#8 // num-- + csel x14,x23,x8,lo // did it borrow? + ldr x23,[x22],#8 + ldr x8,[x0],#8 + stur xzr,[x22,#-16] // wipe tp + stur x14,[x0,#-16] + cbnz x5,Lcond_copy + + csel x14,x23,x8,lo + stur xzr,[x22,#-8] // wipe tp + stur x14,[x0,#-8] + + ldp x19,x20,[x29,#16] + mov sp,x29 + ldp x21,x22,[x29,#32] + mov x0,#1 + ldp x23,x24,[x29,#48] + ldr x29,[sp],#64 + AARCH64_VALIDATE_LINK_REGISTER + ret + +.def bn_mul8x_mont_neon + .type 32 +.endef +.align 5 +bn_mul8x_mont_neon: + // Not adding AARCH64_SIGN_LINK_REGISTER here because bn_mul8x_mont_neon is jumped to + // only from bn_mul_mont which has already signed the return address. + stp x29,x30,[sp,#-80]! + mov x16,sp + stp d8,d9,[sp,#16] + stp d10,d11,[sp,#32] + stp d12,d13,[sp,#48] + stp d14,d15,[sp,#64] + lsl x5,x5,#1 + eor v14.16b,v14.16b,v14.16b + +.align 4 +LNEON_8n: + eor v6.16b,v6.16b,v6.16b + sub x7,sp,#128 + eor v7.16b,v7.16b,v7.16b + sub x7,x7,x5,lsl#4 + eor v8.16b,v8.16b,v8.16b + and x7,x7,#-64 + eor v9.16b,v9.16b,v9.16b + mov sp,x7 // alloca + eor v10.16b,v10.16b,v10.16b + add x7,x7,#256 + eor v11.16b,v11.16b,v11.16b + sub x8,x5,#8 + eor v12.16b,v12.16b,v12.16b + eor v13.16b,v13.16b,v13.16b + +LNEON_8n_init: + st1 {v6.2d,v7.2d},[x7],#32 + subs x8,x8,#8 + st1 {v8.2d,v9.2d},[x7],#32 + st1 {v10.2d,v11.2d},[x7],#32 + st1 {v12.2d,v13.2d},[x7],#32 + bne LNEON_8n_init + + add x6,sp,#256 + ld1 {v0.4s,v1.4s},[x1],#32 + add x10,sp,#8 + ldr s30,[x4],#4 + mov x9,x5 + b LNEON_8n_outer + +.align 4 +LNEON_8n_outer: + ldr s28,[x2],#4 // *b++ + uxtl v28.4s,v28.4h + add x7,sp,#128 + ld1 {v2.4s,v3.4s},[x3],#32 + + umlal v6.2d,v28.2s,v0.s[0] + umlal v7.2d,v28.2s,v0.s[1] + umlal v8.2d,v28.2s,v0.s[2] + shl v29.2d,v6.2d,#16 + ext v29.16b,v29.16b,v29.16b,#8 + umlal v9.2d,v28.2s,v0.s[3] + add v29.2d,v29.2d,v6.2d + umlal v10.2d,v28.2s,v1.s[0] + mul v29.2s,v29.2s,v30.2s + umlal v11.2d,v28.2s,v1.s[1] + st1 {v28.2s},[sp] // put aside smashed b[8*i+0] + umlal v12.2d,v28.2s,v1.s[2] + uxtl v29.4s,v29.4h + umlal v13.2d,v28.2s,v1.s[3] + ldr s28,[x2],#4 // *b++ + umlal v6.2d,v29.2s,v2.s[0] + umlal v7.2d,v29.2s,v2.s[1] + uxtl v28.4s,v28.4h + umlal v8.2d,v29.2s,v2.s[2] + ushr v15.2d,v6.2d,#16 + umlal v9.2d,v29.2s,v2.s[3] + umlal v10.2d,v29.2s,v3.s[0] + ext v6.16b,v6.16b,v6.16b,#8 + add v6.2d,v6.2d,v15.2d + umlal v11.2d,v29.2s,v3.s[1] + ushr v6.2d,v6.2d,#16 + umlal v12.2d,v29.2s,v3.s[2] + umlal v13.2d,v29.2s,v3.s[3] + add v16.2d,v7.2d,v6.2d + ins v7.d[0],v16.d[0] + st1 {v29.2s},[x10],#8 // put aside smashed m[8*i+0] + umlal v7.2d,v28.2s,v0.s[0] + ld1 {v6.2d},[x6],#16 + umlal v8.2d,v28.2s,v0.s[1] + umlal v9.2d,v28.2s,v0.s[2] + shl v29.2d,v7.2d,#16 + ext v29.16b,v29.16b,v29.16b,#8 + umlal v10.2d,v28.2s,v0.s[3] + add v29.2d,v29.2d,v7.2d + umlal v11.2d,v28.2s,v1.s[0] + mul v29.2s,v29.2s,v30.2s + umlal v12.2d,v28.2s,v1.s[1] + st1 {v28.2s},[x10],#8 // put aside smashed b[8*i+1] + umlal v13.2d,v28.2s,v1.s[2] + uxtl v29.4s,v29.4h + umlal v6.2d,v28.2s,v1.s[3] + ldr s28,[x2],#4 // *b++ + umlal v7.2d,v29.2s,v2.s[0] + umlal v8.2d,v29.2s,v2.s[1] + uxtl v28.4s,v28.4h + umlal v9.2d,v29.2s,v2.s[2] + ushr v15.2d,v7.2d,#16 + umlal v10.2d,v29.2s,v2.s[3] + umlal v11.2d,v29.2s,v3.s[0] + ext v7.16b,v7.16b,v7.16b,#8 + add v7.2d,v7.2d,v15.2d + umlal v12.2d,v29.2s,v3.s[1] + ushr v7.2d,v7.2d,#16 + umlal v13.2d,v29.2s,v3.s[2] + umlal v6.2d,v29.2s,v3.s[3] + add v16.2d,v8.2d,v7.2d + ins v8.d[0],v16.d[0] + st1 {v29.2s},[x10],#8 // put aside smashed m[8*i+1] + umlal v8.2d,v28.2s,v0.s[0] + ld1 {v7.2d},[x6],#16 + umlal v9.2d,v28.2s,v0.s[1] + umlal v10.2d,v28.2s,v0.s[2] + shl v29.2d,v8.2d,#16 + ext v29.16b,v29.16b,v29.16b,#8 + umlal v11.2d,v28.2s,v0.s[3] + add v29.2d,v29.2d,v8.2d + umlal v12.2d,v28.2s,v1.s[0] + mul v29.2s,v29.2s,v30.2s + umlal v13.2d,v28.2s,v1.s[1] + st1 {v28.2s},[x10],#8 // put aside smashed b[8*i+2] + umlal v6.2d,v28.2s,v1.s[2] + uxtl v29.4s,v29.4h + umlal v7.2d,v28.2s,v1.s[3] + ldr s28,[x2],#4 // *b++ + umlal v8.2d,v29.2s,v2.s[0] + umlal v9.2d,v29.2s,v2.s[1] + uxtl v28.4s,v28.4h + umlal v10.2d,v29.2s,v2.s[2] + ushr v15.2d,v8.2d,#16 + umlal v11.2d,v29.2s,v2.s[3] + umlal v12.2d,v29.2s,v3.s[0] + ext v8.16b,v8.16b,v8.16b,#8 + add v8.2d,v8.2d,v15.2d + umlal v13.2d,v29.2s,v3.s[1] + ushr v8.2d,v8.2d,#16 + umlal v6.2d,v29.2s,v3.s[2] + umlal v7.2d,v29.2s,v3.s[3] + add v16.2d,v9.2d,v8.2d + ins v9.d[0],v16.d[0] + st1 {v29.2s},[x10],#8 // put aside smashed m[8*i+2] + umlal v9.2d,v28.2s,v0.s[0] + ld1 {v8.2d},[x6],#16 + umlal v10.2d,v28.2s,v0.s[1] + umlal v11.2d,v28.2s,v0.s[2] + shl v29.2d,v9.2d,#16 + ext v29.16b,v29.16b,v29.16b,#8 + umlal v12.2d,v28.2s,v0.s[3] + add v29.2d,v29.2d,v9.2d + umlal v13.2d,v28.2s,v1.s[0] + mul v29.2s,v29.2s,v30.2s + umlal v6.2d,v28.2s,v1.s[1] + st1 {v28.2s},[x10],#8 // put aside smashed b[8*i+3] + umlal v7.2d,v28.2s,v1.s[2] + uxtl v29.4s,v29.4h + umlal v8.2d,v28.2s,v1.s[3] + ldr s28,[x2],#4 // *b++ + umlal v9.2d,v29.2s,v2.s[0] + umlal v10.2d,v29.2s,v2.s[1] + uxtl v28.4s,v28.4h + umlal v11.2d,v29.2s,v2.s[2] + ushr v15.2d,v9.2d,#16 + umlal v12.2d,v29.2s,v2.s[3] + umlal v13.2d,v29.2s,v3.s[0] + ext v9.16b,v9.16b,v9.16b,#8 + add v9.2d,v9.2d,v15.2d + umlal v6.2d,v29.2s,v3.s[1] + ushr v9.2d,v9.2d,#16 + umlal v7.2d,v29.2s,v3.s[2] + umlal v8.2d,v29.2s,v3.s[3] + add v16.2d,v10.2d,v9.2d + ins v10.d[0],v16.d[0] + st1 {v29.2s},[x10],#8 // put aside smashed m[8*i+3] + umlal v10.2d,v28.2s,v0.s[0] + ld1 {v9.2d},[x6],#16 + umlal v11.2d,v28.2s,v0.s[1] + umlal v12.2d,v28.2s,v0.s[2] + shl v29.2d,v10.2d,#16 + ext v29.16b,v29.16b,v29.16b,#8 + umlal v13.2d,v28.2s,v0.s[3] + add v29.2d,v29.2d,v10.2d + umlal v6.2d,v28.2s,v1.s[0] + mul v29.2s,v29.2s,v30.2s + umlal v7.2d,v28.2s,v1.s[1] + st1 {v28.2s},[x10],#8 // put aside smashed b[8*i+4] + umlal v8.2d,v28.2s,v1.s[2] + uxtl v29.4s,v29.4h + umlal v9.2d,v28.2s,v1.s[3] + ldr s28,[x2],#4 // *b++ + umlal v10.2d,v29.2s,v2.s[0] + umlal v11.2d,v29.2s,v2.s[1] + uxtl v28.4s,v28.4h + umlal v12.2d,v29.2s,v2.s[2] + ushr v15.2d,v10.2d,#16 + umlal v13.2d,v29.2s,v2.s[3] + umlal v6.2d,v29.2s,v3.s[0] + ext v10.16b,v10.16b,v10.16b,#8 + add v10.2d,v10.2d,v15.2d + umlal v7.2d,v29.2s,v3.s[1] + ushr v10.2d,v10.2d,#16 + umlal v8.2d,v29.2s,v3.s[2] + umlal v9.2d,v29.2s,v3.s[3] + add v16.2d,v11.2d,v10.2d + ins v11.d[0],v16.d[0] + st1 {v29.2s},[x10],#8 // put aside smashed m[8*i+4] + umlal v11.2d,v28.2s,v0.s[0] + ld1 {v10.2d},[x6],#16 + umlal v12.2d,v28.2s,v0.s[1] + umlal v13.2d,v28.2s,v0.s[2] + shl v29.2d,v11.2d,#16 + ext v29.16b,v29.16b,v29.16b,#8 + umlal v6.2d,v28.2s,v0.s[3] + add v29.2d,v29.2d,v11.2d + umlal v7.2d,v28.2s,v1.s[0] + mul v29.2s,v29.2s,v30.2s + umlal v8.2d,v28.2s,v1.s[1] + st1 {v28.2s},[x10],#8 // put aside smashed b[8*i+5] + umlal v9.2d,v28.2s,v1.s[2] + uxtl v29.4s,v29.4h + umlal v10.2d,v28.2s,v1.s[3] + ldr s28,[x2],#4 // *b++ + umlal v11.2d,v29.2s,v2.s[0] + umlal v12.2d,v29.2s,v2.s[1] + uxtl v28.4s,v28.4h + umlal v13.2d,v29.2s,v2.s[2] + ushr v15.2d,v11.2d,#16 + umlal v6.2d,v29.2s,v2.s[3] + umlal v7.2d,v29.2s,v3.s[0] + ext v11.16b,v11.16b,v11.16b,#8 + add v11.2d,v11.2d,v15.2d + umlal v8.2d,v29.2s,v3.s[1] + ushr v11.2d,v11.2d,#16 + umlal v9.2d,v29.2s,v3.s[2] + umlal v10.2d,v29.2s,v3.s[3] + add v16.2d,v12.2d,v11.2d + ins v12.d[0],v16.d[0] + st1 {v29.2s},[x10],#8 // put aside smashed m[8*i+5] + umlal v12.2d,v28.2s,v0.s[0] + ld1 {v11.2d},[x6],#16 + umlal v13.2d,v28.2s,v0.s[1] + umlal v6.2d,v28.2s,v0.s[2] + shl v29.2d,v12.2d,#16 + ext v29.16b,v29.16b,v29.16b,#8 + umlal v7.2d,v28.2s,v0.s[3] + add v29.2d,v29.2d,v12.2d + umlal v8.2d,v28.2s,v1.s[0] + mul v29.2s,v29.2s,v30.2s + umlal v9.2d,v28.2s,v1.s[1] + st1 {v28.2s},[x10],#8 // put aside smashed b[8*i+6] + umlal v10.2d,v28.2s,v1.s[2] + uxtl v29.4s,v29.4h + umlal v11.2d,v28.2s,v1.s[3] + ldr s28,[x2],#4 // *b++ + umlal v12.2d,v29.2s,v2.s[0] + umlal v13.2d,v29.2s,v2.s[1] + uxtl v28.4s,v28.4h + umlal v6.2d,v29.2s,v2.s[2] + ushr v15.2d,v12.2d,#16 + umlal v7.2d,v29.2s,v2.s[3] + umlal v8.2d,v29.2s,v3.s[0] + ext v12.16b,v12.16b,v12.16b,#8 + add v12.2d,v12.2d,v15.2d + umlal v9.2d,v29.2s,v3.s[1] + ushr v12.2d,v12.2d,#16 + umlal v10.2d,v29.2s,v3.s[2] + umlal v11.2d,v29.2s,v3.s[3] + add v16.2d,v13.2d,v12.2d + ins v13.d[0],v16.d[0] + st1 {v29.2s},[x10],#8 // put aside smashed m[8*i+6] + umlal v13.2d,v28.2s,v0.s[0] + ld1 {v12.2d},[x6],#16 + umlal v6.2d,v28.2s,v0.s[1] + umlal v7.2d,v28.2s,v0.s[2] + shl v29.2d,v13.2d,#16 + ext v29.16b,v29.16b,v29.16b,#8 + umlal v8.2d,v28.2s,v0.s[3] + add v29.2d,v29.2d,v13.2d + umlal v9.2d,v28.2s,v1.s[0] + mul v29.2s,v29.2s,v30.2s + umlal v10.2d,v28.2s,v1.s[1] + st1 {v28.2s},[x10],#8 // put aside smashed b[8*i+7] + umlal v11.2d,v28.2s,v1.s[2] + uxtl v29.4s,v29.4h + umlal v12.2d,v28.2s,v1.s[3] + ld1 {v28.2s},[sp] // pull smashed b[8*i+0] + umlal v13.2d,v29.2s,v2.s[0] + ld1 {v0.4s,v1.4s},[x1],#32 + umlal v6.2d,v29.2s,v2.s[1] + umlal v7.2d,v29.2s,v2.s[2] + mov v5.16b,v13.16b + ushr v5.2d,v5.2d,#16 + ext v13.16b,v13.16b,v13.16b,#8 + umlal v8.2d,v29.2s,v2.s[3] + umlal v9.2d,v29.2s,v3.s[0] + add v13.2d,v13.2d,v5.2d + umlal v10.2d,v29.2s,v3.s[1] + ushr v13.2d,v13.2d,#16 + eor v15.16b,v15.16b,v15.16b + ins v13.d[1],v15.d[0] + umlal v11.2d,v29.2s,v3.s[2] + umlal v12.2d,v29.2s,v3.s[3] + add v6.2d,v6.2d,v13.2d + st1 {v29.2s},[x10],#8 // put aside smashed m[8*i+7] + add x10,sp,#8 // rewind + sub x8,x5,#8 + b LNEON_8n_inner + +.align 4 +LNEON_8n_inner: + subs x8,x8,#8 + umlal v6.2d,v28.2s,v0.s[0] + ld1 {v13.2d},[x6] + umlal v7.2d,v28.2s,v0.s[1] + ld1 {v29.2s},[x10],#8 // pull smashed m[8*i+0] + umlal v8.2d,v28.2s,v0.s[2] + ld1 {v2.4s,v3.4s},[x3],#32 + umlal v9.2d,v28.2s,v0.s[3] + b.eq LInner_jump + add x6,x6,#16 // don't advance in last iteration +LInner_jump: + umlal v10.2d,v28.2s,v1.s[0] + umlal v11.2d,v28.2s,v1.s[1] + umlal v12.2d,v28.2s,v1.s[2] + umlal v13.2d,v28.2s,v1.s[3] + ld1 {v28.2s},[x10],#8 // pull smashed b[8*i+1] + umlal v6.2d,v29.2s,v2.s[0] + umlal v7.2d,v29.2s,v2.s[1] + umlal v8.2d,v29.2s,v2.s[2] + umlal v9.2d,v29.2s,v2.s[3] + umlal v10.2d,v29.2s,v3.s[0] + umlal v11.2d,v29.2s,v3.s[1] + umlal v12.2d,v29.2s,v3.s[2] + umlal v13.2d,v29.2s,v3.s[3] + st1 {v6.2d},[x7],#16 + umlal v7.2d,v28.2s,v0.s[0] + ld1 {v6.2d},[x6] + umlal v8.2d,v28.2s,v0.s[1] + ld1 {v29.2s},[x10],#8 // pull smashed m[8*i+1] + umlal v9.2d,v28.2s,v0.s[2] + b.eq LInner_jump1 + add x6,x6,#16 // don't advance in last iteration +LInner_jump1: + umlal v10.2d,v28.2s,v0.s[3] + umlal v11.2d,v28.2s,v1.s[0] + umlal v12.2d,v28.2s,v1.s[1] + umlal v13.2d,v28.2s,v1.s[2] + umlal v6.2d,v28.2s,v1.s[3] + ld1 {v28.2s},[x10],#8 // pull smashed b[8*i+2] + umlal v7.2d,v29.2s,v2.s[0] + umlal v8.2d,v29.2s,v2.s[1] + umlal v9.2d,v29.2s,v2.s[2] + umlal v10.2d,v29.2s,v2.s[3] + umlal v11.2d,v29.2s,v3.s[0] + umlal v12.2d,v29.2s,v3.s[1] + umlal v13.2d,v29.2s,v3.s[2] + umlal v6.2d,v29.2s,v3.s[3] + st1 {v7.2d},[x7],#16 + umlal v8.2d,v28.2s,v0.s[0] + ld1 {v7.2d},[x6] + umlal v9.2d,v28.2s,v0.s[1] + ld1 {v29.2s},[x10],#8 // pull smashed m[8*i+2] + umlal v10.2d,v28.2s,v0.s[2] + b.eq LInner_jump2 + add x6,x6,#16 // don't advance in last iteration +LInner_jump2: + umlal v11.2d,v28.2s,v0.s[3] + umlal v12.2d,v28.2s,v1.s[0] + umlal v13.2d,v28.2s,v1.s[1] + umlal v6.2d,v28.2s,v1.s[2] + umlal v7.2d,v28.2s,v1.s[3] + ld1 {v28.2s},[x10],#8 // pull smashed b[8*i+3] + umlal v8.2d,v29.2s,v2.s[0] + umlal v9.2d,v29.2s,v2.s[1] + umlal v10.2d,v29.2s,v2.s[2] + umlal v11.2d,v29.2s,v2.s[3] + umlal v12.2d,v29.2s,v3.s[0] + umlal v13.2d,v29.2s,v3.s[1] + umlal v6.2d,v29.2s,v3.s[2] + umlal v7.2d,v29.2s,v3.s[3] + st1 {v8.2d},[x7],#16 + umlal v9.2d,v28.2s,v0.s[0] + ld1 {v8.2d},[x6] + umlal v10.2d,v28.2s,v0.s[1] + ld1 {v29.2s},[x10],#8 // pull smashed m[8*i+3] + umlal v11.2d,v28.2s,v0.s[2] + b.eq LInner_jump3 + add x6,x6,#16 // don't advance in last iteration +LInner_jump3: + umlal v12.2d,v28.2s,v0.s[3] + umlal v13.2d,v28.2s,v1.s[0] + umlal v6.2d,v28.2s,v1.s[1] + umlal v7.2d,v28.2s,v1.s[2] + umlal v8.2d,v28.2s,v1.s[3] + ld1 {v28.2s},[x10],#8 // pull smashed b[8*i+4] + umlal v9.2d,v29.2s,v2.s[0] + umlal v10.2d,v29.2s,v2.s[1] + umlal v11.2d,v29.2s,v2.s[2] + umlal v12.2d,v29.2s,v2.s[3] + umlal v13.2d,v29.2s,v3.s[0] + umlal v6.2d,v29.2s,v3.s[1] + umlal v7.2d,v29.2s,v3.s[2] + umlal v8.2d,v29.2s,v3.s[3] + st1 {v9.2d},[x7],#16 + umlal v10.2d,v28.2s,v0.s[0] + ld1 {v9.2d},[x6] + umlal v11.2d,v28.2s,v0.s[1] + ld1 {v29.2s},[x10],#8 // pull smashed m[8*i+4] + umlal v12.2d,v28.2s,v0.s[2] + b.eq LInner_jump4 + add x6,x6,#16 // don't advance in last iteration +LInner_jump4: + umlal v13.2d,v28.2s,v0.s[3] + umlal v6.2d,v28.2s,v1.s[0] + umlal v7.2d,v28.2s,v1.s[1] + umlal v8.2d,v28.2s,v1.s[2] + umlal v9.2d,v28.2s,v1.s[3] + ld1 {v28.2s},[x10],#8 // pull smashed b[8*i+5] + umlal v10.2d,v29.2s,v2.s[0] + umlal v11.2d,v29.2s,v2.s[1] + umlal v12.2d,v29.2s,v2.s[2] + umlal v13.2d,v29.2s,v2.s[3] + umlal v6.2d,v29.2s,v3.s[0] + umlal v7.2d,v29.2s,v3.s[1] + umlal v8.2d,v29.2s,v3.s[2] + umlal v9.2d,v29.2s,v3.s[3] + st1 {v10.2d},[x7],#16 + umlal v11.2d,v28.2s,v0.s[0] + ld1 {v10.2d},[x6] + umlal v12.2d,v28.2s,v0.s[1] + ld1 {v29.2s},[x10],#8 // pull smashed m[8*i+5] + umlal v13.2d,v28.2s,v0.s[2] + b.eq LInner_jump5 + add x6,x6,#16 // don't advance in last iteration +LInner_jump5: + umlal v6.2d,v28.2s,v0.s[3] + umlal v7.2d,v28.2s,v1.s[0] + umlal v8.2d,v28.2s,v1.s[1] + umlal v9.2d,v28.2s,v1.s[2] + umlal v10.2d,v28.2s,v1.s[3] + ld1 {v28.2s},[x10],#8 // pull smashed b[8*i+6] + umlal v11.2d,v29.2s,v2.s[0] + umlal v12.2d,v29.2s,v2.s[1] + umlal v13.2d,v29.2s,v2.s[2] + umlal v6.2d,v29.2s,v2.s[3] + umlal v7.2d,v29.2s,v3.s[0] + umlal v8.2d,v29.2s,v3.s[1] + umlal v9.2d,v29.2s,v3.s[2] + umlal v10.2d,v29.2s,v3.s[3] + st1 {v11.2d},[x7],#16 + umlal v12.2d,v28.2s,v0.s[0] + ld1 {v11.2d},[x6] + umlal v13.2d,v28.2s,v0.s[1] + ld1 {v29.2s},[x10],#8 // pull smashed m[8*i+6] + umlal v6.2d,v28.2s,v0.s[2] + b.eq LInner_jump6 + add x6,x6,#16 // don't advance in last iteration +LInner_jump6: + umlal v7.2d,v28.2s,v0.s[3] + umlal v8.2d,v28.2s,v1.s[0] + umlal v9.2d,v28.2s,v1.s[1] + umlal v10.2d,v28.2s,v1.s[2] + umlal v11.2d,v28.2s,v1.s[3] + ld1 {v28.2s},[x10],#8 // pull smashed b[8*i+7] + umlal v12.2d,v29.2s,v2.s[0] + umlal v13.2d,v29.2s,v2.s[1] + umlal v6.2d,v29.2s,v2.s[2] + umlal v7.2d,v29.2s,v2.s[3] + umlal v8.2d,v29.2s,v3.s[0] + umlal v9.2d,v29.2s,v3.s[1] + umlal v10.2d,v29.2s,v3.s[2] + umlal v11.2d,v29.2s,v3.s[3] + st1 {v12.2d},[x7],#16 + umlal v13.2d,v28.2s,v0.s[0] + ld1 {v12.2d},[x6] + umlal v6.2d,v28.2s,v0.s[1] + ld1 {v29.2s},[x10],#8 // pull smashed m[8*i+7] + umlal v7.2d,v28.2s,v0.s[2] + b.eq LInner_jump7 + add x6,x6,#16 // don't advance in last iteration +LInner_jump7: + umlal v8.2d,v28.2s,v0.s[3] + umlal v9.2d,v28.2s,v1.s[0] + umlal v10.2d,v28.2s,v1.s[1] + umlal v11.2d,v28.2s,v1.s[2] + umlal v12.2d,v28.2s,v1.s[3] + b.ne LInner_after_rewind8 + sub x1,x1,x5,lsl#2 // rewind +LInner_after_rewind8: + umlal v13.2d,v29.2s,v2.s[0] + ld1 {v28.2s},[sp] // pull smashed b[8*i+0] + umlal v6.2d,v29.2s,v2.s[1] + ld1 {v0.4s,v1.4s},[x1],#32 + umlal v7.2d,v29.2s,v2.s[2] + add x10,sp,#8 // rewind + umlal v8.2d,v29.2s,v2.s[3] + umlal v9.2d,v29.2s,v3.s[0] + umlal v10.2d,v29.2s,v3.s[1] + umlal v11.2d,v29.2s,v3.s[2] + st1 {v13.2d},[x7],#16 + umlal v12.2d,v29.2s,v3.s[3] + + bne LNEON_8n_inner + add x6,sp,#128 + st1 {v6.2d,v7.2d},[x7],#32 + eor v2.16b,v2.16b,v2.16b // v2 + st1 {v8.2d,v9.2d},[x7],#32 + eor v3.16b,v3.16b,v3.16b // v3 + st1 {v10.2d,v11.2d},[x7],#32 + st1 {v12.2d},[x7] + + subs x9,x9,#8 + ld1 {v6.2d,v7.2d},[x6],#32 + ld1 {v8.2d,v9.2d},[x6],#32 + ld1 {v10.2d,v11.2d},[x6],#32 + ld1 {v12.2d,v13.2d},[x6],#32 + + b.eq LInner_8n_jump_2steps + sub x3,x3,x5,lsl#2 // rewind + b LNEON_8n_outer + +LInner_8n_jump_2steps: + add x7,sp,#128 + st1 {v2.2d,v3.2d}, [sp],#32 // start wiping stack frame + mov v5.16b,v6.16b + ushr v15.2d,v6.2d,#16 + ext v6.16b,v6.16b,v6.16b,#8 + st1 {v2.2d,v3.2d}, [sp],#32 + add v6.2d,v6.2d,v15.2d + st1 {v2.2d,v3.2d}, [sp],#32 + ushr v15.2d,v6.2d,#16 + st1 {v2.2d,v3.2d}, [sp],#32 + zip1 v6.4h,v5.4h,v6.4h + ins v15.d[1],v14.d[0] + + mov x8,x5 + b LNEON_tail_entry + +.align 4 +LNEON_tail: + add v6.2d,v6.2d,v15.2d + mov v5.16b,v6.16b + ushr v15.2d,v6.2d,#16 + ext v6.16b,v6.16b,v6.16b,#8 + ld1 {v8.2d,v9.2d}, [x6],#32 + add v6.2d,v6.2d,v15.2d + ld1 {v10.2d,v11.2d}, [x6],#32 + ushr v15.2d,v6.2d,#16 + ld1 {v12.2d,v13.2d}, [x6],#32 + zip1 v6.4h,v5.4h,v6.4h + ins v15.d[1],v14.d[0] + +LNEON_tail_entry: + add v7.2d,v7.2d,v15.2d + st1 {v6.s}[0], [x7],#4 + ushr v15.2d,v7.2d,#16 + mov v5.16b,v7.16b + ext v7.16b,v7.16b,v7.16b,#8 + add v7.2d,v7.2d,v15.2d + ushr v15.2d,v7.2d,#16 + zip1 v7.4h,v5.4h,v7.4h + ins v15.d[1],v14.d[0] + add v8.2d,v8.2d,v15.2d + st1 {v7.s}[0], [x7],#4 + ushr v15.2d,v8.2d,#16 + mov v5.16b,v8.16b + ext v8.16b,v8.16b,v8.16b,#8 + add v8.2d,v8.2d,v15.2d + ushr v15.2d,v8.2d,#16 + zip1 v8.4h,v5.4h,v8.4h + ins v15.d[1],v14.d[0] + add v9.2d,v9.2d,v15.2d + st1 {v8.s}[0], [x7],#4 + ushr v15.2d,v9.2d,#16 + mov v5.16b,v9.16b + ext v9.16b,v9.16b,v9.16b,#8 + add v9.2d,v9.2d,v15.2d + ushr v15.2d,v9.2d,#16 + zip1 v9.4h,v5.4h,v9.4h + ins v15.d[1],v14.d[0] + add v10.2d,v10.2d,v15.2d + st1 {v9.s}[0], [x7],#4 + ushr v15.2d,v10.2d,#16 + mov v5.16b,v10.16b + ext v10.16b,v10.16b,v10.16b,#8 + add v10.2d,v10.2d,v15.2d + ushr v15.2d,v10.2d,#16 + zip1 v10.4h,v5.4h,v10.4h + ins v15.d[1],v14.d[0] + add v11.2d,v11.2d,v15.2d + st1 {v10.s}[0], [x7],#4 + ushr v15.2d,v11.2d,#16 + mov v5.16b,v11.16b + ext v11.16b,v11.16b,v11.16b,#8 + add v11.2d,v11.2d,v15.2d + ushr v15.2d,v11.2d,#16 + zip1 v11.4h,v5.4h,v11.4h + ins v15.d[1],v14.d[0] + add v12.2d,v12.2d,v15.2d + st1 {v11.s}[0], [x7],#4 + ushr v15.2d,v12.2d,#16 + mov v5.16b,v12.16b + ext v12.16b,v12.16b,v12.16b,#8 + add v12.2d,v12.2d,v15.2d + ushr v15.2d,v12.2d,#16 + zip1 v12.4h,v5.4h,v12.4h + ins v15.d[1],v14.d[0] + add v13.2d,v13.2d,v15.2d + st1 {v12.s}[0], [x7],#4 + ushr v15.2d,v13.2d,#16 + mov v5.16b,v13.16b + ext v13.16b,v13.16b,v13.16b,#8 + add v13.2d,v13.2d,v15.2d + ushr v15.2d,v13.2d,#16 + zip1 v13.4h,v5.4h,v13.4h + ins v15.d[1],v14.d[0] + ld1 {v6.2d,v7.2d}, [x6],#32 + subs x8,x8,#8 + st1 {v13.s}[0], [x7],#4 + bne LNEON_tail + + st1 {v15.s}[0], [x7],#4 // top-most bit + sub x3,x3,x5,lsl#2 // rewind x3 + subs x1,sp,#0 // clear carry flag + add x2,sp,x5,lsl#2 + +LNEON_sub: + ldp w4,w5,[x1],#8 + ldp w6,w7,[x1],#8 + ldp w8,w9,[x3],#8 + ldp w10,w11,[x3],#8 + sbcs w8,w4,w8 + sbcs w9,w5,w9 + sbcs w10,w6,w10 + sbcs w11,w7,w11 + sub x17,x2,x1 + stp w8,w9,[x0],#8 + stp w10,w11,[x0],#8 + cbnz x17,LNEON_sub + + ldr w10, [x1] // load top-most bit + mov x11,sp + eor v0.16b,v0.16b,v0.16b + sub x11,x2,x11 // this is num*4 + eor v1.16b,v1.16b,v1.16b + mov x1,sp + sub x0,x0,x11 // rewind x0 + mov x3,x2 // second 3/4th of frame + sbcs w10,w10,wzr // result is carry flag + +LNEON_copy_n_zap: + ldp w4,w5,[x1],#8 + ldp w6,w7,[x1],#8 + ldp w8,w9,[x0],#8 + ldp w10,w11,[x0] + sub x0,x0,#8 + b.cs LCopy_1 + mov w8,w4 + mov w9,w5 + mov w10,w6 + mov w11,w7 +LCopy_1: + st1 {v0.2d,v1.2d}, [x3],#32 // wipe + st1 {v0.2d,v1.2d}, [x3],#32 // wipe + ldp w4,w5,[x1],#8 + ldp w6,w7,[x1],#8 + stp w8,w9,[x0],#8 + stp w10,w11,[x0],#8 + sub x1,x1,#32 + ldp w8,w9,[x0],#8 + ldp w10,w11,[x0] + sub x0,x0,#8 + b.cs LCopy_2 + mov w8, w4 + mov w9, w5 + mov w10, w6 + mov w11, w7 +LCopy_2: + st1 {v0.2d,v1.2d}, [x1],#32 // wipe + st1 {v0.2d,v1.2d}, [x3],#32 // wipe + sub x17,x2,x1 // preserves carry + stp w8,w9,[x0],#8 + stp w10,w11,[x0],#8 + cbnz x17,LNEON_copy_n_zap + + mov sp,x16 + ldp d14,d15,[sp,#64] + ldp d12,d13,[sp,#48] + ldp d10,d11,[sp,#32] + ldp d8,d9,[sp,#16] + ldr x29,[sp],#80 + AARCH64_VALIDATE_LINK_REGISTER + ret // bx lr + + +.def __bn_sqr8x_mont + .type 32 +.endef +.align 5 +__bn_sqr8x_mont: + cmp x1,x2 + b.ne __bn_mul4x_mont +Lsqr8x_mont: + // Not adding AARCH64_SIGN_LINK_REGISTER here because __bn_sqr8x_mont is jumped to + // only from bn_mul_mont which has already signed the return address. + stp x29,x30,[sp,#-128]! + add x29,sp,#0 + stp x19,x20,[sp,#16] + stp x21,x22,[sp,#32] + stp x23,x24,[sp,#48] + stp x25,x26,[sp,#64] + stp x27,x28,[sp,#80] + stp x0,x3,[sp,#96] // offload rp and np + + ldp x6,x7,[x1,#8*0] + ldp x8,x9,[x1,#8*2] + ldp x10,x11,[x1,#8*4] + ldp x12,x13,[x1,#8*6] + + sub x2,sp,x5,lsl#4 + lsl x5,x5,#3 + ldr x4,[x4] // *n0 + mov sp,x2 // alloca + sub x27,x5,#8*8 + b Lsqr8x_zero_start + +Lsqr8x_zero: + sub x27,x27,#8*8 + stp xzr,xzr,[x2,#8*0] + stp xzr,xzr,[x2,#8*2] + stp xzr,xzr,[x2,#8*4] + stp xzr,xzr,[x2,#8*6] +Lsqr8x_zero_start: + stp xzr,xzr,[x2,#8*8] + stp xzr,xzr,[x2,#8*10] + stp xzr,xzr,[x2,#8*12] + stp xzr,xzr,[x2,#8*14] + add x2,x2,#8*16 + cbnz x27,Lsqr8x_zero + + add x3,x1,x5 + add x1,x1,#8*8 + mov x19,xzr + mov x20,xzr + mov x21,xzr + mov x22,xzr + mov x23,xzr + mov x24,xzr + mov x25,xzr + mov x26,xzr + mov x2,sp + str x4,[x29,#112] // offload n0 + + // Multiply everything but a[i]*a[i] +.align 4 +Lsqr8x_outer_loop: + // a[1]a[0] (i) + // a[2]a[0] + // a[3]a[0] + // a[4]a[0] + // a[5]a[0] + // a[6]a[0] + // a[7]a[0] + // a[2]a[1] (ii) + // a[3]a[1] + // a[4]a[1] + // a[5]a[1] + // a[6]a[1] + // a[7]a[1] + // a[3]a[2] (iii) + // a[4]a[2] + // a[5]a[2] + // a[6]a[2] + // a[7]a[2] + // a[4]a[3] (iv) + // a[5]a[3] + // a[6]a[3] + // a[7]a[3] + // a[5]a[4] (v) + // a[6]a[4] + // a[7]a[4] + // a[6]a[5] (vi) + // a[7]a[5] + // a[7]a[6] (vii) + + mul x14,x7,x6 // lo(a[1..7]*a[0]) (i) + mul x15,x8,x6 + mul x16,x9,x6 + mul x17,x10,x6 + adds x20,x20,x14 // t[1]+lo(a[1]*a[0]) + mul x14,x11,x6 + adcs x21,x21,x15 + mul x15,x12,x6 + adcs x22,x22,x16 + mul x16,x13,x6 + adcs x23,x23,x17 + umulh x17,x7,x6 // hi(a[1..7]*a[0]) + adcs x24,x24,x14 + umulh x14,x8,x6 + adcs x25,x25,x15 + umulh x15,x9,x6 + adcs x26,x26,x16 + umulh x16,x10,x6 + stp x19,x20,[x2],#8*2 // t[0..1] + adc x19,xzr,xzr // t[8] + adds x21,x21,x17 // t[2]+lo(a[1]*a[0]) + umulh x17,x11,x6 + adcs x22,x22,x14 + umulh x14,x12,x6 + adcs x23,x23,x15 + umulh x15,x13,x6 + adcs x24,x24,x16 + mul x16,x8,x7 // lo(a[2..7]*a[1]) (ii) + adcs x25,x25,x17 + mul x17,x9,x7 + adcs x26,x26,x14 + mul x14,x10,x7 + adc x19,x19,x15 + + mul x15,x11,x7 + adds x22,x22,x16 + mul x16,x12,x7 + adcs x23,x23,x17 + mul x17,x13,x7 + adcs x24,x24,x14 + umulh x14,x8,x7 // hi(a[2..7]*a[1]) + adcs x25,x25,x15 + umulh x15,x9,x7 + adcs x26,x26,x16 + umulh x16,x10,x7 + adcs x19,x19,x17 + umulh x17,x11,x7 + stp x21,x22,[x2],#8*2 // t[2..3] + adc x20,xzr,xzr // t[9] + adds x23,x23,x14 + umulh x14,x12,x7 + adcs x24,x24,x15 + umulh x15,x13,x7 + adcs x25,x25,x16 + mul x16,x9,x8 // lo(a[3..7]*a[2]) (iii) + adcs x26,x26,x17 + mul x17,x10,x8 + adcs x19,x19,x14 + mul x14,x11,x8 + adc x20,x20,x15 + + mul x15,x12,x8 + adds x24,x24,x16 + mul x16,x13,x8 + adcs x25,x25,x17 + umulh x17,x9,x8 // hi(a[3..7]*a[2]) + adcs x26,x26,x14 + umulh x14,x10,x8 + adcs x19,x19,x15 + umulh x15,x11,x8 + adcs x20,x20,x16 + umulh x16,x12,x8 + stp x23,x24,[x2],#8*2 // t[4..5] + adc x21,xzr,xzr // t[10] + adds x25,x25,x17 + umulh x17,x13,x8 + adcs x26,x26,x14 + mul x14,x10,x9 // lo(a[4..7]*a[3]) (iv) + adcs x19,x19,x15 + mul x15,x11,x9 + adcs x20,x20,x16 + mul x16,x12,x9 + adc x21,x21,x17 + + mul x17,x13,x9 + adds x26,x26,x14 + umulh x14,x10,x9 // hi(a[4..7]*a[3]) + adcs x19,x19,x15 + umulh x15,x11,x9 + adcs x20,x20,x16 + umulh x16,x12,x9 + adcs x21,x21,x17 + umulh x17,x13,x9 + stp x25,x26,[x2],#8*2 // t[6..7] + adc x22,xzr,xzr // t[11] + adds x19,x19,x14 + mul x14,x11,x10 // lo(a[5..7]*a[4]) (v) + adcs x20,x20,x15 + mul x15,x12,x10 + adcs x21,x21,x16 + mul x16,x13,x10 + adc x22,x22,x17 + + umulh x17,x11,x10 // hi(a[5..7]*a[4]) + adds x20,x20,x14 + umulh x14,x12,x10 + adcs x21,x21,x15 + umulh x15,x13,x10 + adcs x22,x22,x16 + mul x16,x12,x11 // lo(a[6..7]*a[5]) (vi) + adc x23,xzr,xzr // t[12] + adds x21,x21,x17 + mul x17,x13,x11 + adcs x22,x22,x14 + umulh x14,x12,x11 // hi(a[6..7]*a[5]) + adc x23,x23,x15 + + umulh x15,x13,x11 + adds x22,x22,x16 + mul x16,x13,x12 // lo(a[7]*a[6]) (vii) + adcs x23,x23,x17 + umulh x17,x13,x12 // hi(a[7]*a[6]) + adc x24,xzr,xzr // t[13] + adds x23,x23,x14 + sub x27,x3,x1 // done yet? + adc x24,x24,x15 + + adds x24,x24,x16 + sub x14,x3,x5 // rewinded ap + adc x25,xzr,xzr // t[14] + add x25,x25,x17 + + cbz x27,Lsqr8x_outer_break + + mov x4,x6 + ldp x6,x7,[x2,#8*0] + ldp x8,x9,[x2,#8*2] + ldp x10,x11,[x2,#8*4] + ldp x12,x13,[x2,#8*6] + adds x19,x19,x6 + adcs x20,x20,x7 + ldp x6,x7,[x1,#8*0] + adcs x21,x21,x8 + adcs x22,x22,x9 + ldp x8,x9,[x1,#8*2] + adcs x23,x23,x10 + adcs x24,x24,x11 + ldp x10,x11,[x1,#8*4] + adcs x25,x25,x12 + mov x0,x1 + adcs x26,xzr,x13 + ldp x12,x13,[x1,#8*6] + add x1,x1,#8*8 + //adc x28,xzr,xzr // moved below + mov x27,#-8*8 + + // a[8]a[0] + // a[9]a[0] + // a[a]a[0] + // a[b]a[0] + // a[c]a[0] + // a[d]a[0] + // a[e]a[0] + // a[f]a[0] + // a[8]a[1] + // a[f]a[1]........................ + // a[8]a[2] + // a[f]a[2]........................ + // a[8]a[3] + // a[f]a[3]........................ + // a[8]a[4] + // a[f]a[4]........................ + // a[8]a[5] + // a[f]a[5]........................ + // a[8]a[6] + // a[f]a[6]........................ + // a[8]a[7] + // a[f]a[7]........................ +Lsqr8x_mul: + mul x14,x6,x4 + adc x28,xzr,xzr // carry bit, modulo-scheduled + mul x15,x7,x4 + add x27,x27,#8 + mul x16,x8,x4 + mul x17,x9,x4 + adds x19,x19,x14 + mul x14,x10,x4 + adcs x20,x20,x15 + mul x15,x11,x4 + adcs x21,x21,x16 + mul x16,x12,x4 + adcs x22,x22,x17 + mul x17,x13,x4 + adcs x23,x23,x14 + umulh x14,x6,x4 + adcs x24,x24,x15 + umulh x15,x7,x4 + adcs x25,x25,x16 + umulh x16,x8,x4 + adcs x26,x26,x17 + umulh x17,x9,x4 + adc x28,x28,xzr + str x19,[x2],#8 + adds x19,x20,x14 + umulh x14,x10,x4 + adcs x20,x21,x15 + umulh x15,x11,x4 + adcs x21,x22,x16 + umulh x16,x12,x4 + adcs x22,x23,x17 + umulh x17,x13,x4 + ldr x4,[x0,x27] + adcs x23,x24,x14 + adcs x24,x25,x15 + adcs x25,x26,x16 + adcs x26,x28,x17 + //adc x28,xzr,xzr // moved above + cbnz x27,Lsqr8x_mul + // note that carry flag is guaranteed + // to be zero at this point + cmp x1,x3 // done yet? + b.eq Lsqr8x_break + + ldp x6,x7,[x2,#8*0] + ldp x8,x9,[x2,#8*2] + ldp x10,x11,[x2,#8*4] + ldp x12,x13,[x2,#8*6] + adds x19,x19,x6 + ldur x4,[x0,#-8*8] + adcs x20,x20,x7 + ldp x6,x7,[x1,#8*0] + adcs x21,x21,x8 + adcs x22,x22,x9 + ldp x8,x9,[x1,#8*2] + adcs x23,x23,x10 + adcs x24,x24,x11 + ldp x10,x11,[x1,#8*4] + adcs x25,x25,x12 + mov x27,#-8*8 + adcs x26,x26,x13 + ldp x12,x13,[x1,#8*6] + add x1,x1,#8*8 + //adc x28,xzr,xzr // moved above + b Lsqr8x_mul + +.align 4 +Lsqr8x_break: + ldp x6,x7,[x0,#8*0] + add x1,x0,#8*8 + ldp x8,x9,[x0,#8*2] + sub x14,x3,x1 // is it last iteration? + ldp x10,x11,[x0,#8*4] + sub x15,x2,x14 + ldp x12,x13,[x0,#8*6] + cbz x14,Lsqr8x_outer_loop + + stp x19,x20,[x2,#8*0] + ldp x19,x20,[x15,#8*0] + stp x21,x22,[x2,#8*2] + ldp x21,x22,[x15,#8*2] + stp x23,x24,[x2,#8*4] + ldp x23,x24,[x15,#8*4] + stp x25,x26,[x2,#8*6] + mov x2,x15 + ldp x25,x26,[x15,#8*6] + b Lsqr8x_outer_loop + +.align 4 +Lsqr8x_outer_break: + // Now multiply above result by 2 and add a[n-1]*a[n-1]|...|a[0]*a[0] + ldp x7,x9,[x14,#8*0] // recall that x14 is &a[0] + ldp x15,x16,[sp,#8*1] + ldp x11,x13,[x14,#8*2] + add x1,x14,#8*4 + ldp x17,x14,[sp,#8*3] + + stp x19,x20,[x2,#8*0] + mul x19,x7,x7 + stp x21,x22,[x2,#8*2] + umulh x7,x7,x7 + stp x23,x24,[x2,#8*4] + mul x8,x9,x9 + stp x25,x26,[x2,#8*6] + mov x2,sp + umulh x9,x9,x9 + adds x20,x7,x15,lsl#1 + extr x15,x16,x15,#63 + sub x27,x5,#8*4 + +Lsqr4x_shift_n_add: + adcs x21,x8,x15 + extr x16,x17,x16,#63 + sub x27,x27,#8*4 + adcs x22,x9,x16 + ldp x15,x16,[x2,#8*5] + mul x10,x11,x11 + ldp x7,x9,[x1],#8*2 + umulh x11,x11,x11 + mul x12,x13,x13 + umulh x13,x13,x13 + extr x17,x14,x17,#63 + stp x19,x20,[x2,#8*0] + adcs x23,x10,x17 + extr x14,x15,x14,#63 + stp x21,x22,[x2,#8*2] + adcs x24,x11,x14 + ldp x17,x14,[x2,#8*7] + extr x15,x16,x15,#63 + adcs x25,x12,x15 + extr x16,x17,x16,#63 + adcs x26,x13,x16 + ldp x15,x16,[x2,#8*9] + mul x6,x7,x7 + ldp x11,x13,[x1],#8*2 + umulh x7,x7,x7 + mul x8,x9,x9 + umulh x9,x9,x9 + stp x23,x24,[x2,#8*4] + extr x17,x14,x17,#63 + stp x25,x26,[x2,#8*6] + add x2,x2,#8*8 + adcs x19,x6,x17 + extr x14,x15,x14,#63 + adcs x20,x7,x14 + ldp x17,x14,[x2,#8*3] + extr x15,x16,x15,#63 + cbnz x27,Lsqr4x_shift_n_add + ldp x1,x4,[x29,#104] // pull np and n0 + + adcs x21,x8,x15 + extr x16,x17,x16,#63 + adcs x22,x9,x16 + ldp x15,x16,[x2,#8*5] + mul x10,x11,x11 + umulh x11,x11,x11 + stp x19,x20,[x2,#8*0] + mul x12,x13,x13 + umulh x13,x13,x13 + stp x21,x22,[x2,#8*2] + extr x17,x14,x17,#63 + adcs x23,x10,x17 + extr x14,x15,x14,#63 + ldp x19,x20,[sp,#8*0] + adcs x24,x11,x14 + extr x15,x16,x15,#63 + ldp x6,x7,[x1,#8*0] + adcs x25,x12,x15 + extr x16,xzr,x16,#63 + ldp x8,x9,[x1,#8*2] + adc x26,x13,x16 + ldp x10,x11,[x1,#8*4] + + // Reduce by 512 bits per iteration + mul x28,x4,x19 // t[0]*n0 + ldp x12,x13,[x1,#8*6] + add x3,x1,x5 + ldp x21,x22,[sp,#8*2] + stp x23,x24,[x2,#8*4] + ldp x23,x24,[sp,#8*4] + stp x25,x26,[x2,#8*6] + ldp x25,x26,[sp,#8*6] + add x1,x1,#8*8 + mov x30,xzr // initial top-most carry + mov x2,sp + mov x27,#8 + +Lsqr8x_reduction: + // (*) mul x14,x6,x28 // lo(n[0-7])*lo(t[0]*n0) + mul x15,x7,x28 + sub x27,x27,#1 + mul x16,x8,x28 + str x28,[x2],#8 // put aside t[0]*n0 for tail processing + mul x17,x9,x28 + // (*) adds xzr,x19,x14 + subs xzr,x19,#1 // (*) + mul x14,x10,x28 + adcs x19,x20,x15 + mul x15,x11,x28 + adcs x20,x21,x16 + mul x16,x12,x28 + adcs x21,x22,x17 + mul x17,x13,x28 + adcs x22,x23,x14 + umulh x14,x6,x28 // hi(n[0-7])*lo(t[0]*n0) + adcs x23,x24,x15 + umulh x15,x7,x28 + adcs x24,x25,x16 + umulh x16,x8,x28 + adcs x25,x26,x17 + umulh x17,x9,x28 + adc x26,xzr,xzr + adds x19,x19,x14 + umulh x14,x10,x28 + adcs x20,x20,x15 + umulh x15,x11,x28 + adcs x21,x21,x16 + umulh x16,x12,x28 + adcs x22,x22,x17 + umulh x17,x13,x28 + mul x28,x4,x19 // next t[0]*n0 + adcs x23,x23,x14 + adcs x24,x24,x15 + adcs x25,x25,x16 + adc x26,x26,x17 + cbnz x27,Lsqr8x_reduction + + ldp x14,x15,[x2,#8*0] + ldp x16,x17,[x2,#8*2] + mov x0,x2 + sub x27,x3,x1 // done yet? + adds x19,x19,x14 + adcs x20,x20,x15 + ldp x14,x15,[x2,#8*4] + adcs x21,x21,x16 + adcs x22,x22,x17 + ldp x16,x17,[x2,#8*6] + adcs x23,x23,x14 + adcs x24,x24,x15 + adcs x25,x25,x16 + adcs x26,x26,x17 + //adc x28,xzr,xzr // moved below + cbz x27,Lsqr8x8_post_condition + + ldur x4,[x2,#-8*8] + ldp x6,x7,[x1,#8*0] + ldp x8,x9,[x1,#8*2] + ldp x10,x11,[x1,#8*4] + mov x27,#-8*8 + ldp x12,x13,[x1,#8*6] + add x1,x1,#8*8 + +Lsqr8x_tail: + mul x14,x6,x4 + adc x28,xzr,xzr // carry bit, modulo-scheduled + mul x15,x7,x4 + add x27,x27,#8 + mul x16,x8,x4 + mul x17,x9,x4 + adds x19,x19,x14 + mul x14,x10,x4 + adcs x20,x20,x15 + mul x15,x11,x4 + adcs x21,x21,x16 + mul x16,x12,x4 + adcs x22,x22,x17 + mul x17,x13,x4 + adcs x23,x23,x14 + umulh x14,x6,x4 + adcs x24,x24,x15 + umulh x15,x7,x4 + adcs x25,x25,x16 + umulh x16,x8,x4 + adcs x26,x26,x17 + umulh x17,x9,x4 + adc x28,x28,xzr + str x19,[x2],#8 + adds x19,x20,x14 + umulh x14,x10,x4 + adcs x20,x21,x15 + umulh x15,x11,x4 + adcs x21,x22,x16 + umulh x16,x12,x4 + adcs x22,x23,x17 + umulh x17,x13,x4 + ldr x4,[x0,x27] + adcs x23,x24,x14 + adcs x24,x25,x15 + adcs x25,x26,x16 + adcs x26,x28,x17 + //adc x28,xzr,xzr // moved above + cbnz x27,Lsqr8x_tail + // note that carry flag is guaranteed + // to be zero at this point + ldp x6,x7,[x2,#8*0] + sub x27,x3,x1 // done yet? + sub x16,x3,x5 // rewinded np + ldp x8,x9,[x2,#8*2] + ldp x10,x11,[x2,#8*4] + ldp x12,x13,[x2,#8*6] + cbz x27,Lsqr8x_tail_break + + ldur x4,[x0,#-8*8] + adds x19,x19,x6 + adcs x20,x20,x7 + ldp x6,x7,[x1,#8*0] + adcs x21,x21,x8 + adcs x22,x22,x9 + ldp x8,x9,[x1,#8*2] + adcs x23,x23,x10 + adcs x24,x24,x11 + ldp x10,x11,[x1,#8*4] + adcs x25,x25,x12 + mov x27,#-8*8 + adcs x26,x26,x13 + ldp x12,x13,[x1,#8*6] + add x1,x1,#8*8 + //adc x28,xzr,xzr // moved above + b Lsqr8x_tail + +.align 4 +Lsqr8x_tail_break: + ldr x4,[x29,#112] // pull n0 + add x27,x2,#8*8 // end of current t[num] window + + subs xzr,x30,#1 // "move" top-most carry to carry bit + adcs x14,x19,x6 + adcs x15,x20,x7 + ldp x19,x20,[x0,#8*0] + adcs x21,x21,x8 + ldp x6,x7,[x16,#8*0] // recall that x16 is &n[0] + adcs x22,x22,x9 + ldp x8,x9,[x16,#8*2] + adcs x23,x23,x10 + adcs x24,x24,x11 + ldp x10,x11,[x16,#8*4] + adcs x25,x25,x12 + adcs x26,x26,x13 + ldp x12,x13,[x16,#8*6] + add x1,x16,#8*8 + adc x30,xzr,xzr // top-most carry + mul x28,x4,x19 + stp x14,x15,[x2,#8*0] + stp x21,x22,[x2,#8*2] + ldp x21,x22,[x0,#8*2] + stp x23,x24,[x2,#8*4] + ldp x23,x24,[x0,#8*4] + cmp x27,x29 // did we hit the bottom? + stp x25,x26,[x2,#8*6] + mov x2,x0 // slide the window + ldp x25,x26,[x0,#8*6] + mov x27,#8 + b.ne Lsqr8x_reduction + + // Final step. We see if result is larger than modulus, and + // if it is, subtract the modulus. But comparison implies + // subtraction. So we subtract modulus, see if it borrowed, + // and conditionally copy original value. + ldr x0,[x29,#96] // pull rp + add x2,x2,#8*8 + subs x14,x19,x6 + sbcs x15,x20,x7 + sub x27,x5,#8*8 + mov x3,x0 // x0 copy + +Lsqr8x_sub: + sbcs x16,x21,x8 + ldp x6,x7,[x1,#8*0] + sbcs x17,x22,x9 + stp x14,x15,[x0,#8*0] + sbcs x14,x23,x10 + ldp x8,x9,[x1,#8*2] + sbcs x15,x24,x11 + stp x16,x17,[x0,#8*2] + sbcs x16,x25,x12 + ldp x10,x11,[x1,#8*4] + sbcs x17,x26,x13 + ldp x12,x13,[x1,#8*6] + add x1,x1,#8*8 + ldp x19,x20,[x2,#8*0] + sub x27,x27,#8*8 + ldp x21,x22,[x2,#8*2] + ldp x23,x24,[x2,#8*4] + ldp x25,x26,[x2,#8*6] + add x2,x2,#8*8 + stp x14,x15,[x0,#8*4] + sbcs x14,x19,x6 + stp x16,x17,[x0,#8*6] + add x0,x0,#8*8 + sbcs x15,x20,x7 + cbnz x27,Lsqr8x_sub + + sbcs x16,x21,x8 + mov x2,sp + add x1,sp,x5 + ldp x6,x7,[x3,#8*0] + sbcs x17,x22,x9 + stp x14,x15,[x0,#8*0] + sbcs x14,x23,x10 + ldp x8,x9,[x3,#8*2] + sbcs x15,x24,x11 + stp x16,x17,[x0,#8*2] + sbcs x16,x25,x12 + ldp x19,x20,[x1,#8*0] + sbcs x17,x26,x13 + ldp x21,x22,[x1,#8*2] + sbcs xzr,x30,xzr // did it borrow? + ldr x30,[x29,#8] // pull return address + stp x14,x15,[x0,#8*4] + stp x16,x17,[x0,#8*6] + + sub x27,x5,#8*4 +Lsqr4x_cond_copy: + sub x27,x27,#8*4 + csel x14,x19,x6,lo + stp xzr,xzr,[x2,#8*0] + csel x15,x20,x7,lo + ldp x6,x7,[x3,#8*4] + ldp x19,x20,[x1,#8*4] + csel x16,x21,x8,lo + stp xzr,xzr,[x2,#8*2] + add x2,x2,#8*4 + csel x17,x22,x9,lo + ldp x8,x9,[x3,#8*6] + ldp x21,x22,[x1,#8*6] + add x1,x1,#8*4 + stp x14,x15,[x3,#8*0] + stp x16,x17,[x3,#8*2] + add x3,x3,#8*4 + stp xzr,xzr,[x1,#8*0] + stp xzr,xzr,[x1,#8*2] + cbnz x27,Lsqr4x_cond_copy + + csel x14,x19,x6,lo + stp xzr,xzr,[x2,#8*0] + csel x15,x20,x7,lo + stp xzr,xzr,[x2,#8*2] + csel x16,x21,x8,lo + csel x17,x22,x9,lo + stp x14,x15,[x3,#8*0] + stp x16,x17,[x3,#8*2] + + b Lsqr8x_done + +.align 4 +Lsqr8x8_post_condition: + adc x28,xzr,xzr + ldr x30,[x29,#8] // pull return address + // x19-7,x28 hold result, x6-7 hold modulus + subs x6,x19,x6 + ldr x1,[x29,#96] // pull rp + sbcs x7,x20,x7 + stp xzr,xzr,[sp,#8*0] + sbcs x8,x21,x8 + stp xzr,xzr,[sp,#8*2] + sbcs x9,x22,x9 + stp xzr,xzr,[sp,#8*4] + sbcs x10,x23,x10 + stp xzr,xzr,[sp,#8*6] + sbcs x11,x24,x11 + stp xzr,xzr,[sp,#8*8] + sbcs x12,x25,x12 + stp xzr,xzr,[sp,#8*10] + sbcs x13,x26,x13 + stp xzr,xzr,[sp,#8*12] + sbcs x28,x28,xzr // did it borrow? + stp xzr,xzr,[sp,#8*14] + + // x6-7 hold result-modulus + csel x6,x19,x6,lo + csel x7,x20,x7,lo + csel x8,x21,x8,lo + csel x9,x22,x9,lo + stp x6,x7,[x1,#8*0] + csel x10,x23,x10,lo + csel x11,x24,x11,lo + stp x8,x9,[x1,#8*2] + csel x12,x25,x12,lo + csel x13,x26,x13,lo + stp x10,x11,[x1,#8*4] + stp x12,x13,[x1,#8*6] + +Lsqr8x_done: + ldp x19,x20,[x29,#16] + mov sp,x29 + ldp x21,x22,[x29,#32] + mov x0,#1 + ldp x23,x24,[x29,#48] + ldp x25,x26,[x29,#64] + ldp x27,x28,[x29,#80] + ldr x29,[sp],#128 + // x30 is loaded earlier + AARCH64_VALIDATE_LINK_REGISTER + ret + +.def __bn_mul4x_mont + .type 32 +.endef +.align 5 +__bn_mul4x_mont: + // Not adding AARCH64_SIGN_LINK_REGISTER here because __bn_mul4x_mont is jumped to + // only from bn_mul_mont (or __bn_sqr8x_mont from bn_mul_mont) which has already signed the return address. + stp x29,x30,[sp,#-128]! + add x29,sp,#0 + stp x19,x20,[sp,#16] + stp x21,x22,[sp,#32] + stp x23,x24,[sp,#48] + stp x25,x26,[sp,#64] + stp x27,x28,[sp,#80] + + sub x26,sp,x5,lsl#3 + lsl x5,x5,#3 + ldr x4,[x4] // *n0 + sub sp,x26,#8*4 // alloca + + add x10,x2,x5 + add x27,x1,x5 + stp x0,x10,[x29,#96] // offload rp and &b[num] + + ldr x24,[x2,#8*0] // b[0] + ldp x6,x7,[x1,#8*0] // a[0..3] + ldp x8,x9,[x1,#8*2] + add x1,x1,#8*4 + mov x19,xzr + mov x20,xzr + mov x21,xzr + mov x22,xzr + ldp x14,x15,[x3,#8*0] // n[0..3] + ldp x16,x17,[x3,#8*2] + adds x3,x3,#8*4 // clear carry bit + mov x0,xzr + mov x28,#0 + mov x26,sp + +Loop_mul4x_1st_reduction: + mul x10,x6,x24 // lo(a[0..3]*b[0]) + adc x0,x0,xzr // modulo-scheduled + mul x11,x7,x24 + add x28,x28,#8 + mul x12,x8,x24 + and x28,x28,#31 + mul x13,x9,x24 + adds x19,x19,x10 + umulh x10,x6,x24 // hi(a[0..3]*b[0]) + adcs x20,x20,x11 + mul x25,x19,x4 // t[0]*n0 + adcs x21,x21,x12 + umulh x11,x7,x24 + adcs x22,x22,x13 + umulh x12,x8,x24 + adc x23,xzr,xzr + umulh x13,x9,x24 + ldr x24,[x2,x28] // next b[i] (or b[0]) + adds x20,x20,x10 + // (*) mul x10,x14,x25 // lo(n[0..3]*t[0]*n0) + str x25,[x26],#8 // put aside t[0]*n0 for tail processing + adcs x21,x21,x11 + mul x11,x15,x25 + adcs x22,x22,x12 + mul x12,x16,x25 + adc x23,x23,x13 // can't overflow + mul x13,x17,x25 + // (*) adds xzr,x19,x10 + subs xzr,x19,#1 // (*) + umulh x10,x14,x25 // hi(n[0..3]*t[0]*n0) + adcs x19,x20,x11 + umulh x11,x15,x25 + adcs x20,x21,x12 + umulh x12,x16,x25 + adcs x21,x22,x13 + umulh x13,x17,x25 + adcs x22,x23,x0 + adc x0,xzr,xzr + adds x19,x19,x10 + sub x10,x27,x1 + adcs x20,x20,x11 + adcs x21,x21,x12 + adcs x22,x22,x13 + //adc x0,x0,xzr + cbnz x28,Loop_mul4x_1st_reduction + + cbz x10,Lmul4x4_post_condition + + ldp x6,x7,[x1,#8*0] // a[4..7] + ldp x8,x9,[x1,#8*2] + add x1,x1,#8*4 + ldr x25,[sp] // a[0]*n0 + ldp x14,x15,[x3,#8*0] // n[4..7] + ldp x16,x17,[x3,#8*2] + add x3,x3,#8*4 + +Loop_mul4x_1st_tail: + mul x10,x6,x24 // lo(a[4..7]*b[i]) + adc x0,x0,xzr // modulo-scheduled + mul x11,x7,x24 + add x28,x28,#8 + mul x12,x8,x24 + and x28,x28,#31 + mul x13,x9,x24 + adds x19,x19,x10 + umulh x10,x6,x24 // hi(a[4..7]*b[i]) + adcs x20,x20,x11 + umulh x11,x7,x24 + adcs x21,x21,x12 + umulh x12,x8,x24 + adcs x22,x22,x13 + umulh x13,x9,x24 + adc x23,xzr,xzr + ldr x24,[x2,x28] // next b[i] (or b[0]) + adds x20,x20,x10 + mul x10,x14,x25 // lo(n[4..7]*a[0]*n0) + adcs x21,x21,x11 + mul x11,x15,x25 + adcs x22,x22,x12 + mul x12,x16,x25 + adc x23,x23,x13 // can't overflow + mul x13,x17,x25 + adds x19,x19,x10 + umulh x10,x14,x25 // hi(n[4..7]*a[0]*n0) + adcs x20,x20,x11 + umulh x11,x15,x25 + adcs x21,x21,x12 + umulh x12,x16,x25 + adcs x22,x22,x13 + adcs x23,x23,x0 + umulh x13,x17,x25 + adc x0,xzr,xzr + ldr x25,[sp,x28] // next t[0]*n0 + str x19,[x26],#8 // result!!! + adds x19,x20,x10 + sub x10,x27,x1 // done yet? + adcs x20,x21,x11 + adcs x21,x22,x12 + adcs x22,x23,x13 + //adc x0,x0,xzr + cbnz x28,Loop_mul4x_1st_tail + + sub x11,x27,x5 // rewinded x1 + cbz x10,Lmul4x_proceed + + ldp x6,x7,[x1,#8*0] + ldp x8,x9,[x1,#8*2] + add x1,x1,#8*4 + ldp x14,x15,[x3,#8*0] + ldp x16,x17,[x3,#8*2] + add x3,x3,#8*4 + b Loop_mul4x_1st_tail + +.align 5 +Lmul4x_proceed: + ldr x24,[x2,#8*4]! // *++b + adc x30,x0,xzr + ldp x6,x7,[x11,#8*0] // a[0..3] + sub x3,x3,x5 // rewind np + ldp x8,x9,[x11,#8*2] + add x1,x11,#8*4 + + stp x19,x20,[x26,#8*0] // result!!! + ldp x19,x20,[sp,#8*4] // t[0..3] + stp x21,x22,[x26,#8*2] // result!!! + ldp x21,x22,[sp,#8*6] + + ldp x14,x15,[x3,#8*0] // n[0..3] + mov x26,sp + ldp x16,x17,[x3,#8*2] + adds x3,x3,#8*4 // clear carry bit + mov x0,xzr + +.align 4 +Loop_mul4x_reduction: + mul x10,x6,x24 // lo(a[0..3]*b[4]) + adc x0,x0,xzr // modulo-scheduled + mul x11,x7,x24 + add x28,x28,#8 + mul x12,x8,x24 + and x28,x28,#31 + mul x13,x9,x24 + adds x19,x19,x10 + umulh x10,x6,x24 // hi(a[0..3]*b[4]) + adcs x20,x20,x11 + mul x25,x19,x4 // t[0]*n0 + adcs x21,x21,x12 + umulh x11,x7,x24 + adcs x22,x22,x13 + umulh x12,x8,x24 + adc x23,xzr,xzr + umulh x13,x9,x24 + ldr x24,[x2,x28] // next b[i] + adds x20,x20,x10 + // (*) mul x10,x14,x25 + str x25,[x26],#8 // put aside t[0]*n0 for tail processing + adcs x21,x21,x11 + mul x11,x15,x25 // lo(n[0..3]*t[0]*n0 + adcs x22,x22,x12 + mul x12,x16,x25 + adc x23,x23,x13 // can't overflow + mul x13,x17,x25 + // (*) adds xzr,x19,x10 + subs xzr,x19,#1 // (*) + umulh x10,x14,x25 // hi(n[0..3]*t[0]*n0 + adcs x19,x20,x11 + umulh x11,x15,x25 + adcs x20,x21,x12 + umulh x12,x16,x25 + adcs x21,x22,x13 + umulh x13,x17,x25 + adcs x22,x23,x0 + adc x0,xzr,xzr + adds x19,x19,x10 + adcs x20,x20,x11 + adcs x21,x21,x12 + adcs x22,x22,x13 + //adc x0,x0,xzr + cbnz x28,Loop_mul4x_reduction + + adc x0,x0,xzr + ldp x10,x11,[x26,#8*4] // t[4..7] + ldp x12,x13,[x26,#8*6] + ldp x6,x7,[x1,#8*0] // a[4..7] + ldp x8,x9,[x1,#8*2] + add x1,x1,#8*4 + adds x19,x19,x10 + adcs x20,x20,x11 + adcs x21,x21,x12 + adcs x22,x22,x13 + //adc x0,x0,xzr + + ldr x25,[sp] // t[0]*n0 + ldp x14,x15,[x3,#8*0] // n[4..7] + ldp x16,x17,[x3,#8*2] + add x3,x3,#8*4 + +.align 4 +Loop_mul4x_tail: + mul x10,x6,x24 // lo(a[4..7]*b[4]) + adc x0,x0,xzr // modulo-scheduled + mul x11,x7,x24 + add x28,x28,#8 + mul x12,x8,x24 + and x28,x28,#31 + mul x13,x9,x24 + adds x19,x19,x10 + umulh x10,x6,x24 // hi(a[4..7]*b[4]) + adcs x20,x20,x11 + umulh x11,x7,x24 + adcs x21,x21,x12 + umulh x12,x8,x24 + adcs x22,x22,x13 + umulh x13,x9,x24 + adc x23,xzr,xzr + ldr x24,[x2,x28] // next b[i] + adds x20,x20,x10 + mul x10,x14,x25 // lo(n[4..7]*t[0]*n0) + adcs x21,x21,x11 + mul x11,x15,x25 + adcs x22,x22,x12 + mul x12,x16,x25 + adc x23,x23,x13 // can't overflow + mul x13,x17,x25 + adds x19,x19,x10 + umulh x10,x14,x25 // hi(n[4..7]*t[0]*n0) + adcs x20,x20,x11 + umulh x11,x15,x25 + adcs x21,x21,x12 + umulh x12,x16,x25 + adcs x22,x22,x13 + umulh x13,x17,x25 + adcs x23,x23,x0 + ldr x25,[sp,x28] // next a[0]*n0 + adc x0,xzr,xzr + str x19,[x26],#8 // result!!! + adds x19,x20,x10 + sub x10,x27,x1 // done yet? + adcs x20,x21,x11 + adcs x21,x22,x12 + adcs x22,x23,x13 + //adc x0,x0,xzr + cbnz x28,Loop_mul4x_tail + + sub x11,x3,x5 // rewinded np? + adc x0,x0,xzr + cbz x10,Loop_mul4x_break + + ldp x10,x11,[x26,#8*4] + ldp x12,x13,[x26,#8*6] + ldp x6,x7,[x1,#8*0] + ldp x8,x9,[x1,#8*2] + add x1,x1,#8*4 + adds x19,x19,x10 + adcs x20,x20,x11 + adcs x21,x21,x12 + adcs x22,x22,x13 + //adc x0,x0,xzr + ldp x14,x15,[x3,#8*0] + ldp x16,x17,[x3,#8*2] + add x3,x3,#8*4 + b Loop_mul4x_tail + +.align 4 +Loop_mul4x_break: + ldp x12,x13,[x29,#96] // pull rp and &b[num] + adds x19,x19,x30 + add x2,x2,#8*4 // bp++ + adcs x20,x20,xzr + sub x1,x1,x5 // rewind ap + adcs x21,x21,xzr + stp x19,x20,[x26,#8*0] // result!!! + adcs x22,x22,xzr + ldp x19,x20,[sp,#8*4] // t[0..3] + adc x30,x0,xzr + stp x21,x22,[x26,#8*2] // result!!! + cmp x2,x13 // done yet? + ldp x21,x22,[sp,#8*6] + ldp x14,x15,[x11,#8*0] // n[0..3] + ldp x16,x17,[x11,#8*2] + add x3,x11,#8*4 + b.eq Lmul4x_post + + ldr x24,[x2] + ldp x6,x7,[x1,#8*0] // a[0..3] + ldp x8,x9,[x1,#8*2] + adds x1,x1,#8*4 // clear carry bit + mov x0,xzr + mov x26,sp + b Loop_mul4x_reduction + +.align 4 +Lmul4x_post: + // Final step. We see if result is larger than modulus, and + // if it is, subtract the modulus. But comparison implies + // subtraction. So we subtract modulus, see if it borrowed, + // and conditionally copy original value. + mov x0,x12 + mov x27,x12 // x0 copy + subs x10,x19,x14 + add x26,sp,#8*8 + sbcs x11,x20,x15 + sub x28,x5,#8*4 + +Lmul4x_sub: + sbcs x12,x21,x16 + ldp x14,x15,[x3,#8*0] + sub x28,x28,#8*4 + ldp x19,x20,[x26,#8*0] + sbcs x13,x22,x17 + ldp x16,x17,[x3,#8*2] + add x3,x3,#8*4 + ldp x21,x22,[x26,#8*2] + add x26,x26,#8*4 + stp x10,x11,[x0,#8*0] + sbcs x10,x19,x14 + stp x12,x13,[x0,#8*2] + add x0,x0,#8*4 + sbcs x11,x20,x15 + cbnz x28,Lmul4x_sub + + sbcs x12,x21,x16 + mov x26,sp + add x1,sp,#8*4 + ldp x6,x7,[x27,#8*0] + sbcs x13,x22,x17 + stp x10,x11,[x0,#8*0] + ldp x8,x9,[x27,#8*2] + stp x12,x13,[x0,#8*2] + ldp x19,x20,[x1,#8*0] + ldp x21,x22,[x1,#8*2] + sbcs xzr,x30,xzr // did it borrow? + ldr x30,[x29,#8] // pull return address + + sub x28,x5,#8*4 +Lmul4x_cond_copy: + sub x28,x28,#8*4 + csel x10,x19,x6,lo + stp xzr,xzr,[x26,#8*0] + csel x11,x20,x7,lo + ldp x6,x7,[x27,#8*4] + ldp x19,x20,[x1,#8*4] + csel x12,x21,x8,lo + stp xzr,xzr,[x26,#8*2] + add x26,x26,#8*4 + csel x13,x22,x9,lo + ldp x8,x9,[x27,#8*6] + ldp x21,x22,[x1,#8*6] + add x1,x1,#8*4 + stp x10,x11,[x27,#8*0] + stp x12,x13,[x27,#8*2] + add x27,x27,#8*4 + cbnz x28,Lmul4x_cond_copy + + csel x10,x19,x6,lo + stp xzr,xzr,[x26,#8*0] + csel x11,x20,x7,lo + stp xzr,xzr,[x26,#8*2] + csel x12,x21,x8,lo + stp xzr,xzr,[x26,#8*3] + csel x13,x22,x9,lo + stp xzr,xzr,[x26,#8*4] + stp x10,x11,[x27,#8*0] + stp x12,x13,[x27,#8*2] + + b Lmul4x_done + +.align 4 +Lmul4x4_post_condition: + adc x0,x0,xzr + ldr x1,[x29,#96] // pull rp + // x19-3,x0 hold result, x14-7 hold modulus + subs x6,x19,x14 + ldr x30,[x29,#8] // pull return address + sbcs x7,x20,x15 + stp xzr,xzr,[sp,#8*0] + sbcs x8,x21,x16 + stp xzr,xzr,[sp,#8*2] + sbcs x9,x22,x17 + stp xzr,xzr,[sp,#8*4] + sbcs xzr,x0,xzr // did it borrow? + stp xzr,xzr,[sp,#8*6] + + // x6-3 hold result-modulus + csel x6,x19,x6,lo + csel x7,x20,x7,lo + csel x8,x21,x8,lo + csel x9,x22,x9,lo + stp x6,x7,[x1,#8*0] + stp x8,x9,[x1,#8*2] + +Lmul4x_done: + ldp x19,x20,[x29,#16] + mov sp,x29 + ldp x21,x22,[x29,#32] + mov x0,#1 + ldp x23,x24,[x29,#48] + ldp x25,x26,[x29,#64] + ldp x27,x28,[x29,#80] + ldr x29,[sp],#128 + // x30 loaded earlier + AARCH64_VALIDATE_LINK_REGISTER + ret + +.section .rodata +.byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 +.align 2 +.align 4 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/ec/ecp_nistz256-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/ec/ecp_nistz256-armv8.S new file mode 100644 index 000000000000..ca164fae5f52 --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/ec/ecp_nistz256-armv8.S @@ -0,0 +1,4338 @@ +#include "arm_arch.h" + +.section .rodata +.globl ecp_nistz256_precomputed + +.align 12 +ecp_nistz256_precomputed: +.byte 0x3c,0x4d,0x27,0xcc,0xf5,0x4a,0x4f,0x8f,0xe8,0xc8,0x04,0x68,0x09,0x4a,0x5b,0x80,0x9d,0x7a,0xe8,0x31,0x08,0x76,0x68,0x19,0x9f,0x08,0xb4,0x1f,0x32,0x43,0x89,0xd8,0x34,0xd3,0xf5,0xb7,0xb5,0xee,0x42,0x3e,0x91,0x01,0x06,0x7c,0xbf,0xd9,0x97,0x12,0xd3,0x1a,0xc9,0x04,0x8d,0x53,0x83,0x14,0x28,0xf0,0x8e,0x19,0xcc,0x91,0xe5,0x80 +.byte 0x14,0xd6,0xc1,0x8d,0x61,0x66,0x3b,0xa7,0x20,0x1e,0xe4,0x77,0xd7,0x66,0x05,0xfb,0x5c,0xa9,0x9a,0x7a,0xb2,0x30,0x50,0x28,0x87,0x80,0xfe,0xcd,0xe1,0xb3,0xff,0xa3,0x45,0x3c,0x7e,0x9b,0x08,0xc0,0xc1,0x9f,0x2e,0xad,0x7d,0x89,0x79,0x90,0x60,0xc6,0xac,0x17,0x64,0x59,0x4d,0xcf,0x56,0x7a,0xca,0x82,0xaa,0x6e,0x04,0x2f,0x1f,0x8b +.byte 0xa9,0xdd,0xeb,0x91,0x5c,0x77,0x17,0x99,0x4e,0xc2,0x45,0x69,0x2e,0xcf,0x60,0xc6,0x3c,0xad,0x65,0x33,0x35,0x6f,0xe4,0xd0,0x37,0x1f,0xe2,0x2c,0x66,0x98,0x55,0xe3,0x66,0xa2,0xc6,0x21,0xce,0x63,0x59,0x2e,0xd2,0x2b,0x8a,0x5a,0xcd,0xee,0xa7,0xad,0xf6,0x8c,0x3f,0x44,0x6c,0x12,0x30,0x8d,0xca,0xea,0x46,0x8a,0x4c,0x96,0xf9,0x96 +.byte 0x18,0x10,0x4e,0x46,0xc4,0x3e,0xa0,0x94,0x26,0x9d,0x62,0xd2,0x4b,0xb0,0xbc,0x0b,0xd5,0x56,0xa5,0xd2,0xc1,0x2f,0x2d,0x15,0xd8,0xed,0x97,0x17,0xcb,0x32,0x67,0xc5,0x0f,0x7c,0xde,0xa8,0x8c,0x4d,0xa0,0xb8,0x2e,0xed,0x24,0xd5,0xd5,0x49,0xca,0x77,0x1f,0x48,0x3b,0x83,0x54,0xb2,0xe7,0x7e,0x7a,0xa7,0x5c,0xed,0x7f,0xa1,0x9f,0x05 +.byte 0xd4,0xd4,0x90,0x0d,0xae,0x37,0x4e,0xd1,0x8f,0xd1,0x0a,0xa7,0x63,0x5b,0xb7,0x65,0xcb,0xc8,0xba,0x29,0xec,0x35,0x53,0xb2,0xac,0x32,0xf4,0xb7,0x6a,0xb1,0x69,0xcf,0x56,0x14,0x7f,0xd6,0xc5,0xca,0x88,0x1d,0x49,0xcf,0xfd,0x1f,0xcc,0xb1,0x13,0x30,0x42,0xd0,0x1c,0x6e,0x38,0x8e,0xf9,0x40,0xe7,0xe8,0xd6,0x28,0x1a,0x75,0x31,0xf3 +.byte 0x30,0x46,0x3f,0xb5,0x8a,0x47,0x35,0x4c,0x6e,0xdb,0x26,0x1a,0x25,0xa3,0xd8,0x0b,0x1d,0x51,0x12,0x91,0x4c,0x11,0x76,0x83,0x19,0xad,0x2a,0x3e,0xb4,0x1c,0x3c,0xfc,0x14,0x20,0x84,0x58,0x7b,0xc3,0x94,0x68,0x60,0x5c,0x3f,0x7c,0x26,0xb5,0x75,0x41,0x0b,0xc2,0xec,0xf3,0x96,0x5b,0xbb,0x41,0x32,0x00,0x4e,0x68,0xeb,0xf1,0xd9,0x96 +.byte 0xe7,0x00,0xac,0xb0,0x1b,0x39,0x46,0xf1,0xc9,0x18,0x7d,0xb7,0xc4,0x42,0xbc,0x8b,0x09,0x3e,0xa9,0x97,0x2e,0xc6,0xf8,0x38,0xa3,0xe4,0x2c,0x52,0x5d,0x24,0xf7,0xc5,0x15,0xab,0x16,0x5e,0x46,0x2c,0xd8,0xd7,0x4d,0xb3,0xf2,0xfd,0xe4,0x75,0x3c,0x34,0x95,0xb9,0x8c,0x92,0x35,0x42,0x8b,0xc4,0xc8,0x6c,0xd4,0x1e,0x67,0x35,0xd3,0x6d +.byte 0x79,0x85,0xff,0x74,0xbe,0x40,0x07,0x27,0x75,0x2c,0xea,0x04,0xcc,0xa2,0x72,0x80,0x97,0x5f,0xfe,0x8a,0x56,0x0f,0xf4,0x6d,0xa4,0x61,0x04,0x4b,0x5e,0xb4,0xe2,0xd8,0x87,0xb6,0xfd,0x3d,0x00,0x8a,0xa9,0xe4,0x62,0x5f,0x4f,0xec,0x1e,0x40,0x28,0x6b,0x21,0x0f,0x50,0x26,0x97,0xa0,0x25,0x8f,0x3e,0xf2,0x69,0xdc,0x36,0xe5,0xb8,0xdb +.byte 0x01,0x7d,0xfb,0x73,0x7d,0x3e,0xf7,0x55,0x41,0x39,0xe0,0x33,0x0d,0xe3,0x4b,0x6b,0x7b,0x3e,0x6e,0xdc,0x7d,0x9a,0x6e,0x35,0xb0,0x38,0x13,0x92,0x80,0xa1,0xe6,0xbf,0x03,0x9d,0xb7,0x7f,0x55,0xce,0x46,0x3c,0x22,0xc7,0xfa,0xfb,0x18,0xba,0x06,0xa0,0x09,0x78,0x3f,0xc0,0x79,0x5f,0xe6,0x6a,0x29,0xaf,0xd1,0xc7,0x84,0xa7,0xed,0xb9 +.byte 0xb6,0x82,0x81,0xc1,0x53,0xee,0x00,0x34,0xa8,0x81,0xdf,0x5a,0xd3,0x07,0x7e,0x2e,0x17,0x40,0xa1,0x2b,0xf4,0x2a,0x1f,0x9a,0x67,0x75,0x73,0xa8,0x58,0x65,0x17,0xdf,0xf1,0x84,0x76,0xc5,0x8d,0x48,0x93,0xe1,0x28,0xa5,0x73,0x10,0x6e,0x9e,0x39,0x03,0x69,0x52,0xdf,0xf9,0x46,0x7c,0x5b,0xf3,0x5b,0x9a,0x63,0xd9,0x4f,0xf5,0x8e,0x73 +.byte 0xed,0x33,0x7d,0x23,0xb9,0x6c,0x3c,0x9b,0xa7,0xcf,0x7f,0x34,0x6f,0x97,0xe2,0xfe,0x0a,0x8b,0xe1,0x86,0x83,0x91,0x2e,0xdd,0x6b,0xb1,0xbf,0xa6,0x92,0x4f,0x30,0x79,0x68,0x91,0x3e,0x06,0x17,0xe9,0x0b,0x25,0x07,0xa6,0x88,0x91,0x6c,0x6e,0xc8,0xd8,0xdc,0x68,0x5e,0x45,0xf2,0x55,0xef,0x56,0x38,0x29,0xd0,0x89,0x40,0x58,0x51,0x9f +.byte 0x5f,0xa4,0x08,0xc6,0x94,0x34,0xd2,0x6f,0x59,0x0f,0x6e,0xca,0x85,0x7f,0x56,0x3f,0xac,0x8f,0x25,0x0f,0x47,0xe3,0x9e,0x40,0xed,0xd8,0xae,0x30,0x0d,0xb4,0x47,0x40,0x4b,0xa3,0x23,0x1b,0x7f,0x0f,0xff,0xdf,0x6f,0x1d,0x87,0xb2,0x94,0xa0,0x36,0xbb,0x53,0x13,0x1e,0xaf,0x92,0xf8,0x07,0x95,0xc7,0xe4,0xa8,0x41,0xa9,0xed,0xf0,0x08 +.byte 0xfc,0xc1,0x4a,0xed,0x9a,0x4f,0x13,0xc5,0xed,0x8a,0x95,0xf5,0x69,0xf7,0xee,0x75,0xb6,0x4d,0xba,0x8f,0x65,0x23,0xe8,0x50,0x9e,0x7a,0xd7,0x28,0x3a,0x49,0xe7,0x4c,0x7c,0xc6,0x64,0xbd,0x8c,0x17,0x14,0x0b,0xb5,0xe3,0xb4,0xab,0x0b,0x9a,0xa9,0x29,0x84,0xaa,0xba,0x69,0xc4,0x2e,0xbf,0xca,0x57,0x0d,0xd3,0x36,0x21,0x61,0x00,0x13 +.byte 0x95,0xe3,0xf8,0xa6,0x64,0x74,0x02,0xb5,0xbf,0x86,0x07,0xde,0x67,0x48,0x23,0xe0,0x24,0x96,0x3a,0x86,0xb2,0xfa,0xa7,0x75,0xb4,0x26,0x42,0xcb,0x96,0x4e,0xf7,0x90,0xae,0xa5,0xe4,0xd0,0x45,0x31,0xe7,0x0f,0xe0,0xcb,0xbf,0x94,0x94,0x33,0x4f,0x65,0x04,0xfb,0xc0,0xc4,0x3f,0x51,0xa5,0xf3,0xea,0xc8,0xd5,0x23,0x66,0xe0,0x48,0x09 +.byte 0xba,0x6a,0x27,0x50,0xec,0xae,0xd2,0x2a,0xe6,0xf9,0xe4,0xde,0x35,0x6e,0xcc,0x82,0x76,0xfc,0x36,0x16,0xe1,0x9f,0xc7,0x0d,0xc1,0xc9,0x6a,0x23,0xbe,0xa1,0x3c,0xfd,0xce,0xa7,0x2e,0x91,0x36,0x23,0x5a,0x20,0xdf,0x55,0xc5,0x91,0x32,0x5c,0x62,0x49,0xe7,0x8b,0x0b,0x0e,0x9c,0x2e,0xee,0x1f,0xfe,0xca,0x00,0xfc,0x55,0xd7,0x9c,0x0a +.byte 0x75,0xaa,0xb0,0x46,0x90,0x55,0x2b,0x46,0xab,0x98,0x9d,0xab,0x0e,0x12,0x03,0x58,0xf1,0x4a,0x68,0x59,0x74,0xc9,0x37,0x6d,0x6f,0xe6,0xd3,0x73,0xf1,0xa3,0xdd,0xbe,0x85,0xca,0x74,0xc6,0xb6,0x51,0x6f,0x83,0x6f,0xa1,0x80,0x00,0x00,0x78,0x0a,0xa7,0xff,0xa7,0xe2,0x2e,0x5f,0x4f,0x31,0xbb,0x1b,0x99,0x21,0x33,0x59,0x6e,0x03,0x38 +.byte 0x10,0xd9,0x98,0xf2,0x0c,0xad,0x08,0x6b,0x00,0x49,0xb5,0x5e,0x11,0x60,0x70,0x49,0xff,0x79,0xac,0xba,0x30,0x3d,0x69,0x9f,0xaf,0xfb,0xd7,0xeb,0xe2,0xcd,0x0d,0x97,0xb9,0x94,0xc8,0x6e,0x06,0x3b,0x64,0x80,0x71,0x8f,0x81,0xb0,0x58,0xe0,0xc7,0xbd,0x27,0x6a,0xd4,0xb7,0xd9,0x6c,0xc1,0x44,0x38,0xe1,0x36,0xbc,0x0a,0x33,0x26,0x01 +.byte 0x25,0x90,0xbc,0x0a,0xc2,0xa3,0xbb,0xfc,0xeb,0x0b,0x1a,0x38,0x98,0x26,0x93,0xf5,0x2d,0x29,0x41,0x83,0x3b,0xba,0x40,0x46,0xf3,0xf6,0xfd,0x53,0xb9,0x7a,0x60,0x01,0x8a,0x8d,0xb4,0x57,0xd8,0xf3,0x36,0x72,0x22,0x2f,0x59,0xd3,0x7f,0x25,0xf2,0x05,0x61,0xfa,0x18,0x28,0xac,0xd5,0x14,0x00,0xaf,0x8b,0x7c,0x39,0xb5,0xa2,0xcb,0x1e +.byte 0x62,0x14,0xcb,0x10,0x76,0x17,0x23,0x2c,0xc8,0x25,0xac,0x37,0x9e,0x83,0x81,0x83,0xfe,0x2e,0x2c,0xd2,0x3f,0xf8,0x58,0x2b,0xf1,0x7f,0x4f,0xe1,0x17,0xc7,0xf7,0xad,0x57,0x67,0xc2,0x57,0x77,0x2e,0xfb,0xf2,0xce,0xa9,0x74,0x81,0x47,0xf8,0x5a,0x88,0x76,0xb1,0x43,0x75,0xc8,0xc4,0xc8,0x60,0x1e,0xd7,0xd1,0x1c,0xce,0x89,0x82,0xc6 +.byte 0x77,0x8d,0x87,0xe8,0xd0,0x5b,0x0c,0xf0,0x44,0x48,0x8d,0xee,0x55,0xc6,0xe4,0x2c,0x2c,0x41,0x75,0x5d,0x5a,0xd2,0xa3,0x1d,0x32,0x85,0x08,0xcf,0x03,0x3a,0x3c,0xfe,0x65,0x75,0xef,0xd2,0xa6,0x22,0x16,0x66,0x39,0x30,0x05,0xe3,0x57,0xab,0x71,0x6d,0x28,0xd5,0x2f,0xc6,0xa8,0x25,0x46,0x14,0xfd,0x7e,0xa2,0x67,0x7e,0x20,0x91,0xc2 +.byte 0x2b,0x03,0xdd,0xac,0xaa,0x1a,0xb5,0x2a,0x04,0xd6,0x15,0x9d,0x3f,0x54,0x24,0x7c,0x75,0xab,0x77,0xd9,0x6c,0x85,0xa2,0xf9,0x33,0xeb,0xeb,0xc0,0x27,0xcd,0x9d,0x58,0xae,0xa3,0x34,0x10,0xae,0x85,0x7d,0x4c,0x15,0x4c,0x90,0x46,0xe0,0x5b,0xec,0xa7,0xb2,0x68,0x85,0x01,0xed,0xf9,0x4a,0x85,0xe3,0xb6,0xea,0xe2,0x53,0xc0,0x32,0x83 +.byte 0x73,0x05,0x77,0xac,0xb5,0x96,0xaa,0xf0,0x9c,0x2c,0xa4,0xd2,0xd4,0xbf,0x74,0x2f,0x39,0x47,0x22,0x99,0x50,0x06,0x5f,0xcb,0x99,0xc5,0xc9,0x2e,0x70,0xd6,0x68,0x6a,0xc4,0x73,0x41,0xcb,0x8b,0xfd,0x23,0x98,0x11,0x59,0xad,0x20,0x8a,0x0d,0xaf,0xaa,0xd0,0xe2,0xeb,0x32,0x8b,0x6f,0x0e,0x43,0x12,0xe3,0x27,0x8f,0xf6,0xa4,0x76,0x0b +.byte 0xfb,0x22,0xad,0xda,0x1c,0x0a,0x3e,0x90,0xc0,0x7d,0xf3,0x09,0xbc,0x17,0x33,0xef,0xf1,0xf2,0x84,0x80,0x2a,0x0b,0x82,0xd7,0x95,0xc7,0xd2,0x08,0x4a,0xf4,0xf5,0x6d,0x09,0x06,0x8e,0xe4,0x74,0x63,0x8f,0x09,0xca,0xe2,0xd9,0x0e,0x1e,0x03,0x20,0x1b,0x4c,0xfb,0x1d,0x5a,0x2e,0x28,0xeb,0x84,0x82,0x6f,0x97,0x6f,0xcd,0x7a,0xc3,0xa7 +.byte 0x79,0x73,0x66,0x0c,0x94,0xd5,0xf4,0x8f,0x2c,0x73,0x1f,0x24,0xbc,0x17,0xee,0xd5,0xb0,0xa6,0xb8,0x04,0x6d,0x6a,0xd0,0x61,0xe3,0x1a,0x49,0x97,0x94,0xc5,0x8e,0xbc,0xac,0x5b,0x0b,0x0a,0xc5,0x74,0x06,0x89,0xee,0xc2,0xb7,0x5f,0x1b,0xa1,0x6b,0x1a,0xff,0xed,0xda,0x90,0x91,0xc1,0x0d,0x6a,0x06,0xd6,0xcb,0x02,0x71,0x17,0x95,0x7d +.byte 0xc6,0x3b,0x7e,0x6b,0xc8,0x73,0x03,0x0d,0x6b,0x8f,0x73,0x56,0x59,0x2e,0x09,0x23,0x4e,0xda,0xfc,0x4e,0xfc,0xa4,0x42,0x15,0x2e,0x10,0x6a,0x97,0x48,0x3c,0xb4,0xa4,0x0c,0x64,0x21,0xc3,0xeb,0x6c,0xac,0x27,0x4f,0x43,0x94,0x91,0x78,0xdc,0xfd,0xad,0x2b,0xa7,0x43,0x42,0xb0,0x51,0xdd,0x63,0xcc,0xcd,0xb7,0x15,0xfa,0x13,0x8d,0xc7 +.byte 0x55,0x3a,0x74,0x17,0x23,0x36,0x3e,0x23,0xe1,0x42,0x90,0xe1,0xb7,0xc7,0xda,0xb7,0x57,0xeb,0xc3,0xfb,0x62,0x58,0xbf,0x31,0x2a,0xfb,0xc7,0xdb,0x3d,0xfc,0x87,0x32,0xb1,0x3e,0xe5,0x3d,0x94,0x3d,0x86,0x32,0x61,0xfe,0x19,0xd2,0x32,0x31,0x8b,0x43,0xdb,0xab,0xa4,0xe5,0x34,0xc8,0x30,0xae,0x8c,0x02,0x53,0x99,0x35,0xb4,0x56,0x38 +.byte 0x37,0xcf,0xff,0xb0,0x05,0x21,0x12,0x65,0xc4,0xb3,0x9c,0x83,0x95,0x12,0xd3,0x03,0x7a,0x80,0x97,0x5b,0x67,0x33,0x27,0xfc,0x43,0xf2,0xf7,0xaa,0x60,0xb6,0xfc,0x55,0x44,0x30,0xa3,0x4a,0xa3,0x60,0x31,0xf7,0x01,0xfa,0xb0,0x8d,0x82,0x29,0xa7,0x03,0xb7,0x7e,0x3f,0xe5,0x66,0x26,0xb7,0x51,0xcf,0x8d,0xdd,0x6f,0x83,0x39,0xfc,0x9b +.byte 0xa5,0x3d,0xb6,0x41,0x89,0x54,0xc3,0xb2,0xf0,0x24,0x64,0xcb,0x53,0xfd,0x0a,0x91,0x6c,0x6f,0x28,0xfe,0xc1,0xe9,0x17,0x2e,0x65,0x55,0x2e,0xf2,0x48,0x52,0xb1,0x69,0xf0,0xdd,0x42,0xd5,0xdf,0x7c,0x36,0x75,0xdb,0x5b,0x3d,0xa9,0x6d,0xa4,0xeb,0x47,0x4f,0x2b,0x5c,0xd0,0x30,0xee,0xa7,0x74,0x6a,0x64,0x8a,0xbc,0x9b,0xe5,0x82,0x56 +.byte 0x76,0xe4,0x3f,0xf5,0x05,0x59,0x19,0x1e,0x80,0x47,0xf1,0x77,0xac,0x32,0x43,0x80,0x0a,0x1b,0x28,0xb6,0xf4,0xe8,0x7c,0x2f,0xeb,0xa8,0x4b,0x6a,0x59,0xb5,0xf8,0x77,0x68,0xd4,0x86,0x6c,0x87,0xdc,0xc4,0x00,0x4f,0xce,0xdb,0xf6,0x34,0xc3,0x74,0x02,0x08,0xdb,0x0d,0x34,0x8d,0xea,0x49,0x4a,0x30,0x5f,0x1b,0xcd,0xa6,0x3a,0x34,0x94 +.byte 0x5f,0x32,0x6a,0x62,0x96,0x4b,0x51,0x89,0x30,0xc9,0x90,0xdf,0x77,0x73,0x0e,0x3c,0x5c,0xbd,0x5c,0xee,0xd9,0x77,0xea,0x23,0x42,0xaa,0xa5,0x6b,0xf9,0x8c,0xc4,0x70,0x68,0xdd,0x0b,0x65,0xa3,0xc7,0xe4,0x7b,0x0a,0x89,0x85,0x25,0x7d,0x84,0x99,0x39,0xe6,0xb8,0xbe,0x7f,0x31,0x0f,0x84,0x0c,0x98,0x72,0xab,0x4c,0x44,0xb0,0xa4,0x83 +.byte 0x90,0xbb,0x93,0x73,0x07,0x07,0xba,0x63,0x5b,0x61,0x70,0xe1,0x84,0xae,0xaa,0xd6,0xa3,0x5a,0x54,0xd1,0xea,0xc7,0x2c,0x7b,0x67,0x4b,0x8a,0x7f,0x66,0x28,0x8d,0x22,0xec,0x82,0x64,0x69,0x63,0xf0,0x53,0x2d,0x10,0x9c,0x9c,0x34,0x4f,0xc6,0x96,0x40,0xdb,0xce,0x0e,0xf7,0x3a,0x8a,0xee,0x3f,0x32,0x5f,0x2b,0x0c,0x4a,0xbc,0x63,0xfb +.byte 0x18,0xf6,0x26,0x57,0xc9,0x13,0x13,0xb7,0xe0,0xcc,0x3e,0x4e,0x73,0xfa,0xe2,0x54,0xc1,0x67,0xfe,0xe2,0xec,0xfd,0xaf,0xf9,0x96,0x99,0x9f,0xe9,0xe2,0xd0,0x94,0x39,0x33,0xc9,0xca,0x35,0x27,0xad,0x58,0x46,0x98,0x64,0x17,0x5f,0xe9,0xce,0x4b,0xc8,0xab,0x0d,0xd2,0x88,0xec,0xbb,0x5c,0xba,0xc1,0x30,0x4c,0xd4,0x99,0x0d,0x07,0x95 +.byte 0x0a,0xa5,0xeb,0xa6,0x10,0x4b,0x4d,0x77,0x14,0x76,0x88,0x43,0x7f,0x6b,0x5d,0x9b,0x87,0x1d,0x6b,0x5d,0xb9,0x04,0xa9,0xc7,0x28,0x18,0x70,0xa1,0x99,0xbc,0x99,0xf5,0xf1,0x71,0xa9,0x3a,0xb6,0xe5,0x98,0x98,0x8f,0x7a,0x6c,0xda,0x1a,0x63,0x0e,0xf1,0xe8,0x10,0xa3,0x7c,0x64,0x7e,0xde,0x2a,0x59,0x1b,0x04,0xca,0x69,0x8e,0xba,0x2f +.byte 0x56,0xe1,0xa7,0xab,0x4f,0xe4,0x9d,0x49,0x33,0x9e,0x4e,0x5b,0xe1,0x58,0xc4,0x3f,0x99,0x5a,0x69,0x00,0xe5,0x5f,0x85,0xcb,0x62,0x80,0x5e,0x3d,0x88,0x0a,0x32,0x42,0xc1,0xf9,0x6a,0xa0,0xeb,0x65,0x2f,0x17,0x62,0x25,0x96,0x50,0xa2,0x6e,0xd6,0xdf,0x09,0xb7,0x1e,0x68,0xb2,0x10,0x2b,0xf3,0x9e,0xb2,0x67,0x75,0x9b,0xe3,0x76,0xfe +.byte 0x95,0xbe,0x83,0xcb,0xba,0x77,0x5b,0x2d,0x5f,0xdd,0x94,0xbb,0x0e,0x5d,0x83,0xa2,0xe7,0x48,0x4c,0x84,0x86,0x41,0x47,0x4b,0x96,0x24,0x89,0xa8,0x20,0x04,0xa5,0xef,0x8e,0xb6,0xeb,0xcd,0x3c,0x77,0xc5,0x65,0x5c,0xff,0xa6,0x0d,0x2b,0x58,0x21,0x5a,0x11,0xe2,0x24,0x64,0x1c,0xd6,0x18,0x9a,0xac,0x3f,0x42,0x0e,0xeb,0x32,0x3e,0xed +.byte 0xce,0x61,0xc9,0xe4,0xe7,0xd3,0x3f,0x53,0xa4,0x80,0x2b,0x1c,0xc0,0x99,0x63,0x52,0x93,0x5e,0xdc,0x78,0xe2,0x35,0x9e,0xb2,0xb4,0x1d,0x09,0xd1,0x5c,0x1c,0x4e,0xdb,0x3a,0x5d,0x8c,0x94,0x7d,0xfe,0x63,0xf2,0xa3,0xe9,0x61,0x73,0x78,0xc1,0xd9,0x17,0x5e,0x9a,0x73,0x58,0xc3,0xe7,0xa0,0x1f,0x2a,0x62,0x15,0xf8,0xdb,0xbb,0x38,0x80 +.byte 0x57,0xd3,0x1f,0x4c,0x4a,0x20,0x30,0xa9,0x7a,0x78,0x61,0xd9,0x90,0xb7,0x4f,0xd6,0x46,0x72,0xe7,0x41,0xb2,0xbb,0xfb,0x50,0xfe,0xe1,0xba,0x3e,0x73,0x2f,0x81,0x6d,0x2b,0x0b,0x90,0xbd,0x8a,0x3b,0x23,0x88,0xa2,0x7d,0x62,0x87,0x96,0xc9,0xcc,0x66,0x28,0x89,0xa7,0x29,0x41,0xd2,0xc5,0x5b,0xdb,0xc4,0x0c,0xbb,0x19,0x4e,0xd5,0x12 +.byte 0x53,0x48,0x5c,0xf2,0x9b,0x62,0xd0,0xa3,0x77,0x40,0x85,0x12,0x2b,0x2d,0x52,0x1b,0x31,0xbd,0xe9,0x1c,0xd4,0x87,0xa4,0xd7,0xc9,0x14,0xb7,0x39,0x66,0x8c,0xfe,0x3e,0x83,0x00,0x01,0xae,0x44,0x2d,0x7d,0xa1,0xda,0x66,0xb0,0x66,0xcb,0x62,0x55,0x9f,0x92,0x80,0x4e,0x8d,0x7f,0x70,0x95,0xc2,0xf2,0x1b,0xe9,0x35,0xf8,0x42,0x04,0x65 +.byte 0xf2,0x36,0x4c,0x96,0x30,0xd3,0x47,0x9d,0xb7,0x2b,0x76,0xac,0x75,0xb5,0xb8,0xf1,0x7d,0xa2,0x36,0xef,0x9d,0xa7,0x60,0x51,0x8d,0xcf,0x00,0x3d,0xdb,0xcc,0xe9,0xe2,0xc4,0x7b,0x3a,0xeb,0x2b,0xc3,0xd8,0x0b,0xb0,0x58,0x41,0xa0,0x47,0xab,0x07,0xf5,0x7c,0x9e,0x0b,0x7a,0x16,0x8f,0xb4,0xca,0x09,0xed,0x84,0xa1,0xfa,0xdc,0x7c,0x3c +.byte 0xdd,0x2f,0xb0,0x2d,0xeb,0x93,0x28,0xf5,0x1e,0x0c,0x1a,0x0c,0x35,0x27,0x40,0xf2,0x22,0x66,0x2d,0x82,0xf2,0x94,0x03,0xa5,0x4b,0x84,0x92,0x1d,0x98,0xd5,0xd9,0x09,0x6a,0xfd,0x65,0xe5,0xa1,0x0e,0xe2,0xd9,0xb6,0xd1,0xba,0xbf,0xc7,0x42,0x22,0x39,0x83,0xbf,0x37,0xf6,0x80,0xc2,0xea,0xdf,0xb9,0x33,0xa0,0xaf,0xd7,0xe3,0x70,0x9a +.byte 0x5c,0xf8,0x1a,0x47,0x2b,0xb5,0xdd,0x15,0xe3,0x08,0xc8,0x37,0xe3,0xc2,0x25,0x87,0x0e,0x3c,0xc5,0xae,0x61,0xa4,0x4a,0x56,0x50,0x08,0x58,0x68,0xa3,0x4a,0x28,0x08,0xef,0x92,0xd5,0x13,0x50,0x09,0x76,0x34,0x47,0xae,0xa8,0x7f,0xa5,0x2b,0x13,0xb7,0x5a,0x96,0x65,0x62,0xf2,0xaa,0xb4,0x4b,0x2a,0xad,0xea,0x2c,0x0d,0x1e,0x97,0x82 +.byte 0xe4,0x6f,0xfe,0xf4,0x88,0x14,0x7b,0xba,0x45,0xbe,0x61,0x56,0xd2,0x37,0x1b,0x65,0xb8,0x0b,0x77,0xcb,0x3c,0xfe,0x9f,0xe3,0x39,0xc5,0xfb,0x2a,0x18,0x9b,0x60,0x99,0xd5,0x6f,0x52,0xfe,0xd8,0x04,0x88,0x1c,0x9a,0x50,0xe5,0x3b,0x33,0x3f,0xca,0xc5,0x5b,0x9c,0x5f,0x35,0x13,0x65,0xa6,0x21,0x78,0x19,0xeb,0xff,0x35,0x70,0x81,0xaf +.byte 0x19,0x23,0x61,0xd6,0xeb,0xff,0xa6,0x9e,0x5d,0x3f,0x7f,0x89,0x2e,0x22,0xa4,0x0b,0x9c,0x4f,0xa9,0xff,0xbb,0x23,0x29,0xa1,0xf4,0x8a,0xb7,0x4b,0xfb,0xbf,0xeb,0x0a,0x47,0x87,0x78,0x2b,0x20,0x38,0x82,0xab,0x7e,0x2c,0xdc,0x08,0x2b,0xb4,0xae,0xd8,0x64,0x44,0x1a,0xdf,0x21,0x62,0x27,0xf2,0x61,0x63,0x37,0xad,0xd4,0x06,0x4e,0xae +.byte 0xba,0xeb,0x08,0xfa,0xe5,0xad,0x5d,0xcf,0xce,0x38,0xe5,0xca,0x74,0x83,0x42,0x4b,0xe8,0x8f,0xfb,0xff,0x83,0x4d,0x27,0x88,0x43,0x62,0xdd,0x80,0xa2,0x06,0x98,0x48,0x58,0x6f,0x54,0x16,0x6f,0xbf,0x81,0x36,0xc8,0xf3,0xea,0x4b,0xf7,0x5a,0x7b,0xb7,0xf4,0xa4,0x5e,0x22,0x52,0xe7,0x9e,0xb1,0xb6,0x7a,0xa8,0x22,0xee,0x68,0x82,0x8f +.byte 0xe4,0xcb,0xad,0x71,0xef,0x53,0xf2,0x7d,0xed,0x91,0x9e,0xf6,0x90,0x9e,0x54,0x19,0x30,0xaf,0x4a,0x17,0xc0,0x6a,0x9c,0x49,0x12,0x8b,0x6f,0xc7,0x47,0x1e,0xa2,0x64,0x28,0x1f,0x0c,0xd3,0x3e,0x59,0x66,0x8c,0x2e,0x11,0x52,0x6c,0x69,0x66,0x10,0xfb,0x27,0xe6,0x1c,0xae,0x6f,0x44,0x87,0x86,0x0d,0x3e,0xd3,0xa0,0x80,0xef,0x30,0xb9 +.byte 0xb8,0xd7,0x47,0x84,0x68,0x2b,0xf2,0x32,0x7b,0x89,0x93,0xd2,0x83,0x56,0x35,0xc3,0xbf,0x5c,0x24,0xec,0xad,0x2d,0xa4,0x49,0x63,0x89,0xc6,0xf9,0x24,0x51,0x1c,0x9b,0xd1,0xcb,0x30,0x82,0xda,0xb3,0xa7,0xe1,0x4d,0x96,0xd0,0x44,0x44,0x1d,0x4e,0xd7,0x7d,0x7a,0x51,0x2e,0x2f,0xc4,0x9f,0xdb,0x06,0x53,0xfc,0x51,0x56,0xe5,0xb9,0x6b +.byte 0x4a,0x2c,0x3e,0x62,0xc5,0x9c,0x42,0xe3,0xaf,0x3a,0x0f,0x0e,0x74,0x29,0x66,0x70,0x75,0x2a,0x06,0xd4,0x0f,0x0c,0xfd,0xea,0xcc,0x39,0xd0,0xa7,0x47,0x75,0x92,0x44,0x09,0xa2,0x3c,0x4e,0xad,0xaa,0xc4,0xc6,0xf9,0x35,0x82,0x23,0x25,0x43,0x94,0x26,0x14,0xde,0xf1,0xb9,0xb8,0xe0,0x75,0xe0,0x48,0x70,0x8a,0xc6,0x3c,0x72,0x98,0x72 +.byte 0x8b,0x15,0x58,0x17,0x73,0x29,0x67,0x21,0x56,0xc4,0x25,0x17,0x68,0xbe,0xd7,0x36,0x05,0x4b,0x58,0xa2,0x1b,0x64,0xe5,0x11,0x96,0x5a,0x3b,0xa6,0x90,0xb6,0x2d,0x7e,0x55,0xbb,0x31,0x93,0xe7,0xcc,0x2e,0x74,0xb6,0x9b,0x4d,0x04,0xc5,0x45,0x9b,0x0b,0x26,0xef,0x61,0x23,0x3d,0x7e,0xee,0x01,0x57,0xfa,0x77,0x12,0x47,0x64,0xac,0x8f +.byte 0x25,0xbe,0x8e,0x2e,0x68,0x11,0x95,0xf0,0x1a,0xd2,0x3d,0x66,0xc1,0xdb,0x97,0x9e,0xbb,0xba,0xc1,0x66,0xa4,0xb5,0x71,0x01,0xee,0xf5,0xbb,0x1e,0x9f,0x41,0xfc,0x40,0x74,0x26,0xf7,0xc6,0x2c,0x9c,0x1c,0x59,0xce,0xcf,0x18,0x17,0x81,0x5d,0xd4,0xe3,0xd8,0x46,0x62,0x9e,0x97,0xb1,0xca,0xac,0x01,0x3e,0xf8,0x96,0xa2,0xee,0xe0,0xf8 +.byte 0xf3,0x2d,0xe9,0xd2,0x1f,0x9f,0x41,0xbb,0x2f,0xe5,0x64,0x6d,0x5b,0xe7,0x47,0x0e,0x83,0x7b,0x08,0x5e,0x29,0x35,0x2f,0x75,0x31,0x44,0x4c,0xb7,0x61,0xa4,0x03,0x2e,0x15,0x94,0x7a,0xa0,0x46,0x31,0x7b,0x43,0xd9,0x14,0xa3,0x34,0x0c,0x83,0x93,0x75,0x8e,0x3a,0x1c,0xc3,0xe1,0x36,0x18,0x96,0x7a,0xfb,0x77,0xad,0xbb,0xe9,0x0d,0x4b +.byte 0x21,0x04,0x2e,0xdd,0x7a,0x63,0xc9,0x60,0xb1,0x9b,0xad,0xde,0x1f,0x65,0x8a,0x58,0x18,0x84,0x95,0xa9,0xac,0x3a,0xac,0xcb,0xb7,0xa9,0xeb,0x0c,0x7c,0x3a,0x98,0x9a,0x3f,0x56,0x23,0x51,0x58,0x59,0x4e,0xf5,0x57,0x60,0xe6,0x9d,0xf8,0xf7,0xed,0x9d,0x81,0x14,0x68,0xbe,0xaf,0x19,0xe5,0xb5,0x9b,0x5f,0xe4,0x51,0x44,0x4b,0x23,0x42 +.byte 0xdd,0x92,0x1a,0xe5,0x7e,0xef,0x77,0xbe,0x88,0x77,0x1e,0x8a,0xbd,0x2a,0x77,0xb1,0x0d,0x1b,0xe3,0x8a,0x7f,0x15,0x71,0x93,0xc9,0x5f,0x78,0x2d,0x77,0x9b,0x0c,0xad,0x76,0x3c,0x6b,0xe2,0x15,0x8e,0xe1,0x5e,0x1d,0x90,0xa5,0xd6,0xc7,0x55,0x5d,0x52,0xf7,0xcc,0x82,0x9b,0xdc,0x1d,0x80,0xa4,0xc7,0xbe,0x7c,0x4f,0xda,0x81,0x91,0x78 +.byte 0x88,0x0e,0x31,0xde,0x87,0x4c,0xdc,0x84,0x9a,0x65,0x89,0xfa,0x22,0x3e,0xde,0x3b,0x7f,0x7f,0x9b,0x3f,0x3e,0xda,0x13,0x31,0x59,0x7b,0x08,0x48,0x39,0x37,0xfd,0x1a,0x4f,0xa3,0x12,0xba,0xe5,0xd6,0xfa,0xa3,0x59,0x0b,0x3b,0x7d,0xde,0xc0,0x51,0xce,0x92,0x6b,0x3d,0x4b,0xd2,0xa4,0x68,0xc2,0x32,0x2d,0x01,0xbd,0x66,0x98,0x8f,0xa0 +.byte 0x86,0xfb,0x08,0x36,0xa9,0xd4,0x3b,0x7b,0x01,0x2d,0xaa,0x8c,0x64,0x19,0xa6,0x62,0x24,0x92,0x5e,0xc5,0x02,0x17,0x8e,0xf0,0x88,0xe9,0xd1,0x8b,0x69,0xda,0xed,0x9c,0x60,0x32,0xab,0xc0,0xbc,0x84,0x64,0x6e,0x32,0xb2,0xcd,0x24,0xf6,0xb2,0x9d,0xf5,0xf5,0x71,0xe2,0x01,0xbc,0x77,0x6a,0x5b,0x26,0x56,0xf7,0x04,0x84,0xff,0x7c,0xa4 +.byte 0xe8,0xa8,0x82,0x6c,0x40,0x24,0x93,0x3c,0x6e,0x7d,0x0d,0x22,0xd0,0xe4,0xef,0xc4,0x4e,0x26,0x66,0x61,0x75,0xe9,0x06,0x69,0x06,0xfd,0x97,0x68,0x96,0x67,0xec,0x96,0x09,0x73,0xe4,0x0a,0x3e,0xaa,0xb8,0x25,0x77,0x00,0x91,0x7a,0x2e,0xc8,0x81,0x75,0x78,0xb7,0xa5,0x27,0x55,0xf2,0xcf,0x9a,0xab,0xab,0x51,0x0a,0x65,0x47,0xbf,0x10 +.byte 0xd2,0x19,0x78,0x6b,0x35,0xf4,0xef,0x12,0x2b,0x5f,0x0c,0x28,0x7c,0xe8,0x64,0x55,0x2f,0x26,0x85,0x91,0x7a,0x9d,0x48,0x76,0x12,0x14,0x2d,0x4a,0x8a,0xd6,0xfa,0x7b,0xf9,0xc7,0x24,0x45,0xf6,0xbd,0x47,0xab,0xc6,0x4b,0x9e,0x39,0x77,0x57,0x04,0xa8,0x4d,0x43,0x99,0x5c,0xb1,0x3d,0xc2,0x4e,0xc5,0x17,0x66,0xc4,0xb6,0xdd,0x92,0x80 +.byte 0x85,0x3b,0x07,0x63,0x16,0x5f,0x67,0x76,0x9b,0xb5,0x8e,0xca,0x97,0xbb,0xf4,0x20,0xd0,0x4d,0x7b,0xd0,0xa3,0x74,0x6f,0x8a,0x68,0xc7,0x31,0x78,0x1b,0x72,0x45,0xa4,0xc4,0xf8,0xf8,0x26,0xa8,0x4d,0x08,0x2f,0x7b,0x3d,0xa0,0x2a,0xb5,0x65,0x27,0xc2,0x36,0x13,0x2d,0x8d,0x83,0xeb,0xf4,0x08,0x26,0x41,0x8b,0x32,0xf3,0x09,0x70,0x70 +.byte 0x5d,0x8a,0xcc,0xb8,0xe9,0xf7,0x08,0xdf,0x5f,0x4a,0xb8,0x8a,0xb7,0x1b,0xad,0xe2,0xc3,0x39,0x59,0xe0,0x7f,0xd0,0x66,0x7b,0x99,0x5a,0xde,0x52,0xe2,0x1f,0x47,0xc2,0x63,0x74,0x7a,0xa5,0x88,0xc3,0x24,0x70,0x4a,0x7d,0xdd,0xa4,0xe6,0xf8,0xfd,0x5c,0xfa,0x8c,0x4c,0x0f,0x52,0x95,0xf3,0x2c,0x76,0x47,0x7a,0xe8,0xdb,0xe0,0x9b,0x49 +.byte 0x88,0x5b,0x87,0x5a,0xd1,0x07,0x24,0x06,0x83,0x3b,0x25,0x23,0xe7,0xaa,0x79,0xef,0x74,0x02,0x12,0xfe,0x47,0x5c,0x77,0x73,0xf7,0x2e,0x4b,0x58,0x3b,0x60,0x7b,0x91,0x2f,0x0d,0xb4,0x6d,0x00,0x80,0x19,0xaa,0x88,0xbc,0xb2,0x7b,0xd9,0xb7,0xdd,0x32,0x47,0x62,0xf5,0x0f,0x46,0x95,0x4c,0x6c,0x01,0x67,0xfb,0xe4,0x2b,0xac,0x95,0x84 +.byte 0x25,0x0a,0xe5,0x4c,0x2d,0x4a,0x6e,0x77,0xfd,0xeb,0xe1,0x53,0xc9,0x2e,0x70,0x01,0x32,0x05,0x6d,0xc5,0xc9,0x5d,0x90,0xca,0x56,0xd1,0xd8,0x40,0x2a,0x51,0x4d,0x95,0xc3,0x57,0x8b,0xdd,0x62,0x9c,0x69,0xd1,0x03,0x89,0x95,0x38,0x2c,0xc1,0x6d,0x41,0xf2,0xc3,0xa2,0x9c,0x43,0xea,0xf1,0x02,0x00,0x56,0x46,0xbb,0x87,0x35,0x40,0x0e +.byte 0x18,0x51,0x29,0x39,0xbb,0x6d,0x15,0xf2,0xcd,0x54,0x23,0x95,0x69,0xdc,0x0a,0xb2,0x26,0xd9,0x25,0xe1,0xf1,0x07,0x7b,0x5e,0xc3,0x30,0x68,0x5f,0x2a,0xce,0x91,0x92,0x03,0x0c,0x62,0x11,0x43,0x80,0xe5,0x12,0xec,0xe3,0x4f,0x90,0xfe,0x38,0x6e,0xe9,0x7e,0x94,0x83,0x26,0x59,0x3f,0x3f,0x81,0xc6,0x94,0x98,0x09,0x80,0xff,0x01,0x44 +.byte 0xff,0x77,0x6a,0x4c,0x76,0x91,0xd9,0x12,0x59,0x9a,0x00,0x7c,0x87,0x06,0x17,0xf7,0x12,0xc7,0xee,0x04,0xd5,0x8d,0x68,0xc5,0x8d,0x80,0x10,0xcc,0x14,0x45,0xe8,0xd7,0x43,0x10,0x01,0x9e,0x61,0xc2,0xc0,0x66,0xfe,0xcf,0x5f,0x9f,0xcb,0xa3,0xf8,0xc7,0x07,0x41,0xe3,0xf2,0xda,0x6e,0x01,0x76,0xc6,0x49,0x49,0x01,0xc7,0xcf,0x6a,0x20 +.byte 0x71,0xc5,0xf0,0xb1,0xa0,0xc9,0xed,0xec,0x66,0x71,0x93,0xf5,0xc0,0x27,0x42,0xed,0xd5,0x6f,0x20,0xe1,0x86,0x3e,0xd0,0x5d,0x94,0x17,0x43,0xb4,0x98,0x0d,0x8a,0x31,0x6c,0x59,0xa9,0x0b,0xb3,0xa4,0x0b,0x46,0x0b,0xa8,0x79,0x62,0x3a,0x3d,0xbf,0xef,0x94,0xd3,0x31,0xf2,0xa1,0x55,0xe8,0x92,0x44,0x37,0x62,0x82,0x1b,0x60,0x87,0x67 +.byte 0x85,0x78,0xd5,0x84,0x73,0xa4,0xea,0x56,0x08,0x78,0x68,0x7f,0xfb,0x15,0x20,0x64,0xeb,0x6c,0xf7,0x5e,0xc0,0x79,0x83,0x59,0x7b,0xed,0x2d,0xa9,0x37,0x46,0xf3,0x62,0xb1,0xa1,0x2b,0x48,0x58,0xd9,0x0c,0x03,0xf7,0xf3,0x47,0xeb,0xd7,0x03,0x9b,0x85,0xd3,0xd7,0xd7,0x7e,0xfb,0x1a,0x25,0x83,0xda,0x06,0xa0,0x04,0x0d,0x6b,0x90,0x29 +.byte 0x2a,0xfc,0xcd,0x96,0xe9,0x17,0x4f,0xdd,0x2c,0x90,0xdf,0xf1,0xe3,0x08,0x0a,0xb8,0x0c,0x59,0x2a,0x83,0x62,0x94,0x00,0xd3,0x80,0x1a,0x31,0xd7,0x17,0x70,0xc7,0xa2,0x20,0x17,0x65,0x88,0xae,0x11,0x25,0xc9,0xba,0x76,0xa7,0x61,0x60,0xd1,0x59,0x50,0x22,0xdd,0xaa,0xcf,0x9d,0xc1,0x36,0x7d,0xf9,0x7b,0x69,0xc0,0x98,0xba,0x40,0xd5 +.byte 0xd6,0x46,0x93,0x92,0x7d,0x37,0x3f,0x3a,0x04,0x9a,0x84,0xaf,0x8e,0x61,0x04,0x26,0x54,0x33,0x84,0xc0,0xac,0x21,0x51,0xd7,0x9a,0x93,0x6e,0xf2,0x09,0x87,0xc5,0x35,0xa8,0x96,0xb0,0x64,0x90,0x35,0x52,0xed,0x0e,0xbc,0xdb,0xa6,0x06,0x3e,0xe7,0xea,0x57,0x4b,0xd7,0xc5,0x1c,0x76,0x3d,0x0d,0xc3,0x1f,0x8e,0x4f,0x12,0xdb,0x3a,0x21 +.byte 0x2a,0x69,0xc2,0x94,0xda,0x4c,0x91,0xcc,0xa8,0x36,0x89,0xd7,0x78,0xa8,0x74,0x79,0x63,0x92,0xeb,0x39,0x3b,0x84,0x8c,0xe5,0xc6,0x26,0xf0,0xef,0xcc,0xc1,0x72,0x4b,0x8e,0xcd,0xe4,0xd9,0x00,0x80,0xbc,0xdf,0xe2,0x61,0x53,0x04,0x81,0xb0,0x13,0xc5,0x6c,0x77,0x74,0xa3,0x0c,0x5b,0xef,0xef,0xea,0xc7,0x5b,0xeb,0xbf,0xee,0x54,0xd7 +.byte 0x7a,0x69,0x6e,0x39,0xc2,0xed,0x08,0x44,0x82,0x08,0x16,0x8b,0xf1,0x74,0x5f,0xeb,0x60,0xd5,0x46,0x63,0x80,0x39,0xe9,0x91,0x0a,0x17,0x8b,0xd4,0x09,0xdc,0xa6,0xab,0x6a,0xbc,0xf8,0xe9,0x09,0x19,0xc1,0x83,0x9f,0xdf,0xad,0x6c,0x31,0x94,0xb9,0xc5,0x77,0x83,0xd1,0xd8,0x76,0xeb,0x12,0x3c,0x00,0x31,0xea,0xac,0x97,0x39,0x16,0xd5 +.byte 0x81,0xfa,0x6d,0x10,0x5b,0x3e,0x20,0xe1,0x88,0x5c,0x4b,0xf3,0x04,0xd4,0xc3,0xb9,0xec,0xe5,0xb0,0x13,0xf5,0x09,0x5c,0xe8,0x27,0xe2,0xde,0x9b,0xac,0x2e,0xf2,0xe5,0x2c,0x33,0x4b,0x4f,0xec,0xc7,0x08,0xf9,0xc2,0xd3,0x1b,0x4d,0x81,0x69,0x14,0xa1,0xc5,0x0f,0xb2,0x57,0x8b,0xcc,0xca,0x3b,0xc9,0x9c,0x1f,0xee,0x06,0x4d,0xc7,0x62 +.byte 0xcb,0x8f,0x49,0x81,0xfb,0xa5,0x68,0x81,0x36,0x38,0x33,0x6b,0x9e,0x58,0xd4,0x24,0x67,0xf1,0x30,0xd6,0x08,0x61,0x5a,0x7f,0x2e,0x4e,0xf1,0xd6,0x64,0x75,0x72,0xb0,0xdf,0xcd,0xae,0x04,0x41,0xbd,0x04,0x2c,0x96,0x36,0x34,0x32,0xec,0xbd,0xd0,0xbf,0x8e,0xe8,0x47,0xe3,0x22,0xdd,0x79,0x53,0xcc,0x6a,0x25,0xf1,0x5e,0x63,0x09,0x98 +.byte 0xc5,0x6d,0x0a,0xe3,0x30,0xd6,0x52,0x70,0x21,0xb2,0xef,0x15,0x66,0x4a,0x2d,0x2b,0x5c,0xcb,0x39,0x1b,0x91,0x10,0xa6,0x02,0x22,0xd0,0xcc,0x32,0x50,0x5c,0x70,0x72,0xd1,0x03,0xb3,0x2d,0x2e,0x33,0xed,0xae,0x7a,0x07,0x3f,0x70,0x38,0x35,0xfc,0xcf,0xdb,0xfe,0x7b,0x26,0xd9,0x38,0x1e,0x52,0x07,0x2f,0x72,0x81,0xcc,0xd3,0x21,0x00 +.byte 0x63,0x48,0x38,0x44,0xb8,0x35,0xf2,0x4f,0xe5,0x33,0x8c,0xb3,0x07,0x0c,0xac,0x3d,0x73,0xe8,0xe3,0xb3,0x43,0xc5,0xb4,0x32,0xf4,0x41,0xdf,0x7b,0x06,0x3a,0xb8,0x67,0x17,0xc5,0xec,0x46,0x30,0xc0,0xa4,0x29,0x40,0xe4,0x8a,0xa3,0x14,0x84,0xa6,0x84,0xc7,0x5d,0x4b,0x57,0x37,0x9c,0x42,0xe6,0xa4,0x20,0xf7,0x5d,0xef,0x21,0xe2,0x80 +.byte 0x54,0x6d,0xf5,0xb5,0xbe,0xa3,0x95,0xcf,0x98,0xf8,0x38,0x46,0xa2,0x90,0x57,0x09,0x8f,0xb0,0x6d,0x01,0x5f,0x95,0x5a,0x78,0xf6,0xfd,0x01,0x0f,0xfd,0xa5,0xe2,0xcf,0x54,0xa3,0x2b,0xc1,0x30,0xbe,0x6d,0x1a,0xd3,0xdb,0x5a,0x17,0x43,0x46,0x93,0x81,0x0c,0x85,0x04,0x13,0xda,0xb4,0xde,0x81,0x48,0x5c,0xbc,0x42,0x9e,0x6d,0x6c,0x82 +.byte 0xff,0xa5,0x51,0xb1,0xd3,0xd2,0x3d,0x82,0x82,0xb4,0x96,0xb1,0x38,0x5d,0xc9,0x55,0xcb,0x9f,0xe5,0x47,0xd4,0x52,0x0f,0x76,0x54,0xec,0x39,0xb6,0x40,0xc3,0xc5,0xaa,0xc2,0x30,0x02,0xa0,0x68,0xc3,0x22,0x63,0x5a,0x8c,0x62,0x6d,0x40,0xc5,0xde,0x06,0x29,0x44,0x5d,0x2b,0x18,0x0a,0xa5,0x43,0x47,0xfe,0x5f,0x0f,0x63,0xa4,0x3c,0xa1 +.byte 0x62,0xcb,0x70,0x1d,0xf8,0x0e,0xc9,0xbe,0x27,0x0e,0x87,0x81,0x69,0x4c,0xea,0xbe,0xf9,0x9b,0xda,0xb6,0x9b,0xd0,0xdd,0xa0,0x1e,0x60,0x38,0x88,0x85,0x25,0x53,0xee,0x2c,0x77,0x53,0x82,0xb0,0x88,0x19,0x87,0x2a,0x77,0x7b,0x37,0x4b,0x4c,0xf4,0x96,0x5f,0x73,0xa1,0xbb,0x5c,0xfc,0x7e,0xbb,0xed,0x6f,0xb7,0x6f,0x9d,0x55,0xde,0xd3 +.byte 0xac,0xb9,0x8e,0x36,0x0f,0x3d,0xea,0x87,0xcd,0x19,0x33,0x1d,0xa8,0xee,0xfc,0xcd,0xe5,0x53,0x7b,0xdf,0x37,0x49,0x2d,0x73,0xf5,0x36,0xdd,0x42,0xc6,0x88,0x0d,0xf5,0xf2,0xba,0x2e,0x81,0xed,0x88,0x27,0x8d,0xe5,0x3f,0x83,0x5e,0xde,0x63,0x8f,0x67,0x2b,0x85,0xf3,0x2a,0x9b,0x26,0x3e,0x2b,0xe2,0x29,0xc5,0x5e,0x21,0x04,0xfe,0x5b +.byte 0xb9,0xd8,0xa7,0x7b,0xdf,0xcf,0x61,0xd6,0xaf,0x9b,0x17,0xcb,0xaf,0x8f,0x71,0xb3,0xc2,0x9d,0x9a,0x55,0x1d,0x3e,0x1d,0x17,0x25,0xc8,0x44,0x71,0x29,0x2f,0xc8,0x01,0x3b,0xe4,0xc4,0x2e,0xcc,0x3b,0xdb,0x34,0xbb,0xc0,0xcc,0xb6,0x07,0xe3,0x86,0x4c,0x62,0x02,0xe8,0xc3,0x11,0x85,0x6c,0x18,0x80,0xa3,0xbd,0x02,0x30,0x68,0x36,0xa3 +.byte 0xb6,0xc6,0xbd,0x82,0x43,0x40,0xed,0xa1,0xcf,0xc5,0xce,0xe4,0x27,0x8a,0xeb,0x8c,0x59,0xea,0x4a,0x81,0xd9,0x35,0x87,0x7d,0x6d,0xb2,0x8f,0x67,0x37,0x1f,0x11,0x60,0x0d,0xed,0x34,0xd5,0xa0,0x7b,0x46,0x71,0x68,0x19,0x69,0xd3,0x65,0x1d,0x47,0xf1,0x7e,0x16,0xd8,0xec,0xbb,0x52,0xc3,0x7b,0x62,0x5a,0xb3,0x60,0x67,0x2e,0xfd,0x57 +.byte 0xf2,0xfb,0x3d,0x63,0xe6,0x82,0x20,0xff,0x31,0x90,0x1d,0x5e,0x4f,0x04,0x9a,0xf8,0xb2,0x0c,0x84,0xff,0x7d,0xe2,0xec,0x4b,0x09,0xbb,0xdf,0xae,0xc5,0xaf,0xcb,0x8b,0xb5,0x5d,0xa8,0x53,0x78,0xf9,0xb9,0x43,0x71,0xa6,0xc2,0x10,0xfa,0xad,0xda,0xba,0x46,0x13,0x72,0x97,0xef,0x6f,0xe3,0x4f,0x5f,0xf9,0xec,0x25,0xdb,0xcd,0xca,0x33 +.byte 0x7e,0x50,0x73,0x5b,0xd0,0x9f,0xea,0xd5,0xd9,0x29,0xe8,0x1b,0xc1,0xf8,0x40,0xbf,0x50,0xdb,0x8e,0x39,0x0b,0xb7,0x6c,0xf1,0x34,0x0b,0x1f,0x88,0x27,0x4b,0xea,0x1d,0xb2,0x36,0x07,0x4b,0x22,0xa9,0xd0,0xf8,0xf2,0x13,0x8e,0x97,0x9d,0xd9,0x53,0xd3,0xdc,0x63,0x40,0x11,0xc7,0x74,0x9e,0xd9,0x83,0x01,0xae,0x36,0xcb,0x35,0x9a,0x0c +.byte 0xb5,0x15,0x0a,0xf5,0x41,0xa5,0x6c,0x72,0x40,0x80,0xf0,0x15,0xc0,0x80,0x23,0x0b,0xab,0x98,0xfc,0xab,0x81,0xe0,0x8b,0x61,0x91,0x18,0xd2,0x23,0x71,0xed,0x32,0x80,0x26,0x86,0x96,0xe9,0x90,0x5e,0x43,0xd2,0x89,0x8f,0x89,0x57,0x73,0xca,0xe1,0x42,0xa9,0xa9,0xed,0xdd,0xc5,0x9f,0xf7,0x00,0x0d,0xa3,0xe5,0xc8,0x6f,0x0c,0x14,0xa4 +.byte 0x9d,0x5a,0x14,0xaf,0x96,0x3a,0xb2,0x64,0xa7,0xac,0x20,0xa9,0x01,0x4c,0xec,0x64,0xc6,0x9b,0xfd,0x04,0xc5,0x2e,0xe7,0xdd,0xa5,0x8e,0xe7,0xe7,0x76,0x53,0x59,0x95,0x14,0x07,0xed,0xe9,0x96,0xd0,0x2d,0xc8,0x9d,0xa2,0x11,0xe3,0x02,0x20,0x68,0x09,0x25,0x69,0x07,0x88,0xdb,0x26,0x36,0xf5,0x8e,0xc3,0xf0,0x70,0x8c,0xeb,0xe6,0xcd +.byte 0xad,0xf3,0x49,0x6e,0x8a,0x54,0xa6,0xdd,0x97,0x8e,0x37,0x28,0x3a,0x6d,0xc4,0xdd,0x99,0x85,0xf7,0x96,0x63,0xb4,0xa2,0xdf,0xff,0x81,0x17,0xa1,0x22,0xb1,0x43,0x5b,0x29,0xdb,0x92,0x91,0xc9,0xc6,0x8d,0x29,0x1d,0x6e,0xe3,0x44,0x3e,0xe4,0x20,0xd5,0xf4,0x4a,0xfa,0xae,0xf6,0x2c,0xff,0x80,0xc9,0xce,0x7f,0x13,0x1e,0xd7,0x24,0xa2 +.byte 0xb3,0x90,0xb8,0x20,0x18,0xe5,0x6c,0x0e,0xf5,0xc6,0x26,0xd6,0xe9,0xe8,0x55,0xe4,0x3f,0x49,0x13,0xe2,0xca,0xef,0x9b,0xc0,0x8f,0x24,0x50,0x37,0xef,0x21,0xff,0x79,0xb7,0x5d,0x86,0x03,0xfb,0x85,0x75,0x74,0xbf,0xc5,0x3a,0x30,0xcc,0x00,0xc3,0x0d,0x4f,0x91,0xd6,0x31,0x19,0xd6,0xcd,0x0e,0x1c,0x53,0x88,0x75,0xb8,0xf9,0x68,0x7a +.byte 0xa4,0x3e,0x8d,0xed,0xba,0x05,0xb4,0x6c,0xe0,0x45,0x9c,0x41,0x34,0x24,0x82,0xaf,0x9a,0xcf,0x9e,0xd2,0x27,0x5c,0x7f,0xb3,0xcb,0xe5,0xad,0xb4,0x8e,0x74,0x9d,0xe4,0xba,0x55,0xb3,0xd3,0x32,0xbc,0x62,0x11,0xb3,0xa4,0x82,0xf0,0xd8,0xfc,0x79,0x03,0x70,0xae,0x7f,0x7f,0xc8,0x50,0xb5,0xbe,0x47,0x14,0x31,0xd7,0x16,0x65,0x52,0x3b +.byte 0xbb,0x42,0x38,0x23,0x77,0x4d,0x38,0x0b,0x0a,0x61,0x94,0xac,0xa3,0xc9,0xd7,0x99,0x4f,0x34,0x3a,0x88,0xe8,0x1d,0x0b,0x97,0x48,0x6d,0x5c,0x61,0x4c,0x3f,0xc2,0x7c,0x6c,0x63,0x00,0xdd,0x59,0xae,0xcd,0x17,0x0a,0x21,0x27,0x98,0x15,0x23,0x6d,0x84,0x7e,0x24,0xd4,0x7f,0x1b,0x3a,0x98,0x52,0xc3,0x60,0x33,0xd6,0xc1,0xfe,0x68,0xa8 +.byte 0x49,0x3d,0x7e,0x53,0xee,0x0d,0xed,0x89,0x9a,0x9a,0xe6,0xa1,0x47,0xc7,0xba,0xf3,0x73,0x5b,0xef,0x33,0x51,0x8c,0x1f,0x84,0xa6,0xef,0x77,0x94,0x2d,0xd6,0xda,0x8f,0x85,0x8c,0xd3,0xb6,0x02,0x68,0x9e,0x57,0xb6,0xd9,0x1a,0x8c,0xb5,0xf4,0x61,0x39,0x29,0xb5,0xb7,0x0d,0x0d,0xa6,0x81,0x87,0x54,0xc0,0xca,0x67,0x09,0xca,0x20,0xf3 +.byte 0x37,0x7e,0x03,0x3e,0x31,0x8c,0x51,0x89,0x06,0x81,0xf6,0x7b,0x8b,0xe3,0x4f,0xd0,0xb8,0x0c,0x34,0x7c,0xd6,0xfc,0x25,0xf8,0x00,0xa6,0x10,0x15,0x0d,0xeb,0x22,0x72,0x03,0x79,0x1c,0x84,0x1d,0x3d,0x10,0xaf,0x43,0x6d,0xd7,0xed,0x10,0x2c,0x14,0x26,0xd4,0xa1,0xee,0x6c,0x7f,0x52,0xe4,0x83,0xcc,0x5f,0x1a,0x4b,0xd0,0xc8,0xfb,0x27 +.byte 0x17,0x2c,0xf6,0x90,0x02,0xb4,0xb0,0x63,0x7c,0x14,0xec,0x9e,0x08,0x60,0xec,0x45,0x85,0xc6,0x76,0x42,0x4f,0x1c,0x5f,0x48,0x7f,0x87,0xef,0x8c,0x04,0x23,0x3c,0xda,0x39,0xbc,0xec,0x09,0xda,0xeb,0x9b,0x72,0x7a,0xb4,0x20,0x1c,0xb2,0xdd,0x2e,0x63,0x72,0xd7,0xb1,0xfe,0x5b,0x21,0x28,0xfb,0xeb,0x45,0x31,0x89,0xe5,0x3e,0xa0,0x85 +.byte 0xa6,0x96,0xdb,0x42,0xd5,0xb4,0x27,0x78,0x10,0xa0,0xcb,0x69,0x68,0x1e,0x76,0xed,0xbc,0x3c,0xa1,0x04,0x10,0x81,0x2a,0x4f,0x52,0x78,0x1e,0xae,0x5a,0x47,0x69,0x81,0xee,0xd3,0x14,0x1a,0x68,0x19,0x75,0x92,0x72,0x47,0x61,0x70,0xcf,0x96,0x35,0xa6,0xbb,0x00,0xaf,0x3e,0x90,0x86,0x22,0x9b,0x72,0x8a,0xa1,0x05,0xe2,0xfb,0xdc,0x30 +.byte 0xd5,0xdd,0x46,0x1f,0xf6,0x33,0x43,0xd1,0x59,0xc4,0x93,0x89,0x36,0x6a,0x7b,0x76,0xa7,0x40,0x6c,0xb1,0x9c,0xce,0x3a,0x8c,0xb6,0xd5,0xd1,0x0a,0x78,0xf6,0x08,0xfb,0xf5,0x9c,0xee,0x74,0x0d,0x39,0x51,0x6d,0x0e,0xa6,0xe9,0x22,0xd8,0x30,0xdf,0x16,0xf7,0xe3,0xbd,0xbb,0xe6,0x45,0xb8,0x9c,0xb5,0x49,0xf0,0xe8,0x7c,0xce,0x25,0xf8 +.byte 0x46,0xc0,0x59,0xc2,0xbc,0xdd,0xea,0x3e,0xeb,0x2e,0xf5,0xfd,0xd9,0x05,0x8a,0x2f,0xa3,0xa4,0x63,0xa6,0x50,0x08,0xce,0x2a,0x69,0xe7,0x58,0x57,0xa1,0xb2,0x44,0x41,0x04,0xfc,0x61,0xb1,0xb8,0x19,0x27,0x14,0x71,0x2f,0x55,0x64,0x28,0xa0,0xcc,0x47,0x0c,0xd4,0xed,0xfd,0x07,0x99,0xc6,0x9e,0xdc,0x5f,0x19,0x03,0x1a,0x00,0xda,0xf6 +.byte 0x2c,0x95,0xb0,0xd2,0xaa,0xfb,0xbc,0x1a,0xf3,0x62,0xaf,0x9c,0x38,0xde,0x61,0x30,0xd5,0x56,0x82,0x4b,0xf6,0xeb,0x34,0xc0,0xdc,0x51,0x97,0x89,0x80,0x47,0x9d,0x2a,0xae,0x0e,0x92,0x48,0xd2,0x9d,0x5a,0x67,0xef,0x33,0xa3,0xbe,0xdd,0x80,0x64,0x9c,0xc1,0xaf,0xf9,0x1a,0x4b,0x55,0x67,0x88,0x37,0x37,0xff,0x98,0xe3,0x9e,0xa9,0x4e +.byte 0x1f,0xa1,0x32,0x70,0xa3,0xbb,0xdc,0x6e,0xb3,0x6d,0xfe,0x8f,0x74,0x89,0xed,0xe1,0x13,0x3c,0x8f,0x08,0x75,0x84,0x84,0xee,0xac,0xcc,0xa5,0x47,0x9f,0x3e,0xb9,0xed,0x26,0x20,0xf7,0x7b,0xfb,0x8a,0x48,0x58,0x51,0x24,0xf9,0xeb,0x66,0x6d,0xd6,0x83,0x24,0xff,0x9f,0x0d,0x38,0x9c,0xf9,0x24,0x99,0x12,0x49,0xb6,0xdd,0xce,0x44,0xe7 +.byte 0x31,0x3d,0x4b,0x23,0x8a,0xd5,0x62,0xa2,0xdb,0x78,0x56,0x3a,0x62,0xc8,0x59,0x5f,0xcc,0x58,0x76,0x19,0x5d,0x48,0x4a,0xc2,0x87,0x21,0xc3,0x3d,0x3a,0x38,0xbd,0x20,0xfd,0xc3,0xa6,0xab,0x32,0xb8,0xc8,0xd1,0x5c,0xa5,0xb4,0x64,0x60,0xd2,0x87,0xb7,0xe9,0xc2,0x2b,0xb2,0x75,0x04,0xf4,0x6e,0x96,0x99,0x5d,0x08,0xff,0xa3,0x45,0x8a +.byte 0xad,0x7c,0xee,0x94,0x4e,0x45,0x86,0xad,0x0a,0x7a,0x5c,0x8f,0xff,0x28,0xb3,0x3c,0xf8,0x5e,0xb3,0x1e,0x5c,0xe0,0x22,0xf7,0x4e,0xe4,0xdf,0x1f,0xd2,0xa2,0x37,0x4a,0x87,0xa6,0x16,0x80,0x0c,0xc3,0x75,0x18,0xe4,0x76,0x8f,0xc3,0x1b,0xee,0xb1,0xe4,0x4b,0xeb,0x6f,0x15,0x48,0x60,0xaf,0x8e,0x0e,0xeb,0xbe,0x26,0xa3,0xbd,0x2a,0xb5 +.byte 0x6d,0x8b,0xd1,0xa1,0x0f,0x8e,0xaa,0xaa,0xb8,0x8d,0x84,0xe7,0x65,0x40,0x60,0x3d,0x59,0xb7,0x1c,0xef,0x08,0x0e,0x6f,0x21,0xb4,0xe6,0x10,0xda,0x59,0x9a,0x0f,0xe6,0xba,0xfd,0xed,0x7f,0xc1,0xe3,0x7a,0xb7,0x21,0x5d,0xcf,0x1c,0xbd,0xd2,0x59,0xc0,0x31,0xa5,0x8a,0x39,0x86,0x9e,0x7e,0x6a,0xcb,0x87,0x6f,0x01,0xba,0xa4,0x06,0x6b +.byte 0x3b,0x5d,0x68,0x85,0x11,0xd2,0x2a,0x3c,0x8e,0x3a,0x8c,0x8b,0x59,0xa0,0x4a,0xfb,0x76,0x85,0xe6,0x47,0xc3,0xf4,0xc4,0xe6,0xcc,0x7b,0xff,0x71,0x03,0xd1,0xc2,0x01,0xe4,0x5e,0x49,0x31,0xa6,0x0e,0x17,0x9b,0x42,0xdc,0x75,0xd6,0xfe,0x09,0x0b,0x6d,0x21,0x46,0xfe,0x40,0xcd,0x7c,0xdb,0xca,0xc9,0xba,0x64,0x83,0xd3,0xf7,0x0b,0xad +.byte 0xff,0xfd,0xe3,0xd9,0x49,0x7f,0x5d,0x48,0xaa,0xac,0xe5,0x74,0x2a,0x14,0x6f,0x64,0x21,0x81,0x09,0xcd,0x2d,0x19,0xf5,0x56,0x85,0xa8,0xec,0x98,0x65,0x46,0x99,0xec,0xbe,0xe3,0x86,0xd3,0x41,0x8b,0xe4,0x76,0x9b,0x5b,0x98,0x33,0x9e,0xdb,0xc9,0xde,0x89,0xfa,0x60,0x58,0xa8,0x2f,0x7a,0xca,0x30,0x91,0xc8,0x26,0x14,0x9c,0xd6,0x6d +.byte 0xc2,0x3c,0xca,0xe0,0x9a,0x13,0x72,0x63,0x5e,0x20,0xfd,0xa0,0xca,0xb2,0xed,0x37,0xc5,0xd4,0x4e,0xec,0x1f,0x74,0x25,0x37,0xe2,0xbe,0xb1,0x7f,0x52,0x26,0x28,0x4f,0x02,0xe5,0x6a,0x27,0xf3,0xc4,0x9c,0x69,0x09,0xac,0xff,0x77,0x9c,0xa4,0x1d,0xe7,0xa1,0x7c,0x37,0x70,0x3b,0x3c,0xc4,0x16,0x8f,0x5d,0xe5,0x05,0xa9,0x2c,0x91,0x2e +.byte 0x87,0xb0,0xa9,0x2e,0x32,0x73,0x5c,0x15,0x1e,0xbe,0x01,0xc9,0xd8,0x2e,0x26,0xf4,0x05,0x2d,0xe0,0xc0,0x38,0x81,0x61,0xf4,0x37,0x08,0xa0,0xc0,0x28,0x0a,0xb6,0xd4,0xcc,0x2c,0xc6,0xd4,0xda,0x48,0x49,0xcf,0x76,0x91,0x23,0x51,0x91,0xe7,0x50,0x94,0xae,0xb7,0x15,0x26,0xaa,0x82,0xd0,0x97,0xe8,0x5e,0xaa,0xfc,0xaa,0x60,0x62,0x81 +.byte 0x80,0xfd,0xfd,0xaf,0x65,0xcc,0x29,0x27,0x95,0xad,0x56,0xb9,0x85,0x66,0x49,0x62,0xb3,0x1a,0xf4,0x54,0xc7,0x5d,0x7f,0x73,0xe0,0xd2,0xc8,0x18,0x95,0x62,0x2f,0x5c,0x96,0xfb,0x63,0x15,0x46,0x07,0x5f,0x3e,0x52,0x18,0xf8,0x5d,0x45,0x0b,0xb6,0xf7,0xc5,0x3d,0x16,0xaa,0x0b,0x8f,0x9d,0x16,0xc8,0x93,0x13,0xd2,0xba,0x7a,0x52,0x1a +.byte 0x7a,0x73,0xc4,0xca,0xfb,0x04,0xaf,0x6f,0x3e,0xfa,0xff,0x29,0x09,0xe2,0x74,0x35,0xc1,0xfc,0x21,0xcf,0x5f,0xf7,0x82,0x55,0x75,0x27,0xc9,0x91,0xc5,0xbf,0xe6,0x68,0xb6,0x0f,0x10,0x0e,0x91,0x30,0xb7,0x05,0xca,0x59,0x4a,0x7f,0xb0,0xf6,0xaf,0xf1,0x5d,0xc9,0xc5,0x06,0xc5,0xf4,0xe1,0x75,0x16,0x9a,0x2c,0xc0,0x3f,0xc1,0x98,0x91 +.byte 0xb7,0xe6,0xb1,0xf2,0xf9,0xfa,0x6d,0x27,0x98,0x33,0x8b,0x73,0x7a,0x57,0x12,0x6f,0x80,0x11,0x28,0x17,0x7d,0xf1,0x26,0xaa,0x05,0xf1,0x6e,0x86,0x98,0xe7,0xf6,0x9f,0x9c,0x06,0x8f,0xec,0xd7,0x2d,0xb0,0x83,0xdf,0x23,0x80,0x34,0xd3,0xd7,0xf7,0xd5,0x0d,0x52,0x18,0xcd,0xc7,0xe7,0x15,0xc9,0x1b,0xae,0x58,0xcf,0xc5,0xdd,0x25,0x2a +.byte 0xff,0xa5,0xf3,0x6d,0x20,0xfd,0xda,0xfd,0x78,0x30,0x14,0x1f,0xb3,0x47,0xe3,0x2d,0x54,0x87,0xdc,0x30,0xbe,0x41,0xc0,0x48,0x52,0x82,0x49,0x78,0xad,0xfd,0x24,0xad,0xd6,0xc1,0x14,0x1e,0xa0,0xc1,0x3d,0x82,0x59,0x01,0x9b,0xc3,0xf4,0xf7,0x26,0xce,0x92,0x50,0x13,0x47,0xe0,0xf3,0xfa,0xd9,0x61,0x19,0x80,0x12,0xee,0x73,0x45,0x5b +.byte 0x34,0xfc,0xb2,0x84,0xb2,0x3f,0xdc,0x77,0x8e,0x2d,0xb3,0x62,0xb9,0x03,0x2d,0xb6,0x2a,0x17,0xcd,0xfb,0x54,0xc2,0x5e,0xb9,0xcf,0xd6,0x05,0xe2,0xac,0x3f,0xce,0x50,0x0f,0xa1,0x3e,0x67,0x68,0x46,0x0c,0xab,0xa1,0xdc,0x2a,0x26,0x1f,0x22,0x1b,0xa7,0xc9,0x3b,0x6c,0x97,0x5d,0x5c,0x7d,0x1a,0x46,0x4a,0x99,0x92,0x85,0x87,0x35,0x6c +.byte 0x78,0x9d,0xb0,0x39,0xd6,0x3b,0x52,0x60,0xb4,0xba,0xcc,0x2e,0xe9,0xe1,0x91,0x51,0xc1,0x52,0xc7,0x5d,0x84,0x95,0x54,0x25,0xdd,0xcd,0x40,0x35,0xa1,0xc8,0x7e,0xff,0x82,0x55,0x9f,0x64,0xef,0xa7,0xc1,0x79,0x57,0xc7,0x44,0xa8,0x1c,0x06,0xaa,0x2a,0x05,0x65,0x6c,0xdc,0x90,0x7d,0x2e,0x53,0x3c,0x56,0xe1,0x30,0xdf,0xcb,0x75,0x3d +.byte 0x36,0x88,0xfd,0x72,0x2d,0xc7,0x8e,0x2f,0x11,0x5a,0x2e,0xa9,0xd6,0x37,0x4b,0x31,0x4e,0x6e,0xa0,0x4a,0xd9,0xa9,0x48,0x18,0x50,0xb1,0x28,0xf6,0x74,0x03,0x44,0xa7,0x06,0x55,0x86,0x1a,0x1b,0x07,0x79,0xc4,0x25,0xba,0x5d,0xce,0xa2,0x96,0x7d,0x62,0xa7,0x21,0xf0,0xa7,0xc2,0x91,0x03,0x38,0x37,0x0b,0x20,0x40,0x88,0x7b,0x28,0xf4 +.byte 0xf3,0xc2,0xb0,0x4b,0xf6,0xef,0x2f,0xd9,0xb5,0x81,0x17,0x95,0x42,0x98,0x7f,0x18,0xd4,0x7e,0xa1,0x85,0xbf,0x62,0xdc,0x40,0xe4,0xd3,0xcc,0x78,0x01,0xec,0x12,0xcc,0x04,0x5b,0xfe,0xdb,0x39,0x7c,0x1e,0x56,0x7c,0x72,0x57,0xb9,0xdf,0x9d,0x43,0xd4,0xe3,0x1f,0xbf,0x69,0xfb,0x43,0x23,0xd8,0x75,0x81,0xe8,0x39,0x0f,0xe4,0xe9,0x51 +.byte 0xea,0xb7,0xa7,0xc6,0x17,0xc6,0x75,0x4c,0xa8,0x17,0x41,0x1c,0x55,0x8e,0x8d,0xf3,0x64,0xbc,0xc3,0x33,0xa7,0xc1,0xbe,0xa2,0x89,0x75,0xd6,0xda,0xad,0x44,0xd5,0xdd,0x18,0xe2,0xfc,0x1d,0xa1,0xbc,0x1a,0xb8,0x40,0x1a,0x4f,0x44,0x4b,0x56,0xe9,0xf4,0xa8,0x16,0xe6,0xc9,0x40,0x90,0x9b,0x49,0xae,0x62,0x12,0x3d,0x50,0x2e,0x7b,0x60 +.byte 0x6f,0x04,0x01,0x2c,0x83,0x2a,0xd2,0x92,0x63,0xa2,0xe2,0x39,0x9a,0xc4,0x1e,0x5a,0x53,0x3f,0x4d,0x69,0xfa,0x0a,0x22,0x13,0x80,0xa4,0x6e,0xfb,0x09,0xcb,0x35,0xd7,0x12,0xa4,0xcd,0xfc,0x0b,0x06,0xa6,0x5e,0xc6,0x4a,0x22,0x56,0x5d,0x7f,0x70,0xd0,0xf8,0xe6,0x96,0x77,0xce,0xd9,0x69,0x6c,0x06,0xac,0xaa,0x94,0x6d,0x57,0x1b,0x28 +.byte 0xb4,0x07,0x50,0x19,0xd1,0x86,0xba,0xe6,0xe6,0x31,0x74,0x1d,0x3d,0xe8,0xe2,0x7b,0xfe,0xc9,0x41,0x89,0x20,0x5b,0x6a,0xc0,0x18,0x16,0xee,0x35,0xfa,0x56,0x35,0x3e,0x53,0x99,0xfb,0x8d,0xae,0x75,0x4f,0xc5,0x8d,0xff,0x23,0xd5,0x42,0xf4,0x81,0x5c,0x8b,0x71,0x7a,0x22,0xb0,0x6b,0x45,0x86,0xa6,0xc6,0xdb,0xa6,0x83,0x01,0x28,0xde +.byte 0x38,0xaa,0x6e,0xf8,0x5a,0xf2,0xcc,0x3c,0xc5,0x65,0x78,0x37,0xe8,0x8a,0x59,0xf3,0xfe,0x8b,0xcd,0xf6,0x31,0x46,0xdc,0x72,0x19,0xf7,0x73,0xac,0x5c,0xf1,0xe3,0xfd,0x85,0x51,0xec,0x92,0x3a,0xf3,0xd7,0xb2,0x95,0x53,0x79,0x48,0xd3,0x29,0x84,0xec,0xc5,0x0a,0x71,0x15,0x52,0x69,0x6a,0xe1,0xab,0x69,0x94,0xc2,0x51,0xdf,0x27,0xd8 +.byte 0xb1,0x05,0xc4,0x12,0xea,0x1e,0xda,0x6e,0xf2,0xf5,0x8a,0xa8,0x72,0x74,0x5a,0xe5,0x45,0x5b,0x5f,0xf9,0xb0,0x56,0x5c,0x85,0xf7,0x63,0x8d,0x1d,0xbf,0xe9,0x7c,0x97,0xe9,0x37,0xb3,0x5b,0x4b,0x57,0xfc,0xf4,0x58,0x84,0x26,0x55,0x07,0xc7,0x0a,0xfe,0x5a,0x58,0xd0,0xd8,0x19,0xf4,0x02,0xad,0x2c,0x4e,0xbd,0xe1,0x07,0x48,0x3b,0xc4 +.byte 0xd6,0x23,0x3a,0x63,0xc3,0xf5,0x17,0x46,0x03,0xa4,0x9a,0x10,0xf9,0xac,0x70,0x9c,0x13,0x10,0x94,0xda,0x17,0xc5,0xbb,0x87,0x0f,0x9b,0x4f,0x54,0x55,0x6b,0x57,0x2d,0x12,0x0b,0xa7,0x9c,0x77,0x6d,0x67,0xb0,0x03,0xdf,0xc6,0xa2,0x76,0x96,0x0c,0xac,0x30,0xbc,0xa2,0x55,0x23,0x01,0xae,0x51,0x50,0xd4,0xab,0xd0,0xee,0x75,0xf1,0x96 +.byte 0x75,0xf5,0x2e,0xae,0x52,0x31,0x0b,0x0a,0x8a,0xdb,0x4c,0x4d,0x4c,0x80,0xfc,0xd7,0x68,0x05,0x54,0x47,0xa5,0xc4,0xb1,0x63,0x87,0x43,0x1b,0xe1,0x0b,0x4f,0xff,0x0c,0x02,0xf7,0x00,0xd4,0x8d,0x6e,0xa1,0x21,0x91,0x62,0xec,0x55,0xd5,0x72,0x70,0x59,0x7a,0xa4,0x0e,0x78,0x7a,0x87,0x1f,0x71,0x35,0x3b,0xf7,0x1f,0x66,0x8c,0x90,0xf9 +.byte 0x6d,0x1f,0x74,0x47,0x41,0xf5,0x21,0x98,0x0d,0x42,0x61,0x21,0x0b,0x62,0x59,0xc7,0x5e,0x58,0x37,0xfb,0xee,0xbb,0xa0,0x45,0xa8,0x84,0xae,0x41,0x29,0xc9,0x88,0x64,0x69,0x75,0xc1,0x5f,0x63,0x7c,0x00,0x1c,0x35,0x61,0x9e,0xad,0x19,0xd7,0xd8,0xf1,0x64,0x57,0x10,0x87,0x73,0xa8,0x8b,0x39,0x9b,0x1c,0x1a,0xc2,0x1b,0x01,0x1a,0x41 +.byte 0x26,0x58,0x93,0x8f,0xed,0xf9,0xe7,0xfe,0xcc,0x27,0x1b,0x6b,0xb8,0x28,0x5a,0x0b,0x04,0xa0,0x94,0x23,0x4b,0x21,0x5f,0xb3,0xc9,0xb6,0x7b,0x36,0x5a,0x67,0x6b,0xd2,0xc2,0x53,0x97,0x5d,0xa5,0x43,0xd3,0x79,0x83,0xe2,0x3b,0xe0,0xaf,0x5f,0xbd,0xf3,0xb0,0xfc,0x04,0x95,0x06,0x17,0x0c,0xe2,0x68,0xe8,0xf3,0x90,0xc7,0x2b,0x7b,0xcc +.byte 0xaa,0xce,0xf5,0x0b,0x3c,0x3f,0x10,0xa7,0x31,0x9d,0xf0,0x1e,0x3e,0x74,0x57,0xbd,0x87,0xe7,0x37,0xd0,0x37,0x09,0xae,0x03,0x96,0xb1,0xad,0x8f,0x2d,0x72,0xdc,0x0f,0xdf,0xd9,0xfb,0xcc,0xb8,0x48,0x62,0xf7,0xad,0x05,0x4d,0xc6,0xe5,0x92,0xe3,0x95,0xa0,0x74,0x7a,0xa6,0x84,0x13,0x68,0x17,0xaa,0x8f,0x40,0x2a,0x8d,0x2b,0x66,0xdc +.byte 0xf8,0xf6,0x6d,0x7c,0x7e,0x40,0x22,0x05,0x16,0x20,0xbc,0xe5,0xc2,0x87,0xe2,0xd5,0xbd,0x47,0xd5,0x69,0x95,0x12,0x25,0x1c,0xaa,0x9d,0xb5,0x73,0x08,0xaf,0xfb,0x46,0xa5,0x11,0x2c,0x93,0xc6,0xfc,0xc0,0x5e,0x0e,0x99,0x1c,0x80,0x5f,0xe5,0xc8,0x52,0x73,0x35,0x4d,0xbc,0x70,0xeb,0x40,0xc9,0x47,0x8a,0x8f,0x19,0xd9,0xa9,0xec,0x4b +.byte 0x88,0x53,0x56,0x08,0x4a,0xa2,0x32,0x1f,0xe2,0xbb,0x68,0x35,0xfd,0xf2,0x0e,0x0f,0x7f,0xc8,0xf1,0x59,0xac,0x97,0x8f,0x84,0x69,0xb6,0xb9,0x5f,0x84,0xe9,0xf2,0xf9,0x09,0xf6,0xf1,0x31,0xd7,0x1a,0xa8,0x25,0x32,0x5f,0xb1,0xa7,0x84,0x15,0xfa,0x07,0xa8,0x53,0xce,0x2a,0x26,0xe0,0x4d,0x07,0x4f,0x45,0x63,0x76,0xfd,0xe3,0xb4,0x4e +.byte 0x81,0x5e,0xe6,0x01,0x9c,0xf5,0x82,0x2d,0x71,0x0f,0x98,0xb4,0x72,0x06,0xbc,0x89,0x89,0x60,0x5f,0xd9,0x92,0xcf,0xb9,0x41,0xe3,0x13,0xaa,0xe4,0x80,0xb5,0x75,0xf4,0x9a,0x1b,0xc2,0xa3,0xa4,0xa9,0x0f,0x15,0xdc,0x26,0xdd,0x20,0x10,0x27,0xbd,0x06,0x77,0x12,0xa5,0xb3,0xde,0x9f,0xbf,0xc4,0xb6,0x1d,0x76,0xdc,0x16,0x00,0x2e,0xe2 +.byte 0x00,0x4d,0xb3,0x62,0x57,0x73,0x1e,0x90,0xe2,0xaa,0x4c,0x47,0xdf,0x6b,0x2d,0x66,0x2f,0x82,0x55,0x91,0x26,0x33,0xb9,0x3a,0xc7,0xf1,0x0a,0xda,0x9b,0x6b,0x05,0x82,0x0f,0x0e,0x30,0x74,0x0b,0xea,0x0f,0x49,0x55,0x3b,0xe7,0x42,0x48,0xca,0x82,0x3e,0x8c,0xbc,0xe2,0x88,0x43,0x44,0x0d,0x37,0x9b,0xd1,0xfc,0xf1,0x45,0x46,0x0e,0xe1 +.byte 0xec,0x91,0x39,0x96,0x7d,0xbc,0xd5,0xb1,0x11,0x55,0x54,0x49,0x4f,0x18,0xed,0xec,0x58,0xdb,0xb3,0x7d,0x64,0x8d,0xfc,0x65,0x1f,0xf0,0xe0,0xc0,0x41,0xc0,0x19,0xeb,0x16,0x16,0x71,0x36,0x88,0xcf,0x75,0x3d,0x9c,0xe6,0xa0,0x84,0x54,0x26,0x64,0x95,0x9a,0xe1,0x0b,0x51,0xcf,0x9a,0x55,0x60,0x4d,0x9d,0x1d,0x37,0x71,0xa8,0x94,0x0a +.byte 0x20,0xeb,0xf2,0x91,0x14,0xfc,0x12,0xb0,0x1e,0xe3,0x5e,0x3a,0xbb,0x22,0xde,0x20,0xb1,0x58,0xef,0x0b,0xb1,0xc2,0x2f,0xea,0xd8,0xdb,0x1d,0x3a,0x67,0x7b,0xbd,0x26,0xfa,0x4a,0x3c,0x3d,0xbd,0x87,0x4c,0xba,0x57,0xdf,0xfb,0x1d,0xf7,0x26,0x5f,0x52,0x4e,0xdd,0x9b,0x38,0x62,0xed,0x48,0xc1,0xae,0x7f,0xa8,0x13,0x05,0x09,0xff,0xc0 +.byte 0xd3,0x49,0x75,0x1f,0x6a,0xe0,0x79,0x94,0xc1,0xe9,0xe3,0xf5,0x33,0x40,0xd4,0x6b,0xfe,0x4d,0x6e,0x84,0xb9,0x20,0x68,0x2b,0x6c,0xb3,0xf1,0xb1,0x1c,0xfd,0x93,0x14,0x7f,0x35,0x9b,0xd5,0x07,0x15,0x87,0x56,0xb9,0x45,0x22,0x64,0x73,0xdb,0x34,0x35,0xca,0x15,0x4e,0xa2,0xa2,0xe2,0x7a,0x6e,0x14,0x46,0xf5,0xf1,0x70,0xd3,0x3a,0x2e +.byte 0x38,0x9d,0xf6,0xc6,0x29,0xd5,0x7f,0xc7,0x77,0x2c,0x33,0x55,0x1c,0xc2,0xf1,0xaf,0x8e,0x4d,0x1b,0x22,0x36,0x35,0x93,0x47,0xa5,0x59,0xb4,0x94,0x0f,0x2d,0x66,0x24,0x6f,0x57,0xa4,0x95,0xf3,0xd7,0xf3,0x59,0x9d,0xc0,0xda,0xa7,0xf7,0xf2,0x8d,0x93,0xc9,0x90,0x91,0x9e,0x12,0x3f,0x34,0x01,0x90,0x8b,0x13,0x09,0x3d,0x2f,0xa8,0x31 +.byte 0xfa,0x39,0x4a,0x7d,0x0d,0x34,0xa3,0xf1,0x75,0xdb,0xa2,0xd2,0x5c,0xf1,0x72,0xfd,0x7f,0x7b,0x15,0x92,0xf0,0x71,0xd6,0xa0,0x74,0x53,0x61,0x67,0xa4,0x8b,0x72,0x3a,0x66,0x0a,0xce,0xc9,0x1c,0x5b,0x4d,0xaa,0x0a,0x3a,0x91,0x0a,0xbb,0xef,0x6e,0x8d,0x00,0xc0,0xa1,0x89,0xa9,0xbd,0x5a,0x2d,0xf8,0x7c,0x1f,0xb2,0x5a,0x73,0x33,0xe7 +.byte 0xb3,0xfd,0xd4,0xe3,0x81,0x69,0x30,0xc1,0xf8,0x97,0x7b,0xf3,0x63,0xaa,0xd5,0x5a,0x98,0x95,0xb3,0x65,0x2d,0xf9,0x68,0x2e,0x2c,0x26,0xe6,0x77,0x8f,0x76,0x7a,0x02,0xc7,0x50,0x28,0x40,0xcf,0x44,0x66,0x18,0x54,0x52,0xef,0x79,0x26,0xc2,0x76,0x5b,0x71,0x92,0x49,0xba,0xe1,0xd7,0xf2,0xdd,0x57,0xe0,0x78,0x6e,0xb6,0xdd,0x0d,0x20 +.byte 0x85,0xf9,0x34,0x9e,0x65,0x6b,0x9f,0x41,0x24,0xe2,0xb1,0x2a,0xef,0x8b,0xd2,0x19,0x81,0x73,0x56,0x5a,0x84,0xd3,0x46,0xf8,0x74,0xe3,0x1f,0x3d,0xd9,0x16,0x86,0x38,0xf6,0x7c,0x04,0xab,0x9a,0x64,0x0e,0x48,0x06,0x4c,0x61,0xcd,0x2d,0x4d,0xef,0x6f,0xd6,0x7d,0x31,0x1c,0x56,0x65,0xc4,0xf1,0xa7,0x15,0xac,0xa4,0xe2,0x8b,0x83,0x5e +.byte 0x64,0x36,0x2e,0x77,0x94,0x2e,0x2e,0xa3,0x62,0xcf,0x6e,0x7a,0x6d,0x39,0xaf,0xf7,0x96,0x88,0x31,0x14,0x58,0x46,0x30,0x0c,0x36,0x3a,0x4c,0x53,0xe0,0xa7,0x24,0x76,0x84,0x0f,0xfb,0x7e,0x55,0xa0,0x0f,0x63,0xfc,0xd6,0x1f,0x58,0x68,0xb5,0xcc,0x77,0x4f,0x16,0x91,0xa7,0xfd,0x62,0xb3,0x88,0x13,0x7c,0xcb,0x63,0x6d,0xe4,0x38,0x4c +.byte 0x6e,0x3b,0xf7,0xe3,0x8d,0x52,0x84,0x61,0x19,0x12,0x51,0xbe,0xed,0x32,0x3d,0x77,0xdd,0xa1,0xc3,0x59,0x65,0x79,0xa1,0x6b,0xbc,0x65,0x6c,0xe3,0x7e,0x60,0x49,0xbd,0xcf,0x6f,0x61,0x97,0x98,0xbe,0x74,0x38,0xd1,0x09,0xc1,0x59,0xe5,0x7f,0xfe,0xbf,0xfd,0x60,0x1b,0x96,0x00,0x46,0x56,0x4d,0x81,0x4c,0x70,0x59,0x39,0x66,0x13,0x58 +.byte 0xe7,0x62,0x3a,0xfc,0x1b,0xe5,0xf9,0x03,0xd4,0x4b,0xab,0x1d,0x56,0x22,0x4a,0x09,0xa5,0xdd,0xac,0x39,0xbe,0x27,0x39,0xb3,0xe8,0xad,0xe0,0x07,0x86,0x10,0xce,0xa9,0x4e,0x8b,0x47,0x8d,0xb8,0x63,0x2f,0x61,0x1a,0x8b,0xd4,0xd3,0xfe,0x73,0x82,0x5a,0xd6,0xa9,0x46,0x56,0xa7,0x81,0xe9,0xda,0xb9,0x17,0xa7,0xc8,0x0f,0x24,0x16,0x6a +.byte 0x12,0xfe,0xc3,0x65,0x85,0x77,0xab,0x89,0x44,0x1b,0xa3,0x8b,0xfd,0x07,0xf4,0x77,0xaa,0xe1,0x71,0x33,0x74,0x93,0xdc,0x90,0x53,0x39,0x47,0x8c,0xea,0x18,0xe1,0x6a,0xed,0x8c,0x56,0x08,0x2f,0xa1,0x1f,0x22,0xf2,0xc0,0x12,0xcd,0xb7,0xdf,0xb6,0x3c,0xd6,0x22,0x6c,0x5b,0x00,0x0f,0xdb,0x66,0x5b,0x54,0x35,0x48,0x37,0x8c,0x79,0x74 +.byte 0xd1,0xb0,0x15,0x01,0x22,0x3a,0x7c,0x17,0x8c,0x20,0x06,0x9b,0x13,0x6e,0xee,0xbf,0xb4,0xac,0x01,0x61,0xb9,0x28,0x65,0x8e,0x53,0x12,0x4f,0xe0,0x5f,0xfc,0xdb,0x40,0x6c,0xa2,0x19,0x64,0x49,0x7a,0xc7,0xc5,0xc8,0x53,0x6e,0xd5,0x68,0xe1,0x61,0xe5,0x87,0xc2,0x99,0x59,0x4c,0x27,0xc8,0xd0,0xd0,0x10,0xce,0x9f,0x09,0xff,0xf5,0xa8 +.byte 0xf8,0x79,0xf6,0x0f,0x73,0xda,0x8a,0x36,0x8e,0x48,0x7e,0xbd,0x98,0x76,0x57,0xfa,0x5c,0xec,0xa5,0x3d,0x30,0xfe,0xa3,0xe5,0x27,0x87,0xcf,0x26,0xfe,0x61,0xe4,0xed,0xd1,0xfb,0xfc,0x91,0x5d,0xb6,0x70,0x2c,0x2c,0x59,0x14,0xd5,0x1d,0x9a,0xb9,0x2c,0xef,0x24,0x7b,0x10,0x8d,0x99,0x63,0xaa,0x82,0xf0,0x1c,0xe8,0xa0,0x00,0xa5,0xa7 +.byte 0xf8,0xc0,0x35,0x9e,0x12,0x18,0xaf,0x42,0x9d,0xe5,0x2b,0x72,0x6c,0x31,0xd8,0x8f,0x6c,0xde,0x2e,0x37,0xa6,0x73,0x06,0xe7,0x90,0x43,0x79,0x99,0x64,0xd1,0x17,0xa1,0x43,0x6d,0xd4,0x90,0x50,0xf2,0xcc,0x0b,0x73,0x49,0x9e,0x14,0x7c,0x49,0x92,0x05,0x0e,0x8c,0xda,0xb7,0x18,0xf0,0xcc,0xea,0xe4,0x32,0x58,0xc7,0xbd,0x8e,0xca,0x35 +.byte 0x52,0x9f,0xec,0x5d,0xa0,0x6c,0x83,0x61,0x07,0x74,0x37,0x4a,0x10,0xa0,0x98,0x83,0x3a,0x65,0x17,0x63,0xd0,0x22,0x96,0xb5,0xed,0xbb,0xbb,0x1c,0x18,0x8a,0x49,0x3d,0x0f,0xcc,0x24,0xb3,0x9b,0xb6,0x23,0x2e,0x9d,0x97,0xe7,0x31,0xf8,0x36,0x6d,0x7b,0xa1,0xf1,0x02,0xde,0x7c,0xad,0x77,0x5d,0x85,0x7c,0x39,0x61,0xc7,0xd7,0x3f,0x70 +.byte 0x1c,0xe1,0x0e,0x49,0xf4,0xcd,0xab,0xfd,0x4d,0x2f,0xc7,0xb7,0x53,0xfc,0xed,0xeb,0x41,0x2a,0x80,0x40,0xf3,0x47,0xf8,0x15,0xa0,0x4c,0x8b,0x34,0xf6,0x6a,0xb8,0x30,0x09,0x4d,0xe6,0x60,0xb7,0x24,0x6b,0x4c,0x26,0xdf,0x83,0x37,0xc7,0x96,0xba,0x35,0xda,0x29,0x4e,0xca,0x52,0xf7,0x41,0xd3,0x98,0x27,0xb2,0x9e,0xec,0xcc,0x12,0xdc +.byte 0x77,0xfd,0x11,0xbd,0xbd,0xbb,0x5e,0x0c,0x37,0x29,0xd2,0x4f,0x7d,0x5c,0x97,0xad,0x72,0x93,0x4a,0xfa,0x17,0x07,0x07,0x26,0xee,0xa7,0x29,0x2e,0xdb,0xf6,0x60,0x65,0x2d,0x85,0xbe,0x27,0x4d,0xf7,0x2b,0xb4,0x81,0xf5,0x3a,0x1d,0xae,0x25,0x8b,0x60,0xc2,0x75,0x3a,0xfd,0xf9,0x4d,0x90,0x7a,0x8a,0x3a,0xf6,0xa9,0xf0,0x11,0xd2,0xb9 +.byte 0xdb,0x23,0x40,0x9d,0x33,0xc3,0xbf,0x60,0x95,0x9c,0x6f,0xa9,0x82,0x42,0xe5,0x67,0x52,0x36,0xea,0x68,0x64,0x24,0x85,0x46,0x7e,0x2a,0x1a,0x6a,0x4b,0xa8,0xb0,0xa0,0x9c,0xb8,0x4a,0xb6,0x2e,0xb2,0x6b,0xf4,0x63,0x9f,0x54,0xb5,0x6f,0x1b,0xf5,0x71,0x7e,0xf8,0xef,0xb2,0x92,0xe2,0xcf,0x65,0xb4,0x02,0x9b,0x75,0x4b,0xf9,0x6b,0xa1 +.byte 0x24,0x3b,0xea,0x7f,0x31,0x08,0xd4,0xdc,0xab,0x12,0xc0,0xca,0x64,0xee,0xfa,0x61,0x1c,0x0f,0x24,0xc3,0x8c,0xbd,0xc8,0xd2,0x42,0xf7,0x1f,0x2e,0xd3,0xd1,0x51,0x86,0xfb,0xa2,0x95,0xc5,0x8c,0x5b,0x61,0x14,0xc9,0xe4,0x07,0xa1,0xf7,0x39,0x11,0x40,0x68,0xd6,0xe2,0x38,0x96,0x6f,0x99,0xf1,0xd2,0xfb,0x8e,0xb8,0x3d,0xf2,0x8a,0x4e +.byte 0x3e,0x54,0xd9,0x0e,0xd1,0xc9,0x31,0x04,0xa4,0xee,0xbe,0x51,0xcf,0x5f,0xd1,0xc8,0x13,0x96,0x9d,0x9b,0xdf,0x32,0xa9,0x38,0x8f,0xbc,0x7e,0x22,0x1a,0x52,0x5f,0x14,0x61,0xeb,0x78,0xf4,0x01,0xe9,0x5c,0x18,0x1c,0xb5,0xe1,0x80,0x06,0x3e,0x8e,0x72,0x33,0xf9,0xaa,0x49,0xec,0x5b,0x7a,0x04,0xf2,0x9b,0x48,0x8a,0x58,0x14,0x4b,0x7e +.byte 0x4d,0x26,0x0b,0xe0,0xf0,0x69,0xa3,0x36,0x75,0x3e,0x73,0xec,0x53,0x20,0x35,0x8e,0xfa,0x40,0xf0,0xcd,0x70,0xe1,0xe4,0x64,0x89,0x14,0x55,0xd7,0x20,0xe8,0xbd,0xc2,0x85,0xa8,0x4d,0x51,0x96,0x27,0x54,0x50,0xc7,0xa1,0x9c,0x35,0x52,0x1f,0x8b,0x6f,0xa2,0x62,0x36,0x94,0x02,0xb1,0x01,0xc6,0x4e,0x53,0x83,0x65,0x98,0x25,0x6d,0x26 +.byte 0x6d,0xef,0x4e,0x7a,0xe0,0x56,0x6a,0x6c,0x23,0xe8,0xa6,0x97,0xc1,0xf2,0xb1,0x2d,0x03,0x29,0xef,0xa0,0x6d,0x86,0x8d,0x5a,0x00,0x83,0x14,0xed,0xd4,0x1e,0x79,0xc4,0xb4,0x42,0xfd,0x53,0xaa,0xab,0xd7,0xa3,0xf9,0x7d,0x15,0x26,0xab,0x81,0xc4,0x7a,0x96,0x14,0x94,0x71,0xe1,0x7f,0xc1,0x67,0x5f,0x5f,0x11,0xb4,0x72,0x03,0xf8,0x9b +.byte 0x2f,0x82,0xa3,0x4e,0xda,0xfd,0x2a,0x31,0xf1,0x74,0x6d,0x96,0x7a,0x9c,0xf9,0x01,0xd9,0x55,0x8e,0x52,0xe4,0xae,0x22,0x14,0x7b,0xc0,0x5a,0xc4,0x31,0x23,0x9a,0x2e,0x9d,0x86,0x86,0xd5,0x66,0xc8,0x8b,0xdb,0x49,0x5f,0xca,0x57,0x51,0x50,0x75,0x3f,0xeb,0xb1,0xe5,0x84,0x42,0x8f,0x0f,0xca,0x86,0xcf,0xb0,0x17,0x06,0x06,0x46,0x8c +.byte 0x4a,0x84,0xde,0x28,0x84,0x24,0x7f,0x33,0x48,0xe8,0x89,0x87,0x1f,0x02,0x07,0x4f,0x36,0xa9,0xdc,0x8a,0x42,0xb6,0xc7,0x9c,0x47,0xd4,0xd4,0x2d,0xc0,0x17,0xb0,0xe6,0x23,0xb7,0xae,0x0d,0x9f,0x38,0x0a,0xdf,0x7f,0x73,0xbf,0x93,0x19,0x05,0x23,0xbf,0xc0,0x53,0x2d,0xcd,0x3e,0x73,0x01,0x78,0xa7,0xdc,0x6c,0x85,0x1d,0x25,0xc5,0x54 +.byte 0x68,0x95,0xc1,0x20,0x65,0xd9,0x01,0x85,0x7d,0xc9,0xba,0x63,0x43,0x7a,0x23,0xbb,0x95,0x3a,0x76,0x2d,0x75,0x1e,0xac,0x66,0x3e,0x20,0x30,0x8d,0x37,0x64,0x3c,0xc7,0x6f,0x36,0xb8,0x34,0x60,0xd2,0xb4,0x54,0x07,0x52,0x6c,0xfa,0x04,0xfe,0x2b,0x71,0x03,0x03,0x97,0xfc,0x4a,0xf9,0x4d,0x44,0x1a,0xf9,0xd7,0x4b,0xe5,0xe1,0xf9,0xb9 +.byte 0x41,0xa0,0x5b,0xa2,0x69,0x48,0xba,0xeb,0xcc,0x4e,0x55,0x4b,0xbd,0x41,0x09,0xa8,0x90,0x5c,0xc6,0xe3,0x20,0x0c,0x8f,0xfc,0x7e,0x0e,0x4f,0x3d,0x47,0x65,0x40,0x1e,0x79,0x9a,0xe0,0x8f,0x8f,0xe9,0xcb,0xaa,0x04,0xb8,0xd9,0x91,0x30,0x2a,0x4c,0x17,0x44,0xc0,0x03,0x4c,0x37,0xd3,0xdb,0x20,0xe5,0x8e,0x70,0x87,0x57,0x4f,0x8a,0xcf +.byte 0xee,0x64,0xbc,0xef,0x0f,0x9e,0xcf,0x95,0x5e,0x11,0x4f,0x7a,0x35,0x53,0x8c,0x85,0x6a,0xff,0x72,0x1b,0x35,0x51,0x89,0xf8,0x94,0x65,0x97,0xec,0xfe,0xbd,0x00,0x29,0x3d,0xe8,0x96,0x23,0xa4,0xe3,0xcf,0x81,0xb2,0x8f,0x73,0x4c,0x05,0xc3,0xcc,0x37,0x22,0x97,0xa0,0xda,0x49,0xb2,0xbd,0x07,0x2b,0x26,0xa0,0x6f,0x6b,0x1f,0xa6,0x15 +.byte 0xe3,0x6e,0x12,0xa4,0x51,0x1b,0x72,0x22,0x08,0xfe,0xf7,0x93,0x1a,0x9f,0x62,0x12,0xd4,0x11,0x1f,0xd1,0x80,0xeb,0xa4,0xb1,0xf4,0x37,0x3b,0x60,0xd8,0x2b,0x53,0xae,0x69,0xf8,0x48,0x38,0xf4,0x20,0x28,0xe1,0xfb,0x6a,0xec,0x6e,0x11,0x2e,0x2c,0x59,0x62,0x23,0x8a,0x82,0xc4,0x33,0x7b,0xdc,0x33,0x99,0x41,0x29,0x4f,0xa1,0x6e,0x3a +.byte 0x48,0x13,0x1c,0x1f,0xa3,0x1f,0xd2,0x02,0x79,0xe1,0xe4,0xb9,0x99,0xa4,0x50,0xea,0x53,0x96,0x4e,0x82,0x7c,0xee,0x65,0x07,0x26,0x87,0xf9,0x9d,0x45,0x17,0x37,0x61,0x7e,0x5f,0xb9,0xd2,0x55,0x3c,0x45,0xf7,0xec,0x33,0x08,0xa3,0x41,0x24,0x8f,0xb2,0x75,0x41,0xb6,0xa2,0x21,0xfe,0x94,0x7e,0x1e,0xe6,0x03,0x6e,0xf4,0xeb,0x23,0x59 +.byte 0x51,0x25,0x99,0x19,0x6d,0xf7,0xe3,0x22,0xd8,0x41,0x0f,0xd5,0xaf,0x0d,0xc6,0x3f,0x8e,0x36,0xee,0x90,0x23,0x67,0x03,0xcb,0xe3,0xaf,0xc4,0xf8,0x22,0x1f,0xd8,0x3e,0x94,0xdf,0x13,0xc9,0x4f,0x17,0x22,0x8c,0x93,0x6b,0x3f,0x60,0x1a,0xbd,0xfa,0x9f,0xe6,0x43,0x45,0xe1,0x0a,0x95,0x21,0x06,0x52,0xbd,0x58,0x56,0x84,0x56,0x36,0xf3 +.byte 0x55,0x58,0x46,0x62,0x6c,0xb3,0xa0,0x29,0x5a,0xfc,0xb4,0x87,0x5f,0x89,0xa5,0xab,0x6d,0x5a,0x44,0xc5,0xc8,0x50,0x83,0xe1,0x41,0xd4,0x97,0x6c,0x08,0xb1,0x43,0x33,0x0d,0x3a,0x8b,0x31,0xa1,0xae,0x77,0x71,0xb7,0x67,0x65,0xd7,0xa7,0xc9,0x6c,0x4a,0x9b,0x80,0xd5,0xbf,0xae,0x0f,0x9b,0xce,0x1a,0xa3,0x26,0xc6,0x19,0xa1,0x8d,0x12 +.byte 0xd9,0x09,0xae,0xac,0x9f,0x4b,0xab,0xaf,0xf6,0xc5,0x9e,0x26,0xe6,0x23,0xcb,0x3e,0x60,0x1e,0x3d,0xa1,0xec,0x59,0xca,0xf1,0x87,0x0e,0xaf,0x47,0x5f,0xab,0x17,0x99,0xbd,0x87,0x1c,0x1d,0x00,0xd6,0xb2,0x59,0x56,0xdd,0x49,0x20,0xb5,0x91,0xf8,0x0c,0xf1,0x80,0xc6,0x37,0x92,0xd7,0x2c,0x02,0x0d,0x47,0x1b,0x1b,0x6b,0x3f,0x60,0xd0 +.byte 0x21,0x9b,0x49,0x47,0x3c,0xaa,0x83,0x44,0x1b,0x92,0x8e,0xec,0x63,0x40,0xd6,0x9a,0x48,0x7c,0x5e,0x97,0xe4,0xf0,0x84,0x36,0x30,0x11,0x0b,0x7c,0x79,0x3b,0xff,0xdf,0x77,0xf6,0xc9,0xdb,0x49,0xdd,0x2a,0xe7,0xca,0x9a,0x5b,0xef,0xd4,0x84,0xe2,0x44,0x8b,0xef,0x4e,0x0d,0x13,0xd6,0xbb,0xba,0x29,0x02,0xae,0xfc,0x55,0x24,0xfa,0x4b +.byte 0x7d,0x71,0xc9,0xde,0x71,0x36,0xbc,0xac,0x31,0x5c,0xf8,0x20,0xdd,0xb8,0xae,0x03,0xd3,0xb0,0xdc,0x27,0x7f,0xc5,0xff,0xda,0x8a,0x36,0x2d,0x8f,0xae,0xbd,0xf8,0x92,0x28,0x8e,0x0c,0xc3,0xaf,0x4e,0x33,0xf0,0x71,0xdb,0xad,0x4d,0xc1,0xef,0x52,0x1c,0x84,0xdc,0x0d,0xf3,0xab,0xb9,0x0b,0xe0,0x18,0xa5,0x06,0xdc,0x78,0x41,0x73,0x35 +.byte 0x95,0x37,0x84,0xba,0xc1,0x4e,0x0a,0xe4,0x4d,0x05,0xfe,0x9d,0x74,0x68,0x4a,0x35,0xf0,0x15,0xaa,0x7b,0xfe,0x08,0x47,0xb2,0x84,0x65,0x1d,0x0d,0x9f,0xe7,0xe0,0x04,0xf9,0x1c,0xac,0x66,0xb3,0x75,0x96,0x8f,0x25,0xb6,0x29,0x53,0x52,0x50,0x7a,0x50,0xd1,0x89,0xc7,0x05,0xfb,0x3a,0xb0,0xfa,0x6b,0x96,0x9d,0xfc,0xb0,0xcd,0x68,0x21 +.byte 0x61,0xf6,0x65,0x64,0xa7,0xc6,0x56,0xbd,0xf0,0x9b,0x4a,0x9a,0xe2,0x8c,0xd8,0x88,0x70,0x82,0x0c,0x87,0x51,0x77,0x23,0xd8,0xd8,0xf8,0x4a,0xfe,0xf4,0x6d,0x3f,0x2a,0x36,0x0c,0x67,0x85,0x43,0x13,0x83,0xd5,0xe9,0x32,0xff,0x8c,0xec,0xd4,0x7f,0xd2,0x32,0x4d,0x4e,0xec,0x76,0x55,0xf9,0x0d,0xb7,0x57,0x6c,0xc4,0xd6,0x22,0xd3,0x6e +.byte 0x71,0x23,0x68,0x45,0x03,0x37,0x27,0x3d,0x56,0x89,0xbb,0x7c,0xf1,0xa8,0x09,0xd6,0xb2,0xc5,0xe6,0xf6,0x72,0x77,0x3e,0xb0,0x8a,0x3d,0x17,0xbd,0xd5,0x0d,0xdb,0x62,0xa7,0x07,0x66,0x35,0x19,0x12,0xff,0xcf,0xdd,0xb3,0x09,0xa3,0x58,0x5b,0x0d,0x87,0x76,0x33,0x28,0x98,0x91,0x48,0xac,0xa1,0x22,0x9f,0xda,0x36,0x03,0x8a,0xc1,0x5e +.byte 0x6c,0x2e,0x42,0x8e,0x1a,0x7d,0x75,0x69,0xb2,0xcf,0xb0,0x14,0x80,0xa8,0x91,0xc2,0xbc,0x24,0x8f,0x25,0x9a,0x9e,0xa3,0x4d,0x46,0x55,0x53,0x05,0x0c,0xf8,0xdb,0xe0,0xee,0xe4,0x32,0xff,0x39,0x74,0x9a,0xa8,0xf7,0xa4,0x6e,0x5b,0x9a,0x89,0x33,0x40,0xf4,0xce,0x54,0x4a,0x18,0xdb,0x11,0xe4,0x83,0x69,0x52,0xef,0x12,0xc6,0x13,0x6e +.byte 0x2a,0x14,0xb9,0x8e,0x38,0x8d,0x6b,0xef,0x02,0xc8,0x66,0xf0,0x78,0xaa,0xa6,0x04,0xa3,0xa5,0x1d,0xdb,0xac,0x02,0x23,0x4c,0x2a,0xa5,0xbf,0x66,0xa4,0x47,0xa9,0x8e,0x50,0xd2,0xf8,0xf5,0x0d,0x0f,0xc9,0x07,0xd8,0x1a,0x94,0x84,0xcf,0xb3,0x56,0x53,0x5f,0x83,0x1d,0x30,0xb6,0x94,0x36,0xf4,0x16,0x72,0x8c,0x6d,0x49,0xe4,0x6d,0x93 +.byte 0xb1,0xa1,0x97,0x70,0x75,0x47,0x3a,0x7e,0xa6,0x39,0x1d,0xf5,0xcc,0x37,0xaa,0x90,0x53,0xe1,0x9b,0xcb,0x9a,0x97,0x7d,0x18,0x4a,0x3c,0x1f,0x05,0xf4,0xe3,0x6f,0x7a,0x19,0x84,0xbc,0x68,0xa4,0x6e,0x5a,0xb5,0x7a,0x51,0xda,0xf5,0x75,0x1e,0xfe,0xb0,0x73,0x43,0x39,0x98,0xb7,0x1e,0x17,0x36,0x35,0x15,0x64,0x90,0xb6,0x83,0x43,0x8f +.byte 0xcd,0xb6,0x8c,0xc4,0xe4,0xee,0x0e,0x1c,0xbd,0x3a,0xe6,0x6e,0x44,0x73,0x88,0x30,0xa0,0xf0,0x97,0xf5,0x5e,0x12,0xea,0xd9,0xd7,0xb5,0xc5,0x1d,0xc7,0xc8,0x55,0xbb,0x2c,0x64,0x43,0x50,0x15,0x71,0x02,0xd3,0xf9,0xb4,0xe7,0x2f,0x0f,0x98,0x9e,0x87,0x40,0x2a,0x61,0x06,0x44,0xc2,0x47,0xaf,0x44,0x4f,0xdd,0xa3,0xb0,0xb2,0x8d,0x8c +.byte 0x83,0x96,0xd3,0x2a,0x38,0xdf,0x87,0x5d,0x1c,0x64,0xc8,0x4f,0x3c,0x41,0xc7,0xf8,0x64,0x58,0xa6,0x9b,0xcb,0xcd,0x77,0xdb,0x38,0xe7,0x30,0xb6,0x91,0x88,0xd8,0x9d,0x29,0x71,0x12,0x9e,0xdf,0x20,0xd9,0x14,0xa3,0xa0,0xbd,0x0a,0x99,0x67,0x0a,0xe1,0xe9,0xba,0xd0,0x1b,0xba,0xc8,0x8d,0x76,0x10,0xe8,0x30,0xa1,0x93,0xf4,0x95,0x6a +.byte 0x12,0xd5,0x95,0x31,0x7f,0xdb,0x33,0xfc,0xbf,0x7a,0xbe,0xe4,0xfa,0x50,0x1b,0x24,0x75,0x9b,0xf8,0x81,0x34,0xc8,0xfb,0xda,0x3c,0x6f,0x3b,0x9a,0xb2,0x6f,0x94,0x0c,0xd9,0xc3,0x05,0xd6,0x96,0x10,0x27,0xdb,0xd6,0x88,0x72,0xe4,0x8f,0xfc,0xd3,0x52,0xf8,0x63,0xb2,0xce,0xf1,0x2a,0xbc,0x1c,0x23,0x9d,0xfb,0x27,0xdd,0x8d,0xe4,0xcc +.byte 0x63,0xcf,0xad,0xe6,0xe9,0x4f,0xb8,0x8a,0x20,0x47,0x75,0x73,0x3f,0x27,0x07,0x5d,0x8c,0x8c,0x6e,0x7a,0x91,0xe2,0xf6,0xd5,0x70,0xd8,0x00,0xe5,0x0f,0xde,0x78,0xd8,0xb4,0xd3,0x18,0x5a,0x24,0x43,0x91,0x0c,0xbe,0x8b,0x1b,0x88,0x48,0x7e,0x94,0x05,0xd0,0xec,0xd2,0x71,0x26,0xc7,0x70,0xeb,0x8a,0x83,0x01,0x52,0xdb,0xe5,0x76,0x31 +.byte 0x19,0x14,0x13,0x90,0x5b,0x5a,0x94,0x89,0xe2,0x4e,0x2d,0x17,0xf6,0xbc,0x67,0xee,0x51,0xd4,0x00,0x83,0xe5,0x18,0xa5,0x54,0x6c,0xd2,0x7a,0x1f,0xdb,0x6f,0xed,0x7f,0x07,0xbb,0x9f,0x3a,0xc2,0x8c,0x04,0xf9,0x9a,0x55,0xe3,0x70,0xf3,0x36,0xfd,0x44,0x05,0xd9,0xf3,0xe1,0x87,0x2c,0x29,0xec,0x30,0x8b,0xb7,0xde,0x27,0xa4,0xcd,0xdf +.byte 0x64,0x0b,0x62,0xdf,0x34,0xa0,0xf5,0xa1,0x69,0xc9,0x0b,0x00,0x81,0xf4,0x03,0x5e,0xef,0xb8,0x26,0x49,0x71,0x5e,0xcd,0x76,0xa2,0x38,0x25,0x1f,0x92,0xc3,0xbf,0xdb,0xb3,0x29,0x37,0x06,0xc5,0xc2,0x3b,0xd8,0xbd,0x55,0xf2,0x7f,0xd5,0xd5,0x34,0x32,0xf1,0xa0,0x92,0x9b,0x1c,0xee,0x6f,0x48,0x40,0x6b,0xd1,0x45,0x09,0x3f,0xaf,0xdc +.byte 0xe1,0xac,0x75,0x9a,0x33,0xf7,0x50,0x4f,0x2c,0x3c,0x30,0x69,0x69,0x84,0xcb,0xe9,0xca,0xdf,0x8d,0x02,0x5d,0x30,0x71,0x99,0x7b,0xd5,0xb2,0x55,0xdd,0x9c,0x2f,0xae,0x11,0x41,0x01,0x6b,0xf7,0x95,0xe3,0xda,0xe3,0xcc,0xa4,0x17,0xd0,0x50,0xf9,0x4c,0x31,0x2b,0x4e,0xf7,0x49,0xbb,0x75,0x8f,0x28,0x19,0x9f,0x89,0x7b,0x78,0x80,0x41 +.byte 0x50,0x5a,0x5c,0x1e,0x82,0x93,0x9f,0x4f,0x61,0x96,0x29,0x0c,0x25,0xb3,0xe6,0xff,0x86,0x90,0x78,0x09,0x04,0xf9,0x2a,0x3d,0xa1,0xd5,0x68,0xa8,0x0d,0xd9,0x41,0x01,0xdc,0x41,0x01,0xff,0x20,0xc0,0x63,0x0b,0x4d,0xd5,0x80,0x78,0x82,0x05,0x51,0x62,0x09,0xf9,0x11,0xbd,0xde,0xc0,0x7d,0x3f,0xf2,0x30,0xfb,0x41,0x68,0x39,0xb0,0xc2 +.byte 0x2e,0x33,0x4e,0xa7,0x85,0x01,0x6b,0xd1,0xf9,0x78,0xef,0xe9,0x7c,0x0e,0xaf,0x13,0x1a,0xf5,0x97,0xde,0xf0,0xbb,0x67,0xf9,0x9b,0xab,0xee,0x86,0x73,0x9b,0x23,0x6c,0x56,0x0d,0xa0,0xda,0x4c,0xff,0x2b,0xc5,0x92,0xdb,0xee,0xbd,0xba,0x3a,0x54,0x21,0xc0,0x5c,0xfe,0x21,0xf1,0xbd,0xac,0xaf,0xa3,0x7a,0x52,0x62,0x15,0x8b,0x8f,0xb5 +.byte 0x82,0xc6,0x1a,0xfb,0x22,0xbc,0xa2,0x05,0x42,0xfe,0xb4,0x12,0x6b,0xad,0xa9,0x76,0xb7,0x6b,0x1c,0xd8,0x34,0x5c,0x7d,0xd5,0xa9,0x0d,0x91,0xf6,0xc1,0x47,0x69,0xbc,0x43,0x8f,0xb7,0xfc,0x84,0x2e,0xa0,0x8e,0x3f,0x52,0x3b,0xbd,0x1f,0x28,0x6b,0xc8,0x13,0x37,0xd6,0x44,0xe9,0x8d,0x08,0x92,0x96,0xe5,0x2c,0x57,0x34,0x59,0x21,0x04 +.byte 0xa8,0xaa,0x56,0x25,0xa4,0xc8,0xae,0x68,0x17,0x9e,0xa4,0xf4,0x42,0x64,0x57,0x4b,0x54,0x85,0x8a,0xd1,0x09,0x09,0x25,0x18,0x05,0xb0,0x09,0x9d,0xd9,0x75,0x21,0xd3,0x75,0x31,0xf8,0x35,0x46,0xc8,0xd4,0x47,0x9d,0x87,0xeb,0x40,0x95,0x19,0x24,0x7c,0x6e,0xe9,0xd5,0x14,0xaa,0xc3,0xbe,0x22,0x18,0xc1,0xa0,0x5f,0x34,0x98,0xc2,0x4d +.byte 0x3f,0xa6,0x09,0x57,0x1b,0x75,0xc6,0x89,0xee,0xf0,0xbd,0xbc,0x1a,0xd3,0xea,0x6e,0x82,0x06,0x90,0x4f,0xbb,0x61,0xac,0xbb,0x3e,0x8c,0x94,0xea,0x69,0x58,0x26,0x2e,0x17,0x78,0xad,0x14,0xa4,0x79,0x14,0xbd,0xc1,0x78,0xf9,0xbb,0x11,0x7e,0x8d,0xbf,0x3e,0xc8,0xc5,0x69,0xd7,0x5a,0x4c,0x4b,0x86,0x25,0x4c,0xe9,0x3a,0xc2,0xd9,0xf8 +.byte 0xbf,0x5e,0x46,0x4f,0xca,0xba,0x25,0x58,0x73,0x82,0x02,0x8a,0x41,0x9e,0x2d,0xa9,0x08,0xb4,0x60,0x2a,0x11,0x2c,0x2f,0x3d,0x5e,0x68,0xd8,0xa9,0x2e,0x1c,0xfa,0xdc,0xda,0xfb,0xfb,0xf3,0xb2,0x66,0xd3,0x57,0xe6,0x09,0xeb,0xe5,0xf4,0xed,0x2d,0xb7,0x3a,0xce,0x69,0x2d,0xb4,0x79,0x1a,0x99,0x9d,0xc8,0x99,0x9f,0x9b,0x78,0xd4,0x8a +.byte 0x73,0xd5,0x89,0x9f,0xda,0xdf,0xd0,0xca,0x6b,0x63,0x5a,0x1e,0xe0,0x2f,0x01,0xa4,0xd0,0x62,0xc0,0x5f,0x4e,0xd9,0xd3,0x47,0xe4,0x68,0x73,0x8c,0x87,0x50,0x91,0xec,0x8e,0x0b,0xa7,0xf0,0x4c,0x32,0x19,0xaa,0x00,0xbd,0xe4,0x20,0xab,0x5c,0x00,0xdb,0x18,0xc0,0xff,0xc1,0xc0,0x8f,0xa2,0x8c,0x47,0x91,0x86,0xde,0xa9,0x09,0xb5,0x86 +.byte 0xcc,0x1d,0x7f,0x4b,0x7d,0x16,0xf6,0x21,0xd0,0xf8,0xaa,0x16,0x20,0xa9,0xac,0x3e,0xef,0x56,0xee,0x0e,0x1d,0xd6,0x44,0x7d,0xa9,0x84,0x41,0x8d,0x69,0x69,0x92,0x74,0x87,0x3b,0x8a,0xbf,0x40,0x29,0x45,0xf9,0xa8,0x52,0x8c,0x99,0x95,0xe7,0x6a,0xcd,0x3f,0x74,0x2d,0xde,0x82,0x47,0x41,0xa6,0xd9,0x5a,0x30,0x6c,0x20,0x98,0x3f,0xfb +.byte 0x66,0x08,0x73,0x68,0xe1,0xcd,0xfd,0x3c,0x4f,0x33,0x6b,0x42,0xa4,0xab,0x78,0x22,0xb5,0xd9,0x6f,0x99,0xcb,0x85,0x6a,0x14,0xb9,0xd3,0x0f,0xfb,0xd7,0x07,0x7b,0xbe,0x6a,0xd9,0xba,0xde,0x98,0xac,0xd8,0xe5,0x40,0xcd,0x59,0x7f,0x88,0x3c,0x4e,0xfa,0xfe,0xbe,0x48,0x21,0xb5,0x40,0xd5,0xc8,0x1e,0x8a,0x56,0xd9,0xec,0x25,0xad,0x5e +.byte 0x31,0xf3,0xf2,0x3d,0x0b,0x56,0xb5,0x20,0x08,0xd3,0x02,0x81,0x93,0x29,0x3d,0xbd,0x0a,0x9c,0x26,0x74,0xdb,0x6b,0x7e,0xd1,0x4a,0x1a,0x1c,0x47,0x49,0x34,0xba,0x08,0x7a,0x6a,0xb3,0xd6,0x3b,0xd0,0x28,0x50,0xa1,0xd8,0x17,0x85,0x61,0xab,0x24,0x22,0xda,0xc8,0xb4,0x1b,0x07,0x2e,0x67,0x77,0x84,0xdc,0x6f,0xfd,0x51,0xa5,0xe8,0x34 +.byte 0x63,0xbd,0xae,0xae,0xc7,0x84,0x1d,0x60,0xc8,0x8f,0xde,0x22,0xfd,0x85,0xb4,0x12,0xb4,0x04,0x5b,0xe7,0xb5,0x58,0xf8,0x56,0x66,0xa3,0xb7,0x1e,0x54,0xd0,0xdb,0x12,0xaa,0x9c,0x89,0x5b,0xfa,0xf4,0xe7,0xe2,0xf4,0x9c,0x08,0xa8,0xbe,0x6b,0xe3,0xce,0x6a,0x88,0xb5,0x74,0xb9,0x49,0xaa,0x7b,0xcd,0xbc,0x17,0x81,0x61,0xe2,0x28,0x6f +.byte 0x4b,0xe8,0xa4,0x55,0xc5,0x1e,0x69,0x21,0x8f,0xfd,0xa8,0xd0,0xb9,0x6f,0x1b,0xfe,0x8c,0x5e,0xf9,0x7d,0xd9,0xc2,0xbe,0x0f,0x6f,0xbd,0xa7,0x94,0x10,0x4e,0xe0,0x5a,0xbb,0xa3,0x40,0x9a,0x5a,0xad,0x10,0x97,0x92,0x3b,0xbd,0xa7,0x75,0x77,0xc6,0xa6,0xde,0x42,0x00,0x3b,0xf7,0xe4,0xf4,0xd7,0xdd,0xaa,0x31,0x1e,0x64,0xae,0x17,0x0a +.byte 0x25,0xa0,0x94,0x5f,0x3c,0xbc,0x3d,0x00,0x00,0xd3,0xba,0x7b,0x98,0x81,0xe1,0xdf,0xba,0x60,0x08,0x2a,0xe5,0x66,0x08,0x3e,0xfa,0x81,0x0a,0x89,0x4e,0xe5,0x3b,0xc3,0xdf,0x21,0x9b,0x54,0xa3,0xb3,0xc3,0xc1,0xce,0xb4,0xaa,0x06,0xee,0x2e,0x34,0x55,0xcc,0x8b,0x0f,0xcd,0x1d,0x1b,0xd9,0x9e,0x59,0xf0,0x93,0xc9,0xba,0x35,0x5c,0x99 +.byte 0xf6,0x86,0x9e,0xe9,0xf8,0x84,0x80,0x05,0x76,0x6f,0x8b,0x38,0xb6,0xe0,0xdf,0x0c,0xb3,0xc7,0x6e,0x62,0x53,0xe4,0x69,0x0a,0xc1,0xcf,0x5b,0x84,0x75,0x78,0x56,0x35,0xa5,0x26,0xc6,0xae,0x76,0x2e,0xc8,0x29,0x8d,0x16,0xd1,0x4f,0x27,0x36,0x22,0x41,0x31,0xfb,0xbe,0xd0,0xf9,0x0a,0x06,0xbf,0x59,0x6e,0x06,0x20,0x0d,0x52,0x66,0x63 +.byte 0x38,0x2a,0xb6,0x15,0x0f,0x51,0x14,0x0b,0xd1,0x63,0x40,0x2a,0xfe,0x88,0x51,0x53,0x5d,0x82,0x4e,0x1b,0x91,0x30,0x7a,0x09,0xec,0xb6,0x53,0x10,0x87,0xba,0x34,0x1f,0x8a,0xf7,0x85,0x31,0x77,0x76,0xba,0x55,0x07,0x6b,0x80,0x5d,0x14,0x23,0x50,0xef,0x07,0x91,0xc5,0x71,0x3a,0x55,0x44,0x9d,0xbf,0xe6,0xab,0xde,0x7c,0xdd,0xe0,0xcb +.byte 0xcc,0xc1,0x78,0xb4,0x8c,0xd1,0x35,0x73,0x80,0x9c,0x44,0xff,0xf8,0x8a,0xaa,0x9a,0x94,0xcf,0xc9,0x51,0xfc,0xa5,0x3d,0x86,0xd6,0x67,0x71,0x1b,0xdb,0x83,0xb2,0x67,0xb0,0x17,0xce,0x13,0x1b,0x7a,0x84,0xc8,0xaf,0x69,0x7e,0xf0,0xab,0xc5,0x8c,0x37,0x12,0x43,0x33,0x5f,0xaa,0xde,0xcf,0x4c,0x73,0x7f,0x6b,0x80,0x18,0x27,0x72,0x62 +.byte 0xe8,0x3d,0x1c,0x94,0x91,0xfa,0x33,0xef,0x13,0x94,0x7f,0xb6,0x53,0xe3,0xd7,0x73,0x05,0x3e,0xe8,0x45,0xde,0x1e,0x1d,0xa4,0x41,0x11,0x0a,0x7f,0x62,0x6e,0x9f,0x9f,0xec,0xe9,0x87,0xe0,0x5d,0xbb,0xbc,0x0b,0x37,0xa2,0xf3,0x68,0x8a,0x24,0xec,0x98,0xe5,0x5d,0xbf,0xa1,0x60,0x2b,0xc2,0x74,0x4b,0x8b,0x85,0x44,0x28,0x02,0xd5,0xb9 +.byte 0xae,0x00,0x37,0x1e,0x0b,0x46,0xe6,0x40,0xf1,0xdc,0xa0,0xfc,0xae,0x04,0x7f,0xb6,0x46,0xa3,0x22,0x79,0x92,0xda,0x89,0xa0,0x38,0xf0,0xa2,0x4a,0x76,0x79,0x0c,0x46,0x4d,0xa9,0xe6,0x75,0xff,0x01,0xb3,0xe4,0x13,0xc2,0x53,0xe9,0x6d,0x1f,0xdd,0x88,0xcf,0x10,0xf5,0x16,0xef,0x05,0x59,0x51,0x15,0x49,0x17,0xda,0xff,0x0e,0xb3,0xb9 +.byte 0xae,0x79,0xc6,0xb1,0x94,0x08,0x09,0x30,0x9f,0x2a,0xfd,0x55,0xc0,0x41,0x8c,0xe5,0x0e,0xee,0xc2,0xa0,0x05,0x36,0x66,0x8d,0x9a,0xcc,0xc9,0xeb,0x1d,0x34,0xc0,0x1a,0x29,0xc2,0xcd,0xb7,0x25,0xd3,0x83,0xf8,0x1e,0xa0,0xf4,0x50,0xd4,0x08,0x0d,0xcb,0x6a,0x2f,0xa5,0x8b,0x30,0x94,0x89,0xea,0x94,0x6c,0x00,0x7e,0x7f,0xb5,0x4d,0x61 +.byte 0xa7,0x9d,0x94,0xcc,0x14,0x8f,0x75,0x1f,0xef,0x2b,0xbe,0x37,0xdd,0x19,0x41,0x2e,0x90,0x36,0x27,0xa5,0xa9,0x6c,0x75,0x8c,0x2d,0xe3,0x97,0x74,0x91,0xf3,0xb8,0xcb,0xcb,0x74,0xba,0xf0,0x57,0x70,0x89,0xee,0x4d,0xc5,0xfe,0x3e,0x60,0xe3,0x5b,0x28,0x36,0x91,0x6f,0xcd,0x6c,0x33,0xb6,0x44,0x0c,0xce,0x81,0xe4,0xdb,0x84,0xbe,0x4e +.byte 0xef,0xb8,0x75,0xf7,0x8b,0xb0,0xb7,0x0d,0x00,0x13,0x54,0x39,0xfd,0x9e,0x86,0x5c,0x59,0xd0,0x84,0x0f,0x97,0xc0,0xf8,0xfa,0x4a,0xcf,0x57,0xb8,0x24,0xf0,0xa8,0x40,0x70,0x9d,0xc4,0xe5,0xc7,0xc9,0xcb,0xb6,0xf4,0x0b,0xb5,0xcc,0xe0,0x90,0x2b,0x42,0x81,0xd6,0x59,0x2e,0x11,0xbd,0xe8,0xf5,0xef,0xa8,0x2b,0xdb,0x93,0x62,0x1e,0xef +.byte 0x3a,0x5f,0xf5,0x47,0x15,0x1f,0x03,0x6f,0x40,0x85,0xff,0x50,0x89,0x2e,0x72,0x8f,0x5c,0x0d,0x61,0x84,0x8d,0x8a,0x8f,0x2a,0x47,0x7c,0x97,0xfe,0x8a,0x97,0x6c,0xd5,0x1c,0x97,0xfa,0x59,0xbe,0x2c,0x0f,0x4d,0x85,0x7f,0x18,0xe3,0xea,0xe8,0xde,0x5a,0xf3,0x67,0xe1,0x71,0x7e,0x81,0xa3,0x74,0x0d,0xf4,0x3d,0x5a,0xec,0xc1,0xcf,0x6f +.byte 0x08,0x0f,0x5a,0x63,0x72,0x0b,0x46,0x5d,0x38,0x80,0xea,0xb7,0x12,0x5d,0xce,0x37,0x26,0xaa,0xd3,0x0d,0x93,0x4a,0x34,0x20,0xd5,0x51,0x54,0x1c,0x5e,0x53,0xa9,0xed,0x26,0x3c,0x29,0xaf,0xbe,0x73,0x34,0xa5,0xc3,0xbf,0x8c,0x8a,0xc3,0x30,0x89,0xaf,0xa9,0x2d,0x28,0x35,0x7d,0x6b,0x84,0x23,0x22,0xee,0x8c,0x82,0x04,0xbd,0x26,0x52 +.byte 0x26,0x73,0x76,0x05,0x35,0x0c,0xec,0xf7,0x54,0xb2,0x17,0x68,0xe9,0x68,0x67,0xbb,0x0d,0x98,0x19,0x32,0xa7,0xdb,0xf9,0xef,0x42,0xe7,0xc2,0xe2,0x39,0x9c,0xae,0xbb,0xdb,0x91,0x28,0x82,0x88,0x23,0x61,0x50,0x6d,0x61,0x39,0x73,0xf8,0x6a,0xee,0xf3,0xa9,0x2c,0x78,0x0d,0x5a,0xed,0xb1,0x08,0x8f,0x24,0xe5,0xb7,0xa4,0xdf,0x65,0x9a +.byte 0x72,0x3a,0x39,0x9c,0xf4,0x43,0xdc,0x8a,0xa3,0x3d,0xb5,0x1e,0x7b,0xe5,0x83,0x11,0x07,0xab,0x62,0x7e,0xac,0xab,0x52,0x94,0x0b,0xaf,0xdf,0x54,0x18,0xf1,0xc0,0x9f,0x1c,0x33,0x02,0xd9,0x62,0xc3,0xcc,0xaf,0x32,0x09,0x35,0x77,0xad,0x72,0xd6,0xb5,0x2d,0xaf,0xf9,0x39,0xfb,0x95,0xbb,0xf9,0x84,0x80,0x84,0xc8,0xc6,0x6d,0xb5,0x79 +.byte 0x25,0xf4,0x6c,0x71,0x26,0xda,0x74,0x86,0xad,0x52,0x47,0x8b,0x46,0x32,0xf6,0x2c,0x89,0xdb,0x93,0x1f,0x46,0x83,0x91,0x19,0xd2,0x0c,0x29,0x97,0x5f,0xa9,0x2b,0x87,0x0c,0x87,0x89,0xe6,0x63,0xa1,0x36,0xfb,0xfa,0xb4,0xb8,0x8e,0x5f,0xe9,0x8f,0x62,0xd2,0x81,0x1d,0x7b,0xc6,0x14,0x37,0x56,0x73,0x64,0x3d,0x0a,0xfd,0xe5,0x94,0x01 +.byte 0x09,0xc8,0x0d,0xa8,0x92,0xda,0x43,0xc4,0x41,0xca,0x3c,0x27,0x2c,0xbb,0xc4,0xb2,0x77,0x13,0xa6,0xb0,0x0e,0x97,0x6a,0xb2,0x83,0xe5,0x5e,0xa3,0xc0,0xe8,0x5e,0x0b,0xe6,0x00,0x04,0x6c,0x1b,0xac,0x84,0xab,0xd3,0xac,0x5f,0x39,0xc2,0xf8,0xfd,0x66,0xf7,0x97,0xd7,0xb9,0x6b,0xd8,0x2a,0x49,0xf7,0x67,0xd8,0xd5,0xa4,0x89,0x57,0xa6 +.byte 0x8f,0x7c,0xcf,0xaf,0xfe,0x3c,0x92,0xc8,0x23,0x2c,0x26,0x83,0x86,0x16,0x97,0x34,0x71,0x3e,0x82,0x2b,0xc7,0x75,0x5a,0x59,0xb3,0x44,0xdd,0x4e,0xd4,0x6d,0x1b,0x9f,0x3c,0x35,0xc4,0xe4,0xf2,0x95,0xb6,0x90,0x95,0xa7,0xc4,0x03,0x10,0x7d,0x3d,0xeb,0x74,0x29,0xaa,0x0c,0xd3,0x27,0xcd,0x3a,0x85,0x3c,0x88,0xd5,0x9a,0x46,0x84,0x8e +.byte 0x36,0xde,0xe3,0x6a,0x27,0xbf,0xc3,0xd0,0x3e,0xa3,0x0e,0x62,0x1f,0xdf,0x4c,0x02,0xa7,0x11,0x91,0xb0,0x6b,0x50,0xc1,0xe0,0x18,0x5a,0xc0,0x10,0xc7,0x1c,0xb6,0x36,0xac,0xe7,0x7d,0xad,0x34,0x63,0x4f,0x17,0xcc,0x41,0x30,0xec,0xd7,0x14,0xb9,0xfe,0x07,0x5c,0x3d,0xbe,0x08,0x77,0x5b,0xdf,0xa3,0x20,0x56,0x55,0xa2,0x8a,0xe7,0x0d +.byte 0xf6,0xfc,0x91,0x37,0xb8,0x92,0x6c,0xd9,0x5c,0xb0,0xc2,0xf7,0xc0,0x38,0xfa,0x54,0xc6,0xa1,0xd3,0x4d,0xae,0x49,0x0d,0xd1,0xc0,0xef,0xbe,0x27,0xce,0x23,0x8e,0xf2,0x9b,0x68,0x02,0x67,0x8f,0x53,0x9d,0xf6,0x23,0x57,0x85,0xdd,0x8d,0xd7,0xcb,0x47,0xf1,0xd8,0x17,0xd8,0x46,0x72,0x28,0x4b,0xac,0x94,0xd3,0x5d,0x53,0x4f,0x06,0x19 +.byte 0xc6,0x0e,0x0b,0x9f,0x58,0xc6,0x3f,0xea,0x4e,0x83,0x5e,0xd3,0xcc,0x44,0x55,0xa3,0xc7,0x24,0x19,0xea,0x1b,0x18,0xc1,0x18,0x5f,0x21,0x67,0x73,0x32,0x4e,0x31,0x69,0x05,0x40,0x79,0x7c,0x05,0x13,0xdd,0x50,0xea,0xfa,0xc2,0x26,0xe2,0x33,0xff,0x34,0x0d,0xda,0x77,0x27,0xe0,0xe7,0xa6,0x7b,0x8e,0xcd,0xdb,0x92,0x48,0x3a,0x2d,0x52 +.byte 0xf5,0x59,0xca,0xc7,0x47,0xda,0xb7,0xc7,0x8c,0x37,0x5e,0x29,0x30,0xf5,0x57,0x74,0x8b,0x10,0xcb,0x20,0x31,0x4b,0x12,0xe3,0x84,0xd2,0xb2,0xc3,0xd0,0xe3,0x94,0x18,0xa2,0xdc,0x8f,0x4d,0xc3,0x0a,0x43,0x07,0x2c,0x6b,0x41,0x64,0xc0,0x35,0x8f,0x37,0x9b,0xd7,0x78,0xab,0xd0,0xdc,0x1f,0x77,0x55,0xab,0x71,0xc8,0x99,0x98,0x00,0x29 +.byte 0x1c,0xab,0x3c,0x5f,0x82,0x96,0xc2,0xc8,0x9b,0xd4,0x68,0x3f,0x3d,0xe6,0x5a,0x4c,0x1c,0x7b,0x51,0xa3,0x79,0xe8,0x0e,0x8a,0x78,0xdc,0x98,0x63,0x80,0x74,0x32,0x9d,0x7c,0x3a,0x79,0x54,0xa7,0x4c,0xa4,0x4e,0xfc,0xa5,0x8a,0xa4,0x19,0xce,0x84,0xbb,0x8a,0xb9,0x93,0x4a,0x2d,0x82,0x5d,0x1d,0xf8,0x2f,0x85,0xb3,0x90,0x32,0x61,0x6d +.byte 0x13,0x33,0xac,0xbc,0x5d,0x3a,0x54,0x45,0x04,0x50,0x30,0x30,0xc7,0x58,0xbe,0xed,0xdd,0xa1,0xae,0x6d,0xe5,0xde,0xed,0x63,0x9f,0xd4,0x2b,0x8d,0x1f,0x69,0xde,0xda,0x55,0x3f,0x3b,0xe7,0xc8,0x73,0xc0,0x68,0x18,0x6a,0xb3,0xfb,0xce,0xaf,0x46,0x0a,0xcc,0x81,0xa8,0x96,0x6d,0xb6,0xa4,0x74,0xf3,0x8c,0x95,0x2d,0xa1,0xfe,0x09,0xb8 +.byte 0xdb,0x3c,0xcd,0xdc,0x5b,0x0e,0x2d,0xff,0x89,0x8a,0xfd,0x7a,0xe9,0x69,0x0b,0xdd,0x4e,0x9b,0x94,0x64,0xe4,0xb6,0x5d,0x69,0xef,0x9c,0xf6,0xe6,0x44,0x73,0xd5,0x86,0x47,0x63,0x77,0x3e,0x74,0xaa,0xf3,0x6b,0x1f,0x37,0xbf,0xef,0xa2,0xff,0x86,0x61,0x78,0xc4,0xb5,0xbd,0x5a,0x43,0x49,0x80,0x16,0xf2,0x4c,0xec,0x1e,0x07,0x0f,0x41 +.byte 0x60,0x6f,0x3a,0xd2,0xab,0x85,0xc0,0x5c,0xfc,0x9f,0x48,0xad,0x5e,0xe0,0x7d,0x66,0x8e,0x46,0xf1,0xc3,0xb0,0xbc,0x5e,0x3b,0x10,0x7c,0xfc,0xa3,0x27,0xbd,0x8f,0xae,0xd9,0x61,0x39,0xbf,0xca,0x27,0xbb,0xe7,0xda,0x59,0xa8,0x63,0x38,0x16,0xd9,0xb5,0xa6,0xd9,0x1c,0x2b,0xa1,0x42,0xec,0x50,0xd7,0x63,0x09,0x22,0xe0,0x0c,0xb8,0xec +.byte 0x12,0x9b,0xdb,0x8a,0xd3,0x02,0xcf,0x32,0xa9,0x88,0xa4,0x31,0xc8,0xa9,0xf4,0x03,0xf2,0x9d,0xe1,0x41,0xf0,0x0f,0x23,0x65,0xa8,0x99,0x55,0x87,0xf2,0x17,0x66,0xf0,0x94,0xe8,0xe9,0xb6,0xfd,0x10,0xb9,0x55,0xf4,0xda,0x06,0x7a,0xbe,0xe2,0xd3,0xfa,0xb8,0xf7,0x85,0xdf,0xee,0x39,0xdc,0x0f,0xda,0x87,0xf5,0x66,0xd8,0x1b,0x5c,0x0c +.byte 0x13,0xe8,0xa2,0xcd,0xdf,0x47,0x33,0xd7,0xf4,0x5c,0x79,0xc7,0xf4,0x68,0xe4,0x2d,0xa1,0xde,0x5c,0x06,0x1c,0x85,0xf1,0x2a,0xf9,0x73,0x44,0xbc,0xd3,0x57,0x4f,0x0f,0xcd,0xcc,0x40,0xeb,0x9d,0x35,0x8e,0xdf,0x1d,0x4a,0x61,0xd0,0x66,0xb5,0x16,0xce,0x45,0xc0,0xbf,0x01,0xe3,0xb2,0x51,0xba,0x53,0x18,0x2a,0xff,0x19,0xea,0x41,0xa2 +.byte 0xac,0x0b,0x50,0xd3,0xc1,0x6a,0x9c,0xb0,0x34,0x6f,0xa0,0xcb,0xc7,0xc6,0x79,0x5d,0x17,0x3a,0x4c,0xa3,0x16,0xdc,0xac,0x10,0xf0,0x24,0xad,0x9a,0x5b,0xa9,0x7e,0x45,0xcd,0xe9,0xad,0x87,0x04,0xbc,0x2a,0x05,0x59,0xd1,0xdb,0x86,0x22,0x40,0xdf,0xb1,0xff,0x8d,0x3c,0xf8,0x6a,0xf3,0xcb,0x60,0xf9,0x35,0xa6,0x42,0x81,0xcb,0x0f,0x7c +.byte 0xf7,0x24,0x3b,0x0c,0x94,0x32,0xd9,0xec,0xcf,0xd1,0x31,0x3e,0x3e,0xeb,0xa9,0xf2,0x1f,0x2d,0xa7,0x89,0xf7,0x67,0x7d,0x90,0x9d,0x40,0xf2,0xdb,0x07,0x8f,0xb8,0x6f,0xfd,0x78,0x6e,0xd0,0x9e,0xd5,0x7d,0xb0,0x7d,0x65,0xdc,0x6e,0x50,0xec,0x7a,0x5c,0x2c,0x3e,0x6f,0x64,0xa3,0x10,0x34,0xf7,0x71,0xc8,0x82,0xb6,0x96,0xb8,0xb1,0x2a +.byte 0xb4,0x03,0x95,0x75,0x90,0xac,0x6c,0x81,0x17,0x97,0x06,0xd0,0xb8,0xc5,0x98,0xc5,0x9e,0x46,0x07,0x13,0x02,0x9e,0x47,0x69,0xba,0x85,0x2d,0x09,0x86,0x50,0xe4,0x76,0xb1,0xa2,0xbe,0x8b,0x91,0x6b,0x3b,0x76,0xa3,0xb7,0xf5,0x7f,0xfe,0xf1,0xa4,0xf3,0xc3,0x53,0x64,0xef,0x97,0x86,0x96,0x8b,0xc4,0xae,0x06,0x8b,0xe8,0x3c,0xdc,0xff +.byte 0xfa,0xad,0xcb,0xcb,0x53,0x15,0xf2,0xcc,0x9f,0x48,0xf9,0x57,0x6a,0xcd,0xb2,0xee,0x46,0xc0,0xbf,0x82,0x58,0x60,0xda,0x2f,0xbd,0xde,0xc7,0x41,0xcb,0xf1,0x38,0x56,0x9d,0x38,0x38,0x3d,0xea,0x5e,0x38,0xf1,0xd0,0x02,0x35,0xee,0x4c,0x2f,0x1d,0x19,0xbd,0x08,0x01,0xc3,0x8f,0x75,0xe2,0xf3,0x93,0xbb,0x76,0x6b,0xd7,0x87,0x76,0x7f +.byte 0x3b,0x29,0x08,0x9f,0x3a,0xa5,0x44,0x96,0x5a,0xb3,0x78,0xa9,0xbe,0xf7,0x5d,0xda,0x06,0x37,0x98,0x5d,0xbe,0x6e,0xec,0x58,0x53,0xd1,0xa5,0xd7,0x7a,0x16,0xb1,0x59,0x98,0x42,0x37,0x76,0x1b,0xd6,0x2e,0xa7,0xdc,0x45,0xa6,0x9c,0x9c,0x99,0x24,0x0e,0x22,0xae,0x94,0x65,0xeb,0x4e,0x64,0xc3,0xb0,0xac,0x19,0x41,0xf1,0x62,0x65,0xb2 +.byte 0x35,0xf5,0x2f,0xdb,0xd2,0xf0,0x78,0x19,0x35,0x04,0x6f,0x9c,0xf4,0xaf,0x81,0x68,0x4f,0x8b,0x85,0xfa,0x31,0x23,0x06,0xeb,0x37,0x86,0x43,0x51,0xb3,0xd2,0x2a,0xd7,0xd5,0xa9,0x33,0xba,0xfd,0xb5,0x0e,0x6d,0x9a,0x91,0xf9,0xe7,0x27,0xb7,0xff,0xe6,0xe7,0x34,0xc5,0x1a,0xa3,0x45,0x3b,0x71,0x34,0x87,0x7e,0xe7,0xab,0x74,0xc5,0xff +.byte 0xeb,0x23,0x8f,0x3f,0x5d,0x1c,0x91,0x47,0xeb,0x3e,0x5f,0x5a,0xa6,0x5a,0xde,0xa9,0x5f,0xf4,0x8f,0x95,0xc6,0x25,0x3c,0xd5,0xaf,0xfd,0x4d,0x33,0x68,0xe1,0xa3,0x51,0x1b,0x07,0xad,0xb9,0xec,0xf1,0x50,0x51,0xbf,0xeb,0xe8,0x58,0x2a,0x50,0x0e,0x9d,0xc2,0x8a,0x83,0x8c,0xb0,0xb8,0xde,0x1d,0x7b,0x0f,0xff,0xfc,0xfc,0x31,0xe5,0x62 +.byte 0x40,0xc8,0x28,0x30,0x31,0xc9,0x82,0xab,0xbe,0x50,0xe5,0xfe,0x1f,0x49,0x17,0xf9,0xea,0x23,0xc7,0x6d,0x8d,0x63,0xc3,0x70,0x40,0x32,0x0b,0x48,0x7a,0xd9,0x03,0x52,0x1b,0xf4,0x90,0xd6,0x6d,0xd2,0xfc,0xec,0x24,0x7f,0x21,0x2e,0xd4,0xb5,0x60,0x44,0xd9,0x83,0xb0,0x3e,0x75,0x8a,0x6a,0x09,0xab,0xa8,0x4f,0x48,0x3c,0x2b,0x89,0x30 +.byte 0x29,0xdb,0x1a,0x8e,0x68,0xe4,0x89,0xed,0x10,0xe8,0x46,0xa7,0xf9,0x5f,0x7d,0x42,0xe0,0x8d,0xbc,0x3d,0x4d,0xd8,0x06,0x4a,0xf9,0xbb,0x97,0xa7,0xdb,0x24,0x0b,0xfc,0x49,0x92,0x5d,0x80,0xf8,0xed,0x57,0xc7,0x1e,0x82,0xed,0x41,0xb8,0xfd,0x71,0xb9,0xa5,0x11,0x52,0xdd,0x1e,0xa4,0xf1,0x02,0xc7,0x54,0x7c,0xdc,0x37,0x9f,0xfe,0x37 +.byte 0xe8,0xa5,0xcf,0xb0,0x3d,0x25,0x3f,0x24,0xfe,0xf2,0x63,0x97,0x3c,0x13,0xdc,0x31,0x78,0x07,0xf1,0x8e,0xee,0xc6,0x00,0xf8,0xfd,0x84,0x53,0x4d,0x92,0xa1,0xef,0xd0,0xb1,0x12,0x0a,0x12,0x91,0xeb,0x52,0xdd,0x6e,0x15,0x98,0xd2,0xe1,0x53,0x7a,0x0e,0x02,0x83,0xd3,0xd1,0xde,0x72,0x6e,0x5b,0x4b,0x8d,0x40,0xe3,0x2d,0x22,0x59,0x9d +.byte 0xee,0xbe,0x43,0x18,0x62,0x8c,0x77,0x18,0x91,0xf5,0x9e,0xbc,0x3e,0x8b,0x77,0xb6,0xdb,0x5c,0xcb,0xcd,0xdb,0x36,0xea,0xf5,0x1d,0x9b,0xa7,0x13,0xef,0xda,0xd0,0xe8,0xd8,0xb2,0x4c,0xc6,0x19,0x3d,0x77,0x2d,0x0d,0xad,0xe4,0x32,0x24,0xe9,0xd4,0x7f,0x72,0x1d,0xc6,0x6e,0x83,0x7d,0xb8,0x62,0x64,0x9d,0x9a,0xd7,0x13,0x93,0x92,0xf1 +.byte 0x37,0x98,0xcf,0x44,0x66,0xab,0xd1,0x61,0x6c,0x08,0xa7,0x41,0x4e,0x37,0xc1,0x67,0xfb,0x7c,0x22,0x8f,0xbd,0x93,0xb2,0x09,0x13,0xa0,0x48,0x60,0xaf,0xda,0x73,0x2b,0xa3,0x2a,0xf3,0x4d,0x8e,0x22,0x5b,0x7a,0x32,0xe6,0xca,0xff,0x0e,0xa1,0x0a,0x15,0x33,0x31,0x50,0x71,0x1c,0x85,0x26,0x9b,0x19,0xf2,0xe3,0x69,0x4e,0x2d,0xff,0x79 +.byte 0x80,0xfe,0x2c,0x2f,0x7a,0x49,0x95,0xf3,0x0e,0x78,0xb1,0x0c,0x1c,0x45,0x59,0x68,0x2a,0x37,0xf2,0x48,0x6f,0xd9,0x32,0xf7,0xfc,0xdc,0xbe,0xe3,0xdd,0x61,0x17,0xc0,0x08,0x9d,0xbc,0x2d,0x8d,0x24,0x1c,0xbb,0x53,0xbe,0x37,0x59,0x30,0x87,0xa0,0x14,0xf5,0x08,0xcf,0xd1,0xcc,0x84,0xa7,0x0f,0x69,0xe0,0x77,0x8c,0x0d,0xdc,0x82,0xe5 +.byte 0x88,0x9a,0x58,0x05,0xe3,0x4f,0xdd,0x55,0x1e,0x6e,0x90,0xd5,0x3c,0xa6,0xa6,0x10,0x24,0xe5,0x58,0x97,0xdc,0x31,0x87,0x39,0xdc,0x3a,0xe6,0x24,0x64,0x23,0x45,0xd8,0x01,0x1b,0xf6,0x38,0x68,0x9e,0x62,0x53,0x00,0x97,0x71,0x04,0xb5,0x3b,0x54,0xdb,0xb5,0xcb,0x30,0x91,0x14,0xce,0x94,0xd5,0xe0,0x96,0x70,0x99,0xa5,0xed,0x69,0x32 +.byte 0xc7,0xb7,0x14,0xff,0xc0,0xde,0x19,0x5d,0x31,0xdb,0xa7,0xc0,0x7a,0x94,0xec,0x60,0xfc,0x52,0x71,0x69,0x9b,0xd8,0xbe,0x97,0x0b,0xb5,0x70,0xa7,0x47,0x11,0x37,0x84,0xda,0x3c,0x23,0xfe,0xf2,0x53,0xad,0x55,0x71,0x1e,0x70,0x9b,0x7b,0x61,0x97,0xf8,0x71,0xc4,0xad,0x72,0x98,0x43,0x0c,0x33,0x30,0x2c,0xb2,0xd6,0x21,0x8d,0xbb,0x1b +.byte 0x85,0x82,0x24,0x14,0x85,0x95,0x88,0xff,0x3f,0x8c,0x88,0x96,0xa0,0xf8,0xd7,0x36,0x78,0x37,0x6d,0x92,0x09,0x04,0x76,0x27,0xb9,0xd5,0xea,0x0f,0x07,0x9f,0xe1,0x49,0x0e,0xd1,0x9c,0x46,0xcd,0x2b,0x7a,0x57,0xb6,0x56,0x39,0xe5,0x59,0x6b,0x1b,0x39,0xbf,0x15,0x3b,0x56,0xf5,0xc2,0x08,0x96,0xf5,0x63,0x4c,0x31,0x33,0x65,0x8b,0x74 +.byte 0x4e,0xde,0xa8,0x20,0xe0,0x7c,0x27,0xee,0x91,0x74,0xe8,0x24,0xb3,0xcf,0xa3,0xd4,0xf1,0xb9,0x18,0x43,0x05,0x5d,0x13,0x36,0x82,0xd1,0xbf,0x16,0x89,0x48,0x83,0xf0,0xcc,0x5c,0xbb,0x75,0x7e,0x71,0xc0,0x73,0xd1,0xf5,0x00,0x38,0x7f,0x10,0x98,0xd6,0xb9,0x14,0xea,0xd3,0x3f,0x0f,0xe3,0x61,0x1a,0x5e,0x21,0xd0,0x11,0x58,0x68,0x47 +.byte 0xf2,0xe5,0xe9,0x65,0x9a,0xc1,0xf4,0xa0,0x98,0x8e,0x9f,0x7f,0xbe,0x7e,0xd0,0xb6,0x88,0x4e,0xce,0xc1,0x8b,0xd4,0xd3,0x93,0xb7,0xd8,0xf3,0x0b,0xf3,0x73,0xc9,0x08,0x2f,0xcf,0xd8,0xbd,0xa6,0x1d,0x7c,0xfa,0x44,0x82,0x9f,0x03,0xca,0x56,0x3b,0xbf,0x4d,0x1e,0xbc,0x06,0xc2,0x37,0xfb,0xde,0xd3,0xa9,0xe3,0xae,0x61,0xef,0x26,0x7d +.byte 0xbd,0x2f,0xee,0x2d,0xe1,0x65,0x71,0x77,0xab,0x9c,0x96,0x4f,0x00,0xe2,0xde,0xd7,0x05,0x54,0x00,0xb6,0xaf,0x12,0x0c,0x79,0x1a,0xed,0x20,0x72,0xc7,0x3b,0x3a,0x10,0x15,0x74,0xff,0xbd,0xf8,0xaa,0x8f,0x3a,0x83,0x39,0x24,0xfa,0x53,0x2d,0xc3,0x61,0xfc,0x12,0x6b,0x54,0x33,0xbf,0x83,0xc9,0x59,0x00,0xf0,0xdc,0xa8,0x64,0xbc,0xb5 +.byte 0xc3,0x96,0x60,0x3e,0x7b,0xe2,0x08,0x19,0x92,0x17,0x80,0x9b,0x0c,0x09,0x49,0x68,0x8b,0x15,0xe3,0xce,0x0c,0xfa,0x0c,0x8b,0xf0,0xdc,0x58,0xb0,0x7b,0x82,0x85,0xd2,0x56,0x1c,0xfb,0xb5,0xd0,0x0e,0x0a,0x55,0x61,0xda,0xd8,0x20,0xc1,0x79,0x70,0x3c,0x69,0x8e,0x49,0x5f,0x1c,0xdb,0x22,0xb8,0xdd,0x4c,0x4f,0xca,0xe9,0x0f,0x9a,0x4e +.byte 0xff,0x56,0xbc,0xcf,0x72,0x09,0xa6,0x41,0x38,0xf0,0x7d,0xe7,0x45,0x0a,0x71,0x2c,0x92,0xdd,0x21,0x17,0xb2,0x3b,0x31,0x3c,0x91,0x11,0x69,0x29,0x50,0x31,0xe6,0xa6,0x10,0xc7,0x35,0xe8,0x44,0xec,0x74,0xa3,0x7e,0xb6,0x34,0xe5,0xb7,0xba,0xdf,0x5b,0x2f,0x85,0x02,0x6c,0xb0,0x71,0xb1,0x43,0xff,0x0e,0x47,0x04,0x63,0x4d,0x5b,0x81 +.byte 0x81,0x28,0x8b,0x84,0x79,0xad,0x2a,0x45,0x00,0x1c,0x0c,0x9f,0xef,0x35,0xbb,0x6d,0xc5,0x6a,0x6b,0xef,0x2b,0xae,0x78,0x66,0x05,0x7a,0x61,0x4c,0xe9,0x5e,0xf7,0x95,0x66,0x7e,0x1a,0xa7,0xdf,0x4c,0x4d,0x7c,0x66,0xa5,0x38,0x84,0x86,0x8d,0x66,0xcc,0x7f,0x32,0xb2,0x9c,0xc5,0x0d,0x3d,0xb7,0xb1,0xa6,0xc5,0x80,0x68,0xaf,0x79,0x81 +.byte 0x15,0x8f,0xec,0x50,0x5c,0x1b,0x57,0x31,0xd2,0xb9,0x16,0x66,0xf8,0x16,0xfd,0xcd,0xc7,0xa8,0x84,0x6f,0x35,0xea,0x3f,0xa4,0x72,0x8d,0xad,0xf4,0xd1,0x14,0x46,0xcc,0x06,0xed,0x71,0x39,0x07,0x99,0x28,0xc8,0xf9,0xc4,0xc2,0xec,0xde,0xb8,0x92,0xae,0xc5,0xf8,0xb2,0x49,0xc9,0x32,0x58,0xec,0x9f,0xb0,0x59,0xaf,0x49,0xef,0xe8,0x0d +.byte 0x4c,0x56,0x8d,0xf7,0x57,0xb0,0x09,0xbe,0xc2,0x6a,0x62,0xc4,0x87,0xf3,0x20,0x07,0xc9,0xe3,0x3b,0x31,0xcc,0x8d,0xcf,0x5d,0x18,0x00,0x2a,0x9f,0xde,0x80,0x1a,0x7e,0x95,0x93,0xd1,0xbd,0xe6,0xd4,0x69,0x37,0x96,0xbb,0x70,0xc5,0x3c,0x87,0x8f,0xff,0x95,0x97,0xfe,0x95,0x56,0x7b,0xba,0x03,0x3d,0x29,0x0f,0xdb,0xd0,0x65,0x4f,0xf8 +.byte 0xa8,0xf3,0x42,0x09,0xb5,0x81,0x34,0xc6,0xa9,0x60,0xb9,0xef,0x3e,0x9d,0xc5,0x42,0x1e,0x79,0x5d,0x2b,0xf2,0x46,0x0d,0xeb,0x88,0x84,0x8f,0xad,0x60,0x69,0x57,0x49,0x33,0xb4,0xdd,0xfe,0x10,0x65,0x65,0x51,0xaf,0x68,0xa0,0xce,0xbd,0xe1,0x6e,0x03,0xe1,0x5f,0xba,0x3f,0x36,0xca,0xed,0x20,0x95,0xfa,0xff,0x3c,0x65,0xa8,0xb1,0x6b +.byte 0xc5,0x91,0xa0,0xd5,0x36,0x38,0x1c,0x38,0xe9,0x1d,0x1b,0x67,0x4c,0x17,0xd3,0x29,0x92,0xa2,0x27,0x76,0x3d,0xe2,0x26,0x37,0x2a,0x2c,0xf6,0xee,0x64,0x40,0x8a,0x1c,0x2b,0xc1,0xd3,0x28,0xd0,0xcf,0x2d,0xc2,0x45,0xf4,0x37,0x5a,0x63,0xfb,0x18,0x67,0x01,0x0a,0xe8,0xe2,0x41,0xf7,0x15,0x47,0xa7,0xe9,0xc8,0x05,0xbc,0xc7,0x8f,0xf0 +.byte 0xc3,0xc5,0x9a,0x4e,0x0d,0x7b,0xf0,0x20,0x8c,0x21,0x49,0x99,0x0d,0xf7,0x34,0x84,0x35,0xfb,0x11,0x33,0xd6,0x46,0x14,0x3c,0xf1,0xb3,0x37,0xac,0x75,0x63,0xe7,0x1a,0x19,0xa4,0x49,0xf2,0x58,0x1d,0x56,0x55,0x64,0x46,0x25,0xff,0x7d,0x90,0x34,0x21,0x5d,0x00,0xa1,0xa8,0xaa,0xe0,0x93,0xe7,0xda,0x11,0x34,0x1d,0xa3,0x0c,0x67,0xae +.byte 0xf5,0x60,0x72,0x14,0xdf,0x08,0xf6,0x72,0x3e,0x48,0x41,0x3d,0x00,0x58,0xfb,0x0c,0x15,0x80,0x2d,0xd9,0x72,0x47,0xa6,0x20,0x6a,0x74,0x9e,0x06,0xb9,0xac,0x68,0x3a,0xe7,0xf1,0x19,0xb8,0x0b,0x66,0x07,0x4d,0xa0,0xb5,0xab,0xea,0x70,0xa1,0xdf,0x41,0x76,0x85,0x18,0x5b,0x6f,0x78,0x5a,0x5d,0x08,0xe0,0x1b,0xd8,0x06,0x73,0x1e,0x16 +.byte 0xcb,0xdb,0x02,0xf8,0x96,0x64,0x65,0xc5,0xc1,0x52,0xd4,0xd8,0xb3,0x1e,0xd4,0x09,0xfd,0xa7,0x30,0x41,0x5a,0xce,0x53,0x4d,0x11,0xc8,0xdd,0x13,0x50,0xd5,0x2e,0xa0,0xe6,0x48,0x49,0x31,0x4b,0x1d,0xce,0xfc,0x42,0xed,0x8f,0xc8,0xb3,0x0a,0xae,0x1d,0x4c,0x1e,0x4f,0x39,0xa4,0x37,0xc8,0x54,0xdf,0x40,0xa6,0x42,0x61,0x7d,0x34,0xd4 +.byte 0x75,0x0a,0x9f,0xf0,0x33,0x54,0xf3,0xc4,0xdc,0x4e,0x2f,0x81,0xc2,0x20,0xaa,0x4f,0xa0,0xae,0xa6,0xb8,0x50,0xf8,0x45,0xf1,0xf2,0xd1,0xd2,0xcf,0xc8,0xf0,0xf4,0x54,0x37,0xdc,0xfb,0x13,0xdf,0x38,0xc2,0x3f,0xe0,0x59,0xb5,0x9a,0x0f,0x27,0x87,0xd4,0xd3,0xdc,0xfd,0xda,0x1d,0xfa,0xdd,0x12,0xe0,0x7f,0x34,0x01,0xde,0x28,0xf5,0x0e +.byte 0xff,0x59,0xc7,0xbd,0x6a,0xe4,0x0c,0x85,0x7b,0x87,0xf9,0xd7,0xe2,0xed,0xb2,0xf7,0xb7,0x13,0xfb,0xfc,0x4d,0x25,0x52,0xfd,0x23,0x6b,0x10,0xd0,0x80,0xd8,0xbd,0xbd,0xf0,0x87,0xfc,0x38,0x85,0x83,0x20,0x5f,0x7c,0x26,0x14,0x93,0xd3,0xe1,0xdc,0xa4,0xda,0xa7,0xf9,0xfd,0x6c,0x9a,0x2b,0x75,0x82,0xf1,0x9f,0x1b,0x0c,0x43,0xd4,0x2d +.byte 0x5b,0x0c,0x54,0x7e,0x61,0x24,0x8e,0x50,0x25,0xd8,0x54,0xfd,0x30,0xec,0x4c,0xa8,0xb6,0xf0,0x35,0x67,0xf7,0xe4,0x3c,0xfd,0xc8,0x40,0xf4,0x2d,0xc5,0x4d,0xc3,0x29,0xc2,0x88,0x60,0xab,0xd9,0x2a,0xe8,0x31,0xcc,0x0c,0x9f,0x97,0xa8,0x2e,0xaa,0xa5,0xb6,0xee,0x3c,0x71,0xa9,0xff,0x90,0xb4,0x43,0x2e,0x16,0x80,0x8c,0xfe,0xb5,0x7a +.byte 0x40,0x58,0xd5,0x98,0x7e,0xca,0xaf,0x95,0xee,0x00,0x26,0x8d,0x5b,0xba,0x33,0xee,0x35,0xb5,0x9b,0xf8,0x08,0x1e,0x15,0x2d,0x01,0xb1,0x83,0xa6,0x57,0x58,0xd1,0xf3,0xa4,0xf1,0x3a,0x00,0xf4,0x40,0xee,0x35,0x3a,0x20,0xc2,0x13,0x1e,0xda,0x32,0xc2,0x35,0x74,0x29,0xce,0x51,0x3f,0xec,0xb2,0xd7,0x23,0xa7,0xc6,0xef,0x70,0xb9,0x88 +.byte 0x6f,0xa8,0xf5,0x5b,0xff,0xc5,0xf5,0xb4,0x3b,0x12,0x75,0x20,0xbf,0x61,0x8a,0xb1,0xae,0x01,0x9b,0x17,0xf4,0xf3,0x2d,0xfb,0x44,0xe8,0xac,0x29,0x81,0xc2,0x6d,0x50,0x05,0x11,0xd9,0x43,0xf8,0xc7,0x58,0x5d,0xbc,0x2d,0xc0,0x83,0xd2,0x81,0x41,0x1c,0x46,0x62,0x60,0x6e,0x65,0x52,0x4b,0x1c,0x88,0x72,0x1b,0x0e,0x8e,0x7d,0xa2,0xb5 +.byte 0x4e,0x28,0x32,0xf2,0xb1,0xfa,0xf1,0x4b,0xc5,0x85,0x95,0x2c,0x08,0x78,0x85,0x68,0xe5,0x20,0x23,0x8b,0xc4,0xf5,0xb2,0xdb,0xc1,0xdd,0xe5,0x69,0xa4,0x97,0xa9,0x6c,0x2e,0x3a,0x25,0x1c,0x24,0x54,0x97,0x3e,0x8d,0x61,0x61,0xa3,0x60,0xf5,0xd2,0x4e,0x90,0x25,0x06,0x09,0x31,0x7b,0x96,0xce,0xcc,0xb7,0xbc,0x63,0x9f,0x04,0x7d,0xec +.byte 0xa1,0x4a,0x65,0xd3,0x26,0xe1,0xbf,0xf9,0x88,0xea,0x5c,0x5d,0xfe,0xe9,0x60,0x77,0xbd,0xf2,0xa0,0x11,0x91,0x24,0xca,0xa1,0x0d,0x05,0x7b,0xe2,0x7d,0x22,0x2e,0xd2,0xc9,0x4b,0x78,0xce,0x0c,0x7b,0x49,0xaf,0xd6,0x59,0x5f,0xb4,0xbd,0x2e,0x4a,0x22,0xcb,0x5d,0x1c,0xd5,0xde,0xea,0x86,0x74,0xd5,0x15,0x52,0x59,0xfc,0x3d,0x7b,0x1c +.byte 0x3f,0x14,0xec,0xf2,0xc8,0x3c,0x88,0xbf,0x89,0xd5,0x23,0xc3,0x94,0x3c,0x28,0x04,0x91,0x6c,0x36,0x35,0x4b,0x75,0xf8,0xdc,0xf3,0xff,0xba,0x8c,0xa4,0xc7,0x85,0xc5,0x1a,0x30,0x4b,0x7c,0xc5,0x2f,0xb9,0x2a,0x14,0xaa,0x65,0xe3,0x92,0xdc,0xe1,0xed,0x3f,0xb6,0xff,0x0e,0x74,0xe0,0xb3,0xc9,0x4b,0xd1,0x96,0xfc,0x49,0x72,0xbe,0xb0 +.byte 0xc8,0x4a,0xd5,0xf0,0xb3,0x58,0x29,0x35,0x97,0xd4,0x5c,0xc7,0x0b,0x27,0x1d,0x14,0xdb,0xb7,0x5c,0x7e,0x6d,0xc1,0x56,0xa9,0x80,0x72,0x7d,0x75,0xc2,0x2f,0x07,0x28,0xb4,0xff,0xef,0xa7,0x34,0xed,0x31,0x44,0x85,0xe6,0xc3,0xa4,0x5f,0xe2,0xe8,0xab,0xd1,0x59,0xe7,0x32,0x20,0xd1,0xcc,0xef,0x6f,0xe1,0x10,0x89,0x6c,0x0c,0xf3,0x5f +.byte 0xe8,0xc7,0x1c,0x3b,0xeb,0x3e,0xa5,0x53,0x2d,0x48,0x64,0x92,0xa0,0xec,0xf3,0x75,0x5b,0x5b,0xe2,0x83,0x87,0x04,0xa7,0xd8,0x1b,0x44,0xfb,0x42,0xee,0xd8,0xf2,0x98,0xff,0x30,0xc8,0x09,0xf8,0x1a,0x95,0x46,0x2d,0xe7,0x43,0x10,0x90,0xf4,0x2c,0x8f,0x0b,0x60,0x6d,0xeb,0xbf,0x19,0xc1,0x9d,0x5c,0xc0,0xff,0xb1,0x86,0xbc,0x01,0x73 +.byte 0x35,0x1f,0xd8,0xf4,0xa1,0xd4,0x7f,0x2d,0x1b,0xf9,0xa6,0x78,0x1a,0x2e,0x2c,0xe2,0xcc,0x8b,0x5f,0xbb,0xb9,0x80,0x31,0x32,0xa5,0x5d,0x70,0x59,0xae,0xe3,0xac,0xab,0xde,0x38,0x09,0x07,0x57,0x5f,0xbf,0xe8,0xa0,0xb8,0xd0,0x03,0xac,0x02,0x0d,0x7f,0x7e,0x0c,0xd2,0xcf,0x46,0x01,0x07,0x9f,0x16,0xf6,0x2b,0x94,0xaf,0xae,0x66,0x09 +.byte 0xca,0x4c,0x5f,0x37,0x53,0xa6,0x50,0x82,0x3a,0x0a,0x7b,0xb3,0x52,0x2e,0x0f,0xe4,0x64,0xab,0x40,0x21,0x2d,0xb7,0x20,0x9b,0xe3,0x2f,0xec,0x2b,0xb3,0x31,0x60,0x51,0x2e,0xb6,0x68,0xac,0xae,0xee,0x2d,0x28,0x5b,0xe0,0xa7,0x85,0xab,0x95,0xba,0x53,0x8c,0xc0,0xf8,0x16,0x8f,0x42,0x01,0xef,0x00,0x32,0x44,0x8e,0x41,0xc9,0x05,0x5b +.byte 0xe0,0x3f,0xe1,0xd8,0xd4,0x97,0x8e,0xa0,0x14,0x84,0xce,0x5c,0xef,0xbe,0xa4,0xae,0x18,0x91,0xd9,0x48,0x9b,0xc3,0x7a,0x8f,0xfb,0xb3,0x3e,0xa9,0x87,0x74,0x84,0xd2,0xc6,0x7c,0xc9,0xce,0x01,0xa5,0xcc,0xff,0x5a,0xe8,0x94,0x98,0x54,0x2a,0x6e,0xd9,0x58,0x75,0xd4,0xdd,0x6c,0x7d,0x83,0x32,0xc9,0x4e,0x35,0x2c,0x51,0x26,0x68,0x1f +.byte 0x95,0x20,0x82,0x54,0x0a,0xad,0x5e,0xe2,0xba,0xf9,0xa3,0x54,0x24,0x93,0x4a,0x62,0xff,0x28,0x05,0xd2,0x22,0x62,0x82,0xd4,0x2d,0xe2,0xec,0x66,0xc5,0xee,0x63,0xd0,0xf6,0x93,0xa8,0x37,0xbf,0xdd,0xe0,0x95,0x0b,0x19,0xa1,0x9d,0x9a,0xf8,0x94,0x1a,0x3a,0x50,0x9e,0x66,0x75,0x8c,0x25,0xbd,0x18,0xb0,0x58,0x76,0x7f,0x2d,0x3d,0x06 +.byte 0x02,0xb3,0xcf,0xa3,0x14,0x6e,0xe7,0xc8,0xcd,0xe6,0xbe,0xae,0x92,0xd6,0xa2,0xfe,0x12,0xf0,0xdf,0x9f,0x9e,0xad,0x77,0x77,0xfb,0xfc,0x36,0xb7,0x82,0x9c,0xf1,0x51,0xc2,0x58,0xa0,0xf3,0xa0,0xd6,0x6e,0x64,0x28,0xac,0x09,0x8f,0x7b,0xef,0x19,0x87,0x76,0xb9,0x4e,0xca,0x1f,0x05,0xb6,0x00,0x4a,0x14,0x83,0xaf,0xff,0xd9,0xa1,0xc6 +.byte 0x0f,0x98,0x3a,0xcf,0x85,0x18,0xea,0xa6,0x9a,0x1e,0xae,0x7c,0xaa,0xae,0xef,0x89,0x5e,0x14,0x5d,0x2f,0x73,0x8f,0xd1,0xf0,0x77,0xcd,0x45,0x92,0x7f,0xee,0xb9,0x7c,0xc2,0x3c,0xff,0x56,0x56,0xa5,0xa5,0x49,0xe4,0x20,0xd6,0xa2,0xb6,0xe4,0xfc,0x86,0x53,0xce,0x9e,0x2b,0x7b,0xcb,0xcf,0x6a,0xd5,0x62,0xb7,0x34,0x0e,0x39,0xe2,0xaa +.byte 0x1c,0x24,0x30,0x71,0x94,0xb3,0x57,0xd8,0xe8,0xd4,0xc5,0x4f,0x33,0x2c,0x73,0x7e,0x48,0xba,0xb3,0x55,0x84,0x6d,0x10,0xcf,0x8f,0xf2,0xb6,0xdb,0x4e,0xcf,0x49,0x08,0xf6,0x5a,0x3c,0x7e,0xef,0x3f,0x5c,0x11,0x09,0xfe,0x26,0xfb,0xff,0x30,0xcb,0x81,0x12,0xea,0x1e,0xa9,0x6e,0xf8,0xea,0x4f,0x92,0x2c,0x23,0x99,0x35,0xa5,0x59,0xca +.byte 0x1d,0x66,0x72,0xad,0x5b,0x7c,0xb3,0x4a,0x7c,0x76,0x4c,0xf6,0xc1,0xec,0x68,0x5f,0x2c,0x17,0xbe,0x92,0xe1,0xa1,0xee,0x40,0x24,0x25,0x6b,0xc5,0x0b,0x6f,0x06,0xc0,0x05,0x8c,0x23,0x24,0x76,0xea,0xe9,0xb9,0xa1,0x3d,0x59,0x15,0xe7,0x65,0x47,0x5a,0x75,0x9b,0xc8,0x7b,0x86,0x97,0xf4,0x4a,0xa3,0xec,0x54,0x0e,0x66,0xef,0xda,0x41 +.byte 0xb8,0x3b,0xa6,0x86,0x63,0xe1,0x4e,0x89,0x92,0x40,0xf4,0x8b,0x32,0x47,0x3b,0x4b,0xb4,0xe6,0xd8,0x4b,0x1c,0xac,0x03,0xab,0xde,0x2e,0x63,0x96,0x3f,0x27,0xa1,0x32,0x11,0x35,0x24,0x6a,0xe9,0x0b,0x73,0x61,0x4e,0xd8,0xdc,0x91,0x98,0x01,0x8a,0x0d,0x61,0xec,0x39,0xbe,0x3b,0xb9,0x78,0x77,0xea,0xaa,0xa2,0x12,0x20,0x92,0x98,0x16 +.byte 0x27,0x3b,0xd1,0xfa,0x59,0xef,0x81,0x38,0x9f,0x42,0xe8,0xb4,0xab,0x4f,0x26,0x9a,0xe7,0x0b,0x05,0x03,0xfa,0xe1,0xe1,0x3d,0x45,0xac,0x7d,0x40,0xcc,0x2f,0xf2,0xb0,0x33,0x42,0x14,0xbd,0x91,0x3e,0xe1,0xb7,0x17,0x25,0xc3,0x92,0xcb,0x9e,0x44,0x1e,0x13,0x93,0x98,0x1f,0x96,0x64,0x3a,0xaa,0x53,0x9a,0x18,0xc0,0x34,0x3c,0x47,0x94 +.byte 0x14,0x70,0x67,0x76,0x2a,0x82,0xd3,0x6a,0x18,0x13,0xe7,0x01,0x8d,0x97,0x52,0x51,0x8e,0x08,0xde,0x44,0xb0,0x74,0x07,0x58,0x35,0xc2,0x29,0xb5,0xd7,0x00,0x46,0x31,0x34,0xd7,0x1f,0xdd,0xaa,0x5c,0x27,0xc7,0x37,0x71,0xe8,0xbe,0xad,0x89,0xf1,0xb2,0xd1,0x46,0x33,0x0c,0x2f,0x26,0x21,0x5e,0xc9,0xda,0x25,0xcd,0xd0,0x17,0x23,0x87 +.byte 0x15,0xc2,0xa0,0x1a,0x9f,0x6e,0xfb,0x63,0xe9,0x69,0xdf,0x79,0x18,0x33,0x2f,0x47,0xca,0x54,0x23,0x7e,0x4f,0x6e,0x38,0x06,0x99,0xfb,0xcd,0x22,0xdb,0x4b,0x3f,0x8a,0x05,0x2e,0x5c,0x56,0x65,0xb7,0xab,0x57,0x8b,0xdd,0x28,0xab,0x7e,0x77,0x32,0x0f,0xc6,0x3c,0xf3,0xde,0x43,0xb0,0x13,0x3b,0xbd,0x28,0x3a,0x8b,0xd5,0x6b,0x1d,0x5d +.byte 0x20,0x1a,0x5f,0xa6,0x01,0xed,0x88,0x7f,0x87,0x55,0x38,0xc2,0x0d,0x03,0x6c,0x41,0x6a,0x43,0xdf,0x09,0xf3,0x58,0x69,0x13,0xa1,0xd6,0x39,0x0c,0x8e,0x8f,0x40,0x67,0xe8,0x0e,0x9b,0x9b,0x42,0x30,0xd7,0xae,0x04,0x75,0x66,0xfb,0x4a,0xa7,0xe0,0xe9,0xea,0x6d,0x28,0x4f,0xc0,0x5c,0xd4,0xd4,0xb7,0x60,0x5a,0x35,0xc1,0xe8,0x5f,0xc3 +.byte 0x4f,0x7a,0x5d,0x8d,0xc2,0x29,0x6e,0x36,0x50,0x5b,0x82,0x63,0xf2,0xda,0x8d,0x02,0x61,0x09,0x69,0x0a,0x47,0x9d,0x58,0xf3,0xf6,0xe0,0xc0,0x09,0xd9,0x3b,0x8d,0xf5,0xba,0xf6,0xc4,0xf0,0x65,0x89,0x7b,0xdd,0x93,0x6b,0x6e,0x21,0xa1,0x2a,0x66,0xe0,0x8f,0x62,0xb0,0x49,0x60,0xa3,0x48,0x42,0x62,0xcc,0x26,0x1f,0x59,0x3a,0x7b,0xa7 +.byte 0x82,0x10,0x5f,0xc6,0xf8,0xa2,0xc0,0x07,0x7b,0x26,0x26,0x11,0xe2,0x5b,0xb8,0x86,0xb7,0x66,0xcf,0x0a,0xcc,0x6f,0xe8,0x02,0x22,0x4c,0x13,0x75,0xdc,0x68,0xf0,0x7c,0x0c,0x46,0x9a,0xa2,0x4c,0xf5,0x50,0x3f,0xf9,0xbc,0x01,0xb1,0xa1,0x28,0x90,0x07,0x6b,0x17,0x69,0x89,0x7b,0xe5,0x0a,0xf7,0x7b,0xe1,0x94,0x30,0xfc,0xd3,0x8d,0xd3 +.byte 0x99,0x37,0x91,0xd5,0xdf,0x59,0x2a,0x4f,0xfe,0x6c,0x37,0x4b,0x78,0x2c,0xa9,0x28,0x6a,0x5c,0xd6,0xe1,0x0b,0xad,0xae,0x62,0x7c,0x09,0xb8,0x90,0x3f,0x29,0x37,0x7b,0x79,0xee,0x55,0x02,0x05,0xef,0x28,0xa2,0xc7,0x07,0x2b,0xe6,0xab,0x87,0x9d,0x8f,0x4c,0x0f,0xc1,0x75,0x5d,0x88,0x7f,0x26,0xe0,0x1e,0xf8,0x3f,0xb5,0x2a,0x6c,0xe6 +.byte 0x7f,0x85,0xae,0x55,0x7b,0x58,0x34,0x4c,0x81,0x05,0x21,0xa1,0x5e,0xd7,0xb6,0x20,0x6e,0xf9,0x60,0x15,0xa4,0xb2,0x8f,0x68,0xd2,0x23,0x9f,0xbf,0xfa,0x6a,0xcb,0x87,0x7d,0x41,0x4a,0xae,0x28,0x4f,0x9e,0xbb,0x69,0x1c,0x37,0xb2,0xc9,0xd2,0x21,0xa1,0x2b,0x6b,0x5d,0xff,0xd6,0xdb,0x8f,0x21,0xd9,0x17,0xd6,0xe6,0x74,0xf2,0x20,0x0e +.byte 0x06,0xb5,0x0c,0xdc,0x74,0x4e,0x93,0xcb,0x27,0xc7,0x4b,0xf3,0xef,0x46,0xa8,0xf0,0x58,0x1c,0xa0,0x65,0x09,0x84,0xc7,0x2e,0xba,0x51,0xd9,0xd4,0x53,0x20,0xc7,0x20,0x85,0x93,0x2b,0xf3,0x42,0x93,0x7b,0x22,0x1c,0x8d,0x22,0x76,0xcf,0xde,0x6a,0xa1,0x76,0xea,0x65,0x20,0x2f,0x2e,0xdb,0x85,0xdd,0x73,0x43,0xf8,0xe0,0xe3,0x3a,0xe5 +.byte 0x02,0x57,0x96,0x54,0xbc,0xaf,0xa4,0xd5,0xda,0x9d,0x9d,0x8b,0x85,0x01,0x7c,0x72,0x03,0xfe,0x39,0x46,0xab,0x04,0xcc,0x62,0x71,0xf5,0xa5,0x67,0xd7,0xfc,0xc0,0xb6,0x95,0x74,0xdf,0x1c,0xfe,0x1c,0x5b,0x25,0xae,0x42,0x75,0x00,0x71,0x3c,0xec,0xfc,0x3c,0x7b,0x0f,0xec,0x44,0xc7,0xec,0x9b,0x86,0xf5,0x3d,0x47,0x15,0xf0,0x25,0xba +.byte 0x43,0xc8,0x68,0x15,0x4f,0xeb,0x35,0x76,0x2d,0x04,0xb7,0x9b,0xb8,0xa7,0x0d,0xb3,0xb4,0xf2,0x93,0x85,0xb1,0xb8,0x81,0x7c,0xd6,0x5f,0xbd,0xc2,0xcc,0xf4,0x0e,0x98,0x2c,0x06,0x54,0x2f,0x5e,0x49,0x94,0x93,0x78,0xa0,0x0a,0x33,0x2e,0x3f,0xb2,0xa7,0x81,0xed,0xe9,0xb6,0xb5,0x86,0x4b,0xa5,0xc0,0x51,0x30,0x9d,0xe2,0x9f,0xc2,0x56 +.byte 0x92,0x6b,0x96,0xca,0xcb,0x65,0x5c,0x0e,0xf4,0x91,0x2b,0x89,0xf4,0x27,0x55,0x26,0xd7,0x7b,0x00,0x19,0x1f,0x67,0x4e,0x43,0x24,0x81,0x05,0xb7,0xc6,0x41,0x1a,0x39,0x3d,0x40,0x3e,0x8a,0x03,0x94,0x63,0x1b,0xb1,0x87,0xb6,0xe1,0x52,0xd0,0xe8,0xbb,0x0e,0x37,0x72,0xe5,0xde,0x86,0xc0,0xdf,0x5b,0xc2,0xc6,0x0a,0x67,0xa7,0x4c,0x03 +.byte 0xb6,0xd8,0x7f,0x1d,0xb3,0xe3,0x84,0xb7,0x5c,0x04,0x15,0xe0,0xd0,0xae,0x44,0xac,0x39,0xa5,0xa2,0x86,0xc8,0xad,0x27,0xa0,0x36,0xa1,0x6e,0xaa,0x87,0x7a,0x43,0xae,0xa0,0x45,0x1a,0xac,0x04,0xe2,0x55,0xf2,0x9a,0x97,0x67,0xfb,0x01,0x8f,0xb8,0x80,0x9c,0x27,0x1d,0xbe,0xa3,0xf1,0x6d,0x66,0xf2,0x1a,0x99,0x99,0xf6,0xa5,0xba,0x58 +.byte 0x28,0x58,0xb5,0x44,0x5b,0x38,0x4a,0x3f,0x37,0x85,0x7e,0x36,0x8e,0x16,0xb9,0x1e,0x0b,0xbf,0x7d,0x0a,0x0c,0x83,0x53,0x0d,0xcc,0x37,0xe1,0x42,0xbb,0x0d,0xfc,0x01,0x25,0x10,0xbe,0xb5,0x83,0x2f,0xa5,0x42,0x98,0xbc,0xd6,0x50,0x75,0xda,0x32,0x2b,0x3f,0xd6,0xc1,0x1a,0xe7,0x0b,0x80,0x07,0x6f,0xfe,0x77,0x9e,0xe9,0x1e,0x45,0x65 +.byte 0x68,0x92,0x34,0x8b,0xce,0xf3,0xcd,0x94,0x17,0xe0,0x41,0x92,0x96,0xb5,0xd1,0x98,0xd1,0x25,0xd1,0x3d,0x76,0x88,0x86,0xb1,0x01,0x80,0xc7,0xde,0x60,0x20,0xb8,0x03,0xe7,0x3f,0x44,0x39,0xb1,0xb8,0x19,0x53,0x5a,0xc6,0xa0,0x18,0x8e,0x0e,0xb6,0xfd,0x7e,0xe7,0x7e,0x8a,0xeb,0x4c,0x35,0x4a,0x0f,0x52,0x81,0x68,0x12,0xe4,0x46,0x2e +.byte 0x20,0xb4,0x41,0x59,0xb3,0x16,0x02,0x9f,0xdb,0xe8,0xea,0xfd,0xe3,0x5d,0x14,0xd0,0x97,0x52,0x66,0xcb,0xb4,0x48,0xa3,0x05,0xab,0x73,0x8e,0x2c,0x46,0xc2,0x94,0xd5,0xc8,0x57,0xc4,0x13,0xa4,0x0b,0x7c,0x34,0xbf,0xb4,0x07,0x28,0x92,0xe2,0x1d,0x00,0xa6,0xf0,0xb0,0xbf,0xdd,0x5d,0x20,0x05,0x9f,0x53,0xcf,0x07,0xf7,0xe8,0x79,0x04 +.byte 0x57,0xd1,0xac,0x9c,0xdd,0xae,0xcd,0x8b,0x04,0x0a,0x2d,0x0a,0x0f,0x21,0x09,0xc8,0x0d,0xfa,0x23,0x26,0xe3,0xdb,0x84,0xc8,0x8e,0x9c,0x96,0x93,0x4f,0xcc,0x2f,0x96,0xed,0x04,0x91,0x0d,0xc7,0xbb,0x27,0xa3,0x6b,0x9d,0xe2,0x15,0x83,0x31,0x78,0xb5,0xb9,0x6d,0xb1,0x6c,0xa2,0x3e,0xf5,0x45,0x77,0xf4,0x96,0x3a,0xe6,0x10,0x08,0xfd +.byte 0x23,0xcc,0xda,0x27,0x73,0x67,0xbb,0x8b,0x59,0xe2,0xcf,0xda,0x57,0xf9,0x17,0xeb,0xeb,0x98,0x39,0x48,0xbf,0x3d,0x5b,0x7b,0xc2,0x11,0x4b,0xd6,0xb6,0x8a,0x14,0xb3,0xf5,0xc3,0x18,0xff,0xde,0x62,0x98,0x4a,0x1d,0x6b,0x4e,0x00,0x4f,0x7d,0x2f,0x67,0xf4,0x22,0x1e,0xdb,0x69,0xd5,0x87,0xfd,0xee,0x97,0x56,0xd4,0x00,0x0c,0x9e,0x22 +.byte 0x11,0xda,0x8e,0x3b,0x91,0xad,0xf1,0xb6,0x0a,0xba,0xe7,0xc6,0x14,0x0e,0xc4,0x85,0x5f,0x7d,0x69,0x7d,0x73,0x9c,0x83,0x6a,0x69,0xef,0x10,0xb0,0xe6,0x33,0x32,0x0f,0xd8,0x54,0xa4,0x9d,0x39,0xaf,0xfc,0x6d,0x4f,0xeb,0x34,0x89,0x2e,0xb0,0xa1,0xcd,0xe1,0x5b,0xab,0xe1,0xff,0x82,0x85,0x6b,0x5e,0xa9,0x9e,0x43,0x02,0x0d,0x38,0x33 +.byte 0xe1,0xbc,0xa4,0x77,0x8a,0x5e,0x54,0xa8,0xcf,0xc9,0x76,0xcb,0x73,0x21,0x1f,0xa7,0x1e,0x5c,0x0a,0xd6,0xa2,0x36,0x6f,0x07,0xa1,0x6b,0x0d,0x5a,0x21,0x3a,0xc3,0xc0,0xcd,0x9d,0xed,0x83,0x96,0x89,0xaa,0x55,0x56,0xfd,0x0a,0x97,0x3a,0x50,0xfd,0x95,0x3f,0xb7,0xfa,0x87,0x7d,0xa6,0x5d,0x12,0x65,0x3f,0x61,0x4f,0x86,0xdd,0x58,0x64 +.byte 0xd7,0xde,0xd6,0xb9,0x68,0x87,0xde,0xba,0x96,0xf5,0x1c,0xec,0x8e,0x81,0xfc,0xca,0x77,0xe2,0x85,0x11,0x93,0xc7,0xf2,0x0f,0x77,0xbb,0x7c,0xed,0x20,0x7a,0xe3,0xc5,0x76,0xff,0x04,0xc7,0xe6,0x7a,0xa1,0xfe,0x58,0x52,0x1b,0xec,0x27,0xbb,0xd4,0x27,0x7c,0xc7,0x4a,0xfb,0x07,0x62,0x99,0x36,0xff,0x6e,0x71,0x2f,0xbd,0x25,0xff,0x8d +.byte 0x97,0x14,0x56,0x23,0x7f,0x13,0x89,0x10,0xd8,0x29,0x1f,0x91,0x56,0x52,0x85,0xa7,0xd3,0x04,0xc9,0xe2,0x09,0xa2,0x0f,0xaa,0x28,0xb1,0x79,0xf9,0x08,0xf4,0x14,0x57,0xc4,0x54,0xd7,0x69,0xb0,0x37,0xf0,0x80,0x90,0xce,0x75,0x81,0xe7,0x75,0x0f,0x7f,0x71,0x58,0x3b,0x78,0x53,0x9b,0x4a,0x5e,0xcc,0x23,0x04,0x9e,0x0c,0xd7,0xd8,0x69 +.byte 0x90,0xdf,0x36,0x99,0x90,0xd3,0xfa,0x35,0xf7,0x13,0x64,0xb0,0xc0,0x70,0x0c,0xd4,0x87,0xc0,0xca,0xd8,0xca,0x8a,0xc3,0x9a,0xfa,0x73,0x34,0x18,0xe9,0x3a,0x85,0x42,0xc5,0xe1,0xaa,0xb5,0x87,0xac,0x43,0x9c,0xfa,0x7e,0x05,0x35,0xed,0x7e,0x0d,0x38,0x82,0x17,0x7f,0x22,0xa2,0x3d,0xd3,0x0d,0xd1,0xff,0x0a,0x68,0x52,0xd2,0x17,0x59 +.byte 0xaa,0x57,0xbd,0xd3,0xea,0x0c,0xe8,0xb0,0x22,0x13,0x59,0x42,0x46,0x34,0x58,0xa9,0x16,0xc5,0x9f,0x88,0x8f,0x75,0x02,0xbf,0x63,0xda,0x28,0xba,0x9a,0xcf,0xbb,0x73,0x58,0xb1,0x13,0xf2,0x68,0xd8,0x6b,0xfd,0x49,0x50,0xcf,0x09,0xea,0x6a,0xff,0x20,0x39,0xc5,0xae,0x70,0x79,0xea,0xec,0x9d,0x09,0xf8,0x51,0x1f,0xfd,0x01,0xd5,0x9f +.byte 0xec,0x29,0x36,0xfc,0x39,0xb4,0x4c,0x1f,0xe6,0xb4,0xcc,0x97,0x21,0xe5,0x19,0xe9,0x7a,0x60,0x6d,0x39,0x3c,0x31,0xd4,0x43,0x76,0xba,0x10,0xd9,0x3f,0x75,0x7a,0xa6,0x1d,0x02,0x88,0x3d,0xa5,0x9f,0x91,0x61,0x4e,0x32,0xec,0xf5,0xd3,0xe4,0x65,0xf7,0x0e,0x3b,0x8a,0x8f,0x22,0x31,0x71,0x8f,0xf1,0x5f,0x7b,0x04,0x88,0xf9,0x88,0x67 +.byte 0x14,0x85,0x74,0x9e,0x54,0x0b,0xed,0x7a,0x48,0xcd,0xcf,0xd2,0x05,0x38,0xd5,0x58,0xa2,0xaf,0x6a,0x28,0x21,0xfd,0x38,0x4e,0x83,0x06,0x15,0x60,0xfb,0x89,0x2a,0x72,0xfe,0x75,0xc7,0xa4,0xae,0xe4,0x5b,0xbb,0xde,0x54,0xde,0x77,0xbb,0x9d,0xd2,0x07,0x05,0x61,0x53,0x65,0x31,0xd4,0x3a,0x8a,0x7d,0x9d,0x30,0x09,0x25,0x28,0x72,0x19 +.byte 0xe4,0xae,0x1d,0xbf,0xa7,0xef,0x75,0xd0,0xe3,0xdc,0x0b,0xd1,0x17,0x9c,0xc6,0xdf,0x65,0x9a,0x7c,0x9d,0x0b,0x9a,0x3d,0x8f,0xb0,0xf5,0x51,0x46,0x6b,0x12,0x0d,0xe6,0xa9,0x3a,0xb5,0xe9,0x52,0x85,0xa5,0x25,0x1f,0xc9,0x8b,0xff,0xe3,0x37,0x25,0x97,0xd8,0x91,0x17,0xed,0xcf,0x2a,0x6d,0x4f,0xef,0x74,0x5e,0x92,0xa2,0x2d,0x84,0xa6 +.byte 0x09,0xc4,0xfc,0x36,0x95,0x54,0x25,0x9e,0xeb,0xd9,0xea,0x5a,0x01,0x0c,0x54,0xdb,0x82,0x01,0xed,0x0b,0xf7,0x9f,0x0d,0x8f,0x2e,0xee,0x7c,0x6e,0xb3,0xe7,0xe8,0x04,0xef,0x8d,0x5e,0xfe,0x3d,0x96,0x3a,0x65,0xd3,0xb2,0x11,0x75,0x1c,0x6f,0x2a,0xd3,0x26,0x1f,0x5f,0x35,0x02,0x0b,0x9f,0x38,0x5b,0xa5,0x3a,0x90,0x3e,0x03,0x9f,0x50 +.byte 0xf2,0xd7,0xe4,0x3c,0xd3,0x28,0x67,0x0a,0x5a,0xe8,0x59,0x6f,0x38,0x8f,0x8b,0x0d,0xe4,0x1c,0xfc,0x6e,0x07,0x69,0x7b,0xfb,0x04,0x30,0xe7,0xa6,0x13,0xfb,0x33,0xa0,0x52,0x6a,0xec,0x64,0xad,0x90,0xbd,0xba,0x15,0x12,0x48,0xed,0xd1,0x94,0x2d,0xe7,0x19,0x28,0x5e,0x7a,0x94,0xf4,0x79,0xd7,0x79,0xc9,0xf6,0x16,0xb4,0x88,0xee,0x15 +.byte 0xa2,0x68,0xe3,0x1d,0xd0,0xd2,0x63,0x78,0x7c,0xb3,0x30,0xac,0x63,0x7a,0x36,0xc5,0x50,0xbf,0x57,0xf6,0xfe,0x4e,0x43,0x4e,0xf9,0xc4,0xa2,0x2a,0xa7,0xa4,0x2c,0x18,0xb9,0x43,0x7b,0xe8,0xf6,0x14,0x4f,0x07,0x6e,0x65,0x9a,0xdd,0x10,0x2a,0x4c,0xa4,0x58,0x86,0x19,0xad,0x6d,0x5e,0x30,0xfb,0x5f,0xb6,0x9f,0x2a,0xac,0x90,0x0d,0xae +.byte 0xf9,0xab,0xc1,0x33,0xd3,0x73,0x1d,0x46,0xe5,0xc8,0x1e,0x1d,0x61,0xf1,0xda,0x53,0x3e,0x61,0xf0,0x9a,0xe4,0xb7,0x04,0xe9,0x5e,0xf6,0x11,0xa6,0x56,0x39,0xed,0xfb,0x06,0xd0,0x92,0xb9,0xb8,0xb5,0x3b,0x39,0xec,0xa5,0xc0,0xb1,0x7e,0x7e,0xfb,0x89,0x86,0xa8,0x70,0x47,0xa5,0x60,0x8c,0xf8,0x47,0x31,0x04,0x54,0x29,0xf3,0xa2,0x79 +.byte 0xac,0x24,0xda,0x33,0x6c,0x1c,0x34,0xc2,0xa0,0x96,0x27,0xbb,0x31,0xbf,0xc1,0xd9,0xc8,0x35,0xbc,0xb3,0x13,0x8a,0xb6,0x25,0x92,0xdc,0xcc,0x3b,0x8a,0x65,0xf3,0xf9,0xd1,0x2a,0xcd,0xb0,0xf4,0xd7,0x44,0xa0,0x27,0xfc,0x0e,0x69,0x46,0x0b,0x56,0x5b,0x58,0x40,0xd9,0xc4,0x37,0x9b,0x4d,0xa1,0x45,0xd8,0xab,0x4d,0x02,0x31,0x4f,0x93 +.byte 0x56,0xd0,0x26,0x99,0x1c,0xc7,0x2b,0xc2,0x80,0xb4,0xbd,0x6e,0xfe,0xa1,0xf7,0x8f,0x13,0x74,0x2c,0xa8,0x63,0xb1,0x3d,0x6d,0x32,0x4a,0x80,0x6a,0x7f,0xcf,0x6c,0x51,0xa9,0x21,0x34,0x4e,0x13,0x19,0x8f,0x33,0xfc,0x06,0x46,0x05,0xf0,0xcf,0xf1,0xce,0x20,0xe0,0x40,0xf2,0x0a,0xd0,0xf6,0xcc,0xcc,0xc2,0xc7,0x07,0x2e,0x9e,0x0a,0x1e +.byte 0x53,0x59,0xbb,0xe3,0x02,0xc8,0x20,0x9f,0x3c,0xe6,0xec,0xf7,0x8a,0x6d,0x3c,0x0f,0xb3,0x14,0x66,0x5c,0x51,0xbe,0x82,0xc2,0x0b,0x10,0x63,0xa9,0xd4,0x7f,0x12,0x88,0x13,0x81,0x8a,0x06,0x8a,0x7f,0xc8,0x89,0xe7,0xbd,0xce,0x51,0xdc,0x93,0x03,0x07,0x6f,0x8c,0xe6,0xcc,0x0d,0x45,0xa8,0xfc,0x02,0xe2,0x3e,0xa7,0xc8,0x83,0x77,0x98 +.byte 0x91,0x4e,0x1f,0x8d,0xed,0xa5,0x38,0x54,0x0e,0x4e,0x53,0x1c,0x0c,0x47,0x11,0x59,0x54,0x15,0xb5,0x47,0xb0,0x21,0xa1,0x3d,0xaa,0xef,0xee,0x9e,0x26,0x3c,0x39,0x75,0xff,0x1a,0x8c,0xbb,0x1a,0x49,0x62,0x21,0x76,0xe8,0x3d,0x10,0x55,0xf5,0x5a,0x44,0xf0,0xb3,0x81,0xd0,0x35,0x96,0x95,0x63,0xf7,0x50,0xb1,0xa0,0xf0,0x29,0x97,0xc9 +.byte 0x27,0x73,0xd8,0x29,0xef,0x74,0xd2,0x6d,0xf4,0xfb,0x72,0xa9,0x4f,0x12,0xd5,0xfd,0xc9,0xba,0xf0,0xbd,0xfd,0x5e,0x5c,0xfa,0x53,0xe3,0x96,0xab,0x57,0xc3,0xb6,0xe8,0x0e,0x43,0xe4,0x77,0x97,0x04,0x69,0xff,0x72,0xd0,0xd8,0xab,0xb9,0x19,0x25,0x89,0xf7,0xbb,0x01,0x03,0xf2,0xc6,0x8d,0xd5,0x86,0xe3,0xfe,0x9c,0xff,0x78,0xd7,0xfc +.byte 0xda,0xd4,0x69,0x8e,0xd6,0x31,0xfb,0x15,0xd3,0x38,0xfd,0x53,0xe2,0x4e,0xce,0xcc,0xfe,0x17,0xc5,0x88,0x92,0x28,0x98,0xb7,0xcf,0x7b,0x53,0x7b,0x96,0x14,0xaf,0xeb,0x5b,0x2d,0x16,0x41,0xcc,0x7b,0x65,0xe1,0x73,0x81,0x4e,0x8f,0xc3,0xad,0xe1,0x3f,0x0c,0xa7,0xbe,0x38,0xed,0x02,0x67,0xf5,0xfa,0x1d,0xb0,0xd5,0x4c,0xe1,0xd8,0x62 +.byte 0xc9,0xb5,0xf8,0x84,0xc4,0x51,0x57,0x14,0x11,0xf8,0x7d,0x1d,0xe7,0x81,0x85,0x61,0xa9,0x9f,0xc8,0x45,0xb9,0x2d,0x8a,0xc9,0xa3,0xfe,0x5a,0xf9,0xe0,0x1c,0x80,0xd8,0x77,0xaa,0x85,0xca,0x93,0x9a,0x2e,0x10,0x03,0x71,0x3d,0xb1,0x2a,0x64,0x2e,0xad,0x64,0xba,0x5c,0xaa,0x8a,0xc2,0x2a,0x80,0x28,0x2e,0xf9,0x93,0xe1,0x71,0x72,0xae +.byte 0xda,0xd8,0x4f,0x4c,0xec,0xb5,0xe3,0x05,0x10,0x5f,0x4c,0xe6,0xe1,0xf4,0x07,0x63,0x75,0x6f,0xc5,0xf9,0xcd,0xfc,0xfc,0x35,0x2f,0xe4,0xca,0x4b,0xfc,0xc3,0x20,0x8b,0x5c,0x4a,0x3c,0xf8,0x92,0xca,0x2b,0xb0,0xce,0xd9,0x4b,0xf0,0x44,0xcb,0x4e,0x83,0xf3,0x9d,0xb0,0xd4,0xab,0xba,0x2a,0x76,0xaa,0x87,0xcd,0xa2,0xd1,0x3f,0xa0,0xb9 +.byte 0xdb,0x7e,0x67,0x2d,0x92,0x4c,0xeb,0x3c,0xa6,0x8c,0x62,0x80,0x18,0x78,0x2b,0x9d,0x8f,0x5e,0xc3,0xa5,0x3b,0x10,0xb3,0x8a,0x3b,0x00,0x96,0xb2,0xab,0xce,0x8d,0xff,0x3c,0xee,0xeb,0x4f,0xfb,0xab,0x96,0x38,0x4c,0x15,0x6e,0x7c,0xf3,0x31,0x5f,0x8f,0x99,0x88,0x52,0x48,0x8b,0x71,0x1b,0x31,0x3f,0x7c,0xe4,0xae,0x9c,0x7b,0xeb,0x64 +.byte 0xe3,0x80,0xd4,0x56,0x9a,0x6a,0xd9,0xca,0xc5,0xf0,0x86,0xe7,0xda,0x80,0x8f,0x17,0x61,0xca,0x24,0x0b,0xb6,0xf9,0x24,0xc5,0x7a,0x28,0x42,0x32,0x7f,0x2b,0xde,0x44,0x30,0xed,0x69,0x63,0x07,0x3f,0xca,0x7b,0x02,0xea,0x6e,0xef,0x27,0x1d,0x76,0x32,0xc2,0x81,0x3d,0x03,0x9a,0xe7,0x0d,0x28,0x07,0x03,0x0c,0x65,0x73,0x58,0x26,0xc6 +.byte 0xfe,0xcc,0x33,0x7f,0x33,0xad,0xea,0x81,0x05,0xcc,0x61,0x1e,0x78,0x69,0x70,0xc9,0x1f,0x6e,0x4f,0xb8,0x19,0x42,0x03,0x03,0x9d,0x56,0x87,0x0e,0x9a,0x32,0x3a,0xba,0xb9,0x11,0x66,0x9f,0x4d,0xd1,0xb0,0x11,0xbf,0x46,0xfc,0xcf,0xe5,0xef,0xf1,0x61,0xeb,0xad,0x31,0x7c,0x0d,0x66,0x0d,0xa9,0x1f,0xe4,0xf9,0x80,0x9e,0xae,0x9e,0x34 +.byte 0x1e,0x95,0x6c,0xa2,0x77,0x69,0x84,0x77,0xb7,0xe8,0xca,0x1f,0xea,0xc1,0x34,0xe6,0x0d,0x4f,0xba,0x77,0x2b,0x8c,0xbe,0xff,0xc4,0x06,0xa3,0xb6,0x1a,0xbe,0x55,0x99,0x57,0x6f,0x54,0x24,0x93,0x7a,0x0d,0x52,0xd6,0xbb,0xd2,0x9c,0xd5,0x76,0x6a,0x22,0x66,0xdc,0x43,0x9a,0x7b,0x1b,0x11,0x80,0x02,0x0c,0x8f,0xc6,0xc6,0x02,0x42,0x29 +.byte 0x00,0xc4,0xb2,0xa1,0x6a,0x7f,0xa9,0x60,0x8d,0x41,0x4f,0xd3,0xde,0x33,0x5a,0x44,0x31,0xb0,0xdc,0xc0,0x0c,0x31,0x03,0x96,0x71,0x0a,0xce,0xe3,0x0b,0xc7,0xe3,0x5d,0xe0,0x88,0x4b,0xfd,0x4c,0x1a,0xce,0xaa,0x89,0xc6,0x99,0xa8,0xd3,0x1e,0xe9,0x6c,0x2a,0xbd,0x26,0x81,0x03,0x6a,0xf2,0xf2,0x0f,0x1e,0x9d,0x8a,0x59,0x45,0xbf,0x6d +.byte 0xb7,0xc8,0xec,0x77,0xb0,0x70,0x1a,0x31,0x21,0xeb,0x25,0x12,0xff,0x13,0x33,0x6b,0x47,0x34,0xd8,0x66,0x11,0x8a,0xc9,0x93,0x5b,0x2c,0x55,0x42,0xb2,0x9b,0x60,0xc6,0xba,0xab,0x12,0x12,0x5d,0x0a,0xd4,0x54,0x79,0x17,0x6d,0x31,0x7d,0x4f,0xf2,0x94,0x16,0x65,0x62,0x38,0x76,0x3a,0x7d,0x55,0x05,0xd9,0x17,0x45,0x62,0xb4,0x1d,0x31 +.byte 0x34,0x40,0xd3,0x8e,0xf9,0x29,0x4d,0x3f,0x93,0x9a,0x2e,0xa4,0x75,0x66,0xf6,0x62,0x8f,0xf9,0x8d,0x79,0x4b,0x51,0x7e,0xfb,0xeb,0x9a,0x86,0x96,0x01,0x79,0xbe,0xe4,0x42,0xb3,0xc8,0x28,0x9e,0xed,0xa8,0xb6,0x6d,0xd3,0x31,0xed,0x30,0x9e,0x6a,0x5b,0x02,0x4b,0xbd,0xb3,0xf2,0xf0,0x9d,0x50,0x09,0x40,0x71,0xfe,0x4b,0x91,0xc9,0xd6 +.byte 0x07,0x87,0x9e,0xdb,0xa9,0xcd,0x0b,0x95,0x18,0x5a,0x55,0x10,0xaa,0xe1,0x70,0xe9,0x2e,0xc2,0x31,0x6b,0x48,0x84,0x2f,0xe5,0x7b,0xdd,0x4c,0x03,0xed,0xb6,0xb6,0x64,0x24,0x38,0x7a,0x5a,0x15,0x35,0x9d,0x66,0x08,0x4d,0xa6,0x3c,0x96,0x1a,0xcd,0x02,0x61,0x40,0xde,0xac,0xc3,0x15,0x8c,0xca,0xe6,0x62,0xe9,0x61,0x68,0xf6,0x60,0xd3 +.byte 0x7e,0x5f,0x44,0xcf,0x09,0x01,0x60,0xc2,0xb1,0xfc,0x2f,0x41,0x4c,0xc1,0x06,0x72,0xcc,0xde,0x25,0xe0,0x8c,0x34,0xb8,0xe0,0xb2,0xeb,0x05,0x5d,0x9e,0x7e,0xf7,0x1e,0x24,0xcd,0x1b,0x14,0x3f,0x1b,0x13,0xc0,0x64,0x38,0x43,0x95,0xba,0x7b,0x61,0xa0,0xdc,0xe0,0xf5,0x80,0x13,0xa1,0xc5,0x48,0x92,0xc5,0xd5,0xd0,0x87,0x0c,0x73,0xae +.byte 0xe2,0xb3,0xe8,0x70,0x4a,0x7e,0xa0,0x13,0xc3,0xc6,0x9c,0x77,0x51,0xca,0x88,0xcf,0xe0,0x1e,0xff,0x6c,0xe2,0xc3,0x33,0xce,0x7f,0x3e,0x7d,0xd5,0x37,0x23,0x09,0xb7,0xbd,0xb7,0xec,0x9a,0x29,0xd6,0x4f,0xea,0x79,0x24,0x4c,0x09,0x74,0x9c,0x97,0x3b,0x08,0x1f,0x82,0xcc,0xae,0xc4,0x3f,0xcf,0xc6,0xcb,0xaf,0x8c,0x89,0x15,0x79,0xeb +.byte 0x88,0xb9,0x03,0xab,0xc6,0xf8,0x6e,0x54,0xde,0x50,0x6e,0xcf,0x8a,0x4b,0x3f,0x64,0xd0,0xcb,0x69,0xc2,0xe3,0x40,0x4a,0x94,0xe2,0x04,0xfa,0x9b,0x4a,0xf6,0x2b,0x93,0x0c,0x0e,0xf8,0x68,0xbc,0x6e,0x6c,0xe6,0xd9,0xb6,0x04,0x40,0xf4,0x60,0xbc,0xc1,0x1e,0x67,0x1f,0xce,0x5c,0x4d,0xba,0x78,0xa8,0xf5,0x96,0x00,0xb9,0x61,0x82,0x65 +.byte 0xb2,0x1d,0x42,0xb8,0x88,0x66,0x43,0xd9,0xfe,0xe0,0x86,0xef,0x5d,0x4d,0xcc,0xeb,0x57,0x9a,0x2b,0x27,0xf2,0xcf,0x68,0xc3,0x05,0x92,0x4d,0x4d,0xb7,0x46,0x7e,0xfd,0xb7,0x4a,0x4d,0x6f,0xac,0xc8,0x8d,0xf2,0xcd,0x52,0xcf,0x91,0x77,0x2d,0x68,0x06,0x7a,0xc9,0xf3,0x17,0xc6,0x8f,0x8f,0xb5,0x8f,0x74,0xfa,0x90,0xcc,0xfc,0xaf,0x4e +.byte 0xd2,0x29,0xd9,0x57,0x71,0xe9,0x52,0xd8,0x50,0xfa,0x4d,0x13,0x7c,0x42,0x15,0x22,0x65,0x26,0x08,0xda,0xaa,0x53,0xcf,0xeb,0xd1,0x87,0xd5,0x7c,0x4e,0x66,0x1c,0x7d,0xc9,0x03,0x59,0xf8,0x09,0x3e,0x1b,0x94,0x4c,0x39,0x56,0xeb,0xfd,0xb6,0xd0,0xf9,0x76,0x8b,0x5d,0x6e,0x44,0x15,0xcf,0x27,0x7f,0x69,0x9a,0x00,0x96,0xbe,0x80,0x5e +.byte 0xbb,0x5a,0x05,0xea,0x15,0xdd,0x44,0x69,0x9e,0x64,0xcd,0xba,0xf2,0x6f,0x67,0x10,0xc5,0xa1,0x75,0x85,0x5f,0xdc,0x61,0x43,0x34,0xc3,0x52,0x06,0xd4,0xe9,0x9f,0xdf,0xd4,0xa6,0x96,0xac,0xb1,0x21,0xdd,0x20,0x46,0x20,0x89,0x5f,0x0e,0x9d,0xa8,0xc7,0x75,0x3a,0x54,0x9e,0x7c,0x3a,0xd5,0xb2,0x68,0x77,0x06,0x1b,0x1c,0xbd,0xb3,0x02 +.byte 0xb5,0xdd,0x87,0x55,0x6b,0x00,0x9f,0x2c,0x30,0xb7,0x4e,0xc3,0x67,0x38,0x37,0x61,0x81,0x68,0xcb,0x14,0x81,0x27,0xd7,0x38,0x18,0x81,0x68,0x45,0xca,0xf4,0xaa,0xae,0x58,0x9e,0xf8,0xbe,0xe9,0x1e,0x05,0x19,0xf0,0xea,0x89,0xf8,0xa1,0x9c,0x7b,0x63,0xc1,0xcd,0x81,0xc8,0x95,0x56,0x81,0x81,0x29,0xb0,0x4d,0xbf,0xe6,0x8d,0xa3,0xb3 +.byte 0xfa,0xae,0x13,0xc8,0xca,0x4d,0x5c,0x5e,0xd9,0x17,0xf8,0x87,0xdb,0x5b,0xe2,0xd9,0xba,0xe3,0xe8,0xdb,0xcb,0x74,0x36,0x7e,0x0e,0x3a,0x94,0x6a,0xe9,0x9e,0x50,0x8e,0xf4,0xd4,0x15,0xb7,0x50,0x60,0x3f,0x14,0x72,0x41,0x9d,0x51,0x63,0x8c,0x31,0x95,0xf2,0xbc,0x14,0xc7,0x64,0x2c,0xee,0x0b,0xe6,0xde,0xf6,0x33,0x85,0x65,0x00,0x54 +.byte 0x54,0x84,0x85,0x94,0x87,0xa0,0xc3,0x95,0x4e,0x74,0xcb,0x2d,0x82,0x9e,0x46,0x7f,0xf5,0x64,0x60,0xfe,0x1a,0x37,0xee,0xa7,0xb6,0x85,0xb5,0x4e,0x30,0x11,0x39,0x4b,0xe9,0x57,0x18,0x3a,0x2c,0x6b,0xb9,0x8e,0x5a,0x54,0xa9,0x31,0xf7,0xe1,0xe0,0xc7,0x52,0xfe,0x76,0x9b,0xc6,0xfe,0xde,0xe0,0xe9,0xf9,0xf6,0x10,0xda,0xef,0x72,0x24 +.byte 0x9c,0xbe,0x4a,0xba,0x58,0x21,0x1b,0xe3,0x1d,0x80,0x10,0x76,0x70,0xde,0x8f,0xf3,0x07,0x93,0x01,0xe0,0xb4,0xd9,0x7d,0x60,0x0d,0x08,0x07,0xa4,0x6d,0x9b,0x2b,0x8c,0x9a,0x58,0x65,0x5e,0x29,0xf1,0x24,0xb2,0x31,0xfb,0xb7,0xad,0xf0,0x50,0x8e,0x25,0x1b,0x75,0xc5,0x82,0x88,0x8c,0x68,0x14,0x2c,0x28,0xa2,0xb6,0x93,0x14,0xe3,0x28 +.byte 0xd0,0x95,0x6f,0x79,0x91,0x03,0x75,0x82,0x5c,0x20,0x46,0x0d,0x53,0x40,0x2c,0x88,0x62,0xa4,0x8c,0xd5,0xf1,0xc1,0xbf,0xde,0x57,0x91,0xb2,0xa6,0x66,0x29,0xf0,0x6b,0xb8,0x5e,0x78,0x5f,0xd1,0x76,0x98,0xf2,0x56,0xc2,0x5f,0x48,0x1f,0xa6,0x98,0xb0,0x87,0x53,0x13,0x1d,0x1a,0xa7,0xdf,0xa5,0xea,0x37,0x12,0x6d,0x64,0x53,0xdc,0x04 +.byte 0x2d,0xb9,0xeb,0x78,0x89,0x7b,0x70,0xd2,0x6d,0x45,0x8d,0x45,0x50,0x57,0xc7,0xb2,0xaf,0xdd,0x72,0x0f,0x9f,0x1b,0x29,0x61,0x68,0xb5,0x4a,0xd4,0xe9,0xd7,0x10,0xe7,0xcd,0xe8,0x22,0xd3,0x54,0x0c,0x0b,0x32,0x77,0x7d,0x3e,0xed,0x6e,0x79,0x4b,0x7b,0x99,0x1f,0x9e,0xbe,0xe7,0x12,0x7c,0x94,0x36,0x1c,0x20,0x8a,0xd0,0xab,0xda,0x95 +.byte 0xf6,0x4f,0xbe,0x6f,0x44,0x0b,0xa3,0x7b,0x4d,0x00,0xf6,0xdf,0x6f,0xc8,0x50,0x9e,0x3e,0x0c,0x1e,0xfe,0xb8,0x39,0x9f,0x83,0x4f,0xb3,0x1f,0x7e,0x53,0x54,0x64,0x04,0xa3,0xf7,0x79,0x01,0x71,0xce,0x18,0x0d,0x47,0x4e,0xae,0x88,0x6a,0xe7,0x26,0x4e,0x59,0xee,0x3a,0x03,0xc2,0x4d,0x0c,0x29,0xf0,0x96,0x9d,0xc0,0xa3,0xb3,0x82,0xf9 +.byte 0xc4,0xf8,0x8b,0xae,0x68,0x47,0x39,0xdc,0x10,0xd7,0x09,0xb4,0x86,0x87,0xfa,0x7e,0x0c,0xe4,0xee,0x3a,0x35,0x1a,0x0e,0x95,0x88,0xce,0xe7,0x9e,0xcc,0xa5,0x58,0x98,0x48,0xbd,0x9c,0x27,0xe6,0xb9,0xf7,0xca,0x66,0xee,0x54,0x87,0xd0,0x6d,0xab,0x31,0x1a,0x57,0x33,0x8b,0x89,0xa0,0xc0,0x18,0x9a,0x87,0x5e,0x58,0x02,0xe5,0x50,0x47 +.byte 0x0f,0x60,0x53,0x9d,0x99,0xe4,0x0a,0xfa,0x4a,0xc3,0x77,0x4b,0x4d,0x4e,0x0c,0xbb,0x68,0xd9,0xb3,0xd3,0x59,0x78,0xdf,0x65,0x97,0x6e,0x22,0x5b,0x24,0x26,0xf9,0x2a,0x14,0x73,0xa7,0xec,0x65,0xfc,0xdf,0x7d,0x35,0x0d,0x44,0x1b,0x4b,0xad,0x6b,0x8f,0x0e,0xa3,0x3b,0x6b,0x40,0xb3,0xe3,0xd9,0x41,0xba,0xbf,0x95,0xbb,0x6e,0x91,0xf6 +.byte 0x63,0xb3,0xde,0xdb,0xc2,0x6f,0xfe,0x00,0xf1,0x53,0x96,0x37,0xa4,0x27,0x48,0x3e,0xf9,0x32,0x23,0x90,0x90,0xe0,0x01,0xde,0x08,0xad,0xc4,0x6c,0x25,0x7a,0x7f,0x2f,0xb7,0xb7,0xc6,0xaf,0xeb,0x91,0x9c,0xa2,0x9c,0xf7,0x7f,0x9f,0x74,0x9b,0x7d,0x54,0x66,0xf9,0xe0,0x73,0xb4,0x15,0x2b,0xaa,0x71,0x50,0xd0,0x74,0x5d,0xcd,0x1c,0x09 +.byte 0x4c,0x80,0xcc,0xdc,0x10,0xd9,0x96,0xb3,0xdc,0x09,0x73,0x1f,0x36,0x4c,0x1b,0x86,0x25,0x13,0x7c,0xd2,0xc6,0x9d,0x5a,0xce,0xd6,0x22,0x97,0x66,0x7b,0x7b,0x84,0xba,0x69,0xd2,0x87,0x9b,0x08,0xda,0x77,0x66,0x90,0xbc,0x7c,0x3c,0x5d,0x43,0x92,0x5f,0x05,0xfb,0x23,0x46,0x88,0xf7,0xa4,0x10,0xbd,0x7d,0x00,0x29,0x2d,0xa5,0x6a,0xab +.byte 0xcc,0xdd,0xcf,0x1e,0x2b,0x9b,0x5f,0xa9,0x94,0x14,0x99,0x6e,0x3b,0x41,0x52,0x61,0x16,0x17,0x44,0xcf,0x5b,0x34,0x5c,0x27,0x29,0x4a,0xc3,0xba,0x9a,0x0c,0x20,0x17,0x2b,0x92,0xd9,0xf1,0x76,0x51,0xd8,0xa5,0x4a,0x4b,0x4a,0x0b,0xe4,0x6b,0x93,0x61,0xc7,0xb3,0x23,0x7a,0x24,0xfa,0x5e,0xee,0x80,0x10,0x65,0x44,0xa5,0xed,0x72,0xd9 +.byte 0x8a,0x06,0x2a,0x86,0xa9,0x26,0x50,0xa1,0xb2,0xb2,0x8b,0x7b,0x4a,0x29,0xf1,0x18,0xef,0xff,0x61,0xf1,0xa1,0x48,0x0f,0x84,0x8c,0xef,0xd8,0x02,0x65,0x44,0x11,0xf2,0xe1,0xba,0x98,0x03,0xbe,0x5a,0x5d,0xb8,0x0a,0x88,0xd8,0x4a,0x49,0x4c,0x70,0xa6,0x98,0x81,0x36,0x56,0x92,0xde,0xcb,0xaf,0x33,0xf5,0x1c,0x0a,0xce,0x7a,0xc0,0xff +.byte 0x24,0x54,0xd3,0x9a,0x0f,0x82,0x76,0xe5,0x0e,0x82,0xb4,0xfe,0xc2,0xac,0xe4,0xba,0xa3,0x4c,0x8a,0x0d,0xa7,0x3e,0x2b,0x71,0x73,0x5f,0xd2,0x35,0xd3,0xae,0xc0,0x3e,0x6f,0x67,0x98,0x51,0xa6,0xdf,0xb2,0xf4,0xd2,0xc1,0x43,0xe2,0x0a,0x7c,0xa0,0xb6,0xff,0xfc,0xc0,0x88,0xe5,0x34,0x20,0x79,0x50,0xc3,0x06,0x5b,0x20,0x9f,0x05,0x33 +.byte 0x22,0x30,0xaf,0xc4,0xc3,0x17,0x09,0xbb,0x30,0x0f,0x42,0xb7,0xc1,0xe0,0x4c,0x71,0xc5,0xf7,0x96,0xb4,0xd4,0x0f,0x44,0x47,0xa3,0x06,0x17,0xbd,0x0f,0x7c,0xc6,0x53,0x07,0x34,0x9a,0x9a,0x2f,0x3f,0x01,0xea,0xdf,0x1c,0x06,0x33,0x15,0x9c,0x5a,0xe3,0x33,0x29,0xce,0x40,0x4b,0xb1,0x99,0xe0,0x80,0x6e,0x0c,0xa1,0x4c,0x34,0x01,0x21 +.byte 0x12,0xbe,0x67,0x26,0xe6,0xdb,0xab,0x8d,0x45,0xdd,0x12,0x60,0x02,0x1a,0xdd,0x85,0xd6,0x33,0x78,0x23,0xe1,0x58,0x2a,0x46,0xf0,0xc2,0x4d,0x71,0x59,0x5b,0x8d,0x65,0xa7,0x97,0xf4,0x71,0x88,0x7d,0x60,0xe0,0x2d,0x2d,0x09,0x2f,0x26,0x15,0xa7,0xbf,0x30,0x0b,0x99,0x08,0xd7,0x85,0xfc,0x0c,0x19,0x31,0xde,0x5e,0x55,0x91,0x13,0x45 +.byte 0x3a,0x6d,0xd0,0x61,0x02,0x81,0xa0,0x42,0x7d,0xd8,0x7d,0x41,0x11,0xd2,0x25,0xb7,0x15,0xa1,0x16,0x3e,0x70,0x77,0x1b,0x80,0xb7,0xf1,0x24,0x8e,0x70,0x8d,0x73,0x6d,0xba,0xf1,0x46,0x32,0x60,0xe4,0xc8,0x4d,0x69,0xc8,0x10,0xf8,0x2d,0x53,0xe1,0x81,0x96,0x20,0x9d,0x59,0x74,0xae,0x93,0x92,0x44,0x5a,0x09,0x79,0x20,0xcb,0xff,0xb2 +.byte 0x08,0x7a,0x81,0xee,0x98,0x83,0x0b,0xa4,0x15,0xb0,0xaa,0x55,0xb0,0xb5,0x60,0x09,0x21,0xeb,0xe2,0x9b,0x57,0x41,0xb9,0xb4,0xd9,0xbe,0x7d,0x60,0x5d,0x25,0xde,0x9f,0x9e,0x5b,0x7c,0xee,0xeb,0x87,0x54,0x6a,0xc3,0xcf,0xec,0x57,0xce,0x97,0x2e,0x47,0x84,0x4c,0x15,0xf4,0xf5,0xe9,0xd4,0x45,0x23,0x20,0xf0,0x0f,0xda,0x97,0xc2,0xb9 +.byte 0xb2,0xe2,0x44,0xea,0xbd,0x95,0x73,0xcc,0x94,0x03,0x0b,0x97,0xeb,0x03,0xc1,0x51,0xc8,0x14,0xa6,0x7d,0x18,0x30,0xa1,0xda,0xa3,0xcd,0x78,0x67,0xb0,0xc1,0x6c,0x88,0xdd,0xd6,0x52,0x4b,0x85,0x1d,0x4a,0xaa,0x44,0xec,0x3b,0xff,0x00,0xd8,0x9e,0x18,0xf8,0xac,0x4f,0x73,0x6d,0xc7,0x4b,0x59,0x15,0x85,0x87,0x02,0xd8,0xf1,0xe6,0xfb +.byte 0x66,0x57,0xcf,0x06,0x84,0x50,0xc5,0x67,0x94,0xc6,0x96,0xb2,0x1a,0x37,0x06,0x3d,0x21,0xf2,0x1e,0xb4,0xe7,0xcb,0x36,0x8b,0xa3,0xe3,0x84,0xa0,0x9a,0x31,0xdb,0x87,0xf9,0xb0,0xef,0x06,0xfe,0xb0,0x8a,0x32,0x53,0xb4,0x41,0x79,0x6b,0xf7,0x7c,0xf7,0x9c,0xc1,0xea,0x61,0xf3,0x75,0xac,0x1f,0x92,0x75,0x44,0x58,0x9a,0x20,0xa4,0x20 +.byte 0xe3,0x19,0x1c,0x0d,0x27,0xe5,0x2e,0xbd,0x14,0xcb,0x40,0x3f,0x1c,0x19,0x7c,0xf9,0x92,0x13,0x1a,0x71,0x87,0xaf,0x77,0x0f,0x50,0x92,0x06,0x75,0x2d,0x75,0xe0,0x2e,0x37,0x54,0xcd,0xac,0xcb,0xca,0x7c,0x0e,0x66,0x53,0x10,0x50,0x70,0x9a,0xa4,0x79,0x76,0x87,0x71,0x4a,0x55,0xd4,0xa3,0x83,0xb3,0x04,0xed,0xa9,0xd6,0x84,0x7d,0x1a +.byte 0x64,0x5d,0xf7,0x4f,0x55,0x97,0x5e,0x26,0x9c,0x03,0x42,0x0a,0x16,0xd3,0xdf,0xc8,0x07,0xb8,0xb3,0xe9,0xac,0xa9,0x99,0x83,0x32,0x5b,0x83,0xde,0x7f,0x2b,0x70,0xca,0x15,0x09,0x33,0x0e,0x28,0xc9,0x89,0xc6,0xa6,0x47,0xd1,0x56,0x04,0x40,0x5d,0xd2,0x17,0x1d,0x32,0x21,0x6d,0xb2,0xc7,0x89,0x14,0x98,0xc6,0x58,0xc4,0xca,0xda,0x0f +.byte 0x32,0xdd,0xe1,0xe1,0x9a,0x25,0x09,0x31,0x16,0xf1,0x48,0x40,0x1c,0xc2,0xf9,0xd0,0xba,0xec,0x07,0x94,0xea,0x17,0xcf,0x6e,0xbc,0xfd,0x70,0xb4,0xbb,0x40,0xae,0xc3,0xae,0xf7,0x56,0xf5,0x13,0x55,0xfb,0x4b,0x81,0x5d,0xab,0xf2,0x3f,0xd7,0xa7,0xe6,0xcf,0x17,0xef,0x1f,0x71,0x1b,0x92,0x67,0xd3,0xd2,0xed,0x89,0x14,0x8f,0x8d,0x83 +.byte 0xef,0x7f,0xca,0x65,0x6d,0x79,0x13,0x5f,0x6e,0xf9,0x5d,0x9a,0x68,0x54,0x71,0x5c,0x9d,0x03,0x7c,0x73,0x7a,0xc2,0x17,0x9b,0x5a,0x7d,0x45,0x24,0x0c,0x41,0x13,0xe4,0xcb,0xdb,0x7b,0xc6,0xfb,0x93,0x48,0xca,0xd3,0x01,0x68,0x3f,0x36,0xc0,0x4b,0x1d,0xfa,0x9f,0x25,0x0e,0xcc,0xd0,0xf7,0xa0,0x7a,0x14,0xac,0xd7,0x6e,0x00,0x9f,0xf1 +.byte 0xc0,0xdc,0xfc,0x3b,0xd9,0xbf,0x68,0xfd,0x65,0x34,0x66,0x18,0xe5,0x02,0x9a,0x2d,0xff,0xaa,0xf7,0x73,0x58,0x21,0xe3,0xff,0x23,0x0f,0x63,0x1f,0xf3,0x8b,0x08,0xc7,0x00,0x46,0xe7,0xef,0x85,0x5f,0x7f,0xd9,0x5f,0xc2,0x36,0xe2,0xb6,0xa3,0x00,0xcb,0xff,0xe0,0x22,0x28,0x8c,0xb1,0xb1,0x17,0x91,0x4a,0x4a,0xc8,0x77,0x5a,0xa9,0xb2 +.byte 0x6e,0xb7,0xf0,0x4f,0x70,0x34,0x7f,0x87,0x2a,0x0c,0xcb,0x16,0x24,0x9b,0x41,0xb2,0x3e,0x0a,0xc1,0x33,0xf3,0xbb,0x48,0x17,0x2f,0xe6,0xfc,0xf4,0x27,0xc0,0xdb,0x58,0x24,0x9b,0x99,0x43,0x25,0xfb,0xd3,0xcf,0x1c,0x5a,0x5f,0xbe,0x28,0x3a,0x84,0x51,0x19,0xc3,0x53,0x6b,0xc8,0x73,0x44,0x6e,0x3d,0x7e,0x01,0x37,0xc2,0x2b,0xf7,0xa8 +.byte 0x1f,0x8e,0xd8,0x02,0x5a,0xae,0x56,0x81,0x2b,0x46,0x1b,0x7d,0xca,0x27,0x1f,0x48,0x99,0x24,0x54,0x59,0x08,0xfd,0xb7,0xdf,0x0a,0x77,0xef,0x4e,0x89,0x21,0x71,0x71,0x3f,0x8c,0xd7,0x52,0x89,0x7a,0x0d,0x68,0x09,0xc8,0x88,0x9c,0x0c,0x60,0xca,0x77,0x96,0xeb,0x05,0xeb,0xeb,0x60,0x5b,0x68,0x51,0x2c,0xcb,0x8f,0xca,0x3b,0x18,0x39 +.byte 0x28,0x8f,0xda,0x17,0x9b,0x53,0x71,0x26,0xa9,0x19,0xfb,0x1e,0x4a,0xd0,0x14,0x93,0x1c,0xee,0xe1,0x21,0xea,0xb3,0x16,0x47,0xaf,0x50,0xe5,0xe5,0xd3,0x21,0x8c,0x67,0x46,0x5d,0x97,0x19,0xda,0x6e,0xd9,0x70,0x7d,0x9f,0xd6,0x25,0xd0,0xfb,0x01,0x62,0x0a,0x9e,0x49,0x3d,0x33,0x0d,0x35,0xe5,0xae,0xfd,0xeb,0xb5,0x9b,0xd8,0xc1,0x2a +.byte 0xee,0x4d,0xf2,0xfc,0x16,0x51,0xab,0x58,0x7a,0x9e,0x5c,0xca,0x0a,0x92,0xbb,0xbb,0xa8,0x5b,0xfb,0xf9,0x33,0x67,0x0e,0x13,0x4c,0x83,0x3a,0x25,0x84,0x23,0xe1,0x41,0xfb,0xf1,0x42,0xc1,0x8d,0x58,0x0c,0x5e,0x75,0x09,0x34,0x58,0x96,0x32,0x54,0xb6,0xd8,0xaa,0x48,0xc1,0xed,0xc0,0x92,0x5a,0xec,0xeb,0xb1,0x75,0x59,0xf6,0x35,0xf5 +.byte 0xfd,0x7d,0x96,0x9b,0x83,0x38,0x31,0x10,0xa4,0xd7,0xfb,0x28,0xf0,0xc9,0xe4,0x33,0x5d,0x66,0x81,0x9c,0x31,0x9a,0xe9,0x9a,0x5e,0x70,0xf7,0x61,0xf9,0x93,0xaf,0x2b,0xbd,0x78,0x9e,0xdc,0x61,0xe0,0xa9,0xd1,0xa0,0x8e,0x3a,0x5f,0xb1,0x71,0xe7,0x9e,0xfd,0x81,0xee,0xf0,0xd6,0x63,0xec,0x4a,0xca,0x30,0xaf,0xb6,0x2d,0xaa,0x2d,0xa1 +.byte 0x5a,0x38,0xb5,0xc6,0x3f,0x5f,0x63,0x48,0xd3,0x18,0xeb,0xe3,0x36,0xca,0x91,0x86,0x4b,0x6f,0x57,0x66,0x47,0x2f,0xce,0xe4,0x44,0x26,0xe4,0xfd,0x8c,0xde,0x74,0xdc,0x17,0x0e,0x7d,0x6a,0xcf,0x89,0x0e,0x7f,0x09,0x65,0xf8,0xeb,0x58,0x00,0x3d,0xc5,0x1b,0x14,0xc5,0xca,0xca,0x28,0xbc,0xb7,0x63,0x6f,0x3b,0xa4,0x62,0x23,0x0e,0xd5 +.byte 0x04,0x76,0x0c,0xe8,0xea,0x64,0x10,0x3a,0x76,0x03,0xd6,0xea,0x69,0x52,0x14,0xa7,0x5e,0x40,0x7e,0x14,0xdb,0x7f,0xbf,0xe8,0xf6,0xf0,0xdd,0x5e,0xac,0x55,0x44,0xfb,0x28,0xf3,0x16,0xcb,0xed,0x8f,0x10,0x01,0x91,0xac,0x2c,0x27,0x46,0x0c,0x51,0xd6,0xf6,0x30,0xa3,0x34,0xd0,0x5e,0x93,0xe8,0x4e,0xc0,0xb4,0x9b,0xc1,0xe8,0x20,0x7d +.byte 0xb7,0x68,0xdd,0xf1,0xc4,0x60,0x20,0x97,0xdd,0x5c,0x7c,0x9b,0xea,0xc0,0x22,0x84,0x2c,0x65,0x78,0xbd,0x18,0xa1,0x62,0x7e,0x06,0x49,0x96,0xde,0xd1,0x89,0x06,0x0d,0x35,0xa0,0xcc,0x22,0xd3,0xf5,0xa6,0x4b,0xb6,0xca,0x43,0x34,0x5a,0x3d,0x39,0x95,0x0b,0x95,0xbe,0xdc,0xe6,0x61,0x72,0xbe,0x2f,0x19,0x1c,0xe8,0x22,0x5e,0x18,0xc9 +.byte 0x59,0x4a,0x08,0xa3,0x85,0x5c,0x06,0x36,0x00,0x2e,0x84,0x3e,0x3e,0x07,0x5b,0xfa,0xda,0xbb,0xbb,0x57,0x20,0x6f,0x1b,0x8d,0xe5,0xc5,0xdb,0x8d,0x23,0x1a,0xfc,0x67,0xa9,0xc8,0xea,0xe1,0x54,0xbb,0x8a,0x8a,0x0b,0xa6,0x02,0x35,0xd6,0xd5,0x4d,0xff,0x09,0x79,0x31,0x9a,0xc2,0xad,0xa7,0x66,0xb5,0x3c,0xbd,0xb7,0xcb,0x17,0x30,0x4b +.byte 0x56,0xf5,0xd2,0x51,0x90,0xbb,0x47,0x00,0xc0,0xf3,0x8b,0xd7,0x10,0x33,0x6d,0xe8,0xe4,0xcf,0xd6,0xbf,0x35,0x75,0x8d,0x40,0x55,0xd7,0x5d,0xb0,0x40,0xf6,0x95,0xfb,0x1a,0x97,0x24,0xb8,0xc1,0x91,0x5f,0x66,0x6c,0xc7,0xdb,0x16,0xba,0xb8,0x07,0xf8,0xf8,0x91,0xb2,0x8c,0x26,0xb9,0xa2,0x59,0xb0,0xde,0x49,0x63,0xcc,0x7c,0x4c,0x48 +.byte 0xb5,0xe4,0xf9,0x81,0x28,0x48,0x9f,0xa0,0xa4,0xf8,0x0d,0xcc,0x7b,0xf3,0xce,0x08,0x85,0x73,0x4a,0x64,0xfc,0xa8,0xc0,0xae,0x7a,0xbf,0xa5,0x3f,0x45,0xaf,0xe7,0x7f,0x41,0x61,0x34,0x08,0x6e,0x09,0x0d,0x9d,0xea,0x90,0xbe,0x62,0x7c,0x38,0x92,0xa7,0x63,0xfa,0x03,0x80,0x10,0xc4,0x53,0x46,0x0b,0x44,0x88,0xea,0x50,0xb6,0x82,0xf8 +.byte 0x0b,0x2d,0x93,0x63,0x82,0x80,0x2b,0x61,0x3e,0x17,0xd1,0xd8,0x6c,0xb1,0xb4,0xbd,0xfd,0xad,0x1c,0x10,0x30,0xc1,0x78,0xd4,0x5f,0x21,0x49,0x54,0x7a,0x08,0x2b,0x25,0x3b,0xc9,0xb7,0x0a,0xf2,0x37,0x83,0xc0,0x43,0x73,0xee,0xd6,0x8b,0x92,0x15,0xde,0xfe,0x14,0xf1,0xfb,0x8b,0x4a,0x85,0x8d,0x78,0xe6,0x36,0x1a,0xbb,0x32,0x6c,0xdd +.byte 0x43,0x76,0xad,0x68,0x90,0x08,0xd2,0xbd,0x24,0x41,0xd4,0x93,0x17,0xa8,0x9f,0xeb,0x33,0x25,0x1f,0x1a,0xfd,0x45,0x20,0xc1,0x47,0xf1,0x25,0x09,0x89,0x14,0x9e,0x4c,0x88,0xa4,0x1c,0xb8,0xba,0x84,0xd5,0x7d,0x73,0xb2,0x9c,0x48,0x9f,0x84,0x31,0xd3,0x2c,0xe1,0x94,0x61,0x3e,0x5f,0x37,0x25,0xc7,0xb7,0x2d,0xc3,0xa9,0xaf,0xcc,0x0e +.byte 0xe6,0xc7,0x9a,0xa7,0x06,0xe3,0x41,0xb8,0xa6,0xa8,0x9a,0xe7,0x76,0xef,0x83,0x5a,0x80,0xa4,0xe3,0x0c,0x04,0xa2,0x0b,0x91,0x33,0x34,0x17,0xa4,0x02,0x2d,0x12,0x84,0x67,0x85,0x6b,0xc0,0x3a,0x0d,0x16,0xf2,0x66,0x04,0x71,0xe9,0xec,0xa6,0xbb,0x58,0x42,0x92,0x70,0xf5,0x0d,0x52,0xcd,0x1e,0x2d,0xd4,0x28,0x0f,0x68,0x35,0xd9,0xa4 +.byte 0x40,0x09,0x30,0xe9,0xbb,0xaf,0x77,0x63,0x4f,0xba,0x56,0x97,0xe8,0x92,0xcc,0xba,0xdb,0xe4,0xe0,0xdf,0x19,0x21,0x71,0x23,0x3d,0xd0,0xb1,0x25,0xd3,0xf8,0x53,0x01,0x30,0x9a,0xea,0x84,0x1b,0x18,0x68,0x4a,0xb9,0x9e,0x60,0xc4,0xfc,0xf7,0x56,0xb7,0x49,0xe1,0x50,0x38,0x7d,0x3d,0x87,0xa2,0xad,0x38,0x5c,0x0c,0x53,0x21,0xa0,0x56 +.byte 0x3a,0x94,0xd7,0xa8,0x23,0x96,0xa9,0x66,0x4e,0x88,0xae,0x4b,0x6e,0xcb,0xc6,0xa6,0xdb,0x1f,0x2e,0xae,0xe7,0x24,0xe2,0x1e,0xf7,0x3a,0x14,0x48,0x5e,0xfa,0x90,0x0a,0x84,0xa6,0x1c,0xaa,0x60,0xc0,0x2c,0x69,0xe8,0x36,0xb3,0xee,0x55,0x2a,0xf7,0x90,0xa1,0x92,0x4f,0x29,0x1e,0x49,0x6e,0x73,0x22,0x1f,0x8b,0x0c,0xb6,0xf4,0x3c,0xbf +.byte 0x82,0x47,0x49,0xc3,0x94,0x0e,0xcf,0x9b,0x86,0x88,0xc2,0xd0,0xd7,0xa7,0x43,0xfb,0x89,0x4b,0xbd,0x5d,0x4c,0x6b,0x7a,0xc7,0x74,0x1b,0xfb,0x48,0x12,0x68,0x61,0x91,0xf9,0xf3,0xb6,0x7f,0x4f,0x72,0x89,0xf0,0x72,0x46,0xf7,0x6f,0x84,0xd1,0x38,0x6d,0xd9,0x1b,0xa5,0xd1,0xe2,0x29,0xe0,0xa6,0xbf,0x1c,0xbd,0xfb,0xdd,0xdc,0xa5,0xae +.byte 0x7a,0x9c,0xd0,0xc3,0xfa,0x6f,0x72,0xa3,0xa2,0x8b,0x87,0x0d,0x9a,0x6a,0xfc,0x53,0x9a,0x08,0x61,0x86,0x67,0x2a,0x90,0x6a,0x09,0x20,0x8e,0xde,0x32,0x35,0x34,0x75,0xc0,0xa8,0xab,0x1b,0xc4,0x7c,0xc8,0xd9,0x90,0xcf,0x32,0x27,0x6c,0x68,0xf9,0x18,0x14,0x05,0x57,0x39,0xc6,0x9e,0x5e,0x38,0x07,0xdb,0x81,0xb4,0xa4,0x54,0x06,0xd6 +.byte 0x79,0x78,0x0e,0xc8,0xb9,0x56,0xda,0x08,0x2e,0x77,0x26,0xcc,0xf7,0xa5,0x2d,0xd8,0x91,0xa6,0xfc,0x25,0x0e,0x91,0xdd,0x3c,0xa8,0x14,0x7a,0x95,0x05,0x5b,0x15,0x7d,0x1d,0x9b,0x3c,0x8c,0xfd,0xdc,0xa5,0xcd,0xec,0xea,0x7a,0x2b,0x7e,0x79,0x21,0x54,0xea,0x7f,0x52,0xb4,0xbb,0x4f,0x07,0x95,0x39,0x4a,0xaf,0x2e,0xb4,0x1e,0x9e,0xc6 +.byte 0x0a,0x07,0x58,0xd4,0xa5,0x44,0x73,0xa8,0x84,0x26,0x67,0xb8,0x0f,0xc7,0x6b,0xa7,0x28,0xf6,0x05,0x91,0x3e,0x22,0xcd,0xd7,0xf5,0xfc,0xae,0x22,0x42,0x96,0x3b,0x57,0x91,0xce,0x44,0xd0,0xfd,0xc3,0x4c,0x8b,0x8b,0x67,0xfe,0x03,0x86,0x92,0x34,0xf7,0xf9,0x53,0xb3,0xdf,0x36,0xcf,0x16,0x1c,0x68,0x36,0x17,0x1f,0x41,0x56,0x1d,0xda +.byte 0x90,0xb3,0xab,0x03,0x97,0x88,0x23,0x65,0x89,0x72,0xe3,0x6d,0x8e,0x37,0x5d,0xee,0x89,0x81,0x11,0x27,0x8b,0xf0,0x9b,0xef,0xa2,0x34,0x45,0xcc,0x41,0xcf,0x2a,0x88,0x70,0xe4,0x78,0xfc,0xe1,0xb5,0x51,0x70,0x84,0x64,0xd1,0x10,0x71,0x5d,0xa4,0xb4,0x6d,0xb5,0x98,0x6e,0xcc,0x9a,0x62,0x14,0x30,0xce,0x1a,0xff,0x49,0xd6,0xaa,0xcc +.byte 0xe1,0x99,0x42,0xb1,0xfe,0x77,0x8a,0x2d,0xdb,0xc0,0x0d,0x50,0x53,0x0d,0x92,0xe5,0x2b,0xd0,0x78,0x83,0x08,0x4a,0x0c,0x1d,0x5b,0x03,0x22,0x65,0x3d,0x9e,0xdb,0xcf,0x01,0x61,0xf7,0x6d,0x2b,0x99,0xef,0xba,0x80,0x50,0xda,0xda,0x2d,0xbf,0x00,0xdf,0x6f,0xec,0x95,0xbc,0x5b,0x4e,0xda,0x83,0xe4,0x5d,0xf0,0xa7,0x1b,0x27,0xf1,0x76 +.byte 0x04,0x5d,0x3d,0x2c,0x12,0x15,0xad,0xef,0x47,0xdc,0x22,0x9b,0xc2,0x80,0x91,0xf3,0xbf,0x16,0xe9,0xd3,0x35,0x94,0x4b,0xfd,0xa3,0xa1,0xee,0x98,0xad,0x99,0xea,0x07,0xe1,0x0f,0xa7,0xbd,0x0b,0xfb,0xc0,0xd5,0xb0,0x49,0x37,0xc6,0x5f,0xe7,0x18,0xc1,0x60,0xe9,0x1d,0x5e,0x0e,0xea,0x73,0xf2,0xa1,0x75,0x7e,0x39,0x51,0x07,0x1e,0xcb +.byte 0x2a,0x5b,0x26,0x75,0xbe,0x02,0x5e,0xde,0x6c,0x37,0xb1,0x3c,0x1f,0x25,0x65,0x7d,0x9e,0x5d,0xa1,0x0b,0x98,0x27,0x53,0xb9,0xbb,0xc2,0x3e,0x8d,0x2d,0x5e,0x5c,0xbf,0xed,0x66,0xe8,0xd1,0x7d,0xaa,0xef,0xca,0x0e,0xd0,0x78,0x2b,0x89,0x07,0x76,0xb6,0xc3,0x92,0x42,0x3a,0x84,0x1d,0x81,0xc1,0xe8,0x1a,0xb8,0xe6,0xf1,0x43,0xcc,0x7a +.byte 0x59,0x4d,0x9f,0x00,0xfe,0x6a,0xe5,0x42,0x71,0x3c,0xcb,0xc8,0x45,0x18,0xf0,0xf2,0x81,0x9d,0x5a,0xb7,0x8d,0xbe,0x31,0xcb,0x7d,0xca,0xb7,0x19,0x57,0xb1,0x61,0x36,0x90,0x42,0xe2,0xc3,0xf5,0xa5,0x4b,0xc3,0xd4,0xe7,0x6c,0xb6,0x0c,0x06,0x19,0x4b,0x54,0x8f,0x2d,0xdc,0xc5,0x2b,0xff,0x1c,0x61,0x29,0xda,0x95,0x4f,0xa1,0x21,0x25 +.byte 0x24,0xbe,0xc7,0x34,0x2f,0xbf,0x33,0x6d,0x82,0x8f,0xf1,0xa9,0x97,0x5a,0x49,0x7f,0x60,0x00,0xf2,0x3e,0x7b,0x64,0xdf,0xc8,0xd3,0x5f,0x6e,0x1f,0xfb,0x71,0x80,0xf3,0x55,0x42,0xbe,0x32,0x7b,0xa9,0xeb,0xf6,0x31,0xe2,0xf0,0xd1,0xe9,0xbe,0x96,0x0e,0xb3,0xdf,0x3e,0xb2,0x2c,0xc3,0xce,0xbd,0xe7,0xfe,0x1c,0xed,0x2c,0x0b,0xaa,0x32 +.byte 0x76,0x82,0xb4,0x6b,0x18,0xa7,0x68,0x19,0xb7,0x27,0x21,0x4c,0xb0,0x22,0x98,0x58,0xd5,0x90,0x80,0xab,0xa1,0xfe,0x83,0xc5,0x66,0xf6,0x3e,0xa2,0xa9,0x6f,0x73,0xce,0x7f,0x0c,0xe6,0xde,0xee,0xb0,0xe6,0x2a,0xcc,0xcc,0xb0,0x53,0x8c,0xce,0xc8,0xdc,0xea,0x83,0xb4,0x0e,0x69,0x8d,0x90,0x86,0xaa,0xe3,0x3b,0xfb,0x88,0xe2,0xe8,0x27 +.byte 0x65,0x36,0x07,0xb3,0x91,0x0e,0x5a,0x6b,0x9f,0x0f,0xbd,0x81,0xb3,0x54,0x65,0x71,0xa4,0x2c,0x8e,0xda,0x47,0x04,0xce,0xfe,0x00,0x52,0xf1,0xdf,0x82,0x27,0x70,0x2a,0xb1,0x79,0x2f,0x27,0x7f,0xae,0x9e,0x5c,0x36,0xec,0xa0,0x2a,0xf3,0x74,0x78,0x01,0x17,0x74,0x2a,0x21,0x4f,0xb8,0xd2,0xe4,0xfe,0x5b,0x06,0x14,0xa5,0xb1,0xb1,0xff +.byte 0xee,0x79,0xf7,0x18,0xb9,0x31,0xa4,0x63,0x47,0x1c,0xdf,0x38,0x04,0x2d,0x18,0xca,0x14,0xf8,0x2f,0xec,0x0d,0x58,0xad,0xbb,0xf4,0x45,0x11,0x0e,0xfa,0x17,0x4c,0x5e,0xd4,0xa6,0xde,0xe4,0x13,0x44,0x2c,0xb9,0xfd,0xcd,0x41,0xe7,0xf9,0xda,0xbc,0x28,0x8f,0x0c,0x41,0x4d,0xa7,0x0d,0xf5,0x96,0xd7,0x8f,0x10,0x96,0xfb,0x75,0x75,0x86 +.byte 0xc9,0x6e,0x23,0x92,0x71,0x69,0x7b,0x94,0x61,0x1c,0x3f,0xcf,0x66,0x34,0x62,0x68,0x5d,0xee,0x7b,0x34,0x5d,0x2a,0x39,0xbb,0x6a,0x34,0xea,0x6e,0xe3,0xe9,0xdb,0xe4,0x34,0x6e,0x29,0x0b,0x21,0x38,0xe7,0x5b,0x79,0x37,0x54,0xf0,0xed,0xaa,0x07,0x2b,0x21,0x29,0x67,0xfe,0x7d,0xa5,0x99,0x0e,0x5d,0x05,0xe7,0x61,0x6e,0xd1,0x4a,0x15 +.byte 0x4a,0x56,0xb1,0x13,0x49,0x8c,0xf4,0x4f,0xd7,0xe9,0x68,0xae,0x09,0x37,0xd3,0x96,0x21,0xe8,0x1f,0x9f,0xa9,0xc6,0x54,0x57,0x63,0x09,0x1e,0x71,0xf2,0x48,0x9e,0x50,0xbb,0xb3,0xf1,0x4e,0x2d,0x1d,0x79,0x69,0x0a,0xa2,0xa9,0xdd,0x1b,0x55,0x62,0x6b,0x0d,0xcc,0x9c,0xb1,0x5e,0xc8,0x4c,0x4f,0x62,0x3c,0xc4,0xa3,0xb4,0xe4,0x34,0xec +.byte 0x9d,0x0c,0x1b,0x46,0x60,0x68,0xd5,0x04,0xd7,0x1b,0x3c,0x7a,0x98,0x0c,0xd9,0x87,0x2b,0x4f,0x97,0x5b,0x56,0x65,0xb0,0x06,0x6e,0x9e,0x06,0x37,0x0e,0xd2,0xa1,0x52,0xf5,0xaa,0x2b,0xec,0xbd,0x0f,0xb6,0xba,0x48,0x63,0x57,0x51,0xe3,0x00,0x53,0xf5,0x77,0xb2,0xa4,0xb1,0x44,0x01,0x3e,0xcf,0xe9,0x2a,0x7a,0xf5,0x19,0x5e,0x43,0x36 +.byte 0xe0,0x38,0x41,0xbc,0xda,0xb5,0xd0,0x69,0xdf,0xd2,0x04,0xd4,0xf8,0x38,0x37,0x1c,0x90,0x30,0xf2,0x3d,0x03,0xe4,0x3f,0x84,0x2c,0x9a,0xa4,0x8a,0x00,0x4e,0x49,0x24,0x62,0x06,0xb4,0x9d,0x33,0x8a,0x8e,0xd2,0xbd,0x1b,0xa1,0x83,0x0b,0xa5,0xa2,0x5c,0xcf,0xb1,0x65,0x85,0x92,0x1f,0xb0,0x2e,0x3b,0xb2,0xf3,0x80,0xff,0x9d,0x41,0x4d +.byte 0xcd,0x25,0x09,0x02,0x85,0xb3,0xa8,0x49,0x12,0x10,0xe7,0x5c,0x94,0x13,0x4b,0x52,0x53,0x35,0x9c,0xbc,0x7a,0xad,0x04,0x19,0x54,0x8a,0xbc,0x42,0x73,0xf1,0x0a,0x22,0x75,0xbf,0x3b,0x12,0xa8,0xa4,0x47,0x5c,0x95,0x48,0x60,0x71,0x5c,0x9a,0x39,0x5c,0xdb,0x44,0xe8,0x74,0x92,0x3e,0x2b,0x3b,0x1b,0xb7,0x21,0x98,0xe1,0x87,0x32,0xaf +.byte 0x4a,0xe3,0xda,0x4a,0x46,0xde,0x15,0x4c,0xdc,0xc6,0x60,0xe6,0xd7,0x92,0x29,0x05,0x21,0x22,0x9b,0xaf,0xc4,0xd7,0x6a,0xea,0x2c,0x82,0x5d,0xc7,0x81,0xe2,0x67,0x85,0xd2,0x16,0x6f,0x83,0xa8,0x82,0x5f,0x8f,0xf5,0x3a,0x50,0xba,0x04,0xcb,0x76,0x4d,0x80,0x16,0x12,0x72,0xa8,0x6c,0xac,0x78,0xf1,0x8c,0x93,0xab,0xe0,0xb5,0xdc,0xd1 +.byte 0xa5,0x40,0x0e,0x50,0x88,0xd2,0x9d,0x56,0xf6,0xa0,0xd4,0x45,0xcf,0xef,0x16,0x1a,0xa4,0xaa,0x91,0x5c,0xa3,0x8f,0x84,0xf8,0x3e,0x30,0x1f,0x5f,0x55,0xf9,0xd3,0x3d,0xb8,0x64,0xbb,0x3c,0x91,0xe4,0x0d,0xa5,0x43,0x14,0x75,0xe7,0xec,0x8c,0x12,0x56,0x34,0xb0,0xa9,0xae,0x93,0x91,0x34,0xfc,0x78,0xa3,0x81,0x51,0x45,0x7d,0x9f,0x7d +.byte 0x5e,0xc7,0x5e,0x51,0x17,0xfa,0x02,0x5d,0xb2,0xf7,0x79,0x4b,0x49,0xd2,0x1b,0x6f,0xfd,0x9e,0xff,0x75,0x74,0xf0,0x26,0x7e,0xd7,0x65,0xb0,0xf3,0x0a,0x0c,0xd2,0xa2,0x26,0x98,0x03,0x26,0xb5,0x67,0xc4,0xc0,0xed,0x80,0xd4,0x20,0xf6,0x7e,0x17,0x54,0xeb,0xde,0xc3,0x86,0x51,0xda,0xf7,0xe5,0xc7,0xfe,0xfc,0x71,0x83,0x80,0xbe,0xde +.byte 0x4b,0xda,0x83,0x76,0x63,0x04,0x03,0xdd,0xe0,0xe0,0x4e,0xb6,0x32,0xd5,0xd0,0xce,0xd7,0xaa,0xcd,0x5f,0x64,0xa6,0xd8,0x9e,0xc5,0x97,0x30,0xad,0xf1,0x82,0x8f,0x7c,0x18,0xec,0x30,0x1d,0x2d,0xb6,0xdb,0x33,0x65,0xed,0xe2,0x24,0xd8,0xba,0x0a,0x1f,0x79,0x2a,0x1c,0xe1,0x4e,0x04,0xa6,0x74,0x74,0x37,0x42,0x94,0xc4,0x99,0x0e,0xf8 +.byte 0x3f,0xf3,0xff,0xeb,0x7f,0x95,0x9c,0x47,0x56,0x68,0x6a,0x0d,0x6e,0x66,0x71,0x3b,0x51,0xd5,0x12,0x7e,0x59,0x39,0x43,0xb5,0x53,0xd3,0x1d,0xa2,0xe9,0xa1,0xc8,0x8d,0xf2,0x8e,0xa1,0x9c,0x36,0xdd,0xda,0xd3,0x61,0xd8,0xe9,0x76,0x5e,0xcb,0x0a,0x52,0xc8,0x5a,0x25,0x00,0x21,0xea,0x6a,0x96,0xde,0x02,0x76,0x02,0x63,0x73,0x28,0x63 +.byte 0x46,0x37,0xe1,0x75,0x2f,0x42,0x8f,0xee,0x2c,0x84,0x82,0x43,0x43,0x2d,0xa9,0x13,0x50,0x46,0x54,0xed,0x76,0xbd,0x10,0x1c,0x9b,0xa1,0x42,0x97,0x68,0xca,0x84,0x2e,0x1d,0x6f,0x86,0x67,0xaf,0xb7,0x20,0xc1,0x7c,0xab,0x70,0x20,0xa1,0x79,0x71,0xe4,0xb7,0x45,0x8a,0x04,0xd3,0x70,0x10,0xa8,0x28,0xc3,0x56,0xff,0x43,0x36,0x13,0x88 +.byte 0xb6,0x2d,0xfd,0x7f,0xbc,0xc9,0x1d,0x11,0x9a,0x7c,0xd0,0xfc,0x11,0xac,0x54,0xd5,0xc3,0x03,0xd1,0xe3,0x9e,0xff,0x03,0xdb,0xd9,0xd8,0x77,0x96,0x08,0xf4,0x1b,0xd9,0xfa,0x70,0xed,0xab,0x53,0x78,0xca,0x28,0xa7,0x29,0x49,0x45,0x37,0x10,0x8f,0x61,0x7d,0x11,0x99,0x2e,0xe8,0x5d,0x45,0x3a,0xe7,0xd2,0x6c,0xb6,0x03,0xc4,0x6d,0xaa +.byte 0x52,0x60,0x8c,0xc6,0x9c,0x17,0xba,0xf6,0x3b,0xd4,0x4b,0x26,0x63,0x92,0x8c,0xb9,0x6a,0xf2,0x26,0x91,0x9d,0x8d,0x99,0x39,0x26,0x7d,0xb5,0x4f,0x4c,0xc6,0x0e,0x2e,0xe1,0xc6,0xcb,0x98,0x93,0x71,0x9b,0xaa,0x01,0x40,0x70,0x93,0x2a,0xe8,0x27,0xc5,0x20,0xa7,0xd2,0x06,0x8b,0xb0,0x29,0xcd,0x4f,0x2c,0x5a,0xde,0x35,0xc7,0x2a,0x8e +.byte 0xa7,0xae,0x02,0xfa,0x8e,0x4d,0xf3,0x77,0x67,0xe0,0xcb,0x84,0x69,0xc6,0x05,0xe4,0x84,0xe3,0x6e,0x02,0x6c,0x3b,0x93,0x30,0x3e,0x89,0x2c,0xc7,0xa5,0x7e,0xaa,0x58,0x59,0x25,0xf6,0xff,0x56,0x9a,0x4a,0x70,0xbf,0x88,0x20,0x8d,0x51,0x5e,0x08,0x13,0x26,0x2c,0x5d,0x88,0x13,0x3e,0x32,0x7a,0xf6,0x17,0x5c,0xdb,0xc4,0xcd,0x5a,0x16 +.byte 0x65,0xe4,0x34,0xeb,0x21,0x6d,0xb9,0x30,0x5d,0xc0,0xa2,0xea,0x4f,0x63,0x0e,0xbe,0x32,0x91,0x89,0x6f,0x96,0x40,0xf3,0x5f,0xa3,0xf2,0x15,0xc3,0x3c,0x3c,0xb8,0x2f,0x0d,0xc2,0xcd,0x4e,0xa0,0xa5,0xf6,0x78,0x40,0x0b,0x90,0x11,0x52,0xff,0x8f,0x7f,0x6a,0x0c,0xd6,0x3b,0x64,0x80,0x47,0xfa,0x70,0xbe,0x01,0xdc,0xdf,0x5b,0x75,0x7c +.byte 0xca,0x66,0xf0,0x2a,0x53,0x89,0x55,0x87,0xf8,0xec,0xd1,0x18,0x22,0x0c,0xd5,0x0e,0xc8,0x1c,0xbc,0x1e,0x66,0x14,0x44,0x10,0x3c,0xd4,0x2e,0xca,0x0b,0xd8,0x3f,0x81,0xd8,0x9f,0x81,0xf6,0x62,0x23,0xe4,0xc7,0x0d,0xb0,0x1b,0x00,0xd8,0xf4,0x1a,0xdd,0x9b,0xa1,0x74,0xeb,0xf0,0x65,0x5c,0x82,0x00,0x17,0xa6,0x68,0x29,0xd5,0xa4,0x64 +.byte 0xd3,0x15,0x90,0xd0,0x91,0x17,0xfc,0xd2,0xd7,0xad,0x4b,0xd8,0x41,0x03,0x51,0xfd,0x61,0xac,0x34,0xd4,0xff,0xaa,0xb1,0x64,0x6c,0x79,0x78,0xf7,0x6b,0x18,0x03,0x2b,0x6b,0x9a,0xd7,0xce,0x55,0x6e,0xdd,0xab,0x2e,0xbc,0x27,0x3a,0x8c,0xa5,0x8d,0xf0,0x55,0x81,0x0c,0x6e,0x8d,0xd8,0xd2,0x24,0x5e,0x2e,0x56,0xa8,0x1e,0x9c,0x98,0x88 +.byte 0xd3,0xbe,0x90,0x56,0x70,0xe5,0xcc,0x49,0x2a,0x13,0x98,0x99,0xbd,0xc9,0x9f,0x53,0x85,0x07,0xbe,0x54,0xa7,0x4c,0xd6,0x96,0x7d,0x8f,0x24,0x79,0x67,0xb2,0x62,0x4c,0x6a,0xc1,0x6c,0xb7,0xdc,0xe9,0x21,0xe3,0x27,0xc7,0x53,0xff,0xe7,0xd1,0xea,0x60,0xa8,0x56,0x08,0x5c,0x29,0x0a,0x04,0x0c,0xda,0x7a,0x70,0x8c,0x3d,0x55,0x3f,0xcf +.byte 0x9e,0xea,0x74,0x8b,0xbc,0xf0,0xf1,0x3a,0x86,0x22,0xe5,0x54,0xa7,0x70,0xc2,0xcd,0xb8,0x9f,0x4e,0x9f,0x48,0xa8,0xc0,0x82,0x0d,0x73,0x8b,0x3c,0xfc,0x20,0xf4,0xbe,0x79,0xde,0x8e,0x3c,0x26,0x85,0xde,0x74,0xd1,0xe3,0xd5,0x8f,0x39,0x71,0x46,0x8c,0xbd,0x68,0x28,0x2d,0x36,0x0d,0x66,0xc1,0x0b,0x96,0x3e,0x11,0x2e,0x44,0x17,0xd5 +.byte 0xfe,0x0d,0x70,0x84,0x96,0x20,0x34,0x2f,0xbe,0xf0,0xf5,0x9b,0xb4,0x5a,0xa9,0x50,0x6a,0xda,0xdb,0x69,0xea,0xef,0xa9,0xaa,0x06,0xc0,0x68,0xa4,0x61,0x1b,0x4b,0xf8,0x0b,0x56,0x91,0xc8,0x6f,0x39,0x15,0xe2,0xcc,0xbf,0x2b,0x36,0x96,0x0c,0x84,0xfb,0x3d,0x4b,0x09,0xe3,0xc2,0x4b,0x05,0x5e,0xfa,0x30,0x75,0xc5,0x54,0xa5,0xbd,0x45 +.byte 0x1e,0x14,0x72,0xd6,0xfd,0xe0,0x8f,0x7b,0x46,0x9b,0x11,0x07,0x27,0x03,0xe1,0x2d,0xcc,0x0a,0x01,0x49,0x61,0xc4,0x61,0x78,0x06,0x5f,0xaa,0x01,0x5b,0x68,0xd7,0x29,0xb4,0x9e,0xd3,0xaf,0xc7,0x45,0xf0,0x23,0xaf,0x28,0xcd,0x96,0x23,0x61,0xb2,0xb4,0x21,0x96,0x5d,0x91,0x3e,0x71,0xb5,0x41,0xf1,0x29,0xf4,0x5b,0x45,0x77,0x16,0x00 +.byte 0x9d,0x39,0x2a,0x1c,0x38,0x6d,0x36,0x97,0x98,0x4c,0x84,0xfc,0xf5,0xf1,0x59,0x7a,0x8c,0x21,0xfb,0xbc,0x9b,0x0c,0x8d,0x60,0xb6,0xc4,0xe3,0x4b,0x33,0x4f,0x04,0x4c,0x27,0xd2,0xa0,0xe1,0x71,0x0b,0x6d,0x40,0x8d,0xba,0xb3,0x11,0x9b,0x07,0x97,0x82,0x01,0x47,0xaa,0x2a,0xd4,0xcc,0x02,0xd3,0x86,0x86,0xb5,0xd7,0x5d,0xbc,0xd0,0x0f +.byte 0x97,0x5c,0xe5,0xac,0xc6,0x53,0xb3,0x39,0x09,0x68,0x2e,0xcc,0xf3,0x43,0xba,0xed,0x15,0x90,0xbe,0x9d,0xeb,0xa4,0xfb,0x4a,0x20,0xcf,0x10,0xb9,0x47,0x99,0xb0,0x89,0x26,0xb9,0xbd,0x4b,0xf6,0xa5,0xbd,0x2f,0xad,0x1a,0x75,0xe8,0xff,0xc6,0x6b,0x6a,0x31,0xbe,0xec,0xd2,0xc4,0x39,0x9e,0x3b,0x05,0x3f,0x24,0xba,0xf1,0x4d,0x0c,0x0c +.byte 0x05,0x60,0x60,0x22,0x0c,0x1b,0x0b,0x6c,0x80,0xd5,0xe8,0x8f,0x81,0xee,0x80,0x41,0x4a,0x69,0x47,0xc6,0x4c,0xeb,0xf6,0x2b,0x91,0x7c,0x9f,0x22,0x74,0x7b,0x43,0x95,0x56,0x55,0xba,0x85,0x23,0xb3,0xc3,0xee,0x6a,0xcc,0x49,0x2c,0x6c,0x86,0x6d,0x60,0x5d,0x84,0x0c,0x3c,0x88,0x61,0x58,0x1d,0xfc,0x00,0x2c,0x84,0x49,0x4d,0x95,0x75 +.byte 0xc0,0x03,0x02,0x59,0xc0,0xe9,0x84,0xea,0xce,0x3f,0x8b,0x76,0xbf,0x19,0xaa,0x13,0x1b,0x8d,0x9f,0xb2,0xeb,0xb3,0x02,0x87,0xee,0xfe,0x73,0xdb,0xc4,0x19,0x27,0xaf,0x15,0x8d,0xf4,0x58,0x97,0x43,0xb9,0x45,0x32,0x5f,0x24,0x2d,0x08,0xfe,0xec,0xf2,0xf1,0x34,0x99,0x7a,0x66,0x44,0x3d,0xd4,0xf7,0x82,0xcf,0xca,0x6f,0x53,0x9f,0x0a +.byte 0x74,0x79,0x9b,0x45,0x5b,0x07,0x92,0x35,0xc6,0xf4,0xd1,0x90,0x2b,0x62,0xec,0x93,0x7b,0x05,0x90,0x75,0xb7,0xb6,0xd9,0x6c,0x30,0xdd,0x9b,0x2a,0x32,0xb1,0xba,0xab,0x1a,0x6c,0x2b,0xd8,0xfb,0x39,0x8e,0x80,0x98,0x6c,0xd0,0xb3,0xf3,0x76,0xe2,0xe6,0x5e,0xee,0xd0,0x29,0xd7,0x57,0x8f,0xc3,0x13,0xcb,0x45,0x90,0x3e,0xa2,0x54,0x88 +.byte 0xd5,0x50,0xd3,0x75,0xed,0x2d,0xa6,0x50,0x11,0x6b,0xb0,0xb6,0xf0,0x1d,0xc9,0x3d,0x1d,0x2a,0xda,0x5e,0x43,0x44,0xf4,0xef,0x3e,0xc7,0xa9,0xe0,0x6d,0x3c,0x38,0xbf,0x84,0x72,0xaf,0xea,0x60,0x15,0x03,0x14,0x77,0xb7,0xb3,0x15,0x4c,0xbc,0xbf,0x55,0x86,0x24,0x73,0x97,0x22,0x9d,0x59,0xa0,0x39,0x76,0x38,0xd1,0x1f,0x25,0xb0,0x64 +.byte 0xf3,0x10,0x67,0xf2,0x7c,0x11,0xf2,0xce,0xbe,0xaf,0x5e,0x2e,0xc5,0xc1,0x01,0xfa,0x80,0xf9,0x87,0xfc,0x5c,0xfd,0x66,0x50,0x01,0xc2,0x00,0x92,0x84,0x0f,0xdc,0xfc,0x10,0xa5,0x6e,0x45,0xf5,0xff,0x58,0x78,0x45,0x5e,0x50,0xbe,0xe3,0xc7,0x25,0x1e,0xdf,0x7f,0x68,0x6f,0xa5,0xb8,0xf8,0x69,0x89,0x5a,0x55,0x65,0xf4,0x96,0xe5,0x7a +.byte 0xa6,0x89,0x69,0x8d,0xdd,0x4f,0x24,0x5a,0x29,0x92,0x1e,0xca,0x74,0x65,0x7f,0xb8,0x32,0x75,0xb5,0x7b,0x15,0xea,0xeb,0xcc,0xf1,0x23,0x69,0xc7,0x58,0x1c,0x3a,0xaa,0x27,0x0a,0x11,0x79,0xcf,0xc9,0xb6,0xbd,0x9d,0x56,0x47,0x36,0x6b,0x7f,0x82,0xb5,0xa7,0x9f,0x79,0x72,0x16,0xba,0x50,0xef,0x37,0x68,0xdf,0xe0,0xd8,0x0c,0x16,0xcc +.byte 0x50,0x6c,0x25,0x63,0xc2,0xd6,0x7b,0xef,0xd9,0xa1,0xef,0x62,0x81,0x97,0x51,0x49,0x69,0xe3,0x13,0x6c,0x1a,0xd0,0x64,0x1b,0x3e,0x48,0x25,0x5b,0x34,0xe9,0xee,0x41,0x34,0xfb,0x8e,0x9d,0x3c,0xbc,0xc8,0xcf,0xe7,0xf8,0x72,0x21,0x0f,0x95,0xde,0x57,0xd7,0x2f,0x80,0x97,0xbd,0x8f,0x2c,0xde,0x19,0xa3,0xba,0x5c,0x92,0xa3,0x75,0x83 +.byte 0xe3,0xc9,0x33,0x3f,0x8f,0x09,0xfa,0x0b,0x60,0x0a,0x2f,0xb3,0x45,0x9d,0x8e,0x9d,0xa3,0x66,0x2d,0xda,0x37,0xe0,0x21,0x52,0x74,0x9d,0x59,0xa4,0x9e,0xea,0x15,0x22,0xb0,0xbf,0x3c,0xd4,0x59,0xef,0x27,0x60,0xf7,0xbf,0x5d,0x1d,0x36,0x9a,0xa5,0xfb,0x53,0x90,0x40,0x83,0x3a,0x20,0x3d,0x6b,0x47,0xbc,0xc3,0xe6,0x07,0xfe,0xd0,0x8e +.byte 0x40,0x42,0x65,0x2b,0x27,0xba,0x69,0x61,0x03,0x36,0x58,0x35,0x7e,0x82,0x53,0xb5,0xe2,0x25,0x31,0xc3,0x77,0xc1,0x91,0x13,0xa4,0x92,0x52,0xea,0x9f,0x43,0x44,0x6b,0x43,0xe9,0x11,0xd4,0x3d,0x53,0xba,0x6b,0x96,0xb5,0x96,0x29,0xa3,0x2a,0x0a,0xf2,0xb5,0x0c,0x5d,0x62,0x37,0xe0,0xd6,0xa2,0xbf,0xcd,0xf9,0x58,0x7f,0xa2,0xfd,0x54 +.byte 0x6a,0xa1,0x90,0xa5,0x61,0x9e,0xa6,0xc2,0xb9,0x80,0x7a,0xb8,0xaf,0x60,0x68,0xa7,0x27,0x77,0x41,0x03,0x4e,0xc1,0x96,0x46,0x23,0x1b,0xff,0xa1,0x37,0x28,0x33,0x27,0xc2,0x99,0xf7,0xcb,0x7f,0x1a,0xfb,0x41,0xc3,0x59,0x11,0xf8,0x39,0x50,0xbd,0x90,0x61,0x4a,0x67,0x4a,0x07,0x5f,0xb1,0x07,0x66,0x0b,0x52,0xad,0x90,0xc2,0xd7,0x4e +.byte 0x42,0x9e,0xcc,0x5c,0xeb,0xf2,0xdc,0xaa,0x52,0xcf,0x0e,0x7d,0xae,0x3e,0x1a,0x2c,0x9e,0x79,0xfb,0x29,0x10,0x29,0x61,0xa4,0x93,0x9d,0xa9,0xe9,0x71,0xc5,0xf7,0x07,0x13,0xe9,0xbd,0x2e,0x2d,0x0c,0xd6,0xaf,0x54,0x48,0x58,0xc2,0x91,0x37,0xf4,0x61,0x3a,0x96,0x81,0xdc,0x82,0x02,0xff,0xc9,0xf7,0xf7,0x9f,0x9f,0x28,0xd1,0xb1,0xe3 +.byte 0x2b,0x3d,0x85,0xef,0x15,0x82,0x3b,0x9a,0x17,0xee,0x7f,0xd3,0xa5,0x7c,0x41,0x27,0xc9,0x4c,0xe9,0x7a,0x30,0x9f,0xc5,0x34,0xaf,0xc8,0x1c,0x8a,0x7c,0xa6,0xf4,0xdc,0xa6,0xdb,0x68,0xc1,0xa1,0x13,0xb0,0x54,0x49,0x25,0x43,0xc0,0xd4,0x93,0xd6,0x70,0x53,0x3e,0x5f,0xd5,0x42,0x6e,0x78,0xb8,0x15,0x07,0x6a,0x91,0xe8,0xf1,0x2f,0xcf +.byte 0x07,0x84,0x25,0xb3,0x20,0xb9,0x35,0x25,0xbb,0x26,0x96,0x02,0x25,0xd5,0x83,0x23,0x71,0x6d,0x62,0xa7,0x99,0x73,0x63,0x2a,0x51,0x25,0x34,0x3d,0x51,0x95,0xc7,0x9b,0x01,0x0a,0xab,0x11,0xb2,0x32,0xcd,0xe3,0xef,0x63,0xa4,0x6d,0xdb,0x7b,0xf6,0x5f,0xc5,0xf3,0xe5,0x8c,0x6b,0x0a,0x04,0x33,0x53,0x0d,0xf6,0x13,0x8c,0xb8,0xc7,0xba +.byte 0xc2,0xf0,0xd4,0xa7,0x1a,0xce,0x7c,0x54,0x72,0x2b,0x89,0xf4,0x05,0x5c,0x30,0x42,0xe5,0x58,0x65,0x3a,0x2e,0xf9,0x40,0xab,0x2b,0xf9,0xc3,0x99,0x40,0x3c,0xb1,0x7b,0x2c,0xdc,0xfe,0x41,0x21,0x71,0x00,0x75,0xbd,0xea,0xf3,0x84,0x88,0x6b,0x9c,0xe2,0x80,0x2f,0xad,0x9f,0x9d,0x0a,0xdf,0xb5,0x38,0x61,0x89,0xfb,0x67,0x45,0x9c,0x39 +.byte 0xf9,0x84,0x54,0xc4,0xd6,0x6f,0x00,0x39,0x90,0x82,0xfa,0xce,0xae,0xe8,0xaf,0xa4,0x97,0x3a,0xfe,0x71,0xaf,0x5e,0x00,0xd1,0x9e,0x33,0x41,0x63,0xca,0xa5,0x5a,0x8b,0x09,0x2a,0x26,0xef,0x96,0xb7,0x5d,0xc4,0x92,0xfa,0x51,0xdb,0x1d,0x63,0x5f,0x7c,0x94,0x53,0x84,0xed,0xa3,0x99,0x07,0x9f,0xdc,0x55,0xb3,0x31,0x67,0x1a,0x63,0x05 +.byte 0xec,0x36,0x79,0x57,0xf8,0x39,0xc3,0xdd,0xd5,0x6a,0x21,0xfc,0x54,0xe6,0x28,0xc4,0xf1,0xd2,0xce,0x02,0x43,0x50,0x30,0x15,0x4d,0x3c,0xd0,0x1c,0xf6,0x7e,0xd0,0xa4,0x86,0xe7,0xf5,0xc2,0x06,0xc5,0xc4,0xa8,0xe2,0xd3,0xc7,0xcf,0xbd,0xab,0x9f,0xe3,0x42,0xc4,0xcd,0x65,0xfa,0xd3,0xcd,0xdf,0x55,0xc4,0xce,0x6e,0xe8,0xfc,0x96,0x0f +.byte 0xe2,0x92,0xca,0xde,0x37,0x7c,0xc9,0x80,0x4a,0x54,0xe9,0xfd,0x3c,0x4b,0x81,0xb8,0xd9,0x1a,0xf1,0x91,0x5d,0x9d,0xef,0x3e,0xd1,0x78,0xe2,0x1e,0x0e,0x09,0x62,0xdd,0xc6,0xb9,0xde,0x29,0xba,0xb0,0x62,0x49,0x53,0xb6,0x8d,0x9f,0xbf,0x4d,0x77,0xa4,0xd1,0x0b,0xf0,0x31,0x2e,0xe5,0x71,0x2e,0x18,0xa4,0xa7,0xcb,0xa6,0x30,0x24,0x11 +.byte 0x8d,0x16,0x21,0x71,0x6a,0x19,0xde,0x3c,0x5a,0x00,0xa6,0xe2,0x43,0x98,0xe8,0x83,0x10,0x76,0xef,0xca,0x67,0x61,0x80,0x98,0x48,0x06,0xa9,0xcd,0x13,0xa6,0x1e,0x5b,0x2b,0xef,0xb7,0x3a,0x24,0xf7,0x10,0x8d,0xc2,0xaa,0x9c,0x78,0x0d,0xd1,0x54,0xb1,0x4e,0x5a,0x21,0xc2,0xb4,0x11,0x15,0xdb,0xb3,0x9c,0xe4,0xf1,0xfc,0xa5,0x66,0x0c +.byte 0x56,0x34,0x05,0x14,0x88,0x2c,0xfc,0x3f,0x97,0x30,0xd5,0xd0,0xba,0xa3,0xf1,0x47,0xc0,0xf1,0x59,0x3c,0xda,0x1a,0xc1,0x90,0xae,0x4b,0x26,0xd3,0x5f,0xc9,0x8f,0x62,0x56,0x9c,0x64,0xec,0xda,0x63,0x37,0xa1,0xa2,0x87,0x74,0xcb,0xcc,0x27,0xcb,0x2a,0x97,0x57,0xa3,0xb9,0xac,0xe2,0xbd,0x97,0x93,0x21,0xb9,0x8b,0x82,0xa1,0xe7,0x76 +.byte 0xc1,0x49,0xd6,0xb2,0x52,0x7b,0xd6,0xbb,0x31,0x0f,0x87,0xc0,0xaa,0x91,0x70,0x19,0x76,0xa5,0xea,0xf0,0x87,0x47,0x50,0xc1,0xff,0xf7,0xa6,0x6c,0x65,0xff,0xdf,0x83,0x5c,0x54,0xf0,0xb1,0x18,0xe0,0x13,0x58,0x74,0xc0,0x67,0x0e,0xb8,0xdc,0x59,0x6c,0x19,0xf4,0xee,0x3a,0x07,0x63,0x68,0x1d,0x62,0x60,0xb5,0x71,0xce,0x21,0x61,0x8c +.byte 0xa5,0x74,0x9b,0x77,0x8e,0x15,0x20,0x18,0x19,0x96,0xf6,0xfa,0xd2,0x6c,0x03,0xcb,0xcb,0x8c,0x91,0x0d,0x29,0x91,0x70,0xc5,0x96,0x60,0x18,0xad,0x65,0x66,0x43,0xf9,0x13,0x97,0xe3,0xe3,0xcb,0xbf,0x68,0x0b,0xb2,0x87,0x9c,0xfa,0x96,0x48,0x14,0xef,0x6e,0xbd,0x45,0xb9,0x2f,0xbb,0x80,0x80,0xc5,0xf6,0x22,0x41,0x9a,0xec,0xdd,0x41 +.byte 0xfc,0xf3,0x0d,0x8e,0x2e,0x3c,0xda,0xef,0x2c,0xbd,0xbc,0x0e,0x88,0xd2,0x97,0x3d,0x40,0x37,0xa6,0xde,0x1d,0x00,0xeb,0x39,0xea,0x44,0xee,0x8a,0x2f,0x77,0xea,0xea,0x1d,0x90,0xd1,0xec,0xe4,0x31,0x0c,0xde,0x6f,0x55,0x17,0x5c,0x1e,0x19,0x91,0xac,0x36,0x00,0x26,0x17,0xa6,0xcd,0x8b,0xe2,0x72,0x6f,0x8f,0x3c,0xc6,0x76,0x6e,0x3d +.byte 0x4e,0x93,0xb3,0x8b,0xad,0x24,0x17,0x39,0xc0,0xfe,0xba,0x90,0xc5,0xbd,0x4b,0xe4,0xae,0xac,0xf6,0x55,0x72,0x3e,0xf0,0x12,0x32,0x5a,0xdd,0x8a,0x3f,0x67,0xb6,0xdf,0xf6,0x11,0x02,0xf5,0x84,0xcc,0x7d,0x36,0xe7,0x1b,0xf0,0x9a,0x52,0xbe,0xf3,0x06,0xd6,0xdb,0x02,0xd4,0x80,0x0b,0xcd,0xf0,0xfe,0xec,0x86,0x3f,0x89,0x34,0xcb,0x88 +.byte 0x34,0x28,0x57,0x00,0x33,0xeb,0x4f,0xfa,0xdb,0xd8,0x09,0xd9,0x56,0x53,0xc1,0x02,0xc0,0xa8,0x4c,0xdc,0xfd,0x26,0xb3,0x55,0x1d,0x47,0x0d,0x68,0x50,0xb8,0xa3,0xb4,0xf1,0x31,0xfa,0x16,0x33,0x94,0x40,0x95,0x53,0x9c,0x9f,0x5b,0x25,0x47,0xb1,0x27,0xbc,0x38,0x7d,0x23,0x01,0x7f,0x70,0x7a,0x61,0x0e,0x46,0x5c,0xcc,0xd7,0xcc,0x15 +.byte 0x15,0x0a,0xed,0x4c,0x99,0x66,0x3a,0xc3,0xc1,0x9a,0x7a,0x38,0x6a,0x0c,0xde,0x13,0x67,0x65,0xfc,0x06,0x99,0x7c,0xa5,0x90,0x8a,0x90,0x58,0xce,0xf3,0x23,0x76,0xfc,0x03,0xfb,0xb3,0x36,0x54,0xa9,0x33,0x35,0xfe,0xe3,0x3d,0x53,0x7e,0xe0,0xae,0xcf,0xc0,0xa2,0xe1,0x28,0xb9,0x97,0x96,0x87,0x90,0xa1,0x13,0xd0,0x1d,0x5b,0x43,0xf1 +.byte 0xa5,0xfa,0x81,0x83,0xe7,0x7b,0xa1,0x5f,0x9f,0xf5,0xd3,0xb6,0x80,0x8b,0x91,0xed,0x31,0x14,0x05,0x78,0x85,0x9d,0xea,0x59,0x69,0xa5,0x29,0xc5,0xf1,0xd7,0x9d,0xa3,0x8b,0x9d,0xe0,0x8d,0xc3,0x4e,0x2d,0xfa,0x1c,0x6c,0xd2,0xd7,0xcb,0xda,0x86,0x5d,0xb3,0x1a,0xb4,0x12,0xe3,0xa8,0xd7,0xe1,0x84,0xce,0x0e,0x06,0xd0,0x9e,0xf0,0xb1 +.byte 0x5b,0x2f,0x77,0x10,0x6f,0x41,0x2f,0x5b,0x48,0x43,0xf3,0xef,0xdb,0x09,0xdb,0x01,0x89,0xfc,0x7a,0x4a,0xc0,0x96,0x33,0xdf,0xbe,0x49,0x85,0xa7,0x88,0x93,0x05,0xf2,0x15,0x12,0x85,0x04,0x20,0x7d,0x8c,0xe2,0x0a,0xea,0xfe,0xed,0xbf,0x98,0xdb,0x9d,0x1f,0xaf,0x0f,0xbf,0xf7,0x12,0x4f,0x69,0x4e,0x87,0x09,0xf0,0xae,0x2a,0x4d,0x4c +.byte 0xbf,0xaa,0x08,0x2c,0x78,0x2d,0xbe,0xb9,0xf5,0x3c,0x4c,0xcd,0x75,0x93,0xc3,0x3c,0xc2,0x86,0x47,0xca,0xc1,0x9c,0x1c,0xe5,0x0d,0x8d,0x36,0x9c,0x44,0x40,0x89,0xfa,0x17,0x57,0x08,0xd4,0x22,0x9a,0x5b,0x94,0xbf,0x39,0xcd,0xbe,0xf7,0xd1,0xcd,0x35,0x74,0xdf,0xfa,0x5d,0x00,0xaa,0xaa,0x82,0x6d,0x9b,0xf8,0x69,0x51,0x9c,0xaa,0xaa +.byte 0xc8,0x2c,0xa2,0x68,0x57,0x3c,0x5f,0x10,0xa2,0x7b,0xee,0xc9,0x97,0x8d,0x5c,0x41,0x08,0x0d,0x30,0xd5,0x2b,0x5f,0x8d,0xdd,0xdc,0x2c,0xa8,0x52,0x6e,0xea,0x61,0x77,0xca,0x75,0xc3,0x56,0x6e,0x17,0x51,0x0e,0x00,0xb6,0x18,0xa0,0xe5,0x9d,0x49,0x4e,0x20,0x78,0x1e,0x5f,0x3e,0xec,0xc3,0x4a,0x41,0xf3,0xfe,0x89,0x64,0xac,0x4c,0x4d +.byte 0xa8,0x73,0x4f,0x31,0xc4,0xe2,0x62,0x69,0x2b,0x40,0xdf,0xef,0xed,0xf0,0x62,0x4e,0xc3,0x65,0xcc,0xcb,0xef,0xc1,0x28,0x61,0x71,0xac,0xa5,0x89,0x52,0x7b,0x32,0x59,0xc2,0x16,0x1a,0x63,0x18,0xb0,0xd8,0xe4,0x28,0x92,0xff,0x45,0xc1,0x24,0x56,0x86,0x66,0x23,0x7a,0xff,0xf7,0x33,0x30,0xdc,0xd1,0x7d,0xaf,0x68,0x10,0x4b,0xde,0x3e +.byte 0x4a,0x70,0xbe,0x31,0x1a,0x37,0x28,0xee,0xe0,0xba,0x65,0x8b,0x7d,0xea,0x07,0xce,0xf2,0x51,0x3d,0xcb,0xb2,0x33,0xd8,0xf3,0xa4,0xa0,0xcd,0x53,0x76,0xf9,0x46,0x5b,0x82,0xf9,0x9d,0x0e,0x29,0x5b,0xcf,0x76,0xd4,0x5c,0x47,0xf1,0x98,0x02,0x5a,0x16,0x18,0xf2,0x61,0x6d,0x3e,0x64,0x7f,0xbe,0x13,0x18,0xc2,0x45,0xd2,0x87,0x17,0xff +.byte 0xf1,0x01,0x0b,0x5d,0x21,0x0d,0x73,0x9a,0xeb,0x82,0xc4,0x9a,0xb3,0xe4,0x31,0x44,0x58,0xa2,0xfd,0x76,0xf6,0xbe,0x6f,0x75,0xcc,0xbb,0xe3,0xa2,0xa9,0x78,0x0f,0x4b,0x1d,0x47,0x2d,0x32,0x2c,0x45,0x5e,0xcd,0x8f,0x13,0xe2,0x9a,0x9d,0xa2,0xce,0x73,0x54,0x20,0xc0,0x44,0x1c,0x26,0xde,0x0d,0x72,0xb2,0xfa,0x4d,0x32,0x35,0xac,0x69 +.byte 0x4d,0x16,0x4a,0xd5,0x51,0x33,0xc1,0xe0,0x90,0x9c,0x93,0x66,0xed,0x16,0xac,0x7e,0x79,0x2b,0x0f,0xb4,0x42,0xaf,0x80,0x22,0x80,0x07,0x7d,0x72,0xe4,0xb3,0x3a,0x2c,0xb8,0x68,0x14,0x4d,0x31,0x5f,0xbb,0xac,0x43,0x3b,0x28,0xd6,0x81,0x81,0x26,0xe5,0xc4,0x67,0x7c,0x4a,0x42,0xc4,0x1a,0x59,0x04,0x2d,0xb8,0x26,0xfc,0x4e,0xc7,0xfc +.byte 0x11,0x61,0xe3,0x4b,0x2c,0x3f,0xdb,0x43,0xe4,0x24,0xb4,0xd1,0xc0,0xc0,0x01,0xe1,0xeb,0x84,0x0b,0x6d,0x93,0x83,0x07,0x9f,0x01,0xb8,0x9d,0xe5,0x7e,0x4d,0xa2,0x05,0x3e,0xf2,0x40,0x59,0x88,0xc8,0x8c,0x62,0x44,0x95,0x20,0x96,0x28,0xa9,0x3f,0x7c,0xed,0x85,0x03,0x65,0x49,0xf7,0x94,0x3d,0x51,0xe2,0x8e,0x21,0x19,0x7b,0x55,0x5f +.byte 0x55,0x70,0xf8,0xf0,0xce,0xd9,0x1a,0x10,0xbb,0xfe,0x65,0x72,0x8a,0x5b,0x6c,0x27,0xd3,0x57,0x61,0x07,0x7b,0x85,0xd6,0x21,0xd2,0x07,0x81,0xaa,0x17,0x73,0xb5,0xef,0x2d,0x84,0x7b,0x8f,0xe0,0xb3,0x9e,0x9f,0x31,0x82,0x33,0x07,0x14,0x84,0x79,0x18,0xc4,0xec,0x20,0xb5,0xec,0x21,0x4b,0x51,0x78,0x96,0xc6,0xe7,0xf0,0x6a,0x7a,0xb5 +.byte 0xe5,0xc2,0xef,0x24,0x4c,0x57,0xb6,0xf5,0xee,0xe5,0x69,0x2b,0x73,0x9e,0x66,0x91,0x9d,0xd4,0x24,0x58,0x4b,0x72,0x68,0xf6,0x62,0xb4,0x0c,0xe3,0xbd,0x1f,0x0b,0x42,0x6c,0xf9,0x6e,0x6a,0x64,0x64,0x69,0xa5,0x6d,0xe7,0x38,0x9f,0xb2,0x65,0x35,0x6b,0xd9,0x20,0x84,0xe4,0x5f,0x8b,0xfd,0x58,0xab,0x5f,0xe1,0x4c,0xf7,0xd7,0xf5,0xe7 +.byte 0xae,0xe8,0xc1,0x68,0xfe,0x0c,0xb1,0xe2,0xe4,0xca,0xf0,0xf1,0x20,0xbc,0xf9,0x99,0xef,0x4e,0x63,0xca,0x89,0xe4,0x7c,0x17,0x49,0x40,0x47,0xce,0x67,0x8e,0xbd,0xd0,0x96,0x8b,0x5a,0x0d,0x2f,0xd0,0x8f,0x4f,0x42,0x06,0x01,0x8e,0x47,0x35,0x13,0x9e,0xd1,0x24,0x85,0xe4,0x17,0x59,0xe8,0x1c,0xb3,0x25,0x53,0xf9,0xb4,0x96,0xb1,0x33 +.byte 0x97,0xb2,0x60,0xc7,0xb3,0x48,0xa2,0xfc,0x7f,0x86,0x94,0x2a,0xd3,0x94,0xfe,0x6d,0xa6,0x7a,0xa1,0xe1,0x96,0x5b,0xe8,0xe4,0x91,0xfb,0xf3,0x2c,0x84,0xb4,0x2f,0xbe,0xc9,0xdd,0x1c,0x9f,0x72,0x12,0xcb,0xbd,0x22,0x07,0xc4,0xec,0x05,0xe8,0x32,0x47,0x21,0x27,0xf6,0xc1,0x36,0x59,0x25,0x6c,0xbe,0xb9,0x3e,0xd4,0x1b,0x59,0x11,0x27 +.byte 0x6b,0xa3,0x64,0x71,0x98,0xeb,0x21,0x65,0xc0,0x4c,0x30,0xbd,0x51,0x2b,0xc3,0xfb,0xb1,0x33,0x56,0x1e,0xf0,0x92,0x0f,0x4b,0x63,0x3a,0x9c,0xfb,0xd1,0xac,0x8c,0xf0,0x3e,0xb7,0x0b,0xd2,0x52,0x62,0xd8,0x37,0x9a,0xef,0x79,0xdc,0xcb,0x87,0x1e,0x3d,0x9d,0x91,0x12,0xba,0x78,0x8a,0x11,0x57,0x96,0x44,0x8e,0x2b,0xd2,0xe3,0x4d,0x27 +.byte 0xec,0xba,0xef,0x1c,0x04,0x8d,0x56,0x56,0x11,0x74,0xc0,0xcc,0x1f,0x3d,0x7a,0xad,0x79,0x49,0x59,0xa3,0x71,0xe0,0xf5,0x89,0x89,0x8f,0xcf,0x1e,0x63,0x77,0x91,0x91,0xf1,0x0c,0x1c,0xcc,0x77,0x00,0xd7,0x28,0x9f,0x68,0xbc,0xb6,0x9d,0x33,0x43,0xb2,0x4a,0x72,0x3e,0x57,0x26,0xd0,0x00,0x93,0xc9,0x4c,0xc9,0x53,0x52,0xd9,0xe2,0x31 +.byte 0xc5,0x7f,0xf6,0xb6,0xc2,0x10,0x51,0x67,0xae,0x63,0x35,0x74,0xcc,0xd4,0x05,0xb3,0x08,0x23,0x35,0x37,0x8e,0xf1,0xbb,0x1d,0x56,0xff,0x62,0xa2,0x13,0x7b,0x01,0x75,0x6d,0xb3,0x92,0x51,0xdc,0x6e,0x08,0x76,0x25,0x52,0xbf,0x9a,0xea,0x89,0x0f,0x96,0xcc,0x79,0xd4,0x72,0xcf,0x65,0x79,0x4e,0x40,0xa3,0xae,0x67,0x0c,0x82,0x85,0x05 +.byte 0xfd,0x43,0x84,0x17,0x24,0x79,0xa9,0xa7,0x7f,0x24,0x76,0x57,0x66,0x11,0xd5,0x33,0x30,0x42,0x5b,0x5f,0x7c,0x04,0x4b,0x45,0xc3,0x69,0x20,0x02,0x92,0xe3,0x6a,0x06,0x8f,0xdf,0x30,0xf6,0x17,0x8f,0xc6,0x8c,0x5e,0x42,0xf3,0x59,0x7a,0x3a,0x55,0x3a,0xc1,0x96,0xd5,0x67,0x3d,0xab,0x32,0xee,0xf0,0x08,0x28,0x73,0xb0,0x11,0x1a,0x92 +.byte 0x4d,0xcc,0x0c,0x86,0xb2,0xa1,0xbf,0x9f,0xcd,0xc7,0x1c,0xbc,0xee,0x39,0x77,0x75,0xfc,0xe6,0x3b,0x62,0xf2,0xaf,0xd5,0xb6,0x77,0x2d,0x86,0x38,0x13,0x00,0xdb,0x71,0x4a,0x87,0x03,0x6d,0x99,0x28,0xf8,0x6a,0x23,0x2e,0xe2,0xb8,0x9c,0x18,0x02,0x00,0x9e,0x5b,0xf0,0x6f,0x9b,0x32,0xdc,0x6b,0x61,0xeb,0xeb,0xe9,0xfc,0xee,0x44,0xbc +.byte 0x4a,0x88,0x04,0xc0,0x10,0xc8,0x65,0x6c,0xa4,0xae,0x9a,0x36,0xb6,0x68,0xd5,0xbf,0x6d,0xe3,0x6f,0x5d,0xad,0xd6,0xf9,0xc8,0x06,0x36,0x25,0x64,0xc9,0x5b,0x71,0x7f,0xbf,0xe3,0x56,0x31,0x2a,0x93,0x47,0x46,0x39,0x91,0x80,0xc5,0xdd,0xdd,0xa1,0x25,0x85,0xd9,0x05,0x49,0x4f,0x1b,0xeb,0x2f,0x6e,0xd9,0xe4,0x65,0x3d,0xcd,0xbd,0x47 +.byte 0x37,0x27,0xb0,0xd1,0x9b,0xa4,0x89,0xd5,0xa0,0x0f,0x8b,0xc5,0xfd,0x91,0xa8,0x86,0x22,0x65,0xf1,0xe1,0x1e,0xb6,0xf7,0x50,0xe6,0x1e,0xf0,0x2b,0x9d,0x02,0xc9,0xe8,0x2a,0xb8,0x9b,0x89,0x28,0x25,0x43,0xcf,0x23,0x08,0xe2,0xa7,0x70,0x31,0x89,0xab,0x5b,0xd9,0x2e,0xa9,0xe4,0xe9,0x1d,0x63,0x7f,0xc6,0xc1,0xfb,0x63,0x45,0x9c,0xf1 +.byte 0xd4,0xc3,0x56,0xb6,0xad,0xb3,0x00,0xce,0x12,0x9e,0x63,0x33,0x25,0xd3,0xb2,0xee,0xa7,0x6b,0xa1,0xfd,0x20,0xa3,0xb2,0x07,0x1a,0x9d,0xed,0xe0,0x1d,0x70,0x5b,0x9f,0xc0,0xbc,0x83,0x09,0x94,0x47,0x8c,0x05,0xef,0x73,0x96,0x31,0xc7,0x35,0xc2,0x2c,0x00,0x2a,0x68,0xd1,0xc4,0xb3,0x3d,0x84,0x44,0x8c,0x93,0xfd,0x64,0x00,0x77,0x46 +.byte 0x18,0xac,0x83,0x9d,0xe5,0xe5,0x46,0x61,0x37,0x72,0x9f,0x0e,0x76,0x55,0xf7,0xca,0x36,0x57,0x24,0x16,0xfc,0x11,0x27,0xaa,0x44,0xa4,0xb0,0x58,0x41,0x46,0x94,0xc7,0x3b,0x9c,0xa3,0xe4,0x89,0xd9,0xdb,0x7b,0x64,0x69,0x84,0x9f,0xc8,0x09,0x6f,0xf7,0xf0,0x58,0x10,0x56,0x9f,0x26,0xf0,0x74,0x0c,0x76,0xcb,0x9d,0x45,0x3d,0xe7,0x94 +.byte 0x54,0xa3,0x84,0x08,0xb5,0x9c,0xff,0xdb,0xba,0x62,0x5e,0x87,0x0d,0x11,0x5d,0x96,0x06,0xd6,0xec,0xf4,0x3e,0x9d,0x66,0xbd,0xc4,0x64,0xed,0x03,0xe0,0xad,0x3f,0x4e,0xb4,0xef,0x16,0xdd,0xee,0xd6,0x00,0x27,0x62,0x74,0x0a,0xe0,0x68,0x72,0x4c,0x6d,0x62,0x15,0x87,0x6a,0xf0,0x25,0x9f,0x33,0x1d,0x92,0x3b,0xa3,0xa4,0xf1,0x81,0xdf +.byte 0xa8,0xed,0xaf,0xa5,0x8d,0x19,0x20,0x72,0x03,0x91,0xf0,0x34,0x60,0x70,0xbe,0xaa,0xdf,0xaa,0x24,0x1a,0x1f,0x1a,0x8d,0xb0,0x7b,0xef,0x10,0x43,0x69,0x24,0x74,0xf2,0x72,0x71,0xa1,0x8f,0x85,0x75,0x3e,0x8c,0xf6,0x0e,0x88,0xe2,0x1d,0x5c,0xb8,0xf1,0xc4,0x8a,0x21,0x76,0x20,0x50,0x3f,0xb3,0x8b,0x9f,0xa4,0x45,0x9e,0x07,0x60,0x22 +.byte 0x2c,0xa6,0xb1,0xc2,0xd2,0xcb,0xc6,0xd8,0xe9,0x94,0x66,0xfb,0x10,0x73,0x92,0x25,0x7e,0x31,0x42,0xf4,0x4a,0x75,0xac,0x78,0x43,0xcb,0xc0,0xc9,0xb0,0xaf,0xb4,0x22,0x8f,0x51,0x36,0x0f,0x5a,0xb8,0xbb,0x44,0x03,0x09,0xd0,0xf9,0x04,0xc8,0x73,0x8e,0xa1,0x76,0x27,0xde,0x72,0xf4,0x3a,0x79,0x63,0x85,0x32,0x09,0xad,0x12,0xe4,0xd7 +.byte 0x8f,0x8e,0x24,0x03,0x4f,0xde,0x39,0xac,0x81,0xe8,0x64,0x09,0x17,0xd7,0x99,0xe6,0x62,0xb7,0x53,0x20,0x9f,0xb9,0x3a,0xb9,0xb1,0x81,0xfa,0x6e,0x33,0xe7,0x4a,0xca,0xd7,0xa7,0xfa,0x7a,0xbf,0x0b,0x0a,0x99,0x3c,0xc7,0xbd,0xef,0xc7,0x90,0xda,0x62,0x30,0xc6,0x94,0x94,0x6b,0xee,0xbd,0xb7,0x0d,0x86,0xc5,0xb1,0x9a,0xb9,0x86,0x34 +.byte 0xc2,0x81,0x2b,0x09,0x7a,0x88,0x09,0x65,0xcf,0x51,0x78,0x19,0x1d,0x5a,0x62,0x2f,0xb3,0x43,0x8d,0xf5,0x9d,0x26,0x2f,0x4a,0x27,0x96,0x22,0x1b,0x4c,0xc8,0xd9,0x73,0x4b,0x32,0x01,0x11,0x7b,0x59,0x85,0xda,0x50,0x92,0x17,0x45,0xd4,0x1f,0xcf,0x98,0xf6,0x2c,0x69,0xba,0x43,0x22,0xdc,0x36,0x31,0xfb,0x1e,0xe8,0x54,0x24,0x0f,0x24 +.byte 0x4c,0xcd,0xbe,0xdb,0xd8,0x23,0x69,0xe2,0x97,0xf5,0x66,0xb2,0x66,0x6c,0xf2,0x90,0xd0,0x15,0x14,0x9a,0x47,0x65,0x97,0xb0,0xf2,0x3e,0x35,0x09,0xd2,0x3d,0x01,0x9c,0xb3,0xfd,0xf3,0x32,0x46,0x4e,0x11,0xab,0x88,0x9e,0x04,0x6d,0xf0,0xe1,0x9d,0x48,0x01,0x24,0xc3,0x87,0xdf,0x58,0xb6,0x6d,0x6d,0x4f,0xb9,0x1b,0x13,0xee,0x03,0x5b +.byte 0x75,0x39,0x28,0x31,0x90,0x70,0x49,0x10,0x71,0x87,0x76,0x30,0xac,0x88,0xb0,0xf6,0x6c,0xaf,0x5b,0xf4,0xf3,0xe7,0x25,0x75,0x8c,0xa3,0xf4,0xa7,0xd8,0x94,0x78,0xc8,0x77,0xc1,0x48,0x6c,0x62,0xf6,0x2c,0xb5,0x41,0x59,0xf6,0xd3,0xae,0x1b,0x55,0xed,0xdf,0xd1,0x59,0x63,0x76,0x03,0x65,0xd3,0xd0,0xcd,0xb6,0x5b,0x8f,0x1a,0x78,0x88 +.byte 0x78,0x07,0x14,0x3f,0xc3,0xd4,0x1c,0x69,0xd8,0x15,0x25,0xca,0x76,0x15,0x24,0x7d,0xed,0x69,0x2a,0xb5,0x04,0xd2,0x3b,0xbd,0x7a,0xb2,0xae,0x04,0x51,0x85,0x2b,0x1b,0xb0,0x3f,0x6d,0xbc,0xa0,0xc7,0x19,0x40,0xab,0x75,0x51,0x4b,0xa8,0x5a,0xd7,0xb5,0xc7,0xa8,0xfc,0x4a,0xcf,0xa9,0x9c,0xe6,0x2e,0x35,0x51,0x3b,0x05,0x41,0x43,0x7c +.byte 0x1f,0x2e,0x16,0x5d,0x2f,0xa8,0xe9,0xce,0x6d,0x06,0xa7,0x5a,0xed,0x07,0x39,0xe4,0x7e,0xc3,0x01,0x2d,0x97,0xe4,0xc1,0x89,0x2c,0xb4,0xb1,0xb5,0x7f,0x0a,0xe2,0x9f,0x82,0x36,0xee,0x9b,0x76,0xbc,0x9d,0x37,0xdf,0x5e,0x81,0x95,0x9b,0x2b,0xc4,0x58,0x20,0x6a,0xd2,0xc7,0xb6,0x82,0xe6,0xa2,0x52,0x73,0x4a,0xaf,0x37,0x5a,0xf6,0x6b +.byte 0xc4,0x2b,0x53,0x4e,0xca,0x44,0x17,0x9f,0x1c,0xeb,0x4d,0xf2,0xd1,0xb0,0x35,0xaa,0xc3,0xfe,0x77,0x34,0x2a,0x4a,0xe8,0x85,0x96,0x2f,0xa4,0x7d,0xdf,0xd0,0x6a,0x4a,0x0c,0x9b,0xd9,0x6a,0x00,0x92,0xb4,0xb1,0x9f,0xc3,0x56,0xee,0xcb,0xa5,0x3a,0x37,0x68,0xc8,0x7c,0x1e,0xa8,0x0a,0x3d,0xbc,0xd1,0xd0,0xd7,0x8b,0x32,0x34,0x20,0xfc +.byte 0xd3,0x9e,0xf5,0x18,0x3a,0xb9,0x87,0xae,0xde,0x6c,0xc0,0x7d,0xbd,0x20,0x00,0xe5,0x7b,0xcb,0xf9,0x7d,0x70,0x9a,0x10,0x45,0xc9,0x33,0x13,0x9d,0x2c,0x16,0x67,0xe6,0x36,0x38,0xcf,0xa2,0xf1,0xad,0xec,0x48,0x7f,0x9b,0x2a,0xdc,0x13,0xe2,0xee,0xef,0xf2,0x5c,0x3f,0x52,0x3a,0x72,0x79,0x9b,0xba,0x50,0xb2,0x2b,0xfb,0x97,0x8e,0xe6 +.byte 0x27,0x39,0x63,0x72,0x05,0x11,0x7d,0x2e,0xa8,0x44,0x08,0xf7,0xf3,0x26,0xe5,0xe4,0x6c,0x98,0x7b,0xb1,0x42,0x6d,0x74,0xd4,0x3b,0xfa,0x35,0xfa,0x0a,0xac,0x5e,0x9e,0x8f,0xc7,0x07,0xc5,0x50,0x25,0xfd,0xbf,0x13,0x52,0x3d,0xf1,0x18,0x1e,0x19,0x8c,0xf3,0x8b,0x4d,0xc8,0xfb,0x76,0xa4,0xe3,0x3f,0xb2,0x47,0x9c,0x50,0x97,0x32,0x65 +.byte 0x9e,0x42,0x81,0x21,0xd1,0x92,0xd2,0x81,0x4a,0x93,0x68,0xa2,0xc1,0x76,0xc8,0x40,0xce,0xfe,0x4e,0xc5,0xa7,0xb2,0x77,0x9f,0xc8,0xe5,0x41,0xb1,0xda,0x15,0xf6,0xfa,0x21,0x3f,0x11,0x5c,0xc6,0x62,0xda,0x01,0x7f,0x0f,0x9f,0x9e,0x98,0xfe,0x38,0x53,0x6c,0x7f,0xba,0x8b,0x55,0x01,0x36,0x33,0x41,0x5e,0xa9,0x78,0xbf,0x2e,0x60,0x4f +.byte 0xcb,0xe9,0x27,0x09,0x8c,0x01,0x2d,0x82,0x7d,0x3f,0xaf,0x8f,0x1e,0x37,0x79,0x35,0xfb,0xce,0x83,0xc5,0xf8,0xc5,0x54,0xfd,0x50,0xec,0x31,0xd1,0xb5,0x8a,0x4d,0x37,0xf6,0x7f,0x0e,0xbe,0x35,0xdd,0xa8,0x9e,0x5e,0xb9,0x3c,0xf4,0x2b,0xd2,0x97,0x56,0xd0,0x28,0xcb,0x60,0x27,0xcf,0x27,0x68,0x8a,0xa1,0xbf,0x9f,0xa3,0x45,0x4a,0x44 +.byte 0x71,0xe2,0xb2,0x9c,0x69,0x0b,0x18,0x69,0xcf,0x03,0xcc,0xc3,0x93,0xe0,0xf5,0xb7,0x4e,0xa4,0xdc,0x96,0xe0,0x2e,0xf8,0x3b,0xc6,0x67,0x30,0x06,0x5e,0xb9,0xb9,0x7d,0xaf,0x97,0x38,0x9a,0xf4,0x22,0x20,0x5a,0x9e,0x83,0x26,0x3c,0xcc,0x93,0x84,0x20,0x15,0x2e,0x85,0x23,0x17,0x1d,0x28,0xb4,0xe2,0x8f,0x2d,0x22,0x99,0x66,0xfd,0x6a +.byte 0xa8,0xe6,0xb7,0x19,0x18,0xec,0xbd,0x54,0xc2,0xcc,0xb7,0xb4,0x6b,0x10,0xdd,0xb5,0xe3,0x3b,0xb7,0x77,0xbf,0x66,0x65,0x82,0x6a,0xc6,0x0d,0x26,0xe6,0xe8,0xe1,0x96,0xe4,0x0b,0x3c,0xe3,0xf2,0xfb,0xd6,0x91,0x5d,0xb6,0x08,0x15,0x67,0x10,0xfa,0xf8,0xdc,0x72,0x84,0xca,0x48,0x29,0x75,0x98,0x62,0x30,0x43,0xa9,0xf1,0xde,0x58,0xb5 +.byte 0x6e,0x67,0x53,0x62,0x0d,0x06,0xa8,0x97,0x35,0x04,0x02,0x34,0x3f,0xd7,0x77,0x38,0xed,0x51,0x32,0x7c,0x6f,0x25,0x94,0x04,0x30,0xa5,0xfc,0xf1,0xb0,0x65,0x77,0x16,0xec,0xb0,0xf9,0x6d,0xaf,0xbc,0x75,0x6e,0x29,0x44,0x20,0x86,0x36,0xbe,0x22,0xe0,0xe1,0xc4,0x0c,0x97,0x10,0x45,0x3e,0x06,0xc3,0xee,0xa5,0x1f,0x97,0xc7,0xde,0xdb +.byte 0xf1,0x05,0xe3,0xb7,0x24,0xc5,0xa5,0xca,0x4e,0x8e,0x9e,0x44,0x7e,0x98,0xb1,0x3c,0xe9,0xa6,0xe5,0xa6,0x08,0xcb,0x08,0xd7,0xf6,0x38,0x37,0xa4,0x46,0xd1,0xdc,0x53,0x6f,0x6c,0x3f,0xca,0xa1,0x9b,0x7c,0xa6,0x44,0xd4,0x08,0x33,0xd2,0xf8,0x32,0xd2,0x4f,0x60,0x75,0x0f,0x49,0xf1,0x70,0x52,0x56,0x16,0x5b,0x3e,0x34,0x0e,0xe4,0x94 +.byte 0xc3,0xa9,0xd4,0x1c,0x9e,0xa4,0x10,0xce,0xc1,0x69,0x5b,0x3a,0xc9,0xd5,0xab,0x98,0x81,0x78,0x42,0x7e,0xf2,0x76,0x10,0xad,0x97,0x85,0x98,0x2f,0xe2,0x3f,0xb1,0x1d,0xc0,0x4d,0xa4,0x0b,0x54,0x7e,0x19,0x16,0x0a,0x71,0x74,0x37,0xfd,0x67,0x23,0x86,0xb2,0x3b,0x1e,0x49,0x92,0x92,0x1b,0x5f,0x65,0x56,0x76,0x6d,0x97,0x3b,0x91,0xc0 +.byte 0x5a,0x7e,0xf1,0x5b,0xe9,0x83,0xb9,0x67,0x2f,0xe1,0x0c,0xcf,0xe9,0x51,0x26,0x45,0x03,0x06,0x63,0xa4,0xb2,0x06,0xe0,0x8e,0xa3,0xbf,0xf5,0x7c,0x19,0xdf,0xfe,0x38,0x28,0x98,0xa1,0x23,0x16,0x69,0xc4,0x9f,0x20,0xe4,0x42,0x27,0x4e,0x7b,0xc9,0x42,0x5e,0xd2,0xb9,0xbf,0x33,0x03,0xbb,0x96,0x6d,0x80,0x65,0x90,0x3b,0x82,0x5b,0x68 +.byte 0x46,0x4f,0xe3,0xe0,0x0e,0xc5,0x90,0x91,0x80,0xf8,0xf4,0x9c,0xfe,0x03,0xaf,0x31,0x44,0xb7,0xfc,0x1f,0x65,0xc8,0x65,0x68,0xcc,0x27,0xb4,0x0d,0x81,0x14,0x9e,0x52,0xab,0xdd,0x71,0xf6,0xd9,0xcf,0x29,0x04,0xcd,0xae,0x6f,0xd6,0x41,0xb5,0xfd,0x1d,0x0f,0xbf,0x71,0xc2,0x60,0x98,0xb9,0xc0,0x6e,0x8a,0x2c,0x7d,0xec,0x31,0xa5,0xea +.byte 0x1a,0xb1,0xe4,0xc2,0x36,0xcb,0xf0,0xf4,0x3f,0x1d,0x03,0x01,0xcd,0xac,0xd0,0x9d,0x2e,0xa3,0xc4,0x54,0x49,0x75,0x90,0xac,0x7e,0x1e,0xc3,0x90,0xab,0x55,0xb0,0x34,0x0d,0xd6,0x99,0xb5,0x40,0xda,0xdd,0x30,0x57,0x61,0x15,0xec,0x8f,0x8c,0xc7,0xda,0xfc,0xf5,0x0a,0x86,0xd8,0x6b,0x0f,0x6e,0x09,0xb8,0x50,0x2a,0xea,0x51,0x84,0x33 +.byte 0x7a,0x97,0x0c,0x56,0x61,0x2c,0xd9,0x83,0xb9,0xb1,0x53,0x31,0x72,0x20,0x79,0x85,0x7f,0xdc,0xb8,0xfe,0xfa,0x9a,0xd4,0x6a,0x3c,0xc7,0xcc,0x75,0x20,0xba,0x9c,0xb9,0x1a,0xff,0x9c,0xbe,0xfd,0x87,0xb4,0xd7,0xe8,0x5e,0x22,0x6a,0x1b,0x91,0x52,0x6a,0x58,0xbc,0xf4,0xde,0xcc,0x18,0x37,0x0e,0xf5,0x22,0x91,0xd2,0x4f,0x08,0x91,0x62 +.byte 0x1c,0xb7,0xa0,0x7e,0x66,0x97,0xda,0xa0,0x3c,0xc8,0xe8,0xdc,0x61,0xa4,0x64,0x8b,0x0a,0x43,0x90,0x0c,0x78,0xd9,0x96,0x8a,0xb0,0x17,0x0f,0x32,0x17,0x11,0x82,0x69,0x9d,0x7c,0xa9,0xfd,0x9b,0xe3,0xeb,0x0d,0x44,0x1d,0xcb,0xf6,0xee,0x26,0x6b,0xd5,0x4c,0x49,0x69,0x18,0xd7,0xf3,0x63,0xd9,0x7e,0x83,0xdd,0xa3,0x2d,0xdf,0x88,0x10 +.byte 0xd1,0x5c,0xb0,0x7e,0x44,0xfe,0x64,0x39,0x33,0x05,0x04,0x54,0x74,0x4d,0xd5,0xbc,0xdf,0x19,0x52,0x81,0x60,0x92,0xc5,0x4e,0xa4,0xff,0xf0,0xa2,0xfd,0x88,0x96,0xde,0xb4,0x8d,0x58,0x06,0xfb,0x96,0x6f,0x0e,0xb0,0x4a,0x2b,0xed,0x15,0xa7,0xfb,0x9f,0xf2,0x30,0xc4,0xce,0x02,0x4d,0x83,0xb8,0x5d,0x10,0x60,0xb8,0xbc,0x05,0xa2,0xd4 +.byte 0xf1,0xae,0x46,0x56,0xb9,0xac,0x68,0x79,0x41,0x90,0xee,0x79,0xda,0x3a,0x91,0x7a,0xf6,0xdb,0xe3,0xea,0x91,0x48,0x77,0x4a,0xa3,0xab,0x9c,0x99,0x49,0x1f,0xc9,0xcd,0xe7,0x2e,0xe3,0xe7,0x78,0x6d,0x07,0x1b,0xc6,0x08,0x48,0xd8,0x20,0xff,0x19,0x8a,0x73,0x1d,0xc6,0xa1,0xd4,0x95,0x33,0xf7,0x45,0xab,0xea,0x05,0x3e,0xdf,0xde,0x68 +.byte 0xb2,0xb6,0xef,0x71,0xb4,0xd1,0x09,0x4b,0x43,0x16,0x35,0x1a,0xb6,0xcb,0x78,0x63,0xca,0x9e,0x9a,0xe3,0x86,0xb2,0x8e,0x7b,0x68,0x89,0xa7,0x5c,0xd3,0x06,0x21,0x88,0x94,0xde,0xa1,0xb1,0x3a,0xe8,0xb7,0xfa,0x58,0xc5,0xc8,0x01,0xfa,0x56,0xe4,0x0e,0x6b,0xeb,0x5d,0x67,0xf4,0x63,0xd4,0x44,0xe2,0xe7,0x42,0xfe,0x09,0x58,0xdf,0xd9 +.byte 0x1d,0xb7,0x14,0x91,0xac,0x88,0x49,0xf6,0x7c,0x03,0x92,0x11,0xb4,0x66,0x68,0x6c,0x94,0x2a,0x22,0xaf,0xa6,0xb1,0x29,0x2a,0xae,0xdd,0xa8,0x65,0xe4,0xa9,0x39,0x00,0x1e,0xca,0x17,0x99,0xba,0xd6,0xf2,0x20,0x21,0xbf,0x1a,0xab,0xca,0x7c,0x92,0x22,0xee,0x3c,0x0c,0xc6,0x63,0xcc,0x86,0xfe,0xc0,0x8f,0xac,0x18,0x4e,0x2b,0xa5,0x2e +.byte 0x46,0x57,0x8a,0xbf,0xdc,0xd1,0xd2,0x2c,0x5b,0xe2,0x96,0x81,0xca,0x41,0xb5,0x17,0x38,0x4a,0xa4,0xd2,0x0e,0xac,0x5d,0xe9,0x44,0x63,0x1b,0xb8,0x81,0xd6,0x69,0x1c,0x99,0xc5,0xdb,0xdd,0x18,0xc1,0x6d,0x28,0x7d,0x36,0x52,0x82,0xaa,0x1a,0x10,0x01,0x9d,0xf1,0x7b,0x09,0x69,0x56,0xb1,0x31,0xa3,0x54,0x3c,0x56,0xf9,0x82,0x8c,0x06 +.byte 0x5a,0x32,0x2d,0xc0,0x7c,0x7e,0x91,0x6d,0x73,0x7b,0x7c,0x45,0x0b,0x2c,0x2a,0x4f,0x3c,0xea,0x6b,0x2b,0x84,0x76,0xab,0x8d,0x4c,0x5c,0x64,0xa3,0x97,0x9f,0x56,0x20,0x05,0xf9,0xc2,0x20,0xf3,0xd0,0x6a,0x7f,0x7d,0x12,0xfc,0x20,0x52,0x5d,0xff,0x92,0xaf,0x4e,0x7f,0x8f,0x2f,0xd0,0x73,0x06,0x23,0x09,0xce,0x11,0xc0,0x1b,0x48,0x7d +.byte 0x11,0x51,0x06,0x0e,0x05,0x95,0xca,0x42,0x71,0x87,0xa3,0xa3,0xc1,0x27,0xf8,0xb1,0x24,0x92,0x38,0x95,0xf6,0x8f,0x3b,0x70,0x74,0x19,0x9b,0x08,0xb3,0x49,0xe9,0x57,0xd4,0xce,0x5b,0xdd,0xab,0x95,0x26,0xe9,0x70,0x21,0xef,0x16,0xdd,0x36,0x89,0xe5,0x9e,0xaf,0xc5,0x28,0x0c,0xd3,0x67,0x64,0xbc,0xfb,0x18,0x17,0x15,0x1e,0xa7,0xb7 +.byte 0x72,0x3d,0xfd,0x10,0x5c,0xa2,0xc1,0xbf,0x62,0x79,0x2b,0xa7,0xb9,0x1f,0x73,0xe6,0x11,0xd8,0xbc,0x74,0x6c,0x45,0x95,0xef,0xa2,0xda,0x90,0xc3,0x00,0x00,0xbb,0xc7,0x28,0x36,0x82,0xd4,0x5e,0x5c,0x11,0xea,0x7c,0xf6,0x79,0x66,0xff,0x93,0x77,0x49,0x05,0xc9,0xc1,0x8d,0x5c,0xf6,0xff,0xb9,0xf9,0xcd,0xb3,0x01,0x83,0x83,0x43,0x2d +.byte 0xa1,0x90,0x73,0xc9,0x32,0xae,0xdb,0xd0,0xf3,0x61,0x63,0x72,0x06,0xde,0x21,0x7b,0x3b,0x2d,0xec,0xd3,0x1d,0xfe,0xbd,0x6e,0xd8,0xe3,0x39,0xe0,0xa1,0x9f,0x67,0xaf,0xab,0x79,0xbc,0x59,0xf9,0xa7,0xdf,0x28,0x75,0xea,0x34,0x6b,0x25,0xde,0x49,0x1b,0x07,0x95,0x19,0x47,0x86,0x46,0x7b,0x68,0x30,0x70,0xec,0x9c,0x05,0xb6,0xc9,0x00 +.byte 0x68,0x10,0x4b,0xc4,0xe5,0xf1,0x67,0x3f,0xd4,0x3c,0xd6,0x49,0x98,0x71,0x23,0xff,0x07,0x6e,0x01,0x01,0x08,0x08,0x3d,0x8a,0xa1,0x71,0xdf,0x25,0x1a,0xef,0x60,0x86,0x6d,0x1c,0xd9,0x90,0x29,0x95,0xf2,0x4c,0x96,0xd3,0x17,0xe8,0x96,0x32,0x25,0x8c,0x65,0x38,0xbc,0x44,0x6a,0x5a,0xef,0x5a,0x72,0x12,0x43,0x2b,0xaf,0xc3,0xdc,0xb3 +.byte 0x6c,0x9f,0x57,0x61,0x2f,0x12,0x3f,0x72,0x16,0x4f,0x34,0xe3,0xb5,0xca,0x72,0xca,0x1c,0xdb,0xd2,0x8d,0x70,0x1f,0x19,0x75,0xb3,0x1b,0xdf,0xdb,0xb3,0xbf,0x6c,0x9a,0x70,0x64,0xa8,0xac,0x30,0x2d,0x4b,0x30,0xf5,0x4f,0x12,0x19,0xbd,0x65,0x25,0x70,0x33,0xe1,0x6f,0x18,0xdf,0x17,0xec,0xa3,0x80,0x51,0x6e,0xbb,0x33,0xa5,0xa8,0x58 +.byte 0x95,0x3c,0xab,0x86,0xd1,0x33,0xbe,0x55,0x04,0x8c,0x20,0x0d,0xfc,0x1a,0xa9,0x9d,0xb1,0x16,0x42,0x56,0x20,0xcc,0xa6,0x73,0xa0,0x85,0x3d,0xbf,0x1e,0xe0,0x01,0x51,0xd2,0xd7,0x2e,0x9d,0xd8,0x3c,0xea,0x03,0xf9,0x9a,0xbf,0x19,0x17,0x04,0x99,0xaf,0x8b,0xfc,0x9c,0x86,0xdf,0x58,0x78,0xfc,0x54,0x0d,0xac,0x26,0x27,0x2f,0x2e,0xbc +.byte 0xdd,0x4a,0xd5,0x6f,0x7c,0xd8,0x93,0xe3,0x51,0x9e,0xcc,0xc8,0xd2,0xfe,0x68,0xfb,0x5b,0x22,0xda,0xef,0x76,0xb9,0xc3,0xdd,0x13,0x52,0x24,0xb6,0x23,0x1f,0x69,0x22,0xb6,0xf5,0x86,0xff,0x2e,0x6e,0xd0,0xe0,0x21,0xbc,0x31,0x81,0xb5,0xc5,0xdb,0x36,0x58,0x44,0xe7,0xb8,0xf7,0xfd,0xd3,0x34,0xee,0xab,0xe6,0x99,0xf2,0x84,0x86,0x9b +.byte 0x67,0x45,0x08,0x07,0x66,0xae,0x6a,0x55,0xa2,0x74,0x46,0xda,0x02,0x82,0x67,0x93,0x60,0x64,0x5d,0x1f,0xac,0xe7,0x36,0xb6,0xcd,0x31,0x28,0x78,0x93,0xcd,0x54,0xe9,0x42,0xbb,0xb4,0xb3,0x15,0x72,0x12,0x31,0x85,0x15,0x68,0x3a,0x31,0x35,0xd6,0xc9,0x0d,0x3f,0xa0,0x4b,0x36,0x03,0xda,0xfd,0x7a,0xd6,0xce,0x0c,0xf5,0x14,0x23,0x71 +.byte 0x47,0x85,0x64,0xe7,0xe7,0x8b,0x8e,0x25,0x03,0x32,0x5f,0xa9,0x3b,0xdb,0x2b,0x27,0x7c,0x02,0xfb,0x79,0xd7,0x7a,0x76,0x75,0x69,0xfd,0x74,0x24,0xd2,0x72,0x8c,0xdd,0xc5,0xa1,0x45,0x90,0x50,0x65,0x95,0x41,0xae,0x7e,0x5c,0x83,0x3e,0x24,0x3c,0x02,0xa9,0x37,0x49,0x36,0x63,0x2f,0x18,0x92,0x3a,0x8a,0xe5,0x2a,0x6a,0x5c,0xa7,0x3e +.byte 0x98,0x24,0xfd,0xd9,0x3b,0x2d,0x4c,0xe2,0x8e,0x05,0x5b,0xdd,0x47,0x0f,0x19,0x5a,0x62,0x94,0xd6,0x6e,0x45,0xd8,0x99,0x43,0x78,0xa0,0xb1,0xdf,0x68,0x8a,0x56,0xa8,0xfb,0x2e,0x52,0x4e,0xfa,0x21,0xec,0x62,0x14,0xf5,0x90,0xdb,0x8c,0x02,0xa7,0xff,0x29,0x22,0xb8,0x40,0x87,0x58,0xda,0x4e,0xfd,0xab,0xeb,0xa2,0x40,0xce,0xfc,0x58 +.byte 0x46,0x37,0x3f,0x04,0x4e,0x36,0x76,0x44,0x3c,0xfc,0x54,0xb8,0x6f,0x4b,0x66,0x6a,0x4a,0x78,0x8f,0x33,0x86,0x07,0xe4,0x3c,0xb5,0x0f,0x86,0x2e,0x21,0x7e,0x44,0xce,0x18,0x77,0xe0,0xcc,0xd7,0x7f,0xc9,0xac,0xb7,0x2b,0x94,0xb5,0x91,0xcd,0x2c,0xfa,0xc7,0x98,0xbd,0xb0,0x2a,0x85,0x77,0xcf,0x82,0xd9,0xae,0x76,0x33,0x34,0xc0,0x9d +.byte 0x3a,0xbc,0x27,0xbc,0x97,0x25,0xf4,0xf1,0x43,0x53,0xac,0xf6,0xde,0xf5,0x1f,0xa6,0x6a,0xd5,0xe3,0x11,0x32,0x49,0x46,0x5b,0x56,0x68,0x07,0xdb,0x03,0xad,0xc2,0x35,0x16,0x8f,0x01,0xcc,0x8a,0xd2,0x0c,0x6b,0xb2,0x62,0x73,0x99,0xb5,0x74,0xf1,0x4b,0x2e,0xbc,0x8e,0xed,0xc0,0x55,0x56,0x40,0xae,0x24,0xf2,0x7e,0x1f,0xba,0x9d,0xc4 +.byte 0xd1,0x69,0xd3,0xba,0x21,0x83,0xf5,0xc4,0xbf,0x78,0x96,0x74,0xa1,0xd8,0x8c,0x35,0xba,0x9f,0xa0,0x0f,0xb5,0x6a,0xb2,0x72,0x52,0xfa,0x02,0x71,0xbb,0x79,0x61,0xbd,0xa9,0xee,0x22,0x7c,0xc5,0xac,0x6b,0x52,0x67,0xab,0xc4,0xd2,0x8d,0x26,0x1c,0x2b,0xaf,0x0c,0xa4,0xce,0xb5,0x11,0x99,0x4d,0x22,0x69,0x68,0xe0,0xc6,0x3e,0x84,0x3d +.byte 0xeb,0xad,0xc9,0x5b,0xb5,0xb4,0xba,0x06,0x9b,0x0a,0xb2,0x54,0x89,0xf2,0xb0,0x5f,0x41,0xb4,0x8b,0x21,0x31,0x29,0x94,0x52,0x1e,0xa7,0xc4,0xc2,0x97,0xb9,0x74,0x95,0xa3,0x30,0xfb,0x02,0x77,0x01,0x4f,0x32,0x03,0x34,0x8f,0x51,0x2d,0x10,0x61,0xee,0xc5,0x2f,0x89,0x42,0x3c,0xbe,0xed,0x66,0xa6,0x7a,0x10,0xc6,0x06,0x7e,0xb2,0x3d +.byte 0xf2,0xc9,0xd1,0x08,0x97,0x6c,0x6f,0x6d,0x06,0x9d,0x72,0xd0,0x5e,0x79,0x3b,0xa5,0xa5,0xd0,0xdc,0xc6,0xda,0x73,0xd2,0xf3,0x0a,0xfd,0x94,0xc2,0x9c,0x4b,0x85,0x38,0x8d,0xb2,0xfb,0x29,0xdd,0x90,0xc2,0xb7,0x8f,0x2c,0x52,0xa2,0x32,0x5e,0xa1,0x0f,0x62,0x38,0x58,0xfa,0x46,0x4e,0x87,0x4b,0xcf,0xc5,0xe9,0xfc,0xf2,0x97,0x62,0xdd +.byte 0x92,0xd2,0x41,0x7b,0xa2,0x2a,0xae,0x6e,0x4d,0xbc,0xef,0x43,0x18,0x6e,0xbb,0xe5,0x06,0x45,0x53,0xa1,0x00,0xef,0xf5,0x4b,0xad,0xbd,0xa5,0x2c,0x77,0x0a,0x37,0x04,0x22,0x95,0xeb,0x7b,0xc1,0x3c,0x20,0x0a,0x44,0xdf,0xa2,0x23,0xc9,0xfc,0x85,0xf3,0x5b,0x9b,0x0f,0x40,0x2a,0xe3,0xc7,0x5a,0xa1,0xf6,0xe4,0x39,0x2a,0xfe,0xd7,0xe7 +.byte 0x33,0xd8,0xbc,0xd6,0x1f,0xef,0xac,0xa9,0x3f,0x2d,0x55,0xb0,0x85,0x74,0xef,0xeb,0xcd,0x9b,0x23,0xa3,0xe6,0x19,0xde,0xea,0x7c,0x9c,0x83,0x48,0x4b,0x12,0xfd,0xe3,0xcb,0x1b,0x70,0x2d,0x9f,0x2c,0x13,0x82,0x87,0x68,0xca,0x60,0x5e,0xc0,0x2e,0x60,0xde,0xf2,0x6b,0x78,0x0a,0x63,0xaa,0x9c,0x9b,0x61,0x63,0xc7,0x0c,0x98,0x92,0x68 +.byte 0xc7,0x44,0x00,0x6a,0x76,0x43,0xa0,0x61,0x7c,0x37,0x62,0x1a,0xd4,0x9b,0x58,0x59,0xe5,0xae,0x78,0x79,0x80,0xf0,0x75,0x68,0x9e,0xab,0x02,0xb8,0x00,0xc5,0x33,0x0d,0xea,0xb1,0x91,0x0f,0x17,0x57,0x96,0x23,0x8d,0x36,0x4d,0x89,0x94,0x42,0xc9,0x61,0x6e,0xf6,0x9f,0x37,0xee,0xa5,0x4b,0x3d,0x06,0x08,0xee,0x9a,0x7c,0x73,0xa9,0x58 +.byte 0xcd,0xcb,0x78,0xa9,0x3d,0x5c,0x11,0x0e,0x5a,0xd9,0xb0,0x7b,0xc4,0x3e,0x83,0xdc,0xe2,0x11,0xe9,0x6d,0x8a,0x8b,0x24,0x28,0x1d,0x7e,0x45,0x1b,0x05,0x5a,0x6b,0x97,0x1c,0x25,0x15,0x84,0x5c,0x3f,0x95,0x44,0xd5,0x4f,0x3c,0x4b,0x52,0xb1,0x0b,0x6a,0xb3,0xae,0x4e,0x1b,0x12,0xcf,0x16,0x78,0xd7,0xcb,0x32,0x43,0x39,0x88,0xf4,0x5e +.byte 0x26,0x29,0xe7,0x93,0x08,0x19,0x14,0x88,0x8f,0x54,0x91,0x13,0xb6,0x57,0xd1,0x87,0xd4,0x9d,0xf7,0xec,0x9b,0x22,0x6b,0x91,0x79,0x9d,0x6c,0x32,0x47,0x4a,0x79,0x55,0x7d,0xac,0x87,0x98,0x59,0x97,0xa5,0x71,0xbc,0xbf,0x1b,0xf0,0x6f,0xbb,0x81,0x8e,0xc2,0xef,0x7c,0x63,0x2f,0x80,0x37,0xb6,0xc5,0xae,0x59,0x5e,0x57,0x5e,0x1f,0x3a +.byte 0xe5,0x6b,0x6b,0x5e,0xdb,0x8e,0xd2,0x87,0xf7,0x94,0x7b,0x11,0x0e,0x4b,0xa6,0x9f,0x49,0xc6,0x68,0xc7,0x52,0x5f,0x28,0x87,0x33,0x84,0x52,0x5f,0xc8,0x5f,0x81,0x85,0x10,0xe8,0x92,0xce,0x13,0x6c,0x01,0x28,0x5e,0x59,0x8f,0xbb,0xa9,0x9c,0xdc,0x85,0xd3,0x73,0xa0,0x5a,0xbf,0x5b,0x04,0x80,0x99,0x90,0xc8,0x16,0x44,0x0d,0x09,0x01 +.byte 0xcd,0x24,0xe7,0x59,0xe7,0x42,0xe0,0xdd,0x01,0x93,0x1f,0x9e,0x1f,0x36,0xdb,0xcd,0x49,0xdb,0xea,0xa9,0x63,0x71,0xb9,0x2c,0xcd,0xca,0x1a,0x64,0xe1,0x95,0xbe,0xe1,0x64,0x2e,0xc7,0x59,0x15,0x61,0xe1,0xf9,0x45,0x0f,0x2a,0x3a,0x85,0xf8,0x7c,0x06,0xae,0x53,0x84,0xd2,0xe7,0xee,0x8b,0xbf,0x7a,0x72,0xa3,0x57,0xf1,0xc2,0x12,0x40 +.byte 0x9c,0x93,0xe1,0x04,0x81,0xde,0xc6,0xa8,0xae,0x4f,0x5c,0x31,0x93,0xc7,0x11,0x1d,0x89,0x70,0x85,0xd5,0x6f,0xab,0x58,0x1f,0x3f,0x76,0x45,0x7e,0x19,0xd0,0x6c,0xc1,0x41,0xa9,0x64,0x0a,0x79,0xb5,0xe0,0x9e,0xbc,0x4f,0x10,0x0c,0xac,0xfc,0x54,0xad,0xcf,0xb8,0xd0,0xfd,0x9b,0xed,0xea,0x54,0x05,0xbf,0x4f,0x91,0xbd,0x16,0x4a,0x57 +.byte 0xa9,0xda,0x38,0xb9,0x40,0x0d,0x63,0x68,0x83,0x7d,0xec,0x1c,0xe6,0x7f,0x9c,0xec,0x16,0x4e,0x0b,0xd0,0x91,0xb4,0x2c,0x04,0x65,0xb8,0x12,0xdf,0x3f,0xff,0x6a,0x08,0x4e,0x65,0xdf,0x09,0xa5,0xea,0xb1,0xac,0xa9,0x67,0xd2,0xbb,0x73,0x51,0xd2,0x37,0x72,0xfc,0x3f,0x69,0xe2,0x3f,0x01,0x94,0x3a,0xf7,0x23,0x0e,0x5d,0x23,0x44,0x82 +.byte 0xc7,0x38,0x35,0x9f,0xfa,0x13,0x15,0x47,0x0d,0x18,0xab,0x02,0x39,0x6e,0xb2,0x7c,0x29,0x11,0x9a,0x5a,0x01,0x2d,0xb2,0x10,0xea,0x9d,0xb7,0x37,0x4b,0xf2,0x2b,0x76,0x22,0xf7,0xaf,0x8a,0x5f,0x1d,0x6b,0xb2,0x13,0x9e,0x84,0xf5,0xbc,0x6e,0xad,0x66,0x5c,0x1b,0x5d,0x12,0xb0,0xe1,0x48,0x94,0x83,0xa0,0x26,0x54,0xd2,0xfd,0x3c,0x8d +.byte 0x81,0xac,0x31,0x9a,0x15,0xc6,0xd8,0xd5,0x07,0x1b,0x21,0x3f,0x04,0x40,0x3a,0x60,0x80,0x5f,0x1f,0x42,0x3e,0xd7,0x2b,0x7a,0x5f,0x71,0x93,0xb4,0x9d,0xf0,0x8b,0x5e,0xf1,0xc6,0x19,0x0a,0xa9,0x43,0xac,0xb2,0xc1,0x73,0x0d,0x44,0x6a,0x92,0x22,0xd0,0xda,0x40,0x14,0x7d,0x88,0xd1,0x5e,0x10,0xc9,0xa4,0x4d,0xd8,0xe0,0x7d,0x74,0x1b +.byte 0x2b,0xcb,0x50,0x24,0xbd,0x50,0x4a,0xe4,0xed,0x0e,0xe8,0xc0,0x5b,0x50,0x6d,0xf5,0x68,0x59,0xd1,0xc3,0x6f,0x32,0x86,0x29,0xe0,0x32,0x3f,0x05,0x86,0xa2,0x7f,0x93,0xd8,0xb7,0x02,0x68,0xb3,0x16,0xaa,0x0c,0xd3,0x4d,0xec,0x9a,0x66,0x06,0x7c,0x74,0x35,0x6f,0xde,0x8b,0xd9,0xdb,0x79,0x0a,0x15,0x84,0xc4,0x63,0xba,0x42,0xa2,0x3c +.byte 0x29,0xc8,0x65,0xdc,0x06,0x60,0x0a,0x08,0x4e,0x80,0x33,0x5c,0xfa,0x4b,0x91,0xdb,0xf6,0x57,0xd6,0x25,0x7d,0x70,0x80,0x09,0xb2,0x27,0xdb,0x80,0x4c,0xa7,0xe8,0x35,0xf5,0x18,0x2d,0x10,0x62,0x22,0xf9,0xb1,0x22,0xf3,0x9b,0x74,0xa0,0xc5,0x25,0xd3,0x44,0xc9,0x27,0x7c,0xba,0x01,0xfe,0x32,0x23,0xf7,0x90,0x90,0xbc,0x0d,0xad,0x9e +.byte 0x22,0x77,0xc5,0xfb,0xf2,0x0e,0xda,0xe5,0x7c,0xb4,0xbb,0xed,0xd4,0xfd,0xb0,0xfb,0x4a,0x4c,0x2a,0x32,0x2d,0x81,0xcd,0xef,0x74,0x3c,0x6a,0x9a,0x0c,0x95,0x58,0x25,0xd0,0x3a,0xb4,0x84,0x8f,0xa5,0xef,0xad,0x91,0xd7,0x2d,0xae,0x61,0xaf,0x9d,0x3f,0x03,0xa8,0xab,0xa4,0x66,0xd4,0x73,0x3a,0x84,0x0d,0x4c,0x6a,0xca,0xbd,0x0c,0x3c +.byte 0xdc,0x1d,0x37,0xea,0xe6,0x5a,0x7f,0x15,0xbe,0x9d,0xc7,0xce,0xbd,0x46,0x97,0xd3,0x07,0x19,0x82,0xaf,0x58,0x39,0x39,0x95,0x5d,0x4b,0x8e,0x1b,0xe9,0xf1,0xf6,0xa9,0xb3,0xfc,0xe6,0xe0,0x68,0x2c,0xbb,0xfa,0xd9,0x9b,0xc1,0x69,0xf3,0x5a,0x8f,0x67,0xd5,0x9c,0x11,0x1e,0x02,0x20,0x20,0xfe,0x4b,0xc9,0x8b,0x62,0x17,0x9a,0xfa,0x47 +.byte 0x7f,0xa2,0x8b,0xc1,0x3b,0x02,0x78,0x38,0xff,0xce,0xe1,0x54,0x40,0x3f,0x27,0x5c,0x9d,0xdd,0x56,0x38,0x48,0xea,0x39,0xbe,0xa0,0x76,0x43,0x82,0xef,0x74,0x50,0xdf,0xda,0x4c,0xca,0x47,0x46,0x7e,0xc5,0xff,0xce,0x66,0xdf,0xeb,0x5b,0x6e,0x45,0x77,0x19,0xac,0x01,0x1f,0x20,0xa1,0xad,0x01,0x5f,0x87,0x3e,0x3a,0xd0,0x83,0x13,0x17 +.byte 0x53,0x40,0xfe,0x26,0x99,0x42,0xfa,0x54,0xa8,0x82,0x79,0xa7,0x44,0xd0,0x9e,0x59,0x64,0x77,0xec,0x70,0x0e,0xcd,0xb9,0xb1,0xc2,0xe2,0x39,0x93,0xb7,0xd1,0xd5,0x67,0x9f,0xb0,0x5b,0xd9,0x50,0x8b,0x17,0xec,0xbc,0x83,0x64,0x35,0xaa,0x43,0x3f,0x4c,0x8c,0x56,0x83,0x76,0xa2,0x72,0x30,0xe7,0xe8,0x9f,0x88,0x35,0x8e,0x8d,0x11,0x31 +.byte 0x8e,0xb5,0x71,0x75,0x31,0xc8,0x28,0x15,0x50,0xe6,0x0a,0x00,0x4d,0x75,0x51,0x7c,0x33,0x14,0x96,0xff,0xe8,0xf3,0xa0,0xb1,0x9c,0xeb,0x9d,0x8a,0x45,0xcf,0x62,0x82,0xeb,0xce,0xea,0xa5,0xb9,0x10,0x83,0x54,0x79,0xf8,0xcf,0x67,0x82,0x1d,0xea,0xce,0x86,0xcf,0xc3,0x94,0xf0,0xe8,0xf4,0x80,0x8b,0x84,0x96,0x06,0x2e,0xe4,0x58,0x21 +.byte 0x98,0x42,0x1a,0xb7,0x8c,0x5d,0x30,0x15,0x83,0xe8,0x17,0xd4,0xb8,0x7b,0x90,0x57,0x35,0x72,0x6d,0x1b,0x7c,0xc0,0x88,0x0a,0xa2,0xea,0xcd,0x58,0xcc,0xf1,0xb4,0x8b,0xcd,0x66,0x3c,0xa5,0xb0,0xd4,0xc9,0xcc,0x42,0x1d,0xef,0x3b,0x42,0x22,0x9b,0xfb,0x45,0x24,0xcc,0x66,0xd7,0x67,0x73,0xb2,0x12,0x03,0xf6,0xa3,0x06,0x61,0xe2,0xab +.byte 0x91,0x8e,0x33,0x0b,0x9f,0x6a,0x80,0x5e,0x0f,0x68,0x41,0x5a,0x7e,0xd8,0xe2,0x32,0x50,0xc2,0x88,0x60,0xca,0xe3,0x23,0x86,0xff,0xdc,0x0c,0x19,0xbb,0xba,0x01,0xa3,0x41,0x89,0xf0,0x79,0x55,0x79,0xa6,0xa4,0x66,0x7b,0x46,0xde,0xac,0xae,0xb1,0xde,0xe1,0x1e,0x8d,0x62,0xc1,0xd6,0xeb,0x39,0x2f,0x1d,0x50,0x27,0x53,0xc9,0xea,0xb6 +.byte 0xd3,0x91,0x9b,0xdd,0xc1,0x68,0x8c,0xb6,0xe1,0x5e,0x9f,0xea,0xbe,0x98,0x88,0xeb,0xa8,0x77,0xf6,0x69,0x64,0xab,0x99,0xf3,0x7a,0x08,0xff,0x8c,0xa6,0x17,0x1b,0x2e,0x6e,0xcc,0xd8,0x33,0x30,0xef,0x5a,0x86,0x07,0x49,0xa5,0x13,0x08,0xbc,0xd6,0x88,0x7e,0x19,0xe0,0x1c,0x23,0xa9,0xe5,0x0a,0xa7,0xaf,0x8a,0xe9,0x81,0x3f,0xd8,0x99 +.byte 0xa6,0x01,0x6b,0xec,0x14,0x08,0x90,0xb1,0x76,0x16,0x3a,0xcb,0x34,0x0b,0x91,0x26,0xe9,0xec,0xe5,0xbc,0xd6,0xdc,0xf0,0xa9,0xfd,0xf2,0xe9,0xcc,0xa1,0x9d,0x7f,0x32,0x0d,0x0a,0x2a,0x92,0xff,0xc4,0x38,0xf8,0x9e,0x31,0x78,0x47,0xbf,0x3f,0x27,0x71,0xe1,0x7a,0x33,0x48,0x91,0xe8,0x8e,0x1a,0x66,0xcf,0xa1,0x61,0xc2,0x62,0x30,0x7c +.byte 0x69,0x35,0x21,0x67,0x9b,0xa7,0x1c,0x72,0x06,0xd8,0x28,0x94,0x6e,0x6d,0xf0,0x22,0x85,0xb4,0x6c,0x89,0xe8,0x2e,0x3a,0xc5,0xdc,0xe3,0xe3,0x0c,0x8a,0xba,0x1c,0x57,0x86,0xef,0x55,0x6a,0x24,0x59,0x5e,0x6e,0x47,0xb8,0xad,0xc5,0x10,0xff,0xbe,0x2d,0x93,0x09,0xfe,0x17,0x03,0x16,0x4d,0x4a,0x9a,0x15,0x38,0x94,0x38,0x18,0x45,0xa7 +.byte 0xcf,0xe4,0x16,0xd3,0x26,0x72,0x49,0xe7,0x89,0x9a,0xb4,0xc7,0x78,0xc3,0x18,0x3b,0xc8,0x08,0x9d,0x66,0x0f,0x48,0xc8,0x23,0x91,0x57,0x61,0xf1,0xf3,0x01,0x3e,0x0a,0xa3,0x4c,0x6c,0x34,0x5b,0x98,0x40,0x47,0x42,0xc1,0xeb,0x58,0x58,0xff,0x1f,0x4b,0x5f,0xf1,0x29,0x2e,0x7e,0x76,0x15,0x56,0x17,0x9c,0xe7,0x55,0x09,0x22,0x0a,0xa2 +.byte 0xd8,0xbf,0xd9,0x44,0x49,0xa9,0x24,0xd7,0x4f,0x12,0x04,0xa2,0x18,0x1c,0xdc,0x54,0xc0,0x22,0x27,0x3c,0xeb,0x1f,0x02,0xae,0xb3,0x33,0xb2,0xa2,0x84,0x23,0x76,0xc6,0x2b,0x94,0x53,0xae,0x7b,0xee,0xbb,0x81,0x64,0x8a,0x3f,0xe0,0x75,0x6b,0x2c,0xd5,0x60,0xad,0x49,0x0c,0xf8,0x65,0x64,0x1a,0x83,0xc7,0xb9,0xd9,0x01,0x5b,0xde,0xb0 +.byte 0x76,0x9b,0x1c,0x0d,0x89,0x2d,0xd5,0x09,0xc7,0xa9,0xbb,0x0a,0x54,0x5c,0xd4,0x5b,0xbf,0xbc,0x5e,0x00,0x29,0x0b,0x30,0x19,0x73,0x66,0xfd,0x3f,0xdb,0xd4,0x1b,0xd4,0xc0,0x27,0xde,0x49,0x90,0x5f,0x65,0x87,0x3c,0xc4,0x43,0xd0,0x49,0x76,0x64,0x39,0x88,0xd7,0x0e,0xfc,0x27,0x52,0xb1,0x8d,0xd0,0x27,0x29,0x84,0xe3,0x49,0xb9,0x0c +.byte 0x2d,0x4e,0x73,0x95,0x57,0xa8,0x07,0xa0,0xe1,0x5b,0x5a,0xb6,0xbc,0xa1,0x7f,0xfd,0x4b,0x9c,0x4d,0x7d,0x0c,0x5c,0x4c,0x4b,0x42,0x70,0xc3,0x0a,0xc1,0x89,0x12,0xb5,0x46,0x04,0x3c,0x56,0x25,0xc6,0x8f,0x49,0x7d,0x3b,0xf1,0xcd,0xfc,0xb8,0xa6,0x66,0xb1,0xc2,0xa3,0xa7,0x98,0x93,0x0e,0xdb,0xcd,0xce,0xdf,0x7f,0x68,0x5e,0xea,0xf2 +.byte 0x85,0x61,0x8f,0xd6,0x23,0xb4,0x5f,0x2f,0xf8,0x78,0x47,0x15,0x59,0x2d,0xca,0x35,0x0f,0xf5,0x91,0x74,0x3b,0x32,0xe1,0xcf,0x54,0x1b,0xf4,0x9d,0xdb,0x20,0x5e,0xf8,0x71,0x10,0xa3,0x31,0xf1,0xb8,0x98,0x8d,0x76,0x70,0xce,0x4c,0xed,0xd3,0x81,0x6b,0xd5,0x8d,0x73,0x5f,0x8c,0x66,0x7c,0x87,0x73,0xfa,0x20,0xbe,0xcd,0xba,0x41,0x88 +.byte 0x46,0xc3,0x38,0xc0,0xd9,0x08,0x79,0x30,0xda,0x7f,0x2a,0xc0,0x72,0x47,0xb0,0xc9,0x41,0x68,0xb1,0xe8,0xb4,0x86,0xcb,0x5d,0xb0,0x5b,0x7a,0x26,0xfd,0xf2,0x1b,0x4e,0x1f,0x4c,0x6a,0x8a,0x84,0xd4,0x07,0x2f,0xf4,0x06,0x73,0x3d,0x1c,0x55,0x04,0x6a,0xa5,0x8a,0xbb,0xaa,0x8a,0x8d,0x8f,0x05,0xcc,0x63,0x04,0xe0,0xc6,0x6f,0x6b,0xf8 +.byte 0x24,0x56,0xbb,0x9d,0xa9,0xe5,0x4c,0xac,0x9d,0xbe,0xfd,0x70,0x9d,0x1f,0x98,0xc4,0xfc,0xdb,0x3c,0x45,0xe7,0xbb,0xea,0x51,0xb6,0x56,0xe0,0x2c,0xb2,0x77,0x1b,0x80,0x9b,0x43,0xa7,0xb2,0x9a,0x40,0x8f,0xdb,0x2d,0x51,0x7b,0x2c,0x89,0xfd,0x14,0xf5,0x77,0xbf,0x40,0x3d,0x32,0xe0,0x10,0x32,0xcd,0xc4,0x3f,0xe2,0xe8,0xb4,0xdf,0xc2 +.byte 0x43,0x7a,0x0b,0x17,0x72,0xa1,0x0e,0xd6,0x66,0x35,0x8f,0xf4,0x21,0xf1,0xe3,0x46,0x13,0xd7,0xcd,0xc7,0x7b,0xb4,0x9b,0x39,0x1e,0x33,0x3c,0x18,0x15,0x7a,0xea,0x77,0xc5,0x57,0x4d,0xf9,0x35,0x8a,0xc1,0xb5,0x78,0x5d,0xc3,0x3e,0xd5,0xfd,0xb5,0x50,0xee,0x44,0x24,0xa2,0x55,0xb6,0xd8,0x3d,0x5d,0x75,0x2a,0x26,0x37,0xe7,0x85,0xb3 +.byte 0xff,0x70,0x5d,0x99,0x8d,0x99,0xba,0x9d,0x09,0x97,0xf2,0x67,0xe5,0xa3,0x86,0x06,0x21,0xb4,0x03,0x9b,0x63,0x76,0x1f,0xf8,0x09,0xd8,0x4e,0x22,0xcb,0x48,0xcf,0x79,0x72,0xc9,0x3f,0x84,0x5e,0xb8,0x39,0x87,0x27,0x92,0x1e,0x59,0xdf,0xc2,0xe6,0xd2,0xc4,0x5f,0xad,0x6e,0x9c,0xa4,0xec,0xd5,0x7d,0xf6,0x2b,0x9b,0x93,0x56,0xcd,0xa3 +.byte 0xc5,0xfa,0x82,0x39,0x46,0x29,0x57,0x43,0x08,0xe2,0xe1,0x3e,0x80,0x3b,0x8e,0x08,0xe5,0xc5,0xfe,0x05,0x17,0xaf,0xe0,0xf0,0xb7,0x5b,0x34,0x33,0x59,0xfa,0x93,0xbf,0x6a,0xb3,0x6c,0xbc,0x99,0x62,0x34,0x2c,0xf2,0x3b,0x62,0xf2,0x1c,0x48,0x07,0xc9,0x60,0x03,0xa5,0xe1,0x66,0x8d,0x84,0x36,0xc7,0xf9,0xc6,0x3b,0xa9,0xee,0x0f,0x48 +.byte 0xff,0xff,0xad,0x95,0x21,0xb5,0x12,0x63,0x7d,0x0f,0x0d,0x09,0x63,0x51,0x64,0x69,0xb4,0x95,0xd3,0x25,0xf0,0x3b,0x6d,0xc4,0xdd,0x8c,0x80,0x0d,0x3b,0xd2,0x4b,0xe0,0x67,0xcb,0xcd,0x7d,0x2e,0xbd,0x61,0x4b,0x0c,0x32,0x1f,0xfd,0xd2,0x31,0xed,0xa8,0xaa,0x98,0xf4,0x85,0x21,0xbc,0x08,0x14,0x2f,0xbb,0xbf,0x01,0xba,0x24,0x5e,0x5c +.byte 0xf3,0x72,0xed,0x05,0xec,0xf3,0xd1,0x9b,0xb0,0x63,0x8a,0x14,0xd1,0x9e,0xae,0x9b,0xce,0x4d,0x6c,0xb6,0x7a,0x78,0x9e,0x1d,0xcd,0x1e,0x50,0x66,0x26,0x70,0x74,0x2b,0x43,0x6a,0xc7,0xd7,0xe9,0xa2,0xcf,0xf3,0x09,0x9a,0x81,0x80,0x04,0xb8,0x5a,0x4f,0x2e,0x10,0x35,0xb2,0xb0,0xc6,0x40,0x97,0xa5,0x6a,0x24,0x5a,0x6b,0x97,0xc7,0xc0 +.byte 0x24,0x50,0x8d,0x65,0x21,0x25,0xce,0xb9,0x19,0xfc,0x40,0x08,0xcf,0xfd,0x1c,0xc4,0x30,0xd4,0x06,0x70,0xac,0x8a,0x3c,0x3f,0xfc,0xc3,0xeb,0xdd,0x43,0x56,0x4a,0xf6,0x50,0x92,0x9d,0xce,0x9c,0xea,0x15,0xdd,0x7c,0x5e,0x40,0xf5,0x7e,0x41,0x70,0xdd,0xc7,0x62,0x21,0x5a,0x20,0xc8,0x71,0x10,0x97,0xd5,0x12,0xfa,0x31,0x96,0xfb,0x38 +.byte 0x17,0x66,0x73,0x32,0x7a,0x93,0xf0,0x82,0xb9,0xf1,0x24,0xc5,0x64,0x0b,0xa9,0x24,0x4a,0x47,0xac,0xfb,0xf1,0x55,0xd7,0xb3,0x9a,0x64,0x63,0x0b,0x2e,0x13,0x9e,0x1a,0xee,0x21,0xd0,0x70,0x5c,0x0c,0x25,0xe7,0x38,0x23,0xd7,0x2f,0x6a,0x20,0x59,0xef,0x70,0xb2,0x8e,0xb4,0x15,0xee,0x6f,0x70,0xd0,0x75,0x19,0x9d,0x42,0xa7,0x17,0xad +.byte 0x99,0xaa,0x0d,0xa3,0x87,0x3d,0xf1,0x7b,0x0e,0xfa,0x62,0x9a,0x20,0x64,0x17,0x64,0x07,0xc2,0x84,0x13,0xb2,0x59,0x81,0x66,0x45,0xab,0x47,0x6d,0xfc,0x7b,0x60,0x05,0xac,0x30,0xb2,0x86,0x7e,0x34,0x6b,0xaf,0x37,0x00,0xa6,0x47,0x4c,0xb9,0x10,0xbd,0x9e,0xce,0x47,0x9e,0xc2,0x0e,0xfd,0x47,0xfa,0xd8,0x08,0xd1,0xc2,0xaa,0x6d,0x8c +.byte 0x91,0x2c,0x18,0x32,0x52,0x84,0x47,0x71,0x3b,0xc9,0xa1,0xf5,0xfc,0x90,0xb8,0x79,0xbf,0xe5,0x59,0x1b,0x91,0x22,0xcb,0xd3,0x87,0x7e,0xd4,0xb5,0x33,0xb2,0xfc,0x7c,0xee,0x22,0xfb,0xe8,0xb0,0x3c,0xa7,0x8b,0x05,0xd7,0x7f,0x17,0x52,0xbe,0xb6,0xe0,0x1e,0x47,0xce,0xfd,0x79,0xdf,0x16,0x5f,0x01,0x70,0x0c,0x47,0x5a,0x01,0x96,0x08 +.byte 0x3e,0x9b,0xc4,0xb2,0x58,0x73,0xc4,0x38,0xd6,0xf2,0x1b,0x0a,0x2c,0xb9,0x2a,0x96,0xb5,0x89,0x2d,0x33,0xdf,0xa4,0x5f,0x24,0x1b,0x79,0x0e,0xb6,0x9f,0xec,0x46,0xd3,0x27,0x4a,0xc1,0x26,0x94,0x95,0x41,0xd5,0xb3,0x84,0x74,0x62,0x47,0xc5,0x4d,0xb4,0xe2,0xe7,0xdb,0xc3,0xc3,0x7b,0x33,0x2a,0xbf,0x69,0xf6,0x5e,0xdc,0xfe,0xa4,0x81 +.byte 0x91,0xf3,0xa8,0x26,0x82,0x44,0x37,0xea,0xe1,0x20,0xff,0x52,0x33,0x5b,0x0b,0x6f,0xf8,0x33,0x4e,0x02,0x4d,0x38,0x93,0xcd,0xc0,0xfc,0x73,0x1a,0xf9,0xf6,0x9f,0x53,0xfc,0xf7,0xe2,0x4b,0x25,0xdd,0xa7,0x4d,0x1e,0x5c,0x17,0xc3,0xa0,0x41,0x1d,0x67,0x45,0xff,0xcb,0x41,0x49,0xc4,0x18,0x68,0x7e,0x7f,0xb6,0x6f,0xdb,0xbc,0x73,0x2f +.byte 0xc7,0x9a,0x46,0x8c,0x0b,0x57,0xa3,0xd3,0x0a,0x34,0xb7,0x27,0x67,0xbb,0xe1,0x64,0xa7,0x7e,0x79,0xac,0x4f,0x09,0x54,0x9b,0x43,0x5e,0x9a,0x33,0x02,0x45,0xdc,0x85,0x0b,0x59,0x8d,0x78,0xe8,0xd8,0xb5,0xd3,0x31,0x9d,0x2a,0x60,0x5b,0x91,0xed,0xf1,0xf1,0x37,0x3f,0xdb,0xda,0xd6,0xd1,0x8f,0x14,0x7e,0xe1,0xfc,0x92,0x60,0xa5,0x33 +.byte 0x86,0xef,0x29,0xbf,0x94,0x84,0x2b,0x24,0x20,0xb4,0x5e,0x23,0x34,0x08,0x63,0xc9,0xe6,0x80,0xa0,0x27,0x27,0x2f,0xab,0xc0,0x52,0x44,0x66,0x29,0x32,0x2e,0x91,0x96,0x02,0x1c,0x3b,0xb4,0x6e,0x33,0x49,0x5b,0x60,0x6f,0x14,0x93,0x65,0x0d,0x97,0x01,0xfb,0xf9,0x42,0x74,0xb6,0x21,0xf7,0xc2,0x5d,0xbf,0x91,0x2b,0xf5,0xb1,0x4e,0xe2 +.byte 0xd6,0x24,0x57,0x41,0x7a,0xcb,0xdd,0xb6,0x96,0x8b,0xfc,0x42,0x19,0x21,0x7f,0x41,0x32,0x3d,0x69,0x9b,0xee,0xda,0x97,0x45,0x26,0x71,0x0d,0x12,0xf0,0x20,0x7f,0x44,0x0f,0x4c,0xd2,0xd3,0x34,0x93,0xc7,0xe5,0xe7,0x83,0x62,0x13,0x0b,0x7d,0xc6,0xe4,0xd2,0xae,0x53,0x2e,0xd1,0x18,0x81,0xd0,0x81,0xf6,0xc0,0x98,0xaf,0x1d,0xb2,0x8a +.byte 0xcb,0xd3,0xde,0x1d,0x53,0x71,0x92,0x0e,0x4b,0x8c,0x7c,0x8e,0x65,0xf6,0xe2,0xc2,0x5a,0x4f,0x8c,0x59,0x0f,0x35,0x5e,0xe4,0x43,0x50,0xab,0xb7,0xdd,0xfc,0x66,0xf9,0xb1,0x9b,0x6b,0x1b,0xaf,0x2e,0x85,0xe6,0x3e,0x4c,0xa2,0xd4,0x55,0x47,0xb9,0x66,0x66,0x7b,0xa3,0xb2,0xd5,0x8a,0x8e,0x88,0x0e,0xfb,0x4e,0xad,0xf4,0x39,0xd2,0xd6 +.byte 0x39,0xef,0xe0,0xee,0x0f,0xf3,0x94,0x47,0xa7,0x32,0x24,0x9a,0xb0,0x82,0x08,0x67,0x00,0x3f,0xe6,0x95,0x76,0x84,0x0a,0x5c,0xb7,0x74,0xc1,0x64,0x5e,0x7c,0xba,0x0b,0x2e,0x6f,0x26,0xc3,0x20,0x2e,0x95,0xc1,0xf0,0x8c,0x55,0x4a,0x45,0x26,0xe6,0xf3,0x55,0x78,0xbd,0xd4,0xdb,0x07,0xbd,0xff,0x61,0x51,0xde,0x7f,0xdb,0x56,0x73,0x6b +.byte 0x9c,0xa4,0xb0,0x72,0xa7,0xd0,0x93,0x4d,0x1d,0x3a,0x92,0x78,0xde,0x77,0x65,0xe8,0x07,0x41,0x92,0xc1,0xbb,0x69,0x79,0x20,0x43,0xab,0x21,0x2e,0x6d,0xdf,0x43,0xeb,0x73,0x49,0x12,0x1f,0x53,0x75,0x01,0xed,0xce,0xf4,0x05,0x05,0x2b,0xc7,0x2a,0x65,0x29,0xe8,0xcf,0x5b,0xf0,0xc1,0x5b,0xd8,0xa8,0xac,0xbb,0xe3,0xac,0x29,0x0a,0x90 +.byte 0x79,0x2f,0x5b,0x92,0x14,0xf2,0xc7,0x2d,0xe5,0x33,0x6e,0x5e,0x31,0xe2,0xab,0xdf,0x21,0x71,0x4a,0x44,0xaa,0xc6,0xe9,0xb8,0x51,0x1d,0xe2,0xf3,0x07,0x19,0xa1,0x98,0x9e,0x8a,0xed,0xe4,0x9e,0x52,0x16,0x1f,0x2f,0xd3,0x4c,0x97,0x1e,0x38,0x49,0x84,0x2e,0x45,0xb5,0x4b,0x4f,0xfe,0xdb,0x25,0x3e,0xa9,0x6e,0x7d,0x60,0x3b,0xa7,0x7e +.byte 0xda,0x32,0x1a,0xd6,0x04,0xbe,0x0c,0x92,0x4e,0x6d,0x85,0xf9,0x9c,0x26,0x9a,0x88,0xf5,0x50,0x95,0x7b,0x9e,0x43,0x07,0x97,0xd4,0xdb,0xa0,0x6e,0x30,0x5d,0x44,0xa9,0x41,0xc2,0xdf,0xdf,0x37,0x35,0xc4,0x85,0x83,0x08,0xea,0x22,0xfa,0xae,0xdd,0x95,0xe5,0x35,0x47,0x23,0x86,0x27,0xfa,0x71,0x88,0xa0,0x12,0x00,0xe0,0xa7,0xd1,0x1b +.byte 0x5e,0x78,0x6f,0x38,0x30,0xa9,0x80,0x75,0xd7,0x61,0xcc,0xfd,0x33,0xd2,0xb8,0xf8,0xd7,0x12,0xf5,0x03,0xf9,0x53,0x6d,0x3b,0x6b,0xff,0x24,0x0a,0x3b,0xe8,0x2a,0xe9,0xae,0xb7,0xc3,0xe3,0x0f,0x26,0x71,0x55,0xc5,0x03,0x60,0xf4,0x47,0x01,0xa3,0x69,0xb2,0x98,0x75,0x5b,0x90,0x4a,0xf9,0x61,0x49,0xd6,0xc4,0xdb,0xab,0x04,0x0c,0x47 +.byte 0x1e,0x31,0x75,0xfa,0xa2,0xc5,0xfa,0x66,0x0c,0x4a,0x93,0xa0,0xea,0x56,0xf9,0x49,0xd4,0xc7,0xcc,0x2c,0xe5,0xdc,0xab,0x61,0x8e,0x0c,0xf3,0x2f,0xb5,0x9f,0x36,0xa1,0x05,0xab,0xb6,0xbc,0x4a,0x6d,0x97,0xe7,0x19,0xe5,0xfe,0x92,0xa5,0x94,0xd5,0xc0,0xf5,0x31,0xf6,0x8a,0xf7,0x24,0x62,0xdd,0x56,0x12,0x84,0xf5,0xc6,0xa0,0x37,0xa3 +.byte 0xfc,0xbd,0x16,0x2a,0xa6,0x36,0x8e,0xd4,0x29,0xfe,0xc4,0xc5,0xcb,0xdd,0xdd,0x8b,0x7e,0xa6,0x9d,0x08,0x28,0x10,0x6b,0xff,0xd7,0x79,0x48,0x35,0x2f,0xbe,0x34,0x9a,0xfb,0xd0,0x7d,0x5c,0xad,0xf0,0xde,0x96,0xea,0x2d,0xc5,0x8b,0xa9,0x7a,0x8b,0xbe,0x97,0xde,0x7a,0x95,0xc7,0x95,0xd9,0x86,0xde,0x3c,0x8d,0x15,0x8e,0x45,0x69,0x27 +.byte 0xd4,0x27,0xa8,0xe3,0xa9,0x1e,0xa0,0x95,0x74,0xf1,0x8b,0xbe,0x3b,0xff,0xa3,0xf6,0x23,0x78,0xd9,0xbd,0xc2,0x44,0x3a,0x93,0xb5,0xa6,0x87,0x7c,0x65,0xd1,0xd8,0xd5,0x43,0x2a,0xb2,0xc8,0x65,0x86,0x83,0x06,0xf7,0x33,0x88,0x3b,0xc0,0x2c,0xb3,0x3b,0x23,0xa3,0x67,0x15,0x49,0x09,0x02,0xbb,0x11,0x08,0xe3,0x37,0x9a,0x9b,0x67,0x8e +.byte 0x63,0xc3,0x8b,0xff,0x21,0xa6,0xbe,0x3b,0xa6,0x57,0xc1,0x56,0x2a,0x02,0xdb,0x24,0x50,0x4a,0x4f,0x60,0x49,0x03,0xcf,0xba,0x55,0x1c,0x64,0xfe,0x0c,0x58,0xb4,0xb0,0x89,0x91,0xd5,0xbc,0xbc,0x85,0xe6,0x96,0x32,0x89,0x1f,0xa0,0x48,0xd1,0x6e,0xa7,0x03,0x86,0x8a,0xf2,0x5f,0xc3,0x5a,0x57,0x8a,0xa3,0x4a,0x61,0x90,0x18,0xb2,0x0d +.byte 0xc7,0x94,0xb9,0x3e,0x40,0x8b,0x1d,0x54,0xd0,0x4c,0xe7,0x2a,0xd5,0x85,0xa7,0x93,0x07,0x10,0x58,0xc4,0x8a,0x18,0x0a,0x49,0x30,0x87,0x93,0x0e,0xcf,0xc7,0x95,0x9f,0xd1,0x3f,0x9b,0x06,0xe3,0xf9,0x4f,0x16,0x58,0x04,0xb4,0xf0,0xf0,0xf3,0x3a,0xab,0x4a,0x35,0xf1,0xec,0x23,0x15,0x0c,0x24,0xba,0x90,0xdc,0xd1,0xfe,0x47,0xca,0xb2 +.byte 0x95,0x33,0x30,0x45,0xba,0x18,0x15,0xec,0x58,0x36,0x02,0xdf,0x28,0x09,0x74,0x4b,0x09,0x01,0x24,0x0f,0x00,0x7b,0xb3,0x65,0x45,0x42,0x63,0x15,0xf8,0x50,0x8b,0x4f,0x28,0x73,0x03,0x3a,0x31,0xe5,0x0d,0x56,0x8f,0x6b,0x4b,0x9e,0xda,0x71,0xee,0x68,0xba,0x85,0x81,0x3d,0x5d,0x74,0x5e,0xda,0x60,0x87,0xf4,0x5a,0x38,0xad,0xc5,0x3f +.byte 0xb5,0x15,0x02,0x59,0x1c,0xd2,0x93,0x66,0x54,0x65,0xf1,0xe7,0x9b,0xf0,0x30,0x2d,0x9e,0xba,0xc5,0x86,0xf4,0xf6,0xc7,0x92,0x73,0x12,0x3b,0x28,0x21,0x1b,0x3d,0x84,0xc0,0x1a,0x7d,0x35,0x8b,0xd4,0x35,0x39,0x35,0xa6,0x51,0xd9,0x19,0x8b,0x92,0xa3,0xea,0x8c,0x7e,0x25,0x05,0x1f,0x1d,0x8f,0x4d,0xba,0xdf,0x20,0x8c,0x8d,0xe2,0xac +.byte 0xdd,0x3d,0xf1,0x04,0x3f,0x77,0x4b,0x8f,0x39,0x7d,0x01,0xb7,0x71,0x4b,0x7b,0xe1,0x6f,0xd4,0x28,0x1a,0x57,0x96,0x4d,0xe2,0x84,0xf6,0x64,0x10,0xbb,0x0f,0xbc,0xe0,0x19,0xed,0x92,0x9e,0x60,0x15,0x78,0xd1,0x30,0xc0,0x53,0x4b,0x94,0xca,0x4b,0x5a,0x44,0x8b,0xa9,0xda,0x2f,0x08,0x70,0x94,0xe4,0x54,0xe1,0x28,0x6e,0xdd,0x34,0x56 +.byte 0x54,0xb0,0xd4,0x87,0x00,0x72,0x1e,0x46,0x10,0x3a,0x27,0x5d,0xc6,0xb5,0x72,0x20,0x2b,0xbe,0x17,0x01,0xbb,0x04,0x11,0x16,0x7d,0xbf,0x91,0xd3,0x7b,0x44,0x58,0x13,0x2a,0x9c,0xda,0x9d,0x26,0x46,0xf5,0x5f,0x51,0xef,0x6c,0xf6,0x36,0xdb,0xb7,0x21,0xde,0xdb,0x87,0xa0,0xd8,0x60,0x24,0x86,0x6d,0x64,0x85,0x9e,0x94,0xd9,0x21,0x0d +.byte 0xed,0xda,0x33,0xea,0x3c,0xdf,0x74,0xe3,0xa5,0xc7,0xc7,0x9e,0xe5,0xb1,0x29,0xdf,0xfa,0x20,0x25,0xcd,0x13,0x08,0xee,0xe6,0xba,0xf1,0x62,0x39,0xcf,0xe3,0x29,0xb8,0xaa,0x65,0x43,0x8a,0x48,0xb5,0xb5,0x70,0x35,0x66,0x42,0xf4,0x32,0x70,0x0b,0x0c,0xa7,0x46,0x79,0xdf,0xb2,0x80,0x13,0x72,0x7a,0xeb,0xf9,0x52,0xcb,0xb8,0x9f,0x4b +.byte 0x4f,0x29,0x2b,0xb3,0x94,0x02,0x0a,0xe1,0x20,0xe5,0x91,0x15,0x6a,0xa1,0x0c,0x71,0x96,0x77,0x01,0x80,0xf7,0x51,0x0b,0xaf,0x54,0x9b,0x3c,0x7b,0x91,0xd2,0xbd,0xaf,0x13,0xa5,0x32,0x17,0x7c,0xca,0xd0,0x22,0xd5,0xe5,0x83,0x44,0x24,0x5c,0xcc,0x24,0x31,0xcd,0x81,0x4e,0x96,0xcd,0x60,0x9f,0x7a,0xe7,0x2e,0x89,0x16,0xd5,0x66,0x6b +.byte 0xac,0x31,0x11,0x7c,0x76,0xc6,0xde,0xbe,0x46,0x55,0x20,0xdf,0x9d,0x2c,0x33,0xa5,0x80,0x76,0xb1,0xc9,0x1c,0x84,0x17,0x4d,0x15,0xe6,0x6d,0xce,0xed,0xea,0xc7,0xe6,0xff,0x01,0x10,0x60,0x26,0xf7,0x63,0x5f,0x91,0x89,0x7e,0xc1,0x7c,0x76,0x67,0x7b,0x7e,0xfa,0x28,0xa0,0xa7,0x82,0x1b,0x28,0x82,0x6a,0x4f,0x78,0x61,0x48,0xbf,0x13 +.byte 0x0b,0x71,0x0c,0xad,0xee,0xd7,0xf8,0xcc,0x0f,0x77,0x74,0x7d,0x2b,0x8a,0x09,0xd8,0x47,0xa0,0xfc,0x45,0x40,0x24,0xf3,0xce,0xdb,0x81,0xa1,0x50,0x9e,0x0a,0xd0,0x58,0xf7,0xaf,0xf1,0x09,0x12,0xa8,0x24,0xb2,0x34,0x99,0x67,0x17,0x53,0x1f,0x9d,0x09,0x7b,0xcb,0x83,0x6e,0x6a,0x0b,0xbf,0x8f,0x6e,0x3d,0xdb,0x29,0xe5,0xd0,0x06,0xdb +.byte 0xb8,0xf2,0xf3,0x43,0x4e,0xa7,0xf3,0x73,0x93,0xe8,0xab,0x2f,0xc8,0x75,0xce,0x62,0xda,0x74,0x39,0x57,0xe4,0xe4,0xb1,0x41,0x8f,0x9d,0xda,0x43,0xb4,0x2c,0x4b,0xd5,0x1c,0x10,0xf0,0x29,0x6b,0x94,0x15,0x04,0x3c,0xd3,0x45,0x73,0x29,0xb3,0x60,0x87,0x93,0xdb,0xbf,0x60,0x4e,0xdf,0x4d,0xbb,0xde,0xb2,0x57,0x67,0x14,0x0d,0x0b,0x60 +.byte 0x63,0xd5,0xc6,0x81,0x82,0xd6,0x0c,0xe6,0x4c,0x43,0x13,0x02,0x74,0x56,0x20,0x6b,0x21,0x28,0xe6,0xe2,0x0b,0xc1,0x7a,0xc3,0x08,0x60,0x82,0xe0,0x4f,0xbf,0x1e,0x3f,0xf0,0xa9,0xb2,0x2e,0x0c,0xbf,0xd6,0x03,0x1d,0x0d,0xd6,0x1c,0x36,0xb5,0xb2,0x14,0x56,0x21,0xc2,0xe0,0x1e,0xff,0xee,0x8a,0x70,0xae,0x3f,0x1e,0xe5,0xac,0x05,0x46 +.byte 0x6b,0x81,0x32,0xce,0x50,0xbb,0x82,0x66,0x32,0x93,0x46,0xf7,0xee,0x77,0x1c,0x9a,0x2f,0x31,0x60,0xa2,0x09,0x7c,0x14,0xd9,0x81,0xe9,0x19,0x27,0x31,0x5e,0xa0,0x98,0x71,0x42,0x2f,0x30,0x71,0xd6,0x31,0x94,0xe0,0x61,0xed,0x50,0x66,0xfa,0xba,0x12,0x5e,0xc6,0xc8,0x67,0xe5,0x8e,0xfd,0x34,0xa9,0xeb,0xde,0x25,0x43,0xbf,0xe7,0xb5 +.byte 0x16,0xf5,0x62,0x66,0x5d,0x0b,0x13,0x9a,0xd4,0x8c,0x2b,0x8f,0xe6,0x91,0x33,0xcb,0xa0,0x70,0x48,0x3e,0x22,0x7d,0xe4,0xf3,0x75,0xc9,0x49,0x82,0x50,0xc9,0x90,0x04,0x32,0xab,0x99,0x6e,0xf1,0xf0,0x0b,0x60,0x80,0x35,0x25,0x45,0x88,0xe9,0x82,0x06,0xe1,0xbb,0x85,0x11,0x40,0xf8,0x0e,0xbd,0x19,0x7a,0xdd,0x78,0xf9,0xc2,0x46,0xe4 +.byte 0xb5,0x27,0xfb,0xb6,0xba,0xbc,0x7d,0xb8,0x27,0xe7,0xbf,0xfe,0x8e,0xfe,0x7e,0x83,0x63,0x43,0x92,0x26,0xf0,0xbb,0xde,0xb6,0x93,0x4f,0x55,0x0c,0x07,0x99,0x3c,0x98,0xa1,0x8c,0x73,0xc1,0x4c,0x9a,0x09,0xa8,0xea,0x16,0x0b,0x49,0x2a,0x43,0xee,0x90,0x61,0x6f,0x09,0x1b,0xc3,0x2d,0x62,0x4b,0xfc,0x90,0xa1,0x8e,0x84,0x2e,0x90,0x8d +.byte 0x5f,0x80,0xff,0x6a,0x3c,0x61,0x0f,0xf2,0xac,0x70,0x20,0xc1,0xf2,0x85,0xcf,0x94,0xc8,0x94,0xe7,0xa0,0x04,0xdf,0xaf,0xef,0x26,0xd2,0xbc,0x07,0x70,0xc1,0x48,0xd6,0x87,0xd6,0xbe,0xea,0x95,0x6a,0xce,0xa2,0x48,0xac,0x46,0x46,0xb1,0x74,0x70,0x96,0x6c,0x26,0x58,0x75,0x9d,0x84,0xd7,0xd9,0x17,0x9a,0x46,0xe9,0xd7,0x3d,0xde,0xfd +.byte 0x7e,0xf4,0xd8,0x7e,0xf8,0x8f,0x1c,0xb5,0xfb,0xe9,0xc4,0xca,0xba,0x52,0x5f,0x17,0xee,0x75,0x7d,0x1d,0x50,0x16,0x9f,0x16,0x1e,0x00,0x8b,0xc1,0x2f,0xab,0x73,0x65,0x88,0x7b,0x80,0xa6,0x71,0xb7,0xfb,0xb0,0xda,0xd1,0x96,0x18,0x5c,0x48,0x6e,0x18,0x45,0x59,0x45,0xef,0x5c,0x65,0x35,0x99,0x5e,0xb9,0xd4,0x1a,0x07,0x7d,0x1e,0xa6 +.byte 0x69,0x42,0x9d,0xfa,0xec,0x02,0xdc,0xc4,0x19,0x6b,0x9c,0xb1,0x5e,0xa3,0xb4,0x6d,0xb4,0xa6,0x25,0xa8,0xe4,0x3f,0x3d,0x6e,0x2c,0x95,0xf7,0xcd,0xa5,0x4e,0x32,0xca,0x7e,0xe0,0x7b,0x11,0xf9,0x0a,0xe1,0x61,0x41,0x60,0xec,0xb3,0xb1,0x92,0x89,0x33,0x17,0xe9,0xaf,0x70,0x7f,0x1c,0x07,0xb5,0x24,0x3a,0x37,0x84,0x38,0xf5,0xb6,0x11 +.byte 0xfc,0x0c,0x12,0xc1,0xfc,0xa9,0x82,0x67,0x4d,0x17,0xe8,0xea,0xd0,0x62,0x17,0xb2,0x9c,0x59,0x01,0x87,0xfb,0x54,0x8e,0xa7,0xa5,0x85,0xa9,0x8a,0xec,0xfe,0x29,0xc0,0x73,0xc6,0xa0,0xbf,0x66,0x9a,0xc5,0xf8,0xee,0xa4,0xcb,0x09,0x44,0x74,0xfe,0x32,0xf5,0x42,0xea,0xf0,0xa6,0xec,0x74,0xea,0x14,0x5c,0x43,0x51,0xfa,0x3a,0x48,0x1e +.byte 0xa0,0x2e,0x59,0x2e,0xdb,0x3a,0x19,0xfe,0x1f,0x95,0x25,0xee,0x27,0x2b,0x99,0xb4,0xe1,0xd0,0xe6,0x33,0x91,0xa1,0xaf,0x30,0xa0,0x89,0x00,0x3c,0x13,0x31,0x18,0x70,0x90,0x42,0x55,0x0a,0xc9,0xc5,0x0c,0x43,0xa5,0xee,0xd6,0x90,0x07,0xae,0xc4,0x8c,0xdc,0xe4,0x07,0xbb,0x61,0x70,0xd1,0x10,0xe4,0x68,0x96,0x70,0x78,0xab,0xe9,0x3a +.byte 0x6e,0xc7,0x75,0x93,0xa0,0xba,0xff,0x6a,0x2d,0x57,0xaa,0x93,0x09,0xc3,0x6b,0x81,0xf3,0xde,0xc2,0xee,0xac,0x86,0x0a,0xfb,0xad,0xdb,0x6f,0x2a,0xa0,0x15,0x7b,0x96,0x77,0x38,0xf8,0x86,0x51,0x33,0x7a,0x6f,0x1c,0xf8,0xd5,0x15,0xcd,0x76,0x7f,0x37,0x68,0x82,0xdf,0xab,0xc3,0xdb,0xbe,0xeb,0x2b,0xa8,0x34,0x72,0x20,0x34,0xfb,0x12 +.byte 0x64,0x17,0x05,0x64,0xc0,0xa1,0xca,0xd3,0xac,0x27,0xc2,0x68,0x28,0x40,0x42,0xe2,0x0a,0xdd,0xd7,0xd6,0xf6,0x92,0x95,0x3c,0x10,0x17,0x4e,0xef,0x75,0xae,0x98,0x2d,0x10,0xc8,0xa8,0xac,0x15,0xf7,0x5b,0x81,0xc1,0xdf,0x5e,0xbe,0x88,0x49,0xe3,0xd1,0x88,0x1c,0xcb,0xce,0x20,0x01,0x12,0x60,0x57,0x0b,0xf6,0x32,0x57,0xaf,0x59,0xef +.byte 0xc9,0xe7,0xbf,0x62,0xf3,0xb6,0xe6,0x5c,0xee,0x36,0x7e,0x11,0x90,0xd1,0xeb,0xfa,0x62,0x0b,0xc6,0xf3,0x1a,0xd5,0x8b,0x95,0xec,0xb4,0x38,0xfe,0x45,0xb0,0xb5,0xff,0x84,0x0a,0x27,0x3a,0xa2,0x5a,0x2a,0xc9,0xa4,0xc0,0x11,0xc6,0x61,0x13,0xb7,0x53,0xa3,0x47,0x45,0x6d,0xc6,0xa9,0x00,0xd1,0x40,0xf4,0x77,0xac,0xb3,0xd3,0x26,0x99 +.byte 0xf1,0x36,0x59,0x28,0xb4,0xd0,0xdd,0x0e,0xed,0x53,0x33,0x45,0x71,0x9c,0x5c,0x11,0x27,0x2c,0x2f,0x10,0x9e,0x5b,0x8a,0x5b,0xc5,0x1f,0x36,0xc9,0x2a,0xba,0xc7,0xa5,0x31,0xd7,0x9f,0x2b,0x0a,0x09,0xcb,0x7c,0x4f,0xa2,0xdc,0xc5,0x64,0x0d,0xe6,0xfe,0xb0,0x9d,0x3b,0xf0,0xa7,0x19,0x8c,0x84,0x21,0x6b,0x9e,0x1c,0xb5,0x7b,0x66,0x77 +.byte 0xd0,0x85,0xb4,0x22,0x93,0x6e,0x84,0x29,0x9b,0x60,0x90,0x37,0x9d,0x8c,0x94,0x95,0x95,0x3b,0xf1,0x2d,0x56,0x5b,0x53,0x60,0x2d,0xe5,0x7f,0x80,0x71,0x56,0xa7,0x6e,0x66,0x76,0x1f,0xaa,0x0d,0xba,0xfb,0x0e,0xcf,0x20,0x68,0x74,0x2b,0x99,0x13,0xe1,0xa8,0x33,0xc9,0xf6,0xbc,0xd3,0xf4,0x46,0x01,0x02,0x85,0x27,0xf4,0x20,0x97,0xa3 +.byte 0xba,0xbc,0x47,0x30,0x48,0xed,0x60,0xe6,0xca,0xbf,0x76,0x8c,0x2c,0x6a,0x43,0x32,0xfd,0x90,0x04,0x95,0xc2,0x42,0xcb,0xca,0xc4,0x33,0xe1,0xd3,0x23,0x92,0xa1,0xde,0x09,0x38,0xce,0x00,0x93,0xb3,0xed,0x82,0x8e,0xfb,0xce,0x4c,0x9a,0x10,0x6e,0xce,0x4a,0x37,0x05,0x75,0x37,0x58,0xc3,0x8e,0x57,0x50,0xa0,0x7d,0x80,0x2d,0x51,0xea +.byte 0x08,0xcd,0x1b,0xd2,0x81,0x85,0x19,0xc1,0xe8,0xce,0x31,0x18,0xcf,0x54,0x37,0x96,0x77,0x3d,0x64,0xfb,0xc2,0xa9,0xdb,0xb8,0x37,0x03,0x83,0x34,0x3c,0x25,0x6a,0x22,0x33,0xfa,0x27,0x70,0xc7,0x0a,0x27,0x12,0x1e,0xb3,0xd0,0x59,0x6f,0xa3,0xc5,0x73,0x95,0x4c,0x1f,0xf1,0x3c,0xb3,0xc2,0xa2,0xc6,0x45,0x17,0x53,0xa8,0xfc,0x00,0xff +.byte 0x77,0x40,0x28,0xd2,0x53,0x90,0x92,0xe9,0x86,0x6c,0xa5,0x40,0xce,0xbc,0x79,0x6f,0x8f,0x12,0xef,0x1b,0x38,0x1f,0xb3,0x24,0xf0,0x75,0x17,0x20,0x9e,0x03,0x9c,0x2b,0x51,0x57,0x93,0x44,0xce,0x74,0xc9,0x12,0xe7,0xcb,0x2f,0x5e,0x1b,0x95,0xf2,0x4d,0x2e,0x51,0x8d,0x52,0xd5,0x21,0xe3,0x1b,0x33,0xe7,0xf2,0x18,0x61,0xa2,0x53,0xdb +.byte 0x73,0xaa,0x6a,0x6c,0xf9,0xf4,0xef,0x3d,0x40,0xa3,0x00,0x80,0x82,0xed,0xe6,0x66,0xd1,0xd6,0xe9,0x93,0xd8,0x92,0xfa,0xdf,0xf9,0x9c,0x7a,0xfb,0x2b,0xc7,0xa7,0x73,0x67,0x2b,0xed,0x76,0xb1,0x52,0xaa,0xcf,0x34,0x84,0xa1,0x6d,0x56,0x85,0xef,0xcb,0xbc,0xa3,0xc6,0xf3,0x5a,0x88,0x04,0xd5,0xd8,0xf1,0x7b,0xf8,0x11,0x6f,0xa0,0x44 +.byte 0xa5,0x0f,0x76,0xed,0xd7,0x98,0xe3,0xda,0xb8,0x1b,0xc7,0xe6,0x89,0x08,0x19,0x1f,0xf8,0xe3,0x32,0x32,0xa5,0x3c,0x71,0x9f,0x11,0xde,0x50,0x29,0xb0,0x54,0x7e,0x3b,0x5e,0xeb,0xf7,0xab,0xa8,0xa0,0x35,0x96,0xc7,0xc5,0xea,0x60,0xc0,0x37,0xca,0x61,0x55,0x96,0xac,0xb4,0xd0,0x29,0x9a,0x1a,0x3f,0x9e,0xf5,0xf5,0x3d,0xed,0xc5,0x7c +.byte 0x2c,0x9d,0x67,0xf8,0x4d,0x82,0x6e,0x2a,0x9a,0xfc,0x5f,0xdc,0x02,0xb0,0x3d,0xa5,0x1c,0x08,0x5d,0x4a,0xaa,0xd0,0x38,0xfb,0xbc,0xbb,0x7f,0x37,0xfb,0xec,0xc0,0x62,0x79,0xaa,0xde,0xfd,0x23,0x9c,0x4c,0x4a,0xe1,0x48,0x40,0x36,0xc0,0x0a,0x6f,0x43,0xb7,0xad,0x4c,0xf6,0x56,0xb5,0x44,0xf4,0x72,0xcd,0x13,0x10,0xea,0x0d,0x24,0xc1 +.byte 0xa9,0x36,0x3b,0x36,0xf2,0x6e,0xf9,0x0a,0x67,0xcd,0x02,0x67,0xb3,0x5c,0x63,0x3a,0x7c,0xc1,0x3b,0xf2,0x1d,0x3d,0xf1,0xff,0xbf,0xf7,0x97,0x9f,0x30,0x1f,0xaa,0xd8,0xdb,0x53,0x9b,0x0a,0xbd,0x38,0xd8,0xb6,0xf1,0x4a,0x78,0x1a,0xc2,0x46,0xd2,0x0c,0xa8,0xcd,0x7b,0x39,0xc7,0x42,0x55,0xc8,0x3e,0x02,0x1d,0xf4,0xad,0x55,0x01,0x6a +.byte 0x11,0x2d,0xfa,0x67,0x48,0xae,0x45,0x31,0x9b,0x09,0x7d,0xd9,0xdd,0xaf,0x5c,0xd5,0x40,0x51,0x2a,0xa1,0x0f,0xb3,0x6e,0xc2,0x94,0xfe,0xde,0x70,0xaf,0x6c,0xea,0x5f,0x7d,0x3c,0x72,0x85,0x86,0x24,0x20,0x0a,0x7a,0xe7,0x69,0x32,0x66,0x7d,0x34,0x13,0x60,0x62,0xc7,0x68,0x32,0xde,0x34,0x30,0x36,0xc8,0x8e,0xb7,0x13,0x66,0xf1,0xce +.byte 0x5f,0x7a,0x3a,0xfe,0x62,0xd6,0x72,0xb6,0x1b,0x80,0x43,0x8a,0x3e,0x13,0x15,0xe4,0x1c,0x7b,0x08,0x70,0x0b,0x6e,0xb3,0xfe,0x07,0x91,0x23,0x21,0x57,0x48,0xc6,0xa9,0xa3,0xa8,0xc7,0x19,0x89,0x8a,0x49,0x12,0x25,0x88,0xd2,0x11,0xa5,0xa8,0x9e,0x0e,0xa7,0x71,0xfe,0xaf,0x88,0xee,0xa7,0x1c,0x3b,0x27,0x27,0x7e,0x79,0x92,0xed,0x77 +.byte 0x74,0x65,0xbd,0x46,0x41,0x25,0xd9,0x8b,0x21,0x73,0x9f,0xaa,0x35,0xa0,0x22,0xb3,0xc8,0x71,0x28,0x72,0xd2,0xcb,0xf4,0x2a,0x06,0x0a,0x63,0x96,0x55,0x2e,0x83,0x0b,0xe8,0x07,0x99,0x9d,0x59,0xde,0xde,0x62,0xbd,0xb4,0x3e,0x70,0x15,0xed,0x95,0xa8,0x2f,0xb7,0xa2,0xb6,0x65,0x56,0x9d,0xe5,0x81,0xa0,0x05,0x5b,0xce,0x00,0xd4,0xb9 +.byte 0x28,0x5a,0xc1,0x9a,0x74,0xc6,0xd7,0x27,0xdd,0x7c,0xbe,0xe8,0x0d,0x47,0xfc,0x81,0x05,0x6b,0x4f,0x68,0xc7,0xcc,0x5d,0xd5,0x66,0x83,0x34,0x72,0x35,0xab,0x39,0x64,0x19,0x67,0xbd,0xff,0x15,0x44,0x20,0x18,0x2a,0xaf,0xbc,0x58,0x94,0xdb,0x18,0x50,0x55,0x11,0x6a,0xc4,0x1d,0xee,0xe2,0xe0,0x75,0x73,0xf1,0xa1,0x83,0xf4,0xcb,0x40 +.byte 0x96,0xf4,0x77,0x45,0x61,0x8b,0x1a,0x8c,0x0c,0xfc,0xd2,0x7e,0x0b,0x1e,0x18,0xd2,0x95,0xa5,0x4c,0x5b,0xd6,0x9d,0x40,0x8b,0xc0,0x51,0xe8,0x2d,0xe5,0x16,0xbf,0xd7,0x98,0x8a,0xa0,0x46,0x1f,0xc4,0xe9,0x12,0x31,0x40,0xc5,0x2d,0x59,0xf8,0x9b,0x5f,0xe3,0x3a,0x10,0xdf,0xda,0x72,0x9e,0xab,0x13,0x7b,0x8f,0xc8,0x52,0x9f,0x58,0x45 +.byte 0x7a,0xe6,0x3a,0xbb,0xdd,0x1d,0xc7,0x3b,0xc4,0x26,0xdc,0x99,0x29,0xf2,0x74,0x16,0x84,0xe9,0x8a,0x86,0xc0,0x1e,0x49,0x96,0x2f,0x5c,0x2a,0x49,0x71,0x88,0xe6,0x82,0xb2,0x18,0x88,0xc1,0x86,0xcb,0x26,0x3c,0xa5,0x50,0x31,0x22,0x9a,0x8f,0x45,0x2b,0xde,0xf0,0x86,0x8e,0x13,0x86,0xc4,0x4a,0x9b,0x35,0x27,0x93,0x0b,0x13,0xc8,0xef +.byte 0x96,0x74,0x97,0x85,0x09,0xc0,0xa0,0x32,0xfe,0xc3,0xe3,0x92,0x2e,0xe8,0x54,0xbd,0xc2,0x23,0xeb,0x4b,0x02,0xf5,0x5a,0x0b,0x0d,0x58,0x50,0x45,0xe7,0x01,0xd4,0x17,0x00,0xdb,0x0d,0xd4,0x2e,0xa0,0xde,0x38,0xf4,0xb1,0x1e,0xd0,0xf0,0xa3,0x6b,0x21,0x0c,0xbd,0xae,0x84,0x7e,0x42,0x36,0x4f,0x2e,0x46,0xae,0x23,0x91,0xb9,0x06,0xac +.byte 0x86,0x7f,0x29,0xca,0xfb,0xe9,0xde,0xdb,0x90,0xfe,0x6f,0xbc,0xdb,0x3c,0x48,0x3d,0x6e,0x06,0x68,0x49,0xbb,0x43,0x8d,0x9d,0xc4,0x5f,0x45,0xcb,0x77,0x28,0xe0,0x35,0xd1,0xb4,0x25,0xb2,0x45,0x6d,0xb4,0x89,0x53,0x26,0x33,0x98,0x83,0x45,0x9d,0xf5,0xad,0xf9,0xa7,0x59,0xb6,0x6e,0xa8,0x25,0xa5,0xef,0xee,0xf6,0x6a,0xd5,0x6c,0x60 +.byte 0x9a,0xea,0x78,0x9e,0xe4,0xa2,0x29,0x0b,0x70,0xb3,0x6e,0x3a,0xfd,0x07,0xc7,0x7f,0x1b,0x07,0xc7,0xca,0x1b,0xb8,0x08,0xe1,0xc9,0x94,0xb2,0x62,0x7c,0x04,0x96,0xa6,0xda,0x65,0x28,0xfd,0xf9,0x70,0x22,0xb7,0x21,0xd3,0xa6,0x38,0x0f,0x1e,0x88,0x7e,0x73,0xec,0x04,0x99,0x8b,0x23,0x91,0x13,0xe6,0x4f,0x74,0x81,0xcc,0x1f,0xdd,0xaf +.byte 0x58,0xc4,0x80,0x00,0x4d,0x1d,0xbe,0x84,0x7d,0xfe,0x85,0xe7,0x77,0x20,0x3c,0x65,0x4e,0x0e,0x2e,0x5d,0xc1,0xd9,0xcb,0xf7,0xbb,0xc8,0x8d,0xbf,0x16,0xa8,0x1e,0x63,0xf5,0x10,0x5e,0xa5,0x9c,0x63,0xb6,0x9a,0xeb,0x98,0xa8,0xb1,0x59,0x82,0x66,0x51,0xae,0x3c,0xfc,0xa8,0x11,0x92,0xf4,0x45,0x88,0x7c,0x03,0x6f,0xe6,0x87,0xe4,0xa8 +.byte 0x79,0xbf,0xb3,0x0d,0xd6,0x0b,0x8d,0xa3,0x16,0x2a,0xfb,0x79,0xb9,0xe7,0xdb,0xa7,0xdb,0x94,0xd3,0xe6,0x3a,0xdd,0xe9,0x5f,0x30,0x7d,0x68,0x90,0x35,0xfd,0x18,0x91,0x8e,0xc5,0x12,0xd6,0xf9,0x98,0xa0,0x5b,0xcd,0x81,0x76,0x84,0x08,0xd0,0xab,0x59,0x2d,0x3b,0x8a,0xf9,0xd9,0x95,0xde,0x8b,0xbb,0x92,0xef,0x35,0xc3,0x3e,0x46,0x73 +.byte 0xf3,0x3b,0x09,0xbf,0x22,0x2b,0x9c,0x0f,0x70,0x9a,0x16,0x0e,0x4b,0xa7,0x1a,0x96,0x98,0xb7,0x5a,0x40,0x06,0x81,0xf4,0xac,0xa6,0xe6,0xab,0xf2,0xda,0x87,0x18,0x61,0xcb,0xc1,0x67,0xbd,0x2f,0x6f,0x06,0x21,0xaf,0x73,0x98,0xe1,0x3f,0x7a,0x17,0x7f,0x44,0xcb,0x1d,0xdd,0x60,0xb3,0x2c,0x58,0x20,0x8a,0x04,0x74,0x56,0x9b,0x26,0x51 +.byte 0x61,0xb0,0x07,0x50,0x53,0x83,0x31,0x42,0x59,0xb3,0x33,0xfa,0xfe,0xbc,0xad,0x7f,0x99,0x9b,0x86,0xf1,0xaa,0x85,0xf1,0xbb,0xc0,0x0c,0x91,0x8d,0x1a,0x0f,0x8f,0x9f,0xfe,0x62,0x2b,0x35,0xae,0xcc,0x8c,0x09,0xe3,0x29,0x96,0xd1,0xbe,0x7f,0x25,0xd6,0x03,0xf0,0x4c,0x53,0xad,0x5b,0x56,0x66,0x68,0x9a,0xa3,0xc4,0x07,0x71,0xde,0x49 +.byte 0x82,0xbb,0xf7,0x9a,0x2b,0x96,0xcf,0x50,0xf6,0x00,0xf7,0x0b,0x27,0xdd,0xf5,0xf6,0xc5,0xc8,0xbd,0x2a,0xa2,0x06,0x2c,0x42,0x3f,0xa0,0xf8,0xcc,0x1d,0x64,0xcf,0xbc,0xb4,0xc4,0x63,0xde,0x6b,0xd3,0xb4,0x61,0xdf,0xbd,0x73,0x50,0x34,0xc3,0x20,0x45,0x06,0x73,0x9b,0xf0,0xfb,0xa6,0x2b,0xec,0x92,0x32,0xa9,0x1f,0x4f,0x1e,0x38,0x78 +.byte 0x2a,0xd2,0x7c,0x1d,0x89,0xf9,0x70,0xbc,0xef,0x09,0x77,0xd3,0x6a,0x56,0xa1,0x8b,0x4b,0x23,0x1b,0xb1,0x2f,0xec,0x84,0xe5,0x59,0xc5,0x20,0x23,0xbc,0x3f,0x0a,0x43,0x97,0x1c,0x5e,0xf7,0xee,0xfe,0x0b,0x2a,0x42,0x08,0x2a,0x39,0x91,0xce,0x8a,0x33,0x9f,0x63,0x77,0x6d,0xf6,0xf3,0x0e,0x1d,0xb3,0xfb,0xcf,0x2f,0x7f,0x95,0xc2,0x71 +.byte 0x1c,0xa0,0x0b,0xc6,0xb8,0xde,0x4d,0xd8,0xcc,0x4c,0x4f,0xaf,0x07,0x87,0x6d,0x3b,0xab,0x95,0xab,0xa1,0x6a,0x50,0x9f,0x7c,0x35,0xb6,0x65,0xdd,0xe3,0x06,0xe5,0xb3,0x42,0x5f,0x4d,0xe5,0x3e,0xfa,0x6c,0xdf,0x19,0x58,0xd1,0xf6,0xc6,0x94,0x1c,0xce,0x30,0x90,0xd3,0xeb,0xa3,0x7c,0xe5,0x3f,0x57,0x99,0x2e,0x22,0x0a,0x94,0x2f,0xfe +.byte 0x39,0x16,0xe6,0xfa,0xd0,0xb5,0xf9,0xb4,0x88,0x61,0xa4,0xa8,0xc3,0xb8,0xb7,0x52,0xaf,0x90,0xc1,0xe0,0x19,0x78,0x04,0x2b,0x71,0x04,0x03,0x2f,0x63,0xbe,0x40,0xf5,0x82,0x3b,0x1b,0x6b,0xde,0x6d,0x1e,0x86,0x87,0x82,0xc3,0x31,0x97,0x20,0xdd,0xdd,0xce,0x61,0x64,0x99,0xf6,0xbe,0xbf,0xec,0x37,0x54,0x8b,0x92,0x29,0xda,0xc5,0x7b +.byte 0x4d,0xc5,0xaf,0xb8,0x4e,0x4b,0x4a,0x2b,0x35,0x30,0xf5,0x19,0x9e,0x32,0xd8,0x2e,0xc1,0x19,0xfe,0xd1,0x61,0xb0,0xaa,0x05,0x58,0x15,0xd9,0x0e,0x4e,0xca,0x4e,0x10,0x83,0xe6,0xe6,0x57,0xe8,0x8d,0x13,0xb4,0x6f,0x85,0x59,0xf2,0x83,0xc8,0x37,0xaa,0xa2,0xe5,0xc8,0x77,0x06,0x82,0x21,0x5d,0x84,0x58,0x67,0x9b,0xcc,0x9c,0xfc,0x1b +.byte 0x28,0x2f,0xac,0xc8,0x96,0x91,0x26,0x46,0x42,0x2b,0x68,0x57,0xb0,0x79,0x1e,0xb1,0x9b,0x92,0x2c,0xeb,0x67,0x00,0xd4,0x26,0x7d,0xca,0x45,0x97,0x55,0xea,0x2a,0x20,0x70,0x7c,0x20,0x14,0x38,0x40,0x3d,0x4f,0xf5,0x3a,0x1f,0x0a,0xe3,0x9a,0x48,0xcc,0xb2,0x7d,0xee,0x5b,0x48,0x90,0x0d,0x12,0x77,0xd8,0xd3,0xb6,0xd7,0x66,0x9e,0x48 +.byte 0xbb,0x92,0xc1,0x7c,0x4e,0x90,0x4d,0xd5,0x96,0x99,0xea,0x86,0x2d,0xb9,0x5a,0x50,0x05,0xc2,0x6b,0xa7,0x0c,0x43,0x44,0x22,0x09,0xb9,0xc0,0x56,0x47,0x5f,0xdf,0xaf,0x6b,0x91,0xe2,0xd7,0x45,0x77,0x17,0x7a,0x71,0x6d,0x27,0x93,0xe2,0xc6,0x10,0x2f,0xc8,0x3b,0x75,0x78,0x11,0xae,0x07,0xe6,0xba,0x64,0xd4,0x06,0xfa,0xf9,0x1d,0x74 +.byte 0x9e,0x4f,0x6d,0x02,0xfc,0x40,0x80,0x9a,0x2e,0xd4,0x15,0x32,0x15,0xe8,0x97,0x0a,0xd4,0x65,0x6a,0x87,0xd3,0x66,0x4b,0xb8,0x66,0x84,0x8e,0xb9,0x4b,0xa7,0xcf,0x58,0x13,0x66,0x3a,0x4e,0xa5,0x76,0x17,0x13,0x92,0x79,0x42,0x67,0x6d,0xb6,0x65,0xec,0xc8,0xb5,0x5f,0x17,0x2a,0x2d,0x4b,0x19,0xe9,0x00,0x6e,0x38,0xaf,0xe9,0x06,0xb6 +.byte 0xe8,0x99,0x69,0x8a,0x74,0xe7,0x7e,0x70,0x69,0x4b,0xbc,0xce,0x5d,0x61,0x94,0x1b,0x47,0x41,0x38,0x5f,0x2e,0xcf,0x2b,0xe1,0xcd,0xa3,0x98,0x71,0xf7,0x09,0x65,0xfe,0x5f,0x62,0x4b,0x9e,0x91,0x88,0x35,0xa2,0x66,0x02,0x1d,0xc9,0x93,0x0c,0x19,0x50,0x4b,0x95,0x71,0x79,0xdd,0x74,0xe1,0xda,0x5a,0xb7,0x38,0x70,0x61,0x18,0x3f,0x68 +.byte 0x08,0x34,0xd8,0xfe,0xbb,0xd1,0xbf,0x57,0xed,0xc2,0x52,0x6d,0x54,0x3e,0xcb,0x0c,0x32,0xc7,0x09,0xa9,0x31,0x10,0xe8,0xbd,0x70,0xe3,0x0e,0xe9,0x4f,0x7a,0xd6,0x42,0x45,0x2e,0x1b,0x3c,0x0d,0x15,0x6d,0xb4,0xad,0xe9,0xc5,0xa2,0x12,0x77,0x34,0x43,0x20,0x95,0xc1,0xb7,0x51,0x72,0xed,0x78,0xa0,0xae,0x3c,0xae,0xb4,0xd4,0xda,0x58 +.byte 0x83,0x62,0xa9,0xc6,0x01,0x3d,0x14,0x19,0x07,0x00,0x3c,0x82,0x16,0x7e,0x8a,0x91,0x78,0xa1,0x65,0x0b,0x5b,0x3a,0x40,0x72,0xe5,0xf0,0xd4,0x82,0x04,0xe4,0x01,0xf1,0x84,0x87,0x96,0x26,0x91,0x66,0x77,0xf7,0x59,0xd6,0xc2,0xca,0x29,0x3b,0x68,0x2a,0x27,0x99,0x64,0x86,0xc2,0x96,0xbf,0x11,0x3c,0xa8,0x0c,0xf7,0x86,0xb8,0xc1,0x40 +.byte 0x15,0x1a,0x84,0xe3,0x93,0x23,0x73,0xa9,0x8b,0xbd,0xb4,0x8a,0xe4,0xf1,0xa5,0x8f,0x56,0xa3,0xdc,0x77,0xbd,0x7d,0x15,0x74,0x2b,0x18,0x92,0x56,0x45,0xbc,0xaf,0xf2,0x55,0xce,0x9d,0xc2,0xab,0x39,0x90,0xec,0x78,0x3f,0xa5,0x14,0xeb,0x40,0x2f,0x01,0xca,0xeb,0xad,0x73,0x85,0xbc,0xe1,0x91,0xaa,0x77,0xa9,0x6c,0x02,0x66,0x6a,0x65 +.byte 0x63,0x6c,0x50,0x62,0x83,0x83,0xef,0x16,0x4f,0x21,0xfd,0x28,0x8e,0x52,0x66,0x5b,0x6f,0x8f,0xbe,0x8d,0x17,0xb9,0xd5,0x99,0xf7,0x39,0xd1,0xbc,0xa2,0x43,0xd7,0x0a,0x80,0xea,0x42,0xf8,0x38,0x53,0x95,0x07,0x6f,0xb7,0x7c,0xc1,0x16,0x88,0xc8,0xb7,0x59,0xde,0x76,0x51,0x2f,0x92,0xd0,0x40,0xfd,0xd9,0x2d,0xca,0x9e,0x8d,0x28,0xae +.byte 0x48,0xc1,0x0a,0xe0,0x76,0x9c,0x02,0x0b,0xc5,0xd1,0xf9,0x83,0x90,0x86,0xa4,0xeb,0x5c,0x64,0x65,0xf8,0x98,0x38,0xc5,0xce,0xef,0x6f,0xc3,0x88,0xb6,0x2f,0x8a,0x40,0x55,0x52,0x47,0x06,0x75,0x16,0x46,0x9c,0xff,0x3c,0x68,0x97,0xc3,0xfb,0x10,0x11,0x7b,0xba,0x04,0xcc,0xad,0xba,0xcf,0xf0,0xae,0xba,0xe6,0x59,0x9c,0xf5,0x27,0xeb +.byte 0xdd,0x5c,0x86,0x25,0xa1,0xb6,0xb8,0x1c,0x94,0x98,0xa5,0x79,0x82,0x4e,0xdf,0x09,0x3f,0x2f,0x8a,0x4e,0x1b,0x5a,0xab,0xd4,0xe6,0x21,0xb3,0x02,0x19,0x39,0xa9,0x2e,0x0e,0xae,0x86,0x30,0xc7,0xa0,0x00,0xed,0x72,0xdc,0x71,0x77,0x42,0x76,0x54,0x68,0xb2,0x8d,0x5d,0xc3,0x5c,0x86,0xf8,0xb1,0x6c,0x67,0xdf,0x24,0x40,0x6a,0x2b,0x1d +.byte 0xbc,0x0d,0x25,0x7d,0x9e,0x1c,0xbd,0x18,0x85,0xda,0x7a,0x86,0x5e,0xed,0x10,0x80,0x83,0xa6,0xef,0x1e,0x93,0xac,0xce,0xe6,0x32,0x35,0xdf,0xb8,0xc7,0x9b,0xf0,0x0f,0x9d,0x37,0xbd,0xd9,0x58,0x33,0x19,0xa1,0x23,0x51,0x5f,0xa7,0x5a,0x99,0x7e,0x2a,0xfd,0x85,0x3c,0x26,0xad,0xcc,0x7e,0x07,0x32,0x7b,0x24,0x5a,0x6b,0x4b,0x71,0x4e +.byte 0xca,0x8b,0xc4,0x03,0x26,0x76,0x02,0x68,0x0d,0xa1,0x09,0xe0,0x2e,0xa4,0x82,0x88,0x05,0x5a,0xc4,0xcb,0x31,0x9d,0x56,0xda,0x0d,0x00,0x04,0xbc,0x07,0xca,0x1f,0xdf,0x9e,0x44,0xed,0x36,0xbd,0xa0,0x22,0xff,0x78,0xd1,0xcb,0x62,0xe0,0x0d,0x2e,0xdc,0x2e,0x36,0x28,0x8e,0xd3,0xa9,0xe0,0x38,0xd4,0xc5,0x2b,0xee,0xaf,0xa4,0x08,0x7d +.byte 0xed,0x2c,0x8a,0xf5,0x86,0x5e,0xed,0x2a,0x0d,0xbf,0xe6,0xfb,0x6f,0xc4,0x02,0x75,0x36,0xe5,0x7b,0xe9,0x4a,0xb3,0xf1,0xf4,0x86,0x6c,0x9a,0x6e,0xaa,0x7a,0xbe,0x4b,0xd6,0xf2,0x6b,0xcb,0x78,0x6f,0xf9,0x42,0x1a,0x19,0x7b,0x7e,0xba,0x59,0x02,0x8b,0xe3,0x5c,0x44,0xa4,0x84,0xa8,0x4a,0x67,0x93,0xee,0xc4,0x17,0x07,0x26,0xfe,0x86 +.byte 0xf1,0xc6,0xba,0xbf,0xc4,0x3d,0x33,0x41,0x4d,0xc4,0xf0,0xa8,0x6d,0xe1,0x06,0x16,0x2d,0xc9,0x5d,0x2a,0xf5,0x4a,0xc6,0xd2,0x8c,0x98,0x55,0xe8,0x8d,0xd0,0x31,0x5f,0xc7,0x05,0xd1,0xca,0xd2,0x72,0xe6,0xd0,0xcb,0x62,0x79,0xac,0x60,0x59,0x94,0x59,0x48,0x9e,0x91,0x17,0xa7,0xa0,0xac,0x4a,0xe5,0x08,0xe5,0x52,0xa4,0xd4,0x83,0x8c +.byte 0x83,0x57,0xe7,0xe5,0xfc,0x9b,0x43,0x78,0xc8,0x7e,0x94,0xc4,0x35,0x3e,0xac,0x4a,0x8d,0x60,0x80,0xdc,0x72,0xe3,0x15,0x09,0x2a,0xbd,0xcc,0x9a,0xe4,0x1a,0x18,0xa8,0xf1,0x29,0x9b,0xca,0x58,0x0b,0x6d,0x7b,0x33,0x91,0x05,0x27,0x6a,0x48,0xbe,0xac,0x08,0xa5,0x2a,0x64,0xf5,0xae,0x2a,0x90,0xf1,0x2d,0x3f,0xa8,0xff,0x17,0x92,0xc4 +.byte 0xec,0x3a,0x09,0xbf,0xae,0xd3,0xe2,0x1c,0x3c,0xc8,0x6f,0x91,0x72,0x99,0xe3,0x82,0x30,0x4f,0x40,0x5c,0x0c,0x8d,0xfd,0xbe,0x10,0xbc,0xce,0x1e,0x0a,0x09,0xbf,0xde,0xdc,0x72,0x7e,0x4c,0xbc,0xec,0x34,0xe2,0x96,0x8a,0xc6,0xee,0x19,0x6c,0xa8,0xf1,0xa5,0xb2,0x71,0x88,0x13,0xe8,0x11,0xda,0x3b,0x77,0x10,0x9c,0x9f,0x74,0x49,0x21 +.byte 0x16,0xcf,0x6f,0x05,0xc5,0xc1,0x4d,0xfe,0xe7,0x4d,0x67,0xe8,0x12,0x14,0xf7,0xaf,0x66,0x8d,0x55,0x34,0x00,0x18,0x10,0x6e,0x6a,0xd2,0x4c,0xd9,0xd3,0x15,0x40,0xbf,0xce,0x7b,0x10,0x69,0xbd,0x15,0x0e,0x60,0x2b,0x76,0x50,0x80,0x92,0x02,0x3c,0x0f,0xea,0x47,0x03,0xd9,0xf6,0x2c,0x00,0xde,0x29,0xb9,0x2e,0xf6,0x80,0x10,0x81,0x28 +.byte 0x6f,0x41,0xfc,0x88,0x65,0xe9,0xb5,0xd4,0x78,0x53,0xff,0x04,0xc4,0xdd,0xd7,0x35,0x34,0x59,0x85,0x33,0x01,0x33,0x67,0xe1,0x4e,0xc2,0xac,0xe6,0x24,0x24,0xb6,0x83,0x48,0x08,0x0c,0x73,0xe5,0x9c,0x98,0xe4,0x4c,0x3c,0x1f,0x6e,0x77,0xea,0x8c,0x76,0x23,0xbb,0x41,0x5e,0xc1,0x8a,0xba,0x3e,0xe5,0x3e,0x86,0x89,0xab,0x32,0x65,0x1b +.byte 0x00,0x92,0x56,0xe0,0x62,0xc1,0x8f,0xeb,0x15,0x7f,0x86,0xdf,0xa2,0xc2,0x8d,0xf5,0xb5,0x88,0x72,0x8c,0xba,0x92,0x30,0x53,0x58,0x3e,0x0b,0xe6,0x4f,0xd4,0xef,0x34,0xab,0xbb,0x61,0xe0,0x31,0x3c,0xe7,0xb2,0x5f,0x64,0xcb,0x52,0xc7,0x1d,0x95,0x96,0xd2,0x8c,0x87,0x34,0x92,0xf2,0xad,0xd9,0x78,0x1d,0xa1,0x67,0x58,0xfa,0xfb,0x06 +.byte 0xc8,0x7f,0x9e,0xf7,0x02,0x12,0xd9,0x8c,0x68,0xbc,0x2b,0xd3,0xe1,0x0e,0x1e,0xbd,0x33,0x7a,0xfd,0x03,0x41,0xb9,0x72,0x2e,0x63,0xfe,0xb1,0x39,0xc3,0x0f,0xa0,0xa9,0x76,0x4f,0x7b,0xab,0xae,0xda,0x22,0xec,0x83,0x32,0xb0,0xec,0xd1,0xfd,0xc2,0x28,0x1e,0x42,0x29,0x31,0xd5,0xb3,0x33,0xcd,0x13,0x1d,0x9f,0xac,0x73,0x27,0xf7,0xea +.byte 0xc6,0x66,0xd2,0x32,0x91,0x60,0x35,0xf4,0x28,0x34,0x43,0x6a,0x74,0x8c,0x05,0x2a,0x84,0x34,0xfd,0x84,0xa5,0xcb,0x1d,0x2b,0x41,0x28,0xa6,0x19,0xed,0xcd,0xad,0xea,0x6e,0xf7,0x14,0x18,0xac,0x56,0x9a,0xf5,0xaa,0x7d,0x4e,0x8a,0x99,0xd1,0xda,0x41,0xaf,0xe8,0xfc,0xef,0x66,0x88,0xd0,0xed,0xfd,0xae,0x2a,0x85,0xc0,0x60,0xa2,0x30 +.byte 0x5d,0x1b,0x48,0xf6,0x3e,0xcf,0x56,0xdf,0x53,0xdc,0x2d,0xf5,0xfd,0x7f,0x2a,0x2a,0x4d,0x4f,0x11,0xcc,0xea,0x72,0xdb,0xb9,0xeb,0x92,0x0e,0x9f,0xc1,0x26,0xe9,0xbf,0x25,0x6a,0x27,0xe1,0x63,0x9b,0xdd,0x62,0x38,0xad,0xd3,0xb2,0x75,0x62,0x45,0xbf,0xbf,0xf4,0xe2,0xd6,0x97,0xe9,0xeb,0xeb,0x98,0xab,0x73,0xdc,0x8a,0xde,0xaa,0x3b +.byte 0x69,0xfd,0x61,0x6f,0xbb,0xfc,0x28,0xc0,0xff,0x37,0x2e,0xeb,0x31,0x59,0x57,0xfb,0xd3,0x0e,0xed,0x01,0x66,0x50,0x63,0x53,0xa2,0xd1,0x24,0x8c,0xc8,0x8d,0x80,0x03,0x2a,0x1e,0x11,0x3a,0xb9,0x6c,0xf4,0x5f,0x58,0xa2,0xd6,0x58,0x6b,0x85,0x61,0xd1,0xe7,0xdc,0x90,0x07,0x34,0x6e,0xb9,0x0b,0x0d,0xcb,0xd5,0xe3,0xc6,0x9d,0xb8,0x51 +.byte 0x37,0x61,0xd0,0x6c,0x2e,0xed,0xe0,0xbc,0x55,0x74,0x63,0x1b,0x42,0x17,0x6a,0x9c,0x91,0x1b,0x96,0x76,0xc8,0xe4,0x2b,0x2e,0x90,0xd9,0xe5,0x3f,0x56,0x1b,0x2f,0x93,0x81,0x86,0x2a,0xb4,0xdf,0x93,0xcb,0xfa,0x01,0x85,0xd9,0x26,0x46,0x46,0x97,0x2a,0x2e,0xb3,0x91,0xe4,0xcf,0xd9,0x01,0x5a,0x37,0xa6,0xca,0x5e,0xed,0xa9,0x94,0x35 +.byte 0x2c,0x69,0x5b,0x1e,0xf8,0x38,0x61,0x41,0x10,0xf6,0xe9,0x6e,0x96,0xee,0xe6,0x5f,0x78,0x14,0x93,0x12,0xd2,0x57,0xe5,0xf4,0x58,0x46,0xca,0xc8,0x75,0x59,0xbd,0xd0,0xe4,0x70,0x35,0xa5,0x4a,0xfd,0x54,0xe2,0x91,0x76,0x0e,0xe6,0xe3,0xbb,0x31,0x65,0x4b,0x18,0xa8,0xb4,0xfa,0xa6,0x7d,0x7a,0xa9,0x47,0x3d,0x2b,0x2e,0x66,0xac,0x5b +.byte 0x3e,0x5e,0x8c,0x27,0x0c,0x33,0x04,0x03,0x4e,0x5f,0xcd,0x6b,0x9c,0xaa,0x13,0x83,0x38,0xe9,0x38,0xcf,0x03,0x70,0x5a,0x0f,0x18,0xf5,0xec,0x64,0xf3,0x0c,0xe8,0xb1,0xa9,0x07,0x70,0xf7,0xde,0x0c,0x35,0xf5,0xe2,0xcd,0xed,0xe6,0x4d,0xac,0x5c,0x4d,0x3e,0x03,0x96,0x90,0x7b,0x4c,0x3e,0x18,0x42,0xc0,0xa7,0x23,0x12,0x8e,0x54,0xc1 +.byte 0xa1,0x2f,0x82,0x13,0xe6,0x1f,0x74,0xae,0x7b,0x4a,0xa4,0xbb,0xdc,0xc0,0x68,0x0f,0x83,0xbc,0xda,0xce,0xa2,0xe7,0xbe,0x18,0xcd,0x8b,0x35,0x05,0xa3,0x4b,0x6f,0xf0,0x53,0x12,0x42,0x2f,0x3c,0x09,0x87,0xb7,0xe3,0x36,0x29,0xe1,0xa2,0xb6,0x60,0x05,0xb9,0x66,0x80,0xe9,0xec,0x40,0x2a,0x55,0x78,0x5f,0x1c,0x5f,0xc3,0xc7,0x49,0x69 +.byte 0x87,0x97,0x5f,0xa5,0x31,0xa8,0x83,0x66,0x5a,0xd7,0xaf,0xf0,0x15,0xf3,0x01,0x62,0x9a,0x88,0x76,0x0f,0xb3,0xdf,0xf1,0xc6,0x34,0xc3,0xac,0x68,0x60,0x9a,0x91,0x03,0x13,0xea,0x0e,0x36,0x9c,0xf5,0x51,0xb7,0x0c,0xa4,0xeb,0xf0,0x41,0x85,0x54,0x05,0xed,0x7a,0xc2,0xba,0x3b,0xb8,0x1c,0x41,0x0d,0xbb,0xad,0x16,0x7e,0x64,0x4f,0x88 +.byte 0x7a,0x17,0xae,0x76,0x55,0x78,0x93,0xe8,0x99,0xa1,0x70,0x1f,0xf6,0x8a,0xb9,0xeb,0x41,0xb9,0x08,0xb8,0x9d,0x78,0x57,0xa1,0xe1,0x23,0xa0,0x03,0xd3,0x16,0xbc,0x16,0x24,0xed,0xc5,0x12,0x16,0x0a,0x8a,0x23,0x11,0x22,0xc2,0xfe,0x49,0x9d,0x3d,0x10,0x3d,0x4b,0xeb,0xab,0xcb,0x21,0x9d,0x9d,0xb1,0x64,0x87,0xe5,0x4d,0xb9,0xe7,0x10 +.byte 0x05,0xa0,0x55,0x2f,0xdf,0x53,0x5e,0x03,0xec,0x7e,0xe4,0x1f,0x9b,0x16,0x0c,0xfc,0xd9,0xf9,0x66,0x39,0x93,0x9e,0x49,0x34,0x97,0xd6,0xa5,0x56,0x00,0xf1,0xaf,0x08,0xeb,0x58,0xcf,0x87,0x02,0xc4,0xf1,0x24,0xe8,0x29,0x83,0xc9,0x5d,0x56,0x68,0xa2,0xaa,0xba,0xb3,0x86,0x23,0x59,0x8d,0x32,0x96,0x4a,0xbb,0xe9,0xf2,0x53,0xb2,0x87 +.byte 0x4a,0xf5,0xdc,0x23,0xd4,0x2f,0x36,0x70,0xb5,0x1d,0xee,0x47,0x51,0x6c,0x35,0x2a,0xad,0x35,0x74,0x1b,0x98,0xb5,0x33,0x2c,0x6d,0x4c,0xf8,0x39,0x07,0x92,0x6c,0xc7,0x65,0x10,0x64,0xcd,0x53,0xa3,0xcb,0xcc,0xe4,0xb2,0x46,0xb3,0xb7,0x44,0x01,0x92,0x44,0x12,0x23,0x25,0x3e,0x00,0xe3,0xeb,0x5f,0xe5,0x76,0x48,0x4e,0x4a,0x7f,0x36 +.byte 0xf0,0x0b,0x5e,0xc0,0x97,0x0d,0xc8,0xcf,0xd5,0xb8,0xc0,0x11,0x8d,0xb9,0x1e,0x31,0x0f,0x84,0x36,0x2e,0xe0,0x42,0xe6,0x02,0x9d,0xa4,0xdb,0xa2,0x76,0xfd,0xa1,0x95,0xe0,0x49,0xe6,0xf1,0xd2,0xae,0x27,0x6b,0x11,0x05,0x47,0xb0,0xaa,0x61,0x01,0xd4,0xe6,0xcd,0x9d,0x7e,0x33,0x5d,0xec,0x22,0x96,0x59,0xb7,0xc5,0x50,0x83,0xa4,0x66 +.byte 0x56,0xc7,0x43,0xa6,0xf7,0x5d,0xb2,0x45,0xc0,0x96,0xa0,0x5b,0xb8,0xed,0xae,0x29,0xb3,0x7d,0xbd,0x01,0xde,0xc0,0xe7,0xcc,0xe9,0x55,0x32,0x32,0xbf,0xdd,0x03,0x1b,0xb0,0x4e,0xff,0x53,0x1f,0x4b,0xc6,0xec,0x16,0x9d,0x5b,0x78,0x74,0xc4,0x75,0x51,0x8a,0x1c,0xae,0x6b,0xcd,0x9c,0x77,0x47,0xbf,0xd1,0x38,0x3e,0x9e,0xc0,0xad,0x16 +.byte 0xb7,0x15,0x6b,0xdc,0xad,0xe9,0x13,0xbc,0x48,0xc1,0xaf,0x69,0xce,0xc4,0xcc,0x9b,0x73,0xf9,0xd5,0x7c,0xab,0xf0,0xf1,0x9b,0xea,0xc6,0x0b,0x19,0x47,0x42,0xc1,0xa0,0x02,0x64,0x17,0xce,0x88,0x4f,0x16,0xa6,0xed,0xdb,0xfe,0x61,0xd3,0xd6,0xc0,0x11,0x30,0x16,0xd2,0x45,0xb3,0x7e,0x52,0xd0,0x94,0x77,0xf0,0x0e,0xbf,0x16,0xc0,0x4a +.byte 0x2a,0x5c,0xac,0x55,0x57,0xb1,0x41,0xb6,0xa3,0x68,0x8c,0x0a,0x66,0x15,0xb4,0xf5,0xd9,0x9a,0xa9,0x68,0xf2,0xbc,0x06,0xc5,0x7c,0xd1,0x18,0x55,0x9a,0x2d,0x94,0x2e,0x04,0x4b,0x7d,0x3c,0xb1,0xe3,0x03,0x7a,0xa7,0xe3,0xe5,0x63,0x49,0x7c,0x3f,0x0a,0xc5,0xbd,0xd3,0x0f,0x04,0xfd,0x99,0xf7,0xe6,0x05,0x35,0x66,0x17,0x05,0x85,0x3b +.byte 0x98,0x92,0x11,0x26,0xe2,0x21,0x52,0x1b,0x54,0x08,0xc8,0xf0,0x4e,0x75,0x22,0x3f,0xe8,0xb6,0x35,0xa4,0x02,0x52,0x70,0xc2,0xce,0x5a,0x00,0xe2,0xe2,0x92,0x8c,0x97,0xa7,0x1d,0x42,0x52,0x8b,0xf1,0x81,0xa7,0xce,0x60,0x46,0xbe,0xf0,0x1d,0x34,0xdf,0x73,0x2a,0xd6,0x9a,0x2d,0xf9,0xe3,0x91,0x05,0xe4,0x1f,0x31,0x11,0x30,0xb0,0xff +.byte 0x8f,0x61,0x74,0xf4,0xef,0xcd,0xf6,0xa4,0x9a,0xd2,0x5e,0xba,0x27,0xe8,0x78,0x38,0xfc,0x75,0xff,0x3b,0x6c,0xde,0x4a,0x46,0x47,0x8e,0x97,0x28,0xe4,0x23,0xe0,0x10,0x07,0xca,0xcb,0x6d,0xed,0x29,0xc0,0xee,0x98,0x96,0x7c,0x90,0x1f,0x89,0x12,0x0f,0xd5,0x28,0xcf,0x6e,0x4b,0x9b,0x2d,0xb3,0xcd,0x97,0xb8,0xeb,0x58,0x23,0x26,0xb1 +.byte 0xb4,0x95,0x11,0x1e,0xee,0x00,0xde,0x24,0x28,0xa6,0x3f,0x15,0xa2,0x9a,0xcb,0x9d,0xe3,0x04,0x5d,0xc3,0x60,0x97,0x14,0x2c,0x84,0x2b,0x69,0x9c,0x2a,0xbf,0x08,0xba,0xc4,0x38,0x36,0xaa,0x89,0x11,0x32,0x63,0x01,0xa2,0x44,0x5f,0x50,0xf0,0x5b,0x11,0x15,0xc8,0x80,0xc9,0xa6,0xe7,0x5d,0x70,0xa8,0x34,0x42,0x97,0x2a,0x60,0x99,0x20 +.byte 0xa6,0x60,0xc0,0x70,0x8d,0x2f,0x3f,0x8a,0x14,0x80,0x8a,0xbe,0x05,0xb3,0x50,0x16,0xaf,0x32,0xb4,0x35,0x3e,0x1d,0x31,0x42,0xdd,0x50,0xeb,0x04,0x82,0x4c,0x83,0x3d,0x8f,0xb6,0x1e,0xc2,0xa9,0xd2,0x30,0xba,0x33,0xdb,0x97,0x6d,0x2d,0x97,0x59,0x33,0xc0,0xf8,0xa5,0x59,0xc5,0x44,0x9c,0xf1,0x06,0xc4,0xf2,0x31,0x3e,0xff,0xb8,0x12 +.byte 0x00,0x4d,0x6c,0x2d,0xa1,0xc7,0x83,0xea,0x55,0x93,0x0e,0x89,0x76,0xbf,0x56,0x2a,0x99,0x62,0x54,0xad,0x2c,0xe8,0xf0,0xf9,0x70,0x18,0xa5,0x2b,0x24,0xac,0x59,0xc9,0x84,0xe3,0x1a,0x9d,0xa0,0xdb,0x1b,0x7f,0xd5,0x7e,0xb5,0xe0,0x86,0x36,0xc5,0x71,0x6a,0xab,0xdb,0xa5,0x84,0xf1,0x9e,0x9e,0xf6,0x1b,0xab,0x47,0x94,0x38,0x8e,0x5d +.byte 0x55,0xb4,0xf5,0xc3,0x59,0xc2,0x2c,0x6d,0x9d,0x28,0x7d,0x33,0xcd,0xc7,0xd6,0xdf,0x10,0xda,0x7c,0xd0,0x6c,0x91,0x88,0xd6,0x6b,0xe7,0x72,0x75,0x18,0xb1,0x87,0xe4,0xbb,0x10,0xe0,0xa3,0x0f,0xea,0x65,0x0a,0x70,0xc8,0xee,0x52,0x05,0x0a,0x27,0x39,0x66,0xda,0xd6,0xa6,0xfe,0x97,0x24,0x09,0x9d,0x20,0x76,0x4e,0x97,0x9d,0xa9,0x9f +.byte 0x76,0x20,0x27,0x57,0x5b,0xf4,0x76,0x1a,0x4b,0xcf,0x13,0x6c,0x9e,0x63,0x53,0x97,0xca,0x10,0xd6,0x90,0x7d,0xfc,0xe3,0x03,0x2c,0x6c,0x79,0x93,0x1a,0xae,0x0f,0x43,0xdb,0x75,0xde,0x56,0xa6,0x69,0x93,0xce,0x2d,0x94,0x56,0x77,0x90,0x19,0x71,0x7f,0x7a,0x99,0xbd,0x9c,0x79,0x62,0x00,0x49,0x3a,0x62,0x49,0x4b,0x92,0x65,0x8b,0xe2 +.byte 0xa8,0x3d,0xa5,0x89,0x23,0xac,0xea,0xf1,0xbf,0x38,0x84,0xd7,0xe2,0x65,0xb6,0xc7,0xbc,0x02,0x11,0xfd,0xe3,0x4c,0x57,0x38,0xd4,0x36,0x54,0xe8,0xbb,0x63,0x17,0xe9,0xda,0x82,0x50,0xf1,0x8c,0x34,0x4d,0x75,0x2a,0x64,0x49,0xaf,0x98,0xc3,0x1d,0xad,0x31,0xf3,0x90,0x23,0x39,0xf5,0xb5,0xf4,0x37,0x88,0x67,0x12,0x5d,0xfc,0xee,0xe5 +.byte 0x44,0x52,0x2c,0x78,0xb1,0x90,0xc1,0xc2,0x77,0x6e,0x31,0x3e,0xa0,0x36,0x87,0xb0,0xc6,0x6c,0x94,0xc2,0x43,0x4a,0x7b,0xa2,0x73,0xe7,0xa0,0xc3,0x4c,0xaf,0x4f,0xa6,0x92,0x1c,0x9a,0x6d,0xee,0xe8,0x4d,0xe1,0xe0,0xc7,0x67,0xcf,0xcf,0x7d,0x7f,0x0f,0x07,0x0d,0x6c,0x06,0x06,0xc2,0xc9,0x28,0xfc,0x8d,0xcd,0x23,0x01,0x97,0x5b,0x4d +.byte 0x1c,0xdb,0x34,0x51,0x6e,0xe2,0x56,0x24,0xd7,0xbd,0x12,0xc4,0x2f,0xb4,0x3b,0x02,0xaa,0x47,0xda,0x61,0xf6,0xca,0x44,0xa8,0x02,0xbf,0xbc,0x58,0xfb,0xa2,0xff,0xf3,0x54,0x59,0x5f,0xd7,0xa0,0x7c,0x83,0xa6,0xef,0xeb,0x71,0x51,0x74,0xa1,0x27,0x10,0x97,0x13,0x1f,0x42,0x91,0xdd,0xa8,0xf8,0xc7,0x60,0x90,0xca,0x2e,0xc8,0xaf,0x9f +.byte 0x65,0x1f,0x24,0x0a,0x30,0x5f,0xb9,0x4c,0xfb,0xcb,0xa3,0x96,0x5e,0xad,0xab,0xac,0x09,0x91,0xf5,0x96,0x1f,0xe0,0x96,0x14,0xc5,0xa0,0x26,0xa1,0xf1,0x91,0x80,0x38,0x7f,0x38,0xdc,0x98,0x96,0x20,0x46,0x50,0x20,0xd2,0x20,0xce,0x79,0xd5,0x81,0x60,0x97,0xb2,0xb0,0xeb,0x58,0x75,0x3c,0x99,0xf0,0xe0,0xfd,0xfc,0x90,0xc5,0xd1,0x3d +.byte 0x68,0x07,0xfd,0xa1,0x3f,0xeb,0x47,0xd0,0x58,0xe3,0xfa,0xbe,0xbf,0x20,0xdf,0x66,0x08,0x91,0xa4,0x5c,0x52,0x3e,0xdf,0x5c,0xb8,0xee,0xca,0xa6,0x89,0x06,0x97,0xb4,0x8d,0x60,0x35,0xb1,0xff,0x1e,0x39,0xf2,0x67,0xbc,0x71,0xee,0xeb,0x48,0x94,0x19,0x1a,0xee,0xc5,0xe2,0x7e,0x0d,0xf1,0xca,0xe8,0x2c,0xb0,0xaa,0x02,0x58,0x23,0x23 +.byte 0xce,0x37,0x5e,0xcb,0x58,0x40,0x2e,0x1a,0xa6,0x09,0x11,0x95,0xc4,0x6f,0x10,0xb0,0x15,0x22,0x48,0x67,0x74,0x6c,0x2f,0x4f,0x4a,0xb4,0x01,0xe5,0xa3,0x77,0xab,0xad,0xa4,0x04,0x22,0x71,0x58,0x4a,0x71,0xb1,0xe8,0xdf,0x43,0x18,0x0e,0x95,0x7c,0x8c,0x23,0x3a,0xf3,0x9c,0x20,0x60,0x20,0x69,0x51,0x28,0x7e,0x13,0x67,0x5c,0x7d,0x35 +.byte 0xfa,0x1b,0x04,0x8b,0xcf,0x42,0x6e,0x15,0x55,0xcd,0x04,0xdb,0x73,0xdb,0x47,0x5f,0x83,0x6e,0xd1,0x5a,0x15,0xa2,0xbb,0xf7,0xbb,0x84,0x58,0xce,0x75,0xe8,0xd2,0x92,0xd5,0xb7,0x76,0xf2,0x94,0x67,0x27,0x5f,0x32,0x91,0x3a,0xaf,0xd4,0x31,0xf8,0x92,0xce,0x63,0xb7,0x45,0x27,0xb4,0xb8,0x7a,0x1e,0x4e,0xde,0xcb,0xc8,0x5e,0xd3,0xbb +.byte 0x52,0x91,0xd5,0x72,0xad,0x98,0xec,0x07,0xa1,0x56,0xb4,0x8e,0x04,0xfa,0x48,0x3f,0x17,0x07,0xf7,0xef,0x92,0x61,0x69,0xaf,0xdd,0xfc,0x76,0x03,0xe2,0xe9,0xe2,0xbe,0x5c,0xf2,0x8a,0xc5,0x99,0x51,0x7f,0xa4,0xf1,0xac,0x16,0xec,0x16,0xf5,0xb8,0x95,0x88,0x87,0xdb,0x27,0x2e,0x63,0x12,0x31,0x7d,0x6b,0x2b,0xa0,0x9b,0xb5,0xf9,0x82 +.byte 0x42,0x04,0x94,0xee,0x60,0x6e,0x4e,0x54,0x9b,0xfd,0xeb,0x01,0x3a,0xad,0x42,0xeb,0x08,0x3c,0x6a,0xa3,0xf2,0x46,0xfb,0x18,0x59,0x2c,0xa3,0x0b,0x22,0x1d,0x5d,0x47,0xa6,0x8c,0x06,0x9c,0xa1,0xcc,0x20,0x67,0xbd,0xf0,0x5b,0x94,0x9f,0xc6,0x10,0x8c,0xc8,0x15,0x52,0xe3,0x19,0xa1,0x89,0xfd,0x99,0xad,0x4f,0x10,0x51,0x0a,0xe4,0x4b +.byte 0x02,0x7b,0x0d,0x73,0x2d,0xae,0xa4,0x68,0x1d,0xb6,0xcf,0x58,0x67,0xc0,0xd0,0xca,0x11,0x34,0x31,0x9e,0xa3,0xbc,0x12,0x28,0x1e,0x8e,0x5a,0x63,0xf5,0xda,0xf2,0x36,0x94,0x63,0x2c,0x39,0x3d,0xf9,0x80,0x9f,0xbf,0x8d,0xef,0x1f,0x15,0xc8,0xdb,0x62,0x58,0x7d,0xdc,0x0a,0x7f,0x87,0xaf,0x6d,0x2e,0xac,0x92,0x4f,0x51,0xdf,0x5e,0x75 +.byte 0x5e,0x0f,0x7c,0x51,0x49,0x88,0x0f,0x7b,0x49,0xa5,0x7c,0x41,0x4e,0x2a,0x0f,0xd0,0x0f,0x78,0xeb,0x42,0xfc,0x07,0x8a,0x8b,0x4e,0x3e,0xf2,0x42,0xc5,0x21,0x01,0x66,0xe2,0x50,0xf6,0x3d,0x28,0x1e,0xbf,0xdc,0x71,0x7f,0xc5,0x6e,0xc1,0xab,0x1a,0x33,0x49,0xdd,0xa2,0xb9,0x52,0xbe,0x93,0x97,0x97,0x7a,0xf0,0x22,0xa8,0xc5,0x01,0xc6 +.byte 0x76,0x6f,0xb6,0x2c,0x09,0x80,0x62,0x5b,0x84,0x05,0x7f,0x79,0x28,0x04,0x67,0xa2,0x0f,0xfc,0xbb,0x17,0xe2,0x85,0xe3,0xa0,0xf3,0x44,0x47,0x96,0x68,0x80,0xb2,0xbf,0xba,0x63,0x53,0x38,0x6c,0x3b,0xcd,0x3c,0xa4,0x10,0x48,0x80,0xd8,0x49,0x5a,0xf0,0x5c,0x38,0x02,0x02,0x5b,0xf2,0x77,0xa4,0xfd,0x16,0xfd,0x13,0xc8,0x8b,0x9b,0xcd +.byte 0xe1,0x8d,0x70,0xb6,0x3d,0x24,0x65,0xda,0x1a,0x42,0x6f,0x90,0x64,0x9a,0x9b,0xda,0x54,0x44,0xc0,0xe0,0xd7,0xfb,0x73,0x10,0x3c,0xcf,0xa6,0x04,0x99,0xd9,0x45,0xe5,0x74,0xfe,0xdf,0x81,0xac,0xc8,0x30,0xe5,0x66,0x45,0x02,0xca,0xcd,0xd7,0xe6,0x7b,0x0d,0xda,0xe1,0xa0,0xa1,0xa1,0x87,0x34,0x63,0x0b,0xa7,0x82,0x39,0x83,0xba,0x18 +.byte 0x0b,0x16,0x35,0x11,0x53,0x8d,0xbe,0x7d,0xa8,0x7e,0x3f,0xf4,0x71,0xc9,0x37,0x6f,0x1a,0xd9,0x3f,0x8e,0xc4,0xc1,0xd3,0x80,0xdf,0xee,0x0e,0x6b,0x23,0xf7,0xbc,0x42,0x93,0x7a,0x36,0x6f,0x03,0x24,0xb4,0x9c,0x62,0xa0,0xed,0xed,0x0b,0x66,0xa8,0x25,0xe6,0x1a,0xd4,0x13,0xd1,0x16,0x14,0x2b,0x90,0x7d,0x2e,0xa4,0xda,0xb2,0xf9,0x33 +.byte 0x54,0xf9,0x0a,0x04,0x27,0x03,0x14,0xd2,0xd7,0xe2,0xc1,0xaa,0xb6,0xe8,0xe5,0x4c,0xf2,0xdb,0x4c,0xc8,0xb3,0xa4,0xeb,0xbf,0x12,0x5c,0x9d,0x65,0xaa,0x9a,0x66,0x77,0x42,0xb4,0xd5,0x5b,0x1f,0x3b,0xd7,0x91,0x89,0x57,0x2f,0xd0,0x86,0x99,0xb2,0xc8,0xc1,0x31,0xde,0x33,0x43,0x36,0x81,0xdb,0x97,0x7b,0x17,0x3b,0xa5,0x99,0xdb,0x63 +.byte 0x2b,0x48,0x4c,0xa6,0x5c,0x6c,0xd8,0xc9,0x6e,0x72,0x39,0xbe,0x6e,0x55,0x7e,0x9d,0xb7,0x20,0x8d,0x8f,0x81,0x20,0x78,0xae,0xc6,0x1d,0xe0,0x2d,0xb1,0xe7,0x64,0xbb,0xd4,0xc8,0x08,0x61,0x14,0x29,0x08,0xbc,0x1a,0xeb,0xfa,0x64,0x33,0x91,0x7d,0x91,0x41,0x65,0x8e,0x4c,0x0c,0xb2,0x79,0xc3,0x01,0x68,0xfc,0xd6,0xbb,0x50,0xcc,0x07 +.byte 0xa5,0xf6,0x2c,0x5e,0x10,0xd6,0xa3,0x62,0x18,0xec,0xa2,0xf2,0x6b,0xad,0xcd,0x02,0x01,0x75,0xbb,0x36,0x27,0x56,0x0f,0x55,0x03,0xe0,0x57,0xe1,0x72,0xeb,0x66,0x00,0x21,0xff,0x9a,0xbc,0xc1,0x1e,0x2c,0x93,0xe6,0x4d,0x93,0x28,0x10,0x7d,0x67,0x6c,0xf1,0xa4,0xe6,0x3a,0xa6,0x30,0xc8,0x50,0x1d,0x8b,0x6e,0x7b,0x76,0x98,0x14,0x4e +.byte 0xed,0x84,0x67,0x2a,0x5f,0xac,0x0b,0x7b,0x47,0x40,0xb3,0x2d,0x7a,0xc1,0x23,0xdc,0x62,0xf8,0x8e,0x90,0x77,0xd4,0xf9,0x00,0x4b,0x67,0x04,0x72,0xf8,0xc9,0x2c,0x2d,0x0e,0x3c,0x3c,0xf3,0xfc,0xa8,0xe2,0x49,0xa4,0x00,0x82,0x98,0x72,0xa9,0xec,0xea,0xbd,0x3a,0x4e,0xd7,0x32,0xf1,0x11,0xf0,0x0d,0x9e,0xa2,0xe8,0xfe,0xcc,0x67,0xec +.byte 0xfc,0xd6,0xfe,0x83,0x5e,0x7c,0x2b,0xb3,0x42,0xf4,0x2d,0x9a,0xbe,0x20,0xd1,0x81,0x62,0xe9,0x59,0x19,0x28,0xdf,0x97,0x10,0x54,0xf7,0xde,0x60,0x51,0x6a,0xce,0x32,0x03,0x75,0x5c,0x25,0x25,0x82,0x9c,0x07,0xf7,0x2d,0xa8,0x1b,0x9f,0xd3,0x32,0x46,0x25,0x1f,0xb1,0xc5,0xbb,0x28,0x14,0x3e,0xed,0xa8,0x83,0x20,0xf4,0x9c,0x75,0xf4 +.byte 0xe6,0xc4,0x2d,0x05,0x88,0x31,0xfd,0x48,0xca,0x6c,0x7f,0xab,0xb4,0x77,0x93,0x1d,0x87,0xc3,0x4e,0xb8,0xad,0xb4,0x3d,0x37,0x7a,0xd2,0x77,0xff,0xc2,0xcb,0x9c,0xc7,0xbf,0x02,0x02,0x70,0xc9,0x9f,0x77,0x8a,0x7d,0xa7,0x9a,0x10,0xd1,0x0e,0xb7,0xec,0x61,0xee,0x77,0x24,0xe9,0x3d,0xcd,0x12,0xca,0xee,0x50,0xb0,0x27,0x5d,0xe5,0xac +.byte 0xa3,0x92,0xc7,0xd0,0x23,0x54,0xb1,0xe5,0x50,0xc3,0x15,0xd7,0x66,0x32,0x38,0x34,0xb1,0x59,0x1b,0xc3,0x59,0xe8,0xad,0x59,0x90,0x58,0x6e,0x02,0x40,0xb1,0x51,0x65,0x78,0x25,0x26,0x01,0xdd,0xcf,0x04,0xa2,0xfe,0xc3,0xbb,0x80,0x1c,0xb0,0x4e,0x9c,0x49,0x48,0xa3,0xe2,0xcc,0x81,0xc5,0xa8,0xd4,0xd5,0xe4,0xab,0x39,0xe7,0xe8,0x97 +.byte 0xc7,0x51,0xb4,0x5e,0x3f,0xe6,0xa7,0xcc,0x45,0x18,0xa2,0x6a,0xb3,0xa8,0x0b,0x7d,0xce,0x1a,0x97,0x4a,0x67,0xe1,0x3c,0x7c,0x4e,0xad,0x90,0xcf,0x2a,0x8f,0xb8,0xb6,0x96,0xaa,0x9a,0xc3,0x73,0xe6,0x71,0xdb,0x11,0x9b,0xd9,0xd9,0xfe,0xba,0x4a,0xf0,0x77,0xa4,0x15,0xb5,0xca,0xe1,0xb4,0x16,0x06,0x46,0xdf,0xc5,0x49,0x07,0x66,0xb3 +.byte 0xf5,0x30,0xe3,0xfb,0x44,0xac,0x80,0x3a,0x21,0xd9,0x5b,0x22,0x54,0x3a,0xae,0xbe,0xbd,0xf0,0x99,0x8d,0xb5,0x2a,0xf7,0xc9,0xf2,0xd3,0xfb,0x07,0x7c,0xd7,0x75,0x30,0x2a,0xcd,0x80,0xa8,0x2a,0x6a,0xb9,0x47,0xe2,0xa1,0xb0,0x76,0x6a,0x0f,0x9f,0x4a,0x56,0x3e,0xde,0xb3,0x89,0x12,0x25,0x63,0x1a,0x9d,0xea,0x64,0x08,0xc5,0x78,0xa7 +.byte 0x53,0xce,0xf8,0xb2,0xe5,0x97,0x3a,0xeb,0xd1,0x92,0xe1,0x4d,0xe0,0xf5,0x93,0x39,0x73,0xad,0x67,0xc9,0x0e,0x6b,0x16,0x4a,0x00,0xaa,0xb4,0xe6,0xa6,0xa5,0x67,0x95,0x90,0x04,0x5e,0x4d,0xc3,0x7f,0x6b,0xa1,0x50,0xb0,0x3b,0x72,0x0d,0xb3,0xec,0x9a,0x18,0x92,0x65,0x0c,0x2d,0x0f,0x94,0xd6,0x0f,0x95,0xba,0x4b,0xe6,0xc3,0x07,0x22 +.byte 0x0d,0x40,0xd4,0x0d,0x97,0x44,0xba,0x54,0x8c,0xf8,0x97,0x52,0x1f,0xa7,0xb2,0xe8,0x1b,0x0a,0xd5,0xde,0xff,0x1b,0x33,0x60,0x6a,0x28,0x68,0x36,0xb9,0x5a,0x3e,0x43,0x84,0x9a,0xb1,0x3d,0x3d,0xdb,0x1b,0xa2,0xc5,0x0e,0x2d,0xb5,0x5a,0xa5,0x36,0xe7,0xbf,0x7e,0xc3,0x76,0xad,0x1e,0xb5,0x49,0xc2,0xd5,0xa2,0x69,0x97,0x45,0x43,0x3e +.byte 0xeb,0xcd,0xdf,0x4f,0xab,0xb3,0xe8,0x49,0xaa,0x9c,0x9c,0x58,0x1e,0xc8,0x1c,0x79,0xe9,0x16,0x1d,0xfe,0x54,0xac,0x55,0x18,0x10,0x73,0x97,0xdc,0xbe,0x45,0x63,0xfb,0x48,0x41,0x88,0xb4,0x0b,0x3a,0x1d,0x65,0x40,0x1b,0x10,0x66,0xeb,0xbe,0xed,0xc7,0x6c,0xd5,0x0c,0x19,0x85,0x23,0xb1,0x38,0xb3,0x4b,0xcd,0xc7,0xc5,0x06,0x18,0x40 +.byte 0xbd,0xef,0x9f,0x2e,0x3a,0x71,0x33,0x05,0x30,0x71,0xca,0xe9,0x7a,0x2c,0xe7,0x83,0x4e,0x3d,0x4b,0xc8,0xc7,0xcb,0x74,0x9c,0xa2,0xc7,0xbb,0x8c,0x44,0x0d,0xd8,0xb3,0x01,0x7c,0xdf,0x79,0xee,0x47,0xcb,0x91,0x6f,0xc3,0xfd,0x0f,0xfb,0xf8,0x6b,0x9b,0x00,0xaf,0xf6,0x69,0x82,0xa5,0x58,0x54,0x22,0x7f,0x4b,0xee,0xa7,0x03,0xdb,0xb6 +.byte 0x5f,0x12,0xe1,0x04,0x43,0x17,0xec,0xd4,0xdd,0x39,0x28,0xfa,0xa3,0x09,0x5e,0x14,0xaf,0x6b,0xfe,0x0c,0x65,0x01,0x13,0x75,0x3d,0xe7,0x6d,0xd9,0xda,0x1d,0x13,0xc1,0x56,0x40,0x50,0x95,0x65,0x8f,0xad,0x51,0x3f,0x13,0x05,0x2f,0x83,0xcd,0xca,0x8b,0x75,0xa2,0x39,0x61,0xde,0xd7,0x36,0xf9,0x1d,0x43,0x5b,0xc4,0x9a,0xc9,0xfc,0xa8 +.byte 0xf4,0x76,0x90,0x91,0xe8,0x52,0x5b,0x84,0xe7,0xc9,0x8e,0x7d,0x84,0xba,0xb1,0x32,0x12,0xce,0x06,0x9e,0x98,0x83,0x1f,0x7f,0x31,0xd7,0xf0,0x8a,0xa2,0xca,0xae,0xb3,0x50,0x51,0x93,0xfb,0x2f,0x43,0x0a,0xee,0x06,0x85,0xec,0xb8,0xf1,0x73,0xb1,0x65,0x37,0x05,0x8e,0x68,0xf7,0x7a,0xff,0xe7,0x17,0x08,0x5e,0x19,0x75,0x3d,0xf9,0x5e +.byte 0xd5,0x25,0xf6,0x3b,0x99,0xb9,0x96,0x42,0x7a,0x37,0x8f,0x0d,0xde,0x22,0x83,0x89,0xf0,0x77,0x1f,0x22,0x42,0xc7,0xb5,0x70,0xcb,0xfd,0xf0,0xa9,0x87,0x8e,0x1f,0x01,0x9a,0x26,0xa6,0x8c,0x41,0xb9,0x12,0xd6,0xf2,0x5b,0xe5,0xfd,0xdc,0x74,0xbd,0xa1,0xc8,0xf7,0x3b,0x8c,0xe1,0x1d,0x42,0xb4,0x07,0x24,0x18,0x84,0x94,0x8a,0xce,0x00 +.byte 0xbd,0xd7,0xb0,0xfd,0x8f,0x0a,0xd3,0x75,0xa4,0xe8,0xfc,0x09,0xa9,0xa3,0x57,0x68,0x79,0x0e,0xef,0x37,0x46,0xd5,0x3b,0x8c,0x0d,0x67,0xbc,0x2c,0x5d,0x3e,0xf7,0xcc,0x9c,0x9e,0x81,0x62,0xc8,0xec,0x38,0x20,0x07,0x66,0xe4,0x83,0x15,0x13,0x3b,0x47,0x23,0xd9,0x46,0xaf,0x65,0xe1,0x40,0x2d,0x14,0x84,0x72,0xc1,0xbf,0xbe,0x81,0xc4 +.byte 0xcb,0x04,0x16,0x5e,0x2f,0x60,0x3a,0x8e,0x1a,0xd3,0xa2,0x00,0x25,0x6c,0xb7,0xdb,0x0d,0x20,0x99,0xb8,0x45,0x54,0xbf,0xc4,0x52,0x52,0x92,0x7d,0xcd,0xa1,0x9a,0x12,0x5e,0x27,0xe9,0xcf,0x79,0x9d,0xa8,0x6c,0xcd,0x37,0x20,0x08,0x09,0xc6,0x94,0x53,0x00,0x04,0xf5,0x3b,0xea,0x00,0x1b,0xc3,0x02,0xff,0xbc,0x18,0x1f,0xb7,0xf7,0x26 +.byte 0xe8,0x8b,0xc4,0x5f,0xf7,0xbe,0x9b,0xb3,0xba,0xae,0xbd,0x9c,0x3f,0x95,0xf7,0xcd,0x2b,0x40,0xf4,0x1c,0x6f,0xd7,0x52,0xe1,0xa7,0xdc,0x79,0xa4,0x88,0xff,0xfc,0xcf,0xfb,0xbb,0xe6,0xef,0xb6,0x31,0xac,0x24,0xa7,0x40,0xea,0x76,0xa2,0x34,0x6c,0xb1,0xfb,0x96,0x6b,0xfa,0xdd,0x60,0x70,0x73,0xb8,0xfd,0x66,0x3d,0xf9,0x63,0xc9,0x04 +.byte 0x70,0x20,0x35,0xca,0x04,0xb8,0xb3,0x4f,0x24,0x64,0x54,0xc2,0xd9,0x4d,0x8b,0xad,0x07,0xad,0xc5,0xb9,0x84,0xac,0x7c,0x65,0x4b,0x98,0x1d,0x09,0x23,0x95,0x5c,0x85,0x26,0xe5,0x8e,0xec,0xeb,0xc3,0xd5,0x15,0x9c,0x37,0x4e,0xf3,0x3c,0x97,0x92,0x75,0x99,0x48,0x48,0x52,0x4b,0x7b,0x93,0x54,0xd7,0x4f,0x7f,0xe5,0x51,0xdc,0x74,0x85 +.byte 0x9a,0xae,0xbd,0xf8,0xe6,0xe8,0x3f,0x1b,0xee,0x8b,0xf4,0xd8,0x5c,0x6c,0x46,0x6e,0x1d,0xaf,0x67,0x27,0x9a,0x39,0x4e,0x6b,0x99,0xcc,0xc0,0x66,0x54,0xbf,0x60,0xf6,0x24,0x64,0xfd,0x16,0xbf,0x56,0xb2,0x07,0x87,0x46,0xa6,0xef,0x40,0x67,0x78,0x2f,0x78,0x49,0x81,0x25,0xbd,0xa1,0xcf,0x78,0x68,0x25,0x8e,0x93,0x0a,0x4b,0xe1,0x92 +.byte 0x33,0x9c,0x13,0x70,0xd4,0xdf,0x74,0x34,0x8f,0x21,0xb9,0x51,0xd7,0x74,0xa9,0x02,0x6e,0xdd,0xb2,0xb4,0x6e,0x2a,0x95,0xdb,0xe4,0xaf,0x17,0xf5,0x9b,0xa5,0xc1,0x72,0x36,0x35,0x02,0x37,0x1c,0x38,0xaa,0x81,0x76,0xc6,0x1c,0xc3,0x2c,0xc5,0x45,0xaf,0x03,0xea,0xe6,0x14,0x51,0x44,0x84,0x9e,0x32,0xfe,0x4b,0x47,0xe9,0xb4,0x12,0x96 +.byte 0x13,0x6f,0x4c,0xed,0xe4,0xb0,0x79,0x7b,0xe5,0xc0,0x37,0x87,0x78,0x28,0x42,0xf7,0xd4,0xde,0xfc,0xd2,0x23,0x11,0x09,0xa5,0x11,0xc3,0xc4,0xf5,0xe0,0x2b,0x47,0x01,0x63,0xf2,0x85,0x1f,0x45,0x28,0xae,0xd3,0x29,0x04,0x1a,0x4b,0x83,0xab,0xf2,0x35,0x3a,0x40,0x2c,0x8d,0xb3,0xc7,0x47,0x0d,0xd1,0x3c,0xd0,0x1c,0x6b,0x5d,0x9b,0x4e +.byte 0xdf,0x36,0x8d,0xc6,0x54,0x9e,0x61,0x51,0xf1,0xd2,0xa4,0x39,0xad,0x4a,0x14,0xa1,0x0b,0xd3,0xae,0x91,0x1a,0x29,0xeb,0xc5,0x75,0x88,0x13,0x1e,0x96,0xdd,0x6f,0x86,0x92,0xaa,0x37,0x16,0x95,0x86,0xbc,0xb1,0x35,0xbf,0x5f,0x75,0x40,0x46,0xe1,0x6f,0x2f,0x33,0x2d,0x13,0x35,0xef,0xca,0x09,0x04,0xe4,0x42,0xef,0x69,0x66,0xda,0xa6 +.byte 0x01,0xda,0x09,0xfd,0xb1,0x40,0x8d,0xaa,0xdd,0x08,0x0d,0xf5,0xf1,0xd6,0xc6,0x11,0x3b,0xbd,0xd3,0x04,0x70,0x76,0xaf,0xec,0x9b,0xcc,0x6a,0x1d,0xeb,0x95,0x4a,0x01,0x0a,0x03,0x62,0x00,0x32,0xb3,0xe0,0xd1,0x36,0xb6,0xeb,0xde,0x4b,0x5f,0x35,0x79,0x07,0x4a,0x0d,0xa1,0x8c,0xde,0x6b,0xd2,0xca,0x71,0x64,0x73,0xf7,0x9c,0x1d,0x95 +.byte 0x5c,0xdc,0xb9,0x4f,0x00,0x2e,0x86,0x3d,0x81,0x7b,0x05,0xa5,0x9e,0x03,0xa3,0x62,0xcf,0x22,0x78,0x0b,0xfe,0x09,0x3e,0x62,0x93,0x19,0x6e,0x47,0x7d,0x92,0x4a,0x0b,0xae,0xcb,0x37,0x4d,0x5a,0x3a,0x7a,0x68,0xde,0xb2,0x7e,0xd7,0xda,0x5c,0x45,0xd2,0x0f,0x1d,0x03,0xbc,0xed,0xd8,0xe5,0x2e,0x26,0x10,0x82,0x46,0x5a,0xe0,0x13,0x32 +.byte 0xf8,0xb9,0x18,0x8c,0xbd,0xb4,0xb3,0x8c,0x2f,0xb0,0x5d,0x0b,0xf3,0x8f,0x5a,0xda,0x8b,0xda,0x39,0xfe,0xe6,0x66,0x95,0x3f,0xfe,0x49,0x89,0xbf,0x43,0x36,0x77,0xc7,0x6d,0xea,0x92,0x5c,0x71,0xa6,0x29,0x50,0xb0,0x2f,0xed,0x89,0x9f,0x2c,0xd6,0x6b,0xfa,0xbe,0x62,0x9f,0x62,0xc7,0xe3,0x2e,0xd4,0xf2,0x2c,0x9c,0x98,0x37,0x38,0x5e +.byte 0x81,0x6c,0x9e,0xcc,0xff,0x0f,0xfa,0xfa,0xe8,0xdd,0x2e,0x2d,0xb5,0x92,0x44,0x5e,0x2f,0xe1,0xd0,0x6c,0xc3,0xb9,0x11,0x95,0x70,0x4b,0x01,0xa0,0xc1,0x5e,0xe8,0x1d,0x40,0x16,0x9b,0x6e,0x29,0x1b,0x13,0xb9,0xda,0x39,0xbd,0x40,0x42,0xe2,0x06,0x35,0x57,0x2f,0xa8,0xf5,0xa7,0x00,0x60,0x07,0x26,0x21,0x6b,0xe6,0x23,0xa2,0x2a,0x70 +.byte 0xeb,0x85,0xcb,0xa9,0x73,0x31,0x62,0xf7,0xb0,0x90,0xd7,0x26,0xc1,0xd3,0xd7,0xcc,0x15,0x72,0x86,0xa6,0x0f,0x4a,0x24,0x14,0x5d,0xcd,0xbe,0xad,0x7d,0xf0,0x05,0x39,0x0c,0x10,0xbe,0x11,0x9a,0x36,0x9f,0x60,0x41,0xc6,0x7c,0xab,0x54,0x8a,0xac,0xc4,0xea,0xbd,0x43,0xeb,0x19,0x5a,0x8d,0x05,0xd1,0x83,0x58,0x92,0xb8,0xc6,0x75,0x56 +.byte 0x2c,0x58,0xb8,0x2d,0xe1,0x42,0xb4,0x0b,0xc9,0x97,0x79,0xb8,0x62,0xd0,0x15,0xd1,0x5d,0x0d,0x57,0x83,0xe4,0xba,0x73,0xa2,0x27,0xb8,0x56,0x64,0x28,0xaf,0xd2,0x58,0xe3,0xe6,0x12,0x01,0x6e,0x6a,0xfb,0x81,0x57,0xcd,0x32,0xc2,0x42,0x2a,0xe2,0x51,0x4a,0x4c,0xf8,0x69,0x0e,0xc0,0xe6,0x9f,0xf4,0x46,0x4b,0x60,0xcc,0x41,0x03,0xa4 +.byte 0x14,0xf0,0x15,0xb5,0xe5,0x39,0xfd,0x69,0xee,0xce,0x23,0x3a,0x50,0x66,0xdb,0xf4,0xe4,0x31,0x23,0xe9,0x06,0x93,0xdd,0x38,0xbc,0x2d,0xb9,0xf2,0x64,0x39,0x2f,0x1b,0xa9,0x71,0x0c,0x68,0xf7,0xb0,0x5b,0x74,0xe5,0x08,0xc6,0x5d,0xbe,0xb8,0xf7,0x40,0x0e,0xb4,0xe6,0x76,0x0c,0x14,0x8f,0x9d,0x25,0x95,0x6c,0x05,0x78,0x68,0x8a,0xa6 +.byte 0x80,0x24,0x8a,0x0b,0x6a,0xd7,0xfc,0xec,0x36,0xba,0x57,0xdd,0x49,0x82,0x3c,0x5f,0x9d,0xf4,0x57,0xac,0x16,0x99,0xed,0x73,0xa6,0xb0,0x2c,0x23,0xdb,0xf8,0x45,0x22,0xf4,0x82,0x16,0xc4,0x68,0x2f,0xe7,0x8c,0x85,0x6e,0x3c,0x43,0xdd,0x3d,0xea,0x90,0xeb,0xf4,0xef,0xf1,0x36,0x48,0x15,0x29,0x07,0x96,0x51,0xb5,0x78,0xa1,0xa3,0x59 +.byte 0x18,0x4d,0x11,0x5d,0x5e,0x67,0x69,0x28,0x29,0xcb,0xeb,0xbc,0x8f,0x17,0x12,0x57,0xaf,0xda,0xb5,0x86,0xef,0x59,0xdf,0xb1,0x6b,0x6a,0x33,0x66,0x67,0xd1,0x42,0xee,0xec,0x65,0xf2,0xeb,0x97,0x17,0x4e,0x01,0x3f,0x4d,0xb4,0x06,0x8e,0xf9,0xa8,0x79,0xb6,0xf1,0x67,0x8b,0xff,0x0b,0x5f,0x93,0x70,0x76,0x54,0xae,0x7b,0x0d,0x4a,0xbc +.byte 0xf7,0xdc,0x11,0x64,0xb3,0x6a,0xd1,0x69,0x45,0x1b,0x57,0xfc,0xb5,0xfe,0x86,0xb2,0xd6,0xde,0x82,0x23,0x86,0x6b,0x21,0x78,0x8b,0x2e,0x96,0xf8,0x04,0x8b,0xba,0x15,0xae,0x33,0x91,0x27,0x88,0xe3,0xc1,0xe7,0xf8,0xc3,0xa6,0xb6,0x73,0xec,0x84,0x95,0x22,0x45,0x58,0xb1,0x50,0x99,0xde,0x8a,0x37,0x41,0x9f,0xb8,0x27,0xd6,0xd8,0xaa +.byte 0x0f,0x0e,0xac,0xe4,0xd0,0x38,0xcf,0x2f,0x03,0x6f,0x3d,0x8a,0xd7,0x51,0xd6,0xf3,0x17,0x76,0xb5,0x0f,0xc5,0xf8,0xa7,0x0a,0x91,0xaa,0x8d,0xbc,0x15,0xd6,0x46,0xb9,0xdc,0x18,0x47,0x9c,0xd9,0x13,0xa5,0xb1,0xb5,0x45,0x2f,0x03,0x32,0x5c,0x8b,0xac,0x42,0x5b,0xd9,0x1a,0x41,0x1e,0x27,0xf9,0x92,0x72,0xc1,0xc7,0xc1,0x50,0x25,0x22 +.byte 0x7a,0x00,0x41,0x1f,0x2d,0x28,0xaf,0x41,0x96,0x8e,0x97,0x3b,0x36,0x80,0x16,0xe6,0x51,0x8f,0x07,0x13,0xd9,0x81,0x79,0x94,0x92,0xaa,0xb9,0xb6,0x39,0xf2,0x4d,0x24,0x6b,0x77,0x25,0x7e,0x47,0x6c,0xc7,0x62,0x3d,0x96,0x21,0xac,0x1a,0xf0,0x5f,0x5d,0x5a,0x7e,0x17,0xdd,0x47,0xd5,0x19,0x0a,0x85,0x3e,0xd5,0x6b,0x52,0x12,0xe2,0xbc +.byte 0x43,0x79,0x28,0x1d,0x72,0xcc,0xa6,0x6c,0xea,0x9b,0xe9,0x04,0x34,0x2c,0x41,0x3a,0x64,0xe8,0xcb,0x12,0xfa,0xd5,0x45,0xad,0xe8,0x3e,0xa2,0x5c,0xb8,0x83,0x52,0xdb,0x0c,0x98,0x24,0x76,0xd2,0x00,0x62,0xff,0xac,0xd7,0x11,0xee,0xcf,0xfb,0xdd,0x65,0xd2,0x75,0xb0,0x25,0x4e,0x76,0x3f,0xa2,0x1a,0xae,0xee,0xc1,0x59,0x1b,0x0c,0x42 +.byte 0x70,0x42,0x06,0x00,0x64,0x31,0xe0,0xce,0x3a,0x91,0x5e,0x9d,0x56,0x83,0xab,0xa7,0x73,0xc2,0x15,0x29,0xba,0xf9,0x1d,0xc8,0x4b,0xc6,0x3a,0x9e,0xab,0xd7,0xfd,0x17,0x8d,0x80,0xf0,0xa1,0x8a,0x5a,0x7a,0x80,0xd8,0x1f,0xa9,0x5b,0xec,0x68,0x99,0x3a,0x66,0xcc,0x5a,0xdf,0x5f,0xe9,0xd5,0x6a,0xf2,0x2c,0x7e,0xf8,0xa7,0xdf,0x0c,0x59 +.byte 0xbd,0x85,0xf0,0xc9,0x91,0x44,0x9c,0x86,0x24,0x60,0xfb,0xe9,0xff,0x3c,0xa7,0xa7,0x6d,0x4b,0x17,0xb3,0x24,0x99,0x14,0xbc,0x64,0xd0,0x41,0xaa,0xcd,0x26,0xd3,0xa3,0x51,0xeb,0x25,0x1d,0xb2,0x7d,0xf1,0xf3,0xf3,0xf0,0x3a,0xe0,0xb5,0xa9,0x24,0xc3,0x78,0x4a,0xef,0x9b,0x34,0x93,0xf8,0x0c,0x71,0x10,0x5b,0xf0,0xe7,0x08,0x4d,0x5f +.byte 0x74,0xbf,0x18,0x8b,0x48,0x8d,0xd7,0x23,0x81,0xed,0xa2,0x29,0xa9,0xdb,0x91,0xf6,0x61,0x7c,0xca,0x1e,0xe0,0xa7,0x21,0x9d,0xfc,0x04,0x3a,0x87,0xbb,0xf9,0xa4,0x3b,0xbb,0xc4,0x89,0xa1,0x7f,0xdc,0x83,0xfa,0x5e,0x0f,0xcf,0xdf,0xf6,0x41,0xd3,0xa3,0x76,0x76,0x44,0x3e,0x01,0xee,0xce,0xf6,0xc3,0xb9,0x49,0x43,0x6e,0xee,0x09,0x4c +.byte 0x87,0xe6,0xa3,0xf5,0xa0,0x8d,0x99,0xb3,0x3b,0xd6,0xeb,0x27,0xf9,0x34,0x68,0xc8,0x04,0x80,0xb2,0x4d,0xb6,0xde,0x98,0x81,0xe0,0xec,0xc9,0x06,0xde,0x86,0xee,0xf0,0x87,0xb8,0x67,0x0e,0xce,0xf8,0xc5,0xb1,0xd2,0xe1,0xe3,0x53,0x1d,0xbe,0x6c,0xdd,0x5e,0x83,0x02,0xf5,0xc8,0xda,0xcf,0x3c,0xcb,0x88,0x2c,0xca,0x65,0x65,0x9e,0x71 +.byte 0x4e,0xf2,0x98,0x96,0xb2,0x54,0xb4,0x96,0xdc,0x84,0xb5,0x39,0x74,0x9b,0x61,0xcf,0x52,0xef,0xb3,0x0c,0x62,0xc9,0x92,0xe1,0xe5,0x6f,0x2f,0x0c,0x61,0x0d,0x6f,0xfd,0xd8,0x84,0x25,0xba,0x20,0x59,0x00,0xf5,0xa9,0xf1,0x77,0x6e,0x9a,0x3d,0x93,0x69,0xde,0xaf,0x9a,0xe6,0xe3,0xfd,0xb9,0xd3,0x04,0x82,0x18,0xa1,0x5b,0x9b,0xe0,0x29 +.byte 0x4c,0x64,0xf5,0x95,0x57,0x25,0xd3,0x04,0x8b,0x4a,0xe9,0x57,0x6f,0xd1,0x8c,0x40,0x73,0x49,0x32,0x93,0x3f,0x26,0xb4,0x6b,0xd3,0xd4,0x90,0xb7,0xe1,0xaf,0xa0,0x9a,0xc0,0x86,0xb7,0x5e,0xec,0x29,0xaa,0x03,0x4e,0x56,0xb5,0xcd,0x46,0x7d,0xe0,0x26,0x3d,0x5f,0xd3,0x55,0x86,0x68,0x4a,0xc5,0x42,0x5d,0x60,0x3a,0x39,0x6f,0x45,0xb9 +.byte 0x6a,0xea,0xf4,0x05,0xc8,0x24,0xf8,0xcd,0xe5,0xeb,0xca,0x3a,0xe7,0xb4,0x59,0x83,0x5a,0xa5,0x1d,0xe4,0x6a,0xaa,0x35,0x00,0x42,0x32,0xa5,0x6c,0x3e,0xc1,0xc2,0xc4,0x9d,0x2e,0x43,0x57,0x79,0x52,0xf6,0x1e,0x02,0xb8,0x9b,0xcd,0xf0,0x3d,0x57,0xa3,0x6f,0xf7,0x12,0x54,0x6c,0x63,0x0d,0xb2,0xba,0xff,0xa1,0xf6,0xf5,0xdf,0xa5,0xed +.byte 0xda,0xdf,0x56,0x72,0x1e,0xc5,0x3f,0xad,0xd0,0xf9,0x38,0x94,0x51,0xe3,0xa4,0xb4,0xbf,0xd5,0x24,0x2a,0x90,0xfe,0xd4,0x34,0x6c,0xa8,0xc8,0x1c,0x9a,0xaf,0xac,0xff,0x5b,0x67,0x44,0x4c,0x4d,0xa7,0x59,0x2c,0x9f,0x67,0x07,0x25,0xe1,0x7f,0x4e,0x4a,0xaa,0x8f,0x5d,0xd1,0x26,0x0d,0x73,0x9b,0x69,0x5d,0xdf,0xb2,0xa5,0x89,0xbb,0x82 +.byte 0x0b,0x09,0xf3,0x11,0x76,0x5d,0x2d,0xad,0xc3,0xc1,0x15,0xbc,0xaf,0xa2,0xe6,0xd5,0xb0,0x6d,0x80,0xa6,0xda,0xfa,0x3b,0x9c,0xaf,0xff,0x98,0x40,0x83,0x3a,0xe1,0xb8,0x98,0x0e,0x97,0x00,0x89,0xfb,0x37,0xcb,0x81,0x36,0x34,0x33,0xbb,0x5c,0xd0,0x51,0x37,0xd6,0xb5,0x6c,0x3a,0x61,0x0a,0x27,0x23,0x96,0xa9,0x79,0x8d,0xf0,0xbe,0x31 +.byte 0xba,0xdc,0x89,0x4e,0x88,0x98,0xe4,0x10,0x15,0x8a,0xe1,0xae,0xe8,0x6d,0xa4,0x61,0x56,0x14,0x84,0x59,0x64,0xc2,0xaa,0xd8,0xfd,0x19,0xfc,0x17,0xf1,0xfc,0x6d,0x17,0xcb,0xea,0x7a,0x47,0x00,0x75,0x17,0xf3,0x62,0xfe,0x3a,0xbc,0x28,0x1a,0x0e,0x88,0x48,0x63,0x4a,0xcb,0x20,0x46,0xa4,0x75,0xf8,0xf1,0x7a,0xd6,0x92,0x7f,0x92,0xfa +.byte 0x91,0x95,0x2f,0xbc,0x5b,0x42,0xf1,0x55,0xaf,0x91,0xa2,0x3b,0x29,0x5c,0xc8,0x5e,0x97,0x91,0xa2,0x2e,0xd2,0xa8,0x1c,0xf6,0x16,0xc5,0x15,0xf2,0x42,0xb3,0x41,0x59,0x52,0x8d,0x94,0x52,0xc4,0xc6,0x2c,0xdd,0x6f,0x01,0xea,0x62,0x42,0x83,0x7e,0x2e,0xf8,0xb8,0xc1,0xf3,0x71,0xd1,0x11,0x14,0x7a,0x3d,0xcd,0xec,0xe0,0x79,0x8b,0xbd +.byte 0x28,0x12,0x60,0xf0,0x66,0xf1,0x1c,0x1c,0x19,0x07,0x8c,0x26,0xff,0xcc,0x72,0x9a,0xbd,0x12,0xe6,0x2b,0x2b,0xb1,0x32,0x04,0x98,0x92,0xd9,0x24,0x97,0x59,0x46,0xc6,0x11,0xe1,0x31,0x14,0x46,0x27,0x96,0xb1,0x06,0x81,0xd5,0xe8,0xff,0x45,0x3d,0x3c,0x04,0x9a,0xd8,0x0b,0x1f,0x41,0x03,0xba,0x1b,0x3e,0x4e,0xd5,0x7d,0x48,0x00,0x68 +.byte 0xb3,0xe8,0xe0,0xc8,0x3c,0xcf,0xdc,0xbe,0x29,0x90,0x64,0x51,0x18,0xdc,0xcd,0x87,0xcb,0xa8,0x3d,0xf8,0xb4,0x73,0x11,0xdc,0x7a,0xcb,0xa4,0x81,0x9e,0x3a,0x72,0xde,0x18,0x36,0x86,0x15,0x91,0xbc,0xeb,0x7f,0xe2,0xfb,0x6b,0xf1,0x5a,0x3d,0x05,0x50,0xeb,0xcf,0xd2,0xcc,0xf2,0x62,0xb1,0x32,0x46,0x14,0x95,0x4e,0xdf,0x73,0x64,0x61 +.byte 0x5f,0x3d,0xbf,0x52,0x3e,0xa7,0x55,0x01,0x9a,0xd8,0x01,0xef,0xf7,0x60,0x6f,0x83,0x43,0x6b,0x4c,0xa2,0xc8,0x04,0x34,0x70,0x70,0xa1,0x99,0xc9,0xa7,0x54,0x1e,0x87,0x99,0xb3,0xec,0xfe,0xe9,0x2d,0x39,0xef,0x6f,0x4d,0x8c,0xf2,0x4b,0xd2,0x12,0x5d,0xb6,0xa7,0x0b,0x04,0x3b,0x69,0xdd,0x9a,0x18,0x2d,0xd9,0x22,0x00,0x38,0x15,0x9a +.byte 0x6e,0x6c,0x0c,0x84,0x32,0x32,0xb2,0xf9,0x61,0xef,0x74,0x35,0xec,0xcc,0xd7,0xbc,0x9d,0xe9,0xcd,0xe3,0xa0,0xa5,0x15,0x0a,0xfe,0x1f,0x37,0x35,0x2b,0x7c,0x42,0x50,0x81,0x67,0x52,0xb7,0xa7,0x9e,0x8f,0xda,0x64,0xc0,0xc0,0xc3,0x93,0xc7,0x9d,0x41,0xb8,0x4b,0x69,0x80,0x13,0x88,0x8a,0x07,0xf9,0x47,0xad,0xc9,0x4f,0x3d,0xc7,0xba +.byte 0xd2,0xf2,0x7a,0xa0,0x38,0xbe,0xe1,0xfa,0x83,0xda,0x79,0x29,0x7f,0x4c,0xfa,0x0e,0x9b,0x59,0x1e,0x89,0x76,0x05,0x60,0x84,0x13,0x63,0x11,0x14,0x20,0xa9,0x2b,0xd0,0xc3,0x58,0xcc,0x73,0x3e,0x2c,0xa8,0xa7,0xa5,0xd0,0x2f,0x03,0xfc,0xa9,0x5d,0xdd,0xcd,0x40,0x91,0x90,0x1f,0xda,0x0a,0x73,0x58,0xd8,0x84,0x05,0x45,0x01,0x84,0x52 +.byte 0x8b,0x9b,0x17,0x98,0xa8,0xc4,0xc3,0xb5,0x94,0xd5,0x32,0x86,0xe9,0x10,0xe5,0xa5,0x99,0x8d,0x57,0x3e,0x32,0x25,0xfa,0xb4,0x5c,0x3a,0x5f,0xa6,0x2d,0x7d,0x4e,0xd3,0x7b,0xee,0x41,0x23,0x5e,0xc2,0xc9,0x91,0xf4,0x21,0xe0,0x4f,0x0d,0x87,0x30,0x53,0xf1,0x0e,0x63,0xe8,0x5b,0x3d,0xee,0x4a,0xc8,0x78,0x38,0xa2,0xa4,0xe8,0x72,0x41 +.byte 0xf1,0x37,0x30,0xe3,0x3d,0x93,0xc6,0x4b,0x10,0x0d,0xf6,0x20,0x15,0x0a,0x77,0x41,0xd5,0x7d,0xcb,0xf9,0xda,0x3b,0x17,0xa6,0xf1,0xe4,0x56,0xd4,0x65,0x7b,0x33,0xe4,0xef,0x34,0xfb,0x8c,0x9f,0x87,0x86,0xfc,0xce,0x90,0x60,0x77,0x57,0xc0,0xe4,0x37,0x2c,0xdf,0x41,0x95,0x85,0x89,0x4e,0x77,0x3f,0xa0,0xc7,0x55,0x4c,0x3f,0xa8,0x10 +.byte 0xd2,0x87,0x7e,0xd2,0x97,0xa1,0x6c,0xe7,0xec,0xaa,0xf6,0x93,0x13,0x2e,0x10,0xed,0x5b,0x7a,0xed,0x53,0xb4,0x55,0xaa,0xb4,0x67,0x78,0x07,0x5f,0xc2,0xd2,0xf1,0x7b,0x98,0xf0,0x82,0xf6,0x7c,0xb2,0xd4,0xa8,0xc2,0x53,0x39,0x21,0x7f,0xa0,0x76,0x37,0x1a,0x69,0xb3,0x49,0xd4,0xc3,0xd1,0xcb,0x31,0x76,0xec,0xaf,0x75,0x66,0x31,0x65 +.byte 0xeb,0x44,0x63,0xa0,0x13,0xf5,0x9e,0x67,0x40,0x41,0x76,0xce,0xd3,0xd6,0x91,0xb1,0x3a,0x07,0xff,0x38,0x1e,0xaf,0x55,0x57,0x55,0xd1,0x94,0x63,0xd3,0x81,0x16,0x59,0x68,0x01,0xe8,0x6d,0x7d,0x7a,0xa1,0x39,0xb9,0xa2,0xba,0x79,0x9d,0x69,0x00,0x13,0x59,0x2f,0x3d,0xef,0x10,0xe7,0x3c,0x02,0x7d,0xa3,0xa8,0xee,0x31,0x1a,0xad,0xa6 +.byte 0xdb,0x1b,0xe3,0x4a,0xdd,0x60,0xfb,0x4e,0xa6,0x49,0xbb,0xea,0x34,0x5d,0x21,0xac,0x83,0xa4,0xb5,0x23,0x8e,0x69,0xb3,0x25,0x14,0x8d,0xc2,0x89,0x8d,0xcf,0x38,0x46,0x18,0xb6,0x0c,0xce,0x45,0x22,0xeb,0xb5,0xb2,0xed,0xe5,0x0f,0x35,0x8f,0xdd,0xa1,0x15,0xd6,0x50,0x5b,0xe1,0x04,0xa7,0x32,0xc0,0xc9,0x03,0x56,0xc2,0x33,0xe8,0x16 +.byte 0x1c,0xd4,0x7a,0xfd,0x6b,0x4d,0x04,0xc0,0x9e,0xf8,0x32,0x9f,0x52,0x24,0xac,0xc5,0xb0,0xa1,0x63,0x77,0xc9,0x14,0xaf,0x46,0x60,0x67,0x52,0x81,0xbb,0x3f,0xf5,0x7f,0xad,0xef,0x7c,0x3a,0x71,0xc1,0x1e,0xea,0x4a,0xe0,0xd7,0xdd,0x31,0xf2,0x4b,0xdf,0x53,0x8a,0xc9,0x59,0x7a,0xb2,0x6f,0x7e,0xc0,0x00,0xa4,0x0d,0x09,0x9c,0xf7,0x22 +.byte 0x22,0xa9,0x37,0xde,0x3b,0xe1,0x74,0x85,0xcf,0xc5,0xb7,0x7b,0x0a,0xfd,0x6b,0xfa,0x98,0x49,0xa9,0x7f,0x52,0x23,0x0e,0xc0,0x4a,0xb3,0x81,0xa6,0x96,0x46,0x24,0xe7,0x01,0xd1,0xf2,0xac,0x31,0xb2,0x5e,0x61,0xe3,0xab,0xf8,0x1b,0x28,0xca,0xa2,0x78,0x3c,0xdf,0x8a,0xc1,0x17,0x46,0x9d,0xbd,0x69,0x31,0x41,0x8b,0xc1,0xc8,0xaa,0x68 +.byte 0xd5,0x35,0x65,0x49,0xfe,0xc6,0xa4,0x99,0xcc,0x62,0x4b,0x81,0x1c,0x21,0xa4,0xd8,0xe3,0xb3,0xe9,0x7c,0xf8,0x33,0x2f,0x21,0xa5,0x88,0xf2,0x8e,0x7d,0xee,0x00,0x00,0x62,0xcf,0x07,0x37,0x00,0x68,0x6c,0xb5,0x2d,0xc6,0x1b,0xcc,0x86,0x71,0xf0,0x4f,0x68,0xaf,0x0c,0x9a,0x25,0x69,0x71,0x2d,0xb5,0x87,0x90,0x02,0xd3,0xfc,0xbb,0x63 +.byte 0xa9,0xf1,0x13,0x4f,0xda,0x71,0x69,0x5c,0x0b,0xfd,0x3f,0x6c,0x2f,0x0b,0x4f,0x07,0x72,0x2d,0x2f,0x77,0xcb,0xa4,0xe4,0xbd,0x30,0xc7,0xe4,0xd9,0xf9,0x5d,0x2f,0x65,0xe4,0x41,0x5c,0xbc,0x03,0xa2,0x01,0xf9,0xfa,0x06,0x14,0x52,0x08,0x44,0x67,0x75,0x4e,0xbd,0x66,0x4a,0x26,0x3a,0x49,0xc4,0xba,0x02,0xb3,0x8e,0xa2,0x42,0xe7,0x92 +.byte 0x03,0x6d,0x61,0x10,0x73,0xd0,0x6f,0xe1,0x6e,0x67,0xff,0xb0,0x29,0x62,0x70,0x3c,0xeb,0x80,0xed,0x11,0x06,0xd6,0x18,0x60,0xe1,0x3d,0x21,0xa9,0xe9,0xd2,0x92,0x00,0x9e,0x13,0xf2,0x5d,0x38,0x71,0xdf,0xf3,0x5f,0x8a,0x90,0x45,0xf0,0x47,0x1f,0x0b,0x2d,0x12,0xf7,0x10,0x07,0x6a,0x52,0xe8,0xe2,0x26,0x9b,0x4b,0x7a,0x5f,0x97,0xb6 +.byte 0xf1,0x6d,0x47,0x3a,0x1e,0xc8,0x1d,0x78,0x5b,0x0a,0xb8,0x03,0xb1,0xe1,0xe7,0xc8,0xf0,0xe7,0x00,0xac,0xfc,0xd7,0x4a,0xde,0xaa,0xcd,0x0f,0xaf,0xf7,0x56,0x8e,0xed,0xfb,0xbe,0x7e,0xfe,0x62,0x75,0x7a,0x07,0x96,0xff,0xc3,0x21,0x35,0x71,0xb9,0x73,0x41,0xc2,0xb0,0xa8,0x6a,0x65,0x48,0xc4,0x50,0x31,0xe2,0xba,0xf4,0xe9,0x6c,0x03 +.byte 0x26,0x2c,0x77,0xfe,0x1a,0xd5,0x96,0xf6,0x6d,0xe4,0x14,0xfc,0xe2,0x1d,0x20,0x0c,0x14,0xa2,0x39,0x63,0xe5,0x16,0xef,0x6a,0xeb,0xe1,0x69,0xb8,0x67,0xa0,0x91,0xc1,0x8f,0xed,0xff,0xdf,0x26,0x1f,0xc3,0xb7,0x5d,0xe9,0xd2,0x72,0xe2,0x54,0x27,0x46,0x4f,0x33,0x25,0x59,0xaf,0xfa,0x87,0x4b,0x5a,0xda,0x7d,0x15,0x71,0x5d,0xb4,0x8d +.byte 0x95,0xb6,0x09,0x5b,0x8b,0xeb,0xe6,0xba,0xc8,0x2f,0x8f,0x9e,0xa8,0xab,0x6a,0xa6,0x26,0xb6,0xf5,0x80,0xd0,0x7d,0xe7,0x4c,0x18,0x5a,0x72,0x8f,0x3e,0x90,0xe5,0xa1,0x16,0x33,0x66,0xc3,0x7b,0xf6,0xb6,0xdd,0x15,0x94,0x6d,0xca,0x8b,0xd7,0xa5,0x05,0xfb,0x5f,0x4e,0x94,0x6a,0xcc,0x54,0xed,0xeb,0xc0,0xb1,0xe1,0xc9,0x7f,0xc4,0x90 +.byte 0x2f,0x50,0x34,0x81,0x3c,0x83,0x47,0x3c,0x5a,0xb2,0x33,0x63,0xb6,0xa7,0xfb,0x59,0x70,0x87,0xea,0x7f,0x30,0x22,0xb4,0x54,0x48,0xfb,0x40,0xd2,0x7b,0xc9,0x49,0x80,0x18,0x27,0xc2,0x75,0x09,0x06,0x0a,0x83,0x1e,0x7a,0xf1,0x97,0xa1,0xc2,0x34,0x3f,0x6d,0xd6,0x2d,0xfe,0x5d,0x8b,0xfd,0x64,0x5d,0x6f,0x7f,0xbf,0x4e,0x01,0xb7,0x46 +.byte 0xfb,0xf7,0xd5,0x6f,0x5f,0x74,0xc8,0xca,0x9a,0x2e,0x74,0x08,0xe9,0x3d,0x8b,0xfd,0x97,0x38,0x72,0x67,0xbb,0x8a,0x34,0xee,0xf5,0x3a,0x2b,0x5e,0x64,0x64,0x06,0x7c,0x60,0x0f,0x7a,0x88,0x45,0x1b,0x69,0x90,0xb8,0xb0,0x4d,0x71,0x80,0x77,0xa8,0xaa,0x9f,0xd3,0xc6,0xfb,0xb8,0x12,0x1e,0x0c,0xf4,0x94,0x67,0x44,0xdc,0xb1,0x95,0x0e +.byte 0x51,0xd1,0x06,0x69,0x92,0xbf,0xe6,0x67,0xe3,0xcd,0x0b,0x87,0x03,0x12,0x2e,0xa7,0x23,0x72,0x13,0xe9,0x89,0xcf,0x15,0x43,0xc0,0xa7,0x68,0xbd,0xce,0xec,0x28,0xb6,0x85,0x36,0xbe,0x52,0x5d,0x57,0xfa,0x7d,0x72,0xd1,0x4b,0x88,0xc9,0x64,0xbc,0x7a,0x18,0xe5,0x0e,0xab,0x19,0x81,0xee,0x11,0xbe,0xe0,0x68,0x44,0x81,0x49,0x3f,0xd8 +.byte 0x12,0xd1,0x8b,0xc1,0xe0,0x51,0xf7,0xc3,0x64,0xa7,0xc5,0x61,0x9b,0x32,0x6d,0xf0,0x6c,0xa6,0xaf,0xf9,0x4a,0xdf,0x94,0xaf,0xc8,0xf2,0x86,0xb1,0x4e,0x2e,0xa9,0xb4,0x35,0x82,0x15,0x8a,0x58,0xf3,0x03,0x2f,0x78,0x07,0x8f,0xb9,0x16,0x7c,0x42,0xfa,0x36,0xaa,0xa5,0x66,0x62,0x44,0xca,0xa6,0x55,0x95,0x27,0xdb,0x48,0xea,0x0a,0x1d +.byte 0x5a,0xae,0x5c,0xad,0x99,0xfe,0x00,0xf1,0xb9,0x94,0xda,0x09,0x48,0x52,0x9d,0xfc,0xb4,0xb2,0x80,0x19,0x16,0xf8,0xcd,0x68,0x10,0xec,0x1c,0x16,0x3f,0xbb,0x42,0xb4,0x10,0xe3,0xdb,0xaa,0xe4,0x3f,0x2e,0x8e,0xb5,0xce,0xba,0x8f,0xf2,0xb5,0x76,0x98,0x15,0xa7,0x77,0x4b,0x1c,0x30,0xb7,0x6f,0xc9,0xa9,0xa4,0x64,0x59,0xab,0x3a,0x43 +.byte 0x74,0x33,0xab,0xe1,0x3e,0x5e,0x79,0x1c,0xa5,0xb4,0x87,0xe1,0xcb,0xea,0x0e,0x02,0x4b,0x01,0x84,0xbc,0xdc,0x75,0xf4,0x2c,0x2b,0x8d,0xc8,0x5f,0xb5,0xba,0x6b,0xb2,0x4a,0x7c,0xe7,0xaa,0x61,0xa5,0x0c,0xf8,0x02,0x73,0xec,0x11,0x13,0x6b,0x31,0x07,0xaa,0x79,0x78,0x86,0x01,0x77,0x5e,0xa3,0x09,0xd1,0xec,0xaf,0x7d,0xb7,0x65,0xa9 +.byte 0xd8,0x99,0xd2,0xd7,0x6d,0x32,0x97,0x0f,0x0e,0x51,0x0d,0x69,0x81,0x7a,0x94,0x48,0x31,0xe1,0xff,0x26,0x4d,0x30,0x49,0x93,0xfb,0x6e,0xdb,0xea,0xaf,0xcb,0xb4,0xa9,0xc9,0x9f,0xeb,0xca,0x52,0x36,0x26,0xac,0x47,0xda,0x02,0x3d,0xd0,0x93,0x8b,0x61,0x78,0x26,0x54,0x32,0xe8,0x14,0xac,0xf3,0xd2,0x46,0x04,0x12,0x89,0x9f,0xf6,0x11 +.byte 0xf5,0x64,0x83,0x66,0x00,0x50,0x55,0x05,0xb5,0xf6,0x58,0x9f,0xbf,0x4b,0x95,0xf1,0x7f,0x0b,0xb4,0xf7,0x63,0xea,0x6f,0xf7,0xb0,0x20,0x53,0xfe,0x95,0xbc,0xc4,0xe2,0xff,0x75,0xbd,0xab,0x73,0x68,0x44,0x18,0xf7,0x6b,0x04,0x46,0xde,0x6c,0x65,0xb2,0x22,0x4e,0x25,0x8e,0xba,0x7c,0x3a,0x6f,0x80,0x99,0xb4,0xe7,0xf9,0x97,0x68,0x40 +.byte 0xa9,0x96,0xfc,0x6b,0xcf,0x08,0x75,0xe4,0xda,0x6f,0xaf,0x71,0x4f,0x31,0x62,0x31,0x18,0xbf,0xb9,0xa0,0xcc,0x9e,0xa7,0xa2,0x27,0x2a,0xb8,0x6b,0xc0,0x93,0xf5,0x1f,0x41,0x25,0xa7,0x4d,0x9f,0xb4,0x12,0x5c,0x27,0x38,0x5d,0x80,0x88,0xa3,0xb8,0xb2,0xc3,0xd2,0xfb,0x1d,0xba,0x7b,0xac,0x51,0x0b,0x71,0x58,0x3f,0xe5,0xfa,0x36,0xb8 +.byte 0xc7,0x90,0x46,0xd0,0x5a,0x94,0xf0,0x7d,0x6e,0x6c,0x4c,0xb1,0xfa,0xdb,0x97,0x1e,0x19,0xf2,0x1f,0x4e,0x05,0x25,0x0e,0xbd,0x47,0x94,0x2a,0xd3,0x1a,0xbe,0x4a,0x04,0xaa,0x57,0x02,0xc9,0x42,0xc1,0x74,0xcd,0xe1,0x78,0x8b,0xff,0xc1,0xc6,0x17,0x4e,0x71,0xc4,0x2c,0x00,0x23,0x56,0x57,0x1f,0x47,0xd8,0x93,0x80,0xc1,0xc5,0x7b,0xd9 +.byte 0x25,0x30,0xac,0x72,0x37,0x00,0xd2,0xbc,0xc7,0x33,0x73,0xf9,0x14,0x86,0x7c,0xb0,0x28,0x14,0x5d,0xbf,0xbd,0x98,0x1c,0x00,0x05,0x19,0x2b,0x0a,0x55,0xad,0xb4,0x06,0x28,0x58,0x03,0xa1,0xe6,0x27,0xa3,0x32,0x5f,0x41,0xd5,0x6a,0x0b,0xbc,0x0f,0xaa,0xf5,0xc1,0xa7,0x09,0x2f,0x86,0xda,0x56,0xb0,0x04,0x49,0xd4,0x20,0xc6,0xa2,0x6c +.byte 0x27,0x56,0x4e,0xcd,0x22,0x46,0xac,0x0f,0xd3,0x99,0x69,0x83,0xc4,0xae,0x9f,0x88,0xed,0x9c,0xba,0xfb,0xf3,0x66,0xc7,0x3d,0x65,0x55,0xd0,0xe3,0x04,0x03,0x6a,0x02,0x5c,0xbf,0x9f,0x23,0x34,0x79,0xe1,0xbe,0x7d,0xad,0xb4,0xc7,0x9e,0x4d,0x80,0x73,0x6d,0xe5,0x37,0x03,0xac,0xa3,0xf4,0x93,0xad,0x1e,0xf3,0xcd,0xb8,0xe2,0xeb,0x30 +.byte 0xc7,0x50,0xfe,0x0a,0x63,0x5e,0x0f,0xc9,0xd0,0x06,0x58,0xc1,0x6e,0x65,0x54,0x54,0x5d,0xaf,0xf1,0xe8,0x3e,0x95,0xe3,0x70,0x40,0x8e,0xb8,0x4d,0x76,0xda,0xa8,0xe8,0x9e,0x88,0xd8,0xaf,0x67,0x83,0x3b,0x77,0x65,0x58,0x00,0xbb,0xf7,0xe9,0x52,0xf0,0xba,0x0d,0x0a,0x59,0x28,0xe4,0xa7,0xfb,0x06,0xe5,0x34,0xbe,0xcf,0x10,0x7c,0x73 +.byte 0xa8,0xf3,0xa2,0x93,0x96,0x9e,0x4f,0x9b,0x3c,0xd1,0x9f,0x64,0x5b,0x8c,0xc1,0x89,0x66,0x67,0x13,0x52,0xb2,0xaa,0x6b,0x8e,0xea,0x97,0x27,0x20,0x2e,0x64,0xec,0xf0,0x72,0xc9,0x54,0x8a,0xed,0x78,0x3a,0xd7,0x4f,0xc2,0xba,0xc3,0xb8,0x64,0x7f,0xe4,0x5f,0x3d,0xf7,0xe5,0xd9,0xf1,0x8d,0xb1,0xd2,0xf6,0xcc,0x34,0xd8,0x7d,0x16,0xca +.byte 0x47,0xaf,0x85,0xe5,0x4a,0x57,0xb9,0x5a,0x9e,0xff,0xb8,0x83,0xec,0x7c,0xb8,0x07,0xf5,0xd3,0x31,0x31,0x2b,0xf0,0x40,0x46,0xc3,0x63,0x27,0xe4,0xb0,0x3b,0x84,0x0d,0x50,0x05,0x80,0x0c,0xfa,0x8b,0x0e,0x33,0x6b,0x10,0xd4,0xf5,0x4f,0x8b,0x2d,0x9e,0xc5,0x01,0x92,0x52,0x62,0x1a,0x89,0x1e,0xca,0x48,0xc3,0xd6,0xfa,0xd2,0x94,0x7c +.byte 0x77,0x6e,0xa7,0xeb,0xd7,0x4f,0xe8,0xc8,0xc2,0x71,0xb2,0x9e,0x86,0x30,0x18,0xfd,0x4c,0x56,0x4c,0xd0,0xa4,0x84,0x37,0x02,0x02,0x6a,0x8d,0x57,0x6b,0xc2,0x06,0xd1,0x8a,0xdb,0xa0,0xcc,0x31,0xf9,0xcf,0xbf,0xf2,0x29,0x7c,0x26,0xac,0x1f,0x03,0x20,0x26,0x76,0x03,0x6f,0xa5,0xb5,0x33,0xfb,0x02,0xe8,0xf6,0xe9,0x5e,0xb1,0x36,0x7c +.byte 0x96,0x56,0xb1,0x98,0x2d,0x9c,0x38,0x9b,0xd4,0x56,0x28,0xcc,0xdb,0x08,0xd3,0x42,0x00,0x35,0x24,0xd9,0x74,0xa2,0x0d,0x55,0x21,0x06,0xb7,0xf9,0x6a,0xa0,0x81,0xc1,0x2d,0xb6,0x67,0x91,0x92,0x24,0x36,0xfd,0x2e,0xd8,0xc0,0xcb,0xc8,0x87,0x1a,0x41,0x11,0x70,0xbf,0xd2,0xe7,0x82,0x10,0x74,0xdf,0x65,0x46,0x19,0x6b,0xb4,0x89,0xeb +.byte 0x9e,0xcf,0x79,0x35,0xba,0x25,0x75,0x32,0x64,0x6a,0xfb,0xaf,0xe5,0xed,0x85,0x98,0x34,0x75,0x31,0x40,0xbb,0xd8,0xe3,0xf5,0xa7,0xa2,0x9a,0x9e,0xcd,0xc4,0xf8,0xd8,0x15,0x6c,0x64,0x0c,0x6c,0x16,0x60,0xe9,0x40,0xf4,0x7a,0x14,0x37,0x7b,0x45,0x9b,0x0e,0x29,0x7a,0x1a,0x88,0x10,0xb9,0x2b,0xee,0x13,0xbd,0x8a,0xde,0x7a,0xe9,0x30 +.byte 0xe8,0x39,0x77,0x74,0xf5,0x2f,0xe3,0x10,0x19,0x89,0x28,0x21,0x3a,0x68,0x38,0xb4,0x4d,0x20,0x8d,0x7d,0xec,0x3f,0xf7,0x61,0xbf,0x53,0x32,0x3b,0xb8,0x6a,0xc9,0x58,0xeb,0xd4,0x33,0x0e,0xee,0xc7,0xb9,0x5e,0x3d,0x17,0x7e,0x36,0xa2,0xa6,0x94,0xb1,0x56,0xb6,0x8e,0x94,0x05,0x50,0x69,0x52,0x4f,0x31,0xe5,0x97,0x18,0xde,0x8f,0xb7 +.byte 0xff,0x2e,0x6f,0x1b,0x6a,0xda,0xfd,0xa1,0xd1,0x9a,0x4e,0x6a,0x1b,0x46,0x71,0x52,0x76,0x66,0xf9,0x70,0x8d,0x7d,0x97,0xb0,0xc3,0x8d,0xbc,0x35,0x26,0xe8,0x0b,0x80,0xc7,0x58,0x19,0x22,0x70,0x33,0x06,0xeb,0xcf,0x26,0x22,0xe0,0x97,0x91,0xbf,0xd6,0x94,0x05,0xe1,0x84,0xe2,0x31,0x66,0x57,0xc7,0x1e,0x36,0x30,0x50,0xaf,0x72,0xb3 +.byte 0x31,0xad,0x84,0xcc,0xb5,0x76,0x03,0xe1,0x56,0x97,0x87,0x36,0xf5,0xaa,0x97,0x99,0x38,0xa5,0xf5,0xb7,0x42,0x86,0x3b,0x2f,0x8a,0xb9,0x8e,0x6a,0x0b,0xe0,0xca,0xbc,0x4c,0x6c,0xc1,0x3f,0xbe,0x45,0xef,0xd2,0x57,0xcd,0x29,0xfb,0xfb,0xa5,0x79,0xf2,0xb1,0xbb,0x4b,0x55,0x26,0x2f,0x5c,0x84,0x5e,0x6a,0xc6,0xa9,0xd5,0x23,0xe4,0xd1 +.byte 0xe5,0xf0,0xbc,0x50,0x6a,0x2a,0xaf,0xa2,0x7c,0xcc,0x36,0x95,0xf9,0x5c,0x04,0x6d,0x04,0x31,0xbe,0x1d,0xb2,0x50,0x97,0x8f,0xdf,0x8a,0xed,0x4e,0x4e,0x0a,0x0b,0xfc,0xfc,0x1d,0xa9,0x6a,0x76,0x6a,0x33,0xd7,0x0a,0xcf,0xd5,0xdd,0xc6,0x62,0xe5,0x59,0x02,0xba,0x9c,0x43,0x32,0x8a,0x0e,0x47,0x91,0x00,0x07,0x47,0x93,0xc4,0xad,0x29 +.byte 0x33,0x57,0x15,0x45,0x44,0xb9,0xf3,0xc4,0xe6,0xd2,0xb9,0x3a,0x44,0x16,0x32,0x8d,0x57,0x78,0xac,0xf5,0xdb,0xa2,0x93,0x97,0x64,0x08,0x9b,0x66,0x4b,0xa0,0x64,0xab,0xa0,0xd6,0x0e,0x2c,0xa1,0x25,0x16,0x5c,0x6f,0x82,0xff,0x8e,0x89,0xfb,0xca,0x03,0xa6,0xf8,0xa1,0xf6,0x87,0x02,0x5c,0x90,0xcb,0x33,0xa0,0xc0,0x90,0xc2,0x1f,0xdd +.byte 0x5c,0x50,0x93,0xf2,0x8b,0x87,0xa1,0x73,0xda,0x5f,0xa3,0x20,0xd4,0xe7,0x45,0xd7,0xea,0x4b,0x5d,0xd6,0x80,0xfc,0x2d,0xdc,0x45,0x6a,0xf6,0xaf,0xd4,0x7a,0x91,0x64,0x15,0x17,0xbf,0xc7,0x58,0x54,0x7c,0x08,0x42,0x4f,0x8d,0xab,0x9b,0xd0,0x1d,0x57,0x71,0x50,0xa7,0xe3,0xb4,0xf2,0x14,0x0c,0xd7,0x2f,0x7c,0x8b,0x17,0x61,0x98,0xfa +.byte 0x19,0x34,0xb9,0x65,0xc5,0x5c,0xfe,0xa3,0x80,0x6f,0x99,0xec,0xfa,0x06,0x22,0x71,0xa9,0x10,0x2a,0xcf,0x12,0xb3,0x17,0xe5,0x59,0x3a,0xaa,0xcb,0x55,0x5f,0x45,0x9d,0xe9,0x29,0x56,0x34,0x11,0x62,0x6e,0x0a,0x95,0x12,0x5d,0xd4,0xa2,0x28,0x05,0xf1,0x0f,0x2d,0xa0,0x1e,0xe1,0x2b,0x42,0x6c,0xf0,0xe6,0x47,0xe0,0xb2,0xbd,0x89,0x20 +.byte 0x5e,0x24,0x05,0xec,0xf1,0x33,0xfc,0xa9,0x2f,0xef,0x3a,0x1f,0xfe,0x39,0xfe,0x01,0x09,0x0a,0x2a,0xe0,0x96,0x1e,0xde,0xad,0x96,0xaa,0x48,0xeb,0x8a,0xe6,0x54,0xbb,0x5d,0x7a,0xbe,0x4a,0xbf,0x96,0xf6,0x15,0x7a,0x70,0x6f,0xee,0xe7,0xf5,0x53,0xaf,0xe1,0xbb,0xaf,0x58,0x51,0xd4,0xa0,0xc6,0x44,0x03,0x47,0x33,0xce,0x58,0x62,0xd3 +.byte 0x93,0x21,0xa5,0xa5,0xb4,0xef,0x1d,0x93,0xcc,0x8c,0xf7,0x14,0xe3,0xec,0x40,0x52,0x47,0xe6,0xbc,0xe6,0x85,0x69,0xd0,0x15,0xad,0x24,0x21,0x4f,0x26,0x01,0x60,0x0f,0x0f,0xcb,0x7e,0x14,0x01,0xe1,0x90,0x11,0x06,0x17,0x38,0x2d,0xd8,0x26,0xe2,0x7c,0xd6,0xef,0xe0,0x59,0xf0,0x8c,0x2a,0xbd,0xba,0xe5,0x8b,0x07,0x56,0xd3,0x35,0xb3 +.byte 0x64,0x83,0x9e,0xb9,0xb9,0xeb,0x88,0x03,0xff,0x14,0xf3,0x8b,0x14,0xd3,0xa4,0xac,0x08,0xd9,0x75,0xf6,0x2c,0x9d,0x7f,0xc8,0x9d,0x11,0x3b,0xd1,0x71,0x14,0x4b,0x2a,0x6d,0x20,0x83,0x32,0x35,0x7e,0x1f,0x20,0xa6,0x69,0xbf,0xcf,0x22,0xd9,0xa2,0x57,0x4b,0x66,0xb1,0x9f,0x5a,0xa8,0xaa,0xb8,0x11,0x1d,0x45,0x28,0xac,0x86,0x09,0x37 +.byte 0xe9,0x1f,0xef,0xb4,0xe0,0x6f,0x75,0xad,0xe5,0xd8,0x25,0x06,0x19,0xb4,0xa8,0x07,0x78,0x79,0x43,0x63,0x40,0x26,0xbd,0x28,0x50,0x2d,0x29,0x26,0xf9,0xfc,0x5c,0x71,0x8f,0xfd,0x62,0x12,0x7c,0xd0,0x67,0xb3,0x65,0xef,0x31,0xc0,0x99,0xc1,0x54,0xfc,0x32,0x6e,0x25,0x56,0x77,0x6e,0xc1,0x6b,0x11,0x50,0x7c,0xa1,0x0b,0x97,0x8a,0xfe +.byte 0x0f,0x5b,0x16,0x93,0x83,0xe0,0xd8,0xb7,0xbf,0xa8,0x90,0x6d,0xd6,0x8b,0x4b,0xd9,0x17,0xbb,0xe8,0xd9,0xbb,0x5f,0x39,0x4a,0x33,0x7c,0xb3,0x12,0x99,0x1e,0xfc,0xb2,0x05,0x91,0x67,0xdf,0x8d,0x0b,0x55,0xfb,0xd1,0x8d,0x0c,0x9b,0x80,0x81,0xee,0x8c,0x05,0xe2,0x16,0x30,0xad,0x1f,0x88,0x04,0x75,0xc1,0xe5,0xec,0x32,0xf8,0xa0,0x5b +.byte 0x21,0xf6,0xd8,0x13,0x26,0xe4,0xa1,0x32,0xa8,0x93,0x91,0x5d,0x33,0x45,0x83,0x72,0x52,0x59,0x23,0x84,0xf6,0x7b,0xe2,0x90,0x20,0xc6,0x40,0x33,0xa9,0x94,0xcd,0xb9,0xab,0xe4,0x44,0x0b,0x06,0xbb,0x4c,0x2c,0x2a,0x5e,0x4d,0x57,0xb7,0xe0,0xb8,0x86,0x74,0xab,0xea,0x37,0x1c,0xa0,0xa6,0x21,0x33,0xc7,0xf5,0x24,0x7d,0x14,0xc8,0x8b +.byte 0x9d,0x8f,0x31,0x23,0x29,0x9d,0x11,0x42,0x07,0xe8,0x2c,0xec,0x7d,0x70,0x8d,0xb5,0xa4,0xca,0x33,0x30,0x03,0x75,0x17,0xa1,0x10,0xe7,0x6b,0x87,0xf9,0x0b,0xef,0x43,0xef,0xf8,0x24,0xc2,0xf1,0x7a,0x1a,0x70,0x7e,0x2f,0xd4,0xeb,0x97,0x40,0xa6,0xe6,0x2d,0xc1,0xd8,0x3b,0xee,0xa4,0xda,0xd3,0x50,0x41,0x18,0xbf,0xad,0x66,0x02,0x85 +.byte 0x60,0x14,0xcf,0xce,0x50,0x88,0x5e,0xb6,0x73,0x11,0xbb,0x6a,0xca,0xb1,0x46,0x8e,0xbb,0x58,0x2c,0x63,0x61,0x20,0xec,0xc9,0x98,0x0c,0xdb,0x5c,0xe5,0x47,0xb5,0x89,0xe9,0x14,0xc8,0xbc,0x35,0xf2,0xa7,0x2d,0x84,0xcc,0x61,0xc8,0xb6,0x9d,0xeb,0xcb,0x8b,0x73,0x90,0x6d,0x06,0xc9,0x42,0xcf,0xd2,0x15,0x80,0x2d,0x39,0xeb,0x71,0x83 +.byte 0x27,0x0d,0x85,0xf9,0xa3,0xce,0xef,0x29,0x3b,0x10,0xb7,0xe9,0xd0,0x86,0x6e,0x88,0x1e,0x3b,0xdd,0xaf,0x52,0xde,0xa2,0xa4,0x13,0x3c,0x1f,0xcb,0x84,0x74,0x12,0x04,0x91,0x40,0xb8,0x1b,0x15,0xfd,0xdb,0xe8,0x74,0xcc,0x4d,0x41,0xb5,0x5a,0x92,0xd3,0x71,0xf7,0x57,0xa5,0xf7,0x18,0x5a,0x57,0x36,0xde,0x8f,0xb2,0x81,0x59,0xc8,0x5c +.byte 0x22,0xcf,0xdc,0x7d,0xff,0x83,0xf2,0xad,0x8c,0x7b,0xd5,0x04,0xc4,0xb9,0x79,0x4a,0x12,0xa7,0xb1,0x7e,0x57,0xa5,0x6b,0x56,0x8a,0x11,0x96,0x57,0xde,0x35,0xdd,0xef,0x9b,0x03,0x41,0xde,0x61,0x5b,0x73,0x8c,0x6a,0x0c,0x6f,0xae,0x45,0x4b,0x56,0x4d,0xbe,0x8a,0x3f,0xdb,0x79,0x58,0x88,0xad,0xcb,0xfa,0x66,0x06,0x0e,0x74,0x21,0x1d +.byte 0xe1,0x94,0xd7,0x06,0xea,0x60,0xe2,0x7d,0x70,0xcf,0xa9,0x4f,0xe6,0x9b,0xba,0x19,0x71,0x69,0x94,0x66,0x5a,0xb8,0x49,0x0c,0xd1,0x9a,0xc4,0x5f,0xa7,0xf4,0x9e,0x3d,0x9e,0xc2,0xd8,0x0e,0xd2,0x6d,0xc6,0xc8,0x99,0xc3,0x5e,0x3b,0xb9,0xd8,0x48,0xc0,0x38,0x48,0x95,0x89,0xff,0x7e,0x1d,0x80,0x53,0xac,0x7b,0xd7,0xfc,0x6f,0x5d,0x25 +.byte 0x2f,0xcf,0x15,0xdb,0x1a,0x64,0xc1,0x16,0x91,0x65,0x84,0x99,0x0a,0xc1,0xbf,0x4d,0x11,0xa5,0x55,0x55,0x35,0x93,0x6f,0x47,0xf1,0x75,0xb8,0xb6,0x11,0x9d,0x6e,0x3b,0xd1,0x11,0x20,0xa2,0xa2,0x5c,0x33,0x85,0x09,0xb8,0x13,0xc9,0xdd,0xf2,0xd4,0x32,0x37,0xf2,0xef,0x47,0xfa,0x25,0x1a,0xcc,0xdf,0xf4,0xe4,0x2c,0x2c,0x7f,0x23,0xb6 +.byte 0xa8,0xd4,0x6a,0xd4,0xb4,0x06,0x2e,0xb0,0xaa,0xa1,0x18,0x8a,0x5c,0xc6,0xb2,0x4c,0x71,0x92,0x4a,0xdc,0x81,0x20,0x51,0x8d,0x3f,0x71,0x7d,0x8c,0x25,0x79,0x07,0x14,0xa9,0x7a,0x8b,0xda,0x00,0xfc,0x51,0xdb,0xa0,0x50,0x2b,0x15,0x39,0xf6,0xad,0xdc,0x9e,0x22,0x93,0x2f,0x43,0xd8,0x5c,0xa2,0x5e,0xfa,0x70,0x8c,0xe0,0x6b,0x0e,0x93 +.byte 0x6c,0x89,0xfe,0x22,0x4c,0xec,0xb0,0x7e,0xc1,0x06,0x69,0xf7,0x2f,0x3e,0xe5,0xa4,0x45,0x53,0xab,0x9c,0xf5,0x40,0x05,0x53,0x64,0xc6,0xa7,0xf9,0xc4,0xd6,0x89,0xd9,0x47,0x72,0x8e,0x42,0xf9,0x64,0x12,0xeb,0xd9,0x25,0xdc,0x4c,0xc6,0xea,0x9c,0x4b,0x93,0xb4,0xa2,0xa6,0xae,0x95,0xc1,0x84,0x75,0xc9,0x22,0xe3,0x22,0x81,0x31,0xd1 +.byte 0xfd,0x2e,0x91,0x4a,0xc3,0x00,0xa6,0x57,0xbb,0x89,0x9f,0x2d,0xc3,0x2e,0x1f,0xa2,0x47,0xc4,0xa3,0xcd,0x2b,0xc2,0x29,0xaf,0x89,0xce,0x2e,0x87,0x8e,0xd8,0xfc,0xee,0xab,0x8a,0xbd,0x2f,0xee,0xcf,0x94,0xe0,0x74,0x70,0x86,0x00,0x42,0x11,0x8b,0x6c,0x81,0xd4,0x82,0xf2,0x29,0x3e,0x9c,0x68,0x71,0xaa,0x20,0x0a,0x51,0x5d,0x80,0x4c +.byte 0xca,0x04,0x23,0x23,0xe2,0x69,0xb3,0xf5,0x65,0x98,0x19,0xee,0xa9,0x4d,0xd8,0xe0,0x06,0x4b,0x17,0xed,0xfa,0xf2,0xe3,0xd3,0x69,0x48,0xe4,0x4e,0xc0,0x5a,0x16,0x90,0xdb,0xb6,0x32,0x6e,0x6b,0xd7,0x7a,0xb6,0xd4,0x82,0xe4,0xcc,0x31,0x31,0x5c,0x18,0x84,0xef,0x75,0x9f,0xda,0xf6,0x62,0x2d,0x96,0x4d,0xa1,0x3c,0xb5,0x4a,0xbb,0xbf +.byte 0x9d,0xb3,0x33,0x00,0xc1,0x73,0xc5,0xb2,0xeb,0x85,0x74,0xb0,0x68,0xed,0x16,0x66,0x71,0xc9,0x7e,0x6f,0x74,0xa6,0xe7,0xed,0xf0,0xfa,0xab,0x41,0xdd,0x10,0xf9,0xff,0x4c,0xb6,0x4f,0x15,0xe3,0x77,0x31,0x17,0x5c,0x5a,0xef,0xb2,0xa9,0x44,0xbe,0x97,0xa9,0x75,0x5a,0xb7,0xe0,0x16,0x17,0x37,0x1b,0x71,0x03,0xb9,0xaa,0x7b,0x7b,0x52 +.byte 0x46,0x58,0x6b,0x9b,0x87,0x27,0xa6,0x8a,0x0e,0x84,0x03,0x45,0x95,0x04,0xf1,0x7e,0xb6,0xf6,0x79,0xd5,0x66,0x6d,0x50,0x8c,0x5a,0x67,0xe0,0xdd,0x69,0xd8,0x92,0x75,0x15,0xcb,0xa5,0x05,0xfe,0x7a,0xc1,0xd6,0x11,0x57,0x10,0xa3,0xc3,0xb6,0xe9,0xe3,0x97,0xa5,0x46,0xc9,0xe9,0x9b,0x68,0xb6,0x55,0x0b,0xf2,0x17,0x9d,0x0e,0x7f,0xd9 +.byte 0x26,0x0c,0x01,0xff,0x95,0xe1,0x05,0xb7,0xbf,0x0d,0x77,0x12,0x96,0x03,0x71,0x01,0xc9,0x98,0xb4,0x44,0x94,0xc0,0xad,0x3d,0xfc,0x6f,0xe5,0x0c,0xa4,0x65,0xd7,0xe7,0x76,0x7c,0xb8,0xa0,0x0a,0xcd,0xe8,0x01,0x26,0x8e,0x94,0xec,0x94,0x65,0x86,0xee,0x4d,0x3b,0xc5,0xb5,0x2e,0x51,0xb7,0xa9,0x68,0xcd,0x14,0x90,0xd8,0x36,0xfb,0x52 +.byte 0x04,0x52,0xb4,0xca,0x9b,0xbf,0xc6,0x94,0x28,0xc5,0x7e,0x27,0x73,0xae,0x6d,0xba,0xe7,0x56,0xce,0x2e,0x00,0xeb,0x36,0x19,0xd7,0x4f,0x20,0x5e,0xfd,0x0f,0xd4,0x4c,0x02,0xaf,0xdb,0x74,0xef,0xf0,0x73,0x1e,0x2a,0x1a,0xe7,0x3a,0xe0,0xa5,0x89,0xcf,0x1a,0x66,0xbd,0x72,0x65,0xb4,0xf4,0x86,0x33,0x44,0xee,0x35,0xf6,0x09,0xbe,0x13 +.byte 0x96,0x84,0x04,0x95,0x3f,0x35,0xbb,0x01,0x2c,0x78,0x25,0xe8,0x1e,0x46,0xdb,0xd9,0xb1,0xe8,0xfb,0x2b,0xa8,0x59,0x72,0x5f,0x91,0xd3,0x7c,0x21,0x95,0xa9,0x50,0xa2,0x45,0x6f,0x48,0x0c,0xf2,0x51,0x10,0x3c,0xcd,0xea,0xeb,0x5d,0xc7,0xf9,0x0e,0xae,0x1a,0x02,0x05,0x15,0x12,0x10,0xc0,0x35,0x12,0x97,0xcd,0x5b,0x61,0x4f,0xd1,0xd3 +.byte 0x5b,0xec,0x2b,0xa0,0x20,0x03,0x2b,0xf3,0xe6,0x71,0x23,0xca,0x1d,0x48,0x64,0x3f,0x7e,0x52,0x8b,0xf9,0x96,0x33,0x31,0xbc,0xbd,0x73,0x2f,0xa6,0x80,0xb8,0x0b,0x3a,0xd7,0xf8,0x05,0xf0,0x06,0xc7,0xa5,0xce,0x6a,0x6a,0x62,0xae,0x06,0x93,0xa4,0x5f,0x0b,0x5d,0x4d,0xb8,0xa4,0xfa,0x2e,0xfc,0xb6,0x58,0x8c,0x2a,0x46,0xa4,0x55,0x1f +.byte 0x9b,0x9b,0x13,0xdd,0x17,0x2a,0x3d,0x04,0x51,0xb6,0xbe,0x9c,0xca,0xf3,0x23,0xb6,0x7b,0x7a,0x92,0xb7,0x2f,0xf9,0x69,0x9a,0xee,0xb3,0xa1,0x60,0x56,0xcf,0x9d,0xab,0xfe,0x86,0x7a,0x41,0x94,0x15,0xbe,0xa3,0xa5,0x85,0x09,0xfb,0x7b,0x89,0xbd,0xc3,0x09,0x10,0xa6,0xfc,0x41,0x8e,0x57,0x27,0xdc,0x58,0xf4,0x01,0x7c,0x31,0x5e,0xca +.byte 0xaf,0x31,0x2f,0x98,0x8b,0xbe,0x19,0x16,0xa1,0x81,0x7e,0xb3,0xa9,0xc5,0x15,0xd2,0xad,0x51,0xa1,0x73,0x56,0xd3,0x6a,0x15,0x35,0xe3,0xb1,0xdb,0x83,0x4c,0xe2,0x85,0x8c,0x03,0x12,0xc4,0x64,0x69,0xc0,0x23,0x16,0x7b,0x68,0x46,0x44,0x22,0x84,0xa6,0xb5,0xe4,0x90,0x91,0xc1,0xdd,0x25,0x7c,0x54,0x0e,0xce,0x5b,0x11,0xe4,0x50,0x1c +.byte 0x3c,0x0d,0xc7,0xc1,0x0c,0x10,0x2d,0x8b,0xb7,0xde,0xe2,0x4f,0x7e,0x22,0x53,0xfc,0x07,0x55,0x19,0x14,0x3b,0x33,0xf5,0xf3,0xd8,0x7b,0x5e,0x40,0xa2,0x81,0x6d,0x40,0x0d,0x20,0x36,0x4b,0xa1,0x34,0x34,0xac,0x43,0x59,0xb5,0xb1,0x90,0x8b,0x48,0xcf,0x15,0x57,0x17,0x0e,0xd0,0xbf,0x28,0xcd,0xa4,0x77,0x4d,0xae,0x09,0x4c,0x67,0x51 +.byte 0x18,0xaa,0xb4,0xc9,0x35,0x41,0x0b,0x34,0x4d,0xb3,0xef,0x3f,0x46,0x97,0x6e,0xae,0x75,0xd7,0x6a,0x2b,0x22,0x9c,0xef,0x8e,0xaf,0x72,0xb0,0x14,0x90,0xbd,0x11,0x90,0xde,0x9a,0x02,0x8c,0x20,0xf5,0xc7,0x33,0x4d,0x94,0x88,0x9a,0x6c,0x18,0xb4,0xc0,0xa9,0x94,0x07,0x9a,0x4b,0x10,0x8f,0xe8,0x25,0xcd,0x9b,0xf5,0xfa,0x91,0x8a,0xc0 +.byte 0x93,0x61,0x1c,0x00,0xd1,0x34,0x9a,0x29,0xa3,0x35,0x38,0xe4,0xa7,0x9f,0xb6,0x88,0x0f,0xad,0x88,0x96,0xa0,0x73,0xe7,0x10,0xea,0x36,0xe8,0x88,0x6c,0x7f,0x03,0xbc,0xfe,0xe0,0xb2,0x4b,0x24,0x98,0xf6,0x73,0x6f,0xab,0x00,0x1e,0x26,0x83,0x0d,0x86,0x5b,0xa6,0x51,0x8f,0x5f,0xa9,0x8f,0xf4,0xa0,0x51,0xff,0xe0,0x64,0x09,0x95,0xfb +.byte 0x56,0x53,0x18,0x61,0xea,0xc5,0x33,0xe8,0x6f,0x8a,0x07,0x97,0x1a,0x6c,0xb5,0xf8,0x73,0xae,0xe4,0x4e,0x6d,0xb2,0x83,0x20,0xfa,0xfd,0x79,0xa6,0x6c,0xaa,0x9b,0x7b,0x2c,0xfe,0x63,0x73,0xbc,0x87,0xd4,0x56,0xd1,0xb1,0xf1,0x0f,0x72,0x2c,0x2f,0xf0,0xf0,0x53,0xe2,0x6c,0x19,0x0d,0x9c,0xad,0xc8,0x0a,0x62,0x72,0xcb,0xc3,0x12,0x90 +.byte 0x4c,0x26,0xe3,0xa0,0x07,0x35,0xee,0xaf,0x81,0x35,0x07,0xa9,0x31,0xa0,0x59,0xc8,0x40,0xa5,0x45,0xb6,0x6d,0x3e,0xa2,0x5f,0x6a,0x79,0x74,0x65,0xa1,0xe3,0x1c,0xca,0xae,0xcc,0xa6,0xb6,0x0a,0x12,0x99,0x8e,0xc3,0xef,0x43,0xcf,0x42,0x92,0xa4,0x12,0xa3,0x8b,0x97,0x7d,0x6f,0xe0,0x35,0xed,0xac,0x69,0xae,0x8c,0xe1,0x32,0x11,0xa4 +.byte 0xe0,0x76,0x7f,0x75,0x92,0xda,0xfe,0x94,0x33,0xeb,0xe1,0xa4,0x3c,0x95,0x7c,0xc6,0xbc,0x3d,0xf2,0x39,0xa1,0x29,0x39,0x24,0x09,0xd4,0x52,0x68,0xfb,0x80,0xd0,0xd4,0x57,0xc6,0x4c,0xa5,0xa6,0x90,0xa6,0x61,0x15,0x2f,0xd3,0x35,0x36,0xf5,0x16,0xb3,0x65,0x0a,0xc4,0xcb,0x7f,0x73,0xe4,0xba,0x9a,0xd8,0x8b,0xc3,0x01,0xa0,0x08,0x57 +.byte 0x9e,0x26,0x54,0xbc,0x55,0xd1,0x5f,0xaa,0xb5,0x0d,0x42,0x75,0x04,0x76,0x8c,0xef,0xcf,0x64,0x3a,0x2e,0x4c,0x78,0xe5,0x37,0x8d,0x55,0xec,0xc1,0x7b,0xce,0x5f,0x5f,0x43,0x8b,0xdd,0x46,0x43,0xf5,0xa8,0x41,0xa6,0x82,0x1b,0x12,0xcb,0xcb,0x6d,0xa1,0x6c,0xb6,0x79,0x46,0x12,0x89,0x12,0x61,0xd6,0x4f,0xf9,0x43,0x2d,0x27,0xa9,0x61 +.byte 0x2e,0x2a,0x29,0x1b,0x6d,0xad,0x32,0x0b,0x6c,0x7c,0xf4,0xb8,0x98,0x91,0xbb,0x78,0xda,0x85,0xe8,0xfb,0x4e,0x11,0xc4,0x2a,0x07,0x54,0xa0,0x67,0x73,0x1b,0xa4,0x60,0x15,0x5c,0x83,0xbf,0x3f,0xd9,0x61,0x30,0x02,0xbb,0xa6,0x67,0xcd,0x0c,0xd1,0xb4,0x11,0x7e,0xca,0xf4,0x1e,0xed,0x83,0x34,0x66,0x54,0x23,0x39,0x36,0x8c,0xa0,0xc6 +.byte 0xef,0xad,0xa1,0x95,0x04,0x20,0x46,0x42,0xa8,0x99,0xd2,0x98,0xc6,0x0a,0x92,0x11,0xd1,0x84,0x4a,0xbf,0x25,0xe5,0xcf,0x78,0x98,0x81,0x80,0xaa,0x31,0x0a,0xa4,0xfb,0xef,0x35,0xfa,0xa4,0xac,0x5f,0x01,0x6b,0xb7,0x8e,0x86,0xc1,0x46,0x97,0x88,0xe2,0xaa,0x3b,0x1f,0xb5,0xf8,0xa9,0x90,0xf0,0x45,0x6d,0xdd,0xa3,0xdd,0xd8,0xef,0x36 +.byte 0x6f,0x87,0x55,0xf6,0x96,0xcd,0x88,0x43,0x03,0x97,0x82,0xea,0x5a,0x1c,0xa1,0x1a,0x7b,0x1b,0xa7,0xfc,0xaa,0x86,0xb4,0x71,0xde,0x0d,0x0a,0x52,0x98,0xd2,0x65,0x5d,0xa4,0xea,0x91,0xc9,0xe4,0x8b,0xd0,0xdb,0x85,0xe3,0x86,0x85,0x50,0xe1,0x41,0x1f,0x48,0x97,0x64,0xec,0x34,0xe4,0x54,0x42,0xf4,0x01,0xed,0x6f,0x4d,0xe3,0x1f,0x86 +.byte 0x14,0xbc,0x01,0x9c,0x7f,0x02,0x0c,0x65,0x94,0xd2,0x90,0x2c,0x1b,0xab,0x41,0x88,0xad,0x58,0xb5,0x71,0xd3,0xd6,0xe1,0x3f,0xf3,0x3c,0xb6,0xab,0x22,0x08,0x17,0xc7,0xf5,0x7e,0x34,0x56,0xae,0x1d,0x1e,0x7e,0xdb,0x24,0xe2,0xc2,0x38,0xf3,0x4d,0x46,0xe4,0x45,0xcb,0xb7,0x2f,0x0f,0x96,0x72,0x7e,0x31,0x89,0x17,0x9c,0xed,0x85,0xb9 +.byte 0xc8,0x8f,0x65,0x93,0xfb,0xb8,0x9e,0x41,0xa2,0xc1,0xcf,0xdb,0xe2,0x4c,0x26,0x4a,0xc7,0x2a,0x72,0xf6,0x28,0xbc,0x18,0x22,0xde,0xa1,0xfa,0x46,0xbe,0x95,0xc8,0xe2,0x19,0xbb,0x20,0x7b,0xd5,0xf8,0x34,0x15,0xaa,0xec,0xe2,0x9e,0xa9,0x3d,0xa1,0xd9,0xaa,0xc9,0x18,0x39,0x07,0x5c,0x81,0x61,0xe7,0x00,0xc5,0x57,0x3e,0xca,0x4d,0x89 +.byte 0x33,0x02,0xa6,0xc8,0x15,0xb7,0x24,0xdd,0x5c,0x55,0x56,0x11,0x5c,0x17,0x1b,0xda,0xc6,0xd5,0x46,0x6e,0x9f,0x70,0xe7,0x1e,0x41,0xee,0x91,0x1a,0xa0,0xad,0x35,0x64,0xdf,0x4a,0x18,0x03,0xa7,0xa8,0x88,0x8f,0x65,0xbc,0x76,0x34,0x08,0xab,0x50,0xc6,0xd3,0x08,0x7c,0xc1,0x4f,0x77,0xcd,0x1a,0xc6,0xed,0x35,0xea,0x4e,0x8a,0x6a,0x38 +.byte 0xa3,0xa3,0xd8,0xa9,0xa2,0x68,0xa7,0xd8,0xe0,0xc8,0x3f,0xfe,0xe7,0x73,0xc6,0x6b,0xd8,0x0c,0xd5,0x8f,0x81,0xe7,0x37,0x08,0x93,0x28,0x73,0xef,0xc4,0x91,0x52,0xa5,0x30,0xff,0x47,0x95,0x02,0x0d,0x8c,0xfd,0xc9,0x28,0x60,0xa9,0xad,0x30,0x00,0xcc,0x3a,0x00,0xbb,0x25,0xab,0xd0,0xf8,0x25,0x46,0x20,0xc0,0x67,0x9b,0xd6,0x10,0xa6 +.byte 0x84,0x6f,0x66,0x60,0x66,0x75,0xb6,0xfb,0x39,0x3a,0x9f,0x7d,0x32,0x7f,0x12,0x6f,0x8c,0xed,0x79,0x40,0x47,0xa3,0x27,0x17,0xa8,0xa4,0x02,0x93,0xb9,0x32,0x03,0x34,0x06,0x76,0x71,0x40,0x90,0x2b,0xe7,0xd0,0x3f,0x59,0xa7,0xfb,0x3a,0x7b,0xc8,0xa5,0x86,0x21,0x0d,0xf6,0xc6,0x49,0x07,0x56,0xe9,0xfc,0xac,0x61,0x30,0xa5,0x7e,0x90 +.byte 0x10,0xc8,0xdb,0x15,0x2b,0x75,0x27,0x77,0x51,0x42,0xcf,0x50,0xe8,0x6c,0x0b,0xb7,0x17,0x1a,0x89,0x7d,0xfe,0xd2,0x75,0xfa,0xb7,0xe5,0x68,0x10,0x1c,0x27,0x85,0x8b,0x52,0x7d,0x87,0x57,0x50,0x77,0x25,0x9d,0xcc,0x08,0x6a,0xad,0x63,0xf8,0x8e,0xe0,0x21,0x62,0x56,0x48,0x29,0xed,0x81,0x1d,0x6b,0x60,0x55,0x78,0x6a,0xce,0xd6,0x79 +.byte 0xe1,0x66,0x18,0x9f,0x71,0xf7,0x0c,0xec,0x35,0x53,0xef,0x39,0xfe,0x57,0x71,0xc0,0x49,0x4b,0x55,0xe8,0x3d,0x9b,0xe3,0x9a,0xbb,0xf8,0x61,0x31,0xa1,0x94,0x94,0x8a,0xb1,0xd2,0x0f,0x01,0xe0,0xd4,0x26,0xa0,0x59,0x70,0xd0,0x5e,0xb8,0x6f,0x63,0x7b,0x71,0x49,0xe1,0x98,0xfb,0xdb,0x22,0x26,0x18,0x16,0x31,0x08,0x90,0x32,0xd5,0x7a +.byte 0xc0,0xd8,0xeb,0xae,0x93,0x3d,0x46,0xeb,0x0e,0xdd,0x08,0xa2,0xde,0x4e,0xc1,0x88,0x26,0xc2,0xf8,0xc6,0x5e,0x8a,0x9b,0x0d,0x9f,0x2b,0xcf,0x4e,0x13,0x43,0x4a,0x65,0xf6,0x47,0x1a,0x0a,0xae,0xf9,0x9f,0x7c,0xc5,0x18,0x65,0x09,0xcb,0x85,0x7d,0x33,0x36,0x43,0x19,0x99,0x20,0xa2,0x64,0xb2,0xf5,0x20,0xd2,0x74,0xc6,0x2c,0x29,0x46 +.byte 0xde,0xa7,0x4a,0x7f,0x3b,0x05,0x3e,0x11,0xb6,0xc1,0x98,0xfb,0xf5,0x9d,0x93,0x95,0x76,0x11,0x80,0x41,0x44,0xd3,0x2f,0xf4,0xfd,0x92,0x1e,0xd7,0xa7,0x5f,0x02,0x4a,0xbc,0xb7,0x96,0x33,0xc0,0x0d,0x2d,0x97,0xb8,0xd4,0x67,0x7a,0x4c,0x74,0x93,0xa7,0x8d,0x68,0x78,0xed,0xc8,0xc9,0x02,0x6e,0xae,0x10,0x97,0x7c,0x56,0x11,0x2a,0x29 +.byte 0x87,0x5c,0x21,0xec,0x75,0x9c,0x17,0x17,0x8d,0x45,0x08,0x31,0x36,0x64,0xc0,0xf7,0x95,0xb6,0x72,0xcf,0xac,0xd8,0x52,0x02,0x6f,0x3b,0x14,0x34,0x30,0xcc,0x39,0x7c,0xe4,0x1f,0x38,0x23,0xcf,0x1f,0xb7,0x7e,0x92,0x66,0xf7,0xda,0x9f,0x27,0xbb,0x83,0x45,0x71,0x67,0x63,0x6c,0x85,0x64,0x34,0xa8,0x93,0x5a,0x13,0x0c,0xff,0x8b,0x3a +.byte 0x2a,0x10,0x1d,0xb6,0x43,0xef,0x57,0xf3,0xf0,0x29,0x2e,0x59,0x72,0x2e,0xc3,0xb6,0xd3,0xd0,0xdd,0x17,0x19,0x82,0x49,0x05,0xd4,0xfc,0xd6,0x2e,0x5d,0xd7,0x0c,0xb6,0x18,0xd5,0x08,0xbb,0xe5,0x3b,0x2e,0x85,0x62,0xc0,0x1e,0xa3,0xb8,0x92,0x21,0x06,0xfa,0xf1,0x2d,0xab,0x62,0x67,0x62,0xee,0x13,0x7f,0x07,0xb6,0x24,0x64,0x94,0x4f +.byte 0x69,0xb9,0x7a,0xdc,0x23,0x5e,0x19,0x96,0xc5,0x4d,0xcb,0xee,0x2d,0x4a,0x7d,0x1d,0xd2,0x72,0x18,0x8f,0x43,0x8f,0x76,0xbf,0x30,0xd8,0xf1,0xfe,0x9c,0xe7,0x63,0x38,0xff,0x1a,0x3f,0x40,0xbd,0x73,0x66,0xf7,0xa9,0xd9,0x17,0x4a,0x8a,0x79,0x04,0x0e,0x20,0xe1,0x39,0x49,0xd9,0x30,0x9c,0x52,0xf9,0x14,0x8f,0xdc,0x9d,0x52,0xd5,0x34 +.byte 0xaa,0x58,0xfe,0x5d,0x68,0xcb,0xab,0x3b,0x3c,0x9e,0x25,0xde,0x6d,0xdd,0x58,0x0d,0x1b,0x99,0xa9,0xcc,0x26,0x4e,0xc0,0x3c,0x8b,0x1e,0xaa,0x52,0x3d,0x4d,0xb8,0x27,0xc1,0xd1,0xa2,0xaa,0x78,0xb9,0xee,0x5f,0x26,0x46,0x5f,0x41,0x0d,0xe1,0x70,0x7d,0xcd,0x3f,0x4a,0xca,0xb2,0xca,0x2f,0x36,0x1f,0x68,0xe6,0x66,0x8a,0xf6,0xe3,0x94 +.byte 0xe5,0xab,0x90,0xeb,0x2f,0xe8,0xb2,0x6c,0xa9,0x69,0xd2,0xe0,0x5f,0x4a,0x65,0xa8,0x6b,0xc1,0xfb,0x03,0x51,0x17,0x3b,0xf8,0xe0,0x67,0xc3,0x5a,0xe8,0x18,0xdf,0xc1,0xf8,0x7f,0x44,0x68,0x4a,0x01,0xbe,0xf8,0xa5,0x7a,0xb9,0x3b,0x0f,0x05,0x8e,0x4b,0x28,0x14,0x61,0x2f,0x2e,0xc7,0xf2,0x96,0xc7,0x60,0x99,0xc4,0xbf,0xe8,0x37,0x98 +.byte 0x00,0x34,0xf7,0x5a,0xd7,0x6f,0x90,0xc4,0x19,0xb5,0x07,0xd1,0x76,0x6e,0x65,0xcc,0xf6,0x51,0x88,0x5c,0x81,0x91,0xa8,0x4d,0xb7,0x33,0x53,0xb6,0x93,0x42,0x52,0x82,0xfa,0x2b,0xca,0xa0,0xbd,0xf3,0x09,0x2b,0x0f,0x09,0x02,0xdd,0x29,0x5f,0xa6,0x49,0x7b,0x97,0xe8,0x96,0xbf,0x6f,0x76,0xb7,0xa2,0x76,0x58,0xda,0x1d,0xb2,0xdb,0x6d +.byte 0x9d,0x3b,0x32,0x6e,0x9c,0xea,0x45,0xfd,0x33,0xeb,0x41,0x91,0x91,0x52,0x2b,0x68,0xa3,0xf3,0xc6,0x92,0x43,0x13,0x49,0x8a,0x10,0xb1,0x2f,0x9a,0x0f,0xe1,0x94,0x21,0x18,0x76,0x87,0xaf,0x50,0xe4,0x71,0x5d,0x0a,0xba,0x75,0xaa,0x17,0xf5,0x37,0xf2,0x84,0x9b,0x29,0xdf,0x44,0x60,0xd0,0xac,0xcf,0x25,0x87,0x66,0x64,0x1f,0x0d,0xba +.byte 0xb3,0xdb,0x14,0xb6,0x1f,0x00,0x70,0x98,0x83,0x1d,0x9e,0xbd,0xf9,0x17,0xf4,0x57,0xae,0xa8,0xae,0x7b,0xa7,0xde,0x1f,0x31,0xc6,0x29,0xb2,0xf7,0xef,0x36,0x31,0xe7,0x50,0x33,0x69,0x4e,0x8c,0xb5,0xe4,0xdd,0x74,0x87,0xc8,0xf5,0x22,0x1b,0x4b,0xec,0xc4,0xe1,0x5a,0x7d,0x5a,0xe8,0xb9,0x2f,0xf4,0xd1,0x83,0xa2,0xb7,0x97,0xe0,0x1e +.byte 0xf7,0x3a,0x74,0xef,0x5f,0xb3,0x30,0xce,0xfa,0x23,0xd5,0x98,0x56,0x19,0x24,0xb5,0xc7,0x60,0x8b,0x03,0x8e,0xe7,0xdf,0x2c,0x36,0x4c,0x3b,0x3b,0x84,0x45,0x97,0x40,0x29,0x30,0x98,0xc3,0xc0,0xa2,0xf0,0xdf,0x69,0x47,0x95,0x26,0xdb,0x6c,0xcc,0xff,0x2d,0x32,0xaa,0xa7,0xb8,0x6b,0x24,0xec,0xff,0x94,0x4d,0x36,0xdd,0x7b,0x4d,0xc5 +.byte 0x8d,0xe2,0x3c,0x14,0x5a,0x37,0x75,0x1f,0xd6,0x98,0x7d,0xd3,0xdc,0xb0,0x24,0x69,0xe7,0x65,0x60,0x2a,0xe7,0x00,0x5b,0x68,0x99,0xa0,0x9e,0x10,0xf0,0x5c,0xa8,0x39,0x85,0x59,0xde,0xe4,0x46,0xf3,0xde,0xda,0xc0,0xb1,0xd2,0xf1,0xd2,0x05,0xd5,0xd4,0x2c,0x2e,0x7e,0x44,0x5c,0x52,0x80,0x85,0xbb,0x54,0x97,0xb6,0xad,0x6d,0x57,0x49 +.byte 0xed,0x67,0xaf,0x27,0xb4,0x5b,0xce,0x0f,0x3c,0x58,0xa2,0x24,0x22,0xa2,0xcb,0xfc,0x4e,0x8e,0xc2,0x3c,0x32,0xc6,0x07,0xc4,0xc6,0xc0,0x50,0xc3,0xe3,0x1b,0x96,0x76,0x62,0xf9,0xea,0x5e,0xdc,0xc5,0x96,0xe8,0xaa,0x20,0x26,0xac,0x44,0xfb,0xf2,0x16,0x72,0x72,0x4c,0x5c,0xee,0x51,0x07,0xb0,0x74,0xf6,0xde,0xd7,0x5d,0x73,0xf4,0xe9 +.byte 0x0d,0x29,0x06,0x5f,0xca,0xe2,0xbb,0xa4,0x3e,0xdc,0xf7,0x74,0x99,0x53,0x7a,0x52,0x60,0x46,0xaa,0xf0,0x34,0x97,0x0c,0x81,0x5b,0xd8,0x95,0x52,0x76,0x55,0xcb,0xc4,0x6d,0x50,0x26,0x3f,0x7e,0xc2,0x93,0x6e,0x14,0x0c,0xd7,0x49,0x5f,0x52,0x8f,0x34,0x49,0xb4,0xe7,0x12,0xfe,0xae,0xd1,0xfa,0xfc,0xc5,0x80,0x38,0x26,0x9c,0xf1,0x81 +.byte 0x01,0x58,0x15,0x99,0x29,0x8d,0x1b,0x2d,0x74,0xca,0xf1,0xf4,0xfa,0xcd,0xae,0xfa,0xa9,0x1d,0xbb,0xf1,0x55,0x2e,0x69,0x46,0x6e,0xe4,0x91,0xa3,0x48,0xb5,0xaa,0xb3,0x85,0xab,0x14,0xd2,0x84,0x8c,0xb1,0xb6,0x0c,0xa5,0x4a,0x90,0xed,0x6e,0xdf,0x1e,0x15,0x36,0x7b,0xa3,0x59,0xd6,0x8d,0x7d,0x7b,0x12,0x7c,0x9a,0x40,0x8a,0x28,0xde +.byte 0xb5,0xbc,0xc4,0x52,0x96,0xfb,0x62,0x1f,0xc9,0xe0,0xc9,0x1d,0xc7,0xc4,0xcb,0x8a,0x96,0x21,0x42,0x7c,0x0a,0xdd,0x42,0x74,0xcf,0xc4,0x57,0x8f,0x28,0x0a,0x7c,0x4f,0x49,0x5a,0xc6,0x21,0xb2,0xd4,0xd0,0x61,0xa5,0x35,0xbd,0x4a,0x0c,0x16,0x68,0x1f,0xe3,0xff,0x3f,0x72,0xf0,0x1d,0x50,0x26,0x48,0x91,0x27,0x1b,0x2b,0x0d,0x8b,0xf2 +.byte 0xa0,0xc0,0xa0,0x5d,0xdb,0xcf,0x71,0x41,0x83,0x00,0xb9,0x3c,0xe0,0x4a,0x96,0x43,0xf8,0x64,0x0f,0x42,0xc5,0x75,0xec,0x26,0x62,0x99,0x13,0xeb,0xf9,0xa6,0x86,0xe4,0xc9,0xaf,0x3c,0x2c,0xc9,0x4f,0x89,0xf4,0xc0,0x46,0x99,0xb8,0xd1,0x9e,0x7b,0xb7,0x41,0x0a,0x5f,0x40,0x98,0x65,0x29,0xdd,0x60,0x6b,0x27,0xbf,0x66,0x08,0x32,0xc2 +.byte 0xcf,0xea,0x91,0x44,0x45,0x49,0x1c,0xb4,0x16,0x7f,0x11,0x1a,0x8c,0xb4,0x59,0x54,0xc6,0xcf,0x40,0xd2,0xe9,0xc1,0x54,0x9c,0xe2,0x6e,0xd5,0xfe,0xfb,0x4a,0xa3,0x98,0x63,0xef,0x86,0xe0,0x63,0x30,0x32,0x5a,0xbd,0xd4,0x7c,0xe8,0xbe,0xf1,0xed,0xa2,0x19,0x98,0xc8,0x34,0x65,0x4c,0xef,0x1a,0xb3,0xbc,0x87,0xbe,0x6b,0x75,0x2c,0xe5 +.byte 0x54,0xcc,0xe5,0x69,0xb2,0xc8,0xdb,0x57,0xf8,0xa7,0x82,0x07,0xf7,0x20,0x95,0x7f,0x6d,0x7b,0x33,0x66,0x67,0xa1,0x38,0x0e,0x9c,0x3b,0x22,0xab,0xc1,0xd3,0xed,0x87,0x32,0xfb,0x4a,0x5d,0xad,0x3a,0xe1,0x90,0xa6,0xe3,0x4d,0x6b,0x00,0xe4,0x5c,0x66,0x59,0x90,0x63,0x24,0x5b,0xe1,0x3b,0x69,0xb6,0xc9,0x05,0x83,0x3a,0x7b,0xf4,0xa5 +.byte 0xc8,0x47,0xf9,0x8e,0xab,0x92,0xbd,0xd3,0x41,0xc7,0x61,0xf4,0xce,0x30,0xdb,0xae,0x27,0x69,0x0f,0xcc,0x69,0x50,0xe8,0x18,0xf2,0x39,0x04,0x5a,0x29,0x12,0x61,0x46,0x5c,0x1b,0x2e,0x15,0x9c,0xfa,0x73,0x50,0xe3,0x51,0xda,0x4d,0x88,0x25,0xb2,0xff,0x55,0x27,0xce,0x86,0xca,0xe6,0x2a,0xb8,0x0c,0xa7,0xd0,0x06,0xbf,0x70,0xb5,0x6b +.byte 0x80,0x44,0x65,0x5d,0x23,0xfa,0x0d,0x74,0x5c,0xfc,0xc7,0x86,0x5e,0x23,0x8a,0xf1,0xff,0x80,0xf0,0x19,0xaa,0x98,0xae,0x56,0xcf,0x12,0x74,0x6c,0x70,0xb2,0x39,0xbe,0x66,0x71,0xee,0xe3,0x43,0x3b,0xfa,0x79,0xa9,0x7e,0x69,0x6a,0x19,0x42,0xd5,0x0e,0x1e,0x92,0xfe,0x8a,0x0f,0xca,0x74,0xf2,0x68,0x71,0xf5,0xcb,0x05,0x94,0xc1,0x06 +.byte 0x1b,0xae,0x55,0xe9,0x16,0x03,0xa9,0x97,0xad,0x49,0xaf,0x88,0x8c,0x26,0x33,0x4d,0x46,0x75,0xb3,0x9c,0xee,0x70,0xe1,0x57,0x43,0xeb,0x59,0xff,0x77,0x89,0x8a,0x77,0x3f,0x7e,0xe6,0xbe,0xa2,0x05,0xb1,0xe3,0x41,0x5e,0xc7,0xd4,0x14,0xda,0xc0,0x84,0xd0,0x05,0x50,0xdd,0x62,0xdb,0x4c,0x3b,0x16,0xb0,0xe0,0xf5,0x2b,0xf1,0x83,0xea +.byte 0x7b,0x89,0xbb,0xde,0x57,0xdb,0xc0,0xb9,0x7d,0xdf,0x53,0x0f,0x6c,0xc5,0x5a,0x0b,0x36,0xeb,0xa3,0xc3,0xe6,0xc5,0x80,0x98,0xf3,0x87,0x29,0x97,0xc9,0x2e,0xd6,0x3b,0x43,0x2a,0x36,0x3b,0xba,0x43,0x85,0xf5,0x0d,0x18,0x2e,0x78,0x43,0xae,0xa4,0x24,0x6d,0xdc,0xab,0x05,0x94,0x09,0x94,0x27,0x17,0xef,0xbc,0x7e,0x52,0xa4,0x80,0xda +.byte 0x28,0xf5,0xc3,0x20,0x99,0xbb,0x5d,0xb6,0x7e,0x0e,0x59,0x3b,0x5e,0x1d,0x1b,0x4f,0xd1,0x91,0xe4,0xe4,0xc7,0x35,0xc7,0x2e,0xc1,0xba,0x60,0x05,0xa4,0xd5,0xca,0x5f,0x09,0xbf,0x79,0x06,0xcb,0xa7,0x32,0x7c,0xf4,0xdc,0xa8,0xb3,0x8b,0x26,0x59,0x6d,0xcb,0x74,0x37,0x56,0x51,0x96,0x0b,0x44,0xf1,0x95,0x16,0xe3,0x9b,0x9b,0x3b,0xb3 +.byte 0xea,0x6a,0x1b,0x76,0x99,0x69,0xd6,0x5b,0x10,0x5a,0x91,0x23,0xb5,0xc3,0xf9,0x6a,0xba,0xc4,0xe6,0x18,0x28,0x50,0x9d,0x09,0x14,0xbe,0xed,0x73,0xd2,0x51,0xff,0xf8,0x14,0x2b,0x8b,0xdd,0x2a,0x1a,0x8e,0x48,0xae,0xd8,0xdf,0xb9,0x5b,0xcb,0x8f,0xc2,0x8c,0xd6,0xb3,0xfb,0x40,0x2f,0xb0,0x6c,0x9a,0xea,0xd0,0x14,0x8c,0xc5,0xc7,0xc7 +.byte 0xf8,0xf5,0x4f,0xe2,0xd7,0x41,0xcd,0xb6,0x34,0x3e,0x81,0x19,0x09,0xa2,0x51,0xb4,0x60,0xfb,0xf2,0x6c,0xe6,0xae,0x68,0x47,0xb9,0x93,0x7b,0xc9,0xe7,0x00,0xc4,0xa7,0xf2,0xef,0x8b,0xd8,0xfc,0x9f,0xe5,0x6d,0x48,0xe2,0x6c,0x32,0x73,0x5c,0x30,0x7c,0x12,0x13,0xca,0xc3,0x31,0xc3,0xa2,0xb4,0xf7,0x23,0xc4,0xd0,0x47,0x39,0x93,0xc8 +.byte 0xa0,0x7b,0xb4,0x09,0x3f,0xe8,0x15,0x15,0x9c,0xa7,0xe6,0xa8,0xbe,0xba,0x60,0xf9,0x28,0x88,0x66,0x7b,0x62,0x32,0x17,0x18,0x68,0x87,0x53,0xf5,0xbc,0xf5,0x77,0x17,0xa1,0x3f,0x62,0xd1,0x10,0x0a,0x54,0x96,0x9c,0x31,0xc3,0xb7,0x1d,0xaf,0xc7,0xb3,0x27,0x9e,0x46,0xfe,0x7e,0x9b,0x88,0xf2,0x9e,0x6e,0x19,0x0f,0xb1,0x88,0xe4,0x08 +.byte 0x76,0x7c,0x77,0x46,0x09,0xa7,0x9e,0xf4,0xd9,0xbf,0x67,0xe8,0x9d,0x6a,0x75,0xa7,0xf5,0xee,0x29,0xba,0x84,0xa0,0x44,0x46,0x35,0x4c,0x22,0xef,0xb3,0xea,0xb0,0xf2,0xd6,0x78,0x20,0x97,0x28,0x5c,0x7e,0x90,0x06,0x80,0x19,0x63,0xa4,0x8a,0xef,0x0a,0xea,0x88,0xa9,0xa2,0xae,0x23,0x2e,0x40,0xce,0xc5,0xc2,0xbf,0xfe,0x5a,0x8f,0x14 +.byte 0xb8,0x66,0x1a,0x2d,0xdb,0x43,0x39,0xbd,0xe7,0x7b,0xbc,0x41,0x58,0x74,0x56,0xd1,0xe7,0xd0,0xba,0x24,0xd2,0x41,0xbf,0xd0,0x4e,0x97,0x38,0x8f,0x6b,0x6f,0xe2,0x7d,0x6d,0x32,0x94,0x43,0xa7,0x66,0xf7,0x90,0x21,0xe0,0xdd,0x19,0x48,0x72,0xc1,0xa5,0xbc,0x9c,0xe2,0xdd,0x2c,0x6e,0x50,0x45,0x2c,0xa0,0x95,0xcb,0x1d,0x2c,0x1d,0xa6 +.byte 0xbe,0x9c,0xd4,0x6c,0x07,0x2e,0x5e,0xc8,0xc1,0x05,0x61,0x7d,0x44,0x28,0xe6,0xad,0xf0,0x9d,0x2d,0x3d,0xce,0x90,0x7d,0x79,0x2e,0xf3,0x08,0xbe,0x7a,0xa9,0x58,0x04,0xa7,0x39,0x05,0xdd,0xb4,0x87,0x6c,0x7b,0xd5,0xb3,0x2d,0x6b,0x43,0xf4,0x37,0xd9,0x6f,0x5c,0xa2,0x23,0x92,0x53,0xb9,0xd7,0x1b,0x2d,0x5d,0xcd,0x6d,0x3f,0xef,0xc8 +.byte 0x66,0x91,0x10,0x1b,0xc5,0x24,0x50,0x87,0x70,0x93,0x03,0x3f,0x7b,0x40,0xc8,0x0c,0x9b,0xec,0x3d,0x82,0x27,0x96,0x2a,0xbe,0xca,0xaf,0x1b,0xbf,0xef,0x14,0x0c,0xdc,0xa6,0xc7,0x48,0x18,0xce,0x8e,0x43,0x58,0x97,0xb3,0x5e,0xd6,0xc9,0x70,0x65,0xd0,0x0e,0x17,0xac,0xa0,0x6b,0xc9,0x55,0x30,0x12,0x7c,0xbe,0xe5,0x46,0xfc,0xd8,0x3f +.byte 0x0e,0xd7,0x96,0x16,0x32,0x8e,0xb7,0x2d,0x07,0xd1,0x26,0x98,0x70,0x4c,0xb1,0x6f,0x92,0x32,0x75,0x4f,0x57,0x6b,0x78,0xe0,0xc5,0x9b,0xf0,0x08,0x59,0x0b,0xfa,0x2d,0x79,0xbe,0xde,0x44,0x3d,0x65,0x77,0x27,0x3b,0xd9,0xea,0x55,0x79,0x22,0xe8,0xf7,0x62,0xb1,0xe3,0x32,0x4e,0x03,0x17,0x65,0xd3,0x5d,0xee,0xa0,0x9b,0xc2,0xbd,0x9f +.byte 0xcd,0xdc,0xde,0xd7,0x6c,0x95,0x7a,0xf1,0x09,0x4c,0x14,0xb9,0x37,0x1d,0xd0,0xdd,0x4b,0x2e,0x93,0x0b,0xfa,0x08,0x40,0x01,0x36,0xdf,0x89,0x46,0xa6,0xbb,0x19,0xd9,0x4f,0xf9,0xe1,0x7b,0x03,0xc9,0xef,0x01,0x25,0xe9,0x6d,0x95,0x84,0x7f,0xf8,0x8e,0x02,0xfd,0x6f,0x30,0xed,0x1b,0x98,0xd0,0xb3,0xdd,0x92,0x65,0x46,0x49,0x61,0xde +.byte 0x76,0xf5,0x4b,0x29,0x03,0x6f,0x79,0xee,0xbe,0x7a,0x07,0x6e,0xa8,0x29,0xb8,0x03,0xb4,0x6c,0x50,0x1f,0x4a,0xa2,0xaf,0xbd,0xde,0x18,0x72,0x90,0xa2,0x12,0xa9,0x59,0x7b,0xf6,0x96,0x2d,0xda,0x3d,0x90,0xba,0x7c,0x79,0x3e,0x6e,0xef,0x94,0x37,0xe2,0xef,0x6b,0x2a,0x74,0x6b,0x52,0xa0,0xc2,0x1e,0xa1,0x24,0x59,0x84,0xeb,0xdc,0xd0 +.byte 0x34,0x60,0xa8,0x81,0xaf,0xdd,0x57,0xc2,0xa6,0x02,0x7f,0xcf,0x9e,0x64,0x28,0x18,0x7c,0x95,0x98,0x90,0x7a,0x76,0x3f,0x78,0x16,0x2c,0xe0,0xa7,0xdf,0x0d,0x4d,0x5e,0xcc,0x0d,0x73,0x12,0x26,0xd7,0xe9,0x32,0x3e,0xa1,0xa9,0xde,0x29,0xb2,0x3b,0x6f,0x3b,0x6e,0x12,0x0c,0x10,0x34,0x86,0xf2,0xa0,0xd4,0x9c,0xf6,0x14,0x5a,0x41,0x06 +.byte 0x31,0xb1,0xe4,0x31,0x52,0xf4,0xcb,0xe3,0x39,0xcd,0x0b,0xc2,0xca,0x90,0xba,0xb3,0x21,0xbf,0x94,0x13,0x75,0x3b,0x0e,0x0a,0xc0,0x05,0x35,0xe6,0x28,0x74,0x63,0xc5,0x34,0x44,0xd8,0x9a,0x0e,0xec,0xb3,0x1b,0x30,0x58,0xfc,0xa0,0xc4,0xd1,0x26,0x50,0x6b,0x22,0x88,0xfc,0xad,0xa9,0xb4,0x3e,0x36,0xb6,0xb1,0x6d,0x62,0x7e,0x60,0x8f +.byte 0xf5,0x17,0x65,0x1c,0xf6,0x51,0x4d,0x89,0x4a,0x7e,0x5d,0x23,0x3b,0x83,0x1f,0xa6,0xc8,0xd2,0x1a,0x90,0xd3,0x53,0xfc,0x48,0x64,0x94,0x6e,0x1c,0x72,0xef,0x5d,0xd4,0x23,0xa2,0x3a,0x93,0xe4,0x29,0x33,0x8a,0xbd,0xe5,0x17,0xc2,0xe9,0x18,0x6a,0x81,0x1e,0x5b,0x03,0x41,0x45,0x35,0x14,0xe7,0xc8,0x45,0x5c,0x37,0x69,0x77,0x62,0xf8 +.byte 0xd7,0xec,0x9d,0x62,0x2e,0xfa,0x43,0x3a,0xdc,0x8b,0x86,0x86,0x1b,0x31,0x71,0x0e,0x92,0x59,0xf7,0xef,0x96,0xfd,0x04,0x1e,0x1d,0x74,0x7d,0x08,0x06,0x21,0x54,0x39,0xd3,0x9f,0x30,0xa1,0x19,0x7f,0xc8,0x19,0x16,0xd1,0x21,0x2a,0xf3,0x21,0xce,0x19,0x1a,0xde,0x70,0x1b,0x87,0x05,0x9e,0xe8,0xf3,0xfd,0x1d,0xaa,0x61,0x6c,0xfb,0xdf +.byte 0x50,0x9a,0xa0,0x32,0x4e,0xe4,0x68,0xda,0x0e,0x2f,0x2a,0x70,0xe1,0x51,0x66,0xb4,0x2d,0x5b,0xb6,0x32,0x3f,0xcb,0xc0,0xaf,0x01,0x03,0xcd,0xd6,0xb8,0x4e,0x3d,0x24,0x17,0xe2,0x30,0x3b,0xa4,0x08,0x0e,0x6a,0xcf,0xbe,0xc2,0x5c,0x79,0x5d,0x25,0xe2,0xae,0xa7,0x7f,0x42,0xff,0xa9,0xa5,0x05,0xbf,0xf4,0x92,0x30,0xaa,0x1d,0x96,0x7a +.byte 0x49,0xbc,0x1c,0xaa,0x5c,0x8d,0xe8,0xf3,0xd3,0x1a,0x67,0x7f,0x47,0x09,0x90,0x35,0x82,0x4e,0xcc,0x2e,0x50,0xfe,0x2c,0xb9,0x29,0x39,0xff,0x49,0x8f,0x7e,0x89,0x8d,0x4a,0x15,0xd1,0xd6,0x83,0xdb,0x25,0xac,0xc1,0x81,0x23,0x70,0x3f,0xb9,0xce,0x7f,0x03,0x46,0xa8,0x39,0xab,0xff,0x71,0xc9,0x7b,0x3c,0xb3,0x5e,0x9f,0xfe,0x8a,0x0a +.byte 0x39,0xad,0x6a,0xc1,0x8e,0x5a,0xa8,0x71,0xb7,0x01,0x25,0x28,0x15,0xd9,0x0a,0xae,0xc1,0xf9,0x23,0x1c,0xc1,0xe8,0x86,0x1d,0xb8,0x71,0x6e,0xa2,0xa4,0x67,0x22,0x4d,0x0e,0xd2,0xaa,0x70,0x26,0x23,0xfc,0x15,0xed,0x67,0x11,0x87,0x69,0x6f,0xc6,0x4c,0xe1,0x4b,0x04,0x86,0xe9,0x56,0x40,0xea,0x07,0xb1,0x6f,0xe9,0x8f,0xdd,0x2f,0xce +.byte 0x8d,0xca,0x0a,0x58,0x01,0x44,0x2c,0x74,0xd0,0x14,0x07,0x9a,0xb7,0x5a,0xc1,0xea,0xa9,0xdd,0xa4,0x94,0x84,0xc2,0x11,0xa5,0xe2,0x00,0xd8,0xfc,0x77,0xb9,0x5e,0xe6,0x72,0xef,0xc5,0x38,0xe0,0x90,0x11,0x16,0xfd,0xa7,0x77,0xbd,0x4c,0x1d,0xeb,0x32,0x54,0xdb,0x2a,0x43,0xa1,0x87,0xbb,0x2e,0x79,0x22,0x4d,0xb3,0xdf,0x1a,0xee,0x75 +.byte 0xb0,0xdd,0xf2,0x09,0x05,0xf4,0x6a,0x3c,0x86,0xc6,0xe7,0x60,0x2a,0xee,0xb6,0x55,0xae,0xdc,0xce,0xf8,0xe4,0xd7,0xdf,0x72,0x42,0x91,0x6d,0xc4,0xd8,0x60,0xf1,0xe8,0x06,0x71,0x38,0xa3,0x03,0x3e,0x1b,0x14,0x47,0x74,0x93,0xb5,0x61,0x28,0xde,0x23,0x8f,0xbe,0x88,0x5e,0xdf,0x87,0x47,0xd4,0x5f,0x91,0x40,0xeb,0x02,0xda,0x27,0x3b +.byte 0x65,0x9f,0xd8,0xf1,0x78,0x7f,0xba,0x9b,0x35,0xb3,0x10,0xaf,0x7f,0x51,0x37,0xa5,0x63,0x64,0x1f,0xf1,0xc3,0x1b,0x9e,0xe4,0xdd,0x93,0x8c,0x3a,0x98,0x20,0x9a,0x75,0x22,0x7b,0x48,0x0a,0x9d,0x55,0xed,0x07,0x1a,0x79,0x3b,0x98,0xe3,0x16,0x9b,0x16,0x2c,0xb2,0x03,0xc1,0xf5,0x6c,0xac,0x00,0x6a,0xb6,0xc1,0xc2,0x49,0x4d,0x9d,0xf5 +.byte 0x0e,0x7b,0x60,0x09,0xcc,0xa7,0x35,0xbb,0x70,0x34,0x18,0x49,0x2c,0xf1,0x41,0x4f,0xce,0x68,0x03,0x60,0x14,0xa7,0x2e,0x59,0x0f,0xa2,0xc4,0x2f,0x33,0xf0,0xb6,0xa4,0x31,0x75,0xdc,0xb4,0x88,0xe4,0xe3,0x0e,0x4b,0x3f,0x58,0xd0,0xa4,0xea,0x9a,0xef,0x47,0xb7,0xf7,0x20,0x71,0x52,0xd3,0x8a,0x1c,0xd9,0x2d,0x88,0x05,0x03,0x8a,0x1c +.byte 0x3d,0x69,0xf0,0x39,0xf0,0x25,0xad,0x95,0xd4,0x47,0x3c,0xbb,0xfa,0x48,0xd7,0x8e,0xf5,0xdc,0x33,0x43,0x0a,0xbb,0xf0,0xd3,0xb1,0xc3,0x94,0x81,0xcd,0x22,0x79,0xdc,0xd0,0x92,0x8b,0xd3,0xc3,0xac,0x73,0x72,0x83,0xaa,0xa2,0x52,0x13,0x27,0x0e,0xc5,0x8c,0xa5,0x69,0x21,0x6e,0x9c,0x9d,0x9b,0xeb,0x7a,0x19,0xfe,0xb6,0xdb,0x4e,0xc1 +.byte 0xa6,0xec,0x42,0xb0,0x86,0x69,0x60,0xde,0x36,0x11,0x6a,0x86,0xd7,0xbf,0x15,0x48,0xa2,0x73,0x8f,0x68,0xde,0xd6,0xb2,0x6d,0xe0,0xc5,0x1f,0x1f,0xd5,0xc5,0xef,0xce,0xa1,0x90,0x5c,0xe6,0x6c,0x15,0x73,0xa7,0xcc,0x2d,0xe8,0xcf,0x4c,0xc8,0x17,0x3c,0xfa,0x5e,0xdb,0x4f,0x54,0xf3,0xa3,0xff,0x50,0x3e,0x42,0x60,0x0d,0xf3,0xf7,0xbb +.byte 0xc6,0xf5,0xe7,0x63,0x50,0x49,0xc1,0x94,0x60,0x68,0xbd,0x62,0xc0,0x81,0x80,0x16,0xfd,0x65,0xfb,0x2e,0x23,0x67,0xb3,0xb6,0xf8,0x95,0xfa,0x00,0x3f,0x1d,0x10,0x16,0xd5,0xd9,0x66,0xf8,0x25,0xb4,0xce,0xf2,0x2e,0x4f,0xa2,0x21,0x14,0xbd,0x2c,0x63,0xec,0x44,0x57,0x07,0x87,0x3c,0x2f,0x22,0xcf,0x48,0xd3,0x20,0x51,0xfc,0x5d,0xd5 +.byte 0x9f,0x67,0x9c,0xaf,0xe3,0x89,0x36,0xc5,0xfa,0x7c,0xca,0x07,0xdc,0x56,0x2a,0x4e,0xa5,0x76,0xe6,0x09,0x99,0xfb,0xb7,0xba,0xaa,0x0b,0x9c,0xe2,0x0f,0x73,0xab,0x9b,0xbe,0x6f,0x50,0xe3,0xf7,0x28,0x32,0xf2,0xab,0x86,0xa3,0x89,0x3a,0xea,0xd7,0x52,0x52,0x6e,0xed,0x1b,0x94,0xf0,0x59,0x9d,0xbb,0x7a,0x88,0x6f,0xbf,0xaf,0x6a,0x87 +.byte 0x47,0x34,0x7f,0xf4,0x8b,0x0d,0x33,0x12,0x2b,0x67,0x6b,0xc9,0x1d,0x18,0x23,0x2e,0x54,0xee,0x07,0x28,0xbd,0x9d,0xa1,0xaf,0x85,0x7a,0x0f,0xe5,0x5d,0xf7,0x8b,0xca,0xd9,0x3d,0x8f,0x4f,0xcc,0xce,0xc3,0x6e,0x3a,0x40,0x08,0xd2,0x14,0xf0,0x28,0x9b,0xc0,0x4a,0x7a,0x3c,0xc2,0xed,0xe0,0x20,0x04,0xf5,0xf9,0xee,0xb8,0x35,0x94,0xbc +.byte 0x53,0x46,0xf2,0x1a,0xab,0xe9,0xde,0xd8,0x27,0x67,0x0d,0x63,0x2a,0x7b,0x3a,0x38,0x91,0xbc,0x48,0x2c,0x38,0x09,0xa0,0xe3,0x66,0xe3,0xeb,0xb9,0x02,0x2d,0x80,0x87,0x81,0x4f,0x5c,0x1c,0xfd,0x2b,0x0f,0x99,0x37,0x3a,0xfa,0x0f,0x8e,0x8c,0x87,0x76,0x72,0xd3,0xcf,0xc8,0x1e,0x8a,0x3b,0x97,0xa0,0xe6,0x32,0x66,0x3c,0x55,0x2c,0xfb +.byte 0xa9,0x41,0xfd,0xf9,0xd4,0x50,0xe0,0x5b,0x03,0xb7,0x1e,0x49,0xfa,0x59,0xeb,0x55,0xb1,0x21,0xd0,0x52,0xeb,0xe6,0x0f,0x21,0x81,0x4f,0x82,0x9a,0x8f,0x67,0x3d,0x0d,0x1d,0x11,0x1f,0x70,0x59,0x09,0x87,0x99,0xe5,0xf2,0x89,0xa6,0x56,0x8d,0x52,0x55,0xa8,0x91,0x5d,0x51,0x48,0xec,0x66,0x05,0xd6,0x18,0xd1,0x61,0x02,0x5a,0x80,0xcc +.byte 0xee,0xf3,0x3b,0x8e,0x73,0x2a,0xb1,0x22,0xda,0x1d,0xca,0xb2,0xd6,0x7f,0xd7,0x7d,0xaf,0x23,0x8d,0xff,0x24,0x8e,0x5e,0x38,0x29,0x23,0x1f,0xbc,0xfd,0xe4,0x3d,0xcd,0x66,0xe3,0xe1,0x0f,0x85,0xe3,0xda,0x34,0xc6,0xba,0x60,0x5f,0xaf,0x32,0x79,0x34,0xc0,0x01,0x93,0xae,0x1e,0x72,0x7f,0xd2,0x32,0xa1,0xdc,0x0b,0xca,0xee,0x5a,0x7a +.byte 0x09,0x98,0x2a,0x46,0x0a,0xe7,0xfd,0x0f,0x76,0xa0,0x3b,0x2b,0x3d,0xe5,0xcd,0x04,0xa2,0x5e,0x9b,0xba,0x4a,0xd5,0x0a,0xce,0x94,0x77,0xbb,0x24,0xa4,0x12,0xbc,0x24,0xb6,0x60,0x40,0x62,0xd2,0x70,0x0e,0x3f,0x62,0x72,0x2f,0xa1,0xc9,0x12,0x03,0x0f,0x39,0x57,0x77,0x7c,0x5c,0x31,0x13,0xcb,0x8c,0x2c,0x84,0xfd,0x7b,0x6f,0x60,0xbb +.byte 0x1a,0x0b,0x65,0x8c,0xc1,0xe6,0x4b,0x60,0x8c,0xe7,0x3e,0x94,0x2a,0xcc,0x70,0x9f,0xd0,0xfd,0x00,0x0e,0x36,0xb2,0xf1,0x62,0x78,0x6a,0xc8,0x9b,0xbe,0x8b,0x54,0xa7,0xad,0xee,0x3e,0x8e,0x1c,0x23,0xbe,0xa2,0x73,0x43,0xbe,0x15,0x32,0x84,0xdd,0x22,0x75,0xd5,0x9a,0xfb,0x93,0x38,0x55,0x2f,0xa4,0x34,0x4c,0x33,0xc3,0xd7,0x7c,0x9f +.byte 0x42,0x2f,0x9f,0xf6,0x27,0x90,0x15,0x6b,0x14,0x4f,0xbc,0x4b,0x07,0x42,0x24,0x98,0xa6,0xc4,0x4c,0x2f,0x22,0xd9,0x80,0x99,0x97,0x6b,0x7d,0xe8,0x2b,0x31,0x37,0xfe,0xd1,0x8b,0xbd,0xbf,0x08,0x4a,0x56,0x3d,0xff,0xb5,0x12,0x6d,0xc4,0xcf,0xbc,0x75,0xe9,0xe6,0x6f,0x1a,0x30,0x34,0x5b,0x2c,0x1d,0x8f,0x85,0xa0,0xe8,0xfd,0xfd,0xe2 +.byte 0xe7,0x13,0x73,0xcd,0x63,0x63,0x90,0xa5,0xa4,0x3f,0x91,0x65,0x77,0xd4,0xed,0x0c,0x1d,0x06,0x95,0x93,0x74,0x85,0xec,0x31,0xde,0xc9,0xb9,0x2e,0x7c,0x6d,0x2c,0x0d,0x15,0xb7,0x6b,0x0c,0xd2,0xe8,0xa8,0xcb,0x90,0x5c,0x11,0x53,0xc5,0x9d,0x54,0xf4,0x90,0xf7,0xc8,0x17,0x65,0xc0,0x3f,0xea,0xf6,0x28,0x8e,0xf0,0x1c,0x51,0xcc,0xfd +.byte 0x99,0x67,0x3d,0xa5,0x82,0x1f,0xb3,0x75,0x08,0x27,0x85,0xa9,0x7b,0x54,0x91,0x6e,0x80,0x9a,0xdb,0x6c,0x17,0x4a,0x36,0x73,0x0e,0x61,0x2e,0x01,0xae,0x32,0xf8,0x54,0xdb,0xcf,0x24,0xa5,0x13,0xb1,0x7e,0x0b,0xf5,0xe7,0x0e,0x27,0x9a,0xef,0x01,0x0b,0x34,0x4f,0x91,0xc2,0x93,0xe0,0xe6,0x14,0x64,0xf8,0x7b,0x41,0x37,0x22,0x39,0xad +.byte 0xf4,0xa9,0x3b,0xfb,0x7e,0x2b,0xd8,0x2b,0x0f,0x7e,0x40,0x55,0x5a,0x48,0x61,0x2f,0x95,0x5e,0x5c,0x25,0xe5,0x06,0x89,0x17,0x23,0xb6,0x1b,0x38,0x2e,0x7b,0x45,0xa5,0x11,0x0a,0x8d,0xd3,0x8d,0xb6,0x8d,0x47,0xc5,0x4f,0x8f,0x8b,0xe2,0x03,0x85,0xa1,0x5a,0xa2,0x8d,0xca,0x4d,0xef,0xc9,0xde,0x7d,0x06,0xa1,0x3f,0x21,0xb9,0x38,0x7b +.byte 0x91,0xf7,0x5c,0x9f,0x97,0xe3,0xeb,0x5d,0xea,0x5e,0xc1,0xa5,0x30,0xb0,0x7f,0xe0,0x4c,0xef,0xe5,0xe3,0xa0,0x2d,0x23,0xb6,0x08,0x21,0xe6,0x67,0x35,0x82,0x07,0x59,0x02,0xd4,0x68,0xa5,0xf1,0x42,0x70,0xb4,0x5e,0x54,0xed,0x1e,0x99,0xb2,0x55,0xf1,0x69,0x2e,0x7c,0xaa,0x6c,0x5e,0xd4,0xfa,0x16,0xa7,0x1f,0xdb,0x46,0x70,0x65,0x26 +.byte 0x98,0xf1,0xb6,0x42,0xb3,0x48,0x99,0x7c,0x07,0xbe,0x2b,0xee,0xb4,0xc1,0xf0,0xb7,0x47,0xf8,0xcf,0xe4,0x8d,0x34,0xa6,0xe5,0x17,0x9a,0xb7,0x2c,0x2e,0x03,0x30,0xfd,0xfb,0x42,0xe7,0xa1,0xe0,0x34,0x49,0x64,0xd8,0x0c,0xd5,0xb8,0x77,0x9f,0x0e,0xe2,0x73,0x0d,0x20,0x0c,0x21,0x07,0xaf,0x0f,0x93,0x94,0xd6,0xdc,0xe3,0xac,0x8d,0x8e +.byte 0xae,0x87,0xbd,0x2c,0x19,0x66,0xef,0x90,0x4a,0xd9,0xb0,0xf6,0xac,0x3a,0xe2,0xb5,0x2e,0xb4,0x63,0x91,0xf1,0x8b,0xac,0xce,0x51,0xc2,0xe0,0x02,0x7d,0xf8,0xab,0xe4,0xd6,0x85,0xd6,0xbb,0xd7,0x72,0xd0,0x5f,0x4e,0x90,0x09,0xcc,0x51,0xee,0x5b,0xad,0xb2,0xf6,0x16,0x37,0x09,0xa8,0xfc,0x74,0xa5,0x2e,0x26,0x27,0xff,0x53,0xd4,0x45 +.byte 0x82,0xb1,0xb6,0x16,0x65,0xc6,0xbb,0x54,0x0b,0x89,0xa1,0x0e,0x09,0x7c,0xc9,0xc9,0x48,0xa7,0x51,0x78,0x1d,0x3a,0x30,0xc5,0xe7,0x02,0x9e,0x91,0xd6,0x39,0xc8,0x35,0xf0,0x33,0xab,0xf6,0x0f,0xf9,0xce,0xef,0x26,0x46,0x48,0x56,0xbc,0x45,0x44,0xe2,0xd7,0xfc,0xdf,0xb2,0x95,0x20,0x07,0xeb,0x47,0x1c,0xde,0x88,0x5e,0x08,0xee,0xa1 +.byte 0x56,0x9a,0x5d,0x8f,0x35,0xc5,0xb3,0xd3,0x7d,0xe3,0x25,0x82,0xcc,0xcb,0xad,0xd8,0xef,0x83,0x76,0x08,0x55,0x9e,0xf4,0x00,0x1f,0x92,0x24,0x0e,0xf6,0x96,0x98,0x34,0x10,0x10,0x93,0x27,0x3b,0x96,0xbd,0x75,0x45,0x9d,0xad,0xc1,0x79,0xa7,0x09,0x68,0x0a,0xbc,0x14,0xe9,0x62,0xf6,0x5e,0x4e,0x6d,0xfb,0xf2,0x25,0x20,0x8b,0x53,0xa6 +.byte 0xc2,0x31,0x71,0xaa,0xfa,0xa2,0x1c,0xa1,0xb3,0xa2,0xd7,0x22,0x5a,0x72,0x61,0x5c,0x30,0x75,0xcc,0x82,0xb0,0xd0,0x07,0x8c,0x95,0x11,0x57,0xa4,0xe2,0x42,0xf3,0x3d,0x87,0x56,0x45,0x38,0xd6,0x1b,0x2b,0x26,0x11,0x99,0xce,0xcc,0x2e,0x96,0x1b,0xa1,0x06,0xa1,0xa9,0x65,0xe1,0x1f,0x53,0xb6,0x1e,0x5c,0x44,0x40,0xa2,0xf2,0x03,0xe7 +.byte 0x39,0x24,0x59,0x5f,0xdd,0x30,0xf0,0x78,0x9f,0x34,0xf1,0xd3,0x5d,0x9a,0xdd,0xf9,0x02,0x16,0x4b,0xfa,0x8d,0xab,0x2f,0x96,0xdb,0x67,0xf6,0x1e,0x7a,0xf8,0xd8,0xe6,0x71,0xdc,0x1a,0xbf,0x44,0xd2,0xbd,0xb3,0x6d,0x47,0x69,0xe0,0x14,0xef,0xe5,0x5e,0x0a,0xe9,0x1a,0x8b,0x3f,0x67,0x1e,0x1c,0x37,0x86,0x25,0x02,0x52,0x3f,0xf5,0xde +.byte 0xe0,0xbe,0x1d,0x61,0x44,0x3d,0xd2,0xe9,0x26,0x3d,0x4b,0xa4,0xb1,0xb9,0x62,0xc5,0x70,0xfb,0x1d,0xaf,0xe6,0x19,0x97,0x0f,0x6e,0x6d,0x4e,0xdf,0x5f,0xc9,0xb2,0xb0,0xb9,0x4b,0x72,0xc7,0x60,0x5d,0xf8,0x7d,0x3b,0xd8,0x74,0x29,0xf2,0x56,0x25,0xd9,0xd9,0x12,0x3a,0x50,0x01,0x54,0xd3,0x0e,0x4c,0xbd,0xc9,0xf5,0x66,0xc4,0x4b,0xa2 +.byte 0x68,0x31,0xb1,0x9d,0x47,0xd8,0x28,0xce,0x6b,0xe4,0x5f,0x78,0x75,0x22,0x7d,0x44,0x08,0x71,0xfb,0xd8,0xa0,0x6e,0xd1,0xbd,0x64,0x4e,0x00,0x99,0xf7,0x85,0xad,0x31,0xde,0x5c,0x4c,0x7c,0xc3,0x89,0x49,0x9f,0xea,0x22,0x86,0xa0,0x48,0x48,0xcf,0x47,0xfb,0x68,0x04,0x4c,0x05,0x62,0x57,0x60,0x9b,0xa0,0x37,0x41,0x77,0xe4,0x7d,0x3e +.byte 0x36,0xda,0xd5,0xfd,0x68,0x47,0x8c,0x68,0x61,0x4c,0xea,0x38,0x20,0xa5,0xe4,0x12,0x6e,0xd5,0x14,0x37,0x01,0xcf,0xbd,0xdd,0x55,0x97,0xb4,0x30,0xf0,0x65,0x15,0xee,0x1f,0xc8,0x5b,0x07,0x82,0xae,0x43,0xad,0x11,0xda,0x0e,0x61,0x23,0x0a,0x5f,0x52,0xf9,0x9d,0xc5,0x98,0x4e,0xaf,0x77,0x21,0xc8,0x9f,0x6d,0x25,0x94,0x4f,0x91,0x1a +.byte 0xb4,0x2d,0xe3,0x15,0xe5,0xe6,0x25,0xb8,0x8e,0xd8,0x33,0xe3,0x05,0x01,0x7b,0x6b,0xa8,0x39,0x44,0x4b,0x58,0x3c,0x17,0x53,0x17,0x5c,0xbc,0xd5,0xcd,0xd4,0x29,0xe7,0x17,0x7a,0x69,0xa6,0x75,0x8e,0x0a,0x00,0x41,0xbe,0xb4,0x8d,0x79,0x1d,0xac,0x2a,0x0f,0x9b,0x7b,0x5a,0xe8,0x17,0xe2,0xb3,0x1d,0x03,0xde,0x5a,0x7c,0x31,0x18,0x8c +.byte 0x1c,0xf9,0x19,0x7b,0x37,0x1f,0x53,0x77,0xce,0x1f,0xad,0xb6,0x0d,0x21,0xe1,0xb0,0xf9,0x42,0x52,0x99,0x02,0xa8,0x58,0xab,0x94,0xf8,0x9f,0x99,0x2d,0x1e,0x68,0x4f,0x5a,0x91,0x2b,0xdf,0xe8,0xe6,0x34,0xb6,0x80,0x9b,0xb1,0x0e,0x87,0xec,0x29,0x17,0x4d,0x98,0x2d,0x40,0xd0,0xf7,0xca,0x55,0x9d,0x56,0x19,0xd5,0x7c,0x4e,0x2e,0x75 +.byte 0x5d,0xe7,0x3e,0xed,0x47,0xdc,0xb1,0x04,0xe5,0x61,0x0f,0xe7,0xc4,0x16,0x71,0xf4,0xf8,0x8a,0xf1,0xfc,0xd5,0xdb,0xeb,0x0b,0x82,0x0f,0xfe,0x64,0xa2,0xb0,0x53,0xab,0xf5,0x01,0xc2,0x8f,0xa0,0x4d,0x5d,0x1b,0x54,0x32,0x48,0xca,0x8a,0x42,0x59,0x4a,0x85,0x68,0x75,0xd1,0x1b,0x03,0x11,0xfe,0x28,0xd7,0xd5,0x37,0x81,0x7a,0xfb,0x84 +.byte 0xfd,0xa8,0x98,0x54,0xf7,0x81,0xb0,0x2d,0x2d,0x5d,0x95,0x0a,0x5b,0x80,0x13,0x95,0xad,0x8f,0x88,0xaa,0x38,0x7e,0xbc,0x88,0xc2,0xf6,0xa6,0x1e,0x6d,0x78,0xc9,0x4f,0xa9,0xb3,0xaa,0x23,0x0c,0x62,0x19,0x6f,0x26,0x5d,0xca,0x36,0x23,0xf8,0xd1,0x76,0x80,0x32,0x59,0xa0,0x47,0x86,0xee,0xc9,0x0f,0x1d,0x37,0xd9,0xc9,0x4e,0x65,0x22 +.byte 0x17,0x95,0x88,0x85,0xb3,0x8a,0x5d,0xb9,0xe6,0x3b,0x6c,0x02,0x81,0x61,0xe0,0xab,0x19,0x6c,0x9a,0x29,0x33,0xf1,0x7b,0x0c,0x22,0x16,0x0c,0xd6,0xfa,0xc2,0x84,0xe5,0x74,0x9e,0x8e,0xf8,0xdb,0x44,0x68,0xa0,0x58,0x52,0x9f,0xad,0xe6,0x2b,0x23,0x70,0xf3,0x6e,0xdc,0xf1,0x2d,0xa5,0xc2,0x7f,0xef,0x5f,0x58,0xc2,0x96,0x66,0x67,0x4b +.byte 0x7c,0xe0,0xd7,0x96,0xda,0xf7,0xd7,0x7a,0x7d,0xb4,0x4f,0x48,0xbd,0x87,0x6b,0xf4,0xbd,0xd1,0x45,0xdc,0xba,0x4f,0xd2,0x00,0x7f,0xde,0x3c,0x57,0xd7,0x3b,0x5b,0xa9,0xf3,0x17,0x76,0x47,0x0c,0xcf,0x48,0x07,0xa8,0xc3,0x30,0x60,0xc6,0x98,0x20,0x29,0xba,0x5f,0x76,0x6d,0x63,0x5f,0x87,0x7e,0x36,0xbc,0xa3,0xe4,0xd6,0x6a,0x55,0x73 +.byte 0x8b,0x8b,0x62,0x40,0xc5,0x7e,0xa3,0x33,0x04,0xce,0xe2,0x9d,0x9f,0x67,0x1c,0xf0,0xa1,0x78,0xd2,0x0b,0x58,0xc1,0x2e,0xec,0x78,0x0a,0xc9,0x0b,0x1d,0xfb,0xcc,0x72,0xd8,0xe4,0x15,0xcb,0x09,0x8b,0xd9,0x33,0xa9,0xb6,0x24,0x7e,0x59,0x48,0xbf,0xda,0xdb,0x5c,0x99,0xd1,0x92,0x1b,0xb6,0xf6,0x75,0x78,0x53,0x69,0x89,0x27,0x6b,0x3c +.byte 0xfb,0xd2,0xa7,0xeb,0xc5,0xf7,0xea,0x8b,0x38,0x59,0x8e,0x02,0xc7,0x6e,0x96,0x8a,0x85,0x1c,0x91,0x1b,0x97,0x97,0x9e,0xa7,0x9d,0x10,0xa4,0x4a,0x6e,0xa8,0x51,0x05,0xbe,0x5f,0x9a,0x5b,0x94,0xf2,0x2c,0xa1,0x1e,0x33,0xc5,0xe8,0x92,0xb8,0xd2,0xfa,0x27,0x07,0x12,0xa1,0xdc,0x24,0x43,0x28,0x06,0xe5,0x43,0x57,0x8f,0x66,0x72,0x2f +.byte 0x26,0xf7,0xea,0xa1,0xcf,0x57,0xd6,0xa6,0xf7,0x37,0x1d,0x6e,0xd9,0xde,0x1a,0x8c,0xf5,0x01,0x76,0xc3,0x56,0x40,0x57,0x3d,0x4a,0x14,0x04,0xf2,0xfc,0xba,0x3b,0x60,0xf1,0x88,0x1e,0x16,0x08,0x99,0x90,0xfe,0x27,0xaa,0x04,0x53,0xd8,0x7e,0x0c,0x58,0x6a,0xd9,0x5a,0xe4,0x11,0xd4,0xcc,0x48,0xbe,0x03,0x08,0xbc,0x61,0x47,0xdd,0xde +.byte 0x5f,0x03,0xc7,0x8f,0x9c,0x08,0x93,0xe3,0xaa,0xee,0x9c,0xe3,0xc6,0x06,0x78,0xda,0x0a,0xdd,0xb0,0xc3,0xf3,0x0b,0xe5,0xa0,0x5f,0x1e,0x3e,0xb3,0x15,0x7f,0xf1,0xf4,0x38,0xb2,0xed,0xf2,0xa6,0x8b,0x1d,0x78,0xb6,0x03,0x19,0xcd,0x17,0xb4,0x18,0x17,0x49,0x61,0x17,0xbd,0xbe,0x4b,0x04,0x00,0xce,0x4b,0xcc,0x47,0x61,0x76,0x85,0xdc +.byte 0x2b,0x85,0x48,0x82,0xf4,0x9b,0xb4,0x62,0x53,0xc7,0x06,0x50,0xf2,0x3e,0xba,0x6d,0xf2,0x19,0x0f,0x7f,0x84,0xce,0xa6,0x4d,0x96,0x97,0x94,0x12,0xb6,0xd0,0xd6,0xa4,0xc1,0xcc,0x14,0x54,0xf6,0x7a,0xf1,0x94,0x62,0xa1,0xc7,0x22,0x9b,0x0d,0x0e,0x69,0xcf,0x38,0x5c,0xda,0x9f,0xc0,0xfa,0x93,0x81,0x24,0xce,0x9f,0xf3,0xc2,0x66,0xad +.byte 0x06,0x21,0xf2,0x48,0x6c,0x4a,0x0d,0xb8,0x41,0x86,0xaf,0xb7,0x6c,0x65,0xcb,0x83,0xd8,0x75,0x11,0x60,0xfa,0x06,0xe5,0xd2,0x11,0x87,0x29,0xb8,0x41,0xcb,0x17,0xb5,0xbd,0xbd,0xf9,0xd5,0xbc,0x89,0xb6,0x60,0x65,0x59,0xbb,0x38,0x9d,0x70,0xf9,0x81,0x6b,0xe6,0x12,0x80,0x08,0x73,0x9f,0xfb,0x2f,0x72,0x4e,0x18,0xff,0x65,0xab,0xa6 +.byte 0xaa,0x78,0xf1,0xa4,0xe9,0x1a,0x7d,0xa5,0xdd,0x91,0x77,0xa9,0xa3,0xf3,0xe3,0xe5,0x5a,0xa2,0x0d,0x3a,0x2a,0x4a,0x11,0x9a,0x8d,0xc3,0x00,0x6e,0xd4,0x4f,0xb9,0xe7,0x39,0x78,0x89,0x64,0xb2,0xc8,0xfd,0x1f,0xe6,0xa9,0x54,0x17,0x83,0x3f,0xeb,0x97,0x77,0xac,0xc8,0xba,0x0e,0x77,0x02,0xb0,0x29,0xbe,0x51,0x62,0xef,0xa5,0xd5,0xab +.byte 0x79,0x98,0xab,0x7a,0x1e,0x13,0xe8,0x87,0x4f,0x61,0xa3,0x37,0xdf,0xe6,0xda,0xb9,0xf5,0x69,0xf7,0x7a,0xee,0xd6,0x5f,0x6a,0xb3,0x95,0x55,0x59,0xd1,0x6c,0x5b,0xd5,0xba,0x8b,0x74,0x85,0xbf,0x1e,0xe5,0xb3,0x24,0x28,0x4b,0xc8,0x4a,0xec,0xa1,0x1d,0xda,0x99,0x3f,0xdf,0xfc,0xe6,0x2e,0x1b,0xa4,0xba,0x1a,0x03,0x89,0xb7,0x93,0x4e +.byte 0xaf,0x40,0xb0,0x7e,0x3f,0x34,0x0d,0x94,0x75,0x8c,0x8a,0xfb,0x88,0xcd,0xd3,0xc2,0x61,0x95,0x63,0x51,0xaa,0x78,0x1f,0x24,0x95,0x5a,0xb5,0x98,0x9a,0xd4,0xb8,0x34,0xe1,0x47,0x1c,0x68,0x0f,0x08,0xf1,0x69,0xe6,0xd4,0xaf,0x23,0xf6,0x32,0x71,0x51,0x01,0xa9,0xf2,0xa1,0x45,0x0b,0x75,0x82,0x09,0xe4,0x9c,0x2a,0x1d,0x0b,0xd6,0xd2 +.byte 0x26,0xe8,0x30,0x44,0xdf,0xa3,0x2b,0x97,0x11,0xc7,0xe7,0x47,0xfd,0xc7,0xbf,0x59,0xf3,0x28,0x32,0x46,0xc0,0xc4,0x7a,0x96,0x08,0x0d,0x2c,0xa1,0x82,0x6c,0x0a,0x33,0x82,0x55,0xd7,0xcf,0x3e,0x08,0xbb,0x22,0x15,0x96,0x12,0x66,0xd2,0xae,0x21,0x3a,0x54,0x6a,0xe0,0x33,0x0c,0xa4,0x96,0x4b,0x5d,0xf2,0x86,0xb9,0x70,0xe4,0x65,0x45 +.byte 0xe4,0x2f,0xa7,0xb4,0xc1,0xd5,0x9a,0x02,0xa1,0x5b,0x4e,0x58,0xca,0xf8,0x63,0xae,0x45,0x1c,0xf4,0xa7,0xc8,0xa5,0x84,0x23,0x87,0xcb,0x3e,0x88,0xca,0xe9,0xa9,0x49,0xc5,0xc6,0x63,0x37,0x99,0xe0,0x27,0x03,0x96,0x7b,0x73,0x8c,0x36,0xde,0x89,0x80,0x30,0x2c,0x00,0x94,0x0b,0xfb,0x1f,0x39,0xe0,0xed,0xb6,0x31,0x21,0x90,0xfe,0xa4 +.byte 0xee,0xa5,0xe5,0x7b,0x9a,0x11,0x41,0x51,0xab,0x89,0x54,0xe0,0x8d,0x5f,0x10,0x1b,0x76,0x27,0x77,0x3d,0xb0,0x58,0x86,0x7b,0xb7,0x45,0xfb,0xd0,0x81,0xa8,0xcd,0xc0,0xc8,0x5f,0xfb,0xfe,0x8c,0x0a,0x3d,0x5d,0x61,0x4b,0x9b,0x32,0x75,0x66,0xa9,0xac,0x32,0x35,0xe9,0x1a,0xdf,0x06,0x8d,0x13,0x5d,0x40,0xcb,0x7d,0x50,0x3e,0x54,0xab +.byte 0x04,0xbc,0x83,0x32,0x8f,0xf5,0x93,0x1d,0x9b,0x5a,0xe1,0x19,0x70,0x4a,0xba,0xfc,0x4c,0x6a,0xf3,0xd6,0xd1,0xfd,0x48,0xd0,0x7c,0xa4,0xab,0x0b,0xb6,0x5f,0xe1,0x31,0xce,0x99,0x10,0x98,0xfc,0x6e,0x1c,0xaa,0x9c,0x34,0xa2,0x55,0xdc,0xe0,0x81,0x1b,0x9e,0xff,0x75,0x2e,0x25,0xe9,0x2c,0x20,0x83,0xf6,0x66,0xf9,0x63,0x31,0xfe,0xa7 +.byte 0xbf,0x4d,0xfd,0xff,0x0b,0x93,0x84,0xd4,0xb4,0x72,0x13,0x38,0x90,0x75,0xc9,0xff,0x61,0x4b,0xf9,0x55,0x62,0x58,0xf0,0x60,0xce,0x2d,0xec,0x94,0x06,0x0a,0xde,0x48,0xc0,0x46,0x89,0xfb,0x5c,0xf7,0x9f,0x37,0xad,0xd2,0xff,0xbe,0xfb,0x81,0x21,0xe0,0x20,0x43,0x88,0xad,0x40,0x47,0x7a,0xa9,0x30,0x88,0x10,0x16,0x41,0xf8,0x25,0xe0 +.byte 0x8f,0xc2,0xe3,0x9f,0x48,0xd3,0xfe,0x61,0x70,0xb9,0xa1,0x9e,0xaa,0xa6,0x73,0xcf,0xc3,0xd6,0xab,0x69,0x65,0x4a,0x3c,0xec,0x28,0x02,0x63,0x62,0xa1,0xb6,0xa3,0xd5,0x8c,0x9e,0x11,0x81,0x98,0x12,0x4f,0xec,0xb6,0xe5,0x3a,0x96,0xa1,0x11,0x13,0x77,0x5f,0x0f,0x19,0x40,0x14,0x28,0xcc,0xf1,0x3e,0x19,0x1d,0x78,0x31,0xac,0x5c,0xce +.byte 0xd7,0x29,0xfa,0x02,0x3b,0x29,0xd8,0x3a,0x37,0xcb,0x94,0xb2,0x38,0xc7,0x7f,0x3a,0x46,0xd2,0xb7,0xfe,0xfb,0x54,0x7c,0x01,0xa2,0x9b,0x53,0x57,0x04,0x73,0x4e,0x06,0x90,0xe5,0x78,0x0a,0x45,0x67,0x12,0x83,0xd7,0x31,0x59,0xa4,0x76,0xaa,0x7c,0xde,0x72,0x92,0x11,0x94,0x4c,0x6a,0xe4,0x35,0x35,0x3a,0x2e,0xef,0x7c,0xc1,0x91,0x76 +.byte 0xd0,0xfe,0x84,0xd1,0xa1,0xf9,0x03,0xc3,0xba,0x09,0xbb,0x2c,0xe2,0xb5,0x06,0x7e,0x23,0xb7,0xe0,0xc1,0xd3,0xfd,0x55,0x01,0xf3,0xba,0xc5,0x1b,0xf8,0x02,0x60,0x92,0x0a,0x93,0x1c,0xc4,0x19,0x03,0x88,0xf5,0x45,0xe5,0x8f,0x7d,0xce,0x2c,0x87,0x2e,0xf6,0x55,0x8c,0xf9,0xb0,0xd2,0x72,0x2d,0x93,0x6d,0x28,0x6e,0x8e,0x3a,0xed,0x68 +.byte 0x02,0xda,0x80,0xd0,0x71,0x4a,0x8f,0x06,0x59,0x38,0x89,0x81,0xcb,0x1a,0x74,0x1e,0x62,0xa3,0xa5,0xb8,0x85,0xc3,0xd2,0x04,0x3d,0x3b,0x93,0x36,0x0c,0x12,0x55,0xfb,0x7b,0xc8,0xa3,0x25,0xa7,0x93,0xb0,0x3e,0x49,0x86,0xbf,0x76,0x8f,0xc4,0x4c,0xfe,0xce,0x4a,0xf6,0x2f,0x15,0x33,0x06,0x3a,0x35,0x49,0xe7,0x08,0xff,0x99,0xac,0xf6 +.byte 0x20,0x6d,0xab,0xb2,0x05,0xa9,0xe4,0x06,0x57,0x9c,0xf4,0x76,0x8c,0x82,0x64,0xd5,0x67,0xe0,0xad,0xe1,0x69,0xdc,0x9e,0x2c,0x59,0x92,0x3a,0xc8,0xc1,0x0a,0x61,0x89,0x45,0x9f,0x8b,0xf8,0x64,0x0a,0x5a,0x75,0x55,0x37,0x24,0xe1,0x42,0x43,0x7c,0x9c,0xcd,0x4e,0x9e,0x19,0xfb,0xd9,0x15,0x29,0x30,0x52,0x33,0xf3,0xc8,0x88,0xdb,0xaa +.byte 0x07,0x27,0xfb,0x2b,0x0c,0xc0,0xa1,0x5f,0x51,0xf1,0x54,0xf8,0x90,0x0a,0x35,0x07,0x6e,0x9c,0x64,0xd8,0x4f,0x2d,0xb3,0x61,0xbc,0x18,0x1f,0x22,0x84,0x94,0x4b,0x85,0xfc,0x4a,0xf9,0xe5,0xfc,0xdd,0x7a,0x07,0xa2,0xbb,0xbe,0x7e,0x1f,0x4e,0xf9,0x29,0xb8,0xde,0x56,0xe9,0x04,0xc1,0xc2,0xb6,0xa8,0xc7,0xb6,0x83,0xf2,0x85,0x3d,0x35 +.byte 0xe3,0xeb,0x2f,0x2f,0x3c,0x1a,0x3a,0xf1,0x61,0x1f,0xe8,0xf0,0xce,0xa2,0x29,0xda,0x3f,0x38,0xf5,0x82,0x7a,0xb8,0x55,0xf1,0x1a,0x6e,0x5b,0x5c,0xd0,0xc8,0xc8,0x3a,0xe2,0xaf,0xb4,0x6f,0xba,0xe4,0x03,0x78,0x5f,0x47,0x4b,0xaf,0xfe,0x2a,0x7e,0x27,0xba,0x17,0xb4,0x92,0x27,0x70,0x13,0xd9,0xbb,0x6b,0x1c,0x9a,0x3e,0x29,0x85,0x9a +.byte 0xb7,0x64,0x5b,0x6d,0x7b,0xec,0xb2,0x26,0x3a,0x4b,0xb7,0x17,0xaf,0xb5,0xa1,0xbc,0x4d,0x67,0x4c,0x86,0xd1,0x53,0x2e,0x5d,0x64,0xe8,0x55,0xd9,0xbb,0xae,0xc1,0x55,0x41,0x99,0x8e,0x4d,0xed,0x3d,0x9e,0xea,0xe3,0xf2,0x76,0x45,0x6d,0xaa,0xbb,0x89,0x0b,0xc0,0x13,0xfe,0x99,0x2c,0xb0,0xd2,0xa9,0xeb,0x58,0x57,0x4d,0x88,0x2e,0x04 +.byte 0x4f,0x7a,0x76,0xaa,0x3a,0xa6,0x08,0x93,0x42,0x74,0x2f,0x3a,0x35,0xb0,0x36,0xcc,0x77,0xec,0x54,0x41,0x2e,0x81,0xf6,0x9f,0xf3,0xe7,0x23,0xc0,0x3f,0xa4,0x52,0x83,0x38,0xe2,0x12,0xed,0xdb,0x23,0xa0,0x0b,0xbf,0x61,0x98,0x89,0xb0,0xa4,0x3d,0xa9,0x6a,0x73,0xa1,0x99,0xc9,0x9e,0x68,0x45,0x37,0x4b,0x6c,0x87,0xfb,0x93,0xf2,0xaa +.byte 0xe8,0x1d,0x53,0x6c,0x4b,0xda,0xc5,0x6f,0xaa,0xde,0x99,0xd2,0xba,0x7c,0x27,0xc2,0x4e,0xd5,0x5b,0xc8,0x13,0x9e,0xa2,0x10,0x6a,0xbb,0x39,0xf9,0xa7,0x55,0x0a,0x65,0x88,0x3c,0x9b,0xff,0x83,0x4e,0xf7,0x9c,0x99,0x69,0xbd,0x64,0x0d,0xd1,0xc0,0xb0,0x43,0xd6,0x63,0x50,0x13,0x68,0x8d,0xd1,0x7e,0x56,0x93,0xb5,0x8e,0x8f,0x12,0xe5 +.byte 0x37,0x96,0x21,0x64,0xd5,0x0b,0xf6,0x27,0xf8,0xaa,0x34,0x8e,0xc4,0x2b,0x7b,0x6a,0x7c,0x89,0x4e,0x15,0x15,0x3d,0x17,0x93,0xd4,0x99,0xfe,0x97,0x95,0x20,0x85,0xcc,0xd4,0xcd,0x73,0x67,0x80,0x22,0x06,0xed,0x5e,0xce,0x90,0x59,0x01,0x31,0x24,0x17,0x37,0x4a,0x63,0x96,0xc2,0xf3,0xe0,0x21,0x0a,0x3b,0x9f,0x94,0xad,0xd6,0xa4,0xa9 +.byte 0xa2,0x54,0x0d,0x2a,0xb3,0x5c,0xfa,0xbe,0xeb,0x21,0xd6,0x13,0x22,0xa5,0x95,0x5e,0x25,0x72,0xf9,0x18,0x1f,0x50,0x64,0x04,0x5b,0xe8,0x0e,0x1f,0x6c,0xe1,0x4e,0xf5,0x7f,0xf0,0x13,0x4f,0xda,0x75,0xab,0x5a,0x98,0xd3,0x07,0x32,0x96,0x2a,0xc7,0x1e,0x0f,0x14,0xdb,0x96,0x5f,0xac,0xc1,0xef,0x5b,0x2d,0xd6,0x6d,0x13,0x01,0xd9,0x04 +.byte 0x9c,0xcd,0xe5,0x5e,0xbe,0x3a,0x47,0x14,0x09,0xbe,0x11,0xad,0x87,0x3f,0x0e,0xe1,0xcb,0x97,0xd0,0x6e,0x1f,0x49,0x07,0xd1,0x8c,0x2b,0xe0,0xf0,0xb2,0xaa,0x8b,0x70,0x18,0x7f,0x29,0xcc,0xc4,0x23,0x66,0x48,0xc4,0xb5,0x5e,0xf1,0x10,0xd7,0x1d,0x2a,0xba,0xe4,0x12,0x64,0x1d,0xf5,0x03,0x35,0x71,0x57,0x5d,0xf4,0xa4,0xb5,0x99,0x0b +.byte 0x4c,0x80,0x65,0x07,0x2f,0xbc,0xf7,0x28,0x8b,0xc0,0x8f,0x84,0x63,0x7e,0xf5,0x01,0x23,0x8c,0xaf,0x71,0x35,0xd4,0xe1,0x70,0xc7,0xef,0x1f,0x66,0xa9,0x34,0x57,0xaa,0x9a,0xbb,0x80,0x43,0x15,0x96,0xc4,0x03,0xd9,0xae,0xbe,0x89,0x1c,0xa1,0x9f,0x65,0x61,0xe5,0x90,0x9f,0xa6,0xf4,0x3b,0xde,0xa1,0xd1,0xf1,0xf9,0x2d,0xd7,0xa7,0x7e +.byte 0x3d,0x42,0x3d,0x1b,0x99,0xed,0x49,0x2e,0x92,0x6b,0x47,0x0e,0x0b,0x90,0x56,0xe0,0x1b,0x6b,0xfe,0x97,0xfe,0x9b,0xa2,0x50,0xcc,0xbf,0xea,0xae,0xe8,0xf0,0xc4,0xe5,0x81,0x20,0x4a,0xb0,0xf7,0xa5,0x23,0x24,0xf6,0x3f,0x9e,0x9c,0xcc,0xce,0xe4,0x95,0x49,0xea,0x66,0x4a,0x35,0x31,0xf3,0x03,0xc3,0x08,0xf9,0x5f,0x95,0x4c,0xbc,0x84 +.byte 0x13,0xbe,0x7f,0x35,0xbb,0xd7,0x35,0x3c,0xfb,0x05,0x43,0x95,0xbf,0x87,0xf2,0xc3,0x2d,0xef,0x13,0x1d,0x65,0x17,0x82,0x75,0x3d,0x67,0x51,0xcd,0x6e,0x42,0x5f,0x49,0x53,0x8b,0xaf,0x34,0x7d,0xa8,0xc1,0x45,0xcd,0x3d,0x29,0x00,0xa3,0xf3,0xbb,0x44,0x00,0x05,0x57,0xa5,0xeb,0xfd,0x98,0xa6,0xae,0xc6,0xc4,0x6c,0x6d,0x7d,0xf6,0x3e +.byte 0x82,0x1d,0x12,0xe7,0xcd,0xd2,0xd5,0xfe,0x41,0xf8,0xa4,0xb3,0x6a,0x04,0x13,0x28,0x10,0x40,0x27,0xc9,0x43,0x74,0xcf,0xaf,0x9b,0x60,0x17,0x43,0x8f,0xd7,0xb7,0x56,0x72,0xf3,0x48,0x0a,0xe6,0x36,0xf2,0x3f,0x51,0xf9,0x6e,0xc8,0xa3,0x04,0x8c,0x01,0x86,0x6e,0x83,0x27,0xe2,0xba,0xf2,0x8f,0x8f,0xa1,0x39,0xe7,0x17,0xdd,0x06,0x10 +.byte 0x0c,0x7f,0xfa,0x22,0x5d,0x88,0x35,0xc6,0xcd,0x60,0xa2,0xf0,0xfd,0xc9,0xed,0x85,0xac,0x88,0xfd,0x7d,0xc0,0x77,0x1b,0x80,0x3d,0x21,0x1e,0x8e,0x4d,0xdb,0x20,0xe2,0x38,0xad,0xd4,0xb5,0x2b,0x2b,0x31,0xbc,0x7b,0x02,0xa2,0x25,0x50,0xc0,0x01,0x20,0x76,0x6f,0x98,0x0b,0x3d,0x46,0xed,0xbb,0x2b,0x39,0x74,0x30,0xce,0x3e,0x6d,0x91 +.byte 0xa1,0x89,0x83,0xde,0x69,0x93,0x1a,0x14,0xa1,0xb0,0xaa,0x80,0xb0,0x1c,0x02,0x3f,0x13,0x9a,0x15,0x7f,0xb4,0x02,0x8f,0x30,0x0b,0xee,0xd9,0x72,0xcb,0x74,0x95,0x4a,0x39,0xb3,0x4e,0x78,0x12,0xb1,0x77,0x89,0xc0,0xaf,0x17,0xfd,0xc1,0x68,0x65,0xd1,0x08,0xae,0x56,0x5c,0xe0,0xe7,0x6f,0xb3,0x1e,0x10,0xce,0xd8,0xdf,0xee,0x67,0xad +.byte 0xd8,0x08,0xe0,0x79,0x36,0xe4,0x57,0x1c,0x45,0x22,0xa7,0x44,0xa8,0x12,0x37,0x92,0x85,0x9f,0x3a,0x48,0xd0,0xfd,0xb3,0x40,0x20,0x10,0xed,0x11,0xe0,0x9a,0xa6,0x09,0x5b,0xe9,0x21,0x95,0xe1,0x45,0x19,0x39,0xcc,0x85,0x5f,0xa5,0x6b,0x46,0x37,0xe1,0xa1,0x17,0x3f,0xb6,0xe9,0xb0,0x81,0x25,0xf6,0xd1,0xb8,0x22,0x5a,0x27,0x48,0x83 +.byte 0x01,0x36,0xd4,0xb8,0xc0,0x9f,0x37,0x52,0x22,0xd2,0x69,0x7b,0x3d,0xfb,0x31,0xc1,0xa3,0xb4,0xa1,0x1d,0x0e,0x24,0x9a,0xda,0x02,0x15,0x4b,0x46,0x24,0x0e,0xb1,0x79,0xc2,0x5b,0x01,0x60,0x4a,0x24,0x8a,0xbb,0x70,0xaa,0xf4,0x45,0xc1,0x0d,0x04,0x26,0x3f,0x74,0xbd,0xdd,0x33,0xaa,0xd6,0x62,0x56,0xb1,0xe7,0x2d,0x7b,0x66,0xa2,0x40 +.byte 0xb4,0xe4,0xbd,0x8e,0x35,0xba,0xf1,0x2f,0x59,0xa7,0x01,0x6d,0x5a,0xa7,0xa6,0x3b,0x82,0xa3,0xb4,0x54,0x51,0x33,0x6b,0xfb,0x78,0x4a,0x74,0x88,0x7f,0x55,0xea,0x08,0x8e,0x19,0x78,0xbc,0x80,0x19,0x2f,0x41,0x97,0x20,0xa0,0x9e,0xbf,0x44,0xae,0x2e,0x26,0x66,0xe3,0x25,0xa0,0x92,0xa9,0xbe,0x8c,0x0d,0x96,0xec,0x93,0x99,0xe2,0xe7 +.byte 0x81,0xd5,0x10,0x62,0x3a,0x97,0x38,0x51,0x36,0x11,0x00,0xe0,0xc1,0x3a,0xc5,0xd4,0xa5,0x19,0xf4,0x82,0x66,0x0c,0xf9,0xb3,0x04,0x3e,0x57,0xc3,0x43,0xab,0xc6,0x52,0x95,0x8f,0xd3,0xf1,0xde,0xd9,0x57,0x6d,0x32,0x4f,0xc7,0x8c,0x1b,0x7a,0x53,0x6a,0xcf,0x56,0xea,0x61,0xb4,0xe5,0x64,0x2d,0x02,0x26,0x5b,0xcf,0x1c,0xc7,0x37,0xc3 +.byte 0x41,0xd2,0x1b,0x6c,0x5b,0x47,0xb8,0x73,0x89,0xfe,0x0e,0x7a,0x35,0x05,0xfc,0xea,0x6a,0x34,0x74,0x69,0xf0,0x12,0x29,0xa9,0x33,0xce,0x93,0x15,0xa0,0x68,0xb3,0x46,0x43,0xdb,0x8d,0xfa,0xef,0x93,0x66,0x72,0x18,0xae,0xe4,0xab,0xf4,0x8a,0xd1,0xb5,0x42,0xbd,0x2d,0xda,0xcb,0xf6,0x44,0x25,0xb1,0x01,0x8a,0xff,0xd5,0x34,0x16,0xec +.byte 0x7e,0x38,0x7b,0x50,0x41,0x61,0xf9,0xdf,0x4c,0x3e,0x02,0xd6,0xc3,0xce,0x19,0x9f,0x12,0x45,0x0c,0x99,0xb1,0xd9,0xeb,0xb9,0xe3,0xd5,0xb6,0x2b,0x25,0x8c,0x0b,0x04,0xf8,0x8d,0x41,0x41,0x3d,0x39,0x1b,0x7f,0x88,0xa7,0x8f,0x61,0x30,0xfe,0x67,0x75,0x35,0xd1,0x41,0x90,0xda,0x73,0x80,0xcf,0xc9,0xf6,0x44,0x00,0x67,0xcd,0xca,0xaf +.byte 0x6d,0x84,0x39,0x9a,0xb2,0xbb,0xfc,0xac,0x9b,0xb2,0x95,0x2f,0xc9,0x06,0x3a,0xa4,0x7b,0x9a,0x25,0xc6,0xe5,0xdb,0x7a,0xc6,0x8b,0x84,0x6a,0xb7,0x1e,0x22,0xaa,0x10,0x96,0xd3,0x55,0x50,0xa2,0x02,0x04,0x69,0x92,0xd7,0x6b,0x1f,0x9b,0x45,0x07,0x71,0xda,0xdc,0x76,0xc5,0xb8,0x34,0xa2,0x32,0x33,0x16,0x2e,0xb0,0x2a,0x90,0x43,0x40 +.byte 0x92,0x77,0x74,0x4e,0xdc,0xb4,0xe2,0x7d,0xc1,0x57,0xaf,0xf4,0x2c,0x20,0x65,0x77,0x88,0xc9,0x6e,0x69,0x38,0xc8,0x19,0x95,0x32,0x54,0x59,0x7f,0x37,0xd7,0x3c,0x07,0x05,0x87,0x2b,0xf9,0x58,0x74,0xc7,0x61,0x13,0x3d,0xc2,0xd9,0xec,0x3b,0x36,0x9f,0x8e,0xae,0x52,0xdd,0x5c,0xaa,0x29,0x6b,0x31,0x34,0x48,0x61,0x34,0x62,0x56,0xce +.byte 0x25,0xa8,0xc0,0x62,0xf5,0x35,0x58,0x4d,0x8e,0x61,0xd4,0xae,0x25,0x50,0xee,0x45,0xdd,0x14,0x7d,0x46,0x81,0x47,0xc3,0x3f,0x3f,0x81,0xdb,0x9a,0x59,0x56,0x4f,0x45,0xed,0x9c,0xe2,0xfc,0x96,0xff,0x5d,0x37,0x70,0xad,0xd2,0xeb,0xd9,0x2d,0x2a,0xaf,0xb9,0x16,0x4a,0x79,0x5d,0x76,0xb5,0x8f,0x74,0x19,0x6f,0x74,0x7d,0x4a,0xee,0x83 +.byte 0xa5,0x81,0xf3,0xd5,0xa0,0x43,0x5e,0x46,0xba,0xbe,0x49,0xa8,0xce,0x72,0x36,0x32,0xcd,0x8c,0x9b,0xa0,0xf9,0x5d,0xb7,0xb9,0xc7,0x8c,0xb2,0x59,0xb4,0x44,0xc1,0x90,0x53,0x92,0xd2,0xa8,0x4c,0xf9,0x35,0x40,0x32,0xd1,0xf0,0x2f,0xcb,0x6a,0x0b,0xe0,0xbe,0x34,0xc9,0x82,0x18,0x8d,0xfb,0xfc,0x50,0x8d,0x67,0xd5,0x86,0xd4,0xf1,0xb1 +.byte 0xaa,0x2f,0x9c,0xbc,0x52,0xbb,0x9f,0x17,0x1c,0x74,0x1d,0xdf,0x2d,0x1a,0x94,0x43,0x9b,0x80,0xb9,0x48,0xa3,0xaf,0x4b,0x30,0x0d,0xd9,0x3f,0x11,0x48,0x79,0x60,0xcc,0x25,0x6a,0xdb,0x8a,0xda,0xab,0xda,0x09,0x7c,0x9c,0x4a,0xaf,0xf9,0x0d,0xfb,0x7a,0x92,0x61,0xa5,0x17,0xf8,0x79,0x1b,0x00,0x52,0x56,0x5e,0x27,0x22,0x37,0xf4,0xbe +.byte 0x52,0x36,0xd3,0xdc,0x9a,0x33,0xf5,0x44,0x0e,0x53,0x0b,0xf6,0x9b,0xb0,0xb6,0x11,0xe4,0xd5,0x45,0x2e,0xdc,0xdb,0x46,0x18,0x9a,0x90,0x8b,0xcc,0xfe,0xc6,0x94,0x4f,0x97,0xb9,0x42,0xb6,0xd3,0x8f,0x7c,0x20,0xd1,0xa8,0xe6,0x85,0xce,0x65,0xeb,0x95,0x38,0x11,0x5c,0x1a,0x9d,0x34,0x25,0xc2,0xf0,0x33,0xbb,0x2c,0xc9,0x8d,0x0a,0x7a +.byte 0xb1,0x90,0x9f,0x24,0xed,0x35,0x3c,0x7e,0x71,0x82,0x12,0x3a,0x79,0x29,0xc8,0xa7,0x3e,0xa2,0x4e,0x50,0x03,0x94,0x7a,0x94,0xb7,0x2b,0x61,0x95,0x3d,0x5e,0x60,0x1c,0x68,0x51,0x82,0x73,0xe0,0x4a,0x2a,0x48,0x26,0xda,0xa3,0x53,0x8c,0x83,0xba,0x9f,0x95,0x37,0x5e,0x68,0x54,0x19,0x21,0xf8,0x31,0xaf,0x6b,0xfc,0x3a,0x3e,0xe3,0x3f +.byte 0xdb,0x16,0xb5,0x7e,0x13,0xf8,0xfd,0x7f,0x36,0xd6,0x8e,0x33,0xaa,0xe9,0xa4,0xa7,0xfd,0xf0,0x32,0xa6,0xdf,0xfa,0x22,0x7d,0xff,0x2a,0xe6,0x0d,0x6f,0xe2,0x21,0x54,0x6c,0x1a,0x99,0x17,0x56,0xad,0xce,0x39,0x6b,0x1a,0xe8,0x27,0x13,0x12,0x9c,0x4b,0x84,0x69,0x73,0xde,0x44,0x14,0xb2,0x7c,0x44,0x54,0x91,0x4f,0xeb,0x83,0xec,0x04 +.byte 0x73,0x85,0xb1,0xa8,0x44,0x72,0xa7,0x77,0xaf,0x0c,0xe0,0x52,0x65,0x04,0xe7,0x2a,0xee,0x0c,0x20,0x83,0x32,0x34,0x17,0x00,0x61,0xf9,0xf5,0x42,0x03,0xa4,0xb8,0x02,0x6f,0xb2,0xd3,0x65,0x51,0x2a,0x8e,0xdf,0x28,0x78,0x8a,0x8a,0x00,0xfb,0x24,0xd6,0xd5,0x86,0xaa,0xfb,0x86,0x93,0x5d,0x11,0xa4,0xf3,0xfd,0x36,0x18,0xf3,0x61,0xea +.byte 0x33,0xa8,0x0c,0xf0,0xb4,0x68,0xee,0xd3,0xe3,0x4f,0x22,0x24,0xde,0x1f,0x29,0x84,0x8b,0x5b,0x73,0x15,0xd6,0x62,0xa3,0x71,0x7d,0xf0,0x65,0x36,0xca,0x68,0x8a,0x6d,0x61,0x9c,0x0d,0x53,0xdd,0xf4,0x12,0xb3,0x5f,0xf0,0xb1,0x86,0xd6,0xe2,0xd6,0x80,0x4a,0x01,0x09,0x99,0x65,0xdb,0xae,0xe6,0xfc,0x68,0x5b,0xf9,0x10,0x99,0x8b,0x9f +.byte 0x08,0x52,0x09,0xae,0x59,0x4d,0x6c,0xf9,0x91,0x2b,0x57,0xea,0xf0,0xa3,0xdb,0xb8,0x99,0x29,0x2f,0xab,0x95,0x01,0x7d,0xec,0xd8,0x77,0x73,0x75,0x4f,0x88,0x44,0x69,0x76,0xc9,0x3c,0xf0,0x2d,0x7b,0x0d,0xbe,0xd4,0x88,0x0d,0xbc,0xa0,0x52,0xf4,0x2a,0xd1,0x62,0x2a,0xa9,0xe2,0x41,0x2f,0x52,0xce,0x96,0x7d,0x65,0x9b,0x74,0x82,0xde +.byte 0x43,0x4d,0xf8,0x8e,0x77,0x1c,0x18,0xf5,0x7e,0xab,0x94,0x3e,0xe7,0x90,0x2b,0xa1,0x16,0x00,0x7f,0x9c,0x9d,0x86,0xd1,0x74,0x7e,0xf7,0xbd,0x5a,0xa7,0x2f,0x0f,0xb0,0x5c,0xfc,0xfb,0x59,0x00,0xf3,0x84,0x09,0x77,0x66,0x17,0xf6,0x5d,0x0e,0xe2,0xe2,0xd4,0xb3,0x9e,0x79,0x88,0x66,0xa5,0x8e,0x30,0xae,0xca,0x7e,0x2b,0x32,0xa2,0x89 +.byte 0xe9,0x7e,0x59,0x21,0xd5,0x99,0xc7,0x10,0xa8,0x6f,0x95,0x8d,0x84,0xb4,0xcf,0x61,0xe7,0x5c,0x09,0xf3,0xbc,0xeb,0xf6,0x0c,0x84,0x1a,0x8d,0x13,0xf8,0x49,0x22,0xeb,0x09,0x55,0xef,0x56,0x12,0x21,0xcb,0x61,0x87,0xbf,0xef,0x43,0x5b,0x82,0xa8,0xc2,0xa2,0x5e,0xad,0x54,0x9a,0xcc,0x95,0xa2,0x01,0x05,0xb2,0xbb,0x26,0xa8,0xfd,0x6b +.byte 0x66,0x95,0x9c,0x0b,0x7b,0x23,0x32,0xff,0xdd,0x6c,0x18,0x1e,0x77,0x01,0x3c,0x82,0xaa,0x97,0x28,0x0f,0x93,0xa5,0x6c,0x85,0xe5,0x94,0x40,0xe0,0xa3,0x01,0x57,0x56,0x43,0x40,0xdd,0xa9,0xaf,0x21,0x79,0x10,0x8b,0xff,0x4b,0x51,0xe4,0xa2,0xe5,0xd7,0x0c,0xe2,0x9e,0x1e,0x38,0xdb,0x64,0xe1,0xb1,0x5b,0xe5,0x40,0xab,0xf6,0x05,0xd2 +.byte 0xba,0x85,0x78,0x61,0x2d,0x2e,0x07,0x06,0x6d,0x86,0x59,0xaa,0xd9,0x2c,0xfb,0x83,0x34,0xd0,0x2d,0x1d,0xad,0x5f,0xe4,0xac,0x05,0x46,0x3a,0x7b,0xd9,0xef,0x9f,0x2b,0x0c,0x18,0x21,0xf1,0x24,0x8a,0xb4,0x6e,0xd2,0x98,0x75,0x08,0x96,0x0c,0x7b,0x41,0xb7,0xf7,0x1f,0xcd,0xa8,0x1f,0x44,0xb1,0xed,0xdc,0x0e,0xcb,0x94,0xa0,0xb8,0x62 +.byte 0x67,0xdc,0x24,0xde,0x9e,0xe9,0x89,0xcd,0x92,0x7c,0x91,0x15,0xff,0xbd,0xfd,0xee,0xf8,0x29,0xd7,0xf9,0xe8,0x51,0xe7,0xc8,0x21,0xc5,0x20,0xe4,0xb8,0xa6,0xdb,0xfb,0x09,0x65,0x1c,0x3b,0x9e,0x39,0x44,0xcf,0xf5,0xc2,0x7b,0xf3,0x14,0x7d,0x69,0xf2,0xd0,0x97,0x63,0xf1,0xa7,0x81,0x56,0xfb,0xdf,0x4d,0x83,0x55,0x4f,0xde,0x50,0x7d +.byte 0xfe,0xb0,0xc0,0xc8,0x3b,0x3d,0x78,0x74,0x58,0x74,0x5e,0xfc,0xb7,0x0d,0x9a,0x26,0x3b,0x39,0xb6,0xf7,0xe0,0xe4,0x12,0x3c,0xd6,0x88,0x1c,0x9b,0x51,0x89,0xe7,0x53,0xcd,0x24,0x2e,0x34,0xa2,0xee,0xfa,0x5a,0x87,0xe5,0x7e,0xd5,0xf2,0x2f,0x15,0x99,0x57,0x5d,0x31,0x02,0xf8,0x08,0x38,0xea,0x8c,0x30,0x21,0xb0,0xff,0x94,0x51,0xcf +.byte 0x23,0xb7,0x02,0x5d,0xa3,0x75,0x7f,0x9d,0x66,0x49,0xe5,0xbe,0xc7,0x06,0x5e,0x1d,0xc9,0xe2,0x82,0x8a,0xc4,0x17,0x83,0x7e,0x65,0x6d,0x85,0x26,0x66,0xc0,0xf4,0xa5,0x1c,0x6e,0xba,0x32,0xfa,0x41,0x7b,0x2b,0x64,0x98,0x58,0x8c,0xce,0x2f,0xf3,0x56,0xf0,0x67,0xef,0x73,0x79,0xc4,0xc2,0x07,0xd7,0x85,0x1d,0x75,0x38,0x1e,0x15,0x82 +.byte 0x9d,0xf3,0xdd,0x3a,0x72,0xa3,0x23,0x0e,0x4a,0x1a,0x3a,0x97,0xc8,0xf1,0xf1,0x58,0x5d,0x1f,0xae,0x6d,0xc8,0x03,0xe0,0x7b,0x0f,0xf5,0x6f,0x35,0x41,0x8d,0xd5,0x03,0x85,0xdd,0xeb,0x3d,0x73,0xb1,0x93,0x35,0xc0,0x0f,0xfb,0x42,0xd4,0xf1,0x6b,0x35,0xe2,0x96,0xc5,0xd9,0xf2,0x69,0xbb,0x70,0x5e,0xf0,0x0c,0xe6,0xb5,0x81,0x94,0xc9 +.byte 0x29,0xa1,0x34,0x89,0xd9,0x9c,0x49,0x01,0x37,0x56,0x16,0x30,0x47,0x6f,0xe4,0x7c,0x5b,0xdd,0xfb,0x80,0x7f,0x0c,0x38,0x53,0x3d,0x57,0xf7,0xc4,0x80,0xf9,0x12,0x3a,0x9f,0xf9,0xb0,0xb6,0x94,0x6d,0xde,0x41,0x4e,0x30,0xac,0x1f,0x25,0x34,0xa0,0x95,0xe8,0x00,0x86,0x32,0x40,0xbb,0xc1,0x49,0x2d,0x07,0x49,0xb8,0x5f,0xcd,0x1b,0xd3 +.byte 0x0e,0x0c,0x54,0x0f,0xe4,0x20,0xe5,0xa1,0xed,0x98,0x65,0x5a,0xe7,0xce,0x68,0x9c,0x4c,0x48,0x03,0x9c,0x5b,0x68,0x4b,0x75,0x71,0x11,0x40,0x69,0xca,0x9a,0x3a,0xb2,0x3d,0x35,0x2c,0x70,0x35,0x8b,0x80,0x53,0x86,0x30,0x7d,0x4c,0xe9,0xc0,0x30,0x60,0xd0,0x06,0xbe,0xc2,0xad,0x39,0xcc,0xb2,0xec,0x90,0xcc,0xbd,0x7c,0xb5,0x57,0x20 +.byte 0x34,0x2e,0xfc,0xce,0xff,0xe3,0xd9,0xac,0xb8,0x62,0x6b,0x45,0x22,0x34,0xdf,0x8e,0x4b,0xf1,0x80,0x28,0x8d,0x0f,0xd5,0x3b,0x61,0x3e,0x91,0xa1,0xb1,0x85,0x27,0x78,0x88,0xbc,0xc4,0xb1,0xa1,0xbe,0x4f,0xc3,0xfd,0x1f,0xb9,0x30,0x31,0x2f,0xc1,0x9d,0xa3,0xb6,0x29,0xa4,0x60,0x82,0x73,0x93,0x74,0xea,0x97,0x67,0xf2,0xa3,0x97,0x50 +.byte 0x2f,0x9f,0x7b,0x23,0x18,0xb6,0xb4,0xee,0x15,0xa0,0xa4,0x07,0x1a,0xe9,0xb6,0x63,0x7e,0x88,0x40,0x57,0x86,0x79,0x6b,0x75,0xbe,0x57,0x8f,0xfe,0x0d,0xdf,0x4c,0x7f,0x39,0x9a,0x97,0xa6,0x87,0xc5,0xfd,0x52,0x77,0x36,0xc9,0x66,0x63,0xcf,0xc7,0x34,0x3b,0xf4,0x7a,0x12,0x56,0xf0,0xbc,0x7a,0x1a,0xa2,0xa2,0x51,0xb8,0xc1,0x70,0x81 +.byte 0xcf,0x1d,0xb5,0xe2,0x82,0xbb,0xfc,0xa3,0x80,0x18,0xf8,0x4b,0x76,0x9c,0xdf,0x9d,0x6c,0xf1,0xd8,0x2a,0xab,0x0c,0x12,0x02,0x29,0x09,0xfd,0x28,0xfb,0x57,0x38,0x05,0x2c,0xc5,0x67,0xd1,0xaa,0xbc,0x98,0xe6,0x22,0x78,0x06,0x4f,0x69,0x6a,0x63,0x1a,0x13,0x0b,0xa5,0xd2,0x61,0xc7,0x45,0x5b,0x21,0xab,0xbf,0x7b,0x7f,0x8c,0x2c,0xba +.byte 0x93,0x9f,0x41,0x67,0xc4,0x5f,0x53,0xac,0x90,0x05,0x86,0xb5,0x80,0x1f,0x5b,0x35,0x4f,0x92,0xf5,0xa8,0x5f,0xfb,0x56,0xdd,0x2d,0x9b,0xea,0xcb,0x0f,0x98,0x3c,0x4e,0xf1,0xa5,0x2c,0x37,0x70,0xe3,0x5c,0xaf,0x96,0x36,0xa8,0x2a,0xec,0xe0,0x2c,0x00,0xcd,0xaf,0x03,0x1d,0x05,0x2f,0x8c,0xe7,0xfe,0x4d,0xe9,0x97,0x6d,0xe1,0xf9,0x23 +.byte 0x60,0x08,0xea,0xfb,0x27,0xc8,0xf9,0xdf,0x49,0xfe,0xd9,0x48,0x35,0x6b,0x43,0xc5,0x19,0x90,0xb1,0xf1,0xee,0x84,0x7a,0x57,0xfa,0xa5,0xd6,0xd8,0xc9,0xf0,0x8a,0xe7,0x13,0x84,0xfc,0x28,0x54,0xae,0x99,0xfd,0x91,0xbe,0x91,0x27,0x98,0x28,0xdc,0xd7,0x2e,0xc1,0x21,0xcb,0x31,0xf8,0x47,0xe6,0x77,0x6d,0xee,0x7b,0x12,0xe4,0x9e,0x9d +.byte 0x07,0x46,0xa9,0x15,0x0b,0x3c,0xbe,0xc7,0x2d,0xe5,0xd6,0x25,0x4c,0xea,0x61,0xdc,0x18,0xb2,0x9d,0xb0,0x9a,0xff,0xa3,0x5f,0x2b,0xab,0x52,0x7d,0x1b,0xc3,0xa3,0x41,0x8f,0x5a,0x29,0xbd,0xc4,0x56,0x54,0x43,0x2d,0x61,0x07,0xed,0xd1,0x81,0x45,0xdb,0x61,0x0f,0xda,0xea,0xa6,0x1e,0xf9,0x9c,0xc0,0x8c,0xc4,0x8e,0xc7,0xca,0x38,0xe2 +.byte 0x45,0xde,0xdc,0xc5,0xc6,0xb0,0x43,0x17,0x8b,0xb1,0x58,0xd1,0x10,0x8e,0xa5,0x17,0x37,0x85,0xca,0x61,0x67,0x5c,0xd0,0x72,0x22,0x6b,0xd3,0x3b,0x53,0xbc,0xfb,0xe1,0x1e,0xa4,0x1b,0xd3,0xc3,0x8a,0x50,0x03,0x39,0xf5,0x36,0xdf,0x51,0x2e,0x05,0x4a,0xa8,0xdb,0x91,0x87,0xae,0xfe,0x3f,0x5c,0x35,0x5e,0xf9,0x8f,0x43,0x9e,0x92,0x36 +.byte 0x91,0x27,0x90,0xe8,0x7c,0xcc,0xc4,0x9c,0x13,0xbb,0x61,0x40,0xec,0x4f,0x49,0xcf,0x04,0x38,0x77,0x3b,0xb5,0xf8,0x69,0x8d,0xbb,0xb2,0x30,0x32,0x42,0x4d,0x7d,0x6c,0x56,0xdc,0xf4,0x8f,0xfc,0xb8,0x53,0xc5,0x11,0x17,0x23,0x94,0xf9,0x6d,0x6f,0xee,0xee,0x31,0xbf,0xce,0x11,0x8b,0x9e,0xd7,0xa5,0x09,0x36,0x89,0x72,0x25,0x18,0x1f +.byte 0x13,0xa7,0xdf,0xc5,0x91,0x7e,0xd6,0x2b,0xb8,0x08,0x9c,0x12,0x83,0x21,0x97,0x3d,0xad,0xac,0x1c,0x54,0xf3,0x65,0x04,0x2f,0x09,0xd1,0xd2,0xe5,0xce,0x24,0xb1,0xd9,0xe4,0x38,0x1f,0xb4,0xce,0xea,0x27,0x7f,0x5f,0x16,0x52,0xa4,0x2f,0x2f,0xaf,0x91,0xec,0x7a,0x21,0xf7,0xa1,0x38,0x78,0x78,0xc5,0xa9,0x94,0x63,0x87,0xf8,0x95,0x9e +.byte 0xf9,0x82,0x98,0x6d,0x9d,0x48,0x80,0xaa,0x7a,0x36,0xf9,0x5f,0xfb,0x39,0x3d,0xae,0xbc,0xcd,0xfc,0x67,0x46,0x07,0x7e,0xdf,0xef,0xff,0x8d,0x67,0xe7,0xd9,0x60,0x90,0x7b,0x49,0x10,0x65,0x3a,0x60,0x87,0x7a,0xed,0x9a,0x44,0x48,0x81,0xcc,0xad,0xe4,0x6a,0x62,0xf8,0x02,0x6f,0x41,0x8a,0x8d,0x44,0x28,0x1a,0xb8,0x52,0x60,0x4b,0x3f +.byte 0xfc,0xdd,0x33,0xad,0x14,0xb1,0x34,0x63,0x1f,0xdc,0xeb,0x9a,0x3f,0x99,0x82,0x28,0x36,0x6f,0x8e,0xd7,0x39,0x2e,0xc0,0x37,0xfb,0xad,0x57,0x6c,0x82,0x1a,0xc6,0xe4,0x4b,0xca,0x00,0x68,0x57,0x34,0xf0,0x57,0x6a,0xcb,0x50,0x5d,0x8d,0xfa,0xcd,0x89,0x41,0x91,0x23,0x98,0x1f,0x4f,0x18,0xb6,0xd2,0x9d,0xde,0x2f,0x5c,0xe6,0x08,0x76 +.byte 0x97,0xba,0x24,0x4e,0x84,0xd7,0xeb,0x80,0xde,0xec,0xee,0x51,0x5a,0x0e,0x5f,0xb7,0x37,0xda,0xa5,0x94,0x2b,0x6d,0x73,0xb7,0x6c,0x22,0x95,0x3a,0xaa,0x5c,0x6f,0x89,0x90,0xec,0xb3,0x31,0x00,0x37,0x28,0x18,0xbb,0x98,0x23,0xfc,0x3e,0x21,0x7c,0xaa,0x44,0x54,0x7b,0xe6,0xa0,0x17,0x58,0xef,0x11,0x3f,0x48,0xb8,0xa8,0x15,0x4a,0x92 +.byte 0xa9,0x39,0xe2,0xa6,0x38,0x03,0xa6,0xd3,0x79,0x8b,0x38,0x06,0xaf,0x4b,0xd4,0xab,0x0a,0x13,0xff,0x2d,0xfa,0xab,0x4b,0x64,0x9e,0xb0,0x3d,0xba,0x18,0x01,0xfd,0xc3,0x6a,0x6f,0x21,0x9c,0xf5,0x2f,0xab,0x2d,0x42,0x12,0xc9,0x72,0xde,0x83,0x42,0x6a,0xf0,0xd4,0x96,0x73,0xf1,0x93,0xa3,0x2d,0x9b,0xb4,0x94,0x51,0x0c,0x6e,0x8e,0xf0 +.byte 0x5e,0xbf,0x98,0xbf,0x08,0x0f,0xd8,0x6c,0x65,0x4e,0xb5,0x47,0xeb,0x7c,0x1b,0x73,0xe0,0xe6,0x2c,0x03,0xd2,0x2a,0x32,0xff,0xa7,0x03,0x6d,0x38,0x47,0x56,0x4b,0x25,0x0b,0x39,0x73,0x87,0x4b,0xa5,0x12,0x79,0x79,0xf3,0x88,0x37,0xe2,0x4f,0xb8,0xbf,0x70,0x0e,0xf7,0x8c,0xe6,0xa3,0xbc,0x35,0x10,0xcd,0x72,0x56,0xd6,0x83,0xc1,0x0b +.byte 0x5b,0xf3,0xa8,0x74,0xc7,0xb9,0x84,0xc8,0x6c,0xff,0x66,0xad,0x95,0x6f,0xbc,0x82,0x84,0x2a,0x11,0x40,0xf9,0xa8,0x3f,0x05,0xf9,0xab,0x19,0x55,0xce,0x80,0x90,0x65,0x49,0x3d,0xe1,0x54,0x2c,0x1a,0xdb,0xf3,0xaa,0x2f,0xeb,0xf5,0x10,0x1f,0x8c,0x35,0x46,0x68,0xb1,0x4c,0x52,0xe7,0xe9,0x58,0x78,0x33,0xfd,0xc6,0x13,0x0e,0x69,0xae +.byte 0xf4,0x1a,0x8a,0x77,0x8f,0xcc,0x98,0x74,0x88,0x20,0x84,0x5b,0x83,0x54,0xa9,0xee,0xc2,0x0f,0x8a,0x46,0xb1,0xc7,0xfb,0xfd,0xf2,0x2c,0xaf,0xfa,0x72,0x34,0x7a,0x79,0x50,0x10,0xc6,0x04,0xfd,0x0a,0x1e,0x4a,0xb5,0xf5,0xe7,0x4d,0x98,0x80,0x5d,0x0b,0x81,0x23,0xc3,0x6e,0xbf,0xc8,0xcd,0x35,0x96,0x5a,0x58,0xec,0xef,0x6a,0x8d,0x48 +.byte 0xda,0x48,0xbb,0x8f,0xcc,0x1f,0x86,0xff,0x7a,0x27,0xef,0xe6,0xb7,0xc7,0x2a,0x47,0x8d,0x6c,0x4a,0xc6,0x0a,0x32,0x67,0x1d,0x2f,0x83,0x3d,0x46,0x41,0x46,0x1c,0x75,0x7b,0x29,0x89,0xa2,0x65,0x9b,0x53,0x3d,0xd9,0x90,0x83,0xce,0xab,0x07,0xbb,0x46,0x61,0xb1,0x54,0xbd,0xc9,0x98,0xf7,0x96,0x76,0x03,0xdc,0x1f,0x1b,0xf2,0x5c,0x07 +.byte 0xdd,0x24,0x94,0x72,0x1e,0x94,0xb1,0x14,0x0b,0x40,0x77,0xde,0x3d,0x3f,0x1c,0xf0,0x8f,0xa4,0xcb,0x34,0xb5,0x2b,0x72,0x53,0x78,0xf3,0x3f,0x8e,0x47,0x30,0xb2,0x7e,0x73,0x3f,0x9a,0xef,0x19,0xb1,0xef,0x82,0x99,0xd4,0x17,0x60,0x94,0xf6,0x15,0x75,0x50,0x1f,0xb3,0xdd,0xae,0x1f,0xf8,0x63,0x9a,0x30,0x2c,0xf0,0xdd,0xbf,0x49,0x70 +.byte 0xd7,0x86,0x4a,0x5c,0x46,0x10,0x48,0x46,0x02,0x18,0xa4,0x39,0xb6,0x75,0x11,0x21,0xae,0x62,0x64,0xd8,0x85,0xc8,0xda,0xd2,0xd6,0x69,0xcc,0x37,0x57,0x49,0x73,0x1a,0x10,0x7b,0xd7,0x58,0xdd,0x0b,0xf3,0x16,0xe7,0x62,0x2c,0x32,0x92,0x0e,0x70,0x6f,0x77,0x74,0x0d,0xff,0xc2,0x8d,0x3b,0x3f,0x29,0x28,0x8f,0x88,0xb8,0x02,0x5b,0x3a +.byte 0x8b,0x65,0x89,0x92,0x2f,0xc7,0x30,0x73,0xc3,0x20,0xbc,0xa4,0xe4,0x5e,0xea,0xf8,0x21,0xb6,0xc5,0x47,0x56,0x35,0x8f,0xf6,0xd5,0xdd,0x77,0x1d,0xdf,0xd0,0x27,0xa3,0x04,0xb9,0xd0,0xc4,0x28,0x16,0xa5,0xaf,0x47,0x55,0x85,0x93,0x38,0xf4,0xac,0x13,0x30,0x7d,0x77,0x1f,0x3d,0xd5,0xd7,0x22,0xbe,0xe2,0x4e,0x6d,0x4b,0x0e,0xbe,0x1d +.byte 0x43,0x79,0x34,0x95,0x6f,0x38,0xa1,0xb3,0xa0,0xed,0xf6,0x17,0xf4,0x24,0x70,0x26,0x18,0x3e,0x1c,0xde,0xdc,0xa9,0x67,0x12,0xd3,0xc8,0xd7,0x70,0x13,0xa5,0xb3,0x25,0xe1,0x0a,0xe9,0xf6,0x4e,0x56,0x82,0x17,0xdc,0xbc,0x96,0x2f,0x59,0x03,0x9b,0xf4,0xc3,0x66,0xd2,0x90,0x95,0x1d,0xe0,0x99,0xfb,0xd8,0xa8,0x14,0xc7,0xa6,0x12,0x6b +.byte 0x08,0x6a,0xc8,0x0f,0x34,0x2a,0xb6,0xc4,0x9a,0xcd,0x61,0xf7,0x61,0xa3,0x59,0x29,0x11,0x30,0x76,0xb5,0x97,0xbc,0x2f,0x87,0xd8,0x12,0xb3,0x1d,0x99,0x8d,0x5d,0x57,0x0c,0xda,0xb0,0x9f,0x51,0x1a,0xb5,0xc6,0x94,0xc3,0xe9,0x5a,0x72,0x0c,0x37,0x76,0xb6,0x3c,0x00,0x02,0x69,0xad,0x8e,0x66,0x8b,0x5c,0x13,0x48,0xb7,0x9e,0xc5,0x7e +.byte 0xe0,0x35,0x07,0xd2,0x04,0x9c,0x35,0x95,0x8b,0x55,0x87,0x03,0x32,0x36,0xeb,0x11,0x88,0x54,0x8d,0x3e,0x88,0x46,0xc2,0xfe,0x24,0xa4,0x4b,0x92,0x19,0x44,0x6c,0xc9,0x69,0x32,0x22,0x95,0x5b,0xda,0x58,0xa4,0x00,0x33,0x83,0x2d,0xa4,0x17,0x2e,0x00,0x4d,0x9a,0x7d,0xef,0x04,0xa8,0x8b,0xf2,0x7c,0xb9,0xdb,0x54,0xcf,0x63,0x14,0x52 +.byte 0x5b,0x79,0xf6,0x89,0x5c,0xfa,0x8a,0x85,0x88,0x7f,0xca,0xed,0xfb,0x62,0xbc,0x1d,0x0d,0x90,0x51,0x27,0x45,0x74,0xa0,0x55,0xfc,0x60,0xea,0xef,0x6e,0x40,0xeb,0x0b,0x61,0x45,0x44,0xee,0xb6,0x20,0x4c,0xe1,0x08,0x62,0x29,0xdd,0xd0,0xa1,0xd5,0x7f,0x42,0xb9,0x0f,0x12,0xef,0xfb,0x13,0xa2,0xf1,0x85,0xaa,0x56,0x18,0x6c,0x70,0x7a +.byte 0x4d,0x52,0x76,0xce,0xa9,0xed,0x0a,0xcc,0x55,0xf0,0x01,0x99,0x44,0xe9,0xc4,0x74,0x33,0x2a,0xce,0x53,0xf3,0x4f,0x8f,0x1c,0x67,0x39,0x2b,0x0e,0x46,0xe2,0x49,0x06,0x52,0xbf,0xc4,0x3f,0x93,0x84,0x46,0x0a,0x9b,0xcb,0x1d,0xa5,0x66,0x9c,0x3e,0x3d,0xd1,0x92,0xda,0xe2,0x11,0x5b,0x89,0x7a,0xc4,0x33,0xba,0xa9,0x19,0xfd,0x3c,0xe3 +.byte 0xf0,0xa0,0x9b,0x83,0x50,0xce,0xa9,0x62,0xe3,0x85,0xc6,0xc4,0xe5,0x22,0xbb,0x1a,0x8e,0x04,0xb5,0x4d,0xca,0x18,0x7d,0xb0,0x99,0x50,0x78,0x88,0x69,0x43,0xe0,0xfd,0x90,0xa6,0xbf,0xdc,0xe3,0x03,0xf2,0x5d,0xa1,0xa2,0x88,0xc7,0xab,0xa9,0xc2,0xda,0x3f,0xff,0x79,0xa6,0x07,0xfd,0xc4,0xb1,0xfb,0x47,0x3d,0x75,0x82,0x26,0x52,0x85 +.byte 0x3f,0xf9,0xc9,0x85,0x46,0x24,0xe9,0x0f,0x96,0x8c,0xbb,0x02,0x83,0x60,0x69,0x49,0x8c,0x38,0xd1,0x4e,0xd0,0x63,0x2c,0xb6,0x12,0xb2,0x8e,0x4b,0xd3,0xe3,0xdf,0x20,0x00,0x99,0xf1,0x06,0x93,0xbf,0x27,0x42,0x8b,0xe3,0x8d,0x4c,0x3b,0x05,0x62,0x64,0x21,0xb1,0xfe,0xce,0x08,0xd2,0x23,0x69,0x11,0x74,0x31,0x3a,0x90,0x10,0x07,0x1a +.byte 0xd5,0xf5,0xc2,0x09,0x61,0x67,0x65,0x99,0x3a,0xf3,0x9e,0x4a,0xd8,0xa1,0xb2,0x50,0xf4,0x07,0xf0,0x7b,0x89,0x6d,0x4d,0x6a,0xd4,0x54,0xb9,0x3c,0xd5,0x4e,0x1c,0x12,0x0f,0x19,0x92,0x97,0x21,0x65,0x83,0x33,0x20,0x92,0x95,0xd4,0x0e,0x78,0xf4,0x92,0x16,0x36,0xd8,0x1b,0xd8,0xbf,0x41,0xe4,0xfb,0xb9,0x81,0x26,0x72,0x7e,0x1b,0x58 +.byte 0x05,0x45,0x97,0x66,0xf2,0x23,0x16,0xca,0x4e,0x95,0xc2,0x6c,0x60,0x84,0x5f,0x77,0x82,0x44,0x0e,0xf7,0x30,0xaa,0x51,0xa9,0x85,0x8b,0x03,0xfc,0x3d,0x6d,0x66,0x91,0x37,0xa5,0x1c,0xf8,0xcf,0x9d,0xd8,0xcd,0x8c,0xa1,0x29,0xbd,0xb5,0x4f,0x47,0xba,0xd1,0x55,0x3b,0x4e,0xc9,0xce,0x4c,0xcf,0x2e,0x19,0xa0,0x95,0xe6,0xcb,0x36,0x97 +.byte 0x3e,0x23,0xbe,0x09,0xfd,0x38,0x47,0x00,0x03,0xec,0x49,0xbb,0x49,0x1f,0x45,0x84,0x0f,0x1e,0x74,0xab,0xc9,0x07,0x00,0x04,0x70,0xe9,0xbd,0x61,0xb1,0x92,0xee,0x67,0x9a,0x5e,0x90,0xdc,0xe7,0x99,0x36,0xd0,0x58,0x15,0xe5,0x15,0xa2,0x1d,0x61,0x18,0x39,0x5f,0x6c,0xc7,0xbe,0xd0,0x23,0x1e,0x41,0xc8,0xaa,0x8e,0xbf,0xb8,0xdb,0x90 +.byte 0x8c,0x60,0x07,0x1e,0xe9,0x6c,0xe4,0xde,0xec,0x73,0x34,0x94,0x54,0xa4,0x6b,0x49,0xcf,0x87,0xb5,0x88,0x98,0xe6,0x2c,0xce,0xb7,0x76,0xa5,0x29,0xf1,0x29,0x50,0xc5,0x9e,0x13,0xe4,0x61,0x6a,0x54,0xb2,0x26,0xfa,0xfa,0x4a,0x41,0x3b,0x0a,0xf5,0x9a,0x60,0xbb,0xfc,0x1e,0x5d,0x21,0x7e,0x91,0x51,0xd6,0x5e,0x92,0xf9,0x21,0x80,0xa8 +.byte 0x35,0xc0,0xbb,0x7a,0xeb,0x75,0xb4,0xa3,0xd3,0x8d,0xaf,0x07,0x53,0x65,0x36,0x11,0xf9,0xb6,0x69,0x29,0x1e,0x5d,0x8f,0x57,0x5d,0xed,0x42,0xf9,0xd5,0xf6,0xc3,0x1e,0x29,0xc4,0x49,0x04,0xe4,0xfb,0xbf,0x9b,0x4a,0x7b,0xdd,0x57,0x51,0xfe,0xc4,0xd1,0xd9,0xe9,0x8f,0x94,0x78,0xbc,0x5c,0xeb,0xb6,0xbc,0x51,0xb0,0x82,0x87,0x47,0xb4 +.byte 0xf7,0xf9,0x02,0xd7,0xac,0x23,0xc0,0xe5,0x9a,0xc3,0x2f,0xd2,0xb8,0xb2,0x62,0xb9,0xdb,0x49,0x85,0x77,0x92,0xa6,0xe5,0x24,0x43,0x4d,0x0d,0x67,0x94,0x01,0x29,0xd6,0x2e,0xee,0xd9,0x2e,0x97,0x0e,0x20,0x7f,0x84,0x19,0x3c,0x3a,0x6f,0xa5,0xb0,0x8b,0x8f,0x8d,0x96,0xbb,0x76,0x61,0x97,0xc2,0x65,0x83,0xd8,0xda,0xab,0x42,0xfa,0xe5 +.byte 0x1e,0x42,0x93,0xa7,0x66,0x03,0x06,0x3b,0xbe,0xb8,0xae,0x71,0xee,0xdb,0x5d,0xdf,0x40,0x64,0x17,0x17,0x2e,0x03,0xca,0x37,0x2a,0x71,0x92,0x0a,0x01,0xa3,0x0f,0x0b,0x09,0xf2,0x0e,0x4b,0x4d,0x18,0xf3,0xc4,0xf2,0x51,0x7b,0x53,0x30,0xab,0x24,0xa2,0x47,0x38,0xc9,0x2c,0xdf,0x0d,0x32,0x3e,0x3f,0x57,0x2d,0xfc,0x44,0x19,0x64,0x8b +.byte 0xe9,0x9a,0xc2,0xf2,0xf6,0x2d,0x30,0x0c,0x0f,0xc3,0xc3,0xfe,0xc2,0xd1,0xbc,0xe0,0xbf,0xaf,0xeb,0x40,0x64,0x28,0xe2,0xd9,0x3c,0x7e,0x24,0x94,0x8f,0xe8,0x54,0x8b,0x26,0x6b,0xe1,0x4e,0x44,0x5a,0x7d,0x7b,0x12,0x36,0x2c,0x12,0xad,0x26,0xbc,0xa7,0xa3,0x2b,0x25,0xb9,0xde,0xe6,0x64,0x2d,0xab,0x7f,0x15,0x22,0x51,0x26,0x1c,0x15 +.byte 0x5d,0x13,0x18,0x93,0xc1,0x19,0x65,0xca,0xf3,0x8b,0xe0,0xcf,0x8c,0x43,0xe9,0xfd,0xa1,0xbd,0xe9,0xde,0x78,0x26,0xcb,0x7c,0xdc,0x68,0x06,0x98,0xf6,0x90,0x44,0x40,0xf0,0x5e,0xe1,0x16,0xf5,0x5d,0x4d,0x9b,0x85,0xe6,0x26,0xbd,0xab,0xcc,0x46,0x62,0x18,0x51,0xd5,0x3c,0x9f,0x6e,0xfa,0xe7,0x94,0xfc,0xc2,0x1a,0x9d,0x63,0x2c,0xdc +.byte 0xc3,0x89,0x67,0x94,0x37,0x58,0x0d,0x13,0xb8,0xdf,0x41,0x3d,0x70,0x78,0x1e,0x61,0x75,0x77,0xcc,0xbf,0x5f,0xa8,0xd3,0x89,0xcc,0xd3,0x40,0x4e,0x65,0xbd,0xce,0x3c,0xf0,0x5a,0x8f,0xe2,0xe1,0x24,0xaa,0xed,0x0f,0xd1,0x03,0x0d,0xf5,0x36,0x98,0xcd,0xa5,0x77,0x40,0x24,0x0a,0x82,0x68,0x79,0x82,0x38,0x68,0x6f,0x2b,0x0b,0xce,0x0f +.byte 0xcd,0x0f,0xba,0xdb,0xb5,0x22,0x38,0xd2,0xb0,0x9f,0x0f,0x08,0x0d,0xd8,0x5e,0xa7,0xd0,0xa9,0x39,0x66,0x4c,0x46,0xce,0x2a,0xc3,0x67,0x8c,0x91,0xdc,0xf1,0xc0,0x3a,0x58,0x50,0x1f,0xb0,0xa4,0x4d,0xbf,0x99,0x57,0xcf,0xae,0xb2,0xaf,0x6a,0x42,0xd2,0x7f,0x85,0x8c,0x40,0xc6,0x9a,0x93,0x57,0x54,0xf5,0xb4,0x83,0x59,0xb5,0x19,0x52 +.byte 0x7c,0x8b,0x76,0xee,0x35,0x90,0xbf,0xbe,0x65,0x58,0x3b,0x25,0x52,0x18,0xd8,0x7f,0x1f,0xe6,0x70,0xce,0x56,0x1a,0x45,0xa0,0x81,0xee,0x95,0x6f,0x55,0x43,0xaa,0x6e,0x87,0xa9,0xab,0x7d,0xe9,0xa1,0xa3,0x63,0xe7,0x1b,0x6b,0xa6,0x2c,0xe5,0x4a,0xb2,0x1e,0x73,0x5e,0xb5,0xae,0x83,0xe6,0x54,0x0b,0xc5,0x6b,0xb6,0xc4,0x73,0x62,0x1a +.byte 0xbf,0x1a,0x65,0xa2,0x5e,0x3a,0x45,0xd9,0xba,0x5b,0xef,0xf7,0x13,0x0c,0x7c,0x68,0xa1,0x98,0x71,0xb7,0x39,0x7c,0xbc,0x69,0xdb,0xd4,0xac,0x3f,0x82,0x63,0x9b,0x71,0x25,0x3a,0x06,0x73,0x60,0x71,0xc3,0x30,0xd3,0x96,0x02,0x4b,0x46,0xbd,0xd4,0x6e,0xc6,0x29,0xcc,0xd0,0xe1,0x0b,0x66,0x62,0xea,0x29,0xc7,0xcf,0x35,0x9e,0x2f,0x1f +.byte 0xa0,0xfc,0x8c,0x4a,0x83,0x8e,0x3b,0xf5,0x7a,0x6f,0x52,0xaf,0x99,0x9c,0x86,0xab,0xe5,0x1b,0x82,0xb3,0x18,0x35,0x77,0x9b,0xa3,0x94,0xc8,0x39,0x30,0x3f,0xad,0xa9,0x0f,0x93,0xb8,0xc8,0xed,0x04,0xf2,0x0b,0x9a,0xb1,0xd1,0xc9,0x9e,0x40,0x4f,0x71,0x21,0x63,0x2a,0x05,0x26,0x53,0xa3,0x3f,0x43,0xe4,0xf8,0x7c,0x2f,0xa3,0x5a,0x6e +.byte 0xc1,0x40,0xa8,0x4d,0xbc,0x03,0xae,0xe9,0x36,0xb6,0x37,0xdc,0x5f,0xef,0xb0,0x35,0x33,0xdf,0x33,0x71,0xaf,0x80,0xf2,0x69,0xd9,0xb5,0xfc,0xff,0xd2,0x5b,0x6a,0xeb,0xdc,0xe0,0x26,0x43,0x38,0x7b,0x24,0xb2,0x79,0x53,0x52,0x57,0xc4,0x1f,0x6d,0xc9,0x50,0xf2,0x63,0x9d,0xc1,0x22,0x5f,0x11,0x82,0x38,0xdb,0xd3,0xb4,0x1d,0x10,0x72 +.byte 0x9e,0x4d,0x03,0x30,0xba,0x5e,0xe9,0x8c,0x21,0x12,0xe6,0x3a,0xd6,0x4c,0x18,0xa4,0x27,0xc9,0xf5,0x50,0xbd,0xbe,0xf0,0x86,0xd8,0x00,0x56,0xf0,0x10,0x81,0xec,0xeb,0xfc,0x5b,0x29,0x88,0xff,0x73,0x60,0x6b,0xf5,0x8c,0x0b,0x30,0x04,0x53,0x85,0x61,0x0c,0xfc,0xff,0x8f,0x21,0xd2,0xa1,0xcb,0xf7,0x90,0x53,0x3b,0xf4,0xf0,0x2c,0x7d +.byte 0xb6,0x84,0xe7,0x4c,0x88,0xea,0x4f,0xdf,0xff,0x0f,0x5d,0x0f,0xd3,0x2d,0x4f,0x7e,0xdc,0xd1,0x22,0x71,0x0d,0xae,0xa8,0xcf,0x05,0x7b,0xfc,0xfe,0x87,0x40,0xa5,0xe8,0xfd,0x3f,0xdb,0x2f,0x00,0x21,0xb9,0x70,0x02,0x2c,0x96,0x24,0xaf,0x35,0xe2,0x87,0xcb,0x50,0xcf,0x7e,0xfa,0xaf,0x39,0x82,0x0c,0xd5,0xa6,0x3f,0x9c,0x77,0x60,0x16 +.byte 0xbf,0x42,0xcc,0x97,0xd1,0x19,0x0d,0x8a,0x50,0x98,0x7d,0x19,0x7b,0x40,0x1c,0x22,0xde,0x50,0x90,0x32,0x9a,0x3d,0x07,0x35,0xc0,0x48,0x4c,0x0a,0xcd,0x91,0xab,0xf7,0xf3,0x06,0x77,0x80,0x96,0x7b,0x59,0x33,0xe6,0xbf,0x93,0xb8,0x59,0xd0,0x3a,0x1f,0xcc,0xe7,0x1d,0xd4,0xb5,0x58,0xee,0xe7,0x95,0xfa,0x75,0xdb,0x37,0x74,0xb0,0x7d +.byte 0x4d,0xee,0xef,0x20,0x13,0xe5,0x82,0x07,0x8e,0xdd,0x57,0x75,0x33,0x56,0xc4,0x80,0xb0,0x06,0x9f,0x6b,0x72,0x31,0xcf,0xac,0x5f,0x96,0x13,0xeb,0xf4,0x34,0xb6,0x6b,0x55,0xef,0x55,0x26,0x4e,0xdb,0x6c,0x2f,0x64,0x29,0x91,0x3c,0x6d,0x29,0xd2,0x94,0xbd,0x2c,0x99,0xb9,0x97,0x76,0xee,0x7d,0xfd,0xb2,0x8d,0x14,0x4f,0x09,0x81,0xb3 +.byte 0x68,0x3e,0x79,0x28,0x56,0x50,0x3f,0x86,0x4c,0x95,0x6c,0xad,0xf6,0xc5,0x43,0x25,0xea,0xbc,0xe2,0xba,0x77,0x18,0xc6,0x82,0x65,0x73,0x38,0x90,0x9d,0xc9,0x57,0xcd,0xa2,0x7c,0xd3,0x26,0x59,0x44,0xd9,0x79,0xae,0xdd,0x6f,0xe9,0xdc,0x16,0x73,0xba,0x05,0x8a,0x40,0x9f,0xe7,0xcf,0x29,0xa4,0xdf,0x49,0x7f,0x1d,0x73,0xc7,0x8b,0x8d +.byte 0xad,0xb5,0x3d,0x1b,0x64,0xb1,0x8f,0x78,0x06,0xbe,0xaa,0x2c,0x08,0x73,0xc7,0x2c,0xdc,0xd8,0x3f,0x9f,0x1b,0xd2,0xe1,0x4f,0x9d,0x87,0xb8,0xa9,0xdc,0xef,0xbc,0x31,0x9f,0xf7,0x84,0x09,0xe7,0xbc,0xec,0x2a,0xcb,0x3b,0x3a,0x30,0xe2,0x5b,0xbc,0xcd,0xa8,0xdb,0x46,0x80,0xec,0xaa,0x06,0x8e,0xd8,0x6c,0x35,0x65,0x52,0xb8,0xc3,0xf9 +.byte 0x97,0x68,0x06,0x2d,0x3e,0x91,0x71,0x44,0x6e,0x01,0x51,0x10,0x5b,0x74,0xb9,0x3f,0xd7,0xf9,0x5c,0x98,0xe6,0xf8,0x98,0x32,0x26,0x9b,0x5e,0x9c,0x88,0xfb,0xaa,0x70,0xd2,0x2e,0xc2,0xf6,0x02,0x92,0x33,0x55,0x92,0xba,0xfb,0x0e,0x0b,0x08,0xdf,0x5d,0xdd,0x47,0x28,0xae,0x32,0xb3,0x27,0x8d,0xd4,0x18,0x43,0x64,0xc4,0x7f,0x60,0x62 +.byte 0xd9,0x63,0xd1,0x28,0xc9,0x75,0x3b,0x44,0xb4,0x8e,0x2a,0x93,0xf9,0x4c,0x4f,0x7e,0x6b,0x98,0xc9,0x1a,0x82,0x51,0x9a,0xb2,0x80,0x70,0x2e,0xff,0x19,0x66,0x1b,0xb6,0xbc,0x15,0x8e,0xe6,0x0f,0x8e,0x04,0x10,0x94,0x44,0x6c,0x32,0x4b,0x61,0xbc,0x4a,0x16,0x7b,0x25,0x2a,0x27,0x96,0xa9,0xa9,0x61,0x10,0xc1,0x46,0xdd,0xf5,0xe3,0xe8 +.byte 0x1f,0x5b,0xa0,0x77,0xe1,0x42,0x9a,0xd4,0x04,0x33,0x68,0x72,0x1c,0x44,0x29,0xce,0x98,0xe0,0xc7,0x3a,0x9e,0x3c,0xb9,0xb4,0x29,0xef,0x57,0xee,0x8c,0x8f,0x7c,0xe6,0xe1,0x43,0x6e,0x45,0x0e,0xdd,0x4e,0x11,0x4b,0x28,0x69,0xde,0xb8,0xfa,0x32,0xbe,0xc6,0x4f,0x11,0x99,0xe5,0xe3,0xe2,0x1f,0x03,0xbe,0x4a,0xad,0x60,0x68,0xc8,0x13 +.byte 0x80,0x4e,0xb6,0xc0,0xc5,0xc7,0x97,0x5c,0x0b,0x0e,0x64,0x43,0x78,0x70,0x95,0x91,0x8e,0x36,0x6b,0xad,0x57,0xc7,0x1e,0x9c,0x54,0xc9,0x89,0xf0,0x13,0xde,0x0a,0xbe,0xc0,0xa9,0x35,0x77,0x0a,0x01,0x7f,0x98,0x51,0x82,0x92,0x14,0xe0,0x9a,0x08,0xa3,0x0c,0x6c,0x67,0xf2,0x05,0xaa,0xa9,0x4e,0xce,0x3b,0xb1,0xb6,0x8c,0x82,0x5d,0x11 +.byte 0xf2,0xe5,0xd7,0xda,0x3a,0x65,0xa0,0xe3,0xa4,0x09,0x01,0x1c,0xb2,0x08,0x90,0x94,0xb5,0x51,0x56,0x24,0x22,0xfd,0x12,0xad,0x7a,0x75,0xcf,0x0f,0x0f,0x23,0xc3,0xa6,0x1f,0xf8,0x39,0xbc,0x2f,0x18,0x53,0x14,0xef,0xdf,0x90,0x6a,0x50,0x2b,0x8c,0x8b,0xa8,0xd4,0x8c,0x59,0x8f,0xd8,0x81,0x86,0x57,0xc1,0xd1,0xfb,0xe7,0xa6,0x20,0x6e +.byte 0x7c,0xbf,0xce,0xe3,0xce,0x28,0x35,0x7c,0x8e,0x1a,0x66,0xea,0x7d,0x81,0x09,0xdb,0xa8,0x64,0xba,0x3c,0x07,0x3f,0x23,0xd3,0x05,0x97,0x4c,0x92,0xc2,0xa4,0xe8,0x6c,0xfb,0xa0,0x9d,0x8b,0x4d,0xcb,0x3a,0x96,0xe7,0x04,0x0f,0x48,0x87,0x2c,0xdd,0x51,0xf3,0x46,0x7e,0x61,0x89,0xbe,0xb8,0xb0,0x9e,0x9c,0xc4,0x37,0x55,0xe6,0x4f,0x78 +.byte 0x7e,0xb0,0x59,0x42,0xca,0xba,0x4a,0xb2,0x50,0xbd,0x16,0x68,0x99,0x42,0xb4,0x8b,0x60,0x3d,0x54,0x41,0x17,0x11,0x39,0x42,0x5d,0x41,0xec,0xc2,0x53,0x82,0x7c,0x32,0xc9,0xd1,0x34,0x49,0xd8,0x4f,0x29,0x21,0xeb,0x97,0x98,0x4c,0xeb,0x21,0xce,0x50,0xd6,0x53,0xd9,0xf1,0x6e,0x26,0xfa,0xe4,0x71,0x34,0xd8,0x38,0xac,0x39,0x4f,0x02 +.byte 0x36,0x93,0xf2,0x08,0x88,0xdc,0x24,0xdd,0x1f,0xf5,0xe9,0x7f,0x83,0xa0,0xa4,0x6b,0xc5,0xef,0x8e,0x82,0xf9,0x92,0xbc,0x82,0x3f,0xce,0x86,0xa6,0x34,0xf8,0x16,0xa7,0xdb,0x97,0xca,0x54,0x43,0xd8,0xfc,0x31,0xde,0x73,0xd0,0x79,0x1a,0xac,0x61,0x15,0xbd,0x38,0x64,0x3b,0xc6,0xb5,0x95,0xeb,0x2e,0x68,0xe4,0x1d,0x6b,0x18,0xab,0x88 +.byte 0xb0,0x96,0x51,0x8c,0xbe,0x41,0x63,0xd6,0x9a,0x21,0x60,0xe8,0x26,0x37,0xb3,0x10,0x76,0x46,0x31,0x90,0xb0,0x9f,0x17,0xab,0x0f,0x93,0xcc,0x12,0x78,0xee,0x17,0x1c,0xd8,0xc7,0x76,0x0a,0x5a,0xb4,0x8b,0xb1,0x67,0x11,0xde,0x48,0x14,0x8a,0x2a,0xc7,0x71,0x46,0x94,0x15,0x29,0x44,0x9e,0x35,0x03,0x10,0xf7,0x51,0x8a,0xaa,0x9c,0x4a +.byte 0x9a,0x44,0xd5,0xc7,0x37,0x9d,0xb4,0xad,0x41,0xd0,0xda,0xd2,0x1a,0xf9,0x93,0xee,0x28,0x32,0x65,0x0b,0x9c,0x12,0xe3,0xad,0x9f,0x82,0xeb,0x3f,0x03,0xe7,0x6a,0x58,0x83,0x3f,0xbe,0x9f,0x27,0xd3,0xd6,0xe2,0x45,0xbf,0x90,0xe2,0x12,0x61,0x0b,0x57,0xd7,0x06,0x72,0x39,0x2c,0x3e,0x65,0xb2,0xf4,0xf7,0x54,0xef,0x32,0x99,0x44,0x0d +.byte 0xf0,0x5c,0xde,0x4c,0x2e,0x22,0xcd,0x3c,0x25,0x02,0xa5,0x0d,0x79,0x16,0xb0,0x51,0x3f,0x3c,0x84,0x56,0xfa,0x00,0xae,0x7a,0x36,0x45,0x3a,0xcc,0x1d,0x66,0xff,0xf4,0x49,0xce,0xb5,0x5c,0x51,0xf4,0x3e,0x07,0xf2,0x83,0x84,0x4d,0x4e,0xb7,0xce,0x03,0x7b,0x23,0x63,0xdf,0x64,0xa2,0x55,0x92,0xf9,0x2e,0xa5,0x21,0x89,0x29,0x42,0x48 +.byte 0x36,0xc5,0xab,0xd6,0x82,0xe3,0xff,0x45,0xfc,0x61,0xa6,0x4f,0xb9,0x51,0xba,0xd5,0x03,0xa9,0x0b,0xe7,0x73,0x83,0x97,0x1d,0xb2,0xc6,0x75,0xa0,0x52,0x99,0xfc,0x1b,0x27,0x7a,0x10,0xc1,0xed,0x70,0x21,0x4b,0x93,0xa4,0x20,0xed,0x16,0x76,0x97,0x82,0xab,0x21,0xfe,0xa4,0x3f,0xd9,0xbd,0x9c,0x2f,0x19,0x42,0xbc,0xb3,0x4f,0x44,0xf3 +.byte 0x9e,0xd0,0xe7,0xc9,0x7e,0x31,0xaa,0xbc,0x4b,0xba,0x73,0xe1,0xc3,0xbf,0x5d,0xa2,0xd8,0xb7,0xb6,0xfc,0x0a,0x32,0xb9,0xff,0x80,0xb6,0x2a,0x8b,0xea,0x81,0xa0,0xeb,0x1e,0x9e,0x69,0xdd,0xbe,0xc1,0x8a,0x5d,0xfb,0x66,0x21,0x98,0x5c,0x6f,0xd8,0xb4,0xcf,0x8a,0x1a,0x4b,0xde,0xa2,0x20,0xe8,0x5a,0x5a,0xee,0x14,0x09,0xcb,0x63,0x1c +.byte 0x14,0x7d,0x9b,0x47,0xf8,0xfa,0xda,0xb7,0x0e,0xc6,0xbd,0xb2,0x13,0xb8,0x10,0xe2,0x71,0x04,0x36,0x78,0x6d,0x3a,0x8b,0x45,0xd3,0x05,0xec,0x8a,0x2d,0xfa,0x85,0x7c,0xdd,0x75,0xb3,0x2d,0xd1,0xae,0xfc,0xdd,0x02,0x2e,0xcc,0x43,0xc5,0xed,0xe4,0x3f,0xee,0x2c,0xd7,0x37,0x81,0x3a,0x44,0xe6,0xed,0x8c,0x9d,0x9d,0xfa,0xb5,0xdc,0xde +.byte 0xb2,0x7c,0x51,0x58,0xa4,0x21,0xac,0xe2,0x79,0x96,0x90,0xe2,0x0b,0xbf,0x51,0x66,0x77,0x02,0xff,0x67,0x0a,0x70,0x1f,0x04,0x6c,0xb0,0x5b,0x2d,0x26,0x23,0x5a,0x85,0x73,0x66,0x6e,0x7c,0xb3,0xeb,0x36,0x73,0x0f,0xcd,0xb2,0x07,0xee,0x78,0xd1,0xbd,0x5e,0xfa,0x31,0xf6,0x82,0x67,0x94,0xaa,0xff,0xef,0xd2,0x23,0xfc,0x82,0xaa,0xe2 +.byte 0xef,0xc3,0x74,0x79,0x6c,0xe9,0x3f,0x8d,0xe1,0x1b,0xc8,0xb4,0xff,0x15,0xf4,0x60,0xe8,0x84,0x3f,0xaa,0xc6,0x53,0x51,0x1a,0x9b,0x04,0x9b,0xab,0xc5,0xee,0x9a,0x98,0x80,0x89,0x8d,0x5b,0xef,0x0a,0x69,0x71,0xd2,0xf3,0x49,0xc1,0xc1,0x87,0xb3,0x18,0x4b,0x82,0x02,0x87,0xb0,0xf1,0x76,0x4b,0x3e,0xad,0x95,0x51,0xb1,0x64,0xb1,0x03 +.byte 0x5b,0xd2,0x10,0x7b,0x4e,0xd4,0x08,0xf8,0xfd,0xea,0xf0,0xc7,0x16,0x43,0x86,0xa6,0xdb,0xcd,0x75,0xce,0xa9,0xfd,0xa8,0x7c,0x51,0xf7,0xa5,0x29,0x6f,0x0d,0xee,0x66,0x8f,0xc6,0xcd,0x9e,0x3f,0x00,0x24,0x21,0xca,0x69,0x79,0x27,0x03,0x62,0xdf,0xad,0xb9,0x8c,0xd8,0x08,0x88,0x0d,0x0c,0xa1,0x29,0xf9,0xba,0x92,0xb5,0xdd,0xb8,0x1a +.byte 0xbb,0xab,0x44,0xb2,0xda,0x1b,0x8b,0xc1,0x3c,0x61,0x9f,0x7a,0x8b,0x89,0x99,0x09,0xc3,0xb4,0xe4,0x24,0xf5,0x3b,0x36,0xa6,0x61,0x0a,0xec,0x2a,0x1c,0x92,0x7c,0xb1,0x7c,0xd8,0x0b,0x98,0x48,0x8d,0x52,0xa2,0x57,0xc1,0x28,0x89,0xbb,0x60,0x5c,0x58,0x62,0x41,0x1c,0xd6,0xfb,0x69,0x09,0x93,0x90,0x31,0xc4,0x72,0x71,0xf0,0x4f,0xcf +.byte 0x10,0xbb,0xb7,0x6c,0x3b,0x53,0xa3,0x0b,0xff,0x44,0x4c,0x37,0xd5,0x26,0x83,0x7e,0x5c,0xb9,0xa5,0xe8,0x8b,0xc4,0x15,0xf6,0xc7,0xd1,0x39,0x67,0x01,0xb7,0xca,0xa7,0x71,0xa8,0x04,0x95,0x0f,0xfc,0x0a,0x9e,0x52,0xb2,0xfb,0x48,0x47,0xb6,0xa5,0x14,0xc2,0x4f,0xa8,0xd5,0x0f,0x10,0x76,0x39,0x23,0x74,0x2e,0xe5,0x17,0xcb,0xad,0x8a +.byte 0x4a,0x25,0xc8,0x9b,0x25,0x94,0x34,0xbc,0x4b,0x2f,0xdc,0x0a,0xcd,0xc1,0x02,0x72,0x7d,0xa0,0x10,0xa7,0x32,0x68,0xe8,0xd5,0x23,0xe8,0xc9,0xbc,0x05,0x05,0x1e,0xac,0x55,0x45,0xfb,0x42,0x2f,0x0f,0x51,0x8d,0x31,0xb1,0xbc,0x10,0xa1,0x03,0xc3,0x6f,0x35,0x08,0xa5,0x2f,0x91,0x4e,0x43,0x6b,0x62,0x3b,0x00,0x4c,0xd0,0xb8,0x33,0xbc +.byte 0xca,0x57,0xb8,0x1b,0xb4,0x52,0x1a,0xa7,0x03,0x78,0xa0,0x4f,0xda,0x86,0xb9,0xd8,0xc6,0x69,0xe6,0x61,0x2e,0x62,0x96,0x60,0x0d,0x76,0xdc,0x5d,0x0e,0xa8,0xf3,0x86,0xde,0xcf,0x39,0x34,0xc7,0x69,0xed,0xcb,0x9a,0xf5,0xc3,0xce,0x6d,0xa5,0x7f,0xae,0x73,0xb9,0xa6,0xbf,0x88,0x93,0x2b,0x0e,0x8b,0x4b,0xa5,0xeb,0x62,0xc6,0x1a,0xc7 +.byte 0x63,0x63,0x58,0x62,0x37,0xc6,0xbc,0x00,0x72,0xac,0x3d,0x7c,0x22,0xa5,0x59,0xf1,0x6e,0x60,0x45,0x3e,0x99,0x76,0x40,0x82,0xa7,0x52,0xf3,0x48,0x8e,0x4a,0xa3,0xe1,0x3b,0xea,0x77,0xa7,0x7d,0x13,0xe7,0xc4,0xc6,0xa6,0x6e,0xda,0xe8,0x50,0xc8,0x39,0x30,0xab,0x8a,0xe1,0x08,0xa9,0xe3,0xbd,0x8d,0xbd,0x83,0x3c,0xbc,0x6c,0x92,0xed +.byte 0xf1,0xa9,0xd3,0x50,0xf2,0x29,0x8b,0x39,0x46,0xaf,0x08,0x7e,0x00,0x64,0x2f,0xa8,0x18,0xab,0x7e,0x07,0xd3,0x63,0x2a,0xd3,0xd3,0xbb,0xf9,0xdd,0x2b,0xec,0x70,0x35,0x1a,0x94,0x6b,0x87,0xe4,0x1a,0x0a,0x44,0x46,0x08,0xa6,0xce,0x1b,0xf7,0xd7,0x20,0x87,0x1a,0x96,0x6c,0xbe,0xdf,0x73,0x3b,0xc9,0xaf,0x89,0x1c,0x2f,0x47,0xe9,0xd8 +.byte 0x03,0xa6,0x03,0x6c,0x73,0xa9,0x65,0x20,0x36,0xea,0x6f,0xe7,0x96,0x7c,0x01,0x87,0xb0,0x21,0xba,0xb4,0xed,0x1f,0x81,0x65,0x97,0x36,0xda,0x68,0x80,0x64,0x99,0xe6,0xda,0x95,0x04,0xdf,0x5d,0xfd,0x86,0xd1,0xfd,0xfa,0x1c,0xd7,0x89,0xbf,0xe6,0x99,0x6c,0xf5,0x01,0x56,0x20,0x88,0x79,0xa7,0x8d,0x88,0x82,0xe5,0x32,0x38,0xe0,0xf0 +.byte 0x98,0x63,0xa9,0xab,0xeb,0x09,0x8d,0xaf,0x3f,0xa8,0x57,0x98,0xde,0xc8,0x9c,0x8d,0x1d,0x18,0xc5,0xa8,0x82,0x51,0x9b,0x6f,0xc6,0xb8,0x09,0xd3,0xea,0xd4,0xe3,0xac,0xd1,0x0e,0x88,0xda,0xdf,0x38,0x53,0x14,0x87,0x28,0x6f,0x13,0x35,0xdb,0xfe,0xa1,0xe7,0x43,0xb5,0x02,0x46,0x08,0x1a,0x31,0x0d,0x9e,0x3d,0x3b,0xbf,0xbb,0x82,0x9c +.byte 0x09,0xf3,0xd9,0x22,0x0a,0x82,0x07,0xd3,0xe8,0x19,0x6e,0x21,0xd2,0xa2,0xa8,0x14,0xbc,0x42,0xb6,0xeb,0x8c,0x40,0x9b,0xb2,0xa9,0x17,0xad,0x2c,0x19,0xaa,0x4b,0x22,0xf9,0x4e,0xde,0x8f,0xbe,0x78,0x9b,0xab,0xb9,0xfa,0xb1,0x3e,0x68,0x86,0x1a,0x4a,0x61,0xba,0x63,0x51,0x25,0x11,0x59,0xd0,0xb7,0x0c,0xb7,0xcc,0x45,0x05,0x6d,0x5a +.byte 0xe2,0xd7,0x10,0x80,0x19,0xd3,0xa9,0xab,0xb6,0x9f,0x53,0x7a,0xaa,0x19,0x74,0x01,0xc9,0xd6,0x45,0x42,0x2c,0xe5,0xc0,0xcf,0x62,0xe6,0x95,0x6f,0x4c,0x90,0x50,0x97,0x61,0x83,0x73,0xd0,0xc2,0xd5,0xf0,0x05,0xca,0xe9,0x6f,0x67,0xa9,0x51,0xb8,0xb4,0x9d,0x30,0x8e,0xe3,0x29,0xf9,0x3b,0x3d,0x17,0x25,0xad,0xbb,0xb0,0x34,0x68,0x29 +.byte 0x06,0xad,0x0e,0xdf,0x41,0xa6,0xf1,0xa6,0x25,0xc4,0xf0,0x0d,0x57,0x84,0x34,0x2c,0x3b,0xb1,0x41,0xd6,0x83,0x00,0x3a,0x91,0x98,0x8e,0xd0,0x59,0x0b,0x2d,0xc9,0x65,0x03,0x91,0xcb,0x03,0x97,0x57,0xde,0x11,0x8b,0x4b,0x1b,0x85,0x0b,0xb6,0x68,0x25,0x3c,0x1a,0x04,0x7d,0xd5,0x2b,0x16,0x69,0x1f,0x64,0x8b,0x47,0x60,0x17,0xaa,0x68 +.byte 0x45,0xf2,0x0b,0xf8,0xa2,0x27,0xf8,0x47,0x86,0x41,0x94,0x3f,0x92,0xc3,0x02,0xab,0x80,0x2b,0x0e,0x3c,0xd0,0x13,0x59,0x08,0xfc,0x13,0x33,0x52,0xbb,0x2d,0x6b,0x22,0xa2,0x8b,0x9f,0x7c,0x8e,0x40,0x35,0xa4,0xc7,0x45,0xb7,0xf8,0x10,0x22,0x95,0xc5,0x48,0xc1,0x50,0x4d,0x4a,0x36,0xe1,0xec,0x1e,0x07,0xf7,0x68,0x63,0xcb,0x13,0x03 +.byte 0x70,0x63,0xb1,0x9b,0xf3,0x60,0x01,0x6e,0x63,0x5c,0x4d,0x2c,0x5c,0x5c,0x58,0x8b,0xbb,0x6e,0xd1,0x69,0xdd,0x19,0xfe,0xfb,0xd6,0xdc,0x68,0x97,0x9c,0x46,0x0d,0xdd,0x4d,0xbd,0x52,0xe4,0xd9,0xc2,0x03,0x4e,0x4c,0xe2,0x66,0x6b,0x4d,0xbe,0x6b,0xf3,0xd6,0xbe,0x2d,0xba,0xdd,0x1b,0x4f,0x60,0x02,0x74,0xa1,0xf0,0xd0,0xfa,0x23,0x33 +.byte 0x29,0x7e,0x00,0x09,0x47,0x15,0xa8,0xd8,0xdb,0xb8,0xe1,0x20,0xd5,0xe2,0x91,0xd0,0xe8,0xfa,0xa1,0x0d,0x80,0xbd,0x7d,0x62,0x9d,0xf2,0xbc,0x03,0xa1,0x44,0x9f,0x8d,0x3d,0xe3,0xb4,0xec,0x32,0xd9,0x66,0xb0,0xc7,0x75,0x11,0xaa,0xab,0xb7,0x84,0x1d,0x5b,0x4f,0x25,0x5c,0x53,0xed,0xbb,0x6d,0x06,0x1f,0x12,0x5f,0xc0,0xeb,0x55,0x3e +.byte 0xd0,0x5b,0x4d,0x07,0xf7,0x84,0x12,0xbc,0xc8,0xd4,0xf4,0x69,0xdb,0x71,0x8a,0x00,0x58,0xf5,0x84,0xff,0xc3,0xbc,0x13,0x6e,0x5f,0xac,0xd6,0x72,0x1b,0x2d,0xbb,0x27,0xfd,0x8d,0xcc,0x59,0x79,0xb9,0x63,0xe8,0x0a,0xf3,0x7f,0xa4,0x9f,0x4c,0x35,0x9a,0xdc,0xff,0x11,0x42,0xf3,0x1c,0x86,0xd0,0x22,0x7e,0x81,0x79,0x04,0x93,0x5c,0xf2 +.byte 0xab,0xdf,0xb7,0x1d,0x84,0xbd,0xde,0xfb,0xd2,0x75,0x43,0xb8,0x19,0x63,0x97,0xfe,0x0e,0x91,0x9d,0x38,0x50,0xc5,0x7a,0xd6,0x51,0xd4,0xfc,0x8d,0xec,0xd5,0xe2,0x07,0xce,0x21,0x03,0x02,0xa1,0x61,0x8d,0xf1,0xf5,0x1f,0xb3,0xaf,0x9f,0x13,0xd8,0x81,0xd2,0xf7,0xe9,0xe2,0x62,0x49,0xca,0x1c,0x15,0x07,0x39,0xe6,0x01,0xec,0x6c,0x7d +.byte 0x3b,0xf1,0x52,0xda,0xf2,0x97,0x55,0xef,0x6f,0x88,0x82,0x0e,0xe6,0xf4,0x3e,0x33,0xf6,0x61,0x6d,0xef,0xbf,0xa8,0x9a,0x91,0x2f,0xb3,0xd2,0x3d,0xaa,0x7a,0x4e,0x80,0xe1,0x04,0xbe,0xc7,0xf8,0xc3,0xc9,0xd8,0xa2,0x01,0x5d,0x30,0xae,0x6d,0x39,0x52,0x60,0x9d,0x07,0xd5,0xa2,0x86,0xf0,0x88,0x00,0xec,0x18,0x11,0x2d,0x69,0x86,0xa9 +.byte 0x5a,0x73,0xda,0x4e,0x4c,0xdb,0xb8,0x02,0xad,0x53,0xec,0x20,0x0f,0x35,0xe0,0x4f,0x6e,0xd5,0x04,0xcc,0xa0,0xf5,0x8c,0x7d,0x31,0x04,0xa4,0xcf,0xf0,0x27,0xd2,0xb6,0x7d,0x8c,0x26,0x5f,0x19,0xba,0x79,0x80,0xec,0x6d,0xfe,0xaf,0xc1,0x3a,0xc2,0x3d,0x14,0x3c,0xa0,0xc5,0x77,0xf4,0x96,0x56,0x51,0x8b,0x7c,0x7e,0xe5,0x23,0x5d,0x46 +.byte 0x1b,0x2e,0x28,0xc0,0x80,0x6b,0x6a,0x85,0x6c,0xcf,0xaa,0x28,0xf3,0x83,0x2d,0x42,0x6f,0xf3,0x5e,0x5d,0xa2,0x7b,0xba,0x5c,0x12,0xb0,0xda,0xa0,0xeb,0xdf,0xad,0x1d,0x4c,0x54,0xcf,0xad,0x02,0x68,0xcd,0xfe,0x5c,0x5b,0x65,0x6d,0xa5,0xcc,0xd3,0xed,0x32,0x74,0x6c,0x58,0x83,0x3a,0xc1,0x71,0xbf,0xb5,0xa2,0xbd,0x10,0xe5,0x46,0xc5 +.byte 0x00,0x82,0xb1,0xeb,0x6f,0x73,0xf9,0x12,0x23,0xe4,0xda,0xff,0xa3,0xc4,0x9c,0xf1,0xcc,0x0e,0x1a,0x7a,0x10,0x62,0x8f,0xa5,0xb2,0x35,0x51,0x67,0xb5,0x95,0xbe,0x4c,0x81,0x53,0xfc,0xdd,0x27,0x26,0x97,0x42,0x01,0xec,0x08,0x91,0xb8,0xf0,0xaf,0x57,0x54,0x73,0x52,0x8f,0xde,0xca,0xed,0x1b,0xca,0x8d,0x97,0x1e,0xdc,0xe7,0xfa,0x68 +.byte 0xaf,0x37,0xb0,0x62,0xa3,0x9f,0xbc,0xac,0x9f,0x28,0x1e,0xb7,0xaa,0xb0,0x91,0xe4,0x95,0xad,0xf9,0xe5,0xd4,0xcc,0x23,0x0f,0x4a,0x2d,0xdd,0xea,0x64,0xd1,0x04,0x3c,0xd0,0xca,0xfe,0xd3,0x19,0x9d,0x28,0xa5,0x1c,0xff,0x3e,0xae,0xe9,0xfb,0x12,0x03,0x6d,0xcf,0xbc,0x5f,0x27,0xce,0x1a,0xb9,0xc0,0x31,0x88,0x6e,0x2e,0xaf,0x35,0x5f +.byte 0xf0,0xce,0x92,0xf8,0x6f,0xd6,0x67,0x1c,0xc6,0x5c,0xee,0x59,0xaa,0xd6,0x8c,0xa8,0x13,0xe6,0xf7,0xe2,0x82,0x2f,0x82,0x1e,0x4c,0x0d,0xab,0x3e,0xdb,0x4d,0xc5,0x90,0x32,0xe4,0xf0,0x74,0xc1,0x92,0x1b,0xdd,0xf3,0xa7,0xf6,0x6b,0x01,0x9d,0x8d,0x78,0x3d,0x5a,0x46,0x74,0x16,0x93,0x44,0xca,0xbe,0x31,0xea,0xb4,0x65,0xcd,0xe6,0xdd +.byte 0x56,0x9d,0x63,0x48,0xf0,0xf3,0x15,0x91,0x6c,0x27,0xf9,0xf7,0x3b,0x9f,0x04,0x6d,0x4d,0x1d,0xf1,0x7c,0xd1,0x81,0x06,0xef,0x04,0x47,0x98,0x5d,0x21,0xf4,0xe0,0xa0,0x13,0xaf,0x1d,0xb0,0xd5,0x45,0x64,0x92,0x46,0x99,0xff,0xb4,0xbf,0x36,0x01,0x2d,0x23,0x6a,0xc4,0x6b,0x3f,0x91,0x10,0x03,0xaf,0x6e,0x79,0x86,0xdb,0x15,0xde,0xfa +.byte 0x0d,0x71,0x04,0x16,0x12,0x31,0x9b,0x69,0xb9,0xe0,0xe7,0x4e,0xfd,0x0e,0xd5,0x71,0xa0,0xc7,0xd7,0x46,0xdb,0xda,0xbd,0xcd,0xdc,0x77,0xe5,0x71,0x9d,0xa1,0xf4,0x02,0x10,0xc6,0x27,0x76,0x4e,0xa6,0x35,0xe6,0x9e,0xda,0xbe,0xd8,0xc0,0x21,0x15,0xd4,0xcc,0xd5,0x4b,0xdf,0x38,0xc5,0x15,0x4b,0xfa,0x4e,0x83,0xf4,0x27,0xdb,0x8a,0xb1 +.byte 0x0e,0x1f,0xc9,0x3c,0x1c,0x36,0x35,0x54,0x8b,0x54,0xf8,0x31,0x1e,0x0e,0x1c,0x4e,0x44,0x29,0x90,0xad,0x28,0x85,0xb4,0x72,0x2d,0x1b,0x8b,0x26,0x2f,0xb6,0xc2,0x14,0x0e,0x81,0xd0,0x37,0x29,0x5c,0x0f,0xdc,0x21,0x62,0x10,0x7a,0xeb,0xa3,0x6e,0xd4,0x5b,0xb4,0x13,0x2e,0xd6,0x8f,0xd9,0x57,0x0d,0x9b,0xfd,0x1e,0x66,0xb7,0x6e,0xac +.byte 0x88,0xb9,0x75,0x60,0x62,0x83,0x72,0x96,0xc6,0x2e,0xdc,0xfe,0x88,0xee,0x07,0x9a,0x62,0x19,0xde,0xf1,0xa5,0xfb,0xcc,0xdb,0x4a,0xeb,0x16,0x60,0x34,0x46,0xfc,0xf2,0x6d,0xee,0xfc,0xa0,0x3a,0xb1,0x11,0x03,0x8b,0xae,0x26,0xef,0x86,0x91,0x20,0x7a,0x19,0x35,0xd6,0x12,0xfc,0x73,0x5a,0xb3,0x13,0xf8,0x65,0x04,0xec,0x35,0xee,0xf8 +.byte 0x70,0xb2,0x0b,0xe1,0xfc,0x16,0x35,0xec,0x6b,0xdd,0x8b,0xdc,0x0d,0xe8,0x91,0xcf,0x18,0xff,0x44,0x1d,0xd9,0x29,0xae,0x33,0x83,0xfe,0x8d,0xe6,0x70,0xbb,0x77,0x48,0xaa,0xe6,0xbc,0x51,0xa7,0x25,0x01,0xcf,0x88,0xc4,0x8b,0xfc,0xb1,0x71,0x01,0xc7,0xfc,0xd6,0x96,0x63,0xee,0x2d,0x04,0x1d,0x80,0x24,0xd0,0x80,0x03,0xd9,0x18,0x96 +.byte 0xec,0x6a,0x98,0xed,0x6e,0x9a,0xe0,0x42,0x5a,0x9d,0xec,0xed,0x46,0x3c,0xb5,0xf0,0xd6,0x88,0x92,0x89,0x38,0x5f,0xd6,0xba,0xfd,0x32,0x31,0x81,0xe9,0xf1,0x56,0x89,0xa3,0x56,0xa6,0x03,0x00,0x60,0xe1,0xa8,0x59,0xdb,0xbe,0x72,0x39,0x6c,0x08,0x4d,0x26,0x57,0xa6,0xf6,0x13,0x7d,0x4a,0x2f,0x64,0xb8,0xa7,0x23,0x2c,0xa4,0x4a,0xad +.byte 0xcf,0xa1,0xa2,0x32,0xbb,0xd1,0x98,0x02,0xe4,0x1a,0x41,0x26,0x23,0xba,0xa2,0x17,0x62,0xaa,0xa6,0xc7,0x74,0x9d,0xea,0xc7,0xa0,0x08,0x0a,0x1a,0x4e,0x71,0xd9,0x45,0xf7,0xe8,0x57,0x79,0x12,0xd0,0x38,0x2f,0xdb,0xbd,0x5a,0x84,0xe1,0xb2,0x62,0x7e,0x56,0xb3,0x50,0x2a,0xa0,0x32,0x1f,0x86,0x71,0xc4,0xa5,0xba,0x93,0x5b,0x22,0x97 +.byte 0xf4,0xe5,0x44,0x27,0x6b,0x06,0x84,0x55,0x19,0x45,0x12,0x75,0x4b,0xf0,0x76,0x6d,0x3c,0x0a,0x17,0xc2,0x9d,0x96,0x72,0xe7,0x5e,0x79,0x84,0x0a,0x39,0x64,0x09,0x6e,0x7e,0xd7,0x77,0x40,0x75,0x2c,0xbd,0x98,0xae,0x3e,0x34,0x08,0x4d,0xda,0x2c,0xcf,0x0c,0xa2,0x8c,0x40,0xfa,0x34,0x43,0x15,0xed,0x4f,0x69,0xa6,0xef,0x2d,0x3c,0x55 +.byte 0x7a,0xe1,0x67,0xd1,0x0a,0x89,0xe0,0x2d,0x02,0x35,0x57,0xc8,0x9a,0x4b,0xc4,0x46,0xa7,0x57,0x03,0x89,0x7d,0x3f,0x70,0x47,0x03,0x06,0xd9,0x81,0x1f,0x8d,0x7e,0x36,0x9b,0xfd,0xad,0x20,0x9d,0x5a,0x29,0xe9,0x40,0x6a,0xb8,0x07,0x6b,0xc7,0x2b,0x58,0xd2,0x1d,0xef,0x88,0xa5,0xfb,0x3b,0xd6,0x9f,0xfd,0x89,0x0e,0x50,0xd4,0xbc,0x89 +.byte 0x3f,0x3c,0x6c,0x50,0xc6,0xe3,0x8b,0x7e,0x34,0x8b,0x26,0x99,0x2a,0xfa,0xa5,0x19,0x53,0xb5,0x5e,0xfd,0x94,0xe8,0x33,0xb2,0x6d,0x9c,0x3c,0x0c,0x14,0x90,0xc4,0xa2,0x4a,0x3a,0xca,0x07,0x72,0x46,0x37,0xfc,0x02,0x5d,0xf4,0x97,0xca,0x8e,0xc6,0xc4,0x63,0xda,0x5c,0x89,0xc3,0x6c,0xb1,0x1a,0xf5,0x2a,0xbc,0x2e,0xe3,0xcd,0x2f,0xe2 +.byte 0x91,0x16,0xf9,0x94,0x0e,0x1b,0xe6,0x01,0x73,0x61,0x1e,0xcf,0x5e,0x21,0x70,0xcb,0x5b,0x87,0xc1,0x46,0x39,0x59,0xa6,0x74,0x82,0x7f,0xa2,0x6c,0x4a,0x50,0x5f,0xbd,0x1c,0x1a,0x65,0x80,0x01,0x44,0x19,0xcf,0xcd,0xef,0x3d,0x5e,0x1b,0x71,0x82,0x4f,0x8b,0xc1,0xa0,0x9a,0x77,0xee,0xac,0x06,0xdc,0x6a,0xa0,0x34,0x50,0xa4,0xe0,0xda +.byte 0x3d,0xa0,0xf7,0x9a,0xb8,0xd5,0x59,0xe0,0x7f,0x05,0x04,0xd5,0x32,0x8c,0x49,0xf5,0x0a,0x0e,0x99,0x83,0xf5,0x47,0x2b,0x7c,0x7b,0x65,0x25,0x02,0xc4,0x88,0xbb,0x6a,0x4f,0x89,0x31,0x60,0xc2,0x47,0x8b,0x22,0xfc,0x4a,0xde,0xb3,0xb9,0xed,0xb8,0xdf,0xd7,0xd5,0x09,0x98,0xcc,0x5f,0xaf,0xbb,0x02,0xc3,0x62,0x62,0xee,0x99,0x42,0x1b +.byte 0xbe,0x5b,0xa8,0x5c,0x40,0x03,0x86,0x29,0x29,0x06,0x0b,0x53,0x46,0x29,0x03,0x3b,0x11,0x64,0xf1,0x09,0xca,0x69,0x69,0xfa,0xcc,0x85,0x23,0x14,0x1b,0xfd,0x65,0xb9,0xf5,0x6b,0xbb,0x2a,0x9d,0x6e,0x64,0x1a,0xe1,0x37,0x39,0xd4,0x85,0x40,0xa3,0xf9,0x04,0xec,0x9e,0x3b,0x74,0x97,0xa4,0x64,0x8a,0x48,0xb2,0x62,0xc1,0x1c,0xed,0x67 +.byte 0x6f,0x23,0xae,0x0f,0x64,0x2e,0xe5,0x92,0xb6,0xb5,0x71,0x24,0xc0,0x60,0x9a,0x10,0x23,0x6b,0x4a,0x22,0xe9,0x0a,0xaa,0x09,0x62,0x39,0xe0,0x40,0xee,0x13,0x27,0x14,0x73,0xeb,0x75,0x7b,0x4a,0xe1,0x42,0x65,0x37,0xae,0x80,0x08,0x26,0xf9,0x53,0x98,0x58,0xdd,0xf5,0xed,0x26,0x37,0x37,0x85,0xb5,0x88,0x91,0x05,0x2d,0x04,0xa6,0xd5 +.byte 0xa6,0x98,0xb0,0x0e,0x4b,0x4c,0x53,0x76,0x79,0xad,0x82,0xc5,0x16,0xba,0xd8,0x20,0x5f,0x4c,0x1d,0x69,0xa0,0xe0,0xe9,0xbc,0xb8,0x5c,0x10,0x4a,0x0a,0xd3,0x52,0x9c,0x2e,0x1b,0x6c,0xf7,0x43,0x83,0x6f,0xa9,0xcc,0x00,0xed,0x16,0x4c,0xc3,0x24,0x79,0x59,0x68,0xfb,0xf9,0xf6,0xb0,0xb4,0x01,0xc2,0xdd,0xf7,0xe5,0x3b,0x60,0x48,0x49 +.byte 0x32,0x48,0x05,0xa8,0x62,0xa3,0x03,0x9f,0x3d,0x91,0xdb,0x84,0x64,0x6f,0x1e,0x50,0x8e,0xdf,0x1a,0xa0,0xb1,0xf4,0x34,0x7c,0xe6,0xb7,0x7c,0x14,0xa1,0x65,0x1a,0xb4,0xdb,0x67,0x78,0xb1,0x88,0x3c,0xc2,0x5e,0x0e,0xea,0x32,0x15,0xc7,0xda,0xe4,0x9a,0x44,0xde,0x61,0x90,0x3b,0x97,0x11,0x5b,0x6d,0xa5,0x9a,0x2f,0x1b,0x8b,0xd7,0xdd +.byte 0x73,0xe4,0xc3,0x19,0x5d,0x68,0xcf,0x0e,0xe4,0x69,0xa5,0xeb,0x50,0x6f,0x79,0xff,0x91,0xc6,0x95,0x83,0xe8,0x72,0x6a,0x01,0x49,0x2b,0xcf,0x8f,0x93,0x1e,0xef,0x31,0x17,0x8f,0xa8,0x2b,0x5f,0x4b,0x79,0x8b,0xe5,0x6c,0xb7,0x61,0xd5,0x9e,0xe0,0xd4,0x25,0xc3,0x93,0x31,0x8f,0x66,0x6c,0x48,0x30,0x65,0xf4,0xd7,0xde,0x64,0xee,0xbd +.byte 0xbd,0xad,0x32,0xfc,0xf3,0xd8,0x7c,0x85,0x7c,0x24,0x40,0xb6,0xd4,0xe0,0x4b,0xc0,0xab,0xcc,0xeb,0x77,0x7c,0xb7,0x33,0x3c,0x90,0x04,0xaf,0x85,0xaa,0xb4,0xaa,0x90,0x67,0x29,0xd9,0x85,0x6a,0x34,0xf4,0xc4,0x6c,0xbc,0xb4,0x86,0x54,0x83,0xd5,0x5e,0xf3,0xdd,0x1a,0x56,0x5e,0xa5,0xd8,0x06,0xc0,0xa7,0x27,0xd4,0x0d,0x5b,0x08,0xf4 +.byte 0xb4,0x15,0xf9,0xb4,0x56,0x1c,0x80,0x98,0xc9,0xcd,0xf0,0x38,0x18,0xbe,0x99,0xec,0x7e,0x0c,0x3d,0xc1,0x98,0x26,0x9d,0x50,0xe4,0x00,0xcf,0x0f,0x0b,0x77,0x86,0x31,0x55,0x38,0xa4,0x31,0x50,0x51,0x64,0x88,0x81,0x05,0x32,0x99,0x38,0xd1,0x62,0x20,0x8e,0xf0,0x29,0x31,0xf5,0x79,0xbb,0x1e,0x0f,0xba,0x51,0x94,0xa9,0x54,0xcd,0x43 +.byte 0xce,0xe5,0x2c,0x29,0xa5,0x51,0x23,0x97,0x5d,0x36,0xff,0x51,0x5c,0x66,0xb7,0x62,0x1b,0x5f,0xd7,0x2f,0x19,0x07,0xff,0x0a,0xfc,0xf6,0x6e,0xb5,0xfd,0xa9,0x92,0x40,0xd3,0xe6,0x99,0x15,0x6f,0x1e,0x91,0xad,0x1f,0x4d,0x1c,0xe2,0xd9,0xcf,0x01,0x71,0xec,0x1a,0xa3,0xba,0x48,0x40,0xfd,0x18,0xb1,0x24,0x2b,0xd2,0x37,0xb5,0x74,0xdd +.byte 0x7e,0xf6,0x18,0xb4,0x7b,0x0e,0x7d,0x65,0x46,0x7b,0xe3,0x51,0x03,0xae,0xe1,0xd0,0x74,0xc6,0xc9,0xda,0x0e,0x79,0x6f,0xf5,0x62,0xc0,0x7e,0x76,0x3e,0x13,0x8b,0xe0,0x4c,0xfa,0x7e,0xe1,0xa2,0xee,0x9d,0x3f,0x91,0x9d,0x21,0xdd,0xc2,0xd0,0xa5,0x1d,0x17,0xd6,0xdc,0xeb,0xa3,0xc0,0x71,0xa0,0xfe,0xf0,0xaf,0x31,0xdc,0xa3,0xd4,0x21 +.byte 0x4a,0x32,0x1d,0x54,0x25,0x3b,0xc8,0x8f,0x68,0xcd,0x99,0xce,0x76,0x39,0x42,0xd8,0xca,0xf2,0x46,0x72,0xfe,0x52,0xc2,0x90,0x83,0xed,0xa0,0x6d,0x1b,0xf5,0xb1,0x09,0xae,0x2b,0x34,0x4f,0xd3,0x78,0x19,0x7f,0xad,0x8d,0x50,0x26,0x9c,0x36,0xa3,0xb5,0x3d,0x0b,0xa6,0x87,0x65,0xa0,0xdb,0x88,0x20,0xff,0xb6,0xfd,0xc5,0xbd,0x0a,0x28 +.byte 0xc8,0x9c,0x42,0x7f,0x24,0x58,0xe9,0x07,0x53,0x4b,0x9a,0x2a,0x1e,0x7b,0x90,0x97,0x78,0x74,0x80,0x5d,0xe5,0x6e,0xae,0x15,0x68,0xd4,0x2a,0x3a,0xd3,0x00,0x4f,0x4b,0xff,0x8f,0x1e,0x8f,0x9f,0x75,0xe5,0xea,0x9d,0xb9,0xed,0x8f,0xa9,0x2b,0x70,0xa8,0xcb,0x08,0x85,0xd3,0x8f,0x5d,0xc7,0x49,0x66,0xcc,0xa8,0x6d,0xbd,0x01,0x93,0xd5 +.byte 0xe6,0x75,0x2e,0x25,0x07,0x59,0x86,0x3f,0x44,0x8b,0x0b,0xb5,0x38,0xd5,0xbd,0xcf,0x48,0x8a,0xf7,0x71,0xd6,0x6b,0x2e,0x93,0x3d,0x0b,0xc0,0x75,0xee,0xa8,0x5d,0x9c,0x3d,0xa5,0xdb,0xc5,0x8d,0xac,0xda,0xf4,0xcd,0x5f,0x24,0xfe,0x86,0x14,0x44,0x65,0x3f,0x89,0x7f,0xd3,0x61,0x48,0xb0,0x43,0xf0,0x1e,0xde,0xbc,0xb7,0x51,0x0f,0xfc +.byte 0x32,0xf2,0x04,0xe2,0x4b,0xcb,0xbb,0x63,0x7d,0x5b,0x9a,0xb1,0x91,0x57,0x89,0xdc,0xed,0xde,0x91,0x2d,0xdd,0x42,0xc8,0x3c,0xb0,0xd7,0xa5,0xbc,0xa7,0x33,0x14,0x32,0xaf,0xf7,0xe9,0x25,0xd2,0x1a,0x64,0xf7,0x1b,0xab,0x0e,0xbc,0x50,0xbc,0x85,0x44,0xe0,0xa6,0xf1,0x4a,0x32,0x2f,0x30,0x27,0x48,0x4f,0xfc,0x8a,0x5a,0x78,0xe7,0x16 +.byte 0x55,0xcf,0xca,0x15,0xa8,0xa8,0xa2,0xef,0x9a,0x16,0x02,0xf4,0xb0,0x44,0xfd,0xc4,0x51,0x01,0x4f,0x1d,0x9d,0x09,0x62,0x42,0xe9,0x8b,0x18,0xa4,0x65,0xef,0x8b,0xfe,0x71,0x9f,0x4b,0x47,0x48,0x41,0x73,0x5c,0x0c,0x52,0x7d,0x79,0xbc,0x93,0x2a,0xaa,0x81,0x99,0x21,0xa5,0x9e,0xac,0xcd,0x57,0x51,0x50,0xbc,0xc9,0x96,0xaf,0xdf,0x1a +.byte 0x8f,0xee,0x36,0x05,0x20,0x32,0xe8,0x51,0x94,0x72,0x12,0xa3,0x17,0x25,0x7f,0x0a,0x3e,0xcc,0x22,0xcf,0x05,0xb2,0x2b,0xaa,0x36,0x01,0xdf,0xd4,0x4e,0xe1,0x02,0x43,0x4e,0xac,0x50,0x64,0xcd,0x2f,0xc2,0xa9,0xb0,0xf2,0xf2,0x4c,0xdf,0x16,0xa6,0x54,0xf7,0xbf,0x1a,0x69,0xeb,0xa1,0x5a,0xc7,0xcf,0x46,0x2d,0xc2,0x3a,0x7f,0x4a,0x14 +.byte 0x22,0x15,0x46,0x46,0x2d,0xc1,0x98,0xf7,0x0b,0xf3,0x27,0xfc,0x78,0x67,0x05,0xd8,0xe0,0xf6,0xb8,0xb6,0x0b,0xdb,0x4d,0x6b,0x7e,0x9b,0xbf,0x5c,0x15,0x97,0x49,0x9f,0x6f,0x11,0x6c,0x6e,0x1d,0x1e,0x65,0x5b,0xb9,0x60,0x8f,0xa3,0xa9,0x99,0x17,0x92,0xb8,0x65,0x25,0xc4,0xef,0xea,0xa6,0xc0,0x57,0xa9,0x4c,0x78,0xe3,0xd6,0xf2,0x19 +.byte 0x9c,0x86,0x9e,0x45,0x3e,0xfd,0x21,0x4c,0x2a,0x56,0x7c,0x23,0xf2,0x22,0xa1,0x81,0xdb,0xe6,0xfa,0x85,0x19,0x3b,0x1d,0x61,0xb3,0x21,0xb5,0x64,0x1d,0x07,0x66,0xd2,0xe5,0x9c,0xb0,0x76,0x9d,0xc9,0x02,0x6a,0x8d,0xd5,0x84,0xd5,0xa7,0x7c,0x70,0x64,0x46,0xd6,0xff,0xc7,0x9f,0x2f,0xed,0xc1,0x5a,0xcb,0x56,0x12,0x31,0x9d,0xff,0x66 +.byte 0x9a,0xf8,0x50,0xc6,0x54,0xfd,0x8d,0x49,0x32,0x8c,0xdd,0x8c,0xbe,0x30,0x79,0xaf,0x1a,0xd5,0x28,0x1d,0x03,0x87,0x12,0x60,0x7a,0xcc,0xe6,0xe8,0x4e,0x21,0x5d,0xa3,0x06,0xfb,0xdf,0xf6,0x31,0xd6,0x10,0x3e,0xec,0x23,0x69,0xc7,0x7b,0xf6,0x78,0xa6,0xd1,0x8a,0x48,0xd9,0xdc,0x35,0x1f,0xd4,0xd5,0xf2,0xe1,0xa2,0x13,0x8a,0xec,0x12 +.byte 0xa7,0xf1,0x5d,0xb2,0xc3,0x6b,0x72,0xd4,0xea,0x4f,0x21,0xff,0x68,0x51,0x51,0xd9,0xd7,0x2f,0x28,0xd7,0xdf,0xbc,0x35,0x4f,0x49,0x7e,0xe7,0x21,0x82,0xd7,0x0c,0x7c,0xf4,0x86,0x86,0x62,0xcd,0xf5,0x23,0x77,0xc1,0x14,0x8a,0xc4,0x2a,0x82,0x74,0x0e,0x90,0x93,0xd5,0x5a,0xc0,0x57,0x93,0x1a,0xe1,0x1c,0x13,0x17,0x72,0xc3,0xa6,0x54 +.byte 0xc4,0xe2,0xfc,0xd3,0xa0,0xce,0x08,0x87,0x9e,0x2a,0xaf,0xa7,0xbb,0x2d,0xaf,0xc0,0x38,0x97,0xc8,0x6d,0xb8,0x7b,0x75,0xc5,0xf2,0x79,0x62,0xdc,0x7c,0xa9,0xfd,0x19,0xa2,0xb1,0xee,0xdf,0x90,0x18,0x5a,0xdb,0x3c,0xba,0x0d,0x84,0xd6,0xaf,0x15,0xee,0xb6,0xa5,0x78,0x38,0x87,0xdf,0x42,0xd6,0xd1,0xa2,0xe9,0xe0,0xa6,0xf2,0x4e,0xa4 +.byte 0xed,0xa5,0xf6,0x66,0x7f,0x99,0xbc,0xfb,0x4b,0x37,0xca,0x5a,0xb3,0x29,0x8e,0x80,0x30,0x8b,0x74,0x7b,0xac,0x61,0xfb,0xca,0x62,0xfe,0x24,0xc4,0x6e,0xac,0x66,0x97,0xaa,0x9a,0x99,0xe6,0xa8,0xa4,0xd8,0x62,0x58,0x7c,0xd1,0xeb,0xee,0xc8,0x08,0xa0,0x54,0xde,0xb1,0xef,0x57,0x2c,0xb6,0x2c,0x78,0x22,0x10,0xbb,0xfe,0x4b,0x77,0xa5 +.byte 0x5a,0xed,0xbb,0xf8,0x97,0x96,0x20,0xa9,0x8c,0x78,0xb5,0xb9,0x55,0xc9,0xaf,0xb9,0xa1,0x1f,0x13,0x52,0xf9,0xbb,0xaa,0x98,0x01,0x57,0xa6,0x88,0xaa,0x5c,0xf0,0x62,0x5b,0x3e,0xe1,0x5f,0xf4,0x98,0x95,0x8b,0x8f,0x48,0xd6,0xd5,0x8b,0xc2,0x1d,0x45,0x7d,0xe2,0x03,0x66,0x84,0xfc,0xbd,0x8e,0x95,0x9f,0x58,0x99,0x7b,0x4c,0xb6,0xe5 +.byte 0xe2,0xf9,0x2e,0x92,0x58,0xca,0xa9,0x24,0x9c,0x7c,0x46,0xdf,0xea,0xb4,0x6e,0x0e,0xa5,0x9c,0x14,0xbf,0x25,0x5b,0x39,0x4a,0xaf,0x31,0xaa,0xd1,0x2c,0xe6,0x06,0x3d,0xc4,0x60,0xc7,0xcd,0x49,0x8d,0xe1,0x50,0x55,0xe4,0x72,0x68,0xed,0x43,0xb8,0x85,0xa3,0xc3,0xf1,0xf5,0xd1,0xcf,0xcb,0x57,0xac,0x04,0x16,0x22,0xe4,0xfc,0x4a,0x13 +.byte 0x60,0x3f,0x09,0xa4,0xf2,0x9b,0x34,0xeb,0x0c,0x10,0x57,0xc3,0x3f,0x15,0xb5,0x1b,0x6a,0xb3,0x7d,0x37,0x02,0x4c,0x0f,0x6f,0x8b,0x4d,0x5d,0x57,0x7d,0xbf,0x00,0x8a,0x74,0xb4,0x4c,0x5f,0x90,0x27,0x76,0x09,0x8c,0x18,0x3f,0x26,0x3a,0x09,0x06,0xdd,0x8b,0xff,0x0e,0xa4,0xae,0xef,0x0c,0x81,0xf2,0xf3,0x1f,0xe0,0x33,0x33,0x37,0xc6 +.byte 0xc3,0xfb,0x14,0xdd,0xa1,0x16,0x84,0x80,0xcb,0x37,0xe7,0x97,0x6d,0x21,0xa7,0x71,0x19,0x2b,0x2d,0x30,0xf5,0x89,0x2d,0x23,0x98,0xfc,0x60,0x64,0x4a,0x26,0x65,0x4a,0xef,0x12,0x59,0xa3,0x8c,0xd9,0xbd,0xdc,0xb7,0x67,0xc9,0x8d,0x51,0x72,0x56,0x6a,0xe5,0x59,0xa2,0x53,0x4f,0xb6,0x53,0xff,0xb0,0xd4,0x06,0x7f,0x79,0x23,0xf9,0xcb +.byte 0xbf,0x9a,0x93,0xde,0x88,0x33,0x58,0x70,0xa7,0xcc,0x07,0xb1,0x44,0xb9,0x99,0x1f,0x0d,0xb9,0xc9,0x18,0xdc,0x3e,0x50,0x22,0xfb,0x4e,0x86,0x0d,0xc0,0xe7,0x7f,0xc6,0xa1,0x52,0x0d,0x8d,0x37,0xe6,0xaf,0xe3,0x13,0xbe,0xa6,0xf9,0x59,0x39,0x0f,0x17,0x66,0xce,0xb1,0x7d,0x7f,0x19,0x1a,0xf8,0x30,0x3a,0xa5,0x72,0x33,0xa4,0x03,0xb6 +.byte 0xb6,0x9b,0xde,0x7a,0x7a,0x62,0x3d,0x85,0x98,0x8e,0x5d,0x8a,0xca,0x03,0xc8,0x2c,0xae,0xf0,0xf7,0x43,0x3f,0x53,0xb2,0xbb,0x1d,0xd0,0xd4,0xa7,0xa9,0x48,0xfa,0x46,0x5e,0x44,0x35,0x50,0x55,0xdc,0xd5,0x30,0xf9,0x94,0xe6,0x5f,0x4a,0x72,0xc2,0x77,0x59,0x68,0x93,0x49,0xb8,0xba,0xb4,0x67,0xd8,0x27,0xda,0x6a,0x97,0x8b,0x37,0x7e +.byte 0xe9,0x59,0x89,0xc7,0x5e,0xd9,0x32,0xe2,0xaa,0xd1,0xe9,0x2b,0x23,0xca,0x9d,0x89,0x7a,0xf5,0xe4,0xfb,0x29,0xcc,0x88,0xfb,0x82,0x0f,0xbf,0x47,0x54,0xca,0x2b,0x4b,0xd8,0x47,0x7f,0x65,0x38,0x5a,0xb3,0xe8,0x0b,0xd7,0xe1,0x8b,0x89,0x57,0x32,0xdb,0xa3,0x85,0xba,0xf9,0xbc,0x52,0x92,0x20,0x10,0x66,0x54,0x81,0xe1,0x49,0x3f,0xe1 +.byte 0x8c,0x2e,0x0b,0x3b,0xe7,0x49,0xb4,0x60,0x5a,0x20,0x33,0xc4,0x4e,0x81,0xef,0x96,0xda,0x73,0x90,0x2b,0xb4,0x86,0xa1,0x5c,0xcd,0xa0,0xc7,0xf3,0x06,0x0d,0x2a,0x5a,0x41,0x96,0xf5,0x40,0x1b,0x0a,0x3a,0xb7,0x38,0xe1,0xbb,0xe3,0x42,0xf9,0x52,0xe5,0x98,0xe2,0x17,0xd4,0xb0,0x09,0x73,0x75,0xc1,0x00,0x18,0x0f,0xa7,0x0b,0x58,0xc1 +.byte 0x78,0x5c,0x0c,0x05,0xd8,0xfb,0xc5,0xfd,0x5c,0x66,0xbe,0x54,0x68,0xd1,0x16,0x54,0xfb,0xc5,0x97,0xd7,0x03,0x82,0x47,0xbb,0x47,0xea,0x9e,0x8b,0x90,0x07,0xb2,0xd2,0x06,0x14,0x79,0xeb,0xb6,0xe1,0x10,0x55,0xa9,0x13,0xea,0x65,0x7a,0xd0,0xe5,0x66,0x5d,0xe7,0x7b,0x10,0x5f,0x7c,0x25,0x7d,0x4e,0x77,0xb3,0x19,0x02,0xb1,0x45,0x1c +.byte 0x1a,0x51,0x24,0x72,0xd4,0xaa,0x03,0x0c,0x37,0x2a,0x78,0x81,0x05,0xca,0x73,0xb9,0xb5,0xd8,0xf5,0x25,0x2b,0x30,0x59,0x00,0x66,0xbd,0x6c,0x38,0xa2,0xc3,0xfb,0x43,0x85,0x6d,0xab,0xca,0xd8,0x73,0xa8,0x76,0xda,0x6e,0x00,0x19,0xd0,0xb9,0x1e,0x9b,0x33,0xe4,0x57,0x68,0xf4,0xb8,0x35,0x44,0xe6,0x74,0xd2,0x33,0x64,0xa1,0x41,0xa6 +.byte 0x5a,0xf6,0x8e,0x29,0xb5,0xa6,0x21,0x8e,0xc4,0x0c,0x0c,0x16,0x81,0x08,0xef,0x0a,0x41,0x08,0x34,0xc7,0xe1,0xd8,0xa8,0x68,0xb1,0xf3,0x9a,0x7a,0xaa,0x90,0xc0,0x77,0x32,0x70,0x50,0x5c,0x92,0xfc,0x38,0x31,0xaf,0x3e,0xd8,0xd8,0x4b,0x90,0x99,0xc4,0x17,0xde,0xa6,0xb5,0x29,0xc0,0x82,0x45,0x20,0x08,0x0c,0x4f,0x76,0x36,0x56,0x7e +.byte 0x07,0x17,0x42,0x78,0xa1,0x2d,0x62,0x48,0x81,0x57,0xc4,0xcf,0xf4,0x89,0x34,0x78,0x10,0xe6,0x98,0x78,0xb0,0x69,0x15,0x06,0xdb,0x2b,0xbb,0x8b,0xa5,0x72,0x50,0x24,0xae,0x6b,0x33,0x49,0x7b,0x9d,0x69,0x74,0xc8,0x7c,0xca,0x7a,0x31,0x39,0x0d,0x72,0x78,0xc1,0x6b,0x97,0x50,0x97,0xea,0x90,0xab,0xe7,0xdf,0x29,0x2e,0xf7,0x6e,0x49 +.byte 0x95,0xab,0xbd,0xea,0x1f,0xd4,0x93,0x4d,0x30,0x6b,0x6d,0xb0,0x86,0x38,0x2c,0xc8,0x77,0x2c,0xb5,0xb5,0x5c,0xd9,0xbb,0xe9,0x7d,0xb2,0xb7,0x6b,0xd1,0x1c,0xd3,0xd0,0x66,0x51,0x63,0x8c,0xf3,0x13,0xad,0xcf,0xeb,0x82,0x12,0x1a,0x6d,0xf5,0x75,0x66,0xa2,0x55,0x30,0x64,0x1d,0x68,0x46,0x50,0x5a,0x93,0xf1,0xc2,0x13,0x68,0x95,0x55 +.byte 0x51,0xe0,0x56,0x3a,0x96,0x86,0x8e,0xfb,0x5f,0x3b,0x1f,0x49,0x9c,0x3d,0xe5,0xf2,0x8c,0x3f,0xd6,0x6d,0x17,0xc7,0x18,0x59,0x1a,0x8a,0x72,0xa8,0xb3,0x39,0xda,0xc4,0xfa,0xc5,0xca,0xdf,0x48,0x48,0xd1,0xd2,0xba,0x14,0x5d,0x28,0x3b,0x4c,0xb3,0xcb,0x8d,0x1b,0x91,0x46,0x6b,0x2d,0x21,0x21,0x99,0x98,0x6d,0xcc,0x6b,0x8e,0x91,0x1d +.byte 0x42,0xc2,0x72,0x1a,0xc6,0xd2,0xaf,0xed,0x10,0xff,0x1e,0xa5,0xae,0x16,0xc0,0x05,0xdf,0x37,0xe2,0x1e,0x2e,0x15,0x21,0x0c,0x33,0x6f,0xfd,0xed,0x3f,0x7e,0xd7,0x69,0xfb,0x76,0x79,0x65,0xe9,0xd9,0x8d,0xf6,0xc0,0x6c,0xf7,0x15,0x7f,0x04,0xd7,0x71,0xcc,0xaa,0x85,0x73,0x23,0xf1,0xc8,0x62,0xd0,0x8e,0x01,0x35,0xff,0x4f,0x4f,0x13 +.byte 0xe6,0x28,0xf1,0xc1,0x7a,0x04,0xc0,0x7b,0x75,0xac,0x1c,0x55,0xb4,0x7c,0x00,0xb9,0xe0,0x14,0x67,0xb6,0xc5,0x69,0x62,0x0b,0xe6,0xb5,0x46,0x86,0x6f,0x09,0xdf,0x84,0x2c,0xa8,0x30,0x89,0x5b,0x24,0x47,0xfa,0x43,0x24,0xd5,0x07,0xf7,0xba,0xab,0x1b,0xfd,0x60,0xad,0x89,0x5f,0x60,0x87,0x78,0x48,0xbb,0xc0,0x63,0xf4,0x27,0x86,0x33 +.byte 0xf4,0x49,0x64,0x4c,0x5c,0x94,0x9a,0xb8,0x0f,0x45,0xe2,0x92,0x7d,0x9a,0x86,0xdb,0xb7,0x05,0xe8,0xd7,0x64,0x44,0xfa,0x74,0x60,0x72,0x89,0x13,0x8f,0x2e,0x96,0x33,0xa9,0x12,0x4a,0x62,0x6b,0xc3,0xcb,0x55,0xd3,0xef,0x17,0x11,0x82,0x4a,0x51,0x77,0xbf,0x63,0xa0,0x21,0xfc,0xbc,0x0c,0x6f,0x9a,0xfd,0xde,0xbe,0x9f,0x2e,0x50,0xd5 +.byte 0x32,0xa4,0xf0,0x1b,0xed,0xfa,0xbf,0xcd,0xc9,0xd8,0xf8,0x06,0xf2,0x17,0x8a,0x92,0x18,0xb8,0xc3,0xe5,0xbf,0xc2,0xf4,0x77,0xb9,0x71,0xfb,0x60,0x6e,0xe7,0xad,0xe4,0x7d,0xd4,0x59,0xa9,0xbd,0x21,0xd5,0x03,0x69,0xb5,0xf1,0xce,0xb5,0x88,0xd9,0x1d,0xc7,0xb3,0x14,0xa6,0xb1,0x30,0x8d,0xaa,0xcd,0xe5,0x50,0xc5,0x0d,0x4b,0x6d,0xde +.byte 0x17,0x4d,0xd2,0x93,0xf3,0xc2,0x8d,0x59,0xf1,0xd0,0x2f,0xb5,0x62,0x18,0x81,0x07,0xb3,0xfb,0x08,0xb3,0xa8,0x15,0xe0,0x9a,0x4c,0xa5,0x24,0xcd,0x47,0x69,0xf9,0xf7,0xda,0xa9,0xff,0xe1,0xe2,0x43,0xe3,0x69,0xf1,0x26,0xac,0xc6,0x42,0xf2,0x32,0x42,0xfb,0x7c,0xa2,0x94,0xc6,0xaa,0xd9,0x05,0x29,0xc6,0x3d,0x45,0x44,0x1d,0x52,0x7e +.byte 0x48,0x47,0x93,0x34,0x08,0xa0,0x93,0xc2,0x5e,0x9b,0x22,0xc1,0x2a,0xaa,0xfe,0xa2,0x26,0x00,0xa8,0xbb,0xd0,0x58,0xfd,0x5a,0x09,0x4f,0xa1,0x0c,0xff,0x66,0xcc,0x88,0x3a,0x69,0x9a,0x12,0xb6,0x05,0x6e,0xdf,0x54,0x5d,0xe7,0x03,0x8e,0x95,0x86,0x68,0x83,0x83,0x6f,0x04,0x0b,0x9c,0x05,0x05,0x77,0x14,0x83,0x47,0x98,0x5f,0x22,0xaf +.byte 0xa8,0xfd,0xf3,0xe7,0x73,0xec,0xef,0xd7,0x57,0xd9,0xef,0xe7,0x1b,0x18,0x24,0x09,0xd9,0x14,0xf9,0x60,0xba,0x05,0x0f,0x8f,0x33,0x48,0xb1,0x06,0x41,0x2e,0x95,0x3d,0xf5,0xcf,0x14,0x50,0x5d,0xb6,0x93,0xeb,0xd5,0xf8,0x9f,0x7c,0x8f,0x23,0x35,0x39,0x30,0xc8,0xf6,0x74,0x07,0xc4,0x4c,0xcf,0xe1,0xdb,0x3e,0x9f,0x0a,0xfd,0x48,0x9e +.byte 0x56,0xe4,0xa7,0xa3,0x07,0x06,0x18,0xbb,0x50,0x75,0x33,0x48,0xb9,0xa1,0x4e,0x63,0x65,0xd3,0xf4,0x40,0xc3,0x2d,0x52,0x9a,0xad,0x56,0x7f,0xff,0xb0,0x46,0x24,0xa1,0x78,0x5f,0xb6,0xa8,0x72,0x28,0xb3,0x6c,0x61,0x6e,0xa0,0xfc,0xcb,0xe8,0xfe,0x07,0x28,0x97,0x1c,0xda,0x76,0xc7,0x98,0x2f,0x00,0x1d,0xf2,0x17,0xbe,0x48,0x3f,0xd3 +.byte 0xc7,0xbe,0x89,0x89,0xe1,0x96,0x75,0x1e,0xee,0xf9,0x78,0x67,0xbf,0x12,0x1e,0xe2,0x14,0xbf,0xd4,0xfd,0x49,0xaa,0xbf,0xc6,0xb8,0x4f,0x84,0xcd,0x5d,0x3c,0x45,0xb3,0xb0,0x14,0x6f,0x2d,0x6f,0x35,0xfa,0x60,0x7f,0x64,0x40,0xc8,0xde,0xa8,0x2b,0x56,0x75,0x74,0xc9,0xe1,0x2c,0xe2,0x2f,0xc2,0x3e,0xba,0xa3,0x20,0xd8,0xa3,0xbc,0x69 +.byte 0x9d,0x1c,0xcf,0x5e,0xe3,0xc0,0x66,0x72,0xce,0x22,0x96,0xad,0x47,0xc9,0x5b,0xac,0x45,0xdc,0x4f,0x8e,0xf6,0xa6,0x2e,0x4a,0x1e,0x01,0xe4,0xb7,0x83,0x68,0x92,0x2b,0x98,0xdf,0x22,0x0f,0xd9,0x4f,0x6f,0x72,0x37,0x56,0xfa,0x1b,0xbb,0x5a,0x4d,0xd8,0x5b,0xc6,0x65,0xf8,0xd4,0x4e,0xa5,0xc0,0x0f,0x2d,0xc2,0x38,0xa4,0x6c,0x33,0x2f +.byte 0x7a,0x52,0x14,0xbb,0xfb,0xb3,0xf2,0xa9,0xbf,0xa0,0xad,0xcb,0x8c,0x81,0x47,0x26,0xe9,0xfb,0xc1,0x8e,0xc6,0xe5,0x39,0x48,0xa5,0xb3,0xbc,0xb2,0xe4,0xac,0xf9,0x49,0xbb,0x34,0x2b,0xc4,0x4d,0x06,0xe4,0xd6,0x0b,0xdd,0x55,0x36,0xe6,0xaf,0x64,0xea,0x84,0xf2,0xa5,0x68,0xe3,0x4e,0x4c,0x77,0x46,0x6c,0x17,0x6e,0x08,0x99,0x96,0x1b +.byte 0xb5,0x44,0x3b,0x94,0x2d,0x0f,0xcd,0x90,0x17,0x8f,0x80,0xcb,0xc2,0x30,0xbe,0xe1,0x36,0xdc,0x1e,0x48,0xe3,0x2c,0xe5,0xc9,0xbc,0xbd,0xff,0x3f,0x95,0x59,0x35,0x58,0x2f,0x9c,0xa6,0x1c,0x45,0xa7,0x61,0xde,0xf2,0x9c,0xa3,0x04,0x0f,0xa0,0x93,0xaf,0x69,0x2b,0x0d,0x1c,0xfc,0xff,0x97,0x1c,0x69,0x7e,0x30,0x06,0x88,0x01,0xa4,0xf1 +.byte 0x32,0x36,0xed,0x56,0x89,0xff,0xa9,0x63,0x3a,0x17,0x91,0xc5,0xba,0x6e,0x38,0x84,0xb1,0xaf,0x28,0xac,0x8a,0xb2,0x60,0xbe,0x1b,0x0a,0xd8,0x05,0x22,0x25,0x56,0xbe,0x75,0x47,0x59,0xcf,0x8c,0x2e,0xb3,0xc3,0x5f,0x06,0x81,0x65,0x39,0x78,0xed,0xe3,0xc9,0x5a,0x99,0x01,0xae,0xfb,0xf6,0xed,0x55,0xf5,0xbd,0x2f,0x93,0xf1,0x62,0x6a +.byte 0x54,0x4f,0xe1,0x9f,0x0a,0x23,0x83,0xbc,0xc2,0xba,0xb4,0x6f,0xd9,0x88,0xc5,0x06,0x7a,0x83,0xd5,0xdb,0xeb,0x49,0x48,0xd6,0xc9,0x45,0xa2,0xd0,0xc4,0x06,0xd9,0x01,0xec,0x2d,0x6d,0xc1,0x95,0x69,0x22,0xd0,0xae,0x88,0x75,0x8b,0xd2,0x02,0x98,0x83,0xd9,0x10,0x27,0x8d,0x68,0x97,0x5e,0x6b,0xdd,0x51,0xbb,0x92,0x38,0xa8,0x12,0xde +.byte 0x0f,0xa4,0x1e,0x2e,0xec,0xd5,0x73,0x55,0x5f,0x46,0x6a,0x0f,0xc9,0x50,0x0d,0xb3,0x55,0x20,0xe0,0x01,0xef,0x92,0x29,0x04,0x38,0x60,0xbd,0xc7,0x0b,0x1e,0x94,0x10,0x37,0xb7,0x02,0x94,0xbc,0xde,0xdb,0xb3,0xe3,0x1e,0xd5,0xe2,0xa8,0xed,0x46,0xe8,0xd4,0x8a,0x6c,0x93,0x4e,0xb7,0x73,0xa6,0x20,0x86,0xd2,0x82,0x2f,0x78,0x80,0x34 +.byte 0x44,0x79,0x84,0x2e,0x54,0xd0,0x30,0xa8,0x06,0x0c,0xcf,0x78,0xb4,0xd7,0xe2,0xc9,0x6e,0xfb,0x37,0x47,0x8f,0xe5,0x9f,0xf8,0xca,0x58,0x9c,0xb6,0x8b,0xbe,0xf4,0x3a,0xfe,0x75,0xec,0x1b,0x22,0xfd,0x93,0x92,0x07,0x09,0xcd,0xe6,0x2f,0xe6,0x51,0x0f,0x19,0x43,0x9c,0x6a,0x32,0x38,0x7d,0xf0,0x0c,0x78,0x81,0xb7,0x5c,0xbe,0x3c,0xf4 +.byte 0xc0,0x12,0x57,0x51,0x8a,0x69,0x84,0x0d,0x1e,0x0a,0xed,0x75,0xde,0x9e,0x31,0x8a,0x9b,0x18,0x82,0x01,0x5a,0xee,0x0e,0x33,0x3c,0x8c,0x95,0xb1,0x0b,0x05,0x3b,0xb2,0x85,0xab,0xaf,0x47,0xa2,0x03,0xb6,0xbb,0xda,0xf5,0xc8,0xbe,0x0e,0x4d,0xf8,0x84,0xe4,0xfb,0xd4,0x54,0x44,0x72,0xe5,0x30,0x57,0xa3,0xb6,0x47,0x8f,0xd3,0x32,0xc2 +.byte 0x83,0x07,0x4f,0x17,0x20,0x88,0xa1,0x0b,0xb3,0xef,0x4b,0x27,0x60,0xe0,0x9d,0xec,0xc2,0xdf,0xaf,0x2e,0x74,0xae,0xa4,0x2b,0x59,0x94,0x75,0xbe,0x54,0xf5,0x18,0x62,0xd9,0xe2,0x35,0xee,0x37,0x2e,0xdf,0x48,0xf8,0x80,0x32,0xcb,0xf1,0x83,0x78,0x03,0x68,0x06,0xd7,0x82,0xc6,0x76,0x2a,0x10,0x2a,0xdb,0x73,0xe6,0x65,0x24,0x9f,0x73 +.byte 0x1f,0x55,0x55,0xb6,0x10,0x65,0x80,0x70,0x5a,0x8e,0x8a,0xc8,0x4c,0xca,0x74,0x47,0x63,0x3f,0xee,0x49,0xc3,0x86,0x0f,0x66,0x56,0x08,0xee,0x9f,0xf5,0x5a,0x89,0x4c,0xb4,0x97,0x6e,0x75,0x61,0xc0,0xa7,0x92,0xa8,0x38,0x99,0x08,0x01,0x12,0x82,0x77,0x80,0x20,0x9d,0x62,0x46,0x92,0xdd,0x39,0x4d,0xcf,0xc0,0x8a,0x3e,0x30,0x9a,0xfa +.byte 0x28,0xe8,0xd8,0xf8,0x07,0x0d,0xab,0x4c,0xd4,0x02,0x4c,0xd7,0xc3,0x16,0x89,0x24,0x84,0x52,0x7c,0xa4,0x1b,0x54,0x7f,0xc4,0x74,0x4f,0x88,0x0a,0x14,0x03,0xd9,0x1a,0x48,0xff,0x2c,0xfb,0xbf,0x33,0xf1,0xf8,0x0e,0xdd,0xc4,0x98,0xf2,0xbd,0x32,0x99,0x03,0x8e,0x56,0xc1,0x84,0x5d,0xa6,0xd7,0x21,0xf2,0x43,0xfb,0x3b,0xf5,0x6a,0x75 +.byte 0x20,0xfb,0x08,0x7b,0x66,0x15,0x47,0x31,0xb6,0xb6,0x7a,0xc9,0xe6,0xf5,0xd6,0x0a,0x14,0xb3,0x68,0x0a,0x32,0x13,0xb5,0xe6,0x56,0xbd,0xa5,0x24,0xe2,0xa3,0x7b,0x3d,0x01,0x23,0xed,0x08,0x09,0xb5,0xdb,0x7c,0xa9,0x4b,0x23,0xdb,0xa2,0x25,0x0c,0xc6,0xa4,0x0d,0xbb,0x1a,0x5d,0x1b,0x42,0x0b,0x86,0x72,0xc3,0xca,0x5b,0x14,0x04,0xa3 +.byte 0xd7,0x01,0xe7,0x17,0x78,0xd0,0x54,0xde,0xd4,0x76,0x3d,0xe1,0x7d,0x26,0x3e,0xb4,0x71,0x42,0x84,0x36,0x58,0x78,0x22,0x32,0x26,0x0e,0xc8,0x99,0x05,0xe3,0x4a,0xa6,0x5a,0x1a,0x06,0x0a,0x88,0x47,0x51,0x5c,0xa8,0x72,0x70,0x0c,0x62,0x5f,0xf3,0x1e,0x02,0x50,0x20,0xc6,0x5c,0x50,0x30,0x1f,0x4e,0x5a,0x3a,0x02,0xc9,0xca,0x3f,0xa4 +.byte 0xf1,0x66,0x05,0xf3,0x19,0xe5,0xaa,0xdb,0x75,0x51,0xc1,0xb8,0x94,0xfa,0x2d,0xb6,0x8b,0x42,0xdc,0x9a,0xa3,0x13,0xeb,0x95,0x8d,0xf0,0x65,0x87,0xc9,0xa1,0x43,0xb4,0xfe,0x76,0xf4,0xc8,0xbb,0x19,0x96,0x84,0x9d,0x2f,0x92,0xe8,0x22,0x9a,0xf0,0xd5,0xf4,0xc4,0x8d,0x19,0x59,0x21,0xbf,0x15,0xfd,0xa6,0xc4,0xde,0x77,0x58,0xae,0x93 +.byte 0xb3,0xff,0x44,0x49,0x6e,0x37,0x94,0x04,0xd2,0x96,0xe9,0x80,0xd8,0xe3,0x93,0xd8,0xb4,0x7f,0x5f,0xcf,0xe5,0x9d,0x51,0x92,0xac,0x5d,0x9f,0x23,0x3a,0x3e,0xdf,0x96,0x68,0x9a,0x46,0x9b,0x1a,0x06,0x44,0x54,0xc4,0x2e,0x19,0x0f,0x50,0xee,0x73,0xda,0x39,0x7e,0xec,0xcb,0x1d,0x39,0xf7,0x9f,0xbc,0xe0,0x6d,0x49,0x56,0xf8,0xa7,0x24 +.byte 0x70,0xab,0xe1,0xc3,0x82,0x99,0x0a,0x4d,0x64,0x41,0x37,0xab,0x92,0x76,0xeb,0x6a,0x2a,0xa5,0xab,0x75,0xd7,0xe3,0x6a,0x72,0x4a,0x2b,0x57,0x02,0xc7,0xbe,0xd5,0x35,0xce,0xdf,0xee,0xf1,0xc6,0xe6,0x69,0xb7,0x76,0x99,0x22,0xb0,0xb9,0xe1,0x18,0x91,0x9a,0x35,0xd9,0x3a,0x19,0xc7,0x77,0xf2,0x2d,0xae,0x04,0x2e,0xb7,0x35,0x97,0xa5 +.byte 0xc6,0x97,0x4e,0x5d,0xbe,0xa9,0x35,0x2b,0x53,0x1a,0x6b,0x4e,0xa8,0xa6,0x22,0x48,0x2c,0x81,0x25,0xac,0x30,0x89,0x7b,0xb3,0x38,0x34,0x42,0x0b,0xa5,0x5f,0x02,0xe8,0xee,0x12,0x9b,0xce,0xe7,0x10,0xf9,0x65,0xb6,0xc5,0x74,0x06,0xef,0xc8,0x95,0xb3,0x40,0x30,0xec,0x1f,0x8e,0xeb,0x93,0x31,0x91,0x5a,0x2f,0xc2,0x90,0x85,0xaa,0x4c +.byte 0x51,0xc4,0xd0,0x3e,0xc8,0xc9,0x61,0x46,0x96,0xd4,0x60,0x56,0x7d,0x91,0xc4,0x24,0x76,0xfb,0x09,0x08,0x48,0x2f,0x4a,0x73,0x90,0x8e,0x9d,0xb2,0x38,0xa8,0x95,0x3e,0x6d,0x10,0x57,0x91,0x8d,0x55,0x62,0x1f,0x21,0xc7,0x01,0x15,0xb0,0x71,0x0b,0x26,0xbc,0x10,0x33,0x3e,0x79,0x37,0x64,0x85,0x98,0x42,0x21,0xcc,0xff,0x51,0x9a,0xc2 +.byte 0xe0,0x51,0xc3,0xff,0xf2,0x14,0x3d,0xe8,0x89,0x12,0xe7,0xcd,0x58,0x2f,0x87,0xfb,0x4a,0x50,0x6c,0x4d,0xdf,0x6f,0x64,0x9c,0x64,0x93,0x49,0x89,0xb6,0x0d,0x10,0x3f,0x13,0x9d,0x9a,0x35,0xf1,0xc0,0xe7,0xf0,0x9b,0xe8,0x39,0xd3,0x32,0xb2,0x23,0x67,0x77,0xdb,0xbc,0x0d,0x19,0x77,0x7a,0xbe,0x54,0x56,0x64,0xec,0xb6,0x2e,0x03,0xc5 +.byte 0x35,0xda,0xf1,0xc7,0x7d,0x0c,0x5a,0x32,0xec,0x86,0xdf,0xdb,0x94,0x73,0x4e,0xe3,0x45,0xf6,0xb2,0x63,0xc4,0xb7,0x80,0x59,0x4b,0x82,0x0b,0x61,0xa0,0xd5,0x43,0x18,0x78,0x35,0x93,0xde,0x46,0xa3,0xa2,0xd5,0xa2,0x71,0xec,0x3e,0xee,0x7a,0x89,0x7f,0xe9,0x70,0xff,0xad,0xae,0xa3,0x64,0xde,0x61,0xea,0x71,0xc2,0x37,0x98,0x8a,0x33 +.byte 0xd1,0x5f,0x03,0x08,0x23,0x24,0xc7,0x6c,0x62,0x24,0x6d,0x3f,0x44,0x8e,0x7c,0x9f,0x64,0x87,0xa5,0x79,0x0b,0x16,0x7e,0x4e,0xc0,0x0e,0xb8,0x77,0x56,0x9c,0xa5,0x7d,0x2d,0x5d,0x7d,0x81,0x13,0x2c,0x08,0xd5,0x83,0x84,0x38,0xfe,0x50,0x6f,0xa7,0x30,0x1f,0x06,0xee,0xab,0x13,0xc2,0x19,0xe6,0xcf,0x7b,0x85,0xfc,0x31,0x5b,0xdf,0xb8 +.byte 0x0e,0xe8,0x72,0xba,0x97,0x03,0x25,0xbc,0xad,0x74,0x7c,0xe1,0x59,0xf7,0x08,0xc1,0xe3,0x2d,0xb1,0x05,0xe7,0x1f,0xb9,0x0f,0x09,0xcd,0xe6,0x4f,0x5a,0xf6,0xcc,0xea,0xc7,0x92,0x35,0xf5,0xbc,0x3f,0xef,0xc9,0x2b,0xb4,0xd7,0x66,0x50,0xaa,0x80,0xb9,0xaf,0x5d,0x02,0x9c,0x77,0xdf,0xc0,0xc7,0xe2,0xbf,0x7d,0xff,0x69,0x63,0x3e,0x7c +.byte 0x91,0x94,0xae,0xa4,0x0a,0x25,0xa3,0x1f,0xf3,0xc6,0x88,0xda,0x82,0xac,0xbc,0x1f,0x8d,0x53,0xd6,0xfd,0x2b,0x5c,0x33,0x6d,0x03,0x68,0x92,0x38,0x07,0xeb,0x85,0x7f,0x55,0x89,0x17,0x58,0x7f,0xc7,0xb4,0x7a,0xff,0x15,0xe5,0xe0,0xea,0xce,0xac,0x3f,0x0f,0x09,0x25,0xfa,0x80,0xe3,0x07,0x89,0x4e,0xbf,0x7e,0xc2,0x42,0xf1,0x18,0x78 +.byte 0x05,0xe3,0x6a,0x2e,0xf7,0x2e,0xe5,0xbf,0x63,0x9e,0x48,0x69,0xe6,0x3c,0x4b,0x12,0x73,0x58,0xde,0x0c,0x73,0x27,0x9a,0x95,0xfa,0x51,0x8c,0xbb,0x74,0x31,0x53,0x4e,0x9a,0x13,0xda,0x49,0xf0,0x8b,0xb4,0xcd,0xc1,0xe9,0xaf,0xd6,0x59,0x59,0xa8,0x24,0x94,0xd9,0x4b,0xf8,0x20,0x79,0xa0,0x79,0x01,0x08,0x84,0x9b,0x04,0xe7,0xda,0x06 +.byte 0x22,0x3e,0x85,0x23,0x0c,0xa9,0xe5,0xcd,0xd3,0xc4,0x27,0x8c,0x4e,0x75,0xe4,0x60,0xb5,0xe9,0xc5,0xb7,0xb1,0x3a,0x84,0x68,0x40,0x3e,0x36,0x1b,0x9a,0x64,0x50,0x45,0x6f,0xc6,0x58,0x70,0x46,0x1a,0xca,0xf6,0x81,0x02,0xa8,0x17,0x4d,0x92,0x0d,0xae,0x88,0x1a,0xbd,0x52,0xc0,0x32,0xb1,0x2d,0x2d,0x12,0x9c,0x29,0xfa,0xa6,0x70,0x5f +.byte 0xe7,0x0b,0xd5,0x5d,0xa5,0x49,0x9e,0x9e,0x5b,0x55,0xbc,0xce,0x5b,0xb4,0xef,0x3f,0xe4,0x7c,0x50,0xef,0x58,0xf5,0xfe,0xcc,0xf6,0xd0,0xf1,0x3a,0x0b,0xf2,0x3e,0x1c,0xce,0x22,0x7e,0x88,0x1c,0x8f,0x9a,0x69,0x76,0xa9,0xf0,0x18,0xa8,0x76,0x7f,0x0c,0xa6,0xfd,0x67,0x43,0xc7,0x43,0x67,0x98,0x6e,0x37,0xd4,0x82,0x29,0x62,0xa6,0xcf +.byte 0x2b,0x7c,0xee,0x14,0x4d,0x2d,0x1a,0xfc,0xc6,0xaf,0x5b,0xea,0x8a,0xa8,0x9a,0x3b,0xab,0x7d,0x76,0x15,0x50,0xe8,0x95,0x31,0xc8,0x5d,0x5d,0x19,0x68,0x07,0xf5,0xb0,0x29,0x5f,0x79,0x4f,0x0d,0x2b,0xba,0x1d,0xd2,0xf2,0x83,0x50,0x89,0x0b,0x96,0x16,0xde,0x7c,0x04,0xea,0x9c,0x75,0x97,0x7e,0xd7,0x2c,0xee,0x82,0x7c,0xbf,0x0b,0x71 +.byte 0x05,0x59,0xd7,0x11,0x70,0x8e,0x41,0x62,0x91,0x38,0x3a,0x69,0x3f,0x3d,0xde,0x8e,0x03,0x0a,0xea,0xfb,0xea,0x36,0xf0,0x5c,0xb6,0xdf,0x9a,0x66,0x9e,0x64,0x43,0xaf,0xb7,0x83,0xd1,0xef,0x7c,0xb6,0x9b,0x40,0xd8,0x0f,0x0e,0x0b,0xa7,0xd0,0x98,0xca,0x8e,0x3b,0xed,0xb7,0xa5,0x19,0xca,0x67,0x30,0x87,0x17,0x0e,0xc4,0xe1,0xaa,0x6e +.byte 0xdb,0x67,0xbd,0xf5,0xed,0x10,0x68,0xb1,0x43,0x73,0xaa,0x99,0x1a,0x83,0x0d,0x1a,0x5a,0x8b,0xc8,0xff,0xe9,0xe0,0x1c,0x15,0xda,0xb0,0x99,0x90,0xce,0x1f,0xfd,0x17,0xd2,0xfa,0x8f,0x3a,0xe8,0x1b,0xd3,0x96,0x2a,0x0d,0xa9,0x4d,0x6d,0x77,0x53,0xe8,0x8f,0xc7,0x6b,0xb4,0x3b,0x6d,0x0c,0x8e,0x35,0x67,0x09,0x6e,0x43,0x36,0x52,0x3e +.byte 0x0e,0xf6,0x4f,0x16,0x40,0x45,0x7f,0xab,0x39,0xf2,0x23,0xfb,0x4e,0xea,0x6e,0xcf,0xa0,0xb6,0xec,0x6d,0x93,0x1b,0x6f,0x9f,0xd6,0xce,0xcd,0x1e,0x90,0x5c,0x7d,0x61,0xc4,0xae,0x02,0xb2,0x7a,0xb2,0x25,0x59,0xac,0x0a,0xcb,0xc6,0x28,0xa2,0x9c,0x7b,0x4b,0x05,0x5a,0x23,0x55,0xc8,0x9a,0x72,0xe6,0x3b,0x91,0xa2,0x9b,0x12,0x1c,0x1f +.byte 0x4b,0x85,0x42,0x9d,0x73,0xf9,0x50,0x3e,0x12,0xc4,0x51,0xb4,0xe1,0x2a,0x08,0xfc,0xf9,0xc8,0x5a,0x53,0x79,0xcc,0xd1,0x24,0x4c,0xc1,0xf6,0xe7,0x10,0x9d,0xe6,0xce,0xcc,0xc7,0x04,0xf8,0x7a,0xd4,0x2f,0x0a,0x97,0x32,0xaf,0x38,0x77,0x97,0x78,0xc8,0xa9,0x9a,0xca,0x65,0xee,0x2b,0x07,0x0e,0xb1,0xaa,0x3c,0xee,0x03,0x85,0xf7,0x09 +.byte 0xd1,0x03,0xe5,0x4f,0x8a,0x6b,0xba,0x83,0xd2,0x6a,0x05,0xe6,0x4e,0x59,0x21,0x26,0xcc,0x8d,0x4a,0x91,0x21,0x6b,0xe5,0x7a,0x83,0xed,0x4e,0x95,0x4b,0x16,0x98,0x3f,0x2d,0x51,0xc5,0x67,0x56,0x58,0xc9,0xc3,0x32,0xff,0x91,0x9d,0x7f,0x6d,0xc7,0x8a,0x40,0x58,0x56,0x35,0xca,0xc1,0xa9,0x07,0xe2,0xc6,0xe1,0x8f,0x7b,0x7c,0x68,0x4e +.byte 0xde,0x19,0xc8,0x9c,0x41,0x65,0x74,0x33,0xb5,0x5b,0xf7,0x47,0x91,0x51,0x41,0x56,0x54,0xaa,0x8e,0xa5,0x1f,0xdb,0x50,0xa4,0x97,0x7a,0xea,0x86,0x2e,0xfd,0xdd,0x64,0x23,0x6e,0x44,0x28,0xfb,0xae,0xe8,0xc2,0x38,0x96,0x56,0x2e,0xd8,0x7e,0x3a,0xc8,0xc6,0x7f,0x20,0x15,0xad,0x9f,0xfa,0x5c,0x55,0xf5,0xe1,0x9a,0x07,0x84,0x5b,0x81 +.byte 0x39,0x4b,0x70,0xc3,0xfd,0x2b,0xc5,0xb7,0x47,0x36,0x74,0x5a,0x85,0xaa,0x45,0x94,0x8e,0xbe,0x7f,0x6c,0x45,0xf5,0x02,0x4e,0x5f,0x16,0x04,0x7e,0xfa,0xb8,0xa9,0x38,0xc4,0xd9,0xca,0x5f,0x7a,0xe3,0x96,0x78,0x82,0xa0,0xac,0xef,0xc4,0x2a,0xb5,0xf4,0x7d,0x28,0x8c,0x25,0xba,0x4e,0xd5,0xd5,0xd1,0x24,0xc6,0x05,0xb2,0x18,0x2d,0x66 +.byte 0xea,0xe3,0x42,0x79,0x33,0x9e,0x70,0x3a,0x1b,0x5a,0x8e,0xcb,0x03,0xa8,0x43,0xf3,0xd5,0x66,0x41,0x10,0xd7,0x09,0xf0,0x28,0xe5,0x25,0xe6,0xac,0x9a,0xe6,0x34,0x36,0xfb,0xc4,0xa6,0x9a,0xd0,0x24,0x4d,0x18,0xf9,0xd1,0x8e,0xca,0x92,0x83,0x0f,0x55,0x54,0x6d,0x72,0x81,0x81,0xdb,0x72,0x1f,0xd6,0x32,0xb9,0x32,0x45,0x84,0x9c,0x66 +.byte 0x68,0x7e,0xab,0xb3,0xca,0xf5,0x4f,0xdd,0xb4,0xee,0xbb,0x05,0x70,0xbe,0x4f,0xd1,0x27,0x01,0xcc,0x7c,0x4f,0x47,0x55,0xce,0x91,0x73,0x6f,0xff,0x8d,0xfc,0x0c,0x4c,0xaa,0xfc,0xce,0x9f,0xf3,0x4a,0x46,0x92,0x89,0x84,0x8f,0x4d,0x94,0x37,0xda,0xe3,0x11,0x0d,0x63,0x60,0xcb,0x40,0x8f,0xe8,0x0f,0xf9,0xa1,0x89,0x64,0x44,0x45,0x74 +.byte 0xc5,0xa2,0x73,0x33,0x08,0xa2,0x59,0xb0,0xeb,0x7b,0x7b,0xa7,0x28,0x4c,0x13,0x6a,0x04,0x15,0x14,0xd0,0x3e,0x5e,0xec,0xe1,0x3f,0xe5,0x93,0x06,0x6b,0x60,0x50,0x1c,0x90,0xc0,0x5c,0xea,0x7e,0x58,0xf1,0xed,0xba,0x43,0x0b,0x84,0xf7,0xa4,0xbd,0x4c,0xed,0x88,0x5b,0xae,0xa2,0x0a,0xf6,0x06,0xfd,0x43,0x63,0xfe,0x8a,0x03,0x21,0x8b +.byte 0x27,0xc6,0xef,0xa3,0xa9,0x3a,0xc1,0x8b,0x65,0x62,0x25,0x85,0xaa,0x2f,0xff,0x22,0x96,0xb7,0x5c,0x82,0xde,0x21,0x4e,0x0d,0x8d,0xd9,0x7f,0x97,0x79,0x95,0x6c,0xe6,0xfd,0xb1,0x7c,0x84,0xc8,0x73,0xbc,0x50,0x2f,0x87,0x03,0x56,0xcf,0xea,0x7f,0xed,0x17,0x7d,0xf7,0x61,0x6b,0x6f,0x5b,0xd3,0xe4,0x83,0xbd,0x8b,0xd3,0x8e,0x51,0x57 +.byte 0x3d,0xcc,0xe4,0x09,0xb9,0x73,0x1f,0xb4,0x47,0x5e,0xf2,0x10,0x3e,0xf4,0x9c,0x86,0x02,0xdf,0x3e,0x75,0x1c,0x9b,0xb5,0x0f,0x31,0xc6,0xbb,0x00,0xb4,0x8a,0x1a,0xe5,0x0d,0x9c,0x3e,0x93,0x61,0x5a,0x61,0x86,0x12,0x64,0xaa,0xfd,0xa2,0x6e,0x8f,0xcc,0xcd,0x60,0xa1,0xad,0x6d,0xdc,0xa2,0x7b,0x5a,0xe0,0xee,0x27,0x5d,0xc5,0xfe,0x1f +.byte 0x7b,0x9f,0x33,0xf1,0xee,0x2a,0x58,0x39,0x56,0x14,0x4f,0x2f,0x11,0x26,0x6b,0x56,0x7c,0x75,0xb7,0xc3,0xa7,0xf6,0x54,0xd8,0xa7,0xbb,0x73,0xb5,0xa5,0x83,0x1e,0x65,0x7e,0xa7,0x85,0x74,0xa4,0x04,0x0e,0x26,0x01,0x88,0xbc,0x8b,0x98,0x0c,0x9b,0x74,0x22,0x44,0x16,0x16,0xed,0x94,0x81,0x81,0x13,0x26,0xc9,0x27,0xa9,0xa7,0xe0,0x45 +.byte 0x69,0x6e,0x33,0xcc,0xa3,0x15,0x10,0x99,0x84,0x06,0x95,0x00,0xbb,0xc6,0x8e,0x4e,0x37,0x1b,0x23,0xb2,0xf7,0x4d,0xd7,0x24,0x68,0x6b,0xaa,0x2e,0x57,0x8d,0xd6,0x4e,0xa2,0x69,0xd8,0x8d,0x84,0xb2,0x85,0x91,0x30,0xbf,0x41,0xab,0xcf,0x5c,0xa6,0x51,0x1e,0xf5,0x79,0x5a,0x20,0xfa,0x3d,0x0a,0xc5,0xd7,0x3f,0xa6,0xcc,0xf6,0x9b,0x76 +.byte 0xe0,0xec,0x9e,0x0b,0x23,0xe4,0x74,0x36,0x14,0x6f,0x24,0x9d,0xe7,0xb2,0x41,0xd7,0x68,0x37,0x67,0xdc,0x01,0xb1,0x20,0xf9,0x8b,0x0b,0xf5,0xa7,0x95,0x78,0xa0,0x6c,0x4b,0xc0,0x44,0x92,0x4a,0x75,0x0f,0x61,0xde,0xc3,0xc2,0x3d,0x17,0xa0,0x4d,0x57,0x8b,0x11,0x35,0xbd,0x49,0x87,0x05,0xba,0x5d,0x1f,0x76,0xd4,0x0f,0xb0,0x5b,0x5f +.byte 0xb7,0xf8,0xcf,0x12,0x54,0x19,0x9a,0x49,0x6a,0x42,0xad,0x93,0x85,0x0b,0xe7,0x8c,0x30,0x59,0x82,0x82,0x2d,0xd9,0x89,0xf5,0x8c,0x39,0x9c,0xf5,0xcd,0x25,0x22,0x74,0xcf,0x56,0xa2,0x15,0x40,0xa6,0xa8,0xfc,0xdc,0x85,0x9e,0xab,0xd6,0x94,0x5d,0xd6,0x73,0x07,0xed,0x7b,0x76,0x11,0x67,0xf5,0x52,0xac,0x1a,0x69,0x1f,0x4a,0xa2,0xaa +.byte 0x4d,0x11,0xe0,0xc4,0x4c,0x6e,0x9e,0x8e,0x13,0x46,0x0b,0x95,0x40,0x53,0x35,0x53,0x58,0x7f,0x81,0x5f,0x17,0xd7,0x5e,0x53,0x86,0xf3,0x1b,0x70,0xf1,0x95,0x8f,0xf6,0xd4,0x6f,0x55,0x92,0xa2,0x38,0xd3,0x43,0x6c,0x7e,0xa2,0x21,0x5b,0x18,0x11,0xdd,0x03,0x52,0xe6,0xe5,0xc0,0xc5,0x4e,0x8e,0xda,0xdb,0x91,0xcf,0xf7,0x75,0xc2,0x33 +.byte 0x69,0xd1,0xd1,0x29,0x9d,0x51,0x79,0x91,0xe4,0x58,0x05,0xa5,0xf6,0x54,0x16,0x3e,0x42,0xf3,0xc4,0x1f,0x88,0x94,0xfc,0x6b,0x53,0xb1,0xd5,0x17,0xe6,0xab,0x77,0x33,0x8a,0xd0,0x93,0x74,0x02,0xe0,0x81,0x5e,0xbe,0x2f,0x4d,0xcd,0x25,0x0b,0xd0,0x06,0xd8,0xc9,0xf9,0xcf,0x8e,0xf8,0xc3,0xe2,0x33,0x60,0xe5,0xfa,0x89,0x68,0xf8,0xb7 +.byte 0xef,0x9d,0xfc,0x9d,0x76,0x13,0x2d,0x9d,0x18,0x7d,0x05,0xb4,0xa7,0xa3,0x8a,0x91,0xe0,0x73,0x65,0x89,0xb4,0xc1,0x53,0x7c,0xdc,0xf2,0xab,0x39,0x94,0xc7,0x3d,0xf8,0x1c,0x8f,0x49,0x37,0xee,0xc1,0x19,0x84,0x15,0x3b,0x36,0xb2,0xc2,0xe1,0x16,0xe2,0xfb,0xde,0x1f,0x0e,0xa4,0xea,0x59,0x67,0x2d,0xea,0x47,0xe5,0x2c,0xd1,0xb5,0xa9 +.byte 0xbd,0x5c,0x92,0x34,0x8b,0xc5,0xab,0x4f,0x2b,0x6b,0xc4,0x8b,0xdb,0xbb,0xcb,0x86,0x34,0x35,0xa0,0x5c,0x29,0x1a,0x8b,0xce,0xdc,0xd7,0x46,0x2b,0x20,0x9d,0xea,0xa8,0x97,0x68,0x37,0x56,0x03,0x7d,0x4f,0xb6,0xfc,0x30,0x82,0x68,0xb4,0x56,0xf3,0xbe,0x58,0xcc,0x20,0xc1,0x53,0x9f,0xbb,0x0b,0x2b,0x6e,0xa0,0x2d,0xc0,0x61,0x02,0x0b +.byte 0xf9,0x0e,0x55,0xb8,0xb8,0x23,0x6e,0x50,0xc0,0x36,0xb8,0xf6,0x5e,0xb3,0xa7,0x8f,0xf8,0x7f,0xd0,0x5d,0x0a,0xc4,0x2b,0xa9,0xd3,0x76,0xcf,0x4d,0x27,0xda,0xac,0xf3,0xb0,0xca,0x00,0xa0,0x94,0x12,0x20,0x89,0x22,0xa9,0x89,0xe4,0x23,0x71,0xe0,0xdb,0xec,0xb0,0xa9,0x2e,0x45,0xf6,0x8d,0x1e,0x4b,0x0e,0xc7,0xf8,0x40,0xd6,0xf4,0x2f +.byte 0x80,0x3e,0xf8,0xfb,0xcf,0x7b,0x54,0xb5,0xbd,0x55,0xf2,0x37,0x46,0x9f,0x32,0x45,0x87,0xa3,0x6a,0x51,0x25,0x43,0x54,0xa2,0x92,0xc6,0xbe,0xa4,0x33,0x54,0x82,0xc7,0xf1,0xe4,0x52,0xf9,0x09,0xac,0xc3,0xb1,0x25,0x86,0xc7,0x89,0x83,0x2c,0xf6,0x35,0x9e,0xd1,0xd8,0xb1,0x71,0xed,0xfa,0xae,0x09,0x83,0xb3,0xf0,0xde,0x24,0xed,0x3c +.byte 0xc6,0x60,0xe8,0x15,0x49,0x93,0x29,0x82,0xbf,0x1d,0x23,0x17,0x11,0xea,0xa7,0x53,0x83,0xa5,0xc1,0x9e,0x02,0x17,0x08,0x99,0xa6,0x72,0xaf,0x82,0x3f,0x0b,0x69,0xca,0xb8,0x72,0xa9,0x31,0x71,0x20,0x32,0x57,0x89,0x9b,0x16,0x92,0x54,0xc0,0x99,0x6d,0xa4,0xbf,0x5a,0xb5,0x53,0xa7,0x4c,0x69,0xd8,0xf7,0xe7,0x4c,0xc0,0x76,0xb6,0x35 +.byte 0xdd,0xe7,0xb2,0xd9,0x1c,0xd5,0xf7,0x39,0x32,0x44,0x48,0x02,0x85,0x69,0x02,0xad,0xe6,0xfc,0xbb,0x07,0x9e,0x7f,0xee,0x6d,0x07,0x12,0x21,0xeb,0x67,0x4d,0x74,0x90,0x8f,0x79,0x51,0x9d,0x8a,0x63,0x24,0xab,0x6f,0x8f,0x73,0xd3,0x91,0x68,0x15,0xa9,0x6a,0x84,0x92,0xc2,0xd4,0x4d,0xa8,0xe1,0x4f,0xa2,0x1e,0x34,0xa3,0x9a,0x04,0xf2 +.byte 0xfc,0xc4,0xe7,0xd0,0x52,0xc4,0x49,0x51,0x8e,0x7d,0xaa,0x74,0xaa,0x08,0xbe,0x08,0xf6,0xe4,0xc1,0x61,0xff,0x2e,0x9c,0x17,0x61,0xb6,0x01,0x44,0x18,0xe8,0x5e,0xa9,0xfb,0x02,0x21,0xbb,0x08,0x5c,0xe0,0xd3,0x0c,0x98,0xc5,0x93,0x2a,0x1c,0x69,0xf3,0xe8,0x8b,0x36,0xa0,0x9d,0x1e,0xda,0x18,0x14,0x06,0x7f,0x75,0x3d,0x42,0x92,0x5a +.byte 0xb9,0xb7,0xc0,0xc0,0xb0,0xc5,0xa9,0xb2,0x67,0x24,0xc2,0x28,0x29,0xcb,0x78,0x8e,0xf3,0xd1,0x37,0x63,0xca,0xc8,0x9a,0x1b,0x38,0xa5,0x9f,0x0e,0x0d,0x26,0x5b,0xfe,0x2f,0xdf,0x4f,0xb9,0x21,0x8c,0xc8,0xe0,0x9f,0x71,0xb9,0xc3,0x6c,0xd8,0xd3,0x2f,0xe4,0x3c,0x67,0x35,0x45,0x74,0x7f,0xcb,0x13,0xda,0x64,0x47,0xff,0x6f,0x05,0xf0 +.byte 0x87,0x8d,0x0d,0x1f,0x10,0x47,0x0e,0xf6,0x9d,0x89,0x6d,0x79,0x04,0x77,0x8a,0x6c,0xeb,0x7d,0x9b,0xd7,0x65,0x82,0xa8,0x95,0xa2,0x8c,0x02,0x91,0x0d,0xf2,0xe8,0x65,0x60,0x0d,0xb6,0x1d,0xf4,0xf3,0x41,0x75,0x33,0x21,0x13,0x22,0x93,0x01,0x2f,0x11,0xe7,0xed,0x45,0x56,0x90,0xec,0x0b,0x99,0x8e,0x84,0xc8,0x76,0x31,0x1d,0xb9,0xcb +.byte 0x87,0x3f,0x5f,0x39,0xeb,0xe8,0x9e,0x5e,0x96,0x9e,0x42,0x64,0xf3,0xef,0x00,0x1f,0x2a,0x6c,0x18,0x67,0xbd,0xdd,0xf9,0x65,0x11,0x1b,0x9c,0xd7,0xf3,0x3d,0xb2,0x6f,0x88,0xf7,0xd2,0x26,0x06,0xef,0xc8,0x23,0x3f,0x46,0x5d,0xf0,0x96,0x40,0xb1,0xdd,0xad,0xe4,0xee,0xb6,0xc2,0x67,0x18,0x46,0x67,0xc4,0xa5,0x7e,0x3e,0xce,0x72,0x47 +.byte 0xca,0xc3,0xa7,0x94,0x56,0xe2,0x23,0x03,0xcf,0xd0,0x18,0x55,0x30,0xe3,0x14,0x00,0xda,0x0f,0xaa,0x7f,0x20,0xaf,0x3b,0x24,0x43,0x7a,0xaa,0xd4,0x12,0x42,0x10,0xe4,0x44,0x8a,0x7f,0xf1,0x74,0x9d,0xe0,0x28,0x60,0xce,0xdd,0x04,0x96,0x03,0x80,0xcb,0xaa,0xa9,0xb5,0xc7,0xb4,0xbb,0xc7,0x9a,0x93,0xd8,0xff,0x3b,0x8f,0x1f,0xb7,0xce +.byte 0xed,0xbc,0xde,0x9f,0x9e,0x56,0x96,0x65,0xba,0xe7,0x89,0x03,0xb2,0xbd,0xfe,0xa7,0x02,0xeb,0x33,0x9a,0x8b,0x5b,0x36,0x64,0x17,0x9f,0xd2,0xe4,0x75,0xb5,0xfb,0x21,0x03,0xa4,0xe7,0xb4,0x49,0x72,0xfd,0xf3,0x1e,0x5f,0xdb,0xe5,0x6c,0x92,0x51,0xe7,0x91,0x55,0xb7,0x82,0x18,0x05,0xc3,0x2c,0xf1,0x23,0x61,0x36,0xad,0x80,0x1b,0xde +.byte 0xe1,0x51,0x4e,0x51,0xa1,0xf6,0x5a,0xb9,0x03,0x48,0xa7,0x12,0x88,0x63,0x30,0xff,0x48,0xfc,0x92,0x30,0x9a,0xca,0x08,0x1b,0x64,0xa9,0x74,0x2a,0x64,0x42,0x7d,0xa9,0xa4,0x9d,0xcb,0x59,0x71,0x53,0xc1,0xa8,0xa6,0xb5,0x47,0xf9,0x87,0xb5,0x41,0x58,0x92,0x14,0xf7,0xbd,0x10,0x45,0x37,0x20,0x1d,0x5b,0x42,0x04,0xed,0x69,0x4c,0xa5 +.byte 0xdc,0x2a,0x58,0xba,0x00,0x1e,0x05,0x9c,0x3c,0xbf,0x65,0x76,0xd1,0x11,0xe0,0x15,0x22,0xb0,0x2a,0x53,0x32,0x0f,0x6e,0x08,0x4e,0x27,0xc2,0x71,0x14,0x20,0xee,0xb0,0x0b,0x60,0xef,0x54,0xae,0x2c,0xe0,0x1d,0x30,0xac,0x0d,0x3a,0x93,0x15,0x0a,0xe7,0x14,0xf3,0x1a,0x67,0xb1,0x43,0x85,0xbd,0x06,0x53,0xab,0x6d,0x5d,0xe7,0xe3,0x82 +.byte 0xb8,0x39,0x35,0x10,0x87,0xe7,0x90,0x4d,0x9c,0x6f,0x83,0xad,0xa2,0x43,0x7a,0x5d,0xc1,0x8a,0x39,0xa3,0xa6,0xda,0x48,0x5c,0x9b,0xe1,0x0d,0x69,0xfc,0x87,0x18,0xdd,0x34,0x9a,0xb4,0x9c,0x04,0x0d,0x49,0x18,0x3e,0x38,0xd8,0x01,0x67,0xb1,0x7f,0x6b,0xb5,0xfe,0x58,0x1c,0x64,0x11,0x10,0x6b,0xc1,0xca,0x56,0xe3,0x12,0x8c,0xb4,0xac +.byte 0x03,0xbd,0xc1,0x54,0xbe,0x5c,0x70,0x6f,0xdd,0x73,0xa3,0x84,0xcd,0x0b,0x1b,0xbf,0x05,0xac,0x27,0x11,0xe8,0x5f,0xc3,0xb9,0x68,0xc2,0xe9,0x3f,0x5a,0x9b,0x28,0xca,0x65,0x5e,0x66,0x4e,0x50,0xa9,0x81,0xb1,0x10,0xc1,0x2c,0xa5,0x62,0xc8,0x52,0x07,0xa5,0xa1,0x99,0x16,0x7b,0x08,0xa4,0x1e,0xf4,0x50,0x8f,0xb2,0x42,0xa5,0x19,0xa2 +.byte 0x34,0x91,0xcf,0xa7,0x5e,0x73,0x6b,0xc2,0xa3,0x4d,0xdd,0x7c,0x26,0x46,0x34,0xe6,0x5d,0x54,0x52,0xe3,0x1e,0xc1,0x10,0x36,0x7c,0xc9,0xd2,0x1e,0xca,0xeb,0x80,0xc5,0x3c,0x04,0xf6,0xb7,0x09,0xd4,0x3e,0x67,0xc3,0xf6,0x6b,0xd4,0x60,0x00,0xc9,0x68,0x17,0x39,0xbc,0xcd,0x14,0x32,0xfc,0x33,0xa4,0xb0,0x6f,0x12,0x6b,0x5f,0xe2,0x15 +.byte 0x1c,0x9a,0x15,0x4f,0x0b,0x7d,0x4c,0xa0,0x89,0x40,0xb3,0x0e,0x84,0x90,0xb3,0xc6,0x3e,0xa5,0x0b,0x81,0x66,0x14,0x5f,0x8d,0xe0,0xbf,0xf7,0x9d,0xa4,0x4e,0x69,0xd5,0xac,0x0f,0x6c,0x29,0x94,0x8f,0x3b,0x4b,0xed,0x5b,0x6e,0xe1,0x58,0x5d,0x32,0x19,0xe6,0xbd,0xfb,0xd5,0xb7,0x0f,0x72,0x0e,0x5b,0x14,0xd3,0xf3,0x09,0xa8,0xea,0xf7 +.byte 0x98,0x2f,0x42,0x07,0x8e,0x72,0x27,0x53,0x8d,0x0b,0xea,0x74,0x38,0xbc,0xaf,0xb8,0x76,0x65,0x97,0xda,0xa7,0x06,0x37,0x29,0x09,0xbe,0xaa,0xe6,0xf7,0xb6,0xb1,0x5f,0x71,0x1f,0x5d,0x14,0x47,0xdf,0x20,0xa3,0x94,0x93,0x7d,0x21,0xe6,0x22,0x7e,0x38,0x1a,0x26,0x83,0xc7,0x32,0xdf,0x58,0xcd,0xab,0x67,0xae,0x94,0xa5,0x68,0xcb,0xe3 +.byte 0x51,0x70,0xc0,0xc4,0x41,0x9f,0xca,0x05,0xc9,0x51,0x2a,0x8e,0x53,0x89,0x3f,0x52,0x6b,0x29,0x64,0xa8,0xb8,0xdf,0x02,0xb1,0x41,0x4e,0x36,0x42,0x32,0xa8,0xc0,0x91,0xf0,0x69,0x69,0x55,0x99,0xb7,0x78,0x4f,0x79,0x5b,0xc5,0xab,0xc6,0xed,0x15,0x88,0x6b,0x94,0x0a,0xdd,0xea,0x47,0xf9,0x0e,0xb8,0x89,0x15,0x68,0x3e,0xc0,0x50,0xf8 +.byte 0xa1,0x2d,0x2a,0x11,0x8a,0xc5,0xb0,0x09,0x4f,0x7d,0x90,0x5f,0x49,0x35,0xe9,0xdd,0xfc,0xac,0xea,0x1b,0x20,0xad,0xd2,0xe6,0xb6,0xbf,0x3c,0x0e,0x7b,0xdf,0x2f,0x55,0x58,0x0e,0x25,0x53,0x62,0xd3,0x73,0xb8,0x3e,0x12,0x91,0xcb,0x23,0xf2,0xc0,0x5d,0x74,0x2b,0x51,0xcc,0xa2,0xb1,0x5a,0xd2,0xf4,0x9b,0xc9,0xa5,0x83,0x2b,0x5a,0x8a +.byte 0x0b,0xe9,0x09,0x59,0xb5,0x44,0xc9,0x55,0xcc,0xbd,0xb6,0x69,0x66,0x9a,0x0c,0x15,0xae,0x76,0x35,0xbe,0xe9,0x37,0x70,0x9e,0xdc,0x97,0x5a,0x82,0x97,0xf6,0x1a,0x45,0xd7,0x27,0xfe,0x1f,0xc3,0x7c,0x3a,0x52,0x85,0x12,0x73,0x8a,0x8e,0x07,0xec,0x1f,0x59,0x3f,0xb0,0x32,0x07,0x92,0x3e,0x81,0xe0,0x7a,0x9a,0xc9,0x91,0xca,0x84,0xf1 +.byte 0xe1,0x32,0x57,0x0a,0x3c,0x9a,0x20,0xa8,0xbe,0x84,0x91,0x44,0x66,0x81,0xdd,0x12,0xa8,0x46,0x15,0x18,0xfc,0xae,0x5e,0x9a,0xf3,0xd9,0xb9,0x6a,0xbb,0x90,0x1c,0x61,0x7f,0x61,0x2c,0xa7,0x12,0x1e,0x05,0xee,0x0c,0x66,0x9e,0xc2,0xc8,0xb9,0xe0,0xc9,0xc4,0xb9,0xee,0x3a,0x6f,0x97,0x2a,0x5e,0xcb,0xd9,0xff,0xd1,0x37,0x5e,0xa0,0x03 +.byte 0x70,0xc1,0x2f,0x15,0xf9,0xf7,0x90,0xbe,0x23,0xe7,0x7c,0x90,0x4b,0xe4,0x5a,0x01,0x65,0x27,0x2d,0x4b,0xd3,0xa8,0x8c,0x1d,0x2d,0x5d,0x48,0xac,0x6b,0x59,0xc9,0x78,0xb2,0xee,0xda,0x6e,0xa8,0x68,0x08,0x99,0x22,0x25,0xfe,0xc2,0xb8,0x83,0xa8,0x08,0xbb,0x6e,0x64,0xae,0x2e,0xbb,0x93,0xaf,0xdc,0xeb,0xa3,0x11,0xa7,0x5d,0x3f,0x22 +.byte 0xf1,0x95,0x27,0xf6,0xd6,0xa6,0xc3,0x56,0x0a,0xd0,0x17,0x43,0x35,0xd2,0xe7,0xa4,0x8f,0x6c,0x1c,0xc4,0x4d,0xa7,0x3b,0xb8,0x7f,0x0c,0xa0,0xd6,0x56,0x82,0xf4,0x16,0x96,0xcd,0xcf,0x6f,0x78,0xec,0xbb,0xb2,0xdb,0x67,0xcf,0x78,0x0c,0x22,0x1d,0x72,0x21,0x8e,0x40,0x85,0xa5,0x07,0x3b,0x0e,0xfa,0x44,0xb0,0xfe,0xbf,0x54,0x80,0x41 +.byte 0xdc,0xa7,0xc7,0xdb,0xaa,0x04,0x42,0x0d,0x42,0x03,0x17,0xc8,0x57,0xd7,0x08,0x34,0x37,0xf5,0x9a,0x90,0x30,0x43,0x54,0x5b,0x58,0x50,0x4e,0xc4,0x56,0x57,0xff,0xf0,0x05,0x82,0xca,0x2e,0x20,0xb0,0xbd,0xd0,0x00,0x7d,0x60,0x3f,0xdb,0x9c,0x08,0x7e,0x21,0x63,0xbc,0x89,0xbf,0xcb,0xcc,0x36,0xb5,0x36,0x41,0xb4,0x9c,0x5c,0x9d,0xa6 +.byte 0x74,0xa4,0x4f,0x6a,0xcb,0x63,0x51,0xb1,0x92,0xa0,0x03,0x9b,0x88,0x03,0xd5,0x82,0x30,0xfb,0x69,0x49,0x20,0xb0,0x37,0x50,0xe4,0x02,0x9e,0x11,0x09,0x20,0x1a,0x41,0x8d,0xdd,0xa0,0x18,0xb4,0x74,0x04,0x1e,0x3a,0xea,0xb4,0x28,0x01,0x7f,0x0b,0x73,0x27,0x5f,0x76,0x2e,0x71,0xfa,0x50,0x1b,0x43,0x8d,0x0d,0x6c,0x87,0xc3,0x10,0x7b +.byte 0x42,0x7d,0x17,0xa6,0x00,0x5b,0x83,0x6c,0x7b,0x7f,0x72,0xd8,0x90,0x4d,0x7f,0x54,0x72,0x17,0x21,0xe4,0x45,0x74,0x20,0x53,0x30,0x46,0x90,0xbf,0x2f,0xac,0x01,0xbd,0x40,0xa9,0xc5,0xbe,0xbd,0x9b,0x59,0x62,0x03,0x30,0x80,0xe3,0x8e,0x23,0x7b,0x2d,0x63,0x4f,0x30,0xe3,0xb8,0x56,0x87,0x57,0x43,0xdc,0x6a,0x3c,0x13,0xed,0x93,0xc9 +.byte 0x1a,0x1b,0xea,0x38,0x67,0x33,0x7f,0x11,0x5c,0x96,0x20,0x4d,0xf6,0x82,0x51,0x45,0xca,0x20,0xfd,0x59,0xef,0x4c,0xb4,0xb0,0xb2,0x0f,0xdb,0x4c,0x00,0x7a,0x18,0x58,0xb0,0xd3,0x65,0x73,0x42,0xe5,0x05,0x76,0xd7,0xa2,0x1e,0x9f,0x59,0xc0,0xd0,0x76,0x29,0x1b,0x12,0x29,0x9b,0xe4,0x7d,0x45,0x13,0xb4,0x57,0xf2,0x0b,0xd1,0xb5,0x60 +.byte 0x6d,0x15,0x0b,0xca,0x5e,0xe4,0x80,0xda,0x56,0x95,0x41,0x18,0x54,0xa7,0xad,0x40,0xe5,0xd7,0xa7,0x3e,0xf7,0x73,0x40,0x70,0xb3,0x23,0xdb,0x22,0x62,0xc7,0x44,0xfb,0x64,0x18,0x18,0x05,0x84,0x07,0x68,0x06,0x7f,0xb9,0xc3,0xf9,0x55,0xe2,0x0d,0x37,0x51,0x34,0xc3,0x55,0x3c,0x29,0x5d,0x1d,0x27,0x77,0xd3,0xe1,0x6a,0x60,0x9f,0x10 +.byte 0xef,0xb1,0x93,0xbf,0x2a,0xb7,0xe8,0x42,0x4d,0xfd,0xa9,0xa9,0x2f,0xb6,0x07,0x5b,0xe8,0xf7,0xd7,0x10,0x47,0x71,0x56,0xba,0x11,0x11,0x32,0xc4,0x22,0xf4,0x12,0x6f,0xc3,0xef,0x81,0xc5,0x82,0xb4,0x1b,0x99,0xbb,0x1a,0x63,0x6b,0x3a,0x70,0x4f,0xec,0x2c,0xf9,0xde,0x1a,0x2e,0x62,0x27,0x1c,0x81,0x21,0x30,0x08,0x30,0xf6,0xf5,0xc1 +.byte 0x6d,0x0b,0xeb,0x34,0xd9,0x3a,0xa2,0xa2,0xc6,0x17,0x60,0x85,0x65,0x43,0xd6,0x3d,0x71,0xac,0xc2,0xaf,0x2b,0x9e,0x62,0xf2,0x08,0x47,0x6f,0x42,0xa8,0x21,0xad,0x42,0x98,0xa0,0xef,0xdf,0xd8,0xda,0x10,0xad,0xf7,0xe5,0xf9,0x22,0x89,0x44,0xbf,0x86,0x86,0x2b,0x02,0xd1,0x9e,0x8f,0xb7,0x10,0x63,0xb1,0xcc,0x40,0x6b,0xa3,0x8e,0x09 +.byte 0xb8,0xe3,0x77,0x3c,0xde,0x36,0x7a,0xb7,0x78,0x4f,0x99,0x5d,0x9a,0x9e,0x19,0x2d,0xb5,0xd9,0x9c,0x95,0x1f,0xa1,0xcc,0x61,0x31,0x1c,0x96,0xe5,0xca,0xeb,0x26,0x34,0xa4,0x63,0x5c,0x7c,0x0f,0x23,0xd1,0xe1,0x09,0xf4,0xab,0xf6,0x73,0x2f,0x8a,0x62,0xf0,0xd3,0x8c,0x44,0xe5,0xe9,0x9d,0x58,0x71,0xfa,0xf5,0x39,0xa5,0x6f,0xf7,0x04 +.byte 0x43,0x0a,0x78,0x54,0xfb,0xa7,0x66,0x57,0x1f,0x61,0xd6,0xda,0xff,0x4f,0x32,0x9d,0x80,0x6b,0x77,0xed,0xda,0xaf,0xbc,0x9e,0xea,0x77,0x04,0xf3,0x47,0x96,0xd1,0x44,0x8e,0xca,0xfe,0xb0,0xa3,0xa6,0x1d,0x8d,0xa4,0xb5,0x8c,0x35,0x28,0xf3,0xaa,0xab,0x28,0x1e,0xc9,0x94,0x12,0x07,0xc6,0xea,0x23,0xf9,0x69,0xc3,0x14,0x27,0xcc,0x55 +.byte 0x27,0x0b,0x27,0x64,0x23,0x38,0x05,0xd9,0xb4,0xf7,0x00,0xf3,0x02,0xae,0xc8,0x5a,0xbd,0x2f,0x20,0xd5,0x45,0xa6,0x09,0x6f,0x1a,0x09,0xb7,0xe7,0x6f,0xf6,0xa6,0x6f,0xc7,0x03,0x4e,0xa3,0x72,0xb5,0xfc,0x17,0xcf,0x1e,0x64,0x8b,0xc4,0xa2,0xba,0x83,0x0e,0x2a,0x11,0xba,0x71,0xe0,0x1c,0x9f,0x70,0x6e,0xf4,0xd9,0x47,0x31,0xf7,0xaf +.byte 0xf7,0x1a,0xe7,0xc1,0xe9,0x66,0xa4,0x48,0xd4,0x25,0x8b,0xf7,0x6f,0x33,0x72,0xff,0x93,0x2e,0xcd,0xc7,0xae,0x3b,0x71,0x3f,0x84,0x7f,0xe6,0xb5,0x58,0x4f,0x95,0x34,0xe7,0x89,0x10,0xd3,0x2b,0x5c,0x30,0x9b,0xd3,0xef,0x98,0xf3,0x33,0x0e,0x6d,0x5f,0x7e,0xba,0x55,0x7a,0xb6,0xf3,0xb6,0xcd,0xa8,0x10,0x68,0x85,0x6f,0xea,0x54,0xc3 +.byte 0x66,0x51,0x5a,0xfc,0x11,0x83,0x9e,0x68,0x95,0xdb,0xec,0x74,0xf0,0x86,0x4a,0x90,0x24,0x66,0xf2,0x61,0x40,0x2e,0x3b,0x53,0xea,0xc1,0x3e,0x1c,0x69,0xaf,0x5f,0x04,0xb5,0xbd,0x3d,0x44,0x1c,0xc6,0x49,0x65,0xf6,0x78,0xfd,0x69,0x49,0x95,0x96,0xa1,0xa0,0xa9,0x78,0x1a,0xf6,0x0f,0xe9,0x52,0x93,0x9c,0x96,0x6c,0x5e,0x67,0x63,0x2d +.byte 0x18,0x22,0x2a,0xcc,0x7f,0x2f,0xd3,0x72,0x82,0x98,0xae,0xb0,0x2b,0xa6,0x96,0x41,0x25,0x47,0x3c,0x92,0xc5,0x0f,0x2c,0xd4,0x43,0x09,0x0b,0x94,0x73,0x73,0x29,0xc2,0x8a,0xa3,0xcc,0x8d,0xed,0x40,0x6d,0x40,0x18,0x7c,0x32,0x1e,0xe1,0x4e,0x26,0xa7,0xa4,0xd5,0xcb,0xfa,0x90,0xba,0xb2,0x04,0x1d,0x5d,0xbe,0x32,0x6c,0x71,0x09,0x51 +.byte 0xdb,0xe3,0xb0,0xe1,0x34,0x74,0xa3,0x2b,0xf2,0xcb,0x9e,0xc0,0xae,0x88,0x40,0x90,0xb6,0x22,0xc8,0xac,0xff,0x45,0xc6,0xfa,0xce,0x0f,0x03,0x9d,0xc0,0xb2,0x2e,0xdb,0x1e,0x6c,0xa5,0xbe,0xb5,0xb3,0xaa,0xd5,0x2d,0x06,0x4d,0x29,0xa3,0xbe,0x25,0x5f,0x21,0x42,0x8d,0x27,0xaa,0x6f,0x59,0x88,0x61,0x4d,0x72,0x9f,0x64,0xfc,0x07,0xaf +.byte 0xeb,0x02,0x5e,0xb9,0x1f,0xfe,0x1a,0x67,0x10,0x35,0xe9,0x9f,0x5f,0x9c,0x8d,0x4a,0xb3,0x10,0x99,0x8d,0x5b,0x9c,0x8b,0x8a,0x0c,0x02,0x8b,0x44,0x1a,0xaa,0xe7,0x14,0x05,0x3d,0x9e,0x62,0xfc,0x76,0x49,0x56,0x46,0xae,0xcc,0x0e,0x47,0x58,0x4d,0x94,0x33,0x4d,0x23,0x24,0x44,0x52,0x2e,0x18,0xf7,0x53,0x6b,0x24,0x67,0xb8,0x88,0x46 +.byte 0x70,0xc8,0xcb,0x60,0xac,0x70,0x85,0xdd,0x00,0xa1,0x5d,0xbb,0x94,0x07,0x0a,0xb6,0x1c,0x88,0x59,0xa7,0x88,0x7e,0x1e,0xc9,0x1d,0x7c,0xa0,0x1c,0xad,0xe4,0xa5,0x36,0xa5,0x35,0xe8,0xda,0x27,0x15,0xbc,0x7b,0x1e,0x8a,0x33,0x74,0x4b,0xc1,0xc7,0x9d,0xa9,0x21,0x98,0x02,0xe5,0xf4,0x8b,0x8e,0x2d,0x64,0x81,0xea,0xa6,0xbe,0xe2,0x05 +.byte 0x16,0xba,0xac,0x75,0x79,0xa4,0xc0,0xd3,0x9d,0xe0,0x25,0x63,0x22,0xb3,0x9c,0xee,0x04,0x8f,0x60,0xab,0x52,0x43,0x05,0x16,0xd4,0xb3,0x88,0xe8,0x68,0xc3,0x81,0x94,0xc4,0xee,0x13,0xaf,0xdd,0x36,0x23,0xe6,0x78,0xc9,0xf6,0x42,0xf0,0xf7,0x89,0x64,0x79,0x13,0xe8,0xed,0x50,0x03,0x16,0x78,0x6d,0xf4,0xdf,0x85,0x2e,0x4e,0x8f,0x2c +.byte 0x5b,0xfe,0x4c,0xf2,0x49,0xde,0xf2,0xa4,0x96,0xe0,0x8a,0x25,0xc8,0x6d,0x22,0xff,0xab,0xfc,0x18,0xe8,0x7f,0xd5,0xc1,0x7e,0x44,0x8e,0x21,0xb4,0xc8,0x79,0xc0,0x55,0xaa,0xb7,0x28,0xa1,0x3a,0xbd,0xc2,0x1d,0xf8,0x87,0xf9,0x35,0x30,0x25,0xb2,0xaa,0x8f,0x3c,0x0d,0x64,0xf2,0xd1,0xa0,0x51,0xbf,0x9b,0x9a,0x9a,0x9c,0x18,0x43,0xea +.byte 0xd2,0x54,0x50,0xe0,0xca,0x1a,0x29,0x16,0x9f,0x49,0x47,0x56,0x65,0x21,0x0f,0xb0,0x53,0x41,0xe3,0xec,0xe0,0x15,0xcb,0xd0,0x61,0x05,0x67,0xd6,0x02,0x1a,0x31,0x80,0xa4,0x9f,0xf5,0x9b,0x28,0xcd,0x43,0xd5,0x70,0x05,0x67,0xe8,0x76,0xb7,0x99,0x98,0x0a,0xd6,0x27,0xe9,0xfb,0x62,0xff,0x66,0x47,0xf7,0xbe,0x5e,0x35,0xa0,0x3b,0x56 +.byte 0x58,0x78,0x9b,0x9c,0x5b,0x9f,0xf5,0x6b,0x1a,0x6a,0xfd,0x8e,0xe3,0xd9,0xa2,0x8b,0x2e,0xef,0xc7,0xd3,0x74,0xb1,0xea,0x6a,0x03,0x8b,0xe2,0x78,0xbe,0xf1,0x75,0x7f,0x02,0x03,0xbc,0xd3,0x15,0x2c,0x87,0x01,0x95,0xa6,0x87,0x2d,0xf8,0x63,0xfe,0x33,0x8f,0xc5,0xc9,0x0a,0x06,0x79,0x93,0x46,0xd7,0x0b,0x61,0x06,0x68,0xae,0x9b,0x46 +.byte 0x6f,0x9e,0x1b,0x21,0x58,0xc1,0x72,0xa9,0x05,0xa7,0xaa,0x88,0xee,0xed,0x8d,0x7f,0x55,0x3b,0xb8,0xb8,0xf8,0x42,0x26,0x4a,0x78,0xe3,0x17,0xe8,0xac,0xb3,0xdb,0x9b,0x90,0x7d,0x8d,0x65,0x00,0x39,0x40,0xc2,0xe2,0x9c,0xc6,0x16,0x35,0x54,0x64,0x09,0xc8,0xc7,0x08,0x77,0x90,0x9d,0xb4,0xd4,0xe1,0x36,0xd4,0x5e,0x63,0xb0,0xba,0x81 +.byte 0x0c,0x4e,0x24,0x20,0xc0,0x7f,0xfc,0x02,0x3d,0x83,0x60,0x8a,0xf5,0xff,0x87,0x60,0x9c,0xd5,0xc0,0x94,0x64,0xe2,0x3f,0xeb,0x9a,0xe5,0xb6,0x50,0x13,0x36,0xf4,0x96,0x5d,0xf4,0xb5,0xab,0xa4,0x28,0x17,0x38,0x7f,0xca,0xf7,0x0c,0xcf,0xae,0xf8,0xef,0x41,0x6d,0x9c,0xa1,0x53,0x33,0xcb,0x8d,0x21,0xab,0x3a,0x8c,0x72,0x8d,0xf3,0xf2 +.byte 0x05,0x69,0xf5,0xe8,0x6b,0x5b,0x42,0x85,0xb1,0x2e,0x6f,0xf8,0x62,0x00,0x1c,0x48,0x6c,0x85,0x72,0x93,0x34,0x67,0x80,0xe7,0x2a,0xfe,0xcf,0x54,0xc6,0x94,0xf2,0x5a,0x48,0xab,0x40,0x52,0x66,0x7d,0x7a,0x75,0x68,0x77,0xfd,0xb2,0xdd,0xb1,0xdb,0x72,0x50,0x31,0x53,0x24,0xbd,0xb0,0x6e,0x1f,0xbd,0xa6,0x90,0x67,0x07,0x1d,0x31,0xf3 +.byte 0x8c,0x82,0xf7,0x53,0x85,0x54,0x64,0x7c,0x76,0x7b,0x5f,0xaa,0xe0,0xe0,0x36,0xa4,0x13,0xb3,0x0b,0x99,0x09,0xfe,0xed,0xbb,0x81,0x4b,0xb3,0x16,0x45,0x2e,0x3a,0xfe,0x60,0x9c,0xdc,0xcb,0x00,0x5a,0x41,0xc4,0x80,0x3c,0x9d,0x15,0x05,0xfa,0x5e,0x37,0x64,0x89,0x9c,0x2d,0xb8,0xf7,0xbc,0x35,0x8c,0x49,0xfe,0x0a,0x43,0x1a,0x59,0xaf +.byte 0x1e,0x50,0x08,0x0f,0x2d,0xb8,0x5d,0x63,0x7f,0x95,0x6a,0xe6,0xad,0x88,0xc3,0xac,0x05,0x14,0x44,0xb0,0x70,0x83,0x5f,0x94,0x45,0x3d,0xe5,0xbd,0xb8,0x92,0x28,0x20,0xd5,0xa0,0x83,0xd2,0xe2,0x41,0x71,0x27,0x29,0x1b,0x2a,0x3a,0x08,0xca,0x75,0xec,0x16,0x4a,0xcf,0x39,0xed,0xbe,0x2a,0x26,0x9b,0xa3,0x26,0xc6,0x89,0xf2,0xc6,0x8d +.byte 0x49,0x3a,0xfe,0xda,0x16,0x54,0x55,0x7e,0x7f,0x65,0x65,0xd2,0x16,0xdd,0xe2,0xa3,0x86,0x7a,0x69,0x82,0x99,0x58,0x45,0x16,0x4c,0x69,0xff,0x72,0xf2,0xbc,0xbb,0xdd,0xe1,0xb4,0x56,0xcf,0xc0,0x84,0xd6,0x2c,0xd8,0xce,0xf4,0x67,0xd8,0x1d,0xb7,0x77,0x6d,0x96,0xf4,0x28,0x7a,0x33,0x03,0x97,0x72,0x37,0xd9,0x35,0xcf,0x20,0x28,0xc2 +.byte 0xc4,0xea,0xf9,0x99,0x89,0xe0,0xcc,0x3d,0xec,0x2c,0xbf,0x06,0x78,0x91,0x1b,0x55,0x1b,0x51,0x9b,0xbe,0xf7,0x4a,0xf8,0x9f,0x46,0xab,0xee,0x5d,0x4e,0x29,0x36,0xf3,0xb9,0xa7,0x85,0x9b,0xf7,0xa1,0x9e,0x2a,0xbb,0xb3,0x0a,0x61,0xb5,0x0f,0x79,0xf4,0xe2,0xd2,0x2c,0x15,0xf7,0x4f,0xca,0xa9,0x46,0x25,0x1c,0xdc,0xfa,0x0f,0x9e,0xfa +.byte 0xf5,0xb8,0x54,0x7a,0xe3,0x98,0x3c,0x3b,0x85,0xf8,0xb3,0x7c,0x70,0x40,0x86,0x2a,0x66,0xd1,0x4d,0x83,0x38,0xc2,0x24,0x8e,0x30,0xc0,0x9e,0x54,0x4c,0x7a,0x62,0x9a,0x55,0x8e,0x11,0x02,0xef,0x30,0x08,0x5c,0xf3,0x57,0xa7,0xbe,0x32,0x04,0xab,0xb1,0x3a,0x51,0x6e,0xcd,0x6f,0xc1,0xd8,0xd0,0x7d,0x4f,0x1b,0xa9,0x1e,0x12,0x92,0x94 +.byte 0xd7,0x40,0xa9,0x99,0x70,0x06,0xcb,0x46,0xa5,0xe0,0x77,0xbe,0x6d,0x48,0xab,0x67,0x4e,0xa7,0x0e,0xfe,0x1f,0x53,0x24,0xbc,0x89,0xcb,0x70,0xac,0x05,0xa2,0xf4,0xa3,0x44,0xde,0xcb,0x18,0x95,0x78,0x70,0x0f,0x69,0xf0,0x5e,0xbd,0xe7,0xfc,0xd3,0x17,0x3e,0x18,0xb0,0x2f,0xa6,0xfe,0x82,0x81,0xe7,0x74,0x44,0xfb,0x43,0x5e,0xda,0xf4 +.byte 0xfb,0xfe,0x5c,0xb4,0x3c,0x1d,0xea,0x0d,0x2d,0xdb,0xee,0x1f,0xc5,0xbd,0xb2,0xa0,0x52,0x76,0x9e,0xad,0xfa,0x19,0x37,0xb0,0x15,0x53,0x82,0x25,0x86,0xd9,0xce,0x99,0x84,0x67,0x5f,0x57,0xb2,0x6f,0x99,0xa4,0x56,0xb5,0x01,0x4f,0xdf,0xa2,0xca,0x8c,0x23,0x51,0xd3,0xc7,0x72,0x9b,0x90,0x72,0x29,0x0c,0xca,0x86,0xff,0xc3,0xd9,0x9e +.byte 0x87,0xe4,0x8d,0xc6,0xac,0xba,0xfb,0x73,0xa9,0xcd,0x5d,0x16,0xfc,0x12,0xea,0x30,0xd5,0x7d,0x7b,0x16,0xa6,0x2c,0xeb,0x3c,0x3e,0x46,0x7c,0xee,0x03,0xd6,0x7a,0xe8,0x88,0x1c,0x17,0xa9,0x08,0xe9,0xd5,0x38,0x59,0x54,0x0b,0xb0,0x77,0x1b,0x76,0x09,0x53,0xca,0x38,0x12,0xd1,0xb5,0x2c,0xe3,0xd6,0xa0,0xca,0x9f,0x65,0x56,0xea,0x95 +.byte 0xab,0xc1,0xf4,0x98,0xaf,0x1a,0xe7,0x2b,0x1e,0x8d,0x75,0x43,0x43,0x9f,0x42,0x5c,0x2c,0xa5,0xd7,0x9a,0xcd,0xc2,0xab,0xd9,0x1f,0x1f,0xde,0x8a,0x3e,0xf8,0x0f,0x56,0x8a,0x01,0xde,0x47,0x41,0xd8,0xa0,0xc8,0x32,0x4d,0xa3,0x75,0x80,0x87,0xb1,0x1e,0x05,0x06,0x5e,0x2c,0x9a,0x7b,0xd3,0x22,0xe0,0x53,0x8f,0x4f,0x35,0x5f,0x46,0x3a +.byte 0xb2,0xfe,0x62,0x44,0x54,0x38,0xe0,0x03,0x5e,0xda,0xcb,0x86,0xdf,0xda,0x67,0x66,0x40,0x27,0x97,0xf0,0xc2,0xbd,0xce,0xce,0x37,0xeb,0x47,0xe2,0x56,0x7e,0x54,0xe9,0x51,0xda,0xec,0xd5,0xe6,0xc1,0x69,0x6e,0x4c,0x3d,0x92,0xdc,0xa0,0x51,0xe2,0x2b,0xb8,0x96,0xb6,0xce,0xdf,0x35,0xdb,0xd0,0xd4,0x42,0xe3,0x94,0x89,0x09,0x1b,0xb4 +.byte 0xe2,0x8f,0xfb,0x23,0x62,0x35,0x56,0xc7,0x94,0x40,0xd7,0x2d,0xdb,0x80,0xc9,0xbd,0x4d,0xe3,0x14,0x30,0x44,0x43,0xad,0xeb,0x3d,0x89,0xe9,0x61,0xd7,0x80,0x15,0x59,0xcd,0xda,0x38,0x11,0x3b,0x84,0x14,0x85,0xef,0x55,0xf2,0x01,0x2c,0xed,0x74,0xf5,0x71,0x75,0x0c,0x52,0x0c,0x41,0x86,0xbe,0x84,0xc5,0x89,0x8b,0xa5,0x6d,0xc3,0xfa +.byte 0x2b,0xe5,0xe7,0xe8,0xdd,0xf9,0xe8,0x27,0x08,0x5d,0xdf,0x61,0xdc,0xb2,0xe0,0x8c,0xe8,0xda,0xa8,0x68,0x22,0x51,0x6b,0xdf,0xd0,0x92,0x87,0x6a,0x43,0xff,0xd1,0x9d,0x9a,0x4c,0x03,0xdf,0x3e,0xc1,0x31,0x33,0x6e,0x2a,0x55,0xc1,0x58,0x59,0x69,0x66,0x05,0xd1,0xa7,0xa1,0x3b,0x98,0x1d,0x44,0x74,0xc7,0x7e,0xc0,0x07,0xd9,0x9c,0x87 +.byte 0x5f,0xc3,0x44,0x25,0x7b,0x96,0xbc,0x20,0x5d,0x14,0x08,0x34,0xe9,0xad,0x34,0xa3,0xc3,0x95,0x1a,0xc1,0xd1,0x37,0x43,0x49,0x66,0xff,0x39,0x70,0x27,0xa0,0x2b,0x39,0x9d,0x1b,0x78,0x52,0x55,0x77,0x30,0xe8,0x72,0x65,0x8a,0xc8,0xa4,0xe6,0xb7,0xd6,0x66,0x82,0xa7,0x1d,0xde,0x3e,0xc2,0x23,0x5a,0x8b,0x51,0xe4,0x44,0x03,0xf3,0x89 +.byte 0x10,0xb0,0x9a,0x09,0x5d,0xe3,0xe9,0x4a,0x0b,0xe3,0x86,0x58,0xf8,0xe3,0x1a,0x3f,0x7f,0x42,0xa5,0xd7,0xb0,0x24,0xb7,0xbc,0x1d,0x40,0xe7,0x2f,0x42,0x8c,0xa8,0x3c,0x33,0xee,0x9f,0xaf,0xd1,0x51,0x8e,0x34,0x82,0xc5,0x16,0xef,0xb1,0xa6,0xa8,0x0e,0xae,0xe6,0xc3,0x2f,0xb3,0x06,0xd4,0x4c,0xec,0xee,0x9e,0xff,0x88,0x82,0x4b,0xb8 +.byte 0xc5,0xef,0x94,0xe2,0x68,0x48,0x23,0xa2,0xc8,0xe4,0xdb,0x33,0xf9,0xee,0x73,0xc2,0xe6,0xa1,0x64,0xf9,0xf6,0xab,0x5a,0xdc,0xa5,0xb3,0xd8,0xae,0xf4,0x1f,0x47,0xfe,0xa0,0xee,0xf5,0xee,0x41,0x30,0xa6,0xbe,0x34,0x2c,0x1a,0x24,0x8a,0x80,0xb1,0x79,0x7e,0x2c,0xc0,0x65,0x68,0x46,0xae,0x0a,0x01,0x77,0xce,0xa2,0x5f,0xc3,0x00,0x8f +.byte 0xd4,0x0f,0xbe,0xbf,0x81,0x20,0x4e,0xb8,0x21,0x5f,0xfa,0xb2,0xf2,0x02,0x83,0x41,0xa8,0xf1,0xe8,0x2c,0x7e,0x0e,0xe6,0xf0,0x6e,0xd5,0x7b,0xcb,0x4e,0xed,0x06,0xc4,0x18,0xfb,0x0e,0x0d,0x8e,0x22,0x8a,0x40,0x4d,0x66,0xa5,0x0c,0x74,0xf3,0x9e,0xd9,0x90,0xf8,0x71,0xe4,0x92,0x05,0x3d,0x2d,0xa0,0xed,0x42,0x88,0x18,0x9a,0xc7,0xe4 +.byte 0x41,0x5d,0xde,0x44,0x2e,0x26,0x30,0xfe,0x51,0xa8,0x91,0xa3,0xa6,0xfd,0x3e,0x04,0x7f,0x3a,0xa9,0x1c,0x21,0x98,0xab,0xaa,0x39,0x9d,0xe4,0x51,0x75,0xeb,0x90,0x6b,0xab,0x11,0x89,0xa9,0x22,0xa8,0xc5,0x92,0x16,0x51,0xe1,0x77,0x09,0x53,0x7f,0xb6,0x80,0x4b,0xf5,0xf5,0xa2,0x0e,0x36,0x24,0x7f,0xe7,0xcc,0x67,0xfb,0x2c,0x6e,0xc2 +.byte 0x16,0x47,0x41,0xc2,0x77,0xf4,0xcf,0x49,0x37,0x17,0x67,0x34,0x14,0x92,0x7d,0x0f,0x14,0xe8,0x4b,0x4c,0xc3,0xbb,0x78,0xf7,0xa0,0x59,0xbe,0x06,0x10,0x38,0xe6,0x2c,0x08,0x15,0xba,0xc6,0x49,0x38,0x9a,0x91,0x2b,0x4d,0x82,0x42,0x0e,0xe4,0x02,0xef,0x2b,0xa2,0x06,0xcc,0x3a,0x3c,0xb9,0xc5,0xb5,0x71,0x1e,0x17,0x5d,0x65,0x35,0x91 +.byte 0x89,0x54,0x97,0xa8,0x7b,0x02,0x24,0xf9,0xdb,0xb5,0x52,0xf7,0xd0,0xa0,0x42,0x48,0x01,0xf4,0x47,0x7c,0x84,0x7c,0x8a,0xb4,0xf4,0x30,0xec,0xb9,0x21,0x44,0x87,0xb2,0x96,0xa4,0x3b,0x0d,0x93,0x26,0x09,0xc8,0xfa,0x28,0x6f,0x09,0xb7,0x03,0x85,0x66,0x21,0x2d,0xf1,0xaa,0x3f,0x0b,0x59,0x15,0xfe,0x8b,0x2b,0xe0,0x81,0x38,0x63,0x70 +.byte 0x09,0x37,0x38,0x62,0x04,0x8e,0x3f,0x23,0x65,0xf8,0xf7,0xc0,0x30,0xb8,0x04,0xb4,0x17,0xd7,0x21,0xcc,0x8b,0x31,0xd3,0x7b,0x11,0xea,0xc5,0x51,0x01,0x93,0x5f,0xe3,0xf3,0x1e,0x0d,0x41,0x52,0x2a,0xfd,0x27,0x02,0x00,0x58,0x0d,0x1f,0x16,0xd7,0x50,0x09,0xea,0x3f,0x9f,0x72,0xae,0x7a,0x79,0x4b,0x69,0x61,0xfc,0xac,0x5c,0x4d,0x6a +.byte 0x65,0x5d,0xa5,0x67,0x76,0xe4,0x24,0x3f,0xa0,0x6f,0xf6,0x60,0xd2,0x70,0x8e,0x2e,0xbe,0xf9,0x8b,0xab,0x22,0xc8,0x9c,0x5b,0x26,0xc5,0x75,0xeb,0x96,0xa2,0x4f,0xdf,0x6c,0x05,0x9a,0x15,0xef,0xbf,0x3e,0x35,0x6d,0x8d,0x48,0xa4,0x33,0xc2,0xe8,0x3b,0x89,0xe4,0x0c,0xb2,0x9a,0xc6,0x89,0x52,0xba,0xc7,0x2a,0xa5,0xfb,0xe5,0xde,0x06 +.byte 0xbd,0xc3,0x4f,0xe8,0xa9,0x9d,0x36,0xa5,0xcc,0x90,0xcd,0x68,0x49,0x52,0x6e,0x9a,0x85,0xd4,0x1b,0xe5,0x3f,0x54,0xc8,0xb4,0x7a,0x76,0xbf,0xa8,0xf4,0x25,0x05,0xeb,0x43,0x0c,0x2b,0x1c,0x59,0x5b,0x51,0x7f,0xd5,0x13,0x54,0x37,0x44,0x37,0x2f,0x79,0x1c,0x1f,0x18,0x57,0x60,0xab,0xf7,0xcc,0x5d,0xd5,0xdd,0x69,0xab,0x7f,0xc7,0x9d +.byte 0x7f,0xd7,0x6a,0xdc,0x34,0x3d,0x6e,0x2c,0x1e,0xb8,0x74,0xef,0xec,0x14,0x83,0x98,0x20,0x85,0x8a,0x95,0x93,0x26,0xed,0xbb,0x7d,0xfe,0x63,0xaa,0x20,0xbb,0x40,0x7b,0x35,0x1d,0xe5,0x64,0xc0,0x64,0x83,0x90,0x59,0xb4,0xae,0xf7,0xfe,0x14,0xb2,0xaa,0x72,0xf7,0x34,0x61,0xe0,0x61,0x06,0xb3,0xdc,0x09,0x5f,0xe1,0x57,0x65,0x83,0x8a +.byte 0x6d,0x46,0x54,0x8f,0xbf,0x38,0x12,0xf5,0xa3,0xfc,0x7b,0x90,0x4f,0x30,0xed,0xc1,0xab,0xb2,0x6e,0xee,0x7c,0x5e,0x35,0x70,0x80,0xb0,0xae,0x93,0xdc,0x4e,0x8f,0x6c,0x37,0xef,0xc9,0x4c,0x3a,0x41,0x14,0x91,0x99,0x0d,0x48,0xbe,0x5e,0x9b,0xc5,0xa6,0x4d,0x07,0x0d,0xd5,0xe6,0x5d,0x26,0x6b,0xa0,0xf3,0xb2,0x28,0x15,0x57,0xdb,0x7b +.byte 0x8e,0x6b,0x88,0xc3,0x81,0xb6,0x16,0xd1,0x3c,0xd0,0x2d,0x5a,0x23,0x35,0x8e,0xb0,0x8b,0x5c,0x99,0x6a,0x7a,0x55,0xb1,0xf9,0x45,0x97,0x94,0x05,0x6e,0x58,0xd4,0x53,0x8d,0x73,0x43,0x02,0x68,0xdf,0x7c,0x37,0x1a,0x6b,0x71,0x04,0xa0,0x31,0x77,0xbc,0xe0,0x16,0x5a,0x2a,0x9a,0xb2,0x40,0xe4,0xbb,0xd0,0xfd,0x35,0xcb,0x7f,0xf4,0x13 +.byte 0x0f,0xb5,0x93,0x9a,0x7d,0x50,0xf8,0xfe,0x56,0x34,0x83,0x20,0xce,0x3d,0x02,0x2e,0x0b,0x95,0x76,0x88,0x47,0x8c,0x75,0x51,0x14,0x52,0x49,0xbc,0xed,0x66,0x0e,0x81,0x65,0x5e,0x64,0xfb,0x45,0x59,0x3d,0x2b,0xd6,0x3a,0xc6,0xfd,0x50,0xe4,0xeb,0x0c,0x68,0x38,0x0f,0xdd,0xa2,0xdc,0xaa,0x26,0xf5,0x7b,0x40,0x6a,0x90,0xf8,0x08,0x2c +.byte 0xe8,0x8f,0x8e,0xc1,0xf2,0x6b,0x87,0xeb,0x7a,0x02,0x9e,0x26,0x3e,0x6b,0xb9,0x71,0x2e,0x6f,0x26,0x20,0xa9,0xc0,0x7c,0xe5,0x6c,0x6b,0xd4,0xc4,0x7b,0x54,0x8e,0x4a,0x7a,0xef,0xfc,0x03,0x02,0x1d,0x6a,0x16,0x99,0x35,0x12,0x49,0xba,0x86,0x37,0x7a,0xb0,0x8d,0x58,0x6f,0x1c,0xba,0xa9,0x5d,0x93,0xdf,0x98,0x50,0x7e,0xea,0x0a,0x88 +.byte 0x1a,0xd4,0x63,0x91,0x23,0x43,0x43,0x17,0x2e,0xe6,0x04,0x95,0x96,0xa8,0x2b,0xb4,0x9e,0x91,0x6c,0x13,0x52,0x8c,0xbf,0x7d,0x50,0xfc,0x79,0xef,0xa1,0x3e,0x90,0xba,0xac,0xd1,0x0d,0xb0,0x4d,0xd5,0x7a,0xc7,0xbd,0x82,0xb7,0x03,0x9c,0x0b,0xbc,0xa7,0x3c,0x05,0x8f,0xbd,0x0d,0x7f,0x80,0xeb,0xe9,0xbd,0x8f,0xdc,0xcd,0x86,0x23,0x26 +.byte 0xb0,0xa4,0xdc,0x63,0xef,0xad,0x61,0x53,0x7e,0x23,0x34,0x0d,0xd9,0x75,0x7c,0xa7,0x57,0xba,0x28,0x0c,0x82,0x7f,0x68,0xe5,0x24,0xdc,0x23,0x99,0xcd,0x6f,0x03,0x59,0x4f,0x35,0x47,0xc4,0x11,0xc0,0x0c,0x2b,0x16,0x94,0xb8,0x28,0xf2,0x0a,0x91,0x2e,0x1c,0xde,0x75,0x50,0x52,0x00,0x0a,0x92,0x80,0xca,0x39,0x3a,0xdf,0x16,0xb7,0xe2 +.byte 0xbd,0x98,0x7b,0x70,0x48,0x85,0x6d,0x48,0xa0,0x1b,0x0a,0xbb,0xa8,0xb6,0xca,0x9c,0x4e,0xda,0x0a,0x17,0x0b,0x30,0xf5,0xa2,0x9b,0x5a,0x89,0xf4,0x53,0x89,0x38,0x34,0x2b,0x7d,0x14,0x04,0x44,0xa3,0x8f,0x70,0x29,0xa5,0x3e,0xdd,0x5a,0x61,0xa1,0x04,0xac,0xd8,0xd3,0xec,0x42,0xc4,0xd9,0x2c,0x13,0x80,0xf8,0xc9,0xec,0x54,0xa7,0xa0 +.byte 0xe6,0x37,0x04,0x38,0x5f,0x1e,0x0b,0xfb,0x38,0x06,0xb9,0xe2,0x05,0x12,0x12,0xa2,0x28,0xff,0x12,0xae,0x44,0xd8,0x0d,0x2c,0x5a,0x8f,0xfb,0x1d,0x98,0x69,0x85,0x69,0x99,0xc0,0x63,0xc5,0x88,0xa7,0x2d,0x56,0x76,0x32,0x23,0x4c,0xf7,0x29,0xd6,0x3e,0x45,0xfa,0xd7,0x61,0xf4,0x9a,0xa6,0x9e,0x4a,0xe7,0xe7,0xf9,0xbf,0x1f,0x09,0x82 +.byte 0xbe,0x36,0xa0,0xdd,0x91,0x47,0x3b,0xbc,0x52,0xf2,0xc2,0x04,0x96,0x85,0xb6,0x93,0xac,0x99,0x94,0xbe,0xfd,0xe6,0x53,0x9f,0x75,0xab,0x38,0xdd,0x81,0xc0,0x79,0x25,0xcd,0x73,0x72,0x5b,0x4d,0xc0,0xba,0xa9,0x18,0xaa,0x76,0x51,0x15,0xef,0xb9,0x22,0xdd,0x5f,0x22,0x62,0x6c,0x36,0xf6,0xc0,0x72,0x34,0x01,0x7a,0xaf,0xe2,0x87,0x1b +.byte 0x5f,0x33,0x9c,0xd5,0xe2,0x81,0x03,0xbe,0x4e,0xac,0xcc,0x17,0xc5,0xc6,0xf8,0x0f,0x24,0xe0,0x26,0x56,0x8a,0x20,0x2e,0xe4,0x05,0xc8,0x0f,0x89,0x24,0x0e,0xd4,0xb7,0x07,0xd1,0x99,0x8c,0x55,0xfd,0x75,0xc1,0xdb,0xaa,0xd1,0xd2,0xa6,0xf2,0xf0,0x3c,0xae,0x62,0x0e,0x1f,0xaa,0xc9,0xa5,0x16,0x09,0x2c,0xc0,0x61,0x55,0x72,0x70,0x63 +.byte 0x22,0xb6,0x41,0xa5,0x08,0x34,0x6a,0x1b,0xfc,0x42,0x81,0xe7,0x25,0x98,0xcf,0xba,0x18,0xb0,0x36,0x90,0x72,0x65,0x75,0xf3,0x57,0x68,0xd0,0x86,0xe4,0xaf,0x33,0xb6,0x2b,0xef,0x96,0x97,0x17,0x42,0x6b,0x8e,0x19,0xaa,0x4b,0x9d,0xc7,0x73,0x34,0x5f,0x41,0x24,0x12,0xfb,0x66,0xa2,0x1e,0x91,0x41,0xc2,0x78,0x08,0x66,0xc4,0xb2,0x86 +.byte 0x67,0x70,0xe6,0x96,0x76,0x8d,0xa4,0x69,0x6f,0xe5,0x35,0x8b,0x20,0x3d,0x6a,0xcb,0x65,0x7b,0x82,0x7b,0xf6,0x2d,0xd8,0xd0,0xda,0x69,0x8b,0xcd,0xdf,0x15,0xf6,0x3a,0x2c,0xfe,0xc7,0x84,0x20,0x11,0xcc,0x18,0x4f,0xc7,0x2e,0x1c,0x46,0x41,0x6b,0x91,0x79,0xa0,0xbb,0xf4,0x48,0xd7,0x0c,0x9a,0x88,0x01,0xda,0xa1,0xd1,0x8f,0x27,0x49 +.byte 0x9d,0xa0,0x3f,0x5a,0xc2,0xf7,0x26,0x9b,0xe5,0xff,0xa4,0xcb,0x86,0x32,0xb3,0x3c,0xd5,0xe5,0x7c,0xbb,0x5e,0xfe,0x3d,0xcf,0x60,0x1c,0x16,0x8e,0x0c,0xc4,0xa9,0xf2,0xb2,0x42,0x1d,0x13,0xb0,0xa8,0xff,0x90,0xbc,0xd9,0x9a,0x6d,0x78,0x7a,0x46,0x1a,0xa8,0x35,0x4e,0xa4,0x79,0xd5,0xb4,0x36,0x47,0x62,0x3c,0x0e,0x23,0x56,0xca,0xa2 +.byte 0x60,0xe6,0xca,0xf6,0xc3,0xd6,0x7c,0x5d,0x54,0x9c,0x0c,0xfa,0x9a,0x0f,0x3a,0x8c,0x64,0x52,0xdb,0x62,0x5e,0x93,0x82,0xef,0x9e,0x8d,0x30,0xa5,0xe7,0x3d,0x52,0x11,0xd4,0x93,0xb1,0x77,0x8f,0xee,0x54,0x9c,0x80,0x47,0xa9,0x21,0xa8,0xf7,0x16,0x4b,0xbb,0xab,0x75,0x52,0xed,0x0c,0x85,0xf8,0x04,0xf4,0x80,0x08,0x4a,0xb5,0x2d,0x2d +.byte 0xd8,0x98,0x57,0x24,0xd5,0xc8,0x77,0xa0,0xd8,0xb5,0xb1,0x83,0x92,0xb4,0xc7,0x42,0x36,0xd1,0xa5,0xd6,0xbd,0x89,0xc6,0x76,0x31,0x92,0x31,0x67,0x2c,0xa4,0xb2,0x2b,0xcf,0x94,0x20,0x6a,0x17,0x63,0xb9,0x76,0xac,0x9c,0x1c,0x95,0x3e,0x57,0xf8,0x87,0x0d,0xef,0x36,0xcd,0x87,0xd1,0x58,0x2c,0x9a,0x5e,0x54,0x0e,0xac,0x97,0xbd,0x15 +.byte 0xc4,0xdb,0xea,0xd3,0x21,0x05,0x2d,0x78,0xce,0x4c,0x60,0xf3,0xf8,0xeb,0xd9,0x19,0x89,0xb0,0x83,0xc0,0xe4,0x42,0x08,0x5c,0x1a,0x1c,0x53,0xf3,0x1e,0x5a,0x28,0x92,0x0d,0x32,0xbe,0x4a,0x9a,0x70,0x78,0x93,0xc1,0x66,0x81,0xda,0xe7,0x3d,0x05,0xc5,0xaa,0xdc,0x51,0x6b,0xaf,0x67,0x4d,0x18,0xfe,0x29,0xe0,0xfa,0x5c,0xe5,0x9a,0x18 +.byte 0x7f,0x8f,0xaa,0x21,0xa5,0xd0,0x8b,0x62,0x32,0x6b,0x93,0x02,0x19,0x62,0xd3,0xd6,0x74,0xea,0x83,0xdb,0x6c,0x57,0xe3,0x1f,0x1f,0x90,0xd0,0x22,0xf7,0x9a,0x4a,0x14,0xf4,0x8a,0xb3,0x86,0xa5,0x4c,0x1e,0xdf,0x49,0xa5,0x78,0x30,0x5e,0xf0,0x9a,0x69,0x0d,0xaa,0xe9,0x47,0x01,0xae,0x51,0xcf,0x32,0x4c,0xec,0x03,0x08,0xe7,0xcb,0x35 +.byte 0x59,0xd2,0x48,0xd4,0xfa,0x6a,0x45,0x6b,0x66,0x1f,0xb8,0x1e,0x45,0x85,0xef,0x14,0x25,0x34,0x48,0x50,0x59,0xf3,0x76,0x09,0x32,0xf5,0xe4,0xa8,0x98,0xb0,0x9a,0x70,0xec,0x0a,0x17,0x87,0xcf,0x6d,0x96,0x7d,0x50,0x5e,0x3a,0xff,0x57,0xa7,0xaf,0x04,0x0d,0xdc,0xcc,0xad,0xe3,0x09,0xd3,0x92,0xab,0xd8,0x3a,0x61,0x1f,0x9c,0xc4,0x36 +.byte 0x3b,0xf3,0xf6,0x87,0x43,0xea,0xc8,0xff,0x29,0x19,0x9e,0x87,0x44,0xc7,0xe5,0x5c,0x43,0x30,0x9a,0xb2,0xd8,0x47,0x4a,0x87,0xcc,0xc7,0x8e,0x99,0x32,0xdd,0x3c,0x37,0xda,0xa0,0x39,0x04,0x55,0xca,0xcf,0x2f,0xce,0x8b,0x22,0x35,0x2c,0x29,0x89,0xef,0x5c,0x05,0x82,0x55,0xf3,0x8d,0x64,0x7f,0x69,0xf7,0x3d,0x43,0x27,0xf3,0x4c,0xd7 +.byte 0x43,0x89,0x47,0xd5,0x0b,0x01,0x1b,0x17,0x6c,0x7e,0x63,0x18,0x87,0x8b,0x8f,0x20,0x0d,0xa4,0x1e,0xa5,0x3b,0xf1,0x5c,0xe5,0xc8,0x23,0xd4,0xee,0x79,0x3e,0xd1,0xbc,0x83,0x30,0x03,0x64,0x80,0x7e,0xda,0x13,0x7c,0x52,0x88,0xc1,0x7c,0xa7,0x8a,0x5d,0x8d,0x7b,0x57,0x4e,0x59,0x97,0x83,0x52,0x03,0x04,0x6b,0xd2,0xf3,0xff,0x1c,0x4e +.byte 0x3b,0xae,0x70,0x61,0x3b,0x8b,0xaf,0x56,0x3d,0x28,0x73,0x24,0x39,0x4b,0xb8,0x6e,0x89,0x28,0xe6,0xc8,0x5c,0xe9,0xf8,0xec,0x8f,0xf7,0x75,0x1a,0x13,0xc1,0x8e,0x53,0x4e,0xe5,0xef,0x37,0xce,0xa1,0x54,0xca,0xcc,0xf5,0x01,0x29,0x2a,0x8f,0x00,0x1c,0xde,0xcd,0x5e,0x24,0x0b,0xa5,0x94,0x0c,0x8a,0xab,0x54,0x1e,0x80,0x2a,0x0d,0x84 +.byte 0x38,0x4c,0x17,0xea,0x84,0x07,0x9c,0xbd,0x85,0xd8,0x1b,0x57,0x6a,0xde,0xb3,0x86,0xa3,0xf8,0x6d,0x03,0x3e,0xf1,0x37,0xae,0x7d,0x02,0x33,0xc5,0x7b,0xf6,0x64,0xdb,0x3e,0xb0,0x48,0xda,0x49,0xec,0x89,0xb4,0x83,0xff,0xe1,0x6f,0x9a,0x7e,0x0a,0xda,0x6e,0xec,0x70,0x0b,0x51,0xac,0x82,0xac,0xb8,0xce,0x16,0xe7,0x47,0xab,0xe8,0xc7 +.byte 0x56,0xd1,0xab,0x73,0x72,0x5c,0xe7,0x9e,0xb8,0x77,0xa7,0xc1,0x47,0x9c,0x4e,0x16,0x68,0xce,0x21,0x23,0x2d,0x6c,0xcf,0x79,0xd6,0xd4,0xdf,0x74,0x30,0xb8,0x0f,0x60,0xea,0xbf,0x39,0x77,0x45,0xdc,0xaf,0x25,0xbd,0xc5,0x8d,0x0b,0x44,0x21,0xc1,0xc1,0x2e,0x54,0x2a,0x32,0x6c,0xea,0x51,0xe0,0x7d,0xa8,0x09,0x94,0x2f,0x4e,0xfe,0x27 +.byte 0xe8,0x63,0xfb,0x71,0xca,0x01,0x7d,0xc9,0x70,0xd8,0xe4,0x82,0xbf,0x3f,0xea,0x64,0x5e,0xa9,0x84,0x1d,0x2c,0xfd,0x8a,0x7d,0x33,0x73,0x5c,0x82,0xbe,0x9e,0x46,0xfc,0x39,0x5e,0x38,0x2a,0x20,0xd9,0xa9,0x20,0x46,0x23,0xc1,0x8b,0x0a,0x9c,0x42,0xb6,0x50,0x9f,0xc8,0x7d,0x4a,0x85,0x98,0xed,0x92,0x13,0xd3,0xd6,0xe6,0x6d,0x50,0x6e +.byte 0x93,0x63,0x41,0xa3,0x63,0x97,0x52,0xe3,0xaf,0x09,0xe1,0x40,0x12,0x41,0xed,0xb3,0xc5,0xb8,0x9f,0xc1,0xf2,0xd2,0xe6,0x16,0x94,0x97,0xdb,0xae,0xdb,0xd4,0x1f,0x5a,0x2f,0xf1,0xb1,0x22,0xf6,0x60,0xa4,0x0e,0xd8,0x2f,0xf7,0xf7,0x3f,0x6c,0x7d,0x73,0xe3,0x1d,0x99,0x04,0x7f,0x4f,0x70,0x2a,0x8c,0x43,0x80,0xa3,0xd0,0x25,0x75,0xd8 +.byte 0xb6,0xc8,0x90,0xa2,0x26,0xee,0xba,0xc5,0x1a,0xdc,0x1f,0x81,0x65,0x54,0xc6,0x57,0x6e,0xa2,0x03,0x32,0xf5,0x14,0xb2,0xdd,0x4d,0x21,0xaa,0xb9,0x78,0x4f,0x76,0xab,0xbe,0xfe,0x5d,0xc6,0xaf,0xed,0x6f,0xf9,0xaa,0x31,0x21,0x08,0xa4,0x6e,0xfb,0x78,0xdc,0xed,0x0c,0x05,0xff,0x1e,0x60,0x38,0x60,0x94,0xa9,0x92,0xa7,0x07,0x6e,0x6f +.byte 0x6d,0x89,0x8a,0x73,0xfb,0xaf,0x01,0x34,0x7d,0x7d,0x33,0x76,0xff,0x1f,0x6b,0x79,0x5e,0xff,0x50,0x14,0x80,0x7d,0x55,0x0e,0x2d,0xc3,0x77,0x85,0x30,0x20,0xf6,0xc8,0xc7,0xb7,0x73,0x1b,0xd1,0x87,0x69,0x44,0xeb,0x02,0x5e,0x45,0x66,0x6f,0x28,0x00,0x1f,0xf8,0x58,0x93,0xe5,0x21,0xbc,0x19,0x8d,0x72,0x19,0xaa,0x9a,0xbb,0xc6,0x47 +.byte 0xe6,0x0b,0xe4,0x76,0x13,0xc7,0xc4,0x1b,0x9d,0x85,0xba,0x17,0xb6,0x30,0x2a,0xdb,0x7c,0x36,0xd7,0xd8,0x8b,0x9c,0x99,0x92,0x64,0x03,0x4f,0xd4,0x1f,0x04,0x2e,0x45,0x34,0x55,0x92,0x99,0x77,0xb8,0x45,0xce,0x59,0x22,0x3c,0x6e,0xe5,0x18,0xb0,0x83,0x42,0x42,0x75,0x1c,0x34,0x0f,0x2e,0x59,0x06,0x94,0x17,0xea,0xc3,0xdb,0x0b,0x2f +.byte 0x44,0x97,0x54,0xe8,0x76,0xd3,0x25,0x24,0xe9,0x21,0x4f,0xd7,0x01,0x7d,0xbe,0x90,0x8a,0x0a,0x7d,0x4e,0x91,0x5f,0x4c,0x32,0x83,0x42,0x55,0x95,0x3c,0x7a,0x3e,0x46,0x8a,0x5d,0x0c,0x05,0xcd,0x0b,0xf6,0x3e,0x4d,0xf3,0x55,0xea,0x42,0x3e,0x19,0x0e,0xda,0xd4,0x22,0x88,0xe2,0x29,0x06,0x9e,0xea,0x1c,0x27,0x96,0x7f,0x3a,0x8a,0x28 +.byte 0x2f,0x7d,0xa2,0x65,0x37,0xae,0xb6,0x6a,0x59,0x41,0x19,0x73,0x91,0x64,0x77,0x4e,0x5a,0x1a,0x85,0x9f,0xc5,0xb0,0x85,0xc1,0x96,0x47,0x69,0x9c,0x36,0x70,0x36,0xa3,0x2e,0x1a,0x7d,0x11,0x59,0x55,0xec,0x4c,0x49,0xa1,0x86,0x3c,0x3d,0x24,0xb8,0x7a,0x84,0xca,0x4c,0x3f,0x7e,0x81,0x95,0x39,0x41,0xfe,0xc4,0x74,0xe5,0x89,0x7e,0xdc +.byte 0x86,0xd2,0xdb,0x8b,0xb8,0xa2,0xbb,0x15,0x64,0x89,0xf9,0x00,0x7d,0x56,0xec,0x8b,0xc8,0x05,0xcd,0x76,0x6c,0xcb,0xaf,0x7e,0xd2,0xdd,0x67,0xb3,0x99,0x16,0x63,0xf2,0x6d,0x49,0x7d,0xeb,0x67,0x24,0x98,0xf1,0x28,0xa3,0xb2,0x14,0xfc,0x95,0xf6,0x55,0xa0,0xb5,0x8c,0x26,0x2f,0xc6,0x08,0x49,0x57,0x4c,0x20,0xbc,0x48,0xab,0x24,0xef +.byte 0xe9,0xab,0x6b,0x77,0x4d,0x3b,0x61,0x84,0x68,0x67,0x72,0xc2,0xcf,0xab,0x8e,0xac,0x39,0xec,0x43,0x03,0xbb,0x4f,0x32,0x7d,0x7d,0x51,0x69,0x30,0xee,0x4f,0xd0,0xb9,0xa5,0x22,0xdd,0x47,0x06,0xad,0xac,0x62,0x20,0xff,0x7b,0x8c,0x90,0x91,0xb3,0xd8,0x89,0xd3,0xea,0x81,0xdc,0xca,0x31,0xc3,0x65,0xca,0x4c,0x50,0x0a,0x85,0xf7,0xaf +.byte 0xe3,0x67,0x57,0x53,0x1d,0x4e,0x42,0x17,0x2d,0x14,0x80,0x29,0x09,0x2b,0x48,0x45,0x43,0xb9,0xad,0x1f,0xb7,0x2d,0xab,0xfa,0x6a,0x1b,0x3c,0x7d,0x76,0xd7,0x36,0x20,0xb0,0xd3,0xc0,0x5e,0xc7,0x20,0x06,0x0c,0xa9,0x6a,0xb2,0x67,0xad,0x91,0x49,0xfc,0x4d,0xb2,0x15,0x61,0x61,0xfa,0x33,0x6c,0x94,0x92,0x58,0xef,0x46,0x82,0x9c,0x04 +.byte 0x52,0x21,0x28,0x08,0xb4,0xa9,0xd4,0x2e,0xd9,0x8c,0x93,0xd0,0xd8,0x4f,0x33,0x1d,0x0b,0x7e,0x07,0x12,0x40,0x64,0x3d,0xa2,0x8f,0xa3,0x96,0x45,0x0e,0xfc,0x9b,0x55,0x5f,0x3c,0xa2,0x57,0x3e,0x51,0x40,0x69,0xdc,0x7a,0x51,0xd2,0x3b,0x79,0x2f,0xd2,0x01,0x18,0xbf,0xd5,0xd2,0xd1,0x0e,0x08,0xcf,0xac,0x07,0x4d,0xd1,0x92,0xc7,0xca +.byte 0x92,0x75,0x0b,0x80,0x29,0xf1,0x46,0x24,0xba,0x47,0x6b,0x4a,0x64,0xfb,0x31,0x69,0xe9,0x40,0x0d,0x69,0x50,0xd0,0xdf,0xf8,0xcb,0x6a,0xe8,0xd4,0xc2,0xbd,0x0b,0x23,0x00,0xe0,0x29,0x0a,0x0a,0x8e,0x19,0xec,0xa9,0x14,0xe4,0x5d,0x4c,0x30,0xc9,0x85,0x42,0xd6,0x9f,0x83,0x8f,0x2a,0x5b,0x22,0x37,0xe4,0x71,0x3b,0x19,0x86,0xd4,0xda +.byte 0xb5,0x81,0x8e,0x84,0x57,0xcd,0x13,0x64,0xc3,0x23,0xfd,0x91,0x8a,0xe4,0xb9,0x32,0x12,0x17,0x02,0xa6,0x8d,0xec,0x44,0x9d,0xa5,0x7c,0x96,0x14,0xd1,0xd5,0x93,0x02,0x0c,0x9d,0xfc,0x26,0xa0,0xd2,0x41,0xaa,0x75,0xe8,0x82,0x6f,0x47,0x1d,0xe8,0xcf,0x94,0xe3,0x35,0xa9,0x76,0x1e,0xdb,0x92,0x5f,0x32,0x49,0xf4,0xd5,0x59,0x9c,0x4e +.byte 0xf7,0x89,0xda,0x23,0x7f,0x46,0x0e,0xfc,0xaf,0x1c,0x6f,0xcc,0x59,0xa5,0x43,0x04,0xbf,0x55,0xab,0x7d,0x36,0xa3,0xa5,0x03,0x7f,0xdf,0x33,0x6c,0x6d,0xd0,0x53,0xaa,0xef,0x54,0xc1,0x62,0xa0,0xd6,0x3a,0x67,0x87,0xe3,0x76,0x17,0x45,0xbe,0x7f,0x55,0xc8,0x8b,0xe8,0x1c,0xa8,0xe6,0xa6,0xb2,0xbf,0xe5,0x45,0xc0,0x88,0x22,0x36,0xa0 +.byte 0xec,0x21,0xdc,0x3e,0x6b,0xd2,0xc7,0xdf,0x5b,0xa4,0x32,0x28,0xca,0x23,0xe1,0x50,0x55,0x72,0x59,0x28,0x1c,0xf7,0x93,0x91,0x07,0x3c,0x4e,0x81,0x20,0x58,0x9b,0x07,0x38,0x37,0x68,0x2c,0x29,0xba,0x20,0x11,0xa9,0xa0,0x29,0x65,0x57,0xb1,0xe3,0xb1,0xfb,0xe2,0x70,0xee,0x1f,0xcd,0xf5,0x61,0xea,0x7a,0x08,0xb4,0x1e,0xfe,0xe7,0x4d +.byte 0x32,0xa0,0xfd,0xb4,0x52,0xa1,0x4b,0x67,0xba,0x5e,0x90,0xe7,0x56,0xec,0x06,0x03,0xb6,0xe6,0xc6,0x98,0xa1,0x41,0xf4,0xaf,0xde,0xe2,0x67,0xef,0xaa,0x05,0x97,0xc5,0x80,0x32,0xd0,0x43,0xc2,0x02,0x7a,0xcc,0x4c,0xdd,0xe9,0x1e,0xd0,0x4f,0xad,0xf3,0x4b,0x2c,0x5e,0xb8,0xd8,0x84,0xc2,0x43,0xc7,0xa9,0x86,0x4d,0x10,0xae,0xb7,0xe3 +.byte 0x5c,0xd5,0x2a,0xba,0x3b,0xd3,0x7b,0x5d,0xc8,0xe0,0x67,0x87,0xbe,0xbf,0x71,0x4e,0x22,0x68,0x12,0x53,0x95,0x73,0x5c,0x30,0x7b,0x2b,0xfd,0xc1,0x3c,0xfc,0xc4,0x0f,0xdd,0x5b,0x3e,0x1b,0x72,0x71,0xa6,0xe3,0x1f,0x2d,0x51,0xe2,0x61,0x3d,0xa0,0x60,0xc2,0x6b,0x41,0x8f,0x94,0x83,0x29,0xa3,0xb6,0xa7,0xc7,0x11,0x8f,0x1c,0xb5,0x19 +.byte 0x66,0x44,0xc7,0x05,0x58,0x83,0x28,0x69,0x0c,0xb6,0x65,0xe5,0x93,0x1c,0xb1,0xf6,0xf9,0xea,0xda,0x84,0x26,0x8e,0xa2,0xbb,0x9b,0x55,0xd3,0xbc,0x42,0x56,0x8f,0xce,0x6e,0x74,0x40,0xf2,0x02,0xa6,0x22,0x22,0x6e,0x20,0x0e,0x4b,0x8b,0x15,0xa5,0x04,0xf0,0xe0,0x7b,0x27,0x0a,0x38,0xe3,0x99,0x04,0xd0,0x5b,0x64,0xd2,0x04,0x92,0x61 +.byte 0x57,0x74,0xbc,0x1e,0x98,0x01,0x4b,0x2f,0x46,0x56,0x1c,0xeb,0x49,0x2d,0x66,0xac,0x85,0x96,0x48,0xfd,0xa1,0xf0,0xf5,0xc0,0xdb,0x7a,0xf2,0x0b,0x57,0x86,0xac,0x4c,0x6a,0x02,0x97,0x13,0xef,0x08,0xf6,0x18,0xe1,0x5c,0xb3,0x18,0x3d,0x70,0xc0,0x76,0x5e,0xd0,0xb8,0x44,0x32,0x25,0x75,0x62,0xa2,0x80,0x78,0x8c,0xc4,0x2a,0x84,0xbc +.byte 0x51,0xd4,0xee,0x44,0x48,0xe5,0xc4,0x48,0xbf,0xc0,0x27,0xc1,0x77,0x25,0xf5,0x59,0x6b,0x60,0xae,0xa5,0x42,0xfe,0xc3,0x06,0x91,0xe3,0xdb,0xa9,0x4b,0xe2,0x73,0x95,0x1f,0xf6,0xb6,0x66,0x71,0x63,0xb3,0x14,0x4a,0x3d,0x36,0x84,0xbe,0x2a,0x7c,0x7c,0xba,0x0e,0x8d,0x9a,0x73,0x52,0x21,0x89,0x02,0x8f,0x94,0xa5,0x9a,0x11,0x2e,0x6e +.byte 0x78,0xf7,0x07,0xf8,0xb1,0x42,0x96,0x06,0x78,0xf0,0x53,0x86,0xec,0x2b,0x1f,0xa7,0x84,0x79,0x37,0xc7,0x61,0x83,0x8e,0x62,0x65,0x49,0xdd,0xfe,0xee,0x97,0x70,0xa2,0x73,0xb5,0x85,0xaf,0x10,0xed,0xb8,0x74,0xec,0x42,0xd0,0x14,0x47,0xa6,0x90,0x7c,0x07,0x22,0xb4,0x4e,0xfc,0x12,0xa1,0x9d,0xd4,0x73,0x8f,0x6a,0x55,0xf8,0x56,0x25 +.byte 0xdb,0x9b,0xe8,0x10,0x87,0x7a,0x4b,0x42,0x9c,0xbb,0x6e,0xf1,0xd7,0x1d,0xf4,0x07,0x31,0x9c,0x94,0x3a,0xb6,0xad,0x4b,0xf4,0x57,0x3d,0x2f,0xba,0x23,0x36,0x34,0x52,0x62,0xf7,0x64,0xc7,0x47,0xeb,0x41,0xad,0x07,0xfb,0x3e,0x08,0x74,0x92,0x58,0x0f,0x73,0xe2,0x53,0x35,0xda,0xae,0x64,0x3c,0x47,0x89,0xaf,0xce,0x59,0x35,0x75,0x8b +.byte 0x50,0xee,0xbf,0xbe,0xd1,0xf4,0x2f,0x11,0xa3,0xfe,0xce,0xfd,0x15,0x0d,0x32,0x17,0x00,0xfb,0xad,0x02,0x70,0x5c,0xeb,0x59,0xfb,0x87,0xe5,0xed,0x0e,0xde,0x97,0xe7,0x75,0xb6,0xdc,0xe9,0xb0,0x08,0x26,0x0e,0x11,0xd4,0x4f,0xc4,0x92,0x71,0x7c,0x63,0xef,0xc0,0x14,0x64,0xe1,0x0f,0x7e,0xe6,0xcb,0x5b,0x4c,0xd4,0x16,0x8b,0x7b,0x8b +.byte 0x2f,0x2a,0x77,0xef,0xd3,0xdf,0x56,0xc0,0x5a,0x94,0x72,0xd5,0x36,0x12,0xfa,0x25,0xd7,0x77,0x52,0xdd,0xea,0x11,0x2f,0x6b,0x16,0x6e,0xe3,0xa2,0x84,0xba,0x55,0xc2,0xb0,0xe2,0x3b,0x53,0xb6,0xa4,0xc6,0xa5,0x3f,0x1b,0xb3,0x38,0xc0,0x2f,0x1a,0x80,0xe0,0xa4,0x60,0x49,0x8c,0xe3,0x23,0x5f,0x59,0xfd,0x2a,0x0f,0xe8,0x4c,0xaf,0xd7 +.byte 0x36,0xc7,0x25,0x21,0xad,0x41,0x54,0x27,0x95,0x15,0x42,0xbc,0xb3,0x77,0x4e,0x97,0xf4,0x3c,0x54,0xcc,0x19,0x63,0x62,0x67,0x97,0x5a,0xd0,0x59,0xfb,0xce,0xcd,0xe1,0x3c,0xb6,0xc9,0x49,0xc4,0xff,0xde,0xf9,0x89,0x87,0x9c,0xdf,0x4e,0x8c,0x9d,0xe5,0xbd,0x0d,0x0c,0x6e,0x93,0xfd,0xea,0x90,0xf2,0x80,0x7e,0x00,0x9a,0x06,0x02,0x87 +.byte 0xae,0xca,0xf4,0x46,0xbb,0xb5,0x52,0xee,0x18,0xb0,0xf1,0x61,0xcb,0xe1,0x65,0x9c,0x0b,0xfb,0xe6,0x3b,0xeb,0x3a,0x1a,0x22,0x41,0x0b,0x99,0xa4,0x8e,0x01,0x5e,0x7c,0x4e,0x1a,0xaa,0xab,0xd3,0x8b,0x99,0x7f,0xba,0x6b,0xec,0xe7,0x3a,0xd6,0x55,0x46,0x20,0x1b,0x10,0x39,0x06,0xcc,0x90,0xc1,0x6a,0xa5,0x27,0x7c,0xca,0xa5,0x58,0x07 +.byte 0xd7,0xaf,0x6d,0x12,0xa6,0x68,0xc7,0x0e,0x19,0x53,0x44,0x22,0x85,0xbb,0x72,0x9c,0x4d,0xfb,0xeb,0x94,0x3a,0xa0,0x64,0xf5,0x25,0xe8,0xee,0x7a,0x3b,0x71,0x0e,0xbb,0x40,0xa2,0xb3,0xc9,0x6b,0x14,0x0f,0xc3,0x75,0xac,0x1b,0x5c,0xf1,0x34,0x51,0xcb,0xeb,0x5f,0x40,0x0f,0x82,0xe9,0xd2,0x6d,0x95,0x88,0x84,0xea,0xe9,0xe3,0xa0,0xe9 +.byte 0xef,0x3b,0x33,0xfe,0x32,0x52,0x93,0xce,0x95,0x4b,0x64,0x3c,0x97,0x76,0x91,0xd8,0xce,0xb5,0xc2,0xda,0x58,0x23,0x27,0xe2,0x3d,0xbe,0xf6,0x31,0x79,0x73,0x0e,0x31,0xd7,0xa3,0xaa,0xac,0xcf,0x31,0x1e,0x75,0x58,0x14,0x21,0x52,0x1c,0x3e,0x4f,0x2a,0x2b,0x9a,0x22,0xbc,0x42,0x68,0x5b,0x83,0xc2,0x8c,0xd4,0xe8,0xd9,0x02,0x0d,0x13 +.byte 0x2f,0x08,0xd3,0x11,0xb7,0x4b,0x84,0x67,0x43,0xda,0x20,0xdb,0x89,0xd5,0x9e,0x14,0x54,0x3d,0x49,0xda,0xac,0x3f,0x8f,0xf5,0x17,0xfe,0xb8,0x5f,0xc3,0x20,0x38,0x27,0x21,0x32,0xbf,0xf3,0x9b,0x2c,0x0b,0x9b,0xeb,0x64,0x87,0xf7,0x9d,0xed,0x15,0x05,0x21,0x69,0xcf,0x2d,0xf8,0xfb,0xf2,0x81,0x51,0x08,0xc7,0x18,0x81,0xdf,0xed,0xa4 +.byte 0x70,0xb3,0x07,0xfa,0x00,0xd5,0x65,0xb9,0x5a,0x82,0x67,0x6f,0x10,0xfc,0x46,0x05,0x9a,0x85,0x64,0x14,0x60,0x64,0x4d,0x1f,0x13,0x57,0xbb,0x7c,0x4a,0x10,0x84,0x8c,0x57,0x36,0x13,0x22,0x00,0x04,0x2d,0xcf,0x27,0x3d,0xf4,0x27,0x3e,0x32,0xb3,0x87,0xda,0x82,0xaa,0xad,0xd7,0xa7,0xc5,0x3c,0x45,0xec,0x28,0x82,0x79,0x95,0x8f,0x56 +.byte 0x50,0x5f,0xc2,0x15,0xab,0x18,0x58,0x4f,0x69,0x46,0xce,0x29,0x33,0x42,0x53,0xe9,0xea,0xe5,0xa8,0x5b,0x90,0xc4,0xf4,0xbf,0x8a,0x20,0x62,0xad,0xa5,0xea,0x6a,0x4e,0xb4,0x20,0x2d,0xca,0x90,0xdf,0xbd,0xab,0x5b,0xc3,0x33,0x7c,0x53,0x1f,0xf5,0x2e,0xc0,0xbf,0x19,0xe1,0xa1,0x5a,0x63,0xf3,0x13,0x4d,0x6e,0xef,0x4f,0x3a,0x94,0x18 +.byte 0xbe,0x79,0xdb,0xbf,0xc2,0x2c,0xb3,0x36,0x59,0xab,0x21,0x1d,0x98,0x60,0x70,0xdd,0x95,0x51,0x19,0x07,0xd6,0x68,0x0e,0x2a,0xd4,0x4c,0x30,0x18,0x1c,0xe4,0xe1,0x89,0x15,0x25,0xea,0x27,0xcf,0x51,0x56,0xc9,0xa9,0xa7,0x31,0x08,0x17,0xfb,0xfc,0xf6,0x0c,0x5d,0xf1,0x7c,0x36,0xcb,0xad,0xef,0x29,0xf5,0x2e,0x23,0x09,0xcf,0x31,0x6f +.byte 0x74,0x12,0xd2,0xc2,0xc7,0x19,0xa5,0x6e,0x20,0x09,0x67,0xdc,0x41,0x69,0xbe,0x15,0xd6,0xeb,0x7b,0xba,0x63,0xae,0x65,0xd8,0x67,0xec,0x6e,0xcc,0x1d,0x04,0x08,0xfb,0x7c,0x34,0x1d,0x5f,0x1e,0x51,0x1c,0x30,0x72,0xd3,0x0c,0x48,0x60,0x3d,0x52,0xae,0xe6,0x78,0x44,0x6d,0xb8,0x40,0x08,0xb7,0x7a,0xa9,0xfc,0xa0,0x86,0xff,0x32,0xd6 +.byte 0x5a,0x31,0x4e,0xe2,0x65,0xab,0xb0,0x84,0xb6,0x74,0x3e,0xa6,0x67,0x7c,0xa2,0x0f,0x23,0x22,0xab,0x72,0x7e,0xeb,0x45,0xa9,0x2a,0xb4,0xd3,0xcc,0x27,0x5c,0x12,0xdb,0x14,0x68,0x73,0x0f,0x36,0xbf,0x9f,0x14,0x12,0xe9,0xef,0x04,0x2a,0x63,0x41,0x4b,0x04,0x9b,0x4c,0xc4,0xb2,0xb9,0x1c,0xc0,0xb8,0xcc,0x23,0x61,0xc4,0xed,0x27,0x1e +.byte 0x1d,0x97,0x3d,0x40,0x4c,0x1f,0xeb,0x6e,0xc4,0xfb,0x5c,0x2d,0xf5,0xf1,0xbb,0x05,0x47,0xa2,0x1a,0x9c,0x2b,0x8f,0xce,0x98,0x09,0x6b,0x86,0x22,0xf8,0x3a,0xae,0xf3,0xb4,0x66,0x2f,0xdb,0x20,0xa5,0xc6,0xb6,0x35,0xb5,0x5a,0x68,0xb5,0x37,0x2c,0xab,0x13,0x3d,0x2d,0xcb,0x38,0xed,0x3c,0x7a,0x1f,0x26,0x08,0x58,0x94,0x52,0x30,0xec +.byte 0x06,0x9f,0x90,0x97,0x4d,0x90,0x49,0x23,0xaf,0x00,0x90,0x6b,0x96,0x37,0x02,0x4c,0x35,0xc0,0x3e,0x66,0x2c,0x52,0xbc,0x75,0x28,0xd7,0x8f,0x25,0xbe,0x91,0x10,0x22,0x67,0xbf,0x4a,0x4d,0x62,0xc4,0xe9,0xda,0xe2,0x79,0xcc,0x76,0xeb,0x99,0x87,0xac,0x39,0x7d,0xf6,0x5a,0x37,0x85,0x30,0x33,0x65,0x3f,0xd9,0xd6,0x17,0xf8,0xf0,0x86 +.byte 0xee,0x5c,0x2f,0xb0,0xb3,0x4f,0x83,0x6c,0x4a,0x8f,0xfc,0x80,0x91,0xaf,0x4b,0x21,0x9c,0x9b,0x44,0x3c,0xed,0x67,0xfb,0xa3,0x31,0x7f,0xd4,0x73,0x72,0xb9,0xc1,0x31,0x96,0x47,0x8e,0x99,0x8e,0x62,0x1a,0xfd,0xc7,0x9d,0x2f,0x4c,0xda,0xe5,0xae,0x17,0xb6,0x40,0x5f,0x9e,0xa8,0xf2,0xcc,0xd7,0xd5,0x40,0x33,0x88,0x57,0x63,0x9b,0xde +.byte 0x82,0x71,0x68,0xfe,0xaf,0x29,0x6c,0xc1,0x2c,0x2f,0x02,0x42,0xd7,0xa5,0x28,0x05,0xca,0xa0,0xb6,0x8c,0x43,0x90,0x05,0xe2,0x1c,0xb7,0x76,0x79,0x39,0xd3,0x23,0xe1,0xe7,0xbb,0x19,0x65,0x1a,0xb4,0xbb,0x5a,0xcf,0x43,0x70,0x26,0x1a,0x2f,0x61,0x78,0x75,0x08,0xb0,0x88,0xe5,0x4a,0x46,0x0a,0xfc,0xcb,0x46,0x18,0xb0,0x8d,0x9b,0xeb +.byte 0xf5,0xe1,0x83,0x04,0x84,0x4f,0xd6,0xa0,0x4f,0xb2,0x4c,0x44,0x08,0xde,0xd6,0x82,0xb5,0x9a,0x45,0x15,0xb8,0x21,0xc7,0xf5,0xe2,0xfd,0x02,0x27,0x18,0x13,0x24,0x18,0x01,0xd1,0x2a,0xff,0x63,0xf2,0xa4,0x97,0xc8,0x4b,0x3b,0xae,0x49,0x47,0x54,0xe8,0x75,0xe7,0x16,0x77,0x22,0x10,0x7b,0x3c,0xf0,0xdb,0x49,0x6e,0xd6,0x55,0x9d,0x43 +.byte 0x6f,0x6e,0x2d,0x97,0xea,0x16,0x2e,0x0c,0x85,0x89,0x67,0xe1,0x7b,0x38,0xa6,0x2b,0x89,0xf0,0xcd,0x90,0xcd,0xba,0x9a,0x70,0xa9,0xe3,0xff,0xe0,0xbd,0x15,0x3e,0x4b,0x13,0x62,0x7b,0x59,0x64,0x18,0x96,0xe9,0x6a,0xf3,0x69,0x2d,0x2d,0x25,0xe7,0x91,0xd3,0xbc,0x74,0x58,0x66,0x2f,0x5e,0x8b,0x52,0xf6,0x91,0x24,0xa8,0x6f,0xa5,0xce +.byte 0xa1,0x4e,0x3b,0xe9,0xc5,0x30,0x7e,0xa5,0xc7,0xe2,0xb3,0x71,0x3b,0x25,0xb9,0x5f,0xe5,0x9c,0xf8,0x46,0x23,0xc5,0xa2,0xc1,0x1f,0x3f,0x43,0xa6,0xaa,0xf1,0x36,0x27,0xc6,0xa8,0xed,0x0d,0x50,0x71,0xf1,0x38,0x27,0xb7,0x16,0x43,0x7c,0x7f,0x77,0x5b,0x25,0x59,0xb7,0x08,0x0d,0xc8,0x84,0xe4,0xc2,0x03,0x95,0xe5,0xf3,0x0a,0x9c,0x1f +.byte 0xde,0x98,0x7c,0xa9,0xe2,0x70,0x9e,0xde,0xf6,0x80,0xd0,0xf8,0x86,0x4a,0x7a,0x0d,0x16,0xaa,0xde,0xba,0x02,0x30,0x8a,0xe6,0x03,0x0f,0xa1,0xf1,0xe8,0xd6,0xf8,0xce,0x7b,0xba,0x74,0xa8,0x25,0xb0,0x49,0x22,0xa6,0x81,0x7e,0x71,0xc5,0x97,0x9e,0xa8,0x46,0xa7,0xe9,0x8b,0x7c,0x7c,0x4c,0xc5,0x3c,0x93,0x08,0xb9,0x8b,0x3c,0x33,0xd6 +.byte 0xc4,0x37,0xc8,0x05,0xe7,0xfe,0xc2,0x7c,0x02,0xe6,0xda,0x09,0x52,0x2c,0xc6,0xa8,0x6e,0x44,0x7e,0x55,0xf0,0x32,0x10,0xcb,0x1e,0xa7,0x77,0x8d,0xc7,0xfe,0xb5,0xf6,0x3b,0x49,0xf2,0xfb,0xe0,0x41,0x98,0xd3,0x17,0xa6,0x5d,0x3f,0x4c,0x95,0xb0,0x02,0x8d,0xab,0x36,0xb7,0xa0,0x92,0x40,0x5e,0x15,0xfb,0xa9,0xb4,0xa3,0x04,0x8b,0x6b +.byte 0x81,0x44,0x59,0x22,0x10,0xcb,0xc5,0x52,0x3f,0x78,0x70,0x00,0xe2,0xa2,0xf7,0x76,0x62,0x72,0x06,0x8b,0xbb,0x56,0x0f,0x8c,0x67,0x2f,0x52,0x3f,0x3b,0xdc,0x15,0x79,0x55,0x89,0x6c,0x61,0x23,0xcc,0x6b,0x41,0x77,0xe5,0xc4,0x90,0x51,0xc3,0x87,0x22,0x1e,0x89,0xf5,0x5b,0x41,0xd7,0x34,0x22,0x3c,0xbd,0x29,0xaa,0x54,0xed,0x5a,0x90 +.byte 0x17,0x24,0xba,0x7a,0x46,0x5f,0x54,0x33,0x56,0x7e,0x2d,0x03,0x59,0xcb,0xbb,0x7a,0xce,0xbb,0x8d,0xf7,0xb6,0x38,0x00,0x18,0x6a,0xa1,0x6c,0xdf,0x42,0x49,0x4d,0x9b,0x4f,0xd6,0x85,0x54,0x1f,0xad,0x17,0xdd,0x66,0x0e,0x7c,0x30,0x86,0x82,0x1c,0x5a,0x81,0x08,0x55,0x51,0x5b,0x06,0x54,0x52,0x3e,0x8b,0x6e,0x72,0x92,0xd2,0x05,0x5d +.byte 0xe4,0xe8,0x0e,0x62,0x1d,0xec,0xb1,0x7f,0x42,0x05,0xd5,0xd3,0x60,0xd4,0xdc,0xa4,0x48,0xc0,0xf0,0x89,0xef,0x5b,0xae,0x5f,0xcd,0xf0,0x62,0xaa,0x3e,0xd5,0x1a,0xbe,0xe3,0x08,0xd5,0xe8,0x00,0x21,0x8c,0x0b,0x0c,0x8e,0x24,0xac,0xb2,0xea,0x44,0x9f,0xce,0x53,0x45,0x9a,0x85,0x67,0x99,0x85,0xea,0x92,0xa7,0x1d,0x86,0xb4,0x3b,0x22 +.byte 0xa2,0xcd,0x35,0x65,0xb5,0xa6,0xdb,0x6d,0x48,0xd1,0xa4,0x76,0x0c,0x00,0x30,0x62,0x86,0x06,0xda,0xa8,0xfe,0xec,0x70,0x87,0x4a,0xe8,0x2e,0x4d,0xe3,0x94,0x0b,0xdf,0x81,0xcd,0xfe,0x23,0x79,0x2c,0x2b,0xae,0xf7,0x75,0x49,0x47,0x24,0x46,0x09,0x10,0x62,0x39,0x3b,0x50,0xf1,0xfa,0xf7,0x5f,0xe4,0x7c,0xa5,0xc0,0x25,0x9e,0x20,0x4d +.byte 0xc8,0x6b,0x93,0xc5,0x4a,0x6b,0x62,0xb8,0x3b,0xe5,0x0d,0x92,0x70,0x26,0xa5,0x2b,0xd0,0x9f,0x03,0x8b,0xd3,0x1a,0xc4,0xb0,0xa3,0xc7,0xf4,0x35,0xe5,0x1d,0xe0,0xaa,0x43,0xab,0x64,0x10,0x2b,0xa4,0x09,0x42,0xee,0xba,0xb7,0xbf,0xfd,0xa6,0xff,0x76,0xe5,0x12,0xd6,0x50,0x9a,0x26,0x6b,0x3a,0xd3,0xe6,0x7d,0x3e,0x0e,0x9b,0x95,0xd7 +.byte 0xbf,0xb6,0x7e,0xfb,0x3c,0x24,0xa4,0x26,0x98,0x88,0x81,0xf4,0x56,0xa4,0xf7,0xe8,0x87,0x15,0x5e,0x9f,0x84,0xdd,0x04,0x66,0x43,0xd8,0x76,0xc2,0xa3,0xfd,0x4b,0x58,0x09,0x06,0xa6,0x60,0x5c,0x3f,0x75,0x80,0xd7,0xc4,0x29,0xf9,0x0b,0x1e,0x4d,0xe5,0x26,0xf6,0xae,0x7a,0xc1,0x05,0xf3,0xf1,0x6c,0xee,0xed,0x56,0x0b,0x51,0x66,0xbe +.byte 0x99,0xec,0x9c,0xc2,0x97,0xe2,0xed,0x09,0x1d,0xa8,0x18,0xaa,0x1c,0x9e,0x20,0x62,0xb1,0x80,0x68,0x3e,0x28,0x1f,0x4f,0x50,0x0e,0x41,0xaf,0x17,0x44,0x79,0x16,0xca,0x17,0xe9,0x13,0x66,0x0a,0x04,0x68,0x41,0xe2,0x1d,0xc7,0x00,0x1e,0x66,0xa3,0x6c,0x2d,0x52,0x8c,0x0b,0x7c,0x03,0x48,0x73,0x3b,0xa9,0x84,0xe5,0x31,0x12,0x0f,0xe8 +.byte 0x1e,0x58,0x4d,0xd0,0x1b,0xb7,0xcf,0x75,0xd5,0x2c,0xca,0x33,0x17,0x95,0x9c,0x30,0xc7,0x7f,0xe9,0xde,0xae,0x19,0x72,0x00,0x2a,0xf5,0xde,0x93,0x3f,0xf5,0x44,0xe5,0xf8,0xc7,0xeb,0x1a,0x5d,0x5b,0x11,0x30,0x09,0xf5,0x49,0x66,0x70,0x1a,0xd5,0xe6,0xfc,0xe6,0x59,0x3d,0x17,0x6c,0xb5,0x0c,0xdf,0x1e,0x9c,0x48,0xd1,0xde,0x12,0xd6 +.byte 0xc8,0x48,0xc8,0x73,0x6d,0xfc,0xec,0x07,0xce,0x02,0xe5,0xb3,0x18,0xb9,0x55,0x4d,0x64,0x07,0xf3,0xaa,0x3c,0xf1,0x71,0x22,0x31,0xbb,0x74,0x2c,0x9f,0x7b,0x68,0x9d,0x80,0x49,0x32,0x48,0x9b,0x54,0xf3,0x74,0x37,0xac,0x4e,0xb2,0x96,0xdf,0x9d,0xeb,0x43,0xe0,0xd0,0xa0,0xe3,0x77,0xbd,0x8b,0x92,0x95,0x9d,0x63,0x8d,0xa8,0x23,0x07 +.byte 0xb0,0xcb,0x9d,0x8d,0x3f,0xe2,0xd5,0x81,0x6a,0xe5,0xc2,0xfe,0xda,0x1c,0x25,0x25,0x5b,0xa8,0xad,0x06,0xec,0x0d,0x4b,0x68,0xc3,0x45,0x81,0x38,0xb0,0x22,0x71,0xa4,0x2b,0xf3,0xa6,0x05,0xae,0x0c,0x48,0x94,0x0d,0x3d,0x48,0x51,0x76,0xdf,0x79,0x66,0x0e,0x28,0xc0,0xc1,0x6f,0xc8,0x8f,0xf7,0x7d,0x37,0x06,0xa2,0x8a,0x3a,0x6b,0xab +.byte 0xe0,0x55,0x8e,0xec,0x89,0xe2,0xca,0xc4,0x01,0x03,0x5d,0xa1,0x84,0x21,0x44,0xbb,0x6b,0x36,0x63,0x57,0x4f,0x54,0x88,0x81,0xbe,0xf8,0x53,0xf7,0x57,0xee,0x30,0x85,0x03,0x11,0x86,0xff,0xe4,0xd6,0xc4,0xf0,0x3c,0xcf,0xfd,0x38,0xd8,0xcb,0xd0,0x96,0x03,0xf2,0xc7,0xfa,0x18,0xc8,0x1b,0xe6,0x77,0x3c,0x61,0xa9,0x14,0xdb,0xb4,0x5c +.byte 0x2d,0xee,0xd7,0xe8,0xc4,0x0c,0x69,0x0c,0x55,0xe2,0x99,0x4b,0xc4,0x89,0xc8,0xee,0x48,0x0e,0x16,0xd7,0xa4,0x78,0x25,0xda,0xd3,0xa8,0xac,0x89,0x66,0x67,0x0d,0x51,0x21,0x0e,0x91,0xfb,0xb5,0xab,0x33,0xcb,0x3e,0xc7,0x0f,0x03,0x22,0x51,0x71,0x03,0xa0,0x3c,0xa9,0x35,0xcb,0x40,0xa7,0xbe,0xe7,0xc3,0x51,0x43,0xd8,0x9a,0x24,0xb7 +.byte 0x7e,0xfb,0x26,0x8d,0xa5,0x1a,0x6b,0xe7,0x97,0xe4,0xdd,0xc0,0x3e,0x98,0x67,0x55,0x79,0x56,0xb9,0x7e,0x25,0x4c,0x5c,0x5a,0x47,0x0a,0xce,0xb6,0x4d,0x2c,0x69,0x73,0xaa,0xf0,0x12,0xbb,0x9d,0xe1,0x60,0xc4,0x5b,0x10,0x32,0x6d,0x89,0x54,0xb1,0xfe,0x36,0xbe,0xb2,0x60,0x9a,0x91,0x73,0x9c,0x32,0x61,0xad,0x9a,0xf7,0x56,0x5f,0x5a +.byte 0x54,0xaf,0xb2,0x0c,0x5b,0x1a,0xe6,0x98,0x94,0xed,0x69,0x0b,0x8d,0x06,0x87,0xc9,0x20,0xdc,0x92,0x2d,0x5e,0xba,0xbb,0x15,0xef,0xc1,0x07,0x18,0x44,0x3f,0xf4,0x48,0x3e,0x7b,0xa4,0x9e,0x14,0x6b,0x97,0xdd,0x68,0x33,0x18,0xdd,0x47,0x08,0xa6,0x3b,0x8d,0x79,0x58,0x92,0xd9,0xda,0x82,0x34,0xa7,0x99,0xbc,0x43,0xa3,0x0a,0x7e,0x85 +.byte 0x0b,0xab,0x0e,0xc2,0x94,0x22,0x2d,0x05,0x99,0x9d,0x5c,0xc7,0xb2,0x7b,0x18,0x3e,0xb2,0xdd,0x47,0xb3,0xd7,0xcf,0x19,0xc7,0x55,0x5e,0x64,0xd8,0x7b,0xb4,0xf6,0x11,0x72,0xed,0xbd,0xfc,0xd8,0xe9,0x9f,0xcd,0x9a,0xeb,0xb2,0x6c,0x04,0xb9,0x88,0xf7,0x60,0x68,0xc3,0xf2,0xfd,0xa0,0x8c,0x82,0xc5,0xf7,0x5d,0xc3,0x9a,0x1e,0x49,0x27 +.byte 0x69,0x35,0xb0,0x8f,0xe9,0xb3,0xe4,0x09,0xd8,0x1a,0x73,0x9e,0x56,0x41,0xfa,0xe0,0x94,0x9e,0x0e,0x65,0xe6,0x5b,0xe2,0x12,0x39,0xca,0x86,0x0c,0xae,0xee,0x24,0x58,0xfd,0x85,0x09,0x7a,0xad,0x54,0xde,0xda,0x06,0x73,0x7d,0x11,0x7e,0x91,0x44,0xf3,0x4b,0x61,0xce,0x8a,0xff,0x76,0x92,0x2e,0x43,0x52,0xcf,0x63,0x3f,0xc4,0x1f,0x7f +.byte 0x4d,0x67,0x21,0xed,0xd7,0x88,0xdb,0x36,0x56,0x11,0xb2,0x3b,0xee,0x5f,0x2d,0x5f,0x17,0x98,0xa1,0xd5,0xcc,0x82,0xfd,0xc2,0x56,0x69,0xaa,0x68,0x86,0xaf,0x48,0x77,0xba,0xe9,0xd9,0x42,0xcd,0xaa,0xe3,0xad,0x2b,0x17,0xef,0xd3,0x54,0xc5,0x4e,0x31,0x0b,0x14,0xb7,0x73,0xc1,0x6f,0xc3,0x06,0x41,0x1a,0x11,0x19,0x9f,0xe9,0x9f,0x61 +.byte 0x4f,0x13,0x9b,0x3e,0xcd,0x7c,0xd6,0x2a,0xb3,0x87,0x84,0x58,0x58,0x10,0x1f,0xa0,0x2e,0x5c,0x15,0x8b,0x5e,0x37,0xd4,0x22,0x93,0xd9,0x67,0xe1,0xa8,0x35,0xe2,0x95,0xd8,0x4c,0x2c,0x65,0xc9,0x21,0xaf,0xf9,0xdd,0x3d,0x2c,0x0e,0x0c,0xcc,0x6b,0xad,0xb3,0x6d,0xd2,0x3e,0x65,0x8e,0x82,0x70,0x41,0xd6,0xaa,0x97,0xab,0x38,0x78,0xe4 +.byte 0x62,0x7c,0x5f,0x22,0xa3,0x1e,0xf2,0x6c,0xfe,0x3c,0xa9,0xb5,0x57,0xcd,0x96,0x11,0xd0,0x8b,0xcf,0x6d,0x06,0xcf,0x7c,0xda,0x1d,0xe4,0x22,0x5c,0x5d,0x9f,0xa8,0x24,0x55,0x45,0x93,0xc6,0xeb,0xfc,0xb5,0x71,0x5a,0x1d,0x52,0x40,0x95,0xc7,0x76,0x32,0xfb,0x2b,0x0c,0x7d,0x64,0xfa,0x5b,0x5e,0x7a,0x3b,0x0b,0xa0,0x99,0x5d,0x19,0x16 +.byte 0xe4,0x8e,0xae,0x49,0xee,0xc5,0xb2,0x24,0xd7,0x0b,0xa4,0x20,0xa6,0x74,0xc4,0x36,0x1d,0x43,0x25,0xd6,0x71,0x54,0x69,0x79,0xea,0xa3,0xd5,0xe9,0x75,0x53,0xcf,0x99,0x4e,0x3b,0xc0,0x52,0x28,0x80,0xe5,0x07,0x65,0x83,0xb3,0x24,0xfe,0x13,0x92,0xd6,0x18,0xf7,0xa3,0xeb,0x9e,0xf0,0xd5,0x69,0x93,0x79,0xda,0xb7,0x2e,0xe2,0x01,0xdd +.byte 0x9a,0xc3,0x7b,0x3b,0x17,0x88,0xe5,0xe9,0x9b,0x46,0x5c,0x5f,0x0e,0x1e,0x80,0x9b,0x11,0x1f,0xa4,0x08,0x90,0x14,0x08,0xb4,0x73,0x32,0x72,0xbe,0x43,0x4f,0x70,0x90,0xe7,0x80,0xdd,0xfd,0xa7,0xea,0x13,0xd9,0x5d,0xae,0x93,0x24,0x2b,0x1e,0xc7,0xf4,0x81,0xbb,0x5f,0xb0,0xb9,0xe4,0x35,0x39,0xf4,0x9a,0x49,0xb5,0xc0,0x47,0x18,0xc3 +.byte 0xcc,0xbe,0x26,0x36,0x44,0x2d,0x65,0x24,0xa3,0x09,0xde,0x69,0x3b,0xb8,0xdc,0x52,0x98,0x2e,0x38,0x5f,0xf7,0xb1,0x84,0xdd,0xea,0xe2,0xe5,0xec,0x96,0x31,0xb1,0x93,0xc0,0x5b,0xc4,0x87,0x4a,0x51,0x58,0x2d,0xea,0x47,0xab,0xfd,0xd3,0x76,0xf1,0xbc,0x52,0xa7,0x94,0x6c,0x74,0x1e,0x84,0x07,0x1f,0x5c,0x18,0xb9,0x06,0x37,0xf0,0xfb +.byte 0xbd,0x5d,0xaf,0xa8,0x06,0xc9,0x86,0xf0,0xd1,0x78,0x84,0x95,0x01,0xdd,0x70,0x9d,0x71,0x51,0xb7,0x80,0x69,0xbe,0xe8,0xfb,0x8f,0x43,0x72,0xd9,0xa9,0xf1,0x90,0xbb,0xf1,0xb5,0xc0,0x75,0x93,0x4e,0x14,0xc5,0x14,0x77,0x59,0xf8,0xe5,0x81,0x11,0x25,0x48,0x51,0x46,0x2a,0x69,0x59,0x92,0xe7,0xa7,0x39,0x96,0xad,0x67,0x30,0xaa,0xb2 +.byte 0x5d,0x95,0x94,0x83,0x83,0x93,0xf3,0x52,0x81,0x1c,0x27,0x78,0x1d,0x19,0x35,0x6e,0x8f,0x16,0xe5,0x3b,0xce,0x80,0x2a,0x3a,0x89,0xb7,0x51,0xfc,0x34,0x24,0xa2,0x61,0x95,0x9e,0xd4,0x69,0xa1,0x2f,0x49,0x16,0x2d,0x12,0x05,0xfe,0x69,0x62,0x12,0xa4,0x2c,0x04,0x7b,0xce,0x3f,0x34,0xc4,0x48,0x1a,0xe6,0x64,0x4b,0x8a,0xbf,0x68,0xdd +.byte 0x54,0x15,0xd3,0x25,0x49,0xdd,0xed,0x5e,0x2c,0x0e,0x25,0xbe,0x77,0xcf,0x94,0xf4,0xe9,0xf3,0xcc,0xe6,0x94,0xf9,0xb2,0x5d,0x24,0x53,0x63,0xbb,0x66,0x8d,0x73,0xef,0x79,0x5c,0x95,0x1a,0x64,0xc3,0xfd,0xc0,0xd3,0x71,0xf4,0x79,0x19,0x79,0xa5,0x30,0xf8,0x2c,0x28,0xc2,0xc2,0x9d,0x12,0x50,0x95,0x38,0xec,0xd5,0xc6,0x28,0x94,0xaa +.byte 0x83,0x66,0x3b,0xe3,0x51,0xc7,0x6a,0x75,0x2a,0x9b,0xb9,0xb0,0xa2,0xe1,0xfd,0xaf,0x58,0xd2,0x4b,0xf4,0x22,0xef,0x77,0x1e,0xa0,0x00,0xd7,0x9e,0x20,0x63,0x87,0x1d,0x98,0xab,0x0e,0x57,0x31,0x4b,0xda,0x90,0x3a,0xe6,0x6e,0x5e,0xd4,0x17,0x06,0x83,0x4f,0x90,0x33,0x1c,0xe5,0xea,0xf7,0x8d,0x95,0xa2,0x1e,0x7d,0x27,0x15,0x49,0x68 +.byte 0x3a,0x54,0xe3,0x1e,0x60,0x72,0x42,0xa6,0x8c,0x5b,0x63,0x1d,0x7d,0xb1,0xe2,0x7e,0x8b,0x19,0xf4,0x25,0x6c,0x77,0x64,0x15,0x5e,0x4c,0xfa,0x35,0x68,0xd2,0x54,0x11,0x5a,0xac,0x85,0xb0,0xb3,0xe8,0xa8,0x70,0x36,0xa8,0xe5,0x04,0xd1,0x82,0xdc,0x62,0x63,0xe6,0x3f,0x86,0x46,0x77,0x08,0x6b,0xa8,0x09,0xd0,0x56,0x09,0x87,0x9c,0x65 +.byte 0x8e,0x53,0xae,0xa6,0x2b,0x59,0x23,0xca,0xe9,0xc7,0xc4,0xb5,0xb9,0xca,0x20,0xf6,0xcc,0x62,0xfd,0xb5,0x66,0x66,0x86,0x99,0xb2,0x5a,0xeb,0xac,0xff,0x22,0xf4,0x94,0x9c,0x6d,0xc9,0xce,0xf3,0x8d,0x26,0x7f,0x06,0x40,0x71,0x8b,0x3e,0x5c,0x3e,0xe6,0x11,0x64,0x91,0x79,0xbe,0x66,0x80,0xd2,0xf6,0x2d,0x28,0x4b,0x6c,0x8d,0x9c,0x5b +.byte 0x1e,0xd1,0x15,0xb0,0xdf,0xfb,0x57,0xaf,0x4a,0xab,0xde,0x12,0xe9,0xb8,0x41,0x3d,0xc3,0xff,0xb2,0xc1,0x86,0xb0,0x06,0x5b,0xaf,0xa4,0x30,0x62,0xd0,0xd8,0x91,0x36,0x28,0xc1,0xc2,0xef,0x60,0x5d,0x42,0x04,0xd5,0x6b,0x10,0xa9,0x6c,0x88,0x5c,0x56,0x59,0x4a,0x87,0xdc,0x7c,0x41,0x03,0xb3,0x7c,0x35,0x8c,0x52,0x0e,0xc1,0xd5,0xdf +.byte 0x9b,0x8a,0x2e,0xc2,0x6b,0x06,0x7f,0xb4,0x93,0xc9,0x52,0xd0,0xc5,0x57,0x78,0x9e,0xf9,0x08,0x36,0xbc,0x4b,0xc1,0xbd,0x71,0x35,0xf8,0x73,0xae,0x9c,0xbc,0xf1,0xd1,0xba,0xe3,0x7f,0x49,0x9b,0x9b,0xb3,0xe2,0x7d,0x7d,0x18,0x6d,0x0d,0x96,0xe3,0x50,0x28,0xf2,0x7c,0x7a,0x71,0x27,0x33,0x3c,0xd3,0xeb,0x3d,0x5a,0x79,0xb5,0x69,0xed +.byte 0x40,0x38,0xbe,0xc9,0xad,0x11,0x7b,0x9d,0xe6,0x71,0xc8,0x89,0x54,0x51,0xf0,0x8f,0xdc,0xad,0x96,0xc3,0x04,0x60,0x5f,0x6d,0xa0,0x37,0xba,0x1c,0x69,0xca,0x42,0x26,0xeb,0x31,0x34,0x8d,0xae,0x25,0xe2,0x29,0x8d,0x19,0x9f,0xfa,0x75,0x91,0x4b,0x51,0xcd,0x76,0xd6,0x8f,0xa2,0x40,0x79,0xc3,0xbb,0x61,0xaf,0xc4,0x69,0xf5,0x8b,0x8a +.byte 0xb6,0x2c,0x25,0xb9,0x3c,0x8e,0x13,0xa4,0x0f,0x52,0x72,0x11,0x4b,0x89,0x63,0x01,0x05,0x54,0xd5,0x0d,0x5f,0x91,0x59,0x84,0x64,0xac,0xf7,0x9c,0xa3,0x48,0x31,0x4a,0x2e,0xea,0xf8,0xf8,0x0e,0xf0,0xd9,0x4d,0x06,0x60,0x11,0x4a,0x72,0x6f,0x93,0x93,0x85,0xf0,0x20,0x55,0x8b,0x37,0xf1,0x29,0x92,0x2d,0x1f,0xa1,0x6c,0x7c,0x90,0x4f +.byte 0xdb,0x78,0xcc,0x6c,0xb2,0x14,0x85,0x07,0x34,0xc8,0x98,0x18,0x52,0x2d,0x6b,0x13,0x63,0xc5,0x31,0x20,0x8e,0xa9,0x88,0x6b,0xb3,0x3f,0x1a,0x68,0x2f,0xf9,0xf3,0x97,0x29,0x68,0x22,0x89,0xb0,0x45,0xc4,0xf4,0x1f,0x31,0xba,0x97,0x14,0x59,0xae,0x05,0xe0,0x99,0x5b,0x29,0xcf,0xe3,0xf0,0x2a,0x0c,0xca,0x5f,0xc1,0xe7,0xe7,0x11,0x48 +.byte 0x73,0xc0,0x86,0x0b,0x59,0xc2,0x8a,0xfa,0x44,0x51,0x1c,0x84,0xdf,0x2f,0x4d,0xab,0xca,0xea,0xe1,0x48,0x9a,0xa1,0x86,0x60,0x47,0x7a,0x86,0x30,0x6a,0xba,0xbe,0x6a,0x9b,0x34,0xf4,0x52,0x0e,0xae,0x7f,0xbd,0xe0,0xf4,0x5f,0xfd,0xbc,0x57,0x02,0x95,0x6f,0xad,0x78,0x2e,0xa7,0x46,0x1c,0x2d,0x98,0x40,0xb7,0xfa,0xb5,0x08,0xee,0xb5 +.byte 0x25,0x51,0xaa,0x1a,0x14,0x41,0x48,0xe0,0x8f,0xe7,0x2f,0xfc,0xfd,0x47,0x10,0x55,0x90,0x02,0xeb,0x7f,0x0d,0x40,0xa8,0x4b,0x82,0xdc,0xab,0x43,0x35,0x62,0xa1,0x1d,0x5a,0xb0,0xc0,0x93,0x75,0x3d,0x68,0xd9,0xf8,0x31,0x22,0xfd,0x30,0xda,0xea,0xea,0x7c,0x30,0xf8,0x6f,0x75,0x5f,0x07,0x39,0xfe,0x69,0x93,0x73,0x22,0xa2,0x72,0xed +.byte 0x39,0x2f,0x00,0x5c,0xc3,0x14,0x86,0x90,0xda,0xc9,0x09,0x43,0x80,0x85,0x22,0x98,0xb0,0x4e,0x05,0x47,0x8f,0xc7,0xba,0x2e,0x4c,0x8f,0x57,0x8a,0xe9,0xb0,0x97,0x3b,0x51,0x12,0xcb,0x88,0xfd,0x5e,0x7f,0xa6,0xc6,0x00,0xd0,0x3a,0x3a,0x70,0x9e,0x56,0x28,0xa0,0x08,0x76,0x58,0x57,0x4a,0x0f,0xff,0x31,0x44,0x08,0x6c,0x23,0x79,0xad +.byte 0x35,0x95,0xc5,0xc8,0x26,0x0f,0xb3,0x17,0x04,0x1d,0xde,0x16,0x5d,0xb8,0x71,0x76,0x89,0x0b,0xd6,0xd8,0x9d,0xa1,0xdf,0xcb,0xb5,0x1c,0x86,0xc3,0x15,0x8d,0xaa,0x25,0x82,0xbf,0x6b,0x06,0xfb,0x1b,0xf5,0x11,0xaa,0x14,0x0e,0x67,0x7f,0xbd,0x46,0x21,0x8f,0x6d,0xbd,0x63,0xe6,0x14,0x05,0xa2,0xee,0x56,0xee,0xe6,0x37,0xf9,0xc0,0x2f +.byte 0xc9,0xe0,0x8e,0xdb,0xf7,0xf6,0xcb,0x83,0x79,0xcc,0xe3,0xf6,0x30,0x9d,0x56,0x31,0x40,0xd2,0x50,0x25,0xb6,0x89,0x16,0x97,0x65,0xd8,0x8d,0x1a,0xa5,0xf4,0x47,0xfc,0x4c,0x73,0x07,0x42,0x9c,0x8f,0x7f,0x10,0xb4,0x96,0x33,0x1e,0xe2,0xff,0x0c,0x33,0x35,0xbc,0x37,0x01,0x2b,0x67,0xda,0xca,0xcf,0x87,0xa2,0x38,0x71,0x6b,0xf4,0xcf +.byte 0xa6,0xc6,0x6a,0x90,0x5c,0xa0,0x8b,0x66,0x44,0xc7,0xc2,0x05,0x24,0xee,0x53,0x99,0xf3,0x07,0x78,0xb0,0x17,0xf8,0x11,0xf9,0x52,0x20,0x41,0xc5,0xdb,0x4e,0x92,0xd3,0xeb,0xd2,0x86,0xea,0x9b,0xc3,0x4c,0x1b,0x75,0xcd,0x15,0x0c,0xe0,0x28,0xe9,0xe1,0x99,0x98,0x96,0x33,0x06,0xea,0xa8,0x4e,0xde,0xc1,0x1c,0xfe,0x6c,0xca,0xac,0x6d +.byte 0xc4,0x3a,0x7d,0xd2,0x41,0xf5,0xb3,0x7d,0x1c,0x28,0x93,0x72,0xf8,0x08,0xc1,0x71,0x72,0x4c,0x41,0x68,0x38,0x80,0x2e,0x4b,0xa6,0xc5,0xc7,0xb4,0x24,0x29,0xd0,0xce,0xb2,0x3d,0xc4,0x60,0x5b,0xeb,0x2d,0x80,0x13,0xee,0x95,0x41,0xfe,0x49,0x6d,0x89,0xc0,0x7a,0x61,0x51,0x3f,0xbb,0x24,0x7c,0x64,0x5e,0x9f,0xf7,0x60,0x88,0x95,0xe8 +.byte 0x60,0xc5,0xf6,0xc3,0xc3,0xd4,0x43,0xce,0xf9,0x4e,0x35,0xf2,0xfa,0xb0,0x2b,0xe3,0xfe,0xb8,0x88,0x19,0xf2,0x89,0xc0,0xb5,0x00,0x61,0xc8,0xe5,0xaa,0xde,0x18,0xb4,0xd4,0x21,0xbe,0xcc,0x61,0xc7,0xc9,0xfe,0x22,0xcc,0x65,0xf6,0x79,0xe8,0x4d,0x1c,0x30,0x31,0x7a,0xd4,0xbc,0x98,0x2d,0x72,0x5e,0x5c,0x4f,0x7e,0x52,0x9c,0x95,0x20 +.byte 0x29,0xa4,0x0b,0xf7,0xb2,0x7d,0xcc,0xc3,0x8c,0x94,0xb0,0x09,0xf4,0x6f,0x59,0x63,0x91,0x2a,0x06,0x80,0x09,0x01,0x3c,0x73,0x83,0x42,0xa1,0x5c,0x0f,0x42,0xf4,0x74,0x3c,0x24,0x8c,0xbe,0x91,0x73,0xdf,0xf1,0xea,0x21,0xbd,0xc9,0x36,0x17,0xca,0x81,0x28,0xd9,0x4a,0xc4,0x2e,0xdf,0x4c,0x4f,0xbd,0x1e,0xbc,0xe9,0x32,0x12,0xd3,0x8f +.byte 0x48,0x9b,0x4f,0x49,0x23,0x54,0x15,0x15,0x14,0x8b,0x18,0x64,0x7d,0x08,0x7f,0xc4,0x56,0x01,0x94,0x4e,0x50,0xe8,0xf2,0x4a,0xb5,0x3c,0xa0,0xb5,0xaf,0x55,0x70,0x44,0x41,0x5c,0xe6,0x61,0x5a,0xbb,0xf2,0xe6,0xc9,0x05,0x33,0x45,0x8f,0xbc,0xe5,0x59,0x7f,0x66,0xc5,0x61,0x4d,0x1b,0xc7,0xee,0x45,0x7d,0x57,0x8f,0x6c,0x9d,0x8b,0x87 +.byte 0x98,0xa8,0x58,0xac,0x4a,0x31,0x79,0xd6,0x26,0x08,0x2f,0x28,0x3f,0x31,0x77,0xad,0xff,0xe1,0x9d,0xa8,0xf7,0xe0,0x76,0x66,0x48,0x00,0x52,0xe8,0x9a,0xb2,0x47,0x5e,0x0a,0x87,0x86,0xaf,0xf6,0x7d,0x46,0x78,0x66,0x68,0xf7,0x68,0x0c,0x6f,0x5c,0xd7,0x09,0xc0,0xd7,0x90,0x98,0xe2,0x5c,0x07,0xe9,0xd1,0x58,0x48,0x57,0x9f,0x48,0x99 +.byte 0x87,0xdf,0x06,0xc1,0x35,0x0f,0xd8,0xb0,0xa9,0xfa,0xdc,0x31,0x76,0xd1,0xad,0x47,0x80,0xe4,0x74,0xe0,0xda,0x4b,0x77,0x8b,0x71,0xab,0x9a,0x8e,0xd7,0x6b,0x91,0xb1,0xdb,0x78,0xd2,0x86,0xf7,0x61,0x1b,0xdc,0x34,0x57,0x32,0x51,0xee,0xd3,0xff,0xb2,0x6c,0x6a,0x79,0x90,0x9c,0x1f,0x6b,0xe7,0x43,0x20,0x05,0x4f,0x66,0x83,0xd0,0x56 +.byte 0xe1,0x21,0x63,0xf4,0xd6,0x96,0x91,0xcb,0x51,0x3c,0x13,0x88,0x97,0x26,0x88,0xda,0x7c,0xd4,0x0d,0xcb,0xdf,0xc2,0x7d,0xcd,0x2c,0x0e,0x28,0x23,0x21,0x5f,0xbe,0x5d,0x62,0x58,0x6c,0xa7,0x45,0xae,0x1f,0xac,0x35,0x53,0xdb,0x2c,0xa6,0x71,0xe4,0x11,0x5e,0x59,0xbe,0xd5,0x20,0x2a,0xc4,0xcd,0x4c,0x1b,0xe0,0x38,0xef,0x02,0x0c,0x5f +.byte 0x5a,0x1b,0xf9,0x1e,0x32,0x63,0xd7,0xa6,0x0f,0x1d,0x98,0xd5,0x3a,0x0f,0xf6,0xcc,0xfc,0xd6,0xb4,0x87,0xc5,0x76,0xd8,0x3e,0x72,0xb0,0x20,0xfe,0xb3,0xfc,0x48,0x4c,0xd1,0x71,0xcd,0x13,0xef,0xe8,0x40,0xd9,0x0d,0xf6,0x1d,0x5b,0xa4,0x26,0x56,0x8c,0x66,0xcb,0x18,0x5a,0x5f,0x86,0x43,0x2c,0xa4,0x1e,0x00,0x3f,0x09,0xbf,0x8e,0x61 +.byte 0xad,0x2a,0x44,0x97,0x35,0xb2,0xf3,0x50,0x5f,0xfa,0x01,0x74,0xbf,0x70,0x46,0x38,0xf1,0x15,0xaa,0x04,0xfe,0xe9,0x3f,0x43,0x2f,0x53,0xcb,0xea,0x5c,0x04,0x8e,0xe6,0x43,0xeb,0xc0,0xd9,0xbf,0x4a,0xc1,0xbc,0xf9,0x11,0xd5,0x33,0xdc,0x41,0x8e,0xfe,0x5e,0xf3,0x8c,0x80,0x47,0x46,0x01,0x9e,0xa9,0x2c,0x2d,0xd2,0x90,0x7f,0xce,0x7c +.byte 0x59,0x78,0xaa,0xbb,0x96,0x52,0x0a,0xf3,0x18,0x1f,0x0b,0x41,0xc1,0xd5,0x12,0x14,0x1a,0xe1,0x4e,0xac,0xf8,0x2a,0x56,0xfe,0x66,0x34,0x21,0xdf,0x1f,0x6a,0x02,0x85,0xd2,0x38,0xc0,0x39,0x5c,0xa7,0x3f,0xcc,0x2b,0x6f,0x69,0xe7,0xa7,0x0a,0x36,0xf1,0xa9,0x77,0x59,0x2c,0x44,0x8b,0x72,0xc9,0xc2,0x74,0x32,0x48,0x76,0x19,0x1e,0x49 +.byte 0x10,0xe6,0x46,0xdf,0x82,0x9b,0xad,0x4e,0x40,0x20,0xd7,0xd3,0xf5,0x5c,0xbc,0x25,0x94,0xd1,0x68,0xaf,0x29,0xc5,0xcd,0x1b,0x86,0x4b,0x88,0x21,0x6e,0xeb,0x06,0x14,0xb5,0x15,0xe7,0x26,0x01,0x05,0x4e,0x3a,0x2a,0x24,0xbe,0xf2,0x64,0x6e,0xf4,0x9c,0x60,0xf8,0xd4,0xfd,0x4b,0xc0,0x0e,0x68,0x0d,0x19,0x26,0x87,0xa5,0xbf,0xe1,0x16 +.byte 0xf0,0x27,0x58,0xa8,0x3a,0xed,0x27,0x5b,0x73,0x4f,0x19,0x40,0x58,0x36,0xf6,0xfd,0x60,0x37,0x09,0x74,0x3c,0xb9,0x76,0x9a,0x32,0xfd,0x98,0x79,0x53,0xb3,0xea,0x3a,0x98,0x21,0xf9,0xb2,0x97,0xe4,0x00,0xb6,0xed,0x67,0xc4,0x76,0x8f,0x1e,0x4d,0xc8,0x2e,0xf4,0x54,0xd9,0x09,0xd7,0xcb,0xa0,0x91,0x1e,0x5a,0x60,0x53,0xbc,0x3e,0x35 +.byte 0x69,0xa6,0xca,0xf3,0xce,0x41,0x84,0x71,0xee,0xf3,0x75,0xd4,0x7a,0x71,0x36,0x62,0xe3,0x08,0xae,0x40,0x05,0xde,0x01,0x34,0x92,0x5f,0x71,0xa9,0x08,0xb3,0x43,0xcd,0xe7,0x2f,0x42,0x7e,0x9c,0x1e,0xfe,0x9a,0x40,0x99,0x58,0x31,0xd9,0x8d,0x5d,0xda,0x75,0x14,0x3f,0xae,0x45,0x27,0x85,0x47,0x7d,0x41,0x0e,0x94,0x20,0xee,0x11,0xd0 +.byte 0x1e,0xcd,0x00,0x56,0xb7,0x59,0xe6,0x58,0xab,0x2c,0xa6,0x44,0x14,0x8c,0xff,0x49,0x7b,0xe5,0xf7,0x93,0xd5,0x78,0x1a,0xe0,0x16,0xd8,0x24,0x08,0x1e,0x70,0xce,0x1a,0x84,0x87,0x6b,0xe5,0xf2,0x43,0x5f,0xb3,0x34,0xaa,0x85,0x3e,0x9e,0x2e,0x86,0x22,0x74,0xe2,0x1a,0x87,0xfb,0x1b,0x6c,0x08,0x8c,0x43,0xb4,0x85,0x75,0x2c,0x13,0xc2 +.byte 0x18,0x94,0xe8,0x0d,0x09,0xd5,0x8f,0xd4,0xca,0x50,0x93,0x9f,0xa3,0x9f,0x3b,0x3c,0x54,0x68,0xa9,0xb1,0xdd,0x0a,0x0b,0xe2,0x15,0x92,0x9c,0x6f,0xfa,0x45,0x6f,0x0a,0xb4,0x6b,0xcb,0xdc,0xa4,0xf3,0xf0,0xa6,0x1c,0x8a,0x60,0x42,0x35,0xa8,0xe3,0xdf,0xc8,0xdc,0xbb,0xbe,0x95,0xa7,0xac,0x08,0x08,0xbc,0x56,0x1a,0xa4,0xc2,0xd2,0x53 +.byte 0xfa,0xb2,0x89,0x4f,0xb8,0xe4,0xb9,0x90,0x95,0x91,0x2f,0x0f,0x93,0xa9,0x8c,0xc6,0xf8,0x01,0x34,0x08,0xe6,0x8c,0x58,0x43,0x57,0x40,0xf9,0x78,0x83,0xea,0x92,0x70,0xa8,0xa5,0xc8,0x9e,0xf8,0xc6,0x39,0x4c,0xb4,0xe9,0xbb,0xdf,0xd2,0x52,0x43,0x6b,0x6c,0x8b,0x2c,0x47,0xd7,0x11,0x42,0x3d,0xc7,0x3f,0xce,0xd1,0xd9,0x28,0x5b,0xce +.byte 0xec,0xb6,0x31,0x3a,0xc9,0xad,0x0c,0x93,0x82,0x2b,0xf6,0xdc,0xd4,0xcd,0x80,0xe1,0x75,0x45,0xeb,0x3b,0xbf,0x12,0x42,0xeb,0x71,0xc1,0x8b,0x27,0xd5,0xcb,0xd9,0xb6,0xe8,0xe9,0xc6,0x79,0xff,0x38,0x88,0x87,0x72,0xf2,0x71,0x4a,0x44,0x55,0x0f,0x9c,0x93,0xcf,0x15,0x18,0x44,0x62,0x2a,0xc5,0x0a,0x80,0x69,0x91,0x6e,0x4b,0x30,0x4e +.byte 0x3f,0x2f,0xb5,0x65,0x9e,0x65,0x07,0x36,0x9b,0xba,0x5f,0x81,0xd9,0x60,0xbe,0x1f,0xf5,0x98,0x20,0xf9,0x9e,0x53,0xf7,0x5d,0x57,0x7f,0x22,0xaf,0x8e,0x82,0x9e,0x0f,0x33,0x74,0x37,0x26,0x61,0x67,0xf6,0xfd,0x2c,0xab,0xd8,0x18,0x1d,0x10,0x48,0x7a,0x1d,0xed,0xbb,0x57,0x83,0xf9,0x82,0xf5,0xe3,0xf9,0x98,0x5c,0xc0,0x3e,0xee,0x38 +.byte 0x0a,0x57,0x10,0x22,0xc4,0xe8,0x1d,0xe3,0x46,0xa3,0x81,0x5e,0x92,0xba,0xcc,0x53,0x48,0x85,0x33,0x58,0xa2,0x3e,0xea,0x0a,0xfb,0x72,0x5c,0xcd,0xd9,0xa4,0x3f,0x56,0x99,0x35,0x92,0x6c,0xe8,0xf2,0x59,0x0f,0xc8,0x6a,0x21,0xb2,0x9f,0xa2,0xf6,0xf3,0x1b,0xec,0x38,0x95,0xed,0xef,0x00,0x09,0x16,0x6e,0xf7,0xf8,0x1a,0xef,0x0d,0x2b +.byte 0xef,0x83,0x8a,0xc2,0x22,0x3d,0x50,0xa3,0x70,0x52,0xe8,0xad,0x11,0x44,0x83,0x80,0xfe,0x88,0x7e,0x40,0x02,0x8f,0x4a,0x5d,0xd3,0x28,0x66,0x75,0x5a,0xf2,0x38,0xb5,0xdc,0x54,0xa8,0xb3,0xaa,0x76,0xdb,0x73,0xe0,0xd1,0xd7,0x51,0x20,0x8c,0x38,0x18,0x46,0x25,0x2e,0x0d,0x5b,0x61,0x9d,0x36,0x9a,0x14,0xfb,0xc8,0x4e,0x5a,0xba,0xa1 +.byte 0x98,0x34,0xfd,0x05,0x2c,0x87,0x58,0x8d,0xe3,0x5d,0x79,0x5a,0x45,0xff,0x75,0x25,0x98,0xbd,0xe4,0x9d,0x1a,0x70,0x79,0xaa,0x44,0x1a,0x10,0x7f,0xfb,0xe9,0x30,0x81,0xc7,0xa2,0x81,0x41,0x49,0x41,0x4e,0x42,0x5f,0x8a,0x9b,0x10,0xe2,0xdc,0xd9,0xdf,0xbd,0x61,0x29,0x72,0xa5,0x39,0xb7,0xf6,0x9f,0x4e,0x98,0xb8,0x04,0xae,0xd7,0xda +.byte 0x9a,0x9f,0x08,0xb8,0x2c,0x40,0x14,0x6d,0x01,0xb7,0x86,0x58,0x55,0x42,0xe5,0xdb,0x5f,0x4a,0xef,0xd8,0xed,0xdf,0x3b,0x24,0x1c,0xe4,0xb1,0x73,0xd1,0xce,0x29,0x96,0xde,0x8e,0xf3,0x1d,0x8d,0x75,0x57,0xd3,0x9a,0xf8,0xff,0x1a,0x4c,0x0c,0x47,0x82,0x83,0x73,0x34,0x43,0x55,0xfa,0xf2,0xd4,0x38,0xed,0xde,0x6d,0x24,0x55,0x90,0x06 +.byte 0xd6,0x03,0x52,0x28,0xc7,0x38,0x4a,0x16,0x95,0x4d,0xf4,0x46,0x56,0xf7,0x63,0x1f,0xe4,0xa9,0x51,0xc6,0x0b,0x85,0x42,0x40,0x8e,0x49,0x1e,0xc2,0xab,0xeb,0xda,0x99,0x26,0xf6,0x6e,0x00,0x8f,0x26,0x82,0xef,0x03,0xb0,0xd4,0xdb,0x54,0x46,0xdf,0xdc,0x23,0xaf,0xa8,0x6a,0x9f,0xb7,0xf9,0x41,0x07,0x5e,0x2d,0xcf,0x85,0xfd,0x9c,0x46 +.byte 0x30,0xb9,0x14,0xca,0xe2,0x30,0x12,0x06,0x88,0x08,0x05,0x2c,0x9a,0x4b,0x52,0x98,0xa9,0x99,0xd7,0xca,0xb5,0x1e,0x60,0x44,0xd9,0x5c,0x19,0x42,0xbe,0xa5,0x04,0xfd,0x7a,0xfc,0xb9,0xdf,0xd6,0xe3,0x6d,0x02,0xe3,0x96,0xf6,0xae,0xf3,0x78,0x1d,0x90,0x6d,0x86,0x17,0xf7,0xb7,0x6b,0x1d,0x52,0x32,0x5b,0xc0,0x31,0xaf,0x09,0x90,0x5e +.byte 0x81,0x75,0x17,0x47,0x6b,0x5e,0x9a,0x40,0xa5,0xa8,0x84,0x60,0xdc,0xdb,0xd2,0x89,0xcd,0xb2,0x72,0xf4,0x74,0xda,0x5d,0x34,0xf8,0xc6,0x1b,0x26,0x3e,0x8b,0xc7,0x73,0xf9,0x0c,0x93,0xf4,0x40,0x02,0xe0,0xed,0xe5,0xa0,0xae,0x91,0x03,0x85,0xa8,0x2f,0xe2,0x72,0xfe,0x17,0x7d,0x2b,0xa6,0x39,0x10,0x80,0x4c,0x58,0xaa,0xd8,0x22,0x7d +.byte 0x2f,0xbf,0x0c,0x40,0x48,0xfa,0xbe,0x40,0x4c,0x32,0x96,0x69,0xa5,0xab,0x0b,0x1e,0x33,0x9b,0xcf,0xe6,0x4e,0x2b,0x41,0x5a,0x21,0x23,0xa1,0xbb,0xd3,0xd6,0xd1,0xfd,0xbd,0x55,0xfc,0x92,0x92,0xcb,0x4b,0x72,0x39,0x8b,0xeb,0x72,0xdd,0xf7,0x77,0x43,0x52,0x2f,0x99,0x14,0x6e,0x41,0xce,0x1d,0x57,0x2c,0x09,0xd2,0x18,0xec,0x1b,0x89 +.byte 0xa0,0xe9,0xfe,0x1e,0x41,0xda,0x0f,0x76,0x02,0x38,0xec,0x9a,0x30,0xb7,0x5a,0x54,0x70,0xbc,0xe8,0xfa,0x06,0xd0,0x80,0xfb,0x27,0xd2,0xd8,0x00,0x80,0x65,0x9d,0x23,0xfd,0xad,0x26,0xb8,0xdc,0x09,0x4f,0xfb,0x52,0xcd,0xe4,0x41,0x68,0xca,0xdd,0xbc,0x2a,0x62,0xeb,0xa6,0x32,0x71,0xb0,0x08,0xb6,0x9f,0x3e,0x74,0xfe,0xb0,0xd4,0x9d +.byte 0x9e,0x6c,0x50,0x96,0x8a,0xde,0xd6,0xe9,0xde,0x2c,0xa6,0xf0,0x9f,0x67,0x00,0x50,0x0a,0x8c,0xe5,0xc2,0x37,0xcc,0xf0,0x53,0xeb,0x72,0xf2,0x87,0x77,0xee,0x80,0xe8,0xb2,0xa1,0x13,0x52,0x70,0xe6,0x8f,0x70,0x17,0x90,0x60,0xcb,0xac,0xb2,0x72,0xef,0xd9,0xb5,0xc3,0x68,0x57,0xdf,0x2d,0xcb,0x5a,0x35,0xf9,0x2e,0xfb,0xef,0x6e,0x77 +.byte 0x5d,0x21,0x37,0x4b,0x36,0x9b,0x3f,0x03,0x65,0xc9,0x84,0xb1,0x12,0x99,0xd1,0x6b,0x00,0x71,0x37,0xc7,0x57,0x82,0x44,0x7f,0xe1,0x81,0x24,0x70,0x96,0xd5,0x27,0xba,0x36,0xf7,0x25,0xc6,0x1c,0x7c,0x1b,0xdb,0xa3,0x6a,0x3e,0xb9,0x69,0x78,0xf7,0x51,0x46,0xe2,0x74,0xd3,0xfc,0xef,0x58,0x63,0x53,0x1d,0xd7,0xd0,0x8a,0x6a,0xd3,0xb0 +.byte 0xb9,0xbb,0xba,0x43,0xbf,0x8b,0x6b,0x04,0xd2,0xb1,0xe8,0xd1,0x72,0x3f,0xdc,0x2b,0x01,0xa6,0x2f,0x9c,0x7d,0x65,0xa1,0x9f,0x9b,0x4d,0x70,0x26,0x11,0x4c,0xb2,0xe1,0x01,0x0e,0x78,0xf2,0x32,0x87,0x2d,0x8e,0x95,0x02,0x76,0xca,0xe5,0x71,0x5f,0x36,0x35,0xb9,0xbb,0xc3,0xdf,0xf3,0x1e,0x1a,0x7a,0xe4,0x2c,0xdf,0x64,0x5d,0x96,0x12 +.byte 0xea,0x5c,0x14,0x73,0xa0,0xf1,0xbc,0xa9,0x6e,0x30,0x8a,0x47,0xf0,0x4b,0x9b,0x4c,0xc5,0xb0,0xbe,0x15,0x32,0x1b,0xde,0x0c,0x39,0x6a,0x6d,0x4e,0x3b,0x69,0x4c,0xb4,0x1f,0x56,0xf0,0xa1,0xb1,0x8c,0x29,0x5c,0x87,0x54,0xf2,0x5b,0x51,0x03,0x20,0x70,0x90,0x38,0x66,0x07,0xcc,0xd7,0xde,0x96,0x40,0x82,0xee,0xb5,0x87,0x2a,0x86,0xec +.byte 0x66,0x09,0xb7,0x4a,0xfe,0x4e,0x92,0x89,0x07,0xde,0x35,0xc4,0x6e,0x91,0x25,0xfd,0x18,0xfa,0xd9,0x8f,0xa7,0xa6,0xa7,0x6b,0x32,0xba,0xd3,0x1c,0x90,0xb9,0x8a,0x6c,0x9f,0x3f,0xb5,0x16,0x81,0x81,0xee,0xd7,0x55,0xc1,0x41,0x62,0xfd,0xe9,0x4c,0x5d,0xd7,0x70,0xdd,0xc6,0x4a,0x2b,0x42,0x77,0xe7,0x74,0xed,0x02,0x80,0x0d,0x7c,0x73 +.byte 0x8e,0xf0,0xd3,0xb0,0x20,0xbb,0xc8,0x82,0x06,0xdd,0x56,0x64,0xcb,0x9c,0xda,0xa1,0xa9,0x92,0xbc,0x8c,0x65,0x03,0xcd,0x68,0x87,0xa2,0x94,0x41,0x3c,0x36,0x96,0x1f,0xa4,0xd2,0x6d,0x5d,0x9f,0x2d,0x0c,0xf9,0x8a,0x82,0x19,0x93,0x47,0x62,0x71,0x8e,0x59,0xaa,0xf1,0x87,0xe0,0xb8,0xab,0x10,0x7f,0x4e,0xa8,0xa3,0xe2,0x32,0x58,0xb0 +.byte 0xcf,0x12,0xc0,0xf8,0x94,0x4a,0x61,0x36,0xdc,0x2d,0xb5,0x91,0xf9,0x0f,0x7d,0x91,0xd3,0xc7,0x03,0x8a,0xae,0x5c,0x22,0x8c,0x60,0x30,0xf4,0x71,0x51,0x00,0xf5,0x5d,0xe9,0x37,0x6c,0xae,0x64,0xff,0x45,0x35,0x4b,0x47,0x08,0xca,0xda,0x7b,0xe9,0xef,0xcb,0x27,0xcb,0x7e,0x3c,0xa6,0xd2,0x38,0x54,0x74,0xc3,0x7c,0xf8,0x71,0xb7,0x47 +.byte 0xe9,0xe0,0x43,0x03,0x3b,0x41,0x57,0xc3,0xda,0xa1,0xcb,0x64,0xb1,0x31,0x0d,0x12,0x45,0x3a,0xa0,0xad,0x6b,0xc7,0x26,0x62,0x50,0xcf,0x94,0x5a,0x30,0x8d,0xf6,0x91,0x49,0x9e,0xd5,0x84,0x0e,0x0c,0xe3,0x47,0x08,0x7f,0xa1,0x54,0x78,0x1b,0xa8,0x2c,0xbc,0x12,0x4f,0x7e,0x53,0x1b,0xca,0xfb,0x09,0x35,0xe0,0x9c,0x15,0xea,0xf6,0x3e +.byte 0xb2,0x20,0x9e,0x2c,0x81,0x6f,0xa4,0xb5,0x6b,0x04,0x6d,0xd1,0x90,0x66,0x46,0xdc,0x4b,0x71,0x7e,0x4b,0x3f,0xd6,0xe1,0xa8,0xc0,0xa7,0x45,0x85,0xe3,0x98,0x30,0xda,0x23,0x68,0x55,0xd8,0x96,0xb1,0xcc,0xeb,0xe1,0x95,0x0b,0x20,0xf3,0x4c,0xf2,0xc5,0xfa,0x0e,0xca,0xf5,0xc9,0xb3,0xd7,0xb4,0x1b,0x9f,0xef,0x82,0x56,0x4c,0xc5,0xa5 +.byte 0x21,0xda,0xcc,0x19,0x69,0x68,0xcb,0x37,0xb2,0x0c,0x73,0xb1,0x13,0x61,0x6b,0xca,0xda,0xfc,0xf7,0x1c,0xbc,0xd1,0x72,0x56,0xb8,0x7d,0xa1,0xef,0xc4,0x32,0x38,0xa3,0xdb,0x8b,0x2d,0x0a,0xce,0xcb,0x86,0x51,0x60,0xd2,0x47,0xf0,0x97,0x58,0xd8,0xa5,0x12,0x77,0xfc,0x32,0x04,0x29,0x61,0xfc,0xab,0xc2,0x42,0x86,0xd9,0x57,0x80,0xad +.byte 0x00,0xf0,0x9a,0x2a,0xac,0x52,0x27,0xd6,0xf8,0xd6,0x38,0xc8,0xfc,0xc1,0xab,0x4f,0x41,0xbf,0x8e,0x60,0x20,0xeb,0x24,0x36,0xd8,0xd8,0x25,0x6f,0xc8,0x5d,0x6b,0x00,0xdd,0x7a,0xe2,0x37,0xe4,0x13,0xd0,0xaa,0x5c,0x56,0x32,0x98,0x00,0x4b,0x8a,0x81,0xb1,0xfa,0xe8,0xf3,0xfa,0x0d,0xbb,0x66,0x6e,0x24,0xfd,0x3c,0x50,0x63,0x3a,0xf1 +.byte 0x72,0x63,0x18,0x71,0x6d,0xee,0x6f,0xf1,0x0e,0x1f,0x9e,0x9d,0x87,0x12,0x5c,0xdf,0x1d,0x9e,0xc0,0x0b,0x39,0x0e,0xd6,0x56,0x79,0x30,0xcb,0x07,0x7b,0x88,0xa5,0xbe,0xfd,0xd4,0x49,0xcc,0x92,0x6a,0xcc,0x78,0x1e,0xaf,0xee,0x89,0xc8,0x51,0x08,0x98,0x14,0x20,0xe5,0x52,0x93,0x18,0x6f,0xbb,0xdc,0xb2,0x68,0x14,0xd1,0xdb,0xe8,0x56 +.byte 0x24,0xd0,0x34,0xab,0xa6,0xfa,0xfe,0x72,0x5a,0xe3,0xe1,0x87,0x0d,0xf4,0xfa,0xa6,0xa6,0x6c,0xb6,0xcb,0xf8,0xfc,0x59,0xac,0xd9,0xb0,0xcd,0x15,0xa4,0x37,0x73,0x6e,0x70,0xc9,0x74,0xef,0x87,0x78,0x61,0xc2,0xd0,0x52,0x51,0xa9,0x2c,0xdb,0x9d,0xd9,0x3d,0xac,0xcd,0x52,0x39,0x69,0x2d,0x2a,0x4f,0xf3,0xb2,0x69,0xb9,0x01,0x3c,0x57 +.byte 0xeb,0x1b,0x0e,0x87,0xe9,0x42,0x58,0x83,0x6b,0xbc,0x72,0xc8,0x46,0x32,0x42,0x17,0x6a,0x19,0xa0,0xb3,0xf1,0x1c,0x96,0x9c,0x11,0x09,0x8b,0xc1,0x9e,0xe9,0x7f,0x18,0x8e,0xca,0xea,0x24,0x1b,0xce,0x12,0x57,0x1d,0x34,0xbe,0x60,0x60,0x2c,0xd8,0xa0,0x61,0x73,0xd6,0xf8,0xaf,0x15,0x26,0x84,0xd7,0xec,0xc0,0xbe,0x7e,0xa1,0xa8,0xba +.byte 0x2b,0xcc,0x20,0x67,0x6e,0xea,0x48,0x79,0x23,0xea,0x14,0x36,0x85,0x0a,0x56,0x3a,0xcd,0x5b,0x51,0xa4,0xf5,0x92,0x49,0xc2,0x55,0x62,0xed,0x88,0xde,0xd0,0x0c,0x01,0x36,0xb9,0x2e,0x94,0x80,0x75,0x8a,0x21,0x0a,0x07,0x45,0x68,0xd8,0x9d,0x49,0x7b,0xa7,0xb2,0x84,0xfa,0x3c,0xc4,0xd5,0x59,0xf9,0xc3,0xff,0xcf,0xe4,0x5f,0xea,0xbb +.byte 0x0f,0xae,0x7d,0x96,0xd3,0xe9,0x38,0xd1,0xb1,0x02,0xf6,0x4b,0x95,0x43,0x1c,0x69,0xa6,0x99,0xf5,0xdb,0x46,0x62,0xea,0x69,0x5a,0x08,0x2d,0x01,0x11,0xed,0x70,0x03,0x60,0x54,0xba,0x32,0x2c,0x0e,0x44,0x1f,0x8d,0xee,0x2e,0x39,0xab,0xc0,0xd4,0x88,0x11,0xef,0x07,0x3a,0x47,0xb9,0x6e,0x0c,0x22,0x9a,0xf3,0x89,0x01,0xfb,0xb8,0x2d +.byte 0x52,0xa0,0x42,0x4c,0xb3,0x9e,0xf5,0x4b,0x0c,0x78,0x0a,0x3b,0x29,0xae,0x4a,0xc0,0xb2,0xa3,0xc0,0x0d,0x38,0x07,0x49,0x9c,0xda,0x7c,0x48,0x81,0xba,0x53,0x0d,0x0d,0x78,0x8c,0xac,0x9b,0x3d,0x1f,0xaa,0xc1,0x32,0x54,0xca,0x54,0xe1,0xef,0x46,0x82,0x61,0xd0,0x88,0x04,0x53,0xb0,0x34,0xc2,0x23,0x9a,0x90,0xe3,0x73,0x9c,0x0d,0x46 +.byte 0x61,0xe5,0xc0,0x42,0x87,0x4a,0x3b,0x3a,0xf9,0xab,0xbe,0x4c,0xba,0x2f,0x88,0x03,0x6b,0x52,0x25,0x8c,0x9b,0xc0,0x13,0xb6,0x80,0x09,0x85,0x97,0x64,0x6d,0x65,0xcd,0x18,0x42,0x00,0xdf,0x76,0x4d,0x67,0xbf,0x04,0x7a,0x5f,0x7e,0x3a,0x5c,0x6f,0x1d,0x12,0x5b,0xbe,0xd2,0xc8,0xe5,0x09,0x45,0x4d,0xae,0xed,0xd8,0x77,0xc5,0x6f,0xb6 +.byte 0x43,0x09,0xe2,0xee,0xc9,0x5a,0x76,0xc5,0xeb,0xdd,0x96,0x23,0xb9,0xe5,0xfc,0xf2,0x3c,0xe1,0x67,0x5f,0x1b,0x10,0x39,0x47,0x67,0x8b,0x48,0x32,0xd0,0xbc,0xa0,0xa8,0x3e,0xc3,0x30,0x21,0x18,0x54,0x49,0xfe,0x8a,0x14,0x7a,0xe5,0x6e,0xbe,0x70,0xec,0xf6,0x97,0xa0,0xa4,0xf4,0xdd,0xaf,0xf2,0xde,0x50,0x1a,0x68,0xb9,0x1a,0x4b,0x37 +.byte 0xf8,0x29,0x16,0x4f,0x8c,0xa5,0x9e,0xd2,0x72,0x7f,0xf6,0x6b,0x7d,0xac,0xe4,0x17,0x93,0x39,0x8f,0xd9,0xdf,0x50,0x1f,0xce,0xf5,0x58,0xdd,0xcd,0xc2,0xb9,0x64,0xfc,0xad,0x8a,0x3c,0x2e,0x52,0x58,0x91,0x3b,0x78,0xb4,0xfd,0x4a,0x3b,0x13,0x5d,0x20,0xd5,0xdf,0xe7,0x52,0x3d,0x4c,0x2f,0x02,0x30,0xfc,0x24,0x17,0x99,0x6e,0x4b,0xfe +.byte 0x1d,0xf0,0xe6,0x86,0x32,0x37,0xb5,0xd5,0x09,0xa3,0xa5,0x3b,0xc1,0x88,0x9f,0x01,0x57,0x12,0x03,0x1d,0x60,0xd8,0x57,0xba,0xc6,0xfc,0xda,0xab,0x02,0xbe,0xab,0x89,0xf9,0x08,0x63,0xbd,0x42,0x11,0xf7,0xbf,0xd3,0x45,0x2b,0xa5,0x34,0x91,0x18,0xb9,0xb3,0x79,0xb4,0x15,0xa1,0x01,0x1a,0xf9,0x74,0x91,0x08,0x94,0xb2,0xf3,0xb2,0xca +.byte 0x0a,0x3a,0x4f,0x42,0x8a,0x16,0xf7,0x9e,0xbf,0x27,0x72,0x7b,0xff,0xd3,0xb9,0x4e,0xf5,0x8e,0x68,0xb5,0x91,0x23,0xef,0xeb,0x5d,0x7d,0xd8,0xc9,0xda,0x07,0x33,0xc9,0x1c,0x4a,0x7a,0xf2,0x72,0x64,0xb3,0x35,0x2e,0x54,0xec,0xc4,0xd9,0xee,0xea,0xda,0xfe,0x8b,0x1c,0x21,0x93,0x52,0x95,0x7c,0x2d,0xfe,0x56,0x05,0xdd,0x57,0x37,0xf2 +.byte 0x54,0x1c,0xe2,0x6c,0xc0,0xaa,0x71,0x67,0xdd,0x73,0x43,0x17,0x3e,0x76,0xdb,0x60,0xb4,0x66,0x62,0xc7,0x74,0x08,0x91,0x1f,0xd5,0x4c,0xa9,0xd0,0x34,0x33,0xea,0xb0,0x2c,0x0a,0x88,0xda,0xf7,0xca,0x91,0xf6,0x5f,0x9e,0x72,0xf6,0x18,0xf9,0x19,0x9d,0x84,0xf8,0x4c,0xe1,0xeb,0x45,0x29,0xaa,0xf2,0xa6,0xfd,0x64,0xf9,0x0b,0xfe,0x09 +.byte 0x1c,0xc2,0xde,0x19,0xdd,0x0f,0x02,0x16,0x65,0x70,0x33,0xd4,0x32,0x67,0x7b,0xc4,0xbb,0x11,0x60,0x4f,0xc3,0x4d,0x29,0x23,0x7e,0x84,0x58,0x51,0x43,0x7e,0x25,0x4f,0x3d,0xd4,0xe0,0x20,0x79,0xfd,0xce,0x59,0x49,0xf8,0xd1,0x53,0xca,0x2d,0x66,0xec,0xe5,0x7f,0xc8,0x14,0x06,0xc1,0x96,0x40,0xf2,0x61,0xa7,0x1b,0xf9,0x5e,0x97,0xfe +.byte 0x62,0x57,0x05,0xcc,0x6f,0x26,0x4b,0xa6,0x40,0x33,0x72,0x20,0xd3,0x1e,0x2b,0xb2,0x60,0xe7,0x56,0xda,0x87,0xd3,0xb4,0x5a,0x73,0x04,0xc9,0xc2,0x68,0xe3,0x18,0x74,0xd9,0x46,0x74,0x31,0xf4,0xf4,0xab,0xc4,0x0a,0xbc,0x66,0x4e,0x23,0x5f,0x92,0x7c,0x0a,0x81,0xdd,0xcc,0x79,0xee,0xb3,0x3d,0xc0,0x91,0x81,0xd0,0x79,0x39,0xd2,0x69 +.byte 0x5d,0xdc,0xc1,0x5c,0x61,0xb9,0x5e,0x87,0x32,0x73,0x70,0xd0,0xa8,0x7d,0xb5,0xd0,0xfc,0xf4,0xb6,0x55,0x9f,0x1f,0x8a,0xec,0xf4,0xb0,0x47,0xeb,0x3b,0x68,0x80,0x0b,0x79,0xd0,0x71,0x99,0xb1,0xd0,0xed,0x1f,0x9f,0x6c,0x2d,0x9d,0xae,0x1c,0x62,0x3b,0xec,0x3e,0x2f,0xb4,0x6f,0xbb,0x2e,0x1e,0xa9,0x7c,0xe8,0x5d,0x14,0x7d,0x0d,0x17 +.byte 0x6d,0x9c,0x54,0xce,0x64,0x93,0x8e,0x3b,0xa4,0xa9,0xfb,0xd9,0x44,0x06,0xbb,0xb8,0x7f,0xdf,0xd3,0xc2,0xa2,0xcf,0x5a,0xa2,0xa7,0xbb,0xb5,0x08,0xe2,0x67,0xdf,0x0e,0x4e,0xc6,0xcf,0x0a,0x79,0x1e,0xa5,0x60,0x1a,0x81,0xb1,0x8e,0x1b,0x27,0x7f,0x8d,0x28,0x50,0xa7,0x4a,0xe4,0x4b,0x61,0x6b,0xa9,0xfa,0xaf,0x82,0x83,0xfb,0x1f,0x2e +.byte 0xfa,0xce,0x18,0x0e,0x32,0x5f,0x5a,0xcf,0xac,0xaf,0x22,0x30,0x16,0xd7,0x97,0x99,0x0d,0xb8,0x92,0xa5,0x1d,0x44,0xb2,0xa5,0xc7,0x74,0xd2,0x81,0x8d,0x5c,0x38,0xda,0x9f,0x76,0xcb,0x47,0x6c,0xb7,0x08,0xd9,0xc1,0x52,0xd0,0x64,0x0a,0xf9,0xdd,0x3e,0xe8,0x99,0x15,0x4d,0xcb,0x7b,0x25,0x53,0x8c,0x13,0xb1,0xbf,0xb7,0xca,0x2d,0xce +.byte 0x71,0x48,0xee,0x5b,0x3a,0x01,0x5b,0xfd,0x22,0xfa,0x6f,0x17,0xcb,0x52,0xcc,0x0a,0x2b,0xbb,0x6d,0xce,0x2d,0x00,0xf5,0x9e,0x0d,0x58,0xf1,0xf4,0xa4,0x9f,0x13,0xf9,0x68,0x15,0xd7,0x02,0x41,0x6c,0x19,0x6b,0x66,0x9a,0x74,0xee,0xb4,0xb3,0xc7,0xec,0x60,0x19,0xbd,0xbb,0x97,0x22,0x7c,0x4e,0xe6,0xc6,0x00,0x03,0xa5,0x36,0x52,0xec +.byte 0x21,0xcf,0xc8,0xda,0x2c,0x14,0xa9,0xd8,0x75,0xab,0xea,0x05,0x8c,0x24,0x28,0x63,0xbd,0x58,0x35,0xd7,0x95,0xcb,0x14,0x89,0x04,0x99,0x7e,0x67,0x0d,0x07,0x35,0xdb,0x17,0x7c,0x72,0x2d,0xbc,0x89,0x9b,0xb4,0x16,0x21,0x2f,0x90,0xe8,0x8f,0xeb,0xc3,0x8d,0x86,0x0d,0x92,0xf6,0x4b,0x80,0x36,0x96,0x6b,0xd8,0x95,0x7b,0xad,0xe8,0xbf +.byte 0x77,0x9e,0xf4,0x93,0xcd,0xa5,0x06,0xbc,0x38,0xf2,0x57,0x25,0x54,0xfa,0x8e,0x19,0x8e,0x25,0x8e,0x3c,0x28,0xaa,0xf2,0x02,0x30,0xd4,0x47,0x89,0x36,0xb9,0xb7,0x01,0x5f,0x0c,0xd1,0x8d,0x93,0x7e,0xf0,0xf0,0xff,0x2f,0x8f,0xb5,0x97,0xa7,0x02,0xe8,0x9b,0xf2,0x51,0xe6,0x51,0x62,0xa5,0x27,0x26,0xc6,0x7a,0x39,0x7a,0xa9,0xaf,0x1e +.byte 0x03,0xd5,0x25,0xbe,0x3b,0x19,0x46,0xc4,0xdd,0xd6,0x5e,0x6a,0x18,0xc0,0x41,0x5f,0x53,0x89,0xd3,0x16,0xfb,0x3a,0x10,0xce,0x0d,0x8c,0x04,0x4c,0xcf,0xab,0xb9,0x0d,0x6c,0x45,0x6c,0x29,0xed,0x77,0x37,0x1f,0xd8,0x10,0x8a,0xfe,0x07,0xbd,0x7e,0xd7,0xa6,0x6b,0x80,0xde,0x3e,0x2c,0xa8,0xb1,0x38,0xcc,0xab,0x10,0x69,0x8f,0x58,0x3d +.byte 0x12,0xc7,0x9c,0xc1,0x0a,0xeb,0x3d,0x5e,0xf1,0x65,0xc6,0x09,0xcb,0x4b,0x09,0x24,0xa7,0x56,0x1d,0x1d,0x4c,0xd7,0x06,0xbd,0xe2,0x72,0x70,0xae,0x7e,0xe9,0xaa,0x97,0x6d,0xec,0xcb,0x55,0x0b,0x5d,0x45,0x3a,0x25,0x3d,0x52,0x0f,0x48,0x2f,0xe4,0xd0,0x5e,0x85,0x87,0xb6,0xa7,0x70,0x2f,0x9c,0x19,0x89,0x95,0x45,0x76,0x00,0xfe,0x27 +.byte 0xff,0xf8,0x73,0x59,0xba,0x98,0x92,0x4e,0x76,0x1a,0x90,0x1d,0xbc,0x1b,0xae,0x44,0xb6,0x63,0x86,0x4c,0x3c,0x8a,0x8f,0x3e,0x03,0x95,0x50,0x30,0xd8,0x0f,0x7f,0x6f,0xb6,0xe9,0xbe,0x2e,0xc9,0x55,0xe7,0x73,0xd6,0x77,0xdc,0xbc,0x67,0x54,0x31,0x47,0x30,0x46,0xe1,0xa4,0xf8,0xf3,0x90,0x4f,0x68,0x5a,0x52,0xe2,0xe7,0xdb,0xd9,0xfd +.byte 0xf6,0x36,0x2a,0xc1,0xdb,0x35,0x82,0x69,0xff,0xf9,0xea,0x53,0xff,0xcd,0x21,0x2c,0x26,0x79,0xd6,0x8c,0x74,0xe7,0x9e,0x85,0x1a,0x04,0xf5,0xed,0x89,0x16,0xf5,0xd7,0xf1,0x89,0xf1,0xb3,0x5b,0x47,0x42,0xcb,0x92,0x2e,0x70,0xf6,0x3e,0xfc,0x20,0x87,0x70,0xec,0x30,0x16,0xcc,0x88,0x64,0x13,0x58,0xf1,0x0d,0x17,0x90,0xc4,0xdb,0x07 +.byte 0xf5,0xe3,0x34,0x31,0x10,0x9c,0xa4,0x6a,0x4a,0xe6,0x6c,0x80,0x49,0x07,0x23,0x21,0xd6,0xf1,0xcb,0x4a,0xd1,0xb5,0xb7,0x63,0x94,0x4c,0x0a,0xce,0x90,0xf2,0x63,0x31,0x4f,0x96,0x6c,0x5d,0x3e,0xaa,0x10,0x20,0xd6,0xb6,0xbe,0xfa,0x3f,0x83,0xbc,0xa8,0x08,0x38,0xec,0x38,0xe4,0xe9,0xf5,0xb3,0x8e,0x32,0x31,0xcd,0x7c,0x08,0x98,0xf6 +.byte 0x0f,0x8a,0x8f,0xc1,0xd8,0x9e,0x05,0xb6,0x74,0x11,0x94,0xef,0x4f,0x8f,0xa1,0xc6,0x8c,0xdb,0xc3,0x27,0x4e,0xa3,0x30,0x94,0xf5,0xe8,0x2a,0x18,0x0a,0x51,0x9b,0x79,0xb2,0x1f,0xc3,0xa0,0x26,0xa9,0xf5,0xc4,0x9e,0x39,0xda,0x6a,0x53,0x8f,0x8c,0x4c,0x54,0x50,0x81,0xa0,0x0a,0xd3,0x7c,0x99,0x91,0xc7,0x3e,0x56,0x7d,0x53,0x8c,0x3c +.byte 0x51,0x44,0xa5,0x22,0x9d,0xd2,0x9b,0x13,0xcf,0xb8,0x0c,0xb8,0xd4,0xaa,0xb4,0xaa,0x8d,0xab,0x7c,0x06,0xca,0xbb,0x85,0xac,0x01,0xee,0xef,0xe7,0x74,0xd5,0x0d,0x64,0x91,0x1c,0xde,0x6c,0x05,0x37,0x1e,0x23,0x05,0x7e,0x38,0xdc,0x17,0xaf,0xa7,0x95,0x85,0x1f,0xaf,0xc8,0xe1,0xc2,0xda,0xda,0xf1,0x14,0x56,0x66,0x68,0x70,0x36,0x38 +.byte 0x7b,0xb8,0x22,0x9f,0xc4,0xeb,0x5d,0x76,0x97,0xc5,0xa3,0xb9,0x06,0x86,0x4f,0x20,0xab,0x7d,0xce,0x7d,0x78,0x59,0xc5,0x1f,0x73,0x81,0xf6,0x6d,0xb4,0xcc,0x10,0xc5,0x4d,0xe3,0x81,0xaf,0xbc,0x37,0x42,0x28,0x5f,0x51,0x1e,0xaa,0xc7,0x81,0x20,0xc3,0x89,0x35,0xf1,0x74,0x3a,0xe8,0x04,0x24,0xef,0x8b,0x70,0xe1,0x74,0xdf,0x87,0xd5 +.byte 0x3c,0x32,0x32,0x7d,0x03,0xd7,0xda,0x6d,0x8b,0x25,0x8d,0x11,0xa3,0xc2,0x27,0xdc,0xa3,0xfc,0xdf,0x70,0xa4,0x41,0xad,0xda,0xce,0x12,0x45,0x14,0xa1,0x96,0x16,0xd8,0x54,0x89,0x9e,0x78,0x7f,0x23,0x12,0xd1,0x15,0x08,0x7f,0xbd,0xf0,0x9a,0xf1,0x5b,0x07,0xd5,0xbc,0xab,0xab,0x15,0xae,0xda,0xf1,0x26,0x12,0x4e,0xd6,0x6c,0x35,0xc1 +.byte 0x6e,0x27,0x4d,0xa8,0x71,0x51,0x1e,0xae,0xa8,0x35,0x26,0x06,0x18,0x03,0xd8,0xae,0x9e,0x8b,0x07,0x30,0x10,0xfb,0x47,0x05,0x02,0xcc,0x0a,0xbd,0x57,0x43,0x15,0x0a,0x7a,0xb5,0x30,0x0b,0xa6,0x3c,0xa8,0xc9,0xf5,0x68,0xe1,0xfb,0xd1,0xe0,0xe7,0x44,0x6c,0xb4,0x44,0xb6,0xd1,0x2b,0x30,0x5e,0x17,0x89,0x40,0xcc,0x10,0x8f,0x97,0x8a +.byte 0xf3,0xf4,0x52,0x55,0xc4,0x8e,0x46,0xe5,0x24,0x0b,0x2a,0x5d,0x84,0xc1,0x4e,0xa8,0x5a,0x53,0xa8,0xce,0xc6,0x3f,0xa2,0xaa,0x3a,0x8f,0x51,0xed,0x4c,0xa6,0x34,0x6a,0x8c,0x18,0x9b,0x36,0x49,0x40,0x34,0xa3,0xe4,0xd8,0x3c,0x8a,0xfc,0x41,0xc9,0x35,0xfe,0x6e,0x3e,0x29,0xbc,0x04,0x61,0xaf,0x04,0x03,0x43,0x79,0xb5,0x77,0x27,0x25 +.byte 0xbe,0x85,0xc9,0x56,0xa4,0x17,0xc4,0x27,0x3d,0x53,0x1b,0x49,0x86,0xb2,0xb6,0x52,0x62,0x12,0x5d,0xe9,0x47,0x6f,0x65,0x78,0xf8,0x95,0x63,0xbc,0x73,0x6d,0xa6,0xb9,0xcd,0x17,0x39,0x56,0xb0,0xab,0x3a,0x15,0x5f,0x9a,0x98,0xfb,0xcd,0x51,0x4a,0x35,0x21,0xaf,0x07,0x4a,0x3d,0xfd,0x39,0x11,0x42,0xed,0xfc,0x7e,0x10,0x24,0xa5,0x0c +.byte 0xb2,0x4f,0x27,0xe4,0x78,0x32,0xfe,0xfc,0x8e,0x46,0x68,0xbb,0x2e,0x85,0x87,0x0f,0x01,0xde,0x1c,0x02,0xdd,0x82,0xa0,0x9e,0x30,0x31,0x8d,0x86,0x36,0x33,0xa6,0x59,0x16,0x78,0xae,0x1f,0x1d,0x27,0x0b,0x29,0x42,0x16,0x93,0x3b,0xe6,0xfb,0x8d,0xd5,0x48,0x42,0x61,0x39,0x5b,0xf7,0xea,0xd0,0x6f,0x67,0xd9,0x03,0x72,0xed,0x54,0xe1 +.byte 0xab,0x3f,0xa0,0xdc,0x4b,0x19,0xe6,0xe3,0xfe,0x5f,0x65,0x64,0x4c,0xa9,0x5c,0x52,0x36,0xb3,0x65,0x28,0x3e,0xe5,0x07,0x50,0xed,0xec,0x2f,0xc9,0xff,0x47,0x27,0xf6,0xfe,0xb8,0x60,0x60,0x52,0xe5,0xec,0x3c,0x4f,0x69,0x9f,0xaa,0x06,0x8a,0x99,0x9f,0xac,0xfc,0x0a,0x6f,0x8a,0xa4,0x0e,0x5c,0x58,0xb4,0x09,0xba,0x93,0x95,0x94,0x12 +.byte 0x9b,0x23,0x4f,0x93,0x28,0x6d,0xd0,0x76,0xfd,0xc9,0x87,0x3b,0xf1,0x8c,0x7d,0x56,0x84,0x5a,0x04,0x08,0x30,0xf7,0xf6,0x52,0x15,0xba,0xd6,0x7a,0x39,0x8c,0x5a,0xbf,0xeb,0x02,0x6d,0x31,0x30,0x92,0xbc,0xe2,0x07,0x21,0x16,0x96,0x70,0x66,0x00,0xe0,0x04,0xc5,0xa8,0xe4,0x08,0x6d,0x08,0x69,0x35,0xe2,0xb1,0x83,0x03,0x37,0xca,0xff +.byte 0x06,0x37,0x80,0xd5,0x1a,0xc5,0x31,0xfc,0x9a,0xb0,0x8a,0x4b,0x58,0xf3,0x00,0x4e,0xa4,0xfe,0x9e,0xe0,0x60,0xc7,0x3d,0x2c,0x52,0xb5,0x39,0xf0,0xa4,0x88,0x39,0x37,0xa5,0x26,0x8a,0xa3,0xe6,0x31,0xce,0xf3,0xa1,0x54,0x73,0xe7,0x69,0x38,0xef,0xa2,0xab,0x52,0x50,0x1a,0x45,0xcc,0x29,0x9c,0xb6,0xf4,0xde,0xc2,0xfe,0x7a,0x26,0xf7 +.byte 0x7a,0x6e,0x07,0xb6,0xd8,0x3f,0x77,0x60,0x35,0xae,0x6a,0x90,0xd6,0xb8,0x37,0xed,0x73,0x59,0x54,0xd9,0x0c,0x87,0x0e,0x81,0xef,0x69,0xc7,0xd4,0x8f,0x00,0x74,0x57,0x12,0xcf,0xa1,0x76,0xe8,0x45,0xf5,0x9a,0x4f,0xe2,0x5d,0x8a,0x89,0xb1,0x8b,0xea,0x9c,0x0a,0x1e,0x00,0x61,0x3b,0x66,0xbd,0xb5,0xd6,0xff,0xa3,0xff,0x52,0xc2,0x35 +.byte 0x81,0x05,0x08,0x2b,0xf9,0x52,0xda,0x74,0xd1,0x76,0x13,0xba,0x28,0x4c,0xb1,0xb1,0x82,0x5b,0x4e,0x79,0x39,0x22,0xf9,0x96,0x91,0x07,0x4f,0xf9,0xf2,0x25,0x25,0xb1,0x3e,0xda,0x07,0x5c,0x01,0x7b,0xfa,0x3e,0x95,0x92,0x1d,0xf8,0x44,0x06,0xc1,0xed,0x64,0x74,0x14,0x84,0x25,0xee,0x75,0xaf,0xe3,0x7c,0xd3,0xbe,0x7a,0x51,0x6b,0x80 +.byte 0x20,0x43,0x20,0x10,0x5f,0xf5,0xfc,0xd5,0xe8,0x06,0x43,0xad,0x10,0x6b,0x67,0x48,0xca,0xca,0x6e,0x3e,0x1c,0xdf,0x8f,0x7a,0x65,0xc8,0x5d,0xba,0x3b,0x67,0xeb,0x1f,0xc4,0x37,0xad,0xef,0x73,0x9e,0x18,0x8e,0xc1,0x99,0xaf,0x75,0xd3,0x91,0x73,0xc3,0x3a,0xb2,0xfe,0xff,0x30,0x81,0xc4,0x4f,0x37,0x37,0x23,0x96,0x17,0xf1,0xa2,0x9b +.byte 0x55,0x6e,0xd6,0xb3,0xc4,0x98,0xa3,0x32,0xb6,0xff,0x86,0x87,0x77,0xf4,0xad,0x16,0x3e,0xf0,0x24,0x01,0xb4,0x8e,0x1e,0x0f,0x10,0xa4,0x2e,0xe4,0x79,0xe6,0x88,0xe7,0x09,0x58,0x5e,0x97,0xad,0x0d,0x72,0x05,0xbf,0x2f,0x3f,0x99,0xee,0x8a,0x84,0xc3,0x62,0x43,0x52,0x6d,0xab,0x66,0xcf,0x9f,0x4e,0xf2,0x0d,0x13,0x15,0x49,0x84,0x5e +.byte 0x6c,0x8d,0x2d,0xef,0x53,0x16,0xa0,0x63,0xbe,0x05,0xb8,0x9b,0x23,0xca,0xca,0xb8,0xdd,0xbc,0x96,0x68,0x35,0x43,0x63,0x30,0x8e,0xaf,0x53,0x98,0xe2,0x76,0xe8,0x89,0x00,0x29,0x11,0x70,0xd5,0x94,0xbd,0x78,0xff,0xf6,0x88,0x4a,0x3d,0x99,0xd9,0x7e,0xdf,0xa8,0x33,0x92,0xa2,0xc0,0x32,0x42,0x73,0x08,0xd4,0x55,0x5d,0x18,0x93,0xca +.byte 0x7e,0x33,0xe3,0x51,0xc7,0xb7,0x24,0x62,0x69,0xf4,0xab,0x36,0xe3,0x22,0x10,0x9b,0xe0,0xbd,0x48,0x65,0x30,0x9c,0xfe,0xeb,0x3f,0x7f,0x22,0x67,0xcc,0x87,0x5a,0x71,0xb0,0xd1,0x19,0x82,0x1c,0xb2,0xf1,0x73,0xd2,0xd6,0x3f,0xef,0xe3,0x2f,0x25,0xf3,0x8b,0x21,0x4e,0xbf,0x0e,0xc1,0xd2,0x8a,0xbb,0x04,0xde,0xcf,0xd1,0x77,0xba,0xaa +.byte 0xc7,0x41,0x68,0xce,0xc4,0x64,0xf9,0x3a,0x2f,0x1c,0x0b,0x22,0xf8,0x60,0x09,0x76,0x31,0x88,0x62,0x3a,0xf3,0x49,0xe6,0xda,0x4b,0xd3,0xf3,0x35,0xaa,0x56,0x4c,0x2f,0x7f,0x03,0x3e,0xf8,0xcb,0x5e,0xed,0x37,0xa1,0x29,0xe8,0x20,0xf5,0x4a,0x32,0x73,0x30,0xfd,0xd1,0xf6,0xb4,0xa1,0x30,0x87,0xcb,0x21,0x63,0xf5,0x3a,0xad,0x05,0x1a +.byte 0x34,0xf5,0x32,0xf6,0x02,0xf3,0x10,0x52,0xfd,0x86,0x37,0x1f,0x5d,0xe4,0x2e,0x31,0xcb,0xb8,0x4c,0xeb,0xdd,0xea,0x01,0x0d,0x94,0x13,0xa8,0x8f,0xf0,0x52,0x4e,0x0d,0x4f,0xd1,0x24,0xeb,0x0f,0x2b,0xb1,0xaa,0xc5,0xc8,0x52,0xb9,0xbe,0x21,0x48,0x2a,0x53,0x98,0xe4,0x00,0x72,0x64,0xdb,0x44,0x48,0x36,0x60,0xe7,0x81,0xdc,0x25,0x85 +.byte 0x4d,0xaf,0xa8,0x0d,0xfb,0x07,0x76,0x4f,0x6a,0x30,0x3c,0x7c,0x3b,0x36,0xa9,0xf8,0xae,0x81,0x03,0xe9,0x19,0xdf,0xdb,0xd9,0x7f,0x59,0xe0,0xd7,0x50,0x14,0x9f,0x67,0x3d,0xc7,0xdf,0xa8,0x44,0x86,0x29,0x81,0x65,0x44,0x9e,0x37,0x27,0xdd,0x2f,0x33,0x59,0xf7,0xaa,0x17,0x34,0x8c,0x1c,0xa7,0x8e,0x06,0x46,0xf1,0x43,0x87,0xa9,0xb7 +.byte 0x85,0xec,0x92,0x0d,0xdd,0x78,0x55,0x99,0xfb,0x1c,0x66,0x85,0x0d,0x59,0x31,0x00,0xbc,0xd9,0x9b,0xbb,0xfb,0xfc,0xb2,0x36,0x3c,0x34,0x8f,0x4a,0xb6,0x74,0x9c,0x32,0x6f,0x69,0x6c,0x3e,0x68,0x7e,0xec,0xeb,0x58,0x6a,0xf5,0xa2,0xbb,0x04,0x68,0xdb,0x8c,0xf0,0x04,0xba,0xf7,0xf7,0x50,0xd0,0x60,0xba,0x45,0x73,0x0f,0x2c,0x2f,0x97 +.byte 0x58,0xcc,0xa2,0xbe,0xfe,0x5e,0xf9,0x44,0x03,0x8b,0x99,0x56,0xb0,0x4f,0xe1,0xd0,0xa5,0x9f,0xd1,0xfc,0x95,0x44,0x4b,0x01,0x24,0xc0,0x4c,0x91,0xc1,0xb5,0x99,0xe7,0x5f,0x2f,0xcf,0x5d,0x4f,0x64,0x6e,0x54,0x51,0x0c,0x35,0x5f,0xa8,0x7b,0x27,0xa0,0x7d,0xb1,0x90,0xc2,0xdd,0x50,0xef,0x09,0x6f,0xed,0x25,0x6b,0xf5,0x6f,0xc1,0x97 +.byte 0xea,0xd5,0x49,0xf5,0x40,0x60,0xc3,0xbb,0x0d,0x82,0x15,0xa5,0xf7,0xfe,0xa1,0x20,0x13,0x9e,0xbb,0x43,0x58,0xba,0xd2,0xe8,0x89,0xaa,0xfc,0xe0,0x47,0x6b,0xac,0x91,0x8b,0xeb,0x4f,0xf5,0xda,0xf5,0xc8,0x11,0x64,0x7c,0x8d,0x43,0x92,0xf2,0x84,0xeb,0xfb,0x5c,0x1b,0x6b,0x68,0x8e,0x3c,0x66,0xb2,0xd1,0x8e,0x67,0x44,0xbf,0x69,0x3b +.byte 0xb9,0x41,0x78,0x8d,0xc8,0x7b,0x81,0x61,0x70,0x6e,0xe2,0xfc,0xd2,0x96,0x31,0x31,0x2f,0x27,0x90,0xf2,0xc4,0xed,0xbd,0xb5,0x0e,0x91,0x7d,0xd0,0xec,0x3c,0xe9,0xcf,0xf2,0x07,0xac,0x54,0x44,0x9a,0x24,0x41,0xcb,0x2a,0x86,0x30,0x18,0xba,0x65,0x59,0x41,0x00,0x59,0xbf,0x3d,0x01,0x8a,0x51,0xe5,0xd2,0x90,0x8c,0x7d,0xd7,0xad,0x71 +.byte 0xdc,0x45,0x62,0x95,0xf9,0x9f,0xe8,0x55,0x6d,0x48,0x22,0x32,0xcb,0x9a,0x55,0x65,0xe5,0xdf,0xee,0x22,0x99,0x91,0xd7,0xed,0x33,0x04,0x72,0xc7,0xc5,0xb2,0x56,0x5e,0x8f,0x38,0x4b,0xd0,0x61,0x4b,0x4b,0x04,0x4c,0x4c,0x2b,0x23,0x00,0xd4,0x5c,0xdd,0x84,0x8d,0x73,0xf4,0xf7,0xef,0xd5,0xdb,0x2b,0xec,0x54,0x86,0x37,0x01,0x64,0x56 +.byte 0xef,0x73,0x9f,0xb4,0xb6,0xd2,0xf4,0x33,0x93,0xbd,0xd7,0xd9,0x6e,0x8f,0x60,0x85,0xbc,0xa6,0x16,0x3f,0x3f,0xc3,0xd7,0xfc,0xb6,0x82,0xf0,0xe5,0x1e,0x2c,0x51,0x48,0x27,0x50,0x3e,0xdb,0xe6,0x86,0x3b,0xa1,0xfa,0x09,0x39,0x04,0x6f,0xb1,0x85,0xbd,0xda,0x4d,0x2f,0xd1,0x40,0x6f,0x2e,0x2b,0xf2,0x9a,0x4d,0x8e,0xb2,0xc5,0x6e,0x21 +.byte 0xf9,0xdd,0xc9,0x2e,0x81,0x18,0x7b,0x88,0xb9,0x86,0x36,0xe5,0xb2,0xdd,0x19,0xb4,0x7f,0x5d,0xc0,0x20,0x34,0xdc,0x63,0x7d,0x8c,0x80,0x0f,0xe6,0x85,0x14,0xbb,0x87,0x6c,0x3e,0x39,0x53,0x60,0x3d,0xc5,0x46,0x11,0xa3,0x96,0x60,0x6f,0xe9,0xfe,0x59,0xcc,0xed,0x4d,0xdb,0xa3,0xa1,0xf1,0x71,0x0b,0xb0,0x1f,0x89,0x4c,0x32,0x59,0xa5 +.byte 0x7d,0xf7,0x3e,0x5b,0xca,0xa4,0xe1,0xc3,0x50,0xac,0xdf,0x00,0xad,0x45,0x59,0x9e,0x23,0x5f,0x52,0xbd,0x36,0x78,0x55,0xcf,0x90,0x91,0x41,0x14,0xdb,0x76,0x3a,0x43,0x39,0x89,0xe1,0x93,0xc8,0x66,0x91,0xc7,0x42,0x06,0x6f,0xbb,0x35,0x1e,0x07,0x52,0x5a,0xe4,0x41,0x9f,0x65,0xe0,0xdc,0x49,0x8c,0xd3,0x5f,0x16,0x21,0xc9,0xb8,0x8a +.byte 0xc2,0x56,0x91,0xcb,0x18,0x6b,0x38,0x7b,0x3a,0xeb,0x91,0x3c,0x0d,0x6a,0x1f,0xd6,0xc6,0xd7,0x56,0x8d,0xd3,0x76,0x1c,0x9d,0xed,0x3d,0xb6,0x92,0x71,0x6e,0x73,0xc6,0xb8,0xa2,0x1c,0x25,0xb9,0x3c,0xd4,0x41,0xf7,0x8f,0x39,0x60,0xe6,0x27,0xf2,0xc6,0x5f,0x56,0x08,0x7c,0xd3,0x16,0x9d,0x06,0xc0,0xca,0x3d,0xc6,0x61,0xb0,0x21,0x51 +.byte 0x6d,0xca,0x82,0x59,0xe6,0xbb,0x99,0xa2,0x4f,0xfc,0x71,0x66,0x2b,0x4e,0x40,0x62,0x97,0x34,0x73,0x4a,0xe5,0xf0,0x4f,0x4c,0x36,0x4c,0xdb,0x03,0xa9,0x87,0x29,0x21,0x5d,0x91,0x5b,0x89,0xb8,0x3d,0x65,0xc7,0x58,0x0a,0x81,0xb5,0x3e,0x22,0xa1,0x57,0x95,0xbe,0x60,0xf5,0xeb,0xb3,0x49,0xdf,0xd9,0xa2,0x31,0x36,0x5f,0xb2,0xa6,0xf6 +.byte 0x66,0x88,0x88,0x8e,0xa3,0x2c,0xac,0x5e,0xa1,0x33,0x16,0x64,0x08,0x47,0xc8,0xbc,0xc2,0xe9,0xdb,0x73,0x57,0x50,0xd4,0x24,0x01,0x26,0x26,0x04,0x4f,0x8a,0xc0,0x7a,0x97,0x14,0xf2,0xd0,0xbe,0x03,0xea,0x8a,0x25,0xcb,0x98,0xe7,0xbd,0x67,0xff,0x32,0xfd,0x8a,0x7d,0x11,0xe1,0xb2,0x91,0xb5,0xa0,0xb6,0x3c,0x2c,0xb3,0x6e,0x35,0x61 +.byte 0x86,0xbc,0x37,0x15,0xf8,0x3b,0x0d,0x84,0x83,0x69,0x76,0xb0,0xaa,0x8f,0x4f,0xca,0xba,0x54,0xfe,0x42,0xc8,0xba,0x9a,0xd5,0x53,0x69,0x67,0x29,0x23,0x3a,0x6a,0x75,0x97,0xb4,0x29,0x2e,0x62,0xe3,0x95,0x82,0xb3,0xa0,0xa1,0xb7,0xdf,0xc2,0x66,0x4d,0xdd,0x0d,0xda,0xda,0xc2,0x42,0xe0,0x69,0xb1,0xab,0x3c,0x44,0x39,0x11,0x3b,0x0a +.byte 0xd6,0x96,0x2c,0x36,0xb0,0xa0,0xed,0x3d,0x0c,0x63,0x8b,0x90,0xe4,0xb9,0x5f,0x4c,0x27,0x70,0x87,0xb3,0x54,0xe2,0x36,0x74,0x6f,0x3e,0x22,0xb1,0x3b,0x1b,0xba,0xdb,0x1c,0xbd,0x9c,0x6d,0x84,0xbd,0x33,0xfb,0xc0,0x98,0x4c,0xcf,0x7a,0xe8,0x41,0xdb,0x32,0x1f,0xb7,0x64,0x19,0xdb,0x87,0xe7,0xf9,0x52,0x40,0x8c,0xc6,0x89,0x98,0x15 +.byte 0x69,0xde,0xfa,0x29,0x9a,0x0f,0xaf,0xb0,0xad,0x71,0x35,0xab,0xab,0x34,0xe0,0xf4,0x03,0x24,0x6f,0x94,0x38,0x87,0xba,0x68,0xd5,0x1f,0x58,0x88,0x3e,0x12,0x20,0x57,0x43,0xde,0xd0,0xbc,0xaa,0x31,0x8f,0xbc,0x88,0xa0,0xdf,0x5a,0xcc,0xd1,0xba,0x9c,0x18,0x80,0x4e,0x8f,0x68,0x91,0x9c,0x57,0x3b,0x5a,0x62,0xc7,0x29,0x3e,0x49,0xc7 +.byte 0x23,0x26,0xfd,0x9e,0xd0,0xb0,0x4f,0xd4,0xb2,0xa9,0xa8,0x4c,0x66,0x54,0x52,0x75,0x6b,0xbf,0x63,0x76,0x49,0x3b,0xa3,0xb2,0x8f,0x87,0x9d,0xb4,0x8f,0x07,0x3c,0x8e,0xae,0xe1,0x0e,0x9a,0x86,0x90,0x58,0x73,0x8a,0xb3,0xa9,0xab,0xe6,0x27,0xd7,0x70,0x94,0x77,0x12,0xdc,0x71,0xdf,0xcf,0xba,0xdd,0x85,0xfe,0x28,0xaa,0xcd,0xcc,0xe8 +.byte 0x5f,0xd4,0xd8,0x45,0x6f,0x20,0xa8,0x5e,0x40,0x91,0x3b,0xd7,0x59,0x92,0xb8,0x7d,0x2b,0x8b,0x38,0xbd,0xfe,0x7b,0xae,0x5c,0xee,0x47,0x9b,0x20,0xb7,0xf3,0xad,0x75,0xa9,0xe1,0x96,0xc8,0xb2,0x30,0xfe,0x0c,0x36,0xa2,0x02,0xf4,0x3b,0x30,0xfd,0x91,0xfa,0x5f,0xd6,0x18,0x1a,0xcb,0xd2,0x26,0xbb,0x67,0xbe,0x1c,0x99,0xa5,0x4f,0x57 +.byte 0x40,0xb5,0xed,0xd6,0x84,0xfd,0x6b,0x00,0xc8,0xe7,0x18,0x1a,0x9f,0xf7,0x3b,0xd1,0xcc,0x12,0xeb,0x9d,0x61,0xf0,0x8d,0x64,0x08,0x93,0x61,0xc4,0x3e,0xdb,0xda,0x15,0xb1,0xd6,0x2c,0x84,0x2a,0xd8,0xd2,0xa1,0x66,0x4e,0xc9,0xd6,0xbf,0x7e,0xb6,0x22,0xfa,0x35,0x5e,0xdc,0xc0,0x31,0x02,0xb8,0x17,0x46,0x9e,0x67,0xd3,0x6a,0x8f,0x33 +.byte 0x85,0xc3,0xfe,0x36,0xbc,0x6f,0x18,0x8a,0xef,0x47,0xf1,0xf2,0x6e,0x15,0x6c,0xb1,0x4a,0x4b,0x13,0x84,0xd5,0x1b,0xf9,0xa2,0x69,0xcd,0xc7,0x49,0xce,0x36,0x8e,0xe5,0xd5,0x35,0x05,0x7c,0x7f,0xc6,0x15,0x29,0x2e,0x64,0xa6,0x91,0x9d,0xe5,0x9d,0x90,0xe7,0x26,0xec,0x75,0x19,0x58,0x57,0xf2,0x19,0x7b,0x24,0x7d,0x19,0xd3,0x72,0x69 +.byte 0xaa,0xa2,0x8c,0xe3,0x3d,0x38,0xb9,0xf0,0x5b,0xe9,0x3b,0xaa,0x96,0xef,0x2c,0xfc,0xf5,0x13,0xa6,0xa9,0x57,0x8c,0xa9,0x3a,0xc1,0xf0,0x2d,0x57,0x06,0x08,0xe3,0x9c,0xfe,0x82,0x8a,0x6a,0x79,0x5b,0xef,0x2b,0x81,0x83,0x01,0x53,0xac,0xdc,0x79,0x93,0x9b,0x23,0xd4,0xae,0x17,0x6f,0x62,0xaa,0x33,0x41,0xa6,0x31,0x1c,0x7b,0x46,0x2b +.byte 0x17,0xd3,0x6f,0x66,0x73,0x54,0xee,0xa1,0x08,0xee,0x8f,0x0f,0x0e,0x53,0xa7,0x49,0x17,0xdb,0x35,0xaf,0x4e,0x94,0x87,0x8e,0xff,0xf4,0x2b,0x29,0x01,0x45,0xa3,0x0a,0xd9,0x13,0x38,0x09,0x46,0x2c,0x56,0x97,0xd7,0xee,0x24,0x43,0xd1,0x20,0xed,0x38,0xde,0x52,0x13,0x38,0x06,0xd3,0x97,0xc7,0x48,0x8b,0x72,0x0a,0xc5,0xca,0x75,0x2c +.byte 0x04,0x9e,0xee,0x14,0xe7,0xda,0x59,0xc2,0x54,0x7a,0x72,0x55,0x35,0x00,0x93,0xb7,0xb9,0x81,0x01,0x46,0xae,0x43,0x81,0x34,0xd7,0xb4,0x7a,0xfc,0xfc,0x98,0x2b,0x29,0xe5,0x5e,0x9d,0x8e,0xef,0xd4,0x44,0x9d,0x9a,0xbe,0xdb,0x83,0x33,0x18,0x9e,0xbd,0x0f,0x34,0x4d,0xd9,0x34,0xe0,0x2c,0x1f,0x10,0xaa,0x06,0x5e,0x54,0x51,0x72,0xec +.byte 0xbf,0x6b,0x3e,0xb9,0xdd,0x37,0xc3,0xe1,0xbe,0xbe,0x1d,0x86,0xde,0x12,0xca,0x82,0xc5,0xe5,0x47,0xf8,0xbe,0xef,0xb6,0x79,0xd5,0x3c,0x69,0x0a,0x35,0x3e,0xd3,0xf8,0xaf,0x5b,0x8e,0x69,0xff,0xb2,0xf7,0x91,0xc2,0x70,0x22,0x97,0x1c,0x5c,0x56,0x25,0x5a,0xcf,0x31,0x7a,0x37,0xce,0xc7,0xf2,0x98,0xdc,0xb5,0x58,0x71,0x5a,0x60,0xe2 +.byte 0xfe,0x4f,0xf3,0xe2,0x2a,0xca,0x22,0x3e,0x07,0xc2,0xea,0x23,0xc8,0x04,0x97,0x7f,0xca,0xf6,0xf8,0x12,0x06,0x88,0x81,0xee,0xb7,0xdd,0x56,0x9e,0x0f,0x36,0xd3,0x09,0xa8,0x74,0x4d,0x8b,0x8f,0x31,0x64,0xbe,0x9d,0x7b,0x68,0x50,0xc8,0x64,0x40,0x3b,0x0c,0x04,0xb9,0x4b,0x9e,0xff,0x7e,0x5d,0xd8,0x57,0xa0,0xe5,0x6d,0xc2,0x37,0xe7 +.byte 0xd1,0xd9,0x96,0xaa,0x16,0x3e,0xa2,0x9d,0x32,0xe7,0x1e,0x11,0x6e,0x41,0xe2,0xa0,0xe1,0x6f,0x32,0x6d,0xd5,0x38,0x0c,0x27,0x27,0xa9,0xc2,0x04,0xc6,0xe7,0x8d,0x7d,0x7b,0x30,0xbe,0x54,0x6b,0x82,0x37,0x39,0x53,0x54,0xc9,0xac,0xcb,0xd1,0x31,0x79,0xd4,0x7b,0x85,0x07,0xf4,0xf4,0x5d,0x33,0xc7,0x91,0x4e,0xe5,0x13,0x78,0x09,0x42 +.byte 0x29,0x48,0xaf,0x82,0xb1,0x88,0xd4,0xd3,0x57,0x50,0x38,0xa7,0x66,0x41,0x63,0x34,0x2a,0x3c,0x5e,0x8f,0xc4,0xc1,0x00,0xa1,0x22,0xbe,0x5e,0x64,0xb0,0x60,0x9b,0x42,0x9d,0xc6,0x59,0x5c,0xcc,0x29,0x6f,0x64,0x5b,0x5c,0x0f,0xb2,0xae,0x21,0x0c,0x9a,0x6a,0x19,0xb9,0xa6,0x32,0xf8,0xdc,0x82,0xea,0xba,0x27,0xcf,0x42,0xd3,0xde,0x78 +.byte 0xfe,0x9c,0xa5,0x36,0xb6,0x24,0xb6,0x0d,0x5b,0x67,0x6c,0xf5,0x16,0xbf,0x67,0x54,0x4f,0xe4,0x83,0x29,0x75,0x42,0x9a,0xbb,0xd5,0xe7,0x01,0x1f,0xbd,0x80,0x1a,0x7a,0xb6,0xe1,0x2b,0x5d,0x71,0x93,0x00,0xad,0xf6,0x11,0x8d,0x67,0xdc,0x9c,0x8f,0xf0,0x09,0x3f,0xf9,0xa4,0xd6,0xe0,0xdd,0x95,0xea,0xfb,0x71,0x76,0x21,0x31,0x6d,0x48 +.byte 0x0a,0x27,0xa8,0xa6,0x3a,0x7f,0x42,0x6b,0x7e,0xd7,0x6e,0xd5,0x42,0x97,0xad,0x55,0xae,0x26,0x3c,0xde,0x3f,0xaf,0xfd,0x1d,0x6d,0xd3,0xeb,0x84,0xad,0x6d,0xd1,0x4a,0x85,0x1a,0xf7,0x99,0xa4,0xd0,0x48,0xfb,0xf6,0xfe,0xc6,0xea,0x61,0x77,0xe2,0x56,0x87,0xc1,0x36,0x44,0xb4,0xe3,0xd7,0xd9,0x6d,0x3e,0x1b,0xf4,0x72,0x3e,0xfe,0xa5 +.byte 0x47,0xf8,0x3f,0x1a,0x6e,0x43,0xf5,0x67,0xfe,0x90,0x96,0x9b,0x52,0xde,0xab,0xfb,0x45,0x7d,0x93,0xea,0xc3,0x40,0xe1,0x5f,0xcd,0xad,0x3b,0xe9,0x4e,0x36,0xc5,0x38,0xf4,0x66,0xde,0x4b,0xc8,0x2a,0xc3,0xa2,0x3a,0x2a,0xf1,0xd1,0xe8,0x01,0x07,0x37,0xca,0x42,0xbf,0x4f,0xd8,0xc5,0x50,0x93,0x1a,0x01,0x1d,0x51,0x41,0x6e,0xbf,0x68 +.byte 0x93,0x2e,0xdc,0x41,0x23,0xf3,0x13,0xe7,0x09,0xfa,0x39,0x6d,0xee,0x41,0x49,0xbb,0x78,0x04,0xcf,0xc9,0xbb,0x11,0xaa,0x57,0xb5,0x3e,0x4c,0x3a,0x77,0xb7,0x0b,0x38,0x34,0x48,0xd0,0x99,0x20,0x55,0xcd,0x43,0x2f,0x68,0x66,0xb0,0xe6,0x75,0x41,0xe4,0xae,0xfd,0x96,0xe8,0x01,0x4c,0x0b,0x5c,0xbc,0x4f,0x45,0x70,0x08,0x9e,0xf7,0x68 +.byte 0x9e,0xbb,0xe5,0x39,0x20,0x3f,0xbe,0xd3,0xe3,0x95,0xba,0x98,0xd5,0x12,0x2e,0x87,0xd4,0xf4,0x12,0xa2,0xcb,0xd4,0x51,0x53,0x93,0x67,0x06,0xf1,0x21,0x0e,0x92,0x8f,0x9f,0x9e,0x6c,0x16,0xa4,0x2c,0x6d,0xb0,0xd0,0xe1,0x87,0x2f,0x09,0x2c,0x8f,0x4b,0x89,0x1f,0xab,0x66,0xf1,0xcd,0x6e,0x67,0xaf,0x07,0x99,0x18,0x1b,0xda,0xc8,0x65 +.byte 0x81,0xa3,0x37,0x8a,0xad,0xe4,0x1d,0xfd,0x82,0xa0,0xf1,0xe1,0x1e,0x8d,0x0b,0xf7,0x07,0x7c,0xb3,0x10,0xc8,0x5a,0xa9,0xcc,0xc8,0xd0,0x2e,0x5a,0x71,0x45,0x4c,0x30,0xf0,0x10,0xe0,0xf6,0x0d,0x0d,0x11,0xb4,0x83,0x40,0x75,0xee,0xb9,0x24,0x04,0xe3,0xba,0xb3,0xd3,0x00,0x57,0x71,0x98,0xf0,0x4b,0x35,0x8d,0xd8,0x71,0xa0,0xcc,0xaf +.byte 0x46,0x54,0x67,0x65,0x70,0x0b,0x9c,0x61,0xf8,0xd4,0xb2,0x35,0xfd,0xcf,0x2b,0x3a,0x48,0x5b,0x03,0x86,0xd8,0x13,0x48,0x8a,0x55,0xa5,0x4d,0xef,0x42,0x41,0xbb,0x6a,0x8c,0x92,0x46,0x87,0x82,0x09,0x43,0xf3,0x94,0x1d,0x23,0x36,0xfe,0x6f,0xb8,0x9f,0xfa,0xf9,0x92,0x27,0x3c,0xcc,0x47,0x89,0x5c,0x7f,0x81,0x42,0x74,0x12,0x14,0xff +.byte 0x98,0x63,0xc0,0xfb,0x70,0xff,0xc7,0x65,0x5a,0xc3,0xb9,0x74,0x1b,0x71,0x3c,0x2c,0x47,0x79,0x07,0xb9,0x3c,0xc2,0x5f,0x48,0x4f,0xbd,0xaf,0x03,0x05,0x57,0xa9,0x84,0x33,0xc8,0x0d,0xd5,0xac,0x42,0xdb,0x4b,0x57,0x46,0x41,0xf0,0xe4,0x08,0x0d,0xf3,0x43,0x41,0xa5,0x14,0xb7,0xcd,0x64,0x23,0xc9,0xfe,0xff,0x12,0x97,0xc6,0x2f,0x8d +.byte 0x9e,0xf2,0x1d,0x33,0x26,0x3c,0x57,0x17,0xe1,0x7b,0x92,0x3f,0xb6,0xf4,0xd9,0xf8,0xe0,0x37,0xe6,0x18,0x7d,0xa7,0x8a,0x1e,0xe8,0xd8,0x56,0xa6,0x63,0xdf,0xa3,0x99,0x16,0x74,0x48,0x01,0xaf,0x95,0x55,0x40,0xce,0xa8,0x0d,0x30,0x01,0x09,0x40,0xc9,0x9d,0x3d,0xdf,0x4e,0x00,0xe0,0x2a,0xe6,0xdb,0xa2,0x79,0x42,0x57,0xd0,0x3d,0x81 +.byte 0x7f,0x67,0x3a,0xa9,0x63,0xb3,0xd4,0x60,0xa7,0xab,0x54,0x46,0xb0,0xbe,0xb0,0x83,0x72,0xec,0x47,0x0f,0xc7,0xd1,0xed,0x16,0x96,0xbc,0xa5,0x62,0x38,0xdb,0x88,0x2b,0x25,0x26,0x27,0x56,0x7f,0x46,0x39,0xe8,0x4e,0xc0,0x6c,0x62,0xf8,0x80,0x68,0x56,0x8a,0x93,0x51,0x95,0x77,0xe3,0x11,0x7b,0xaf,0xc4,0xcf,0x34,0x5a,0xd5,0x26,0xfc +.byte 0xa2,0x18,0xb0,0xc0,0xa5,0x8b,0x25,0x70,0x40,0x70,0x29,0xc3,0xda,0x80,0x3d,0xe2,0x59,0x49,0x7f,0xdd,0x62,0x6e,0x5a,0xe6,0x27,0x73,0xce,0xb6,0x32,0x37,0x5f,0x73,0x12,0x2b,0x34,0x84,0xff,0x85,0xe3,0xb5,0x93,0x41,0x47,0xc5,0xf5,0x0e,0x21,0xfb,0x24,0x0f,0xdf,0x7b,0xb4,0x29,0x7f,0x67,0x2a,0x38,0x79,0xf0,0x54,0x8a,0x94,0x68 +.byte 0xe2,0x0b,0xb0,0xd4,0xb2,0xa4,0xe4,0xfb,0x3b,0xe6,0xe7,0x59,0x41,0xbd,0xed,0x62,0xce,0x50,0x1a,0x47,0x92,0x92,0x8d,0x80,0xa6,0x05,0x7a,0xb0,0xce,0x48,0x9c,0xb0,0x64,0xea,0xe0,0xa5,0x77,0xff,0xc1,0x82,0x99,0x7b,0xfb,0x74,0x53,0xfa,0x41,0x9a,0x2c,0xb4,0xbb,0xd2,0x26,0xa1,0x80,0x68,0x17,0xaa,0x8f,0x14,0x52,0xb6,0x5d,0xe0 +.byte 0x69,0x5b,0x31,0xc5,0xf5,0x32,0x0d,0xff,0xa4,0x7b,0x28,0x38,0x9b,0x61,0xfc,0xd0,0x92,0xb8,0x6e,0x23,0x8a,0xf3,0xc7,0x85,0x11,0xb8,0xd0,0x19,0xaf,0xca,0xa7,0xb4,0xcc,0xeb,0x5d,0xf6,0xa1,0x1c,0x56,0xdf,0x78,0x7a,0xe3,0x6a,0xa4,0x07,0x71,0xce,0xf1,0xb2,0xd5,0x38,0x3c,0xfa,0xf7,0x7a,0xbf,0x4b,0x43,0xa6,0xb3,0x4d,0xff,0x82 +.byte 0x96,0x46,0xb5,0xec,0xda,0xb4,0x5e,0x35,0x78,0xeb,0x4a,0x7e,0xc5,0x7b,0x05,0xd4,0xdd,0xf7,0xb7,0xf3,0xf0,0x04,0x26,0x7e,0x5e,0xc1,0x23,0xca,0x7f,0x14,0x27,0xac,0xda,0xe7,0xdb,0x31,0x05,0x9d,0xd4,0xda,0x20,0xc7,0x6d,0x9a,0x47,0x14,0x38,0xbd,0x7c,0xfe,0xbe,0x8d,0x42,0x7c,0xba,0x36,0xe2,0x2c,0x26,0xd2,0x46,0xa5,0x6b,0xbd +.byte 0x6a,0x75,0x6b,0x52,0x8c,0x10,0xc6,0x0e,0x76,0x60,0x46,0xcc,0x93,0x54,0xc4,0x6e,0xc7,0x70,0x5b,0xb4,0x81,0x51,0x56,0x03,0x22,0x33,0x21,0xe4,0x36,0xee,0x01,0xc3,0x0d,0x17,0x23,0x15,0xae,0x79,0xbc,0xe6,0x13,0x0f,0xfc,0x77,0xa2,0x06,0xed,0x76,0x4a,0xf7,0x2d,0x99,0xc8,0x5c,0xfd,0xac,0xd0,0x11,0xe8,0xfa,0x55,0x17,0x56,0x63 +.byte 0x3e,0xd5,0x23,0x71,0xf8,0xe9,0x1f,0x62,0x95,0xae,0x7c,0x2d,0xcd,0xb8,0x6e,0xb0,0xfe,0xf3,0xd0,0xba,0x72,0x8e,0xe3,0x95,0x82,0x00,0x85,0xdb,0x25,0xe4,0xf2,0xaa,0xbc,0x8d,0xb9,0x4d,0x69,0xa4,0xcd,0x39,0x52,0x9e,0x10,0xae,0x90,0xf0,0x74,0x2f,0xc6,0x5e,0x01,0x99,0x03,0xd5,0x88,0x59,0xfd,0x1b,0x80,0x56,0x0a,0x04,0x27,0xd9 +.byte 0x04,0x51,0xb0,0xb7,0x7a,0x65,0x79,0xa8,0xe2,0x6d,0x7f,0xb2,0xba,0x37,0x40,0xa0,0xbb,0xaf,0x15,0x46,0x23,0x5f,0x22,0xd0,0x2c,0x6c,0x7a,0x58,0x76,0x6f,0xb8,0x19,0xfe,0xb5,0x3d,0xf0,0x77,0x00,0x6b,0x4c,0x83,0x36,0x90,0xe6,0x57,0x29,0x6e,0x27,0x76,0xd4,0x7d,0x9a,0x6a,0xf1,0xf6,0x1b,0x1a,0x45,0xf5,0xf6,0x2d,0xb8,0x30,0x33 +.byte 0x65,0x51,0x37,0x26,0xbc,0xf7,0xb7,0xf9,0x56,0x05,0x6b,0xd4,0xd6,0x00,0x1d,0x13,0x15,0x45,0x24,0x0d,0x28,0x69,0xc6,0x50,0xe1,0x48,0x48,0x34,0x69,0x31,0x3c,0x58,0x71,0xd6,0x4a,0xd9,0xda,0x0d,0x28,0xbd,0xe9,0x5d,0x5d,0x8a,0x6e,0x71,0xc0,0x8b,0x7a,0xba,0x17,0x8e,0x82,0xcb,0xe9,0x95,0xc4,0x43,0x37,0xd0,0x58,0xed,0xec,0x77 +.byte 0x1e,0x22,0xf0,0xf0,0x7c,0x9d,0xeb,0x64,0x30,0x7b,0xb2,0x7b,0x86,0xdb,0xef,0x92,0x79,0xd9,0x9c,0x1c,0x1a,0xf6,0x98,0x26,0x18,0xa2,0x83,0x45,0x08,0xd4,0x1d,0x84,0xd4,0x28,0x6d,0x1f,0xb5,0x1f,0xab,0x97,0xc9,0x0d,0x1f,0x83,0x34,0x18,0xa3,0x20,0x63,0x60,0x6c,0xf3,0xd8,0xb2,0x0a,0xd9,0x35,0xa6,0xce,0x44,0x50,0xc6,0xf3,0x91 +.byte 0xe3,0x95,0x89,0x49,0x99,0x32,0x1d,0xf2,0x54,0x39,0x09,0xca,0xd1,0xc4,0x7f,0xa1,0x1d,0xce,0x94,0x67,0xf1,0x88,0x04,0x29,0xcb,0x5d,0xf7,0xfa,0xcd,0x69,0x16,0x17,0x05,0xc3,0x93,0x45,0xbf,0xd3,0x74,0x63,0xdc,0xe2,0x84,0xab,0x27,0x60,0x56,0x61,0x72,0x5d,0xdf,0xb4,0xa4,0x0f,0xb0,0x21,0x82,0x9b,0x73,0x0a,0x11,0x22,0x2d,0x65 +.byte 0xa2,0xff,0x29,0x8a,0x19,0x28,0x4f,0x4f,0xdd,0x64,0x0a,0x48,0x35,0x70,0x30,0x9f,0x41,0x4d,0x0c,0x7b,0xa6,0xcb,0x63,0x83,0xd1,0x79,0xfa,0x5f,0xc9,0x9b,0x6e,0x09,0x12,0x87,0xcd,0x1e,0x39,0xd6,0x40,0x08,0x0f,0xfd,0x79,0xc8,0xcb,0x77,0x8f,0x7a,0x52,0x42,0xc0,0xb2,0xc8,0xa0,0x2a,0xff,0xbc,0x60,0x13,0xbc,0x41,0x4a,0xc6,0x8b +.byte 0x08,0xb0,0x9f,0x75,0x87,0xa1,0x75,0x42,0x4b,0x3a,0xf7,0xf7,0x84,0x39,0xa5,0x88,0x25,0x2d,0x4f,0x73,0x4e,0x30,0x27,0x92,0xea,0x93,0x70,0x5c,0xb5,0xeb,0xb0,0x10,0xda,0x0f,0xaa,0xb3,0x3f,0xb5,0x55,0x64,0x65,0xae,0xb5,0xf8,0x0a,0xe4,0x9f,0x86,0x02,0x6f,0x63,0x8a,0x0b,0x6b,0x82,0x85,0x3c,0x6a,0xdf,0x68,0x4c,0x1e,0xe9,0x5c +.byte 0xd0,0x99,0xe5,0x0c,0xfc,0x63,0xfb,0xce,0x2d,0x63,0xd5,0x7d,0x8a,0x7d,0x14,0x22,0xbd,0x71,0x5e,0x79,0x3f,0x44,0x95,0xe5,0x6c,0x58,0x94,0x84,0x41,0x65,0x52,0x94,0x50,0xec,0xd3,0x2a,0x16,0x88,0xdb,0x71,0xb9,0xe4,0xb6,0xbf,0xc5,0x3c,0x48,0x37,0x62,0x32,0x79,0xbe,0x1d,0xdb,0xc9,0x79,0x37,0x40,0x65,0x20,0x62,0x45,0xb4,0xda +.byte 0x24,0xef,0x33,0xf1,0x05,0x49,0xef,0x36,0x17,0x17,0x0f,0xdc,0x65,0xb4,0xdc,0x57,0xc3,0xc6,0x82,0x57,0x08,0xf2,0x20,0x57,0x5c,0x25,0x0e,0x46,0x75,0xa7,0x4f,0x9e,0xa4,0x00,0xf7,0x79,0xb9,0x0a,0xef,0x4f,0x50,0x79,0xf8,0x59,0x01,0xf2,0x74,0x9f,0x16,0x27,0xa5,0xc1,0x32,0xcc,0x58,0xa7,0x40,0xa1,0xa1,0x26,0x80,0x00,0xb5,0x64 +.byte 0x0a,0xd8,0x53,0x1f,0x72,0xf7,0x60,0xf7,0x0a,0xaa,0xdf,0x31,0x95,0xff,0xfc,0xb4,0xca,0xbc,0xf8,0x2a,0x33,0x20,0x04,0x16,0x1a,0xe7,0xeb,0x22,0xd1,0x25,0xa6,0x03,0xc9,0x9e,0x9e,0xca,0x7a,0x46,0x7c,0xcb,0x8a,0x63,0x4a,0xf0,0x1b,0xd0,0x34,0xc3,0xbb,0x89,0xcf,0x16,0x38,0xcb,0xe0,0xce,0xd5,0x0b,0xfd,0x4e,0xbc,0xce,0xba,0x28 +.byte 0x68,0x00,0x2a,0x31,0x52,0xe6,0xaf,0x81,0x3c,0x12,0x09,0x2f,0x11,0x0d,0x96,0xc7,0x07,0x42,0xd6,0xa4,0x2e,0xc1,0xa5,0x82,0xa5,0xbe,0xb3,0x67,0x7a,0x38,0xf0,0x5e,0xd8,0xff,0x09,0xf6,0xab,0x6b,0x5d,0xec,0x2b,0x9f,0xf4,0xe6,0xcc,0x9b,0x71,0x72,0xd1,0xcf,0x29,0x10,0xe6,0xe3,0x27,0x1c,0x41,0xc8,0x21,0xdf,0x55,0x27,0xa6,0x73 +.byte 0xb7,0x45,0xa1,0x09,0x66,0x2f,0x08,0x26,0xf1,0x50,0xe0,0xec,0x9d,0xf2,0x08,0xf3,0x49,0x56,0x50,0xe0,0xba,0x73,0x3a,0x93,0xf5,0xab,0x64,0xb6,0x50,0xf4,0xfa,0xce,0x8d,0x79,0x0b,0xad,0x73,0xf2,0x8c,0x1e,0xe4,0xdd,0x24,0x38,0x1a,0xde,0x77,0x99,0xb8,0x92,0xca,0xc0,0xc0,0xbc,0x3d,0x01,0x6f,0x93,0x3a,0x6e,0xc5,0x28,0x6e,0x24 +.byte 0x9c,0xf9,0xd9,0xcb,0x4b,0xbe,0x9e,0xda,0x0d,0x10,0xfb,0x9d,0x15,0xfe,0x28,0xdc,0xd9,0x09,0x72,0xd3,0x9f,0x6d,0x77,0x14,0x84,0x86,0x56,0x10,0xdc,0x8e,0x6a,0xa7,0x62,0xf0,0x0b,0x65,0x2c,0xa2,0xd1,0x7f,0xae,0x32,0xfa,0x9b,0x46,0x0f,0x12,0x08,0x22,0x8c,0x87,0x15,0x4b,0xc4,0x6d,0x85,0xfb,0x69,0xfe,0xce,0xfb,0xb4,0x3e,0x7b +.byte 0xcf,0x88,0xa7,0x97,0x52,0x56,0xd0,0x9f,0xb4,0x33,0xf9,0x08,0xd2,0x28,0x46,0x5e,0xc4,0xec,0x22,0xc6,0x1e,0x7b,0x34,0x99,0x0c,0x5b,0x04,0x19,0xe2,0xca,0x09,0x11,0x50,0x45,0xcc,0xb2,0x90,0x25,0x51,0x68,0xc9,0x20,0x6c,0x99,0x2e,0xdb,0x5b,0x07,0x91,0xb2,0x69,0xbf,0x3c,0x05,0x50,0xfb,0x21,0x33,0x4f,0x6e,0x18,0x19,0xd5,0xff +.byte 0xce,0x9d,0xb5,0x7f,0xd4,0xd5,0x8f,0x41,0x26,0x1f,0xa1,0x4c,0x34,0xd3,0x98,0x08,0x5d,0xb5,0x56,0xa7,0x04,0x63,0x76,0x7d,0xae,0xee,0xea,0xbf,0x69,0x8d,0xff,0xa1,0x62,0x86,0x19,0x7b,0xe5,0x08,0x7a,0xe5,0x9e,0xe5,0x44,0xca,0x24,0xde,0x00,0x43,0xc7,0xcd,0xc8,0x5b,0x21,0x00,0xb9,0x56,0x3f,0xba,0xef,0xcd,0xc4,0xe0,0xd7,0x90 +.byte 0xa7,0xe1,0xf9,0x83,0x2c,0x1d,0x8d,0xc3,0x1b,0xa2,0xab,0xcd,0x7d,0xbc,0xd1,0x2b,0xf8,0x30,0x9e,0xb6,0x95,0xe0,0xd1,0xe6,0x81,0x89,0xa7,0xda,0xf0,0x54,0xc1,0xcb,0x3a,0x85,0x85,0xb5,0x03,0xb4,0x8c,0x7d,0x98,0x16,0xa8,0x83,0x29,0xbb,0x1c,0x1d,0xe1,0x7e,0x0e,0xb5,0x04,0xba,0xbf,0x89,0x30,0x3c,0x44,0xa2,0xc5,0xbf,0xf1,0x70 +.byte 0xdb,0xf3,0x13,0xf4,0x44,0xac,0x63,0xc4,0x9c,0x93,0xa9,0x13,0x1b,0xf1,0xcc,0x16,0x66,0xdf,0x56,0x10,0x88,0x0c,0x76,0xab,0x43,0xcb,0x75,0xf8,0x4f,0x04,0x26,0x95,0x4c,0x6d,0x55,0xc8,0xbd,0xf8,0x94,0x0f,0xca,0x29,0x2b,0xcd,0xce,0x05,0x1e,0xea,0xae,0x02,0x01,0x8b,0x60,0x6a,0x6a,0x03,0x14,0xe5,0xa7,0xdf,0x9e,0x9f,0x94,0x92 +.byte 0x41,0x2c,0xf0,0x1a,0xa7,0xc2,0xc1,0xfc,0x11,0xf3,0x00,0xe1,0xfc,0x7a,0x97,0xc0,0xe1,0x81,0x90,0x3f,0xea,0x1e,0x7f,0xf8,0xb0,0xd8,0x4c,0x2d,0xdc,0x83,0xfa,0x27,0x8b,0xf2,0xef,0x3b,0x3a,0x44,0xdc,0xa5,0xa9,0xd5,0x24,0x5f,0xb1,0xdd,0x1d,0x3f,0x03,0x76,0x3b,0x92,0x0d,0xb4,0x84,0xa4,0x5b,0xef,0x9f,0x89,0x9d,0xef,0xff,0xcf +.byte 0xc2,0x28,0x3b,0x9d,0xd2,0x28,0x75,0x3e,0xdc,0x14,0x79,0x7c,0x0c,0xaa,0x6c,0xf2,0x05,0x9d,0x27,0x01,0x15,0x19,0x60,0x48,0x5a,0x7d,0x04,0x27,0x2d,0x82,0x92,0x3e,0x0b,0x62,0xd7,0x5a,0xfb,0x72,0xfb,0xdd,0x43,0xfa,0xf4,0x6f,0x16,0xd2,0x8f,0x8f,0x21,0xdc,0x81,0x48,0x7a,0xe8,0x39,0xd5,0xdf,0x54,0x0f,0xe1,0xbe,0x65,0xc9,0x49 +.byte 0x98,0xb1,0xff,0x8d,0x52,0x31,0x6a,0xcd,0x5e,0x83,0x17,0x41,0x93,0xcd,0x23,0x76,0x18,0xe9,0x82,0x71,0x15,0xb7,0xd8,0xde,0x0d,0x57,0x8b,0x90,0xe6,0xf4,0x57,0xc1,0xfd,0x3d,0x0d,0x6a,0xae,0xd1,0xd6,0x02,0x3e,0xb9,0x82,0xb2,0x82,0x80,0x48,0xa4,0x14,0x29,0x80,0x55,0x1d,0xaf,0x3e,0xf8,0x7e,0x36,0x5f,0x77,0x4c,0x73,0x6c,0x35 +.byte 0xd2,0x7c,0x36,0xca,0x2f,0xec,0x1e,0x3f,0x74,0xee,0xa5,0xe7,0x7d,0xce,0x81,0xf1,0xd5,0xc1,0xb3,0xaf,0x90,0x2c,0xc6,0x5b,0x81,0x37,0x85,0x98,0x78,0x3c,0x4f,0x2a,0x55,0xea,0x06,0x30,0x77,0x73,0x97,0x39,0x75,0xcf,0x4a,0x9b,0x55,0xb8,0x64,0x5c,0x86,0xfd,0x26,0x3e,0x8d,0x68,0xd2,0x70,0xe8,0xd7,0x99,0x57,0x6f,0x96,0x47,0x6d +.byte 0xa7,0x1a,0x0e,0x85,0xcd,0x00,0xa5,0x3e,0x11,0xec,0x76,0xd2,0x47,0x26,0x71,0xda,0x5c,0xf4,0xb1,0xd5,0x23,0xe1,0x62,0x71,0x43,0x30,0xa7,0x95,0xf6,0xc1,0xcf,0x8a,0x1b,0x75,0x53,0x39,0x6d,0x9d,0x18,0x7c,0xe3,0x48,0x27,0x33,0x1c,0x38,0x45,0xdf,0x75,0x22,0x05,0x6d,0x81,0x5d,0xfc,0xeb,0x0e,0x05,0x26,0x45,0x81,0x9f,0xce,0x0f +.byte 0xc9,0xdd,0x95,0x11,0x04,0x47,0x40,0xa4,0x07,0x3b,0x52,0x92,0xe0,0x91,0xdb,0xdd,0x3c,0x9f,0xd3,0xa1,0xb7,0xf9,0xeb,0xd6,0x6d,0x64,0x88,0xe9,0xf5,0x4e,0x98,0x8e,0x7b,0xd3,0xec,0xc0,0x22,0xe0,0xf2,0x14,0xf2,0x20,0xa2,0xa3,0xb3,0x0d,0x75,0x1a,0xbb,0xde,0x4a,0x41,0x04,0x43,0x0d,0xd9,0xd0,0x1d,0x73,0xc8,0x67,0x8e,0x58,0xe5 +.byte 0x4b,0x28,0x4d,0x8f,0x2f,0xab,0x1a,0x4a,0xfc,0x7c,0xd1,0x27,0x3e,0x4a,0x10,0x6a,0x5f,0x55,0x3a,0xf7,0x63,0x14,0xe9,0xad,0xb4,0x95,0xef,0x3d,0x5c,0xc3,0x7d,0xe4,0xb7,0x15,0xd7,0x0b,0x68,0xf0,0x23,0xa8,0xd4,0x8e,0x27,0xf6,0x55,0x11,0xbc,0xc0,0xff,0x3e,0x2c,0x24,0x59,0xb7,0xb7,0xb5,0x0b,0xd2,0x99,0xa5,0xd5,0xe2,0x24,0x33 +.byte 0x21,0xb8,0x96,0x48,0x18,0x94,0xb5,0xb2,0x50,0x5e,0x04,0x24,0x86,0x17,0x62,0x1e,0xc9,0xf8,0x22,0x6a,0xd0,0xec,0xc5,0xbc,0x90,0xf7,0x55,0xcf,0x3f,0x4c,0x7c,0xf7,0x51,0x19,0x95,0xa4,0x81,0x38,0x0c,0xa5,0x58,0x22,0xf3,0x10,0x05,0x05,0x44,0xbf,0x7e,0x2a,0xbd,0x5f,0x79,0x56,0x08,0xd5,0x68,0xea,0x85,0xa1,0xeb,0x0b,0xe1,0xd4 +.byte 0xfd,0x3a,0x38,0xd2,0x5a,0x49,0x17,0x9a,0x58,0x8f,0x52,0xf5,0xf4,0x7b,0x1f,0x58,0xa8,0xc0,0x1c,0x46,0x38,0xa6,0xe4,0x7d,0xcc,0x88,0x97,0x10,0x2b,0x5e,0x61,0xf5,0x73,0x7d,0x79,0x1b,0x53,0xf1,0xac,0xb4,0x3f,0xbd,0x9d,0xb6,0xc2,0x57,0xd5,0x84,0x4d,0x60,0xd6,0x45,0x56,0xa1,0x36,0x28,0xf5,0x74,0xc6,0x29,0xd7,0xc9,0x63,0x5e +.byte 0x7c,0x97,0x46,0xde,0x56,0x3f,0xd8,0x8e,0x75,0x29,0x87,0xe7,0xd1,0x24,0x78,0x26,0xdc,0x17,0x97,0xc9,0xf0,0x8e,0x95,0xbc,0xe5,0xfe,0xe3,0x3a,0x75,0x70,0x52,0xa9,0x31,0x97,0x79,0x3a,0xc2,0x53,0x6a,0x73,0xe2,0x76,0xf8,0x85,0xe6,0x0d,0x85,0x9b,0xfc,0x72,0x08,0x2a,0xa5,0x8e,0x42,0xb2,0x7c,0x8d,0x8b,0x28,0x4b,0xf5,0xcb,0x66 +.byte 0x80,0x46,0xb3,0x87,0xdf,0x38,0xa7,0x08,0xc8,0xea,0x85,0x0e,0x6f,0x13,0xe0,0x57,0x99,0xc6,0xb8,0xed,0x9c,0xb0,0xa9,0x89,0xd7,0xc5,0xa9,0x71,0xfd,0x8a,0x21,0xb1,0xec,0xc8,0x65,0x78,0x72,0xc6,0x77,0x69,0xd4,0x0b,0x47,0x4d,0x79,0x93,0xcf,0x2a,0x34,0xf1,0x1b,0x0e,0x6f,0x0d,0xd1,0xbb,0xe7,0xd7,0xb5,0x6f,0x57,0x01,0xd4,0xcd +.byte 0x56,0xbe,0xf0,0xd9,0xe2,0x8e,0x0e,0xb8,0x3d,0xdb,0xf6,0x97,0x39,0x0b,0x3e,0xe2,0xb2,0xa3,0x93,0x0b,0x74,0xe5,0x6a,0x21,0x04,0x29,0x5a,0x3e,0x07,0x9c,0x11,0x4e,0xfe,0x01,0x6e,0x96,0x1e,0x8f,0xe0,0xfe,0x24,0x24,0x7e,0x04,0x2f,0x65,0xf4,0xe2,0x1f,0x36,0x56,0x43,0x3a,0x6c,0xeb,0xd7,0x20,0x13,0x71,0x45,0x6a,0xe8,0xc6,0xfa +.byte 0xba,0x26,0x6f,0x7d,0x9a,0x62,0x76,0x34,0x7d,0xed,0x47,0x71,0xd1,0x0e,0x5b,0x04,0x39,0xd6,0xc0,0xe5,0xa5,0xd8,0xf5,0x73,0xf9,0xf4,0xc2,0x2a,0x54,0x25,0x67,0xdf,0x83,0xa3,0xcd,0xfd,0x1e,0x46,0x87,0x06,0x17,0x6d,0x78,0x8e,0x0c,0x7b,0x08,0x06,0x1b,0xd9,0x5d,0x3d,0x03,0x40,0xbc,0xe7,0x02,0xc4,0xe0,0xe0,0x49,0xb2,0x6c,0x6f +.byte 0x97,0x76,0x0f,0xc7,0x14,0xd8,0x7c,0xc0,0xad,0x8a,0xbb,0xbc,0x2a,0x7e,0x68,0x46,0xcd,0xa7,0x26,0x16,0x77,0x1b,0x89,0x38,0xd8,0x2a,0x69,0x43,0xc4,0xaa,0x0d,0xf6,0xd1,0x65,0xda,0x41,0x75,0x77,0xcd,0xf7,0xd2,0x38,0x9c,0xdb,0x81,0x17,0x27,0x2f,0xba,0x2e,0xa5,0xb5,0xbe,0x05,0xe8,0xdd,0x5f,0xa9,0xad,0xbe,0xb2,0x0e,0x0b,0x69 +.byte 0xb6,0x8d,0xd2,0xf2,0xde,0x76,0x32,0x26,0xd9,0x06,0x1d,0x42,0x26,0x8c,0xf7,0xca,0x4c,0xe1,0x59,0x82,0x6c,0xea,0x96,0x70,0x39,0xb8,0x0d,0xf3,0x67,0x9d,0x5e,0x94,0x99,0x77,0xf2,0x0a,0x9a,0xde,0xa5,0xd2,0xe1,0xaa,0x91,0x85,0xc7,0x0f,0x92,0x35,0x04,0xd3,0x7a,0x13,0xfa,0xf2,0x86,0x5a,0x38,0xd1,0x7f,0x10,0xd8,0x30,0x0e,0x33 +.byte 0xe3,0xa0,0x8a,0xad,0x4f,0x6c,0x24,0xdd,0x9d,0x1c,0x4e,0xff,0x4c,0xfc,0x74,0x01,0xab,0x08,0x6c,0xe6,0x4c,0x78,0x75,0xc9,0x67,0x83,0x1f,0x75,0x22,0xb0,0x7c,0x44,0xa0,0xa1,0xee,0x4e,0xf6,0x3e,0xd3,0x35,0x70,0xbe,0x36,0x1e,0x90,0xa6,0xaa,0x64,0x67,0x7f,0x52,0x84,0xd9,0x27,0xab,0x37,0x30,0x68,0x46,0xcc,0x0e,0x57,0x58,0x6f +.byte 0xdb,0xb2,0x5f,0x24,0xf7,0xeb,0x97,0xea,0x64,0xec,0x6c,0x1e,0xe1,0xc4,0x72,0xfb,0x00,0xa7,0x62,0xa0,0x59,0xb9,0x17,0x8a,0x33,0x32,0x59,0xb8,0xbe,0x84,0xd4,0x62,0xb7,0xf6,0x35,0xd4,0xf1,0x1c,0xdb,0x7e,0xa6,0xbc,0x2c,0x54,0x3c,0xf5,0x63,0x4a,0x22,0x26,0x58,0xa0,0x35,0x98,0xa7,0x32,0xb2,0xa0,0x2b,0xd5,0xfa,0x2f,0x9b,0xb4 +.byte 0xea,0xd6,0x58,0x61,0xb2,0x24,0x45,0x46,0x1e,0xac,0x79,0xa4,0xf7,0xc1,0x13,0x2f,0xf5,0x6b,0xfa,0x70,0x50,0x2b,0x83,0xee,0x7c,0xc1,0x55,0x27,0x7b,0x4f,0xa6,0x0a,0x72,0x26,0x82,0xcd,0x4d,0xe2,0xe8,0x45,0xe6,0xd7,0x39,0x7e,0xed,0x35,0xdf,0x9e,0xb1,0x41,0x55,0xa2,0x5d,0x68,0x4b,0x0b,0xd1,0x73,0x5a,0x2b,0x81,0x35,0x28,0xfc +.byte 0x64,0x08,0xd7,0xc4,0x9f,0x30,0x77,0x3d,0x9d,0x80,0x15,0x67,0x9a,0x84,0xe4,0x34,0xea,0x8c,0xf7,0x73,0x9e,0x33,0xb4,0x09,0x33,0xbd,0xd8,0x82,0x43,0x7d,0xc5,0x1f,0x0e,0x7b,0xa0,0x53,0x59,0x20,0x12,0x57,0xed,0xda,0xc7,0x19,0x8e,0x62,0xe4,0x09,0xc1,0x4b,0x20,0x32,0x9e,0x18,0x11,0x1c,0x42,0x49,0x62,0x76,0xa8,0x83,0x72,0x11 +.byte 0x45,0xe7,0xb5,0x60,0xa7,0xc0,0x07,0xbd,0xb4,0x7c,0xc6,0x5c,0x03,0x34,0xa3,0x85,0x47,0x24,0x75,0xd2,0xab,0x46,0xbb,0xc7,0x0d,0xcd,0x40,0xe2,0x5e,0x5b,0xa7,0x98,0x67,0xe4,0xe2,0x02,0xe9,0xdc,0xd7,0xc2,0xaf,0x90,0x43,0x94,0xfe,0xf3,0x53,0xc1,0x10,0x28,0xa7,0x90,0xba,0x73,0x57,0x0c,0x4d,0x6d,0xbd,0xda,0x81,0xd5,0x90,0xce +.byte 0x02,0x40,0xb3,0xf0,0xec,0x50,0x82,0xc9,0xfb,0xf1,0x22,0x6d,0xc8,0xd2,0x7b,0xed,0x0b,0x43,0x7e,0x0b,0x60,0x9b,0x69,0x9e,0x58,0x26,0xc3,0x9f,0x6b,0xd0,0x31,0xeb,0xb7,0x0a,0xf3,0x9a,0x9a,0xf5,0x72,0xcf,0x29,0xc8,0x19,0x08,0x4d,0x67,0xd5,0xa1,0x8f,0x68,0x0e,0xee,0x59,0x14,0xf8,0x86,0xc0,0x08,0x5a,0x56,0xfe,0x6a,0xb7,0xac +.byte 0x78,0x8d,0x77,0x39,0x5e,0xb1,0x01,0x4d,0x31,0x81,0x56,0xdc,0x5b,0x10,0xda,0x4d,0xd2,0xfd,0xfc,0xa3,0xe3,0xaa,0x46,0x29,0x1a,0xea,0x9c,0x47,0x1b,0xd0,0xa6,0x84,0x1f,0x71,0x1a,0xd3,0x35,0x59,0x7f,0xef,0xf7,0x81,0x39,0x7a,0x9f,0x4a,0x01,0x4d,0x46,0xcf,0xa4,0x6a,0x9c,0x7e,0x07,0x8b,0x98,0x17,0x49,0x5c,0x46,0xac,0xc8,0xfd +.byte 0x1c,0xaf,0x91,0x30,0x0c,0x36,0x63,0xef,0x69,0xd3,0x47,0xf4,0x76,0xc1,0xf7,0x40,0x03,0x98,0x9e,0xcb,0x61,0x65,0x46,0x45,0x1c,0x1b,0xfd,0x13,0x36,0xe9,0x19,0xbf,0x2b,0x59,0x51,0xe8,0x04,0x44,0xe3,0xc2,0x4b,0x66,0x78,0x69,0x66,0xa3,0x1a,0xe5,0x2a,0xad,0xf8,0xc5,0x0f,0xb7,0x3e,0xe8,0xab,0xe0,0xe4,0xd9,0xc2,0xb8,0x61,0x5b +.byte 0xef,0x6b,0x4d,0x5f,0xb8,0xdc,0x06,0xa5,0xce,0x08,0x5b,0x1f,0xf4,0x29,0x4d,0x0a,0x3e,0xb3,0x60,0xf4,0x63,0x3c,0x70,0x5d,0x02,0x9c,0x55,0x5e,0x5e,0xd1,0x9b,0xed,0x20,0x75,0x54,0xa1,0x8e,0xae,0xce,0x5a,0xb2,0x2d,0xe4,0xc3,0x9b,0x7d,0x72,0xce,0x7c,0x0c,0xa9,0x99,0xa4,0x12,0xaa,0x31,0xe9,0x61,0x47,0x8a,0x41,0x93,0xd5,0x69 +.byte 0xc5,0xf3,0x9f,0xf4,0x97,0x69,0x64,0x6f,0xf9,0x5b,0xbf,0x58,0xf6,0x3b,0x3e,0xd6,0x93,0x94,0x89,0xcc,0xc0,0x25,0x7d,0xf8,0x40,0x9e,0xb2,0xc8,0x75,0x9d,0x4d,0xf0,0x5f,0xa5,0x3d,0x38,0x67,0xea,0x8d,0x1b,0x60,0x5e,0xfe,0xa8,0x26,0xb9,0xed,0xc0,0xe9,0xc8,0xec,0xb1,0x77,0x0f,0xf2,0xaa,0x77,0x2a,0xcd,0xa8,0x70,0xb7,0xda,0x60 +.byte 0x49,0xb3,0x01,0x95,0xc8,0xac,0x71,0x6a,0xd0,0x49,0x67,0x2a,0x04,0xfc,0x55,0x38,0x08,0x37,0xd9,0x21,0x37,0xce,0x41,0xaf,0x7c,0x33,0xdd,0xcd,0xe0,0x92,0x27,0x38,0x63,0x77,0xea,0x86,0x04,0x99,0x4e,0x61,0x8b,0x8f,0xfe,0x4e,0xc1,0x16,0x6c,0x89,0xac,0x1f,0x0b,0x67,0x75,0x49,0xf4,0xdb,0x6d,0xd3,0xb8,0x1d,0x9c,0xb2,0xe6,0x98 +.byte 0x81,0xae,0x3f,0xe0,0xdd,0xda,0xfa,0x4c,0x8b,0x30,0x18,0x88,0xa1,0x1d,0xa1,0x18,0xb8,0x28,0xc2,0x04,0x6a,0x80,0x02,0x5a,0xe6,0x04,0x85,0xfa,0x54,0x38,0x45,0x64,0xe1,0x50,0x4a,0x38,0x4c,0x85,0xf7,0x00,0x0c,0xd3,0x16,0xcb,0xfa,0x38,0xb4,0x1b,0x6a,0x95,0x3d,0xc3,0x24,0x79,0x0e,0x3e,0x81,0xe6,0xc3,0xd9,0xdb,0x05,0x19,0x7c +.byte 0xb4,0x4d,0xef,0x71,0x22,0x53,0x97,0x8a,0xc9,0xe3,0x69,0x20,0x5b,0x83,0xb1,0x44,0xd7,0xd1,0x1e,0x87,0xa7,0xbf,0xe4,0x84,0x68,0x9c,0x77,0xfe,0x83,0xdb,0x7a,0x53,0xa8,0x53,0x1f,0xc7,0xd1,0x6a,0x26,0x87,0x71,0x06,0x23,0xa7,0xe0,0x18,0x5d,0xfa,0x8c,0xa7,0x24,0xee,0xf6,0x74,0xab,0x17,0xd3,0x46,0x33,0xe9,0xc3,0xcd,0xa6,0xaf +.byte 0xcf,0xa1,0x60,0x75,0x7b,0x77,0xc3,0x58,0xa2,0xe8,0x87,0x7b,0x4b,0x57,0xb1,0x96,0xc1,0x91,0x6d,0xbf,0x71,0xb3,0xbf,0xe2,0x62,0x86,0x72,0xa9,0x01,0x64,0x62,0x32,0x33,0xc8,0xa4,0x26,0x7d,0xfa,0x0d,0xd4,0xd8,0xc3,0xaa,0xc0,0xc8,0x7c,0x51,0xe8,0x10,0x08,0x6f,0xf6,0xc1,0x46,0x89,0xc4,0xd2,0x00,0x1d,0x14,0x05,0x89,0x64,0x52 +.byte 0xcd,0x1f,0x97,0x0b,0x1d,0x94,0xbe,0x9d,0xa0,0x6b,0x03,0x9b,0x83,0x87,0x38,0x0f,0x65,0xdd,0x6a,0xaf,0xf1,0x22,0x74,0x7e,0x11,0xa0,0xdf,0x1e,0x95,0xef,0x1a,0xdc,0x8b,0x29,0x4a,0xbe,0xfd,0x2f,0xc7,0x48,0x94,0x3f,0xb9,0x8c,0x8e,0xe1,0x0c,0x54,0xa6,0x2f,0xa5,0x2b,0x71,0xdd,0x16,0x68,0x91,0x35,0xd0,0x22,0x48,0x1f,0xf2,0xe2 +.byte 0xe8,0x57,0x83,0xd7,0x49,0x43,0xfd,0xf9,0x77,0xb5,0xfa,0x70,0x19,0xeb,0xae,0xf6,0x31,0xfe,0xd6,0x81,0x6c,0xcc,0x14,0x28,0xa6,0x9f,0x74,0x56,0xc5,0xf6,0x51,0xba,0xc8,0xbd,0x32,0x80,0x5f,0xdb,0x28,0x3f,0x4a,0x55,0x01,0xe1,0x39,0xf5,0x9c,0xda,0xb3,0x42,0xee,0x43,0x17,0xc3,0xc7,0xf5,0xd1,0xda,0xd2,0x2e,0x56,0xcf,0x77,0x0e +.byte 0xdd,0x72,0xcf,0xe5,0xab,0xfb,0xd6,0xa2,0x6c,0x03,0xa6,0x77,0x25,0xf8,0x2a,0x8c,0xfa,0x6f,0x45,0x79,0x59,0x84,0x92,0xd1,0x00,0x58,0xc7,0xb8,0x95,0x4d,0xc8,0x49,0xad,0xe0,0x1e,0x64,0x47,0x00,0xfb,0x93,0x7f,0x3e,0xf1,0x65,0x70,0x47,0x64,0xbb,0x36,0x63,0xe3,0x09,0xcb,0xdb,0x5a,0xd1,0x72,0x83,0xfd,0x15,0x91,0xa2,0x03,0x81 +.byte 0x04,0x98,0x45,0x0f,0x7f,0x23,0x48,0x6c,0xb1,0x2d,0xd0,0x2c,0x61,0x52,0x1b,0x4a,0x52,0x08,0x92,0xe1,0x7a,0xf1,0x8c,0x1f,0x1f,0xdf,0x1c,0xfd,0xd9,0x46,0x99,0x71,0x05,0x58,0x71,0x82,0x5c,0x05,0xa0,0xb2,0x6a,0x50,0xd2,0x6e,0x35,0xf4,0x6c,0xfb,0x50,0x99,0xb3,0xc1,0x2b,0x05,0xaf,0x02,0xe5,0x18,0xfa,0x74,0x09,0xcc,0xa5,0x2c +.byte 0x26,0xfd,0xc5,0xe7,0x2c,0x96,0x0f,0xa4,0x7c,0x88,0xc6,0x7f,0xf9,0x74,0x9d,0x1c,0xe5,0xd2,0x27,0xf0,0xae,0x5b,0x4c,0xbf,0x0a,0x99,0x2e,0xaa,0x54,0xba,0x0d,0x75,0xd9,0x48,0x76,0xf3,0xe9,0xd9,0x01,0xbe,0xaa,0x97,0x09,0xfe,0xb2,0x4a,0xcb,0x55,0xd0,0xe1,0x58,0xec,0x31,0x0c,0xd9,0xdf,0xd9,0x01,0xf9,0x3c,0x28,0x40,0x91,0xbb +.byte 0x4d,0x2d,0x88,0x60,0x31,0xc7,0xc9,0x1d,0xaf,0x22,0x44,0x21,0x05,0x06,0xdd,0x07,0x60,0x29,0x7d,0x49,0x30,0x9d,0x35,0x1d,0x9f,0x37,0xbd,0x32,0xb2,0x21,0xa6,0x4f,0x89,0xd8,0xe6,0x85,0x44,0xcf,0x13,0x12,0x4f,0x5f,0x50,0x71,0x01,0x39,0xff,0x6e,0xa0,0x07,0xff,0xf0,0xa6,0x3b,0x39,0x59,0x17,0xae,0x93,0xb2,0x86,0xcc,0xe5,0x59 +.byte 0x5a,0xf2,0x82,0x62,0xc6,0x8d,0x13,0x2f,0x6b,0x92,0x28,0xbe,0xd1,0xc0,0xf6,0xc9,0xe1,0xd6,0x98,0x94,0x65,0xd4,0x2a,0xdb,0x37,0xb1,0xd3,0x83,0xf2,0xaa,0xa5,0x00,0xf9,0x08,0xe6,0x22,0x38,0x30,0xb6,0x49,0x8d,0x9d,0x1c,0xa4,0xf7,0xdb,0x3c,0x6f,0x75,0x08,0xa0,0xda,0xe9,0xc0,0x01,0x54,0x09,0x68,0xc6,0x7c,0x5b,0x4d,0x88,0x71 +.byte 0xa7,0x2f,0xb3,0x50,0x18,0x4a,0xfb,0x55,0x29,0xf2,0x56,0x1d,0x4c,0x12,0x22,0x1c,0x54,0xd2,0x63,0x67,0xfa,0xe9,0x5b,0x74,0x3b,0x38,0xf6,0xa0,0x85,0x63,0x1c,0x41,0x6a,0x6d,0x71,0x1d,0xb1,0x39,0x28,0x88,0x96,0x9b,0x9c,0x50,0x9e,0x57,0x4e,0xf5,0xa7,0xf4,0x17,0xc6,0xca,0x42,0x84,0x83,0xca,0xa4,0x28,0x72,0x08,0x74,0x62,0xe1 +.byte 0xf0,0x73,0xc5,0x86,0x6c,0x76,0x9d,0xd3,0xa6,0xb8,0x5d,0x73,0x1b,0x02,0xe2,0x69,0x8b,0x59,0xd6,0x6a,0x53,0xe9,0x13,0x88,0x41,0x95,0xe9,0x97,0x5f,0x07,0x62,0xa5,0x21,0x97,0x7e,0x5e,0xc2,0x2c,0xc7,0xaf,0x0a,0xdb,0x9e,0x4f,0x44,0x4b,0xd6,0x3d,0xc0,0x24,0x38,0x50,0x47,0x98,0xa3,0xfc,0xda,0xfc,0xae,0x0e,0x2b,0x9b,0x53,0x0f +.byte 0x6b,0xb1,0x2f,0xd5,0xd7,0x68,0xc9,0xab,0xb9,0xff,0x7f,0x54,0xd6,0x2f,0x88,0xbc,0x5e,0x6a,0x22,0x49,0x0f,0x98,0xbe,0x1f,0xef,0x3e,0xcc,0xa2,0x72,0x6b,0x16,0xbe,0xe8,0x5f,0x0e,0x36,0xa2,0x68,0xe0,0x65,0xd9,0x7c,0xdc,0x8c,0x6a,0x66,0xf0,0x6a,0xfc,0x2b,0x85,0x28,0x2a,0x1a,0xfc,0x92,0x64,0x3d,0x38,0x5b,0xc1,0x0c,0x68,0x45 +.byte 0x94,0x85,0x58,0x82,0x99,0xfc,0x20,0xdd,0x62,0xae,0xed,0x35,0x7c,0x02,0x16,0x9b,0x00,0x8a,0x44,0x02,0x80,0x00,0xca,0x7d,0x95,0x03,0x5d,0xa6,0xec,0xe1,0x0c,0x50,0x34,0x61,0x55,0xee,0xb5,0x11,0xff,0xc3,0xaa,0xf2,0xbc,0xa3,0xa9,0xc7,0x6b,0x16,0xab,0x56,0x7b,0x55,0x54,0x95,0x88,0x15,0x15,0x6a,0x2c,0x97,0xd7,0x7c,0x26,0x65 +.byte 0xaf,0x8d,0xd1,0x05,0x57,0xb2,0x63,0xd1,0x22,0xf7,0x7d,0x77,0x54,0x6c,0x87,0x03,0x1f,0x0e,0x2b,0xae,0xa6,0xa4,0xb5,0xd6,0x95,0x34,0xd0,0x62,0x4e,0xfb,0xcb,0xee,0x01,0xc1,0xf7,0x36,0x94,0xa6,0x54,0x94,0x90,0x0e,0x45,0x9c,0x95,0x89,0x96,0x88,0x32,0x90,0x27,0x48,0xc5,0x96,0xf0,0x7e,0x7f,0x69,0x99,0xdf,0x7b,0xfb,0x2b,0x7b +.byte 0x38,0x10,0x6b,0xd1,0x1a,0xfb,0xf2,0xcd,0x2d,0x8b,0x47,0x21,0xca,0x92,0x64,0x28,0xd1,0x53,0x1d,0xed,0xa7,0x7d,0xa4,0x88,0xab,0xd0,0xfe,0x9b,0x2b,0xf8,0x48,0x94,0x8d,0xd5,0xfa,0x5c,0xef,0x12,0x43,0xdf,0xb6,0x5b,0x83,0x43,0xf3,0xf7,0x1d,0x6f,0x3e,0x44,0xe6,0x20,0xd8,0xbc,0x4a,0x9a,0xed,0xa0,0x79,0x66,0x8d,0x23,0xca,0x35 +.byte 0x15,0x87,0x11,0x50,0xa4,0x40,0x6e,0xfa,0xf7,0xaf,0xa2,0xb7,0x3b,0x9b,0x8b,0x44,0x19,0x90,0xb3,0x47,0x92,0x08,0x2f,0x0c,0xe2,0x95,0x5d,0x80,0xb5,0x93,0x5e,0x1c,0xb5,0xce,0x52,0x0b,0x12,0xc1,0x72,0x2e,0x66,0x8c,0xd1,0x13,0x94,0x36,0xf7,0x17,0xe3,0xad,0x69,0xc9,0x2d,0x21,0x64,0xcd,0x8f,0x2d,0x8f,0x0c,0x85,0xa5,0x23,0x8b +.byte 0x6c,0x00,0x13,0xf7,0x6a,0xb4,0x68,0x1a,0xcc,0xc4,0x03,0x5b,0xd6,0x7b,0x5b,0x34,0x90,0x34,0x3e,0x0a,0x07,0x19,0x81,0x99,0xe9,0xd2,0xa8,0x73,0x2c,0xa2,0xcf,0xdf,0x29,0x69,0xbf,0xec,0xdd,0xa5,0xd3,0x16,0xb0,0xd2,0x9c,0x2f,0xeb,0x70,0x50,0x20,0x3c,0x22,0x1a,0x5b,0x55,0x79,0x76,0x0f,0x1f,0xd0,0x34,0xa9,0x55,0xad,0x75,0x75 +.byte 0x7f,0xa7,0x9b,0xa7,0x3d,0x5d,0x73,0xce,0x91,0xf6,0x9b,0xcd,0xa5,0xee,0x48,0x44,0xba,0xd5,0xad,0xbe,0x1e,0xc6,0xd2,0x8b,0x05,0x21,0x20,0xb5,0x7d,0x78,0x88,0x10,0x20,0x85,0x90,0x8f,0x47,0x74,0x68,0xe6,0x32,0x2a,0x13,0x7a,0xb3,0x5d,0xfe,0x24,0x97,0xd1,0x65,0x55,0x60,0xb3,0x88,0xfb,0x59,0xc9,0x29,0x70,0xf1,0x45,0xbd,0xbe +.byte 0x4d,0x01,0x4e,0x5e,0x5f,0x99,0x52,0xf8,0x5f,0x38,0xcf,0xa8,0x5d,0x69,0x54,0x87,0x72,0x41,0xca,0xc4,0x63,0xc1,0x52,0x58,0x66,0x8b,0xda,0x8b,0x61,0xd1,0xab,0x7d,0x8d,0xfe,0x51,0x8d,0xf6,0xd0,0x21,0x4d,0x0b,0xc5,0xea,0x74,0xcd,0x21,0x93,0x4a,0x91,0xe5,0x3f,0xce,0x35,0x3b,0x3f,0xc0,0xab,0xa4,0x23,0x76,0xd1,0x8c,0xa7,0xbe +.byte 0x15,0xab,0x8e,0xd7,0x0d,0x86,0xac,0xc3,0x06,0xff,0x33,0xf2,0x41,0x6f,0x69,0x58,0x49,0xd1,0x73,0xcf,0x5e,0x4e,0x1e,0x46,0x12,0xfa,0x30,0x0d,0x4b,0xb1,0xfb,0xc6,0xe6,0x0d,0xcd,0x8d,0xca,0x34,0x28,0x5a,0xed,0x85,0x55,0x31,0xee,0xba,0xbf,0xa4,0x6f,0x9c,0x7d,0xeb,0x4b,0x1b,0x73,0xea,0x4e,0xb9,0x62,0x5d,0xac,0xe3,0x53,0xdf +.byte 0x27,0x87,0x2f,0x39,0xca,0x5b,0xd6,0x72,0xcf,0x95,0xc6,0x2a,0xa5,0x3f,0x57,0xfd,0xdc,0xa9,0x4a,0x86,0x0f,0xcd,0xd5,0xea,0xfe,0x85,0xeb,0x9b,0x84,0xc6,0xf7,0xba,0xc2,0x37,0xbc,0x18,0x85,0x49,0xa6,0x7f,0xd9,0x3e,0xfb,0xf0,0x0c,0x39,0xe3,0x1c,0x06,0xfe,0xb6,0x49,0xa3,0x8b,0x72,0x2b,0x39,0xa1,0x48,0xfd,0x1f,0xfe,0xa4,0xf7 +.byte 0xcc,0x7a,0xef,0x64,0xa0,0x0d,0xeb,0x78,0x71,0x8c,0xd6,0x59,0x7c,0xf4,0xaa,0x81,0x7a,0x89,0xe6,0x22,0xc9,0x57,0xe8,0x13,0x9c,0xca,0xc4,0x6f,0xb5,0xbf,0x08,0x31,0x93,0x56,0x2a,0x82,0x00,0x95,0xdc,0x4b,0xfd,0x9b,0xc7,0x8b,0x31,0x72,0xa0,0xff,0xbe,0xb4,0xd6,0x07,0x16,0x0a,0x4a,0x0a,0x96,0x02,0x83,0x53,0x2a,0x4d,0x33,0x72 +.byte 0x1f,0x20,0x20,0xc3,0x63,0xee,0x4e,0x05,0x90,0x7d,0x21,0xd0,0xf1,0xda,0xde,0x0d,0x4a,0x59,0xb9,0xca,0x81,0xe3,0x1f,0x83,0x19,0xdc,0x09,0x03,0x5f,0xaa,0xee,0xbc,0x5a,0xfa,0xc6,0x4d,0x3d,0xfe,0xfe,0xf3,0xdb,0xc3,0x77,0x31,0x74,0xb4,0x94,0xb5,0x09,0xb1,0xb5,0x13,0x47,0x2e,0x4f,0x3b,0x38,0x83,0xf5,0xfc,0xe9,0xcc,0x45,0xea +.byte 0x5b,0x88,0x21,0xba,0x53,0xc5,0xf6,0xd4,0x63,0xc5,0x37,0x1d,0xa1,0x42,0x2e,0x9c,0x9a,0x50,0x2c,0xfe,0xdb,0xf6,0x31,0x36,0x5f,0x9d,0xed,0x63,0x42,0x20,0xdd,0x27,0xe5,0x34,0x3c,0x0f,0x06,0x8b,0x8f,0x32,0xb6,0x47,0xce,0x07,0xcb,0x27,0xc1,0xb7,0xfe,0xb2,0x69,0x81,0x79,0x20,0xd7,0x47,0xbb,0xab,0x61,0x5f,0x09,0x99,0xdf,0x9f +.byte 0xde,0x59,0x33,0x75,0xd1,0xcc,0xfe,0x92,0x79,0x1f,0x2d,0x59,0x88,0xef,0x4b,0x80,0x0c,0x38,0xa3,0xb1,0xef,0xae,0x53,0x84,0x2f,0xbd,0xd3,0x0c,0xcf,0xd5,0xf7,0xb7,0x6f,0xa7,0x22,0x1f,0xf1,0x56,0x76,0x0c,0x78,0x52,0xa3,0xc0,0xd0,0x2f,0xbc,0xdf,0x29,0x0d,0xa8,0x54,0x0d,0x2b,0x65,0x1b,0x7f,0xeb,0x21,0x22,0xaf,0x10,0xc1,0xd6 +.byte 0x30,0xa8,0x2f,0xb1,0x25,0xbf,0xdc,0xee,0xe9,0x35,0x40,0x69,0xa0,0xa0,0x27,0x85,0x2e,0x18,0xc1,0x36,0x24,0xc5,0x96,0x9a,0x85,0x3f,0xbb,0xfd,0xf5,0x02,0xa2,0xa1,0x92,0x3c,0x16,0x48,0x9f,0xc5,0x00,0x7c,0x7b,0xaf,0x31,0xba,0x68,0x0e,0x58,0x88,0xf4,0x10,0xb9,0xa6,0xe0,0x46,0x2a,0xb8,0x8d,0xc7,0x8e,0xad,0x7c,0xec,0xd2,0x74 +.byte 0x92,0xfe,0x1b,0xd0,0x73,0x79,0x0b,0x4e,0xcc,0x2d,0x5c,0xe7,0x80,0x2d,0x21,0x1c,0x97,0xfc,0x2a,0xc9,0x9c,0x07,0x10,0x64,0x8b,0xf7,0xf5,0x1c,0x54,0xb6,0x6c,0x73,0x1c,0x50,0xd3,0x1a,0x2a,0x63,0xcb,0xba,0xd3,0x95,0xe2,0xa6,0xc3,0xca,0x45,0xfd,0x5e,0x1b,0xbb,0x6b,0x4d,0xb3,0xf7,0xfd,0xaa,0xf9,0x73,0xb8,0x74,0x4d,0x36,0x7e +.byte 0xcc,0xaa,0x1e,0xf3,0x20,0x68,0xa5,0x0c,0x03,0xe3,0xbe,0xee,0x82,0x03,0x8d,0x10,0xa6,0xf6,0x6c,0x73,0xc2,0x9d,0x74,0xba,0x57,0x17,0xd7,0xfa,0x85,0xf5,0x1e,0x3d,0xf8,0xc7,0x80,0xef,0xcd,0xf0,0xf4,0x46,0xfc,0x07,0xb5,0xc4,0x5f,0xd2,0x04,0x6a,0x90,0xf5,0x76,0xb6,0xf9,0x73,0x22,0xa6,0x09,0x2f,0xbf,0xb5,0x93,0x9a,0x95,0x05 +.byte 0x95,0xaa,0xf9,0x8c,0x71,0xd6,0xc6,0xd9,0x72,0x50,0xf6,0x58,0x77,0x09,0x47,0x97,0x21,0x42,0xf0,0x30,0x5c,0x3c,0xec,0x60,0x67,0xdf,0x5e,0xd2,0xed,0x0f,0xab,0x25,0x11,0xbb,0xf8,0x34,0x1e,0xbd,0x7f,0xc6,0x52,0x19,0xf5,0x53,0x28,0x46,0x75,0x93,0xce,0xc2,0x0b,0xdf,0xfd,0xa5,0xf1,0xb0,0xa2,0x0b,0x97,0xb5,0x76,0xb4,0x8a,0x2b +.byte 0x82,0x55,0x23,0x29,0xc2,0xd3,0x32,0x94,0x2f,0xf0,0xe6,0x77,0x2c,0xe4,0x6a,0x7f,0xd7,0xee,0x84,0xfb,0xba,0xb8,0x4b,0xae,0x13,0x34,0xbd,0xa8,0x12,0x7a,0x3c,0x28,0x40,0x74,0x5d,0x9a,0x11,0x1a,0xe9,0x74,0x31,0x28,0x3d,0x3d,0x64,0xb7,0x54,0xa0,0x51,0x0d,0xed,0x97,0x94,0x56,0x7a,0x48,0x8e,0x36,0xc9,0xae,0x5f,0xc6,0x79,0x45 +.byte 0x4f,0x07,0xdd,0x13,0x52,0x8b,0xfc,0x3b,0x73,0x44,0x68,0x64,0x51,0x0d,0x95,0x6f,0x0f,0x94,0xba,0xf8,0x40,0x64,0x51,0x43,0x49,0x63,0xc1,0xbd,0xf3,0x39,0x7f,0x6e,0x6f,0x45,0xeb,0xd2,0x33,0x44,0x2d,0x10,0xb4,0x68,0xcb,0xcb,0x8c,0x84,0xc5,0xd4,0x63,0x1d,0x23,0x85,0x30,0x4d,0x6c,0xfc,0xc9,0xa4,0x8c,0xd2,0x42,0x69,0x2f,0x17 +.byte 0x86,0xf0,0x17,0xd0,0xb2,0xaa,0xfd,0x62,0xcb,0xb4,0xfd,0xba,0x29,0xf8,0x85,0x45,0x84,0x9d,0xae,0xf8,0x9c,0x8f,0x64,0xd5,0xb8,0xb6,0xa9,0x64,0xf9,0x39,0x86,0x68,0x29,0xac,0x32,0x87,0x84,0x6c,0xb0,0x09,0xd2,0xdd,0xf2,0xec,0xa1,0x3a,0xfd,0x11,0x37,0x54,0x67,0x29,0x62,0x25,0x62,0xe8,0x6a,0x4b,0x5e,0xde,0x9a,0xf0,0x97,0x73 +.byte 0x66,0x69,0x2a,0x21,0xbe,0x95,0x86,0xca,0xf9,0x17,0xe9,0x4b,0x23,0x83,0x1e,0x8c,0x37,0x47,0x91,0x03,0x3f,0x9f,0xb8,0x60,0x2c,0xdd,0x82,0xbd,0x2a,0xc3,0xe7,0x30,0x8f,0x91,0x2b,0xa4,0x23,0x01,0x03,0xb2,0x8b,0xbd,0xd2,0x1d,0x16,0xf7,0x6a,0x86,0xa8,0xe4,0x54,0x6f,0x9c,0x47,0xa5,0x0f,0xbe,0x94,0x56,0xfa,0x18,0x69,0xbe,0x92 +.byte 0xe9,0xf8,0x24,0x4d,0x65,0x42,0x81,0x1f,0x85,0x52,0xb7,0xc9,0x49,0xde,0xa5,0x4c,0x8f,0x0d,0x5f,0x12,0x68,0x68,0x35,0xce,0x29,0x22,0x5c,0x55,0x3e,0xbd,0xce,0xf2,0x2a,0xec,0x7e,0xe1,0x29,0x0a,0x88,0xf3,0x5e,0xeb,0x27,0xe5,0x52,0xee,0x72,0x37,0xba,0xff,0x82,0x97,0xa9,0x5d,0x77,0x6f,0xb9,0xc3,0xa7,0x73,0xba,0x7f,0x2f,0x7a +.byte 0x19,0x32,0x87,0x56,0xa2,0x89,0xb2,0xb4,0x48,0xbe,0x2e,0x30,0x89,0x0a,0x8f,0x75,0x25,0x25,0x5c,0x46,0xe8,0x02,0x45,0xcb,0x03,0xd1,0xa3,0xeb,0x70,0x71,0x08,0x1c,0x46,0xf1,0x2c,0x43,0xe2,0x44,0x30,0x6a,0x61,0x31,0x45,0x3e,0xbb,0x47,0x33,0x24,0x25,0x13,0xeb,0xf7,0x24,0x66,0x15,0x4c,0xf3,0x07,0x2f,0xff,0xdc,0x37,0x0f,0x71 +.byte 0x85,0xc8,0x56,0xa7,0x2a,0x22,0x87,0x8b,0xae,0x35,0x31,0x29,0x96,0xf0,0x81,0xfb,0x2c,0xbf,0x44,0x69,0x69,0x9a,0x77,0xfd,0xc0,0x2b,0x42,0x16,0x67,0xd6,0xbd,0xd0,0xf1,0xb9,0x40,0x8f,0xd2,0x9a,0x1b,0x2c,0x64,0x78,0x6b,0xda,0x37,0x26,0xae,0x4c,0xee,0x36,0xaf,0x84,0x61,0xe4,0x93,0x22,0x64,0xaf,0xee,0x6d,0x69,0x5c,0xe5,0x85 +.byte 0xd8,0xcc,0xcf,0xf3,0xe8,0x05,0xcd,0xd2,0x09,0x66,0xaf,0xbb,0xc4,0x79,0xb2,0xa7,0xa5,0x09,0xd9,0xf5,0xa2,0x83,0x4f,0xd5,0xf5,0xf3,0x7d,0x7a,0xab,0x94,0x83,0xb3,0x15,0xfb,0x0d,0x1a,0x1d,0x77,0xc5,0x63,0x0b,0x54,0xde,0xa8,0x0d,0xc4,0x16,0xe3,0x89,0xeb,0xa3,0x1b,0xd4,0x77,0x13,0xe3,0x55,0x98,0x15,0xab,0x3b,0x32,0xc8,0xd4 +.byte 0x0c,0x91,0x80,0x57,0xf7,0x1e,0x24,0xd0,0x56,0x78,0x29,0xd2,0x03,0xe7,0xc4,0xd2,0x09,0xca,0xee,0x9b,0x60,0x5f,0xa1,0xfd,0xaa,0x85,0x4b,0x68,0x35,0xa4,0x3b,0xef,0x29,0xb8,0x49,0x85,0xee,0xbb,0x39,0xc0,0xc6,0x99,0x97,0xc6,0x86,0x6c,0x27,0xf9,0x1a,0x19,0x6e,0x7c,0xae,0x75,0x41,0x0d,0x08,0x1e,0xf0,0xb4,0xc3,0x9e,0xdb,0x40 +.byte 0x86,0x94,0x9d,0x90,0x09,0x3f,0xdc,0xb9,0xfc,0x59,0x41,0xc5,0x5b,0x89,0x97,0x49,0x4a,0x1a,0x06,0x68,0x83,0xd8,0x7e,0x09,0x51,0xe1,0x86,0xd8,0x88,0xbe,0x8a,0x36,0x48,0xb3,0x83,0x7b,0x57,0xdd,0x8f,0x18,0x67,0x4a,0x7d,0x68,0xab,0xb9,0x05,0xf0,0xe4,0x27,0x4e,0x33,0x44,0xa7,0x13,0x04,0x94,0xc5,0x57,0xaf,0x36,0x03,0xe8,0x09 +.byte 0x36,0x5b,0xe8,0x92,0xad,0x0a,0x79,0x02,0x24,0x43,0x62,0xc7,0xa5,0xce,0x7c,0xac,0x6d,0x0a,0xf2,0x83,0x33,0x05,0x3b,0x6f,0x9d,0xda,0x96,0x9f,0x8b,0x79,0x3e,0x6c,0xd6,0xba,0x7f,0xea,0x84,0xd8,0x23,0xb6,0x92,0xc3,0x9c,0x7f,0x0d,0xcb,0x7b,0x9f,0xbd,0xc2,0xf5,0x6f,0x71,0x67,0x5f,0x0b,0xd1,0x73,0xb5,0x8c,0x46,0x07,0xcd,0xd8 +.byte 0xee,0x28,0xcf,0x8f,0x8e,0x5c,0xde,0x14,0x78,0xc7,0x60,0xd5,0xf4,0x49,0x97,0x46,0x5f,0x49,0x4a,0xb4,0x8f,0xc9,0xd1,0x52,0x34,0x01,0x29,0xa1,0x46,0x55,0xf8,0x29,0x53,0xbb,0x32,0x1e,0x4b,0x89,0x96,0x53,0x0b,0xf2,0x16,0xf9,0xa7,0x70,0x93,0x59,0x78,0xc0,0x77,0x78,0x9f,0x6c,0xb3,0x0e,0x3f,0x6f,0x40,0x09,0x1d,0xd6,0x66,0x4e +.byte 0xe8,0xb0,0xa1,0x14,0x65,0xc8,0xc7,0x3f,0xd2,0xf0,0x1f,0xfd,0x51,0xe0,0x29,0xd6,0x39,0x26,0x60,0xfe,0x62,0xc2,0xe4,0x45,0x6d,0x01,0xdb,0xd3,0x7c,0xdf,0x48,0x10,0x2f,0xf2,0x8e,0x6c,0xc6,0x58,0xc3,0x7d,0x26,0xb1,0x9d,0x52,0x02,0x2a,0x5f,0x2b,0x57,0xca,0x84,0x9d,0x74,0x31,0x01,0x0f,0xda,0x3d,0x7c,0xbb,0xdc,0x71,0x82,0x8b +.byte 0x42,0xaf,0x49,0x9e,0x2c,0xe8,0xdc,0xa1,0xfb,0x23,0x6d,0xdb,0xdc,0x36,0x01,0xc9,0xb3,0x93,0xd4,0x2e,0x8b,0xd1,0xe4,0xed,0x1b,0xd0,0x4c,0xeb,0xaf,0x96,0x57,0xde,0xee,0x90,0xf4,0xa7,0x58,0x46,0x8a,0xd4,0xa9,0x44,0xe0,0xb3,0x13,0x96,0xb2,0x8a,0xb0,0xd3,0xbe,0x71,0x38,0xb7,0x35,0xa9,0xa8,0x48,0x37,0xa3,0x11,0x0e,0x61,0x36 +.byte 0x6c,0xaf,0x6c,0xf2,0x3f,0xd6,0x55,0xb3,0xa5,0xe0,0xaf,0x18,0x6a,0xf5,0x78,0xb5,0x7c,0xc7,0x48,0x24,0x6c,0xea,0x1e,0x7f,0x52,0xb4,0xe8,0x72,0x46,0xd2,0xbd,0x1c,0x9e,0xe6,0x5b,0x3e,0x9c,0x6c,0x6c,0x6b,0x45,0x0c,0x3a,0xb7,0x67,0x3c,0x8e,0x77,0x77,0xbf,0x50,0xb6,0x30,0x6e,0xe1,0x28,0x0d,0x2a,0x85,0x44,0xf8,0xbb,0xf1,0x14 +.byte 0x89,0xaa,0xc2,0x27,0xf5,0x8e,0xa1,0xd3,0x07,0xba,0xe8,0x03,0xcf,0x27,0x1c,0xa6,0xc4,0x63,0x70,0x40,0xe7,0xca,0x1e,0x05,0xb7,0xb7,0xdc,0xc0,0x07,0x4c,0x0d,0x21,0x12,0x60,0x02,0xe3,0x86,0x65,0xe7,0x1c,0x42,0x86,0xdd,0xdb,0x7f,0x26,0x60,0x01,0x3d,0xd8,0x18,0xcd,0x7a,0x9f,0xf8,0xb2,0xf6,0x6d,0xd3,0xe0,0x57,0x1f,0x80,0x30 +.byte 0x2d,0x5e,0x71,0xdf,0x4d,0x7f,0xcd,0x63,0x77,0x19,0x5e,0x2d,0xd5,0xb5,0xfa,0xa9,0x26,0x02,0xb9,0x62,0x2b,0x57,0x80,0x0a,0xe9,0xbc,0xa4,0x3b,0xa7,0xf1,0xf3,0x77,0x2b,0x6b,0x41,0x5e,0xf7,0xe8,0x66,0x23,0x63,0xac,0xcd,0x58,0xfc,0xa9,0x97,0x6b,0x5a,0x1e,0xe5,0x7d,0xfd,0xb1,0x42,0x7f,0x99,0xdd,0x60,0xaf,0x39,0x46,0x36,0xdd +.byte 0xc2,0x70,0x83,0x53,0xd1,0xc3,0x69,0xc8,0x90,0x0e,0x2b,0x34,0xb2,0x0c,0xb9,0x7a,0xb8,0x6b,0x7c,0xc2,0xf3,0xae,0x41,0x24,0xb8,0x94,0x5f,0xdd,0xce,0xda,0x95,0xda,0x49,0x81,0xb6,0xf8,0xa9,0x8e,0xb3,0x79,0xf8,0x55,0xf9,0xcf,0x8c,0x24,0x99,0xfc,0x6b,0x15,0x0f,0x39,0xac,0xd0,0x3e,0x89,0x9d,0xc2,0x46,0x8c,0x99,0x45,0xfd,0xce +.byte 0x13,0x4c,0x9c,0xc8,0x80,0x87,0x8f,0x7b,0x28,0xe3,0x5e,0x2b,0xe3,0x89,0x7e,0x13,0x52,0x52,0xe9,0x3a,0xed,0x33,0xe7,0x28,0xc7,0x7a,0x48,0x8d,0x0e,0xee,0x24,0xc4,0x61,0x04,0x3c,0xd4,0x7e,0xf3,0x30,0x22,0x07,0x58,0xae,0x02,0xc5,0xd1,0x7d,0x04,0x18,0xca,0xd6,0x04,0xd4,0xc5,0xa4,0xff,0x8d,0x0d,0x68,0xd4,0x1a,0x3a,0x72,0x6f +.byte 0x41,0x1e,0xda,0xc0,0x97,0x7c,0x55,0x2c,0x13,0x20,0x9a,0x07,0x35,0xcc,0xc5,0x83,0xee,0x41,0x77,0x51,0x28,0x07,0xe0,0x81,0xe3,0x9b,0x1f,0xdb,0x73,0x5c,0x8d,0x82,0xa2,0x8b,0xf4,0x92,0x4f,0x70,0xa8,0x6a,0xcf,0xbf,0xcf,0x0b,0x71,0xbc,0xeb,0x81,0xb4,0xc9,0x65,0xe7,0x43,0xef,0x25,0x45,0x27,0xea,0xcd,0x60,0x68,0xcd,0x2d,0x7a +.byte 0xfd,0x88,0x6d,0x06,0xd5,0x92,0x32,0xc3,0x18,0x88,0x64,0xa7,0xde,0x39,0xeb,0x0b,0x5c,0x9c,0xf6,0xf6,0x93,0x90,0x24,0x0c,0x9e,0x0b,0x89,0x1c,0xcb,0xc8,0x96,0x72,0x17,0xae,0x46,0x61,0x69,0x6e,0xbe,0x6c,0xf1,0xa4,0xa4,0x50,0xa9,0x2a,0x47,0xd7,0x80,0xe4,0x72,0xd2,0x3f,0x1a,0xdd,0x82,0xdc,0x12,0x66,0x10,0x26,0x15,0x80,0x56 +.byte 0x4d,0xbe,0x02,0xae,0xe1,0x24,0x8a,0x41,0x52,0xc8,0x5d,0x8d,0x62,0x85,0xbe,0x7c,0x35,0xdd,0x88,0xd3,0xf5,0xf7,0x9b,0xf1,0x5a,0x4e,0x70,0x48,0x31,0x5a,0xaa,0x96,0x1e,0xf8,0x73,0xb4,0x0f,0xb2,0x82,0xf4,0x13,0xac,0xba,0x3b,0x12,0x36,0x1e,0x23,0xbf,0x09,0x8a,0x1c,0x96,0x47,0x56,0x2d,0x16,0x24,0xc3,0x23,0x65,0xe2,0x99,0xd0 +.byte 0xf0,0xa0,0x2c,0x64,0x35,0xad,0x16,0x34,0x67,0x52,0xbc,0x8f,0x17,0x90,0xf9,0xc7,0x4f,0x64,0x6c,0x75,0x3f,0xd7,0x48,0xa4,0x6b,0x43,0xe6,0x2e,0x7a,0xe3,0x79,0xe8,0x47,0x51,0xe9,0x52,0x36,0x30,0xa4,0x24,0x89,0x00,0xd5,0x77,0xbd,0x34,0x2e,0xa9,0x74,0x02,0x25,0xc0,0x0c,0x10,0x31,0xf0,0xa7,0xcb,0x01,0xed,0x43,0x70,0x15,0xe6 +.byte 0xda,0x01,0xb4,0x7a,0x13,0xbc,0xf1,0x57,0x34,0xb1,0xb7,0xb3,0x26,0x18,0x5f,0x42,0x6b,0xcb,0x78,0x25,0x48,0xe9,0xe6,0xe8,0xf5,0x45,0xa2,0x61,0x97,0x10,0xa5,0x7e,0x7a,0x48,0xf3,0x23,0xa5,0x88,0xc0,0xc4,0xc7,0x3b,0x5c,0x0c,0xfc,0xe0,0xf4,0x68,0x64,0xc6,0x9f,0xd9,0x17,0xcb,0xe5,0xba,0x4a,0xa4,0xe0,0x27,0xf8,0x2b,0x4e,0x67 +.byte 0x13,0xab,0xd2,0xce,0xbc,0x8d,0xdf,0x6e,0x49,0xaf,0x72,0x8a,0x51,0xa1,0x78,0x38,0x0a,0x58,0x2e,0x72,0xec,0x94,0x70,0x8d,0xdf,0x0b,0x5a,0x52,0x81,0xb1,0x9b,0xda,0x2c,0xd2,0x85,0xbb,0x8f,0xb0,0x99,0x64,0x24,0xbe,0x03,0xd9,0x92,0x8d,0x29,0xf3,0x41,0x9c,0xd6,0xef,0xef,0xb2,0x5c,0x22,0x90,0xff,0x27,0x4d,0xb3,0x91,0x72,0x9f +.byte 0x42,0xca,0x66,0xc5,0x66,0xb7,0x50,0x3e,0x83,0x6f,0x2d,0xe3,0x7b,0x2a,0xc4,0x5a,0x93,0x92,0x80,0xdb,0x1a,0xdd,0xef,0xfd,0x96,0xcb,0x6a,0xd8,0x4a,0xc5,0x6e,0x36,0x4a,0xe4,0x10,0x15,0xb3,0x12,0xb4,0xd9,0x9e,0x37,0x48,0x96,0xcb,0xe5,0x3a,0x4f,0x57,0xa6,0x46,0x2f,0xd3,0x06,0xb8,0x61,0x1c,0x17,0x3a,0xb8,0xad,0x40,0x50,0x57 +.byte 0x10,0xd9,0xd0,0xe9,0x1b,0xe3,0x18,0x8c,0xc4,0xfa,0x08,0x8d,0x82,0x3c,0x22,0x22,0x1b,0x97,0x64,0xa6,0x8b,0x7c,0x70,0x2b,0xa0,0xd8,0x4c,0x64,0xcf,0xbc,0x49,0x78,0xcb,0x92,0x0f,0xe1,0x60,0x12,0x4e,0x92,0x0d,0xaf,0xa4,0x1f,0xe0,0x2a,0xa5,0x69,0xc6,0xa1,0x91,0x5c,0xdd,0xb8,0xae,0xfa,0xc5,0xb9,0x18,0x31,0x81,0x32,0x6e,0x97 +.byte 0x44,0x2a,0xda,0x58,0xcd,0x9e,0x0d,0x57,0xe0,0xe3,0x5f,0x7b,0x04,0xd8,0xc8,0x68,0xf5,0xa2,0xac,0x0c,0x29,0xf0,0x7e,0xff,0x32,0xfb,0x53,0x1a,0xc2,0xe3,0xae,0xa5,0xe4,0x9c,0x50,0xaf,0xf4,0xde,0x0b,0xdd,0x4d,0xfa,0x65,0x3c,0xbe,0x3c,0xb8,0xda,0x88,0xd9,0x6c,0x55,0x58,0xe1,0x4d,0x00,0xa8,0x1e,0xe2,0x3a,0x9c,0x53,0x9b,0xca +.byte 0xb7,0x5d,0x3a,0x83,0xe0,0xbb,0x95,0xc4,0xd5,0x45,0x48,0xdc,0x12,0xab,0x24,0xfc,0x5d,0x91,0xe1,0xc8,0x0a,0x5c,0x10,0xc4,0xc9,0xaf,0xb6,0x54,0x80,0xfd,0xa0,0x70,0xb9,0xab,0xdf,0x34,0x9f,0x5c,0xff,0xde,0x8e,0xa0,0x0b,0x21,0xcf,0x28,0xc4,0xdf,0x67,0xb5,0xc0,0x20,0x49,0x0c,0x7e,0xe6,0xf7,0x41,0x6b,0x75,0xd9,0x1d,0x3b,0x49 +.byte 0xb7,0x4f,0x01,0xd1,0x20,0x62,0x15,0x1e,0x9f,0x16,0xb0,0xbd,0x30,0x09,0x05,0x00,0x0f,0x25,0x5a,0x37,0xe9,0xa6,0xc6,0xef,0xe5,0x39,0x2b,0xd7,0x6b,0xc5,0x96,0xd2,0xad,0x46,0xaf,0xd3,0xc0,0xfd,0xea,0xff,0x4c,0xaa,0x44,0x48,0x9a,0xdb,0x99,0x44,0x3f,0x4a,0xf0,0x3f,0x81,0x75,0xf2,0x79,0x31,0x3c,0xed,0x56,0xc6,0xf0,0xf1,0x8c +.byte 0xdb,0x1d,0x6c,0x6c,0xcc,0xfb,0xc2,0x30,0xf6,0x24,0x14,0x69,0xc4,0x89,0x4d,0xd0,0x10,0x77,0x37,0x00,0xe8,0xc9,0xf2,0x32,0xf1,0x43,0x8b,0xe1,0x09,0xc4,0x59,0x17,0xf9,0x20,0x2b,0x01,0x76,0x20,0xb8,0x03,0x84,0xf6,0xd7,0x2e,0xef,0x20,0xa6,0xfa,0x8b,0x74,0x7f,0x4a,0x14,0x33,0xad,0xac,0x45,0x66,0x18,0x2b,0x6b,0xd2,0xb8,0x20 +.byte 0x1a,0xff,0xca,0x25,0x69,0xfd,0xba,0x4b,0x5b,0x9c,0x38,0x35,0x4c,0x30,0xa2,0x24,0x3d,0xbb,0xd4,0xf3,0x67,0x24,0xa5,0x93,0xc6,0xf5,0xb2,0xb4,0xa5,0x04,0x53,0xb6,0xe4,0xc7,0xdc,0xf1,0xe5,0x43,0xb7,0x73,0xaa,0xab,0x5c,0xea,0xcb,0xf1,0xeb,0x5b,0x04,0x7a,0xff,0x0f,0x5e,0xb4,0xd3,0x2a,0x39,0x50,0x1b,0x54,0x1f,0x32,0xd7,0x7c +.byte 0xea,0x3f,0xee,0xa5,0xc8,0x46,0x48,0x7e,0x75,0x60,0x7a,0x42,0x42,0xd3,0x15,0x07,0x69,0x46,0x1c,0xe2,0x21,0x31,0x94,0x31,0x24,0x9e,0x39,0xab,0x7a,0xf9,0xc2,0x0b,0x2d,0x6b,0x55,0xa3,0x36,0xb2,0x65,0xf2,0x17,0x08,0xde,0x15,0x83,0x07,0x36,0x12,0x54,0x8f,0x0b,0x23,0xa8,0x7e,0xb5,0x57,0x1c,0x9e,0x29,0xd7,0xd4,0x9b,0xc1,0xf6 +.byte 0x94,0x23,0xf3,0x92,0xbf,0xba,0xc8,0xf5,0x78,0x3e,0x67,0x48,0x14,0x3b,0xd4,0xe9,0x8f,0x78,0xc1,0x4b,0x9a,0x59,0x08,0xaa,0x50,0xf4,0x9d,0xc4,0xc3,0x2c,0xbc,0x56,0x2c,0x13,0x30,0x75,0xfb,0xed,0x48,0xab,0x90,0xec,0x64,0x18,0xb5,0xd5,0xb5,0x7f,0xc1,0x7f,0x83,0xf2,0xdb,0xae,0xde,0xf5,0xb5,0x29,0x03,0xbe,0x80,0xb1,0x5d,0x97 +.byte 0xd3,0x7a,0xa4,0xd0,0xe0,0xce,0x04,0xda,0xaa,0x82,0x19,0xc9,0x02,0xb7,0x1c,0xe1,0x66,0xd9,0x3e,0x86,0x6d,0xb5,0xd1,0x35,0x63,0x8e,0x4b,0xc6,0x58,0x41,0xf9,0xb7,0xba,0xf3,0x06,0x91,0xb7,0xa2,0xfb,0xb5,0x5f,0x53,0xf3,0xe0,0xc1,0xf6,0x91,0x66,0xc7,0x93,0x3a,0x0a,0x72,0xb1,0xed,0x36,0x9d,0xde,0x21,0xdd,0x7d,0x0a,0x7b,0x35 +.byte 0x1f,0xc3,0x56,0xde,0xbb,0xcb,0xb2,0x0a,0xb6,0x84,0xce,0xa1,0xc6,0x1a,0x46,0x2f,0x9f,0x48,0xd5,0x98,0x73,0xa4,0xbd,0xbd,0xa3,0xe9,0xc9,0xc4,0x64,0x89,0xb7,0x9c,0x97,0x7c,0x2f,0x88,0x22,0xe4,0x4b,0x71,0x3d,0x2a,0x47,0xee,0xf8,0xfe,0xe0,0xf7,0x03,0x14,0xe6,0x7c,0x9e,0x57,0xbb,0x8e,0xf5,0xea,0x63,0xfc,0x5b,0x18,0x3b,0xa2 +.byte 0xa1,0x4a,0x28,0x82,0x37,0x77,0x5b,0xc4,0xd3,0xc1,0xf2,0x87,0x13,0x2b,0x2a,0xc8,0xac,0x70,0xe1,0x82,0x38,0x9c,0x12,0xa0,0xc4,0x9e,0x6b,0xac,0x33,0x8a,0xe9,0x31,0x6f,0xa1,0x76,0x94,0x48,0xcf,0xbc,0x78,0x22,0x82,0x6a,0xb0,0xb9,0x49,0x71,0xdb,0xde,0x8b,0x90,0x09,0x82,0x4d,0x79,0x17,0xe8,0xcf,0xd8,0x50,0xc3,0x08,0x07,0x81 +.byte 0x5f,0x9a,0x72,0xce,0x0a,0xe4,0x29,0xc9,0xdd,0x95,0x67,0x58,0xa1,0x14,0xec,0xcf,0x2f,0x29,0xcf,0xce,0xb3,0x35,0x54,0x77,0x67,0x56,0xec,0x95,0x68,0xee,0xbf,0x9c,0x9f,0x74,0x78,0x12,0xd5,0x30,0x83,0x28,0xd5,0x36,0x96,0x57,0xa0,0x8d,0x1c,0x99,0x19,0x04,0xaf,0x25,0xe5,0x71,0x83,0x88,0xb0,0x74,0x38,0xdd,0x8a,0xff,0x39,0x7a +.byte 0xfd,0x34,0x8f,0x9c,0x67,0xa8,0xc8,0x6f,0x13,0x5d,0xf2,0x5b,0x22,0xd3,0x8e,0x63,0x51,0x58,0x9b,0xfc,0xaa,0x89,0x65,0x4e,0x36,0xc4,0xa7,0xef,0x98,0xf9,0xaf,0xcd,0x35,0x8c,0x16,0xbc,0x70,0x4f,0xcd,0x71,0x2a,0xf4,0x13,0xb3,0x3d,0xa3,0x92,0x71,0x45,0xe5,0x9a,0x45,0xbd,0xc5,0x1d,0x82,0x60,0x3a,0x97,0xf3,0x0f,0x96,0x21,0x3d +.byte 0xe5,0x6e,0xfb,0x9d,0x9b,0xeb,0x15,0xc2,0xa6,0x73,0x76,0xf2,0xcd,0xec,0xfd,0x0f,0xf4,0x3f,0x46,0xc9,0x9c,0x73,0xa1,0x21,0x08,0xdc,0x31,0x00,0xaa,0x95,0x07,0xf0,0x3d,0x51,0x57,0xfa,0x6b,0xc3,0x8e,0xe9,0xa4,0x65,0xdc,0xff,0x57,0xb9,0x1f,0x4f,0xc6,0x6d,0x03,0x00,0xa7,0x19,0xb8,0x24,0xb5,0x3d,0x87,0xcb,0x84,0xb7,0xf5,0xfe +.byte 0x51,0x16,0x5b,0xc7,0xed,0x4b,0xff,0xa3,0x66,0x17,0x93,0x60,0x69,0x84,0x8c,0x95,0x74,0xa7,0x30,0x2d,0x09,0xf7,0x4e,0x0e,0x2f,0x99,0xda,0x46,0x34,0x0f,0x93,0x90,0x97,0x4c,0xa6,0x25,0x15,0xb8,0x6f,0x1d,0xd5,0xe1,0xc1,0x39,0x50,0xfd,0xd5,0x79,0x4f,0x04,0x2f,0x76,0x50,0x3f,0x67,0x56,0xad,0x02,0x82,0x30,0x1a,0xaa,0x6e,0xe2 +.byte 0x05,0x6a,0x93,0xb7,0xbe,0xde,0x84,0xce,0xd8,0x53,0xed,0xad,0x95,0xab,0x45,0x1f,0x4c,0x3b,0x22,0x36,0x27,0x45,0x19,0xa4,0x7f,0x12,0x20,0x6c,0x9d,0xeb,0xd2,0xfe,0xd6,0x7d,0x25,0xf9,0xe3,0x64,0x77,0x56,0x89,0x12,0x57,0x80,0xd5,0x40,0xbb,0x2a,0xcc,0xac,0x34,0x8e,0x87,0xfd,0x58,0xc3,0xbd,0x92,0x48,0xd8,0x7f,0xc4,0x39,0x6a +.byte 0x4e,0x1c,0x50,0x93,0xef,0xae,0x81,0x93,0x50,0x95,0x6e,0x46,0x7c,0xf5,0x27,0x44,0x6c,0x21,0x06,0x49,0x89,0x7e,0xf4,0xfa,0x08,0xa5,0xbc,0x0a,0xbd,0xb6,0x7b,0x55,0xac,0x87,0x19,0x33,0xfa,0xab,0xf3,0x15,0xc9,0x1b,0x83,0xf2,0x41,0xf1,0x26,0x6f,0xdf,0x15,0x60,0xdb,0xa6,0x03,0x43,0x3e,0x34,0x7a,0xa9,0xb1,0x38,0x57,0xe4,0x09 +.byte 0x1a,0x4a,0xd8,0x6e,0x28,0xee,0x7d,0x74,0x54,0x03,0xb3,0x29,0x24,0xb3,0xf0,0xc6,0x20,0x7c,0x47,0x01,0x66,0x36,0x7a,0x14,0x18,0x09,0xd6,0xaa,0xa6,0x82,0x5b,0xe4,0x0a,0xf9,0x41,0x52,0x3b,0x56,0xa2,0xf8,0xa2,0xa1,0x2b,0xe0,0x0d,0x1f,0x5b,0xe4,0x0e,0xe1,0x94,0x84,0x6f,0xed,0x2e,0x11,0xfa,0x4a,0xbd,0x41,0xf4,0x3c,0x8c,0x7e +.byte 0x94,0x46,0xec,0x79,0x81,0xb0,0x36,0xfd,0x9c,0x73,0x0f,0x84,0x1a,0x59,0x4e,0x1b,0xd5,0xd1,0x0d,0xff,0xfd,0xb7,0xfb,0x73,0x35,0x8a,0x66,0xed,0xf3,0xee,0x6d,0xf7,0x86,0x0a,0xb9,0xc0,0xf1,0xa3,0xb7,0x32,0x49,0x01,0xe8,0xcd,0xfe,0x82,0x7b,0xf6,0x46,0xd8,0x73,0x47,0x8b,0x7b,0x6e,0x31,0x92,0x0f,0x4b,0x16,0x11,0x86,0x1d,0x02 +.byte 0x5d,0x12,0x79,0x59,0xdc,0x8c,0xaa,0x1b,0xc1,0x75,0x63,0xb2,0xd6,0xbf,0x19,0xb0,0x81,0x70,0x34,0x12,0xd2,0x09,0xbe,0x6d,0xa1,0x31,0x77,0xd2,0x9b,0x59,0xdc,0xcb,0x67,0xb5,0x14,0xcd,0x37,0x31,0x2c,0xa6,0x17,0x58,0x2b,0x24,0xfc,0x2a,0x9e,0x8f,0x38,0x38,0x7a,0x80,0xda,0x8b,0x54,0x1d,0xc9,0x99,0xc7,0x1f,0x98,0x7a,0x1f,0x32 +.byte 0x23,0x1c,0xb5,0x6e,0x53,0xd3,0x61,0xe7,0x78,0x19,0x6c,0xd5,0x2f,0x85,0xde,0xd1,0x67,0x6b,0x9b,0xa1,0x09,0x87,0x5e,0x89,0x5e,0x89,0x21,0x36,0xf2,0x94,0xc1,0xfd,0x6c,0x4e,0xd9,0x6b,0xd2,0xb1,0x1b,0x48,0x37,0x9a,0x7b,0xc9,0x52,0xfd,0xe2,0x6d,0x07,0x19,0xf2,0xa5,0x69,0xdc,0x0b,0x52,0x8f,0xb3,0x87,0x03,0x1a,0xd8,0x43,0x20 +.byte 0x68,0xcf,0x08,0xcc,0xce,0x37,0xf6,0x96,0x7f,0x03,0x62,0xb2,0xce,0x6a,0xfb,0x22,0x54,0xd6,0xfc,0x84,0x5c,0xf5,0x55,0x32,0x36,0x77,0x1d,0x15,0x6a,0x2c,0x3a,0x01,0x34,0xff,0x5b,0x7f,0x3f,0xab,0x97,0x8f,0xbd,0x1d,0x07,0xb9,0x47,0xb1,0xcc,0xc0,0xdf,0x17,0x38,0x54,0x07,0xc0,0x1b,0xb9,0xa2,0x29,0xa6,0x25,0x73,0x32,0x4d,0x5e +.byte 0x51,0x60,0xb3,0x27,0xe5,0xb6,0xdb,0x56,0x81,0x95,0x03,0x7e,0xca,0xc6,0x15,0x8f,0x48,0xd4,0xac,0x71,0x41,0xdc,0x9c,0x86,0x5d,0xd8,0x90,0x90,0x54,0xdd,0x3d,0xf3,0xa8,0xbb,0xe5,0x55,0x69,0x26,0xdf,0xd1,0x8e,0x75,0x2a,0xe4,0xfe,0xe0,0x80,0x1d,0x6b,0xd2,0x8a,0x06,0x49,0x4e,0x60,0xf8,0xbd,0x3d,0x99,0x27,0x80,0x27,0x42,0x66 +.byte 0x01,0x32,0xe1,0x9e,0xa6,0xde,0x7b,0x14,0xa4,0x49,0x68,0x70,0xbe,0xa4,0xe1,0x44,0x2e,0xce,0xa3,0xe9,0x1d,0x7a,0xbd,0xf1,0xe4,0x25,0x11,0x47,0xd8,0xaa,0x32,0x34,0xf8,0xca,0x3d,0xec,0xf3,0x5d,0x8a,0x55,0xe7,0xd4,0x7c,0xfb,0xcf,0xe7,0xa6,0x13,0xaa,0x16,0x5f,0xaa,0x02,0x19,0xdd,0xf1,0xf8,0x5c,0xb2,0x1e,0x68,0x9a,0x21,0x93 +.byte 0xd1,0x38,0x31,0xbb,0x26,0x76,0x44,0xf8,0x84,0x3b,0xf5,0xd1,0x52,0xbe,0x1b,0x8e,0x4d,0xa0,0xb4,0x4a,0x5a,0x7e,0x89,0xe5,0x36,0xb0,0x76,0x77,0xc5,0xc2,0x22,0x73,0xc2,0x19,0x12,0x7f,0xdf,0x9c,0xb8,0xc0,0xf5,0x0e,0xd5,0xa3,0x55,0xae,0x61,0xf8,0xf1,0x6b,0x79,0xc8,0x2e,0xbc,0xa5,0xef,0xd4,0xb1,0x84,0x0c,0x15,0xc4,0xed,0xb3 +.byte 0x18,0x29,0xd6,0x31,0x83,0x79,0x30,0x1a,0x8f,0xf0,0x3b,0xe9,0xd1,0xf2,0x1d,0xec,0xcb,0xe8,0xc5,0x1c,0xb5,0xcb,0x8e,0x01,0xd1,0xb2,0x86,0x43,0x33,0x95,0x70,0x7e,0x75,0xa9,0xa1,0xe7,0xcb,0xd9,0xf4,0xd3,0xe1,0xe2,0xe9,0x46,0x21,0x20,0x3b,0xe9,0x48,0x1c,0x3f,0x93,0x57,0x31,0xeb,0x15,0x9c,0xa7,0xa6,0xcb,0xb5,0xb7,0xa7,0x24 +.byte 0xbe,0x66,0x4c,0x92,0x7c,0xe8,0x8e,0x3f,0x9c,0xa9,0xd7,0xad,0x73,0x68,0x19,0x19,0xd4,0xb5,0x57,0x82,0xdc,0x67,0x3c,0xec,0xac,0x06,0xec,0x86,0x9b,0x65,0xff,0xbb,0xc3,0x90,0x48,0xdb,0x52,0xcc,0xa4,0xf5,0xdf,0x2c,0xc5,0x5a,0xe3,0x30,0xed,0xad,0x37,0x40,0x8c,0xaa,0x32,0x4f,0x94,0x1e,0x14,0x59,0x48,0x1d,0xd3,0xaf,0x80,0xe7 +.byte 0xcf,0x6b,0xa7,0x70,0xe7,0x98,0x22,0x4b,0x40,0x02,0x0c,0x29,0x09,0x0a,0x53,0xf7,0xd4,0xeb,0xbb,0x75,0xb4,0x30,0x1c,0x67,0xea,0xd2,0xb5,0x40,0xfe,0x57,0x2c,0x3c,0x44,0x8d,0x8d,0x02,0x78,0xf0,0x76,0x8f,0x92,0xab,0xb4,0xc9,0xc0,0x2f,0xf5,0xde,0xa7,0x09,0x14,0xf1,0xe5,0x34,0xeb,0x86,0xfa,0xcf,0xcc,0x85,0x1c,0x9c,0xa6,0xe1 +.byte 0x72,0x9e,0xc1,0xe4,0x74,0xc4,0x96,0x5d,0xf4,0x4b,0x23,0x4f,0xa5,0x32,0xff,0x38,0x21,0x8f,0x43,0xe5,0x96,0x20,0x3c,0x78,0xb8,0xb4,0xcd,0x29,0x62,0x84,0x59,0xb5,0xb4,0x57,0x07,0xa8,0x79,0x77,0x21,0xf4,0x82,0xa7,0xb1,0x36,0xee,0x16,0x8e,0xb5,0x9a,0xf7,0x03,0xac,0x64,0x03,0x20,0x48,0x24,0xbc,0xbb,0xec,0x50,0xed,0xa1,0xf3 +.byte 0x67,0xd9,0x34,0xe1,0x0c,0x0b,0xc3,0xd0,0x46,0x0b,0x55,0x85,0x59,0x3c,0xb4,0x7d,0xd0,0xc2,0xe7,0x95,0x24,0x1f,0x53,0x76,0xf1,0x81,0x4a,0x61,0x6a,0x2e,0x3b,0x3f,0x92,0x14,0x7c,0xe0,0x33,0x7f,0xb4,0x85,0x92,0x78,0x0c,0x0b,0xe7,0xbd,0x7a,0x08,0x31,0x7d,0x47,0x3b,0xfa,0xdd,0x90,0x9e,0xf0,0xa9,0xd1,0xa7,0x7c,0x2a,0x37,0xb1 +.byte 0x23,0x71,0x34,0xa0,0x63,0xfb,0x9e,0x8f,0x39,0x00,0xa0,0x09,0xd4,0x1f,0xf4,0xba,0x2d,0xc1,0xac,0x6c,0x94,0x18,0x56,0x3e,0x89,0x92,0x63,0x10,0x5e,0xfe,0x76,0xec,0x4e,0xb6,0x5d,0x59,0xf9,0x94,0x46,0x4f,0xda,0xd5,0x3e,0x6c,0x48,0x49,0x7e,0x7c,0x77,0xe7,0x7e,0x22,0x31,0xb5,0x9d,0x15,0xd3,0x08,0x24,0xdb,0x67,0x98,0x6b,0xfc +.byte 0x45,0x54,0x85,0x29,0x9a,0x47,0xa5,0x60,0xe2,0x46,0x36,0x45,0x16,0x54,0xd6,0xb1,0x5c,0x38,0x45,0xf8,0x43,0x28,0x58,0x81,0xc9,0x57,0x10,0xda,0x3b,0xfc,0x3e,0xe4,0xf4,0xb2,0x16,0xb6,0x16,0x1d,0xa4,0x68,0xa6,0xe0,0x36,0xdb,0xe2,0x19,0x1c,0xce,0x9f,0x94,0xa9,0x94,0xad,0x20,0xcb,0x17,0xd0,0x92,0x37,0x75,0x88,0x0d,0xaf,0xdf +.byte 0x98,0x6d,0x19,0x9e,0x8e,0x61,0xe4,0x8c,0xfc,0x27,0x27,0x6a,0xa7,0xa4,0x66,0x7f,0x08,0x03,0xef,0x5c,0x4a,0xb7,0x89,0xa1,0xae,0xe8,0x70,0x3f,0x13,0x27,0x0a,0x7d,0x5d,0x5e,0x2b,0x69,0xb5,0x98,0x1f,0x25,0x1e,0x41,0xff,0x46,0x5a,0x25,0x1f,0xb4,0x90,0x8e,0x81,0x91,0x19,0x63,0x10,0xd4,0xa9,0xdf,0x3b,0xae,0xe6,0x63,0x1a,0xdc +.byte 0x09,0x5f,0xac,0xaa,0xb8,0x6b,0xbd,0x6a,0x90,0x70,0xce,0x2c,0x63,0x6d,0x48,0x78,0xca,0xc1,0x59,0x94,0xe2,0xc7,0x89,0x17,0x73,0xfa,0x73,0x34,0xb7,0xd3,0x9c,0x4e,0xd8,0xac,0x18,0x80,0x25,0xbf,0xbe,0x75,0x0a,0x9a,0x05,0x5e,0x54,0xcb,0xba,0xab,0xca,0x7f,0x96,0xf7,0x26,0x8c,0x82,0xe0,0x23,0xa5,0x86,0xb5,0xdf,0x31,0xd0,0x2f +.byte 0xe3,0x66,0x96,0x83,0xd2,0x04,0x43,0x8a,0x28,0x59,0x49,0xdc,0x11,0x38,0xd9,0x5f,0xc2,0x31,0xaa,0xa8,0x1a,0xff,0x57,0xf1,0x84,0x18,0x28,0xe8,0x04,0xae,0x98,0xa4,0x17,0xc4,0x35,0x75,0xf5,0x37,0xf5,0x27,0x3e,0x7e,0x32,0xa4,0xcb,0xd4,0x43,0x59,0x02,0x63,0x7b,0x7c,0x9d,0xa7,0x61,0x12,0xf7,0xdc,0x12,0xe0,0x07,0xac,0x96,0xf3 +.byte 0x71,0x43,0xe5,0x30,0xe0,0x4c,0x51,0x2a,0x19,0xf5,0x79,0x59,0x5a,0xc5,0x74,0xfa,0x54,0x18,0xb4,0xb1,0xfb,0x4b,0x9b,0xf8,0xe4,0xa4,0x63,0x25,0xc3,0x84,0xeb,0x2e,0xa1,0xf8,0xf8,0x7b,0x25,0x6a,0x7d,0x14,0x38,0x06,0xeb,0xae,0x9f,0xa5,0x80,0x9a,0x8a,0xb6,0x46,0x95,0xdf,0x52,0x11,0xd4,0x30,0xcc,0x11,0x8f,0x4a,0x5e,0x56,0x26 +.byte 0x60,0x3d,0x5f,0x0b,0x04,0x94,0xcd,0xca,0x1d,0x6b,0x83,0x51,0x83,0x8d,0xf8,0x33,0x4a,0x91,0x00,0xa4,0xf5,0x44,0x5b,0xad,0xa0,0x4a,0x72,0xaf,0xe6,0x4a,0x0d,0x1e,0x9f,0x18,0x6b,0xb4,0xdf,0x85,0x61,0x2a,0x3b,0xe1,0x4c,0xaa,0xc3,0x17,0xef,0x51,0x9f,0xae,0xb5,0xca,0xaa,0x6c,0xd9,0xa1,0xf5,0xa3,0x6f,0x1c,0xca,0xb3,0x37,0xda +.byte 0x27,0xea,0xcb,0xb7,0x36,0xb2,0x11,0xda,0x9f,0x07,0x78,0xaa,0x6c,0xad,0x63,0x9b,0x49,0x6b,0xfe,0x1f,0x93,0x82,0x73,0xc9,0xc8,0xf6,0x68,0x54,0x50,0x77,0xba,0x78,0xc7,0x82,0xee,0xbd,0x97,0x66,0xb9,0x22,0x49,0x0d,0x7a,0x1f,0x0f,0x4e,0xe5,0x02,0x8b,0xa6,0x1b,0x11,0xfc,0xa6,0x37,0x2a,0x5c,0x66,0xaf,0xac,0xa5,0x9f,0xbf,0x26 +.byte 0x98,0x9b,0x25,0x44,0x48,0x09,0xe6,0x76,0xb9,0x08,0xf1,0x37,0xcf,0x86,0xc9,0xdf,0xa8,0xf3,0x88,0x2f,0xc1,0x33,0x15,0x95,0x59,0xf7,0x9b,0xf2,0x48,0x76,0xcb,0xd0,0x31,0xe4,0x27,0x74,0x2d,0x6e,0xd2,0xc3,0x29,0xea,0xef,0xff,0x4e,0x3d,0xda,0x3e,0xef,0x94,0x94,0x40,0xcd,0x93,0xcf,0xb8,0x56,0x29,0xf8,0x20,0x20,0xa3,0x66,0x83 +.byte 0xba,0xc8,0x4f,0xe6,0x22,0x96,0xb5,0xb2,0x44,0x75,0x55,0x98,0xed,0x11,0xd0,0x58,0x50,0x26,0xf1,0x4a,0xf6,0x80,0x5c,0x17,0x92,0xba,0xc2,0xd6,0x68,0xd4,0x7a,0x4f,0xdf,0x16,0x97,0xbd,0xad,0xd7,0x1b,0x0c,0xe5,0x23,0xa9,0xaa,0xf4,0x1c,0x8d,0xec,0xbf,0xf0,0xb5,0xaa,0x49,0xfd,0xf1,0x31,0x9b,0xf9,0xe9,0x21,0xa1,0x20,0xab,0xbe +.byte 0x56,0x8c,0xf2,0x85,0xdc,0x1f,0xea,0x25,0xce,0xf5,0x6c,0x18,0x7d,0xc4,0x1a,0x01,0x08,0x01,0xed,0x02,0xa8,0xac,0x7f,0x74,0x2c,0xd7,0x28,0x25,0x6e,0x68,0x19,0x38,0x8d,0x20,0x51,0x8f,0x38,0x8b,0x03,0x36,0xae,0x50,0x35,0x28,0x65,0x7e,0x15,0x2a,0x80,0x2c,0xae,0xcd,0xb3,0xb6,0x91,0xf1,0x8c,0xf2,0x8c,0xc5,0xce,0x3e,0x3a,0x97 +.byte 0x5a,0xff,0xe1,0x37,0x13,0xf7,0x6b,0x07,0xb2,0xaa,0xaa,0x57,0x18,0xb7,0xb2,0x19,0x52,0xbf,0x59,0x0b,0x6f,0xba,0x56,0x54,0x14,0xac,0x21,0xfd,0x7d,0x03,0x4b,0x0b,0x39,0x54,0xba,0xf9,0xba,0x73,0xcd,0x67,0x13,0x30,0xca,0x19,0x80,0x4f,0x18,0xb4,0x75,0x2a,0xec,0x78,0xa7,0xd0,0x5c,0x53,0xe2,0x43,0x2c,0x08,0x5f,0x5c,0xe6,0x60 +.byte 0xde,0x04,0xf6,0x75,0xca,0x35,0x3b,0xf6,0x68,0x53,0x60,0xc0,0xed,0xb0,0x15,0xa1,0xa4,0x89,0x23,0x34,0x49,0x35,0xd2,0x78,0x4b,0x8f,0x7c,0x8d,0x59,0x22,0x9f,0xad,0x72,0x47,0x5b,0xde,0xf2,0x09,0x08,0xa0,0x8d,0x5f,0x4d,0xc3,0xd1,0x83,0x17,0xbc,0x39,0x8e,0xa5,0x53,0xaa,0xe3,0x31,0x03,0x93,0x14,0xb4,0x57,0xf0,0xdf,0x54,0x1d +.byte 0x79,0x4d,0x21,0x1a,0x8f,0x3f,0x6e,0x07,0x41,0xcc,0x2d,0x94,0x55,0x4e,0x50,0xfd,0xac,0xe3,0xef,0xa7,0x50,0x3b,0x3c,0xda,0x32,0x25,0xee,0xd9,0x01,0x37,0x8e,0xb3,0x23,0xc5,0x5e,0x12,0x88,0x6d,0xd5,0x41,0xfd,0x3f,0xfa,0x75,0xb8,0xcb,0x82,0x10,0x81,0x38,0x1b,0x10,0x2d,0x2c,0x6b,0x62,0xa1,0x7c,0xd1,0x75,0xd8,0x8c,0x0c,0x2f +.byte 0xe8,0x97,0xff,0x18,0xb3,0x12,0xa2,0xef,0x6c,0xc5,0x79,0x9f,0x64,0xf3,0xc7,0xdc,0xdb,0x54,0xa4,0x25,0xc7,0x30,0xfb,0x6c,0x5a,0x50,0x24,0xf9,0xb6,0xc9,0xe7,0xda,0x78,0xcc,0x1b,0x5e,0xf3,0xe7,0x32,0xd8,0x36,0x47,0x10,0xe5,0x2c,0xeb,0xea,0xf7,0x25,0x30,0x93,0x64,0x88,0xc8,0x59,0xf8,0x5c,0x02,0x43,0x4c,0x23,0x8e,0x1c,0x42 +.byte 0xe4,0x36,0x39,0xbf,0xba,0x8b,0xe3,0x53,0x01,0x32,0x0d,0x89,0xc2,0xea,0x35,0x94,0xf1,0x0d,0x29,0x45,0x08,0x07,0x15,0xcb,0xd7,0x3e,0x4d,0x9f,0x04,0xd8,0x18,0x8a,0x56,0xa3,0xb1,0x1c,0x46,0x19,0x8b,0xd0,0x51,0x30,0xf3,0xca,0x52,0x2a,0x16,0xc4,0x90,0xc1,0x00,0x50,0x87,0x8b,0x4c,0x71,0x61,0x48,0x69,0xb2,0xf1,0x33,0xaa,0x79 +.byte 0x81,0x8b,0x36,0x33,0x19,0x41,0x6b,0xc1,0x91,0x40,0xf2,0xcc,0x1d,0x83,0x09,0xab,0xcc,0x6f,0x6c,0x54,0x91,0x62,0x80,0xac,0xe6,0x1f,0xcd,0x5d,0x05,0x2b,0xe5,0xac,0xbc,0xd6,0x1b,0x8b,0xef,0x95,0xa0,0xf3,0xfe,0x8e,0x4d,0x32,0x77,0xe8,0x02,0x8f,0x44,0xad,0xc4,0x40,0xc3,0x99,0x68,0x81,0x47,0x15,0xbd,0x3b,0x8f,0x0b,0x9b,0x3a +.byte 0xb3,0x9d,0x8f,0x3d,0x86,0xd1,0x89,0x5f,0x67,0x19,0x33,0x2d,0x18,0x64,0x0e,0x3a,0x13,0xa4,0xe9,0xb4,0xc9,0x90,0x09,0x6a,0xcb,0x5d,0x0d,0x83,0x13,0x04,0x29,0xe5,0xa5,0xf4,0x00,0x56,0xf4,0x80,0x96,0x33,0x93,0xe4,0x9b,0xc4,0x6e,0x38,0xbf,0x0a,0xe0,0xee,0x8c,0x89,0x5d,0x60,0x36,0x7e,0x69,0xc2,0xc7,0x28,0x6f,0x2b,0x97,0xfb +.byte 0xb3,0x5b,0x82,0xe8,0x9a,0x36,0x44,0xd7,0x1f,0x9b,0x1b,0xd0,0x14,0xe4,0xd4,0x0d,0x35,0xcd,0xee,0x88,0x50,0x37,0x5c,0x88,0x09,0xa5,0x16,0x4d,0xe1,0xbc,0xe8,0x79,0x8f,0xa9,0x18,0xb8,0x43,0xb4,0xd7,0x32,0xcd,0x26,0xdd,0x78,0x29,0x59,0xad,0x29,0xe3,0xe0,0xe7,0xcf,0x16,0x03,0xc6,0x8a,0xb6,0xa2,0x09,0x9a,0x6e,0x90,0x7b,0x0c +.byte 0x9d,0x20,0xb6,0xc4,0x28,0x3f,0x44,0x06,0xa9,0x45,0x72,0x27,0xa7,0x56,0x3f,0x07,0xff,0x13,0xd9,0x80,0xda,0xbd,0x25,0xad,0xd3,0x74,0x2c,0xd8,0xd2,0x93,0xa5,0xda,0xbc,0x5f,0xa5,0xde,0xb7,0x3a,0xf0,0xd2,0x17,0xb1,0xc3,0x70,0x2a,0x85,0xde,0xf0,0x97,0x7b,0x96,0xb2,0x0e,0x45,0x7f,0x63,0xd4,0x94,0xd8,0x78,0x05,0xcf,0xea,0xb3 +.byte 0xfb,0x7a,0x79,0xb5,0x91,0x53,0xb8,0x8c,0xa2,0x03,0xf4,0xc3,0xed,0xf0,0xab,0x33,0x5c,0x6e,0xcd,0xbd,0x73,0xe3,0xe9,0xd0,0x83,0x2a,0x2a,0x68,0x32,0xf1,0x69,0x4f,0xd0,0x8b,0xe8,0xa1,0x7d,0x5b,0x0f,0x69,0xc2,0x33,0xbf,0xc1,0x54,0x29,0x47,0xed,0x9f,0xdb,0x35,0x0a,0x3d,0x2b,0x9d,0x8b,0x91,0xb6,0xe0,0xbc,0x53,0xba,0xb7,0xcd +.byte 0x2c,0xd9,0xeb,0x81,0xa0,0x2e,0x14,0x6e,0xdc,0xe1,0x90,0x36,0x14,0x9d,0xa8,0x8b,0x6b,0x1b,0xac,0x4c,0x09,0x8b,0x1a,0x87,0xf4,0x66,0xf6,0xfb,0x62,0x92,0x13,0xcf,0xb2,0x96,0xf0,0xc9,0x8b,0x12,0x99,0xf1,0x16,0xae,0x5c,0x27,0x24,0xa8,0xfd,0xb3,0x4c,0xc2,0xe6,0x3f,0xd2,0xc6,0x0c,0xf2,0x65,0x4e,0xdf,0xf1,0x06,0xb8,0x99,0xc4 +.byte 0x3a,0x35,0xba,0xed,0x18,0x3e,0xfa,0x03,0x51,0x8d,0x45,0x68,0x12,0x7b,0xb6,0xac,0x63,0x99,0x47,0xee,0x6f,0x8b,0xcb,0xc1,0x0a,0xf9,0x23,0xf0,0x05,0xe1,0x03,0x4a,0xb5,0xe0,0x65,0x71,0xc8,0x64,0x7e,0x0d,0x39,0xe7,0x96,0xdb,0x34,0x63,0x2e,0x1a,0x27,0x85,0x52,0x63,0x8e,0x44,0xfb,0x61,0xca,0x79,0xe5,0x91,0x99,0x83,0x2d,0xe0 +.byte 0x26,0x04,0xad,0x43,0x26,0xf2,0x7e,0x56,0xae,0x35,0x6a,0xfb,0xec,0xc6,0x27,0xe4,0x3a,0xa3,0x6b,0x63,0x72,0xba,0x98,0x03,0x9f,0x2a,0x4c,0xb1,0x33,0x22,0x9d,0x53,0xf6,0x00,0xa3,0x1e,0x32,0xcb,0xbe,0xe0,0xc2,0xf8,0x71,0xcd,0x3f,0xe3,0x4d,0x83,0xf2,0x9f,0x1c,0x91,0x35,0x97,0x52,0x95,0xba,0x24,0x04,0x04,0xca,0x32,0x6d,0xd7 +.byte 0x4b,0xd4,0x9e,0x8b,0x73,0x42,0xfb,0x9f,0xfc,0x93,0xea,0xc2,0x41,0x56,0xa9,0xe5,0xdd,0xd0,0x37,0x8a,0xe2,0x92,0x9f,0x45,0x4f,0xd8,0xef,0xe6,0x6f,0x58,0x41,0x5f,0x7b,0xe7,0x0f,0x32,0xce,0x06,0x02,0x7f,0xe2,0x37,0x87,0xb7,0x35,0x72,0x68,0x87,0xc9,0x35,0xa8,0x51,0xce,0xd8,0xde,0xc3,0x8c,0xb4,0xab,0xf4,0xa7,0x3b,0xcd,0xc8 +.byte 0x0a,0x56,0x5b,0x48,0xb1,0xa4,0x27,0xa8,0x9e,0x3e,0x04,0xbc,0xb3,0x63,0x3e,0xd5,0xf7,0xae,0xec,0x0c,0x6e,0x4a,0x73,0xb6,0xed,0x66,0xea,0xc1,0x7a,0xc4,0xaa,0x21,0x27,0x62,0xef,0x3d,0x1d,0x51,0x8b,0x63,0xe6,0xe2,0x8a,0xed,0x7a,0x4b,0x90,0xc3,0x9f,0x91,0xb4,0x8f,0x78,0x65,0x9c,0xdd,0x0a,0x7a,0x50,0x36,0x33,0x30,0x3b,0xb4 +.byte 0xdf,0x67,0xbd,0xfd,0x71,0xfc,0x40,0x49,0xaa,0x01,0xdf,0x68,0x67,0x73,0x31,0x2c,0x98,0x2f,0x8c,0x9e,0x2d,0xce,0x4a,0x71,0xbc,0x6f,0x90,0x1d,0xc0,0x37,0x07,0x30,0x0c,0xa3,0x04,0xfb,0xd1,0xd0,0x0e,0xcb,0xdc,0x94,0x06,0x7f,0x83,0xe5,0x45,0x47,0xd0,0x71,0x06,0x94,0x23,0x7c,0x03,0x80,0x46,0xa5,0x10,0x08,0xd1,0xdb,0xfb,0x9d +.byte 0xd4,0x05,0x01,0x5e,0x66,0x4d,0xf9,0x32,0x9b,0x5b,0xfe,0x7a,0x60,0x63,0x77,0x9a,0x31,0x34,0xe5,0x9a,0x82,0x2d,0x2b,0xb7,0xe0,0x04,0x8f,0x86,0xf3,0xb2,0x16,0x86,0x50,0x37,0x9d,0x80,0xe7,0x62,0xdf,0x77,0xda,0xf4,0xfc,0xb7,0x42,0x9d,0xac,0xcb,0x11,0xff,0x0c,0x6f,0x4e,0x16,0x0c,0x59,0x04,0x05,0x8f,0x88,0x64,0x37,0xe6,0x6c +.byte 0xee,0x64,0x58,0x79,0x60,0xd4,0x2f,0xb7,0x90,0x59,0xfb,0x82,0x3b,0x20,0x2e,0x2b,0xba,0x15,0xfb,0xf7,0x5b,0x1d,0x81,0x8a,0x8a,0x8f,0xe3,0x39,0x92,0x34,0xfc,0x3a,0x67,0xce,0xb6,0xa0,0x9b,0x56,0x78,0x96,0x4d,0x32,0xbf,0x9c,0x83,0x9e,0x19,0x66,0x20,0x42,0xb2,0x78,0x62,0x42,0xdd,0xdf,0x98,0xab,0x0c,0x3d,0x41,0xb5,0x74,0xc1 +.byte 0x2d,0xf0,0x02,0x58,0x6e,0xb3,0x4d,0x7b,0x41,0x1c,0xf1,0x09,0xc1,0xbb,0x84,0x67,0xf8,0x24,0x77,0x32,0xcd,0x7a,0x63,0x87,0x0d,0xf2,0xc5,0xaf,0xe4,0xb5,0xc6,0x3b,0xad,0x66,0x5e,0xae,0x90,0xc2,0x24,0x27,0x7a,0x0b,0xed,0x1b,0x86,0x5d,0x02,0x19,0x85,0x78,0xc8,0xb1,0xce,0xe7,0xc9,0x5c,0xce,0x43,0x58,0xac,0x1c,0x4e,0xcd,0xb8 +.byte 0x3a,0xb8,0x7a,0xf3,0x79,0x4b,0x97,0xcf,0xbe,0x88,0x24,0xd0,0x9a,0x5a,0x55,0x43,0x0c,0x48,0xa2,0x7f,0xaf,0x4b,0xd8,0x16,0x02,0xfb,0xe6,0x0c,0x6b,0x85,0xb4,0xb8,0x5e,0x40,0x60,0x5d,0x93,0x51,0xc6,0x32,0xb9,0x4a,0x23,0x96,0x71,0xeb,0xe8,0xe8,0x01,0x1e,0x85,0xb0,0x47,0xde,0x86,0x15,0x52,0x3a,0xb2,0xd3,0x86,0x4b,0x78,0x09 +.byte 0x9c,0x6e,0x9d,0xd9,0xef,0xe8,0x64,0x2d,0x2a,0xec,0x21,0x5a,0x60,0xa5,0xe4,0x26,0xbb,0x79,0x0c,0xdb,0x48,0xd6,0x4b,0x5c,0x5b,0xe3,0x34,0xc9,0x96,0xf0,0xcb,0x68,0x8a,0x2d,0xee,0xa3,0x37,0x34,0x5f,0x3e,0x65,0x40,0xce,0xe1,0xc8,0x2e,0x11,0xca,0x42,0x51,0x53,0x72,0x3d,0xa9,0x68,0x54,0xb4,0xd8,0xd7,0x72,0x84,0x8d,0xcd,0x6d +.byte 0x1f,0x0e,0x0c,0x0f,0x32,0x3a,0x7d,0xdd,0xc1,0xd3,0xe7,0x2d,0x1f,0x52,0x8b,0x73,0x86,0x70,0x2a,0xcb,0x71,0x37,0xa1,0xab,0xe3,0x94,0x5a,0xd7,0x9d,0x68,0xc1,0x6e,0x5d,0x72,0x25,0x81,0xe8,0x45,0xad,0x6c,0xf8,0xdb,0x9b,0x70,0x31,0xb9,0xf0,0x4f,0x23,0xd7,0x03,0xc8,0x87,0x43,0x51,0x7a,0x55,0xfe,0x6f,0x2d,0x40,0xbc,0xfe,0xdf +.byte 0xe6,0x21,0x4b,0x4d,0xc6,0x02,0x48,0xe7,0x7a,0x2a,0xef,0x91,0xdf,0xbc,0x98,0x91,0x6f,0x59,0xc4,0x47,0x77,0x2e,0x45,0x45,0x23,0x47,0x5d,0xf8,0x50,0x41,0x84,0x75,0x8a,0xe7,0x4d,0xfb,0xeb,0x58,0x00,0xcf,0x42,0xca,0x02,0x05,0xc7,0xfa,0x11,0xfb,0x6e,0x90,0x7d,0x53,0xa0,0x19,0x23,0x24,0x8f,0x89,0x17,0x40,0xbe,0x11,0xfb,0xd9 +.byte 0x04,0xf8,0x84,0xeb,0x90,0x7c,0x84,0x45,0x9c,0x53,0x45,0x5e,0x45,0x51,0x55,0xfc,0xf1,0x6b,0x02,0x24,0xfd,0x95,0x4a,0x40,0x80,0xdc,0xa6,0x94,0x15,0x2c,0x1d,0x85,0xa0,0x07,0x8d,0xf8,0xf2,0x95,0x0c,0xa0,0x4e,0x5a,0x5b,0x29,0x09,0xcc,0xf3,0x4e,0x8e,0xea,0xe8,0x26,0xb8,0xbe,0xb2,0x6f,0x76,0x6f,0xa4,0xe5,0x6a,0x50,0xcf,0xc8 +.byte 0x7d,0xb6,0x1e,0x9d,0x90,0x6b,0xde,0xe2,0x55,0x49,0x97,0x00,0xa5,0xc5,0x1f,0x1c,0x41,0x66,0xe7,0x6b,0x20,0xb2,0x1e,0xc7,0xb3,0xd4,0xa9,0x75,0xbb,0x83,0x24,0xd0,0xdf,0xbd,0xba,0x2c,0x2f,0xa4,0x03,0x1d,0x17,0xc5,0x74,0xc2,0x6a,0x20,0x71,0x18,0xd1,0xc5,0xb0,0x78,0xfe,0xda,0x55,0xd2,0x43,0x2a,0xd8,0x88,0x74,0x75,0x86,0x07 +.byte 0xe9,0x8b,0x0d,0x0f,0xe5,0x8d,0xe8,0x3d,0xf4,0x93,0xde,0x4c,0x97,0x98,0xe2,0x9b,0x22,0xde,0x13,0x18,0x8b,0xc5,0xe1,0x6f,0x6d,0xb4,0x19,0x46,0xff,0xbd,0xa6,0x2e,0xe6,0x48,0xcd,0x66,0x22,0x7d,0xf4,0x0e,0xeb,0x74,0x25,0x5c,0x90,0x0e,0x26,0xce,0x17,0xe9,0xdb,0x30,0xb9,0x25,0x99,0x96,0x46,0x3a,0x78,0xa3,0x76,0x2d,0x9e,0x42 +.byte 0x06,0x8a,0x1e,0x62,0x46,0xa4,0xd0,0x1d,0xe2,0x4c,0x3c,0xb4,0x4c,0xc0,0xd1,0xf7,0x05,0x5b,0xe4,0xd4,0x71,0x73,0x31,0xfc,0x98,0x2a,0x55,0xb0,0x78,0x92,0x59,0x8b,0x25,0x97,0x15,0xf2,0xf9,0x57,0x8b,0x7c,0xd4,0xc4,0x47,0x2f,0x10,0x3b,0x76,0xde,0x5f,0xb1,0xdf,0xdc,0xb0,0x15,0xd5,0x4a,0xd2,0x54,0xad,0x5e,0x32,0xf4,0x5a,0x1a +.byte 0x8d,0xe8,0xa0,0x4a,0x4e,0x04,0xdc,0xdd,0xd2,0x57,0xe5,0x24,0x4b,0x93,0x51,0xef,0xd4,0xba,0x3f,0x77,0xfc,0x0a,0x5c,0x7d,0x6e,0xa7,0x86,0xe5,0x88,0xd1,0xac,0x74,0x46,0x9a,0x39,0xb6,0x98,0x3d,0xae,0x89,0x4e,0xea,0x8d,0xdc,0xc7,0xb9,0x0c,0xd7,0xa6,0x06,0x4d,0x28,0x2b,0x51,0x2b,0xdb,0x30,0x4a,0x91,0x1c,0x40,0x89,0xe4,0xba +.byte 0x72,0xd5,0xed,0x16,0x66,0xb8,0xef,0x81,0xd9,0x51,0xf8,0x1b,0xff,0xab,0x8b,0x52,0xb8,0xf3,0x11,0xb3,0xe5,0x04,0x5a,0xb0,0x60,0xa3,0x35,0x12,0x6a,0xa0,0x75,0x5c,0x21,0xa9,0x5a,0xe8,0xd3,0xd7,0x8a,0x1f,0xe0,0x9b,0xb7,0x1e,0x7d,0xbe,0x81,0xaa,0x56,0x5a,0xd8,0x2d,0x7e,0x0c,0x60,0xb2,0x68,0x26,0x6d,0xaa,0x8b,0xcc,0x11,0x40 +.byte 0x25,0xea,0xc9,0x94,0xfb,0x3b,0x9b,0xa7,0x3a,0xde,0xd9,0xfe,0x6b,0x4b,0xfc,0x3f,0xbf,0xdd,0x51,0x9b,0xa1,0xca,0x2f,0xed,0x33,0xd8,0x3d,0x92,0xa4,0x1d,0xee,0xb2,0x47,0xd0,0x72,0x6a,0x96,0x33,0x0f,0xdd,0x0a,0xd9,0xbd,0x86,0xdb,0x25,0x53,0x0e,0x3c,0x31,0xad,0x05,0xb9,0x24,0x13,0x00,0xdf,0xc2,0x7c,0x3d,0x03,0x9b,0xf6,0x6d +.byte 0x93,0xd9,0xdf,0x73,0xf8,0x1c,0x98,0xe2,0x77,0x46,0x46,0xdc,0x07,0xe6,0xbb,0xc1,0xa7,0xb6,0xbe,0x21,0x07,0xae,0xdb,0xca,0x69,0x2d,0x8a,0x2b,0x59,0x27,0xe0,0x7c,0xf0,0xf1,0x34,0x69,0x97,0x44,0xba,0xbb,0x48,0x9f,0xd9,0xd8,0x16,0x1a,0xef,0x11,0x68,0xb6,0xaf,0x3a,0x10,0xc6,0x7c,0xd1,0x12,0xc7,0x89,0x47,0xe3,0xd1,0x24,0xc6 +.byte 0x44,0x9f,0x7e,0x6a,0x66,0x43,0x48,0xd6,0x9f,0x7b,0xf0,0x1f,0xd2,0x5f,0x2b,0xa7,0x13,0x6a,0x7c,0x70,0x08,0x38,0xb0,0x00,0xbc,0x7c,0xd3,0x01,0x9b,0xf6,0x29,0xd3,0x9c,0xa4,0x11,0x90,0xe4,0x9f,0x04,0xd6,0x21,0xec,0xfd,0xcb,0xb8,0xe6,0xb6,0x49,0x2b,0xfa,0x4b,0x90,0x9e,0xc6,0x0c,0x87,0xff,0x5e,0x2e,0xcc,0xf8,0x09,0x70,0x52 +.byte 0x42,0xec,0x88,0xac,0x1e,0x76,0x2b,0xeb,0xfc,0xb3,0x65,0x81,0x34,0xb1,0x06,0x90,0xde,0xb2,0xc4,0xd3,0xfd,0xd4,0x9c,0x78,0x1a,0x5c,0x8f,0x65,0x0a,0xbd,0x88,0xe5,0x95,0x06,0xb5,0x94,0xe5,0xbf,0x90,0x31,0xbb,0xcb,0xce,0x19,0x51,0x25,0x4a,0x47,0x35,0x26,0x93,0xdb,0xe2,0x93,0x36,0x47,0x7d,0xdd,0x4e,0xd5,0xeb,0xdd,0x63,0x1c +.byte 0xbc,0x2d,0x75,0xdb,0xd4,0xfa,0x60,0x4b,0x51,0x45,0x32,0x0f,0x01,0xf9,0x73,0x9b,0xd8,0xbc,0xee,0xaa,0x7d,0x2e,0xfe,0xbf,0x9d,0x45,0xae,0xe2,0x01,0xe3,0xbf,0x58,0xdc,0xc0,0xb8,0xe8,0x44,0x16,0x3b,0xd8,0xaa,0x3b,0x13,0xca,0xfb,0x5f,0x8d,0xb3,0x2a,0x83,0x66,0x49,0xae,0x54,0x02,0x4e,0xd8,0x68,0xee,0x21,0x1a,0xbb,0xf4,0xf7 +.byte 0xdf,0xf1,0x51,0x7b,0x62,0xa8,0xb2,0xdc,0x4b,0xd4,0x04,0xd2,0x05,0x49,0xdd,0xa4,0x75,0xe6,0x64,0x82,0xe7,0x25,0x55,0x60,0x2c,0x9f,0x8a,0x7a,0x11,0xe9,0xf2,0x72,0xfe,0x89,0xe1,0xaf,0xca,0x0c,0xb9,0xf5,0xcc,0xcf,0x07,0xef,0x8f,0xbb,0xef,0x53,0x1e,0xe2,0xfb,0x98,0xe8,0x05,0xab,0x4e,0x7e,0x38,0x56,0x24,0xd5,0x74,0x1c,0x95 +.byte 0x1a,0x0e,0x62,0x92,0x80,0x16,0x45,0x78,0x2f,0xb1,0xe1,0x83,0x24,0x2b,0x16,0x5c,0x05,0x52,0x17,0xe9,0xe8,0x9e,0x5d,0x63,0x8f,0x77,0xc4,0x89,0x22,0x76,0x43,0x31,0xfd,0x09,0xc0,0x51,0x70,0x57,0x2d,0x51,0x91,0xe5,0x61,0x3f,0x77,0xff,0x17,0xfc,0xa6,0x19,0x9d,0x82,0x46,0x11,0x0c,0x77,0x19,0x2a,0xf5,0x19,0xb4,0x3d,0xa6,0xd4 +.byte 0x8b,0x07,0x4b,0xc6,0xa3,0x1e,0x8c,0xf5,0xe8,0x2d,0xe7,0xcc,0xa1,0x38,0x57,0x66,0x76,0x1d,0xdd,0xe3,0xb9,0x0a,0x1e,0x2c,0xad,0x09,0x07,0x26,0xff,0x7a,0xc0,0xb0,0x51,0x71,0x44,0x6d,0x2c,0x39,0x3d,0xa6,0x14,0x4e,0x74,0x2c,0x54,0x3d,0xfa,0xdc,0x2e,0x0c,0xc4,0x88,0x32,0xda,0xb0,0x9d,0xf4,0x2c,0x0a,0x1b,0xb7,0xb4,0x78,0x6f +.byte 0x1b,0x6a,0x21,0x03,0x4e,0xe0,0x87,0xa0,0x1c,0xd8,0xe6,0x0c,0x97,0x47,0xde,0x98,0x81,0x3d,0x39,0x93,0x3d,0xcb,0x29,0xa3,0x93,0x8d,0x27,0x5d,0x29,0xb5,0x85,0xc4,0x32,0xd8,0xdc,0x19,0xb1,0x63,0xdc,0x76,0x32,0xc3,0x52,0x9a,0xfd,0x3d,0xff,0xf9,0x94,0x55,0x72,0xbb,0x4d,0xe2,0x42,0xd2,0xf7,0xb2,0xac,0xac,0x5d,0x50,0x95,0xda +.byte 0x3a,0x87,0xb6,0x0f,0x27,0x72,0x34,0xe7,0xe8,0x9f,0xc7,0xba,0xca,0x8d,0xf3,0xb9,0xa1,0xdd,0xd7,0xa5,0x70,0x3b,0xcc,0x72,0x0e,0x9d,0x85,0x75,0x01,0x11,0xe1,0xc2,0xca,0xcb,0x40,0x3a,0x31,0xf2,0x5d,0x0c,0x63,0xc8,0xbf,0x38,0xde,0x09,0x3b,0x32,0xaa,0x6c,0x07,0xd2,0x2b,0x3b,0x94,0x37,0xd0,0xd9,0xe0,0x4c,0x25,0xa3,0x22,0x64 +.byte 0x05,0xcc,0x69,0x9e,0x73,0xd4,0x46,0x2c,0x73,0x23,0xd0,0x6f,0x09,0xff,0x8b,0xef,0x7a,0x08,0x3e,0xa2,0xa7,0x9d,0xf5,0xc9,0x40,0xd1,0x06,0xd6,0xe3,0x89,0xa5,0xcc,0x9f,0x40,0x67,0x80,0x11,0xec,0x5d,0x23,0x19,0xf3,0x66,0xaf,0x06,0xcc,0xe4,0xb6,0x5e,0x20,0xf7,0x19,0xce,0x1a,0xb6,0x86,0x0d,0x39,0x1d,0xc8,0x0a,0xdb,0x50,0x52 +.byte 0x7e,0x3b,0x96,0x9f,0x05,0xdd,0xd8,0xdf,0x40,0xdf,0xe4,0x66,0x14,0x4d,0x4e,0xb3,0x9f,0x86,0x7b,0xc2,0x99,0xc3,0x8f,0xb9,0xe7,0xc3,0x50,0xa4,0xab,0xb8,0x8e,0xc5,0x28,0xce,0x8b,0x51,0xcb,0xad,0xd8,0x1a,0x23,0x7d,0x12,0xc2,0xaf,0x1a,0x93,0x4c,0x57,0xe9,0x59,0x6a,0x03,0x65,0x81,0x07,0x40,0x84,0x92,0x9d,0x22,0x8a,0x3d,0x27 +.byte 0x39,0x05,0xdd,0xf7,0x20,0xad,0xc2,0x03,0x27,0x87,0x8e,0xc1,0x23,0xad,0xe5,0x59,0x16,0xe7,0xde,0xe4,0x44,0x6b,0x06,0xb5,0x1d,0xaf,0xda,0x08,0x4a,0xfa,0x75,0x1a,0x0b,0x35,0xe8,0x6e,0x29,0xd3,0x79,0x19,0x80,0xb9,0x5f,0x36,0xec,0x43,0x25,0x3c,0xbc,0xcf,0x70,0x0c,0xc7,0x2c,0xbc,0x2e,0x72,0x40,0x73,0x98,0x11,0xc9,0x72,0x9f +.byte 0xd9,0x95,0x9f,0x8d,0x4a,0x52,0xbb,0x89,0x30,0x5b,0xa2,0x7e,0x0c,0x21,0x11,0xda,0x4e,0xa1,0x7c,0xc1,0x0f,0x95,0x1b,0x5b,0x2e,0xbd,0xae,0x8a,0x56,0x82,0x8f,0x84,0x43,0xdf,0x24,0xac,0x99,0xaa,0x8a,0xaf,0x82,0x33,0xf7,0x0a,0xbf,0x5e,0xfd,0xf2,0x91,0xf0,0xe1,0x5d,0x4e,0xa5,0x16,0x6e,0xb4,0x39,0x8b,0x99,0x32,0x6b,0xc8,0x16 +.byte 0xc1,0x84,0x10,0xc2,0x74,0x54,0xfc,0x02,0x71,0x44,0xfc,0x52,0xfa,0xc2,0x3c,0x8d,0xf7,0x8b,0x1e,0xcc,0x5e,0x43,0x66,0x29,0x29,0x93,0xe7,0xf6,0x9f,0xa8,0xa3,0x35,0xc9,0xde,0xb0,0xbe,0x4d,0xdf,0x8c,0x61,0x5a,0x6b,0x16,0x88,0x33,0x65,0x47,0x98,0xd2,0xf8,0x71,0x09,0x9f,0x00,0xb6,0x9e,0x21,0x37,0x2a,0x0b,0xb4,0x74,0x6b,0x0e +.byte 0x6e,0x4d,0x14,0x45,0x6c,0x1b,0xa8,0x4c,0xa7,0xc6,0xc3,0x36,0x6e,0x9e,0x63,0x5a,0x36,0x76,0x04,0x06,0x7f,0xdd,0x74,0x24,0x19,0xd8,0xb7,0xbc,0x6c,0x52,0x82,0x67,0x6b,0xd5,0xcb,0x81,0xdf,0xd7,0xe4,0xdd,0x14,0x33,0x71,0xcf,0x6b,0x7f,0xaf,0x66,0x27,0x8a,0x70,0xb8,0x45,0xae,0x8c,0x1a,0x65,0xd3,0x16,0x5c,0x05,0x65,0xd0,0xfb +.byte 0x07,0xe3,0x98,0xa9,0x94,0x27,0x6c,0xac,0xfc,0xee,0x1b,0x35,0x43,0xd6,0x3b,0x41,0x1c,0x86,0xc0,0x4f,0xf3,0x63,0xf4,0xba,0x4d,0xdf,0x6a,0xda,0xcf,0xb5,0x9f,0x69,0x3f,0x3d,0x0c,0x80,0x79,0x02,0x34,0x4a,0x9a,0xfd,0xb6,0xea,0x0b,0x61,0x32,0x67,0x2d,0x6a,0x6b,0xcb,0xcf,0xa6,0xee,0x6a,0x93,0x11,0x00,0xb8,0x6e,0x27,0x88,0x62 +.byte 0xf7,0x4c,0x7b,0xe1,0x13,0xe1,0x47,0xaf,0x96,0x24,0x3b,0x46,0x8c,0xf4,0xbe,0x13,0xed,0x65,0xe1,0xf2,0x36,0x2d,0xa4,0x6d,0x5e,0xa6,0x93,0xfb,0x64,0x0e,0xbd,0x50,0xdc,0x29,0x4f,0x90,0x8e,0xe1,0x7f,0x5e,0x47,0x08,0x9b,0x1c,0xb7,0xce,0x06,0x80,0x52,0xc0,0xb5,0x82,0x77,0x49,0x3c,0xe0,0x70,0x1f,0x84,0x75,0x9e,0x19,0xb2,0x83 +.byte 0xda,0x40,0xf8,0xd7,0x27,0x1e,0xbc,0x39,0xb5,0x1d,0x25,0x75,0x63,0x7d,0x85,0x2f,0x09,0x07,0xe9,0x73,0x8e,0x2b,0xb8,0x9a,0xbe,0xd6,0x90,0x91,0x6e,0xdb,0x7c,0x9d,0x9b,0x43,0x1d,0x21,0x88,0x76,0xb0,0xaa,0x7b,0x68,0xe4,0xa7,0x92,0x64,0xe4,0x1f,0xff,0x53,0x1d,0xf7,0xc0,0x44,0x5c,0x0a,0x1e,0xcd,0xa7,0x6e,0x41,0x1c,0x8c,0x7d +.byte 0x66,0xa7,0xf6,0xfc,0xa9,0x0d,0x3f,0x9c,0xfb,0x15,0x87,0x14,0x20,0x43,0x1b,0x05,0xf5,0xea,0x5c,0x07,0x61,0xb3,0x0e,0x7c,0x52,0x57,0x1c,0x09,0x33,0xb4,0xd8,0x3d,0x9d,0x17,0xee,0x86,0x25,0xdc,0x6b,0xcd,0x58,0xb7,0x18,0xbd,0x85,0x39,0x0b,0xb9,0xb8,0x35,0x3a,0x86,0xbb,0x88,0xb5,0x5e,0x4b,0x0a,0x7e,0x9c,0x02,0xb5,0x45,0xe5 +.byte 0xc7,0x38,0x56,0x1e,0xe4,0xe7,0xf7,0x88,0xac,0x75,0x9a,0x97,0xa8,0x15,0xb6,0x2d,0xcf,0x2a,0x59,0x65,0x0e,0x00,0x9f,0x8e,0xa9,0x94,0x23,0x1c,0x40,0xe4,0xb9,0x6b,0xcf,0xf0,0x53,0x7f,0x98,0xd1,0xa7,0x72,0xd7,0xe3,0x22,0xfd,0x5f,0x3d,0x3f,0xd6,0x21,0xb4,0x84,0x0c,0x1b,0x1d,0x00,0x2d,0x8f,0x72,0x22,0x2d,0x2c,0x8c,0x54,0x46 +.byte 0xe5,0x53,0xca,0x66,0x67,0x5e,0xb3,0x62,0x6f,0xaf,0x33,0x81,0xc1,0xf6,0x77,0x92,0x3e,0xdb,0x74,0x68,0x93,0xca,0x38,0xf8,0x18,0x50,0xef,0xe4,0xc9,0x45,0x40,0xc9,0xf0,0xc5,0x7a,0x4b,0xf2,0xd8,0xca,0x72,0x62,0x5f,0x67,0x10,0x10,0xcc,0xff,0x1a,0xc7,0x9c,0x3a,0x7f,0xca,0x11,0x67,0x3e,0xca,0xa6,0x9c,0x48,0x15,0xaf,0x68,0xb7 +.byte 0x2b,0xa7,0xa2,0x68,0x7b,0x40,0xb2,0xe3,0x27,0x18,0x7e,0x94,0x4c,0xca,0x0e,0x5b,0x3a,0x30,0xcb,0xc3,0x72,0x31,0x6b,0xe6,0x3e,0xa7,0x09,0x3e,0xf2,0x53,0xda,0x7d,0x6f,0x55,0x08,0xd2,0x26,0xc3,0x07,0x52,0x38,0x90,0x04,0xc6,0x3c,0xb6,0xb5,0x2a,0x7b,0x38,0x07,0x9e,0xb4,0xa5,0x48,0x36,0xf5,0x5e,0xac,0xa8,0x97,0x4e,0x37,0xc2 +.byte 0xee,0x12,0x88,0x28,0xd0,0x7d,0xd1,0xae,0xc0,0xc7,0x84,0x69,0x25,0x79,0x9a,0x8a,0x16,0x49,0x50,0x72,0x69,0x1a,0x02,0xc9,0xfe,0xd5,0x2c,0x40,0xc6,0xc8,0x8b,0x7d,0xe3,0xab,0x89,0xe3,0x78,0xf1,0xe9,0xbd,0x3c,0xbd,0x02,0x96,0xfe,0x0c,0x5c,0xc4,0x9e,0x89,0x3a,0x4b,0xe9,0xcd,0x41,0x1c,0x59,0x71,0x52,0xb0,0xc9,0x36,0xf1,0x80 +.byte 0xab,0x5e,0xbc,0xf1,0x20,0x99,0xc0,0xab,0x0c,0x59,0x43,0xc2,0xcd,0x09,0xa6,0x30,0x91,0xfa,0x12,0x23,0xbe,0x18,0x24,0xa6,0xbf,0x55,0x4c,0xe8,0x22,0xff,0x01,0xbd,0xde,0x2c,0x72,0x3c,0x0a,0x36,0xd5,0x7e,0xed,0x6a,0xe3,0x63,0x14,0x60,0xa3,0x0a,0x6f,0x04,0x90,0x64,0xc1,0xd1,0x78,0x54,0xae,0x19,0x74,0xe2,0xea,0xec,0x86,0x22 +.byte 0xc7,0xdb,0xf6,0x48,0x0e,0x75,0x43,0x04,0xf7,0x62,0xe6,0xa9,0x46,0x65,0xcc,0xa5,0xa4,0x1a,0xb2,0x94,0x7b,0x7a,0x8c,0x9a,0x80,0x62,0x32,0x17,0x80,0xc3,0xc6,0x54,0x0e,0x4e,0xe3,0x46,0x74,0xa8,0xae,0xcd,0xd0,0xc1,0x19,0x84,0x61,0xb4,0x1d,0x18,0x4d,0x80,0xf1,0x70,0x40,0xbe,0xa2,0xa3,0x38,0xcc,0x21,0x1c,0x2f,0x72,0x85,0x72 +.byte 0x0a,0xa1,0x0d,0xa3,0xdc,0xa2,0xf4,0x64,0x84,0x3c,0x43,0x6d,0xfb,0x45,0x11,0xf9,0x40,0xdc,0x25,0x85,0x80,0x41,0x84,0xa7,0x06,0x2e,0x79,0xbf,0x0c,0xa7,0x8f,0x17,0xea,0xa2,0xc4,0x6f,0xd8,0xc6,0x9e,0xab,0xdc,0x45,0x6f,0xaa,0xda,0xe9,0xe6,0x84,0xf0,0x5f,0x8a,0x90,0x99,0x33,0x9b,0xcf,0x03,0xe6,0xce,0x19,0x0c,0xad,0x2f,0xad +.byte 0x81,0xb8,0x17,0xff,0x6b,0xff,0xc8,0x14,0xa6,0xf4,0x37,0x55,0xdc,0xbb,0x09,0x3c,0x3c,0xe7,0x29,0x95,0x23,0x5c,0x58,0x92,0x2e,0x95,0xe8,0x3b,0x8b,0x81,0x2d,0xfd,0x58,0x8a,0x1f,0xdf,0xf1,0x54,0xa3,0xd0,0x01,0xaa,0x3d,0x32,0x61,0xe5,0x8e,0x62,0xa7,0xf6,0x3b,0x2d,0x0e,0xff,0xf4,0xe9,0x08,0xe7,0xef,0x3a,0x63,0x10,0x34,0x49 +.byte 0x14,0xe1,0x88,0xd0,0xb2,0x1d,0xb7,0x31,0xc9,0xa4,0x48,0xa8,0xaf,0x64,0x29,0xab,0x1f,0x14,0x13,0xa7,0xb8,0xb8,0xa4,0x24,0x1d,0xf9,0xb6,0x3e,0x62,0xa6,0x5e,0x10,0xcb,0x44,0x5c,0x9d,0x2c,0x58,0x3a,0x36,0xa3,0x81,0x9f,0xa9,0xa4,0xa1,0x06,0x1d,0xbf,0x97,0x03,0x88,0xf2,0xf4,0x81,0x3e,0x1b,0x35,0xea,0xd0,0xb6,0x96,0xa1,0xf7 +.byte 0x1e,0x49,0xb7,0xe8,0x23,0x6f,0x05,0x7c,0x9f,0xc4,0x53,0xb1,0x63,0xdc,0x07,0xbb,0xd6,0x57,0x85,0x4d,0x77,0x33,0x21,0xbf,0x77,0xfe,0xfe,0x34,0x52,0x02,0xe7,0xe4,0x87,0x11,0xa0,0xfd,0x11,0x4a,0x34,0x36,0x88,0x69,0xdf,0x77,0xfd,0x83,0x71,0xa8,0x68,0xed,0x49,0x39,0xb4,0x06,0x32,0x48,0xf1,0xd2,0x4e,0x61,0x47,0x65,0x26,0x87 +.byte 0xba,0x2b,0x2e,0xf4,0x12,0xfc,0xd0,0x84,0x81,0xa1,0x59,0xdc,0xe3,0x13,0x51,0x9e,0xea,0x57,0x56,0x3b,0x7c,0x71,0x6b,0xff,0xe9,0xf8,0xec,0x3e,0xe7,0xbe,0x65,0x47,0xe1,0x6f,0x8f,0x7c,0x3a,0x77,0xdb,0x75,0x4a,0x43,0x43,0x39,0x37,0xb2,0x68,0x16,0x72,0xdb,0x49,0xf7,0x13,0x3c,0x09,0x93,0xef,0xc1,0x2a,0x99,0xff,0xc7,0xdb,0xd9 +.byte 0x80,0xd2,0xfe,0x7c,0x39,0x50,0x21,0xdc,0x1d,0xae,0x9b,0xfc,0xd4,0x5f,0x56,0xae,0x6a,0xd9,0x35,0xa1,0x2b,0xd6,0x53,0x90,0xe8,0x8c,0x31,0x73,0x0f,0xa3,0x9e,0xa1,0x2f,0x76,0xa8,0x72,0x4d,0x5e,0x58,0xca,0x9f,0x8f,0xdf,0xf0,0xf9,0x6a,0x54,0xb1,0x5f,0x39,0x03,0x7a,0x26,0x06,0x71,0x74,0x6f,0x42,0xee,0x63,0x76,0x13,0xb9,0xed +.byte 0x74,0xad,0xf9,0xe0,0xa7,0x35,0x9c,0x18,0xe0,0xf7,0xc5,0xb2,0x27,0x14,0x0f,0xd7,0xaa,0x17,0x1c,0x8f,0x50,0xc8,0xb0,0xc2,0x63,0xff,0x38,0x65,0x87,0x69,0xb3,0xd5,0x3f,0xb4,0xf2,0xe8,0x8b,0x7b,0x24,0xdc,0x1f,0x62,0x2f,0x0a,0xd7,0x2d,0x0f,0x6f,0x48,0x1d,0xf0,0x3c,0xb1,0xb4,0x10,0x8d,0xc6,0x5c,0x79,0x30,0xde,0x20,0x9e,0x7b +.byte 0xf1,0xa5,0x73,0x38,0x05,0x1b,0x13,0x78,0xb1,0x02,0x2f,0x32,0x2a,0x07,0x59,0xa4,0xfc,0x88,0x08,0x0c,0xff,0x42,0x72,0x6a,0xb0,0x8a,0xc9,0x3d,0xdb,0x04,0x90,0xdd,0x0b,0xbc,0x3a,0x4e,0xfa,0xd4,0x57,0xd8,0x2f,0x7b,0xcb,0xd9,0x6a,0xe7,0xfd,0x32,0x17,0x99,0x20,0x64,0x1e,0x76,0x07,0xb9,0xa3,0x58,0x7f,0x79,0xda,0x0c,0xe0,0xec +.byte 0x30,0xbf,0xa4,0x85,0x0a,0x39,0xc0,0xe9,0xf7,0xbe,0xd1,0xa7,0x94,0x1f,0xa6,0x6d,0xe8,0xc5,0x1b,0x04,0x27,0xf4,0xdc,0xc2,0x4d,0x9a,0x0e,0x9b,0xe8,0xec,0x56,0x99,0x90,0x5f,0x8b,0x28,0x0a,0x92,0xaf,0x0b,0xa1,0xd2,0x85,0x86,0x26,0xc7,0x8a,0x01,0xa4,0x08,0x29,0x32,0x7d,0x3d,0xa5,0x74,0x9c,0x90,0x63,0x83,0x1f,0xd4,0xee,0x98 +.byte 0xf5,0x14,0xff,0x39,0xeb,0xbf,0x40,0xa4,0xc9,0x70,0x4f,0x81,0x03,0x19,0xef,0xf5,0xdf,0xf7,0x00,0x75,0xcb,0x2e,0x81,0x41,0xc5,0xda,0xfb,0x67,0x6a,0xf0,0xa3,0xd3,0x5a,0x60,0xaf,0x72,0x27,0x3e,0xad,0x37,0x3e,0x3d,0xe6,0x85,0x4c,0xa1,0xb0,0xe9,0xab,0xc5,0xd3,0x8b,0x04,0x0d,0x64,0x7f,0xa2,0xb9,0x6d,0x6d,0x28,0xf8,0x4b,0x43 +.byte 0x78,0x51,0xf4,0x84,0xf1,0x3c,0x67,0xd8,0xdd,0xd7,0x0b,0x67,0xc3,0xd9,0x95,0x7b,0xfc,0x7d,0xc4,0x33,0x05,0x90,0xec,0x0a,0x98,0xfb,0x6b,0x0d,0xe9,0x8c,0x74,0x94,0x20,0xf8,0xcb,0xca,0xb6,0x72,0x07,0x7c,0xef,0xfa,0xd0,0x3f,0x51,0xc5,0x6e,0xf8,0x3f,0x37,0xe3,0xfe,0xb9,0x9a,0x9c,0xb3,0xf6,0x96,0x4e,0x65,0x77,0x21,0xcf,0xaf +.byte 0xe7,0x20,0x06,0xc2,0x93,0xc5,0x2e,0xc0,0x7f,0xe5,0x0a,0x42,0xad,0x89,0x64,0x6e,0x95,0xbf,0x95,0x1d,0x24,0x47,0xf8,0xd5,0xec,0x7c,0x1f,0x98,0x67,0x9c,0x5f,0x6e,0xaf,0x74,0x95,0x65,0x4c,0xb6,0xe0,0xd3,0xb7,0x5b,0xc7,0x76,0xe6,0x87,0x19,0xf5,0xc7,0xb0,0x2d,0xe0,0x8b,0xaf,0x6d,0x3c,0x31,0x6e,0x84,0xc8,0x86,0x51,0xff,0x29 +.byte 0x2a,0x1f,0xea,0xd4,0x2d,0x1a,0x8f,0x04,0xb4,0xc0,0x6a,0x93,0xc2,0xc5,0xe7,0x98,0x8c,0xc7,0xff,0xbf,0xb8,0x8e,0x5b,0x29,0x5b,0xa6,0x87,0xc7,0x02,0x88,0x51,0x29,0x66,0xd8,0xf3,0x68,0x38,0xd4,0xa6,0xbd,0xa2,0x5c,0x1b,0xb7,0x13,0xd7,0x64,0xed,0x68,0x21,0x88,0x2b,0x59,0xba,0x95,0x84,0xda,0xce,0x61,0x3b,0x51,0x04,0x3e,0xc2 +.byte 0xdd,0xec,0x0c,0x6b,0xbe,0x35,0x51,0x63,0x29,0x40,0xcb,0xa5,0x62,0xe4,0x27,0x35,0x15,0x1f,0x7c,0x8b,0xe5,0xd0,0x2e,0xde,0x8c,0x3d,0xa0,0xd2,0xbe,0x51,0x3d,0x65,0xed,0x94,0x8b,0x8c,0x00,0xda,0x0e,0x78,0x4d,0x25,0xef,0x8e,0x3c,0x55,0x77,0xeb,0x58,0x06,0x7d,0xd1,0xfc,0x73,0xad,0x76,0x0a,0x81,0xbe,0xda,0x50,0x30,0xf3,0xfd +.byte 0x58,0x25,0x0a,0x4b,0x1b,0x1e,0x0b,0xd0,0x9b,0xbc,0xb9,0x31,0x26,0xbc,0x4c,0x7b,0x05,0xd7,0x5c,0xe4,0x7a,0xdd,0xff,0x04,0xac,0x5d,0xcb,0xfd,0x91,0x34,0x68,0x26,0x1e,0xb4,0x86,0xcc,0xe3,0x90,0xaf,0x6a,0x65,0xda,0x6b,0x3e,0xec,0x44,0x90,0x72,0x7a,0x34,0xfc,0x7b,0x65,0x83,0x34,0x93,0xbc,0x85,0x50,0xdf,0x03,0x89,0x35,0xb8 +.byte 0x6a,0x39,0xd3,0xb6,0x38,0x66,0x5b,0xa7,0x9e,0x93,0xa2,0x3b,0xb6,0xe7,0xee,0x1e,0x5c,0xd6,0xa8,0xd9,0x1f,0xf7,0xd1,0x0a,0x2f,0x87,0x63,0xf4,0xf9,0x8c,0xd4,0x7c,0x02,0xaf,0x7e,0xb6,0xc7,0xfc,0xc9,0x4d,0x35,0x0c,0x8c,0x3c,0x13,0x9d,0xe6,0xd7,0x2e,0x4b,0x91,0xcc,0x88,0xdb,0xfc,0x68,0x3a,0xd1,0x15,0x07,0x16,0x66,0x11,0x9b +.byte 0x66,0x9f,0x3f,0x37,0xae,0x11,0xba,0x5f,0xc7,0x3a,0x1a,0x49,0xbc,0x14,0x21,0x75,0xdc,0xcc,0xbb,0x5c,0xed,0xdc,0x8b,0x21,0x9a,0x8f,0x5f,0x91,0x6a,0x9b,0x26,0x33,0x64,0x45,0xa0,0xdf,0xc4,0xa1,0x32,0xc4,0x4c,0xc2,0x42,0x1b,0x59,0x37,0x1f,0xdb,0x01,0x6d,0xed,0xd8,0x05,0x5b,0x90,0x59,0x32,0x45,0x50,0x5d,0xf1,0x34,0xc4,0xb7 +.byte 0x52,0x97,0xbb,0x42,0x12,0xf1,0xa5,0x76,0xe4,0x1a,0xbc,0x4a,0x64,0xd3,0x08,0xac,0xe1,0x49,0x70,0x61,0xc8,0xcf,0xb1,0xd3,0xc4,0x7f,0x38,0x31,0x6b,0xd3,0xe1,0xe1,0xe9,0x5b,0xaa,0x7a,0xec,0x26,0x81,0x44,0xd3,0xb9,0x63,0xea,0x37,0x98,0x15,0x41,0xf1,0xa1,0x72,0x87,0xcc,0x3b,0x6a,0x27,0x9b,0x85,0xa8,0x7b,0xb6,0x25,0xf9,0xd4 +.byte 0x84,0x3e,0x66,0x12,0xce,0x24,0xee,0x22,0x51,0x73,0x7e,0xba,0x1e,0x95,0x64,0xc5,0xbf,0x4e,0x4f,0x73,0xc1,0xc3,0x98,0xb9,0x6b,0x90,0x1f,0x39,0xfc,0x03,0x55,0x76,0x8c,0x57,0xea,0xe8,0xc1,0x25,0x09,0x69,0xc0,0xe8,0x54,0x91,0xc1,0x7c,0x52,0x8e,0x82,0x6d,0xf2,0x0e,0x3f,0xa9,0x98,0x04,0x40,0xda,0x1c,0xc0,0xbb,0x42,0xf0,0x7d +.byte 0xed,0x78,0xb0,0x4f,0x94,0xba,0x0d,0xbf,0x60,0xbe,0x09,0x67,0x42,0xc5,0x41,0x4c,0x80,0x8d,0x30,0x10,0xa9,0xd2,0x07,0x8c,0xa8,0x40,0xc6,0xe2,0x08,0x42,0x7f,0x99,0xad,0xc5,0x66,0x1f,0xfd,0xd2,0xc5,0x79,0x77,0x9b,0x60,0x7d,0x25,0x2d,0x69,0x14,0x94,0xa5,0xf0,0x0a,0x14,0xb6,0xf9,0xbe,0x3a,0x4a,0x3d,0xc6,0x45,0x2e,0x27,0x4a +.byte 0xd1,0x1d,0xcf,0x08,0xee,0x93,0x3c,0xb5,0x8a,0xee,0xdd,0xf3,0x33,0xa6,0x35,0x9d,0xd8,0xb4,0x68,0xc5,0x98,0x09,0x78,0xcc,0xb3,0xeb,0x0f,0xcd,0x25,0xf8,0x17,0x9c,0x45,0x77,0xc7,0x06,0x40,0x44,0x90,0xec,0x6a,0xd9,0xf5,0x05,0xd4,0x88,0x17,0x47,0xeb,0x29,0x85,0x32,0x76,0x7b,0xa4,0xe3,0x65,0x30,0x50,0x9a,0x99,0x26,0x91,0x60 +.byte 0xb0,0xb8,0xe5,0x8d,0x35,0x9e,0x9a,0x13,0x65,0x82,0xb2,0x4b,0xf1,0xed,0x1f,0xb7,0xb4,0xc0,0x03,0xe6,0x1d,0x2b,0xaa,0x1e,0x01,0x92,0x0b,0xcb,0x34,0x77,0x80,0x94,0xc2,0x4e,0x3b,0x73,0xd8,0x2e,0xd8,0x95,0x33,0x05,0x65,0xa2,0x99,0x29,0x7a,0xd1,0xb3,0xed,0x5a,0x8d,0x4d,0x6a,0x6d,0x69,0x2b,0x5a,0xa1,0x3a,0xc0,0x81,0x96,0xf1 +.byte 0xc2,0xa7,0x4e,0x07,0x90,0x04,0x99,0x70,0xea,0x1a,0x3a,0x26,0xb5,0xed,0x92,0xbd,0x57,0x80,0x11,0x06,0xf2,0xb4,0x05,0x69,0x7a,0xbf,0x27,0xa1,0xbd,0xdb,0x09,0xe5,0xb3,0x2d,0x86,0x41,0xcc,0x5d,0x68,0x37,0x9e,0x98,0xa5,0x4a,0x20,0x8a,0x5f,0x54,0xae,0x4f,0x73,0xd0,0x22,0x18,0x8d,0x2b,0x91,0xcb,0xbb,0x83,0x1e,0x04,0x93,0xc8 +.byte 0xc3,0x89,0x35,0xfd,0xda,0xeb,0x52,0x53,0x9f,0xdc,0x33,0xf0,0xe0,0x99,0x19,0x11,0xeb,0x55,0xd3,0x3c,0x5f,0xca,0x29,0x52,0xe7,0x6b,0xd1,0xad,0xeb,0xed,0x8e,0x68,0x82,0x91,0x85,0x81,0x68,0x70,0x78,0x61,0x1e,0x0c,0x09,0x3a,0x82,0xdc,0xdb,0x26,0x66,0x1c,0xa3,0x80,0x99,0x23,0x8a,0x45,0xd7,0xb8,0x10,0x97,0x80,0x70,0x49,0x78 +.byte 0xa9,0x4c,0xf0,0xec,0xcc,0x05,0xd0,0x6a,0x6a,0x1a,0xa0,0xf7,0xde,0x78,0xc6,0x42,0xbe,0xbd,0xa0,0x24,0x1d,0x3f,0xdd,0xfb,0x92,0xc2,0xbd,0xd6,0x5c,0x25,0x74,0x3d,0x2b,0xb8,0x60,0x67,0xdb,0x70,0x1e,0xe8,0x9f,0xcd,0xb4,0x82,0x90,0x9e,0x2a,0x94,0xa5,0xa2,0xd4,0xd2,0x24,0xa7,0xca,0xbf,0xe1,0x8b,0xab,0xf3,0xd2,0x7c,0xa6,0xc8 +.byte 0xe6,0xaf,0xef,0xe3,0x86,0xb1,0x42,0x1d,0xc6,0xa2,0x37,0x9b,0x26,0x46,0x0b,0xfd,0xee,0x88,0xa4,0xf1,0xa8,0x72,0xaf,0xda,0x30,0x56,0x22,0xd3,0x1b,0x31,0x76,0xd7,0x03,0xef,0xf3,0x98,0x16,0x4d,0x36,0x57,0x1b,0xd5,0x90,0xb8,0x67,0x50,0x7f,0x22,0xa8,0xdc,0x9c,0xf1,0x6e,0xa4,0x65,0x45,0xf0,0x73,0xd8,0x7e,0x41,0xb0,0x68,0x52 +.byte 0x00,0x0a,0xda,0x99,0x6c,0x84,0xce,0xf0,0x73,0x65,0x93,0x52,0xc8,0x4b,0xb4,0x72,0xda,0x2c,0xa1,0x47,0xb5,0xe3,0x00,0x63,0xc0,0x4e,0x84,0x16,0x00,0xe6,0x1f,0xbd,0xba,0x49,0xcb,0xd3,0x7d,0xd2,0xeb,0x4a,0xb2,0xd5,0xb2,0x53,0x96,0xfb,0x04,0x73,0xc0,0x09,0x31,0xf3,0xf2,0xc0,0xd3,0xa6,0xe1,0xea,0xe1,0x58,0xbe,0x90,0xc9,0xfb +.byte 0x6e,0x13,0x69,0xbe,0x17,0xd4,0x16,0x5b,0xcb,0xf4,0x93,0x0a,0x38,0x46,0xea,0x64,0xad,0xb0,0x0d,0xc0,0x3b,0xfc,0xe3,0xd4,0x20,0x75,0x0c,0x3e,0x71,0x1b,0x5f,0xde,0xff,0xd6,0xfa,0x6f,0xe4,0x10,0xb0,0x14,0x05,0xaa,0x05,0x70,0x5e,0xbd,0x58,0x9f,0x3c,0x9d,0x4f,0xa7,0x5a,0x65,0x57,0x02,0x05,0x44,0xe0,0x95,0x9d,0xa2,0x60,0x06 +.byte 0xcb,0xfd,0x91,0x8e,0x7f,0xce,0xa1,0x80,0x94,0xbb,0x88,0xf2,0xa6,0xe7,0x83,0xf9,0x38,0x8f,0x09,0x8e,0xe4,0xa9,0xc2,0xc7,0x84,0x9d,0x25,0x09,0x52,0x8b,0x32,0xaa,0x3b,0xde,0xb6,0x82,0x9f,0x6d,0xc4,0xdf,0x11,0xf7,0x72,0x1a,0xe4,0x00,0x51,0x41,0x01,0xba,0x21,0xea,0x0a,0xda,0xf2,0xbb,0x66,0xae,0x51,0x2b,0xb0,0x6d,0x1d,0xe8 +.byte 0x4b,0x1e,0x42,0x68,0x3a,0xed,0xe6,0x59,0x13,0x42,0x07,0x54,0xae,0x2e,0x15,0x93,0xd7,0xff,0xad,0x49,0x09,0x41,0x52,0x6b,0x3b,0x9c,0x41,0x43,0x0d,0xed,0xed,0x6f,0xb8,0xe9,0x0d,0xcc,0xde,0x0d,0xaa,0x91,0xef,0x89,0x2f,0x2d,0x94,0xd0,0x03,0x2b,0x51,0x7f,0x85,0x9b,0x7b,0x08,0xc8,0xb6,0xe2,0x82,0x22,0xa9,0x57,0x71,0xf2,0xae +.byte 0x08,0xfa,0x6c,0xd8,0xca,0x78,0x42,0x98,0x23,0xfd,0x38,0x4b,0x6c,0xd3,0x9f,0xc6,0xa3,0xb2,0xc1,0x8c,0x4a,0xa3,0xcd,0x9f,0x56,0xe7,0xc2,0x06,0xd7,0xc5,0xc2,0xd9,0x98,0x57,0xc8,0x5a,0xaa,0xf4,0xaa,0x44,0x02,0x83,0x11,0x1e,0xf6,0x64,0x8d,0xf7,0x3b,0x86,0x3c,0x04,0x53,0x5f,0x62,0xc8,0x7a,0x0e,0x1c,0x4f,0xa8,0xe3,0x5c,0xe8 +.byte 0x64,0xf7,0xe3,0x5d,0xea,0xb5,0x2d,0xdb,0x7b,0x0e,0xdb,0x91,0x34,0xd5,0x87,0x4f,0xe6,0x73,0xee,0x3d,0x79,0x7c,0x67,0x48,0xb5,0xbb,0x42,0x96,0x0d,0x9d,0xbd,0x68,0x98,0xe5,0x59,0x51,0x16,0x45,0x15,0xac,0x80,0x41,0xae,0x45,0xdb,0xe4,0x2a,0x44,0x0d,0xe4,0x25,0xc7,0xd3,0x06,0xf7,0x98,0x15,0xe1,0xc5,0x9b,0x34,0x0e,0x87,0xb8 +.byte 0x90,0x1b,0x24,0x84,0x06,0x24,0xb0,0x80,0xbe,0x03,0xa0,0x95,0x10,0x1e,0x72,0xde,0x0f,0xd4,0x15,0x7b,0xa0,0xf5,0x42,0xc3,0x6f,0x10,0xe9,0x76,0x44,0xe3,0xa9,0xb7,0xef,0xf6,0xc2,0x80,0xe2,0x0c,0x2d,0xad,0xe0,0xb9,0x45,0xca,0x67,0x6f,0xb6,0xc5,0xc0,0x8d,0x25,0xee,0x50,0xeb,0x51,0xc6,0x87,0x87,0x61,0x3a,0x75,0x95,0x41,0x47 +.byte 0x26,0xfd,0x35,0xf6,0x46,0xf4,0xe9,0x42,0xc6,0xef,0x37,0x97,0xb3,0x0a,0x1d,0xc8,0xdf,0x07,0x24,0xb1,0x0d,0x07,0x43,0x67,0x7d,0x81,0x09,0x58,0xdd,0xf6,0xcf,0xf1,0x47,0x42,0xbd,0x3c,0xa3,0xd7,0xe8,0x73,0xf9,0x5b,0xff,0x2c,0xcd,0xe6,0xd1,0xe9,0x47,0x6d,0x19,0x9b,0x6a,0x63,0x69,0xf4,0x4a,0xdf,0x69,0xab,0xa9,0xb7,0xe5,0x8d +.byte 0x1c,0x44,0x52,0x0c,0x7e,0xa1,0xfe,0x9d,0xd5,0xa4,0x71,0x62,0x0b,0x3c,0xf6,0xd2,0xd3,0xe9,0x70,0x09,0x68,0xf7,0xd6,0x0a,0x00,0x61,0xf1,0xf3,0xd0,0x41,0x4a,0x14,0xc6,0xf5,0x49,0xb1,0xde,0x10,0xd3,0x20,0x8b,0xfe,0x78,0x6a,0x87,0x79,0x15,0xd3,0x43,0x00,0xbe,0x71,0x40,0xaa,0xca,0x1a,0x64,0xe3,0x96,0x34,0x2f,0xea,0x0c,0x11 +.byte 0x41,0x21,0xf8,0xa7,0x65,0x9b,0x75,0xe2,0x1e,0x6f,0x5e,0xe0,0x68,0x42,0xca,0xd3,0x19,0x35,0xe8,0x88,0x0f,0x05,0xa3,0xb1,0x73,0xea,0x53,0x79,0x40,0x24,0x00,0x86,0x20,0xbb,0x25,0x58,0x89,0x6b,0xde,0xd6,0xd0,0x36,0xbb,0x33,0x30,0x59,0x4b,0x30,0x92,0xac,0xe5,0x95,0x94,0x22,0xab,0xc1,0x10,0x35,0x9c,0xa1,0x20,0x11,0x5d,0x4f +.byte 0x57,0x5c,0x9c,0xb8,0x3a,0xdc,0x97,0xa5,0xf3,0x0b,0xf5,0x96,0xe7,0xef,0x90,0x72,0x01,0x52,0x70,0x5a,0xf0,0xd9,0x7e,0x59,0x05,0x8c,0xd1,0x45,0x47,0xbf,0x16,0x15,0xa2,0xc9,0xdd,0xe7,0x5f,0x4b,0x94,0x5f,0xe6,0xf9,0x78,0xbb,0x8f,0xf9,0x79,0x9f,0x5e,0xd7,0x1f,0x0b,0xef,0x8d,0xfe,0x75,0xd4,0x8a,0x12,0x28,0xa5,0xf9,0x6e,0x14 +.byte 0x3c,0x52,0x80,0x57,0xc6,0x96,0xae,0x67,0x27,0xc1,0x1c,0xb6,0xd6,0x1c,0x74,0x8c,0x6f,0xc7,0x71,0x3e,0xd5,0x73,0xf2,0x3e,0x02,0x15,0x67,0x18,0xb8,0x5b,0x61,0x9e,0xfa,0x7e,0xba,0x00,0xe9,0xd9,0x51,0x91,0x63,0x7e,0xf7,0xab,0xc0,0xc6,0xee,0x66,0xdd,0x66,0x88,0x7a,0x8a,0xc5,0xc2,0x08,0x45,0x62,0xde,0xe1,0xfb,0x35,0x65,0x34 +.byte 0x00,0x9e,0x1d,0x25,0xdf,0x69,0xb6,0xe3,0xfe,0xbb,0x13,0xac,0xd3,0x13,0xb2,0x64,0x5a,0xf3,0x47,0xf1,0x36,0x55,0x5f,0x1b,0x87,0xea,0x5d,0x5c,0xfd,0x8a,0x68,0x69,0x8a,0x00,0x9f,0x83,0xbe,0x79,0x7d,0x01,0x9e,0xf2,0xb2,0x5d,0x56,0xe0,0xe6,0x49,0xe5,0xe1,0x76,0x57,0x7a,0x85,0xac,0x94,0x16,0xe3,0x68,0x05,0x14,0xb5,0x33,0x54 +.byte 0x64,0x5a,0xbe,0xa3,0x04,0x90,0x5c,0x1c,0xf8,0x97,0x16,0x36,0xce,0x76,0xe7,0xf0,0xaf,0x8a,0xea,0x65,0xa8,0x15,0x5b,0x1e,0x0a,0x91,0xad,0x62,0x62,0x67,0xb4,0xf0,0x94,0x1f,0x64,0x50,0xa8,0xc0,0x6b,0x38,0x80,0xd7,0x53,0xbb,0x70,0xbd,0x54,0x01,0xb0,0xa5,0xbc,0x00,0xe0,0xd6,0x23,0x37,0xe6,0x9f,0x0f,0x2f,0x96,0x21,0xc2,0x90 +.byte 0x55,0x26,0x55,0xa4,0xcd,0x3e,0x54,0x6b,0xa6,0xb0,0x2c,0xf2,0xd4,0xcc,0x6a,0x44,0xea,0x18,0x61,0xc5,0x1a,0x8e,0x60,0x64,0xf4,0x5f,0x21,0x36,0x01,0x5d,0x9f,0xc4,0x2c,0x67,0x1c,0x48,0x94,0x16,0xae,0xa8,0x13,0x5c,0xee,0x18,0x88,0x61,0xe4,0x54,0x6b,0xa2,0xe8,0x7f,0xf0,0x15,0xc3,0xce,0xbc,0x5b,0x91,0x25,0x7b,0x1d,0xd3,0x9f +.byte 0x13,0x1b,0x01,0x5d,0x43,0xe8,0xa1,0x77,0x5a,0x87,0x79,0x8b,0xd5,0x69,0xf7,0xdf,0x66,0xa2,0x84,0x0c,0x66,0xac,0x15,0x65,0xbf,0x74,0xc0,0xd2,0x78,0x6a,0x3a,0x9c,0x98,0x62,0x04,0x41,0x95,0xb2,0x23,0x59,0xc6,0xb0,0xc5,0x22,0xc0,0xfa,0xaa,0xc8,0x94,0x73,0x91,0x5b,0x64,0x1b,0x74,0xbe,0xcb,0xa1,0x81,0xb1,0xc1,0x26,0xa1,0x94 +.byte 0x55,0x04,0xb3,0x9c,0x80,0xb7,0x00,0x6f,0x36,0xc7,0x7f,0x6d,0x97,0xea,0xf3,0xf5,0x55,0xc5,0xfe,0x61,0xd9,0xb1,0x6d,0x8c,0xa1,0x02,0x08,0xb3,0x41,0xe6,0xe6,0x57,0xc6,0xff,0x6e,0x47,0xa4,0x22,0x2e,0x2d,0x21,0x53,0xbe,0xe3,0xbe,0x15,0xec,0x23,0x9d,0x87,0xe0,0x2e,0xcc,0x6c,0xd0,0xc7,0xb7,0x3d,0xa4,0x07,0x5f,0x69,0x4e,0x2b +.byte 0x07,0x69,0x4f,0xc5,0xa3,0x66,0x52,0x91,0x8f,0xa4,0x48,0xb9,0x40,0x76,0xd9,0xcb,0x6e,0x1a,0x35,0x9e,0x50,0x9f,0xd1,0x78,0xb2,0xb8,0x0d,0xa8,0xf8,0x6e,0x07,0xa5,0x3a,0xdf,0x3c,0x32,0xa6,0x10,0xbd,0x73,0x2f,0x07,0x45,0x66,0x0f,0x61,0xce,0xc2,0x08,0x19,0x98,0x33,0x4b,0x59,0x81,0xb5,0x78,0x4f,0x46,0x88,0xae,0x29,0xf8,0xf5 +.byte 0xc2,0x29,0x6f,0x8f,0xe5,0x8f,0xb0,0x53,0xc8,0x7a,0x48,0xda,0x6f,0x7e,0x8a,0x69,0x68,0xab,0xba,0xd9,0x20,0x0f,0x96,0x69,0x41,0xa6,0x92,0x94,0x8e,0x0f,0x86,0xdf,0x8d,0x70,0xaf,0xfe,0xf1,0x20,0x50,0x01,0xff,0xca,0x30,0x24,0x67,0x4a,0x04,0xa2,0xde,0x06,0xdc,0x26,0x1e,0x17,0xbc,0x52,0x9a,0x62,0x72,0xc1,0xd8,0xd7,0xe0,0xed +.byte 0xcf,0x4b,0x13,0x80,0x9a,0xbf,0x72,0x4f,0xf4,0x24,0x26,0xcd,0xe0,0x21,0x99,0x7b,0x5c,0x4f,0xbf,0x5c,0x41,0x08,0x8b,0x17,0x69,0x62,0x60,0x2c,0x74,0xb0,0x2d,0x22,0x7e,0x25,0x95,0x6a,0x84,0x0f,0x45,0x8f,0x9a,0x92,0xa1,0xcd,0xa5,0x50,0xf0,0x52,0x7f,0x60,0xd8,0x91,0xe1,0x17,0xe1,0x66,0x8f,0xd3,0x1f,0x41,0x7f,0x6f,0xf1,0x72 +.byte 0xa3,0xb6,0x12,0x62,0x46,0x16,0xea,0x26,0x9e,0xda,0x61,0x13,0x0b,0x17,0xf7,0xe1,0xec,0xc0,0x38,0xfe,0x40,0x31,0x6b,0x38,0x2a,0x4b,0xa5,0x8e,0xfb,0x99,0x60,0xd6,0x4a,0xbd,0xfb,0x75,0x2b,0x41,0xd4,0x33,0x5d,0x35,0xfe,0x2d,0xfc,0x1a,0xac,0x02,0xb3,0xf0,0xa2,0x6d,0xfa,0x8b,0x12,0x99,0xdd,0x54,0xf2,0x1c,0x35,0xd3,0x60,0x5a +.byte 0xdb,0x65,0xa7,0x58,0x1b,0x82,0xb4,0xf6,0x49,0x77,0xf2,0xea,0xa3,0xa9,0x57,0x94,0xb7,0x6e,0x19,0xda,0x7e,0xa5,0x70,0xb8,0xff,0x39,0x81,0x7d,0xfa,0xea,0xd6,0xc6,0x12,0x84,0x0a,0x8a,0x16,0xde,0x99,0xa6,0xe7,0xe0,0x77,0x76,0xb8,0xa3,0x6f,0xfb,0xb4,0x8f,0xc3,0xbd,0x90,0xd8,0x2a,0x04,0xed,0x42,0x91,0x9b,0x84,0x40,0x2d,0x01 +.byte 0x94,0xdb,0xbb,0x58,0x25,0xed,0xa3,0xdd,0xaa,0x0c,0xce,0x25,0x12,0xcd,0x11,0xbf,0xd0,0x57,0xe9,0x51,0x74,0xa7,0x45,0x6c,0x58,0xe7,0x4d,0x43,0xc6,0xd0,0x09,0x93,0x2d,0xe0,0xe3,0xae,0x7b,0x8f,0x53,0xa0,0x80,0xa1,0xef,0xcb,0xf5,0xfe,0x38,0x4d,0x31,0xa2,0x5c,0xd3,0x4a,0x66,0x1a,0x5c,0x07,0xbe,0x25,0xba,0x30,0xb6,0x00,0x27 +.byte 0x52,0xb9,0x1f,0xa3,0xed,0xd7,0x31,0x33,0x4a,0xf6,0x3f,0xed,0x75,0xe7,0xa4,0xf4,0xdf,0x97,0xc1,0x78,0x90,0x9b,0x4b,0xbd,0x06,0xc6,0x72,0x5c,0xdf,0x57,0x60,0xbe,0xbc,0x88,0x02,0xb6,0x5a,0x65,0xea,0x3a,0x3a,0x74,0x03,0xc8,0x66,0xef,0xf0,0x63,0xc7,0x9d,0x58,0x8e,0xa1,0xb2,0x25,0x4f,0xc4,0x14,0x5f,0x80,0x78,0x08,0x06,0x21 +.byte 0x50,0x34,0x01,0x2b,0x15,0xf4,0x7d,0x1f,0x1f,0x32,0x36,0x0a,0x52,0x1f,0x50,0xa2,0x50,0xbc,0x9a,0xdf,0x4e,0x84,0x49,0x2d,0x08,0xaa,0x46,0xc0,0x0e,0xcf,0x27,0x17,0x91,0x78,0x8c,0xb9,0x72,0xc5,0x8e,0x25,0x85,0x11,0xff,0x2f,0x4a,0x71,0x7c,0x14,0xfe,0x86,0xfe,0xb4,0x3a,0xd0,0x67,0xfd,0xaa,0x9b,0xee,0x89,0x66,0x03,0x59,0x4e +.byte 0x1c,0x96,0xaf,0x2b,0x8d,0x4d,0x6f,0xf6,0x72,0xc6,0x13,0xc7,0x14,0xce,0x19,0x0c,0x0b,0xa3,0x01,0x12,0x7c,0x8e,0x10,0xb8,0x63,0x41,0x57,0xb9,0xfe,0x6e,0x3e,0xda,0x20,0xfb,0x92,0x08,0x7d,0x66,0x31,0x9d,0x4f,0xdb,0x14,0xf4,0xb6,0xb8,0xea,0xee,0x54,0x0f,0xaf,0xc1,0x99,0xf0,0x8f,0x55,0x44,0x20,0x44,0xd0,0xa6,0x98,0xa3,0xa8 +.byte 0x8b,0x8e,0x26,0x03,0xec,0x2d,0x50,0x4f,0xb0,0x8d,0xd0,0xf2,0x96,0xcc,0x18,0xa9,0xb1,0x0f,0x79,0xe3,0x9f,0x08,0xb3,0x53,0x0b,0x9c,0x9f,0x22,0xdb,0x45,0x57,0xd6,0xaa,0x3b,0x6a,0xcb,0xdc,0xc9,0xda,0x57,0x75,0x65,0x0a,0xc1,0x17,0xb3,0x97,0xa9,0x07,0x40,0x20,0xfb,0x72,0x2d,0xc6,0x37,0x1e,0x44,0xb7,0x7e,0x0b,0x38,0xcc,0xfc +.byte 0xa0,0xed,0x48,0xa9,0x9b,0x87,0xbc,0x71,0x0f,0x8b,0xda,0x4f,0x09,0x27,0x1e,0x3d,0x9c,0x03,0x62,0x81,0xa8,0x7c,0x7b,0x8a,0x14,0xa7,0x22,0x69,0xa8,0xba,0x0e,0xcc,0x1f,0x2b,0xb3,0x0f,0x7d,0xce,0x3f,0xec,0xb5,0x9d,0xe0,0x3a,0x67,0x56,0x08,0x5d,0x03,0x8b,0x71,0x01,0x44,0x11,0x1b,0x7b,0xcf,0xcc,0x2e,0xfc,0xa5,0x52,0x9b,0xeb +.byte 0x1e,0x8a,0xa1,0x86,0x64,0xcf,0x32,0x03,0x6b,0x3e,0x29,0xe7,0x9a,0x16,0x7e,0xe2,0x21,0x2f,0x5f,0xe2,0x86,0x7f,0xf8,0x22,0x36,0x10,0x99,0xc8,0x27,0x43,0xa1,0xb9,0xf4,0xb4,0xb8,0xe1,0xa3,0x1d,0x80,0x9c,0x81,0x92,0xef,0x1f,0x28,0x54,0x51,0xf3,0x62,0x9c,0x7a,0x24,0xd4,0x5a,0xdc,0x38,0x4f,0xa5,0x57,0xdd,0x4d,0xa1,0x52,0xf3 +.byte 0xd3,0x9d,0xa1,0x93,0x5e,0xbe,0x9b,0xd1,0x2a,0x52,0xf1,0xbb,0xa5,0x3f,0x3a,0x94,0x7c,0x7d,0x41,0x61,0x36,0x14,0x25,0x5f,0xab,0xef,0x32,0xf3,0x0f,0x6c,0xc5,0xf5,0x5f,0xe5,0x88,0x51,0x17,0x60,0x8b,0xd5,0xa6,0xea,0x8b,0x21,0xec,0x1a,0xa7,0x69,0xa0,0x59,0xf9,0xeb,0x51,0x94,0x70,0x2b,0x96,0x2e,0x71,0xa9,0x8c,0x12,0x15,0xce +.byte 0x7d,0x59,0x6b,0xf2,0xca,0x2c,0xbd,0x85,0xfb,0x23,0xab,0xcb,0x89,0x89,0xda,0x28,0x49,0x7e,0xfc,0x90,0x2a,0x9a,0x3d,0x6d,0x24,0x57,0xba,0xd9,0x30,0xe0,0x10,0x04,0xb1,0x7f,0x8a,0xcf,0xc8,0x27,0x63,0xd6,0xbd,0xea,0xef,0x90,0x6f,0xc2,0xfc,0x78,0xfd,0xc4,0x5b,0x45,0x0c,0x41,0x8a,0x53,0x5b,0xbc,0x62,0x32,0x86,0x7f,0x19,0xb7 +.byte 0x8b,0x03,0x50,0xed,0xca,0x8e,0x8b,0xa0,0xe3,0xc2,0x0e,0x81,0xe5,0x8a,0xe8,0xf1,0x6a,0x0b,0x1a,0xa7,0xb6,0xed,0x74,0x23,0x34,0xad,0x5b,0xd8,0xf7,0x17,0x8d,0xa5,0x05,0xf3,0x00,0x4a,0xad,0x7e,0x91,0xc9,0x6b,0x13,0xff,0x76,0x78,0xf0,0xd1,0xf4,0x99,0x43,0x73,0xd9,0xba,0x59,0xbe,0xb5,0xa3,0xbd,0x5e,0xc5,0xd3,0x88,0x06,0x9c +.byte 0x86,0x32,0xb4,0xd5,0x30,0x77,0x78,0x8e,0xd5,0x6a,0x1d,0xeb,0xfd,0x6b,0xe6,0xf8,0x4b,0xe8,0xf3,0xba,0xbb,0x86,0x8e,0xe6,0x63,0x83,0x92,0x23,0x05,0x58,0x2e,0x61,0xdd,0x38,0xad,0x8d,0x19,0x7d,0xfa,0x7c,0x3e,0xc8,0x9f,0xae,0xea,0x6d,0x12,0xf0,0xa4,0x08,0xed,0x12,0x0c,0x97,0x87,0x58,0xd8,0xbc,0x3f,0xde,0x7c,0xee,0x0c,0xc0 +.byte 0xa2,0x2e,0xf0,0x25,0x6d,0xf3,0x30,0x23,0xa7,0xc2,0xc8,0x09,0x67,0x01,0xe1,0x25,0x26,0x46,0x38,0xf5,0x5e,0x55,0x8b,0xd6,0x43,0x6a,0xb8,0xe4,0xdf,0x0f,0x5d,0x6c,0xc3,0xb2,0x56,0x38,0xda,0xbc,0xbf,0x5e,0x85,0x8c,0xd5,0x2a,0x6a,0xe2,0xff,0x4f,0x36,0xf7,0x52,0x2c,0xe2,0xae,0x65,0x65,0xd1,0xfc,0xd3,0xc6,0xf7,0x26,0xa6,0xd0 +.byte 0x0b,0xc8,0xf0,0x68,0x5d,0x07,0x89,0x06,0xb3,0xfb,0x39,0x1d,0xd8,0xd8,0xd7,0x53,0xd0,0xc9,0x76,0x56,0xc0,0xd3,0xf5,0x66,0x80,0x5b,0xff,0x4a,0xdf,0xae,0x52,0x86,0x54,0x24,0x53,0xcf,0xcf,0xd2,0x89,0xde,0x71,0x62,0x9c,0x31,0xa5,0x3d,0x62,0x07,0xa1,0x33,0x49,0xbb,0x06,0x88,0xd8,0xa1,0xdd,0x0e,0x47,0x8d,0x72,0x00,0x2d,0x51 +.byte 0xa3,0x35,0x6e,0xb6,0x1f,0xbf,0xe5,0x42,0x68,0x6f,0x62,0xfa,0xf3,0x12,0xa9,0x1a,0xbd,0xe8,0xa4,0xf1,0x6d,0x07,0xe7,0x70,0x87,0x44,0xb7,0x3d,0xea,0xdc,0x3a,0x24,0xbd,0xa0,0x9b,0xb8,0xc5,0xa8,0xd9,0x06,0xde,0x02,0x68,0x7e,0xd5,0x2d,0x3b,0x5f,0x12,0x31,0x72,0x35,0x77,0xf6,0x10,0x6e,0x81,0x7d,0x3c,0xac,0x95,0x5b,0xbe,0x90 +.byte 0x74,0xf3,0x3e,0x9b,0x07,0x54,0x97,0xe3,0x1d,0xcf,0xe2,0xc5,0x80,0x6b,0x5f,0x0b,0x96,0x00,0x0f,0x0e,0x53,0x36,0x76,0x6e,0x99,0x0c,0x32,0xa2,0xc9,0xaa,0xa0,0xa1,0xb7,0xee,0x9d,0xd6,0x46,0xe7,0x2d,0x10,0x7a,0xf2,0x22,0x50,0x52,0xbf,0xec,0xcc,0xbc,0x0d,0x81,0x55,0x2d,0xac,0x2e,0xf7,0x99,0xbe,0x68,0x09,0xb0,0x11,0xc3,0xc8 +.byte 0xca,0x63,0xa7,0xc2,0x0f,0x37,0x2a,0x9e,0x85,0x79,0x6b,0x44,0xc1,0x4f,0xb9,0xd6,0x6c,0x56,0x0e,0x59,0x33,0xc3,0x00,0x53,0xe2,0xf4,0x30,0x90,0x4e,0x4b,0x09,0x4d,0x6f,0x9a,0x9e,0xb9,0x8d,0x0b,0xa1,0x80,0xfd,0xfb,0xde,0x74,0x49,0x53,0x04,0x3a,0x35,0xcb,0x45,0xe2,0x67,0x2c,0x4d,0x6e,0x39,0x7b,0xbd,0x68,0xaa,0x93,0x1e,0xee +.byte 0x1e,0x35,0xae,0x1e,0xf2,0xe7,0xb1,0x80,0x92,0x45,0x27,0x85,0xd0,0xc7,0x26,0x17,0x54,0x30,0xba,0x0c,0x8e,0x48,0xf3,0x08,0x51,0xa6,0x41,0x70,0xba,0x5b,0x90,0x69,0x7c,0x64,0x1d,0x61,0xb5,0x23,0x4a,0xef,0x97,0xe4,0x9a,0xd0,0xff,0x47,0x7a,0x93,0x1a,0x28,0xb3,0x8a,0x32,0x29,0xf8,0xe9,0x08,0xc3,0xf3,0x24,0xd7,0x2e,0x18,0x6d +.byte 0x99,0x40,0x77,0x43,0x9f,0x98,0xe4,0xe5,0x3a,0x34,0x9d,0x46,0x52,0x9f,0x84,0x79,0x8c,0x70,0xbc,0x88,0x30,0xaf,0x87,0x69,0x57,0x6e,0xde,0x2e,0xfe,0x0f,0x3b,0x8d,0xc8,0x95,0xcf,0x69,0x78,0xff,0xa1,0xb1,0x81,0x49,0x1e,0x45,0xc0,0x83,0x1b,0xa3,0x5a,0xee,0x3e,0x9a,0x15,0x7c,0xf0,0xa2,0xfd,0x04,0x22,0x55,0x2d,0x74,0x61,0x29 +.byte 0x0e,0x4f,0x31,0xdb,0x35,0x99,0x37,0xb7,0x7d,0x11,0xde,0x87,0x4f,0x84,0xeb,0x6c,0x14,0xcc,0xbb,0x71,0x47,0xab,0x5b,0x61,0x51,0xeb,0xa1,0xc1,0x5f,0xe4,0x5c,0x3c,0xab,0x04,0xf1,0x60,0x50,0xe1,0xd0,0x58,0xdf,0x42,0xed,0x73,0x5f,0x31,0xdf,0x8d,0xb8,0xb8,0xdc,0x4e,0x2f,0xe3,0x7f,0x89,0x9e,0x62,0xc9,0xef,0xfd,0x60,0xae,0x58 +.byte 0xa9,0xa5,0x8b,0xa8,0x3b,0xd8,0x5f,0xd4,0x09,0xff,0x61,0x8c,0x25,0xde,0x84,0x7f,0x35,0xc9,0x5c,0x2b,0xe8,0x46,0xe4,0x1c,0xbd,0x77,0x51,0x31,0x55,0x3d,0xb4,0x35,0xf3,0xdc,0xa5,0x55,0xd3,0xe3,0x24,0xf9,0x41,0xe2,0xf0,0xbd,0xf5,0xff,0x81,0x87,0x64,0xc9,0xe7,0x69,0x29,0x86,0xaf,0x98,0x33,0x33,0x62,0x9c,0x7b,0x16,0xbb,0xfe +.byte 0x0b,0xa7,0x92,0xa5,0x7b,0x81,0xbc,0x50,0x88,0xf6,0xe7,0xfc,0x73,0xd6,0x37,0x43,0x09,0xa5,0xc6,0xd6,0x4d,0x28,0xb5,0xaa,0x53,0x52,0x8c,0x2c,0x06,0x64,0x6c,0x21,0x6b,0xe7,0x67,0x4a,0xa5,0xcc,0xa1,0x32,0xf0,0xd9,0x78,0xb9,0xc3,0xdb,0x41,0xee,0x10,0x11,0x81,0x04,0x03,0x73,0x48,0xc6,0x3e,0x60,0x6d,0x82,0xef,0xe2,0xa8,0xe8 +.byte 0xd7,0xda,0xd9,0xb5,0x34,0x42,0xc8,0x1c,0xa7,0xa4,0x8e,0x88,0x2e,0xbc,0x96,0x0a,0xfc,0x40,0x36,0x80,0xdf,0x60,0xe9,0x03,0x02,0x0c,0x51,0xf7,0x7d,0x01,0xd2,0x21,0x38,0x44,0x4b,0x34,0x80,0xbf,0x5e,0xc1,0x86,0xf2,0x35,0xeb,0xa8,0x21,0x15,0x74,0x7c,0x99,0x55,0x64,0xf4,0x48,0xd6,0xd1,0x47,0x1f,0x4d,0xbf,0x0c,0x20,0x5d,0x86 +.byte 0xb9,0xab,0x4e,0xc8,0x86,0x08,0x71,0x1d,0x13,0xf6,0xd3,0x17,0xac,0x61,0x10,0x5d,0x2a,0xb4,0x48,0xa1,0xb9,0x79,0x5a,0x09,0x3a,0x65,0x4c,0xbd,0x97,0xbe,0x48,0xc6,0x66,0xd8,0xce,0x0c,0x19,0xb5,0x44,0x02,0xfa,0xb7,0xa8,0x3f,0x9b,0x86,0xec,0xd1,0xef,0x1d,0x7d,0xb3,0x82,0x5c,0x92,0x48,0x02,0x2c,0x56,0x0f,0xff,0xf7,0x19,0x74 +.byte 0xc2,0x38,0x24,0x8d,0xb2,0x87,0xb6,0xeb,0x49,0x50,0x6a,0x33,0x74,0x4e,0x2a,0xcb,0xf4,0x13,0x2c,0xfa,0x3b,0x0e,0x3d,0x98,0x3e,0x33,0xd9,0x55,0xfa,0xb9,0x74,0xb8,0x6f,0xc1,0xd8,0xfd,0x8f,0xff,0xb9,0x1a,0x17,0xf8,0xb6,0x21,0xc4,0x9d,0x47,0x5e,0x84,0xf6,0xe5,0xbf,0x93,0x98,0xac,0x8f,0x68,0x85,0xf8,0xe8,0x79,0x7f,0x6f,0x0d +.byte 0x62,0x2c,0xaa,0x1e,0xe4,0xab,0x73,0xf8,0x6f,0x02,0xda,0x6b,0x3c,0x14,0x2e,0xc9,0xdb,0xb0,0x4e,0x39,0xb5,0xcf,0x05,0xae,0x9c,0x63,0x2f,0x6a,0x25,0x61,0x9d,0x40,0xeb,0x7e,0xd8,0x97,0x97,0x33,0x67,0x5c,0x78,0x84,0x68,0xc2,0x7a,0x26,0x58,0xe3,0x6c,0x0a,0x2e,0x6a,0x82,0xd6,0x43,0xed,0x79,0xa5,0x8d,0x4e,0x7c,0xf7,0x80,0x01 +.byte 0xe7,0x02,0x5e,0x3a,0xf7,0x8a,0x4a,0x85,0xe9,0x98,0x1e,0x69,0x33,0xf3,0x54,0x96,0x79,0xc8,0x03,0x0a,0x9f,0x0c,0x5d,0x66,0x44,0x88,0x3c,0xd7,0x9e,0xd1,0xde,0x01,0xfd,0x5e,0xa5,0x6a,0x82,0x00,0x36,0xe6,0x12,0xe3,0x62,0x46,0x45,0x69,0xfb,0x4f,0x44,0x8e,0xe5,0x8d,0x21,0x57,0x6a,0x61,0x8e,0x56,0xcb,0x5b,0x2c,0x5f,0x65,0x41 +.byte 0x2c,0xad,0xf2,0x98,0x34,0xbb,0x06,0x0d,0x8a,0x3c,0x34,0x0d,0xa3,0xe2,0x6e,0x86,0xfa,0xa9,0xfb,0x6f,0xbb,0x32,0xd6,0x0d,0x76,0x6b,0x77,0xf3,0x83,0x41,0xc0,0x80,0x63,0x55,0x47,0xb8,0x13,0x6b,0x99,0x96,0x08,0x9b,0xc0,0x82,0xae,0x49,0x4a,0x51,0x63,0x74,0xf2,0xec,0xfa,0x0d,0xbc,0x3a,0xde,0xf5,0x4b,0x4f,0x08,0x41,0x23,0x88 +.byte 0x14,0x88,0x6a,0x3a,0xf0,0x5f,0x0c,0x45,0x7f,0x65,0x7a,0x67,0xd8,0x17,0xed,0x04,0x47,0x60,0x0e,0x74,0x8f,0xfd,0x48,0xda,0xcd,0xe9,0xfe,0xf5,0x6f,0x43,0xcd,0xa5,0x05,0xa2,0x2e,0x78,0x5b,0xff,0xb8,0x6f,0x2e,0xfd,0x3e,0x4b,0xef,0xcf,0xe0,0x06,0x57,0x28,0xf4,0x2e,0x3b,0xb5,0x9e,0x3c,0xbd,0x63,0xa6,0x78,0x8e,0xd5,0xb8,0x81 +.byte 0x4e,0xf0,0xbf,0x14,0x65,0xc8,0x00,0x9f,0x0e,0x25,0x6a,0x7a,0x63,0x58,0xe4,0xe7,0xa9,0x82,0x16,0xc9,0x86,0x20,0x94,0x71,0x5b,0x9f,0x9b,0xc3,0xc5,0x32,0xb0,0x6c,0x2b,0x8c,0x54,0x67,0x36,0x94,0xb1,0x47,0x33,0xfd,0x9f,0x7c,0x7f,0x7e,0x08,0x51,0x1f,0x7e,0xbf,0x09,0x57,0xf3,0xaa,0x77,0x94,0xf3,0x20,0x1b,0x95,0xf6,0x04,0xb2 +.byte 0x09,0x9d,0xe2,0xbb,0x4d,0xfe,0x6b,0x99,0x06,0x58,0x40,0x84,0x90,0xfa,0x0e,0x9b,0x58,0x6d,0x02,0xbe,0x53,0x73,0xd1,0xc9,0xc7,0x31,0x2a,0x4a,0x12,0x2c,0xb6,0x1c,0xfb,0x49,0xc6,0x1a,0x93,0x33,0x1f,0x29,0x8b,0x94,0xe9,0x20,0xa7,0xe6,0x20,0xe6,0xbf,0xcd,0x5c,0xb6,0x52,0x42,0xf0,0x9c,0x6c,0x21,0x61,0x10,0xe7,0x0e,0x9f,0x33 +.byte 0x5f,0xc8,0xd0,0x20,0xe0,0x3e,0xc5,0x7a,0x10,0xf1,0xe5,0x19,0x52,0xcd,0xe1,0xa8,0x62,0x43,0x20,0x79,0xc3,0xac,0x93,0x27,0x02,0x8e,0x21,0x06,0xb9,0x66,0xd9,0xc8,0x40,0xe0,0xd1,0xf0,0x64,0x81,0xa6,0xc4,0x87,0x85,0x2b,0x92,0x1c,0xd6,0x48,0x85,0xb1,0xbe,0x78,0xf3,0x89,0xa2,0xf0,0xe5,0x39,0xac,0xbf,0x59,0x5d,0xf8,0x4f,0x74 +.byte 0x44,0x85,0x98,0x03,0x81,0x4b,0x7e,0x6f,0x5c,0xa1,0x11,0xd2,0xfd,0x30,0x7f,0xcd,0xd0,0xe2,0xcc,0xd4,0x80,0x16,0x46,0xa6,0x64,0x8b,0x9e,0xfc,0x2a,0x1a,0x65,0x5c,0x90,0x82,0xf9,0x23,0x48,0x11,0xf6,0xf2,0x50,0x3f,0xed,0x44,0xf2,0x9a,0x5a,0xca,0x1c,0x9a,0xd2,0x71,0x1b,0xd6,0x4c,0x51,0xf6,0x89,0x6f,0x65,0xe4,0x97,0x41,0x47 +.byte 0x1b,0x86,0xbd,0x83,0xa0,0xfe,0xac,0x16,0xe8,0xab,0x28,0x96,0x2f,0xa2,0x12,0x5f,0x7c,0xb3,0x18,0x2b,0x05,0x51,0x49,0xba,0xb4,0x1f,0x1e,0xe6,0x8a,0x82,0xca,0x33,0x7d,0xe6,0x8c,0x95,0xba,0x08,0x60,0x47,0x6d,0x79,0xac,0x0f,0xba,0x46,0xff,0xed,0xe0,0x34,0x03,0xfe,0xa7,0x85,0xe5,0x61,0xe3,0xe4,0x6c,0x5c,0x1b,0x9d,0x8a,0x54 +.byte 0x17,0xaf,0x08,0x4c,0x44,0x7f,0xb7,0xb0,0x6a,0x3a,0xff,0xb7,0xf6,0x10,0xc4,0x8f,0x31,0xd6,0x1a,0x25,0x27,0x35,0xca,0x87,0xa9,0x61,0x0b,0x35,0x96,0x89,0x0f,0x1a,0xbd,0x1e,0xf6,0xee,0xaa,0x95,0x16,0xe4,0x38,0x7b,0xb2,0xbe,0xea,0xc9,0x5a,0xcd,0x3b,0xb8,0x9e,0xd7,0x20,0xcd,0x3f,0x90,0xaa,0x8b,0x2a,0x42,0xed,0xab,0xc1,0x53 +.byte 0x83,0xc7,0xb8,0x3f,0xa1,0xb9,0xf4,0xf4,0xb0,0xe0,0x1f,0xb0,0xeb,0xa9,0x81,0x9f,0x31,0x67,0x1e,0x6c,0x96,0x9f,0x09,0xea,0x04,0xfe,0x37,0x22,0x87,0x60,0xb9,0x91,0x8f,0xa9,0x11,0xa3,0x68,0x5e,0x29,0x21,0x41,0xa3,0x02,0x08,0x82,0xd0,0x2b,0x66,0x6d,0x3c,0x46,0xc7,0x23,0x09,0x86,0x7f,0x53,0x11,0x3e,0x83,0x52,0x0a,0x4a,0xe4 +.byte 0x93,0xc6,0xc1,0x96,0x17,0x94,0x51,0x17,0x69,0xea,0x72,0xb8,0x85,0xde,0x7e,0x13,0x4a,0x08,0x26,0xae,0x31,0x19,0x0f,0x6f,0x48,0xa1,0xf2,0x57,0xa2,0x01,0x8e,0x84,0xee,0x63,0x23,0xc0,0x97,0x84,0xa2,0xf5,0x3f,0xeb,0x30,0x9e,0xdd,0xd2,0x43,0x24,0xa2,0x57,0xb7,0x57,0x86,0x26,0xa3,0xe6,0x6e,0xf2,0xcd,0xfb,0x7b,0x34,0x74,0x53 +.byte 0x07,0x95,0x51,0xb7,0xfd,0xf3,0xd1,0x83,0xbd,0x25,0xd6,0x2c,0x69,0x73,0x02,0x8e,0x76,0x19,0xea,0xb0,0x83,0x60,0x8c,0x53,0x9d,0x77,0x86,0x1e,0x65,0xc7,0x57,0x31,0x29,0xd9,0xa9,0x3a,0xb2,0x0d,0xd8,0xf4,0xf9,0x48,0x49,0xfb,0x3c,0x40,0x3d,0x1b,0xc4,0x8b,0x94,0x0e,0x50,0x7f,0xd5,0x39,0x5e,0x57,0x86,0xd1,0xba,0x0c,0x38,0x10 +.byte 0x01,0x5f,0x44,0xf3,0xe5,0xb0,0xf8,0xae,0x17,0xdf,0xd2,0xb3,0x10,0xc5,0x3b,0xfd,0xd9,0x68,0x90,0x9c,0x6c,0x26,0xdf,0x12,0x50,0xfa,0xbf,0x8b,0xce,0x68,0x80,0x8c,0x04,0x60,0xbf,0x34,0x81,0xbd,0x29,0xa3,0xa2,0xe4,0xe0,0x2d,0x25,0xb2,0xff,0x9f,0xd1,0x20,0x07,0xd5,0x8c,0x19,0xfa,0x3f,0x47,0xec,0xc1,0x8d,0xc9,0x36,0xf8,0x51 +.byte 0x4c,0xaa,0x40,0xe3,0x6a,0x21,0xd5,0xe6,0xa6,0xcf,0x8c,0xd9,0x10,0x47,0x66,0xfd,0x32,0x48,0x36,0x8f,0x14,0xed,0x09,0x80,0x50,0x27,0xaa,0xd5,0x1f,0x69,0xb8,0xe4,0x96,0x27,0x56,0x78,0xd6,0xd5,0x2d,0xf0,0x4f,0x14,0x30,0x17,0x9e,0x5b,0x69,0x8c,0x7c,0x1c,0x97,0x38,0x65,0x77,0x75,0x49,0xac,0x4b,0x06,0xda,0x74,0x11,0x86,0xbc +.byte 0xad,0x01,0xf2,0x03,0x29,0x5d,0xa7,0x74,0xd3,0x44,0xae,0x1d,0xbf,0xf9,0xc5,0x5b,0x83,0x8c,0xd6,0x84,0x8a,0x8e,0xe9,0xa6,0x08,0xf4,0x88,0x13,0xcb,0x16,0x45,0x13,0x9c,0xc7,0x75,0xa9,0xa7,0x55,0x04,0x91,0xd6,0xe9,0xd4,0xe5,0x65,0xa0,0x3a,0x53,0xa0,0xfc,0x62,0xce,0x91,0x01,0xb4,0x06,0x8b,0x10,0x79,0x6f,0x2c,0xd6,0x0a,0xa2 +.byte 0x31,0x8f,0x75,0x32,0x0e,0xfa,0x0d,0xec,0xfd,0x71,0x7f,0x74,0x97,0x30,0xe9,0xee,0x9f,0x04,0x21,0xb5,0xc9,0xd1,0x52,0x2a,0x0f,0x18,0xbe,0x3e,0xbb,0x98,0xaf,0x59,0x9b,0x85,0x79,0x5e,0x52,0x93,0x1c,0x42,0x67,0x67,0x6b,0xd5,0x41,0xaf,0xba,0x09,0x3a,0xb4,0x0e,0x97,0x22,0xe6,0xbb,0xe1,0x27,0xa1,0xf9,0xf0,0xcd,0xa2,0x3d,0xdb +.byte 0x81,0x2f,0x65,0x90,0xb7,0xe5,0xe5,0xce,0x1d,0x3b,0xfe,0x34,0x57,0xcd,0x3a,0xbd,0x19,0x59,0x23,0x12,0xf1,0xb6,0xf2,0xf7,0xc1,0xf5,0x1d,0x0b,0x46,0x8f,0x16,0x6a,0x81,0xfe,0xc1,0x97,0x8d,0x69,0x55,0x60,0xdd,0xf0,0x61,0xe9,0x22,0x30,0x72,0x1a,0x24,0x30,0xd7,0xbc,0x1c,0xfa,0x02,0x55,0xfc,0xb9,0x4b,0x0a,0xe4,0x90,0x90,0x3a +.byte 0xe3,0xce,0xd4,0xa0,0x7d,0x21,0x5a,0xf7,0x79,0x6e,0x03,0x4f,0x4e,0x93,0xad,0xc4,0x8e,0x9d,0x9f,0x8a,0x39,0x59,0x20,0xc1,0x5d,0x6a,0x4d,0x8f,0x69,0x78,0xea,0xba,0xde,0xc0,0x87,0xb2,0xf2,0x20,0xd6,0x7a,0x9c,0xf9,0x09,0x03,0x2a,0x4d,0xb9,0x10,0xfc,0xe5,0x05,0x90,0xed,0x45,0x4f,0x5f,0x7c,0x5d,0xfa,0xe6,0x0d,0x07,0xae,0xcc +.byte 0x21,0xc8,0x1c,0x7a,0xfb,0x1d,0xb9,0xe3,0x69,0xa1,0xb7,0x5f,0xb5,0x6a,0xb9,0x58,0x9d,0xcd,0x99,0xf8,0x38,0xbb,0xa0,0xfe,0xf8,0x41,0x51,0x72,0xce,0x76,0x89,0x59,0xa2,0xab,0xef,0xea,0xab,0x79,0xbc,0xda,0x73,0xdb,0x18,0xda,0x60,0x1b,0xc4,0xb7,0x4f,0xb3,0x86,0x21,0x2a,0xc3,0xec,0x7f,0x0e,0x89,0x16,0x0e,0xd2,0xbd,0xea,0x0e +.byte 0xcf,0xc1,0x4b,0x2c,0x97,0x69,0xce,0xd3,0x94,0xad,0x81,0xe9,0x70,0xf4,0xf8,0xe5,0x77,0xe6,0x92,0xe0,0x23,0x38,0xd3,0xc1,0xdd,0x2e,0x58,0x77,0xc5,0xc3,0x29,0x34,0x66,0x48,0xf9,0x75,0x3c,0x8a,0x6a,0xb8,0xbf,0xf8,0xba,0xf0,0xb9,0xa1,0x81,0x0b,0xa1,0xaa,0x17,0x34,0x1a,0xbb,0xa3,0xa2,0xba,0x21,0x45,0xc0,0x1d,0x57,0x11,0x4d +.byte 0x9b,0xd4,0x64,0x84,0xd7,0x0b,0xd6,0xfb,0x72,0x2c,0xdb,0xc3,0xe6,0x24,0xa9,0xf3,0x30,0x9f,0x21,0x05,0x1e,0xcc,0x48,0x58,0xed,0xfd,0xb2,0x34,0xe3,0xf7,0x7e,0x56,0xee,0xdf,0xa4,0xbb,0xb1,0xcc,0x7f,0x81,0x40,0xe9,0xdf,0x3f,0x82,0xc4,0x0d,0x14,0x9b,0x3b,0x80,0x15,0x24,0x6e,0xa4,0xce,0xfa,0x28,0xa7,0x7f,0x89,0xfb,0xc6,0x83 +.byte 0xe8,0x2a,0x70,0xfb,0x9c,0x75,0xb8,0xfd,0xec,0xbc,0xbb,0xf5,0xef,0x0a,0xa5,0x77,0x0b,0x38,0xa0,0x63,0xa5,0x71,0x12,0xc9,0xaa,0xc3,0xf9,0x72,0x30,0x45,0x4e,0x19,0x44,0x2d,0x09,0xf4,0xf1,0xa8,0xe8,0xde,0x58,0x87,0x70,0xa8,0x91,0x86,0xef,0x5d,0x02,0x90,0x55,0x63,0x99,0xde,0xd7,0xb7,0x5f,0x07,0x01,0xdf,0xb1,0xe5,0x55,0xf5 +.byte 0x87,0x69,0xd2,0x7a,0x71,0xbc,0x0e,0x4b,0x8b,0x98,0xf7,0xf6,0x0a,0x01,0xbb,0x9f,0x1b,0x15,0xb6,0x76,0xe0,0xc0,0x4b,0x5d,0x08,0xba,0xba,0x73,0x3f,0x36,0x5a,0x29,0xd7,0x7c,0xc2,0x87,0x03,0x75,0xff,0x26,0x21,0xae,0xbe,0x66,0x70,0xa2,0x99,0x11,0x35,0x49,0x78,0x7b,0x3a,0xfe,0x94,0xf7,0x37,0xe0,0x69,0x56,0x39,0xf7,0x3f,0x71 +.byte 0x39,0x74,0x75,0x32,0x1f,0xfb,0x3a,0x87,0x07,0xab,0xf1,0xed,0xe3,0xe2,0xbf,0x3f,0xb1,0x73,0x11,0xc9,0x34,0x4b,0xb1,0x1e,0x62,0x4e,0xc1,0x8a,0xae,0xcc,0xc7,0xb3,0xa7,0x70,0x01,0x73,0xad,0xb3,0xc3,0x59,0x70,0x14,0x31,0x94,0x9f,0x6b,0x18,0x11,0x50,0x52,0xc9,0xf0,0xf8,0x12,0x9d,0x7c,0x90,0x64,0x9d,0xd9,0x41,0xa6,0x45,0xe3 +.byte 0xc9,0x25,0x73,0xe7,0x48,0x9d,0xdc,0xe0,0x2c,0x71,0xd3,0x68,0xc5,0xab,0xac,0xe3,0x16,0x95,0xe3,0xa5,0xae,0x2f,0x57,0x60,0x4b,0x11,0x90,0xaa,0xe7,0x48,0xca,0xc7,0xde,0x2e,0x56,0x10,0x8e,0xc3,0x0a,0x7d,0x66,0xf1,0xc3,0xf7,0x2d,0xdd,0xfa,0x5e,0xb2,0xcb,0x99,0x4d,0xaa,0x4e,0x91,0xc1,0x94,0x60,0x27,0x33,0x82,0xa6,0x2a,0xba +.byte 0x05,0x32,0x33,0x0a,0x30,0x47,0xb0,0xac,0x68,0x7d,0xef,0x25,0x09,0xcf,0x51,0xf4,0x06,0x28,0x14,0xb2,0xb4,0x1f,0xaf,0x37,0xdc,0x70,0x88,0x4d,0xb9,0xfc,0x2d,0x61,0x25,0x13,0x1f,0x32,0x48,0x6d,0xeb,0x46,0x05,0x66,0x44,0xa1,0xec,0xce,0xe9,0x51,0xa9,0xba,0xf8,0xde,0x95,0x1b,0x20,0xe1,0x21,0x75,0x4b,0x25,0x7f,0x3c,0x16,0xf7 +.byte 0xe2,0xbe,0xeb,0xca,0x2b,0x77,0x92,0x16,0x32,0xe2,0x74,0x21,0x52,0x3f,0x08,0xba,0x41,0xb0,0xd3,0xd2,0xf7,0xf3,0x29,0xb6,0x10,0xfa,0xa5,0x29,0x35,0x29,0x21,0x0d,0xec,0xba,0x5a,0xf3,0x63,0x0f,0x9d,0xbc,0x42,0x02,0x46,0xe9,0x07,0x4a,0x9a,0xe8,0xd3,0x78,0x92,0xa2,0xe5,0x03,0xec,0xd4,0xe2,0xc8,0x8f,0x92,0x4a,0xae,0xbc,0xd7 +.byte 0xdf,0x4b,0x07,0x22,0x47,0xbd,0xb4,0xb5,0xa0,0x7e,0xfb,0x21,0x40,0x62,0xb1,0x6c,0x07,0x00,0x64,0xf6,0xb2,0x75,0x5c,0x29,0x84,0xff,0x38,0x0c,0xc8,0x08,0x38,0x92,0xf9,0xad,0xd7,0xcc,0xc3,0x1c,0x03,0x80,0x49,0x39,0x1c,0xdb,0xae,0x60,0x87,0x8a,0x5c,0xe9,0x17,0xbd,0x2b,0x0f,0xa5,0xa1,0xf9,0x0d,0x4b,0x8c,0x4d,0x39,0xda,0x15 +.byte 0x8c,0xc4,0x69,0xaf,0x2b,0xb0,0xa1,0xfd,0xd9,0x65,0x3c,0x87,0x4b,0xf2,0x5a,0xd7,0xd8,0xb9,0xef,0x78,0x67,0x30,0x4c,0x6c,0x92,0xc5,0x1e,0x15,0xf8,0xd9,0x74,0x1b,0x54,0x0c,0x10,0x1b,0xb5,0x11,0x13,0xd6,0xb4,0xc0,0x53,0x03,0x2c,0x4b,0xee,0xac,0xf9,0x87,0x17,0x51,0x35,0xb8,0x1a,0xdc,0x16,0x61,0x5b,0xe9,0x5a,0x43,0x94,0x42 +.byte 0x8f,0x68,0xbd,0xb6,0x52,0x00,0x63,0xa3,0x52,0x6e,0x5d,0x8e,0xe9,0x4f,0xf5,0x69,0xd8,0x4f,0xf5,0x5c,0x89,0x7e,0x1c,0xb9,0xdc,0x7b,0x92,0x8a,0x2b,0xfc,0xb8,0xad,0xbb,0xff,0x61,0x2e,0xc0,0xdc,0xfb,0x2f,0x78,0x2a,0x50,0x32,0x9b,0x4c,0xfd,0x9e,0xab,0x80,0x5c,0x7d,0xc8,0x6b,0xb3,0x2d,0x0a,0xfe,0x43,0xa2,0x10,0x10,0x79,0xbc +.byte 0x8c,0xa0,0x86,0x09,0x8c,0x8b,0x28,0xf3,0x8a,0xc9,0xeb,0xcb,0xb5,0x0e,0x56,0x19,0xae,0xe0,0xa1,0x22,0x72,0xc5,0xad,0x01,0x12,0x69,0xb6,0x52,0xb8,0xdd,0x36,0x25,0x21,0xae,0x73,0x06,0xc1,0xe0,0x23,0x20,0xe1,0x8e,0xe4,0x99,0xcd,0x86,0xca,0xf5,0x93,0x0e,0x6b,0xb8,0xba,0x18,0x4a,0x36,0xed,0xd0,0x37,0xc8,0xc7,0x8a,0xb2,0x63 +.byte 0x2e,0xa4,0x22,0x76,0x6f,0xf7,0xdd,0x81,0xd6,0x6f,0xcd,0xb9,0x65,0xf0,0x95,0x77,0xae,0xca,0x54,0x62,0xce,0x5d,0x47,0x9e,0x10,0x89,0xb9,0xfa,0x72,0x0a,0xef,0x24,0x17,0x45,0xb0,0xb0,0xc7,0x51,0x85,0xa1,0xb1,0x6a,0xd2,0xea,0x48,0xe2,0x6a,0x03,0x2a,0xdf,0xa8,0x0e,0x62,0xa2,0x1e,0xe2,0xa7,0x20,0x57,0xbd,0x73,0xeb,0xef,0x86 +.byte 0xc9,0xd4,0xfa,0x96,0xfe,0xfa,0xb3,0xc6,0xbf,0x7a,0x16,0xa2,0x43,0x73,0x56,0x71,0x78,0x32,0x3b,0xc1,0xd8,0x26,0xbf,0xde,0x39,0x5d,0xbd,0x3b,0xff,0xd7,0x4f,0xa0,0x67,0xa6,0x09,0x9a,0x81,0xfd,0xec,0x34,0x73,0xcd,0x90,0x15,0x8b,0x3e,0x2d,0x6f,0x7d,0xcc,0xf5,0x20,0x15,0x07,0xa8,0x2f,0xa5,0x5b,0x2b,0x4f,0xb8,0x2f,0x14,0x6c +.byte 0x52,0x78,0xbd,0x92,0x98,0xda,0x69,0x19,0x58,0x4c,0x76,0xe4,0x20,0xb2,0x48,0xa4,0x9f,0x2f,0x4c,0x9b,0x45,0x7f,0x7d,0x1c,0x46,0xe9,0x1e,0x43,0x26,0x49,0x39,0xb6,0x42,0x3a,0x4c,0x59,0x95,0x6b,0x28,0xd5,0xbe,0xa7,0x2e,0xd0,0x0c,0x00,0xa0,0x67,0x06,0x4e,0xee,0xae,0x7f,0xc2,0xb5,0x12,0x46,0x3f,0xb4,0x35,0x16,0x2a,0xda,0xbf +.byte 0x41,0x34,0xbe,0x30,0x2a,0x0f,0x7b,0x60,0xa6,0x8b,0xcd,0xae,0x7a,0x8c,0xd6,0x97,0xab,0x06,0x1e,0x14,0x87,0x45,0xa3,0x3c,0x9c,0xc4,0xa0,0x1d,0xee,0xf0,0xca,0xb8,0xa6,0x8d,0x37,0x92,0xad,0xbc,0xe6,0x1f,0x65,0x75,0xd3,0xbc,0x72,0x66,0xe2,0xff,0xbc,0x19,0x93,0xae,0xee,0xd0,0x63,0x6d,0x97,0x6f,0x57,0xf3,0x77,0xcd,0xe3,0x57 +.byte 0x3f,0x00,0xc8,0xe1,0x63,0x83,0x15,0x84,0xc6,0x08,0xdb,0x03,0xc9,0x27,0x47,0x4c,0x17,0x12,0x40,0x6e,0xac,0x74,0x6f,0x3c,0x22,0x57,0x36,0x29,0xbb,0x6a,0xc7,0x5a,0xfe,0x60,0x1c,0x0f,0x32,0x95,0x1b,0xf2,0x3c,0xed,0x04,0x87,0x4c,0x48,0xc7,0x63,0x79,0x24,0xb3,0x12,0xbf,0x55,0x3b,0x32,0xbf,0x52,0x4e,0x1e,0xc1,0x1f,0xf2,0xfd +.byte 0xe6,0xb8,0x56,0x38,0x0e,0xd2,0x75,0x3d,0x41,0x99,0x0c,0x7a,0x12,0x3f,0xa7,0x3a,0x79,0xa0,0xd7,0x6f,0x47,0x97,0x7e,0x9e,0xf6,0xfe,0x29,0xc0,0x16,0x34,0x38,0x80,0x2f,0xde,0x65,0x79,0xc9,0xfd,0xa0,0x84,0xc3,0x39,0xbc,0x0b,0xbe,0x18,0xba,0x0d,0xe3,0x35,0x11,0xba,0x9f,0xde,0x5d,0x0c,0xae,0x8e,0x0c,0x0f,0x66,0x9c,0xe6,0xfc +.byte 0x3d,0xdb,0x46,0xf1,0x84,0x57,0x62,0xb0,0x00,0xd4,0x8c,0xaa,0x93,0xeb,0xf7,0xa7,0x8e,0x82,0xba,0x89,0x67,0xbb,0x38,0xb0,0xb6,0x13,0x0c,0x96,0x22,0x9c,0x6a,0x86,0xea,0x83,0xad,0x5f,0x7b,0x3a,0x28,0xd8,0x53,0x90,0x2d,0xab,0xc9,0xbe,0x99,0xfb,0x68,0x42,0x27,0xf6,0xe3,0x5a,0xaf,0xf3,0xd6,0xee,0xb6,0xa2,0xe0,0x32,0x3c,0x1d +.byte 0xd4,0x3c,0x2b,0x58,0xc2,0x4f,0x3d,0x20,0x39,0xdb,0x80,0x89,0x20,0x20,0x7b,0xe6,0x1d,0xd0,0xa2,0x1a,0xd4,0x88,0xc9,0xe0,0xb9,0xf6,0xb2,0xa1,0xcd,0xf2,0x67,0x60,0x44,0xd8,0xce,0x6a,0xe2,0x52,0xc3,0xf3,0x61,0xa3,0x14,0x58,0xd6,0xe5,0x43,0x4a,0x8d,0xcc,0x4f,0xf8,0x17,0xdd,0xd2,0x5d,0xd5,0x5a,0x86,0x8e,0xc4,0x74,0xdc,0x1b +.byte 0xad,0xca,0x63,0x75,0xf0,0x43,0x41,0x16,0x02,0x49,0x6a,0x3a,0xe3,0xb9,0xa9,0xdc,0xfb,0x99,0xbc,0x60,0x0d,0xdb,0xa0,0xcf,0x27,0xaa,0xd5,0xc5,0x42,0x0b,0x02,0x00,0x43,0xaf,0xb5,0x4f,0xe1,0x88,0xa1,0x9d,0xca,0xfb,0x9f,0x1f,0x08,0x9c,0x66,0x23,0xca,0x4b,0x88,0xb4,0x40,0xdc,0xd3,0xd3,0x1a,0x64,0xe3,0x9b,0x43,0xea,0x20,0x90 +.byte 0x30,0x2e,0xc4,0x75,0xc5,0x52,0xc5,0x7c,0x0e,0x35,0x56,0xf5,0x1f,0x50,0x2b,0xf6,0x28,0x93,0x6f,0xde,0x10,0xc6,0x49,0x2b,0x77,0xb1,0x6d,0xce,0xfd,0x37,0xd4,0x8d,0x11,0xed,0x88,0x1e,0xca,0x68,0x0c,0x4e,0x38,0x7f,0x0f,0xab,0x6f,0x8d,0x1c,0x7d,0xd4,0x7d,0xd8,0xa9,0x5c,0x24,0x5a,0x7d,0xf4,0x5b,0xb6,0xb7,0x28,0xc7,0x93,0xd6 +.byte 0xa9,0xe5,0xac,0x62,0x16,0x9c,0x4e,0x5c,0x24,0xa0,0x2a,0x76,0xce,0x7d,0x5c,0x4b,0xbe,0xbc,0x83,0x5c,0x9a,0xc8,0x06,0x7b,0x1e,0xac,0x98,0x67,0x17,0x32,0x94,0xda,0xd1,0x8b,0x58,0xad,0x8e,0x26,0x03,0x81,0x7c,0x48,0xd1,0x83,0x03,0xba,0x6c,0x51,0xe9,0x25,0x82,0xd2,0xb9,0x7f,0xd8,0x33,0x3f,0x77,0x29,0x45,0x41,0xa9,0x17,0x3d +.byte 0x62,0xc6,0xd2,0xfb,0xd1,0x24,0xc7,0xee,0x10,0xc0,0x64,0xc3,0x46,0xc6,0x2b,0xe8,0x9c,0xc8,0x99,0x23,0x77,0xa9,0xb5,0x12,0xc4,0x53,0xde,0xbc,0x20,0xb2,0xc4,0x12,0xdb,0xc2,0x0b,0x63,0x70,0x6a,0x41,0x31,0x65,0x48,0xa0,0xfc,0xbc,0xd6,0x3f,0x55,0x18,0x17,0x65,0x35,0x58,0xe3,0x33,0xac,0xaf,0xca,0xb2,0x51,0xc1,0xcc,0x60,0x38 +.byte 0x94,0x8f,0x13,0xb8,0xcc,0x8c,0xc4,0x12,0xea,0xd5,0x39,0xd3,0x46,0x55,0x17,0x27,0x7a,0x07,0x01,0x02,0x74,0xa6,0xe7,0xc8,0xa7,0xd0,0x76,0xc8,0x5e,0x57,0x50,0xc5,0x19,0xf1,0x95,0xa3,0x52,0x10,0xa3,0x1e,0xcd,0xb1,0x05,0x64,0xe5,0x69,0xd9,0x5e,0xfc,0x71,0xef,0xe1,0xf6,0xb3,0xa7,0xf7,0xf9,0x71,0xfd,0xbb,0x5b,0x2b,0x7a,0xd2 +.byte 0x72,0x7c,0xc7,0x73,0x89,0xf7,0xe2,0x0b,0xcd,0x05,0x4f,0x0c,0x10,0xed,0xcc,0xda,0xb6,0x81,0x19,0xe6,0x2b,0x06,0x66,0xef,0xc5,0xfd,0xd5,0xc6,0x66,0x20,0x86,0x2a,0x4f,0x05,0x49,0xf1,0x54,0x4a,0x6e,0x1d,0xcd,0xad,0x18,0xeb,0x6c,0x58,0xd6,0x75,0x3e,0x62,0x48,0xab,0xea,0x1f,0x7f,0x05,0x45,0x6e,0x75,0x2a,0x5e,0x97,0x5b,0xde +.byte 0x5a,0x99,0x42,0xc1,0x62,0xab,0xc7,0x01,0x4d,0xac,0xd6,0xdc,0xc9,0x71,0x24,0xd1,0x33,0xe2,0x4b,0x1f,0x09,0x04,0x1f,0x0d,0x42,0x45,0xcf,0x7c,0xa0,0xee,0x48,0xfd,0x8b,0x1f,0xaa,0x50,0x48,0x6d,0x8e,0x34,0x76,0x09,0x23,0x8a,0x40,0x0d,0x5d,0xc1,0x2a,0xba,0x5f,0x9c,0x86,0xfb,0x37,0xdf,0x24,0xff,0x27,0x88,0xbf,0xf6,0xa4,0xc3 +.byte 0xf0,0xd3,0x02,0xa8,0x7c,0x6d,0xc4,0xc5,0x14,0xc3,0x64,0x28,0xa8,0x05,0x33,0xc2,0xda,0x12,0xfc,0xbe,0x0d,0x8e,0xf4,0xf5,0x48,0x5a,0x8e,0x8a,0xd2,0x50,0x7c,0xc0,0xbc,0xde,0xdb,0x9a,0xf6,0xa0,0x92,0x8d,0x19,0xbc,0x5a,0xdc,0xbf,0xfb,0x13,0x8f,0x41,0x09,0xba,0xd9,0x0b,0x91,0x7a,0xdb,0x92,0x10,0xac,0xf2,0xb5,0x76,0xb5,0x7d +.byte 0x80,0x04,0xd6,0xec,0x98,0x09,0x5f,0x63,0x0d,0x58,0x00,0x8a,0x07,0x76,0xfa,0xe6,0x6e,0xdf,0xbf,0x73,0xe5,0xc9,0xe5,0x12,0x44,0x58,0xf9,0x2e,0xb1,0xe6,0x2c,0xf5,0x0d,0x94,0xa9,0x51,0x0d,0x01,0x03,0xab,0x79,0xf9,0xee,0x7e,0x10,0x4b,0xcb,0x20,0xbb,0x01,0x19,0xd6,0x12,0xd1,0xac,0x96,0xe9,0x0e,0xde,0xbf,0x7e,0x80,0xf6,0x58 +.byte 0xc9,0xec,0xaf,0xf7,0x2d,0x98,0xbc,0x2b,0xb1,0xf1,0x34,0x94,0x39,0x8e,0xbc,0x13,0x13,0x41,0x8f,0xf3,0x4e,0x4e,0x6b,0x2a,0xaa,0xea,0x70,0x5c,0xf8,0x42,0xf7,0xbc,0xfd,0xbd,0x6f,0x62,0x1b,0xcb,0xb9,0x39,0xdc,0x6a,0x47,0x81,0xaf,0xff,0x5b,0x7e,0x80,0xb9,0xbf,0xfa,0x15,0x7e,0xd1,0xc3,0xb2,0x80,0x99,0xbd,0xb9,0x30,0x8d,0xb5 +.byte 0x43,0x6b,0x7a,0x31,0xaf,0x45,0xf7,0xdd,0x21,0x8f,0x54,0xb1,0xf6,0x2d,0x7d,0x96,0x63,0x4a,0x93,0x98,0x37,0x7f,0x48,0x02,0x4b,0x0f,0x71,0xe4,0x70,0xce,0x66,0x6a,0x36,0xde,0x58,0x84,0x69,0xd6,0xbd,0x1a,0x9a,0x8b,0xc5,0xda,0x97,0xc5,0xe1,0x4e,0xec,0x9b,0x7a,0x65,0xe0,0xa5,0xdd,0x39,0x3c,0x9f,0xfd,0x45,0x17,0x4c,0x2f,0xb4 +.byte 0xb1,0xb1,0x42,0xe8,0x88,0x75,0x9f,0xb4,0xc1,0xdf,0x44,0xf9,0x4f,0x9a,0xf7,0x3d,0x35,0xc5,0x32,0xbe,0x43,0xd0,0x0d,0x71,0x4e,0x21,0xbf,0x31,0x99,0x73,0x5a,0x84,0x45,0x2e,0x00,0x8b,0x42,0x2b,0x14,0x86,0x51,0xcb,0xa0,0x98,0xa9,0x68,0x8d,0xdb,0x58,0x3d,0x73,0x9d,0xf9,0x2d,0x86,0x76,0x62,0xcb,0x93,0x29,0x48,0x92,0x38,0xfb +.byte 0xeb,0x1d,0xda,0xc3,0x10,0x1f,0x32,0x68,0xee,0xcb,0xb7,0x8a,0xcb,0xcb,0xe0,0x37,0x31,0xe8,0xad,0x7b,0x4a,0x29,0x2c,0x10,0x9e,0xdf,0x86,0xeb,0x13,0x0c,0xab,0xa4,0x30,0x36,0xf0,0xe0,0xac,0x14,0x41,0xa4,0xf4,0xf8,0x44,0x95,0xe8,0x8f,0x28,0xc2,0x35,0x0a,0x44,0x61,0xc7,0x60,0xc5,0x3b,0xc4,0x1d,0x67,0xfd,0xac,0x0b,0x2e,0x49 +.byte 0x62,0xea,0x17,0x3c,0xf5,0x4b,0xbe,0xba,0xba,0x42,0x02,0x0d,0x13,0xf1,0x15,0xff,0x2e,0x47,0x46,0xd1,0x27,0x64,0xb7,0x35,0x28,0x31,0xb5,0xde,0x1e,0xf9,0x26,0x6c,0x04,0x3c,0x0e,0x06,0x9d,0x4d,0xc7,0x1c,0x97,0x67,0x2c,0x6d,0x36,0x0d,0x4c,0x61,0x08,0xe9,0xbd,0x04,0x1d,0x8d,0xfb,0x0c,0x03,0x3d,0xb4,0x40,0xd5,0x1b,0x69,0x3b +.byte 0x68,0xcf,0x46,0x27,0xcf,0xb3,0xda,0x1e,0xdc,0x85,0x6f,0x4f,0x6b,0x09,0x9d,0xe9,0x6c,0x73,0x40,0x27,0xc9,0x8b,0x12,0x97,0xea,0x34,0xd7,0x51,0x32,0x90,0x4e,0xd7,0x91,0x41,0x3a,0xee,0xbc,0x97,0xb0,0x4a,0x39,0xdb,0xe3,0xe5,0x12,0x73,0xbf,0x5d,0x68,0xe0,0xc6,0x7c,0x6f,0x0d,0x14,0x1c,0xaa,0xde,0x29,0xb7,0xc7,0xa5,0x90,0x62 +.byte 0xe9,0xc5,0x75,0x16,0xe6,0xc0,0x9d,0xc5,0xb8,0xd6,0xfa,0xb0,0x72,0xb7,0x27,0xa6,0xa8,0x3f,0xbf,0x18,0x8b,0xaa,0x94,0xb3,0x47,0x50,0x2f,0x1c,0x49,0xab,0x46,0x38,0x7f,0x3e,0xf3,0xf1,0xb8,0xb3,0x44,0xaa,0x1f,0x76,0xb4,0x67,0xff,0xcf,0x7c,0x4b,0xa9,0xe1,0x62,0x93,0x4d,0x3e,0x96,0xdb,0x56,0xf6,0x26,0x5d,0x95,0x4c,0xfa,0x5f +.byte 0x06,0x2b,0x5c,0x33,0x2d,0xf8,0xfa,0x68,0x8a,0xed,0x28,0x2a,0x6e,0x95,0x86,0x59,0x71,0xef,0x86,0x47,0x60,0xec,0x35,0x79,0xa9,0x98,0x2d,0x6e,0x20,0x26,0x3a,0x21,0xec,0x59,0x15,0x65,0xcd,0xb9,0x91,0x19,0x6e,0x74,0x89,0x3b,0x10,0x00,0xab,0x8a,0x45,0x23,0x20,0x94,0x03,0x02,0x77,0xb7,0xcf,0x9c,0x71,0x18,0x0c,0x5b,0x40,0x62 +.byte 0x3b,0x8f,0xc9,0xf6,0x4c,0x8f,0x60,0x66,0x05,0x87,0x05,0x90,0xd4,0x08,0x76,0xd7,0xa3,0xb6,0x37,0xa8,0x83,0x05,0xb2,0x48,0xe9,0x24,0xc4,0xfb,0x79,0xa1,0xce,0xac,0x29,0x13,0x4e,0x72,0xdf,0xad,0x9e,0x5b,0xcd,0x9c,0x39,0x1d,0x3e,0x57,0x9d,0xf2,0x96,0x13,0xa4,0x79,0x4c,0x76,0x40,0x03,0xb3,0x18,0xcf,0xd7,0x45,0x2a,0x2d,0x07 +.byte 0xe5,0x2e,0xb7,0x74,0xda,0x94,0xea,0x32,0x74,0xb0,0xca,0xf4,0xd1,0x09,0x97,0x3c,0x69,0x17,0xf6,0x5b,0x13,0x7b,0xb8,0xb1,0xd9,0x0e,0x12,0x44,0x29,0xea,0x26,0xd8,0xaa,0x9d,0x26,0x87,0x0c,0x89,0x4e,0xec,0x29,0x48,0x43,0x66,0x21,0x0b,0xab,0xce,0x40,0x57,0x4c,0xa7,0xdd,0x56,0xde,0xac,0x5c,0x62,0xea,0xc4,0x54,0x4a,0xe0,0x8d +.byte 0x54,0xc8,0x65,0x44,0xcc,0x6f,0x2a,0xcd,0x0e,0xb3,0xad,0xa3,0x30,0xd1,0xb7,0x19,0x70,0x51,0xd3,0x9a,0xcf,0xe5,0x42,0x6c,0xa1,0xc1,0x0f,0xe2,0xda,0x86,0xb4,0x51,0x50,0x62,0xdc,0x51,0x3f,0xd2,0xff,0xde,0x7f,0x38,0x5a,0xff,0x2d,0x21,0x1d,0x59,0xb9,0xdd,0xde,0x83,0x13,0xb0,0x25,0xf5,0xbb,0x11,0x47,0x4a,0xaf,0x81,0x15,0xa0 +.byte 0x39,0x5b,0x30,0x17,0x2b,0xbf,0x5a,0x03,0x60,0xb6,0xbb,0x86,0x9f,0x50,0x45,0x15,0x0b,0xba,0x42,0xf4,0x3d,0x05,0x62,0xcd,0x9b,0x8c,0xcf,0x93,0x5c,0x33,0x6c,0xea,0x4b,0xd0,0x1d,0x91,0x3e,0xbf,0xa4,0x9d,0x7c,0x2c,0x87,0x9c,0x42,0x9f,0x03,0x98,0x03,0x1b,0x98,0x66,0x4f,0x8f,0x29,0x12,0xc5,0xb5,0xec,0x81,0xf8,0xb2,0x5e,0x44 +.byte 0x4f,0xb0,0x31,0xe4,0x2a,0x73,0x83,0xac,0x5a,0x3f,0xfa,0xcf,0x8b,0x7c,0xa3,0xf1,0x01,0x14,0xa1,0xca,0x60,0x8d,0x6a,0x6c,0x04,0x31,0xcc,0xba,0x12,0xe0,0x4e,0xaf,0x01,0x8d,0xf5,0x60,0x23,0x79,0x8a,0x80,0xcc,0x32,0x31,0x69,0x83,0xb6,0x83,0xaa,0xd9,0x3b,0x86,0x4a,0xd8,0x10,0x28,0x09,0x82,0x36,0xee,0x6a,0xc0,0x80,0x3f,0xfd +.byte 0xb1,0xd2,0xde,0x34,0xf9,0x4c,0x87,0x5b,0xdd,0xd0,0xb6,0x2d,0x99,0x69,0xd3,0x2c,0xb7,0x0b,0xfc,0x16,0x88,0x7b,0x80,0x21,0xbc,0x30,0x7b,0x56,0xe5,0x7b,0x41,0x43,0x4d,0xaf,0x40,0x5e,0x74,0x14,0x17,0x66,0x32,0xd6,0x81,0x53,0x94,0x35,0xf0,0x0f,0x4f,0x99,0x54,0x9a,0x38,0xc0,0x2a,0xa9,0xd3,0x53,0xdd,0x9a,0xc5,0x29,0x18,0x62 +.byte 0xf6,0x93,0xa3,0x02,0xf0,0x13,0xcb,0xcb,0xcc,0x64,0x0b,0x00,0xf4,0x43,0x03,0x26,0xe6,0x2f,0x39,0xa1,0x83,0xea,0x94,0x2f,0xde,0x61,0xbd,0xe1,0xbe,0x08,0xf8,0xd4,0x01,0x6e,0x61,0x98,0x01,0x39,0x4b,0x93,0x39,0x38,0x34,0x58,0x24,0xc1,0xf5,0x03,0x05,0x15,0x9c,0xf0,0x30,0x20,0x24,0xd4,0x7e,0x73,0xb2,0x60,0x06,0x3b,0xd3,0xb7 +.byte 0x2c,0x47,0x17,0xc4,0x79,0x4e,0x45,0x0b,0x89,0xf0,0xfc,0x42,0xa0,0x0d,0x80,0xd2,0x44,0x36,0x70,0xaa,0x9e,0x72,0x85,0xa8,0xc8,0x1d,0x35,0x28,0xc3,0x5a,0x72,0x4c,0x06,0x6d,0xf4,0xae,0x54,0x86,0x9a,0x32,0x3c,0xa5,0x06,0x63,0xc1,0x37,0xbb,0xaf,0xa6,0xae,0xce,0x94,0xea,0x9c,0x4a,0x9e,0x56,0xb1,0xc3,0x84,0x84,0xef,0x3d,0xe9 +.byte 0x24,0xf4,0xbf,0xc3,0xf6,0x45,0x74,0x4e,0xbb,0x86,0xd3,0x7f,0xab,0x19,0xe3,0x63,0x67,0x81,0xb6,0x18,0xc8,0x78,0x8e,0xf8,0x83,0x5f,0xfb,0x2e,0x49,0x97,0x2b,0x34,0xbb,0x76,0x2e,0x93,0xec,0xe9,0x7f,0x4d,0x7e,0x52,0x0c,0x92,0xbc,0x6d,0x3a,0x34,0x9b,0x5e,0x61,0x6f,0xea,0x45,0xe7,0x5c,0x34,0x6b,0xcb,0xc0,0x31,0x61,0x64,0x9d +.byte 0xad,0x7f,0x98,0xca,0xfe,0x3d,0xad,0xf7,0x21,0xf6,0x4c,0x2a,0x21,0x07,0x80,0x25,0xa2,0xea,0x26,0x85,0xc3,0xb1,0x74,0x04,0x7f,0xd1,0x1c,0x1b,0xa5,0x7e,0x96,0x45,0xfe,0x6f,0xa6,0x34,0xdf,0x94,0x1f,0x7e,0xfb,0xcf,0xfd,0x29,0xeb,0x3a,0xb0,0xfc,0xb6,0xd5,0x80,0x8b,0x37,0x71,0xfb,0x70,0x19,0x30,0xc4,0x6f,0xa0,0x5b,0xae,0x5b +.byte 0x75,0x51,0x98,0x89,0x9e,0xf0,0xf5,0x79,0xaf,0x1c,0x07,0xb6,0x5e,0xcf,0x34,0x70,0x0f,0x0b,0xbc,0x0a,0xa6,0x40,0xc7,0xf8,0xe4,0xef,0xe6,0xb7,0x94,0x6e,0x98,0x75,0x22,0x73,0x5c,0xca,0xcc,0xfb,0x09,0x2f,0x9c,0xfe,0x49,0x0f,0xd3,0x65,0xfe,0xd4,0xf0,0x9b,0xeb,0x8c,0xd7,0x8c,0xff,0x4b,0x18,0x3e,0xf3,0x9d,0x3f,0xf5,0x83,0xd6 +.byte 0x1d,0x3d,0x23,0x79,0x0f,0xae,0x17,0x62,0x33,0x07,0xc3,0xac,0x98,0x07,0x72,0x9b,0xd9,0x26,0x5c,0x1a,0x9d,0xf1,0x35,0x92,0xf9,0x38,0x17,0xf8,0xee,0x26,0xf9,0x64,0xfc,0x5e,0x8b,0x80,0xce,0xdb,0x64,0xf7,0xde,0x20,0x19,0x5c,0x26,0xf6,0x23,0xd6,0x99,0x8e,0x75,0x77,0x3d,0x17,0x0f,0xea,0x31,0x5a,0x65,0x32,0x1b,0x78,0x78,0xe4 +.byte 0xfe,0x76,0xf8,0xa7,0x81,0x34,0xf1,0x2a,0x13,0x22,0xe4,0x8a,0xe1,0x42,0x5a,0x3f,0x44,0x22,0xeb,0x7e,0xcd,0x20,0xcd,0xf7,0x44,0x1a,0x87,0xb9,0x7a,0x0e,0xf8,0xcb,0xb5,0x0a,0x1f,0x6a,0xe6,0x0b,0x70,0x59,0x38,0xa3,0x6b,0x64,0x7b,0x61,0xfe,0xbd,0xa4,0xb7,0x89,0x7a,0x28,0x70,0xfe,0x9d,0x64,0x2c,0xe9,0xc4,0xc9,0x2f,0xc8,0x3e +.byte 0xfa,0x70,0xce,0x21,0x9b,0xa8,0x10,0x6a,0x16,0xdd,0x28,0xce,0x4e,0xd4,0x6c,0x8c,0x47,0x83,0x13,0x8b,0xec,0x1c,0x76,0xdc,0x4d,0x81,0x25,0x08,0xd8,0xf9,0xde,0x66,0x1d,0xe2,0xf3,0xe7,0xdc,0x3e,0x3c,0x6b,0x98,0x25,0x55,0x88,0xe8,0xda,0x7f,0x16,0xe5,0x7d,0xad,0x8a,0x36,0x00,0xf0,0x68,0xc5,0xe4,0xfc,0xe9,0xe3,0x54,0xeb,0x4c +.byte 0xd1,0xff,0x07,0x1a,0x5c,0x5e,0xd4,0xb1,0xff,0x7d,0xfc,0x5b,0x34,0x42,0x95,0x89,0x01,0x24,0x8e,0x30,0xec,0xfe,0x67,0xf8,0xe2,0xaa,0xd5,0x6a,0x9f,0xe3,0xc3,0xa5,0x53,0x7f,0xd3,0xf4,0x98,0xa5,0x47,0x11,0xad,0xac,0xea,0xba,0x20,0x34,0x03,0x65,0x8c,0xec,0xb6,0xa3,0x2b,0xf6,0x93,0xe1,0xc8,0xad,0x34,0x30,0x8f,0x0e,0x3b,0xf6 +.byte 0x63,0xc6,0x58,0xc3,0xe8,0xa3,0x85,0xf8,0x24,0x8e,0x21,0xb9,0x36,0x7c,0xe0,0x11,0x64,0x31,0x6a,0x6a,0xa2,0xad,0xd3,0x94,0xbb,0x13,0x5b,0xb4,0xe9,0xee,0x09,0xdc,0xfe,0xb2,0xad,0xa8,0x43,0x02,0xba,0x85,0x1f,0x56,0xcb,0xb5,0x95,0x32,0xcc,0x7e,0xe0,0x00,0xde,0xfa,0x3f,0x91,0x71,0xde,0x21,0x19,0xff,0xc9,0x97,0x43,0x95,0xd8 +.byte 0x0d,0xc2,0x8a,0xde,0xcc,0x34,0x48,0xf4,0x35,0x41,0xb8,0x56,0x52,0xce,0x06,0xb3,0xcf,0xd4,0xae,0x7a,0xcb,0xe9,0xed,0x37,0xd6,0x76,0xa0,0x77,0x04,0xfb,0xb7,0x41,0x25,0x38,0xe1,0xd1,0xb5,0xde,0x21,0xe0,0x64,0xd8,0x83,0x13,0x7b,0x4b,0xb8,0xc9,0x12,0x02,0x51,0x56,0x52,0xe9,0x1c,0x49,0x48,0x83,0xd0,0x99,0x73,0x60,0x4a,0x4c +.byte 0x7d,0x8d,0x43,0xf9,0x06,0xa4,0xbb,0x0e,0xb6,0xdd,0x5f,0xc7,0x5e,0x35,0xcb,0xa0,0xc1,0x66,0x4a,0xe3,0x4a,0xa9,0xec,0xa4,0x5a,0xd7,0xd6,0xea,0xa5,0x20,0xa6,0xc3,0x1b,0xc0,0xa8,0xd1,0xf1,0x08,0x05,0xab,0x40,0x14,0x35,0xf2,0xdd,0x0f,0xc5,0xda,0xb3,0xa6,0xb1,0x07,0x36,0x17,0x5d,0xe9,0x96,0x23,0x96,0x46,0xd4,0xa7,0x71,0x64 +.byte 0x13,0x72,0x4e,0x83,0xe0,0x65,0x40,0x41,0xaf,0xb6,0x5b,0x00,0xa2,0xab,0x09,0x7f,0xa5,0xd5,0xc2,0xd9,0xc0,0x68,0x2a,0x44,0xdc,0x43,0x37,0x81,0xb8,0x88,0x4c,0x85,0x1b,0xb1,0x83,0xb2,0x56,0xa3,0x91,0x0f,0xa6,0x70,0x3f,0xbd,0xe9,0xda,0x40,0x9b,0xf5,0x9e,0x53,0xed,0x5f,0x84,0x70,0xd2,0x4c,0x1c,0xb6,0x87,0xd6,0xbb,0x3b,0xec +.byte 0xe5,0x35,0x1b,0x2c,0x9b,0xf1,0xe5,0xf8,0x0e,0x07,0x98,0xcc,0x58,0x38,0x57,0x74,0xdb,0x0e,0x08,0xd9,0x56,0xe8,0x08,0x63,0x3d,0x94,0x4a,0xdc,0x59,0xfc,0x3d,0xc1,0xa4,0x36,0xc3,0xe8,0xbe,0x4b,0xd7,0x47,0x69,0x33,0xb8,0x72,0x30,0x59,0x28,0x4e,0xf1,0xc1,0x25,0xa3,0xa4,0xe3,0x12,0xcf,0x31,0xf6,0xf8,0xae,0x31,0x06,0x76,0x92 +.byte 0x64,0x87,0x8e,0xb0,0x9f,0x1d,0xf4,0x56,0x73,0xc5,0x5d,0xbb,0x80,0x0d,0x19,0x3f,0x56,0x8c,0xe4,0xd6,0x8a,0x9a,0x62,0x26,0x4e,0x8a,0x21,0x7d,0x72,0x34,0x87,0xb6,0x7e,0x49,0xdc,0xfd,0x27,0x95,0xba,0x25,0xdd,0xf4,0x58,0x2b,0x11,0x3f,0xd1,0xd7,0x13,0x1d,0xb0,0xec,0xe2,0x55,0x5e,0x72,0xea,0x36,0xc9,0xd8,0x61,0xc0,0xee,0xc4 +.byte 0x9f,0x35,0x7e,0x73,0xd3,0xf6,0xd7,0x6a,0xce,0xd6,0xd2,0x80,0xe6,0x10,0x4b,0x65,0x18,0x6f,0xab,0xd3,0x41,0xbb,0x39,0x36,0x95,0x84,0x3c,0x99,0x9a,0xfd,0xf0,0xa3,0x46,0xdf,0x48,0x7c,0xd5,0x57,0x9d,0x10,0x59,0xca,0x70,0xc4,0xb5,0xbe,0x47,0x9e,0xca,0x2b,0x49,0x54,0xbb,0x34,0x8e,0x39,0xf4,0xf8,0x8c,0xa5,0xa1,0xab,0xf6,0x51 +.byte 0xd8,0x22,0x9a,0xd5,0xc2,0x12,0xf8,0x26,0xc6,0x19,0x2a,0xa6,0x6e,0xab,0xd3,0xac,0xd1,0x21,0x97,0x67,0x3e,0x39,0x90,0x5c,0x37,0x65,0x7b,0x06,0x54,0x1a,0xb8,0x2a,0x56,0x02,0xa3,0x92,0xee,0xf3,0x38,0x53,0x25,0x4d,0x5d,0x0a,0x37,0x9e,0xbb,0xf4,0xb2,0x13,0x77,0xbb,0x93,0xa9,0x85,0xf2,0x15,0xfd,0x71,0x17,0x00,0x89,0xe7,0x7b +.byte 0xa9,0xdc,0x10,0xd9,0xc7,0x44,0xa5,0x7b,0x3f,0x2f,0x1e,0x6d,0xa7,0xfe,0x0c,0x0e,0x83,0x3e,0x38,0x27,0xa7,0x4e,0x85,0x3c,0x84,0xfe,0x95,0x48,0x85,0x09,0x75,0x62,0x1d,0xa4,0x64,0x54,0xed,0x89,0xd5,0x28,0x62,0x52,0x18,0xef,0xf0,0x57,0x05,0x30,0xf0,0xce,0x87,0x05,0x0d,0x81,0xe8,0x2a,0x3c,0x8c,0x22,0xe1,0x4b,0x32,0x42,0x9d +.byte 0x02,0xc5,0xe4,0x6a,0xa4,0x4d,0x9b,0xc4,0x82,0x47,0xdc,0x61,0xbd,0x82,0x01,0xcd,0x5e,0x64,0x9f,0x4c,0xe3,0x31,0xe9,0x48,0x53,0x85,0x07,0xc7,0x47,0x49,0x35,0xd8,0x6a,0xab,0x4f,0x73,0x3f,0xd3,0xde,0x87,0x29,0xac,0xbc,0x35,0x0a,0xb4,0x74,0xc2,0xa7,0x0b,0xb1,0x93,0x92,0x29,0x3b,0x3e,0xa8,0xde,0x12,0x49,0x75,0xda,0x16,0x27 +.byte 0x52,0x2f,0x93,0x23,0xd6,0xf7,0x10,0xfe,0x1e,0x93,0x97,0x06,0x9d,0xef,0x4f,0xe4,0x3d,0x5d,0xde,0x30,0x70,0x3d,0x78,0x3a,0x30,0x00,0x9b,0x77,0x12,0x90,0x62,0xda,0x32,0x9b,0x6a,0x47,0xd7,0x0f,0xee,0x75,0x18,0xdd,0x4d,0x8a,0xe2,0x35,0x5b,0x60,0xb8,0xf9,0xa4,0x6c,0x93,0x3e,0x47,0x23,0xed,0x7a,0xe2,0x58,0x42,0xd6,0x3f,0x90 +.byte 0xc0,0x12,0x38,0x8b,0x70,0xe0,0xf8,0x1a,0xb5,0x8d,0xe1,0x39,0xdf,0x93,0x25,0x72,0x2e,0xa9,0x3f,0x58,0x12,0x40,0xc4,0x92,0x46,0x08,0xf0,0x64,0xdd,0x34,0x42,0xfe,0x74,0x35,0x0c,0xda,0xef,0x06,0x0b,0x33,0x59,0xd9,0xee,0x4c,0xf9,0x02,0x3a,0x93,0x40,0xa3,0x99,0x0e,0x64,0x11,0x2f,0x52,0x9d,0x28,0x4d,0xe8,0x45,0xd0,0x22,0xd7 +.byte 0x8f,0xd6,0x28,0x8c,0x0e,0x18,0x87,0x24,0xf9,0x88,0xd2,0xc0,0xe8,0xd4,0x9d,0xa2,0x5a,0x79,0x83,0x37,0x18,0x84,0x12,0xca,0xc7,0x10,0xd5,0x5a,0xa8,0xe5,0xa8,0xe7,0x79,0xb6,0x2c,0xb3,0x90,0x6c,0xc5,0xa4,0x99,0x1b,0x85,0x29,0x78,0x0b,0x09,0x77,0x05,0xf4,0x23,0x79,0x5c,0x91,0xf3,0xe0,0xe4,0x6f,0x82,0x33,0x4e,0xa2,0x2e,0xa2 +.byte 0x65,0x79,0xad,0x98,0x36,0x34,0x72,0x97,0xd7,0x39,0x89,0x5e,0x82,0x9f,0x4c,0xe2,0xea,0x51,0x85,0x62,0x0c,0x39,0xf6,0xdc,0xc6,0x80,0x48,0xcf,0x98,0x93,0x64,0x7d,0xf9,0x63,0xf4,0xf5,0x18,0x2a,0xb6,0x04,0xb7,0x44,0xc4,0x60,0xc0,0xcf,0x3d,0x88,0xa8,0xb6,0x81,0xa3,0x99,0x2a,0xf0,0x1a,0x8d,0x76,0x20,0x1d,0xcc,0x10,0x50,0x58 +.byte 0x09,0xf9,0xda,0x65,0x60,0xc3,0xb1,0xc1,0xc0,0x4d,0x62,0x52,0x22,0x45,0x32,0xbc,0x11,0x93,0x15,0xb6,0x25,0x8f,0x65,0xa0,0x4c,0x88,0xc9,0x83,0xe1,0x5c,0xbb,0xfb,0x1a,0xab,0xdb,0x35,0x40,0x66,0xc0,0x2f,0xdc,0xf5,0x92,0x08,0x4c,0xc7,0xb8,0x49,0x05,0xe0,0xe1,0x61,0x2b,0xde,0xc7,0x6a,0x04,0x05,0x4d,0x9f,0xe9,0x59,0x22,0x56 +.byte 0x63,0x77,0x9d,0xe3,0x1e,0x36,0xdf,0x87,0x4a,0xeb,0xba,0x42,0x3d,0x1b,0xa5,0xd0,0xc5,0x44,0x07,0xbe,0x37,0x37,0x70,0x10,0x2d,0x02,0x9b,0xf6,0x52,0xf3,0x54,0x6d,0x50,0xdb,0xdb,0x57,0x01,0x0b,0x9b,0xd5,0x99,0x99,0x69,0x9b,0x10,0x76,0x48,0xea,0x28,0x27,0x06,0x30,0x63,0x3b,0xdf,0x06,0x30,0x37,0x28,0x75,0xcf,0x9c,0xe7,0x52 +.byte 0x43,0xe2,0xd5,0x7b,0xfa,0x88,0x98,0x9c,0x3e,0x27,0x30,0x21,0xcc,0x11,0x71,0x14,0x24,0x04,0x1a,0x8c,0xe9,0xfe,0x2f,0x9d,0xec,0xb1,0x10,0x33,0x05,0x31,0x01,0x1b,0xde,0x6b,0x30,0x20,0x6d,0xf4,0x7c,0xbf,0x41,0x04,0x5f,0xb9,0x9c,0x24,0x63,0x74,0x98,0x3e,0x60,0xc7,0xf1,0xb1,0xc6,0x94,0xf3,0x6f,0x95,0x24,0xdf,0x97,0xd5,0xc7 +.byte 0x50,0x19,0xaf,0xa5,0xae,0x51,0xde,0x6d,0x44,0x0c,0x90,0x72,0x11,0x82,0x04,0xf9,0xda,0x17,0xd8,0xf3,0x03,0xf2,0x03,0x3f,0x65,0x7f,0xd7,0x66,0x84,0x9a,0x02,0x90,0x2b,0x65,0x00,0xd9,0x9c,0xfb,0xaa,0xe2,0xde,0x5f,0x1e,0x19,0x1e,0x6d,0x20,0x1e,0x01,0xf1,0xca,0x7b,0x90,0x06,0x96,0x1d,0x7a,0x34,0x0c,0x66,0x57,0xd7,0x61,0x1f +.byte 0x74,0x03,0xcb,0xae,0xea,0xaf,0x65,0x8e,0x32,0xbe,0xb8,0xe6,0xd8,0x6d,0xf7,0x51,0x6d,0xec,0x7e,0xc6,0x9d,0x20,0x01,0xbf,0xd7,0xbc,0xcb,0x34,0x7c,0xe5,0x1f,0x92,0x72,0x2f,0x6f,0xa3,0x1f,0xe8,0x4d,0x7e,0xa5,0x85,0x3b,0xed,0xc7,0x25,0x53,0xe3,0x77,0x90,0x1f,0xda,0xb7,0x48,0x7d,0xbe,0x20,0x48,0x9f,0xb4,0x05,0x5d,0x41,0xc5 +.byte 0x48,0xd0,0xc9,0x83,0xbe,0xf8,0xd8,0x6b,0x0d,0x26,0x66,0x2e,0xef,0x6b,0x13,0x58,0x6b,0x5f,0x0e,0x8b,0x4e,0x57,0xb2,0x6b,0x3d,0x4d,0xcd,0xcb,0x9a,0x9b,0xda,0x4d,0x7f,0xea,0x17,0x06,0x7f,0xcd,0xaf,0x18,0xda,0x3d,0xf0,0x30,0x2e,0xbb,0xc2,0x1d,0xcf,0xde,0xf7,0xee,0xda,0xd6,0x3d,0x75,0xcf,0x19,0xcf,0xfc,0xdf,0x7a,0xb6,0x1f +.byte 0x89,0xf5,0x0c,0xe9,0xd5,0xf1,0xd0,0x40,0xbd,0xae,0xb5,0x16,0xf6,0x05,0x1e,0xba,0xcd,0x18,0x80,0x4a,0xb3,0x87,0x93,0x6b,0x19,0xfc,0x47,0xa8,0x45,0x4b,0x75,0xe8,0x06,0xc0,0xbd,0x86,0xf7,0xcf,0x2c,0x39,0xc6,0x0b,0x3f,0x32,0xcd,0x1c,0x02,0xec,0x4b,0xd5,0x90,0x84,0xaf,0xc9,0x5c,0x9e,0x64,0x82,0x13,0x81,0x05,0x03,0xe4,0xed +.byte 0x48,0x23,0xc3,0x53,0x2c,0x5a,0x22,0x0a,0x27,0x7e,0x55,0x79,0xdc,0x46,0xf5,0x4b,0x04,0xcc,0x43,0x87,0x6c,0xb5,0xa4,0x2d,0x78,0x70,0x02,0x43,0x0e,0x76,0x62,0x99,0x86,0x40,0x2a,0xe4,0x62,0xe6,0xee,0x4e,0x03,0x64,0x83,0x9c,0x38,0x6d,0x62,0xa6,0x85,0xb8,0xce,0xd7,0xf8,0xcb,0x78,0x00,0x7a,0x48,0x72,0x75,0x4e,0x9c,0x6f,0x0c +.byte 0x61,0xc7,0x93,0x4e,0x6d,0x65,0xa3,0x1b,0x17,0x84,0xc6,0xd2,0x29,0xc3,0x4d,0xe3,0x14,0x21,0x5f,0x9e,0xa9,0x28,0x11,0xf3,0xb2,0xe8,0xe7,0x60,0x9e,0x24,0xab,0x88,0x9c,0x9c,0x5e,0x17,0xe4,0xe1,0xa7,0x74,0xb4,0x82,0xd5,0xaa,0x92,0x08,0xa7,0xa2,0x04,0x6f,0x77,0x14,0x54,0x44,0x5d,0x13,0x10,0xa2,0x40,0x1d,0xf0,0x44,0x16,0x17 +.byte 0xda,0x8c,0x80,0x83,0x2b,0x19,0xb8,0xab,0xf2,0xb8,0xb1,0x92,0xb5,0xc5,0x05,0x3e,0xd2,0x1a,0xfc,0xfd,0x21,0xa6,0xb2,0xbd,0x89,0xee,0x9c,0x3c,0x90,0xd9,0xf1,0xd2,0xe8,0xc3,0x21,0xb9,0x0e,0x0c,0x98,0xbc,0x5e,0xa1,0x0d,0x89,0xfe,0x0f,0x3c,0x45,0xea,0xe1,0x6e,0x06,0x59,0xff,0x79,0xf4,0x7e,0xf4,0x82,0xc0,0x6b,0xd9,0x53,0x30 +.byte 0x98,0xed,0x8d,0x6f,0x3d,0x0e,0xfb,0x42,0x66,0xab,0x41,0xa8,0x4a,0xef,0x73,0xa4,0x54,0x99,0x4f,0xb6,0x65,0x44,0xf9,0xd9,0x3c,0x6b,0x59,0x36,0xb0,0xe3,0x7c,0x4a,0x85,0x80,0x6c,0x77,0x6f,0x34,0x4e,0x9e,0x54,0xfd,0x0c,0x25,0x72,0xc3,0x5a,0xb6,0x3b,0xad,0x2b,0xd5,0x29,0x55,0x31,0xab,0x62,0xe4,0x15,0xed,0xef,0x16,0xef,0x43 +.byte 0xd5,0xdd,0x3d,0x64,0x8c,0x13,0xbc,0xcd,0x4d,0xfb,0x4f,0x86,0x3b,0x73,0x1e,0xc4,0xe8,0x54,0xb4,0xcc,0x49,0xba,0x4f,0x81,0xcd,0xe8,0x30,0x92,0x4b,0x57,0xd1,0x7c,0x0c,0x65,0x7d,0xe1,0x59,0xc6,0x8c,0x7d,0xad,0xd5,0xcf,0x6c,0xc4,0x9d,0xc5,0x3f,0x23,0x1f,0xb0,0x6d,0x1c,0x07,0xbf,0x38,0xc9,0x16,0xdc,0x5b,0x51,0xa1,0xdb,0x8f +.byte 0xf8,0x25,0xc6,0x4d,0xc0,0x4d,0xa1,0x02,0xd9,0xd3,0xb5,0x63,0xda,0xe1,0x91,0x60,0x71,0x39,0x46,0x1a,0x13,0xe0,0xf2,0xca,0xcc,0xd3,0xbb,0x6b,0xd0,0x64,0xaa,0x0e,0xc0,0x89,0xa3,0xc6,0x14,0x56,0xe4,0x44,0x97,0xa9,0xcc,0x17,0x68,0xe6,0xfc,0xe5,0xfd,0xf0,0xa6,0x69,0xcd,0xac,0x20,0xc7,0xeb,0x53,0x1b,0x4f,0xdd,0xd3,0xb0,0xed +.byte 0x30,0x4e,0x36,0x73,0x63,0xef,0x51,0x3e,0x9a,0x3e,0x41,0x2b,0x9c,0xda,0x67,0x96,0x46,0x33,0xe3,0x3f,0x87,0x01,0xd8,0xc5,0x26,0x80,0xe4,0x7e,0xf4,0x78,0x8c,0x2b,0x81,0x2a,0x01,0x7c,0xe3,0xfc,0x8d,0x6b,0xdc,0x84,0xb9,0xff,0x43,0x37,0x57,0xce,0x3f,0x5e,0x63,0xd3,0xbe,0xb6,0x4a,0x31,0xbf,0xb8,0x74,0x64,0x9c,0xf3,0xc5,0x8a +.byte 0xae,0xe8,0x5f,0x68,0xcf,0xce,0xff,0x3f,0xc5,0xb5,0xfd,0x13,0x08,0x11,0x9d,0x1a,0x0f,0x06,0x08,0x4d,0x7c,0xf9,0xd4,0x20,0xdf,0x82,0xf9,0x86,0xfc,0xf3,0x67,0xa0,0x14,0x99,0xe5,0x47,0xf0,0x02,0x7b,0x16,0xca,0xcf,0xb9,0x0f,0x68,0x08,0x5d,0x1d,0x65,0xee,0x23,0x56,0xeb,0x11,0x5b,0xca,0xf1,0xa7,0xad,0x50,0xb2,0xd1,0x37,0x65 +.byte 0xe9,0x7e,0xf6,0xe9,0x64,0x42,0x49,0x80,0x40,0x17,0xe3,0x43,0x00,0xda,0xe1,0x7a,0x1c,0xb3,0xde,0xd9,0xf7,0x33,0xeb,0xb3,0xb8,0xf5,0x40,0x1b,0xcd,0x71,0x97,0x30,0xf9,0x9c,0x4d,0xac,0x7e,0x8e,0xd9,0x36,0x92,0x39,0xb5,0x56,0x0f,0x4f,0xbf,0x58,0xb8,0xba,0xc3,0xbd,0x79,0xb0,0xd7,0x6c,0x45,0x49,0xe2,0xde,0x94,0x04,0x9d,0x3e +.byte 0x91,0x0a,0xb2,0x9b,0x90,0x57,0x2e,0x69,0xa4,0x4f,0x61,0xbf,0xdb,0xfb,0xe3,0xe9,0x81,0x26,0xe0,0x48,0x90,0x8c,0x32,0x95,0x8d,0x38,0xec,0x8e,0xa7,0x5e,0xc3,0x36,0xc6,0xd1,0xbc,0x9a,0xb3,0xba,0xdb,0x2c,0xe4,0xa0,0x50,0x74,0xef,0x98,0x48,0x14,0xc9,0x38,0x4d,0xa9,0x48,0x13,0xd4,0x08,0x60,0xfd,0xcf,0x5e,0xf2,0xcd,0xc7,0xeb +.byte 0xaf,0x88,0x32,0x30,0x6f,0x19,0x01,0xec,0x87,0xae,0x6d,0x63,0xa3,0xa7,0x7b,0xcd,0x53,0xa7,0xf2,0xf2,0x9f,0x43,0xcb,0x0a,0x3f,0x8c,0xd2,0x55,0x8d,0xa7,0x95,0xcf,0x5b,0xae,0x64,0x23,0xda,0xb4,0xbd,0x32,0x34,0x95,0x8a,0x03,0xe7,0x6e,0xef,0x3f,0xb4,0xcf,0xc6,0x8a,0x2f,0xc6,0x59,0x99,0xdf,0xad,0x3c,0x15,0xed,0x83,0x0b,0x59 +.byte 0x8b,0xcd,0x0d,0xa6,0xcf,0x3a,0xc3,0xdb,0xc3,0x01,0xa9,0x32,0x38,0x45,0x5c,0xc8,0x56,0x81,0xef,0x21,0x7f,0x52,0xc4,0xb5,0x48,0x97,0x6a,0x60,0x75,0x3a,0x1a,0xd3,0xb0,0x60,0x9a,0x83,0x61,0xad,0x3b,0x4b,0x65,0xaa,0x9e,0x77,0x47,0x6f,0x3b,0x48,0xb0,0xc6,0x36,0x9a,0x59,0x5e,0x26,0xc4,0xb9,0xed,0x04,0xf3,0xc7,0x09,0x33,0xda +.byte 0x81,0x63,0xa6,0x5d,0xe1,0x54,0x6b,0x04,0x17,0x2b,0xb9,0x2f,0xbd,0x55,0xdb,0xa1,0x69,0x00,0xcd,0xba,0xfa,0x36,0xaa,0x47,0x5a,0x7c,0xf4,0x1f,0x53,0x94,0x95,0x2f,0xf8,0x2a,0x4b,0xa8,0xcc,0x73,0xab,0xfd,0x25,0xb2,0x4e,0xd6,0x62,0x90,0x8c,0x8f,0x02,0xe4,0xdc,0x22,0x79,0x04,0x34,0x9b,0x54,0x5c,0x54,0xca,0x9b,0x8a,0xf8,0x05 +.byte 0xd1,0xb0,0x9e,0x8f,0xa3,0x0b,0x53,0xa8,0x6f,0x1b,0x2e,0xf2,0x71,0x78,0x28,0xce,0xa9,0xdb,0x4c,0x5b,0x83,0xfe,0xaa,0xff,0x99,0x2f,0x03,0x14,0xb2,0xe0,0x5f,0xaa,0x65,0x15,0x1f,0xd2,0x31,0x95,0x70,0x3c,0x8b,0x55,0x8e,0x87,0xed,0xbb,0x0c,0x91,0x87,0xaa,0xbe,0x49,0xdb,0x18,0x7b,0x1d,0x26,0xa7,0xdf,0x00,0xff,0x73,0x70,0x2e +.byte 0x10,0xaf,0x46,0xea,0x7f,0xca,0xfa,0x09,0x13,0x02,0xac,0x3f,0xa0,0x02,0xa6,0x67,0xb7,0xec,0x18,0x73,0x91,0x25,0xa0,0x28,0xe3,0xd8,0xfa,0x11,0x6d,0x34,0x79,0x1d,0xe4,0x8f,0x7c,0x73,0x66,0x77,0x3e,0x43,0x23,0xb0,0xee,0x84,0xb5,0x75,0xc9,0x23,0x87,0x6a,0x4f,0x59,0x3d,0xb5,0xf1,0xd6,0x06,0xf8,0xa6,0x5d,0x0c,0x24,0xed,0x94 +.byte 0xd7,0xa8,0x31,0x37,0x10,0x60,0xb6,0x03,0x33,0x27,0x38,0xdd,0xd3,0x74,0x02,0xa3,0xa6,0x01,0x94,0xa9,0x56,0x11,0x23,0x0e,0xdb,0xfd,0x25,0x92,0xa8,0xfb,0x79,0xc8,0x8e,0x0e,0x10,0x1f,0xca,0x95,0xf6,0xad,0x28,0xe7,0xaa,0x2b,0xf1,0x40,0xf6,0xef,0x7b,0x40,0x28,0x57,0xbb,0x4c,0xac,0x0b,0x8b,0xb3,0xe3,0xec,0x53,0xf2,0x15,0x61 +.byte 0x2e,0x91,0xdf,0x91,0xfb,0x55,0xb6,0x7f,0x6c,0xfc,0xb7,0x4b,0x91,0xdc,0xf7,0xe5,0x91,0xd8,0x70,0x92,0x94,0xea,0x3f,0x62,0x98,0x14,0xc3,0x43,0x34,0x02,0x87,0xc7,0xca,0x60,0x4a,0xfb,0x50,0xe4,0xa9,0x92,0x10,0x04,0x7c,0x55,0xd3,0x9a,0x89,0xba,0x8e,0x6f,0x02,0xd6,0xc7,0x6f,0x91,0xb5,0x87,0xb9,0x0e,0xbe,0xe4,0x9f,0x01,0x0b +.byte 0x20,0x60,0xc8,0x16,0xe6,0x23,0x1d,0x5f,0x4d,0x82,0xf4,0x42,0x25,0xe6,0x05,0xe3,0x5b,0xbb,0xd1,0xb0,0xad,0x0b,0x05,0x71,0x3a,0x7b,0xee,0x0e,0xe1,0xe4,0x08,0x9f,0xda,0xdf,0x59,0x57,0x4f,0x05,0x5a,0x51,0x9a,0x60,0xfd,0x85,0x21,0xd1,0x0a,0x3b,0x0a,0x15,0x61,0x28,0x98,0x0a,0x8f,0x1e,0x33,0x15,0xb3,0x5f,0xf3,0xbb,0x89,0x22 +.byte 0x0c,0xaf,0x91,0xce,0x44,0xb1,0x54,0xd0,0x80,0x86,0x43,0xa1,0xb9,0x07,0xde,0xab,0x1f,0x9b,0xae,0xef,0x07,0xf2,0x40,0x33,0x31,0x4d,0xf9,0x45,0x97,0xf6,0xcc,0xe5,0x3c,0x49,0xcd,0x83,0x6e,0x38,0x81,0xab,0x40,0x18,0xda,0xf6,0xfe,0xe7,0x96,0xd1,0x17,0x98,0xae,0xec,0xe9,0x93,0x37,0xbc,0x0b,0xa8,0x12,0xe7,0x65,0xca,0x27,0x37 +.byte 0x6a,0x74,0x81,0xf1,0xe0,0x6c,0x0d,0xba,0x86,0x48,0x94,0xd0,0x72,0xd5,0x4d,0x71,0xcf,0xa8,0x5e,0xd1,0x97,0xd1,0xed,0xf0,0xd3,0xe4,0xe3,0x41,0xc9,0x8f,0xfc,0x89,0xe8,0xbf,0x96,0x8b,0x86,0xb0,0x97,0x79,0x95,0xdf,0x69,0x56,0x6d,0x61,0x0a,0x37,0xcb,0x36,0xe1,0x95,0x88,0xf5,0xf0,0xe2,0x5c,0xb2,0x44,0x73,0xda,0x83,0xa7,0xdc +.byte 0x8b,0x35,0x3e,0xc1,0xd5,0x88,0x17,0x3b,0xeb,0xcf,0x36,0x9c,0xef,0x40,0xb2,0x72,0xde,0x4f,0x16,0x6c,0x8c,0x9d,0x15,0xce,0x7d,0x0d,0xc3,0x2f,0xea,0xab,0x50,0xdf,0x02,0xe0,0x24,0xcc,0xf4,0xa7,0x25,0xba,0x85,0x0d,0x62,0x9a,0x39,0xc7,0x5a,0xd1,0x9a,0xd1,0xa7,0x45,0x5f,0xc2,0x44,0xf5,0xa9,0x8d,0xd8,0xbc,0xd3,0xc8,0x75,0x0d +.byte 0x06,0xc6,0x4b,0x24,0xc6,0xe5,0x72,0xf7,0xd5,0x87,0xca,0x3c,0xc0,0x1c,0x18,0xa9,0x40,0xc6,0x7b,0xe5,0x4c,0xe6,0xb7,0x01,0x57,0xc1,0xcf,0x63,0x83,0x58,0x63,0x47,0xcf,0xa4,0xd3,0xf6,0x1d,0x2c,0xbf,0x17,0xe6,0x0a,0x7b,0x2d,0xa9,0x34,0x23,0xfc,0x1f,0x06,0x31,0x47,0x7b,0x31,0x34,0x8c,0x3c,0x15,0x9b,0xac,0xfd,0x38,0xe6,0xa3 +.byte 0x9e,0xa7,0xdf,0xa6,0x37,0x61,0xfd,0x85,0xb8,0x2e,0x67,0x73,0x7f,0x60,0x12,0x8b,0x62,0xb0,0x38,0xd0,0xaa,0xc4,0xad,0x3b,0xa9,0x04,0x66,0xdd,0xbb,0x9c,0xb1,0x95,0xe1,0x9c,0x0a,0x72,0x80,0x12,0xaa,0xa8,0x0c,0x3f,0x90,0x20,0x33,0xb4,0x76,0xdd,0x26,0xfe,0x1e,0x8f,0x6a,0x2d,0xea,0x4a,0xdc,0x28,0x47,0x66,0x36,0x5b,0x50,0x60 +.byte 0x7e,0x3e,0x93,0xf3,0xe9,0x37,0x31,0x3b,0x43,0x46,0x85,0xb3,0xa9,0xb2,0x14,0x95,0x96,0x49,0xf9,0x2a,0xe7,0x9e,0x3a,0x3e,0xd8,0x12,0xf7,0xbc,0x43,0x8c,0x35,0x31,0x44,0x08,0x7f,0x25,0x39,0x86,0x98,0x6a,0xe8,0xe3,0x2e,0x73,0x2d,0x3b,0xac,0x2d,0x75,0x4c,0xc8,0xca,0x21,0x2d,0x96,0x9b,0x4f,0x56,0xff,0x2d,0xc2,0xe2,0x98,0x3d +.byte 0xe2,0x3f,0xee,0x10,0xb7,0xc3,0x3d,0xa8,0x50,0x88,0x7f,0xd5,0x4e,0xbd,0xc7,0x9d,0xdc,0x01,0x49,0x27,0xf2,0xae,0xea,0x93,0x72,0xdf,0x00,0xcd,0xe6,0xa1,0xdd,0xd1,0x18,0xeb,0xa7,0xe1,0x4a,0x7b,0x38,0x72,0x73,0x29,0x46,0xa3,0xb3,0x25,0x23,0x6d,0x26,0xab,0x86,0xdc,0x67,0x52,0xe5,0x4a,0x5e,0x8f,0x16,0x67,0x8a,0x28,0x13,0xba +.byte 0x44,0x42,0xb5,0x21,0x9f,0x30,0x66,0x7f,0xc9,0x87,0x40,0xcb,0x75,0x58,0x2e,0xcd,0x09,0xb9,0x8a,0x84,0xa3,0xbd,0x63,0x53,0x75,0x2f,0x77,0x8b,0x7e,0x19,0x31,0x33,0x3b,0x9a,0xfb,0x86,0x39,0xa6,0xd9,0xeb,0x9b,0x43,0xc6,0xd9,0xc2,0x10,0xab,0x42,0xe5,0xc6,0x4a,0xe6,0x3e,0xde,0x9d,0xac,0x8e,0x95,0xf0,0xdb,0x48,0x95,0xc2,0x87 +.byte 0x6b,0x7f,0xde,0x09,0xdb,0xed,0x49,0x19,0x73,0x2d,0xa4,0x5c,0xdf,0xfa,0x2e,0x15,0xd0,0xb6,0x46,0x32,0xc9,0x7f,0x7e,0x01,0xd3,0x25,0x45,0x0e,0x5b,0x0d,0xf0,0x67,0xe3,0xd9,0xdf,0x4f,0x3b,0x6f,0xb3,0x15,0xc5,0x6b,0x91,0x75,0xa2,0xaf,0x42,0x3a,0x14,0x50,0xd9,0x4f,0x19,0x65,0x12,0x83,0x5d,0x8f,0x8a,0x01,0x0b,0x89,0xcc,0x7f +.byte 0x1a,0xde,0x5b,0x44,0x34,0x98,0x0f,0x8e,0x5a,0x5e,0x03,0x41,0x3e,0x66,0x9b,0x16,0xf5,0x91,0x7c,0xb0,0xc1,0xbf,0xa2,0x10,0x0b,0x60,0x3a,0x63,0x0c,0xcf,0xd8,0x49,0xdb,0x42,0x88,0x1f,0x36,0x8e,0x15,0xdb,0x5d,0x3f,0xe7,0xf1,0x9a,0x73,0x2b,0x74,0x0c,0xd5,0x09,0xab,0x01,0x2e,0x52,0x6f,0x03,0xf6,0xc9,0x0b,0xeb,0xa5,0xce,0x2e +.byte 0x1c,0x02,0x35,0xca,0xce,0xfe,0x4b,0xad,0x67,0x21,0xf8,0x44,0xea,0x70,0xf2,0x3d,0xfc,0x43,0x77,0x05,0x26,0xbe,0xaf,0x99,0xab,0x41,0xd4,0xcc,0x53,0x33,0x33,0xcd,0xb4,0x2d,0x76,0xfb,0xae,0x0c,0xac,0xc1,0xd0,0x42,0xfb,0x45,0x4a,0x6e,0x55,0xd2,0x93,0xef,0xb9,0x06,0xbc,0x38,0xce,0x94,0xc2,0x01,0xdf,0x27,0xc8,0x47,0xff,0x74 +.byte 0xfb,0x84,0xc5,0xa2,0x78,0x1f,0x4f,0x73,0x12,0xec,0x2d,0x82,0x5b,0xeb,0x3c,0xb6,0x1c,0x5a,0x29,0x9c,0xba,0x9e,0xa4,0x85,0x94,0x84,0x68,0x01,0xd7,0xb1,0x27,0x84,0x4a,0x7d,0x62,0x9c,0x32,0x12,0x89,0xd8,0x66,0xb5,0xe9,0x07,0xf4,0x5f,0x6b,0x0e,0x90,0x87,0xe5,0xc1,0x8b,0xaf,0x8f,0xf7,0xca,0x54,0xe0,0xc6,0x5f,0xa5,0xec,0xd1 +.byte 0xdc,0xdc,0x17,0x9e,0xca,0x4b,0x72,0x72,0x03,0x96,0x62,0xaa,0xc1,0xfe,0x23,0x7e,0xd2,0x06,0x61,0xb6,0xc9,0x0d,0x7e,0xbf,0x72,0x1c,0x66,0x46,0x0b,0x31,0x96,0x81,0x11,0x3d,0xac,0x5e,0xd0,0x35,0xaf,0xac,0x4c,0x74,0xce,0xf9,0x9c,0x64,0x3d,0xe5,0x9d,0xfe,0xc7,0x05,0x09,0xe1,0x70,0xc5,0x37,0xd5,0x4e,0xd8,0x7d,0xdb,0xfa,0x1c +.byte 0x28,0xfc,0x10,0x2a,0xe8,0x62,0x18,0x09,0x97,0xe0,0x98,0x2e,0x9f,0x1d,0x18,0xff,0x22,0xe9,0x5d,0x37,0xd2,0x74,0xf1,0x81,0x08,0x8a,0x55,0xc0,0x40,0x0f,0x70,0xbe,0x82,0x23,0x78,0x35,0xc8,0xf8,0x59,0x6e,0x0d,0x2e,0xd5,0xe7,0xf5,0x2e,0xbd,0xcd,0x1a,0xcf,0x76,0x43,0x1f,0xca,0x15,0x6c,0x4a,0xb7,0xc7,0xb9,0xaf,0x68,0xd7,0x31 +.byte 0x1e,0x0c,0x9c,0x78,0x74,0x66,0x80,0xc6,0x74,0xbe,0x86,0x59,0x0c,0x12,0xdc,0xf3,0x1b,0xaf,0x63,0x74,0xce,0x1e,0xac,0xf0,0x65,0xa0,0xab,0x7f,0x96,0x08,0x32,0xb2,0xca,0x9c,0xfb,0x9d,0x66,0x63,0x76,0xf9,0x69,0x08,0x6e,0xd3,0x46,0xde,0xdf,0x54,0x06,0x0d,0x25,0x81,0xd9,0x5a,0x45,0xeb,0xe5,0xc0,0xf6,0x86,0x0f,0xe9,0x27,0x7c +.byte 0xdc,0x52,0x28,0xb5,0xd0,0x7d,0x07,0xc1,0xb6,0x9b,0xdc,0xea,0xd3,0x2a,0xba,0xb0,0xd5,0xa3,0xd8,0x25,0x07,0x9c,0x6c,0xd6,0x16,0xa5,0x93,0x43,0x52,0xa7,0x5c,0x2b,0xe2,0xfa,0x8e,0x6e,0xaa,0x04,0x84,0x63,0x80,0x0f,0x90,0x10,0x41,0x1c,0xf6,0x67,0xea,0x39,0xb0,0x16,0xfc,0x6f,0x85,0x28,0x8c,0x8e,0xfb,0x79,0x39,0xdf,0xf6,0x6e +.byte 0x57,0xa1,0xaa,0xf1,0x0b,0x99,0xde,0xad,0x69,0xe2,0xf4,0x74,0x8e,0x8c,0x2d,0x20,0xdb,0xf3,0x2d,0xc2,0x75,0xe7,0xd6,0xc8,0x9d,0x46,0x3b,0x8b,0x8b,0x18,0xd8,0x41,0xfd,0xc2,0x7d,0xec,0x66,0x78,0xe7,0xbe,0xee,0x2b,0x07,0xd8,0x7e,0x13,0x61,0x7e,0xab,0x7d,0x2b,0x3f,0x83,0x96,0xf5,0xab,0x0b,0x20,0xd2,0x5b,0xb0,0xeb,0xf7,0x1b +.byte 0xac,0x1a,0x16,0x46,0x21,0x90,0xdb,0x67,0x66,0x42,0xe2,0x54,0x34,0xae,0x34,0xae,0x21,0x33,0x8c,0x48,0x19,0xdb,0x1f,0xa8,0x25,0x76,0xe0,0x03,0x1c,0x35,0x8d,0xd3,0xab,0x6b,0x93,0xf3,0xad,0x7d,0x3c,0x76,0x1d,0xaa,0x43,0x80,0x0f,0x5f,0x20,0xd9,0xf0,0xff,0x8b,0xf4,0xdb,0xbc,0xf2,0xff,0xf2,0x8a,0xfc,0xf5,0x0e,0x4e,0xd9,0xb0 +.byte 0xd6,0xb3,0x86,0x5b,0x3e,0x10,0x87,0x50,0xf1,0xd2,0x8f,0x8d,0xa4,0x39,0x85,0xf5,0x90,0xd6,0x53,0x69,0x40,0x42,0xc1,0xc3,0x7c,0xc1,0x3e,0x97,0xb4,0x08,0x49,0x93,0x4e,0x4c,0x67,0xd9,0x2e,0x05,0x70,0x04,0x98,0x0a,0xed,0xd0,0xff,0x0c,0x13,0xe4,0xde,0x75,0x81,0x24,0xb1,0x27,0x79,0xeb,0x80,0x68,0x52,0x50,0x66,0x77,0x4f,0xf6 +.byte 0x64,0x2f,0x85,0x9e,0xc1,0xbf,0x9f,0x0e,0x31,0x9a,0x36,0x24,0xcd,0xa8,0xe8,0xce,0x41,0x86,0xd1,0x02,0x96,0xdc,0x1a,0xa0,0x48,0xca,0x61,0xd5,0x87,0xdb,0x0a,0xeb,0x69,0x95,0xca,0xf8,0xe5,0xa0,0x5b,0x91,0x8f,0xb9,0x59,0x5f,0x68,0x60,0x58,0xc5,0xe0,0xc7,0x02,0x68,0xa5,0x67,0x1e,0xfc,0xa9,0x27,0x9f,0x83,0x4c,0x05,0x60,0xee +.byte 0xcb,0x79,0x31,0x73,0x36,0xf4,0x39,0x44,0xdb,0xea,0x62,0x89,0x97,0x69,0xd1,0x0d,0xf6,0x27,0xcf,0x47,0xfe,0x3d,0x5c,0xe9,0x92,0x54,0x0a,0x66,0xaf,0x82,0xb1,0x49,0x87,0x3f,0xa2,0x95,0x91,0x0e,0x72,0x1e,0x7b,0xde,0x32,0x31,0x51,0x40,0x24,0x4f,0x30,0x59,0x7d,0x97,0x28,0x30,0x7e,0x93,0xcd,0x1e,0x16,0xef,0xe1,0xb5,0xa8,0xff +.byte 0x3a,0xd0,0x62,0x94,0x8b,0x72,0xe7,0x97,0x8f,0x2f,0x58,0x3e,0x62,0x43,0x6b,0x28,0x05,0xc9,0x0d,0xf0,0x09,0xbd,0x12,0x3b,0xd8,0x15,0xd3,0x7c,0x97,0x96,0x5a,0xf4,0x9f,0x8d,0x25,0xb7,0xc5,0x66,0xf7,0xf7,0x5f,0x7e,0xca,0x2f,0xcd,0x9a,0xf2,0xa3,0x9b,0x4f,0x6f,0xc3,0xd9,0x64,0x38,0xda,0x87,0x97,0x8a,0x49,0x2d,0x80,0x16,0x73 +.byte 0x88,0x62,0xd2,0xdf,0x4f,0xf7,0x79,0xc0,0x83,0xeb,0x2b,0x66,0x5a,0x21,0x3a,0xa2,0x2a,0xed,0x8c,0xe7,0x91,0x6d,0x56,0x18,0xfc,0x59,0x68,0xea,0x9f,0x5c,0x3c,0xd5,0x0f,0x64,0x70,0x89,0x22,0x83,0xed,0xfa,0xc9,0x21,0x68,0x3c,0x69,0xb8,0x3e,0x89,0xb5,0x9d,0x8b,0xc8,0xf7,0x57,0x17,0x27,0x90,0x12,0xa7,0xd2,0x4d,0x2c,0x30,0x64 +.byte 0x42,0xbe,0xa6,0x49,0x4e,0xa3,0x3b,0xdb,0xdb,0x64,0x0e,0x89,0x66,0x87,0x72,0x90,0x86,0x1d,0x0b,0x61,0x32,0x47,0x3d,0x55,0x81,0xb2,0x50,0x5a,0x76,0x6c,0xa3,0x46,0x12,0x1b,0xaf,0x6e,0xbf,0xfd,0x98,0x2f,0xb7,0xd2,0x31,0x92,0xb5,0x26,0x1a,0x3d,0xfa,0x5d,0xc0,0x24,0x44,0xd2,0x6b,0x1c,0x81,0xf5,0x5d,0x50,0xb0,0x33,0x18,0xe0 +.byte 0xc5,0xb3,0x6b,0xf4,0xfd,0xde,0xf7,0x2f,0x69,0x1d,0x5a,0xfe,0x03,0x6d,0xca,0xad,0x29,0xe0,0x6e,0x70,0xcd,0xe3,0x6d,0x38,0xef,0xf1,0x3a,0x76,0x2b,0x2c,0xb6,0xcd,0xff,0xeb,0xbc,0xe7,0xd9,0x40,0xbe,0x23,0x61,0x20,0xd5,0xb8,0x66,0x77,0x65,0xc9,0x33,0xf5,0x75,0x8e,0x15,0x98,0x3f,0xb1,0x4a,0xb8,0x1c,0x47,0x73,0x45,0x0f,0x73 +.byte 0x2a,0xa1,0xb7,0x73,0x76,0x94,0x16,0x45,0xcf,0xd6,0x8f,0xe3,0x62,0x8a,0x42,0xfd,0xe3,0x1e,0xe0,0x7d,0xb5,0x99,0xbd,0x1c,0xf2,0x60,0xb2,0x72,0xa8,0x4b,0x19,0xd6,0xd0,0xdb,0x0b,0x1f,0xc9,0x68,0xc0,0xf3,0x65,0x04,0x50,0x41,0xf0,0xb3,0x0e,0x0a,0x9d,0x7f,0x0b,0x1f,0xeb,0x5b,0x4c,0x58,0x6a,0xf2,0x02,0x95,0xd2,0xf3,0xac,0xe5 +.byte 0x69,0x81,0xb1,0x3f,0x08,0xfc,0xba,0xcb,0x36,0xcd,0x54,0x28,0xac,0x65,0xd8,0x81,0xab,0xc1,0x6a,0x51,0x97,0x21,0xe4,0xc6,0xaf,0xd8,0x76,0x76,0xa4,0xc4,0xd0,0x58,0x63,0xdf,0x32,0xf5,0x04,0xfb,0x11,0xeb,0x76,0x39,0xda,0x55,0xf4,0x7e,0x1c,0x7b,0x04,0x07,0x4d,0x5a,0xeb,0x74,0x0a,0x57,0xcf,0x10,0xf6,0x0e,0x73,0x02,0x25,0x67 +.byte 0x4f,0x8f,0x37,0x75,0x8f,0x44,0x2a,0x1a,0x6d,0x05,0xda,0xe0,0xa0,0xaa,0xd2,0x78,0xaa,0x7e,0x76,0x0a,0xde,0x2a,0x54,0xae,0x1e,0x39,0xcc,0x3c,0x1c,0xa6,0xd5,0x8a,0xca,0xb4,0xcc,0x76,0xb9,0x30,0xd2,0xe2,0x46,0x31,0xb6,0x51,0xcf,0xe2,0x24,0x77,0xc9,0x9b,0x57,0x3c,0xa3,0x84,0x60,0x59,0x28,0x5f,0x23,0x74,0x17,0x79,0x42,0xbe +.byte 0x60,0x3f,0x09,0x6a,0x43,0x8e,0x40,0x25,0x79,0xb5,0xbb,0xbb,0x72,0x50,0xad,0x4f,0xaa,0xa2,0xd4,0xb2,0xc6,0x7d,0x50,0x7b,0x98,0x59,0x22,0x06,0x7d,0x2c,0x35,0xdd,0x44,0x34,0x9c,0x28,0x98,0xf3,0xe5,0xd0,0x7e,0x09,0xbe,0xc4,0x00,0x72,0xd5,0xa6,0x3b,0x0e,0xb1,0x18,0x91,0x0a,0x4d,0x5d,0xe2,0x0a,0x98,0x79,0x30,0x9b,0xaa,0x38 +.byte 0x03,0x2b,0x6c,0xb2,0x8e,0x0a,0x1d,0x30,0x59,0x8a,0xe8,0x6c,0x6d,0xb5,0xd4,0x91,0xc5,0x28,0x1d,0x5e,0x49,0xe0,0xfc,0x26,0x7f,0x40,0xc0,0x6a,0x81,0x0d,0xb9,0xc6,0x05,0xc6,0x18,0x82,0x70,0xf6,0xea,0x0e,0xb4,0x85,0xba,0x5d,0xfa,0xfd,0xe3,0xd6,0x08,0x7c,0x3d,0x99,0x03,0xd4,0xdc,0x9b,0x50,0x12,0xc8,0xbd,0x8c,0x47,0x67,0x28 +.byte 0x83,0x97,0xca,0xef,0xc3,0x1c,0x2b,0x6e,0x3b,0xf7,0xca,0x7a,0x68,0x6e,0x39,0x25,0x58,0xf7,0xa4,0x11,0x9d,0x8d,0x49,0x29,0xd6,0x6e,0x0b,0x0a,0xcf,0xa7,0x04,0x14,0x6f,0xc4,0x4c,0x36,0x1a,0x16,0x3e,0x8f,0x99,0x69,0x94,0x1d,0xa8,0x66,0x93,0xeb,0x1d,0x82,0xfd,0x3f,0x84,0xb0,0x9d,0xa4,0xe1,0xb0,0xd4,0x9d,0xb2,0x60,0x20,0xfb +.byte 0xd3,0xa0,0xdc,0x79,0x83,0xb0,0xfc,0x50,0x18,0x57,0xe1,0xeb,0x44,0x25,0x05,0xab,0x27,0xfb,0x5f,0x83,0xcd,0x51,0xd0,0x3b,0x80,0x4a,0xce,0xbf,0xe9,0xfe,0x46,0xd2,0x5f,0xea,0x8c,0x89,0x48,0xc8,0x65,0xdd,0x2a,0xa4,0xda,0x54,0xc2,0x37,0x7e,0xd7,0xff,0x80,0x5b,0xf0,0xc3,0x40,0x44,0x40,0x72,0x63,0x23,0xc6,0x9a,0x48,0xf3,0x4b +.byte 0x91,0x64,0x26,0xfc,0xf3,0xa0,0xb9,0x06,0x0c,0x88,0xbb,0xc0,0x93,0x73,0x63,0xf6,0x9c,0x0d,0xe2,0xf6,0xee,0xe0,0x51,0xfd,0xae,0x4d,0x21,0xb9,0x6b,0x7d,0x1e,0x34,0xa0,0x4d,0xe4,0x25,0x30,0xe6,0x81,0x2e,0x32,0xef,0xb9,0x9e,0xaf,0xa0,0x22,0xe0,0x67,0xe6,0x07,0x55,0x3a,0xed,0xef,0x4f,0x87,0x2f,0x44,0xd2,0xef,0xc1,0xfb,0xc4 +.byte 0x7b,0x27,0x20,0x44,0xd2,0xd6,0xf9,0xf3,0x67,0xc1,0xbf,0xaa,0xd5,0x9c,0xd9,0x2c,0xd5,0xf1,0x42,0x2d,0xec,0x39,0xb5,0xc1,0x18,0xed,0x6c,0x47,0x80,0xf8,0x6f,0x66,0x10,0xee,0x1d,0xd6,0x79,0x01,0x4e,0x2a,0xd0,0x83,0xa7,0x9d,0x1d,0x81,0xce,0xf5,0x6f,0x26,0x86,0xd2,0xd7,0x56,0x15,0x65,0x48,0x4c,0xf1,0xf9,0x21,0x77,0xd1,0x84 +.byte 0x22,0xce,0x4d,0x8d,0x83,0xda,0x8c,0x50,0x56,0xc8,0x3b,0xc5,0xb6,0xcf,0x3e,0x0d,0x50,0xe5,0x9d,0x6c,0xb5,0x2a,0x5a,0x58,0x28,0xf5,0x0a,0x05,0xf3,0x0e,0x40,0x8e,0xb6,0xb4,0xdf,0x11,0x1b,0x34,0x81,0xc5,0x0e,0x09,0xa6,0xfc,0x46,0x14,0x02,0x78,0x94,0xbb,0x63,0x9d,0x3e,0x25,0x2c,0xc8,0x1b,0x5c,0xef,0x64,0x77,0x0c,0x04,0x40 +.byte 0xe1,0x45,0x85,0xf8,0x07,0xbf,0x14,0x65,0xe9,0xfc,0xba,0xe4,0x9c,0xa7,0x91,0x56,0x2a,0x3a,0x8e,0x33,0xae,0x56,0x04,0x9d,0x35,0xbc,0xad,0x64,0x0e,0x99,0x8e,0xb5,0x84,0x72,0xcf,0xcc,0x81,0x14,0x11,0x9e,0xe6,0xac,0x0d,0x41,0x43,0x4e,0x2a,0x0d,0xda,0x98,0x42,0xfa,0x8c,0x21,0x79,0x93,0xa3,0xdf,0x84,0x88,0x76,0x14,0x5b,0xb9 +.byte 0xff,0xe1,0xab,0x94,0xc3,0xcd,0x10,0x69,0xee,0x53,0xea,0xfe,0xfb,0xaa,0x43,0x8f,0xdd,0x55,0x88,0x34,0x5d,0x55,0x0f,0x42,0x4d,0x1d,0x93,0xce,0x96,0x67,0xf8,0x33,0xc7,0xca,0x34,0x11,0x28,0xb2,0xed,0x0f,0x00,0x40,0x84,0xee,0x51,0x26,0x6e,0x7b,0x2d,0x77,0xeb,0x18,0xb8,0x9a,0xad,0x28,0xb6,0x6c,0x5e,0xde,0x10,0x4c,0x29,0x1d +.byte 0x79,0x3c,0x2e,0x1c,0xf0,0xc8,0xb3,0xee,0x19,0x7a,0x10,0xe1,0xe3,0x05,0x1e,0x63,0xe9,0x00,0xd7,0xfe,0x83,0xe7,0x54,0xff,0x65,0x9a,0x27,0xa3,0x86,0x72,0x5c,0xb6,0xef,0xf5,0x84,0x68,0x1e,0xae,0xe6,0xf8,0x66,0x9c,0x1b,0x86,0xab,0xfa,0x1a,0xe3,0xb8,0x97,0x16,0xb1,0xb7,0x42,0xfa,0x85,0xa3,0x3a,0x0d,0x21,0xd2,0x35,0xb1,0x89 +.byte 0xf0,0x4f,0x1a,0x1d,0x45,0x34,0x2f,0x31,0x12,0x8c,0x19,0xe7,0x4b,0x14,0xa7,0xcf,0x0f,0xf9,0xcd,0x77,0x40,0xbe,0x09,0xeb,0xc3,0x3e,0x4a,0x37,0x55,0xab,0xbb,0x9c,0xe5,0x22,0x56,0x8a,0x66,0xfa,0xb1,0xff,0x73,0x29,0x52,0xb1,0x89,0xf7,0xab,0xa6,0x58,0x53,0x97,0xfd,0x44,0xda,0xbd,0x0b,0x1f,0xc8,0x88,0x01,0xcc,0x5e,0xf7,0x05 +.byte 0xbd,0xf7,0x0a,0x4d,0xcb,0xef,0xbf,0xd9,0x8e,0x15,0xc3,0x40,0xb9,0xc9,0x14,0xe5,0x05,0x3c,0x20,0x67,0xfe,0xdc,0xa6,0xb8,0x92,0xbd,0xf5,0x33,0xb5,0x77,0x11,0x28,0x47,0x21,0x28,0x18,0x61,0xf8,0x1c,0xdb,0x65,0xad,0x89,0x0d,0x98,0x79,0xca,0x2b,0xa3,0x4f,0x16,0xa6,0xb3,0xb9,0xcc,0x47,0x5b,0x13,0x96,0x2e,0x39,0x78,0x24,0xc5 +.byte 0xf9,0xf5,0xae,0xdc,0x34,0x3c,0xf7,0x48,0x0d,0x75,0xaf,0x51,0x75,0x48,0xbe,0x4d,0x73,0x89,0x5a,0xfc,0xd7,0x51,0xd3,0x93,0xa8,0xbc,0xc3,0xa6,0x6b,0x63,0xc1,0xc3,0x7b,0x48,0xf1,0x57,0xe4,0xb4,0xce,0x5f,0x18,0xae,0xdc,0x61,0x99,0xaa,0x7e,0x49,0xd6,0xb5,0x2c,0x62,0xb8,0x8c,0x4a,0x94,0xc1,0xc2,0x13,0x23,0xdc,0x7c,0x48,0xc2 +.byte 0xaa,0xc4,0xd9,0xc0,0x09,0x11,0x6e,0x35,0x07,0x14,0x77,0x7e,0xeb,0x87,0x00,0x05,0x30,0xec,0xb2,0xc6,0xde,0x6e,0x42,0x0b,0x2a,0xb6,0xca,0xb1,0xdc,0x69,0x57,0x1b,0xad,0x52,0xa8,0x22,0x1e,0xb5,0x2b,0xb5,0x8e,0x39,0x4b,0xbf,0x38,0xf4,0xb2,0xf5,0xa1,0x9c,0x7b,0x7f,0x6c,0x14,0x48,0x37,0xa9,0xf9,0xcd,0x85,0x50,0x53,0xb0,0xc1 +.byte 0x15,0x28,0x19,0x3b,0xb1,0x04,0x44,0x93,0x7a,0x16,0x76,0x69,0xa1,0x5c,0x67,0xcc,0x8d,0x02,0x56,0xcd,0xd9,0x91,0x49,0x8c,0x1b,0xc9,0x89,0x98,0x09,0x2e,0x5b,0xf8,0x7c,0xe6,0x0f,0x46,0xb0,0xcc,0xe5,0x75,0x63,0xaf,0x40,0xd5,0xa3,0x45,0x4a,0x76,0x67,0x1d,0x81,0xc2,0x25,0x85,0x7f,0x52,0xc5,0xf8,0x6d,0xd9,0xb6,0xa8,0xa4,0x96 +.byte 0x63,0xcc,0x15,0xc5,0xec,0x40,0x0e,0x08,0xf7,0x6f,0x85,0xa5,0xe7,0x2e,0xbe,0x3f,0xf4,0xc8,0x74,0xc7,0xed,0x86,0x85,0xc0,0x44,0x9e,0x80,0xc8,0x89,0xdc,0x16,0x47,0xb1,0x68,0x0e,0x65,0x66,0x0f,0xbc,0x33,0xb1,0x78,0x1e,0x5e,0xd7,0xde,0x97,0x96,0xb8,0x74,0x5c,0x90,0x7a,0xed,0x36,0xf4,0x10,0x91,0x5a,0x42,0x92,0x81,0x11,0x73 +.byte 0x3e,0xf1,0x5e,0xfb,0xc2,0x38,0xe6,0xe5,0x41,0xce,0x96,0xed,0x44,0x14,0x9c,0xc0,0x1f,0x83,0x5f,0xdd,0x50,0x87,0x90,0x86,0x50,0x61,0x87,0x99,0x7c,0x64,0x2d,0x50,0x17,0xa3,0xb0,0x7e,0x69,0xd3,0x86,0xb4,0x7c,0xe7,0x15,0x34,0x9e,0x3b,0x17,0xc0,0x2d,0x08,0x60,0x8b,0xae,0xec,0xa2,0xf6,0xf1,0xa4,0xbc,0x7b,0xc2,0x75,0x91,0x13 +.byte 0xf6,0xd0,0x71,0xf0,0x3c,0x9c,0x51,0xb3,0x33,0x53,0x57,0x47,0x8b,0x47,0xb0,0x0b,0x95,0x9a,0x39,0x70,0x63,0x91,0xcc,0xd8,0xd0,0x23,0x32,0xc0,0xb6,0x0f,0x91,0x30,0x29,0x45,0xf1,0xfc,0xa1,0x83,0x10,0x9a,0xa4,0x05,0x05,0x9f,0x33,0xbd,0xaf,0x16,0x3e,0x53,0x39,0xb1,0x4b,0x76,0x55,0x3e,0x6f,0x47,0x23,0x59,0x4c,0xbb,0x82,0x31 +.byte 0x19,0xe2,0xb1,0x49,0x20,0x91,0x2d,0xb0,0xfe,0xa6,0xae,0x7f,0x6e,0xd1,0x5b,0xb9,0x84,0x18,0x0f,0x68,0xc6,0x56,0x8a,0x22,0x81,0x3f,0x38,0x42,0x7a,0x31,0xa1,0xc1,0xf7,0x10,0x6a,0xc3,0xb1,0xaf,0x19,0xad,0x06,0x3a,0x53,0x9d,0x44,0x9f,0xe7,0x25,0xac,0x59,0x06,0xb9,0xd2,0xf6,0xce,0xb6,0x1e,0x4d,0x65,0x2e,0x05,0xb4,0x14,0x91 +.byte 0xfb,0x5b,0x26,0xd0,0xee,0xfa,0x45,0x5b,0x0c,0xd5,0x5c,0x1f,0x0c,0xe0,0xf6,0x50,0x78,0x77,0x7e,0x83,0x04,0xec,0x3b,0x53,0x28,0x97,0x56,0x61,0xeb,0xa0,0x78,0xe5,0xc0,0xb2,0x3c,0xcd,0x6f,0x4b,0xda,0x11,0x00,0x93,0x49,0x9f,0x03,0x22,0x39,0x3a,0xc8,0xef,0x01,0x91,0x12,0x36,0x15,0x0c,0x47,0xd5,0x8b,0x77,0x5e,0x5f,0x91,0x4b +.byte 0x44,0x98,0xa0,0xa0,0x46,0x0f,0x17,0xef,0xf9,0x52,0x0b,0x92,0xc1,0xe0,0xfc,0x63,0x9b,0x6d,0xe2,0xde,0x88,0x89,0x32,0x89,0x93,0x44,0x6d,0x69,0xe7,0x26,0xfd,0x77,0xc0,0x18,0x58,0xdb,0x74,0xec,0x04,0x0c,0x60,0x51,0x74,0xca,0x49,0x3e,0x4f,0x5f,0xaa,0x53,0xf2,0xc1,0xcb,0x89,0x1f,0x69,0xaa,0xbb,0x97,0x17,0x04,0x49,0x5e,0x44 +.byte 0xf3,0xf3,0xc4,0x98,0x9d,0x49,0x1e,0xb0,0x27,0x7d,0xff,0x54,0xa5,0xed,0xbe,0xb0,0x52,0xf6,0x00,0x87,0x67,0x2d,0x28,0xdb,0x09,0x4e,0xa2,0xee,0x4f,0x81,0xeb,0xa1,0xca,0x2b,0x07,0x2f,0x54,0x6d,0x5a,0x2e,0x13,0xa4,0xd0,0xac,0x21,0x7c,0x44,0xc0,0x98,0xac,0xe4,0x6e,0x94,0xd1,0x5b,0x5e,0xd6,0xf1,0x3c,0x45,0x88,0xe1,0xbd,0x58 +.byte 0xf1,0xc7,0xba,0x36,0x2c,0x15,0xb9,0xf4,0xa3,0xea,0x73,0xb4,0x91,0x53,0xd8,0x18,0x86,0x23,0x87,0x0b,0x7a,0x4a,0x2d,0x2d,0x3d,0x73,0xcb,0x05,0x11,0x4c,0x19,0x26,0xf2,0x05,0x89,0xc8,0x29,0x26,0xa7,0xe4,0xcb,0x43,0xd0,0xf6,0xbc,0x76,0xbd,0x9a,0x17,0x4a,0xf1,0x39,0xe3,0xde,0x05,0x10,0x8a,0xd3,0x11,0x53,0x61,0xef,0x33,0xd9 +.byte 0x65,0x0d,0x99,0x0b,0x39,0xa4,0x1b,0x4f,0x0b,0xa5,0xf1,0x37,0xa3,0x4f,0x54,0xa7,0x29,0xc1,0xae,0x88,0x5c,0x13,0x2f,0xb2,0xbf,0xcf,0x1b,0x0d,0xa0,0x68,0x21,0xe2,0x20,0x3f,0x02,0x9f,0x08,0x39,0xc6,0x20,0x2d,0x08,0x01,0x5d,0xf1,0x47,0xde,0x88,0xad,0x49,0x09,0xf7,0x1a,0x0c,0xa7,0x29,0x91,0xe5,0xfc,0xc5,0xde,0xd7,0x92,0x3f +.byte 0xe5,0x0c,0x91,0xea,0x24,0xfb,0x02,0x9a,0x13,0x3a,0x61,0x01,0x9d,0x7e,0x9d,0x11,0xf8,0xbd,0xe0,0x05,0xbb,0x13,0xf0,0x00,0x67,0x90,0x6f,0x80,0xe7,0x2e,0xfc,0xe0,0xea,0x8a,0x9d,0x2c,0x13,0x57,0x4c,0x78,0x1c,0x44,0xe2,0xa6,0x62,0x01,0x46,0xf8,0xbe,0xf4,0x51,0x32,0x15,0xd4,0x3c,0x7d,0x3b,0xcc,0xfd,0xc3,0x46,0x43,0xf1,0xfa +.byte 0x9e,0xee,0xad,0x47,0x8f,0x32,0x31,0x94,0x70,0x92,0xea,0x45,0xe3,0x63,0xd6,0x28,0x23,0xa5,0xdf,0x61,0xee,0x19,0x1a,0x5e,0xb0,0xe7,0x17,0xab,0xac,0xb4,0x03,0xed,0xf6,0x9e,0xba,0xdf,0x52,0x88,0xb7,0xca,0x7c,0x27,0xcd,0x7b,0xf8,0x1e,0x54,0x4b,0xe6,0xa3,0x91,0xf7,0xeb,0x22,0x65,0x95,0x13,0xe1,0xac,0xb6,0x22,0x80,0xe3,0xeb +.byte 0xf9,0xde,0xf1,0xb7,0x6a,0xfd,0xc7,0xb8,0x9b,0x9c,0x49,0x4f,0x84,0x7f,0x68,0x93,0x6c,0x3c,0xea,0xb1,0x8a,0xeb,0x23,0xca,0x2d,0x5e,0x29,0xb5,0x52,0x49,0x98,0x12,0x3f,0xed,0xf0,0xb7,0xbc,0x22,0x14,0x73,0x92,0x84,0x1b,0x3e,0x2f,0xed,0x24,0x1e,0x62,0xcc,0x09,0xe8,0x7c,0x5a,0x08,0xd4,0xc6,0xd9,0xd1,0x55,0x66,0x18,0x2c,0x6a +.byte 0x99,0xc3,0x0e,0x1e,0x7b,0xb7,0xd4,0xbd,0x0e,0x1f,0x22,0x85,0x09,0x2c,0xcf,0xff,0x79,0x9f,0x93,0xbe,0xec,0xed,0x63,0xb7,0x97,0xbb,0xeb,0xd6,0x70,0x76,0xa9,0x4f,0xb7,0x9a,0x60,0x5b,0x50,0xdf,0x85,0x46,0x69,0xa0,0x9a,0x86,0xe3,0xe2,0x13,0x2b,0x8c,0x0f,0x3b,0xab,0xa8,0xce,0xa3,0xb0,0x78,0x72,0x40,0xfb,0xd1,0x26,0x72,0xc1 +.byte 0x91,0x25,0x7b,0x29,0xde,0xcf,0x99,0xf3,0x8e,0x87,0x39,0x81,0x04,0xad,0x3b,0x11,0x6a,0xda,0x00,0xdd,0xe9,0x41,0xc1,0xd8,0xcc,0xf9,0x59,0xac,0x9b,0xb1,0x64,0x6f,0xb8,0xf4,0x9f,0x20,0xde,0x67,0x09,0x1b,0xdf,0x11,0xa5,0x94,0x56,0xab,0x76,0xba,0xc5,0xda,0x6c,0x86,0xe6,0xa4,0x73,0x59,0xa9,0xe3,0x68,0xb9,0xc0,0x50,0x1b,0x55 +.byte 0x21,0x9e,0xea,0x8d,0xcc,0x5d,0xee,0x88,0xe1,0x18,0x7c,0xcd,0x8f,0xff,0x18,0xbd,0x13,0xea,0x95,0xc4,0x8e,0xd3,0x92,0xfe,0x3d,0xda,0x6f,0xa5,0xbc,0xa0,0x77,0x5a,0x1d,0x61,0xff,0x7b,0x77,0xc4,0x06,0x25,0xc5,0xa7,0x76,0x36,0x55,0xe7,0xc0,0xf0,0x46,0x7e,0xca,0xe7,0xc1,0xe8,0x88,0x65,0xff,0xa7,0xb6,0x9c,0x83,0x1d,0x2e,0x6e +.byte 0xd6,0xd3,0x07,0x22,0x65,0x79,0x4f,0x3c,0x0a,0x5c,0x4f,0x95,0xb3,0x14,0x37,0x9b,0x0b,0x97,0x69,0xd9,0x5b,0x37,0x09,0xc3,0x70,0x5b,0x4f,0x11,0xcb,0xce,0xc0,0x06,0xf2,0xb9,0x32,0xdd,0x24,0x7b,0x8c,0xe6,0x0c,0x91,0x3b,0xa8,0xb0,0x82,0x56,0x4d,0xde,0xa0,0x5c,0x0b,0x5b,0x70,0x53,0x64,0x9d,0xab,0xbb,0x51,0x6b,0x8c,0x8f,0xe5 +.byte 0x1f,0xc0,0xb8,0xfe,0x1b,0xf6,0x24,0x26,0x62,0xcb,0x78,0x84,0x90,0x76,0x67,0x30,0x18,0x37,0xa9,0xca,0xb7,0x0d,0xac,0x17,0x86,0xb1,0x87,0x59,0x18,0xc3,0x9e,0x62,0x1b,0xb1,0x04,0x52,0xfc,0x7c,0x86,0xa0,0x37,0xb9,0x8b,0x7a,0x85,0x79,0x21,0xe0,0x0f,0x87,0x28,0x91,0xd0,0xe5,0x24,0x63,0x5c,0x7c,0xe8,0x47,0xfa,0x42,0x55,0xe9 +.byte 0x66,0xad,0xdf,0xc3,0x43,0x90,0x47,0x83,0x24,0x09,0x54,0x5f,0x14,0x27,0x53,0xb3,0x22,0x15,0x52,0x84,0x2f,0x61,0x8c,0x01,0x9e,0x34,0x61,0x3f,0x76,0x44,0x1c,0xca,0x79,0x2c,0x40,0x4e,0xa0,0x36,0x11,0xe0,0x23,0x0f,0xa7,0x78,0xf9,0xf9,0x2a,0x2c,0x98,0x5c,0xa9,0x2d,0x66,0xb9,0x87,0x43,0xd5,0xbc,0x64,0xe5,0x52,0x2f,0x1d,0xdc +.byte 0x1d,0xf4,0xb3,0x18,0x6b,0xd1,0x3b,0x8b,0xa3,0x47,0x65,0x62,0xcc,0xca,0x5f,0x00,0xbb,0x78,0x9d,0x35,0xd4,0x79,0x45,0x33,0xc7,0xa8,0x29,0x96,0x98,0xa4,0x23,0x2c,0x23,0x7f,0x5a,0x1d,0x09,0xb4,0xcf,0xac,0x54,0xcd,0x27,0xda,0x88,0x21,0xe2,0xb4,0x85,0xdc,0xc9,0x4a,0x6b,0xc4,0xfa,0x48,0xc5,0x91,0xc1,0x53,0x4b,0xa1,0x7a,0x9c +.byte 0x8a,0x7d,0x35,0x52,0xf1,0x58,0x9d,0x20,0x36,0xc2,0x78,0xdb,0x37,0xf8,0xa4,0x2f,0x50,0x98,0xb0,0x34,0x51,0x66,0x93,0xcf,0xe7,0xf0,0x06,0xf1,0xcd,0x0e,0x4f,0x33,0xcc,0x9b,0x73,0x3b,0xc9,0x51,0x63,0x6d,0x29,0x6b,0xf4,0x9d,0x2c,0x76,0x59,0xcd,0xfc,0x11,0x35,0x52,0xbd,0x3b,0x2e,0x7d,0x8a,0x0d,0xb0,0xbb,0x90,0x9b,0x9c,0xac +.byte 0x1c,0x80,0x89,0xd6,0x6f,0xaf,0xea,0x89,0x38,0x74,0xef,0x83,0x82,0x91,0xf7,0x74,0x96,0x30,0x40,0xe2,0x18,0x2b,0xb4,0xf6,0x15,0xf0,0x8e,0x63,0xe1,0x82,0x55,0x7b,0x65,0x70,0x33,0x14,0xef,0x7a,0x7c,0x2d,0xa9,0x17,0x1b,0x53,0x1e,0xf8,0x98,0x1b,0xbe,0xc8,0x00,0xf5,0xbf,0x79,0xe7,0x8e,0xf2,0xdb,0x59,0x0d,0x46,0xab,0x43,0xd0 +.byte 0xe4,0xa0,0xeb,0x29,0x6a,0x8b,0xc1,0x99,0xa6,0xcc,0x8e,0xe5,0xde,0x67,0xdf,0x49,0x09,0x62,0x8d,0x4b,0xa1,0x1c,0x3b,0x01,0xe2,0x95,0x65,0x10,0xa5,0x91,0xd0,0x48,0x35,0x96,0xcf,0xe4,0x51,0xd2,0x7f,0x93,0x49,0xab,0x1a,0xba,0x08,0x33,0x54,0x34,0xd7,0x00,0xc9,0xa0,0x07,0x03,0xc7,0x8a,0x65,0xa2,0x84,0x60,0xcd,0xaa,0xa2,0x46 +.byte 0x8c,0x67,0xd9,0xc1,0xe7,0x58,0xc5,0x1d,0xc0,0xb3,0xc6,0xb2,0x2a,0xfb,0x70,0x04,0xa2,0x25,0x7f,0x75,0x3c,0xd5,0x8e,0x9c,0x33,0xa2,0xdc,0x20,0x4c,0x26,0x5b,0xbe,0xd9,0x00,0x5d,0xa2,0xbd,0x42,0xbd,0x0d,0xd6,0x52,0x79,0xb5,0x67,0xf6,0x27,0x62,0xc8,0x64,0x05,0xc5,0x0f,0xae,0xe1,0x78,0x39,0xd1,0xb5,0x28,0xe9,0xd4,0x2a,0xaa +.byte 0xd4,0xc4,0x3e,0x43,0x27,0x83,0xfa,0xdb,0x46,0x73,0x20,0xcd,0x2c,0xba,0x33,0xb4,0x77,0x10,0x32,0x3d,0x8e,0x56,0x88,0x81,0xe1,0x4c,0x8b,0x46,0x60,0xcb,0xb7,0x67,0xd7,0x7b,0xc2,0x47,0x7d,0xd8,0x2d,0x4c,0x09,0x9f,0x07,0x8e,0x34,0x45,0xf4,0x50,0x69,0xfd,0x35,0x0a,0x09,0x9e,0xac,0x49,0x5f,0xdf,0x72,0x84,0x97,0x93,0x30,0x2c +.byte 0xc6,0x20,0x6f,0xb5,0x18,0x03,0xb6,0x30,0x23,0xc8,0xcd,0xa1,0x43,0xbd,0xbb,0x6f,0xde,0xb3,0xcb,0x1c,0xdd,0x41,0x71,0xfa,0x37,0xa7,0xa9,0x57,0x5a,0xf7,0xee,0xcd,0xb1,0xc1,0xb6,0x78,0x1c,0xe3,0xde,0x5c,0x02,0xc8,0xce,0xb7,0x8e,0x72,0xce,0xfd,0x79,0xcf,0x1a,0xef,0xcb,0x5b,0x5d,0x3c,0x1d,0xc8,0x1e,0x9f,0x67,0x26,0x86,0xd3 +.byte 0x3b,0x98,0x49,0x04,0xcd,0x1b,0x48,0x7c,0xa6,0xbe,0x37,0x0b,0x19,0xb1,0xb7,0x8a,0x74,0x0a,0xd9,0x4f,0x7b,0xbb,0x8e,0xc6,0x9b,0xdd,0xbc,0x61,0xfd,0xdd,0x86,0x7e,0x70,0x2e,0xe4,0x94,0xb4,0x62,0x47,0x6b,0x7c,0x92,0x41,0xda,0x05,0xdc,0xaf,0x5c,0x93,0xbc,0x7d,0xad,0xce,0x44,0x9e,0x27,0x1c,0x74,0x30,0x01,0xf2,0x8a,0x22,0xce +.byte 0x88,0x61,0xf5,0xb8,0xe2,0xf0,0xca,0x14,0x21,0x53,0xd3,0xbe,0x95,0x8f,0x52,0x10,0x21,0xc5,0x25,0x16,0xa1,0x4f,0xef,0x9a,0x6f,0xce,0xe9,0xee,0x06,0xa8,0x32,0xa4,0xac,0xee,0xd8,0x95,0x0b,0x65,0x10,0xbc,0xb3,0x15,0x48,0xf9,0x96,0xee,0xde,0x5d,0xf6,0x38,0x5f,0x32,0x70,0xd1,0x29,0xa8,0x1d,0xdc,0xf4,0x34,0x2d,0x0c,0x93,0x48 +.byte 0x8c,0x40,0xed,0x35,0x41,0xfe,0x4b,0xab,0x20,0x7d,0x95,0x74,0x02,0xe5,0x71,0x76,0x7e,0x59,0x35,0xb3,0xd7,0x43,0x1f,0xd4,0xe6,0x02,0x86,0xba,0x4f,0x53,0xd9,0xc3,0x7d,0x7f,0x3d,0xb6,0xd8,0x92,0x07,0x89,0x99,0x46,0xf8,0x09,0xcd,0x19,0x43,0x93,0xa7,0xc1,0xb2,0x5d,0xec,0xbf,0x09,0xf4,0xba,0xfc,0xf7,0xf1,0xa7,0x2e,0xfe,0x71 +.byte 0x04,0x58,0xab,0x16,0xd7,0xc0,0xf7,0x03,0xd4,0xc4,0xb9,0xe4,0xd8,0xfc,0x5b,0x66,0xa6,0xb3,0x6a,0x94,0x0e,0xba,0x8c,0x54,0x5c,0x8c,0x02,0x0a,0x33,0xcb,0xde,0x1c,0xad,0x6d,0xef,0x48,0x05,0xa6,0xca,0x9a,0x27,0xd6,0x1c,0xc3,0xea,0x3a,0x46,0x20,0xec,0x72,0xc4,0x94,0x89,0x7e,0xba,0xa9,0x2f,0xe5,0xec,0x1a,0xe4,0x50,0x54,0xeb +.byte 0xd9,0x5a,0x08,0xc5,0x84,0xc1,0x9a,0xdf,0xb0,0xd4,0x9a,0x6d,0xa2,0x93,0x52,0xd2,0x4d,0x69,0x88,0xc8,0x40,0x2d,0x26,0xbd,0x7a,0x37,0x04,0x21,0xe1,0x9d,0xc9,0xed,0xda,0x7a,0x4c,0x11,0x49,0x14,0x42,0xa1,0xdb,0x6e,0xed,0x1b,0x37,0xbf,0x09,0xac,0x35,0xda,0x80,0xf6,0x75,0xd4,0x32,0x54,0xb5,0x18,0xe8,0x79,0x25,0xc4,0x95,0xe8 +.byte 0x74,0xcf,0x6d,0xac,0x34,0x1f,0xea,0xd4,0x2e,0xd1,0x77,0x5e,0x90,0x8f,0x12,0x51,0xbb,0x3c,0xdf,0xe6,0xf4,0x49,0x8c,0x0f,0x9a,0x8e,0xe3,0x96,0xbd,0xba,0xe6,0x47,0x4b,0x50,0xc7,0xa9,0x29,0xea,0x09,0x5d,0xef,0x3c,0x91,0x48,0xc6,0x37,0xfd,0xac,0x7b,0xe5,0x04,0x25,0x93,0x0b,0xe3,0xce,0x32,0x46,0x38,0x81,0x97,0x57,0xbe,0x1f +.byte 0x3c,0x61,0x2d,0xd1,0x4e,0xca,0xbb,0x44,0xc6,0xfd,0xdf,0xdd,0x11,0xbf,0xbf,0xa8,0xc0,0x32,0x67,0xc1,0x2e,0xd7,0xbe,0x3c,0xe3,0xcb,0x57,0xa5,0x6d,0xbb,0x8e,0x0f,0x69,0x22,0x42,0xef,0x53,0x0f,0xce,0x09,0x6a,0xda,0xbf,0xd6,0xed,0x61,0x67,0x82,0x83,0x13,0x63,0x97,0x7d,0x1a,0xad,0x34,0x77,0x37,0xa6,0xe0,0x89,0xaa,0xd4,0xb6 +.byte 0x8f,0x93,0xff,0xb8,0x8f,0x63,0x14,0xfd,0x17,0xff,0xe5,0x7c,0x83,0x23,0xaa,0xe0,0xb9,0xd9,0x94,0x3a,0x1a,0xe7,0xa5,0xbd,0xa6,0x2b,0xd3,0x49,0xca,0xeb,0x7d,0x87,0x1d,0x54,0x16,0x93,0xec,0x14,0x8b,0x77,0x3c,0xb4,0xbe,0x33,0x76,0x5e,0xcb,0x33,0x27,0xd3,0x20,0xd6,0xed,0x0c,0x66,0xb8,0xe0,0x00,0xa6,0x76,0xcd,0x8b,0xb4,0xef +.byte 0x11,0xbc,0xe5,0x59,0xcf,0x1d,0xf5,0x15,0x58,0x4a,0xe1,0xfd,0x87,0x8c,0x7b,0xb9,0xa4,0x42,0x5a,0xed,0x51,0x7e,0x8d,0xa6,0x19,0xaa,0xc4,0xa6,0x14,0x74,0x45,0xb1,0xda,0x87,0x0f,0xd7,0xe7,0x66,0x3b,0xcd,0x04,0x02,0x14,0x20,0x41,0x15,0x4c,0x33,0x79,0x80,0x7d,0xd4,0x44,0x2c,0xab,0x6c,0xf4,0xa8,0xd4,0x31,0x43,0x7b,0xa7,0xc7 +.byte 0x65,0x0e,0x32,0xc8,0xc8,0x6d,0xf5,0x65,0x1b,0x26,0xf1,0xe4,0x68,0x15,0x88,0x1b,0x00,0x60,0x23,0x31,0xd7,0x4b,0x57,0xda,0xf1,0x19,0xa9,0xd9,0xaf,0xe6,0xa9,0x1e,0x2c,0x0d,0x23,0xe4,0x5b,0xcb,0x43,0x38,0xf0,0x93,0xd3,0xfb,0x6a,0x9b,0x83,0x30,0x55,0x96,0x9f,0x53,0x06,0x3f,0xaf,0x40,0x69,0xef,0x9a,0x47,0x6b,0xba,0x7c,0x10 +.byte 0x10,0x44,0x89,0xfa,0xb9,0x9e,0x70,0xed,0x25,0x59,0x68,0xae,0x9b,0x17,0xcf,0x80,0x6f,0x34,0xb8,0x07,0x40,0xe5,0x27,0x6d,0xcd,0x46,0x2c,0x36,0x90,0xf3,0x83,0x74,0x68,0x35,0xf2,0x05,0xa8,0xdf,0x4e,0x34,0xc5,0xb4,0xeb,0x5a,0x7d,0xe6,0x10,0x8a,0x23,0x54,0xeb,0x9b,0x27,0xf2,0x07,0xee,0xf9,0x05,0xc2,0x5a,0x88,0xbd,0x49,0x2e +.byte 0x1b,0x00,0x31,0x68,0x4a,0xc9,0x3a,0xc5,0x93,0x82,0xa8,0x39,0xba,0x55,0xcd,0xc1,0xda,0x49,0xc2,0x4c,0xf4,0x93,0x00,0xcf,0x61,0xa4,0xbb,0x8c,0x64,0x33,0x90,0x14,0x6d,0x1d,0xad,0x75,0x97,0xd9,0x1d,0xfb,0x27,0x67,0x43,0x04,0xdc,0x4e,0xdf,0x0e,0x0c,0x7e,0x1c,0x89,0xfe,0x31,0xb7,0x9b,0x07,0x5e,0x99,0x08,0x22,0xef,0x6e,0x4d +.byte 0x8b,0xd6,0x27,0xe6,0x24,0x1a,0x28,0xb0,0x22,0xa5,0x69,0x17,0x82,0x46,0xe3,0x90,0xe8,0x04,0xae,0x90,0x66,0x14,0xec,0xa2,0x1b,0x7e,0x09,0x13,0x32,0x9d,0xec,0x8b,0x51,0x5f,0xa8,0x96,0x8f,0x4c,0xc6,0xbd,0x5c,0x70,0x29,0x21,0xac,0xe9,0x6e,0xb0,0x0c,0x61,0x50,0xba,0xcc,0x55,0x71,0xda,0x2a,0x92,0x86,0x0c,0xff,0xaf,0x7a,0xcf +.byte 0xaf,0x2a,0xbd,0xd6,0x15,0xa4,0x4c,0x2e,0x76,0x0d,0xcf,0x10,0x11,0x4a,0xd1,0x89,0xdd,0x46,0x5f,0x6b,0x5a,0x02,0x05,0x49,0x6f,0x98,0x6a,0xa7,0x8a,0x66,0x87,0x59,0x23,0xb5,0x3f,0x2e,0x95,0x73,0xfe,0x48,0xe9,0x0d,0x17,0xa6,0xa5,0x4e,0x40,0x98,0x79,0x40,0x1a,0x10,0x1d,0x84,0xdd,0x6f,0x17,0xa7,0xb7,0xfb,0x49,0xbd,0x54,0x97 +.byte 0x0f,0x42,0x25,0x95,0x83,0xf0,0x97,0xe7,0x4c,0x24,0xb5,0xe8,0x23,0x0a,0xd6,0xbf,0xef,0x2c,0x03,0x4f,0x87,0x59,0xe8,0x80,0x87,0xcc,0x51,0x1b,0x94,0xd8,0x60,0xe7,0x10,0x4d,0x01,0xfd,0x83,0xf2,0xd8,0x8d,0x1b,0x33,0xbf,0xaf,0x36,0x41,0x47,0x51,0xe0,0x45,0x2a,0x05,0x5f,0xe1,0x92,0xf8,0xa5,0x15,0x46,0x35,0xd8,0x9b,0xe0,0xff +.byte 0xee,0xa6,0x4e,0x7d,0xfd,0x96,0xa5,0x75,0xdf,0x7e,0xb0,0x7d,0x14,0x73,0xdd,0xbe,0x17,0x6d,0xdd,0xec,0xac,0x9a,0x92,0x68,0xe3,0x44,0x16,0x63,0x22,0xa8,0x15,0x58,0x8c,0x11,0x23,0x46,0x18,0xae,0x47,0x39,0x87,0xc7,0x4c,0x30,0x09,0xce,0xe5,0xc4,0xd8,0x82,0xc6,0xc6,0x3d,0x31,0xf6,0x0f,0xb5,0x69,0x61,0x63,0x88,0xd6,0xb8,0xda +.byte 0x89,0x29,0x87,0x69,0x6e,0x3f,0x55,0x2f,0xbc,0x91,0x91,0x43,0x7d,0xb3,0x7b,0x99,0x5a,0x5a,0xb0,0x7d,0x90,0xa7,0xe7,0x30,0x0d,0x32,0xb2,0x43,0x43,0x78,0x59,0x6e,0xbb,0xd7,0x76,0xd4,0x5b,0x4d,0xc4,0xa9,0x99,0xdd,0xd3,0xce,0x3d,0x13,0x41,0x38,0x33,0xed,0xb8,0x76,0x1a,0xbb,0xfd,0x26,0xcd,0x69,0x89,0x22,0x16,0x9a,0x21,0x35 +.byte 0x38,0x77,0x14,0x10,0x42,0x17,0x1f,0xa1,0xbf,0x55,0xb4,0x51,0x62,0x15,0xac,0xd0,0xa2,0x71,0xe4,0x32,0x89,0x33,0x8b,0x74,0xc6,0x61,0x38,0xd0,0xfe,0x28,0x69,0xe6,0x88,0x1b,0x11,0x7e,0x46,0x39,0xba,0x24,0xdd,0x1f,0x61,0xf4,0x74,0xad,0x58,0x94,0xa9,0x3e,0xc7,0x2a,0x9e,0xc0,0xe1,0x1c,0xee,0x21,0xab,0x3e,0x65,0x0c,0xe8,0xd8 +.byte 0x71,0x52,0xf3,0x6c,0x64,0x53,0x75,0x17,0x87,0x55,0x14,0x42,0x25,0x7f,0xe7,0x0d,0x89,0x1b,0x77,0x26,0xc4,0xaa,0xcc,0x91,0x47,0xe5,0x54,0xae,0x1a,0x0d,0x04,0x99,0xeb,0x56,0xd8,0xb4,0x6d,0xeb,0xec,0x2f,0x6c,0xc5,0x8e,0x76,0xe1,0xa0,0xa7,0x42,0x06,0xc9,0xc3,0x03,0xee,0xa9,0x9b,0x1e,0xfc,0x11,0xf5,0x2f,0x2b,0x14,0xb8,0x9f +.byte 0x87,0x61,0x9b,0xc7,0x38,0x0e,0x58,0xf1,0xd4,0x36,0xca,0x82,0x85,0x9c,0xde,0xec,0xd3,0x1e,0x29,0x4e,0x70,0x9e,0x9a,0xe0,0x8b,0x6f,0xfe,0xd0,0xe9,0x95,0x51,0xcf,0x36,0x31,0x9c,0xff,0x63,0xc6,0x04,0x8e,0x61,0xc2,0xcb,0x3a,0xfa,0xd0,0xd7,0x29,0xbd,0xe7,0x8a,0x2b,0x8e,0xa0,0xac,0x58,0x93,0xb3,0x52,0xca,0x80,0x17,0xd2,0x2d +.byte 0x93,0x5f,0xe0,0x8a,0x47,0x3c,0x67,0x95,0x64,0x91,0xa4,0x76,0xa4,0x5f,0xfa,0x93,0x4d,0xc7,0x6e,0x5d,0x23,0x9f,0xe1,0x4a,0x16,0xff,0xa5,0xf0,0x94,0xa8,0x02,0xcc,0x9a,0x84,0xd5,0x9d,0xb6,0xe5,0x7c,0x76,0x3f,0xc9,0xfd,0xdc,0x8e,0x59,0x9a,0x22,0x18,0x3c,0xe6,0x90,0x85,0x10,0x73,0x2d,0x65,0xa7,0xa7,0xe1,0xeb,0xc5,0x05,0x24 +.byte 0x1e,0x0b,0x31,0x19,0xb5,0xb0,0x8d,0xc0,0xb5,0x04,0xfe,0x9d,0xfa,0xf7,0xcd,0x71,0x29,0x40,0x19,0x23,0xed,0x2c,0xdb,0x89,0x89,0x8d,0x69,0x22,0x4c,0x9c,0xa7,0xf7,0xb1,0x56,0x87,0xa3,0x44,0xa9,0xa3,0x16,0x28,0xce,0x94,0x40,0x6f,0x71,0x77,0x0e,0x6d,0xe9,0x78,0xa2,0x2a,0x17,0x45,0x03,0xeb,0x1e,0xf1,0xfa,0x56,0x3e,0xa7,0x6b +.byte 0x08,0x06,0x6a,0xcb,0x8f,0x5e,0x0f,0xd3,0x6e,0x4b,0x21,0x31,0x73,0x50,0x94,0x56,0xf9,0xb9,0xc7,0x38,0x69,0xe8,0x09,0x3f,0x03,0xb3,0xb5,0xe8,0x2a,0x5e,0xf6,0xad,0xae,0x6f,0xab,0x6a,0x49,0xdd,0x93,0x6d,0xfb,0x8b,0xde,0xea,0x8b,0xb0,0xa1,0x44,0xf0,0xb3,0xf6,0xaa,0xe3,0xc8,0x04,0x87,0x9f,0x8b,0xee,0xab,0x13,0x1d,0x2d,0xeb +.byte 0x09,0x62,0x21,0x49,0x5f,0xb6,0x95,0xab,0xc4,0xee,0x69,0xfb,0x31,0xff,0xbf,0x1a,0xa6,0x4c,0x67,0x66,0x84,0xe6,0x0c,0xb7,0xb2,0x3e,0x3f,0xa4,0xb3,0x52,0xde,0x15,0xc9,0xa7,0xa9,0xb5,0x0d,0xe5,0x0b,0x99,0xa6,0xb6,0x8f,0x69,0xc5,0x6d,0x6c,0xbb,0x83,0x89,0x4e,0xfc,0x49,0x79,0x4d,0x46,0x31,0xa0,0x09,0x5f,0x5d,0xd0,0x5b,0x80 +.byte 0xa1,0xf4,0x36,0x48,0x97,0x6a,0xfd,0x34,0xcb,0x20,0xa8,0x01,0x25,0x04,0xe7,0x13,0x12,0x87,0x66,0x27,0x96,0x36,0xba,0x92,0xbd,0xda,0x94,0x11,0xef,0x90,0xbd,0xbc,0x9e,0xf9,0x63,0xb3,0xa6,0xc1,0xbb,0x46,0xe8,0x86,0x3f,0x2d,0xf9,0x11,0x3a,0x23,0xa8,0x7a,0x33,0x41,0x3e,0x2e,0x5d,0xde,0xc0,0xd2,0x23,0xca,0x41,0xa0,0xb9,0x70 +.byte 0x6d,0x31,0xf3,0x89,0x87,0x9b,0x72,0xd9,0x15,0x4d,0x8b,0x51,0xdd,0x56,0xa1,0xb4,0x68,0x52,0x65,0x81,0x12,0x46,0xea,0x24,0xb4,0x34,0xcc,0xa0,0xdb,0x7d,0x96,0xd9,0x8e,0x64,0x61,0x10,0x7c,0x2a,0x00,0x4d,0x82,0x61,0x54,0xa4,0x70,0x3d,0x9c,0xa5,0x0b,0xd2,0x08,0x71,0xa8,0x94,0xb1,0xb4,0x30,0x61,0x59,0x9f,0x72,0x61,0x56,0x2d +.byte 0xa3,0xf4,0x9d,0x1c,0xfc,0x49,0x9d,0x39,0x27,0xcb,0x54,0xb2,0xce,0x3c,0xb6,0x76,0xe5,0x8e,0xa5,0xe7,0x08,0xd4,0xc7,0x2c,0xa6,0x28,0xc8,0x3e,0x22,0x14,0x06,0x75,0x68,0x0d,0x6b,0xb5,0xa3,0x68,0x14,0x17,0xfe,0xb8,0xcc,0x26,0x5b,0x9d,0x0b,0xcc,0x3e,0xd7,0x6c,0xe0,0xec,0x5e,0x1e,0x1e,0xb8,0x9a,0xbe,0x91,0xb5,0xa6,0xb5,0x83 +.byte 0x28,0xc2,0x35,0x65,0xd3,0xde,0xdd,0x71,0x29,0x13,0xc1,0xee,0x78,0x22,0x34,0x0b,0x77,0x3a,0x48,0x98,0x26,0x43,0xc2,0xce,0x03,0xe8,0x75,0xf8,0x8a,0xdf,0x6a,0xb0,0xb4,0x8c,0x11,0x8c,0xe5,0x95,0x96,0x17,0xfb,0x06,0x5e,0x8f,0x36,0x10,0xc5,0x04,0x43,0x1b,0xed,0xd3,0xad,0xd4,0xa4,0xe0,0x17,0x85,0xed,0x9b,0xd8,0xae,0x98,0x46 +.byte 0x58,0x57,0x0e,0x46,0xea,0x3f,0x07,0x6d,0x0e,0x46,0xda,0x2f,0x68,0x2b,0xd6,0xe7,0x0d,0x4b,0xbe,0x32,0xee,0x10,0x73,0x18,0x7d,0x6b,0x2d,0x04,0x27,0x72,0xb1,0xe1,0xbf,0x89,0xaa,0x4d,0x1a,0xfc,0xbd,0xf2,0xc3,0x9f,0xf0,0x01,0x85,0x62,0x09,0x4d,0x08,0x2c,0x57,0x9a,0x7b,0xad,0x0b,0x79,0xff,0x14,0xa1,0x45,0xde,0x21,0x8f,0xe2 +.byte 0x93,0xd0,0x35,0x26,0xc3,0xbc,0x8c,0xb7,0x57,0x6a,0xdf,0x98,0xa7,0x75,0xc6,0xf6,0x4b,0x5f,0x91,0x6e,0x71,0x3a,0x5c,0x5f,0x57,0x63,0x34,0x87,0xf8,0x20,0x6a,0xa1,0xbf,0xf8,0xca,0x8e,0xf9,0xa9,0x10,0x8b,0xab,0x0b,0xc2,0xcc,0x71,0x89,0x7c,0xef,0x70,0x3a,0xb0,0xf6,0x90,0xcc,0x6b,0x2c,0xcc,0x8b,0x2a,0x21,0x78,0x23,0xa0,0x71 +.byte 0x8c,0x7b,0xc1,0x0f,0x27,0x72,0x40,0xe4,0x9e,0x35,0xf3,0x0a,0xc0,0x7e,0x7f,0xe5,0x9b,0xdb,0x93,0x49,0x08,0xc3,0x6b,0xb7,0xea,0xea,0xd4,0x5a,0x96,0x97,0x3c,0xdf,0xc7,0x02,0x39,0x9f,0xa3,0xca,0xdd,0x62,0xf3,0x68,0xc7,0xae,0x37,0xc1,0x35,0x73,0xb2,0x5d,0x99,0xe4,0xae,0x27,0x55,0x5e,0x6a,0xae,0x6f,0x1a,0x95,0x51,0xb1,0x3b +.byte 0xd7,0xb4,0x4d,0x3d,0x88,0x54,0x01,0xbe,0x2c,0x12,0x17,0x29,0x4f,0xf3,0xed,0x5a,0x1f,0xa9,0xf0,0x67,0xbd,0x7c,0xad,0xe5,0x58,0x52,0xd4,0xd1,0xfe,0x1e,0x1b,0xd6,0xce,0x7c,0xc3,0xa2,0xa9,0x72,0x9b,0x6a,0xe5,0xf9,0x39,0x22,0xaa,0x7f,0x2e,0xa2,0x53,0x75,0xf0,0x99,0x2e,0x36,0x86,0x83,0x10,0x63,0xd7,0xac,0xa3,0x52,0xa6,0x23 +.byte 0x80,0x46,0xe4,0xa9,0x07,0x79,0xe1,0x61,0x75,0xbf,0x08,0x31,0x6c,0xdd,0xe1,0x30,0xd0,0x35,0xc2,0xbd,0x30,0xb8,0x85,0xf3,0xd2,0x2c,0x90,0x7a,0xf0,0xd3,0x80,0xe5,0xf1,0xc2,0x58,0x3d,0xf7,0x3c,0xbc,0xff,0x03,0x4d,0xf7,0xad,0x2f,0xa6,0xfe,0x73,0xde,0xa8,0x60,0xd7,0x89,0x4a,0xcf,0x3d,0xf3,0xab,0x62,0xfa,0x9d,0x46,0xad,0xd0 +.byte 0x97,0x6f,0x89,0x84,0x16,0x9b,0x84,0xb2,0x6c,0x63,0x6d,0x29,0xee,0x8e,0x97,0x3c,0x48,0x19,0x92,0x62,0xdc,0x1d,0x35,0x9d,0xec,0x01,0x00,0x64,0xbf,0x4d,0x8b,0xa3,0x13,0x48,0x9f,0xb4,0x01,0x0d,0xb1,0xc4,0xf2,0xf2,0x6a,0x84,0x1a,0x07,0x3c,0x46,0xa6,0xb5,0x41,0x9a,0x32,0x7e,0xc3,0x4f,0x87,0x95,0x71,0x7a,0xbf,0x74,0xf8,0x0b +.byte 0xfb,0xa5,0xde,0xa8,0x35,0xf1,0xcb,0x04,0x8d,0x8b,0xd3,0xb0,0xc8,0x1d,0x6c,0xaf,0xb4,0x21,0x79,0x1c,0x34,0x71,0x2f,0xf5,0xc4,0xbe,0xad,0xbc,0xaf,0x2f,0x54,0x81,0xd9,0xf8,0xff,0x59,0xf9,0x4e,0x62,0x9f,0x7d,0x7c,0xe9,0xdc,0x67,0xae,0xa3,0x32,0x4b,0xf7,0x4e,0x53,0x4c,0x55,0x7d,0xc5,0xdd,0xd4,0x5d,0x93,0xb8,0x98,0x3e,0xd3 +.byte 0x15,0x65,0x52,0x78,0x5a,0xd2,0x21,0x84,0x5d,0x28,0xaf,0x44,0x7d,0x18,0xf8,0xdd,0x5c,0xc3,0x6e,0xc8,0x05,0x05,0x30,0xd0,0x82,0xf8,0x00,0x0f,0x3d,0x5c,0x62,0x7e,0xa6,0xd5,0x7b,0x9f,0xb1,0x44,0xb7,0x0d,0x22,0x81,0xe1,0x4a,0x2b,0x79,0x7e,0x39,0x4d,0x8a,0x9a,0xfd,0x94,0x0c,0xf7,0x23,0x10,0x99,0xd2,0xd2,0x8b,0x98,0xe5,0x9d +.byte 0xb0,0xbf,0xcf,0x06,0x08,0x80,0x32,0x69,0xfd,0x81,0x5f,0xb3,0x66,0x11,0x63,0xeb,0x30,0x1d,0xcd,0x5b,0x5b,0xec,0x0c,0xca,0x30,0x37,0xa0,0x82,0x79,0x75,0x87,0xc1,0xfa,0x5b,0x38,0x4b,0xe3,0xea,0x46,0x49,0x36,0x92,0x92,0xf0,0xc9,0x15,0xa5,0xec,0x9e,0x21,0xb6,0x9f,0xb4,0x6d,0xf6,0xef,0x5c,0x2f,0x7d,0xa4,0xb3,0x25,0xfb,0x13 +.byte 0x40,0xe1,0xa0,0x20,0x4a,0x3a,0xe2,0x3e,0xf5,0xe0,0x68,0x61,0x11,0x9a,0xfb,0x1e,0xe8,0x1b,0xe0,0x17,0x9c,0x8a,0xe5,0x53,0x74,0xdd,0xec,0xc6,0x03,0xc6,0xd0,0x9b,0xc2,0x0b,0x77,0x4c,0x36,0x2b,0xac,0x4e,0x4d,0xd2,0x26,0x70,0x39,0x96,0xb4,0x11,0x1a,0x5b,0xcc,0x3f,0xb9,0xcf,0x0d,0x04,0x55,0x05,0x00,0x66,0x8f,0xa9,0xec,0x31 +.byte 0xe5,0x47,0x4c,0x9b,0xb7,0x6e,0xa5,0xe7,0x9e,0x70,0xf4,0x02,0x2a,0x3c,0xa2,0x03,0x04,0x30,0x9e,0x3f,0x7c,0xaa,0x0a,0x8f,0x55,0x61,0xca,0x50,0x35,0xe6,0xa4,0x24,0x61,0x26,0x31,0x9e,0x9e,0x77,0x0d,0x15,0x3a,0xc0,0x88,0x32,0xb5,0xbb,0x3d,0x3e,0x59,0x25,0x52,0x81,0x2e,0x4b,0xc6,0x5d,0x9f,0x87,0x0f,0x1f,0x5e,0xec,0xdd,0xbe +.byte 0x32,0x6c,0x71,0xef,0xd2,0x9c,0xfd,0x70,0xc8,0xf6,0x1f,0xb9,0xc9,0xdd,0x4d,0x39,0x61,0x92,0xbd,0x0c,0x48,0x63,0x4b,0xd2,0x2b,0x8c,0x4b,0x35,0xb1,0x8e,0x04,0x44,0x3c,0xe1,0xde,0xfd,0x6e,0xde,0xeb,0x94,0x51,0xea,0x36,0x7b,0xc6,0x87,0x15,0x34,0x68,0xa0,0xb8,0x94,0xb6,0x56,0x33,0xf4,0xab,0x84,0xed,0x1c,0x36,0x91,0xa7,0x1b +.byte 0x03,0xca,0x48,0x64,0x16,0x5b,0x4b,0x69,0x47,0xae,0xd7,0xc9,0xcf,0x74,0xd2,0xbd,0x60,0x04,0x7c,0x66,0xe9,0x12,0x92,0x40,0x78,0x23,0x0b,0x5b,0xa0,0xda,0xf7,0xe4,0x9a,0xad,0x9c,0x31,0xe7,0xaa,0xad,0x5a,0xc3,0x45,0x00,0x6c,0xd3,0x4d,0x93,0xdf,0xb6,0x68,0x11,0x3f,0x2a,0xbc,0x9a,0x8d,0xeb,0x0f,0xb5,0xa9,0x8e,0xa5,0x2c,0x99 +.byte 0x94,0x8d,0x21,0xa9,0x41,0x6b,0x11,0x2e,0x02,0x21,0xd8,0xc1,0xbc,0xf0,0x2a,0x87,0xae,0x35,0xa9,0x78,0x5c,0x43,0xb8,0xb7,0x63,0x2d,0x09,0x31,0xae,0x6f,0xfc,0x39,0x7b,0x18,0xc3,0xce,0xe3,0xfa,0x51,0x70,0xc7,0x6b,0x5e,0xc3,0xce,0xc8,0xa2,0x3a,0x66,0x9e,0xfe,0x45,0xb4,0xa2,0xaf,0x81,0x03,0x74,0xbf,0x0c,0x65,0x4c,0x30,0x27 +.byte 0xd5,0x34,0x29,0x2d,0x83,0xa8,0xb9,0x1d,0xf8,0x12,0x09,0x51,0xdd,0x0e,0x66,0x95,0xf3,0x94,0xaa,0x83,0x3a,0x6f,0x8a,0x7c,0x3a,0x29,0x82,0xbb,0x80,0xa1,0x37,0x8c,0x79,0xf4,0x4a,0xa8,0xe4,0x17,0x72,0x77,0xee,0xc4,0xaa,0x25,0xd3,0x8f,0x2e,0xaf,0xb9,0xb2,0x3c,0xa6,0xd5,0x72,0x97,0x07,0x23,0x38,0xae,0x9e,0x22,0x08,0x85,0x70 +.byte 0xfa,0xff,0x38,0xe6,0x96,0x9f,0x2c,0x11,0x14,0x16,0x9a,0xfa,0x5a,0x7b,0x05,0x31,0x3e,0x20,0xbf,0x4d,0x87,0xaa,0xba,0x94,0xcd,0xdb,0xeb,0xec,0x29,0x58,0x4e,0x43,0x12,0xe8,0xf9,0x01,0x50,0xc8,0x51,0x7a,0x61,0x12,0xe9,0xed,0xc2,0xd6,0x2e,0xd3,0xed,0x54,0x72,0xf7,0x1b,0x0c,0x8c,0xb4,0x65,0xea,0x22,0x31,0x22,0xeb,0xcd,0x53 +.byte 0x66,0xf1,0xa5,0x34,0xe9,0x81,0x74,0xcb,0xb5,0x6b,0x45,0x71,0x69,0x6d,0x84,0xe8,0xc6,0x86,0xc9,0xdd,0x0c,0xa4,0x30,0x12,0x08,0x42,0x10,0x6b,0xcd,0x65,0x6c,0xfd,0x9c,0xde,0x77,0x3c,0x32,0x09,0xef,0x99,0x27,0x0e,0x4a,0x72,0x03,0x8d,0xb5,0x68,0xa0,0x67,0xf7,0xc2,0xae,0xb8,0xce,0x41,0x70,0x4e,0xdd,0x13,0xcb,0x3f,0x05,0x4e +.byte 0xf4,0xbc,0x88,0x98,0x2f,0x42,0x4e,0x5f,0x3e,0xcb,0x2c,0xd3,0x2f,0xb8,0x92,0xbb,0xd8,0x95,0xc8,0xaf,0xa9,0x44,0x8b,0xf0,0x2f,0x81,0xd4,0xe7,0x06,0x19,0xf7,0xa7,0x0a,0x73,0x3e,0x30,0xd9,0x00,0xe4,0x2d,0x76,0xb1,0x0d,0xfa,0x12,0x1f,0xbe,0x59,0x4f,0xf7,0xc8,0x5b,0xab,0xd7,0x16,0x3d,0x7e,0x97,0x9e,0xec,0xf8,0xcb,0x31,0x2e +.byte 0xe0,0x41,0x0b,0x00,0xa6,0x6d,0xe9,0x5e,0xd5,0x4a,0xc5,0xbf,0x1c,0xcc,0xa5,0x71,0x94,0x29,0x3d,0x17,0x43,0x27,0x63,0xc4,0xc7,0x8f,0x1b,0xb7,0x5f,0xcf,0xdf,0x8e,0x6a,0x69,0x87,0xc1,0x29,0xab,0x7b,0x8d,0xdf,0x07,0x95,0x50,0xa3,0x1c,0x8e,0xdc,0x7f,0x8a,0x21,0x37,0x1e,0x26,0xa7,0x67,0x28,0xb2,0xc8,0x23,0x5a,0x1d,0x94,0x46 +.byte 0x1b,0x3e,0x72,0x87,0x73,0x08,0xe2,0x3b,0x46,0x51,0xbe,0x5b,0xa9,0x72,0xb9,0xf8,0x45,0x6d,0x0c,0x89,0x80,0x0d,0x7a,0xfb,0x4c,0x3f,0x7f,0x3d,0x29,0xff,0xef,0xb2,0xec,0x23,0xc2,0x26,0xcf,0x8c,0x2e,0x28,0xbf,0xc5,0x68,0x47,0xd9,0x49,0x95,0xf1,0x67,0x7e,0x3a,0x48,0xe2,0x43,0x5c,0xc8,0x95,0x5b,0xb2,0xf3,0x22,0xc9,0x73,0x91 +.byte 0xb5,0x78,0x96,0x1b,0x9a,0x75,0x5f,0xb2,0x6b,0x8c,0x66,0x8c,0x8e,0xc1,0xe1,0xde,0xd6,0x64,0x31,0xe1,0x7b,0x12,0xd2,0x85,0x8f,0x52,0x68,0xec,0x80,0x26,0x3d,0xcc,0x9b,0xe3,0x57,0xbe,0x19,0x42,0xb9,0xdd,0x7d,0x2b,0x5b,0x6d,0x1b,0x9e,0x96,0xd7,0x75,0x83,0x82,0x3c,0x3e,0x5f,0xf8,0xa9,0x36,0xbe,0x14,0xc7,0xce,0x9d,0x05,0x7e +.byte 0xd7,0x38,0x37,0x35,0xc9,0x37,0x8b,0x9f,0xc6,0x2d,0xff,0x00,0x41,0xff,0x1b,0x09,0xea,0xd2,0xb0,0x04,0x48,0xff,0xfc,0xb5,0x67,0x54,0x39,0x3d,0x23,0x68,0x0b,0x7d,0x97,0xf3,0x65,0x20,0xa2,0xf8,0x33,0x96,0xd1,0xf4,0xc7,0xba,0x6f,0x00,0x95,0x36,0xf6,0x33,0xd1,0x8d,0xde,0xee,0x1e,0xfa,0x60,0x8e,0x5e,0x4c,0x70,0xbb,0x53,0x79 +.byte 0xc9,0x9a,0xdf,0x3c,0x53,0xe4,0x35,0x87,0xc3,0xe6,0x8e,0x0e,0x1a,0xd0,0xf8,0x57,0x2b,0x33,0x51,0x4d,0x7d,0x43,0x17,0x3e,0x6f,0x0e,0xca,0x86,0xb2,0xc6,0x09,0xf3,0x2f,0xc1,0x5f,0x0e,0x9a,0x5e,0x7d,0x9d,0xf7,0xff,0x09,0x46,0xe5,0x30,0x91,0x61,0x93,0xb5,0x2f,0xc5,0x7f,0x09,0x0b,0x55,0x94,0x17,0x25,0x19,0x9b,0xa9,0x0e,0x68 +.byte 0x71,0x18,0x1b,0x4b,0x1b,0xa3,0x75,0x90,0x56,0x96,0x5e,0x33,0x71,0xf2,0x06,0x69,0x07,0x04,0xcb,0x8c,0x79,0x9b,0xa5,0x17,0xd8,0xd8,0x77,0xc7,0xca,0x95,0x58,0x12,0xec,0xdd,0x41,0xc9,0x12,0x16,0x9a,0xc4,0xf0,0x27,0x7a,0x8e,0xeb,0x19,0x79,0x27,0x7b,0x2e,0x55,0x96,0x57,0x19,0xbe,0x55,0x8c,0x7f,0x97,0x90,0x80,0x40,0x5d,0x5a +.byte 0xf6,0x07,0xd6,0xb4,0xc5,0xe8,0x0e,0x54,0xde,0x78,0x23,0xca,0x39,0x90,0x42,0xb6,0x8b,0x14,0x22,0x06,0x71,0x77,0xd5,0xf7,0x8d,0x05,0x9d,0xbf,0xfe,0x38,0x91,0xba,0x79,0x85,0x30,0x47,0x25,0xf0,0xa2,0x72,0x55,0x94,0x2a,0x8a,0xc8,0x28,0xc8,0xa9,0x23,0xab,0xf0,0x4e,0x49,0x2f,0x58,0x53,0x35,0xd1,0xb6,0x16,0x81,0xc2,0x25,0x18 +.byte 0xd9,0x71,0x91,0xc4,0x81,0x3e,0xf4,0xd7,0x87,0x9e,0x57,0x78,0xf7,0x7d,0x4b,0xb2,0xfd,0x91,0x9f,0xa8,0x0e,0x77,0xb3,0xc7,0xe5,0x6a,0x95,0x17,0xc3,0xf4,0xcb,0x7f,0x96,0xc1,0xa8,0xee,0x6a,0x0f,0x1f,0x5d,0x20,0x28,0x93,0xe5,0xf3,0x13,0x46,0x53,0x47,0x9f,0x98,0xc6,0xf5,0x29,0x69,0xb9,0x83,0x36,0x03,0xa1,0x9a,0xb4,0xa9,0x4e +.byte 0xd6,0xda,0x25,0xe2,0x5b,0xbb,0x95,0xdf,0x0f,0x37,0x0b,0x02,0x51,0x03,0xd1,0x0e,0x84,0xef,0xdd,0x85,0xdd,0xae,0x10,0x32,0x65,0x03,0x65,0xf0,0x8e,0x0c,0x69,0x90,0x35,0x26,0x36,0xe8,0x05,0x46,0xe6,0xce,0x52,0x4d,0xb5,0x93,0x9f,0xe3,0xe5,0xb0,0x43,0x57,0x32,0x5d,0xca,0xd4,0xc9,0x89,0x2e,0x5b,0x03,0x8a,0x82,0x78,0x21,0x6b +.byte 0x41,0xa9,0x0a,0x9f,0xe0,0x50,0xec,0x72,0x01,0x67,0xe7,0x1c,0x92,0xe3,0xe4,0x83,0x4d,0x4b,0xcf,0x01,0x37,0x2f,0x34,0x86,0xcf,0x36,0xf7,0x3a,0x57,0xa3,0x89,0x73,0x0f,0x9c,0x06,0x82,0x75,0x7a,0x4b,0xd8,0x44,0x40,0xf2,0xc5,0xc4,0x22,0xa6,0x99,0x1b,0x73,0x2f,0xad,0x09,0xe9,0x84,0x6f,0xc3,0xca,0x72,0x3a,0x8a,0x55,0x55,0x0a +.byte 0xcd,0x33,0x51,0xef,0x5b,0x36,0x77,0x6c,0xb4,0x4a,0xae,0xdd,0xbd,0xec,0x65,0x99,0x43,0xd6,0x8a,0x16,0xba,0x89,0x4d,0x0c,0x11,0xb4,0x0d,0x5d,0x3e,0x76,0xcb,0x48,0x9d,0x31,0x40,0x71,0xe2,0xe4,0xa9,0xd9,0x6e,0x3c,0x3d,0xd1,0x6e,0xaf,0xb9,0x28,0x71,0x5a,0x07,0x6f,0xab,0xdb,0xf8,0x4f,0x11,0xbc,0xe0,0x14,0x01,0x43,0x4d,0xe2 +.byte 0xad,0x5d,0x2a,0xb2,0x58,0x66,0x05,0x50,0x66,0xf6,0x2f,0x66,0x11,0xd1,0xd7,0x05,0x85,0xb0,0x7f,0xa8,0x89,0xbd,0x41,0xda,0x35,0x1e,0xbb,0xff,0x70,0x1a,0xe8,0x65,0x96,0xe9,0x50,0x18,0x7f,0x4c,0xb2,0xe2,0x95,0x26,0xf6,0x37,0x09,0x8c,0x8d,0x7b,0x02,0xb0,0x7f,0x32,0xb5,0x70,0x22,0xd6,0x83,0x0b,0x85,0x25,0x00,0xc5,0x55,0x3f +.byte 0xfa,0x7a,0xc9,0xaf,0x87,0xc1,0x1c,0x11,0x96,0x71,0x18,0xd8,0xdb,0xab,0x86,0x57,0x0a,0x16,0x23,0x32,0x40,0xd3,0xaf,0x17,0x55,0xe3,0xe7,0x01,0x65,0x1f,0x87,0xda,0xb5,0x46,0x67,0x18,0x34,0xcc,0x28,0x77,0xc3,0x12,0x62,0x6c,0x8b,0x8a,0x11,0x7a,0x5a,0xd1,0xdf,0xb3,0x13,0x6b,0x29,0xce,0xf8,0x03,0xba,0xad,0x7c,0x14,0x60,0x42 +.byte 0x17,0xf6,0x7b,0x0c,0xb7,0x5f,0xd6,0xc1,0xb5,0xa5,0x2b,0xb1,0x9f,0x6c,0x65,0x29,0xe5,0xf4,0x84,0x85,0x11,0x82,0xf1,0x4c,0xcd,0xff,0x99,0x29,0x53,0x7b,0x43,0x04,0x60,0xc4,0x6c,0x01,0x5c,0xcb,0x33,0x4f,0xdb,0xc4,0xad,0x8c,0xea,0xff,0xd6,0xcd,0x8e,0x85,0x6e,0x54,0xd5,0x18,0x63,0x84,0x78,0xea,0xff,0x08,0x95,0xdc,0x2a,0x07 +.byte 0xac,0xea,0x44,0x79,0x52,0x07,0xf3,0xf1,0x03,0x7f,0x71,0x53,0xd8,0x85,0xdb,0x70,0xde,0x5e,0xd5,0x9a,0x18,0x9f,0xcc,0x3f,0xc0,0xc0,0x49,0x82,0x70,0x09,0xce,0x29,0x04,0x0a,0x19,0x81,0xd9,0x81,0x22,0x71,0x48,0x8e,0x79,0x08,0x1c,0xb4,0xc8,0x7e,0x60,0x43,0x4a,0xe3,0xd5,0x6b,0x09,0x5c,0x01,0x6e,0x20,0x9e,0xd2,0xaf,0x80,0xb7 +.byte 0xa2,0x0a,0x5b,0x26,0x08,0x32,0x73,0xbc,0xc6,0xfd,0x06,0xaa,0x2e,0x55,0xa0,0x5b,0xa9,0x3c,0x85,0xb2,0x04,0xdc,0x9a,0x94,0x02,0x93,0x96,0x6b,0x3e,0xc3,0x5e,0x37,0x9b,0x6f,0xef,0xb9,0x65,0x52,0x42,0x1c,0xa7,0x84,0x09,0x0c,0x49,0x3a,0x95,0x06,0x94,0xd7,0xc7,0x40,0xf5,0xf1,0x69,0x41,0xfb,0xf8,0x57,0xb5,0x1e,0x0c,0xf3,0xd9 +.byte 0xb1,0x2e,0x58,0x33,0xbe,0xb1,0x3d,0x61,0xc6,0xca,0x01,0xe5,0xda,0x60,0x8f,0x87,0xf7,0x9a,0xb5,0x92,0xb4,0x8c,0x2a,0xaf,0xd4,0x1e,0x9c,0x97,0x39,0x83,0x99,0x4a,0x07,0x54,0x75,0x7d,0xde,0x72,0x06,0xc1,0x8f,0xb4,0xde,0x12,0x43,0xf2,0x62,0xae,0xe7,0xec,0xfe,0xb2,0xe5,0x63,0x35,0xb7,0xee,0xaa,0xf0,0x09,0xb8,0x61,0xf2,0x42 +.byte 0x28,0x87,0xd7,0x47,0xa8,0xfc,0x51,0x85,0x6f,0xa2,0xb1,0xa6,0x82,0xd6,0x0e,0x1b,0x3f,0xea,0xa1,0xe1,0x91,0xc9,0xd2,0x5b,0x3e,0xff,0x18,0x39,0x14,0xe0,0x44,0xda,0x3d,0xd8,0xca,0xdb,0xd9,0xbf,0x3f,0xa4,0xdb,0x99,0x2e,0x31,0x32,0x7c,0xf4,0x61,0x2f,0xa1,0xf9,0xa9,0xbe,0x26,0x94,0xea,0xb4,0xe3,0x25,0x8d,0x93,0x3b,0xa1,0x7e +.byte 0x1e,0x99,0x87,0x6c,0xaf,0x14,0x54,0xd0,0xc0,0x37,0x39,0x76,0x3c,0x07,0x2e,0xce,0x98,0x25,0x81,0xe4,0x01,0x0c,0x07,0x79,0x4e,0xcd,0x82,0x44,0x83,0x04,0x07,0xa6,0x52,0xb7,0x96,0x7c,0x43,0x12,0xe1,0xc5,0x12,0x18,0x25,0x47,0xe4,0x19,0x6d,0x26,0x1e,0x55,0x66,0xca,0x28,0x4c,0xfa,0xd2,0xd9,0xcc,0x7e,0xad,0x9f,0x2a,0x2f,0xc6 +.byte 0x6c,0x77,0xaa,0x0f,0x5b,0xeb,0x15,0x97,0x62,0x52,0x3c,0x6f,0x4b,0xf3,0xcc,0x80,0x7b,0x1f,0x1d,0x58,0xf8,0xfe,0xc1,0x8c,0x3b,0xe3,0xd7,0x05,0xc3,0xd6,0xa9,0xda,0xcf,0x85,0x1c,0x68,0xd6,0x6d,0x2b,0x06,0x30,0x5f,0x58,0x39,0xea,0xfa,0x99,0xaa,0x04,0x10,0x05,0xaf,0xb0,0xf7,0x32,0x60,0x8d,0xe4,0xd1,0x40,0x32,0xd6,0xa3,0xf2 +.byte 0xba,0x5a,0x79,0x58,0x92,0x75,0xf0,0x3a,0xce,0xb2,0xee,0x66,0x3e,0xe3,0xbe,0x4d,0x53,0x9d,0xbb,0xdb,0x45,0xf0,0x09,0xeb,0xd5,0x83,0x39,0x20,0x06,0xa9,0x44,0x35,0xeb,0x6d,0x9b,0xd9,0xa4,0xda,0x4b,0x9d,0xde,0x3d,0x26,0xa2,0x2d,0xcf,0x8e,0x3e,0xbc,0xb4,0x8c,0x3a,0xbf,0x56,0x7c,0x48,0x50,0xb5,0xc5,0xbe,0x84,0x5e,0x63,0x82 +.byte 0x5f,0x87,0x77,0x4a,0xa7,0xf6,0x66,0x07,0x42,0x6a,0xb0,0xcf,0x19,0xaf,0x6c,0x16,0x85,0x78,0x88,0x3b,0xa5,0xbc,0x42,0xd2,0x4c,0xdf,0x51,0x3b,0xc4,0x0e,0xf5,0xc5,0x70,0x57,0x40,0xf6,0xed,0xd2,0x37,0x3e,0x14,0x0c,0x31,0xda,0x94,0x87,0x6b,0xd9,0x8c,0x15,0x41,0xa9,0xc0,0x2a,0x61,0xd3,0x52,0xe0,0xb6,0x0a,0x83,0x6b,0x75,0x1b +.byte 0x1e,0xd1,0x7f,0x26,0x19,0x34,0x9b,0x70,0xc9,0xba,0xdc,0xa2,0x03,0x6d,0xc7,0xac,0xbd,0x2c,0x63,0x8a,0x7b,0xb1,0x62,0x51,0xc1,0x1d,0x54,0x0d,0x34,0x0e,0xfb,0xa6,0xb8,0x9d,0x79,0x4f,0xc3,0xaa,0x8d,0xa0,0xcc,0x80,0x96,0x86,0x37,0xd6,0x80,0x9c,0x3d,0x91,0xd0,0xe7,0xe2,0xb4,0x00,0xba,0x86,0xe9,0xeb,0x86,0xea,0x84,0x78,0x81 +.byte 0x20,0x29,0x28,0x02,0x4d,0xd8,0x1b,0x5e,0x4f,0x41,0xfc,0x13,0x3e,0x4c,0x7f,0x64,0x55,0x35,0x41,0x0d,0x74,0xc5,0x6a,0x7c,0x37,0x82,0x41,0xbd,0x67,0x39,0xd9,0x83,0xfa,0x7f,0x8c,0xe1,0x9f,0x23,0x0d,0xe4,0x1d,0x40,0xe6,0x6e,0x94,0x5d,0xec,0x77,0xf7,0x5e,0xb4,0xa1,0x03,0xfb,0xa0,0x0e,0xba,0xf8,0x28,0x50,0x3c,0x38,0x47,0xf7 +.byte 0xed,0x2d,0xe5,0x0b,0xa8,0x7a,0xbd,0xbf,0x7e,0x38,0xc0,0x60,0xe7,0x7e,0xb1,0x03,0xef,0x4a,0x8c,0xc7,0x98,0xf1,0x94,0xf6,0xa0,0x50,0xb2,0x0b,0x7c,0x66,0x0a,0x62,0x10,0x24,0xb0,0xa1,0x69,0x02,0x33,0x79,0xbf,0xd0,0xb5,0xcb,0x17,0x20,0x55,0x02,0x70,0x44,0x5b,0xac,0x20,0x35,0xea,0x05,0x2d,0x68,0x51,0xe7,0x5f,0x1b,0xcd,0x4c +.byte 0x33,0x4d,0x04,0x21,0xfd,0x06,0x67,0x82,0x60,0x98,0x1f,0x79,0xf4,0x28,0xe0,0xa8,0x18,0xeb,0xf5,0x86,0x58,0xe6,0x9f,0xb5,0x29,0x0f,0xe8,0x37,0xeb,0x09,0xf4,0xc6,0x08,0xf2,0xde,0x4d,0x96,0x48,0x62,0x36,0x63,0x10,0x3f,0x63,0xeb,0x44,0x84,0xc8,0xf5,0x74,0x19,0x03,0x50,0xf7,0x7c,0xd2,0x06,0x20,0x6e,0x9b,0xa2,0x37,0xb0,0x68 +.byte 0x78,0x31,0xb6,0x05,0xfa,0xc9,0xcd,0x1d,0x4c,0xbd,0x33,0xb7,0xf3,0x93,0x38,0x7d,0x5f,0x00,0x85,0x5b,0x10,0x7f,0xc4,0x3f,0x3e,0xfe,0x62,0xca,0x51,0x83,0x95,0xcf,0x00,0x65,0x83,0x0e,0xd3,0x78,0xd0,0x51,0xcb,0x70,0x34,0x42,0xc6,0x3a,0x04,0xb9,0x10,0x92,0xe0,0x09,0x06,0xb0,0x66,0x9b,0x37,0x02,0x8d,0x0d,0x3e,0x2f,0xc5,0x17 +.byte 0x6a,0x87,0x7d,0x48,0xa4,0xcc,0x55,0x20,0x7b,0x77,0x07,0xcf,0x44,0x2f,0x88,0x8a,0xcc,0xf2,0x5d,0xa6,0x3e,0x5f,0xda,0xe2,0xde,0xd2,0x7f,0x7f,0xb7,0x90,0x53,0x64,0x6b,0x79,0x42,0x52,0x69,0xc6,0xd6,0xaa,0x9f,0xf9,0x19,0xbe,0x65,0x10,0x99,0x49,0xaf,0x36,0x49,0x1b,0x8a,0x3d,0x7f,0xdb,0xa2,0x1a,0xb5,0xd6,0x34,0x51,0xc8,0xc8 +.byte 0x06,0xca,0xf6,0xb8,0x76,0xa8,0x9d,0x43,0xae,0xf0,0x51,0xe5,0x9a,0x42,0xa2,0x83,0xed,0x20,0x8d,0xe8,0x1c,0xca,0x15,0x4e,0x37,0x3f,0xd8,0x06,0xa0,0xe1,0xf8,0x05,0xfd,0x42,0xf3,0x7a,0x96,0x44,0x36,0x02,0xca,0x11,0x2a,0xc3,0x24,0x58,0xdd,0x85,0x55,0xb2,0xe5,0x1d,0x92,0xc2,0x2d,0x5f,0x7c,0xb5,0x02,0x37,0x7c,0x07,0x35,0x25 +.byte 0x2b,0x33,0x80,0xe2,0xd4,0xfd,0xc7,0xa7,0x19,0x7e,0xba,0x36,0xaf,0xa0,0x4e,0xab,0x8b,0x28,0x4f,0x3b,0x92,0x72,0x42,0x49,0xaa,0x3b,0x08,0x0f,0x1e,0xff,0x2d,0xbf,0x9c,0x48,0x16,0x72,0xbe,0x28,0x05,0x8b,0x3a,0x20,0x6b,0x38,0x43,0xa2,0x35,0xea,0xf7,0x4e,0x50,0xa0,0x43,0x40,0x5c,0xbf,0xe5,0x75,0x13,0x4c,0x36,0x61,0xa1,0x5d +.byte 0x46,0xd7,0x7a,0x94,0x06,0x2f,0x63,0x32,0x9c,0x6e,0x54,0x18,0x31,0x79,0xf2,0x83,0xcf,0xb4,0x47,0x40,0xe5,0x9a,0xd6,0x99,0x12,0xb3,0x61,0x3d,0x0f,0x5e,0xc8,0x95,0xa3,0x5f,0xc3,0xd5,0x6b,0x6e,0xa0,0xf2,0x2f,0xeb,0x66,0xd0,0x68,0x67,0x10,0x85,0x64,0x27,0xd8,0xb8,0x68,0x00,0x36,0xa5,0xab,0x3e,0xe1,0x43,0x65,0x81,0x2d,0xb9 +.byte 0x0f,0x87,0xfe,0xa1,0x52,0xe9,0x8d,0x82,0x3a,0xd1,0x10,0x52,0x34,0x48,0x7c,0x1c,0xc6,0xd0,0xfe,0xa0,0x1a,0x92,0x07,0x88,0x57,0x9e,0xd7,0x5e,0x9f,0xc8,0xb0,0x93,0x73,0x03,0x28,0x36,0x8c,0x25,0x8c,0x0f,0x4e,0x0f,0x5b,0x26,0x58,0xed,0x5c,0x33,0x75,0x20,0x08,0x11,0x47,0xe1,0x47,0x85,0x47,0xeb,0x54,0xbf,0x58,0xe3,0xd4,0x5b +.byte 0xf9,0xc6,0x5e,0x42,0x58,0xe6,0xaf,0x79,0x66,0x3c,0xa5,0xa3,0x30,0x33,0xe3,0xbe,0x21,0x4b,0x42,0x98,0x6e,0x44,0xd7,0x68,0xc0,0xff,0xbe,0x7f,0xc5,0xb3,0x4f,0x4a,0x93,0xb0,0x11,0x88,0xcf,0x36,0xb2,0x03,0xbe,0x30,0x52,0x71,0x20,0x0d,0x16,0xc5,0xbb,0xf5,0x92,0x12,0x67,0x6a,0x35,0x66,0x00,0x09,0xd7,0xc6,0x67,0xb0,0x6a,0x04 +.byte 0x19,0x3e,0xbf,0xe2,0x82,0x74,0x78,0x2f,0x77,0x44,0xdc,0xad,0x0f,0x66,0x2a,0x23,0x62,0x2c,0x5a,0x4e,0x3a,0x82,0x2a,0x75,0x16,0x0d,0x74,0x64,0x35,0x53,0xc5,0xf6,0xda,0x36,0x44,0xba,0xe2,0xfa,0x1e,0xc2,0xcf,0x29,0x01,0x36,0x66,0xc3,0xca,0x40,0xf7,0xc4,0xba,0x67,0xac,0xf6,0x17,0xcc,0xa3,0x96,0x2d,0x08,0x5f,0x0a,0xea,0x5e +.byte 0x97,0xdc,0xc8,0xf9,0x59,0x24,0x6e,0xc5,0x0b,0x02,0xb9,0x1a,0xde,0xac,0x60,0x1d,0xaf,0x9f,0x5a,0x6f,0xe1,0xa6,0xdf,0x75,0xc5,0x9b,0xb7,0xde,0xa4,0xf7,0xf6,0xa4,0xdc,0xb6,0x96,0x08,0xde,0x2a,0x0e,0xb3,0x9d,0xf5,0x75,0x7d,0x7e,0x96,0x91,0x79,0xd4,0xa7,0x30,0x97,0x3a,0xbd,0x7c,0xe0,0xc5,0x87,0x24,0xb0,0x65,0xb7,0x58,0x00 +.byte 0xd9,0x0e,0x97,0xa6,0xa4,0x6a,0xe8,0x0a,0xac,0xac,0x9f,0x3a,0xe3,0x2a,0x9a,0x43,0x41,0x92,0x6e,0x0e,0xc4,0x63,0xc3,0x18,0xb6,0xe1,0xef,0x3d,0xe8,0x0b,0xb0,0x9f,0x2e,0x19,0xa0,0x98,0x98,0x34,0xf8,0x86,0x6d,0xc5,0x8c,0x41,0x26,0xb7,0xf2,0x1d,0xd4,0x72,0x39,0xeb,0x79,0x06,0xaf,0x53,0xaa,0x34,0x80,0x53,0xf8,0x1b,0xf4,0x53 +.byte 0x19,0xfa,0x16,0x8b,0x39,0xea,0x63,0x7f,0x38,0xc4,0x66,0x1d,0xd1,0x90,0xe4,0x2f,0x20,0x43,0x0d,0x5f,0x98,0xcc,0xae,0xef,0x86,0xc8,0xe5,0xf6,0xd2,0xa5,0x49,0xd0,0x3f,0xb5,0x7e,0x42,0xb5,0x6e,0x5e,0x13,0xa5,0xb4,0x71,0x2c,0x5d,0x57,0x24,0x06,0xd2,0x29,0x7c,0x4c,0x90,0xb6,0xea,0xdb,0x62,0xa4,0x2c,0x6c,0x38,0x57,0x97,0xbd +.byte 0xfd,0x41,0x6e,0x26,0xc1,0xe1,0x6b,0xbb,0xf0,0xe7,0x71,0xf1,0xcf,0x6a,0x7f,0xfa,0xe7,0xfb,0x17,0xe7,0x81,0x19,0x9a,0xf2,0xf6,0x86,0x22,0x4f,0x62,0x59,0xd6,0xc2,0x33,0xbd,0x11,0xe7,0x07,0x3a,0xfe,0x74,0x0d,0xf8,0xd9,0xdb,0xbd,0x05,0xf4,0xf4,0xb1,0x41,0xc9,0xb3,0xf8,0x6a,0x7b,0x98,0x08,0x6c,0xce,0x4c,0x28,0xbf,0x8c,0x77 +.byte 0x68,0xdc,0xee,0xf7,0x11,0xde,0xfc,0x5a,0x58,0x4f,0xf4,0x74,0x9d,0x5b,0x78,0xc3,0x78,0xe5,0x5e,0x26,0x83,0x40,0x17,0x80,0x2a,0x02,0xa4,0xf1,0x0f,0xa0,0xc8,0x22,0xe6,0x09,0x3a,0x52,0x74,0xf0,0xb9,0xb9,0x60,0xaf,0x20,0xa6,0x7e,0x88,0xf4,0xc2,0x38,0xa2,0x21,0x73,0xa9,0x18,0x3f,0x7a,0x04,0x7b,0xc4,0xcd,0x68,0xd9,0x83,0xa4 +.byte 0x8e,0x54,0x0d,0xbc,0xee,0x8b,0x39,0x93,0x66,0xa2,0xd6,0x76,0x4a,0xb2,0x33,0x4f,0x61,0x53,0xde,0x3b,0xff,0x47,0xcb,0x87,0xd9,0x21,0xd0,0x82,0x64,0x54,0xdf,0xf2,0x67,0x62,0x40,0x33,0xc7,0x0d,0xea,0x98,0xaa,0x95,0xfb,0xa9,0x0e,0x90,0xa5,0xd9,0x54,0x81,0x86,0xad,0x9e,0xa4,0x4d,0x36,0xe1,0x77,0xf2,0xe3,0x0a,0x54,0x1a,0x57 +.byte 0x9d,0x62,0x5e,0x0e,0x00,0xc8,0xa6,0x1e,0xf3,0x43,0xe6,0x20,0x0d,0x6a,0x8e,0x90,0x1d,0x4d,0xac,0x2f,0x9f,0x1c,0xb7,0x30,0xec,0x5c,0x99,0x78,0x6f,0x3b,0xe7,0xe0,0x28,0xb9,0x97,0xc5,0x6a,0xf2,0x17,0xc2,0x11,0xac,0x1a,0xe2,0xca,0x57,0x49,0x64,0xc8,0xc7,0x66,0x43,0x8d,0xc8,0xa7,0x0e,0xfc,0xcf,0x05,0x2f,0xae,0x4b,0xfe,0xe4 +.byte 0xbe,0x9c,0xe7,0xe6,0xa8,0x36,0x49,0x0d,0x9c,0x60,0x39,0x0c,0xfd,0x41,0x5b,0xc7,0xa4,0xa5,0x30,0x89,0xe5,0x10,0xf6,0xea,0xf8,0x2c,0xf2,0x3e,0xb1,0x96,0x81,0xa7,0x32,0x8b,0x39,0x14,0x15,0x36,0xfc,0x55,0x3c,0x22,0xcf,0xa3,0x98,0x90,0x68,0x13,0xd8,0x3f,0xf2,0x53,0x19,0x3e,0x9a,0x0c,0x1f,0xc6,0x29,0x43,0x46,0x23,0x58,0xea +.byte 0x49,0x49,0x15,0x46,0x8e,0x63,0x30,0x1f,0x3e,0x2a,0xa0,0x18,0xfd,0x28,0xc5,0x32,0x77,0x75,0xac,0x6e,0x5d,0x39,0xa9,0x44,0xce,0xfe,0x39,0xa6,0xec,0xde,0x69,0xde,0xfa,0xc8,0x40,0x44,0x34,0x29,0x15,0x19,0xa7,0xbe,0xd6,0x5b,0xfd,0x1f,0x7b,0xb9,0x88,0xf1,0x14,0xcf,0x42,0xc5,0xa7,0xa7,0x0e,0x6b,0x6e,0x86,0xb2,0x7c,0x23,0x8e +.byte 0xf6,0xae,0xde,0x3c,0xd7,0x26,0x5e,0xde,0x31,0x94,0xc1,0x19,0x65,0x55,0x03,0x73,0xba,0xdc,0x69,0x95,0x9c,0x9d,0x8e,0x59,0xd8,0x51,0x61,0x9f,0x8f,0xf4,0x29,0x43,0x4b,0x6a,0x75,0xb3,0x4b,0x9d,0xcc,0x46,0xd2,0x6e,0x00,0x49,0x4f,0xf0,0xac,0x80,0x55,0xc0,0x0c,0xbf,0x18,0x52,0x75,0x76,0x3b,0xac,0x92,0x83,0x69,0x1b,0xb4,0x15 +.byte 0xe5,0x9e,0xde,0x10,0x30,0x30,0x0e,0x85,0xc7,0xf9,0xae,0xbc,0x9e,0xaf,0x4b,0xee,0x27,0x6b,0xa5,0x6d,0xe4,0x8e,0xed,0xdd,0x95,0xaa,0x85,0xe2,0xf5,0x38,0x15,0x50,0xd3,0xcd,0x2c,0x88,0x6c,0x2b,0x14,0x37,0x74,0x2d,0x6d,0x30,0xec,0x96,0x78,0xae,0x80,0xb3,0xd9,0x84,0xc1,0xd6,0x71,0x90,0xe4,0x8d,0x3a,0x7c,0x9c,0xc4,0xf5,0xa0 +.byte 0x20,0x7e,0xa2,0x0e,0x75,0x7c,0x25,0x7a,0x7e,0x2b,0x2e,0xdb,0x12,0x23,0x73,0x6a,0x8e,0xe3,0xd7,0x47,0x94,0xfb,0xcc,0xe4,0x5a,0x8c,0xfb,0xdc,0x46,0xb3,0x4a,0x42,0x15,0xe0,0xaf,0x6e,0x81,0x72,0x72,0x04,0x52,0x09,0xc5,0x8b,0x6e,0xdd,0x7d,0xff,0x27,0xa8,0xc1,0x94,0xb5,0x33,0x59,0xc2,0x7d,0x59,0x6c,0x3c,0xaa,0xd9,0xd8,0x05 +.byte 0x43,0x7e,0x8a,0x47,0xdd,0x76,0x36,0xe3,0x05,0x49,0xd1,0x8f,0xdf,0x45,0x46,0x63,0xff,0x17,0xb4,0x52,0xc8,0xee,0x4d,0xf5,0x74,0x65,0xc6,0xca,0x19,0xfd,0xb9,0x51,0xc8,0xc9,0x96,0xd4,0x06,0xd4,0x09,0x1e,0xab,0x6d,0x1b,0x26,0x61,0x80,0x5b,0xa8,0xcb,0x62,0x92,0x5a,0x1a,0x8e,0xa4,0xb7,0x25,0x19,0x96,0x63,0xd5,0xc3,0xc9,0xdc +.byte 0x04,0x83,0x62,0x31,0xe3,0x76,0x00,0x4d,0xf8,0xb3,0x98,0xae,0x4d,0x1a,0x38,0xe3,0xa1,0x27,0x52,0x87,0xbe,0x2c,0x93,0x45,0xd1,0xab,0x56,0xc6,0xf5,0xbc,0xb5,0xe6,0x9c,0xe1,0x1b,0x37,0x42,0x08,0xe7,0x71,0xb5,0xa4,0x67,0xf9,0x48,0xd4,0xc4,0x10,0x25,0x53,0x9c,0x03,0xfc,0x6d,0x5e,0x62,0x5e,0x6d,0x56,0xbc,0x78,0x11,0x0a,0x6d +.byte 0x1b,0x7a,0xdc,0x62,0xb5,0x58,0x86,0x15,0x71,0xff,0x11,0x33,0x94,0x2b,0xa6,0xc7,0x68,0xd5,0x68,0xda,0x5b,0xd5,0xb7,0x38,0x6c,0x1c,0xf4,0x07,0x39,0xef,0x1f,0x72,0x0a,0xb3,0x12,0x13,0x25,0x86,0xd3,0xf8,0x9f,0xb5,0x40,0x58,0xe7,0x5e,0x9f,0xa0,0xbc,0xd7,0xab,0x4f,0xf3,0x94,0xcf,0x0f,0x5a,0x4c,0x98,0xb4,0x70,0x35,0x62,0xee +.byte 0x33,0x24,0x72,0x31,0xd4,0x06,0xd9,0xb4,0x1c,0x1e,0x0f,0xa7,0x48,0xc7,0x75,0x45,0x40,0x02,0xd0,0x60,0x32,0x29,0x4d,0x61,0x7a,0xee,0x65,0x35,0x2b,0xe5,0x50,0xac,0x82,0xdb,0xf7,0x9c,0x8f,0x82,0xe4,0xf0,0xbd,0xdb,0x00,0x3d,0x3a,0x3d,0xa2,0xc3,0x2d,0x0e,0x51,0x20,0xdb,0xdb,0x8d,0x15,0x03,0xbd,0xcb,0xcb,0x24,0x81,0xc5,0xdb +.byte 0x05,0x39,0x48,0xb8,0x3c,0x93,0x35,0x10,0xef,0x19,0xba,0x09,0x9e,0xff,0xf9,0x3f,0x0c,0xdc,0x96,0x98,0x32,0x26,0x76,0xe7,0xfa,0xaa,0xdf,0xdc,0xb9,0x15,0x44,0x42,0x9a,0x8c,0x6c,0x88,0xea,0x43,0x63,0xb5,0x79,0xb6,0x50,0x30,0x78,0xea,0x70,0xba,0x33,0x36,0x8f,0x8c,0xe5,0x78,0xfd,0xbc,0xc0,0xbd,0xde,0x3a,0x3d,0xe6,0xe6,0x57 +.byte 0x0f,0x29,0xf2,0x82,0x05,0xf2,0x5c,0xfd,0x33,0xc1,0xb2,0x2e,0xc2,0xc0,0x42,0xa2,0xc8,0xa5,0xf9,0x70,0x05,0xff,0x7b,0x8d,0xb9,0x68,0xc3,0xf6,0x74,0x00,0xcd,0x9d,0x70,0xfa,0x62,0x34,0xe5,0x05,0xe8,0x5f,0x53,0x9b,0x69,0x01,0x86,0xb9,0x1d,0x68,0x80,0x89,0x51,0x52,0x0d,0xe8,0x28,0xa1,0xdd,0x62,0x2b,0xf3,0x53,0x74,0xaa,0x98 +.byte 0xdb,0x7e,0x74,0x44,0xeb,0x25,0xe7,0xde,0xc4,0x29,0x14,0x11,0x7b,0xc6,0xef,0x14,0xe4,0x04,0xd0,0xf4,0x11,0xca,0xdc,0xdc,0xe6,0x3f,0x9a,0xc9,0xe2,0x0e,0x67,0x30,0x78,0x65,0x94,0x5a,0xa1,0x24,0xd6,0x90,0x2f,0x1c,0x13,0x46,0xf5,0xb5,0xf9,0x74,0x56,0x3e,0xd5,0x1b,0x09,0xb3,0x04,0xbe,0x89,0x00,0xbd,0xe0,0xba,0x13,0x05,0xd1 +.byte 0x98,0xa7,0x93,0x09,0xc5,0x96,0x46,0xb5,0x5a,0x05,0xac,0x1e,0x66,0x03,0xf0,0xaa,0x3d,0xc2,0x54,0xa3,0xc4,0x2b,0x0d,0xa3,0xe4,0x92,0xd6,0xd0,0x44,0xa6,0x37,0x30,0xa5,0xac,0xc2,0xc8,0x58,0x2a,0x2c,0x18,0x68,0x8d,0x9b,0x4f,0x99,0xd0,0x55,0x41,0xf4,0x84,0x3c,0x69,0xda,0x3c,0x6d,0x43,0xb3,0x85,0x15,0x1f,0xdb,0x58,0x0b,0x71 +.byte 0x33,0x24,0xbb,0x21,0x43,0x19,0x16,0xeb,0x83,0xde,0xe5,0xb7,0x68,0x9e,0xb9,0xd9,0xf6,0x2e,0xae,0xdd,0x88,0x2c,0x18,0xd7,0xc3,0x72,0x8b,0xbe,0xaf,0x8d,0xfd,0xcd,0x2f,0x8e,0x3e,0x2b,0xa4,0x20,0x11,0x9d,0x00,0x4f,0xea,0xf0,0xaa,0x2d,0xf3,0x9d,0xfd,0x11,0x7b,0xac,0x2c,0x66,0x74,0x03,0xe5,0xcc,0x70,0x9f,0xfb,0xb7,0x5a,0x16 +.byte 0xc3,0x05,0x61,0x7c,0x8c,0x73,0xcc,0x9c,0x6a,0x2f,0xee,0xae,0x85,0xc9,0x51,0x91,0x13,0xa4,0x09,0x82,0x4d,0x62,0x09,0x24,0x25,0x35,0x1f,0x82,0x88,0xbb,0xdd,0x16,0x5e,0x8d,0x98,0x5f,0x07,0x49,0x32,0x96,0xb7,0xee,0x85,0xb0,0x7b,0xfd,0xf5,0x35,0x4b,0xa9,0xd4,0xee,0xf2,0x37,0xd1,0xfe,0x62,0xf5,0x52,0x13,0xb4,0xb2,0xce,0xc4 +.byte 0xe0,0x09,0x78,0x48,0xd5,0xc6,0x5d,0x36,0x1b,0x90,0x3a,0x6a,0x3c,0x21,0x50,0xf0,0x0a,0xe9,0x46,0x24,0x45,0xc1,0x5e,0x76,0xa3,0xf9,0x70,0xb8,0x62,0x4d,0x0e,0x92,0x87,0x4a,0x6a,0xf9,0x46,0x91,0x64,0xfe,0x7f,0x53,0x24,0x7e,0xc7,0x3e,0xb0,0x37,0x1a,0xc8,0xd6,0x33,0x0b,0x5f,0xa5,0x30,0x03,0x0e,0x85,0x3d,0x7b,0xc1,0xa1,0x18 +.byte 0xb3,0x8c,0xfe,0xca,0x3e,0x71,0xd8,0x92,0x46,0x49,0x60,0x54,0xd9,0x7b,0xf7,0xc3,0x99,0x2f,0xb5,0x79,0xcc,0x32,0x40,0x7d,0x3d,0x0b,0xc6,0x6f,0x04,0xd9,0xf1,0xdd,0x64,0xf5,0xc4,0x60,0x14,0x04,0x5c,0x3a,0xa4,0xda,0xdc,0xad,0x8f,0xc2,0x44,0x37,0x96,0x63,0x00,0xf7,0xb1,0xc0,0x7c,0x8c,0x12,0xb5,0x3a,0xec,0xc0,0x16,0xd8,0x24 +.byte 0xe9,0xc0,0xc4,0xfa,0xb1,0x85,0x5b,0xe3,0x62,0x24,0xa1,0x75,0x92,0x82,0x04,0x59,0x10,0x50,0x4b,0x51,0x51,0x3e,0x39,0xba,0x6d,0xa0,0x65,0x2d,0xfc,0x23,0x1c,0x9d,0x69,0x22,0xe7,0x15,0xfa,0xba,0x76,0xbf,0x53,0x62,0xb0,0x0d,0x0d,0x5d,0x55,0x00,0xbc,0x58,0x01,0xed,0x37,0x53,0xb9,0xa6,0x0d,0x71,0xab,0xec,0x42,0xbf,0x3b,0x52 +.byte 0xfd,0xae,0xe9,0x6d,0x65,0x07,0xf3,0xd9,0x32,0x66,0xc1,0x66,0x1a,0x18,0x73,0x86,0x01,0xaf,0x1d,0xd1,0xd0,0xcf,0xb1,0xea,0x54,0x23,0xdf,0xf2,0x4d,0x7d,0xc7,0xfe,0xfe,0x7d,0x1d,0x2c,0x1b,0xb6,0xa7,0x7a,0x9e,0x90,0x3a,0x3b,0xb0,0x6c,0xb0,0xd2,0xd1,0xd0,0x6a,0x94,0x4c,0x84,0x1c,0x45,0xae,0xda,0x16,0xa9,0x2e,0x63,0x19,0x26 +.byte 0xf6,0x74,0xd3,0x6f,0x9b,0x9c,0x0c,0xb8,0x85,0x9f,0xeb,0x99,0xbc,0xab,0xff,0xc3,0x75,0x86,0xe5,0x3a,0xa0,0xf9,0xfc,0x6b,0x3d,0x5a,0xad,0x46,0x7f,0x17,0x0e,0x94,0xb7,0xa4,0x43,0x61,0x54,0x76,0x29,0x78,0xe4,0x41,0x91,0xbe,0xa5,0x36,0x39,0xdf,0xdc,0xcc,0x8e,0x42,0x40,0x08,0x51,0x26,0xb0,0x53,0x5d,0xb4,0x7a,0x18,0x8e,0xb3 +.byte 0xae,0xf2,0xe0,0xef,0x63,0x51,0x3a,0xbe,0x4c,0x2d,0xce,0xc7,0xe2,0x1b,0xc2,0x40,0xf3,0x82,0x61,0xf0,0x1b,0x05,0xdd,0x1e,0xae,0xed,0x87,0x2c,0xe5,0xad,0xc7,0xec,0xb5,0x63,0xf7,0x3a,0xf9,0xb7,0xd8,0x4e,0xa7,0xef,0xac,0x6d,0x9c,0x27,0xd9,0xcc,0x66,0xf4,0x75,0x40,0x94,0x8b,0x78,0x4f,0x61,0x4f,0x31,0x49,0x5c,0x96,0x72,0x58 +.byte 0xcf,0x55,0xb2,0x66,0x16,0x29,0x27,0x24,0x39,0xc3,0x64,0xb1,0xdf,0x69,0x87,0x85,0x46,0xe3,0xd0,0x82,0x53,0x1a,0xc2,0xf1,0x3a,0xab,0xdf,0xe5,0x29,0x17,0xdd,0xfe,0xbf,0xf9,0x3d,0x7a,0xfb,0xe7,0x74,0x49,0xa9,0xef,0x61,0x93,0x4c,0xfa,0x30,0xea,0x65,0xa7,0x61,0x32,0x88,0x74,0x12,0xc1,0x91,0xf1,0xc2,0x1f,0x38,0x6a,0xfd,0x0d +.byte 0xc8,0x6f,0x87,0xe6,0x15,0x55,0x26,0x13,0x86,0x13,0xb9,0x01,0x98,0x34,0x1c,0x2d,0x1d,0x30,0xae,0x7d,0x8e,0x07,0x7d,0x4d,0xe9,0xfd,0x58,0x18,0xc3,0xa6,0x8e,0x87,0x98,0x33,0xcc,0x80,0xd7,0x70,0x07,0x6a,0x4a,0x97,0xef,0x56,0xf3,0x9d,0xf9,0xef,0x6f,0xa8,0x71,0x7f,0x61,0x07,0x1d,0x9d,0x51,0x06,0x86,0x4a,0x35,0x9e,0xab,0x2c +.byte 0x66,0x8d,0x61,0x62,0xbd,0xed,0x6c,0x76,0x7c,0x67,0xe0,0xe1,0x6e,0x90,0x74,0xb1,0xa6,0x26,0x0d,0x01,0x1f,0xe9,0xb4,0x30,0x9a,0x7e,0x37,0xd1,0xea,0x97,0x9a,0x0f,0x9e,0x8d,0x52,0xd4,0x96,0x36,0x5b,0x6f,0x40,0xbb,0x9e,0x44,0xb4,0x6e,0xee,0x15,0x70,0xef,0x66,0x81,0xf5,0xb4,0xe7,0x69,0xb0,0x40,0x44,0xdc,0x70,0x1e,0x4d,0x3c +.byte 0x9b,0x19,0x2a,0x97,0xbd,0xb2,0xd2,0x9b,0x98,0xac,0x36,0xf1,0x05,0x48,0xdc,0x5d,0x21,0xfb,0x17,0xe3,0x9c,0x3c,0xbf,0xfd,0x1d,0x39,0x1e,0x5b,0x2a,0xa2,0xb3,0x7d,0x4f,0xdf,0x3a,0x41,0x7a,0x31,0x01,0xc2,0xe5,0xd0,0x06,0x50,0x29,0x05,0xce,0xb8,0x28,0xb7,0xdd,0x83,0xc8,0xaa,0x39,0x78,0xc7,0x7d,0x9e,0xcd,0x9a,0x07,0x71,0x7e +.byte 0x20,0x92,0x82,0xce,0x49,0x90,0xce,0xef,0x53,0xa7,0x48,0x2a,0x69,0x86,0xa1,0x5e,0x35,0xe8,0x7d,0x10,0xb8,0x5e,0xa6,0x9a,0x69,0x6f,0x32,0x75,0xf3,0x4a,0xee,0x9c,0x06,0x5c,0xdd,0x84,0x7e,0x38,0x00,0x67,0x39,0x42,0xed,0x72,0xda,0xe3,0x6b,0x5a,0xf4,0xc9,0x80,0x3e,0x0e,0xda,0x39,0xfa,0x83,0x2c,0x60,0x69,0x87,0x85,0x05,0xfc +.byte 0xf4,0x2b,0xd4,0x0a,0xad,0x86,0xca,0xd5,0xf0,0x92,0x1f,0x43,0x3c,0x0e,0xac,0x99,0xf3,0x67,0xa3,0x41,0x6d,0xb9,0x29,0x70,0x57,0x62,0x9f,0x45,0x91,0x72,0xe5,0x53,0xcc,0x89,0x80,0x3f,0xbc,0x1c,0x66,0x21,0xdd,0x90,0x2b,0xa4,0xca,0x2f,0xf0,0x0f,0x9f,0xd0,0xe9,0x28,0xe2,0xd9,0x36,0xaf,0xf9,0x01,0x81,0xce,0xb4,0xe7,0x71,0xfd +.byte 0x92,0xf8,0x56,0x2e,0xc3,0xc8,0x8b,0x54,0xc8,0xc7,0x40,0x79,0x27,0x06,0x18,0x4a,0x7b,0x88,0x3f,0xd6,0x4f,0xd4,0x66,0x1e,0x1f,0x9a,0x14,0x1a,0x0a,0x98,0xc7,0xd6,0x25,0x83,0x37,0x8a,0x5d,0xb2,0x88,0x39,0x68,0x7b,0x1f,0x4e,0x0a,0xed,0x11,0x1a,0x77,0x9b,0xcb,0xb6,0x7d,0x5c,0x36,0xac,0x07,0x07,0x9f,0x05,0xcf,0x90,0x8f,0x3f +.byte 0x4b,0xc5,0xf9,0x42,0x90,0xb4,0x42,0x26,0xa1,0x2c,0x66,0xc6,0xb8,0x98,0x80,0x8a,0xbb,0x9b,0x41,0xe4,0x44,0x8c,0x5e,0x56,0x33,0xe3,0xba,0xcf,0x31,0x8e,0x28,0xd7,0xc5,0xd1,0x3b,0x68,0x47,0x10,0xae,0xda,0xc3,0xbd,0x20,0xe7,0xac,0xe2,0xe1,0xe0,0x7a,0x4b,0x83,0xb1,0xab,0x72,0xf4,0xc4,0xe7,0x0d,0x02,0xaf,0x5b,0x74,0xac,0xda +.byte 0x9d,0xce,0x26,0x1f,0x79,0x05,0x67,0x7e,0xc4,0x98,0x3f,0xde,0xa6,0xf3,0xfe,0x59,0x65,0x88,0xfb,0x14,0x3a,0x43,0x91,0x04,0x1a,0x78,0x7e,0x08,0xba,0x55,0x50,0xc7,0x65,0xd3,0x8e,0xda,0x0a,0xee,0x8e,0x11,0xa9,0xf6,0x9e,0xd3,0x23,0x97,0x05,0x0c,0x98,0x2a,0x36,0x25,0xec,0x5e,0x0b,0xf9,0x31,0x80,0x00,0x8a,0x70,0xf1,0xaa,0x7c +.byte 0x73,0x02,0x98,0x8d,0x42,0x27,0x53,0xf1,0x83,0x37,0xd0,0x2d,0xfa,0xc7,0x4b,0xa5,0xb3,0xc9,0xb8,0xd4,0x56,0x94,0x5a,0x17,0x2e,0x9d,0x1b,0x46,0xaa,0xb6,0xd9,0x2a,0x3a,0x6c,0xaf,0x24,0x59,0xfd,0x08,0xc5,0xca,0x0c,0x79,0x3f,0xe7,0x91,0x8d,0x9d,0x59,0x91,0xd8,0x5f,0xda,0x6d,0x35,0x7b,0x52,0x47,0x35,0xf9,0x81,0x86,0x2c,0xee +.byte 0x1a,0x14,0xc5,0x1f,0xb6,0x85,0xb5,0x74,0xe9,0xb7,0x4f,0xde,0xcd,0x93,0x2d,0xf3,0x10,0xbe,0x34,0xfa,0xca,0x15,0x9f,0x02,0x9d,0x19,0x72,0x7c,0xd6,0xfd,0x81,0x43,0x49,0xb5,0x2b,0x52,0x31,0xd6,0x2c,0x28,0x2e,0x83,0x6d,0xd3,0x0f,0x6e,0x03,0x65,0xf0,0x8a,0xdd,0x0a,0xec,0x58,0x10,0x45,0x5d,0xac,0xda,0xf5,0x32,0x5d,0x18,0x26 +.byte 0xcc,0x2e,0xcf,0xd3,0x41,0x2d,0x1d,0xba,0xdf,0xd8,0x96,0x8f,0x18,0x0f,0xa7,0xec,0x8e,0x6e,0x84,0x2c,0xd6,0x1f,0x4e,0x76,0xfe,0xf3,0x14,0x27,0x4b,0x5b,0x3d,0x7c,0x1c,0x59,0x46,0x97,0x1b,0x59,0x5a,0x2d,0x57,0x80,0x17,0x98,0x7d,0x92,0x5d,0x2f,0x98,0x53,0x10,0x59,0x8e,0x7f,0x55,0x64,0x15,0x62,0x2c,0x16,0x0b,0x8d,0x48,0x54 +.byte 0xaf,0x96,0x17,0xa9,0x8e,0x2c,0xcf,0x41,0x8c,0x8a,0x37,0x55,0xe4,0xf9,0x20,0x3b,0x21,0x5c,0x86,0x8d,0x3f,0xa6,0x5e,0x43,0xf3,0x3b,0xf7,0x7c,0x27,0x88,0x8e,0xa5,0x15,0xca,0x0e,0x9e,0x85,0x30,0x17,0x0d,0xcf,0xf0,0x82,0x87,0xd6,0xe8,0xd2,0xad,0xe9,0x4d,0x3f,0xc9,0x58,0x19,0xf9,0x99,0x4d,0xf9,0x6b,0x1b,0xd3,0xf9,0xdd,0x52 +.byte 0xd1,0x3c,0x64,0x46,0xfd,0x4f,0x2e,0x63,0x39,0xd8,0xe4,0xeb,0xfc,0x07,0xf1,0xa5,0xff,0x84,0xa8,0x92,0xfe,0xbc,0xc5,0x36,0x91,0x2b,0xec,0x2c,0xad,0xf0,0xac,0xc5,0xb0,0xad,0x8a,0x0d,0x6a,0xd9,0x29,0x7a,0xb0,0x87,0x0c,0xaf,0xda,0x75,0x84,0x25,0xbe,0xee,0x0d,0xfd,0x4c,0xf5,0x2d,0x46,0xe9,0x17,0xb9,0x9d,0x3d,0x4b,0x8f,0x3a +.byte 0xe9,0x49,0xb6,0x32,0x99,0x27,0xe2,0x4d,0xff,0x2f,0x2e,0xd5,0x69,0x52,0x56,0x20,0x0a,0xbf,0x62,0x14,0x34,0xfb,0xbf,0x95,0xe8,0xfe,0xb1,0x9f,0x43,0x30,0x02,0x03,0x9e,0xa8,0xe2,0x68,0x64,0xdd,0x37,0xfc,0xb9,0x0f,0x85,0x8c,0x36,0x45,0xdb,0x7c,0x8b,0x97,0x50,0xc3,0x75,0xa1,0xcf,0xf4,0xc2,0x46,0xd8,0xa1,0x8c,0xab,0x8d,0x3a +.byte 0xde,0xe7,0x9e,0xd2,0x1e,0x2d,0x8b,0xe4,0x31,0xe3,0x12,0x3f,0x9f,0x0b,0x2c,0x95,0x75,0x8d,0xf1,0x24,0xb9,0xdf,0x1e,0x64,0x35,0x45,0x2a,0xc2,0xf9,0x96,0x5d,0x10,0x64,0x32,0xae,0xe9,0xf8,0x71,0xd4,0x2d,0x6b,0xc6,0xde,0x08,0x1e,0x5d,0x51,0xf1,0xe7,0xfd,0x3c,0x22,0x43,0x59,0x82,0x83,0x13,0x75,0x36,0xef,0x81,0xe4,0xcf,0xa8 +.byte 0xb8,0x30,0x16,0x44,0xae,0x55,0x06,0xdd,0xb9,0x60,0x3f,0x75,0xc6,0xd1,0x73,0xa9,0xea,0xc9,0x64,0x2b,0x8a,0xde,0x44,0x4b,0x3d,0xc3,0x31,0x12,0x84,0x9a,0xe3,0xda,0x24,0x82,0x99,0x00,0x6d,0x8e,0xb8,0x26,0x82,0xa6,0xc2,0x37,0x6c,0x2a,0x1d,0xcf,0x6d,0x18,0xc7,0xee,0x27,0xca,0xe7,0xad,0x95,0xed,0x7d,0xe0,0xe0,0x6f,0x45,0xc3 +.byte 0x8a,0x2f,0x08,0x49,0x7e,0x09,0x9e,0xc1,0xb7,0x1e,0x8f,0x57,0x61,0xf8,0x3e,0xea,0xd7,0x47,0xfb,0xd0,0xda,0xaa,0x04,0xf9,0x06,0xbb,0xa3,0x80,0x68,0x89,0xb0,0x7f,0x18,0xf3,0xd2,0xeb,0xee,0x48,0x30,0x6a,0x24,0xc8,0x71,0x43,0xc3,0x50,0xcc,0x85,0x68,0xf5,0xca,0x44,0x34,0x43,0xaa,0x2e,0x4f,0x02,0x1b,0x23,0x4f,0xe9,0x07,0x02 +.byte 0xa2,0xfa,0x24,0x57,0x70,0x4e,0x1a,0x78,0x03,0xa2,0xdd,0x53,0x50,0x82,0x05,0xb1,0x0f,0xcb,0x9e,0x2e,0x58,0x04,0x62,0xc8,0xac,0x71,0x31,0x56,0x0f,0xc7,0x70,0x32,0x53,0xda,0x51,0xc3,0x15,0x78,0x82,0xb6,0xe8,0x6e,0x32,0xeb,0x39,0xab,0xba,0x67,0xcc,0xbc,0x99,0x58,0x88,0xc4,0x60,0x0d,0x0b,0xc1,0xfa,0x6f,0x40,0x85,0x04,0xdf +.byte 0x5f,0x17,0x69,0xf1,0xbd,0x44,0x97,0xc8,0x62,0x19,0x49,0x1f,0x23,0xcb,0x3d,0x17,0x04,0xf2,0xbd,0x58,0x15,0xa6,0x37,0x3a,0x3f,0x77,0x98,0x32,0x40,0x8a,0x72,0xf0,0x41,0x0b,0xad,0x88,0xba,0xd3,0xae,0xdc,0x3b,0x9a,0x37,0x89,0xa5,0x09,0xe5,0xbb,0xf2,0xf8,0x5d,0xa5,0xed,0xe8,0x39,0x7b,0xed,0x2b,0x90,0xd6,0x6c,0xd3,0xfa,0x69 +.byte 0xa7,0xca,0x09,0x83,0x15,0x8d,0xd8,0xe3,0x81,0x03,0x4e,0x2d,0xd8,0x96,0x3b,0x4b,0x18,0x91,0xac,0x5f,0x22,0xe6,0x9d,0x4b,0x09,0xaf,0xf0,0xdf,0x16,0xa2,0xf1,0x2c,0xd9,0x35,0x8a,0x6e,0x85,0x7a,0xbc,0xc7,0x10,0xd1,0x5f,0x8a,0x53,0x9c,0x8e,0xbc,0x8c,0x15,0xb3,0x8a,0xb0,0x0b,0x74,0x40,0x2a,0x5f,0x46,0x71,0x1c,0x0b,0xee,0x08 +.byte 0xae,0x17,0x26,0x1e,0xcf,0xbf,0x3d,0xa0,0x5e,0x3a,0xdb,0x39,0x6b,0x4a,0x82,0x53,0x02,0xf4,0xa2,0x15,0x5c,0xb6,0xdb,0x20,0x30,0xa2,0x7d,0xcb,0x9a,0xf7,0x88,0x69,0xb5,0xc8,0xe6,0xcd,0x9e,0xa4,0xaf,0x27,0x0e,0x61,0x41,0xcd,0x8e,0x71,0x83,0x11,0xce,0x5e,0x6c,0xaf,0xa4,0x50,0x81,0xb6,0xf2,0x36,0x05,0xbb,0x36,0x4e,0x4a,0x1b +.byte 0x09,0x9f,0xca,0x1b,0x12,0xb0,0x01,0xc0,0xbf,0x7e,0x3f,0x81,0x60,0x9f,0xfd,0x56,0x81,0x54,0x99,0x2b,0x7f,0x1e,0xb1,0xbf,0xd4,0xb7,0xe1,0x7c,0x71,0xf9,0x00,0x72,0x5f,0x10,0xab,0x60,0x03,0x9d,0x13,0xf1,0xba,0x48,0x93,0x1c,0x1d,0x11,0x04,0x40,0xf6,0xde,0x3b,0xef,0x6c,0x47,0xb3,0x0d,0xcf,0x53,0xbd,0x45,0x7e,0xd7,0x8c,0x34 +.byte 0xd0,0xcb,0x85,0x4b,0x1e,0xd1,0xc5,0xfd,0x5b,0x1a,0x18,0x8a,0x27,0xe3,0x16,0x3c,0x25,0x12,0xf2,0xf1,0xa1,0x40,0x53,0x68,0x27,0x2c,0x81,0x0e,0x20,0x12,0xe3,0xde,0xe2,0x9f,0x08,0x75,0xc0,0x25,0x79,0xf0,0xc4,0xaa,0x10,0xad,0x41,0x3f,0x0b,0xc7,0xb2,0xe0,0x50,0xde,0xec,0x24,0x09,0xeb,0xb5,0xd3,0xbc,0xd3,0xdf,0x44,0x6d,0xc8 +.byte 0xf1,0x79,0xf8,0x33,0xb7,0x75,0x09,0x18,0x04,0x59,0x0f,0x15,0x5e,0xf9,0xca,0xe0,0xa9,0x2a,0xe1,0x1b,0xf0,0x49,0x5f,0xca,0xa3,0x80,0xd5,0x9b,0x1e,0xc1,0x1f,0x98,0x18,0x0a,0x24,0xc3,0x3f,0xfb,0x43,0xfd,0xa3,0x01,0x59,0x50,0xea,0x21,0xe0,0x92,0xfd,0xe1,0xd5,0xe4,0x38,0x24,0x88,0xf3,0xb0,0xc9,0x79,0xfd,0x4e,0xd3,0x3e,0xbf +.byte 0xc6,0xb8,0x9e,0x7f,0xab,0x65,0x79,0xd9,0xb9,0x83,0x38,0xe1,0xf7,0xd0,0x37,0x04,0xb3,0x0c,0x48,0x82,0x74,0xe1,0x0c,0x80,0x13,0x59,0xc4,0x72,0xf9,0x2d,0x88,0x06,0x46,0x08,0x7a,0x6b,0xb4,0xfc,0x5f,0x63,0x31,0x2f,0x4f,0xfd,0x4b,0x1f,0x8e,0x21,0x3c,0x67,0x83,0xdd,0xa9,0x65,0x68,0xc6,0xd0,0xb8,0x1d,0xcd,0x60,0xc5,0xb9,0x3b +.byte 0xea,0xe9,0xc7,0xa5,0x1a,0x98,0x8a,0x87,0xb7,0x73,0x29,0x3a,0x6a,0x3a,0x75,0xbf,0xa4,0x79,0x64,0xcb,0x94,0x68,0x93,0x56,0x55,0x1e,0xd5,0x61,0xda,0x87,0xe1,0x28,0xf0,0xa5,0x64,0x9a,0xd7,0xa0,0x91,0xfd,0x46,0x20,0x6c,0x87,0x1f,0xe8,0x9e,0x7e,0x95,0xc4,0x60,0xdb,0xf4,0xe2,0x3e,0xb2,0x6a,0x4a,0xe7,0x46,0x3f,0xca,0xf3,0x72 +.byte 0xb5,0xe8,0x06,0x3a,0x1b,0xeb,0xcb,0x81,0x46,0x44,0xf6,0x97,0xa0,0x79,0xe4,0xa4,0x8a,0xba,0x5e,0x1b,0x6d,0xf4,0xcf,0x7c,0x12,0x7a,0xec,0xdd,0xf6,0xc8,0xab,0x5f,0x30,0xb3,0xf9,0x8e,0x31,0xfd,0x51,0x95,0x8b,0xa1,0xe9,0xe8,0x2d,0xec,0x86,0x12,0x4a,0xf8,0x8b,0xa5,0xdd,0xb2,0xe4,0xad,0xdd,0xcb,0xf5,0xcd,0x9c,0x9f,0x0a,0x42 +.byte 0x5f,0x83,0x9d,0xa6,0x4f,0xbe,0x11,0x75,0x3c,0xde,0x67,0x6b,0x95,0xcd,0xcf,0xdc,0xfd,0x1f,0x1a,0x14,0x01,0x27,0x68,0xaf,0x9b,0x82,0xd6,0xae,0x29,0x8a,0x1f,0xc8,0xf1,0x1f,0xb8,0xa9,0xa2,0x1d,0x81,0xbb,0x19,0xda,0x06,0xe3,0x34,0x7b,0xce,0x99,0x3c,0x5b,0x0c,0x9b,0x8b,0x35,0xc0,0x6c,0x88,0xef,0xeb,0x9f,0x64,0xe3,0xc3,0xbf +.byte 0x37,0xd7,0xf6,0xdf,0xad,0x28,0xf4,0xd7,0x19,0xb0,0xf2,0xa7,0xd4,0x71,0xbc,0xd3,0xa3,0x09,0x5c,0x1a,0x45,0x30,0x2d,0x53,0xa5,0x19,0x2f,0xb0,0x5d,0xae,0x04,0x28,0xe6,0x16,0x3e,0x75,0x9f,0xcc,0x76,0xc4,0xc2,0xa0,0xfb,0xff,0xdd,0x4c,0xa3,0x8b,0xad,0x05,0x73,0x26,0xf0,0xef,0x48,0xd5,0x25,0x22,0x90,0x78,0x21,0xfd,0xc6,0x23 +.byte 0x14,0xbc,0xed,0x13,0x29,0x76,0x17,0xa6,0x93,0x09,0x6e,0xa7,0x42,0xdd,0x11,0x9e,0x05,0xa3,0xb7,0x48,0x84,0x85,0xf8,0x4e,0xed,0x3d,0xdb,0xfc,0x68,0xd2,0xec,0xec,0x69,0x2b,0x60,0x38,0xd1,0x99,0x44,0xf9,0x60,0xd3,0x5a,0x9e,0xe4,0x26,0x9d,0x12,0xf8,0x6a,0x53,0xde,0x76,0x78,0xa7,0x68,0xb0,0xb4,0xdc,0x33,0x7b,0x8a,0x73,0xa0 +.byte 0xa5,0x5f,0x8f,0x81,0x0e,0x51,0x06,0x13,0x6b,0x56,0x16,0x91,0x1f,0xf5,0x6b,0x68,0xe6,0x8b,0x69,0xda,0x0a,0x9c,0xb1,0x74,0x8f,0x1c,0xb3,0xbf,0x52,0x59,0xaa,0xb1,0xb6,0x3a,0x81,0xc2,0x04,0x54,0x12,0x46,0xa2,0xd5,0x21,0xdf,0xe0,0x57,0x1f,0xe8,0x36,0x56,0x87,0xbf,0xcb,0x7d,0x06,0x6c,0xd5,0xc9,0x4e,0xca,0x47,0x47,0x11,0x91 +.byte 0x7a,0x14,0x13,0x5d,0x5d,0x46,0xd5,0x3a,0xe4,0xa4,0x4d,0x99,0x3a,0x54,0x99,0x62,0xb4,0x70,0xa0,0xf5,0x8a,0xda,0x05,0x75,0xf1,0xa5,0xa1,0x5d,0x9d,0xc4,0x7f,0x83,0x8a,0x5b,0x09,0x54,0x0e,0x69,0x28,0xef,0x66,0xfb,0xe4,0xc4,0xe4,0xc4,0xda,0xb0,0xda,0xe2,0x19,0x33,0x3c,0x76,0xa0,0x35,0xdc,0x31,0x4e,0x40,0xfe,0xb8,0x20,0x26 +.byte 0x8f,0x6f,0x7d,0x02,0x54,0x86,0x1d,0xca,0xa6,0x10,0xa6,0x89,0x87,0x3a,0x5a,0xd5,0x3d,0x0f,0xb5,0x81,0x7d,0xab,0xb6,0xc6,0x36,0x87,0xce,0xd7,0xe4,0xc3,0x9e,0xc2,0x9c,0xf6,0x75,0xd5,0x9a,0x69,0xd2,0x13,0x89,0x5a,0xe9,0x29,0xc9,0xf5,0x6e,0xcc,0x05,0x87,0x0a,0x61,0x49,0xd7,0xa5,0x76,0xd0,0xaf,0x96,0xe0,0x2f,0x91,0xf4,0x45 +.byte 0x70,0x5a,0xdc,0x9f,0x07,0x7f,0x86,0x02,0xa4,0x83,0x8d,0x4a,0x6d,0xfc,0x1b,0xd8,0x9b,0xc2,0x42,0x4f,0xcb,0xdf,0xcb,0xe0,0x55,0xb4,0x8f,0xf7,0x27,0x73,0xd9,0x7e,0xf8,0x3a,0x5c,0x4f,0x29,0x64,0xd8,0x39,0xfa,0xf2,0xc4,0x6b,0xeb,0x55,0xc3,0x13,0x22,0x15,0xdf,0xc5,0x91,0x6d,0xd7,0xf3,0x11,0x34,0x08,0xce,0xe5,0xbd,0x16,0x14 +.byte 0x60,0x14,0x8a,0xed,0x4d,0x38,0x98,0x15,0x5d,0xee,0x70,0xff,0x05,0xd2,0x74,0x3a,0x5f,0x78,0x1a,0x70,0x61,0x2a,0x42,0x4a,0xf3,0x15,0x6f,0x9e,0x33,0xca,0xb8,0x46,0x22,0x64,0xd6,0x24,0xe8,0x10,0x1a,0x89,0xab,0x74,0xdf,0x56,0x35,0x41,0x57,0xe1,0xd9,0x4b,0x67,0x60,0x89,0x6f,0xbf,0x73,0xac,0x6b,0xf9,0x78,0x3f,0xbc,0xf3,0x2a +.byte 0xb5,0x8c,0x1f,0xda,0xe7,0xe2,0xac,0x60,0xbf,0x41,0x96,0xbb,0xd5,0x35,0x9c,0x56,0xe7,0xfd,0x95,0xc7,0x4d,0x32,0xa1,0x07,0x34,0xbc,0x99,0xca,0xcc,0x42,0x71,0xfb,0xec,0x5c,0x1e,0xf9,0x8b,0xde,0x43,0x65,0x84,0x16,0x52,0x0a,0x5e,0x92,0x20,0xd8,0x26,0x4b,0x97,0x71,0xde,0xd2,0x1f,0x2e,0xd1,0xb2,0xb6,0x29,0x6a,0x6d,0x41,0x00 +.byte 0x20,0x3d,0x03,0xf8,0x43,0x7b,0x57,0x87,0x4e,0xf1,0x8e,0x6f,0xd3,0xf4,0x6c,0x6c,0x29,0xf6,0x99,0xe3,0xd3,0x1d,0xd3,0x26,0x21,0x3b,0x02,0xa2,0xc1,0x06,0xcf,0x31,0xec,0x7f,0xc6,0x80,0xbc,0xab,0x86,0x01,0xff,0x11,0x8a,0x24,0xfd,0x1b,0x41,0x49,0xd4,0xbe,0x15,0x34,0x82,0xc5,0x02,0x51,0x67,0x5c,0x41,0x8e,0xbf,0x94,0x12,0x15 +.byte 0x64,0xea,0x00,0x0c,0x51,0x40,0x57,0x66,0x1e,0x6d,0x3e,0x41,0x8e,0x84,0xdf,0x71,0xb8,0xd7,0xfa,0x12,0x17,0x22,0x17,0x05,0xdc,0x82,0xfd,0x7c,0x5e,0xfa,0x62,0x23,0xa8,0xbe,0x14,0xdc,0x84,0x42,0xf0,0x90,0xc5,0xb0,0x68,0xbe,0x64,0x74,0xc3,0xa5,0xd1,0x10,0xcf,0xe3,0xd1,0x09,0x98,0x3b,0xb9,0x19,0xf2,0x9b,0x5d,0x90,0x99,0x3d +.byte 0x30,0x67,0x55,0x34,0x50,0x78,0x3b,0xd2,0x70,0xb1,0xd2,0x91,0x4e,0xfa,0x98,0x7d,0x93,0xad,0x7f,0xb1,0x89,0xb0,0x61,0x4c,0x95,0x3f,0x51,0x95,0xd7,0xc6,0x87,0x7a,0xc5,0x53,0xb6,0x6d,0x61,0xec,0xbe,0x40,0x1f,0xa5,0x7f,0x73,0x4a,0x78,0xd2,0x58,0x1e,0x41,0x8e,0x9a,0x08,0x49,0xce,0x39,0x52,0xf9,0xd1,0xcd,0x41,0xb6,0x39,0x99 +.byte 0xfa,0xfb,0x1c,0x38,0xe1,0xe5,0xe1,0xd6,0x16,0x0f,0xc8,0x12,0x0b,0x88,0xdc,0x00,0xd4,0x7b,0x24,0x69,0x16,0x27,0x37,0xa3,0xd5,0x39,0x27,0x34,0xda,0x23,0x24,0x50,0x13,0xd8,0x02,0x48,0x14,0xd7,0xc9,0x28,0x1b,0xba,0x66,0xa8,0xc8,0x9a,0x7b,0xed,0x92,0x5b,0x78,0x46,0x79,0x5a,0xd1,0xf2,0x75,0xf0,0x98,0xd3,0x9f,0x4c,0x72,0x51 +.byte 0xed,0xe5,0xce,0x83,0xac,0xe1,0xc8,0x2b,0x7f,0x77,0x6a,0x70,0xdd,0x80,0x88,0x62,0x58,0x94,0x15,0x72,0x53,0x34,0x48,0x17,0xb2,0xe8,0x4a,0xab,0x2d,0x4e,0xef,0x93,0xb7,0xba,0xd1,0x1c,0x53,0x69,0xd5,0xac,0xa1,0x61,0x7c,0x44,0xec,0x81,0x72,0xcc,0xe8,0x6f,0x5d,0x67,0x1f,0x65,0x9a,0x34,0xf5,0x95,0x89,0x1c,0x2e,0x54,0x42,0xc0 +.byte 0x85,0x79,0xb0,0xfa,0x44,0x0d,0x28,0xc4,0x20,0x2f,0x2e,0x85,0x73,0xfb,0xf6,0x44,0x0e,0xbc,0xab,0x4f,0x42,0x5c,0xdb,0x1f,0x11,0x6f,0x9a,0x23,0x75,0x70,0x78,0x1a,0xd2,0xb8,0x83,0x72,0xf5,0xf6,0x40,0x48,0x3f,0xc8,0xd5,0xe3,0x2c,0x08,0x5c,0x0c,0x2a,0xb0,0x8e,0x69,0xe6,0xdf,0x4b,0x4a,0x95,0x9c,0x4c,0x5e,0x09,0x24,0xc3,0xd0 +.byte 0x4c,0x20,0x0c,0x9a,0xce,0x95,0x53,0x6a,0x7b,0x54,0x0a,0x7e,0x73,0xa7,0x95,0xe7,0x7c,0x67,0x9d,0x05,0xbc,0x26,0x3a,0xa1,0x43,0x99,0x7a,0xee,0x04,0xcf,0x94,0x02,0x36,0x26,0xb3,0x81,0x74,0x22,0xee,0x1e,0x9e,0xe2,0x82,0xd4,0xe0,0xca,0xf2,0xec,0xd2,0x9e,0xf8,0x3f,0x9f,0xc4,0x5b,0xe8,0xfc,0xbd,0x93,0xaa,0xc3,0x2f,0xce,0xf2 +.byte 0x32,0xa9,0x23,0xf3,0xe1,0x06,0xae,0x7d,0x87,0xe9,0xe7,0xe0,0xc1,0x7c,0x74,0x9c,0xdf,0x86,0x6d,0x5c,0x8a,0x51,0x45,0x9d,0x43,0x49,0x87,0x45,0x75,0xfb,0x40,0x55,0xab,0x9a,0x52,0xf1,0x32,0x5e,0xde,0x8b,0x52,0x50,0x9f,0xb8,0x7a,0xe5,0x1c,0x40,0x4f,0xc7,0xb1,0x29,0x90,0xcc,0x98,0x99,0xa0,0x4e,0x1c,0x43,0x6e,0x91,0x61,0x9c +.byte 0xf7,0xa7,0xf7,0x43,0x89,0x15,0x8c,0x56,0x22,0x9d,0x66,0xac,0x71,0x19,0xdc,0xb9,0xf8,0xd3,0xaf,0x2e,0xd7,0x7b,0xc3,0xe4,0x25,0x0d,0x2c,0xaf,0x15,0x8c,0xea,0x2b,0xdb,0x8c,0x71,0xff,0x55,0x29,0x11,0x35,0x11,0xef,0xb0,0x97,0xb2,0x95,0xab,0xeb,0x4a,0x40,0x1c,0x92,0xc4,0x13,0x36,0x74,0x53,0x78,0x51,0x6c,0xca,0x37,0xcb,0xda +.byte 0x5e,0x6b,0x8c,0x69,0xc5,0xd0,0xf9,0xdb,0xbe,0xd9,0x30,0x42,0x16,0xcf,0x40,0x63,0x87,0x10,0x28,0x7d,0xae,0xa9,0x8c,0x14,0x99,0xe1,0x4f,0x11,0x98,0x7e,0xe9,0x14,0x9c,0x2e,0xe2,0xed,0x20,0x15,0x7c,0xb5,0xf4,0xc9,0x16,0x30,0x8d,0x7c,0x61,0x45,0xf4,0x23,0xf5,0xdb,0x81,0x8f,0x6b,0x41,0xaf,0xa9,0xf8,0x51,0xbe,0xc4,0x5d,0x8c +.byte 0xda,0x5e,0x07,0x62,0x7c,0xc6,0xd1,0xae,0x91,0x5e,0x05,0xa8,0xc6,0xc5,0xfc,0xb7,0x12,0x2e,0x7f,0x85,0xef,0xbd,0x2b,0x56,0x57,0x32,0xad,0x3d,0x97,0x5b,0x26,0xcf,0xd3,0xe7,0x48,0x4e,0x9b,0x15,0x98,0x77,0xb4,0x3e,0xf1,0x3e,0x1c,0x21,0xb0,0x98,0xe2,0x69,0xee,0xd8,0x29,0x10,0x93,0xd5,0xc9,0x71,0x8f,0x28,0xbd,0xe3,0xd9,0x54 +.byte 0xf3,0x72,0xb6,0x85,0xe9,0x2b,0xdc,0x96,0x52,0x53,0x5c,0x61,0x54,0x96,0x4a,0xf5,0x3f,0xee,0x53,0xc3,0x63,0xc9,0x67,0x14,0xdf,0x3a,0xfe,0x46,0x8a,0xa6,0xec,0x06,0x0c,0xea,0xb8,0x82,0x49,0xb5,0xed,0x94,0xf2,0xac,0x76,0xd5,0x87,0x79,0x15,0x4f,0xa1,0x34,0x90,0x8e,0x7b,0x02,0xf7,0x02,0xb0,0x07,0xa5,0x7c,0x6b,0xc2,0x34,0x84 +.byte 0xd4,0xaa,0xbf,0x32,0x81,0xf7,0xed,0x1f,0x61,0xd7,0x6e,0x40,0xa0,0xdc,0x4c,0xb5,0xb7,0x36,0x3a,0x87,0x09,0x82,0xd5,0x5a,0xc8,0x1f,0xe6,0x77,0xa6,0xaa,0xcf,0x3c,0x7b,0x23,0x46,0x58,0x95,0x7f,0x84,0xba,0x4a,0x05,0x0b,0x36,0xdb,0x58,0xf9,0xa4,0x2b,0x24,0xd4,0x8a,0xbc,0xb2,0xb7,0x04,0xac,0x64,0x0e,0x88,0x25,0x9a,0x69,0xe7 +.byte 0x87,0x70,0x0b,0xa6,0x43,0xe9,0xb2,0xbb,0x4e,0x4c,0x10,0x19,0x44,0x4d,0x12,0x4c,0x58,0x2a,0x49,0xe2,0x01,0xd2,0x65,0x23,0xee,0xe9,0xca,0x0b,0xa1,0x28,0x02,0x8d,0xcf,0x37,0x06,0xbc,0x5d,0x35,0xba,0xec,0x97,0x95,0xcc,0xfe,0x7b,0xc9,0x1c,0x0d,0x89,0x4e,0xe1,0x8d,0x9b,0x5e,0x5b,0xb9,0x6c,0x24,0x73,0x9a,0x62,0xd7,0xc5,0xfa +.byte 0x54,0xeb,0x05,0x22,0xd9,0xe7,0xc4,0x68,0x88,0x20,0x43,0xd9,0x14,0x47,0xd7,0xa5,0xd0,0xce,0x10,0x77,0xe8,0x5c,0x85,0x39,0x99,0x3f,0x72,0x88,0x4f,0x22,0x15,0x87,0xa0,0xa3,0x47,0x10,0x81,0x64,0xff,0x94,0x77,0x5d,0xce,0x6d,0xd8,0x29,0xb1,0x9c,0x8e,0xce,0xa8,0x39,0x4f,0xfc,0x36,0x3c,0x50,0xb2,0xf1,0x08,0x66,0x1a,0xf0,0x22 +.byte 0x65,0x1f,0x4d,0x17,0xd3,0x63,0x10,0x64,0xd1,0xc6,0x5a,0x3e,0x82,0x72,0x0c,0x48,0x5e,0x07,0x9c,0x07,0xa0,0x40,0x60,0xab,0x74,0x9a,0x00,0xdf,0xd7,0x7d,0xd4,0x11,0x4e,0xce,0x5a,0xaf,0x12,0x4f,0xe7,0x12,0x36,0x1a,0x12,0x11,0x16,0xb7,0xad,0x4b,0x28,0x84,0x7b,0xd8,0x30,0x0d,0x85,0xb8,0x76,0xde,0xa3,0x78,0x8c,0xb7,0x7c,0xbc +.byte 0x97,0x33,0x53,0x95,0xf8,0x14,0x5f,0xf8,0x0d,0xc1,0x6b,0x79,0xa2,0x42,0x49,0xab,0xae,0x8e,0x78,0xf3,0x51,0x01,0xcc,0x20,0x36,0x80,0xbd,0x32,0x0b,0x1b,0xd2,0xcd,0x27,0x52,0x69,0x1b,0x4a,0x37,0xba,0x31,0xe4,0xc2,0x03,0x8d,0x00,0x48,0x4b,0xcd,0x39,0x2e,0xec,0x94,0x2e,0xe0,0x81,0xfd,0x94,0xd9,0x86,0x39,0x23,0x87,0x3c,0x2f +.byte 0x25,0xe1,0x5b,0x22,0xe0,0x2e,0x37,0x6d,0x9b,0x97,0x9c,0x94,0x37,0x01,0x26,0xb8,0xb1,0x73,0x7c,0xfc,0x0a,0x64,0xe7,0x54,0xf1,0x0f,0x71,0xa1,0xd6,0xc7,0xc8,0xb4,0x86,0x2d,0xfe,0x30,0x8b,0xca,0xb2,0x18,0x21,0xc0,0xc7,0x7d,0x60,0xcf,0x2e,0x25,0xb0,0xa4,0x1a,0x28,0x19,0xa9,0xa9,0x15,0x32,0x5e,0x21,0x89,0x3a,0x99,0x5f,0x50 +.byte 0x86,0x37,0x3b,0x10,0xb8,0xa5,0xad,0x8e,0xbf,0xfc,0x8c,0x85,0xf1,0x76,0x5c,0xe7,0x4d,0xac,0xe7,0x21,0xb3,0x45,0x87,0x3b,0x05,0xc8,0x41,0xf4,0x99,0x83,0x28,0x40,0x6b,0x30,0x37,0x31,0xd2,0xb3,0xdd,0x43,0x3b,0x3f,0xec,0x50,0x58,0x7d,0x20,0xc6,0xb2,0xa9,0x3c,0x22,0x38,0xea,0x16,0x32,0x01,0xc4,0xb0,0x9f,0x7d,0x12,0x91,0x82 +.byte 0x0c,0xd8,0x36,0xfc,0xa4,0xec,0x06,0xb2,0xc2,0xce,0x9b,0xa4,0x53,0x71,0x77,0xdd,0xc3,0xfc,0x34,0x6f,0xd9,0x5c,0xfc,0x36,0xdd,0x63,0x19,0x06,0xfb,0x3c,0xf3,0x3f,0x82,0x28,0x6d,0x00,0xf9,0xfd,0x8d,0x6b,0x79,0x06,0x8a,0xe7,0x6f,0xcc,0x39,0x12,0x80,0x71,0xcb,0x71,0xb3,0xb6,0xa4,0xa8,0xbe,0x61,0x9d,0x1f,0x48,0xa2,0x15,0xa1 +.byte 0xb5,0xf5,0x16,0x70,0xc5,0x39,0xce,0x43,0xa3,0x09,0xe5,0xf4,0x8b,0x77,0x18,0x5e,0xa0,0x77,0xa3,0xa4,0x17,0x2c,0x3e,0x50,0x73,0x2f,0xaa,0x5d,0x58,0x5e,0xdc,0xec,0xaf,0xca,0x6e,0x57,0x80,0xa3,0xd5,0x94,0x30,0x7c,0x11,0x75,0xc4,0xbb,0x9d,0x18,0xc1,0x5a,0x58,0xc7,0x04,0x56,0xb1,0x3a,0x21,0x55,0x02,0xea,0xad,0x58,0x19,0x72 +.byte 0xdc,0x7d,0x0e,0x41,0x62,0x1b,0x5c,0x48,0x97,0x3f,0xed,0xd7,0x4e,0x30,0x1f,0xf5,0xde,0xc5,0x23,0xf2,0xd7,0x22,0xde,0x2f,0x3e,0x80,0x06,0x81,0xf6,0x24,0xb7,0x91,0x09,0x56,0x91,0x00,0x1a,0xea,0xaa,0xa6,0xc2,0x8b,0xc9,0x78,0xd7,0xde,0xf6,0x87,0xb1,0x04,0xcc,0xbb,0xc1,0xc6,0x48,0x43,0xc8,0x03,0xb2,0xdd,0x70,0xc0,0xe3,0xf5 +.byte 0xc0,0xf5,0x13,0xd5,0x11,0x41,0x7f,0x1a,0xdc,0x48,0xf5,0xd6,0x1b,0x0a,0x84,0xd2,0x84,0xcd,0x10,0x4f,0x0a,0xd7,0xcb,0x41,0x61,0x1c,0xcc,0x5c,0xa9,0xbd,0x6e,0x6a,0xf3,0x81,0xd8,0xaa,0x3a,0xff,0x39,0x90,0x8e,0x33,0xe6,0x58,0x13,0x5f,0xec,0x58,0x74,0x35,0xe0,0x06,0x38,0x0f,0xd0,0xbf,0x8d,0xf7,0x26,0x99,0xea,0xdd,0xfb,0xdf +.byte 0x5b,0xcc,0xf1,0x3d,0x9b,0x84,0x8b,0x5b,0xe8,0xc4,0xc6,0x3e,0x0a,0x55,0xec,0x73,0xf7,0x70,0xb1,0xc8,0xfa,0xf8,0xd6,0x72,0x2c,0x6d,0x8d,0xc1,0xa3,0xb2,0x9a,0xe7,0x80,0x6d,0x09,0xa6,0x76,0x06,0x71,0xf9,0x95,0x9a,0xa9,0x2f,0x4b,0x7c,0xad,0x64,0x01,0x01,0x91,0xe4,0x87,0x1d,0xe1,0x46,0xf5,0x4a,0x96,0xc6,0x58,0xd9,0xe0,0xa9 +.byte 0x2f,0x80,0x1e,0xd6,0xe9,0xa6,0xeb,0xfe,0x5a,0xb6,0xd3,0xe8,0x76,0xd2,0x51,0xc6,0x68,0x34,0xc9,0xed,0x76,0x29,0x7e,0x63,0xb1,0x09,0xdf,0x23,0x47,0x41,0x2f,0x70,0x46,0x4d,0xbb,0x36,0xc8,0x84,0xe9,0x58,0x20,0x6b,0x04,0xb2,0xa4,0x1c,0x4d,0xe0,0xa5,0xa2,0x59,0xc9,0xed,0x63,0x25,0x5f,0x3f,0x24,0x18,0x59,0x29,0xe3,0x79,0xbd +.byte 0x35,0x50,0xee,0x81,0x59,0xff,0xd4,0x0e,0x62,0xd3,0x52,0x30,0x81,0xa2,0xe6,0x9e,0xc3,0xc9,0x7a,0x10,0x57,0x36,0x27,0xb7,0x3c,0x61,0x38,0x89,0x70,0xa0,0xc5,0xdf,0x78,0x05,0xa5,0x81,0xe2,0x8a,0x93,0xda,0x7c,0xaf,0xbf,0x6d,0x42,0x09,0x1b,0x43,0x9d,0xf9,0x26,0x87,0xc3,0x84,0x6c,0xb7,0x25,0x31,0x50,0x00,0xd8,0x13,0xc0,0xc0 +.byte 0x6c,0x21,0x82,0x6d,0xf9,0x2f,0xef,0x40,0xe8,0xf8,0xae,0x4d,0x9e,0x1d,0x4a,0xda,0xa0,0x0d,0x77,0x36,0x8b,0xed,0xaf,0x6e,0x2a,0x3d,0xa8,0x36,0xe4,0xff,0x37,0xc2,0xa3,0x11,0x5e,0x68,0x58,0xa8,0xa3,0x19,0xf3,0xc1,0x33,0xea,0x39,0x49,0xfe,0x51,0x87,0xb6,0x31,0x6a,0x61,0x47,0xe7,0xb1,0x46,0xde,0x5a,0xf7,0x93,0x06,0xa7,0x72 +.byte 0xa9,0x2e,0x9e,0x2e,0xc9,0x7f,0xe1,0xb2,0x86,0xb4,0xc9,0xff,0x3b,0xf7,0xaf,0xef,0x91,0x47,0xc2,0xfa,0x42,0x0a,0x4e,0xbb,0x10,0x0d,0xea,0xa4,0x11,0x54,0xa9,0x53,0xde,0xc4,0x01,0xde,0xc7,0x2d,0x1f,0x18,0x40,0x79,0xd1,0x44,0x7d,0x51,0x1d,0xf6,0xdc,0x6f,0xad,0xa2,0x5d,0xd9,0xbe,0x5d,0x11,0x57,0xb7,0x68,0x0d,0x96,0xad,0xb3 +.byte 0x32,0xf7,0x99,0xcc,0x0e,0x03,0xa2,0x79,0x9b,0x63,0xce,0xee,0xf9,0x0c,0xfd,0xfa,0x9a,0x82,0xc9,0x43,0xd3,0xd5,0x23,0xfa,0xac,0x75,0xbe,0x61,0x85,0x18,0xb6,0x75,0x72,0x8d,0x17,0xdd,0xde,0x3f,0x6d,0xb4,0xe8,0x47,0x09,0xe1,0xa7,0xe0,0x4c,0xce,0x93,0x7b,0xc3,0xa3,0x3f,0xc0,0x81,0x21,0x6f,0xe8,0xce,0x68,0x61,0xde,0x1a,0x58 +.byte 0x48,0x7f,0xb4,0xae,0xfd,0x7c,0x80,0x63,0x43,0x5a,0xfc,0xf9,0xf9,0x4d,0xb4,0x8c,0x85,0x27,0x12,0x4f,0x7d,0xe8,0x69,0xc3,0x7d,0x57,0x63,0x0d,0x5f,0xd2,0x85,0x4e,0x0c,0x9a,0x0d,0x1c,0x4d,0xdf,0x3f,0x9a,0x16,0x2f,0x34,0x43,0xc3,0xf0,0xf1,0x16,0x16,0xd2,0x9f,0x2e,0x78,0xd8,0x3c,0x63,0xa0,0x7e,0x02,0x8e,0x65,0xd2,0xb0,0x61 +.byte 0xb0,0x1d,0x7a,0x8f,0xf7,0x30,0x45,0x05,0xf7,0x15,0xc3,0x69,0x24,0x98,0xc3,0x74,0x20,0x16,0x09,0x57,0x39,0x16,0x68,0x23,0x33,0x62,0x4c,0xf5,0xd6,0x34,0xe3,0xad,0x7a,0x14,0x64,0x8c,0x2b,0x48,0x96,0xf9,0x85,0x39,0x19,0x73,0x27,0x04,0xa6,0x55,0x66,0x15,0x8c,0xf1,0x47,0xcd,0x53,0xaf,0x31,0x3a,0xd9,0xfa,0xf9,0xac,0xbd,0xb8 +.byte 0x27,0xe0,0xaa,0xa5,0x62,0x85,0x9f,0xbb,0x4e,0xaf,0xa5,0x72,0x42,0x98,0xa6,0x7f,0xa1,0xb6,0xac,0x17,0xc2,0x2c,0xf3,0xd6,0xc0,0x14,0x4b,0xb3,0x86,0x88,0x89,0x81,0x83,0x7d,0x9d,0xf7,0xe3,0xe4,0x27,0xba,0xa8,0x03,0xb4,0xe3,0x97,0x74,0x1c,0x0d,0xab,0xb4,0x6e,0xc6,0x9e,0x58,0xdd,0x15,0x95,0x2f,0xa6,0xd6,0xaa,0x5a,0x96,0x71 +.byte 0x69,0xca,0xe0,0x5f,0xd2,0x3c,0x66,0x1b,0x58,0x25,0xd6,0xec,0xc0,0x46,0x3e,0x56,0xd0,0xe1,0x36,0x44,0x56,0xc0,0xf2,0x15,0x48,0x9e,0x07,0xce,0x5d,0xb9,0xd4,0x4e,0xcc,0x31,0x26,0xaa,0xdb,0x6a,0x87,0x98,0x0e,0x37,0xfc,0xc5,0x91,0x28,0x1b,0xf8,0x70,0xbf,0x30,0x71,0xbe,0xa0,0x81,0x1e,0x30,0x33,0x37,0x37,0xc8,0x07,0x08,0x9b +.byte 0x8f,0xe4,0x27,0x9f,0x90,0x67,0xb4,0x96,0x08,0xd7,0x30,0x9e,0xa6,0x53,0x39,0xd1,0x9b,0xde,0x02,0x35,0xf3,0xb1,0x19,0x7b,0xd2,0x28,0x5a,0xc3,0x1f,0x69,0x0e,0x48,0xbf,0xa3,0xb4,0x55,0xd1,0x10,0x3d,0x30,0x71,0xc6,0x82,0x2d,0xb8,0x6f,0xe6,0x99,0x6b,0xef,0x9f,0x86,0xed,0x93,0x13,0xb6,0xb0,0x87,0x91,0x77,0x4a,0x00,0xe4,0x5f +.byte 0x4c,0x7d,0x41,0x3b,0xc9,0xda,0x99,0x6b,0xff,0xec,0xef,0x05,0x3c,0xc6,0x0d,0xec,0x68,0x12,0x44,0x31,0xac,0xc9,0x0b,0x9c,0xf5,0xea,0xed,0xda,0x88,0xec,0x6e,0x6e,0x73,0xda,0x85,0x52,0x69,0xa1,0x13,0x52,0xcf,0xc3,0x4d,0x95,0x88,0xec,0x1f,0x53,0x81,0x6f,0xac,0x53,0x60,0x48,0x20,0x9a,0x4d,0x88,0x2c,0x4b,0xb0,0x69,0x5f,0x07 +.byte 0xf9,0xa7,0x2c,0x9a,0x13,0x91,0x86,0xa2,0x98,0x20,0xa9,0x80,0x1e,0xaa,0x8e,0xbc,0x3c,0x3d,0x51,0x34,0x3d,0x5b,0x80,0xe4,0x39,0xfe,0xc8,0xb1,0x6d,0xfe,0x36,0x9d,0x9b,0xde,0x22,0x39,0x41,0xe9,0xff,0xda,0x67,0x67,0xd4,0xeb,0x60,0x44,0xd5,0xc1,0x74,0xcd,0xa0,0x98,0x06,0x34,0x76,0xf8,0xe5,0x0d,0xc8,0x52,0xca,0x83,0xd2,0xdd +.byte 0xf2,0x12,0x36,0x7d,0x3e,0x7f,0xbd,0xa6,0xd8,0x1e,0xc0,0x9d,0x67,0x2a,0x33,0x87,0x86,0x79,0x7a,0x70,0x3a,0x63,0x0b,0x74,0x77,0x89,0xce,0x8f,0x5a,0x3b,0xf3,0x2e,0x52,0x4d,0x1d,0xc6,0xc3,0xc8,0x69,0x98,0xdc,0x81,0x45,0x99,0xfd,0xcd,0x6b,0x6d,0x05,0x33,0x40,0xde,0xb3,0xbd,0x4a,0x27,0xc2,0x9e,0x8b,0xf1,0x4c,0xac,0x92,0x82 +.byte 0x55,0x04,0x79,0xe7,0x28,0x74,0x5b,0x70,0xdc,0xc0,0x4f,0x0c,0xcf,0x3a,0x7f,0x08,0xcc,0x2e,0x1d,0xfd,0x8d,0xd9,0x5c,0xe2,0xa7,0x98,0xc1,0xe8,0x4b,0x96,0xbe,0x27,0xd6,0xfd,0x0a,0x59,0x30,0x33,0x85,0x41,0xc5,0x63,0xab,0xe7,0xda,0x26,0xbd,0xce,0xe7,0x9d,0x50,0xd7,0x2d,0x67,0x7a,0xa1,0x05,0x2b,0x74,0x60,0x5e,0x6c,0x04,0x2b +.byte 0xba,0xe6,0x2d,0x25,0xc9,0x00,0xd0,0xf0,0xa5,0x4f,0x22,0x59,0x34,0xb8,0x43,0x6b,0xb7,0x67,0x25,0x99,0xff,0x75,0x17,0xb1,0x13,0x7e,0x34,0x1d,0x42,0xa3,0x6b,0xb5,0x9d,0xfe,0xa1,0x71,0x0d,0x90,0x81,0x58,0xfc,0xc7,0x85,0xe6,0xbd,0xc2,0xcc,0xc9,0xc9,0x23,0x6e,0xd6,0xbe,0x4a,0x61,0xd4,0xf5,0x9e,0x37,0x6a,0xb1,0x8b,0x91,0x59 +.byte 0xe1,0x3e,0xac,0x87,0x54,0xa6,0xf9,0xf5,0x90,0xd2,0x7c,0xba,0x4b,0x37,0x33,0x1b,0x88,0x5e,0xbd,0x78,0x3f,0xed,0x43,0x40,0x4f,0x16,0x59,0x29,0xbc,0x27,0x98,0x87,0xfe,0x62,0x56,0x93,0x21,0x0a,0xca,0xc1,0x21,0x99,0xb3,0x32,0xbb,0x5a,0x79,0x40,0xab,0xea,0x00,0xf8,0xe9,0x90,0x0d,0x59,0xbd,0x6e,0x7f,0x74,0x01,0x50,0x67,0x3a +.byte 0x8e,0x24,0x1d,0x6c,0xc8,0xd6,0x93,0xca,0x71,0x95,0xec,0xac,0x78,0xe9,0x1f,0x38,0x0d,0xa2,0xe5,0x32,0x90,0xa2,0xaf,0xef,0x15,0x06,0xd6,0x52,0xa4,0xd2,0x94,0x0f,0xbd,0x86,0x81,0x82,0x12,0x9b,0x3a,0xc4,0x0b,0xdf,0x8a,0x5f,0xc6,0x3b,0xb4,0x13,0x9b,0xeb,0xed,0x2d,0x06,0x46,0xa3,0xbe,0xbb,0xe1,0xe1,0x93,0xa1,0xab,0x46,0xf3 +.byte 0xd0,0xd9,0xce,0xb6,0xfb,0xd0,0xd5,0xb6,0xde,0x0c,0xed,0x90,0x18,0x6c,0x1e,0x46,0xb0,0x36,0xa7,0xf1,0x29,0xbe,0x9a,0xa0,0xcf,0xed,0xd6,0xaf,0xb8,0x89,0x9b,0x83,0xa8,0xa0,0x8d,0x26,0xaf,0x8f,0x48,0x66,0xfc,0x22,0x1a,0xc0,0xcf,0xf8,0x90,0x57,0x7e,0x25,0x5f,0xe4,0x0c,0x68,0xd2,0xaa,0x59,0x09,0x2f,0x6d,0x3f,0x80,0x8d,0xe0 +.byte 0xfa,0x25,0xb0,0xe0,0x85,0xe9,0x13,0x39,0x3d,0x1f,0xed,0xd1,0x94,0x9b,0xb5,0xc2,0x65,0xda,0xec,0x7a,0x1f,0x2f,0xe2,0x0a,0x42,0x09,0xbd,0x79,0x7d,0xcb,0xb8,0x4a,0x02,0x2b,0x72,0xaf,0x33,0x85,0x72,0x1b,0x18,0x0c,0xa3,0xec,0x39,0x0e,0x30,0x21,0x41,0xf8,0x2e,0xc7,0x8e,0x5c,0x4c,0xda,0x22,0x49,0x8c,0xa7,0xfb,0x89,0x76,0x2e +.byte 0x45,0x90,0x6c,0xeb,0x70,0x78,0x6d,0x6e,0xee,0x12,0x6c,0xb9,0xb9,0x8d,0xe7,0xf3,0x4d,0x86,0xc4,0x58,0x49,0x55,0xa6,0x86,0xaf,0x39,0x03,0x21,0xfa,0xa7,0xdd,0x51,0x80,0x79,0x6d,0x5b,0xa5,0x58,0x0f,0xfd,0x57,0xb3,0x83,0xe6,0x0d,0x25,0xec,0x55,0xdc,0x0a,0x6f,0xbc,0x7d,0xfd,0x94,0x16,0xdd,0x60,0x9f,0x2a,0x4b,0x6c,0x82,0x03 +.byte 0x4b,0x44,0xbb,0x84,0xdc,0xcb,0x97,0x8e,0x58,0xe7,0xc1,0x79,0xa9,0xf3,0x53,0x78,0x1f,0xf1,0x3e,0xdd,0x94,0x24,0x6d,0xb1,0xd2,0x99,0xbc,0xa1,0xbe,0x7d,0xdd,0xff,0xa8,0x5d,0xd2,0xc2,0xba,0xad,0x60,0x6b,0x40,0x5d,0x7b,0x99,0xd2,0xea,0x45,0x66,0x80,0x6c,0x47,0xf2,0xeb,0x94,0xb8,0xe8,0xe8,0xa0,0x46,0x05,0xe1,0x4f,0x40,0x23 +.byte 0x34,0xdf,0x91,0x63,0xae,0xc9,0xe7,0x32,0x20,0x9a,0x95,0x1e,0xcd,0x5a,0x60,0xe1,0x3d,0xe0,0xf1,0x16,0x3d,0x6e,0x8b,0x96,0x23,0xe0,0xaa,0x1d,0x1a,0xde,0xed,0xc6,0x63,0xb5,0x46,0x8b,0x78,0x71,0x9a,0x14,0x88,0x79,0x61,0x68,0x6b,0xcf,0x80,0xd8,0x9c,0xaa,0xfb,0xb1,0xc0,0xf3,0x39,0x07,0x26,0x56,0x80,0xba,0x9d,0xf5,0xe7,0x95 +.byte 0x99,0xac,0x90,0xea,0xe7,0xe1,0xc9,0x0d,0x40,0x94,0x83,0x58,0xd2,0xc3,0x2b,0xce,0x1e,0xae,0x2a,0xa6,0xfa,0xc7,0x89,0x44,0xcb,0xe2,0x9e,0x74,0x33,0xaa,0x70,0xe5,0x28,0x3a,0x51,0x74,0x53,0xe2,0xfb,0x7c,0x47,0x76,0x22,0xdf,0x46,0xa6,0x01,0x17,0xef,0x88,0x43,0x46,0x3f,0x1a,0x26,0x0c,0xad,0xf4,0x31,0x55,0xf2,0xe7,0xc9,0x35 +.byte 0x6f,0x7c,0x0c,0x5c,0xfd,0x43,0xa4,0x6c,0x6c,0x74,0xf0,0xa4,0xec,0x1d,0x83,0x97,0xc1,0x6c,0x9c,0xd7,0x97,0x90,0x7c,0x07,0x88,0xc0,0xb4,0x79,0x2c,0x7a,0x9c,0x93,0xa2,0x15,0x6c,0xd2,0xa9,0x45,0xa5,0xc1,0x16,0xfe,0x72,0xf4,0x01,0x32,0xe4,0x51,0xdd,0xdb,0x50,0xe3,0x61,0x4e,0x29,0x1e,0x27,0x10,0xe9,0x5e,0x30,0x2b,0x30,0x27 +.byte 0x99,0xff,0x92,0x23,0x04,0x8d,0x28,0x68,0x28,0xd3,0x0f,0xec,0xbb,0xf9,0xfb,0x44,0x1c,0xaa,0x8b,0x38,0x95,0x67,0x1e,0xf5,0x42,0xc9,0xec,0x05,0xeb,0x94,0xe5,0x1c,0x8a,0x2a,0xef,0x3b,0x74,0x46,0x89,0x4f,0xd5,0x6f,0xa0,0xe5,0x74,0xae,0x24,0x8d,0x81,0xae,0x9d,0x3c,0x3e,0x3d,0x41,0x54,0x8f,0xd9,0xc2,0x98,0xf4,0x84,0xeb,0x30 +.byte 0x6a,0x06,0x67,0x11,0x2d,0xb0,0x55,0x70,0x26,0xdf,0x19,0x5f,0x81,0xe9,0x39,0x69,0x3a,0xd6,0x09,0xa4,0x40,0x22,0x1f,0x5c,0xbf,0xd5,0xa6,0xea,0x69,0x99,0x0d,0xea,0x70,0xed,0xfe,0x3a,0xba,0x23,0x8b,0xab,0x08,0xfe,0xfb,0xe9,0x1a,0x88,0x80,0x13,0x45,0x9c,0xca,0x2e,0xda,0x4a,0xc8,0x5d,0x15,0x52,0x87,0x36,0x9b,0x87,0x8a,0x76 +.byte 0x5d,0x31,0x24,0x4a,0xcb,0xf5,0xd3,0xd3,0xc1,0xec,0xde,0x1e,0x48,0x99,0xd5,0xcb,0x93,0xf7,0xca,0x2d,0xa4,0x66,0x5e,0xa4,0xcf,0xc6,0x15,0x20,0x10,0xb1,0xe2,0x8e,0xb9,0x44,0xa7,0xc3,0x54,0x14,0x86,0x08,0xb7,0x89,0x52,0xd5,0x72,0xc5,0x62,0x4d,0x82,0x96,0x23,0xcf,0x6e,0x52,0x3a,0x92,0x53,0x48,0xa2,0xa5,0x9d,0xa4,0xcc,0x32 +.byte 0x45,0x5a,0xdf,0xe2,0xbe,0xce,0x28,0xc8,0xb1,0xb7,0x0f,0x6a,0x38,0x28,0x14,0x66,0x55,0x7a,0xab,0x35,0x56,0xd0,0xc7,0xe5,0xa1,0x8a,0x84,0xf7,0xc5,0xa9,0xdb,0x2a,0x45,0xe9,0x34,0x2d,0xf2,0xed,0x2b,0xa9,0x9e,0x49,0x1b,0x23,0x10,0xeb,0x0e,0x01,0x46,0x6f,0x7a,0x50,0x09,0x5f,0xc3,0xb6,0x1e,0x2f,0x1a,0x3e,0x89,0x32,0xaa,0x5a +.byte 0xaa,0xef,0x23,0x45,0xdc,0xb5,0x7e,0x5f,0x87,0x77,0xde,0x50,0xab,0xbf,0x9e,0x62,0xa8,0xe0,0xf0,0xc8,0x4a,0xf1,0x4e,0xaf,0xe4,0x50,0x8a,0xfe,0xc9,0x68,0xdd,0x19,0x1d,0xc6,0x54,0xe5,0x38,0x0a,0x6f,0x36,0xe4,0x85,0xe8,0xab,0xc4,0x06,0xef,0x07,0x29,0xce,0xea,0x9d,0x2e,0x22,0x97,0x18,0x7e,0x59,0x89,0x92,0x31,0xc5,0x87,0x50 +.byte 0xa8,0x23,0x22,0x58,0x47,0x27,0x1c,0x89,0x5f,0xec,0x94,0x1d,0xb2,0xc8,0x61,0x1e,0x0a,0x80,0xd3,0xe9,0xbf,0x65,0xb9,0x66,0x32,0x56,0xde,0xd2,0x13,0xee,0xea,0xc4,0xc9,0xbf,0x4c,0xb7,0xa4,0x1c,0xc0,0xbf,0xcf,0xa4,0x58,0x1f,0x98,0x1d,0x25,0x4e,0x51,0xd9,0xbe,0x89,0x32,0xdb,0x7a,0xa6,0x39,0xa9,0xbf,0xed,0x65,0x6b,0x92,0xc4 +.byte 0x8d,0xcd,0x63,0x18,0x65,0x44,0x95,0xcf,0x17,0x72,0x8f,0x27,0x79,0x83,0xda,0xe3,0xe7,0xd9,0xca,0x57,0xff,0xa3,0x15,0xbf,0xb6,0xd8,0xc2,0x8c,0xe8,0xdb,0x8c,0xdc,0x54,0x6a,0xc8,0x57,0x6e,0x24,0xc3,0x3c,0x1f,0x33,0xdd,0x68,0xbd,0x7a,0xa3,0xbc,0xa9,0x9a,0xe8,0xfc,0x97,0xa5,0xbe,0x59,0xfb,0x77,0xcd,0x22,0xc6,0x3d,0x95,0x21 +.byte 0xcb,0xf7,0x8d,0xc1,0x77,0xc6,0xe0,0x06,0xb2,0xdb,0xec,0x54,0x19,0xad,0x02,0x25,0xe0,0x0f,0xda,0x4c,0xa5,0xf2,0x47,0x3f,0xc9,0xa0,0x91,0x21,0x39,0xe9,0x74,0x2a,0x9a,0xc1,0x57,0x86,0x3c,0x32,0x27,0x4c,0xc2,0x2d,0x50,0xbd,0x7a,0x04,0x9c,0x45,0x0d,0x7e,0x06,0x1d,0x3e,0xc1,0x6f,0x06,0x7f,0xd4,0x71,0xd3,0x5c,0x66,0x74,0xa7 +.byte 0x33,0x75,0x64,0xa8,0x7d,0xc0,0x23,0xda,0xb0,0x6d,0x12,0xbe,0x83,0x98,0xe7,0x65,0x38,0x4d,0x39,0xc3,0xd7,0x33,0xfb,0x58,0x64,0xfc,0xde,0xd7,0xbf,0x9e,0xdb,0xcc,0x7a,0x35,0xac,0xdf,0x13,0x08,0xbc,0x0a,0x55,0x82,0x5f,0xc3,0x74,0xc5,0xb2,0xdb,0x89,0xdc,0x9c,0x60,0xfa,0x02,0x1c,0xba,0x5b,0x7e,0x0f,0xb1,0x0f,0xad,0x43,0xe1 +.byte 0xe1,0xbe,0x1e,0x06,0x05,0x0f,0x39,0x80,0x3d,0x7d,0xbe,0x8f,0x38,0x25,0x46,0x5e,0xea,0x47,0x36,0x65,0x4c,0x3c,0x6c,0xd6,0xaa,0x46,0xaa,0xb0,0x95,0x1d,0xff,0x67,0x6c,0x70,0x9d,0xec,0x3d,0x3d,0x4c,0x2f,0xd9,0x2b,0xb0,0xbd,0x8c,0x6a,0xca,0xac,0x0c,0x53,0xa1,0xda,0xd8,0xc1,0x3c,0xaa,0xcc,0x50,0x85,0x41,0xa1,0xa7,0xe9,0x7f +.byte 0xf7,0xa8,0x28,0xb1,0x5f,0xd6,0x77,0xc9,0xb5,0xae,0x33,0xa7,0x2d,0x16,0xe0,0x13,0xe8,0xd4,0xf9,0x4e,0x62,0x2e,0xc2,0x9a,0xf3,0x83,0xe0,0x45,0x43,0x68,0x40,0x5a,0x56,0xf3,0x31,0xc8,0x5b,0x46,0x0b,0x38,0x1f,0xa5,0xff,0xe6,0xa1,0x81,0xc0,0x91,0xe5,0x5a,0x63,0x8f,0x47,0x9a,0xe7,0x26,0x0d,0x78,0x8d,0x11,0x7d,0xc8,0xd4,0x9f +.byte 0xc1,0xf7,0x8f,0x93,0xfa,0x2f,0xb5,0xfd,0x6d,0xa4,0x34,0xcf,0x3c,0x6c,0xf6,0x64,0xae,0x5c,0x60,0xa2,0xb4,0xcc,0x18,0x3e,0x08,0x8e,0x36,0x88,0xab,0xc3,0xea,0x53,0x4f,0x1c,0x9e,0xe6,0xef,0x2d,0x9c,0x78,0x4a,0x3a,0x5a,0x60,0x8e,0xf7,0xeb,0x0b,0x36,0xb1,0xbb,0x59,0xe2,0x5e,0x64,0x60,0xe5,0xd6,0x3d,0x2a,0xe1,0x1b,0x03,0x40 +.byte 0x8d,0xde,0x2e,0xd0,0x76,0x0a,0x6b,0x63,0x2a,0x53,0x2d,0x39,0xe0,0x53,0xee,0x7d,0xc4,0x8a,0x39,0xc5,0xda,0xfc,0x31,0x7e,0xa2,0x1b,0x11,0x1d,0x8a,0x8e,0x66,0xf4,0x00,0x17,0xd3,0x78,0x1b,0x94,0xad,0xcf,0xdd,0x56,0xce,0xaf,0xf6,0x34,0xe4,0xb6,0x47,0xe0,0xda,0x1b,0x36,0x4f,0x86,0x26,0xc1,0x65,0xec,0x85,0x8c,0xa9,0xfe,0x96 +.byte 0x75,0x0d,0xe3,0xeb,0x9a,0xa6,0x3f,0xb3,0x10,0x03,0x85,0x24,0xf2,0xb5,0xcd,0x69,0x7d,0xba,0xa2,0x5c,0x8a,0x6d,0x45,0xf4,0xc8,0x4f,0x69,0x8e,0xd4,0x69,0x82,0x42,0xfd,0x00,0x59,0xfd,0x20,0x7a,0x63,0x58,0x56,0x30,0x21,0x73,0xbd,0xd4,0x49,0x84,0x3f,0x51,0x0e,0xfb,0xd3,0xfc,0x93,0x17,0x7f,0x23,0x75,0x25,0xea,0x78,0x79,0xf7 +.byte 0xec,0x22,0xef,0x86,0x91,0x0a,0x90,0x10,0x71,0x3b,0xb8,0x8e,0xb7,0xc9,0xd1,0x26,0x98,0x7d,0x1a,0xab,0x74,0x3e,0x5f,0x10,0xa8,0x47,0xdf,0xc9,0x0a,0x03,0xbb,0xe2,0xbb,0x34,0xbe,0x87,0x1a,0x3e,0x13,0x4b,0xd5,0xdd,0x53,0xb7,0x65,0xb4,0x16,0x38,0xd3,0xfd,0x01,0xde,0xe8,0xba,0x1d,0x33,0x5b,0x7b,0x9b,0x9f,0xfb,0xe7,0x8d,0x82 +.byte 0x21,0x78,0x9e,0xb2,0xf5,0x16,0x37,0x88,0x47,0x9d,0x1a,0x2c,0xfe,0x6a,0xac,0xde,0x3e,0xc4,0xa8,0xed,0x64,0x46,0xdd,0x05,0x07,0x60,0xef,0x99,0x96,0xf0,0x84,0x27,0x38,0x58,0xe5,0xc0,0x53,0x7d,0x07,0xe3,0xa5,0x31,0xb5,0x8a,0xe7,0x50,0x94,0xbb,0x29,0xf9,0x58,0x13,0x91,0x5b,0x54,0x77,0xf6,0x91,0xb8,0x75,0x05,0x3d,0x70,0x3e +.byte 0x07,0x95,0x7d,0x37,0xbd,0x1d,0x29,0x4d,0x33,0x07,0x13,0x2b,0x54,0x70,0x9c,0x31,0xf1,0xcd,0x2d,0x28,0x09,0x43,0x90,0x24,0x8c,0x82,0xb0,0x08,0x71,0x08,0x97,0x7e,0x1a,0xbc,0x82,0xd8,0x31,0x0a,0x13,0xe9,0x22,0xf0,0x8d,0x2b,0x91,0xe5,0x2e,0x34,0x56,0x97,0x86,0xc9,0xbd,0x45,0x1e,0x32,0x03,0xcb,0xa1,0x29,0x00,0x81,0xd4,0x6e +.byte 0x5d,0xbc,0x0f,0x01,0x8d,0x5c,0xb9,0x80,0xcc,0xfe,0x0d,0xa3,0xef,0x8e,0x85,0x59,0x37,0xf7,0x64,0xa7,0xe5,0x2a,0xd5,0x44,0xee,0x91,0xcf,0x6c,0xf5,0x0a,0x9b,0xc7,0xdf,0xb6,0x02,0x2d,0xa4,0xf1,0x22,0x2a,0x97,0xfe,0x1d,0xb7,0x4c,0xc7,0x4f,0x2f,0x0b,0x38,0xd2,0xbf,0xfe,0xe3,0x94,0x55,0xae,0x85,0x0c,0x34,0x59,0x67,0x23,0x7b +.byte 0x4a,0x87,0xd9,0xd2,0xca,0xd5,0x38,0xd2,0x9d,0x05,0x2e,0xd8,0xe3,0x26,0x51,0xa4,0x14,0x66,0xfb,0x38,0x40,0x18,0x3b,0xda,0x43,0x85,0xc9,0xf5,0xf4,0xe7,0x22,0x82,0x45,0xa1,0xdf,0x98,0xa0,0xab,0x5f,0x7a,0x50,0x84,0x75,0x7a,0x70,0xa6,0x3b,0x04,0x20,0xed,0xa8,0x68,0x6d,0x3f,0x43,0xf8,0xb8,0xac,0xc7,0x32,0xa0,0xff,0x47,0xd5 +.byte 0xb3,0x92,0x6a,0x15,0x5a,0xf1,0x7c,0x32,0x30,0xda,0x1e,0x5d,0xab,0xcc,0xd0,0x3a,0xdc,0xcf,0x70,0xd8,0x4d,0xa3,0x50,0xac,0x50,0x42,0x53,0xc6,0xe0,0x3a,0x26,0xdc,0x77,0x30,0x31,0x59,0xa1,0xfc,0x4d,0x48,0x00,0x0d,0xe0,0x66,0xb3,0x9b,0xd3,0x38,0x45,0xbb,0x0c,0x57,0xc5,0x78,0xee,0x8c,0x96,0xea,0xa2,0x16,0xa3,0x12,0xb1,0x06 +.byte 0xd0,0x2a,0x70,0xf7,0xce,0x42,0xae,0x17,0x64,0xbf,0x13,0xa0,0xe9,0x62,0x57,0x1d,0x55,0x78,0xfa,0x72,0x19,0x58,0x15,0xea,0xe5,0xdf,0x72,0x0e,0xc6,0xd3,0xb4,0x3d,0x60,0xee,0x32,0x2a,0xce,0xdc,0xad,0xd0,0x34,0xe6,0xb4,0xcf,0xce,0x5a,0x4a,0x9f,0xaf,0x01,0xb3,0x2a,0xed,0x46,0xa0,0xad,0xaa,0x62,0x8b,0xa4,0xf7,0x4b,0xce,0x32 +.byte 0x35,0x29,0x1e,0x7a,0xda,0x74,0xf8,0xe5,0xda,0x52,0x66,0xaf,0x3d,0x1a,0xff,0x42,0xc0,0xcc,0xb1,0x32,0x36,0x10,0x44,0x34,0x6a,0x16,0xc2,0x5b,0x9a,0x35,0x3f,0xd2,0x29,0xc5,0x76,0x3c,0x24,0xc7,0x2b,0x92,0xae,0xe0,0xe2,0x04,0x6c,0x3b,0x97,0xda,0xfd,0x49,0x43,0x6d,0x35,0xf5,0xc3,0xc1,0x93,0xf8,0x2f,0x25,0xef,0x3e,0xd8,0xf2 +.byte 0xc0,0xb3,0xb5,0x71,0x01,0xe0,0x07,0x11,0xd5,0xf1,0xd3,0x54,0x59,0x93,0x77,0x2e,0x77,0xdc,0x57,0xd7,0x9b,0x0a,0xe2,0xde,0x29,0x04,0x81,0xa1,0x81,0x6f,0x94,0x86,0x39,0xd7,0x29,0x69,0x3f,0xfa,0xe4,0x02,0x01,0x85,0x04,0x21,0xd3,0x17,0xf5,0x68,0x85,0x6e,0x74,0x15,0x56,0xe6,0x5e,0x12,0x1c,0x0d,0x2f,0x7a,0x8d,0xe1,0xc8,0x47 +.byte 0x7b,0xdc,0x35,0x64,0xf1,0x00,0xc0,0x7b,0xd8,0x2c,0x8c,0x60,0x10,0x53,0x11,0x2c,0x5c,0xa2,0xb6,0x05,0xa3,0xcd,0x14,0xb6,0xd0,0x36,0xe9,0x74,0x78,0xc3,0x84,0x6b,0x51,0xa9,0xf9,0xf1,0x05,0xe2,0xd4,0xa3,0x57,0xec,0xb1,0x5e,0xd5,0x75,0x64,0xe3,0xb0,0xf9,0x8f,0x88,0x60,0xdf,0x8e,0x75,0xf9,0x32,0xfc,0x58,0x5b,0x4b,0x17,0xdb +.byte 0x41,0x04,0x6f,0x17,0x7a,0xf8,0xd0,0x47,0x8e,0xeb,0xd1,0xf9,0xa6,0xa8,0x52,0x7e,0x07,0x6b,0x5b,0x4d,0xb9,0xda,0x91,0x40,0x51,0x25,0x67,0x4b,0xf1,0x95,0x12,0x07,0xa9,0xa5,0x33,0x96,0x92,0x5e,0xb4,0x0e,0xf0,0x85,0x2e,0x70,0xd8,0xaf,0xae,0x9a,0x3d,0x0c,0xb0,0xee,0xe1,0x80,0x5a,0xb9,0x17,0xe6,0x00,0xa8,0x82,0xd0,0x9b,0xf5 +.byte 0xe3,0xa0,0x12,0xc4,0x15,0xd6,0x5e,0x57,0x5c,0xd2,0xb9,0xa7,0x8e,0xfd,0x09,0xc3,0xd2,0x66,0xfd,0x86,0xb4,0xdc,0xa3,0xc2,0xfe,0x16,0x86,0xc4,0x98,0xa3,0x2e,0x4c,0xc9,0x2c,0xd6,0x87,0x83,0x1b,0x6f,0xe2,0x44,0xd6,0x72,0x94,0x1d,0xba,0xaf,0x34,0x1f,0xf2,0x40,0x40,0x33,0x24,0x63,0xc1,0x26,0xef,0xbc,0x0f,0x3b,0x3c,0x65,0x2b +.byte 0xa7,0xc7,0xdf,0x96,0x67,0xab,0x92,0x0e,0x04,0x8c,0x82,0x9e,0xbe,0x52,0x61,0x40,0xdf,0x77,0x00,0xc5,0x01,0x9a,0xe9,0xde,0xe1,0xe2,0x45,0xb8,0xed,0x94,0xd5,0xf0,0x28,0x29,0xef,0x0d,0x91,0x07,0x9b,0xfe,0x69,0x78,0x26,0xd7,0xf9,0x51,0xf1,0x9c,0xf2,0xbb,0x83,0x2d,0x79,0x1e,0xff,0x97,0x13,0xdc,0x28,0x93,0x26,0x7c,0x54,0x52 +.byte 0xc0,0x92,0xeb,0x4a,0xa2,0xe3,0x01,0xfc,0x07,0xb9,0x26,0x11,0x03,0xe0,0x19,0xa8,0x9c,0xff,0x3a,0x95,0x26,0x3a,0x17,0xf1,0x7d,0x6a,0x6a,0xb2,0xb5,0x5a,0x07,0x43,0x2b,0xb7,0xdd,0x19,0x14,0xe0,0x05,0x91,0xc5,0xee,0x49,0x35,0x7b,0x1a,0x2d,0x34,0xda,0xa2,0x45,0x7e,0x0d,0x64,0x98,0xb6,0x2e,0x47,0xaa,0x6c,0x73,0x66,0x55,0x01 +.byte 0x27,0xb0,0xa9,0x13,0xa6,0xe0,0x74,0x38,0xb3,0x97,0xfe,0xaf,0xdc,0xc0,0x6a,0x4f,0xd8,0xdb,0x07,0x62,0x61,0x05,0xbb,0xa0,0xa8,0xc5,0xb3,0x89,0x13,0xbb,0x09,0x01,0x6f,0x09,0xcb,0x47,0x62,0x46,0xf0,0x4b,0xf0,0xb7,0x7c,0x39,0x8d,0xe5,0x7b,0x64,0x49,0x32,0x93,0x1e,0x94,0x0a,0x98,0xe0,0xca,0xc6,0x67,0x5b,0xdf,0x88,0x0a,0x26 +.byte 0x83,0x77,0xc3,0xd0,0x11,0x66,0x3d,0x25,0x91,0x61,0x80,0xfc,0x9c,0x50,0xfb,0xe8,0x81,0x6f,0xd8,0xfa,0x77,0x78,0x4c,0x2b,0x44,0xd0,0x92,0x52,0xa4,0x50,0x50,0x7e,0xa2,0xb9,0xe7,0x79,0x33,0x95,0xfe,0x29,0x1c,0x1d,0x43,0x9d,0xa7,0x12,0xfe,0xa1,0x45,0xf4,0xd9,0x1c,0x7e,0x5a,0x67,0x99,0x7f,0x22,0x7c,0xa3,0xb1,0x2d,0xb7,0x1d +.byte 0x6b,0xf6,0xb4,0x94,0xf2,0xd1,0x5c,0x28,0x56,0xe9,0x4f,0x21,0x81,0x96,0x37,0x7c,0x25,0x74,0x0f,0xf9,0xc5,0xf5,0xc6,0xe8,0x8f,0xbb,0xfb,0xe4,0xaf,0x23,0xac,0x4c,0x20,0x35,0x7d,0xb4,0x4a,0xde,0x90,0xec,0x16,0x30,0x95,0x1b,0x79,0xf6,0x77,0xfe,0x80,0x10,0xba,0xd2,0x49,0xda,0xca,0x9e,0x6b,0x63,0x2f,0x24,0x38,0xf9,0xee,0x20 +.byte 0x38,0x5c,0xeb,0xf5,0xbc,0x07,0x7a,0xeb,0xde,0xc4,0x97,0xcf,0x48,0x9b,0x80,0x40,0xfa,0x81,0xf5,0x24,0xa7,0xf3,0xf7,0x16,0xe9,0xba,0xae,0x9f,0xde,0xa1,0x00,0x34,0x74,0x36,0x9f,0x47,0xce,0xcf,0x35,0xdb,0x30,0x7e,0x72,0x81,0xc5,0xe1,0x59,0x07,0x3e,0xc7,0x5b,0x7b,0xd3,0xc6,0xeb,0x4e,0x71,0x9c,0xeb,0x41,0x37,0xd9,0x9e,0x34 +.byte 0x0b,0xc1,0x9c,0xf7,0xfd,0x56,0xb0,0xd6,0xa6,0xe4,0x1d,0xdf,0x43,0xc6,0xf3,0x26,0x0f,0x01,0x07,0x29,0x57,0x9c,0x8f,0xe1,0x31,0xc9,0xa6,0x98,0x0f,0x0e,0x27,0xfd,0xa0,0x59,0xdf,0x92,0x7b,0x0a,0x4c,0x42,0x4b,0x03,0x98,0x2a,0xea,0xcb,0xd8,0x0f,0x6d,0x19,0x0b,0x22,0x69,0x8b,0xaa,0x3b,0xc8,0x41,0x66,0x81,0xc3,0xaa,0x64,0x6d +.byte 0x44,0xdd,0xb9,0xe2,0xc4,0x47,0x6d,0xdf,0x61,0xe0,0xf3,0x26,0x40,0x23,0x2f,0xf9,0x2a,0xb3,0xfa,0xe2,0xe8,0x36,0xc0,0xd9,0x89,0xb0,0x05,0x47,0x36,0x20,0x3b,0x03,0x0c,0xd1,0x46,0x9b,0xc9,0x65,0xfa,0x14,0xba,0x68,0x49,0xfc,0x2a,0xb9,0x04,0x47,0xbb,0x64,0xe1,0x7f,0x5a,0xd3,0x70,0x19,0x0f,0x14,0x09,0xc0,0xbe,0xc3,0x9b,0x2f +.byte 0xd1,0x05,0x90,0x56,0x09,0x47,0xb3,0xc5,0x08,0x6f,0x89,0x59,0x8c,0xf3,0xd4,0x1c,0xaf,0x68,0x00,0x32,0x58,0xe2,0x66,0x55,0xe2,0xc3,0x46,0x73,0xfd,0x4b,0x63,0xc5,0xdd,0x48,0xa8,0x14,0xe9,0x07,0x94,0x8f,0x51,0x6e,0x2d,0x7c,0x62,0x97,0x73,0xa5,0x42,0x7d,0xad,0x43,0xcb,0x65,0x56,0xf0,0x23,0x28,0x72,0xdb,0x1f,0xcf,0x34,0x9a +.byte 0x62,0x06,0x8d,0xc9,0x86,0x40,0x6d,0xee,0x58,0x72,0x02,0xbb,0xce,0x33,0x6a,0xe4,0xcb,0x46,0x25,0xda,0x2f,0x8d,0xc9,0x8e,0xfe,0xcf,0xbb,0xfc,0xb0,0xe8,0xec,0xf2,0xf9,0xff,0x5d,0x70,0x9e,0x2e,0x22,0x0e,0x9a,0x4d,0xb8,0x26,0x7a,0x48,0x3f,0xba,0x5c,0xcd,0x10,0xf4,0x6d,0x89,0x3d,0x5d,0x87,0xd4,0x69,0xb8,0x4a,0x20,0xc6,0xf8 +.byte 0x03,0x6c,0x60,0x1e,0x9c,0xc6,0xe3,0x39,0x9b,0xa1,0x16,0x64,0xed,0xc6,0xd7,0x54,0xfd,0x8d,0xa0,0x2f,0xcf,0xc6,0xde,0x43,0xe4,0xc5,0xb7,0xd6,0x00,0xaf,0x95,0x7a,0xc6,0xde,0x26,0x59,0x39,0xb0,0x12,0x6b,0xe1,0x3c,0xa9,0x09,0xb6,0x15,0xb0,0x62,0xad,0xa9,0x11,0x4f,0x86,0xde,0xc6,0xe8,0x32,0x46,0x78,0xeb,0x60,0x81,0x6b,0x8f +.byte 0xac,0x80,0xbf,0xa4,0xc4,0xb7,0x5f,0x3b,0x2f,0xf8,0xe4,0x05,0xcf,0xbf,0xa3,0x14,0x6f,0x16,0xbc,0x6c,0x4e,0x31,0xd7,0x79,0x09,0xcf,0x9c,0x58,0xa3,0x0b,0x1a,0x31,0x4b,0xda,0xcb,0x11,0x35,0xb1,0xf5,0xbb,0xfb,0x00,0x46,0x6d,0x70,0x5e,0x4a,0x85,0x19,0xdf,0xb5,0xd0,0x03,0x2e,0x5d,0x01,0x95,0x4e,0x5a,0x59,0x99,0x24,0xac,0x3f +.byte 0x2d,0x64,0xaf,0xef,0x40,0x16,0x2a,0xcc,0x6a,0x6c,0x0f,0xe3,0x45,0x15,0x74,0x3d,0xea,0xdb,0xa7,0x3f,0xd2,0x50,0x4d,0xc7,0xc6,0x19,0x36,0x84,0xf4,0xbd,0x09,0xff,0xe7,0xf3,0xc0,0xa5,0x34,0x49,0x8a,0xfe,0x83,0xcd,0xe4,0x80,0x7d,0xe3,0xff,0xc9,0x8a,0xb9,0xd6,0x34,0x01,0xd1,0x47,0x16,0x5e,0x7c,0x16,0xf5,0x7c,0xf8,0xb5,0x53 +.byte 0x26,0x84,0x89,0x73,0xf3,0x7f,0x9c,0xb0,0x2f,0x07,0x9e,0xf2,0x12,0xdf,0xba,0xc0,0x15,0xd0,0x3a,0x59,0x9d,0xde,0x67,0x5e,0x1c,0x2b,0x4b,0x84,0xb8,0x89,0xfb,0x62,0x90,0xe9,0x89,0xd9,0xdb,0xb7,0x21,0x4a,0x9f,0xbd,0xc0,0x02,0x01,0xda,0xb3,0x4c,0x9d,0xfb,0x46,0xa1,0xd0,0x3c,0xf5,0x27,0x6f,0x70,0xb5,0xa9,0x74,0xdc,0xa0,0x76 +.byte 0xb7,0x3a,0x53,0x18,0xdd,0x80,0x5e,0x43,0xb5,0x35,0xe4,0x0e,0x26,0x27,0x0a,0xab,0xe8,0x4d,0x2e,0x89,0x20,0xc3,0xff,0xe4,0x7f,0x03,0x2c,0x5f,0x25,0xc7,0x70,0x53,0x27,0x4c,0xc8,0xb9,0xb1,0x81,0x10,0x7a,0xa2,0x65,0xe4,0x0b,0x65,0x8e,0x3d,0x2f,0x96,0xa0,0xa5,0x7b,0x4f,0x09,0xe9,0x9d,0x10,0x06,0xf7,0x18,0xad,0x2d,0x7f,0xb8 +.byte 0x8f,0x08,0xa7,0x2c,0xda,0x82,0xbe,0x5c,0xd6,0x1d,0xb6,0xe2,0x9b,0xa2,0xfc,0x18,0x8c,0x8d,0xf7,0x81,0xf4,0xc6,0x1e,0xcb,0xe5,0x73,0xa6,0x74,0x06,0x20,0xf3,0xa9,0xcb,0x80,0x01,0x55,0x7e,0xc0,0x6a,0x1f,0x5a,0x5b,0xb1,0x56,0x5d,0xd8,0x2a,0xd5,0xf5,0x57,0xe8,0x48,0x6c,0xfb,0x9e,0x93,0xa7,0x0e,0x13,0x2b,0x68,0xc5,0x6b,0x17 +.byte 0x43,0xb0,0x58,0x04,0x65,0x3d,0x46,0x57,0xa7,0x3d,0x99,0xb8,0xa1,0x48,0x17,0x44,0x67,0x2a,0x0d,0x44,0x87,0x9f,0x63,0xd7,0x92,0x56,0x7b,0xab,0xd3,0x6a,0xbd,0x4f,0xc0,0xc3,0xd2,0xee,0xd1,0x3d,0xd1,0x18,0x2e,0x6a,0xf5,0x3b,0x67,0xa0,0x0a,0xf3,0x11,0x49,0xc5,0x4b,0xef,0xcf,0x00,0xfd,0x22,0x8f,0xa0,0x9c,0x99,0x32,0x2f,0x58 +.byte 0xf9,0x97,0x98,0x13,0x4a,0x88,0x50,0xcc,0x58,0x1e,0x27,0x02,0x34,0x7d,0xec,0xf6,0x88,0x3a,0x74,0xb5,0x34,0x6d,0x6f,0x52,0x2d,0x20,0x02,0x70,0x22,0x27,0xdf,0x7a,0xff,0x30,0x36,0x66,0x1a,0xa0,0x51,0xc3,0x75,0x9a,0x06,0xe5,0x3f,0x6c,0x74,0x0d,0x15,0xa2,0xb6,0xe5,0xcd,0x55,0x4d,0xea,0x65,0x8f,0xbb,0xb2,0xd4,0x95,0x73,0xa4 +.byte 0xcd,0xb9,0xc8,0x82,0x60,0x49,0xe9,0x36,0xc9,0xb1,0xe9,0xcb,0x52,0xae,0xa7,0x7a,0x64,0xab,0x75,0x84,0x03,0x4b,0x37,0xf7,0x07,0x75,0xf7,0x1c,0x32,0x19,0xb6,0x8b,0xca,0x7c,0x43,0x15,0xe8,0xec,0x57,0x89,0x1d,0xe2,0xa0,0x80,0xc5,0xb6,0x02,0x29,0xfd,0xda,0xe0,0x14,0x93,0xb4,0xb3,0x44,0x2e,0x17,0x2f,0xed,0x3b,0x38,0x6e,0x8f +.byte 0xe0,0x3d,0xc6,0x77,0xe9,0xa7,0x76,0xcb,0x98,0x2d,0x08,0x61,0xcf,0x1b,0x25,0x3f,0xfb,0x1d,0x99,0xb1,0x5a,0x3c,0x53,0x96,0x4e,0x09,0x11,0xf6,0x5b,0x09,0x31,0xe1,0xad,0xb0,0xaf,0x7b,0xec,0xf9,0xa8,0x68,0xb7,0x93,0x57,0xf7,0x17,0x77,0x87,0x2b,0xdb,0x00,0x28,0xc6,0x48,0xac,0xff,0xcd,0x26,0x4a,0x8a,0x76,0x9a,0x2a,0x1d,0x37 +.byte 0x4c,0x70,0x4f,0xf6,0x52,0xe3,0x7a,0x78,0x94,0x5b,0x0b,0x50,0xb4,0x48,0x03,0xcd,0x78,0xd0,0x5d,0x89,0x6d,0x76,0xaf,0x9d,0x67,0xc3,0x75,0x6f,0x6a,0x2d,0xe2,0xb7,0x58,0x51,0x10,0x0d,0xef,0xa0,0x1a,0x74,0x28,0x3a,0x97,0x19,0x4f,0x3c,0x8a,0x86,0x3d,0xe4,0x66,0x3d,0x57,0xb4,0x66,0xb3,0x0b,0x4f,0x57,0x57,0x34,0x2e,0xc7,0x0c +.byte 0x11,0xdf,0x3c,0xb4,0x9f,0xe1,0xd5,0x27,0x41,0x08,0xec,0xca,0x18,0x88,0x48,0x5e,0x88,0x55,0x89,0x71,0xe6,0xa5,0x90,0x7c,0x3b,0xe5,0xf3,0x2a,0xd7,0xf5,0x0b,0x3d,0xbb,0x47,0xad,0xd7,0x78,0x41,0xa8,0xef,0xd4,0x36,0x31,0xd1,0xe4,0x9c,0x87,0x9e,0xb1,0x11,0x0e,0xff,0x8f,0x4d,0x79,0x65,0xc4,0x83,0x75,0x33,0xc9,0x89,0xe2,0xc3 +.byte 0x41,0x68,0x11,0xe7,0xe4,0x58,0xb9,0xf1,0xee,0x06,0x48,0x4d,0xc3,0xc7,0x76,0x60,0x42,0x94,0x8f,0x0d,0xb9,0x53,0x46,0x78,0x06,0x97,0x94,0x36,0xf4,0x3e,0xf3,0xdd,0x5b,0x46,0xe1,0x9d,0x3f,0x9e,0x78,0x00,0x9e,0xe7,0xcb,0x9e,0xc8,0x30,0x87,0x4a,0x52,0x91,0xd5,0xe2,0xa3,0x65,0x98,0xb2,0xc9,0x6c,0xfb,0x4e,0x54,0x5a,0x9f,0x57 +.byte 0x2c,0x4a,0x76,0xe4,0x97,0x88,0xd5,0x6a,0x0e,0x6c,0x7c,0xef,0x78,0x2a,0x7c,0x26,0xa3,0x25,0xf6,0x33,0x82,0x46,0x6d,0x91,0x0d,0xe4,0x83,0xec,0xf1,0x24,0xf8,0x0a,0x34,0xec,0xfc,0x7e,0x47,0xda,0x9a,0x17,0x1b,0x33,0xd0,0xf1,0x70,0xe4,0x0b,0xc7,0x70,0x58,0x1d,0x76,0x20,0x89,0xce,0x4f,0xd1,0xcb,0x3b,0x26,0xd1,0x98,0xd9,0x51 +.byte 0xb1,0xd0,0xaa,0x4a,0xd5,0x10,0xf2,0xae,0xaa,0x14,0xa7,0x72,0x99,0x3d,0xc8,0xbf,0xfb,0xec,0x6a,0x14,0xdd,0x97,0x7b,0x2f,0x16,0x96,0x0f,0x41,0xb8,0x33,0x15,0x1b,0xa2,0x6a,0x7e,0x64,0x0d,0xab,0xe7,0x62,0xf5,0x6c,0x56,0x69,0x09,0x46,0x32,0x24,0x60,0x4e,0x21,0xc7,0x5b,0xee,0x0a,0xe2,0x94,0x7c,0x20,0xe2,0x06,0xa0,0xa2,0x36 +.byte 0xa0,0x7d,0xb5,0x37,0x2a,0xee,0x20,0x25,0x4c,0xba,0x9a,0x06,0x4c,0x07,0x9b,0xea,0x55,0xac,0x2a,0xf7,0xb9,0x5c,0x23,0xac,0x43,0xda,0x9d,0xad,0x76,0xe2,0x5f,0xe0,0x27,0xaf,0x0a,0x5e,0x3d,0x54,0x84,0xfc,0x19,0x75,0x8c,0x62,0x4d,0x37,0x17,0x1a,0x90,0x55,0xb8,0x7e,0xa1,0xad,0x31,0x1a,0xc0,0x91,0x96,0x51,0xa9,0x5f,0xbb,0xb9 +.byte 0x95,0xbf,0xe2,0xd5,0x7e,0x31,0xba,0xc4,0x1e,0x63,0x98,0xd3,0xe2,0x7d,0x87,0xa5,0x46,0xe3,0xae,0xe1,0xe8,0x4e,0x74,0x29,0x0e,0x4b,0x10,0xa8,0x7f,0x3a,0xe5,0x60,0x0f,0x49,0x6a,0xcd,0x3d,0x5a,0x8e,0xf1,0x48,0xd0,0x80,0x7b,0xa3,0x7f,0x06,0x47,0x2b,0x60,0xf2,0x17,0xc3,0xe1,0x26,0x1e,0xb7,0x0f,0x2b,0x7c,0xc7,0xb8,0x3a,0x4f +.byte 0xad,0x05,0x97,0x88,0x93,0x82,0x8e,0x06,0x77,0x44,0xd1,0x65,0xfd,0x18,0x48,0xd6,0x88,0xcd,0x5c,0xbd,0xe4,0xaa,0xea,0xf1,0xed,0x16,0x5f,0xb3,0x58,0xe2,0x69,0x82,0xbe,0x9e,0xfc,0xcb,0xf6,0x17,0xa9,0x70,0xeb,0x08,0xd7,0x06,0x86,0xf6,0x5a,0x43,0x68,0x7b,0xcf,0xa3,0xfa,0x26,0x5e,0xe5,0x42,0xd3,0x5a,0xc8,0x1c,0x3b,0x8d,0x2d +.byte 0xf1,0x45,0xb0,0x97,0x90,0x0b,0xe7,0x2d,0xab,0xd7,0xd8,0x8a,0x16,0xf9,0x5f,0xa6,0xcf,0xc5,0x60,0x2c,0x34,0x5a,0x2e,0x2b,0xb9,0xb4,0x9c,0xa7,0x09,0x77,0xd2,0x3f,0x8c,0xf3,0xf6,0xf7,0xe0,0x27,0x79,0xc3,0x4e,0x61,0x7d,0x09,0x50,0x05,0x01,0x35,0x1b,0x33,0x54,0x6f,0x90,0x9a,0x19,0xcd,0x86,0x45,0x23,0xcd,0x6f,0x1b,0x62,0xc5 +.byte 0xce,0x4e,0x8e,0xff,0xe7,0x12,0x32,0x85,0x9a,0xc4,0x11,0x83,0xcf,0x78,0xd7,0x41,0x99,0x64,0x20,0xa6,0x69,0xdd,0xe3,0x53,0x98,0x6b,0xc7,0x98,0x51,0xc5,0xf8,0x3e,0xa3,0x5f,0x0d,0x78,0x2f,0xa7,0x05,0xff,0xe5,0x3a,0x0f,0x7c,0x09,0x58,0x3f,0xaa,0x0d,0x9a,0x9d,0x8d,0xe7,0xbf,0x6b,0x7d,0xfe,0x3a,0x4f,0x5c,0x50,0xb2,0xe7,0xc5 +.byte 0xa5,0x13,0xde,0xc8,0xe8,0x59,0xac,0xb0,0xdd,0xc0,0x81,0xa7,0x0b,0x78,0x32,0x23,0x76,0x85,0x11,0xef,0xe3,0x88,0x6f,0x7f,0xa9,0x09,0x7b,0x0c,0x6f,0x34,0xb2,0x67,0x5e,0xd6,0x11,0xad,0xd7,0x3b,0xf2,0xbb,0x66,0x5b,0xde,0x22,0xfc,0x55,0x26,0xa1,0x89,0x80,0x2e,0xb8,0xf3,0x3c,0xf8,0x1e,0xba,0x99,0x1c,0x24,0x33,0xb4,0xe6,0x17 +.byte 0x2b,0x9c,0x80,0xe5,0x9b,0x58,0x54,0x70,0xcd,0x15,0x81,0xcd,0x51,0x48,0x75,0x24,0x27,0xf5,0x30,0x79,0xc1,0x16,0xff,0x89,0x70,0x12,0x74,0x07,0x9d,0x39,0xf2,0x9c,0xc6,0x89,0x8d,0x94,0x41,0x01,0x04,0xf5,0x16,0x99,0xf3,0xf0,0xd1,0xf5,0x6d,0xd3,0x11,0x19,0x29,0x36,0xfb,0x41,0xf9,0x32,0xb9,0x0f,0x13,0xaf,0xac,0xfb,0x30,0x75 +.byte 0x62,0x8c,0x04,0x5b,0xf1,0xce,0x52,0x9b,0xbe,0x8c,0xf9,0x86,0x5d,0x7d,0xc1,0x8e,0x41,0x76,0x42,0x63,0xd7,0x74,0x8e,0x2c,0x46,0xa1,0x0a,0x51,0xb5,0xec,0xe9,0x91,0x56,0xbc,0xdc,0x32,0xfc,0x10,0xb5,0xca,0x5b,0x4b,0x72,0x99,0x07,0xff,0x01,0x11,0x2c,0xa4,0x60,0xf5,0x6b,0xd4,0xa8,0x96,0x21,0xee,0xbe,0x14,0x8f,0x69,0x99,0xdc +.byte 0x43,0x7f,0x13,0x3d,0x17,0x1e,0xa3,0x1b,0x21,0x23,0x26,0x7e,0xff,0x80,0x6b,0x66,0x3e,0xb2,0x48,0x1a,0x77,0x3c,0x50,0xe2,0xca,0x4d,0xc6,0xdb,0xfd,0xd1,0x23,0xcc,0xcb,0x01,0x25,0xc0,0x62,0x8d,0xe5,0x9c,0xb7,0x13,0x97,0xf5,0x49,0x01,0x19,0x45,0x45,0x83,0x17,0xff,0x8e,0x94,0x8c,0xb0,0xc0,0xaf,0x46,0x62,0x0e,0x62,0xb7,0x8c +.byte 0xd5,0xcf,0xb9,0x82,0x6e,0x8a,0xb9,0x22,0xbc,0x30,0xf9,0x65,0xc2,0x7f,0xce,0x6b,0x4d,0xad,0x87,0xcb,0x23,0xab,0x57,0x36,0x6a,0xb7,0x8c,0x63,0x17,0x60,0x13,0xa1,0x1f,0x3d,0xa4,0xd4,0xab,0x5d,0x97,0xc7,0x18,0xaf,0xf8,0xae,0x13,0x64,0x2a,0x19,0x34,0xe2,0x28,0x28,0x4f,0x32,0x2a,0xd8,0x43,0x79,0xaf,0x1e,0x56,0xfc,0x97,0x51 +.byte 0x67,0x8c,0x63,0x80,0x32,0x63,0x71,0x5c,0x78,0x00,0xeb,0xfd,0xa2,0x96,0x58,0x21,0x36,0x13,0x02,0xe5,0xa4,0xb7,0xcd,0x5a,0x30,0xa0,0x5b,0x7b,0x23,0xa4,0xcc,0x54,0x64,0x6f,0x6d,0x9b,0xaf,0xea,0x49,0x69,0x9e,0x2f,0x51,0x5c,0xe7,0xa3,0xa3,0xb8,0xac,0xed,0x47,0x23,0x7a,0x37,0x38,0xe3,0x15,0x98,0x6f,0x50,0x6c,0x8d,0xa7,0xe6 +.byte 0xa8,0x39,0xcc,0x63,0x08,0xeb,0x8f,0x8c,0xfd,0x83,0xaa,0x34,0x75,0x19,0xc0,0xf4,0xd6,0x25,0x18,0x94,0x9d,0xa1,0x7e,0xc8,0x6b,0x19,0x76,0xc0,0x8d,0xaf,0x51,0xe5,0x7c,0x8a,0x98,0x17,0x80,0x90,0xc0,0xb6,0xed,0x5c,0x8f,0x33,0x56,0xba,0xce,0xbe,0x83,0x87,0x5d,0x51,0x2e,0x64,0x84,0xa6,0x9d,0x49,0x27,0x5b,0x92,0xe0,0xe7,0xac +.byte 0x37,0x3d,0x22,0x5e,0x25,0xe7,0xca,0x2f,0x5d,0x2f,0xa0,0xd5,0xcb,0xe9,0xac,0x84,0x5b,0x19,0x72,0x1c,0x2c,0x0a,0xd1,0xb7,0x73,0x24,0x8a,0x0f,0xe0,0x07,0xd8,0x49,0x4d,0x23,0x1b,0xac,0xb8,0xd1,0x42,0xd4,0xdf,0xf8,0x4d,0x85,0xa2,0x37,0x30,0x46,0x38,0x88,0x55,0x1d,0xea,0x37,0x54,0x8c,0x43,0xb0,0xed,0x01,0x53,0x75,0xe6,0xf7 +.byte 0x9b,0xe6,0x10,0x91,0x6e,0x80,0x11,0xf9,0x96,0x29,0x4f,0x08,0x77,0x2b,0x7e,0xdb,0x5b,0x14,0xbd,0x77,0x37,0xe8,0x36,0x07,0x4a,0xe4,0xd8,0xa2,0x4e,0x38,0xea,0xeb,0xc2,0xd6,0x43,0x59,0x20,0x0c,0x12,0x31,0x6c,0x27,0xc5,0x7b,0xfc,0xfc,0x54,0x94,0x1d,0x5f,0x82,0x73,0xd7,0x1f,0x43,0x3a,0x73,0xc4,0xf3,0xb3,0xbb,0x53,0xfe,0x22 +.byte 0xc0,0xa4,0x7e,0x2b,0x84,0x1b,0xef,0x6d,0x83,0x9d,0xb3,0x8b,0x2a,0x6c,0xea,0x1e,0xfa,0x77,0x01,0x35,0xd2,0x5b,0xc4,0xd3,0xe7,0x1e,0xca,0x73,0x8b,0xb9,0x1f,0xfb,0x67,0xf2,0xdd,0x03,0xe6,0xca,0xfe,0x3b,0x61,0xd7,0xb5,0x96,0xe0,0x85,0xc2,0x23,0xa7,0xea,0x38,0xbf,0x6e,0x29,0x9e,0x8e,0x18,0xd4,0xbf,0x16,0x73,0xf9,0x18,0xef +.byte 0xc9,0xaf,0x6c,0xe2,0xdc,0xa4,0x58,0x9c,0xf5,0x6d,0x4a,0xc8,0xb4,0x8f,0x16,0x02,0xb7,0x65,0xd3,0x32,0x3b,0x83,0xfe,0xf3,0xc7,0xba,0x68,0xf4,0x95,0xa4,0xf6,0x33,0x57,0x43,0xbe,0xae,0x83,0xa9,0xe4,0x0d,0x0b,0x23,0xaa,0xbc,0x15,0x53,0x18,0x4d,0xb4,0x35,0xe3,0x8e,0x86,0xfe,0xe4,0x98,0x5d,0x63,0x23,0xce,0x44,0xea,0x4d,0x64 +.byte 0x86,0xf8,0x06,0x8f,0xc0,0x73,0xa6,0x6d,0x04,0x53,0x47,0x95,0x0f,0x6d,0x6c,0x01,0x1c,0x3f,0x7b,0x83,0xe4,0xc2,0x40,0xb8,0x97,0x26,0x9e,0x35,0xb0,0x76,0xee,0xe4,0xc7,0xd8,0xaa,0x22,0x83,0x96,0xe1,0x34,0x7b,0x78,0x31,0xee,0xd3,0x9a,0x50,0xd4,0x05,0xfd,0xd6,0x15,0xca,0x83,0x2f,0x49,0xfd,0x00,0x23,0x82,0x39,0xac,0x46,0x7a +.byte 0xe4,0xb5,0xcc,0xee,0xbb,0xaa,0x98,0x82,0xb5,0x27,0x45,0xd5,0x96,0x6e,0x89,0x01,0x1e,0x30,0xe4,0x1c,0x3a,0x65,0xcc,0x9f,0xda,0x38,0xf0,0x4c,0x68,0xfa,0xe5,0xf2,0xe2,0xce,0x34,0xc2,0x15,0xfd,0x21,0xf6,0xe2,0x33,0xbd,0xef,0xfd,0x49,0x15,0xdc,0x38,0x3b,0x24,0xba,0x3a,0x80,0x35,0x60,0xbe,0x50,0x17,0x38,0x3e,0xe2,0x96,0x84 +.byte 0x01,0x41,0x6c,0xb2,0x0b,0xc6,0xff,0xce,0xb3,0x37,0xa2,0x46,0x27,0x33,0x8e,0x04,0x44,0x8a,0x7c,0x64,0x0e,0xbc,0xed,0x74,0x4f,0x40,0x58,0xf4,0x8c,0xf8,0xd9,0x92,0xa9,0x0b,0x18,0x7c,0x93,0x95,0xca,0xa7,0x3e,0x1d,0xad,0x68,0x80,0xd9,0xdb,0x81,0x78,0x50,0x37,0x49,0xbc,0x64,0xc2,0x52,0x5c,0x70,0x7e,0x0a,0x26,0x7e,0xc6,0xbf +.byte 0xd2,0x7f,0x05,0x55,0x7a,0x5a,0x3e,0x9e,0xe3,0x8b,0xf5,0x95,0x2b,0xd8,0xb4,0xb8,0xc6,0x5d,0x91,0xb8,0xc7,0x7c,0xe1,0x75,0xf2,0x43,0x6b,0x73,0xb7,0xb1,0x10,0xf2,0xa7,0x1e,0xab,0xaf,0xc9,0xc0,0x3b,0xab,0xbe,0xf7,0x4a,0x43,0x9c,0xca,0x3d,0x00,0x5b,0x02,0xf8,0xa2,0x4f,0x57,0x81,0xb0,0xde,0x1e,0xd1,0x60,0xbe,0x6c,0x0d,0xe6 +.byte 0xcd,0x51,0xb6,0xc7,0x00,0x52,0x37,0x4f,0xfc,0xee,0xe2,0x43,0x5c,0x61,0x76,0xed,0x80,0x72,0x38,0x26,0x94,0xfe,0x28,0x06,0xfb,0x62,0xa6,0x21,0x9b,0x53,0x60,0x1b,0xf0,0x56,0xae,0xba,0x6b,0x52,0x27,0x2a,0xd5,0xed,0x11,0x92,0xa2,0xe2,0xab,0xdd,0x05,0x38,0x38,0xae,0xeb,0x72,0xcb,0x6c,0xa5,0x2a,0x73,0xc5,0xfc,0xb0,0x36,0x83 +.byte 0xd6,0xe6,0xda,0x6b,0x38,0x72,0x5e,0x8d,0xaf,0x11,0x5f,0x5b,0x89,0x58,0x21,0x36,0xf6,0x7d,0x42,0x48,0xdc,0xce,0xaa,0x94,0xf0,0xc3,0xc5,0x2c,0x08,0x2a,0x36,0x35,0x25,0x95,0xc4,0x11,0x09,0xea,0x7a,0xbc,0x2e,0xc6,0x0a,0x5b,0x4f,0x86,0xeb,0xc2,0x38,0x71,0x48,0x8c,0x63,0x79,0x3b,0xe4,0xba,0x14,0x44,0x31,0x28,0x4f,0x9d,0xb4 +.byte 0x26,0xa6,0x3b,0xea,0x3f,0xcb,0x30,0x6c,0x02,0x13,0xdb,0x4c,0x9c,0x76,0xc8,0xd8,0x01,0x52,0x3d,0x2f,0x51,0x70,0x15,0x91,0xec,0x8f,0x80,0xed,0x88,0xb7,0xfa,0x91,0x2c,0x10,0xcd,0x3b,0x92,0x85,0xe7,0xe8,0x11,0xfa,0x50,0x15,0xe2,0xdf,0xf7,0xbe,0xa4,0x2d,0x13,0x75,0xa6,0x00,0x25,0x8d,0xe1,0xb6,0x9b,0xbb,0x64,0xfb,0x5c,0xde +.byte 0x97,0xcc,0x00,0x51,0xd6,0xac,0x67,0xc3,0x91,0x1e,0x56,0x36,0x2b,0x43,0xed,0x8c,0x67,0x7b,0xf6,0x54,0x6f,0x91,0x44,0x28,0x93,0x60,0xac,0xca,0xb9,0x91,0x7e,0xeb,0x49,0xd8,0xfc,0x12,0x6c,0x40,0x9d,0x0a,0x4d,0xb4,0xab,0xe6,0xad,0x5b,0x8e,0x2d,0x3e,0x53,0xa1,0x88,0xf7,0x41,0x71,0xa7,0xff,0x05,0x46,0x04,0x34,0x1f,0x12,0x89 +.byte 0x92,0xc1,0xf9,0x26,0x16,0x23,0xb6,0x59,0x82,0xdc,0xa7,0xb8,0xa4,0x8a,0x0f,0x1d,0x7d,0x8f,0x44,0xe8,0x4f,0x70,0xbb,0xdb,0x8d,0xe6,0x7e,0x9d,0xd9,0x44,0x10,0x41,0x6c,0x3f,0xb7,0xe8,0x6f,0x39,0x93,0xe1,0xde,0xb8,0x6c,0xba,0x99,0x95,0xb7,0xc8,0xb2,0x2a,0xcd,0x81,0x53,0xc3,0xb5,0x2a,0x8a,0xd6,0x62,0x1e,0x74,0x4d,0xde,0xfa +.byte 0xff,0x7b,0xed,0x11,0x1e,0x44,0x3e,0x93,0x1c,0xae,0x7c,0x5c,0xed,0x52,0x75,0x5e,0x0a,0xf3,0x95,0xce,0x47,0x86,0x1b,0x7f,0x17,0x09,0x12,0xcc,0x08,0xca,0x16,0x11,0xf1,0xa1,0x39,0x78,0x89,0x5c,0x11,0x25,0xc7,0x39,0x5f,0x97,0x74,0xbc,0xa9,0x2a,0x25,0x5d,0xdd,0x93,0x0d,0x8c,0x74,0x07,0x1e,0xd9,0x9f,0xc1,0x38,0x9c,0xbf,0xe0 +.byte 0x42,0xad,0xb2,0xe7,0xb1,0x84,0x82,0xb4,0x56,0xbe,0x3c,0x42,0xb0,0xce,0x2c,0x94,0xb7,0xe6,0x78,0xc8,0x04,0x06,0x58,0x15,0x3e,0xdc,0xf6,0x9a,0x58,0xc3,0xe3,0x85,0x16,0xc8,0x84,0xba,0x8f,0xbc,0x94,0xa7,0x44,0x04,0x29,0xc4,0xd8,0xec,0x63,0xc4,0x47,0x58,0x22,0x02,0x08,0x20,0x44,0x39,0x52,0xa5,0x33,0xfe,0x1c,0x30,0x27,0x92 +.byte 0xbf,0x42,0x44,0x4c,0x3f,0x3d,0x00,0x7b,0x21,0xef,0xbb,0x25,0x75,0x4c,0xb2,0xe7,0x66,0xc9,0xc1,0xfb,0x1e,0x13,0x04,0xd0,0xcb,0x69,0x51,0x9d,0x9a,0xb0,0xb0,0xec,0xb0,0x12,0x24,0x84,0x57,0x9f,0xef,0xb4,0x19,0x50,0xa6,0xf5,0x03,0xa3,0x93,0x0f,0x77,0xaf,0xe0,0x4c,0xa5,0xd3,0xb0,0xd8,0x5e,0xc3,0x78,0x94,0xd5,0x6e,0x48,0x58 +.byte 0x7a,0x93,0xb1,0x62,0x60,0xea,0xa1,0xba,0x7a,0x86,0x6e,0x87,0xe9,0x97,0xe0,0x7c,0x1e,0xb6,0x63,0x94,0x76,0x5f,0x9c,0x95,0x65,0x00,0xd4,0x14,0x0e,0x4c,0x87,0xe7,0xcd,0x9e,0xb1,0xe2,0x13,0x1b,0xb1,0x8a,0x83,0xaa,0xaa,0x34,0xcd,0xb2,0xf6,0x7f,0x12,0xb0,0x79,0xff,0x1e,0x04,0xc8,0x9a,0xfc,0x41,0x88,0xbb,0x28,0x42,0xeb,0x45 +.byte 0x47,0x8b,0xcb,0x57,0x03,0xcd,0xe5,0x9a,0x84,0xea,0x0a,0xb5,0x0c,0xb8,0x30,0x33,0xd6,0xde,0x66,0xa8,0x57,0xf9,0x76,0x4f,0x0f,0x8f,0x53,0x56,0x57,0x91,0xd4,0x55,0xf5,0x78,0xde,0xa6,0xa2,0x59,0xc8,0xb0,0xf2,0xb9,0xfa,0x6d,0x4a,0x70,0x86,0x3d,0x24,0x1b,0xc6,0xb8,0x06,0xf5,0xea,0x09,0x63,0x9b,0x1e,0x61,0x18,0x85,0xba,0x08 +.byte 0x20,0xaa,0x33,0x66,0xcf,0xa7,0xff,0xf5,0x30,0xfe,0xf8,0x39,0xd3,0x88,0x9a,0x5b,0x3f,0x55,0xa6,0x00,0x4c,0x57,0x0d,0xd1,0xa4,0x0c,0xe7,0x8a,0x95,0xd8,0x64,0xc7,0x93,0x51,0x84,0xa6,0x41,0x2c,0xfc,0xb0,0xfb,0x99,0x9a,0xcd,0x2c,0x62,0x3a,0xca,0x43,0x15,0xf2,0x5a,0x22,0x25,0xa4,0x91,0xa3,0x7c,0x42,0x69,0xc1,0x67,0xe3,0xf5 +.byte 0xd4,0x92,0x54,0xbd,0xb3,0x57,0xe5,0x19,0xca,0x1b,0x9c,0x19,0x79,0x9d,0xbf,0x89,0xfc,0xaa,0x72,0xcd,0xcb,0xc5,0xbc,0xdd,0x0c,0x7c,0x31,0x42,0xb0,0xc2,0x76,0xe5,0x8b,0x9b,0x7c,0x92,0x13,0x20,0x5c,0xdc,0x94,0xfc,0xa1,0x90,0x34,0x27,0x88,0x9f,0xe5,0x97,0x5f,0xc3,0xa3,0x83,0xca,0x8b,0xf8,0xac,0x36,0x33,0x47,0xc6,0x20,0x2f +.byte 0x04,0x2d,0x13,0xc1,0x3c,0x07,0x6e,0xf0,0xe2,0x3d,0x32,0x5c,0x50,0x41,0xf2,0x92,0x3f,0x25,0x2c,0x80,0x34,0xa5,0x90,0x2b,0x97,0x6e,0xd1,0xa2,0xa6,0xf4,0x4a,0xe0,0x20,0xd9,0xb9,0x2b,0x66,0xe5,0x06,0x73,0x97,0xfe,0x80,0x70,0x28,0xf9,0xb6,0xae,0x93,0x27,0x7a,0x65,0xff,0x23,0xc1,0x78,0x18,0x92,0xc9,0x0b,0x05,0x82,0x93,0xbc +.byte 0x73,0x3f,0x98,0xe9,0xa0,0x6d,0x20,0x8d,0x13,0xb1,0xf0,0x7e,0xe4,0x07,0x21,0x7d,0x6d,0xea,0x03,0x59,0xf8,0x29,0xc0,0xc8,0x7d,0xce,0xd1,0xf8,0x67,0x82,0x7f,0x84,0xe8,0x77,0xa9,0x9c,0xa2,0x34,0xdf,0xa9,0xac,0xec,0x6d,0x54,0xe5,0x0f,0xcb,0xdb,0x86,0xbc,0x01,0x44,0x91,0x3b,0xc8,0x85,0x4e,0x1d,0xe4,0x74,0x19,0xc6,0x39,0x2e +.byte 0xdf,0xf2,0x8f,0x3a,0x7f,0xe3,0x1e,0x55,0x45,0xcb,0x7e,0xde,0xcd,0xa6,0x1c,0xef,0x20,0xf7,0x07,0x31,0x94,0x9a,0x3d,0x04,0xd7,0x5e,0x65,0x20,0x6a,0x4d,0x31,0x1e,0x6f,0x89,0x40,0x45,0x1f,0x37,0xc1,0x7e,0x07,0xd5,0xa6,0x38,0x4a,0xf1,0x39,0xae,0x72,0x26,0x60,0xb0,0xb5,0xc7,0xd3,0x9a,0xaf,0x57,0x12,0xe9,0x34,0x28,0x8b,0xaf +.byte 0xd8,0x62,0x24,0x58,0xe2,0xcd,0xa2,0x9e,0x74,0x23,0x2d,0x52,0xc7,0x09,0xe5,0xb5,0xf5,0xc1,0xd3,0xa3,0x19,0xe5,0x1d,0x8d,0x0c,0xdf,0x13,0x8d,0xa4,0xa7,0xc1,0x41,0xea,0x9e,0x6d,0x61,0xd4,0xa4,0x74,0xe5,0xf8,0x5f,0x9e,0xfd,0x6d,0xf6,0x6e,0x87,0x0f,0xb5,0xa3,0x82,0xac,0x64,0xb4,0xda,0x07,0x49,0x51,0xc2,0xfd,0xcb,0x55,0xa3 +.byte 0x59,0x34,0xdf,0xa1,0xd6,0x90,0x62,0x43,0x1a,0xf9,0xae,0x85,0x5c,0x11,0x40,0xb2,0xbe,0xa5,0x03,0x04,0x4f,0xec,0x2c,0x58,0x2d,0xe9,0xda,0xcf,0xaa,0x2f,0xcf,0x60,0xc3,0x2c,0x6c,0x81,0x4d,0xf2,0x71,0x41,0xe4,0xae,0x4c,0xfa,0x8e,0x05,0x10,0xff,0x40,0xfa,0xea,0x96,0x78,0x6e,0xfc,0x35,0x35,0xec,0x84,0xf6,0x1d,0x24,0x60,0xcd +.byte 0x96,0x21,0x21,0xa7,0x32,0x90,0x3d,0x51,0x72,0x13,0xa4,0x9b,0x7e,0x94,0x3a,0x9d,0x97,0xf6,0x68,0xd8,0x08,0x42,0x54,0x7a,0xbb,0x9a,0x95,0x83,0xac,0xb8,0xb4,0x68,0xe3,0x31,0xdb,0xe2,0x32,0x8b,0x7d,0x57,0x62,0x1d,0x61,0x81,0xa1,0x36,0x7a,0x25,0x00,0x72,0x24,0x4c,0xa7,0x96,0x3b,0xa5,0x82,0xba,0x8e,0x89,0x1e,0x1b,0x8e,0xf4 +.byte 0xab,0x91,0x85,0x7a,0x32,0x4a,0x47,0x9f,0xce,0xd2,0x51,0x77,0xcd,0xc9,0x02,0x54,0xf2,0x7b,0xcb,0xb8,0x83,0xe0,0xe0,0x1b,0x4a,0xa2,0xe0,0xd9,0x15,0xb6,0x02,0x19,0x75,0xa6,0xba,0xa6,0x98,0xd9,0x61,0x74,0xc6,0x48,0xa5,0x59,0x3d,0xc8,0x47,0xc9,0xe8,0x6b,0xbb,0x6d,0xcf,0x0e,0x8d,0x6b,0x58,0x8b,0x7d,0x4e,0x0b,0x3d,0x67,0xc4 +.byte 0x8e,0x78,0x59,0x40,0x88,0x82,0x33,0x27,0x2c,0xfe,0x2a,0x6c,0xe4,0x80,0xee,0x5a,0xd4,0x5f,0xc8,0xf7,0x82,0x02,0x67,0xfd,0xcb,0x55,0x3e,0xd8,0x41,0xb3,0xce,0x93,0xfe,0xe7,0x56,0xf5,0x63,0xba,0xfa,0x2e,0x79,0xfc,0x11,0x5d,0xb0,0xc6,0x32,0x54,0xed,0x71,0x9b,0x15,0xce,0x62,0x09,0xd4,0x28,0x7f,0x7b,0xa1,0x50,0x5b,0x46,0x24 +.byte 0x0e,0x40,0xa2,0xe2,0x7d,0x93,0xa6,0x2b,0x0b,0x9b,0x40,0x25,0xc9,0xca,0x7a,0x01,0x8b,0x7d,0x68,0xeb,0xd7,0x84,0xc1,0x9d,0xf9,0xfb,0xd0,0x1a,0xec,0xef,0x6b,0x4c,0x78,0x31,0x62,0x8e,0x9d,0xdc,0x78,0x8f,0xcb,0xf8,0xf9,0x41,0xdc,0x9f,0x6d,0x0a,0x27,0x67,0xce,0xbd,0xeb,0x87,0xb3,0x26,0xf3,0x51,0xe1,0xd6,0xd1,0x57,0x46,0xfe +.byte 0x21,0xb9,0x88,0x7c,0xdd,0xa2,0x49,0x71,0x24,0xfb,0xc4,0xc0,0x6a,0x6b,0x05,0x7f,0x80,0xb0,0x09,0x3b,0x9e,0x6c,0x59,0x31,0x3e,0xac,0x7a,0x2e,0x5c,0x04,0x03,0xa3,0x6e,0xf5,0x66,0xee,0xc2,0x9b,0x65,0x88,0x06,0xbf,0xf5,0xe3,0x23,0x73,0x38,0x88,0x99,0xf1,0x64,0x68,0xdf,0x7d,0x04,0x06,0x72,0x92,0x0b,0x62,0x5d,0x12,0x1e,0x4e +.byte 0xff,0x60,0x35,0xe3,0x0f,0xd9,0x8c,0xac,0x38,0x5b,0x91,0xc1,0x51,0xbb,0xa5,0x19,0x7d,0xfb,0x79,0xfa,0x42,0x3b,0xaa,0xf8,0xd3,0x0f,0xc3,0xf2,0xb2,0x68,0x91,0xae,0x28,0x83,0x4f,0x75,0xbd,0x20,0x5f,0x20,0xba,0xc2,0x75,0x85,0x74,0x23,0xf3,0x36,0x33,0x99,0x9c,0x64,0x4c,0xd1,0x5d,0xbd,0x06,0x46,0xbd,0x49,0xf0,0x86,0xc0,0xcb +.byte 0x1b,0xbd,0xec,0x98,0x5b,0xb1,0x80,0xba,0x12,0x42,0x22,0x09,0x9a,0x62,0x3c,0xa8,0x33,0xbf,0xce,0x92,0xd4,0x07,0xef,0x34,0x33,0x8f,0x67,0x1d,0x25,0x60,0xeb,0xd3,0xe4,0x31,0x63,0xa8,0xab,0xe3,0xab,0x70,0x50,0xd8,0x44,0x9f,0x39,0x51,0xd2,0xb9,0x4b,0x16,0xe4,0xfa,0xc5,0x47,0xf3,0xae,0xb5,0xfe,0x7d,0x5d,0x43,0x28,0xa6,0x3d +.byte 0xcf,0x71,0x23,0x6d,0x8e,0xd7,0x74,0xa4,0x86,0x9f,0x92,0x86,0x3c,0x1e,0x51,0xd4,0xe0,0xe6,0xd5,0xc4,0x53,0x3c,0x96,0x55,0xb9,0xac,0x63,0x5b,0xee,0x5a,0x03,0x84,0xb9,0x43,0x2c,0x0f,0x6d,0xbb,0xb5,0xca,0xf0,0x4f,0x3e,0x8b,0x3b,0x14,0x01,0x0e,0x81,0x0d,0xe6,0x62,0xa9,0x34,0x4e,0x03,0xc9,0x85,0x9f,0xc8,0x4f,0x52,0x3f,0x84 +.byte 0x1b,0xab,0x7e,0xaf,0x93,0x22,0xe2,0x0d,0x41,0x79,0x50,0xb2,0x17,0xa7,0x9a,0x80,0xd5,0x65,0x40,0x3b,0x56,0x9b,0xc9,0x00,0xcf,0x03,0xf1,0xff,0xcd,0x72,0x27,0xdb,0x74,0x94,0x70,0x02,0xdc,0x3a,0xee,0x00,0xcc,0x08,0x0a,0xab,0x40,0x87,0x24,0xaf,0x7d,0x67,0x18,0xd0,0x7c,0xeb,0x91,0x1f,0x7e,0x9e,0x41,0x7b,0x39,0xf2,0xfe,0xaf +.byte 0xb7,0x6c,0x58,0xe0,0xdb,0xf7,0xf1,0x23,0x0b,0x98,0x08,0xfa,0xde,0xfa,0xf9,0x24,0x23,0xd1,0x7f,0x69,0xd3,0xb1,0x82,0x68,0x03,0x06,0x86,0x7a,0xf4,0x90,0x8d,0xa5,0xbd,0xbe,0x14,0x2f,0xa2,0x5e,0xaf,0x5c,0x1e,0x07,0x68,0x19,0x5a,0xd3,0x53,0x7d,0xe8,0x13,0x6b,0xe3,0x02,0x49,0x0d,0xd2,0x96,0x56,0xae,0x67,0x8a,0x27,0x61,0xa0 +.byte 0x60,0x20,0x2c,0xb4,0x5d,0xdf,0xc3,0x24,0x50,0xa9,0xbc,0x3d,0x5c,0xf3,0x2e,0xb6,0xba,0x71,0xf0,0x04,0x43,0x84,0x4d,0x80,0xe9,0xa5,0xdd,0xb3,0x1e,0x5e,0x56,0x32,0x1a,0xd4,0xe3,0x10,0x57,0x35,0xa8,0xf1,0xe5,0x96,0xc1,0x27,0xef,0xcc,0x21,0x71,0x10,0xd1,0x07,0x7e,0xb3,0xab,0x95,0x64,0x86,0xaf,0xc9,0x15,0xe6,0x98,0x5e,0xb1 +.byte 0xbd,0xde,0x99,0x38,0xfc,0x8d,0xb2,0x5a,0xa4,0x44,0x5b,0x74,0x31,0x31,0x07,0x93,0xf5,0x86,0x78,0xc5,0x82,0x26,0xfc,0x95,0x1f,0x33,0xd8,0xfe,0x70,0x42,0x2a,0xa7,0x3a,0xb1,0xb2,0x63,0xd6,0x5b,0x54,0x9c,0x54,0x45,0x4f,0x1b,0x4a,0xc2,0xb4,0x0e,0x99,0x48,0xde,0x8d,0xa6,0x5d,0xd3,0xdc,0x31,0xa4,0x2b,0x0d,0x44,0x6e,0x1a,0x10 +.byte 0x3f,0x6c,0xa0,0xab,0xcb,0xb4,0xf6,0x18,0xba,0x11,0xd4,0xd4,0x70,0xc4,0xab,0x04,0x4c,0xe7,0xe9,0x53,0xe5,0xd9,0xe7,0xeb,0x21,0xa2,0x2c,0xc4,0xc6,0xc3,0xe7,0x73,0xd9,0xd3,0x84,0xb0,0x12,0x94,0x3b,0xfd,0xd9,0x32,0xba,0xe3,0x37,0xc1,0xb9,0x4d,0xea,0x3e,0x3d,0x31,0x4e,0xa0,0xe7,0x73,0x9d,0x4e,0x26,0xd1,0xdf,0xe6,0x26,0xcd +.byte 0xd7,0x17,0xd7,0x28,0x2c,0x04,0xe9,0x55,0xd5,0x70,0xaf,0xab,0xc1,0x07,0xbc,0xc4,0xd2,0x89,0xdc,0x22,0x59,0x19,0x0e,0xd8,0x8b,0xdd,0x46,0x7f,0xe4,0xad,0xa5,0x70,0xd7,0x18,0x51,0x30,0xd7,0xbc,0x26,0x45,0xe7,0xea,0xce,0xc7,0xf2,0xca,0xb1,0x9c,0x57,0x1e,0x10,0x5f,0x44,0x8d,0x3d,0xe8,0x55,0xa1,0x22,0x68,0x97,0xe8,0x03,0x9c +.byte 0x8b,0x63,0x81,0xd9,0xcd,0x4c,0x6c,0xe3,0x68,0xc9,0x35,0xee,0x94,0x13,0x25,0x0b,0x12,0x61,0xbd,0xee,0x6f,0xc7,0xe8,0xb5,0x01,0x7a,0x9e,0xd0,0x5a,0x46,0xc6,0x19,0x1b,0xc2,0xf1,0x2d,0xaa,0x53,0x29,0xcf,0x23,0x1a,0x4d,0x94,0x0a,0x50,0x64,0xf5,0x3b,0x52,0x55,0xac,0xa5,0x21,0x15,0x47,0xd9,0x14,0x8c,0x7f,0x4d,0x79,0x6b,0xc1 +.byte 0x43,0x0a,0xf2,0x42,0xd2,0xb0,0x95,0x19,0x99,0xdd,0x1d,0x8e,0x84,0x8c,0x7e,0x59,0x69,0x93,0x86,0xae,0xf1,0x67,0x35,0x55,0x7c,0x5b,0x38,0x11,0x56,0xec,0x6c,0xbb,0xe8,0xc0,0x54,0xec,0x5f,0x65,0x13,0xe3,0x86,0xa0,0xb1,0xc1,0x5e,0x34,0x4f,0xdd,0x4d,0x00,0xc6,0x29,0x05,0x78,0x64,0x8c,0x19,0xb0,0xfc,0x8a,0xb2,0xc7,0x86,0x57 +.byte 0xa2,0xdd,0xed,0x43,0xc1,0x7f,0xab,0x89,0x19,0xe8,0xa6,0xf5,0x7a,0x15,0xfe,0xd5,0x4f,0x53,0xde,0x78,0x42,0x76,0xf7,0x8a,0x54,0xe8,0x37,0xfd,0xee,0x82,0x20,0xd5,0xe2,0x32,0xb9,0x32,0x67,0xc7,0xff,0xdc,0xf0,0x40,0x07,0x28,0x55,0x16,0x56,0x84,0xe9,0x17,0x25,0x17,0x8e,0x10,0xef,0x9f,0xed,0x33,0x83,0x6d,0x9e,0x87,0x82,0xb8 +.byte 0xa9,0x6b,0xcb,0xe5,0x04,0xfb,0x87,0x51,0x05,0x1a,0x64,0x64,0x51,0x34,0xa3,0x61,0x4a,0xe3,0xa6,0x35,0xa5,0xc9,0xe3,0xde,0xb0,0xcf,0x5f,0x68,0x49,0xbc,0x98,0xf9,0x0b,0x82,0xde,0xb1,0xf9,0x77,0x16,0x7c,0x1f,0x80,0x0c,0xfc,0xbb,0x6d,0x8e,0x92,0x93,0x00,0xc2,0xa5,0xbe,0xde,0x55,0x09,0x9d,0x83,0xa5,0x6c,0x0a,0xb5,0xc4,0x53 +.byte 0xde,0xbc,0x07,0xca,0x0f,0x43,0xea,0x50,0x25,0xee,0x51,0x3b,0xfb,0x7a,0xcf,0x31,0x8a,0x19,0x1c,0xa2,0x2d,0x72,0x79,0x81,0xc6,0xb8,0xe6,0xe1,0xd8,0x3e,0x0f,0xc0,0xae,0x73,0x40,0x30,0x15,0xaa,0xe3,0x72,0xc3,0x36,0xc1,0x42,0x11,0xc5,0x3f,0xf5,0x69,0x78,0xea,0x95,0x54,0x36,0xe8,0x7e,0x9c,0xad,0xbd,0xcd,0x19,0xfe,0x4a,0x04 +.byte 0xb4,0x54,0x14,0x98,0x58,0x6f,0x06,0x8f,0x8c,0x95,0xa8,0xc9,0xe8,0xc4,0x2b,0x03,0xaa,0x42,0x75,0x74,0xa2,0x63,0xdb,0xca,0xd1,0xf0,0x60,0xc3,0x63,0x84,0xfb,0xd7,0x5a,0x7b,0xca,0x45,0x8d,0x14,0xdc,0xf8,0x71,0x40,0x71,0xbb,0xa1,0x1a,0xd3,0x8c,0xfb,0xf6,0xf7,0xfc,0x82,0x72,0x50,0xc9,0xe3,0xc5,0xe2,0xb1,0x57,0xb1,0x24,0x3e +.byte 0x11,0x4d,0x96,0x1c,0x3a,0xe1,0xb6,0xb7,0x0e,0x55,0x35,0x6c,0xd8,0x2b,0xe3,0x78,0xcd,0xac,0x8f,0x24,0x70,0xc6,0x35,0x5b,0x6e,0x75,0x7a,0xf1,0x7d,0x87,0x53,0xcf,0x0a,0x24,0xb6,0x6a,0xfd,0xef,0x90,0x07,0xcf,0xde,0x30,0xbc,0x8c,0xec,0xda,0x6f,0x45,0xad,0x92,0xb6,0x8d,0x6b,0xb8,0x8e,0xdc,0xe5,0xbf,0x57,0x67,0x5e,0x2f,0x4d +.byte 0x5d,0xee,0x38,0x0a,0xaf,0xeb,0x62,0x84,0x2b,0x4c,0x30,0x7b,0x91,0x99,0x40,0x6f,0x09,0x2b,0x36,0xcd,0x04,0xeb,0x7c,0x8d,0xa5,0xbd,0xd6,0xb0,0xfc,0x27,0xcf,0x6b,0xdd,0xe1,0x94,0xbc,0x21,0xc6,0xc9,0x55,0x24,0xd4,0xa1,0x6f,0x1e,0xa2,0x81,0x31,0x22,0xb7,0x75,0x9e,0xa7,0x01,0x26,0x01,0x6c,0x12,0x91,0x02,0x87,0x40,0x5c,0x91 +.byte 0x1f,0x0c,0x55,0x07,0x12,0xa7,0x48,0xdd,0xed,0xb6,0xfe,0x38,0x05,0xbc,0xe1,0x2e,0x3b,0x89,0x4f,0x98,0x65,0x22,0x93,0xda,0x09,0x9f,0x04,0x90,0x66,0x81,0xd1,0x56,0x27,0x8b,0x26,0x99,0xbe,0x93,0x08,0xf1,0xfb,0x80,0x5b,0xaa,0xc4,0x96,0x88,0x93,0xb6,0x01,0xae,0xf6,0x69,0xaa,0x6f,0x4d,0xde,0x2f,0xc7,0x24,0xbf,0xe9,0xb8,0xeb +.byte 0xcd,0xb2,0x0a,0x50,0x5c,0xd2,0x0b,0xfc,0x57,0x3b,0x96,0xf8,0xd9,0xbe,0xd2,0xb5,0x16,0xac,0x7c,0xe4,0x2f,0x46,0x93,0x86,0x48,0x91,0xfa,0xae,0xca,0x05,0x9e,0xfe,0x6e,0xae,0xa5,0x58,0x94,0xc0,0x58,0x1e,0xc5,0x69,0x28,0xe0,0x99,0x12,0x83,0xcf,0x35,0xe4,0x72,0x7d,0x4e,0x8b,0x66,0x56,0xb3,0xa6,0x2a,0x72,0x06,0x03,0x45,0xd1 +.byte 0x95,0xc9,0x93,0xb7,0xf4,0x8a,0x83,0xce,0x17,0x8b,0xf0,0x8e,0x8f,0x4a,0x68,0x55,0xd8,0xfc,0x54,0x8d,0xb5,0x62,0x17,0xa8,0xe6,0x18,0x03,0x53,0x04,0xb8,0xbe,0xd2,0xd0,0x7a,0x84,0xe1,0x39,0x31,0xc5,0x74,0xf2,0x64,0x1c,0x3b,0xd5,0x52,0x9b,0x81,0x8a,0x8f,0x36,0xc8,0xab,0x3d,0xe1,0xa8,0x2a,0xf2,0x84,0x9a,0xca,0x0c,0xcf,0xc9 +.byte 0x45,0x54,0x06,0xe8,0xd2,0x62,0x61,0x4d,0xeb,0x0b,0x38,0x4e,0x43,0x59,0x85,0x3a,0xe4,0xa3,0x25,0x15,0xc2,0xb5,0x7b,0x5e,0x2f,0xe6,0xc1,0x5d,0x2a,0xb7,0x57,0xb8,0x7e,0x61,0x51,0xc3,0x81,0x53,0x45,0x8a,0x6e,0x4c,0x89,0x84,0x2a,0x6b,0xca,0x15,0xff,0x97,0xfc,0x1f,0x8a,0x44,0xbd,0xcd,0x5e,0x32,0x6b,0x5f,0x78,0x7b,0xdf,0xdd +.byte 0x9d,0x2f,0x21,0xf2,0x14,0x40,0x5f,0x5a,0xd5,0x21,0x27,0x3d,0x0b,0x9f,0x9f,0xb0,0x8e,0xab,0x9e,0x68,0x96,0x02,0xfd,0x4d,0xcc,0x03,0xf0,0x03,0xfb,0x4c,0xac,0xfa,0x00,0x3b,0xea,0x1a,0x53,0x80,0x77,0xec,0x53,0xc3,0x3c,0x6c,0xf8,0xa5,0x3e,0x52,0x34,0xd4,0xa1,0x52,0xb8,0xd6,0x19,0x8c,0xdf,0x85,0x27,0x61,0x22,0xe7,0x43,0xeb +.byte 0x85,0xc0,0xbe,0x58,0xe6,0x60,0x81,0x4c,0xc6,0xbb,0xc0,0xbf,0x63,0x39,0x9d,0xad,0x2e,0xa8,0x2a,0x83,0x3d,0xfa,0xdb,0x0b,0x98,0x16,0x78,0x18,0x43,0xc7,0x17,0x82,0xb8,0xec,0x32,0x45,0x75,0x0c,0xc1,0x4c,0x84,0xbf,0xce,0x83,0x3b,0xb4,0x91,0xf4,0x0d,0x5d,0x83,0xf6,0xd6,0x10,0xab,0xc6,0x26,0x9b,0x68,0x59,0xec,0x48,0x4b,0x1d +.byte 0x35,0x2a,0x5b,0x23,0x83,0x22,0x8e,0x7d,0xfa,0xce,0xde,0xb1,0xd9,0x78,0xf6,0x9e,0x08,0xba,0xfb,0xda,0xf2,0x04,0xc5,0x2a,0xac,0xbf,0xb4,0x04,0x05,0x1f,0x0b,0xeb,0xe8,0x2a,0x3c,0x3f,0x4f,0xb6,0xc8,0x6b,0x97,0x5a,0x9e,0xdb,0x4b,0x3c,0x93,0xc1,0x20,0x1c,0x62,0x91,0x74,0x76,0x49,0x92,0xc2,0xd8,0x0d,0xd8,0xfe,0xb5,0x68,0x77 +.byte 0x48,0x9f,0xbe,0xe0,0x78,0x20,0xe7,0xa4,0x3d,0x3e,0xa1,0x4c,0xc7,0xeb,0xd3,0x30,0xd3,0xf0,0x65,0xcf,0x18,0x3c,0xf8,0x25,0xc2,0x99,0xf4,0xec,0xef,0xdd,0xef,0xf3,0x6b,0x28,0x00,0xaa,0xfd,0x76,0xec,0x19,0x67,0xd6,0x79,0xa6,0x01,0x6e,0x20,0x3a,0x7f,0xd4,0xd0,0x05,0xb4,0xea,0xd4,0xde,0x11,0x06,0x44,0x4a,0x6f,0x15,0x2f,0x62 +.byte 0x9a,0xaa,0xeb,0xaf,0xb5,0xb5,0x46,0xb2,0x28,0x2e,0x74,0x26,0x06,0x91,0xeb,0x15,0xef,0xd4,0xfd,0xc7,0x1b,0x65,0x25,0x01,0x24,0xd2,0x44,0x05,0x18,0x1c,0x71,0x36,0x58,0xc4,0x37,0xfe,0x22,0x29,0xc0,0x2f,0xd2,0x4e,0xeb,0x43,0xb9,0xf9,0x4e,0x87,0xd7,0x92,0x77,0xa8,0x4f,0xa5,0x6e,0x5c,0x4d,0x3a,0xe9,0x16,0x62,0x30,0x51,0xbb +.byte 0x32,0xd8,0x0d,0x86,0x20,0xbf,0x68,0x0f,0x3e,0xef,0x8b,0x0d,0xc5,0xa6,0x94,0x81,0xe9,0x6f,0x85,0xf5,0x22,0x6e,0x9e,0x0a,0x56,0xa3,0x43,0x79,0x50,0xd9,0x45,0x5f,0x5a,0x3f,0x53,0x53,0xb7,0xfe,0xb6,0x1c,0x63,0xab,0x7c,0xed,0x2f,0xc4,0x2b,0xa8,0x53,0xfb,0xad,0x46,0xf0,0x63,0xca,0x7a,0x6e,0xce,0xf4,0xb9,0x34,0xd0,0x9a,0xc8 +.byte 0x0d,0xd2,0x32,0xce,0x26,0x3f,0xcd,0xd9,0xbc,0xa9,0x46,0x65,0x45,0xfe,0x45,0xeb,0x0d,0xab,0xe6,0x31,0xb6,0xb9,0x41,0x53,0x7d,0x55,0xc3,0xfb,0x10,0x46,0x37,0x77,0x1f,0x15,0xf0,0x5f,0xcb,0x8f,0xea,0xc5,0xc0,0xb8,0xc6,0xb1,0x3a,0x06,0x42,0xec,0x38,0xec,0x06,0xd1,0x37,0x3b,0xe1,0x8d,0xad,0xc2,0xce,0x96,0x0b,0xf0,0xab,0xde +.byte 0x9c,0x3c,0x09,0xef,0x59,0xcd,0x67,0xa7,0x6e,0x0e,0xc7,0xee,0x51,0x6d,0x90,0x40,0x0e,0xdf,0xb1,0x13,0xe3,0x0c,0xb6,0xe8,0xcb,0xf5,0x57,0x50,0xeb,0xdf,0x09,0x45,0x72,0x40,0xff,0xdc,0x5c,0x51,0x42,0x47,0xb2,0x9e,0xca,0xf3,0x1b,0x06,0xb1,0x3e,0x04,0x55,0x96,0x63,0x24,0x16,0xdb,0x3e,0xab,0x98,0x33,0x70,0x6f,0xfd,0x8f,0x7b +.byte 0x56,0xb0,0x7f,0x28,0x26,0xc4,0x2a,0x9e,0xf5,0xa7,0xba,0x61,0x75,0xa4,0xb1,0x25,0x60,0xe5,0x9c,0x7e,0xb4,0xaa,0x04,0xa1,0x33,0x5a,0x8d,0x88,0x1d,0xc4,0x38,0x58,0x28,0x23,0xc7,0xac,0x20,0xf8,0xaa,0x18,0xf8,0xc7,0x27,0x05,0x07,0xf7,0x12,0xfe,0xe1,0xa5,0x99,0xaa,0x55,0x79,0x72,0xc4,0x14,0x08,0x14,0x4a,0xfb,0xf7,0x66,0x81 +.byte 0x6e,0xed,0x81,0x12,0x5f,0xb6,0x08,0x00,0x37,0xf9,0xdc,0xdf,0x4d,0xcb,0xfa,0xc6,0xf3,0xc2,0x17,0x17,0x52,0x39,0x7b,0xa0,0x3e,0x25,0xc9,0x48,0xd8,0xa6,0x1b,0x8b,0xdb,0xf8,0x74,0xac,0x6b,0x16,0xec,0xa6,0x4a,0x1e,0x7e,0x5c,0x50,0xbf,0x81,0xef,0x3c,0x7d,0x9d,0x21,0x38,0xa9,0x26,0x3c,0x30,0x7a,0xfb,0xab,0xd8,0x6a,0x0a,0xaa +.byte 0xbb,0x6e,0x91,0x92,0x7c,0x04,0x02,0x0e,0xa2,0x71,0xc7,0xde,0x7d,0x42,0xaf,0xe5,0x92,0xc1,0xb9,0xd7,0x52,0xaa,0x32,0xea,0x39,0x84,0x17,0x40,0xb0,0x83,0x18,0xff,0x46,0xb8,0x59,0xd9,0xa3,0xce,0x82,0x7e,0x65,0x54,0xe0,0xa4,0x6d,0x8a,0xbc,0x6a,0x65,0xb2,0xd5,0x96,0x5b,0x1c,0x9a,0x32,0x72,0xf7,0x81,0x57,0xcd,0xb3,0x22,0xc5 +.byte 0x7d,0x20,0x24,0xea,0xbe,0x51,0x4c,0xb3,0x48,0x36,0x4f,0x73,0xf4,0x3f,0x07,0x92,0x01,0xe2,0x1e,0x78,0x3f,0x8e,0x1f,0x35,0x1a,0xf1,0xe1,0x14,0xd1,0xe7,0xd9,0xfd,0xd8,0xf7,0x20,0xc2,0xf3,0x7a,0x59,0xc9,0x1d,0x13,0x41,0x01,0xf6,0x77,0x69,0xfb,0x0f,0xc7,0xe4,0x58,0x04,0xce,0xe8,0x73,0x87,0x2f,0xef,0xe6,0x36,0x38,0xc7,0x91 +.byte 0x2d,0x17,0xb5,0x56,0x68,0xb1,0x9f,0xbf,0x2e,0x4b,0xe7,0x09,0x7b,0x35,0x33,0x5a,0x6c,0xc1,0x6f,0xb3,0xac,0x6c,0x1e,0xfe,0xc0,0xc9,0xd8,0x77,0xf5,0xcb,0x5e,0xcc,0xd1,0x2f,0xdd,0x23,0x8b,0x3b,0xb5,0x43,0x96,0x1f,0xa9,0xe4,0x84,0x41,0x92,0xe9,0x68,0x47,0x50,0xf7,0xd4,0x85,0x22,0xa1,0x43,0xaa,0xde,0xf7,0xea,0xe0,0x54,0xaa +.byte 0x0d,0xe6,0xa5,0xb8,0x7e,0xec,0x13,0x9a,0x1e,0x6c,0x10,0x9d,0xa8,0xfb,0x97,0xde,0x24,0xda,0x33,0xbb,0xab,0x17,0x7a,0xb4,0x72,0xaf,0xed,0xc9,0xa4,0x62,0x65,0x0c,0x99,0x3d,0x74,0x7f,0xff,0x59,0xa9,0x8e,0x37,0xb9,0x10,0x30,0x26,0x3f,0x2f,0xfc,0x1e,0xe2,0xc6,0xb8,0xff,0x41,0xb3,0x35,0x3f,0x41,0xf4,0x47,0xbc,0x76,0xc6,0x77 +.byte 0x0f,0xf8,0xff,0xb8,0xd2,0x34,0x40,0xac,0x43,0xcb,0xcf,0x1f,0x57,0xaa,0x1a,0xa7,0xe1,0x4a,0x69,0xd7,0x05,0xa7,0x9d,0xff,0x13,0x43,0x91,0xe3,0x09,0x1c,0xb2,0xb2,0x82,0x06,0xa3,0x3c,0x35,0x85,0x9e,0xd0,0xcf,0x1c,0xb9,0x13,0x09,0x7d,0x3d,0x17,0x0f,0xf8,0x2f,0x61,0x97,0x7e,0x02,0xe0,0x78,0x07,0x69,0x8c,0x91,0xbe,0x96,0x92 +.byte 0x4a,0x03,0xa7,0x31,0x5f,0x6c,0xfe,0x55,0xb2,0x17,0xe8,0x4c,0x64,0x48,0x18,0xde,0x4f,0x5a,0xce,0xd2,0xcb,0x83,0x4d,0x1b,0x2a,0x1f,0xce,0x85,0xf7,0xdc,0x74,0x8c,0x42,0xc6,0x5a,0x3a,0x51,0x22,0x79,0x70,0xa0,0xe0,0x29,0x2a,0x73,0xe4,0x53,0xb4,0x47,0x5f,0x54,0xa8,0x65,0xe4,0x89,0x78,0xf9,0xb9,0x5f,0x5f,0x9d,0xa8,0xf7,0x82 +.byte 0x4e,0x34,0x60,0xfc,0xe3,0x88,0x65,0x73,0x99,0x1f,0x53,0xed,0xe8,0xf0,0xf4,0x5a,0x0a,0x49,0x42,0x6e,0x02,0x3f,0xa8,0x63,0x21,0x02,0x2e,0x8f,0x33,0xba,0x0e,0x10,0xd3,0x4c,0x1a,0x8b,0xf5,0x84,0x8e,0x2b,0x37,0x12,0x23,0x77,0x02,0x45,0xc7,0xc3,0x79,0x06,0xc2,0x8c,0xaa,0x32,0x53,0x7c,0x19,0xa2,0x92,0x7e,0x47,0x40,0x8f,0xae +.byte 0x8a,0x64,0x51,0x67,0xe1,0xc1,0xc3,0xd2,0x14,0x1d,0x63,0x0c,0x80,0x04,0x30,0x3d,0xee,0x58,0x44,0xe4,0x14,0x63,0xfc,0x95,0x05,0x3e,0xc1,0x8d,0xd3,0xcb,0x5d,0xc1,0x8e,0xf9,0xd7,0xe5,0x9d,0x97,0xef,0x8a,0xaa,0x50,0x31,0xa3,0x01,0x3a,0xb2,0x8d,0x63,0xb6,0xe7,0x34,0xec,0xa1,0x7a,0xff,0x57,0x95,0xbb,0x1d,0xbe,0x0c,0xa5,0x91 +.byte 0x92,0x08,0x06,0x1c,0x67,0x03,0x2e,0xee,0xf6,0x6f,0xa0,0xb7,0x9a,0x7c,0xe3,0x6a,0x8e,0xd8,0x50,0xc1,0xd6,0xa1,0x8d,0xe9,0x66,0x9a,0x1f,0x62,0x15,0x04,0x93,0x74,0xe8,0x04,0x0d,0x27,0x55,0x2b,0x07,0xb1,0xbd,0x69,0xe4,0xc1,0x34,0x8e,0xe7,0xfb,0xa0,0x3f,0x40,0x31,0x47,0xba,0xcb,0x80,0x88,0xf7,0x4f,0x46,0x05,0x31,0xaf,0x23 +.byte 0xdf,0x93,0x09,0x0a,0x15,0xc9,0x95,0x74,0x52,0x72,0xf4,0xbf,0x0d,0x07,0xb6,0xcc,0x4b,0x40,0x12,0xf3,0x87,0xea,0x29,0xd8,0x29,0x31,0x23,0xac,0x29,0x1a,0x89,0x83,0x5b,0x33,0x4b,0x6b,0x69,0xbe,0xb6,0x15,0x7e,0xfd,0xf2,0x95,0xc4,0xbe,0xeb,0xee,0x59,0x01,0x2a,0xce,0xca,0x80,0xda,0xf8,0x1a,0x01,0x23,0xf7,0xa1,0x4f,0xf5,0x83 +.byte 0x5e,0x16,0xd9,0x12,0xa9,0x4e,0xcb,0x59,0x23,0x4f,0x40,0xd7,0xbf,0xaf,0x76,0xf0,0x50,0x31,0x27,0x3a,0x8b,0x1d,0x9b,0xb1,0x1c,0x41,0xb0,0xed,0xe6,0xf3,0xa8,0x5f,0x6b,0x58,0x54,0x92,0xaf,0xcc,0x44,0x5c,0xea,0xdb,0x09,0xc5,0x26,0x5e,0xbe,0x46,0xbd,0x72,0x49,0x5a,0x4e,0x65,0x7e,0x75,0xcf,0xfc,0xf6,0xd0,0x3c,0x4a,0x7e,0xd6 +.byte 0x8e,0x8e,0xb4,0x19,0x45,0x75,0xbf,0xc3,0x5e,0x46,0xff,0xc9,0x46,0x65,0x8d,0x31,0x01,0x5e,0x1c,0x13,0x93,0x56,0x6f,0x28,0xec,0xf3,0x77,0xfa,0x6e,0xb9,0x0e,0xb6,0x8e,0x0e,0x38,0xf8,0x28,0x64,0xa2,0xa1,0x42,0x9a,0xb4,0xf3,0x14,0x8d,0x17,0x80,0x05,0x82,0x7c,0xf1,0xea,0x8b,0x4b,0x62,0xa0,0xde,0xf6,0xd7,0x36,0xb0,0x70,0x8d +.byte 0x03,0xf6,0xc8,0x2a,0x9e,0xc0,0xbb,0x2f,0xcb,0xef,0x35,0xf7,0x16,0xcd,0xd6,0xd6,0x90,0xd7,0x5d,0x61,0x00,0x33,0x9f,0xd8,0xd1,0xda,0x17,0x67,0x90,0xd1,0xf8,0x59,0xcb,0xf1,0x76,0xc2,0xbe,0x1f,0x5d,0x0d,0xb2,0x02,0xbd,0x19,0x9f,0x5a,0xa0,0x91,0xac,0x51,0xb5,0xf5,0x0a,0x64,0x67,0xf2,0x49,0x30,0x6c,0x57,0x83,0xda,0x90,0xf1 +.byte 0xc6,0xc7,0xe6,0x05,0x13,0x30,0x52,0xfd,0x2a,0x47,0xea,0xae,0xd3,0xed,0xe4,0x64,0x1f,0x6c,0xb1,0xdf,0xca,0x20,0x97,0x2a,0xc8,0xdc,0x00,0x0e,0x5b,0x59,0xc8,0x16,0x95,0x68,0x9a,0x2e,0x44,0xab,0xf6,0x93,0x7c,0x8f,0x66,0x4f,0x07,0x42,0x3f,0xa5,0x81,0xe7,0xab,0x59,0xbb,0xae,0xb1,0x3e,0x9a,0x25,0xf1,0xde,0xac,0x4c,0x1d,0x7a +.byte 0x54,0xb9,0xa9,0x59,0xaf,0xb0,0xab,0xaf,0x6b,0x76,0x66,0x1e,0xbe,0x1a,0xc1,0x61,0x1b,0x81,0x6b,0xe8,0xe4,0x73,0x6a,0x87,0xe9,0x39,0xcb,0x2c,0xab,0x64,0x36,0x9a,0x11,0x46,0xec,0x9f,0x30,0xb6,0x2c,0x14,0xe0,0xec,0xbe,0x33,0xde,0x60,0xc6,0x00,0x29,0x3c,0x55,0xda,0xfc,0x64,0xff,0xaa,0xbf,0x99,0x58,0xe2,0xe3,0xec,0xde,0xca +.byte 0xd1,0x3d,0xd2,0xad,0xaa,0xca,0x36,0x8f,0x93,0xa2,0xdd,0xde,0xaa,0x49,0x7f,0xdd,0x39,0x91,0xa0,0x7b,0x33,0xdf,0x36,0xcd,0xc3,0x3a,0xbc,0x53,0xf0,0x07,0x99,0x78,0x4e,0x63,0x47,0x79,0xbf,0x21,0xfc,0x05,0x47,0x69,0xec,0xee,0xf4,0x21,0x97,0x94,0x0c,0x7a,0x9f,0xa6,0xeb,0x5b,0x23,0xed,0x9d,0xc1,0xe1,0x5e,0x10,0xca,0xe0,0x84 +.byte 0x5a,0xdd,0xf6,0xae,0xd8,0x23,0x98,0xea,0x6c,0x43,0x77,0x41,0xf3,0x84,0x5a,0xe8,0xda,0xb3,0x11,0x0e,0x19,0x33,0xe9,0xf9,0x7a,0x90,0x07,0x68,0xf1,0xe4,0x52,0x0c,0x03,0x67,0xb9,0x42,0x41,0x24,0xa3,0x61,0x67,0x75,0xc9,0xb5,0xdd,0x10,0xf1,0x20,0x93,0x54,0xdb,0x0d,0xc7,0x0d,0x25,0x3e,0xda,0xb3,0xe7,0xce,0x97,0x7e,0xdb,0x1a +.byte 0x8f,0x92,0xff,0xe3,0x44,0x2d,0x6b,0xdb,0xe0,0x69,0x8b,0x16,0xce,0xe8,0xc7,0x93,0xf1,0x19,0xb9,0xd3,0x41,0x45,0x8d,0x95,0xb3,0x03,0xb2,0x66,0x96,0x95,0x91,0x33,0x1c,0xee,0xde,0xd7,0x9d,0xab,0x32,0x2f,0xb8,0x3c,0x7a,0x44,0x8f,0xa6,0xca,0x02,0x03,0x2f,0xa8,0x44,0x85,0x0e,0xf5,0x27,0x90,0x84,0xd9,0x80,0x06,0xf4,0x4f,0xc7 +.byte 0x21,0xc5,0x92,0xa4,0x2d,0x08,0x42,0x4c,0xa7,0x84,0xfa,0x7e,0x2b,0x66,0xfb,0x7c,0x81,0xea,0x5c,0x7d,0xdd,0x86,0xf1,0xf5,0x04,0xef,0xf2,0x50,0x12,0x72,0x42,0x22,0x23,0x74,0x7f,0xe7,0xed,0xd9,0xce,0x78,0x10,0x83,0x37,0xd0,0x81,0x97,0x4a,0xac,0xc2,0xe5,0x13,0x91,0x83,0xe2,0x6e,0xff,0x5a,0x0b,0xc3,0x4d,0xc1,0x3e,0x97,0x16 +.byte 0x96,0x69,0x39,0x9e,0x1d,0x6b,0x16,0x82,0xa2,0x94,0x0d,0x50,0xdd,0xa3,0xda,0x9d,0xda,0x3f,0x46,0xce,0x6c,0xd0,0xdf,0x6e,0x1b,0x17,0x47,0x51,0x74,0x6f,0xe9,0xa4,0x6b,0xae,0xd2,0x6e,0x5b,0xc0,0x26,0xc6,0x0b,0x84,0xb1,0x39,0xcf,0x9e,0x7c,0x18,0x52,0xd7,0x8f,0x33,0xae,0x3d,0xaf,0x3d,0x1a,0xba,0x3f,0x09,0x76,0x22,0x1d,0xf3 +.byte 0x42,0x14,0x4f,0x06,0xc7,0x33,0xc1,0x2d,0x58,0x1b,0x4c,0xc0,0x3a,0x29,0xa6,0x5e,0x19,0x26,0xdf,0x36,0x18,0xa9,0xc5,0xe9,0xd3,0xb1,0xae,0x86,0xa8,0x7f,0xd9,0xb4,0x18,0xef,0x9c,0x46,0xb6,0xf2,0xb2,0xb6,0x6e,0xe2,0xf8,0x5f,0x27,0xea,0x76,0xd3,0x40,0x68,0x94,0x66,0x8a,0xf5,0x9f,0xee,0x0c,0xe5,0xae,0xb6,0xba,0x87,0x42,0x40 +.byte 0xc9,0x83,0xac,0xb4,0x2c,0xec,0x74,0xb7,0x55,0x17,0x0b,0x1e,0x45,0x1a,0x87,0x9d,0x52,0xce,0xb7,0x58,0x2f,0x45,0xc7,0x7d,0xf3,0xd3,0x11,0x2e,0xf4,0xd8,0xc0,0xb8,0xc3,0x31,0x45,0x68,0x40,0xe8,0x8a,0x33,0x20,0x9a,0x06,0xa8,0x18,0x53,0xb2,0x73,0xa1,0x57,0xac,0x8f,0x56,0xeb,0x8e,0xa4,0xfc,0xd6,0x76,0x7e,0x81,0x62,0x2c,0x17 +.byte 0x49,0xb4,0xcc,0x15,0x66,0xcb,0xa2,0x3c,0x29,0xf0,0x73,0x0e,0x9a,0x34,0x16,0x6d,0x43,0x62,0x20,0x89,0x14,0xae,0x8b,0x5d,0x61,0x54,0xa1,0x82,0x49,0x73,0xb9,0x2b,0x48,0xd4,0xe3,0x21,0x37,0x5e,0x4d,0xbf,0xd0,0x72,0xa4,0x23,0xdb,0x7c,0xd9,0x45,0x77,0x8a,0x24,0x23,0x56,0xcd,0x84,0x80,0x44,0x12,0xce,0x99,0x39,0xbd,0x77,0xff +.byte 0x8c,0x62,0x8d,0x56,0x77,0x24,0x40,0x11,0x22,0xab,0x28,0xd6,0x75,0x2b,0xbb,0xc1,0x51,0xd6,0x5e,0x61,0x1c,0xe9,0xac,0x36,0x99,0x52,0x44,0xa5,0x20,0xdb,0xe0,0x12,0x9a,0x45,0x8f,0x7f,0x47,0xf9,0xa3,0x91,0x18,0x2b,0x51,0x9a,0x9f,0x3f,0x7d,0x36,0xde,0x71,0xae,0xca,0x62,0x62,0x16,0xda,0x19,0x9c,0x84,0xce,0xde,0x93,0x22,0xde +.byte 0xaf,0xe7,0x91,0x09,0xe8,0xf0,0x0e,0x07,0x71,0xdf,0x48,0xcd,0x8a,0x77,0x19,0x3c,0xd6,0xef,0x8e,0xe0,0x49,0xdf,0xcb,0xd6,0x34,0x78,0x7f,0x42,0xc2,0x6e,0x7a,0x50,0x53,0xee,0xbf,0x73,0x4b,0xd4,0x4f,0x06,0x18,0x26,0x67,0x51,0x54,0xa3,0x40,0xe6,0xb3,0x61,0x4b,0xfd,0xee,0x62,0x00,0x44,0x6c,0x0d,0x8b,0x2f,0x4d,0x06,0x17,0x41 +.byte 0xee,0x8b,0xde,0x1f,0x80,0x36,0x58,0x3e,0x0a,0x53,0x0a,0x83,0xf9,0xba,0xbd,0x91,0x6a,0x20,0x32,0x42,0x6c,0x85,0xdc,0x84,0xfd,0xce,0x57,0xbe,0xf8,0xa5,0x2c,0x7e,0xf9,0x1b,0x07,0xf4,0x32,0x13,0x32,0x79,0xdc,0x91,0xfc,0xc0,0x18,0xe6,0x1e,0xb2,0x67,0x9d,0x08,0xd2,0x89,0xa2,0xb1,0xbf,0x37,0xe1,0x3f,0x9e,0xb5,0x17,0xf7,0x2f +.byte 0x9a,0x4f,0x3c,0xea,0x5d,0x48,0x56,0x48,0x35,0x17,0xe9,0x5a,0x99,0xa7,0x2e,0x25,0x4f,0x96,0xa6,0x3d,0x3c,0xf8,0xdc,0xe7,0xe5,0x98,0x46,0xf7,0x10,0x16,0x4f,0xb0,0x7b,0x48,0x06,0xbb,0x9a,0x5a,0xad,0x32,0x49,0x92,0x39,0xb2,0xfe,0x01,0x1a,0x5e,0xcc,0xf7,0x0d,0x65,0x1c,0xf5,0x3d,0xb3,0x40,0x28,0x06,0x6e,0xbb,0x74,0x2a,0x95 +.byte 0xe9,0x62,0x2a,0xe2,0x19,0x38,0xc6,0x0d,0x46,0x30,0x6d,0x90,0xa5,0x68,0x4d,0x89,0xf0,0xf4,0xaf,0x52,0x11,0x8a,0x47,0x65,0xc0,0x6d,0xee,0xde,0xbc,0xed,0xf2,0x94,0xf3,0xfb,0xfd,0x2f,0xea,0xd5,0x36,0x89,0x8a,0x22,0xb8,0x75,0x3c,0xda,0x8d,0x3f,0x71,0xe5,0x50,0xb8,0xef,0xfc,0xa1,0x34,0x4a,0xb0,0x56,0x64,0xaf,0x28,0x0c,0x7a +.byte 0x28,0x3e,0xc8,0x83,0xc2,0xbb,0x89,0xc4,0x29,0x7f,0xc9,0xe7,0x4e,0xcb,0xdc,0x8f,0xe8,0xa4,0xdc,0x0d,0xcc,0xa0,0x16,0xda,0xa9,0x34,0x61,0xec,0x64,0xa7,0xf4,0x47,0xe9,0xee,0xbf,0xc6,0x4b,0xc5,0x01,0x65,0xe4,0xe0,0x12,0xd6,0x27,0xda,0x30,0xb5,0x60,0x72,0xe1,0xee,0x38,0x23,0x6c,0x9d,0xbb,0x83,0x01,0x4b,0x26,0x9a,0x68,0xb3 +.byte 0x89,0xb3,0xe0,0x10,0x22,0x58,0xef,0x2d,0xd4,0x86,0xab,0xab,0xc4,0xd8,0x9c,0x56,0xe8,0x54,0x40,0x86,0x11,0xd2,0x6b,0xc0,0xaf,0xfc,0x4a,0xef,0x24,0x38,0x79,0x32,0x54,0x26,0x8b,0x7e,0x02,0xad,0x86,0x9d,0x40,0x65,0x28,0x28,0xa3,0xa6,0xe4,0x07,0x29,0x3a,0xbb,0x81,0xed,0x17,0x54,0x51,0x35,0xc6,0x88,0x9c,0x63,0x7e,0x73,0x02 +.byte 0x28,0x13,0x4b,0x33,0xc0,0x68,0xbc,0xae,0x8c,0x59,0xd4,0x84,0x1d,0x41,0x86,0x5a,0xf6,0x14,0x50,0x13,0x88,0xca,0xc8,0xb8,0xfc,0x61,0xeb,0xe6,0x69,0x70,0x4a,0xa5,0xa5,0x36,0x4b,0xac,0xca,0x00,0x28,0xae,0xb0,0x03,0xef,0xe3,0x92,0xad,0x97,0x32,0x05,0x8c,0x93,0x95,0x45,0xd5,0x75,0x66,0x11,0xd3,0x6f,0x7f,0x5f,0x35,0x44,0xb7 +.byte 0xd7,0x34,0xcf,0x8c,0x4a,0x61,0x68,0x63,0x3f,0x92,0x54,0x01,0x3c,0x25,0x2d,0x6f,0x4a,0x2d,0x55,0xff,0x3f,0x86,0x85,0x9f,0xc2,0xa1,0xde,0x6b,0xbf,0x7e,0xb4,0x7c,0xc1,0x80,0x73,0xf5,0x3b,0x85,0xae,0x36,0x1a,0xdf,0x00,0x52,0xb7,0x70,0xa9,0x42,0x79,0xd2,0x26,0xf8,0x3b,0xeb,0x9f,0x2e,0x15,0x33,0xc8,0x85,0x2d,0x63,0xb2,0x89 +.byte 0x24,0x8e,0xfd,0xe6,0xdf,0x01,0x80,0x8b,0x27,0xe3,0x7e,0x17,0xc2,0x4e,0x26,0xa2,0xe1,0x95,0x81,0x3a,0xdd,0x2a,0xf4,0x75,0x21,0x64,0x11,0x04,0x5e,0x00,0x39,0xf0,0x08,0x68,0x67,0x09,0xa8,0x9b,0xbe,0xb7,0x62,0x0e,0xa8,0x69,0xcd,0x4e,0xaf,0xc8,0x4f,0x92,0x3d,0x8e,0x35,0x60,0x70,0xb3,0xda,0x2f,0x38,0x80,0x6f,0x5e,0xcc,0x3b +.byte 0x6e,0x05,0x26,0x14,0x9d,0x36,0x72,0x7d,0x09,0xb8,0xb7,0xa1,0xf7,0x5f,0xb3,0xe1,0xd6,0xc5,0x54,0x4e,0x80,0x4d,0x06,0x8f,0x84,0xbb,0xb6,0x65,0x87,0x2c,0x19,0x4a,0x74,0x3c,0x34,0x62,0x32,0xad,0x4c,0x06,0xa3,0xbb,0xfb,0x4f,0x4f,0x9d,0x91,0x84,0x63,0x75,0x34,0xcc,0x6b,0x00,0xa1,0x5a,0x63,0x03,0x8d,0x1e,0xdb,0xa4,0x0c,0xe6 +.byte 0x3d,0xd1,0x94,0x77,0xd8,0x77,0x8c,0x39,0x48,0x78,0xb1,0xb5,0xa2,0x41,0xd0,0x6d,0x27,0x20,0x4a,0x41,0x88,0xa5,0x78,0x3f,0x51,0x72,0x8c,0x80,0xe7,0x37,0x81,0x8b,0x06,0x46,0x58,0xab,0x23,0x85,0x47,0x89,0x39,0xf9,0x14,0xfe,0xbf,0x07,0x7c,0x47,0x8e,0xcc,0xd7,0x08,0xfe,0x5d,0xee,0xf9,0x94,0xa2,0x83,0x81,0x8a,0xfd,0x0f,0x9a +.byte 0xa7,0xe4,0x59,0xad,0xe6,0x1f,0xed,0x5d,0xe4,0x20,0xd6,0x2f,0xa7,0xd3,0xcf,0x5b,0x18,0x6d,0x24,0x79,0x66,0xd9,0xaa,0x44,0xfa,0x8d,0x74,0x60,0xcc,0x7e,0xbf,0x4f,0x0e,0xe3,0x9c,0xa5,0xe4,0xff,0x14,0x05,0xff,0x24,0x62,0x94,0x00,0x7a,0x58,0xe5,0x0b,0x3b,0xe8,0xee,0xe1,0x4d,0x4e,0x34,0x26,0xba,0x70,0x10,0x5e,0x14,0x4f,0xa5 +.byte 0x7a,0x9e,0x7b,0x28,0x99,0xbe,0x94,0x4a,0xcb,0x8d,0x65,0x60,0xa0,0x6e,0xc7,0xbc,0x51,0xba,0xb5,0x07,0x97,0x25,0x42,0xb7,0x2c,0x0e,0x9b,0xfc,0xfb,0x35,0x6f,0x74,0x10,0xce,0x25,0xdb,0xa9,0x7c,0x11,0x61,0x43,0xf9,0x19,0xbf,0xe2,0x21,0xa3,0x57,0x3c,0x41,0x0a,0x15,0x4e,0x7f,0x6b,0x38,0xb6,0x73,0x41,0xa2,0x4e,0x8e,0xb9,0x44 +.byte 0xee,0x2a,0x2e,0x0a,0x9e,0x85,0xf1,0x6e,0x93,0x72,0x42,0x50,0x55,0xe1,0xc6,0x18,0x11,0x92,0xf7,0xbf,0x05,0xd8,0xb6,0xbc,0x2b,0xd5,0xe0,0xd3,0x9b,0x64,0xc4,0xdd,0xb0,0xb3,0x46,0xd8,0xfb,0x73,0xea,0xed,0x06,0x96,0x16,0x9e,0xf6,0xc6,0xe8,0xbe,0xae,0x00,0x2f,0x5a,0xf4,0x1f,0xb5,0x28,0x7c,0x75,0x76,0x68,0x74,0xa2,0x57,0x0e +.byte 0x6c,0xfa,0x2d,0xbe,0x34,0xf1,0xc9,0x2b,0x83,0x58,0xe7,0x2a,0x87,0xdb,0x47,0xae,0xc7,0xc2,0x78,0x50,0xed,0x20,0xdf,0x30,0x38,0xdd,0x84,0xa9,0x6b,0x00,0xb1,0x7b,0xbb,0x69,0xd3,0xbe,0xed,0x3d,0x99,0x6e,0x39,0x42,0x75,0x8a,0x6c,0x7c,0xa5,0xcf,0xc9,0xcf,0x11,0x14,0xb3,0xaf,0x72,0x00,0x3b,0x58,0xdd,0x2a,0xe1,0x44,0xa7,0x51 +.byte 0x15,0x05,0x1b,0x18,0x49,0x07,0x90,0x4c,0xbc,0x99,0x88,0x64,0xf6,0x14,0x0b,0x99,0xc0,0x84,0xc9,0x06,0x32,0xf0,0xec,0x19,0x8d,0x4a,0xb8,0xdb,0x32,0xb4,0x5e,0xc9,0x0c,0x24,0xf0,0xad,0xdc,0xf4,0x32,0x3b,0xf6,0x68,0x28,0x4a,0xa5,0x5b,0xb7,0xd5,0x00,0x35,0xf8,0x56,0x03,0xa3,0x86,0xa0,0x8a,0x1b,0x53,0xb5,0x58,0x73,0x8c,0xf9 +.byte 0x2b,0xd8,0xcb,0x88,0xe7,0x7e,0x79,0x68,0x13,0x5d,0x7d,0x23,0xc4,0xec,0x9c,0xf4,0x95,0x97,0xbf,0xb2,0xd9,0xdf,0x38,0xe8,0xa2,0x79,0xf7,0xe8,0x36,0x80,0x59,0x3f,0x58,0x2f,0xf7,0xf9,0x32,0x73,0xdd,0xd6,0x9e,0x20,0x1a,0x29,0xab,0xc1,0x77,0x14,0x71,0x3c,0xde,0x90,0xe9,0xea,0xdb,0x78,0x14,0xa3,0x89,0x43,0xf1,0x42,0x43,0x3f +.byte 0xe7,0x67,0x32,0x3d,0x65,0xdc,0xa4,0x79,0x8f,0x81,0xa5,0xb0,0x94,0x0f,0x96,0xf5,0x82,0xcc,0x47,0xc1,0x29,0x39,0x70,0x7a,0xf3,0x49,0xf5,0x09,0x43,0x50,0x56,0xd6,0xea,0xc4,0x35,0xa5,0xa2,0x8a,0xbe,0xc0,0xe3,0xfe,0x4c,0xa2,0x83,0x09,0xab,0x72,0x8a,0x96,0x7c,0x01,0x70,0xb2,0xd5,0x62,0xb7,0x67,0x59,0x36,0xcf,0x56,0x2d,0x14 +.byte 0xc2,0x69,0x49,0x52,0x4e,0x7c,0x45,0x4b,0xef,0xcd,0x79,0xcd,0xe6,0xa6,0xd0,0xbe,0x10,0x1e,0x18,0xca,0xe7,0x8d,0x65,0xb1,0x17,0xc7,0x2c,0xc8,0x2a,0x5b,0xe8,0x08,0x11,0x15,0xea,0xa9,0x43,0x7b,0x70,0x04,0x0c,0xc8,0xca,0x67,0x18,0x18,0x12,0x16,0xc2,0xd3,0xf2,0x0a,0xc7,0x01,0xa9,0x97,0x61,0xf6,0xa7,0x44,0x9a,0xb3,0x67,0xdc +.byte 0x07,0x63,0x02,0x02,0x2e,0x58,0x80,0xa9,0x95,0xa0,0x8e,0x86,0xb6,0xf6,0x14,0x13,0x0a,0xea,0xf1,0x6d,0xd9,0x98,0x37,0x12,0xdb,0x67,0x1b,0x13,0x8e,0xd1,0xfa,0x2f,0x98,0x53,0x3c,0xd7,0x56,0x55,0x42,0x2f,0x64,0x59,0xd5,0xb7,0x6e,0xa8,0x6c,0xc2,0x40,0x11,0xb5,0xa1,0xc0,0x5c,0x45,0x87,0x91,0xb1,0x1c,0x4e,0xa9,0xf6,0x72,0x57 +.byte 0x50,0x8e,0xc5,0xfc,0x64,0x59,0x52,0x82,0xb0,0x75,0xc3,0x98,0xff,0x32,0xce,0xa4,0x39,0xb8,0xa4,0x61,0xb4,0x53,0x3f,0xc7,0x80,0x35,0x48,0xaf,0xa8,0x67,0xfe,0xa1,0x1d,0x3c,0x95,0xb5,0x63,0x1c,0x3a,0x2c,0x68,0xfa,0x98,0x8b,0xa7,0x19,0x29,0x79,0xe4,0x9b,0xff,0x8f,0x15,0x9c,0x65,0x60,0xd2,0xa9,0x4f,0xd5,0xb2,0x57,0xff,0x32 +.byte 0x4c,0x96,0x82,0x6b,0x09,0x6c,0x74,0x55,0x00,0x5c,0x68,0x68,0xd5,0x9b,0xd4,0xdf,0x3d,0x2d,0xb9,0x0b,0xf5,0x2c,0x87,0x35,0x2a,0xc0,0xc0,0xc9,0xd7,0xa1,0x76,0x30,0x82,0x46,0xd8,0x24,0x6e,0x27,0x02,0x71,0x57,0x5c,0x43,0xf2,0x54,0xd6,0xea,0xd7,0x67,0x7d,0xac,0x76,0x91,0xf1,0x26,0x6e,0xaf,0x87,0x05,0x06,0x48,0x57,0xbd,0x67 +.byte 0x1d,0xd7,0x07,0xcd,0x41,0x02,0x49,0x6c,0x8c,0xe1,0xe3,0x00,0x78,0xbe,0x28,0x84,0x16,0x44,0xb1,0x0d,0x6d,0x40,0xfe,0xab,0x7e,0xf6,0x6b,0xff,0xfa,0xe1,0xc7,0x9d,0x56,0x62,0xf1,0x68,0xba,0x76,0x34,0x8f,0x54,0x20,0x49,0xf5,0xa2,0x54,0x52,0xca,0x42,0xed,0x4f,0x9b,0xdf,0xcf,0xfb,0xf6,0xee,0x12,0x29,0x43,0x8f,0xf9,0xfd,0xf4 +.byte 0x8a,0xbf,0xae,0x50,0xf2,0x8f,0x46,0xa2,0x97,0x3b,0x2d,0xfb,0x84,0x98,0x61,0xae,0xba,0x36,0x25,0x30,0x8b,0xdc,0xd3,0x08,0x8e,0x7e,0xfa,0x91,0xac,0x4b,0x29,0x6d,0x0c,0x81,0x0f,0xc7,0xc8,0xc4,0x5c,0x48,0x68,0xa7,0x83,0xf3,0x6a,0xc8,0x0d,0x3a,0x9b,0x46,0xb9,0xe1,0x31,0xac,0x3c,0x12,0xa2,0xae,0x74,0xb8,0x91,0xed,0x63,0xba +.byte 0x40,0xb8,0x57,0x58,0x1f,0x1d,0x1a,0x2d,0x98,0x60,0xe8,0xe1,0x84,0x16,0xe5,0xf0,0x1e,0x35,0x58,0x31,0xc3,0x0c,0x49,0x6e,0x13,0x2c,0xac,0x14,0xc2,0xde,0x5f,0x62,0xe5,0x37,0x5b,0x1d,0x71,0x8b,0xc3,0x3d,0xd8,0xaf,0x3d,0x0a,0xef,0x80,0x3c,0x9a,0x4b,0x0a,0x3f,0x0e,0x8f,0x90,0x8f,0x73,0x2e,0xff,0x8e,0x8e,0x87,0xf8,0x46,0x52 +.byte 0xed,0x7d,0x76,0xf3,0xff,0xaf,0x5e,0x62,0x87,0x16,0x9c,0xa6,0x12,0x39,0x13,0xc3,0x62,0x4b,0xd2,0x21,0xa2,0x43,0xfa,0x4c,0x5d,0x75,0x61,0x64,0x5b,0x23,0xcd,0x76,0x86,0x81,0xd6,0xa6,0x25,0xe1,0xc1,0xc6,0x04,0x5e,0x65,0xfe,0x89,0x0e,0x67,0x02,0xeb,0xb9,0x26,0x88,0x81,0x97,0x1e,0x62,0x4e,0xf4,0x4e,0x0d,0xef,0xac,0xcf,0xd7 +.byte 0xc5,0x9b,0x9d,0x3a,0xa2,0x71,0xd7,0xd4,0x72,0xa6,0x66,0x90,0xe2,0xf7,0xb7,0xec,0xe4,0xca,0x9f,0xd1,0xd8,0x5a,0x65,0xff,0x39,0x65,0x78,0x47,0x1c,0x64,0xab,0x1a,0x35,0x2e,0xe2,0xf7,0x67,0xa4,0x7f,0xd5,0xea,0x04,0xee,0x4d,0xf6,0x29,0xe4,0xcd,0x1b,0xcf,0x0a,0xef,0xa1,0x14,0x90,0x0e,0xed,0x1a,0x10,0x63,0xa0,0x56,0x11,0x05 +.byte 0x57,0x94,0x3a,0x11,0xff,0xe0,0xc7,0x33,0x19,0x67,0xd7,0xd0,0xcc,0x76,0x52,0x5d,0x9e,0x10,0xe7,0xd6,0xaa,0x13,0xe8,0x8d,0xa5,0x60,0x66,0x98,0x26,0x11,0x66,0x0f,0x2d,0x4d,0xec,0x28,0x93,0x17,0x3a,0x6f,0x99,0x70,0x00,0x2b,0x66,0xb3,0x49,0x69,0x3c,0x3b,0x03,0xb8,0xc0,0x9b,0x1c,0x96,0xd9,0xd1,0xe1,0x6d,0x8f,0x45,0xce,0x22 +.byte 0xcf,0x48,0x61,0x85,0x10,0x1b,0x3f,0x2b,0x74,0x48,0x61,0x68,0x63,0xe3,0xa3,0x83,0xe2,0xcc,0xa0,0x6d,0x82,0x8b,0xe5,0x42,0xab,0xa7,0x62,0x6c,0x05,0xb4,0x7b,0x65,0xf5,0xd8,0x0b,0x7d,0x61,0xd6,0x5c,0xf0,0xc0,0x03,0x0c,0x51,0xec,0x06,0xad,0x79,0x8c,0x62,0x0c,0xf5,0x8e,0xcb,0x97,0x62,0xf9,0x3e,0x39,0x8d,0x3c,0x2e,0xd1,0xc0 +.byte 0x5f,0x98,0xea,0xb5,0x26,0x19,0xf5,0x93,0xbb,0xf8,0xd4,0xd5,0x35,0xee,0x1f,0xf8,0x71,0x81,0x0e,0xe6,0xe9,0xf3,0x2c,0x80,0xa8,0x15,0x35,0x1e,0xda,0x07,0x41,0x39,0x8a,0x19,0x1f,0x70,0x99,0xbe,0x3d,0x5c,0x1f,0xf6,0x72,0x85,0x73,0xea,0xb5,0x61,0xbb,0x77,0xaa,0xef,0xc7,0x2c,0xed,0x1e,0xa6,0xfd,0xc9,0xde,0xa9,0x82,0xba,0x19 +.byte 0x04,0x17,0xf7,0xa1,0x59,0x5c,0x7d,0x8d,0xe7,0x1c,0x89,0x7f,0xe1,0x02,0xd3,0xb0,0x46,0x6c,0xcf,0xde,0xf0,0x0b,0x00,0x43,0x8d,0xd6,0xe6,0xf7,0xc8,0x83,0x20,0x77,0x8b,0x9f,0x14,0xea,0x2b,0xb2,0xd2,0x41,0xfd,0x96,0x7c,0x0d,0x05,0xb9,0x5a,0xa0,0x83,0x50,0xde,0x0e,0xc6,0xa6,0x29,0x55,0x12,0x8e,0x2f,0x0a,0x5c,0xcd,0xae,0x92 +.byte 0x76,0x84,0xc9,0x8a,0x81,0xe5,0x3e,0xf0,0xe6,0x5b,0xe4,0x21,0xfb,0x4c,0xb6,0x0a,0x7b,0x7f,0x7e,0xab,0xdc,0x15,0x44,0xf8,0xeb,0x23,0x21,0x31,0xef,0x98,0xec,0x84,0x69,0x34,0x29,0x99,0x03,0x8a,0x12,0x8e,0x28,0xdd,0x00,0x6a,0xa3,0xe7,0x08,0x17,0x35,0x2a,0x42,0x8a,0xcb,0x4a,0x7b,0x1c,0xd2,0x74,0x4f,0x6a,0x8c,0x85,0x1c,0xd6 +.byte 0x05,0x3a,0xfd,0xdf,0x1c,0xa5,0x59,0xbb,0xdb,0xe3,0xa7,0x59,0xb1,0x67,0x3d,0xa4,0x71,0x4d,0x6c,0x99,0xe0,0xa7,0x8c,0xfa,0x96,0x1f,0x8d,0x0c,0xa7,0xc8,0xce,0xa3,0xbf,0x4d,0xc7,0xa9,0xb7,0xfd,0x04,0x58,0xcd,0xd7,0x20,0xb1,0xb9,0xf5,0x06,0x70,0x1b,0xdd,0xf4,0x1c,0xdc,0x32,0xa0,0x90,0x0d,0xb2,0x91,0x14,0x05,0xa2,0xf7,0xb7 +.byte 0xb6,0xd2,0xf1,0x30,0x75,0xcc,0x78,0x0d,0x56,0x70,0x64,0x02,0xe7,0x83,0x97,0x65,0x63,0x4b,0x64,0xff,0x8b,0x62,0xc9,0xa4,0x6e,0x96,0xbf,0xd3,0xeb,0x74,0xc5,0x1f,0xdb,0x1c,0xf3,0xca,0x54,0x7d,0x8d,0xd9,0xec,0x18,0xd8,0x99,0xd1,0xa5,0x70,0x8a,0xc5,0xdc,0xa0,0xcb,0xb7,0x52,0xe3,0xe6,0x88,0x0c,0x5a,0x42,0xde,0xe6,0xd8,0xc4 +.byte 0x39,0xe5,0x6c,0x0b,0xd4,0xa5,0x9b,0x51,0xa2,0x3d,0xc5,0xc7,0x17,0x17,0xb8,0xd8,0x09,0xad,0xeb,0x67,0x47,0xe0,0x88,0xef,0x1d,0x22,0x18,0x25,0xdc,0x32,0xb2,0xf7,0x47,0xc5,0xb3,0x0b,0x57,0x01,0x67,0xac,0xc3,0x9e,0xb0,0xa8,0xd7,0xce,0xb2,0xcd,0xea,0x3b,0x61,0xbb,0x24,0xad,0x91,0x7b,0xa2,0x9a,0xb3,0x63,0x56,0xe2,0x9d,0x69 +.byte 0x9e,0xd7,0x5f,0x5f,0x47,0x9f,0xae,0xf6,0x09,0xb1,0x9e,0x22,0x35,0xaa,0x55,0x0b,0xfc,0x70,0x96,0xfd,0x53,0x8a,0x37,0xaf,0x2d,0xa2,0xc5,0x49,0x5b,0x1e,0x32,0x47,0x9d,0xc3,0xb4,0x46,0xf3,0x54,0xdb,0x3f,0xb9,0x69,0x9e,0x8b,0xad,0x11,0xb2,0x68,0xe8,0x27,0x0d,0xca,0x33,0x1c,0x86,0xb2,0x2c,0xaa,0xc2,0x15,0xf9,0x6e,0xed,0x30 +.byte 0x71,0x08,0xeb,0x93,0x1d,0x16,0xc5,0x34,0x73,0x65,0x7a,0x19,0x2b,0xa7,0x3d,0xe6,0x88,0xb5,0x0f,0xa0,0x92,0x91,0x22,0x9d,0x01,0xf3,0xf4,0x57,0x9f,0xd9,0x23,0x1b,0xbd,0xd7,0xd5,0x11,0xc9,0x24,0xf6,0x36,0x30,0x30,0x69,0x95,0x17,0x48,0xf9,0x76,0x71,0xef,0xef,0xc0,0x00,0x9c,0x7d,0x87,0xdc,0xdc,0x1a,0x32,0x82,0x7a,0x13,0xc2 +.byte 0x9f,0x53,0xc2,0x7d,0x4d,0xbf,0xbe,0xf5,0x9d,0xc8,0x81,0x5b,0x81,0xe9,0x38,0xb6,0xa5,0x40,0xa5,0xd4,0x6f,0x0c,0xea,0xf1,0x52,0x59,0x37,0x3b,0xc2,0xb2,0x5f,0x10,0xdf,0x22,0xf7,0x77,0xe8,0x66,0xb0,0x97,0x91,0x5f,0xc2,0x18,0x8d,0x17,0x40,0xd1,0x6d,0xde,0x6e,0xf0,0x6c,0x1f,0x4e,0x9b,0x15,0x83,0x9b,0x70,0x21,0x2b,0x98,0x46 +.byte 0xbf,0xa5,0x82,0xac,0x63,0xac,0xd7,0x52,0xec,0x2c,0xf2,0xe4,0xe0,0x2a,0xbf,0x7e,0xa2,0xd2,0x9d,0x0d,0xf2,0x9b,0x79,0x5f,0x22,0xb0,0x6d,0x22,0x2e,0xed,0xe2,0x4f,0x73,0xc5,0x89,0xcc,0x4a,0xaa,0x9a,0x7e,0xab,0x95,0x25,0xa7,0x9d,0xf4,0xc2,0xe8,0x42,0x6e,0xd3,0xf9,0x25,0x54,0xb9,0x1f,0xa9,0x16,0x9c,0x22,0x7a,0xf0,0xa6,0xac +.byte 0x8b,0x9d,0xe6,0xe3,0x93,0x4e,0x65,0x3a,0x39,0x3e,0xf5,0x41,0x38,0x02,0xb7,0x37,0xd4,0xdc,0xea,0xc5,0x53,0x0e,0x52,0x85,0x96,0xc0,0xa7,0x21,0xbf,0xe7,0xca,0x12,0x1c,0x59,0x33,0xe4,0xd5,0x70,0x6b,0x25,0x54,0x24,0x58,0x48,0x1b,0x65,0x6e,0x7e,0xe6,0x84,0x39,0x38,0xbc,0xdf,0x96,0xbc,0x39,0xdf,0x8f,0x36,0x9e,0x3a,0xda,0x02 +.byte 0x86,0xe2,0x9f,0xb7,0x3a,0xd0,0xdb,0xc2,0x5d,0xb0,0xde,0x31,0x73,0x43,0xe5,0x4b,0x6a,0xa1,0x6d,0xaa,0xca,0x34,0xfa,0xa9,0xaf,0xec,0x05,0x2a,0xdb,0x82,0xa1,0xdc,0xdc,0x3d,0xb5,0x92,0x42,0x28,0xdc,0x93,0xec,0xab,0x9b,0x75,0xae,0x7c,0xbf,0x9b,0x25,0x01,0xb1,0xc8,0x3b,0x47,0xb6,0xfd,0x11,0x6f,0x4b,0xaa,0x6f,0xdf,0x1f,0x15 +.byte 0xc2,0xf3,0x87,0x4a,0xaf,0xf7,0x41,0x64,0x5a,0x19,0xa0,0xc4,0x4f,0x58,0xe8,0x19,0xe0,0x84,0x44,0xc7,0x65,0x0c,0xf1,0xff,0xcb,0x73,0xb2,0xac,0x25,0x28,0xe1,0xd4,0x03,0x16,0x3c,0x1c,0x24,0x3a,0xfc,0x2b,0x7e,0xcb,0xa3,0xba,0xb7,0x78,0x87,0xbe,0x95,0x06,0x27,0xb8,0x16,0x72,0xe4,0x24,0xa6,0x5d,0xe7,0x5e,0x93,0xa9,0x96,0xfd +.byte 0x01,0x1d,0xb8,0x7c,0x85,0x3c,0xe3,0xc9,0x56,0x68,0xcd,0xd9,0x79,0x97,0x50,0x39,0xfe,0x96,0x93,0x50,0xae,0xde,0xcd,0x8d,0xa0,0x38,0x31,0xba,0xca,0x21,0xff,0x19,0xea,0x44,0x95,0x4d,0xba,0xae,0xe2,0x62,0xd2,0x82,0x60,0x0c,0xb9,0x10,0x40,0x9a,0xaf,0x9b,0x17,0xcd,0xf3,0x26,0xec,0x38,0x13,0x18,0xd3,0xf2,0xd2,0x11,0xa6,0xc3 +.byte 0x3c,0x3b,0xe8,0xa0,0x49,0xba,0x4e,0x07,0xec,0x44,0x75,0x1c,0xc9,0x2f,0x68,0x64,0x02,0x1d,0x14,0x35,0x80,0xd8,0xa8,0x53,0xde,0x44,0x65,0x72,0x37,0x28,0x61,0x5f,0xa1,0x58,0xea,0x17,0xb3,0x89,0x25,0xf7,0xcb,0x87,0xe6,0x43,0xc5,0xc3,0xf3,0xd1,0xf5,0x1f,0x18,0xe9,0xd1,0x05,0xd9,0x85,0x38,0xf0,0x5e,0x26,0x35,0xf2,0x72,0x92 +.byte 0x34,0x2f,0xea,0xdd,0x7b,0x64,0xac,0x1d,0x78,0x41,0x56,0x83,0x7d,0x83,0x83,0x59,0xbe,0x9f,0x81,0x90,0x00,0x1f,0x04,0xd8,0xd8,0x8e,0xd9,0xeb,0x12,0x16,0x96,0x81,0x61,0x96,0xe8,0x7b,0x36,0x7b,0x26,0x9b,0x43,0x1e,0x0e,0xc2,0x59,0xdf,0x8f,0xb4,0x91,0x74,0x2e,0x1e,0x6d,0x20,0x70,0xe7,0x3c,0x39,0xe3,0xa8,0x62,0x66,0x32,0x63 +.byte 0x7d,0x89,0xb6,0xad,0x69,0x38,0x2c,0x21,0xe5,0x02,0xcc,0x93,0x8a,0x65,0x71,0x65,0x02,0x5c,0xeb,0xc9,0x70,0xf3,0x81,0xce,0x65,0x37,0x22,0xb7,0x47,0x3c,0xd6,0x3d,0x29,0x65,0x29,0xba,0xf9,0xae,0xd9,0x1f,0xd7,0x38,0x88,0x95,0xa9,0x66,0xa8,0x77,0x75,0x4a,0xf9,0x2e,0xd9,0x63,0x75,0x80,0x90,0x82,0x39,0x8b,0x21,0x58,0xf4,0x2e +.byte 0x2d,0x1f,0x7f,0xcb,0x33,0xdb,0x9b,0x9b,0x31,0x21,0x4e,0x6e,0xdb,0x0f,0x1f,0x69,0x22,0x97,0x69,0xd7,0x7f,0x2e,0xd7,0xce,0x6c,0xe4,0xc0,0xe7,0x27,0x82,0xe6,0x8a,0xf8,0xae,0x46,0x2d,0x5a,0x45,0x82,0xce,0xb6,0x49,0x84,0x15,0x4a,0x54,0xa6,0x76,0xf3,0x29,0x28,0xc0,0x05,0x82,0xae,0x7d,0x85,0x41,0xb0,0x87,0x67,0x44,0x37,0x46 +.byte 0x3e,0x47,0xbc,0x00,0x7c,0x05,0xd3,0xdc,0x9a,0x31,0x49,0xf8,0x48,0x99,0x57,0x4a,0x2b,0xe7,0xcf,0xb2,0xa7,0xf0,0xcf,0xc7,0xf5,0xfd,0x73,0x59,0xf1,0xe4,0x86,0xb5,0x5d,0xce,0x6d,0xbf,0xc6,0xe5,0xa9,0xca,0x75,0xe9,0x69,0xe6,0x09,0xab,0x66,0x17,0x09,0xe9,0xbc,0x14,0xd8,0x6f,0xe9,0xc2,0x87,0x39,0x2f,0x87,0x1e,0xb8,0x16,0x08 +.byte 0x10,0xee,0x1c,0x2f,0x47,0x7d,0xa3,0x5b,0x1f,0x1f,0x5d,0x95,0xd0,0xa4,0xbb,0x08,0xc2,0x47,0xab,0x46,0x3c,0xbb,0xbe,0x3a,0x64,0x82,0x40,0x08,0x75,0x03,0x02,0x6e,0x6a,0xab,0x6b,0xd4,0x90,0xa7,0x28,0x7a,0xb4,0x8b,0x1f,0x6b,0xcc,0x16,0x30,0x16,0xf5,0xc6,0xd8,0x4a,0xed,0xc9,0xc7,0xac,0x0f,0x75,0x1b,0x13,0xe3,0x45,0x6d,0x22 +.byte 0x7e,0x3d,0x59,0x55,0x87,0x8d,0x04,0xee,0x85,0xac,0x98,0x0c,0x52,0x5b,0xe6,0x92,0x04,0x31,0xdf,0x7c,0x44,0x4d,0x06,0xbe,0xb2,0x5a,0x95,0xef,0x29,0x75,0x9b,0xb2,0xe7,0xb8,0x83,0x18,0x82,0x23,0x4e,0x66,0xe5,0xdd,0x47,0xa1,0x6b,0x33,0x4e,0x9c,0x13,0x0e,0x0a,0x8a,0x5c,0xba,0x7b,0x2f,0x6c,0x72,0x78,0x86,0xd2,0xf8,0xbd,0x1b +.byte 0x4b,0x9e,0xe0,0x99,0x46,0x7f,0x24,0x0f,0x1b,0xda,0x85,0x87,0xe9,0xda,0x96,0x25,0xc6,0x81,0x77,0x8b,0x56,0xae,0x7a,0x9c,0x47,0x34,0xe1,0xac,0xf2,0xba,0x52,0x95,0xf8,0x56,0x26,0x66,0xf0,0x53,0xcc,0xc4,0x6f,0x46,0x94,0x10,0x22,0x69,0xb1,0x93,0x7b,0x51,0xb7,0xb8,0xdd,0x42,0x67,0x51,0x6d,0x9c,0xb2,0xbd,0xdb,0xdd,0x19,0xa2 +.byte 0x25,0x13,0xfe,0x42,0xca,0x36,0xeb,0xce,0x15,0x41,0xe7,0x35,0xce,0xa8,0x45,0x56,0x58,0x9f,0x46,0xcf,0x11,0xe7,0xcc,0x40,0x54,0xe4,0x85,0x0d,0x73,0x36,0x7e,0xae,0x38,0x8c,0x56,0xab,0xf0,0x5f,0x5c,0xff,0x14,0x9b,0x46,0x1b,0x35,0xbd,0x03,0x0e,0x2f,0x9e,0xde,0xd8,0x82,0xfe,0xa0,0x09,0xb4,0xb4,0xbd,0x58,0xc0,0xe2,0x01,0xb1 +.byte 0xca,0x5c,0x3d,0xc3,0x18,0x5e,0xc1,0xee,0x61,0x60,0x00,0xca,0x1e,0xf3,0x71,0xd8,0x15,0x37,0xf0,0x2e,0x13,0xa0,0xf7,0xac,0x73,0x4b,0xfb,0x6a,0x27,0x6b,0xde,0x69,0x3d,0x19,0x36,0x4b,0x63,0x55,0xae,0xd1,0x2b,0x66,0x69,0x0d,0x64,0xa7,0x86,0xfd,0x3a,0xb8,0xe6,0x87,0xaa,0x32,0x5f,0xbc,0xa7,0x67,0xde,0x7a,0xe0,0xdd,0xff,0x57 +.byte 0x2c,0xc9,0x25,0x92,0x03,0x91,0xa8,0x0e,0x39,0xe4,0x9a,0xdf,0x21,0x29,0xc7,0xbc,0x93,0x01,0x2a,0x02,0xd8,0xaf,0xbc,0x20,0x57,0xc7,0x37,0x77,0xa7,0xad,0x5e,0x15,0x20,0xcf,0x4a,0x3c,0x22,0x1b,0x92,0xa9,0x05,0x91,0x70,0xb3,0x88,0x4e,0x97,0x58,0xf7,0x33,0x1a,0x05,0x33,0x57,0xdc,0xbb,0x2a,0xba,0xd0,0x22,0xac,0x40,0xbe,0x60 +.byte 0xa2,0x89,0xe6,0x6c,0xf3,0x5d,0xef,0x58,0xb4,0x7c,0x4a,0x28,0xb8,0x16,0xd2,0xe0,0x49,0xf5,0xe8,0xaf,0x84,0x39,0xae,0x1e,0xa2,0x34,0x67,0x42,0x26,0x31,0x93,0x87,0x7a,0xd5,0xde,0x79,0xdb,0x4c,0x7e,0xcf,0x1f,0xef,0x9a,0x4c,0xb9,0x70,0xe2,0x72,0x9b,0xcd,0x30,0xe5,0xf1,0x84,0x44,0x5a,0xff,0x36,0xa2,0x37,0xe7,0x49,0x78,0x63 +.byte 0xbe,0xe0,0x90,0xdf,0xef,0x9e,0xf3,0x55,0x9e,0x8a,0x51,0xe8,0xa3,0x32,0x2d,0xed,0xc8,0x99,0xf6,0x92,0xf9,0x62,0x74,0xa7,0x8d,0xcf,0xa5,0x09,0xb3,0x43,0xb9,0x18,0x70,0x59,0x4f,0xd2,0x7f,0x7e,0xce,0x1e,0x7d,0xe8,0xa9,0xb7,0x29,0x0f,0x86,0x8a,0xac,0x22,0x41,0x98,0xb2,0xc3,0x48,0x3b,0x60,0xcb,0x7b,0x1d,0xc3,0x5e,0x19,0x5b +.byte 0x31,0x57,0x12,0x09,0x41,0x54,0xf8,0x01,0x70,0x02,0x03,0x8a,0x6e,0x8e,0x5b,0x23,0xf3,0xd4,0x13,0xbf,0x51,0xba,0xf9,0x2d,0x6c,0xb9,0xb3,0x90,0xd0,0xa3,0x76,0xfb,0xef,0x85,0x17,0x8b,0x2c,0x05,0xa3,0x06,0x0a,0xaa,0xdd,0xbf,0xd4,0xcc,0xe4,0x96,0x19,0x7f,0x51,0xf6,0x7e,0xa1,0x2c,0x14,0x1c,0x21,0x99,0x28,0x3a,0x0e,0x36,0x1b +.byte 0xf1,0xd7,0x3e,0x29,0x94,0xa6,0x03,0xf7,0xe5,0x6f,0x1b,0x56,0xc8,0xfb,0x2d,0x4f,0x12,0x2b,0xc7,0x3a,0xec,0x5e,0xc8,0x88,0x1b,0xd8,0x65,0x21,0x04,0x0e,0xe2,0x95,0x6d,0x62,0xea,0xeb,0xee,0xbe,0x47,0x0a,0x90,0x26,0xe3,0x85,0xd7,0x1d,0xb5,0xd5,0x56,0x8b,0xc0,0x2f,0x7f,0x01,0xc8,0xac,0x90,0xc3,0x2d,0x10,0xf2,0x11,0x30,0x0c +.byte 0xa9,0x4d,0x13,0xde,0x65,0x6d,0x34,0x68,0x5d,0xad,0x3f,0x7a,0x56,0x3a,0x1f,0xb9,0xd6,0x7b,0x8f,0xe8,0x42,0x2a,0x16,0xb6,0x3f,0xf2,0x4f,0x14,0x8e,0x8e,0x29,0x88,0x68,0x1b,0x10,0x80,0x80,0x47,0x36,0xaa,0x82,0xf5,0xa8,0x97,0xc4,0xcb,0xc2,0xef,0xaa,0x9f,0xdc,0x96,0x4f,0x1f,0xaf,0x39,0x71,0x55,0x8f,0x3c,0xbf,0x26,0x91,0x46 +.byte 0x38,0x59,0xa7,0xd1,0xb5,0x87,0xd6,0x81,0x71,0x17,0x83,0x05,0x40,0x9c,0xf3,0x33,0x4b,0x09,0x06,0xb1,0x69,0xfb,0x43,0x1f,0xef,0x9a,0xfe,0xc3,0x4e,0x4e,0x25,0xe1,0x3a,0xfb,0xf9,0xc9,0x97,0xe2,0x1c,0xa1,0x9a,0x06,0x6e,0xbb,0x16,0x4a,0x9f,0xf4,0x87,0x31,0x38,0x78,0xae,0x77,0x4c,0x42,0x28,0xc4,0x63,0xc0,0x49,0x37,0x4f,0xf9 +.byte 0xeb,0x31,0x0d,0x3e,0x0c,0x8a,0xb7,0x17,0xa7,0x90,0x26,0xc2,0xea,0xa5,0x9d,0xe4,0x4d,0xc6,0x3a,0x33,0x2d,0x47,0x42,0x8c,0xeb,0x50,0xea,0xfe,0x74,0x43,0x06,0xcd,0xa5,0xb1,0x49,0xf0,0x98,0x91,0x25,0xf4,0x8d,0x06,0xd1,0xeb,0x56,0x2c,0xf9,0xc4,0x84,0x02,0x9e,0xf2,0x3a,0xfe,0xb4,0x39,0xce,0xee,0x85,0xb6,0x64,0x6c,0xbc,0x1f +.byte 0xe6,0x86,0x00,0xc3,0xa9,0xb4,0x53,0xdf,0x2d,0x7c,0xc6,0xde,0x2e,0x79,0x25,0x5c,0xbb,0xe5,0xbe,0x33,0xe9,0x58,0x49,0x35,0xbe,0xae,0xbc,0x06,0xdc,0x48,0x9d,0xc3,0x08,0x6f,0xe8,0xb8,0x48,0x67,0xea,0x1c,0x05,0xb4,0xf7,0xe3,0xcc,0xc1,0xb3,0xa8,0x61,0xcb,0xa8,0xf6,0x12,0x52,0x68,0x06,0x36,0x2b,0x15,0x43,0xc9,0x98,0xfe,0xe5 +.byte 0x43,0x11,0x0d,0xc3,0x37,0x38,0x7a,0xcb,0x98,0x14,0xc1,0xaf,0x29,0x36,0x35,0x63,0x74,0x98,0xcf,0x0f,0x44,0xe4,0x6e,0xf7,0x3f,0x6e,0x15,0xe8,0xe9,0x93,0x7b,0x96,0x1b,0x84,0xe7,0x8b,0x83,0x30,0xa1,0xdc,0xc3,0xb8,0x18,0x2f,0xc5,0x34,0xd1,0xa5,0xb9,0xee,0x4a,0x04,0xbf,0x26,0x63,0x29,0xba,0x90,0xb5,0x7c,0x83,0x2b,0x1f,0xe8 +.byte 0x5c,0x9f,0x23,0x40,0x7f,0x9c,0x2f,0x76,0x96,0xd6,0xd5,0x13,0xda,0x5c,0x81,0xa4,0x60,0x60,0xbd,0x5e,0xb3,0xd2,0x2c,0xaa,0x48,0x04,0x74,0x31,0x5d,0xbd,0x46,0xd8,0x8d,0x3f,0x62,0x2d,0x1e,0x17,0x97,0x08,0x71,0x06,0x1b,0x96,0x1b,0xd5,0x80,0xa6,0x41,0x06,0x10,0x6e,0x36,0xd4,0xfb,0x36,0x6d,0x96,0xb8,0x86,0x22,0x34,0xda,0x7e +.byte 0x6c,0x5f,0x3b,0x95,0x35,0x1b,0x42,0x3c,0xf2,0x9d,0xe3,0xe9,0x3f,0x44,0xd5,0x4c,0x60,0x55,0xae,0xbe,0x4f,0xf2,0xb3,0x84,0xa1,0x79,0xdf,0x86,0xf0,0x8f,0xad,0xa5,0xa3,0x4a,0xea,0x5d,0x68,0x34,0x17,0x4c,0xb7,0xd8,0x6f,0x67,0x22,0x85,0xe2,0x16,0xcf,0xba,0xee,0x92,0xeb,0x95,0x8e,0x67,0xb1,0xf0,0xbb,0xb0,0x34,0x2f,0x58,0x49 +.byte 0x56,0x3e,0x81,0x31,0xb6,0xc3,0x2c,0xee,0x2b,0x85,0x72,0xbc,0xe9,0x20,0xaa,0x4e,0x34,0xb9,0x8b,0x32,0x2f,0x9e,0xd7,0x98,0x63,0x9d,0xfd,0x3a,0xe9,0x30,0x49,0x23,0x4a,0xb4,0xcb,0xc5,0xe5,0x78,0xcd,0x22,0x90,0xce,0x9f,0x35,0x13,0xda,0x8f,0x14,0xdb,0x36,0x0f,0x66,0x87,0x62,0x50,0xde,0x52,0x15,0x10,0x67,0x8a,0x5c,0xdb,0x76 +.byte 0x51,0x7f,0x72,0x9b,0x8e,0x91,0x39,0xc8,0x3c,0x34,0x0f,0x3d,0x92,0x07,0xb8,0xef,0x2a,0x8b,0x59,0xbd,0x82,0xc1,0x5c,0x95,0x93,0x0d,0x3d,0x9b,0x51,0x53,0x38,0x6b,0xd0,0xe3,0x5b,0xbb,0xe5,0x6c,0xc0,0xb5,0x71,0xa8,0xd8,0x7d,0x5d,0xbd,0xfc,0x69,0xcf,0xcc,0xa1,0xcd,0x83,0x9d,0x8f,0x46,0x47,0xe7,0x36,0x19,0x9f,0x4d,0xda,0x9c +.byte 0xcb,0x2a,0x47,0x58,0x93,0xbb,0x64,0xa3,0x89,0x53,0xbf,0xc7,0xc2,0xe2,0x65,0x0f,0x4f,0x17,0xc6,0x4c,0x15,0xfe,0x4b,0x95,0xb2,0x79,0x4a,0xb8,0xf6,0xae,0xcc,0xba,0xc3,0x5d,0x18,0xb2,0x8e,0xd8,0x6b,0x43,0x1b,0x2f,0xe1,0x36,0xb2,0xa5,0x22,0xa0,0xc7,0xc0,0x26,0x8e,0x48,0x77,0x0c,0x14,0xdd,0xdc,0xde,0x71,0x98,0xce,0xdd,0x61 +.byte 0x85,0xd9,0x23,0x42,0x7f,0x85,0xc8,0x06,0x81,0x3e,0xa2,0x0f,0x1e,0x3e,0xcf,0x33,0xef,0x43,0x6a,0xc7,0xee,0x3f,0x91,0x68,0x32,0x89,0xd9,0xed,0xdf,0x45,0x33,0x10,0xbb,0xd5,0xef,0x1d,0x3c,0x1e,0x26,0x21,0x4d,0x1a,0x06,0x98,0x60,0x71,0x7f,0xce,0x45,0x4e,0xe3,0x3f,0xfa,0xff,0xcd,0xe2,0x92,0x82,0x2e,0x83,0x69,0x9c,0xc6,0x5c +.byte 0x6e,0xb6,0xec,0x28,0xdc,0x7b,0xdb,0xf3,0x02,0x3a,0xf7,0xad,0x9b,0x7a,0x73,0xb2,0x07,0x70,0x76,0x9d,0xa2,0x11,0xcf,0x89,0xea,0xaf,0x6a,0xd2,0x15,0xeb,0x5a,0x99,0x1a,0x17,0x1d,0xce,0xc0,0x7f,0x50,0x26,0x84,0x07,0xd7,0x7e,0x33,0x27,0x74,0x84,0x18,0x32,0x86,0x32,0x34,0x28,0xe8,0x45,0x21,0xb7,0x26,0x3b,0x11,0xbb,0x9a,0x8b +.byte 0x46,0x8e,0x27,0xf8,0x62,0xb5,0x98,0x6e,0x03,0xee,0x9e,0xcb,0xbc,0x74,0xbe,0x63,0x7a,0x86,0xe5,0x75,0xeb,0x7f,0x14,0xa6,0x96,0x76,0x5a,0x46,0xa9,0xda,0xf1,0x4e,0x0e,0x90,0x59,0x56,0x4a,0x48,0x2d,0x91,0xbe,0x78,0x5b,0xfb,0xf7,0xea,0xab,0x1c,0xc0,0x0c,0x5d,0xba,0xb4,0x7b,0xc7,0x21,0xb1,0xc9,0xa3,0x20,0xe6,0xae,0xee,0x0e +.byte 0xf0,0x3b,0x44,0xd6,0xaa,0x57,0x88,0x1f,0x76,0xc8,0x43,0x07,0x91,0x71,0xa5,0xcc,0x04,0x38,0x01,0x13,0xa6,0xea,0x18,0x48,0x8f,0x09,0x8d,0x37,0x8b,0x6f,0x35,0x36,0x51,0xc6,0x30,0xca,0x9e,0xe2,0xaf,0x0c,0x26,0x14,0xe3,0xbf,0xea,0x0e,0x14,0x88,0x97,0xcc,0xf6,0xc1,0x8f,0xad,0xef,0x2d,0xc1,0x0f,0xad,0x45,0x12,0x7a,0xe6,0x37 +.byte 0x97,0xcb,0x34,0x83,0xd8,0xef,0x34,0x2a,0xce,0xd0,0x21,0x8a,0x7d,0x87,0x7a,0x66,0xf7,0x1c,0xdf,0xa0,0x3f,0xa0,0xf6,0xb3,0x24,0xee,0x6e,0x21,0xe9,0xc3,0x73,0xe4,0xd9,0xc6,0xf6,0xf6,0xac,0x25,0xb7,0xb5,0x64,0x7f,0xcc,0x88,0x3e,0x98,0xe1,0xef,0xa9,0xd2,0x03,0x10,0x4b,0xa3,0xbc,0x3c,0x24,0xfc,0x41,0x36,0x30,0x2d,0xca,0x17 +.byte 0x35,0xd6,0x17,0xa2,0x2b,0x48,0xed,0xd3,0xd7,0x18,0x4f,0x45,0xe9,0x59,0x03,0x35,0xa0,0x80,0x75,0x17,0x48,0xd5,0xea,0x07,0x7a,0x6c,0x3f,0x7a,0x2c,0x02,0x0a,0x7f,0xb5,0x17,0xea,0xf4,0xf6,0xb5,0xf4,0x81,0xba,0x69,0x44,0x81,0x6b,0xff,0xb2,0x43,0xae,0x3d,0x37,0x81,0x91,0x3f,0x6a,0x70,0x35,0x2d,0x06,0x9d,0xa8,0xb5,0xb8,0xc7 +.byte 0x19,0x3a,0x5f,0x59,0x79,0x0b,0x62,0x23,0xa4,0x5b,0x46,0x7b,0x17,0x82,0x19,0x87,0xe8,0xdf,0x09,0xb7,0x50,0x7e,0x40,0xe3,0x71,0x2d,0x09,0xde,0x69,0x2e,0x6c,0x35,0x5c,0x44,0xae,0xb7,0x05,0xb8,0x7e,0xb4,0xe4,0x34,0x05,0x1f,0xd2,0x1f,0xe5,0x79,0x2a,0x15,0xf8,0x8f,0x02,0xc7,0xc8,0x1e,0xe6,0x12,0x83,0x08,0x9c,0x7a,0x2f,0xc6 +.byte 0xc9,0x15,0x0f,0x0f,0x0f,0xa9,0x53,0x16,0x19,0x5b,0x74,0x58,0x6c,0xac,0x21,0x72,0x7f,0xa1,0xae,0xbc,0x34,0x76,0xa6,0x9b,0xbe,0x0f,0x13,0x55,0x50,0x5a,0x8b,0x9e,0xb3,0xf3,0x9e,0x8b,0x61,0xbe,0xb4,0x09,0x71,0x61,0xf0,0xd6,0xaa,0x8c,0x0d,0x0c,0x66,0x31,0x88,0xe3,0x71,0x6a,0xb5,0xaa,0xc0,0x9b,0xce,0x0d,0x79,0x90,0xc1,0x0a +.byte 0xf9,0xfe,0x4d,0x49,0xd0,0x5a,0x63,0xf1,0xfc,0x47,0x71,0x9e,0xbb,0xd1,0x2c,0xef,0xfe,0x90,0x28,0x75,0x82,0xf6,0xa5,0x95,0xea,0x65,0xfa,0xe8,0x04,0xcd,0xb4,0xe1,0x0d,0xb2,0xac,0xd5,0x12,0xf5,0x17,0xbb,0x3b,0x2e,0x52,0x9e,0x7b,0xe7,0x8e,0x86,0x03,0xce,0x77,0x01,0xf0,0x4f,0xb5,0xf7,0xef,0x8b,0x37,0x5e,0x97,0x80,0xbb,0x2b +.byte 0xcf,0x9a,0x63,0x18,0xc5,0x0c,0xfb,0x3c,0x91,0x9c,0x37,0x90,0x76,0x71,0x62,0xbc,0x80,0x40,0x1a,0x74,0xb8,0x1b,0x61,0xb1,0x89,0x4d,0xf7,0x8d,0xd4,0x46,0xef,0x1f,0x3b,0xac,0xe8,0x41,0x62,0x8e,0xea,0x2b,0x56,0x22,0x25,0x37,0x70,0x53,0xcd,0x8f,0x57,0xfa,0xad,0x00,0xc5,0x0c,0x9e,0x57,0xde,0x50,0x07,0x8d,0x80,0xbf,0x22,0x5d +.byte 0x4a,0xbd,0x6a,0xcb,0xfc,0x6f,0xd1,0x56,0x8f,0xd5,0x34,0x8a,0xe6,0xe9,0xa0,0x00,0x06,0x12,0xd8,0xb1,0x49,0x0a,0xbb,0x87,0xe5,0xca,0x75,0x11,0x4c,0x85,0x60,0x77,0xc0,0x90,0x1c,0x14,0x38,0x38,0x3e,0x4f,0xff,0xbf,0xfc,0xa1,0xa1,0xe7,0xb0,0x5d,0xd8,0x1f,0x33,0x07,0x5f,0x04,0x4f,0xc7,0x93,0xc6,0xcc,0xe3,0x01,0xd0,0x43,0xe1 +.byte 0xd9,0x00,0xc5,0x9f,0x79,0xab,0xfc,0xe9,0x55,0x51,0x03,0x0c,0xe1,0x73,0xd6,0x09,0xe3,0xb9,0x76,0x72,0x77,0x4c,0x1b,0x7c,0x57,0x1e,0x7f,0x5f,0x02,0x83,0xa3,0xc6,0xde,0x23,0x85,0x76,0x1a,0xbf,0x48,0xc8,0x02,0xdb,0x31,0x30,0x95,0x85,0x68,0x8a,0xf6,0xe9,0x48,0x7f,0xc9,0x26,0xab,0x68,0x36,0x9f,0x1c,0xf0,0x90,0xbc,0x4a,0x68 +.byte 0x94,0xf8,0x7f,0xae,0xa9,0x3b,0x5b,0x63,0x9a,0xcd,0xe3,0xf0,0xac,0x9f,0x6f,0x78,0xa0,0x67,0x58,0xd8,0x2c,0x71,0x8a,0x14,0x31,0x07,0x95,0x0c,0x38,0xa4,0x53,0x33,0x60,0x23,0x21,0x87,0x6b,0x4f,0xf9,0xa8,0xb8,0xfc,0x8e,0xf1,0x3a,0x03,0x0b,0x03,0x02,0x33,0xbc,0x6a,0xb9,0x8e,0x41,0xc8,0x38,0xd8,0x83,0x30,0x6a,0x61,0x5c,0xcf +.byte 0x49,0xdd,0xd7,0xda,0x2c,0xaf,0xc4,0x68,0xad,0x07,0x9c,0xd4,0xaf,0x94,0x64,0xcf,0xe1,0x9b,0x37,0x50,0x65,0x03,0x20,0x3c,0x34,0x43,0xe9,0xb0,0x9b,0xba,0xb1,0x9a,0x3e,0x10,0x99,0x8f,0x93,0xb7,0x3d,0xac,0xbd,0xab,0xa8,0xfa,0x74,0x90,0xe1,0x38,0xe4,0xf3,0x47,0xfc,0xad,0x8b,0xb4,0x98,0xe4,0x65,0xe9,0xd9,0x8a,0x21,0x81,0x4f +.byte 0x0c,0xd7,0xb1,0x84,0xb9,0x69,0x68,0x64,0xa3,0x1f,0x25,0x84,0x5f,0xf7,0x3f,0xca,0x52,0xff,0xda,0xc9,0x3d,0x5e,0x8b,0x57,0xd3,0x9a,0x1d,0xb7,0xae,0x90,0xa4,0xc3,0x78,0x68,0xfd,0x80,0x3f,0xfd,0x5c,0x09,0x83,0x5d,0xc2,0x48,0xd8,0x84,0xeb,0x8a,0xfe,0xbe,0x30,0x12,0x79,0x54,0x5f,0x7f,0x6e,0x4b,0x8a,0x1e,0xcb,0xcd,0xed,0xb6 +.byte 0xe9,0x6d,0x8a,0x1f,0xdc,0xb1,0x46,0xab,0xdc,0x0d,0xbf,0xda,0xd9,0x39,0x3b,0xd2,0x81,0x00,0x83,0x77,0x32,0xf7,0xdf,0x0e,0x31,0x5d,0x1d,0x6c,0xa7,0x4e,0x54,0xa8,0xac,0x81,0x8c,0xb6,0xa5,0x89,0x02,0xd7,0x2e,0xfd,0x26,0xa3,0x9e,0xcf,0xdb,0x1f,0x5a,0xf3,0x54,0xac,0xe5,0xd0,0x1f,0x9b,0xa7,0xab,0x28,0xcc,0x66,0xd3,0xbc,0x4c +.byte 0x54,0x1a,0x54,0x73,0x78,0xde,0x08,0xd5,0xa5,0x08,0xdc,0x00,0x09,0xc5,0x37,0x61,0x1a,0x98,0x12,0x84,0x2d,0xff,0xc3,0x25,0x62,0x93,0x83,0x05,0x66,0x3d,0xfb,0x1d,0x54,0x08,0x8a,0x50,0x03,0xc4,0xc4,0x6e,0xfa,0x16,0x83,0xbb,0x27,0xf1,0xb7,0x31,0x92,0x64,0x76,0xbc,0xf0,0x44,0x62,0xe9,0x5e,0x15,0x94,0xdc,0xe9,0xf3,0xf8,0x20 +.byte 0x93,0x4d,0x11,0xa2,0xc8,0xde,0x83,0xe6,0x75,0x63,0xfe,0x13,0x75,0x0f,0x79,0xd1,0x3d,0x75,0xb7,0x43,0x62,0x57,0x8d,0x96,0x9c,0xa3,0xc4,0xb2,0x84,0x6a,0x14,0x6e,0x17,0x32,0x09,0x76,0x95,0xbb,0xd6,0xc1,0x2e,0xdc,0x8c,0x73,0xd7,0xad,0x5a,0x41,0x8b,0xb3,0x7e,0x8d,0x90,0xec,0xf5,0xa0,0x46,0x90,0x4c,0x52,0xec,0x97,0xc6,0x98 +.byte 0x7d,0x19,0x77,0xa0,0x99,0x85,0x11,0x26,0x77,0x26,0xf9,0xac,0xe3,0x81,0xcf,0x7d,0x22,0xc8,0x00,0x3d,0x5b,0xee,0xa5,0xf8,0x6d,0xfe,0x47,0xe4,0xef,0x60,0xcc,0xd0,0x33,0xf7,0x5b,0xed,0xbd,0x82,0xc9,0xa8,0x41,0xb8,0x47,0x34,0x9f,0x62,0xb2,0x67,0x62,0xb0,0x3a,0x27,0x95,0xe1,0x22,0x76,0x98,0x0f,0x35,0xaf,0xfc,0x4d,0xc7,0x92 +.byte 0x92,0x7e,0xaf,0x3b,0x3a,0x36,0x5e,0x5c,0xbf,0x43,0x02,0x66,0x5a,0x30,0x78,0x82,0x52,0x20,0x98,0xd6,0xa1,0xe9,0x9a,0x61,0x54,0x0b,0x74,0x85,0xb5,0x99,0x69,0x9f,0x9b,0x3b,0x2f,0x49,0xec,0xb3,0x18,0x0c,0x4a,0x53,0x20,0xd7,0x80,0x7b,0xd4,0x20,0x21,0x32,0x89,0x08,0x81,0x50,0x2b,0x16,0x8d,0xbb,0xe6,0xbb,0xc7,0x74,0x80,0x67 +.byte 0x47,0xf1,0x06,0x68,0x02,0x37,0x31,0x00,0x50,0x8b,0xe2,0x44,0x85,0x2e,0x39,0x54,0xda,0x26,0x7b,0xe1,0xb0,0x23,0xd7,0x0c,0x3c,0x3b,0x81,0x9b,0xa6,0xbe,0x24,0xfd,0x09,0x73,0xbe,0xc3,0x2f,0xa0,0x7b,0x85,0x5b,0x1b,0x55,0x4e,0x9e,0x38,0x80,0x61,0xd7,0xe8,0x9b,0xec,0x88,0x00,0x6a,0x64,0x1b,0xd5,0x65,0x20,0x2a,0x62,0x64,0xbc +.byte 0x21,0xca,0xce,0xc3,0xeb,0x2d,0x2b,0x5c,0x4d,0xb8,0x7c,0xb5,0xbe,0x98,0x0d,0x5b,0x88,0x23,0x60,0xff,0xbe,0x0a,0xb6,0xdd,0xdf,0x28,0xd5,0x2c,0xe5,0x9d,0xb5,0x29,0xea,0x6c,0x3a,0xf4,0x78,0x91,0xa3,0xb2,0xab,0x12,0xf9,0x90,0x96,0xc9,0xa4,0xfc,0x4d,0x28,0x2b,0x0c,0x28,0x8b,0xb7,0x8b,0x36,0xd6,0x80,0xbf,0x07,0x09,0xf9,0x62 +.byte 0x32,0xc0,0x50,0x60,0xd9,0x73,0xe3,0xbe,0xfa,0xa6,0x78,0x48,0x47,0xd7,0xb5,0x39,0xd8,0x04,0x6d,0x79,0x98,0x2e,0xd6,0x3a,0xe5,0xc9,0x01,0xd0,0x00,0x2e,0xd2,0x8b,0xd7,0x1f,0xf1,0xba,0xd4,0x0e,0x9f,0x9d,0xab,0xbf,0x2c,0xe1,0x75,0xf6,0x9c,0xc0,0xae,0x73,0x2b,0x58,0xcb,0x6d,0x46,0x6d,0x11,0xb7,0xce,0xc7,0xef,0x34,0x2c,0x11 +.byte 0x93,0x3c,0x17,0xd9,0x3e,0xad,0xc9,0x4c,0xb3,0xd0,0x0a,0xd0,0xfe,0xf3,0x9d,0xc5,0x43,0x03,0xa9,0x78,0x4a,0x42,0x7f,0xfb,0x75,0xd2,0x85,0xfb,0xe7,0xe6,0xa9,0x48,0x2f,0xa6,0xc3,0x16,0xe2,0x2a,0x9d,0x0d,0xcb,0x2e,0x8b,0x75,0xa8,0x14,0x3a,0x2e,0xb1,0xff,0x58,0x1d,0xa8,0xa6,0xc0,0xf6,0x17,0xda,0xc1,0xce,0xaf,0x08,0xa9,0xc2 +.byte 0xa3,0xc1,0xab,0xb6,0xe8,0x10,0x57,0x8a,0xce,0xc0,0x03,0x5c,0x53,0x5c,0x02,0x5d,0xcf,0x5c,0x65,0xc6,0x47,0x3c,0x62,0x0e,0xa3,0xfc,0xe2,0xae,0x10,0x55,0x4a,0xb4,0x27,0xe8,0x59,0x5e,0x45,0xa9,0xbb,0x21,0x10,0x91,0x46,0x1f,0x50,0x3b,0xc6,0x8c,0xa1,0x8a,0xee,0x5e,0x6e,0x32,0xe6,0x42,0x40,0x79,0x7f,0xbb,0xb3,0x5b,0x05,0xde +.byte 0xe0,0xf6,0x7f,0x3d,0x37,0xe6,0xc3,0x3b,0x40,0xc9,0xe0,0x42,0x36,0xd0,0x0e,0x13,0x32,0x3e,0x48,0xce,0xd8,0xa2,0xef,0xae,0x93,0x66,0x7d,0xde,0xb9,0xdd,0x60,0x15,0x53,0xf2,0xd9,0x90,0x3d,0x38,0x8c,0xa6,0x34,0x44,0xb5,0x6c,0x74,0x7d,0x9d,0xe7,0xd0,0xef,0x6c,0xd6,0xfe,0x9b,0x79,0x4e,0x79,0x5e,0x48,0xef,0x93,0xb2,0x81,0x0b +.byte 0x2b,0xee,0x83,0x69,0x3d,0x15,0x8c,0x27,0x69,0x6f,0xca,0xbf,0x75,0x29,0x37,0xc6,0xe6,0xca,0xb2,0x70,0xd0,0xaf,0xc8,0x5e,0x69,0xf1,0x6b,0x2d,0x0d,0xe7,0xe9,0xbf,0x07,0x52,0xe5,0xac,0x98,0xcf,0xcf,0xd6,0xdd,0x7c,0x2b,0xfc,0x8f,0xd2,0x5f,0x81,0x4b,0x1b,0x7b,0x2d,0x84,0xe2,0x69,0x96,0xcb,0xa2,0x59,0x10,0xba,0xda,0x51,0x11 +.byte 0xeb,0xc3,0x4f,0x10,0xbf,0x8e,0x5b,0xbb,0xa3,0x29,0xe9,0xd8,0x0e,0x71,0xa0,0x1b,0xff,0xee,0x36,0x8c,0x00,0x83,0x6b,0x32,0xfe,0x05,0xeb,0x89,0x8f,0xed,0x48,0x22,0xe1,0x76,0x0a,0xac,0xae,0x3c,0x24,0x54,0x84,0xc2,0x0f,0x79,0x33,0x2b,0x49,0x35,0x1c,0x84,0x5a,0xca,0x92,0x6c,0x1f,0x78,0x15,0x5a,0x36,0xad,0xd5,0x1d,0x9d,0x10 +.byte 0xc1,0x5f,0x7c,0x61,0x60,0xba,0x2e,0xe6,0x9b,0x34,0x02,0xe9,0x68,0x1c,0xfb,0xbf,0x02,0xdc,0x79,0x57,0x1c,0x0f,0xc8,0x8c,0x2a,0x66,0x2a,0x50,0xaa,0x81,0x4e,0x1f,0xa8,0x2d,0xe4,0x61,0xe8,0x43,0x84,0xcb,0xda,0x96,0xf9,0x4a,0xd0,0x8f,0xe1,0xd7,0xc4,0x05,0xf5,0x76,0xfa,0x47,0x7a,0x07,0x1a,0x77,0xbb,0x63,0xb3,0x3a,0x85,0x3b +.byte 0x0d,0x32,0x4f,0x14,0x15,0x02,0x5b,0x9c,0xbc,0xc2,0x12,0x90,0x0f,0x7b,0x94,0x27,0x5f,0x70,0x23,0xd8,0x5d,0x54,0xc4,0xca,0x6a,0x69,0x9e,0xd1,0xb3,0x2a,0x75,0x1a,0x07,0x9c,0x20,0xf6,0x76,0x22,0x4d,0x09,0x30,0x24,0x3f,0x3b,0xe5,0xcb,0x4b,0x5a,0x03,0x2d,0xe8,0xbe,0xed,0xf0,0xe3,0x91,0xf2,0x6c,0xb8,0x02,0x2d,0x6c,0x7a,0xa6 +.byte 0xc1,0x8e,0xa7,0xbb,0x73,0xdf,0x40,0xa5,0x60,0x91,0xbf,0xbe,0x28,0x0b,0x37,0x2e,0x5f,0x4b,0xcd,0x14,0x4d,0x2d,0xfc,0x5e,0x43,0xb5,0x78,0x8d,0xea,0xa0,0x86,0x54,0x4f,0xb6,0x25,0x40,0x39,0x3f,0x9c,0x7a,0x26,0x74,0x88,0x42,0x53,0xb0,0x3b,0x81,0x75,0x04,0x67,0x41,0x65,0x66,0x2c,0xdc,0xe9,0xf0,0xb3,0xab,0x2a,0xa5,0xf3,0xef +.byte 0xfa,0xc5,0x10,0x63,0xe2,0x70,0xb5,0x29,0x60,0x86,0x9e,0xb9,0x0b,0xe2,0xc4,0x05,0xa9,0x3c,0x1b,0x60,0x15,0x6b,0x2f,0x74,0x93,0x5e,0x70,0x9a,0x56,0x6a,0xc4,0x92,0x49,0xaa,0x95,0x51,0xc4,0xba,0xfd,0xf6,0x2d,0x36,0x3e,0x66,0xbd,0x74,0xbc,0x2e,0xb3,0xad,0xa1,0x41,0x50,0x33,0x79,0x84,0xac,0x21,0x7a,0xfc,0x3a,0x8e,0xdb,0xcc +.byte 0x27,0xf6,0x2c,0x5c,0x23,0x38,0x73,0xd5,0xaf,0xc9,0x2d,0x9c,0x18,0x58,0xdf,0x8f,0x89,0x9d,0xdd,0x00,0x3c,0x5f,0x23,0x00,0x6e,0x66,0x1d,0xf3,0x1c,0x40,0x9d,0x43,0xb0,0x74,0xf1,0x41,0xa5,0x77,0xcb,0x8d,0x5b,0x94,0x68,0x95,0xb6,0x0e,0xd4,0x4d,0x47,0x9b,0xd2,0xcd,0x9b,0x94,0xa4,0x28,0xf9,0xf0,0x3d,0xcf,0x89,0xb1,0xc3,0x73 +.byte 0x84,0x15,0xb6,0xc8,0x6b,0xf1,0xb1,0xdc,0x1b,0x1a,0x6f,0xb5,0x73,0x87,0x8b,0x63,0xbf,0x4b,0x25,0x9b,0xe4,0xdd,0x44,0xed,0xe7,0x0e,0x6f,0x03,0xae,0xa1,0x5e,0x1f,0x5f,0xa7,0xa4,0xed,0x69,0x7a,0x91,0x6d,0x55,0xac,0xce,0x18,0x32,0x17,0x78,0x49,0x9f,0x1e,0x9c,0xd2,0x7b,0x1f,0x74,0x60,0xa5,0x64,0xb1,0x99,0xe6,0xc5,0x0d,0x69 +.byte 0xfa,0xb2,0xd9,0x05,0x61,0x71,0xa4,0x6f,0xc2,0xb6,0x91,0x0e,0x6c,0xf2,0xa6,0x6c,0xea,0x8e,0x94,0x8b,0xac,0xa7,0xfe,0x70,0x8e,0x8d,0xc2,0x85,0xa6,0xa7,0x8e,0xe8,0xfa,0xbc,0xa1,0xaf,0x0e,0xa9,0x06,0xa4,0x9a,0xb0,0x23,0x93,0xbc,0x93,0x2d,0x97,0x42,0xe2,0x0d,0x3a,0x65,0xb4,0x60,0x5b,0xeb,0xa1,0x20,0x8a,0xdc,0x17,0x6b,0xc5 +.byte 0x19,0xc3,0x67,0xbf,0xae,0xf7,0xb9,0xb1,0x88,0x7f,0xe5,0x1b,0xc2,0x61,0x97,0xa0,0xd3,0x64,0x74,0x6b,0x7a,0x46,0x39,0x3f,0xc8,0xd3,0x53,0x79,0x74,0x4e,0x1e,0x63,0x91,0xc5,0x4a,0x70,0xb0,0x05,0x35,0x19,0xc2,0x26,0x54,0x44,0x3b,0xa9,0x12,0x40,0xd0,0x21,0x19,0xf3,0x8d,0xc7,0x2b,0x88,0x9a,0xec,0x41,0x8f,0x4f,0x23,0x19,0x1a +.byte 0xf3,0x1d,0x0a,0x88,0x0f,0xa7,0x02,0xd4,0x78,0x88,0xe6,0x43,0xb6,0x9e,0x07,0xdf,0x6a,0x1f,0x41,0xbb,0x3e,0xea,0x15,0xff,0x66,0x4c,0x7a,0x8b,0xee,0x27,0x47,0x81,0x81,0x95,0xa2,0x22,0xb4,0x9f,0x1c,0x09,0x1c,0xfc,0x0a,0xef,0x88,0x7f,0x59,0x60,0x91,0x6a,0xe4,0x92,0x8c,0x02,0x54,0xc9,0xee,0xc7,0x5e,0xd1,0xbf,0xc9,0x41,0xde +.byte 0x2f,0xa3,0x22,0x07,0x1d,0x8c,0xe1,0x04,0x59,0x94,0x75,0x3e,0xee,0x56,0x62,0x07,0x80,0x18,0x60,0x78,0x0e,0x55,0x06,0xec,0xe1,0xa5,0xf6,0x21,0x7e,0xf9,0x37,0xab,0x6a,0xed,0x07,0xcb,0xbf,0xa2,0xab,0x50,0xee,0x1f,0x2f,0x54,0x2b,0x82,0x93,0x59,0x03,0x35,0xd9,0xe8,0x2b,0xa6,0x03,0xc2,0xef,0x37,0x85,0xfc,0x89,0x06,0x30,0xe0 +.byte 0xc2,0x00,0xc4,0xaf,0x59,0xb6,0x31,0x52,0x37,0xa4,0x6c,0xdb,0x1b,0x20,0x87,0xf0,0xa4,0x15,0x4b,0xa8,0xd9,0x7e,0x1b,0x96,0x00,0x07,0xf4,0x86,0x07,0x14,0x55,0x70,0x37,0xe3,0xe3,0xf0,0xeb,0xd6,0xf1,0xe0,0xe9,0x6c,0xdf,0x3d,0xaf,0x86,0xb8,0x00,0x9b,0xdf,0xc6,0x5c,0xd2,0x53,0xcb,0xcf,0x63,0xcc,0x3e,0x6d,0x62,0xeb,0xe6,0x97 +.byte 0xd8,0x54,0xed,0x36,0xe4,0xed,0x69,0xaa,0x10,0x83,0xde,0x16,0xfd,0xcc,0xd6,0x24,0xb9,0x3c,0x4f,0x99,0x81,0xc2,0x23,0x16,0x91,0x5d,0x9f,0x46,0xa5,0xdd,0xb4,0x8a,0xe1,0x07,0x89,0x84,0x2e,0x62,0x48,0xf6,0x1a,0x17,0x7b,0xc8,0xf7,0xb4,0x3d,0x9e,0x82,0xe3,0xe3,0xcf,0x0b,0xd9,0x52,0x90,0x61,0xd8,0xdf,0x9e,0xc4,0xc7,0x7c,0xfa +.byte 0xcf,0x09,0xd2,0x94,0x86,0x37,0x94,0xaf,0x7e,0x0a,0x9d,0x16,0xee,0xad,0xfb,0xa2,0x9e,0x2d,0x2f,0xad,0xd5,0xc2,0xf9,0x91,0xf8,0x7e,0x2b,0xb8,0xb2,0x60,0x3c,0x0a,0x89,0x53,0x07,0x87,0x3b,0x83,0x70,0xee,0x71,0xa3,0x94,0x0b,0x77,0x50,0xeb,0xcc,0x23,0xf0,0xbe,0x95,0x51,0x54,0xd2,0xd6,0xd2,0x09,0xa5,0x19,0x3d,0x4e,0xec,0xe3 +.byte 0x88,0x71,0xa7,0xb1,0x10,0x03,0x7e,0xc4,0x92,0x2a,0xe7,0x99,0x75,0xff,0xae,0x10,0x3d,0xbb,0x33,0xc9,0x7f,0xc2,0xe6,0x3c,0xc4,0xe7,0xba,0x37,0xba,0x68,0x69,0x92,0x4a,0xfb,0x32,0x3b,0xb5,0xde,0xdb,0x91,0xd0,0x8e,0x77,0xf2,0x1e,0x2d,0x25,0xb4,0xa0,0x42,0xef,0x78,0x6c,0x75,0xcb,0xa0,0x73,0xdf,0xde,0xd8,0x26,0xfe,0xe3,0xf9 +.byte 0x74,0xe7,0xa0,0xd2,0xbd,0x6c,0x99,0x8d,0x07,0xf2,0xf8,0xff,0x36,0x2d,0x8e,0xda,0x5e,0x5c,0x47,0x06,0xf8,0x08,0x33,0x1d,0x93,0xcf,0xc3,0x1a,0x20,0x86,0xb6,0x8e,0x44,0x10,0xbc,0xba,0x89,0xfc,0xa3,0x57,0x92,0x2c,0x28,0xa1,0xd0,0xab,0xdc,0xba,0x0a,0x7e,0x9d,0xd2,0xfd,0x09,0xd3,0x87,0x6c,0x06,0x44,0x17,0x73,0xfe,0xc9,0x8b +.byte 0x52,0xd3,0x09,0x60,0x14,0x03,0xb1,0x79,0x4c,0x9c,0xc4,0xec,0x42,0x4c,0xd3,0x21,0xe5,0x34,0x21,0x38,0xdd,0x12,0x95,0xd4,0x20,0x50,0xef,0x5f,0x46,0x4f,0x37,0x65,0xd5,0xf1,0xb2,0x2c,0x6c,0x9a,0x06,0x28,0x77,0xbf,0xe3,0xec,0xec,0x2b,0xcb,0x2c,0x8b,0x62,0x2e,0x39,0xaa,0x28,0x0b,0x51,0x01,0xa5,0x02,0x06,0x66,0x4a,0x67,0x0c +.byte 0x96,0xa3,0x12,0x74,0x94,0x2c,0x0f,0x23,0xa3,0xea,0xda,0x1a,0x6d,0x54,0x30,0x33,0xc8,0x33,0x0a,0xfb,0x25,0x2a,0x8b,0x9a,0x87,0xd9,0x9d,0x37,0x4c,0x41,0x3b,0xe5,0x4a,0x81,0x92,0x40,0x38,0x18,0x82,0x13,0x54,0xde,0x56,0x11,0x63,0xf3,0x09,0x61,0x3b,0xdd,0x0c,0x71,0xe8,0x4f,0xc2,0x9a,0x77,0x2f,0xeb,0xf1,0x39,0x1c,0x10,0x0e +.byte 0x01,0xaf,0x92,0x34,0x9a,0xb6,0x7b,0x79,0x86,0x0c,0xf1,0x53,0xb6,0x59,0xbd,0x6d,0x79,0x6e,0x37,0x11,0x25,0x67,0x95,0x31,0x4f,0x43,0xdf,0xb7,0x4b,0x80,0x8d,0x07,0x3c,0x49,0x73,0x8a,0x72,0x61,0x02,0x0f,0x2f,0x13,0xed,0x91,0x10,0xf6,0x08,0xf3,0x50,0x4a,0xd4,0x36,0xcb,0x52,0xb3,0x3b,0xe6,0xef,0x85,0xe9,0xe0,0xad,0x0d,0x3d +.byte 0x84,0x07,0x70,0xdf,0x16,0x47,0xeb,0x26,0x19,0x27,0xaf,0x7a,0x9f,0x2f,0x2b,0x6d,0xbb,0x37,0x68,0x8e,0x19,0x46,0x5a,0x65,0x0d,0x0a,0x67,0xd8,0xe2,0xc2,0xcd,0x49,0xf6,0xc2,0x27,0xac,0x12,0xea,0x1f,0x81,0x60,0xac,0x8b,0x5d,0xcc,0x9a,0x5b,0xec,0xc3,0xcb,0x85,0x0d,0xef,0xa6,0xd5,0x33,0xb3,0x67,0x73,0x3f,0xc9,0x90,0x25,0x3e +.byte 0xe6,0x7c,0x41,0x59,0x83,0xf7,0x90,0x4a,0xbf,0x14,0x72,0x11,0xf2,0x3a,0x38,0x58,0x17,0xd8,0x3d,0x00,0xc6,0x42,0xf2,0xbc,0xfd,0x05,0x37,0x6d,0x11,0xb0,0xd7,0xb2,0xb7,0x73,0x69,0x80,0x47,0x30,0x64,0x13,0x8c,0x24,0xb2,0x42,0x12,0x8c,0xc0,0x8a,0x45,0x0b,0x71,0x23,0xeb,0xac,0x65,0xda,0x44,0x13,0x85,0x77,0xdf,0xb8,0x4b,0x69 +.byte 0xd4,0x8e,0x40,0x54,0x24,0xac,0xc8,0x62,0x36,0x51,0x20,0xaa,0xcd,0x5d,0xa5,0x73,0x2c,0x81,0x92,0x99,0x44,0x6b,0x04,0xac,0x8e,0xee,0x96,0x29,0xca,0xdc,0x2f,0xd1,0x13,0x5c,0x9e,0xc2,0x67,0x6a,0xaf,0xf6,0x3e,0xe2,0xa1,0x6d,0xda,0xbe,0x8a,0x55,0x50,0x27,0xee,0x6d,0xb8,0x35,0x5f,0xb4,0xa8,0x76,0xa1,0xe2,0x52,0x87,0xf6,0xfb +.byte 0xe2,0x16,0x1c,0x90,0x78,0xe4,0x17,0xb0,0xd9,0x56,0xf5,0xd3,0xa4,0xb0,0x3f,0xe9,0x01,0xf9,0xd0,0x67,0x2b,0xeb,0x1d,0x73,0x24,0x90,0x36,0x36,0x0d,0xcf,0xfb,0x3f,0xa1,0xa0,0x25,0x3b,0xf1,0x7f,0x9e,0x90,0xcf,0xb6,0xd0,0x83,0x90,0xcd,0x3f,0xff,0x5f,0xa3,0x33,0x95,0xd7,0xbe,0x78,0xfe,0xcc,0x9a,0xb9,0x64,0x88,0xb7,0xd9,0x5e +.byte 0x46,0x2d,0xf0,0xb1,0xa1,0x81,0x2b,0xab,0x80,0xf5,0x4d,0x3b,0xd8,0x53,0x64,0x8f,0xac,0x7a,0x03,0xb3,0x39,0x7a,0x85,0xef,0x61,0xb5,0x2c,0x8e,0xf4,0x27,0x07,0x9b,0x7b,0xc9,0x8b,0x1a,0xe4,0x4f,0xce,0x8b,0x35,0x32,0xac,0xcf,0x47,0xb8,0x2f,0x9e,0xe5,0x11,0x48,0xc1,0x07,0xea,0x0c,0xee,0x06,0xc6,0xa3,0x48,0xb6,0x1a,0xd8,0xb4 +.byte 0xa7,0xae,0x59,0x7d,0x9e,0x4e,0x66,0x7f,0xe9,0x02,0x40,0xdc,0x21,0x5e,0x74,0x2c,0x1d,0x29,0x22,0xca,0x97,0x4f,0xc8,0xc7,0xea,0x69,0x02,0x89,0xd1,0x43,0xff,0x83,0x89,0x58,0x66,0x92,0xbc,0x11,0xf6,0x02,0x8b,0xa8,0x34,0x8d,0xbe,0x3a,0x70,0xc3,0x10,0xe7,0xb5,0xc4,0xda,0xdb,0xc6,0x87,0xee,0xee,0xe0,0x48,0x62,0x80,0x8d,0xfc +.byte 0xaa,0xc7,0xce,0x1a,0xea,0xb9,0x1b,0x30,0x4a,0x48,0x9b,0xf4,0x58,0xff,0x5d,0x15,0xc8,0xf2,0x84,0x44,0xae,0x63,0xe8,0xb1,0xe0,0x2e,0x38,0x8e,0x47,0xf9,0x09,0xec,0xb9,0x94,0x18,0x37,0x68,0xef,0xbd,0xd5,0x67,0x72,0x01,0x9a,0x15,0xb9,0x7c,0x36,0xc0,0x22,0x80,0x12,0xb1,0x4e,0xab,0x3c,0xea,0x81,0xcf,0x70,0xf3,0xde,0x1f,0xd4 +.byte 0x67,0x94,0xfa,0xe1,0xf0,0xb6,0xd6,0x6b,0xc3,0xa2,0xbb,0x59,0x6b,0x9f,0x58,0x26,0x99,0x0c,0xdc,0xcd,0xb8,0xae,0x49,0xf0,0x8f,0xd3,0x0d,0xb7,0x4c,0x22,0xcf,0xb6,0x6c,0xa3,0x19,0x09,0x42,0x59,0x25,0xf8,0xdc,0xf3,0xc2,0x00,0xc3,0xc3,0xd3,0x9e,0x98,0xd3,0xa3,0xd0,0x96,0xfd,0x4f,0x15,0x57,0x5b,0xa7,0x08,0x3a,0x0e,0x3d,0xd2 +.byte 0x7d,0xa1,0xa0,0x94,0xc0,0x76,0x83,0xf6,0xc1,0xe8,0x7e,0xd3,0x97,0xc1,0xbf,0x38,0x74,0x9b,0xfb,0x35,0xeb,0xf7,0x34,0x20,0xea,0xda,0xd3,0xb1,0x2e,0x10,0x16,0x9c,0x09,0x1c,0x67,0x46,0xa2,0x05,0xf9,0x47,0xde,0x35,0x53,0x18,0x58,0xb0,0xbb,0x7a,0x88,0x58,0xc5,0x3e,0x98,0x29,0x43,0x98,0x07,0x76,0xa3,0xe1,0x95,0x92,0x21,0xe9 +.byte 0x06,0x17,0x15,0xe0,0x6b,0xd5,0x5a,0x6d,0x10,0xa6,0x08,0x92,0xa9,0xf5,0xcf,0x57,0x1a,0x28,0x5d,0x14,0x33,0x99,0xf9,0xa0,0xb3,0xeb,0xee,0xd4,0x6e,0x0b,0x5e,0xf7,0xe9,0xe3,0xc6,0x71,0x34,0x55,0xf3,0xde,0xd5,0xc2,0x52,0xc3,0x7b,0x06,0x87,0xef,0x26,0x81,0xc9,0xbd,0xaf,0x12,0x61,0x95,0x2b,0xa4,0x8e,0xe8,0x08,0x9a,0x13,0x48 +.byte 0x2e,0x84,0x98,0xf6,0x95,0x21,0x22,0xe5,0xcf,0x30,0x8d,0xaf,0x70,0x16,0x27,0x0c,0xcd,0x26,0x7f,0xe8,0xa0,0x35,0x0c,0x01,0x0e,0xdd,0x9d,0x2c,0x89,0x41,0x34,0xc4,0xa2,0xaa,0xf6,0x3f,0xca,0x3b,0x86,0xce,0xd7,0x4c,0xe3,0xb5,0x69,0xe9,0x41,0xbe,0x3c,0x9a,0x4c,0x1a,0xb3,0x88,0xea,0x78,0x12,0x4c,0x1b,0x79,0xc7,0xcd,0x32,0x72 +.byte 0xfa,0x3f,0x0b,0x73,0x1b,0xd9,0xec,0x85,0xd4,0x52,0x6c,0x91,0x2d,0xbe,0x76,0x8b,0xfd,0xb6,0x49,0xcf,0x67,0xd1,0x18,0x7b,0xae,0x86,0x47,0x47,0xfd,0xff,0x63,0xf2,0x88,0x1b,0x58,0xd5,0x30,0x69,0xf9,0x9a,0x03,0x52,0xae,0xe5,0xe2,0x55,0xbf,0x35,0x12,0xb0,0x84,0xa9,0xed,0xb6,0x8d,0x5f,0x6c,0xed,0x1a,0x00,0x7a,0xdc,0xf2,0x03 +.byte 0x9e,0xef,0x59,0x27,0x4c,0xf4,0x83,0xa2,0x36,0x3d,0x3d,0x8c,0x75,0x8c,0x37,0x68,0x93,0x0b,0x30,0x48,0xea,0x91,0x14,0x37,0x88,0x87,0x7f,0xe6,0xd8,0xbd,0x04,0x34,0x1e,0xe8,0x2a,0x41,0x48,0x5c,0x66,0xf9,0xc2,0xd1,0x56,0x25,0x29,0x45,0xfa,0x71,0xe1,0x59,0xa8,0x52,0x99,0x0b,0x92,0xe0,0x33,0x52,0x91,0xd6,0x5f,0x0a,0x70,0x83 +.byte 0x4f,0xa3,0x47,0x6e,0xfa,0x85,0x5e,0xb1,0x0a,0x1d,0xe7,0x35,0xc9,0x88,0x27,0xc9,0x8c,0x3e,0x7f,0x6d,0x34,0x1e,0x11,0x7b,0xcd,0xe7,0x09,0x82,0x3a,0xa1,0x46,0xc6,0x15,0xde,0x0b,0xde,0x35,0x71,0x92,0x5c,0x72,0x50,0x08,0x6b,0x62,0xa7,0xec,0xa2,0xca,0x53,0x6e,0x47,0x7d,0x50,0x32,0xa7,0x32,0x7b,0x49,0x0c,0x97,0xcc,0x98,0x8d +.byte 0xc3,0x29,0x72,0x1e,0x85,0x47,0x1b,0xa7,0x89,0x19,0x85,0xaa,0x3f,0x11,0x6a,0xea,0x61,0x84,0x07,0x9a,0xc8,0xb3,0x25,0xfe,0x72,0xca,0x83,0xa9,0xf0,0x9e,0x01,0xe4,0x9a,0xd6,0x1b,0x87,0xfc,0xd4,0x3a,0x04,0x34,0x8c,0x0b,0x46,0xbc,0xe9,0x3c,0x3f,0xd9,0x93,0xf1,0xca,0x41,0x0b,0xdb,0x28,0xe8,0x28,0x1b,0x84,0x36,0x16,0x84,0x22 +.byte 0x1e,0x1e,0x2b,0xb0,0xfb,0xa6,0xcc,0x95,0x31,0x46,0xd7,0xca,0xc2,0x8b,0xa3,0x3a,0xa5,0xb0,0xaf,0x52,0x66,0x53,0x39,0x5f,0x58,0xb5,0xdf,0x01,0x52,0x07,0xb4,0x82,0xdc,0xb7,0xf9,0x88,0xd8,0x77,0xf8,0x12,0x9d,0xe8,0x21,0xd7,0x0b,0x0f,0x57,0x90,0x40,0xb2,0x64,0x3f,0xce,0xa0,0xa3,0xfa,0x12,0x16,0xec,0x6d,0xcc,0xc7,0x2a,0x43 +.byte 0xc9,0xe7,0xb7,0x90,0x52,0x35,0x22,0x6d,0x46,0x99,0x1e,0x44,0x12,0xd6,0x0f,0xaf,0x5c,0x16,0xd3,0x7a,0xd6,0xb4,0xfe,0x20,0x26,0x11,0xe1,0xc6,0xa5,0x10,0xfd,0x9f,0x0c,0x47,0xae,0x32,0x08,0x15,0x8f,0xef,0xef,0x4c,0x83,0xbc,0xbf,0x6a,0xe5,0xf5,0x69,0x11,0x4d,0x7d,0x47,0x1f,0x10,0x58,0x61,0xb0,0x0d,0x98,0x67,0xc0,0x99,0x3a +.byte 0x2d,0x9a,0x5b,0xd5,0x37,0xe7,0xe5,0xd4,0x56,0x96,0x69,0xf8,0x53,0x7e,0x24,0x70,0x51,0x01,0x83,0x8d,0x49,0x01,0x32,0x7d,0x4f,0x41,0x92,0x54,0x9c,0x15,0xf1,0x3c,0x05,0x32,0x28,0x0d,0x0f,0x67,0xbe,0x65,0xfa,0x1b,0xa3,0xd0,0x28,0x18,0xb8,0x84,0xfe,0x6a,0x30,0xea,0xb9,0x00,0xb1,0x10,0x7c,0xa2,0x94,0x4f,0x86,0x18,0xdd,0xb4 +.byte 0x80,0x18,0x48,0x18,0xe1,0x56,0x70,0x7d,0x5c,0x3b,0xe5,0xd7,0x88,0x66,0x57,0xe3,0xe1,0x04,0x4c,0x68,0x5b,0x64,0x4d,0x0d,0x30,0x76,0x26,0xaa,0x84,0x0e,0xe0,0xed,0x53,0x62,0x20,0x33,0xaf,0x45,0x42,0x40,0x47,0x01,0x15,0xc9,0x0b,0x27,0x7c,0x68,0x4d,0x55,0xc4,0x6a,0x5f,0x96,0x9f,0x96,0x67,0xae,0x13,0x1c,0x84,0x52,0x33,0x41 +.byte 0x80,0xfc,0xae,0xb6,0xb1,0x8c,0xc3,0x19,0x80,0xa8,0x5f,0xe5,0x8c,0xd0,0xa8,0xb4,0x58,0xc9,0x48,0x29,0xab,0x11,0xd1,0x09,0xc6,0x20,0x98,0x4c,0xdb,0xa4,0x83,0x5c,0x26,0x51,0xce,0x80,0xe5,0xc4,0x9b,0xae,0xba,0x8e,0x99,0x4e,0xa4,0xff,0xdc,0x99,0x4c,0x02,0xa0,0x42,0x80,0xca,0xd7,0xea,0x6a,0x58,0x31,0xdb,0x16,0xd8,0x4d,0xab +.byte 0x03,0x2e,0x3a,0xdc,0xe9,0x07,0xfb,0xfb,0x5b,0x57,0x67,0x2a,0x7b,0xdc,0xc1,0x66,0xd1,0x31,0x3a,0x03,0x87,0xd8,0x66,0xda,0xa1,0x24,0x00,0x26,0xc0,0x26,0x78,0xf8,0x59,0x13,0x3f,0x34,0x08,0x35,0x45,0xbd,0x45,0x4f,0x89,0x65,0x97,0xdb,0xe6,0x1e,0x09,0x6e,0x23,0x2a,0xc4,0xf5,0x6a,0x74,0x28,0xb0,0xae,0x8c,0xfb,0x49,0x35,0x99 +.byte 0x06,0x30,0xc6,0xb2,0x8c,0xcd,0x8b,0x41,0xea,0xf2,0x04,0x18,0x29,0x25,0x1b,0x32,0x42,0x45,0xb5,0x92,0x42,0xb4,0x33,0xd2,0x90,0x31,0x08,0xcd,0x35,0x5d,0x50,0x64,0xa8,0x93,0xfd,0xa5,0xfd,0x32,0xbd,0xe8,0x13,0x1c,0x48,0x5c,0x14,0x70,0x03,0x92,0x0f,0x12,0x86,0xf6,0x6c,0xcd,0xc6,0xec,0xbf,0x8e,0x85,0x28,0x1d,0x1c,0x63,0x3f +.byte 0x81,0x93,0xd4,0x80,0x3c,0x29,0x0b,0x63,0xfe,0x87,0xa6,0x24,0xd6,0x3e,0x62,0xb6,0xd9,0xb0,0x58,0xf1,0x41,0x36,0xc7,0x47,0x8b,0xfd,0x4b,0x91,0x4e,0x5d,0x41,0x44,0xb0,0x65,0x3d,0x9e,0x3b,0x70,0x01,0xcc,0x7d,0x77,0xf0,0x23,0xd9,0xca,0x5f,0xda,0xa1,0x8c,0x71,0x11,0x91,0x7d,0x36,0xf5,0xc9,0xcd,0xf4,0x34,0x5f,0x69,0x57,0xd6 +.byte 0x33,0x4c,0xb2,0xe1,0x38,0x5f,0x86,0x3c,0x57,0x7b,0x2e,0x99,0x05,0x80,0x63,0xc4,0x77,0x69,0x06,0xc2,0x47,0x44,0xca,0x17,0x27,0x1d,0x55,0x34,0x02,0xd0,0x89,0x3a,0x3b,0x79,0xf0,0x86,0xd7,0x6b,0x01,0x9c,0xc7,0xa8,0xde,0xdb,0xdf,0x49,0xd1,0xb9,0x11,0xaf,0x7e,0x22,0x8b,0x5d,0xb5,0x0b,0xdc,0xd0,0x36,0xe6,0x9d,0x85,0x41,0x4a +.byte 0x35,0xf0,0xe1,0xcd,0xce,0x7b,0xd1,0xd6,0x00,0xdd,0xb6,0xe4,0x06,0x3e,0x66,0xe9,0x2b,0xa8,0x44,0x0d,0x18,0xd4,0xbc,0xfb,0x3c,0x58,0x6c,0x11,0xe9,0xdc,0x19,0x14,0x08,0x27,0x23,0x0c,0xd0,0xf9,0x97,0xaf,0x97,0x07,0x02,0x1a,0x5e,0xcd,0xae,0xd2,0x80,0x96,0x16,0x49,0xc3,0xfc,0xda,0x25,0x12,0x20,0xe1,0xc0,0x68,0x90,0x4b,0x30 +.byte 0x2d,0x06,0x53,0x2c,0x57,0x63,0x4a,0x7a,0xf6,0xc8,0x5a,0xb7,0x58,0x8c,0x13,0xfe,0x43,0xb3,0xf8,0x25,0x3e,0x7a,0x25,0x3e,0x1d,0x7f,0x8f,0x5e,0xdb,0xad,0x99,0x83,0xfc,0xd9,0x0a,0xdf,0xb5,0x19,0x1c,0x2c,0xf6,0xe8,0x06,0xbe,0xc0,0x9f,0x7e,0x0f,0x95,0xaa,0xac,0x09,0xdc,0x8c,0x37,0xcf,0x35,0x35,0x95,0x62,0xf1,0xff,0x96,0x1c +.byte 0x77,0xe9,0x53,0x7e,0x12,0x56,0x2d,0x4e,0x3e,0x1f,0xdb,0x1d,0x71,0x0e,0xdc,0xf7,0x65,0xb1,0x78,0x7f,0xe4,0xba,0xbf,0x7f,0x6c,0xcb,0x73,0xd3,0xe8,0xd9,0xce,0xfb,0xdb,0x48,0x87,0xe0,0x10,0x00,0x74,0xcb,0xdf,0x32,0xa8,0xdd,0x83,0x24,0x49,0xda,0x86,0x38,0x1c,0x2c,0x93,0x09,0x8a,0x26,0xbb,0x34,0x21,0x1d,0xac,0xb5,0x16,0xae +.byte 0xd8,0xcb,0x94,0x04,0xd6,0xbc,0xde,0x9c,0x70,0x28,0xa5,0x1a,0x15,0x5e,0x35,0xe4,0xe6,0x53,0xea,0x9c,0x3b,0x0c,0x36,0x3b,0x80,0x13,0x28,0x1d,0xc7,0x1a,0xa8,0x8e,0x9e,0x09,0xce,0x5d,0x50,0xd3,0xc7,0x6f,0x3a,0x75,0xa5,0x84,0x1c,0x08,0x66,0xe6,0x05,0xda,0x8b,0xf1,0x4b,0x5c,0xe2,0xc7,0x0f,0xa1,0xf1,0x47,0x02,0xf4,0xa7,0x24 +.byte 0xf3,0x0e,0x2c,0xa9,0xae,0x67,0xdf,0xce,0x30,0x88,0x4a,0x9a,0x39,0x4a,0x97,0x64,0xa8,0x30,0x53,0xf9,0x47,0x66,0x5c,0x19,0x1c,0xfb,0x2f,0x05,0x89,0x4f,0xfe,0x25,0xe7,0xed,0xed,0x17,0x5a,0x86,0xeb,0x25,0xee,0xe4,0x09,0x88,0x05,0x49,0x20,0x54,0x4b,0x7f,0x3e,0xb5,0x23,0x85,0xa9,0x66,0x61,0x73,0xe0,0x61,0x94,0xc6,0xe5,0x29 +.byte 0xb4,0xe1,0x6f,0xa4,0x4d,0x50,0x56,0x2e,0x30,0x75,0x51,0x5d,0xdd,0xa2,0x68,0x56,0x67,0xd8,0xec,0x2d,0x2a,0xfd,0x49,0xc5,0xbc,0xae,0x2f,0x6b,0xc7,0x8d,0x2e,0xca,0x91,0x35,0xe8,0xea,0x65,0xe9,0x9c,0x65,0xaf,0x8e,0xd5,0x16,0xdf,0xac,0x44,0x1e,0xb6,0x16,0xf0,0xb6,0x33,0x6a,0xe6,0x96,0x0f,0x85,0x2e,0xa1,0xaa,0x6a,0xe0,0x12 +.byte 0x0c,0xaa,0x7d,0xae,0xf7,0xe3,0xb2,0x4c,0x3c,0x10,0xc6,0x87,0x8e,0x87,0xfb,0xac,0xf7,0xd7,0x7a,0x2e,0x9a,0x7a,0xa7,0x4f,0xf0,0x75,0xce,0xbd,0xc3,0xe6,0x79,0x1d,0x56,0xab,0xff,0x56,0xfe,0x69,0xbd,0xcf,0x15,0x27,0x64,0x3c,0x83,0x1c,0x08,0xb0,0x91,0x60,0x67,0xe7,0x27,0x44,0x49,0x22,0x78,0xd5,0x1a,0xc8,0x3b,0x35,0x9b,0xa5 +.byte 0x53,0xce,0xde,0x04,0xd2,0x3e,0x67,0x48,0xaf,0x54,0xdf,0x9c,0xf7,0xb9,0xd4,0xe3,0xb6,0x85,0x02,0x68,0x21,0x10,0xdb,0xb5,0xca,0x11,0xa2,0x7c,0xcf,0x13,0x41,0x7a,0xfd,0xe9,0x0a,0x3c,0x53,0xd6,0x07,0xf2,0xdd,0xe2,0x7c,0x16,0xf0,0x44,0x3f,0x5d,0x34,0x09,0x7c,0x7b,0x21,0x8c,0x8e,0xdb,0x0d,0xc5,0x73,0xce,0x61,0xce,0x17,0x46 +.byte 0x6c,0x14,0x07,0xb5,0x70,0x80,0xf0,0x29,0x7c,0x13,0x41,0x2d,0x8e,0xdc,0x53,0xc2,0xbf,0xf0,0xc2,0xfb,0x59,0xa0,0x66,0x5f,0x25,0xda,0x17,0x5f,0xac,0xab,0x75,0x1b,0xc7,0x61,0x87,0x53,0x80,0x2e,0x11,0x4e,0x04,0x48,0xf9,0xee,0x54,0xe6,0x69,0x69,0x57,0xc2,0x46,0xd8,0xb3,0x2e,0x7b,0xc8,0xa5,0xd0,0xb2,0x5e,0xd4,0x6b,0x9b,0x1a +.byte 0xd6,0x79,0x9d,0x99,0xa6,0xbb,0x4d,0xca,0x74,0x2c,0x3d,0xd4,0x86,0xd0,0x64,0xd4,0x81,0x49,0x76,0x42,0xb8,0xf9,0x2c,0x52,0xe7,0x77,0x37,0x31,0xbb,0x2e,0x5b,0x38,0x81,0x01,0x2c,0x27,0x28,0xcb,0x0c,0xba,0xfa,0x8a,0x9a,0x45,0x51,0xa2,0xde,0xf2,0x7b,0xe6,0x65,0xec,0x5b,0x2d,0xe8,0x55,0x8e,0xb4,0x7f,0xf8,0x1a,0x66,0x3a,0x5f +.byte 0x06,0x10,0x15,0xb2,0x3d,0xb2,0x36,0x6e,0x9f,0x8e,0xe2,0x4c,0x78,0xe5,0x3a,0xac,0x21,0x16,0x20,0x30,0x0f,0x51,0x56,0xcb,0x53,0xca,0x70,0x3c,0xa2,0x3f,0x37,0x06,0x6c,0x70,0xec,0xf4,0x3d,0x7c,0x77,0xa0,0x61,0xc7,0x0e,0x26,0x9f,0x25,0xc0,0xf2,0x28,0xdb,0x57,0xbe,0xe6,0x4e,0x9c,0x4d,0x2e,0x48,0x50,0xc2,0xd4,0xfd,0x5e,0x52 +.byte 0x3f,0xd0,0x82,0xd1,0xd4,0x53,0xad,0x42,0x38,0xb1,0x02,0xd6,0xa0,0x34,0x7a,0xb4,0xb3,0xdd,0x91,0x12,0xf4,0x91,0xc9,0xa2,0x35,0x2d,0xdc,0x97,0xa1,0xdb,0x82,0xe7,0x92,0x99,0x66,0x13,0x99,0x20,0x95,0x1f,0x47,0x64,0x80,0x5e,0x5f,0x74,0x6b,0xa6,0xca,0x47,0x0b,0x24,0x72,0xa6,0x27,0xe7,0x56,0x61,0xa7,0x8e,0x62,0xa4,0xff,0x8e +.byte 0x29,0xf8,0x09,0xa4,0xbb,0x70,0x97,0x8a,0x39,0xe8,0x65,0xc8,0x52,0x23,0x9d,0xbf,0x10,0xe8,0x7d,0xbc,0x3c,0xc4,0x8b,0x1e,0x5c,0x75,0x94,0x24,0x62,0x3f,0x5b,0x2b,0x9a,0x08,0x00,0x78,0xfd,0x28,0x44,0x12,0x62,0x2a,0x6f,0x47,0x9d,0x57,0xb0,0x4e,0x3b,0xcd,0x01,0x7d,0x6e,0x62,0xe3,0x99,0x9c,0xae,0x6e,0xe2,0x70,0x7a,0x32,0xb4 +.byte 0xc1,0x19,0xb1,0x03,0x6b,0x92,0x89,0x4f,0x37,0xaf,0x36,0xee,0x5e,0x03,0x31,0x8c,0x41,0x27,0x17,0x21,0xdf,0xe4,0x34,0x97,0x8d,0xe7,0x41,0x47,0xf2,0x80,0x51,0x41,0x01,0xe4,0x0c,0x1a,0x09,0xfc,0x07,0xc3,0x94,0x07,0x6f,0xa7,0x6c,0xff,0x32,0x21,0xa5,0x01,0x8c,0xa2,0x88,0x3c,0xc8,0x57,0xe8,0x68,0x19,0x4a,0x46,0x7a,0x36,0xd2 +.byte 0x75,0x8e,0xc5,0xa4,0x84,0x91,0x13,0x7f,0xdd,0x2b,0x3c,0x2e,0xc4,0x92,0x29,0xb3,0x60,0x74,0xc8,0x81,0x58,0x0e,0xad,0x6a,0x9d,0xaa,0x81,0x49,0x26,0x0f,0xd4,0x2a,0x39,0xdd,0x4d,0x2b,0x13,0xdb,0x2e,0x72,0xe6,0x45,0x99,0xeb,0xe6,0xe5,0xd5,0x76,0xd4,0x19,0xd8,0xd7,0xa9,0x1f,0xce,0x7f,0xc4,0x1c,0x9e,0x6f,0x68,0x32,0xb1,0x26 +.byte 0xc4,0xb6,0x4e,0x9f,0xbf,0xdc,0xe0,0xde,0x54,0x9b,0xe0,0x04,0x03,0xae,0xc9,0xce,0x3a,0xcb,0x93,0xad,0xcc,0x1f,0x46,0xf6,0xbb,0xff,0x40,0x52,0x9c,0x64,0x97,0x5a,0x6f,0x8d,0x28,0x45,0x1c,0xf6,0x8b,0xcb,0xb9,0x38,0xb8,0x00,0xee,0xec,0xac,0x68,0x3f,0x50,0xcb,0x36,0x6e,0x97,0xfd,0xa5,0x1d,0x29,0x6e,0xfa,0x9f,0x4b,0x83,0xcd +.byte 0x0d,0x34,0xf3,0x1e,0x3f,0x0f,0x2e,0x89,0xeb,0xf7,0x8e,0x5f,0xe0,0x3b,0x39,0xd2,0xe8,0x87,0xe3,0xe7,0xe9,0xd0,0x1b,0x32,0x03,0x6b,0x3c,0x75,0x7d,0xe2,0x5c,0x3c,0x42,0xb4,0x46,0x69,0x0b,0xaf,0x0a,0x5d,0x1a,0x83,0x0b,0x0e,0x3c,0x5a,0x36,0xbd,0x5d,0xb6,0xad,0x4c,0xdd,0xf1,0x8d,0xbf,0x2b,0x70,0x8e,0xbc,0x92,0x95,0x1b,0x0f +.byte 0xed,0x3f,0xae,0x9e,0xa2,0x5a,0x50,0xe4,0xda,0xde,0x04,0x51,0x31,0xac,0xa4,0x0b,0x94,0xcc,0x14,0x87,0x59,0xa8,0x30,0x09,0xe6,0x46,0xb9,0x07,0x3e,0x1a,0xbf,0x5a,0x23,0x32,0xfb,0x60,0x63,0x24,0x25,0x12,0xf6,0x3e,0x2d,0xd0,0x8b,0x88,0x9b,0xe9,0x2d,0xab,0xf5,0xaf,0xba,0xbc,0xfe,0xab,0xb2,0x61,0x7a,0x7c,0xbb,0x28,0x6b,0x86 +.byte 0xe5,0xa2,0x9c,0x2c,0x5a,0x23,0x12,0x11,0xe5,0x72,0xe8,0x7b,0x6b,0x40,0xf1,0x91,0x37,0x3b,0x47,0x75,0x65,0xac,0x4d,0x22,0x59,0x75,0x13,0xb0,0x73,0xff,0x59,0xd1,0x1b,0xcc,0x05,0x1f,0xf2,0xc8,0x50,0x83,0xf1,0x28,0x38,0x0b,0xc3,0xa0,0x3b,0xe3,0x86,0xbb,0x9c,0x7e,0xc1,0xe9,0xcc,0xd9,0xb8,0x2b,0x05,0xf3,0x6f,0xc7,0x9d,0xaf +.byte 0x7b,0xb7,0x38,0x41,0xa3,0x50,0x8f,0x92,0xe0,0x63,0x35,0xb3,0x95,0x9f,0x80,0xf8,0x75,0xbb,0xf3,0x2b,0x0e,0xaf,0x32,0x6e,0xff,0xeb,0x79,0xca,0xbf,0x1c,0x4f,0x6c,0x9c,0x06,0xb2,0xeb,0x99,0x57,0x1f,0xf6,0x64,0x0b,0x81,0x57,0xba,0xf4,0x32,0x1e,0x77,0x37,0x55,0xb7,0xbc,0xba,0x70,0x0b,0x0d,0xdd,0x95,0x41,0xb5,0x17,0x5b,0x14 +.byte 0x10,0x9d,0x14,0x52,0x83,0x65,0x0a,0xf4,0x55,0xca,0xf8,0xbe,0xa6,0x3a,0xa0,0x6e,0xcc,0x83,0x84,0x65,0xb4,0x1c,0x7e,0x40,0xdd,0x32,0x36,0x5a,0x23,0x17,0x7d,0xb5,0xb9,0x38,0x48,0x5c,0x6f,0x23,0x54,0x0e,0x93,0x74,0x27,0x0f,0xfd,0x58,0xc1,0x97,0x26,0x78,0x9a,0xd3,0x85,0xc5,0xb2,0xb3,0x44,0xb7,0x36,0x85,0x69,0xde,0x3b,0xa1 +.byte 0x2b,0x11,0xef,0x75,0xfc,0xaa,0x92,0xf1,0xf1,0x72,0xa0,0x5f,0x33,0xf6,0x0b,0x72,0xdb,0xce,0x6c,0x2a,0x15,0x76,0x40,0xd4,0x85,0xff,0x96,0xe1,0x48,0xe1,0x27,0x8f,0x74,0xf3,0xfa,0xa1,0xb7,0x2a,0xb6,0x41,0x90,0x92,0x7e,0xfa,0xfc,0xad,0xa3,0x94,0x91,0x77,0xf1,0x8f,0xee,0xa2,0x64,0x47,0x01,0xb3,0x01,0x99,0x05,0xe7,0x31,0x4a +.byte 0xe8,0xd2,0x65,0x40,0x21,0xc4,0x83,0x8e,0xc9,0x89,0xda,0x16,0x7b,0xe0,0xcb,0xc0,0xc0,0x3d,0x37,0x18,0x66,0xe9,0x70,0x86,0x0b,0x6c,0xe8,0x65,0x44,0xce,0x3a,0xcd,0x84,0x1e,0xce,0x0e,0xe3,0xf9,0x77,0x12,0xfb,0xe6,0x92,0x8b,0x0d,0x7e,0x15,0x7a,0x34,0x94,0x2a,0xa7,0xc5,0x35,0xa4,0xfc,0xbe,0xa3,0x13,0x70,0xe4,0x6b,0x2f,0x71 +.byte 0x31,0xef,0xdb,0x79,0x44,0xf2,0x77,0xc7,0xc9,0x0d,0x1a,0x7b,0xff,0x34,0xf8,0xc9,0xe8,0xc9,0xc2,0xe0,0x0c,0x9e,0xd6,0xb4,0x7a,0xdb,0x1f,0x65,0xb8,0xd4,0x92,0xbf,0x7f,0x06,0x44,0xe3,0xb4,0xd8,0x14,0xe3,0x9b,0x49,0x81,0x12,0xec,0x7d,0x01,0xe2,0x50,0x2c,0x0e,0xfd,0x4b,0x84,0x3b,0x4d,0x89,0x1d,0x2e,0x4b,0xe9,0xda,0xa5,0x3f +.byte 0x19,0xc2,0x53,0x36,0x5d,0xd8,0xdc,0x6e,0xc3,0x48,0x8f,0x09,0xd5,0x95,0x4b,0x0c,0x7c,0x00,0x15,0x33,0x8e,0x1d,0x0c,0xdf,0x32,0x3b,0x93,0x1f,0xf5,0x49,0x4f,0xfd,0x8b,0x64,0xe7,0x96,0xaf,0x2f,0xc8,0xea,0xab,0x91,0x53,0x29,0xe3,0x31,0x0a,0x1c,0x6e,0xe0,0xbb,0x81,0x11,0x83,0xe0,0x07,0xfb,0x29,0x11,0x0f,0x0d,0x85,0xd4,0x61 +.byte 0x3c,0x75,0xbb,0x8a,0x23,0xb6,0xa0,0x7f,0xa4,0xbb,0x11,0xd4,0x75,0xde,0x27,0xe5,0xeb,0x11,0x5d,0x02,0xfe,0x5c,0x62,0x60,0x0f,0x6f,0x45,0x9b,0xfb,0xb7,0x32,0xa8,0x1c,0xd6,0xff,0x43,0x7b,0x53,0xee,0xa4,0x1f,0xf2,0xba,0xb6,0xb7,0xb7,0x39,0x18,0x85,0x79,0x77,0x27,0x30,0x26,0xe4,0xef,0xd1,0x39,0xc9,0xa2,0x0d,0x50,0xd7,0xef +.byte 0x9e,0xd8,0x8e,0xd2,0x74,0x1a,0x3f,0x99,0x24,0xf4,0x8b,0x4d,0x02,0x63,0x18,0x3a,0xaf,0x26,0xef,0xfc,0x1d,0xfe,0x46,0xc1,0x55,0xd7,0x92,0x65,0x2f,0xe7,0x4f,0x47,0xa8,0x2f,0x5d,0x47,0x67,0xeb,0x62,0x1d,0x69,0xa6,0x0e,0x51,0x1d,0x2c,0xed,0x6e,0x94,0xe9,0x48,0x4c,0x22,0xc2,0x93,0x79,0x6f,0x1b,0xc2,0x93,0x61,0x3d,0x8b,0xba +.byte 0xcb,0xe9,0x4a,0x88,0x5e,0x19,0x50,0x14,0xfe,0xda,0x3f,0x4d,0x47,0x54,0xfc,0x1c,0x09,0x77,0x37,0x30,0xfe,0x75,0x9f,0xdd,0xa4,0x74,0x04,0x04,0x88,0xe0,0xac,0x93,0x64,0x6f,0xbf,0x50,0xd8,0xf0,0xf7,0xa0,0xfa,0x98,0x49,0xfa,0xf7,0x6e,0xcf,0xa2,0xbf,0xb6,0x07,0x15,0x0e,0x4e,0x21,0x74,0x0a,0xa6,0xa3,0x67,0xce,0xf9,0x3b,0xd6 +.byte 0x4c,0xc8,0x43,0xe3,0x3b,0x3b,0x6a,0x86,0x62,0x3f,0x5a,0xf3,0x3f,0xf9,0xeb,0xbf,0xa3,0x2a,0x83,0x8a,0x70,0x8f,0x01,0x65,0x17,0x9a,0xa6,0x26,0x3b,0x09,0x06,0x22,0x19,0xed,0xd7,0x25,0x4b,0xd2,0x9a,0x30,0xfe,0x1c,0x82,0x68,0x16,0x04,0x0e,0x04,0x8f,0xc6,0x92,0xbe,0xe4,0x43,0x98,0x1d,0x3b,0x10,0x15,0x5b,0xef,0x4e,0x60,0x5e +.byte 0x6b,0xc9,0xde,0xb8,0x47,0x02,0x86,0x45,0x39,0x7a,0x1a,0xef,0x67,0x28,0xc5,0x40,0x73,0x2a,0xa7,0x12,0x9d,0x58,0x3a,0x34,0xc2,0xda,0x34,0xb0,0x48,0xd9,0x34,0xcd,0x18,0xe9,0x76,0x41,0x78,0x8f,0xe5,0xe8,0x3d,0xb2,0x01,0x3b,0x84,0xd1,0xca,0x5e,0x26,0x1d,0x8c,0xea,0xe1,0x46,0xa3,0xf9,0x11,0xac,0x0d,0x98,0x9f,0xd3,0x46,0x79 +.byte 0xff,0xad,0x99,0x32,0x63,0x96,0xbc,0x57,0x39,0x16,0xce,0x06,0x7e,0x63,0x78,0x7b,0x86,0x92,0x1a,0xe1,0x45,0xc0,0x73,0xe1,0xec,0xfc,0x88,0x8f,0xf8,0x36,0x0f,0x54,0x76,0x02,0x98,0x49,0x40,0xb9,0xef,0xd8,0x13,0x68,0xf5,0x1d,0x0a,0x98,0x65,0x21,0xc5,0x1a,0x22,0x4e,0x8e,0xad,0xa9,0x52,0x57,0xc4,0xc6,0xa8,0x48,0x01,0x7a,0x78 +.byte 0xc9,0xfc,0xdd,0xf3,0xc3,0x83,0xc0,0x06,0xb5,0x56,0x84,0xe2,0x0c,0x6b,0x80,0xd9,0x59,0xa1,0x3d,0xe3,0x56,0xf0,0xe3,0x3f,0x93,0x61,0xf7,0x8c,0x6b,0x40,0x65,0x6e,0x01,0xc2,0xa1,0xc1,0xb8,0x9b,0x15,0x6c,0xa1,0x18,0x4a,0x6c,0x8b,0x18,0x2d,0x8e,0x71,0x7a,0xa1,0x26,0xc1,0x4b,0xac,0x0c,0xca,0x08,0x33,0xef,0x35,0x33,0x63,0xeb +.byte 0x57,0x6e,0x7e,0x36,0xe0,0x31,0xad,0x10,0x76,0xb7,0x45,0xd9,0x3a,0x92,0x66,0x69,0x13,0x61,0x59,0x87,0xfd,0x6b,0xf1,0x46,0x0a,0x7a,0x3f,0x29,0x88,0x5b,0x7d,0xef,0x07,0x02,0xa8,0xa1,0xdc,0xd4,0x0e,0x77,0x8f,0x68,0x32,0xbd,0x8e,0xd6,0x0b,0xe4,0xd1,0x75,0xc1,0xb0,0x74,0x6c,0x0e,0xc3,0x46,0x79,0x36,0x3b,0x5f,0x0e,0xa0,0xad +.byte 0x28,0x8c,0xcb,0x01,0x8e,0x58,0x14,0x09,0xf1,0xd4,0x3b,0x2e,0xdc,0xbf,0x37,0x95,0x26,0xda,0xb6,0xcf,0xc8,0xa1,0xd4,0xec,0x72,0xf3,0x44,0xf5,0x4e,0x27,0x9b,0x2e,0x7c,0xfa,0x37,0x16,0x1d,0x7f,0x90,0x86,0xae,0x96,0x3b,0xe1,0xda,0xf7,0xc4,0x54,0x0b,0x51,0x7e,0x83,0xbe,0xed,0xd6,0x5f,0xd2,0x6d,0xbb,0xd3,0xc6,0x53,0x95,0x65 +.byte 0x3d,0x19,0xc2,0xc5,0xdf,0x47,0x00,0x2c,0x4b,0x2d,0xec,0x32,0xd5,0x28,0xb5,0x30,0xe0,0x79,0x15,0x2e,0xab,0x97,0xa8,0xcf,0xc5,0x40,0x98,0x30,0x22,0x9f,0xbc,0xdb,0x65,0x06,0xfc,0x58,0xe5,0x55,0x5b,0xe2,0xf8,0x6e,0xc6,0xfc,0xec,0x6c,0x14,0xd2,0xe3,0x9a,0x71,0x8a,0x61,0xea,0x39,0xc6,0x77,0x94,0xdf,0x7b,0x99,0x71,0xdd,0x18 +.byte 0xc6,0x03,0x2d,0x49,0xf6,0xc3,0xe8,0x2b,0x7e,0x3f,0x28,0xfc,0xc8,0xa1,0xb0,0x15,0x31,0x7e,0x83,0xb8,0x14,0x34,0x0e,0x7f,0xde,0x74,0x7b,0xbf,0xb7,0x8e,0xd9,0x31,0x90,0x16,0xb6,0x57,0x14,0x4a,0xc6,0x67,0x3d,0xb9,0x46,0x92,0xf2,0xf9,0x94,0x36,0x2b,0xd6,0x1f,0x84,0xa5,0x8c,0x0f,0xd9,0x8c,0x5f,0x97,0x7a,0x7b,0xff,0xc9,0xf5 +.byte 0x5e,0x13,0x5f,0x19,0x58,0xba,0xa6,0xe8,0x29,0xf4,0xb8,0x7e,0x98,0xb7,0xef,0x1b,0x00,0xe8,0x90,0x8f,0x86,0x4c,0xe0,0x51,0x13,0x8b,0xa1,0x37,0x40,0x38,0x51,0x2f,0x5a,0x9b,0x63,0x8f,0xce,0x9a,0x97,0x07,0x0d,0x8e,0xce,0xb1,0x66,0x89,0x78,0xca,0xa6,0x0c,0x20,0xc4,0xf1,0xe3,0xab,0xe2,0x1c,0x83,0x2b,0x46,0x97,0xe8,0x8f,0x94 +.byte 0xb4,0x71,0x40,0xde,0xa1,0x05,0x4b,0xed,0xbf,0x0c,0x46,0xe1,0x25,0xf1,0xd0,0x5a,0xdb,0x9c,0x2a,0x09,0x03,0x80,0x24,0xc1,0x22,0x02,0xa5,0xde,0xf6,0x4c,0xbc,0x93,0x37,0xa9,0x28,0xb3,0x92,0x19,0xa8,0x3f,0x71,0x90,0x62,0x78,0xaa,0x9a,0x0c,0xab,0x50,0xaf,0x89,0x2b,0xf1,0xf4,0x12,0xbd,0xc9,0xd5,0xee,0x64,0x8b,0x48,0x21,0xd6 +.byte 0xa1,0xa1,0xf2,0x68,0x4a,0xf8,0x06,0x3e,0x20,0x31,0x66,0xb7,0x2f,0x64,0x01,0x5a,0x46,0x14,0x85,0xfb,0xde,0x04,0xc3,0xe4,0xd6,0x25,0x14,0xa0,0xbe,0x4d,0x39,0xd8,0xe0,0x9b,0xb7,0x6b,0x00,0xe6,0x46,0xfb,0xcc,0xa8,0xad,0x67,0x12,0x2c,0x53,0x2c,0xb6,0x9f,0x6e,0xfe,0xbc,0xcc,0x2c,0xa8,0x09,0x17,0x00,0x8e,0xf1,0xf4,0x3e,0xa9 +.byte 0x92,0x4d,0x83,0xe6,0x3c,0xf0,0xd3,0x1c,0xaf,0x84,0x2c,0x59,0x7e,0xda,0x1e,0xfd,0x7d,0xf3,0xef,0x93,0x05,0x03,0xb0,0x76,0x69,0xb5,0x51,0xa8,0x65,0x8f,0x8a,0xf8,0x55,0x92,0x08,0xfe,0xbf,0xc1,0x95,0x98,0x58,0xb1,0xd3,0xb6,0x78,0x4f,0x2f,0x25,0xcb,0x9d,0x32,0x4f,0xa6,0xcc,0xf8,0x36,0xff,0x72,0xb3,0x93,0x3d,0xd8,0x0b,0xe6 +.byte 0xc6,0xf6,0xed,0xcc,0x2a,0xa5,0x44,0x6e,0xe2,0x2d,0x6e,0x02,0xb4,0x7c,0x24,0x7f,0x57,0x02,0x84,0x61,0x8e,0xbd,0x32,0x4e,0x41,0x92,0x01,0x1b,0x8b,0x1d,0xd1,0x1e,0x31,0xc1,0x4c,0x5b,0x0c,0xa7,0x48,0x52,0x67,0xc2,0xd9,0xdc,0x86,0x9d,0xbd,0x6c,0x19,0x95,0x00,0xf0,0xd4,0x47,0xaf,0xfe,0x5d,0xa5,0x81,0xbd,0x1b,0x42,0x62,0xce +.byte 0x18,0x1b,0xa3,0x6f,0xf5,0x0b,0xb7,0x6a,0x3d,0xe3,0xcc,0x41,0x27,0xcd,0x49,0x4b,0xe5,0x2b,0xc4,0x28,0xfa,0xbe,0xd5,0x7e,0xb7,0xac,0xab,0x64,0x3b,0xe3,0x87,0xb1,0x33,0x8b,0xa8,0xe5,0x75,0xce,0x61,0x57,0x89,0xad,0x5f,0x61,0xdd,0x7c,0x06,0x2a,0x3f,0x50,0xb8,0x7e,0xd2,0xfb,0x32,0x83,0x07,0xd4,0xc5,0x3f,0xad,0x64,0x59,0x1f +.byte 0x21,0x59,0x6f,0x1b,0xd7,0x40,0x89,0x28,0x18,0xac,0xca,0xee,0x92,0x1c,0x0d,0x88,0x98,0x7a,0x75,0x68,0xe0,0xe2,0x96,0xda,0x88,0xb3,0xc6,0x21,0x02,0x34,0xfa,0xae,0x0b,0x38,0xcf,0x1c,0x6c,0x7a,0xc9,0xd9,0x5f,0xf0,0x4c,0x73,0xfd,0xe6,0x14,0xf3,0x39,0xed,0xbc,0x28,0x2f,0xf8,0x79,0x02,0x39,0x05,0xf3,0x6a,0x88,0xd9,0x03,0xe2 +.byte 0xb9,0x65,0x81,0x3a,0x34,0x80,0x3f,0x17,0x37,0x1e,0xe8,0x7d,0x41,0x49,0xfb,0x70,0x5d,0x58,0x3a,0x71,0x7b,0x3e,0xd3,0x83,0x0b,0x1b,0x11,0xfc,0x53,0xce,0xc6,0xc4,0x39,0x55,0xbe,0xbe,0x32,0xa5,0x88,0xab,0xcd,0x38,0x78,0x3e,0x52,0xaf,0x64,0x42,0x10,0xc3,0x70,0x81,0x76,0xe9,0x7d,0x8e,0x46,0x41,0xca,0x2c,0x0c,0x4c,0x30,0xd3 +.byte 0xca,0x38,0xa3,0x97,0x2e,0x0f,0xa5,0x18,0x3b,0xaa,0x0f,0x00,0x75,0x35,0x9c,0xcd,0x28,0x83,0xd4,0xa7,0x7c,0xb9,0xcd,0xb5,0x55,0x29,0x4c,0x14,0xcd,0xfc,0x8f,0xaf,0x7d,0x69,0x4f,0xf7,0x0f,0xed,0x7c,0xa5,0x79,0x9d,0x36,0xbb,0x72,0xbc,0xf2,0x14,0xfd,0xf0,0x04,0x2a,0x89,0x1e,0xf7,0x80,0x4c,0x5e,0xb8,0xc1,0xdb,0xfa,0x3c,0x27 +.byte 0xbb,0x30,0x08,0x2b,0xd2,0xf8,0xdb,0xe0,0x8c,0x00,0xe4,0xca,0xa9,0xde,0xb0,0x14,0x5b,0xec,0x6b,0xe6,0x5c,0x90,0x17,0x02,0x59,0x5f,0x5f,0x51,0xf8,0x30,0x10,0x11,0xc4,0xdf,0x37,0x30,0x32,0xb1,0x4d,0x49,0xfe,0x82,0x87,0xd2,0x42,0xf5,0x38,0x76,0xf9,0xa5,0x28,0xfc,0x14,0xb2,0xe0,0x72,0x82,0xde,0xc8,0x47,0x9e,0x8f,0x8a,0xb5 +.byte 0x85,0x44,0x42,0x12,0xc6,0xc0,0xa5,0x60,0x5a,0x27,0xd0,0x36,0x14,0x7b,0x2a,0x83,0x98,0x92,0x08,0xe9,0x03,0xc9,0xc3,0xd3,0x36,0x97,0xba,0x5e,0xd5,0x51,0xcc,0x44,0xeb,0x81,0x76,0xae,0x28,0x94,0x0b,0xf6,0xc7,0xeb,0xae,0x61,0x6f,0x7b,0x34,0xb5,0x8c,0x5f,0x31,0xb6,0x23,0xe3,0xe7,0x4b,0x60,0xe6,0xba,0x8d,0x0e,0xd1,0xb2,0x37 +.byte 0x72,0x3d,0xc1,0x75,0x9b,0x5e,0xcb,0x0f,0xf9,0xe4,0xdb,0x82,0x4c,0xc4,0x37,0xef,0x9d,0xde,0x16,0x85,0xe9,0xc2,0x03,0xd8,0x5b,0xa1,0xff,0xfa,0xd4,0xd7,0x5c,0x34,0xb6,0x1e,0x25,0x96,0xf5,0x8b,0xc3,0xee,0x16,0x1f,0xf8,0x55,0x4e,0x1c,0x83,0x80,0x77,0x1d,0x4f,0xb6,0x95,0x1c,0x91,0x7d,0x50,0x25,0xf4,0x2a,0x5d,0x2e,0xc7,0x8a +.byte 0x14,0xf8,0xb9,0xbc,0xab,0x5b,0xcd,0x47,0xb5,0xaf,0x85,0xc0,0x34,0x27,0x7d,0x6a,0x8c,0x84,0x8a,0xae,0x68,0x60,0x0e,0xa1,0x45,0xf7,0x83,0x66,0x91,0x69,0x30,0xed,0x26,0x5e,0xf5,0x48,0x6b,0x20,0xb3,0x11,0x50,0xf7,0x70,0x9d,0x10,0x50,0x44,0x87,0xfe,0x96,0x5c,0xc6,0xa4,0xa4,0xed,0x5e,0x7f,0x3d,0x90,0x19,0xbe,0x31,0xa3,0xdd +.byte 0x44,0xbb,0x9b,0x51,0x5a,0x06,0x1d,0x2e,0xd7,0xef,0xd1,0x81,0xb6,0xec,0xc6,0x89,0xfb,0x13,0xc5,0x21,0xef,0x9a,0x1a,0x48,0xf2,0xf8,0xb3,0xa3,0xec,0x7f,0x85,0xc1,0xc6,0x8c,0x5f,0xa9,0x30,0x38,0x25,0x1e,0x8d,0xcf,0x18,0x24,0xef,0x5a,0x9a,0x14,0x31,0xc0,0x2c,0x88,0xa5,0x3f,0x50,0x8b,0xb1,0xda,0x5d,0x26,0xd9,0xd3,0x81,0xb1 +.byte 0xec,0xf0,0x42,0x88,0xd0,0x81,0x51,0xf9,0x1b,0xbc,0x43,0xa4,0x37,0xf1,0xd7,0x90,0x21,0x7e,0xa0,0x3e,0x63,0xfb,0x21,0xfa,0x12,0xfb,0xde,0xc7,0xbf,0xb3,0x58,0xe7,0x76,0x42,0x20,0x01,0x3d,0x66,0x80,0xf1,0xb8,0xaf,0xfa,0x7d,0x96,0x89,0x36,0x48,0x95,0xd9,0x6e,0x6d,0xe6,0x4f,0xff,0x2a,0x47,0x61,0xf2,0x04,0xb7,0x83,0x14,0xce +.byte 0x0a,0x3c,0x73,0x17,0x50,0x88,0x03,0x25,0x4a,0xe3,0x13,0x55,0x8b,0x7e,0x50,0x38,0xfc,0x14,0x0b,0x04,0x8e,0xa8,0x5b,0xd6,0x72,0x20,0x60,0xe9,0xaa,0x22,0x82,0x11,0xc6,0xc4,0xd7,0xb9,0xc8,0x0c,0x7e,0x05,0xfb,0x90,0xe4,0x9c,0x28,0x89,0x29,0x99,0x63,0x4d,0xec,0x7b,0x50,0xbd,0xd8,0xa3,0x5b,0x50,0x77,0x19,0x81,0x92,0xce,0x82 + +.align 5 +Lpoly: +.quad 0xffffffffffffffff,0x00000000ffffffff,0x0000000000000000,0xffffffff00000001 +LRR: // 2^512 mod P precomputed for NIST P256 polynomial +.quad 0x0000000000000003,0xfffffffbffffffff,0xfffffffffffffffe,0x00000004fffffffd +Lone_mont: +.quad 0x0000000000000001,0xffffffff00000000,0xffffffffffffffff,0x00000000fffffffe +Lone: +.quad 1,0,0,0 +Lord: +.quad 0xf3b9cac2fc632551,0xbce6faada7179e84,0xffffffffffffffff,0xffffffff00000000 +LordK: +.quad 0xccd1c8aaee00bc4f +.byte 69,67,80,95,78,73,83,84,90,50,53,54,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 +.align 2 + +.text + +// void ecp_nistz256_to_mont(BN_ULONG x0[4],const BN_ULONG x1[4]); +.globl ecp_nistz256_to_mont +.def ecp_nistz256_to_mont + .type 32 +.endef +.align 6 +ecp_nistz256_to_mont: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-32]! + add x29,sp,#0 + stp x19,x20,[sp,#16] + + adrp x3,LRR + ldr x3,[x3,:lo12:LRR] // bp[0] + ldp x4,x5,[x1] + ldp x6,x7,[x1,#16] + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] + adrp x2,LRR // &bp[0] + add x2,x2,:lo12:LRR + + bl __ecp_nistz256_mul_mont + + ldp x19,x20,[sp,#16] + ldp x29,x30,[sp],#32 + AARCH64_VALIDATE_LINK_REGISTER + ret + + +// void ecp_nistz256_from_mont(BN_ULONG x0[4],const BN_ULONG x1[4]); +.globl ecp_nistz256_from_mont +.def ecp_nistz256_from_mont + .type 32 +.endef +.align 4 +ecp_nistz256_from_mont: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-32]! + add x29,sp,#0 + stp x19,x20,[sp,#16] + + mov x3,#1 // bp[0] + ldp x4,x5,[x1] + ldp x6,x7,[x1,#16] + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] + adrp x2,Lone // &bp[0] + add x2,x2,:lo12:Lone + + bl __ecp_nistz256_mul_mont + + ldp x19,x20,[sp,#16] + ldp x29,x30,[sp],#32 + AARCH64_VALIDATE_LINK_REGISTER + ret + + +// void ecp_nistz256_mul_mont(BN_ULONG x0[4],const BN_ULONG x1[4], +// const BN_ULONG x2[4]); +.globl ecp_nistz256_mul_mont +.def ecp_nistz256_mul_mont + .type 32 +.endef +.align 4 +ecp_nistz256_mul_mont: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-32]! + add x29,sp,#0 + stp x19,x20,[sp,#16] + + ldr x3,[x2] // bp[0] + ldp x4,x5,[x1] + ldp x6,x7,[x1,#16] + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] + + bl __ecp_nistz256_mul_mont + + ldp x19,x20,[sp,#16] + ldp x29,x30,[sp],#32 + AARCH64_VALIDATE_LINK_REGISTER + ret + + +// void ecp_nistz256_sqr_mont(BN_ULONG x0[4],const BN_ULONG x1[4]); +.globl ecp_nistz256_sqr_mont +.def ecp_nistz256_sqr_mont + .type 32 +.endef +.align 4 +ecp_nistz256_sqr_mont: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-32]! + add x29,sp,#0 + stp x19,x20,[sp,#16] + + ldp x4,x5,[x1] + ldp x6,x7,[x1,#16] + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] + + bl __ecp_nistz256_sqr_mont + + ldp x19,x20,[sp,#16] + ldp x29,x30,[sp],#32 + AARCH64_VALIDATE_LINK_REGISTER + ret + + +// void ecp_nistz256_add(BN_ULONG x0[4],const BN_ULONG x1[4], +// const BN_ULONG x2[4]); +.globl ecp_nistz256_add +.def ecp_nistz256_add + .type 32 +.endef +.align 4 +ecp_nistz256_add: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + + ldp x14,x15,[x1] + ldp x8,x9,[x2] + ldp x16,x17,[x1,#16] + ldp x10,x11,[x2,#16] + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] + + bl __ecp_nistz256_add + + ldp x29,x30,[sp],#16 + AARCH64_VALIDATE_LINK_REGISTER + ret + + +// void ecp_nistz256_div_by_2(BN_ULONG x0[4],const BN_ULONG x1[4]); +.globl ecp_nistz256_div_by_2 +.def ecp_nistz256_div_by_2 + .type 32 +.endef +.align 4 +ecp_nistz256_div_by_2: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + + ldp x14,x15,[x1] + ldp x16,x17,[x1,#16] + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] + + bl __ecp_nistz256_div_by_2 + + ldp x29,x30,[sp],#16 + AARCH64_VALIDATE_LINK_REGISTER + ret + + +// void ecp_nistz256_mul_by_2(BN_ULONG x0[4],const BN_ULONG x1[4]); +.globl ecp_nistz256_mul_by_2 +.def ecp_nistz256_mul_by_2 + .type 32 +.endef +.align 4 +ecp_nistz256_mul_by_2: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + + ldp x14,x15,[x1] + ldp x16,x17,[x1,#16] + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] + mov x8,x14 + mov x9,x15 + mov x10,x16 + mov x11,x17 + + bl __ecp_nistz256_add // ret = a+a // 2*a + + ldp x29,x30,[sp],#16 + AARCH64_VALIDATE_LINK_REGISTER + ret + + +// void ecp_nistz256_mul_by_3(BN_ULONG x0[4],const BN_ULONG x1[4]); +.globl ecp_nistz256_mul_by_3 +.def ecp_nistz256_mul_by_3 + .type 32 +.endef +.align 4 +ecp_nistz256_mul_by_3: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + + ldp x14,x15,[x1] + ldp x16,x17,[x1,#16] + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] + mov x8,x14 + mov x9,x15 + mov x10,x16 + mov x11,x17 + mov x4,x14 + mov x5,x15 + mov x6,x16 + mov x7,x17 + + bl __ecp_nistz256_add // ret = a+a // 2*a + + mov x8,x4 + mov x9,x5 + mov x10,x6 + mov x11,x7 + + bl __ecp_nistz256_add // ret += a // 2*a+a=3*a + + ldp x29,x30,[sp],#16 + AARCH64_VALIDATE_LINK_REGISTER + ret + + +// void ecp_nistz256_sub(BN_ULONG x0[4],const BN_ULONG x1[4], +// const BN_ULONG x2[4]); +.globl ecp_nistz256_sub +.def ecp_nistz256_sub + .type 32 +.endef +.align 4 +ecp_nistz256_sub: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + + ldp x14,x15,[x1] + ldp x16,x17,[x1,#16] + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] + + bl __ecp_nistz256_sub_from + + ldp x29,x30,[sp],#16 + AARCH64_VALIDATE_LINK_REGISTER + ret + + +// void ecp_nistz256_neg(BN_ULONG x0[4],const BN_ULONG x1[4]); +.globl ecp_nistz256_neg +.def ecp_nistz256_neg + .type 32 +.endef +.align 4 +ecp_nistz256_neg: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + + mov x2,x1 + mov x14,xzr // a = 0 + mov x15,xzr + mov x16,xzr + mov x17,xzr + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] + + bl __ecp_nistz256_sub_from + + ldp x29,x30,[sp],#16 + AARCH64_VALIDATE_LINK_REGISTER + ret + + +// note that __ecp_nistz256_mul_mont expects a[0-3] input pre-loaded +// to x4-x7 and b[0] - to x3 +.def __ecp_nistz256_mul_mont + .type 32 +.endef +.align 4 +__ecp_nistz256_mul_mont: + mul x14,x4,x3 // a[0]*b[0] + umulh x8,x4,x3 + + mul x15,x5,x3 // a[1]*b[0] + umulh x9,x5,x3 + + mul x16,x6,x3 // a[2]*b[0] + umulh x10,x6,x3 + + mul x17,x7,x3 // a[3]*b[0] + umulh x11,x7,x3 + ldr x3,[x2,#8] // b[1] + + adds x15,x15,x8 // accumulate high parts of multiplication + lsl x8,x14,#32 + adcs x16,x16,x9 + lsr x9,x14,#32 + adcs x17,x17,x10 + adc x19,xzr,x11 + mov x20,xzr + subs x10,x14,x8 // "*0xffff0001" + sbc x11,x14,x9 + adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] + mul x8,x4,x3 // lo(a[0]*b[i]) + adcs x15,x16,x9 + mul x9,x5,x3 // lo(a[1]*b[i]) + adcs x16,x17,x10 // +=acc[0]*0xffff0001 + mul x10,x6,x3 // lo(a[2]*b[i]) + adcs x17,x19,x11 + mul x11,x7,x3 // lo(a[3]*b[i]) + adc x19,x20,xzr + + adds x14,x14,x8 // accumulate low parts of multiplication + umulh x8,x4,x3 // hi(a[0]*b[i]) + adcs x15,x15,x9 + umulh x9,x5,x3 // hi(a[1]*b[i]) + adcs x16,x16,x10 + umulh x10,x6,x3 // hi(a[2]*b[i]) + adcs x17,x17,x11 + umulh x11,x7,x3 // hi(a[3]*b[i]) + adc x19,x19,xzr + ldr x3,[x2,#8*(1+1)] // b[1+1] + adds x15,x15,x8 // accumulate high parts of multiplication + lsl x8,x14,#32 + adcs x16,x16,x9 + lsr x9,x14,#32 + adcs x17,x17,x10 + adcs x19,x19,x11 + adc x20,xzr,xzr + subs x10,x14,x8 // "*0xffff0001" + sbc x11,x14,x9 + adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] + mul x8,x4,x3 // lo(a[0]*b[i]) + adcs x15,x16,x9 + mul x9,x5,x3 // lo(a[1]*b[i]) + adcs x16,x17,x10 // +=acc[0]*0xffff0001 + mul x10,x6,x3 // lo(a[2]*b[i]) + adcs x17,x19,x11 + mul x11,x7,x3 // lo(a[3]*b[i]) + adc x19,x20,xzr + + adds x14,x14,x8 // accumulate low parts of multiplication + umulh x8,x4,x3 // hi(a[0]*b[i]) + adcs x15,x15,x9 + umulh x9,x5,x3 // hi(a[1]*b[i]) + adcs x16,x16,x10 + umulh x10,x6,x3 // hi(a[2]*b[i]) + adcs x17,x17,x11 + umulh x11,x7,x3 // hi(a[3]*b[i]) + adc x19,x19,xzr + ldr x3,[x2,#8*(2+1)] // b[2+1] + adds x15,x15,x8 // accumulate high parts of multiplication + lsl x8,x14,#32 + adcs x16,x16,x9 + lsr x9,x14,#32 + adcs x17,x17,x10 + adcs x19,x19,x11 + adc x20,xzr,xzr + subs x10,x14,x8 // "*0xffff0001" + sbc x11,x14,x9 + adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] + mul x8,x4,x3 // lo(a[0]*b[i]) + adcs x15,x16,x9 + mul x9,x5,x3 // lo(a[1]*b[i]) + adcs x16,x17,x10 // +=acc[0]*0xffff0001 + mul x10,x6,x3 // lo(a[2]*b[i]) + adcs x17,x19,x11 + mul x11,x7,x3 // lo(a[3]*b[i]) + adc x19,x20,xzr + + adds x14,x14,x8 // accumulate low parts of multiplication + umulh x8,x4,x3 // hi(a[0]*b[i]) + adcs x15,x15,x9 + umulh x9,x5,x3 // hi(a[1]*b[i]) + adcs x16,x16,x10 + umulh x10,x6,x3 // hi(a[2]*b[i]) + adcs x17,x17,x11 + umulh x11,x7,x3 // hi(a[3]*b[i]) + adc x19,x19,xzr + adds x15,x15,x8 // accumulate high parts of multiplication + lsl x8,x14,#32 + adcs x16,x16,x9 + lsr x9,x14,#32 + adcs x17,x17,x10 + adcs x19,x19,x11 + adc x20,xzr,xzr + // last reduction + subs x10,x14,x8 // "*0xffff0001" + sbc x11,x14,x9 + adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] + adcs x15,x16,x9 + adcs x16,x17,x10 // +=acc[0]*0xffff0001 + adcs x17,x19,x11 + adc x19,x20,xzr + + adds x8,x14,#1 // subs x8,x14,#-1 // tmp = ret-modulus + sbcs x9,x15,x12 + sbcs x10,x16,xzr + sbcs x11,x17,x13 + sbcs xzr,x19,xzr // did it borrow? + + csel x14,x14,x8,lo // ret = borrow ? ret : ret-modulus + csel x15,x15,x9,lo + csel x16,x16,x10,lo + stp x14,x15,[x0] + csel x17,x17,x11,lo + stp x16,x17,[x0,#16] + + ret + + +// note that __ecp_nistz256_sqr_mont expects a[0-3] input pre-loaded +// to x4-x7 +.def __ecp_nistz256_sqr_mont + .type 32 +.endef +.align 4 +__ecp_nistz256_sqr_mont: + // | | | | | |a1*a0| | + // | | | | |a2*a0| | | + // | |a3*a2|a3*a0| | | | + // | | | |a2*a1| | | | + // | | |a3*a1| | | | | + // *| | | | | | | | 2| + // +|a3*a3|a2*a2|a1*a1|a0*a0| + // |--+--+--+--+--+--+--+--| + // |A7|A6|A5|A4|A3|A2|A1|A0|, where Ax is , i.e. follow + // + // "can't overflow" below mark carrying into high part of + // multiplication result, which can't overflow, because it + // can never be all ones. + + mul x15,x5,x4 // a[1]*a[0] + umulh x9,x5,x4 + mul x16,x6,x4 // a[2]*a[0] + umulh x10,x6,x4 + mul x17,x7,x4 // a[3]*a[0] + umulh x19,x7,x4 + + adds x16,x16,x9 // accumulate high parts of multiplication + mul x8,x6,x5 // a[2]*a[1] + umulh x9,x6,x5 + adcs x17,x17,x10 + mul x10,x7,x5 // a[3]*a[1] + umulh x11,x7,x5 + adc x19,x19,xzr // can't overflow + + mul x20,x7,x6 // a[3]*a[2] + umulh x1,x7,x6 + + adds x9,x9,x10 // accumulate high parts of multiplication + mul x14,x4,x4 // a[0]*a[0] + adc x10,x11,xzr // can't overflow + + adds x17,x17,x8 // accumulate low parts of multiplication + umulh x4,x4,x4 + adcs x19,x19,x9 + mul x9,x5,x5 // a[1]*a[1] + adcs x20,x20,x10 + umulh x5,x5,x5 + adc x1,x1,xzr // can't overflow + + adds x15,x15,x15 // acc[1-6]*=2 + mul x10,x6,x6 // a[2]*a[2] + adcs x16,x16,x16 + umulh x6,x6,x6 + adcs x17,x17,x17 + mul x11,x7,x7 // a[3]*a[3] + adcs x19,x19,x19 + umulh x7,x7,x7 + adcs x20,x20,x20 + adcs x1,x1,x1 + adc x2,xzr,xzr + + adds x15,x15,x4 // +a[i]*a[i] + adcs x16,x16,x9 + adcs x17,x17,x5 + adcs x19,x19,x10 + adcs x20,x20,x6 + lsl x8,x14,#32 + adcs x1,x1,x11 + lsr x9,x14,#32 + adc x2,x2,x7 + subs x10,x14,x8 // "*0xffff0001" + sbc x11,x14,x9 + adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] + adcs x15,x16,x9 + lsl x8,x14,#32 + adcs x16,x17,x10 // +=acc[0]*0xffff0001 + lsr x9,x14,#32 + adc x17,x11,xzr // can't overflow + subs x10,x14,x8 // "*0xffff0001" + sbc x11,x14,x9 + adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] + adcs x15,x16,x9 + lsl x8,x14,#32 + adcs x16,x17,x10 // +=acc[0]*0xffff0001 + lsr x9,x14,#32 + adc x17,x11,xzr // can't overflow + subs x10,x14,x8 // "*0xffff0001" + sbc x11,x14,x9 + adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] + adcs x15,x16,x9 + lsl x8,x14,#32 + adcs x16,x17,x10 // +=acc[0]*0xffff0001 + lsr x9,x14,#32 + adc x17,x11,xzr // can't overflow + subs x10,x14,x8 // "*0xffff0001" + sbc x11,x14,x9 + adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] + adcs x15,x16,x9 + adcs x16,x17,x10 // +=acc[0]*0xffff0001 + adc x17,x11,xzr // can't overflow + + adds x14,x14,x19 // accumulate upper half + adcs x15,x15,x20 + adcs x16,x16,x1 + adcs x17,x17,x2 + adc x19,xzr,xzr + + adds x8,x14,#1 // subs x8,x14,#-1 // tmp = ret-modulus + sbcs x9,x15,x12 + sbcs x10,x16,xzr + sbcs x11,x17,x13 + sbcs xzr,x19,xzr // did it borrow? + + csel x14,x14,x8,lo // ret = borrow ? ret : ret-modulus + csel x15,x15,x9,lo + csel x16,x16,x10,lo + stp x14,x15,[x0] + csel x17,x17,x11,lo + stp x16,x17,[x0,#16] + + ret + + +// Note that __ecp_nistz256_add expects both input vectors pre-loaded to +// x4-x7 and x8-x11. This is done because it's used in multiple +// contexts, e.g. in multiplication by 2 and 3... +.def __ecp_nistz256_add + .type 32 +.endef +.align 4 +__ecp_nistz256_add: + adds x14,x14,x8 // ret = a+b + adcs x15,x15,x9 + adcs x16,x16,x10 + adcs x17,x17,x11 + adc x1,xzr,xzr // zap x1 + + adds x8,x14,#1 // subs x8,x4,#-1 // tmp = ret-modulus + sbcs x9,x15,x12 + sbcs x10,x16,xzr + sbcs x11,x17,x13 + sbcs xzr,x1,xzr // did subtraction borrow? + + csel x14,x14,x8,lo // ret = borrow ? ret : ret-modulus + csel x15,x15,x9,lo + csel x16,x16,x10,lo + stp x14,x15,[x0] + csel x17,x17,x11,lo + stp x16,x17,[x0,#16] + + ret + + +.def __ecp_nistz256_sub_from + .type 32 +.endef +.align 4 +__ecp_nistz256_sub_from: + ldp x8,x9,[x2] + ldp x10,x11,[x2,#16] + subs x14,x14,x8 // ret = a-b + sbcs x15,x15,x9 + sbcs x16,x16,x10 + sbcs x17,x17,x11 + sbc x1,xzr,xzr // zap x1 + + subs x8,x14,#1 // adds x8,x4,#-1 // tmp = ret+modulus + adcs x9,x15,x12 + adcs x10,x16,xzr + adc x11,x17,x13 + cmp x1,xzr // did subtraction borrow? + + csel x14,x14,x8,eq // ret = borrow ? ret+modulus : ret + csel x15,x15,x9,eq + csel x16,x16,x10,eq + stp x14,x15,[x0] + csel x17,x17,x11,eq + stp x16,x17,[x0,#16] + + ret + + +.def __ecp_nistz256_sub_morf + .type 32 +.endef +.align 4 +__ecp_nistz256_sub_morf: + ldp x8,x9,[x2] + ldp x10,x11,[x2,#16] + subs x14,x8,x14 // ret = b-a + sbcs x15,x9,x15 + sbcs x16,x10,x16 + sbcs x17,x11,x17 + sbc x1,xzr,xzr // zap x1 + + subs x8,x14,#1 // adds x8,x4,#-1 // tmp = ret+modulus + adcs x9,x15,x12 + adcs x10,x16,xzr + adc x11,x17,x13 + cmp x1,xzr // did subtraction borrow? + + csel x14,x14,x8,eq // ret = borrow ? ret+modulus : ret + csel x15,x15,x9,eq + csel x16,x16,x10,eq + stp x14,x15,[x0] + csel x17,x17,x11,eq + stp x16,x17,[x0,#16] + + ret + + +.def __ecp_nistz256_div_by_2 + .type 32 +.endef +.align 4 +__ecp_nistz256_div_by_2: + subs x8,x14,#1 // adds x8,x4,#-1 // tmp = a+modulus + adcs x9,x15,x12 + adcs x10,x16,xzr + adcs x11,x17,x13 + adc x1,xzr,xzr // zap x1 + tst x14,#1 // is a even? + + csel x14,x14,x8,eq // ret = even ? a : a+modulus + csel x15,x15,x9,eq + csel x16,x16,x10,eq + csel x17,x17,x11,eq + csel x1,xzr,x1,eq + + lsr x14,x14,#1 // ret >>= 1 + orr x14,x14,x15,lsl#63 + lsr x15,x15,#1 + orr x15,x15,x16,lsl#63 + lsr x16,x16,#1 + orr x16,x16,x17,lsl#63 + lsr x17,x17,#1 + stp x14,x15,[x0] + orr x17,x17,x1,lsl#63 + stp x16,x17,[x0,#16] + + ret + +.globl ecp_nistz256_point_double +.def ecp_nistz256_point_double + .type 32 +.endef +.align 5 +ecp_nistz256_point_double: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-96]! + add x29,sp,#0 + stp x19,x20,[sp,#16] + stp x21,x22,[sp,#32] + sub sp,sp,#32*4 + +Ldouble_shortcut: + ldp x14,x15,[x1,#32] + mov x21,x0 + ldp x16,x17,[x1,#48] + mov x22,x1 + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + mov x8,x14 + ldr x13,[x13,#24] + mov x9,x15 + ldp x4,x5,[x22,#64] // forward load for p256_sqr_mont + mov x10,x16 + mov x11,x17 + ldp x6,x7,[x22,#64+16] + add x0,sp,#0 + bl __ecp_nistz256_add // p256_mul_by_2(S, in_y); + + add x0,sp,#64 + bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Zsqr, in_z); + + ldp x8,x9,[x22] + ldp x10,x11,[x22,#16] + mov x4,x14 // put Zsqr aside for p256_sub + mov x5,x15 + mov x6,x16 + mov x7,x17 + add x0,sp,#32 + bl __ecp_nistz256_add // p256_add(M, Zsqr, in_x); + + add x2,x22,#0 + mov x14,x4 // restore Zsqr + mov x15,x5 + ldp x4,x5,[sp,#0] // forward load for p256_sqr_mont + mov x16,x6 + mov x17,x7 + ldp x6,x7,[sp,#0+16] + add x0,sp,#64 + bl __ecp_nistz256_sub_morf // p256_sub(Zsqr, in_x, Zsqr); + + add x0,sp,#0 + bl __ecp_nistz256_sqr_mont // p256_sqr_mont(S, S); + + ldr x3,[x22,#32] + ldp x4,x5,[x22,#64] + ldp x6,x7,[x22,#64+16] + add x2,x22,#32 + add x0,sp,#96 + bl __ecp_nistz256_mul_mont // p256_mul_mont(tmp0, in_z, in_y); + + mov x8,x14 + mov x9,x15 + ldp x4,x5,[sp,#0] // forward load for p256_sqr_mont + mov x10,x16 + mov x11,x17 + ldp x6,x7,[sp,#0+16] + add x0,x21,#64 + bl __ecp_nistz256_add // p256_mul_by_2(res_z, tmp0); + + add x0,sp,#96 + bl __ecp_nistz256_sqr_mont // p256_sqr_mont(tmp0, S); + + ldr x3,[sp,#64] // forward load for p256_mul_mont + ldp x4,x5,[sp,#32] + ldp x6,x7,[sp,#32+16] + add x0,x21,#32 + bl __ecp_nistz256_div_by_2 // p256_div_by_2(res_y, tmp0); + + add x2,sp,#64 + add x0,sp,#32 + bl __ecp_nistz256_mul_mont // p256_mul_mont(M, M, Zsqr); + + mov x8,x14 // duplicate M + mov x9,x15 + mov x10,x16 + mov x11,x17 + mov x4,x14 // put M aside + mov x5,x15 + mov x6,x16 + mov x7,x17 + add x0,sp,#32 + bl __ecp_nistz256_add + mov x8,x4 // restore M + mov x9,x5 + ldr x3,[x22] // forward load for p256_mul_mont + mov x10,x6 + ldp x4,x5,[sp,#0] + mov x11,x7 + ldp x6,x7,[sp,#0+16] + bl __ecp_nistz256_add // p256_mul_by_3(M, M); + + add x2,x22,#0 + add x0,sp,#0 + bl __ecp_nistz256_mul_mont // p256_mul_mont(S, S, in_x); + + mov x8,x14 + mov x9,x15 + ldp x4,x5,[sp,#32] // forward load for p256_sqr_mont + mov x10,x16 + mov x11,x17 + ldp x6,x7,[sp,#32+16] + add x0,sp,#96 + bl __ecp_nistz256_add // p256_mul_by_2(tmp0, S); + + add x0,x21,#0 + bl __ecp_nistz256_sqr_mont // p256_sqr_mont(res_x, M); + + add x2,sp,#96 + bl __ecp_nistz256_sub_from // p256_sub(res_x, res_x, tmp0); + + add x2,sp,#0 + add x0,sp,#0 + bl __ecp_nistz256_sub_morf // p256_sub(S, S, res_x); + + ldr x3,[sp,#32] + mov x4,x14 // copy S + mov x5,x15 + mov x6,x16 + mov x7,x17 + add x2,sp,#32 + bl __ecp_nistz256_mul_mont // p256_mul_mont(S, S, M); + + add x2,x21,#32 + add x0,x21,#32 + bl __ecp_nistz256_sub_from // p256_sub(res_y, S, res_y); + + add sp,x29,#0 // destroy frame + ldp x19,x20,[x29,#16] + ldp x21,x22,[x29,#32] + ldp x29,x30,[sp],#96 + AARCH64_VALIDATE_LINK_REGISTER + ret + +.globl ecp_nistz256_point_add +.def ecp_nistz256_point_add + .type 32 +.endef +.align 5 +ecp_nistz256_point_add: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-96]! + add x29,sp,#0 + stp x19,x20,[sp,#16] + stp x21,x22,[sp,#32] + stp x23,x24,[sp,#48] + stp x25,x26,[sp,#64] + stp x27,x28,[sp,#80] + sub sp,sp,#32*12 + + ldp x4,x5,[x2,#64] // in2_z + ldp x6,x7,[x2,#64+16] + mov x21,x0 + mov x22,x1 + mov x23,x2 + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] + orr x8,x4,x5 + orr x10,x6,x7 + orr x25,x8,x10 + cmp x25,#0 + csetm x25,ne // ~in2infty + add x0,sp,#192 + bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Z2sqr, in2_z); + + ldp x4,x5,[x22,#64] // in1_z + ldp x6,x7,[x22,#64+16] + orr x8,x4,x5 + orr x10,x6,x7 + orr x24,x8,x10 + cmp x24,#0 + csetm x24,ne // ~in1infty + add x0,sp,#128 + bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Z1sqr, in1_z); + + ldr x3,[x23,#64] + ldp x4,x5,[sp,#192] + ldp x6,x7,[sp,#192+16] + add x2,x23,#64 + add x0,sp,#320 + bl __ecp_nistz256_mul_mont // p256_mul_mont(S1, Z2sqr, in2_z); + + ldr x3,[x22,#64] + ldp x4,x5,[sp,#128] + ldp x6,x7,[sp,#128+16] + add x2,x22,#64 + add x0,sp,#352 + bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, Z1sqr, in1_z); + + ldr x3,[x22,#32] + ldp x4,x5,[sp,#320] + ldp x6,x7,[sp,#320+16] + add x2,x22,#32 + add x0,sp,#320 + bl __ecp_nistz256_mul_mont // p256_mul_mont(S1, S1, in1_y); + + ldr x3,[x23,#32] + ldp x4,x5,[sp,#352] + ldp x6,x7,[sp,#352+16] + add x2,x23,#32 + add x0,sp,#352 + bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, S2, in2_y); + + add x2,sp,#320 + ldr x3,[sp,#192] // forward load for p256_mul_mont + ldp x4,x5,[x22] + ldp x6,x7,[x22,#16] + add x0,sp,#160 + bl __ecp_nistz256_sub_from // p256_sub(R, S2, S1); + + orr x14,x14,x15 // see if result is zero + orr x16,x16,x17 + orr x26,x14,x16 // ~is_equal(S1,S2) + + add x2,sp,#192 + add x0,sp,#256 + bl __ecp_nistz256_mul_mont // p256_mul_mont(U1, in1_x, Z2sqr); + + ldr x3,[sp,#128] + ldp x4,x5,[x23] + ldp x6,x7,[x23,#16] + add x2,sp,#128 + add x0,sp,#288 + bl __ecp_nistz256_mul_mont // p256_mul_mont(U2, in2_x, Z1sqr); + + add x2,sp,#256 + ldp x4,x5,[sp,#160] // forward load for p256_sqr_mont + ldp x6,x7,[sp,#160+16] + add x0,sp,#96 + bl __ecp_nistz256_sub_from // p256_sub(H, U2, U1); + + orr x14,x14,x15 // see if result is zero + orr x16,x16,x17 + orr x14,x14,x16 // ~is_equal(U1,U2) + + mvn x27,x24 // -1/0 -> 0/-1 + mvn x28,x25 // -1/0 -> 0/-1 + orr x14,x14,x27 + orr x14,x14,x28 + orr x14,x14,x26 + cbnz x14,Ladd_proceed // if(~is_equal(U1,U2) | in1infty | in2infty | ~is_equal(S1,S2)) + +Ladd_double: + mov x1,x22 + mov x0,x21 + ldp x23,x24,[x29,#48] + ldp x25,x26,[x29,#64] + ldp x27,x28,[x29,#80] + add sp,sp,#32*(12-4) // difference in stack frames + b Ldouble_shortcut + +.align 4 +Ladd_proceed: + add x0,sp,#192 + bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Rsqr, R); + + ldr x3,[x22,#64] + ldp x4,x5,[sp,#96] + ldp x6,x7,[sp,#96+16] + add x2,x22,#64 + add x0,sp,#64 + bl __ecp_nistz256_mul_mont // p256_mul_mont(res_z, H, in1_z); + + ldp x4,x5,[sp,#96] + ldp x6,x7,[sp,#96+16] + add x0,sp,#128 + bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Hsqr, H); + + ldr x3,[x23,#64] + ldp x4,x5,[sp,#64] + ldp x6,x7,[sp,#64+16] + add x2,x23,#64 + add x0,sp,#64 + bl __ecp_nistz256_mul_mont // p256_mul_mont(res_z, res_z, in2_z); + + ldr x3,[sp,#96] + ldp x4,x5,[sp,#128] + ldp x6,x7,[sp,#128+16] + add x2,sp,#96 + add x0,sp,#224 + bl __ecp_nistz256_mul_mont // p256_mul_mont(Hcub, Hsqr, H); + + ldr x3,[sp,#128] + ldp x4,x5,[sp,#256] + ldp x6,x7,[sp,#256+16] + add x2,sp,#128 + add x0,sp,#288 + bl __ecp_nistz256_mul_mont // p256_mul_mont(U2, U1, Hsqr); + + mov x8,x14 + mov x9,x15 + mov x10,x16 + mov x11,x17 + add x0,sp,#128 + bl __ecp_nistz256_add // p256_mul_by_2(Hsqr, U2); + + add x2,sp,#192 + add x0,sp,#0 + bl __ecp_nistz256_sub_morf // p256_sub(res_x, Rsqr, Hsqr); + + add x2,sp,#224 + bl __ecp_nistz256_sub_from // p256_sub(res_x, res_x, Hcub); + + add x2,sp,#288 + ldr x3,[sp,#224] // forward load for p256_mul_mont + ldp x4,x5,[sp,#320] + ldp x6,x7,[sp,#320+16] + add x0,sp,#32 + bl __ecp_nistz256_sub_morf // p256_sub(res_y, U2, res_x); + + add x2,sp,#224 + add x0,sp,#352 + bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, S1, Hcub); + + ldr x3,[sp,#160] + ldp x4,x5,[sp,#32] + ldp x6,x7,[sp,#32+16] + add x2,sp,#160 + add x0,sp,#32 + bl __ecp_nistz256_mul_mont // p256_mul_mont(res_y, res_y, R); + + add x2,sp,#352 + bl __ecp_nistz256_sub_from // p256_sub(res_y, res_y, S2); + + ldp x4,x5,[sp,#0] // res + ldp x6,x7,[sp,#0+16] + ldp x8,x9,[x23] // in2 + ldp x10,x11,[x23,#16] + ldp x14,x15,[x22,#0] // in1 + cmp x24,#0 // ~, remember? + ldp x16,x17,[x22,#0+16] + csel x8,x4,x8,ne + csel x9,x5,x9,ne + ldp x4,x5,[sp,#0+0+32] // res + csel x10,x6,x10,ne + csel x11,x7,x11,ne + cmp x25,#0 // ~, remember? + ldp x6,x7,[sp,#0+0+48] + csel x14,x8,x14,ne + csel x15,x9,x15,ne + ldp x8,x9,[x23,#0+32] // in2 + csel x16,x10,x16,ne + csel x17,x11,x17,ne + ldp x10,x11,[x23,#0+48] + stp x14,x15,[x21,#0] + stp x16,x17,[x21,#0+16] + ldp x14,x15,[x22,#32] // in1 + cmp x24,#0 // ~, remember? + ldp x16,x17,[x22,#32+16] + csel x8,x4,x8,ne + csel x9,x5,x9,ne + ldp x4,x5,[sp,#0+32+32] // res + csel x10,x6,x10,ne + csel x11,x7,x11,ne + cmp x25,#0 // ~, remember? + ldp x6,x7,[sp,#0+32+48] + csel x14,x8,x14,ne + csel x15,x9,x15,ne + ldp x8,x9,[x23,#32+32] // in2 + csel x16,x10,x16,ne + csel x17,x11,x17,ne + ldp x10,x11,[x23,#32+48] + stp x14,x15,[x21,#32] + stp x16,x17,[x21,#32+16] + ldp x14,x15,[x22,#64] // in1 + cmp x24,#0 // ~, remember? + ldp x16,x17,[x22,#64+16] + csel x8,x4,x8,ne + csel x9,x5,x9,ne + csel x10,x6,x10,ne + csel x11,x7,x11,ne + cmp x25,#0 // ~, remember? + csel x14,x8,x14,ne + csel x15,x9,x15,ne + csel x16,x10,x16,ne + csel x17,x11,x17,ne + stp x14,x15,[x21,#64] + stp x16,x17,[x21,#64+16] + +Ladd_done: + add sp,x29,#0 // destroy frame + ldp x19,x20,[x29,#16] + ldp x21,x22,[x29,#32] + ldp x23,x24,[x29,#48] + ldp x25,x26,[x29,#64] + ldp x27,x28,[x29,#80] + ldp x29,x30,[sp],#96 + AARCH64_VALIDATE_LINK_REGISTER + ret + +.globl ecp_nistz256_point_add_affine +.def ecp_nistz256_point_add_affine + .type 32 +.endef +.align 5 +ecp_nistz256_point_add_affine: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-80]! + add x29,sp,#0 + stp x19,x20,[sp,#16] + stp x21,x22,[sp,#32] + stp x23,x24,[sp,#48] + stp x25,x26,[sp,#64] + sub sp,sp,#32*10 + + mov x21,x0 + mov x22,x1 + mov x23,x2 + adrp x13,Lpoly + add x13,x13,:lo12:Lpoly + ldr x12,[x13,#8] + ldr x13,[x13,#24] + + ldp x4,x5,[x1,#64] // in1_z + ldp x6,x7,[x1,#64+16] + orr x8,x4,x5 + orr x10,x6,x7 + orr x24,x8,x10 + cmp x24,#0 + csetm x24,ne // ~in1infty + + ldp x14,x15,[x2] // in2_x + ldp x16,x17,[x2,#16] + ldp x8,x9,[x2,#32] // in2_y + ldp x10,x11,[x2,#48] + orr x14,x14,x15 + orr x16,x16,x17 + orr x8,x8,x9 + orr x10,x10,x11 + orr x14,x14,x16 + orr x8,x8,x10 + orr x25,x14,x8 + cmp x25,#0 + csetm x25,ne // ~in2infty + + add x0,sp,#128 + bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Z1sqr, in1_z); + + mov x4,x14 + mov x5,x15 + mov x6,x16 + mov x7,x17 + ldr x3,[x23] + add x2,x23,#0 + add x0,sp,#96 + bl __ecp_nistz256_mul_mont // p256_mul_mont(U2, Z1sqr, in2_x); + + add x2,x22,#0 + ldr x3,[x22,#64] // forward load for p256_mul_mont + ldp x4,x5,[sp,#128] + ldp x6,x7,[sp,#128+16] + add x0,sp,#160 + bl __ecp_nistz256_sub_from // p256_sub(H, U2, in1_x); + + add x2,x22,#64 + add x0,sp,#128 + bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, Z1sqr, in1_z); + + ldr x3,[x22,#64] + ldp x4,x5,[sp,#160] + ldp x6,x7,[sp,#160+16] + add x2,x22,#64 + add x0,sp,#64 + bl __ecp_nistz256_mul_mont // p256_mul_mont(res_z, H, in1_z); + + ldr x3,[x23,#32] + ldp x4,x5,[sp,#128] + ldp x6,x7,[sp,#128+16] + add x2,x23,#32 + add x0,sp,#128 + bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, S2, in2_y); + + add x2,x22,#32 + ldp x4,x5,[sp,#160] // forward load for p256_sqr_mont + ldp x6,x7,[sp,#160+16] + add x0,sp,#192 + bl __ecp_nistz256_sub_from // p256_sub(R, S2, in1_y); + + add x0,sp,#224 + bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Hsqr, H); + + ldp x4,x5,[sp,#192] + ldp x6,x7,[sp,#192+16] + add x0,sp,#288 + bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Rsqr, R); + + ldr x3,[sp,#160] + ldp x4,x5,[sp,#224] + ldp x6,x7,[sp,#224+16] + add x2,sp,#160 + add x0,sp,#256 + bl __ecp_nistz256_mul_mont // p256_mul_mont(Hcub, Hsqr, H); + + ldr x3,[x22] + ldp x4,x5,[sp,#224] + ldp x6,x7,[sp,#224+16] + add x2,x22,#0 + add x0,sp,#96 + bl __ecp_nistz256_mul_mont // p256_mul_mont(U2, in1_x, Hsqr); + + mov x8,x14 + mov x9,x15 + mov x10,x16 + mov x11,x17 + add x0,sp,#224 + bl __ecp_nistz256_add // p256_mul_by_2(Hsqr, U2); + + add x2,sp,#288 + add x0,sp,#0 + bl __ecp_nistz256_sub_morf // p256_sub(res_x, Rsqr, Hsqr); + + add x2,sp,#256 + bl __ecp_nistz256_sub_from // p256_sub(res_x, res_x, Hcub); + + add x2,sp,#96 + ldr x3,[x22,#32] // forward load for p256_mul_mont + ldp x4,x5,[sp,#256] + ldp x6,x7,[sp,#256+16] + add x0,sp,#32 + bl __ecp_nistz256_sub_morf // p256_sub(res_y, U2, res_x); + + add x2,x22,#32 + add x0,sp,#128 + bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, in1_y, Hcub); + + ldr x3,[sp,#192] + ldp x4,x5,[sp,#32] + ldp x6,x7,[sp,#32+16] + add x2,sp,#192 + add x0,sp,#32 + bl __ecp_nistz256_mul_mont // p256_mul_mont(res_y, res_y, R); + + add x2,sp,#128 + bl __ecp_nistz256_sub_from // p256_sub(res_y, res_y, S2); + + ldp x4,x5,[sp,#0] // res + ldp x6,x7,[sp,#0+16] + ldp x8,x9,[x23] // in2 + ldp x10,x11,[x23,#16] + ldp x14,x15,[x22,#0] // in1 + cmp x24,#0 // ~, remember? + ldp x16,x17,[x22,#0+16] + csel x8,x4,x8,ne + csel x9,x5,x9,ne + ldp x4,x5,[sp,#0+0+32] // res + csel x10,x6,x10,ne + csel x11,x7,x11,ne + cmp x25,#0 // ~, remember? + ldp x6,x7,[sp,#0+0+48] + csel x14,x8,x14,ne + csel x15,x9,x15,ne + ldp x8,x9,[x23,#0+32] // in2 + csel x16,x10,x16,ne + csel x17,x11,x17,ne + ldp x10,x11,[x23,#0+48] + stp x14,x15,[x21,#0] + stp x16,x17,[x21,#0+16] + adrp x23,Lone_mont-64 + add x23,x23,:lo12:Lone_mont-64 + ldp x14,x15,[x22,#32] // in1 + cmp x24,#0 // ~, remember? + ldp x16,x17,[x22,#32+16] + csel x8,x4,x8,ne + csel x9,x5,x9,ne + ldp x4,x5,[sp,#0+32+32] // res + csel x10,x6,x10,ne + csel x11,x7,x11,ne + cmp x25,#0 // ~, remember? + ldp x6,x7,[sp,#0+32+48] + csel x14,x8,x14,ne + csel x15,x9,x15,ne + ldp x8,x9,[x23,#32+32] // in2 + csel x16,x10,x16,ne + csel x17,x11,x17,ne + ldp x10,x11,[x23,#32+48] + stp x14,x15,[x21,#32] + stp x16,x17,[x21,#32+16] + ldp x14,x15,[x22,#64] // in1 + cmp x24,#0 // ~, remember? + ldp x16,x17,[x22,#64+16] + csel x8,x4,x8,ne + csel x9,x5,x9,ne + csel x10,x6,x10,ne + csel x11,x7,x11,ne + cmp x25,#0 // ~, remember? + csel x14,x8,x14,ne + csel x15,x9,x15,ne + csel x16,x10,x16,ne + csel x17,x11,x17,ne + stp x14,x15,[x21,#64] + stp x16,x17,[x21,#64+16] + + add sp,x29,#0 // destroy frame + ldp x19,x20,[x29,#16] + ldp x21,x22,[x29,#32] + ldp x23,x24,[x29,#48] + ldp x25,x26,[x29,#64] + ldp x29,x30,[sp],#80 + AARCH64_VALIDATE_LINK_REGISTER + ret + +//////////////////////////////////////////////////////////////////////// +// void ecp_nistz256_ord_mul_mont(uint64_t res[4], uint64_t a[4], +// uint64_t b[4]); +.globl ecp_nistz256_ord_mul_mont +.def ecp_nistz256_ord_mul_mont + .type 32 +.endef +.align 4 +ecp_nistz256_ord_mul_mont: + AARCH64_VALID_CALL_TARGET + // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. + stp x29,x30,[sp,#-64]! + add x29,sp,#0 + stp x19,x20,[sp,#16] + stp x21,x22,[sp,#32] + stp x23,x24,[sp,#48] + + adrp x23,Lord + add x23,x23,:lo12:Lord + ldr x3,[x2] // bp[0] + ldp x4,x5,[x1] + ldp x6,x7,[x1,#16] + + ldp x12,x13,[x23,#0] + ldp x21,x22,[x23,#16] + ldr x23,[x23,#32] + + mul x14,x4,x3 // a[0]*b[0] + umulh x8,x4,x3 + + mul x15,x5,x3 // a[1]*b[0] + umulh x9,x5,x3 + + mul x16,x6,x3 // a[2]*b[0] + umulh x10,x6,x3 + + mul x17,x7,x3 // a[3]*b[0] + umulh x19,x7,x3 + + mul x24,x14,x23 + + adds x15,x15,x8 // accumulate high parts of multiplication + adcs x16,x16,x9 + adcs x17,x17,x10 + adc x19,x19,xzr + mov x20,xzr + ldr x3,[x2,#8*1] // b[i] + + lsl x8,x24,#32 + subs x16,x16,x24 + lsr x9,x24,#32 + sbcs x17,x17,x8 + sbcs x19,x19,x9 + sbc x20,x20,xzr + + subs xzr,x14,#1 + umulh x9,x12,x24 + mul x10,x13,x24 + umulh x11,x13,x24 + + adcs x10,x10,x9 + mul x8,x4,x3 + adc x11,x11,xzr + mul x9,x5,x3 + + adds x14,x15,x10 + mul x10,x6,x3 + adcs x15,x16,x11 + mul x11,x7,x3 + adcs x16,x17,x24 + adcs x17,x19,x24 + adc x19,x20,xzr + + adds x14,x14,x8 // accumulate low parts + umulh x8,x4,x3 + adcs x15,x15,x9 + umulh x9,x5,x3 + adcs x16,x16,x10 + umulh x10,x6,x3 + adcs x17,x17,x11 + umulh x11,x7,x3 + adc x19,x19,xzr + mul x24,x14,x23 + adds x15,x15,x8 // accumulate high parts + adcs x16,x16,x9 + adcs x17,x17,x10 + adcs x19,x19,x11 + adc x20,xzr,xzr + ldr x3,[x2,#8*2] // b[i] + + lsl x8,x24,#32 + subs x16,x16,x24 + lsr x9,x24,#32 + sbcs x17,x17,x8 + sbcs x19,x19,x9 + sbc x20,x20,xzr + + subs xzr,x14,#1 + umulh x9,x12,x24 + mul x10,x13,x24 + umulh x11,x13,x24 + + adcs x10,x10,x9 + mul x8,x4,x3 + adc x11,x11,xzr + mul x9,x5,x3 + + adds x14,x15,x10 + mul x10,x6,x3 + adcs x15,x16,x11 + mul x11,x7,x3 + adcs x16,x17,x24 + adcs x17,x19,x24 + adc x19,x20,xzr + + adds x14,x14,x8 // accumulate low parts + umulh x8,x4,x3 + adcs x15,x15,x9 + umulh x9,x5,x3 + adcs x16,x16,x10 + umulh x10,x6,x3 + adcs x17,x17,x11 + umulh x11,x7,x3 + adc x19,x19,xzr + mul x24,x14,x23 + adds x15,x15,x8 // accumulate high parts + adcs x16,x16,x9 + adcs x17,x17,x10 + adcs x19,x19,x11 + adc x20,xzr,xzr + ldr x3,[x2,#8*3] // b[i] + + lsl x8,x24,#32 + subs x16,x16,x24 + lsr x9,x24,#32 + sbcs x17,x17,x8 + sbcs x19,x19,x9 + sbc x20,x20,xzr + + subs xzr,x14,#1 + umulh x9,x12,x24 + mul x10,x13,x24 + umulh x11,x13,x24 + + adcs x10,x10,x9 + mul x8,x4,x3 + adc x11,x11,xzr + mul x9,x5,x3 + + adds x14,x15,x10 + mul x10,x6,x3 + adcs x15,x16,x11 + mul x11,x7,x3 + adcs x16,x17,x24 + adcs x17,x19,x24 + adc x19,x20,xzr + + adds x14,x14,x8 // accumulate low parts + umulh x8,x4,x3 + adcs x15,x15,x9 + umulh x9,x5,x3 + adcs x16,x16,x10 + umulh x10,x6,x3 + adcs x17,x17,x11 + umulh x11,x7,x3 + adc x19,x19,xzr + mul x24,x14,x23 + adds x15,x15,x8 // accumulate high parts + adcs x16,x16,x9 + adcs x17,x17,x10 + adcs x19,x19,x11 + adc x20,xzr,xzr + lsl x8,x24,#32 // last reduction + subs x16,x16,x24 + lsr x9,x24,#32 + sbcs x17,x17,x8 + sbcs x19,x19,x9 + sbc x20,x20,xzr + + subs xzr,x14,#1 + umulh x9,x12,x24 + mul x10,x13,x24 + umulh x11,x13,x24 + + adcs x10,x10,x9 + adc x11,x11,xzr + + adds x14,x15,x10 + adcs x15,x16,x11 + adcs x16,x17,x24 + adcs x17,x19,x24 + adc x19,x20,xzr + + subs x8,x14,x12 // ret -= modulus + sbcs x9,x15,x13 + sbcs x10,x16,x21 + sbcs x11,x17,x22 + sbcs xzr,x19,xzr + + csel x14,x14,x8,lo // ret = borrow ? ret : ret-modulus + csel x15,x15,x9,lo + csel x16,x16,x10,lo + stp x14,x15,[x0] + csel x17,x17,x11,lo + stp x16,x17,[x0,#16] + + ldp x19,x20,[sp,#16] + ldp x21,x22,[sp,#32] + ldp x23,x24,[sp,#48] + ldr x29,[sp],#64 + ret + + +//////////////////////////////////////////////////////////////////////// +// void ecp_nistz256_ord_sqr_mont(uint64_t res[4], uint64_t a[4], +// uint64_t rep); +.globl ecp_nistz256_ord_sqr_mont +.def ecp_nistz256_ord_sqr_mont + .type 32 +.endef +.align 4 +ecp_nistz256_ord_sqr_mont: + AARCH64_VALID_CALL_TARGET + // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. + stp x29,x30,[sp,#-64]! + add x29,sp,#0 + stp x19,x20,[sp,#16] + stp x21,x22,[sp,#32] + stp x23,x24,[sp,#48] + + adrp x23,Lord + add x23,x23,:lo12:Lord + ldp x4,x5,[x1] + ldp x6,x7,[x1,#16] + + ldp x12,x13,[x23,#0] + ldp x21,x22,[x23,#16] + ldr x23,[x23,#32] + b Loop_ord_sqr + +.align 4 +Loop_ord_sqr: + sub x2,x2,#1 + //////////////////////////////////////////////////////////////// + // | | | | | |a1*a0| | + // | | | | |a2*a0| | | + // | |a3*a2|a3*a0| | | | + // | | | |a2*a1| | | | + // | | |a3*a1| | | | | + // *| | | | | | | | 2| + // +|a3*a3|a2*a2|a1*a1|a0*a0| + // |--+--+--+--+--+--+--+--| + // |A7|A6|A5|A4|A3|A2|A1|A0|, where Ax is , i.e. follow + // + // "can't overflow" below mark carrying into high part of + // multiplication result, which can't overflow, because it + // can never be all ones. + + mul x15,x5,x4 // a[1]*a[0] + umulh x9,x5,x4 + mul x16,x6,x4 // a[2]*a[0] + umulh x10,x6,x4 + mul x17,x7,x4 // a[3]*a[0] + umulh x19,x7,x4 + + adds x16,x16,x9 // accumulate high parts of multiplication + mul x8,x6,x5 // a[2]*a[1] + umulh x9,x6,x5 + adcs x17,x17,x10 + mul x10,x7,x5 // a[3]*a[1] + umulh x11,x7,x5 + adc x19,x19,xzr // can't overflow + + mul x20,x7,x6 // a[3]*a[2] + umulh x1,x7,x6 + + adds x9,x9,x10 // accumulate high parts of multiplication + mul x14,x4,x4 // a[0]*a[0] + adc x10,x11,xzr // can't overflow + + adds x17,x17,x8 // accumulate low parts of multiplication + umulh x4,x4,x4 + adcs x19,x19,x9 + mul x9,x5,x5 // a[1]*a[1] + adcs x20,x20,x10 + umulh x5,x5,x5 + adc x1,x1,xzr // can't overflow + + adds x15,x15,x15 // acc[1-6]*=2 + mul x10,x6,x6 // a[2]*a[2] + adcs x16,x16,x16 + umulh x6,x6,x6 + adcs x17,x17,x17 + mul x11,x7,x7 // a[3]*a[3] + adcs x19,x19,x19 + umulh x7,x7,x7 + adcs x20,x20,x20 + adcs x1,x1,x1 + adc x3,xzr,xzr + + adds x15,x15,x4 // +a[i]*a[i] + mul x24,x14,x23 + adcs x16,x16,x9 + adcs x17,x17,x5 + adcs x19,x19,x10 + adcs x20,x20,x6 + adcs x1,x1,x11 + adc x3,x3,x7 + subs xzr,x14,#1 + umulh x9,x12,x24 + mul x10,x13,x24 + umulh x11,x13,x24 + + adcs x10,x10,x9 + adc x11,x11,xzr + + adds x14,x15,x10 + adcs x15,x16,x11 + adcs x16,x17,x24 + adc x17,xzr,x24 // can't overflow + mul x11,x14,x23 + lsl x8,x24,#32 + subs x15,x15,x24 + lsr x9,x24,#32 + sbcs x16,x16,x8 + sbc x17,x17,x9 // can't borrow + subs xzr,x14,#1 + umulh x9,x12,x11 + mul x10,x13,x11 + umulh x24,x13,x11 + + adcs x10,x10,x9 + adc x24,x24,xzr + + adds x14,x15,x10 + adcs x15,x16,x24 + adcs x16,x17,x11 + adc x17,xzr,x11 // can't overflow + mul x24,x14,x23 + lsl x8,x11,#32 + subs x15,x15,x11 + lsr x9,x11,#32 + sbcs x16,x16,x8 + sbc x17,x17,x9 // can't borrow + subs xzr,x14,#1 + umulh x9,x12,x24 + mul x10,x13,x24 + umulh x11,x13,x24 + + adcs x10,x10,x9 + adc x11,x11,xzr + + adds x14,x15,x10 + adcs x15,x16,x11 + adcs x16,x17,x24 + adc x17,xzr,x24 // can't overflow + mul x11,x14,x23 + lsl x8,x24,#32 + subs x15,x15,x24 + lsr x9,x24,#32 + sbcs x16,x16,x8 + sbc x17,x17,x9 // can't borrow + subs xzr,x14,#1 + umulh x9,x12,x11 + mul x10,x13,x11 + umulh x24,x13,x11 + + adcs x10,x10,x9 + adc x24,x24,xzr + + adds x14,x15,x10 + adcs x15,x16,x24 + adcs x16,x17,x11 + adc x17,xzr,x11 // can't overflow + lsl x8,x11,#32 + subs x15,x15,x11 + lsr x9,x11,#32 + sbcs x16,x16,x8 + sbc x17,x17,x9 // can't borrow + adds x14,x14,x19 // accumulate upper half + adcs x15,x15,x20 + adcs x16,x16,x1 + adcs x17,x17,x3 + adc x19,xzr,xzr + + subs x8,x14,x12 // ret -= modulus + sbcs x9,x15,x13 + sbcs x10,x16,x21 + sbcs x11,x17,x22 + sbcs xzr,x19,xzr + + csel x4,x14,x8,lo // ret = borrow ? ret : ret-modulus + csel x5,x15,x9,lo + csel x6,x16,x10,lo + csel x7,x17,x11,lo + + cbnz x2,Loop_ord_sqr + + stp x4,x5,[x0] + stp x6,x7,[x0,#16] + + ldp x19,x20,[sp,#16] + ldp x21,x22,[sp,#32] + ldp x23,x24,[sp,#48] + ldr x29,[sp],#64 + ret + +// void ecp_nistz256_scatter_w5(void *x0,const P256_POINT *x1, +// int x2); +.globl ecp_nistz256_scatter_w5 +.def ecp_nistz256_scatter_w5 + .type 32 +.endef +.align 4 +ecp_nistz256_scatter_w5: + AARCH64_VALID_CALL_TARGET + // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + + add x0,x0,x2,lsl#2 + + ldp x4,x5,[x1] // X + ldp x6,x7,[x1,#16] + stur w4,[x0,#64*0-4] + lsr x4,x4,#32 + str w5,[x0,#64*1-4] + lsr x5,x5,#32 + str w6,[x0,#64*2-4] + lsr x6,x6,#32 + str w7,[x0,#64*3-4] + lsr x7,x7,#32 + str w4,[x0,#64*4-4] + str w5,[x0,#64*5-4] + str w6,[x0,#64*6-4] + str w7,[x0,#64*7-4] + add x0,x0,#64*8 + + ldp x4,x5,[x1,#32] // Y + ldp x6,x7,[x1,#48] + stur w4,[x0,#64*0-4] + lsr x4,x4,#32 + str w5,[x0,#64*1-4] + lsr x5,x5,#32 + str w6,[x0,#64*2-4] + lsr x6,x6,#32 + str w7,[x0,#64*3-4] + lsr x7,x7,#32 + str w4,[x0,#64*4-4] + str w5,[x0,#64*5-4] + str w6,[x0,#64*6-4] + str w7,[x0,#64*7-4] + add x0,x0,#64*8 + + ldp x4,x5,[x1,#64] // Z + ldp x6,x7,[x1,#80] + stur w4,[x0,#64*0-4] + lsr x4,x4,#32 + str w5,[x0,#64*1-4] + lsr x5,x5,#32 + str w6,[x0,#64*2-4] + lsr x6,x6,#32 + str w7,[x0,#64*3-4] + lsr x7,x7,#32 + str w4,[x0,#64*4-4] + str w5,[x0,#64*5-4] + str w6,[x0,#64*6-4] + str w7,[x0,#64*7-4] + + ldr x29,[sp],#16 + ret + + +// void ecp_nistz256_gather_w5(P256_POINT *x0,const void *x1, +// int x2); +.globl ecp_nistz256_gather_w5 +.def ecp_nistz256_gather_w5 + .type 32 +.endef +.align 4 +ecp_nistz256_gather_w5: + AARCH64_VALID_CALL_TARGET + // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + + cmp x2,xzr + csetm x3,ne + add x2,x2,x3 + add x1,x1,x2,lsl#2 + + ldr w4,[x1,#64*0] + ldr w5,[x1,#64*1] + ldr w6,[x1,#64*2] + ldr w7,[x1,#64*3] + ldr w8,[x1,#64*4] + ldr w9,[x1,#64*5] + ldr w10,[x1,#64*6] + ldr w11,[x1,#64*7] + add x1,x1,#64*8 + orr x4,x4,x8,lsl#32 + orr x5,x5,x9,lsl#32 + orr x6,x6,x10,lsl#32 + orr x7,x7,x11,lsl#32 + csel x4,x4,xzr,ne + csel x5,x5,xzr,ne + csel x6,x6,xzr,ne + csel x7,x7,xzr,ne + stp x4,x5,[x0] // X + stp x6,x7,[x0,#16] + + ldr w4,[x1,#64*0] + ldr w5,[x1,#64*1] + ldr w6,[x1,#64*2] + ldr w7,[x1,#64*3] + ldr w8,[x1,#64*4] + ldr w9,[x1,#64*5] + ldr w10,[x1,#64*6] + ldr w11,[x1,#64*7] + add x1,x1,#64*8 + orr x4,x4,x8,lsl#32 + orr x5,x5,x9,lsl#32 + orr x6,x6,x10,lsl#32 + orr x7,x7,x11,lsl#32 + csel x4,x4,xzr,ne + csel x5,x5,xzr,ne + csel x6,x6,xzr,ne + csel x7,x7,xzr,ne + stp x4,x5,[x0,#32] // Y + stp x6,x7,[x0,#48] + + ldr w4,[x1,#64*0] + ldr w5,[x1,#64*1] + ldr w6,[x1,#64*2] + ldr w7,[x1,#64*3] + ldr w8,[x1,#64*4] + ldr w9,[x1,#64*5] + ldr w10,[x1,#64*6] + ldr w11,[x1,#64*7] + orr x4,x4,x8,lsl#32 + orr x5,x5,x9,lsl#32 + orr x6,x6,x10,lsl#32 + orr x7,x7,x11,lsl#32 + csel x4,x4,xzr,ne + csel x5,x5,xzr,ne + csel x6,x6,xzr,ne + csel x7,x7,xzr,ne + stp x4,x5,[x0,#64] // Z + stp x6,x7,[x0,#80] + + ldr x29,[sp],#16 + ret + + +// void ecp_nistz256_scatter_w7(void *x0,const P256_POINT_AFFINE *x1, +// int x2); +.globl ecp_nistz256_scatter_w7 +.def ecp_nistz256_scatter_w7 + .type 32 +.endef +.align 4 +ecp_nistz256_scatter_w7: + AARCH64_VALID_CALL_TARGET + // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + + add x0,x0,x2 + mov x2,#64/8 +Loop_scatter_w7: + ldr x3,[x1],#8 + subs x2,x2,#1 + prfm pstl1strm,[x0,#4096+64*0] + prfm pstl1strm,[x0,#4096+64*1] + prfm pstl1strm,[x0,#4096+64*2] + prfm pstl1strm,[x0,#4096+64*3] + prfm pstl1strm,[x0,#4096+64*4] + prfm pstl1strm,[x0,#4096+64*5] + prfm pstl1strm,[x0,#4096+64*6] + prfm pstl1strm,[x0,#4096+64*7] + strb w3,[x0,#64*0] + lsr x3,x3,#8 + strb w3,[x0,#64*1] + lsr x3,x3,#8 + strb w3,[x0,#64*2] + lsr x3,x3,#8 + strb w3,[x0,#64*3] + lsr x3,x3,#8 + strb w3,[x0,#64*4] + lsr x3,x3,#8 + strb w3,[x0,#64*5] + lsr x3,x3,#8 + strb w3,[x0,#64*6] + lsr x3,x3,#8 + strb w3,[x0,#64*7] + add x0,x0,#64*8 + b.ne Loop_scatter_w7 + + ldr x29,[sp],#16 + ret + + +// void ecp_nistz256_gather_w7(P256_POINT_AFFINE *x0,const void *x1, +// int x2); +.globl ecp_nistz256_gather_w7 +.def ecp_nistz256_gather_w7 + .type 32 +.endef +.align 4 +ecp_nistz256_gather_w7: + AARCH64_VALID_CALL_TARGET + // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + + cmp x2,xzr + csetm x3,ne + add x2,x2,x3 + add x1,x1,x2 + mov x2,#64/8 + nop +Loop_gather_w7: + ldrb w4,[x1,#64*0] + prfm pldl1strm,[x1,#4096+64*0] + subs x2,x2,#1 + ldrb w5,[x1,#64*1] + prfm pldl1strm,[x1,#4096+64*1] + ldrb w6,[x1,#64*2] + prfm pldl1strm,[x1,#4096+64*2] + ldrb w7,[x1,#64*3] + prfm pldl1strm,[x1,#4096+64*3] + ldrb w8,[x1,#64*4] + prfm pldl1strm,[x1,#4096+64*4] + ldrb w9,[x1,#64*5] + prfm pldl1strm,[x1,#4096+64*5] + ldrb w10,[x1,#64*6] + prfm pldl1strm,[x1,#4096+64*6] + ldrb w11,[x1,#64*7] + prfm pldl1strm,[x1,#4096+64*7] + add x1,x1,#64*8 + orr x4,x4,x5,lsl#8 + orr x6,x6,x7,lsl#8 + orr x8,x8,x9,lsl#8 + orr x4,x4,x6,lsl#16 + orr x10,x10,x11,lsl#8 + orr x4,x4,x8,lsl#32 + orr x4,x4,x10,lsl#48 + and x4,x4,x3 + str x4,[x0],#8 + b.ne Loop_gather_w7 + + ldr x29,[sp],#16 + ret + diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/md5/md5-aarch64.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/md5/md5-aarch64.S new file mode 100644 index 000000000000..e1ff490b134d --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/md5/md5-aarch64.S @@ -0,0 +1,677 @@ +#include "arm_arch.h" + +.text +.globl ossl_md5_block_asm_data_order + +ossl_md5_block_asm_data_order: + AARCH64_VALID_CALL_TARGET + // Save all callee-saved registers + stp x19,x20,[sp,#-80]! + stp x21,x22,[sp,#16] + stp x23,x24,[sp,#32] + stp x25,x26,[sp,#48] + stp x27,x28,[sp,#64] + + ldp w10, w11, [x0, #0] // Load MD5 state->A and state->B + ldp w12, w13, [x0, #8] // Load MD5 state->C and state->D +.align 5 +ossl_md5_blocks_loop: + eor x17, x12, x13 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z) + and x16, x17, x11 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z) + ldp w15, w20, [x1] // Load 2 words of input data0 M[0],M[1] + ldp w3, w21, [x1, #8] // Load 2 words of input data0 M[2],M[3] +#ifdef __AARCH64EB__ + rev w15, w15 + rev w20, w20 + rev w3, w3 + rev w21, w21 +#endif + eor x14, x16, x13 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z) + movz x9, #0xa478 // Load lower half of constant 0xd76aa478 + movk x9, #0xd76a, lsl #16 // Load upper half of constant 0xd76aa478 + add w8, w10, w15 // Add dest value + add w7, w8, w9 // Add constant 0xd76aa478 + add w6, w7, w14 // Add aux function result + ror w6, w6, #25 // Rotate left s=7 bits + eor x5, x11, x12 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z) + add w4, w11, w6 // Add X parameter round 1 A=FF(A, B, C, D, 0xd76aa478, s=7, M[0]) + and x8, x5, x4 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z) + eor x17, x8, x12 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z) + movz x16, #0xb756 // Load lower half of constant 0xe8c7b756 + movk x16, #0xe8c7, lsl #16 // Load upper half of constant 0xe8c7b756 + add w9, w13, w20 // Add dest value + add w7, w9, w16 // Add constant 0xe8c7b756 + add w14, w7, w17 // Add aux function result + ror w14, w14, #20 // Rotate left s=12 bits + eor x6, x4, x11 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z) + add w5, w4, w14 // Add X parameter round 1 D=FF(D, A, B, C, 0xe8c7b756, s=12, M[1]) + and x8, x6, x5 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z) + eor x9, x8, x11 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z) + movz x16, #0x70db // Load lower half of constant 0x242070db + movk x16, #0x2420, lsl #16 // Load upper half of constant 0x242070db + add w7, w12, w3 // Add dest value + add w17, w7, w16 // Add constant 0x242070db + add w14, w17, w9 // Add aux function result + ror w14, w14, #15 // Rotate left s=17 bits + eor x6, x5, x4 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z) + add w8, w5, w14 // Add X parameter round 1 C=FF(C, D, A, B, 0x242070db, s=17, M[2]) + and x7, x6, x8 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z) + eor x16, x7, x4 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z) + movz x9, #0xceee // Load lower half of constant 0xc1bdceee + movk x9, #0xc1bd, lsl #16 // Load upper half of constant 0xc1bdceee + add w14, w11, w21 // Add dest value + add w6, w14, w9 // Add constant 0xc1bdceee + add w7, w6, w16 // Add aux function result + ror w7, w7, #10 // Rotate left s=22 bits + eor x17, x8, x5 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z) + add w9, w8, w7 // Add X parameter round 1 B=FF(B, C, D, A, 0xc1bdceee, s=22, M[3]) + ldp w14, w22, [x1, #16] // Load 2 words of input data0 M[4],M[5] + ldp w7, w23, [x1, #24] // Load 2 words of input data0 M[6],M[7] +#ifdef __AARCH64EB__ + rev w14, w14 + rev w22, w22 + rev w7, w7 + rev w23, w23 +#endif + and x16, x17, x9 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z) + eor x6, x16, x5 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z) + movz x16, #0xfaf // Load lower half of constant 0xf57c0faf + movk x16, #0xf57c, lsl #16 // Load upper half of constant 0xf57c0faf + add w17, w4, w14 // Add dest value + add w16, w17, w16 // Add constant 0xf57c0faf + add w4, w16, w6 // Add aux function result + ror w4, w4, #25 // Rotate left s=7 bits + eor x16, x9, x8 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z) + add w17, w9, w4 // Add X parameter round 1 A=FF(A, B, C, D, 0xf57c0faf, s=7, M[4]) + and x16, x16, x17 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z) + eor x6, x16, x8 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z) + movz x4, #0xc62a // Load lower half of constant 0x4787c62a + movk x4, #0x4787, lsl #16 // Load upper half of constant 0x4787c62a + add w16, w5, w22 // Add dest value + add w16, w16, w4 // Add constant 0x4787c62a + add w5, w16, w6 // Add aux function result + ror w5, w5, #20 // Rotate left s=12 bits + eor x4, x17, x9 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z) + add w19, w17, w5 // Add X parameter round 1 D=FF(D, A, B, C, 0x4787c62a, s=12, M[5]) + and x6, x4, x19 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z) + eor x5, x6, x9 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z) + movz x4, #0x4613 // Load lower half of constant 0xa8304613 + movk x4, #0xa830, lsl #16 // Load upper half of constant 0xa8304613 + add w6, w8, w7 // Add dest value + add w8, w6, w4 // Add constant 0xa8304613 + add w4, w8, w5 // Add aux function result + ror w4, w4, #15 // Rotate left s=17 bits + eor x6, x19, x17 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z) + add w8, w19, w4 // Add X parameter round 1 C=FF(C, D, A, B, 0xa8304613, s=17, M[6]) + and x5, x6, x8 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z) + eor x4, x5, x17 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z) + movz x6, #0x9501 // Load lower half of constant 0xfd469501 + movk x6, #0xfd46, lsl #16 // Load upper half of constant 0xfd469501 + add w9, w9, w23 // Add dest value + add w5, w9, w6 // Add constant 0xfd469501 + add w9, w5, w4 // Add aux function result + ror w9, w9, #10 // Rotate left s=22 bits + eor x6, x8, x19 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z) + add w4, w8, w9 // Add X parameter round 1 B=FF(B, C, D, A, 0xfd469501, s=22, M[7]) + ldp w5, w24, [x1, #32] // Load 2 words of input data0 M[8],M[9] + ldp w16, w25, [x1, #40] // Load 2 words of input data0 M[10],M[11] +#ifdef __AARCH64EB__ + rev w5, w5 + rev w24, w24 + rev w16, w16 + rev w25, w25 +#endif + and x9, x6, x4 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z) + eor x6, x9, x19 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z) + movz x9, #0x98d8 // Load lower half of constant 0x698098d8 + movk x9, #0x6980, lsl #16 // Load upper half of constant 0x698098d8 + add w17, w17, w5 // Add dest value + add w9, w17, w9 // Add constant 0x698098d8 + add w17, w9, w6 // Add aux function result + ror w17, w17, #25 // Rotate left s=7 bits + eor x9, x4, x8 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z) + add w6, w4, w17 // Add X parameter round 1 A=FF(A, B, C, D, 0x698098d8, s=7, M[8]) + and x17, x9, x6 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z) + eor x9, x17, x8 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z) + movz x17, #0xf7af // Load lower half of constant 0x8b44f7af + movk x17, #0x8b44, lsl #16 // Load upper half of constant 0x8b44f7af + add w19, w19, w24 // Add dest value + add w17, w19, w17 // Add constant 0x8b44f7af + add w19, w17, w9 // Add aux function result + ror w19, w19, #20 // Rotate left s=12 bits + eor x9, x6, x4 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z) + add w17, w6, w19 // Add X parameter round 1 D=FF(D, A, B, C, 0x8b44f7af, s=12, M[9]) + and x9, x9, x17 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z) + eor x9, x9, x4 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z) + movz x11, #0x5bb1 // Load lower half of constant 0xffff5bb1 + movk x11, #0xffff, lsl #16 // Load upper half of constant 0xffff5bb1 + add w8, w8, w16 // Add dest value + add w8, w8, w11 // Add constant 0xffff5bb1 + add w8, w8, w9 // Add aux function result + ror w8, w8, #15 // Rotate left s=17 bits + eor x9, x17, x6 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z) + add w8, w17, w8 // Add X parameter round 1 C=FF(C, D, A, B, 0xffff5bb1, s=17, M[10]) + and x9, x9, x8 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z) + eor x9, x9, x6 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z) + movz x11, #0xd7be // Load lower half of constant 0x895cd7be + movk x11, #0x895c, lsl #16 // Load upper half of constant 0x895cd7be + add w4, w4, w25 // Add dest value + add w4, w4, w11 // Add constant 0x895cd7be + add w9, w4, w9 // Add aux function result + ror w9, w9, #10 // Rotate left s=22 bits + eor x4, x8, x17 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z) + add w9, w8, w9 // Add X parameter round 1 B=FF(B, C, D, A, 0x895cd7be, s=22, M[11]) + ldp w11, w26, [x1, #48] // Load 2 words of input data0 M[12],M[13] + ldp w12, w27, [x1, #56] // Load 2 words of input data0 M[14],M[15] +#ifdef __AARCH64EB__ + rev w11, w11 + rev w26, w26 + rev w12, w12 + rev w27, w27 +#endif + and x4, x4, x9 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z) + eor x4, x4, x17 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z) + movz x19, #0x1122 // Load lower half of constant 0x6b901122 + movk x19, #0x6b90, lsl #16 // Load upper half of constant 0x6b901122 + add w6, w6, w11 // Add dest value + add w6, w6, w19 // Add constant 0x6b901122 + add w4, w6, w4 // Add aux function result + ror w4, w4, #25 // Rotate left s=7 bits + eor x6, x9, x8 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z) + add w4, w9, w4 // Add X parameter round 1 A=FF(A, B, C, D, 0x6b901122, s=7, M[12]) + and x6, x6, x4 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z) + eor x6, x6, x8 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z) + movz x19, #0x7193 // Load lower half of constant 0xfd987193 + movk x19, #0xfd98, lsl #16 // Load upper half of constant 0xfd987193 + add w17, w17, w26 // Add dest value + add w17, w17, w19 // Add constant 0xfd987193 + add w17, w17, w6 // Add aux function result + ror w17, w17, #20 // Rotate left s=12 bits + eor x6, x4, x9 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z) + add w17, w4, w17 // Add X parameter round 1 D=FF(D, A, B, C, 0xfd987193, s=12, M[13]) + and x6, x6, x17 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z) + eor x6, x6, x9 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z) + movz x13, #0x438e // Load lower half of constant 0xa679438e + movk x13, #0xa679, lsl #16 // Load upper half of constant 0xa679438e + add w8, w8, w12 // Add dest value + add w8, w8, w13 // Add constant 0xa679438e + add w8, w8, w6 // Add aux function result + ror w8, w8, #15 // Rotate left s=17 bits + eor x6, x17, x4 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z) + add w8, w17, w8 // Add X parameter round 1 C=FF(C, D, A, B, 0xa679438e, s=17, M[14]) + and x6, x6, x8 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z) + eor x6, x6, x4 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z) + movz x13, #0x821 // Load lower half of constant 0x49b40821 + movk x13, #0x49b4, lsl #16 // Load upper half of constant 0x49b40821 + add w9, w9, w27 // Add dest value + add w9, w9, w13 // Add constant 0x49b40821 + add w9, w9, w6 // Add aux function result + ror w9, w9, #10 // Rotate left s=22 bits + bic x6, x8, x17 // Aux function round 2 (~z & y) + add w9, w8, w9 // Add X parameter round 1 B=FF(B, C, D, A, 0x49b40821, s=22, M[15]) + movz x13, #0x2562 // Load lower half of constant 0xf61e2562 + movk x13, #0xf61e, lsl #16 // Load upper half of constant 0xf61e2562 + add w4, w4, w20 // Add dest value + add w4, w4, w13 // Add constant 0xf61e2562 + and x13, x9, x17 // Aux function round 2 (x & z) + add w4, w4, w6 // Add (~z & y) + add w4, w4, w13 // Add (x & z) + ror w4, w4, #27 // Rotate left s=5 bits + bic x6, x9, x8 // Aux function round 2 (~z & y) + add w4, w9, w4 // Add X parameter round 2 A=GG(A, B, C, D, 0xf61e2562, s=5, M[1]) + movz x13, #0xb340 // Load lower half of constant 0xc040b340 + movk x13, #0xc040, lsl #16 // Load upper half of constant 0xc040b340 + add w17, w17, w7 // Add dest value + add w17, w17, w13 // Add constant 0xc040b340 + and x13, x4, x8 // Aux function round 2 (x & z) + add w17, w17, w6 // Add (~z & y) + add w17, w17, w13 // Add (x & z) + ror w17, w17, #23 // Rotate left s=9 bits + bic x6, x4, x9 // Aux function round 2 (~z & y) + add w17, w4, w17 // Add X parameter round 2 D=GG(D, A, B, C, 0xc040b340, s=9, M[6]) + movz x13, #0x5a51 // Load lower half of constant 0x265e5a51 + movk x13, #0x265e, lsl #16 // Load upper half of constant 0x265e5a51 + add w8, w8, w25 // Add dest value + add w8, w8, w13 // Add constant 0x265e5a51 + and x13, x17, x9 // Aux function round 2 (x & z) + add w8, w8, w6 // Add (~z & y) + add w8, w8, w13 // Add (x & z) + ror w8, w8, #18 // Rotate left s=14 bits + bic x6, x17, x4 // Aux function round 2 (~z & y) + add w8, w17, w8 // Add X parameter round 2 C=GG(C, D, A, B, 0x265e5a51, s=14, M[11]) + movz x13, #0xc7aa // Load lower half of constant 0xe9b6c7aa + movk x13, #0xe9b6, lsl #16 // Load upper half of constant 0xe9b6c7aa + add w9, w9, w15 // Add dest value + add w9, w9, w13 // Add constant 0xe9b6c7aa + and x13, x8, x4 // Aux function round 2 (x & z) + add w9, w9, w6 // Add (~z & y) + add w9, w9, w13 // Add (x & z) + ror w9, w9, #12 // Rotate left s=20 bits + bic x6, x8, x17 // Aux function round 2 (~z & y) + add w9, w8, w9 // Add X parameter round 2 B=GG(B, C, D, A, 0xe9b6c7aa, s=20, M[0]) + movz x13, #0x105d // Load lower half of constant 0xd62f105d + movk x13, #0xd62f, lsl #16 // Load upper half of constant 0xd62f105d + add w4, w4, w22 // Add dest value + add w4, w4, w13 // Add constant 0xd62f105d + and x13, x9, x17 // Aux function round 2 (x & z) + add w4, w4, w6 // Add (~z & y) + add w4, w4, w13 // Add (x & z) + ror w4, w4, #27 // Rotate left s=5 bits + bic x6, x9, x8 // Aux function round 2 (~z & y) + add w4, w9, w4 // Add X parameter round 2 A=GG(A, B, C, D, 0xd62f105d, s=5, M[5]) + movz x13, #0x1453 // Load lower half of constant 0x2441453 + movk x13, #0x244, lsl #16 // Load upper half of constant 0x2441453 + add w17, w17, w16 // Add dest value + add w17, w17, w13 // Add constant 0x2441453 + and x13, x4, x8 // Aux function round 2 (x & z) + add w17, w17, w6 // Add (~z & y) + add w17, w17, w13 // Add (x & z) + ror w17, w17, #23 // Rotate left s=9 bits + bic x6, x4, x9 // Aux function round 2 (~z & y) + add w17, w4, w17 // Add X parameter round 2 D=GG(D, A, B, C, 0x2441453, s=9, M[10]) + movz x13, #0xe681 // Load lower half of constant 0xd8a1e681 + movk x13, #0xd8a1, lsl #16 // Load upper half of constant 0xd8a1e681 + add w8, w8, w27 // Add dest value + add w8, w8, w13 // Add constant 0xd8a1e681 + and x13, x17, x9 // Aux function round 2 (x & z) + add w8, w8, w6 // Add (~z & y) + add w8, w8, w13 // Add (x & z) + ror w8, w8, #18 // Rotate left s=14 bits + bic x6, x17, x4 // Aux function round 2 (~z & y) + add w8, w17, w8 // Add X parameter round 2 C=GG(C, D, A, B, 0xd8a1e681, s=14, M[15]) + movz x13, #0xfbc8 // Load lower half of constant 0xe7d3fbc8 + movk x13, #0xe7d3, lsl #16 // Load upper half of constant 0xe7d3fbc8 + add w9, w9, w14 // Add dest value + add w9, w9, w13 // Add constant 0xe7d3fbc8 + and x13, x8, x4 // Aux function round 2 (x & z) + add w9, w9, w6 // Add (~z & y) + add w9, w9, w13 // Add (x & z) + ror w9, w9, #12 // Rotate left s=20 bits + bic x6, x8, x17 // Aux function round 2 (~z & y) + add w9, w8, w9 // Add X parameter round 2 B=GG(B, C, D, A, 0xe7d3fbc8, s=20, M[4]) + movz x13, #0xcde6 // Load lower half of constant 0x21e1cde6 + movk x13, #0x21e1, lsl #16 // Load upper half of constant 0x21e1cde6 + add w4, w4, w24 // Add dest value + add w4, w4, w13 // Add constant 0x21e1cde6 + and x13, x9, x17 // Aux function round 2 (x & z) + add w4, w4, w6 // Add (~z & y) + add w4, w4, w13 // Add (x & z) + ror w4, w4, #27 // Rotate left s=5 bits + bic x6, x9, x8 // Aux function round 2 (~z & y) + add w4, w9, w4 // Add X parameter round 2 A=GG(A, B, C, D, 0x21e1cde6, s=5, M[9]) + movz x13, #0x7d6 // Load lower half of constant 0xc33707d6 + movk x13, #0xc337, lsl #16 // Load upper half of constant 0xc33707d6 + add w17, w17, w12 // Add dest value + add w17, w17, w13 // Add constant 0xc33707d6 + and x13, x4, x8 // Aux function round 2 (x & z) + add w17, w17, w6 // Add (~z & y) + add w17, w17, w13 // Add (x & z) + ror w17, w17, #23 // Rotate left s=9 bits + bic x6, x4, x9 // Aux function round 2 (~z & y) + add w17, w4, w17 // Add X parameter round 2 D=GG(D, A, B, C, 0xc33707d6, s=9, M[14]) + movz x13, #0xd87 // Load lower half of constant 0xf4d50d87 + movk x13, #0xf4d5, lsl #16 // Load upper half of constant 0xf4d50d87 + add w8, w8, w21 // Add dest value + add w8, w8, w13 // Add constant 0xf4d50d87 + and x13, x17, x9 // Aux function round 2 (x & z) + add w8, w8, w6 // Add (~z & y) + add w8, w8, w13 // Add (x & z) + ror w8, w8, #18 // Rotate left s=14 bits + bic x6, x17, x4 // Aux function round 2 (~z & y) + add w8, w17, w8 // Add X parameter round 2 C=GG(C, D, A, B, 0xf4d50d87, s=14, M[3]) + movz x13, #0x14ed // Load lower half of constant 0x455a14ed + movk x13, #0x455a, lsl #16 // Load upper half of constant 0x455a14ed + add w9, w9, w5 // Add dest value + add w9, w9, w13 // Add constant 0x455a14ed + and x13, x8, x4 // Aux function round 2 (x & z) + add w9, w9, w6 // Add (~z & y) + add w9, w9, w13 // Add (x & z) + ror w9, w9, #12 // Rotate left s=20 bits + bic x6, x8, x17 // Aux function round 2 (~z & y) + add w9, w8, w9 // Add X parameter round 2 B=GG(B, C, D, A, 0x455a14ed, s=20, M[8]) + movz x13, #0xe905 // Load lower half of constant 0xa9e3e905 + movk x13, #0xa9e3, lsl #16 // Load upper half of constant 0xa9e3e905 + add w4, w4, w26 // Add dest value + add w4, w4, w13 // Add constant 0xa9e3e905 + and x13, x9, x17 // Aux function round 2 (x & z) + add w4, w4, w6 // Add (~z & y) + add w4, w4, w13 // Add (x & z) + ror w4, w4, #27 // Rotate left s=5 bits + bic x6, x9, x8 // Aux function round 2 (~z & y) + add w4, w9, w4 // Add X parameter round 2 A=GG(A, B, C, D, 0xa9e3e905, s=5, M[13]) + movz x13, #0xa3f8 // Load lower half of constant 0xfcefa3f8 + movk x13, #0xfcef, lsl #16 // Load upper half of constant 0xfcefa3f8 + add w17, w17, w3 // Add dest value + add w17, w17, w13 // Add constant 0xfcefa3f8 + and x13, x4, x8 // Aux function round 2 (x & z) + add w17, w17, w6 // Add (~z & y) + add w17, w17, w13 // Add (x & z) + ror w17, w17, #23 // Rotate left s=9 bits + bic x6, x4, x9 // Aux function round 2 (~z & y) + add w17, w4, w17 // Add X parameter round 2 D=GG(D, A, B, C, 0xfcefa3f8, s=9, M[2]) + movz x13, #0x2d9 // Load lower half of constant 0x676f02d9 + movk x13, #0x676f, lsl #16 // Load upper half of constant 0x676f02d9 + add w8, w8, w23 // Add dest value + add w8, w8, w13 // Add constant 0x676f02d9 + and x13, x17, x9 // Aux function round 2 (x & z) + add w8, w8, w6 // Add (~z & y) + add w8, w8, w13 // Add (x & z) + ror w8, w8, #18 // Rotate left s=14 bits + bic x6, x17, x4 // Aux function round 2 (~z & y) + add w8, w17, w8 // Add X parameter round 2 C=GG(C, D, A, B, 0x676f02d9, s=14, M[7]) + movz x13, #0x4c8a // Load lower half of constant 0x8d2a4c8a + movk x13, #0x8d2a, lsl #16 // Load upper half of constant 0x8d2a4c8a + add w9, w9, w11 // Add dest value + add w9, w9, w13 // Add constant 0x8d2a4c8a + and x13, x8, x4 // Aux function round 2 (x & z) + add w9, w9, w6 // Add (~z & y) + add w9, w9, w13 // Add (x & z) + eor x6, x8, x17 // Begin aux function round 3 H(x,y,z)=(x^y^z) + ror w9, w9, #12 // Rotate left s=20 bits + movz x10, #0x3942 // Load lower half of constant 0xfffa3942 + add w9, w8, w9 // Add X parameter round 2 B=GG(B, C, D, A, 0x8d2a4c8a, s=20, M[12]) + movk x10, #0xfffa, lsl #16 // Load upper half of constant 0xfffa3942 + add w4, w4, w22 // Add dest value + eor x6, x6, x9 // End aux function round 3 H(x,y,z)=(x^y^z) + add w4, w4, w10 // Add constant 0xfffa3942 + add w4, w4, w6 // Add aux function result + ror w4, w4, #28 // Rotate left s=4 bits + eor x6, x9, x8 // Begin aux function round 3 H(x,y,z)=(x^y^z) + movz x10, #0xf681 // Load lower half of constant 0x8771f681 + add w4, w9, w4 // Add X parameter round 3 A=HH(A, B, C, D, 0xfffa3942, s=4, M[5]) + movk x10, #0x8771, lsl #16 // Load upper half of constant 0x8771f681 + add w17, w17, w5 // Add dest value + eor x6, x6, x4 // End aux function round 3 H(x,y,z)=(x^y^z) + add w17, w17, w10 // Add constant 0x8771f681 + add w17, w17, w6 // Add aux function result + eor x6, x4, x9 // Begin aux function round 3 H(x,y,z)=(x^y^z) + ror w17, w17, #21 // Rotate left s=11 bits + movz x13, #0x6122 // Load lower half of constant 0x6d9d6122 + add w17, w4, w17 // Add X parameter round 3 D=HH(D, A, B, C, 0x8771f681, s=11, M[8]) + movk x13, #0x6d9d, lsl #16 // Load upper half of constant 0x6d9d6122 + add w8, w8, w25 // Add dest value + eor x6, x6, x17 // End aux function round 3 H(x,y,z)=(x^y^z) + add w8, w8, w13 // Add constant 0x6d9d6122 + add w8, w8, w6 // Add aux function result + ror w8, w8, #16 // Rotate left s=16 bits + eor x6, x17, x4 // Begin aux function round 3 H(x,y,z)=(x^y^z) + movz x13, #0x380c // Load lower half of constant 0xfde5380c + add w8, w17, w8 // Add X parameter round 3 C=HH(C, D, A, B, 0x6d9d6122, s=16, M[11]) + movk x13, #0xfde5, lsl #16 // Load upper half of constant 0xfde5380c + add w9, w9, w12 // Add dest value + eor x6, x6, x8 // End aux function round 3 H(x,y,z)=(x^y^z) + add w9, w9, w13 // Add constant 0xfde5380c + add w9, w9, w6 // Add aux function result + eor x6, x8, x17 // Begin aux function round 3 H(x,y,z)=(x^y^z) + ror w9, w9, #9 // Rotate left s=23 bits + movz x10, #0xea44 // Load lower half of constant 0xa4beea44 + add w9, w8, w9 // Add X parameter round 3 B=HH(B, C, D, A, 0xfde5380c, s=23, M[14]) + movk x10, #0xa4be, lsl #16 // Load upper half of constant 0xa4beea44 + add w4, w4, w20 // Add dest value + eor x6, x6, x9 // End aux function round 3 H(x,y,z)=(x^y^z) + add w4, w4, w10 // Add constant 0xa4beea44 + add w4, w4, w6 // Add aux function result + ror w4, w4, #28 // Rotate left s=4 bits + eor x6, x9, x8 // Begin aux function round 3 H(x,y,z)=(x^y^z) + movz x10, #0xcfa9 // Load lower half of constant 0x4bdecfa9 + add w4, w9, w4 // Add X parameter round 3 A=HH(A, B, C, D, 0xa4beea44, s=4, M[1]) + movk x10, #0x4bde, lsl #16 // Load upper half of constant 0x4bdecfa9 + add w17, w17, w14 // Add dest value + eor x6, x6, x4 // End aux function round 3 H(x,y,z)=(x^y^z) + add w17, w17, w10 // Add constant 0x4bdecfa9 + add w17, w17, w6 // Add aux function result + eor x6, x4, x9 // Begin aux function round 3 H(x,y,z)=(x^y^z) + ror w17, w17, #21 // Rotate left s=11 bits + movz x13, #0x4b60 // Load lower half of constant 0xf6bb4b60 + add w17, w4, w17 // Add X parameter round 3 D=HH(D, A, B, C, 0x4bdecfa9, s=11, M[4]) + movk x13, #0xf6bb, lsl #16 // Load upper half of constant 0xf6bb4b60 + add w8, w8, w23 // Add dest value + eor x6, x6, x17 // End aux function round 3 H(x,y,z)=(x^y^z) + add w8, w8, w13 // Add constant 0xf6bb4b60 + add w8, w8, w6 // Add aux function result + ror w8, w8, #16 // Rotate left s=16 bits + eor x6, x17, x4 // Begin aux function round 3 H(x,y,z)=(x^y^z) + movz x13, #0xbc70 // Load lower half of constant 0xbebfbc70 + add w8, w17, w8 // Add X parameter round 3 C=HH(C, D, A, B, 0xf6bb4b60, s=16, M[7]) + movk x13, #0xbebf, lsl #16 // Load upper half of constant 0xbebfbc70 + add w9, w9, w16 // Add dest value + eor x6, x6, x8 // End aux function round 3 H(x,y,z)=(x^y^z) + add w9, w9, w13 // Add constant 0xbebfbc70 + add w9, w9, w6 // Add aux function result + eor x6, x8, x17 // Begin aux function round 3 H(x,y,z)=(x^y^z) + ror w9, w9, #9 // Rotate left s=23 bits + movz x10, #0x7ec6 // Load lower half of constant 0x289b7ec6 + add w9, w8, w9 // Add X parameter round 3 B=HH(B, C, D, A, 0xbebfbc70, s=23, M[10]) + movk x10, #0x289b, lsl #16 // Load upper half of constant 0x289b7ec6 + add w4, w4, w26 // Add dest value + eor x6, x6, x9 // End aux function round 3 H(x,y,z)=(x^y^z) + add w4, w4, w10 // Add constant 0x289b7ec6 + add w4, w4, w6 // Add aux function result + ror w4, w4, #28 // Rotate left s=4 bits + eor x6, x9, x8 // Begin aux function round 3 H(x,y,z)=(x^y^z) + movz x10, #0x27fa // Load lower half of constant 0xeaa127fa + add w4, w9, w4 // Add X parameter round 3 A=HH(A, B, C, D, 0x289b7ec6, s=4, M[13]) + movk x10, #0xeaa1, lsl #16 // Load upper half of constant 0xeaa127fa + add w17, w17, w15 // Add dest value + eor x6, x6, x4 // End aux function round 3 H(x,y,z)=(x^y^z) + add w17, w17, w10 // Add constant 0xeaa127fa + add w17, w17, w6 // Add aux function result + eor x6, x4, x9 // Begin aux function round 3 H(x,y,z)=(x^y^z) + ror w17, w17, #21 // Rotate left s=11 bits + movz x13, #0x3085 // Load lower half of constant 0xd4ef3085 + add w17, w4, w17 // Add X parameter round 3 D=HH(D, A, B, C, 0xeaa127fa, s=11, M[0]) + movk x13, #0xd4ef, lsl #16 // Load upper half of constant 0xd4ef3085 + add w8, w8, w21 // Add dest value + eor x6, x6, x17 // End aux function round 3 H(x,y,z)=(x^y^z) + add w8, w8, w13 // Add constant 0xd4ef3085 + add w8, w8, w6 // Add aux function result + ror w8, w8, #16 // Rotate left s=16 bits + eor x6, x17, x4 // Begin aux function round 3 H(x,y,z)=(x^y^z) + movz x13, #0x1d05 // Load lower half of constant 0x4881d05 + add w8, w17, w8 // Add X parameter round 3 C=HH(C, D, A, B, 0xd4ef3085, s=16, M[3]) + movk x13, #0x488, lsl #16 // Load upper half of constant 0x4881d05 + add w9, w9, w7 // Add dest value + eor x6, x6, x8 // End aux function round 3 H(x,y,z)=(x^y^z) + add w9, w9, w13 // Add constant 0x4881d05 + add w9, w9, w6 // Add aux function result + eor x6, x8, x17 // Begin aux function round 3 H(x,y,z)=(x^y^z) + ror w9, w9, #9 // Rotate left s=23 bits + movz x10, #0xd039 // Load lower half of constant 0xd9d4d039 + add w9, w8, w9 // Add X parameter round 3 B=HH(B, C, D, A, 0x4881d05, s=23, M[6]) + movk x10, #0xd9d4, lsl #16 // Load upper half of constant 0xd9d4d039 + add w4, w4, w24 // Add dest value + eor x6, x6, x9 // End aux function round 3 H(x,y,z)=(x^y^z) + add w4, w4, w10 // Add constant 0xd9d4d039 + add w4, w4, w6 // Add aux function result + ror w4, w4, #28 // Rotate left s=4 bits + eor x6, x9, x8 // Begin aux function round 3 H(x,y,z)=(x^y^z) + movz x10, #0x99e5 // Load lower half of constant 0xe6db99e5 + add w4, w9, w4 // Add X parameter round 3 A=HH(A, B, C, D, 0xd9d4d039, s=4, M[9]) + movk x10, #0xe6db, lsl #16 // Load upper half of constant 0xe6db99e5 + add w17, w17, w11 // Add dest value + eor x6, x6, x4 // End aux function round 3 H(x,y,z)=(x^y^z) + add w17, w17, w10 // Add constant 0xe6db99e5 + add w17, w17, w6 // Add aux function result + eor x6, x4, x9 // Begin aux function round 3 H(x,y,z)=(x^y^z) + ror w17, w17, #21 // Rotate left s=11 bits + movz x13, #0x7cf8 // Load lower half of constant 0x1fa27cf8 + add w17, w4, w17 // Add X parameter round 3 D=HH(D, A, B, C, 0xe6db99e5, s=11, M[12]) + movk x13, #0x1fa2, lsl #16 // Load upper half of constant 0x1fa27cf8 + add w8, w8, w27 // Add dest value + eor x6, x6, x17 // End aux function round 3 H(x,y,z)=(x^y^z) + add w8, w8, w13 // Add constant 0x1fa27cf8 + add w8, w8, w6 // Add aux function result + ror w8, w8, #16 // Rotate left s=16 bits + eor x6, x17, x4 // Begin aux function round 3 H(x,y,z)=(x^y^z) + movz x13, #0x5665 // Load lower half of constant 0xc4ac5665 + add w8, w17, w8 // Add X parameter round 3 C=HH(C, D, A, B, 0x1fa27cf8, s=16, M[15]) + movk x13, #0xc4ac, lsl #16 // Load upper half of constant 0xc4ac5665 + add w9, w9, w3 // Add dest value + eor x6, x6, x8 // End aux function round 3 H(x,y,z)=(x^y^z) + add w9, w9, w13 // Add constant 0xc4ac5665 + add w9, w9, w6 // Add aux function result + ror w9, w9, #9 // Rotate left s=23 bits + movz x6, #0x2244 // Load lower half of constant 0xf4292244 + movk x6, #0xf429, lsl #16 // Load upper half of constant 0xf4292244 + add w9, w8, w9 // Add X parameter round 3 B=HH(B, C, D, A, 0xc4ac5665, s=23, M[2]) + add w4, w4, w15 // Add dest value + orn x13, x9, x17 // Begin aux function round 4 I(x,y,z)=((~z|x)^y) + add w4, w4, w6 // Add constant 0xf4292244 + eor x6, x8, x13 // End aux function round 4 I(x,y,z)=((~z|x)^y) + add w4, w4, w6 // Add aux function result + ror w4, w4, #26 // Rotate left s=6 bits + movz x6, #0xff97 // Load lower half of constant 0x432aff97 + movk x6, #0x432a, lsl #16 // Load upper half of constant 0x432aff97 + add w4, w9, w4 // Add X parameter round 4 A=II(A, B, C, D, 0xf4292244, s=6, M[0]) + orn x10, x4, x8 // Begin aux function round 4 I(x,y,z)=((~z|x)^y) + add w17, w17, w23 // Add dest value + eor x10, x9, x10 // End aux function round 4 I(x,y,z)=((~z|x)^y) + add w17, w17, w6 // Add constant 0x432aff97 + add w6, w17, w10 // Add aux function result + ror w6, w6, #22 // Rotate left s=10 bits + movz x17, #0x23a7 // Load lower half of constant 0xab9423a7 + movk x17, #0xab94, lsl #16 // Load upper half of constant 0xab9423a7 + add w6, w4, w6 // Add X parameter round 4 D=II(D, A, B, C, 0x432aff97, s=10, M[7]) + add w8, w8, w12 // Add dest value + orn x10, x6, x9 // Begin aux function round 4 I(x,y,z)=((~z|x)^y) + add w8, w8, w17 // Add constant 0xab9423a7 + eor x17, x4, x10 // End aux function round 4 I(x,y,z)=((~z|x)^y) + add w8, w8, w17 // Add aux function result + ror w8, w8, #17 // Rotate left s=15 bits + movz x17, #0xa039 // Load lower half of constant 0xfc93a039 + movk x17, #0xfc93, lsl #16 // Load upper half of constant 0xfc93a039 + add w8, w6, w8 // Add X parameter round 4 C=II(C, D, A, B, 0xab9423a7, s=15, M[14]) + orn x13, x8, x4 // Begin aux function round 4 I(x,y,z)=((~z|x)^y) + add w9, w9, w22 // Add dest value + eor x13, x6, x13 // End aux function round 4 I(x,y,z)=((~z|x)^y) + add w9, w9, w17 // Add constant 0xfc93a039 + add w17, w9, w13 // Add aux function result + ror w17, w17, #11 // Rotate left s=21 bits + movz x9, #0x59c3 // Load lower half of constant 0x655b59c3 + movk x9, #0x655b, lsl #16 // Load upper half of constant 0x655b59c3 + add w17, w8, w17 // Add X parameter round 4 B=II(B, C, D, A, 0xfc93a039, s=21, M[5]) + add w4, w4, w11 // Add dest value + orn x13, x17, x6 // Begin aux function round 4 I(x,y,z)=((~z|x)^y) + add w9, w4, w9 // Add constant 0x655b59c3 + eor x4, x8, x13 // End aux function round 4 I(x,y,z)=((~z|x)^y) + add w9, w9, w4 // Add aux function result + ror w9, w9, #26 // Rotate left s=6 bits + movz x4, #0xcc92 // Load lower half of constant 0x8f0ccc92 + movk x4, #0x8f0c, lsl #16 // Load upper half of constant 0x8f0ccc92 + add w9, w17, w9 // Add X parameter round 4 A=II(A, B, C, D, 0x655b59c3, s=6, M[12]) + orn x10, x9, x8 // Begin aux function round 4 I(x,y,z)=((~z|x)^y) + add w6, w6, w21 // Add dest value + eor x10, x17, x10 // End aux function round 4 I(x,y,z)=((~z|x)^y) + add w4, w6, w4 // Add constant 0x8f0ccc92 + add w6, w4, w10 // Add aux function result + ror w6, w6, #22 // Rotate left s=10 bits + movz x4, #0xf47d // Load lower half of constant 0xffeff47d + movk x4, #0xffef, lsl #16 // Load upper half of constant 0xffeff47d + add w6, w9, w6 // Add X parameter round 4 D=II(D, A, B, C, 0x8f0ccc92, s=10, M[3]) + add w8, w8, w16 // Add dest value + orn x10, x6, x17 // Begin aux function round 4 I(x,y,z)=((~z|x)^y) + add w8, w8, w4 // Add constant 0xffeff47d + eor x4, x9, x10 // End aux function round 4 I(x,y,z)=((~z|x)^y) + add w8, w8, w4 // Add aux function result + ror w8, w8, #17 // Rotate left s=15 bits + movz x4, #0x5dd1 // Load lower half of constant 0x85845dd1 + movk x4, #0x8584, lsl #16 // Load upper half of constant 0x85845dd1 + add w8, w6, w8 // Add X parameter round 4 C=II(C, D, A, B, 0xffeff47d, s=15, M[10]) + orn x10, x8, x9 // Begin aux function round 4 I(x,y,z)=((~z|x)^y) + add w15, w17, w20 // Add dest value + eor x17, x6, x10 // End aux function round 4 I(x,y,z)=((~z|x)^y) + add w15, w15, w4 // Add constant 0x85845dd1 + add w4, w15, w17 // Add aux function result + ror w4, w4, #11 // Rotate left s=21 bits + movz x15, #0x7e4f // Load lower half of constant 0x6fa87e4f + movk x15, #0x6fa8, lsl #16 // Load upper half of constant 0x6fa87e4f + add w17, w8, w4 // Add X parameter round 4 B=II(B, C, D, A, 0x85845dd1, s=21, M[1]) + add w4, w9, w5 // Add dest value + orn x9, x17, x6 // Begin aux function round 4 I(x,y,z)=((~z|x)^y) + add w15, w4, w15 // Add constant 0x6fa87e4f + eor x4, x8, x9 // End aux function round 4 I(x,y,z)=((~z|x)^y) + add w9, w15, w4 // Add aux function result + ror w9, w9, #26 // Rotate left s=6 bits + movz x15, #0xe6e0 // Load lower half of constant 0xfe2ce6e0 + movk x15, #0xfe2c, lsl #16 // Load upper half of constant 0xfe2ce6e0 + add w4, w17, w9 // Add X parameter round 4 A=II(A, B, C, D, 0x6fa87e4f, s=6, M[8]) + orn x9, x4, x8 // Begin aux function round 4 I(x,y,z)=((~z|x)^y) + add w6, w6, w27 // Add dest value + eor x9, x17, x9 // End aux function round 4 I(x,y,z)=((~z|x)^y) + add w15, w6, w15 // Add constant 0xfe2ce6e0 + add w6, w15, w9 // Add aux function result + ror w6, w6, #22 // Rotate left s=10 bits + movz x9, #0x4314 // Load lower half of constant 0xa3014314 + movk x9, #0xa301, lsl #16 // Load upper half of constant 0xa3014314 + add w15, w4, w6 // Add X parameter round 4 D=II(D, A, B, C, 0xfe2ce6e0, s=10, M[15]) + add w6, w8, w7 // Add dest value + orn x7, x15, x17 // Begin aux function round 4 I(x,y,z)=((~z|x)^y) + add w8, w6, w9 // Add constant 0xa3014314 + eor x9, x4, x7 // End aux function round 4 I(x,y,z)=((~z|x)^y) + add w6, w8, w9 // Add aux function result + ror w6, w6, #17 // Rotate left s=15 bits + movz x7, #0x11a1 // Load lower half of constant 0x4e0811a1 + movk x7, #0x4e08, lsl #16 // Load upper half of constant 0x4e0811a1 + add w8, w15, w6 // Add X parameter round 4 C=II(C, D, A, B, 0xa3014314, s=15, M[6]) + orn x9, x8, x4 // Begin aux function round 4 I(x,y,z)=((~z|x)^y) + add w6, w17, w26 // Add dest value + eor x17, x15, x9 // End aux function round 4 I(x,y,z)=((~z|x)^y) + add w9, w6, w7 // Add constant 0x4e0811a1 + add w7, w9, w17 // Add aux function result + ror w7, w7, #11 // Rotate left s=21 bits + movz x6, #0x7e82 // Load lower half of constant 0xf7537e82 + movk x6, #0xf753, lsl #16 // Load upper half of constant 0xf7537e82 + add w9, w8, w7 // Add X parameter round 4 B=II(B, C, D, A, 0x4e0811a1, s=21, M[13]) + add w17, w4, w14 // Add dest value + orn x7, x9, x15 // Begin aux function round 4 I(x,y,z)=((~z|x)^y) + add w14, w17, w6 // Add constant 0xf7537e82 + eor x4, x8, x7 // End aux function round 4 I(x,y,z)=((~z|x)^y) + add w17, w14, w4 // Add aux function result + ror w17, w17, #26 // Rotate left s=6 bits + movz x6, #0xf235 // Load lower half of constant 0xbd3af235 + movk x6, #0xbd3a, lsl #16 // Load upper half of constant 0xbd3af235 + add w7, w9, w17 // Add X parameter round 4 A=II(A, B, C, D, 0xf7537e82, s=6, M[4]) + orn x14, x7, x8 // Begin aux function round 4 I(x,y,z)=((~z|x)^y) + add w4, w15, w25 // Add dest value + eor x17, x9, x14 // End aux function round 4 I(x,y,z)=((~z|x)^y) + add w15, w4, w6 // Add constant 0xbd3af235 + add w16, w15, w17 // Add aux function result + ror w16, w16, #22 // Rotate left s=10 bits + movz x14, #0xd2bb // Load lower half of constant 0x2ad7d2bb + movk x14, #0x2ad7, lsl #16 // Load upper half of constant 0x2ad7d2bb + add w4, w7, w16 // Add X parameter round 4 D=II(D, A, B, C, 0xbd3af235, s=10, M[11]) + add w6, w8, w3 // Add dest value + orn x15, x4, x9 // Begin aux function round 4 I(x,y,z)=((~z|x)^y) + add w17, w6, w14 // Add constant 0x2ad7d2bb + eor x16, x7, x15 // End aux function round 4 I(x,y,z)=((~z|x)^y) + add w8, w17, w16 // Add aux function result + ror w8, w8, #17 // Rotate left s=15 bits + movz x3, #0xd391 // Load lower half of constant 0xeb86d391 + movk x3, #0xeb86, lsl #16 // Load upper half of constant 0xeb86d391 + add w14, w4, w8 // Add X parameter round 4 C=II(C, D, A, B, 0x2ad7d2bb, s=15, M[2]) + orn x6, x14, x7 // Begin aux function round 4 I(x,y,z)=((~z|x)^y) + add w15, w9, w24 // Add dest value + eor x17, x4, x6 // End aux function round 4 I(x,y,z)=((~z|x)^y) + add w16, w15, w3 // Add constant 0xeb86d391 + add w8, w16, w17 // Add aux function result + ror w8, w8, #11 // Rotate left s=21 bits + ldp w6, w15, [x0] // Reload MD5 state->A and state->B + ldp w5, w9, [x0, #8] // Reload MD5 state->C and state->D + add w3, w14, w8 // Add X parameter round 4 B=II(B, C, D, A, 0xeb86d391, s=21, M[9]) + add w13, w4, w9 // Add result of MD5 rounds to state->D + add w12, w14, w5 // Add result of MD5 rounds to state->C + add w10, w7, w6 // Add result of MD5 rounds to state->A + add w11, w3, w15 // Add result of MD5 rounds to state->B + stp w12, w13, [x0, #8] // Store MD5 states C,D + stp w10, w11, [x0] // Store MD5 states A,B + add x1, x1, #64 // Increment data pointer + subs w2, w2, #1 // Decrement block counter + b.ne ossl_md5_blocks_loop + + ldp x21,x22,[sp,#16] + ldp x23,x24,[sp,#32] + ldp x25,x26,[sp,#48] + ldp x27,x28,[sp,#64] + ldp x19,x20,[sp],#80 + ret + diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/modes/aes-gcm-armv8-unroll8_64.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/modes/aes-gcm-armv8-unroll8_64.S new file mode 100644 index 000000000000..3209bee7d350 --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/modes/aes-gcm-armv8-unroll8_64.S @@ -0,0 +1,8499 @@ +#include "arm_arch.h" + +#if __ARM_MAX_ARCH__>=8 +.arch armv8-a+crypto +.text +.globl unroll8_eor3_aes_gcm_enc_128_kernel +.def unroll8_eor3_aes_gcm_enc_128_kernel + .type 32 +.endef +.align 4 +unroll8_eor3_aes_gcm_enc_128_kernel: + AARCH64_VALID_CALL_TARGET + cbz x1, L128_enc_ret + stp d8, d9, [sp, #-80]! + lsr x9, x1, #3 + mov x16, x4 + mov x8, x5 + stp d10, d11, [sp, #16] + stp d12, d13, [sp, #32] + stp d14, d15, [sp, #48] + mov x5, #0xc200000000000000 + stp x5, xzr, [sp, #64] + add x10, sp, #64 + + mov x15, #0x100000000 //set up counter increment + movi v31.16b, #0x0 + mov v31.d[1], x15 + mov x5, x9 + ld1 { v0.16b}, [x16] //CTR block 0 + + sub x5, x5, #1 //byte_len - 1 + + and x5, x5, #0xffffffffffffff80 //number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + + rev32 v30.16b, v0.16b //set up reversed counter + + add v30.4s, v30.4s, v31.4s //CTR block 0 + + rev32 v1.16b, v30.16b //CTR block 1 + add v30.4s, v30.4s, v31.4s //CTR block 1 + + rev32 v2.16b, v30.16b //CTR block 2 + add v30.4s, v30.4s, v31.4s //CTR block 2 + + rev32 v3.16b, v30.16b //CTR block 3 + add v30.4s, v30.4s, v31.4s //CTR block 3 + + rev32 v4.16b, v30.16b //CTR block 4 + add v30.4s, v30.4s, v31.4s //CTR block 4 + + rev32 v5.16b, v30.16b //CTR block 5 + add v30.4s, v30.4s, v31.4s //CTR block 5 + ldp q26, q27, [x8, #0] //load rk0, rk1 + + rev32 v6.16b, v30.16b //CTR block 6 + add v30.4s, v30.4s, v31.4s //CTR block 6 + + rev32 v7.16b, v30.16b //CTR block 7 + add v30.4s, v30.4s, v31.4s //CTR block 7 + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 0 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 0 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 0 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 0 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 0 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 0 + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 0 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 0 + ldp q28, q26, [x8, #32] //load rk2, rk3 + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 1 + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 1 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 1 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 1 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 1 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 1 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 1 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 5 - round 2 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 1 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 2 + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 2 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 2 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 7 - round 2 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 2 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 6 - round 2 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 4 - round 2 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 3 + + ldp q27, q28, [x8, #64] //load rk4, rk5 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 3 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 3 + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 3 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 3 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 3 + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 3 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 4 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 3 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 4 + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 4 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 4 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 4 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 4 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 4 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 4 + + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 7 - round 5 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 5 + ldp q26, q27, [x8, #96] //load rk6, rk7 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 5 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 5 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 5 + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 4 - round 5 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 5 - round 5 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 6 - round 5 + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 6 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 6 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 6 + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 6 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 6 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 6 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 6 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 6 + ldp q28, q26, [x8, #128] //load rk8, rk9 + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 7 + + ld1 { v19.16b}, [x3] + ext v19.16b, v19.16b, v19.16b, #8 + rev64 v19.16b, v19.16b + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 7 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 7 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 7 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 7 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 7 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 7 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 7 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 8 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 8 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 8 + + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 8 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 8 + ldr q27, [x8, #160] //load rk10 + + aese v3.16b, v26.16b //AES block 8k+11 - round 9 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 8 + aese v2.16b, v26.16b //AES block 8k+10 - round 9 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 8 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 8 + aese v6.16b, v26.16b //AES block 8k+14 - round 9 + + aese v4.16b, v26.16b //AES block 8k+12 - round 9 + add x5, x5, x0 + aese v0.16b, v26.16b //AES block 8k+8 - round 9 + + aese v7.16b, v26.16b //AES block 8k+15 - round 9 + aese v5.16b, v26.16b //AES block 8k+13 - round 9 + aese v1.16b, v26.16b //AES block 8k+9 - round 9 + + add x4, x0, x1, lsr #3 //end_input_ptr + cmp x0, x5 //check if we have <= 8 blocks + b.ge L128_enc_tail //handle tail + + ldp q8, q9, [x0], #32 //AES block 0, 1 - load plaintext + + ldp q10, q11, [x0], #32 //AES block 2, 3 - load plaintext + + ldp q12, q13, [x0], #32 //AES block 4, 5 - load plaintext + + ldp q14, q15, [x0], #32 //AES block 6, 7 - load plaintext + cmp x0, x5 //check if we have <= 8 blocks + +.long 0xce006d08 //eor3 v8.16b, v8.16b, v0.16b, v27.16b //AES block 0 - result + rev32 v0.16b, v30.16b //CTR block 8 + add v30.4s, v30.4s, v31.4s //CTR block 8 + +.long 0xce016d29 //eor3 v9.16b, v9.16b, v1.16b, v27.16b //AES block 1 - result + stp q8, q9, [x2], #32 //AES block 0, 1 - store result + + rev32 v1.16b, v30.16b //CTR block 9 +.long 0xce056dad //eor3 v13.16b, v13.16b, v5.16b, v27.16b //AES block 5 - result + add v30.4s, v30.4s, v31.4s //CTR block 9 + +.long 0xce026d4a //eor3 v10.16b, v10.16b, v2.16b, v27.16b //AES block 2 - result +.long 0xce066dce //eor3 v14.16b, v14.16b, v6.16b, v27.16b //AES block 6 - result +.long 0xce046d8c //eor3 v12.16b, v12.16b, v4.16b, v27.16b //AES block 4 - result + + rev32 v2.16b, v30.16b //CTR block 10 + add v30.4s, v30.4s, v31.4s //CTR block 10 + +.long 0xce036d6b //eor3 v11.16b, v11.16b, v3.16b, v27.16b //AES block 3 - result +.long 0xce076def //eor3 v15.16b, v15.16b, v7.16b,v27.16b //AES block 7 - result + stp q10, q11, [x2], #32 //AES block 2, 3 - store result + + rev32 v3.16b, v30.16b //CTR block 11 + add v30.4s, v30.4s, v31.4s //CTR block 11 + stp q12, q13, [x2], #32 //AES block 4, 5 - store result + + stp q14, q15, [x2], #32 //AES block 6, 7 - store result + + rev32 v4.16b, v30.16b //CTR block 12 + add v30.4s, v30.4s, v31.4s //CTR block 12 + b.ge L128_enc_prepretail //do prepretail + +L128_enc_main_loop: //main loop start + rev32 v5.16b, v30.16b //CTR block 8k+13 + ldr q20, [x3, #128] //load h5l | h5h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #160] //load h6l | h6h + ext v22.16b, v22.16b, v22.16b, #8 + add v30.4s, v30.4s, v31.4s //CTR block 8k+13 + + rev64 v9.16b, v9.16b //GHASH block 8k+1 + rev64 v8.16b, v8.16b //GHASH block 8k + ldr q23, [x3, #176] //load h7l | h7h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #208] //load h8l | h8h + ext v25.16b, v25.16b, v25.16b, #8 + + rev32 v6.16b, v30.16b //CTR block 8k+14 + add v30.4s, v30.4s, v31.4s //CTR block 8k+14 + ext v19.16b, v19.16b, v19.16b, #8 //PRE 0 + + ldr q21, [x3, #144] //load h6k | h5k + ldr q24, [x3, #192] //load h8k | h7k + rev64 v13.16b, v13.16b //GHASH block 8k+5 (t0, t1, t2 and t3 free) + rev64 v11.16b, v11.16b //GHASH block 8k+3 + + ldp q26, q27, [x8, #0] //load rk0, rk1 + eor v8.16b, v8.16b, v19.16b //PRE 1 + rev32 v7.16b, v30.16b //CTR block 8k+15 + + rev64 v15.16b, v15.16b //GHASH block 8k+7 (t0, t1, t2 and t3 free) + + pmull2 v16.1q, v9.2d, v23.2d //GHASH block 8k+1 - high + rev64 v10.16b, v10.16b //GHASH block 8k+2 + pmull2 v17.1q, v8.2d, v25.2d //GHASH block 8k - high + + pmull v23.1q, v9.1d, v23.1d //GHASH block 8k+1 - low + trn1 v18.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + pmull v19.1q, v8.1d, v25.1d //GHASH block 8k - low + + trn2 v8.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + pmull2 v29.1q, v10.2d, v22.2d //GHASH block 8k+2 - high + pmull2 v9.1q, v11.2d, v20.2d //GHASH block 8k+3 - high + + eor v19.16b, v19.16b, v23.16b //GHASH block 8k+1 - low + ldr q23, [x3, #80] //load h3l | h3h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #112] //load h3l | h3h + ext v25.16b, v25.16b, v25.16b, #8 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 0 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 0 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 0 + eor v17.16b, v17.16b, v16.16b //GHASH block 8k+1 - high + + add v30.4s, v30.4s, v31.4s //CTR block 8k+15 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 0 + eor v8.16b, v8.16b, v18.16b //GHASH block 8k, 8k+1 - mid + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 0 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 1 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 0 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 1 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 0 + pmull v22.1q, v10.1d, v22.1d //GHASH block 8k+2 - low + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 1 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 0 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 1 + +.long 0xce1d2631 //eor3 v17.16b, v17.16b, v29.16b,v9.16b //GHASH block 8k+2, 8k+3 - high + trn1 v29.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + trn2 v10.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + + ldp q28, q26, [x8, #32] //load rk2, rk3 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 1 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 1 + + pmull v20.1q, v11.1d, v20.1d //GHASH block 8k+3 - low + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 1 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 1 + + pmull2 v18.1q, v8.2d, v24.2d //GHASH block 8k - mid + eor v10.16b, v10.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + pmull v24.1q, v8.1d, v24.1d //GHASH block 8k+1 - mid + + rev64 v14.16b, v14.16b //GHASH block 8k+6 (t0, t1, and t2 free) +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+2, 8k+3 - low + + pmull2 v29.1q, v10.2d, v21.2d //GHASH block 8k+2 - mid + eor v18.16b, v18.16b, v24.16b //GHASH block 8k+1 - mid + pmull v21.1q, v10.1d, v21.1d //GHASH block 8k+3 - mid + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 2 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 2 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 2 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 2 +.long 0xce157652 //eor3 v18.16b, v18.16b, v21.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 2 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 2 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 2 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 2 + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 3 + ldr q21, [x3, #48] //load h2k | h1k + ldr q24, [x3, #96] //load h4k | h3k + rev64 v12.16b, v12.16b //GHASH block 8k+4 (t0, t1, and t2 free) + + ldp q27, q28, [x8, #64] //load rk4, rk5 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 3 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 3 + + ldr q20, [x3, #32] //load h1l | h1h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #64] //load h1l | h1h + ext v22.16b, v22.16b, v22.16b, #8 + pmull2 v8.1q, v12.2d, v25.2d //GHASH block 8k+4 - high + pmull v25.1q, v12.1d, v25.1d //GHASH block 8k+4 - low + + trn1 v16.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + trn2 v12.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 3 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 3 + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 3 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 3 + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 3 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 4 + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 4 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 4 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 4 + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 4 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 4 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 4 + + pmull2 v10.1q, v13.2d, v23.2d //GHASH block 8k+5 - high + eor v12.16b, v12.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + pmull v23.1q, v13.1d, v23.1d //GHASH block 8k+5 - low + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 4 + ldp q26, q27, [x8, #96] //load rk6, rk7 + trn1 v13.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + + pmull2 v16.1q, v12.2d, v24.2d //GHASH block 8k+4 - mid + pmull v24.1q, v12.1d, v24.1d //GHASH block 8k+5 - mid + pmull2 v11.1q, v14.2d, v22.2d //GHASH block 8k+6 - high + + pmull2 v12.1q, v15.2d, v20.2d //GHASH block 8k+7 - high + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 5 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 5 + + pmull v22.1q, v14.1d, v22.1d //GHASH block 8k+6 - low +.long 0xce082a31 //eor3 v17.16b, v17.16b, v8.16b, v10.16b //GHASH block 8k+4, 8k+5 - high + trn2 v14.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + +.long 0xce195e73 //eor3 v19.16b, v19.16b, v25.16b, v23.16b //GHASH block 8k+4, 8k+5 - low + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 5 + + eor v14.16b, v14.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 5 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 5 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 5 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 5 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 5 + +.long 0xce184252 //eor3 v18.16b, v18.16b, v24.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + ldr d16, [x10] //MODULO - load modulo constant + pmull v20.1q, v15.1d, v20.1d //GHASH block 8k+7 - low + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 6 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 6 + + pmull2 v13.1q, v14.2d, v21.2d //GHASH block 8k+6 - mid + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 6 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 6 + + pmull v21.1q, v14.1d, v21.1d //GHASH block 8k+7 - mid +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+6, 8k+7 - low + ldp q8, q9, [x0], #32 //AES block 8k+8, 8k+9 - load plaintext + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 6 + rev32 v20.16b, v30.16b //CTR block 8k+16 + add v30.4s, v30.4s, v31.4s //CTR block 8k+16 + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 6 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 6 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 6 + +.long 0xce153652 //eor3 v18.16b, v18.16b, v21.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + ldp q28, q26, [x8, #128] //load rk8, rk9 +.long 0xce0b3231 //eor3 v17.16b, v17.16b, v11.16b, v12.16b //GHASH block 8k+6, 8k+7 - high + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 7 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 7 + ldp q10, q11, [x0], #32 //AES block 8k+10, 8k+11 - load plaintext + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 7 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 7 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 7 + + pmull v21.1q, v17.1d, v16.1d //MODULO - top 64b align with mid + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 7 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 7 + + rev32 v22.16b, v30.16b //CTR block 8k+17 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 7 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 8 + ldp q12, q13, [x0], #32 //AES block 8k+12, 8k+13 - load plaintext + add v30.4s, v30.4s, v31.4s //CTR block 8k+17 + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 8 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 8 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 8 + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 8 +.long 0xce114e52 //eor3 v18.16b, v18.16b, v17.16b, v19.16b //MODULO - karatsuba tidy up + ldr q27, [x8, #160] //load rk10 + + ext v29.16b, v17.16b, v17.16b, #8 //MODULO - other top alignment + rev32 v23.16b, v30.16b //CTR block 8k+18 + add v30.4s, v30.4s, v31.4s //CTR block 8k+18 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 8 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 8 +.long 0xce1d5652 //eor3 v18.16b, v18.16b, v29.16b, v21.16b //MODULO - fold into mid + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 8 + + aese v2.16b, v26.16b //AES block 8k+10 - round 9 + aese v4.16b, v26.16b //AES block 8k+12 - round 9 + aese v1.16b, v26.16b //AES block 8k+9 - round 9 + + ldp q14, q15, [x0], #32 //AES block 8k+14, 8k+15 - load plaintext + rev32 v25.16b, v30.16b //CTR block 8k+19 + add v30.4s, v30.4s, v31.4s //CTR block 8k+19 + + cmp x0, x5 //LOOP CONTROL +.long 0xce046d8c //eor3 v12.16b, v12.16b, v4.16b, v27.16b //AES block 4 - result + aese v7.16b, v26.16b //AES block 8k+15 - round 9 + + aese v6.16b, v26.16b //AES block 8k+14 - round 9 + aese v3.16b, v26.16b //AES block 8k+11 - round 9 + +.long 0xce026d4a //eor3 v10.16b, v10.16b, v2.16b, v27.16b //AES block 8k+10 - result + + mov v2.16b, v23.16b //CTR block 8k+18 + aese v0.16b, v26.16b //AES block 8k+8 - round 9 + + rev32 v4.16b, v30.16b //CTR block 8k+20 + add v30.4s, v30.4s, v31.4s //CTR block 8k+20 + +.long 0xce076def //eor3 v15.16b, v15.16b, v7.16b, v27.16b //AES block 7 - result + aese v5.16b, v26.16b //AES block 8k+13 - round 9 + pmull v17.1q, v18.1d, v16.1d //MODULO - mid 64b align with low + +.long 0xce016d29 //eor3 v9.16b, v9.16b, v1.16b, v27.16b //AES block 8k+9 - result +.long 0xce036d6b //eor3 v11.16b, v11.16b, v3.16b, v27.16b //AES block 8k+11 - result + mov v3.16b, v25.16b //CTR block 8k+19 + + ext v21.16b, v18.16b, v18.16b, #8 //MODULO - other mid alignment +.long 0xce056dad //eor3 v13.16b, v13.16b, v5.16b, v27.16b //AES block 5 - result + mov v1.16b, v22.16b //CTR block 8k+17 + +.long 0xce006d08 //eor3 v8.16b, v8.16b, v0.16b, v27.16b //AES block 8k+8 - result + mov v0.16b, v20.16b //CTR block 8k+16 + stp q8, q9, [x2], #32 //AES block 8k+8, 8k+9 - store result + + stp q10, q11, [x2], #32 //AES block 8k+10, 8k+11 - store result +.long 0xce066dce //eor3 v14.16b, v14.16b, v6.16b, v27.16b //AES block 6 - result + + stp q12, q13, [x2], #32 //AES block 8k+12, 8k+13 - store result +.long 0xce115673 //eor3 v19.16b, v19.16b, v17.16b, v21.16b //MODULO - fold into low + + stp q14, q15, [x2], #32 //AES block 8k+14, 8k+15 - store result + b.lt L128_enc_main_loop + +L128_enc_prepretail: //PREPRETAIL + rev32 v5.16b, v30.16b //CTR block 8k+13 + ldr q23, [x3, #176] //load h7l | h7h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #208] //load h8l | h8h + ext v25.16b, v25.16b, v25.16b, #8 + ext v19.16b, v19.16b, v19.16b, #8 //PRE 0 + + ldr q20, [x3, #128] //load h5l | h5h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #160] //load h6l | h6h + ext v22.16b, v22.16b, v22.16b, #8 + rev64 v8.16b, v8.16b //GHASH block 8k + rev64 v9.16b, v9.16b //GHASH block 8k+1 + + ldr q21, [x3, #144] //load h6k | h5k + ldr q24, [x3, #192] //load h6k | h5k + add v30.4s, v30.4s, v31.4s //CTR block 8k+13 + rev64 v11.16b, v11.16b //GHASH block 8k+3 + + rev64 v10.16b, v10.16b //GHASH block 8k+2 + eor v8.16b, v8.16b, v19.16b //PRE 1 + + rev32 v6.16b, v30.16b //CTR block 8k+14 + + pmull2 v16.1q, v9.2d, v23.2d //GHASH block 8k+1 - high + pmull v19.1q, v8.1d, v25.1d //GHASH block 8k - low + pmull2 v17.1q, v8.2d, v25.2d //GHASH block 8k - high + + rev64 v13.16b, v13.16b //GHASH block 8k+5 (t0, t1, t2 and t3 free) + trn1 v18.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + + pmull v23.1q, v9.1d, v23.1d //GHASH block 8k+1 - low + eor v17.16b, v17.16b, v16.16b //GHASH block 8k+1 - high + trn2 v8.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + + eor v19.16b, v19.16b, v23.16b //GHASH block 8k+1 - low + eor v8.16b, v8.16b, v18.16b //GHASH block 8k, 8k+1 - mid + + ldp q26, q27, [x8, #0] //load rk0, rk1 + add v30.4s, v30.4s, v31.4s //CTR block 8k+14 + + pmull2 v18.1q, v8.2d, v24.2d //GHASH block 8k - mid + pmull v24.1q, v8.1d, v24.1d //GHASH block 8k+1 - mid + + rev64 v12.16b, v12.16b //GHASH block 8k+4 (t0, t1, and t2 free) + rev64 v15.16b, v15.16b //GHASH block 8k+7 (t0, t1, t2 and t3 free) + + eor v18.16b, v18.16b, v24.16b //GHASH block 8k+1 - mid + + rev32 v7.16b, v30.16b //CTR block 8k+15 + + rev64 v14.16b, v14.16b //GHASH block 8k+6 (t0, t1, and t2 free) + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 0 + + pmull2 v9.1q, v11.2d, v20.2d //GHASH block 8k+3 - high + pmull2 v29.1q, v10.2d, v22.2d //GHASH block 8k+2 - high + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 0 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 0 + + pmull v22.1q, v10.1d, v22.1d //GHASH block 8k+2 - low + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 0 + +.long 0xce1d2631 //eor3 v17.16b, v17.16b, v29.16b, v9.16b //GHASH block 8k+2, 8k+3 - high + trn1 v29.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + trn2 v10.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 0 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 0 + + eor v10.16b, v10.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 0 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 0 + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 1 + pmull v20.1q, v11.1d, v20.1d //GHASH block 8k+3 - low + + ldr q23, [x3, #80] //load h3l | h3h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #112] //load h4l | h4h + ext v25.16b, v25.16b, v25.16b, #8 + + ldp q28, q26, [x8, #32] //load rk2, rk3 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 1 + pmull2 v29.1q, v10.2d, v21.2d //GHASH block 8k+2 - mid + +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+2, 8k+3 - low + pmull v21.1q, v10.1d, v21.1d //GHASH block 8k+3 - mid + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 1 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 1 + +.long 0xce157652 //eor3 v18.16b, v18.16b, v21.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + ldr q21, [x3, #48] //load h2k | h1k + ldr q24, [x3, #96] //load h4k | h3k + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 1 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 1 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 1 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 2 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 2 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 2 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 2 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 1 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 2 + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 3 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 2 + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 2 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 2 + ldp q27, q28, [x8, #64] //load rk4, rk5 + + ldr q20, [x3, #32] //load h1l | h1h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #64] //load h1l | h1h + ext v22.16b, v22.16b, v22.16b, #8 + trn1 v16.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 3 + + pmull2 v8.1q, v12.2d, v25.2d //GHASH block 8k+4 - high + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 3 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 3 + + pmull v25.1q, v12.1d, v25.1d //GHASH block 8k+4 - low + trn2 v12.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + pmull2 v10.1q, v13.2d, v23.2d //GHASH block 8k+5 - high + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 3 + add v30.4s, v30.4s, v31.4s //CTR block 8k+15 + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 3 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 3 + eor v12.16b, v12.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + + pmull v23.1q, v13.1d, v23.1d //GHASH block 8k+5 - low + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 3 + pmull2 v11.1q, v14.2d, v22.2d //GHASH block 8k+6 - high + + trn1 v13.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + pmull v22.1q, v14.1d, v22.1d //GHASH block 8k+6 - low + trn2 v14.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 4 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 4 +.long 0xce082a31 //eor3 v17.16b, v17.16b, v8.16b, v10.16b //GHASH block 8k+4, 8k+5 - high + +.long 0xce195e73 //eor3 v19.16b, v19.16b, v25.16b, v23.16b //GHASH block 8k+4, 8k+5 - low + eor v14.16b, v14.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + pmull2 v16.1q, v12.2d, v24.2d //GHASH block 8k+4 - mid + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 5 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 4 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 4 + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 4 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 4 + + pmull v24.1q, v12.1d, v24.1d //GHASH block 8k+5 - mid + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 4 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 4 + + pmull2 v12.1q, v15.2d, v20.2d //GHASH block 8k+7 - high + ldp q26, q27, [x8, #96] //load rk6, rk7 + pmull v20.1q, v15.1d, v20.1d //GHASH block 8k+7 - low + +.long 0xce184252 //eor3 v18.16b, v18.16b, v24.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + pmull2 v13.1q, v14.2d, v21.2d //GHASH block 8k+6 - mid + pmull v21.1q, v14.1d, v21.1d //GHASH block 8k+7 - mid + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 5 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 5 + ldr d16, [x10] //MODULO - load modulo constant + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 5 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 5 + +.long 0xce0b3231 //eor3 v17.16b, v17.16b, v11.16b, v12.16b //GHASH block 8k+6, 8k+7 - high + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 5 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 5 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 5 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 6 + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 6 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 6 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 6 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 6 +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+6, 8k+7 - low +.long 0xce153652 //eor3 v18.16b, v18.16b, v21.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 6 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 6 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 6 + + pmull v21.1q, v17.1d, v16.1d //MODULO - top 64b align with mid +.long 0xce114e52 //eor3 v18.16b, v18.16b, v17.16b, v19.16b //MODULO - karatsuba tidy up + ldp q28, q26, [x8, #128] //load rk8, rk9 + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 7 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 7 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 7 + ext v29.16b, v17.16b, v17.16b, #8 //MODULO - other top alignment + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 7 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 7 +.long 0xce1d5652 //eor3 v18.16b, v18.16b, v29.16b, v21.16b //MODULO - fold into mid + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 7 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 7 + + pmull v17.1q, v18.1d, v16.1d //MODULO - mid 64b align with low + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 7 + + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 8 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 8 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 8 + ext v18.16b, v18.16b, v18.16b, #8 //MODULO - other mid alignment + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 8 +.long 0xce114a73 //eor3 v19.16b, v19.16b, v17.16b, v18.16b //MODULO - fold into low + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 8 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 8 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 8 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 8 + + ldr q27, [x8, #160] //load rk10 + aese v6.16b, v26.16b //AES block 8k+14 - round 9 + aese v2.16b, v26.16b //AES block 8k+10 - round 9 + + aese v0.16b, v26.16b //AES block 8k+8 - round 9 + aese v1.16b, v26.16b //AES block 8k+9 - round 9 + + aese v3.16b, v26.16b //AES block 8k+11 - round 9 + aese v5.16b, v26.16b //AES block 8k+13 - round 9 + + aese v4.16b, v26.16b //AES block 8k+12 - round 9 + aese v7.16b, v26.16b //AES block 8k+15 - round 9 +L128_enc_tail: //TAIL + + sub x5, x4, x0 //main_end_input_ptr is number of bytes left to process + ldr q8, [x0], #16 //AES block 8k+8 - load plaintext + + mov v29.16b, v27.16b + ldp q20, q21, [x3, #128] //load h5l | h5h + ext v20.16b, v20.16b, v20.16b, #8 + +.long 0xce007509 //eor3 v9.16b, v8.16b, v0.16b, v29.16b //AES block 8k+8 - result + ext v16.16b, v19.16b, v19.16b, #8 //prepare final partial tag + ldp q22, q23, [x3, #160] //load h6l | h6h + ext v22.16b, v22.16b, v22.16b, #8 + ext v23.16b, v23.16b, v23.16b, #8 + + ldp q24, q25, [x3, #192] //load h8k | h7k + ext v25.16b, v25.16b, v25.16b, #8 + cmp x5, #112 + b.gt L128_enc_blocks_more_than_7 + + mov v7.16b, v6.16b + mov v6.16b, v5.16b + movi v17.8b, #0 + + cmp x5, #96 + sub v30.4s, v30.4s, v31.4s + mov v5.16b, v4.16b + + mov v4.16b, v3.16b + mov v3.16b, v2.16b + mov v2.16b, v1.16b + + movi v19.8b, #0 + movi v18.8b, #0 + b.gt L128_enc_blocks_more_than_6 + + mov v7.16b, v6.16b + cmp x5, #80 + + sub v30.4s, v30.4s, v31.4s + mov v6.16b, v5.16b + mov v5.16b, v4.16b + + mov v4.16b, v3.16b + mov v3.16b, v1.16b + b.gt L128_enc_blocks_more_than_5 + + cmp x5, #64 + sub v30.4s, v30.4s, v31.4s + + mov v7.16b, v6.16b + mov v6.16b, v5.16b + + mov v5.16b, v4.16b + mov v4.16b, v1.16b + b.gt L128_enc_blocks_more_than_4 + + mov v7.16b, v6.16b + sub v30.4s, v30.4s, v31.4s + mov v6.16b, v5.16b + + mov v5.16b, v1.16b + cmp x5, #48 + b.gt L128_enc_blocks_more_than_3 + + sub v30.4s, v30.4s, v31.4s + mov v7.16b, v6.16b + mov v6.16b, v1.16b + + cmp x5, #32 + ldr q24, [x3, #96] //load h4k | h3k + b.gt L128_enc_blocks_more_than_2 + + cmp x5, #16 + + sub v30.4s, v30.4s, v31.4s + mov v7.16b, v1.16b + b.gt L128_enc_blocks_more_than_1 + + ldr q21, [x3, #48] //load h2k | h1k + sub v30.4s, v30.4s, v31.4s + b L128_enc_blocks_less_than_1 +L128_enc_blocks_more_than_7: //blocks left > 7 + st1 { v9.16b}, [x2], #16 //AES final-7 block - store result + + rev64 v8.16b, v9.16b //GHASH final-7 block + ldr q9, [x0], #16 //AES final-6 block - load plaintext + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-7 block - mid + + pmull2 v17.1q, v8.2d, v25.2d //GHASH final-7 block - high + + ins v18.d[0], v24.d[1] //GHASH final-7 block - mid + + eor v27.8b, v27.8b, v8.8b //GHASH final-7 block - mid + movi v16.8b, #0 //suppress further partial tag feed in + +.long 0xce017529 //eor3 v9.16b, v9.16b, v1.16b, v29.16b //AES final-6 block - result + + pmull v18.1q, v27.1d, v18.1d //GHASH final-7 block - mid + pmull v19.1q, v8.1d, v25.1d //GHASH final-7 block - low +L128_enc_blocks_more_than_6: //blocks left > 6 + + st1 { v9.16b}, [x2], #16 //AES final-6 block - store result + + rev64 v8.16b, v9.16b //GHASH final-6 block + ldr q9, [x0], #16 //AES final-5 block - load plaintext + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-6 block - mid + +.long 0xce027529 //eor3 v9.16b, v9.16b, v2.16b, v29.16b //AES final-5 block - result + pmull v26.1q, v8.1d, v23.1d //GHASH final-6 block - low + + eor v27.8b, v27.8b, v8.8b //GHASH final-6 block - mid + movi v16.8b, #0 //suppress further partial tag feed in + + pmull v27.1q, v27.1d, v24.1d //GHASH final-6 block - mid + pmull2 v28.1q, v8.2d, v23.2d //GHASH final-6 block - high + + eor v19.16b, v19.16b, v26.16b //GHASH final-6 block - low + + eor v18.16b, v18.16b, v27.16b //GHASH final-6 block - mid + eor v17.16b, v17.16b, v28.16b //GHASH final-6 block - high +L128_enc_blocks_more_than_5: //blocks left > 5 + + st1 { v9.16b}, [x2], #16 //AES final-5 block - store result + + rev64 v8.16b, v9.16b //GHASH final-5 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-5 block - mid + ldr q9, [x0], #16 //AES final-4 block - load plaintext + pmull2 v28.1q, v8.2d, v22.2d //GHASH final-5 block - high + + eor v17.16b, v17.16b, v28.16b //GHASH final-5 block - high + + eor v27.8b, v27.8b, v8.8b //GHASH final-5 block - mid + + ins v27.d[1], v27.d[0] //GHASH final-5 block - mid + +.long 0xce037529 //eor3 v9.16b, v9.16b, v3.16b, v29.16b //AES final-4 block - result + pmull v26.1q, v8.1d, v22.1d //GHASH final-5 block - low + movi v16.8b, #0 //suppress further partial tag feed in + + pmull2 v27.1q, v27.2d, v21.2d //GHASH final-5 block - mid + eor v19.16b, v19.16b, v26.16b //GHASH final-5 block - low + + eor v18.16b, v18.16b, v27.16b //GHASH final-5 block - mid +L128_enc_blocks_more_than_4: //blocks left > 4 + + st1 { v9.16b}, [x2], #16 //AES final-4 block - store result + + rev64 v8.16b, v9.16b //GHASH final-4 block + + ldr q9, [x0], #16 //AES final-3 block - load plaintext + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-4 block - mid + movi v16.8b, #0 //suppress further partial tag feed in + pmull2 v28.1q, v8.2d, v20.2d //GHASH final-4 block - high + + eor v27.8b, v27.8b, v8.8b //GHASH final-4 block - mid + + pmull v26.1q, v8.1d, v20.1d //GHASH final-4 block - low + + eor v17.16b, v17.16b, v28.16b //GHASH final-4 block - high + pmull v27.1q, v27.1d, v21.1d //GHASH final-4 block - mid + + eor v19.16b, v19.16b, v26.16b //GHASH final-4 block - low + +.long 0xce047529 //eor3 v9.16b, v9.16b, v4.16b, v29.16b //AES final-3 block - result + eor v18.16b, v18.16b, v27.16b //GHASH final-4 block - mid +L128_enc_blocks_more_than_3: //blocks left > 3 + + st1 { v9.16b}, [x2], #16 //AES final-3 block - store result + + ldr q25, [x3, #112] //load h4l | h4h + ext v25.16b, v25.16b, v25.16b, #8 + + rev64 v8.16b, v9.16b //GHASH final-3 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + movi v16.8b, #0 //suppress further partial tag feed in + + ins v27.d[0], v8.d[1] //GHASH final-3 block - mid + ldr q24, [x3, #96] //load h4k | h3k + pmull v26.1q, v8.1d, v25.1d //GHASH final-3 block - low + + ldr q9, [x0], #16 //AES final-2 block - load plaintext + + eor v27.8b, v27.8b, v8.8b //GHASH final-3 block - mid + + ins v27.d[1], v27.d[0] //GHASH final-3 block - mid + eor v19.16b, v19.16b, v26.16b //GHASH final-3 block - low + +.long 0xce057529 //eor3 v9.16b, v9.16b, v5.16b, v29.16b //AES final-2 block - result + + pmull2 v27.1q, v27.2d, v24.2d //GHASH final-3 block - mid + pmull2 v28.1q, v8.2d, v25.2d //GHASH final-3 block - high + + eor v18.16b, v18.16b, v27.16b //GHASH final-3 block - mid + eor v17.16b, v17.16b, v28.16b //GHASH final-3 block - high +L128_enc_blocks_more_than_2: //blocks left > 2 + + st1 { v9.16b}, [x2], #16 //AES final-2 block - store result + + rev64 v8.16b, v9.16b //GHASH final-2 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ldr q9, [x0], #16 //AES final-1 block - load plaintext + + ins v27.d[0], v8.d[1] //GHASH final-2 block - mid + ldr q23, [x3, #80] //load h3l | h3h + ext v23.16b, v23.16b, v23.16b, #8 + movi v16.8b, #0 //suppress further partial tag feed in + + eor v27.8b, v27.8b, v8.8b //GHASH final-2 block - mid +.long 0xce067529 //eor3 v9.16b, v9.16b, v6.16b, v29.16b //AES final-1 block - result + + pmull2 v28.1q, v8.2d, v23.2d //GHASH final-2 block - high + + pmull v26.1q, v8.1d, v23.1d //GHASH final-2 block - low + pmull v27.1q, v27.1d, v24.1d //GHASH final-2 block - mid + + eor v17.16b, v17.16b, v28.16b //GHASH final-2 block - high + + eor v18.16b, v18.16b, v27.16b //GHASH final-2 block - mid + eor v19.16b, v19.16b, v26.16b //GHASH final-2 block - low +L128_enc_blocks_more_than_1: //blocks left > 1 + + st1 { v9.16b}, [x2], #16 //AES final-1 block - store result + + ldr q22, [x3, #64] //load h2l | h2h + ext v22.16b, v22.16b, v22.16b, #8 + rev64 v8.16b, v9.16b //GHASH final-1 block + ldr q9, [x0], #16 //AES final block - load plaintext + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + movi v16.8b, #0 //suppress further partial tag feed in + ins v27.d[0], v8.d[1] //GHASH final-1 block - mid +.long 0xce077529 //eor3 v9.16b, v9.16b, v7.16b, v29.16b //AES final block - result + + pmull2 v28.1q, v8.2d, v22.2d //GHASH final-1 block - high + + eor v27.8b, v27.8b, v8.8b //GHASH final-1 block - mid + + ldr q21, [x3, #48] //load h2k | h1k + + ins v27.d[1], v27.d[0] //GHASH final-1 block - mid + + pmull v26.1q, v8.1d, v22.1d //GHASH final-1 block - low + pmull2 v27.1q, v27.2d, v21.2d //GHASH final-1 block - mid + + eor v17.16b, v17.16b, v28.16b //GHASH final-1 block - high + + eor v18.16b, v18.16b, v27.16b //GHASH final-1 block - mid + eor v19.16b, v19.16b, v26.16b //GHASH final-1 block - low +L128_enc_blocks_less_than_1: //blocks left <= 1 + + rev32 v30.16b, v30.16b + str q30, [x16] //store the updated counter + and x1, x1, #127 //bit_length %= 128 + + sub x1, x1, #128 //bit_length -= 128 + + neg x1, x1 //bit_length = 128 - #bits in input (in range [1,128]) + + mvn x6, xzr //temp0_x = 0xffffffffffffffff + ld1 { v26.16b}, [x2] //load existing bytes where the possibly partial last block is to be stored + and x1, x1, #127 //bit_length %= 128 + + lsr x6, x6, x1 //temp0_x is mask for top 64b of last block + mvn x7, xzr //temp1_x = 0xffffffffffffffff + cmp x1, #64 + + csel x13, x7, x6, lt + csel x14, x6, xzr, lt + + mov v0.d[1], x14 + mov v0.d[0], x13 //ctr0b is mask for last block + + and v9.16b, v9.16b, v0.16b //possibly partial last block has zeroes in highest bits + + rev64 v8.16b, v9.16b //GHASH final block + + bif v9.16b, v26.16b, v0.16b //insert existing bytes in top end of result before storing + st1 { v9.16b}, [x2] //store all 16B + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v16.d[0], v8.d[1] //GHASH final block - mid + + eor v16.8b, v16.8b, v8.8b //GHASH final block - mid + ldr q20, [x3, #32] //load h1l | h1h + ext v20.16b, v20.16b, v20.16b, #8 + + pmull v16.1q, v16.1d, v21.1d //GHASH final block - mid + + pmull2 v28.1q, v8.2d, v20.2d //GHASH final block - high + eor v18.16b, v18.16b, v16.16b //GHASH final block - mid + ldr d16, [x10] //MODULO - load modulo constant + + pmull v26.1q, v8.1d, v20.1d //GHASH final block - low + + eor v17.16b, v17.16b, v28.16b //GHASH final block - high + + eor v19.16b, v19.16b, v26.16b //GHASH final block - low + + ext v21.16b, v17.16b, v17.16b, #8 //MODULO - other top alignment + pmull v29.1q, v17.1d, v16.1d //MODULO - top 64b align with mid + +.long 0xce114e52 //eor3 v18.16b, v18.16b, v17.16b, v19.16b //MODULO - karatsuba tidy up + +.long 0xce1d5652 //eor3 v18.16b, v18.16b, v29.16b, v21.16b //MODULO - fold into mid + + pmull v17.1q, v18.1d, v16.1d //MODULO - mid 64b align with low + ext v21.16b, v18.16b, v18.16b, #8 //MODULO - other mid alignment + +.long 0xce115673 //eor3 v19.16b, v19.16b, v17.16b, v21.16b //MODULO - fold into low + ext v19.16b, v19.16b, v19.16b, #8 + rev64 v19.16b, v19.16b + st1 { v19.16b }, [x3] + mov x0, x9 + + ldp d10, d11, [sp, #16] + ldp d12, d13, [sp, #32] + ldp d14, d15, [sp, #48] + ldp d8, d9, [sp], #80 + ret + +L128_enc_ret: + mov w0, #0x0 + ret + +.globl unroll8_eor3_aes_gcm_dec_128_kernel +.def unroll8_eor3_aes_gcm_dec_128_kernel + .type 32 +.endef +.align 4 +unroll8_eor3_aes_gcm_dec_128_kernel: + AARCH64_VALID_CALL_TARGET + cbz x1, L128_dec_ret + stp d8, d9, [sp, #-80]! + lsr x9, x1, #3 + mov x16, x4 + mov x8, x5 + stp d10, d11, [sp, #16] + stp d12, d13, [sp, #32] + stp d14, d15, [sp, #48] + mov x5, #0xc200000000000000 + stp x5, xzr, [sp, #64] + add x10, sp, #64 + + mov x5, x9 + ld1 { v0.16b}, [x16] //CTR block 0 + + ldp q26, q27, [x8, #0] //load rk0, rk1 + sub x5, x5, #1 //byte_len - 1 + + mov x15, #0x100000000 //set up counter increment + movi v31.16b, #0x0 + mov v31.d[1], x15 + ld1 { v19.16b}, [x3] + ext v19.16b, v19.16b, v19.16b, #8 + rev64 v19.16b, v19.16b + + rev32 v30.16b, v0.16b //set up reversed counter + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 0 + + add v30.4s, v30.4s, v31.4s //CTR block 0 + + rev32 v1.16b, v30.16b //CTR block 1 + add v30.4s, v30.4s, v31.4s //CTR block 1 + + and x5, x5, #0xffffffffffffff80 //number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + + rev32 v2.16b, v30.16b //CTR block 2 + add v30.4s, v30.4s, v31.4s //CTR block 2 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 0 + + rev32 v3.16b, v30.16b //CTR block 3 + add v30.4s, v30.4s, v31.4s //CTR block 3 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 1 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 1 + + rev32 v4.16b, v30.16b //CTR block 4 + add v30.4s, v30.4s, v31.4s //CTR block 4 + + rev32 v5.16b, v30.16b //CTR block 5 + add v30.4s, v30.4s, v31.4s //CTR block 5 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 0 + + rev32 v6.16b, v30.16b //CTR block 6 + add v30.4s, v30.4s, v31.4s //CTR block 6 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 0 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 0 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 0 + + rev32 v7.16b, v30.16b //CTR block 7 + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 0 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 1 + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 0 + + ldp q28, q26, [x8, #32] //load rk2, rk3 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 1 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 1 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 1 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 1 + + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 7 - round 2 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 2 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 1 + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 6 - round 2 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 2 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 5 - round 2 + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 4 - round 2 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 2 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 2 + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 3 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 3 + + ldp q27, q28, [x8, #64] //load rk4, rk5 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 3 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 3 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 3 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 3 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 3 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 4 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 4 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 3 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 4 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 4 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 4 + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 4 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 4 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 4 + + ldp q26, q27, [x8, #96] //load rk6, rk7 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 5 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 5 + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 6 - round 5 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 5 + + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 7 - round 5 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 5 - round 5 + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 4 - round 5 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 6 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 6 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 5 + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 6 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 6 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 6 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 6 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 6 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 6 + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 7 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 7 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 7 + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 7 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 7 + ldp q28, q26, [x8, #128] //load rk8, rk9 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 7 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 7 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 7 + + add x5, x5, x0 + add v30.4s, v30.4s, v31.4s //CTR block 7 + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 6 - round 8 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 8 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 8 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 7 - round 8 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 8 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 5 - round 8 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 8 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 4 - round 8 + + aese v0.16b, v26.16b //AES block 0 - round 9 + aese v1.16b, v26.16b //AES block 1 - round 9 + aese v6.16b, v26.16b //AES block 6 - round 9 + + ldr q27, [x8, #160] //load rk10 + aese v4.16b, v26.16b //AES block 4 - round 9 + aese v3.16b, v26.16b //AES block 3 - round 9 + + aese v2.16b, v26.16b //AES block 2 - round 9 + aese v5.16b, v26.16b //AES block 5 - round 9 + aese v7.16b, v26.16b //AES block 7 - round 9 + + add x4, x0, x1, lsr #3 //end_input_ptr + cmp x0, x5 //check if we have <= 8 blocks + b.ge L128_dec_tail //handle tail + + ldp q8, q9, [x0], #32 //AES block 0, 1 - load ciphertext + +.long 0xce006d00 //eor3 v0.16b, v8.16b, v0.16b, v27.16b //AES block 0 - result +.long 0xce016d21 //eor3 v1.16b, v9.16b, v1.16b, v27.16b //AES block 1 - result + stp q0, q1, [x2], #32 //AES block 0, 1 - store result + + rev32 v0.16b, v30.16b //CTR block 8 + add v30.4s, v30.4s, v31.4s //CTR block 8 + ldp q10, q11, [x0], #32 //AES block 2, 3 - load ciphertext + + ldp q12, q13, [x0], #32 //AES block 4, 5 - load ciphertext + + rev32 v1.16b, v30.16b //CTR block 9 + add v30.4s, v30.4s, v31.4s //CTR block 9 + ldp q14, q15, [x0], #32 //AES block 6, 7 - load ciphertext + +.long 0xce036d63 //eor3 v3.16b, v11.16b, v3.16b, v27.16b //AES block 3 - result +.long 0xce026d42 //eor3 v2.16b, v10.16b, v2.16b, v27.16b //AES block 2 - result + stp q2, q3, [x2], #32 //AES block 2, 3 - store result + + rev32 v2.16b, v30.16b //CTR block 10 + add v30.4s, v30.4s, v31.4s //CTR block 10 + +.long 0xce066dc6 //eor3 v6.16b, v14.16b, v6.16b, v27.16b //AES block 6 - result + + rev32 v3.16b, v30.16b //CTR block 11 + add v30.4s, v30.4s, v31.4s //CTR block 11 + +.long 0xce046d84 //eor3 v4.16b, v12.16b, v4.16b, v27.16b //AES block 4 - result +.long 0xce056da5 //eor3 v5.16b, v13.16b, v5.16b, v27.16b //AES block 5 - result + stp q4, q5, [x2], #32 //AES block 4, 5 - store result + +.long 0xce076de7 //eor3 v7.16b, v15.16b, v7.16b, v27.16b //AES block 7 - result + stp q6, q7, [x2], #32 //AES block 6, 7 - store result + rev32 v4.16b, v30.16b //CTR block 12 + + cmp x0, x5 //check if we have <= 8 blocks + add v30.4s, v30.4s, v31.4s //CTR block 12 + b.ge L128_dec_prepretail //do prepretail + +L128_dec_main_loop: //main loop start + ldr q23, [x3, #176] //load h7l | h7h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #208] //load h8l | h8h + ext v25.16b, v25.16b, v25.16b, #8 + + rev64 v9.16b, v9.16b //GHASH block 8k+1 + rev64 v8.16b, v8.16b //GHASH block 8k + ext v19.16b, v19.16b, v19.16b, #8 //PRE 0 + + rev64 v14.16b, v14.16b //GHASH block 8k+6 + ldr q20, [x3, #128] //load h5l | h5h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #160] //load h6l | h6h + ext v22.16b, v22.16b, v22.16b, #8 + + eor v8.16b, v8.16b, v19.16b //PRE 1 + rev32 v5.16b, v30.16b //CTR block 8k+13 + add v30.4s, v30.4s, v31.4s //CTR block 8k+13 + + rev64 v10.16b, v10.16b //GHASH block 8k+2 + rev64 v12.16b, v12.16b //GHASH block 8k+4 + ldp q26, q27, [x8, #0] //load rk0, rk1 + + rev32 v6.16b, v30.16b //CTR block 8k+14 + add v30.4s, v30.4s, v31.4s //CTR block 8k+14 + ldr q21, [x3, #144] //load h6k | h5k + ldr q24, [x3, #192] //load h8k | h7k + + pmull2 v16.1q, v9.2d, v23.2d //GHASH block 8k+1 - high + pmull2 v17.1q, v8.2d, v25.2d //GHASH block 8k - high + rev64 v11.16b, v11.16b //GHASH block 8k+3 + + rev32 v7.16b, v30.16b //CTR block 8k+15 + trn1 v18.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + rev64 v13.16b, v13.16b //GHASH block 8k+5 + + pmull v23.1q, v9.1d, v23.1d //GHASH block 8k+1 - low + pmull v19.1q, v8.1d, v25.1d //GHASH block 8k - low + trn2 v8.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + + pmull2 v29.1q, v10.2d, v22.2d //GHASH block 8k+2 - high + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 0 + pmull2 v9.1q, v11.2d, v20.2d //GHASH block 8k+3 - high + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 0 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 0 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 0 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 0 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 0 + eor v17.16b, v17.16b, v16.16b //GHASH block 8k+1 - high + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 0 + eor v8.16b, v8.16b, v18.16b //GHASH block 8k, 8k+1 - mid + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 0 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 1 + eor v19.16b, v19.16b, v23.16b //GHASH block 8k+1 - low +.long 0xce1d2631 //eor3 v17.16b, v17.16b, v29.16b, v9.16b //GHASH block 8k+2, 8k+3 - high + + ldp q28, q26, [x8, #32] //load rk2, rk3 + trn1 v29.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 1 + + pmull v22.1q, v10.1d, v22.1d //GHASH block 8k+2 - low + trn2 v10.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + pmull2 v18.1q, v8.2d, v24.2d //GHASH block 8k - mid + + ldr q23, [x3, #80] //load h3l | h3h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #112] //load h4l | h4h + ext v25.16b, v25.16b, v25.16b, #8 + pmull v24.1q, v8.1d, v24.1d //GHASH block 8k+1 - mid + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 1 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 1 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 1 + pmull v20.1q, v11.1d, v20.1d //GHASH block 8k+3 - low + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 1 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 1 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 1 + + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 2 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 2 +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+2, 8k+3 - low + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 2 + eor v10.16b, v10.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + ldr q20, [x3, #32] //load h1l | h1h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #64] //load h2l | h2h + ext v22.16b, v22.16b, v22.16b, #8 + + eor v18.16b, v18.16b, v24.16b //GHASH block 8k+1 - mid + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 2 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 2 + + trn1 v16.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 2 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 2 + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 2 + pmull2 v29.1q, v10.2d, v21.2d //GHASH block 8k+2 - mid + pmull v21.1q, v10.1d, v21.1d //GHASH block 8k+3 - mid + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 3 + rev64 v15.16b, v15.16b //GHASH block 8k+7 + pmull2 v8.1q, v12.2d, v25.2d //GHASH block 8k+4 - high + + ldp q27, q28, [x8, #64] //load rk4, rk5 + pmull v25.1q, v12.1d, v25.1d //GHASH block 8k+4 - low +.long 0xce157652 //eor3 v18.16b, v18.16b, v21.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + + ldr q21, [x3, #48] //load h2k | h1k + ldr q24, [x3, #96] //load h4k | h3k + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 3 + trn2 v12.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 3 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 3 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 3 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 3 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 3 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 3 + + pmull2 v10.1q, v13.2d, v23.2d //GHASH block 8k+5 - high + pmull v23.1q, v13.1d, v23.1d //GHASH block 8k+5 - low + pmull2 v11.1q, v14.2d, v22.2d //GHASH block 8k+6 - high + + pmull v22.1q, v14.1d, v22.1d //GHASH block 8k+6 - low + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 4 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 4 + + eor v12.16b, v12.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + trn1 v13.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 4 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 4 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 4 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 4 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 4 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 4 + trn2 v14.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + + ldp q26, q27, [x8, #96] //load rk6, rk7 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 5 + pmull2 v16.1q, v12.2d, v24.2d //GHASH block 8k+4 - mid + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 5 + eor v14.16b, v14.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 5 + + pmull v24.1q, v12.1d, v24.1d //GHASH block 8k+5 - mid + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 5 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 5 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 5 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 5 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 5 + + pmull2 v12.1q, v15.2d, v20.2d //GHASH block 8k+7 - high +.long 0xce184252 //eor3 v18.16b, v18.16b, v24.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid +.long 0xce195e73 //eor3 v19.16b, v19.16b, v25.16b, v23.16b //GHASH block 8k+4, 8k+5 - low + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 6 +.long 0xce082a31 //eor3 v17.16b, v17.16b, v8.16b, v10.16b //GHASH block 8k+4, 8k+5 - high + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 6 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 6 + pmull2 v13.1q, v14.2d, v21.2d //GHASH block 8k+6 - mid + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 6 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 6 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 6 + pmull v20.1q, v15.1d, v20.1d //GHASH block 8k+7 - low + + pmull v21.1q, v14.1d, v21.1d //GHASH block 8k+7 - mid + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 6 + add v30.4s, v30.4s, v31.4s //CTR block 8k+15 + +.long 0xce0b3231 //eor3 v17.16b, v17.16b, v11.16b, v12.16b //GHASH block 8k+6, 8k+7 - high + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 6 + ldp q28, q26, [x8, #128] //load rk8, rk9 + + ldr d16, [x10] //MODULO - load modulo constant +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+6, 8k+7 - low + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 7 + + rev32 v20.16b, v30.16b //CTR block 8k+16 +.long 0xce153652 //eor3 v18.16b, v18.16b, v21.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + add v30.4s, v30.4s, v31.4s //CTR block 8k+16 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 7 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 7 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 7 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 7 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 7 + rev32 v22.16b, v30.16b //CTR block 8k+17 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 7 + ext v21.16b, v17.16b, v17.16b, #8 //MODULO - other top alignment + pmull v29.1q, v17.1d, v16.1d //MODULO - top 64b align with mid + +.long 0xce114e52 //eor3 v18.16b, v18.16b, v17.16b, v19.16b //MODULO - karatsuba tidy up + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 7 + add v30.4s, v30.4s, v31.4s //CTR block 8k+17 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 8 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 8 + ldp q8, q9, [x0], #32 //AES block 8k+8, 8k+9 - load ciphertext + + ldp q10, q11, [x0], #32 //AES block 8k+10, 8k+11 - load ciphertext + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 8 + rev32 v23.16b, v30.16b //CTR block 8k+18 + + ldp q12, q13, [x0], #32 //AES block 8k+12, 8k+13 - load ciphertext + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 8 +.long 0xce1d5652 //eor3 v18.16b, v18.16b, v29.16b, v21.16b //MODULO - fold into mid + + ldp q14, q15, [x0], #32 //AES block 8k+14, 8k+15 - load ciphertext + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 8 + add v30.4s, v30.4s, v31.4s //CTR block 8k+18 + + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 8 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 8 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 8 + + aese v0.16b, v26.16b //AES block 8k+8 - round 9 + aese v1.16b, v26.16b //AES block 8k+9 - round 9 + ldr q27, [x8, #160] //load rk10 + + aese v6.16b, v26.16b //AES block 8k+14 - round 9 + pmull v17.1q, v18.1d, v16.1d //MODULO - mid 64b align with low + aese v2.16b, v26.16b //AES block 8k+10 - round 9 + + aese v7.16b, v26.16b //AES block 8k+15 - round 9 + aese v4.16b, v26.16b //AES block 8k+12 - round 9 + ext v21.16b, v18.16b, v18.16b, #8 //MODULO - other mid alignment + + rev32 v25.16b, v30.16b //CTR block 8k+19 + add v30.4s, v30.4s, v31.4s //CTR block 8k+19 + + aese v3.16b, v26.16b //AES block 8k+11 - round 9 + aese v5.16b, v26.16b //AES block 8k+13 - round 9 +.long 0xce016d21 //eor3 v1.16b, v9.16b, v1.16b, v27.16b //AES block 8k+9 - result + +.long 0xce006d00 //eor3 v0.16b, v8.16b, v0.16b, v27.16b //AES block 8k+8 - result +.long 0xce076de7 //eor3 v7.16b, v15.16b, v7.16b, v27.16b //AES block 8k+15 - result +.long 0xce066dc6 //eor3 v6.16b, v14.16b, v6.16b, v27.16b //AES block 8k+14 - result + +.long 0xce026d42 //eor3 v2.16b, v10.16b, v2.16b, v27.16b //AES block 8k+10 - result + stp q0, q1, [x2], #32 //AES block 8k+8, 8k+9 - store result + mov v1.16b, v22.16b //CTR block 8k+17 + +.long 0xce046d84 //eor3 v4.16b, v12.16b, v4.16b, v27.16b //AES block 8k+12 - result +.long 0xce115673 //eor3 v19.16b, v19.16b, v17.16b, v21.16b //MODULO - fold into low + mov v0.16b, v20.16b //CTR block 8k+16 + +.long 0xce036d63 //eor3 v3.16b, v11.16b, v3.16b, v27.16b //AES block 8k+11 - result + cmp x0, x5 //LOOP CONTROL + stp q2, q3, [x2], #32 //AES block 8k+10, 8k+11 - store result + +.long 0xce056da5 //eor3 v5.16b, v13.16b, v5.16b, v27.16b //AES block 8k+13 - result + mov v2.16b, v23.16b //CTR block 8k+18 + + stp q4, q5, [x2], #32 //AES block 8k+12, 8k+13 - store result + rev32 v4.16b, v30.16b //CTR block 8k+20 + add v30.4s, v30.4s, v31.4s //CTR block 8k+20 + + stp q6, q7, [x2], #32 //AES block 8k+14, 8k+15 - store result + mov v3.16b, v25.16b //CTR block 8k+19 + b.lt L128_dec_main_loop + +L128_dec_prepretail: //PREPRETAIL + rev64 v11.16b, v11.16b //GHASH block 8k+3 + ext v19.16b, v19.16b, v19.16b, #8 //PRE 0 + rev64 v8.16b, v8.16b //GHASH block 8k + + rev64 v10.16b, v10.16b //GHASH block 8k+2 + rev32 v5.16b, v30.16b //CTR block 8k+13 + ldp q26, q27, [x8, #0] //load rk0, rk1 + + ldr q23, [x3, #176] //load h7l | h7h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #208] //load h8l | h8h + ext v25.16b, v25.16b, v25.16b, #8 + eor v8.16b, v8.16b, v19.16b //PRE 1 + rev64 v9.16b, v9.16b //GHASH block 8k+1 + + add v30.4s, v30.4s, v31.4s //CTR block 8k+13 + ldr q20, [x3, #128] //load h5l | h5h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #160] //load h6l | h6h + ext v22.16b, v22.16b, v22.16b, #8 + rev64 v13.16b, v13.16b //GHASH block 8k+5 + + rev64 v12.16b, v12.16b //GHASH block 8k+4 + + rev64 v14.16b, v14.16b //GHASH block 8k+6 + + ldr q21, [x3, #144] //load h6k | h5k + ldr q24, [x3, #192] //load h8k | h7k + rev32 v6.16b, v30.16b //CTR block 8k+14 + add v30.4s, v30.4s, v31.4s //CTR block 8k+14 + + pmull2 v16.1q, v9.2d, v23.2d //GHASH block 8k+1 - high + pmull v19.1q, v8.1d, v25.1d //GHASH block 8k - low + pmull2 v17.1q, v8.2d, v25.2d //GHASH block 8k - high + + trn1 v18.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + trn2 v8.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + pmull2 v29.1q, v10.2d, v22.2d //GHASH block 8k+2 - high + + pmull v23.1q, v9.1d, v23.1d //GHASH block 8k+1 - low + pmull2 v9.1q, v11.2d, v20.2d //GHASH block 8k+3 - high + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 0 + + eor v17.16b, v17.16b, v16.16b //GHASH block 8k+1 - high + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 0 + eor v8.16b, v8.16b, v18.16b //GHASH block 8k, 8k+1 - mid + + pmull v22.1q, v10.1d, v22.1d //GHASH block 8k+2 - low + rev32 v7.16b, v30.16b //CTR block 8k+15 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 0 + +.long 0xce1d2631 //eor3 v17.16b, v17.16b, v29.16b, v9.16b //GHASH block 8k+2, 8k+3 - high + trn1 v29.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + trn2 v10.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 0 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 0 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 0 + + pmull2 v18.1q, v8.2d, v24.2d //GHASH block 8k - mid + pmull v24.1q, v8.1d, v24.1d //GHASH block 8k+1 - mid + pmull v20.1q, v11.1d, v20.1d //GHASH block 8k+3 - low + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 1 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 0 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 0 + + eor v19.16b, v19.16b, v23.16b //GHASH block 8k+1 - low + eor v10.16b, v10.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + eor v18.16b, v18.16b, v24.16b //GHASH block 8k+1 - mid + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 1 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 1 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 1 + + ldp q28, q26, [x8, #32] //load rk2, rk3 +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+2, 8k+3 - low + pmull2 v29.1q, v10.2d, v21.2d //GHASH block 8k+2 - mid + + ldr q23, [x3, #80] //load h3l | h3h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #112] //load h4l | h4h + ext v25.16b, v25.16b, v25.16b, #8 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 1 + pmull v21.1q, v10.1d, v21.1d //GHASH block 8k+3 - mid + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 1 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 1 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 1 + + ldr q20, [x3, #32] //load h1l | h1h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #64] //load h2l | h2h + ext v22.16b, v22.16b, v22.16b, #8 +.long 0xce157652 //eor3 v18.16b, v18.16b, v21.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 2 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 2 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 2 + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 2 + trn1 v16.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 2 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 2 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 2 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 2 + + pmull2 v8.1q, v12.2d, v25.2d //GHASH block 8k+4 - high + pmull v25.1q, v12.1d, v25.1d //GHASH block 8k+4 - low + trn2 v12.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + + ldp q27, q28, [x8, #64] //load rk4, rk5 + rev64 v15.16b, v15.16b //GHASH block 8k+7 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 3 + + ldr q21, [x3, #48] //load h2k | h1k + ldr q24, [x3, #96] //load h4k | h3k + pmull2 v10.1q, v13.2d, v23.2d //GHASH block 8k+5 - high + pmull v23.1q, v13.1d, v23.1d //GHASH block 8k+5 - low + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 3 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 3 + trn1 v13.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + + pmull2 v11.1q, v14.2d, v22.2d //GHASH block 8k+6 - high + pmull v22.1q, v14.1d, v22.1d //GHASH block 8k+6 - low + trn2 v14.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 3 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 3 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 3 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 3 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 3 + eor v12.16b, v12.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + +.long 0xce082a31 //eor3 v17.16b, v17.16b, v8.16b, v10.16b //GHASH block 8k+4, 8k+5 - high + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 4 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 4 + + eor v14.16b, v14.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 4 + pmull2 v16.1q, v12.2d, v24.2d //GHASH block 8k+4 - mid + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 4 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 4 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 4 + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 4 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 4 + pmull v24.1q, v12.1d, v24.1d //GHASH block 8k+5 - mid + + pmull2 v12.1q, v15.2d, v20.2d //GHASH block 8k+7 - high + pmull2 v13.1q, v14.2d, v21.2d //GHASH block 8k+6 - mid + pmull v21.1q, v14.1d, v21.1d //GHASH block 8k+7 - mid + + ldp q26, q27, [x8, #96] //load rk6, rk7 +.long 0xce184252 //eor3 v18.16b, v18.16b, v24.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 5 + + ldr d16, [x10] //MODULO - load modulo constant + pmull v20.1q, v15.1d, v20.1d //GHASH block 8k+7 - low +.long 0xce195e73 //eor3 v19.16b, v19.16b, v25.16b, v23.16b //GHASH block 8k+4, 8k+5 - low + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 5 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 5 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 5 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 5 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 5 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 5 + + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 5 +.long 0xce153652 //eor3 v18.16b, v18.16b, v21.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+6, 8k+7 - low + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 6 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 6 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 6 + +.long 0xce0b3231 //eor3 v17.16b, v17.16b, v11.16b, v12.16b //GHASH block 8k+6, 8k+7 - high + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 6 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 6 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 6 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 6 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 6 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 7 +.long 0xce114e52 //eor3 v18.16b, v18.16b, v17.16b, v19.16b //MODULO - karatsuba tidy up + ldp q28, q26, [x8, #128] //load rk8, rk9 + + pmull v29.1q, v17.1d, v16.1d //MODULO - top 64b align with mid + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 7 + ext v21.16b, v17.16b, v17.16b, #8 //MODULO - other top alignment + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 7 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 7 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 7 + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 7 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 7 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 7 + +.long 0xce1d5652 //eor3 v18.16b, v18.16b, v29.16b, v21.16b //MODULO - fold into mid + ldr q27, [x8, #160] //load rk10 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 8 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 8 + + pmull v17.1q, v18.1d, v16.1d //MODULO - mid 64b align with low + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 8 + ext v21.16b, v18.16b, v18.16b, #8 //MODULO - other mid alignment + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 8 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 8 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 8 + + aese v6.16b, v26.16b //AES block 8k+14 - round 9 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 8 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 8 + +.long 0xce115673 //eor3 v19.16b, v19.16b, v17.16b, v21.16b //MODULO - fold into low + add v30.4s, v30.4s, v31.4s //CTR block 8k+15 + aese v2.16b, v26.16b //AES block 8k+10 - round 9 + + aese v3.16b, v26.16b //AES block 8k+11 - round 9 + aese v5.16b, v26.16b //AES block 8k+13 - round 9 + aese v0.16b, v26.16b //AES block 8k+8 - round 9 + + aese v4.16b, v26.16b //AES block 8k+12 - round 9 + aese v1.16b, v26.16b //AES block 8k+9 - round 9 + aese v7.16b, v26.16b //AES block 8k+15 - round 9 + +L128_dec_tail: //TAIL + + mov v29.16b, v27.16b + sub x5, x4, x0 //main_end_input_ptr is number of bytes left to process + + cmp x5, #112 + + ldp q24, q25, [x3, #192] //load h8k | h7k + ext v25.16b, v25.16b, v25.16b, #8 + ldr q9, [x0], #16 //AES block 8k+8 - load ciphertext + + ldp q20, q21, [x3, #128] //load h5l | h5h + ext v20.16b, v20.16b, v20.16b, #8 + ext v16.16b, v19.16b, v19.16b, #8 //prepare final partial tag + + ldp q22, q23, [x3, #160] //load h6l | h6h + ext v22.16b, v22.16b, v22.16b, #8 + ext v23.16b, v23.16b, v23.16b, #8 + +.long 0xce00752c //eor3 v12.16b, v9.16b, v0.16b, v29.16b //AES block 8k+8 - result + b.gt L128_dec_blocks_more_than_7 + + cmp x5, #96 + mov v7.16b, v6.16b + movi v19.8b, #0 + + movi v17.8b, #0 + mov v6.16b, v5.16b + mov v5.16b, v4.16b + + mov v4.16b, v3.16b + mov v3.16b, v2.16b + mov v2.16b, v1.16b + + movi v18.8b, #0 + sub v30.4s, v30.4s, v31.4s + b.gt L128_dec_blocks_more_than_6 + + cmp x5, #80 + sub v30.4s, v30.4s, v31.4s + + mov v7.16b, v6.16b + mov v6.16b, v5.16b + mov v5.16b, v4.16b + + mov v4.16b, v3.16b + mov v3.16b, v1.16b + b.gt L128_dec_blocks_more_than_5 + + cmp x5, #64 + + mov v7.16b, v6.16b + mov v6.16b, v5.16b + mov v5.16b, v4.16b + + mov v4.16b, v1.16b + sub v30.4s, v30.4s, v31.4s + b.gt L128_dec_blocks_more_than_4 + + sub v30.4s, v30.4s, v31.4s + mov v7.16b, v6.16b + mov v6.16b, v5.16b + + mov v5.16b, v1.16b + cmp x5, #48 + b.gt L128_dec_blocks_more_than_3 + + sub v30.4s, v30.4s, v31.4s + mov v7.16b, v6.16b + cmp x5, #32 + + ldr q24, [x3, #96] //load h4k | h3k + mov v6.16b, v1.16b + b.gt L128_dec_blocks_more_than_2 + + cmp x5, #16 + + mov v7.16b, v1.16b + sub v30.4s, v30.4s, v31.4s + b.gt L128_dec_blocks_more_than_1 + + sub v30.4s, v30.4s, v31.4s + ldr q21, [x3, #48] //load h2k | h1k + b L128_dec_blocks_less_than_1 +L128_dec_blocks_more_than_7: //blocks left > 7 + rev64 v8.16b, v9.16b //GHASH final-7 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v18.d[0], v24.d[1] //GHASH final-7 block - mid + + pmull v19.1q, v8.1d, v25.1d //GHASH final-7 block - low + ins v27.d[0], v8.d[1] //GHASH final-7 block - mid + + movi v16.8b, #0 //suppress further partial tag feed in + ldr q9, [x0], #16 //AES final-6 block - load ciphertext + + eor v27.8b, v27.8b, v8.8b //GHASH final-7 block - mid + + pmull2 v17.1q, v8.2d, v25.2d //GHASH final-7 block - high + st1 { v12.16b}, [x2], #16 //AES final-7 block - store result +.long 0xce01752c //eor3 v12.16b, v9.16b, v1.16b, v29.16b //AES final-6 block - result + + pmull v18.1q, v27.1d, v18.1d //GHASH final-7 block - mid +L128_dec_blocks_more_than_6: //blocks left > 6 + + rev64 v8.16b, v9.16b //GHASH final-6 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-6 block - mid + + eor v27.8b, v27.8b, v8.8b //GHASH final-6 block - mid + + pmull v26.1q, v8.1d, v23.1d //GHASH final-6 block - low + ldr q9, [x0], #16 //AES final-5 block - load ciphertext + movi v16.8b, #0 //suppress further partial tag feed in + + pmull v27.1q, v27.1d, v24.1d //GHASH final-6 block - mid + st1 { v12.16b}, [x2], #16 //AES final-6 block - store result + pmull2 v28.1q, v8.2d, v23.2d //GHASH final-6 block - high + + eor v19.16b, v19.16b, v26.16b //GHASH final-6 block - low + eor v17.16b, v17.16b, v28.16b //GHASH final-6 block - high + + eor v18.16b, v18.16b, v27.16b //GHASH final-6 block - mid +.long 0xce02752c //eor3 v12.16b, v9.16b, v2.16b, v29.16b //AES final-5 block - result +L128_dec_blocks_more_than_5: //blocks left > 5 + + rev64 v8.16b, v9.16b //GHASH final-5 block + + ldr q9, [x0], #16 //AES final-4 block - load ciphertext + st1 { v12.16b}, [x2], #16 //AES final-5 block - store result + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-5 block - mid + +.long 0xce03752c //eor3 v12.16b, v9.16b, v3.16b, v29.16b //AES final-4 block - result + + eor v27.8b, v27.8b, v8.8b //GHASH final-5 block - mid + + ins v27.d[1], v27.d[0] //GHASH final-5 block - mid + pmull v26.1q, v8.1d, v22.1d //GHASH final-5 block - low + movi v16.8b, #0 //suppress further partial tag feed in + + pmull2 v27.1q, v27.2d, v21.2d //GHASH final-5 block - mid + pmull2 v28.1q, v8.2d, v22.2d //GHASH final-5 block - high + eor v19.16b, v19.16b, v26.16b //GHASH final-5 block - low + + eor v18.16b, v18.16b, v27.16b //GHASH final-5 block - mid + eor v17.16b, v17.16b, v28.16b //GHASH final-5 block - high +L128_dec_blocks_more_than_4: //blocks left > 4 + + rev64 v8.16b, v9.16b //GHASH final-4 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + ldr q9, [x0], #16 //AES final-3 block - load ciphertext + + ins v27.d[0], v8.d[1] //GHASH final-4 block - mid + movi v16.8b, #0 //suppress further partial tag feed in + pmull2 v28.1q, v8.2d, v20.2d //GHASH final-4 block - high + + pmull v26.1q, v8.1d, v20.1d //GHASH final-4 block - low + + eor v17.16b, v17.16b, v28.16b //GHASH final-4 block - high + + st1 { v12.16b}, [x2], #16 //AES final-4 block - store result + eor v27.8b, v27.8b, v8.8b //GHASH final-4 block - mid + +.long 0xce04752c //eor3 v12.16b, v9.16b, v4.16b, v29.16b //AES final-3 block - result + eor v19.16b, v19.16b, v26.16b //GHASH final-4 block - low + + pmull v27.1q, v27.1d, v21.1d //GHASH final-4 block - mid + + eor v18.16b, v18.16b, v27.16b //GHASH final-4 block - mid +L128_dec_blocks_more_than_3: //blocks left > 3 + + st1 { v12.16b}, [x2], #16 //AES final-3 block - store result + rev64 v8.16b, v9.16b //GHASH final-3 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-3 block - mid + + ldr q25, [x3, #112] //load h4l | h4h + ext v25.16b, v25.16b, v25.16b, #8 + ldr q24, [x3, #96] //load h4k | h3k + + eor v27.8b, v27.8b, v8.8b //GHASH final-3 block - mid + + ldr q9, [x0], #16 //AES final-2 block - load ciphertext + + ins v27.d[1], v27.d[0] //GHASH final-3 block - mid + pmull v26.1q, v8.1d, v25.1d //GHASH final-3 block - low + pmull2 v28.1q, v8.2d, v25.2d //GHASH final-3 block - high + + movi v16.8b, #0 //suppress further partial tag feed in +.long 0xce05752c //eor3 v12.16b, v9.16b, v5.16b, v29.16b //AES final-2 block - result + eor v19.16b, v19.16b, v26.16b //GHASH final-3 block - low + + pmull2 v27.1q, v27.2d, v24.2d //GHASH final-3 block - mid + + eor v17.16b, v17.16b, v28.16b //GHASH final-3 block - high + eor v18.16b, v18.16b, v27.16b //GHASH final-3 block - mid +L128_dec_blocks_more_than_2: //blocks left > 2 + + rev64 v8.16b, v9.16b //GHASH final-2 block + + st1 { v12.16b}, [x2], #16 //AES final-2 block - store result + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + ldr q23, [x3, #80] //load h3l | h3h + ext v23.16b, v23.16b, v23.16b, #8 + movi v16.8b, #0 //suppress further partial tag feed in + + ins v27.d[0], v8.d[1] //GHASH final-2 block - mid + + eor v27.8b, v27.8b, v8.8b //GHASH final-2 block - mid + + pmull v26.1q, v8.1d, v23.1d //GHASH final-2 block - low + + pmull2 v28.1q, v8.2d, v23.2d //GHASH final-2 block - high + pmull v27.1q, v27.1d, v24.1d //GHASH final-2 block - mid + ldr q9, [x0], #16 //AES final-1 block - load ciphertext + + eor v18.16b, v18.16b, v27.16b //GHASH final-2 block - mid + + eor v19.16b, v19.16b, v26.16b //GHASH final-2 block - low + +.long 0xce06752c //eor3 v12.16b, v9.16b, v6.16b, v29.16b //AES final-1 block - result + eor v17.16b, v17.16b, v28.16b //GHASH final-2 block - high +L128_dec_blocks_more_than_1: //blocks left > 1 + + st1 { v12.16b}, [x2], #16 //AES final-1 block - store result + rev64 v8.16b, v9.16b //GHASH final-1 block + + ldr q22, [x3, #64] //load h2l | h2h + ext v22.16b, v22.16b, v22.16b, #8 + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + movi v16.8b, #0 //suppress further partial tag feed in + + ins v27.d[0], v8.d[1] //GHASH final-1 block - mid + + ldr q9, [x0], #16 //AES final block - load ciphertext + pmull2 v28.1q, v8.2d, v22.2d //GHASH final-1 block - high + + eor v27.8b, v27.8b, v8.8b //GHASH final-1 block - mid + eor v17.16b, v17.16b, v28.16b //GHASH final-1 block - high + ldr q21, [x3, #48] //load h2k | h1k + + ins v27.d[1], v27.d[0] //GHASH final-1 block - mid +.long 0xce07752c //eor3 v12.16b, v9.16b, v7.16b, v29.16b //AES final block - result + + pmull v26.1q, v8.1d, v22.1d //GHASH final-1 block - low + + pmull2 v27.1q, v27.2d, v21.2d //GHASH final-1 block - mid + + eor v19.16b, v19.16b, v26.16b //GHASH final-1 block - low + + eor v18.16b, v18.16b, v27.16b //GHASH final-1 block - mid +L128_dec_blocks_less_than_1: //blocks left <= 1 + + and x1, x1, #127 //bit_length %= 128 + + sub x1, x1, #128 //bit_length -= 128 + + neg x1, x1 //bit_length = 128 - #bits in input (in range [1,128]) + + mvn x6, xzr //temp0_x = 0xffffffffffffffff + and x1, x1, #127 //bit_length %= 128 + + lsr x6, x6, x1 //temp0_x is mask for top 64b of last block + cmp x1, #64 + mvn x7, xzr //temp1_x = 0xffffffffffffffff + + csel x13, x7, x6, lt + csel x14, x6, xzr, lt + + mov v0.d[1], x14 + mov v0.d[0], x13 //ctr0b is mask for last block + + ldr q20, [x3, #32] //load h1l | h1h + ext v20.16b, v20.16b, v20.16b, #8 + ld1 { v26.16b}, [x2] //load existing bytes where the possibly partial last block is to be stored + + and v9.16b, v9.16b, v0.16b //possibly partial last block has zeroes in highest bits + + rev64 v8.16b, v9.16b //GHASH final block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + pmull2 v28.1q, v8.2d, v20.2d //GHASH final block - high + ins v16.d[0], v8.d[1] //GHASH final block - mid + + eor v17.16b, v17.16b, v28.16b //GHASH final block - high + eor v16.8b, v16.8b, v8.8b //GHASH final block - mid + + bif v12.16b, v26.16b, v0.16b //insert existing bytes in top end of result before storing + + pmull v16.1q, v16.1d, v21.1d //GHASH final block - mid + st1 { v12.16b}, [x2] //store all 16B + + pmull v26.1q, v8.1d, v20.1d //GHASH final block - low + + eor v18.16b, v18.16b, v16.16b //GHASH final block - mid + ldr d16, [x10] //MODULO - load modulo constant + + eor v19.16b, v19.16b, v26.16b //GHASH final block - low + + eor v14.16b, v17.16b, v19.16b //MODULO - karatsuba tidy up + + pmull v21.1q, v17.1d, v16.1d //MODULO - top 64b align with mid + ext v17.16b, v17.16b, v17.16b, #8 //MODULO - other top alignment + + eor v18.16b, v18.16b, v14.16b //MODULO - karatsuba tidy up + +.long 0xce115652 //eor3 v18.16b, v18.16b, v17.16b, v21.16b //MODULO - fold into mid + + pmull v17.1q, v18.1d, v16.1d //MODULO - mid 64b align with low + ext v18.16b, v18.16b, v18.16b, #8 //MODULO - other mid alignment + +.long 0xce124673 //eor3 v19.16b, v19.16b, v18.16b, v17.16b //MODULO - fold into low + ext v19.16b, v19.16b, v19.16b, #8 + rev64 v19.16b, v19.16b + st1 { v19.16b }, [x3] + rev32 v30.16b, v30.16b + + str q30, [x16] //store the updated counter + + mov x0, x9 + + ldp d10, d11, [sp, #16] + ldp d12, d13, [sp, #32] + ldp d14, d15, [sp, #48] + ldp d8, d9, [sp], #80 + ret +L128_dec_ret: + mov w0, #0x0 + ret + +.globl unroll8_eor3_aes_gcm_enc_192_kernel +.def unroll8_eor3_aes_gcm_enc_192_kernel + .type 32 +.endef +.align 4 +unroll8_eor3_aes_gcm_enc_192_kernel: + AARCH64_VALID_CALL_TARGET + cbz x1, L192_enc_ret + stp d8, d9, [sp, #-80]! + lsr x9, x1, #3 + mov x16, x4 + mov x8, x5 + stp d10, d11, [sp, #16] + stp d12, d13, [sp, #32] + stp d14, d15, [sp, #48] + mov x5, #0xc200000000000000 + stp x5, xzr, [sp, #64] + add x10, sp, #64 + + mov x5, x9 + ld1 { v0.16b}, [x16] //CTR block 0 + + mov x15, #0x100000000 //set up counter increment + movi v31.16b, #0x0 + mov v31.d[1], x15 + + rev32 v30.16b, v0.16b //set up reversed counter + + add v30.4s, v30.4s, v31.4s //CTR block 0 + + rev32 v1.16b, v30.16b //CTR block 1 + add v30.4s, v30.4s, v31.4s //CTR block 1 + + rev32 v2.16b, v30.16b //CTR block 2 + add v30.4s, v30.4s, v31.4s //CTR block 2 + + rev32 v3.16b, v30.16b //CTR block 3 + add v30.4s, v30.4s, v31.4s //CTR block 3 + + rev32 v4.16b, v30.16b //CTR block 4 + add v30.4s, v30.4s, v31.4s //CTR block 4 + sub x5, x5, #1 //byte_len - 1 + + and x5, x5, #0xffffffffffffff80 //number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + + rev32 v5.16b, v30.16b //CTR block 5 + add v30.4s, v30.4s, v31.4s //CTR block 5 + ldp q26, q27, [x8, #0] //load rk0, rk1 + + add x5, x5, x0 + + rev32 v6.16b, v30.16b //CTR block 6 + add v30.4s, v30.4s, v31.4s //CTR block 6 + + rev32 v7.16b, v30.16b //CTR block 7 + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 0 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 0 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 0 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 0 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 0 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 0 + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 0 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 0 + ldp q28, q26, [x8, #32] //load rk2, rk3 + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 1 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 1 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 1 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 1 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 1 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 5 - round 2 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 1 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 1 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 1 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 7 - round 2 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 2 + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 2 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 2 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 2 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 4 - round 2 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 6 - round 2 + + ldp q27, q28, [x8, #64] //load rk4, rk5 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 3 + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 3 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 3 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 3 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 3 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 3 + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 3 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 4 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 4 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 3 + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 4 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 4 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 4 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 4 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 4 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 4 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 5 + ldp q26, q27, [x8, #96] //load rk6, rk7 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 5 + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 4 - round 5 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 7 - round 5 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 5 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 5 - round 5 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 6 - round 5 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 5 + + add v30.4s, v30.4s, v31.4s //CTR block 7 + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 6 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 6 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 6 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 6 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 6 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 6 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 6 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 6 + ldp q28, q26, [x8, #128] //load rk8, rk9 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 7 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 7 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 7 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 7 + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 7 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 7 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 7 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 7 + + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 7 - round 8 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 8 + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 4 - round 8 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 8 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 5 - round 8 + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 8 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 8 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 6 - round 8 + + add x4, x0, x1, lsr #3 //end_input_ptr + cmp x0, x5 //check if we have <= 8 blocks + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 9 + + ld1 { v19.16b}, [x3] + ext v19.16b, v19.16b, v19.16b, #8 + rev64 v19.16b, v19.16b + ldp q27, q28, [x8, #160] //load rk10, rk11 + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 9 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 9 + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 9 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 9 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 9 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 9 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 14 - round 10 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 11 - round 10 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 9 - round 10 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 13 - round 10 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 12 - round 10 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8 - round 10 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 10 - round 10 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 15 - round 10 + + aese v6.16b, v28.16b //AES block 14 - round 11 + aese v3.16b, v28.16b //AES block 11 - round 11 + + aese v4.16b, v28.16b //AES block 12 - round 11 + aese v7.16b, v28.16b //AES block 15 - round 11 + ldr q26, [x8, #192] //load rk12 + + aese v1.16b, v28.16b //AES block 9 - round 11 + aese v5.16b, v28.16b //AES block 13 - round 11 + + aese v2.16b, v28.16b //AES block 10 - round 11 + aese v0.16b, v28.16b //AES block 8 - round 11 + b.ge L192_enc_tail //handle tail + + ldp q8, q9, [x0], #32 //AES block 0, 1 - load plaintext + + ldp q10, q11, [x0], #32 //AES block 2, 3 - load plaintext + + ldp q12, q13, [x0], #32 //AES block 4, 5 - load plaintext + + ldp q14, q15, [x0], #32 //AES block 6, 7 - load plaintext + +.long 0xce006908 //eor3 v8.16b, v8.16b, v0.16b, v26.16b //AES block 0 - result + rev32 v0.16b, v30.16b //CTR block 8 + add v30.4s, v30.4s, v31.4s //CTR block 8 + +.long 0xce03696b //eor3 v11.16b, v11.16b, v3.16b, v26.16b //AES block 3 - result +.long 0xce016929 //eor3 v9.16b, v9.16b, v1.16b, v26.16b //AES block 1 - result + + rev32 v1.16b, v30.16b //CTR block 9 + add v30.4s, v30.4s, v31.4s //CTR block 9 +.long 0xce04698c //eor3 v12.16b, v12.16b, v4.16b, v26.16b //AES block 4 - result + +.long 0xce0569ad //eor3 v13.16b, v13.16b, v5.16b, v26.16b //AES block 5 - result +.long 0xce0769ef //eor3 v15.16b, v15.16b, v7.16b, v26.16b //AES block 7 - result + stp q8, q9, [x2], #32 //AES block 0, 1 - store result + +.long 0xce02694a //eor3 v10.16b, v10.16b, v2.16b, v26.16b //AES block 2 - result + rev32 v2.16b, v30.16b //CTR block 10 + add v30.4s, v30.4s, v31.4s //CTR block 10 + + stp q10, q11, [x2], #32 //AES block 2, 3 - store result + cmp x0, x5 //check if we have <= 8 blocks + + rev32 v3.16b, v30.16b //CTR block 11 + add v30.4s, v30.4s, v31.4s //CTR block 11 +.long 0xce0669ce //eor3 v14.16b, v14.16b, v6.16b, v26.16b //AES block 6 - result + + stp q12, q13, [x2], #32 //AES block 4, 5 - store result + + rev32 v4.16b, v30.16b //CTR block 12 + stp q14, q15, [x2], #32 //AES block 6, 7 - store result + add v30.4s, v30.4s, v31.4s //CTR block 12 + + b.ge L192_enc_prepretail //do prepretail + +L192_enc_main_loop: //main loop start + rev64 v12.16b, v12.16b //GHASH block 8k+4 (t0, t1, and t2 free) + ldp q26, q27, [x8, #0] //load rk0, rk1 + rev64 v10.16b, v10.16b //GHASH block 8k+2 + + rev32 v5.16b, v30.16b //CTR block 8k+13 + add v30.4s, v30.4s, v31.4s //CTR block 8k+13 + ldr q23, [x3, #176] //load h7l | h7h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #208] //load h8l | h8h + ext v25.16b, v25.16b, v25.16b, #8 + + ext v19.16b, v19.16b, v19.16b, #8 //PRE 0 + rev64 v8.16b, v8.16b //GHASH block 8k + ldr q20, [x3, #128] //load h5l | h5h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #160] //load h6l | h6h + ext v22.16b, v22.16b, v22.16b, #8 + + rev64 v9.16b, v9.16b //GHASH block 8k+1 + rev32 v6.16b, v30.16b //CTR block 8k+14 + add v30.4s, v30.4s, v31.4s //CTR block 8k+14 + + eor v8.16b, v8.16b, v19.16b //PRE 1 + rev64 v11.16b, v11.16b //GHASH block 8k+3 + rev64 v13.16b, v13.16b //GHASH block 8k+5 (t0, t1, t2 and t3 free) + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 0 + rev32 v7.16b, v30.16b //CTR block 8k+15 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 0 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 0 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 0 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 0 + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 0 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 0 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 0 + + ldp q28, q26, [x8, #32] //load rk2, rk3 + pmull2 v17.1q, v8.2d, v25.2d //GHASH block 8k - high + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 1 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 1 + pmull2 v16.1q, v9.2d, v23.2d //GHASH block 8k+1 - high + pmull v23.1q, v9.1d, v23.1d //GHASH block 8k+1 - low + + trn1 v18.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 1 + ldr q21, [x3, #144] //load h6k | h5k + ldr q24, [x3, #192] //load h8k | h7k + + pmull2 v29.1q, v10.2d, v22.2d //GHASH block 8k+2 - high + pmull v19.1q, v8.1d, v25.1d //GHASH block 8k - low + trn2 v8.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 1 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 1 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 1 + + eor v17.16b, v17.16b, v16.16b //GHASH block 8k+1 - high + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 1 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 1 + + pmull2 v9.1q, v11.2d, v20.2d //GHASH block 8k+3 - high + eor v8.16b, v8.16b, v18.16b //GHASH block 8k, 8k+1 - mid + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 2 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 2 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 2 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 2 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 2 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 3 +.long 0xce1d2631 //eor3 v17.16b, v17.16b, v29.16b, v9.16b //GHASH block 8k+2, 8k+3 - high + + pmull v22.1q, v10.1d, v22.1d //GHASH block 8k+2 - low + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 2 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 3 + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 2 + trn1 v29.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 2 + + trn2 v10.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 3 + ldp q27, q28, [x8, #64] //load rk4, rk5 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 3 + eor v19.16b, v19.16b, v23.16b //GHASH block 8k+1 - low + ldr q23, [x3, #80] //load h3l | h3h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #112] //load h4l | h4h + ext v25.16b, v25.16b, v25.16b, #8 + + pmull2 v18.1q, v8.2d, v24.2d //GHASH block 8k - mid + pmull v24.1q, v8.1d, v24.1d //GHASH block 8k+1 - mid + pmull v20.1q, v11.1d, v20.1d //GHASH block 8k+3 - low + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 3 + eor v10.16b, v10.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + trn1 v16.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + + eor v18.16b, v18.16b, v24.16b //GHASH block 8k+1 - mid + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 3 +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+2, 8k+3 - low + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 4 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 4 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 3 + + pmull2 v29.1q, v10.2d, v21.2d //GHASH block 8k+2 - mid + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 4 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 3 + + pmull v21.1q, v10.1d, v21.1d //GHASH block 8k+3 - mid + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 4 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 4 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 4 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 4 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 4 + +.long 0xce157652 //eor3 v18.16b, v18.16b, v21.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 5 + ldr q20, [x3, #32] //load h1l | h1h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #64] //load h2l | h2h + ext v22.16b, v22.16b, v22.16b, #8 + + ldp q26, q27, [x8, #96] //load rk6, rk7 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 5 + rev64 v15.16b, v15.16b //GHASH block 8k+7 (t0, t1, t2 and t3 free) + + rev64 v14.16b, v14.16b //GHASH block 8k+6 (t0, t1, and t2 free) + pmull2 v8.1q, v12.2d, v25.2d //GHASH block 8k+4 - high + pmull v25.1q, v12.1d, v25.1d //GHASH block 8k+4 - low + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 5 + trn2 v12.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 5 + ldr q21, [x3, #48] //load h2k | h1k + ldr q24, [x3, #96] //load h4k | h3k + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 5 + pmull2 v10.1q, v13.2d, v23.2d //GHASH block 8k+5 - high + eor v12.16b, v12.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 5 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 5 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 5 + + pmull v23.1q, v13.1d, v23.1d //GHASH block 8k+5 - low + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 6 + trn1 v13.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 6 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 6 + pmull2 v11.1q, v14.2d, v22.2d //GHASH block 8k+6 - high + + pmull v22.1q, v14.1d, v22.1d //GHASH block 8k+6 - low + trn2 v14.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 6 + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 6 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 6 + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 6 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 7 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 6 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 7 + eor v14.16b, v14.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + + pmull2 v16.1q, v12.2d, v24.2d //GHASH block 8k+4 - mid + ldp q28, q26, [x8, #128] //load rk8, rk9 + pmull v24.1q, v12.1d, v24.1d //GHASH block 8k+5 - mid + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 7 + pmull2 v12.1q, v15.2d, v20.2d //GHASH block 8k+7 - high + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 7 + +.long 0xce184252 //eor3 v18.16b, v18.16b, v24.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 7 + add v30.4s, v30.4s, v31.4s //CTR block 8k+15 + + ldr d16, [x10] //MODULO - load modulo constant +.long 0xce082a31 //eor3 v17.16b, v17.16b, v8.16b, v10.16b //GHASH block 8k+4, 8k+5 - high + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 7 + + pmull2 v13.1q, v14.2d, v21.2d //GHASH block 8k+6 - mid + pmull v20.1q, v15.1d, v20.1d //GHASH block 8k+7 - low + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 7 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 8 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 8 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 8 + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 8 +.long 0xce195e73 //eor3 v19.16b, v19.16b, v25.16b, v23.16b //GHASH block 8k+4, 8k+5 - low + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 7 + + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 8 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 8 + pmull v21.1q, v14.1d, v21.1d //GHASH block 8k+7 - mid + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 8 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 8 + ldp q27, q28, [x8, #160] //load rk10, rk11 + +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+6, 8k+7 - low + rev32 v20.16b, v30.16b //CTR block 8k+16 + add v30.4s, v30.4s, v31.4s //CTR block 8k+16 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 9 +.long 0xce153652 //eor3 v18.16b, v18.16b, v21.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid +.long 0xce0b3231 //eor3 v17.16b, v17.16b, v11.16b, v12.16b //GHASH block 8k+6, 8k+7 - high + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 9 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 9 + ldp q8, q9, [x0], #32 //AES block 8k+8, 8k+9 - load plaintext + + pmull v21.1q, v17.1d, v16.1d //MODULO - top 64b align with mid + rev32 v22.16b, v30.16b //CTR block 8k+17 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 9 + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 9 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 9 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 9 + +.long 0xce114e52 //eor3 v18.16b, v18.16b, v17.16b, v19.16b //MODULO - karatsuba tidy up + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 9 + add v30.4s, v30.4s, v31.4s //CTR block 8k+17 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 10 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 10 + ldr q26, [x8, #192] //load rk12 + ext v29.16b, v17.16b, v17.16b, #8 //MODULO - other top alignment + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 10 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 10 + ldp q10, q11, [x0], #32 //AES block 8k+10, 8k+11 - load plaintext + + aese v4.16b, v28.16b //AES block 8k+12 - round 11 +.long 0xce1d5652 //eor3 v18.16b, v18.16b, v29.16b, v21.16b //MODULO - fold into mid + ldp q12, q13, [x0], #32 //AES block 8k+12, 8k+13 - load plaintext + + ldp q14, q15, [x0], #32 //AES block 8k+14, 8k+15 - load plaintext + aese v2.16b, v28.16b //AES block 8k+10 - round 11 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 10 + + rev32 v23.16b, v30.16b //CTR block 8k+18 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 10 + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 10 + pmull v17.1q, v18.1d, v16.1d //MODULO - mid 64b align with low + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 10 + aese v5.16b, v28.16b //AES block 8k+13 - round 11 + add v30.4s, v30.4s, v31.4s //CTR block 8k+18 + + aese v7.16b, v28.16b //AES block 8k+15 - round 11 + aese v0.16b, v28.16b //AES block 8k+8 - round 11 +.long 0xce04698c //eor3 v12.16b, v12.16b, v4.16b, v26.16b //AES block 4 - result + + aese v6.16b, v28.16b //AES block 8k+14 - round 11 + aese v3.16b, v28.16b //AES block 8k+11 - round 11 + aese v1.16b, v28.16b //AES block 8k+9 - round 11 + + rev32 v25.16b, v30.16b //CTR block 8k+19 + add v30.4s, v30.4s, v31.4s //CTR block 8k+19 +.long 0xce0769ef //eor3 v15.16b, v15.16b, v7.16b, v26.16b //AES block 7 - result + +.long 0xce02694a //eor3 v10.16b, v10.16b, v2.16b, v26.16b //AES block 8k+10 - result +.long 0xce006908 //eor3 v8.16b, v8.16b, v0.16b, v26.16b //AES block 8k+8 - result + mov v2.16b, v23.16b //CTR block 8k+18 + +.long 0xce016929 //eor3 v9.16b, v9.16b, v1.16b, v26.16b //AES block 8k+9 - result + mov v1.16b, v22.16b //CTR block 8k+17 + stp q8, q9, [x2], #32 //AES block 8k+8, 8k+9 - store result + ext v21.16b, v18.16b, v18.16b, #8 //MODULO - other mid alignment + +.long 0xce0669ce //eor3 v14.16b, v14.16b, v6.16b, v26.16b //AES block 6 - result + mov v0.16b, v20.16b //CTR block 8k+16 + rev32 v4.16b, v30.16b //CTR block 8k+20 + + add v30.4s, v30.4s, v31.4s //CTR block 8k+20 +.long 0xce0569ad //eor3 v13.16b, v13.16b, v5.16b, v26.16b //AES block 5 - result +.long 0xce115673 //eor3 v19.16b, v19.16b, v17.16b, v21.16b //MODULO - fold into low + +.long 0xce03696b //eor3 v11.16b, v11.16b, v3.16b, v26.16b //AES block 8k+11 - result + mov v3.16b, v25.16b //CTR block 8k+19 + + stp q10, q11, [x2], #32 //AES block 8k+10, 8k+11 - store result + + stp q12, q13, [x2], #32 //AES block 8k+12, 8k+13 - store result + + cmp x0, x5 //LOOP CONTROL + stp q14, q15, [x2], #32 //AES block 8k+14, 8k+15 - store result + b.lt L192_enc_main_loop + +L192_enc_prepretail: //PREPRETAIL + rev32 v5.16b, v30.16b //CTR block 8k+13 + ldp q26, q27, [x8, #0] //load rk0, rk1 + add v30.4s, v30.4s, v31.4s //CTR block 8k+13 + + ldr q23, [x3, #176] //load h7l | h7h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #208] //load h8l | h8h + ext v25.16b, v25.16b, v25.16b, #8 + rev64 v8.16b, v8.16b //GHASH block 8k + ext v19.16b, v19.16b, v19.16b, #8 //PRE 0 + + rev32 v6.16b, v30.16b //CTR block 8k+14 + add v30.4s, v30.4s, v31.4s //CTR block 8k+14 + ldr q21, [x3, #144] //load h6k | h5k + ldr q24, [x3, #192] //load h8k | h7k + + rev64 v11.16b, v11.16b //GHASH block 8k+3 + rev64 v10.16b, v10.16b //GHASH block 8k+2 + ldr q20, [x3, #128] //load h5l | h5h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #160] //load h6l | h6h + ext v22.16b, v22.16b, v22.16b, #8 + + eor v8.16b, v8.16b, v19.16b //PRE 1 + rev32 v7.16b, v30.16b //CTR block 8k+15 + rev64 v9.16b, v9.16b //GHASH block 8k+1 + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 0 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 0 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 0 + + pmull2 v16.1q, v9.2d, v23.2d //GHASH block 8k+1 - high + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 0 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 0 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 0 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 0 + pmull2 v17.1q, v8.2d, v25.2d //GHASH block 8k - high + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 1 + pmull v19.1q, v8.1d, v25.1d //GHASH block 8k - low + trn1 v18.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + + trn2 v8.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 0 + ldp q28, q26, [x8, #32] //load rk2, rk3 + + pmull v23.1q, v9.1d, v23.1d //GHASH block 8k+1 - low + eor v17.16b, v17.16b, v16.16b //GHASH block 8k+1 - high + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 1 + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 1 + eor v8.16b, v8.16b, v18.16b //GHASH block 8k, 8k+1 - mid + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 1 + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 1 + pmull2 v9.1q, v11.2d, v20.2d //GHASH block 8k+3 - high + pmull2 v29.1q, v10.2d, v22.2d //GHASH block 8k+2 - high + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 1 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 1 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 1 + + pmull v22.1q, v10.1d, v22.1d //GHASH block 8k+2 - low + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 2 + eor v19.16b, v19.16b, v23.16b //GHASH block 8k+1 - low + + pmull v20.1q, v11.1d, v20.1d //GHASH block 8k+3 - low + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 2 +.long 0xce1d2631 //eor3 v17.16b, v17.16b, v29.16b, v9.16b //GHASH block 8k+2, 8k+3 - high + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 3 + trn1 v29.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 2 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 2 + pmull2 v18.1q, v8.2d, v24.2d //GHASH block 8k - mid + trn2 v10.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 2 + rev64 v13.16b, v13.16b //GHASH block 8k+5 (t0, t1, t2 and t3 free) + rev64 v14.16b, v14.16b //GHASH block 8k+6 (t0, t1, and t2 free) + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 2 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 2 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 2 + + eor v10.16b, v10.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + pmull v24.1q, v8.1d, v24.1d //GHASH block 8k+1 - mid + ldp q27, q28, [x8, #64] //load rk4, rk5 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 3 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 3 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 3 + + eor v18.16b, v18.16b, v24.16b //GHASH block 8k+1 - mid +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+2, 8k+3 - low + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 3 + + ldr q23, [x3, #80] //load h3l | h3h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #112] //load h4l | h4h + ext v25.16b, v25.16b, v25.16b, #8 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 3 + pmull2 v29.1q, v10.2d, v21.2d //GHASH block 8k+2 - mid + + ldr q20, [x3, #32] //load h1l | h1h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #64] //load h2l | h2h + ext v22.16b, v22.16b, v22.16b, #8 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 3 + rev64 v12.16b, v12.16b //GHASH block 8k+4 (t0, t1, and t2 free) + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 3 + pmull v21.1q, v10.1d, v21.1d //GHASH block 8k+3 - mid + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 4 + + trn1 v16.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 4 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 4 + +.long 0xce157652 //eor3 v18.16b, v18.16b, v21.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 4 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 4 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 4 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 4 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 4 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 5 + rev64 v15.16b, v15.16b //GHASH block 8k+7 (t0, t1, t2 and t3 free) + ldr q21, [x3, #48] //load h2k | h1k + ldr q24, [x3, #96] //load h4k | h3k + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 5 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 5 + ldp q26, q27, [x8, #96] //load rk6, rk7 + + pmull2 v11.1q, v14.2d, v22.2d //GHASH block 8k+6 - high + pmull2 v8.1q, v12.2d, v25.2d //GHASH block 8k+4 - high + pmull v25.1q, v12.1d, v25.1d //GHASH block 8k+4 - low + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 5 + trn2 v12.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + + pmull2 v10.1q, v13.2d, v23.2d //GHASH block 8k+5 - high + pmull v23.1q, v13.1d, v23.1d //GHASH block 8k+5 - low + pmull v22.1q, v14.1d, v22.1d //GHASH block 8k+6 - low + + trn1 v13.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + eor v12.16b, v12.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + trn2 v14.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 5 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 6 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 5 + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 5 + eor v14.16b, v14.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 5 + + pmull2 v16.1q, v12.2d, v24.2d //GHASH block 8k+4 - mid + pmull v24.1q, v12.1d, v24.1d //GHASH block 8k+5 - mid + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 6 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 6 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 7 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 6 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 6 +.long 0xce184252 //eor3 v18.16b, v18.16b, v24.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 6 +.long 0xce082a31 //eor3 v17.16b, v17.16b, v8.16b, v10.16b //GHASH block 8k+4, 8k+5 - high + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 7 + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 6 + ldr d16, [x10] //MODULO - load modulo constant + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 6 + + pmull2 v13.1q, v14.2d, v21.2d //GHASH block 8k+6 - mid + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 7 +.long 0xce195e73 //eor3 v19.16b, v19.16b, v25.16b, v23.16b //GHASH block 8k+4, 8k+5 - low + + pmull2 v12.1q, v15.2d, v20.2d //GHASH block 8k+7 - high + pmull v21.1q, v14.1d, v21.1d //GHASH block 8k+7 - mid + pmull v20.1q, v15.1d, v20.1d //GHASH block 8k+7 - low + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 7 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 7 + ldp q28, q26, [x8, #128] //load rk8, rk9 + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 7 +.long 0xce153652 //eor3 v18.16b, v18.16b, v21.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+6, 8k+7 - low +.long 0xce0b3231 //eor3 v17.16b, v17.16b, v11.16b, v12.16b //GHASH block 8k+6, 8k+7 - high + +.long 0xce114e52 //eor3 v18.16b, v18.16b, v17.16b, v19.16b //MODULO - karatsuba tidy up + ext v29.16b, v17.16b, v17.16b, #8 //MODULO - other top alignment + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 7 + pmull v21.1q, v17.1d, v16.1d //MODULO - top 64b align with mid + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 8 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 8 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 7 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 8 +.long 0xce1d5652 //eor3 v18.16b, v18.16b, v29.16b, v21.16b //MODULO - fold into mid + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 8 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 9 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 8 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 8 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 8 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 8 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 9 + ldp q27, q28, [x8, #160] //load rk10, rk11 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 9 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 9 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 9 + + ext v21.16b, v18.16b, v18.16b, #8 //MODULO - other mid alignment + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 9 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 9 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 9 + + pmull v17.1q, v18.1d, v16.1d //MODULO - mid 64b align with low + ldr q26, [x8, #192] //load rk12 + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 10 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 10 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 10 + +.long 0xce115673 //eor3 v19.16b, v19.16b, v17.16b, v21.16b //MODULO - fold into low + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 10 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 10 + + aese v1.16b, v28.16b //AES block 8k+9 - round 11 + aese v7.16b, v28.16b //AES block 8k+15 - round 11 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 10 + aese v3.16b, v28.16b //AES block 8k+11 - round 11 + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 10 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 10 + + add v30.4s, v30.4s, v31.4s //CTR block 8k+15 + aese v2.16b, v28.16b //AES block 8k+10 - round 11 + aese v0.16b, v28.16b //AES block 8k+8 - round 11 + + aese v6.16b, v28.16b //AES block 8k+14 - round 11 + aese v4.16b, v28.16b //AES block 8k+12 - round 11 + aese v5.16b, v28.16b //AES block 8k+13 - round 11 + +L192_enc_tail: //TAIL + + ldp q20, q21, [x3, #128] //load h5l | h5h + ext v20.16b, v20.16b, v20.16b, #8 + sub x5, x4, x0 //main_end_input_ptr is number of bytes left to process + + ldr q8, [x0], #16 //AES block 8k+8 - l3ad plaintext + + ldp q24, q25, [x3, #192] //load h8k | h7k + ext v25.16b, v25.16b, v25.16b, #8 + + mov v29.16b, v26.16b + + ldp q22, q23, [x3, #160] //load h6l | h6h + ext v22.16b, v22.16b, v22.16b, #8 + ext v23.16b, v23.16b, v23.16b, #8 + cmp x5, #112 + +.long 0xce007509 //eor3 v9.16b, v8.16b, v0.16b, v29.16b //AES block 8k+8 - result + ext v16.16b, v19.16b, v19.16b, #8 //prepare final partial tag + b.gt L192_enc_blocks_more_than_7 + + cmp x5, #96 + mov v7.16b, v6.16b + movi v17.8b, #0 + + mov v6.16b, v5.16b + movi v19.8b, #0 + sub v30.4s, v30.4s, v31.4s + + mov v5.16b, v4.16b + mov v4.16b, v3.16b + mov v3.16b, v2.16b + + mov v2.16b, v1.16b + movi v18.8b, #0 + b.gt L192_enc_blocks_more_than_6 + + mov v7.16b, v6.16b + cmp x5, #80 + + mov v6.16b, v5.16b + mov v5.16b, v4.16b + mov v4.16b, v3.16b + + mov v3.16b, v1.16b + sub v30.4s, v30.4s, v31.4s + b.gt L192_enc_blocks_more_than_5 + + cmp x5, #64 + sub v30.4s, v30.4s, v31.4s + + mov v7.16b, v6.16b + mov v6.16b, v5.16b + mov v5.16b, v4.16b + + mov v4.16b, v1.16b + b.gt L192_enc_blocks_more_than_4 + + mov v7.16b, v6.16b + mov v6.16b, v5.16b + mov v5.16b, v1.16b + + sub v30.4s, v30.4s, v31.4s + cmp x5, #48 + b.gt L192_enc_blocks_more_than_3 + + mov v7.16b, v6.16b + mov v6.16b, v1.16b + sub v30.4s, v30.4s, v31.4s + + ldr q24, [x3, #96] //load h4k | h3k + cmp x5, #32 + b.gt L192_enc_blocks_more_than_2 + + sub v30.4s, v30.4s, v31.4s + + cmp x5, #16 + mov v7.16b, v1.16b + b.gt L192_enc_blocks_more_than_1 + + sub v30.4s, v30.4s, v31.4s + ldr q21, [x3, #48] //load h2k | h1k + b L192_enc_blocks_less_than_1 +L192_enc_blocks_more_than_7: //blocks left > 7 + st1 { v9.16b}, [x2], #16 //AES final-7 block - store result + + rev64 v8.16b, v9.16b //GHASH final-7 block + ins v18.d[0], v24.d[1] //GHASH final-7 block - mid + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-7 block - mid + + ldr q9, [x0], #16 //AES final-6 block - load plaintext + + eor v27.8b, v27.8b, v8.8b //GHASH final-7 block - mid + movi v16.8b, #0 //suppress further partial tag feed in + pmull v19.1q, v8.1d, v25.1d //GHASH final-7 block - low + + pmull2 v17.1q, v8.2d, v25.2d //GHASH final-7 block - high + + pmull v18.1q, v27.1d, v18.1d //GHASH final-7 block - mid +.long 0xce017529 //eor3 v9.16b, v9.16b, v1.16b, v29.16b //AES final-6 block - result +L192_enc_blocks_more_than_6: //blocks left > 6 + + st1 { v9.16b}, [x2], #16 //AES final-6 block - store result + + rev64 v8.16b, v9.16b //GHASH final-6 block + + ldr q9, [x0], #16 //AES final-5 block - load plaintext + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-6 block - mid + + pmull v26.1q, v8.1d, v23.1d //GHASH final-6 block - low +.long 0xce027529 //eor3 v9.16b, v9.16b, v2.16b, v29.16b //AES final-5 block - result + + movi v16.8b, #0 //suppress further partial tag feed in + pmull2 v28.1q, v8.2d, v23.2d //GHASH final-6 block - high + eor v27.8b, v27.8b, v8.8b //GHASH final-6 block - mid + + pmull v27.1q, v27.1d, v24.1d //GHASH final-6 block - mid + + eor v17.16b, v17.16b, v28.16b //GHASH final-6 block - high + eor v19.16b, v19.16b, v26.16b //GHASH final-6 block - low + + eor v18.16b, v18.16b, v27.16b //GHASH final-6 block - mid +L192_enc_blocks_more_than_5: //blocks left > 5 + + st1 { v9.16b}, [x2], #16 //AES final-5 block - store result + + rev64 v8.16b, v9.16b //GHASH final-5 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-5 block - mid + + ldr q9, [x0], #16 //AES final-4 block - load plaintext + pmull2 v28.1q, v8.2d, v22.2d //GHASH final-5 block - high + + eor v27.8b, v27.8b, v8.8b //GHASH final-5 block - mid + eor v17.16b, v17.16b, v28.16b //GHASH final-5 block - high + + ins v27.d[1], v27.d[0] //GHASH final-5 block - mid + pmull v26.1q, v8.1d, v22.1d //GHASH final-5 block - low + + eor v19.16b, v19.16b, v26.16b //GHASH final-5 block - low + pmull2 v27.1q, v27.2d, v21.2d //GHASH final-5 block - mid + +.long 0xce037529 //eor3 v9.16b, v9.16b, v3.16b, v29.16b //AES final-4 block - result + movi v16.8b, #0 //suppress further partial tag feed in + + eor v18.16b, v18.16b, v27.16b //GHASH final-5 block - mid +L192_enc_blocks_more_than_4: //blocks left > 4 + + st1 { v9.16b}, [x2], #16 //AES final-4 block - store result + + rev64 v8.16b, v9.16b //GHASH final-4 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ldr q9, [x0], #16 //AES final-3 block - load plaintext + pmull2 v28.1q, v8.2d, v20.2d //GHASH final-4 block - high + ins v27.d[0], v8.d[1] //GHASH final-4 block - mid + + pmull v26.1q, v8.1d, v20.1d //GHASH final-4 block - low + eor v17.16b, v17.16b, v28.16b //GHASH final-4 block - high + + eor v27.8b, v27.8b, v8.8b //GHASH final-4 block - mid + + movi v16.8b, #0 //suppress further partial tag feed in + eor v19.16b, v19.16b, v26.16b //GHASH final-4 block - low + + pmull v27.1q, v27.1d, v21.1d //GHASH final-4 block - mid + + eor v18.16b, v18.16b, v27.16b //GHASH final-4 block - mid +.long 0xce047529 //eor3 v9.16b, v9.16b, v4.16b, v29.16b //AES final-3 block - result +L192_enc_blocks_more_than_3: //blocks left > 3 + + ldr q24, [x3, #96] //load h4k | h3k + st1 { v9.16b}, [x2], #16 //AES final-3 block - store result + + rev64 v8.16b, v9.16b //GHASH final-3 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + movi v16.8b, #0 //suppress further partial tag feed in + + ldr q9, [x0], #16 //AES final-2 block - load plaintext + ldr q25, [x3, #112] //load h4l | h4h + ext v25.16b, v25.16b, v25.16b, #8 + + ins v27.d[0], v8.d[1] //GHASH final-3 block - mid + +.long 0xce057529 //eor3 v9.16b, v9.16b, v5.16b, v29.16b //AES final-2 block - result + eor v27.8b, v27.8b, v8.8b //GHASH final-3 block - mid + + ins v27.d[1], v27.d[0] //GHASH final-3 block - mid + pmull v26.1q, v8.1d, v25.1d //GHASH final-3 block - low + + pmull2 v28.1q, v8.2d, v25.2d //GHASH final-3 block - high + pmull2 v27.1q, v27.2d, v24.2d //GHASH final-3 block - mid + + eor v19.16b, v19.16b, v26.16b //GHASH final-3 block - low + + eor v18.16b, v18.16b, v27.16b //GHASH final-3 block - mid + eor v17.16b, v17.16b, v28.16b //GHASH final-3 block - high +L192_enc_blocks_more_than_2: //blocks left > 2 + + st1 { v9.16b}, [x2], #16 //AES final-2 block - store result + + rev64 v8.16b, v9.16b //GHASH final-2 block + ldr q23, [x3, #80] //load h3l | h3h + ext v23.16b, v23.16b, v23.16b, #8 + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ldr q9, [x0], #16 //AES final-1 block - load plaintext + ins v27.d[0], v8.d[1] //GHASH final-2 block - mid + + eor v27.8b, v27.8b, v8.8b //GHASH final-2 block - mid + + pmull v26.1q, v8.1d, v23.1d //GHASH final-2 block - low + pmull2 v28.1q, v8.2d, v23.2d //GHASH final-2 block - high + movi v16.8b, #0 //suppress further partial tag feed in + + pmull v27.1q, v27.1d, v24.1d //GHASH final-2 block - mid + + eor v19.16b, v19.16b, v26.16b //GHASH final-2 block - low + eor v17.16b, v17.16b, v28.16b //GHASH final-2 block - high + + eor v18.16b, v18.16b, v27.16b //GHASH final-2 block - mid +.long 0xce067529 //eor3 v9.16b, v9.16b, v6.16b, v29.16b //AES final-1 block - result +L192_enc_blocks_more_than_1: //blocks left > 1 + + ldr q22, [x3, #64] //load h1l | h1h + ext v22.16b, v22.16b, v22.16b, #8 + st1 { v9.16b}, [x2], #16 //AES final-1 block - store result + + rev64 v8.16b, v9.16b //GHASH final-1 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-1 block - mid + pmull v26.1q, v8.1d, v22.1d //GHASH final-1 block - low + + eor v19.16b, v19.16b, v26.16b //GHASH final-1 block - low + pmull2 v28.1q, v8.2d, v22.2d //GHASH final-1 block - high + eor v27.8b, v27.8b, v8.8b //GHASH final-1 block - mid + + ldr q9, [x0], #16 //AES final block - load plaintext + ldr q21, [x3, #48] //load h2k | h1k + + ins v27.d[1], v27.d[0] //GHASH final-1 block - mid + +.long 0xce077529 //eor3 v9.16b, v9.16b, v7.16b, v29.16b //AES final block - result + pmull2 v27.1q, v27.2d, v21.2d //GHASH final-1 block - mid + + movi v16.8b, #0 //suppress further partial tag feed in + + eor v18.16b, v18.16b, v27.16b //GHASH final-1 block - mid + eor v17.16b, v17.16b, v28.16b //GHASH final-1 block - high +L192_enc_blocks_less_than_1: //blocks left <= 1 + + mvn x6, xzr //temp0_x = 0xffffffffffffffff + and x1, x1, #127 //bit_length %= 128 + + sub x1, x1, #128 //bit_length -= 128 + + neg x1, x1 //bit_length = 128 - #bits in input (in range [1,128]) + + and x1, x1, #127 //bit_length %= 128 + + lsr x6, x6, x1 //temp0_x is mask for top 64b of last block + cmp x1, #64 + mvn x7, xzr //temp1_x = 0xffffffffffffffff + + csel x13, x7, x6, lt + csel x14, x6, xzr, lt + + mov v0.d[1], x14 + ldr q20, [x3, #32] //load h1l | h1h + ext v20.16b, v20.16b, v20.16b, #8 + + ld1 { v26.16b}, [x2] //load existing bytes where the possibly partial last block is to be stored + mov v0.d[0], x13 //ctr0b is mask for last block + + and v9.16b, v9.16b, v0.16b //possibly partial last block has zeroes in highest bits + + rev64 v8.16b, v9.16b //GHASH final block + bif v9.16b, v26.16b, v0.16b //insert existing bytes in top end of result before storing + + st1 { v9.16b}, [x2] //store all 16B + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v16.d[0], v8.d[1] //GHASH final block - mid + pmull2 v28.1q, v8.2d, v20.2d //GHASH final block - high + + eor v17.16b, v17.16b, v28.16b //GHASH final block - high + pmull v26.1q, v8.1d, v20.1d //GHASH final block - low + + eor v16.8b, v16.8b, v8.8b //GHASH final block - mid + + pmull v16.1q, v16.1d, v21.1d //GHASH final block - mid + + eor v18.16b, v18.16b, v16.16b //GHASH final block - mid + ldr d16, [x10] //MODULO - load modulo constant + + eor v19.16b, v19.16b, v26.16b //GHASH final block - low + ext v21.16b, v17.16b, v17.16b, #8 //MODULO - other top alignment + + rev32 v30.16b, v30.16b + + str q30, [x16] //store the updated counter +.long 0xce114e52 //eor3 v18.16b, v18.16b, v17.16b, v19.16b //MODULO - karatsuba tidy up + + pmull v29.1q, v17.1d, v16.1d //MODULO - top 64b align with mid + +.long 0xce1d5652 //eor3 v18.16b, v18.16b, v29.16b, v21.16b //MODULO - fold into mid + + pmull v17.1q, v18.1d, v16.1d //MODULO - mid 64b align with low + ext v21.16b, v18.16b, v18.16b, #8 //MODULO - other mid alignment + +.long 0xce115673 //eor3 v19.16b, v19.16b, v17.16b, v21.16b //MODULO - fold into low + ext v19.16b, v19.16b, v19.16b, #8 + rev64 v19.16b, v19.16b + st1 { v19.16b }, [x3] + + mov x0, x9 //return sizes + + ldp d10, d11, [sp, #16] + ldp d12, d13, [sp, #32] + ldp d14, d15, [sp, #48] + ldp d8, d9, [sp], #80 + ret + +L192_enc_ret: + mov w0, #0x0 + ret + +.globl unroll8_eor3_aes_gcm_dec_192_kernel +.def unroll8_eor3_aes_gcm_dec_192_kernel + .type 32 +.endef +.align 4 +unroll8_eor3_aes_gcm_dec_192_kernel: + AARCH64_VALID_CALL_TARGET + cbz x1, L192_dec_ret + stp d8, d9, [sp, #-80]! + lsr x9, x1, #3 + mov x16, x4 + mov x8, x5 + stp d10, d11, [sp, #16] + stp d12, d13, [sp, #32] + stp d14, d15, [sp, #48] + mov x5, #0xc200000000000000 + stp x5, xzr, [sp, #64] + add x10, sp, #64 + + mov x5, x9 + ld1 { v0.16b}, [x16] //CTR block 0 + ld1 { v19.16b}, [x3] + + mov x15, #0x100000000 //set up counter increment + movi v31.16b, #0x0 + mov v31.d[1], x15 + + rev32 v30.16b, v0.16b //set up reversed counter + + add v30.4s, v30.4s, v31.4s //CTR block 0 + + rev32 v1.16b, v30.16b //CTR block 1 + add v30.4s, v30.4s, v31.4s //CTR block 1 + + rev32 v2.16b, v30.16b //CTR block 2 + add v30.4s, v30.4s, v31.4s //CTR block 2 + + rev32 v3.16b, v30.16b //CTR block 3 + add v30.4s, v30.4s, v31.4s //CTR block 3 + + rev32 v4.16b, v30.16b //CTR block 4 + add v30.4s, v30.4s, v31.4s //CTR block 4 + + rev32 v5.16b, v30.16b //CTR block 5 + add v30.4s, v30.4s, v31.4s //CTR block 5 + ldp q26, q27, [x8, #0] //load rk0, rk1 + + rev32 v6.16b, v30.16b //CTR block 6 + add v30.4s, v30.4s, v31.4s //CTR block 6 + + rev32 v7.16b, v30.16b //CTR block 7 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 0 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 0 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 0 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 0 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 0 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 0 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 0 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 0 + ldp q28, q26, [x8, #32] //load rk2, rk3 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 1 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 1 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 1 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 1 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 1 + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 1 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 1 + + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 7 - round 2 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 2 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 1 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 5 - round 2 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 2 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 2 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 2 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 4 - round 2 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 6 - round 2 + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 3 + + ldp q27, q28, [x8, #64] //load rk4, rk5 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 3 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 3 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 3 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 3 + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 3 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 3 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 3 + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 4 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 4 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 4 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 4 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 4 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 4 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 4 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 5 - round 5 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 4 + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 6 - round 5 + ldp q26, q27, [x8, #96] //load rk6, rk7 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 5 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 4 - round 5 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 5 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 5 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 5 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 7 - round 5 + + sub x5, x5, #1 //byte_len - 1 + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 6 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 6 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 6 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 6 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 6 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 6 + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 6 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 6 + ldp q28, q26, [x8, #128] //load rk8, rk9 + + add v30.4s, v30.4s, v31.4s //CTR block 7 + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 7 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 7 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 7 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 7 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 7 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 7 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 7 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 7 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 8 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 8 + and x5, x5, #0xffffffffffffff80 //number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 7 - round 8 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 6 - round 8 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 5 - round 8 + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 4 - round 8 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 8 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 8 + + add x4, x0, x1, lsr #3 //end_input_ptr + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 9 + + ld1 { v19.16b}, [x3] + ext v19.16b, v19.16b, v19.16b, #8 + rev64 v19.16b, v19.16b + + ldp q27, q28, [x8, #160] //load rk10, rk11 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 9 + add x5, x5, x0 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 9 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 9 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 9 + + cmp x0, x5 //check if we have <= 8 blocks + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 9 + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 9 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 9 + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 10 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 10 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 10 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 10 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 10 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 10 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 10 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 10 + ldr q26, [x8, #192] //load rk12 + + aese v0.16b, v28.16b //AES block 0 - round 11 + aese v1.16b, v28.16b //AES block 1 - round 11 + aese v4.16b, v28.16b //AES block 4 - round 11 + + aese v6.16b, v28.16b //AES block 6 - round 11 + aese v5.16b, v28.16b //AES block 5 - round 11 + aese v7.16b, v28.16b //AES block 7 - round 11 + + aese v2.16b, v28.16b //AES block 2 - round 11 + aese v3.16b, v28.16b //AES block 3 - round 11 + b.ge L192_dec_tail //handle tail + + ldp q8, q9, [x0], #32 //AES block 0, 1 - load ciphertext + + ldp q10, q11, [x0], #32 //AES block 2, 3 - load ciphertext + + ldp q12, q13, [x0], #32 //AES block 4, 5 - load ciphertext + +.long 0xce016921 //eor3 v1.16b, v9.16b, v1.16b, v26.16b //AES block 1 - result +.long 0xce006900 //eor3 v0.16b, v8.16b, v0.16b, v26.16b //AES block 0 - result + stp q0, q1, [x2], #32 //AES block 0, 1 - store result + + rev32 v0.16b, v30.16b //CTR block 8 + add v30.4s, v30.4s, v31.4s //CTR block 8 + + rev32 v1.16b, v30.16b //CTR block 9 + add v30.4s, v30.4s, v31.4s //CTR block 9 +.long 0xce036963 //eor3 v3.16b, v11.16b, v3.16b, v26.16b //AES block 3 - result + +.long 0xce026942 //eor3 v2.16b, v10.16b, v2.16b, v26.16b //AES block 2 - result + stp q2, q3, [x2], #32 //AES block 2, 3 - store result + ldp q14, q15, [x0], #32 //AES block 6, 7 - load ciphertext + + rev32 v2.16b, v30.16b //CTR block 10 + add v30.4s, v30.4s, v31.4s //CTR block 10 + +.long 0xce046984 //eor3 v4.16b, v12.16b, v4.16b, v26.16b //AES block 4 - result + + rev32 v3.16b, v30.16b //CTR block 11 + add v30.4s, v30.4s, v31.4s //CTR block 11 + +.long 0xce0569a5 //eor3 v5.16b, v13.16b, v5.16b, v26.16b //AES block 5 - result + stp q4, q5, [x2], #32 //AES block 4, 5 - store result + cmp x0, x5 //check if we have <= 8 blocks + +.long 0xce0669c6 //eor3 v6.16b, v14.16b, v6.16b, v26.16b //AES block 6 - result +.long 0xce0769e7 //eor3 v7.16b, v15.16b, v7.16b, v26.16b //AES block 7 - result + rev32 v4.16b, v30.16b //CTR block 12 + + add v30.4s, v30.4s, v31.4s //CTR block 12 + stp q6, q7, [x2], #32 //AES block 6, 7 - store result + b.ge L192_dec_prepretail //do prepretail + +L192_dec_main_loop: //main loop start + rev64 v9.16b, v9.16b //GHASH block 8k+1 + ldp q26, q27, [x8, #0] //load rk0, rk1 + ext v19.16b, v19.16b, v19.16b, #8 //PRE 0 + + rev64 v8.16b, v8.16b //GHASH block 8k + rev32 v5.16b, v30.16b //CTR block 8k+13 + add v30.4s, v30.4s, v31.4s //CTR block 8k+13 + + ldr q23, [x3, #176] //load h7l | h7h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #208] //load h8l | h8h + ext v25.16b, v25.16b, v25.16b, #8 + rev64 v12.16b, v12.16b //GHASH block 8k+4 + rev64 v11.16b, v11.16b //GHASH block 8k+3 + + eor v8.16b, v8.16b, v19.16b //PRE 1 + rev32 v6.16b, v30.16b //CTR block 8k+14 + add v30.4s, v30.4s, v31.4s //CTR block 8k+14 + + rev64 v13.16b, v13.16b //GHASH block 8k+5 + + rev32 v7.16b, v30.16b //CTR block 8k+15 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 0 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 0 + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 0 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 0 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 0 + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 0 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 0 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 0 + + pmull v19.1q, v8.1d, v25.1d //GHASH block 8k - low + pmull2 v16.1q, v9.2d, v23.2d //GHASH block 8k+1 - high + ldp q28, q26, [x8, #32] //load rk2, rk3 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 1 + pmull v23.1q, v9.1d, v23.1d //GHASH block 8k+1 - low + ldr q20, [x3, #128] //load h5l | h5h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #160] //load h6l | h6h + ext v22.16b, v22.16b, v22.16b, #8 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 1 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 1 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 1 + + pmull2 v17.1q, v8.2d, v25.2d //GHASH block 8k - high + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 1 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 1 + + trn1 v18.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + rev64 v10.16b, v10.16b //GHASH block 8k+2 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 1 + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 1 + ldr q21, [x3, #144] //load h6k | h5k + ldr q24, [x3, #192] //load h8k | h7k + trn2 v8.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + + eor v17.16b, v17.16b, v16.16b //GHASH block 8k+1 - high + pmull2 v9.1q, v11.2d, v20.2d //GHASH block 8k+3 - high + pmull2 v29.1q, v10.2d, v22.2d //GHASH block 8k+2 - high + + eor v8.16b, v8.16b, v18.16b //GHASH block 8k, 8k+1 - mid + eor v19.16b, v19.16b, v23.16b //GHASH block 8k+1 - low + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 2 + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 2 + pmull v20.1q, v11.1d, v20.1d //GHASH block 8k+3 - low +.long 0xce1d2631 //eor3 v17.16b, v17.16b, v29.16b, v9.16b //GHASH block 8k+2, 8k+3 - high + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 2 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 3 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 2 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 2 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 2 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 2 + + ldr q23, [x3, #80] //load h3l | h3h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #112] //load h4l | h4h + ext v25.16b, v25.16b, v25.16b, #8 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 2 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 3 + + pmull v22.1q, v10.1d, v22.1d //GHASH block 8k+2 - low + trn1 v29.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + trn2 v10.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 3 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 3 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 3 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 3 + ldp q27, q28, [x8, #64] //load rk4, rk5 + + eor v10.16b, v10.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+2, 8k+3 - low + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 3 + + trn1 v16.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + add v30.4s, v30.4s, v31.4s //CTR block 8k+15 + + pmull2 v29.1q, v10.2d, v21.2d //GHASH block 8k+2 - mid + pmull2 v18.1q, v8.2d, v24.2d //GHASH block 8k - mid + pmull v24.1q, v8.1d, v24.1d //GHASH block 8k+1 - mid + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 3 + pmull v21.1q, v10.1d, v21.1d //GHASH block 8k+3 - mid + pmull2 v8.1q, v12.2d, v25.2d //GHASH block 8k+4 - high + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 4 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 4 + eor v18.16b, v18.16b, v24.16b //GHASH block 8k+1 - mid + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 4 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 4 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 4 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 4 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 4 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 4 + + ldr q20, [x3, #32] //load h1l | h1h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #64] //load h2l | h2h + ext v22.16b, v22.16b, v22.16b, #8 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 5 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 5 + + ldp q26, q27, [x8, #96] //load rk6, rk7 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 5 + rev64 v15.16b, v15.16b //GHASH block 8k+7 + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 5 +.long 0xce157652 //eor3 v18.16b, v18.16b, v21.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 5 + + pmull v25.1q, v12.1d, v25.1d //GHASH block 8k+4 - low + trn2 v12.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 5 + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 5 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 5 + rev64 v14.16b, v14.16b //GHASH block 8k+6 + + ldr q21, [x3, #48] //load h2k | h1k + ldr q24, [x3, #96] //load h4k | h3k + pmull2 v10.1q, v13.2d, v23.2d //GHASH block 8k+5 - high + pmull v23.1q, v13.1d, v23.1d //GHASH block 8k+5 - low + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 6 + eor v12.16b, v12.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + trn1 v13.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 6 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 6 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 6 + + pmull2 v11.1q, v14.2d, v22.2d //GHASH block 8k+6 - high + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 6 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 6 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 7 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 7 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 6 + + pmull2 v16.1q, v12.2d, v24.2d //GHASH block 8k+4 - mid +.long 0xce082a31 //eor3 v17.16b, v17.16b, v8.16b, v10.16b //GHASH block 8k+4, 8k+5 - high +.long 0xce195e73 //eor3 v19.16b, v19.16b, v25.16b, v23.16b //GHASH block 8k+4, 8k+5 - low + + pmull v22.1q, v14.1d, v22.1d //GHASH block 8k+6 - low + trn2 v14.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 6 + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 7 + ldp q28, q26, [x8, #128] //load rk8, rk9 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 7 + + eor v14.16b, v14.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + pmull v24.1q, v12.1d, v24.1d //GHASH block 8k+5 - mid + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 7 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 7 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 7 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 7 + +.long 0xce184252 //eor3 v18.16b, v18.16b, v24.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + pmull2 v13.1q, v14.2d, v21.2d //GHASH block 8k+6 - mid + pmull2 v12.1q, v15.2d, v20.2d //GHASH block 8k+7 - high + + pmull v21.1q, v14.1d, v21.1d //GHASH block 8k+7 - mid + ldr d16, [x10] //MODULO - load modulo constant + pmull v20.1q, v15.1d, v20.1d //GHASH block 8k+7 - low + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 8 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 8 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 8 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 8 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 8 +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+6, 8k+7 - low + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 8 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 8 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 8 + +.long 0xce0b3231 //eor3 v17.16b, v17.16b, v11.16b, v12.16b //GHASH block 8k+6, 8k+7 - high + rev32 v20.16b, v30.16b //CTR block 8k+16 + add v30.4s, v30.4s, v31.4s //CTR block 8k+16 + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 9 +.long 0xce153652 //eor3 v18.16b, v18.16b, v21.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 9 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 9 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 9 + ldp q27, q28, [x8, #160] //load rk10, rk11 + +.long 0xce114e52 //eor3 v18.16b, v18.16b, v17.16b, v19.16b //MODULO - karatsuba tidy up + ldp q8, q9, [x0], #32 //AES block 8k+8, 8k+9 - load ciphertext + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 9 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 9 + ldp q10, q11, [x0], #32 //AES block 8k+10, 8k+11 - load ciphertext + + rev32 v22.16b, v30.16b //CTR block 8k+17 + pmull v29.1q, v17.1d, v16.1d //MODULO - top 64b align with mid + add v30.4s, v30.4s, v31.4s //CTR block 8k+17 + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 9 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 9 + ext v21.16b, v17.16b, v17.16b, #8 //MODULO - other top alignment + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 10 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 10 + ldp q12, q13, [x0], #32 //AES block 8k+12, 8k+13 - load ciphertext + + rev32 v23.16b, v30.16b //CTR block 8k+18 + add v30.4s, v30.4s, v31.4s //CTR block 8k+18 +.long 0xce1d5652 //eor3 v18.16b, v18.16b, v29.16b, v21.16b //MODULO - fold into mid + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 10 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 10 + ldr q26, [x8, #192] //load rk12 + + ldp q14, q15, [x0], #32 //AES block 8k+14, 8k+15 - load ciphertext + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 10 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 10 + + aese v0.16b, v28.16b //AES block 8k+8 - round 11 + ext v21.16b, v18.16b, v18.16b, #8 //MODULO - other mid alignment + aese v1.16b, v28.16b //AES block 8k+9 - round 11 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 10 + aese v6.16b, v28.16b //AES block 8k+14 - round 11 + aese v3.16b, v28.16b //AES block 8k+11 - round 11 + +.long 0xce006900 //eor3 v0.16b, v8.16b, v0.16b, v26.16b //AES block 8k+8 - result + rev32 v25.16b, v30.16b //CTR block 8k+19 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 10 + + aese v4.16b, v28.16b //AES block 8k+12 - round 11 + aese v2.16b, v28.16b //AES block 8k+10 - round 11 + add v30.4s, v30.4s, v31.4s //CTR block 8k+19 + + aese v7.16b, v28.16b //AES block 8k+15 - round 11 + aese v5.16b, v28.16b //AES block 8k+13 - round 11 + pmull v17.1q, v18.1d, v16.1d //MODULO - mid 64b align with low + +.long 0xce016921 //eor3 v1.16b, v9.16b, v1.16b, v26.16b //AES block 8k+9 - result + stp q0, q1, [x2], #32 //AES block 8k+8, 8k+9 - store result +.long 0xce036963 //eor3 v3.16b, v11.16b, v3.16b, v26.16b //AES block 8k+11 - result + +.long 0xce026942 //eor3 v2.16b, v10.16b, v2.16b, v26.16b //AES block 8k+10 - result +.long 0xce0769e7 //eor3 v7.16b, v15.16b, v7.16b, v26.16b //AES block 8k+15 - result + stp q2, q3, [x2], #32 //AES block 8k+10, 8k+11 - store result + +.long 0xce0569a5 //eor3 v5.16b, v13.16b, v5.16b, v26.16b //AES block 8k+13 - result +.long 0xce115673 //eor3 v19.16b, v19.16b, v17.16b, v21.16b //MODULO - fold into low + mov v3.16b, v25.16b //CTR block 8k+19 + +.long 0xce046984 //eor3 v4.16b, v12.16b, v4.16b, v26.16b //AES block 8k+12 - result + stp q4, q5, [x2], #32 //AES block 8k+12, 8k+13 - store result + cmp x0, x5 //LOOP CONTROL + +.long 0xce0669c6 //eor3 v6.16b, v14.16b, v6.16b, v26.16b //AES block 8k+14 - result + stp q6, q7, [x2], #32 //AES block 8k+14, 8k+15 - store result + mov v0.16b, v20.16b //CTR block 8k+16 + + mov v1.16b, v22.16b //CTR block 8k+17 + mov v2.16b, v23.16b //CTR block 8k+18 + + rev32 v4.16b, v30.16b //CTR block 8k+20 + add v30.4s, v30.4s, v31.4s //CTR block 8k+20 + b.lt L192_dec_main_loop + +L192_dec_prepretail: //PREPRETAIL + ldp q26, q27, [x8, #0] //load rk0, rk1 + rev32 v5.16b, v30.16b //CTR block 8k+13 + add v30.4s, v30.4s, v31.4s //CTR block 8k+13 + + ldr q23, [x3, #176] //load h7l | h7h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #208] //load h8l | h8h + ext v25.16b, v25.16b, v25.16b, #8 + rev64 v8.16b, v8.16b //GHASH block 8k + ext v19.16b, v19.16b, v19.16b, #8 //PRE 0 + + rev64 v11.16b, v11.16b //GHASH block 8k+3 + rev32 v6.16b, v30.16b //CTR block 8k+14 + add v30.4s, v30.4s, v31.4s //CTR block 8k+14 + + eor v8.16b, v8.16b, v19.16b //PRE 1 + rev64 v10.16b, v10.16b //GHASH block 8k+2 + rev64 v9.16b, v9.16b //GHASH block 8k+1 + + ldr q20, [x3, #128] //load h5l | h5h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #160] //load h6l | h6h + ext v22.16b, v22.16b, v22.16b, #8 + rev32 v7.16b, v30.16b //CTR block 8k+15 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 0 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 0 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 0 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 0 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 0 + pmull2 v16.1q, v9.2d, v23.2d //GHASH block 8k+1 - high + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 0 + pmull2 v17.1q, v8.2d, v25.2d //GHASH block 8k - high + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 0 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 1 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 0 + ldp q28, q26, [x8, #32] //load rk2, rk3 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 1 + pmull2 v29.1q, v10.2d, v22.2d //GHASH block 8k+2 - high + pmull v22.1q, v10.1d, v22.1d //GHASH block 8k+2 - low + + pmull v23.1q, v9.1d, v23.1d //GHASH block 8k+1 - low + eor v17.16b, v17.16b, v16.16b //GHASH block 8k+1 - high + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 1 + + pmull v19.1q, v8.1d, v25.1d //GHASH block 8k - low + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 1 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 1 + + trn1 v18.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + trn2 v8.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + pmull2 v9.1q, v11.2d, v20.2d //GHASH block 8k+3 - high + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 1 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 1 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 1 + + ldr q21, [x3, #144] //load h6k | h5k + ldr q24, [x3, #192] //load h8k | h7k + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 2 + eor v8.16b, v8.16b, v18.16b //GHASH block 8k, 8k+1 - mid + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 2 + rev64 v13.16b, v13.16b //GHASH block 8k+5 + pmull v20.1q, v11.1d, v20.1d //GHASH block 8k+3 - low + +.long 0xce1d2631 //eor3 v17.16b, v17.16b, v29.16b, v9.16b //GHASH block 8k+2, 8k+3 - high + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 2 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 2 + + trn1 v29.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 3 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 2 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 2 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 2 + trn2 v10.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + + pmull2 v18.1q, v8.2d, v24.2d //GHASH block 8k - mid + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 2 + pmull v24.1q, v8.1d, v24.1d //GHASH block 8k+1 - mid + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 3 + eor v10.16b, v10.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + eor v19.16b, v19.16b, v23.16b //GHASH block 8k+1 - low + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 3 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 3 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 3 + +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+2, 8k+3 - low + ldp q27, q28, [x8, #64] //load rk4, rk5 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 3 + + ldr q23, [x3, #80] //load h3l | h3h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #112] //load h4l | h4h + ext v25.16b, v25.16b, v25.16b, #8 + pmull2 v29.1q, v10.2d, v21.2d //GHASH block 8k+2 - mid + pmull v21.1q, v10.1d, v21.1d //GHASH block 8k+3 - mid + + ldr q20, [x3, #32] //load h1l | h1h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #64] //load h2l | h2h + ext v22.16b, v22.16b, v22.16b, #8 + eor v18.16b, v18.16b, v24.16b //GHASH block 8k+1 - mid + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 3 + + rev64 v15.16b, v15.16b //GHASH block 8k+7 + +.long 0xce157652 //eor3 v18.16b, v18.16b, v21.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + rev64 v12.16b, v12.16b //GHASH block 8k+4 + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 4 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 4 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 3 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 4 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 4 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 4 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 4 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 4 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 4 + + rev64 v14.16b, v14.16b //GHASH block 8k+6 + ldr q21, [x3, #48] //load h2k | h1k + ldr q24, [x3, #96] //load h4k | h3k + trn1 v16.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 5 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 5 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 5 + + ldp q26, q27, [x8, #96] //load rk6, rk7 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 5 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 5 + + pmull2 v11.1q, v14.2d, v22.2d //GHASH block 8k+6 - high + pmull2 v8.1q, v12.2d, v25.2d //GHASH block 8k+4 - high + pmull v22.1q, v14.1d, v22.1d //GHASH block 8k+6 - low + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 5 + + pmull v25.1q, v12.1d, v25.1d //GHASH block 8k+4 - low + trn2 v12.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + pmull2 v10.1q, v13.2d, v23.2d //GHASH block 8k+5 - high + + pmull v23.1q, v13.1d, v23.1d //GHASH block 8k+5 - low + trn1 v13.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 5 + + trn2 v14.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 5 + eor v12.16b, v12.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 6 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 6 + + eor v14.16b, v14.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 6 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 6 + + pmull2 v16.1q, v12.2d, v24.2d //GHASH block 8k+4 - mid + pmull v24.1q, v12.1d, v24.1d //GHASH block 8k+5 - mid + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 6 + + pmull2 v13.1q, v14.2d, v21.2d //GHASH block 8k+6 - mid + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 6 + pmull2 v12.1q, v15.2d, v20.2d //GHASH block 8k+7 - high + +.long 0xce184252 //eor3 v18.16b, v18.16b, v24.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 7 +.long 0xce195e73 //eor3 v19.16b, v19.16b, v25.16b, v23.16b //GHASH block 8k+4, 8k+5 - low + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 6 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 6 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 7 + + ldp q28, q26, [x8, #128] //load rk8, rk9 + pmull v21.1q, v14.1d, v21.1d //GHASH block 8k+7 - mid + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 7 + + ldr d16, [x10] //MODULO - load modulo constant +.long 0xce082a31 //eor3 v17.16b, v17.16b, v8.16b, v10.16b //GHASH block 8k+4, 8k+5 - high + pmull v20.1q, v15.1d, v20.1d //GHASH block 8k+7 - low + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 7 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 7 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 7 + +.long 0xce0b3231 //eor3 v17.16b, v17.16b, v11.16b, v12.16b //GHASH block 8k+6, 8k+7 - high +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+6, 8k+7 - low +.long 0xce153652 //eor3 v18.16b, v18.16b, v21.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 7 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 7 + +.long 0xce114e52 //eor3 v18.16b, v18.16b, v17.16b, v19.16b //MODULO - karatsuba tidy up + ext v21.16b, v17.16b, v17.16b, #8 //MODULO - other top alignment + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 8 + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 8 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 8 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 8 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 8 + pmull v29.1q, v17.1d, v16.1d //MODULO - top 64b align with mid + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 8 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 8 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 8 + ldp q27, q28, [x8, #160] //load rk10, rk11 + +.long 0xce1d5652 //eor3 v18.16b, v18.16b, v29.16b, v21.16b //MODULO - fold into mid + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 9 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 9 + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 9 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 9 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 9 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 9 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 9 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 9 + + pmull v17.1q, v18.1d, v16.1d //MODULO - mid 64b align with low + ldr q26, [x8, #192] //load rk12 + ext v21.16b, v18.16b, v18.16b, #8 //MODULO - other mid alignment + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 10 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 10 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 10 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 10 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 10 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 10 + + aese v0.16b, v28.16b //AES block 8k+8 - round 11 +.long 0xce115673 //eor3 v19.16b, v19.16b, v17.16b, v21.16b //MODULO - fold into low + aese v5.16b, v28.16b //AES block 8k+13 - round 11 + + aese v2.16b, v28.16b //AES block 8k+10 - round 11 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 10 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 10 + + aese v6.16b, v28.16b //AES block 8k+14 - round 11 + aese v4.16b, v28.16b //AES block 8k+12 - round 11 + add v30.4s, v30.4s, v31.4s //CTR block 8k+15 + + aese v3.16b, v28.16b //AES block 8k+11 - round 11 + aese v1.16b, v28.16b //AES block 8k+9 - round 11 + aese v7.16b, v28.16b //AES block 8k+15 - round 11 + +L192_dec_tail: //TAIL + + sub x5, x4, x0 //main_end_input_ptr is number of bytes left to process + + ldp q20, q21, [x3, #128] //load h5l | h5h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q9, [x0], #16 //AES block 8k+8 - load ciphertext + + ldp q24, q25, [x3, #192] //load h8k | h7k + ext v25.16b, v25.16b, v25.16b, #8 + + mov v29.16b, v26.16b + + ldp q22, q23, [x3, #160] //load h6l | h6h + ext v22.16b, v22.16b, v22.16b, #8 + ext v23.16b, v23.16b, v23.16b, #8 + ext v16.16b, v19.16b, v19.16b, #8 //prepare final partial tag + +.long 0xce00752c //eor3 v12.16b, v9.16b, v0.16b, v29.16b //AES block 8k+8 - result + cmp x5, #112 + b.gt L192_dec_blocks_more_than_7 + + mov v7.16b, v6.16b + movi v17.8b, #0 + sub v30.4s, v30.4s, v31.4s + + mov v6.16b, v5.16b + mov v5.16b, v4.16b + mov v4.16b, v3.16b + + cmp x5, #96 + movi v19.8b, #0 + mov v3.16b, v2.16b + + mov v2.16b, v1.16b + movi v18.8b, #0 + b.gt L192_dec_blocks_more_than_6 + + mov v7.16b, v6.16b + mov v6.16b, v5.16b + mov v5.16b, v4.16b + + mov v4.16b, v3.16b + mov v3.16b, v1.16b + + sub v30.4s, v30.4s, v31.4s + cmp x5, #80 + b.gt L192_dec_blocks_more_than_5 + + mov v7.16b, v6.16b + mov v6.16b, v5.16b + + mov v5.16b, v4.16b + mov v4.16b, v1.16b + cmp x5, #64 + + sub v30.4s, v30.4s, v31.4s + b.gt L192_dec_blocks_more_than_4 + + sub v30.4s, v30.4s, v31.4s + mov v7.16b, v6.16b + mov v6.16b, v5.16b + + mov v5.16b, v1.16b + cmp x5, #48 + b.gt L192_dec_blocks_more_than_3 + + sub v30.4s, v30.4s, v31.4s + mov v7.16b, v6.16b + cmp x5, #32 + + mov v6.16b, v1.16b + ldr q24, [x3, #96] //load h4k | h3k + b.gt L192_dec_blocks_more_than_2 + + sub v30.4s, v30.4s, v31.4s + + mov v7.16b, v1.16b + cmp x5, #16 + b.gt L192_dec_blocks_more_than_1 + + sub v30.4s, v30.4s, v31.4s + ldr q21, [x3, #48] //load h2k | h1k + b L192_dec_blocks_less_than_1 +L192_dec_blocks_more_than_7: //blocks left > 7 + rev64 v8.16b, v9.16b //GHASH final-7 block + + ins v18.d[0], v24.d[1] //GHASH final-7 block - mid + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + pmull2 v17.1q, v8.2d, v25.2d //GHASH final-7 block - high + ins v27.d[0], v8.d[1] //GHASH final-7 block - mid + ldr q9, [x0], #16 //AES final-6 block - load ciphertext + + pmull v19.1q, v8.1d, v25.1d //GHASH final-7 block - low + + eor v27.8b, v27.8b, v8.8b //GHASH final-7 block - mid + st1 { v12.16b}, [x2], #16 //AES final-7 block - store result + +.long 0xce01752c //eor3 v12.16b, v9.16b, v1.16b, v29.16b //AES final-6 block - result + + pmull v18.1q, v27.1d, v18.1d //GHASH final-7 block - mid + movi v16.8b, #0 //suppress further partial tag feed in +L192_dec_blocks_more_than_6: //blocks left > 6 + + rev64 v8.16b, v9.16b //GHASH final-6 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ldr q9, [x0], #16 //AES final-5 block - load ciphertext + ins v27.d[0], v8.d[1] //GHASH final-6 block - mid + + eor v27.8b, v27.8b, v8.8b //GHASH final-6 block - mid + movi v16.8b, #0 //suppress further partial tag feed in + pmull2 v28.1q, v8.2d, v23.2d //GHASH final-6 block - high + + st1 { v12.16b}, [x2], #16 //AES final-6 block - store result +.long 0xce02752c //eor3 v12.16b, v9.16b, v2.16b, v29.16b //AES final-5 block - result + + eor v17.16b, v17.16b, v28.16b //GHASH final-6 block - high + pmull v27.1q, v27.1d, v24.1d //GHASH final-6 block - mid + pmull v26.1q, v8.1d, v23.1d //GHASH final-6 block - low + + eor v18.16b, v18.16b, v27.16b //GHASH final-6 block - mid + eor v19.16b, v19.16b, v26.16b //GHASH final-6 block - low +L192_dec_blocks_more_than_5: //blocks left > 5 + + rev64 v8.16b, v9.16b //GHASH final-5 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-5 block - mid + + eor v27.8b, v27.8b, v8.8b //GHASH final-5 block - mid + + ins v27.d[1], v27.d[0] //GHASH final-5 block - mid + pmull2 v28.1q, v8.2d, v22.2d //GHASH final-5 block - high + + ldr q9, [x0], #16 //AES final-4 block - load ciphertext + + eor v17.16b, v17.16b, v28.16b //GHASH final-5 block - high + pmull v26.1q, v8.1d, v22.1d //GHASH final-5 block - low + + pmull2 v27.1q, v27.2d, v21.2d //GHASH final-5 block - mid + + eor v19.16b, v19.16b, v26.16b //GHASH final-5 block - low + movi v16.8b, #0 //suppress further partial tag feed in + st1 { v12.16b}, [x2], #16 //AES final-5 block - store result + + eor v18.16b, v18.16b, v27.16b //GHASH final-5 block - mid +.long 0xce03752c //eor3 v12.16b, v9.16b, v3.16b, v29.16b //AES final-4 block - result +L192_dec_blocks_more_than_4: //blocks left > 4 + + rev64 v8.16b, v9.16b //GHASH final-4 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + movi v16.8b, #0 //suppress further partial tag feed in + + ldr q9, [x0], #16 //AES final-3 block - load ciphertext + ins v27.d[0], v8.d[1] //GHASH final-4 block - mid + pmull v26.1q, v8.1d, v20.1d //GHASH final-4 block - low + + eor v27.8b, v27.8b, v8.8b //GHASH final-4 block - mid + + eor v19.16b, v19.16b, v26.16b //GHASH final-4 block - low + + pmull v27.1q, v27.1d, v21.1d //GHASH final-4 block - mid + st1 { v12.16b}, [x2], #16 //AES final-4 block - store result + pmull2 v28.1q, v8.2d, v20.2d //GHASH final-4 block - high + +.long 0xce04752c //eor3 v12.16b, v9.16b, v4.16b, v29.16b //AES final-3 block - result + + eor v18.16b, v18.16b, v27.16b //GHASH final-4 block - mid + eor v17.16b, v17.16b, v28.16b //GHASH final-4 block - high +L192_dec_blocks_more_than_3: //blocks left > 3 + + ldr q25, [x3, #112] //load h4l | h4h + ext v25.16b, v25.16b, v25.16b, #8 + rev64 v8.16b, v9.16b //GHASH final-3 block + ldr q9, [x0], #16 //AES final-2 block - load ciphertext + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-3 block - mid + pmull2 v28.1q, v8.2d, v25.2d //GHASH final-3 block - high + + eor v17.16b, v17.16b, v28.16b //GHASH final-3 block - high + movi v16.8b, #0 //suppress further partial tag feed in + pmull v26.1q, v8.1d, v25.1d //GHASH final-3 block - low + + st1 { v12.16b}, [x2], #16 //AES final-3 block - store result + eor v27.8b, v27.8b, v8.8b //GHASH final-3 block - mid +.long 0xce05752c //eor3 v12.16b, v9.16b, v5.16b, v29.16b //AES final-2 block - result + + eor v19.16b, v19.16b, v26.16b //GHASH final-3 block - low + ldr q24, [x3, #96] //load h4k | h3k + + ins v27.d[1], v27.d[0] //GHASH final-3 block - mid + + pmull2 v27.1q, v27.2d, v24.2d //GHASH final-3 block - mid + + eor v18.16b, v18.16b, v27.16b //GHASH final-3 block - mid +L192_dec_blocks_more_than_2: //blocks left > 2 + + rev64 v8.16b, v9.16b //GHASH final-2 block + ldr q23, [x3, #80] //load h3l | h3h + ext v23.16b, v23.16b, v23.16b, #8 + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-2 block - mid + ldr q9, [x0], #16 //AES final-1 block - load ciphertext + + pmull2 v28.1q, v8.2d, v23.2d //GHASH final-2 block - high + + eor v27.8b, v27.8b, v8.8b //GHASH final-2 block - mid + + eor v17.16b, v17.16b, v28.16b //GHASH final-2 block - high + pmull v26.1q, v8.1d, v23.1d //GHASH final-2 block - low + + pmull v27.1q, v27.1d, v24.1d //GHASH final-2 block - mid + movi v16.8b, #0 //suppress further partial tag feed in + + eor v19.16b, v19.16b, v26.16b //GHASH final-2 block - low + st1 { v12.16b}, [x2], #16 //AES final-2 block - store result + + eor v18.16b, v18.16b, v27.16b //GHASH final-2 block - mid +.long 0xce06752c //eor3 v12.16b, v9.16b, v6.16b, v29.16b //AES final-1 block - result +L192_dec_blocks_more_than_1: //blocks left > 1 + + rev64 v8.16b, v9.16b //GHASH final-1 block + ldr q9, [x0], #16 //AES final block - load ciphertext + ldr q22, [x3, #64] //load h1l | h1h + ext v22.16b, v22.16b, v22.16b, #8 + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + movi v16.8b, #0 //suppress further partial tag feed in + ldr q21, [x3, #48] //load h2k | h1k + + pmull v26.1q, v8.1d, v22.1d //GHASH final-1 block - low + ins v27.d[0], v8.d[1] //GHASH final-1 block - mid + st1 { v12.16b}, [x2], #16 //AES final-1 block - store result + + pmull2 v28.1q, v8.2d, v22.2d //GHASH final-1 block - high + +.long 0xce07752c //eor3 v12.16b, v9.16b, v7.16b, v29.16b //AES final block - result + + eor v27.8b, v27.8b, v8.8b //GHASH final-1 block - mid + + ins v27.d[1], v27.d[0] //GHASH final-1 block - mid + + pmull2 v27.1q, v27.2d, v21.2d //GHASH final-1 block - mid + + eor v19.16b, v19.16b, v26.16b //GHASH final-1 block - low + + eor v18.16b, v18.16b, v27.16b //GHASH final-1 block - mid + eor v17.16b, v17.16b, v28.16b //GHASH final-1 block - high +L192_dec_blocks_less_than_1: //blocks left <= 1 + + rev32 v30.16b, v30.16b + and x1, x1, #127 //bit_length %= 128 + + sub x1, x1, #128 //bit_length -= 128 + str q30, [x16] //store the updated counter + + neg x1, x1 //bit_length = 128 - #bits in input (in range [1,128]) + mvn x6, xzr //temp0_x = 0xffffffffffffffff + + and x1, x1, #127 //bit_length %= 128 + + mvn x7, xzr //temp1_x = 0xffffffffffffffff + lsr x6, x6, x1 //temp0_x is mask for top 64b of last block + cmp x1, #64 + + csel x13, x7, x6, lt + csel x14, x6, xzr, lt + ldr q20, [x3, #32] //load h1l | h1h + ext v20.16b, v20.16b, v20.16b, #8 + + mov v0.d[1], x14 + ld1 { v26.16b}, [x2] //load existing bytes where the possibly partial last block is to be stored + + mov v0.d[0], x13 //ctr0b is mask for last block + + and v9.16b, v9.16b, v0.16b //possibly partial last block has zeroes in highest bits + bif v12.16b, v26.16b, v0.16b //insert existing bytes in top end of result before storing + + rev64 v8.16b, v9.16b //GHASH final block + + st1 { v12.16b}, [x2] //store all 16B + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v16.d[0], v8.d[1] //GHASH final block - mid + pmull v26.1q, v8.1d, v20.1d //GHASH final block - low + + eor v16.8b, v16.8b, v8.8b //GHASH final block - mid + pmull2 v28.1q, v8.2d, v20.2d //GHASH final block - high + eor v19.16b, v19.16b, v26.16b //GHASH final block - low + + pmull v16.1q, v16.1d, v21.1d //GHASH final block - mid + eor v17.16b, v17.16b, v28.16b //GHASH final block - high + + eor v14.16b, v17.16b, v19.16b //MODULO - karatsuba tidy up + eor v18.16b, v18.16b, v16.16b //GHASH final block - mid + ldr d16, [x10] //MODULO - load modulo constant + + pmull v21.1q, v17.1d, v16.1d //MODULO - top 64b align with mid + ext v17.16b, v17.16b, v17.16b, #8 //MODULO - other top alignment + + eor v18.16b, v18.16b, v14.16b //MODULO - karatsuba tidy up + +.long 0xce115652 //eor3 v18.16b, v18.16b, v17.16b, v21.16b //MODULO - fold into mid + + pmull v17.1q, v18.1d, v16.1d //MODULO - mid 64b align with low + ext v18.16b, v18.16b, v18.16b, #8 //MODULO - other mid alignment + +.long 0xce124673 //eor3 v19.16b, v19.16b, v18.16b, v17.16b //MODULO - fold into low + ext v19.16b, v19.16b, v19.16b, #8 + rev64 v19.16b, v19.16b + st1 { v19.16b }, [x3] + + mov x0, x9 + + ldp d10, d11, [sp, #16] + ldp d12, d13, [sp, #32] + ldp d14, d15, [sp, #48] + ldp d8, d9, [sp], #80 + ret + +L192_dec_ret: + mov w0, #0x0 + ret + +.globl unroll8_eor3_aes_gcm_enc_256_kernel +.def unroll8_eor3_aes_gcm_enc_256_kernel + .type 32 +.endef +.align 4 +unroll8_eor3_aes_gcm_enc_256_kernel: + AARCH64_VALID_CALL_TARGET + cbz x1, L256_enc_ret + stp d8, d9, [sp, #-80]! + lsr x9, x1, #3 + mov x16, x4 + mov x8, x5 + stp d10, d11, [sp, #16] + stp d12, d13, [sp, #32] + stp d14, d15, [sp, #48] + mov x5, #0xc200000000000000 + stp x5, xzr, [sp, #64] + add x10, sp, #64 + + ld1 { v0.16b}, [x16] //CTR block 0 + + mov x5, x9 + + mov x15, #0x100000000 //set up counter increment + movi v31.16b, #0x0 + mov v31.d[1], x15 + sub x5, x5, #1 //byte_len - 1 + + and x5, x5, #0xffffffffffffff80 //number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + + add x5, x5, x0 + + rev32 v30.16b, v0.16b //set up reversed counter + + add v30.4s, v30.4s, v31.4s //CTR block 0 + + rev32 v1.16b, v30.16b //CTR block 1 + add v30.4s, v30.4s, v31.4s //CTR block 1 + + rev32 v2.16b, v30.16b //CTR block 2 + add v30.4s, v30.4s, v31.4s //CTR block 2 + + rev32 v3.16b, v30.16b //CTR block 3 + add v30.4s, v30.4s, v31.4s //CTR block 3 + + rev32 v4.16b, v30.16b //CTR block 4 + add v30.4s, v30.4s, v31.4s //CTR block 4 + + rev32 v5.16b, v30.16b //CTR block 5 + add v30.4s, v30.4s, v31.4s //CTR block 5 + ldp q26, q27, [x8, #0] //load rk0, rk1 + + rev32 v6.16b, v30.16b //CTR block 6 + add v30.4s, v30.4s, v31.4s //CTR block 6 + + rev32 v7.16b, v30.16b //CTR block 7 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 0 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 0 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 0 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 0 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 0 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 0 + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 0 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 0 + ldp q28, q26, [x8, #32] //load rk2, rk3 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 1 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 1 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 1 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 1 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 1 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 1 + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 1 + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 2 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 2 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 1 + + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 7 - round 2 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 6 - round 2 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 5 - round 2 + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 4 - round 2 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 2 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 2 + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 3 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 3 + ldp q27, q28, [x8, #64] //load rk4, rk5 + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 3 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 3 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 3 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 3 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 3 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 3 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 4 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 4 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 4 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 4 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 4 + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 4 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 4 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 4 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 5 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 5 + ldp q26, q27, [x8, #96] //load rk6, rk7 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 5 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 4 - round 5 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 5 - round 5 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 5 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 6 - round 5 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 7 - round 5 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 6 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 6 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 6 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 6 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 6 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 6 + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 6 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 6 + ldp q28, q26, [x8, #128] //load rk8, rk9 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 7 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 7 + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 7 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 7 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 7 + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 7 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 7 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 7 + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 6 - round 8 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 8 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 8 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 8 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 7 - round 8 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 5 - round 8 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 4 - round 8 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 8 + + ld1 { v19.16b}, [x3] + ext v19.16b, v19.16b, v19.16b, #8 + rev64 v19.16b, v19.16b + ldp q27, q28, [x8, #160] //load rk10, rk11 + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 9 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 9 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 9 + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 9 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 9 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 9 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 9 + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 10 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 10 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 9 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 10 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 10 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 10 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 10 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 10 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 10 + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 4 - round 11 + ldp q26, q27, [x8, #192] //load rk12, rk13 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 5 - round 11 + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 11 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 6 - round 11 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 11 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 11 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 11 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 7 - round 11 + + add v30.4s, v30.4s, v31.4s //CTR block 7 + ldr q28, [x8, #224] //load rk14 + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 12 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 12 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 12 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 12 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 12 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 12 + + aese v2.16b, v27.16b //AES block 2 - round 13 + aese v1.16b, v27.16b //AES block 1 - round 13 + aese v4.16b, v27.16b //AES block 4 - round 13 + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 12 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 12 + + aese v0.16b, v27.16b //AES block 0 - round 13 + aese v5.16b, v27.16b //AES block 5 - round 13 + + aese v6.16b, v27.16b //AES block 6 - round 13 + aese v7.16b, v27.16b //AES block 7 - round 13 + aese v3.16b, v27.16b //AES block 3 - round 13 + + add x4, x0, x1, lsr #3 //end_input_ptr + cmp x0, x5 //check if we have <= 8 blocks + b.ge L256_enc_tail //handle tail + + ldp q8, q9, [x0], #32 //AES block 0, 1 - load plaintext + + ldp q10, q11, [x0], #32 //AES block 2, 3 - load plaintext + +.long 0xce007108 //eor3 v8.16b, v8.16b, v0.16b, v28.16b //AES block 0 - result + rev32 v0.16b, v30.16b //CTR block 8 + add v30.4s, v30.4s, v31.4s //CTR block 8 + +.long 0xce017129 //eor3 v9.16b, v9.16b, v1.16b, v28.16b //AES block 1 - result +.long 0xce03716b //eor3 v11.16b, v11.16b, v3.16b, v28.16b //AES block 3 - result + + rev32 v1.16b, v30.16b //CTR block 9 + add v30.4s, v30.4s, v31.4s //CTR block 9 + ldp q12, q13, [x0], #32 //AES block 4, 5 - load plaintext + + ldp q14, q15, [x0], #32 //AES block 6, 7 - load plaintext +.long 0xce02714a //eor3 v10.16b, v10.16b, v2.16b, v28.16b //AES block 2 - result + cmp x0, x5 //check if we have <= 8 blocks + + rev32 v2.16b, v30.16b //CTR block 10 + add v30.4s, v30.4s, v31.4s //CTR block 10 + stp q8, q9, [x2], #32 //AES block 0, 1 - store result + + stp q10, q11, [x2], #32 //AES block 2, 3 - store result + + rev32 v3.16b, v30.16b //CTR block 11 + add v30.4s, v30.4s, v31.4s //CTR block 11 + +.long 0xce04718c //eor3 v12.16b, v12.16b, v4.16b, v28.16b //AES block 4 - result + +.long 0xce0771ef //eor3 v15.16b, v15.16b, v7.16b, v28.16b //AES block 7 - result +.long 0xce0671ce //eor3 v14.16b, v14.16b, v6.16b, v28.16b //AES block 6 - result +.long 0xce0571ad //eor3 v13.16b, v13.16b, v5.16b, v28.16b //AES block 5 - result + + stp q12, q13, [x2], #32 //AES block 4, 5 - store result + rev32 v4.16b, v30.16b //CTR block 12 + + stp q14, q15, [x2], #32 //AES block 6, 7 - store result + add v30.4s, v30.4s, v31.4s //CTR block 12 + b.ge L256_enc_prepretail //do prepretail + +L256_enc_main_loop: //main loop start + ldp q26, q27, [x8, #0] //load rk0, rk1 + + rev32 v5.16b, v30.16b //CTR block 8k+13 + add v30.4s, v30.4s, v31.4s //CTR block 8k+13 + ldr q21, [x3, #144] //load h6k | h5k + ldr q24, [x3, #192] //load h8k | h7k + + rev64 v11.16b, v11.16b //GHASH block 8k+3 + ldr q20, [x3, #128] //load h5l | h5h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #160] //load h6l | h6h + ext v22.16b, v22.16b, v22.16b, #8 + rev64 v9.16b, v9.16b //GHASH block 8k+1 + + rev32 v6.16b, v30.16b //CTR block 8k+14 + add v30.4s, v30.4s, v31.4s //CTR block 8k+14 + rev64 v8.16b, v8.16b //GHASH block 8k + + rev64 v12.16b, v12.16b //GHASH block 8k+4 + ext v19.16b, v19.16b, v19.16b, #8 //PRE 0 + ldr q23, [x3, #176] //load h7l | h7h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #208] //load h8l | h8h + ext v25.16b, v25.16b, v25.16b, #8 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 0 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 0 + rev32 v7.16b, v30.16b //CTR block 8k+15 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 0 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 0 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 0 + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 0 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 0 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 0 + + ldp q28, q26, [x8, #32] //load rk2, rk3 + eor v8.16b, v8.16b, v19.16b //PRE 1 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 1 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 1 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 1 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 1 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 1 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 1 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 1 + + pmull2 v17.1q, v8.2d, v25.2d //GHASH block 8k - high + pmull v19.1q, v8.1d, v25.1d //GHASH block 8k - low + pmull2 v16.1q, v9.2d, v23.2d //GHASH block 8k+1 - high + + trn1 v18.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + trn2 v8.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 1 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 2 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 2 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 2 + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 2 + pmull v23.1q, v9.1d, v23.1d //GHASH block 8k+1 - low + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 2 + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 3 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 3 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 2 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 3 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 2 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 2 + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 3 + rev64 v14.16b, v14.16b //GHASH block 8k+6 + pmull2 v9.1q, v11.2d, v20.2d //GHASH block 8k+3 - high + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 3 + ldp q27, q28, [x8, #64] //load rk4, rk5 + rev64 v10.16b, v10.16b //GHASH block 8k+2 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 3 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 3 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 3 + + eor v17.16b, v17.16b, v16.16b //GHASH block 8k+1 - high + pmull2 v29.1q, v10.2d, v22.2d //GHASH block 8k+2 - high + rev64 v13.16b, v13.16b //GHASH block 8k+5 + + pmull v20.1q, v11.1d, v20.1d //GHASH block 8k+3 - low + eor v19.16b, v19.16b, v23.16b //GHASH block 8k+1 - low + ldr q23, [x3, #80] //load h3l | h3h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #112] //load h4l | h4h + ext v25.16b, v25.16b, v25.16b, #8 + + trn1 v16.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid +.long 0xce1d2631 //eor3 v17.16b, v17.16b, v29.16b, v9.16b //GHASH block 8k+2, 8k+3 - high + pmull v22.1q, v10.1d, v22.1d //GHASH block 8k+2 - low + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 4 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 4 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 4 + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 4 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 4 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 4 + + trn1 v29.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 4 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 4 + + trn2 v10.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + eor v8.16b, v8.16b, v18.16b //GHASH block 8k, 8k+1 - mid + ldp q26, q27, [x8, #96] //load rk6, rk7 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 5 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 5 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 5 + + eor v10.16b, v10.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 5 + rev64 v15.16b, v15.16b //GHASH block 8k+7 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 5 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 5 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 5 + + pmull2 v29.1q, v10.2d, v21.2d //GHASH block 8k+2 - mid + pmull2 v18.1q, v8.2d, v24.2d //GHASH block 8k - mid + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 5 + + pmull v24.1q, v8.1d, v24.1d //GHASH block 8k+1 - mid + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 6 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 6 + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 6 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 6 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 6 + + eor v18.16b, v18.16b, v24.16b //GHASH block 8k+1 - mid + pmull v21.1q, v10.1d, v21.1d //GHASH block 8k+3 - mid + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 6 + +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+2, 8k+3 - low + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 6 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 6 + + ldp q28, q26, [x8, #128] //load rk8, rk9 + pmull2 v8.1q, v12.2d, v25.2d //GHASH block 8k+4 - high + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 7 + + ldr q20, [x3, #32] //load h1l | h1h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #64] //load h2l | h2h + ext v22.16b, v22.16b, v22.16b, #8 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 7 +.long 0xce157652 //eor3 v18.16b, v18.16b, v21.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + + ldr q21, [x3, #48] //load h2k | h1k + ldr q24, [x3, #96] //load h4k | h3k + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 7 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 7 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 7 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 7 + pmull v25.1q, v12.1d, v25.1d //GHASH block 8k+4 - low + + trn2 v12.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 7 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 7 + + pmull2 v10.1q, v13.2d, v23.2d //GHASH block 8k+5 - high + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 8 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 8 + + pmull v23.1q, v13.1d, v23.1d //GHASH block 8k+5 - low + trn1 v13.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + eor v12.16b, v12.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 8 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 9 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 8 + + pmull2 v16.1q, v12.2d, v24.2d //GHASH block 8k+4 - mid + pmull v24.1q, v12.1d, v24.1d //GHASH block 8k+5 - mid + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 8 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 8 + pmull2 v11.1q, v14.2d, v22.2d //GHASH block 8k+6 - high + pmull v22.1q, v14.1d, v22.1d //GHASH block 8k+6 - low + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 8 + trn2 v14.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 8 + +.long 0xce184252 //eor3 v18.16b, v18.16b, v24.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 9 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 9 + + eor v14.16b, v14.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 9 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 9 + + ldp q27, q28, [x8, #160] //load rk10, rk11 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 9 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 9 + + pmull2 v12.1q, v15.2d, v20.2d //GHASH block 8k+7 - high +.long 0xce195e73 //eor3 v19.16b, v19.16b, v25.16b, v23.16b //GHASH block 8k+4, 8k+5 - low + pmull v20.1q, v15.1d, v20.1d //GHASH block 8k+7 - low + + ldr d16, [x10] //MODULO - load modulo constant + pmull2 v13.1q, v14.2d, v21.2d //GHASH block 8k+6 - mid + pmull v21.1q, v14.1d, v21.1d //GHASH block 8k+7 - mid + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 9 + +.long 0xce153652 //eor3 v18.16b, v18.16b, v21.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+6, 8k+7 - low +.long 0xce082a31 //eor3 v17.16b, v17.16b, v8.16b, v10.16b //GHASH block 8k+4, 8k+5 - high + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 10 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 10 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 10 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 10 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 10 + add v30.4s, v30.4s, v31.4s //CTR block 8k+15 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 10 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 10 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 10 + +.long 0xce0b3231 //eor3 v17.16b, v17.16b, v11.16b, v12.16b //GHASH block 8k+6, 8k+7 - high + + ldp q26, q27, [x8, #192] //load rk12, rk13 + rev32 v20.16b, v30.16b //CTR block 8k+16 + + ext v21.16b, v17.16b, v17.16b, #8 //MODULO - other top alignment + ldp q8, q9, [x0], #32 //AES block 8k+8, 8k+9 - load plaintext + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 11 + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 11 + add v30.4s, v30.4s, v31.4s //CTR block 8k+16 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 11 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 11 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 11 + + pmull v29.1q, v17.1d, v16.1d //MODULO - top 64b align with mid + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 11 + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 12 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 11 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 12 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 12 + rev32 v22.16b, v30.16b //CTR block 8k+17 + + add v30.4s, v30.4s, v31.4s //CTR block 8k+17 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 11 +.long 0xce114e52 //eor3 v18.16b, v18.16b, v17.16b, v19.16b //MODULO - karatsuba tidy up + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 12 + ldr q28, [x8, #224] //load rk14 + aese v7.16b, v27.16b //AES block 8k+15 - round 13 + + ldp q10, q11, [x0], #32 //AES block 8k+10, 8k+11 - load plaintext + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 12 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 12 + +.long 0xce1d5652 //eor3 v18.16b, v18.16b, v29.16b, v21.16b //MODULO - fold into mid + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 12 + ldp q12, q13, [x0], #32 //AES block 4, 5 - load plaintext + + ldp q14, q15, [x0], #32 //AES block 6, 7 - load plaintext + aese v2.16b, v27.16b //AES block 8k+10 - round 13 + aese v4.16b, v27.16b //AES block 8k+12 - round 13 + + rev32 v23.16b, v30.16b //CTR block 8k+18 + add v30.4s, v30.4s, v31.4s //CTR block 8k+18 + aese v5.16b, v27.16b //AES block 8k+13 - round 13 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 12 + aese v3.16b, v27.16b //AES block 8k+11 - round 13 + cmp x0, x5 //LOOP CONTROL + +.long 0xce02714a //eor3 v10.16b, v10.16b, v2.16b, v28.16b //AES block 8k+10 - result + rev32 v25.16b, v30.16b //CTR block 8k+19 + add v30.4s, v30.4s, v31.4s //CTR block 8k+19 + + aese v0.16b, v27.16b //AES block 8k+8 - round 13 + aese v6.16b, v27.16b //AES block 8k+14 - round 13 +.long 0xce0571ad //eor3 v13.16b, v13.16b, v5.16b, v28.16b //AES block 5 - result + + ext v21.16b, v18.16b, v18.16b, #8 //MODULO - other mid alignment + pmull v17.1q, v18.1d, v16.1d //MODULO - mid 64b align with low + aese v1.16b, v27.16b //AES block 8k+9 - round 13 + +.long 0xce04718c //eor3 v12.16b, v12.16b, v4.16b, v28.16b //AES block 4 - result + rev32 v4.16b, v30.16b //CTR block 8k+20 +.long 0xce03716b //eor3 v11.16b, v11.16b, v3.16b, v28.16b //AES block 8k+11 - result + + mov v3.16b, v25.16b //CTR block 8k+19 +.long 0xce017129 //eor3 v9.16b, v9.16b, v1.16b, v28.16b //AES block 8k+9 - result +.long 0xce007108 //eor3 v8.16b, v8.16b, v0.16b, v28.16b //AES block 8k+8 - result + + add v30.4s, v30.4s, v31.4s //CTR block 8k+20 + stp q8, q9, [x2], #32 //AES block 8k+8, 8k+9 - store result + mov v2.16b, v23.16b //CTR block 8k+18 + +.long 0xce0771ef //eor3 v15.16b, v15.16b, v7.16b, v28.16b //AES block 7 - result +.long 0xce154673 //eor3 v19.16b, v19.16b, v21.16b, v17.16b //MODULO - fold into low + stp q10, q11, [x2], #32 //AES block 8k+10, 8k+11 - store result + +.long 0xce0671ce //eor3 v14.16b, v14.16b, v6.16b, v28.16b //AES block 6 - result + mov v1.16b, v22.16b //CTR block 8k+17 + stp q12, q13, [x2], #32 //AES block 4, 5 - store result + + stp q14, q15, [x2], #32 //AES block 6, 7 - store result + mov v0.16b, v20.16b //CTR block 8k+16 + b.lt L256_enc_main_loop + +L256_enc_prepretail: //PREPRETAIL + rev32 v5.16b, v30.16b //CTR block 8k+13 + ldp q26, q27, [x8, #0] //load rk0, rk1 + add v30.4s, v30.4s, v31.4s //CTR block 8k+13 + + rev64 v10.16b, v10.16b //GHASH block 8k+2 + + rev32 v6.16b, v30.16b //CTR block 8k+14 + add v30.4s, v30.4s, v31.4s //CTR block 8k+14 + + rev64 v13.16b, v13.16b //GHASH block 8k+5 + ldr q21, [x3, #144] //load h6k | h5k + ldr q24, [x3, #192] //load h8k | h7k + + rev32 v7.16b, v30.16b //CTR block 8k+15 + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 0 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 0 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 0 + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 0 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 0 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 0 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 0 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 0 + + ext v19.16b, v19.16b, v19.16b, #8 //PRE 0 + rev64 v8.16b, v8.16b //GHASH block 8k + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 1 + + rev64 v9.16b, v9.16b //GHASH block 8k+1 + ldp q28, q26, [x8, #32] //load rk2, rk3 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 1 + + ldr q23, [x3, #176] //load h7l | h7h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #208] //load h8l | h8h + ext v25.16b, v25.16b, v25.16b, #8 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 1 + + ldr q20, [x3, #128] //load h5l | h5h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #160] //load h6l | h6h + ext v22.16b, v22.16b, v22.16b, #8 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 1 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 1 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 1 + eor v8.16b, v8.16b, v19.16b //PRE 1 + + rev64 v11.16b, v11.16b //GHASH block 8k+3 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 1 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 2 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 2 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 1 + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 2 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 2 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 2 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 2 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 2 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 2 + + ldp q27, q28, [x8, #64] //load rk4, rk5 + trn1 v18.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + pmull2 v17.1q, v8.2d, v25.2d //GHASH block 8k - high + + rev64 v14.16b, v14.16b //GHASH block 8k+6 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 3 + pmull2 v16.1q, v9.2d, v23.2d //GHASH block 8k+1 - high + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 3 + pmull v19.1q, v8.1d, v25.1d //GHASH block 8k - low + trn2 v8.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + + pmull2 v29.1q, v10.2d, v22.2d //GHASH block 8k+2 - high + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 3 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 3 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 3 + eor v17.16b, v17.16b, v16.16b //GHASH block 8k+1 - high + + pmull v23.1q, v9.1d, v23.1d //GHASH block 8k+1 - low + pmull2 v9.1q, v11.2d, v20.2d //GHASH block 8k+3 - high + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 3 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 3 + eor v8.16b, v8.16b, v18.16b //GHASH block 8k, 8k+1 - mid + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 3 + + pmull v22.1q, v10.1d, v22.1d //GHASH block 8k+2 - low + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 4 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 4 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 4 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 4 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 4 + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 5 + pmull2 v18.1q, v8.2d, v24.2d //GHASH block 8k - mid +.long 0xce1d2631 //eor3 v17.16b, v17.16b, v29.16b, v9.16b //GHASH block 8k+2, 8k+3 - high + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 4 + trn1 v29.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + trn2 v10.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 4 + eor v19.16b, v19.16b, v23.16b //GHASH block 8k+1 - low + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 4 + + pmull v20.1q, v11.1d, v20.1d //GHASH block 8k+3 - low + pmull v24.1q, v8.1d, v24.1d //GHASH block 8k+1 - mid + eor v10.16b, v10.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + + rev64 v12.16b, v12.16b //GHASH block 8k+4 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 5 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 5 + + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 5 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 5 + ldp q26, q27, [x8, #96] //load rk6, rk7 + + ldr q23, [x3, #80] //load h3l | h3h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #112] //load h4l | h4h + ext v25.16b, v25.16b, v25.16b, #8 + pmull2 v29.1q, v10.2d, v21.2d //GHASH block 8k+2 - mid + pmull v21.1q, v10.1d, v21.1d //GHASH block 8k+3 - mid + +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+2, 8k+3 - low + eor v18.16b, v18.16b, v24.16b //GHASH block 8k+1 - mid + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 5 + rev64 v15.16b, v15.16b //GHASH block 8k+7 + trn1 v16.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 5 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 5 +.long 0xce157652 //eor3 v18.16b, v18.16b, v21.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 6 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 6 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 6 + + ldr q21, [x3, #48] //load h2k | h1k + ldr q24, [x3, #96] //load h4k | h3k + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 6 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 6 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 6 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 6 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 6 + + pmull2 v8.1q, v12.2d, v25.2d //GHASH block 8k+4 - high + pmull v25.1q, v12.1d, v25.1d //GHASH block 8k+4 - low + ldr q20, [x3, #32] //load h1l | h1h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #64] //load h2l | h2h + ext v22.16b, v22.16b, v22.16b, #8 + + ldp q28, q26, [x8, #128] //load rk8, rk9 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 7 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 7 + + pmull2 v10.1q, v13.2d, v23.2d //GHASH block 8k+5 - high + trn2 v12.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 7 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 7 + pmull v23.1q, v13.1d, v23.1d //GHASH block 8k+5 - low + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 7 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 7 + eor v12.16b, v12.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + + pmull2 v11.1q, v14.2d, v22.2d //GHASH block 8k+6 - high + pmull v22.1q, v14.1d, v22.1d //GHASH block 8k+6 - low + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 7 + + trn1 v13.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + trn2 v14.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 7 + + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 8 +.long 0xce195e73 //eor3 v19.16b, v19.16b, v25.16b, v23.16b //GHASH block 8k+4, 8k+5 - low + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 8 + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 8 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 8 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 8 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 8 + eor v14.16b, v14.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 8 + + pmull2 v16.1q, v12.2d, v24.2d //GHASH block 8k+4 - mid + pmull v24.1q, v12.1d, v24.1d //GHASH block 8k+5 - mid + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 8 + + pmull2 v12.1q, v15.2d, v20.2d //GHASH block 8k+7 - high + pmull2 v13.1q, v14.2d, v21.2d //GHASH block 8k+6 - mid + pmull v21.1q, v14.1d, v21.1d //GHASH block 8k+7 - mid + + pmull v20.1q, v15.1d, v20.1d //GHASH block 8k+7 - low +.long 0xce184252 //eor3 v18.16b, v18.16b, v24.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid +.long 0xce082a31 //eor3 v17.16b, v17.16b, v8.16b, v10.16b //GHASH block 8k+4, 8k+5 - high + + ldp q27, q28, [x8, #160] //load rk10, rk11 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 9 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 9 + +.long 0xce0b3231 //eor3 v17.16b, v17.16b, v11.16b, v12.16b //GHASH block 8k+6, 8k+7 - high +.long 0xce153652 //eor3 v18.16b, v18.16b, v21.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + ldr d16, [x10] //MODULO - load modulo constant + +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+6, 8k+7 - low + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 9 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 9 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 9 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 9 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 9 + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 10 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 10 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 9 + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 10 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 10 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 10 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 10 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 10 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 10 + + pmull v29.1q, v17.1d, v16.1d //MODULO - top 64b align with mid +.long 0xce114e52 //eor3 v18.16b, v18.16b, v17.16b, v19.16b //MODULO - karatsuba tidy up + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 11 + + ldp q26, q27, [x8, #192] //load rk12, rk13 + ext v21.16b, v17.16b, v17.16b, #8 //MODULO - other top alignment + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 11 + +.long 0xce1d5652 //eor3 v18.16b, v18.16b, v29.16b, v21.16b //MODULO - fold into mid + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 11 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 11 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 11 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 11 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 11 + + pmull v17.1q, v18.1d, v16.1d //MODULO - mid 64b align with low + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 11 + ldr q28, [x8, #224] //load rk14 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 12 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 12 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 12 + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 12 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 12 + ext v21.16b, v18.16b, v18.16b, #8 //MODULO - other mid alignment + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 12 + add v30.4s, v30.4s, v31.4s //CTR block 8k+15 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 12 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 12 + aese v0.16b, v27.16b //AES block 8k+8 - round 13 + +.long 0xce154673 //eor3 v19.16b, v19.16b, v21.16b, v17.16b //MODULO - fold into low + aese v5.16b, v27.16b //AES block 8k+13 - round 13 + aese v1.16b, v27.16b //AES block 8k+9 - round 13 + + aese v3.16b, v27.16b //AES block 8k+11 - round 13 + aese v4.16b, v27.16b //AES block 8k+12 - round 13 + aese v7.16b, v27.16b //AES block 8k+15 - round 13 + + aese v2.16b, v27.16b //AES block 8k+10 - round 13 + aese v6.16b, v27.16b //AES block 8k+14 - round 13 +L256_enc_tail: //TAIL + + ldp q24, q25, [x3, #192] //load h8l | h8h + ext v25.16b, v25.16b, v25.16b, #8 + sub x5, x4, x0 //main_end_input_ptr is number of bytes left to process + + ldr q8, [x0], #16 //AES block 8k+8 - load plaintext + + ldp q20, q21, [x3, #128] //load h5l | h5h + ext v20.16b, v20.16b, v20.16b, #8 + + ext v16.16b, v19.16b, v19.16b, #8 //prepare final partial tag + ldp q22, q23, [x3, #160] //load h6l | h6h + ext v22.16b, v22.16b, v22.16b, #8 + ext v23.16b, v23.16b, v23.16b, #8 + mov v29.16b, v28.16b + + cmp x5, #112 +.long 0xce007509 //eor3 v9.16b, v8.16b, v0.16b, v29.16b //AES block 8k+8 - result + b.gt L256_enc_blocks_more_than_7 + + movi v19.8b, #0 + mov v7.16b, v6.16b + movi v17.8b, #0 + + mov v6.16b, v5.16b + mov v5.16b, v4.16b + mov v4.16b, v3.16b + + mov v3.16b, v2.16b + sub v30.4s, v30.4s, v31.4s + mov v2.16b, v1.16b + + movi v18.8b, #0 + cmp x5, #96 + b.gt L256_enc_blocks_more_than_6 + + mov v7.16b, v6.16b + mov v6.16b, v5.16b + cmp x5, #80 + + mov v5.16b, v4.16b + mov v4.16b, v3.16b + mov v3.16b, v1.16b + + sub v30.4s, v30.4s, v31.4s + b.gt L256_enc_blocks_more_than_5 + + mov v7.16b, v6.16b + sub v30.4s, v30.4s, v31.4s + + mov v6.16b, v5.16b + mov v5.16b, v4.16b + + cmp x5, #64 + mov v4.16b, v1.16b + b.gt L256_enc_blocks_more_than_4 + + cmp x5, #48 + mov v7.16b, v6.16b + mov v6.16b, v5.16b + + mov v5.16b, v1.16b + sub v30.4s, v30.4s, v31.4s + b.gt L256_enc_blocks_more_than_3 + + cmp x5, #32 + mov v7.16b, v6.16b + ldr q24, [x3, #96] //load h4k | h3k + + mov v6.16b, v1.16b + sub v30.4s, v30.4s, v31.4s + b.gt L256_enc_blocks_more_than_2 + + mov v7.16b, v1.16b + + sub v30.4s, v30.4s, v31.4s + cmp x5, #16 + b.gt L256_enc_blocks_more_than_1 + + sub v30.4s, v30.4s, v31.4s + ldr q21, [x3, #48] //load h2k | h1k + b L256_enc_blocks_less_than_1 +L256_enc_blocks_more_than_7: //blocks left > 7 + st1 { v9.16b}, [x2], #16 //AES final-7 block - store result + + rev64 v8.16b, v9.16b //GHASH final-7 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ldr q9, [x0], #16 //AES final-6 block - load plaintext + + pmull2 v17.1q, v8.2d, v25.2d //GHASH final-7 block - high + ins v27.d[0], v8.d[1] //GHASH final-7 block - mid + ins v18.d[0], v24.d[1] //GHASH final-7 block - mid + + movi v16.8b, #0 //suppress further partial tag feed in + + eor v27.8b, v27.8b, v8.8b //GHASH final-7 block - mid +.long 0xce017529 //eor3 v9.16b, v9.16b, v1.16b, v29.16b //AES final-6 block - result + + pmull v18.1q, v27.1d, v18.1d //GHASH final-7 block - mid + pmull v19.1q, v8.1d, v25.1d //GHASH final-7 block - low +L256_enc_blocks_more_than_6: //blocks left > 6 + + st1 { v9.16b}, [x2], #16 //AES final-6 block - store result + + rev64 v8.16b, v9.16b //GHASH final-6 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + pmull v26.1q, v8.1d, v23.1d //GHASH final-6 block - low + ins v27.d[0], v8.d[1] //GHASH final-6 block - mid + pmull2 v28.1q, v8.2d, v23.2d //GHASH final-6 block - high + + ldr q9, [x0], #16 //AES final-5 block - load plaintext + + eor v19.16b, v19.16b, v26.16b //GHASH final-6 block - low + + eor v27.8b, v27.8b, v8.8b //GHASH final-6 block - mid + + pmull v27.1q, v27.1d, v24.1d //GHASH final-6 block - mid +.long 0xce027529 //eor3 v9.16b, v9.16b, v2.16b, v29.16b //AES final-5 block - result + + movi v16.8b, #0 //suppress further partial tag feed in + + eor v18.16b, v18.16b, v27.16b //GHASH final-6 block - mid + eor v17.16b, v17.16b, v28.16b //GHASH final-6 block - high +L256_enc_blocks_more_than_5: //blocks left > 5 + + st1 { v9.16b}, [x2], #16 //AES final-5 block - store result + + rev64 v8.16b, v9.16b //GHASH final-5 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-5 block - mid + + pmull2 v28.1q, v8.2d, v22.2d //GHASH final-5 block - high + + eor v17.16b, v17.16b, v28.16b //GHASH final-5 block - high + eor v27.8b, v27.8b, v8.8b //GHASH final-5 block - mid + + ins v27.d[1], v27.d[0] //GHASH final-5 block - mid + + ldr q9, [x0], #16 //AES final-4 block - load plaintext + pmull v26.1q, v8.1d, v22.1d //GHASH final-5 block - low + + pmull2 v27.1q, v27.2d, v21.2d //GHASH final-5 block - mid + movi v16.8b, #0 //suppress further partial tag feed in + eor v19.16b, v19.16b, v26.16b //GHASH final-5 block - low + + eor v18.16b, v18.16b, v27.16b //GHASH final-5 block - mid +.long 0xce037529 //eor3 v9.16b, v9.16b, v3.16b, v29.16b //AES final-4 block - result +L256_enc_blocks_more_than_4: //blocks left > 4 + + st1 { v9.16b}, [x2], #16 //AES final-4 block - store result + + rev64 v8.16b, v9.16b //GHASH final-4 block + + ldr q9, [x0], #16 //AES final-3 block - load plaintext + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-4 block - mid + pmull2 v28.1q, v8.2d, v20.2d //GHASH final-4 block - high + +.long 0xce047529 //eor3 v9.16b, v9.16b, v4.16b, v29.16b //AES final-3 block - result + pmull v26.1q, v8.1d, v20.1d //GHASH final-4 block - low + + eor v27.8b, v27.8b, v8.8b //GHASH final-4 block - mid + eor v19.16b, v19.16b, v26.16b //GHASH final-4 block - low + + pmull v27.1q, v27.1d, v21.1d //GHASH final-4 block - mid + + movi v16.8b, #0 //suppress further partial tag feed in + + eor v18.16b, v18.16b, v27.16b //GHASH final-4 block - mid + eor v17.16b, v17.16b, v28.16b //GHASH final-4 block - high +L256_enc_blocks_more_than_3: //blocks left > 3 + + st1 { v9.16b}, [x2], #16 //AES final-3 block - store result + + ldr q25, [x3, #112] //load h4l | h4h + ext v25.16b, v25.16b, v25.16b, #8 + rev64 v8.16b, v9.16b //GHASH final-3 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-3 block - mid + pmull2 v28.1q, v8.2d, v25.2d //GHASH final-3 block - high + + eor v17.16b, v17.16b, v28.16b //GHASH final-3 block - high + eor v27.8b, v27.8b, v8.8b //GHASH final-3 block - mid + ldr q24, [x3, #96] //load h4k | h3k + + ins v27.d[1], v27.d[0] //GHASH final-3 block - mid + ldr q9, [x0], #16 //AES final-2 block - load plaintext + + pmull2 v27.1q, v27.2d, v24.2d //GHASH final-3 block - mid + pmull v26.1q, v8.1d, v25.1d //GHASH final-3 block - low + +.long 0xce057529 //eor3 v9.16b, v9.16b, v5.16b, v29.16b //AES final-2 block - result + movi v16.8b, #0 //suppress further partial tag feed in + + eor v18.16b, v18.16b, v27.16b //GHASH final-3 block - mid + eor v19.16b, v19.16b, v26.16b //GHASH final-3 block - low +L256_enc_blocks_more_than_2: //blocks left > 2 + + ldr q23, [x3, #80] //load h3l | h3h + ext v23.16b, v23.16b, v23.16b, #8 + + st1 { v9.16b}, [x2], #16 //AES final-2 block - store result + + rev64 v8.16b, v9.16b //GHASH final-2 block + ldr q9, [x0], #16 //AES final-1 block - load plaintext + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-2 block - mid + + movi v16.8b, #0 //suppress further partial tag feed in + + pmull2 v28.1q, v8.2d, v23.2d //GHASH final-2 block - high +.long 0xce067529 //eor3 v9.16b, v9.16b, v6.16b, v29.16b //AES final-1 block - result + + eor v27.8b, v27.8b, v8.8b //GHASH final-2 block - mid + + eor v17.16b, v17.16b, v28.16b //GHASH final-2 block - high + + pmull v27.1q, v27.1d, v24.1d //GHASH final-2 block - mid + pmull v26.1q, v8.1d, v23.1d //GHASH final-2 block - low + + eor v18.16b, v18.16b, v27.16b //GHASH final-2 block - mid + eor v19.16b, v19.16b, v26.16b //GHASH final-2 block - low +L256_enc_blocks_more_than_1: //blocks left > 1 + + st1 { v9.16b}, [x2], #16 //AES final-1 block - store result + + ldr q22, [x3, #64] //load h2l | h2h + ext v22.16b, v22.16b, v22.16b, #8 + rev64 v8.16b, v9.16b //GHASH final-1 block + ldr q9, [x0], #16 //AES final block - load plaintext + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + movi v16.8b, #0 //suppress further partial tag feed in + + ins v27.d[0], v8.d[1] //GHASH final-1 block - mid + pmull2 v28.1q, v8.2d, v22.2d //GHASH final-1 block - high + +.long 0xce077529 //eor3 v9.16b, v9.16b, v7.16b, v29.16b //AES final block - result + eor v17.16b, v17.16b, v28.16b //GHASH final-1 block - high + + pmull v26.1q, v8.1d, v22.1d //GHASH final-1 block - low + eor v27.8b, v27.8b, v8.8b //GHASH final-1 block - mid + + ldr q21, [x3, #48] //load h2k | h1k + + eor v19.16b, v19.16b, v26.16b //GHASH final-1 block - low + ins v27.d[1], v27.d[0] //GHASH final-1 block - mid + + pmull2 v27.1q, v27.2d, v21.2d //GHASH final-1 block - mid + + eor v18.16b, v18.16b, v27.16b //GHASH final-1 block - mid +L256_enc_blocks_less_than_1: //blocks left <= 1 + + and x1, x1, #127 //bit_length %= 128 + + sub x1, x1, #128 //bit_length -= 128 + + neg x1, x1 //bit_length = 128 - #bits in input (in range [1,128]) + + mvn x6, xzr //temp0_x = 0xffffffffffffffff + and x1, x1, #127 //bit_length %= 128 + + lsr x6, x6, x1 //temp0_x is mask for top 64b of last block + cmp x1, #64 + mvn x7, xzr //temp1_x = 0xffffffffffffffff + + csel x14, x6, xzr, lt + csel x13, x7, x6, lt + + mov v0.d[0], x13 //ctr0b is mask for last block + ldr q20, [x3, #32] //load h1l | h1h + ext v20.16b, v20.16b, v20.16b, #8 + + ld1 { v26.16b}, [x2] //load existing bytes where the possibly partial last block is to be stored + mov v0.d[1], x14 + + and v9.16b, v9.16b, v0.16b //possibly partial last block has zeroes in highest bits + + rev64 v8.16b, v9.16b //GHASH final block + + rev32 v30.16b, v30.16b + bif v9.16b, v26.16b, v0.16b //insert existing bytes in top end of result before storing + str q30, [x16] //store the updated counter + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + st1 { v9.16b}, [x2] //store all 16B + + ins v16.d[0], v8.d[1] //GHASH final block - mid + pmull2 v28.1q, v8.2d, v20.2d //GHASH final block - high + pmull v26.1q, v8.1d, v20.1d //GHASH final block - low + + eor v17.16b, v17.16b, v28.16b //GHASH final block - high + eor v19.16b, v19.16b, v26.16b //GHASH final block - low + + eor v16.8b, v16.8b, v8.8b //GHASH final block - mid + + pmull v16.1q, v16.1d, v21.1d //GHASH final block - mid + + eor v18.16b, v18.16b, v16.16b //GHASH final block - mid + ldr d16, [x10] //MODULO - load modulo constant + + ext v21.16b, v17.16b, v17.16b, #8 //MODULO - other top alignment + +.long 0xce114e52 //eor3 v18.16b, v18.16b, v17.16b, v19.16b //MODULO - karatsuba tidy up + pmull v29.1q, v17.1d, v16.1d //MODULO - top 64b align with mid + +.long 0xce1d5652 //eor3 v18.16b, v18.16b, v29.16b, v21.16b //MODULO - fold into mid + + pmull v17.1q, v18.1d, v16.1d //MODULO - mid 64b align with low + ext v21.16b, v18.16b, v18.16b, #8 //MODULO - other mid alignment + +.long 0xce115673 //eor3 v19.16b, v19.16b, v17.16b, v21.16b //MODULO - fold into low + ext v19.16b, v19.16b, v19.16b, #8 + rev64 v19.16b, v19.16b + st1 { v19.16b }, [x3] + mov x0, x9 //return sizes + + ldp d10, d11, [sp, #16] + ldp d12, d13, [sp, #32] + ldp d14, d15, [sp, #48] + ldp d8, d9, [sp], #80 + ret + +L256_enc_ret: + mov w0, #0x0 + ret + +.globl unroll8_eor3_aes_gcm_dec_256_kernel +.def unroll8_eor3_aes_gcm_dec_256_kernel + .type 32 +.endef +.align 4 +unroll8_eor3_aes_gcm_dec_256_kernel: + AARCH64_VALID_CALL_TARGET + cbz x1, L256_dec_ret + stp d8, d9, [sp, #-80]! + lsr x9, x1, #3 + mov x16, x4 + mov x8, x5 + stp d10, d11, [sp, #16] + stp d12, d13, [sp, #32] + stp d14, d15, [sp, #48] + mov x5, #0xc200000000000000 + stp x5, xzr, [sp, #64] + add x10, sp, #64 + + ld1 { v0.16b}, [x16] //CTR block 0 + + mov x15, #0x100000000 //set up counter increment + movi v31.16b, #0x0 + mov v31.d[1], x15 + mov x5, x9 + + sub x5, x5, #1 //byte_len - 1 + + rev32 v30.16b, v0.16b //set up reversed counter + + add v30.4s, v30.4s, v31.4s //CTR block 0 + + rev32 v1.16b, v30.16b //CTR block 1 + add v30.4s, v30.4s, v31.4s //CTR block 1 + + rev32 v2.16b, v30.16b //CTR block 2 + add v30.4s, v30.4s, v31.4s //CTR block 2 + ldp q26, q27, [x8, #0] //load rk0, rk1 + + rev32 v3.16b, v30.16b //CTR block 3 + add v30.4s, v30.4s, v31.4s //CTR block 3 + + rev32 v4.16b, v30.16b //CTR block 4 + add v30.4s, v30.4s, v31.4s //CTR block 4 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 0 + + rev32 v5.16b, v30.16b //CTR block 5 + add v30.4s, v30.4s, v31.4s //CTR block 5 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 0 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 0 + + rev32 v6.16b, v30.16b //CTR block 6 + add v30.4s, v30.4s, v31.4s //CTR block 6 + + rev32 v7.16b, v30.16b //CTR block 7 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 0 + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 0 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 0 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 0 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 0 + ldp q28, q26, [x8, #32] //load rk2, rk3 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 1 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 1 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 1 + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 1 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 1 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 1 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 1 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 1 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 2 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 2 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 6 - round 2 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 2 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 7 - round 2 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 5 - round 2 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 2 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 4 - round 2 + ldp q27, q28, [x8, #64] //load rk4, rk5 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 3 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 3 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 3 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 3 + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 3 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 3 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 3 + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 3 + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 4 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 4 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 4 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 4 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 4 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 4 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 4 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 4 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 5 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 6 - round 5 + + ldp q26, q27, [x8, #96] //load rk6, rk7 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 4 - round 5 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 7 - round 5 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 5 - round 5 + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 5 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 5 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 5 + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 6 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 6 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 6 + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 6 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 6 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 6 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 6 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 6 + ldp q28, q26, [x8, #128] //load rk8, rk9 + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 7 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 7 + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 7 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 7 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 7 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 7 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 7 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 7 + + and x5, x5, #0xffffffffffffff80 //number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 7 - round 8 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 5 - round 8 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 8 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 8 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 8 + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 4 - round 8 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 8 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 6 - round 8 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 9 + + ld1 { v19.16b}, [x3] + ext v19.16b, v19.16b, v19.16b, #8 + rev64 v19.16b, v19.16b + ldp q27, q28, [x8, #160] //load rk10, rk11 + add x4, x0, x1, lsr #3 //end_input_ptr + add x5, x5, x0 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 9 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 9 + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 9 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 9 + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 9 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 9 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 9 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 4 - round 10 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 7 - round 10 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 5 - round 10 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 10 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 10 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 10 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 6 - round 10 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 10 + ldp q26, q27, [x8, #192] //load rk12, rk13 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 11 + add v30.4s, v30.4s, v31.4s //CTR block 7 + + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 7 - round 11 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 11 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 11 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 5 - round 11 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 4 - round 11 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 11 + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 6 - round 11 + ldr q28, [x8, #224] //load rk14 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 12 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 4 - round 12 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 5 - round 12 + + cmp x0, x5 //check if we have <= 8 blocks + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 12 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 12 + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 6 - round 12 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 12 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 7 - round 12 + + aese v5.16b, v27.16b //AES block 5 - round 13 + aese v1.16b, v27.16b //AES block 1 - round 13 + aese v2.16b, v27.16b //AES block 2 - round 13 + + aese v0.16b, v27.16b //AES block 0 - round 13 + aese v4.16b, v27.16b //AES block 4 - round 13 + aese v6.16b, v27.16b //AES block 6 - round 13 + + aese v3.16b, v27.16b //AES block 3 - round 13 + aese v7.16b, v27.16b //AES block 7 - round 13 + b.ge L256_dec_tail //handle tail + + ldp q8, q9, [x0], #32 //AES block 0, 1 - load ciphertext + + ldp q10, q11, [x0], #32 //AES block 2, 3 - load ciphertext + + ldp q12, q13, [x0], #32 //AES block 4, 5 - load ciphertext + + ldp q14, q15, [x0], #32 //AES block 6, 7 - load ciphertext + cmp x0, x5 //check if we have <= 8 blocks + +.long 0xce017121 //eor3 v1.16b, v9.16b, v1.16b, v28.16b //AES block 1 - result +.long 0xce007100 //eor3 v0.16b, v8.16b, v0.16b, v28.16b //AES block 0 - result + stp q0, q1, [x2], #32 //AES block 0, 1 - store result + + rev32 v0.16b, v30.16b //CTR block 8 + add v30.4s, v30.4s, v31.4s //CTR block 8 +.long 0xce037163 //eor3 v3.16b, v11.16b, v3.16b, v28.16b //AES block 3 - result + +.long 0xce0571a5 //eor3 v5.16b, v13.16b, v5.16b, v28.16b //AES block 5 - result + +.long 0xce047184 //eor3 v4.16b, v12.16b, v4.16b, v28.16b //AES block 4 - result + rev32 v1.16b, v30.16b //CTR block 9 + add v30.4s, v30.4s, v31.4s //CTR block 9 + +.long 0xce027142 //eor3 v2.16b, v10.16b, v2.16b, v28.16b //AES block 2 - result + stp q2, q3, [x2], #32 //AES block 2, 3 - store result + + rev32 v2.16b, v30.16b //CTR block 10 + add v30.4s, v30.4s, v31.4s //CTR block 10 + +.long 0xce0671c6 //eor3 v6.16b, v14.16b, v6.16b, v28.16b //AES block 6 - result + + rev32 v3.16b, v30.16b //CTR block 11 + add v30.4s, v30.4s, v31.4s //CTR block 11 + stp q4, q5, [x2], #32 //AES block 4, 5 - store result + +.long 0xce0771e7 //eor3 v7.16b, v15.16b, v7.16b, v28.16b //AES block 7 - result + stp q6, q7, [x2], #32 //AES block 6, 7 - store result + + rev32 v4.16b, v30.16b //CTR block 12 + add v30.4s, v30.4s, v31.4s //CTR block 12 + b.ge L256_dec_prepretail //do prepretail + +L256_dec_main_loop: //main loop start + rev32 v5.16b, v30.16b //CTR block 8k+13 + ldp q26, q27, [x8, #0] //load rk0, rk1 + add v30.4s, v30.4s, v31.4s //CTR block 8k+13 + + rev64 v9.16b, v9.16b //GHASH block 8k+1 + ldr q23, [x3, #176] //load h7l | h7h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #208] //load h8l | h8h + ext v25.16b, v25.16b, v25.16b, #8 + + rev32 v6.16b, v30.16b //CTR block 8k+14 + add v30.4s, v30.4s, v31.4s //CTR block 8k+14 + rev64 v8.16b, v8.16b //GHASH block 8k + + ext v19.16b, v19.16b, v19.16b, #8 //PRE 0 + rev64 v12.16b, v12.16b //GHASH block 8k+4 + rev64 v11.16b, v11.16b //GHASH block 8k+3 + + rev32 v7.16b, v30.16b //CTR block 8k+15 + rev64 v15.16b, v15.16b //GHASH block 8k+7 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 0 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 0 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 0 + + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 0 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 0 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 0 + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 0 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 0 + ldp q28, q26, [x8, #32] //load rk2, rk3 + + eor v8.16b, v8.16b, v19.16b //PRE 1 + ldr q20, [x3, #128] //load h5l | h5h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #160] //load h6l | h6h + ext v22.16b, v22.16b, v22.16b, #8 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 1 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 1 + rev64 v10.16b, v10.16b //GHASH block 8k+2 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 1 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 1 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 1 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 1 + + trn1 v18.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 1 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 1 + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 2 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 2 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 2 + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 2 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 2 + pmull v19.1q, v8.1d, v25.1d //GHASH block 8k - low + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 2 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 2 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 2 + + ldp q27, q28, [x8, #64] //load rk4, rk5 + pmull2 v29.1q, v10.2d, v22.2d //GHASH block 8k+2 - high + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 3 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 3 + pmull2 v16.1q, v9.2d, v23.2d //GHASH block 8k+1 - high + pmull v23.1q, v9.1d, v23.1d //GHASH block 8k+1 - low + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 3 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 3 + pmull2 v17.1q, v8.2d, v25.2d //GHASH block 8k - high + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 3 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 3 + trn2 v8.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + + pmull2 v9.1q, v11.2d, v20.2d //GHASH block 8k+3 - high + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 3 + eor v17.16b, v17.16b, v16.16b //GHASH block 8k+1 - high + + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 4 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 3 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 4 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 4 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 4 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 4 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 4 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 4 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 4 + + ldr q21, [x3, #144] //load h6k | h5k + ldr q24, [x3, #192] //load h8k | h7k + eor v8.16b, v8.16b, v18.16b //GHASH block 8k, 8k+1 - mid + pmull v22.1q, v10.1d, v22.1d //GHASH block 8k+2 - low + + ldp q26, q27, [x8, #96] //load rk6, rk7 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 5 + eor v19.16b, v19.16b, v23.16b //GHASH block 8k+1 - low + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 5 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 5 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 5 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 5 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 5 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 5 + +.long 0xce1d2631 //eor3 v17.16b, v17.16b, v29.16b, v9.16b //GHASH block 8k+2, 8k+3 - high + trn1 v29.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + rev64 v13.16b, v13.16b //GHASH block 8k+5 + + pmull2 v18.1q, v8.2d, v24.2d //GHASH block 8k - mid + pmull v24.1q, v8.1d, v24.1d //GHASH block 8k+1 - mid + trn2 v10.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 6 + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 6 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 5 + + trn1 v16.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 6 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 6 + + eor v10.16b, v10.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + pmull v20.1q, v11.1d, v20.1d //GHASH block 8k+3 - low + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 6 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 6 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 6 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 6 + + pmull2 v29.1q, v10.2d, v21.2d //GHASH block 8k+2 - mid + pmull v21.1q, v10.1d, v21.1d //GHASH block 8k+3 - mid +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+2, 8k+3 - low + + ldr q23, [x3, #80] //load h3l | h3h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #112] //load h4l | h4h + ext v25.16b, v25.16b, v25.16b, #8 + rev64 v14.16b, v14.16b //GHASH block 8k+6 + eor v18.16b, v18.16b, v24.16b //GHASH block 8k+1 - mid + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 7 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 7 + ldp q28, q26, [x8, #128] //load rk8, rk9 + + ldr q20, [x3, #32] //load h1l | h1h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #64] //load h2l | h2h + ext v22.16b, v22.16b, v22.16b, #8 +.long 0xce157652 //eor3 v18.16b, v18.16b, v21.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 7 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 7 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 7 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 7 + + ldr q21, [x3, #48] //load h2k | h1k + ldr q24, [x3, #96] //load h4k | h3k + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 7 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 7 + + pmull2 v8.1q, v12.2d, v25.2d //GHASH block 8k+4 - high + pmull v25.1q, v12.1d, v25.1d //GHASH block 8k+4 - low + trn2 v12.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 8 + pmull2 v10.1q, v13.2d, v23.2d //GHASH block 8k+5 - high + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 8 + + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 8 + pmull v23.1q, v13.1d, v23.1d //GHASH block 8k+5 - low + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 8 + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 8 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 8 + pmull2 v11.1q, v14.2d, v22.2d //GHASH block 8k+6 - high + + trn1 v13.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 8 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 8 + + ldp q27, q28, [x8, #160] //load rk10, rk11 + pmull v22.1q, v14.1d, v22.1d //GHASH block 8k+6 - low + trn2 v14.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + + add v30.4s, v30.4s, v31.4s //CTR block 8k+15 +.long 0xce082a31 //eor3 v17.16b, v17.16b, v8.16b, v10.16b //GHASH block 8k+4, 8k+5 - high + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 9 + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 9 + eor v14.16b, v14.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 9 + + ldp q8, q9, [x0], #32 //AES block 8k+8, 8k+9 - load ciphertext + eor v12.16b, v12.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 9 + + pmull2 v13.1q, v14.2d, v21.2d //GHASH block 8k+6 - mid + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 9 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 9 + + pmull2 v16.1q, v12.2d, v24.2d //GHASH block 8k+4 - mid + pmull v24.1q, v12.1d, v24.1d //GHASH block 8k+5 - mid + pmull2 v12.1q, v15.2d, v20.2d //GHASH block 8k+7 - high + + pmull v20.1q, v15.1d, v20.1d //GHASH block 8k+7 - low + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 10 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 10 + + pmull v21.1q, v14.1d, v21.1d //GHASH block 8k+7 - mid + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 9 +.long 0xce195e73 //eor3 v19.16b, v19.16b, v25.16b, v23.16b //GHASH block 8k+4, 8k+5 - low + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 9 +.long 0xce184252 //eor3 v18.16b, v18.16b, v24.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid +.long 0xce0b3231 //eor3 v17.16b, v17.16b, v11.16b, v12.16b //GHASH block 8k+6, 8k+7 - high + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 10 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 10 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 10 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 10 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 10 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 10 + +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+6, 8k+7 - low + rev32 v20.16b, v30.16b //CTR block 8k+16 + ldr d16, [x10] //MODULO - load modulo constant + + add v30.4s, v30.4s, v31.4s //CTR block 8k+16 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 11 + ldp q26, q27, [x8, #192] //load rk12, rk13 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 11 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 11 + +.long 0xce153652 //eor3 v18.16b, v18.16b, v21.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + rev32 v22.16b, v30.16b //CTR block 8k+17 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 11 + + ldp q10, q11, [x0], #32 //AES block 8k+10, 8k+11 - load ciphertext + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 11 + ext v21.16b, v17.16b, v17.16b, #8 //MODULO - other top alignment + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 11 + add v30.4s, v30.4s, v31.4s //CTR block 8k+17 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 11 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 12 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 12 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 12 + + rev32 v23.16b, v30.16b //CTR block 8k+18 + add v30.4s, v30.4s, v31.4s //CTR block 8k+18 + pmull v29.1q, v17.1d, v16.1d //MODULO - top 64b align with mid + +.long 0xce114e52 //eor3 v18.16b, v18.16b, v17.16b, v19.16b //MODULO - karatsuba tidy up + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 12 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 11 + + ldr q28, [x8, #224] //load rk14 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 12 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 12 + +.long 0xce1d5652 //eor3 v18.16b, v18.16b, v29.16b, v21.16b //MODULO - fold into mid + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 12 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 12 + + ldp q12, q13, [x0], #32 //AES block 8k+12, 8k+13 - load ciphertext + aese v1.16b, v27.16b //AES block 8k+9 - round 13 + aese v2.16b, v27.16b //AES block 8k+10 - round 13 + + ldp q14, q15, [x0], #32 //AES block 8k+14, 8k+15 - load ciphertext + aese v0.16b, v27.16b //AES block 8k+8 - round 13 + aese v5.16b, v27.16b //AES block 8k+13 - round 13 + + rev32 v25.16b, v30.16b //CTR block 8k+19 +.long 0xce027142 //eor3 v2.16b, v10.16b, v2.16b, v28.16b //AES block 8k+10 - result +.long 0xce017121 //eor3 v1.16b, v9.16b, v1.16b, v28.16b //AES block 8k+9 - result + + ext v21.16b, v18.16b, v18.16b, #8 //MODULO - other mid alignment + aese v7.16b, v27.16b //AES block 8k+15 - round 13 + + add v30.4s, v30.4s, v31.4s //CTR block 8k+19 + pmull v17.1q, v18.1d, v16.1d //MODULO - mid 64b align with low + aese v4.16b, v27.16b //AES block 8k+12 - round 13 + +.long 0xce0571a5 //eor3 v5.16b, v13.16b, v5.16b, v28.16b //AES block 8k+13 - result +.long 0xce007100 //eor3 v0.16b, v8.16b, v0.16b, v28.16b //AES block 8k+8 - result + aese v3.16b, v27.16b //AES block 8k+11 - round 13 + + stp q0, q1, [x2], #32 //AES block 8k+8, 8k+9 - store result + mov v0.16b, v20.16b //CTR block 8k+16 +.long 0xce047184 //eor3 v4.16b, v12.16b, v4.16b, v28.16b //AES block 8k+12 - result + +.long 0xce154673 //eor3 v19.16b, v19.16b, v21.16b, v17.16b //MODULO - fold into low +.long 0xce037163 //eor3 v3.16b, v11.16b, v3.16b, v28.16b //AES block 8k+11 - result + stp q2, q3, [x2], #32 //AES block 8k+10, 8k+11 - store result + + mov v3.16b, v25.16b //CTR block 8k+19 + mov v2.16b, v23.16b //CTR block 8k+18 + aese v6.16b, v27.16b //AES block 8k+14 - round 13 + + mov v1.16b, v22.16b //CTR block 8k+17 + stp q4, q5, [x2], #32 //AES block 8k+12, 8k+13 - store result +.long 0xce0771e7 //eor3 v7.16b, v15.16b, v7.16b, v28.16b //AES block 8k+15 - result + +.long 0xce0671c6 //eor3 v6.16b, v14.16b, v6.16b, v28.16b //AES block 8k+14 - result + rev32 v4.16b, v30.16b //CTR block 8k+20 + add v30.4s, v30.4s, v31.4s //CTR block 8k+20 + + cmp x0, x5 //LOOP CONTROL + stp q6, q7, [x2], #32 //AES block 8k+14, 8k+15 - store result + b.lt L256_dec_main_loop + +L256_dec_prepretail: //PREPRETAIL + ldp q26, q27, [x8, #0] //load rk0, rk1 + rev32 v5.16b, v30.16b //CTR block 8k+13 + add v30.4s, v30.4s, v31.4s //CTR block 8k+13 + + rev64 v12.16b, v12.16b //GHASH block 8k+4 + ldr q21, [x3, #144] //load h6k | h5k + ldr q24, [x3, #192] //load h8k | h7k + + rev32 v6.16b, v30.16b //CTR block 8k+14 + rev64 v8.16b, v8.16b //GHASH block 8k + add v30.4s, v30.4s, v31.4s //CTR block 8k+14 + + ext v19.16b, v19.16b, v19.16b, #8 //PRE 0 + ldr q23, [x3, #176] //load h7l | h7h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #208] //load h8l | h8h + ext v25.16b, v25.16b, v25.16b, #8 + rev64 v9.16b, v9.16b //GHASH block 8k+1 + + rev32 v7.16b, v30.16b //CTR block 8k+15 + rev64 v10.16b, v10.16b //GHASH block 8k+2 + ldr q20, [x3, #128] //load h5l | h5h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #160] //load h6l | h6h + ext v22.16b, v22.16b, v22.16b, #8 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 0 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 0 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 0 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 0 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 0 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 0 + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 1 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 0 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 0 + + ldp q28, q26, [x8, #32] //load rk2, rk3 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 1 + eor v8.16b, v8.16b, v19.16b //PRE 1 + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 1 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 1 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 1 + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 1 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 1 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 1 + + pmull2 v16.1q, v9.2d, v23.2d //GHASH block 8k+1 - high + trn1 v18.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + pmull v19.1q, v8.1d, v25.1d //GHASH block 8k - low + + rev64 v11.16b, v11.16b //GHASH block 8k+3 + pmull v23.1q, v9.1d, v23.1d //GHASH block 8k+1 - low + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 2 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 2 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 2 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 2 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 2 + pmull2 v17.1q, v8.2d, v25.2d //GHASH block 8k - high + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 2 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 3 + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 3 + rev64 v14.16b, v14.16b //GHASH block 8k+6 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 3 + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 2 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 3 + + pmull2 v29.1q, v10.2d, v22.2d //GHASH block 8k+2 - high + trn2 v8.2d, v9.2d, v8.2d //GHASH block 8k, 8k+1 - mid + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 2 + + ldp q27, q28, [x8, #64] //load rk4, rk5 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 3 + pmull2 v9.1q, v11.2d, v20.2d //GHASH block 8k+3 - high + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 3 + eor v17.16b, v17.16b, v16.16b //GHASH block 8k+1 - high + eor v8.16b, v8.16b, v18.16b //GHASH block 8k, 8k+1 - mid + + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 3 + pmull v22.1q, v10.1d, v22.1d //GHASH block 8k+2 - low + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 3 + +.long 0xce1d2631 //eor3 v17.16b, v17.16b, v29.16b, v9.16b //GHASH block 8k+2, 8k+3 - high + trn1 v29.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + trn2 v10.2d, v11.2d, v10.2d //GHASH block 8k+2, 8k+3 - mid + + pmull2 v18.1q, v8.2d, v24.2d //GHASH block 8k - mid + pmull v20.1q, v11.1d, v20.1d //GHASH block 8k+3 - low + eor v19.16b, v19.16b, v23.16b //GHASH block 8k+1 - low + + pmull v24.1q, v8.1d, v24.1d //GHASH block 8k+1 - mid + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 4 + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 4 + +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+2, 8k+3 - low + ldr q20, [x3, #32] //load h1l | h1h + ext v20.16b, v20.16b, v20.16b, #8 + ldr q22, [x3, #64] //load h2l | h2h + ext v22.16b, v22.16b, v22.16b, #8 + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 4 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 4 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 4 + eor v18.16b, v18.16b, v24.16b //GHASH block 8k+1 - mid + + eor v10.16b, v10.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 5 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 4 + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 5 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 4 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 4 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 5 + pmull2 v29.1q, v10.2d, v21.2d //GHASH block 8k+2 - mid + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 5 + + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 5 + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 5 + pmull v21.1q, v10.1d, v21.1d //GHASH block 8k+3 - mid + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 5 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 5 + ldp q26, q27, [x8, #96] //load rk6, rk7 + + ldr q23, [x3, #80] //load h3l | h3h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q25, [x3, #112] //load h4l | h4h + ext v25.16b, v25.16b, v25.16b, #8 + rev64 v15.16b, v15.16b //GHASH block 8k+7 + rev64 v13.16b, v13.16b //GHASH block 8k+5 + +.long 0xce157652 //eor3 v18.16b, v18.16b, v21.16b, v29.16b //GHASH block 8k+2, 8k+3 - mid + + trn1 v16.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 6 + ldr q21, [x3, #48] //load h2k | h1k + ldr q24, [x3, #96] //load h4k | h3k + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 6 + + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 6 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 6 + + pmull2 v8.1q, v12.2d, v25.2d //GHASH block 8k+4 - high + pmull2 v10.1q, v13.2d, v23.2d //GHASH block 8k+5 - high + pmull v25.1q, v12.1d, v25.1d //GHASH block 8k+4 - low + + trn2 v12.2d, v13.2d, v12.2d //GHASH block 8k+4, 8k+5 - mid + pmull v23.1q, v13.1d, v23.1d //GHASH block 8k+5 - low + trn1 v13.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 7 + pmull2 v11.1q, v14.2d, v22.2d //GHASH block 8k+6 - high + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 6 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 6 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 6 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 6 + + ldp q28, q26, [x8, #128] //load rk8, rk9 + pmull v22.1q, v14.1d, v22.1d //GHASH block 8k+6 - low + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 7 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 7 + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 7 + + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 7 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 7 +.long 0xce082a31 //eor3 v17.16b, v17.16b, v8.16b, v10.16b //GHASH block 8k+4, 8k+5 - high + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 7 + trn2 v14.2d, v15.2d, v14.2d //GHASH block 8k+6, 8k+7 - mid + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 7 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 8 + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 8 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 8 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 8 + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 8 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 8 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 8 + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 9 + eor v12.16b, v12.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 9 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 9 + eor v14.16b, v14.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 9 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 9 + pmull2 v16.1q, v12.2d, v24.2d //GHASH block 8k+4 - mid + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 8 + pmull v24.1q, v12.1d, v24.1d //GHASH block 8k+5 - mid + pmull2 v12.1q, v15.2d, v20.2d //GHASH block 8k+7 - high + + pmull2 v13.1q, v14.2d, v21.2d //GHASH block 8k+6 - mid + pmull v21.1q, v14.1d, v21.1d //GHASH block 8k+7 - mid + pmull v20.1q, v15.1d, v20.1d //GHASH block 8k+7 - low + + ldp q27, q28, [x8, #160] //load rk10, rk11 +.long 0xce195e73 //eor3 v19.16b, v19.16b, v25.16b, v23.16b //GHASH block 8k+4, 8k+5 - low +.long 0xce184252 //eor3 v18.16b, v18.16b, v24.16b, v16.16b //GHASH block 8k+4, 8k+5 - mid + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 9 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 9 + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 9 + +.long 0xce0b3231 //eor3 v17.16b, v17.16b, v11.16b, v12.16b //GHASH block 8k+6, 8k+7 - high +.long 0xce165273 //eor3 v19.16b, v19.16b, v22.16b, v20.16b //GHASH block 8k+6, 8k+7 - low + ldr d16, [x10] //MODULO - load modulo constant + +.long 0xce153652 //eor3 v18.16b, v18.16b, v21.16b, v13.16b //GHASH block 8k+6, 8k+7 - mid + + aese v4.16b, v27.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 10 + aese v6.16b, v27.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 10 + aese v5.16b, v27.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 10 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 10 + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 10 + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 10 + +.long 0xce114e52 //eor3 v18.16b, v18.16b, v17.16b, v19.16b //MODULO - karatsuba tidy up + + aese v7.16b, v27.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 10 + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 10 + ldp q26, q27, [x8, #192] //load rk12, rk13 + + ext v21.16b, v17.16b, v17.16b, #8 //MODULO - other top alignment + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 11 + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 11 + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 11 + + pmull v29.1q, v17.1d, v16.1d //MODULO - top 64b align with mid + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 11 + + aese v7.16b, v28.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 11 + aese v6.16b, v28.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 11 + aese v4.16b, v28.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 11 + + aese v5.16b, v28.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 11 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 8k+11 - round 12 + +.long 0xce1d5652 //eor3 v18.16b, v18.16b, v29.16b, v21.16b //MODULO - fold into mid + + aese v3.16b, v27.16b //AES block 8k+11 - round 13 + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 8k+10 - round 12 + aese v6.16b, v26.16b + aesmc v6.16b, v6.16b //AES block 8k+14 - round 12 + + pmull v17.1q, v18.1d, v16.1d //MODULO - mid 64b align with low + aese v4.16b, v26.16b + aesmc v4.16b, v4.16b //AES block 8k+12 - round 12 + aese v7.16b, v26.16b + aesmc v7.16b, v7.16b //AES block 8k+15 - round 12 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 8k+8 - round 12 + ldr q28, [x8, #224] //load rk14 + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 8k+9 - round 12 + + aese v4.16b, v27.16b //AES block 8k+12 - round 13 + ext v21.16b, v18.16b, v18.16b, #8 //MODULO - other mid alignment + aese v5.16b, v26.16b + aesmc v5.16b, v5.16b //AES block 8k+13 - round 12 + + aese v6.16b, v27.16b //AES block 8k+14 - round 13 + aese v2.16b, v27.16b //AES block 8k+10 - round 13 + aese v1.16b, v27.16b //AES block 8k+9 - round 13 + + aese v5.16b, v27.16b //AES block 8k+13 - round 13 +.long 0xce154673 //eor3 v19.16b, v19.16b, v21.16b, v17.16b //MODULO - fold into low + add v30.4s, v30.4s, v31.4s //CTR block 8k+15 + + aese v7.16b, v27.16b //AES block 8k+15 - round 13 + aese v0.16b, v27.16b //AES block 8k+8 - round 13 +L256_dec_tail: //TAIL + + ext v16.16b, v19.16b, v19.16b, #8 //prepare final partial tag + sub x5, x4, x0 //main_end_input_ptr is number of bytes left to process + cmp x5, #112 + + ldr q9, [x0], #16 //AES block 8k+8 - load ciphertext + + ldp q24, q25, [x3, #192] //load h8k | h7k + ext v25.16b, v25.16b, v25.16b, #8 + mov v29.16b, v28.16b + + ldp q20, q21, [x3, #128] //load h5l | h5h + ext v20.16b, v20.16b, v20.16b, #8 + +.long 0xce00752c //eor3 v12.16b, v9.16b, v0.16b, v29.16b //AES block 8k+8 - result + ldp q22, q23, [x3, #160] //load h6l | h6h + ext v22.16b, v22.16b, v22.16b, #8 + ext v23.16b, v23.16b, v23.16b, #8 + b.gt L256_dec_blocks_more_than_7 + + mov v7.16b, v6.16b + sub v30.4s, v30.4s, v31.4s + mov v6.16b, v5.16b + + mov v5.16b, v4.16b + mov v4.16b, v3.16b + movi v19.8b, #0 + + movi v17.8b, #0 + movi v18.8b, #0 + mov v3.16b, v2.16b + + cmp x5, #96 + mov v2.16b, v1.16b + b.gt L256_dec_blocks_more_than_6 + + mov v7.16b, v6.16b + mov v6.16b, v5.16b + + mov v5.16b, v4.16b + cmp x5, #80 + sub v30.4s, v30.4s, v31.4s + + mov v4.16b, v3.16b + mov v3.16b, v1.16b + b.gt L256_dec_blocks_more_than_5 + + cmp x5, #64 + mov v7.16b, v6.16b + sub v30.4s, v30.4s, v31.4s + + mov v6.16b, v5.16b + + mov v5.16b, v4.16b + mov v4.16b, v1.16b + b.gt L256_dec_blocks_more_than_4 + + sub v30.4s, v30.4s, v31.4s + mov v7.16b, v6.16b + cmp x5, #48 + + mov v6.16b, v5.16b + mov v5.16b, v1.16b + b.gt L256_dec_blocks_more_than_3 + + ldr q24, [x3, #96] //load h4k | h3k + sub v30.4s, v30.4s, v31.4s + mov v7.16b, v6.16b + + cmp x5, #32 + mov v6.16b, v1.16b + b.gt L256_dec_blocks_more_than_2 + + sub v30.4s, v30.4s, v31.4s + + mov v7.16b, v1.16b + cmp x5, #16 + b.gt L256_dec_blocks_more_than_1 + + sub v30.4s, v30.4s, v31.4s + ldr q21, [x3, #48] //load h2k | h1k + b L256_dec_blocks_less_than_1 +L256_dec_blocks_more_than_7: //blocks left > 7 + rev64 v8.16b, v9.16b //GHASH final-7 block + ldr q9, [x0], #16 //AES final-6 block - load ciphertext + st1 { v12.16b}, [x2], #16 //AES final-7 block - store result + + ins v18.d[0], v24.d[1] //GHASH final-7 block - mid + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-7 block - mid +.long 0xce01752c //eor3 v12.16b, v9.16b, v1.16b, v29.16b //AES final-6 block - result + + pmull2 v17.1q, v8.2d, v25.2d //GHASH final-7 block - high + + eor v27.8b, v27.8b, v8.8b //GHASH final-7 block - mid + movi v16.8b, #0 //suppress further partial tag feed in + + pmull v19.1q, v8.1d, v25.1d //GHASH final-7 block - low + pmull v18.1q, v27.1d, v18.1d //GHASH final-7 block - mid +L256_dec_blocks_more_than_6: //blocks left > 6 + + rev64 v8.16b, v9.16b //GHASH final-6 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + ldr q9, [x0], #16 //AES final-5 block - load ciphertext + movi v16.8b, #0 //suppress further partial tag feed in + + ins v27.d[0], v8.d[1] //GHASH final-6 block - mid + st1 { v12.16b}, [x2], #16 //AES final-6 block - store result + pmull2 v28.1q, v8.2d, v23.2d //GHASH final-6 block - high + + pmull v26.1q, v8.1d, v23.1d //GHASH final-6 block - low + +.long 0xce02752c //eor3 v12.16b, v9.16b, v2.16b, v29.16b //AES final-5 block - result + eor v19.16b, v19.16b, v26.16b //GHASH final-6 block - low + eor v27.8b, v27.8b, v8.8b //GHASH final-6 block - mid + + pmull v27.1q, v27.1d, v24.1d //GHASH final-6 block - mid + + eor v18.16b, v18.16b, v27.16b //GHASH final-6 block - mid + eor v17.16b, v17.16b, v28.16b //GHASH final-6 block - high +L256_dec_blocks_more_than_5: //blocks left > 5 + + rev64 v8.16b, v9.16b //GHASH final-5 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + pmull2 v28.1q, v8.2d, v22.2d //GHASH final-5 block - high + ins v27.d[0], v8.d[1] //GHASH final-5 block - mid + + ldr q9, [x0], #16 //AES final-4 block - load ciphertext + + eor v27.8b, v27.8b, v8.8b //GHASH final-5 block - mid + st1 { v12.16b}, [x2], #16 //AES final-5 block - store result + + pmull v26.1q, v8.1d, v22.1d //GHASH final-5 block - low + ins v27.d[1], v27.d[0] //GHASH final-5 block - mid + + pmull2 v27.1q, v27.2d, v21.2d //GHASH final-5 block - mid + + eor v17.16b, v17.16b, v28.16b //GHASH final-5 block - high +.long 0xce03752c //eor3 v12.16b, v9.16b, v3.16b, v29.16b //AES final-4 block - result + eor v19.16b, v19.16b, v26.16b //GHASH final-5 block - low + + eor v18.16b, v18.16b, v27.16b //GHASH final-5 block - mid + movi v16.8b, #0 //suppress further partial tag feed in +L256_dec_blocks_more_than_4: //blocks left > 4 + + rev64 v8.16b, v9.16b //GHASH final-4 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-4 block - mid + ldr q9, [x0], #16 //AES final-3 block - load ciphertext + + movi v16.8b, #0 //suppress further partial tag feed in + + pmull v26.1q, v8.1d, v20.1d //GHASH final-4 block - low + pmull2 v28.1q, v8.2d, v20.2d //GHASH final-4 block - high + + eor v27.8b, v27.8b, v8.8b //GHASH final-4 block - mid + + eor v17.16b, v17.16b, v28.16b //GHASH final-4 block - high + + pmull v27.1q, v27.1d, v21.1d //GHASH final-4 block - mid + + eor v19.16b, v19.16b, v26.16b //GHASH final-4 block - low + st1 { v12.16b}, [x2], #16 //AES final-4 block - store result + + eor v18.16b, v18.16b, v27.16b //GHASH final-4 block - mid +.long 0xce04752c //eor3 v12.16b, v9.16b, v4.16b, v29.16b //AES final-3 block - result +L256_dec_blocks_more_than_3: //blocks left > 3 + + ldr q25, [x3, #112] //load h4l | h4h + ext v25.16b, v25.16b, v25.16b, #8 + rev64 v8.16b, v9.16b //GHASH final-3 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + ldr q9, [x0], #16 //AES final-2 block - load ciphertext + ldr q24, [x3, #96] //load h4k | h3k + + ins v27.d[0], v8.d[1] //GHASH final-3 block - mid + st1 { v12.16b}, [x2], #16 //AES final-3 block - store result + +.long 0xce05752c //eor3 v12.16b, v9.16b, v5.16b, v29.16b //AES final-2 block - result + + eor v27.8b, v27.8b, v8.8b //GHASH final-3 block - mid + + ins v27.d[1], v27.d[0] //GHASH final-3 block - mid + pmull v26.1q, v8.1d, v25.1d //GHASH final-3 block - low + pmull2 v28.1q, v8.2d, v25.2d //GHASH final-3 block - high + + movi v16.8b, #0 //suppress further partial tag feed in + pmull2 v27.1q, v27.2d, v24.2d //GHASH final-3 block - mid + eor v19.16b, v19.16b, v26.16b //GHASH final-3 block - low + + eor v17.16b, v17.16b, v28.16b //GHASH final-3 block - high + + eor v18.16b, v18.16b, v27.16b //GHASH final-3 block - mid +L256_dec_blocks_more_than_2: //blocks left > 2 + + rev64 v8.16b, v9.16b //GHASH final-2 block + + ldr q23, [x3, #80] //load h3l | h3h + ext v23.16b, v23.16b, v23.16b, #8 + ldr q9, [x0], #16 //AES final-1 block - load ciphertext + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-2 block - mid + + pmull v26.1q, v8.1d, v23.1d //GHASH final-2 block - low + st1 { v12.16b}, [x2], #16 //AES final-2 block - store result +.long 0xce06752c //eor3 v12.16b, v9.16b, v6.16b, v29.16b //AES final-1 block - result + + eor v27.8b, v27.8b, v8.8b //GHASH final-2 block - mid + eor v19.16b, v19.16b, v26.16b //GHASH final-2 block - low + movi v16.8b, #0 //suppress further partial tag feed in + + pmull v27.1q, v27.1d, v24.1d //GHASH final-2 block - mid + pmull2 v28.1q, v8.2d, v23.2d //GHASH final-2 block - high + + eor v18.16b, v18.16b, v27.16b //GHASH final-2 block - mid + eor v17.16b, v17.16b, v28.16b //GHASH final-2 block - high +L256_dec_blocks_more_than_1: //blocks left > 1 + + rev64 v8.16b, v9.16b //GHASH final-1 block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v27.d[0], v8.d[1] //GHASH final-1 block - mid + ldr q22, [x3, #64] //load h2l | h2h + ext v22.16b, v22.16b, v22.16b, #8 + + eor v27.8b, v27.8b, v8.8b //GHASH final-1 block - mid + ldr q9, [x0], #16 //AES final block - load ciphertext + st1 { v12.16b}, [x2], #16 //AES final-1 block - store result + + ldr q21, [x3, #48] //load h2k | h1k + pmull v26.1q, v8.1d, v22.1d //GHASH final-1 block - low + + ins v27.d[1], v27.d[0] //GHASH final-1 block - mid + + eor v19.16b, v19.16b, v26.16b //GHASH final-1 block - low + +.long 0xce07752c //eor3 v12.16b, v9.16b, v7.16b, v29.16b //AES final block - result + pmull2 v28.1q, v8.2d, v22.2d //GHASH final-1 block - high + + pmull2 v27.1q, v27.2d, v21.2d //GHASH final-1 block - mid + + movi v16.8b, #0 //suppress further partial tag feed in + eor v17.16b, v17.16b, v28.16b //GHASH final-1 block - high + + eor v18.16b, v18.16b, v27.16b //GHASH final-1 block - mid +L256_dec_blocks_less_than_1: //blocks left <= 1 + + ld1 { v26.16b}, [x2] //load existing bytes where the possibly partial last block is to be stored + mvn x6, xzr //temp0_x = 0xffffffffffffffff + and x1, x1, #127 //bit_length %= 128 + + sub x1, x1, #128 //bit_length -= 128 + rev32 v30.16b, v30.16b + str q30, [x16] //store the updated counter + + neg x1, x1 //bit_length = 128 - #bits in input (in range [1,128]) + + and x1, x1, #127 //bit_length %= 128 + + lsr x6, x6, x1 //temp0_x is mask for top 64b of last block + cmp x1, #64 + mvn x7, xzr //temp1_x = 0xffffffffffffffff + + csel x14, x6, xzr, lt + csel x13, x7, x6, lt + + mov v0.d[0], x13 //ctr0b is mask for last block + mov v0.d[1], x14 + + and v9.16b, v9.16b, v0.16b //possibly partial last block has zeroes in highest bits + ldr q20, [x3, #32] //load h1l | h1h + ext v20.16b, v20.16b, v20.16b, #8 + bif v12.16b, v26.16b, v0.16b //insert existing bytes in top end of result before storing + + rev64 v8.16b, v9.16b //GHASH final block + + eor v8.16b, v8.16b, v16.16b //feed in partial tag + + ins v16.d[0], v8.d[1] //GHASH final block - mid + pmull2 v28.1q, v8.2d, v20.2d //GHASH final block - high + + eor v16.8b, v16.8b, v8.8b //GHASH final block - mid + + pmull v26.1q, v8.1d, v20.1d //GHASH final block - low + eor v17.16b, v17.16b, v28.16b //GHASH final block - high + + pmull v16.1q, v16.1d, v21.1d //GHASH final block - mid + + eor v18.16b, v18.16b, v16.16b //GHASH final block - mid + ldr d16, [x10] //MODULO - load modulo constant + eor v19.16b, v19.16b, v26.16b //GHASH final block - low + + pmull v21.1q, v17.1d, v16.1d //MODULO - top 64b align with mid + eor v14.16b, v17.16b, v19.16b //MODULO - karatsuba tidy up + + ext v17.16b, v17.16b, v17.16b, #8 //MODULO - other top alignment + st1 { v12.16b}, [x2] //store all 16B + + eor v18.16b, v18.16b, v14.16b //MODULO - karatsuba tidy up + + eor v21.16b, v17.16b, v21.16b //MODULO - fold into mid + eor v18.16b, v18.16b, v21.16b //MODULO - fold into mid + + pmull v17.1q, v18.1d, v16.1d //MODULO - mid 64b align with low + + ext v18.16b, v18.16b, v18.16b, #8 //MODULO - other mid alignment + eor v19.16b, v19.16b, v17.16b //MODULO - fold into low + + eor v19.16b, v19.16b, v18.16b //MODULO - fold into low + ext v19.16b, v19.16b, v19.16b, #8 + rev64 v19.16b, v19.16b + st1 { v19.16b }, [x3] + mov x0, x9 + + ldp d10, d11, [sp, #16] + ldp d12, d13, [sp, #32] + ldp d14, d15, [sp, #48] + ldp d8, d9, [sp], #80 + ret + +L256_dec_ret: + mov w0, #0x0 + ret + +.byte 65,69,83,32,71,67,77,32,109,111,100,117,108,101,32,102,111,114,32,65,82,77,118,56,44,32,83,80,68,88,32,66,83,68,45,51,45,67,108,97,117,115,101,32,98,121,32,60,120,105,97,111,107,97,110,103,46,113,105,97,110,64,97,114,109,46,99,111,109,62,0 +.align 2 +.align 2 +#endif diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/modes/aes-gcm-armv8_64.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/modes/aes-gcm-armv8_64.S new file mode 100644 index 000000000000..8c810877bfff --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/modes/aes-gcm-armv8_64.S @@ -0,0 +1,6408 @@ +#include "arm_arch.h" + +#if __ARM_MAX_ARCH__>=8 +.arch armv8-a+crypto +.text +.globl aes_gcm_enc_128_kernel +.def aes_gcm_enc_128_kernel + .type 32 +.endef +.align 4 +aes_gcm_enc_128_kernel: + AARCH64_VALID_CALL_TARGET + cbz x1, L128_enc_ret + stp x19, x20, [sp, #-112]! + mov x16, x4 + mov x8, x5 + stp x21, x22, [sp, #16] + stp x23, x24, [sp, #32] + stp d8, d9, [sp, #48] + stp d10, d11, [sp, #64] + stp d12, d13, [sp, #80] + stp d14, d15, [sp, #96] + + ldp x10, x11, [x16] //ctr96_b64, ctr96_t32 +#ifdef __AARCH64EB__ + rev x10, x10 + rev x11, x11 +#endif + ldp x13, x14, [x8, #160] //load rk10 +#ifdef __AARCH64EB__ + ror x13, x13, #32 + ror x14, x14, #32 +#endif + ld1 {v11.16b}, [x3] + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + lsr x5, x1, #3 //byte_len + mov x15, x5 + + ld1 {v18.4s}, [x8], #16 //load rk0 + add x4, x0, x1, lsr #3 //end_input_ptr + sub x5, x5, #1 //byte_len - 1 + + lsr x12, x11, #32 + ldr q15, [x3, #112] //load h4l | h4h +#ifndef __AARCH64EB__ + ext v15.16b, v15.16b, v15.16b, #8 +#endif + fmov d1, x10 //CTR block 1 + rev w12, w12 //rev_ctr32 + + add w12, w12, #1 //increment rev_ctr32 + orr w11, w11, w11 + ld1 {v19.4s}, [x8], #16 //load rk1 + + rev w9, w12 //CTR block 1 + add w12, w12, #1 //CTR block 1 + fmov d3, x10 //CTR block 3 + + orr x9, x11, x9, lsl #32 //CTR block 1 + ld1 { v0.16b}, [x16] //special case vector load initial counter so we can start first AES block as quickly as possible + + fmov v1.d[1], x9 //CTR block 1 + rev w9, w12 //CTR block 2 + + fmov d2, x10 //CTR block 2 + orr x9, x11, x9, lsl #32 //CTR block 2 + add w12, w12, #1 //CTR block 2 + + fmov v2.d[1], x9 //CTR block 2 + rev w9, w12 //CTR block 3 + + orr x9, x11, x9, lsl #32 //CTR block 3 + ld1 {v20.4s}, [x8], #16 //load rk2 + + add w12, w12, #1 //CTR block 3 + fmov v3.d[1], x9 //CTR block 3 + + ldr q14, [x3, #80] //load h3l | h3h +#ifndef __AARCH64EB__ + ext v14.16b, v14.16b, v14.16b, #8 +#endif + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b //AES block 1 - round 0 + ld1 {v21.4s}, [x8], #16 //load rk3 + + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b //AES block 2 - round 0 + ldr q12, [x3, #32] //load h1l | h1h +#ifndef __AARCH64EB__ + ext v12.16b, v12.16b, v12.16b, #8 +#endif + + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b //AES block 0 - round 0 + ld1 {v22.4s}, [x8], #16 //load rk4 + + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b //AES block 3 - round 0 + ld1 {v23.4s}, [x8], #16 //load rk5 + + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b //AES block 2 - round 1 + trn2 v17.2d, v14.2d, v15.2d //h4l | h3l + + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b //AES block 0 - round 1 + ld1 {v24.4s}, [x8], #16 //load rk6 + + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b //AES block 1 - round 1 + ld1 {v25.4s}, [x8], #16 //load rk7 + + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b //AES block 3 - round 1 + trn1 v9.2d, v14.2d, v15.2d //h4h | h3h + + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b //AES block 0 - round 2 + ld1 {v26.4s}, [x8], #16 //load rk8 + + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b //AES block 1 - round 2 + ldr q13, [x3, #64] //load h2l | h2h +#ifndef __AARCH64EB__ + ext v13.16b, v13.16b, v13.16b, #8 +#endif + + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b //AES block 3 - round 2 + + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b //AES block 2 - round 2 + eor v17.16b, v17.16b, v9.16b //h4k | h3k + + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b //AES block 0 - round 3 + + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b //AES block 1 - round 3 + + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b //AES block 2 - round 3 + ld1 {v27.4s}, [x8], #16 //load rk9 + + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b //AES block 3 - round 3 + + and x5, x5, #0xffffffffffffffc0 //number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + trn2 v16.2d, v12.2d, v13.2d //h2l | h1l + + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b //AES block 3 - round 4 + add x5, x5, x0 + + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b //AES block 2 - round 4 + cmp x0, x5 //check if we have <= 4 blocks + + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b //AES block 0 - round 4 + + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b //AES block 3 - round 5 + + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b //AES block 2 - round 5 + + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b //AES block 0 - round 5 + + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b //AES block 3 - round 6 + + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b //AES block 1 - round 4 + + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b //AES block 2 - round 6 + trn1 v8.2d, v12.2d, v13.2d //h2h | h1h + + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b //AES block 0 - round 6 + + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b //AES block 1 - round 5 + + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b //AES block 3 - round 7 + + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b //AES block 0 - round 7 + + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b //AES block 1 - round 6 + + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b //AES block 2 - round 7 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 8 + + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b //AES block 1 - round 7 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 8 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 8 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 8 + + aese v2.16b, v27.16b //AES block 2 - round 9 + + aese v0.16b, v27.16b //AES block 0 - round 9 + + eor v16.16b, v16.16b, v8.16b //h2k | h1k + + aese v1.16b, v27.16b //AES block 1 - round 9 + + aese v3.16b, v27.16b //AES block 3 - round 9 + b.ge L128_enc_tail //handle tail + + ldp x6, x7, [x0, #0] //AES block 0 - load plaintext +#ifdef __AARCH64EB__ + rev x6, x6 + rev x7, x7 +#endif + ldp x21, x22, [x0, #32] //AES block 2 - load plaintext +#ifdef __AARCH64EB__ + rev x21, x21 + rev x22, x22 +#endif + ldp x19, x20, [x0, #16] //AES block 1 - load plaintext +#ifdef __AARCH64EB__ + rev x19, x19 + rev x20, x20 +#endif + ldp x23, x24, [x0, #48] //AES block 3 - load plaintext +#ifdef __AARCH64EB__ + rev x23, x23 + rev x24, x24 +#endif + eor x6, x6, x13 //AES block 0 - round 10 low + eor x7, x7, x14 //AES block 0 - round 10 high + + eor x21, x21, x13 //AES block 2 - round 10 low + fmov d4, x6 //AES block 0 - mov low + + eor x19, x19, x13 //AES block 1 - round 10 low + eor x22, x22, x14 //AES block 2 - round 10 high + fmov v4.d[1], x7 //AES block 0 - mov high + + fmov d5, x19 //AES block 1 - mov low + eor x20, x20, x14 //AES block 1 - round 10 high + + eor x23, x23, x13 //AES block 3 - round 10 low + fmov v5.d[1], x20 //AES block 1 - mov high + + fmov d6, x21 //AES block 2 - mov low + eor x24, x24, x14 //AES block 3 - round 10 high + rev w9, w12 //CTR block 4 + + fmov v6.d[1], x22 //AES block 2 - mov high + orr x9, x11, x9, lsl #32 //CTR block 4 + + eor v4.16b, v4.16b, v0.16b //AES block 0 - result + fmov d0, x10 //CTR block 4 + add w12, w12, #1 //CTR block 4 + + fmov v0.d[1], x9 //CTR block 4 + rev w9, w12 //CTR block 5 + + eor v5.16b, v5.16b, v1.16b //AES block 1 - result + fmov d1, x10 //CTR block 5 + orr x9, x11, x9, lsl #32 //CTR block 5 + + add w12, w12, #1 //CTR block 5 + add x0, x0, #64 //AES input_ptr update + fmov v1.d[1], x9 //CTR block 5 + + fmov d7, x23 //AES block 3 - mov low + rev w9, w12 //CTR block 6 + st1 { v4.16b}, [x2], #16 //AES block 0 - store result + + fmov v7.d[1], x24 //AES block 3 - mov high + orr x9, x11, x9, lsl #32 //CTR block 6 + + add w12, w12, #1 //CTR block 6 + eor v6.16b, v6.16b, v2.16b //AES block 2 - result + st1 { v5.16b}, [x2], #16 //AES block 1 - store result + + fmov d2, x10 //CTR block 6 + cmp x0, x5 //check if we have <= 8 blocks + + fmov v2.d[1], x9 //CTR block 6 + rev w9, w12 //CTR block 7 + st1 { v6.16b}, [x2], #16 //AES block 2 - store result + + orr x9, x11, x9, lsl #32 //CTR block 7 + + eor v7.16b, v7.16b, v3.16b //AES block 3 - result + st1 { v7.16b}, [x2], #16 //AES block 3 - store result + b.ge L128_enc_prepretail //do prepretail + +L128_enc_main_loop: //main loop start + ldp x23, x24, [x0, #48] //AES block 4k+3 - load plaintext +#ifdef __AARCH64EB__ + rev x23, x23 + rev x24, x24 +#endif + rev64 v4.16b, v4.16b //GHASH block 4k (only t0 is free) + rev64 v6.16b, v6.16b //GHASH block 4k+2 (t0, t1, and t2 free) + + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 0 + fmov d3, x10 //CTR block 4k+3 + + ext v11.16b, v11.16b, v11.16b, #8 //PRE 0 + rev64 v5.16b, v5.16b //GHASH block 4k+1 (t0 and t1 free) + + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 0 + add w12, w12, #1 //CTR block 4k+3 + fmov v3.d[1], x9 //CTR block 4k+3 + + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 0 + mov d31, v6.d[1] //GHASH block 4k+2 - mid + + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 1 + mov d30, v5.d[1] //GHASH block 4k+1 - mid + + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 1 + eor v4.16b, v4.16b, v11.16b //PRE 1 + + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 0 + eor x24, x24, x14 //AES block 4k+3 - round 10 high + + pmull2 v28.1q, v5.2d, v14.2d //GHASH block 4k+1 - high + eor v31.8b, v31.8b, v6.8b //GHASH block 4k+2 - mid + ldp x6, x7, [x0, #0] //AES block 4k+4 - load plaintext +#ifdef __AARCH64EB__ + rev x6, x6 + rev x7, x7 +#endif + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 1 + rev w9, w12 //CTR block 4k+8 + + eor v30.8b, v30.8b, v5.8b //GHASH block 4k+1 - mid + mov d8, v4.d[1] //GHASH block 4k - mid + orr x9, x11, x9, lsl #32 //CTR block 4k+8 + + pmull2 v9.1q, v4.2d, v15.2d //GHASH block 4k - high + add w12, w12, #1 //CTR block 4k+8 + mov d10, v17.d[1] //GHASH block 4k - mid + + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 2 + + pmull v11.1q, v4.1d, v15.1d //GHASH block 4k - low + eor v8.8b, v8.8b, v4.8b //GHASH block 4k - mid + + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 2 + + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 3 + eor v9.16b, v9.16b, v28.16b //GHASH block 4k+1 - high + + pmull v28.1q, v6.1d, v13.1d //GHASH block 4k+2 - low + + pmull v10.1q, v8.1d, v10.1d //GHASH block 4k - mid + rev64 v7.16b, v7.16b //GHASH block 4k+3 (t0, t1, t2 and t3 free) + + pmull v30.1q, v30.1d, v17.1d //GHASH block 4k+1 - mid + + pmull v29.1q, v5.1d, v14.1d //GHASH block 4k+1 - low + ins v31.d[1], v31.d[0] //GHASH block 4k+2 - mid + + pmull2 v8.1q, v6.2d, v13.2d //GHASH block 4k+2 - high + eor x7, x7, x14 //AES block 4k+4 - round 10 high + + eor v10.16b, v10.16b, v30.16b //GHASH block 4k+1 - mid + mov d30, v7.d[1] //GHASH block 4k+3 - mid + + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 1 + eor v11.16b, v11.16b, v29.16b //GHASH block 4k+1 - low + + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 2 + eor x6, x6, x13 //AES block 4k+4 - round 10 low + + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 3 + eor v30.8b, v30.8b, v7.8b //GHASH block 4k+3 - mid + + pmull2 v4.1q, v7.2d, v12.2d //GHASH block 4k+3 - high + + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 3 + eor v9.16b, v9.16b, v8.16b //GHASH block 4k+2 - high + + pmull2 v31.1q, v31.2d, v16.2d //GHASH block 4k+2 - mid + + pmull v29.1q, v7.1d, v12.1d //GHASH block 4k+3 - low + movi v8.8b, #0xc2 + + pmull v30.1q, v30.1d, v16.1d //GHASH block 4k+3 - mid + eor v11.16b, v11.16b, v28.16b //GHASH block 4k+2 - low + + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 4 + + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 2 + shl d8, d8, #56 //mod_constant + + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 4 + eor v9.16b, v9.16b, v4.16b //GHASH block 4k+3 - high + + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 5 + ldp x19, x20, [x0, #16] //AES block 4k+5 - load plaintext +#ifdef __AARCH64EB__ + rev x19, x19 + rev x20, x20 +#endif + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 3 + eor v10.16b, v10.16b, v31.16b //GHASH block 4k+2 - mid + + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 5 + ldp x21, x22, [x0, #32] //AES block 4k+6 - load plaintext +#ifdef __AARCH64EB__ + rev x21, x21 + rev x22, x22 +#endif + pmull v31.1q, v9.1d, v8.1d //MODULO - top 64b align with mid + eor v11.16b, v11.16b, v29.16b //GHASH block 4k+3 - low + + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 4 + eor x19, x19, x13 //AES block 4k+5 - round 10 low + + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 4 + eor v10.16b, v10.16b, v30.16b //GHASH block 4k+3 - mid + + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 6 + eor x23, x23, x13 //AES block 4k+3 - round 10 low + + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 5 + eor v30.16b, v11.16b, v9.16b //MODULO - karatsuba tidy up + + fmov d4, x6 //AES block 4k+4 - mov low + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 6 + fmov v4.d[1], x7 //AES block 4k+4 - mov high + + add x0, x0, #64 //AES input_ptr update + fmov d7, x23 //AES block 4k+3 - mov low + ext v9.16b, v9.16b, v9.16b, #8 //MODULO - other top alignment + + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 5 + fmov d5, x19 //AES block 4k+5 - mov low + + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 7 + eor v10.16b, v10.16b, v30.16b //MODULO - karatsuba tidy up + + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 6 + eor x20, x20, x14 //AES block 4k+5 - round 10 high + + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 7 + fmov v5.d[1], x20 //AES block 4k+5 - mov high + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 8 + fmov v7.d[1], x24 //AES block 4k+3 - mov high + + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 6 + cmp x0, x5 //LOOP CONTROL + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 8 + eor v10.16b, v10.16b, v31.16b //MODULO - fold into mid + + aese v0.16b, v27.16b //AES block 4k+4 - round 9 + eor x21, x21, x13 //AES block 4k+6 - round 10 low + eor x22, x22, x14 //AES block 4k+6 - round 10 high + + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 7 + fmov d6, x21 //AES block 4k+6 - mov low + + aese v1.16b, v27.16b //AES block 4k+5 - round 9 + fmov v6.d[1], x22 //AES block 4k+6 - mov high + + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 7 + eor v4.16b, v4.16b, v0.16b //AES block 4k+4 - result + + fmov d0, x10 //CTR block 4k+8 + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 8 + + fmov v0.d[1], x9 //CTR block 4k+8 + rev w9, w12 //CTR block 4k+9 + eor v10.16b, v10.16b, v9.16b //MODULO - fold into mid + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 8 + eor v5.16b, v5.16b, v1.16b //AES block 4k+5 - result + + add w12, w12, #1 //CTR block 4k+9 + orr x9, x11, x9, lsl #32 //CTR block 4k+9 + fmov d1, x10 //CTR block 4k+9 + + pmull v9.1q, v10.1d, v8.1d //MODULO - mid 64b align with low + fmov v1.d[1], x9 //CTR block 4k+9 + rev w9, w12 //CTR block 4k+10 + + aese v2.16b, v27.16b //AES block 4k+6 - round 9 + st1 { v4.16b}, [x2], #16 //AES block 4k+4 - store result + eor v6.16b, v6.16b, v2.16b //AES block 4k+6 - result + orr x9, x11, x9, lsl #32 //CTR block 4k+10 + + aese v3.16b, v27.16b //AES block 4k+7 - round 9 + add w12, w12, #1 //CTR block 4k+10 + ext v10.16b, v10.16b, v10.16b, #8 //MODULO - other mid alignment + fmov d2, x10 //CTR block 4k+10 + + eor v11.16b, v11.16b, v9.16b //MODULO - fold into low + st1 { v5.16b}, [x2], #16 //AES block 4k+5 - store result + + fmov v2.d[1], x9 //CTR block 4k+10 + st1 { v6.16b}, [x2], #16 //AES block 4k+6 - store result + rev w9, w12 //CTR block 4k+11 + + orr x9, x11, x9, lsl #32 //CTR block 4k+11 + eor v7.16b, v7.16b, v3.16b //AES block 4k+3 - result + + eor v11.16b, v11.16b, v10.16b //MODULO - fold into low + st1 { v7.16b}, [x2], #16 //AES block 4k+3 - store result + b.lt L128_enc_main_loop + +L128_enc_prepretail: //PREPRETAIL + rev64 v4.16b, v4.16b //GHASH block 4k (only t0 is free) + fmov d3, x10 //CTR block 4k+3 + rev64 v5.16b, v5.16b //GHASH block 4k+1 (t0 and t1 free) + + ext v11.16b, v11.16b, v11.16b, #8 //PRE 0 + add w12, w12, #1 //CTR block 4k+3 + fmov v3.d[1], x9 //CTR block 4k+3 + + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 0 + rev64 v6.16b, v6.16b //GHASH block 4k+2 (t0, t1, and t2 free) + + pmull v29.1q, v5.1d, v14.1d //GHASH block 4k+1 - low + + rev64 v7.16b, v7.16b //GHASH block 4k+3 (t0, t1, t2 and t3 free) + eor v4.16b, v4.16b, v11.16b //PRE 1 + + pmull2 v28.1q, v5.2d, v14.2d //GHASH block 4k+1 - high + + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 0 + mov d30, v5.d[1] //GHASH block 4k+1 - mid + + pmull v11.1q, v4.1d, v15.1d //GHASH block 4k - low + mov d8, v4.d[1] //GHASH block 4k - mid + + mov d31, v6.d[1] //GHASH block 4k+2 - mid + mov d10, v17.d[1] //GHASH block 4k - mid + + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 1 + eor v30.8b, v30.8b, v5.8b //GHASH block 4k+1 - mid + + eor v8.8b, v8.8b, v4.8b //GHASH block 4k - mid + + pmull2 v9.1q, v4.2d, v15.2d //GHASH block 4k - high + eor v31.8b, v31.8b, v6.8b //GHASH block 4k+2 - mid + + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 1 + + pmull v30.1q, v30.1d, v17.1d //GHASH block 4k+1 - mid + eor v11.16b, v11.16b, v29.16b //GHASH block 4k+1 - low + + pmull v10.1q, v8.1d, v10.1d //GHASH block 4k - mid + + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 0 + ins v31.d[1], v31.d[0] //GHASH block 4k+2 - mid + + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 0 + + eor v10.16b, v10.16b, v30.16b //GHASH block 4k+1 - mid + mov d30, v7.d[1] //GHASH block 4k+3 - mid + + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 1 + eor v9.16b, v9.16b, v28.16b //GHASH block 4k+1 - high + + pmull2 v31.1q, v31.2d, v16.2d //GHASH block 4k+2 - mid + + pmull2 v8.1q, v6.2d, v13.2d //GHASH block 4k+2 - high + eor v30.8b, v30.8b, v7.8b //GHASH block 4k+3 - mid + + pmull2 v4.1q, v7.2d, v12.2d //GHASH block 4k+3 - high + + pmull v28.1q, v6.1d, v13.1d //GHASH block 4k+2 - low + + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 1 + eor v9.16b, v9.16b, v8.16b //GHASH block 4k+2 - high + + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 2 + + pmull v29.1q, v7.1d, v12.1d //GHASH block 4k+3 - low + movi v8.8b, #0xc2 + + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 2 + eor v11.16b, v11.16b, v28.16b //GHASH block 4k+2 - low + + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 2 + + pmull v30.1q, v30.1d, v16.1d //GHASH block 4k+3 - mid + eor v10.16b, v10.16b, v31.16b //GHASH block 4k+2 - mid + + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 3 + + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 2 + eor v9.16b, v9.16b, v4.16b //GHASH block 4k+3 - high + + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 3 + + eor v10.16b, v10.16b, v30.16b //GHASH block 4k+3 - mid + shl d8, d8, #56 //mod_constant + + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 3 + eor v11.16b, v11.16b, v29.16b //GHASH block 4k+3 - low + + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 4 + + pmull v28.1q, v9.1d, v8.1d + eor v10.16b, v10.16b, v9.16b //karatsuba tidy up + + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 4 + + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 5 + ext v9.16b, v9.16b, v9.16b, #8 + + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 3 + + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 4 + eor v10.16b, v10.16b, v11.16b + + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 6 + + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 4 + + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 5 + + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 5 + eor v10.16b, v10.16b, v28.16b + + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 5 + + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 6 + + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 6 + + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 6 + eor v10.16b, v10.16b, v9.16b + + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 7 + + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 7 + + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 7 + + pmull v28.1q, v10.1d, v8.1d + + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 7 + ext v10.16b, v10.16b, v10.16b, #8 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 8 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 8 + eor v11.16b, v11.16b, v28.16b + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 8 + + aese v3.16b, v27.16b //AES block 4k+7 - round 9 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 8 + + aese v0.16b, v27.16b //AES block 4k+4 - round 9 + + aese v1.16b, v27.16b //AES block 4k+5 - round 9 + eor v11.16b, v11.16b, v10.16b + + aese v2.16b, v27.16b //AES block 4k+6 - round 9 +L128_enc_tail: //TAIL + + sub x5, x4, x0 //main_end_input_ptr is number of bytes left to process + ldp x6, x7, [x0], #16 //AES block 4k+4 - load plaintext +#ifdef __AARCH64EB__ + rev x6, x6 + rev x7, x7 +#endif + cmp x5, #48 + + ext v8.16b, v11.16b, v11.16b, #8 //prepare final partial tag + eor x6, x6, x13 //AES block 4k+4 - round 10 low + eor x7, x7, x14 //AES block 4k+4 - round 10 high + + fmov d4, x6 //AES block 4k+4 - mov low + + fmov v4.d[1], x7 //AES block 4k+4 - mov high + + eor v5.16b, v4.16b, v0.16b //AES block 4k+4 - result + + b.gt L128_enc_blocks_more_than_3 + + sub w12, w12, #1 + movi v11.8b, #0 + mov v3.16b, v2.16b + + cmp x5, #32 + mov v2.16b, v1.16b + movi v9.8b, #0 + + movi v10.8b, #0 + b.gt L128_enc_blocks_more_than_2 + + mov v3.16b, v1.16b + cmp x5, #16 + + sub w12, w12, #1 + b.gt L128_enc_blocks_more_than_1 + + sub w12, w12, #1 + b L128_enc_blocks_less_than_1 +L128_enc_blocks_more_than_3: //blocks left > 3 + st1 { v5.16b}, [x2], #16 //AES final-3 block - store result + + ldp x6, x7, [x0], #16 //AES final-2 block - load input low & high +#ifdef __AARCH64EB__ + rev x6, x6 + rev x7, x7 +#endif + rev64 v4.16b, v5.16b //GHASH final-3 block + + eor v4.16b, v4.16b, v8.16b //feed in partial tag + eor x7, x7, x14 //AES final-2 block - round 10 high + eor x6, x6, x13 //AES final-2 block - round 10 low + + fmov d5, x6 //AES final-2 block - mov low + + movi v8.8b, #0 //suppress further partial tag feed in + fmov v5.d[1], x7 //AES final-2 block - mov high + + pmull v11.1q, v4.1d, v15.1d //GHASH final-3 block - low + mov d22, v4.d[1] //GHASH final-3 block - mid + + pmull2 v9.1q, v4.2d, v15.2d //GHASH final-3 block - high + + mov d10, v17.d[1] //GHASH final-3 block - mid + + eor v5.16b, v5.16b, v1.16b //AES final-2 block - result + eor v22.8b, v22.8b, v4.8b //GHASH final-3 block - mid + + pmull v10.1q, v22.1d, v10.1d //GHASH final-3 block - mid +L128_enc_blocks_more_than_2: //blocks left > 2 + + st1 { v5.16b}, [x2], #16 //AES final-2 block - store result + + rev64 v4.16b, v5.16b //GHASH final-2 block + ldp x6, x7, [x0], #16 //AES final-1 block - load input low & high +#ifdef __AARCH64EB__ + rev x6, x6 + rev x7, x7 +#endif + eor v4.16b, v4.16b, v8.16b //feed in partial tag + + eor x6, x6, x13 //AES final-1 block - round 10 low + + fmov d5, x6 //AES final-1 block - mov low + eor x7, x7, x14 //AES final-1 block - round 10 high + + pmull2 v20.1q, v4.2d, v14.2d //GHASH final-2 block - high + fmov v5.d[1], x7 //AES final-1 block - mov high + + mov d22, v4.d[1] //GHASH final-2 block - mid + + pmull v21.1q, v4.1d, v14.1d //GHASH final-2 block - low + + eor v9.16b, v9.16b, v20.16b //GHASH final-2 block - high + + eor v22.8b, v22.8b, v4.8b //GHASH final-2 block - mid + + eor v5.16b, v5.16b, v2.16b //AES final-1 block - result + + eor v11.16b, v11.16b, v21.16b //GHASH final-2 block - low + + pmull v22.1q, v22.1d, v17.1d //GHASH final-2 block - mid + + movi v8.8b, #0 //suppress further partial tag feed in + + eor v10.16b, v10.16b, v22.16b //GHASH final-2 block - mid +L128_enc_blocks_more_than_1: //blocks left > 1 + + st1 { v5.16b}, [x2], #16 //AES final-1 block - store result + + rev64 v4.16b, v5.16b //GHASH final-1 block + ldp x6, x7, [x0], #16 //AES final block - load input low & high +#ifdef __AARCH64EB__ + rev x6, x6 + rev x7, x7 +#endif + eor v4.16b, v4.16b, v8.16b //feed in partial tag + + eor x7, x7, x14 //AES final block - round 10 high + eor x6, x6, x13 //AES final block - round 10 low + + fmov d5, x6 //AES final block - mov low + + pmull2 v20.1q, v4.2d, v13.2d //GHASH final-1 block - high + fmov v5.d[1], x7 //AES final block - mov high + + mov d22, v4.d[1] //GHASH final-1 block - mid + + pmull v21.1q, v4.1d, v13.1d //GHASH final-1 block - low + + eor v22.8b, v22.8b, v4.8b //GHASH final-1 block - mid + + eor v5.16b, v5.16b, v3.16b //AES final block - result + + ins v22.d[1], v22.d[0] //GHASH final-1 block - mid + + pmull2 v22.1q, v22.2d, v16.2d //GHASH final-1 block - mid + + eor v11.16b, v11.16b, v21.16b //GHASH final-1 block - low + + eor v9.16b, v9.16b, v20.16b //GHASH final-1 block - high + + eor v10.16b, v10.16b, v22.16b //GHASH final-1 block - mid + movi v8.8b, #0 //suppress further partial tag feed in +L128_enc_blocks_less_than_1: //blocks left <= 1 + + and x1, x1, #127 //bit_length %= 128 + mvn x13, xzr //rk10_l = 0xffffffffffffffff + + mvn x14, xzr //rk10_h = 0xffffffffffffffff + sub x1, x1, #128 //bit_length -= 128 + + neg x1, x1 //bit_length = 128 - #bits in input (in range [1,128]) + + and x1, x1, #127 //bit_length %= 128 + + lsr x14, x14, x1 //rk10_h is mask for top 64b of last block + cmp x1, #64 + + csel x6, x13, x14, lt + csel x7, x14, xzr, lt + + fmov d0, x6 //ctr0b is mask for last block + + fmov v0.d[1], x7 + + and v5.16b, v5.16b, v0.16b //possibly partial last block has zeroes in highest bits + + rev64 v4.16b, v5.16b //GHASH final block + + eor v4.16b, v4.16b, v8.16b //feed in partial tag + + mov d8, v4.d[1] //GHASH final block - mid + + pmull v21.1q, v4.1d, v12.1d //GHASH final block - low + ld1 { v18.16b}, [x2] //load existing bytes where the possibly partial last block is to be stored + + eor v8.8b, v8.8b, v4.8b //GHASH final block - mid +#ifndef __AARCH64EB__ + rev w9, w12 +#else + mov w9, w12 +#endif + pmull2 v20.1q, v4.2d, v12.2d //GHASH final block - high + + pmull v8.1q, v8.1d, v16.1d //GHASH final block - mid + + eor v11.16b, v11.16b, v21.16b //GHASH final block - low + + eor v9.16b, v9.16b, v20.16b //GHASH final block - high + + eor v10.16b, v10.16b, v8.16b //GHASH final block - mid + movi v8.8b, #0xc2 + + eor v30.16b, v11.16b, v9.16b //MODULO - karatsuba tidy up + + shl d8, d8, #56 //mod_constant + + eor v10.16b, v10.16b, v30.16b //MODULO - karatsuba tidy up + + pmull v31.1q, v9.1d, v8.1d //MODULO - top 64b align with mid + + ext v9.16b, v9.16b, v9.16b, #8 //MODULO - other top alignment + + eor v10.16b, v10.16b, v31.16b //MODULO - fold into mid + + eor v10.16b, v10.16b, v9.16b //MODULO - fold into mid + + pmull v9.1q, v10.1d, v8.1d //MODULO - mid 64b align with low + + ext v10.16b, v10.16b, v10.16b, #8 //MODULO - other mid alignment + + bif v5.16b, v18.16b, v0.16b //insert existing bytes in top end of result before storing + + eor v11.16b, v11.16b, v9.16b //MODULO - fold into low + st1 { v5.16b}, [x2] //store all 16B + + str w9, [x16, #12] //store the updated counter + + eor v11.16b, v11.16b, v10.16b //MODULO - fold into low + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + mov x0, x15 + st1 { v11.16b }, [x3] + ldp x21, x22, [sp, #16] + ldp x23, x24, [sp, #32] + ldp d8, d9, [sp, #48] + ldp d10, d11, [sp, #64] + ldp d12, d13, [sp, #80] + ldp d14, d15, [sp, #96] + ldp x19, x20, [sp], #112 + ret + +L128_enc_ret: + mov w0, #0x0 + ret + +.globl aes_gcm_dec_128_kernel +.def aes_gcm_dec_128_kernel + .type 32 +.endef +.align 4 +aes_gcm_dec_128_kernel: + AARCH64_VALID_CALL_TARGET + cbz x1, L128_dec_ret + stp x19, x20, [sp, #-112]! + mov x16, x4 + mov x8, x5 + stp x21, x22, [sp, #16] + stp x23, x24, [sp, #32] + stp d8, d9, [sp, #48] + stp d10, d11, [sp, #64] + stp d12, d13, [sp, #80] + stp d14, d15, [sp, #96] + + lsr x5, x1, #3 //byte_len + mov x15, x5 + ldp x10, x11, [x16] //ctr96_b64, ctr96_t32 +#ifdef __AARCH64EB__ + rev x10, x10 + rev x11, x11 +#endif + ldp x13, x14, [x8, #160] //load rk10 +#ifdef __AARCH64EB__ + ror x14, x14, 32 + ror x13, x13, 32 +#endif + sub x5, x5, #1 //byte_len - 1 + ld1 {v18.4s}, [x8], #16 //load rk0 + + and x5, x5, #0xffffffffffffffc0 //number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + ld1 { v0.16b}, [x16] //special case vector load initial counter so we can start first AES block as quickly as possible + + ldr q13, [x3, #64] //load h2l | h2h +#ifndef __AARCH64EB__ + ext v13.16b, v13.16b, v13.16b, #8 +#endif + lsr x12, x11, #32 + fmov d2, x10 //CTR block 2 + + ld1 {v19.4s}, [x8], #16 //load rk1 + orr w11, w11, w11 + rev w12, w12 //rev_ctr32 + + fmov d1, x10 //CTR block 1 + add w12, w12, #1 //increment rev_ctr32 + + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b //AES block 0 - round 0 + rev w9, w12 //CTR block 1 + + orr x9, x11, x9, lsl #32 //CTR block 1 + ld1 {v20.4s}, [x8], #16 //load rk2 + add w12, w12, #1 //CTR block 1 + + fmov v1.d[1], x9 //CTR block 1 + rev w9, w12 //CTR block 2 + add w12, w12, #1 //CTR block 2 + + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b //AES block 0 - round 1 + orr x9, x11, x9, lsl #32 //CTR block 2 + + fmov v2.d[1], x9 //CTR block 2 + rev w9, w12 //CTR block 3 + + fmov d3, x10 //CTR block 3 + orr x9, x11, x9, lsl #32 //CTR block 3 + add w12, w12, #1 //CTR block 3 + + fmov v3.d[1], x9 //CTR block 3 + add x4, x0, x1, lsr #3 //end_input_ptr + + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b //AES block 1 - round 0 + ld1 {v21.4s}, [x8], #16 //load rk3 + + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b //AES block 0 - round 2 + ld1 {v22.4s}, [x8], #16 //load rk4 + + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b //AES block 2 - round 0 + ld1 {v23.4s}, [x8], #16 //load rk5 + + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b //AES block 1 - round 1 + ld1 {v24.4s}, [x8], #16 //load rk6 + + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b //AES block 3 - round 0 + + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b //AES block 2 - round 1 + + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b //AES block 1 - round 2 + + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b //AES block 3 - round 1 + ld1 { v11.16b}, [x3] + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b //AES block 0 - round 3 + ld1 {v25.4s}, [x8], #16 //load rk7 + + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b //AES block 1 - round 3 + + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b //AES block 3 - round 2 + + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b //AES block 2 - round 2 + ld1 {v26.4s}, [x8], #16 //load rk8 + + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b //AES block 1 - round 4 + + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b //AES block 3 - round 3 + + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b //AES block 2 - round 3 + ldr q14, [x3, #80] //load h3l | h3h +#ifndef __AARCH64EB__ + ext v14.16b, v14.16b, v14.16b, #8 +#endif + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b //AES block 0 - round 4 + ld1 {v27.4s}, [x8], #16 //load rk9 + + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b //AES block 1 - round 5 + + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b //AES block 2 - round 4 + + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b //AES block 3 - round 4 + + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b //AES block 0 - round 5 + + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b //AES block 2 - round 5 + ldr q12, [x3, #32] //load h1l | h1h +#ifndef __AARCH64EB__ + ext v12.16b, v12.16b, v12.16b, #8 +#endif + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b //AES block 3 - round 5 + + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b //AES block 0 - round 6 + + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b //AES block 1 - round 6 + + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b //AES block 3 - round 6 + + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b //AES block 2 - round 6 + trn1 v8.2d, v12.2d, v13.2d //h2h | h1h + + ldr q15, [x3, #112] //load h4l | h4h +#ifndef __AARCH64EB__ + ext v15.16b, v15.16b, v15.16b, #8 +#endif + trn2 v16.2d, v12.2d, v13.2d //h2l | h1l + add x5, x5, x0 + + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b //AES block 1 - round 7 + + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b //AES block 2 - round 7 + + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b //AES block 0 - round 7 + eor v16.16b, v16.16b, v8.16b //h2k | h1k + + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b //AES block 3 - round 7 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 8 + trn2 v17.2d, v14.2d, v15.2d //h4l | h3l + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 8 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 8 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 8 + trn1 v9.2d, v14.2d, v15.2d //h4h | h3h + + aese v2.16b, v27.16b //AES block 2 - round 9 + + aese v3.16b, v27.16b //AES block 3 - round 9 + + aese v0.16b, v27.16b //AES block 0 - round 9 + cmp x0, x5 //check if we have <= 4 blocks + + aese v1.16b, v27.16b //AES block 1 - round 9 + eor v17.16b, v17.16b, v9.16b //h4k | h3k + b.ge L128_dec_tail //handle tail + + ld1 {v4.16b, v5.16b}, [x0], #32 //AES block 0 - load ciphertext; AES block 1 - load ciphertext + + eor v1.16b, v5.16b, v1.16b //AES block 1 - result + ld1 {v6.16b}, [x0], #16 //AES block 2 - load ciphertext + + eor v0.16b, v4.16b, v0.16b //AES block 0 - result + rev64 v4.16b, v4.16b //GHASH block 0 + rev w9, w12 //CTR block 4 + + orr x9, x11, x9, lsl #32 //CTR block 4 + add w12, w12, #1 //CTR block 4 + ld1 {v7.16b}, [x0], #16 //AES block 3 - load ciphertext + + rev64 v5.16b, v5.16b //GHASH block 1 + mov x19, v1.d[0] //AES block 1 - mov low + + mov x20, v1.d[1] //AES block 1 - mov high + + mov x6, v0.d[0] //AES block 0 - mov low + cmp x0, x5 //check if we have <= 8 blocks + + mov x7, v0.d[1] //AES block 0 - mov high + + fmov d0, x10 //CTR block 4 + + fmov v0.d[1], x9 //CTR block 4 + rev w9, w12 //CTR block 5 + eor x19, x19, x13 //AES block 1 - round 10 low +#ifdef __AARCH64EB__ + rev x19, x19 +#endif + fmov d1, x10 //CTR block 5 + add w12, w12, #1 //CTR block 5 + orr x9, x11, x9, lsl #32 //CTR block 5 + + fmov v1.d[1], x9 //CTR block 5 + rev w9, w12 //CTR block 6 + add w12, w12, #1 //CTR block 6 + + orr x9, x11, x9, lsl #32 //CTR block 6 + + eor x20, x20, x14 //AES block 1 - round 10 high +#ifdef __AARCH64EB__ + rev x20, x20 +#endif + eor x6, x6, x13 //AES block 0 - round 10 low +#ifdef __AARCH64EB__ + rev x6, x6 +#endif + eor v2.16b, v6.16b, v2.16b //AES block 2 - result + + eor x7, x7, x14 //AES block 0 - round 10 high +#ifdef __AARCH64EB__ + rev x7, x7 +#endif + stp x6, x7, [x2], #16 //AES block 0 - store result + + stp x19, x20, [x2], #16 //AES block 1 - store result + b.ge L128_dec_prepretail //do prepretail + +L128_dec_main_loop: //main loop start + eor v3.16b, v7.16b, v3.16b //AES block 4k+3 - result + ext v11.16b, v11.16b, v11.16b, #8 //PRE 0 + mov x21, v2.d[0] //AES block 4k+2 - mov low + + pmull2 v28.1q, v5.2d, v14.2d //GHASH block 4k+1 - high + mov x22, v2.d[1] //AES block 4k+2 - mov high + + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 0 + fmov d2, x10 //CTR block 4k+6 + + rev64 v6.16b, v6.16b //GHASH block 4k+2 + fmov v2.d[1], x9 //CTR block 4k+6 + rev w9, w12 //CTR block 4k+7 + + mov x23, v3.d[0] //AES block 4k+3 - mov low + eor v4.16b, v4.16b, v11.16b //PRE 1 + mov d30, v5.d[1] //GHASH block 4k+1 - mid + + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 1 + rev64 v7.16b, v7.16b //GHASH block 4k+3 + + pmull v29.1q, v5.1d, v14.1d //GHASH block 4k+1 - low + mov x24, v3.d[1] //AES block 4k+3 - mov high + orr x9, x11, x9, lsl #32 //CTR block 4k+7 + + pmull v11.1q, v4.1d, v15.1d //GHASH block 4k - low + fmov d3, x10 //CTR block 4k+7 + eor v30.8b, v30.8b, v5.8b //GHASH block 4k+1 - mid + + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 2 + fmov v3.d[1], x9 //CTR block 4k+7 + + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 0 + mov d10, v17.d[1] //GHASH block 4k - mid + + pmull2 v9.1q, v4.2d, v15.2d //GHASH block 4k - high + eor v11.16b, v11.16b, v29.16b //GHASH block 4k+1 - low + + pmull v29.1q, v7.1d, v12.1d //GHASH block 4k+3 - low + + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 3 + mov d8, v4.d[1] //GHASH block 4k - mid + + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 0 + eor v9.16b, v9.16b, v28.16b //GHASH block 4k+1 - high + + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 0 + + pmull v28.1q, v6.1d, v13.1d //GHASH block 4k+2 - low + eor v8.8b, v8.8b, v4.8b //GHASH block 4k - mid + + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 1 + eor x23, x23, x13 //AES block 4k+3 - round 10 low +#ifdef __AARCH64EB__ + rev x23, x23 +#endif + pmull v30.1q, v30.1d, v17.1d //GHASH block 4k+1 - mid + eor x22, x22, x14 //AES block 4k+2 - round 10 high +#ifdef __AARCH64EB__ + rev x22, x22 +#endif + mov d31, v6.d[1] //GHASH block 4k+2 - mid + + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 1 + eor v11.16b, v11.16b, v28.16b //GHASH block 4k+2 - low + + pmull v10.1q, v8.1d, v10.1d //GHASH block 4k - mid + + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 2 + eor v31.8b, v31.8b, v6.8b //GHASH block 4k+2 - mid + + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 2 + + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 4 + eor v10.16b, v10.16b, v30.16b //GHASH block 4k+1 - mid + + pmull2 v8.1q, v6.2d, v13.2d //GHASH block 4k+2 - high + + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 3 + ins v31.d[1], v31.d[0] //GHASH block 4k+2 - mid + + pmull2 v4.1q, v7.2d, v12.2d //GHASH block 4k+3 - high + + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 1 + mov d30, v7.d[1] //GHASH block 4k+3 - mid + + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 4 + eor v9.16b, v9.16b, v8.16b //GHASH block 4k+2 - high + + pmull2 v31.1q, v31.2d, v16.2d //GHASH block 4k+2 - mid + eor x24, x24, x14 //AES block 4k+3 - round 10 high +#ifdef __AARCH64EB__ + rev x24, x24 +#endif + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 2 + eor v30.8b, v30.8b, v7.8b //GHASH block 4k+3 - mid + + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 5 + eor x21, x21, x13 //AES block 4k+2 - round 10 low +#ifdef __AARCH64EB__ + rev x21, x21 +#endif + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 5 + movi v8.8b, #0xc2 + + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 3 + eor v11.16b, v11.16b, v29.16b //GHASH block 4k+3 - low + + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 6 + + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 6 + eor v10.16b, v10.16b, v31.16b //GHASH block 4k+2 - mid + + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 4 + stp x21, x22, [x2], #16 //AES block 4k+2 - store result + + pmull v30.1q, v30.1d, v16.1d //GHASH block 4k+3 - mid + eor v9.16b, v9.16b, v4.16b //GHASH block 4k+3 - high + ld1 {v4.16b}, [x0], #16 //AES block 4k+3 - load ciphertext + + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 7 + add w12, w12, #1 //CTR block 4k+7 + + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 7 + shl d8, d8, #56 //mod_constant + + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 5 + eor v10.16b, v10.16b, v30.16b //GHASH block 4k+3 - mid + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 8 + stp x23, x24, [x2], #16 //AES block 4k+3 - store result + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 8 + eor v30.16b, v11.16b, v9.16b //MODULO - karatsuba tidy up + + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 3 + rev w9, w12 //CTR block 4k+8 + + pmull v31.1q, v9.1d, v8.1d //MODULO - top 64b align with mid + ld1 {v5.16b}, [x0], #16 //AES block 4k+4 - load ciphertext + ext v9.16b, v9.16b, v9.16b, #8 //MODULO - other top alignment + + aese v0.16b, v27.16b //AES block 4k+4 - round 9 + orr x9, x11, x9, lsl #32 //CTR block 4k+8 + + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 4 + eor v10.16b, v10.16b, v30.16b //MODULO - karatsuba tidy up + + aese v1.16b, v27.16b //AES block 4k+5 - round 9 + + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 6 + eor v0.16b, v4.16b, v0.16b //AES block 4k+4 - result + + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 5 + ld1 {v6.16b}, [x0], #16 //AES block 4k+5 - load ciphertext + + add w12, w12, #1 //CTR block 4k+8 + eor v10.16b, v10.16b, v31.16b //MODULO - fold into mid + eor v1.16b, v5.16b, v1.16b //AES block 4k+5 - result + + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 7 + ld1 {v7.16b}, [x0], #16 //AES block 4k+6 - load ciphertext + + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 6 + + rev64 v5.16b, v5.16b //GHASH block 4k+5 + eor v10.16b, v10.16b, v9.16b //MODULO - fold into mid + mov x7, v0.d[1] //AES block 4k+4 - mov high + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 8 + mov x6, v0.d[0] //AES block 4k+4 - mov low + + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 7 + fmov d0, x10 //CTR block 4k+8 + + pmull v8.1q, v10.1d, v8.1d //MODULO - mid 64b align with low + fmov v0.d[1], x9 //CTR block 4k+8 + rev w9, w12 //CTR block 4k+9 + + aese v2.16b, v27.16b //AES block 4k+6 - round 9 + orr x9, x11, x9, lsl #32 //CTR block 4k+9 + ext v10.16b, v10.16b, v10.16b, #8 //MODULO - other mid alignment + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 8 + eor x7, x7, x14 //AES block 4k+4 - round 10 high +#ifdef __AARCH64EB__ + rev x7, x7 +#endif + eor v11.16b, v11.16b, v8.16b //MODULO - fold into low + mov x20, v1.d[1] //AES block 4k+5 - mov high + eor x6, x6, x13 //AES block 4k+4 - round 10 low +#ifdef __AARCH64EB__ + rev x6, x6 +#endif + eor v2.16b, v6.16b, v2.16b //AES block 4k+6 - result + mov x19, v1.d[0] //AES block 4k+5 - mov low + add w12, w12, #1 //CTR block 4k+9 + + aese v3.16b, v27.16b //AES block 4k+7 - round 9 + fmov d1, x10 //CTR block 4k+9 + cmp x0, x5 //LOOP CONTROL + + rev64 v4.16b, v4.16b //GHASH block 4k+4 + eor v11.16b, v11.16b, v10.16b //MODULO - fold into low + fmov v1.d[1], x9 //CTR block 4k+9 + + rev w9, w12 //CTR block 4k+10 + add w12, w12, #1 //CTR block 4k+10 + + eor x20, x20, x14 //AES block 4k+5 - round 10 high +#ifdef __AARCH64EB__ + rev x20, x20 +#endif + stp x6, x7, [x2], #16 //AES block 4k+4 - store result + + eor x19, x19, x13 //AES block 4k+5 - round 10 low +#ifdef __AARCH64EB__ + rev x19, x19 +#endif + stp x19, x20, [x2], #16 //AES block 4k+5 - store result + + orr x9, x11, x9, lsl #32 //CTR block 4k+10 + b.lt L128_dec_main_loop + +L128_dec_prepretail: //PREPRETAIL + ext v11.16b, v11.16b, v11.16b, #8 //PRE 0 + mov x21, v2.d[0] //AES block 4k+2 - mov low + mov d30, v5.d[1] //GHASH block 4k+1 - mid + + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 0 + eor v3.16b, v7.16b, v3.16b //AES block 4k+3 - result + + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 0 + mov x22, v2.d[1] //AES block 4k+2 - mov high + + eor v4.16b, v4.16b, v11.16b //PRE 1 + fmov d2, x10 //CTR block 4k+6 + rev64 v6.16b, v6.16b //GHASH block 4k+2 + + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 1 + fmov v2.d[1], x9 //CTR block 4k+6 + + rev w9, w12 //CTR block 4k+7 + mov x23, v3.d[0] //AES block 4k+3 - mov low + eor v30.8b, v30.8b, v5.8b //GHASH block 4k+1 - mid + + pmull v11.1q, v4.1d, v15.1d //GHASH block 4k - low + mov d10, v17.d[1] //GHASH block 4k - mid + mov x24, v3.d[1] //AES block 4k+3 - mov high + + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 1 + mov d31, v6.d[1] //GHASH block 4k+2 - mid + + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 2 + orr x9, x11, x9, lsl #32 //CTR block 4k+7 + + pmull v29.1q, v5.1d, v14.1d //GHASH block 4k+1 - low + mov d8, v4.d[1] //GHASH block 4k - mid + fmov d3, x10 //CTR block 4k+7 + + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 0 + fmov v3.d[1], x9 //CTR block 4k+7 + + pmull v30.1q, v30.1d, v17.1d //GHASH block 4k+1 - mid + eor v31.8b, v31.8b, v6.8b //GHASH block 4k+2 - mid + + rev64 v7.16b, v7.16b //GHASH block 4k+3 + + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 1 + eor v8.8b, v8.8b, v4.8b //GHASH block 4k - mid + + pmull2 v9.1q, v4.2d, v15.2d //GHASH block 4k - high + + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 0 + ins v31.d[1], v31.d[0] //GHASH block 4k+2 - mid + + pmull2 v28.1q, v5.2d, v14.2d //GHASH block 4k+1 - high + + pmull v10.1q, v8.1d, v10.1d //GHASH block 4k - mid + eor v11.16b, v11.16b, v29.16b //GHASH block 4k+1 - low + + pmull v29.1q, v7.1d, v12.1d //GHASH block 4k+3 - low + + pmull2 v31.1q, v31.2d, v16.2d //GHASH block 4k+2 - mid + eor v9.16b, v9.16b, v28.16b //GHASH block 4k+1 - high + + eor v10.16b, v10.16b, v30.16b //GHASH block 4k+1 - mid + + pmull2 v4.1q, v7.2d, v12.2d //GHASH block 4k+3 - high + + pmull2 v8.1q, v6.2d, v13.2d //GHASH block 4k+2 - high + mov d30, v7.d[1] //GHASH block 4k+3 - mid + + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 2 + eor v10.16b, v10.16b, v31.16b //GHASH block 4k+2 - mid + + pmull v28.1q, v6.1d, v13.1d //GHASH block 4k+2 - low + + eor v9.16b, v9.16b, v8.16b //GHASH block 4k+2 - high + movi v8.8b, #0xc2 + + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 1 + eor v30.8b, v30.8b, v7.8b //GHASH block 4k+3 - mid + + eor v11.16b, v11.16b, v28.16b //GHASH block 4k+2 - low + + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 2 + eor v9.16b, v9.16b, v4.16b //GHASH block 4k+3 - high + + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 2 + eor x23, x23, x13 //AES block 4k+3 - round 10 low +#ifdef __AARCH64EB__ + rev x23, x23 +#endif + pmull v30.1q, v30.1d, v16.1d //GHASH block 4k+3 - mid + eor x21, x21, x13 //AES block 4k+2 - round 10 low +#ifdef __AARCH64EB__ + rev x21, x21 +#endif + eor v11.16b, v11.16b, v29.16b //GHASH block 4k+3 - low + + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 3 + + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 3 + shl d8, d8, #56 //mod_constant + + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 3 + + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 4 + eor v10.16b, v10.16b, v30.16b //GHASH block 4k+3 - mid + + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 4 + + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 3 + eor v30.16b, v11.16b, v9.16b //MODULO - karatsuba tidy up + + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 5 + + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 5 + + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 4 + + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 4 + eor v10.16b, v10.16b, v30.16b //MODULO - karatsuba tidy up + + pmull v31.1q, v9.1d, v8.1d //MODULO - top 64b align with mid + + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 6 + ext v9.16b, v9.16b, v9.16b, #8 //MODULO - other top alignment + + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 5 + + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 5 + eor v10.16b, v10.16b, v31.16b //MODULO - fold into mid + + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 7 + + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 6 + + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 6 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 8 + eor v10.16b, v10.16b, v9.16b //MODULO - fold into mid + + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 6 + + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 7 + + aese v1.16b, v27.16b //AES block 4k+5 - round 9 + + pmull v8.1q, v10.1d, v8.1d //MODULO - mid 64b align with low + eor x24, x24, x14 //AES block 4k+3 - round 10 high +#ifdef __AARCH64EB__ + rev x24, x24 +#endif + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 7 + ext v10.16b, v10.16b, v10.16b, #8 //MODULO - other mid alignment + + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 7 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 8 + eor v11.16b, v11.16b, v8.16b //MODULO - fold into low + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 8 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 8 + eor x22, x22, x14 //AES block 4k+2 - round 10 high +#ifdef __AARCH64EB__ + rev x22, x22 +#endif + aese v0.16b, v27.16b //AES block 4k+4 - round 9 + stp x21, x22, [x2], #16 //AES block 4k+2 - store result + + aese v2.16b, v27.16b //AES block 4k+6 - round 9 + add w12, w12, #1 //CTR block 4k+7 + stp x23, x24, [x2], #16 //AES block 4k+3 - store result + + aese v3.16b, v27.16b //AES block 4k+7 - round 9 + eor v11.16b, v11.16b, v10.16b //MODULO - fold into low +L128_dec_tail: //TAIL + + sub x5, x4, x0 //main_end_input_ptr is number of bytes left to process + ld1 { v5.16b}, [x0], #16 //AES block 4k+4 - load ciphertext + + eor v0.16b, v5.16b, v0.16b //AES block 4k+4 - result + + mov x7, v0.d[1] //AES block 4k+4 - mov high + + mov x6, v0.d[0] //AES block 4k+4 - mov low + + cmp x5, #48 + + eor x7, x7, x14 //AES block 4k+4 - round 10 high +#ifdef __AARCH64EB__ + rev x7, x7 +#endif + ext v8.16b, v11.16b, v11.16b, #8 //prepare final partial tag + eor x6, x6, x13 //AES block 4k+4 - round 10 low +#ifdef __AARCH64EB__ + rev x6, x6 +#endif + b.gt L128_dec_blocks_more_than_3 + + mov v3.16b, v2.16b + sub w12, w12, #1 + movi v11.8b, #0 + + movi v9.8b, #0 + mov v2.16b, v1.16b + + movi v10.8b, #0 + cmp x5, #32 + b.gt L128_dec_blocks_more_than_2 + + cmp x5, #16 + + mov v3.16b, v1.16b + sub w12, w12, #1 + b.gt L128_dec_blocks_more_than_1 + + sub w12, w12, #1 + b L128_dec_blocks_less_than_1 +L128_dec_blocks_more_than_3: //blocks left > 3 + rev64 v4.16b, v5.16b //GHASH final-3 block + ld1 { v5.16b}, [x0], #16 //AES final-2 block - load ciphertext + + eor v4.16b, v4.16b, v8.16b //feed in partial tag + + mov d10, v17.d[1] //GHASH final-3 block - mid + stp x6, x7, [x2], #16 //AES final-3 block - store result + eor v0.16b, v5.16b, v1.16b //AES final-2 block - result + + mov d22, v4.d[1] //GHASH final-3 block - mid + mov x7, v0.d[1] //AES final-2 block - mov high + + pmull v11.1q, v4.1d, v15.1d //GHASH final-3 block - low + mov x6, v0.d[0] //AES final-2 block - mov low + + pmull2 v9.1q, v4.2d, v15.2d //GHASH final-3 block - high + + eor v22.8b, v22.8b, v4.8b //GHASH final-3 block - mid + + movi v8.8b, #0 //suppress further partial tag feed in + eor x7, x7, x14 //AES final-2 block - round 10 high +#ifdef __AARCH64EB__ + rev x7, x7 +#endif + pmull v10.1q, v22.1d, v10.1d //GHASH final-3 block - mid + eor x6, x6, x13 //AES final-2 block - round 10 low +#ifdef __AARCH64EB__ + rev x6, x6 +#endif +L128_dec_blocks_more_than_2: //blocks left > 2 + + rev64 v4.16b, v5.16b //GHASH final-2 block + ld1 { v5.16b}, [x0], #16 //AES final-1 block - load ciphertext + + eor v4.16b, v4.16b, v8.16b //feed in partial tag + + eor v0.16b, v5.16b, v2.16b //AES final-1 block - result + stp x6, x7, [x2], #16 //AES final-2 block - store result + + mov d22, v4.d[1] //GHASH final-2 block - mid + + pmull v21.1q, v4.1d, v14.1d //GHASH final-2 block - low + + pmull2 v20.1q, v4.2d, v14.2d //GHASH final-2 block - high + mov x6, v0.d[0] //AES final-1 block - mov low + + mov x7, v0.d[1] //AES final-1 block - mov high + eor v22.8b, v22.8b, v4.8b //GHASH final-2 block - mid + + movi v8.8b, #0 //suppress further partial tag feed in + + pmull v22.1q, v22.1d, v17.1d //GHASH final-2 block - mid + + eor x6, x6, x13 //AES final-1 block - round 10 low +#ifdef __AARCH64EB__ + rev x6, x6 +#endif + eor v11.16b, v11.16b, v21.16b //GHASH final-2 block - low + + eor v9.16b, v9.16b, v20.16b //GHASH final-2 block - high + + eor v10.16b, v10.16b, v22.16b //GHASH final-2 block - mid + eor x7, x7, x14 //AES final-1 block - round 10 high +#ifdef __AARCH64EB__ + rev x7, x7 +#endif +L128_dec_blocks_more_than_1: //blocks left > 1 + + rev64 v4.16b, v5.16b //GHASH final-1 block + + ld1 { v5.16b}, [x0], #16 //AES final block - load ciphertext + eor v4.16b, v4.16b, v8.16b //feed in partial tag + + mov d22, v4.d[1] //GHASH final-1 block - mid + + eor v0.16b, v5.16b, v3.16b //AES final block - result + + eor v22.8b, v22.8b, v4.8b //GHASH final-1 block - mid + + stp x6, x7, [x2], #16 //AES final-1 block - store result + mov x6, v0.d[0] //AES final block - mov low + + mov x7, v0.d[1] //AES final block - mov high + ins v22.d[1], v22.d[0] //GHASH final-1 block - mid + + pmull v21.1q, v4.1d, v13.1d //GHASH final-1 block - low + + pmull2 v20.1q, v4.2d, v13.2d //GHASH final-1 block - high + + pmull2 v22.1q, v22.2d, v16.2d //GHASH final-1 block - mid + movi v8.8b, #0 //suppress further partial tag feed in + + eor v11.16b, v11.16b, v21.16b //GHASH final-1 block - low + + eor v9.16b, v9.16b, v20.16b //GHASH final-1 block - high + eor x7, x7, x14 //AES final block - round 10 high +#ifdef __AARCH64EB__ + rev x7, x7 +#endif + eor x6, x6, x13 //AES final block - round 10 low +#ifdef __AARCH64EB__ + rev x6, x6 +#endif + eor v10.16b, v10.16b, v22.16b //GHASH final-1 block - mid +L128_dec_blocks_less_than_1: //blocks left <= 1 + + mvn x14, xzr //rk10_h = 0xffffffffffffffff + and x1, x1, #127 //bit_length %= 128 + + mvn x13, xzr //rk10_l = 0xffffffffffffffff + sub x1, x1, #128 //bit_length -= 128 + + neg x1, x1 //bit_length = 128 - #bits in input (in range [1,128]) + + and x1, x1, #127 //bit_length %= 128 + + lsr x14, x14, x1 //rk10_h is mask for top 64b of last block + cmp x1, #64 + + csel x10, x14, xzr, lt + csel x9, x13, x14, lt + + fmov d0, x9 //ctr0b is mask for last block + + mov v0.d[1], x10 + + and v5.16b, v5.16b, v0.16b //possibly partial last block has zeroes in highest bits + + rev64 v4.16b, v5.16b //GHASH final block + + eor v4.16b, v4.16b, v8.16b //feed in partial tag + + ldp x4, x5, [x2] //load existing bytes we need to not overwrite + + and x7, x7, x10 + + pmull2 v20.1q, v4.2d, v12.2d //GHASH final block - high + mov d8, v4.d[1] //GHASH final block - mid + + eor v8.8b, v8.8b, v4.8b //GHASH final block - mid + eor v9.16b, v9.16b, v20.16b //GHASH final block - high + + pmull v8.1q, v8.1d, v16.1d //GHASH final block - mid + + pmull v21.1q, v4.1d, v12.1d //GHASH final block - low + bic x4, x4, x9 //mask out low existing bytes + and x6, x6, x9 + +#ifndef __AARCH64EB__ + rev w9, w12 +#else + mov w9, w12 +#endif + + eor v10.16b, v10.16b, v8.16b //GHASH final block - mid + movi v8.8b, #0xc2 + + eor v11.16b, v11.16b, v21.16b //GHASH final block - low + + bic x5, x5, x10 //mask out high existing bytes + shl d8, d8, #56 //mod_constant + + eor v30.16b, v11.16b, v9.16b //MODULO - karatsuba tidy up + + pmull v31.1q, v9.1d, v8.1d //MODULO - top 64b align with mid + + eor v10.16b, v10.16b, v30.16b //MODULO - karatsuba tidy up + + orr x6, x6, x4 + str w9, [x16, #12] //store the updated counter + + orr x7, x7, x5 + stp x6, x7, [x2] + ext v9.16b, v9.16b, v9.16b, #8 //MODULO - other top alignment + + eor v10.16b, v10.16b, v31.16b //MODULO - fold into mid + + eor v10.16b, v10.16b, v9.16b //MODULO - fold into mid + + pmull v8.1q, v10.1d, v8.1d //MODULO - mid 64b align with low + ext v10.16b, v10.16b, v10.16b, #8 //MODULO - other mid alignment + + eor v11.16b, v11.16b, v8.16b //MODULO - fold into low + + eor v11.16b, v11.16b, v10.16b //MODULO - fold into low + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + mov x0, x15 + st1 { v11.16b }, [x3] + + ldp x21, x22, [sp, #16] + ldp x23, x24, [sp, #32] + ldp d8, d9, [sp, #48] + ldp d10, d11, [sp, #64] + ldp d12, d13, [sp, #80] + ldp d14, d15, [sp, #96] + ldp x19, x20, [sp], #112 + ret + +L128_dec_ret: + mov w0, #0x0 + ret + +.globl aes_gcm_enc_192_kernel +.def aes_gcm_enc_192_kernel + .type 32 +.endef +.align 4 +aes_gcm_enc_192_kernel: + AARCH64_VALID_CALL_TARGET + cbz x1, L192_enc_ret + stp x19, x20, [sp, #-112]! + mov x16, x4 + mov x8, x5 + stp x21, x22, [sp, #16] + stp x23, x24, [sp, #32] + stp d8, d9, [sp, #48] + stp d10, d11, [sp, #64] + stp d12, d13, [sp, #80] + stp d14, d15, [sp, #96] + + ldp x10, x11, [x16] //ctr96_b64, ctr96_t32 +#ifdef __AARCH64EB__ + rev x10, x10 + rev x11, x11 +#endif + ldp x13, x14, [x8, #192] //load rk12 +#ifdef __AARCH64EB__ + ror x13, x13, #32 + ror x14, x14, #32 +#endif + ld1 {v18.4s}, [x8], #16 //load rk0 + + ld1 {v19.4s}, [x8], #16 //load rk1 + + ld1 {v20.4s}, [x8], #16 //load rk2 + + lsr x12, x11, #32 + ld1 {v21.4s}, [x8], #16 //load rk3 + orr w11, w11, w11 + + ld1 {v22.4s}, [x8], #16 //load rk4 + rev w12, w12 //rev_ctr32 + + add w12, w12, #1 //increment rev_ctr32 + fmov d3, x10 //CTR block 3 + + rev w9, w12 //CTR block 1 + add w12, w12, #1 //CTR block 1 + fmov d1, x10 //CTR block 1 + + orr x9, x11, x9, lsl #32 //CTR block 1 + ld1 { v0.16b}, [x16] //special case vector load initial counter so we can start first AES block as quickly as possible + + fmov v1.d[1], x9 //CTR block 1 + rev w9, w12 //CTR block 2 + add w12, w12, #1 //CTR block 2 + + fmov d2, x10 //CTR block 2 + orr x9, x11, x9, lsl #32 //CTR block 2 + + fmov v2.d[1], x9 //CTR block 2 + rev w9, w12 //CTR block 3 + + orr x9, x11, x9, lsl #32 //CTR block 3 + ld1 {v23.4s}, [x8], #16 //load rk5 + + fmov v3.d[1], x9 //CTR block 3 + + ld1 {v24.4s}, [x8], #16 //load rk6 + + ld1 {v25.4s}, [x8], #16 //load rk7 + + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b //AES block 0 - round 0 + ld1 { v11.16b}, [x3] + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b //AES block 3 - round 0 + ld1 {v26.4s}, [x8], #16 //load rk8 + + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b //AES block 1 - round 0 + ldr q15, [x3, #112] //load h4l | h4h +#ifndef __AARCH64EB__ + ext v15.16b, v15.16b, v15.16b, #8 +#endif + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b //AES block 2 - round 0 + ld1 {v27.4s}, [x8], #16 //load rk9 + + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b //AES block 0 - round 1 + ld1 {v28.4s}, [x8], #16 //load rk10 + + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b //AES block 1 - round 1 + ldr q12, [x3, #32] //load h1l | h1h +#ifndef __AARCH64EB__ + ext v12.16b, v12.16b, v12.16b, #8 +#endif + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b //AES block 2 - round 1 + ld1 {v29.4s}, [x8], #16 //load rk11 + + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b //AES block 3 - round 1 + ldr q14, [x3, #80] //load h3l | h3h +#ifndef __AARCH64EB__ + ext v14.16b, v14.16b, v14.16b, #8 +#endif + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b //AES block 0 - round 2 + + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b //AES block 2 - round 2 + + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b //AES block 3 - round 2 + + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b //AES block 0 - round 3 + trn1 v9.2d, v14.2d, v15.2d //h4h | h3h + + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b //AES block 2 - round 3 + + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b //AES block 1 - round 2 + trn2 v17.2d, v14.2d, v15.2d //h4l | h3l + + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b //AES block 0 - round 4 + + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b //AES block 3 - round 3 + + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b //AES block 1 - round 3 + + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b //AES block 0 - round 5 + + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b //AES block 2 - round 4 + + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b //AES block 1 - round 4 + + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b //AES block 0 - round 6 + + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b //AES block 3 - round 4 + + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b //AES block 2 - round 5 + + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b //AES block 1 - round 5 + + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b //AES block 3 - round 5 + + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b //AES block 2 - round 6 + ldr q13, [x3, #64] //load h2l | h2h +#ifndef __AARCH64EB__ + ext v13.16b, v13.16b, v13.16b, #8 +#endif + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b //AES block 1 - round 6 + + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b //AES block 3 - round 6 + + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b //AES block 0 - round 7 + + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b //AES block 1 - round 7 + trn2 v16.2d, v12.2d, v13.2d //h2l | h1l + + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b //AES block 3 - round 7 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 8 + + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b //AES block 2 - round 7 + trn1 v8.2d, v12.2d, v13.2d //h2h | h1h + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 8 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 8 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 8 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 9 + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 9 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 9 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 9 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 10 + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 10 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 10 + lsr x5, x1, #3 //byte_len + mov x15, x5 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 10 + sub x5, x5, #1 //byte_len - 1 + + eor v16.16b, v16.16b, v8.16b //h2k | h1k + and x5, x5, #0xffffffffffffffc0 //number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + + eor v17.16b, v17.16b, v9.16b //h4k | h3k + + aese v2.16b, v29.16b //AES block 2 - round 11 + add x4, x0, x1, lsr #3 //end_input_ptr + add x5, x5, x0 + + aese v1.16b, v29.16b //AES block 1 - round 11 + cmp x0, x5 //check if we have <= 4 blocks + + aese v0.16b, v29.16b //AES block 0 - round 11 + add w12, w12, #1 //CTR block 3 + + aese v3.16b, v29.16b //AES block 3 - round 11 + b.ge L192_enc_tail //handle tail + + rev w9, w12 //CTR block 4 + ldp x6, x7, [x0, #0] //AES block 0 - load plaintext +#ifdef __AARCH64EB__ + rev x6, x6 + rev x7, x7 +#endif + orr x9, x11, x9, lsl #32 //CTR block 4 + ldp x21, x22, [x0, #32] //AES block 2 - load plaintext +#ifdef __AARCH64EB__ + rev x21, x21 + rev x22, x22 +#endif + ldp x23, x24, [x0, #48] //AES block 3 - load plaintext +#ifdef __AARCH64EB__ + rev x23, x23 + rev x24, x24 +#endif + ldp x19, x20, [x0, #16] //AES block 1 - load plaintext +#ifdef __AARCH64EB__ + rev x19, x19 + rev x20, x20 +#endif + add x0, x0, #64 //AES input_ptr update + cmp x0, x5 //check if we have <= 8 blocks + + eor x6, x6, x13 //AES block 0 - round 12 low + + eor x7, x7, x14 //AES block 0 - round 12 high + eor x22, x22, x14 //AES block 2 - round 12 high + fmov d4, x6 //AES block 0 - mov low + + eor x24, x24, x14 //AES block 3 - round 12 high + fmov v4.d[1], x7 //AES block 0 - mov high + + eor x21, x21, x13 //AES block 2 - round 12 low + eor x19, x19, x13 //AES block 1 - round 12 low + + fmov d5, x19 //AES block 1 - mov low + eor x20, x20, x14 //AES block 1 - round 12 high + + fmov v5.d[1], x20 //AES block 1 - mov high + + eor x23, x23, x13 //AES block 3 - round 12 low + fmov d6, x21 //AES block 2 - mov low + + add w12, w12, #1 //CTR block 4 + eor v4.16b, v4.16b, v0.16b //AES block 0 - result + fmov d0, x10 //CTR block 4 + + fmov v0.d[1], x9 //CTR block 4 + rev w9, w12 //CTR block 5 + + orr x9, x11, x9, lsl #32 //CTR block 5 + add w12, w12, #1 //CTR block 5 + + fmov d7, x23 //AES block 3 - mov low + st1 { v4.16b}, [x2], #16 //AES block 0 - store result + + fmov v6.d[1], x22 //AES block 2 - mov high + + eor v5.16b, v5.16b, v1.16b //AES block 1 - result + fmov d1, x10 //CTR block 5 + st1 { v5.16b}, [x2], #16 //AES block 1 - store result + + fmov v7.d[1], x24 //AES block 3 - mov high + + fmov v1.d[1], x9 //CTR block 5 + rev w9, w12 //CTR block 6 + + orr x9, x11, x9, lsl #32 //CTR block 6 + + add w12, w12, #1 //CTR block 6 + eor v6.16b, v6.16b, v2.16b //AES block 2 - result + fmov d2, x10 //CTR block 6 + + fmov v2.d[1], x9 //CTR block 6 + rev w9, w12 //CTR block 7 + + orr x9, x11, x9, lsl #32 //CTR block 7 + st1 { v6.16b}, [x2], #16 //AES block 2 - store result + + eor v7.16b, v7.16b, v3.16b //AES block 3 - result + st1 { v7.16b}, [x2], #16 //AES block 3 - store result + b.ge L192_enc_prepretail //do prepretail + +L192_enc_main_loop: //main loop start + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 0 + rev64 v5.16b, v5.16b //GHASH block 4k+1 (t0 and t1 free) + + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 0 + ldp x19, x20, [x0, #16] //AES block 4k+5 - load plaintext +#ifdef __AARCH64EB__ + rev x19, x19 + rev x20, x20 +#endif + ext v11.16b, v11.16b, v11.16b, #8 //PRE 0 + fmov d3, x10 //CTR block 4k+3 + rev64 v4.16b, v4.16b //GHASH block 4k (only t0 is free) + + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 1 + fmov v3.d[1], x9 //CTR block 4k+3 + + pmull2 v30.1q, v5.2d, v14.2d //GHASH block 4k+1 - high + rev64 v7.16b, v7.16b //GHASH block 4k+3 (t0, t1, t2 and t3 free) + ldp x21, x22, [x0, #32] //AES block 4k+6 - load plaintext +#ifdef __AARCH64EB__ + rev x21, x21 + rev x22, x22 +#endif + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 0 + ldp x23, x24, [x0, #48] //AES block 4k+3 - load plaintext +#ifdef __AARCH64EB__ + rev x23, x23 + rev x24, x24 +#endif + pmull v31.1q, v5.1d, v14.1d //GHASH block 4k+1 - low + eor v4.16b, v4.16b, v11.16b //PRE 1 + + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 1 + + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 1 + rev64 v6.16b, v6.16b //GHASH block 4k+2 (t0, t1, and t2 free) + + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 0 + eor x24, x24, x14 //AES block 4k+3 - round 12 high + + pmull v11.1q, v4.1d, v15.1d //GHASH block 4k - low + mov d8, v4.d[1] //GHASH block 4k - mid + + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 2 + + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 1 + eor x21, x21, x13 //AES block 4k+6 - round 12 low + + eor v8.8b, v8.8b, v4.8b //GHASH block 4k - mid + eor v11.16b, v11.16b, v31.16b //GHASH block 4k+1 - low + + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 3 + eor x19, x19, x13 //AES block 4k+5 - round 12 low + + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 2 + mov d31, v6.d[1] //GHASH block 4k+2 - mid + + pmull2 v9.1q, v4.2d, v15.2d //GHASH block 4k - high + mov d4, v5.d[1] //GHASH block 4k+1 - mid + + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 2 + + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 3 + + mov d10, v17.d[1] //GHASH block 4k - mid + eor v9.16b, v9.16b, v30.16b //GHASH block 4k+1 - high + + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 2 + eor v31.8b, v31.8b, v6.8b //GHASH block 4k+2 - mid + + pmull2 v30.1q, v6.2d, v13.2d //GHASH block 4k+2 - high + + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 4 + eor v4.8b, v4.8b, v5.8b //GHASH block 4k+1 - mid + + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 3 + + pmull2 v5.1q, v7.2d, v12.2d //GHASH block 4k+3 - high + eor x20, x20, x14 //AES block 4k+5 - round 12 high + ins v31.d[1], v31.d[0] //GHASH block 4k+2 - mid + + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 5 + add w12, w12, #1 //CTR block 4k+3 + + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 4 + eor v9.16b, v9.16b, v30.16b //GHASH block 4k+2 - high + + pmull v4.1q, v4.1d, v17.1d //GHASH block 4k+1 - mid + eor x22, x22, x14 //AES block 4k+6 - round 12 high + + pmull2 v31.1q, v31.2d, v16.2d //GHASH block 4k+2 - mid + eor x23, x23, x13 //AES block 4k+3 - round 12 low + mov d30, v7.d[1] //GHASH block 4k+3 - mid + + pmull v10.1q, v8.1d, v10.1d //GHASH block 4k - mid + rev w9, w12 //CTR block 4k+8 + + pmull v8.1q, v6.1d, v13.1d //GHASH block 4k+2 - low + orr x9, x11, x9, lsl #32 //CTR block 4k+8 + + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 3 + eor v30.8b, v30.8b, v7.8b //GHASH block 4k+3 - mid + + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 4 + ldp x6, x7, [x0, #0] //AES block 4k+4 - load plaintext +#ifdef __AARCH64EB__ + rev x6, x6 + rev x7, x7 +#endif + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 6 + eor v11.16b, v11.16b, v8.16b //GHASH block 4k+2 - low + + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 4 + add x0, x0, #64 //AES input_ptr update + + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 5 + movi v8.8b, #0xc2 + + pmull v6.1q, v7.1d, v12.1d //GHASH block 4k+3 - low + eor x7, x7, x14 //AES block 4k+4 - round 12 high + eor v10.16b, v10.16b, v4.16b //GHASH block 4k+1 - mid + + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 5 + eor x6, x6, x13 //AES block 4k+4 - round 12 low + + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 6 + shl d8, d8, #56 //mod_constant + + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 5 + eor v9.16b, v9.16b, v5.16b //GHASH block 4k+3 - high + + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 7 + fmov d5, x19 //AES block 4k+5 - mov low + + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 7 + eor v10.16b, v10.16b, v31.16b //GHASH block 4k+2 - mid + + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 6 + fmov v5.d[1], x20 //AES block 4k+5 - mov high + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 8 + eor v11.16b, v11.16b, v6.16b //GHASH block 4k+3 - low + + pmull v30.1q, v30.1d, v16.1d //GHASH block 4k+3 - mid + cmp x0, x5 //LOOP CONTROL + fmov d4, x6 //AES block 4k+4 - mov low + + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 6 + fmov v4.d[1], x7 //AES block 4k+4 - mov high + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 8 + fmov d7, x23 //AES block 4k+3 - mov low + + eor v10.16b, v10.16b, v30.16b //GHASH block 4k+3 - mid + eor v30.16b, v11.16b, v9.16b //MODULO - karatsuba tidy up + add w12, w12, #1 //CTR block 4k+8 + + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 7 + fmov v7.d[1], x24 //AES block 4k+3 - mov high + + pmull v31.1q, v9.1d, v8.1d //MODULO - top 64b align with mid + ext v9.16b, v9.16b, v9.16b, #8 //MODULO - other top alignment + fmov d6, x21 //AES block 4k+6 - mov low + + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 7 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 9 + eor v10.16b, v10.16b, v30.16b //MODULO - karatsuba tidy up + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 8 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 8 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 9 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 10 + eor v10.16b, v10.16b, v31.16b //MODULO - fold into mid + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 9 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 9 + + aese v0.16b, v29.16b //AES block 4k+4 - round 11 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 10 + eor v10.16b, v10.16b, v9.16b //MODULO - fold into mid + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 10 + + eor v4.16b, v4.16b, v0.16b //AES block 4k+4 - result + fmov d0, x10 //CTR block 4k+8 + + aese v1.16b, v29.16b //AES block 4k+5 - round 11 + fmov v0.d[1], x9 //CTR block 4k+8 + rev w9, w12 //CTR block 4k+9 + + pmull v9.1q, v10.1d, v8.1d //MODULO - mid 64b align with low + fmov v6.d[1], x22 //AES block 4k+6 - mov high + st1 { v4.16b}, [x2], #16 //AES block 4k+4 - store result + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 10 + orr x9, x11, x9, lsl #32 //CTR block 4k+9 + + eor v5.16b, v5.16b, v1.16b //AES block 4k+5 - result + add w12, w12, #1 //CTR block 4k+9 + fmov d1, x10 //CTR block 4k+9 + + aese v2.16b, v29.16b //AES block 4k+6 - round 11 + fmov v1.d[1], x9 //CTR block 4k+9 + rev w9, w12 //CTR block 4k+10 + + add w12, w12, #1 //CTR block 4k+10 + ext v10.16b, v10.16b, v10.16b, #8 //MODULO - other mid alignment + orr x9, x11, x9, lsl #32 //CTR block 4k+10 + + st1 { v5.16b}, [x2], #16 //AES block 4k+5 - store result + eor v11.16b, v11.16b, v9.16b //MODULO - fold into low + + aese v3.16b, v29.16b //AES block 4k+7 - round 11 + eor v6.16b, v6.16b, v2.16b //AES block 4k+6 - result + fmov d2, x10 //CTR block 4k+10 + + st1 { v6.16b}, [x2], #16 //AES block 4k+6 - store result + fmov v2.d[1], x9 //CTR block 4k+10 + rev w9, w12 //CTR block 4k+11 + + eor v11.16b, v11.16b, v10.16b //MODULO - fold into low + orr x9, x11, x9, lsl #32 //CTR block 4k+11 + + eor v7.16b, v7.16b, v3.16b //AES block 4k+3 - result + st1 { v7.16b}, [x2], #16 //AES block 4k+3 - store result + b.lt L192_enc_main_loop + +L192_enc_prepretail: //PREPRETAIL + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 0 + rev64 v4.16b, v4.16b //GHASH block 4k (only t0 is free) + + fmov d3, x10 //CTR block 4k+3 + ext v11.16b, v11.16b, v11.16b, #8 //PRE 0 + add w12, w12, #1 //CTR block 4k+3 + + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 0 + rev64 v5.16b, v5.16b //GHASH block 4k+1 (t0 and t1 free) + + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 0 + + fmov v3.d[1], x9 //CTR block 4k+3 + eor v4.16b, v4.16b, v11.16b //PRE 1 + mov d10, v17.d[1] //GHASH block 4k - mid + + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 1 + rev64 v6.16b, v6.16b //GHASH block 4k+2 (t0, t1, and t2 free) + + pmull2 v30.1q, v5.2d, v14.2d //GHASH block 4k+1 - high + + pmull v11.1q, v4.1d, v15.1d //GHASH block 4k - low + mov d8, v4.d[1] //GHASH block 4k - mid + + pmull v31.1q, v5.1d, v14.1d //GHASH block 4k+1 - low + rev64 v7.16b, v7.16b //GHASH block 4k+3 (t0, t1, t2 and t3 free) + + pmull2 v9.1q, v4.2d, v15.2d //GHASH block 4k - high + + eor v8.8b, v8.8b, v4.8b //GHASH block 4k - mid + mov d4, v5.d[1] //GHASH block 4k+1 - mid + + eor v11.16b, v11.16b, v31.16b //GHASH block 4k+1 - low + mov d31, v6.d[1] //GHASH block 4k+2 - mid + + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 0 + eor v9.16b, v9.16b, v30.16b //GHASH block 4k+1 - high + + pmull2 v30.1q, v6.2d, v13.2d //GHASH block 4k+2 - high + + eor v4.8b, v4.8b, v5.8b //GHASH block 4k+1 - mid + eor v31.8b, v31.8b, v6.8b //GHASH block 4k+2 - mid + + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 1 + + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 1 + eor v9.16b, v9.16b, v30.16b //GHASH block 4k+2 - high + + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 1 + + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 2 + mov d30, v7.d[1] //GHASH block 4k+3 - mid + + pmull2 v5.1q, v7.2d, v12.2d //GHASH block 4k+3 - high + ins v31.d[1], v31.d[0] //GHASH block 4k+2 - mid + + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 2 + + pmull v10.1q, v8.1d, v10.1d //GHASH block 4k - mid + eor v30.8b, v30.8b, v7.8b //GHASH block 4k+3 - mid + + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 3 + + pmull2 v31.1q, v31.2d, v16.2d //GHASH block 4k+2 - mid + + pmull v4.1q, v4.1d, v17.1d //GHASH block 4k+1 - mid + + pmull v30.1q, v30.1d, v16.1d //GHASH block 4k+3 - mid + eor v9.16b, v9.16b, v5.16b //GHASH block 4k+3 - high + + pmull v8.1q, v6.1d, v13.1d //GHASH block 4k+2 - low + + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 3 + eor v10.16b, v10.16b, v4.16b //GHASH block 4k+1 - mid + + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 2 + + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 2 + eor v11.16b, v11.16b, v8.16b //GHASH block 4k+2 - low + + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 4 + + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 3 + eor v10.16b, v10.16b, v31.16b //GHASH block 4k+2 - mid + + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 3 + + pmull v6.1q, v7.1d, v12.1d //GHASH block 4k+3 - low + movi v8.8b, #0xc2 + + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 4 + + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 4 + + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 4 + eor v10.16b, v10.16b, v30.16b //GHASH block 4k+3 - mid + + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 5 + + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 5 + + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 5 + eor v11.16b, v11.16b, v6.16b //GHASH block 4k+3 - low + + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 5 + + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 6 + eor v10.16b, v10.16b, v9.16b //karatsuba tidy up + + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 6 + + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 6 + shl d8, d8, #56 //mod_constant + + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 7 + + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 7 + eor v10.16b, v10.16b, v11.16b + + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 7 + + pmull v30.1q, v9.1d, v8.1d + + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 6 + ext v9.16b, v9.16b, v9.16b, #8 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 8 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 8 + eor v10.16b, v10.16b, v30.16b + + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 7 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 8 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 9 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 8 + eor v10.16b, v10.16b, v9.16b + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 9 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 9 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 9 + + pmull v30.1q, v10.1d, v8.1d + + ext v10.16b, v10.16b, v10.16b, #8 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 10 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 10 + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 10 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 10 + eor v11.16b, v11.16b, v30.16b + + aese v0.16b, v29.16b //AES block 4k+4 - round 11 + + aese v3.16b, v29.16b //AES block 4k+7 - round 11 + + aese v2.16b, v29.16b //AES block 4k+6 - round 11 + + aese v1.16b, v29.16b //AES block 4k+5 - round 11 + eor v11.16b, v11.16b, v10.16b +L192_enc_tail: //TAIL + + sub x5, x4, x0 //main_end_input_ptr is number of bytes left to process + ldp x6, x7, [x0], #16 //AES block 4k+4 - load plaintext +#ifdef __AARCH64EB__ + rev x6, x6 + rev x7, x7 +#endif + eor x6, x6, x13 //AES block 4k+4 - round 12 low + eor x7, x7, x14 //AES block 4k+4 - round 12 high + + fmov d4, x6 //AES block 4k+4 - mov low + + fmov v4.d[1], x7 //AES block 4k+4 - mov high + cmp x5, #48 + + eor v5.16b, v4.16b, v0.16b //AES block 4k+4 - result + + ext v8.16b, v11.16b, v11.16b, #8 //prepare final partial tag + b.gt L192_enc_blocks_more_than_3 + + sub w12, w12, #1 + movi v10.8b, #0 + + mov v3.16b, v2.16b + movi v9.8b, #0 + cmp x5, #32 + + mov v2.16b, v1.16b + movi v11.8b, #0 + b.gt L192_enc_blocks_more_than_2 + + sub w12, w12, #1 + + mov v3.16b, v1.16b + cmp x5, #16 + b.gt L192_enc_blocks_more_than_1 + + sub w12, w12, #1 + b L192_enc_blocks_less_than_1 +L192_enc_blocks_more_than_3: //blocks left > 3 + st1 { v5.16b}, [x2], #16 //AES final-3 block - store result + + ldp x6, x7, [x0], #16 //AES final-2 block - load input low & high +#ifdef __AARCH64EB__ + rev x6, x6 + rev x7, x7 +#endif + rev64 v4.16b, v5.16b //GHASH final-3 block + + eor x6, x6, x13 //AES final-2 block - round 12 low + eor v4.16b, v4.16b, v8.16b //feed in partial tag + + eor x7, x7, x14 //AES final-2 block - round 12 high + fmov d5, x6 //AES final-2 block - mov low + + fmov v5.d[1], x7 //AES final-2 block - mov high + + mov d22, v4.d[1] //GHASH final-3 block - mid + + pmull v11.1q, v4.1d, v15.1d //GHASH final-3 block - low + + mov d10, v17.d[1] //GHASH final-3 block - mid + + eor v22.8b, v22.8b, v4.8b //GHASH final-3 block - mid + + movi v8.8b, #0 //suppress further partial tag feed in + + pmull2 v9.1q, v4.2d, v15.2d //GHASH final-3 block - high + + pmull v10.1q, v22.1d, v10.1d //GHASH final-3 block - mid + eor v5.16b, v5.16b, v1.16b //AES final-2 block - result +L192_enc_blocks_more_than_2: //blocks left > 2 + + st1 { v5.16b}, [x2], #16 //AES final-2 block - store result + + rev64 v4.16b, v5.16b //GHASH final-2 block + ldp x6, x7, [x0], #16 //AES final-1 block - load input low & high +#ifdef __AARCH64EB__ + rev x6, x6 + rev x7, x7 +#endif + eor v4.16b, v4.16b, v8.16b //feed in partial tag + + eor x7, x7, x14 //AES final-1 block - round 12 high + + pmull2 v20.1q, v4.2d, v14.2d //GHASH final-2 block - high + mov d22, v4.d[1] //GHASH final-2 block - mid + + pmull v21.1q, v4.1d, v14.1d //GHASH final-2 block - low + eor x6, x6, x13 //AES final-1 block - round 12 low + + fmov d5, x6 //AES final-1 block - mov low + + fmov v5.d[1], x7 //AES final-1 block - mov high + eor v9.16b, v9.16b, v20.16b //GHASH final-2 block - high + eor v22.8b, v22.8b, v4.8b //GHASH final-2 block - mid + + eor v11.16b, v11.16b, v21.16b //GHASH final-2 block - low + + pmull v22.1q, v22.1d, v17.1d //GHASH final-2 block - mid + + movi v8.8b, #0 //suppress further partial tag feed in + + eor v5.16b, v5.16b, v2.16b //AES final-1 block - result + + eor v10.16b, v10.16b, v22.16b //GHASH final-2 block - mid +L192_enc_blocks_more_than_1: //blocks left > 1 + + st1 { v5.16b}, [x2], #16 //AES final-1 block - store result + + ldp x6, x7, [x0], #16 //AES final block - load input low & high +#ifdef __AARCH64EB__ + rev x6, x6 + rev x7, x7 +#endif + rev64 v4.16b, v5.16b //GHASH final-1 block + + eor x6, x6, x13 //AES final block - round 12 low + eor v4.16b, v4.16b, v8.16b //feed in partial tag + movi v8.8b, #0 //suppress further partial tag feed in + + mov d22, v4.d[1] //GHASH final-1 block - mid + + eor v22.8b, v22.8b, v4.8b //GHASH final-1 block - mid + eor x7, x7, x14 //AES final block - round 12 high + fmov d5, x6 //AES final block - mov low + + pmull2 v20.1q, v4.2d, v13.2d //GHASH final-1 block - high + fmov v5.d[1], x7 //AES final block - mov high + + ins v22.d[1], v22.d[0] //GHASH final-1 block - mid + + eor v9.16b, v9.16b, v20.16b //GHASH final-1 block - high + + pmull v21.1q, v4.1d, v13.1d //GHASH final-1 block - low + + pmull2 v22.1q, v22.2d, v16.2d //GHASH final-1 block - mid + + eor v5.16b, v5.16b, v3.16b //AES final block - result + + eor v11.16b, v11.16b, v21.16b //GHASH final-1 block - low + + eor v10.16b, v10.16b, v22.16b //GHASH final-1 block - mid +L192_enc_blocks_less_than_1: //blocks left <= 1 + + ld1 { v18.16b}, [x2] //load existing bytes where the possibly partial last block is to be stored +#ifndef __AARCH64EB__ + rev w9, w12 +#else + mov w9, w12 +#endif + and x1, x1, #127 //bit_length %= 128 + + sub x1, x1, #128 //bit_length -= 128 + mvn x14, xzr //rk12_h = 0xffffffffffffffff + + neg x1, x1 //bit_length = 128 - #bits in input (in range [1,128]) + mvn x13, xzr //rk12_l = 0xffffffffffffffff + + and x1, x1, #127 //bit_length %= 128 + + lsr x14, x14, x1 //rk12_h is mask for top 64b of last block + cmp x1, #64 + + csel x6, x13, x14, lt + csel x7, x14, xzr, lt + + fmov d0, x6 //ctr0b is mask for last block + + fmov v0.d[1], x7 + + and v5.16b, v5.16b, v0.16b //possibly partial last block has zeroes in highest bits + + rev64 v4.16b, v5.16b //GHASH final block + + eor v4.16b, v4.16b, v8.16b //feed in partial tag + + mov d8, v4.d[1] //GHASH final block - mid + + pmull v21.1q, v4.1d, v12.1d //GHASH final block - low + + pmull2 v20.1q, v4.2d, v12.2d //GHASH final block - high + + eor v8.8b, v8.8b, v4.8b //GHASH final block - mid + + eor v11.16b, v11.16b, v21.16b //GHASH final block - low + + eor v9.16b, v9.16b, v20.16b //GHASH final block - high + + pmull v8.1q, v8.1d, v16.1d //GHASH final block - mid + + eor v10.16b, v10.16b, v8.16b //GHASH final block - mid + movi v8.8b, #0xc2 + + eor v30.16b, v11.16b, v9.16b //MODULO - karatsuba tidy up + + shl d8, d8, #56 //mod_constant + + bif v5.16b, v18.16b, v0.16b //insert existing bytes in top end of result before storing + + eor v10.16b, v10.16b, v30.16b //MODULO - karatsuba tidy up + + pmull v31.1q, v9.1d, v8.1d //MODULO - top 64b align with mid + + ext v9.16b, v9.16b, v9.16b, #8 //MODULO - other top alignment + + eor v10.16b, v10.16b, v31.16b //MODULO - fold into mid + + eor v10.16b, v10.16b, v9.16b //MODULO - fold into mid + + pmull v9.1q, v10.1d, v8.1d //MODULO - mid 64b align with low + + ext v10.16b, v10.16b, v10.16b, #8 //MODULO - other mid alignment + + eor v11.16b, v11.16b, v9.16b //MODULO - fold into low + str w9, [x16, #12] //store the updated counter + + st1 { v5.16b}, [x2] //store all 16B + + eor v11.16b, v11.16b, v10.16b //MODULO - fold into low + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + mov x0, x15 + st1 { v11.16b }, [x3] + + ldp x21, x22, [sp, #16] + ldp x23, x24, [sp, #32] + ldp d8, d9, [sp, #48] + ldp d10, d11, [sp, #64] + ldp d12, d13, [sp, #80] + ldp d14, d15, [sp, #96] + ldp x19, x20, [sp], #112 + ret + +L192_enc_ret: + mov w0, #0x0 + ret + +.globl aes_gcm_dec_192_kernel +.def aes_gcm_dec_192_kernel + .type 32 +.endef +.align 4 +aes_gcm_dec_192_kernel: + AARCH64_VALID_CALL_TARGET + cbz x1, L192_dec_ret + stp x19, x20, [sp, #-112]! + mov x16, x4 + mov x8, x5 + stp x21, x22, [sp, #16] + stp x23, x24, [sp, #32] + stp d8, d9, [sp, #48] + stp d10, d11, [sp, #64] + stp d12, d13, [sp, #80] + stp d14, d15, [sp, #96] + + add x4, x0, x1, lsr #3 //end_input_ptr + ldp x10, x11, [x16] //ctr96_b64, ctr96_t32 +#ifdef __AARCH64EB__ + rev x10, x10 + rev x11, x11 +#endif + ldp x13, x14, [x8, #192] //load rk12 +#ifdef __AARCH64EB__ + ror x13, x13, #32 + ror x14, x14, #32 +#endif + ld1 { v0.16b}, [x16] //special case vector load initial counter so we can start first AES block as quickly as possible + + ld1 {v18.4s}, [x8], #16 //load rk0 + + lsr x5, x1, #3 //byte_len + mov x15, x5 + ld1 {v19.4s}, [x8], #16 //load rk1 + + lsr x12, x11, #32 + orr w11, w11, w11 + fmov d3, x10 //CTR block 3 + + rev w12, w12 //rev_ctr32 + fmov d1, x10 //CTR block 1 + + add w12, w12, #1 //increment rev_ctr32 + ld1 {v20.4s}, [x8], #16 //load rk2 + + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b //AES block 0 - round 0 + rev w9, w12 //CTR block 1 + + add w12, w12, #1 //CTR block 1 + orr x9, x11, x9, lsl #32 //CTR block 1 + ld1 {v21.4s}, [x8], #16 //load rk3 + + fmov v1.d[1], x9 //CTR block 1 + rev w9, w12 //CTR block 2 + add w12, w12, #1 //CTR block 2 + + fmov d2, x10 //CTR block 2 + orr x9, x11, x9, lsl #32 //CTR block 2 + + fmov v2.d[1], x9 //CTR block 2 + rev w9, w12 //CTR block 3 + + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b //AES block 0 - round 1 + orr x9, x11, x9, lsl #32 //CTR block 3 + + fmov v3.d[1], x9 //CTR block 3 + + ld1 {v22.4s}, [x8], #16 //load rk4 + + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b //AES block 0 - round 2 + + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b //AES block 2 - round 0 + ld1 {v23.4s}, [x8], #16 //load rk5 + + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b //AES block 1 - round 0 + ldr q15, [x3, #112] //load h4l | h4h +#ifndef __AARCH64EB__ + ext v15.16b, v15.16b, v15.16b, #8 +#endif + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b //AES block 3 - round 0 + ldr q13, [x3, #64] //load h2l | h2h +#ifndef __AARCH64EB__ + ext v13.16b, v13.16b, v13.16b, #8 +#endif + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b //AES block 2 - round 1 + ldr q14, [x3, #80] //load h3l | h3h +#ifndef __AARCH64EB__ + ext v14.16b, v14.16b, v14.16b, #8 +#endif + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b //AES block 1 - round 1 + + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b //AES block 3 - round 1 + ldr q12, [x3, #32] //load h1l | h1h +#ifndef __AARCH64EB__ + ext v12.16b, v12.16b, v12.16b, #8 +#endif + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b //AES block 2 - round 2 + ld1 {v24.4s}, [x8], #16 //load rk6 + + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b //AES block 0 - round 3 + ld1 {v25.4s}, [x8], #16 //load rk7 + + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b //AES block 1 - round 2 + ld1 {v26.4s}, [x8], #16 //load rk8 + + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b //AES block 3 - round 2 + ld1 {v27.4s}, [x8], #16 //load rk9 + + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b //AES block 2 - round 3 + ld1 { v11.16b}, [x3] + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b //AES block 1 - round 3 + add w12, w12, #1 //CTR block 3 + + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b //AES block 3 - round 3 + trn1 v9.2d, v14.2d, v15.2d //h4h | h3h + + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b //AES block 0 - round 4 + ld1 {v28.4s}, [x8], #16 //load rk10 + + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b //AES block 1 - round 4 + trn2 v17.2d, v14.2d, v15.2d //h4l | h3l + + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b //AES block 2 - round 4 + + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b //AES block 3 - round 4 + trn2 v16.2d, v12.2d, v13.2d //h2l | h1l + + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b //AES block 0 - round 5 + ld1 {v29.4s}, [x8], #16 //load rk11 + + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b //AES block 1 - round 5 + + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b //AES block 2 - round 5 + + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b //AES block 3 - round 5 + + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b //AES block 0 - round 6 + + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b //AES block 2 - round 6 + + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b //AES block 3 - round 6 + + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b //AES block 0 - round 7 + + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b //AES block 2 - round 7 + + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b //AES block 3 - round 7 + + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b //AES block 1 - round 6 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 8 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 8 + + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b //AES block 1 - round 7 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 9 + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 9 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 8 + sub x5, x5, #1 //byte_len - 1 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 8 + and x5, x5, #0xffffffffffffffc0 //number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 10 + add x5, x5, x0 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 9 + cmp x0, x5 //check if we have <= 4 blocks + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 9 + trn1 v8.2d, v12.2d, v13.2d //h2h | h1h + + aese v3.16b, v29.16b //AES block 3 - round 11 + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 10 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 10 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 10 + eor v16.16b, v16.16b, v8.16b //h2k | h1k + + aese v2.16b, v29.16b //AES block 2 - round 11 + + aese v1.16b, v29.16b //AES block 1 - round 11 + eor v17.16b, v17.16b, v9.16b //h4k | h3k + + aese v0.16b, v29.16b //AES block 0 - round 11 + b.ge L192_dec_tail //handle tail + + ld1 {v4.16b, v5.16b}, [x0], #32 //AES block 0,1 - load ciphertext + + eor v1.16b, v5.16b, v1.16b //AES block 1 - result + + eor v0.16b, v4.16b, v0.16b //AES block 0 - result + rev w9, w12 //CTR block 4 + ld1 {v6.16b, v7.16b}, [x0], #32 //AES block 2,3 - load ciphertext + + mov x19, v1.d[0] //AES block 1 - mov low + + mov x20, v1.d[1] //AES block 1 - mov high + + mov x6, v0.d[0] //AES block 0 - mov low + orr x9, x11, x9, lsl #32 //CTR block 4 + add w12, w12, #1 //CTR block 4 + + mov x7, v0.d[1] //AES block 0 - mov high + rev64 v4.16b, v4.16b //GHASH block 0 + + fmov d0, x10 //CTR block 4 + rev64 v5.16b, v5.16b //GHASH block 1 + cmp x0, x5 //check if we have <= 8 blocks + + eor x19, x19, x13 //AES block 1 - round 12 low +#ifdef __AARCH64EB__ + rev x19, x19 +#endif + fmov v0.d[1], x9 //CTR block 4 + rev w9, w12 //CTR block 5 + + orr x9, x11, x9, lsl #32 //CTR block 5 + fmov d1, x10 //CTR block 5 + eor x20, x20, x14 //AES block 1 - round 12 high +#ifdef __AARCH64EB__ + rev x20, x20 +#endif + add w12, w12, #1 //CTR block 5 + fmov v1.d[1], x9 //CTR block 5 + eor x6, x6, x13 //AES block 0 - round 12 low +#ifdef __AARCH64EB__ + rev x6, x6 +#endif + rev w9, w12 //CTR block 6 + eor x7, x7, x14 //AES block 0 - round 12 high +#ifdef __AARCH64EB__ + rev x7, x7 +#endif + stp x6, x7, [x2], #16 //AES block 0 - store result + orr x9, x11, x9, lsl #32 //CTR block 6 + + stp x19, x20, [x2], #16 //AES block 1 - store result + + add w12, w12, #1 //CTR block 6 + eor v2.16b, v6.16b, v2.16b //AES block 2 - result + b.ge L192_dec_prepretail //do prepretail + +L192_dec_main_loop: //main loop start + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 0 + ext v11.16b, v11.16b, v11.16b, #8 //PRE 0 + + pmull v31.1q, v5.1d, v14.1d //GHASH block 4k+1 - low + mov x21, v2.d[0] //AES block 4k+2 - mov low + + mov x22, v2.d[1] //AES block 4k+2 - mov high + eor v3.16b, v7.16b, v3.16b //AES block 4k+3 - result + rev64 v7.16b, v7.16b //GHASH block 4k+3 + + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 1 + fmov d2, x10 //CTR block 4k+6 + + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 0 + eor v4.16b, v4.16b, v11.16b //PRE 1 + + pmull2 v30.1q, v5.2d, v14.2d //GHASH block 4k+1 - high + fmov v2.d[1], x9 //CTR block 4k+6 + + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 2 + mov x24, v3.d[1] //AES block 4k+3 - mov high + + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 1 + mov x23, v3.d[0] //AES block 4k+3 - mov low + + pmull2 v9.1q, v4.2d, v15.2d //GHASH block 4k - high + fmov d3, x10 //CTR block 4k+7 + mov d8, v4.d[1] //GHASH block 4k - mid + + pmull v11.1q, v4.1d, v15.1d //GHASH block 4k - low + mov d10, v17.d[1] //GHASH block 4k - mid + rev w9, w12 //CTR block 4k+7 + + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 0 + orr x9, x11, x9, lsl #32 //CTR block 4k+7 + + fmov v3.d[1], x9 //CTR block 4k+7 + eor v8.8b, v8.8b, v4.8b //GHASH block 4k - mid + mov d4, v5.d[1] //GHASH block 4k+1 - mid + + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 3 + + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 2 + eor x22, x22, x14 //AES block 4k+2 - round 12 high +#ifdef __AARCH64EB__ + rev x22, x22 +#endif + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 1 + eor v4.8b, v4.8b, v5.8b //GHASH block 4k+1 - mid + + pmull v10.1q, v8.1d, v10.1d //GHASH block 4k - mid + + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 0 + rev64 v6.16b, v6.16b //GHASH block 4k+2 + + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 2 + + pmull v4.1q, v4.1d, v17.1d //GHASH block 4k+1 - mid + eor v11.16b, v11.16b, v31.16b //GHASH block 4k+1 - low + eor x21, x21, x13 //AES block 4k+2 - round 12 low +#ifdef __AARCH64EB__ + rev x21, x21 +#endif + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 4 + + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 3 + + eor v10.16b, v10.16b, v4.16b //GHASH block 4k+1 - mid + mov d31, v6.d[1] //GHASH block 4k+2 - mid + + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 1 + eor v9.16b, v9.16b, v30.16b //GHASH block 4k+1 - high + + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 4 + + pmull2 v30.1q, v6.2d, v13.2d //GHASH block 4k+2 - high + eor v31.8b, v31.8b, v6.8b //GHASH block 4k+2 - mid + + pmull v8.1q, v6.1d, v13.1d //GHASH block 4k+2 - low + + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 5 + + eor v9.16b, v9.16b, v30.16b //GHASH block 4k+2 - high + mov d30, v7.d[1] //GHASH block 4k+3 - mid + + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 5 + + pmull2 v5.1q, v7.2d, v12.2d //GHASH block 4k+3 - high + + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 2 + eor v30.8b, v30.8b, v7.8b //GHASH block 4k+3 - mid + + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 6 + + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 6 + ins v31.d[1], v31.d[0] //GHASH block 4k+2 - mid + + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 3 + + pmull v30.1q, v30.1d, v16.1d //GHASH block 4k+3 - mid + eor v11.16b, v11.16b, v8.16b //GHASH block 4k+2 - low + + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 7 + + pmull2 v31.1q, v31.2d, v16.2d //GHASH block 4k+2 - mid + eor v9.16b, v9.16b, v5.16b //GHASH block 4k+3 - high + + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 7 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 8 + movi v8.8b, #0xc2 + + pmull v6.1q, v7.1d, v12.1d //GHASH block 4k+3 - low + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 8 + eor v10.16b, v10.16b, v31.16b //GHASH block 4k+2 - mid + + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 3 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 9 + eor v11.16b, v11.16b, v6.16b //GHASH block 4k+3 - low + + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 4 + + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 4 + eor v10.16b, v10.16b, v30.16b //GHASH block 4k+3 - mid + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 10 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 9 + eor v30.16b, v11.16b, v9.16b //MODULO - karatsuba tidy up + + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 5 + + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 5 + shl d8, d8, #56 //mod_constant + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 10 + + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 6 + ld1 {v4.16b}, [x0], #16 //AES block 4k+4 - load ciphertext + + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 6 + eor v10.16b, v10.16b, v30.16b //MODULO - karatsuba tidy up + + pmull v31.1q, v9.1d, v8.1d //MODULO - top 64b align with mid + ld1 {v5.16b}, [x0], #16 //AES block 4k+5 - load ciphertext + eor x23, x23, x13 //AES block 4k+3 - round 12 low +#ifdef __AARCH64EB__ + rev x23, x23 +#endif + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 7 + ext v9.16b, v9.16b, v9.16b, #8 //MODULO - other top alignment + + aese v0.16b, v29.16b //AES block 4k+4 - round 11 + add w12, w12, #1 //CTR block 4k+7 + + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 7 + eor v10.16b, v10.16b, v31.16b //MODULO - fold into mid + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 8 + ld1 {v6.16b}, [x0], #16 //AES block 4k+6 - load ciphertext + + aese v1.16b, v29.16b //AES block 4k+5 - round 11 + ld1 {v7.16b}, [x0], #16 //AES block 4k+7 - load ciphertext + rev w9, w12 //CTR block 4k+8 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 8 + stp x21, x22, [x2], #16 //AES block 4k+2 - store result + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 9 + eor v10.16b, v10.16b, v9.16b //MODULO - fold into mid + + cmp x0, x5 //LOOP CONTROL + + eor v0.16b, v4.16b, v0.16b //AES block 4k+4 - result + eor x24, x24, x14 //AES block 4k+3 - round 12 high +#ifdef __AARCH64EB__ + rev x24, x24 +#endif + eor v1.16b, v5.16b, v1.16b //AES block 4k+5 - result + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 10 + orr x9, x11, x9, lsl #32 //CTR block 4k+8 + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 9 + + pmull v8.1q, v10.1d, v8.1d //MODULO - mid 64b align with low + mov x19, v1.d[0] //AES block 4k+5 - mov low + + mov x6, v0.d[0] //AES block 4k+4 - mov low + stp x23, x24, [x2], #16 //AES block 4k+3 - store result + rev64 v5.16b, v5.16b //GHASH block 4k+5 + + aese v2.16b, v29.16b //AES block 4k+6 - round 11 + mov x7, v0.d[1] //AES block 4k+4 - mov high + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 10 + mov x20, v1.d[1] //AES block 4k+5 - mov high + + fmov d0, x10 //CTR block 4k+8 + add w12, w12, #1 //CTR block 4k+8 + ext v10.16b, v10.16b, v10.16b, #8 //MODULO - other mid alignment + + eor v2.16b, v6.16b, v2.16b //AES block 4k+6 - result + fmov v0.d[1], x9 //CTR block 4k+8 + rev w9, w12 //CTR block 4k+9 + + eor x6, x6, x13 //AES block 4k+4 - round 12 low +#ifdef __AARCH64EB__ + rev x6, x6 +#endif + orr x9, x11, x9, lsl #32 //CTR block 4k+9 + eor v11.16b, v11.16b, v8.16b //MODULO - fold into low + + fmov d1, x10 //CTR block 4k+9 + add w12, w12, #1 //CTR block 4k+9 + eor x19, x19, x13 //AES block 4k+5 - round 12 low +#ifdef __AARCH64EB__ + rev x19, x19 +#endif + fmov v1.d[1], x9 //CTR block 4k+9 + rev w9, w12 //CTR block 4k+10 + eor x20, x20, x14 //AES block 4k+5 - round 12 high +#ifdef __AARCH64EB__ + rev x20, x20 +#endif + eor x7, x7, x14 //AES block 4k+4 - round 12 high +#ifdef __AARCH64EB__ + rev x7, x7 +#endif + stp x6, x7, [x2], #16 //AES block 4k+4 - store result + eor v11.16b, v11.16b, v10.16b //MODULO - fold into low + + add w12, w12, #1 //CTR block 4k+10 + rev64 v4.16b, v4.16b //GHASH block 4k+4 + orr x9, x11, x9, lsl #32 //CTR block 4k+10 + + aese v3.16b, v29.16b //AES block 4k+7 - round 11 + stp x19, x20, [x2], #16 //AES block 4k+5 - store result + b.lt L192_dec_main_loop + +L192_dec_prepretail: //PREPRETAIL + mov x22, v2.d[1] //AES block 4k+2 - mov high + ext v11.16b, v11.16b, v11.16b, #8 //PRE 0 + eor v3.16b, v7.16b, v3.16b //AES block 4k+3 - result + + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 0 + mov x21, v2.d[0] //AES block 4k+2 - mov low + + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 0 + mov d10, v17.d[1] //GHASH block 4k - mid + + eor v4.16b, v4.16b, v11.16b //PRE 1 + fmov d2, x10 //CTR block 4k+6 + + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 1 + mov x23, v3.d[0] //AES block 4k+3 - mov low + + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 1 + mov x24, v3.d[1] //AES block 4k+3 - mov high + + pmull v11.1q, v4.1d, v15.1d //GHASH block 4k - low + mov d8, v4.d[1] //GHASH block 4k - mid + fmov d3, x10 //CTR block 4k+7 + + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 2 + rev64 v6.16b, v6.16b //GHASH block 4k+2 + + pmull2 v9.1q, v4.2d, v15.2d //GHASH block 4k - high + fmov v2.d[1], x9 //CTR block 4k+6 + rev w9, w12 //CTR block 4k+7 + + orr x9, x11, x9, lsl #32 //CTR block 4k+7 + eor v8.8b, v8.8b, v4.8b //GHASH block 4k - mid + mov d4, v5.d[1] //GHASH block 4k+1 - mid + + pmull v31.1q, v5.1d, v14.1d //GHASH block 4k+1 - low + eor x24, x24, x14 //AES block 4k+3 - round 12 high +#ifdef __AARCH64EB__ + rev x24, x24 +#endif + fmov v3.d[1], x9 //CTR block 4k+7 + + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 2 + eor x21, x21, x13 //AES block 4k+2 - round 12 low +#ifdef __AARCH64EB__ + rev x21, x21 +#endif + pmull2 v30.1q, v5.2d, v14.2d //GHASH block 4k+1 - high + eor x22, x22, x14 //AES block 4k+2 - round 12 high +#ifdef __AARCH64EB__ + rev x22, x22 +#endif + eor v4.8b, v4.8b, v5.8b //GHASH block 4k+1 - mid + + pmull v10.1q, v8.1d, v10.1d //GHASH block 4k - mid + eor x23, x23, x13 //AES block 4k+3 - round 12 low +#ifdef __AARCH64EB__ + rev x23, x23 +#endif + stp x21, x22, [x2], #16 //AES block 4k+2 - store result + + rev64 v7.16b, v7.16b //GHASH block 4k+3 + stp x23, x24, [x2], #16 //AES block 4k+3 - store result + + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 0 + eor v9.16b, v9.16b, v30.16b //GHASH block 4k+1 - high + + pmull v4.1q, v4.1d, v17.1d //GHASH block 4k+1 - mid + add w12, w12, #1 //CTR block 4k+7 + + pmull2 v30.1q, v6.2d, v13.2d //GHASH block 4k+2 - high + eor v11.16b, v11.16b, v31.16b //GHASH block 4k+1 - low + + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 0 + + eor v10.16b, v10.16b, v4.16b //GHASH block 4k+1 - mid + mov d31, v6.d[1] //GHASH block 4k+2 - mid + + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 1 + + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 1 + eor v9.16b, v9.16b, v30.16b //GHASH block 4k+2 - high + + eor v31.8b, v31.8b, v6.8b //GHASH block 4k+2 - mid + + pmull v8.1q, v6.1d, v13.1d //GHASH block 4k+2 - low + + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 2 + mov d30, v7.d[1] //GHASH block 4k+3 - mid + + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 2 + ins v31.d[1], v31.d[0] //GHASH block 4k+2 - mid + + pmull v6.1q, v7.1d, v12.1d //GHASH block 4k+3 - low + + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 3 + eor v30.8b, v30.8b, v7.8b //GHASH block 4k+3 - mid + + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 3 + + pmull2 v31.1q, v31.2d, v16.2d //GHASH block 4k+2 - mid + eor v11.16b, v11.16b, v8.16b //GHASH block 4k+2 - low + + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 4 + + pmull2 v5.1q, v7.2d, v12.2d //GHASH block 4k+3 - high + movi v8.8b, #0xc2 + + pmull v30.1q, v30.1d, v16.1d //GHASH block 4k+3 - mid + + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 3 + + shl d8, d8, #56 //mod_constant + eor v9.16b, v9.16b, v5.16b //GHASH block 4k+3 - high + + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 5 + eor v10.16b, v10.16b, v31.16b //GHASH block 4k+2 - mid + + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 4 + + pmull v31.1q, v9.1d, v8.1d //MODULO - top 64b align with mid + eor v11.16b, v11.16b, v6.16b //GHASH block 4k+3 - low + + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 6 + + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 3 + eor v10.16b, v10.16b, v30.16b //GHASH block 4k+3 - mid + + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 5 + + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 7 + eor v30.16b, v11.16b, v9.16b //MODULO - karatsuba tidy up + + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 4 + + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 6 + ext v9.16b, v9.16b, v9.16b, #8 //MODULO - other top alignment + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 8 + + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 5 + eor v10.16b, v10.16b, v30.16b //MODULO - karatsuba tidy up + + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 4 + + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 7 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 9 + + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 5 + + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 6 + eor v10.16b, v10.16b, v31.16b //MODULO - fold into mid + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 10 + + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 6 + + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 7 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 8 + eor v10.16b, v10.16b, v9.16b //MODULO - fold into mid + + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 7 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 8 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 9 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 8 + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 9 + + pmull v8.1q, v10.1d, v8.1d //MODULO - mid 64b align with low + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 9 + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 10 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 10 + ext v10.16b, v10.16b, v10.16b, #8 //MODULO - other mid alignment + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 10 + + aese v0.16b, v29.16b + eor v11.16b, v11.16b, v8.16b //MODULO - fold into low + + aese v2.16b, v29.16b + + aese v1.16b, v29.16b + + aese v3.16b, v29.16b + + eor v11.16b, v11.16b, v10.16b //MODULO - fold into low +L192_dec_tail: //TAIL + + sub x5, x4, x0 //main_end_input_ptr is number of bytes left to process + ld1 { v5.16b}, [x0], #16 //AES block 4k+4 - load ciphertext + + eor v0.16b, v5.16b, v0.16b //AES block 4k+4 - result + + mov x7, v0.d[1] //AES block 4k+4 - mov high + + mov x6, v0.d[0] //AES block 4k+4 - mov low + + ext v8.16b, v11.16b, v11.16b, #8 //prepare final partial tag + + cmp x5, #48 + + eor x7, x7, x14 //AES block 4k+4 - round 12 high +#ifdef __AARCH64EB__ + rev x7, x7 +#endif + eor x6, x6, x13 //AES block 4k+4 - round 12 low +#ifdef __AARCH64EB__ + rev x6, x6 +#endif + b.gt L192_dec_blocks_more_than_3 + + movi v11.8b, #0 + movi v9.8b, #0 + + mov v3.16b, v2.16b + mov v2.16b, v1.16b + sub w12, w12, #1 + + movi v10.8b, #0 + cmp x5, #32 + b.gt L192_dec_blocks_more_than_2 + + mov v3.16b, v1.16b + cmp x5, #16 + sub w12, w12, #1 + + b.gt L192_dec_blocks_more_than_1 + + sub w12, w12, #1 + b L192_dec_blocks_less_than_1 +L192_dec_blocks_more_than_3: //blocks left > 3 + rev64 v4.16b, v5.16b //GHASH final-3 block + ld1 { v5.16b}, [x0], #16 //AES final-2 block - load ciphertext + + stp x6, x7, [x2], #16 //AES final-3 block - store result + + eor v4.16b, v4.16b, v8.16b //feed in partial tag + + eor v0.16b, v5.16b, v1.16b //AES final-2 block - result + + pmull v11.1q, v4.1d, v15.1d //GHASH final-3 block - low + mov x6, v0.d[0] //AES final-2 block - mov low + mov d22, v4.d[1] //GHASH final-3 block - mid + + mov x7, v0.d[1] //AES final-2 block - mov high + + mov d10, v17.d[1] //GHASH final-3 block - mid + eor v22.8b, v22.8b, v4.8b //GHASH final-3 block - mid + + pmull2 v9.1q, v4.2d, v15.2d //GHASH final-3 block - high + + eor x6, x6, x13 //AES final-2 block - round 12 low +#ifdef __AARCH64EB__ + rev x6, x6 +#endif + movi v8.8b, #0 //suppress further partial tag feed in + + pmull v10.1q, v22.1d, v10.1d //GHASH final-3 block - mid + eor x7, x7, x14 //AES final-2 block - round 12 high +#ifdef __AARCH64EB__ + rev x7, x7 +#endif +L192_dec_blocks_more_than_2: //blocks left > 2 + + rev64 v4.16b, v5.16b //GHASH final-2 block + ld1 { v5.16b}, [x0], #16 //AES final-1 block - load ciphertext + + eor v4.16b, v4.16b, v8.16b //feed in partial tag + + movi v8.8b, #0 //suppress further partial tag feed in + + eor v0.16b, v5.16b, v2.16b //AES final-1 block - result + + mov d22, v4.d[1] //GHASH final-2 block - mid + + pmull v21.1q, v4.1d, v14.1d //GHASH final-2 block - low + + stp x6, x7, [x2], #16 //AES final-2 block - store result + + eor v22.8b, v22.8b, v4.8b //GHASH final-2 block - mid + mov x7, v0.d[1] //AES final-1 block - mov high + + eor v11.16b, v11.16b, v21.16b //GHASH final-2 block - low + mov x6, v0.d[0] //AES final-1 block - mov low + + pmull2 v20.1q, v4.2d, v14.2d //GHASH final-2 block - high + + pmull v22.1q, v22.1d, v17.1d //GHASH final-2 block - mid + + eor v9.16b, v9.16b, v20.16b //GHASH final-2 block - high + eor x7, x7, x14 //AES final-1 block - round 12 high +#ifdef __AARCH64EB__ + rev x7, x7 +#endif + eor x6, x6, x13 //AES final-1 block - round 12 low +#ifdef __AARCH64EB__ + rev x6, x6 +#endif + eor v10.16b, v10.16b, v22.16b //GHASH final-2 block - mid +L192_dec_blocks_more_than_1: //blocks left > 1 + + rev64 v4.16b, v5.16b //GHASH final-1 block + + eor v4.16b, v4.16b, v8.16b //feed in partial tag + ld1 { v5.16b}, [x0], #16 //AES final block - load ciphertext + + mov d22, v4.d[1] //GHASH final-1 block - mid + + pmull2 v20.1q, v4.2d, v13.2d //GHASH final-1 block - high + + eor v0.16b, v5.16b, v3.16b //AES final block - result + stp x6, x7, [x2], #16 //AES final-1 block - store result + + eor v22.8b, v22.8b, v4.8b //GHASH final-1 block - mid + + eor v9.16b, v9.16b, v20.16b //GHASH final-1 block - high + + pmull v21.1q, v4.1d, v13.1d //GHASH final-1 block - low + mov x7, v0.d[1] //AES final block - mov high + + ins v22.d[1], v22.d[0] //GHASH final-1 block - mid + mov x6, v0.d[0] //AES final block - mov low + + pmull2 v22.1q, v22.2d, v16.2d //GHASH final-1 block - mid + + movi v8.8b, #0 //suppress further partial tag feed in + eor v11.16b, v11.16b, v21.16b //GHASH final-1 block - low + eor x7, x7, x14 //AES final block - round 12 high +#ifdef __AARCH64EB__ + rev x7, x7 +#endif + eor x6, x6, x13 //AES final block - round 12 low +#ifdef __AARCH64EB__ + rev x6, x6 +#endif + eor v10.16b, v10.16b, v22.16b //GHASH final-1 block - mid +L192_dec_blocks_less_than_1: //blocks left <= 1 + + mvn x13, xzr //rk12_l = 0xffffffffffffffff + ldp x4, x5, [x2] //load existing bytes we need to not overwrite + and x1, x1, #127 //bit_length %= 128 + + sub x1, x1, #128 //bit_length -= 128 + + neg x1, x1 //bit_length = 128 - #bits in input (in range [1,128]) + + and x1, x1, #127 //bit_length %= 128 + mvn x14, xzr //rk12_h = 0xffffffffffffffff + + lsr x14, x14, x1 //rk12_h is mask for top 64b of last block + cmp x1, #64 + + csel x9, x13, x14, lt + csel x10, x14, xzr, lt + + fmov d0, x9 //ctr0b is mask for last block + and x6, x6, x9 + bic x4, x4, x9 //mask out low existing bytes + + orr x6, x6, x4 + mov v0.d[1], x10 +#ifndef __AARCH64EB__ + rev w9, w12 +#else + mov w9, w12 +#endif + + and v5.16b, v5.16b, v0.16b //possibly partial last block has zeroes in highest bits + str w9, [x16, #12] //store the updated counter + + rev64 v4.16b, v5.16b //GHASH final block + + eor v4.16b, v4.16b, v8.16b //feed in partial tag + bic x5, x5, x10 //mask out high existing bytes + + and x7, x7, x10 + + pmull2 v20.1q, v4.2d, v12.2d //GHASH final block - high + mov d8, v4.d[1] //GHASH final block - mid + + pmull v21.1q, v4.1d, v12.1d //GHASH final block - low + + eor v8.8b, v8.8b, v4.8b //GHASH final block - mid + + eor v9.16b, v9.16b, v20.16b //GHASH final block - high + + pmull v8.1q, v8.1d, v16.1d //GHASH final block - mid + + eor v11.16b, v11.16b, v21.16b //GHASH final block - low + + eor v10.16b, v10.16b, v8.16b //GHASH final block - mid + movi v8.8b, #0xc2 + + eor v30.16b, v11.16b, v9.16b //MODULO - karatsuba tidy up + + shl d8, d8, #56 //mod_constant + + eor v10.16b, v10.16b, v30.16b //MODULO - karatsuba tidy up + + pmull v31.1q, v9.1d, v8.1d //MODULO - top 64b align with mid + orr x7, x7, x5 + stp x6, x7, [x2] + + ext v9.16b, v9.16b, v9.16b, #8 //MODULO - other top alignment + + eor v10.16b, v10.16b, v31.16b //MODULO - fold into mid + + eor v10.16b, v10.16b, v9.16b //MODULO - fold into mid + + pmull v8.1q, v10.1d, v8.1d //MODULO - mid 64b align with low + + eor v11.16b, v11.16b, v8.16b //MODULO - fold into low + + ext v10.16b, v10.16b, v10.16b, #8 //MODULO - other mid alignment + + eor v11.16b, v11.16b, v10.16b //MODULO - fold into low + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + mov x0, x15 + st1 { v11.16b }, [x3] + + ldp x21, x22, [sp, #16] + ldp x23, x24, [sp, #32] + ldp d8, d9, [sp, #48] + ldp d10, d11, [sp, #64] + ldp d12, d13, [sp, #80] + ldp d14, d15, [sp, #96] + ldp x19, x20, [sp], #112 + ret + +L192_dec_ret: + mov w0, #0x0 + ret + +.globl aes_gcm_enc_256_kernel +.def aes_gcm_enc_256_kernel + .type 32 +.endef +.align 4 +aes_gcm_enc_256_kernel: + AARCH64_VALID_CALL_TARGET + cbz x1, L256_enc_ret + stp x19, x20, [sp, #-112]! + mov x16, x4 + mov x8, x5 + stp x21, x22, [sp, #16] + stp x23, x24, [sp, #32] + stp d8, d9, [sp, #48] + stp d10, d11, [sp, #64] + stp d12, d13, [sp, #80] + stp d14, d15, [sp, #96] + + add x4, x0, x1, lsr #3 //end_input_ptr + lsr x5, x1, #3 //byte_len + mov x15, x5 + ldp x10, x11, [x16] //ctr96_b64, ctr96_t32 +#ifdef __AARCH64EB__ + rev x10, x10 + rev x11, x11 +#endif + ldp x13, x14, [x8, #224] //load rk14 +#ifdef __AARCH64EB__ + ror x13, x13, #32 + ror x14, x14, #32 +#endif + ld1 { v0.16b}, [x16] //special case vector load initial counter so we can start first AES block as quickly as possible + sub x5, x5, #1 //byte_len - 1 + + ld1 {v18.4s}, [x8], #16 //load rk0 + and x5, x5, #0xffffffffffffffc0 //number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + + ld1 {v19.4s}, [x8], #16 //load rk1 + add x5, x5, x0 + + lsr x12, x11, #32 + fmov d2, x10 //CTR block 2 + orr w11, w11, w11 + + rev w12, w12 //rev_ctr32 + cmp x0, x5 //check if we have <= 4 blocks + fmov d1, x10 //CTR block 1 + + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b //AES block 0 - round 0 + add w12, w12, #1 //increment rev_ctr32 + + rev w9, w12 //CTR block 1 + fmov d3, x10 //CTR block 3 + + orr x9, x11, x9, lsl #32 //CTR block 1 + add w12, w12, #1 //CTR block 1 + ld1 {v20.4s}, [x8], #16 //load rk2 + + fmov v1.d[1], x9 //CTR block 1 + rev w9, w12 //CTR block 2 + add w12, w12, #1 //CTR block 2 + + orr x9, x11, x9, lsl #32 //CTR block 2 + ld1 {v21.4s}, [x8], #16 //load rk3 + + fmov v2.d[1], x9 //CTR block 2 + rev w9, w12 //CTR block 3 + + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b //AES block 0 - round 1 + orr x9, x11, x9, lsl #32 //CTR block 3 + + fmov v3.d[1], x9 //CTR block 3 + + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b //AES block 1 - round 0 + ld1 {v22.4s}, [x8], #16 //load rk4 + + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b //AES block 0 - round 2 + ld1 {v23.4s}, [x8], #16 //load rk5 + + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b //AES block 2 - round 0 + ld1 {v24.4s}, [x8], #16 //load rk6 + + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b //AES block 1 - round 1 + ldr q14, [x3, #80] //load h3l | h3h +#ifndef __AARCH64EB__ + ext v14.16b, v14.16b, v14.16b, #8 +#endif + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b //AES block 3 - round 0 + ld1 {v25.4s}, [x8], #16 //load rk7 + + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b //AES block 2 - round 1 + ld1 {v26.4s}, [x8], #16 //load rk8 + + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b //AES block 1 - round 2 + ldr q13, [x3, #64] //load h2l | h2h +#ifndef __AARCH64EB__ + ext v13.16b, v13.16b, v13.16b, #8 +#endif + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b //AES block 3 - round 1 + ld1 {v27.4s}, [x8], #16 //load rk9 + + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b //AES block 2 - round 2 + ldr q15, [x3, #112] //load h4l | h4h +#ifndef __AARCH64EB__ + ext v15.16b, v15.16b, v15.16b, #8 +#endif + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b //AES block 1 - round 3 + ld1 {v28.4s}, [x8], #16 //load rk10 + + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b //AES block 3 - round 2 + ld1 {v29.4s}, [x8], #16 //load rk11 + + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b //AES block 2 - round 3 + add w12, w12, #1 //CTR block 3 + + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b //AES block 0 - round 3 + + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b //AES block 3 - round 3 + ld1 { v11.16b}, [x3] + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b //AES block 2 - round 4 + + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b //AES block 0 - round 4 + + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b //AES block 1 - round 4 + + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b //AES block 3 - round 4 + + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b //AES block 0 - round 5 + + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b //AES block 1 - round 5 + + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b //AES block 3 - round 5 + + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b //AES block 2 - round 5 + + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b //AES block 1 - round 6 + trn2 v17.2d, v14.2d, v15.2d //h4l | h3l + + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b //AES block 3 - round 6 + ld1 {v30.4s}, [x8], #16 //load rk12 + + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b //AES block 0 - round 6 + ldr q12, [x3, #32] //load h1l | h1h +#ifndef __AARCH64EB__ + ext v12.16b, v12.16b, v12.16b, #8 +#endif + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b //AES block 2 - round 6 + ld1 {v31.4s}, [x8], #16 //load rk13 + + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b //AES block 1 - round 7 + trn1 v9.2d, v14.2d, v15.2d //h4h | h3h + + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b //AES block 0 - round 7 + + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b //AES block 2 - round 7 + + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b //AES block 3 - round 7 + trn2 v16.2d, v12.2d, v13.2d //h2l | h1l + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 8 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 8 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 8 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 9 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 9 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 8 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 10 + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 9 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 9 + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 10 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 10 + + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b //AES block 1 - round 11 + + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b //AES block 2 - round 11 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 10 + + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b //AES block 1 - round 12 + + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b //AES block 2 - round 12 + + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b //AES block 0 - round 11 + eor v17.16b, v17.16b, v9.16b //h4k | h3k + + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b //AES block 3 - round 11 + + aese v2.16b, v31.16b //AES block 2 - round 13 + trn1 v8.2d, v12.2d, v13.2d //h2h | h1h + + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b //AES block 0 - round 12 + + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b //AES block 3 - round 12 + + aese v1.16b, v31.16b //AES block 1 - round 13 + + aese v0.16b, v31.16b //AES block 0 - round 13 + + aese v3.16b, v31.16b //AES block 3 - round 13 + eor v16.16b, v16.16b, v8.16b //h2k | h1k + b.ge L256_enc_tail //handle tail + + ldp x19, x20, [x0, #16] //AES block 1 - load plaintext +#ifdef __AARCH64EB__ + rev x19, x19 + rev x20, x20 +#endif + rev w9, w12 //CTR block 4 + ldp x6, x7, [x0, #0] //AES block 0 - load plaintext +#ifdef __AARCH64EB__ + rev x6, x6 + rev x7, x7 +#endif + ldp x23, x24, [x0, #48] //AES block 3 - load plaintext +#ifdef __AARCH64EB__ + rev x23, x23 + rev x24, x24 +#endif + ldp x21, x22, [x0, #32] //AES block 2 - load plaintext +#ifdef __AARCH64EB__ + rev x21, x21 + rev x22, x22 +#endif + add x0, x0, #64 //AES input_ptr update + + eor x19, x19, x13 //AES block 1 - round 14 low + eor x20, x20, x14 //AES block 1 - round 14 high + + fmov d5, x19 //AES block 1 - mov low + eor x6, x6, x13 //AES block 0 - round 14 low + + eor x7, x7, x14 //AES block 0 - round 14 high + eor x24, x24, x14 //AES block 3 - round 14 high + fmov d4, x6 //AES block 0 - mov low + + cmp x0, x5 //check if we have <= 8 blocks + fmov v4.d[1], x7 //AES block 0 - mov high + eor x23, x23, x13 //AES block 3 - round 14 low + + eor x21, x21, x13 //AES block 2 - round 14 low + fmov v5.d[1], x20 //AES block 1 - mov high + + fmov d6, x21 //AES block 2 - mov low + add w12, w12, #1 //CTR block 4 + + orr x9, x11, x9, lsl #32 //CTR block 4 + fmov d7, x23 //AES block 3 - mov low + eor x22, x22, x14 //AES block 2 - round 14 high + + fmov v6.d[1], x22 //AES block 2 - mov high + + eor v4.16b, v4.16b, v0.16b //AES block 0 - result + fmov d0, x10 //CTR block 4 + + fmov v0.d[1], x9 //CTR block 4 + rev w9, w12 //CTR block 5 + add w12, w12, #1 //CTR block 5 + + eor v5.16b, v5.16b, v1.16b //AES block 1 - result + fmov d1, x10 //CTR block 5 + orr x9, x11, x9, lsl #32 //CTR block 5 + + fmov v1.d[1], x9 //CTR block 5 + rev w9, w12 //CTR block 6 + st1 { v4.16b}, [x2], #16 //AES block 0 - store result + + fmov v7.d[1], x24 //AES block 3 - mov high + orr x9, x11, x9, lsl #32 //CTR block 6 + eor v6.16b, v6.16b, v2.16b //AES block 2 - result + + st1 { v5.16b}, [x2], #16 //AES block 1 - store result + + add w12, w12, #1 //CTR block 6 + fmov d2, x10 //CTR block 6 + + fmov v2.d[1], x9 //CTR block 6 + st1 { v6.16b}, [x2], #16 //AES block 2 - store result + rev w9, w12 //CTR block 7 + + orr x9, x11, x9, lsl #32 //CTR block 7 + + eor v7.16b, v7.16b, v3.16b //AES block 3 - result + st1 { v7.16b}, [x2], #16 //AES block 3 - store result + b.ge L256_enc_prepretail //do prepretail + +L256_enc_main_loop: //main loop start + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 0 + rev64 v4.16b, v4.16b //GHASH block 4k (only t0 is free) + + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 0 + fmov d3, x10 //CTR block 4k+3 + + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 0 + ext v11.16b, v11.16b, v11.16b, #8 //PRE 0 + + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 1 + fmov v3.d[1], x9 //CTR block 4k+3 + + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 1 + ldp x23, x24, [x0, #48] //AES block 4k+7 - load plaintext +#ifdef __AARCH64EB__ + rev x23, x23 + rev x24, x24 +#endif + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 1 + ldp x21, x22, [x0, #32] //AES block 4k+6 - load plaintext +#ifdef __AARCH64EB__ + rev x21, x21 + rev x22, x22 +#endif + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 2 + eor v4.16b, v4.16b, v11.16b //PRE 1 + + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 2 + + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 0 + eor x23, x23, x13 //AES block 4k+7 - round 14 low + + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 3 + mov d10, v17.d[1] //GHASH block 4k - mid + + pmull2 v9.1q, v4.2d, v15.2d //GHASH block 4k - high + eor x22, x22, x14 //AES block 4k+6 - round 14 high + mov d8, v4.d[1] //GHASH block 4k - mid + + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 1 + rev64 v5.16b, v5.16b //GHASH block 4k+1 (t0 and t1 free) + + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 4 + + pmull v11.1q, v4.1d, v15.1d //GHASH block 4k - low + eor v8.8b, v8.8b, v4.8b //GHASH block 4k - mid + + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 2 + + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 5 + rev64 v7.16b, v7.16b //GHASH block 4k+3 (t0, t1, t2 and t3 free) + + pmull2 v4.1q, v5.2d, v14.2d //GHASH block 4k+1 - high + + pmull v10.1q, v8.1d, v10.1d //GHASH block 4k - mid + rev64 v6.16b, v6.16b //GHASH block 4k+2 (t0, t1, and t2 free) + + pmull v8.1q, v5.1d, v14.1d //GHASH block 4k+1 - low + + eor v9.16b, v9.16b, v4.16b //GHASH block 4k+1 - high + mov d4, v5.d[1] //GHASH block 4k+1 - mid + + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 3 + + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 2 + eor v11.16b, v11.16b, v8.16b //GHASH block 4k+1 - low + + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 3 + + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 4 + mov d8, v6.d[1] //GHASH block 4k+2 - mid + + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 3 + eor v4.8b, v4.8b, v5.8b //GHASH block 4k+1 - mid + + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 4 + + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 6 + eor v8.8b, v8.8b, v6.8b //GHASH block 4k+2 - mid + + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 4 + + pmull v4.1q, v4.1d, v17.1d //GHASH block 4k+1 - mid + + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 7 + + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 5 + ins v8.d[1], v8.d[0] //GHASH block 4k+2 - mid + + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 5 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 8 + + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 5 + + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 6 + eor v10.16b, v10.16b, v4.16b //GHASH block 4k+1 - mid + + pmull2 v4.1q, v6.2d, v13.2d //GHASH block 4k+2 - high + + pmull v5.1q, v6.1d, v13.1d //GHASH block 4k+2 - low + + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 7 + + pmull v6.1q, v7.1d, v12.1d //GHASH block 4k+3 - low + eor v9.16b, v9.16b, v4.16b //GHASH block 4k+2 - high + + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 6 + ldp x19, x20, [x0, #16] //AES block 4k+5 - load plaintext +#ifdef __AARCH64EB__ + rev x19, x19 + rev x20, x20 +#endif + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 8 + mov d4, v7.d[1] //GHASH block 4k+3 - mid + + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 6 + eor v11.16b, v11.16b, v5.16b //GHASH block 4k+2 - low + + pmull2 v8.1q, v8.2d, v16.2d //GHASH block 4k+2 - mid + + pmull2 v5.1q, v7.2d, v12.2d //GHASH block 4k+3 - high + eor v4.8b, v4.8b, v7.8b //GHASH block 4k+3 - mid + + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 7 + eor x19, x19, x13 //AES block 4k+5 - round 14 low + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 9 + eor v10.16b, v10.16b, v8.16b //GHASH block 4k+2 - mid + + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 7 + eor x21, x21, x13 //AES block 4k+6 - round 14 low + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 9 + movi v8.8b, #0xc2 + + pmull v4.1q, v4.1d, v16.1d //GHASH block 4k+3 - mid + eor v9.16b, v9.16b, v5.16b //GHASH block 4k+3 - high + fmov d5, x19 //AES block 4k+5 - mov low + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 8 + ldp x6, x7, [x0, #0] //AES block 4k+4 - load plaintext +#ifdef __AARCH64EB__ + rev x6, x6 + rev x7, x7 +#endif + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 10 + shl d8, d8, #56 //mod_constant + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 8 + eor v11.16b, v11.16b, v6.16b //GHASH block 4k+3 - low + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 9 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 10 + eor v10.16b, v10.16b, v4.16b //GHASH block 4k+3 - mid + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 9 + add w12, w12, #1 //CTR block 4k+3 + + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 11 + eor v4.16b, v11.16b, v9.16b //MODULO - karatsuba tidy up + + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 11 + add x0, x0, #64 //AES input_ptr update + + pmull v7.1q, v9.1d, v8.1d //MODULO - top 64b align with mid + rev w9, w12 //CTR block 4k+8 + ext v9.16b, v9.16b, v9.16b, #8 //MODULO - other top alignment + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 10 + eor x6, x6, x13 //AES block 4k+4 - round 14 low + + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 12 + eor v10.16b, v10.16b, v4.16b //MODULO - karatsuba tidy up + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 10 + eor x7, x7, x14 //AES block 4k+4 - round 14 high + + fmov d4, x6 //AES block 4k+4 - mov low + orr x9, x11, x9, lsl #32 //CTR block 4k+8 + eor v7.16b, v9.16b, v7.16b //MODULO - fold into mid + + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 12 + eor x20, x20, x14 //AES block 4k+5 - round 14 high + + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 11 + eor x24, x24, x14 //AES block 4k+7 - round 14 high + + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 11 + add w12, w12, #1 //CTR block 4k+8 + + aese v0.16b, v31.16b //AES block 4k+4 - round 13 + fmov v4.d[1], x7 //AES block 4k+4 - mov high + eor v10.16b, v10.16b, v7.16b //MODULO - fold into mid + + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 12 + fmov d7, x23 //AES block 4k+7 - mov low + + aese v1.16b, v31.16b //AES block 4k+5 - round 13 + fmov v5.d[1], x20 //AES block 4k+5 - mov high + + fmov d6, x21 //AES block 4k+6 - mov low + cmp x0, x5 //LOOP CONTROL + + fmov v6.d[1], x22 //AES block 4k+6 - mov high + + pmull v9.1q, v10.1d, v8.1d //MODULO - mid 64b align with low + eor v4.16b, v4.16b, v0.16b //AES block 4k+4 - result + fmov d0, x10 //CTR block 4k+8 + + fmov v0.d[1], x9 //CTR block 4k+8 + rev w9, w12 //CTR block 4k+9 + add w12, w12, #1 //CTR block 4k+9 + + eor v5.16b, v5.16b, v1.16b //AES block 4k+5 - result + fmov d1, x10 //CTR block 4k+9 + orr x9, x11, x9, lsl #32 //CTR block 4k+9 + + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 12 + fmov v1.d[1], x9 //CTR block 4k+9 + + aese v2.16b, v31.16b //AES block 4k+6 - round 13 + rev w9, w12 //CTR block 4k+10 + st1 { v4.16b}, [x2], #16 //AES block 4k+4 - store result + + orr x9, x11, x9, lsl #32 //CTR block 4k+10 + eor v11.16b, v11.16b, v9.16b //MODULO - fold into low + fmov v7.d[1], x24 //AES block 4k+7 - mov high + + ext v10.16b, v10.16b, v10.16b, #8 //MODULO - other mid alignment + st1 { v5.16b}, [x2], #16 //AES block 4k+5 - store result + add w12, w12, #1 //CTR block 4k+10 + + aese v3.16b, v31.16b //AES block 4k+7 - round 13 + eor v6.16b, v6.16b, v2.16b //AES block 4k+6 - result + fmov d2, x10 //CTR block 4k+10 + + st1 { v6.16b}, [x2], #16 //AES block 4k+6 - store result + fmov v2.d[1], x9 //CTR block 4k+10 + rev w9, w12 //CTR block 4k+11 + + eor v11.16b, v11.16b, v10.16b //MODULO - fold into low + orr x9, x11, x9, lsl #32 //CTR block 4k+11 + + eor v7.16b, v7.16b, v3.16b //AES block 4k+7 - result + st1 { v7.16b}, [x2], #16 //AES block 4k+7 - store result + b.lt L256_enc_main_loop + +L256_enc_prepretail: //PREPRETAIL + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 0 + rev64 v6.16b, v6.16b //GHASH block 4k+2 (t0, t1, and t2 free) + + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 0 + fmov d3, x10 //CTR block 4k+3 + + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 0 + rev64 v4.16b, v4.16b //GHASH block 4k (only t0 is free) + + fmov v3.d[1], x9 //CTR block 4k+3 + ext v11.16b, v11.16b, v11.16b, #8 //PRE 0 + + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 1 + + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 1 + + eor v4.16b, v4.16b, v11.16b //PRE 1 + rev64 v5.16b, v5.16b //GHASH block 4k+1 (t0 and t1 free) + + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 2 + + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 0 + mov d10, v17.d[1] //GHASH block 4k - mid + + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 1 + + pmull v11.1q, v4.1d, v15.1d //GHASH block 4k - low + mov d8, v4.d[1] //GHASH block 4k - mid + + pmull2 v9.1q, v4.2d, v15.2d //GHASH block 4k - high + + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 3 + + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 2 + eor v8.8b, v8.8b, v4.8b //GHASH block 4k - mid + + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 2 + + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 1 + + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 3 + + pmull v10.1q, v8.1d, v10.1d //GHASH block 4k - mid + + pmull2 v4.1q, v5.2d, v14.2d //GHASH block 4k+1 - high + + pmull v8.1q, v5.1d, v14.1d //GHASH block 4k+1 - low + + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 2 + + eor v9.16b, v9.16b, v4.16b //GHASH block 4k+1 - high + mov d4, v5.d[1] //GHASH block 4k+1 - mid + + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 3 + eor v11.16b, v11.16b, v8.16b //GHASH block 4k+1 - low + + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 3 + + eor v4.8b, v4.8b, v5.8b //GHASH block 4k+1 - mid + mov d8, v6.d[1] //GHASH block 4k+2 - mid + + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 4 + rev64 v7.16b, v7.16b //GHASH block 4k+3 (t0, t1, t2 and t3 free) + + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 4 + + pmull v4.1q, v4.1d, v17.1d //GHASH block 4k+1 - mid + eor v8.8b, v8.8b, v6.8b //GHASH block 4k+2 - mid + add w12, w12, #1 //CTR block 4k+3 + + pmull v5.1q, v6.1d, v13.1d //GHASH block 4k+2 - low + + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 5 + + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 4 + eor v10.16b, v10.16b, v4.16b //GHASH block 4k+1 - mid + + pmull2 v4.1q, v6.2d, v13.2d //GHASH block 4k+2 - high + + eor v11.16b, v11.16b, v5.16b //GHASH block 4k+2 - low + ins v8.d[1], v8.d[0] //GHASH block 4k+2 - mid + + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 5 + + eor v9.16b, v9.16b, v4.16b //GHASH block 4k+2 - high + mov d4, v7.d[1] //GHASH block 4k+3 - mid + + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 4 + + pmull2 v8.1q, v8.2d, v16.2d //GHASH block 4k+2 - mid + + eor v4.8b, v4.8b, v7.8b //GHASH block 4k+3 - mid + + pmull2 v5.1q, v7.2d, v12.2d //GHASH block 4k+3 - high + + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 5 + + pmull v4.1q, v4.1d, v16.1d //GHASH block 4k+3 - mid + eor v10.16b, v10.16b, v8.16b //GHASH block 4k+2 - mid + + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 5 + + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 6 + + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 6 + + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 6 + movi v8.8b, #0xc2 + + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 6 + + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 7 + eor v9.16b, v9.16b, v5.16b //GHASH block 4k+3 - high + + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 7 + + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 7 + shl d8, d8, #56 //mod_constant + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 8 + eor v10.16b, v10.16b, v4.16b //GHASH block 4k+3 - mid + + pmull v6.1q, v7.1d, v12.1d //GHASH block 4k+3 - low + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 8 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 9 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 8 + eor v11.16b, v11.16b, v6.16b //GHASH block 4k+3 - low + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 9 + + eor v10.16b, v10.16b, v9.16b //karatsuba tidy up + + pmull v4.1q, v9.1d, v8.1d + ext v9.16b, v9.16b, v9.16b, #8 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 10 + + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 7 + eor v10.16b, v10.16b, v11.16b + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 10 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 9 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 8 + + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 11 + eor v10.16b, v10.16b, v4.16b + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 10 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 9 + + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 12 + + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 11 + eor v10.16b, v10.16b, v9.16b + + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 11 + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 10 + + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 12 + + pmull v4.1q, v10.1d, v8.1d + + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 11 + ext v10.16b, v10.16b, v10.16b, #8 + + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 12 + + aese v1.16b, v31.16b //AES block 4k+5 - round 13 + eor v11.16b, v11.16b, v4.16b + + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 12 + + aese v3.16b, v31.16b //AES block 4k+7 - round 13 + + aese v0.16b, v31.16b //AES block 4k+4 - round 13 + + aese v2.16b, v31.16b //AES block 4k+6 - round 13 + eor v11.16b, v11.16b, v10.16b +L256_enc_tail: //TAIL + + ext v8.16b, v11.16b, v11.16b, #8 //prepare final partial tag + sub x5, x4, x0 //main_end_input_ptr is number of bytes left to process + ldp x6, x7, [x0], #16 //AES block 4k+4 - load plaintext +#ifdef __AARCH64EB__ + rev x6, x6 + rev x7, x7 +#endif + eor x6, x6, x13 //AES block 4k+4 - round 14 low + eor x7, x7, x14 //AES block 4k+4 - round 14 high + + cmp x5, #48 + fmov d4, x6 //AES block 4k+4 - mov low + + fmov v4.d[1], x7 //AES block 4k+4 - mov high + + eor v5.16b, v4.16b, v0.16b //AES block 4k+4 - result + b.gt L256_enc_blocks_more_than_3 + + cmp x5, #32 + mov v3.16b, v2.16b + movi v11.8b, #0 + + movi v9.8b, #0 + sub w12, w12, #1 + + mov v2.16b, v1.16b + movi v10.8b, #0 + b.gt L256_enc_blocks_more_than_2 + + mov v3.16b, v1.16b + sub w12, w12, #1 + cmp x5, #16 + + b.gt L256_enc_blocks_more_than_1 + + sub w12, w12, #1 + b L256_enc_blocks_less_than_1 +L256_enc_blocks_more_than_3: //blocks left > 3 + st1 { v5.16b}, [x2], #16 //AES final-3 block - store result + + ldp x6, x7, [x0], #16 //AES final-2 block - load input low & high +#ifdef __AARCH64EB__ + rev x6, x6 + rev x7, x7 +#endif + rev64 v4.16b, v5.16b //GHASH final-3 block + + eor x6, x6, x13 //AES final-2 block - round 14 low + eor v4.16b, v4.16b, v8.16b //feed in partial tag + + eor x7, x7, x14 //AES final-2 block - round 14 high + + mov d22, v4.d[1] //GHASH final-3 block - mid + fmov d5, x6 //AES final-2 block - mov low + + fmov v5.d[1], x7 //AES final-2 block - mov high + + eor v22.8b, v22.8b, v4.8b //GHASH final-3 block - mid + movi v8.8b, #0 //suppress further partial tag feed in + + mov d10, v17.d[1] //GHASH final-3 block - mid + + pmull v11.1q, v4.1d, v15.1d //GHASH final-3 block - low + + pmull2 v9.1q, v4.2d, v15.2d //GHASH final-3 block - high + + pmull v10.1q, v22.1d, v10.1d //GHASH final-3 block - mid + eor v5.16b, v5.16b, v1.16b //AES final-2 block - result +L256_enc_blocks_more_than_2: //blocks left > 2 + + st1 { v5.16b}, [x2], #16 //AES final-2 block - store result + + ldp x6, x7, [x0], #16 //AES final-1 block - load input low & high +#ifdef __AARCH64EB__ + rev x6, x6 + rev x7, x7 +#endif + rev64 v4.16b, v5.16b //GHASH final-2 block + + eor x6, x6, x13 //AES final-1 block - round 14 low + eor v4.16b, v4.16b, v8.16b //feed in partial tag + + fmov d5, x6 //AES final-1 block - mov low + eor x7, x7, x14 //AES final-1 block - round 14 high + + fmov v5.d[1], x7 //AES final-1 block - mov high + + movi v8.8b, #0 //suppress further partial tag feed in + + pmull2 v20.1q, v4.2d, v14.2d //GHASH final-2 block - high + mov d22, v4.d[1] //GHASH final-2 block - mid + + pmull v21.1q, v4.1d, v14.1d //GHASH final-2 block - low + + eor v22.8b, v22.8b, v4.8b //GHASH final-2 block - mid + + eor v5.16b, v5.16b, v2.16b //AES final-1 block - result + + eor v9.16b, v9.16b, v20.16b //GHASH final-2 block - high + + pmull v22.1q, v22.1d, v17.1d //GHASH final-2 block - mid + + eor v11.16b, v11.16b, v21.16b //GHASH final-2 block - low + + eor v10.16b, v10.16b, v22.16b //GHASH final-2 block - mid +L256_enc_blocks_more_than_1: //blocks left > 1 + + st1 { v5.16b}, [x2], #16 //AES final-1 block - store result + + rev64 v4.16b, v5.16b //GHASH final-1 block + + ldp x6, x7, [x0], #16 //AES final block - load input low & high +#ifdef __AARCH64EB__ + rev x6, x6 + rev x7, x7 +#endif + eor v4.16b, v4.16b, v8.16b //feed in partial tag + + movi v8.8b, #0 //suppress further partial tag feed in + + eor x6, x6, x13 //AES final block - round 14 low + mov d22, v4.d[1] //GHASH final-1 block - mid + + pmull2 v20.1q, v4.2d, v13.2d //GHASH final-1 block - high + eor x7, x7, x14 //AES final block - round 14 high + + eor v22.8b, v22.8b, v4.8b //GHASH final-1 block - mid + + eor v9.16b, v9.16b, v20.16b //GHASH final-1 block - high + + ins v22.d[1], v22.d[0] //GHASH final-1 block - mid + fmov d5, x6 //AES final block - mov low + + fmov v5.d[1], x7 //AES final block - mov high + + pmull2 v22.1q, v22.2d, v16.2d //GHASH final-1 block - mid + + pmull v21.1q, v4.1d, v13.1d //GHASH final-1 block - low + + eor v5.16b, v5.16b, v3.16b //AES final block - result + eor v10.16b, v10.16b, v22.16b //GHASH final-1 block - mid + + eor v11.16b, v11.16b, v21.16b //GHASH final-1 block - low +L256_enc_blocks_less_than_1: //blocks left <= 1 + + and x1, x1, #127 //bit_length %= 128 + + mvn x13, xzr //rk14_l = 0xffffffffffffffff + sub x1, x1, #128 //bit_length -= 128 + + neg x1, x1 //bit_length = 128 - #bits in input (in range [1,128]) + ld1 { v18.16b}, [x2] //load existing bytes where the possibly partial last block is to be stored + + mvn x14, xzr //rk14_h = 0xffffffffffffffff + and x1, x1, #127 //bit_length %= 128 + + lsr x14, x14, x1 //rk14_h is mask for top 64b of last block + cmp x1, #64 + + csel x6, x13, x14, lt + csel x7, x14, xzr, lt + + fmov d0, x6 //ctr0b is mask for last block + + fmov v0.d[1], x7 + + and v5.16b, v5.16b, v0.16b //possibly partial last block has zeroes in highest bits + + rev64 v4.16b, v5.16b //GHASH final block + + eor v4.16b, v4.16b, v8.16b //feed in partial tag + + bif v5.16b, v18.16b, v0.16b //insert existing bytes in top end of result before storing + + pmull2 v20.1q, v4.2d, v12.2d //GHASH final block - high + mov d8, v4.d[1] //GHASH final block - mid +#ifndef __AARCH64EB__ + rev w9, w12 +#else + mov w9, w12 +#endif + + pmull v21.1q, v4.1d, v12.1d //GHASH final block - low + + eor v9.16b, v9.16b, v20.16b //GHASH final block - high + eor v8.8b, v8.8b, v4.8b //GHASH final block - mid + + pmull v8.1q, v8.1d, v16.1d //GHASH final block - mid + + eor v11.16b, v11.16b, v21.16b //GHASH final block - low + + eor v10.16b, v10.16b, v8.16b //GHASH final block - mid + movi v8.8b, #0xc2 + + eor v4.16b, v11.16b, v9.16b //MODULO - karatsuba tidy up + + shl d8, d8, #56 //mod_constant + + eor v10.16b, v10.16b, v4.16b //MODULO - karatsuba tidy up + + pmull v7.1q, v9.1d, v8.1d //MODULO - top 64b align with mid + + ext v9.16b, v9.16b, v9.16b, #8 //MODULO - other top alignment + + eor v10.16b, v10.16b, v7.16b //MODULO - fold into mid + + eor v10.16b, v10.16b, v9.16b //MODULO - fold into mid + + pmull v9.1q, v10.1d, v8.1d //MODULO - mid 64b align with low + + ext v10.16b, v10.16b, v10.16b, #8 //MODULO - other mid alignment + + str w9, [x16, #12] //store the updated counter + + st1 { v5.16b}, [x2] //store all 16B + eor v11.16b, v11.16b, v9.16b //MODULO - fold into low + + eor v11.16b, v11.16b, v10.16b //MODULO - fold into low + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + mov x0, x15 + st1 { v11.16b }, [x3] + + ldp x21, x22, [sp, #16] + ldp x23, x24, [sp, #32] + ldp d8, d9, [sp, #48] + ldp d10, d11, [sp, #64] + ldp d12, d13, [sp, #80] + ldp d14, d15, [sp, #96] + ldp x19, x20, [sp], #112 + ret + +L256_enc_ret: + mov w0, #0x0 + ret + +.globl aes_gcm_dec_256_kernel +.def aes_gcm_dec_256_kernel + .type 32 +.endef +.align 4 +aes_gcm_dec_256_kernel: + AARCH64_VALID_CALL_TARGET + cbz x1, L256_dec_ret + stp x19, x20, [sp, #-112]! + mov x16, x4 + mov x8, x5 + stp x21, x22, [sp, #16] + stp x23, x24, [sp, #32] + stp d8, d9, [sp, #48] + stp d10, d11, [sp, #64] + stp d12, d13, [sp, #80] + stp d14, d15, [sp, #96] + + lsr x5, x1, #3 //byte_len + mov x15, x5 + ldp x10, x11, [x16] //ctr96_b64, ctr96_t32 +#ifdef __AARCH64EB__ + rev x10, x10 + rev x11, x11 +#endif + ldp x13, x14, [x8, #224] //load rk14 +#ifdef __AARCH64EB__ + ror x14, x14, #32 + ror x13, x13, #32 +#endif + ld1 {v18.4s}, [x8], #16 //load rk0 + sub x5, x5, #1 //byte_len - 1 + + ld1 {v19.4s}, [x8], #16 //load rk1 + and x5, x5, #0xffffffffffffffc0 //number of bytes to be processed in main loop (at least 1 byte must be handled by tail) + + add x4, x0, x1, lsr #3 //end_input_ptr + ld1 {v20.4s}, [x8], #16 //load rk2 + + lsr x12, x11, #32 + ld1 {v21.4s}, [x8], #16 //load rk3 + orr w11, w11, w11 + + ld1 {v22.4s}, [x8], #16 //load rk4 + add x5, x5, x0 + rev w12, w12 //rev_ctr32 + + add w12, w12, #1 //increment rev_ctr32 + fmov d3, x10 //CTR block 3 + + rev w9, w12 //CTR block 1 + add w12, w12, #1 //CTR block 1 + fmov d1, x10 //CTR block 1 + + orr x9, x11, x9, lsl #32 //CTR block 1 + ld1 { v0.16b}, [x16] //special case vector load initial counter so we can start first AES block as quickly as possible + + fmov v1.d[1], x9 //CTR block 1 + rev w9, w12 //CTR block 2 + add w12, w12, #1 //CTR block 2 + + fmov d2, x10 //CTR block 2 + orr x9, x11, x9, lsl #32 //CTR block 2 + + fmov v2.d[1], x9 //CTR block 2 + rev w9, w12 //CTR block 3 + + orr x9, x11, x9, lsl #32 //CTR block 3 + ld1 {v23.4s}, [x8], #16 //load rk5 + + fmov v3.d[1], x9 //CTR block 3 + add w12, w12, #1 //CTR block 3 + + ld1 {v24.4s}, [x8], #16 //load rk6 + + ld1 {v25.4s}, [x8], #16 //load rk7 + + ld1 {v26.4s}, [x8], #16 //load rk8 + + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b //AES block 0 - round 0 + ldr q14, [x3, #80] //load h3l | h3h +#ifndef __AARCH64EB__ + ext v14.16b, v14.16b, v14.16b, #8 +#endif + + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b //AES block 3 - round 0 + ldr q15, [x3, #112] //load h4l | h4h +#ifndef __AARCH64EB__ + ext v15.16b, v15.16b, v15.16b, #8 +#endif + + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b //AES block 1 - round 0 + ldr q13, [x3, #64] //load h2l | h2h +#ifndef __AARCH64EB__ + ext v13.16b, v13.16b, v13.16b, #8 +#endif + + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b //AES block 2 - round 0 + ld1 {v27.4s}, [x8], #16 //load rk9 + + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b //AES block 0 - round 1 + + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b //AES block 1 - round 1 + ld1 { v11.16b}, [x3] + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b //AES block 2 - round 1 + ld1 {v28.4s}, [x8], #16 //load rk10 + + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b //AES block 3 - round 1 + ld1 {v29.4s}, [x8], #16 //load rk11 + + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b //AES block 0 - round 2 + ldr q12, [x3, #32] //load h1l | h1h +#ifndef __AARCH64EB__ + ext v12.16b, v12.16b, v12.16b, #8 +#endif + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b //AES block 2 - round 2 + ld1 {v30.4s}, [x8], #16 //load rk12 + + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b //AES block 3 - round 2 + + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b //AES block 0 - round 3 + + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b //AES block 1 - round 2 + + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b //AES block 3 - round 3 + + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b //AES block 0 - round 4 + cmp x0, x5 //check if we have <= 4 blocks + + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b //AES block 2 - round 3 + + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b //AES block 1 - round 3 + + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b //AES block 3 - round 4 + + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b //AES block 2 - round 4 + + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b //AES block 1 - round 4 + + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b //AES block 3 - round 5 + + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b //AES block 0 - round 5 + + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b //AES block 1 - round 5 + + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b //AES block 2 - round 5 + + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b //AES block 0 - round 6 + + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b //AES block 3 - round 6 + + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b //AES block 1 - round 6 + + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b //AES block 2 - round 6 + + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b //AES block 0 - round 7 + + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b //AES block 1 - round 7 + + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b //AES block 3 - round 7 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 0 - round 8 + + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b //AES block 2 - round 7 + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 3 - round 8 + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 1 - round 8 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 0 - round 9 + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 2 - round 8 + ld1 {v31.4s}, [x8], #16 //load rk13 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 1 - round 9 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 0 - round 10 + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 3 - round 9 + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 1 - round 10 + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 2 - round 9 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 3 - round 10 + + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b //AES block 0 - round 11 + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 2 - round 10 + + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b //AES block 3 - round 11 + + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b //AES block 1 - round 11 + + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b //AES block 2 - round 11 + + trn1 v9.2d, v14.2d, v15.2d //h4h | h3h + + trn2 v17.2d, v14.2d, v15.2d //h4l | h3l + + trn1 v8.2d, v12.2d, v13.2d //h2h | h1h + trn2 v16.2d, v12.2d, v13.2d //h2l | h1l + + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b //AES block 1 - round 12 + + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b //AES block 0 - round 12 + + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b //AES block 2 - round 12 + + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b //AES block 3 - round 12 + eor v17.16b, v17.16b, v9.16b //h4k | h3k + + aese v1.16b, v31.16b //AES block 1 - round 13 + + aese v2.16b, v31.16b //AES block 2 - round 13 + eor v16.16b, v16.16b, v8.16b //h2k | h1k + + aese v3.16b, v31.16b //AES block 3 - round 13 + + aese v0.16b, v31.16b //AES block 0 - round 13 + b.ge L256_dec_tail //handle tail + + ld1 {v4.16b, v5.16b}, [x0], #32 //AES block 0,1 - load ciphertext + + rev w9, w12 //CTR block 4 + + eor v0.16b, v4.16b, v0.16b //AES block 0 - result + + eor v1.16b, v5.16b, v1.16b //AES block 1 - result + rev64 v5.16b, v5.16b //GHASH block 1 + ld1 {v6.16b}, [x0], #16 //AES block 2 - load ciphertext + + mov x7, v0.d[1] //AES block 0 - mov high + + mov x6, v0.d[0] //AES block 0 - mov low + rev64 v4.16b, v4.16b //GHASH block 0 + add w12, w12, #1 //CTR block 4 + + fmov d0, x10 //CTR block 4 + orr x9, x11, x9, lsl #32 //CTR block 4 + + fmov v0.d[1], x9 //CTR block 4 + rev w9, w12 //CTR block 5 + add w12, w12, #1 //CTR block 5 + + mov x19, v1.d[0] //AES block 1 - mov low + + orr x9, x11, x9, lsl #32 //CTR block 5 + mov x20, v1.d[1] //AES block 1 - mov high + eor x7, x7, x14 //AES block 0 - round 14 high +#ifdef __AARCH64EB__ + rev x7, x7 +#endif + eor x6, x6, x13 //AES block 0 - round 14 low +#ifdef __AARCH64EB__ + rev x6, x6 +#endif + stp x6, x7, [x2], #16 //AES block 0 - store result + fmov d1, x10 //CTR block 5 + + ld1 {v7.16b}, [x0], #16 //AES block 3 - load ciphertext + + fmov v1.d[1], x9 //CTR block 5 + rev w9, w12 //CTR block 6 + add w12, w12, #1 //CTR block 6 + + eor x19, x19, x13 //AES block 1 - round 14 low +#ifdef __AARCH64EB__ + rev x19, x19 +#endif + orr x9, x11, x9, lsl #32 //CTR block 6 + + eor x20, x20, x14 //AES block 1 - round 14 high +#ifdef __AARCH64EB__ + rev x20, x20 +#endif + stp x19, x20, [x2], #16 //AES block 1 - store result + + eor v2.16b, v6.16b, v2.16b //AES block 2 - result + cmp x0, x5 //check if we have <= 8 blocks + b.ge L256_dec_prepretail //do prepretail + +L256_dec_main_loop: //main loop start + mov x21, v2.d[0] //AES block 4k+2 - mov low + ext v11.16b, v11.16b, v11.16b, #8 //PRE 0 + eor v3.16b, v7.16b, v3.16b //AES block 4k+3 - result + + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 0 + mov x22, v2.d[1] //AES block 4k+2 - mov high + + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 0 + fmov d2, x10 //CTR block 4k+6 + + fmov v2.d[1], x9 //CTR block 4k+6 + eor v4.16b, v4.16b, v11.16b //PRE 1 + rev w9, w12 //CTR block 4k+7 + + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 1 + mov x24, v3.d[1] //AES block 4k+3 - mov high + + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 1 + mov x23, v3.d[0] //AES block 4k+3 - mov low + + pmull2 v9.1q, v4.2d, v15.2d //GHASH block 4k - high + mov d8, v4.d[1] //GHASH block 4k - mid + fmov d3, x10 //CTR block 4k+7 + + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 2 + orr x9, x11, x9, lsl #32 //CTR block 4k+7 + + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 0 + fmov v3.d[1], x9 //CTR block 4k+7 + + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 2 + eor v8.8b, v8.8b, v4.8b //GHASH block 4k - mid + + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 3 + eor x22, x22, x14 //AES block 4k+2 - round 14 high +#ifdef __AARCH64EB__ + rev x22, x22 +#endif + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 1 + mov d10, v17.d[1] //GHASH block 4k - mid + + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 3 + rev64 v6.16b, v6.16b //GHASH block 4k+2 + + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 0 + eor x21, x21, x13 //AES block 4k+2 - round 14 low +#ifdef __AARCH64EB__ + rev x21, x21 +#endif + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 2 + stp x21, x22, [x2], #16 //AES block 4k+2 - store result + + pmull v11.1q, v4.1d, v15.1d //GHASH block 4k - low + + pmull2 v4.1q, v5.2d, v14.2d //GHASH block 4k+1 - high + + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 3 + rev64 v7.16b, v7.16b //GHASH block 4k+3 + + pmull v10.1q, v8.1d, v10.1d //GHASH block 4k - mid + eor x23, x23, x13 //AES block 4k+3 - round 14 low +#ifdef __AARCH64EB__ + rev x23, x23 +#endif + pmull v8.1q, v5.1d, v14.1d //GHASH block 4k+1 - low + eor x24, x24, x14 //AES block 4k+3 - round 14 high +#ifdef __AARCH64EB__ + rev x24, x24 +#endif + eor v9.16b, v9.16b, v4.16b //GHASH block 4k+1 - high + + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 4 + + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 1 + mov d4, v5.d[1] //GHASH block 4k+1 - mid + + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 4 + eor v11.16b, v11.16b, v8.16b //GHASH block 4k+1 - low + + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 5 + add w12, w12, #1 //CTR block 4k+7 + + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 2 + mov d8, v6.d[1] //GHASH block 4k+2 - mid + + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 4 + eor v4.8b, v4.8b, v5.8b //GHASH block 4k+1 - mid + + pmull v5.1q, v6.1d, v13.1d //GHASH block 4k+2 - low + + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 3 + eor v8.8b, v8.8b, v6.8b //GHASH block 4k+2 - mid + + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 5 + + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 5 + eor v11.16b, v11.16b, v5.16b //GHASH block 4k+2 - low + + pmull v4.1q, v4.1d, v17.1d //GHASH block 4k+1 - mid + rev w9, w12 //CTR block 4k+8 + + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 6 + ins v8.d[1], v8.d[0] //GHASH block 4k+2 - mid + + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 6 + add w12, w12, #1 //CTR block 4k+8 + + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 4 + + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 7 + eor v10.16b, v10.16b, v4.16b //GHASH block 4k+1 - mid + + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 7 + + pmull2 v4.1q, v6.2d, v13.2d //GHASH block 4k+2 - high + mov d6, v7.d[1] //GHASH block 4k+3 - mid + + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 5 + + pmull2 v8.1q, v8.2d, v16.2d //GHASH block 4k+2 - mid + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 8 + eor v9.16b, v9.16b, v4.16b //GHASH block 4k+2 - high + + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 6 + + pmull v4.1q, v7.1d, v12.1d //GHASH block 4k+3 - low + orr x9, x11, x9, lsl #32 //CTR block 4k+8 + eor v10.16b, v10.16b, v8.16b //GHASH block 4k+2 - mid + + pmull2 v5.1q, v7.2d, v12.2d //GHASH block 4k+3 - high + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 9 + eor v6.8b, v6.8b, v7.8b //GHASH block 4k+3 - mid + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 8 + + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 6 + eor v9.16b, v9.16b, v5.16b //GHASH block 4k+3 - high + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 10 + + pmull v6.1q, v6.1d, v16.1d //GHASH block 4k+3 - mid + movi v8.8b, #0xc2 + + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 7 + eor v11.16b, v11.16b, v4.16b //GHASH block 4k+3 - low + + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 11 + + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 7 + shl d8, d8, #56 //mod_constant + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 8 + eor v10.16b, v10.16b, v6.16b //GHASH block 4k+3 - mid + + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 12 + + pmull v7.1q, v9.1d, v8.1d //MODULO - top 64b align with mid + eor v6.16b, v11.16b, v9.16b //MODULO - karatsuba tidy up + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 9 + ld1 {v4.16b}, [x0], #16 //AES block 4k+4 - load ciphertext + + aese v0.16b, v31.16b //AES block 4k+4 - round 13 + ext v9.16b, v9.16b, v9.16b, #8 //MODULO - other top alignment + + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 10 + eor v10.16b, v10.16b, v6.16b //MODULO - karatsuba tidy up + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 9 + ld1 {v5.16b}, [x0], #16 //AES block 4k+5 - load ciphertext + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 8 + eor v0.16b, v4.16b, v0.16b //AES block 4k+4 - result + + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 11 + stp x23, x24, [x2], #16 //AES block 4k+3 - store result + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 10 + eor v10.16b, v10.16b, v7.16b //MODULO - fold into mid + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 9 + ld1 {v6.16b}, [x0], #16 //AES block 4k+6 - load ciphertext + + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 12 + ld1 {v7.16b}, [x0], #16 //AES block 4k+7 - load ciphertext + + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 11 + mov x7, v0.d[1] //AES block 4k+4 - mov high + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 10 + eor v10.16b, v10.16b, v9.16b //MODULO - fold into mid + + aese v1.16b, v31.16b //AES block 4k+5 - round 13 + mov x6, v0.d[0] //AES block 4k+4 - mov low + + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 12 + fmov d0, x10 //CTR block 4k+8 + + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 11 + fmov v0.d[1], x9 //CTR block 4k+8 + + pmull v8.1q, v10.1d, v8.1d //MODULO - mid 64b align with low + eor v1.16b, v5.16b, v1.16b //AES block 4k+5 - result + rev w9, w12 //CTR block 4k+9 + + aese v2.16b, v31.16b //AES block 4k+6 - round 13 + orr x9, x11, x9, lsl #32 //CTR block 4k+9 + cmp x0, x5 //LOOP CONTROL + + add w12, w12, #1 //CTR block 4k+9 + + eor x6, x6, x13 //AES block 4k+4 - round 14 low +#ifdef __AARCH64EB__ + rev x6, x6 +#endif + eor x7, x7, x14 //AES block 4k+4 - round 14 high +#ifdef __AARCH64EB__ + rev x7, x7 +#endif + mov x20, v1.d[1] //AES block 4k+5 - mov high + eor v2.16b, v6.16b, v2.16b //AES block 4k+6 - result + eor v11.16b, v11.16b, v8.16b //MODULO - fold into low + + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 12 + mov x19, v1.d[0] //AES block 4k+5 - mov low + + fmov d1, x10 //CTR block 4k+9 + ext v10.16b, v10.16b, v10.16b, #8 //MODULO - other mid alignment + + fmov v1.d[1], x9 //CTR block 4k+9 + rev w9, w12 //CTR block 4k+10 + add w12, w12, #1 //CTR block 4k+10 + + aese v3.16b, v31.16b //AES block 4k+7 - round 13 + orr x9, x11, x9, lsl #32 //CTR block 4k+10 + + rev64 v5.16b, v5.16b //GHASH block 4k+5 + eor x20, x20, x14 //AES block 4k+5 - round 14 high +#ifdef __AARCH64EB__ + rev x20, x20 +#endif + stp x6, x7, [x2], #16 //AES block 4k+4 - store result + + eor x19, x19, x13 //AES block 4k+5 - round 14 low +#ifdef __AARCH64EB__ + rev x19, x19 +#endif + stp x19, x20, [x2], #16 //AES block 4k+5 - store result + + rev64 v4.16b, v4.16b //GHASH block 4k+4 + eor v11.16b, v11.16b, v10.16b //MODULO - fold into low + b.lt L256_dec_main_loop + + +L256_dec_prepretail: //PREPRETAIL + ext v11.16b, v11.16b, v11.16b, #8 //PRE 0 + mov x21, v2.d[0] //AES block 4k+2 - mov low + eor v3.16b, v7.16b, v3.16b //AES block 4k+3 - result + + aese v0.16b, v18.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 0 + mov x22, v2.d[1] //AES block 4k+2 - mov high + + aese v1.16b, v18.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 0 + fmov d2, x10 //CTR block 4k+6 + + fmov v2.d[1], x9 //CTR block 4k+6 + rev w9, w12 //CTR block 4k+7 + eor v4.16b, v4.16b, v11.16b //PRE 1 + + rev64 v6.16b, v6.16b //GHASH block 4k+2 + orr x9, x11, x9, lsl #32 //CTR block 4k+7 + mov x23, v3.d[0] //AES block 4k+3 - mov low + + aese v1.16b, v19.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 1 + mov x24, v3.d[1] //AES block 4k+3 - mov high + + pmull v11.1q, v4.1d, v15.1d //GHASH block 4k - low + mov d8, v4.d[1] //GHASH block 4k - mid + fmov d3, x10 //CTR block 4k+7 + + pmull2 v9.1q, v4.2d, v15.2d //GHASH block 4k - high + fmov v3.d[1], x9 //CTR block 4k+7 + + aese v2.16b, v18.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 0 + mov d10, v17.d[1] //GHASH block 4k - mid + + aese v0.16b, v19.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 1 + eor v8.8b, v8.8b, v4.8b //GHASH block 4k - mid + + pmull2 v4.1q, v5.2d, v14.2d //GHASH block 4k+1 - high + + aese v2.16b, v19.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 1 + rev64 v7.16b, v7.16b //GHASH block 4k+3 + + aese v3.16b, v18.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 0 + + pmull v10.1q, v8.1d, v10.1d //GHASH block 4k - mid + eor v9.16b, v9.16b, v4.16b //GHASH block 4k+1 - high + + pmull v8.1q, v5.1d, v14.1d //GHASH block 4k+1 - low + + aese v3.16b, v19.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 1 + mov d4, v5.d[1] //GHASH block 4k+1 - mid + + aese v0.16b, v20.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 2 + + aese v1.16b, v20.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 2 + eor v11.16b, v11.16b, v8.16b //GHASH block 4k+1 - low + + aese v2.16b, v20.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 2 + + aese v0.16b, v21.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 3 + mov d8, v6.d[1] //GHASH block 4k+2 - mid + + aese v3.16b, v20.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 2 + eor v4.8b, v4.8b, v5.8b //GHASH block 4k+1 - mid + + pmull v5.1q, v6.1d, v13.1d //GHASH block 4k+2 - low + + aese v0.16b, v22.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 4 + + aese v3.16b, v21.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 3 + eor v8.8b, v8.8b, v6.8b //GHASH block 4k+2 - mid + + pmull v4.1q, v4.1d, v17.1d //GHASH block 4k+1 - mid + + aese v0.16b, v23.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 5 + eor v11.16b, v11.16b, v5.16b //GHASH block 4k+2 - low + + aese v3.16b, v22.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 4 + + pmull2 v5.1q, v7.2d, v12.2d //GHASH block 4k+3 - high + eor v10.16b, v10.16b, v4.16b //GHASH block 4k+1 - mid + + pmull2 v4.1q, v6.2d, v13.2d //GHASH block 4k+2 - high + + aese v3.16b, v23.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 5 + ins v8.d[1], v8.d[0] //GHASH block 4k+2 - mid + + aese v2.16b, v21.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 3 + + aese v1.16b, v21.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 3 + eor v9.16b, v9.16b, v4.16b //GHASH block 4k+2 - high + + pmull v4.1q, v7.1d, v12.1d //GHASH block 4k+3 - low + + aese v2.16b, v22.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 4 + mov d6, v7.d[1] //GHASH block 4k+3 - mid + + aese v1.16b, v22.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 4 + + pmull2 v8.1q, v8.2d, v16.2d //GHASH block 4k+2 - mid + + aese v2.16b, v23.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 5 + eor v6.8b, v6.8b, v7.8b //GHASH block 4k+3 - mid + + aese v1.16b, v23.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 5 + + aese v3.16b, v24.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 6 + eor v10.16b, v10.16b, v8.16b //GHASH block 4k+2 - mid + + aese v2.16b, v24.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 6 + + aese v0.16b, v24.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 6 + movi v8.8b, #0xc2 + + aese v1.16b, v24.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 6 + eor v11.16b, v11.16b, v4.16b //GHASH block 4k+3 - low + + pmull v6.1q, v6.1d, v16.1d //GHASH block 4k+3 - mid + + aese v3.16b, v25.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 7 + eor v9.16b, v9.16b, v5.16b //GHASH block 4k+3 - high + + aese v1.16b, v25.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 7 + + aese v0.16b, v25.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 7 + eor v10.16b, v10.16b, v6.16b //GHASH block 4k+3 - mid + + aese v3.16b, v26.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 8 + + aese v2.16b, v25.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 7 + eor v6.16b, v11.16b, v9.16b //MODULO - karatsuba tidy up + + aese v1.16b, v26.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 8 + + aese v0.16b, v26.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 8 + shl d8, d8, #56 //mod_constant + + aese v2.16b, v26.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 8 + + aese v1.16b, v27.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 9 + eor v10.16b, v10.16b, v6.16b //MODULO - karatsuba tidy up + + pmull v7.1q, v9.1d, v8.1d //MODULO - top 64b align with mid + + aese v2.16b, v27.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 9 + ext v9.16b, v9.16b, v9.16b, #8 //MODULO - other top alignment + + aese v3.16b, v27.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 9 + + aese v0.16b, v27.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 9 + eor v10.16b, v10.16b, v7.16b //MODULO - fold into mid + + aese v2.16b, v28.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 10 + + aese v3.16b, v28.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 10 + + aese v0.16b, v28.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 10 + eor x22, x22, x14 //AES block 4k+2 - round 14 high +#ifdef __AARCH64EB__ + rev x22, x22 +#endif + aese v1.16b, v28.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 10 + eor x23, x23, x13 //AES block 4k+3 - round 14 low +#ifdef __AARCH64EB__ + rev x23, x23 +#endif + aese v2.16b, v29.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 11 + eor v10.16b, v10.16b, v9.16b //MODULO - fold into mid + + aese v0.16b, v29.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 11 + add w12, w12, #1 //CTR block 4k+7 + + aese v1.16b, v29.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 11 + eor x21, x21, x13 //AES block 4k+2 - round 14 low +#ifdef __AARCH64EB__ + rev x21, x21 +#endif + + aese v2.16b, v30.16b + aesmc v2.16b, v2.16b //AES block 4k+6 - round 12 + + pmull v8.1q, v10.1d, v8.1d //MODULO - mid 64b align with low + eor x24, x24, x14 //AES block 4k+3 - round 14 high +#ifdef __AARCH64EB__ + rev x24, x24 +#endif + + aese v3.16b, v29.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 11 + stp x21, x22, [x2], #16 //AES block 4k+2 - store result + + aese v1.16b, v30.16b + aesmc v1.16b, v1.16b //AES block 4k+5 - round 12 + ext v10.16b, v10.16b, v10.16b, #8 //MODULO - other mid alignment + + aese v0.16b, v30.16b + aesmc v0.16b, v0.16b //AES block 4k+4 - round 12 + stp x23, x24, [x2], #16 //AES block 4k+3 - store result + + aese v3.16b, v30.16b + aesmc v3.16b, v3.16b //AES block 4k+7 - round 12 + eor v11.16b, v11.16b, v8.16b //MODULO - fold into low + + aese v1.16b, v31.16b //AES block 4k+5 - round 13 + + aese v0.16b, v31.16b //AES block 4k+4 - round 13 + + aese v3.16b, v31.16b //AES block 4k+7 - round 13 + + aese v2.16b, v31.16b //AES block 4k+6 - round 13 + eor v11.16b, v11.16b, v10.16b //MODULO - fold into low +L256_dec_tail: //TAIL + + sub x5, x4, x0 //main_end_input_ptr is number of bytes left to process + ld1 { v5.16b}, [x0], #16 //AES block 4k+4 - load ciphertext + + eor v0.16b, v5.16b, v0.16b //AES block 4k+4 - result + + mov x6, v0.d[0] //AES block 4k+4 - mov low + + mov x7, v0.d[1] //AES block 4k+4 - mov high + ext v8.16b, v11.16b, v11.16b, #8 //prepare final partial tag + + cmp x5, #48 + + eor x6, x6, x13 //AES block 4k+4 - round 14 low +#ifdef __AARCH64EB__ + rev x6, x6 +#endif + + eor x7, x7, x14 //AES block 4k+4 - round 14 high +#ifdef __AARCH64EB__ + rev x7, x7 +#endif + b.gt L256_dec_blocks_more_than_3 + + sub w12, w12, #1 + mov v3.16b, v2.16b + movi v10.8b, #0 + + movi v11.8b, #0 + cmp x5, #32 + + movi v9.8b, #0 + mov v2.16b, v1.16b + b.gt L256_dec_blocks_more_than_2 + + sub w12, w12, #1 + + mov v3.16b, v1.16b + cmp x5, #16 + b.gt L256_dec_blocks_more_than_1 + + sub w12, w12, #1 + b L256_dec_blocks_less_than_1 +L256_dec_blocks_more_than_3: //blocks left > 3 + rev64 v4.16b, v5.16b //GHASH final-3 block + ld1 { v5.16b}, [x0], #16 //AES final-2 block - load ciphertext + + stp x6, x7, [x2], #16 //AES final-3 block - store result + + mov d10, v17.d[1] //GHASH final-3 block - mid + + eor v4.16b, v4.16b, v8.16b //feed in partial tag + + eor v0.16b, v5.16b, v1.16b //AES final-2 block - result + + mov d22, v4.d[1] //GHASH final-3 block - mid + + mov x6, v0.d[0] //AES final-2 block - mov low + + mov x7, v0.d[1] //AES final-2 block - mov high + + eor v22.8b, v22.8b, v4.8b //GHASH final-3 block - mid + + movi v8.8b, #0 //suppress further partial tag feed in + + pmull2 v9.1q, v4.2d, v15.2d //GHASH final-3 block - high + + pmull v10.1q, v22.1d, v10.1d //GHASH final-3 block - mid + eor x6, x6, x13 //AES final-2 block - round 14 low +#ifdef __AARCH64EB__ + rev x6, x6 +#endif + + pmull v11.1q, v4.1d, v15.1d //GHASH final-3 block - low + eor x7, x7, x14 //AES final-2 block - round 14 high +#ifdef __AARCH64EB__ + rev x7, x7 +#endif +L256_dec_blocks_more_than_2: //blocks left > 2 + + rev64 v4.16b, v5.16b //GHASH final-2 block + ld1 { v5.16b}, [x0], #16 //AES final-1 block - load ciphertext + + eor v4.16b, v4.16b, v8.16b //feed in partial tag + stp x6, x7, [x2], #16 //AES final-2 block - store result + + eor v0.16b, v5.16b, v2.16b //AES final-1 block - result + + mov d22, v4.d[1] //GHASH final-2 block - mid + + pmull v21.1q, v4.1d, v14.1d //GHASH final-2 block - low + + pmull2 v20.1q, v4.2d, v14.2d //GHASH final-2 block - high + + eor v22.8b, v22.8b, v4.8b //GHASH final-2 block - mid + mov x6, v0.d[0] //AES final-1 block - mov low + + mov x7, v0.d[1] //AES final-1 block - mov high + eor v11.16b, v11.16b, v21.16b //GHASH final-2 block - low + movi v8.8b, #0 //suppress further partial tag feed in + + pmull v22.1q, v22.1d, v17.1d //GHASH final-2 block - mid + + eor v9.16b, v9.16b, v20.16b //GHASH final-2 block - high + eor x6, x6, x13 //AES final-1 block - round 14 low +#ifdef __AARCH64EB__ + rev x6, x6 +#endif + + eor v10.16b, v10.16b, v22.16b //GHASH final-2 block - mid + eor x7, x7, x14 //AES final-1 block - round 14 high +#ifdef __AARCH64EB__ + rev x7, x7 +#endif +L256_dec_blocks_more_than_1: //blocks left > 1 + + stp x6, x7, [x2], #16 //AES final-1 block - store result + rev64 v4.16b, v5.16b //GHASH final-1 block + + ld1 { v5.16b}, [x0], #16 //AES final block - load ciphertext + + eor v4.16b, v4.16b, v8.16b //feed in partial tag + movi v8.8b, #0 //suppress further partial tag feed in + + mov d22, v4.d[1] //GHASH final-1 block - mid + + eor v0.16b, v5.16b, v3.16b //AES final block - result + + pmull2 v20.1q, v4.2d, v13.2d //GHASH final-1 block - high + + eor v22.8b, v22.8b, v4.8b //GHASH final-1 block - mid + + pmull v21.1q, v4.1d, v13.1d //GHASH final-1 block - low + mov x6, v0.d[0] //AES final block - mov low + + ins v22.d[1], v22.d[0] //GHASH final-1 block - mid + + mov x7, v0.d[1] //AES final block - mov high + + pmull2 v22.1q, v22.2d, v16.2d //GHASH final-1 block - mid + eor x6, x6, x13 //AES final block - round 14 low +#ifdef __AARCH64EB__ + rev x6, x6 +#endif + eor v11.16b, v11.16b, v21.16b //GHASH final-1 block - low + + eor v9.16b, v9.16b, v20.16b //GHASH final-1 block - high + + eor v10.16b, v10.16b, v22.16b //GHASH final-1 block - mid + eor x7, x7, x14 //AES final block - round 14 high +#ifdef __AARCH64EB__ + rev x7, x7 +#endif +L256_dec_blocks_less_than_1: //blocks left <= 1 + + and x1, x1, #127 //bit_length %= 128 + mvn x14, xzr //rk14_h = 0xffffffffffffffff + + sub x1, x1, #128 //bit_length -= 128 + mvn x13, xzr //rk14_l = 0xffffffffffffffff + + ldp x4, x5, [x2] //load existing bytes we need to not overwrite + neg x1, x1 //bit_length = 128 - #bits in input (in range [1,128]) + + and x1, x1, #127 //bit_length %= 128 + + lsr x14, x14, x1 //rk14_h is mask for top 64b of last block + cmp x1, #64 + + csel x9, x13, x14, lt + csel x10, x14, xzr, lt + + fmov d0, x9 //ctr0b is mask for last block + and x6, x6, x9 + + mov v0.d[1], x10 + bic x4, x4, x9 //mask out low existing bytes + +#ifndef __AARCH64EB__ + rev w9, w12 +#else + mov w9, w12 +#endif + + bic x5, x5, x10 //mask out high existing bytes + + orr x6, x6, x4 + + and x7, x7, x10 + + orr x7, x7, x5 + + and v5.16b, v5.16b, v0.16b //possibly partial last block has zeroes in highest bits + + rev64 v4.16b, v5.16b //GHASH final block + + eor v4.16b, v4.16b, v8.16b //feed in partial tag + + pmull v21.1q, v4.1d, v12.1d //GHASH final block - low + + mov d8, v4.d[1] //GHASH final block - mid + + eor v8.8b, v8.8b, v4.8b //GHASH final block - mid + + pmull2 v20.1q, v4.2d, v12.2d //GHASH final block - high + + pmull v8.1q, v8.1d, v16.1d //GHASH final block - mid + + eor v9.16b, v9.16b, v20.16b //GHASH final block - high + + eor v11.16b, v11.16b, v21.16b //GHASH final block - low + + eor v10.16b, v10.16b, v8.16b //GHASH final block - mid + movi v8.8b, #0xc2 + + eor v6.16b, v11.16b, v9.16b //MODULO - karatsuba tidy up + + shl d8, d8, #56 //mod_constant + + eor v10.16b, v10.16b, v6.16b //MODULO - karatsuba tidy up + + pmull v7.1q, v9.1d, v8.1d //MODULO - top 64b align with mid + + ext v9.16b, v9.16b, v9.16b, #8 //MODULO - other top alignment + + eor v10.16b, v10.16b, v7.16b //MODULO - fold into mid + + eor v10.16b, v10.16b, v9.16b //MODULO - fold into mid + + pmull v8.1q, v10.1d, v8.1d //MODULO - mid 64b align with low + + ext v10.16b, v10.16b, v10.16b, #8 //MODULO - other mid alignment + + eor v11.16b, v11.16b, v8.16b //MODULO - fold into low + + stp x6, x7, [x2] + + str w9, [x16, #12] //store the updated counter + + eor v11.16b, v11.16b, v10.16b //MODULO - fold into low + ext v11.16b, v11.16b, v11.16b, #8 + rev64 v11.16b, v11.16b + mov x0, x15 + st1 { v11.16b }, [x3] + + ldp x21, x22, [sp, #16] + ldp x23, x24, [sp, #32] + ldp d8, d9, [sp, #48] + ldp d10, d11, [sp, #64] + ldp d12, d13, [sp, #80] + ldp d14, d15, [sp, #96] + ldp x19, x20, [sp], #112 + ret + +L256_dec_ret: + mov w0, #0x0 + ret + +.section .rodata +.byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 +.align 2 +.align 2 +#endif diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/modes/ghashv8-armx.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/modes/ghashv8-armx.S new file mode 100644 index 000000000000..5e99bb1abe83 --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/modes/ghashv8-armx.S @@ -0,0 +1,652 @@ +#include "arm_arch.h" + +#if __ARM_MAX_ARCH__>=7 +.arch armv8-a+crypto +.text +.globl gcm_init_v8 +.def gcm_init_v8 + .type 32 +.endef +.align 4 +gcm_init_v8: + AARCH64_VALID_CALL_TARGET + ld1 {v17.2d},[x1] //load input H + movi v19.16b,#0xe1 + shl v19.2d,v19.2d,#57 //0xc2.0 + ext v3.16b,v17.16b,v17.16b,#8 + ushr v18.2d,v19.2d,#63 + dup v17.4s,v17.s[1] + ext v16.16b,v18.16b,v19.16b,#8 //t0=0xc2....01 + ushr v18.2d,v3.2d,#63 + sshr v17.4s,v17.4s,#31 //broadcast carry bit + and v18.16b,v18.16b,v16.16b + shl v3.2d,v3.2d,#1 + ext v18.16b,v18.16b,v18.16b,#8 + and v16.16b,v16.16b,v17.16b + orr v3.16b,v3.16b,v18.16b //H<<<=1 + eor v20.16b,v3.16b,v16.16b //twisted H + st1 {v20.2d},[x0],#16 //store Htable[0] + + //calculate H^2 + ext v16.16b,v20.16b,v20.16b,#8 //Karatsuba pre-processing + pmull v0.1q,v20.1d,v20.1d + eor v16.16b,v16.16b,v20.16b + pmull2 v2.1q,v20.2d,v20.2d + pmull v1.1q,v16.1d,v16.1d + + ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing + eor v18.16b,v0.16b,v2.16b + eor v1.16b,v1.16b,v17.16b + eor v1.16b,v1.16b,v18.16b + pmull v18.1q,v0.1d,v19.1d //1st phase + + ins v2.d[0],v1.d[1] + ins v1.d[1],v0.d[0] + eor v0.16b,v1.16b,v18.16b + + ext v18.16b,v0.16b,v0.16b,#8 //2nd phase + pmull v0.1q,v0.1d,v19.1d + eor v18.16b,v18.16b,v2.16b + eor v22.16b,v0.16b,v18.16b + + ext v17.16b,v22.16b,v22.16b,#8 //Karatsuba pre-processing + eor v17.16b,v17.16b,v22.16b + ext v21.16b,v16.16b,v17.16b,#8 //pack Karatsuba pre-processed + st1 {v21.2d,v22.2d},[x0],#32 //store Htable[1..2] + //calculate H^3 and H^4 + pmull v0.1q,v20.1d, v22.1d + pmull v5.1q,v22.1d,v22.1d + pmull2 v2.1q,v20.2d, v22.2d + pmull2 v7.1q,v22.2d,v22.2d + pmull v1.1q,v16.1d,v17.1d + pmull v6.1q,v17.1d,v17.1d + + ext v16.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing + ext v17.16b,v5.16b,v7.16b,#8 + eor v18.16b,v0.16b,v2.16b + eor v1.16b,v1.16b,v16.16b + eor v4.16b,v5.16b,v7.16b + eor v6.16b,v6.16b,v17.16b + eor v1.16b,v1.16b,v18.16b + pmull v18.1q,v0.1d,v19.1d //1st phase + eor v6.16b,v6.16b,v4.16b + pmull v4.1q,v5.1d,v19.1d + + ins v2.d[0],v1.d[1] + ins v7.d[0],v6.d[1] + ins v1.d[1],v0.d[0] + ins v6.d[1],v5.d[0] + eor v0.16b,v1.16b,v18.16b + eor v5.16b,v6.16b,v4.16b + + ext v18.16b,v0.16b,v0.16b,#8 //2nd phase + ext v4.16b,v5.16b,v5.16b,#8 + pmull v0.1q,v0.1d,v19.1d + pmull v5.1q,v5.1d,v19.1d + eor v18.16b,v18.16b,v2.16b + eor v4.16b,v4.16b,v7.16b + eor v23.16b, v0.16b,v18.16b //H^3 + eor v25.16b,v5.16b,v4.16b //H^4 + + ext v16.16b,v23.16b, v23.16b,#8 //Karatsuba pre-processing + ext v17.16b,v25.16b,v25.16b,#8 + ext v18.16b,v22.16b,v22.16b,#8 + eor v16.16b,v16.16b,v23.16b + eor v17.16b,v17.16b,v25.16b + eor v18.16b,v18.16b,v22.16b + ext v24.16b,v16.16b,v17.16b,#8 //pack Karatsuba pre-processed + st1 {v23.2d,v24.2d,v25.2d},[x0],#48 //store Htable[3..5] + + //calculate H^5 and H^6 + pmull v0.1q,v22.1d, v23.1d + pmull v5.1q,v23.1d,v23.1d + pmull2 v2.1q,v22.2d, v23.2d + pmull2 v7.1q,v23.2d,v23.2d + pmull v1.1q,v16.1d,v18.1d + pmull v6.1q,v16.1d,v16.1d + + ext v16.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing + ext v17.16b,v5.16b,v7.16b,#8 + eor v18.16b,v0.16b,v2.16b + eor v1.16b,v1.16b,v16.16b + eor v4.16b,v5.16b,v7.16b + eor v6.16b,v6.16b,v17.16b + eor v1.16b,v1.16b,v18.16b + pmull v18.1q,v0.1d,v19.1d //1st phase + eor v6.16b,v6.16b,v4.16b + pmull v4.1q,v5.1d,v19.1d + + ins v2.d[0],v1.d[1] + ins v7.d[0],v6.d[1] + ins v1.d[1],v0.d[0] + ins v6.d[1],v5.d[0] + eor v0.16b,v1.16b,v18.16b + eor v5.16b,v6.16b,v4.16b + + ext v18.16b,v0.16b,v0.16b,#8 //2nd phase + ext v4.16b,v5.16b,v5.16b,#8 + pmull v0.1q,v0.1d,v19.1d + pmull v5.1q,v5.1d,v19.1d + eor v18.16b,v18.16b,v2.16b + eor v4.16b,v4.16b,v7.16b + eor v26.16b,v0.16b,v18.16b //H^5 + eor v28.16b,v5.16b,v4.16b //H^6 + + ext v16.16b,v26.16b, v26.16b,#8 //Karatsuba pre-processing + ext v17.16b,v28.16b,v28.16b,#8 + ext v18.16b,v22.16b,v22.16b,#8 + eor v16.16b,v16.16b,v26.16b + eor v17.16b,v17.16b,v28.16b + eor v18.16b,v18.16b,v22.16b + ext v27.16b,v16.16b,v17.16b,#8 //pack Karatsuba pre-processed + st1 {v26.2d,v27.2d,v28.2d},[x0],#48 //store Htable[6..8] + + //calculate H^7 and H^8 + pmull v0.1q,v22.1d,v26.1d + pmull v5.1q,v22.1d,v28.1d + pmull2 v2.1q,v22.2d,v26.2d + pmull2 v7.1q,v22.2d,v28.2d + pmull v1.1q,v16.1d,v18.1d + pmull v6.1q,v17.1d,v18.1d + + ext v16.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing + ext v17.16b,v5.16b,v7.16b,#8 + eor v18.16b,v0.16b,v2.16b + eor v1.16b,v1.16b,v16.16b + eor v4.16b,v5.16b,v7.16b + eor v6.16b,v6.16b,v17.16b + eor v1.16b,v1.16b,v18.16b + pmull v18.1q,v0.1d,v19.1d //1st phase + eor v6.16b,v6.16b,v4.16b + pmull v4.1q,v5.1d,v19.1d + + ins v2.d[0],v1.d[1] + ins v7.d[0],v6.d[1] + ins v1.d[1],v0.d[0] + ins v6.d[1],v5.d[0] + eor v0.16b,v1.16b,v18.16b + eor v5.16b,v6.16b,v4.16b + + ext v18.16b,v0.16b,v0.16b,#8 //2nd phase + ext v4.16b,v5.16b,v5.16b,#8 + pmull v0.1q,v0.1d,v19.1d + pmull v5.1q,v5.1d,v19.1d + eor v18.16b,v18.16b,v2.16b + eor v4.16b,v4.16b,v7.16b + eor v29.16b,v0.16b,v18.16b //H^7 + eor v31.16b,v5.16b,v4.16b //H^8 + + ext v16.16b,v29.16b,v29.16b,#8 //Karatsuba pre-processing + ext v17.16b,v31.16b,v31.16b,#8 + eor v16.16b,v16.16b,v29.16b + eor v17.16b,v17.16b,v31.16b + ext v30.16b,v16.16b,v17.16b,#8 //pack Karatsuba pre-processed + st1 {v29.2d,v30.2d,v31.2d},[x0] //store Htable[9..11] + ret + +.globl gcm_gmult_v8 +.def gcm_gmult_v8 + .type 32 +.endef +.align 4 +gcm_gmult_v8: + AARCH64_VALID_CALL_TARGET + ld1 {v17.2d},[x0] //load Xi + movi v19.16b,#0xe1 + ld1 {v20.2d,v21.2d},[x1] //load twisted H, ... + shl v19.2d,v19.2d,#57 +#ifndef __AARCH64EB__ + rev64 v17.16b,v17.16b +#endif + ext v3.16b,v17.16b,v17.16b,#8 + + pmull v0.1q,v20.1d,v3.1d //H.lo·Xi.lo + eor v17.16b,v17.16b,v3.16b //Karatsuba pre-processing + pmull2 v2.1q,v20.2d,v3.2d //H.hi·Xi.hi + pmull v1.1q,v21.1d,v17.1d //(H.lo+H.hi)·(Xi.lo+Xi.hi) + + ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing + eor v18.16b,v0.16b,v2.16b + eor v1.16b,v1.16b,v17.16b + eor v1.16b,v1.16b,v18.16b + pmull v18.1q,v0.1d,v19.1d //1st phase of reduction + + ins v2.d[0],v1.d[1] + ins v1.d[1],v0.d[0] + eor v0.16b,v1.16b,v18.16b + + ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction + pmull v0.1q,v0.1d,v19.1d + eor v18.16b,v18.16b,v2.16b + eor v0.16b,v0.16b,v18.16b + +#ifndef __AARCH64EB__ + rev64 v0.16b,v0.16b +#endif + ext v0.16b,v0.16b,v0.16b,#8 + st1 {v0.2d},[x0] //write out Xi + + ret + +.globl gcm_ghash_v8 +.def gcm_ghash_v8 + .type 32 +.endef +.align 4 +gcm_ghash_v8: + AARCH64_VALID_CALL_TARGET + cmp x3,#64 + b.hs Lgcm_ghash_v8_4x + ld1 {v0.2d},[x0] //load [rotated] Xi + //"[rotated]" means that + //loaded value would have + //to be rotated in order to + //make it appear as in + //algorithm specification + subs x3,x3,#32 //see if x3 is 32 or larger + mov x12,#16 //x12 is used as post- + //increment for input pointer; + //as loop is modulo-scheduled + //x12 is zeroed just in time + //to preclude overstepping + //inp[len], which means that + //last block[s] are actually + //loaded twice, but last + //copy is not processed + ld1 {v20.2d,v21.2d},[x1],#32 //load twisted H, ..., H^2 + movi v19.16b,#0xe1 + ld1 {v22.2d},[x1] + csel x12,xzr,x12,eq //is it time to zero x12? + ext v0.16b,v0.16b,v0.16b,#8 //rotate Xi + ld1 {v16.2d},[x2],#16 //load [rotated] I[0] + shl v19.2d,v19.2d,#57 //compose 0xc2.0 constant +#ifndef __AARCH64EB__ + rev64 v16.16b,v16.16b + rev64 v0.16b,v0.16b +#endif + ext v3.16b,v16.16b,v16.16b,#8 //rotate I[0] + b.lo Lodd_tail_v8 //x3 was less than 32 + ld1 {v17.2d},[x2],x12 //load [rotated] I[1] +#ifndef __AARCH64EB__ + rev64 v17.16b,v17.16b +#endif + ext v7.16b,v17.16b,v17.16b,#8 + eor v3.16b,v3.16b,v0.16b //I[i]^=Xi + pmull v4.1q,v20.1d,v7.1d //H·Ii+1 + eor v17.16b,v17.16b,v7.16b //Karatsuba pre-processing + pmull2 v6.1q,v20.2d,v7.2d + b Loop_mod2x_v8 + +.align 4 +Loop_mod2x_v8: + ext v18.16b,v3.16b,v3.16b,#8 + subs x3,x3,#32 //is there more data? + pmull v0.1q,v22.1d,v3.1d //H^2.lo·Xi.lo + csel x12,xzr,x12,lo //is it time to zero x12? + + pmull v5.1q,v21.1d,v17.1d + eor v18.16b,v18.16b,v3.16b //Karatsuba pre-processing + pmull2 v2.1q,v22.2d,v3.2d //H^2.hi·Xi.hi + eor v0.16b,v0.16b,v4.16b //accumulate + pmull2 v1.1q,v21.2d,v18.2d //(H^2.lo+H^2.hi)·(Xi.lo+Xi.hi) + ld1 {v16.2d},[x2],x12 //load [rotated] I[i+2] + + eor v2.16b,v2.16b,v6.16b + csel x12,xzr,x12,eq //is it time to zero x12? + eor v1.16b,v1.16b,v5.16b + + ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing + eor v18.16b,v0.16b,v2.16b + eor v1.16b,v1.16b,v17.16b + ld1 {v17.2d},[x2],x12 //load [rotated] I[i+3] +#ifndef __AARCH64EB__ + rev64 v16.16b,v16.16b +#endif + eor v1.16b,v1.16b,v18.16b + pmull v18.1q,v0.1d,v19.1d //1st phase of reduction + +#ifndef __AARCH64EB__ + rev64 v17.16b,v17.16b +#endif + ins v2.d[0],v1.d[1] + ins v1.d[1],v0.d[0] + ext v7.16b,v17.16b,v17.16b,#8 + ext v3.16b,v16.16b,v16.16b,#8 + eor v0.16b,v1.16b,v18.16b + pmull v4.1q,v20.1d,v7.1d //H·Ii+1 + eor v3.16b,v3.16b,v2.16b //accumulate v3.16b early + + ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction + pmull v0.1q,v0.1d,v19.1d + eor v3.16b,v3.16b,v18.16b + eor v17.16b,v17.16b,v7.16b //Karatsuba pre-processing + eor v3.16b,v3.16b,v0.16b + pmull2 v6.1q,v20.2d,v7.2d + b.hs Loop_mod2x_v8 //there was at least 32 more bytes + + eor v2.16b,v2.16b,v18.16b + ext v3.16b,v16.16b,v16.16b,#8 //re-construct v3.16b + adds x3,x3,#32 //re-construct x3 + eor v0.16b,v0.16b,v2.16b //re-construct v0.16b + b.eq Ldone_v8 //is x3 zero? +Lodd_tail_v8: + ext v18.16b,v0.16b,v0.16b,#8 + eor v3.16b,v3.16b,v0.16b //inp^=Xi + eor v17.16b,v16.16b,v18.16b //v17.16b is rotated inp^Xi + + pmull v0.1q,v20.1d,v3.1d //H.lo·Xi.lo + eor v17.16b,v17.16b,v3.16b //Karatsuba pre-processing + pmull2 v2.1q,v20.2d,v3.2d //H.hi·Xi.hi + pmull v1.1q,v21.1d,v17.1d //(H.lo+H.hi)·(Xi.lo+Xi.hi) + + ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing + eor v18.16b,v0.16b,v2.16b + eor v1.16b,v1.16b,v17.16b + eor v1.16b,v1.16b,v18.16b + pmull v18.1q,v0.1d,v19.1d //1st phase of reduction + + ins v2.d[0],v1.d[1] + ins v1.d[1],v0.d[0] + eor v0.16b,v1.16b,v18.16b + + ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction + pmull v0.1q,v0.1d,v19.1d + eor v18.16b,v18.16b,v2.16b + eor v0.16b,v0.16b,v18.16b + +Ldone_v8: +#ifndef __AARCH64EB__ + rev64 v0.16b,v0.16b +#endif + ext v0.16b,v0.16b,v0.16b,#8 + st1 {v0.2d},[x0] //write out Xi + + ret + +.def gcm_ghash_v8_4x + .type 32 +.endef +.align 4 +gcm_ghash_v8_4x: +Lgcm_ghash_v8_4x: + ld1 {v0.2d},[x0] //load [rotated] Xi + ld1 {v20.2d,v21.2d,v22.2d},[x1],#48 //load twisted H, ..., H^2 + movi v19.16b,#0xe1 + ld1 {v26.2d,v27.2d,v28.2d},[x1] //load twisted H^3, ..., H^4 + shl v19.2d,v19.2d,#57 //compose 0xc2.0 constant + + ld1 {v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64 +#ifndef __AARCH64EB__ + rev64 v0.16b,v0.16b + rev64 v5.16b,v5.16b + rev64 v6.16b,v6.16b + rev64 v7.16b,v7.16b + rev64 v4.16b,v4.16b +#endif + ext v25.16b,v7.16b,v7.16b,#8 + ext v24.16b,v6.16b,v6.16b,#8 + ext v23.16b,v5.16b,v5.16b,#8 + + pmull v29.1q,v20.1d,v25.1d //H·Ii+3 + eor v7.16b,v7.16b,v25.16b + pmull2 v31.1q,v20.2d,v25.2d + pmull v30.1q,v21.1d,v7.1d + + pmull v16.1q,v22.1d,v24.1d //H^2·Ii+2 + eor v6.16b,v6.16b,v24.16b + pmull2 v24.1q,v22.2d,v24.2d + pmull2 v6.1q,v21.2d,v6.2d + + eor v29.16b,v29.16b,v16.16b + eor v31.16b,v31.16b,v24.16b + eor v30.16b,v30.16b,v6.16b + + pmull v7.1q,v26.1d,v23.1d //H^3·Ii+1 + eor v5.16b,v5.16b,v23.16b + pmull2 v23.1q,v26.2d,v23.2d + pmull v5.1q,v27.1d,v5.1d + + eor v29.16b,v29.16b,v7.16b + eor v31.16b,v31.16b,v23.16b + eor v30.16b,v30.16b,v5.16b + + subs x3,x3,#128 + b.lo Ltail4x + + b Loop4x + +.align 4 +Loop4x: + eor v16.16b,v4.16b,v0.16b + ld1 {v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64 + ext v3.16b,v16.16b,v16.16b,#8 +#ifndef __AARCH64EB__ + rev64 v5.16b,v5.16b + rev64 v6.16b,v6.16b + rev64 v7.16b,v7.16b + rev64 v4.16b,v4.16b +#endif + + pmull v0.1q,v28.1d,v3.1d //H^4·(Xi+Ii) + eor v16.16b,v16.16b,v3.16b + pmull2 v2.1q,v28.2d,v3.2d + ext v25.16b,v7.16b,v7.16b,#8 + pmull2 v1.1q,v27.2d,v16.2d + + eor v0.16b,v0.16b,v29.16b + eor v2.16b,v2.16b,v31.16b + ext v24.16b,v6.16b,v6.16b,#8 + eor v1.16b,v1.16b,v30.16b + ext v23.16b,v5.16b,v5.16b,#8 + + ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing + eor v18.16b,v0.16b,v2.16b + pmull v29.1q,v20.1d,v25.1d //H·Ii+3 + eor v7.16b,v7.16b,v25.16b + eor v1.16b,v1.16b,v17.16b + pmull2 v31.1q,v20.2d,v25.2d + eor v1.16b,v1.16b,v18.16b + pmull v30.1q,v21.1d,v7.1d + + pmull v18.1q,v0.1d,v19.1d //1st phase of reduction + ins v2.d[0],v1.d[1] + ins v1.d[1],v0.d[0] + pmull v16.1q,v22.1d,v24.1d //H^2·Ii+2 + eor v6.16b,v6.16b,v24.16b + pmull2 v24.1q,v22.2d,v24.2d + eor v0.16b,v1.16b,v18.16b + pmull2 v6.1q,v21.2d,v6.2d + + eor v29.16b,v29.16b,v16.16b + eor v31.16b,v31.16b,v24.16b + eor v30.16b,v30.16b,v6.16b + + ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction + pmull v0.1q,v0.1d,v19.1d + pmull v7.1q,v26.1d,v23.1d //H^3·Ii+1 + eor v5.16b,v5.16b,v23.16b + eor v18.16b,v18.16b,v2.16b + pmull2 v23.1q,v26.2d,v23.2d + pmull v5.1q,v27.1d,v5.1d + + eor v0.16b,v0.16b,v18.16b + eor v29.16b,v29.16b,v7.16b + eor v31.16b,v31.16b,v23.16b + ext v0.16b,v0.16b,v0.16b,#8 + eor v30.16b,v30.16b,v5.16b + + subs x3,x3,#64 + b.hs Loop4x + +Ltail4x: + eor v16.16b,v4.16b,v0.16b + ext v3.16b,v16.16b,v16.16b,#8 + + pmull v0.1q,v28.1d,v3.1d //H^4·(Xi+Ii) + eor v16.16b,v16.16b,v3.16b + pmull2 v2.1q,v28.2d,v3.2d + pmull2 v1.1q,v27.2d,v16.2d + + eor v0.16b,v0.16b,v29.16b + eor v2.16b,v2.16b,v31.16b + eor v1.16b,v1.16b,v30.16b + + adds x3,x3,#64 + b.eq Ldone4x + + cmp x3,#32 + b.lo Lone + b.eq Ltwo +Lthree: + ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing + eor v18.16b,v0.16b,v2.16b + eor v1.16b,v1.16b,v17.16b + ld1 {v4.2d,v5.2d,v6.2d},[x2] + eor v1.16b,v1.16b,v18.16b +#ifndef __AARCH64EB__ + rev64 v5.16b,v5.16b + rev64 v6.16b,v6.16b + rev64 v4.16b,v4.16b +#endif + + pmull v18.1q,v0.1d,v19.1d //1st phase of reduction + ins v2.d[0],v1.d[1] + ins v1.d[1],v0.d[0] + ext v24.16b,v6.16b,v6.16b,#8 + ext v23.16b,v5.16b,v5.16b,#8 + eor v0.16b,v1.16b,v18.16b + + pmull v29.1q,v20.1d,v24.1d //H·Ii+2 + eor v6.16b,v6.16b,v24.16b + + ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction + pmull v0.1q,v0.1d,v19.1d + eor v18.16b,v18.16b,v2.16b + pmull2 v31.1q,v20.2d,v24.2d + pmull v30.1q,v21.1d,v6.1d + eor v0.16b,v0.16b,v18.16b + pmull v7.1q,v22.1d,v23.1d //H^2·Ii+1 + eor v5.16b,v5.16b,v23.16b + ext v0.16b,v0.16b,v0.16b,#8 + + pmull2 v23.1q,v22.2d,v23.2d + eor v16.16b,v4.16b,v0.16b + pmull2 v5.1q,v21.2d,v5.2d + ext v3.16b,v16.16b,v16.16b,#8 + + eor v29.16b,v29.16b,v7.16b + eor v31.16b,v31.16b,v23.16b + eor v30.16b,v30.16b,v5.16b + + pmull v0.1q,v26.1d,v3.1d //H^3·(Xi+Ii) + eor v16.16b,v16.16b,v3.16b + pmull2 v2.1q,v26.2d,v3.2d + pmull v1.1q,v27.1d,v16.1d + + eor v0.16b,v0.16b,v29.16b + eor v2.16b,v2.16b,v31.16b + eor v1.16b,v1.16b,v30.16b + b Ldone4x + +.align 4 +Ltwo: + ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing + eor v18.16b,v0.16b,v2.16b + eor v1.16b,v1.16b,v17.16b + ld1 {v4.2d,v5.2d},[x2] + eor v1.16b,v1.16b,v18.16b +#ifndef __AARCH64EB__ + rev64 v5.16b,v5.16b + rev64 v4.16b,v4.16b +#endif + + pmull v18.1q,v0.1d,v19.1d //1st phase of reduction + ins v2.d[0],v1.d[1] + ins v1.d[1],v0.d[0] + ext v23.16b,v5.16b,v5.16b,#8 + eor v0.16b,v1.16b,v18.16b + + ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction + pmull v0.1q,v0.1d,v19.1d + eor v18.16b,v18.16b,v2.16b + eor v0.16b,v0.16b,v18.16b + ext v0.16b,v0.16b,v0.16b,#8 + + pmull v29.1q,v20.1d,v23.1d //H·Ii+1 + eor v5.16b,v5.16b,v23.16b + + eor v16.16b,v4.16b,v0.16b + ext v3.16b,v16.16b,v16.16b,#8 + + pmull2 v31.1q,v20.2d,v23.2d + pmull v30.1q,v21.1d,v5.1d + + pmull v0.1q,v22.1d,v3.1d //H^2·(Xi+Ii) + eor v16.16b,v16.16b,v3.16b + pmull2 v2.1q,v22.2d,v3.2d + pmull2 v1.1q,v21.2d,v16.2d + + eor v0.16b,v0.16b,v29.16b + eor v2.16b,v2.16b,v31.16b + eor v1.16b,v1.16b,v30.16b + b Ldone4x + +.align 4 +Lone: + ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing + eor v18.16b,v0.16b,v2.16b + eor v1.16b,v1.16b,v17.16b + ld1 {v4.2d},[x2] + eor v1.16b,v1.16b,v18.16b +#ifndef __AARCH64EB__ + rev64 v4.16b,v4.16b +#endif + + pmull v18.1q,v0.1d,v19.1d //1st phase of reduction + ins v2.d[0],v1.d[1] + ins v1.d[1],v0.d[0] + eor v0.16b,v1.16b,v18.16b + + ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction + pmull v0.1q,v0.1d,v19.1d + eor v18.16b,v18.16b,v2.16b + eor v0.16b,v0.16b,v18.16b + ext v0.16b,v0.16b,v0.16b,#8 + + eor v16.16b,v4.16b,v0.16b + ext v3.16b,v16.16b,v16.16b,#8 + + pmull v0.1q,v20.1d,v3.1d + eor v16.16b,v16.16b,v3.16b + pmull2 v2.1q,v20.2d,v3.2d + pmull v1.1q,v21.1d,v16.1d + +Ldone4x: + ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing + eor v18.16b,v0.16b,v2.16b + eor v1.16b,v1.16b,v17.16b + eor v1.16b,v1.16b,v18.16b + + pmull v18.1q,v0.1d,v19.1d //1st phase of reduction + ins v2.d[0],v1.d[1] + ins v1.d[1],v0.d[0] + eor v0.16b,v1.16b,v18.16b + + ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction + pmull v0.1q,v0.1d,v19.1d + eor v18.16b,v18.16b,v2.16b + eor v0.16b,v0.16b,v18.16b + ext v0.16b,v0.16b,v0.16b,#8 + +#ifndef __AARCH64EB__ + rev64 v0.16b,v0.16b +#endif + st1 {v0.2d},[x0] //write out Xi + + ret + +.section .rodata +.byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 +.align 2 +.align 2 +#endif diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sha/keccak1600-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sha/keccak1600-armv8.S new file mode 100644 index 000000000000..f2865ac593c0 --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sha/keccak1600-armv8.S @@ -0,0 +1,1033 @@ +#include "arm_arch.h" + +.section .rodata + +.align 8 // strategic alignment and padding that allows to use + // address value as loop termination condition... +.quad 0,0,0,0,0,0,0,0 + +iotas: +.quad 0x0000000000000001 +.quad 0x0000000000008082 +.quad 0x800000000000808a +.quad 0x8000000080008000 +.quad 0x000000000000808b +.quad 0x0000000080000001 +.quad 0x8000000080008081 +.quad 0x8000000000008009 +.quad 0x000000000000008a +.quad 0x0000000000000088 +.quad 0x0000000080008009 +.quad 0x000000008000000a +.quad 0x000000008000808b +.quad 0x800000000000008b +.quad 0x8000000000008089 +.quad 0x8000000000008003 +.quad 0x8000000000008002 +.quad 0x8000000000000080 +.quad 0x000000000000800a +.quad 0x800000008000000a +.quad 0x8000000080008081 +.quad 0x8000000000008080 +.quad 0x0000000080000001 +.quad 0x8000000080008008 + +.text + +.def KeccakF1600_int + .type 32 +.endef +.align 5 +KeccakF1600_int: + AARCH64_SIGN_LINK_REGISTER + adrp x28,iotas + add x28,x28,:lo12:iotas + stp x28,x30,[sp,#16] // 32 bytes on top are mine + b Loop +.align 4 +Loop: + ////////////////////////////////////////// Theta + eor x26,x0,x5 + stp x4,x9,[sp,#0] // offload pair... + eor x27,x1,x6 + eor x28,x2,x7 + eor x30,x3,x8 + eor x4,x4,x9 + eor x26,x26,x10 + eor x27,x27,x11 + eor x28,x28,x12 + eor x30,x30,x13 + eor x4,x4,x14 + eor x26,x26,x15 + eor x27,x27,x16 + eor x28,x28,x17 + eor x30,x30,x25 + eor x4,x4,x19 + eor x26,x26,x20 + eor x28,x28,x22 + eor x27,x27,x21 + eor x30,x30,x23 + eor x4,x4,x24 + + eor x9,x26,x28,ror#63 + + eor x1,x1,x9 + eor x6,x6,x9 + eor x11,x11,x9 + eor x16,x16,x9 + eor x21,x21,x9 + + eor x9,x27,x30,ror#63 + eor x28,x28,x4,ror#63 + eor x30,x30,x26,ror#63 + eor x4,x4,x27,ror#63 + + eor x27, x2,x9 // mov x27,x2 + eor x7,x7,x9 + eor x12,x12,x9 + eor x17,x17,x9 + eor x22,x22,x9 + + eor x0,x0,x4 + eor x5,x5,x4 + eor x10,x10,x4 + eor x15,x15,x4 + eor x20,x20,x4 + ldp x4,x9,[sp,#0] // re-load offloaded data + eor x26, x3,x28 // mov x26,x3 + eor x8,x8,x28 + eor x13,x13,x28 + eor x25,x25,x28 + eor x23,x23,x28 + + eor x28, x4,x30 // mov x28,x4 + eor x9,x9,x30 + eor x14,x14,x30 + eor x19,x19,x30 + eor x24,x24,x30 + + ////////////////////////////////////////// Rho+Pi + mov x30,x1 + ror x1,x6,#64-44 + //mov x27,x2 + ror x2,x12,#64-43 + //mov x26,x3 + ror x3,x25,#64-21 + //mov x28,x4 + ror x4,x24,#64-14 + + ror x6,x9,#64-20 + ror x12,x13,#64-25 + ror x25,x17,#64-15 + ror x24,x21,#64-2 + + ror x9,x22,#64-61 + ror x13,x19,#64-8 + ror x17,x11,#64-10 + ror x21,x8,#64-55 + + ror x22,x14,#64-39 + ror x19,x23,#64-56 + ror x11,x7,#64-6 + ror x8,x16,#64-45 + + ror x14,x20,#64-18 + ror x23,x15,#64-41 + ror x7,x10,#64-3 + ror x16,x5,#64-36 + + ror x5,x26,#64-28 + ror x10,x30,#64-1 + ror x15,x28,#64-27 + ror x20,x27,#64-62 + + ////////////////////////////////////////// Chi+Iota + bic x26,x2,x1 + bic x27,x3,x2 + bic x28,x0,x4 + bic x30,x1,x0 + eor x0,x0,x26 + bic x26,x4,x3 + eor x1,x1,x27 + ldr x27,[sp,#16] + eor x3,x3,x28 + eor x4,x4,x30 + eor x2,x2,x26 + ldr x30,[x27],#8 // Iota[i++] + + bic x26,x7,x6 + tst x27,#255 // are we done? + str x27,[sp,#16] + bic x27,x8,x7 + bic x28,x5,x9 + eor x0,x0,x30 // A[0][0] ^= Iota + bic x30,x6,x5 + eor x5,x5,x26 + bic x26,x9,x8 + eor x6,x6,x27 + eor x8,x8,x28 + eor x9,x9,x30 + eor x7,x7,x26 + + bic x26,x12,x11 + bic x27,x13,x12 + bic x28,x10,x14 + bic x30,x11,x10 + eor x10,x10,x26 + bic x26,x14,x13 + eor x11,x11,x27 + eor x13,x13,x28 + eor x14,x14,x30 + eor x12,x12,x26 + + bic x26,x17,x16 + bic x27,x25,x17 + bic x28,x15,x19 + bic x30,x16,x15 + eor x15,x15,x26 + bic x26,x19,x25 + eor x16,x16,x27 + eor x25,x25,x28 + eor x19,x19,x30 + eor x17,x17,x26 + + bic x26,x22,x21 + bic x27,x23,x22 + bic x28,x20,x24 + bic x30,x21,x20 + eor x20,x20,x26 + bic x26,x24,x23 + eor x21,x21,x27 + eor x23,x23,x28 + eor x24,x24,x30 + eor x22,x22,x26 + + bne Loop + + ldr x30,[sp,#24] + AARCH64_VALIDATE_LINK_REGISTER + ret + + +.def KeccakF1600 + .type 32 +.endef +.align 5 +KeccakF1600: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-128]! + add x29,sp,#0 + stp x19,x20,[sp,#16] + stp x21,x22,[sp,#32] + stp x23,x24,[sp,#48] + stp x25,x26,[sp,#64] + stp x27,x28,[sp,#80] + sub sp,sp,#48 + + str x0,[sp,#32] // offload argument + mov x26,x0 + ldp x0,x1,[x0,#16*0] + ldp x2,x3,[x26,#16*1] + ldp x4,x5,[x26,#16*2] + ldp x6,x7,[x26,#16*3] + ldp x8,x9,[x26,#16*4] + ldp x10,x11,[x26,#16*5] + ldp x12,x13,[x26,#16*6] + ldp x14,x15,[x26,#16*7] + ldp x16,x17,[x26,#16*8] + ldp x25,x19,[x26,#16*9] + ldp x20,x21,[x26,#16*10] + ldp x22,x23,[x26,#16*11] + ldr x24,[x26,#16*12] + + bl KeccakF1600_int + + ldr x26,[sp,#32] + stp x0,x1,[x26,#16*0] + stp x2,x3,[x26,#16*1] + stp x4,x5,[x26,#16*2] + stp x6,x7,[x26,#16*3] + stp x8,x9,[x26,#16*4] + stp x10,x11,[x26,#16*5] + stp x12,x13,[x26,#16*6] + stp x14,x15,[x26,#16*7] + stp x16,x17,[x26,#16*8] + stp x25,x19,[x26,#16*9] + stp x20,x21,[x26,#16*10] + stp x22,x23,[x26,#16*11] + str x24,[x26,#16*12] + + ldp x19,x20,[x29,#16] + add sp,sp,#48 + ldp x21,x22,[x29,#32] + ldp x23,x24,[x29,#48] + ldp x25,x26,[x29,#64] + ldp x27,x28,[x29,#80] + ldp x29,x30,[sp],#128 + AARCH64_VALIDATE_LINK_REGISTER + ret + + +.globl SHA3_absorb +.def SHA3_absorb + .type 32 +.endef +.align 5 +SHA3_absorb: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-128]! + add x29,sp,#0 + stp x19,x20,[sp,#16] + stp x21,x22,[sp,#32] + stp x23,x24,[sp,#48] + stp x25,x26,[sp,#64] + stp x27,x28,[sp,#80] + sub sp,sp,#64 + + stp x0,x1,[sp,#32] // offload arguments + stp x2,x3,[sp,#48] + + mov x26,x0 // uint64_t A[5][5] + mov x27,x1 // const void *inp + mov x28,x2 // size_t len + mov x30,x3 // size_t bsz + ldp x0,x1,[x26,#16*0] + ldp x2,x3,[x26,#16*1] + ldp x4,x5,[x26,#16*2] + ldp x6,x7,[x26,#16*3] + ldp x8,x9,[x26,#16*4] + ldp x10,x11,[x26,#16*5] + ldp x12,x13,[x26,#16*6] + ldp x14,x15,[x26,#16*7] + ldp x16,x17,[x26,#16*8] + ldp x25,x19,[x26,#16*9] + ldp x20,x21,[x26,#16*10] + ldp x22,x23,[x26,#16*11] + ldr x24,[x26,#16*12] + b Loop_absorb + +.align 4 +Loop_absorb: + subs x26,x28,x30 // len - bsz + blo Labsorbed + + str x26,[sp,#48] // save len - bsz + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x0,x0,x26 + cmp x30,#8*(0+2) + blo Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x1,x1,x26 + beq Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x2,x2,x26 + cmp x30,#8*(2+2) + blo Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x3,x3,x26 + beq Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x4,x4,x26 + cmp x30,#8*(4+2) + blo Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x5,x5,x26 + beq Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x6,x6,x26 + cmp x30,#8*(6+2) + blo Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x7,x7,x26 + beq Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x8,x8,x26 + cmp x30,#8*(8+2) + blo Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x9,x9,x26 + beq Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x10,x10,x26 + cmp x30,#8*(10+2) + blo Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x11,x11,x26 + beq Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x12,x12,x26 + cmp x30,#8*(12+2) + blo Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x13,x13,x26 + beq Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x14,x14,x26 + cmp x30,#8*(14+2) + blo Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x15,x15,x26 + beq Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x16,x16,x26 + cmp x30,#8*(16+2) + blo Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x17,x17,x26 + beq Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x25,x25,x26 + cmp x30,#8*(18+2) + blo Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x19,x19,x26 + beq Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x20,x20,x26 + cmp x30,#8*(20+2) + blo Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x21,x21,x26 + beq Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x22,x22,x26 + cmp x30,#8*(22+2) + blo Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x23,x23,x26 + beq Lprocess_block + ldr x26,[x27],#8 // *inp++ +#ifdef __AARCH64EB__ + rev x26,x26 +#endif + eor x24,x24,x26 + +Lprocess_block: + str x27,[sp,#40] // save inp + + bl KeccakF1600_int + + ldr x27,[sp,#40] // restore arguments + ldp x28,x30,[sp,#48] + b Loop_absorb + +.align 4 +Labsorbed: + ldr x27,[sp,#32] + stp x0,x1,[x27,#16*0] + stp x2,x3,[x27,#16*1] + stp x4,x5,[x27,#16*2] + stp x6,x7,[x27,#16*3] + stp x8,x9,[x27,#16*4] + stp x10,x11,[x27,#16*5] + stp x12,x13,[x27,#16*6] + stp x14,x15,[x27,#16*7] + stp x16,x17,[x27,#16*8] + stp x25,x19,[x27,#16*9] + stp x20,x21,[x27,#16*10] + stp x22,x23,[x27,#16*11] + str x24,[x27,#16*12] + + mov x0,x28 // return value + ldp x19,x20,[x29,#16] + add sp,sp,#64 + ldp x21,x22,[x29,#32] + ldp x23,x24,[x29,#48] + ldp x25,x26,[x29,#64] + ldp x27,x28,[x29,#80] + ldp x29,x30,[sp],#128 + AARCH64_VALIDATE_LINK_REGISTER + ret + +.globl SHA3_squeeze +.def SHA3_squeeze + .type 32 +.endef +.align 5 +SHA3_squeeze: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-48]! + add x29,sp,#0 + stp x19,x20,[sp,#16] + stp x21,x22,[sp,#32] + + mov x19,x0 // put aside arguments + mov x20,x1 + mov x21,x2 + mov x22,x3 + cmp w4, #0 // w4 = 'next' argument + bne Lnext_block + +Loop_squeeze: + ldr x4,[x0],#8 + cmp x21,#8 + blo Lsqueeze_tail +#ifdef __AARCH64EB__ + rev x4,x4 +#endif + str x4,[x20],#8 + subs x21,x21,#8 + beq Lsqueeze_done + + subs x3,x3,#8 + bhi Loop_squeeze +Lnext_block: + mov x0,x19 + bl KeccakF1600 + mov x0,x19 + mov x3,x22 + b Loop_squeeze + +.align 4 +Lsqueeze_tail: + strb w4,[x20],#1 + lsr x4,x4,#8 + subs x21,x21,#1 + beq Lsqueeze_done + strb w4,[x20],#1 + lsr x4,x4,#8 + subs x21,x21,#1 + beq Lsqueeze_done + strb w4,[x20],#1 + lsr x4,x4,#8 + subs x21,x21,#1 + beq Lsqueeze_done + strb w4,[x20],#1 + lsr x4,x4,#8 + subs x21,x21,#1 + beq Lsqueeze_done + strb w4,[x20],#1 + lsr x4,x4,#8 + subs x21,x21,#1 + beq Lsqueeze_done + strb w4,[x20],#1 + lsr x4,x4,#8 + subs x21,x21,#1 + beq Lsqueeze_done + strb w4,[x20],#1 + +Lsqueeze_done: + ldp x19,x20,[sp,#16] + ldp x21,x22,[sp,#32] + ldp x29,x30,[sp],#48 + AARCH64_VALIDATE_LINK_REGISTER + ret + +.def KeccakF1600_ce + .type 32 +.endef +.align 5 +KeccakF1600_ce: + mov x9,#24 + adrp x10,iotas + add x10,x10,:lo12:iotas + b Loop_ce +.align 4 +Loop_ce: + ////////////////////////////////////////////////// Theta +.long 0xce0f2a99 //eor3 v25.16b,v20.16b,v15.16b,v10.16b +.long 0xce102eba //eor3 v26.16b,v21.16b,v16.16b,v11.16b +.long 0xce1132db //eor3 v27.16b,v22.16b,v17.16b,v12.16b +.long 0xce1236fc //eor3 v28.16b,v23.16b,v18.16b,v13.16b +.long 0xce133b1d //eor3 v29.16b,v24.16b,v19.16b,v14.16b +.long 0xce050339 //eor3 v25.16b,v25.16b, v5.16b,v0.16b +.long 0xce06075a //eor3 v26.16b,v26.16b, v6.16b,v1.16b +.long 0xce070b7b //eor3 v27.16b,v27.16b, v7.16b,v2.16b +.long 0xce080f9c //eor3 v28.16b,v28.16b, v8.16b,v3.16b +.long 0xce0913bd //eor3 v29.16b,v29.16b, v9.16b,v4.16b + +.long 0xce7b8f3e //rax1 v30.16b,v25.16b,v27.16b // D[1] +.long 0xce7c8f5f //rax1 v31.16b,v26.16b,v28.16b // D[2] +.long 0xce7d8f7b //rax1 v27.16b,v27.16b,v29.16b // D[3] +.long 0xce798f9c //rax1 v28.16b,v28.16b,v25.16b // D[4] +.long 0xce7a8fbd //rax1 v29.16b,v29.16b,v26.16b // D[0] + + ////////////////////////////////////////////////// Theta+Rho+Pi +.long 0xce9efc39 //xar v25.16b, v1.16b,v30.16b,#64-1 // C[0]=A[2][0] + +.long 0xce9e50c1 //xar v1.16b,v6.16b,v30.16b,#64-44 +.long 0xce9cb126 //xar v6.16b,v9.16b,v28.16b,#64-20 +.long 0xce9f0ec9 //xar v9.16b,v22.16b,v31.16b,#64-61 +.long 0xce9c65d6 //xar v22.16b,v14.16b,v28.16b,#64-39 +.long 0xce9dba8e //xar v14.16b,v20.16b,v29.16b,#64-18 + +.long 0xce9f085a //xar v26.16b, v2.16b,v31.16b,#64-62 // C[1]=A[4][0] + +.long 0xce9f5582 //xar v2.16b,v12.16b,v31.16b,#64-43 +.long 0xce9b9dac //xar v12.16b,v13.16b,v27.16b,#64-25 +.long 0xce9ce26d //xar v13.16b,v19.16b,v28.16b,#64-8 +.long 0xce9b22f3 //xar v19.16b,v23.16b,v27.16b,#64-56 +.long 0xce9d5df7 //xar v23.16b,v15.16b,v29.16b,#64-41 + +.long 0xce9c948f //xar v15.16b,v4.16b,v28.16b,#64-27 + +.long 0xce9ccb1c //xar v28.16b, v24.16b,v28.16b,#64-14 // D[4]=A[0][4] +.long 0xce9efab8 //xar v24.16b,v21.16b,v30.16b,#64-2 +.long 0xce9b2508 //xar v8.16b,v8.16b,v27.16b,#64-55 // A[1][3]=A[4][1] +.long 0xce9e4e04 //xar v4.16b,v16.16b,v30.16b,#64-45 // A[0][4]=A[1][3] +.long 0xce9d70b0 //xar v16.16b,v5.16b,v29.16b,#64-36 + +.long 0xce9b9065 //xar v5.16b,v3.16b,v27.16b,#64-28 + + eor v0.16b,v0.16b,v29.16b + +.long 0xce9bae5b //xar v27.16b, v18.16b,v27.16b,#64-21 // D[3]=A[0][3] +.long 0xce9fc623 //xar v3.16b,v17.16b,v31.16b,#64-15 // A[0][3]=A[3][3] +.long 0xce9ed97e //xar v30.16b, v11.16b,v30.16b,#64-10 // D[1]=A[3][2] +.long 0xce9fe8ff //xar v31.16b, v7.16b,v31.16b,#64-6 // D[2]=A[2][1] +.long 0xce9df55d //xar v29.16b, v10.16b,v29.16b,#64-3 // D[0]=A[1][2] + + ////////////////////////////////////////////////// Chi+Iota +.long 0xce362354 //bcax v20.16b,v26.16b, v22.16b,v8.16b // A[1][3]=A[4][1] +.long 0xce375915 //bcax v21.16b,v8.16b,v23.16b,v22.16b // A[1][3]=A[4][1] +.long 0xce385ed6 //bcax v22.16b,v22.16b,v24.16b,v23.16b +.long 0xce3a62f7 //bcax v23.16b,v23.16b,v26.16b, v24.16b +.long 0xce286b18 //bcax v24.16b,v24.16b,v8.16b,v26.16b // A[1][3]=A[4][1] + + ld1r {v26.2d},[x10],#8 + +.long 0xce330fd1 //bcax v17.16b,v30.16b, v19.16b,v3.16b // A[0][3]=A[3][3] +.long 0xce2f4c72 //bcax v18.16b,v3.16b,v15.16b,v19.16b // A[0][3]=A[3][3] +.long 0xce303e73 //bcax v19.16b,v19.16b,v16.16b,v15.16b +.long 0xce3e41ef //bcax v15.16b,v15.16b,v30.16b, v16.16b +.long 0xce237a10 //bcax v16.16b,v16.16b,v3.16b,v30.16b // A[0][3]=A[3][3] + +.long 0xce2c7f2a //bcax v10.16b,v25.16b, v12.16b,v31.16b +.long 0xce2d33eb //bcax v11.16b,v31.16b, v13.16b,v12.16b +.long 0xce2e358c //bcax v12.16b,v12.16b,v14.16b,v13.16b +.long 0xce3939ad //bcax v13.16b,v13.16b,v25.16b, v14.16b +.long 0xce3f65ce //bcax v14.16b,v14.16b,v31.16b, v25.16b + +.long 0xce2913a7 //bcax v7.16b,v29.16b, v9.16b,v4.16b // A[0][4]=A[1][3] +.long 0xce252488 //bcax v8.16b,v4.16b,v5.16b,v9.16b // A[0][4]=A[1][3] +.long 0xce261529 //bcax v9.16b,v9.16b,v6.16b,v5.16b +.long 0xce3d18a5 //bcax v5.16b,v5.16b,v29.16b, v6.16b +.long 0xce2474c6 //bcax v6.16b,v6.16b,v4.16b,v29.16b // A[0][4]=A[1][3] + +.long 0xce207363 //bcax v3.16b,v27.16b, v0.16b,v28.16b +.long 0xce210384 //bcax v4.16b,v28.16b, v1.16b,v0.16b +.long 0xce220400 //bcax v0.16b,v0.16b,v2.16b,v1.16b +.long 0xce3b0821 //bcax v1.16b,v1.16b,v27.16b, v2.16b +.long 0xce3c6c42 //bcax v2.16b,v2.16b,v28.16b, v27.16b + + eor v0.16b,v0.16b,v26.16b + + subs x9,x9,#1 + bne Loop_ce + + ret + + +.def KeccakF1600_cext + .type 32 +.endef +.align 5 +KeccakF1600_cext: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-80]! + add x29,sp,#0 + stp d8,d9,[sp,#16] // per ABI requirement + stp d10,d11,[sp,#32] + stp d12,d13,[sp,#48] + stp d14,d15,[sp,#64] + ldp d0,d1,[x0,#8*0] + ldp d2,d3,[x0,#8*2] + ldp d4,d5,[x0,#8*4] + ldp d6,d7,[x0,#8*6] + ldp d8,d9,[x0,#8*8] + ldp d10,d11,[x0,#8*10] + ldp d12,d13,[x0,#8*12] + ldp d14,d15,[x0,#8*14] + ldp d16,d17,[x0,#8*16] + ldp d18,d19,[x0,#8*18] + ldp d20,d21,[x0,#8*20] + ldp d22,d23,[x0,#8*22] + ldr d24,[x0,#8*24] + bl KeccakF1600_ce + ldr x30,[sp,#8] + stp d0,d1,[x0,#8*0] + stp d2,d3,[x0,#8*2] + stp d4,d5,[x0,#8*4] + stp d6,d7,[x0,#8*6] + stp d8,d9,[x0,#8*8] + stp d10,d11,[x0,#8*10] + stp d12,d13,[x0,#8*12] + stp d14,d15,[x0,#8*14] + stp d16,d17,[x0,#8*16] + stp d18,d19,[x0,#8*18] + stp d20,d21,[x0,#8*20] + stp d22,d23,[x0,#8*22] + str d24,[x0,#8*24] + + ldp d8,d9,[sp,#16] + ldp d10,d11,[sp,#32] + ldp d12,d13,[sp,#48] + ldp d14,d15,[sp,#64] + ldr x29,[sp],#80 + AARCH64_VALIDATE_LINK_REGISTER + ret + +.globl SHA3_absorb_cext +.def SHA3_absorb_cext + .type 32 +.endef +.align 5 +SHA3_absorb_cext: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-80]! + add x29,sp,#0 + stp d8,d9,[sp,#16] // per ABI requirement + stp d10,d11,[sp,#32] + stp d12,d13,[sp,#48] + stp d14,d15,[sp,#64] + ldp d0,d1,[x0,#8*0] + ldp d2,d3,[x0,#8*2] + ldp d4,d5,[x0,#8*4] + ldp d6,d7,[x0,#8*6] + ldp d8,d9,[x0,#8*8] + ldp d10,d11,[x0,#8*10] + ldp d12,d13,[x0,#8*12] + ldp d14,d15,[x0,#8*14] + ldp d16,d17,[x0,#8*16] + ldp d18,d19,[x0,#8*18] + ldp d20,d21,[x0,#8*20] + ldp d22,d23,[x0,#8*22] + ldr d24,[x0,#8*24] + b Loop_absorb_ce + +.align 4 +Loop_absorb_ce: + subs x2,x2,x3 // len - bsz + blo Labsorbed_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v0.16b,v0.16b,v31.16b + cmp x3,#8*(0+2) + blo Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v1.16b,v1.16b,v31.16b + beq Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v2.16b,v2.16b,v31.16b + cmp x3,#8*(2+2) + blo Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v3.16b,v3.16b,v31.16b + beq Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v4.16b,v4.16b,v31.16b + cmp x3,#8*(4+2) + blo Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v5.16b,v5.16b,v31.16b + beq Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v6.16b,v6.16b,v31.16b + cmp x3,#8*(6+2) + blo Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v7.16b,v7.16b,v31.16b + beq Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v8.16b,v8.16b,v31.16b + cmp x3,#8*(8+2) + blo Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v9.16b,v9.16b,v31.16b + beq Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v10.16b,v10.16b,v31.16b + cmp x3,#8*(10+2) + blo Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v11.16b,v11.16b,v31.16b + beq Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v12.16b,v12.16b,v31.16b + cmp x3,#8*(12+2) + blo Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v13.16b,v13.16b,v31.16b + beq Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v14.16b,v14.16b,v31.16b + cmp x3,#8*(14+2) + blo Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v15.16b,v15.16b,v31.16b + beq Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v16.16b,v16.16b,v31.16b + cmp x3,#8*(16+2) + blo Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v17.16b,v17.16b,v31.16b + beq Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v18.16b,v18.16b,v31.16b + cmp x3,#8*(18+2) + blo Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v19.16b,v19.16b,v31.16b + beq Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v20.16b,v20.16b,v31.16b + cmp x3,#8*(20+2) + blo Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v21.16b,v21.16b,v31.16b + beq Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v22.16b,v22.16b,v31.16b + cmp x3,#8*(22+2) + blo Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v23.16b,v23.16b,v31.16b + beq Lprocess_block_ce + ldr d31,[x1],#8 // *inp++ +#ifdef __AARCH64EB__ + rev64 v31.16b,v31.16b +#endif + eor v24.16b,v24.16b,v31.16b + +Lprocess_block_ce: + + bl KeccakF1600_ce + + b Loop_absorb_ce + +.align 4 +Labsorbed_ce: + stp d0,d1,[x0,#8*0] + stp d2,d3,[x0,#8*2] + stp d4,d5,[x0,#8*4] + stp d6,d7,[x0,#8*6] + stp d8,d9,[x0,#8*8] + stp d10,d11,[x0,#8*10] + stp d12,d13,[x0,#8*12] + stp d14,d15,[x0,#8*14] + stp d16,d17,[x0,#8*16] + stp d18,d19,[x0,#8*18] + stp d20,d21,[x0,#8*20] + stp d22,d23,[x0,#8*22] + str d24,[x0,#8*24] + add x0,x2,x3 // return value + + ldp d8,d9,[sp,#16] + ldp d10,d11,[sp,#32] + ldp d12,d13,[sp,#48] + ldp d14,d15,[sp,#64] + ldp x29,x30,[sp],#80 + AARCH64_VALIDATE_LINK_REGISTER + ret + +.globl SHA3_squeeze_cext +.def SHA3_squeeze_cext + .type 32 +.endef +.align 5 +SHA3_squeeze_cext: + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + mov x9,x0 + mov x10,x3 + +Loop_squeeze_ce: + ldr x4,[x9],#8 + cmp x2,#8 + blo Lsqueeze_tail_ce +#ifdef __AARCH64EB__ + rev x4,x4 +#endif + str x4,[x1],#8 + beq Lsqueeze_done_ce + + sub x2,x2,#8 + subs x10,x10,#8 + bhi Loop_squeeze_ce + + bl KeccakF1600_cext + ldr x30,[sp,#8] + mov x9,x0 + mov x10,x3 + b Loop_squeeze_ce + +.align 4 +Lsqueeze_tail_ce: + strb w4,[x1],#1 + lsr x4,x4,#8 + subs x2,x2,#1 + beq Lsqueeze_done_ce + strb w4,[x1],#1 + lsr x4,x4,#8 + subs x2,x2,#1 + beq Lsqueeze_done_ce + strb w4,[x1],#1 + lsr x4,x4,#8 + subs x2,x2,#1 + beq Lsqueeze_done_ce + strb w4,[x1],#1 + lsr x4,x4,#8 + subs x2,x2,#1 + beq Lsqueeze_done_ce + strb w4,[x1],#1 + lsr x4,x4,#8 + subs x2,x2,#1 + beq Lsqueeze_done_ce + strb w4,[x1],#1 + lsr x4,x4,#8 + subs x2,x2,#1 + beq Lsqueeze_done_ce + strb w4,[x1],#1 + +Lsqueeze_done_ce: + ldr x29,[sp],#16 + AARCH64_VALIDATE_LINK_REGISTER + ret + +.byte 75,101,99,99,97,107,45,49,54,48,48,32,97,98,115,111,114,98,32,97,110,100,32,115,113,117,101,101,122,101,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 +.align 2 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sha/sha1-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sha/sha1-armv8.S new file mode 100644 index 000000000000..da68e0f103d1 --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sha/sha1-armv8.S @@ -0,0 +1,1222 @@ +#include "arm_arch.h" +#ifndef __KERNEL__ + + +#endif + +.text + +.globl sha1_block_data_order +.def sha1_block_data_order + .type 32 +.endef +.align 6 +sha1_block_data_order: + AARCH64_VALID_CALL_TARGET + adrp x16,OPENSSL_armcap_P + ldr w16,[x16,#:lo12:OPENSSL_armcap_P] + tst w16,#ARMV8_SHA1 + b.ne Lv8_entry + + // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. + stp x29,x30,[sp,#-96]! + add x29,sp,#0 + stp x19,x20,[sp,#16] + stp x21,x22,[sp,#32] + stp x23,x24,[sp,#48] + stp x25,x26,[sp,#64] + stp x27,x28,[sp,#80] + + ldp w20,w21,[x0] + ldp w22,w23,[x0,#8] + ldr w24,[x0,#16] + +Loop: + ldr x3,[x1],#64 + movz w28,#0x7999 + sub x2,x2,#1 + movk w28,#0x5a82,lsl#16 +#ifdef __AARCH64EB__ + ror x3,x3,#32 +#else + rev32 x3,x3 +#endif + add w24,w24,w28 // warm it up + add w24,w24,w3 + lsr x4,x3,#32 + ldur x5,[x1,#-56] + bic w25,w23,w21 + and w26,w22,w21 + ror w27,w20,#27 + add w23,w23,w28 // future e+=K + orr w25,w25,w26 + add w24,w24,w27 // e+=rot(a,5) + ror w21,w21,#2 + add w23,w23,w4 // future e+=X[i] + add w24,w24,w25 // e+=F(b,c,d) +#ifdef __AARCH64EB__ + ror x5,x5,#32 +#else + rev32 x5,x5 +#endif + bic w25,w22,w20 + and w26,w21,w20 + ror w27,w24,#27 + add w22,w22,w28 // future e+=K + orr w25,w25,w26 + add w23,w23,w27 // e+=rot(a,5) + ror w20,w20,#2 + add w22,w22,w5 // future e+=X[i] + add w23,w23,w25 // e+=F(b,c,d) + lsr x6,x5,#32 + ldur x7,[x1,#-48] + bic w25,w21,w24 + and w26,w20,w24 + ror w27,w23,#27 + add w21,w21,w28 // future e+=K + orr w25,w25,w26 + add w22,w22,w27 // e+=rot(a,5) + ror w24,w24,#2 + add w21,w21,w6 // future e+=X[i] + add w22,w22,w25 // e+=F(b,c,d) +#ifdef __AARCH64EB__ + ror x7,x7,#32 +#else + rev32 x7,x7 +#endif + bic w25,w20,w23 + and w26,w24,w23 + ror w27,w22,#27 + add w20,w20,w28 // future e+=K + orr w25,w25,w26 + add w21,w21,w27 // e+=rot(a,5) + ror w23,w23,#2 + add w20,w20,w7 // future e+=X[i] + add w21,w21,w25 // e+=F(b,c,d) + lsr x8,x7,#32 + ldur x9,[x1,#-40] + bic w25,w24,w22 + and w26,w23,w22 + ror w27,w21,#27 + add w24,w24,w28 // future e+=K + orr w25,w25,w26 + add w20,w20,w27 // e+=rot(a,5) + ror w22,w22,#2 + add w24,w24,w8 // future e+=X[i] + add w20,w20,w25 // e+=F(b,c,d) +#ifdef __AARCH64EB__ + ror x9,x9,#32 +#else + rev32 x9,x9 +#endif + bic w25,w23,w21 + and w26,w22,w21 + ror w27,w20,#27 + add w23,w23,w28 // future e+=K + orr w25,w25,w26 + add w24,w24,w27 // e+=rot(a,5) + ror w21,w21,#2 + add w23,w23,w9 // future e+=X[i] + add w24,w24,w25 // e+=F(b,c,d) + lsr x10,x9,#32 + ldur x11,[x1,#-32] + bic w25,w22,w20 + and w26,w21,w20 + ror w27,w24,#27 + add w22,w22,w28 // future e+=K + orr w25,w25,w26 + add w23,w23,w27 // e+=rot(a,5) + ror w20,w20,#2 + add w22,w22,w10 // future e+=X[i] + add w23,w23,w25 // e+=F(b,c,d) +#ifdef __AARCH64EB__ + ror x11,x11,#32 +#else + rev32 x11,x11 +#endif + bic w25,w21,w24 + and w26,w20,w24 + ror w27,w23,#27 + add w21,w21,w28 // future e+=K + orr w25,w25,w26 + add w22,w22,w27 // e+=rot(a,5) + ror w24,w24,#2 + add w21,w21,w11 // future e+=X[i] + add w22,w22,w25 // e+=F(b,c,d) + lsr x12,x11,#32 + ldur x13,[x1,#-24] + bic w25,w20,w23 + and w26,w24,w23 + ror w27,w22,#27 + add w20,w20,w28 // future e+=K + orr w25,w25,w26 + add w21,w21,w27 // e+=rot(a,5) + ror w23,w23,#2 + add w20,w20,w12 // future e+=X[i] + add w21,w21,w25 // e+=F(b,c,d) +#ifdef __AARCH64EB__ + ror x13,x13,#32 +#else + rev32 x13,x13 +#endif + bic w25,w24,w22 + and w26,w23,w22 + ror w27,w21,#27 + add w24,w24,w28 // future e+=K + orr w25,w25,w26 + add w20,w20,w27 // e+=rot(a,5) + ror w22,w22,#2 + add w24,w24,w13 // future e+=X[i] + add w20,w20,w25 // e+=F(b,c,d) + lsr x14,x13,#32 + ldur x15,[x1,#-16] + bic w25,w23,w21 + and w26,w22,w21 + ror w27,w20,#27 + add w23,w23,w28 // future e+=K + orr w25,w25,w26 + add w24,w24,w27 // e+=rot(a,5) + ror w21,w21,#2 + add w23,w23,w14 // future e+=X[i] + add w24,w24,w25 // e+=F(b,c,d) +#ifdef __AARCH64EB__ + ror x15,x15,#32 +#else + rev32 x15,x15 +#endif + bic w25,w22,w20 + and w26,w21,w20 + ror w27,w24,#27 + add w22,w22,w28 // future e+=K + orr w25,w25,w26 + add w23,w23,w27 // e+=rot(a,5) + ror w20,w20,#2 + add w22,w22,w15 // future e+=X[i] + add w23,w23,w25 // e+=F(b,c,d) + lsr x16,x15,#32 + ldur x17,[x1,#-8] + bic w25,w21,w24 + and w26,w20,w24 + ror w27,w23,#27 + add w21,w21,w28 // future e+=K + orr w25,w25,w26 + add w22,w22,w27 // e+=rot(a,5) + ror w24,w24,#2 + add w21,w21,w16 // future e+=X[i] + add w22,w22,w25 // e+=F(b,c,d) +#ifdef __AARCH64EB__ + ror x17,x17,#32 +#else + rev32 x17,x17 +#endif + bic w25,w20,w23 + and w26,w24,w23 + ror w27,w22,#27 + add w20,w20,w28 // future e+=K + orr w25,w25,w26 + add w21,w21,w27 // e+=rot(a,5) + ror w23,w23,#2 + add w20,w20,w17 // future e+=X[i] + add w21,w21,w25 // e+=F(b,c,d) + lsr x19,x17,#32 + eor w3,w3,w5 + bic w25,w24,w22 + and w26,w23,w22 + ror w27,w21,#27 + eor w3,w3,w11 + add w24,w24,w28 // future e+=K + orr w25,w25,w26 + add w20,w20,w27 // e+=rot(a,5) + eor w3,w3,w16 + ror w22,w22,#2 + add w24,w24,w19 // future e+=X[i] + add w20,w20,w25 // e+=F(b,c,d) + ror w3,w3,#31 + eor w4,w4,w6 + bic w25,w23,w21 + and w26,w22,w21 + ror w27,w20,#27 + eor w4,w4,w12 + add w23,w23,w28 // future e+=K + orr w25,w25,w26 + add w24,w24,w27 // e+=rot(a,5) + eor w4,w4,w17 + ror w21,w21,#2 + add w23,w23,w3 // future e+=X[i] + add w24,w24,w25 // e+=F(b,c,d) + ror w4,w4,#31 + eor w5,w5,w7 + bic w25,w22,w20 + and w26,w21,w20 + ror w27,w24,#27 + eor w5,w5,w13 + add w22,w22,w28 // future e+=K + orr w25,w25,w26 + add w23,w23,w27 // e+=rot(a,5) + eor w5,w5,w19 + ror w20,w20,#2 + add w22,w22,w4 // future e+=X[i] + add w23,w23,w25 // e+=F(b,c,d) + ror w5,w5,#31 + eor w6,w6,w8 + bic w25,w21,w24 + and w26,w20,w24 + ror w27,w23,#27 + eor w6,w6,w14 + add w21,w21,w28 // future e+=K + orr w25,w25,w26 + add w22,w22,w27 // e+=rot(a,5) + eor w6,w6,w3 + ror w24,w24,#2 + add w21,w21,w5 // future e+=X[i] + add w22,w22,w25 // e+=F(b,c,d) + ror w6,w6,#31 + eor w7,w7,w9 + bic w25,w20,w23 + and w26,w24,w23 + ror w27,w22,#27 + eor w7,w7,w15 + add w20,w20,w28 // future e+=K + orr w25,w25,w26 + add w21,w21,w27 // e+=rot(a,5) + eor w7,w7,w4 + ror w23,w23,#2 + add w20,w20,w6 // future e+=X[i] + add w21,w21,w25 // e+=F(b,c,d) + ror w7,w7,#31 + movz w28,#0xeba1 + movk w28,#0x6ed9,lsl#16 + eor w8,w8,w10 + bic w25,w24,w22 + and w26,w23,w22 + ror w27,w21,#27 + eor w8,w8,w16 + add w24,w24,w28 // future e+=K + orr w25,w25,w26 + add w20,w20,w27 // e+=rot(a,5) + eor w8,w8,w5 + ror w22,w22,#2 + add w24,w24,w7 // future e+=X[i] + add w20,w20,w25 // e+=F(b,c,d) + ror w8,w8,#31 + eor w9,w9,w11 + eor w25,w23,w21 + ror w27,w20,#27 + add w23,w23,w28 // future e+=K + eor w9,w9,w17 + eor w25,w25,w22 + add w24,w24,w27 // e+=rot(a,5) + ror w21,w21,#2 + eor w9,w9,w6 + add w23,w23,w8 // future e+=X[i] + add w24,w24,w25 // e+=F(b,c,d) + ror w9,w9,#31 + eor w10,w10,w12 + eor w25,w22,w20 + ror w27,w24,#27 + add w22,w22,w28 // future e+=K + eor w10,w10,w19 + eor w25,w25,w21 + add w23,w23,w27 // e+=rot(a,5) + ror w20,w20,#2 + eor w10,w10,w7 + add w22,w22,w9 // future e+=X[i] + add w23,w23,w25 // e+=F(b,c,d) + ror w10,w10,#31 + eor w11,w11,w13 + eor w25,w21,w24 + ror w27,w23,#27 + add w21,w21,w28 // future e+=K + eor w11,w11,w3 + eor w25,w25,w20 + add w22,w22,w27 // e+=rot(a,5) + ror w24,w24,#2 + eor w11,w11,w8 + add w21,w21,w10 // future e+=X[i] + add w22,w22,w25 // e+=F(b,c,d) + ror w11,w11,#31 + eor w12,w12,w14 + eor w25,w20,w23 + ror w27,w22,#27 + add w20,w20,w28 // future e+=K + eor w12,w12,w4 + eor w25,w25,w24 + add w21,w21,w27 // e+=rot(a,5) + ror w23,w23,#2 + eor w12,w12,w9 + add w20,w20,w11 // future e+=X[i] + add w21,w21,w25 // e+=F(b,c,d) + ror w12,w12,#31 + eor w13,w13,w15 + eor w25,w24,w22 + ror w27,w21,#27 + add w24,w24,w28 // future e+=K + eor w13,w13,w5 + eor w25,w25,w23 + add w20,w20,w27 // e+=rot(a,5) + ror w22,w22,#2 + eor w13,w13,w10 + add w24,w24,w12 // future e+=X[i] + add w20,w20,w25 // e+=F(b,c,d) + ror w13,w13,#31 + eor w14,w14,w16 + eor w25,w23,w21 + ror w27,w20,#27 + add w23,w23,w28 // future e+=K + eor w14,w14,w6 + eor w25,w25,w22 + add w24,w24,w27 // e+=rot(a,5) + ror w21,w21,#2 + eor w14,w14,w11 + add w23,w23,w13 // future e+=X[i] + add w24,w24,w25 // e+=F(b,c,d) + ror w14,w14,#31 + eor w15,w15,w17 + eor w25,w22,w20 + ror w27,w24,#27 + add w22,w22,w28 // future e+=K + eor w15,w15,w7 + eor w25,w25,w21 + add w23,w23,w27 // e+=rot(a,5) + ror w20,w20,#2 + eor w15,w15,w12 + add w22,w22,w14 // future e+=X[i] + add w23,w23,w25 // e+=F(b,c,d) + ror w15,w15,#31 + eor w16,w16,w19 + eor w25,w21,w24 + ror w27,w23,#27 + add w21,w21,w28 // future e+=K + eor w16,w16,w8 + eor w25,w25,w20 + add w22,w22,w27 // e+=rot(a,5) + ror w24,w24,#2 + eor w16,w16,w13 + add w21,w21,w15 // future e+=X[i] + add w22,w22,w25 // e+=F(b,c,d) + ror w16,w16,#31 + eor w17,w17,w3 + eor w25,w20,w23 + ror w27,w22,#27 + add w20,w20,w28 // future e+=K + eor w17,w17,w9 + eor w25,w25,w24 + add w21,w21,w27 // e+=rot(a,5) + ror w23,w23,#2 + eor w17,w17,w14 + add w20,w20,w16 // future e+=X[i] + add w21,w21,w25 // e+=F(b,c,d) + ror w17,w17,#31 + eor w19,w19,w4 + eor w25,w24,w22 + ror w27,w21,#27 + add w24,w24,w28 // future e+=K + eor w19,w19,w10 + eor w25,w25,w23 + add w20,w20,w27 // e+=rot(a,5) + ror w22,w22,#2 + eor w19,w19,w15 + add w24,w24,w17 // future e+=X[i] + add w20,w20,w25 // e+=F(b,c,d) + ror w19,w19,#31 + eor w3,w3,w5 + eor w25,w23,w21 + ror w27,w20,#27 + add w23,w23,w28 // future e+=K + eor w3,w3,w11 + eor w25,w25,w22 + add w24,w24,w27 // e+=rot(a,5) + ror w21,w21,#2 + eor w3,w3,w16 + add w23,w23,w19 // future e+=X[i] + add w24,w24,w25 // e+=F(b,c,d) + ror w3,w3,#31 + eor w4,w4,w6 + eor w25,w22,w20 + ror w27,w24,#27 + add w22,w22,w28 // future e+=K + eor w4,w4,w12 + eor w25,w25,w21 + add w23,w23,w27 // e+=rot(a,5) + ror w20,w20,#2 + eor w4,w4,w17 + add w22,w22,w3 // future e+=X[i] + add w23,w23,w25 // e+=F(b,c,d) + ror w4,w4,#31 + eor w5,w5,w7 + eor w25,w21,w24 + ror w27,w23,#27 + add w21,w21,w28 // future e+=K + eor w5,w5,w13 + eor w25,w25,w20 + add w22,w22,w27 // e+=rot(a,5) + ror w24,w24,#2 + eor w5,w5,w19 + add w21,w21,w4 // future e+=X[i] + add w22,w22,w25 // e+=F(b,c,d) + ror w5,w5,#31 + eor w6,w6,w8 + eor w25,w20,w23 + ror w27,w22,#27 + add w20,w20,w28 // future e+=K + eor w6,w6,w14 + eor w25,w25,w24 + add w21,w21,w27 // e+=rot(a,5) + ror w23,w23,#2 + eor w6,w6,w3 + add w20,w20,w5 // future e+=X[i] + add w21,w21,w25 // e+=F(b,c,d) + ror w6,w6,#31 + eor w7,w7,w9 + eor w25,w24,w22 + ror w27,w21,#27 + add w24,w24,w28 // future e+=K + eor w7,w7,w15 + eor w25,w25,w23 + add w20,w20,w27 // e+=rot(a,5) + ror w22,w22,#2 + eor w7,w7,w4 + add w24,w24,w6 // future e+=X[i] + add w20,w20,w25 // e+=F(b,c,d) + ror w7,w7,#31 + eor w8,w8,w10 + eor w25,w23,w21 + ror w27,w20,#27 + add w23,w23,w28 // future e+=K + eor w8,w8,w16 + eor w25,w25,w22 + add w24,w24,w27 // e+=rot(a,5) + ror w21,w21,#2 + eor w8,w8,w5 + add w23,w23,w7 // future e+=X[i] + add w24,w24,w25 // e+=F(b,c,d) + ror w8,w8,#31 + eor w9,w9,w11 + eor w25,w22,w20 + ror w27,w24,#27 + add w22,w22,w28 // future e+=K + eor w9,w9,w17 + eor w25,w25,w21 + add w23,w23,w27 // e+=rot(a,5) + ror w20,w20,#2 + eor w9,w9,w6 + add w22,w22,w8 // future e+=X[i] + add w23,w23,w25 // e+=F(b,c,d) + ror w9,w9,#31 + eor w10,w10,w12 + eor w25,w21,w24 + ror w27,w23,#27 + add w21,w21,w28 // future e+=K + eor w10,w10,w19 + eor w25,w25,w20 + add w22,w22,w27 // e+=rot(a,5) + ror w24,w24,#2 + eor w10,w10,w7 + add w21,w21,w9 // future e+=X[i] + add w22,w22,w25 // e+=F(b,c,d) + ror w10,w10,#31 + eor w11,w11,w13 + eor w25,w20,w23 + ror w27,w22,#27 + add w20,w20,w28 // future e+=K + eor w11,w11,w3 + eor w25,w25,w24 + add w21,w21,w27 // e+=rot(a,5) + ror w23,w23,#2 + eor w11,w11,w8 + add w20,w20,w10 // future e+=X[i] + add w21,w21,w25 // e+=F(b,c,d) + ror w11,w11,#31 + movz w28,#0xbcdc + movk w28,#0x8f1b,lsl#16 + eor w12,w12,w14 + eor w25,w24,w22 + ror w27,w21,#27 + add w24,w24,w28 // future e+=K + eor w12,w12,w4 + eor w25,w25,w23 + add w20,w20,w27 // e+=rot(a,5) + ror w22,w22,#2 + eor w12,w12,w9 + add w24,w24,w11 // future e+=X[i] + add w20,w20,w25 // e+=F(b,c,d) + ror w12,w12,#31 + orr w25,w21,w22 + and w26,w21,w22 + eor w13,w13,w15 + ror w27,w20,#27 + and w25,w25,w23 + add w23,w23,w28 // future e+=K + eor w13,w13,w5 + add w24,w24,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w21,w21,#2 + eor w13,w13,w10 + add w23,w23,w12 // future e+=X[i] + add w24,w24,w25 // e+=F(b,c,d) + ror w13,w13,#31 + orr w25,w20,w21 + and w26,w20,w21 + eor w14,w14,w16 + ror w27,w24,#27 + and w25,w25,w22 + add w22,w22,w28 // future e+=K + eor w14,w14,w6 + add w23,w23,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w20,w20,#2 + eor w14,w14,w11 + add w22,w22,w13 // future e+=X[i] + add w23,w23,w25 // e+=F(b,c,d) + ror w14,w14,#31 + orr w25,w24,w20 + and w26,w24,w20 + eor w15,w15,w17 + ror w27,w23,#27 + and w25,w25,w21 + add w21,w21,w28 // future e+=K + eor w15,w15,w7 + add w22,w22,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w24,w24,#2 + eor w15,w15,w12 + add w21,w21,w14 // future e+=X[i] + add w22,w22,w25 // e+=F(b,c,d) + ror w15,w15,#31 + orr w25,w23,w24 + and w26,w23,w24 + eor w16,w16,w19 + ror w27,w22,#27 + and w25,w25,w20 + add w20,w20,w28 // future e+=K + eor w16,w16,w8 + add w21,w21,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w23,w23,#2 + eor w16,w16,w13 + add w20,w20,w15 // future e+=X[i] + add w21,w21,w25 // e+=F(b,c,d) + ror w16,w16,#31 + orr w25,w22,w23 + and w26,w22,w23 + eor w17,w17,w3 + ror w27,w21,#27 + and w25,w25,w24 + add w24,w24,w28 // future e+=K + eor w17,w17,w9 + add w20,w20,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w22,w22,#2 + eor w17,w17,w14 + add w24,w24,w16 // future e+=X[i] + add w20,w20,w25 // e+=F(b,c,d) + ror w17,w17,#31 + orr w25,w21,w22 + and w26,w21,w22 + eor w19,w19,w4 + ror w27,w20,#27 + and w25,w25,w23 + add w23,w23,w28 // future e+=K + eor w19,w19,w10 + add w24,w24,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w21,w21,#2 + eor w19,w19,w15 + add w23,w23,w17 // future e+=X[i] + add w24,w24,w25 // e+=F(b,c,d) + ror w19,w19,#31 + orr w25,w20,w21 + and w26,w20,w21 + eor w3,w3,w5 + ror w27,w24,#27 + and w25,w25,w22 + add w22,w22,w28 // future e+=K + eor w3,w3,w11 + add w23,w23,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w20,w20,#2 + eor w3,w3,w16 + add w22,w22,w19 // future e+=X[i] + add w23,w23,w25 // e+=F(b,c,d) + ror w3,w3,#31 + orr w25,w24,w20 + and w26,w24,w20 + eor w4,w4,w6 + ror w27,w23,#27 + and w25,w25,w21 + add w21,w21,w28 // future e+=K + eor w4,w4,w12 + add w22,w22,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w24,w24,#2 + eor w4,w4,w17 + add w21,w21,w3 // future e+=X[i] + add w22,w22,w25 // e+=F(b,c,d) + ror w4,w4,#31 + orr w25,w23,w24 + and w26,w23,w24 + eor w5,w5,w7 + ror w27,w22,#27 + and w25,w25,w20 + add w20,w20,w28 // future e+=K + eor w5,w5,w13 + add w21,w21,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w23,w23,#2 + eor w5,w5,w19 + add w20,w20,w4 // future e+=X[i] + add w21,w21,w25 // e+=F(b,c,d) + ror w5,w5,#31 + orr w25,w22,w23 + and w26,w22,w23 + eor w6,w6,w8 + ror w27,w21,#27 + and w25,w25,w24 + add w24,w24,w28 // future e+=K + eor w6,w6,w14 + add w20,w20,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w22,w22,#2 + eor w6,w6,w3 + add w24,w24,w5 // future e+=X[i] + add w20,w20,w25 // e+=F(b,c,d) + ror w6,w6,#31 + orr w25,w21,w22 + and w26,w21,w22 + eor w7,w7,w9 + ror w27,w20,#27 + and w25,w25,w23 + add w23,w23,w28 // future e+=K + eor w7,w7,w15 + add w24,w24,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w21,w21,#2 + eor w7,w7,w4 + add w23,w23,w6 // future e+=X[i] + add w24,w24,w25 // e+=F(b,c,d) + ror w7,w7,#31 + orr w25,w20,w21 + and w26,w20,w21 + eor w8,w8,w10 + ror w27,w24,#27 + and w25,w25,w22 + add w22,w22,w28 // future e+=K + eor w8,w8,w16 + add w23,w23,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w20,w20,#2 + eor w8,w8,w5 + add w22,w22,w7 // future e+=X[i] + add w23,w23,w25 // e+=F(b,c,d) + ror w8,w8,#31 + orr w25,w24,w20 + and w26,w24,w20 + eor w9,w9,w11 + ror w27,w23,#27 + and w25,w25,w21 + add w21,w21,w28 // future e+=K + eor w9,w9,w17 + add w22,w22,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w24,w24,#2 + eor w9,w9,w6 + add w21,w21,w8 // future e+=X[i] + add w22,w22,w25 // e+=F(b,c,d) + ror w9,w9,#31 + orr w25,w23,w24 + and w26,w23,w24 + eor w10,w10,w12 + ror w27,w22,#27 + and w25,w25,w20 + add w20,w20,w28 // future e+=K + eor w10,w10,w19 + add w21,w21,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w23,w23,#2 + eor w10,w10,w7 + add w20,w20,w9 // future e+=X[i] + add w21,w21,w25 // e+=F(b,c,d) + ror w10,w10,#31 + orr w25,w22,w23 + and w26,w22,w23 + eor w11,w11,w13 + ror w27,w21,#27 + and w25,w25,w24 + add w24,w24,w28 // future e+=K + eor w11,w11,w3 + add w20,w20,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w22,w22,#2 + eor w11,w11,w8 + add w24,w24,w10 // future e+=X[i] + add w20,w20,w25 // e+=F(b,c,d) + ror w11,w11,#31 + orr w25,w21,w22 + and w26,w21,w22 + eor w12,w12,w14 + ror w27,w20,#27 + and w25,w25,w23 + add w23,w23,w28 // future e+=K + eor w12,w12,w4 + add w24,w24,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w21,w21,#2 + eor w12,w12,w9 + add w23,w23,w11 // future e+=X[i] + add w24,w24,w25 // e+=F(b,c,d) + ror w12,w12,#31 + orr w25,w20,w21 + and w26,w20,w21 + eor w13,w13,w15 + ror w27,w24,#27 + and w25,w25,w22 + add w22,w22,w28 // future e+=K + eor w13,w13,w5 + add w23,w23,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w20,w20,#2 + eor w13,w13,w10 + add w22,w22,w12 // future e+=X[i] + add w23,w23,w25 // e+=F(b,c,d) + ror w13,w13,#31 + orr w25,w24,w20 + and w26,w24,w20 + eor w14,w14,w16 + ror w27,w23,#27 + and w25,w25,w21 + add w21,w21,w28 // future e+=K + eor w14,w14,w6 + add w22,w22,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w24,w24,#2 + eor w14,w14,w11 + add w21,w21,w13 // future e+=X[i] + add w22,w22,w25 // e+=F(b,c,d) + ror w14,w14,#31 + orr w25,w23,w24 + and w26,w23,w24 + eor w15,w15,w17 + ror w27,w22,#27 + and w25,w25,w20 + add w20,w20,w28 // future e+=K + eor w15,w15,w7 + add w21,w21,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w23,w23,#2 + eor w15,w15,w12 + add w20,w20,w14 // future e+=X[i] + add w21,w21,w25 // e+=F(b,c,d) + ror w15,w15,#31 + movz w28,#0xc1d6 + movk w28,#0xca62,lsl#16 + orr w25,w22,w23 + and w26,w22,w23 + eor w16,w16,w19 + ror w27,w21,#27 + and w25,w25,w24 + add w24,w24,w28 // future e+=K + eor w16,w16,w8 + add w20,w20,w27 // e+=rot(a,5) + orr w25,w25,w26 + ror w22,w22,#2 + eor w16,w16,w13 + add w24,w24,w15 // future e+=X[i] + add w20,w20,w25 // e+=F(b,c,d) + ror w16,w16,#31 + eor w17,w17,w3 + eor w25,w23,w21 + ror w27,w20,#27 + add w23,w23,w28 // future e+=K + eor w17,w17,w9 + eor w25,w25,w22 + add w24,w24,w27 // e+=rot(a,5) + ror w21,w21,#2 + eor w17,w17,w14 + add w23,w23,w16 // future e+=X[i] + add w24,w24,w25 // e+=F(b,c,d) + ror w17,w17,#31 + eor w19,w19,w4 + eor w25,w22,w20 + ror w27,w24,#27 + add w22,w22,w28 // future e+=K + eor w19,w19,w10 + eor w25,w25,w21 + add w23,w23,w27 // e+=rot(a,5) + ror w20,w20,#2 + eor w19,w19,w15 + add w22,w22,w17 // future e+=X[i] + add w23,w23,w25 // e+=F(b,c,d) + ror w19,w19,#31 + eor w3,w3,w5 + eor w25,w21,w24 + ror w27,w23,#27 + add w21,w21,w28 // future e+=K + eor w3,w3,w11 + eor w25,w25,w20 + add w22,w22,w27 // e+=rot(a,5) + ror w24,w24,#2 + eor w3,w3,w16 + add w21,w21,w19 // future e+=X[i] + add w22,w22,w25 // e+=F(b,c,d) + ror w3,w3,#31 + eor w4,w4,w6 + eor w25,w20,w23 + ror w27,w22,#27 + add w20,w20,w28 // future e+=K + eor w4,w4,w12 + eor w25,w25,w24 + add w21,w21,w27 // e+=rot(a,5) + ror w23,w23,#2 + eor w4,w4,w17 + add w20,w20,w3 // future e+=X[i] + add w21,w21,w25 // e+=F(b,c,d) + ror w4,w4,#31 + eor w5,w5,w7 + eor w25,w24,w22 + ror w27,w21,#27 + add w24,w24,w28 // future e+=K + eor w5,w5,w13 + eor w25,w25,w23 + add w20,w20,w27 // e+=rot(a,5) + ror w22,w22,#2 + eor w5,w5,w19 + add w24,w24,w4 // future e+=X[i] + add w20,w20,w25 // e+=F(b,c,d) + ror w5,w5,#31 + eor w6,w6,w8 + eor w25,w23,w21 + ror w27,w20,#27 + add w23,w23,w28 // future e+=K + eor w6,w6,w14 + eor w25,w25,w22 + add w24,w24,w27 // e+=rot(a,5) + ror w21,w21,#2 + eor w6,w6,w3 + add w23,w23,w5 // future e+=X[i] + add w24,w24,w25 // e+=F(b,c,d) + ror w6,w6,#31 + eor w7,w7,w9 + eor w25,w22,w20 + ror w27,w24,#27 + add w22,w22,w28 // future e+=K + eor w7,w7,w15 + eor w25,w25,w21 + add w23,w23,w27 // e+=rot(a,5) + ror w20,w20,#2 + eor w7,w7,w4 + add w22,w22,w6 // future e+=X[i] + add w23,w23,w25 // e+=F(b,c,d) + ror w7,w7,#31 + eor w8,w8,w10 + eor w25,w21,w24 + ror w27,w23,#27 + add w21,w21,w28 // future e+=K + eor w8,w8,w16 + eor w25,w25,w20 + add w22,w22,w27 // e+=rot(a,5) + ror w24,w24,#2 + eor w8,w8,w5 + add w21,w21,w7 // future e+=X[i] + add w22,w22,w25 // e+=F(b,c,d) + ror w8,w8,#31 + eor w9,w9,w11 + eor w25,w20,w23 + ror w27,w22,#27 + add w20,w20,w28 // future e+=K + eor w9,w9,w17 + eor w25,w25,w24 + add w21,w21,w27 // e+=rot(a,5) + ror w23,w23,#2 + eor w9,w9,w6 + add w20,w20,w8 // future e+=X[i] + add w21,w21,w25 // e+=F(b,c,d) + ror w9,w9,#31 + eor w10,w10,w12 + eor w25,w24,w22 + ror w27,w21,#27 + add w24,w24,w28 // future e+=K + eor w10,w10,w19 + eor w25,w25,w23 + add w20,w20,w27 // e+=rot(a,5) + ror w22,w22,#2 + eor w10,w10,w7 + add w24,w24,w9 // future e+=X[i] + add w20,w20,w25 // e+=F(b,c,d) + ror w10,w10,#31 + eor w11,w11,w13 + eor w25,w23,w21 + ror w27,w20,#27 + add w23,w23,w28 // future e+=K + eor w11,w11,w3 + eor w25,w25,w22 + add w24,w24,w27 // e+=rot(a,5) + ror w21,w21,#2 + eor w11,w11,w8 + add w23,w23,w10 // future e+=X[i] + add w24,w24,w25 // e+=F(b,c,d) + ror w11,w11,#31 + eor w12,w12,w14 + eor w25,w22,w20 + ror w27,w24,#27 + add w22,w22,w28 // future e+=K + eor w12,w12,w4 + eor w25,w25,w21 + add w23,w23,w27 // e+=rot(a,5) + ror w20,w20,#2 + eor w12,w12,w9 + add w22,w22,w11 // future e+=X[i] + add w23,w23,w25 // e+=F(b,c,d) + ror w12,w12,#31 + eor w13,w13,w15 + eor w25,w21,w24 + ror w27,w23,#27 + add w21,w21,w28 // future e+=K + eor w13,w13,w5 + eor w25,w25,w20 + add w22,w22,w27 // e+=rot(a,5) + ror w24,w24,#2 + eor w13,w13,w10 + add w21,w21,w12 // future e+=X[i] + add w22,w22,w25 // e+=F(b,c,d) + ror w13,w13,#31 + eor w14,w14,w16 + eor w25,w20,w23 + ror w27,w22,#27 + add w20,w20,w28 // future e+=K + eor w14,w14,w6 + eor w25,w25,w24 + add w21,w21,w27 // e+=rot(a,5) + ror w23,w23,#2 + eor w14,w14,w11 + add w20,w20,w13 // future e+=X[i] + add w21,w21,w25 // e+=F(b,c,d) + ror w14,w14,#31 + eor w15,w15,w17 + eor w25,w24,w22 + ror w27,w21,#27 + add w24,w24,w28 // future e+=K + eor w15,w15,w7 + eor w25,w25,w23 + add w20,w20,w27 // e+=rot(a,5) + ror w22,w22,#2 + eor w15,w15,w12 + add w24,w24,w14 // future e+=X[i] + add w20,w20,w25 // e+=F(b,c,d) + ror w15,w15,#31 + eor w16,w16,w19 + eor w25,w23,w21 + ror w27,w20,#27 + add w23,w23,w28 // future e+=K + eor w16,w16,w8 + eor w25,w25,w22 + add w24,w24,w27 // e+=rot(a,5) + ror w21,w21,#2 + eor w16,w16,w13 + add w23,w23,w15 // future e+=X[i] + add w24,w24,w25 // e+=F(b,c,d) + ror w16,w16,#31 + eor w17,w17,w3 + eor w25,w22,w20 + ror w27,w24,#27 + add w22,w22,w28 // future e+=K + eor w17,w17,w9 + eor w25,w25,w21 + add w23,w23,w27 // e+=rot(a,5) + ror w20,w20,#2 + eor w17,w17,w14 + add w22,w22,w16 // future e+=X[i] + add w23,w23,w25 // e+=F(b,c,d) + ror w17,w17,#31 + eor w19,w19,w4 + eor w25,w21,w24 + ror w27,w23,#27 + add w21,w21,w28 // future e+=K + eor w19,w19,w10 + eor w25,w25,w20 + add w22,w22,w27 // e+=rot(a,5) + ror w24,w24,#2 + eor w19,w19,w15 + add w21,w21,w17 // future e+=X[i] + add w22,w22,w25 // e+=F(b,c,d) + ror w19,w19,#31 + ldp w4,w5,[x0] + eor w25,w20,w23 + ror w27,w22,#27 + add w20,w20,w28 // future e+=K + eor w25,w25,w24 + add w21,w21,w27 // e+=rot(a,5) + ror w23,w23,#2 + add w20,w20,w19 // future e+=X[i] + add w21,w21,w25 // e+=F(b,c,d) + ldp w6,w7,[x0,#8] + eor w25,w24,w22 + ror w27,w21,#27 + eor w25,w25,w23 + add w20,w20,w27 // e+=rot(a,5) + ror w22,w22,#2 + ldr w8,[x0,#16] + add w20,w20,w25 // e+=F(b,c,d) + add w21,w21,w5 + add w22,w22,w6 + add w20,w20,w4 + add w23,w23,w7 + add w24,w24,w8 + stp w20,w21,[x0] + stp w22,w23,[x0,#8] + str w24,[x0,#16] + cbnz x2,Loop + + ldp x19,x20,[sp,#16] + ldp x21,x22,[sp,#32] + ldp x23,x24,[sp,#48] + ldp x25,x26,[sp,#64] + ldp x27,x28,[sp,#80] + ldr x29,[sp],#96 + ret + +.def sha1_block_armv8 + .type 32 +.endef +.align 6 +sha1_block_armv8: +Lv8_entry: + // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + + adrp x4,Lconst + add x4,x4,:lo12:Lconst + eor v1.16b,v1.16b,v1.16b + ld1 {v0.4s},[x0],#16 + ld1 {v1.s}[0],[x0] + sub x0,x0,#16 + ld1 {v16.4s,v17.4s,v18.4s,v19.4s},[x4] + +Loop_hw: + ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64 + sub x2,x2,#1 + rev32 v4.16b,v4.16b + rev32 v5.16b,v5.16b + + add v20.4s,v16.4s,v4.4s + rev32 v6.16b,v6.16b + orr v22.16b,v0.16b,v0.16b // offload + + add v21.4s,v16.4s,v5.4s + rev32 v7.16b,v7.16b +.long 0x5e280803 //sha1h v3.16b,v0.16b +.long 0x5e140020 //sha1c v0.16b,v1.16b,v20.4s // 0 + add v20.4s,v16.4s,v6.4s +.long 0x5e0630a4 //sha1su0 v4.16b,v5.16b,v6.16b +.long 0x5e280802 //sha1h v2.16b,v0.16b // 1 +.long 0x5e150060 //sha1c v0.16b,v3.16b,v21.4s + add v21.4s,v16.4s,v7.4s +.long 0x5e2818e4 //sha1su1 v4.16b,v7.16b +.long 0x5e0730c5 //sha1su0 v5.16b,v6.16b,v7.16b +.long 0x5e280803 //sha1h v3.16b,v0.16b // 2 +.long 0x5e140040 //sha1c v0.16b,v2.16b,v20.4s + add v20.4s,v16.4s,v4.4s +.long 0x5e281885 //sha1su1 v5.16b,v4.16b +.long 0x5e0430e6 //sha1su0 v6.16b,v7.16b,v4.16b +.long 0x5e280802 //sha1h v2.16b,v0.16b // 3 +.long 0x5e150060 //sha1c v0.16b,v3.16b,v21.4s + add v21.4s,v17.4s,v5.4s +.long 0x5e2818a6 //sha1su1 v6.16b,v5.16b +.long 0x5e053087 //sha1su0 v7.16b,v4.16b,v5.16b +.long 0x5e280803 //sha1h v3.16b,v0.16b // 4 +.long 0x5e140040 //sha1c v0.16b,v2.16b,v20.4s + add v20.4s,v17.4s,v6.4s +.long 0x5e2818c7 //sha1su1 v7.16b,v6.16b +.long 0x5e0630a4 //sha1su0 v4.16b,v5.16b,v6.16b +.long 0x5e280802 //sha1h v2.16b,v0.16b // 5 +.long 0x5e151060 //sha1p v0.16b,v3.16b,v21.4s + add v21.4s,v17.4s,v7.4s +.long 0x5e2818e4 //sha1su1 v4.16b,v7.16b +.long 0x5e0730c5 //sha1su0 v5.16b,v6.16b,v7.16b +.long 0x5e280803 //sha1h v3.16b,v0.16b // 6 +.long 0x5e141040 //sha1p v0.16b,v2.16b,v20.4s + add v20.4s,v17.4s,v4.4s +.long 0x5e281885 //sha1su1 v5.16b,v4.16b +.long 0x5e0430e6 //sha1su0 v6.16b,v7.16b,v4.16b +.long 0x5e280802 //sha1h v2.16b,v0.16b // 7 +.long 0x5e151060 //sha1p v0.16b,v3.16b,v21.4s + add v21.4s,v17.4s,v5.4s +.long 0x5e2818a6 //sha1su1 v6.16b,v5.16b +.long 0x5e053087 //sha1su0 v7.16b,v4.16b,v5.16b +.long 0x5e280803 //sha1h v3.16b,v0.16b // 8 +.long 0x5e141040 //sha1p v0.16b,v2.16b,v20.4s + add v20.4s,v18.4s,v6.4s +.long 0x5e2818c7 //sha1su1 v7.16b,v6.16b +.long 0x5e0630a4 //sha1su0 v4.16b,v5.16b,v6.16b +.long 0x5e280802 //sha1h v2.16b,v0.16b // 9 +.long 0x5e151060 //sha1p v0.16b,v3.16b,v21.4s + add v21.4s,v18.4s,v7.4s +.long 0x5e2818e4 //sha1su1 v4.16b,v7.16b +.long 0x5e0730c5 //sha1su0 v5.16b,v6.16b,v7.16b +.long 0x5e280803 //sha1h v3.16b,v0.16b // 10 +.long 0x5e142040 //sha1m v0.16b,v2.16b,v20.4s + add v20.4s,v18.4s,v4.4s +.long 0x5e281885 //sha1su1 v5.16b,v4.16b +.long 0x5e0430e6 //sha1su0 v6.16b,v7.16b,v4.16b +.long 0x5e280802 //sha1h v2.16b,v0.16b // 11 +.long 0x5e152060 //sha1m v0.16b,v3.16b,v21.4s + add v21.4s,v18.4s,v5.4s +.long 0x5e2818a6 //sha1su1 v6.16b,v5.16b +.long 0x5e053087 //sha1su0 v7.16b,v4.16b,v5.16b +.long 0x5e280803 //sha1h v3.16b,v0.16b // 12 +.long 0x5e142040 //sha1m v0.16b,v2.16b,v20.4s + add v20.4s,v18.4s,v6.4s +.long 0x5e2818c7 //sha1su1 v7.16b,v6.16b +.long 0x5e0630a4 //sha1su0 v4.16b,v5.16b,v6.16b +.long 0x5e280802 //sha1h v2.16b,v0.16b // 13 +.long 0x5e152060 //sha1m v0.16b,v3.16b,v21.4s + add v21.4s,v19.4s,v7.4s +.long 0x5e2818e4 //sha1su1 v4.16b,v7.16b +.long 0x5e0730c5 //sha1su0 v5.16b,v6.16b,v7.16b +.long 0x5e280803 //sha1h v3.16b,v0.16b // 14 +.long 0x5e142040 //sha1m v0.16b,v2.16b,v20.4s + add v20.4s,v19.4s,v4.4s +.long 0x5e281885 //sha1su1 v5.16b,v4.16b +.long 0x5e0430e6 //sha1su0 v6.16b,v7.16b,v4.16b +.long 0x5e280802 //sha1h v2.16b,v0.16b // 15 +.long 0x5e151060 //sha1p v0.16b,v3.16b,v21.4s + add v21.4s,v19.4s,v5.4s +.long 0x5e2818a6 //sha1su1 v6.16b,v5.16b +.long 0x5e053087 //sha1su0 v7.16b,v4.16b,v5.16b +.long 0x5e280803 //sha1h v3.16b,v0.16b // 16 +.long 0x5e141040 //sha1p v0.16b,v2.16b,v20.4s + add v20.4s,v19.4s,v6.4s +.long 0x5e2818c7 //sha1su1 v7.16b,v6.16b +.long 0x5e280802 //sha1h v2.16b,v0.16b // 17 +.long 0x5e151060 //sha1p v0.16b,v3.16b,v21.4s + add v21.4s,v19.4s,v7.4s + +.long 0x5e280803 //sha1h v3.16b,v0.16b // 18 +.long 0x5e141040 //sha1p v0.16b,v2.16b,v20.4s + +.long 0x5e280802 //sha1h v2.16b,v0.16b // 19 +.long 0x5e151060 //sha1p v0.16b,v3.16b,v21.4s + + add v1.4s,v1.4s,v2.4s + add v0.4s,v0.4s,v22.4s + + cbnz x2,Loop_hw + + st1 {v0.4s},[x0],#16 + st1 {v1.s}[0],[x0] + + ldr x29,[sp],#16 + ret + + +.section .rodata + +.align 6 +Lconst: +.long 0x5a827999,0x5a827999,0x5a827999,0x5a827999 //K_00_19 +.long 0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1 //K_20_39 +.long 0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc //K_40_59 +.long 0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6 //K_60_79 +.byte 83,72,65,49,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 +.align 2 +.align 2 diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sha/sha256-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sha/sha256-armv8.S new file mode 100644 index 000000000000..f40771dcd0b5 --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sha/sha256-armv8.S @@ -0,0 +1,2068 @@ +// Copyright 2014-2025 The OpenSSL Project Authors. All Rights Reserved. +// +// Licensed under the Apache License 2.0 (the "License"). You may not use +// this file except in compliance with the License. You can obtain a copy +// in the file LICENSE in the source distribution or at +// https://www.openssl.org/source/license.html + +// ==================================================================== +// Written by Andy Polyakov for the OpenSSL +// project. The module is, however, dual licensed under OpenSSL and +// CRYPTOGAMS licenses depending on where you obtain it. For further +// details see http://www.openssl.org/~appro/cryptogams/. +// +// Permission to use under GPLv2 terms is granted. +// ==================================================================== +// +// SHA256/512 for ARMv8. +// +// Performance in cycles per processed byte and improvement coefficient +// over code generated with "default" compiler: +// +// SHA256-hw SHA256(*) SHA512 +// Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**)) +// Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***)) +// Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***)) +// Denver 2.01 10.5 (+26%) 6.70 (+8%) +// X-Gene 20.0 (+100%) 12.8 (+300%(***)) +// Mongoose 2.36 13.0 (+50%) 8.36 (+33%) +// Kryo 1.92 17.4 (+30%) 11.2 (+8%) +// ThunderX2 2.54 13.2 (+40%) 8.40 (+18%) +// +// (*) Software SHA256 results are of lesser relevance, presented +// mostly for informational purposes. +// (**) The result is a trade-off: it's possible to improve it by +// 10% (or by 1 cycle per round), but at the cost of 20% loss +// on Cortex-A53 (or by 4 cycles per round). +// (***) Super-impressive coefficients over gcc-generated code are +// indication of some compiler "pathology", most notably code +// generated with -mgeneral-regs-only is significantly faster +// and the gap is only 40-90%. +// +// October 2016. +// +// Originally it was reckoned that it makes no sense to implement NEON +// version of SHA256 for 64-bit processors. This is because performance +// improvement on most wide-spread Cortex-A5x processors was observed +// to be marginal, same on Cortex-A53 and ~10% on A57. But then it was +// observed that 32-bit NEON SHA256 performs significantly better than +// 64-bit scalar version on *some* of the more recent processors. As +// result 64-bit NEON version of SHA256 was added to provide best +// all-round performance. For example it executes ~30% faster on X-Gene +// and Mongoose. [For reference, NEON version of SHA512 is bound to +// deliver much less improvement, likely *negative* on Cortex-A5x. +// Which is why NEON support is limited to SHA256.] + +// $output is the last argument if it looks like a file (it has an extension) +// $flavour is the first argument if it doesn't look like a file +#include "arm_arch.h" +#ifndef __KERNEL__ + + +#endif + +.text + +.globl sha256_block_data_order +.def sha256_block_data_order + .type 32 +.endef +.align 6 +sha256_block_data_order: + AARCH64_VALID_CALL_TARGET +#ifndef __KERNEL__ + adrp x16,OPENSSL_armcap_P + ldr w16,[x16,#:lo12:OPENSSL_armcap_P] + tst w16,#ARMV8_SHA256 + b.ne Lv8_entry + tst w16,#ARMV7_NEON + b.ne Lneon_entry +#endif + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-128]! + add x29,sp,#0 + + stp x19,x20,[sp,#16] + stp x21,x22,[sp,#32] + stp x23,x24,[sp,#48] + stp x25,x26,[sp,#64] + stp x27,x28,[sp,#80] + sub sp,sp,#4*4 + + ldp w20,w21,[x0] // load context + ldp w22,w23,[x0,#2*4] + ldp w24,w25,[x0,#4*4] + add x2,x1,x2,lsl#6 // end of input + ldp w26,w27,[x0,#6*4] + adrp x30,LK256 + add x30,x30,:lo12:LK256 + stp x0,x2,[x29,#96] + +Loop: + ldp w3,w4,[x1],#2*4 + ldr w19,[x30],#4 // *K++ + eor w28,w21,w22 // magic seed + str x1,[x29,#112] +#ifndef __AARCH64EB__ + rev w3,w3 // 0 +#endif + ror w16,w24,#6 + add w27,w27,w19 // h+=K[i] + eor w6,w24,w24,ror#14 + and w17,w25,w24 + bic w19,w26,w24 + add w27,w27,w3 // h+=X[i] + orr w17,w17,w19 // Ch(e,f,g) + eor w19,w20,w21 // a^b, b^c in next round + eor w16,w16,w6,ror#11 // Sigma1(e) + ror w6,w20,#2 + add w27,w27,w17 // h+=Ch(e,f,g) + eor w17,w20,w20,ror#9 + add w27,w27,w16 // h+=Sigma1(e) + and w28,w28,w19 // (b^c)&=(a^b) + add w23,w23,w27 // d+=h + eor w28,w28,w21 // Maj(a,b,c) + eor w17,w6,w17,ror#13 // Sigma0(a) + add w27,w27,w28 // h+=Maj(a,b,c) + ldr w28,[x30],#4 // *K++, w19 in next round + //add w27,w27,w17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev w4,w4 // 1 +#endif + ldp w5,w6,[x1],#2*4 + add w27,w27,w17 // h+=Sigma0(a) + ror w16,w23,#6 + add w26,w26,w28 // h+=K[i] + eor w7,w23,w23,ror#14 + and w17,w24,w23 + bic w28,w25,w23 + add w26,w26,w4 // h+=X[i] + orr w17,w17,w28 // Ch(e,f,g) + eor w28,w27,w20 // a^b, b^c in next round + eor w16,w16,w7,ror#11 // Sigma1(e) + ror w7,w27,#2 + add w26,w26,w17 // h+=Ch(e,f,g) + eor w17,w27,w27,ror#9 + add w26,w26,w16 // h+=Sigma1(e) + and w19,w19,w28 // (b^c)&=(a^b) + add w22,w22,w26 // d+=h + eor w19,w19,w20 // Maj(a,b,c) + eor w17,w7,w17,ror#13 // Sigma0(a) + add w26,w26,w19 // h+=Maj(a,b,c) + ldr w19,[x30],#4 // *K++, w28 in next round + //add w26,w26,w17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev w5,w5 // 2 +#endif + add w26,w26,w17 // h+=Sigma0(a) + ror w16,w22,#6 + add w25,w25,w19 // h+=K[i] + eor w8,w22,w22,ror#14 + and w17,w23,w22 + bic w19,w24,w22 + add w25,w25,w5 // h+=X[i] + orr w17,w17,w19 // Ch(e,f,g) + eor w19,w26,w27 // a^b, b^c in next round + eor w16,w16,w8,ror#11 // Sigma1(e) + ror w8,w26,#2 + add w25,w25,w17 // h+=Ch(e,f,g) + eor w17,w26,w26,ror#9 + add w25,w25,w16 // h+=Sigma1(e) + and w28,w28,w19 // (b^c)&=(a^b) + add w21,w21,w25 // d+=h + eor w28,w28,w27 // Maj(a,b,c) + eor w17,w8,w17,ror#13 // Sigma0(a) + add w25,w25,w28 // h+=Maj(a,b,c) + ldr w28,[x30],#4 // *K++, w19 in next round + //add w25,w25,w17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev w6,w6 // 3 +#endif + ldp w7,w8,[x1],#2*4 + add w25,w25,w17 // h+=Sigma0(a) + ror w16,w21,#6 + add w24,w24,w28 // h+=K[i] + eor w9,w21,w21,ror#14 + and w17,w22,w21 + bic w28,w23,w21 + add w24,w24,w6 // h+=X[i] + orr w17,w17,w28 // Ch(e,f,g) + eor w28,w25,w26 // a^b, b^c in next round + eor w16,w16,w9,ror#11 // Sigma1(e) + ror w9,w25,#2 + add w24,w24,w17 // h+=Ch(e,f,g) + eor w17,w25,w25,ror#9 + add w24,w24,w16 // h+=Sigma1(e) + and w19,w19,w28 // (b^c)&=(a^b) + add w20,w20,w24 // d+=h + eor w19,w19,w26 // Maj(a,b,c) + eor w17,w9,w17,ror#13 // Sigma0(a) + add w24,w24,w19 // h+=Maj(a,b,c) + ldr w19,[x30],#4 // *K++, w28 in next round + //add w24,w24,w17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev w7,w7 // 4 +#endif + add w24,w24,w17 // h+=Sigma0(a) + ror w16,w20,#6 + add w23,w23,w19 // h+=K[i] + eor w10,w20,w20,ror#14 + and w17,w21,w20 + bic w19,w22,w20 + add w23,w23,w7 // h+=X[i] + orr w17,w17,w19 // Ch(e,f,g) + eor w19,w24,w25 // a^b, b^c in next round + eor w16,w16,w10,ror#11 // Sigma1(e) + ror w10,w24,#2 + add w23,w23,w17 // h+=Ch(e,f,g) + eor w17,w24,w24,ror#9 + add w23,w23,w16 // h+=Sigma1(e) + and w28,w28,w19 // (b^c)&=(a^b) + add w27,w27,w23 // d+=h + eor w28,w28,w25 // Maj(a,b,c) + eor w17,w10,w17,ror#13 // Sigma0(a) + add w23,w23,w28 // h+=Maj(a,b,c) + ldr w28,[x30],#4 // *K++, w19 in next round + //add w23,w23,w17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev w8,w8 // 5 +#endif + ldp w9,w10,[x1],#2*4 + add w23,w23,w17 // h+=Sigma0(a) + ror w16,w27,#6 + add w22,w22,w28 // h+=K[i] + eor w11,w27,w27,ror#14 + and w17,w20,w27 + bic w28,w21,w27 + add w22,w22,w8 // h+=X[i] + orr w17,w17,w28 // Ch(e,f,g) + eor w28,w23,w24 // a^b, b^c in next round + eor w16,w16,w11,ror#11 // Sigma1(e) + ror w11,w23,#2 + add w22,w22,w17 // h+=Ch(e,f,g) + eor w17,w23,w23,ror#9 + add w22,w22,w16 // h+=Sigma1(e) + and w19,w19,w28 // (b^c)&=(a^b) + add w26,w26,w22 // d+=h + eor w19,w19,w24 // Maj(a,b,c) + eor w17,w11,w17,ror#13 // Sigma0(a) + add w22,w22,w19 // h+=Maj(a,b,c) + ldr w19,[x30],#4 // *K++, w28 in next round + //add w22,w22,w17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev w9,w9 // 6 +#endif + add w22,w22,w17 // h+=Sigma0(a) + ror w16,w26,#6 + add w21,w21,w19 // h+=K[i] + eor w12,w26,w26,ror#14 + and w17,w27,w26 + bic w19,w20,w26 + add w21,w21,w9 // h+=X[i] + orr w17,w17,w19 // Ch(e,f,g) + eor w19,w22,w23 // a^b, b^c in next round + eor w16,w16,w12,ror#11 // Sigma1(e) + ror w12,w22,#2 + add w21,w21,w17 // h+=Ch(e,f,g) + eor w17,w22,w22,ror#9 + add w21,w21,w16 // h+=Sigma1(e) + and w28,w28,w19 // (b^c)&=(a^b) + add w25,w25,w21 // d+=h + eor w28,w28,w23 // Maj(a,b,c) + eor w17,w12,w17,ror#13 // Sigma0(a) + add w21,w21,w28 // h+=Maj(a,b,c) + ldr w28,[x30],#4 // *K++, w19 in next round + //add w21,w21,w17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev w10,w10 // 7 +#endif + ldp w11,w12,[x1],#2*4 + add w21,w21,w17 // h+=Sigma0(a) + ror w16,w25,#6 + add w20,w20,w28 // h+=K[i] + eor w13,w25,w25,ror#14 + and w17,w26,w25 + bic w28,w27,w25 + add w20,w20,w10 // h+=X[i] + orr w17,w17,w28 // Ch(e,f,g) + eor w28,w21,w22 // a^b, b^c in next round + eor w16,w16,w13,ror#11 // Sigma1(e) + ror w13,w21,#2 + add w20,w20,w17 // h+=Ch(e,f,g) + eor w17,w21,w21,ror#9 + add w20,w20,w16 // h+=Sigma1(e) + and w19,w19,w28 // (b^c)&=(a^b) + add w24,w24,w20 // d+=h + eor w19,w19,w22 // Maj(a,b,c) + eor w17,w13,w17,ror#13 // Sigma0(a) + add w20,w20,w19 // h+=Maj(a,b,c) + ldr w19,[x30],#4 // *K++, w28 in next round + //add w20,w20,w17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev w11,w11 // 8 +#endif + add w20,w20,w17 // h+=Sigma0(a) + ror w16,w24,#6 + add w27,w27,w19 // h+=K[i] + eor w14,w24,w24,ror#14 + and w17,w25,w24 + bic w19,w26,w24 + add w27,w27,w11 // h+=X[i] + orr w17,w17,w19 // Ch(e,f,g) + eor w19,w20,w21 // a^b, b^c in next round + eor w16,w16,w14,ror#11 // Sigma1(e) + ror w14,w20,#2 + add w27,w27,w17 // h+=Ch(e,f,g) + eor w17,w20,w20,ror#9 + add w27,w27,w16 // h+=Sigma1(e) + and w28,w28,w19 // (b^c)&=(a^b) + add w23,w23,w27 // d+=h + eor w28,w28,w21 // Maj(a,b,c) + eor w17,w14,w17,ror#13 // Sigma0(a) + add w27,w27,w28 // h+=Maj(a,b,c) + ldr w28,[x30],#4 // *K++, w19 in next round + //add w27,w27,w17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev w12,w12 // 9 +#endif + ldp w13,w14,[x1],#2*4 + add w27,w27,w17 // h+=Sigma0(a) + ror w16,w23,#6 + add w26,w26,w28 // h+=K[i] + eor w15,w23,w23,ror#14 + and w17,w24,w23 + bic w28,w25,w23 + add w26,w26,w12 // h+=X[i] + orr w17,w17,w28 // Ch(e,f,g) + eor w28,w27,w20 // a^b, b^c in next round + eor w16,w16,w15,ror#11 // Sigma1(e) + ror w15,w27,#2 + add w26,w26,w17 // h+=Ch(e,f,g) + eor w17,w27,w27,ror#9 + add w26,w26,w16 // h+=Sigma1(e) + and w19,w19,w28 // (b^c)&=(a^b) + add w22,w22,w26 // d+=h + eor w19,w19,w20 // Maj(a,b,c) + eor w17,w15,w17,ror#13 // Sigma0(a) + add w26,w26,w19 // h+=Maj(a,b,c) + ldr w19,[x30],#4 // *K++, w28 in next round + //add w26,w26,w17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev w13,w13 // 10 +#endif + add w26,w26,w17 // h+=Sigma0(a) + ror w16,w22,#6 + add w25,w25,w19 // h+=K[i] + eor w0,w22,w22,ror#14 + and w17,w23,w22 + bic w19,w24,w22 + add w25,w25,w13 // h+=X[i] + orr w17,w17,w19 // Ch(e,f,g) + eor w19,w26,w27 // a^b, b^c in next round + eor w16,w16,w0,ror#11 // Sigma1(e) + ror w0,w26,#2 + add w25,w25,w17 // h+=Ch(e,f,g) + eor w17,w26,w26,ror#9 + add w25,w25,w16 // h+=Sigma1(e) + and w28,w28,w19 // (b^c)&=(a^b) + add w21,w21,w25 // d+=h + eor w28,w28,w27 // Maj(a,b,c) + eor w17,w0,w17,ror#13 // Sigma0(a) + add w25,w25,w28 // h+=Maj(a,b,c) + ldr w28,[x30],#4 // *K++, w19 in next round + //add w25,w25,w17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev w14,w14 // 11 +#endif + ldp w15,w0,[x1],#2*4 + add w25,w25,w17 // h+=Sigma0(a) + str w6,[sp,#12] + ror w16,w21,#6 + add w24,w24,w28 // h+=K[i] + eor w6,w21,w21,ror#14 + and w17,w22,w21 + bic w28,w23,w21 + add w24,w24,w14 // h+=X[i] + orr w17,w17,w28 // Ch(e,f,g) + eor w28,w25,w26 // a^b, b^c in next round + eor w16,w16,w6,ror#11 // Sigma1(e) + ror w6,w25,#2 + add w24,w24,w17 // h+=Ch(e,f,g) + eor w17,w25,w25,ror#9 + add w24,w24,w16 // h+=Sigma1(e) + and w19,w19,w28 // (b^c)&=(a^b) + add w20,w20,w24 // d+=h + eor w19,w19,w26 // Maj(a,b,c) + eor w17,w6,w17,ror#13 // Sigma0(a) + add w24,w24,w19 // h+=Maj(a,b,c) + ldr w19,[x30],#4 // *K++, w28 in next round + //add w24,w24,w17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev w15,w15 // 12 +#endif + add w24,w24,w17 // h+=Sigma0(a) + str w7,[sp,#0] + ror w16,w20,#6 + add w23,w23,w19 // h+=K[i] + eor w7,w20,w20,ror#14 + and w17,w21,w20 + bic w19,w22,w20 + add w23,w23,w15 // h+=X[i] + orr w17,w17,w19 // Ch(e,f,g) + eor w19,w24,w25 // a^b, b^c in next round + eor w16,w16,w7,ror#11 // Sigma1(e) + ror w7,w24,#2 + add w23,w23,w17 // h+=Ch(e,f,g) + eor w17,w24,w24,ror#9 + add w23,w23,w16 // h+=Sigma1(e) + and w28,w28,w19 // (b^c)&=(a^b) + add w27,w27,w23 // d+=h + eor w28,w28,w25 // Maj(a,b,c) + eor w17,w7,w17,ror#13 // Sigma0(a) + add w23,w23,w28 // h+=Maj(a,b,c) + ldr w28,[x30],#4 // *K++, w19 in next round + //add w23,w23,w17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev w0,w0 // 13 +#endif + ldp w1,w2,[x1] + add w23,w23,w17 // h+=Sigma0(a) + str w8,[sp,#4] + ror w16,w27,#6 + add w22,w22,w28 // h+=K[i] + eor w8,w27,w27,ror#14 + and w17,w20,w27 + bic w28,w21,w27 + add w22,w22,w0 // h+=X[i] + orr w17,w17,w28 // Ch(e,f,g) + eor w28,w23,w24 // a^b, b^c in next round + eor w16,w16,w8,ror#11 // Sigma1(e) + ror w8,w23,#2 + add w22,w22,w17 // h+=Ch(e,f,g) + eor w17,w23,w23,ror#9 + add w22,w22,w16 // h+=Sigma1(e) + and w19,w19,w28 // (b^c)&=(a^b) + add w26,w26,w22 // d+=h + eor w19,w19,w24 // Maj(a,b,c) + eor w17,w8,w17,ror#13 // Sigma0(a) + add w22,w22,w19 // h+=Maj(a,b,c) + ldr w19,[x30],#4 // *K++, w28 in next round + //add w22,w22,w17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev w1,w1 // 14 +#endif + ldr w6,[sp,#12] + add w22,w22,w17 // h+=Sigma0(a) + str w9,[sp,#8] + ror w16,w26,#6 + add w21,w21,w19 // h+=K[i] + eor w9,w26,w26,ror#14 + and w17,w27,w26 + bic w19,w20,w26 + add w21,w21,w1 // h+=X[i] + orr w17,w17,w19 // Ch(e,f,g) + eor w19,w22,w23 // a^b, b^c in next round + eor w16,w16,w9,ror#11 // Sigma1(e) + ror w9,w22,#2 + add w21,w21,w17 // h+=Ch(e,f,g) + eor w17,w22,w22,ror#9 + add w21,w21,w16 // h+=Sigma1(e) + and w28,w28,w19 // (b^c)&=(a^b) + add w25,w25,w21 // d+=h + eor w28,w28,w23 // Maj(a,b,c) + eor w17,w9,w17,ror#13 // Sigma0(a) + add w21,w21,w28 // h+=Maj(a,b,c) + ldr w28,[x30],#4 // *K++, w19 in next round + //add w21,w21,w17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev w2,w2 // 15 +#endif + ldr w7,[sp,#0] + add w21,w21,w17 // h+=Sigma0(a) + str w10,[sp,#12] + ror w16,w25,#6 + add w20,w20,w28 // h+=K[i] + ror w9,w4,#7 + and w17,w26,w25 + ror w8,w1,#17 + bic w28,w27,w25 + ror w10,w21,#2 + add w20,w20,w2 // h+=X[i] + eor w16,w16,w25,ror#11 + eor w9,w9,w4,ror#18 + orr w17,w17,w28 // Ch(e,f,g) + eor w28,w21,w22 // a^b, b^c in next round + eor w16,w16,w25,ror#25 // Sigma1(e) + eor w10,w10,w21,ror#13 + add w20,w20,w17 // h+=Ch(e,f,g) + and w19,w19,w28 // (b^c)&=(a^b) + eor w8,w8,w1,ror#19 + eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) + add w20,w20,w16 // h+=Sigma1(e) + eor w19,w19,w22 // Maj(a,b,c) + eor w17,w10,w21,ror#22 // Sigma0(a) + eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) + add w3,w3,w12 + add w24,w24,w20 // d+=h + add w20,w20,w19 // h+=Maj(a,b,c) + ldr w19,[x30],#4 // *K++, w28 in next round + add w3,w3,w9 + add w20,w20,w17 // h+=Sigma0(a) + add w3,w3,w8 +Loop_16_xx: + ldr w8,[sp,#4] + str w11,[sp,#0] + ror w16,w24,#6 + add w27,w27,w19 // h+=K[i] + ror w10,w5,#7 + and w17,w25,w24 + ror w9,w2,#17 + bic w19,w26,w24 + ror w11,w20,#2 + add w27,w27,w3 // h+=X[i] + eor w16,w16,w24,ror#11 + eor w10,w10,w5,ror#18 + orr w17,w17,w19 // Ch(e,f,g) + eor w19,w20,w21 // a^b, b^c in next round + eor w16,w16,w24,ror#25 // Sigma1(e) + eor w11,w11,w20,ror#13 + add w27,w27,w17 // h+=Ch(e,f,g) + and w28,w28,w19 // (b^c)&=(a^b) + eor w9,w9,w2,ror#19 + eor w10,w10,w5,lsr#3 // sigma0(X[i+1]) + add w27,w27,w16 // h+=Sigma1(e) + eor w28,w28,w21 // Maj(a,b,c) + eor w17,w11,w20,ror#22 // Sigma0(a) + eor w9,w9,w2,lsr#10 // sigma1(X[i+14]) + add w4,w4,w13 + add w23,w23,w27 // d+=h + add w27,w27,w28 // h+=Maj(a,b,c) + ldr w28,[x30],#4 // *K++, w19 in next round + add w4,w4,w10 + add w27,w27,w17 // h+=Sigma0(a) + add w4,w4,w9 + ldr w9,[sp,#8] + str w12,[sp,#4] + ror w16,w23,#6 + add w26,w26,w28 // h+=K[i] + ror w11,w6,#7 + and w17,w24,w23 + ror w10,w3,#17 + bic w28,w25,w23 + ror w12,w27,#2 + add w26,w26,w4 // h+=X[i] + eor w16,w16,w23,ror#11 + eor w11,w11,w6,ror#18 + orr w17,w17,w28 // Ch(e,f,g) + eor w28,w27,w20 // a^b, b^c in next round + eor w16,w16,w23,ror#25 // Sigma1(e) + eor w12,w12,w27,ror#13 + add w26,w26,w17 // h+=Ch(e,f,g) + and w19,w19,w28 // (b^c)&=(a^b) + eor w10,w10,w3,ror#19 + eor w11,w11,w6,lsr#3 // sigma0(X[i+1]) + add w26,w26,w16 // h+=Sigma1(e) + eor w19,w19,w20 // Maj(a,b,c) + eor w17,w12,w27,ror#22 // Sigma0(a) + eor w10,w10,w3,lsr#10 // sigma1(X[i+14]) + add w5,w5,w14 + add w22,w22,w26 // d+=h + add w26,w26,w19 // h+=Maj(a,b,c) + ldr w19,[x30],#4 // *K++, w28 in next round + add w5,w5,w11 + add w26,w26,w17 // h+=Sigma0(a) + add w5,w5,w10 + ldr w10,[sp,#12] + str w13,[sp,#8] + ror w16,w22,#6 + add w25,w25,w19 // h+=K[i] + ror w12,w7,#7 + and w17,w23,w22 + ror w11,w4,#17 + bic w19,w24,w22 + ror w13,w26,#2 + add w25,w25,w5 // h+=X[i] + eor w16,w16,w22,ror#11 + eor w12,w12,w7,ror#18 + orr w17,w17,w19 // Ch(e,f,g) + eor w19,w26,w27 // a^b, b^c in next round + eor w16,w16,w22,ror#25 // Sigma1(e) + eor w13,w13,w26,ror#13 + add w25,w25,w17 // h+=Ch(e,f,g) + and w28,w28,w19 // (b^c)&=(a^b) + eor w11,w11,w4,ror#19 + eor w12,w12,w7,lsr#3 // sigma0(X[i+1]) + add w25,w25,w16 // h+=Sigma1(e) + eor w28,w28,w27 // Maj(a,b,c) + eor w17,w13,w26,ror#22 // Sigma0(a) + eor w11,w11,w4,lsr#10 // sigma1(X[i+14]) + add w6,w6,w15 + add w21,w21,w25 // d+=h + add w25,w25,w28 // h+=Maj(a,b,c) + ldr w28,[x30],#4 // *K++, w19 in next round + add w6,w6,w12 + add w25,w25,w17 // h+=Sigma0(a) + add w6,w6,w11 + ldr w11,[sp,#0] + str w14,[sp,#12] + ror w16,w21,#6 + add w24,w24,w28 // h+=K[i] + ror w13,w8,#7 + and w17,w22,w21 + ror w12,w5,#17 + bic w28,w23,w21 + ror w14,w25,#2 + add w24,w24,w6 // h+=X[i] + eor w16,w16,w21,ror#11 + eor w13,w13,w8,ror#18 + orr w17,w17,w28 // Ch(e,f,g) + eor w28,w25,w26 // a^b, b^c in next round + eor w16,w16,w21,ror#25 // Sigma1(e) + eor w14,w14,w25,ror#13 + add w24,w24,w17 // h+=Ch(e,f,g) + and w19,w19,w28 // (b^c)&=(a^b) + eor w12,w12,w5,ror#19 + eor w13,w13,w8,lsr#3 // sigma0(X[i+1]) + add w24,w24,w16 // h+=Sigma1(e) + eor w19,w19,w26 // Maj(a,b,c) + eor w17,w14,w25,ror#22 // Sigma0(a) + eor w12,w12,w5,lsr#10 // sigma1(X[i+14]) + add w7,w7,w0 + add w20,w20,w24 // d+=h + add w24,w24,w19 // h+=Maj(a,b,c) + ldr w19,[x30],#4 // *K++, w28 in next round + add w7,w7,w13 + add w24,w24,w17 // h+=Sigma0(a) + add w7,w7,w12 + ldr w12,[sp,#4] + str w15,[sp,#0] + ror w16,w20,#6 + add w23,w23,w19 // h+=K[i] + ror w14,w9,#7 + and w17,w21,w20 + ror w13,w6,#17 + bic w19,w22,w20 + ror w15,w24,#2 + add w23,w23,w7 // h+=X[i] + eor w16,w16,w20,ror#11 + eor w14,w14,w9,ror#18 + orr w17,w17,w19 // Ch(e,f,g) + eor w19,w24,w25 // a^b, b^c in next round + eor w16,w16,w20,ror#25 // Sigma1(e) + eor w15,w15,w24,ror#13 + add w23,w23,w17 // h+=Ch(e,f,g) + and w28,w28,w19 // (b^c)&=(a^b) + eor w13,w13,w6,ror#19 + eor w14,w14,w9,lsr#3 // sigma0(X[i+1]) + add w23,w23,w16 // h+=Sigma1(e) + eor w28,w28,w25 // Maj(a,b,c) + eor w17,w15,w24,ror#22 // Sigma0(a) + eor w13,w13,w6,lsr#10 // sigma1(X[i+14]) + add w8,w8,w1 + add w27,w27,w23 // d+=h + add w23,w23,w28 // h+=Maj(a,b,c) + ldr w28,[x30],#4 // *K++, w19 in next round + add w8,w8,w14 + add w23,w23,w17 // h+=Sigma0(a) + add w8,w8,w13 + ldr w13,[sp,#8] + str w0,[sp,#4] + ror w16,w27,#6 + add w22,w22,w28 // h+=K[i] + ror w15,w10,#7 + and w17,w20,w27 + ror w14,w7,#17 + bic w28,w21,w27 + ror w0,w23,#2 + add w22,w22,w8 // h+=X[i] + eor w16,w16,w27,ror#11 + eor w15,w15,w10,ror#18 + orr w17,w17,w28 // Ch(e,f,g) + eor w28,w23,w24 // a^b, b^c in next round + eor w16,w16,w27,ror#25 // Sigma1(e) + eor w0,w0,w23,ror#13 + add w22,w22,w17 // h+=Ch(e,f,g) + and w19,w19,w28 // (b^c)&=(a^b) + eor w14,w14,w7,ror#19 + eor w15,w15,w10,lsr#3 // sigma0(X[i+1]) + add w22,w22,w16 // h+=Sigma1(e) + eor w19,w19,w24 // Maj(a,b,c) + eor w17,w0,w23,ror#22 // Sigma0(a) + eor w14,w14,w7,lsr#10 // sigma1(X[i+14]) + add w9,w9,w2 + add w26,w26,w22 // d+=h + add w22,w22,w19 // h+=Maj(a,b,c) + ldr w19,[x30],#4 // *K++, w28 in next round + add w9,w9,w15 + add w22,w22,w17 // h+=Sigma0(a) + add w9,w9,w14 + ldr w14,[sp,#12] + str w1,[sp,#8] + ror w16,w26,#6 + add w21,w21,w19 // h+=K[i] + ror w0,w11,#7 + and w17,w27,w26 + ror w15,w8,#17 + bic w19,w20,w26 + ror w1,w22,#2 + add w21,w21,w9 // h+=X[i] + eor w16,w16,w26,ror#11 + eor w0,w0,w11,ror#18 + orr w17,w17,w19 // Ch(e,f,g) + eor w19,w22,w23 // a^b, b^c in next round + eor w16,w16,w26,ror#25 // Sigma1(e) + eor w1,w1,w22,ror#13 + add w21,w21,w17 // h+=Ch(e,f,g) + and w28,w28,w19 // (b^c)&=(a^b) + eor w15,w15,w8,ror#19 + eor w0,w0,w11,lsr#3 // sigma0(X[i+1]) + add w21,w21,w16 // h+=Sigma1(e) + eor w28,w28,w23 // Maj(a,b,c) + eor w17,w1,w22,ror#22 // Sigma0(a) + eor w15,w15,w8,lsr#10 // sigma1(X[i+14]) + add w10,w10,w3 + add w25,w25,w21 // d+=h + add w21,w21,w28 // h+=Maj(a,b,c) + ldr w28,[x30],#4 // *K++, w19 in next round + add w10,w10,w0 + add w21,w21,w17 // h+=Sigma0(a) + add w10,w10,w15 + ldr w15,[sp,#0] + str w2,[sp,#12] + ror w16,w25,#6 + add w20,w20,w28 // h+=K[i] + ror w1,w12,#7 + and w17,w26,w25 + ror w0,w9,#17 + bic w28,w27,w25 + ror w2,w21,#2 + add w20,w20,w10 // h+=X[i] + eor w16,w16,w25,ror#11 + eor w1,w1,w12,ror#18 + orr w17,w17,w28 // Ch(e,f,g) + eor w28,w21,w22 // a^b, b^c in next round + eor w16,w16,w25,ror#25 // Sigma1(e) + eor w2,w2,w21,ror#13 + add w20,w20,w17 // h+=Ch(e,f,g) + and w19,w19,w28 // (b^c)&=(a^b) + eor w0,w0,w9,ror#19 + eor w1,w1,w12,lsr#3 // sigma0(X[i+1]) + add w20,w20,w16 // h+=Sigma1(e) + eor w19,w19,w22 // Maj(a,b,c) + eor w17,w2,w21,ror#22 // Sigma0(a) + eor w0,w0,w9,lsr#10 // sigma1(X[i+14]) + add w11,w11,w4 + add w24,w24,w20 // d+=h + add w20,w20,w19 // h+=Maj(a,b,c) + ldr w19,[x30],#4 // *K++, w28 in next round + add w11,w11,w1 + add w20,w20,w17 // h+=Sigma0(a) + add w11,w11,w0 + ldr w0,[sp,#4] + str w3,[sp,#0] + ror w16,w24,#6 + add w27,w27,w19 // h+=K[i] + ror w2,w13,#7 + and w17,w25,w24 + ror w1,w10,#17 + bic w19,w26,w24 + ror w3,w20,#2 + add w27,w27,w11 // h+=X[i] + eor w16,w16,w24,ror#11 + eor w2,w2,w13,ror#18 + orr w17,w17,w19 // Ch(e,f,g) + eor w19,w20,w21 // a^b, b^c in next round + eor w16,w16,w24,ror#25 // Sigma1(e) + eor w3,w3,w20,ror#13 + add w27,w27,w17 // h+=Ch(e,f,g) + and w28,w28,w19 // (b^c)&=(a^b) + eor w1,w1,w10,ror#19 + eor w2,w2,w13,lsr#3 // sigma0(X[i+1]) + add w27,w27,w16 // h+=Sigma1(e) + eor w28,w28,w21 // Maj(a,b,c) + eor w17,w3,w20,ror#22 // Sigma0(a) + eor w1,w1,w10,lsr#10 // sigma1(X[i+14]) + add w12,w12,w5 + add w23,w23,w27 // d+=h + add w27,w27,w28 // h+=Maj(a,b,c) + ldr w28,[x30],#4 // *K++, w19 in next round + add w12,w12,w2 + add w27,w27,w17 // h+=Sigma0(a) + add w12,w12,w1 + ldr w1,[sp,#8] + str w4,[sp,#4] + ror w16,w23,#6 + add w26,w26,w28 // h+=K[i] + ror w3,w14,#7 + and w17,w24,w23 + ror w2,w11,#17 + bic w28,w25,w23 + ror w4,w27,#2 + add w26,w26,w12 // h+=X[i] + eor w16,w16,w23,ror#11 + eor w3,w3,w14,ror#18 + orr w17,w17,w28 // Ch(e,f,g) + eor w28,w27,w20 // a^b, b^c in next round + eor w16,w16,w23,ror#25 // Sigma1(e) + eor w4,w4,w27,ror#13 + add w26,w26,w17 // h+=Ch(e,f,g) + and w19,w19,w28 // (b^c)&=(a^b) + eor w2,w2,w11,ror#19 + eor w3,w3,w14,lsr#3 // sigma0(X[i+1]) + add w26,w26,w16 // h+=Sigma1(e) + eor w19,w19,w20 // Maj(a,b,c) + eor w17,w4,w27,ror#22 // Sigma0(a) + eor w2,w2,w11,lsr#10 // sigma1(X[i+14]) + add w13,w13,w6 + add w22,w22,w26 // d+=h + add w26,w26,w19 // h+=Maj(a,b,c) + ldr w19,[x30],#4 // *K++, w28 in next round + add w13,w13,w3 + add w26,w26,w17 // h+=Sigma0(a) + add w13,w13,w2 + ldr w2,[sp,#12] + str w5,[sp,#8] + ror w16,w22,#6 + add w25,w25,w19 // h+=K[i] + ror w4,w15,#7 + and w17,w23,w22 + ror w3,w12,#17 + bic w19,w24,w22 + ror w5,w26,#2 + add w25,w25,w13 // h+=X[i] + eor w16,w16,w22,ror#11 + eor w4,w4,w15,ror#18 + orr w17,w17,w19 // Ch(e,f,g) + eor w19,w26,w27 // a^b, b^c in next round + eor w16,w16,w22,ror#25 // Sigma1(e) + eor w5,w5,w26,ror#13 + add w25,w25,w17 // h+=Ch(e,f,g) + and w28,w28,w19 // (b^c)&=(a^b) + eor w3,w3,w12,ror#19 + eor w4,w4,w15,lsr#3 // sigma0(X[i+1]) + add w25,w25,w16 // h+=Sigma1(e) + eor w28,w28,w27 // Maj(a,b,c) + eor w17,w5,w26,ror#22 // Sigma0(a) + eor w3,w3,w12,lsr#10 // sigma1(X[i+14]) + add w14,w14,w7 + add w21,w21,w25 // d+=h + add w25,w25,w28 // h+=Maj(a,b,c) + ldr w28,[x30],#4 // *K++, w19 in next round + add w14,w14,w4 + add w25,w25,w17 // h+=Sigma0(a) + add w14,w14,w3 + ldr w3,[sp,#0] + str w6,[sp,#12] + ror w16,w21,#6 + add w24,w24,w28 // h+=K[i] + ror w5,w0,#7 + and w17,w22,w21 + ror w4,w13,#17 + bic w28,w23,w21 + ror w6,w25,#2 + add w24,w24,w14 // h+=X[i] + eor w16,w16,w21,ror#11 + eor w5,w5,w0,ror#18 + orr w17,w17,w28 // Ch(e,f,g) + eor w28,w25,w26 // a^b, b^c in next round + eor w16,w16,w21,ror#25 // Sigma1(e) + eor w6,w6,w25,ror#13 + add w24,w24,w17 // h+=Ch(e,f,g) + and w19,w19,w28 // (b^c)&=(a^b) + eor w4,w4,w13,ror#19 + eor w5,w5,w0,lsr#3 // sigma0(X[i+1]) + add w24,w24,w16 // h+=Sigma1(e) + eor w19,w19,w26 // Maj(a,b,c) + eor w17,w6,w25,ror#22 // Sigma0(a) + eor w4,w4,w13,lsr#10 // sigma1(X[i+14]) + add w15,w15,w8 + add w20,w20,w24 // d+=h + add w24,w24,w19 // h+=Maj(a,b,c) + ldr w19,[x30],#4 // *K++, w28 in next round + add w15,w15,w5 + add w24,w24,w17 // h+=Sigma0(a) + add w15,w15,w4 + ldr w4,[sp,#4] + str w7,[sp,#0] + ror w16,w20,#6 + add w23,w23,w19 // h+=K[i] + ror w6,w1,#7 + and w17,w21,w20 + ror w5,w14,#17 + bic w19,w22,w20 + ror w7,w24,#2 + add w23,w23,w15 // h+=X[i] + eor w16,w16,w20,ror#11 + eor w6,w6,w1,ror#18 + orr w17,w17,w19 // Ch(e,f,g) + eor w19,w24,w25 // a^b, b^c in next round + eor w16,w16,w20,ror#25 // Sigma1(e) + eor w7,w7,w24,ror#13 + add w23,w23,w17 // h+=Ch(e,f,g) + and w28,w28,w19 // (b^c)&=(a^b) + eor w5,w5,w14,ror#19 + eor w6,w6,w1,lsr#3 // sigma0(X[i+1]) + add w23,w23,w16 // h+=Sigma1(e) + eor w28,w28,w25 // Maj(a,b,c) + eor w17,w7,w24,ror#22 // Sigma0(a) + eor w5,w5,w14,lsr#10 // sigma1(X[i+14]) + add w0,w0,w9 + add w27,w27,w23 // d+=h + add w23,w23,w28 // h+=Maj(a,b,c) + ldr w28,[x30],#4 // *K++, w19 in next round + add w0,w0,w6 + add w23,w23,w17 // h+=Sigma0(a) + add w0,w0,w5 + ldr w5,[sp,#8] + str w8,[sp,#4] + ror w16,w27,#6 + add w22,w22,w28 // h+=K[i] + ror w7,w2,#7 + and w17,w20,w27 + ror w6,w15,#17 + bic w28,w21,w27 + ror w8,w23,#2 + add w22,w22,w0 // h+=X[i] + eor w16,w16,w27,ror#11 + eor w7,w7,w2,ror#18 + orr w17,w17,w28 // Ch(e,f,g) + eor w28,w23,w24 // a^b, b^c in next round + eor w16,w16,w27,ror#25 // Sigma1(e) + eor w8,w8,w23,ror#13 + add w22,w22,w17 // h+=Ch(e,f,g) + and w19,w19,w28 // (b^c)&=(a^b) + eor w6,w6,w15,ror#19 + eor w7,w7,w2,lsr#3 // sigma0(X[i+1]) + add w22,w22,w16 // h+=Sigma1(e) + eor w19,w19,w24 // Maj(a,b,c) + eor w17,w8,w23,ror#22 // Sigma0(a) + eor w6,w6,w15,lsr#10 // sigma1(X[i+14]) + add w1,w1,w10 + add w26,w26,w22 // d+=h + add w22,w22,w19 // h+=Maj(a,b,c) + ldr w19,[x30],#4 // *K++, w28 in next round + add w1,w1,w7 + add w22,w22,w17 // h+=Sigma0(a) + add w1,w1,w6 + ldr w6,[sp,#12] + str w9,[sp,#8] + ror w16,w26,#6 + add w21,w21,w19 // h+=K[i] + ror w8,w3,#7 + and w17,w27,w26 + ror w7,w0,#17 + bic w19,w20,w26 + ror w9,w22,#2 + add w21,w21,w1 // h+=X[i] + eor w16,w16,w26,ror#11 + eor w8,w8,w3,ror#18 + orr w17,w17,w19 // Ch(e,f,g) + eor w19,w22,w23 // a^b, b^c in next round + eor w16,w16,w26,ror#25 // Sigma1(e) + eor w9,w9,w22,ror#13 + add w21,w21,w17 // h+=Ch(e,f,g) + and w28,w28,w19 // (b^c)&=(a^b) + eor w7,w7,w0,ror#19 + eor w8,w8,w3,lsr#3 // sigma0(X[i+1]) + add w21,w21,w16 // h+=Sigma1(e) + eor w28,w28,w23 // Maj(a,b,c) + eor w17,w9,w22,ror#22 // Sigma0(a) + eor w7,w7,w0,lsr#10 // sigma1(X[i+14]) + add w2,w2,w11 + add w25,w25,w21 // d+=h + add w21,w21,w28 // h+=Maj(a,b,c) + ldr w28,[x30],#4 // *K++, w19 in next round + add w2,w2,w8 + add w21,w21,w17 // h+=Sigma0(a) + add w2,w2,w7 + ldr w7,[sp,#0] + str w10,[sp,#12] + ror w16,w25,#6 + add w20,w20,w28 // h+=K[i] + ror w9,w4,#7 + and w17,w26,w25 + ror w8,w1,#17 + bic w28,w27,w25 + ror w10,w21,#2 + add w20,w20,w2 // h+=X[i] + eor w16,w16,w25,ror#11 + eor w9,w9,w4,ror#18 + orr w17,w17,w28 // Ch(e,f,g) + eor w28,w21,w22 // a^b, b^c in next round + eor w16,w16,w25,ror#25 // Sigma1(e) + eor w10,w10,w21,ror#13 + add w20,w20,w17 // h+=Ch(e,f,g) + and w19,w19,w28 // (b^c)&=(a^b) + eor w8,w8,w1,ror#19 + eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) + add w20,w20,w16 // h+=Sigma1(e) + eor w19,w19,w22 // Maj(a,b,c) + eor w17,w10,w21,ror#22 // Sigma0(a) + eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) + add w3,w3,w12 + add w24,w24,w20 // d+=h + add w20,w20,w19 // h+=Maj(a,b,c) + ldr w19,[x30],#4 // *K++, w28 in next round + add w3,w3,w9 + add w20,w20,w17 // h+=Sigma0(a) + add w3,w3,w8 + cbnz w19,Loop_16_xx + + ldp x0,x2,[x29,#96] + ldr x1,[x29,#112] + sub x30,x30,#260 // rewind + + ldp w3,w4,[x0] + ldp w5,w6,[x0,#2*4] + add x1,x1,#14*4 // advance input pointer + ldp w7,w8,[x0,#4*4] + add w20,w20,w3 + ldp w9,w10,[x0,#6*4] + add w21,w21,w4 + add w22,w22,w5 + add w23,w23,w6 + stp w20,w21,[x0] + add w24,w24,w7 + add w25,w25,w8 + stp w22,w23,[x0,#2*4] + add w26,w26,w9 + add w27,w27,w10 + cmp x1,x2 + stp w24,w25,[x0,#4*4] + stp w26,w27,[x0,#6*4] + b.ne Loop + + ldp x19,x20,[x29,#16] + add sp,sp,#4*4 + ldp x21,x22,[x29,#32] + ldp x23,x24,[x29,#48] + ldp x25,x26,[x29,#64] + ldp x27,x28,[x29,#80] + ldp x29,x30,[sp],#128 + AARCH64_VALIDATE_LINK_REGISTER + ret + + +.section .rodata + +.align 6 + +LK256: +.long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 +.long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 +.long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 +.long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 +.long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc +.long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da +.long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 +.long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 +.long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 +.long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 +.long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 +.long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 +.long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 +.long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 +.long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 +.long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 +.long 0 //terminator + +.byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 +.align 2 +.align 2 + +.text +#ifndef __KERNEL__ +.def sha256_block_armv8 + .type 32 +.endef +.align 6 +sha256_block_armv8: +Lv8_entry: + // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + + ld1 {v0.4s,v1.4s},[x0] + adrp x3,LK256 + add x3,x3,:lo12:LK256 + +Loop_hw: + ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64 + sub x2,x2,#1 + ld1 {v16.4s},[x3],#16 + rev32 v4.16b,v4.16b + rev32 v5.16b,v5.16b + rev32 v6.16b,v6.16b + rev32 v7.16b,v7.16b + orr v18.16b,v0.16b,v0.16b // offload + orr v19.16b,v1.16b,v1.16b + ld1 {v17.4s},[x3],#16 + add v16.4s,v16.4s,v4.4s +.long 0x5e2828a4 //sha256su0 v4.16b,v5.16b + orr v2.16b,v0.16b,v0.16b +.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s +.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s +.long 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b + ld1 {v16.4s},[x3],#16 + add v17.4s,v17.4s,v5.4s +.long 0x5e2828c5 //sha256su0 v5.16b,v6.16b + orr v2.16b,v0.16b,v0.16b +.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s +.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s +.long 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b + ld1 {v17.4s},[x3],#16 + add v16.4s,v16.4s,v6.4s +.long 0x5e2828e6 //sha256su0 v6.16b,v7.16b + orr v2.16b,v0.16b,v0.16b +.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s +.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s +.long 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b + ld1 {v16.4s},[x3],#16 + add v17.4s,v17.4s,v7.4s +.long 0x5e282887 //sha256su0 v7.16b,v4.16b + orr v2.16b,v0.16b,v0.16b +.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s +.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s +.long 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b + ld1 {v17.4s},[x3],#16 + add v16.4s,v16.4s,v4.4s +.long 0x5e2828a4 //sha256su0 v4.16b,v5.16b + orr v2.16b,v0.16b,v0.16b +.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s +.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s +.long 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b + ld1 {v16.4s},[x3],#16 + add v17.4s,v17.4s,v5.4s +.long 0x5e2828c5 //sha256su0 v5.16b,v6.16b + orr v2.16b,v0.16b,v0.16b +.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s +.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s +.long 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b + ld1 {v17.4s},[x3],#16 + add v16.4s,v16.4s,v6.4s +.long 0x5e2828e6 //sha256su0 v6.16b,v7.16b + orr v2.16b,v0.16b,v0.16b +.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s +.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s +.long 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b + ld1 {v16.4s},[x3],#16 + add v17.4s,v17.4s,v7.4s +.long 0x5e282887 //sha256su0 v7.16b,v4.16b + orr v2.16b,v0.16b,v0.16b +.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s +.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s +.long 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b + ld1 {v17.4s},[x3],#16 + add v16.4s,v16.4s,v4.4s +.long 0x5e2828a4 //sha256su0 v4.16b,v5.16b + orr v2.16b,v0.16b,v0.16b +.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s +.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s +.long 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b + ld1 {v16.4s},[x3],#16 + add v17.4s,v17.4s,v5.4s +.long 0x5e2828c5 //sha256su0 v5.16b,v6.16b + orr v2.16b,v0.16b,v0.16b +.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s +.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s +.long 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b + ld1 {v17.4s},[x3],#16 + add v16.4s,v16.4s,v6.4s +.long 0x5e2828e6 //sha256su0 v6.16b,v7.16b + orr v2.16b,v0.16b,v0.16b +.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s +.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s +.long 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b + ld1 {v16.4s},[x3],#16 + add v17.4s,v17.4s,v7.4s +.long 0x5e282887 //sha256su0 v7.16b,v4.16b + orr v2.16b,v0.16b,v0.16b +.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s +.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s +.long 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b + ld1 {v17.4s},[x3],#16 + add v16.4s,v16.4s,v4.4s + orr v2.16b,v0.16b,v0.16b +.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s +.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s + + ld1 {v16.4s},[x3],#16 + add v17.4s,v17.4s,v5.4s + orr v2.16b,v0.16b,v0.16b +.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s +.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s + + ld1 {v17.4s},[x3] + add v16.4s,v16.4s,v6.4s + sub x3,x3,#64*4-16 // rewind + orr v2.16b,v0.16b,v0.16b +.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s +.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s + + add v17.4s,v17.4s,v7.4s + orr v2.16b,v0.16b,v0.16b +.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s +.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s + + add v0.4s,v0.4s,v18.4s + add v1.4s,v1.4s,v19.4s + + cbnz x2,Loop_hw + + st1 {v0.4s,v1.4s},[x0] + + ldr x29,[sp],#16 + ret + +#endif +#ifdef __KERNEL__ +.globl sha256_block_neon +#endif +.def sha256_block_neon + .type 32 +.endef +.align 4 +sha256_block_neon: + AARCH64_VALID_CALL_TARGET +Lneon_entry: + // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later + stp x29, x30, [sp, #-16]! + mov x29, sp + sub sp,sp,#16*4 + + adrp x16,LK256 + add x16,x16,:lo12:LK256 + add x2,x1,x2,lsl#6 // len to point at the end of inp + + ld1 {v0.16b},[x1], #16 + ld1 {v1.16b},[x1], #16 + ld1 {v2.16b},[x1], #16 + ld1 {v3.16b},[x1], #16 + ld1 {v4.4s},[x16], #16 + ld1 {v5.4s},[x16], #16 + ld1 {v6.4s},[x16], #16 + ld1 {v7.4s},[x16], #16 + rev32 v0.16b,v0.16b // yes, even on + rev32 v1.16b,v1.16b // big-endian + rev32 v2.16b,v2.16b + rev32 v3.16b,v3.16b + mov x17,sp + add v4.4s,v4.4s,v0.4s + add v5.4s,v5.4s,v1.4s + add v6.4s,v6.4s,v2.4s + st1 {v4.4s,v5.4s},[x17], #32 + add v7.4s,v7.4s,v3.4s + st1 {v6.4s,v7.4s},[x17] + sub x17,x17,#32 + + ldp w3,w4,[x0] + ldp w5,w6,[x0,#8] + ldp w7,w8,[x0,#16] + ldp w9,w10,[x0,#24] + ldr w12,[sp,#0] + mov w13,wzr + eor w14,w4,w5 + mov w15,wzr + b L_00_48 + +.align 4 +L_00_48: + ext v4.16b,v0.16b,v1.16b,#4 + add w10,w10,w12 + add w3,w3,w15 + and w12,w8,w7 + bic w15,w9,w7 + ext v7.16b,v2.16b,v3.16b,#4 + eor w11,w7,w7,ror#5 + add w3,w3,w13 + mov d19,v3.d[1] + orr w12,w12,w15 + eor w11,w11,w7,ror#19 + ushr v6.4s,v4.4s,#7 + eor w15,w3,w3,ror#11 + ushr v5.4s,v4.4s,#3 + add w10,w10,w12 + add v0.4s,v0.4s,v7.4s + ror w11,w11,#6 + sli v6.4s,v4.4s,#25 + eor w13,w3,w4 + eor w15,w15,w3,ror#20 + ushr v7.4s,v4.4s,#18 + add w10,w10,w11 + ldr w12,[sp,#4] + and w14,w14,w13 + eor v5.16b,v5.16b,v6.16b + ror w15,w15,#2 + add w6,w6,w10 + sli v7.4s,v4.4s,#14 + eor w14,w14,w4 + ushr v16.4s,v19.4s,#17 + add w9,w9,w12 + add w10,w10,w15 + and w12,w7,w6 + eor v5.16b,v5.16b,v7.16b + bic w15,w8,w6 + eor w11,w6,w6,ror#5 + sli v16.4s,v19.4s,#15 + add w10,w10,w14 + orr w12,w12,w15 + ushr v17.4s,v19.4s,#10 + eor w11,w11,w6,ror#19 + eor w15,w10,w10,ror#11 + ushr v7.4s,v19.4s,#19 + add w9,w9,w12 + ror w11,w11,#6 + add v0.4s,v0.4s,v5.4s + eor w14,w10,w3 + eor w15,w15,w10,ror#20 + sli v7.4s,v19.4s,#13 + add w9,w9,w11 + ldr w12,[sp,#8] + and w13,w13,w14 + eor v17.16b,v17.16b,v16.16b + ror w15,w15,#2 + add w5,w5,w9 + eor w13,w13,w3 + eor v17.16b,v17.16b,v7.16b + add w8,w8,w12 + add w9,w9,w15 + and w12,w6,w5 + add v0.4s,v0.4s,v17.4s + bic w15,w7,w5 + eor w11,w5,w5,ror#5 + add w9,w9,w13 + ushr v18.4s,v0.4s,#17 + orr w12,w12,w15 + ushr v19.4s,v0.4s,#10 + eor w11,w11,w5,ror#19 + eor w15,w9,w9,ror#11 + sli v18.4s,v0.4s,#15 + add w8,w8,w12 + ushr v17.4s,v0.4s,#19 + ror w11,w11,#6 + eor w13,w9,w10 + eor v19.16b,v19.16b,v18.16b + eor w15,w15,w9,ror#20 + add w8,w8,w11 + sli v17.4s,v0.4s,#13 + ldr w12,[sp,#12] + and w14,w14,w13 + ror w15,w15,#2 + ld1 {v4.4s},[x16], #16 + add w4,w4,w8 + eor v19.16b,v19.16b,v17.16b + eor w14,w14,w10 + eor v17.16b,v17.16b,v17.16b + add w7,w7,w12 + add w8,w8,w15 + and w12,w5,w4 + mov v17.d[1],v19.d[0] + bic w15,w6,w4 + eor w11,w4,w4,ror#5 + add w8,w8,w14 + add v0.4s,v0.4s,v17.4s + orr w12,w12,w15 + eor w11,w11,w4,ror#19 + eor w15,w8,w8,ror#11 + add v4.4s,v4.4s,v0.4s + add w7,w7,w12 + ror w11,w11,#6 + eor w14,w8,w9 + eor w15,w15,w8,ror#20 + add w7,w7,w11 + ldr w12,[sp,#16] + and w13,w13,w14 + ror w15,w15,#2 + add w3,w3,w7 + eor w13,w13,w9 + st1 {v4.4s},[x17], #16 + ext v4.16b,v1.16b,v2.16b,#4 + add w6,w6,w12 + add w7,w7,w15 + and w12,w4,w3 + bic w15,w5,w3 + ext v7.16b,v3.16b,v0.16b,#4 + eor w11,w3,w3,ror#5 + add w7,w7,w13 + mov d19,v0.d[1] + orr w12,w12,w15 + eor w11,w11,w3,ror#19 + ushr v6.4s,v4.4s,#7 + eor w15,w7,w7,ror#11 + ushr v5.4s,v4.4s,#3 + add w6,w6,w12 + add v1.4s,v1.4s,v7.4s + ror w11,w11,#6 + sli v6.4s,v4.4s,#25 + eor w13,w7,w8 + eor w15,w15,w7,ror#20 + ushr v7.4s,v4.4s,#18 + add w6,w6,w11 + ldr w12,[sp,#20] + and w14,w14,w13 + eor v5.16b,v5.16b,v6.16b + ror w15,w15,#2 + add w10,w10,w6 + sli v7.4s,v4.4s,#14 + eor w14,w14,w8 + ushr v16.4s,v19.4s,#17 + add w5,w5,w12 + add w6,w6,w15 + and w12,w3,w10 + eor v5.16b,v5.16b,v7.16b + bic w15,w4,w10 + eor w11,w10,w10,ror#5 + sli v16.4s,v19.4s,#15 + add w6,w6,w14 + orr w12,w12,w15 + ushr v17.4s,v19.4s,#10 + eor w11,w11,w10,ror#19 + eor w15,w6,w6,ror#11 + ushr v7.4s,v19.4s,#19 + add w5,w5,w12 + ror w11,w11,#6 + add v1.4s,v1.4s,v5.4s + eor w14,w6,w7 + eor w15,w15,w6,ror#20 + sli v7.4s,v19.4s,#13 + add w5,w5,w11 + ldr w12,[sp,#24] + and w13,w13,w14 + eor v17.16b,v17.16b,v16.16b + ror w15,w15,#2 + add w9,w9,w5 + eor w13,w13,w7 + eor v17.16b,v17.16b,v7.16b + add w4,w4,w12 + add w5,w5,w15 + and w12,w10,w9 + add v1.4s,v1.4s,v17.4s + bic w15,w3,w9 + eor w11,w9,w9,ror#5 + add w5,w5,w13 + ushr v18.4s,v1.4s,#17 + orr w12,w12,w15 + ushr v19.4s,v1.4s,#10 + eor w11,w11,w9,ror#19 + eor w15,w5,w5,ror#11 + sli v18.4s,v1.4s,#15 + add w4,w4,w12 + ushr v17.4s,v1.4s,#19 + ror w11,w11,#6 + eor w13,w5,w6 + eor v19.16b,v19.16b,v18.16b + eor w15,w15,w5,ror#20 + add w4,w4,w11 + sli v17.4s,v1.4s,#13 + ldr w12,[sp,#28] + and w14,w14,w13 + ror w15,w15,#2 + ld1 {v4.4s},[x16], #16 + add w8,w8,w4 + eor v19.16b,v19.16b,v17.16b + eor w14,w14,w6 + eor v17.16b,v17.16b,v17.16b + add w3,w3,w12 + add w4,w4,w15 + and w12,w9,w8 + mov v17.d[1],v19.d[0] + bic w15,w10,w8 + eor w11,w8,w8,ror#5 + add w4,w4,w14 + add v1.4s,v1.4s,v17.4s + orr w12,w12,w15 + eor w11,w11,w8,ror#19 + eor w15,w4,w4,ror#11 + add v4.4s,v4.4s,v1.4s + add w3,w3,w12 + ror w11,w11,#6 + eor w14,w4,w5 + eor w15,w15,w4,ror#20 + add w3,w3,w11 + ldr w12,[sp,#32] + and w13,w13,w14 + ror w15,w15,#2 + add w7,w7,w3 + eor w13,w13,w5 + st1 {v4.4s},[x17], #16 + ext v4.16b,v2.16b,v3.16b,#4 + add w10,w10,w12 + add w3,w3,w15 + and w12,w8,w7 + bic w15,w9,w7 + ext v7.16b,v0.16b,v1.16b,#4 + eor w11,w7,w7,ror#5 + add w3,w3,w13 + mov d19,v1.d[1] + orr w12,w12,w15 + eor w11,w11,w7,ror#19 + ushr v6.4s,v4.4s,#7 + eor w15,w3,w3,ror#11 + ushr v5.4s,v4.4s,#3 + add w10,w10,w12 + add v2.4s,v2.4s,v7.4s + ror w11,w11,#6 + sli v6.4s,v4.4s,#25 + eor w13,w3,w4 + eor w15,w15,w3,ror#20 + ushr v7.4s,v4.4s,#18 + add w10,w10,w11 + ldr w12,[sp,#36] + and w14,w14,w13 + eor v5.16b,v5.16b,v6.16b + ror w15,w15,#2 + add w6,w6,w10 + sli v7.4s,v4.4s,#14 + eor w14,w14,w4 + ushr v16.4s,v19.4s,#17 + add w9,w9,w12 + add w10,w10,w15 + and w12,w7,w6 + eor v5.16b,v5.16b,v7.16b + bic w15,w8,w6 + eor w11,w6,w6,ror#5 + sli v16.4s,v19.4s,#15 + add w10,w10,w14 + orr w12,w12,w15 + ushr v17.4s,v19.4s,#10 + eor w11,w11,w6,ror#19 + eor w15,w10,w10,ror#11 + ushr v7.4s,v19.4s,#19 + add w9,w9,w12 + ror w11,w11,#6 + add v2.4s,v2.4s,v5.4s + eor w14,w10,w3 + eor w15,w15,w10,ror#20 + sli v7.4s,v19.4s,#13 + add w9,w9,w11 + ldr w12,[sp,#40] + and w13,w13,w14 + eor v17.16b,v17.16b,v16.16b + ror w15,w15,#2 + add w5,w5,w9 + eor w13,w13,w3 + eor v17.16b,v17.16b,v7.16b + add w8,w8,w12 + add w9,w9,w15 + and w12,w6,w5 + add v2.4s,v2.4s,v17.4s + bic w15,w7,w5 + eor w11,w5,w5,ror#5 + add w9,w9,w13 + ushr v18.4s,v2.4s,#17 + orr w12,w12,w15 + ushr v19.4s,v2.4s,#10 + eor w11,w11,w5,ror#19 + eor w15,w9,w9,ror#11 + sli v18.4s,v2.4s,#15 + add w8,w8,w12 + ushr v17.4s,v2.4s,#19 + ror w11,w11,#6 + eor w13,w9,w10 + eor v19.16b,v19.16b,v18.16b + eor w15,w15,w9,ror#20 + add w8,w8,w11 + sli v17.4s,v2.4s,#13 + ldr w12,[sp,#44] + and w14,w14,w13 + ror w15,w15,#2 + ld1 {v4.4s},[x16], #16 + add w4,w4,w8 + eor v19.16b,v19.16b,v17.16b + eor w14,w14,w10 + eor v17.16b,v17.16b,v17.16b + add w7,w7,w12 + add w8,w8,w15 + and w12,w5,w4 + mov v17.d[1],v19.d[0] + bic w15,w6,w4 + eor w11,w4,w4,ror#5 + add w8,w8,w14 + add v2.4s,v2.4s,v17.4s + orr w12,w12,w15 + eor w11,w11,w4,ror#19 + eor w15,w8,w8,ror#11 + add v4.4s,v4.4s,v2.4s + add w7,w7,w12 + ror w11,w11,#6 + eor w14,w8,w9 + eor w15,w15,w8,ror#20 + add w7,w7,w11 + ldr w12,[sp,#48] + and w13,w13,w14 + ror w15,w15,#2 + add w3,w3,w7 + eor w13,w13,w9 + st1 {v4.4s},[x17], #16 + ext v4.16b,v3.16b,v0.16b,#4 + add w6,w6,w12 + add w7,w7,w15 + and w12,w4,w3 + bic w15,w5,w3 + ext v7.16b,v1.16b,v2.16b,#4 + eor w11,w3,w3,ror#5 + add w7,w7,w13 + mov d19,v2.d[1] + orr w12,w12,w15 + eor w11,w11,w3,ror#19 + ushr v6.4s,v4.4s,#7 + eor w15,w7,w7,ror#11 + ushr v5.4s,v4.4s,#3 + add w6,w6,w12 + add v3.4s,v3.4s,v7.4s + ror w11,w11,#6 + sli v6.4s,v4.4s,#25 + eor w13,w7,w8 + eor w15,w15,w7,ror#20 + ushr v7.4s,v4.4s,#18 + add w6,w6,w11 + ldr w12,[sp,#52] + and w14,w14,w13 + eor v5.16b,v5.16b,v6.16b + ror w15,w15,#2 + add w10,w10,w6 + sli v7.4s,v4.4s,#14 + eor w14,w14,w8 + ushr v16.4s,v19.4s,#17 + add w5,w5,w12 + add w6,w6,w15 + and w12,w3,w10 + eor v5.16b,v5.16b,v7.16b + bic w15,w4,w10 + eor w11,w10,w10,ror#5 + sli v16.4s,v19.4s,#15 + add w6,w6,w14 + orr w12,w12,w15 + ushr v17.4s,v19.4s,#10 + eor w11,w11,w10,ror#19 + eor w15,w6,w6,ror#11 + ushr v7.4s,v19.4s,#19 + add w5,w5,w12 + ror w11,w11,#6 + add v3.4s,v3.4s,v5.4s + eor w14,w6,w7 + eor w15,w15,w6,ror#20 + sli v7.4s,v19.4s,#13 + add w5,w5,w11 + ldr w12,[sp,#56] + and w13,w13,w14 + eor v17.16b,v17.16b,v16.16b + ror w15,w15,#2 + add w9,w9,w5 + eor w13,w13,w7 + eor v17.16b,v17.16b,v7.16b + add w4,w4,w12 + add w5,w5,w15 + and w12,w10,w9 + add v3.4s,v3.4s,v17.4s + bic w15,w3,w9 + eor w11,w9,w9,ror#5 + add w5,w5,w13 + ushr v18.4s,v3.4s,#17 + orr w12,w12,w15 + ushr v19.4s,v3.4s,#10 + eor w11,w11,w9,ror#19 + eor w15,w5,w5,ror#11 + sli v18.4s,v3.4s,#15 + add w4,w4,w12 + ushr v17.4s,v3.4s,#19 + ror w11,w11,#6 + eor w13,w5,w6 + eor v19.16b,v19.16b,v18.16b + eor w15,w15,w5,ror#20 + add w4,w4,w11 + sli v17.4s,v3.4s,#13 + ldr w12,[sp,#60] + and w14,w14,w13 + ror w15,w15,#2 + ld1 {v4.4s},[x16], #16 + add w8,w8,w4 + eor v19.16b,v19.16b,v17.16b + eor w14,w14,w6 + eor v17.16b,v17.16b,v17.16b + add w3,w3,w12 + add w4,w4,w15 + and w12,w9,w8 + mov v17.d[1],v19.d[0] + bic w15,w10,w8 + eor w11,w8,w8,ror#5 + add w4,w4,w14 + add v3.4s,v3.4s,v17.4s + orr w12,w12,w15 + eor w11,w11,w8,ror#19 + eor w15,w4,w4,ror#11 + add v4.4s,v4.4s,v3.4s + add w3,w3,w12 + ror w11,w11,#6 + eor w14,w4,w5 + eor w15,w15,w4,ror#20 + add w3,w3,w11 + ldr w12,[x16] + and w13,w13,w14 + ror w15,w15,#2 + add w7,w7,w3 + eor w13,w13,w5 + st1 {v4.4s},[x17], #16 + cmp w12,#0 // check for K256 terminator + ldr w12,[sp,#0] + sub x17,x17,#64 + bne L_00_48 + + sub x16,x16,#256 // rewind x16 + cmp x1,x2 + mov x17, #64 + csel x17, x17, xzr, eq + sub x1,x1,x17 // avoid SEGV + mov x17,sp + add w10,w10,w12 + add w3,w3,w15 + and w12,w8,w7 + ld1 {v0.16b},[x1],#16 + bic w15,w9,w7 + eor w11,w7,w7,ror#5 + ld1 {v4.4s},[x16],#16 + add w3,w3,w13 + orr w12,w12,w15 + eor w11,w11,w7,ror#19 + eor w15,w3,w3,ror#11 + rev32 v0.16b,v0.16b + add w10,w10,w12 + ror w11,w11,#6 + eor w13,w3,w4 + eor w15,w15,w3,ror#20 + add v4.4s,v4.4s,v0.4s + add w10,w10,w11 + ldr w12,[sp,#4] + and w14,w14,w13 + ror w15,w15,#2 + add w6,w6,w10 + eor w14,w14,w4 + add w9,w9,w12 + add w10,w10,w15 + and w12,w7,w6 + bic w15,w8,w6 + eor w11,w6,w6,ror#5 + add w10,w10,w14 + orr w12,w12,w15 + eor w11,w11,w6,ror#19 + eor w15,w10,w10,ror#11 + add w9,w9,w12 + ror w11,w11,#6 + eor w14,w10,w3 + eor w15,w15,w10,ror#20 + add w9,w9,w11 + ldr w12,[sp,#8] + and w13,w13,w14 + ror w15,w15,#2 + add w5,w5,w9 + eor w13,w13,w3 + add w8,w8,w12 + add w9,w9,w15 + and w12,w6,w5 + bic w15,w7,w5 + eor w11,w5,w5,ror#5 + add w9,w9,w13 + orr w12,w12,w15 + eor w11,w11,w5,ror#19 + eor w15,w9,w9,ror#11 + add w8,w8,w12 + ror w11,w11,#6 + eor w13,w9,w10 + eor w15,w15,w9,ror#20 + add w8,w8,w11 + ldr w12,[sp,#12] + and w14,w14,w13 + ror w15,w15,#2 + add w4,w4,w8 + eor w14,w14,w10 + add w7,w7,w12 + add w8,w8,w15 + and w12,w5,w4 + bic w15,w6,w4 + eor w11,w4,w4,ror#5 + add w8,w8,w14 + orr w12,w12,w15 + eor w11,w11,w4,ror#19 + eor w15,w8,w8,ror#11 + add w7,w7,w12 + ror w11,w11,#6 + eor w14,w8,w9 + eor w15,w15,w8,ror#20 + add w7,w7,w11 + ldr w12,[sp,#16] + and w13,w13,w14 + ror w15,w15,#2 + add w3,w3,w7 + eor w13,w13,w9 + st1 {v4.4s},[x17], #16 + add w6,w6,w12 + add w7,w7,w15 + and w12,w4,w3 + ld1 {v1.16b},[x1],#16 + bic w15,w5,w3 + eor w11,w3,w3,ror#5 + ld1 {v4.4s},[x16],#16 + add w7,w7,w13 + orr w12,w12,w15 + eor w11,w11,w3,ror#19 + eor w15,w7,w7,ror#11 + rev32 v1.16b,v1.16b + add w6,w6,w12 + ror w11,w11,#6 + eor w13,w7,w8 + eor w15,w15,w7,ror#20 + add v4.4s,v4.4s,v1.4s + add w6,w6,w11 + ldr w12,[sp,#20] + and w14,w14,w13 + ror w15,w15,#2 + add w10,w10,w6 + eor w14,w14,w8 + add w5,w5,w12 + add w6,w6,w15 + and w12,w3,w10 + bic w15,w4,w10 + eor w11,w10,w10,ror#5 + add w6,w6,w14 + orr w12,w12,w15 + eor w11,w11,w10,ror#19 + eor w15,w6,w6,ror#11 + add w5,w5,w12 + ror w11,w11,#6 + eor w14,w6,w7 + eor w15,w15,w6,ror#20 + add w5,w5,w11 + ldr w12,[sp,#24] + and w13,w13,w14 + ror w15,w15,#2 + add w9,w9,w5 + eor w13,w13,w7 + add w4,w4,w12 + add w5,w5,w15 + and w12,w10,w9 + bic w15,w3,w9 + eor w11,w9,w9,ror#5 + add w5,w5,w13 + orr w12,w12,w15 + eor w11,w11,w9,ror#19 + eor w15,w5,w5,ror#11 + add w4,w4,w12 + ror w11,w11,#6 + eor w13,w5,w6 + eor w15,w15,w5,ror#20 + add w4,w4,w11 + ldr w12,[sp,#28] + and w14,w14,w13 + ror w15,w15,#2 + add w8,w8,w4 + eor w14,w14,w6 + add w3,w3,w12 + add w4,w4,w15 + and w12,w9,w8 + bic w15,w10,w8 + eor w11,w8,w8,ror#5 + add w4,w4,w14 + orr w12,w12,w15 + eor w11,w11,w8,ror#19 + eor w15,w4,w4,ror#11 + add w3,w3,w12 + ror w11,w11,#6 + eor w14,w4,w5 + eor w15,w15,w4,ror#20 + add w3,w3,w11 + ldr w12,[sp,#32] + and w13,w13,w14 + ror w15,w15,#2 + add w7,w7,w3 + eor w13,w13,w5 + st1 {v4.4s},[x17], #16 + add w10,w10,w12 + add w3,w3,w15 + and w12,w8,w7 + ld1 {v2.16b},[x1],#16 + bic w15,w9,w7 + eor w11,w7,w7,ror#5 + ld1 {v4.4s},[x16],#16 + add w3,w3,w13 + orr w12,w12,w15 + eor w11,w11,w7,ror#19 + eor w15,w3,w3,ror#11 + rev32 v2.16b,v2.16b + add w10,w10,w12 + ror w11,w11,#6 + eor w13,w3,w4 + eor w15,w15,w3,ror#20 + add v4.4s,v4.4s,v2.4s + add w10,w10,w11 + ldr w12,[sp,#36] + and w14,w14,w13 + ror w15,w15,#2 + add w6,w6,w10 + eor w14,w14,w4 + add w9,w9,w12 + add w10,w10,w15 + and w12,w7,w6 + bic w15,w8,w6 + eor w11,w6,w6,ror#5 + add w10,w10,w14 + orr w12,w12,w15 + eor w11,w11,w6,ror#19 + eor w15,w10,w10,ror#11 + add w9,w9,w12 + ror w11,w11,#6 + eor w14,w10,w3 + eor w15,w15,w10,ror#20 + add w9,w9,w11 + ldr w12,[sp,#40] + and w13,w13,w14 + ror w15,w15,#2 + add w5,w5,w9 + eor w13,w13,w3 + add w8,w8,w12 + add w9,w9,w15 + and w12,w6,w5 + bic w15,w7,w5 + eor w11,w5,w5,ror#5 + add w9,w9,w13 + orr w12,w12,w15 + eor w11,w11,w5,ror#19 + eor w15,w9,w9,ror#11 + add w8,w8,w12 + ror w11,w11,#6 + eor w13,w9,w10 + eor w15,w15,w9,ror#20 + add w8,w8,w11 + ldr w12,[sp,#44] + and w14,w14,w13 + ror w15,w15,#2 + add w4,w4,w8 + eor w14,w14,w10 + add w7,w7,w12 + add w8,w8,w15 + and w12,w5,w4 + bic w15,w6,w4 + eor w11,w4,w4,ror#5 + add w8,w8,w14 + orr w12,w12,w15 + eor w11,w11,w4,ror#19 + eor w15,w8,w8,ror#11 + add w7,w7,w12 + ror w11,w11,#6 + eor w14,w8,w9 + eor w15,w15,w8,ror#20 + add w7,w7,w11 + ldr w12,[sp,#48] + and w13,w13,w14 + ror w15,w15,#2 + add w3,w3,w7 + eor w13,w13,w9 + st1 {v4.4s},[x17], #16 + add w6,w6,w12 + add w7,w7,w15 + and w12,w4,w3 + ld1 {v3.16b},[x1],#16 + bic w15,w5,w3 + eor w11,w3,w3,ror#5 + ld1 {v4.4s},[x16],#16 + add w7,w7,w13 + orr w12,w12,w15 + eor w11,w11,w3,ror#19 + eor w15,w7,w7,ror#11 + rev32 v3.16b,v3.16b + add w6,w6,w12 + ror w11,w11,#6 + eor w13,w7,w8 + eor w15,w15,w7,ror#20 + add v4.4s,v4.4s,v3.4s + add w6,w6,w11 + ldr w12,[sp,#52] + and w14,w14,w13 + ror w15,w15,#2 + add w10,w10,w6 + eor w14,w14,w8 + add w5,w5,w12 + add w6,w6,w15 + and w12,w3,w10 + bic w15,w4,w10 + eor w11,w10,w10,ror#5 + add w6,w6,w14 + orr w12,w12,w15 + eor w11,w11,w10,ror#19 + eor w15,w6,w6,ror#11 + add w5,w5,w12 + ror w11,w11,#6 + eor w14,w6,w7 + eor w15,w15,w6,ror#20 + add w5,w5,w11 + ldr w12,[sp,#56] + and w13,w13,w14 + ror w15,w15,#2 + add w9,w9,w5 + eor w13,w13,w7 + add w4,w4,w12 + add w5,w5,w15 + and w12,w10,w9 + bic w15,w3,w9 + eor w11,w9,w9,ror#5 + add w5,w5,w13 + orr w12,w12,w15 + eor w11,w11,w9,ror#19 + eor w15,w5,w5,ror#11 + add w4,w4,w12 + ror w11,w11,#6 + eor w13,w5,w6 + eor w15,w15,w5,ror#20 + add w4,w4,w11 + ldr w12,[sp,#60] + and w14,w14,w13 + ror w15,w15,#2 + add w8,w8,w4 + eor w14,w14,w6 + add w3,w3,w12 + add w4,w4,w15 + and w12,w9,w8 + bic w15,w10,w8 + eor w11,w8,w8,ror#5 + add w4,w4,w14 + orr w12,w12,w15 + eor w11,w11,w8,ror#19 + eor w15,w4,w4,ror#11 + add w3,w3,w12 + ror w11,w11,#6 + eor w14,w4,w5 + eor w15,w15,w4,ror#20 + add w3,w3,w11 + and w13,w13,w14 + ror w15,w15,#2 + add w7,w7,w3 + eor w13,w13,w5 + st1 {v4.4s},[x17], #16 + add w3,w3,w15 // h+=Sigma0(a) from the past + ldp w11,w12,[x0,#0] + add w3,w3,w13 // h+=Maj(a,b,c) from the past + ldp w13,w14,[x0,#8] + add w3,w3,w11 // accumulate + add w4,w4,w12 + ldp w11,w12,[x0,#16] + add w5,w5,w13 + add w6,w6,w14 + ldp w13,w14,[x0,#24] + add w7,w7,w11 + add w8,w8,w12 + ldr w12,[sp,#0] + stp w3,w4,[x0,#0] + add w9,w9,w13 + mov w13,wzr + stp w5,w6,[x0,#8] + add w10,w10,w14 + stp w7,w8,[x0,#16] + eor w14,w4,w5 + stp w9,w10,[x0,#24] + mov w15,wzr + mov x17,sp + b.ne L_00_48 + + ldr x29,[x29] + add sp,sp,#16*4+16 + ret + diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sha/sha512-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sha/sha512-armv8.S new file mode 100644 index 000000000000..70953ba80bbc --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sha/sha512-armv8.S @@ -0,0 +1,1618 @@ +// Copyright 2014-2025 The OpenSSL Project Authors. All Rights Reserved. +// +// Licensed under the Apache License 2.0 (the "License"). You may not use +// this file except in compliance with the License. You can obtain a copy +// in the file LICENSE in the source distribution or at +// https://www.openssl.org/source/license.html + +// ==================================================================== +// Written by Andy Polyakov for the OpenSSL +// project. The module is, however, dual licensed under OpenSSL and +// CRYPTOGAMS licenses depending on where you obtain it. For further +// details see http://www.openssl.org/~appro/cryptogams/. +// +// Permission to use under GPLv2 terms is granted. +// ==================================================================== +// +// SHA256/512 for ARMv8. +// +// Performance in cycles per processed byte and improvement coefficient +// over code generated with "default" compiler: +// +// SHA256-hw SHA256(*) SHA512 +// Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**)) +// Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***)) +// Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***)) +// Denver 2.01 10.5 (+26%) 6.70 (+8%) +// X-Gene 20.0 (+100%) 12.8 (+300%(***)) +// Mongoose 2.36 13.0 (+50%) 8.36 (+33%) +// Kryo 1.92 17.4 (+30%) 11.2 (+8%) +// ThunderX2 2.54 13.2 (+40%) 8.40 (+18%) +// +// (*) Software SHA256 results are of lesser relevance, presented +// mostly for informational purposes. +// (**) The result is a trade-off: it's possible to improve it by +// 10% (or by 1 cycle per round), but at the cost of 20% loss +// on Cortex-A53 (or by 4 cycles per round). +// (***) Super-impressive coefficients over gcc-generated code are +// indication of some compiler "pathology", most notably code +// generated with -mgeneral-regs-only is significantly faster +// and the gap is only 40-90%. +// +// October 2016. +// +// Originally it was reckoned that it makes no sense to implement NEON +// version of SHA256 for 64-bit processors. This is because performance +// improvement on most wide-spread Cortex-A5x processors was observed +// to be marginal, same on Cortex-A53 and ~10% on A57. But then it was +// observed that 32-bit NEON SHA256 performs significantly better than +// 64-bit scalar version on *some* of the more recent processors. As +// result 64-bit NEON version of SHA256 was added to provide best +// all-round performance. For example it executes ~30% faster on X-Gene +// and Mongoose. [For reference, NEON version of SHA512 is bound to +// deliver much less improvement, likely *negative* on Cortex-A5x. +// Which is why NEON support is limited to SHA256.] + +// $output is the last argument if it looks like a file (it has an extension) +// $flavour is the first argument if it doesn't look like a file +#include "arm_arch.h" +#ifndef __KERNEL__ + + +#endif + +.text + +.globl sha512_block_data_order +.def sha512_block_data_order + .type 32 +.endef +.align 6 +sha512_block_data_order: + AARCH64_VALID_CALL_TARGET +#ifndef __KERNEL__ + adrp x16,OPENSSL_armcap_P + ldr w16,[x16,#:lo12:OPENSSL_armcap_P] + tst w16,#ARMV8_SHA512 + b.ne Lv8_entry +#endif + AARCH64_SIGN_LINK_REGISTER + stp x29,x30,[sp,#-128]! + add x29,sp,#0 + + stp x19,x20,[sp,#16] + stp x21,x22,[sp,#32] + stp x23,x24,[sp,#48] + stp x25,x26,[sp,#64] + stp x27,x28,[sp,#80] + sub sp,sp,#4*8 + + ldp x20,x21,[x0] // load context + ldp x22,x23,[x0,#2*8] + ldp x24,x25,[x0,#4*8] + add x2,x1,x2,lsl#7 // end of input + ldp x26,x27,[x0,#6*8] + adrp x30,LK512 + add x30,x30,:lo12:LK512 + stp x0,x2,[x29,#96] + +Loop: + ldp x3,x4,[x1],#2*8 + ldr x19,[x30],#8 // *K++ + eor x28,x21,x22 // magic seed + str x1,[x29,#112] +#ifndef __AARCH64EB__ + rev x3,x3 // 0 +#endif + ror x16,x24,#14 + add x27,x27,x19 // h+=K[i] + eor x6,x24,x24,ror#23 + and x17,x25,x24 + bic x19,x26,x24 + add x27,x27,x3 // h+=X[i] + orr x17,x17,x19 // Ch(e,f,g) + eor x19,x20,x21 // a^b, b^c in next round + eor x16,x16,x6,ror#18 // Sigma1(e) + ror x6,x20,#28 + add x27,x27,x17 // h+=Ch(e,f,g) + eor x17,x20,x20,ror#5 + add x27,x27,x16 // h+=Sigma1(e) + and x28,x28,x19 // (b^c)&=(a^b) + add x23,x23,x27 // d+=h + eor x28,x28,x21 // Maj(a,b,c) + eor x17,x6,x17,ror#34 // Sigma0(a) + add x27,x27,x28 // h+=Maj(a,b,c) + ldr x28,[x30],#8 // *K++, x19 in next round + //add x27,x27,x17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev x4,x4 // 1 +#endif + ldp x5,x6,[x1],#2*8 + add x27,x27,x17 // h+=Sigma0(a) + ror x16,x23,#14 + add x26,x26,x28 // h+=K[i] + eor x7,x23,x23,ror#23 + and x17,x24,x23 + bic x28,x25,x23 + add x26,x26,x4 // h+=X[i] + orr x17,x17,x28 // Ch(e,f,g) + eor x28,x27,x20 // a^b, b^c in next round + eor x16,x16,x7,ror#18 // Sigma1(e) + ror x7,x27,#28 + add x26,x26,x17 // h+=Ch(e,f,g) + eor x17,x27,x27,ror#5 + add x26,x26,x16 // h+=Sigma1(e) + and x19,x19,x28 // (b^c)&=(a^b) + add x22,x22,x26 // d+=h + eor x19,x19,x20 // Maj(a,b,c) + eor x17,x7,x17,ror#34 // Sigma0(a) + add x26,x26,x19 // h+=Maj(a,b,c) + ldr x19,[x30],#8 // *K++, x28 in next round + //add x26,x26,x17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev x5,x5 // 2 +#endif + add x26,x26,x17 // h+=Sigma0(a) + ror x16,x22,#14 + add x25,x25,x19 // h+=K[i] + eor x8,x22,x22,ror#23 + and x17,x23,x22 + bic x19,x24,x22 + add x25,x25,x5 // h+=X[i] + orr x17,x17,x19 // Ch(e,f,g) + eor x19,x26,x27 // a^b, b^c in next round + eor x16,x16,x8,ror#18 // Sigma1(e) + ror x8,x26,#28 + add x25,x25,x17 // h+=Ch(e,f,g) + eor x17,x26,x26,ror#5 + add x25,x25,x16 // h+=Sigma1(e) + and x28,x28,x19 // (b^c)&=(a^b) + add x21,x21,x25 // d+=h + eor x28,x28,x27 // Maj(a,b,c) + eor x17,x8,x17,ror#34 // Sigma0(a) + add x25,x25,x28 // h+=Maj(a,b,c) + ldr x28,[x30],#8 // *K++, x19 in next round + //add x25,x25,x17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev x6,x6 // 3 +#endif + ldp x7,x8,[x1],#2*8 + add x25,x25,x17 // h+=Sigma0(a) + ror x16,x21,#14 + add x24,x24,x28 // h+=K[i] + eor x9,x21,x21,ror#23 + and x17,x22,x21 + bic x28,x23,x21 + add x24,x24,x6 // h+=X[i] + orr x17,x17,x28 // Ch(e,f,g) + eor x28,x25,x26 // a^b, b^c in next round + eor x16,x16,x9,ror#18 // Sigma1(e) + ror x9,x25,#28 + add x24,x24,x17 // h+=Ch(e,f,g) + eor x17,x25,x25,ror#5 + add x24,x24,x16 // h+=Sigma1(e) + and x19,x19,x28 // (b^c)&=(a^b) + add x20,x20,x24 // d+=h + eor x19,x19,x26 // Maj(a,b,c) + eor x17,x9,x17,ror#34 // Sigma0(a) + add x24,x24,x19 // h+=Maj(a,b,c) + ldr x19,[x30],#8 // *K++, x28 in next round + //add x24,x24,x17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev x7,x7 // 4 +#endif + add x24,x24,x17 // h+=Sigma0(a) + ror x16,x20,#14 + add x23,x23,x19 // h+=K[i] + eor x10,x20,x20,ror#23 + and x17,x21,x20 + bic x19,x22,x20 + add x23,x23,x7 // h+=X[i] + orr x17,x17,x19 // Ch(e,f,g) + eor x19,x24,x25 // a^b, b^c in next round + eor x16,x16,x10,ror#18 // Sigma1(e) + ror x10,x24,#28 + add x23,x23,x17 // h+=Ch(e,f,g) + eor x17,x24,x24,ror#5 + add x23,x23,x16 // h+=Sigma1(e) + and x28,x28,x19 // (b^c)&=(a^b) + add x27,x27,x23 // d+=h + eor x28,x28,x25 // Maj(a,b,c) + eor x17,x10,x17,ror#34 // Sigma0(a) + add x23,x23,x28 // h+=Maj(a,b,c) + ldr x28,[x30],#8 // *K++, x19 in next round + //add x23,x23,x17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev x8,x8 // 5 +#endif + ldp x9,x10,[x1],#2*8 + add x23,x23,x17 // h+=Sigma0(a) + ror x16,x27,#14 + add x22,x22,x28 // h+=K[i] + eor x11,x27,x27,ror#23 + and x17,x20,x27 + bic x28,x21,x27 + add x22,x22,x8 // h+=X[i] + orr x17,x17,x28 // Ch(e,f,g) + eor x28,x23,x24 // a^b, b^c in next round + eor x16,x16,x11,ror#18 // Sigma1(e) + ror x11,x23,#28 + add x22,x22,x17 // h+=Ch(e,f,g) + eor x17,x23,x23,ror#5 + add x22,x22,x16 // h+=Sigma1(e) + and x19,x19,x28 // (b^c)&=(a^b) + add x26,x26,x22 // d+=h + eor x19,x19,x24 // Maj(a,b,c) + eor x17,x11,x17,ror#34 // Sigma0(a) + add x22,x22,x19 // h+=Maj(a,b,c) + ldr x19,[x30],#8 // *K++, x28 in next round + //add x22,x22,x17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev x9,x9 // 6 +#endif + add x22,x22,x17 // h+=Sigma0(a) + ror x16,x26,#14 + add x21,x21,x19 // h+=K[i] + eor x12,x26,x26,ror#23 + and x17,x27,x26 + bic x19,x20,x26 + add x21,x21,x9 // h+=X[i] + orr x17,x17,x19 // Ch(e,f,g) + eor x19,x22,x23 // a^b, b^c in next round + eor x16,x16,x12,ror#18 // Sigma1(e) + ror x12,x22,#28 + add x21,x21,x17 // h+=Ch(e,f,g) + eor x17,x22,x22,ror#5 + add x21,x21,x16 // h+=Sigma1(e) + and x28,x28,x19 // (b^c)&=(a^b) + add x25,x25,x21 // d+=h + eor x28,x28,x23 // Maj(a,b,c) + eor x17,x12,x17,ror#34 // Sigma0(a) + add x21,x21,x28 // h+=Maj(a,b,c) + ldr x28,[x30],#8 // *K++, x19 in next round + //add x21,x21,x17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev x10,x10 // 7 +#endif + ldp x11,x12,[x1],#2*8 + add x21,x21,x17 // h+=Sigma0(a) + ror x16,x25,#14 + add x20,x20,x28 // h+=K[i] + eor x13,x25,x25,ror#23 + and x17,x26,x25 + bic x28,x27,x25 + add x20,x20,x10 // h+=X[i] + orr x17,x17,x28 // Ch(e,f,g) + eor x28,x21,x22 // a^b, b^c in next round + eor x16,x16,x13,ror#18 // Sigma1(e) + ror x13,x21,#28 + add x20,x20,x17 // h+=Ch(e,f,g) + eor x17,x21,x21,ror#5 + add x20,x20,x16 // h+=Sigma1(e) + and x19,x19,x28 // (b^c)&=(a^b) + add x24,x24,x20 // d+=h + eor x19,x19,x22 // Maj(a,b,c) + eor x17,x13,x17,ror#34 // Sigma0(a) + add x20,x20,x19 // h+=Maj(a,b,c) + ldr x19,[x30],#8 // *K++, x28 in next round + //add x20,x20,x17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev x11,x11 // 8 +#endif + add x20,x20,x17 // h+=Sigma0(a) + ror x16,x24,#14 + add x27,x27,x19 // h+=K[i] + eor x14,x24,x24,ror#23 + and x17,x25,x24 + bic x19,x26,x24 + add x27,x27,x11 // h+=X[i] + orr x17,x17,x19 // Ch(e,f,g) + eor x19,x20,x21 // a^b, b^c in next round + eor x16,x16,x14,ror#18 // Sigma1(e) + ror x14,x20,#28 + add x27,x27,x17 // h+=Ch(e,f,g) + eor x17,x20,x20,ror#5 + add x27,x27,x16 // h+=Sigma1(e) + and x28,x28,x19 // (b^c)&=(a^b) + add x23,x23,x27 // d+=h + eor x28,x28,x21 // Maj(a,b,c) + eor x17,x14,x17,ror#34 // Sigma0(a) + add x27,x27,x28 // h+=Maj(a,b,c) + ldr x28,[x30],#8 // *K++, x19 in next round + //add x27,x27,x17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev x12,x12 // 9 +#endif + ldp x13,x14,[x1],#2*8 + add x27,x27,x17 // h+=Sigma0(a) + ror x16,x23,#14 + add x26,x26,x28 // h+=K[i] + eor x15,x23,x23,ror#23 + and x17,x24,x23 + bic x28,x25,x23 + add x26,x26,x12 // h+=X[i] + orr x17,x17,x28 // Ch(e,f,g) + eor x28,x27,x20 // a^b, b^c in next round + eor x16,x16,x15,ror#18 // Sigma1(e) + ror x15,x27,#28 + add x26,x26,x17 // h+=Ch(e,f,g) + eor x17,x27,x27,ror#5 + add x26,x26,x16 // h+=Sigma1(e) + and x19,x19,x28 // (b^c)&=(a^b) + add x22,x22,x26 // d+=h + eor x19,x19,x20 // Maj(a,b,c) + eor x17,x15,x17,ror#34 // Sigma0(a) + add x26,x26,x19 // h+=Maj(a,b,c) + ldr x19,[x30],#8 // *K++, x28 in next round + //add x26,x26,x17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev x13,x13 // 10 +#endif + add x26,x26,x17 // h+=Sigma0(a) + ror x16,x22,#14 + add x25,x25,x19 // h+=K[i] + eor x0,x22,x22,ror#23 + and x17,x23,x22 + bic x19,x24,x22 + add x25,x25,x13 // h+=X[i] + orr x17,x17,x19 // Ch(e,f,g) + eor x19,x26,x27 // a^b, b^c in next round + eor x16,x16,x0,ror#18 // Sigma1(e) + ror x0,x26,#28 + add x25,x25,x17 // h+=Ch(e,f,g) + eor x17,x26,x26,ror#5 + add x25,x25,x16 // h+=Sigma1(e) + and x28,x28,x19 // (b^c)&=(a^b) + add x21,x21,x25 // d+=h + eor x28,x28,x27 // Maj(a,b,c) + eor x17,x0,x17,ror#34 // Sigma0(a) + add x25,x25,x28 // h+=Maj(a,b,c) + ldr x28,[x30],#8 // *K++, x19 in next round + //add x25,x25,x17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev x14,x14 // 11 +#endif + ldp x15,x0,[x1],#2*8 + add x25,x25,x17 // h+=Sigma0(a) + str x6,[sp,#24] + ror x16,x21,#14 + add x24,x24,x28 // h+=K[i] + eor x6,x21,x21,ror#23 + and x17,x22,x21 + bic x28,x23,x21 + add x24,x24,x14 // h+=X[i] + orr x17,x17,x28 // Ch(e,f,g) + eor x28,x25,x26 // a^b, b^c in next round + eor x16,x16,x6,ror#18 // Sigma1(e) + ror x6,x25,#28 + add x24,x24,x17 // h+=Ch(e,f,g) + eor x17,x25,x25,ror#5 + add x24,x24,x16 // h+=Sigma1(e) + and x19,x19,x28 // (b^c)&=(a^b) + add x20,x20,x24 // d+=h + eor x19,x19,x26 // Maj(a,b,c) + eor x17,x6,x17,ror#34 // Sigma0(a) + add x24,x24,x19 // h+=Maj(a,b,c) + ldr x19,[x30],#8 // *K++, x28 in next round + //add x24,x24,x17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev x15,x15 // 12 +#endif + add x24,x24,x17 // h+=Sigma0(a) + str x7,[sp,#0] + ror x16,x20,#14 + add x23,x23,x19 // h+=K[i] + eor x7,x20,x20,ror#23 + and x17,x21,x20 + bic x19,x22,x20 + add x23,x23,x15 // h+=X[i] + orr x17,x17,x19 // Ch(e,f,g) + eor x19,x24,x25 // a^b, b^c in next round + eor x16,x16,x7,ror#18 // Sigma1(e) + ror x7,x24,#28 + add x23,x23,x17 // h+=Ch(e,f,g) + eor x17,x24,x24,ror#5 + add x23,x23,x16 // h+=Sigma1(e) + and x28,x28,x19 // (b^c)&=(a^b) + add x27,x27,x23 // d+=h + eor x28,x28,x25 // Maj(a,b,c) + eor x17,x7,x17,ror#34 // Sigma0(a) + add x23,x23,x28 // h+=Maj(a,b,c) + ldr x28,[x30],#8 // *K++, x19 in next round + //add x23,x23,x17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev x0,x0 // 13 +#endif + ldp x1,x2,[x1] + add x23,x23,x17 // h+=Sigma0(a) + str x8,[sp,#8] + ror x16,x27,#14 + add x22,x22,x28 // h+=K[i] + eor x8,x27,x27,ror#23 + and x17,x20,x27 + bic x28,x21,x27 + add x22,x22,x0 // h+=X[i] + orr x17,x17,x28 // Ch(e,f,g) + eor x28,x23,x24 // a^b, b^c in next round + eor x16,x16,x8,ror#18 // Sigma1(e) + ror x8,x23,#28 + add x22,x22,x17 // h+=Ch(e,f,g) + eor x17,x23,x23,ror#5 + add x22,x22,x16 // h+=Sigma1(e) + and x19,x19,x28 // (b^c)&=(a^b) + add x26,x26,x22 // d+=h + eor x19,x19,x24 // Maj(a,b,c) + eor x17,x8,x17,ror#34 // Sigma0(a) + add x22,x22,x19 // h+=Maj(a,b,c) + ldr x19,[x30],#8 // *K++, x28 in next round + //add x22,x22,x17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev x1,x1 // 14 +#endif + ldr x6,[sp,#24] + add x22,x22,x17 // h+=Sigma0(a) + str x9,[sp,#16] + ror x16,x26,#14 + add x21,x21,x19 // h+=K[i] + eor x9,x26,x26,ror#23 + and x17,x27,x26 + bic x19,x20,x26 + add x21,x21,x1 // h+=X[i] + orr x17,x17,x19 // Ch(e,f,g) + eor x19,x22,x23 // a^b, b^c in next round + eor x16,x16,x9,ror#18 // Sigma1(e) + ror x9,x22,#28 + add x21,x21,x17 // h+=Ch(e,f,g) + eor x17,x22,x22,ror#5 + add x21,x21,x16 // h+=Sigma1(e) + and x28,x28,x19 // (b^c)&=(a^b) + add x25,x25,x21 // d+=h + eor x28,x28,x23 // Maj(a,b,c) + eor x17,x9,x17,ror#34 // Sigma0(a) + add x21,x21,x28 // h+=Maj(a,b,c) + ldr x28,[x30],#8 // *K++, x19 in next round + //add x21,x21,x17 // h+=Sigma0(a) +#ifndef __AARCH64EB__ + rev x2,x2 // 15 +#endif + ldr x7,[sp,#0] + add x21,x21,x17 // h+=Sigma0(a) + str x10,[sp,#24] + ror x16,x25,#14 + add x20,x20,x28 // h+=K[i] + ror x9,x4,#1 + and x17,x26,x25 + ror x8,x1,#19 + bic x28,x27,x25 + ror x10,x21,#28 + add x20,x20,x2 // h+=X[i] + eor x16,x16,x25,ror#18 + eor x9,x9,x4,ror#8 + orr x17,x17,x28 // Ch(e,f,g) + eor x28,x21,x22 // a^b, b^c in next round + eor x16,x16,x25,ror#41 // Sigma1(e) + eor x10,x10,x21,ror#34 + add x20,x20,x17 // h+=Ch(e,f,g) + and x19,x19,x28 // (b^c)&=(a^b) + eor x8,x8,x1,ror#61 + eor x9,x9,x4,lsr#7 // sigma0(X[i+1]) + add x20,x20,x16 // h+=Sigma1(e) + eor x19,x19,x22 // Maj(a,b,c) + eor x17,x10,x21,ror#39 // Sigma0(a) + eor x8,x8,x1,lsr#6 // sigma1(X[i+14]) + add x3,x3,x12 + add x24,x24,x20 // d+=h + add x20,x20,x19 // h+=Maj(a,b,c) + ldr x19,[x30],#8 // *K++, x28 in next round + add x3,x3,x9 + add x20,x20,x17 // h+=Sigma0(a) + add x3,x3,x8 +Loop_16_xx: + ldr x8,[sp,#8] + str x11,[sp,#0] + ror x16,x24,#14 + add x27,x27,x19 // h+=K[i] + ror x10,x5,#1 + and x17,x25,x24 + ror x9,x2,#19 + bic x19,x26,x24 + ror x11,x20,#28 + add x27,x27,x3 // h+=X[i] + eor x16,x16,x24,ror#18 + eor x10,x10,x5,ror#8 + orr x17,x17,x19 // Ch(e,f,g) + eor x19,x20,x21 // a^b, b^c in next round + eor x16,x16,x24,ror#41 // Sigma1(e) + eor x11,x11,x20,ror#34 + add x27,x27,x17 // h+=Ch(e,f,g) + and x28,x28,x19 // (b^c)&=(a^b) + eor x9,x9,x2,ror#61 + eor x10,x10,x5,lsr#7 // sigma0(X[i+1]) + add x27,x27,x16 // h+=Sigma1(e) + eor x28,x28,x21 // Maj(a,b,c) + eor x17,x11,x20,ror#39 // Sigma0(a) + eor x9,x9,x2,lsr#6 // sigma1(X[i+14]) + add x4,x4,x13 + add x23,x23,x27 // d+=h + add x27,x27,x28 // h+=Maj(a,b,c) + ldr x28,[x30],#8 // *K++, x19 in next round + add x4,x4,x10 + add x27,x27,x17 // h+=Sigma0(a) + add x4,x4,x9 + ldr x9,[sp,#16] + str x12,[sp,#8] + ror x16,x23,#14 + add x26,x26,x28 // h+=K[i] + ror x11,x6,#1 + and x17,x24,x23 + ror x10,x3,#19 + bic x28,x25,x23 + ror x12,x27,#28 + add x26,x26,x4 // h+=X[i] + eor x16,x16,x23,ror#18 + eor x11,x11,x6,ror#8 + orr x17,x17,x28 // Ch(e,f,g) + eor x28,x27,x20 // a^b, b^c in next round + eor x16,x16,x23,ror#41 // Sigma1(e) + eor x12,x12,x27,ror#34 + add x26,x26,x17 // h+=Ch(e,f,g) + and x19,x19,x28 // (b^c)&=(a^b) + eor x10,x10,x3,ror#61 + eor x11,x11,x6,lsr#7 // sigma0(X[i+1]) + add x26,x26,x16 // h+=Sigma1(e) + eor x19,x19,x20 // Maj(a,b,c) + eor x17,x12,x27,ror#39 // Sigma0(a) + eor x10,x10,x3,lsr#6 // sigma1(X[i+14]) + add x5,x5,x14 + add x22,x22,x26 // d+=h + add x26,x26,x19 // h+=Maj(a,b,c) + ldr x19,[x30],#8 // *K++, x28 in next round + add x5,x5,x11 + add x26,x26,x17 // h+=Sigma0(a) + add x5,x5,x10 + ldr x10,[sp,#24] + str x13,[sp,#16] + ror x16,x22,#14 + add x25,x25,x19 // h+=K[i] + ror x12,x7,#1 + and x17,x23,x22 + ror x11,x4,#19 + bic x19,x24,x22 + ror x13,x26,#28 + add x25,x25,x5 // h+=X[i] + eor x16,x16,x22,ror#18 + eor x12,x12,x7,ror#8 + orr x17,x17,x19 // Ch(e,f,g) + eor x19,x26,x27 // a^b, b^c in next round + eor x16,x16,x22,ror#41 // Sigma1(e) + eor x13,x13,x26,ror#34 + add x25,x25,x17 // h+=Ch(e,f,g) + and x28,x28,x19 // (b^c)&=(a^b) + eor x11,x11,x4,ror#61 + eor x12,x12,x7,lsr#7 // sigma0(X[i+1]) + add x25,x25,x16 // h+=Sigma1(e) + eor x28,x28,x27 // Maj(a,b,c) + eor x17,x13,x26,ror#39 // Sigma0(a) + eor x11,x11,x4,lsr#6 // sigma1(X[i+14]) + add x6,x6,x15 + add x21,x21,x25 // d+=h + add x25,x25,x28 // h+=Maj(a,b,c) + ldr x28,[x30],#8 // *K++, x19 in next round + add x6,x6,x12 + add x25,x25,x17 // h+=Sigma0(a) + add x6,x6,x11 + ldr x11,[sp,#0] + str x14,[sp,#24] + ror x16,x21,#14 + add x24,x24,x28 // h+=K[i] + ror x13,x8,#1 + and x17,x22,x21 + ror x12,x5,#19 + bic x28,x23,x21 + ror x14,x25,#28 + add x24,x24,x6 // h+=X[i] + eor x16,x16,x21,ror#18 + eor x13,x13,x8,ror#8 + orr x17,x17,x28 // Ch(e,f,g) + eor x28,x25,x26 // a^b, b^c in next round + eor x16,x16,x21,ror#41 // Sigma1(e) + eor x14,x14,x25,ror#34 + add x24,x24,x17 // h+=Ch(e,f,g) + and x19,x19,x28 // (b^c)&=(a^b) + eor x12,x12,x5,ror#61 + eor x13,x13,x8,lsr#7 // sigma0(X[i+1]) + add x24,x24,x16 // h+=Sigma1(e) + eor x19,x19,x26 // Maj(a,b,c) + eor x17,x14,x25,ror#39 // Sigma0(a) + eor x12,x12,x5,lsr#6 // sigma1(X[i+14]) + add x7,x7,x0 + add x20,x20,x24 // d+=h + add x24,x24,x19 // h+=Maj(a,b,c) + ldr x19,[x30],#8 // *K++, x28 in next round + add x7,x7,x13 + add x24,x24,x17 // h+=Sigma0(a) + add x7,x7,x12 + ldr x12,[sp,#8] + str x15,[sp,#0] + ror x16,x20,#14 + add x23,x23,x19 // h+=K[i] + ror x14,x9,#1 + and x17,x21,x20 + ror x13,x6,#19 + bic x19,x22,x20 + ror x15,x24,#28 + add x23,x23,x7 // h+=X[i] + eor x16,x16,x20,ror#18 + eor x14,x14,x9,ror#8 + orr x17,x17,x19 // Ch(e,f,g) + eor x19,x24,x25 // a^b, b^c in next round + eor x16,x16,x20,ror#41 // Sigma1(e) + eor x15,x15,x24,ror#34 + add x23,x23,x17 // h+=Ch(e,f,g) + and x28,x28,x19 // (b^c)&=(a^b) + eor x13,x13,x6,ror#61 + eor x14,x14,x9,lsr#7 // sigma0(X[i+1]) + add x23,x23,x16 // h+=Sigma1(e) + eor x28,x28,x25 // Maj(a,b,c) + eor x17,x15,x24,ror#39 // Sigma0(a) + eor x13,x13,x6,lsr#6 // sigma1(X[i+14]) + add x8,x8,x1 + add x27,x27,x23 // d+=h + add x23,x23,x28 // h+=Maj(a,b,c) + ldr x28,[x30],#8 // *K++, x19 in next round + add x8,x8,x14 + add x23,x23,x17 // h+=Sigma0(a) + add x8,x8,x13 + ldr x13,[sp,#16] + str x0,[sp,#8] + ror x16,x27,#14 + add x22,x22,x28 // h+=K[i] + ror x15,x10,#1 + and x17,x20,x27 + ror x14,x7,#19 + bic x28,x21,x27 + ror x0,x23,#28 + add x22,x22,x8 // h+=X[i] + eor x16,x16,x27,ror#18 + eor x15,x15,x10,ror#8 + orr x17,x17,x28 // Ch(e,f,g) + eor x28,x23,x24 // a^b, b^c in next round + eor x16,x16,x27,ror#41 // Sigma1(e) + eor x0,x0,x23,ror#34 + add x22,x22,x17 // h+=Ch(e,f,g) + and x19,x19,x28 // (b^c)&=(a^b) + eor x14,x14,x7,ror#61 + eor x15,x15,x10,lsr#7 // sigma0(X[i+1]) + add x22,x22,x16 // h+=Sigma1(e) + eor x19,x19,x24 // Maj(a,b,c) + eor x17,x0,x23,ror#39 // Sigma0(a) + eor x14,x14,x7,lsr#6 // sigma1(X[i+14]) + add x9,x9,x2 + add x26,x26,x22 // d+=h + add x22,x22,x19 // h+=Maj(a,b,c) + ldr x19,[x30],#8 // *K++, x28 in next round + add x9,x9,x15 + add x22,x22,x17 // h+=Sigma0(a) + add x9,x9,x14 + ldr x14,[sp,#24] + str x1,[sp,#16] + ror x16,x26,#14 + add x21,x21,x19 // h+=K[i] + ror x0,x11,#1 + and x17,x27,x26 + ror x15,x8,#19 + bic x19,x20,x26 + ror x1,x22,#28 + add x21,x21,x9 // h+=X[i] + eor x16,x16,x26,ror#18 + eor x0,x0,x11,ror#8 + orr x17,x17,x19 // Ch(e,f,g) + eor x19,x22,x23 // a^b, b^c in next round + eor x16,x16,x26,ror#41 // Sigma1(e) + eor x1,x1,x22,ror#34 + add x21,x21,x17 // h+=Ch(e,f,g) + and x28,x28,x19 // (b^c)&=(a^b) + eor x15,x15,x8,ror#61 + eor x0,x0,x11,lsr#7 // sigma0(X[i+1]) + add x21,x21,x16 // h+=Sigma1(e) + eor x28,x28,x23 // Maj(a,b,c) + eor x17,x1,x22,ror#39 // Sigma0(a) + eor x15,x15,x8,lsr#6 // sigma1(X[i+14]) + add x10,x10,x3 + add x25,x25,x21 // d+=h + add x21,x21,x28 // h+=Maj(a,b,c) + ldr x28,[x30],#8 // *K++, x19 in next round + add x10,x10,x0 + add x21,x21,x17 // h+=Sigma0(a) + add x10,x10,x15 + ldr x15,[sp,#0] + str x2,[sp,#24] + ror x16,x25,#14 + add x20,x20,x28 // h+=K[i] + ror x1,x12,#1 + and x17,x26,x25 + ror x0,x9,#19 + bic x28,x27,x25 + ror x2,x21,#28 + add x20,x20,x10 // h+=X[i] + eor x16,x16,x25,ror#18 + eor x1,x1,x12,ror#8 + orr x17,x17,x28 // Ch(e,f,g) + eor x28,x21,x22 // a^b, b^c in next round + eor x16,x16,x25,ror#41 // Sigma1(e) + eor x2,x2,x21,ror#34 + add x20,x20,x17 // h+=Ch(e,f,g) + and x19,x19,x28 // (b^c)&=(a^b) + eor x0,x0,x9,ror#61 + eor x1,x1,x12,lsr#7 // sigma0(X[i+1]) + add x20,x20,x16 // h+=Sigma1(e) + eor x19,x19,x22 // Maj(a,b,c) + eor x17,x2,x21,ror#39 // Sigma0(a) + eor x0,x0,x9,lsr#6 // sigma1(X[i+14]) + add x11,x11,x4 + add x24,x24,x20 // d+=h + add x20,x20,x19 // h+=Maj(a,b,c) + ldr x19,[x30],#8 // *K++, x28 in next round + add x11,x11,x1 + add x20,x20,x17 // h+=Sigma0(a) + add x11,x11,x0 + ldr x0,[sp,#8] + str x3,[sp,#0] + ror x16,x24,#14 + add x27,x27,x19 // h+=K[i] + ror x2,x13,#1 + and x17,x25,x24 + ror x1,x10,#19 + bic x19,x26,x24 + ror x3,x20,#28 + add x27,x27,x11 // h+=X[i] + eor x16,x16,x24,ror#18 + eor x2,x2,x13,ror#8 + orr x17,x17,x19 // Ch(e,f,g) + eor x19,x20,x21 // a^b, b^c in next round + eor x16,x16,x24,ror#41 // Sigma1(e) + eor x3,x3,x20,ror#34 + add x27,x27,x17 // h+=Ch(e,f,g) + and x28,x28,x19 // (b^c)&=(a^b) + eor x1,x1,x10,ror#61 + eor x2,x2,x13,lsr#7 // sigma0(X[i+1]) + add x27,x27,x16 // h+=Sigma1(e) + eor x28,x28,x21 // Maj(a,b,c) + eor x17,x3,x20,ror#39 // Sigma0(a) + eor x1,x1,x10,lsr#6 // sigma1(X[i+14]) + add x12,x12,x5 + add x23,x23,x27 // d+=h + add x27,x27,x28 // h+=Maj(a,b,c) + ldr x28,[x30],#8 // *K++, x19 in next round + add x12,x12,x2 + add x27,x27,x17 // h+=Sigma0(a) + add x12,x12,x1 + ldr x1,[sp,#16] + str x4,[sp,#8] + ror x16,x23,#14 + add x26,x26,x28 // h+=K[i] + ror x3,x14,#1 + and x17,x24,x23 + ror x2,x11,#19 + bic x28,x25,x23 + ror x4,x27,#28 + add x26,x26,x12 // h+=X[i] + eor x16,x16,x23,ror#18 + eor x3,x3,x14,ror#8 + orr x17,x17,x28 // Ch(e,f,g) + eor x28,x27,x20 // a^b, b^c in next round + eor x16,x16,x23,ror#41 // Sigma1(e) + eor x4,x4,x27,ror#34 + add x26,x26,x17 // h+=Ch(e,f,g) + and x19,x19,x28 // (b^c)&=(a^b) + eor x2,x2,x11,ror#61 + eor x3,x3,x14,lsr#7 // sigma0(X[i+1]) + add x26,x26,x16 // h+=Sigma1(e) + eor x19,x19,x20 // Maj(a,b,c) + eor x17,x4,x27,ror#39 // Sigma0(a) + eor x2,x2,x11,lsr#6 // sigma1(X[i+14]) + add x13,x13,x6 + add x22,x22,x26 // d+=h + add x26,x26,x19 // h+=Maj(a,b,c) + ldr x19,[x30],#8 // *K++, x28 in next round + add x13,x13,x3 + add x26,x26,x17 // h+=Sigma0(a) + add x13,x13,x2 + ldr x2,[sp,#24] + str x5,[sp,#16] + ror x16,x22,#14 + add x25,x25,x19 // h+=K[i] + ror x4,x15,#1 + and x17,x23,x22 + ror x3,x12,#19 + bic x19,x24,x22 + ror x5,x26,#28 + add x25,x25,x13 // h+=X[i] + eor x16,x16,x22,ror#18 + eor x4,x4,x15,ror#8 + orr x17,x17,x19 // Ch(e,f,g) + eor x19,x26,x27 // a^b, b^c in next round + eor x16,x16,x22,ror#41 // Sigma1(e) + eor x5,x5,x26,ror#34 + add x25,x25,x17 // h+=Ch(e,f,g) + and x28,x28,x19 // (b^c)&=(a^b) + eor x3,x3,x12,ror#61 + eor x4,x4,x15,lsr#7 // sigma0(X[i+1]) + add x25,x25,x16 // h+=Sigma1(e) + eor x28,x28,x27 // Maj(a,b,c) + eor x17,x5,x26,ror#39 // Sigma0(a) + eor x3,x3,x12,lsr#6 // sigma1(X[i+14]) + add x14,x14,x7 + add x21,x21,x25 // d+=h + add x25,x25,x28 // h+=Maj(a,b,c) + ldr x28,[x30],#8 // *K++, x19 in next round + add x14,x14,x4 + add x25,x25,x17 // h+=Sigma0(a) + add x14,x14,x3 + ldr x3,[sp,#0] + str x6,[sp,#24] + ror x16,x21,#14 + add x24,x24,x28 // h+=K[i] + ror x5,x0,#1 + and x17,x22,x21 + ror x4,x13,#19 + bic x28,x23,x21 + ror x6,x25,#28 + add x24,x24,x14 // h+=X[i] + eor x16,x16,x21,ror#18 + eor x5,x5,x0,ror#8 + orr x17,x17,x28 // Ch(e,f,g) + eor x28,x25,x26 // a^b, b^c in next round + eor x16,x16,x21,ror#41 // Sigma1(e) + eor x6,x6,x25,ror#34 + add x24,x24,x17 // h+=Ch(e,f,g) + and x19,x19,x28 // (b^c)&=(a^b) + eor x4,x4,x13,ror#61 + eor x5,x5,x0,lsr#7 // sigma0(X[i+1]) + add x24,x24,x16 // h+=Sigma1(e) + eor x19,x19,x26 // Maj(a,b,c) + eor x17,x6,x25,ror#39 // Sigma0(a) + eor x4,x4,x13,lsr#6 // sigma1(X[i+14]) + add x15,x15,x8 + add x20,x20,x24 // d+=h + add x24,x24,x19 // h+=Maj(a,b,c) + ldr x19,[x30],#8 // *K++, x28 in next round + add x15,x15,x5 + add x24,x24,x17 // h+=Sigma0(a) + add x15,x15,x4 + ldr x4,[sp,#8] + str x7,[sp,#0] + ror x16,x20,#14 + add x23,x23,x19 // h+=K[i] + ror x6,x1,#1 + and x17,x21,x20 + ror x5,x14,#19 + bic x19,x22,x20 + ror x7,x24,#28 + add x23,x23,x15 // h+=X[i] + eor x16,x16,x20,ror#18 + eor x6,x6,x1,ror#8 + orr x17,x17,x19 // Ch(e,f,g) + eor x19,x24,x25 // a^b, b^c in next round + eor x16,x16,x20,ror#41 // Sigma1(e) + eor x7,x7,x24,ror#34 + add x23,x23,x17 // h+=Ch(e,f,g) + and x28,x28,x19 // (b^c)&=(a^b) + eor x5,x5,x14,ror#61 + eor x6,x6,x1,lsr#7 // sigma0(X[i+1]) + add x23,x23,x16 // h+=Sigma1(e) + eor x28,x28,x25 // Maj(a,b,c) + eor x17,x7,x24,ror#39 // Sigma0(a) + eor x5,x5,x14,lsr#6 // sigma1(X[i+14]) + add x0,x0,x9 + add x27,x27,x23 // d+=h + add x23,x23,x28 // h+=Maj(a,b,c) + ldr x28,[x30],#8 // *K++, x19 in next round + add x0,x0,x6 + add x23,x23,x17 // h+=Sigma0(a) + add x0,x0,x5 + ldr x5,[sp,#16] + str x8,[sp,#8] + ror x16,x27,#14 + add x22,x22,x28 // h+=K[i] + ror x7,x2,#1 + and x17,x20,x27 + ror x6,x15,#19 + bic x28,x21,x27 + ror x8,x23,#28 + add x22,x22,x0 // h+=X[i] + eor x16,x16,x27,ror#18 + eor x7,x7,x2,ror#8 + orr x17,x17,x28 // Ch(e,f,g) + eor x28,x23,x24 // a^b, b^c in next round + eor x16,x16,x27,ror#41 // Sigma1(e) + eor x8,x8,x23,ror#34 + add x22,x22,x17 // h+=Ch(e,f,g) + and x19,x19,x28 // (b^c)&=(a^b) + eor x6,x6,x15,ror#61 + eor x7,x7,x2,lsr#7 // sigma0(X[i+1]) + add x22,x22,x16 // h+=Sigma1(e) + eor x19,x19,x24 // Maj(a,b,c) + eor x17,x8,x23,ror#39 // Sigma0(a) + eor x6,x6,x15,lsr#6 // sigma1(X[i+14]) + add x1,x1,x10 + add x26,x26,x22 // d+=h + add x22,x22,x19 // h+=Maj(a,b,c) + ldr x19,[x30],#8 // *K++, x28 in next round + add x1,x1,x7 + add x22,x22,x17 // h+=Sigma0(a) + add x1,x1,x6 + ldr x6,[sp,#24] + str x9,[sp,#16] + ror x16,x26,#14 + add x21,x21,x19 // h+=K[i] + ror x8,x3,#1 + and x17,x27,x26 + ror x7,x0,#19 + bic x19,x20,x26 + ror x9,x22,#28 + add x21,x21,x1 // h+=X[i] + eor x16,x16,x26,ror#18 + eor x8,x8,x3,ror#8 + orr x17,x17,x19 // Ch(e,f,g) + eor x19,x22,x23 // a^b, b^c in next round + eor x16,x16,x26,ror#41 // Sigma1(e) + eor x9,x9,x22,ror#34 + add x21,x21,x17 // h+=Ch(e,f,g) + and x28,x28,x19 // (b^c)&=(a^b) + eor x7,x7,x0,ror#61 + eor x8,x8,x3,lsr#7 // sigma0(X[i+1]) + add x21,x21,x16 // h+=Sigma1(e) + eor x28,x28,x23 // Maj(a,b,c) + eor x17,x9,x22,ror#39 // Sigma0(a) + eor x7,x7,x0,lsr#6 // sigma1(X[i+14]) + add x2,x2,x11 + add x25,x25,x21 // d+=h + add x21,x21,x28 // h+=Maj(a,b,c) + ldr x28,[x30],#8 // *K++, x19 in next round + add x2,x2,x8 + add x21,x21,x17 // h+=Sigma0(a) + add x2,x2,x7 + ldr x7,[sp,#0] + str x10,[sp,#24] + ror x16,x25,#14 + add x20,x20,x28 // h+=K[i] + ror x9,x4,#1 + and x17,x26,x25 + ror x8,x1,#19 + bic x28,x27,x25 + ror x10,x21,#28 + add x20,x20,x2 // h+=X[i] + eor x16,x16,x25,ror#18 + eor x9,x9,x4,ror#8 + orr x17,x17,x28 // Ch(e,f,g) + eor x28,x21,x22 // a^b, b^c in next round + eor x16,x16,x25,ror#41 // Sigma1(e) + eor x10,x10,x21,ror#34 + add x20,x20,x17 // h+=Ch(e,f,g) + and x19,x19,x28 // (b^c)&=(a^b) + eor x8,x8,x1,ror#61 + eor x9,x9,x4,lsr#7 // sigma0(X[i+1]) + add x20,x20,x16 // h+=Sigma1(e) + eor x19,x19,x22 // Maj(a,b,c) + eor x17,x10,x21,ror#39 // Sigma0(a) + eor x8,x8,x1,lsr#6 // sigma1(X[i+14]) + add x3,x3,x12 + add x24,x24,x20 // d+=h + add x20,x20,x19 // h+=Maj(a,b,c) + ldr x19,[x30],#8 // *K++, x28 in next round + add x3,x3,x9 + add x20,x20,x17 // h+=Sigma0(a) + add x3,x3,x8 + cbnz x19,Loop_16_xx + + ldp x0,x2,[x29,#96] + ldr x1,[x29,#112] + sub x30,x30,#648 // rewind + + ldp x3,x4,[x0] + ldp x5,x6,[x0,#2*8] + add x1,x1,#14*8 // advance input pointer + ldp x7,x8,[x0,#4*8] + add x20,x20,x3 + ldp x9,x10,[x0,#6*8] + add x21,x21,x4 + add x22,x22,x5 + add x23,x23,x6 + stp x20,x21,[x0] + add x24,x24,x7 + add x25,x25,x8 + stp x22,x23,[x0,#2*8] + add x26,x26,x9 + add x27,x27,x10 + cmp x1,x2 + stp x24,x25,[x0,#4*8] + stp x26,x27,[x0,#6*8] + b.ne Loop + + ldp x19,x20,[x29,#16] + add sp,sp,#4*8 + ldp x21,x22,[x29,#32] + ldp x23,x24,[x29,#48] + ldp x25,x26,[x29,#64] + ldp x27,x28,[x29,#80] + ldp x29,x30,[sp],#128 + AARCH64_VALIDATE_LINK_REGISTER + ret + + +.section .rodata + +.align 6 + +LK512: +.quad 0x428a2f98d728ae22,0x7137449123ef65cd +.quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc +.quad 0x3956c25bf348b538,0x59f111f1b605d019 +.quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 +.quad 0xd807aa98a3030242,0x12835b0145706fbe +.quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 +.quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 +.quad 0x9bdc06a725c71235,0xc19bf174cf692694 +.quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 +.quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 +.quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 +.quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 +.quad 0x983e5152ee66dfab,0xa831c66d2db43210 +.quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 +.quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 +.quad 0x06ca6351e003826f,0x142929670a0e6e70 +.quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 +.quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df +.quad 0x650a73548baf63de,0x766a0abb3c77b2a8 +.quad 0x81c2c92e47edaee6,0x92722c851482353b +.quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 +.quad 0xc24b8b70d0f89791,0xc76c51a30654be30 +.quad 0xd192e819d6ef5218,0xd69906245565a910 +.quad 0xf40e35855771202a,0x106aa07032bbd1b8 +.quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 +.quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 +.quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb +.quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 +.quad 0x748f82ee5defb2fc,0x78a5636f43172f60 +.quad 0x84c87814a1f0ab72,0x8cc702081a6439ec +.quad 0x90befffa23631e28,0xa4506cebde82bde9 +.quad 0xbef9a3f7b2c67915,0xc67178f2e372532b +.quad 0xca273eceea26619c,0xd186b8c721c0c207 +.quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 +.quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 +.quad 0x113f9804bef90dae,0x1b710b35131c471b +.quad 0x28db77f523047d84,0x32caab7b40c72493 +.quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c +.quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a +.quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 +.quad 0 // terminator + +.byte 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 +.align 2 +.align 2 + +.text +#ifndef __KERNEL__ +.def sha512_block_armv8 + .type 32 +.endef +.align 6 +sha512_block_armv8: +Lv8_entry: + // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later + stp x29,x30,[sp,#-16]! + add x29,sp,#0 + + ld1 {v16.16b,v17.16b,v18.16b,v19.16b},[x1],#64 // load input + ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64 + + ld1 {v0.2d,v1.2d,v2.2d,v3.2d},[x0] // load context + adrp x3,LK512 + add x3,x3,:lo12:LK512 + + rev64 v16.16b,v16.16b + rev64 v17.16b,v17.16b + rev64 v18.16b,v18.16b + rev64 v19.16b,v19.16b + rev64 v20.16b,v20.16b + rev64 v21.16b,v21.16b + rev64 v22.16b,v22.16b + rev64 v23.16b,v23.16b + b Loop_hw + +.align 4 +Loop_hw: + ld1 {v24.2d},[x3],#16 + subs x2,x2,#1 + sub x4,x1,#128 + orr v26.16b,v0.16b,v0.16b // offload + orr v27.16b,v1.16b,v1.16b + orr v28.16b,v2.16b,v2.16b + orr v29.16b,v3.16b,v3.16b + csel x1,x1,x4,ne // conditional rewind + add v24.2d,v24.2d,v16.2d + ld1 {v25.2d},[x3],#16 + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v2.16b,v3.16b,#8 + ext v6.16b,v1.16b,v2.16b,#8 + add v3.2d,v3.2d,v24.2d // "T1 + H + K512[i]" +.long 0xcec08230 //sha512su0 v16.16b,v17.16b + ext v7.16b,v20.16b,v21.16b,#8 +.long 0xce6680a3 //sha512h v3.16b,v5.16b,v6.16b +.long 0xce678af0 //sha512su1 v16.16b,v23.16b,v7.16b + add v4.2d,v1.2d,v3.2d // "D + T1" +.long 0xce608423 //sha512h2 v3.16b,v1.16b,v0.16b + add v25.2d,v25.2d,v17.2d + ld1 {v24.2d},[x3],#16 + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v4.16b,v2.16b,#8 + ext v6.16b,v0.16b,v4.16b,#8 + add v2.2d,v2.2d,v25.2d // "T1 + H + K512[i]" +.long 0xcec08251 //sha512su0 v17.16b,v18.16b + ext v7.16b,v21.16b,v22.16b,#8 +.long 0xce6680a2 //sha512h v2.16b,v5.16b,v6.16b +.long 0xce678a11 //sha512su1 v17.16b,v16.16b,v7.16b + add v1.2d,v0.2d,v2.2d // "D + T1" +.long 0xce638402 //sha512h2 v2.16b,v0.16b,v3.16b + add v24.2d,v24.2d,v18.2d + ld1 {v25.2d},[x3],#16 + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v1.16b,v4.16b,#8 + ext v6.16b,v3.16b,v1.16b,#8 + add v4.2d,v4.2d,v24.2d // "T1 + H + K512[i]" +.long 0xcec08272 //sha512su0 v18.16b,v19.16b + ext v7.16b,v22.16b,v23.16b,#8 +.long 0xce6680a4 //sha512h v4.16b,v5.16b,v6.16b +.long 0xce678a32 //sha512su1 v18.16b,v17.16b,v7.16b + add v0.2d,v3.2d,v4.2d // "D + T1" +.long 0xce628464 //sha512h2 v4.16b,v3.16b,v2.16b + add v25.2d,v25.2d,v19.2d + ld1 {v24.2d},[x3],#16 + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v0.16b,v1.16b,#8 + ext v6.16b,v2.16b,v0.16b,#8 + add v1.2d,v1.2d,v25.2d // "T1 + H + K512[i]" +.long 0xcec08293 //sha512su0 v19.16b,v20.16b + ext v7.16b,v23.16b,v16.16b,#8 +.long 0xce6680a1 //sha512h v1.16b,v5.16b,v6.16b +.long 0xce678a53 //sha512su1 v19.16b,v18.16b,v7.16b + add v3.2d,v2.2d,v1.2d // "D + T1" +.long 0xce648441 //sha512h2 v1.16b,v2.16b,v4.16b + add v24.2d,v24.2d,v20.2d + ld1 {v25.2d},[x3],#16 + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v3.16b,v0.16b,#8 + ext v6.16b,v4.16b,v3.16b,#8 + add v0.2d,v0.2d,v24.2d // "T1 + H + K512[i]" +.long 0xcec082b4 //sha512su0 v20.16b,v21.16b + ext v7.16b,v16.16b,v17.16b,#8 +.long 0xce6680a0 //sha512h v0.16b,v5.16b,v6.16b +.long 0xce678a74 //sha512su1 v20.16b,v19.16b,v7.16b + add v2.2d,v4.2d,v0.2d // "D + T1" +.long 0xce618480 //sha512h2 v0.16b,v4.16b,v1.16b + add v25.2d,v25.2d,v21.2d + ld1 {v24.2d},[x3],#16 + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v2.16b,v3.16b,#8 + ext v6.16b,v1.16b,v2.16b,#8 + add v3.2d,v3.2d,v25.2d // "T1 + H + K512[i]" +.long 0xcec082d5 //sha512su0 v21.16b,v22.16b + ext v7.16b,v17.16b,v18.16b,#8 +.long 0xce6680a3 //sha512h v3.16b,v5.16b,v6.16b +.long 0xce678a95 //sha512su1 v21.16b,v20.16b,v7.16b + add v4.2d,v1.2d,v3.2d // "D + T1" +.long 0xce608423 //sha512h2 v3.16b,v1.16b,v0.16b + add v24.2d,v24.2d,v22.2d + ld1 {v25.2d},[x3],#16 + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v4.16b,v2.16b,#8 + ext v6.16b,v0.16b,v4.16b,#8 + add v2.2d,v2.2d,v24.2d // "T1 + H + K512[i]" +.long 0xcec082f6 //sha512su0 v22.16b,v23.16b + ext v7.16b,v18.16b,v19.16b,#8 +.long 0xce6680a2 //sha512h v2.16b,v5.16b,v6.16b +.long 0xce678ab6 //sha512su1 v22.16b,v21.16b,v7.16b + add v1.2d,v0.2d,v2.2d // "D + T1" +.long 0xce638402 //sha512h2 v2.16b,v0.16b,v3.16b + add v25.2d,v25.2d,v23.2d + ld1 {v24.2d},[x3],#16 + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v1.16b,v4.16b,#8 + ext v6.16b,v3.16b,v1.16b,#8 + add v4.2d,v4.2d,v25.2d // "T1 + H + K512[i]" +.long 0xcec08217 //sha512su0 v23.16b,v16.16b + ext v7.16b,v19.16b,v20.16b,#8 +.long 0xce6680a4 //sha512h v4.16b,v5.16b,v6.16b +.long 0xce678ad7 //sha512su1 v23.16b,v22.16b,v7.16b + add v0.2d,v3.2d,v4.2d // "D + T1" +.long 0xce628464 //sha512h2 v4.16b,v3.16b,v2.16b + add v24.2d,v24.2d,v16.2d + ld1 {v25.2d},[x3],#16 + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v0.16b,v1.16b,#8 + ext v6.16b,v2.16b,v0.16b,#8 + add v1.2d,v1.2d,v24.2d // "T1 + H + K512[i]" +.long 0xcec08230 //sha512su0 v16.16b,v17.16b + ext v7.16b,v20.16b,v21.16b,#8 +.long 0xce6680a1 //sha512h v1.16b,v5.16b,v6.16b +.long 0xce678af0 //sha512su1 v16.16b,v23.16b,v7.16b + add v3.2d,v2.2d,v1.2d // "D + T1" +.long 0xce648441 //sha512h2 v1.16b,v2.16b,v4.16b + add v25.2d,v25.2d,v17.2d + ld1 {v24.2d},[x3],#16 + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v3.16b,v0.16b,#8 + ext v6.16b,v4.16b,v3.16b,#8 + add v0.2d,v0.2d,v25.2d // "T1 + H + K512[i]" +.long 0xcec08251 //sha512su0 v17.16b,v18.16b + ext v7.16b,v21.16b,v22.16b,#8 +.long 0xce6680a0 //sha512h v0.16b,v5.16b,v6.16b +.long 0xce678a11 //sha512su1 v17.16b,v16.16b,v7.16b + add v2.2d,v4.2d,v0.2d // "D + T1" +.long 0xce618480 //sha512h2 v0.16b,v4.16b,v1.16b + add v24.2d,v24.2d,v18.2d + ld1 {v25.2d},[x3],#16 + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v2.16b,v3.16b,#8 + ext v6.16b,v1.16b,v2.16b,#8 + add v3.2d,v3.2d,v24.2d // "T1 + H + K512[i]" +.long 0xcec08272 //sha512su0 v18.16b,v19.16b + ext v7.16b,v22.16b,v23.16b,#8 +.long 0xce6680a3 //sha512h v3.16b,v5.16b,v6.16b +.long 0xce678a32 //sha512su1 v18.16b,v17.16b,v7.16b + add v4.2d,v1.2d,v3.2d // "D + T1" +.long 0xce608423 //sha512h2 v3.16b,v1.16b,v0.16b + add v25.2d,v25.2d,v19.2d + ld1 {v24.2d},[x3],#16 + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v4.16b,v2.16b,#8 + ext v6.16b,v0.16b,v4.16b,#8 + add v2.2d,v2.2d,v25.2d // "T1 + H + K512[i]" +.long 0xcec08293 //sha512su0 v19.16b,v20.16b + ext v7.16b,v23.16b,v16.16b,#8 +.long 0xce6680a2 //sha512h v2.16b,v5.16b,v6.16b +.long 0xce678a53 //sha512su1 v19.16b,v18.16b,v7.16b + add v1.2d,v0.2d,v2.2d // "D + T1" +.long 0xce638402 //sha512h2 v2.16b,v0.16b,v3.16b + add v24.2d,v24.2d,v20.2d + ld1 {v25.2d},[x3],#16 + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v1.16b,v4.16b,#8 + ext v6.16b,v3.16b,v1.16b,#8 + add v4.2d,v4.2d,v24.2d // "T1 + H + K512[i]" +.long 0xcec082b4 //sha512su0 v20.16b,v21.16b + ext v7.16b,v16.16b,v17.16b,#8 +.long 0xce6680a4 //sha512h v4.16b,v5.16b,v6.16b +.long 0xce678a74 //sha512su1 v20.16b,v19.16b,v7.16b + add v0.2d,v3.2d,v4.2d // "D + T1" +.long 0xce628464 //sha512h2 v4.16b,v3.16b,v2.16b + add v25.2d,v25.2d,v21.2d + ld1 {v24.2d},[x3],#16 + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v0.16b,v1.16b,#8 + ext v6.16b,v2.16b,v0.16b,#8 + add v1.2d,v1.2d,v25.2d // "T1 + H + K512[i]" +.long 0xcec082d5 //sha512su0 v21.16b,v22.16b + ext v7.16b,v17.16b,v18.16b,#8 +.long 0xce6680a1 //sha512h v1.16b,v5.16b,v6.16b +.long 0xce678a95 //sha512su1 v21.16b,v20.16b,v7.16b + add v3.2d,v2.2d,v1.2d // "D + T1" +.long 0xce648441 //sha512h2 v1.16b,v2.16b,v4.16b + add v24.2d,v24.2d,v22.2d + ld1 {v25.2d},[x3],#16 + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v3.16b,v0.16b,#8 + ext v6.16b,v4.16b,v3.16b,#8 + add v0.2d,v0.2d,v24.2d // "T1 + H + K512[i]" +.long 0xcec082f6 //sha512su0 v22.16b,v23.16b + ext v7.16b,v18.16b,v19.16b,#8 +.long 0xce6680a0 //sha512h v0.16b,v5.16b,v6.16b +.long 0xce678ab6 //sha512su1 v22.16b,v21.16b,v7.16b + add v2.2d,v4.2d,v0.2d // "D + T1" +.long 0xce618480 //sha512h2 v0.16b,v4.16b,v1.16b + add v25.2d,v25.2d,v23.2d + ld1 {v24.2d},[x3],#16 + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v2.16b,v3.16b,#8 + ext v6.16b,v1.16b,v2.16b,#8 + add v3.2d,v3.2d,v25.2d // "T1 + H + K512[i]" +.long 0xcec08217 //sha512su0 v23.16b,v16.16b + ext v7.16b,v19.16b,v20.16b,#8 +.long 0xce6680a3 //sha512h v3.16b,v5.16b,v6.16b +.long 0xce678ad7 //sha512su1 v23.16b,v22.16b,v7.16b + add v4.2d,v1.2d,v3.2d // "D + T1" +.long 0xce608423 //sha512h2 v3.16b,v1.16b,v0.16b + add v24.2d,v24.2d,v16.2d + ld1 {v25.2d},[x3],#16 + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v4.16b,v2.16b,#8 + ext v6.16b,v0.16b,v4.16b,#8 + add v2.2d,v2.2d,v24.2d // "T1 + H + K512[i]" +.long 0xcec08230 //sha512su0 v16.16b,v17.16b + ext v7.16b,v20.16b,v21.16b,#8 +.long 0xce6680a2 //sha512h v2.16b,v5.16b,v6.16b +.long 0xce678af0 //sha512su1 v16.16b,v23.16b,v7.16b + add v1.2d,v0.2d,v2.2d // "D + T1" +.long 0xce638402 //sha512h2 v2.16b,v0.16b,v3.16b + add v25.2d,v25.2d,v17.2d + ld1 {v24.2d},[x3],#16 + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v1.16b,v4.16b,#8 + ext v6.16b,v3.16b,v1.16b,#8 + add v4.2d,v4.2d,v25.2d // "T1 + H + K512[i]" +.long 0xcec08251 //sha512su0 v17.16b,v18.16b + ext v7.16b,v21.16b,v22.16b,#8 +.long 0xce6680a4 //sha512h v4.16b,v5.16b,v6.16b +.long 0xce678a11 //sha512su1 v17.16b,v16.16b,v7.16b + add v0.2d,v3.2d,v4.2d // "D + T1" +.long 0xce628464 //sha512h2 v4.16b,v3.16b,v2.16b + add v24.2d,v24.2d,v18.2d + ld1 {v25.2d},[x3],#16 + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v0.16b,v1.16b,#8 + ext v6.16b,v2.16b,v0.16b,#8 + add v1.2d,v1.2d,v24.2d // "T1 + H + K512[i]" +.long 0xcec08272 //sha512su0 v18.16b,v19.16b + ext v7.16b,v22.16b,v23.16b,#8 +.long 0xce6680a1 //sha512h v1.16b,v5.16b,v6.16b +.long 0xce678a32 //sha512su1 v18.16b,v17.16b,v7.16b + add v3.2d,v2.2d,v1.2d // "D + T1" +.long 0xce648441 //sha512h2 v1.16b,v2.16b,v4.16b + add v25.2d,v25.2d,v19.2d + ld1 {v24.2d},[x3],#16 + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v3.16b,v0.16b,#8 + ext v6.16b,v4.16b,v3.16b,#8 + add v0.2d,v0.2d,v25.2d // "T1 + H + K512[i]" +.long 0xcec08293 //sha512su0 v19.16b,v20.16b + ext v7.16b,v23.16b,v16.16b,#8 +.long 0xce6680a0 //sha512h v0.16b,v5.16b,v6.16b +.long 0xce678a53 //sha512su1 v19.16b,v18.16b,v7.16b + add v2.2d,v4.2d,v0.2d // "D + T1" +.long 0xce618480 //sha512h2 v0.16b,v4.16b,v1.16b + add v24.2d,v24.2d,v20.2d + ld1 {v25.2d},[x3],#16 + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v2.16b,v3.16b,#8 + ext v6.16b,v1.16b,v2.16b,#8 + add v3.2d,v3.2d,v24.2d // "T1 + H + K512[i]" +.long 0xcec082b4 //sha512su0 v20.16b,v21.16b + ext v7.16b,v16.16b,v17.16b,#8 +.long 0xce6680a3 //sha512h v3.16b,v5.16b,v6.16b +.long 0xce678a74 //sha512su1 v20.16b,v19.16b,v7.16b + add v4.2d,v1.2d,v3.2d // "D + T1" +.long 0xce608423 //sha512h2 v3.16b,v1.16b,v0.16b + add v25.2d,v25.2d,v21.2d + ld1 {v24.2d},[x3],#16 + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v4.16b,v2.16b,#8 + ext v6.16b,v0.16b,v4.16b,#8 + add v2.2d,v2.2d,v25.2d // "T1 + H + K512[i]" +.long 0xcec082d5 //sha512su0 v21.16b,v22.16b + ext v7.16b,v17.16b,v18.16b,#8 +.long 0xce6680a2 //sha512h v2.16b,v5.16b,v6.16b +.long 0xce678a95 //sha512su1 v21.16b,v20.16b,v7.16b + add v1.2d,v0.2d,v2.2d // "D + T1" +.long 0xce638402 //sha512h2 v2.16b,v0.16b,v3.16b + add v24.2d,v24.2d,v22.2d + ld1 {v25.2d},[x3],#16 + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v1.16b,v4.16b,#8 + ext v6.16b,v3.16b,v1.16b,#8 + add v4.2d,v4.2d,v24.2d // "T1 + H + K512[i]" +.long 0xcec082f6 //sha512su0 v22.16b,v23.16b + ext v7.16b,v18.16b,v19.16b,#8 +.long 0xce6680a4 //sha512h v4.16b,v5.16b,v6.16b +.long 0xce678ab6 //sha512su1 v22.16b,v21.16b,v7.16b + add v0.2d,v3.2d,v4.2d // "D + T1" +.long 0xce628464 //sha512h2 v4.16b,v3.16b,v2.16b + add v25.2d,v25.2d,v23.2d + ld1 {v24.2d},[x3],#16 + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v0.16b,v1.16b,#8 + ext v6.16b,v2.16b,v0.16b,#8 + add v1.2d,v1.2d,v25.2d // "T1 + H + K512[i]" +.long 0xcec08217 //sha512su0 v23.16b,v16.16b + ext v7.16b,v19.16b,v20.16b,#8 +.long 0xce6680a1 //sha512h v1.16b,v5.16b,v6.16b +.long 0xce678ad7 //sha512su1 v23.16b,v22.16b,v7.16b + add v3.2d,v2.2d,v1.2d // "D + T1" +.long 0xce648441 //sha512h2 v1.16b,v2.16b,v4.16b + add v24.2d,v24.2d,v16.2d + ld1 {v25.2d},[x3],#16 + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v3.16b,v0.16b,#8 + ext v6.16b,v4.16b,v3.16b,#8 + add v0.2d,v0.2d,v24.2d // "T1 + H + K512[i]" +.long 0xcec08230 //sha512su0 v16.16b,v17.16b + ext v7.16b,v20.16b,v21.16b,#8 +.long 0xce6680a0 //sha512h v0.16b,v5.16b,v6.16b +.long 0xce678af0 //sha512su1 v16.16b,v23.16b,v7.16b + add v2.2d,v4.2d,v0.2d // "D + T1" +.long 0xce618480 //sha512h2 v0.16b,v4.16b,v1.16b + add v25.2d,v25.2d,v17.2d + ld1 {v24.2d},[x3],#16 + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v2.16b,v3.16b,#8 + ext v6.16b,v1.16b,v2.16b,#8 + add v3.2d,v3.2d,v25.2d // "T1 + H + K512[i]" +.long 0xcec08251 //sha512su0 v17.16b,v18.16b + ext v7.16b,v21.16b,v22.16b,#8 +.long 0xce6680a3 //sha512h v3.16b,v5.16b,v6.16b +.long 0xce678a11 //sha512su1 v17.16b,v16.16b,v7.16b + add v4.2d,v1.2d,v3.2d // "D + T1" +.long 0xce608423 //sha512h2 v3.16b,v1.16b,v0.16b + add v24.2d,v24.2d,v18.2d + ld1 {v25.2d},[x3],#16 + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v4.16b,v2.16b,#8 + ext v6.16b,v0.16b,v4.16b,#8 + add v2.2d,v2.2d,v24.2d // "T1 + H + K512[i]" +.long 0xcec08272 //sha512su0 v18.16b,v19.16b + ext v7.16b,v22.16b,v23.16b,#8 +.long 0xce6680a2 //sha512h v2.16b,v5.16b,v6.16b +.long 0xce678a32 //sha512su1 v18.16b,v17.16b,v7.16b + add v1.2d,v0.2d,v2.2d // "D + T1" +.long 0xce638402 //sha512h2 v2.16b,v0.16b,v3.16b + add v25.2d,v25.2d,v19.2d + ld1 {v24.2d},[x3],#16 + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v1.16b,v4.16b,#8 + ext v6.16b,v3.16b,v1.16b,#8 + add v4.2d,v4.2d,v25.2d // "T1 + H + K512[i]" +.long 0xcec08293 //sha512su0 v19.16b,v20.16b + ext v7.16b,v23.16b,v16.16b,#8 +.long 0xce6680a4 //sha512h v4.16b,v5.16b,v6.16b +.long 0xce678a53 //sha512su1 v19.16b,v18.16b,v7.16b + add v0.2d,v3.2d,v4.2d // "D + T1" +.long 0xce628464 //sha512h2 v4.16b,v3.16b,v2.16b + add v24.2d,v24.2d,v20.2d + ld1 {v25.2d},[x3],#16 + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v0.16b,v1.16b,#8 + ext v6.16b,v2.16b,v0.16b,#8 + add v1.2d,v1.2d,v24.2d // "T1 + H + K512[i]" +.long 0xcec082b4 //sha512su0 v20.16b,v21.16b + ext v7.16b,v16.16b,v17.16b,#8 +.long 0xce6680a1 //sha512h v1.16b,v5.16b,v6.16b +.long 0xce678a74 //sha512su1 v20.16b,v19.16b,v7.16b + add v3.2d,v2.2d,v1.2d // "D + T1" +.long 0xce648441 //sha512h2 v1.16b,v2.16b,v4.16b + add v25.2d,v25.2d,v21.2d + ld1 {v24.2d},[x3],#16 + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v3.16b,v0.16b,#8 + ext v6.16b,v4.16b,v3.16b,#8 + add v0.2d,v0.2d,v25.2d // "T1 + H + K512[i]" +.long 0xcec082d5 //sha512su0 v21.16b,v22.16b + ext v7.16b,v17.16b,v18.16b,#8 +.long 0xce6680a0 //sha512h v0.16b,v5.16b,v6.16b +.long 0xce678a95 //sha512su1 v21.16b,v20.16b,v7.16b + add v2.2d,v4.2d,v0.2d // "D + T1" +.long 0xce618480 //sha512h2 v0.16b,v4.16b,v1.16b + add v24.2d,v24.2d,v22.2d + ld1 {v25.2d},[x3],#16 + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v2.16b,v3.16b,#8 + ext v6.16b,v1.16b,v2.16b,#8 + add v3.2d,v3.2d,v24.2d // "T1 + H + K512[i]" +.long 0xcec082f6 //sha512su0 v22.16b,v23.16b + ext v7.16b,v18.16b,v19.16b,#8 +.long 0xce6680a3 //sha512h v3.16b,v5.16b,v6.16b +.long 0xce678ab6 //sha512su1 v22.16b,v21.16b,v7.16b + add v4.2d,v1.2d,v3.2d // "D + T1" +.long 0xce608423 //sha512h2 v3.16b,v1.16b,v0.16b + add v25.2d,v25.2d,v23.2d + ld1 {v24.2d},[x3],#16 + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v4.16b,v2.16b,#8 + ext v6.16b,v0.16b,v4.16b,#8 + add v2.2d,v2.2d,v25.2d // "T1 + H + K512[i]" +.long 0xcec08217 //sha512su0 v23.16b,v16.16b + ext v7.16b,v19.16b,v20.16b,#8 +.long 0xce6680a2 //sha512h v2.16b,v5.16b,v6.16b +.long 0xce678ad7 //sha512su1 v23.16b,v22.16b,v7.16b + add v1.2d,v0.2d,v2.2d // "D + T1" +.long 0xce638402 //sha512h2 v2.16b,v0.16b,v3.16b + ld1 {v25.2d},[x3],#16 + add v24.2d,v24.2d,v16.2d + ld1 {v16.16b},[x1],#16 // load next input + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v1.16b,v4.16b,#8 + ext v6.16b,v3.16b,v1.16b,#8 + add v4.2d,v4.2d,v24.2d // "T1 + H + K512[i]" +.long 0xce6680a4 //sha512h v4.16b,v5.16b,v6.16b + rev64 v16.16b,v16.16b + add v0.2d,v3.2d,v4.2d // "D + T1" +.long 0xce628464 //sha512h2 v4.16b,v3.16b,v2.16b + ld1 {v24.2d},[x3],#16 + add v25.2d,v25.2d,v17.2d + ld1 {v17.16b},[x1],#16 // load next input + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v0.16b,v1.16b,#8 + ext v6.16b,v2.16b,v0.16b,#8 + add v1.2d,v1.2d,v25.2d // "T1 + H + K512[i]" +.long 0xce6680a1 //sha512h v1.16b,v5.16b,v6.16b + rev64 v17.16b,v17.16b + add v3.2d,v2.2d,v1.2d // "D + T1" +.long 0xce648441 //sha512h2 v1.16b,v2.16b,v4.16b + ld1 {v25.2d},[x3],#16 + add v24.2d,v24.2d,v18.2d + ld1 {v18.16b},[x1],#16 // load next input + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v3.16b,v0.16b,#8 + ext v6.16b,v4.16b,v3.16b,#8 + add v0.2d,v0.2d,v24.2d // "T1 + H + K512[i]" +.long 0xce6680a0 //sha512h v0.16b,v5.16b,v6.16b + rev64 v18.16b,v18.16b + add v2.2d,v4.2d,v0.2d // "D + T1" +.long 0xce618480 //sha512h2 v0.16b,v4.16b,v1.16b + ld1 {v24.2d},[x3],#16 + add v25.2d,v25.2d,v19.2d + ld1 {v19.16b},[x1],#16 // load next input + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v2.16b,v3.16b,#8 + ext v6.16b,v1.16b,v2.16b,#8 + add v3.2d,v3.2d,v25.2d // "T1 + H + K512[i]" +.long 0xce6680a3 //sha512h v3.16b,v5.16b,v6.16b + rev64 v19.16b,v19.16b + add v4.2d,v1.2d,v3.2d // "D + T1" +.long 0xce608423 //sha512h2 v3.16b,v1.16b,v0.16b + ld1 {v25.2d},[x3],#16 + add v24.2d,v24.2d,v20.2d + ld1 {v20.16b},[x1],#16 // load next input + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v4.16b,v2.16b,#8 + ext v6.16b,v0.16b,v4.16b,#8 + add v2.2d,v2.2d,v24.2d // "T1 + H + K512[i]" +.long 0xce6680a2 //sha512h v2.16b,v5.16b,v6.16b + rev64 v20.16b,v20.16b + add v1.2d,v0.2d,v2.2d // "D + T1" +.long 0xce638402 //sha512h2 v2.16b,v0.16b,v3.16b + ld1 {v24.2d},[x3],#16 + add v25.2d,v25.2d,v21.2d + ld1 {v21.16b},[x1],#16 // load next input + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v1.16b,v4.16b,#8 + ext v6.16b,v3.16b,v1.16b,#8 + add v4.2d,v4.2d,v25.2d // "T1 + H + K512[i]" +.long 0xce6680a4 //sha512h v4.16b,v5.16b,v6.16b + rev64 v21.16b,v21.16b + add v0.2d,v3.2d,v4.2d // "D + T1" +.long 0xce628464 //sha512h2 v4.16b,v3.16b,v2.16b + ld1 {v25.2d},[x3],#16 + add v24.2d,v24.2d,v22.2d + ld1 {v22.16b},[x1],#16 // load next input + ext v24.16b,v24.16b,v24.16b,#8 + ext v5.16b,v0.16b,v1.16b,#8 + ext v6.16b,v2.16b,v0.16b,#8 + add v1.2d,v1.2d,v24.2d // "T1 + H + K512[i]" +.long 0xce6680a1 //sha512h v1.16b,v5.16b,v6.16b + rev64 v22.16b,v22.16b + add v3.2d,v2.2d,v1.2d // "D + T1" +.long 0xce648441 //sha512h2 v1.16b,v2.16b,v4.16b + sub x3,x3,#80*8 // rewind + add v25.2d,v25.2d,v23.2d + ld1 {v23.16b},[x1],#16 // load next input + ext v25.16b,v25.16b,v25.16b,#8 + ext v5.16b,v3.16b,v0.16b,#8 + ext v6.16b,v4.16b,v3.16b,#8 + add v0.2d,v0.2d,v25.2d // "T1 + H + K512[i]" +.long 0xce6680a0 //sha512h v0.16b,v5.16b,v6.16b + rev64 v23.16b,v23.16b + add v2.2d,v4.2d,v0.2d // "D + T1" +.long 0xce618480 //sha512h2 v0.16b,v4.16b,v1.16b + add v0.2d,v0.2d,v26.2d // accumulate + add v1.2d,v1.2d,v27.2d + add v2.2d,v2.2d,v28.2d + add v3.2d,v3.2d,v29.2d + + cbnz x2,Loop_hw + + st1 {v0.2d,v1.2d,v2.2d,v3.2d},[x0] // store context + + ldr x29,[sp],#16 + ret + +#endif diff --git a/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sm3/sm3-armv8.S b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sm3/sm3-armv8.S new file mode 100644 index 000000000000..132517db60cc --- /dev/null +++ b/CryptoPkg/Library/OpensslLib/OpensslGen/AARCH64-PE/crypto/sm3/sm3-armv8.S @@ -0,0 +1,507 @@ +// Copyright 2021-2025 The OpenSSL Project Authors. All Rights Reserved. +// +// Licensed under the Apache License 2.0 (the "License"). You may not use +// this file except in compliance with the License. You can obtain a copy +// in the file LICENSE in the source distribution or at +// https://www.openssl.org/source/license.html +// +// This module implements support for Armv8 SM3 instructions + +// $output is the last argument if it looks like a file (it has an extension) +// $flavour is the first argument if it doesn't look like a file +#include "arm_arch.h" +.text +.globl ossl_hwsm3_block_data_order +.def ossl_hwsm3_block_data_order + .type 32 +.endef +.align 5 +ossl_hwsm3_block_data_order: + AARCH64_VALID_CALL_TARGET + // load state + ld1 {v5.4s,v6.4s}, [x0] + rev64 v5.4s, v5.4s + rev64 v6.4s, v6.4s + ext v5.16b, v5.16b, v5.16b, #8 + ext v6.16b, v6.16b, v6.16b, #8 + adr x8, .Tj + ldp s16, s17, [x8] + +Loop: + // load input + ld1 {v0.4s,v1.4s,v2.4s,v3.4s}, [x1], #64 + sub w2, w2, #1 + + mov v18.16b, v5.16b + mov v19.16b, v6.16b + +#ifndef __AARCH64EB__ + rev32 v0.16b, v0.16b + rev32 v1.16b, v1.16b + rev32 v2.16b, v2.16b + rev32 v3.16b, v3.16b +#endif + + ext v20.16b, v16.16b, v16.16b, #4 + // s4 = w7 | w8 | w9 | w10 + ext v4.16b, v1.16b, v2.16b, #12 + // vtmp1 = w3 | w4 | w5 | w6 + ext v22.16b, v0.16b, v1.16b, #12 + // vtmp2 = w10 | w11 | w12 | w13 + ext v23.16b, v2.16b, v3.16b, #8 +.long 0xce63c004 //sm3partw1 v4.4s, v0.4s, v3.4s +.long 0xce76c6e4 //sm3partw2 v4.4s, v23.4s, v22.4s + eor v22.16b, v0.16b, v1.16b +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce5682e5 //sm3tt1a v5.4s, v23.4s, v22.4s[0] +.long 0xce408ae6 //sm3tt2a v6.4s, v23.4s, v0.4s[0] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce5692e5 //sm3tt1a v5.4s, v23.4s, v22.4s[1] +.long 0xce409ae6 //sm3tt2a v6.4s, v23.4s, v0.4s[1] +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce56a2e5 //sm3tt1a v5.4s, v23.4s, v22.4s[2] +.long 0xce40aae6 //sm3tt2a v6.4s, v23.4s, v0.4s[2] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce56b2e5 //sm3tt1a v5.4s, v23.4s, v22.4s[3] +.long 0xce40bae6 //sm3tt2a v6.4s, v23.4s, v0.4s[3] + // s4 = w7 | w8 | w9 | w10 + ext v0.16b, v2.16b, v3.16b, #12 + // vtmp1 = w3 | w4 | w5 | w6 + ext v22.16b, v1.16b, v2.16b, #12 + // vtmp2 = w10 | w11 | w12 | w13 + ext v23.16b, v3.16b, v4.16b, #8 +.long 0xce64c020 //sm3partw1 v0.4s, v1.4s, v4.4s +.long 0xce76c6e0 //sm3partw2 v0.4s, v23.4s, v22.4s + eor v22.16b, v1.16b, v2.16b +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce5682e5 //sm3tt1a v5.4s, v23.4s, v22.4s[0] +.long 0xce418ae6 //sm3tt2a v6.4s, v23.4s, v1.4s[0] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce5692e5 //sm3tt1a v5.4s, v23.4s, v22.4s[1] +.long 0xce419ae6 //sm3tt2a v6.4s, v23.4s, v1.4s[1] +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce56a2e5 //sm3tt1a v5.4s, v23.4s, v22.4s[2] +.long 0xce41aae6 //sm3tt2a v6.4s, v23.4s, v1.4s[2] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce56b2e5 //sm3tt1a v5.4s, v23.4s, v22.4s[3] +.long 0xce41bae6 //sm3tt2a v6.4s, v23.4s, v1.4s[3] + // s4 = w7 | w8 | w9 | w10 + ext v1.16b, v3.16b, v4.16b, #12 + // vtmp1 = w3 | w4 | w5 | w6 + ext v22.16b, v2.16b, v3.16b, #12 + // vtmp2 = w10 | w11 | w12 | w13 + ext v23.16b, v4.16b, v0.16b, #8 +.long 0xce60c041 //sm3partw1 v1.4s, v2.4s, v0.4s +.long 0xce76c6e1 //sm3partw2 v1.4s, v23.4s, v22.4s + eor v22.16b, v2.16b, v3.16b +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce5682e5 //sm3tt1a v5.4s, v23.4s, v22.4s[0] +.long 0xce428ae6 //sm3tt2a v6.4s, v23.4s, v2.4s[0] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce5692e5 //sm3tt1a v5.4s, v23.4s, v22.4s[1] +.long 0xce429ae6 //sm3tt2a v6.4s, v23.4s, v2.4s[1] +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce56a2e5 //sm3tt1a v5.4s, v23.4s, v22.4s[2] +.long 0xce42aae6 //sm3tt2a v6.4s, v23.4s, v2.4s[2] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce56b2e5 //sm3tt1a v5.4s, v23.4s, v22.4s[3] +.long 0xce42bae6 //sm3tt2a v6.4s, v23.4s, v2.4s[3] + // s4 = w7 | w8 | w9 | w10 + ext v2.16b, v4.16b, v0.16b, #12 + // vtmp1 = w3 | w4 | w5 | w6 + ext v22.16b, v3.16b, v4.16b, #12 + // vtmp2 = w10 | w11 | w12 | w13 + ext v23.16b, v0.16b, v1.16b, #8 +.long 0xce61c062 //sm3partw1 v2.4s, v3.4s, v1.4s +.long 0xce76c6e2 //sm3partw2 v2.4s, v23.4s, v22.4s + eor v22.16b, v3.16b, v4.16b +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce5682e5 //sm3tt1a v5.4s, v23.4s, v22.4s[0] +.long 0xce438ae6 //sm3tt2a v6.4s, v23.4s, v3.4s[0] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce5692e5 //sm3tt1a v5.4s, v23.4s, v22.4s[1] +.long 0xce439ae6 //sm3tt2a v6.4s, v23.4s, v3.4s[1] +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce56a2e5 //sm3tt1a v5.4s, v23.4s, v22.4s[2] +.long 0xce43aae6 //sm3tt2a v6.4s, v23.4s, v3.4s[2] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce56b2e5 //sm3tt1a v5.4s, v23.4s, v22.4s[3] +.long 0xce43bae6 //sm3tt2a v6.4s, v23.4s, v3.4s[3] + ext v20.16b, v17.16b, v17.16b, #4 + // s4 = w7 | w8 | w9 | w10 + ext v3.16b, v0.16b, v1.16b, #12 + // vtmp1 = w3 | w4 | w5 | w6 + ext v22.16b, v4.16b, v0.16b, #12 + // vtmp2 = w10 | w11 | w12 | w13 + ext v23.16b, v1.16b, v2.16b, #8 +.long 0xce62c083 //sm3partw1 v3.4s, v4.4s, v2.4s +.long 0xce76c6e3 //sm3partw2 v3.4s, v23.4s, v22.4s + eor v22.16b, v4.16b, v0.16b +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce5686e5 //sm3tt1b v5.4s, v23.4s, v22.4s[0] +.long 0xce448ee6 //sm3tt2b v6.4s, v23.4s, v4.4s[0] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce5696e5 //sm3tt1b v5.4s, v23.4s, v22.4s[1] +.long 0xce449ee6 //sm3tt2b v6.4s, v23.4s, v4.4s[1] +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce56a6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[2] +.long 0xce44aee6 //sm3tt2b v6.4s, v23.4s, v4.4s[2] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce56b6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[3] +.long 0xce44bee6 //sm3tt2b v6.4s, v23.4s, v4.4s[3] + // s4 = w7 | w8 | w9 | w10 + ext v4.16b, v1.16b, v2.16b, #12 + // vtmp1 = w3 | w4 | w5 | w6 + ext v22.16b, v0.16b, v1.16b, #12 + // vtmp2 = w10 | w11 | w12 | w13 + ext v23.16b, v2.16b, v3.16b, #8 +.long 0xce63c004 //sm3partw1 v4.4s, v0.4s, v3.4s +.long 0xce76c6e4 //sm3partw2 v4.4s, v23.4s, v22.4s + eor v22.16b, v0.16b, v1.16b +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce5686e5 //sm3tt1b v5.4s, v23.4s, v22.4s[0] +.long 0xce408ee6 //sm3tt2b v6.4s, v23.4s, v0.4s[0] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce5696e5 //sm3tt1b v5.4s, v23.4s, v22.4s[1] +.long 0xce409ee6 //sm3tt2b v6.4s, v23.4s, v0.4s[1] +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce56a6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[2] +.long 0xce40aee6 //sm3tt2b v6.4s, v23.4s, v0.4s[2] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce56b6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[3] +.long 0xce40bee6 //sm3tt2b v6.4s, v23.4s, v0.4s[3] + // s4 = w7 | w8 | w9 | w10 + ext v0.16b, v2.16b, v3.16b, #12 + // vtmp1 = w3 | w4 | w5 | w6 + ext v22.16b, v1.16b, v2.16b, #12 + // vtmp2 = w10 | w11 | w12 | w13 + ext v23.16b, v3.16b, v4.16b, #8 +.long 0xce64c020 //sm3partw1 v0.4s, v1.4s, v4.4s +.long 0xce76c6e0 //sm3partw2 v0.4s, v23.4s, v22.4s + eor v22.16b, v1.16b, v2.16b +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce5686e5 //sm3tt1b v5.4s, v23.4s, v22.4s[0] +.long 0xce418ee6 //sm3tt2b v6.4s, v23.4s, v1.4s[0] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce5696e5 //sm3tt1b v5.4s, v23.4s, v22.4s[1] +.long 0xce419ee6 //sm3tt2b v6.4s, v23.4s, v1.4s[1] +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce56a6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[2] +.long 0xce41aee6 //sm3tt2b v6.4s, v23.4s, v1.4s[2] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce56b6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[3] +.long 0xce41bee6 //sm3tt2b v6.4s, v23.4s, v1.4s[3] + // s4 = w7 | w8 | w9 | w10 + ext v1.16b, v3.16b, v4.16b, #12 + // vtmp1 = w3 | w4 | w5 | w6 + ext v22.16b, v2.16b, v3.16b, #12 + // vtmp2 = w10 | w11 | w12 | w13 + ext v23.16b, v4.16b, v0.16b, #8 +.long 0xce60c041 //sm3partw1 v1.4s, v2.4s, v0.4s +.long 0xce76c6e1 //sm3partw2 v1.4s, v23.4s, v22.4s + eor v22.16b, v2.16b, v3.16b +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce5686e5 //sm3tt1b v5.4s, v23.4s, v22.4s[0] +.long 0xce428ee6 //sm3tt2b v6.4s, v23.4s, v2.4s[0] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce5696e5 //sm3tt1b v5.4s, v23.4s, v22.4s[1] +.long 0xce429ee6 //sm3tt2b v6.4s, v23.4s, v2.4s[1] +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce56a6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[2] +.long 0xce42aee6 //sm3tt2b v6.4s, v23.4s, v2.4s[2] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce56b6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[3] +.long 0xce42bee6 //sm3tt2b v6.4s, v23.4s, v2.4s[3] + // s4 = w7 | w8 | w9 | w10 + ext v2.16b, v4.16b, v0.16b, #12 + // vtmp1 = w3 | w4 | w5 | w6 + ext v22.16b, v3.16b, v4.16b, #12 + // vtmp2 = w10 | w11 | w12 | w13 + ext v23.16b, v0.16b, v1.16b, #8 +.long 0xce61c062 //sm3partw1 v2.4s, v3.4s, v1.4s +.long 0xce76c6e2 //sm3partw2 v2.4s, v23.4s, v22.4s + eor v22.16b, v3.16b, v4.16b +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce5686e5 //sm3tt1b v5.4s, v23.4s, v22.4s[0] +.long 0xce438ee6 //sm3tt2b v6.4s, v23.4s, v3.4s[0] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce5696e5 //sm3tt1b v5.4s, v23.4s, v22.4s[1] +.long 0xce439ee6 //sm3tt2b v6.4s, v23.4s, v3.4s[1] +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce56a6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[2] +.long 0xce43aee6 //sm3tt2b v6.4s, v23.4s, v3.4s[2] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce56b6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[3] +.long 0xce43bee6 //sm3tt2b v6.4s, v23.4s, v3.4s[3] + // s4 = w7 | w8 | w9 | w10 + ext v3.16b, v0.16b, v1.16b, #12 + // vtmp1 = w3 | w4 | w5 | w6 + ext v22.16b, v4.16b, v0.16b, #12 + // vtmp2 = w10 | w11 | w12 | w13 + ext v23.16b, v1.16b, v2.16b, #8 +.long 0xce62c083 //sm3partw1 v3.4s, v4.4s, v2.4s +.long 0xce76c6e3 //sm3partw2 v3.4s, v23.4s, v22.4s + eor v22.16b, v4.16b, v0.16b +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce5686e5 //sm3tt1b v5.4s, v23.4s, v22.4s[0] +.long 0xce448ee6 //sm3tt2b v6.4s, v23.4s, v4.4s[0] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce5696e5 //sm3tt1b v5.4s, v23.4s, v22.4s[1] +.long 0xce449ee6 //sm3tt2b v6.4s, v23.4s, v4.4s[1] +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce56a6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[2] +.long 0xce44aee6 //sm3tt2b v6.4s, v23.4s, v4.4s[2] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce56b6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[3] +.long 0xce44bee6 //sm3tt2b v6.4s, v23.4s, v4.4s[3] + // s4 = w7 | w8 | w9 | w10 + ext v4.16b, v1.16b, v2.16b, #12 + // vtmp1 = w3 | w4 | w5 | w6 + ext v22.16b, v0.16b, v1.16b, #12 + // vtmp2 = w10 | w11 | w12 | w13 + ext v23.16b, v2.16b, v3.16b, #8 +.long 0xce63c004 //sm3partw1 v4.4s, v0.4s, v3.4s +.long 0xce76c6e4 //sm3partw2 v4.4s, v23.4s, v22.4s + eor v22.16b, v0.16b, v1.16b +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce5686e5 //sm3tt1b v5.4s, v23.4s, v22.4s[0] +.long 0xce408ee6 //sm3tt2b v6.4s, v23.4s, v0.4s[0] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce5696e5 //sm3tt1b v5.4s, v23.4s, v22.4s[1] +.long 0xce409ee6 //sm3tt2b v6.4s, v23.4s, v0.4s[1] +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce56a6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[2] +.long 0xce40aee6 //sm3tt2b v6.4s, v23.4s, v0.4s[2] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce56b6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[3] +.long 0xce40bee6 //sm3tt2b v6.4s, v23.4s, v0.4s[3] + // s4 = w7 | w8 | w9 | w10 + ext v0.16b, v2.16b, v3.16b, #12 + // vtmp1 = w3 | w4 | w5 | w6 + ext v22.16b, v1.16b, v2.16b, #12 + // vtmp2 = w10 | w11 | w12 | w13 + ext v23.16b, v3.16b, v4.16b, #8 +.long 0xce64c020 //sm3partw1 v0.4s, v1.4s, v4.4s +.long 0xce76c6e0 //sm3partw2 v0.4s, v23.4s, v22.4s + eor v22.16b, v1.16b, v2.16b +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce5686e5 //sm3tt1b v5.4s, v23.4s, v22.4s[0] +.long 0xce418ee6 //sm3tt2b v6.4s, v23.4s, v1.4s[0] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce5696e5 //sm3tt1b v5.4s, v23.4s, v22.4s[1] +.long 0xce419ee6 //sm3tt2b v6.4s, v23.4s, v1.4s[1] +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce56a6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[2] +.long 0xce41aee6 //sm3tt2b v6.4s, v23.4s, v1.4s[2] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce56b6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[3] +.long 0xce41bee6 //sm3tt2b v6.4s, v23.4s, v1.4s[3] + // s4 = w7 | w8 | w9 | w10 + ext v1.16b, v3.16b, v4.16b, #12 + // vtmp1 = w3 | w4 | w5 | w6 + ext v22.16b, v2.16b, v3.16b, #12 + // vtmp2 = w10 | w11 | w12 | w13 + ext v23.16b, v4.16b, v0.16b, #8 +.long 0xce60c041 //sm3partw1 v1.4s, v2.4s, v0.4s +.long 0xce76c6e1 //sm3partw2 v1.4s, v23.4s, v22.4s + eor v22.16b, v2.16b, v3.16b +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce5686e5 //sm3tt1b v5.4s, v23.4s, v22.4s[0] +.long 0xce428ee6 //sm3tt2b v6.4s, v23.4s, v2.4s[0] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce5696e5 //sm3tt1b v5.4s, v23.4s, v22.4s[1] +.long 0xce429ee6 //sm3tt2b v6.4s, v23.4s, v2.4s[1] +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce56a6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[2] +.long 0xce42aee6 //sm3tt2b v6.4s, v23.4s, v2.4s[2] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce56b6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[3] +.long 0xce42bee6 //sm3tt2b v6.4s, v23.4s, v2.4s[3] + eor v22.16b, v3.16b, v4.16b +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce5686e5 //sm3tt1b v5.4s, v23.4s, v22.4s[0] +.long 0xce438ee6 //sm3tt2b v6.4s, v23.4s, v3.4s[0] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce5696e5 //sm3tt1b v5.4s, v23.4s, v22.4s[1] +.long 0xce439ee6 //sm3tt2b v6.4s, v23.4s, v3.4s[1] +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce56a6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[2] +.long 0xce43aee6 //sm3tt2b v6.4s, v23.4s, v3.4s[2] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce56b6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[3] +.long 0xce43bee6 //sm3tt2b v6.4s, v23.4s, v3.4s[3] + eor v22.16b, v4.16b, v0.16b +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce5686e5 //sm3tt1b v5.4s, v23.4s, v22.4s[0] +.long 0xce448ee6 //sm3tt2b v6.4s, v23.4s, v4.4s[0] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce5696e5 //sm3tt1b v5.4s, v23.4s, v22.4s[1] +.long 0xce449ee6 //sm3tt2b v6.4s, v23.4s, v4.4s[1] +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce56a6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[2] +.long 0xce44aee6 //sm3tt2b v6.4s, v23.4s, v4.4s[2] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce56b6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[3] +.long 0xce44bee6 //sm3tt2b v6.4s, v23.4s, v4.4s[3] + eor v22.16b, v0.16b, v1.16b +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce5686e5 //sm3tt1b v5.4s, v23.4s, v22.4s[0] +.long 0xce408ee6 //sm3tt2b v6.4s, v23.4s, v0.4s[0] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce5696e5 //sm3tt1b v5.4s, v23.4s, v22.4s[1] +.long 0xce409ee6 //sm3tt2b v6.4s, v23.4s, v0.4s[1] +.long 0xce5418b7 //sm3ss1 v23.4s, v5.4s, v20.4s, v6.4s + shl v21.4s, v20.4s, #1 + sri v21.4s, v20.4s, #31 +.long 0xce56a6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[2] +.long 0xce40aee6 //sm3tt2b v6.4s, v23.4s, v0.4s[2] +.long 0xce5518b7 //sm3ss1 v23.4s, v5.4s, v21.4s, v6.4s + shl v20.4s, v21.4s, #1 + sri v20.4s, v21.4s, #31 +.long 0xce56b6e5 //sm3tt1b v5.4s, v23.4s, v22.4s[3] +.long 0xce40bee6 //sm3tt2b v6.4s, v23.4s, v0.4s[3] + eor v5.16b, v5.16b, v18.16b + eor v6.16b, v6.16b, v19.16b + + // any remained blocks? + cbnz w2, Loop + + // save state + rev64 v5.4s, v5.4s + rev64 v6.4s, v6.4s + ext v5.16b, v5.16b, v5.16b, #8 + ext v6.16b, v6.16b, v6.16b, #8 + st1 {v5.4s,v6.4s}, [x0] + ret + + + +.align 3 +_sm3_consts: +.Tj: +.word 0x79cc4519, 0x9d8a7a87 + diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf index a348377dab97..53f231825532 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibAccel.inf @@ -2159,19 +2159,32 @@ $(OPENSSL_PATH)/ssl/statem/statem_clnt.c $(OPENSSL_PATH)/ssl/statem/statem_dtls.c $(OPENSSL_PATH)/ssl/statem/statem_lib.c - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/aes/aesv8-armx.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/aes/bsaes-armv8.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/aes/vpaes-armv8.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/arm64cpuid.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/md5/md5-aarch64.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/modes/aes-gcm-armv8-unroll8_64.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/modes/aes-gcm-armv8_64.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/modes/ghashv8-armx.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/sha/keccak1600-armv8.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/sha/sha1-armv8.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/sha/sha256-armv8.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/sha/sha512-armv8.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/sm3/sm3-armv8.S | GCC + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/aes/aesv8-armx.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/aes/bsaes-armv8.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/aes/vpaes-armv8.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/arm64cpuid.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/md5/md5-aarch64.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/modes/aes-gcm-armv8-unroll8_64.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/modes/aes-gcm-armv8_64.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/modes/ghashv8-armx.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/sha/keccak1600-armv8.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/sha/sha1-armv8.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/sha/sha256-armv8.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/sha/sha512-armv8.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/sm3/sm3-armv8.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/aes/aesv8-armx.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/aes/bsaes-armv8.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/aes/vpaes-armv8.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/arm64cpuid.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/md5/md5-aarch64.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/modes/aes-gcm-armv8-unroll8_64.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/modes/aes-gcm-armv8_64.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/modes/ghashv8-armx.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/sha/keccak1600-armv8.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/sha/sha1-armv8.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/sha/sha256-armv8.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/sha/sha512-armv8.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/sm3/sm3-armv8.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe # Autogenerated files list ends here [Packages] @@ -2186,6 +2199,9 @@ [FeaturePcd.IA32, FeaturePcd.X64] gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm +[FeaturePcd.AARCH64] + gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + [BuildOptions] # # Disables the following Visual Studio compiler warnings brought by openssl source, diff --git a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf index 91b5dd6c29df..7bb38d208b08 100644 --- a/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf +++ b/CryptoPkg/Library/OpensslLib/OpensslLibFullAccel.inf @@ -2320,19 +2320,32 @@ $(OPENSSL_PATH)/ssl/statem/statem_clnt.c $(OPENSSL_PATH)/ssl/statem/statem_dtls.c $(OPENSSL_PATH)/ssl/statem/statem_lib.c - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/aes/aesv8-armx.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/aes/bsaes-armv8.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/aes/vpaes-armv8.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/arm64cpuid.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/md5/md5-aarch64.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/modes/aes-gcm-armv8-unroll8_64.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/modes/aes-gcm-armv8_64.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/modes/ghashv8-armx.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/sha/keccak1600-armv8.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/sha/sha1-armv8.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/sha/sha256-armv8.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/sha/sha512-armv8.S | GCC - $(OPENSSL_GEN_PATH)/AARCH64-GCC/crypto/sm3/sm3-armv8.S | GCC + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/aes/aesv8-armx.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/aes/bsaes-armv8.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/aes/vpaes-armv8.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/arm64cpuid.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/md5/md5-aarch64.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/modes/aes-gcm-armv8-unroll8_64.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/modes/aes-gcm-armv8_64.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/modes/ghashv8-armx.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/sha/keccak1600-armv8.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/sha/sha1-armv8.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/sha/sha256-armv8.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/sha/sha512-armv8.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-ELF/crypto/sm3/sm3-armv8.S ||||!gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/aes/aesv8-armx.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/aes/bsaes-armv8.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/aes/vpaes-armv8.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/arm64cpuid.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/md5/md5-aarch64.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/modes/aes-gcm-armv8-unroll8_64.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/modes/aes-gcm-armv8_64.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/modes/ghashv8-armx.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/sha/keccak1600-armv8.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/sha/sha1-armv8.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/sha/sha256-armv8.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/sha/sha512-armv8.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + $(OPENSSL_GEN_PATH)/AARCH64-PE/crypto/sm3/sm3-armv8.S ||||gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe # Autogenerated files list ends here [Packages] @@ -2347,6 +2360,9 @@ [FeaturePcd.IA32, FeaturePcd.X64] gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm +[FeaturePcd.AARCH64] + gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe + [BuildOptions] # # Disables the following Visual Studio compiler warnings brought by openssl source, diff --git a/CryptoPkg/Library/OpensslLib/UefiAsm.conf b/CryptoPkg/Library/OpensslLib/UefiAsm.conf index 98a8eb01ac90..32f65a53d9da 100644 --- a/CryptoPkg/Library/OpensslLib/UefiAsm.conf +++ b/CryptoPkg/Library/OpensslLib/UefiAsm.conf @@ -29,9 +29,14 @@ my %targets = ( perlasm_scheme => "elf", asm_arch => "x86_64", }, - "UEFI-AARCH64-GCC" => { + "UEFI-AARCH64-ELF" => { inherit_from => [ "UEFI" ], asm_arch => "aarch64", perlasm_scheme => "linux64-aarch64", }, + "UEFI-AARCH64-PE" => { + inherit_from => [ "UEFI" ], + asm_arch => "aarch64", + perlasm_scheme => "win64-aarch64", + }, ); diff --git a/CryptoPkg/Library/OpensslLib/configure.py b/CryptoPkg/Library/OpensslLib/configure.py index 5d0a6d8b409b..cc5adc9106c0 100755 --- a/CryptoPkg/Library/OpensslLib/configure.py +++ b/CryptoPkg/Library/OpensslLib/configure.py @@ -358,7 +358,7 @@ def main(): defines = {} for asm in [ 'UEFI-IA32-MSFT', 'UEFI-IA32-GCC', 'UEFI-X64-MSFT', 'UEFI-X64-GCC', - 'UEFI-AARCH64-GCC']: + 'UEFI-AARCH64-ELF', 'UEFI-AARCH64-PE']: (uefi, arch, cc) = asm.split('-') archcc = f'{arch}-{cc}' @@ -371,12 +371,12 @@ def main(): srclist = libcrypto_sources(cfg, archcc) + libssl_sources(cfg, archcc) if arch in ['AARCH64']: - sources[archcc] = list(map(lambda x: f'{x} | {cc}', filter(is_asm, srclist))) + featureflagexp = 'gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStylePe' else: featureflagexp = 'gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm' - if cc == 'GCC': - featureflagexp = '!' + featureflagexp - sources[archcc] = list(map(lambda x: f'{x} ||||{featureflagexp}', filter(is_asm, srclist))) + if cc == 'GCC' or cc == 'ELF': + featureflagexp = '!' + featureflagexp + sources[archcc] = list(map(lambda x: f'{x} ||||{featureflagexp}', filter(is_asm, srclist))) update_MSFT_asm_format(archcc, sources[archcc]) sources[arch] = list(filter(lambda x: not is_asm(x), srclist)) defines[arch] = cfg['unified_info']['defines']['libcrypto'] @@ -386,7 +386,7 @@ def main(): x64accel = sources['X64'] + sources['X64-MSFT'] + sources['X64-GCC'] update_inf(inf, ia32accel, 'IA32', defines['IA32']) update_inf(inf, x64accel, 'X64', defines['X64']) - aarch64accel = sources['AARCH64'] + sources['AARCH64-GCC'] + aarch64accel = sources['AARCH64'] + sources['AARCH64-ELF'] + sources['AARCH64-PE'] update_inf(inf, aarch64accel, 'AARCH64', defines['AARCH64']) # noaccel - ec enabled From 2c4f469a96d97dbdcb7e6e260c857e4d10ecf378 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Wed, 17 Dec 2025 15:07:05 -0800 Subject: [PATCH 1027/1172] EmbeddedPkg: PrePiHobLib: Add Library/Protocol Dependencies CLANGPDB AARCH64 catches that PrePiHobLib doesn't correctly list the library classes and protocols it uses. This resolves that. Signed-off-by: Oliver Smith-Denny --- EmbeddedPkg/Library/PrePiHobLib/PrePiHobLib.inf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/EmbeddedPkg/Library/PrePiHobLib/PrePiHobLib.inf b/EmbeddedPkg/Library/PrePiHobLib/PrePiHobLib.inf index 1d0b2ddb4250..4ed4e2128dd2 100644 --- a/EmbeddedPkg/Library/PrePiHobLib/PrePiHobLib.inf +++ b/EmbeddedPkg/Library/PrePiHobLib/PrePiHobLib.inf @@ -35,11 +35,13 @@ BaseLib BaseMemoryLib DebugLib + PeCoffLib PrePiHobListPointerLib [Guids] gEfiHobMemoryAllocModuleGuid gEfiHobMemoryAllocStackGuid + gEfiMemoryTypeInformationGuid [FixedPcd.common] gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiACPIReclaimMemory @@ -51,3 +53,5 @@ [FeaturePcd] gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob +[Protocols] + gPeCoffLoaderProtocolGuid ## PRODUCES From 198c9bf50697cd6780e1695941ba5e42479a195b Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Fri, 19 Dec 2025 19:03:38 +0000 Subject: [PATCH 1028/1172] EmbeddedPkg: PrePiMemoryAllocationLib: Add AllocateCopyPool ArmVirtPkg uses PrePiMemoryAllocationLib and PeiServicesLib in the same module. PeiServicesLib depends on MemoryAllocationLib, fulfilled by PrePiMemoryAllocationLib in this instance. However, PeiServicesLib uses AllocateCopyPool() which is not provided in PrePiMemoryAllocationLib. CLANGPDB AARCH64 finds this as a link error. Other toolchains are optimizing the call out since that code path is not used in this module. This adds AllocateCopyPool() to PrePiMemoryAllocationLib to satisfy the dependency. Signed-off-by: Oliver Smith-Denny --- .../MemoryAllocationLib.c | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/EmbeddedPkg/Library/PrePiMemoryAllocationLib/MemoryAllocationLib.c b/EmbeddedPkg/Library/PrePiMemoryAllocationLib/MemoryAllocationLib.c index f280483c2d71..35f9207fcb22 100644 --- a/EmbeddedPkg/Library/PrePiMemoryAllocationLib/MemoryAllocationLib.c +++ b/EmbeddedPkg/Library/PrePiMemoryAllocationLib/MemoryAllocationLib.c @@ -400,3 +400,40 @@ ReallocatePool ( return NewBuffer; } + +/** + Copies a buffer to an allocated buffer of type EfiBootServicesData. + + Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, copies + AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the + allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there + is not enough memory remaining to satisfy the request, then NULL is returned. + + If Buffer is NULL, then ASSERT(). + If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). + + @param AllocationSize The number of bytes to allocate and zero. + @param Buffer The buffer to copy to the allocated buffer. + + @return A pointer to the allocated buffer or NULL if allocation fails. + +**/ +VOID * +EFIAPI +AllocateCopyPool ( + IN UINTN AllocationSize, + IN CONST VOID *Buffer + ) +{ + VOID *Memory; + + ASSERT (Buffer != NULL); + ASSERT (AllocationSize <= (MAX_ADDRESS - (UINTN)Buffer + 1)); + + Memory = AllocatePool (AllocationSize); + if (Memory != NULL) { + Memory = CopyMem (Memory, Buffer, AllocationSize); + } + + return Memory; +} From d098c654271676f5c6a5aad1063cd3791567ec94 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Wed, 17 Dec 2025 15:08:27 -0800 Subject: [PATCH 1029/1172] StandaloneMmPkg: Correct Build Options for CLANGPDB This fixes StandaloneMmPkg.dsc to use GCC style syntax for GCC and CLANGDWARF and MSVC style syntax for CLANGPDB. It also updates StandaloneMmCore to remove GCC style syntax to support PIE for runtime relocation when used as an application in OP-TEE. That scenario is only supported when building an ELF target. Signed-off-by: Oliver Smith-Denny --- StandaloneMmPkg/Core/StandaloneMmCore.inf | 14 ++++++++------ StandaloneMmPkg/StandaloneMmPkg.dsc | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/StandaloneMmPkg/Core/StandaloneMmCore.inf b/StandaloneMmPkg/Core/StandaloneMmCore.inf index 0448cdaf4eb9..1cad6a39426e 100644 --- a/StandaloneMmPkg/Core/StandaloneMmCore.inf +++ b/StandaloneMmPkg/Core/StandaloneMmCore.inf @@ -91,11 +91,13 @@ gStandaloneMmPkgTokenSpaceGuid.PcdShadowBfv ##CONSUMES # -# This configuration fails for CLANGPDB, which does not support PIE in the GCC -# sense. Such however is required for ARM family StandaloneMmCore -# self-relocation, and thus the CLANGPDB toolchain is unsupported for AARCH64 -# for this module. +# Standalone MM Core can be used as an OP-TEE trusted application and needs to do runtime +# relocation in that scenario. It needs to be built as a position independent executable (PIE) +# for this use case. However, PE targets do not support PIE, so only ELF targets +# are built with these flags and support this scenario. # [BuildOptions] - GCC:*_*_AARCH64_CC_FLAGS = -fpie - GCC:*_*_AARCH64_DLINK_FLAGS = -Wl,-z,text,-Bsymbolic,-pie + GCC:*_GCC_AARCH64_CC_FLAGS = -fpie + GCC:*_GCC_AARCH64_DLINK_FLAGS = -Wl,-z,text,-Bsymbolic,-pie + GCC:*_CLANGDWARF_AARCH64_CC_FLAGS = -fpie + GCC:*_CLANGDWARF_AARCH64_DLINK_FLAGS = -Wl,-z,text,-Bsymbolic,-pie diff --git a/StandaloneMmPkg/StandaloneMmPkg.dsc b/StandaloneMmPkg/StandaloneMmPkg.dsc index 155000669bc4..b71d59e3e308 100644 --- a/StandaloneMmPkg/StandaloneMmPkg.dsc +++ b/StandaloneMmPkg/StandaloneMmPkg.dsc @@ -166,7 +166,7 @@ # ################################################################################################### [BuildOptions.AARCH64] -GCC:*_*_*_DLINK_FLAGS = -z common-page-size=0x1000 -march=armv8-a+nofp -mstrict-align +GCC:*_GCC_*_DLINK_FLAGS = -z common-page-size=0x1000 -march=armv8-a+nofp -mstrict-align GCC:*_*_*_CC_FLAGS = -mstrict-align [BuildOptions.X64] From 7075ab567bc182a718418d49dadfd4b0f869d5c6 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Wed, 17 Dec 2025 15:09:15 -0800 Subject: [PATCH 1030/1172] UefiCpuPkg: Add CLANGPDB AARCH64 Support This fixes an error that CLANGPDB caught, which is that BaseArchSupportLib doesn't include ArmLib as a library dependency, even though it is. However, UefiCpuPkg is not allowed to depend on ArmPkg, so the single asm function that is used is copied to a new private file in BaseArchSupportLib and called from there; it is deferred to ArmPkg maintainers to resolve the dependencies on ArmPkg. In addition, UefiCpuPkg didn't support CI builds for AARCH64, so this adds that and moves some IA32/X64 specific components to those component sections. Signed-off-by: Oliver Smith-Denny --- .../AArch64/AArch64LibSupport.c | 8 ++++- .../AArch64/GetPhysicalAddressBits.S | 30 +++++++++++++++++++ .../BaseArchSupportLib/BaseArchSupportLib.inf | 1 + UefiCpuPkg/UefiCpuPkg.dsc | 18 ++++++----- 4 files changed, 48 insertions(+), 9 deletions(-) create mode 100644 UefiCpuPkg/Library/BaseArchSupportLib/AArch64/GetPhysicalAddressBits.S diff --git a/UefiCpuPkg/Library/BaseArchSupportLib/AArch64/AArch64LibSupport.c b/UefiCpuPkg/Library/BaseArchSupportLib/AArch64/AArch64LibSupport.c index a66a661c49ac..df6aa50b745d 100644 --- a/UefiCpuPkg/Library/BaseArchSupportLib/AArch64/AArch64LibSupport.c +++ b/UefiCpuPkg/Library/BaseArchSupportLib/AArch64/AArch64LibSupport.c @@ -9,6 +9,12 @@ #include #include +UINTN +EFIAPI +ArmArchLibGetPhysicalAddressBits ( + VOID + ); + VOID EFIAPI InitializeFloatingPointUnits ( @@ -23,5 +29,5 @@ ArchGetPhysicalAddressBits ( VOID ) { - return ArmGetPhysicalAddressBits (); + return ArmArchLibGetPhysicalAddressBits (); } diff --git a/UefiCpuPkg/Library/BaseArchSupportLib/AArch64/GetPhysicalAddressBits.S b/UefiCpuPkg/Library/BaseArchSupportLib/AArch64/GetPhysicalAddressBits.S new file mode 100644 index 000000000000..6d47e07aec13 --- /dev/null +++ b/UefiCpuPkg/Library/BaseArchSupportLib/AArch64/GetPhysicalAddressBits.S @@ -0,0 +1,30 @@ +#------------------------------------------------------------------------------ +# +# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
    +# Copyright (c) 2011 - 2016, ARM Limited. All rights reserved. +# Copyright (c) 2016, Linaro Limited. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +#------------------------------------------------------------------------------ + +#include + +ASM_FUNC(ArmArchLibGetPhysicalAddressBits) + mrs x0, id_aa64mmfr0_el1 + adr x1, .LPARanges + and x0, x0, #0xf + ldrb w0, [x1, x0] + ret + +// +// Bits 0..3 of the AA64MFR0_EL1 system register encode the size of the +// physical address space support on this CPU: +// 0 == 32 bits, 1 == 36 bits, etc etc +// 7 and up are reserved +// +.LPARanges: + .byte 32, 36, 40, 42, 44, 48, 52, 0 + .byte 0, 0, 0, 0, 0, 0, 0, 0 + +ASM_FUNCTION_REMOVE_IF_UNREFERENCED diff --git a/UefiCpuPkg/Library/BaseArchSupportLib/BaseArchSupportLib.inf b/UefiCpuPkg/Library/BaseArchSupportLib/BaseArchSupportLib.inf index 0694e6500bdc..db8635a4716f 100644 --- a/UefiCpuPkg/Library/BaseArchSupportLib/BaseArchSupportLib.inf +++ b/UefiCpuPkg/Library/BaseArchSupportLib/BaseArchSupportLib.inf @@ -17,6 +17,7 @@ [Sources.AARCH64] AArch64/AArch64LibSupport.c + AArch64/GetPhysicalAddressBits.S [Sources.IA32, Sources.X64] X86/X86LibSupport.c diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc index 8de397f2b589..6c4125a1586c 100644 --- a/UefiCpuPkg/UefiCpuPkg.dsc +++ b/UefiCpuPkg/UefiCpuPkg.dsc @@ -14,7 +14,7 @@ PLATFORM_VERSION = 0.90 DSC_SPECIFICATION = 0x00010005 OUTPUT_DIRECTORY = Build/UefiCpu - SUPPORTED_ARCHITECTURES = IA32|X64 + SUPPORTED_ARCHITECTURES = IA32|X64|AARCH64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT @@ -72,6 +72,7 @@ LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxDxeLib.inf HobLib|MdeModulePkg/Library/BaseHobLibNull/BaseHobLibNull.inf MemoryAllocationLib|MdeModulePkg/Library/BaseMemoryAllocationLibNull/BaseMemoryAllocationLibNull.inf + PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf [LibraryClasses.common.SEC] PlatformSecLib|UefiCpuPkg/Library/PlatformSecLibNull/PlatformSecLibNull.inf @@ -126,17 +127,11 @@ # [Components] - UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf - UefiCpuPkg/CpuIoPei/CpuIoPei.inf UefiCpuPkg/Library/SecPeiDxeTimerLibUefiCpu/SecPeiDxeTimerLibUefiCpu.inf - UefiCpuPkg/Application/Cpuid/Cpuid.inf - UefiCpuPkg/Library/CpuTimerLib/BaseCpuTimerLib.inf - UefiCpuPkg/Library/CpuCacheInfoLib/PeiCpuCacheInfoLib.inf - UefiCpuPkg/Library/CpuCacheInfoLib/DxeCpuCacheInfoLib.inf - UefiCpuPkg/MicrocodeMeasurementDxe/MicrocodeMeasurementDxe.inf UefiCpuPkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLib.inf [Components.IA32, Components.X64] + UefiCpuPkg/Application/Cpuid/Cpuid.inf UefiCpuPkg/CpuDxe/CpuDxe.inf UefiCpuPkg/CpuFeatures/CpuFeaturesPei.inf { @@ -146,13 +141,18 @@ NULL|UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.inf } + UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf + UefiCpuPkg/CpuIoPei/CpuIoPei.inf UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf UefiCpuPkg/CpuIo2Smm/CpuIo2StandaloneMm.inf UefiCpuPkg/CpuMpPei/CpuMpPei.inf UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf UefiCpuPkg/Library/BaseArchSupportLib/BaseArchSupportLib.inf + UefiCpuPkg/Library/CpuTimerLib/BaseCpuTimerLib.inf UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.inf UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.inf + UefiCpuPkg/Library/CpuCacheInfoLib/PeiCpuCacheInfoLib.inf + UefiCpuPkg/Library/CpuCacheInfoLib/DxeCpuCacheInfoLib.inf UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.inf UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf @@ -173,6 +173,7 @@ UefiCpuPkg/Library/SmmCpuSyncLib/SmmCpuSyncLib.inf UefiCpuPkg/Library/CcExitLibNull/CcExitLibNull.inf UefiCpuPkg/Library/AmdSvsmLibNull/AmdSvsmLibNull.inf + UefiCpuPkg/MicrocodeMeasurementDxe/MicrocodeMeasurementDxe.inf UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationPei.inf UefiCpuPkg/PiSmmCommunication/PiSmmCommunicationSmm.inf UefiCpuPkg/SecCore/SecCore.inf @@ -234,6 +235,7 @@ [Components.LOONGARCH64] UefiCpuPkg/Library/CpuMmuLib/CpuMmuLib.inf + UefiCpuPkg/Library/CpuTimerLib/BaseCpuTimerLib.inf UefiCpuPkg/CpuMmio2Dxe/CpuMmio2Dxe.inf [BuildOptions] From 3900ca9d7bedb2ddbb32889ed436a9a23128fa21 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Wed, 17 Dec 2025 15:11:31 -0800 Subject: [PATCH 1031/1172] UefiPayloadPkg: Support CLANGPDB AARCH64 UefiPayloadPkg needed two fixes for CLANGPDB AARCH64: - Don't use the tiny code model for CLANGPDB, it is not supported. This is only for CI build anyway. - CLANGPDB caught that there were undefined references to a function in the entry, this was because in the non-Fit entry point INFs, they were still including the AARCH64 Fit entry point files, which are not needed. Signed-off-by: Oliver Smith-Denny --- UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf | 1 - UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf | 1 - UefiPayloadPkg/UefiPayloadPkg.dsc | 4 +++- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf index a090e3224140..56489cba88ad 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf @@ -39,7 +39,6 @@ [Sources.AARCH64] AArch64/DxeHandoff.c - AArch64/DxeLoadFuncFit.c [Packages] MdePkg/MdePkg.dec diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf index 842081d5d511..a834daa0f390 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf +++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf @@ -33,7 +33,6 @@ X64/DxeLoadFunc.c [Sources.AARCH64] AArch64/DxeHandoff.c - AArch64/DxeLoadFuncFit.c [Packages] MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index fa18876345ea..3908ae9b1e31 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -189,7 +189,9 @@ *_*_*_CC_FLAGS = $(APPEND_CC_FLAGS) [BuildOptions.AARCH64] - GCC:*_*_*_CC_FLAGS = -mcmodel=tiny -mstrict-align + GCC:*_*_*_CC_FLAGS = -mstrict-align + GCC:*_GCC_*_CC_FLAGS = -mcmodel=tiny + GCC:*_CLANGDWARF_*_CC_FLAGS = -mcmodel=tiny [BuildOptions.common.EDKII.DXE_RUNTIME_DRIVER] GCC:*_*_*_DLINK_FLAGS = -z common-page-size=0x1000 From 361cd6b3bd1b8505be91f5a2040c125f2a281931 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Wed, 17 Dec 2025 09:15:59 -0800 Subject: [PATCH 1032/1172] BaseTools: tools_def: Add support for CLANGPDB with AARCH64 This change adds the support for building AARCH64 target platforms using CLANGPDB. This applies a 4KB section alignment for all AArch64 modules built with CLANGPDB for multiple reasons: - DXE and Standalone MM modules should have memory protections applied - There is a bug in llvm that allows for code generation that ends up requiring 4KB section alignment, see https://github.com/llvm/llvm-project/issues/172660. This also adds a build rule to use DLINK_XIPFLAGS to ensure a file alignment of 4KB for SEC/PEI modules to ensure file alignment and section alignment match. Signed-off-by: Oliver Smith-Denny --- BaseTools/Conf/build_rule.template | 2 ++ BaseTools/Conf/tools_def.template | 46 +++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_rule.template index 7513ecb9566c..d06b4be23878 100755 --- a/BaseTools/Conf/build_rule.template +++ b/BaseTools/Conf/build_rule.template @@ -342,6 +342,8 @@ "$(DLINK)" -o ${dst} $(DLINK_FLAGS) $(DLINK_XIPFLAGS) -Wl,--start-group,@$(STATIC_LIBRARY_FILES_LIST),--end-group $(CC_FLAGS) $(CC_XIPFLAGS) $(DLINK2_FLAGS) "$(OBJCOPY)" $(OBJCOPY_FLAGS) ${dst} + + "$(DLINK)" /OUT:${dst} $(DLINK_FLAGS) $(DLINK_SPATH) @$(STATIC_LIBRARY_FILES_LIST) $(DLINK2_FLAGS) $(DLINK_XIPFLAGS) [Static-Library-File.USER_DEFINED] diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index fc5a4da0ca11..6bf337862858 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -24,8 +24,9 @@ # 3.02 - Enable stack cookies for IA32, X64, ARM, and AARCH64 builds for GCC and MSVC # 3.03 - Drop ARM32 Support # 3.04 - Add toolchain for VS2026 +# 3.05 - Add CLANGPDB AARCH64 Support # -#!VERSION=3.04 +#!VERSION=3.05 IDENTIFIER = Default TOOL_CHAIN_CONF @@ -1783,9 +1784,11 @@ RELEASE_GCC_LOONGARCH64_CC_FLAGS = DEF(GCC5_LOONGARCH64_CC_FLAGS) -Wno-unu DEFINE CLANGPDB_IA32_PREFIX = ENV(CLANG_BIN) DEFINE CLANGPDB_X64_PREFIX = ENV(CLANG_BIN) +DEFINE CLANGPDB_AARCH64_PREFIX = ENV(CLANG_BIN) DEFINE CLANGPDB_IA32_TARGET = -target i686-pc-windows-msvc DEFINE CLANGPDB_X64_TARGET = -target x86_64-pc-windows-msvc +DEFINE CLANGPDB_AARCH64_TARGET = -target aarch64-unknown-windows-msvc DEFINE CLANGPDB_WARNING_OVERRIDES = -Wno-parentheses-equality -Wno-tautological-compare -Wno-tautological-constant-out-of-range-compare -Wno-empty-body -Wno-unused-const-variable -Wno-varargs -Wno-unknown-warning-option -Wno-unused-but-set-variable -Wno-unused-const-variable -Wno-unaligned-access -Wno-microsoft-enum-forward-reference DEFINE CLANGPDB_ALL_CC_FLAGS = DEF(GCC48_ALL_CC_FLAGS) DEF(CLANGPDB_WARNING_OVERRIDES) -fno-stack-protector -funsigned-char -ftrap-function=undefined_behavior_has_been_optimized_away_by_clang -Wno-address -Wno-shift-negative-value -Wno-unknown-pragmas -Wno-incompatible-library-redeclaration -Wno-null-dereference -mno-implicit-float -mms-bitfields -mno-stack-arg-probe -fno-omit-frame-pointer -D __GNUC__=4 -D __GNUC_MINOR__=2 -D __GNUC_PATCHLEVEL__=1 -D __MINGW32__=1 @@ -1869,6 +1872,47 @@ NOOPT_CLANGPDB_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /OPT:RE NOOPT_CLANGPDB_X64_DLINK2_FLAGS = NOOPT_CLANGPDB_X64_GENFW_FLAGS = --keepexceptiontable +########################## +# CLANGPDB AARCH64 definitions +########################## +*_CLANGPDB_AARCH64_CC_PATH = DEF(CLANGPDB_AARCH64_PREFIX)clang +*_CLANGPDB_AARCH64_SLINK_PATH = DEF(CLANGPDB_AARCH64_PREFIX)llvm-lib +*_CLANGPDB_AARCH64_DLINK_PATH = DEF(CLANGPDB_AARCH64_PREFIX)lld-link +*_CLANGPDB_AARCH64_ASLDLINK_PATH = DEF(CLANGPDB_AARCH64_PREFIX)lld-link +*_CLANGPDB_AARCH64_ASM_PATH = DEF(CLANGPDB_AARCH64_PREFIX)clang +*_CLANGPDB_AARCH64_PP_PATH = DEF(CLANGPDB_AARCH64_PREFIX)clang +*_CLANGPDB_AARCH64_VFRPP_PATH = DEF(CLANGPDB_AARCH64_PREFIX)clang +*_CLANGPDB_AARCH64_ASLCC_PATH = DEF(CLANGPDB_AARCH64_PREFIX)clang +*_CLANGPDB_AARCH64_ASLPP_PATH = DEF(CLANGPDB_AARCH64_PREFIX)clang +*_CLANGPDB_AARCH64_RC_PATH = DEF(CLANGPDB_AARCH64_PREFIX)llvm-rc + +*_CLANGPDB_AARCH64_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) -m64 -fno-lto DEF(CLANGPDB_AARCH64_TARGET) +*_CLANGPDB_AARCH64_ASM_FLAGS = DEF(GCC_ASM_FLAGS) -m64 DEF(CLANGPDB_AARCH64_TARGET) +*_CLANGPDB_AARCH64_OBJCOPY_FLAGS = +*_CLANGPDB_AARCH64_NASM_FLAGS = -f win64 +*_CLANGPDB_AARCH64_PP_FLAGS = DEF(GCC_PP_FLAGS) DEF(CLANGPDB_AARCH64_TARGET) +*_CLANGPDB_AARCH64_ASLPP_FLAGS = DEF(GCC_ASLPP_FLAGS) DEF(CLANGPDB_AARCH64_TARGET) +*_CLANGPDB_AARCH64_VFRPP_FLAGS = DEF(GCC_VFRPP_FLAGS) DEF(CLANGPDB_AARCH64_TARGET) +*_CLANGPDB_AARCH64_CC_XIPFLAGS = -mstrict-align + +DEBUG_CLANGPDB_AARCH64_CC_FLAGS = DEF(CLANGPDB_ALL_CC_FLAGS) -m64 -mcmodel=small -Oz -flto DEF(CLANGPDB_AARCH64_TARGET) -gcodeview -funwind-tables -Wno-unused-but-set-variable -Wno-deprecated-non-prototype -Wno-constant-conversion -Werror +DEBUG_CLANGPDB_AARCH64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /WX /OPT:REF /OPT:ICF=10 /ALIGN:4096 /Machine:ARM64 /DLL /DRIVER /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DEBUG:GHASH /MLLVM:-exception-model=wineh /lldmap +DEBUG_CLANGPDB_AARCH64_DLINK2_FLAGS = +DEBUG_CLANGPDB_AARCH64_GENFW_FLAGS = --keepexceptiontable + +RELEASE_CLANGPDB_AARCH64_CC_FLAGS = DEF(CLANGPDB_ALL_CC_FLAGS) -m64 -mcmodel=small -Oz -flto DEF(CLANGPDB_AARCH64_TARGET) -fno-unwind-tables -Wno-unused-but-set-variable -Wno-deprecated-non-prototype -Wno-constant-conversion -Werror +RELEASE_CLANGPDB_AARCH64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4254 /WX /OPT:REF /OPT:ICF=10 /ALIGN:4096 /SECTION:.xdata,D /SECTION:.pdata,D /Machine:ARM64 /DLL /DRIVER /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /MERGE:.rdata=.data /MLLVM:-exception-model=wineh /lldmap +RELEASE_CLANGPDB_AARCH64_DLINK2_FLAGS = + +NOOPT_CLANGPDB_AARCH64_CC_FLAGS = DEF(CLANGPDB_ALL_CC_FLAGS) -m64 -mcmodel=small -O0 DEF(CLANGPDB_AARCH64_TARGET) -gcodeview -funwind-tables -Wno-unused-but-set-variable -Wno-deprecated-non-prototype -Wno-constant-conversion -Werror +NOOPT_CLANGPDB_AARCH64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /WX /OPT:REF /OPT:ICF=10 /ALIGN:4096 /Machine:ARM64 /DLL /DRIVER /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DEBUG:GHASH /MLLVM:-exception-model=wineh /lldmap +NOOPT_CLANGPDB_AARCH64_DLINK2_FLAGS = +NOOPT_CLANGPDB_AARCH64_GENFW_FLAGS = --keepexceptiontable + +# BaseTools cannot handle XIP modules with different section and file alignment and CLANGPDB AArch64 is restricted to +# 4KB section alignment due to an LLVM bug: https://github.com/llvm/llvm-project/issues/172660 +*_CLANGPDB_AARCH64_DLINK_XIPFLAGS = /FILEALIGN:4096 + #################################################################################### # # CLANGDWARF - This configuration is used to compile under Windows/Linux/Mac to produce From 6b03a92dff73f20551da32e55cf47f466eb00e26 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Mon, 7 Jul 2025 15:57:56 +0100 Subject: [PATCH 1033/1172] MdePkg/IndustryStandard/ArmFfaSvc.h: add partition type helper According to the FF-A specification, bit 15 of the partition ID indicates the partition type: - Bit[15] == 0: Identifies a Virtual Machine (VM), used by the Hypervisor. - Bit[15] == 1: Identifies a Secure Partition, used by the SPM. In other words, if bit 15 of the partition ID is set to 1, it represents a Secure Partition; if it is 0, it represents a Normal World partition. Based on this spec, add helper to check partition id is secure partition or not. Signed-off-by: Yeoreum Yun --- MdePkg/Include/IndustryStandard/ArmFfaSvc.h | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/MdePkg/Include/IndustryStandard/ArmFfaSvc.h b/MdePkg/Include/IndustryStandard/ArmFfaSvc.h index e449353e4beb..50bda5c44baa 100644 --- a/MdePkg/Include/IndustryStandard/ArmFfaSvc.h +++ b/MdePkg/Include/IndustryStandard/ArmFfaSvc.h @@ -182,13 +182,13 @@ ARM_FFA_SET_MEM_ATTR_DATA_PERM_SHIFT)) /* - * macro used in FFA_MSG_DIRECT_REQ/REQ2 - * See FF-A spec Chapther 15.2 FFA_MSG_SEND_DIRECT_REQ and - * 15.4 FFA_MSG_SEND_DIRECT_REQ2 + * macro used for partition information + * See FF-A spec Chapter 6.1 Partition identification */ -#define ARM_FFA_SOURCE_EP_SHIFT 16 -#define ARM_FFA_DEST_EP_SHIFT 0 -#define ARM_FFA_PARTITION_ID_MASK 0xffff +#define ARM_FFA_SOURCE_EP_SHIFT 16 +#define ARM_FFA_DEST_EP_SHIFT 0 +#define ARM_FFA_PARTITION_ID_MASK 0xffff +#define ARM_FFA_PARTITION_ID_TYPE_SHIFT 15 #define GET_SOURCE_PARTITION_ID(PackedId) \ ((PackedId >> ARM_FFA_SOURCE_EP_SHIFT) & ARM_FFA_PARTITION_ID_MASK) @@ -200,6 +200,9 @@ (((SourceId & ARM_FFA_PARTITION_ID_MASK) << ARM_FFA_SOURCE_EP_SHIFT) | \ ((DestId & ARM_FFA_PARTITION_ID_MASK) << ARM_FFA_DEST_EP_SHIFT)) +#define ARM_FFA_IS_SECURE_PARTITION_ID(PartId) \ + (((PartId) & (1 << ARM_FFA_PARTITION_ID_TYPE_SHIFT)) != 0) + #define IS_FID_FFA_ERROR(fid) \ (fid == ARM_FID_FFA_ERROR) From f63875271d7126c750e5ef2ac13da76cdab59cbe Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Wed, 10 Dec 2025 10:29:53 +0000 Subject: [PATCH 1034/1172] ArmPkg/Library/StandaloneMmEntryPoint: introduce IsSecureMmCommBufferAddr() To verify whether MM communication uses a secure buffer, introduce the IsSecureMmCommBufferAddr() function. This is a preparatory patch for MM context generation on Arm. Signed-off-by: Yeoreum Yun --- .../ArmStandaloneMmCoreEntryPoint.c | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c index 85b0bc0a0c45..ada19220075d 100644 --- a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c +++ b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c @@ -452,6 +452,30 @@ GetServiceType ( return ServiceTypeMisc; } +/** + Check command buffer is belong to secure shared buffer. + + @param [in] CommBufferAddr Address of the common buffer. + + @retval TRUE CommBufferAddr is in secure shared buffer + @retval FALSE Other + +**/ +STATIC +BOOLEAN +IsSecureMmCommBufferAddr ( + IN UINTN CommBufferAddr + ) +{ + if ((CommBufferAddr >= mSCommBuffer->PhysicalStart) && + (CommBufferAddr < (mSCommBuffer->PhysicalStart + mSCommBuffer->PhysicalSize))) + { + return TRUE; + } + + return FALSE; +} + /** Perform bounds check for the Ns and Secure Communication buffer. @@ -485,9 +509,7 @@ ValidateMmCommBufferAddr ( (CommBufferAddr < NsCommBufferEnd)) { CommBufferEnd = NsCommBufferEnd; - } else if ((CommBufferAddr >= mSCommBuffer->PhysicalStart) && - (CommBufferAddr < SCommBufferEnd)) - { + } else if (IsSecureMmCommBufferAddr (CommBufferAddr)) { CommBufferEnd = SCommBufferEnd; } else { return EFI_ACCESS_DENIED; From 2ee24e6c4e760baf0368cc12ced8adefbd8d004e Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Mon, 7 Jul 2025 16:04:52 +0100 Subject: [PATCH 1035/1172] ArmPkg/Library: add ArmMmHandlerContext for MM handler context management MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce ArmMmHandlerContext.h, which defines the ARM_MM_HANDLER_CONTEXT structure passed to each MmHandler’s Context argument. This structure provides: - The current communication protocol type - The service type - Protocol-specific details This enables MM drivers to differentiate requests from MM communication versus DIRECT_MSG_REQ2, support both SPM_MM and FF-A v1.2, and determine whether a request originated from the secure world. Signed-off-by: Yeoreum Yun --- ArmPkg/ArmPkg.ci.yaml | 5 +- ArmPkg/Include/Library/ArmMmHandlerContext.h | 119 ++++++++++++++++++ .../Library/ArmStandaloneMmCoreEntryPoint.h | 81 +----------- 3 files changed, 124 insertions(+), 81 deletions(-) create mode 100644 ArmPkg/Include/Library/ArmMmHandlerContext.h diff --git a/ArmPkg/ArmPkg.ci.yaml b/ArmPkg/ArmPkg.ci.yaml index f89660823403..2da2d92455d9 100644 --- a/ArmPkg/ArmPkg.ci.yaml +++ b/ArmPkg/ArmPkg.ci.yaml @@ -84,7 +84,10 @@ ## options defined .pytool/Plugin/LibraryClassCheck "LibraryClassCheck": { - "IgnoreHeaderFile": [] + "IgnoreHeaderFile": [ + "Include/Library/ArmMmHandlerContext.h" + ], + "skip": True }, ## options defined .pytool/Plugin/SpellCheck diff --git a/ArmPkg/Include/Library/ArmMmHandlerContext.h b/ArmPkg/Include/Library/ArmMmHandlerContext.h new file mode 100644 index 000000000000..291e4a2e5755 --- /dev/null +++ b/ArmPkg/Include/Library/ArmMmHandlerContext.h @@ -0,0 +1,119 @@ +/** @file + Define ArmMmHandlerContext passed to MmHandler in Arm platform. + + Copyright (c) 2025, Arm Ltd. All rights reserved.
    + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef ARM_MM_HANDLER_CONTEXT_H_ +#define ARM_MM_HANDLER_CONTEXT_H_ + +/* + * Communication ABI protocol to communicate between normal/secure partition. + */ +typedef enum { + /// Unknown Communication ABI protocol + CommProtocolUnknown, + + /// Communicate via SPM_MM ABI protocol + CommProtocolSpmMm, + + /// Communicate via FF-A ABI protocol + CommProtocolFfa, + + CommProtocolMax, +} COMM_PROTOCOL; + +/** When using FF-A ABI, there are ways to request service to StandaloneMm + - FF-A with MmCommunication protocol. + - FF-A service with each specification. + MmCommunication Protocol can use FFA_MSG_SEND_DIRECT_REQ or REQ2, + Other FF-A services should use FFA_MSG_SEND_DIRECT_REQ2. + In case of FF-A with MmCommunication protocol via FFA_MSG_SEND_DIRECT_REQ, + register x3 saves Communication Buffer with gEfiMmCommunication2ProtocolGuid. + In case of FF-A with MmCommunication protocol via FFA_MSG_SEND_DIRECT_REQ2, + register x2/x3 save gEfiMmCommunication2ProtocolGuid and + register x4 saves Communication Buffer with Service Guid. + + Other FF-A services (ServiceTypeMisc) delivers register values according to + there own service specification. + That means it doesn't use MmCommunication Buffer with MmCommunication Header + format. + (i.e) Tpm service via FF-A or Firmware Update service via FF-A. + To support latter services by StandaloneMm, it defines SERVICE_TYPE_MISC. + So that StandaloneMmEntryPointCore.c generates MmCommunication Header + with delivered register values to dispatch service provided StandaloneMmCore. + So that service handler can get proper information from delivered register. + + In case of SPM_MM Abi, it only supports MmCommunication service. + */ +typedef enum { + /// Unknown + ServiceTypeUnknown, + + /// MmCommunication services + ServiceTypeMmCommunication, + + /// Misc services + ServiceTypeMisc, + + ServiceTypeMax, +} SERVICE_TYPE; + +/** Direct message request/response version + */ +typedef enum { + /// Direct message version 1. Use FFA_DIRECT_MSG_REQ/RESP + DirectMsgV1, + + /// Direct message version 2. Use FFA_DIRECT_MSG_REQ2/RESP2 + DirectMsgV2, + + DirectMsgMax, +} DIRECT_MSG_VERSION; + +/** + * SPM_MM ABI data + */ +typedef struct { + /// Service Type + SERVICE_TYPE ServiceType; + + /// Secure Request + BOOLEAN SecureRequest; +} SPM_MM_MSG_INFO; + +/** Ffa Abi data used in FFA_MSG_SEND_DIRECT_RESP/RESP2. + */ +typedef struct FfaMsgInfo { + /// Source partition id + UINT16 SourcePartId; + + /// Destination partition id + UINT16 DestPartId; + + /// Direct Message version + DIRECT_MSG_VERSION DirectMsgVersion; + + /// Service Type + SERVICE_TYPE ServiceType; +} FFA_MSG_INFO; + +typedef union { + /// SPM_MM message info + SPM_MM_MSG_INFO SpmMmInfo; + + /// FF-A message info + FFA_MSG_INFO FfaMsgInfo; +} ARM_MM_HANDLER_CTX_DATA; + +typedef struct { + /// Communication Protocol + COMM_PROTOCOL CommProtocol; + + /// Context Data according to CommProtocol + ARM_MM_HANDLER_CTX_DATA CtxData; +} ARM_MM_HANDLER_CONTEXT; + +#endif // ARM_MM_HANDLER_CONTEXT_H_ diff --git a/ArmPkg/Include/Library/ArmStandaloneMmCoreEntryPoint.h b/ArmPkg/Include/Library/ArmStandaloneMmCoreEntryPoint.h index 1549211613ba..8c86bf0d152b 100644 --- a/ArmPkg/Include/Library/ArmStandaloneMmCoreEntryPoint.h +++ b/ArmPkg/Include/Library/ArmStandaloneMmCoreEntryPoint.h @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -40,70 +41,6 @@ #define MMRAM_DESC_IDX_HEAP 3 #define MMRAM_DESC_MIN_COUNT 4 -/* - * Communication ABI protocol to communicate between normal/secure partition. - */ -typedef enum { - /// Unknown Communication ABI protocol - CommProtocolUnknown, - - /// Communicate via SPM_MM ABI protocol - CommProtocolSpmMm, - - /// Communicate via FF-A ABI protocol - CommProtocolFfa, - - CommProtocolMax, -} COMM_PROTOCOL; - -/** When using FF-A ABI, there're ways to request service to StandaloneMm - - FF-A with MmCommunication protocol. - - FF-A service with each specification. - MmCommunication Protocol can use FFA_MSG_SEND_DIRECT_REQ or REQ2, - Other FF-A services should use FFA_MSG_SEND_DIRECT_REQ2. - In case of FF-A with MmCommunication protocol via FFA_MSG_SEND_DIRECT_REQ, - register x3 saves Communication Buffer with gEfiMmCommunication2ProtocolGuid. - In case of FF-A with MmCommunication protocol via FFA_MSG_SEND_DIRECT_REQ2, - register x2/x3 save gEfiMmCommunication2ProtocolGuid and - register x4 saves Communication Buffer with Service Guid. - - Other FF-A services (ServiceTypeMisc) delivers register values according to - there own service specification. - That means it doesn't use MmCommunication Buffer with MmCommunication Header - format. - (i.e) Tpm service via FF-A or Firmware Update service via FF-A. - To support latter services by StandaloneMm, it defines SERVICE_TYPE_MISC. - So that StandaloneMmEntryPointCore.c generates MmCommunication Header - with delivered register values to dispatch service provided StandaloneMmCore. - So that service handler can get proper information from delivered register. - - In case of SPM_MM Abi, it only supports MmCommunication service. - */ -typedef enum { - /// Unknown - ServiceTypeUnknown, - - /// MmCommunication services - ServiceTypeMmCommunication, - - /// Misc services - ServiceTypeMisc, - - ServiceTypeMax, -} SERVICE_TYPE; - -/** Direct message request/response version - */ -typedef enum { - /// Direct message version 1. Use FFA_DIRECT_MSG_REQ/RESP - DirectMsgV1, - - /// Direct message version 2. Use FFA_DIRECT_MSG_REQ2/RESP2 - DirectMsgV2, - - DirectMsgMax, -} DIRECT_MSG_VERSION; - /** Service table entry to return service type matched with service guid */ typedef struct ServiceTableEntry { @@ -114,22 +51,6 @@ typedef struct ServiceTableEntry { SERVICE_TYPE ServiceType; } SERVICE_TABLE_ENTRY; -/** Ffa Abi data used in FFA_MSG_SEND_DIRECT_RESP/RESP2. - */ -typedef struct FfaMsgInfo { - /// Source partition id - UINT16 SourcePartId; - - /// Destination partition id - UINT16 DestPartId; - - /// Direct Message version - DIRECT_MSG_VERSION DirectMsgVersion; - - /// Service Type - SERVICE_TYPE ServiceType; -} FFA_MSG_INFO; - /** MmCommunication Header for Misc service. Misc service doesn't use MmCommunication Buffer. This structure is used to dispatch Misc services by StandaloneMm. From cc883371e743611f613c912234795a92e5e82c90 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Wed, 15 Jan 2025 18:26:42 +0000 Subject: [PATCH 1036/1172] ArmPkg/StandaloneMmCpu: pass ARM_MM_HANDLER_CONTEXT to MmHandler Pass ARM_MM_HANDLER_CONTEXT to MmHandler so it can determine: - whether the request came via FF-A or SPM_MM mode - the service type - whether it is a secure request or the source partition ID Signed-off-by: Yeoreum Yun --- ArmPkg/Drivers/StandaloneMmCpu/EventHandle.c | 44 ++++++++--------- .../Drivers/StandaloneMmCpu/StandaloneMmCpu.h | 8 ++-- .../Library/ArmStandaloneMmCoreEntryPoint.h | 2 + ArmPkg/Include/Protocol/PiMmCpuDriverEp.h | 7 +-- .../ArmStandaloneMmCoreEntryPoint.c | 48 +++++++++++-------- 5 files changed, 60 insertions(+), 49 deletions(-) diff --git a/ArmPkg/Drivers/StandaloneMmCpu/EventHandle.c b/ArmPkg/Drivers/StandaloneMmCpu/EventHandle.c index 99445d5912cf..c2bbaf17e8ff 100644 --- a/ArmPkg/Drivers/StandaloneMmCpu/EventHandle.c +++ b/ArmPkg/Drivers/StandaloneMmCpu/EventHandle.c @@ -39,8 +39,8 @@ MmFoundationEntryRegister ( // maintained in single global variable because StandaloneMm is UP-migratable // (which means it cannot run concurrently) // -EFI_MM_COMMUNICATE_HEADER *gGuidedEventContext = NULL; -EFI_MM_COMMUNICATE_HEADER_V3 *gGuidedEventContextV3 = NULL; +EFI_MM_COMMUNICATE_HEADER *gGuidedEventContext = NULL; +STATIC CONST ARM_MM_HANDLER_CONTEXT *mMmHandlerContext = NULL; EFI_MM_CONFIGURATION_PROTOCOL mMmConfig = { 0, @@ -56,8 +56,8 @@ STATIC EFI_MM_ENTRY_POINT mMmEntryPoint = NULL; /** The PI Standalone MM entry point for the CPU driver. - @param [in] EventId The event Id. - @param [in] CommBufferAddr Address of the communication buffer. + @param [in] MmHandlerContext Arm specific Mm handler context. + @param [in] CommBufferAddr Address of the communication buffer. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter was invalid. @@ -67,20 +67,18 @@ STATIC EFI_MM_ENTRY_POINT mMmEntryPoint = NULL; **/ EFI_STATUS PiMmStandaloneMmCpuDriverEntry ( - IN UINTN EventId, - IN UINTN CommBufferAddr + IN CONST ARM_MM_HANDLER_CONTEXT *MmHandlerContext, + IN UINTN CommBufferAddr ) { EFI_MM_ENTRY_CONTEXT MmEntryPointContext; EFI_STATUS Status; UINTN CommBufferSize; - DEBUG ((DEBUG_INFO, "Received event - 0x%x\n", EventId)); - Status = EFI_SUCCESS; - // Perform parameter validation of NsCommBufferAddr - if (CommBufferAddr == (UINTN)NULL) { + // Perform parameter validation. + if ((MmHandlerContext == NULL) || (CommBufferAddr == (UINTN)NULL)) { return EFI_INVALID_PARAMETER; } @@ -114,11 +112,12 @@ PiMmStandaloneMmCpuDriverEntry ( if (EFI_ERROR (Status)) { gGuidedEventContext = NULL; - DEBUG ((DEBUG_ERROR, "Mem alloc failed - 0x%x\n", EventId)); + DEBUG ((DEBUG_ERROR, "%a: Mem alloc failed\n", __func__)); return Status; } CopyMem (gGuidedEventContext, (CONST VOID *)CommBufferAddr, CommBufferSize); + mMmHandlerContext = MmHandlerContext; ZeroMem (&MmEntryPointContext, sizeof (EFI_MM_ENTRY_CONTEXT)); @@ -141,6 +140,7 @@ PiMmStandaloneMmCpuDriverEntry ( Status = mMmst->MmFreePool ((VOID *)gGuidedEventContext); ASSERT_EFI_ERROR (Status); gGuidedEventContext = NULL; + mMmHandlerContext = NULL; return Status; } @@ -190,7 +190,8 @@ PiMmCpuTpFwRootMmiHandler ( IN OUT UINTN *CommBufferSize OPTIONAL ) { - EFI_STATUS Status; + EFI_STATUS Status; + EFI_MM_COMMUNICATE_HEADER_V3 *GuidedEventContextV3; ASSERT (Context == NULL); ASSERT (CommBuffer == NULL); @@ -205,20 +206,20 @@ PiMmCpuTpFwRootMmiHandler ( &gEfiMmCommunicateHeaderV3Guid )) { - gGuidedEventContextV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)gGuidedEventContext; + GuidedEventContextV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)gGuidedEventContext; DEBUG (( DEBUG_INFO, "CommBuffer - 0x%x, CommBufferSize - 0x%llx, MessageSize - 0x%llx\n", - gGuidedEventContextV3, - gGuidedEventContextV3->BufferSize, - gGuidedEventContextV3->MessageSize + GuidedEventContextV3, + GuidedEventContextV3->BufferSize, + GuidedEventContextV3->MessageSize )); Status = mMmst->MmiManage ( - &gGuidedEventContextV3->MessageGuid, - NULL, - gGuidedEventContextV3->MessageData, - (UINTN *)(&gGuidedEventContextV3->MessageSize) + &GuidedEventContextV3->MessageGuid, + mMmHandlerContext, + GuidedEventContextV3->MessageData, + (UINTN *)(&GuidedEventContextV3->MessageSize) ); } else { DEBUG (( @@ -227,10 +228,9 @@ PiMmCpuTpFwRootMmiHandler ( gGuidedEventContext, gGuidedEventContext->MessageLength )); - Status = mMmst->MmiManage ( &gGuidedEventContext->HeaderGuid, - NULL, + mMmHandlerContext, gGuidedEventContext->Data, (UINTN *)(&gGuidedEventContext->MessageLength) ); diff --git a/ArmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.h b/ArmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.h index fc3d81b6e6a1..82029d5e8f21 100644 --- a/ArmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.h +++ b/ArmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.h @@ -36,8 +36,8 @@ extern EFI_MM_CONFIGURATION_PROTOCOL mMmConfig; /** The PI Standalone MM entry point for the CPU driver. - @param [in] EventId The event Id. - @param [in] CommBufferAddr Address of the communication buffer. + @param [in] MmHandlerContext Arm specific Mm handler context. + @param [in] CommBufferAddr Address of the communication buffer. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter was invalid. @@ -47,8 +47,8 @@ extern EFI_MM_CONFIGURATION_PROTOCOL mMmConfig; **/ EFI_STATUS PiMmStandaloneMmCpuDriverEntry ( - IN UINTN EventId, - IN UINTN CommBufferAddr + IN CONST ARM_MM_HANDLER_CONTEXT *MmHandlerContext, + IN UINTN CommBufferAddr ); /** diff --git a/ArmPkg/Include/Library/ArmStandaloneMmCoreEntryPoint.h b/ArmPkg/Include/Library/ArmStandaloneMmCoreEntryPoint.h index 8c86bf0d152b..61aa4afc01bd 100644 --- a/ArmPkg/Include/Library/ArmStandaloneMmCoreEntryPoint.h +++ b/ArmPkg/Include/Library/ArmStandaloneMmCoreEntryPoint.h @@ -29,6 +29,8 @@ #include #include +#include + #define CPU_INFO_FLAG_PRIMARY_CPU 0x00000001 /* diff --git a/ArmPkg/Include/Protocol/PiMmCpuDriverEp.h b/ArmPkg/Include/Protocol/PiMmCpuDriverEp.h index 4b2f61fa0618..bbd13c9a5849 100644 --- a/ArmPkg/Include/Protocol/PiMmCpuDriverEp.h +++ b/ArmPkg/Include/Protocol/PiMmCpuDriverEp.h @@ -12,6 +12,7 @@ #define PI_MM_CPU_DRIVER_EP_H_ #include +#include #define EDKII_PI_MM_CPU_DRIVER_EP_GUID { \ 0x6ecbd5a1, 0xc0f8, 0x4702, { 0x83, 0x01, 0x4f, 0xc2, 0xc5, 0x47, 0x0a, 0x51 } \ @@ -33,8 +34,8 @@ See StandaloneMmPkg/StandaloneMmCoreEntryPoint/Arm/StandaloneMmCoreEntryPoint.c - @param [in] EventId The event Id based on firmware. - @param [in] CommBufferAddr Address of the communication buffer. + @param [in] MmHandlerContext Arm specific Mm handler context. + @param [in] CommBufferAddr Address of the communication buffer. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter was invalid. @@ -45,7 +46,7 @@ typedef EFI_STATUS (EFIAPI *EDKII_PI_MM_CPU_DRIVER_ENTRYPOINT)( - IN UINTN EventId, + IN CONST ARM_MM_HANDLER_CONTEXT *MmHandlerContext, IN UINTN CommBufferAddr ); diff --git a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c index ada19220075d..9dab8844ea8c 100644 --- a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c +++ b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c @@ -869,13 +869,15 @@ DelegatedEventLoop ( IN ARM_SVC_ARGS *EventCompleteSvcArgs ) { - EFI_STATUS Status; - UINT64 Uuid[2]; - VOID *CommData; - FFA_MSG_INFO FfaMsgInfo; - EFI_GUID ServiceGuid; - SERVICE_TYPE ServiceType; - UINTN CommBufferAddr; + EFI_STATUS Status; + UINT64 Uuid[2]; + VOID *CommData; + EFI_GUID ServiceGuid; + SERVICE_TYPE ServiceType; + UINTN CommBufferAddr; + ARM_MM_HANDLER_CONTEXT MmHandlerContext; + FFA_MSG_INFO *FfaMsgInfo; + SPM_MM_MSG_INFO *SpmMmInfo; CommData = NULL; @@ -894,6 +896,8 @@ DelegatedEventLoop ( DEBUG ((DEBUG_INFO, "X6 : 0x%x\n", (UINT32)EventCompleteSvcArgs->Arg6)); DEBUG ((DEBUG_INFO, "X7 : 0x%x\n", (UINT32)EventCompleteSvcArgs->Arg7)); + MmHandlerContext.CommProtocol = CommProtocol; + if (CommProtocol == CommProtocolFfa) { /* * Register Convention for FF-A @@ -907,17 +911,18 @@ DelegatedEventLoop ( * * See Arm Firmware Framework for Arm A-Profile for detail. */ - FfaMsgInfo.SourcePartId = GET_SOURCE_PARTITION_ID (EventCompleteSvcArgs->Arg1); - FfaMsgInfo.DestPartId = GET_DEST_PARTITION_ID (EventCompleteSvcArgs->Arg1); - CommData = &FfaMsgInfo; + FfaMsgInfo = &MmHandlerContext.CtxData.FfaMsgInfo; + FfaMsgInfo->SourcePartId = GET_SOURCE_PARTITION_ID (EventCompleteSvcArgs->Arg1); + FfaMsgInfo->DestPartId = GET_DEST_PARTITION_ID (EventCompleteSvcArgs->Arg1); + CommData = FfaMsgInfo; if (EventCompleteSvcArgs->Arg0 == ARM_FID_FFA_MSG_SEND_DIRECT_REQ) { - FfaMsgInfo.DirectMsgVersion = DirectMsgV1; - ServiceType = ServiceTypeMmCommunication; + FfaMsgInfo->DirectMsgVersion = DirectMsgV1; + ServiceType = ServiceTypeMmCommunication; } else if (EventCompleteSvcArgs->Arg0 == ARM_FID_FFA_MSG_SEND_DIRECT_REQ2) { - FfaMsgInfo.DirectMsgVersion = DirectMsgV2; - Uuid[0] = EventCompleteSvcArgs->Arg2; - Uuid[1] = EventCompleteSvcArgs->Arg3; + FfaMsgInfo->DirectMsgVersion = DirectMsgV2; + Uuid[0] = EventCompleteSvcArgs->Arg2; + Uuid[1] = EventCompleteSvcArgs->Arg3; ConvertUuidToGuid ((GUID *)Uuid, &ServiceGuid); ServiceType = GetServiceType (&ServiceGuid); } else { @@ -930,10 +935,10 @@ DelegatedEventLoop ( goto ExitHandler; } - FfaMsgInfo.ServiceType = ServiceType; + FfaMsgInfo->ServiceType = ServiceType; if (ServiceType == ServiceTypeMmCommunication) { - if (FfaMsgInfo.DirectMsgVersion == DirectMsgV1) { + if (FfaMsgInfo->DirectMsgVersion == DirectMsgV1) { CommBufferAddr = EventCompleteSvcArgs->Arg3; } else { CommBufferAddr = EventCompleteSvcArgs->Arg4; @@ -974,8 +979,11 @@ DelegatedEventLoop ( goto ExitHandler; } - CommBufferAddr = EventCompleteSvcArgs->Arg1; - ServiceType = ServiceTypeMmCommunication; + SpmMmInfo = &MmHandlerContext.CtxData.SpmMmInfo; + ServiceType = ServiceTypeMmCommunication; + CommBufferAddr = EventCompleteSvcArgs->Arg1; + SpmMmInfo->ServiceType = ServiceType; + SpmMmInfo->SecureRequest = IsSecureMmCommBufferAddr (CommBufferAddr); } if (ServiceType == ServiceTypeMmCommunication) { @@ -990,7 +998,7 @@ DelegatedEventLoop ( } } - Status = CpuDriverEntryPoint ((UINTN)ServiceType, CommBufferAddr); + Status = CpuDriverEntryPoint (&MmHandlerContext, CommBufferAddr); if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, From 1c836a89b8ff2a0d05c6fbed945cf03c4cc03261 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Mon, 15 Sep 2025 15:46:38 +0100 Subject: [PATCH 1037/1172] ArmPkg/StandaloneMmCpu: rename gGuidedEventContext to mGuidedEventContext gGuidedEventContext is only used in EventHandle.c. Therefore, make it STATIC, rename to mGuidedEventContext, and remove the extern declaration. Signed-off-by: Yeoreum Yun --- ArmPkg/Drivers/StandaloneMmCpu/EventHandle.c | 30 +++++++++---------- .../Drivers/StandaloneMmCpu/StandaloneMmCpu.h | 1 - 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/ArmPkg/Drivers/StandaloneMmCpu/EventHandle.c b/ArmPkg/Drivers/StandaloneMmCpu/EventHandle.c index c2bbaf17e8ff..0971581ba4ed 100644 --- a/ArmPkg/Drivers/StandaloneMmCpu/EventHandle.c +++ b/ArmPkg/Drivers/StandaloneMmCpu/EventHandle.c @@ -39,7 +39,7 @@ MmFoundationEntryRegister ( // maintained in single global variable because StandaloneMm is UP-migratable // (which means it cannot run concurrently) // -EFI_MM_COMMUNICATE_HEADER *gGuidedEventContext = NULL; +STATIC EFI_MM_COMMUNICATE_HEADER *mGuidedEventContext = NULL; STATIC CONST ARM_MM_HANDLER_CONTEXT *mMmHandlerContext = NULL; EFI_MM_CONFIGURATION_PROTOCOL mMmConfig = { @@ -107,16 +107,16 @@ PiMmStandaloneMmCpuDriverEntry ( Status = mMmst->MmAllocatePool ( EfiRuntimeServicesData, CommBufferSize, - (VOID **)&gGuidedEventContext + (VOID **)&mGuidedEventContext ); if (EFI_ERROR (Status)) { - gGuidedEventContext = NULL; + mGuidedEventContext = NULL; DEBUG ((DEBUG_ERROR, "%a: Mem alloc failed\n", __func__)); return Status; } - CopyMem (gGuidedEventContext, (CONST VOID *)CommBufferAddr, CommBufferSize); + CopyMem (mGuidedEventContext, (CONST VOID *)CommBufferAddr, CommBufferSize); mMmHandlerContext = MmHandlerContext; ZeroMem (&MmEntryPointContext, sizeof (EFI_MM_ENTRY_CONTEXT)); @@ -135,11 +135,11 @@ PiMmStandaloneMmCpuDriverEntry ( mMmEntryPoint (&MmEntryPointContext); // Free the memory allocation done earlier and reset the per-cpu context - CopyMem ((VOID *)CommBufferAddr, (CONST VOID *)gGuidedEventContext, CommBufferSize); + CopyMem ((VOID *)CommBufferAddr, (CONST VOID *)mGuidedEventContext, CommBufferSize); - Status = mMmst->MmFreePool ((VOID *)gGuidedEventContext); + Status = mMmst->MmFreePool ((VOID *)mGuidedEventContext); ASSERT_EFI_ERROR (Status); - gGuidedEventContext = NULL; + mGuidedEventContext = NULL; mMmHandlerContext = NULL; return Status; @@ -197,16 +197,16 @@ PiMmCpuTpFwRootMmiHandler ( ASSERT (CommBuffer == NULL); ASSERT (CommBufferSize == NULL); - if (gGuidedEventContext == NULL) { + if (mGuidedEventContext == NULL) { return EFI_NOT_FOUND; } if (CompareGuid ( - &gGuidedEventContext->HeaderGuid, + &mGuidedEventContext->HeaderGuid, &gEfiMmCommunicateHeaderV3Guid )) { - GuidedEventContextV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)gGuidedEventContext; + GuidedEventContextV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)mGuidedEventContext; DEBUG (( DEBUG_INFO, "CommBuffer - 0x%x, CommBufferSize - 0x%llx, MessageSize - 0x%llx\n", @@ -225,14 +225,14 @@ PiMmCpuTpFwRootMmiHandler ( DEBUG (( DEBUG_INFO, "CommBuffer - 0x%x, CommBufferSize - 0x%x\n", - gGuidedEventContext, - gGuidedEventContext->MessageLength + mGuidedEventContext, + mGuidedEventContext->MessageLength )); Status = mMmst->MmiManage ( - &gGuidedEventContext->HeaderGuid, + &mGuidedEventContext->HeaderGuid, mMmHandlerContext, - gGuidedEventContext->Data, - (UINTN *)(&gGuidedEventContext->MessageLength) + mGuidedEventContext->Data, + (UINTN *)(&mGuidedEventContext->MessageLength) ); } diff --git a/ArmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.h b/ArmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.h index 82029d5e8f21..1dfa8b41acdf 100644 --- a/ArmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.h +++ b/ArmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.h @@ -30,7 +30,6 @@ extern EFI_MM_CPU_PROTOCOL mMmCpuState; // // MM event handling specific declarations // -extern EFI_MM_COMMUNICATE_HEADER *gGuidedEventContext; extern EFI_MM_CONFIGURATION_PROTOCOL mMmConfig; /** From 3c3cc89e7a77adca25431b7403ed83580deb822e Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Wed, 15 Jan 2025 12:17:59 +0000 Subject: [PATCH 1038/1172] ArmPkg/Include/IndustryStandard: introduce firmware update feature headers The Platform Security Firmware Update specification, 1.0 for A-profile (https://developer.arm.com/documentation/den0118/latest) describes a standard mechanism for performing firmware updates on Arm platform. This mechanism utilises the Arm Firmware Framework for Arm A-profile specification to transfer the firmware update binaries from the Normal World to the Secure World. An update agent on the Secure world then updates the flash area with the new update image. Add related headers for firmware update feature. Signed-off-by: Yeoreum Yun --- .../Include/IndustryStandard/PsaMmFwUpdate.h | 492 ++++++++++++++++++ 1 file changed, 492 insertions(+) create mode 100644 ArmPkg/Include/IndustryStandard/PsaMmFwUpdate.h diff --git a/ArmPkg/Include/IndustryStandard/PsaMmFwUpdate.h b/ArmPkg/Include/IndustryStandard/PsaMmFwUpdate.h new file mode 100644 index 000000000000..9d6c7324d66c --- /dev/null +++ b/ArmPkg/Include/IndustryStandard/PsaMmFwUpdate.h @@ -0,0 +1,492 @@ +/** @file + Firmware Update GUID header file. + + Copyright (c) 2024, Arm Limited. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - Platform Security Firmware Update for the A-profile specification, 1.0 + (https://developer.arm.com/documentation/den0118/latest) + + @par Glossary: + - FW - Firmware + - FWU - Firmware Update + - FWS - Firmware Storage + - PSA - Platform Security update for the A-profile specification + - IMG - Image + - MM - Management Mode + - PROP - Property + +**/ + +#ifndef PSA_MM_FW_UPDATE_H_ +#define PSA_MM_FW_UPDATE_H_ + +/** Macros defining the firmware store update ABI fuction Id. + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, 3.4 "Firmware Store Update ABI" + */ +#define PSA_MM_FWU_COMMAND_DISCOVER 0 +#define PSA_MM_FWU_COMMAND_BEGIN_STAGING 16 +#define PSA_MM_FWU_COMMAND_END_STAGING 17 +#define PSA_MM_FWU_COMMAND_CANCEL_STAGING 18 +#define PSA_MM_FWU_COMMAND_OPEN 19 +#define PSA_MM_FWU_COMMAND_WRITE_STREAM 20 +#define PSA_MM_FWU_COMMAND_READ_STREAM 21 +#define PSA_MM_FWU_COMMAND_COMMIT 22 +#define PSA_MM_FWU_COMMAND_ACCEPT_IMAGE 23 +#define PSA_MM_FWU_COMMAND_SELECT_PREVIOUS 24 +#define PSA_MM_FWU_COMMAND_MAX_ID 25 + +/** Firmware Update Protocol error codes. + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, 3.4.2.11 "Return Status" + */ +#define PSA_MM_FWU_SUCCESS 0 +#define PSA_MM_FWU_UNKNOWN (-1) +#define PSA_MM_FWU_BUSY (-2) +#define PSA_MM_FWU_OUT_OF_BOUNDS (-3) +#define PSA_MM_FWU_AUTH_FAIL (-4) +#define PSA_MM_FWU_NO_PERMISSION (-5) +#define PSA_MM_FWU_DENIED (-6) +#define PSA_MM_FWU_RESUME (-7) +#define PSA_MM_FWU_NOT_AVAILABLE (-8) + +/** Macros defining the firmware store update Agent Service Status. + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, 3.4.2.1 "fwu_discover" + */ +#define SERVICE_STATUS_OPERATIVE 0 +#define SERVICE_STATUS_ERR_INIT (-1) + +/** Macros defining flags' returns value of fwu_discover. + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, 3.4.2.1 "fwu_discover" + */ +#define FWU_DISCOVER_FLAGS_PARTIAL_UPDATE_SUPPORT BIT0 + +/** Macros defining IMG_INFO_ENTRY's ClientPermissions's bit values. + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, 3.3.1 "Image directory" + */ +#define FWU_ACCEPT_AFTER_ACTIVATION BIT2 +#define FWU_READ_PERMISSION BIT1 +#define FWU_WRITE_PERMISSION BIT0 + +#define FWU_INVALID_HANDLE 0xffffffffU + +/** Guid to open Firmware Image Directory via fwu_open + Cf Platform Security Firmware Update for the A-profile specification, + 1.0 Table A3.5 or A3.8 Image properties in given FW bank version 1 & 2. + */ +#define FWU_IMAGE_UNACCEPTED 0 +#define FWU_IMAGE_ACCEPTED BIT0 + +/** Firmware bank state for Metadata version 2 + Cf Platform Security Firmware Update for the A-profile specification, + Table A3.2: Metadata version 2 + */ +#define FWU_BANK_STATE_INVALID 0xFF +#define FWU_BANK_STATE_VALID 0xFE +#define FWU_BANK_STATE_ACCEPTED 0xFC + +/** Maximum number of banks for Metadata version 2 + Cf Platform Security Firmware Update for the A-profile specification, + Table A3.2: Metadata version 2 + */ +#define FWU_METADATA_V2_MAX_NUM_BANKS 4 + +/** Enum value defining op_type used in fwu_open. + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, 3.4.2.5 "fwu_open" + */ +typedef enum { + FwuOpStreamRead, + FwuOpStreamWrite, + FwuOpStreamMax +} FWU_OP_TYPE; + +/** Below data structure is used for MM communication between PsaFwuLib and + Firmware Update Service Agent. + */ + +#pragma pack (1) + +/** Below data structure is used for MM communication between PsaFwuLib and + Firmware Update Service Agent. + */ + +/** Firmware update protocol parameter header for request/return. + */ +typedef union { + /// Firmware update protocol function id. + UINT32 Command; + + /// Firmware update protocol function's return value. + INT32 ResponseStatus; +} PSA_MM_FWU_PARAMETER_HEADER; + +/** Firmware update protocol communication data structure. + */ +typedef struct { + /// Parameter Header. + PSA_MM_FWU_PARAMETER_HEADER Header; + + /// Request or Return Data. + UINT8 Buffer[]; +} PSA_MM_FWU_CMD_DATA; + +/** Return data structure of fwu_discover operation. + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, 3.4.2.1 "fwu_discover" + */ +typedef struct { + /// Statue of Service provider. + UINT16 ServiceStatus; + + /// The ABI major version. + UINT8 VersionMajor; + + /// The ABI minor version. + UINT8 VersionMinor; + + /// The Offset (in bytes) of the function presence array. + UINT16 OffFunctionPresence; + + /// The number of entries in the function presence array. + UINT16 NumFunc; + + /// The maximum number of bytes that payload can contain. + UINT64 MaxPayloadSize; + + /// The update capabilities. See FWU_DISCOVER_FLAGS_* + UINT32 Flags; + + /// The Vendor specific capabilities. + UINT32 VendorSpecificFlags; + + /// Array of bytes indicating functions that are implemented + UINT8 FunctionPresence[]; +} PSA_MM_FWU_DISCOVER_RESP; + +/** Request data structure of fwu_begin_staging operation. + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, 3.4.2.2 "fwu_begin_staging" + */ +typedef struct { + /// Reserved. Must be zero. + UINT32 Reserved; + + /// Vendor specific staging flags. + UINT32 VendorFlags; + + /// The number of elements in the update_guid array. + UINT32 PartialUpdateCount; + + /// An array of image type GUIDs will be updated. + EFI_GUID UpdateGuid[]; +} PSA_MM_FWU_BEGIN_STAGING_REQ; + +/** Request data structure of fwu_open operation. + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, 3.4.2.5 "fwu_open" + */ +typedef struct { + /// Guid of the image to be opened. + EFI_GUID ImageTypeGuid; + + /// The operation type. + UINT8 OperationType; +} PSA_MM_FWU_OPEN_REQ; + +/** Return data structure of fwu_open operation. + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, 3.4.2.5 "fwu_open" + */ +typedef struct { + /// Image Handle. + UINT32 Handle; +} PSA_MM_FWU_OPEN_RESP; + +/** Request data structure of fwu_read_stream operation. + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, 3.4.2.7 "fwu_read_stream" + */ +typedef struct { + /// Open Image Handle. + UINT32 Handle; +} PSA_MM_FWU_READ_STREAM_REQ; + +/** Return data structure of fwu_read_stream operation. + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, 3.4.2.7 "fwu_read_stream" + */ +typedef struct { + /// Read bytes + UINT32 ReadBytes; + + /// Total Image Size. + UINT32 TotalBytes; + + /// Read Data sized with ReadBytes. + UINT8 Payload[]; +} PSA_MM_FWU_READ_STREAM_RESP; + +/** Request data structure of fwu_write_stream operation. + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, 3.4.2.6 "fwu_write_stream" + */ +typedef struct { + /// Open Image Handle. + UINT32 Handle; + + /// Write Data Size. + UINT32 DataLen; + + /// Write Data. + UINT8 Payload[]; +} PSA_MM_FWU_WRITE_STREAM_REQ; + +/** Request data structure of fwu_commit operation. + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, 3.4.2.8 "fwu_commit" + */ +typedef struct { + /// Open Image Handle. + UINT32 Handle; + + /// If positive, Client requests the image to be marked as unaccepted. + UINT32 AcceptanceReq; + + /** Hint for maximum time (in ns) Update Agent can execute continuously without + yielding back to the Client. + */ + UINT32 MaxAtomicLen; +} PSA_MM_FWU_COMMIT_REQ; + +/** Return data structure of fwu_commit operation. + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, 3.4.2.8 "fwu_commit" + */ +typedef struct { + /// Unit of work already completed by the Update Agent. + UINT32 Progress; + + /// Units of work the Update Agent must perform until fwu_commit returns success. + UINT32 TotalWork; +} PSA_MM_FWU_COMMIT_RESP; + +/** Return data structure of fwu_accept_image operation. + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, 3.4.2.9 "fwu_accept_image" + */ +typedef struct { + /// Reserved, must be zero. + UINT32 Reserved; + + /// Image type guid to be accepted. + EFI_GUID ImageTypeGuid; +} PSA_MM_FWU_ACCEPT_IMAGE_REQ; + +/** Image information entry describing Image. + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, 3.3 "Firmware Store management" + */ +typedef struct { + /// Guid identifying the image type + EFI_GUID ImgTypeGuid; + + /// Access permission for image. + UINT32 ClientPermissions; + + /// Maximum image size. + UINT32 ImgMaxSize; + + /// Lowest version of the image that can execute on platform. + UINT32 LowestAcceptedVersion; + + /// Image version in boot index. + UINT32 ImgVersion; + + /// Accept status. + UINT32 Accepted; + + /// Reserved, Must be zero. + UINT32 Reserved; +} PSA_MM_FWU_IMG_INFO_ENTRY; + +/** Image Directory describing detail on the firmware image. + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, 3.3 "Firmware Store management" + */ +typedef struct { + /// The version of field in the ImageInfoEntry. + UINT32 DirectoryVersion; + + /// The Offset of the ImageInfoEntry. + UINT32 ImgInfoOffset; + + /// The number of entries in the ImageInfoEntry. + UINT32 NumImages; + + /// Stating if the platform booted with the active bank. + UINT32 CorrectBoot; + + /// The size in bytes of an entry in the ImgInfoEntry. + UINT32 ImgInfoSize; + + /// Reserved, Must be zero. + UINT32 Reserved; + + /// Image info entry array. + PSA_MM_FWU_IMG_INFO_ENTRY ImgInfoEntry[]; +} PSA_MM_FWU_IMAGE_DIRECTORY; + +/** FWU Metadata common header. + */ +typedef struct { + /// Metadata CRC value. + UINT32 Crc32; + + /// Metadata version. + UINT32 Version; + + /// Bank index with which device boots. + UINT32 ActiveIndex; + + /// Previous bank index with which device booted successfully. + UINT32 PreviousActiveIndex; +} PSA_MM_FWU_METADATA_COMMON_HEADER; + +/** FWU image entry common header. + */ +typedef struct { + /// GUID identifying the image type. + EFI_GUID ImageTypeGuid; + + /// GUID of the storage volume where the image is located. + EFI_GUID LocationGuid; +} PSA_MM_FWU_IMAGE_ENTRY_COMMON_HEADER; + +/** Image properties in a given FW bank version 1 (image bank info). + Cf Platform Security Firmware Update for the A-profile specification, + Table A3.5 & Table A3.8: Image Properties + */ +typedef struct { + /// UUID of the image in this bank + EFI_GUID ImageGuid; + + /* [0]: bit describing the image acceptance status + * 1 means the image is accepted + * [31:1]: MBZ + */ + UINT32 Accepted; + + /// reserved (MBZ) + UINT32 Reserved; +} PSA_MM_FWU_IMAGE_PROPERTIES; + +/** Metadata image entry version 2. + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, A3.4 "Metadata image entry version 2" + */ +typedef struct { + /// Image entry common header + PSA_MM_FWU_IMAGE_ENTRY_COMMON_HEADER Header; + + /// Properties of images with img_type_uuid in the different FW banks. + PSA_MM_FWU_IMAGE_PROPERTIES ImageBankInfo[]; +} PSA_MM_FWU_IMAGE_ENTRY_V2; + +typedef struct { + /// Number of banks. + UINT8 NumBanks; + + /// Reserved (MBZ). + UINT8 Reserved; + + /// Number of images per banks. + UINT16 NumImages; + + /// Image Entry Size + UINT16 ImageEntrySize; + + /// Bank Info Entry Size; + UINT16 BankInfoEntrySize; + + /// Array of image entries; + PSA_MM_FWU_IMAGE_ENTRY_V2 ImageEntry[]; +} PSA_MM_FWU_FW_STORE_DESC_V2; + +/** FWU metadata filled by the updater and consumed by TF-A for + various purposes as below: + 1. Get active FW bank. + 2. Rollback to previous working FW bank. + 3. Get properties of all images present in all banks. + + Cf Platform Security Firmware Update for the A-profile specification, + 1.0, A.3.2 "Metadata version 2" + */ +typedef struct { + /// Metadata Common Header. + PSA_MM_FWU_METADATA_COMMON_HEADER Header; + + /// Metadata size + UINT32 MetadataSize; + + /// The offset, from the start of this data structure, to FwStoreDesc; + UINT16 DescriptorOffset; + + /// reserved (MBZ). + UINT16 Reserved_0; + + /// Bank State. + UINT8 BankState[FWU_METADATA_V2_MAX_NUM_BANKS]; + + /// reserved (MBZ). + UINT32 Reserved_1; + + /// Image entry information + PSA_MM_FWU_FW_STORE_DESC_V2 FwStoreDesc[]; +} PSA_MM_FWU_METADATA_V2; + +#pragma pack () + +/** Helper macro for getting flexible data. + */ +#define GET_FWU_DATA_BUFFER(Data) \ + ((VOID *)((UINT8 *) Data + sizeof (*Data))) + +/** Helper macro for getting Firmware Storage Descriptor v2 from Metadata v2. + */ +#define GET_FWU_FW_STORE_DESC_V2(Metadata) \ + ((PSA_MM_FWU_FW_STORE_DESC_V2 *) \ + ((VOID *) Metadata + ((PSA_MM_FWU_METADATA_V2 *) Metadata)->DescriptorOffset)) \ + + +/** Helper macro for getting Image Entry v2 from Firmware Storage Descriptor v2. + */ +#define GET_FWU_IMAGE_ENTRY_V2(FwFwsStoreDesc, Idx) \ + ((PSA_MM_FWU_IMAGE_ENTRY_V2 *) \ + ((VOID *) FwFwsStoreDesc + OFFSET_OF (PSA_MM_FWU_FW_STORE_DESC_V2, ImageEntry) + \ + ((Idx) * (OFFSET_OF (PSA_MM_FWU_IMAGE_ENTRY_V2, ImageBankInfo) + \ + (sizeof (PSA_MM_FWU_IMAGE_PROPERTIES) * (FwFwsStoreDesc->NumBanks)))))) + +/** Helper macro for getting Image Bank Infofrom Image entry v2 + */ +#define GET_FWU_IMAGE_BANK_INFO_V2(ImageEntry, Idx) \ + ((PSA_MM_FWU_IMAGE_PROPERTIES *) \ + ((VOID *) ImageEntry + OFFSET_OF (PSA_MM_FWU_IMAGE_ENTRY_V2, ImageBankInfo) + \ + ((Idx) * (sizeof (PSA_MM_FWU_IMAGE_PROPERTIES))))) + +/** Helper macro for getting Image Info Entry from Image Directory. + */ +#define GET_FWU_IMG_INFO_ENTRY(ImageDirectory, Idx) \ + ((PSA_MM_FWU_IMG_INFO_ENTRY *) \ + ((UINT8 *) ImageDirectory + sizeof (PSA_MM_FWU_IMAGE_DIRECTORY) + \ + ((Idx) * (sizeof (PSA_MM_FWU_IMG_INFO_ENTRY))))) + +extern EFI_GUID gEfiMmFwuCommunicationGuid; + +#endif // PSA_MM_FW_UPDATE_H_ From d152cda4aff8813a0c35b18298ff255b9984f421 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Wed, 15 Jan 2025 13:54:06 +0000 Subject: [PATCH 1039/1172] ArmPkg: add firmware update feature related GUID Add firmware update feature related GUID used in UEFI/StandaloneMm. Signed-off-by: Yeoreum Yun --- ArmPkg/ArmPkg.dec | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec index 245b441fc590..e46e3864f10a 100644 --- a/ArmPkg/ArmPkg.dec +++ b/ArmPkg/ArmPkg.dec @@ -89,6 +89,12 @@ gArmTransferListHobGuid = { 0xebe7bae8, 0xfe18, 0x43c5, { 0xbf, 0x3f, 0xf2, 0xb1, 0xaf, 0xb2, 0xdf, 0xb8 } } + gPsaFwuUpdateAgentGuid = { 0x6823a838, 0x1b06, 0x470e, { 0x97, 0x74, 0x0c, 0xce, 0x8b, 0xfb, 0x53, 0xfd } } + + gPsaFwuImageDirectoryGuid = { 0xdeee58d9, 0x5147, 0x4ad3, { 0xa2, 0x90, 0x77, 0x66, 0x6e, 0x23, 0x41, 0xa5 } } + + gPsaFwuMetadataGuid = { 0x8a7a84a0, 0x8387, 0x40f6, { 0xab, 0x41, 0xa8, 0xb9, 0xa5, 0xa6, 0x0d, 0x23 } } + [Protocols.common] ## Arm System Control and Management Interface(SCMI) Base protocol ## ArmPkg/Include/Protocol/ArmScmiBaseProtocol.h From f808bc1e60dfdb364976361a6d3f15e35e25386e Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Wed, 15 Jan 2025 12:32:50 +0000 Subject: [PATCH 1040/1172] ArmPkg/Library: introduce FmpDeviceLib using Firmware update ABI FmpDeviceLib is platform specific library which is used to update firmware using CapsuleUpdate framework via FmpDevicePkg in edk2. According to Platform Security Firmware Update for A-profile: https://developer.arm.com/documentation/den0118/latest, FmpPsaFwuLib is implementation of FmpDeviceLib using PsaFwuLib implementing firmware update ABI. Here is brief view how it works UEFI (Normal world) | StandaloneMm (Secure world) ---------------------------------|-------------------------------------- | +-------+ | ---------| Fws | | | +-------+ +------------------+ | | (Gpt parted) | FmpDevicePkg | | Read /Write Image | +------------------+ | | | | +-------------------+ | SetTheImage and etc | | FwsPlatformLib | | progress via FmpDeviceLib | +-------------------+ | | | | | Parsing Request | Access Fws via | | | FwsPlatformLib | | | | | | -> +---------------------+ PSA ABI (FF-A) +-------------------+ | FmpDevicePsaFwuLib |<------------------> | FwuSmm.c | | (FmpDeviceLib) | PSA Error code +-------------------+ +---------------------+ | Signed-off-by: Yeoreum Yun --- ArmPkg/ArmPkg.ci.yaml | 1 + ArmPkg/ArmPkg.dec | 7 + ArmPkg/ArmPkg.dsc | 2 + .../FmpDevicePsaFwuLib/FmpDevicePsaFwuLib.c | 1265 +++++++++++++++++ .../FmpDevicePsaFwuLib/FmpDevicePsaFwuLib.inf | 68 + ArmPkg/Library/FmpDevicePsaFwuLib/PsaFwuLib.c | 1073 ++++++++++++++ ArmPkg/Library/FmpDevicePsaFwuLib/PsaFwuLib.h | 273 ++++ 7 files changed, 2689 insertions(+) create mode 100644 ArmPkg/Library/FmpDevicePsaFwuLib/FmpDevicePsaFwuLib.c create mode 100644 ArmPkg/Library/FmpDevicePsaFwuLib/FmpDevicePsaFwuLib.inf create mode 100644 ArmPkg/Library/FmpDevicePsaFwuLib/PsaFwuLib.c create mode 100644 ArmPkg/Library/FmpDevicePsaFwuLib/PsaFwuLib.h diff --git a/ArmPkg/ArmPkg.ci.yaml b/ArmPkg/ArmPkg.ci.yaml index 2da2d92455d9..14da56132e9e 100644 --- a/ArmPkg/ArmPkg.ci.yaml +++ b/ArmPkg/ArmPkg.ci.yaml @@ -47,6 +47,7 @@ "ArmPlatformPkg/ArmPlatformPkg.dec", "ArmPkg/ArmPkg.dec", "EmbeddedPkg/EmbeddedPkg.dec", + "FmpDevicePkg/FmpDevicePkg.dec", "MdeModulePkg/MdeModulePkg.dec", "MdePkg/MdePkg.dec", "ShellPkg/ShellPkg.dec", diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec index e46e3864f10a..4c8561936b0a 100644 --- a/ArmPkg/ArmPkg.dec +++ b/ArmPkg/ArmPkg.dec @@ -251,6 +251,13 @@ gArmTokenSpaceGuid.PcdSystemBiosRelease|0xFFFF|UINT16|0x30000058 gArmTokenSpaceGuid.PcdEmbeddedControllerFirmwareRelease|0xFFFF|UINT16|0x30000059 + # + # For FmpDevicePsaFwuLib. + # + gArmTokenSpaceGuid.PcdSystemFirmwareFmpLowestSupportedVersion|0x00000000|UINT32|0x30000060 + gArmTokenSpaceGuid.PcdSystemFirmwareFmpVersion|0x00000000|UINT32|0x30000061 + gArmTokenSpaceGuid.PcdSystemFirmwareFmpVersionString|""|VOID*|0x30000062 + [PcdsFixedAtBuild.common, PcdsDynamic.common] # ARM Architectural Timer Interrupt(GIC PPI) numbers gArmTokenSpaceGuid.PcdArmArchTimerSecIntrNum|29|UINT32|0x00000035 diff --git a/ArmPkg/ArmPkg.dsc b/ArmPkg/ArmPkg.dsc index 5297935065b7..7374f877a05e 100644 --- a/ArmPkg/ArmPkg.dsc +++ b/ArmPkg/ArmPkg.dsc @@ -154,6 +154,8 @@ ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.inf + ArmPkg/Library/FmpDevicePsaFwuLib/FmpDevicePsaFwuLib.inf + ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.inf ArmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.inf diff --git a/ArmPkg/Library/FmpDevicePsaFwuLib/FmpDevicePsaFwuLib.c b/ArmPkg/Library/FmpDevicePsaFwuLib/FmpDevicePsaFwuLib.c new file mode 100644 index 000000000000..1ba6a7a3a512 --- /dev/null +++ b/ArmPkg/Library/FmpDevicePsaFwuLib/FmpDevicePsaFwuLib.c @@ -0,0 +1,1265 @@ +/** + + Copyright (c) 2024, Arm Ltd. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - Platform Security Firmware Update for the A-profile Specification 1.0 + (https://developer.arm.com/documentation/den0118/latest) + + @par Glossary: + - FW - Firmware + - FWU - Firmware Update + - PSA - Platform Security update for the A-profile specification + - FMP - Firmware Management Protocol Device. + +**/ +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "PsaFwuLib.h" + +#define IS_FWU_FUNC_SUPPORTED(Id) ((BOOLEAN)((mSupportFunction & (1ULL << Id)) != 0)) + +STATIC UINT64 mSupportFunction = 0; +STATIC UINT32 mFwuFlags = 0; +STATIC UINT32 mVendorFlags = 0; +STATIC UINT64 mMaxPayloadSize; +STATIC EFI_EVENT mEfiVirtualAddressChangeEvent; +STATIC EFI_EVENT mEfiReadyToBootEvent; +STATIC PSA_MM_FWU_IMAGE_DIRECTORY *mImageDirectory = NULL; +STATIC PSA_MM_FWU_IMG_INFO_ENTRY *mImageEntry = NULL; +STATIC UINTN mImageDirectorySize; +STATIC BOOLEAN mOnRuntime = FALSE; +STATIC BOOLEAN mUpdateDisabled = FALSE; + +/** + * Convert Image Directory's address on VirtualAddress Change Event. + * + * @param [in] Event Registered VirtualAddress Change Event. + * @param [in] Context Additional Data. + * + */ +STATIC +VOID +EFIAPI +FmpPsaVirtualAddressChangeEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + mOnRuntime = TRUE; + PsaFwuVirtualAddressChangeEvent (Event, Context); + gRT->ConvertPointer (0x00, (VOID **)&mImageDirectory); + gRT->ConvertPointer (0x00, (VOID **)&mImageEntry); +} + +/** + * Check if firmware update is supported. + * + * @retval EFI_SUCCESS Firmware update is supported. + * @retval EFI_UNSUPPORTED Firmware update is not supported. + */ +STATIC +EFI_STATUS +EFIAPI +CheckFwuSupport ( + IN VOID + ) +{ + EFI_STATUS Status; + UINT16 *FunctionPresence; + PSA_MM_FWU_DISCOVER_RESP *FwuInfo; + UINT16 Idx; + + ASSERT ((sizeof (mSupportFunction) * 8) >= PSA_MM_FWU_COMMAND_MAX_ID); + + Status = FwuDiscovery (&FwuInfo); + if (EFI_ERROR (Status)) { + return Status; + } + + if (FwuInfo->NumFunc >= PSA_MM_FWU_COMMAND_MAX_ID) { + return EFI_UNSUPPORTED; + } + + if (FwuInfo->ServiceStatus != SERVICE_STATUS_OPERATIVE) { + DEBUG ((DEBUG_ERROR, "Fwu service isn't operative!\n")); + return EFI_UNSUPPORTED; + } + + FunctionPresence = (UINT16 *)GET_FWU_DATA_BUFFER (FwuInfo); + + for (Idx = 0; Idx < FwuInfo->NumFunc; Idx++) { + mSupportFunction |= 1ULL << FunctionPresence[Idx]; + } + + if ((!IS_FWU_FUNC_SUPPORTED (PSA_MM_FWU_COMMAND_BEGIN_STAGING)) || + (!IS_FWU_FUNC_SUPPORTED (PSA_MM_FWU_COMMAND_END_STAGING)) || + (!IS_FWU_FUNC_SUPPORTED (PSA_MM_FWU_COMMAND_CANCEL_STAGING)) || + (!IS_FWU_FUNC_SUPPORTED (PSA_MM_FWU_COMMAND_OPEN)) || + (!IS_FWU_FUNC_SUPPORTED (PSA_MM_FWU_COMMAND_WRITE_STREAM)) || + (!IS_FWU_FUNC_SUPPORTED (PSA_MM_FWU_COMMAND_READ_STREAM)) || + (!IS_FWU_FUNC_SUPPORTED (PSA_MM_FWU_COMMAND_COMMIT)) || + (!IS_FWU_FUNC_SUPPORTED (PSA_MM_FWU_COMMAND_ACCEPT_IMAGE)) || + (!IS_FWU_FUNC_SUPPORTED (PSA_MM_FWU_COMMAND_SELECT_PREVIOUS))) + { + DEBUG ((DEBUG_ERROR, "Error: Required FWU function(s) not supported.\n")); + DEBUG ((DEBUG_ERROR, "\tFWU_BEGIN_STATING: %s\n", IS_FWU_FUNC_SUPPORTED (PSA_MM_FWU_COMMAND_BEGIN_STAGING) ? "Supported" : "Unsupported")); + DEBUG ((DEBUG_ERROR, "\tFWU_END_STATING: %s\n", IS_FWU_FUNC_SUPPORTED (PSA_MM_FWU_COMMAND_END_STAGING) ? "Supported" : "Unsupported")); + DEBUG ((DEBUG_ERROR, "\tFWU_CANCEL_STATING: %s\n", IS_FWU_FUNC_SUPPORTED (PSA_MM_FWU_COMMAND_CANCEL_STAGING) ? "Supported" : "Unsupported")); + DEBUG ((DEBUG_ERROR, "\tFWU_OPEN: %s\n", IS_FWU_FUNC_SUPPORTED (PSA_MM_FWU_COMMAND_OPEN) ? "Supported" : "Unsupported")); + DEBUG ((DEBUG_ERROR, "\tFWU_WRITE_STREAM: %s\n", IS_FWU_FUNC_SUPPORTED (PSA_MM_FWU_COMMAND_WRITE_STREAM) ? "Supported" : "Unsupported")); + DEBUG ((DEBUG_ERROR, "\tFWU_READ_STREAM: %s\n", IS_FWU_FUNC_SUPPORTED (PSA_MM_FWU_COMMAND_READ_STREAM) ? "Supported" : "Unsupported")); + DEBUG ((DEBUG_ERROR, "\tFWU_COMMIT: %s\n", IS_FWU_FUNC_SUPPORTED (PSA_MM_FWU_COMMAND_COMMIT) ? "Supported" : "Unsupported")); + DEBUG ((DEBUG_ERROR, "\tFWU_ACCEPT_IMAGE: %s\n", IS_FWU_FUNC_SUPPORTED (PSA_MM_FWU_COMMAND_ACCEPT_IMAGE) ? "Supported" : "Unsupported")); + DEBUG ((DEBUG_ERROR, "\tFWU_SELECT_PREVIOUS: %s\n", IS_FWU_FUNC_SUPPORTED (PSA_MM_FWU_COMMAND_SELECT_PREVIOUS) ? "Supported" : "Unsupported")); + return EFI_UNSUPPORTED; + } + + mFwuFlags = FwuInfo->Flags; + mVendorFlags = FwuInfo->VendorSpecificFlags; + mMaxPayloadSize = FwuInfo->MaxPayloadSize; + + DEBUG ((DEBUG_INFO, "FmpPsaFwuLib: ServiceStatus: %d\n", FwuInfo->ServiceStatus)); + DEBUG ((DEBUG_INFO, "FmpPsaFwuLib: VersionMajor: %d\n", FwuInfo->VersionMajor)); + DEBUG ((DEBUG_INFO, "FmpPsaFwuLib: VersionMinor: %d\n", FwuInfo->VersionMinor)); + DEBUG ((DEBUG_INFO, "FmpPsaFwuLib: mFwuFlags: %d\n", FwuInfo->Flags)); + DEBUG ((DEBUG_INFO, "FmpPsaFwuLib: mVendorFlags: %d\n", FwuInfo->VendorSpecificFlags)); + DEBUG ((DEBUG_INFO, "FmpPsaFwuLib: mMaxPayloadSize: %d\n", FwuInfo->MaxPayloadSize)); + + return EFI_SUCCESS; +} + +/** + * Get firmware update image directory. + * + * @retval EFI_SUCCESS + * @retval Others Fail to get Image Directory Information. + */ +STATIC +EFI_STATUS +EFIAPI +GetFwuImageDirectory ( + IN VOID + ) +{ + EFI_STATUS Status; + EFI_STATUS CloseStatus; + UINT32 Handle; + UINT32 ReadBytes; + UINT32 TotalBytes; + UINT32 Progress; + UINT32 TotalWork; + VOID *Buffer; + PSA_MM_FWU_IMG_INFO_ENTRY *ImgEntry; + UINTN Idx; + + Status = FwuOpen (&gPsaFwuImageDirectoryGuid, FwuOpStreamRead, &Handle); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "FmpPsaFwuLib: FwuOpen failed for Image Directory: %d\n", + Status + )); + return Status; + } + + if (mImageDirectory == NULL) { + // Get the size of image directory. + Status = FwuReadStream (Handle, NULL, 0, &ReadBytes, &TotalBytes); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "FmpPsaFwuLib: Failed to get image directory size: %r\n", + Status + )); + goto ErrorHandler; + } + + CloseStatus = FwuCommit (Handle, 1, 0, &Progress, &TotalWork); + ASSERT (CloseStatus == EFI_SUCCESS); + + mImageDirectorySize = TotalBytes; + + /* + * mImageDirectory should be allocated from the RuntimePool + * when runtime capsule updates are supported. + */ + mImageDirectory = AllocateRuntimePool (mImageDirectorySize); + if (mImageDirectory == NULL) { + DEBUG ((DEBUG_ERROR, "FmpPsaFwuLib: Failed to allocate memory for image directory!\n")); + return EFI_OUT_OF_RESOURCES; + } + + // Reopen handle to read image directory. + Status = FwuOpen (&gPsaFwuImageDirectoryGuid, FwuOpStreamRead, &Handle); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "FmpPsaFwuLib: FwuOpen failed for Image Directory: %r\n", + Status + )); + return Status; + } + } + + /** + * Read Image directory first or refresh the Image directory contents. + */ + TotalBytes = 0; + ReadBytes = MIN (mImageDirectorySize, mMaxPayloadSize); + Buffer = (VOID *)mImageDirectory; + + do { + Status = FwuReadStream ( + Handle, + Buffer + TotalBytes, + ReadBytes, + &ReadBytes, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "FmpPsaFwuLib: Failed to read image directory! %r\n", Status)); + goto ErrorHandler; + } + + TotalBytes += ReadBytes; + ReadBytes = MIN ((mImageDirectorySize - TotalBytes), mMaxPayloadSize); + } while (TotalBytes < mImageDirectorySize); + + /** + * Find Image Entry related to this FmpDevicePkg Driver. + */ + for (Idx = 0; Idx < mImageDirectory->NumImages; Idx++) { + ImgEntry = GET_FWU_IMG_INFO_ENTRY (mImageDirectory, Idx); + if (CompareGuid (&ImgEntry->ImgTypeGuid, &gEfiCallerIdGuid)) { + mImageEntry = ImgEntry; + break; + } + } + +ErrorHandler: + CloseStatus = FwuCommit (Handle, 1, 0, &Progress, &TotalWork); + ASSERT (CloseStatus == EFI_SUCCESS); + + return Status; +} + +/** + * Accept image at ReadyToBoot phase. + * + * @param [in] Event Registered ready to boot event.. + * @param [in] Context Additional Data. + * + */ +STATIC +VOID +EFIAPI +FmpPsaReadyToBootEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_STATUS Status; + + Status = FwuAcceptImage (&gEfiCallerIdGuid); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "FmpPsaFwuLib: Failed to accept the image: %g\n", &gEfiCallerIdGuid)); + } + + /** + * Refresh Image Directory. + */ + Status = GetFwuImageDirectory (); + if (EFI_ERROR (Status) || + (mImageEntry->Accepted == FWU_IMAGE_UNACCEPTED)) + { + DEBUG ((DEBUG_ERROR, "FmpPsaFwuLib: Image not renewed in Image Directory after calling accept - %g\n", &gEfiCallerIdGuid)); + } +} + +/** + Used to pass the FMP install function to this lib. This allows the library to + have control of the handle that the FMP instance is installed on. This allows + the library to use DriverBinding protocol model to locate its device(s) in the + system. + + @param[in] Func Function pointer to FMP install function. + + @retval EFI_SUCCESS Library has saved function pointer and will call + function pointer on each DriverBinding Start. + @retval EFI_UNSUPPORTED Library doesn't use driver binding and only supports + a single instance. + @retval other error Error occurred. Don't install FMP + +**/ +EFI_STATUS +EFIAPI +RegisterFmpInstaller ( + IN FMP_DEVICE_LIB_REGISTER_FMP_INSTALLER Func + ) +{ + // + // This is a system firmware update that does not use Driver Binding Protocol + // + return EFI_UNSUPPORTED; +} + +/** + Provide a function to uninstall the Firmware Management Protocol instance from a + device handle when the device is managed by a driver that follows the UEFI + Driver Model. If the device is not managed by a driver that follows the UEFI + Driver Model, then EFI_UNSUPPORTED is returned. + + @param[in] FmpUninstaller Function that installs the Firmware Management + Protocol. + + @retval EFI_SUCCESS The device is managed by a driver that follows the + UEFI Driver Model. FmpUninstaller must be called on + each Driver Binding Stop(). + @retval EFI_UNSUPPORTED The device is not managed by a driver that follows + the UEFI Driver Model. + @retval other The Firmware Management Protocol for this firmware + device is not installed. The firmware device is + still locked using FmpDeviceLock(). + +**/ +EFI_STATUS +EFIAPI +RegisterFmpUninstaller ( + IN FMP_DEVICE_LIB_REGISTER_FMP_UNINSTALLER FmpUninstaller + ) +{ + // + // This is a system firmware update that does not use Driver Binding Protocol + // + return EFI_UNSUPPORTED; +} + +/** + Set the device context for the FmpDeviceLib services when the device is + managed by a driver that follows the UEFI Driver Model. If the device is not + managed by a driver that follows the UEFI Driver Model, then EFI_UNSUPPORTED + is returned. Once a device context is set, the FmpDeviceLib services + operate on the currently set device context. + + @param[in] Handle Device handle for the FmpDeviceLib services. + If Handle is NULL, then Context is freed. + @param[in, out] Context Device context for the FmpDeviceLib services. + If Context is NULL, then a new context is allocated + for Handle and the current device context is set and + returned in Context. If Context is not NULL, then + the current device context is set. + + @retval EFI_SUCCESS The device is managed by a driver that follows the + UEFI Driver Model. + @retval EFI_UNSUPPORTED The device is not managed by a driver that follows + the UEFI Driver Model. + @retval other The Firmware Management Protocol for this firmware + device is not installed. The firmware device is + still locked using FmpDeviceLock(). + +**/ +EFI_STATUS +EFIAPI +FmpDeviceSetContext ( + IN EFI_HANDLE Handle, + IN OUT VOID **Context + ) +{ + // + // This is a system firmware update that does not use Driver Binding Protocol + // + return EFI_UNSUPPORTED; +} + +/** + Returns the size, in bytes, of the firmware image currently stored in the + firmware device. This function is used to by the GetImage() and + GetImageInfo() services of the Firmware Management Protocol. If the image + size cannot be determined from the firmware device, then 0 must be returned. + + @param[out] Size Pointer to the size, in bytes, of the firmware image + currently stored in the firmware device. + + @retval EFI_SUCCESS The size of the firmware image currently + stored in the firmware device was returned. + @retval EFI_INVALID_PARAMETER Size is NULL. + @retval EFI_UNSUPPORTED The firmware device does not support reporting + the size of the currently stored firmware image. + @retval EFI_DEVICE_ERROR An error occurred attempting to determine the + size of the firmware image currently stored in + in the firmware device. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetSize ( + OUT UINTN *Size + ) +{ + return EFI_UNSUPPORTED; +} + +/** + Used to return a library supplied guid that will be the ImageTypeId guid of + the FMP descriptor. This is optional but can be used if at runtime the guid + needs to be determined. + + @param[out] Guid Double Guid Ptr that will be updated to point to guid. + This should be from static memory and will not be freed. + + @return EFI_UNSUPPORTED Library instance doesn't need dynamic guid. + @return Error Any error will cause the wrapper to use the GUID + defined by PCD. + @return EFI_SUCCESS Guid ptr should be updated to point to static memory + which contains a valid guid. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetImageTypeIdGuidPtr ( + OUT EFI_GUID **Guid + ) +{ + /** + * Use FmpDxe gEfiCallerId. + */ + *Guid = &gEfiCallerIdGuid; + return EFI_SUCCESS; +} + +/** + Returns values used to fill in the AttributesSupported and AttributesSettings + fields of the EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the + GetImageInfo() service of the Firmware Management Protocol. The following + bit values from the Firmware Management Protocol may be combined: + IMAGE_ATTRIBUTE_IMAGE_UPDATABLE + IMAGE_ATTRIBUTE_RESET_REQUIRED + IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED + IMAGE_ATTRIBUTE_IN_USE + IMAGE_ATTRIBUTE_UEFI_IMAGE + + @param[out] Supported Attributes supported by this firmware device. + @param[out] Setting Attributes settings for this firmware device. + + @retval EFI_SUCCESS The attributes supported by the firmware + device were returned. + @retval EFI_INVALID_PARAMETER One of the parameters — Settings or Supported — is NULL. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetAttributes ( + IN OUT UINT64 *Supported, + IN OUT UINT64 *Setting + ) +{ + if ((Supported == NULL) || (Setting == NULL)) { + return EFI_INVALID_PARAMETER; + } + + /** + * IMAGE_ATTRIBUTE_IMAGE_UPDATABLE: + * - Support firmware image update. + * + * IMAGE_ATTRIBUTE_RESET_REQUIRED: + * - Reset required to take effect new firmware image. + * + * IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED: + * - Authentication required while GetImage(), SetImage() and CheckImage(). + * + * IMAGE_ATTRIBUTE_IN_USE: + * - This image can be used (to distinguish from duplicated images). + * - If this flag is unset, ESRT entry isn't generated. + * See "UEFI Spec 23.4.4 Mapping Firmware Management Protocol Descriptors to ESRT Entries" + * + * IMAGE_ATTRIBUTE_UEFI_IMAGE: + * - Firmware binary saved with EFI compatible format image. + * - Arm uses FIP format. so it doesn't set this flag. + */ + *Supported = (IMAGE_ATTRIBUTE_IMAGE_UPDATABLE | + IMAGE_ATTRIBUTE_RESET_REQUIRED | + IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED | + IMAGE_ATTRIBUTE_IN_USE + ); + *Setting = (IMAGE_ATTRIBUTE_IMAGE_UPDATABLE | + IMAGE_ATTRIBUTE_RESET_REQUIRED | + IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED | + IMAGE_ATTRIBUTE_IN_USE + ); + return EFI_SUCCESS; +} + +/** + Gets the current Lowest Supported Version. + + This is a protection mechanism so that a previous version with known issue is + not applied. ONLY implement this if your running firmware has a method to + return this at runtime. If EFI_UNSUPPORTED is returned, then the Lowest + Supported Version is stored in a UEFI Variable. + + @param[out] Version On return this value represents the current Lowest + Supported Version (in same format as GetVersion). + + @retval EFI_SUCCESS The Lowest Supported Version was correctly retrieved + @retval EFI_UNSUPPORTED Device firmware doesn't support reporting LSV + @retval EFI_DEVICE_ERROR Error occurred when trying to get the LSV +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetLowestSupportedVersion ( + IN OUT UINT32 *LowestSupportedVersion + ) +{ + // + // Retrieve the lowest support version from a PCD + // NOTE: This method of using a PCD can only be used for the system firmware + // FMP instance that is updated every time the system firmware is + // updated. If system firmware updates support partial updates that + // would not include the system firmware FMP instance, then a PCD can + // not be used and the value must come from the currently running system + // firmware image. + // + *LowestSupportedVersion = PcdGet32 (PcdSystemFirmwareFmpLowestSupportedVersion); + return EFI_SUCCESS; +} + +/** + Returns the Null-terminated Unicode string that is used to fill in the + VersionName field of the EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is + returned by the GetImageInfo() service of the Firmware Management Protocol. + The returned string must be allocated using EFI_BOOT_SERVICES.AllocatePool(). + + @note It is recommended that all firmware devices support a method to report + the VersionName string from the currently stored firmware image. + + @param[out] VersionString The version string retrieved from the currently + stored firmware image. + + @retval EFI_SUCCESS The version string of currently stored + firmware image was returned in Version. + @retval EFI_INVALID_PARAMETER VersionString is NULL. + @retval EFI_UNSUPPORTED The firmware device does not support a method + to report the version string of the currently + stored firmware image. + @retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the + version string of the currently stored + firmware image. + @retval EFI_OUT_OF_RESOURCES There are not enough resources to allocate the + buffer for the version string of the currently + stored firmware image. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetVersionString ( + OUT CHAR16 **VersionString + ) +{ + if (VersionString == NULL) { + return EFI_INVALID_PARAMETER; + } + + // + // Retrieve the version string from a PCD + // NOTE: This method of using a PCD can only be used for the system firmware + // FMP instance that is updated every time the system firmware is + // updated. If system firmware updates support partial updates that + // would not include the system firmware FMP instance, then a PCD can + // not be used and the value must come from the currently running system + // firmware image. + // + *VersionString = (CHAR16 *)AllocateCopyPool ( + PcdGetSize (PcdSystemFirmwareFmpVersionString), + PcdGetPtr (PcdSystemFirmwareFmpVersionString) + ); + if (*VersionString == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + return EFI_SUCCESS; +} + +/** + Gets the current running version. + + ONLY implement this if your running firmware has a method to return this at + runtime. + + @param[out] Version On return this value represents the current running + version. + + @retval EFI_SUCCESS The version was correctly retrieved. + @retval EFI_UNSUPPORTED Device firmware doesn't support reporting current + version. + @retval EFI_DEVICE_ERROR Error occurred when trying to get the version. +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetVersion ( + IN OUT UINT32 *Version + ) +{ + if (Version == NULL) { + return EFI_INVALID_PARAMETER; + } + + // + // Retrieve the version string from a PCD + // NOTE: This method of using a PCD can only be used for the system firmware + // FMP instance that is updated every time the system firmware is + // updated. If system firmware updates support partial updates that + // would not include the system firmware FMP instance, then a PCD can + // not be used and the value must come from the currently running system + // firmware image. + // + *Version = PcdGet32 (PcdSystemFirmwareFmpVersion); + + return EFI_SUCCESS; +} + +/** + Returns the value used to fill in the HardwareInstance field of the + EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo() + service of the Firmware Management Protocol. If EFI_SUCCESS is returned, then + the firmware device supports a method to report the HardwareInstance value. + If the value cannot be reported for the firmware device, then EFI_UNSUPPORTED + must be returned. EFI_DEVICE_ERROR is returned if an error occurs attempting + to retrieve the HardwareInstance value for the firmware device. + + @param[out] HardwareInstance The hardware instance value for the firmware + device. + + @retval EFI_SUCCESS The hardware instance for the current firmware + device is returned in HardwareInstance. + @retval EFI_UNSUPPORTED The firmware device does not support a method to + report the hardware instance value. + @retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the hardware + instance value. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetHardwareInstance ( + OUT UINT64 *HardwareInstance + ) +{ + return EFI_UNSUPPORTED; +} + +/** + Retrieves a copy of the current firmware image of the device. + + This function allows a copy of the current firmware image to be created and + saved. The saved copy could later been used, for example, in firmware image + recovery or rollback. + + @param[in,out] Image Points to the buffer where the current image + is copied to. + @param[in,out] ImageSize On entry, points to the size of the buffer pointed + to by Image, in bytes. + On return, points to the length of the image, + in bytes. + + @retval EFI_SUCCESS The image was successfully read from the device. + @retval EFI_BUFFER_TOO_SMALL The buffer specified by ImageSize is too small + to hold the image. The current buffer size + needed to hold the image is returned in + ImageSize. + @retval EFI_INVALID_PARAMETER The Image was NULL. + @retval EFI_NOT_FOUND The current image is not copied to the buffer. + @retval EFI_UNSUPPORTED The operation is not supported. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceGetImage ( + IN OUT VOID *Image, + IN OUT UINTN *ImageSize + ) +{ + /** + * FIP image includes not only UEFI image but also other software components + * and theirs configuration. + * They shouldn't be exposed by calling GetTheImage(). + */ + return EFI_UNSUPPORTED; +} + +/** + Updates a firmware device with a new firmware image. This function returns + EFI_UNSUPPORTED if the firmware image is not updatable. If the firmware image + is updatable, the function should perform the following minimal validations + before proceeding to do the firmware image update. + - Validate that the image is a supported image for this firmware device. + Return EFI_ABORTED if the image is not supported. Additional details + on why the image is not a supported image may be returned in AbortReason. + - Validate the data from VendorCode if is not NULL. Firmware image + validation must be performed before VendorCode data validation. + VendorCode data is ignored or considered invalid if image validation + fails. Return EFI_ABORTED if the VendorCode data is invalid. + + VendorCode enables vendor to implement vendor-specific firmware image update + policy. Null if the caller did not specify the policy or use the default + policy. As an example, vendor can implement a policy to allow an option to + force a firmware image update when the abort reason is due to the new firmware + image version is older than the current firmware image version or bad image + checksum. Sensitive operations such as those wiping the entire firmware image + and render the device to be non-functional should be encoded in the image + itself rather than passed with the VendorCode. AbortReason enables vendor to + have the option to provide a more detailed description of the abort reason to + the caller. + + @param[in] Image Points to the new firmware image. + @param[in] ImageSize Size, in bytes, of the new firmware image. + @param[in] VendorCode This enables vendor to implement vendor-specific + firmware image update policy. NULL indicates + the caller did not specify the policy or use the + default policy. + @param[in] Progress A function used to report the progress of + updating the firmware device with the new + firmware image. + @param[in] CapsuleFwVersion The version of the new firmware image from the + update capsule that provided the new firmware + image. + @param[out] AbortReason A pointer to a pointer to a Null-terminated + Unicode string providing more details on an + aborted operation. The buffer is allocated by + this function with + EFI_BOOT_SERVICES.AllocatePool(). It is the + caller's responsibility to free this buffer with + EFI_BOOT_SERVICES.FreePool(). + @param[out] LastAttemptStatus A pointer to a UINT32 that holds the last attempt + status to report back to the ESRT table in case + of error. This value will only be checked when this + function returns an error. + + The return status code must fall in the range of + LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MIN_ERROR_CODE_VALUE to + LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MAX_ERROR_CODE_VALUE. + + If the value falls outside this range, it will be converted + to LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL. + + @retval EFI_SUCCESS The firmware device was successfully updated + with the new firmware image. + @retval EFI_ABORTED The operation is aborted. Additional details + are provided in AbortReason. + @retval EFI_INVALID_PARAMETER The Image was NULL. + @retval EFI_INVALID_PARAMETER LastAttemptStatus was NULL. + @retval EFI_UNSUPPORTED The operation is not supported. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceSetImageWithStatus ( + IN CONST VOID *Image, + IN UINTN ImageSize, + IN CONST VOID *VendorCode, OPTIONAL + IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress, OPTIONAL + IN UINT32 CapsuleFwVersion, + OUT CHAR16 **AbortReason, + OUT UINT32 *LastAttemptStatus + ) +{ + EFI_STATUS Status; + EFI_STATUS CancelStatus; + UINT32 Updatable; + UINT32 WriteBytes; + UINT32 TotalBytes; + UINT32 Handle; + UINT32 CommitProgress; + UINT32 CommitTotalWorks; + + Updatable = 0; + *LastAttemptStatus = LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MIN_ERROR_CODE_VALUE; + + Status = FmpDeviceCheckImageWithStatus (Image, ImageSize, &Updatable, LastAttemptStatus); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "FmpPsaFwuLib: FmpDeviceSetImageWithStatus - Check Image failed with %r.\n", Status)); + return Status; + } + + if (Updatable != IMAGE_UPDATABLE_VALID) { + DEBUG ((DEBUG_ERROR, "FmpPsaFwuLib: FmpDeviceSetImageWithStatus - Check Image returned that the Image was not valid for update. Updatable value = 0x%X.\n", Updatable)); + return EFI_ABORTED; + } + + if ((mFwuFlags & FWU_DISCOVER_FLAGS_PARTIAL_UPDATE_SUPPORT) == + FWU_DISCOVER_FLAGS_PARTIAL_UPDATE_SUPPORT) + { + Status = FwuBeginStaging (&gEfiCallerIdGuid, 1, 0); + } else { + Status = FwuBeginStaging (NULL, 0, 0); + } + + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "FmpPsaFwuLib: FmpDeviceSetImageWithStatus - Failed to enter Staging: %r.\n", + Status + )); + return Status; + } + + if (Progress != NULL) { + Status = Progress (1); + if (EFI_ERROR (Status)) { + goto CancelUpdate; + } + } + + Status = FwuOpen (&gEfiCallerIdGuid, FwuOpStreamWrite, &Handle); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "FmpPsaFwuLib: FmpDeviceSetImageWithStatus - Failed to open(%g), Status=%r.\n", + &gEfiCallerIdGuid, + Status + )); + goto CancelUpdate; + } + + if (Progress != NULL) { + Status = Progress (5); + if (EFI_ERROR (Status)) { + goto CancelUpdate; + } + } + + TotalBytes = 0; + WriteBytes = MIN (ImageSize, mMaxPayloadSize); + + do { + Status = FwuWriteStream (Handle, Image + TotalBytes, WriteBytes); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "FmpPsaFwuLib: FmpDeviceSetImageWithStatus - Failed to write: %r.\n", + Status + )); + goto CancelUpdate; + } + + TotalBytes += WriteBytes; + WriteBytes = MIN ((ImageSize - TotalBytes), mMaxPayloadSize); + + /** + * Set the progress percentage between 5% to 55% + */ + if (Progress != NULL) { + Status = Progress ((TotalBytes / (2 * ImageSize)) + 5); + if (EFI_ERROR (Status)) { + goto CancelUpdate; + } + } + } while (TotalBytes < ImageSize); + + if (Progress != NULL) { + Status = Progress (60); + if (EFI_ERROR (Status)) { + goto CancelUpdate; + } + } + + /** + * NOTE: + * Next boot, This image accepted in Entry point. + */ + Status = FwuCommit (Handle, 1, 0, &CommitProgress, &CommitTotalWorks); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "FmpPsaFwuLib: FmpDeviceSetImageWithStatus - Failed to commit: %r.\n", + Status + )); + goto CancelUpdate; + } + + if (Progress != NULL) { + Status = Progress (90); + if (EFI_ERROR (Status)) { + goto CancelUpdate; + } + } + + Status = FwuEndStaging (); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "FmpPsaFwuLib: FmpDeviceSetImageWithStatus - Failed to enter Staging: %r.\n", + Status + )); + goto CancelUpdate; + } + + if (Progress != NULL) { + Progress (100); + } + + *LastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS; + + /* + * Reload CorrectBoot value from ImageDirectory. + */ + Status = GetFwuImageDirectory (); + + ASSERT (Status == EFI_SUCCESS); + ASSERT (!(mImageDirectory->CorrectBoot)); + + /* + * After FwuEndStaging(), the active index is updated. + * In other words, the UpdateAgent's state no longer matches + * the correct boot context (current index != active index). + * Therefore, disable firmware updates so that prevent update + * of images in the "current index". + */ + mUpdateDisabled = TRUE; + + return EFI_SUCCESS; + +CancelUpdate: + if (IS_FWU_FUNC_SUPPORTED (PSA_MM_FWU_COMMAND_CANCEL_STAGING)) { + CancelStatus = FwuCancelStaging (); + ASSERT (CancelStatus == EFI_SUCCESS); + } + + return Status; +} + +/** + Updates the firmware image of the device. + + This function updates the hardware with the new firmware image. This function + returns EFI_UNSUPPORTED if the firmware image is not updatable. If the + firmware image is updatable, the function should perform the following minimal + validations before proceeding to do the firmware image update. + - Validate the image is a supported image for this device. The function + returns EFI_ABORTED if the image is unsupported. The function can + optionally provide more detailed information on why the image is not a + supported image. + - Validate the data from VendorCode if not null. Image validation must be + performed before VendorCode data validation. VendorCode data is ignored + or considered invalid if image validation failed. The function returns + EFI_ABORTED if the data is invalid. + + VendorCode enables vendor to implement vendor-specific firmware image update + policy. Null if the caller did not specify the policy or use the default + policy. As an example, vendor can implement a policy to allow an option to + force a firmware image update when the abort reason is due to the new firmware + image version is older than the current firmware image version or bad image + checksum. Sensitive operations such as those wiping the entire firmware image + and render the device to be non-functional should be encoded in the image + itself rather than passed with the VendorCode. AbortReason enables vendor to + have the option to provide a more detailed description of the abort reason to + the caller. + + @param[in] Image Points to the new image. + @param[in] ImageSize Size of the new image in bytes. + @param[in] VendorCode This enables vendor to implement vendor-specific + firmware image update policy. Null indicates the + caller did not specify the policy or use the + default policy. + @param[in] Progress A function used by the driver to report the + progress of the firmware update. + @param[in] CapsuleFwVersion FMP Payload Header version of the image. + @param[out] AbortReason A pointer to a pointer to a null-terminated + string providing more details for the aborted + operation. The buffer is allocated by this + function with AllocatePool(), and it is the + caller's responsibility to free it with a call + to FreePool(). + + @retval EFI_SUCCESS The device was successfully updated with the + new image. + @retval EFI_ABORTED The operation is aborted. + @retval EFI_INVALID_PARAMETER The Image was NULL. + @retval EFI_UNSUPPORTED The operation is not supported. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceSetImage ( + IN CONST VOID *Image, + IN UINTN ImageSize, + IN CONST VOID *VendorCode, + IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress, + IN UINT32 CapsuleFwVersion, + OUT CHAR16 **AbortReason + ) +{ + UINT32 LastAttemptStatus; + + return FmpDeviceSetImageWithStatus ( + Image, + ImageSize, + VendorCode, + Progress, + CapsuleFwVersion, + AbortReason, + &LastAttemptStatus + ); +} + +/** + Checks if a new firmware image is valid for the firmware device. This + function allows firmware update operation to validate the firmware image + before FmpDeviceSetImage() is called. + + @param[in] Image Points to a new firmware image. + @param[in] ImageSize Size, in bytes, of a new firmware image. + @param[out] ImageUpdatable Indicates if a new firmware image is valid for + a firmware update to the firmware device. The + following values from the Firmware Management + Protocol are supported: + IMAGE_UPDATABLE_VALID + IMAGE_UPDATABLE_INVALID + IMAGE_UPDATABLE_INVALID_TYPE + IMAGE_UPDATABLE_INVALID_OLD + IMAGE_UPDATABLE_VALID_WITH_VENDOR_CODE + @param[out] LastAttemptStatus A pointer to a UINT32 that holds the last attempt + status to report back to the ESRT table in case + of error. This value will only be checked when this + function returns an error. + + The return status code must fall in the range of + LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MIN_ERROR_CODE_VALUE to + LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MAX_ERROR_CODE_VALUE. + + If the value falls outside this range, it will be converted + to LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL. + + @retval EFI_SUCCESS The image was successfully checked. Additional + status information is returned in + ImageUpdatable. + @retval EFI_INVALID_PARAMETER Image is NULL. + @retval EFI_INVALID_PARAMETER ImageUpdatable is NULL. + @retval EFI_INVALID_PARAMETER LastAttemptStatus is NULL. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceCheckImageWithStatus ( + IN CONST VOID *Image, + IN UINTN ImageSize, + OUT UINT32 *ImageUpdatable, + OUT UINT32 *LastAttemptStatus + ) +{ + if ((Image == NULL) || + (ImageSize == 0) || + (ImageUpdatable == NULL) || + (LastAttemptStatus == NULL)) + { + DEBUG ((DEBUG_ERROR, "FmpPsaFwuLib: CheckImageWithStatus - Invalid parameters.\n")); + return EFI_INVALID_PARAMETER; + } + + if ((ImageSize > mImageEntry->ImgMaxSize) || (mUpdateDisabled)) { + *ImageUpdatable = IMAGE_UPDATABLE_INVALID; + *LastAttemptStatus = LAST_ATTEMPT_STATUS_DEVICE_LIBRARY_MIN_ERROR_CODE_VALUE; + DEBUG ((DEBUG_ERROR, "FmpPsaFwuLib: CheckImageWithStatus - Invalid Status.\n")); + return EFI_INVALID_PARAMETER; + } + + *ImageUpdatable = IMAGE_UPDATABLE_VALID; + *LastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS; + + return EFI_SUCCESS; +} + +/** + Checks if the firmware image is valid for the device. + + This function allows firmware update application to validate the firmware image without + invoking the SetImage() first. + + @param[in] Image Points to the new image. + @param[in] ImageSize Size of the new image in bytes. + @param[out] ImageUpdatable Indicates if the new image is valid for update. It also provides, + if available, additional information if the image is invalid. + + @retval EFI_SUCCESS The image was successfully checked. + @retval EFI_INVALID_PARAMETER The Image was NULL. + +**/ +EFI_STATUS +EFIAPI +FmpDeviceCheckImage ( + IN CONST VOID *Image, + IN UINTN ImageSize, + OUT UINT32 *ImageUpdatable + ) +{ + UINT32 LastAttemptStatus; + + return FmpDeviceCheckImageWithStatus ( + Image, + ImageSize, + ImageUpdatable, + &LastAttemptStatus + ); +} + +/** + Device firmware should trigger lock mechanism so that device fw cannot be + updated or tampered with. This lock mechanism is generally only cleared by a + full system reset (not just sleep state/low power mode) + + @retval EFI_SUCCESS The device was successfully locked. + @retval EFI_UNSUPPORTED The hardware device/firmware doesn't support locking + +**/ +EFI_STATUS +EFIAPI +FmpDeviceLock ( + VOID + ) +{ + /** + * Because Arm doesn't update firmware via capsule coalescing, + * If the deviced locked, FmpDevicePkg cannot update firmware properly + * which assumes firmware is updated via capsule coalescing. + * Also, firmware update device is already isolated by StandaloneMm. + * Therefore, It's enough to return EFI_UNSUPPORTED. + */ + return EFI_UNSUPPORTED; +} + +/** + Platform Flash Access Lib Constructor. +**/ +EFI_STATUS +EFIAPI +FmpDevicePsaFwuLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_NOTIFY, + FmpPsaVirtualAddressChangeEvent, + NULL, + &gEfiEventVirtualAddressChangeGuid, + &mEfiVirtualAddressChangeEvent + ); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = PsaFwuLibInit (); + if (EFI_ERROR (Status)) { + goto ErrorHandler; + } + + Status = CheckFwuSupport (); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_WARN, + "FmpPsaFwuLib: There's not supported function. Disable FWU...\n" + )); + mUpdateDisabled = TRUE; + Status = EFI_SUCCESS; + + goto ErrorHandler; + } + + Status = GetFwuImageDirectory (); + if (EFI_ERROR (Status)) { + goto ErrorHandler; + } + + if (mImageEntry == NULL) { + DEBUG (( + DEBUG_WARN, + "FmpPsaFwuLib: %g Image Type isn't present on Image Directory. Disable FWU on this image type.\n", + &gEfiCallerIdGuid + )); + mUpdateDisabled = TRUE; + Status = EFI_SUCCESS; + + goto ErrorHandler; + } + + if (!mImageDirectory->CorrectBoot) { + DEBUG (( + DEBUG_WARN, + "FmpPsaFwuLib: Incorrect Boot!\n" + )); + + mUpdateDisabled = TRUE; + + Status = FwuSelectPrevious (); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_WARN, + "FmpPsaFwuLib: Failed to select previous... %r\n", + Status + )); + } + + /* + * The firmware boots using the previous index, not the active index. + * fwu_select_previous() corrects this by setting the active index to the previous one. + * + * Even if fwu_select_previous() fails, + * the system can still proceed because it has already booted from the previous image. + * In this case, the firmware update feature is disabled. + */ + Status = EFI_SUCCESS; + + goto ErrorHandler; + } + + if (mImageEntry->Accepted == FWU_IMAGE_UNACCEPTED) { + /* + * If the firmware is able to boot to this stage and + * load the FMP device driver, we can consider that the Boot is successful. + * Therefore, accept the image in the ReadyToBoot phase. + */ + Status = gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_CALLBACK, + FmpPsaReadyToBootEvent, + NULL, + &gEfiEventReadyToBootGuid, + &mEfiReadyToBootEvent + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "FmpPsaFwuLib: Failed to accept the image: %g\n", &gEfiCallerIdGuid)); + goto ErrorHandler; + } + } + + return EFI_SUCCESS; + +ErrorHandler: + if (mImageDirectory != NULL) { + FreePool (mImageDirectory); + mImageEntry = NULL; + mImageDirectory = NULL; + } + + PsaFwuLibExit (); + + gBS->CloseEvent (mEfiVirtualAddressChangeEvent); + + return Status; +} diff --git a/ArmPkg/Library/FmpDevicePsaFwuLib/FmpDevicePsaFwuLib.inf b/ArmPkg/Library/FmpDevicePsaFwuLib/FmpDevicePsaFwuLib.inf new file mode 100644 index 000000000000..5db0bc08d7a5 --- /dev/null +++ b/ArmPkg/Library/FmpDevicePsaFwuLib/FmpDevicePsaFwuLib.inf @@ -0,0 +1,68 @@ +## @file +# +# Copyright (c) 2024, Arm Limited. All rights reserved.
    +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# @par Reference(s): +# - Platform Security Firmware Update for the A-profile Specification 1.0 +# (https://developer.arm.com/documentation/den0118/latest) +# +# @par Glossary: +# - FW - Firmware +# - FWU - Firmware Update +# - PSA - Platform Security update for the A-profile specification +# - FMP - Firmware Management Protocol Device. +# +## + + +[Defines] + INF_VERSION = 0x00010017 + BASE_NAME = PsaFwuLib + FILE_GUID = 200313EC-6C3F-11EE-9F0B-D769BEFFA745 + MODULE_TYPE = DXE_RUNTIME_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = FmpDeviceLib|DXE_DRIVER DXE_RUNTIME_DRIVER + CONSTRUCTOR = FmpDevicePsaFwuLibConstructor + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = AARCH64 +# + +[Sources] + FmpDevicePsaFwuLib.c + PsaFwuLib.c + PsaFwuLib.h + +[Packages] + ArmPkg/ArmPkg.dec + FmpDevicePkg/FmpDevicePkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + ArmFfaLib + BaseLib + BaseMemoryLib + DebugLib + MemoryAllocationLib + UefiBootServicesTableLib + UefiRuntimeServicesTableLib + +[Protocols] + gEfiMmCommunication2ProtocolGuid ## CONSUMES + +[Guids] + gEfiEventVirtualAddressChangeGuid ## CONSUMES ## Event + gEfiEventReadyToBootGuid ## CONSUMES ## Event + gPsaFwuUpdateAgentGuid ## CONSUMES + gPsaFwuImageDirectoryGuid ## CONSUMES + +[Pcd] + gArmTokenSpaceGuid.PcdSystemFirmwareFmpLowestSupportedVersion + gArmTokenSpaceGuid.PcdSystemFirmwareFmpVersion + gArmTokenSpaceGuid.PcdSystemFirmwareFmpVersionString + gArmTokenSpaceGuid.PcdMmBufferBase + gArmTokenSpaceGuid.PcdMmBufferSize diff --git a/ArmPkg/Library/FmpDevicePsaFwuLib/PsaFwuLib.c b/ArmPkg/Library/FmpDevicePsaFwuLib/PsaFwuLib.c new file mode 100644 index 000000000000..d1135f03ff06 --- /dev/null +++ b/ArmPkg/Library/FmpDevicePsaFwuLib/PsaFwuLib.c @@ -0,0 +1,1073 @@ +/** @file + + Copyright (c) 2024, Arm Limited. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - Platform Security Firmware Update for the A-profile Specification 1.0 + (https://developer.arm.com/documentation/den0118/latest) + + @par Glossary: + - FW - Firmware + - FWU - Firmware Update + - PSA - Platform Security update for the A-profile specification + - FMP - Firmware Management Protocol Device. + +**/ +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "PsaFwuLib.h" + +STATIC UINT16 mUpdateAgentId; + +STATIC VOID *mPsaFwuBuffer = NULL; +STATIC UINTN mPsaFwuMaxBufferSize; + +/** + * Convert MmCommunication related addresses on VirtualAddress Change Event. + * + * @param [in] Event Registered VirtualAddress Change Event. + * @param [in] Context Additional Data. + * + */ +VOID +EFIAPI +PsaFwuVirtualAddressChangeEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + gRT->ConvertPointer (0x00, (VOID **)&mPsaFwuBuffer); +} + +/** + * Get firmware update function request fixed data size. + * + * @param [in] Command firmware update function id. + * + * @retval Size of request fixed data. + */ +STATIC +UINTN +EFIAPI +GetMmFwuReqDataSize ( + IN UINT32 Command + ) +{ + switch (Command) { + case PSA_MM_FWU_COMMAND_BEGIN_STAGING: + return sizeof (PSA_MM_FWU_BEGIN_STAGING_REQ); + case PSA_MM_FWU_COMMAND_OPEN: + return sizeof (PSA_MM_FWU_OPEN_REQ); + case PSA_MM_FWU_COMMAND_WRITE_STREAM: + return sizeof (PSA_MM_FWU_WRITE_STREAM_REQ); + case PSA_MM_FWU_COMMAND_READ_STREAM: + return sizeof (PSA_MM_FWU_READ_STREAM_REQ); + case PSA_MM_FWU_COMMAND_COMMIT: + return sizeof (PSA_MM_FWU_COMMIT_REQ); + case PSA_MM_FWU_COMMAND_ACCEPT_IMAGE: + return sizeof (PSA_MM_FWU_ACCEPT_IMAGE_REQ); + default: + return 0; + } +} + +/** + * Get firmware update function response fixed data size. + * + * @param [in] Command firmware update function id. + * + * @retval Size of response fixed data. + */ +STATIC +UINTN +EFIAPI +GetMmFwuRespDataSize ( + IN UINT32 Command + ) +{ + switch (Command) { + case PSA_MM_FWU_COMMAND_DISCOVER: + return sizeof (PSA_MM_FWU_DISCOVER_RESP); + case PSA_MM_FWU_COMMAND_OPEN: + return sizeof (PSA_MM_FWU_OPEN_RESP); + case PSA_MM_FWU_COMMAND_READ_STREAM: + return sizeof (PSA_MM_FWU_READ_STREAM_RESP); + case PSA_MM_FWU_COMMAND_COMMIT: + return sizeof (PSA_MM_FWU_COMMIT_RESP); + default: + return 0; + } +} + +/** + * Calculate maximum available data size that can be sent in one MmCommunication. + * + * @param [in] Command Firmware update function id. + * + * @retval Maximum available data size could be sent on @Command. + */ +STATIC +UINTN +EFIAPI +FwuGetAvailableReqDataSize ( + IN UINT32 Command + ) +{ + return mPsaFwuMaxBufferSize - + sizeof (PSA_MM_FWU_PARAMETER_HEADER) - GetMmFwuReqDataSize (Command); +} + +/** + * Calculate maximum available data size that can be received in one MmCommunication. + * + * @param [in] Command Firmware update function id. + * + * @retval Maximum available data size could be received on @Command. + */ +STATIC +UINTN +EFIAPI +FwuGetAvailableRespDataSize ( + IN UINT32 Command + ) +{ + return mPsaFwuMaxBufferSize - + sizeof (PSA_MM_FWU_PARAMETER_HEADER) - GetMmFwuRespDataSize (Command); +} + +/** Send a firmware update function request to StMM and Receive response. + + @param[in] Command Firmware update function id. + @param[in] ReqData Request fixed data according to @Command. + @param[in] ClientSendData Request variable data according to @Command. + @param[in] ClientSendDataSize Size of request variable data. + @param[in] ClientRecvDataSize Size of response variable data. + @param[out] RespMsg Response including data from StMM. + + @retval EFI_SUCCESS + @retval EFI_INVALID_PARAMETER + @retval Others Fail to handle firmware update function. + +**/ +STATIC +EFI_STATUS +EFIAPI +SendFwuRequest ( + IN UINT32 Command, + IN VOID *ReqData, + IN CONST VOID *ClientSendData, + IN UINTN ClientSendDataSize, + IN UINTN ClientRecvDataSize, + OUT PSA_MM_FWU_CMD_DATA **RespMsg + ) +{ + EFI_STATUS Status; + PSA_MM_FWU_CMD_DATA *CmdData; + VOID *Buffer; + UINTN ReqDataSize; + UINTN RespDataSize; + UINTN TotalReqCommBufferSize; + UINTN TotalRespCommBufferSize; + UINTN TotalBufferSize; + DIRECT_MSG_ARGS EmptyArgs; + + if ((RespMsg == NULL) || (mPsaFwuBuffer == NULL)) { + return EFI_INVALID_PARAMETER; + } + + *RespMsg = NULL; + ReqDataSize = GetMmFwuReqDataSize (Command); + RespDataSize = GetMmFwuRespDataSize (Command); + + if ((FwuGetAvailableReqDataSize (Command) < ClientSendDataSize) || + (FwuGetAvailableRespDataSize (Command) < ClientRecvDataSize)) + { + return EFI_BUFFER_TOO_SMALL; + } + + TotalReqCommBufferSize = sizeof (PSA_MM_FWU_PARAMETER_HEADER) + + ReqDataSize + ClientSendDataSize; + + TotalRespCommBufferSize = sizeof (PSA_MM_FWU_PARAMETER_HEADER) + + RespDataSize + ClientRecvDataSize; + + TotalBufferSize = MAX (TotalReqCommBufferSize, TotalRespCommBufferSize); + + ZeroMem (mPsaFwuBuffer, TotalBufferSize); + ZeroMem (&EmptyArgs, sizeof (DIRECT_MSG_ARGS)); + CmdData = (PSA_MM_FWU_CMD_DATA *)mPsaFwuBuffer; + + CmdData->Header.Command = Command; + Buffer = GET_FWU_DATA_BUFFER (CmdData); + CopyMem (Buffer, ReqData, ReqDataSize); + if ((ClientSendData != NULL) && (ClientSendDataSize > 0)) { + CopyMem (((UINT8 *)Buffer + ReqDataSize), ClientSendData, ClientSendDataSize); + } + + Status = ArmFfaLibMsgSendDirectReq2 ( + mUpdateAgentId, + &gPsaFwuUpdateAgentGuid, + &EmptyArgs + ); + if (EFI_ERROR (Status)) { + return Status; + } + + *RespMsg = (PSA_MM_FWU_CMD_DATA *)mPsaFwuBuffer; + + return EFI_SUCCESS; +} + +/** + * Convert FwuStatus to EFI_STATUS. + * + * @param [in] FwuStatus Firmware update function return status. + * + * @retval Matched EFI_STATUS with FwuStatus. + * + */ +STATIC +EFI_STATUS +EFIAPI +FwuStatusToEfiStatus ( + IN UINT32 FwuStatus + ) +{ + switch (FwuStatus) { + case PSA_MM_FWU_SUCCESS: + return EFI_SUCCESS; + case PSA_MM_FWU_UNKNOWN: + return EFI_NOT_FOUND; + case PSA_MM_FWU_BUSY: + return EFI_NOT_READY; + case PSA_MM_FWU_OUT_OF_BOUNDS: + return EFI_OUT_OF_RESOURCES; + case PSA_MM_FWU_AUTH_FAIL: + return EFI_SECURITY_VIOLATION; + case PSA_MM_FWU_NO_PERMISSION: + case PSA_MM_FWU_DENIED: + return EFI_ACCESS_DENIED; + case PSA_MM_FWU_RESUME: + return EFI_TIMEOUT; + case PSA_MM_FWU_NOT_AVAILABLE: + return EFI_UNSUPPORTED; + } + + return EFI_DEVICE_ERROR; +} + +/** Send and receive response data for firmware update function request. + + @param[in] Command Firmware update function id. + @param[in] ReqData Request fixed data according to @Command. + @param[in] ClientSendData Request variable data according to @Command. + @param[in] ClientSendDataSize Size of request variable data. + @param[in] ClientRecvDataSize Size of response variable data. + @param[out] RespData If successes, Response data correspond to @Command. + + @retval EFI_SUCCESS + @retval Others Failed to @Command request. + +**/ +STATIC +EFI_STATUS +EFIAPI +FwuCommunicate ( + IN UINT32 Command, + IN VOID *ReqData, + IN CONST VOID *ClientSendData, + IN UINTN ClientSendDataSize, + IN UINTN ClientRecvDataSize, + OUT VOID **RespData + ) +{ + EFI_STATUS Status; + PSA_MM_FWU_CMD_DATA *RespMsg; + UINT32 FwuStatus; + UINTN RespDataSize; + + if (RespData != NULL) { + *RespData = NULL; + } + + /** + * SendFwuRequest calls Smc call. + * So, it needs to pass RespBuffer. + */ + Status = SendFwuRequest ( + Command, + ReqData, + ClientSendData, + ClientSendDataSize, + ClientRecvDataSize, + &RespMsg + ); + if (EFI_ERROR (Status)) { + return Status; + } + + FwuStatus = RespMsg->Header.ResponseStatus; + if (FwuStatus == PSA_MM_FWU_SUCCESS) { + RespDataSize = GetMmFwuRespDataSize (Command); + if ((RespDataSize > 0) && (RespData != NULL)) { + *RespData = (VOID *)RespMsg + sizeof (PSA_MM_FWU_CMD_DATA); + } + } + + return FwuStatusToEfiStatus (FwuStatus); +} + +/** + * Get firmware update agent partition id. + * + * @param [out] UpdateAgentId Update agent partition id + * + * @retval EFI_SUCCESS Success to get Update agent id + * @retval EFI_UNSUPPORTED Firmware update doesn't support + * @retval Others Error for FF-A request. + * + */ +STATIC +EFI_STATUS +EFIAPI +FwuGetUpdateAgentId ( + OUT UINT16 *UpdateAgentId + ) +{ + EFI_STATUS Status; + EFI_FFA_PART_INFO_DESC *PartInfo; + EFI_GUID *ServiceGuid; + VOID *RxBuffer; + UINT64 RxBufferSize; + UINT32 Count; + UINT32 Size; + UINT16 PartId; + + if (!IsFfaSupported ()) { + return EFI_UNSUPPORTED; + } + + Status = ArmFfaLibPartitionIdGet (&PartId); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to get my partition id. Status:%r\n", + __func__, + Status + )); + return Status; + } + + Status = ArmFfaLibGetRxTxBuffers ( + NULL, + NULL, + &RxBuffer, + &RxBufferSize + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to get Rx Buffer. Status:%r\n", + __func__, + Status + )); + return Status; + } + + ServiceGuid = &gPsaFwuUpdateAgentGuid; + Status = ArmFfaLibPartitionInfoGet ( + ServiceGuid, + FFA_PART_INFO_FLAG_TYPE_DESC, + &Count, + &Size + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: (Fallback) Failed to get Update agent partition info. Status:%r\n", + __func__, + Status + )); + goto ErrorHandler; + } + + PartInfo = (EFI_FFA_PART_INFO_DESC *)RxBuffer; + if ((PartInfo->PartitionProps & FFA_PART_PROP_RECV_DIRECT_REQ2) == 0x00) { + DEBUG (( + DEBUG_ERROR, + "%a: (Fallback) Update agent doesn't support direct msg v2...\n", + __func__ + )); + Status = EFI_UNSUPPORTED; + goto ErrorHandler; + } + + *UpdateAgentId = PartInfo->PartitionId; + +ErrorHandler: + ArmFfaLibRxRelease (PartId); + return Status; +} + +/** + * Send a FWU discovery request to StMM and get the associated response. + * + * @param [out] Discovery Discovery data related to firmware update. + * + * @retval EFI_SUCCESS + * @retval Others fwu_discovery isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuDiscovery ( + OUT PSA_MM_FWU_DISCOVER_RESP **Discovery + ) +{ + EFI_STATUS Status; + + if (Discovery == NULL) { + return EFI_INVALID_PARAMETER; + } + + *Discovery = NULL; + + /** + * +-----------------------+ +-------------------------------+ + * | UEFI (FmpDevicePkg) | | StandaloneMm (FwuStMm Driver) | + * +-----------------------+ +-------------------------------+ + * | fwu_discovery request | + * |------------------------------------------------>| + * | | + * |<------------------------------------------------| + * fwu_status with + * (fwu discoery info) + * (See PSA-FWU spec 3.4.2.1) + */ + Status = FwuCommunicate ( + PSA_MM_FWU_COMMAND_DISCOVER, + NULL, + NULL, + 0, + FwuGetAvailableRespDataSize (PSA_MM_FWU_COMMAND_DISCOVER), + (VOID **)Discovery + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to %a. Status: %r\n", __func__, Status)); + } + + return Status; +} + +/** + * Send a Begin Staging request to StMM and get the associated response thereby + * start new staging process for firmware update. + * + * @param [in] UpdateGuids Image type guids to update (partial update). + * If NULL, try to update all. + * @param [in] UpdateCount Number of Guids in @UpdateGuids. + * @param [in] VendorFlags Vendor Specific flags. + * + * @retval EFI_SUCCESS + * @retval EFI_NOT_READY - Firmware Store in Trial State or + * Not boot correctly using active bank. + * - Temporarily couldn't enter staging. + * @retval EFI_NOT_FOUND Couldn't find one image or more in @UpdateGuid. + * @retval Others fwu_begin_staging isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuBeginStaging ( + IN CONST EFI_GUID *UpdateGuids, + IN UINT32 UpdateCount, + IN UINT32 VendorFlags + ) +{ + EFI_STATUS Status; + PSA_MM_FWU_BEGIN_STAGING_REQ ReqData; + + if ((UpdateCount > 0) && (UpdateGuids == NULL)) { + return EFI_INVALID_PARAMETER; + } + + ReqData.VendorFlags = VendorFlags; + ReqData.PartialUpdateCount = UpdateCount; + + /** + * +-----------------------+ +-------------------------------+ + * | UEFI (FmpDevicePkg) | | StandaloneMm (FwuStMm Driver) | + * +-----------------------+ +-------------------------------+ + * | fwu_begin_staging request | + * | (vendor flags, patrial_update_count, updateGuids) | + * |-------------------------------------------------->| + * | | + * |<--------------------------------------------------| + * fwu_status + * (See PSA-FWU spec 3.4.2.2) + */ + Status = FwuCommunicate ( + PSA_MM_FWU_COMMAND_BEGIN_STAGING, + &ReqData, + UpdateGuids, + sizeof (EFI_GUID) * UpdateCount, + 0, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to %a. Status: %r\n", __func__, Status)); + } + + return Status; +} + +/** + * Send a FWU End Staging request to the StMM and get the associated response, + * thereby finish staging process for firmware update. + * + * @retval EFI_SUCCESS + * @retval EFI_NOT_READY - Firmware store is not on staging state. + * - There're still open image handles. + * @retval EFI_SECURITY_VIOLATION Some updated image fail to authenticate. + * @retval EFI_UNSUPPORTED Update Agent doesn't support partial updates + * or Client has not updated all the images. + * @retval Others fwu_end_staging isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuEndStaging ( + IN VOID + ) +{ + EFI_STATUS Status; + + /** + * +-----------------------+ +-------------------------------+ + * | UEFI (FmpDevicePkg) | | StandaloneMm (FwuStMm Driver) | + * +-----------------------+ +-------------------------------+ + * | fwu_end_staging request | + * |------------------------------------------------>| + * | | + * |<------------------------------------------------| + * fwu_status + * (See PSA-FWU spec 3.4.2.3) + */ + Status = FwuCommunicate ( + PSA_MM_FWU_COMMAND_END_STAGING, + NULL, + NULL, + 0, + 0, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to %a. Status: %r\n", __func__, Status)); + } + + return Status; +} + +/** + * Send a FWU Cancel Staging request to StMM and get the associated response + * thereby cancel staging process for firmware update. + * + * @retval EFI_SUCCESS + * @retval EFI_NOT_READY Firmware store is not on staging state. + * @retval Others fwu_cancel_staging isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuCancelStaging ( + IN VOID + ) +{ + EFI_STATUS Status; + + /** + * +-----------------------+ +-------------------------------+ + * | UEFI (FmpDevicePkg) | | StandaloneMm (FwuStMm Driver) | + * +-----------------------+ +-------------------------------+ + * | fwu_cancel_staging request | + * |------------------------------------------------>| + * | | + * |<------------------------------------------------| + * fwu_status + * (See PSA-FWU spec 3.4.2.4) + */ + Status = FwuCommunicate ( + PSA_MM_FWU_COMMAND_CANCEL_STAGING, + NULL, + NULL, + 0, + 0, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to %a. Status: %r\n", __func__, Status)); + } + + return Status; +} + +/** + * Send a FWU Open request to StMM and get associated response + * thereby open image file handle related to @ImageTypeGuid. + * + * @param [in] ImageTypeGuid Image type guid. + * @param [in] OpType FwuOpStreamRead or FwuOpStreamWrite. + * @param [out] Handle Image File Handle. + * + * @retval EFI_SUCCESS + * @retval EFI_NOT_FOUND Couldn't find image with @ImageTypeGuid. + * @retval EFI_NOT_READY Try to open with write out of staging state. + * @retval EFI_UNSUPPORTED @ImageTypeGuid doesn't support open with @OpType. + * @retval Others fwu_open isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuOpen ( + IN CONST EFI_GUID *ImageTypeGuid, + IN FWU_OP_TYPE OpType, + OUT UINT32 *Handle + ) +{ + EFI_STATUS Status; + PSA_MM_FWU_OPEN_REQ ReqData; + PSA_MM_FWU_OPEN_RESP *RespData; + + if ((ImageTypeGuid == NULL) || (Handle == NULL)) { + return EFI_INVALID_PARAMETER; + } + + *Handle = FWU_INVALID_HANDLE; + + CopyGuid (&ReqData.ImageTypeGuid, ImageTypeGuid); + ReqData.OperationType = OpType; + + /** + * +-----------------------+ +-------------------------------+ + * | UEFI (FmpDevicePkg) | | StandaloneMm (FwuStMm Driver) | + * +-----------------------+ +-------------------------------+ + * | fwu_open request | + * | (image_type_guid, op_type) | + * |-------------------------------------------------->| + * | | + * |<--------------------------------------------------| + * fwu_status && handle + * (See PSA-FWU spec 3.4.2.5) + */ + Status = FwuCommunicate ( + PSA_MM_FWU_COMMAND_OPEN, + &ReqData, + NULL, + 0, + 0, + (VOID **)&RespData + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to %a. Status: %r\n", __func__, Status)); + return Status; + } + + *Handle = RespData->Handle; + + return EFI_SUCCESS; +} + +/** + * Send FWU Write Stream request to StMM and get associated response + * thereby write new firmware image to @Handle. + * + * @param [in] Handle Image file handle. + * @param [in] Buffer New firmware image data. + * @param [in] BufferSize Size of @Buffer in bytes. + * + * @retval EFI_SUCCESS + * @retval EFI_NOT_FOUND Invalid @Handle. + * @retval EFI_OUT_OF_RESOURCE @BufferSize is over maximum image size. + * @retval EFI_ACCESS_DENIED Image cannot be write to. + * @retval EFI_NOT_READY Firmware store isn't staging state. + * @retval Others fwu_write_stream isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuWriteStream ( + IN UINT32 Handle, + IN CONST VOID *Buffer, + IN UINT32 BufferSize + ) +{ + EFI_STATUS Status; + PSA_MM_FWU_WRITE_STREAM_REQ ReqData; + + if ((Handle == FWU_INVALID_HANDLE) || (Buffer == NULL) || (BufferSize == 0)) { + return EFI_INVALID_PARAMETER; + } + + if (BufferSize > FwuGetAvailableReqDataSize (PSA_MM_FWU_COMMAND_WRITE_STREAM)) { + return EFI_BAD_BUFFER_SIZE; + } + + ReqData.Handle = Handle; + ReqData.DataLen = BufferSize; + + /** + * +-----------------------+ +-------------------------------+ + * | UEFI (FmpDevicePkg) | | StandaloneMm (FwuStMm Driver) | + * +-----------------------+ +-------------------------------+ + * | fwu_write_stream request | + * | (handle, data_len, payload) | + * |-------------------------------------------------->| + * | | + * |<--------------------------------------------------| + * fwu_status + * (See PSA-FWU spec 3.4.2.6) + */ + Status = FwuCommunicate ( + PSA_MM_FWU_COMMAND_WRITE_STREAM, + &ReqData, + Buffer, + BufferSize, + 0, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to %a. Status: %r\n", __func__, Status)); + } + + return Status; +} + +/** + * Send FWU Read Stream request to StMM and get associated response + * thereby read firmware image from @Handle. + * + * @param [in] Handle Image file handle. + * @param [out] Buffer Data Buffer + * @param [in] BufferSize Request bytes to read. + * @param [out] ReadyBytes Real read bytes. + * @param [out] TotalBytes Current image size of @Handle. + * + * @retval EFI_SUCCESS + * @retval EFI_NOT_FOUND Invalid @Handle. + * @retval EFI_ACCESS_DENIED Image cannot be read from. + * @retval EFI_NOT_READY Image cannot be read temporarily. + * @retval Others fwu_read_stream isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuReadStream ( + IN UINT32 Handle, + OUT VOID *Buffer, + IN UINT32 BufferSize, + OUT UINT32 *ReadBytes, + OUT UINT32 *TotalBytes + ) +{ + EFI_STATUS Status; + PSA_MM_FWU_READ_STREAM_REQ ReqData; + PSA_MM_FWU_READ_STREAM_RESP *RespData; + UINTN MaxReadSize; + VOID *Payload; + + if ((Handle == FWU_INVALID_HANDLE) || ((BufferSize != 0) && (Buffer == NULL)) || + (ReadBytes == NULL)) + { + return EFI_INVALID_PARAMETER; + } + + MaxReadSize = FwuGetAvailableRespDataSize (PSA_MM_FWU_COMMAND_READ_STREAM); + + ReqData.Handle = Handle; + + *ReadBytes = MIN (BufferSize, MaxReadSize); + + /** + * +-----------------------+ +-------------------------------+ + * | UEFI (FmpDevicePkg) | | StandaloneMm (FwuStMm Driver) | + * +-----------------------+ +-------------------------------+ + * | fwu_read_stream request | + * | (handle) | + * |-------------------------------------------------->| + * | | + * |<--------------------------------------------------| + * fwu_status with + * (read_bytes, total_bytes, payload) + * (See PSA-FWU spec 3.4.2.6) + */ + Status = FwuCommunicate ( + PSA_MM_FWU_COMMAND_READ_STREAM, + &ReqData, + NULL, + 0, + *ReadBytes, + (VOID **)&RespData + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to %a. Status: %r\n", __func__, Status)); + return Status; + } + + Payload = (VOID *)GET_FWU_DATA_BUFFER (RespData); + + if (Buffer != NULL) { + CopyMem (Buffer, Payload, RespData->ReadBytes); + } + + *ReadBytes = RespData->ReadBytes; + + if (TotalBytes != NULL) { + *TotalBytes = RespData->TotalBytes; + } + + return EFI_SUCCESS; +} + +/** + * Send FWU Commit request to StMM and get associated response + * thereby close the Handle and commit the image on firmware storage. + * + * @param [in] Handle Image file handle. + * @param [in] AcceptReq If > 0, Not accept image in commit. + * remain as unacceptable status. + * otherwise, try to accept image in commit. + * @param [in] MaxAtomicTimeNs Maximum time (in ns) executing without + * yielding back to client. + * @param [out] Progress Unit of work already completed. + * @param [out] TotalWork Unit of work must be completed. + * + * @retval EFI_SUCCESS + * @retval EFI_NOT_FOUND Invalid @Handle. + * @retval EFI_SECURITY_VIOLATION Handle is closed but fail to authenticate. + * @retval EFI_TIMEOUT Update procedure is yielded. + * must call again fwu_commit. + * @retval EFI_NOT_READY Image can only be accepted after activation. + * @AcceptReq should be > 0. + * @retval Others fwu_read_stream isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuCommit ( + IN UINT32 Handle, + IN UINT32 AcceptReq, + IN UINT32 MaxAtomicTimeNs, + OUT UINT32 *Progress, + OUT UINT32 *TotalWork + ) +{ + EFI_STATUS Status; + PSA_MM_FWU_COMMIT_REQ ReqData; + PSA_MM_FWU_COMMIT_RESP *RespData; + + if ((Handle == FWU_INVALID_HANDLE) || (Progress == NULL) || (TotalWork == NULL)) { + return EFI_INVALID_PARAMETER; + } + + ReqData.Handle = Handle; + ReqData.AcceptanceReq = AcceptReq; + ReqData.MaxAtomicLen = MaxAtomicTimeNs; + + /** + * +-----------------------+ +-------------------------------+ + * | UEFI (FmpDevicePkg) | | StandaloneMm (FwuStMm Driver) | + * +-----------------------+ +-------------------------------+ + * | fwu_commit request | + * | (handle, accept_req, max_atomic_len) | + * |-------------------------------------------------->| + * | | + * |<--------------------------------------------------| + * fwu_status with + * (progress, total_work) + * (See PSA-FWU spec 3.4.2.8) + */ + Status = FwuCommunicate ( + PSA_MM_FWU_COMMAND_COMMIT, + &ReqData, + NULL, + 0, + 0, + (VOID **)&RespData + ); + if (EFI_ERROR (Status) && (Status != EFI_TIMEOUT)) { + DEBUG ((DEBUG_ERROR, "Failed to %a. Status: %r\n", __func__, Status)); + return Status; + } + + *Progress = RespData->Progress; + *TotalWork = RespData->TotalWork; + + return Status; +} + +/** + * Send FWU Accept Image request to StMM and get associated response + * thereby accept updated image. + * + * Note: + * fwu_accept_image only allow when boot correctly (boot with active_index). + * That means this call only can accept the image on the active indexed bank. + * + * @param [in] ImageTypeGuid Image type guid. + * + * @retval EFI_SUCCESS + * @retval EFI_NOT_FOUND Couldn't find image with @ImageTypeGuid + * @retval EFI_NOT_READY System boot incorrectly. + * @retval Others fwu_accept_image isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuAcceptImage ( + IN CONST EFI_GUID *ImageTypeGuid + ) +{ + EFI_STATUS Status; + PSA_MM_FWU_ACCEPT_IMAGE_REQ ReqData; + + if (ImageTypeGuid == NULL) { + return EFI_INVALID_PARAMETER; + } + + ReqData.Reserved = 0x00000000; + CopyGuid (&ReqData.ImageTypeGuid, ImageTypeGuid); + + /** + * +-----------------------+ +-------------------------------+ + * | UEFI (FmpDevicePkg) | | StandaloneMm (FwuStMm Driver) | + * +-----------------------+ +-------------------------------+ + * | fwu_accpet_image request | + * | (image_type_guid) | + * |-------------------------------------------------->| + * | | + * |<--------------------------------------------------| + * fwu_status + * (See PSA-FWU spec 3.4.2.9) + */ + Status = FwuCommunicate ( + PSA_MM_FWU_COMMAND_ACCEPT_IMAGE, + &ReqData, + NULL, + 0, + 0, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to %a. Status: %r\n", __func__, Status)); + } + + return Status; +} + +/** + * Send FWU Select Previous request to StMM and get associated response. + * When Firmware store is in Trial state or System boot incorrectly, + * Rollback active indexed bank's images using previous indexed ones. + * + * @retval EFI_SUCCESS + * @retval EFI_NOT_READY - System isn't in Trial state or boot correctly. + * - Previous indexed bank couldn't be booted. + * @retval Others fwu_accept_image isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuSelectPrevious ( + IN VOID + ) +{ + EFI_STATUS Status; + + /** + * +-----------------------+ +-------------------------------+ + * | UEFI (FmpDevicePkg) | | StandaloneMm (FwuStMm Driver) | + * +-----------------------+ +-------------------------------+ + * | fwu_select_previous request | + * |------------------------------------------------>| + * | | + * |<------------------------------------------------| + * fwu_status + * (See PSA-FWU spec 3.4.2.10) + */ + Status = FwuCommunicate ( + PSA_MM_FWU_COMMAND_SELECT_PREVIOUS, + NULL, + NULL, + 0, + 0, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to %a. Status: %r\n", __func__, Status)); + } + + return Status; +} + +/** + Clear resources when PsaFwuLibInit() is failed. + +**/ +VOID +EFIAPI +PsaFwuLibExit ( + IN VOID + ) +{ + mPsaFwuMaxBufferSize = 0; + mPsaFwuBuffer = NULL; +} + +/** + Platform Flash Access Lib Constructor. + +**/ +EFI_STATUS +EFIAPI +PsaFwuLibInit ( + IN VOID + ) +{ + EFI_STATUS Status; + + if (MM_SHARED_BUFFER_SIZE == 0) { + return EFI_OUT_OF_RESOURCES; + } + + Status = FwuGetUpdateAgentId (&mUpdateAgentId); + if (EFI_ERROR (Status)) { + return Status; + } + + // Buffer used to communicate with update agent. + // currently, use Non secure shared buffer. + mPsaFwuBuffer = (VOID *)(UINTN)PcdGet64 (PcdMmBufferBase); + mPsaFwuMaxBufferSize = MM_SHARED_BUFFER_SIZE; + + DEBUG ((DEBUG_INFO, "%a: Update agent partition id: 0x%x\n", __func__, mUpdateAgentId)); + DEBUG ((DEBUG_INFO, "%a: mPsaFwuMaxBufferSize: %d\n", __func__, mPsaFwuMaxBufferSize)); + + return EFI_SUCCESS; +} diff --git a/ArmPkg/Library/FmpDevicePsaFwuLib/PsaFwuLib.h b/ArmPkg/Library/FmpDevicePsaFwuLib/PsaFwuLib.h new file mode 100644 index 000000000000..8e423c26061c --- /dev/null +++ b/ArmPkg/Library/FmpDevicePsaFwuLib/PsaFwuLib.h @@ -0,0 +1,273 @@ +/** @file + + Copyright (c) 2024, Arm Limited. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - Platform Security Firmware Update for the A-profile Specification 1.0 + (https://developer.arm.com/documentation/den0118/latest) + +**/ + +#ifndef PSA_FWU_LIB_H_ +#define PSA_FWU_LIB_H_ + +#include + +#define MM_SHARED_BUFFER_SIZE FixedPcdGet64 (PcdMmBufferSize) + +/** + * Send a FWU discovery request to StMM and get the associated response. + * + * @param [out] Discovery Discovery data related to firmware update. + * + * @retval EFI_SUCCESS + * @retval Others fwu_discovery isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuDiscovery ( + OUT PSA_MM_FWU_DISCOVER_RESP **Discovery + ); + +/** + * Send a Begin Staging request to StMM and get the associated response thereby + * start new staging process for firmware update. + * + * @param [in] UpdateGuids Image type guids to update (partial update). + * If NULL, try to update all. + * @param [in] UpdateCount Number of Guids in @UpdateGuids. + * @param [in] VendorFlags Vendor Specific flags. + * + * @retval EFI_SUCCESS + * @retval EFI_NOT_READY - Firmware Store in Trial State or + * Not boot correctly using active bank. + * - Temporarily couldn't enter staging. + * @retval EFI_NOT_FOUND Couldn't find one image or more in @UpdateGuid. + * @retval Others fwu_begin_staging isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuBeginStaging ( + IN CONST EFI_GUID *UpdateGuids, + IN UINT32 UpdateCount, + IN UINT32 VendorFlags + ); + +/** + * Send a FWU Cancel Staging request to StMM and get the associated response + * thereby cancel staging process for firmware update. + * + * @retval EFI_SUCCESS + * @retval EFI_NOT_READY - Firmware store is not on staging state. + * - There're still open image handles. + * @retval EFI_SECURITY_VIOLATION Some updated image fail to authenticate. + * @retval EFI_UNSUPPORTED Update Agent doesn't support partial updates + * or Client has not updated all the images. + * @retval Others fwu_end_staging isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuEndStaging ( + IN VOID + ); + +/** + * Send a FWU Cancel Staging request to StMM and get the associated response + * thereby cancel staging process for firmware update. + * + * @retval EFI_SUCCESS + * @retval EFI_NOT_READY Firmware store is not on staging state. + * @retval Others fwu_end_staging isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuCancelStaging ( + IN VOID + ); + +/** + * Send a FWU Open request to StMM and get associated response + * thereby open image file handle related to @ImageTypeGuid. + * + * @param [in] ImageTypeGuid Image type guid. + * @param [in] OpType FwuOpStreamRead or FwuOpStreamWrite. + * @param [out] Handle Image File Handle. + * + * @retval EFI_SUCCESS + * @retval EFI_NOT_FOUND Couldn't find image with @ImageTypeGuid. + * @retval EFI_NOT_READY Try to open with write out of staging state. + * @retval EFI_UNSUPPORTED @ImageTypeGuid doesn't support open with @OpType. + * @retval Others fwu_open isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuOpen ( + IN CONST EFI_GUID *ImageTypeGuid, + IN FWU_OP_TYPE OpType, + OUT UINT32 *Handle + ); + +/** + * Send FWU Write Stream request to StMM and get associated response + * thereby write new firmware image to @Handle. + * + * @param [in] Handle Image file handle. + * @param [in] Buffer New firmware image data. + * @param [in] BufferSize Size of @Buffer in bytes. + * + * @retval EFI_SUCCESS + * @retval EFI_NOT_FOUND Invalid @Handle. + * @retval EFI_OUT_OF_RESOURCE @BufferSize is over maximum image size. + * @retval EFI_ACCESS_DENIED Image cannot be write to. + * @retval EFI_NOT_READY Firmware store isn't staging state. + * @retval Others fwu_write_stream isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuWriteStream ( + IN UINT32 Handle, + IN CONST VOID *Buffer, + IN UINT32 BufferSize + ); + +/** + * Send FWU Read Stream request to StMM and get associated response + * thereby read firmware image from @Handle. + * + * @param [in] Handle Image file handle. + * @param [out] Buffer Data Buffer + * @param [in] BufferSize Request bytes to read. + * @param [out] ReadyBytes Real read bytes. + * @param [out] TotalBytes Current image size of @Handle. + * + * @retval EFI_SUCCESS + * @retval EFI_NOT_FOUND Invalid @Handle. + * @retval EFI_OUT_OF_RESOURCE @BufferSize is over the bytes can be read. + * @retval EFI_ACCESS_DENIED Image cannot be read from. + * @retval EFI_NOT_READY Image cannot be read temporarily. + * @retval Others fwu_read_stream isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuReadStream ( + IN UINT32 Handle, + OUT VOID *Buffer, + IN UINT32 BufferSize, + OUT UINT32 *ReadBytes, + OUT UINT32 *TotalBytes + ); + +/** + * Send FWU Commit request to StMM and get associated response + * thereby close the Handle and commit the image on firmware storage. + * + * @param [in] Handle Image file handle. + * @param [in] AcceptReq If > 0, Not accept image in commit. + * remain as unacceptable status. + * otherwise, try to accept image in commit. + * @param [in] MaxAtomicTimeNs Maximum time (in ns) executing without + * yielding back to client. + * @param [out] Progress Unit of work already completed. + * @param [out] TotalWork Unit of work must be completed. + * + * @retval EFI_SUCCESS + * @retval EFI_NOT_FOUND Invalid @Handle. + * @retval EFI_SECURITY_VIOLATION Handle is closed but fail to authenticate. + * @retval EFI_TIMEOUT Update procedure is yielded. + * must call again fwu_commit. + * @retval EFI_NOT_READY Image can only be accepted after activation. + * @AcceptReq should be > 0. + * @retval Others fwu_read_stream isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuCommit ( + IN UINT32 Handle, + IN UINT32 AcceptReq, + IN UINT32 MaxAtomicTimeNs, + OUT UINT32 *Progress, + OUT UINT32 *TotalWork + ); + +/** + * Send FWU Accept Image request to StMM and get associated response + * thereby accept updated image. + * + * Note: + * fwu_accept_image only allow when boot correctly (boot with active_index). + * That means this call only can accept the image on the active indexed bank. + * + * @param [in] ImageTypeGuid Image type guid. + * + * @retval EFI_SUCCESS + * @retval EFI_NOT_FOUND Couldn't find image with @ImageTypeGuid + * @retval EFI_NOT_READY System boot incorrectly. + * @retval Others fwu_accept_image isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuAcceptImage ( + IN CONST EFI_GUID *ImageTypeGuid + ); + +/** + * Send FWU Select Previous request to StMM and get associated response. + * When Firmware store is in Trial state or System boot incorrectly, + * Rollback active indexed bank's images using previous indexed ones. + * + * @retval EFI_SUCCESS + * @retval EFI_NOT_READY - System isn't in Trial state or boot correctly. + * - Previous indexed bank couldn't be booted. + * @retval Others fwu_accept_image isn't implemented or + * Error while communicating StMM. + */ +EFI_STATUS +EFIAPI +FwuSelectPrevious ( + IN VOID + ); + +/** + Clear resources allocated by PsaFwuLibInit(). +**/ +VOID +EFIAPI +PsaFwuLibExit ( + IN VOID + ); + +/** + Platform Flash Access Lib Constructor. +**/ +EFI_STATUS +EFIAPI +PsaFwuLibInit ( + IN VOID + ); + +/** + * Convert MmCommunication related addresses on VirtualAddress Change Event. + * + * @param [in] Event Registered VirtualAddress Change Event. + * @param [in] Context Additional Data. + * + */ +VOID +EFIAPI +PsaFwuVirtualAddressChangeEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ); + +#endif // PSA_FWU_LIB_H_ From 0d6e438a6f970390668d760ce0e60175f0c404b6 Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Thu, 15 Jan 2026 16:48:05 +0000 Subject: [PATCH 1041/1172] ArmPkg/Library: separate request parsing from DelegatedEventLoop() Separate request parsing from DelegatedEventLoop() to improve the readibility of this function. Signed-off-by: Yeoreum Yun --- .../ArmStandaloneMmCoreEntryPoint.c | 234 ++++++++++++------ 1 file changed, 152 insertions(+), 82 deletions(-) diff --git a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c index 9dab8844ea8c..a93a7e85bf50 100644 --- a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c +++ b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c @@ -849,6 +849,143 @@ InitializeMiscMmCommunicateBuffer ( CopyGuid (&Buffer->HeaderGuid, ServiceGuid); } +/** + Parse SPM-MM request from EventCompleteSvcArgs. + + @param [in] EventCompleteSvcArgs Pointer to the event completion arguments. + @param [out] MmHandlerContext MmHandlerContext. + @param [out] CommBufferAddr Request buffer address. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER Invalid request. + +**/ +STATIC +EFI_STATUS +EFIAPI +ParseSpmMmSvcRequest ( + IN ARM_SVC_ARGS *EventCompleteSvcArgs, + OUT ARM_MM_HANDLER_CONTEXT *MmHandlerContext, + UINTN *CommBufferAddr + ) +{ + SPM_MM_MSG_INFO *SpmMmInfo; + + /* + * Register Convention for SPM_MM + * Arg0: ARM_SMC_ID_MM_COMMUNICATE + * Arg1: Communication Buffer + * Arg2: Size of Communication Buffer + * Arg3: Cpu number where StandaloneMm running on. + * + * See tf-a/services/std_svc/spm/spm_mm/spm_mm_main.c + */ + if (EventCompleteSvcArgs->Arg0 != ARM_SMC_ID_MM_COMMUNICATE) { + DEBUG (( + DEBUG_ERROR, + "Error: Unrecognized SPM_MM Id: 0x%x\n", + EventCompleteSvcArgs->Arg0 + )); + return EFI_INVALID_PARAMETER; + } + + SpmMmInfo = &MmHandlerContext->CtxData.SpmMmInfo; + *CommBufferAddr = EventCompleteSvcArgs->Arg1; + SpmMmInfo->ServiceType = ServiceTypeMmCommunication; + SpmMmInfo->SecureRequest = IsSecureMmCommBufferAddr (*CommBufferAddr); + + return EFI_SUCCESS; +} + +/** + Parse FF-A request from EventCompleteSvcArgs. + + @param [in] EventCompleteSvcArgs Pointer to the event completion arguments. + @param [out] MmHandlerContext MmHandlerContext. + @param [out] CommBufferAddr Request buffer address. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER Invalid FF-A request. + +**/ +STATIC +EFI_STATUS +EFIAPI +ParseFfaSvcRequest ( + IN ARM_SVC_ARGS *EventCompleteSvcArgs, + OUT ARM_MM_HANDLER_CONTEXT *MmHandlerContext, + UINTN *CommBufferAddr + ) +{ + FFA_MSG_INFO *FfaMsgInfo; + SERVICE_TYPE ServiceType; + EFI_GUID ServiceGuid; + UINT64 Uuid[2]; + + MmHandlerContext->CommProtocol = CommProtocolFfa; + + /* + * Register Convention for FF-A + * Arg0: ARM_FID_FFA_MSG_SEND_DIRECT_REQ/REQ2 + * Arg1: Sender and Receiver endpoint IDs. + * Arg2: Message Flags for ARM_FID_FFA_MSG_SEND_DIRECT_REQ + * Low 8 bytes of UUID for ARM_FID_FFA_MSG_SEND_DIRECT_REQ2 + * Arg3: Implementation Defined for ARM_FID_FFA_MSG_SEND_DIRECT_REQ + * High 8 bytes of UUID for ARM_FID_FFA_MSG_SEND_DIRECT_REQ2 + * Others: Implementation Defined. + * + * See Arm Firmware Framework for Arm A-Profile for detail. + */ + + FfaMsgInfo = &MmHandlerContext->CtxData.FfaMsgInfo; + FfaMsgInfo->SourcePartId = GET_SOURCE_PARTITION_ID (EventCompleteSvcArgs->Arg1); + FfaMsgInfo->DestPartId = GET_DEST_PARTITION_ID (EventCompleteSvcArgs->Arg1); + + if (EventCompleteSvcArgs->Arg0 == ARM_FID_FFA_MSG_SEND_DIRECT_REQ) { + FfaMsgInfo->DirectMsgVersion = DirectMsgV1; + ServiceType = ServiceTypeMmCommunication; + } else if (EventCompleteSvcArgs->Arg0 == ARM_FID_FFA_MSG_SEND_DIRECT_REQ2) { + FfaMsgInfo->DirectMsgVersion = DirectMsgV2; + Uuid[0] = EventCompleteSvcArgs->Arg2; + Uuid[1] = EventCompleteSvcArgs->Arg3; + ConvertUuidToGuid ((GUID *)Uuid, &ServiceGuid); + ServiceType = GetServiceType (&ServiceGuid); + } else { + DEBUG (( + DEBUG_ERROR, + "Error: Unrecognized FF-A Id: 0x%x\n", + EventCompleteSvcArgs->Arg0 + )); + return EFI_INVALID_PARAMETER; + } + + FfaMsgInfo->ServiceType = ServiceType; + + if (ServiceType == ServiceTypeMmCommunication) { + if (FfaMsgInfo->DirectMsgVersion == DirectMsgV1) { + *CommBufferAddr = EventCompleteSvcArgs->Arg3; + } else { + *CommBufferAddr = EventCompleteSvcArgs->Arg4; + } + } else if (ServiceType == ServiceTypeMisc) { + /* + * In case of Misc service, generate mm communication header + * to dispatch service via StandaloneMmCore. + */ + InitializeMiscMmCommunicateBuffer ( + EventCompleteSvcArgs, + &ServiceGuid, + mMiscMmCommunicateBuffer + ); + *CommBufferAddr = (UINTN)mMiscMmCommunicateBuffer; + } else { + DEBUG ((DEBUG_ERROR, "Error: Invalid FF-A Service...\n")); + return EFI_INVALID_PARAMETER; + } + + return EFI_SUCCESS; +} + /** A loop to delegate events from SPMC. DelegatedEventLoop() calls ArmCallSvc() to exit to SPMC. @@ -870,14 +1007,10 @@ DelegatedEventLoop ( ) { EFI_STATUS Status; - UINT64 Uuid[2]; VOID *CommData; - EFI_GUID ServiceGuid; SERVICE_TYPE ServiceType; UINTN CommBufferAddr; ARM_MM_HANDLER_CONTEXT MmHandlerContext; - FFA_MSG_INFO *FfaMsgInfo; - SPM_MM_MSG_INFO *SpmMmInfo; CommData = NULL; @@ -899,91 +1032,28 @@ DelegatedEventLoop ( MmHandlerContext.CommProtocol = CommProtocol; if (CommProtocol == CommProtocolFfa) { - /* - * Register Convention for FF-A - * Arg0: ARM_FID_FFA_MSG_SEND_DIRECT_REQ/REQ2 - * Arg1: Sender and Receiver endpoint IDs. - * Arg2: Message Flags for ARM_FID_FFA_MSG_SEND_DIRECT_REQ - * Low 8 bytes of UUID for ARM_FID_FFA_MSG_SEND_DIRECT_REQ2 - * Arg3: Implementation Defined for ARM_FID_FFA_MSG_SEND_DIRECT_REQ - * High 8 bytes of UUID for ARM_FID_FFA_MSG_SEND_DIRECT_REQ2 - * Others: Implementation Defined. - * - * See Arm Firmware Framework for Arm A-Profile for detail. - */ - FfaMsgInfo = &MmHandlerContext.CtxData.FfaMsgInfo; - FfaMsgInfo->SourcePartId = GET_SOURCE_PARTITION_ID (EventCompleteSvcArgs->Arg1); - FfaMsgInfo->DestPartId = GET_DEST_PARTITION_ID (EventCompleteSvcArgs->Arg1); - CommData = FfaMsgInfo; - - if (EventCompleteSvcArgs->Arg0 == ARM_FID_FFA_MSG_SEND_DIRECT_REQ) { - FfaMsgInfo->DirectMsgVersion = DirectMsgV1; - ServiceType = ServiceTypeMmCommunication; - } else if (EventCompleteSvcArgs->Arg0 == ARM_FID_FFA_MSG_SEND_DIRECT_REQ2) { - FfaMsgInfo->DirectMsgVersion = DirectMsgV2; - Uuid[0] = EventCompleteSvcArgs->Arg2; - Uuid[1] = EventCompleteSvcArgs->Arg3; - ConvertUuidToGuid ((GUID *)Uuid, &ServiceGuid); - ServiceType = GetServiceType (&ServiceGuid); - } else { - Status = EFI_INVALID_PARAMETER; - DEBUG (( - DEBUG_ERROR, - "Error: Unrecognized FF-A Id: 0x%x\n", - EventCompleteSvcArgs->Arg0 - )); + Status = ParseFfaSvcRequest ( + EventCompleteSvcArgs, + &MmHandlerContext, + &CommBufferAddr + ); + if (EFI_ERROR (Status)) { goto ExitHandler; } - FfaMsgInfo->ServiceType = ServiceType; - - if (ServiceType == ServiceTypeMmCommunication) { - if (FfaMsgInfo->DirectMsgVersion == DirectMsgV1) { - CommBufferAddr = EventCompleteSvcArgs->Arg3; - } else { - CommBufferAddr = EventCompleteSvcArgs->Arg4; - } - } else if (ServiceType == ServiceTypeMisc) { - /* - * In case of Misc service, generate mm communication header - * to dispatch service via StandaloneMmCore. - */ - InitializeMiscMmCommunicateBuffer ( - EventCompleteSvcArgs, - &ServiceGuid, - mMiscMmCommunicateBuffer - ); - CommBufferAddr = (UINTN)mMiscMmCommunicateBuffer; - } else { - Status = EFI_INVALID_PARAMETER; - DEBUG ((DEBUG_ERROR, "Error: Invalid FF-A Service...\n")); - goto ExitHandler; - } + ServiceType = MmHandlerContext.CtxData.FfaMsgInfo.ServiceType; + CommData = &MmHandlerContext.CtxData.FfaMsgInfo; } else if (CommProtocol == CommProtocolSpmMm) { - /* - * Register Convention for SPM_MM - * Arg0: ARM_SMC_ID_MM_COMMUNICATE - * Arg1: Communication Buffer - * Arg2: Size of Communication Buffer - * Arg3: Cpu number where StandaloneMm running on. - * - * See tf-a/services/std_svc/spm/spm_mm/spm_mm_main.c - */ - if (EventCompleteSvcArgs->Arg0 != ARM_SMC_ID_MM_COMMUNICATE) { - Status = EFI_INVALID_PARAMETER; - DEBUG (( - DEBUG_ERROR, - "Error: Unrecognized SPM_MM Id: 0x%x\n", - EventCompleteSvcArgs->Arg0 - )); + Status = ParseSpmMmSvcRequest ( + EventCompleteSvcArgs, + &MmHandlerContext, + &CommBufferAddr + ); + if (EFI_ERROR (Status)) { goto ExitHandler; } - SpmMmInfo = &MmHandlerContext.CtxData.SpmMmInfo; - ServiceType = ServiceTypeMmCommunication; - CommBufferAddr = EventCompleteSvcArgs->Arg1; - SpmMmInfo->ServiceType = ServiceType; - SpmMmInfo->SecureRequest = IsSecureMmCommBufferAddr (CommBufferAddr); + ServiceType = MmHandlerContext.CtxData.SpmMmInfo.ServiceType; } if (ServiceType == ServiceTypeMmCommunication) { From b1707d99ae05b7e3f70b28fee830fbad131de5b5 Mon Sep 17 00:00:00 2001 From: Sughosh Ganu Date: Wed, 22 Oct 2025 13:02:40 +0530 Subject: [PATCH 1042/1172] DynamicTablesPkg: add SSDT DMC620 PMU table generator The Generic ACPI for Arm Components 1.2 Platform Design Document [1], section 2.6.1.2 "ASL reference code for the DMC620 PMU" provides information to describe the Arm Corelink DMC620 Dynamic Memory Controller's Performance Monitoring Unit (PMU) block using an ASL definition block table. Add support for a table generator for the DMC620 PMU block. The table generator uses the Configuration Manager protocol to obtain the following information. - Number of sockets on the platform - DMC620 devices per socket After obtaining the socket based topology, information is obtained on individual DMC620 devices. This includes - PMU register base address and length - Information on the associated PMU interrupt The table generator uses the Dynamic AML CodeGen API's for generating the table from the information obtained through the Configuration Manager protocol. [1] - https://developer.arm.com/documentation/den0093/1-2eac1/ Signed-off-by: Sughosh Ganu --- DynamicTablesPkg/DynamicTables.dsc.inc | 3 + DynamicTablesPkg/DynamicTablesPkg.ci.yaml | 2 + DynamicTablesPkg/Include/AcpiTableGenerator.h | 5 + .../Include/ArmNameSpaceObjects.h | 31 + .../SsdtDmc620PmuGenerator.c | 718 ++++++++++++++++++ .../SsdtDmc620PmuGenerator.h | 32 + .../SsdtDmc620PmuLibArm.inf | 31 + .../ConfigurationManagerObjectParser.c | 17 + 8 files changed, 839 insertions(+) create mode 100644 DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtDmc620PmuLibArm/SsdtDmc620PmuGenerator.c create mode 100644 DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtDmc620PmuLibArm/SsdtDmc620PmuGenerator.h create mode 100644 DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtDmc620PmuLibArm/SsdtDmc620PmuLibArm.inf diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc index 998528bd02a2..0b8173439aac 100644 --- a/DynamicTablesPkg/DynamicTables.dsc.inc +++ b/DynamicTablesPkg/DynamicTables.dsc.inc @@ -111,6 +111,8 @@ # AML Fixup (Arm specific) DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCmn600LibArm/SsdtCmn600LibArm.inf + DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtDmc620PmuLibArm/SsdtDmc620PmuLibArm.inf + # # Dynamic Table Factory Dxe # @@ -140,6 +142,7 @@ NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSsdtSerialPortLib/SsdtSerialPortLib.inf # Arm specific NULL|DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCmn600LibArm/SsdtCmn600LibArm.inf + NULL|DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtDmc620PmuLibArm/SsdtDmc620PmuLibArm.inf # AML Codegen # Common diff --git a/DynamicTablesPkg/DynamicTablesPkg.ci.yaml b/DynamicTablesPkg/DynamicTablesPkg.ci.yaml index 2f5dccf2e62f..d4a327d2c463 100644 --- a/DynamicTablesPkg/DynamicTablesPkg.ci.yaml +++ b/DynamicTablesPkg/DynamicTablesPkg.ci.yaml @@ -99,6 +99,7 @@ "ExtendWords": [ "ARMHB", # ARMHB000 "ARMHC", # ARMHC600 + "ARMHD", # ARMHD620 "ARMLTD", "AMLDBG", "EISAID", @@ -131,6 +132,7 @@ "ROOTNODEBASE", "sapic", "ssdtcmn", + "ssdtdmc", "ssdtserialporttemplate", "SMCCC", "SMMUV", diff --git a/DynamicTablesPkg/Include/AcpiTableGenerator.h b/DynamicTablesPkg/Include/AcpiTableGenerator.h index 0cbc74c964f8..92d329133045 100755 --- a/DynamicTablesPkg/Include/AcpiTableGenerator.h +++ b/DynamicTablesPkg/Include/AcpiTableGenerator.h @@ -69,6 +69,10 @@ The Dynamic Tables Framework implements the following ACPI table generators: The SSDT Cpu-Topology generator collates the cpu and LPI information from the Configuration Manager and generates a SSDT table describing the CPU hierarchy. + - SSDT DMC-620 PMU: + The SSDT DMC620 PMU generator collates the PMU specific information + from the Configuration Manager and uses the Dynamic AML CodeGen + API's to build the SSDT DMC620 PMU table. - SSDT Pci-Express: The SSDT Pci Express generator collates the Pci Express information from the Configuration Manager and generates a @@ -122,6 +126,7 @@ typedef enum StdAcpiTableId { EStdAcpiTableIdCedt, ///< CEDT Generator EStdAcpiTableIdSlit, ///< SLIT Generator EStdAcpiTableIdRhct, ///< RHCT Generator + EStdAcpiTableIdSsdtDmc620Pmu, ///< SSDT DMC620 PMU Generator EStdAcpiTableIdMax } ESTD_ACPI_TABLE_ID; diff --git a/DynamicTablesPkg/Include/ArmNameSpaceObjects.h b/DynamicTablesPkg/Include/ArmNameSpaceObjects.h index e4f9d96300f7..eb2e965e21e4 100644 --- a/DynamicTablesPkg/Include/ArmNameSpaceObjects.h +++ b/DynamicTablesPkg/Include/ArmNameSpaceObjects.h @@ -52,6 +52,8 @@ typedef enum ArmObjectID { EArmObjRmr, ///< 21 - Reserved Memory Range Node EArmObjMemoryRangeDescriptor, ///< 22 - Memory Range Descriptor EArmObjEtInfo, ///< 23 - Embedded Trace Extension/Module Info + EArmObjDmc620PmuSocketInfo, ///< 24 - DMC620 Socket Info + EArmObjDmc620PmuRegInfo, ///< 25 - DMC620 PMU Reg Info EArmObjMax } EARM_OBJECT_ID; @@ -691,6 +693,35 @@ typedef struct CmArmCmn600Info { CM_ARM_EXTENDED_INTERRUPT DtcInterrupt[4]; } CM_ARM_CMN_600_INFO; +/** A structure that describes the DMC620 PMU hardware + registers and interrupt. + + ID: EArmObjDmc620PmuRegInfo +*/ +typedef struct CmArmDmc620PmuRegInfo { + /// The Base address of PMU register space in the DMC620 device. + UINT64 BaseAddress; + + /// Length of the DMC620 PMU registers + UINT64 Length; + + /// The DMC620 PMU interrupt descriptor + CM_ARM_EXTENDED_INTERRUPT PmuIntr; +} CM_ARM_DMC620_PMU_REG_INFO; + +/** A structure that describes the DMC620 PMU hardware + on a socket. + + ID: EArmObjDmc620PmuSocketInfo +*/ +typedef struct CmArmDmc620PmuSocketInfo { + /// Number of devices on this socket + UINT8 NumDevices; + + /// Array of DMC620 PMU devices on this socket + CM_OBJECT_TOKEN Dmc620PmuRegInfoToken; +} CM_ARM_DMC620_INFO; + /** A structure that describes the RMR node for the Platform. diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtDmc620PmuLibArm/SsdtDmc620PmuGenerator.c b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtDmc620PmuLibArm/SsdtDmc620PmuGenerator.c new file mode 100644 index 000000000000..e2050c6fa085 --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtDmc620PmuLibArm/SsdtDmc620PmuGenerator.c @@ -0,0 +1,718 @@ +/** @file + SSDT DMC620 AML Table Generator. + + Copyright (c) 2025, Arm Limited. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - Arm CoreLink DMC-620 Dynamic Memory Controller Technical Reference Manual r1p0 + - ACPI for the Arm Components 1.2 EAC1 Platform Design Document, + dated July 2025. + (https://developer.arm.com/documentation/den0093/1-2eac1/) +**/ + +#include +#include +#include + +// Module specific include files. +#include +#include +#include +#include +#include +#include +#include "SsdtDmc620PmuGenerator.h" + +/** SSDT DMC620 PMU Table Generator. + + Requirements: + The following Configuration Manager Object(s) are required by + this Generator: + - EArmObjDmc620SocketInfo + - EArmObjDmc620PmuRegInfo +*/ + +/** This macro expands to a function that retrieves the DMC620 PMU + Socket Information from the Configuration Manager. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceArm, + EArmObjDmc620PmuSocketInfo, + CM_ARM_DMC620_INFO + ); + +/** This macro expands to a function that retrieves the DMC620 PMU + Register Information from the Configuration Manager. +*/ +GET_OBJECT_LIST ( + EObjNameSpaceArm, + EArmObjDmc620PmuRegInfo, + CM_ARM_DMC620_PMU_REG_INFO + ); + +/** Check the DMC620 PMU Information for a given socket. + + @param [in] Dmc620PmuRegInfo Array of DMC620 information structure. + @param [in] DevCount Count of DMC620 devices to validate. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. +**/ +STATIC +EFI_STATUS +EFIAPI +ValidateDmc620PmuInfo ( + IN CONST CM_ARM_DMC620_PMU_REG_INFO *CONST Dmc620PmuRegInfo, + IN UINT32 DevCount + ) +{ + UINT32 DevNum; + CONST CM_ARM_DMC620_PMU_REG_INFO *RegInfo; + CONST CM_ARCH_COMMON_GENERIC_INTERRUPT *PmuIntr; + + if ((Dmc620PmuRegInfo == NULL) || (DevCount == 0)) { + return EFI_INVALID_PARAMETER; + } + + for (DevNum = 0; DevNum < DevCount; DevNum++) { + RegInfo = &Dmc620PmuRegInfo[DevNum]; + // Check Base address is initialized + if (RegInfo->BaseAddress == 0) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620: Invalid PMU Base Address.\n" + )); + goto error_handler; + } + + if (RegInfo->Length != DMC620_PERIPHBASE_MAX_ADDRESS_LENGTH) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620: Invalid PMU Length.\n" + )); + goto error_handler; + } + + // The PMU registers in the DMC620 start at an offset of + // 0xA00. Check that that is so. + if ((RegInfo->BaseAddress & DMC620_REGISTER_SPACE_MASK) != + DMC620_PMU_ADDRESS_OFFSET) + { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620: PMU Address offset must be 0xA00.\n" + )); + goto error_handler; + } + + PmuIntr = &RegInfo->PmuIntr; + if ((PmuIntr->Flags & BIT0) != 0) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC-620: PMU Interrupt must be Level Triggered.\n" + )); + goto error_handler; + } + + if ((PmuIntr->Flags & BIT1) != 0) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC-620: PMU Interrupt must be Active High.\n" + )); + goto error_handler; + } + } + + return EFI_SUCCESS; + +error_handler: + + ASSERT (FALSE); + + DEBUG (( + DEBUG_ERROR, + "PmuBaseAddress = 0x%llx\n" + "PmuBaseAddressLength = 0x%llx\n" + "PmuInterrupt = 0x%lx\n" + "PmuInterruptFlags = 0x%lx\n", + RegInfo->BaseAddress, + RegInfo->Length, + RegInfo->PmuIntr.Interrupt, + RegInfo->PmuIntr.Flags + )); + + return EFI_INVALID_PARAMETER; +} + +/** + Create the _CRS (Current Resource Settings) AML node for the device. + + @param [in] Dmc620PmuRegInfo Pointer to the register info structure. + @param [in] DeviceNode AML device node handle. + + @retval EFI_SUCCESS The CRS node was created successfully. + @retval Others Failed to create CRS node. +**/ +STATIC +EFI_STATUS +EFIAPI +CreateDmc620PmuCrs ( + IN CONST CM_ARM_DMC620_PMU_REG_INFO *CONST Dmc620PmuRegInfo, + IN AML_OBJECT_NODE_HANDLE DeviceNode + ) +{ + UINT32 Intr; + UINT64 Length; + UINT64 BaseAddress; + EFI_STATUS Status; + AML_OBJECT_NODE_HANDLE CrsNode; + + Status = AmlCodeGenNameResourceTemplate ("_CRS", DeviceNode, &CrsNode); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620-AML-CODEGEN: Failed to create AML _CRS Node." + " Status = %r\n", + Status + )); + return Status; + } + + BaseAddress = Dmc620PmuRegInfo->BaseAddress; + Length = Dmc620PmuRegInfo->Length; + Status = AmlCodeGenRdQWordMemory ( + FALSE, + TRUE, + TRUE, + TRUE, + AmlMemoryNonCacheable, + TRUE, + 0x0, + BaseAddress, + BaseAddress + Length - 1, + 0, + Length, + 0, + NULL, + 0, + TRUE, + CrsNode, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create AML QWordMemory Node." + " Status = %r\n", + Status + )); + return Status; + } + + Intr = Dmc620PmuRegInfo->PmuIntr.Interrupt; + Status = AmlCodeGenRdInterrupt ( + TRUE, + FALSE, + FALSE, + FALSE, + &Intr, + 1, + CrsNode, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-SERIAL-PORT-FIXUP: Failed to create AML Interrupt Node." + " Status = %r\n", + Status + )); + return Status; + } + + return EFI_SUCCESS; +} + +/** Build a SSDT table describing the DMC620 PMU register space. + + Add device nodes describing the DMC620 PMU register space, one + socket at a time. + + @param [in] Uid For this socket, generate UID ids + from this value onward. + @param [in] SockNum Socket number on which devices are + present. + @param [in] DevCount Number of devices on this socket. + @param [in] ScopeNode AML System Bus node handle. + @param [in] Dmc620PmuRegInfo Array of DMC620 information structure. + + @retval EFI_SUCCESS Device nodes added successfully. + @retval Others Failed to create the device nodes. +**/ +STATIC +EFI_STATUS +EFIAPI +BuildDmc620PmuSocket ( + IN UINT64 Uid, + IN CONST UINT32 SockNum, + IN CONST UINT32 DevCount, + IN CONST AML_OBJECT_NODE_HANDLE ScopeNode, + IN CONST CM_ARM_DMC620_PMU_REG_INFO *CONST Dmc620PmuRegInfo + ) +{ + UINT32 DevNum; + CHAR8 Name[AML_NAME_SEG_SIZE + 1]; + CHAR16 Str[32]; + EFI_STATUS Status; + AML_OBJECT_NODE_HANDLE DeviceNode; + + // Validate the DMC620 Info and get the number of devices. + Status = ValidateDmc620PmuInfo (Dmc620PmuRegInfo, DevCount); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620: Invalid DMC620 PMU information. Status = %r\n", + Status + )); + return Status; + } + + Name[0] = 'M'; + Name[1] = 'C'; + Name[4] = '\0'; + + for (DevNum = 0; DevNum < DevCount; DevNum++, Uid++) { + Name[2] = AsciiFromHex ((Uid >> 4) & 0xF); + Name[3] = AsciiFromHex (Uid & 0xF); + + Status = AmlCodeGenDevice (Name, ScopeNode, &DeviceNode); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620: Failed to create AML Device Node." + " Status = %r\n", + Status + )); + return Status; + } + + Status = AmlCodeGenNameString ( + "_HID", + "ARMHD620", + DeviceNode, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620-AML-CODEGEN: Failed to create AML _HID Node." + " Status = %r\n", + Status + )); + return Status; + } + + Status = AmlCodeGenNameString ( + "_CID", + "ARMHD620", + DeviceNode, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620-AML-CODEGEN: Failed to create AML _CID Node." + " Status = %r\n", + Status + )); + return Status; + } + + Status = AmlCodeGenNameInteger ("_UID", Uid, DeviceNode, NULL); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620-AML-CODEGEN: Failed to create AML _UID Node." + " Status = %r\n", + Status + )); + return Status; + } + + Status = AmlCodeGenNameInteger ("_CCA", 1, DeviceNode, NULL); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620-AML-CODEGEN: Failed to create AML _CCA Node." + " Status = %r\n", + Status + )); + return Status; + } + + UnicodeSPrint (Str, sizeof (Str), L"Socket %u: MCU%u", SockNum, DevNum); + Status = AmlCodeGenNameUnicodeString ( + "_STR", + Str, + DeviceNode, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620-AML-CODEGEN: Failed to create AML _STR Node." + " Status = %r\n", + Status + )); + return Status; + } + + Status = AmlCodeGenMethodRetInteger ( + "_STA", + 0x0F, + 0, + FALSE, + 0, + DeviceNode, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620-AML-CODEGEN: Failed to create AML _STA Node." + " Status = %r\n", + Status + )); + return Status; + } + + Status = CreateDmc620PmuCrs (&Dmc620PmuRegInfo[DevNum], DeviceNode); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620-AML-CODEGEN: Failed to create AML _CRS Node." + " Status = %r\n", + Status + )); + return Status; + } + } + + return EFI_SUCCESS; +} + +/** Construct SSDT tables for describing DMC620 PMU interface. + + This function invokes the Configuration Manager protocol interface + to get the required hardware information for generating the ACPI + table. + + If this function allocates any resources then they must be freed + in the FreeXXXXTableRes function. + + @param [in] This Pointer to the ACPI table generator. + @param [in] AcpiTableInfo Pointer to the ACPI table information. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol interface. + @param [out] Table Pointer to the generated ACPI table. + + @retval EFI_SUCCESS Table generated successfully. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_UNSUPPORTED Unsupported configuration. +**/ +STATIC +EFI_STATUS +EFIAPI +BuildSsdtDmc620PmuTable ( + IN CONST ACPI_TABLE_GENERATOR *This, + IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + OUT EFI_ACPI_DESCRIPTION_HEADER **Table + ) +{ + AML_ROOT_NODE_HANDLE RootNode; + AML_OBJECT_NODE_HANDLE ScopeNode; + EFI_STATUS Status; + EFI_STATUS Status1; + UINT64 Uid; + UINT32 DevCount; + UINT32 SockNum; + UINT32 SocketCount; + CM_ARM_DMC620_PMU_REG_INFO *Dmc620PmuRegInfo; + CM_ARM_DMC620_INFO *Dmc620PmuSockInfo; + + ASSERT (This != NULL); + ASSERT (AcpiTableInfo != NULL); + ASSERT (CfgMgrProtocol != NULL); + ASSERT (Table != NULL); + ASSERT (AcpiTableInfo->TableGeneratorId == This->GeneratorID); + ASSERT (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature); + + *Table = NULL; + + Status = GetEArmObjDmc620PmuSocketInfo ( + CfgMgrProtocol, + CM_NULL_TOKEN, + &Dmc620PmuSockInfo, + &SocketCount + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620: Failed to get the DMC620 Socket information." + " Status = %r\n", + Status + )); + return Status; + } + + if (SocketCount == 0) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620: Invalid DMC620 Socket information.\n" + )); + return EFI_INVALID_PARAMETER; + } + + Status = AmlCodeGenDefinitionBlock ( + "SSDT", + "ARMLTD", + "DMC-620", + 0x01, + &RootNode + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620: Failed to create AML Definition Block." + " Status = %r\n", + Status + )); + ASSERT_EFI_ERROR (Status); + return Status; + } + + Status = AmlCodeGenScope ("\\_SB_", RootNode, &ScopeNode); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620: Failed to create AML Scope Node." + " Status = %r\n", + Status + )); + goto error_handler; + } + + Uid = 0; + for (SockNum = 0; SockNum < SocketCount; SockNum++) { + DevCount = 0; + Status = GetEArmObjDmc620PmuRegInfo ( + CfgMgrProtocol, + Dmc620PmuSockInfo[SockNum].Dmc620PmuRegInfoToken, + &Dmc620PmuRegInfo, + &DevCount + ); + + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620: Failed to get the DMC620 per socket device information.\n" + " Status = %r\n", + Status + )); + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + if ((DevCount == 0) || (Dmc620PmuSockInfo[SockNum].NumDevices != DevCount)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620: Invalid DMC620 device information.\n" + )); + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status = BuildDmc620PmuSocket ( + Uid, + SockNum, + DevCount, + ScopeNode, + Dmc620PmuRegInfo + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620: Failed to build table for DMC620." + " Status = %r\n", + Status + )); + goto error_handler; + } + + Uid += DevCount; + } + + // Serialize the tree. + Status = AmlSerializeDefinitionBlock ( + RootNode, + Table + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620: Failed to Serialize SSDT Table Data." + " Status = %r\n", + Status + )); + goto error_handler; + } + + return EFI_SUCCESS; + +error_handler: + if (RootNode != NULL) { + Status1 = AmlDeleteTree (RootNode); + if (EFI_ERROR (Status1)) { + DEBUG (( + DEBUG_ERROR, + "ERROR: SSDT-DMC620-AML-CODEGEN: Failed to cleanup AML tree." + " Status = %r\n", + Status1 + )); + } + } + + return Status; +} + +/** Free any resources allocated for constructing the SSDT tables for DMC620 PMU. + + @param [in] This Pointer to the ACPI table generator. + @param [in] AcpiTableInfo Pointer to the ACPI Table Info. + @param [in] CfgMgrProtocol Pointer to the Configuration Manager + Protocol Interface. + @param [in, out] Table Pointer to ACPI Table. + + @retval EFI_SUCCESS The resources were freed successfully. + @retval EFI_INVALID_PARAMETER The table pointer is NULL or invalid. +**/ +STATIC +EFI_STATUS +EFIAPI +FreeSsdtDmc620PmuTableRes ( + IN CONST ACPI_TABLE_GENERATOR *CONST This, + IN CONST CM_STD_OBJ_ACPI_TABLE_INFO *CONST AcpiTableInfo, + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, + IN OUT EFI_ACPI_DESCRIPTION_HEADER **CONST Table + ) +{ + ASSERT (This != NULL); + ASSERT (AcpiTableInfo != NULL); + ASSERT (CfgMgrProtocol != NULL); + ASSERT (AcpiTableInfo->TableGeneratorId == This->GeneratorID); + ASSERT (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature); + + if ((Table == NULL) || (*Table == NULL)) { + DEBUG ((DEBUG_ERROR, "ERROR: SSDT-DMC620: Invalid Table Pointer\n")); + ASSERT ((Table != NULL) && (*Table != NULL)); + return EFI_INVALID_PARAMETER; + } + + FreePool (*Table); + *Table = NULL; + + return EFI_SUCCESS; +} + +/** This macro defines the Raw Generator revision. +*/ +#define SSDT_DMC620_PMU_GENERATOR_REVISION CREATE_REVISION (1, 0) + +/** The interface for the Raw Table Generator. +*/ +STATIC +CONST +ACPI_TABLE_GENERATOR SsdtDmc620PmuGenerator = { + // Generator ID + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdSsdtDmc620Pmu), + // Generator Description + L"ACPI.STD.SSDT.DMC620.PMU.GENERATOR", + // ACPI Table Signature + EFI_ACPI_6_6_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, + // ACPI Table Revision - Unused + 0, + // Minimum ACPI Table Revision - Unused + 0, + // Creator ID + TABLE_GENERATOR_CREATOR_ID_ARM, + // Creator Revision + SSDT_DMC620_PMU_GENERATOR_REVISION, + // Build table function. + BuildSsdtDmc620PmuTable, + // Free table function. + FreeSsdtDmc620PmuTableRes, + // Build Table function. Extended version not needed. + NULL, + // Free Resource function. Extended version not needed. + NULL +}; + +/** Register the Generator with the ACPI Table Factory. + + @param [in] ImageHandle The handle to the image. + @param [in] SystemTable Pointer to the System Table. + + @retval EFI_SUCCESS The Generator is registered. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_ALREADY_STARTED The Generator for the Table ID + is already registered. +**/ +EFI_STATUS +EFIAPI +AcpiSsdtDmc620PmuConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = RegisterAcpiTableGenerator (&SsdtDmc620PmuGenerator); + DEBUG (( + DEBUG_INFO, + "SSDT-DMC620: Register Generator. Status = %r\n", + Status + )); + ASSERT_EFI_ERROR (Status); + return Status; +} + +/** Deregister the Generator from the ACPI Table Factory. + + @param [in] ImageHandle The handle to the image. + @param [in] SystemTable Pointer to the System Table. + + @retval EFI_SUCCESS The Generator is deregistered. + @retval EFI_INVALID_PARAMETER A parameter is invalid. + @retval EFI_NOT_FOUND The Generator is not registered. +**/ +EFI_STATUS +EFIAPI +AcpiSsdtDmc620PmuDestructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = DeregisterAcpiTableGenerator (&SsdtDmc620PmuGenerator); + DEBUG (( + DEBUG_INFO, + "SSDT-DMC620: Deregister Generator. Status = %r\n", + Status + )); + ASSERT_EFI_ERROR (Status); + return Status; +} diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtDmc620PmuLibArm/SsdtDmc620PmuGenerator.h b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtDmc620PmuLibArm/SsdtDmc620PmuGenerator.h new file mode 100644 index 000000000000..5226d880f458 --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtDmc620PmuLibArm/SsdtDmc620PmuGenerator.h @@ -0,0 +1,32 @@ +/** @file + + Copyright (c) 2025, Arm Limited. All rights reserved.
    + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Glossary: + - Cm or CM - Configuration Manager + - Obj or OBJ - Object + - Std or STD - Standard + + @par Reference(s): + - Arm CoreLink DMC-620 Coherent Mesh Network Technical Reference Manual r3p0 + - Generic ACPI for Arm Components 1.0 Platform Design Document +**/ + +#ifndef SSDT_DMC620_GENERATOR_H_ +#define SSDT_DMC620_GENERATOR_H_ + +/** PeriphBase maximum address length is 512 bytes (0x200) +*/ +#define DMC620_PERIPHBASE_MAX_ADDRESS_LENGTH 0x200 + +/** Mask covering the DMC620 Address space +*/ +#define DMC620_REGISTER_SPACE_MASK 0x1FFF + +/** Offset of the PMU registers in the DMC620 register space +*/ +#define DMC620_PMU_ADDRESS_OFFSET 0x0A00 + +#endif // SSDT_DMC620_GENERATOR_H_ diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtDmc620PmuLibArm/SsdtDmc620PmuLibArm.inf b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtDmc620PmuLibArm/SsdtDmc620PmuLibArm.inf new file mode 100644 index 000000000000..fb67e5abcba3 --- /dev/null +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtDmc620PmuLibArm/SsdtDmc620PmuLibArm.inf @@ -0,0 +1,31 @@ +## @file +# Ssdt DMC-600 Table Generator +# +# Copyright (c) 2025, Arm Limited. All rights reserved.
    +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = SsdtDmc620PmuLibArm + FILE_GUID = 156e6d73-e594-49d9-8828-8c5b1a40e7af + VERSION_STRING = 1.0 + MODULE_TYPE = DXE_DRIVER + LIBRARY_CLASS = NULL|DXE_DRIVER + CONSTRUCTOR = AcpiSsdtDmc620PmuConstructor + DESTRUCTOR = AcpiSsdtDmc620PmuDestructor + +[Sources] + SsdtDmc620PmuGenerator.c + SsdtDmc620PmuGenerator.h + +[Packages] + DynamicTablesPkg/DynamicTablesPkg.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + AcpiHelperLib + AmlLib + BaseLib diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c index 3eb1e43aed6b..768382af7afa 100644 --- a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c +++ b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c @@ -397,6 +397,21 @@ STATIC CONST CM_OBJ_PARSER CmArchCommonGenericInitiatorAffinityInfoParser[] = { { "ProximityDomainToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, }; +/** A parser for EArmObjDmc620PmuSocketInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmObjDmc620PmuSocketInfoParser[] = { + { "NumDevices", 1, "0x%x", NULL }, + { "Dmc620PmuRegInfoToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }, +}; + +/** A parser for EArmObjDmc620PmuRegInfo. +*/ +STATIC CONST CM_OBJ_PARSER CmArmDmc620PmuRegInfoParser[] = { + { "BaseAddress", 8, "0x%llx", NULL }, + { "Length", 8, "0x%llx", NULL }, + { "PmuIntr", 4, "0x%x", NULL }, +}; + /** A parser for EArmObjCmn600Info. */ STATIC CONST CM_OBJ_PARSER CmArmCmn600InfoParser[] = { @@ -1073,6 +1088,8 @@ STATIC CONST CM_OBJ_PARSER_ARRAY ArmNamespaceObjectParser[] = { CM_PARSER_ADD_OBJECT (EArmObjIdMappingArray, CmArmIdMappingParser), CM_PARSER_ADD_OBJECT (EArmObjSmmuInterruptArray, CmArchCommonGenericInterruptParser), CM_PARSER_ADD_OBJECT (EArmObjCmn600Info, CmArmCmn600InfoParser), + CM_PARSER_ADD_OBJECT (EArmObjDmc620PmuSocketInfo, CmArmObjDmc620PmuSocketInfoParser), + CM_PARSER_ADD_OBJECT (EArmObjDmc620PmuRegInfo, CmArmDmc620PmuRegInfoParser), CM_PARSER_ADD_OBJECT (EArmObjRmr, CmArmRmrInfoParser), CM_PARSER_ADD_OBJECT (EArmObjMemoryRangeDescriptor, CmArmMemoryRangeDescriptorInfoParser), CM_PARSER_ADD_OBJECT (EArmObjEtInfo, CmArmEtInfo), From f2c63dca1bc5201903b75a8551afdf2c7ab2fc4d Mon Sep 17 00:00:00 2001 From: Chao Liu Date: Mon, 5 Jan 2026 18:00:00 +0800 Subject: [PATCH 1043/1172] UefiCpuPkg/BaseRiscV64CpuTimerLib: Add constructor to initialize mTimeBase Add a constructor function that calls GetPerformanceCounterProperties(NULL, NULL) to ensure mTimeBase is initialized during DXE phase, before virtual memory is enabled. This fixes crashes on RISC-V platforms without fw_cfg device support (e.g., QEMU rvsp-ref) where Runtime Services may call GetPerformanceCounterProperties() before mTimeBase has been initialized. When virtual memory is then enabled, the uninitialized mTimeBase value causes HOB access to fail with a page fault. Fixes: https://github.com/tianocore/edk2/issues/11747 Signed-off-by: Chao Liu Reported-by: Xiaofan Tan Suggested-by: Laszlo Ersek --- .../BaseRiscV64CpuTimerLib.inf | 1 + .../BaseRiscV64CpuTimerLib/CpuTimerLib.c | 113 ++++++++++-------- 2 files changed, 64 insertions(+), 50 deletions(-) diff --git a/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/BaseRiscV64CpuTimerLib.inf b/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/BaseRiscV64CpuTimerLib.inf index b7ae1e86b74d..a3d25cda4173 100644 --- a/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/BaseRiscV64CpuTimerLib.inf +++ b/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/BaseRiscV64CpuTimerLib.inf @@ -16,6 +16,7 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = TimerLib MODULE_UNI_FILE = BaseRisV64CpuTimerLib.uni + CONSTRUCTOR = BaseRiscV64CpuTimerLibConstructor [Sources] CpuTimerLib.c diff --git a/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/CpuTimerLib.c b/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/CpuTimerLib.c index bb07200754be..f93e841a454a 100644 --- a/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/CpuTimerLib.c +++ b/UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/CpuTimerLib.c @@ -21,8 +21,6 @@ STATIC UINT64 mTimeBase; -#define GET_TIME_BASE() (mTimeBase ?: GetPerformanceCounterProperties(NULL, NULL)) - /** Stalls the CPU for at least the given number of ticks. @@ -67,7 +65,7 @@ MicroSecondDelay ( DivU64x32 ( MultU64x32 ( MicroSeconds, - GET_TIME_BASE () + mTimeBase ), 1000000u ) @@ -95,7 +93,7 @@ NanoSecondDelay ( DivU64x32 ( MultU64x32 ( NanoSeconds, - GET_TIME_BASE () + mTimeBase ), 1000000000u ) @@ -154,12 +152,6 @@ GetPerformanceCounterProperties ( OUT UINT64 *EndValue OPTIONAL ) { - VOID *Hob; - RISCV_SEC_HANDOFF_DATA *SecData; - CONST EFI_GUID SecHobDataGuid = RISCV_SEC_HANDOFF_HOB_GUID; - UINT64 TimeBase; - CONST VOID *FdtBase; - if (StartValue != NULL) { *StartValue = 0; } @@ -168,9 +160,66 @@ GetPerformanceCounterProperties ( *EndValue = 32 - 1; } - if (mTimeBase != 0) { - return mTimeBase; - } + return mTimeBase; +} + +/** + Converts elapsed ticks of performance counter to time in nanoseconds. + + This function converts the elapsed ticks of running performance counter to + time value in unit of nanoseconds. + + @param Ticks The number of elapsed ticks of running performance counter. + + @return The elapsed time in nanoseconds. + +**/ +UINT64 +EFIAPI +GetTimeInNanoSecond ( + IN UINT64 Ticks + ) +{ + UINT64 NanoSeconds; + UINT32 Remainder; + + // + // Ticks + // Time = --------- x 1,000,000,000 + // Frequency + // + NanoSeconds = MultU64x32 (DivU64x32Remainder (Ticks, mTimeBase, &Remainder), 1000000000u); + + // + // Frequency < 0x100000000, so Remainder < 0x100000000, then (Remainder * 1,000,000,000) + // will not overflow 64-bit. + // + NanoSeconds += DivU64x32 (MultU64x32 ((UINT64)Remainder, 1000000000u), mTimeBase); + + return NanoSeconds; +} + +/** + Constructor function for the Timer Library. + + This constructor function is called early during DXE phase to ensure that + GetPerformanceCounterProperties() is invoked and mTimeBase is initialized + before any code that depends on it. + + @retval EFI_SUCCESS The constructor always returns success. + +**/ +EFI_STATUS +EFIAPI +BaseRiscV64CpuTimerLibConstructor ( + VOID + ) +{ + VOID *Hob; + RISCV_SEC_HANDOFF_DATA *SecData; + CONST EFI_GUID SecHobDataGuid = RISCV_SEC_HANDOFF_HOB_GUID; + UINT64 TimeBase; + CONST VOID *FdtBase; // // Locate the FDT HOB and validate header @@ -224,41 +273,5 @@ GetPerformanceCounterProperties ( // mTimeBase = TimeBase; - return TimeBase; -} - -/** - Converts elapsed ticks of performance counter to time in nanoseconds. - - This function converts the elapsed ticks of running performance counter to - time value in unit of nanoseconds. - - @param Ticks The number of elapsed ticks of running performance counter. - - @return The elapsed time in nanoseconds. - -**/ -UINT64 -EFIAPI -GetTimeInNanoSecond ( - IN UINT64 Ticks - ) -{ - UINT64 NanoSeconds; - UINT32 Remainder; - - // - // Ticks - // Time = --------- x 1,000,000,000 - // Frequency - // - NanoSeconds = MultU64x32 (DivU64x32Remainder (Ticks, GET_TIME_BASE (), &Remainder), 1000000000u); - - // - // Frequency < 0x100000000, so Remainder < 0x100000000, then (Remainder * 1,000,000,000) - // will not overflow 64-bit. - // - NanoSeconds += DivU64x32 (MultU64x32 ((UINT64)Remainder, 1000000000u), GET_TIME_BASE ()); - - return NanoSeconds; + return EFI_SUCCESS; } From 454e1fc40fe6535b5a89936c5377e33bbf965b8c Mon Sep 17 00:00:00 2001 From: Liqi Qi Date: Thu, 15 Jan 2026 15:15:35 -0800 Subject: [PATCH 1044/1172] SecurityPkg: Fix Tcg2SubmitCommand in most cases In the previous Pull Request that fixed TPM Field Upgrade Scenario, it was causing regression issues. Outputs for many non-Field Upgrade scenarios are incorrectly modified. Refactor the code to minimize the impact to non-Field Upgrade Scenarios. Now the behavior will match the original design. Only difference is when TPMPresentFlag is false and response code is TPM_RC_UPGRADE. Signed-off-by: Liqi Qi --- SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c | 47 ++++++++++--------------------- 1 file changed, 15 insertions(+), 32 deletions(-) diff --git a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c index 6975da952737..2fa37c47e1d3 100644 --- a/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c +++ b/SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c @@ -1446,42 +1446,25 @@ Tcg2SubmitCommand ( &CurrentOutputBlockSize, OutputParameterBlock ); - if (EFI_ERROR (Status)) { - return mTcgDxeData.BsCap.TPMPresentFlag ? Status : EFI_DEVICE_ERROR; - } - - if (CurrentOutputBlockSize < sizeof (TPM2_RESPONSE_HEADER)) { - DEBUG ((DEBUG_ERROR, "%a: Response buffer too small!\n", __func__)); - return EFI_DEVICE_ERROR; - } - - // - // Correctly read the response code and swap bytes from Big-Endian to Host order. - // The responseCode field is at offset 6 of the response header. - // - ResponseCode = SwapBytes32 (ReadUnaligned32 ((UINT32 *)(OutputParameterBlock + 6))); - DEBUG ((DEBUG_ERROR, "Response code is %x", ResponseCode)); - // If the response code ever equals to TPM_RC_UPGRADE, it means the TPM is in field - // upgrade mode, we set TpmUpdateFlag to TRUE. - if (ResponseCode == TPM_RC_UPGRADE) { - DEBUG ((DEBUG_INFO, "TPM response code TPM_RC_UPDATE received. Setting flag.\n")); - mTcgDxeData.TpmUpdateFlag = TRUE; - } - - // Now that we have set the TPMPresentFlag, it should be able to reflect the actual TPM presence - // as long as the device is not in field update mode. - if ((mTcgDxeData.BsCap.TPMPresentFlag == FALSE) && (mTcgDxeData.TpmUpdateFlag == FALSE)) { - DEBUG ((DEBUG_WARN, "%a: TPMPresentFlag is FALSE. Expecting command to fail.\n", __func__)); - return EFI_DEVICE_ERROR; - } + if (!mTcgDxeData.BsCap.TPMPresentFlag) { + // Special handling when TPM is thought to be absent + if ((CurrentOutputBlockSize >= sizeof (TPM2_RESPONSE_HEADER)) && !EFI_ERROR (Status)) { + // Command succeeded, check if it's actually TPM in update mode + ResponseCode = SwapBytes32 (ReadUnaligned32 ((UINT32 *)(OutputParameterBlock + 6))); + if (ResponseCode == TPM_RC_UPGRADE) { + // TPM is present but in update mode! + mTcgDxeData.TpmUpdateFlag = TRUE; + mTcgDxeData.BsCap.TPMPresentFlag = TRUE; + return Status; // Return success + } + } - // If the response code is not TPM_RC_SUCCESS and the device is not in field update mode, return error. - if ((ResponseCode != TPM_RC_SUCCESS) && (mTcgDxeData.TpmUpdateFlag == FALSE)) { - DEBUG ((DEBUG_ERROR, "%a: Command failed with response code 0x%x\n", __func__, ResponseCode)); + // TPM is actually absent, return device error return EFI_DEVICE_ERROR; } - return EFI_SUCCESS; + // Normal path: TPM is present, return whatever Tpm2SubmitCommand returned + return Status; } /** From f82d1fa48eeae62581383c5f341bf9549e370e6c Mon Sep 17 00:00:00 2001 From: Phil Noh Date: Fri, 2 Jan 2026 15:57:50 -0600 Subject: [PATCH 1045/1172] MdePkg/FvLib: Need section alignment for FindFfsSectionInSections In FvLib library, FindFsSectionInSection function may not find the ffs section where the second (or later) is located. It is due to a wrong section address that does not consider section alignment. Support the alignment to check multiple ffs sections correctly. Signed-off-by: Phil Noh --- MdePkg/Library/FvLib/FvLib.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/MdePkg/Library/FvLib/FvLib.c b/MdePkg/Library/FvLib/FvLib.c index 2faa7cd054f7..10d77d74b517 100644 --- a/MdePkg/Library/FvLib/FvLib.c +++ b/MdePkg/Library/FvLib/FvLib.c @@ -2,6 +2,7 @@ Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.
    Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
    +Copyright (C) 2026 Advanced Micro Devices, Inc. All rights reserved.
    SPDX-License-Identifier: BSD-2-Clause-Patent @@ -253,14 +254,18 @@ FindFfsSectionInSections ( // // Loop through the FFS file sections // - EndOfSection = (EFI_PHYSICAL_ADDRESS)(UINTN)Sections; - EndOfSections = EndOfSection + SizeOfSections; + EndOfSection = (EFI_PHYSICAL_ADDRESS)(UINTN)Sections; + EndOfSections = EndOfSection + SizeOfSections; + CurrentAddress = EndOfSection; + for ( ; ;) { if (EndOfSection == EndOfSections) { break; } - CurrentAddress = EndOfSection; + if (CurrentAddress >= EndOfSections) { + return EFI_VOLUME_CORRUPTED; + } Section = (EFI_COMMON_SECTION_HEADER *)(UINTN)CurrentAddress; @@ -274,7 +279,8 @@ FindFfsSectionInSections ( return EFI_VOLUME_CORRUPTED; } - Size = GET_OCCUPIED_SIZE (Size, 4); + Size = GET_OCCUPIED_SIZE (Size, 4); + CurrentAddress = CurrentAddress + Size; // // Look for the requested section type From 564b8e182569eaf611bad765587b40387dafea33 Mon Sep 17 00:00:00 2001 From: George Liao Date: Mon, 5 Jan 2026 15:21:04 +0800 Subject: [PATCH 1046/1172] MdeModulePkg/AcpiTableDxe:Created EfiACPIReclaimMemory for ACPIHOB RSDP The RSDP table come from ACPI HOB which may no store in the EfiACPIReclaimMemory-type memory. Therefore need to reserve an EfiACPIReclaimMemory-type memory for it. Signed-off-by: George Liao --- .../Acpi/AcpiTableDxe/AcpiTableProtocol.c | 54 ++++++++++++++++--- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c index f7e0fbf87bff..e1f10a655853 100644 --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c @@ -1984,6 +1984,7 @@ InstallAcpiTableFromAcpiSiliconHob ( UINTN TotalSocTablesize; UINT8 *Pointer; EFI_MEMORY_TYPE AcpiAllocateMemoryType; + UINTN AcpiRsdpSize; DEBUG ((DEBUG_INFO, "InstallAcpiTableFromAcpiSiliconHob - Start\n")); // @@ -2007,12 +2008,50 @@ InstallAcpiTableFromAcpiSiliconHob ( // SiAcpiHobRsdp = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)(UINTN)(AcpiSiliconHob->Rsdp); if (SiAcpiHobRsdp == NULL) { - DEBUG ((DEBUG_ERROR, "InstallAcpiTableFromAcpiSiliconHob: Fail to locate RSDP Acpi table!!\n")); + DEBUG ((DEBUG_ERROR, "InstallAcpiTableFromAcpiSiliconHob: Fail to locate RSDP Acpi table from AcpiSiliconHob!!\n")); return EFI_NOT_FOUND; + } else { + DEBUG ((DEBUG_INFO, "ACPI HOB RSDP address : 0x%016lx\n", SiAcpiHobRsdp)); } - DEBUG ((DEBUG_INFO, "Silicon ACPI RSDP address : 0x%016lx\n", SiAcpiHobRsdp)); - AcpiTableInstance->Rsdp3 = SiAcpiHobRsdp; + // + // Reserved the ACPI reclaim memory for new RSDP space. + // + AcpiRsdpSize = sizeof (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER); + if (mAcpiTableAllocType != AllocateAnyPages) { + PageAddress = 0xFFFFFFFF; + Status = gBS->AllocatePages ( + mAcpiTableAllocType, + AcpiAllocateMemoryType, + EFI_SIZE_TO_PAGES (AcpiRsdpSize), + &PageAddress + ); + } else { + Status = gBS->AllocatePool ( + AcpiAllocateMemoryType, + AcpiRsdpSize, + (VOID **)&Pointer + ); + } + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Fail to allocate EfiACPIReclaimMemory for RSDP. Status : %r\n", Status)); + return Status; + } else { + if (mAcpiTableAllocType != AllocateAnyPages) { + Pointer = (UINT8 *)(UINTN)PageAddress; + } + } + + ZeroMem (Pointer, AcpiRsdpSize); + // + // Copy RSDP content from ACPI Hob to the ACPI table Instance. + // + AcpiTableInstance->Rsdp3 = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)Pointer; + CopyMem (AcpiTableInstance->Rsdp3, SiAcpiHobRsdp, sizeof (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER)); + SiAcpiHobRsdp = AcpiTableInstance->Rsdp3; + + DEBUG ((DEBUG_INFO, "Current ACPI RSDP address : 0x%016lx\n", SiAcpiHobRsdp)); // // Got XSDT address from RSDP table. @@ -2020,7 +2059,7 @@ InstallAcpiTableFromAcpiSiliconHob ( Buffer = (UINT8 *)(UINTN)(SiAcpiHobRsdp->XsdtAddress); SiCommonAcpiTable = (EFI_ACPI_DESCRIPTION_HEADER *)Buffer; - DEBUG ((DEBUG_INFO, "Silicon ACPI XSDT address : 0x%016lx\n", SiCommonAcpiTable)); + DEBUG ((DEBUG_INFO, "ACPI HOB XSDT address : 0x%016lx\n", SiCommonAcpiTable)); if (SiCommonAcpiTable->Length <= sizeof (EFI_ACPI_DESCRIPTION_HEADER)) { DEBUG ((DEBUG_ERROR, "XSDT length is incorrect\n")); @@ -2072,7 +2111,10 @@ InstallAcpiTableFromAcpiSiliconHob ( ZeroMem (Pointer, TotalSocTablesize); AcpiTableInstance->Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Pointer; - + // + // Update the XsdtAddress of the AcpiTableInstance's Rsdp3 field. + // + AcpiTableInstance->Rsdp3->XsdtAddress = (UINT64)(UINTN)AcpiTableInstance->Xsdt; // // Initial XSDT table content. // @@ -2222,7 +2264,7 @@ InstallAcpiTableFromAcpiSiliconHob ( // if signature can not be found from the XFirmwareCtrl / FirmwareCtrl field then skip it. // if (((EFI_ACPI_DESCRIPTION_HEADER *)NeedToInstallTable)->Signature == EFI_ACPI_3_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) { - Status = AddTableToList (AcpiTableInstance, NeedToInstallTable, TRUE, Version, TRUE, &TableKey); + Status = AddTableToList (AcpiTableInstance, NeedToInstallTable, TRUE, Version, FALSE, &TableKey); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "Fail to add FACS in the DXE Table list!\n")); ASSERT_EFI_ERROR (Status); From 79eab6ffff07deb80c698453bb67d348d81ab975 Mon Sep 17 00:00:00 2001 From: Chris Fernald Date: Wed, 11 Jun 2025 21:21:34 +0000 Subject: [PATCH 1047/1172] StandaloneMmPkg: Avoid updating attributes on 0 length sections PE images can have a zero virtual length section for placeholders, unused relocation, or other artifacts. At best, updated attributes on such sections is a no-op, but at worst is can cause spurious errors and asserts. Specifically asserts have been observed in Hafnium when attempting to update attributes on a zero length section. It is best to just skip such sections entirely. This commit simply logs and skips these sections explicitly. Signed-off-by: Chris Fernald --- .../AArch64/StandaloneMmPeCoffExtraActionLib.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/StandaloneMmPkg/Library/StandaloneMmPeCoffExtraActionLib/AArch64/StandaloneMmPeCoffExtraActionLib.c b/StandaloneMmPkg/Library/StandaloneMmPeCoffExtraActionLib/AArch64/StandaloneMmPeCoffExtraActionLib.c index 7a5bb412d0d2..2fa95341e0ee 100644 --- a/StandaloneMmPkg/Library/StandaloneMmPeCoffExtraActionLib/AArch64/StandaloneMmPeCoffExtraActionLib.c +++ b/StandaloneMmPkg/Library/StandaloneMmPeCoffExtraActionLib/AArch64/StandaloneMmPeCoffExtraActionLib.c @@ -164,7 +164,15 @@ UpdatePeCoffPermissions ( Base = TmpContext.ImageAddress + SectionHeader.VirtualAddress; - if ((SectionHeader.Characteristics & EFI_IMAGE_SCN_MEM_EXECUTE) == 0) { + if (SectionHeader.Misc.VirtualSize == 0) { + DEBUG (( + DEBUG_INFO, + "%a: Skipping section %d of image at 0x%lx with size 0\n", + __func__, + Index, + Base + )); + } else if ((SectionHeader.Characteristics & EFI_IMAGE_SCN_MEM_EXECUTE) == 0) { if ((SectionHeader.Characteristics & EFI_IMAGE_SCN_MEM_WRITE) == 0) { DEBUG (( DEBUG_INFO, From ff9bd64b9d59d8e7234fd70f6afe9f5fa35abc11 Mon Sep 17 00:00:00 2001 From: Teddy Astie Date: Mon, 19 Jan 2026 15:46:34 +0100 Subject: [PATCH 1048/1172] OvmfPkg/OvmfXen: Add missing Xen's sched.h include BaseResetShutdownXen.c relies on XEN_SCHEDOP_SHUTDOWN which is included in IndustryStandard/Xen/sched.h. Signed-off-by: Teddy Astie --- OvmfPkg/Library/ResetSystemLib/BaseResetShutdownXen.c | 1 + 1 file changed, 1 insertion(+) diff --git a/OvmfPkg/Library/ResetSystemLib/BaseResetShutdownXen.c b/OvmfPkg/Library/ResetSystemLib/BaseResetShutdownXen.c index f45d9125feb4..5130e87805e7 100644 --- a/OvmfPkg/Library/ResetSystemLib/BaseResetShutdownXen.c +++ b/OvmfPkg/Library/ResetSystemLib/BaseResetShutdownXen.c @@ -10,6 +10,7 @@ #include // BIT13 +#include #include // CpuDeadLoop() #include // ASSERT() #include // IoOr16() From ca0076b9455dbaef5b98f504c8f3beb64050cd78 Mon Sep 17 00:00:00 2001 From: Teddy Astie Date: Mon, 19 Jan 2026 15:49:06 +0100 Subject: [PATCH 1049/1172] OvmfPkg/OvmfXen: Fix XenHypercallSchedOp call in BaseResetShutdownXen XenHypercallSchedOp wants a pointer as second parameter. Signed-off-by: Teddy Astie --- OvmfPkg/Library/ResetSystemLib/BaseResetShutdownXen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OvmfPkg/Library/ResetSystemLib/BaseResetShutdownXen.c b/OvmfPkg/Library/ResetSystemLib/BaseResetShutdownXen.c index 5130e87805e7..50c9fe9c505a 100644 --- a/OvmfPkg/Library/ResetSystemLib/BaseResetShutdownXen.c +++ b/OvmfPkg/Library/ResetSystemLib/BaseResetShutdownXen.c @@ -54,7 +54,7 @@ ResetShutdown ( XEN_SCHED_SHUTDOWN ShutdownOp = { .Reason = XEN_SHED_SHUTDOWN_POWEROFF, }; - ReturnCode = XenHypercallSchedOp (XEN_SCHEDOP_SHUTDOWN, ShutdownOp); + ReturnCode = XenHypercallSchedOp (XEN_SCHEDOP_SHUTDOWN, &ShutdownOp); ASSERT (ReturnCode == 0); CpuDeadLoop (); } From 96049a1cbcf39dc4a02e60aecb8c25e0f45b8ad8 Mon Sep 17 00:00:00 2001 From: Phil Noh Date: Mon, 19 Jan 2026 15:56:18 -0600 Subject: [PATCH 1050/1172] StandaloneMmPkg/StandaloneMmIplPei: Optimize CreateMmPlatformHob calls Currently MM IPL calls 3 times for CreateMmPlatformHob platform library function. The second and third calls intend to copy platform HOBs to the target buffer. In the code flow, it is found that they can be optimized as one call. It is expected to reduce time caused by the library call and make the driver better for the library usage. Signed-off-by: Phil Noh --- .../Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c index 826b1b2b19c6..ab0d22d5ca67 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c @@ -2,6 +2,7 @@ MM IPL that load the MM Core into MMRAM at PEI stage Copyright (c) 2024 - 2025, Intel Corporation. All rights reserved.
    + Copyright (C) 2026 Advanced Micro Devices, Inc. All rights reserved.
    SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -467,9 +468,6 @@ CreateMmHobList ( MmProfileDataHob, Block ); - if (PlatformHobSize != 0) { - FreePages (PlatformHobList, EFI_SIZE_TO_PAGES (PlatformHobSize)); - } ASSERT (Status == RETURN_BUFFER_TOO_SMALL); ASSERT (FoundationHobSize != 0); @@ -493,10 +491,12 @@ CreateMmHobList ( CreateMmHobHandoffInfoTable (HobList, HobEnd); // - // Get platform HOBs + // Copy platform HOBs // - Status = CreateMmPlatformHob ((UINT8 *)HobList + PhitHobSize, &PlatformHobSize); - ASSERT_EFI_ERROR (Status); + if (PlatformHobSize != 0) { + CopyMem ((VOID *)((UINT8 *)HobList + PhitHobSize), PlatformHobList, PlatformHobSize); + FreePages (PlatformHobList, EFI_SIZE_TO_PAGES (PlatformHobSize)); + } // // Get foundation HOBs From 1d5dc2d47e556b3fbefa19b3c99865a3c3267e01 Mon Sep 17 00:00:00 2001 From: Alexander Gryanko Date: Tue, 7 Oct 2025 01:55:16 +0300 Subject: [PATCH 1051/1172] BaseTools: use double hyphens for CLANGPDB llvm-rc When compiling rc files in environments where file paths begin with "/", llvm-rc may incorrectly interpret absolute paths such as "/User/..." as command-line options (e.g., "/U", "ser", "..."). This results in the error "Exactly one input file must be specified". The issue was initially observed on macOS, where user data is commonly located under "/User" rather than "/home", but was later found to affect all platforms where file paths start with "/". Using double hyphens ensures that all arguments to the right are treated as positional arguments rather than options. The use of double hyphens is supported by the LLVM command-line argument parser and is safe in all such environments. See: https://llvm.org/docs/CommandLine.html Section: Specifying positional options with hyphens Signed-off-by: Alexander Gryanko --- BaseTools/Conf/tools_def.template | 1 + 1 file changed, 1 insertion(+) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index 6bf337862858..50a73645d523 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -1781,6 +1781,7 @@ RELEASE_GCC_LOONGARCH64_CC_FLAGS = DEF(GCC5_LOONGARCH64_CC_FLAGS) -Wno-unu *_CLANGPDB_*_ASLDLINK_FLAGS = DEF(MSFT_ASLDLINK_FLAGS) *_CLANGPDB_*_DEPS_FLAGS = DEF(GCC_DEPS_FLAGS) *_CLANGPDB_*_GENFWHII_FLAGS = --hiipackage +*_CLANGPDB_*_RC_FLAGS = -- DEFINE CLANGPDB_IA32_PREFIX = ENV(CLANG_BIN) DEFINE CLANGPDB_X64_PREFIX = ENV(CLANG_BIN) From d78a2b52f3ddf7439bca063cc093d441b9e587f9 Mon Sep 17 00:00:00 2001 From: Alexander Gryanko Date: Wed, 14 Jan 2026 17:32:46 +0300 Subject: [PATCH 1052/1172] EmulatorPkg: use double hyphens for CLANGDWARF llvm-rc Like BaseTools, CLANGDWARF uses llvm-rc to prepare resources. In environments where file paths begin with "/", this can cause issues, as paths to resource files may be interpreted as command-line options rather than positional arguments. For example, "/usr/..." can be interpreted as "/u", "sr", "...". To prevent this behavior, an explicit separation of options and arguments using double hyphens has been added. See: https://llvm.org/docs/CommandLine.html Section: Specifying positional options with hyphens Signed-off-by: Alexander Gryanko --- EmulatorPkg/EmulatorPkg.dsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EmulatorPkg/EmulatorPkg.dsc b/EmulatorPkg/EmulatorPkg.dsc index 3e4df619d038..0beed36d8927 100644 --- a/EmulatorPkg/EmulatorPkg.dsc +++ b/EmulatorPkg/EmulatorPkg.dsc @@ -652,7 +652,7 @@ # GCC:*_CLANGDWARF_*_GENFWHII_FLAGS == --hiipackage GCC:*_CLANGDWARF_*_RC_PATH = llvm-rc - GCC:*_CLANGDWARF_*_RC_FLAGS == + GCC:*_CLANGDWARF_*_RC_FLAGS == -- # # Must override DLINK to use options compatible with Mingw CLANG that is From dddb45306affe61328d126ab2cac8de3da909ebc Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 14 Jan 2026 20:44:26 -0800 Subject: [PATCH 1053/1172] EmulatorPkg: Align DEFINE statements with UnitTestFrameworkPkg Signed-off-by: Michael D Kinney --- EmulatorPkg/EmulatorPkg.dsc | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/EmulatorPkg/EmulatorPkg.dsc b/EmulatorPkg/EmulatorPkg.dsc index 0beed36d8927..8a088b885f2c 100644 --- a/EmulatorPkg/EmulatorPkg.dsc +++ b/EmulatorPkg/EmulatorPkg.dsc @@ -690,15 +690,10 @@ # families that must use Visual Studio specific defines and libraries when # building modules of type HOST_APPLICATION # -!if $(ARCH) in "X64" - DEFINE VS_ARCH_DIR = x64 -!endif -!if $(ARCH) in "IA32" - DEFINE VS_ARCH_DIR = x86 -!endif - DEFINE VISUAL_STUDIO_DEFINES = -D UNICODE -D _CRT_SECURE_NO_WARNINGS -D _CRT_SECURE_NO_DEPRECATE - DEFINE VISUAL_STUDIO_LIB_PATHS = /LIBPATH:"%VCToolsInstallDir%lib\$(VS_ARCH_DIR)" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\$(VS_ARCH_DIR)" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%um\$(VS_ARCH_DIR)" - DEFINE VISUAL_STUDIO_LIBS = Kernel32.lib MSVCRTD.lib vcruntimed.lib ucrtd.lib Gdi32.lib User32.lib Winmm.lib Advapi32.lib + DEFINE VISUAL_STUDIO_DEFINES = -D UNICODE -D _CRT_SECURE_NO_WARNINGS -D _CRT_SECURE_NO_DEPRECATE + DEFINE VISUAL_STUDIO_IA32_LIB_PATHS = /LIBPATH:"%VCToolsInstallDir%lib\x86" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%um\x86" + DEFINE VISUAL_STUDIO_X64_LIB_PATHS = /LIBPATH:"%VCToolsInstallDir%lib\X64" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\X64" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%um\X64" + DEFINE VISUAL_STUDIO_LIBS = Kernel32.lib MSVCRTD.lib vcruntimed.lib ucrtd.lib Gdi32.lib User32.lib Winmm.lib Advapi32.lib [BuildOptions.common.EDKII.HOST_APPLICATION] MSFT:*_*_*_CC_FLAGS = $(VISUAL_STUDIO_DEFINES) @@ -706,7 +701,8 @@ # Must ovveride DLINK_FLAGS to remove /DLL when linking .exe # MSFT:*_*_*_DLINK_FLAGS == /out:"$(BIN_DIR)\$(BASE_NAME).exe" /NOLOGO /SUBSYSTEM:CONSOLE /IGNORE:4086 /MAP /OPT:REF /LTCG - MSFT:*_*_*_DLINK_FLAGS = $(VISUAL_STUDIO_LIB_PATHS) $(VISUAL_STUDIO_LIBS) + MSFT:*_*_IA32_DLINK_FLAGS = $(VISUAL_STUDIO_IA32_LIB_PATHS) $(VISUAL_STUDIO_LIBS) + MSFT:*_*_X64_DLINK_FLAGS = $(VISUAL_STUDIO_X64_LIB_PATHS) $(VISUAL_STUDIO_LIBS) MSFT:DEBUG_*_*_DLINK_FLAGS = /DEBUG /pdb:"$(BIN_DIR)\$(BASE_NAME).pdb" MSFT:NOOPT_*_*_DLINK_FLAGS = /DEBUG /pdb:"$(BIN_DIR)\$(BASE_NAME).pdb" @@ -715,7 +711,8 @@ # Must ovveride DLINK_FLAGS to remove /DLL when linking .exe # CLANGPDB:*_*_*_DLINK_FLAGS == /OUT:"$(BIN_DIR)\$(BASE_NAME).exe" /NOLOGO /SUBSYSTEM:CONSOLE /IGNORE:4086 /OPT:REF /LLDMAP - CLANGPDB:*_*_*_DLINK_FLAGS = $(VISUAL_STUDIO_LIB_PATHS) $(VISUAL_STUDIO_LIBS) + CLANGPDB:*_*_IA32_DLINK_FLAGS = $(VISUAL_STUDIO_IA32_LIB_PATHS) $(VISUAL_STUDIO_LIBS) + CLANGPDB:*_*_X64_DLINK_FLAGS = $(VISUAL_STUDIO_X64_LIB_PATHS) $(VISUAL_STUDIO_LIBS) CLANGPDB:DEBUG_*_*_DLINK_FLAGS = /DEBUG /pdb:"$(BIN_DIR)\$(BASE_NAME).pdb" CLANGPDB:NOOPT_*_*_DLINK_FLAGS = /DEBUG /pdb:"$(BIN_DIR)\$(BASE_NAME).pdb" From 74c508abe8dd57ec713e0d2aec9cc8a5cec4d57b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20B=C4=83l=C4=83nic=C4=83?= Date: Fri, 5 Dec 2025 14:02:15 +0200 Subject: [PATCH 1054/1172] MdePkg/BaseFdtLib: Add more wrappers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add FDT_HEADER field accessors and FdtOverlayApply() wrapper. Signed-off-by: Mario Bălănică --- MdePkg/Include/Library/FdtLib.h | 29 ++++++++++++++++++++++++++++- MdePkg/Library/BaseFdtLib/FdtLib.c | 18 ++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/MdePkg/Include/Library/FdtLib.h b/MdePkg/Include/Library/FdtLib.h index a7f63f3d5a03..16e8179af4ab 100644 --- a/MdePkg/Include/Library/FdtLib.h +++ b/MdePkg/Include/Library/FdtLib.h @@ -181,7 +181,16 @@ typedef struct { #define FdtGetHeader(Fdt, Field) \ (Fdt32ToCpu (((const FDT_HEADER *)(Fdt))->Field)) -#define FdtTotalSize(Fdt) (FdtGetHeader ((Fdt), TotalSize)) +#define FdtMagic(Fdt) (FdtGetHeader ((Fdt), Magic)) +#define FdtTotalSize(Fdt) (FdtGetHeader ((Fdt), TotalSize)) +#define FdtOffsetDtStruct(Fdt) (FdtGetHeader ((Fdt), OffsetDtStruct)) +#define FdtOffsetDtStrings(Fdt) (FdtGetHeader ((Fdt), OffsetDtStrings)) +#define FdtOffsetMemRsvmap(Fdt) (FdtGetHeader ((Fdt), OffsetMemRsvmap)) +#define FdtVersion(Fdt) (FdtGetHeader ((Fdt), Version)) +#define FdtLastCompVersion(Fdt) (FdtGetHeader ((Fdt), LastCompVersion)) +#define FdtBootCpuidPhys(Fdt) (FdtGetHeader ((Fdt), BootCpuidPhys)) +#define FdtSizeDtStrings(Fdt) (FdtGetHeader ((Fdt), SizeDtStrings)) +#define FdtSizeDtStruct(Fdt) (FdtGetHeader ((Fdt), SizeDtStruct)) #define FdtForEachSubnode(Node, Fdt, Parent) \ for (Node = FdtFirstSubnode (Fdt, Parent); \ @@ -191,6 +200,9 @@ typedef struct { #define FdtSetPropString(Fdt, NodeOffset, Name, String) \ FdtSetProp ((Fdt), (NodeOffset), (Name), (String), AsciiStrLen (String) + 1) +#define FdtSetPropEmpty(Fdt, NodeOffset, Name) \ + FdtSetProp ((Fdt), (NodeOffset), (Name), NULL, 0) + /** Convert UINT16 data of the FDT blob to little-endian @@ -960,6 +972,21 @@ FdtGetPhandle ( IN INT32 NodeOffset ); +/** + Applies a DT overlay on a base DT. + + @param[in] Fdt The pointer to FDT blob. + @param[in] Fdto The pointer to FDT overlay blob. + + @return 0 on success, or negative error code. +**/ +INT32 +EFIAPI +FdtOverlayApply ( + IN VOID *Fdt, + IN VOID *Fdto + ); + /* Debug functions. */ CONST CHAR8 diff --git a/MdePkg/Library/BaseFdtLib/FdtLib.c b/MdePkg/Library/BaseFdtLib/FdtLib.c index 3dacfbee4526..8c986650dc0e 100644 --- a/MdePkg/Library/BaseFdtLib/FdtLib.c +++ b/MdePkg/Library/BaseFdtLib/FdtLib.c @@ -918,6 +918,24 @@ FdtGetPhandle ( return fdt_get_phandle (Fdt, NodeOffset); } +/** + Applies a DT overlay on a base DT. + + @param[in] Fdt The pointer to FDT blob. + @param[in] Fdto The pointer to FDT overlay blob. + + @return 0 on success, or negative error code. +**/ +INT32 +EFIAPI +FdtOverlayApply ( + IN VOID *Fdt, + IN VOID *Fdto + ) +{ + return fdt_overlay_apply (Fdt, Fdto); +} + /* Debug functions. */ CONST CHAR8 From fca7dd03c9403c0644f824cec8c0a47e560269f8 Mon Sep 17 00:00:00 2001 From: Xiang W Date: Thu, 18 Dec 2025 12:43:22 +0800 Subject: [PATCH 1055/1172] UefiPayloadPkg: Simplify UefiPayloadEntry for Ia32 Remove unused functions. There are multiple implementations of HandOffToDxeCore; remove one. Signed-off-by: Xiang W --- .../FitUniversalPayloadEntry.inf | 1 + .../UefiPayloadEntry/Ia32/DxeLoadFunc.c | 164 -------- .../UefiPayloadEntry/Ia32/DxeLoadFuncFit.c | 374 ------------------ 3 files changed, 1 insertion(+), 538 deletions(-) diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf index cbf13d4491f2..8e39b09cb18c 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf +++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf @@ -30,6 +30,7 @@ [Sources.Ia32] X64/VirtualMemory.h X64/VirtualMemory.c + Ia32/DxeLoadFunc.c Ia32/DxeLoadFuncFit.c Ia32/IdtVectorAsm.nasm diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c index 9840368f2f73..f5db17aedf1a 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c +++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c @@ -81,170 +81,6 @@ GLOBAL_REMOVE_IF_UNREFERENCED IA32_DESCRIPTOR gLidtDescriptor = { 0 }; -/** - Allocates and fills in the Page Directory and Page Table Entries to - establish a 4G page table. - - @param[in] StackBase Stack base address. - @param[in] StackSize Stack size. - - @return The address of page table. - -**/ -UINTN -Create4GPageTablesIa32Pae ( - IN EFI_PHYSICAL_ADDRESS StackBase, - IN UINTN StackSize - ) -{ - UINT8 PhysicalAddressBits; - EFI_PHYSICAL_ADDRESS PhysicalAddress; - UINTN IndexOfPdpEntries; - UINTN IndexOfPageDirectoryEntries; - UINT32 NumberOfPdpEntriesNeeded; - PAGE_MAP_AND_DIRECTORY_POINTER *PageMap; - PAGE_MAP_AND_DIRECTORY_POINTER *PageDirectoryPointerEntry; - PAGE_TABLE_ENTRY *PageDirectoryEntry; - UINTN TotalPagesNum; - UINTN PageAddress; - UINT64 AddressEncMask; - - // - // Make sure AddressEncMask is contained to smallest supported address field - // - AddressEncMask = PcdGet64 (PcdPteMemoryEncryptionAddressOrMask) & PAGING_1G_ADDRESS_MASK_64; - - PhysicalAddressBits = 32; - - // - // Calculate the table entries needed. - // - NumberOfPdpEntriesNeeded = (UINT32)LShiftU64 (1, (PhysicalAddressBits - 30)); - - TotalPagesNum = NumberOfPdpEntriesNeeded + 1; - PageAddress = (UINTN)AllocatePageTableMemory (TotalPagesNum); - ASSERT (PageAddress != 0); - - PageMap = (VOID *)PageAddress; - PageAddress += SIZE_4KB; - - PageDirectoryPointerEntry = PageMap; - PhysicalAddress = 0; - - for (IndexOfPdpEntries = 0; IndexOfPdpEntries < NumberOfPdpEntriesNeeded; IndexOfPdpEntries++, PageDirectoryPointerEntry++) { - // - // Each Directory Pointer entries points to a page of Page Directory entires. - // So allocate space for them and fill them in in the IndexOfPageDirectoryEntries loop. - // - PageDirectoryEntry = (VOID *)PageAddress; - PageAddress += SIZE_4KB; - - // - // Fill in a Page Directory Pointer Entries - // - PageDirectoryPointerEntry->Uint64 = (UINT64)(UINTN)PageDirectoryEntry | AddressEncMask; - PageDirectoryPointerEntry->Bits.Present = 1; - - for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512; IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress += SIZE_2MB) { - if ( (IsNullDetectionEnabled () && (PhysicalAddress == 0)) - || ( (PhysicalAddress < StackBase + StackSize) - && ((PhysicalAddress + SIZE_2MB) > StackBase))) - { - // - // Need to split this 2M page that covers stack range. - // - Split2MPageTo4K (PhysicalAddress, (UINT64 *)PageDirectoryEntry, StackBase, StackSize, 0, 0); - } else { - // - // Fill in the Page Directory entries - // - PageDirectoryEntry->Uint64 = (UINT64)PhysicalAddress | AddressEncMask; - PageDirectoryEntry->Bits.ReadWrite = 1; - PageDirectoryEntry->Bits.Present = 1; - PageDirectoryEntry->Bits.MustBe1 = 1; - } - } - } - - for ( ; IndexOfPdpEntries < 512; IndexOfPdpEntries++, PageDirectoryPointerEntry++) { - ZeroMem ( - PageDirectoryPointerEntry, - sizeof (PAGE_MAP_AND_DIRECTORY_POINTER) - ); - } - - // - // Protect the page table by marking the memory used for page table to be - // read-only. - // - EnablePageTableProtection ((UINTN)PageMap, 3); - - return (UINTN)PageMap; -} - -/** - The function will check if IA32 PAE is supported. - - @retval TRUE IA32 PAE is supported. - @retval FALSE IA32 PAE is not supported. - -**/ -BOOLEAN -IsIa32PaeSupport ( - VOID - ) -{ - UINT32 RegEax; - UINT32 RegEdx; - BOOLEAN Ia32PaeSupport; - - Ia32PaeSupport = FALSE; - AsmCpuid (0x0, &RegEax, NULL, NULL, NULL); - if (RegEax >= 0x1) { - AsmCpuid (0x1, NULL, NULL, NULL, &RegEdx); - if ((RegEdx & BIT6) != 0) { - Ia32PaeSupport = TRUE; - } - } - - return Ia32PaeSupport; -} - -/** - The function will check if page table should be setup or not. - - @retval TRUE Page table should be created. - @retval FALSE Page table should not be created. - -**/ -BOOLEAN -ToBuildPageTable ( - VOID - ) -{ - if (!IsIa32PaeSupport ()) { - return FALSE; - } - - if (IsNullDetectionEnabled ()) { - return TRUE; - } - - if (PcdGet8 (PcdHeapGuardPropertyMask) != 0) { - return TRUE; - } - - if (PcdGetBool (PcdCpuStackGuard)) { - return TRUE; - } - - if (IsEnableNonExecNeeded ()) { - return TRUE; - } - - return FALSE; -} - /** Transfers control to DxeCore. diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c index 867765f6ef96..f30343a8cfd2 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c +++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c @@ -6,382 +6,8 @@ **/ -#include -#include -#include -#include -#include -#include -#include -#include -#include "VirtualMemory.h" #include "UefiPayloadEntry.h" -#define STACK_SIZE 0x20000 -#define IDT_ENTRY_COUNT 32 - -extern VOID *mHobList; - -typedef struct _X64_IDT_TABLE { - // - // Reserved 4 bytes preceding PeiService and IdtTable, - // since IDT base address should be 8-byte alignment. - // - UINT32 Reserved; - CONST EFI_PEI_SERVICES **PeiService; - X64_IDT_GATE_DESCRIPTOR IdtTable[IDT_ENTRY_COUNT]; -} X64_IDT_TABLE; - -// -// Global Descriptor Table (GDT) -// -GLOBAL_REMOVE_IF_UNREFERENCED IA32_GDT gGdtEntries[] = { - /* selector { Global Segment Descriptor } */ - /* 0x00 */ { - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } - }, // null descriptor - /* 0x08 */ { - { 0xffff, 0, 0, 0x2, 1, 0, 1, 0xf, 0, 0, 1, 1, 0 } - }, // linear data segment descriptor - /* 0x10 */ { - { 0xffff, 0, 0, 0xf, 1, 0, 1, 0xf, 0, 0, 1, 1, 0 } - }, // linear code segment descriptor - /* 0x18 */ { - { 0xffff, 0, 0, 0x3, 1, 0, 1, 0xf, 0, 0, 1, 1, 0 } - }, // system data segment descriptor - /* 0x20 */ { - { 0xffff, 0, 0, 0xa, 1, 0, 1, 0xf, 0, 0, 1, 1, 0 } - }, // system code segment descriptor - /* 0x28 */ { - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } - }, // spare segment descriptor - /* 0x30 */ { - { 0xffff, 0, 0, 0x2, 1, 0, 1, 0xf, 0, 0, 1, 1, 0 } - }, // system data segment descriptor - /* 0x38 */ { - { 0xffff, 0, 0, 0xa, 1, 0, 1, 0xf, 0, 1, 0, 1, 0 } - }, // system code segment descriptor - /* 0x40 */ { - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } - }, // spare segment descriptor -}; - -// -// IA32 Gdt register -// -GLOBAL_REMOVE_IF_UNREFERENCED CONST IA32_DESCRIPTOR gGdt = { - sizeof (gGdtEntries) - 1, - (UINTN)gGdtEntries -}; - -GLOBAL_REMOVE_IF_UNREFERENCED IA32_DESCRIPTOR gLidtDescriptor = { - sizeof (X64_IDT_GATE_DESCRIPTOR) * IDT_ENTRY_COUNT - 1, - 0 -}; - -/** - Allocates and fills in the Page Directory and Page Table Entries to - establish a 4G page table. - - @param[in] StackBase Stack base address. - @param[in] StackSize Stack size. - - @return The address of page table. - -**/ -UINTN -Create4GPageTablesIa32Pae ( - IN EFI_PHYSICAL_ADDRESS StackBase, - IN UINTN StackSize - ) -{ - UINT8 PhysicalAddressBits; - EFI_PHYSICAL_ADDRESS PhysicalAddress; - UINTN IndexOfPdpEntries; - UINTN IndexOfPageDirectoryEntries; - UINT32 NumberOfPdpEntriesNeeded; - PAGE_MAP_AND_DIRECTORY_POINTER *PageMap; - PAGE_MAP_AND_DIRECTORY_POINTER *PageDirectoryPointerEntry; - PAGE_TABLE_ENTRY *PageDirectoryEntry; - UINTN TotalPagesNum; - UINTN PageAddress; - UINT64 AddressEncMask; - - // - // Make sure AddressEncMask is contained to smallest supported address field - // - AddressEncMask = PcdGet64 (PcdPteMemoryEncryptionAddressOrMask) & PAGING_1G_ADDRESS_MASK_64; - - PhysicalAddressBits = 32; - - // - // Calculate the table entries needed. - // - NumberOfPdpEntriesNeeded = (UINT32)LShiftU64 (1, (PhysicalAddressBits - 30)); - - TotalPagesNum = NumberOfPdpEntriesNeeded + 1; - PageAddress = (UINTN)AllocatePageTableMemory (TotalPagesNum); - ASSERT (PageAddress != 0); - - PageMap = (VOID *)PageAddress; - PageAddress += SIZE_4KB; - - PageDirectoryPointerEntry = PageMap; - PhysicalAddress = 0; - - for (IndexOfPdpEntries = 0; IndexOfPdpEntries < NumberOfPdpEntriesNeeded; IndexOfPdpEntries++, PageDirectoryPointerEntry++) { - // - // Each Directory Pointer entries points to a page of Page Directory entires. - // So allocate space for them and fill them in in the IndexOfPageDirectoryEntries loop. - // - PageDirectoryEntry = (VOID *)PageAddress; - PageAddress += SIZE_4KB; - - // - // Fill in a Page Directory Pointer Entries - // - PageDirectoryPointerEntry->Uint64 = (UINT64)(UINTN)PageDirectoryEntry | AddressEncMask; - PageDirectoryPointerEntry->Bits.Present = 1; - - for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512; IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress += SIZE_2MB) { - if ( (IsNullDetectionEnabled () && (PhysicalAddress == 0)) - || ( (PhysicalAddress < StackBase + StackSize) - && ((PhysicalAddress + SIZE_2MB) > StackBase))) - { - // - // Need to split this 2M page that covers stack range. - // - Split2MPageTo4K (PhysicalAddress, (UINT64 *)PageDirectoryEntry, StackBase, StackSize, 0, 0); - } else { - // - // Fill in the Page Directory entries - // - PageDirectoryEntry->Uint64 = (UINT64)PhysicalAddress | AddressEncMask; - PageDirectoryEntry->Bits.ReadWrite = 1; - PageDirectoryEntry->Bits.Present = 1; - PageDirectoryEntry->Bits.MustBe1 = 1; - } - } - } - - for ( ; IndexOfPdpEntries < 512; IndexOfPdpEntries++, PageDirectoryPointerEntry++) { - ZeroMem ( - PageDirectoryPointerEntry, - sizeof (PAGE_MAP_AND_DIRECTORY_POINTER) - ); - } - - // - // Protect the page table by marking the memory used for page table to be - // read-only. - // - EnablePageTableProtection ((UINTN)PageMap, FALSE); - - return (UINTN)PageMap; -} - -/** - The function will check if IA32 PAE is supported. - - @retval TRUE IA32 PAE is supported. - @retval FALSE IA32 PAE is not supported. - -**/ -BOOLEAN -IsIa32PaeSupport ( - VOID - ) -{ - UINT32 RegEax; - UINT32 RegEdx; - BOOLEAN Ia32PaeSupport; - - Ia32PaeSupport = FALSE; - AsmCpuid (0x0, &RegEax, NULL, NULL, NULL); - if (RegEax >= 0x1) { - AsmCpuid (0x1, NULL, NULL, NULL, &RegEdx); - if ((RegEdx & BIT6) != 0) { - Ia32PaeSupport = TRUE; - } - } - - return Ia32PaeSupport; -} - -/** - The function will check if page table should be setup or not. - - @retval TRUE Page table should be created. - @retval FALSE Page table should not be created. - -**/ -BOOLEAN -ToBuildPageTable ( - VOID - ) -{ - if (!IsIa32PaeSupport ()) { - return FALSE; - } - - if (IsNullDetectionEnabled ()) { - return TRUE; - } - - if (PcdGet8 (PcdHeapGuardPropertyMask) != 0) { - return TRUE; - } - - if (PcdGetBool (PcdCpuStackGuard)) { - return TRUE; - } - - if (IsEnableNonExecNeeded ()) { - return TRUE; - } - - return FALSE; -} - -/** - Transfers control to DxeCore. - - This function performs a CPU architecture specific operations to execute - the entry point of DxeCore with the parameters of HobList. - - @param DxeCoreEntryPoint The entry point of DxeCore. - @param HobList The start of HobList passed to DxeCore. - -**/ -VOID -HandOffToDxeCore ( - IN EFI_PHYSICAL_ADDRESS DxeCoreEntryPoint, - IN EFI_PEI_HOB_POINTERS HobList - ) -{ - EFI_PHYSICAL_ADDRESS BaseOfStack; - EFI_PHYSICAL_ADDRESS TopOfStack; - UINTN PageTables; - X64_IDT_GATE_DESCRIPTOR *IdtTable; - UINTN SizeOfTemplate; - VOID *TemplateBase; - EFI_PHYSICAL_ADDRESS VectorAddress; - UINT32 Index; - X64_IDT_TABLE *IdtTableForX64; - - // Initialize floating point operating environment to be compliant with UEFI spec. - InitializeFloatingPointUnits (); - - // - // Mask off all legacy 8259 interrupt sources - // - IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF); - IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF); - - BaseOfStack = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES (STACK_SIZE)); - ASSERT (BaseOfStack != 0); - - if (FeaturePcdGet (PcdDxeIplSwitchToLongMode)) { - // - // Compute the top of the stack we were allocated, which is used to load X64 dxe core. - // Pre-allocate a 32 bytes which confroms to x64 calling convention. - // - // The first four parameters to a function are passed in rcx, rdx, r8 and r9. - // Any further parameters are pushed on the stack. Furthermore, space (4 * 8bytes) for the - // register parameters is reserved on the stack, in case the called function - // wants to spill them; this is important if the function is variadic. - // - TopOfStack = BaseOfStack + EFI_SIZE_TO_PAGES (STACK_SIZE) * EFI_PAGE_SIZE - 32; - - // - // x64 Calling Conventions requires that the stack must be aligned to 16 bytes - // - TopOfStack = (EFI_PHYSICAL_ADDRESS)(UINTN)ALIGN_POINTER (TopOfStack, 16); - - // - // Load the GDT of Go64. Since the GDT of 32-bit Tiano locates in the BS_DATA - // memory, it may be corrupted when copying FV to high-end memory - // - AsmWriteGdtr (&gGdt); - // - // Create page table and save PageMapLevel4 to CR3 - // - PageTables = CreateIdentityMappingPageTables (BaseOfStack, STACK_SIZE, 0, 0); - - // - // Paging might be already enabled. To avoid conflict configuration, - // disable paging first anyway. - // - AsmWriteCr0 (AsmReadCr0 () & (~BIT31)); - AsmWriteCr3 (PageTables); - - // - // Update the contents of BSP stack HOB to reflect the real stack info passed to DxeCore. - // - UpdateStackHob (BaseOfStack, STACK_SIZE); - - SizeOfTemplate = AsmGetVectorTemplatInfo (&TemplateBase); - - VectorAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES (sizeof (X64_IDT_TABLE) + SizeOfTemplate * IDT_ENTRY_COUNT)); - ASSERT (VectorAddress != 0); - - // - // Store EFI_PEI_SERVICES** in the 4 bytes immediately preceding IDT to avoid that - // it may not be gotten correctly after IDT register is re-written. - // - IdtTableForX64 = (X64_IDT_TABLE *)(UINTN)VectorAddress; - IdtTableForX64->PeiService = NULL; - - VectorAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)(IdtTableForX64 + 1); - IdtTable = IdtTableForX64->IdtTable; - for (Index = 0; Index < IDT_ENTRY_COUNT; Index++) { - IdtTable[Index].Ia32IdtEntry.Bits.GateType = 0x8e; - IdtTable[Index].Ia32IdtEntry.Bits.Reserved_0 = 0; - IdtTable[Index].Ia32IdtEntry.Bits.Selector = SYS_CODE64_SEL; - - IdtTable[Index].Ia32IdtEntry.Bits.OffsetLow = (UINT16)VectorAddress; - IdtTable[Index].Ia32IdtEntry.Bits.OffsetHigh = (UINT16)(RShiftU64 (VectorAddress, 16)); - IdtTable[Index].Offset32To63 = (UINT32)(RShiftU64 (VectorAddress, 32)); - IdtTable[Index].Reserved = 0; - - CopyMem ((VOID *)(UINTN)VectorAddress, TemplateBase, SizeOfTemplate); - AsmVectorFixup ((VOID *)(UINTN)VectorAddress, (UINT8)Index); - - VectorAddress += SizeOfTemplate; - } - - gLidtDescriptor.Base = (UINTN)IdtTable; - - AsmWriteIdtr (&gLidtDescriptor); - - DEBUG (( - DEBUG_INFO, - "%a() Stack Base: 0x%llx, Stack Size: 0x%x\n", - __func__, - BaseOfStack, - STACK_SIZE - )); - - // - // Go to Long Mode and transfer control to DxeCore. - // Interrupts will not get turned on until the CPU AP is loaded. - // Call x64 drivers passing in single argument, a pointer to the HOBs. - // - AsmEnablePaging64 ( - SYS_CODE64_SEL, - DxeCoreEntryPoint, - (EFI_PHYSICAL_ADDRESS)(UINTN)(HobList.Raw), - 0, - TopOfStack - ); - } else { - // 32bit UEFI payload could be supported if required later. - DEBUG ((DEBUG_ERROR, "NOT support 32bit UEFI payload\n")); - ASSERT (FALSE); - CpuDeadLoop (); - } -} - /** Entry point to the C language phase of UEFI payload. @param[in] BootloaderParameter The starting address of bootloader parameter block. From f9076a3a2bae8f184921024a353925b03ed1ed9d Mon Sep 17 00:00:00 2001 From: Xiang W Date: Thu, 18 Dec 2025 12:44:31 +0800 Subject: [PATCH 1056/1172] UefiPayloadPkg: Simplify UefiPayloadEntry for X64 There are multiple implementations of HandOffToDxeCore; remove one. Signed-off-by: Xiang W --- .../FitUniversalPayloadEntry.inf | 1 + .../UefiPayloadEntry/X64/DxeLoadFuncFit.c | 133 ------------------ 2 files changed, 1 insertion(+), 133 deletions(-) diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf index 8e39b09cb18c..e93116fb1eba 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf +++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf @@ -37,6 +37,7 @@ [Sources.X64] X64/VirtualMemory.h X64/VirtualMemory.c + X64/DxeLoadFunc.c X64/DxeLoadFuncFit.c [Sources.RISCV64] diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c index 9f3daf311fa9..273313d2a538 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c +++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c @@ -6,140 +6,7 @@ **/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "X64/VirtualMemory.h" #include "UefiPayloadEntry.h" -#define STACK_SIZE 0x20000 - -extern VOID *mHobList; - -// -// Global Descriptor Table (GDT) - 8-byte aligned -// GDT with 3 entries: NULL, 64-bit Code, 64-bit Data -// -GLOBAL_REMOVE_IF_UNREFERENCED IA32_GDT gGdtEntries[3] = { - // NULL descriptor (entry 0) - { .Uint64 = 0 }, - // .short 0xffff /* limit 15:00 */ - // .short 0x0000 /* base 15:00 */ - // .byte 0x00 /* base 23:16 */ - // .byte 0b10011010 /* P(1) DPL(00) S(1) 1 C(0) R(1) A(0) */ - // .byte 0b10101111 /* G(1) D(0) L(1) AVL(0) limit 19:16 */ - // .byte 0x0 /* base 31:24 */ - { .Uint64 = 0x00AF9A000000FFFFULL }, - // .short 0xffff /* limit 15:00 */ - // .short 0x0000 /* base 15:00 */ - // .byte 0x00 /* base 23:16 */ - // .byte 0b10010010 /* P(1) DPL(00) S(1) 1 E(0) W(1) A(0) */ - // .byte 0b11001111 /* G(1) B(1) 0 AVL(0) limit 19:16 */ - // .byte 0x0 /* base 31:24 */ - { .Uint64 = 0x00CF92000000FFFFULL } -}; - -/** - Transfers control to DxeCore. - - This function performs a CPU architecture specific operations to execute - the entry point of DxeCore with the parameters of HobList. - It also installs EFI_END_OF_PEI_PPI to signal the end of PEI phase. - - @param DxeCoreEntryPoint The entry point of DxeCore. - @param HobList The start of HobList passed to DxeCore. - -**/ -VOID -HandOffToDxeCore ( - IN EFI_PHYSICAL_ADDRESS DxeCoreEntryPoint, - IN EFI_PEI_HOB_POINTERS HobList - ) -{ - VOID *BaseOfStack; - VOID *TopOfStack; - UINTN PageTables; - VOID *GhcbBase; - UINTN GhcbSize; - IA32_DESCRIPTOR Gdtr; - - // Set up temporary GDT - Gdtr.Base = (UINTN)gGdtEntries; - Gdtr.Limit = (UINT16)(sizeof (gGdtEntries) - 1); - AsmWriteGdtr (&Gdtr); - - // Initialize floating point operating environment to be compliant with UEFI spec. - InitializeFloatingPointUnits (); - - // - // Mask off all legacy 8259 interrupt sources - // - IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF); - IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF); - - // - // Allocate 128KB for the Stack - // - BaseOfStack = AllocatePages (EFI_SIZE_TO_PAGES (STACK_SIZE)); - ASSERT (BaseOfStack != NULL); - - // - // Compute the top of the stack we were allocated. Pre-allocate a UINTN - // for safety. - // - TopOfStack = (VOID *)((UINTN)BaseOfStack + EFI_SIZE_TO_PAGES (STACK_SIZE) * EFI_PAGE_SIZE - CPU_STACK_ALIGNMENT); - TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT); - - // - // Get the address and size of the GHCB pages - // - GhcbBase = 0; - GhcbSize = 0; - - PageTables = 0; - if (FeaturePcdGet (PcdDxeIplBuildPageTables)) { - // - // Create page table and save PageMapLevel4 to CR3 - // - PageTables = CreateIdentityMappingPageTables ( - (EFI_PHYSICAL_ADDRESS)(UINTN)BaseOfStack, - STACK_SIZE, - (EFI_PHYSICAL_ADDRESS)(UINTN)GhcbBase, - GhcbSize - ); - } else { - // - // Set NX for stack feature also require PcdDxeIplBuildPageTables be TRUE - // for the DxeIpl and the DxeCore are both X64. - // - ASSERT (PcdGetBool (PcdSetNxForStack) == FALSE); - ASSERT (PcdGetBool (PcdCpuStackGuard) == FALSE); - } - - if (FeaturePcdGet (PcdDxeIplBuildPageTables)) { - AsmWriteCr3 (PageTables); - } - - // - // Update the contents of BSP stack HOB to reflect the real stack info passed to DxeCore. - // - UpdateStackHob ((EFI_PHYSICAL_ADDRESS)(UINTN)BaseOfStack, STACK_SIZE); - - // - // Transfer the control to the entry point of DxeCore. - // - SwitchStack ( - (SWITCH_STACK_ENTRY_POINT)(UINTN)DxeCoreEntryPoint, - HobList.Raw, - NULL, - TopOfStack - ); -} /** Entry point to the C language phase of UEFI payload. From 9ff5bf99f484267fd48cc061fb7f5fa41b3f194d Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 19 Jan 2026 11:30:23 -0800 Subject: [PATCH 1057/1172] MdePkg/Library/BaseFdtLib: Fix VS2022 NOOPT IA32 issues VS2022 NOOPT IA32 builds of BaseFdtLib introduce use of intrinsics __allshl and __aullshr from the libfdt submodule that can not be modified. Add the implementation of __allshl and __aullshr intrinsics from from the CryptoPkg to BaseFdtLib. Signed-off-by: Michael D Kinney --- MdePkg/Library/BaseFdtLib/BaseFdtLib.inf | 4 ++ .../Library/BaseFdtLib/Ia32/MathLShiftS64.c | 51 ++++++++++++++++++ .../Library/BaseFdtLib/Ia32/MathRShiftU64.c | 54 +++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 MdePkg/Library/BaseFdtLib/Ia32/MathLShiftS64.c create mode 100644 MdePkg/Library/BaseFdtLib/Ia32/MathRShiftU64.c diff --git a/MdePkg/Library/BaseFdtLib/BaseFdtLib.inf b/MdePkg/Library/BaseFdtLib/BaseFdtLib.inf index b5815380c5ee..3b6127138bb4 100644 --- a/MdePkg/Library/BaseFdtLib/BaseFdtLib.inf +++ b/MdePkg/Library/BaseFdtLib/BaseFdtLib.inf @@ -49,6 +49,10 @@ $(FDT_LIB_PATH)/libfdt_env.h $(FDT_LIB_PATH)/libfdt_internal.h +[Sources.IA32] + Ia32/MathLShiftS64.c | MSFT + Ia32/MathRShiftU64.c | MSFT + [Packages] MdePkg/MdePkg.dec diff --git a/MdePkg/Library/BaseFdtLib/Ia32/MathLShiftS64.c b/MdePkg/Library/BaseFdtLib/Ia32/MathLShiftS64.c new file mode 100644 index 000000000000..1c14b5d21c67 --- /dev/null +++ b/MdePkg/Library/BaseFdtLib/Ia32/MathLShiftS64.c @@ -0,0 +1,51 @@ +/** @file + 64-bit Math Worker Function. + The 32-bit versions of C compiler generate calls to library routines + to handle 64-bit math. These functions use non-standard calling conventions. + +Copyright (c) 2014, Intel Corporation. All rights reserved.
    +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/* + * Shifts a 64-bit signed value left by a particular number of bits. + */ +__declspec(naked) void __cdecl +_allshl ( + void + ) +{ + _asm { + ; + ; Handle shifting of 64 or more bits (return 0) + ; + + cmp cl, 64 + jae short ReturnZero + + ; + ; Handle shifting of between 0 and 31 bits + ; + cmp cl, 32 + jae short More32 + shld edx, eax, cl + shl eax, cl + ret + + ; + ; Handle shifting of between 32 and 63 bits + ; +More32: + mov edx, eax + xor eax, eax + and cl, 31 + shl edx, cl + ret + +ReturnZero: + xor eax,eax + xor edx,edx + ret + } +} diff --git a/MdePkg/Library/BaseFdtLib/Ia32/MathRShiftU64.c b/MdePkg/Library/BaseFdtLib/Ia32/MathRShiftU64.c new file mode 100644 index 000000000000..4f5f9112d359 --- /dev/null +++ b/MdePkg/Library/BaseFdtLib/Ia32/MathRShiftU64.c @@ -0,0 +1,54 @@ +/** @file + 64-bit Math Worker Function. + The 32-bit versions of C compiler generate calls to library routines + to handle 64-bit math. These functions use non-standard calling conventions. + +Copyright (c) 2014, Intel Corporation. All rights reserved.
    +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/* + * Shifts a 64-bit unsigned value right by a certain number of bits. + */ +__declspec(naked) void __cdecl +_aullshr ( + void + ) +{ + _asm { + ; + ; Checking: Only handle 64bit shifting or more + ; + cmp cl, 64 + jae _Exit + + ; + ; Handle shifting between 0 and 31 bits + ; + cmp cl, 32 + jae More32 + shrd eax, edx, cl + shr edx, cl + ret + + ; + ; Handle shifting of 32-63 bits + ; +More32: + mov eax, edx + xor edx, edx + and cl, 31 + shr eax, cl + ret + + ; + ; Invalid number (less then 32bits), return 0 + ; + +_Exit: + xor eax, eax + xor edx, edx + ret + } +} From d53d0fd5c0513ed9e6ec1dbd2235fde6ef4277cb Mon Sep 17 00:00:00 2001 From: Khalid Ali Date: Wed, 31 Dec 2025 16:09:38 +0000 Subject: [PATCH 1058/1172] UefiPayloadPkg: Fix build failure with GCC Add missing EFIAPI to BL_CAPSULE_CALLBACK to fix build issue. Fixes: cc149a8e Signed-off-by: Khalid Ali --- UefiPayloadPkg/Include/Library/BlParseLib.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UefiPayloadPkg/Include/Library/BlParseLib.h b/UefiPayloadPkg/Include/Library/BlParseLib.h index e86f03f2b6ce..7269910215fb 100644 --- a/UefiPayloadPkg/Include/Library/BlParseLib.h +++ b/UefiPayloadPkg/Include/Library/BlParseLib.h @@ -28,7 +28,7 @@ typedef RETURN_STATUS \ ); typedef VOID \ -(*BL_CAPSULE_CALLBACK) ( +(EFIAPI *BL_CAPSULE_CALLBACK)( EFI_PHYSICAL_ADDRESS BaseAddress, UINT64 Length ); From 0302aa5bca97143ce86b91f6db7b3a00342b4f3d Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 14 Jan 2026 11:19:28 -0800 Subject: [PATCH 1059/1172] UnitTestFrameworkPkg: WIN_MINGW32_BUILD generate .exe Add .exe file extension to host-based unit test applications built in a Windows Mingw build environment to match host-based unit test applications generated in VS20xx environments. Signed-off-by: Michael D Kinney --- .../UnitTestFrameworkPkgHost.dsc.inc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc index ce20aa7c1cf2..cc3b1b2a3dc5 100644 --- a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc +++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc @@ -235,7 +235,7 @@ CLANGPDB:*_*_*_DLINK_FLAGS = /DEBUG /pdb:"$(BIN_DIR)\$(MODULE_NAME_GUID).pdb" !if $(UNIT_TESTING_ADDRESS_SANITIZER_ENABLE) # - # Remove default library clang_rt.profile.lib that is not includes with Visual Studio + # Remove default library clang_rt.profile.lib that is not included with Visual Studio # CLANGPDB:*_*_IA32_DLINK_FLAGS = /NODEFAULTLIB:clang_rt.profile.lib # @@ -248,14 +248,14 @@ # # Set GCC HOST_APPLICATION options # - GCC:*_*_*_CC_FLAGS = -Wno-write-strings -fpie - GCC:*_*_IA32_DLINK_FLAGS == -o $(BIN_DIR)/$(MODULE_NAME_GUID) -m32 - GCC:*_*_X64_DLINK_FLAGS == -o $(BIN_DIR)/$(MODULE_NAME_GUID) -m64 + GCC:*_*_*_CC_FLAGS = -Wno-write-strings -fpie !if $(WIN_MINGW32_BUILD) - GCC:*_CLANGDWARF_*_DLINK_FLAGS = -Wl,--pdb,$(BIN_DIR)\$(MODULE_NAME_GUID).pdb -g3 + GCC:*_CLANGDWARF_*_DLINK_FLAGS == -o $(BIN_DIR)/$(MODULE_NAME_GUID).exe -Wl,--pdb,$(BIN_DIR)\$(MODULE_NAME_GUID).pdb -g3 !else - GCC:*_*_*_DLINK_FLAGS = -z noexecstack + GCC:*_*_*_DLINK_FLAGS == -o $(BIN_DIR)/$(MODULE_NAME_GUID) -z noexecstack !endif + GCC:*_*_IA32_DLINK_FLAGS = -m32 + GCC:*_*_X64_DLINK_FLAGS = -m64 !if $(UNIT_TESTING_ADDRESS_SANITIZER_ENABLE) # From c666d125b09c8abfa8e8b2ee09c6d89e9f4132e9 Mon Sep 17 00:00:00 2001 From: Ray Ni Date: Mon, 19 Jan 2026 17:19:08 +0800 Subject: [PATCH 1060/1172] IntelFsp2Pkg/PatchFv.py: Support pseudo symbol for image base Define a pseudo symbol _IMAGE_BASE__ for returnning the PE/TE image base address. Signed-off-by: Ray Ni Cc: Chasel Chiu Cc: Nate DeSimone Cc: Star Zeng Cc: Ted Kuo Cc: Ashraf Ali S --- IntelFsp2Pkg/Tools/PatchFv.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/IntelFsp2Pkg/Tools/PatchFv.py b/IntelFsp2Pkg/Tools/PatchFv.py index d35aa1dc9f69..e8c3712a29c7 100644 --- a/IntelFsp2Pkg/Tools/PatchFv.py +++ b/IntelFsp2Pkg/Tools/PatchFv.py @@ -489,6 +489,9 @@ def parseModMapFile(self, moduleName, mapFile): fullSym = "%s:%s" % (moduleName, symbol) if not fullSym in self.dictSymbolAddress: self.dictSymbolAddress[fullSym] = "0x00%08x" % (baseOffset+ int(modSymbols[symbol], 16)) + + # Support pseudo symbol for image base: _IMAGE_BASE__ + self.dictVariable['_IMAGE_BASE_%s_' % moduleName] = self.dictModBase['%s:BASE' % moduleName] return 0 # From b734b82ad8b819dd46c38d421e10dcd9475a7121 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 16 Jan 2026 09:44:37 -0800 Subject: [PATCH 1061/1172] RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish: Uninit var Fix potentially uninitialized variable in deleteUriFromServiceEx(). Issue identified with VS2022 NOOPT builds for IA32 and X64. Signed-off-by: Michael D Kinney --- .../PrivateLibrary/RedfishLib/edk2libredfish/src/service.c | 1 + 1 file changed, 1 insertion(+) diff --git a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c index 3377b431f8a5..77aea3277659 100644 --- a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c +++ b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c @@ -1304,6 +1304,7 @@ deleteUriFromServiceEx ( Status = HttpIoSetHeader (HttpIoHeader, "Content-Type", "application/json"); ASSERT_EFI_ERROR (Status); + contentLength = 0; if (content != NULL) { contentLength = strlen (content); AsciiSPrint ( From 43e0552a74622a9e63d5bebc5a86e5ea4c33ceb5 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Sun, 18 Jan 2026 15:30:31 -0800 Subject: [PATCH 1062/1172] SecurityPkg: Fix VS2022 NOOPT IA32 use of intrinsics Signed-off-by: Michael D Kinney --- SecurityPkg/Tcg/Tcg2Acpi/Tcg2Acpi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SecurityPkg/Tcg/Tcg2Acpi/Tcg2Acpi.c b/SecurityPkg/Tcg/Tcg2Acpi/Tcg2Acpi.c index b3c99a97e032..bbcb173b2a05 100644 --- a/SecurityPkg/Tcg/Tcg2Acpi/Tcg2Acpi.c +++ b/SecurityPkg/Tcg/Tcg2Acpi/Tcg2Acpi.c @@ -151,7 +151,7 @@ AssignOpRegion ( Tcg2AcpiCommunicateBufferHob = GET_GUID_HOB_DATA (GuidHob); MemoryAddress = Tcg2AcpiCommunicateBufferHob->Tcg2AcpiCommunicateBuffer; ASSERT (MemoryAddress != 0); - ASSERT (EFI_PAGES_TO_SIZE (Tcg2AcpiCommunicateBufferHob->Pages) >= Size); + ASSERT (EFI_PAGES_TO_SIZE ((UINTN)Tcg2AcpiCommunicateBufferHob->Pages) >= Size); ZeroMem ((VOID *)(UINTN)MemoryAddress, Size); OpRegion->RegionOffset = (UINT32)(UINTN)MemoryAddress; From 715a8dc06756dd666eb57e86dec25752a6fc60b6 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Tue, 13 Jan 2026 21:45:22 -0800 Subject: [PATCH 1063/1172] SecurityPkg/Library/SecureBootVariableLib/UnitTest: Cmocka use issues Fix mocked versions of GetVariable() and SetVariable(). * VendorGuid parameter use expect_memory() not expect_value() * MockSetVariable() use check_expected() for Attributes parameter * MockSetVariable() use check_expected_ptr() for Data parameter * Calls to MockGetVariable() use (UINTN) cast for will_return() of pointer to data buffer returned. Issues found with Linux GCC NOOPT IA32 builds of unit tests. Signed-off-by: Michael D Kinney --- .../UnitTest/SecureBootVariableLibUnitTest.c | 182 +++++++++--------- 1 file changed, 91 insertions(+), 91 deletions(-) diff --git a/SecurityPkg/Library/SecureBootVariableLib/UnitTest/SecureBootVariableLibUnitTest.c b/SecurityPkg/Library/SecureBootVariableLib/UnitTest/SecureBootVariableLibUnitTest.c index a867ee586f78..03336c9b523d 100644 --- a/SecurityPkg/Library/SecureBootVariableLib/UnitTest/SecureBootVariableLibUnitTest.c +++ b/SecurityPkg/Library/SecureBootVariableLib/UnitTest/SecureBootVariableLibUnitTest.c @@ -91,9 +91,9 @@ MockSetVariable ( )); check_expected_ptr (VariableName); check_expected_ptr (VendorGuid); - check_expected_ptr (Attributes); + check_expected (Attributes); check_expected (DataSize); - check_expected (Data); + check_expected_ptr (Data); return (EFI_STATUS)mock (); } @@ -222,7 +222,7 @@ SetSecureBootModeShouldSetVar ( SecureBootMode = 0xAB; // Any random magic number... expect_memory (MockSetVariable, VariableName, EFI_CUSTOM_MODE_NAME, sizeof (EFI_CUSTOM_MODE_NAME)); - expect_value (MockSetVariable, VendorGuid, &gEfiCustomModeEnableGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiCustomModeEnableGuid, sizeof (gEfiCustomModeEnableGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS); expect_value (MockSetVariable, DataSize, sizeof (SecureBootMode)); expect_memory (MockSetVariable, Data, &SecureBootMode, sizeof (SecureBootMode)); @@ -263,12 +263,12 @@ GetSetupModeShouldGetVar ( TargetMode = 0xAB; // Any random magic number... expect_memory (MockGetVariable, VariableName, EFI_SETUP_MODE_NAME, sizeof (EFI_SETUP_MODE_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, sizeof (SetupMode)); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (SetupMode)); - will_return (MockGetVariable, &TargetMode); + will_return (MockGetVariable, (UINTN)&TargetMode); Status = GetSetupMode (&SetupMode); @@ -304,19 +304,19 @@ IsSecureBootEnableShouldGetVar ( TargetMode = SECURE_BOOT_MODE_ENABLE; expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (TargetMode)); expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, sizeof (TargetMode)); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (TargetMode)); - will_return (MockGetVariable, &TargetMode); + will_return (MockGetVariable, (UINTN)&TargetMode); Enabled = IsSecureBootEnabled (); @@ -601,26 +601,26 @@ DeleteDbShouldDelete ( UINTN PayloadSize = 0; expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); - expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); - expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); - will_return (MockGetVariable, &Dummy); + will_return (MockGetVariable, (UINTN)&Dummy); Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mMaxTimestamp); UT_ASSERT_NOT_EFI_ERROR (Status); UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); @@ -660,26 +660,26 @@ DeleteDbxShouldDelete ( UINTN PayloadSize = 0; expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); - expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); - expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); - will_return (MockGetVariable, &Dummy); + will_return (MockGetVariable, (UINTN)&Dummy); Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mMaxTimestamp); UT_ASSERT_NOT_EFI_ERROR (Status); UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); @@ -719,26 +719,26 @@ DeleteDbtShouldDelete ( UINTN PayloadSize = 0; expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); - expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); - expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); - will_return (MockGetVariable, &Dummy); + will_return (MockGetVariable, (UINTN)&Dummy); Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mMaxTimestamp); UT_ASSERT_NOT_EFI_ERROR (Status); UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); @@ -778,26 +778,26 @@ DeleteKEKShouldDelete ( UINTN PayloadSize = 0; expect_memory (MockGetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); expect_memory (MockGetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); - will_return (MockGetVariable, &Dummy); + will_return (MockGetVariable, (UINTN)&Dummy); Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mMaxTimestamp); UT_ASSERT_NOT_EFI_ERROR (Status); UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE); expect_memory (MockSetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); - expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); @@ -838,7 +838,7 @@ DeletePKShouldDelete ( UINT8 BootMode = CUSTOM_SECURE_BOOT_MODE; expect_memory (MockSetVariable, VariableName, EFI_CUSTOM_MODE_NAME, sizeof (EFI_CUSTOM_MODE_NAME)); - expect_value (MockSetVariable, VendorGuid, &gEfiCustomModeEnableGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiCustomModeEnableGuid, sizeof (gEfiCustomModeEnableGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS); expect_value (MockSetVariable, DataSize, sizeof (BootMode)); expect_memory (MockSetVariable, Data, &BootMode, sizeof (BootMode)); @@ -846,26 +846,26 @@ DeletePKShouldDelete ( will_return (MockSetVariable, EFI_SUCCESS); expect_memory (MockGetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); expect_memory (MockGetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); - will_return (MockGetVariable, &Dummy); + will_return (MockGetVariable, (UINTN)&Dummy); Status = CreateTimeBasedPayload (&PayloadSize, &Payload, &mMaxTimestamp); UT_ASSERT_NOT_EFI_ERROR (Status); UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE); expect_memory (MockSetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); - expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); @@ -912,7 +912,7 @@ DeleteSecureBootVariablesShouldDelete ( will_return (DisablePKProtection, EFI_SUCCESS); expect_memory (MockSetVariable, VariableName, EFI_CUSTOM_MODE_NAME, sizeof (EFI_CUSTOM_MODE_NAME)); - expect_value (MockSetVariable, VendorGuid, &gEfiCustomModeEnableGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiCustomModeEnableGuid, sizeof (gEfiCustomModeEnableGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS); expect_value (MockSetVariable, DataSize, sizeof (BootMode)); expect_memory (MockSetVariable, Data, &BootMode, sizeof (BootMode)); @@ -920,22 +920,22 @@ DeleteSecureBootVariablesShouldDelete ( will_return (MockSetVariable, EFI_SUCCESS); expect_memory (MockGetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); expect_memory (MockGetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); - will_return (MockGetVariable, &Dummy); + will_return (MockGetVariable, (UINTN)&Dummy); expect_memory (MockSetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); - expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); @@ -943,22 +943,22 @@ DeleteSecureBootVariablesShouldDelete ( will_return (MockSetVariable, EFI_SUCCESS); expect_memory (MockGetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); expect_memory (MockGetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); - will_return (MockGetVariable, &Dummy); + will_return (MockGetVariable, (UINTN)&Dummy); expect_memory (MockSetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); - expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); @@ -966,22 +966,22 @@ DeleteSecureBootVariablesShouldDelete ( will_return (MockSetVariable, EFI_SUCCESS); expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); - expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); - expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); - will_return (MockGetVariable, &Dummy); + will_return (MockGetVariable, (UINTN)&Dummy); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); @@ -989,22 +989,22 @@ DeleteSecureBootVariablesShouldDelete ( will_return (MockSetVariable, EFI_SUCCESS); expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); - expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); - expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); - will_return (MockGetVariable, &Dummy); + will_return (MockGetVariable, (UINTN)&Dummy); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); @@ -1012,22 +1012,22 @@ DeleteSecureBootVariablesShouldDelete ( will_return (MockSetVariable, EFI_SUCCESS); expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); - expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); - expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockGetVariable, *DataSize, sizeof (Dummy)); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (Dummy)); - will_return (MockGetVariable, &Dummy); + will_return (MockGetVariable, (UINTN)&Dummy); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE); @@ -1098,7 +1098,7 @@ DeleteSecureBootVariablesShouldProceedWithNotFound ( will_return (DisablePKProtection, EFI_SUCCESS); expect_memory (MockSetVariable, VariableName, EFI_CUSTOM_MODE_NAME, sizeof (EFI_CUSTOM_MODE_NAME)); - expect_value (MockSetVariable, VendorGuid, &gEfiCustomModeEnableGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiCustomModeEnableGuid, sizeof (gEfiCustomModeEnableGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS); expect_value (MockSetVariable, DataSize, sizeof (BootMode)); expect_memory (MockSetVariable, Data, &BootMode, sizeof (BootMode)); @@ -1106,31 +1106,31 @@ DeleteSecureBootVariablesShouldProceedWithNotFound ( will_return (MockSetVariable, EFI_SUCCESS); expect_memory (MockGetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, FALSE); expect_memory (MockGetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, FALSE); expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); - expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, FALSE); expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); - expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, FALSE); expect_memory (MockGetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); - expect_value (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, FALSE); @@ -1173,7 +1173,7 @@ EnrollFromInputShouldComplete ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (Dummy)); expect_memory (MockSetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); - expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (Dummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (Dummy)); @@ -1237,7 +1237,7 @@ SetSecureBootVariablesShouldComplete ( PayloadInfo.SecureBootKeyName = L"Food"; expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, FALSE); @@ -1248,7 +1248,7 @@ SetSecureBootVariablesShouldComplete ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); @@ -1262,7 +1262,7 @@ SetSecureBootVariablesShouldComplete ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); @@ -1276,7 +1276,7 @@ SetSecureBootVariablesShouldComplete ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); @@ -1290,7 +1290,7 @@ SetSecureBootVariablesShouldComplete ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); expect_memory (MockSetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); - expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); @@ -1304,7 +1304,7 @@ SetSecureBootVariablesShouldComplete ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (PkDummy)); expect_memory (MockSetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); - expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (PkDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (PkDummy)); @@ -1345,19 +1345,19 @@ SetSecureBootVariablesShouldStopWhenSecure ( ZeroMem (&PayloadInfo, sizeof (PayloadInfo)); expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (TargetMode)); expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, sizeof (TargetMode)); will_return (MockGetVariable, TRUE); will_return (MockGetVariable, sizeof (TargetMode)); - will_return (MockGetVariable, &TargetMode); + will_return (MockGetVariable, (UINTN)&TargetMode); Status = SetSecureBootVariablesToDefault (&PayloadInfo); UT_ASSERT_STATUS_EQUAL (Status, EFI_ABORTED); @@ -1404,7 +1404,7 @@ SetSecureBootVariablesShouldStopFailDBX ( PayloadInfo.SecureBootKeyName = L"Fail DBX"; expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, FALSE); @@ -1415,7 +1415,7 @@ SetSecureBootVariablesShouldStopFailDBX ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); @@ -1470,7 +1470,7 @@ SetSecureBootVariablesShouldStopFailDB ( PayloadInfo.SecureBootKeyName = L"Fail DB"; expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, FALSE); @@ -1482,7 +1482,7 @@ SetSecureBootVariablesShouldStopFailDB ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); @@ -1496,7 +1496,7 @@ SetSecureBootVariablesShouldStopFailDB ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); @@ -1554,7 +1554,7 @@ SetSecureBootVariablesShouldStopFailDBT ( PayloadInfo.SecureBootKeyName = L"Fail DBT"; expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, FALSE); @@ -1566,7 +1566,7 @@ SetSecureBootVariablesShouldStopFailDBT ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); @@ -1580,7 +1580,7 @@ SetSecureBootVariablesShouldStopFailDBT ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); @@ -1594,7 +1594,7 @@ SetSecureBootVariablesShouldStopFailDBT ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); @@ -1658,7 +1658,7 @@ SetSecureBootVariablesShouldStopFailKEK ( PayloadInfo.SecureBootKeyName = L"Food"; expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, FALSE); @@ -1670,7 +1670,7 @@ SetSecureBootVariablesShouldStopFailKEK ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); @@ -1684,7 +1684,7 @@ SetSecureBootVariablesShouldStopFailKEK ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); @@ -1698,7 +1698,7 @@ SetSecureBootVariablesShouldStopFailKEK ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); @@ -1712,7 +1712,7 @@ SetSecureBootVariablesShouldStopFailKEK ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); expect_memory (MockSetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); - expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); @@ -1776,7 +1776,7 @@ SetSecureBootVariablesShouldStopFailPK ( PayloadInfo.SecureBootKeyName = L"Food"; expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, FALSE); @@ -1788,7 +1788,7 @@ SetSecureBootVariablesShouldStopFailPK ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); @@ -1802,7 +1802,7 @@ SetSecureBootVariablesShouldStopFailPK ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); @@ -1816,7 +1816,7 @@ SetSecureBootVariablesShouldStopFailPK ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE2, sizeof (EFI_IMAGE_SECURITY_DATABASE2)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbtDummy)); @@ -1830,7 +1830,7 @@ SetSecureBootVariablesShouldStopFailPK ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); expect_memory (MockSetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); - expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); @@ -1844,7 +1844,7 @@ SetSecureBootVariablesShouldStopFailPK ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (PkDummy)); expect_memory (MockSetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); - expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (PkDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (PkDummy)); @@ -1907,7 +1907,7 @@ SetSecureBootVariablesDBTOptional ( PayloadInfo.SecureBootKeyName = L"Food"; expect_memory (MockGetVariable, VariableName, EFI_SECURE_BOOT_MODE_NAME, sizeof (EFI_SECURE_BOOT_MODE_NAME)); - expect_value (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockGetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockGetVariable, *DataSize, 0); will_return (MockGetVariable, FALSE); @@ -1919,7 +1919,7 @@ SetSecureBootVariablesDBTOptional ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE1, sizeof (EFI_IMAGE_SECURITY_DATABASE1)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbxDummy)); @@ -1933,7 +1933,7 @@ SetSecureBootVariablesDBTOptional ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); expect_memory (MockSetVariable, VariableName, EFI_IMAGE_SECURITY_DATABASE, sizeof (EFI_IMAGE_SECURITY_DATABASE)); - expect_value (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiImageSecurityDatabaseGuid, sizeof (gEfiImageSecurityDatabaseGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (DbDummy)); @@ -1947,7 +1947,7 @@ SetSecureBootVariablesDBTOptional ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); expect_memory (MockSetVariable, VariableName, EFI_KEY_EXCHANGE_KEY_NAME, sizeof (EFI_KEY_EXCHANGE_KEY_NAME)); - expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (KekDummy)); @@ -1961,7 +1961,7 @@ SetSecureBootVariablesDBTOptional ( UT_ASSERT_EQUAL (PayloadSize, VAR_AUTH_DESC_SIZE + sizeof (PkDummy)); expect_memory (MockSetVariable, VariableName, EFI_PLATFORM_KEY_NAME, sizeof (EFI_PLATFORM_KEY_NAME)); - expect_value (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid); + expect_memory (MockSetVariable, VendorGuid, &gEfiGlobalVariableGuid, sizeof (gEfiGlobalVariableGuid)); expect_value (MockSetVariable, Attributes, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); expect_value (MockSetVariable, DataSize, VAR_AUTH_DESC_SIZE + sizeof (PkDummy)); expect_memory (MockSetVariable, Data, Payload, VAR_AUTH_DESC_SIZE + sizeof (PkDummy)); From 27e4a5510aaa1ede2cbf33e4daf9240bab5f15f9 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Sun, 18 Jan 2026 12:01:44 -0800 Subject: [PATCH 1064/1172] MdeModulePkg/Universal/RegularExpressionDxe: Fix VS2022 NOOPT IA32 __allmul Add implementation of intrinsic __allmul that is generated with VS2022 NOOPT IA32 builds. Signed-off-by: Michael D Kinney --- .../RegularExpressionDxe/Ia32/MathLlmul.asm | 98 +++++++++++++++++++ .../RegularExpressionDxe.inf | 3 + 2 files changed, 101 insertions(+) create mode 100644 MdeModulePkg/Universal/RegularExpressionDxe/Ia32/MathLlmul.asm diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Ia32/MathLlmul.asm b/MdeModulePkg/Universal/RegularExpressionDxe/Ia32/MathLlmul.asm new file mode 100644 index 000000000000..341ea8a7bc0d --- /dev/null +++ b/MdeModulePkg/Universal/RegularExpressionDxe/Ia32/MathLlmul.asm @@ -0,0 +1,98 @@ +;*** +;llmul.asm - long multiply routine +; +; Copyright (c) Microsoft Corporation. All rights reserved. +; SPDX-License-Identifier: BSD-2-Clause-Patent +; +;Purpose: +; Defines long multiply routine +; Both signed and unsigned routines are the same, since multiply's +; work out the same in 2's complement +; creates the following routine: +; __allmul +; +;Original Implemenation: MSVC 14.12.25827 +; +;******************************************************************************* + .686 + .model flat,C + .code + + +;*** +;llmul - long multiply routine +; +;Purpose: +; Does a long multiply (same for signed/unsigned) +; Parameters are not changed. +; +;Entry: +; Parameters are passed on the stack: +; 1st pushed: multiplier (QWORD) +; 2nd pushed: multiplicand (QWORD) +; +;Exit: +; EDX:EAX - product of multiplier and multiplicand +; NOTE: parameters are removed from the stack +; +;Uses: +; ECX +; +;Exceptions: +; +;******************************************************************************* +_allmul PROC NEAR + +A EQU [esp + 4] ; stack address of a +B EQU [esp + 12] ; stack address of b + +HIGH_PART EQU [4] ; +LOW_PART EQU [0] + +; +; AHI, BHI : upper 32 bits of A and B +; ALO, BLO : lower 32 bits of A and B +; +; ALO * BLO +; ALO * BHI +; + BLO * AHI +; --------------------- +; + + mov eax,HIGH_PART(A) + mov ecx,HIGH_PART(B) + or ecx,eax ;test for both high dwords zero. + mov ecx,LOW_PART(B) + jnz short hard ;both are zero, just mult ALO and BLO + + mov eax,LOW_PART(A) + mul ecx + + ret 16 ; callee restores the stack + +hard: + push ebx + +; must redefine A and B since esp has been altered + +A2 EQU [esp + 8] ; stack address of a +B2 EQU [esp + 16] ; stack address of b + + mul ecx ;eax has AHI, ecx has BLO, so AHI * BLO + mov ebx,eax ;save result + + mov eax,LOW_PART(A2) + mul dword ptr HIGH_PART(B2) ;ALO * BHI + add ebx,eax ;ebx = ((ALO * BHI) + (AHI * BLO)) + + mov eax,LOW_PART(A2);ecx = BLO + mul ecx ;so edx:eax = ALO*BLO + add edx,ebx ;now edx has all the LO*HI stuff + + pop ebx + + ret 16 ; callee restores the stack + +_allmul ENDP + + end diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.inf b/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.inf index 0092531a673d..4ffd1b5227d1 100644 --- a/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.inf +++ b/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.inf @@ -67,6 +67,9 @@ oniguruma/src/sjis_prop.c oniguruma/src/euc_jp_prop.c +[Sources.IA32] + Ia32/MathLlmul.asm | MSFT + [Packages] MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec From 22122aed0d4366a1f7b9adde3a12f27ac7d77a06 Mon Sep 17 00:00:00 2001 From: Ajan Zhong Date: Tue, 16 Dec 2025 14:39:29 +0800 Subject: [PATCH 1065/1172] UefiPayloadPkg: Remove fixed serial port settings for AARCH64 Remove fixed serial port settings, it allows serial port settings can be configured by bootloader to adapt actual platform hardware configuration. Signed-off-by: Ajan Zhong --- UefiPayloadPkg/UefiPayloadPkg.dsc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index 3908ae9b1e31..7dd398ffd5a9 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -701,11 +701,6 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize | 0x40000 gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize | 0x40000 - gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio|TRUE - gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0x9000000 - gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride|1 - gEfiMdeModulePkgTokenSpaceGuid.PcdPciSerialParameters|$(PCI_SERIAL_PARAMETERS) - gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosEntryPointProvideMethod|0x2 # AARCH64 use PL011 Serial Port device instead of UniversalPayload Serial @@ -766,6 +761,7 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio|TRUE gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0x9000000 gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride|1 + gEfiMdeModulePkgTokenSpaceGuid.PcdPciSerialParameters|$(PCI_SERIAL_PARAMETERS) !if $(TARGET) == DEBUG gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x07 From 6f536c022638e755279da665e7eca24abef41b42 Mon Sep 17 00:00:00 2001 From: Ajan Zhong Date: Tue, 16 Dec 2025 16:07:47 +0800 Subject: [PATCH 1066/1172] UefiPayloadPkg: Add PCD to control PCI DMA memory above 4GB PCI Root Bridge is allowed to allocate DMA memory below 4GB by default, this policy does not applicable to all platform. For instance, QEMU SBSA refernce platform configure system memory base to be 0x10000000000, it makes all available memory resides above 0x10000000000. To make DmaAbove4G member of structure RootBridge flexible, use PCD to control behavior of DmaAbove4G. Signed-off-by: Ajan Zhong --- UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf | 1 + UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c | 2 +- UefiPayloadPkg/UefiPayloadPkg.dec | 3 +++ UefiPayloadPkg/UefiPayloadPkg.dsc | 3 +++ 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf b/UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf index a5e83c2d7dbf..5bbc3203c342 100644 --- a/UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf +++ b/UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf @@ -53,6 +53,7 @@ gUefiPayloadPkgTokenSpaceGuid.PcdPciReservedPMemAbove4GBBase gUefiPayloadPkgTokenSpaceGuid.PcdPciReservedPMemAbove4GBLimit gUefiPayloadPkgTokenSpaceGuid.SizeOfIoSpace + gUefiPayloadPkgTokenSpaceGuid.PcdPciAllocateMemoryAbove4GB [BuildOptions] diff --git a/UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c b/UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c index 1a97414f421f..89137d1ee269 100644 --- a/UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c +++ b/UefiPayloadPkg/Library/FdtParserLib/FdtParserLib.c @@ -774,7 +774,7 @@ ParsePciRootBridge ( mPciRootBridgeInfo->RootBridge[RbIndex].PMem.Limit = PcdGet32 (PcdPciReservedPMemLimit); mPciRootBridgeInfo->RootBridge[RbIndex].UID = RbIndex; mPciRootBridgeInfo->RootBridge[RbIndex].HID = EISA_PNP_ID (0x0A03); - mPciRootBridgeInfo->RootBridge[RbIndex].DmaAbove4G = FALSE; + mPciRootBridgeInfo->RootBridge[RbIndex].DmaAbove4G = PcdGetBool (PcdPciAllocateMemoryAbove4GB); Data32 = (UINT32 *)(PropertyPtr->Data); for (Base = 0; Base < TempLen / sizeof (UINT32); Base = Base + DWORDS_TO_NEXT_ADDR_TYPE) { diff --git a/UefiPayloadPkg/UefiPayloadPkg.dec b/UefiPayloadPkg/UefiPayloadPkg.dec index c333b3302d20..2e1350072991 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dec +++ b/UefiPayloadPkg/UefiPayloadPkg.dec @@ -113,3 +113,6 @@ gUefiPayloadPkgTokenSpaceGuid.PcdFDTPageSize|8|UINT8|0x0000002C #- PcdUseUniversalPayloadSerialPort is TRUE, Serial Port parameters will be updated #- PcdUseUniversalPayloadSerialPort is FALSE, Serial Port parameters are fixed gUefiPayloadPkgTokenSpaceGuid.PcdUseUniversalPayloadSerialPort|TRUE|BOOLEAN|0x0000002D + +## Indicates whether allows PCI Root Bridge to allocate DMA memory resource above 4G +gUefiPayloadPkgTokenSpaceGuid.PcdPciAllocateMemoryAbove4GB|FALSE|BOOLEAN|0x0000002E diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index 7dd398ffd5a9..39e296a662ae 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -662,6 +662,9 @@ gEfiSecurityPkgTokenSpaceGuid.PcdRemovableMediaImageVerificationPolicy|0x04 !endif + ## Whether allows PCI RB to allocate DMA memory above 4GB + gUefiPayloadPkgTokenSpaceGuid.PcdPciAllocateMemoryAbove4GB|FALSE + [PcdsFixedAtBuild.AARCH64] # System Memory Base -- fixed at 0x4000_0000 gArmTokenSpaceGuid.PcdSystemMemoryBase|0x40000000 From 60bfa52f6520bff0aa265c3e89ef9d6f6aeca5e7 Mon Sep 17 00:00:00 2001 From: Abner Chang Date: Sat, 17 Jan 2026 09:57:30 +0800 Subject: [PATCH 1067/1172] RedfishPkg/RedfishPlatformConfig: Fix CLANGPDB build failure CLANGPDB build fails because the intrinsic _memcpy is used by the compiler for the value structure passed via a function. Change the code to use the value reference. This fixes the issue: #11882 Signed-off-by: Abner Chang --- .../Library/RedfishPlatformConfigLib.h | 4 ++-- .../Protocol/EdkIIRedfishPlatformConfig.h | 8 ++++--- .../RedfishPlatformConfigLib.c | 8 +++++-- .../RedfishPlatformConfigDxe.c | 22 +++++++++---------- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/RedfishPkg/Include/Library/RedfishPlatformConfigLib.h b/RedfishPkg/Include/Library/RedfishPlatformConfigLib.h index b6e60635ea2e..98e62b8f7ceb 100644 --- a/RedfishPkg/Include/Library/RedfishPlatformConfigLib.h +++ b/RedfishPkg/Include/Library/RedfishPlatformConfigLib.h @@ -40,7 +40,7 @@ RedfishPlatformConfigGetValue ( @param[in] Schema The Redfish schema to query. @param[in] Version The Redfish version to query. @param[in] ConfigureLang The target value which match this configure Language. - @param[in] Value The value to set. + @param[in] Value Pointer to the Redfish value to set. @retval EFI_SUCCESS Value is returned successfully. @retval EFI_NOT_READY Redfish Platform Config protocol is not ready. @@ -52,7 +52,7 @@ RedfishPlatformConfigSetValue ( IN CHAR8 *Schema, IN CHAR8 *Version, IN EFI_STRING ConfigureLang, - IN EDKII_REDFISH_VALUE Value + IN EDKII_REDFISH_VALUE *Value ); /** diff --git a/RedfishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h b/RedfishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h index 9e28c4bd4327..c96d198867dd 100644 --- a/RedfishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h +++ b/RedfishPkg/Include/Protocol/EdkIIRedfishPlatformConfig.h @@ -15,8 +15,10 @@ typedef struct _EDKII_REDFISH_PLATFORM_CONFIG_PROTOCOL EDKII_REDFISH_PLATFORM_CO // // Redfish Platform Config Protocol interface version. +// On Version 1.1, we change EDKII_REDFISH_PLATFORM_CONFIG_SET_VALUE protocol interface +// to use value reference instead of value structure of the parameter "Value". // -#define REDFISH_PLATFORM_CONFIG_VERSION 0x00010000 +#define REDFISH_PLATFORM_CONFIG_VERSION 0x00010001 /// /// Definition of EDKII_REDFISH_TYPE_VALUE @@ -163,7 +165,7 @@ EFI_STATUS @param[in] Schema The Redfish schema to query. @param[in] Version The Redfish version to query. @param[in] ConfigureLang The target value which match this configure Language. - @param[in] Value The value to set. + @param[in] RedfishValue Pointer to the Redfish value to set. @retval EFI_SUCCESS Value is returned successfully. @retval Others Some error happened. @@ -176,7 +178,7 @@ EFI_STATUS IN CHAR8 *Schema, IN CHAR8 *Version, IN EFI_STRING ConfigureLang, - IN EDKII_REDFISH_VALUE Value + IN EDKII_REDFISH_VALUE *Value ); /** diff --git a/RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.c b/RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.c index decb1fd01246..245343cf0a09 100644 --- a/RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.c +++ b/RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.c @@ -122,7 +122,7 @@ RedfishPlatformConfigGetDefaultValue ( @param[in] Schema The Redfish schema to query. @param[in] Version The Redfish version to query. @param[in] ConfigureLang The target value which match this configure Language. - @param[in] Value The value to set. + @param[in] Value Pointer to the Redfish value to set. @retval EFI_SUCCESS Value is returned successfully. @retval EFI_NOT_READY Redfish Platform Config protocol is not ready. @@ -134,13 +134,17 @@ RedfishPlatformConfigSetValue ( IN CHAR8 *Schema, IN CHAR8 *Version, IN EFI_STRING ConfigureLang, - IN EDKII_REDFISH_VALUE Value + IN EDKII_REDFISH_VALUE *Value ) { if (mRedfishPlatformConfigLibPrivate.Protocol == NULL) { return EFI_NOT_READY; } + if (Value == NULL) { + return EFI_INVALID_PARAMETER; + } + return mRedfishPlatformConfigLibPrivate.Protocol->SetValue ( mRedfishPlatformConfigLibPrivate.Protocol, Schema, diff --git a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c index c6a98048340e..5e2efa404a9d 100644 --- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c +++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c @@ -1953,7 +1953,7 @@ RedfishPlatformConfigSetStatementCommon ( @param[in] Schema The Redfish schema to query. @param[in] Version The Redfish version to query. @param[in] ConfigureLang The target value which match this configure Language. - @param[in] Value The value to set. + @param[in] Value Pointer to the Redfish value to set. @retval EFI_SUCCESS Value is returned successfully. @retval Others Some error happened. @@ -1966,7 +1966,7 @@ RedfishPlatformConfigProtocolSetValue ( IN CHAR8 *Schema, IN CHAR8 *Version, IN EFI_STRING ConfigureLang, - IN EDKII_REDFISH_VALUE Value + IN EDKII_REDFISH_VALUE *Value ) { EFI_STATUS Status; @@ -1978,7 +1978,7 @@ RedfishPlatformConfigProtocolSetValue ( return EFI_INVALID_PARAMETER; } - if ((Value.Type == RedfishValueTypeUnknown) || (Value.Type >= RedfishValueTypeMax)) { + if ((Value == NULL) || (Value->Type == RedfishValueTypeUnknown) || (Value->Type >= RedfishValueTypeMax)) { return EFI_INVALID_PARAMETER; } @@ -1992,10 +1992,10 @@ RedfishPlatformConfigProtocolSetValue ( ZeroMem (&NewValue, sizeof (HII_STATEMENT_VALUE)); - switch (Value.Type) { + switch (Value->Type) { case RedfishValueTypeInteger: case RedfishValueTypeBoolean: - Status = RedfishNumericToHiiValue (&Value, &NewValue); + Status = RedfishNumericToHiiValue (Value, &NewValue); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "%a: failed to convert Redfish value to Hii value: %r\n", __func__, Status)); goto RELEASE_RESOURCE; @@ -2003,14 +2003,14 @@ RedfishPlatformConfigProtocolSetValue ( break; case RedfishValueTypeString: - if (Value.Value.Buffer == NULL) { + if (Value->Value.Buffer == NULL) { Status = EFI_INVALID_PARAMETER; goto RELEASE_RESOURCE; } NewValue.Type = EFI_IFR_TYPE_STRING; - NewValue.BufferLen = (UINT16)(AsciiStrSize (Value.Value.Buffer) * sizeof (CHAR16)); - NewValue.Buffer = (UINT8 *)StrToUnicodeStr (Value.Value.Buffer); + NewValue.BufferLen = (UINT16)(AsciiStrSize (Value->Value.Buffer) * sizeof (CHAR16)); + NewValue.Buffer = (UINT8 *)StrToUnicodeStr (Value->Value.Buffer); if (NewValue.Buffer == NULL) { Status = EFI_OUT_OF_RESOURCES; goto RELEASE_RESOURCE; @@ -2019,8 +2019,8 @@ RedfishPlatformConfigProtocolSetValue ( break; case RedfishValueTypeStringArray: NewValue.Type = EFI_IFR_TYPE_STRING; - NewValue.BufferLen = (UINT16)Value.ArrayCount; - NewValue.Buffer = (UINT8 *)Value.Value.StringArray; + NewValue.BufferLen = (UINT16)Value->ArrayCount; + NewValue.Buffer = (UINT8 *)Value->Value.StringArray; break; default: ASSERT (FALSE); @@ -2038,7 +2038,7 @@ RedfishPlatformConfigProtocolSetValue ( FreePool (FullSchema); } - if ((Value.Type == RedfishValueTypeString) && (NewValue.Buffer != NULL)) { + if ((Value->Type == RedfishValueTypeString) && (NewValue.Buffer != NULL)) { FreePool (NewValue.Buffer); } From bdff71b21284f1d114b574b0f7523dd5fbdc6b74 Mon Sep 17 00:00:00 2001 From: Yang Gang Date: Mon, 19 Jan 2026 16:43:40 +0800 Subject: [PATCH 1068/1172] EmulatorPkg: Fix build issue when REDFISH_ENABLE is TRUE Signed-off-by: Yang Gang --- EmulatorPkg/EmulatorPkg.dsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/EmulatorPkg/EmulatorPkg.dsc b/EmulatorPkg/EmulatorPkg.dsc index 8a088b885f2c..f6a2a64dbce4 100644 --- a/EmulatorPkg/EmulatorPkg.dsc +++ b/EmulatorPkg/EmulatorPkg.dsc @@ -50,6 +50,7 @@ !include MdePkg/MdeLibs.dsc.inc !include CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc +!include RedfishPkg/Redfish.dsc.inc [LibraryClasses] # @@ -112,6 +113,8 @@ !if $(REDFISH_ENABLE) == TRUE RedfishPlatformHostInterfaceLib|EmulatorPkg/Library/RedfishPlatformHostInterfaceLib/RedfishPlatformHostInterfaceLib.inf RedfishPlatformCredentialLib|EmulatorPkg/Library/RedfishPlatformCredentialLib/RedfishPlatformCredentialLib.inf + RedfishPlatformWantedDeviceLib|RedfishPkg/Library/RedfishPlatformWantedDeviceLibNull/RedfishPlatformWantedDeviceLibNull.inf + RedfishContentCodingLib|RedfishPkg/Library/RedfishContentCodingLibNull/RedfishContentCodingLibNull.inf !endif # # Misc @@ -297,17 +300,15 @@ gEmulatorPkgTokenSpaceGuid.PcdRedfishServiceStopIfSecureBootDisabled|False gEmulatorPkgTokenSpaceGuid.PcdRedfishServiceStopIfExitbootService|False - gEfiRedfishClientPkgTokenSpaceGuid.PcdRedfishServiceEtagSupported|False - # # Redfish Debug enablement # # 0x0000000000000001 RedfishPlatformConfigDxe driver debug enabled. gEfiRedfishPkgTokenSpaceGuid.PcdRedfishDebugCategory|0 - # 0x00000001 x-uefi-redfish string database message enabled + # 0x00000001 x-UEFI-redfish string database message enabled # 0x00000002 Debug Message for dumping formset - # 0x00000004 Debug Message for x-uefi-redfish searching result - # 0x00000008 Debug Message for x-uefi-redfish Regular Expression searching result + # 0x00000004 Debug Message for x-UEFI-redfish searching result + # 0x00000008 Debug Message for x-UEFI-redfish Regular Expression searching result gEfiRedfishPkgTokenSpaceGuid.PcdRedfishPlatformConfigDebugProperty|0 # Redfish Platform Configure DXE driver feature enablement @@ -525,7 +526,6 @@ !if $(REDFISH_ENABLE) == TRUE EmulatorPkg/Application/RedfishPlatformConfig/RedfishPlatformConfig.inf !endif -!include RedfishPkg/Redfish.dsc.inc # # Fail with error message if the OS/Compiler combination is not supported From 23329a90a071b3e15a017681cab6c01bcd3039bb Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 19 Jan 2026 11:27:12 -0800 Subject: [PATCH 1069/1172] EmbeddedPkg/Universal/MmcDxe: Fix VS2022 NOOPT IA32/X64 issues Signed-off-by: Michael D Kinney --- EmbeddedPkg/Universal/MmcDxe/MmcBlockIo.c | 16 ++++++++-------- EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/EmbeddedPkg/Universal/MmcDxe/MmcBlockIo.c b/EmbeddedPkg/Universal/MmcDxe/MmcBlockIo.c index d695e25571ec..69987e9f1a97 100644 --- a/EmbeddedPkg/Universal/MmcDxe/MmcBlockIo.c +++ b/EmbeddedPkg/Universal/MmcDxe/MmcBlockIo.c @@ -28,7 +28,7 @@ MmcGetCardStatus ( { EFI_STATUS Status; UINT32 Response[4]; - UINTN CmdArg; + UINT32 CmdArg; EFI_MMC_HOST_PROTOCOL *MmcHost; Status = EFI_SUCCESS; @@ -136,7 +136,7 @@ MmcTransferBlock ( ) { EFI_STATUS Status; - UINTN CmdArg; + UINT32 CmdArg; INTN Timeout; UINT32 Response[4]; MMC_HOST_INSTANCE *MmcHostInstance; @@ -150,22 +150,22 @@ MmcTransferBlock ( // if 0 : SDSC card // if 1 : SDXC/SDHC if (MmcHostInstance->CardInfo.OCRData.AccessMode & SD_CARD_CAPACITY) { - CmdArg = Lba; + CmdArg = (UINT32)Lba; } else { - CmdArg = MultU64x32 (Lba, This->Media->BlockSize); + CmdArg = (UINT32)MultU64x32 (Lba, This->Media->BlockSize); } } else { // Set command argument based on the card access mode (Byte mode or Block mode) if ((MmcHostInstance->CardInfo.OCRData.AccessMode & MMC_OCR_ACCESS_MASK) == MMC_OCR_ACCESS_SECTOR) { - CmdArg = Lba; + CmdArg = (UINT32)Lba; } else { - CmdArg = MultU64x32 (Lba, This->Media->BlockSize); + CmdArg = (UINT32)MultU64x32 (Lba, This->Media->BlockSize); } } - Status = MmcHost->SendCommand (MmcHost, Cmd, CmdArg); + Status = MmcHost->SendCommand (MmcHost, (MMC_CMD)Cmd, CmdArg); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "%a(MMC_CMD%d): Error %r\n", __func__, Cmd, Status)); return Status; @@ -242,7 +242,7 @@ MmcIoBlocks ( { UINT32 Response[4]; EFI_STATUS Status; - UINTN CmdArg; + UINT32 CmdArg; INTN Timeout; UINTN Cmd; MMC_HOST_INSTANCE *MmcHostInstance; diff --git a/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c b/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c index 57388d9f461c..fed1646b27fe 100755 --- a/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c +++ b/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c @@ -59,7 +59,7 @@ typedef enum _EMMC_DEVICE_STATE { EMMC_SLP_STATE } EMMC_DEVICE_STATE; -UINT32 mEmmcRcaCount = 0; +UINT16 mEmmcRcaCount = 0; STATIC EFI_STATUS @@ -350,8 +350,8 @@ InitializeSdMmcDevice ( UINT32 Response[4]; UINT32 Buffer[128]; UINT32 Speed; - UINTN BlockSize; - UINTN CardSize; + UINT32 BlockSize; + UINT32 CardSize; UINTN NumBlocks; BOOLEAN CccSwitch; SCR Scr; @@ -395,7 +395,7 @@ InitializeSdMmcDevice ( // For >=2G card, BlockSize may be 1K, but the transfer size is 512 bytes. if (BlockSize > 512) { - NumBlocks = MultU64x32 (NumBlocks, BlockSize / 512); + NumBlocks = (UINTN)MultU64x32 (NumBlocks, BlockSize / 512); BlockSize = 512; } @@ -546,7 +546,7 @@ MmcIdentificationMode ( EFI_STATUS Status; UINT32 Response[4]; UINTN Timeout; - UINTN CmdArg; + UINT32 CmdArg; BOOLEAN IsHCS; EFI_MMC_HOST_PROTOCOL *MmcHost; OCR_RESPONSE OcrResponse; @@ -663,7 +663,7 @@ MmcIdentificationMode ( } // Note: The first time CmdArg will be zero - CmdArg = ((UINTN *)&(MmcHostInstance->CardInfo.OCRData))[0]; + CmdArg = ((UINT32 *)&(MmcHostInstance->CardInfo.OCRData))[0]; if (IsHCS) { CmdArg |= BIT30; } @@ -769,7 +769,7 @@ MmcIdentificationMode ( if (MmcHostInstance->CardInfo.CardType != MMC_CARD) { MmcHostInstance->CardInfo.RCA = Response[0] >> 16; } else { - MmcHostInstance->CardInfo.RCA = CmdArg; + MmcHostInstance->CardInfo.RCA = (UINT16)(CmdArg & 0xFFFF); } Status = MmcNotifyState (MmcHostInstance, MmcStandByState); @@ -788,7 +788,7 @@ InitializeMmcDevice ( { EFI_STATUS Status; EFI_MMC_HOST_PROTOCOL *MmcHost; - UINTN BlockCount; + UINT32 BlockCount; BlockCount = 1; MmcHost = MmcHostInstance->MmcHost; From f5cde4091914f4b88b1ec9cea891c2730e64de31 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Sun, 18 Jan 2026 15:31:20 -0800 Subject: [PATCH 1070/1172] EmbeddedPkg/GdbStub/X64: Use X64 system context Found with VS2022 NOOPT X64 build. Signed-off-by: Michael D Kinney --- EmbeddedPkg/GdbStub/X64/Processor.c | 98 ++++++++++++++--------------- 1 file changed, 48 insertions(+), 50 deletions(-) diff --git a/EmbeddedPkg/GdbStub/X64/Processor.c b/EmbeddedPkg/GdbStub/X64/Processor.c index 4ff79abe4227..f9401eed6459 100644 --- a/EmbeddedPkg/GdbStub/X64/Processor.c +++ b/EmbeddedPkg/GdbStub/X64/Processor.c @@ -404,13 +404,13 @@ GetBreakpointDataAddress ( UINTN Address; if (BreakpointNumber == 1) { - Address = SystemContext.SystemContextIa32->Dr0; + Address = SystemContext.SystemContextX64->Dr0; } else if (BreakpointNumber == 2) { - Address = SystemContext.SystemContextIa32->Dr1; + Address = SystemContext.SystemContextX64->Dr1; } else if (BreakpointNumber == 3) { - Address = SystemContext.SystemContextIa32->Dr2; + Address = SystemContext.SystemContextX64->Dr2; } else if (BreakpointNumber == 4) { - Address = SystemContext.SystemContextIa32->Dr3; + Address = SystemContext.SystemContextX64->Dr3; } else { Address = 0; } @@ -437,7 +437,7 @@ GetBreakpointDetected ( IA32_DR6 Dr6; UINTN BreakpointNumber; - Dr6.UintN = SystemContext.SystemContextIa32->Dr6; + Dr6.UintN = SystemContext.SystemContextX64->Dr6; if (Dr6.Bits.B0 == 1) { BreakpointNumber = 1; @@ -474,7 +474,7 @@ GetBreakpointType ( IA32_DR7 Dr7; BREAK_TYPE Type = NotSupported; // Default is NotSupported type - Dr7.UintN = SystemContext.SystemContextIa32->Dr7; + Dr7.UintN = SystemContext.SystemContextX64->Dr7; if (BreakpointNumber == 1) { Type = (BREAK_TYPE)Dr7.Bits.RW0; @@ -537,7 +537,7 @@ FindNextFreeDebugRegister ( { IA32_DR7 Dr7; - Dr7.UintN = SystemContext.SystemContextIa32->Dr7; + Dr7.UintN = SystemContext.SystemContextX64->Dr7; if (Dr7.Bits.G0 == 0) { *Register = 0; @@ -596,35 +596,34 @@ EnableDebugRegister ( } // Read DR7 so appropriate Gn, RWn and LENn bits can be modified. - Dr7.UintN = SystemContext.SystemContextIa32->Dr7; + Dr7.UintN = SystemContext.SystemContextX64->Dr7; if (Register == 0) { - SystemContext.SystemContextIa32->Dr0 = Address; - Dr7.Bits.G0 = 1; - Dr7.Bits.RW0 = Type; - Dr7.Bits.LEN0 = Length; + SystemContext.SystemContextX64->Dr0 = Address; + Dr7.Bits.G0 = 1; + Dr7.Bits.RW0 = (UINT32)Type; + Dr7.Bits.LEN0 = (UINT32)Length; } else if (Register == 1) { - SystemContext.SystemContextIa32->Dr1 = Address; - Dr7.Bits.G1 = 1; - Dr7.Bits.RW1 = Type; - Dr7.Bits.LEN1 = Length; + SystemContext.SystemContextX64->Dr1 = Address; + Dr7.Bits.G1 = 1; + Dr7.Bits.RW1 = (UINT32)Type; + Dr7.Bits.LEN1 = (UINT32)Length; } else if (Register == 2) { - SystemContext.SystemContextIa32->Dr2 = Address; - Dr7.Bits.G2 = 1; - Dr7.Bits.RW2 = Type; - Dr7.Bits.LEN2 = Length; + SystemContext.SystemContextX64->Dr2 = Address; + Dr7.Bits.G2 = 1; + Dr7.Bits.RW2 = (UINT32)Type; + Dr7.Bits.LEN2 = (UINT32)Length; } else if (Register == 3) { - SystemContext.SystemContextIa32->Dr3 = Address; - Dr7.Bits.G3 = 1; - Dr7.Bits.RW3 = Type; - Dr7.Bits.LEN3 = Length; + SystemContext.SystemContextX64->Dr3 = Address; + Dr7.Bits.G3 = 1; + Dr7.Bits.RW3 = (UINT32)Type; + Dr7.Bits.LEN3 = (UINT32)Length; } else { return EFI_INVALID_PARAMETER; } // Update Dr7 with appropriate Gn, RWn and LENn bits - SystemContext.SystemContextIa32->Dr7 = Dr7.UintN; - + SystemContext.SystemContextX64->Dr7 = Dr7.UintN; return EFI_SUCCESS; } @@ -666,30 +665,30 @@ FindMatchingDebugRegister ( // Convert length data Length = ConvertLengthData (Length); - Dr7.UintN = SystemContext.SystemContextIa32->Dr7; + Dr7.UintN = SystemContext.SystemContextX64->Dr7; if ((Dr7.Bits.G0 == 1) && (Dr7.Bits.LEN0 == Length) && (Dr7.Bits.RW0 == Type) && - (Address == SystemContext.SystemContextIa32->Dr0)) + (Address == SystemContext.SystemContextX64->Dr0)) { *Register = 0; } else if ((Dr7.Bits.G1 == 1) && (Dr7.Bits.LEN1 == Length) && (Dr7.Bits.RW1 == Type) && - (Address == SystemContext.SystemContextIa32->Dr1)) + (Address == SystemContext.SystemContextX64->Dr1)) { *Register = 1; } else if ((Dr7.Bits.G2 == 1) && (Dr7.Bits.LEN2 == Length) && (Dr7.Bits.RW2 == Type) && - (Address == SystemContext.SystemContextIa32->Dr2)) + (Address == SystemContext.SystemContextX64->Dr2)) { *Register = 2; } else if ((Dr7.Bits.G3 == 1) && (Dr7.Bits.LEN3 == Length) && (Dr7.Bits.RW3 == Type) && - (Address == SystemContext.SystemContextIa32->Dr3)) + (Address == SystemContext.SystemContextX64->Dr3)) { *Register = 3; } else { @@ -719,35 +718,34 @@ DisableDebugRegister ( UINTN Address = 0; // Read DR7 register so appropriate Gn, RWn and LENn bits can be turned off. - Dr7.UintN = SystemContext.SystemContextIa32->Dr7; + Dr7.UintN = SystemContext.SystemContextX64->Dr7; if (Register == 0) { - SystemContext.SystemContextIa32->Dr0 = Address; - Dr7.Bits.G0 = 0; - Dr7.Bits.RW0 = 0; - Dr7.Bits.LEN0 = 0; + SystemContext.SystemContextX64->Dr0 = Address; + Dr7.Bits.G0 = 0; + Dr7.Bits.RW0 = 0; + Dr7.Bits.LEN0 = 0; } else if (Register == 1) { - SystemContext.SystemContextIa32->Dr1 = Address; - Dr7.Bits.G1 = 0; - Dr7.Bits.RW1 = 0; - Dr7.Bits.LEN1 = 0; + SystemContext.SystemContextX64->Dr1 = Address; + Dr7.Bits.G1 = 0; + Dr7.Bits.RW1 = 0; + Dr7.Bits.LEN1 = 0; } else if (Register == 2) { - SystemContext.SystemContextIa32->Dr2 = Address; - Dr7.Bits.G2 = 0; - Dr7.Bits.RW2 = 0; - Dr7.Bits.LEN2 = 0; + SystemContext.SystemContextX64->Dr2 = Address; + Dr7.Bits.G2 = 0; + Dr7.Bits.RW2 = 0; + Dr7.Bits.LEN2 = 0; } else if (Register == 3) { - SystemContext.SystemContextIa32->Dr3 = Address; - Dr7.Bits.G3 = 0; - Dr7.Bits.RW3 = 0; - Dr7.Bits.LEN3 = 0; + SystemContext.SystemContextX64->Dr3 = Address; + Dr7.Bits.G3 = 0; + Dr7.Bits.RW3 = 0; + Dr7.Bits.LEN3 = 0; } else { return EFI_INVALID_PARAMETER; } // Update DR7 register so appropriate Gn, RWn and LENn bits can be turned off. - SystemContext.SystemContextIa32->Dr7 = Dr7.UintN; - + SystemContext.SystemContextX64->Dr7 = Dr7.UintN; return EFI_SUCCESS; } From 038c22c624048140ac8a321267b67860f0f0d864 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Sun, 18 Jan 2026 15:21:19 -0800 Subject: [PATCH 1071/1172] EmbeddedPkg/Library/VirtualRealTimeClockLib: Fix type mismatch Signed-off-by: Michael D Kinney --- .../Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c b/EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c index 0579e6dcf1dd..dfd2c24159ca 100644 --- a/EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c +++ b/EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c @@ -98,7 +98,7 @@ LibGetTime ( } Counter = GetPerformanceCounter (); - EpochSeconds += DivU64x64Remainder (Counter, Freq, &Remainder); + EpochSeconds += (UINTN)DivU64x64Remainder (Counter, Freq, &Remainder); // Get the current time zone information from non-volatile storage Size = sizeof (TimeZone); @@ -272,7 +272,7 @@ LibSetTime ( if (Freq != 0) { Counter = GetPerformanceCounter (); if (EpochSeconds > DivU64x64Remainder (Counter, Freq, &Remainder)) { - EpochSeconds -= DivU64x64Remainder (Counter, Freq, &Remainder); + EpochSeconds -= (UINTN)DivU64x64Remainder (Counter, Freq, &Remainder); } } From 070d88a592f734a5316b5bd0af15ca5b31d2dd1e Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 15 Jan 2026 18:37:34 -0800 Subject: [PATCH 1072/1172] BaseTools/Conf: CLANGDWARF remove -mno-sse -mno-mmx Signed-off-by: Michael D Kinney --- BaseTools/Conf/tools_def.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index 50a73645d523..1d65eeb4c7b3 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -1949,7 +1949,7 @@ DEFINE CLANGDWARF_IA32_TARGET = -target i686-pc-linux-gnu DEFINE CLANGDWARF_X64_TARGET = -target x86_64-pc-linux-gnu DEFINE CLANGDWARF_WARNING_OVERRIDES = -Wno-parentheses-equality -Wno-empty-body -Wno-unused-const-variable -Wno-varargs -Wno-unknown-warning-option -Wno-unused-but-set-variable -Wno-unused-const-variable -Wno-unaligned-access -DEFINE CLANGDWARF_ALL_CC_FLAGS = DEF(GCC48_ALL_CC_FLAGS) DEF(CLANGDWARF_WARNING_OVERRIDES) -fno-stack-protector -mms-bitfields -Wno-address -Wno-shift-negative-value -Wno-unknown-pragmas -Wno-incompatible-library-redeclaration -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -msoft-float -mno-implicit-float -ftrap-function=undefined_behavior_has_been_optimized_away_by_clang -funsigned-char -fno-ms-extensions -Wno-null-dereference +DEFINE CLANGDWARF_ALL_CC_FLAGS = DEF(GCC48_ALL_CC_FLAGS) DEF(CLANGDWARF_WARNING_OVERRIDES) -fno-stack-protector -mms-bitfields -Wno-address -Wno-shift-negative-value -Wno-unknown-pragmas -Wno-incompatible-library-redeclaration -fno-asynchronous-unwind-tables -msoft-float -mno-implicit-float -ftrap-function=undefined_behavior_has_been_optimized_away_by_clang -funsigned-char -fno-ms-extensions -Wno-null-dereference ########################### # CLANGDWARF IA32 definitions From 8ba64a9a9417b45b033cf1307a9e96f3df2530f2 Mon Sep 17 00:00:00 2001 From: Khalid Ali Date: Thu, 22 Jan 2026 10:52:57 +0000 Subject: [PATCH 1073/1172] UefiPayloadPkg: Fix build failure with CLANGPDB EFI_PCI_IO_PROTOCOL->Pci services (Read and Write) take EFI_PCI_IO_PROTOCOL_WIDTH as second argument. However in PciPlatformDxe enum argument of EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH is usedwhich caused build to fail. Use EfiPciWidthUint32 which is enum member of EFI_PCI_IO_PROTOCOL_WIDTH. Signed-off-by: Khalid Ali --- UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.c b/UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.c index 05b66c0e8cb2..a67d687b0e17 100644 --- a/UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.c +++ b/UefiPayloadPkg/PciPlatformDxe/PciPlatformDxe.c @@ -166,7 +166,7 @@ PciGetPciRom ( // Status = PciIo->Pci.Read ( PciIo, - EfiPciWidthUint32, + EfiPciIoWidthUint32, RomBarIndex, 1, &Buffer @@ -182,7 +182,7 @@ PciGetPciRom ( Status = PciIo->Pci.Write ( PciIo, - EfiPciWidthUint32, + EfiPciIoWidthUint32, RomBarIndex, 1, &AllOnes @@ -196,7 +196,7 @@ PciGetPciRom ( // Status = PciIo->Pci.Read ( PciIo, - EfiPciWidthUint32, + EfiPciIoWidthUint32, RomBarIndex, 1, &AllOnes @@ -222,7 +222,7 @@ PciGetPciRom ( RomBar = Buffer | 1; Status = PciIo->Pci.Write ( PciIo, - EfiPciWidthUint32, + EfiPciIoWidthUint32, RomBarIndex, 1, &RomBar @@ -386,7 +386,7 @@ PciGetPciRom ( // PciIo->Pci.Write ( PciIo, - EfiPciWidthUint32, + EfiPciIoWidthUint32, RomBarIndex, 1, &RomBar From 8c3e181b79c69e2e0c1fcb38bba28fdffb6bc0b6 Mon Sep 17 00:00:00 2001 From: Dongyan Qian Date: Mon, 10 Nov 2025 09:42:49 +0800 Subject: [PATCH 1074/1172] MdeModulePkg/PciBusDxe: Fix typo in Buffer parameter description The comment for the Buffer parameter incorrectly said "then no the size" instead of "then the size". This patch fixes the typo only; no functional changes. Signed-off-by: Dongyan Qian --- MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c | 4 ++-- MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c index 53e8189b87a3..ba14ccbc30d6 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c @@ -18,7 +18,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent On output with a return code of EFI_BUFFER_TOO_SMALL, the size of Buffer required to retrieve the requested file. @param Buffer The memory buffer to transfer the file to. If Buffer is NULL, - then no the size of the requested file is returned in BufferSize. + then the size of the requested file is returned in BufferSize. @retval EFI_SUCCESS The file was loaded. @retval EFI_INVALID_PARAMETER FilePath is not a valid device path, or @@ -179,7 +179,7 @@ InitializePciLoadFile2 ( On output with a return code of EFI_BUFFER_TOO_SMALL, the size of Buffer required to retrieve the requested file. @param Buffer The memory buffer to transfer the file to. If Buffer is NULL, - then no the size of the requested file is returned in BufferSize. + then the size of the requested file is returned in BufferSize. @retval EFI_SUCCESS The file was loaded. @retval EFI_UNSUPPORTED BootPolicy is TRUE. diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.h b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.h index 18db717d0df1..e173353ce32f 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.h +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.h @@ -31,7 +31,7 @@ InitializePciLoadFile2 ( On output with a return code of EFI_BUFFER_TOO_SMALL, the size of Buffer required to retrieve the requested file. @param Buffer The memory buffer to transfer the file to. If Buffer is NULL, - then no the size of the requested file is returned in BufferSize. + then the size of the requested file is returned in BufferSize. @retval EFI_SUCCESS The file was loaded. @retval EFI_UNSUPPORTED BootPolicy is TRUE. From 4890db2abc9339d79ac18b4420a3dcead7e50c66 Mon Sep 17 00:00:00 2001 From: Dongyan Qian Date: Mon, 10 Nov 2025 10:02:02 +0800 Subject: [PATCH 1075/1172] NetworkPkg/UefiPxeBcDxe: Fix typo in Buffer parameter description The comment for the Buffer parameter incorrectly said "then no the size" instead of "then the size". This patch fixes the typo only; no functional changes. Signed-off-by: Dongyan Qian --- NetworkPkg/UefiPxeBcDxe/PxeBcImpl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcImpl.c b/NetworkPkg/UefiPxeBcDxe/PxeBcImpl.c index e29647447184..d3f6c246bf20 100644 --- a/NetworkPkg/UefiPxeBcDxe/PxeBcImpl.c +++ b/NetworkPkg/UefiPxeBcDxe/PxeBcImpl.c @@ -2335,7 +2335,7 @@ EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL gPxeBcCallBackTemplate = { Buffer. On output with a return code of EFI_BUFFER_TOO_SMALL, the size of Buffer required to retrieve the requested file. @param[in] Buffer The memory buffer to transfer the file to. IF Buffer is NULL, - then no the size of the requested file is returned in + then the size of the requested file is returned in BufferSize. @retval EFI_SUCCESS The file was loaded. From b55b3ae351b23ade11fe4518b7f0d1ebe4ddac29 Mon Sep 17 00:00:00 2001 From: Dongyan Qian Date: Mon, 10 Nov 2025 10:02:49 +0800 Subject: [PATCH 1076/1172] EmbeddedPkg/AndroidBootImgLib: Fix typo in Buffer parameter description The comment for the Buffer parameter incorrectly said "then no the size" instead of "then the size". This patch fixes the typo only; no functional changes. Signed-off-by: Dongyan Qian --- EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.c b/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.c index 9c1621343fed..d8603988526d 100644 --- a/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.c +++ b/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.c @@ -87,7 +87,7 @@ STATIC CONST RAMDISK_DEVICE_PATH mRamdiskDevicePath = Buffer. On output with a return code of EFI_BUFFER_TOO_SMALL, the size of Buffer required to retrieve the requested file. @param Buffer The memory buffer to transfer the file to. IF Buffer is NULL, - then no the size of the requested file is returned in + then the size of the requested file is returned in BufferSize. @retval EFI_SUCCESS The file was loaded. From 01cdc859e5acc4566b8d7714237a92064a81fa96 Mon Sep 17 00:00:00 2001 From: Dongyan Qian Date: Mon, 10 Nov 2025 10:05:10 +0800 Subject: [PATCH 1077/1172] MdePkg/LoadFile2: Fix typo in Buffer parameter description The comment for the Buffer parameter incorrectly said "then no the size" instead of "then the size". This patch fixes the typo only; no functional changes. Reported-by: Yao Zi Signed-off-by: Dongyan Qian --- MdePkg/Include/Protocol/LoadFile2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MdePkg/Include/Protocol/LoadFile2.h b/MdePkg/Include/Protocol/LoadFile2.h index 21bb37b4a162..fabc3d9c073e 100644 --- a/MdePkg/Include/Protocol/LoadFile2.h +++ b/MdePkg/Include/Protocol/LoadFile2.h @@ -38,7 +38,7 @@ typedef struct _EFI_LOAD_FILE2_PROTOCOL EFI_LOAD_FILE2_PROTOCOL; Buffer. On output with a return code of EFI_BUFFER_TOO_SMALL, the size of Buffer required to retrieve the requested file. @param Buffer The memory buffer to transfer the file to. IF Buffer is NULL, - then no the size of the requested file is returned in + then the size of the requested file is returned in BufferSize. @retval EFI_SUCCESS The file was loaded. From 6458470010c88be9699a86624bbbef51a722b910 Mon Sep 17 00:00:00 2001 From: Dongyan Qian Date: Mon, 10 Nov 2025 10:05:45 +0800 Subject: [PATCH 1078/1172] MdeModulePkg/LoadFileOnFv2: Fix typo in Buffer parameter description The comment for the Buffer parameter incorrectly said "then no the size" instead of "then the size". This patch fixes the typo only; no functional changes. Reported-by: Yao Zi Signed-off-by: Dongyan Qian --- MdeModulePkg/Universal/LoadFileOnFv2/LoadFileOnFv2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MdeModulePkg/Universal/LoadFileOnFv2/LoadFileOnFv2.c b/MdeModulePkg/Universal/LoadFileOnFv2/LoadFileOnFv2.c index 9f898e38e4b8..25d1a15da04f 100644 --- a/MdeModulePkg/Universal/LoadFileOnFv2/LoadFileOnFv2.c +++ b/MdeModulePkg/Universal/LoadFileOnFv2/LoadFileOnFv2.c @@ -53,7 +53,7 @@ LIST_ENTRY mPrivateDataList; Buffer. On output with a return code of EFI_BUFFER_TOO_SMALL, the size of Buffer required to retrieve the requested file. @param[in] Buffer The memory buffer to transfer the file to. IF Buffer is NULL, - then no the size of the requested file is returned in + then the size of the requested file is returned in BufferSize. @retval EFI_SUCCESS The file was loaded. From 811f56c9386be0dcd151cb5b1af3878c0a4e7b09 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Tue, 13 Jan 2026 21:46:02 -0800 Subject: [PATCH 1079/1172] UefiCpuPkg/Library/CpuPageTableLib/UnitTest: Fix pointer compare Use UT_ASSERT_NOT_NULL() instead of UT_ASSERT_NOT_EQUAL() to resolve build issues for comparing a pointers. UT_ASSERT_NULL() are UT_ASSERT_NOT_NULL() are intended to be used with pointers and UT_ASSERT_EQUAL() and UT_ASSERT_NOT_EQUAL() are intended to be used with integer values. Signed-off-by: Michael D Kinney --- UefiCpuPkg/Library/CpuPageTableLib/UnitTest/RandomTest.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/RandomTest.c b/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/RandomTest.c index 9ac3188be08c..95a3f3cde838 100644 --- a/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/RandomTest.c +++ b/UefiCpuPkg/Library/CpuPageTableLib/UnitTest/RandomTest.c @@ -785,7 +785,7 @@ SingleMapEntryTest ( // Note the memory is used in one complete Random test. // Buffer = PagesRecord->AllocatePagesForPageTable (PagesRecord, EFI_SIZE_TO_PAGES (PageTableBufferSize)); - UT_ASSERT_NOT_EQUAL (Buffer, NULL); + UT_ASSERT_NOT_NULL (Buffer); Status = PageTableMap ( PageTable, PagingMode, From 94a50ef550b9523a871b9742501995cba0920e67 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Sun, 18 Jan 2026 15:19:58 -0800 Subject: [PATCH 1080/1172] UefiCpuPkg: Fix VS2022 NOOPT IA32 build issues Update to consistently use IS_ALIGNED() to check for page aligned values instead of & or % operator with EFI_PAGE_SIZE or SIZE_4KB. Use of % operator is a division operation that introduces use of intrinsics for VS2022 NOOPT IA32 builds when 64-bit operands are used. Change PrevProcessorIndex in GetSmBase() from UINT64 to UINTN to remove use of intrinsics in VS2022 NOOPT IA32 builds. Change SmmProfileSize in InitSmmProfileInternal() from UINT64 to UINTN to resolve VS2022 NOOPT IA32 build issues. Change SmmProfileSize in IsSmmProfileEnabled() from UINT64 to UINTN to resolve VS2022 NOOPT IA32 build issues. Change Size parameter in GetSmmProfileData() from UINT64 to UINTN to resolve VS2022 NOOPT IA32 build issues. Signed-off-by: Michael D Kinney --- UefiCpuPkg/CpuDxe/CpuPageTable.c | 4 ++-- UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c | 2 +- .../Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c | 2 +- UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableMap.c | 4 ++-- UefiCpuPkg/PiSmmCpuDxeSmm/NonMmramMapDxeSmm.c | 12 ++++++------ UefiCpuPkg/PiSmmCpuDxeSmm/NonMmramMapStandaloneMm.c | 4 ++-- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuCommon.c | 4 ++-- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuCommon.h | 2 +- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuStandaloneMm.c | 2 +- UefiCpuPkg/PiSmmCpuDxeSmm/SmmCpuMemoryManagement.c | 12 ++++++------ UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c | 8 ++++---- 11 files changed, 28 insertions(+), 28 deletions(-) diff --git a/UefiCpuPkg/CpuDxe/CpuPageTable.c b/UefiCpuPkg/CpuDxe/CpuPageTable.c index 433316b4de82..d45d276029f3 100644 --- a/UefiCpuPkg/CpuDxe/CpuPageTable.c +++ b/UefiCpuPkg/CpuDxe/CpuPageTable.c @@ -736,12 +736,12 @@ ConvertMemoryPageAttributes ( BOOLEAN IsEntryModified; BOOLEAN IsWpEnabled; - if ((BaseAddress & (SIZE_4KB - 1)) != 0) { + if (!IS_ALIGNED (BaseAddress, SIZE_4KB)) { DEBUG ((DEBUG_ERROR, "BaseAddress(0x%lx) is not aligned!\n", BaseAddress)); return EFI_UNSUPPORTED; } - if ((Length & (SIZE_4KB - 1)) != 0) { + if (!IS_ALIGNED (Length, SIZE_4KB)) { DEBUG ((DEBUG_ERROR, "Length(0x%lx) is not aligned!\n", Length)); return EFI_UNSUPPORTED; } diff --git a/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c b/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c index 724f96df2239..407868ae3c20 100644 --- a/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c +++ b/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c @@ -99,7 +99,7 @@ SetLocalApicBaseAddress ( { MSR_IA32_APIC_BASE_REGISTER ApicBaseMsr; - ASSERT ((BaseAddress & (SIZE_4KB - 1)) == 0); + ASSERT (IS_ALIGNED (BaseAddress, SIZE_4KB)); if (!LocalApicBaseAddressMsrSupported ()) { // diff --git a/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c b/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c index 6ef096ad6d9c..b0e77f729e2d 100644 --- a/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c +++ b/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c @@ -244,7 +244,7 @@ SetLocalApicBaseAddress ( { MSR_IA32_APIC_BASE_REGISTER ApicBaseMsr; - ASSERT ((BaseAddress & (SIZE_4KB - 1)) == 0); + ASSERT (IS_ALIGNED (BaseAddress, SIZE_4KB)); if (!LocalApicBaseAddressMsrSupported ()) { // diff --git a/UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableMap.c b/UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableMap.c index 6f959033ff65..b3a47566312f 100644 --- a/UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableMap.c +++ b/UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableMap.c @@ -722,14 +722,14 @@ PageTableMap ( return RETURN_INVALID_PARAMETER; } - if (*BufferSize % SIZE_4KB != 0) { + if (!IS_ALIGNED (*BufferSize, SIZE_4KB)) { // // BufferSize should be multiple of 4K. // return RETURN_INVALID_PARAMETER; } - if (((UINTN)LinearAddress % SIZE_4KB != 0) || ((UINTN)Length % SIZE_4KB != 0)) { + if (!IS_ALIGNED ((UINTN)LinearAddress, SIZE_4KB) || !IS_ALIGNED ((UINTN)Length, SIZE_4KB)) { // // LinearAddress and Length should be multiple of 4K. // diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/NonMmramMapDxeSmm.c b/UefiCpuPkg/PiSmmCpuDxeSmm/NonMmramMapDxeSmm.c index 00205b236de4..162ac9ff8350 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/NonMmramMapDxeSmm.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/NonMmramMapDxeSmm.c @@ -487,7 +487,7 @@ UpdateUefiMemMapAttributes ( **/ EFI_PHYSICAL_ADDRESS GetSmmProfileData ( - IN OUT UINT64 *Size + IN OUT UINTN *Size ) { EFI_STATUS Status; @@ -495,17 +495,17 @@ GetSmmProfileData ( ASSERT (Size != NULL); - *Size = PcdGet32 (PcdCpuSmmProfileSize); + *Size = (UINTN)PcdGet32 (PcdCpuSmmProfileSize); Base = 0xFFFFFFFF; Status = gBS->AllocatePages ( AllocateMaxAddress, EfiReservedMemoryType, - (UINTN)EFI_SIZE_TO_PAGES (*Size), + EFI_SIZE_TO_PAGES (*Size), &Base ); ASSERT_EFI_ERROR (Status); - ZeroMem ((VOID *)(UINTN)Base, (UINTN)*Size); + ZeroMem ((VOID *)(UINTN)Base, *Size); return Base; } @@ -636,7 +636,7 @@ CreateExtendedProtectionRange ( for (Index = 0; Index < NumberOfSpaceDescriptors; Index++) { if (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeMemoryMappedIo) { if (ADDRESS_IS_ALIGNED (MemorySpaceMap[Index].BaseAddress, SIZE_4KB) && - (MemorySpaceMap[Index].Length % SIZE_4KB == 0)) + IS_ALIGNED (MemorySpaceMap[Index].Length, SIZE_4KB)) { Count++; } else { @@ -663,7 +663,7 @@ CreateExtendedProtectionRange ( for (Index = 0; Index < NumberOfSpaceDescriptors; Index++) { if ((MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeMemoryMappedIo) && ADDRESS_IS_ALIGNED (MemorySpaceMap[Index].BaseAddress, SIZE_4KB) && - (MemorySpaceMap[Index].Length % SIZE_4KB == 0)) + IS_ALIGNED (MemorySpaceMap[Index].Length, SIZE_4KB)) { (*MemoryRegion)[MemoryRegionIndex].Base = MemorySpaceMap[Index].BaseAddress; (*MemoryRegion)[MemoryRegionIndex].Length = MemorySpaceMap[Index].Length; diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/NonMmramMapStandaloneMm.c b/UefiCpuPkg/PiSmmCpuDxeSmm/NonMmramMapStandaloneMm.c index 6edbf9dfcf61..1b60c1022271 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/NonMmramMapStandaloneMm.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/NonMmramMapStandaloneMm.c @@ -18,7 +18,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent **/ EFI_PHYSICAL_ADDRESS GetSmmProfileData ( - IN OUT UINT64 *Size + IN OUT UINTN *Size ) { EFI_PEI_HOB_POINTERS SmmProfileDataHob; @@ -45,7 +45,7 @@ GetSmmProfileData ( return 0; } - *Size = SmmProfileDataHob.MemoryAllocation->AllocDescriptor.MemoryLength; + *Size = (UINTN)SmmProfileDataHob.MemoryAllocation->AllocDescriptor.MemoryLength; return SmmProfileDataHob.MemoryAllocation->AllocDescriptor.MemoryBaseAddress; } diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuCommon.c b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuCommon.c index c6df9358ebdb..992f6d491812 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuCommon.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuCommon.c @@ -500,7 +500,7 @@ GetSmBase ( UINTN HobIndex; UINTN SortBuffer; UINTN ProcessorIndex; - UINT64 PrevProcessorIndex; + UINTN PrevProcessorIndex; EFI_HOB_GUID_TYPE *FirstSmmBaseGuidHob; SmmBaseHobData = NULL; @@ -626,7 +626,7 @@ GetMpInformation ( MP_INFORMATION2_HOB_DATA **MpInfo2Hobs; UINTN SortBuffer; UINTN ProcessorIndex; - UINT64 PrevProcessorIndex; + UINTN PrevProcessorIndex; MP_INFORMATION2_ENTRY *MpInformation2Entry; EFI_PROCESSOR_INFORMATION *ProcessorInfo; diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuCommon.h b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuCommon.h index bc08f03640e8..f6f14ea46f0f 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuCommon.h +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuCommon.h @@ -972,7 +972,7 @@ SetMemMapAttributes ( **/ EFI_PHYSICAL_ADDRESS GetSmmProfileData ( - IN OUT UINT64 *Size + IN OUT UINTN *Size ); /** diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuStandaloneMm.c b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuStandaloneMm.c index 6f59b493051a..a1d50e15df92 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuStandaloneMm.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuStandaloneMm.c @@ -32,7 +32,7 @@ IsSmmProfileEnabled ( VOID ) { - UINT64 SmmProfileSize; + UINTN SmmProfileSize; GetSmmProfileData (&SmmProfileSize); if (SmmProfileSize == 0) { diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmCpuMemoryManagement.c b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmCpuMemoryManagement.c index 9c2fe162a992..52fbcc93e23f 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmCpuMemoryManagement.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmCpuMemoryManagement.c @@ -353,8 +353,8 @@ ConvertMemoryPageAttributes ( ASSERT (Attributes != 0); ASSERT ((Attributes & ~EFI_MEMORY_ATTRIBUTE_MASK) == 0); - ASSERT ((BaseAddress & (SIZE_4KB - 1)) == 0); - ASSERT ((Length & (SIZE_4KB - 1)) == 0); + ASSERT (IS_ALIGNED (BaseAddress, SIZE_4KB)); + ASSERT (IS_ALIGNED (Length, SIZE_4KB)); ASSERT (PageTableBase != 0); if (Length == 0) { @@ -1264,8 +1264,8 @@ GenSmmPageTable ( // 2. Gen NonMmram MemoryRegion PageTable // for (Index = 0; Index < MemoryRegionCount; Index++) { - ASSERT (MemoryRegion[Index].Base % SIZE_4KB == 0); - ASSERT (MemoryRegion[Index].Length % EFI_PAGE_SIZE == 0); + ASSERT (IS_ALIGNED (MemoryRegion[Index].Base, SIZE_4KB)); + ASSERT (IS_ALIGNED (MemoryRegion[Index].Length, EFI_PAGE_SIZE)); // // Set the MapAttribute @@ -1304,8 +1304,8 @@ GenSmmPageTable ( // 3. Gen MMRAM Range PageTable // for (Index = 0; Index < mSmmCpuSmramRangeCount; Index++) { - ASSERT (mSmmCpuSmramRanges[Index].CpuStart % SIZE_4KB == 0); - ASSERT (mSmmCpuSmramRanges[Index].PhysicalSize % EFI_PAGE_SIZE == 0); + ASSERT (IS_ALIGNED (mSmmCpuSmramRanges[Index].CpuStart, SIZE_4KB)); + ASSERT (IS_ALIGNED (mSmmCpuSmramRanges[Index].PhysicalSize, EFI_PAGE_SIZE)); // // Set the MapAttribute diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c index f28da7e0fbc0..fa78ded8c968 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c @@ -747,7 +747,7 @@ InitSmmProfileInternal ( VOID *Registration; UINTN Index; UINTN MsrDsAreaSizePerCpu; - UINT64 SmmProfileSize; + UINTN SmmProfileSize; Status = EFI_SUCCESS; mPFEntryCount = (UINTN *)AllocateZeroPool (sizeof (UINTN) * mMaxNumberOfCpus); @@ -766,13 +766,13 @@ InitSmmProfileInternal ( // mSmmProfileBase = (SMM_PROFILE_HEADER *)(UINTN)GetSmmProfileData (&SmmProfileSize); DEBUG ((DEBUG_ERROR, "SmmProfileBase = 0x%016x.\n", (UINTN)mSmmProfileBase)); - DEBUG ((DEBUG_ERROR, "SmmProfileSize = 0x%016x.\n", (UINTN)SmmProfileSize)); + DEBUG ((DEBUG_ERROR, "SmmProfileSize = 0x%016x.\n", SmmProfileSize)); if (mBtsSupported) { ASSERT (SmmProfileSize > mMsrDsAreaSize); - mSmmProfileSize = (UINTN)SmmProfileSize - mMsrDsAreaSize; + mSmmProfileSize = SmmProfileSize - mMsrDsAreaSize; } else { - mSmmProfileSize = (UINTN)SmmProfileSize; + mSmmProfileSize = SmmProfileSize; } ASSERT ((mSmmProfileSize & 0xFFF) == 0); From 229fbfde14a32435f1c0854e90312325b0f2aba5 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Tue, 13 Jan 2026 21:27:16 -0800 Subject: [PATCH 1081/1172] SignedCapsulePkg/Universal/RecoveryModuleLoadPei: 4KB alignment 4KB alignment required because this module exceeds maximum size for some NOOPT build configurations. This is a post-memory PEIM that can be compressed, so size impacts for 4KB alignment can be minimized. Must be in DLINK2_FLAGS to override DLINK_XIPFLAGS for GCC PEIM build rules flags ordering. Build failure detected with NOOPT AARCH64 builds. Signed-off-by: Michael D Kinney --- .../RecoveryModuleLoadPei/RecoveryModuleLoadPei.inf | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/SignedCapsulePkg/Universal/RecoveryModuleLoadPei/RecoveryModuleLoadPei.inf b/SignedCapsulePkg/Universal/RecoveryModuleLoadPei/RecoveryModuleLoadPei.inf index 431b0e1802f5..b2320b464048 100644 --- a/SignedCapsulePkg/Universal/RecoveryModuleLoadPei/RecoveryModuleLoadPei.inf +++ b/SignedCapsulePkg/Universal/RecoveryModuleLoadPei/RecoveryModuleLoadPei.inf @@ -59,6 +59,15 @@ [depex] gEfiPeiBootInRecoveryModePpiGuid +[BuildOptions] + # 4KB alignment required because this module exceeds maximum size + # for some NOOPT build configurations. This is a post-memory PEIM + # that can be compressed, so size impacts for 4KB alignment can be + # minimized. Must be in DLINK2_FLAGS to override DLINK_XIPFLAGS + # for GCC PEIM build rules flags ordering. + GCC:*_*_*_DLINK2_FLAGS = -z common-page-size=0x1000 + CLANGPDB:*_*_*_DLINK2_FLAGS = + [UserExtensions.TianoCore."ExtraFiles"] RecoveryModuleLoadPeiExtra.uni From 1b70ffe81954dab40584ee3f7acef1f7756108c5 Mon Sep 17 00:00:00 2001 From: Khalid Ali Date: Sun, 25 Jan 2026 09:14:39 +0000 Subject: [PATCH 1082/1172] EmulatorPkg: Fix build failure with gcc when TLS is enabled Currently, build fails with TLS in emulatorPkg due missing library instance of TlsLib. Add library instance. Also, uuse OpensslLib.inf as library instance for OpenSsl instead of OpensslLibCrypto. OpensslLibCrypto is library instance where TLS features are disabled, this causes in EmulatorPkg openssl library symbols not get resolved. Also, move Network.dsc.inc to the top of the file where other dsc.inc files included. Signed-off-by: Khalid Ali --- EmulatorPkg/EmulatorPkg.dsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/EmulatorPkg/EmulatorPkg.dsc b/EmulatorPkg/EmulatorPkg.dsc index f6a2a64dbce4..119743ccd841 100644 --- a/EmulatorPkg/EmulatorPkg.dsc +++ b/EmulatorPkg/EmulatorPkg.dsc @@ -51,6 +51,7 @@ !include MdePkg/MdeLibs.dsc.inc !include CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc !include RedfishPkg/Redfish.dsc.inc +!include NetworkPkg/Network.dsc.inc [LibraryClasses] # @@ -137,8 +138,9 @@ ImagePropertiesRecordLib|MdeModulePkg/Library/ImagePropertiesRecordLib/ImagePropertiesRecordLib.inf RngLib|MdeModulePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf - OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf + OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf + TlsLib|CryptoPkg/Library/TlsLib/TlsLib.inf !if $(SECURE_BOOT_ENABLE) == TRUE PlatformSecureLib|SecurityPkg/Library/PlatformSecureLibNull/PlatformSecureLibNull.inf @@ -521,7 +523,6 @@ !endif -!include NetworkPkg/Network.dsc.inc !if $(REDFISH_ENABLE) == TRUE EmulatorPkg/Application/RedfishPlatformConfig/RedfishPlatformConfig.inf From 491262f43106cd896cff5a8bfda4a477bed52530 Mon Sep 17 00:00:00 2001 From: Qihang Gao Date: Thu, 22 Jan 2026 16:08:30 +0800 Subject: [PATCH 1083/1172] MdeModulePkg/Library: Fix property typos The word property is misspelled as propery, so fix it. Signed-off-by: Qihang Gao --- .../ReportStatusCodeLib.c | 18 ++++++------ .../Library/PeiDebugLibDebugPpi/DebugLib.c | 28 +++++++++---------- .../PeiDxeDebugLibReportStatusCode/DebugLib.c | 28 +++++++++---------- .../ReportStatusCodeLib.c | 18 ++++++------ .../ReportStatusCodeLib.c | 18 ++++++------ .../ReportStatusCodeLib.c | 18 ++++++------ .../VarCheckUefiLibNullClass.c | 24 ++++++++-------- 7 files changed, 76 insertions(+), 76 deletions(-) diff --git a/MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c b/MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c index 04221a92edb5..61835d99ad34 100644 --- a/MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c +++ b/MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c @@ -554,12 +554,12 @@ ReportStatusCodeEx ( Returns TRUE if status codes of type EFI_PROGRESS_CODE are enabled This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED - bit of PcdReportStatusCodeProperyMask is set. Otherwise FALSE is returned. + bit of PcdReportStatusCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is set. + PcdReportStatusCodePropertyMask is set. @retval FALSE The REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is clear. + PcdReportStatusCodePropertyMask is clear. **/ BOOLEAN @@ -575,12 +575,12 @@ ReportProgressCodeEnabled ( Returns TRUE if status codes of type EFI_ERROR_CODE are enabled This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED - bit of PcdReportStatusCodeProperyMask is set. Otherwise FALSE is returned. + bit of PcdReportStatusCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is set. + PcdReportStatusCodePropertyMask is set. @retval FALSE The REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is clear. + PcdReportStatusCodePropertyMask is clear. **/ BOOLEAN @@ -596,12 +596,12 @@ ReportErrorCodeEnabled ( Returns TRUE if status codes of type EFI_DEBUG_CODE are enabled This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED - bit of PcdReportStatusCodeProperyMask is set. Otherwise FALSE is returned. + bit of PcdReportStatusCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is set. + PcdReportStatusCodePropertyMask is set. @retval FALSE The REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is clear. + PcdReportStatusCodePropertyMask is clear. **/ BOOLEAN diff --git a/MdeModulePkg/Library/PeiDebugLibDebugPpi/DebugLib.c b/MdeModulePkg/Library/PeiDebugLibDebugPpi/DebugLib.c index 4fb0ad8b843a..c8be1de09673 100644 --- a/MdeModulePkg/Library/PeiDebugLibDebugPpi/DebugLib.c +++ b/MdeModulePkg/Library/PeiDebugLibDebugPpi/DebugLib.c @@ -277,8 +277,8 @@ DebugVPrint ( Print a message of the form "ASSERT (): \n" to the debug output device. If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of - PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if - DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then + PcdDebugPropertyMask is set then CpuBreakpoint() is called. Otherwise, if + DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugPropertyMask is set then CpuDeadLoop() is called. If neither of these bits are set, then this function returns immediately after the message is printed to the debug output device. DebugAssert() must actively prevent recursion. If DebugAssert() is called while @@ -358,10 +358,10 @@ DebugClearMemory ( Returns TRUE if ASSERT() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of - PcdDebugProperyMask is set. Otherwise, FALSE is returned. + PcdDebugPropertyMask is set. Otherwise, FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -377,10 +377,10 @@ DebugAssertEnabled ( Returns TRUE if DEBUG() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of - PcdDebugProperyMask is set. Otherwise, FALSE is returned. + PcdDebugPropertyMask is set. Otherwise, FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -396,10 +396,10 @@ DebugPrintEnabled ( Returns TRUE if DEBUG_CODE() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdDebugProperyMask is set. Otherwise, FALSE is returned. + PcdDebugPropertyMask is set. Otherwise, FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -415,10 +415,10 @@ DebugCodeEnabled ( Returns TRUE if DEBUG_CLEAR_MEMORY() macro is enabled. This function returns TRUE if the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of - PcdDebugProperyMask is set. Otherwise, FALSE is returned. + PcdDebugPropertyMask is set. Otherwise, FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN diff --git a/MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/DebugLib.c b/MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/DebugLib.c index 7ae5b16c8402..6e39c271f166 100644 --- a/MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/DebugLib.c +++ b/MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/DebugLib.c @@ -362,8 +362,8 @@ DebugBPrint ( Print a message of the form "ASSERT (): \n" to the debug output device. If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of - PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if - DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then + PcdDebugPropertyMask is set then CpuBreakpoint() is called. Otherwise, if + DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugPropertyMask is set then CpuDeadLoop() is called. If neither of these bits are set, then this function returns immediately after the message is printed to the debug output device. DebugAssert() must actively prevent recursion. If DebugAssert() is called while @@ -516,10 +516,10 @@ DebugClearMemory ( Returns TRUE if ASSERT() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -535,10 +535,10 @@ DebugAssertEnabled ( Returns TRUE if DEBUG() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -554,10 +554,10 @@ DebugPrintEnabled ( Returns TRUE if DEBUG_CODE() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -573,10 +573,10 @@ DebugCodeEnabled ( Returns TRUE if DEBUG_CLEAR_MEMORY() macro is enabled. This function returns TRUE if the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN diff --git a/MdeModulePkg/Library/PeiReportStatusCodeLib/ReportStatusCodeLib.c b/MdeModulePkg/Library/PeiReportStatusCodeLib/ReportStatusCodeLib.c index 71da0e94fc73..551818165308 100644 --- a/MdeModulePkg/Library/PeiReportStatusCodeLib/ReportStatusCodeLib.c +++ b/MdeModulePkg/Library/PeiReportStatusCodeLib/ReportStatusCodeLib.c @@ -489,12 +489,12 @@ ReportStatusCodeEx ( Returns TRUE if status codes of type EFI_PROGRESS_CODE are enabled This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED - bit of PcdReportStatusCodeProperyMask is set. Otherwise FALSE is returned. + bit of PcdReportStatusCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is set. + PcdReportStatusCodePropertyMask is set. @retval FALSE The REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is clear. + PcdReportStatusCodePropertyMask is clear. **/ BOOLEAN @@ -510,12 +510,12 @@ ReportProgressCodeEnabled ( Returns TRUE if status codes of type EFI_ERROR_CODE are enabled This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED - bit of PcdReportStatusCodeProperyMask is set. Otherwise FALSE is returned. + bit of PcdReportStatusCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is set. + PcdReportStatusCodePropertyMask is set. @retval FALSE The REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is clear. + PcdReportStatusCodePropertyMask is clear. **/ BOOLEAN @@ -531,12 +531,12 @@ ReportErrorCodeEnabled ( Returns TRUE if status codes of type EFI_DEBUG_CODE are enabled This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED - bit of PcdReportStatusCodeProperyMask is set. Otherwise FALSE is returned. + bit of PcdReportStatusCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is set. + PcdReportStatusCodePropertyMask is set. @retval FALSE The REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is clear. + PcdReportStatusCodePropertyMask is clear. **/ BOOLEAN diff --git a/MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/ReportStatusCodeLib.c b/MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/ReportStatusCodeLib.c index 218031aa7e88..659dfc316265 100644 --- a/MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/ReportStatusCodeLib.c +++ b/MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/ReportStatusCodeLib.c @@ -741,12 +741,12 @@ ReportStatusCodeEx ( Returns TRUE if status codes of type EFI_PROGRESS_CODE are enabled This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED - bit of PcdReportStatusCodeProperyMask is set. Otherwise FALSE is returned. + bit of PcdReportStatusCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is set. + PcdReportStatusCodePropertyMask is set. @retval FALSE The REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is clear. + PcdReportStatusCodePropertyMask is clear. **/ BOOLEAN @@ -762,12 +762,12 @@ ReportProgressCodeEnabled ( Returns TRUE if status codes of type EFI_ERROR_CODE are enabled This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED - bit of PcdReportStatusCodeProperyMask is set. Otherwise FALSE is returned. + bit of PcdReportStatusCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is set. + PcdReportStatusCodePropertyMask is set. @retval FALSE The REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is clear. + PcdReportStatusCodePropertyMask is clear. **/ BOOLEAN @@ -783,12 +783,12 @@ ReportErrorCodeEnabled ( Returns TRUE if status codes of type EFI_DEBUG_CODE are enabled This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED - bit of PcdReportStatusCodeProperyMask is set. Otherwise FALSE is returned. + bit of PcdReportStatusCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is set. + PcdReportStatusCodePropertyMask is set. @retval FALSE The REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is clear. + PcdReportStatusCodePropertyMask is clear. **/ BOOLEAN diff --git a/MdeModulePkg/Library/SmmReportStatusCodeLib/ReportStatusCodeLib.c b/MdeModulePkg/Library/SmmReportStatusCodeLib/ReportStatusCodeLib.c index f9afd1f13cb2..262a197c4a87 100644 --- a/MdeModulePkg/Library/SmmReportStatusCodeLib/ReportStatusCodeLib.c +++ b/MdeModulePkg/Library/SmmReportStatusCodeLib/ReportStatusCodeLib.c @@ -479,12 +479,12 @@ ReportStatusCodeEx ( Returns TRUE if status codes of type EFI_PROGRESS_CODE are enabled This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED - bit of PcdReportStatusCodeProperyMask is set. Otherwise FALSE is returned. + bit of PcdReportStatusCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is set. + PcdReportStatusCodePropertyMask is set. @retval FALSE The REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is clear. + PcdReportStatusCodePropertyMask is clear. **/ BOOLEAN @@ -500,12 +500,12 @@ ReportProgressCodeEnabled ( Returns TRUE if status codes of type EFI_ERROR_CODE are enabled This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED - bit of PcdReportStatusCodeProperyMask is set. Otherwise FALSE is returned. + bit of PcdReportStatusCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is set. + PcdReportStatusCodePropertyMask is set. @retval FALSE The REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is clear. + PcdReportStatusCodePropertyMask is clear. **/ BOOLEAN @@ -521,12 +521,12 @@ ReportErrorCodeEnabled ( Returns TRUE if status codes of type EFI_DEBUG_CODE are enabled This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED - bit of PcdReportStatusCodeProperyMask is set. Otherwise FALSE is returned. + bit of PcdReportStatusCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is set. + PcdReportStatusCodePropertyMask is set. @retval FALSE The REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is clear. + PcdReportStatusCodePropertyMask is clear. **/ BOOLEAN diff --git a/MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLibNullClass.c b/MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLibNullClass.c index 9fbfd9df0228..b5e53f0b0fce 100644 --- a/MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLibNullClass.c +++ b/MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLibNullClass.c @@ -22,7 +22,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent typedef EFI_STATUS (EFIAPI *INTERNAL_VAR_CHECK_FUNCTION)( - IN VAR_CHECK_VARIABLE_PROPERTY *Propery, + IN VAR_CHECK_VARIABLE_PROPERTY *Property, IN UINTN DataSize, IN VOID *Data ); @@ -36,7 +36,7 @@ typedef struct { /** Internal check for load option. - @param[in] VariablePropery Pointer to variable property. + @param[in] VariableProperty Pointer to variable property. @param[in] DataSize Data size. @param[in] Data Pointer to data buffer. @@ -47,7 +47,7 @@ typedef struct { EFI_STATUS EFIAPI InternalVarCheckLoadOption ( - IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery, + IN VAR_CHECK_VARIABLE_PROPERTY *VariableProperty, IN UINTN DataSize, IN VOID *Data ) @@ -102,7 +102,7 @@ InternalVarCheckLoadOption ( /** Internal check for key option. - @param[in] VariablePropery Pointer to variable property. + @param[in] VariableProperty Pointer to variable property. @param[in] DataSize Data size. @param[in] Data Pointer to data buffer. @@ -113,7 +113,7 @@ InternalVarCheckLoadOption ( EFI_STATUS EFIAPI InternalVarCheckKeyOption ( - IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery, + IN VAR_CHECK_VARIABLE_PROPERTY *VariableProperty, IN UINTN DataSize, IN VOID *Data ) @@ -128,7 +128,7 @@ InternalVarCheckKeyOption ( /** Internal check for device path. - @param[in] VariablePropery Pointer to variable property. + @param[in] VariableProperty Pointer to variable property. @param[in] DataSize Data size. @param[in] Data Pointer to data buffer. @@ -139,7 +139,7 @@ InternalVarCheckKeyOption ( EFI_STATUS EFIAPI InternalVarCheckDevicePath ( - IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery, + IN VAR_CHECK_VARIABLE_PROPERTY *VariableProperty, IN UINTN DataSize, IN VOID *Data ) @@ -154,7 +154,7 @@ InternalVarCheckDevicePath ( /** Internal check for ASCII string. - @param[in] VariablePropery Pointer to variable property. + @param[in] VariableProperty Pointer to variable property. @param[in] DataSize Data size. @param[in] Data Pointer to data buffer. @@ -165,7 +165,7 @@ InternalVarCheckDevicePath ( EFI_STATUS EFIAPI InternalVarCheckAsciiString ( - IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery, + IN VAR_CHECK_VARIABLE_PROPERTY *VariableProperty, IN UINTN DataSize, IN VOID *Data ) @@ -191,7 +191,7 @@ InternalVarCheckAsciiString ( /** Internal check for size array. - @param[in] VariablePropery Pointer to variable property. + @param[in] VariableProperty Pointer to variable property. @param[in] DataSize Data size. @param[in] Data Pointer to data buffer. @@ -202,12 +202,12 @@ InternalVarCheckAsciiString ( EFI_STATUS EFIAPI InternalVarCheckSizeArray ( - IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery, + IN VAR_CHECK_VARIABLE_PROPERTY *VariableProperty, IN UINTN DataSize, IN VOID *Data ) { - if ((DataSize % VariablePropery->MinSize) != 0) { + if ((DataSize % VariableProperty->MinSize) != 0) { return EFI_INVALID_PARAMETER; } From d3dee93960cca4c4f0ccbe295606d91dabeb2332 Mon Sep 17 00:00:00 2001 From: Qihang Gao Date: Thu, 22 Jan 2026 16:20:41 +0800 Subject: [PATCH 1084/1172] MdePkg: Fix property typos in MdePkg The word property is misspelled as propery, so fix it. Signed-off-by: Qihang Gao --- MdePkg/Include/Library/DebugLib.h | 50 +++++++++---------- MdePkg/Include/Library/PostCodeLib.h | 12 ++--- MdePkg/Include/Library/ReportStatusCodeLib.h | 26 +++++----- MdePkg/Include/Library/UefiLib.h | 2 +- MdePkg/Library/BaseDebugLibNull/DebugLib.c | 28 +++++------ .../Library/BaseDebugLibSerialPort/DebugLib.c | 28 +++++------ .../Library/BasePostCodeLibDebug/PostCode.c | 8 +-- .../Library/BasePostCodeLibPort80/PostCode.c | 8 +-- .../BaseReportStatusCodeLib.c | 18 +++---- .../DxeRuntimeDebugLibSerialPort/DebugLib.c | 28 +++++------ .../PostCode.c | 8 +-- MdePkg/Library/UefiDebugLibConOut/DebugLib.c | 28 +++++------ 12 files changed, 122 insertions(+), 122 deletions(-) diff --git a/MdePkg/Include/Library/DebugLib.h b/MdePkg/Include/Library/DebugLib.h index 915844b78be5..ec1ddd4b4829 100644 --- a/MdePkg/Include/Library/DebugLib.h +++ b/MdePkg/Include/Library/DebugLib.h @@ -193,8 +193,8 @@ DebugBPrint ( Print a message of the form "ASSERT (): \n" to the debug output device. If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of - PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if - DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then + PcdDebugPropertyMask is set then CpuBreakpoint() is called. Otherwise, if + DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugPropertyMask is set then CpuDeadLoop() is called. If neither of these bits are set, then this function returns immediately after the message is printed to the debug output device. DebugAssert() must actively prevent recursion. If DebugAssert() is called while @@ -242,10 +242,10 @@ DebugClearMemory ( Returns TRUE if ASSERT() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of - PcdDebugProperyMask is set. Otherwise, FALSE is returned. + PcdDebugPropertyMask is set. Otherwise, FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -258,10 +258,10 @@ DebugAssertEnabled ( Returns TRUE if DEBUG() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of - PcdDebugProperyMask is set. Otherwise, FALSE is returned. + PcdDebugPropertyMask is set. Otherwise, FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -274,10 +274,10 @@ DebugPrintEnabled ( Returns TRUE if DEBUG_CODE() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdDebugProperyMask is set. Otherwise, FALSE is returned. + PcdDebugPropertyMask is set. Otherwise, FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -290,10 +290,10 @@ DebugCodeEnabled ( Returns TRUE if DEBUG_CLEAR_MEMORY() macro is enabled. This function returns TRUE if the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of - PcdDebugProperyMask is set. Otherwise, FALSE is returned. + PcdDebugPropertyMask is set. Otherwise, FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -392,7 +392,7 @@ UnitTestDebugAssert ( Macro that calls DebugAssert() if an expression evaluates to FALSE. If MDEPKG_NDEBUG is not defined and the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED - bit of PcdDebugProperyMask is set, then this macro evaluates the Boolean + bit of PcdDebugPropertyMask is set, then this macro evaluates the Boolean expression specified by Expression. If Expression evaluates to FALSE, then DebugAssert() is called passing in the source filename, source line number, and Expression. @@ -423,7 +423,7 @@ UnitTestDebugAssert ( Macro that calls DebugPrint(). If MDEPKG_NDEBUG is not defined and the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED - bit of PcdDebugProperyMask is set, then this macro passes Expression to + bit of PcdDebugPropertyMask is set, then this macro passes Expression to DebugPrint(). @param Expression Expression containing an error level, a format string, @@ -451,7 +451,7 @@ UnitTestDebugAssert ( Macro that calls DebugAssert() if an EFI_STATUS evaluates to an error code. If MDEPKG_NDEBUG is not defined and the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED - bit of PcdDebugProperyMask is set, then this macro evaluates the EFI_STATUS + bit of PcdDebugPropertyMask is set, then this macro evaluates the EFI_STATUS value specified by StatusParameter. If StatusParameter is an error code, then DebugAssert() is called passing in the source filename, source line number, and StatusParameter. @@ -482,7 +482,7 @@ UnitTestDebugAssert ( Macro that calls DebugAssert() if a RETURN_STATUS evaluates to an error code. If MDEPKG_NDEBUG is not defined and the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED - bit of PcdDebugProperyMask is set, then this macro evaluates the + bit of PcdDebugPropertyMask is set, then this macro evaluates the RETURN_STATUS value specified by StatusParameter. If StatusParameter is an error code, then DebugAssert() is called passing in the source filename, source line number, and StatusParameter. @@ -515,7 +515,7 @@ UnitTestDebugAssert ( handle database. If MDEPKG_NDEBUG is defined or the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit - of PcdDebugProperyMask is clear, then return. + of PcdDebugPropertyMask is clear, then return. If Handle is NULL, then a check is made to see if the protocol specified by Guid is present on any handle in the handle database. If Handle is not NULL, then @@ -556,7 +556,7 @@ UnitTestDebugAssert ( /** Macro that marks the beginning of debug source code. - If the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set, + If the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugPropertyMask is set, then this macro marks the beginning of source code that is included in a module. Otherwise, the source lines between DEBUG_CODE_BEGIN() and DEBUG_CODE_END() are not included in a module. @@ -570,7 +570,7 @@ UnitTestDebugAssert ( /** The macro that marks the end of debug source code. - If the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set, + If the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugPropertyMask is set, then this macro marks the end of source code that is included in a module. Otherwise, the source lines between DEBUG_CODE_BEGIN() and DEBUG_CODE_END() are not included in a module. @@ -583,7 +583,7 @@ UnitTestDebugAssert ( /** The macro that declares a section of debug source code. - If the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set, + If the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugPropertyMask is set, then the source code specified by Expression is included in a module. Otherwise, the source specified by Expression is not included in a module. @@ -596,7 +596,7 @@ UnitTestDebugAssert ( /** The macro that calls DebugClearMemory() to clear a buffer to a default value. - If the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set, + If the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugPropertyMask is set, then this macro calls DebugClearMemory() passing in Address and Length. @param Address The pointer to a buffer. @@ -619,7 +619,7 @@ UnitTestDebugAssert ( public data structure to retrieve a pointer to the private data structure. If MDEPKG_NDEBUG is defined or the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit - of PcdDebugProperyMask is clear, then this macro computes the offset, in bytes, + of PcdDebugPropertyMask is clear, then this macro computes the offset, in bytes, of the field specified by Field from the beginning of the data structure specified by TYPE. This offset is subtracted from Record, and is used to compute a pointer to a data structure of the type specified by TYPE. The Signature field of the @@ -629,7 +629,7 @@ UnitTestDebugAssert ( signify that the passed in data structure is invalid. If MDEPKG_NDEBUG is not defined and the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit - of PcdDebugProperyMask is set, then this macro computes the offset, in bytes, + of PcdDebugPropertyMask is set, then this macro computes the offset, in bytes, of field specified by Field from the beginning of the data structure specified by TYPE. This offset is subtracted from Record, and is used to compute a pointer to a data structure of the type specified by TYPE. The Signature field of the diff --git a/MdePkg/Include/Library/PostCodeLib.h b/MdePkg/Include/Library/PostCodeLib.h index 80628d7999ab..5fd6ab3b3667 100644 --- a/MdePkg/Include/Library/PostCodeLib.h +++ b/MdePkg/Include/Library/PostCodeLib.h @@ -74,9 +74,9 @@ PostCodeWithDescription ( bit of PcdPostCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The POST_CODE_PROPERTY_POST_CODE_ENABLED bit of - PcdPostCodeProperyMask is set. + PcdPostCodePropertyMask is set. @retval FALSE The POST_CODE_PROPERTY_POST_CODE_ENABLED bit of - PcdPostCodeProperyMask is clear. + PcdPostCodePropertyMask is clear. **/ BOOLEAN @@ -92,9 +92,9 @@ PostCodeEnabled ( bit of PcdPostCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The POST_CODE_PROPERTY_POST_CODE_DESCRIPTION_ENABLED bit of - PcdPostCodeProperyMask is set. + PcdPostCodePropertyMask is set. @retval FALSE The POST_CODE_PROPERTY_POST_CODE_DESCRIPTION_ENABLED bit of - PcdPostCodeProperyMask is clear. + PcdPostCodePropertyMask is clear. **/ BOOLEAN @@ -106,7 +106,7 @@ PostCodeDescriptionEnabled ( /** Sends a 32-bit value to a POST card. - If POST codes are enabled in PcdPostCodeProperyMask, then call PostCode() + If POST codes are enabled in PcdPostCodePropertyMask, then call PostCode() passing in Value. Value is returned. @param Value The 32-bit value to write to the POST card. @@ -120,7 +120,7 @@ PostCodeDescriptionEnabled ( Sends a 32-bit value to a POST and associated ASCII string. If POST codes and POST code descriptions are enabled in - PcdPostCodeProperyMask, then call PostCodeWithDescription() passing in + PcdPostCodePropertyMask, then call PostCodeWithDescription() passing in Value and Description. If only POST codes are enabled, then call PostCode() passing in Value. Value is returned. diff --git a/MdePkg/Include/Library/ReportStatusCodeLib.h b/MdePkg/Include/Library/ReportStatusCodeLib.h index 3763e69928eb..3268e07aa693 100644 --- a/MdePkg/Include/Library/ReportStatusCodeLib.h +++ b/MdePkg/Include/Library/ReportStatusCodeLib.h @@ -298,12 +298,12 @@ ReportStatusCodeEx ( Returns TRUE if status codes of type EFI_PROGRESS_CODE are enabled This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED - bit of PcdReportStatusCodeProperyMask is set. Otherwise FALSE is returned. + bit of PcdReportStatusCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is set. + PcdReportStatusCodePropertyMask is set. @retval FALSE The REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is clear. + PcdReportStatusCodePropertyMask is clear. **/ BOOLEAN @@ -316,12 +316,12 @@ ReportProgressCodeEnabled ( Returns TRUE if status codes of type EFI_ERROR_CODE are enabled This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED - bit of PcdReportStatusCodeProperyMask is set. Otherwise, FALSE is returned. + bit of PcdReportStatusCodePropertyMask is set. Otherwise, FALSE is returned. @retval TRUE The REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is set. + PcdReportStatusCodePropertyMask is set. @retval FALSE The REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is clear. + PcdReportStatusCodePropertyMask is clear. **/ BOOLEAN @@ -334,12 +334,12 @@ ReportErrorCodeEnabled ( Returns TRUE if status codes of type EFI_DEBUG_CODE are enabled This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED - bit of PcdReportStatusCodeProperyMask is set. Otherwise FALSE is returned. + bit of PcdReportStatusCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is set. + PcdReportStatusCodePropertyMask is set. @retval FALSE The REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is clear. + PcdReportStatusCodePropertyMask is clear. **/ BOOLEAN @@ -352,7 +352,7 @@ ReportDebugCodeEnabled ( Reports a status code with minimal parameters if the status code type is enabled. If the status code type specified by Type is enabled in - PcdReportStatusCodeProperyMask, then call ReportStatusCode() passing in Type + PcdReportStatusCodePropertyMask, then call ReportStatusCode() passing in Type and Value. @param Type The status code type. @@ -377,7 +377,7 @@ ReportDebugCodeEnabled ( status code type is enabled. If the status code type specified by Type is enabled in - PcdReportStatusCodeProperyMask, then call ReportStatusCodeWithDevicePath() + PcdReportStatusCodePropertyMask, then call ReportStatusCodeWithDevicePath() passing in Type, Value, and DevicePath. @param Type The status code type. @@ -407,7 +407,7 @@ ReportDebugCodeEnabled ( is enabled. If the status code type specified by Type is enabled in - PcdReportStatusCodeProperyMask, then call ReportStatusCodeWithExtendedData() + PcdReportStatusCodePropertyMask, then call ReportStatusCodeWithExtendedData() passing in Type, Value, ExtendedData, and ExtendedDataSize. @param Type The status code type. @@ -438,7 +438,7 @@ ReportDebugCodeEnabled ( Reports a status code specifying all parameters if the status code type is enabled. If the status code type specified by Type is enabled in - PcdReportStatusCodeProperyMask, then call ReportStatusCodeEx() passing in Type, + PcdReportStatusCodePropertyMask, then call ReportStatusCodeEx() passing in Type, Value, Instance, CallerId, ExtendedDataGuid, ExtendedData, and ExtendedDataSize. @param Type The status code type. diff --git a/MdePkg/Include/Library/UefiLib.h b/MdePkg/Include/Library/UefiLib.h index be7da7fdf7da..450d76651386 100644 --- a/MdePkg/Include/Library/UefiLib.h +++ b/MdePkg/Include/Library/UefiLib.h @@ -317,7 +317,7 @@ EfiInitializeLock ( Macro that calls DebugAssert() if an EFI_LOCK structure is not in the locked state. If MDEPKG_NDEBUG is not defined and the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED - bit of PcdDebugProperyMask is set, then this macro evaluates the EFI_LOCK + bit of PcdDebugPropertyMask is set, then this macro evaluates the EFI_LOCK structure specified by Lock. If Lock is not in the locked state, then DebugAssert() is called passing in the source filename, source line number, and Lock. diff --git a/MdePkg/Library/BaseDebugLibNull/DebugLib.c b/MdePkg/Library/BaseDebugLibNull/DebugLib.c index e01a09578149..922857904d59 100644 --- a/MdePkg/Library/BaseDebugLibNull/DebugLib.c +++ b/MdePkg/Library/BaseDebugLibNull/DebugLib.c @@ -92,8 +92,8 @@ DebugBPrint ( Print a message of the form "ASSERT (): \n" to the debug output device. If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of - PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if - DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then + PcdDebugPropertyMask is set then CpuBreakpoint() is called. Otherwise, if + DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugPropertyMask is set then CpuDeadLoop() is called. If neither of these bits are set, then this function returns immediately after the message is printed to the debug output device. DebugAssert() must actively prevent recursion. If DebugAssert() is called while @@ -146,10 +146,10 @@ DebugClearMemory ( Returns TRUE if ASSERT() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -165,10 +165,10 @@ DebugAssertEnabled ( Returns TRUE if DEBUG() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -184,10 +184,10 @@ DebugPrintEnabled ( Returns TRUE if DEBUG_CODE() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -203,10 +203,10 @@ DebugCodeEnabled ( Returns TRUE if DEBUG_CLEAR_MEMORY() macro is enabled. This function returns TRUE if the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN diff --git a/MdePkg/Library/BaseDebugLibSerialPort/DebugLib.c b/MdePkg/Library/BaseDebugLibSerialPort/DebugLib.c index bd5686947712..695d965ebc2c 100644 --- a/MdePkg/Library/BaseDebugLibSerialPort/DebugLib.c +++ b/MdePkg/Library/BaseDebugLibSerialPort/DebugLib.c @@ -191,8 +191,8 @@ DebugBPrint ( Print a message of the form "ASSERT (): \n" to the debug output device. If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of - PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if - DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then + PcdDebugPropertyMask is set then CpuBreakpoint() is called. Otherwise, if + DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugPropertyMask is set then CpuDeadLoop() is called. If neither of these bits are set, then this function returns immediately after the message is printed to the debug output device. DebugAssert() must actively prevent recursion. If DebugAssert() is called while @@ -273,10 +273,10 @@ DebugClearMemory ( Returns TRUE if ASSERT() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -292,10 +292,10 @@ DebugAssertEnabled ( Returns TRUE if DEBUG() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -311,10 +311,10 @@ DebugPrintEnabled ( Returns TRUE if DEBUG_CODE() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -330,10 +330,10 @@ DebugCodeEnabled ( Returns TRUE if DEBUG_CLEAR_MEMORY() macro is enabled. This function returns TRUE if the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN diff --git a/MdePkg/Library/BasePostCodeLibDebug/PostCode.c b/MdePkg/Library/BasePostCodeLibDebug/PostCode.c index 57a3bd6bffdc..cf6b9cecb6cf 100644 --- a/MdePkg/Library/BasePostCodeLibDebug/PostCode.c +++ b/MdePkg/Library/BasePostCodeLibDebug/PostCode.c @@ -82,9 +82,9 @@ PostCodeWithDescription ( bit of PcdPostCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The POST_CODE_PROPERTY_POST_CODE_ENABLED bit of - PcdPostCodeProperyMask is set. + PcdPostCodePropertyMask is set. @retval FALSE The POST_CODE_PROPERTY_POST_CODE_ENABLED bit of - PcdPostCodeProperyMask is clear. + PcdPostCodePropertyMask is clear. **/ BOOLEAN @@ -103,9 +103,9 @@ PostCodeEnabled ( bit of PcdPostCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The POST_CODE_PROPERTY_POST_CODE_DESCRIPTION_ENABLED bit of - PcdPostCodeProperyMask is set. + PcdPostCodePropertyMask is set. @retval FALSE The POST_CODE_PROPERTY_POST_CODE_DESCRIPTION_ENABLED bit of - PcdPostCodeProperyMask is clear. + PcdPostCodePropertyMask is clear. **/ BOOLEAN diff --git a/MdePkg/Library/BasePostCodeLibPort80/PostCode.c b/MdePkg/Library/BasePostCodeLibPort80/PostCode.c index 306906a7504e..11b1875e3b84 100644 --- a/MdePkg/Library/BasePostCodeLibPort80/PostCode.c +++ b/MdePkg/Library/BasePostCodeLibPort80/PostCode.c @@ -100,9 +100,9 @@ PostCodeWithDescription ( bit of PcdPostCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The POST_CODE_PROPERTY_POST_CODE_ENABLED bit of - PcdPostCodeProperyMask is set. + PcdPostCodePropertyMask is set. @retval FALSE The POST_CODE_PROPERTY_POST_CODE_ENABLED bit of - PcdPostCodeProperyMask is clear. + PcdPostCodePropertyMask is clear. **/ BOOLEAN @@ -121,9 +121,9 @@ PostCodeEnabled ( bit of PcdPostCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The POST_CODE_PROPERTY_POST_CODE_DESCRIPTION_ENABLED bit of - PcdPostCodeProperyMask is set. + PcdPostCodePropertyMask is set. @retval FALSE The POST_CODE_PROPERTY_POST_CODE_DESCRIPTION_ENABLED bit of - PcdPostCodeProperyMask is clear. + PcdPostCodePropertyMask is clear. **/ BOOLEAN diff --git a/MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLib.c b/MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLib.c index a1506a73e36e..d1d37097af99 100644 --- a/MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLib.c +++ b/MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLib.c @@ -316,12 +316,12 @@ ReportStatusCodeEx ( Returns TRUE if status codes of type EFI_PROGRESS_CODE are enabled This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED - bit of PcdReportStatusCodeProperyMask is set. Otherwise FALSE is returned. + bit of PcdReportStatusCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is set. + PcdReportStatusCodePropertyMask is set. @retval FALSE The REPORT_STATUS_CODE_PROPERTY_PROGRESS_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is clear. + PcdReportStatusCodePropertyMask is clear. **/ BOOLEAN @@ -337,12 +337,12 @@ ReportProgressCodeEnabled ( Returns TRUE if status codes of type EFI_ERROR_CODE are enabled This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED - bit of PcdReportStatusCodeProperyMask is set. Otherwise FALSE is returned. + bit of PcdReportStatusCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is set. + PcdReportStatusCodePropertyMask is set. @retval FALSE The REPORT_STATUS_CODE_PROPERTY_ERROR_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is clear. + PcdReportStatusCodePropertyMask is clear. **/ BOOLEAN @@ -358,12 +358,12 @@ ReportErrorCodeEnabled ( Returns TRUE if status codes of type EFI_DEBUG_CODE are enabled This function returns TRUE if the REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED - bit of PcdReportStatusCodeProperyMask is set. Otherwise FALSE is returned. + bit of PcdReportStatusCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is set. + PcdReportStatusCodePropertyMask is set. @retval FALSE The REPORT_STATUS_CODE_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdReportStatusCodeProperyMask is clear. + PcdReportStatusCodePropertyMask is clear. **/ BOOLEAN diff --git a/MdePkg/Library/DxeRuntimeDebugLibSerialPort/DebugLib.c b/MdePkg/Library/DxeRuntimeDebugLibSerialPort/DebugLib.c index 11d188d07ff6..a5a73cb30fb7 100644 --- a/MdePkg/Library/DxeRuntimeDebugLibSerialPort/DebugLib.c +++ b/MdePkg/Library/DxeRuntimeDebugLibSerialPort/DebugLib.c @@ -254,8 +254,8 @@ DebugBPrint ( Print a message of the form "ASSERT (): \n" to the debug output device. If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of - PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if - DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then + PcdDebugPropertyMask is set then CpuBreakpoint() is called. Otherwise, if + DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugPropertyMask is set then CpuDeadLoop() is called. If neither of these bits are set, then this function returns immediately after the message is printed to the debug output device. DebugAssert() must actively prevent recursion. If DebugAssert() is called while @@ -346,10 +346,10 @@ DebugClearMemory ( Returns TRUE if ASSERT() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -365,10 +365,10 @@ DebugAssertEnabled ( Returns TRUE if DEBUG() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -384,10 +384,10 @@ DebugPrintEnabled ( Returns TRUE if DEBUG_CODE() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -403,10 +403,10 @@ DebugCodeEnabled ( Returns TRUE if DEBUG_CLEAR_MEMORY() macro is enabled. This function returns TRUE if the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN diff --git a/MdePkg/Library/PeiDxePostCodeLibReportStatusCode/PostCode.c b/MdePkg/Library/PeiDxePostCodeLibReportStatusCode/PostCode.c index de57c885794e..cd81ce99e64d 100644 --- a/MdePkg/Library/PeiDxePostCodeLibReportStatusCode/PostCode.c +++ b/MdePkg/Library/PeiDxePostCodeLibReportStatusCode/PostCode.c @@ -112,9 +112,9 @@ PostCodeWithDescription ( bit of PcdPostCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The POST_CODE_PROPERTY_POST_CODE_ENABLED bit of - PcdPostCodeProperyMask is set. + PcdPostCodePropertyMask is set. @retval FALSE The POST_CODE_PROPERTY_POST_CODE_ENABLED bit of - PcdPostCodeProperyMask is clear. + PcdPostCodePropertyMask is clear. **/ BOOLEAN @@ -133,9 +133,9 @@ PostCodeEnabled ( bit of PcdPostCodePropertyMask is set. Otherwise FALSE is returned. @retval TRUE The POST_CODE_PROPERTY_POST_CODE_DESCRIPTION_ENABLED bit of - PcdPostCodeProperyMask is set. + PcdPostCodePropertyMask is set. @retval FALSE The POST_CODE_PROPERTY_POST_CODE_DESCRIPTION_ENABLED bit of - PcdPostCodeProperyMask is clear. + PcdPostCodePropertyMask is clear. **/ BOOLEAN diff --git a/MdePkg/Library/UefiDebugLibConOut/DebugLib.c b/MdePkg/Library/UefiDebugLibConOut/DebugLib.c index 65c8dc2b4654..8f49da220b84 100644 --- a/MdePkg/Library/UefiDebugLibConOut/DebugLib.c +++ b/MdePkg/Library/UefiDebugLibConOut/DebugLib.c @@ -177,8 +177,8 @@ DebugBPrint ( Print a message of the form "ASSERT (): \n" to the debug output device. If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of - PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if - DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then + PcdDebugPropertyMask is set then CpuBreakpoint() is called. Otherwise, if + DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugPropertyMask is set then CpuDeadLoop() is called. If neither of these bits are set, then this function returns immediately after the message is printed to the debug output device. DebugAssert() must actively prevent recursion. If DebugAssert() is called while @@ -273,10 +273,10 @@ DebugClearMemory ( Returns TRUE if ASSERT() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -292,10 +292,10 @@ DebugAssertEnabled ( Returns TRUE if DEBUG() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -311,10 +311,10 @@ DebugPrintEnabled ( Returns TRUE if DEBUG_CODE() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -330,10 +330,10 @@ DebugCodeEnabled ( Returns TRUE if DEBUG_CLEAR_MEMORY() macro is enabled. This function returns TRUE if the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN From f840501d1f861eab87d95779893f412dcf40fc62 Mon Sep 17 00:00:00 2001 From: Qihang Gao Date: Thu, 22 Jan 2026 16:23:15 +0800 Subject: [PATCH 1085/1172] OvmfPkg: Fix property typos in OvmfPkg The word property is misspelled as propery, so fix it. Signed-off-by: Qihang Gao --- .../Library/PlatformDebugLibIoPort/DebugLib.c | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c index f07e994e6017..91f92cff04b7 100644 --- a/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c +++ b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c @@ -187,8 +187,8 @@ DebugBPrint ( Print a message of the form "ASSERT (): \n" to the debug output device. If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of - PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if - DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then + PcdDebugPropertyMask is set then CpuBreakpoint() is called. Otherwise, if + DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugPropertyMask is set then CpuDeadLoop() is called. If neither of these bits are set, then this function returns immediately after the message is printed to the debug output device. DebugAssert() must actively prevent recursion. If DebugAssert() is called while @@ -286,10 +286,10 @@ DebugClearMemory ( Returns TRUE if ASSERT() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -305,10 +305,10 @@ DebugAssertEnabled ( Returns TRUE if DEBUG() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -324,10 +324,10 @@ DebugPrintEnabled ( Returns TRUE if DEBUG_CODE() macros are enabled. This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN @@ -343,10 +343,10 @@ DebugCodeEnabled ( Returns TRUE if DEBUG_CLEAR_MEMORY() macro is enabled. This function returns TRUE if the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of - PcdDebugProperyMask is set. Otherwise FALSE is returned. + PcdDebugPropertyMask is set. Otherwise FALSE is returned. - @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set. - @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is clear. + @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugPropertyMask is set. + @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugPropertyMask is clear. **/ BOOLEAN From c204f5402ea545074d7ac810b85a21225c2cf54c Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Fri, 16 Jan 2026 09:09:41 +0000 Subject: [PATCH 1086/1172] DynamicTablesPkg: Adds API to create method with Notify support Adds APIs to create AML methods with Notify support in the AmlLib library. New API takes additional parameters for Notify type and Notify value. Notify type can be one of NameString, Local or Arg. Notification value is an integer representing the Notify value. Ref: ACPI spec 6.5 section 19.6.94 Notify (Notify Object of Event) Signed-off-by: Abdul Lateef Attar --- .../Include/Library/AmlLib/AmlLib.h | 82 +++- .../Common/AmlLib/CodeGen/AmlCodeGen.c | 401 +++++++++++++++++- 2 files changed, 481 insertions(+), 2 deletions(-) diff --git a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h index a96614898b58..7e96754e5bb0 100644 --- a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h +++ b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h @@ -2,7 +2,7 @@ AML Lib. Copyright (c) 2019 - 2023, Arm Limited. All rights reserved.
    - Copyright (C) 2023 - 2025, Advanced Micro Devices, Inc. All rights reserved.
    + Copyright (C) 2023 - 2026, Advanced Micro Devices, Inc. All rights reserved.
    SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -151,6 +151,17 @@ typedef struct { UINTN DataSize; } AML_METHOD_PARAM; +/** structure to hold Notify method parameter types. + NotifyObject - Notify Object parameter. + Only NameString, Local and Arg types are supported. + NotifyValue - Notify Value parameter. + Must be an integer value. +**/ +typedef struct { + AML_METHOD_PARAM NotifyObject; + UINT8 NotifyValue; +} AML_NOTIFY_PARAM; + /** Parse the definition block. The function parses the whole AML blob. It starts with the ACPI DSDT/SSDT @@ -2224,4 +2235,73 @@ AmlCodeGenRdUartSerialBusV2 ( OUT AML_DATA_NODE_HANDLE *NewRdNode OPTIONAL ); +/** AML code generation to create a method with Notify call. + + Example 1: + AmlCodeGenMethodNotifyList ("_L01", FALSE, 0, 0, NULL, ParentNode, NewObjectNode); + is equivalent to the following ASL code: + Method (_L01, 0, NotSerialize) + { + } + + Example 2: + AML_METHOD_PARAM Notify[2]; + Notify[0].NotifyObject.Type = AmlMethodParamTypeString; + Notify[0].NotifyObject.Data.Buffer = (VOID*)"XCD0"; + Notify[0].NotifyObject.DataSize = 4; + Notify[0].NotifyValue = 2; + Notify[1].NotifyObject.Type = AmlMethodParamTypeString; + Notify[1].NotifyObject.Data.Buffer = (VOID*)"XCD1"; + Notify[1].NotifyObject.DataSize = 4; + Notify[1].NotifyValue = 2; + AmlCodeGenMethodNotifyList ("_L02", FALSE, 0, 2, Notify, ParentNode, NewObjectNode); + + is equivalent to the following ASL code: + Method (_L02, 0, NotSerialize) + { + Notify ("XCD0", 2) + Notify ("XCD1", 2) + } + + Ref : ACPI 6.6, s19.6.95 Notify (Notify Object of Event): + Object must be a reference to a device, processor, or thermal zone object. + + Note: + This code cannot validate whether the referenced object is a valid device, + processor, or thermal zone object. + It assumes that NameString, Local, and Arg objects reference valid device, + processor, or thermal zone objects. + + @param [in] MethodNameString The new Method's name. + Must be a NULL-terminated ASL NameString + e.g.: "MET0", "_SB.MET0", etc. + The input string is copied. + @param [in] IsSerialized TRUE is equivalent to Serialized. + FALSE is equivalent to NotSerialized. + Default is NotSerialized in ASL spec. + @param [in] SyncLevel Synchronization level for the method. + Must be 0 <= SyncLevel <= 15. + Default is 0 in ASL. + @param [in] NotifyParamCount Number of Notify parameters + @param [in] NotifyParameters Array of Notify parameters + @param [in] ParentNode If provided, set ParentNode as the parent + of the node created. + @param [out] NewObjectNode If success, contains the created node. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. +**/ +EFI_STATUS +EFIAPI +AmlCodeGenMethodNotifyList ( + IN CONST CHAR8 *MethodNameString, + IN BOOLEAN IsSerialized, + IN UINT8 SyncLevel, + IN UINT32 NotifyParamCount, + IN AML_NOTIFY_PARAM *NotifyParameters OPTIONAL, + IN AML_NODE_HANDLE ParentNode OPTIONAL, + OUT AML_OBJECT_NODE_HANDLE *NewObjectNode OPTIONAL + ); + #endif // AML_LIB_H_ diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c index bc44ea2936fe..1c57681062f9 100644 --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c @@ -2,7 +2,7 @@ AML Code Generation. Copyright (c) 2020 - 2023, Arm Limited. All rights reserved.
    - Copyright (C) 2023 - 2025, Advanced Micro Devices, Inc. All rights reserved.
    + Copyright (C) 2023 - 2026, Advanced Micro Devices, Inc. All rights reserved.
    SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -5088,3 +5088,402 @@ AmlCreatePssNode ( return Status; } + +/** + Create a Notify object node. + + Creates and optionally adds the following node: + Notify (NameString, Value) + Notify (Local, Value) + Notify (Arg, Value) + + Ref : ACPI 6.6, s19.6.95 Notify (Notify Object of Event): + Object must be a reference to a device, processor, or thermal zone object. + + Note: + This code cannot validate whether the referenced object is a valid device, + processor, or thermal zone object. + It assumes that NameString, Local, and Arg objects reference valid device, + processor, or thermal zone objects. + + @param [in] NotifyObjectNode Object node be notified + @param [in] ValueObjectNode Notify value object. + @param [in] ParentNode If provided, set ParentNode as the parent + of the node created. + @param [out] NewObjectNode If success and provided, contains the created + node. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. +**/ +STATIC +EFI_STATUS +EFIAPI +AmlCodeGenNotifyNode ( + IN AML_NODE_HEADER *NotifyObjectNode, + IN AML_NODE_HEADER *ValueObjectNode, + IN AML_NODE_HEADER *ParentNode OPTIONAL, + OUT AML_OBJECT_NODE **NewObjectNode OPTIONAL + ) +{ + AML_OBJECT_NODE *ObjectNode; + EFI_STATUS Status; + + if ((NotifyObjectNode == NULL) || (ValueObjectNode == NULL) || + ((ParentNode == NULL) && (NewObjectNode == NULL))) + { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + if ((ParentNode != NULL) && + !AmlNodeCompareOpCode ( + (AML_OBJECT_NODE *)ParentNode, + AML_METHOD_OP, + 0 + )) + { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + ObjectNode = NULL; + Status = AmlCreateObjectNode ( + AmlGetByteEncodingByOpCode (AML_NOTIFY_OP, 0), + 0, + &ObjectNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + Status = AmlSetFixedArgument ( + ObjectNode, + EAmlParseIndexTerm0, + NotifyObjectNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status = AmlSetFixedArgument ( + ObjectNode, + EAmlParseIndexTerm1, + ValueObjectNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + Status = LinkNode ( + (AML_OBJECT_NODE_HANDLE)ObjectNode, + ParentNode, + (AML_OBJECT_NODE_HANDLE *)NewObjectNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + return Status; + +error_handler: + if (ObjectNode != NULL) { + AmlDeleteTree ((AML_NODE_HEADER *)ObjectNode); + } + + return Status; +} + +/** + Create a Notify object node from Notify parameters. + + Creates and optionally adds the following node: + Notify (NameString, Value) + Notify (Local, Value) + Notify (Arg, Value) + + Ref : ACPI 6.6, s19.6.95 Notify (Notify Object of Event): + Object must be a reference to a device, processor, or thermal zone object. + + Note: + This code cannot validate whether the referenced object is a valid device, + processor, or thermal zone object. + It assumes that NameString, Local, and Arg objects reference valid device, + processor, or thermal zone objects. + + @param [in] NotifyObject Object to be notified. + @param [in] NotifyValue Notification value. + @param [in] ParentNode If provided, set ParentNode as the parent + of the node created. + @param [out] NewObjectNode If success and provided, contains the created + node. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. +**/ +STATIC +EFI_STATUS +EFIAPI +AmlCodeGenNotify ( + IN AML_METHOD_PARAM NotifyObject, + IN UINT8 NotifyValue, + IN AML_NODE_HEADER *ParentNode OPTIONAL, + OUT AML_OBJECT_NODE **NewObjectNode OPTIONAL + ) +{ + AML_OBJECT_NODE *NotifyObjectNode; + AML_OBJECT_NODE *ValueObjectNode; + EFI_STATUS Status; + + if ((ParentNode == NULL) && (NewObjectNode == NULL)) { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + if ((NotifyObject.Type != AmlMethodParamTypeString) && + (NotifyObject.Type != AmlMethodParamTypeArg) && + (NotifyObject.Type != AmlMethodParamTypeLocal)) + { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + ValueObjectNode = NULL; + NotifyObjectNode = NULL; + + switch (NotifyObject.Type) { + case AmlMethodParamTypeString: + if (NotifyObject.Data.Buffer == NULL) { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + Status = EFI_INVALID_PARAMETER; + goto exit_handler; + } + + Status = AmlCodeGenString ( + NotifyObject.Data.Buffer, + &NotifyObjectNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto exit_handler; + } + + break; + case AmlMethodParamTypeArg: + if (NotifyObject.Data.Arg > (UINT8)(AML_ARG6 - AML_ARG0)) { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + Status = EFI_INVALID_PARAMETER; + goto exit_handler; + } + + Status = AmlCreateObjectNode ( + AmlGetByteEncodingByOpCode ( + AML_ARG0 + NotifyObject.Data.Arg, + 0 + ), + 0, + &NotifyObjectNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto exit_handler; + } + + break; + case AmlMethodParamTypeLocal: + if (NotifyObject.Data.Local > (UINT8)(AML_LOCAL7 - AML_LOCAL0)) { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + Status = EFI_INVALID_PARAMETER; + goto exit_handler; + } + + Status = AmlCreateObjectNode ( + AmlGetByteEncodingByOpCode ( + AML_LOCAL0 + NotifyObject.Data.Local, + 0 + ), + 0, + &NotifyObjectNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto exit_handler; + } + + break; + default: + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + Status = EFI_INVALID_PARAMETER; + goto exit_handler; + } // switch + + Status = AmlCodeGenInteger ( + NotifyValue, + &ValueObjectNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto exit_handler; + } + + Status = AmlCodeGenNotifyNode ( + (AML_NODE_HEADER *)NotifyObjectNode, + (AML_NODE_HEADER *)ValueObjectNode, + ParentNode, + NewObjectNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto exit_handler; + } + + NotifyObjectNode = NULL; + ValueObjectNode = NULL; + +exit_handler: + + if (NotifyObjectNode != NULL) { + AmlDeleteTree ((AML_NODE_HEADER *)NotifyObjectNode); + } + + if (ValueObjectNode != NULL) { + AmlDeleteTree ((AML_NODE_HEADER *)ValueObjectNode); + } + + return Status; +} + +/** AML code generation to create a method with Notify call. + + Example 1: + AmlCodeGenMethodNotifyList ("_L01", FALSE, 0, 0, NULL, ParentNode, NewObjectNode); + is equivalent to the following ASL code: + Method (_L01, 0, NotSerialize) + { + } + + Example 2: + AML_METHOD_PARAM Notify[2]; + Notify[0].NotifyObject.Type = AmlMethodParamTypeString; + Notify[0].NotifyObject.Data.Buffer = (VOID*)"XCD0"; + Notify[0].NotifyObject.DataSize = 4; + Notify[0].NotifyValue = 2; + Notify[1].NotifyObject.Type = AmlMethodParamTypeString; + Notify[1].NotifyObject.Data.Buffer = (VOID*)"XCD1"; + Notify[1].NotifyObject.DataSize = 4; + Notify[1].NotifyValue = 2; + AmlCodeGenMethodNotifyList ("_L02", FALSE, 0, 2, Notify, ParentNode, NewObjectNode); + + is equivalent to the following ASL code: + Method (_L02, 0, NotSerialize) + { + Notify ("XCD0", 2) + Notify ("XCD1", 2) + } + + Ref : ACPI 6.6, s19.6.95 Notify (Notify Object of Event): + Object must be a reference to a device, processor, or thermal zone object. + + Note: + This code cannot validate whether the referenced object is a valid device, + processor, or thermal zone object. + It assumes that NameString, Local, and Arg objects reference valid device, + processor, or thermal zone objects. + + @param [in] MethodNameString The new Method's name. + Must be a NULL-terminated ASL NameString + e.g.: "MET0", "_SB.MET0", etc. + The input string is copied. + @param [in] IsSerialized TRUE is equivalent to Serialized. + FALSE is equivalent to NotSerialized. + Default is NotSerialized in ASL spec. + @param [in] SyncLevel Synchronization level for the method. + Must be 0 <= SyncLevel <= 15. + Default is 0 in ASL. + @param [in] NotifyParamCount Number of Notify parameters + @param [in] NotifyParameters Array of Notify parameters + @param [in] ParentNode If provided, set ParentNode as the parent + of the node created. + @param [out] NewObjectNode If success, contains the created node. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER Invalid parameter. + @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. +**/ +EFI_STATUS +EFIAPI +AmlCodeGenMethodNotifyList ( + IN CONST CHAR8 *MethodNameString, + IN BOOLEAN IsSerialized, + IN UINT8 SyncLevel, + IN UINT32 NotifyParamCount, + IN AML_NOTIFY_PARAM *NotifyParameters OPTIONAL, + IN AML_NODE_HANDLE ParentNode OPTIONAL, + OUT AML_OBJECT_NODE_HANDLE *NewObjectNode OPTIONAL + ) +{ + EFI_STATUS Status; + UINT32 Index; + AML_OBJECT_NODE_HANDLE MethodNode; + + if ((MethodNameString == NULL) || + ((ParentNode == NULL) && (NewObjectNode == NULL))) + { + ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; + } + + Status = AmlCodeGenMethod ( + MethodNameString, + 0, // NumArgs + IsSerialized, + SyncLevel, + NULL, + &MethodNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return Status; + } + + if ((NotifyParameters == NULL) || (NotifyParamCount == 0)) { + return EFI_SUCCESS; + } + + for (Index = 0; Index < NotifyParamCount; Index++) { + Status = AmlCodeGenNotify ( + NotifyParameters[Index].NotifyObject, + NotifyParameters[Index].NotifyValue, + (AML_NODE_HEADER *)MethodNode, + NULL + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + } + + Status = LinkNode ( + MethodNode, + ParentNode, + NewObjectNode + ); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + goto error_handler; + } + + return EFI_SUCCESS; +error_handler: + if (MethodNode != NULL) { + AmlDeleteTree ((AML_NODE_HANDLE)MethodNode); + } + + return Status; +} From 3d8fb11bc2229a603475775410b33618425ed7f1 Mon Sep 17 00:00:00 2001 From: Xiang W Date: Mon, 26 Jan 2026 15:02:21 +0800 Subject: [PATCH 1087/1172] UefiPayloadPkg: MkFitImage.py removes extra spaces The `fit` file generated by `MkFitImage.py` outputs a warning when processed by the dtc. This issue has be fixed. Signed-off-by: Xiang W --- UefiPayloadPkg/Tools/MkFitImage.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/UefiPayloadPkg/Tools/MkFitImage.py b/UefiPayloadPkg/Tools/MkFitImage.py index b76c2156dd18..a0f1e33c7986 100644 --- a/UefiPayloadPkg/Tools/MkFitImage.py +++ b/UefiPayloadPkg/Tools/MkFitImage.py @@ -63,7 +63,7 @@ def BuildFvImageNode(Fdt, InfoHeader, ParentNode, DataOffset, DataSize, Descript libfdt.fdt_setprop_u32(Fdt, ParentNode, 'data-size', DataSize) libfdt.fdt_setprop_u32(Fdt, ParentNode, 'data-offset', DataOffset) libfdt.fdt_setprop(Fdt, ParentNode, 'compression', bytes('none', 'utf-8'), len('none') + 1) - libfdt.fdt_setprop(Fdt, ParentNode, 'project ', bytes('tianocore', 'utf-8'), len('tianocore') + 1) + libfdt.fdt_setprop(Fdt, ParentNode, 'project', bytes('tianocore', 'utf-8'), len('tianocore') + 1) libfdt.fdt_setprop(Fdt, ParentNode, 'arch', bytes(Arch, 'utf-8'), len(Arch) + 1) libfdt.fdt_setprop(Fdt, ParentNode, 'type', bytes('flat-binary', 'utf-8'), len('flat-binary') + 1) libfdt.fdt_setprop(Fdt, ParentNode, 'description', bytes(Description, 'utf-8'), len(Description) + 1) @@ -84,16 +84,16 @@ def BuildTianoImageNode(Fdt, InfoHeader, ParentNode, DataOffset, DataSize, Descr if InfoHeader.DataOffset is not None: libfdt.fdt_setprop_u32(Fdt, ParentNode, 'data-offset', DataOffset) if InfoHeader.Producer is not None: - libfdt.fdt_setprop(Fdt, ParentNode, 'producer ', bytes(InfoHeader.Producer, 'utf-8'), len(InfoHeader.Producer) + 1) + libfdt.fdt_setprop(Fdt, ParentNode, 'producer', bytes(InfoHeader.Producer, 'utf-8'), len(InfoHeader.Producer) + 1) if InfoHeader.Capabilities is not None: CapStrs = ','.join(InfoHeader.Capabilities) - libfdt.fdt_setprop(Fdt, ParentNode, 'capabilities ', bytes(CapStrs, 'utf-8'), len(CapStrs) + 1) + libfdt.fdt_setprop(Fdt, ParentNode, 'capabilities', bytes(CapStrs, 'utf-8'), len(CapStrs) + 1) if InfoHeader.Type is not None: - libfdt.fdt_setprop(Fdt, ParentNode, 'type ', bytes(InfoHeader.Type, 'utf-8'), len(InfoHeader.Type) + 1) + libfdt.fdt_setprop(Fdt, ParentNode, 'type', bytes(InfoHeader.Type, 'utf-8'), len(InfoHeader.Type) + 1) if InfoHeader.Arch is not None: - libfdt.fdt_setprop(Fdt, ParentNode, 'arch ', bytes(InfoHeader.Arch, 'utf-8'), len(InfoHeader.Arch) + 1) + libfdt.fdt_setprop(Fdt, ParentNode, 'arch', bytes(InfoHeader.Arch, 'utf-8'), len(InfoHeader.Arch) + 1) if InfoHeader.Project is not None: - libfdt.fdt_setprop(Fdt, ParentNode, 'project ', bytes(InfoHeader.Project, 'utf-8'), len(InfoHeader.Project) + 1) + libfdt.fdt_setprop(Fdt, ParentNode, 'project', bytes(InfoHeader.Project, 'utf-8'), len(InfoHeader.Project) + 1) if InfoHeader.Description is not None: libfdt.fdt_setprop(Fdt, ParentNode, 'description', bytes(Description, 'utf-8'), len(Description) + 1) @@ -111,7 +111,7 @@ def BuildFitImage(Fdt, InfoHeader, Arch): # # Set basic information # - libfdt.fdt_setprop_u32(Fdt, 0, 'build-revision ', InfoHeader.Revision) + libfdt.fdt_setprop_u32(Fdt, 0, 'build-revision', InfoHeader.Revision) libfdt.fdt_setprop_u32(Fdt, 0, 'spec-version', InfoHeader.UplVersion) # @@ -241,7 +241,7 @@ def ReplaceFv (UplBinary, SectionFvFile, SectionName, Arch): libfdt.fdt_setprop_u32(NewFitHeader, ImageNode, 'data-offset', ImageOffset + OffsetDelta) ConfNodes = libfdt.fdt_subnode_offset(NewFitHeader, 0, 'configurations') - libfdt.fdt_setprop(NewFitHeader, ConfNodes, 'default ', bytes('conf-1', 'utf-8'), len('conf-1') + 1) + libfdt.fdt_setprop(NewFitHeader, ConfNodes, 'default', bytes('conf-1', 'utf-8'), len('conf-1') + 1) ConfNode = libfdt.fdt_subnode_offset(NewFitHeader, ConfNodes, 'conf-1') libfdt.fdt_setprop_u32(NewFitHeader, 0, 'size', FitSize) From b7d0b8331fd5e17cebea41b31ccd6e6fb4e65387 Mon Sep 17 00:00:00 2001 From: Xiang W Date: Mon, 26 Jan 2026 11:51:29 +0800 Subject: [PATCH 1088/1172] UefiPayloadPkg: UniversalPayloadBuild.py -l add support for various bases Hexadecimal is more convenient when using this script, so add various number bases support Signed-off-by: Xiang W --- UefiPayloadPkg/UniversalPayloadBuild.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UefiPayloadPkg/UniversalPayloadBuild.py b/UefiPayloadPkg/UniversalPayloadBuild.py index 35ef1b16f885..a9653270202c 100644 --- a/UefiPayloadPkg/UniversalPayloadBuild.py +++ b/UefiPayloadPkg/UniversalPayloadBuild.py @@ -337,7 +337,7 @@ def InitArgumentParser(LoadDefault): parser.add_argument("-sk", "--SkipBuild", action='store_true', help='Skip UniversalPayload build') parser.add_argument("-af", "--AddFv", type=ValidateAddFv, action='append', help='Add or replace specific FV into payload, Ex: uefi_fv=XXX.fv') parser.add_argument("-f", "--Fit", action='store_true', help='Build UniversalPayload file as UniversalPayload.fit', default=False) - parser.add_argument('-l', "--LoadAddress", type=int, help='Specify payload load address', default =0x000800000) + parser.add_argument('-l', "--LoadAddress", type=lambda x: int(x, 0), help='Specify payload load address', default =0x000800000) parser.add_argument('-c', '--DscPath', type=str, default="UefiPayloadPkg/UefiPayloadPkg.dsc", help='Path to the DSC file') parser.add_argument('-ac', '--add_cc_flags', action='append', help='Add specified CC compile flags') parser.add_argument('-ci','--CiBuild', action='store_true', help='Call from edk2 CI Build Process or not', default=False) From 842720ed0943cc031cdc8547a8e5bfc041010f90 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Fri, 16 Jan 2026 14:27:37 -0500 Subject: [PATCH 1089/1172] .azurepipelines: Move post-merge to a daily build Pipelines currently run at two main points: - Pushes to pull requests - Post-merge (after a commit is merged to the master branch) There are two main reasons this has historically been done: 1. To catch any issues that may have been missed during PR validation due to timing related factors (e.g., merge order into master). 2. To separate a more extensive set of tests from the PR validation to reduce the feedback time for contributors in PRs. PRs are ordered in master with mergify's merge queue, which helps reduce timing related issues for (1). For (2), the current post-merge tests are not significantly different from the PR validation tests, so the value is limited. The main differentiation is that the PR eval tool is only run in PR triggered pipelines and always runs in non-PR triggered runs: For example: ``` - task: CmdLine@2 displayName: Check if ${{ parameters.build_pkgs }} need testing inputs: script: stuart_pr_eval ... condition: eq(variables['Build.Reason'], 'PullRequest') ``` It is rare for an issue not be found in the PR eval run. Therefore, we are moving post-merge runs to a daily schedule. This will still provide regular testing of the master branch while reducing overall resource usage lending more capacity to PR validation runs and the introduction of Clang pipelines. These pipelines are scheduled to run daily at 7AM UTC chosen to minimize overlap with other scheduled pipelines. Signed-off-by: Michael Kubacki --- .azurepipelines/Ubuntu-GCC.yml | 14 +++++++++++--- .azurepipelines/Windows-VS.yml | 13 ++++++++++--- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/.azurepipelines/Ubuntu-GCC.yml b/.azurepipelines/Ubuntu-GCC.yml index 2472925f3080..2d359ba10d59 100644 --- a/.azurepipelines/Ubuntu-GCC.yml +++ b/.azurepipelines/Ubuntu-GCC.yml @@ -6,9 +6,17 @@ # Copyright (c) 2022, Loongson Technology Corporation Limited. All rights reserved.
    # SPDX-License-Identifier: BSD-2-Clause-Patent ## -trigger: -- master -- stable/* +trigger: none + +schedules: +- cron: "0 7 * * *" + displayName: Daily Build + branches: + include: + - master + - stable/* + always: true + pr: - master - stable/* diff --git a/.azurepipelines/Windows-VS.yml b/.azurepipelines/Windows-VS.yml index 30c9d5771bfd..2b5abe2bc7b2 100644 --- a/.azurepipelines/Windows-VS.yml +++ b/.azurepipelines/Windows-VS.yml @@ -4,9 +4,16 @@ # Copyright (c) Microsoft Corporation. # SPDX-License-Identifier: BSD-2-Clause-Patent ## -trigger: -- master -- stable/* +trigger: none + +schedules: +- cron: "0 7 * * *" + displayName: Daily Build + branches: + include: + - master + - stable/* + always: true pr: - master From 8d3d9d2f0ea6c9602f654a182250119343b00bed Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Fri, 16 Jan 2026 14:38:04 -0500 Subject: [PATCH 1090/1172] ArmVirtPkg: Move post-merge pipelines runs to a daily build Pipelines currently run at two main points: - Pushes to pull requests - Post-merge (after a commit is merged to the master branch) There are two main reasons this has historically been done: 1. To catch any issues that may have been missed during PR validation due to timing related factors (e.g., merge order into master). 2. To separate a more extensive set of tests from the PR validation to reduce the feedback time for contributors in PRs. PRs are ordered in master with mergify's merge queue, which helps reduce timing related issues for (1). For (2), the current post-merge tests are not significantly different from the PR validation tests, so the value is limited. The main differentiation is that the PR eval tool is only run in PR triggered pipelines and always runs in non-PR triggered runs: For example: ``` - task: CmdLine@2 displayName: Check if ${{ parameters.build_pkgs }} need testing inputs: script: stuart_pr_eval ... condition: eq(variables['Build.Reason'], 'PullRequest') ``` It is rare for an issue not be found in the PR eval run. Therefore, we are moving post-merge runs to a daily schedule. This will still provide regular testing of the master branch while reducing overall resource usage lending more capacity to PR validation runs and the introduction of Clang pipelines. These pipelines are scheduled to run daily at 2AM UTC chosen to minimize overlap with other scheduled pipelines. Signed-off-by: Michael Kubacki --- .../PlatformCI/.azurepipelines/Ubuntu-GCC.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/ArmVirtPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml b/ArmVirtPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml index 3186ec619a79..06405f44d6cd 100644 --- a/ArmVirtPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml +++ b/ArmVirtPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml @@ -8,9 +8,17 @@ # Copyright (c) Microsoft Corporation. # SPDX-License-Identifier: BSD-2-Clause-Patent ## -trigger: - - master - - stable/* +trigger: none + +schedules: +- cron: "0 2 * * *" + displayName: Daily Build + branches: + include: + - master + - stable/* + always: true + pr: - master - stable/* From f16447702c48caee2509aadea11569ff7a026b41 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Fri, 16 Jan 2026 14:39:03 -0500 Subject: [PATCH 1091/1172] EmulatorPkg: Move post-merge pipelines runs to a daily build Pipelines currently run at two main points: - Pushes to pull requests - Post-merge (after a commit is merged to the master branch) There are two main reasons this has historically been done: 1. To catch any issues that may have been missed during PR validation due to timing related factors (e.g., merge order into master). 2. To separate a more extensive set of tests from the PR validation to reduce the feedback time for contributors in PRs. PRs are ordered in master with mergify's merge queue, which helps reduce timing related issues for (1). For (2), the current post-merge tests are not significantly different from the PR validation tests, so the value is limited. The main differentiation is that the PR eval tool is only run in PR triggered pipelines and always runs in non-PR triggered runs: For example: ``` - task: CmdLine@2 displayName: Check if ${{ parameters.build_pkgs }} need testing inputs: script: stuart_pr_eval ... condition: eq(variables['Build.Reason'], 'PullRequest') ``` It is rare for an issue not be found in the PR eval run. Therefore, we are moving post-merge runs to a daily schedule. This will still provide regular testing of the master branch while reducing overall resource usage lending more capacity to PR validation runs and the introduction of Clang pipelines. These pipelines are scheduled to run daily at 2AM UTC chosen to minimize overlap with other scheduled pipelines. Signed-off-by: Michael Kubacki --- .../PlatformCI/.azurepipelines/Ubuntu-GCC.yml | 14 +++++++++++--- .../PlatformCI/.azurepipelines/Windows-VS.yml | 14 +++++++++++--- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/EmulatorPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml b/EmulatorPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml index 5fc297be0b45..def6d5de28db 100644 --- a/EmulatorPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml +++ b/EmulatorPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml @@ -9,9 +9,17 @@ # Copyright (c) 2020, Intel Corporation. All rights reserved. # SPDX-License-Identifier: BSD-2-Clause-Patent ## -trigger: - - master - - stable/* +trigger: none + +schedules: +- cron: "0 2 * * *" + displayName: Daily Build + branches: + include: + - master + - stable/* + always: true + pr: - master - stable/* diff --git a/EmulatorPkg/PlatformCI/.azurepipelines/Windows-VS.yml b/EmulatorPkg/PlatformCI/.azurepipelines/Windows-VS.yml index 9f27fd66c23a..654b345dd0cc 100644 --- a/EmulatorPkg/PlatformCI/.azurepipelines/Windows-VS.yml +++ b/EmulatorPkg/PlatformCI/.azurepipelines/Windows-VS.yml @@ -9,9 +9,17 @@ # Copyright (c) 2020, Intel Corporation. All rights reserved. # SPDX-License-Identifier: BSD-2-Clause-Patent ## -trigger: - - master - - stable/* +trigger: none + +schedules: +- cron: "0 2 * * *" + displayName: Daily Build + branches: + include: + - master + - stable/* + always: true + pr: - master - stable/* From 0ba3897fb3d120d73e466c1b319473726735fced Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Fri, 16 Jan 2026 14:39:27 -0500 Subject: [PATCH 1092/1172] OvmfPkg: Move post-merge pipelines runs to a daily build Pipelines currently run at two main points: - Pushes to pull requests - Post-merge (after a commit is merged to the master branch) There are two main reasons this has historically been done: 1. To catch any issues that may have been missed during PR validation due to timing related factors (e.g., merge order into master). 2. To separate a more extensive set of tests from the PR validation to reduce the feedback time for contributors in PRs. PRs are ordered in master with mergify's merge queue, which helps reduce timing related issues for (1). For (2), the current post-merge tests are not significantly different from the PR validation tests, so the value is limited. The main differentiation is that the PR eval tool is only run in PR triggered pipelines and always runs in non-PR triggered runs: For example: ``` - task: CmdLine@2 displayName: Check if ${{ parameters.build_pkgs }} need testing inputs: script: stuart_pr_eval ... condition: eq(variables['Build.Reason'], 'PullRequest') ``` It is rare for an issue not be found in the PR eval run. Therefore, we are moving post-merge runs to a daily schedule. This will still provide regular testing of the master branch while reducing overall resource usage lending more capacity to PR validation runs and the introduction of Clang pipelines. These pipelines are scheduled to run daily at 5AM UTC chosen to minimize overlap with other scheduled pipelines. Signed-off-by: Michael Kubacki --- OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml | 14 +++++++++++--- OvmfPkg/PlatformCI/.azurepipelines/Windows-VS.yml | 14 +++++++++++--- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml b/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml index 82eb6062d0a3..9b7a1a9218c5 100644 --- a/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml +++ b/OvmfPkg/PlatformCI/.azurepipelines/Ubuntu-GCC.yml @@ -8,9 +8,17 @@ # Copyright (c) Microsoft Corporation. # SPDX-License-Identifier: BSD-2-Clause-Patent ## -trigger: - - master - - stable/* +trigger: none + +schedules: +- cron: "0 5 * * *" + displayName: Daily Build + branches: + include: + - master + - stable/* + always: true + pr: - master - stable/* diff --git a/OvmfPkg/PlatformCI/.azurepipelines/Windows-VS.yml b/OvmfPkg/PlatformCI/.azurepipelines/Windows-VS.yml index b3a165cfd864..5d3ea1db4128 100644 --- a/OvmfPkg/PlatformCI/.azurepipelines/Windows-VS.yml +++ b/OvmfPkg/PlatformCI/.azurepipelines/Windows-VS.yml @@ -8,9 +8,17 @@ # Copyright (c) Microsoft Corporation. # SPDX-License-Identifier: BSD-2-Clause-Patent ## -trigger: - - master - - stable/* +trigger: none + +schedules: +- cron: "0 5 * * *" + displayName: Daily Build + branches: + include: + - master + - stable/* + always: true + pr: - master - stable/* From 61c7b61fd7be03e30681946dcd619928c1a63f83 Mon Sep 17 00:00:00 2001 From: Nickle Wang Date: Sat, 24 Jan 2026 14:35:23 +0800 Subject: [PATCH 1093/1172] RedfishPkg/RedfishPlatformConfigDxe: add missing HII handles For those HII handles that are installed before RedfishPlatformConfigDxe gets launched, add them to pending list so driver has chance to handle them. Signed-off-by: Nickle Wang --- .../RedfishPlatformConfigDxe.c | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c index 5e2efa404a9d..c33fdf25f12d 100644 --- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c +++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigDxe.c @@ -2,7 +2,7 @@ The implementation of EDKII Redfish Platform Config Protocol. (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP
    - Copyright (c) 2022-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + Copyright (c) 2022-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.
    SPDX-License-Identifier: BSD-2-Clause-Patent @@ -2570,7 +2570,9 @@ HiiDatabaseProtocolInstalled ( IN VOID *Context ) { - EFI_STATUS Status; + EFI_STATUS Status; + UINTN Index; + EFI_HII_HANDLE *HiiHandles; // // Locate HII database protocol. @@ -2585,6 +2587,21 @@ HiiDatabaseProtocolInstalled ( return; } + // + // Add Hii handles that installed before this driver. + // + HiiHandles = HiiGetHiiHandles (NULL); + if (HiiHandles != NULL) { + for (Index = 0; HiiHandles[Index] != NULL; Index++) { + Status = NotifyFormsetUpdate (HiiHandles[Index], &mRedfishPlatformConfigPrivate->PendingList); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, "%a: failed to add formset of HII handle: 0x%x\n", __func__, HiiHandles[Index])); + } + } + + FreePool (HiiHandles); + } + // // Register package notification when new form package is installed. // From 97a81fd05c47d338261a8e4c627303cbd6b1fbce Mon Sep 17 00:00:00 2001 From: Nickle Wang Date: Sat, 24 Jan 2026 14:36:35 +0800 Subject: [PATCH 1094/1172] RedfishPkg/RedfishPlatformConfigDxe: reduce false alarm Remove false alarm when there is no formset or form in HII handle. Signed-off-by: Nickle Wang --- .../RedfishPlatformConfigImpl.c | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c index 0d32f16cd9f0..9bed751d26bf 100644 --- a/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c +++ b/RedfishPkg/RedfishPlatformConfigDxe/RedfishPlatformConfigImpl.c @@ -2,7 +2,7 @@ The implementation of EDKII Redfish Platform Config Protocol. (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP
    - Copyright (c) 2022-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + Copyright (c) 2022-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.
    SPDX-License-Identifier: BSD-2-Clause-Patent @@ -1641,8 +1641,14 @@ LoadFormset ( // ZeroMem (&ZeroGuid, sizeof (ZeroGuid)); Status = CreateFormSetFromHiiHandle (HiiHandle, &ZeroGuid, HiiFormSet); - if (EFI_ERROR (Status) || IsListEmpty (&HiiFormSet->FormListHead)) { - DEBUG ((DEBUG_ERROR, "%a: Formset not found by HII handle - %g\n", __func__, FormsetPrivate->Guid)); + if (EFI_ERROR (Status)) { + if (Status != EFI_NOT_FOUND) { + DEBUG ((DEBUG_ERROR, "%a: Cannot create formset from HII handle (0x%x): %r\n", __func__, HiiHandle, Status)); + } + + goto ErrorExit; + } else if (IsListEmpty (&HiiFormSet->FormListHead)) { + DEBUG ((DEBUG_REDFISH_PLATFORM_CONFIG, "%a: there is no form in HII handle: 0x%x\n", __func__, HiiHandle)); Status = EFI_NOT_FOUND; goto ErrorExit; } @@ -1840,7 +1846,10 @@ LoadFormsetList ( // Status = LoadFormset (HiiHandle, FormsetPrivate); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "%a: Formset is not loaded for edk2 redfish: %r\n", __func__, Status)); + if (Status != EFI_NOT_FOUND) { + DEBUG ((DEBUG_ERROR, "%a: Formset is not loaded for edk2 redfish: %r\n", __func__, Status)); + } + FreePool (FormsetPrivate); return Status; } @@ -2117,7 +2126,9 @@ ProcessPendingList ( Status = LoadFormsetList (Target->HiiHandle, FormsetList); if (EFI_ERROR (Status)) { if (Status == EFI_UNSUPPORTED) { - DEBUG ((DEBUG_ERROR, " The formset has no x-UEFI-redfish configurations.\n")); + DEBUG ((DEBUG_REDFISH_PLATFORM_CONFIG, " The formset has no x-UEFI-redfish configurations.\n")); + } else if (Status == EFI_NOT_FOUND) { + DEBUG ((DEBUG_REDFISH_PLATFORM_CONFIG, " There is no formset or form on HII handle: 0x%x.\n", Target->HiiHandle)); } else { DEBUG ((DEBUG_ERROR, " load formset from HII handle: 0x%x failed: %r\n", Target->HiiHandle, Status)); } From a2aaab4553ac8b57a88868a7d3a2de400bf25cd6 Mon Sep 17 00:00:00 2001 From: Damien-Chen Date: Wed, 28 Jan 2026 20:23:57 +0800 Subject: [PATCH 1095/1172] MdeModulePkg/Core/PiSmmCore/Page.c: Correct gMemoryMap typo Correct function comment, gMemoryMep should be gMemoryMap. Signed-off-by: Damien Chen --- MdeModulePkg/Core/PiSmmCore/Page.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/MdeModulePkg/Core/PiSmmCore/Page.c b/MdeModulePkg/Core/PiSmmCore/Page.c index dfa9193eb190..c1827f95298c 100644 --- a/MdeModulePkg/Core/PiSmmCore/Page.c +++ b/MdeModulePkg/Core/PiSmmCore/Page.c @@ -287,7 +287,7 @@ ConvertSmmMemoryMapEntry ( // // --------------------------------------------------- // | +----------+ +------+ +------+ +------+ | - // ---|gMemoryMep|---|Entry1|---|Entry2|---|Entry3|--- + // ---|gMemoryMap|---|Entry1|---|Entry2|---|Entry3|--- // +----------+ ^ +------+ +------+ +------+ // | // +------+ @@ -317,7 +317,7 @@ ConvertSmmMemoryMapEntry ( // // --------------------------------------------------- // | +----------+ +------+ +------+ +------+ | - // ---|gMemoryMep|---|Entry1|---|EntryX|---|Entry3|--- + // ---|gMemoryMap|---|Entry1|---|EntryX|---|Entry3|--- // +----------+ +------+ ^ +------+ +------+ // | // +------+ @@ -338,7 +338,7 @@ ConvertSmmMemoryMapEntry ( // // --------------------------------------------------- // | +----------+ +------+ +------+ +------+ | - // ---|gMemoryMep|---|Entry1|---|EntryX|---|Entry3|--- + // ---|gMemoryMap|---|Entry1|---|EntryX|---|Entry3|--- // +----------+ +------+ +------+ ^ +------+ // | // +------+ @@ -371,7 +371,7 @@ ConvertSmmMemoryMapEntry ( // // --------------------------------------------------- // | +----------+ +------+ +-----------------+ | - // ---|gMemoryMep|---|Entry1|---|EntryX Entry3|--- + // ---|gMemoryMap|---|Entry1|---|EntryX Entry3|--- // +----------+ +------+ +-----------------+ // if ((Entry->Type == NextEntry->Type) && (Entry->End + 1 == NextEntry->Start)) { @@ -386,7 +386,7 @@ ConvertSmmMemoryMapEntry ( // // --------------------------------------------------- // | +----------+ +-----------------+ +------+ | - // ---|gMemoryMep|---|Entry1 EntryX|---|Entry3|--- + // ---|gMemoryMap|---|Entry1 EntryX|---|Entry3|--- // +----------+ +-----------------+ +------+ // if ((PreviousEntry->Type == Entry->Type) && (PreviousEntry->End + 1 == Entry->Start)) { @@ -403,7 +403,7 @@ ConvertSmmMemoryMapEntry ( // // --------------------------------------------------- // | +----------+ +------+ +------+ +------+ | - // ---|gMemoryMep|---|Entry1|---|Entry2|---|Entry3|--- + // ---|gMemoryMap|---|Entry1|---|Entry2|---|Entry3|--- // +----------+ +------+ +------+ +------+ ^ // | // +------+ From 377cdf06921beb906fdc8a8eaa828d6998da90e1 Mon Sep 17 00:00:00 2001 From: Damien-Chen Date: Wed, 28 Jan 2026 20:56:54 +0800 Subject: [PATCH 1096/1172] StandaloneMmPkg/Core/Page.c: Correct gMemoryMap typo Correct function comment, gMemoryMep should be gMemoryMap. Signed-off-by: Damien Chen --- StandaloneMmPkg/Core/Page.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/StandaloneMmPkg/Core/Page.c b/StandaloneMmPkg/Core/Page.c index 5b94876b822d..d9d528934a96 100644 --- a/StandaloneMmPkg/Core/Page.c +++ b/StandaloneMmPkg/Core/Page.c @@ -284,7 +284,7 @@ ConvertMmMemoryMapEntry ( // // --------------------------------------------------- // | +----------+ +------+ +------+ +------+ | - // ---|gMemoryMep|---|Entry1|---|Entry2|---|Entry3|--- + // ---|gMemoryMap|---|Entry1|---|Entry2|---|Entry3|--- // +----------+ ^ +------+ +------+ +------+ // | // +------+ @@ -314,7 +314,7 @@ ConvertMmMemoryMapEntry ( // // --------------------------------------------------- // | +----------+ +------+ +------+ +------+ | - // ---|gMemoryMep|---|Entry1|---|EntryX|---|Entry3|--- + // ---|gMemoryMap|---|Entry1|---|EntryX|---|Entry3|--- // +----------+ +------+ ^ +------+ +------+ // | // +------+ @@ -335,7 +335,7 @@ ConvertMmMemoryMapEntry ( // // --------------------------------------------------- // | +----------+ +------+ +------+ +------+ | - // ---|gMemoryMep|---|Entry1|---|EntryX|---|Entry3|--- + // ---|gMemoryMap|---|Entry1|---|EntryX|---|Entry3|--- // +----------+ +------+ +------+ ^ +------+ // | // +------+ @@ -368,7 +368,7 @@ ConvertMmMemoryMapEntry ( // // --------------------------------------------------- // | +----------+ +------+ +-----------------+ | - // ---|gMemoryMep|---|Entry1|---|EntryX Entry3|--- + // ---|gMemoryMap|---|Entry1|---|EntryX Entry3|--- // +----------+ +------+ +-----------------+ // if ((Entry->Type == NextEntry->Type) && (Entry->End + 1 == NextEntry->Start)) { @@ -383,7 +383,7 @@ ConvertMmMemoryMapEntry ( // // --------------------------------------------------- // | +----------+ +-----------------+ +------+ | - // ---|gMemoryMep|---|Entry1 EntryX|---|Entry3|--- + // ---|gMemoryMap|---|Entry1 EntryX|---|Entry3|--- // +----------+ +-----------------+ +------+ // if ((PreviousEntry->Type == Entry->Type) && (PreviousEntry->End + 1 == Entry->Start)) { @@ -400,7 +400,7 @@ ConvertMmMemoryMapEntry ( // // --------------------------------------------------- // | +----------+ +------+ +------+ +------+ | - // ---|gMemoryMep|---|Entry1|---|Entry2|---|Entry3|--- + // ---|gMemoryMap|---|Entry1|---|Entry2|---|Entry3|--- // +----------+ +------+ +------+ +------+ ^ // | // +------+ From 6834d43991741737acf9e53350cb9293e1c9c2f5 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 21 Jan 2026 11:38:18 -0800 Subject: [PATCH 1097/1172] MdeModulePkg/Core/Dxe/Mem: Align initial memory map entries Fix alignment issues in memory map entries returned by GetMemoryMap() when RUNTIME_PAGE_ALLOCATION_GRANULARITY is larger than DEFAULT_PAGE_ALLOCATION_GRANULARITY. Alignment issues are addressed in the initial memory map layout when Memory Type Information is provided with memory bins that use RUNTIME_PAGE_ALLOCATION_GRANULARITY. There are no issues in the Page/Pool Allocation/Free services. * CoreSetMemoryTypeInformationRange() make sure there is room for all bins when accounting for alignment requirements. Allocate space for bins with base and length following alignment requirements. * CoreSetMemoryTypeInformationRange() round up NumberOfPages in Memory Type Information based on alignment requirements. This is required so GetMemoryMap() will generate memory map entries that always follow alignment requirements. * CoreAddMemoryDescriptor() round up NumberOfPages in Memory Type Information based on alignment requirements. This is required so GetMemoryMap() will generate memory map entries that always follow alignment requirements. Signed-off-by: Michael D Kinney --- MdeModulePkg/Core/Dxe/Mem/Page.c | 68 +++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Mem/Page.c b/MdeModulePkg/Core/Dxe/Mem/Page.c index 38291e1abcc6..47291a040c72 100644 --- a/MdeModulePkg/Core/Dxe/Mem/Page.c +++ b/MdeModulePkg/Core/Dxe/Mem/Page.c @@ -557,7 +557,9 @@ CoreSetMemoryTypeInformationRange ( EFI_PHYSICAL_ADDRESS Top; EFI_MEMORY_TYPE Type; UINTN Index; - UINTN Size; + UINT64 Size; + UINT64 Alignment; + UINT64 BinSize; // // Return if Memory Type Information bin locations have already been set @@ -570,6 +572,7 @@ CoreSetMemoryTypeInformationRange ( // // Return if size of the Memory Type Information bins is greater than Length // + Top = Start + Length; Size = 0; for (Index = 0; gMemoryTypeInformation[Index].Type != EfiMaxMemoryType; Index++) { // @@ -580,7 +583,33 @@ CoreSetMemoryTypeInformationRange ( continue; } - Size += EFI_PAGES_TO_SIZE (gMemoryTypeInformation[Index].NumberOfPages); + if (gMemoryTypeInformation[Index].NumberOfPages != 0) { + Alignment = DEFAULT_PAGE_ALLOCATION_GRANULARITY; + if ((gMemoryTypeInformation[Index].Type == EfiReservedMemoryType) || + (gMemoryTypeInformation[Index].Type == EfiACPIMemoryNVS) || + (gMemoryTypeInformation[Index].Type == EfiRuntimeServicesCode) || + (gMemoryTypeInformation[Index].Type == EfiRuntimeServicesData)) + { + Alignment = RUNTIME_PAGE_ALLOCATION_GRANULARITY; + } + + BinSize = EFI_PAGES_TO_SIZE ((UINTN)gMemoryTypeInformation[Index].NumberOfPages); + BinSize = ALIGN_VALUE (BinSize, Alignment); + + Size += BinSize; + if (Size > Length) { + return; + } + + Top -= BinSize; + + Size += (Top & (Alignment - 1)); + if (Size > Length) { + return; + } + + Top &= ~(Alignment - 1); + } } if (Size > Length) { @@ -602,9 +631,22 @@ CoreSetMemoryTypeInformationRange ( } if (gMemoryTypeInformation[Index].NumberOfPages != 0) { - mMemoryTypeStatistics[Type].MaximumAddress = Top - 1; - Top -= EFI_PAGES_TO_SIZE (gMemoryTypeInformation[Index].NumberOfPages); + Alignment = DEFAULT_PAGE_ALLOCATION_GRANULARITY; + if ((gMemoryTypeInformation[Index].Type == EfiReservedMemoryType) || + (gMemoryTypeInformation[Index].Type == EfiACPIMemoryNVS) || + (gMemoryTypeInformation[Index].Type == EfiRuntimeServicesCode) || + (gMemoryTypeInformation[Index].Type == EfiRuntimeServicesData)) + { + Alignment = RUNTIME_PAGE_ALLOCATION_GRANULARITY; + } + + BinSize = EFI_PAGES_TO_SIZE ((UINTN)gMemoryTypeInformation[Index].NumberOfPages); + BinSize = ALIGN_VALUE (BinSize, Alignment); + + Top = (Top - BinSize) & ~(Alignment - 1); + mMemoryTypeStatistics[Type].BaseAddress = Top; + mMemoryTypeStatistics[Type].MaximumAddress = Top + BinSize - 1; // // If the current base address is the lowest address so far, then update @@ -614,7 +656,7 @@ CoreSetMemoryTypeInformationRange ( mDefaultMaximumAddress = mMemoryTypeStatistics[Type].BaseAddress - 1; } - mMemoryTypeStatistics[Type].NumberOfPages = gMemoryTypeInformation[Index].NumberOfPages; + mMemoryTypeStatistics[Type].NumberOfPages = EFI_SIZE_TO_PAGES ((UINTN)BinSize); gMemoryTypeInformation[Index].NumberOfPages = 0; } } @@ -666,6 +708,8 @@ CoreAddMemoryDescriptor ( EFI_STATUS Status; UINTN Index; UINTN FreeIndex; + UINT64 Alignment; + UINT64 BinSize; if ((Start & EFI_PAGE_MASK) != 0) { return; @@ -715,6 +759,20 @@ CoreAddMemoryDescriptor ( } if (gMemoryTypeInformation[Index].NumberOfPages != 0) { + Alignment = DEFAULT_PAGE_ALLOCATION_GRANULARITY; + if ((gMemoryTypeInformation[Index].Type == EfiReservedMemoryType) || + (gMemoryTypeInformation[Index].Type == EfiACPIMemoryNVS) || + (gMemoryTypeInformation[Index].Type == EfiRuntimeServicesCode) || + (gMemoryTypeInformation[Index].Type == EfiRuntimeServicesData)) + { + Alignment = RUNTIME_PAGE_ALLOCATION_GRANULARITY; + } + + BinSize = EFI_PAGES_TO_SIZE ((UINTN)gMemoryTypeInformation[Index].NumberOfPages); + BinSize = ALIGN_VALUE (BinSize, Alignment); + + gMemoryTypeInformation[Index].NumberOfPages = (UINT32)EFI_SIZE_TO_PAGES ((UINTN)BinSize); + // // Allocate pages for the current memory type from the top of available memory // From d419725b23207ebbb14ac6f1285a24753e955e92 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 21 Jan 2026 12:18:09 -0800 Subject: [PATCH 1098/1172] MdeModulePkg/Core/Dxe/Mem: Fix GetMemoryMap() Alignment Issues Fix alignment issues in memory map entries returned by GetMemoryMap() when RUNTIME_PAGE_ALLOCATION_GRANULARITY is larger than DEFAULT_PAGE_ALLOCATION_GRANULARITY. There are no issues in the Page/Pool Allocation/Free services. Logic issues issues are addressed in the memory map returned by GetMemoryMap() due to missing cases for memory map entries of type EfiConventionalMemory that overlap special memory bins. Add logic to handle all possible memory map splits required to convert internal memory map entries into an EFI Memory Map with EFI Memory Map entries the follow alignment requirements when the EFI Memory Map entries cover memory bins. The four cases that must be handled are: * Memory map entry contained within a bin. [Already covered] Convert memory map entry type * Memory map entry overlaps beginning of bin. [Added] Split memory map entry at beginning of bin. * Memory map entry overlaps end of bin. [Added] Split memory map entry at end of bin. * Memory map entry overlaps entire bin. [Added] Split memory map entry at both ends of bin. Signed-off-by: Michael D Kinney --- MdeModulePkg/Core/Dxe/Mem/Page.c | 289 +++++++++++++++++++++++++++---- 1 file changed, 257 insertions(+), 32 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Mem/Page.c b/MdeModulePkg/Core/Dxe/Mem/Page.c index 47291a040c72..ceb7d2984ee8 100644 --- a/MdeModulePkg/Core/Dxe/Mem/Page.c +++ b/MdeModulePkg/Core/Dxe/Mem/Page.c @@ -1951,6 +1951,40 @@ MergeMemoryMapDescriptor ( return NEXT_MEMORY_DESCRIPTOR (MemoryMapDescriptor, DescriptorSize); } +/** + Sets the memory type for an EFI memory descriptor and updates its attributes. + + This function sets the Type field of the provided EFI_MEMORY_DESCRIPTOR and + then updates the memory map entry attributes based on the memory type statistics. + + @param MemoryMap Pointer to the EFI_MEMORY_DESCRIPTOR to update + @param Type The memory type to set + +**/ +static +VOID +SetEfiMemoryDescriptorType ( + IN EFI_MEMORY_DESCRIPTOR *MemoryMap, + IN EFI_MEMORY_TYPE Type + ) +{ + if (MemoryMap == NULL) { + ASSERT (MemoryMap != NULL); + return; + } + + MemoryMap->Type = Type; + if (MemoryMap->Type >= EfiMaxMemoryType) { + return; + } + + if (mMemoryTypeStatistics[MemoryMap->Type].Runtime) { + MemoryMap->Attribute |= EFI_MEMORY_RUNTIME; + } else { + MemoryMap->Attribute &= ~EFI_MEMORY_RUNTIME; + } +} + /** This function returns a copy of the current memory map. The map is an array of memory descriptors, each of which describes a contiguous block of memory. @@ -2002,6 +2036,11 @@ CoreGetMemoryMap ( EFI_MEMORY_TYPE Type; EFI_MEMORY_DESCRIPTOR *MemoryMapStart; EFI_MEMORY_DESCRIPTOR *MemoryMapEnd; + UINT64 BinStart; + UINT64 BinEnd; + UINT64 EntryStart; + UINT64 EntryEnd; + BOOLEAN Modified; // // Make sure the parameters are valid @@ -2056,6 +2095,19 @@ CoreGetMemoryMap ( BufferSize += Size; } + // + // Add extra entries for each non-zero sized special memory type bin that may + // be split. Worst case is that a memory entry overlaps entire bin and + // requires an extra entry below the bin and an extra entry above the bin. + // + for (Type = (EFI_MEMORY_TYPE)0; Type < EfiMaxMemoryType; Type++) { + if (mMemoryTypeStatistics[Type].Special && + (mMemoryTypeStatistics[Type].NumberOfPages > 0)) + { + BufferSize += 2 * Size; + } + } + if (*MemoryMapSize < BufferSize) { Status = EFI_BUFFER_TOO_SMALL; goto Done; @@ -2071,50 +2123,199 @@ CoreGetMemoryMap ( // ZeroMem (MemoryMap, BufferSize); MemoryMapStart = MemoryMap; + MemoryMapEnd = MemoryMapStart; for (Link = gMemoryMap.ForwardLink; Link != &gMemoryMap; Link = Link->ForwardLink) { Entry = CR (Link, MEMORY_MAP, Link, MEMORY_MAP_SIGNATURE); ASSERT (Entry->VirtualStart == 0); + MemoryMapEnd->PhysicalStart = Entry->Start; + MemoryMapEnd->VirtualStart = 0; + MemoryMapEnd->NumberOfPages = EFI_SIZE_TO_PAGES ((UINTN)(Entry->End - Entry->Start + 1)); + MemoryMapEnd->Attribute = Entry->Attribute; + SetEfiMemoryDescriptorType (MemoryMapEnd, Entry->Type); + MemoryMapEnd = MergeMemoryMapDescriptor (MemoryMapStart, MemoryMapEnd, Size); + if ((UINTN)((UINT8 *)MemoryMapEnd - (UINT8 *)MemoryMapStart) > *MemoryMapSize) { + Status = EFI_BUFFER_TOO_SMALL; + goto Done; + } + } + // + // Loop through all memory bins and split memory entries of type + // EfiConventionalMemory if the memory map entry overlaps the beginning or end + // of a memory bin. Convert memory map entries of type EfiConventionalMemory + // that are completely contained within a memory bin to the memory bin type. + // + for (Type = (EFI_MEMORY_TYPE)0; Type < EfiMaxMemoryType; Type++) { // - // Convert internal map into an EFI_MEMORY_DESCRIPTOR - // - MemoryMap->Type = Entry->Type; - MemoryMap->PhysicalStart = Entry->Start; - MemoryMap->VirtualStart = Entry->VirtualStart; - MemoryMap->NumberOfPages = RShiftU64 (Entry->End - Entry->Start + 1, EFI_PAGE_SHIFT); - // - // If the memory type is EfiConventionalMemory, then determine if the range is part of a - // memory type bin and needs to be converted to the same memory type as the rest of the - // memory type bin in order to minimize EFI Memory Map changes across reboots. This - // improves the chances for a successful S4 resume in the presence of minor page allocation - // differences across reboots. + // If memory bin is empty or not special, then no split or conversion is required // - if (MemoryMap->Type == EfiConventionalMemory) { - for (Type = (EFI_MEMORY_TYPE)0; Type < EfiMaxMemoryType; Type++) { - if (mMemoryTypeStatistics[Type].Special && - (mMemoryTypeStatistics[Type].NumberOfPages > 0) && - (Entry->Start >= mMemoryTypeStatistics[Type].BaseAddress) && - (Entry->End <= mMemoryTypeStatistics[Type].MaximumAddress)) - { - MemoryMap->Type = Type; - } - } + if (mMemoryTypeStatistics[Type].NumberOfPages == 0) { + continue; } - MemoryMap->Attribute = Entry->Attribute; - if (MemoryMap->Type < EfiMaxMemoryType) { - if (mMemoryTypeStatistics[MemoryMap->Type].Runtime) { - MemoryMap->Attribute |= EFI_MEMORY_RUNTIME; - } + if (!mMemoryTypeStatistics[Type].Special) { + continue; } - // - // Check to see if the new Memory Map Descriptor can be merged with an - // existing descriptor if they are adjacent and have the same attributes - // - MemoryMap = MergeMemoryMapDescriptor (MemoryMapStart, MemoryMap, Size); + BinStart = mMemoryTypeStatistics[Type].BaseAddress; + BinEnd = mMemoryTypeStatistics[Type].MaximumAddress; + + Modified = TRUE; + while (Modified) { + BufferSize = ((UINT8 *)MemoryMapEnd - (UINT8 *)MemoryMapStart); + MergeMemoryMap (MemoryMapStart, &BufferSize, Size); + MemoryMapEnd = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)MemoryMapStart + BufferSize); + + Modified = FALSE; + for (MemoryMap = MemoryMapStart; MemoryMap < MemoryMapEnd; MemoryMap = NEXT_MEMORY_DESCRIPTOR (MemoryMap, Size)) { + // + // If the memory map entry is not EfiConventionalMemory, then no split or conversion is required + // + if (MemoryMap->Type != EfiConventionalMemory) { + continue; + } + + EntryStart = MemoryMap->PhysicalStart; + EntryEnd = EntryStart + EFI_PAGES_TO_SIZE ((UINTN)MemoryMap->NumberOfPages) - 1; + + // + // If the memory map entry does not overlap the memory bin, then no + // split or conversion is required + // + if ((EntryEnd < BinStart) || (EntryStart > BinEnd)) { + continue; + } + + // + // If the memory map entry is completely contained within the memory + // bin, then no split is needed and only the type should be converted. + // + if ((EntryStart >= BinStart) && (EntryEnd <= BinEnd)) { + SetEfiMemoryDescriptorType (MemoryMap, Type); + // + // Memory map was modified. Restart processing from the beginning. + // + Modified = TRUE; + break; + } + + // + // If the memory map entry starts below the memory bin start, then split + // at the memory bin start. + // + if (EntryStart < BinStart) { + // + // Shrink original entry to end at the beginning of the bin and + // keep the original EfiConventionalMemory type and PhysicalAddress + // + MemoryMap->NumberOfPages = EFI_SIZE_TO_PAGES ((UINTN)(BinStart - EntryStart)); + + // + // Insert a new entry of type memory bin type for the part after the memory bin start + // Copy the current memory map entry contents into the inserted entry + // + CopyMem ( + NEXT_MEMORY_DESCRIPTOR (MemoryMap, Size), + MemoryMap, + ((UINT8 *)MemoryMapEnd - (UINT8 *)MemoryMap) + ); + MemoryMap = NEXT_MEMORY_DESCRIPTOR (MemoryMap, Size); + MemoryMapEnd = NEXT_MEMORY_DESCRIPTOR (MemoryMapEnd, Size); + if ((UINTN)((UINT8 *)MemoryMapEnd - (UINT8 *)MemoryMapStart) > *MemoryMapSize) { + // + // Unexpected condition since max expected size for worst case splits was + // computed and returned. + // + Status = EFI_BUFFER_TOO_SMALL; + goto Done; + } + + MemoryMap->PhysicalStart = BinStart; + MemoryMap->NumberOfPages = EFI_SIZE_TO_PAGES ((UINTN)(EntryEnd - BinStart + 1)); + SetEfiMemoryDescriptorType (MemoryMap, Type); + + if (EntryEnd > BinEnd) { + // + // Shrink new entry to only cover the memory bin + // + MemoryMap->NumberOfPages = EFI_SIZE_TO_PAGES ((UINTN)(BinEnd - BinStart + 1)); + + // + // The new entry extends beyond the memory bin end. + // Create a new entry of type EfiConventionalMemory. + // + CopyMem ( + NEXT_MEMORY_DESCRIPTOR (MemoryMap, Size), + MemoryMap, + ((UINT8 *)MemoryMapEnd - (UINT8 *)MemoryMap) + ); + MemoryMap = NEXT_MEMORY_DESCRIPTOR (MemoryMap, Size); + MemoryMapEnd = NEXT_MEMORY_DESCRIPTOR (MemoryMapEnd, Size); + if ((UINTN)((UINT8 *)MemoryMapEnd - (UINT8 *)MemoryMapStart) > *MemoryMapSize) { + // + // Unexpected condition since max expected size for worst case splits was + // computed and returned. + // + Status = EFI_BUFFER_TOO_SMALL; + goto Done; + } + + MemoryMap->PhysicalStart = BinEnd + 1; + MemoryMap->NumberOfPages = EFI_SIZE_TO_PAGES ((UINTN)(EntryEnd - BinEnd)); + SetEfiMemoryDescriptorType (MemoryMap, EfiConventionalMemory); + } + + // + // Memory map was modified. Restart processing from the beginning + // + Modified = TRUE; + break; + } + + // + // If the memory map entry ends above the memory bin end, then split at the memory bin end + // + if (EntryEnd > BinEnd) { + // + // Shrink the original entry for part before the memory bin end + // + MemoryMap->PhysicalStart = EntryStart; + MemoryMap->NumberOfPages = EFI_SIZE_TO_PAGES ((UINTN)(BinEnd - EntryStart + 1)); + SetEfiMemoryDescriptorType (MemoryMap, Type); + + // + // Create new entry for the part before the memory bin end + // EntryStart is guaranteed to be >= BinStart here, so the entire + // entry can be converted to the memory bin type + // + CopyMem ( + NEXT_MEMORY_DESCRIPTOR (MemoryMap, Size), + MemoryMap, + ((UINT8 *)MemoryMapEnd - (UINT8 *)MemoryMap) + ); + MemoryMap = NEXT_MEMORY_DESCRIPTOR (MemoryMap, Size); + MemoryMapEnd = NEXT_MEMORY_DESCRIPTOR (MemoryMapEnd, Size); + if ((UINTN)((UINT8 *)MemoryMapEnd - (UINT8 *)MemoryMapStart) > *MemoryMapSize) { + Status = EFI_BUFFER_TOO_SMALL; + goto Done; + } + + MemoryMap->PhysicalStart = BinEnd + 1; + MemoryMap->NumberOfPages = EFI_SIZE_TO_PAGES ((UINTN)(EntryEnd - BinEnd)); + SetEfiMemoryDescriptorType (MemoryMap, EfiConventionalMemory); + + // + // Memory map was modified, so restart processing from the beginning + // + Modified = TRUE; + break; + } + } + } } + MemoryMap = MemoryMapEnd; + ZeroMem (&MergeGcdMapEntry, sizeof (MergeGcdMapEntry)); GcdMapEntry = NULL; for (Link = mGcdMemorySpaceMap.ForwardLink; ; Link = Link->ForwardLink) { @@ -2169,6 +2370,14 @@ CoreGetMemoryMap ( // existing descriptor if they are adjacent and have the same attributes // MemoryMap = MergeMemoryMapDescriptor (MemoryMapStart, MemoryMap, Size); + if ((UINTN)((UINT8 *)MemoryMap - (UINT8 *)MemoryMapStart) > *MemoryMapSize) { + // + // Unexpected condition since max expected size for worst case splits was + // computed and returned. + // + Status = EFI_BUFFER_TOO_SMALL; + goto Done; + } } if (MergeGcdMapEntry.GcdMemoryType == EfiGcdMemoryTypePersistent) { @@ -2194,6 +2403,14 @@ CoreGetMemoryMap ( // existing descriptor if they are adjacent and have the same attributes // MemoryMap = MergeMemoryMapDescriptor (MemoryMapStart, MemoryMap, Size); + if ((UINTN)((UINT8 *)MemoryMap - (UINT8 *)MemoryMapStart) > *MemoryMapSize) { + // + // Unexpected condition since max expected size for worst case splits was + // computed and returned. + // + Status = EFI_BUFFER_TOO_SMALL; + goto Done; + } } if (MergeGcdMapEntry.GcdMemoryType == EfiGcdMemoryTypeUnaccepted) { @@ -2220,6 +2437,14 @@ CoreGetMemoryMap ( // existing descriptor if they are adjacent and have the same attributes // MemoryMap = MergeMemoryMapDescriptor (MemoryMapStart, MemoryMap, Size); + if ((UINTN)((UINT8 *)MemoryMap - (UINT8 *)MemoryMapStart) > *MemoryMapSize) { + // + // Unexpected condition since max expected size for worst case splits was + // computed and returned. + // + Status = EFI_BUFFER_TOO_SMALL; + goto Done; + } } if (Link == &mGcdMemorySpaceMap) { From d6bcf9d22c9db82e9c4ed69e28b53dba418abc77 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Tue, 13 Jan 2026 14:06:30 -0800 Subject: [PATCH 1099/1172] .pytool/Plugin/CompilerPlugin: Allow NOOPT builds CompilerPlugin currently only supports DEBUG and RELEASE. This means it is not possible to use stuart tools to build packages for NOOPT. The NOOPT profile is valuable for debug scenarios and also identifies some code quality issues. This change will cause stuart commands for NOOPT on a package to run both the CompilerPlugin and the UnitTest plugins that can impact build times. The stuart command line options can be used to select the specific plugins to run. * Package CompilerPlugin Build with NOOPT add: --disable-all CompilerPlugin=run * Package UnitTest Build with NOOPT add: --disable-all HostUnitTestCompilerPlugin=run HostBasedUnitTestRunner=run Signed-off-by: Michael D Kinney --- .pytool/Plugin/CompilerPlugin/CompilerPlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pytool/Plugin/CompilerPlugin/CompilerPlugin.py b/.pytool/Plugin/CompilerPlugin/CompilerPlugin.py index 01101b2f4a8c..4a7c5731ee00 100644 --- a/.pytool/Plugin/CompilerPlugin/CompilerPlugin.py +++ b/.pytool/Plugin/CompilerPlugin/CompilerPlugin.py @@ -39,7 +39,7 @@ def GetTestName(self, packagename: str, environment: VarDict) -> tuple: return ("Compile " + packagename + " " + target, packagename + ".Compiler." + target) def RunsOnTargetList(self): - return ["DEBUG", "RELEASE"] + return ["DEBUG", "RELEASE", "NOOPT"] ## # External function of plugin. This function is used to perform the task of the ICiBuildPlugin Plugin From 8ca4de0982eb313d19b710c8e4aab429f88a2a73 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Tue, 13 Jan 2026 19:43:08 -0800 Subject: [PATCH 1100/1172] .pytool/Plugin/CompilerPlugin: Skip TARGET not supported by DSC Fix build failures when a request is made to build a package for a BUILD_TARGET that the package does not support. This aligns CompilerPlugin with SUPPORTED_ARCHITECTURES that does not generate a build failure if a request is made to build a package for a CPU architecture that the package does not support. Signed-off-by: Michael D Kinney --- .pytool/Plugin/CompilerPlugin/CompilerPlugin.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.pytool/Plugin/CompilerPlugin/CompilerPlugin.py b/.pytool/Plugin/CompilerPlugin/CompilerPlugin.py index 4a7c5731ee00..15182cf8ee77 100644 --- a/.pytool/Plugin/CompilerPlugin/CompilerPlugin.py +++ b/.pytool/Plugin/CompilerPlugin/CompilerPlugin.py @@ -89,6 +89,14 @@ def RunBuildPlugin(self, packagename, Edk2pathObj, pkgconfig, environment, PLM, tc.LogStdError("No supported architectures to build") return -1 + if "BUILD_TARGETS" in dp.LocalVars: + BUILD_TARGETS = dp.LocalVars["BUILD_TARGETS"].split('|') + # Skip if build_target is not in BUILD_TARGETS + if build_target not in BUILD_TARGETS: + tc.SetSkipped() + tc.LogStdError("No supported targets to build") + return -1 + uefiBuilder = UefiBuilder() # do all the steps # WorkSpace, PackagesPath, PInHelper, PInManager From 947bb30b1f0a632159a6636ee41f0d2a132e2633 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Tue, 13 Jan 2026 19:01:09 -0800 Subject: [PATCH 1101/1172] .pytool/Plugin/HostUnitTestCompilerPlugin: Allow non VS20xx IA32 Allow IA32 builds of host-based unit tests for environments that support IA32. The VS20xx tool chains do not support IA32 due to limitations in the code coverage tool OpenCppCoverage. All other tool chains should be allowed to use IA32. Signed-off-by: Michael D Kinney --- .../HostUnitTestCompilerPlugin/HostUnitTestCompilerPlugin.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.pytool/Plugin/HostUnitTestCompilerPlugin/HostUnitTestCompilerPlugin.py b/.pytool/Plugin/HostUnitTestCompilerPlugin/HostUnitTestCompilerPlugin.py index b06f59cc51b8..36aae4f4731f 100644 --- a/.pytool/Plugin/HostUnitTestCompilerPlugin/HostUnitTestCompilerPlugin.py +++ b/.pytool/Plugin/HostUnitTestCompilerPlugin/HostUnitTestCompilerPlugin.py @@ -62,6 +62,10 @@ def __GetHostUnitTestArch(self, environment): ## change once IA32 issues resolved host.append("IA32") if GetHostInfo().bit == '64': host.append("X64") + # VS20xx IA32 builds have known issues using OpenCppCoverage + # Only enable IA32 builds on 64bit hosts when using clang or gcc + if not environment.GetValue("TOOL_CHAIN_TAG").startswith('VS'): + host.append("IA32") elif GetHostInfo().arch == 'ARM': if GetHostInfo().bit == '64': host.append("AARCH64") From 0b867b65a2c1b30a822e09572323495478778e81 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 14 Jan 2026 13:44:39 -0800 Subject: [PATCH 1102/1172] BaseTools/Plugin/WindowsVsToolChain: CLANGPDB add IA32 DLLs to Path Add %VCToolsInstallDir%\bin\Hostx64\x86 to PATH to add DLLs required for IA32 host-based unit tests to execute. Some Visual Studio environments add the IA32 DLL path to PATH and some do not. The failure was observed in GitHub Action windows-2025 agents where the X64 DLL path was added, but the IA32 DLL path was missing. Signed-off-by: Michael D Kinney --- .../Plugin/WindowsVsToolChain/WindowsVsToolChain.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py b/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py index 472a63719765..ce8a3911461f 100644 --- a/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py +++ b/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py @@ -403,6 +403,15 @@ def do_pre_build(self, thebuilder): for (k, v) in vs_vars.items(): shell_env.set_shell_var(k, v) + # Add path to IA32 toolchain DLLs for unit test execution + vc_tools_install_dir = shell_env.get_shell_var("VCToolsInstallDir") + if vc_tools_install_dir: + ia32_dll_path = os.path.join(vc_tools_install_dir, 'bin', 'Hostx64', 'x86') + if os.path.exists (ia32_dll_path): + shell_env.append_path(os.path.join (vc_tools_install_dir, 'bin', 'Hostx64', 'x86')) + else: + self.Logger.warning("IA32 toolchain DLLs not found in expected path %s. IA32 unit tests may fail to run." % ia32_dll_path) + ## # If environment already has CLANG_HOST_BIN set then user has already # set the path to the mingw32 make utility From ea011c812fc5e286628144478bb217f7b7ff7a97 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 14 Jan 2026 17:04:47 -0800 Subject: [PATCH 1103/1172] BaseTools/Plugin/WindowsVsToolChain: Add WindowsSDKLibVersion Fix VS20xx build failures in GitHub Actions windows-2025 environments due to missing libraries. Add WindowsSDKLibVersion to the set of environment variables that are set in a Windows Visual Studio build environment. WindowsSDKLibVersion is required to set LIBPATH for VS20xx builds of the EmulatorPkg and Host-based unit tests. Signed-off-by: Michael D Kinney --- BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py b/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py index ce8a3911461f..2c026d5e59d5 100644 --- a/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py +++ b/BaseTools/Plugin/WindowsVsToolChain/WindowsVsToolChain.py @@ -28,7 +28,7 @@ def do_pre_build(self, thebuilder): self.Logger = logging.getLogger("WindowsVsToolChain") interesting_keys = ["ExtensionSdkDir", "INCLUDE", "LIB", "LIBPATH", "UniversalCRTSdkDir", "UCRTVersion", "WindowsLibPath", "WindowsSdkBinPath", "WindowsSdkDir", "WindowsSdkVerBinPath", - "WindowsSDKVersion", "VCToolsInstallDir", "Path"] + "WindowsSDKVersion", "WindowsSDKLibVersion", "VCToolsInstallDir", "Path"] # # VS2017 - Follow VS2017 where there is potential for many versions of the tools. From ccbee92b65a35a2ce8aa4c6ec4aa6d1f09000cf7 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Fri, 23 Jan 2026 17:25:10 -0800 Subject: [PATCH 1104/1172] .azurepipelines/templates: Split out unit test jobs Add unit tests jobs for stuart_ci_build NOOPT X64 with options to only build and run unit tests. This disables all other plugins including CompilerPlugin that performs package build tests. --disable-all HostUnitTestCompilerPlugin=run HostBasedUnitTestRunner=run Update all package build tests to remove the NOOPT option. This is required because NOOPT can now be used to perform both package build tests and unit test builds. In order to preserve the same number of CI checks, NOOPT package build coverage must be disabled and NOOPT is only used for unit test builds in independent jobs. Daily/Weekly/Release coverage build can potentially use NOOPT for package build tests to verify no regressions for NOOPT package builds. Signed-off-by: Michael D Kinney --- .../templates/pr-gate-build-job.yml | 38 ++++++++++++------- .azurepipelines/templates/pr-gate-steps.yml | 3 +- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/.azurepipelines/templates/pr-gate-build-job.yml b/.azurepipelines/templates/pr-gate-build-job.yml index e55cb0b2ca2e..0f19ca58c628 100644 --- a/.azurepipelines/templates/pr-gate-build-job.yml +++ b/.azurepipelines/templates/pr-gate-build-job.yml @@ -24,22 +24,33 @@ jobs: #Use matrix to speed up the build process strategy: matrix: + ${{ if eq(parameters.tool_chain_tag, 'GCC') }}: + TARGET_GCC_ONLY_UNIT_TEST: + Build.Pkgs: 'EmbeddedPkg' + Build.Targets: 'NOOPT' + Build.Archlist: 'X64' + Build.ExtraStuartArgs: '--disable-all HostUnitTestCompilerPlugin=run HostBasedUnitTestRunner=run' + TARGET_UNIT_TEST: + Build.Pkgs: 'ArmPkg,ArmPlatformPkg,MdePkg,UefiCpuPkg,MdeModulePkg,NetworkPkg,RedfishPkg,PcAtChipsetPkg,PrmPkg,ShellPkg,SourceLevelDebugPkg,StandaloneMmPkg,SignedCapsulePkg,FmpDevicePkg,FatPkg,UnitTestFrameworkPkg,DynamicTablesPkg,CryptoPkg,IntelFsp2Pkg,IntelFsp2WrapperPkg,SecurityPkg,ArmVirtPkg,EmulatorPkg,OvmfPkg,UefiPayloadPkg' + Build.Targets: 'NOOPT' + Build.Archlist: 'X64' + Build.ExtraStuartArgs: '--disable-all HostUnitTestCompilerPlugin=run HostBasedUnitTestRunner=run' ${{ if eq(parameters.tool_chain_tag, 'GCC') }}: TARGET_GCC_ONLY: Build.Pkgs: 'EmbeddedPkg' - Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT' + Build.Targets: 'DEBUG,RELEASE,NO-TARGET' Build.Archlist: ${{ parameters.arch_list }} TARGET_ARM_ARMPLATFORM: Build.Pkgs: 'ArmPkg,ArmPlatformPkg' - Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT' + Build.Targets: 'DEBUG,RELEASE,NO-TARGET' Build.Archlist: ${{ parameters.arch_list }} TARGET_MDE_CPU: Build.Pkgs: 'MdePkg,UefiCpuPkg' - Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT' + Build.Targets: 'DEBUG,RELEASE,NO-TARGET' Build.Archlist: ${{ parameters.arch_list }} TARGET_MDEMODULE_DEBUG: Build.Pkgs: 'MdeModulePkg' - Build.Targets: 'DEBUG,NOOPT' + Build.Targets: 'DEBUG' Build.Archlist: ${{ parameters.arch_list }} TARGET_MDEMODULE_RELEASE: Build.Pkgs: 'MdeModulePkg' @@ -47,19 +58,19 @@ jobs: Build.Archlist: ${{ parameters.arch_list }} TARGET_NETWORK: Build.Pkgs: 'NetworkPkg,RedfishPkg' - Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT' + Build.Targets: 'DEBUG,RELEASE,NO-TARGET' Build.Archlist: ${{ parameters.arch_list }} TARGET_OTHER: Build.Pkgs: 'PcAtChipsetPkg,PrmPkg,ShellPkg,SourceLevelDebugPkg,StandaloneMmPkg,SignedCapsulePkg' - Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT' + Build.Targets: 'DEBUG,RELEASE,NO-TARGET' Build.Archlist: ${{ parameters.arch_list }} TARGET_FMP_FAT_TEST: Build.Pkgs: 'FmpDevicePkg,FatPkg,UnitTestFrameworkPkg,DynamicTablesPkg' - Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT' + Build.Targets: 'DEBUG,RELEASE,NO-TARGET' Build.Archlist: ${{ parameters.arch_list }} TARGET_CRYPTO_DEBUG: Build.Pkgs: 'CryptoPkg' - Build.Targets: 'DEBUG,NOOPT' + Build.Targets: 'DEBUG' Build.Archlist: ${{ parameters.arch_list }} TARGET_CRYPTO_RELEASE: Build.Pkgs: 'CryptoPkg' @@ -67,26 +78,26 @@ jobs: Build.Archlist: ${{ parameters.arch_list }} TARGET_FSP: Build.Pkgs: 'IntelFsp2Pkg,IntelFsp2WrapperPkg' - Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT' + Build.Targets: 'DEBUG,RELEASE,NO-TARGET' Build.Archlist: ${{ parameters.arch_list }} TARGET_SECURITY: Build.Pkgs: 'SecurityPkg' - Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT' + Build.Targets: 'DEBUG,RELEASE,NO-TARGET' Build.Archlist: ${{ parameters.arch_list }} TARGET_UEFIPAYLOAD_IA32_X64: Build.Pkgs: 'UefiPayloadPkg' - Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT' + Build.Targets: 'DEBUG,RELEASE,NO-TARGET' Build.Archlist: 'IA32,X64' ${{ if eq(parameters.tool_chain_tag, 'GCC') }}: TARGET_UEFIPAYLOAD_AARCH64_GCC_ONLY: Build.Pkgs: 'UefiPayloadPkg' - Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT' + Build.Targets: 'DEBUG,RELEASE,NO-TARGET' Build.Archlist: 'AARCH64' TARGET_PLATFORMS: # For Platforms only check code. Leave it to Platform CI # to build them. Build.Pkgs: 'ArmVirtPkg,EmulatorPkg,OvmfPkg' - Build.Targets: 'NO-TARGET,NOOPT' + Build.Targets: 'NO-TARGET' Build.Archlist: ${{ parameters.arch_list }} workspace: @@ -105,6 +116,7 @@ jobs: build_pkgs: $(Build.Pkgs) build_targets: $(Build.Targets) build_archs: $(Build.Archlist) + build_extra_stuart_args: $(Build.ExtraStuartArgs) usePythonVersion: ${{ parameters.usePythonVersion }} extra_install_step: ${{ parameters.extra_install_step }} diff --git a/.azurepipelines/templates/pr-gate-steps.yml b/.azurepipelines/templates/pr-gate-steps.yml index 55eb1ef7e71d..316343220e59 100644 --- a/.azurepipelines/templates/pr-gate-steps.yml +++ b/.azurepipelines/templates/pr-gate-steps.yml @@ -12,6 +12,7 @@ parameters: build_pkgs: '' build_targets: '' build_archs: '' + build_extra_stuart_args: '' usePythonVersion: '' extra_install_step: [] @@ -90,7 +91,7 @@ steps: displayName: Build and Test ${{ parameters.build_pkgs }} ${{ parameters.build_archs}} inputs: script: | - stuart_ci_build -c .pytool/CISettings.py -p $(pkgs_to_build) -t ${{ parameters.build_targets}} -a ${{ parameters.build_archs}} TOOL_CHAIN_TAG=${{ parameters.tool_chain_tag}} + stuart_ci_build -c .pytool/CISettings.py -p $(pkgs_to_build) -t ${{ parameters.build_targets}} -a ${{ parameters.build_archs}} TOOL_CHAIN_TAG=${{ parameters.tool_chain_tag}} ${{ parameters.build_extra_stuart_args }} condition: and(gt(variables.pkg_count, 0), succeeded()) # Publish Test Results to Azure Pipelines/TFS From 539c53375e84a7542a45e7b2893d59bdb0a81ff3 Mon Sep 17 00:00:00 2001 From: Abdul Lateef Attar Date: Wed, 19 Nov 2025 13:08:51 +0000 Subject: [PATCH 1105/1172] ShellPkg/AcpiView: Adds FPDT Parser Add a new parser for the Firmware Performance Data Table (FPDT), as per the ACPI6.5 specification. Signed-off-by: Abdul Lateef Attar --- .../UefiShellAcpiViewCommandLib/AcpiParser.h | 23 +- .../Parsers/Fpdt/FpdtParser.c | 358 ++++++++++++++++++ .../UefiShellAcpiViewCommandLib.c | 3 + .../UefiShellAcpiViewCommandLib.inf | 2 + 4 files changed, 385 insertions(+), 1 deletion(-) create mode 100644 ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Fpdt/FpdtParser.c diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h index 1100d249c173..cb49807b743a 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h @@ -3,7 +3,7 @@ Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. Copyright (c) 2016 - 2024, Arm Limited. All rights reserved. - Copyright (c) 2022, AMD Incorporated. All rights reserved. + Copyright (C) 2022 - 2026, Advanced Micro Devices, Inc. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -795,6 +795,27 @@ ParseAcpiFadt ( IN UINT8 AcpiTableRevision ); +/** + This function parses the ACPI FPDT table. + This function parses the FPDT table and optionally traces the ACPI + table fields. + + This function also performs validation of the ACPI table fields. + + @param [in] Trace If TRUE, trace the ACPI fields. + @param [in] Ptr Pointer to the start of the buffer. + @param [in] AcpiTableLength Length of the ACPI table. + @param [in] AcpiTableRevision Revision of the ACPI table. +**/ +VOID +EFIAPI +ParseAcpiFpdt ( + IN BOOLEAN Trace, + IN UINT8 *Ptr, + IN UINT32 AcpiTableLength, + IN UINT8 AcpiTableRevision + ); + /** This function parses the ACPI GTDT table. When trace is enabled this function parses the GTDT table and diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Fpdt/FpdtParser.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Fpdt/FpdtParser.c new file mode 100644 index 000000000000..5179bf826833 --- /dev/null +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Fpdt/FpdtParser.c @@ -0,0 +1,358 @@ +/** @file + Firmware Performance Data Table (FPDT) table parser + + Copyright (C) 2026 Advanced Micro Devices, Inc. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - ACPI 6.5 Specification - August 2022 +**/ + +#include +#include +#include +#include "AcpiParser.h" +#include "AcpiTableParser.h" +#include "AcpiViewConfig.h" + +/** + Parse the Firmware basic boot performance record. + EFI_ACPI_6_5_FPDT_PERFORMANCE_TABLE_HEADER +**/ +VOID +EFIAPI +DumpFbbp ( + IN CONST CHAR16 *Format OPTIONAL, + IN UINT8 *Ptr, + IN UINT32 Length + ); + +/** + Parse the S3 performance table record. + EFI_ACPI_6_5_FPDT_RECORD_TYPE_S3_PERFORMANCE_TABLE_POINTER + + @param [in] Format Format string. + @param [in] Ptr Pointer to the start of the record. + @param [in] Length Length of the field. +**/ +VOID +EFIAPI +DumpS3Ptp ( + IN CONST CHAR16 *Format OPTIONAL, + IN UINT8 *Ptr, + IN UINT32 Length + ); + +// Local Variables +STATIC ACPI_DESCRIPTION_HEADER_INFO mAcpiHdrInfo; + +/** + An ACPI_PARSER array describing the ACPI FPDT performance record header. +**/ +STATIC CONST ACPI_PARSER mFpdtPerfRecordParser[] = { + { L"Type", 2, 0, L"0x%x", NULL, NULL, NULL, NULL }, + { L"Length", 1, 2, L"0x%x", NULL, NULL, NULL, NULL }, + { L"Revision", 1, 3, L"0x%x", NULL, NULL, NULL, NULL } +}; + +/** + An ACPI_PARSER array describing the ACPI FPDT boot performance pointer record. +**/ +STATIC CONST ACPI_PARSER mFpdtBootPerfPointerParser[] = { + { L"Type", 2, 0, L"0x%x", NULL, NULL, NULL, NULL }, + { L"Length", 1, 2, L"0x%x", NULL, NULL, NULL, NULL }, + { L"Revision", 1, 3, L"0x%x", NULL, NULL, NULL, NULL }, + { L"Reserved", 4, 4, L"0x%x", NULL, NULL, NULL, NULL }, + { L"BootPerformanceTablePointer", 8, 8, NULL, DumpFbbp, NULL, NULL, NULL } +}; + +/** + An ACPI_PARSER array describing the ACPI FPDT S3 performance pointer record. +**/ +STATIC CONST ACPI_PARSER mFpdtS3PerfPointerParser[] = { + { L"Type", 2, 0, L"0x%x", NULL, NULL, NULL, NULL }, + { L"Length", 1, 2, L"0x%x", NULL, NULL, NULL, NULL }, + { L"Revision", 1, 3, L"0x%x", NULL, NULL, NULL, NULL }, + { L"Reserved", 4, 4, L"0x%x", NULL, NULL, NULL, NULL }, + { L"S3PerformanceTablePointer", 8, 8, NULL, DumpS3Ptp, NULL, NULL, NULL } +}; + +/** + An ACPI_PARSER array describing the ACPI FPDT firmware table header. +**/ +STATIC CONST ACPI_PARSER mAcpiFpdtHdrParser[] = { + { L"Signature", 4, 0, NULL, Dump4Chars, NULL, NULL, NULL }, + { L"Length", 4, 4, L"0x%x", NULL, NULL, NULL, NULL } +}; + +/** + An ACPI_PARSER array describing the ACPI FPDT firmware basic boot record. +**/ +STATIC CONST ACPI_PARSER mFpdtBasicBootRecordParser[] = { + { L"Type", 2, 0, L"0x%x", NULL, NULL, NULL, NULL }, + { L"Length", 1, 2, L"0x%x", NULL, NULL, NULL, NULL }, + { L"Revision", 1, 3, L"0x%x", NULL, NULL, NULL, NULL }, + { L"Reserved", 4, 4, L"0x%x", NULL, NULL, NULL, NULL }, + { L"ResetEnd", 8, 8, L"0x%lx", NULL, NULL, NULL, NULL }, + { L"OsLoaderLoadImageStart", 8, 16, L"0x%lx", NULL, NULL, NULL, NULL }, + { L"OsLoaderStartImageStart", 8, 24, L"0x%lx", NULL, NULL, NULL, NULL }, + { L"ExitBootServicesEntry", 8, 32, L"0x%lx", NULL, NULL, NULL, NULL }, + { L"ExitBootServicesExit", 8, 40, L"0x%lx", NULL, NULL, NULL, NULL } +}; + +/** + An ACPI_PARSER array describing the ACPI FPDT S3 resume record. +**/ +STATIC CONST ACPI_PARSER mFpdtS3ResumeRecordParser[] = { + { L"Type", 2, 0, L"0x%x", NULL, NULL, NULL, NULL }, + { L"Length", 1, 2, L"0x%x", NULL, NULL, NULL, NULL }, + { L"Revision", 1, 3, L"0x%x", NULL, NULL, NULL, NULL }, + { L"ResumeCount", 4, 4, L"0x%x", NULL, NULL, NULL, NULL }, + { L"FullResume", 8, 8, L"0x%lx", NULL, NULL, NULL, NULL }, + { L"AverageResume", 8, 16, L"0x%lx", NULL, NULL, NULL, NULL } +}; + +/** + An ACPI_PARSER array describing the ACPI FPDT S3 suspend record. +**/ +STATIC CONST ACPI_PARSER mFpdtS3SuspendRecordParser[] = { + { L"Type", 2, 0, L"0x%x", NULL, NULL, NULL, NULL }, + { L"Length", 1, 2, L"0x%x", NULL, NULL, NULL, NULL }, + { L"Revision", 1, 3, L"0x%x", NULL, NULL, NULL, NULL }, + { L"SuspendStart", 4, 4, L"0x%x", NULL, NULL, NULL, NULL }, + { L"SuspendEnd", 8, 12, L"0x%lx", NULL, NULL, NULL, NULL } +}; + +/** + An ACPI_PARSER array describing the ACPI FPDT Table. +**/ +STATIC CONST ACPI_PARSER mFpdtParser[] = { + PARSE_ACPI_HEADER (&mAcpiHdrInfo) +}; + +/** + Parse the S3 performance table record. + EFI_ACPI_6_5_FPDT_RECORD_TYPE_S3_PERFORMANCE_TABLE_POINTER + + @param [in] Format Format string. + @param [in] Ptr Pointer to the start of the record. + @param [in] Length Length of the field. +**/ +VOID +EFIAPI +DumpS3Ptp ( + IN CONST CHAR16 *Format OPTIONAL, + IN UINT8 *Ptr, + IN UINT32 Length + ) +{ + EFI_ACPI_6_5_FPDT_PERFORMANCE_TABLE_HEADER *FpdtHdr; + EFI_ACPI_6_5_FPDT_S3_RESUME_RECORD *FpdtS3ResumeRec; + EFI_ACPI_6_5_FPDT_S3_SUSPEND_RECORD *FpdtS3SuspendRec; + UINT32 RecOffset; + UINT8 *RecPtr; + EFI_ACPI_6_5_FPDT_PERFORMANCE_RECORD_HEADER *FpdtRecHdr; + BOOLEAN InvalidRecord; + + InvalidRecord = FALSE; + RecPtr = (UINT8 *)(UINTN)(*(UINT64 *)Ptr); + + Print ( + (Format != NULL) ? Format : L"0x%lx\n", + RecPtr + ); + + ParseAcpi ( + TRUE, + 4, + "S3 Performance Table Pointer Record", + RecPtr, + sizeof (EFI_ACPI_6_5_FPDT_PERFORMANCE_TABLE_HEADER), + PARSER_PARAMS (mAcpiFpdtHdrParser) + ); + + RecOffset = sizeof (EFI_ACPI_6_5_FPDT_PERFORMANCE_TABLE_HEADER); + FpdtHdr = (EFI_ACPI_6_5_FPDT_PERFORMANCE_TABLE_HEADER *)(RecPtr); + while (!InvalidRecord && (RecOffset < FpdtHdr->Length)) { + FpdtRecHdr = (EFI_ACPI_6_5_FPDT_PERFORMANCE_RECORD_HEADER *)(RecPtr + RecOffset); + switch (FpdtRecHdr->Type) { + case EFI_ACPI_6_5_FPDT_RUNTIME_RECORD_TYPE_S3_RESUME: + FpdtS3ResumeRec = (EFI_ACPI_6_5_FPDT_S3_RESUME_RECORD *)(RecPtr + RecOffset); + ParseAcpi ( + TRUE, + 4, + "FPDT S3 Resume Record", + RecPtr + RecOffset, + FpdtS3ResumeRec->Header.Length, + PARSER_PARAMS (mFpdtS3ResumeRecordParser) + ); + break; + case EFI_ACPI_6_5_FPDT_RUNTIME_RECORD_TYPE_S3_SUSPEND: + FpdtS3SuspendRec = (EFI_ACPI_6_5_FPDT_S3_SUSPEND_RECORD *)(RecPtr + RecOffset); + ParseAcpi ( + TRUE, + 4, + "FPDT S3 Suspend Record", + RecPtr + RecOffset, + FpdtS3SuspendRec->Header.Length, + PARSER_PARAMS (mFpdtS3SuspendRecordParser) + ); + break; + default: + IncrementErrorCount (); + Print ( + L"\nError: Unknown FPDT S3 Performance Record Type: 0x%x\n", + FpdtRecHdr->Type + ); + InvalidRecord = TRUE; + break; + } + + RecOffset += FpdtRecHdr->Length; + } +} + +/** + Parse the Firmware basic boot performance record. + EFI_ACPI_6_5_FPDT_PERFORMANCE_TABLE_HEADER + + @param [in] Format Format string. + @param [in] Ptr Pointer to the start of the record. + @param [in] Length Length of the field. +**/ +VOID +EFIAPI +DumpFbbp ( + IN CONST CHAR16 *Format OPTIONAL, + IN UINT8 *Ptr, + IN UINT32 Length + ) +{ + EFI_ACPI_6_5_FPDT_FIRMWARE_BASIC_BOOT_RECORD *FpdtBasicBootRec; + EFI_ACPI_6_5_FPDT_PERFORMANCE_TABLE_HEADER *FpdtHdr; + UINT32 RecOffset; + UINT8 *RecPtr; + + RecPtr = (UINT8 *)(UINTN)(*(UINT64 *)Ptr); + + Print ( + (Format != NULL) ? Format : L"0x%lx\n", + RecPtr + ); + + ParseAcpi ( + TRUE, + 4, + "Firmware Basic Boot Performance Table", + RecPtr, + sizeof (EFI_ACPI_6_5_FPDT_PERFORMANCE_TABLE_HEADER), + PARSER_PARAMS (mAcpiFpdtHdrParser) + ); + + RecOffset = sizeof (EFI_ACPI_6_5_FPDT_PERFORMANCE_TABLE_HEADER); + FpdtHdr = (EFI_ACPI_6_5_FPDT_PERFORMANCE_TABLE_HEADER *)RecPtr; + while (RecOffset < FpdtHdr->Length) { + FpdtBasicBootRec = (EFI_ACPI_6_5_FPDT_FIRMWARE_BASIC_BOOT_RECORD *)(RecPtr + RecOffset); + if (FpdtBasicBootRec->Header.Type != EFI_ACPI_6_5_FPDT_RUNTIME_RECORD_TYPE_FIRMWARE_BASIC_BOOT) { + IncrementErrorCount (); + Print ( + L"\nError: Unexpected FPDT Boot Performance Record Type: 0x%x\n", + FpdtBasicBootRec->Header.Type + ); + break; + } + + ParseAcpi ( + TRUE, + 4, + "FPDT Boot Performance Table", + RecPtr + RecOffset, + FpdtBasicBootRec->Header.Length, + PARSER_PARAMS (mFpdtBasicBootRecordParser) + ); + RecOffset += FpdtBasicBootRec->Header.Length; + } +} + +/** + This function parses the ACPI FPDT table. + This function parses the FPDT table and optionally traces the ACPI + table fields. + + This function also performs validation of the ACPI table fields. + + @param [in] Trace If TRUE, trace the ACPI fields. + @param [in] Ptr Pointer to the start of the buffer. + @param [in] AcpiTableLength Length of the ACPI table. + @param [in] AcpiTableRevision Revision of the ACPI table. +**/ +VOID +EFIAPI +ParseAcpiFpdt ( + IN BOOLEAN Trace, + IN UINT8 *Ptr, + IN UINT32 AcpiTableLength, + IN UINT8 AcpiTableRevision + ) +{ + EFI_ACPI_6_5_FPDT_PERFORMANCE_RECORD_HEADER *RecordHeader; + UINT32 Offset; + UINT8 *RecordPtr; + + if (!Trace) { + return; + } + + Offset = ParseAcpi ( + TRUE, + 0, + "FPDT", + Ptr, + AcpiTableLength, + PARSER_PARAMS (mFpdtParser) + ); + + RecordPtr = Ptr + Offset; + + while (Offset < AcpiTableLength) { + RecordHeader = (EFI_ACPI_6_5_FPDT_PERFORMANCE_RECORD_HEADER *)RecordPtr; + + switch (RecordHeader->Type) { + case EFI_ACPI_6_5_FPDT_RECORD_TYPE_FIRMWARE_BASIC_BOOT_POINTER: + ParseAcpi ( + TRUE, + 2, + "FPDT Boot Performance Pointer Record", + RecordPtr, + RecordHeader->Length, + PARSER_PARAMS (mFpdtBootPerfPointerParser) + ); + break; + case EFI_ACPI_6_5_FPDT_RECORD_TYPE_S3_PERFORMANCE_TABLE_POINTER: + ParseAcpi ( + TRUE, + 2, + "FPDT S3 Performance Table Pointer Record", + RecordPtr, + RecordHeader->Length, + PARSER_PARAMS (mFpdtS3PerfPointerParser) + ); + break; + default: + /// Parse the reserved record types + ParseAcpi ( + TRUE, + 2, + "FPDT Performance Record", + RecordPtr, + RecordHeader->Length, + PARSER_PARAMS (mFpdtPerfRecordParser) + ); + break; + } + + Offset += RecordHeader->Length; + RecordPtr += RecordHeader->Length; + } +} diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c index 53c7c4b49898..12e3940a0548 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.c @@ -3,6 +3,8 @@ Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. Copyright (c) 2016 - 2023, Arm Limited. All rights reserved.
    + Copyright (C) 2025 - 2026 Advanced Micro Devices, Inc. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -60,6 +62,7 @@ ACPI_TABLE_PARSER ParserList[] = { { EFI_ACPI_6_4_ERROR_RECORD_SERIALIZATION_TABLE_SIGNATURE, ParseAcpiErst }, { EFI_ACPI_6_3_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE, ParseAcpiFacs }, { EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiFadt }, + { EFI_ACPI_6_5_FIRMWARE_PERFORMANCE_DATA_TABLE_SIGNATURE, ParseAcpiFpdt }, { EFI_ACPI_6_4_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiGtdt }, { EFI_ACPI_6_5_HARDWARE_ERROR_SOURCE_TABLE_SIGNATURE, ParseAcpiHest }, { EFI_ACPI_6_4_HETEROGENEOUS_MEMORY_ATTRIBUTE_TABLE_SIGNATURE, ParseAcpiHmat }, diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf index 432117f381fe..1a42b73169a3 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.inf @@ -3,6 +3,7 @@ # # Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. # Copyright (c) 2016 - 2024, Arm Limited. All rights reserved.
    +# Copyright (C) 2025 - 2026 Advanced Micro Devices, Inc. All rights reserved. # # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -38,6 +39,7 @@ Parsers/Erst/ErstParser.c Parsers/Facs/FacsParser.c Parsers/Fadt/FadtParser.c + Parsers/Fpdt/FpdtParser.c Parsers/Gtdt/GtdtParser.c Parsers/Hest/HestParser.c Parsers/Hmat/HmatParser.c From 300dada916aa9492d5fe52693e9d6fd84adccdf3 Mon Sep 17 00:00:00 2001 From: Khalid Ali Date: Thu, 25 Dec 2025 16:24:47 +0000 Subject: [PATCH 1106/1172] MdeModulePkg/Core: Make PPI services spec complaint The documentation of InstallPpi() and NotifyPpi() in both the spec and function comment indicate to return EFI_OUT_OF_RESOURCES if memory allocation fails. However, the implementation of those two services assert if memory allocation fails. This is a mismatch between what the function expected to return and what actually returns. Fix this by returning EFI_OUT_OF_RESOURCES if memory allocation fails, so the code matches the documentation and comply with the spec. It is expected service consumers(callers of these functions) to handle failures appriciately. Signed-off-by: Khalid Ali --- MdeModulePkg/Core/Pei/Ppi/Ppi.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/MdeModulePkg/Core/Pei/Ppi/Ppi.c b/MdeModulePkg/Core/Pei/Ppi/Ppi.c index df2cb9221d1e..ad77481b3b1f 100644 --- a/MdeModulePkg/Core/Pei/Ppi/Ppi.c +++ b/MdeModulePkg/Core/Pei/Ppi/Ppi.c @@ -493,7 +493,11 @@ InternalPeiInstallPpi ( TempPtr = AllocateZeroPool ( sizeof (PEI_PPI_LIST_POINTERS) * (PpiListPointer->MaxCount + PPI_GROWTH_STEP) ); - ASSERT (TempPtr != NULL); + if (TempPtr == NULL) { + ASSERT (TempPtr != NULL); + return EFI_OUT_OF_RESOURCES; + } + CopyMem ( TempPtr, PpiListPointer->PpiPtrs, @@ -782,7 +786,11 @@ InternalPeiNotifyPpi ( TempPtr = AllocateZeroPool ( sizeof (PEI_PPI_LIST_POINTERS) * (CallbackNotifyListPointer->MaxCount + CALLBACK_NOTIFY_GROWTH_STEP) ); - ASSERT (TempPtr != NULL); + if (TempPtr == NULL) { + ASSERT (TempPtr != NULL); + return EFI_OUT_OF_RESOURCES; + } + CopyMem ( TempPtr, CallbackNotifyListPointer->NotifyPtrs, @@ -803,7 +811,11 @@ InternalPeiNotifyPpi ( TempPtr = AllocateZeroPool ( sizeof (PEI_PPI_LIST_POINTERS) * (DispatchNotifyListPointer->MaxCount + DISPATCH_NOTIFY_GROWTH_STEP) ); - ASSERT (TempPtr != NULL); + if (TempPtr == NULL) { + ASSERT (TempPtr != NULL); + return EFI_OUT_OF_RESOURCES; + } + CopyMem ( TempPtr, DispatchNotifyListPointer->NotifyPtrs, From f6489621b8ae1164c5e4930902988ba7c86847ba Mon Sep 17 00:00:00 2001 From: Alok Kulkarni Date: Thu, 15 Jan 2026 22:37:14 +0000 Subject: [PATCH 1107/1172] MdeModulePkg: PciBusDxe: Degrade MEM64 to PMEM64 when bridge lacks MEM64 P2P bridge Memory Base/Limit registers (0x20-0x22) only support 32-bit addresses. Previously, MEM64 resources behind such bridges were always degraded to MEM32, forcing allocation below 4GB. This can lead to resource constraints when using massive storage (such as MPF drives) as MEM32 space is limited on most platforms. Based on PCIe Base Specification 6.3+, assigning 64-bit resources irrespective of the prefetchable/non-prefetchable BAR bit is allowed. In DegradeResource(), if an upstream bridge supports PMEM64, MEM64 resources are now degraded to PMEM64 first. This enables 64-bit BAR allocation for devices like NVMe controllers that declare non- prefetchable 64-bit BARs. We still fall back to MEM32 degradation if the bridge lacks PMEM64 support as well. Ref: PCI-SIG ECN "Removing Prefetchable Terminology" (2024-04-05) Ref: PCIe Base Specification 6.3+ Signed-off-by: Kun Qin --- .../Bus/Pci/PciBusDxe/PciResourceSupport.c | 45 ++++++++++++++++--- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c index 8ffd05f327d0..2859cbdf30c4 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c @@ -1000,6 +1000,19 @@ ResourcePaddingPolicy ( PMEM64 -> PMEM32 -> MEM32 IO32 -> IO16. + Additionally, if the upstream bridge supports PMEM64 but not MEM64, + MEM64 resources are degraded to PMEM64 to enable 64-bit allocation + through the bridge's prefetchable window. So the below degradation + path is also now supported: + + MEM64 -> PMEM64 + + This is safe per PCI-SIG's ECN title "Removing Prefetchable Terminology" + (2024-04-05). + + The terms prefetchable and non-prefetchable have also been removed from + the PCIe base specification starting with version 6.3. + @param Bridge Pci device instance. @param Mem32Node Resource info node for 32-bit memory. @param PMem32Node Resource info node for 32-bit Prefetchable Memory. @@ -1090,14 +1103,34 @@ DegradeResource ( ); } else { // - // if the bridge does not support MEM64, degrade MEM64 to MEM32 + // If the upstream bridge does not support MEM64, check if we can + // degrade to PMEM64 first, instead of degrading to MEM32 directly. + // + // This is allowed per PCIe Base Spec 6.3+ which removes the terms + // prefetchable/non-prefetchable from the specification. + // The distinction originally only described P2P bridge read-ahead + // behavior, not resource allocation policy. + // + // We will still fall back and degrade to MEM32 if the upstream + // bridge lacks PMEM64 support. + // + // Refer to PCI-SIG ECN "Removing Prefetchable Terminology" + // (2024-04-05) for more details. // if (!BridgeSupportResourceDecode (Bridge, EFI_BRIDGE_MEM64_DECODE_SUPPORTED)) { - MergeResourceTree ( - Mem32Node, - Mem64Node, - TRUE - ); + if (BridgeSupportResourceDecode (Bridge, EFI_BRIDGE_PMEM64_DECODE_SUPPORTED)) { + MergeResourceTree ( + PMem64Node, + Mem64Node, + TRUE + ); + } else { + MergeResourceTree ( + Mem32Node, + Mem64Node, + TRUE + ); + } } // From 1a261da766ef14f6dea157d4a5362e84a755023f Mon Sep 17 00:00:00 2001 From: Paul Grimes Date: Wed, 28 Jan 2026 12:31:06 -0600 Subject: [PATCH 1108/1172] MdeModulePkg/UsbMassStorageDxe: Add retry mechanism to UsbMassReadBlocks Add a retry mechanism to UsbMassReadBlocks() to improve robustness when reading from USB mass storage devices. Some USB devices may experience transient failures during read operations that can be recovered by resetting the device and retrying. The implementation: - Saves original buffer parameters (Buffer, Lba, BufferSize) - Attempts the read operation up to 4 times (initial + 3 retries) - Resets the device via UsbMassReset() before each retry - Restores buffer parameters before each retry attempt This change is compliant with USB Mass Storage Class Bulk-Only Transport Spec Rev 1.0: - Section 5.3.4: Defines Reset Recovery procedure - Section 3.1: States device is ready for next CBW after reset Cc: Liming Gao Cc: Jacek Kolakowski Signed-off-by: Paul Grimes --- .../Bus/Usb/UsbMassStorageDxe/UsbMassImpl.c | 117 ++++++++++-------- 1 file changed, 68 insertions(+), 49 deletions(-) diff --git a/MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassImpl.c b/MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassImpl.c index 9c5fd4e16b02..1535b24a6ff9 100644 --- a/MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassImpl.c +++ b/MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassImpl.c @@ -2,6 +2,7 @@ USB Mass Storage Driver that manages USB Mass Storage Device and produces Block I/O Protocol. Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
    +Copyright (C) 2024 - 2026, Advanced Micro Devices, Inc. All rights reserved.
    SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -106,6 +107,10 @@ UsbMassReadBlocks ( EFI_STATUS Status; EFI_TPL OldTpl; UINTN TotalBlock; + INT8 ResetRetryCount; + VOID *OriginalBuffer; + EFI_LBA OriginalLba; + UINTN OriginalBufferSize; // // Raise TPL to TPL_CALLBACK to serialize all its operations @@ -115,65 +120,79 @@ UsbMassReadBlocks ( UsbMass = USB_MASS_DEVICE_FROM_BLOCK_IO (This); Media = &UsbMass->BlockIoMedia; - // - // If it is a removable media, such as CD-Rom or Usb-Floppy, - // need to detect the media before each read/write. While some of - // Usb-Flash is marked as removable media. - // - if (Media->RemovableMedia) { - Status = UsbBootDetectMedia (UsbMass); - if (EFI_ERROR (Status)) { - goto ON_EXIT; + ResetRetryCount = 3; + OriginalBuffer = Buffer; + OriginalBufferSize = BufferSize; + OriginalLba = Lba; + + while (ResetRetryCount >= 0) { + Buffer = OriginalBuffer; + Lba = OriginalLba; + BufferSize = OriginalBufferSize; + + // + // If it is a removable media, such as CD-Rom or Usb-Floppy, + // need to detect the media before each read/write. While some of + // Usb-Flash is marked as removable media. + // + if (Media->RemovableMedia) { + Status = UsbBootDetectMedia (UsbMass); + if (EFI_ERROR (Status)) { + goto ON_EXIT; + } } - } - if (!(Media->MediaPresent)) { - Status = EFI_NO_MEDIA; - goto ON_EXIT; - } + if (!(Media->MediaPresent)) { + Status = EFI_NO_MEDIA; + goto ON_EXIT; + } - if (MediaId != Media->MediaId) { - Status = EFI_MEDIA_CHANGED; - goto ON_EXIT; - } + if (MediaId != Media->MediaId) { + Status = EFI_MEDIA_CHANGED; + goto ON_EXIT; + } - if (BufferSize == 0) { - Status = EFI_SUCCESS; - goto ON_EXIT; - } + if (BufferSize == 0) { + Status = EFI_SUCCESS; + goto ON_EXIT; + } - if (Buffer == NULL) { - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } + if (Buffer == NULL) { + Status = EFI_INVALID_PARAMETER; + goto ON_EXIT; + } - // - // BufferSize must be a multiple of the intrinsic block size of the device. - // - if ((BufferSize % Media->BlockSize) != 0) { - Status = EFI_BAD_BUFFER_SIZE; - goto ON_EXIT; - } + // + // BufferSize must be a multiple of the intrinsic block size of the device. + // + if ((BufferSize % Media->BlockSize) != 0) { + Status = EFI_BAD_BUFFER_SIZE; + goto ON_EXIT; + } - TotalBlock = BufferSize / Media->BlockSize; + TotalBlock = BufferSize / Media->BlockSize; - // - // Make sure the range to read is valid. - // - if (Lba + TotalBlock - 1 > Media->LastBlock) { - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } + // + // Make sure the range to read is valid. + // + if (Lba + TotalBlock - 1 > Media->LastBlock) { + Status = EFI_INVALID_PARAMETER; + goto ON_EXIT; + } - if (UsbMass->Cdb16Byte) { - Status = UsbBootReadWriteBlocks16 (UsbMass, FALSE, Lba, TotalBlock, Buffer); - } else { - Status = UsbBootReadWriteBlocks (UsbMass, FALSE, (UINT32)Lba, TotalBlock, Buffer); - } + if (UsbMass->Cdb16Byte) { + Status = UsbBootReadWriteBlocks16 (UsbMass, FALSE, Lba, TotalBlock, Buffer); + } else { + Status = UsbBootReadWriteBlocks (UsbMass, FALSE, (UINT32)Lba, TotalBlock, Buffer); + } - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "UsbMassReadBlocks: UsbBootReadBlocks (%r) -> Reset\n", Status)); - UsbMassReset (This, TRUE); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "UsbMassReadBlocks: UsbBootReadBlocks (%r) -> Reset\n", Status)); + UsbMassReset (This, TRUE); + ResetRetryCount--; + } else { + break; + } } ON_EXIT: From c2915d24a1832138b5f680b31612bf6198adfb5f Mon Sep 17 00:00:00 2001 From: PaddyDeng Date: Mon, 19 Jan 2026 11:26:25 +0800 Subject: [PATCH 1109/1172] BaseTools: Prevent Subsection PCDs from polluting global expressions The PCD value defined in module subsections can be added to global PCD database. Therefore the unsolved expressions, even belongs to the global scope, can incorrectly refer to the value from module subsection. This only happens when the referred PCD has no value assignment in the platform dsc file. Which also should raise an error. Signed-off-by: Paddy Deng --- BaseTools/Source/Python/Workspace/MetaFileParser.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py b/BaseTools/Source/Python/Workspace/MetaFileParser.py index 5d2a44481dc7..512b17235253 100644 --- a/BaseTools/Source/Python/Workspace/MetaFileParser.py +++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py @@ -1702,8 +1702,9 @@ def __ProcessPcd(self): ValList[Index] = '0' if (not self._DirectiveEvalStack) or (False not in self._DirectiveEvalStack): - GlobalData.gPlatformPcds[TAB_SPLIT.join(self._ValueList[0:2])] = PcdValue - self._Symbols[TAB_SPLIT.join(self._ValueList[0:2])] = PcdValue + if not self._InSubsection: + GlobalData.gPlatformPcds[TAB_SPLIT.join(self._ValueList[0:2])] = PcdValue + self._Symbols[TAB_SPLIT.join(self._ValueList[0:2])] = PcdValue try: self._ValueList[2] = '|'.join(ValList) except Exception: From fe436902cc6070d0b04c1087c1ecb34bb211a23e Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 29 Jan 2026 11:37:36 -0800 Subject: [PATCH 1110/1172] EmulatorPkg: Remove Hash2DxeCrypto if NETWORK_ENABLE=FALSE Hash2DxeCrypto produces a protocol that is only used by TcpDxe when NETWORK_ENABLE=TRUE. Hash2DxeCrypto is the only module in EmulatorPkg platforms that depends on BaseCryptLib and OpensslLib. EmulatorPkg platform build times can be reduced when NETWORK_ENABLE=FALSE by only including Hash2DxeCrypto.inf if NETWORK_ENABLE=TRUE. This reduces the time to build EmulatorPkg for CI and local developer builds. Add !if around PcdOpensslLibAssemblySourceStyleNasm settings and CryptoPkg includes. When both NETWORK_ENABLE and SECURE_BOOT_ENABLE are FALSE, the CryptoPkg libraries will no longer be used at all. This means any references to CryptoPkg PCDs must be removed when both NETWORK_ENABLE and SECURE_BOOT_ENABLE are FALSE. Otherwise a build error is generated. Also remove use of NETWORK_SUPPORT from DSC/FDF file that is never set and update build.sh to use default of NETWORK_ENABLE=FALSE. Signed-off-by: Michael D Kinney --- EmulatorPkg/EmulatorPkg.dsc | 29 ++++++++++++++++++++--------- EmulatorPkg/EmulatorPkg.fdf | 5 +++-- EmulatorPkg/build.sh | 2 +- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/EmulatorPkg/EmulatorPkg.dsc b/EmulatorPkg/EmulatorPkg.dsc index 119743ccd841..5792637bc8cc 100644 --- a/EmulatorPkg/EmulatorPkg.dsc +++ b/EmulatorPkg/EmulatorPkg.dsc @@ -49,10 +49,27 @@ 0|DEFAULT !include MdePkg/MdeLibs.dsc.inc -!include CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc !include RedfishPkg/Redfish.dsc.inc !include NetworkPkg/Network.dsc.inc +# +# Do not reference CryptoPkg PCDs if features are not enabled that depend on the +# CryptoPkg libraries or modules. Otherwise a build error for a reference to an +# unused PCD is generated. +# +!if $(SECURE_BOOT_ENABLE) == TRUE || $(NETWORK_ENABLE) == TRUE +!include CryptoPkg/CryptoPkgFeatureFlagPcds.dsc.inc +!if $(WIN_MINGW32_BUILD) +[PcdsFeatureFlag] + # + # When WIN_MINGW32_BUILD is set, -target is set to build Windows application. + # Set PcdOpensslLibAssemblySourceStyleNasm to TRUE to use Openssl NASM + # source files that assume a Windows calling convention. + # + gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm|TRUE +!endif +!endif + [LibraryClasses] # # Entry point @@ -227,14 +244,6 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreImageLoaderSearchTeSectionFirst|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables|FALSE gEmulatorPkgTokenSpaceGuid.PcdEmulatorLazyLoadSymbols|FALSE -!if $(WIN_MINGW32_BUILD) - # - # When WIN_MINGW32_BUILD is set, -target is set to build Windows application. - # Set PcdOpensslLibAssemblySourceStyleNasm to TRUE to use Openssl NASM - # source files that assume a Windows calling convention. - # - gEfiCryptoPkgTokenSpaceGuid.PcdOpensslLibAssemblySourceStyleNasm|TRUE -!endif [PcdsFixedAtBuild] gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy|0x00000000 @@ -421,7 +430,9 @@ # # Hash2 Protocol producer # +!if $(NETWORK_ENABLE) == TRUE SecurityPkg/Hash2DxeCrypto/Hash2DxeCrypto.inf +!endif !if $(SECURE_BOOT_ENABLE) == TRUE SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf diff --git a/EmulatorPkg/EmulatorPkg.fdf b/EmulatorPkg/EmulatorPkg.fdf index fa73250f99de..f8311d248da7 100644 --- a/EmulatorPkg/EmulatorPkg.fdf +++ b/EmulatorPkg/EmulatorPkg.fdf @@ -178,7 +178,6 @@ INF EmulatorPkg/EmuBusDriverDxe/EmuBusDriverDxe.inf INF EmulatorPkg/EmuGopDxe/EmuGopDxe.inf INF EmulatorPkg/EmuSimpleFileSystemDxe/EmuSimpleFileSystemDxe.inf INF EmulatorPkg/EmuBlockIoDxe/EmuBlockIoDxe.inf -INF EmulatorPkg/EmuSnpDxe/EmuSnpDxe.inf INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf INF MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf @@ -201,7 +200,9 @@ INF SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf # # Hash2 Protocol producer # +!if $(NETWORK_ENABLE) == TRUE INF SecurityPkg/Hash2DxeCrypto/Hash2DxeCrypto.inf +!endif # # Secure Boot Key Enroll @@ -213,7 +214,7 @@ INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.in # # Network stack drivers # -!if $(NETWORK_SUPPORT) +!if $(NETWORK_ENABLE) INF EmulatorPkg/EmuSnpDxe/EmuSnpDxe.inf !endif !include NetworkPkg/Network.fdf.inc diff --git a/EmulatorPkg/build.sh b/EmulatorPkg/build.sh index 8373087803a2..4572c2ad0051 100755 --- a/EmulatorPkg/build.sh +++ b/EmulatorPkg/build.sh @@ -43,7 +43,7 @@ LAST_ARG= RUN_EMULATOR=no CLEAN_TYPE=none TARGET_TOOLS=GCC48 -NETWORK_SUPPORT= +NETWORK_SUPPORT=-D NETWORK_ENABLE=FALSE BUILD_NEW_SHELL= BUILD_FAT= HOST_PROCESSOR=X64 From 1840588814313174112dc181bef87af0ed32a387 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 28 Jan 2026 09:23:55 -0800 Subject: [PATCH 1111/1172] EmulatorPkg/PlatformCI: Set WIN_MINGW32_BUILD Add logic to set WIN_MINGW32_BUILD to the same value that is set in build.py. This is required because the stuart DSC parser runs before build.py and this variable is used in EmulatorPkg.dsc and the stuart DSC parser must get the same result as build.py or the MINGW builds using stuart do not work. This matches the same method used for WIN_HOST_BUILD. Remove the following settings that are set but never used: * -D BUILD_32 * -D BUILD_64 * BLD_*_BUILD_IA32 * BLD_*_BUILD_X64 * HOST_DLINK_PATHS Signed-off-by: Michael D Kinney --- EmulatorPkg/PlatformCI/PlatformBuild.py | 52 ++++++------------------- EmulatorPkg/build.sh | 30 ++------------ 2 files changed, 15 insertions(+), 67 deletions(-) diff --git a/EmulatorPkg/PlatformCI/PlatformBuild.py b/EmulatorPkg/PlatformCI/PlatformBuild.py index 7cbd935558b2..4afe956cfd88 100644 --- a/EmulatorPkg/PlatformCI/PlatformBuild.py +++ b/EmulatorPkg/PlatformCI/PlatformBuild.py @@ -75,7 +75,8 @@ def GetRequiredSubmodules(self): _, _, path = line.partition(" ") if path is not None: if path not in [x.path for x in rs]: - rs.append(RequiredSubmodule(path, True)) # add it with recursive since we don't know + # add it without recursive since no dependencies expected + rs.append(RequiredSubmodule(path, False)) return rs def SetArchitectures(self, list_of_requested_architectures): @@ -196,20 +197,20 @@ def SetPlatformEnv(self): elif self.env.GetValue("TARGET_ARCH") == "X64": shell_environment.ShellEnvironment().set_shell_var(key, "x64") - # Add support for using the correct Platform Headers, tools, and Libs based on emulator architecture - # requested to be built when building on linux. - if GetHostInfo().os.upper() == "LINUX": - self.ConfigureLinuxDLinkPath() - + # + # Set environment variable set by build that are used in EmulatorPkg.dsc + # This is required for the stuart DSC parser that is run before build + # to pick up the correct settings. + # if GetHostInfo().os.upper() == "WINDOWS": - self.env.SetValue("BLD_*_WIN_HOST_BUILD", "TRUE", - "Trigger Windows host build") + self.env.SetValue("WIN_HOST_BUILD", "TRUE", "Windows env detected") + clang_bin = os.getenv("CLANG_BIN") + if clang_bin: + if os.path.exists(os.path.join(clang_bin, "mingw32-make.exe")): + self.env.SetValue("WIN_MINGW32_BUILD", "TRUE", "Windows MinGW env detected") self.env.SetValue("MAKE_STARTUP_NSH", "FALSE", "Default to false") - # I don't see what this does but it is in build.sh - key = "BLD_*_BUILD_" + self.env.GetValue("TARGET_ARCH") - self.env.SetValue(key, "TRUE", "match script in build.sh") return 0 def PlatformPreBuild(self): @@ -240,32 +241,3 @@ def FlashRomImage(self): logging.critical("Unsupported Host") return -1 return RunCmd(cmd, "", workingdir=OutputPath) - - def ConfigureLinuxDLinkPath(self): - ''' - logic copied from build.sh to setup the correct libraries - ''' - if self.env.GetValue("TARGET_ARCH") == "IA32": - LIB_NAMES = ["ld-linux.so.2", "libdl.so.2 crt1.o", "crti.o crtn.o"] - LIB_SEARCH_PATHS = ["/usr/lib/i386-linux-gnu", - "/usr/lib32", "/lib32", "/usr/lib", "/lib"] - elif self.env.GetValue("TARGET_ARCH") == "X64": - LIB_NAMES = ["ld-linux-x86-64.so.2", - "libdl.so.2", "crt1.o", "crti.o", "crtn.o"] - LIB_SEARCH_PATHS = ["/usr/lib/x86_64-linux-gnu", - "/usr/lib64", "/lib64", "/usr/lib", "/lib"] - - HOST_DLINK_PATHS = "" - for lname in LIB_NAMES: - logging.debug(f"Looking for {lname}") - for dname in LIB_SEARCH_PATHS: - logging.debug(f"In {dname}") - if os.path.isfile(os.path.join(dname, lname)): - logging.debug(f"Found {lname} in {dname}") - HOST_DLINK_PATHS += os.path.join( - os.path.join(dname, lname)) + os.pathsep - break - HOST_DLINK_PATHS = HOST_DLINK_PATHS.rstrip(os.pathsep) - logging.critical(f"Setting HOST_DLINK_PATHS to {HOST_DLINK_PATHS}") - shell_environment.ShellEnvironment().set_shell_var( - "HOST_DLINK_PATHS", HOST_DLINK_PATHS) diff --git a/EmulatorPkg/build.sh b/EmulatorPkg/build.sh index 4572c2ad0051..79d5a47f0588 100755 --- a/EmulatorPkg/build.sh +++ b/EmulatorPkg/build.sh @@ -163,30 +163,6 @@ fi BUILD_OUTPUT_DIR=$WORKSPACE/Build/Emulator$PROCESSOR -case $PROCESSOR in - IA32) - ARCH_SIZE=32 - LIB_NAMES="ld-linux.so.2 libdl.so.2 crt1.o crti.o crtn.o" - LIB_SEARCH_PATHS="/usr/lib/i386-linux-gnu /usr/lib32 /lib32 /usr/lib /lib" - ;; - X64) - ARCH_SIZE=64 - LIB_NAMES="ld-linux-x86-64.so.2 libdl.so.2 crt1.o crti.o crtn.o" - LIB_SEARCH_PATHS="/usr/lib/x86_64-linux-gnu /usr/lib64 /lib64 /usr/lib /lib" - ;; -esac - -for libname in $LIB_NAMES -do - for dirname in $LIB_SEARCH_PATHS - do - if [ -e $dirname/$libname ]; then - export HOST_DLINK_PATHS="$HOST_DLINK_PATHS $dirname/$libname" - break - fi - done -done - PLATFORMFILE=$WORKSPACE/EmulatorPkg/EmulatorPkg.dsc BUILD_DIR="$BUILD_OUTPUT_DIR/${BUILDTARGET}_$TARGET_TOOLS" BUILD_ROOT_ARCH=$BUILD_DIR/$PROCESSOR @@ -242,10 +218,10 @@ esac # Build the edk2 EmulatorPkg # if [[ $HOST_TOOLS == $TARGET_TOOLS ]]; then - build -p $WORKSPACE/EmulatorPkg/EmulatorPkg.dsc $BUILD_OPTIONS -a $PROCESSOR -b $BUILDTARGET -t $TARGET_TOOLS -D BUILD_$ARCH_SIZE $NETWORK_SUPPORT $BUILD_NEW_SHELL $BUILD_FAT -n 3 + build -p $WORKSPACE/EmulatorPkg/EmulatorPkg.dsc $BUILD_OPTIONS -a $PROCESSOR -b $BUILDTARGET -t $TARGET_TOOLS $NETWORK_SUPPORT $BUILD_NEW_SHELL $BUILD_FAT -n 3 else - build -p $WORKSPACE/EmulatorPkg/EmulatorPkg.dsc $BUILD_OPTIONS -a $PROCESSOR -b $BUILDTARGET -t $HOST_TOOLS -D BUILD_$ARCH_SIZE -D SKIP_MAIN_BUILD -n 3 modules - build -p $WORKSPACE/EmulatorPkg/EmulatorPkg.dsc $BUILD_OPTIONS -a $PROCESSOR -b $BUILDTARGET -t $TARGET_TOOLS -D BUILD_$ARCH_SIZE $NETWORK_SUPPORT $BUILD_NEW_SHELL $BUILD_FAT -n 3 + build -p $WORKSPACE/EmulatorPkg/EmulatorPkg.dsc $BUILD_OPTIONS -a $PROCESSOR -b $BUILDTARGET -t $HOST_TOOLS -D SKIP_MAIN_BUILD -n 3 modules + build -p $WORKSPACE/EmulatorPkg/EmulatorPkg.dsc $BUILD_OPTIONS -a $PROCESSOR -b $BUILDTARGET -t $TARGET_TOOLS $NETWORK_SUPPORT $BUILD_NEW_SHELL $BUILD_FAT -n 3 cp "$BUILD_OUTPUT_DIR/${BUILDTARGET}_$HOST_TOOLS/$PROCESSOR/Host" $BUILD_ROOT_ARCH fi exit $? From 370b689176ccc719e582098e40365f0f253cb6ce Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Sun, 25 Jan 2026 14:08:33 -0800 Subject: [PATCH 1112/1172] OvmfPkg: Remove Hash2DxeCrypto if NETWORK_ENABLE=FALSE Hash2DxeCrypto produces a protocol that is only used by TcpDxe when NETWORK_ENABLE=TRUE. Hash2DxeCrypto is the only module in OvmfPkg platforms that depends on BaseCryptLib and OpensslLib. OvmfPkg platform build times can be reduced when NETWORK_ENABLE=FALSE by only including Hash2DxeCrypto.inf if NETWORK_ENABLE=TRUE. This reduces the time to build OvmfPkg for CI and local developer builds. Signed-off-by: Michael D Kinney --- OvmfPkg/OvmfPkgIa32X64.dsc | 2 ++ OvmfPkg/OvmfPkgIa32X64.fdf | 4 +++- OvmfPkg/OvmfPkgX64.dsc | 2 ++ OvmfPkg/OvmfPkgX64.fdf | 4 +++- OvmfPkg/OvmfXen.dsc | 2 ++ OvmfPkg/OvmfXen.fdf | 4 +++- 6 files changed, 15 insertions(+), 3 deletions(-) diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc index 5b2f51e49ac6..992a07772fc6 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc @@ -880,7 +880,9 @@ # # Hash2 Protocol producer # +!if $(NETWORK_ENABLE) == TRUE SecurityPkg/Hash2DxeCrypto/Hash2DxeCrypto.inf +!endif # # Network Support diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf index 99729ead9b9e..c51721cf76d1 100644 --- a/OvmfPkg/OvmfPkgIa32X64.fdf +++ b/OvmfPkg/OvmfPkgIa32X64.fdf @@ -261,7 +261,9 @@ INF MdeModulePkg/Logo/LogoDxe.inf # # Hash2 Protocol producer # -INF SecurityPkg/Hash2DxeCrypto/Hash2DxeCrypto.inf +!if $(NETWORK_ENABLE) == TRUE + INF SecurityPkg/Hash2DxeCrypto/Hash2DxeCrypto.inf +!endif # # Network modules diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index 9a9565122399..ad5f31b38e26 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -1013,7 +1013,9 @@ # # Hash2 Protocol producer # +!if $(NETWORK_ENABLE) == TRUE SecurityPkg/Hash2DxeCrypto/Hash2DxeCrypto.inf +!endif # # Network Support diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf index fef0b63f4f6e..e4f6995e4d75 100644 --- a/OvmfPkg/OvmfPkgX64.fdf +++ b/OvmfPkg/OvmfPkgX64.fdf @@ -279,7 +279,9 @@ INF OvmfPkg/TdxDxe/TdxDxe.inf # # Hash2 Protocol producer # -INF SecurityPkg/Hash2DxeCrypto/Hash2DxeCrypto.inf +!if $(NETWORK_ENABLE) == TRUE + INF SecurityPkg/Hash2DxeCrypto/Hash2DxeCrypto.inf +!endif # # Network modules diff --git a/OvmfPkg/OvmfXen.dsc b/OvmfPkg/OvmfXen.dsc index 4e99acb80062..64f66168a4b6 100644 --- a/OvmfPkg/OvmfXen.dsc +++ b/OvmfPkg/OvmfXen.dsc @@ -670,7 +670,9 @@ # # Hash2 Protocol producer # +!if $(NETWORK_ENABLE) == TRUE SecurityPkg/Hash2DxeCrypto/Hash2DxeCrypto.inf +!endif # # Network Support diff --git a/OvmfPkg/OvmfXen.fdf b/OvmfPkg/OvmfXen.fdf index 7821a574fcec..1cbe6b376a9a 100644 --- a/OvmfPkg/OvmfXen.fdf +++ b/OvmfPkg/OvmfXen.fdf @@ -315,7 +315,9 @@ INF SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf # # Hash2 Protocol producer # -INF SecurityPkg/Hash2DxeCrypto/Hash2DxeCrypto.inf +!if $(NETWORK_ENABLE) == TRUE + INF SecurityPkg/Hash2DxeCrypto/Hash2DxeCrypto.inf +!endif # # Network modules From 7916a6ccb7329517036141a20e735899b8dda875 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 20 Jan 2026 17:18:07 +0100 Subject: [PATCH 1113/1172] OvmfPkg/MemDebugLogPeiLib: drop duplicate MemDebugLogWrite function The MemDebugLogWrite() function is identical in MemDebugLogPei.c and MemDebugLogPeiCore.c So drop it from MemDebugLogPei.c and simply add MemDebugLogPeiCore.c to MemDebugLogPeiLib.inf instead. Signed-off-by: Gerd Hoffmann --- .../Library/MemDebugLogLib/MemDebugLogPei.c | 41 ------------------- .../MemDebugLogLib/MemDebugLogPeiLib.inf | 1 + 2 files changed, 1 insertion(+), 41 deletions(-) diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPei.c b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPei.c index 05e32daf1ca0..d1beb74487dd 100644 --- a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPei.c +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPei.c @@ -12,47 +12,6 @@ #include #include -EFI_STATUS -EFIAPI -MemDebugLogWrite ( - IN CHAR8 *Buffer, - IN UINTN Length - ) -{ - EFI_PHYSICAL_ADDRESS MemDebugLogBufAddr; - EFI_STATUS Status; - - // - // Obtain the Memory Debug Log buffer addr from HOB - // NOTE: This is expected to fail until the HOB is created. - // - Status = MemDebugLogAddrFromHOB (&MemDebugLogBufAddr); - - if (EFI_ERROR (Status)) { - MemDebugLogBufAddr = 0; - } - - if (MemDebugLogBufAddr != 0) { - Status = MemDebugLogWriteBuffer (MemDebugLogBufAddr, Buffer, Length); - } else { - // - // HOB has not yet been created, so - // write to the early debug log buffer. - // - if (FixedPcdGet32 (PcdOvmfEarlyMemDebugLogBase) != 0x0) { - Status = MemDebugLogWriteBuffer ( - (EFI_PHYSICAL_ADDRESS)(UINTN)FixedPcdGet32 (PcdOvmfEarlyMemDebugLogBase), - Buffer, - Length - ); - } else { - Status = EFI_NOT_FOUND; - } - } - - return Status; -} - UINT32 EFIAPI MemDebugLogPages ( diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf index b6b407c89191..6a954d1d8c0e 100644 --- a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf @@ -19,6 +19,7 @@ [Sources] MemDebugLogPei.c + MemDebugLogPeiCore.c MemDebugLogCommon.c [Packages] From 37857f41c675fc4fdd876306ea2dfe7f1603e6c6 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 20 Jan 2026 17:17:16 +0100 Subject: [PATCH 1114/1172] OvmfPkg/MemDebugLogPeiCoreLib: enable for PEIMs Allow PEIMs use the MemDebugLogPeiCoreLib lib. The difference between MemDebugLogPeiCoreLib and MemDebugLogPeiLib is that the latter does additionally provide the MemDebugLogPages() function, and pulls in QemuFwCfg* libraries as dependency. Most PEIMs do not need MemDebugLogPages() though, only the ones which handle the setup of the memory logging buffer do. Signed-off-by: Gerd Hoffmann --- OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCoreLib.inf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCoreLib.inf b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCoreLib.inf index 56908caa5a7f..12aa04417929 100644 --- a/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCoreLib.inf +++ b/OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCoreLib.inf @@ -14,7 +14,7 @@ FILE_GUID = EEAF8A01-167A-4222-A647-80EB16AEEC69 MODULE_TYPE = BASE VERSION_STRING = 1.0 - LIBRARY_CLASS = MemDebugLogLib|PEI_CORE + LIBRARY_CLASS = MemDebugLogLib|PEI_CORE PEIM [Sources] From 5ededcd630b4dea50bb87b6d9a2f118c235410b7 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 20 Jan 2026 17:16:03 +0100 Subject: [PATCH 1115/1172] ArmVirtPkg: use MemDebugLogPeiCoreLib for PEIMs Switch PEIMs from MemDebugLogPeiLib to MemDebugLogPeiCoreLib, except for the MemDebugLog PEIM which needs the MemDebugLogPages() function. Signed-off-by: Gerd Hoffmann --- ArmVirtPkg/ArmVirtQemu.dsc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc index 4d4521e3419a..a38a1d8d18ab 100644 --- a/ArmVirtPkg/ArmVirtQemu.dsc +++ b/ArmVirtPkg/ArmVirtQemu.dsc @@ -114,7 +114,7 @@ Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioPeiLib.inf !if $(DEBUG_TO_MEM) - MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCoreLib.inf !else MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf !endif @@ -367,7 +367,10 @@ ArmPkg/Drivers/CpuPei/CpuPei.inf !if $(DEBUG_TO_MEM) - OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf + OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf { + + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf + } !endif !if $(TPM2_ENABLE) == TRUE From 27143a8233f21233d5e1bf87b8e3a33db2e711e6 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 21 Jan 2026 12:35:59 +0100 Subject: [PATCH 1116/1172] OvmfPkg: use MemDebugLogPeiCoreLib for PEIMs Switch PEIMs from MemDebugLogPeiLib to MemDebugLogPeiCoreLib, except for the MemDebugLog and PlatformPei PEIMs which need the MemDebugLogPages() function. Signed-off-by: Gerd Hoffmann --- OvmfPkg/OvmfPkgIa32X64.dsc | 14 +++++++++++--- OvmfPkg/OvmfPkgX64.dsc | 14 +++++++++++--- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc index 992a07772fc6..de78bf327249 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc @@ -312,7 +312,7 @@ DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf !endif !if $(DEBUG_TO_MEM) - MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCoreLib.inf !endif PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf ResourcePublicationLib|MdePkg/Library/PeiResourcePublicationLib/PeiResourcePublicationLib.inf @@ -707,7 +707,10 @@ # MdeModulePkg/Core/Pei/PeiMain.inf !if $(DEBUG_TO_MEM) - OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf + OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf { + + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf + } !endif MdeModulePkg/Universal/PCD/Pei/Pcd.inf { @@ -723,7 +726,12 @@ } MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf - OvmfPkg/PlatformPei/PlatformPei.inf + OvmfPkg/PlatformPei/PlatformPei.inf { + +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf +!endif + } UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf { diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index ad5f31b38e26..94c639be1380 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -344,7 +344,7 @@ DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf !endif !if $(DEBUG_TO_MEM) - MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCoreLib.inf !endif PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf ResourcePublicationLib|MdePkg/Library/PeiResourcePublicationLib/PeiResourcePublicationLib.inf @@ -787,7 +787,10 @@ # MdeModulePkg/Core/Pei/PeiMain.inf !if $(DEBUG_TO_MEM) - OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf + OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf { + + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf + } !endif MdeModulePkg/Universal/PCD/Pei/Pcd.inf { @@ -803,7 +806,12 @@ } MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf - OvmfPkg/PlatformPei/PlatformPei.inf + OvmfPkg/PlatformPei/PlatformPei.inf { + +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf +!endif + } UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf { From d04e5c6c5284ba3a3c5db79d73ba2debdaef22e3 Mon Sep 17 00:00:00 2001 From: Luigi Leonardi Date: Tue, 13 Jan 2026 05:28:10 -0500 Subject: [PATCH 1117/1172] OvmfPkg/AmdSev: add memory debug log support Enable memory-based debug logging support when `DEBUG_TO_MEM` build flag is set. Signed-off-by: Luigi Leonardi --- OvmfPkg/AmdSev/AmdSevX64.dsc | 23 +++++++++++++++++++++++ OvmfPkg/AmdSev/AmdSevX64.fdf | 3 +++ 2 files changed, 26 insertions(+) diff --git a/OvmfPkg/AmdSev/AmdSevX64.dsc b/OvmfPkg/AmdSev/AmdSevX64.dsc index 8e7e69da0085..266c72580ae6 100644 --- a/OvmfPkg/AmdSev/AmdSevX64.dsc +++ b/OvmfPkg/AmdSev/AmdSevX64.dsc @@ -209,7 +209,11 @@ TdxLib|MdePkg/Library/TdxLib/TdxLib.inf TdxMailboxLib|OvmfPkg/Library/TdxMailboxLib/TdxMailboxLibNull.inf TdxHelperLib|OvmfPkg/IntelTdx/TdxHelperLib/TdxHelperLibNull.inf +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogDxeLib.inf +!else MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf +!endif [LibraryClasses.common.SEC] TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf @@ -218,6 +222,9 @@ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf !else DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf +!endif +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogSecLib.inf !endif ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf ExtractGuidedSectionLib|MdePkg/Library/BaseExtractGuidedSectionLib/BaseExtractGuidedSectionLib.inf @@ -246,6 +253,9 @@ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf !else DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf +!endif +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCoreLib.inf !endif PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf CcProbeLib|OvmfPkg/Library/CcProbeLib/SecPeiCcProbeLib.inf @@ -263,6 +273,9 @@ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf !else DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf +!endif +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf !endif PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf ResourcePublicationLib|MdePkg/Library/PeiResourcePublicationLib/PeiResourcePublicationLib.inf @@ -310,6 +323,9 @@ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf !else DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf +!endif +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogRtLib.inf !endif UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf BaseCryptLib|CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf @@ -566,6 +582,9 @@ # PEI Phase modules # MdeModulePkg/Core/Pei/PeiMain.inf +!if $(DEBUG_TO_MEM) + OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf +!endif MdeModulePkg/Universal/PCD/Pei/Pcd.inf { PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf @@ -602,6 +621,7 @@ MdeModulePkg/Universal/PCD/Dxe/Pcd.inf { PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf } MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf @@ -665,6 +685,9 @@ DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf +!endif } MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf diff --git a/OvmfPkg/AmdSev/AmdSevX64.fdf b/OvmfPkg/AmdSev/AmdSevX64.fdf index dbb733310e7e..f86005090dfd 100644 --- a/OvmfPkg/AmdSev/AmdSevX64.fdf +++ b/OvmfPkg/AmdSev/AmdSevX64.fdf @@ -96,6 +96,9 @@ APRIORI PEI { # # PEI Phase modules # +!if $(DEBUG_TO_MEM) +INF OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf +!endif INF MdeModulePkg/Core/Pei/PeiMain.inf INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf INF MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouterPei.inf From f9cd283aa1102eef6f1f88c875cc06cdffac2115 Mon Sep 17 00:00:00 2001 From: Luigi Leonardi Date: Tue, 13 Jan 2026 07:06:08 -0500 Subject: [PATCH 1118/1172] OvmfPkg/Microvm: add memory debug log support Enable memory-based debug logging support when `DEBUG_TO_MEM` build flag is set. Signed-off-by: Luigi Leonardi --- OvmfPkg/Microvm/MicrovmX64.dsc | 23 +++++++++++++++++++++++ OvmfPkg/Microvm/MicrovmX64.fdf | 3 +++ 2 files changed, 26 insertions(+) diff --git a/OvmfPkg/Microvm/MicrovmX64.dsc b/OvmfPkg/Microvm/MicrovmX64.dsc index 884d5a943259..0186456170dc 100644 --- a/OvmfPkg/Microvm/MicrovmX64.dsc +++ b/OvmfPkg/Microvm/MicrovmX64.dsc @@ -249,7 +249,11 @@ TdxLib|MdePkg/Library/TdxLib/TdxLib.inf TdxMailboxLib|OvmfPkg/Library/TdxMailboxLib/TdxMailboxLibNull.inf TdxHelperLib|OvmfPkg/IntelTdx/TdxHelperLib/TdxHelperLibNull.inf +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogDxeLib.inf +!else MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf +!endif [LibraryClasses.common.SEC] QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgSecLib.inf @@ -257,6 +261,9 @@ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf !else DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf +!endif +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogSecLib.inf !endif ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf ExtractGuidedSectionLib|MdePkg/Library/BaseExtractGuidedSectionLib/BaseExtractGuidedSectionLib.inf @@ -285,6 +292,9 @@ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf !else DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf +!endif +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiCoreLib.inf !endif PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf @@ -303,6 +313,9 @@ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf !else DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformRomDebugLibIoPort.inf +!endif +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogPeiLib.inf !endif PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf ResourcePublicationLib|MdePkg/Library/PeiResourcePublicationLib/PeiResourcePublicationLib.inf @@ -348,6 +361,9 @@ DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf !else DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf +!endif +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogRtLib.inf !endif UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf BaseCryptLib|CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf @@ -667,6 +683,9 @@ # PEI Phase modules # MdeModulePkg/Core/Pei/PeiMain.inf +!if $(DEBUG_TO_MEM) + OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf +!endif MdeModulePkg/Universal/PCD/Pei/Pcd.inf { PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf @@ -700,6 +719,7 @@ MdeModulePkg/Universal/PCD/Dxe/Pcd.inf { PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf } MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf @@ -767,6 +787,9 @@ DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf +!if $(DEBUG_TO_MEM) + MemDebugLogLib|OvmfPkg/Library/MemDebugLogLib/MemDebugLogLibNull.inf +!endif } MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf diff --git a/OvmfPkg/Microvm/MicrovmX64.fdf b/OvmfPkg/Microvm/MicrovmX64.fdf index 3986a8af193d..043e793e846b 100644 --- a/OvmfPkg/Microvm/MicrovmX64.fdf +++ b/OvmfPkg/Microvm/MicrovmX64.fdf @@ -96,6 +96,9 @@ APRIORI PEI { # # PEI Phase modules # +!if $(DEBUG_TO_MEM) + INF OvmfPkg/MemDebugLogPei/MemDebugLogPei.inf +!endif INF MdeModulePkg/Core/Pei/PeiMain.inf INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf INF MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouterPei.inf From 50a00eb5d43c018bb45033cac1185cf57f582a2f Mon Sep 17 00:00:00 2001 From: Ann Cheng Date: Sun, 1 Feb 2026 23:56:49 +0800 Subject: [PATCH 1119/1172] ArmPlatformPkg: Extend SpellCheck dictionary Add additional words to ExtendWords list to resolve spell check false positives. Cc: Leif Lindholm Cc: Ard Biesheuvel Cc: Sami Mujawar Cc: Samer El-Haj-Mahmoud Signed-off-by: Samer El-Haj-Mahmoud --- ArmPlatformPkg/ArmPlatformPkg.ci.yaml | 35 ++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/ArmPlatformPkg/ArmPlatformPkg.ci.yaml b/ArmPlatformPkg/ArmPlatformPkg.ci.yaml index f2f9e6b8224b..b42ffc75189b 100644 --- a/ArmPlatformPkg/ArmPlatformPkg.ci.yaml +++ b/ArmPlatformPkg/ArmPlatformPkg.ci.yaml @@ -93,9 +93,42 @@ "IgnoreFiles": [], # use gitignore syntax to ignore errors # in matching files "ExtendWords": [ + "afsel", + "ctsen", + "dataen", + "daten", + "deassert", + "hbackporch", "hdlcd", + "hsync", "icdsgir", - "primecells" + "inten", + "jedec", + "pcell", + "primecells", + "pxclk", + "resen", + "rtsen", + "tpidrurw", + "uartcr", + "uartdmacr", + "uartdr", + "uartecr", + "uartfbrd", + "uartfr", + "uartibrd", + "uarticr", + "uartifls", + "uartilpr", + "uartimsc", + "uartris", + "vbackporch", + "vsync", + "vsyncwidth", + "wdogmis", + "wdogris", + "wsvga", + "wsxga" ], # words to extend to the dictionary for this package "IgnoreStandardPaths": [ # Standard Plugin defined paths that "*.asm", "*.s" # should be ignore From 3597306191297b504683b83fe7750e49c6a2e836 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 29 Jan 2026 09:23:32 +0100 Subject: [PATCH 1120/1172] BaseTools/StringFuncs: fix gcc 16 warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit StringFuncs.c: In function ‘SplitStringByWhitespace’: StringFuncs.c:113:15: error: variable ‘Item’ set but not used [-Werror=unused-but-set-variable=] 113 | UINTN Item; | ^~~~ Signed-off-by: Gerd Hoffmann --- BaseTools/Source/C/Common/StringFuncs.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/BaseTools/Source/C/Common/StringFuncs.c b/BaseTools/Source/C/Common/StringFuncs.c index 53e44365e92a..df02d9c80871 100644 --- a/BaseTools/Source/C/Common/StringFuncs.c +++ b/BaseTools/Source/C/Common/StringFuncs.c @@ -110,7 +110,6 @@ SplitStringByWhitespace ( CHAR8 *EndOfSubString; CHAR8 *EndOfString; STRING_LIST *Output; - UINTN Item; String = CloneString (String); if (String == NULL) { @@ -120,7 +119,7 @@ SplitStringByWhitespace ( Output = NewStringList (); - for (Pos = String, Item = 0; Pos < EndOfString; Item++) { + for (Pos = String; Pos < EndOfString;) { while (isspace ((int)*Pos)) { Pos++; } From 9af06ef3cbb052b142f9660c2c01e7aeb401300c Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 8 Dec 2025 10:28:50 +0100 Subject: [PATCH 1121/1172] BaseTools/EfiRom: fix compiler warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New warning after updating gcc: EfiRom.c: In function ‘main’: EfiRom.c:78:17: error: assignment discards ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers] The assigned value is not used, so fix the warning by just removing it. Signed-off-by: Gerd Hoffmann --- BaseTools/Source/C/EfiRom/EfiRom.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/BaseTools/Source/C/EfiRom/EfiRom.c b/BaseTools/Source/C/EfiRom/EfiRom.c index fa7bf0e62e6d..6e903b350411 100644 --- a/BaseTools/Source/C/EfiRom/EfiRom.c +++ b/BaseTools/Source/C/EfiRom/EfiRom.c @@ -44,7 +44,6 @@ Routine Description: FILE_LIST *FList; UINT32 TotalSize; UINT32 Size; - CHAR8 *Ptr0; SetUtilityName(UTILITY_NAME); @@ -75,7 +74,7 @@ Routine Description: // if (mOptions.DumpOption == 1) { if (mOptions.FileList != NULL) { - if ((Ptr0 = strstr ((CONST CHAR8 *) mOptions.FileList->FileName, DEFAULT_OUTPUT_EXTENSION)) != NULL) { + if (strstr ((CONST CHAR8 *) mOptions.FileList->FileName, DEFAULT_OUTPUT_EXTENSION) != NULL) { DumpImage (mOptions.FileList); goto BailOut; } else { From 0f451f6e1ff92b939e91cfef1215b25d0f96b1f7 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 29 Jan 2026 09:32:15 +0100 Subject: [PATCH 1122/1172] MdeModulePkg/CustomizedDisplayLib: fix gcc 16 warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.c: In function ‘CreateDialog’: MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.c:435:18: error: variable ‘Count’ set but not used [-Werror=unused-but-set-variable=] 435 | UINTN Count; | ^~~~~ Signed-off-by: Gerd Hoffmann --- .../Library/CustomizedDisplayLib/CustomizedDisplayLib.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.c b/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.c index ea5e6f7ffaea..444c70af1874 100644 --- a/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.c +++ b/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.c @@ -432,7 +432,6 @@ CreateDialog ( UINTN LargestString; UINTN LineNum; UINTN Index; - UINTN Count; CHAR16 Character; UINTN Start; UINTN End; @@ -503,9 +502,8 @@ CreateDialog ( PrintCharAt ((UINTN)-1, (UINTN)-1, Character); Character = BOXDRAW_VERTICAL; - Count = 0; VA_START (Marker, Key); - for (Index = Top; Index + 2 < Bottom; Index++, Count++) { + for (Index = Top; Index + 2 < Bottom; Index++) { String = VA_ARG (Marker, CHAR16 *); if (String[0] == CHAR_NULL) { From 21441cdf2996608d706c397a45e9ea2b1c1ab811 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 29 Jan 2026 09:35:46 +0100 Subject: [PATCH 1123/1172] MdeModulePkg/SmbiosMeasurementDxe: fix gcc 16 warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MdeModulePkg/Universal/SmbiosMeasurementDxe/SmbiosMeasurementDxe.c: In function ‘GetSmbiosStringById’: MdeModulePkg/Universal/SmbiosMeasurementDxe/SmbiosMeasurementDxe.c:221:10: error: variable ‘Size’ set but not used [-Werror=unused-but-set-variable=] 221 | UINTN Size; | ^~~~ Signed-off-by: Gerd Hoffmann --- .../Universal/SmbiosMeasurementDxe/SmbiosMeasurementDxe.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/MdeModulePkg/Universal/SmbiosMeasurementDxe/SmbiosMeasurementDxe.c b/MdeModulePkg/Universal/SmbiosMeasurementDxe/SmbiosMeasurementDxe.c index 9c7d3906be80..5388fe4c2876 100644 --- a/MdeModulePkg/Universal/SmbiosMeasurementDxe/SmbiosMeasurementDxe.c +++ b/MdeModulePkg/Universal/SmbiosMeasurementDxe/SmbiosMeasurementDxe.c @@ -218,14 +218,12 @@ GetSmbiosStringById ( OUT UINTN *StringLen ) { - UINTN Size; UINTN StrLen; CHAR8 *CharInStr; UINTN StringsNumber; CHAR8 *String; CharInStr = (CHAR8 *)Head + Head->Length; - Size = Head->Length; StringsNumber = 0; StrLen = 0; // @@ -234,7 +232,6 @@ GetSmbiosStringById ( String = NULL; while (*CharInStr != 0 || *(CharInStr+1) != 0) { if (*CharInStr == 0) { - Size += 1; CharInStr++; } @@ -256,7 +253,6 @@ GetSmbiosStringById ( // forward the pointer // CharInStr += StrLen; - Size += StrLen; StringsNumber += 1; if (StringsNumber == StringId) { break; From 8992abde26b2c60a859f38b16df7ff5ab5148a22 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 29 Jan 2026 09:38:27 +0100 Subject: [PATCH 1124/1172] MdeModulePkg/DisplayEngineDxe: fix gcc 16 warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MdeModulePkg/Universal/DisplayEngineDxe/ProcessOptions.c: In function ‘CreateSharedPopUp’: MdeModulePkg/Universal/DisplayEngineDxe/ProcessOptions.c:590:11: error: variable ‘Count’ set but not used [-Werror=unused-but-set-variable=] 590 | UINTN Count; | ^~~~~ Signed-off-by: Gerd Hoffmann --- MdeModulePkg/Universal/DisplayEngineDxe/ProcessOptions.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/ProcessOptions.c b/MdeModulePkg/Universal/DisplayEngineDxe/ProcessOptions.c index 0d4cfa4cf06f..ae5891d69120 100644 --- a/MdeModulePkg/Universal/DisplayEngineDxe/ProcessOptions.c +++ b/MdeModulePkg/Universal/DisplayEngineDxe/ProcessOptions.c @@ -587,7 +587,6 @@ CreateSharedPopUp ( ) { UINTN Index; - UINTN Count; CHAR16 Character; UINTN Start; UINTN End; @@ -627,8 +626,7 @@ CreateSharedPopUp ( PrintCharAt ((UINTN)-1, (UINTN)-1, Character); Character = BOXDRAW_VERTICAL; - Count = 0; - for (Index = Top; Index + 2 < Bottom; Index++, Count++) { + for (Index = Top; Index + 2 < Bottom; Index++) { String = VA_ARG (Marker, CHAR16 *); // From e01df522811363bf0dfb2bb5921f6f79396213d8 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 29 Jan 2026 10:34:52 +0100 Subject: [PATCH 1125/1172] MdeModulePkg/VarCheckHiiLib: fix gcc 16 warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MdeModulePkg/Library/VarCheckHiiLib/VarCheckHiiGenFromFv.c: In function ‘ParseFv’: MdeModulePkg/Library/VarCheckHiiLib/VarCheckHiiGenFromFv.c:263:34: error: variable ‘FfsIndex’ set but not used [-Werror=unused-but-set-variable=] 263 | UINTN FfsIndex; | ^~~~~~~~ Signed-off-by: Gerd Hoffmann --- MdeModulePkg/Library/VarCheckHiiLib/VarCheckHiiGenFromFv.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/MdeModulePkg/Library/VarCheckHiiLib/VarCheckHiiGenFromFv.c b/MdeModulePkg/Library/VarCheckHiiLib/VarCheckHiiGenFromFv.c index 562f5a02f602..4363eda11537 100644 --- a/MdeModulePkg/Library/VarCheckHiiLib/VarCheckHiiGenFromFv.c +++ b/MdeModulePkg/Library/VarCheckHiiLib/VarCheckHiiGenFromFv.c @@ -260,7 +260,6 @@ ParseFv ( EFI_GUID NameGuid; EFI_FV_FILE_ATTRIBUTES FileAttributes; UINTN Size; - UINTN FfsIndex; VAR_CHECK_VFR_DRIVER_INFO *VfrDriverInfo; LIST_ENTRY *VfrDriverLink; @@ -315,7 +314,7 @@ ParseFv ( Key = InternalVarCheckAllocateZeroPool (Fv2->KeySize); ASSERT (Key != NULL); - for (FfsIndex = 0; ; FfsIndex++) { + while (TRUE) { FileType = EFI_FV_FILETYPE_ALL; Status = Fv2->GetNextFile ( Fv2, From ff69be351986a25f229eb0860560c5a2d293b9d3 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 29 Jan 2026 10:45:28 +0100 Subject: [PATCH 1126/1172] MdeModulePkg/CapsuleOnDiskLoadPei: fix gcc 16 warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.c:176:11: error: variable ‘Index’ set but not used [-Werror=unused-but-set-variable=] 176 | UINTN Index; | ^~~~~ Signed-off-by: Gerd Hoffmann --- .../Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.c b/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.c index c7be6c52525c..4d4f5fde2f6f 100644 --- a/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.c +++ b/MdeModulePkg/Universal/CapsuleOnDiskLoadPei/CapsuleOnDiskLoadPei.c @@ -173,7 +173,6 @@ RetrieveRelocatedCapsule ( IN UINTN RelocCapsuleTotalSize ) { - UINTN Index; UINT8 *CapsuleDataBufEnd; UINT8 *CapsulePtr; UINT32 CapsuleSize; @@ -244,7 +243,6 @@ RetrieveRelocatedCapsule ( // Re-iterate the capsule buffer to create Capsule hob & Capsule Name Str Hob for each Capsule saved in relocated capsule file // CapsulePtr = RelocCapsuleBuf; - Index = 0; while (CapsulePtr < CapsuleDataBufEnd) { CapsuleSize = ((EFI_CAPSULE_HEADER *)CapsulePtr)->CapsuleImageSize; BuildCvHob ((EFI_PHYSICAL_ADDRESS)(UINTN)CapsulePtr, CapsuleSize); @@ -252,7 +250,6 @@ RetrieveRelocatedCapsule ( DEBUG ((DEBUG_INFO, "Capsule saved in address %x size %x\n", CapsulePtr, CapsuleSize)); CapsulePtr += CapsuleSize; - Index++; } return EFI_SUCCESS; From 64ad6f20d883bea836a8b144acd45dba2eb226a5 Mon Sep 17 00:00:00 2001 From: Sherry Fan Date: Wed, 21 Jan 2026 16:41:39 -0800 Subject: [PATCH 1127/1172] MdeModulePkg: BdsDxe: Introduce infinite boot retries This PR introduces a new feature to enable infinite boot retries based on a newly created PCD. When true, the system will continuously loop over all boot options. PCD default is FALSE to match existing functionality. This change is tested on QEMU based virtual platforms and physical platforms. This change is useful for certain server cases. Infinite retries allows a server to continuously attempt boot in case of network failure and recovery, and for such attempts to be accurately recorded in the TCG logs. Co-authored-by: Kun Qin Co-authored-by: Aaron Pop Co-authored-by: Michael Kubacki Signed-off-by: Sherry Fan --- MdeModulePkg/MdeModulePkg.dec | 8 ++++++++ MdeModulePkg/Universal/BdsDxe/BdsDxe.inf | 1 + MdeModulePkg/Universal/BdsDxe/BdsEntry.c | 25 +++++++++++++++--------- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 979188e52943..9e2c6074eb2d 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -1211,6 +1211,14 @@ # @Prompt FFA TX/RX Buffer Page Count gEfiMdeModulePkgTokenSpaceGuid.PcdFfaTxRxPageCount|1|UINT64|0x30001062 + ## Some platforms require that all EfiLoadOptions are retried until one of the options + # boots. When True, this Pcd will force Bds to retry all the valid EfiLoadOptions + # indefinitely until one of the options boots. + # TRUE - Efi boot options will be retried indefinitely. + # FALSE - Efi boot options will not be retried. + # @Prompt Enable infinite retries during BDS. + gEfiMdeModulePkgTokenSpaceGuid.PcdSupportInfiniteBootRetries|FALSE|BOOLEAN|0x40000152 + [PcdsFixedAtBuild, PcdsPatchableInModule] ## Dynamic type PCD can be registered callback function for Pcd setting action. # PcdMaxPeiPcdCallBackNumberPerPcdEntry indicates the maximum number of callback function diff --git a/MdeModulePkg/Universal/BdsDxe/BdsDxe.inf b/MdeModulePkg/Universal/BdsDxe/BdsDxe.inf index 95d2607b8d1f..971b2717296d 100644 --- a/MdeModulePkg/Universal/BdsDxe/BdsDxe.inf +++ b/MdeModulePkg/Universal/BdsDxe/BdsDxe.inf @@ -99,6 +99,7 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleOnDiskSupport ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleFmpSupport ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdPlatformRecoverySupport ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdSupportInfiniteBootRetries ## CONSUMES [Depex] TRUE diff --git a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c b/MdeModulePkg/Universal/BdsDxe/BdsEntry.c index 4ac3a88e8494..8c4064c191f2 100644 --- a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c +++ b/MdeModulePkg/Universal/BdsDxe/BdsEntry.c @@ -414,14 +414,20 @@ BootBootOptions ( EfiBootManagerBoot (&BootOptions[Index]); // - // If the boot via Boot#### returns with a status of EFI_SUCCESS, platform firmware - // supports boot manager menu, and if firmware is configured to boot in an - // interactive mode, the boot manager will stop processing the BootOrder variable and - // present a boot manager menu to the user. + // If infinite retries is enabled, do not break out of the loop. + // This allows all boot options to be attempted on each iteration. // - if ((BootManagerMenu != NULL) && (BootOptions[Index].Status == EFI_SUCCESS)) { - EfiBootManagerBoot (BootManagerMenu); - break; + if (!PcdGetBool (PcdSupportInfiniteBootRetries)) { + // + // If the boot via Boot#### returns with a status of EFI_SUCCESS, platform firmware + // supports boot manager menu, and if firmware is configured to boot in an + // interactive mode, the boot manager will stop processing the BootOrder variable and + // present a boot manager menu to the user. + // + if ((BootManagerMenu != NULL) && (BootOptions[Index].Status == EFI_SUCCESS)) { + EfiBootManagerBoot (BootManagerMenu); + break; + } } } @@ -1103,7 +1109,8 @@ BdsEntry ( do { // - // Retry to boot if any of the boot succeeds + // Retry to boot if any of the boot succeeds. + // If infinite retries is enabled, always retry. This allows a continuous loop over all boot options. // BootSuccess = FALSE; LoadOptions = EfiBootManagerGetLoadOptions (&LoadOptionCount, LoadOptionTypeBoot); @@ -1111,7 +1118,7 @@ BdsEntry ( BootSuccess = BootBootOptions (LoadOptions, LoadOptionCount, (BootManagerMenuStatus != EFI_NOT_FOUND) ? &BootManagerMenu : NULL); EfiBootManagerFreeLoadOptions (LoadOptions, LoadOptionCount); } - } while (BootSuccess); + } while (BootSuccess || PcdGetBool (PcdSupportInfiniteBootRetries)); } if (BootManagerMenuStatus != EFI_NOT_FOUND) { From 23d5ddfe2d48e654d5e1e25bcfd554f06e428888 Mon Sep 17 00:00:00 2001 From: dhiineshm Date: Thu, 29 Jan 2026 19:14:05 +0530 Subject: [PATCH 1128/1172] MdePkg: Replace non-ASCII characters with ASCII MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replacing the non-ASCII characters with ASCII characters fixes build failures onWindows systems using non-English locales. These characters trigger MSVC warningC4819 (“file contains a character that cannot be represented in the current codepage”), which becomes an error when /WX is enabled. Cc: Sachin Ganesh Signed-off-by: dhiineshm --- MdePkg/Include/IndustryStandard/SmBios.h | 2 +- MdePkg/Include/Library/ArmFfaMemMgmtLib.h | 4 ++-- MdePkg/Include/Register/Amd/ArchitecturalMsr.h | 6 +++--- MdePkg/Library/ArmFfaMemMgmtLib/ArmFfaMemMgmtLib.c | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/MdePkg/Include/IndustryStandard/SmBios.h b/MdePkg/Include/IndustryStandard/SmBios.h index 67fc41c77f1d..8ac917b08a2d 100644 --- a/MdePkg/Include/IndustryStandard/SmBios.h +++ b/MdePkg/Include/IndustryStandard/SmBios.h @@ -32,7 +32,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent /// /// Reference SMBIOS 3.6, chapter 6.1.2. -/// Unless otherwise specified, when referring to another structure’s handle, the value +/// Unless otherwise specified, when referring to another structure's handle, the value /// 0FFFFh is used to indicate that the referenced handle is not applicable or does not /// exist. /// diff --git a/MdePkg/Include/Library/ArmFfaMemMgmtLib.h b/MdePkg/Include/Library/ArmFfaMemMgmtLib.h index c52e15d84ac9..5ca64750d1b8 100644 --- a/MdePkg/Include/Library/ArmFfaMemMgmtLib.h +++ b/MdePkg/Include/Library/ArmFfaMemMgmtLib.h @@ -61,7 +61,7 @@ ArmFfaMemLibDonateRxTx ( ); /** - @brief Starts a transaction to transfer an Owner’s access to a memory + @brief Starts a transaction to transfer an Owner's access to a memory region and grant access to it to one or more Borrowers. @param[in] TotalLength Total length of the memory transaction descriptor @@ -89,7 +89,7 @@ ArmFfaMemLibLend ( ); /** - @brief Starts a transaction to transfer an Owner’s access to a memory + @brief Starts a transaction to transfer an Owner's access to a memory region and grant access to it to one or more Borrowers through Rx/Tx buffer. diff --git a/MdePkg/Include/Register/Amd/ArchitecturalMsr.h b/MdePkg/Include/Register/Amd/ArchitecturalMsr.h index 369009f9dbf4..bd251c56e568 100644 --- a/MdePkg/Include/Register/Amd/ArchitecturalMsr.h +++ b/MdePkg/Include/Register/Amd/ArchitecturalMsr.h @@ -7,7 +7,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent @par Specification Reference: - AMD64 Architecture Programmer’s Manual, Volumes 2 + AMD64 Architecture Programmer's Manual, Volumes 2 Rev. 3.37, Volume 2: System Programming **/ @@ -30,7 +30,7 @@ SMM_ADDR Contains the base address of protected memory for the SMM Handler. - Specific usage, see AMD64 Architecture Programmer’s Manual, + Specific usage, see AMD64 Architecture Programmer's Manual, Volumes 2 (Rev. 3.37), Section 10.2.5 Reset value: 0000_0000_0000_0000h @@ -44,7 +44,7 @@ SMM_MASK Contains a mask which determines the size of the protected area for the SMM handler. - Specific usage, see AMD64 Architecture Programmer’s Manual, + Specific usage, see AMD64 Architecture Programmer's Manual, Volumes 2 (Rev. 3.37), Section 10.2.5 Reset value: 0000_0000_0000_0000h diff --git a/MdePkg/Library/ArmFfaMemMgmtLib/ArmFfaMemMgmtLib.c b/MdePkg/Library/ArmFfaMemMgmtLib/ArmFfaMemMgmtLib.c index 91dfd17d402a..97c0b8aa9e13 100644 --- a/MdePkg/Library/ArmFfaMemMgmtLib/ArmFfaMemMgmtLib.c +++ b/MdePkg/Library/ArmFfaMemMgmtLib/ArmFfaMemMgmtLib.c @@ -119,7 +119,7 @@ ArmFfaMemLibDonateRxTx ( } /** - @brief Starts a transaction to transfer an Owner’s access to a memory + @brief Starts a transaction to transfer an Owner's access to a memory region and grant access to it to one or more Borrowers. @param[in] TotalLength Total length of the memory transaction descriptor @@ -190,7 +190,7 @@ ArmFfaMemLibLend ( } /** - @brief Starts a transaction to transfer an Owner’s access to a memory + @brief Starts a transaction to transfer an Owner's access to a memory region and grant access to it to one or more Borrowers through Rx/Tx buffer. From 83271a185ad8bc610158b57680578eb55523f4c6 Mon Sep 17 00:00:00 2001 From: dhiineshm Date: Thu, 29 Jan 2026 19:40:20 +0530 Subject: [PATCH 1129/1172] EmbeddedPkg: Replace non-ASCII characters with ASCII MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replacing the non-ASCII characters with ASCII characters fixes build failures onWindows systems using non-English locales. These characters trigger MSVC warningC4819 (“file contains a character that cannot be represented in the current codepage”), which becomes an error when /WX is enabled. Cc: Sachin Ganesh Signed-off-by: dhiineshm --- EmbeddedPkg/GdbStub/GdbStub.c | 4 +-- EmbeddedPkg/GdbStub/GdbStubInternal.h | 32 ++++++++++++------------ EmbeddedPkg/GdbStub/Ia32/Processor.c | 28 ++++++++++----------- EmbeddedPkg/GdbStub/X64/Processor.c | 28 ++++++++++----------- EmbeddedPkg/Include/Protocol/UsbDevice.h | 2 +- 5 files changed, 47 insertions(+), 47 deletions(-) diff --git a/EmbeddedPkg/GdbStub/GdbStub.c b/EmbeddedPkg/GdbStub/GdbStub.c index e6e07b87b642..67aaccc802a5 100644 --- a/EmbeddedPkg/GdbStub/GdbStub.c +++ b/EmbeddedPkg/GdbStub/GdbStub.c @@ -1149,8 +1149,8 @@ GdbExceptionHandler ( AsciiSPrint (gOutBuffer, MAX_BUF_SIZE, "qXfer:libraries:read+;PacketSize=%d", MAX_BUF_SIZE); SendPacket (gOutBuffer); } else if (AsciiStrnCmp (gInBuffer, "qXfer:libraries:read::", 22) == 0) { - // ‘qXfer:libraries:read::offset,length - // gInBuffer[22] is offset string, ++Ptr is length string’ + // 'qXfer:libraries:read::offset,length + // gInBuffer[22] is offset string, ++Ptr is length string' for (Ptr = &gInBuffer[22]; *Ptr != ','; Ptr++) { } diff --git a/EmbeddedPkg/GdbStub/GdbStubInternal.h b/EmbeddedPkg/GdbStub/GdbStubInternal.h index a10006da241a..e96a2add3cf0 100644 --- a/EmbeddedPkg/GdbStub/GdbStubInternal.h +++ b/EmbeddedPkg/GdbStub/GdbStubInternal.h @@ -320,7 +320,7 @@ SendNotSupported ( VOID ); -/** ‘p n’ +/** 'p n' Reads the n-th register's value into an output buffer and sends it as a packet @param SystemContext Register content at time of the exception @param InBuffer This is the input buffer received from gdb server @@ -331,7 +331,7 @@ ReadNthRegister ( IN CHAR8 *InBuffer ); -/** ‘g’ +/** 'g' Reads the general registers into an output buffer and sends it as a packet @param SystemContext Register content at time of the exception **/ @@ -341,7 +341,7 @@ ReadGeneralRegisters ( IN EFI_SYSTEM_CONTEXT SystemContext ); -/** ‘P n...=r...’ +/** 'P n...=r...' Writes the new value of n-th register received into the input buffer to the n-th register @param SystemContext Register content at time of the exception @param InBuffer This is the input buffer received from gdb server @@ -353,7 +353,7 @@ WriteNthRegister ( IN CHAR8 *InBuffer ); -/** ‘G XX...’ +/** 'G XX...' Writes the new values received into the input buffer to the general registers @param SystemContext Register content at time of the exception @param InBuffer Pointer to the input buffer received from gdb server @@ -366,7 +366,7 @@ WriteGeneralRegisters ( IN CHAR8 *InBuffer ); -/** ‘m addr,length ’ +/** 'm addr,length ' Find the Length of the area to read and the start address. Finally, pass them to another function, TransferFromMemToOutBufAndSend, that will read from that memory space and send it as a packet. @@ -379,7 +379,7 @@ ReadFromMemory ( IN CHAR8 *PacketData ); -/** ‘M addr,length :XX...’ +/** 'M addr,length :XX...' Find the Length of the area in bytes to write and the start address. Finally, pass them to another function, TransferFromInBufToMem, that will write to that memory space the info in the input buffer. @@ -392,7 +392,7 @@ WriteToMemory ( IN CHAR8 *PacketData ); -/** ‘c [addr ]’ +/** 'c [addr ]' Continue. addr is Address to resume. If addr is omitted, resume at current Address. @@ -407,7 +407,7 @@ ContinueAtAddress ( IN CHAR8 *PacketData ); -/** ‘s [addr ]’ +/** 's [addr ]' Single step. addr is the Address at which to resume. If addr is omitted, resume at same Address. @@ -442,10 +442,10 @@ RemoveSingleStep ( ); /** - ‘Z1, [addr], [length]’ - ‘Z2, [addr], [length]’ - ‘Z3, [addr], [length]’ - ‘Z4, [addr], [length]’ + 'Z1, [addr], [length]' + 'Z2, [addr], [length]' + 'Z3, [addr], [length]' + 'Z4, [addr], [length]' Insert hardware breakpoint/watchpoint at address addr of size length @@ -461,10 +461,10 @@ InsertBreakPoint ( ); /** - ‘z1, [addr], [length]’ - ‘z2, [addr], [length]’ - ‘z3, [addr], [length]’ - ‘z4, [addr], [length]’ + 'z1, [addr], [length]' + 'z2, [addr], [length]' + 'z3, [addr], [length]' + 'z4, [addr], [length]' Remove hardware breakpoint/watchpoint at address addr of size length diff --git a/EmbeddedPkg/GdbStub/Ia32/Processor.c b/EmbeddedPkg/GdbStub/Ia32/Processor.c index a3406b03f3b1..f560874df086 100644 --- a/EmbeddedPkg/GdbStub/Ia32/Processor.c +++ b/EmbeddedPkg/GdbStub/Ia32/Processor.c @@ -173,7 +173,7 @@ BasicReadRegister ( return OutBufPtr; } -/** ‘p n’ +/** 'p n' Reads the n-th register's value into an output buffer and sends it as a packet @param SystemContext Register content at time of the exception @@ -204,7 +204,7 @@ ReadNthRegister ( SendPacket (OutBuffer); } -/** ‘g’ +/** 'g' Reads the general registers into an output buffer and sends it as a packet @param SystemContext Register content at time of the exception @@ -274,7 +274,7 @@ BasicWriteRegister ( return InBufPtr; } -/** ‘P n...=r...’ +/** 'P n...=r...' Writes the new value of n-th register received into the input buffer to the n-th register @param SystemContext Register content at time of the exception @@ -313,7 +313,7 @@ WriteNthRegister ( SendSuccess (); } -/** ‘G XX...’ +/** 'G XX...' Writes the new values received into the input buffer to the general registers @param SystemContext Register content at time of the exception @@ -376,7 +376,7 @@ RemoveSingleStep ( SystemContext.SystemContextIa32->Eflags &= ~TF_BIT; // clearing the TF bit. } -/** ‘c [addr ]’ +/** 'c [addr ]' Continue. addr is Address to resume. If addr is omitted, resume at current Address. @@ -394,7 +394,7 @@ ContinueAtAddress ( } } -/** ‘s [addr ]’ +/** 's [addr ]' Single step. addr is the Address at which to resume. If addr is omitted, resume at same Address. @@ -779,10 +779,10 @@ DisableDebugRegister ( } /** - ‘Z1, [addr], [length]’ - ‘Z2, [addr], [length]’ - ‘Z3, [addr], [length]’ - ‘Z4, [addr], [length]’ + 'Z1, [addr], [length]' + 'Z2, [addr], [length]' + 'Z3, [addr], [length]' + 'Z4, [addr], [length]' Insert hardware breakpoint/watchpoint at address addr of size length @@ -864,10 +864,10 @@ InsertBreakPoint ( } /** - ‘z1, [addr], [length]’ - ‘z2, [addr], [length]’ - ‘z3, [addr], [length]’ - ‘z4, [addr], [length]’ + 'z1, [addr], [length]' + 'z2, [addr], [length]' + 'z3, [addr], [length]' + 'z4, [addr], [length]' Remove hardware breakpoint/watchpoint at address addr of size length diff --git a/EmbeddedPkg/GdbStub/X64/Processor.c b/EmbeddedPkg/GdbStub/X64/Processor.c index f9401eed6459..6c2b769aba43 100644 --- a/EmbeddedPkg/GdbStub/X64/Processor.c +++ b/EmbeddedPkg/GdbStub/X64/Processor.c @@ -145,7 +145,7 @@ BasicReadRegister ( return OutBufPtr; } -/** ‘p n’ +/** 'p n' Reads the n-th register's value into an output buffer and sends it as a packet @param SystemContext Register content at time of the exception @param InBuffer Pointer to the input buffer received from gdb server @@ -174,7 +174,7 @@ ReadNthRegister ( SendPacket (OutBuffer); } -/** ‘g’ +/** 'g' Reads the general registers into an output buffer and sends it as a packet @param SystemContext Register content at time of the exception @@ -244,7 +244,7 @@ BasicWriteRegister ( return InBufPtr; } -/** ‘P n...=r...’ +/** 'P n...=r...' Writes the new value of n-th register received into the input buffer to the n-th register @param SystemContext Register content at time of the exception @@ -283,7 +283,7 @@ WriteNthRegister ( SendSuccess (); } -/** ‘G XX...’ +/** 'G XX...' Writes the new values received into the input buffer to the general registers @param SystemContext Register content at time of the exception @@ -346,7 +346,7 @@ RemoveSingleStep ( SystemContext.SystemContextX64->Rflags &= ~TF_BIT; // clearing the TF bit. } -/** ‘c [addr ]’ +/** 'c [addr ]' Continue. addr is Address to resume. If addr is omitted, resume at current Address. @@ -364,7 +364,7 @@ ContinueAtAddress ( } } -/** ‘s [addr ]’ +/** 's [addr ]' Single step. addr is the Address at which to resume. If addr is omitted, resume at same Address. @@ -750,10 +750,10 @@ DisableDebugRegister ( } /** - ‘Z1, [addr], [length]’ - ‘Z2, [addr], [length]’ - ‘Z3, [addr], [length]’ - ‘Z4, [addr], [length]’ + 'Z1, [addr], [length]' + 'Z2, [addr], [length]' + 'Z3, [addr], [length]' + 'Z4, [addr], [length]' Insert hardware breakpoint/watchpoint at address addr of size length @@ -835,10 +835,10 @@ InsertBreakPoint ( } /** - ‘z1, [addr], [length]’ - ‘z2, [addr], [length]’ - ‘z3, [addr], [length]’ - ‘z4, [addr], [length]’ + 'z1, [addr], [length]' + 'z2, [addr], [length]' + 'z3, [addr], [length]' + 'z4, [addr], [length]' Remove hardware breakpoint/watchpoint at address addr of size length diff --git a/EmbeddedPkg/Include/Protocol/UsbDevice.h b/EmbeddedPkg/Include/Protocol/UsbDevice.h index b299ee10a7b1..b07f459afa35 100644 --- a/EmbeddedPkg/Include/Protocol/UsbDevice.h +++ b/EmbeddedPkg/Include/Protocol/UsbDevice.h @@ -83,7 +83,7 @@ EFI_STATUS first interface descriptor. If there are additional interfaces, their interface descriptor and endpoint descriptors follow the - first interface’s endpoint descriptors". + first interface's endpoint descriptors". The size of each buffer is the TotalLength member of the Configuration Descriptor. From e0f8dc155fa5f19f39078d2da4f04df306081f82 Mon Sep 17 00:00:00 2001 From: dhiineshm Date: Thu, 29 Jan 2026 19:45:34 +0530 Subject: [PATCH 1130/1172] ArmPkg: Replace non-ASCII characters with ASCII MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replacing the non-ASCII characters with ASCII characters fixes build failures onWindows systems using non-English locales. These characters trigger MSVC warningC4819 (“file contains a character that cannot be represented in the current codepage”), which becomes an error when /WX is enabled. Cc: Sachin Ganesh Signed-off-by: dhiineshm --- ArmPkg/Library/FmpDevicePsaFwuLib/FmpDevicePsaFwuLib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ArmPkg/Library/FmpDevicePsaFwuLib/FmpDevicePsaFwuLib.c b/ArmPkg/Library/FmpDevicePsaFwuLib/FmpDevicePsaFwuLib.c index 1ba6a7a3a512..4b5fa4943855 100644 --- a/ArmPkg/Library/FmpDevicePsaFwuLib/FmpDevicePsaFwuLib.c +++ b/ArmPkg/Library/FmpDevicePsaFwuLib/FmpDevicePsaFwuLib.c @@ -458,7 +458,7 @@ FmpDeviceGetImageTypeIdGuidPtr ( @retval EFI_SUCCESS The attributes supported by the firmware device were returned. - @retval EFI_INVALID_PARAMETER One of the parameters — Settings or Supported — is NULL. + @retval EFI_INVALID_PARAMETER One of the parameters - Settings or Supported - is NULL. **/ EFI_STATUS From 5a414b5ef7ded0f7b0fc0ff0050fcf0cd1b8f332 Mon Sep 17 00:00:00 2001 From: Yang Gang Date: Tue, 27 Jan 2026 11:22:30 +0800 Subject: [PATCH 1131/1172] MdeModulePkg/SetupBrowserDxe: Fix code issue in ParseOpCodes() `if (CurrentForm != NULL)` and `if (InScopeDisable && (CurrentForm == NULL))`conflict. `if (CurrentForm != NULL)` should be `if (CurrentExpression != NULL)`. Signed-off-by: Yang Gang --- MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c b/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c index d4c18bfa6df2..7a29deab567d 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c @@ -1691,7 +1691,7 @@ ParseOpCodes ( // // This is DisableIf expression for Form, it should be a constant expression // - if (CurrentForm != NULL) { + if (CurrentExpression != NULL) { Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression); if (EFI_ERROR (Status)) { return Status; From f5f4e9b764628b7c85a1fb6c695cdae7238e4b72 Mon Sep 17 00:00:00 2001 From: Yang Gang Date: Tue, 27 Jan 2026 11:27:13 +0800 Subject: [PATCH 1132/1172] MdeModulePkg/SetupBrowserDxe: Check Form parameter in RuleIdToExpression() Signed-off-by: Yang Gang --- MdeModulePkg/Universal/SetupBrowserDxe/Expression.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c b/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c index 90ed2bb113d8..4a2c2adbb336 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c @@ -900,6 +900,10 @@ RuleIdToExpression ( LIST_ENTRY *Link; FORM_EXPRESSION *Expression; + if (Form == NULL) { + return NULL; + } + Link = GetFirstNode (&Form->ExpressionListHead); while (!IsNull (&Form->ExpressionListHead, Link)) { Expression = FORM_EXPRESSION_FROM_LINK (Link); From 522b18190a260aa35dacfc8a48fc228941841f12 Mon Sep 17 00:00:00 2001 From: Oleksandr Tymoshenko Date: Tue, 11 Nov 2025 23:05:35 +0000 Subject: [PATCH 1133/1172] BaseTools/Tests: Fix clean target SEP variable is only set if PYTHON_COMMAND is undefined but referred regardless. It breaks the clean target for the following scenario: . edksetup.sh # Sets PYTHON_COMMAND make -C BaseTools make -C BaseTools clean This change fixes the use case mentioned above by settings SEP for all build configurations. [ardb: Drop redundant assignment for Windows] Signed-off-by: Oleksandr Tymoshenko --- BaseTools/Tests/GNUmakefile | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/BaseTools/Tests/GNUmakefile b/BaseTools/Tests/GNUmakefile index 2ff3b77e063d..1a89dc76a93d 100644 --- a/BaseTools/Tests/GNUmakefile +++ b/BaseTools/Tests/GNUmakefile @@ -7,11 +7,17 @@ all: test +ifeq (Windows, $(findstring Windows,$(OS))) + MAKEROOT := $(shell echo %CD%) + SEP:=$(shell echo \) +else + MAKEROOT := . + SEP:=/ +endif + ifndef PYTHON_COMMAND ifeq (Windows, $(findstring Windows,$(OS))) SHELL := cmd.exe - MAKEROOT := $(shell echo %CD%) - SEP:=$(shell echo \) # # Try using the Python Launcher for Windows to find an interperter. # @@ -36,8 +42,6 @@ ifndef PYTHON_COMMAND endif undefine CHECK_PY else # UNIX - MAKEROOT := . - SEP:=/ PYTHON_COMMAND := $(shell /usr/bin/env python3 -c "import sys; print(sys.executable)") ifdef (,$(wildcard $(PYTHON_COMMAND))) # Make sure the file exists PYTHON_COMMAND := $(shell /usr/bin/env python -c "import sys; print(sys.executable)") From 388a817120f3c1a97e4adb4cc654f23853424a57 Mon Sep 17 00:00:00 2001 From: Oleksandr Tymoshenko Date: Thu, 13 Nov 2025 23:59:41 +0000 Subject: [PATCH 1134/1172] BaseTools/Tests: Generate interim files in temp directory As a preparation for out-of-tree build support make sure all interim files for tests are created in tmp directory. Signed-off-by: Oleksandr Tymoshenko --- BaseTools/Tests/CheckPythonSyntax.py | 5 ++++- BaseTools/Tests/TestTools.py | 8 ++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/BaseTools/Tests/CheckPythonSyntax.py b/BaseTools/Tests/CheckPythonSyntax.py index 099920721f5a..1bed8c94c6fe 100644 --- a/BaseTools/Tests/CheckPythonSyntax.py +++ b/BaseTools/Tests/CheckPythonSyntax.py @@ -10,6 +10,7 @@ # Import Modules # import os +import tempfile import unittest import py_compile @@ -22,7 +23,9 @@ def setUp(self): def SingleFileTest(self, filename): try: - py_compile.compile(filename, doraise=True) + with tempfile.NamedTemporaryFile(delete=False) as temp_file: + py_compile.compile(filename, cfile=temp_file.name, doraise=True) + os.unlink(temp_file.name) except Exception as e: self.fail('syntax error: %s, Error is %s' % (filename, str(e))) diff --git a/BaseTools/Tests/TestTools.py b/BaseTools/Tests/TestTools.py index 042b72e156bb..ff81a8fdfc48 100644 --- a/BaseTools/Tests/TestTools.py +++ b/BaseTools/Tests/TestTools.py @@ -17,6 +17,7 @@ import shutil import subprocess import sys +import tempfile import unittest import codecs @@ -24,7 +25,6 @@ BaseToolsDir = os.path.realpath(os.path.join(TestsDir, '..')) CSourceDir = os.path.join(BaseToolsDir, 'Source', 'C') PythonSourceDir = os.path.join(BaseToolsDir, 'Source', 'Python') -TestTempDir = os.path.join(TestsDir, 'TestTempDir') if PythonSourceDir not in sys.path: # @@ -172,11 +172,7 @@ def setUp(self): os.environ['PATH'] = \ os.path.pathsep.join((os.environ['PATH'], binPath)) - self.testDir = TestTempDir - if not os.path.exists(self.testDir): - os.mkdir(self.testDir) - else: - self.cleanOutDir(self.testDir) + self.testDir = tempfile.mkdtemp() def tearDown(self): self.RemoveFileOrDir(self.testDir) From 4cfa0c4911a264b77f6f4fc73d75bef5e2daa1e1 Mon Sep 17 00:00:00 2001 From: Oleksandr Tymoshenko Date: Wed, 26 Nov 2025 22:04:58 +0000 Subject: [PATCH 1135/1172] BaseTools: Remove unused rules and dependencies VfrLexer.h is built as a part of VfrCompile build and shouldn't be present at the BaseTools/Source/C level. Signed-off-by: Oleksandr Tymoshenko --- BaseTools/Source/C/GNUmakefile | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/BaseTools/Source/C/GNUmakefile b/BaseTools/Source/C/GNUmakefile index 59cde7b208d1..73f4b27eeb71 100644 --- a/BaseTools/Source/C/GNUmakefile +++ b/BaseTools/Source/C/GNUmakefile @@ -22,7 +22,6 @@ all: makerootdir subdirs @echo Finished building BaseTools C Tools with HOST_ARCH=$(HOST_ARCH) LIBRARIES = Common -VFRAUTOGEN = VfrCompile/VfrLexer.h APPLICATIONS = \ BrotliCompress \ VfrCompile \ @@ -40,7 +39,7 @@ APPLICATIONS = \ SUBDIRS := $(LIBRARIES) $(APPLICATIONS) $(LIBRARIES): $(MAKEROOT)/libs -$(APPLICATIONS): $(LIBRARIES) $(MAKEROOT)/bin $(VFRAUTOGEN) +$(APPLICATIONS): $(LIBRARIES) $(MAKEROOT)/bin .PHONY: outputdirs makerootdir: @@ -55,9 +54,6 @@ $(SUBDIRS): $(patsubst %,%-clean,$(sort $(SUBDIRS))): -$(MAKE) -C $(@:-clean=) clean -$(VFRAUTOGEN): VfrCompile/VfrSyntax.g - $(MAKE) -C VfrCompile VfrLexer.h - clean: $(patsubst %,%-clean,$(sort $(SUBDIRS))) clean: localClean From f39883ea115f4aef8fe1df4b83b9c33439deca33 Mon Sep 17 00:00:00 2001 From: Oleksandr Tymoshenko Date: Wed, 12 Nov 2025 01:03:16 +0000 Subject: [PATCH 1136/1172] BaseTools: Refactor shell BinWrappers/PosixLike wrappers - Move common wrapper logic for multiple tools to GenericShellWrapper file - Drop search for BaseToolsCBinaries from the list of checked directories. This case has been broken for quite a while since the exec clause never passed command arguments to the supposed binary. - Remove a suggestion to run make in $EDK_TOOLS_PATH/Source/C and let the wrapper fail if the directory exists but no binary is present. Signed-off-by: Oleksandr Tymoshenko --- .../BinWrappers/PosixLike/BrotliCompress | 11 ++------ BaseTools/BinWrappers/PosixLike/DevicePath | 28 +------------------ BaseTools/BinWrappers/PosixLike/EfiRom | 28 +------------------ BaseTools/BinWrappers/PosixLike/GenCrc32 | 28 +------------------ BaseTools/BinWrappers/PosixLike/GenFfs | 28 +------------------ BaseTools/BinWrappers/PosixLike/GenFv | 28 +------------------ BaseTools/BinWrappers/PosixLike/GenFw | 28 +------------------ BaseTools/BinWrappers/PosixLike/GenSec | 28 +------------------ .../BinWrappers/PosixLike/GenericShellWrapper | 21 ++++++++++++++ BaseTools/BinWrappers/PosixLike/LzmaCompress | 28 +------------------ BaseTools/BinWrappers/PosixLike/TianoCompress | 28 +------------------ BaseTools/BinWrappers/PosixLike/VfrCompile | 28 +------------------ BaseTools/BinWrappers/PosixLike/VolInfo | 28 +------------------ 13 files changed, 34 insertions(+), 306 deletions(-) create mode 100755 BaseTools/BinWrappers/PosixLike/GenericShellWrapper diff --git a/BaseTools/BinWrappers/PosixLike/BrotliCompress b/BaseTools/BinWrappers/PosixLike/BrotliCompress index 426f2a2ef196..d9898e95e159 100755 --- a/BaseTools/BinWrappers/PosixLike/BrotliCompress +++ b/BaseTools/BinWrappers/PosixLike/BrotliCompress @@ -36,17 +36,10 @@ do done -if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ] +if [ -n "$EDK_TOOLS_PATH" ] && [ -e "$EDK_TOOLS_PATH/Source/C/bin" ] then - exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd" -elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ] -then - if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ] + if [ -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ] then - echo "BaseTools C Tool binary was not found ($cmd)" - echo "You may need to run:" - echo " make -C $EDK_TOOLS_PATH/Source/C" - else exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" $QLT $ARGS fi elif [ -e "$dir/../../Source/C/bin/$cmd" ] diff --git a/BaseTools/BinWrappers/PosixLike/DevicePath b/BaseTools/BinWrappers/PosixLike/DevicePath index 0945d86d9209..21fc00a930ee 100755 --- a/BaseTools/BinWrappers/PosixLike/DevicePath +++ b/BaseTools/BinWrappers/PosixLike/DevicePath @@ -1,29 +1,3 @@ #!/usr/bin/env bash -full_cmd=${BASH_SOURCE:-$0} # see http://mywiki.wooledge.org/BashFAQ/028 for a discussion of why $0 is not a good choice here -dir=$(dirname "$full_cmd") -cmd=${full_cmd##*/} - -if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ] -then - exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd" -elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ] -then - if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ] - then - echo "BaseTools C Tool binary was not found ($cmd)" - echo "You may need to run:" - echo " make -C $EDK_TOOLS_PATH/Source/C" - else - exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@" - fi -elif [ -e "$dir/../../Source/C/bin/$cmd" ] -then - exec "$dir/../../Source/C/bin/$cmd" "$@" -else - echo "Unable to find the real '$cmd' to run" - echo "This message was printed by" - echo " $0" - exit 127 -fi - +. GenericShellWrapper diff --git a/BaseTools/BinWrappers/PosixLike/EfiRom b/BaseTools/BinWrappers/PosixLike/EfiRom index 0945d86d9209..21fc00a930ee 100755 --- a/BaseTools/BinWrappers/PosixLike/EfiRom +++ b/BaseTools/BinWrappers/PosixLike/EfiRom @@ -1,29 +1,3 @@ #!/usr/bin/env bash -full_cmd=${BASH_SOURCE:-$0} # see http://mywiki.wooledge.org/BashFAQ/028 for a discussion of why $0 is not a good choice here -dir=$(dirname "$full_cmd") -cmd=${full_cmd##*/} - -if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ] -then - exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd" -elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ] -then - if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ] - then - echo "BaseTools C Tool binary was not found ($cmd)" - echo "You may need to run:" - echo " make -C $EDK_TOOLS_PATH/Source/C" - else - exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@" - fi -elif [ -e "$dir/../../Source/C/bin/$cmd" ] -then - exec "$dir/../../Source/C/bin/$cmd" "$@" -else - echo "Unable to find the real '$cmd' to run" - echo "This message was printed by" - echo " $0" - exit 127 -fi - +. GenericShellWrapper diff --git a/BaseTools/BinWrappers/PosixLike/GenCrc32 b/BaseTools/BinWrappers/PosixLike/GenCrc32 index 0945d86d9209..21fc00a930ee 100755 --- a/BaseTools/BinWrappers/PosixLike/GenCrc32 +++ b/BaseTools/BinWrappers/PosixLike/GenCrc32 @@ -1,29 +1,3 @@ #!/usr/bin/env bash -full_cmd=${BASH_SOURCE:-$0} # see http://mywiki.wooledge.org/BashFAQ/028 for a discussion of why $0 is not a good choice here -dir=$(dirname "$full_cmd") -cmd=${full_cmd##*/} - -if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ] -then - exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd" -elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ] -then - if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ] - then - echo "BaseTools C Tool binary was not found ($cmd)" - echo "You may need to run:" - echo " make -C $EDK_TOOLS_PATH/Source/C" - else - exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@" - fi -elif [ -e "$dir/../../Source/C/bin/$cmd" ] -then - exec "$dir/../../Source/C/bin/$cmd" "$@" -else - echo "Unable to find the real '$cmd' to run" - echo "This message was printed by" - echo " $0" - exit 127 -fi - +. GenericShellWrapper diff --git a/BaseTools/BinWrappers/PosixLike/GenFfs b/BaseTools/BinWrappers/PosixLike/GenFfs index 0945d86d9209..21fc00a930ee 100755 --- a/BaseTools/BinWrappers/PosixLike/GenFfs +++ b/BaseTools/BinWrappers/PosixLike/GenFfs @@ -1,29 +1,3 @@ #!/usr/bin/env bash -full_cmd=${BASH_SOURCE:-$0} # see http://mywiki.wooledge.org/BashFAQ/028 for a discussion of why $0 is not a good choice here -dir=$(dirname "$full_cmd") -cmd=${full_cmd##*/} - -if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ] -then - exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd" -elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ] -then - if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ] - then - echo "BaseTools C Tool binary was not found ($cmd)" - echo "You may need to run:" - echo " make -C $EDK_TOOLS_PATH/Source/C" - else - exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@" - fi -elif [ -e "$dir/../../Source/C/bin/$cmd" ] -then - exec "$dir/../../Source/C/bin/$cmd" "$@" -else - echo "Unable to find the real '$cmd' to run" - echo "This message was printed by" - echo " $0" - exit 127 -fi - +. GenericShellWrapper diff --git a/BaseTools/BinWrappers/PosixLike/GenFv b/BaseTools/BinWrappers/PosixLike/GenFv index 0945d86d9209..21fc00a930ee 100755 --- a/BaseTools/BinWrappers/PosixLike/GenFv +++ b/BaseTools/BinWrappers/PosixLike/GenFv @@ -1,29 +1,3 @@ #!/usr/bin/env bash -full_cmd=${BASH_SOURCE:-$0} # see http://mywiki.wooledge.org/BashFAQ/028 for a discussion of why $0 is not a good choice here -dir=$(dirname "$full_cmd") -cmd=${full_cmd##*/} - -if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ] -then - exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd" -elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ] -then - if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ] - then - echo "BaseTools C Tool binary was not found ($cmd)" - echo "You may need to run:" - echo " make -C $EDK_TOOLS_PATH/Source/C" - else - exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@" - fi -elif [ -e "$dir/../../Source/C/bin/$cmd" ] -then - exec "$dir/../../Source/C/bin/$cmd" "$@" -else - echo "Unable to find the real '$cmd' to run" - echo "This message was printed by" - echo " $0" - exit 127 -fi - +. GenericShellWrapper diff --git a/BaseTools/BinWrappers/PosixLike/GenFw b/BaseTools/BinWrappers/PosixLike/GenFw index 0945d86d9209..21fc00a930ee 100755 --- a/BaseTools/BinWrappers/PosixLike/GenFw +++ b/BaseTools/BinWrappers/PosixLike/GenFw @@ -1,29 +1,3 @@ #!/usr/bin/env bash -full_cmd=${BASH_SOURCE:-$0} # see http://mywiki.wooledge.org/BashFAQ/028 for a discussion of why $0 is not a good choice here -dir=$(dirname "$full_cmd") -cmd=${full_cmd##*/} - -if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ] -then - exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd" -elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ] -then - if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ] - then - echo "BaseTools C Tool binary was not found ($cmd)" - echo "You may need to run:" - echo " make -C $EDK_TOOLS_PATH/Source/C" - else - exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@" - fi -elif [ -e "$dir/../../Source/C/bin/$cmd" ] -then - exec "$dir/../../Source/C/bin/$cmd" "$@" -else - echo "Unable to find the real '$cmd' to run" - echo "This message was printed by" - echo " $0" - exit 127 -fi - +. GenericShellWrapper diff --git a/BaseTools/BinWrappers/PosixLike/GenSec b/BaseTools/BinWrappers/PosixLike/GenSec index 0945d86d9209..21fc00a930ee 100755 --- a/BaseTools/BinWrappers/PosixLike/GenSec +++ b/BaseTools/BinWrappers/PosixLike/GenSec @@ -1,29 +1,3 @@ #!/usr/bin/env bash -full_cmd=${BASH_SOURCE:-$0} # see http://mywiki.wooledge.org/BashFAQ/028 for a discussion of why $0 is not a good choice here -dir=$(dirname "$full_cmd") -cmd=${full_cmd##*/} - -if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ] -then - exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd" -elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ] -then - if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ] - then - echo "BaseTools C Tool binary was not found ($cmd)" - echo "You may need to run:" - echo " make -C $EDK_TOOLS_PATH/Source/C" - else - exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@" - fi -elif [ -e "$dir/../../Source/C/bin/$cmd" ] -then - exec "$dir/../../Source/C/bin/$cmd" "$@" -else - echo "Unable to find the real '$cmd' to run" - echo "This message was printed by" - echo " $0" - exit 127 -fi - +. GenericShellWrapper diff --git a/BaseTools/BinWrappers/PosixLike/GenericShellWrapper b/BaseTools/BinWrappers/PosixLike/GenericShellWrapper new file mode 100755 index 000000000000..dae593f785f1 --- /dev/null +++ b/BaseTools/BinWrappers/PosixLike/GenericShellWrapper @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +full_cmd=${BASH_SOURCE[-1]:-$0} # see http://mywiki.wooledge.org/BashFAQ/028 for a discussion of why $0 is not a good choice here +dir=$(dirname "$full_cmd") +cmd=${full_cmd##*/} + +if [ -n "$EDK_TOOLS_PATH" ] && [ -e "$EDK_TOOLS_PATH/Source/C/bin" ] +then + if [ -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ] + then + exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@" + fi +elif [ -e "$dir/../../Source/C/bin/$cmd" ] +then + exec "$dir/../../Source/C/bin/$cmd" "$@" +else + echo "Unable to find the real '$cmd' to run" + echo "This message was printed by" + echo " $0" + exit 127 +fi diff --git a/BaseTools/BinWrappers/PosixLike/LzmaCompress b/BaseTools/BinWrappers/PosixLike/LzmaCompress index 0945d86d9209..21fc00a930ee 100755 --- a/BaseTools/BinWrappers/PosixLike/LzmaCompress +++ b/BaseTools/BinWrappers/PosixLike/LzmaCompress @@ -1,29 +1,3 @@ #!/usr/bin/env bash -full_cmd=${BASH_SOURCE:-$0} # see http://mywiki.wooledge.org/BashFAQ/028 for a discussion of why $0 is not a good choice here -dir=$(dirname "$full_cmd") -cmd=${full_cmd##*/} - -if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ] -then - exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd" -elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ] -then - if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ] - then - echo "BaseTools C Tool binary was not found ($cmd)" - echo "You may need to run:" - echo " make -C $EDK_TOOLS_PATH/Source/C" - else - exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@" - fi -elif [ -e "$dir/../../Source/C/bin/$cmd" ] -then - exec "$dir/../../Source/C/bin/$cmd" "$@" -else - echo "Unable to find the real '$cmd' to run" - echo "This message was printed by" - echo " $0" - exit 127 -fi - +. GenericShellWrapper diff --git a/BaseTools/BinWrappers/PosixLike/TianoCompress b/BaseTools/BinWrappers/PosixLike/TianoCompress index 0945d86d9209..21fc00a930ee 100755 --- a/BaseTools/BinWrappers/PosixLike/TianoCompress +++ b/BaseTools/BinWrappers/PosixLike/TianoCompress @@ -1,29 +1,3 @@ #!/usr/bin/env bash -full_cmd=${BASH_SOURCE:-$0} # see http://mywiki.wooledge.org/BashFAQ/028 for a discussion of why $0 is not a good choice here -dir=$(dirname "$full_cmd") -cmd=${full_cmd##*/} - -if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ] -then - exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd" -elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ] -then - if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ] - then - echo "BaseTools C Tool binary was not found ($cmd)" - echo "You may need to run:" - echo " make -C $EDK_TOOLS_PATH/Source/C" - else - exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@" - fi -elif [ -e "$dir/../../Source/C/bin/$cmd" ] -then - exec "$dir/../../Source/C/bin/$cmd" "$@" -else - echo "Unable to find the real '$cmd' to run" - echo "This message was printed by" - echo " $0" - exit 127 -fi - +. GenericShellWrapper diff --git a/BaseTools/BinWrappers/PosixLike/VfrCompile b/BaseTools/BinWrappers/PosixLike/VfrCompile index 0945d86d9209..21fc00a930ee 100755 --- a/BaseTools/BinWrappers/PosixLike/VfrCompile +++ b/BaseTools/BinWrappers/PosixLike/VfrCompile @@ -1,29 +1,3 @@ #!/usr/bin/env bash -full_cmd=${BASH_SOURCE:-$0} # see http://mywiki.wooledge.org/BashFAQ/028 for a discussion of why $0 is not a good choice here -dir=$(dirname "$full_cmd") -cmd=${full_cmd##*/} - -if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ] -then - exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd" -elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ] -then - if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ] - then - echo "BaseTools C Tool binary was not found ($cmd)" - echo "You may need to run:" - echo " make -C $EDK_TOOLS_PATH/Source/C" - else - exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@" - fi -elif [ -e "$dir/../../Source/C/bin/$cmd" ] -then - exec "$dir/../../Source/C/bin/$cmd" "$@" -else - echo "Unable to find the real '$cmd' to run" - echo "This message was printed by" - echo " $0" - exit 127 -fi - +. GenericShellWrapper diff --git a/BaseTools/BinWrappers/PosixLike/VolInfo b/BaseTools/BinWrappers/PosixLike/VolInfo index 0945d86d9209..21fc00a930ee 100755 --- a/BaseTools/BinWrappers/PosixLike/VolInfo +++ b/BaseTools/BinWrappers/PosixLike/VolInfo @@ -1,29 +1,3 @@ #!/usr/bin/env bash -full_cmd=${BASH_SOURCE:-$0} # see http://mywiki.wooledge.org/BashFAQ/028 for a discussion of why $0 is not a good choice here -dir=$(dirname "$full_cmd") -cmd=${full_cmd##*/} - -if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ] -then - exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd" -elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ] -then - if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ] - then - echo "BaseTools C Tool binary was not found ($cmd)" - echo "You may need to run:" - echo " make -C $EDK_TOOLS_PATH/Source/C" - else - exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@" - fi -elif [ -e "$dir/../../Source/C/bin/$cmd" ] -then - exec "$dir/../../Source/C/bin/$cmd" "$@" -else - echo "Unable to find the real '$cmd' to run" - echo "This message was printed by" - echo " $0" - exit 127 -fi - +. GenericShellWrapper From 3fe1d56cc98e011bbde8348f13dfa5e38c95f49e Mon Sep 17 00:00:00 2001 From: Oleksandr Tymoshenko Date: Sat, 25 Oct 2025 00:18:59 +0000 Subject: [PATCH 1137/1172] BaseTools: Add support for out-of-tree builds Main EDK2 build supports out-of-tree builds but BaseTools make process still creates tools and object files in-tree. In order to make out-of-tree build support complete move the generated tools and interim obj files to $WORKSPACE location as well. This patch also changes the location of BaseTools for in-tree builds (default behavior when WORKSPACE is not provided before calling edksetup) to $WORKSPACE/BaseTools/Build/... It may potentially break external workflows that invoke tools from the default location outside of the build tool. Signed-off-by: Oleksandr Tymoshenko --- .../BinWrappers/PosixLike/BrotliCompress | 8 ++- .../BinWrappers/PosixLike/GenericShellWrapper | 8 ++- BaseTools/Source/C/GNUmakefile | 21 +++++--- BaseTools/Source/C/Makefiles/app.makefile | 9 ++-- BaseTools/Source/C/Makefiles/footer.makefile | 25 ++++++--- BaseTools/Source/C/Makefiles/header.makefile | 13 +++-- BaseTools/Source/C/Makefiles/lib.makefile | 8 ++- BaseTools/Source/C/VfrCompile/GNUmakefile | 51 ++++++++++--------- .../Source/C/VfrCompile/Pccts/antlr/makefile | 13 ++--- .../Source/C/VfrCompile/Pccts/dlg/makefile | 21 ++++---- .../Source/Python/Workspace/DscBuildData.py | 3 +- 11 files changed, 116 insertions(+), 64 deletions(-) diff --git a/BaseTools/BinWrappers/PosixLike/BrotliCompress b/BaseTools/BinWrappers/PosixLike/BrotliCompress index d9898e95e159..725f8e371482 100755 --- a/BaseTools/BinWrappers/PosixLike/BrotliCompress +++ b/BaseTools/BinWrappers/PosixLike/BrotliCompress @@ -36,7 +36,13 @@ do done -if [ -n "$EDK_TOOLS_PATH" ] && [ -e "$EDK_TOOLS_PATH/Source/C/bin" ] +if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/BaseTools/Build/Source/C/bin" ] +then + if [ -e "$WORKSPACE/BaseTools/Build/Source/C/bin/$cmd" ] + then + exec "$WORKSPACE/BaseTools/Build/Source/C/bin/$cmd" $QLT $ARGS + fi +eif [ -n "$EDK_TOOLS_PATH" ] && [ -e "$EDK_TOOLS_PATH/Source/C/bin" ] then if [ -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ] then diff --git a/BaseTools/BinWrappers/PosixLike/GenericShellWrapper b/BaseTools/BinWrappers/PosixLike/GenericShellWrapper index dae593f785f1..8aeff63c7764 100755 --- a/BaseTools/BinWrappers/PosixLike/GenericShellWrapper +++ b/BaseTools/BinWrappers/PosixLike/GenericShellWrapper @@ -4,7 +4,13 @@ full_cmd=${BASH_SOURCE[-1]:-$0} # see http://mywiki.wooledge.org/BashFAQ/028 for dir=$(dirname "$full_cmd") cmd=${full_cmd##*/} -if [ -n "$EDK_TOOLS_PATH" ] && [ -e "$EDK_TOOLS_PATH/Source/C/bin" ] +if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/BaseTools/Build/Source/C/bin" ] +then + if [ -e "$WORKSPACE/BaseTools/Build/Source/C/bin/$cmd" ] + then + exec "$WORKSPACE/BaseTools/Build/Source/C/bin/$cmd" "$@" + fi +elif [ -n "$EDK_TOOLS_PATH" ] && [ -e "$EDK_TOOLS_PATH/Source/C/bin" ] then if [ -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ] then diff --git a/BaseTools/Source/C/GNUmakefile b/BaseTools/Source/C/GNUmakefile index 73f4b27eeb71..8661165a4470 100644 --- a/BaseTools/Source/C/GNUmakefile +++ b/BaseTools/Source/C/GNUmakefile @@ -13,6 +13,12 @@ else MAKEROOT := . endif +ifneq ($(WORKSPACE),) + BUILDROOT=$(WORKSPACE)/BaseTools/Build/Source/C +else + BUILDROOT=$(abspath $(MAKEROOT)) +endif + include Makefiles/header.makefile export PYTHON_COMMAND @@ -38,28 +44,29 @@ APPLICATIONS = \ SUBDIRS := $(LIBRARIES) $(APPLICATIONS) -$(LIBRARIES): $(MAKEROOT)/libs -$(APPLICATIONS): $(LIBRARIES) $(MAKEROOT)/bin +$(LIBRARIES): $(BUILDROOT)/libs +$(APPLICATIONS): $(LIBRARIES) $(BUILDROOT)/bin .PHONY: outputdirs makerootdir: - -$(MD) $(MAKEROOT) + -$(MD) $(BUILDROOT) .PHONY: subdirs $(SUBDIRS) subdirs: $(SUBDIRS) $(SUBDIRS): - $(MAKE) -C $@ + -$(MD) $(BUILDROOT)/$@ + $(MAKE) OBJDIR=$(BUILDROOT)/$@ BUILDROOT=$(BUILDROOT) -C $@ .PHONY: $(patsubst %,%-clean,$(sort $(SUBDIRS))) $(patsubst %,%-clean,$(sort $(SUBDIRS))): - -$(MAKE) -C $(@:-clean=) clean + -$(MAKE) OBJDIR=$(BUILDROOT)/$(@:-clean=) BUILDROOT=$(BUILDROOT) -C $(@:-clean=) clean clean: $(patsubst %,%-clean,$(sort $(SUBDIRS))) clean: localClean localClean: - $(RM) $(MAKEROOT)/bin/* - -$(RD) $(MAKEROOT)/libs $(MAKEROOT)/bin + $(RM) $(BUILDROOT)/bin/* + -$(RD) $(BUILDROOT)/libs $(BUILDROOT)/bin include Makefiles/footer.makefile diff --git a/BaseTools/Source/C/Makefiles/app.makefile b/BaseTools/Source/C/Makefiles/app.makefile index b66e564b3bcf..475cb88d04db 100644 --- a/BaseTools/Source/C/Makefiles/app.makefile +++ b/BaseTools/Source/C/Makefiles/app.makefile @@ -6,16 +6,19 @@ # MAKEROOT ?= ../.. +BUILDROOT ?= $(MAKEROOT) +OBJDIR ?= . +OBJECTS := $(addprefix $(OBJDIR)/,$(OBJECTS)) include $(MAKEROOT)/Makefiles/header.makefile -APPLICATION = $(MAKEROOT)/bin/$(APPNAME) +APPLICATION = $(BUILDROOT)/bin/$(APPNAME) .PHONY:all -all: $(MAKEROOT)/bin $(APPLICATION) +all: $(BUILDROOT)/bin $(APPLICATION) $(APPLICATION): $(OBJECTS) - $(LINKER) -o $(APPLICATION) $(LDFLAGS) $(OBJECTS) -L$(MAKEROOT)/libs $(LIBS) + $(LINKER) -o $(APPLICATION) $(LDFLAGS) $(OBJECTS) -L$(BUILDROOT)/libs $(LIBS) ifeq (Windows, $(findstring Windows,$(OS))) $(CP) $(APPLICATION).exe $(BIN_PATH) endif diff --git a/BaseTools/Source/C/Makefiles/footer.makefile b/BaseTools/Source/C/Makefiles/footer.makefile index 9a3dfcd49440..7d608a5e826f 100644 --- a/BaseTools/Source/C/Makefiles/footer.makefile +++ b/BaseTools/Source/C/Makefiles/footer.makefile @@ -7,24 +7,37 @@ DEPFILES = $(OBJECTS:%.o=%.d) -$(MAKEROOT)/libs-$(HOST_ARCH): - $(MD) $(MAKEROOT)/libs-$(HOST_ARCH) +$(BUILDROOT)/libs-$(HOST_ARCH): + $(MD) $(BUILDROOT)/libs-$(HOST_ARCH) .PHONY: install -install: $(MAKEROOT)/libs-$(HOST_ARCH) $(LIBRARY) - $(CP) $(LIBRARY) $(MAKEROOT)/libs-$(HOST_ARCH) +install: $(BUILDROOT)/libs-$(HOST_ARCH) $(LIBRARY) + $(CP) $(LIBRARY) $(BUILDROOT)/libs-$(HOST_ARCH) $(LIBRARY): $(OBJECTS) $(AR) crs $@ $^ -%.o : %.c +$(OBJDIR)/%.o : %.c + @$(MD) $(@D) $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@ -%.o : %.cpp +$(OBJDIR)/%.o : %.cpp + @$(MD) $(@D) $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ +$(OBJECTS): | $(OBJDIR) + +$(OBJDIR)/%.d : %.c + @set -e; rm -f $@; \ + $(MD) $(@D); \ + $(CC) -M $(CPPFLAGS) $< > $@.$$$$; \ + sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ + rm -f $@.$$$$ + .PHONY: clean clean: $(RM) $(OBJECTS) $(LIBRARY) $(DEPFILES) +ifneq ($(MAKECMDGOALS), clean) -include $(DEPFILES) +endif diff --git a/BaseTools/Source/C/Makefiles/header.makefile b/BaseTools/Source/C/Makefiles/header.makefile index d63f487724a5..286bc5235dd2 100644 --- a/BaseTools/Source/C/Makefiles/header.makefile +++ b/BaseTools/Source/C/Makefiles/header.makefile @@ -206,11 +206,16 @@ LDFLAGS += $(EXTRA_LDFLAGS) all: -$(MAKEROOT)/libs: - $(MD) $(MAKEROOT)/libs +$(BUILDROOT)/libs: + $(MD) $(BUILDROOT)/libs -$(MAKEROOT)/bin: - $(MD) $(MAKEROOT)/bin +$(BUILDROOT)/bin: + $(MD) $(BUILDROOT)/bin ifeq (Windows, $(findstring Windows,$(OS))) $(MD) $(BIN_PATH) endif + +ifdef OBJDIR +$(OBJDIR): + $(MD) $(OBJDIR) +endif diff --git a/BaseTools/Source/C/Makefiles/lib.makefile b/BaseTools/Source/C/Makefiles/lib.makefile index 2577c15380a9..e2186b68639f 100644 --- a/BaseTools/Source/C/Makefiles/lib.makefile +++ b/BaseTools/Source/C/Makefiles/lib.makefile @@ -5,10 +5,14 @@ # SPDX-License-Identifier: BSD-2-Clause-Patent # +BUILDROOT ?= $(MAKEROOT) +OBJDIR ?= . +OBJECTS := $(addprefix $(OBJDIR)/,$(OBJECTS)) + include $(MAKEROOT)/Makefiles/header.makefile -LIBRARY = $(MAKEROOT)/libs/lib$(LIBNAME).a +LIBRARY = $(BUILDROOT)/libs/lib$(LIBNAME).a -all: $(MAKEROOT)/libs $(LIBRARY) +all: $(BUILDROOT)/libs $(LIBRARY) include $(MAKEROOT)/Makefiles/footer.makefile diff --git a/BaseTools/Source/C/VfrCompile/GNUmakefile b/BaseTools/Source/C/VfrCompile/GNUmakefile index b469bd3f303f..3cdf68298bb3 100644 --- a/BaseTools/Source/C/VfrCompile/GNUmakefile +++ b/BaseTools/Source/C/VfrCompile/GNUmakefile @@ -8,14 +8,16 @@ MAKEROOT ?= .. APPNAME = VfrCompile +BUILDROOT ?= $(MAKEROOT) +OBJDIR ?= $(abspath .) LIBS = -lCommon TOOL_INCLUDE = -I Pccts/h -#OBJECTS = VfrSyntax.o VfrServices.o DLGLexer.o EfiVfrParser.o ATokenBuffer.o DLexerBase.o AParser.o OBJECTS = AParser.o DLexerBase.o ATokenBuffer.o EfiVfrParser.o VfrLexer.o VfrSyntax.o \ VfrFormPkg.o VfrError.o VfrUtilityLib.o VfrCompiler.o +OBJECTS := $(addprefix $(OBJDIR)/,$(OBJECTS)) CLANG := $(findstring clang,$(shell $(CC) --version)) ifneq ($(CLANG),) VFR_CPPFLAGS = -Wno-deprecated-register -std=c++14 -DPCCTS_USE_NAMESPACE_STD $(CPPFLAGS) @@ -30,22 +32,18 @@ VFR_LFLAGS = $(EXTRA_LDFLAGS) LINKER = $(CXX) -EXTRA_CLEAN_OBJECTS = EfiVfrParser.cpp EfiVfrParser.h VfrParser.dlg VfrTokens.h VfrLexer.cpp VfrLexer.h VfrSyntax.cpp tokens.h - -MAKEROOT ?= ../.. - include $(MAKEROOT)/Makefiles/header.makefile -APPLICATION = $(MAKEROOT)/bin/$(APPNAME) +APPLICATION = $(BUILDROOT)/bin/$(APPNAME) -BIN_DIR=. +BIN_DIR=$(OBJDIR) export BIN_DIR .PHONY:all -all: $(MAKEROOT)/bin $(APPLICATION) +all: $(BUILDROOT)/bin $(APPLICATION) $(APPLICATION): $(OBJECTS) - $(LINKER) -o $(APPLICATION) $(VFR_LFLAGS) $(OBJECTS) -L$(MAKEROOT)/libs $(LIBS) + $(LINKER) -o $(APPLICATION) $(VFR_LFLAGS) $(OBJECTS) -L$(BUILDROOT)/libs $(LIBS) ifeq (Windows, $(findstring Windows,$(OS))) $(CP) $(APPLICATION).exe $(BIN_PATH) endif @@ -54,35 +52,42 @@ VfrCompiler.o: ../Include/Common/BuildVersion.h include $(MAKEROOT)/Makefiles/footer.makefile -VfrSyntax.cpp EfiVfrParser.cpp EfiVfrParser.h VfrParser.dlg VfrTokens.h: Pccts/antlr/antlr VfrSyntax.g - Pccts/antlr/antlr -CC -e3 -ck 3 -k 2 -fl VfrParser.dlg -ft VfrTokens.h -o . VfrSyntax.g +GEN_SYNTAX_FILES := $(addprefix $(OBJDIR)/,VfrSyntax.cpp EfiVfrParser.cpp EfiVfrParser.h VfrParser.dlg VfrTokens.h) +$(GEN_SYNTAX_FILES): $(OBJDIR)/antlr VfrSyntax.g + $(OBJDIR)/antlr -CC -e3 -ck 3 -k 2 -fl VfrParser.dlg -ft VfrTokens.h -o $(OBJDIR) VfrSyntax.g + +GEN_LEXER_FILES := $(addprefix $(OBJDIR)/,VfrLexer.cpp VfrLexer.h) +$(GEN_LEXER_FILES): $(OBJDIR)/dlg $(OBJDIR)/VfrParser.dlg + $(OBJDIR)/dlg -C2 -i -CC -cl VfrLexer -o $(OBJDIR) $(OBJDIR)/VfrParser.dlg + +EXTRA_CLEAN_OBJECTS = $(GEN_SYNTAX_FILES) $(GEN_LEXER_FILES) -VfrLexer.cpp VfrLexer.h: Pccts/dlg/dlg VfrParser.dlg - Pccts/dlg/dlg -C2 -i -CC -cl VfrLexer -o . VfrParser.dlg +$(OBJDIR)/Pccts/antlr $(OBJDIR)/Pccts/dlg: + $(MD) $@ -Pccts/antlr/antlr: - $(MAKE) -C Pccts/antlr +$(OBJDIR)/antlr: | $(OBJDIR)/Pccts/antlr + $(MAKE) OBJDIR=$(OBJDIR)/Pccts/antlr -C Pccts/antlr -Pccts/dlg/dlg: - $(MAKE) -C Pccts/dlg +$(OBJDIR)/dlg: | $(OBJDIR)/Pccts/dlg + $(MAKE) OBJDIR=$(OBJDIR)/Pccts/dlg -C Pccts/dlg -ATokenBuffer.o: Pccts/h/ATokenBuffer.cpp +$(OBJDIR)/ATokenBuffer.o: Pccts/h/ATokenBuffer.cpp $(CXX) -c $(VFR_CPPFLAGS) $(INC) $(VFR_CXXFLAGS) $? -o $@ -DLexerBase.o: Pccts/h/DLexerBase.cpp +$(OBJDIR)/DLexerBase.o: Pccts/h/DLexerBase.cpp $(CXX) -c $(VFR_CPPFLAGS) $(INC) $(VFR_CXXFLAGS) $? -o $@ -AParser.o: Pccts/h/AParser.cpp +$(OBJDIR)/AParser.o: Pccts/h/AParser.cpp $(CXX) -c $(VFR_CPPFLAGS) $(INC) $(VFR_CXXFLAGS) $? -o $@ -VfrSyntax.o: VfrSyntax.cpp +$(OBJDIR)/VfrSyntax.o: $(OBJDIR)/VfrSyntax.cpp $(CXX) -c $(VFR_CPPFLAGS) $(INC) $(VFR_CXXFLAGS) $? -o $@ clean: localClean localClean: - $(MAKE) -C Pccts/antlr clean - $(MAKE) -C Pccts/dlg clean + $(MAKE) OBJDIR=$(OBJDIR)/Pccts/antlr -C Pccts/antlr clean + $(MAKE) OBJDIR=$(OBJDIR)/Pccts/dlg -C Pccts/dlg clean $(RM) $(EXTRA_CLEAN_OBJECTS) ifeq (Windows, $(findstring Windows,$(OS))) $(RM) $(BIN_PATH)/$(APPNAME).exe diff --git a/BaseTools/Source/C/VfrCompile/Pccts/antlr/makefile b/BaseTools/Source/C/VfrCompile/Pccts/antlr/makefile index ca0783b52ef3..77a289ef1c83 100644 --- a/BaseTools/Source/C/VfrCompile/Pccts/antlr/makefile +++ b/BaseTools/Source/C/VfrCompile/Pccts/antlr/makefile @@ -184,6 +184,7 @@ CPPFLAGS= #CFLAGS= -O -I. -I$(SET) -I$(PCCTS_H) -DUSER_ZZSYN -woff 3262 OBJ=antlr.o scan.o err.o bits.o build.o fset2.o fset.o gen.o \ globals.o hash.o lex.o main.o misc.o set.o pred.o egman.o mrhoist.o fcache.o +OBJ := $(addprefix $(OBJDIR)/,$(OBJ)) $(BIN_DIR)/antlr : $(OBJ) $(SRC) $(CC) $(CFLAGS) -o $(BIN_DIR)/antlr $(OBJ) @@ -201,17 +202,17 @@ SRC=antlr.c scan.c err.c bits.c build.c fset2.c fset.c gen.c globals.c \ #antlr.c stdpccts.h parser.dlg tokens.h err.c : antlr.g # $(ANTLR) -gh antlr.g -antlr.o : antlr.c mode.h tokens.h +$(OBJDIR)/antlr.o : antlr.c mode.h tokens.h -scan.o : scan.c mode.h tokens.h +$(OBJDIR)/scan.o : scan.c mode.h tokens.h #scan.c mode.h: parser.dlg # $(DLG) -C2 parser.dlg scan.c -set.o : $(SET)/set.c - $(CC) $(CFLAGS) -c -o set.o $(SET)/set.c +$(OBJDIR)/set.o : $(SET)/set.c + $(CC) $(CFLAGS) -c -o $@ $< -%.o : %.c +$(OBJDIR)/%.o : %.c $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ # @@ -220,7 +221,7 @@ set.o : $(SET)/set.c #clean up all the intermediate files clean: - $(RM) $(BIN_DIR)$(SEP)antlr *.$(OBJ_EXT) core + $(RM) $(BIN_DIR)$(SEP)antlr $(OBJDIR)$(SEP)*.$(OBJ_EXT) core #remove everything in clean plus the PCCTS files generated scrub: diff --git a/BaseTools/Source/C/VfrCompile/Pccts/dlg/makefile b/BaseTools/Source/C/VfrCompile/Pccts/dlg/makefile index 303ebe43f246..bd1dfca4c83e 100644 --- a/BaseTools/Source/C/VfrCompile/Pccts/dlg/makefile +++ b/BaseTools/Source/C/VfrCompile/Pccts/dlg/makefile @@ -137,6 +137,7 @@ OBJ_EXT=o OUT_OBJ = -o OBJ = dlg_p.o dlg_a.o main.o err.o set.o support.o output.o \ relabel.o automata.o +OBJ := $(addprefix $(OBJDIR)/,$(OBJ)) $(BIN_DIR)/dlg : $(OBJ) $(SRC) $(CC) $(CFLAGS) -o $(BIN_DIR)/dlg $(OBJ) @@ -150,19 +151,19 @@ SRC = dlg_p.c dlg_a.c main.c err.c $(SET)/set.c support.c output.c \ #dlg_a.c mode.h : parser.dlg # $(DLG) -C2 parser.dlg dlg_a.c -dlg_p.$(OBJ_EXT) : dlg_p.c dlg.h tokens.h mode.h - $(CC) $(CFLAGS) -c dlg_p.c +$(OBJDIR)/dlg_p.$(OBJ_EXT) : dlg_p.c dlg.h tokens.h mode.h + $(CC) $(CFLAGS) -o $@ -c dlg_p.c -dlg_a.$(OBJ_EXT) : dlg_a.c dlg.h tokens.h mode.h - $(CC) $(CFLAGS) -c dlg_a.c +$(OBJDIR)/dlg_a.$(OBJ_EXT) : dlg_a.c dlg.h tokens.h mode.h + $(CC) $(CFLAGS) -o $@ -c dlg_a.c -main.$(OBJ_EXT) : main.c dlg.h - $(CC) $(CFLAGS) -c main.c +$(OBJDIR)/main.$(OBJ_EXT) : main.c dlg.h + $(CC) $(CFLAGS) -o $@ -c main.c -set.$(OBJ_EXT) : $(SET)/set.c - $(CC) -c $(CFLAGS) $(SET)/set.c +$(OBJDIR)/set.$(OBJ_EXT) : $(SET)/set.c + $(CC) -c $(CFLAGS) -o $@ $(SET)/set.c -%.o : %.c +$(OBJDIR)/%.o : %.c $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ lint: @@ -170,4 +171,4 @@ lint: #clean up all the intermediate files clean: - $(RM) $(BIN_DIR)$(SEP)dlg *.$(OBJ_EXT) core + $(RM) $(BIN_DIR)$(SEP)dlg $(OBJDIR)$(SEP)*.$(OBJ_EXT) core diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py index 014f6d08058c..ddb576fdebb4 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -2942,7 +2942,8 @@ def GenerateByteArrayValue (self, StructuredPcds): else: AppSuffix = '.exe' if sys.platform == "win32" else '' MakeApp = MakeApp + PcdGccMakefile - MakeApp = MakeApp + 'APPFILE = %s%s%s%s\n' % (self.OutputPath, os.sep, PcdValueInitName, AppSuffix) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o %s.o\n' % (self.OutputPath, PcdValueInitName, os.path.join(self.OutputPath, PcdValueCommonName)) + \ + MakeApp = MakeApp + 'OBJDIR = %s\n' % self.OutputPath + MakeApp = MakeApp + 'APPFILE = %s%s%s%s\n' % (self.OutputPath, os.sep, PcdValueInitName, AppSuffix) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s.o %s.o\n' % (PcdValueInitName, PcdValueCommonName) + \ 'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'TOOL_INCLUDE +=' IncSearchList = [] From 3a46febf9b828da637456d7426c29dda011a7754 Mon Sep 17 00:00:00 2001 From: Doug Flick Date: Fri, 30 Jan 2026 09:41:52 -0800 Subject: [PATCH 1138/1172] Maintainers.txt: Add Doug Flick as maintainer for CryptoPkg As the Microsoft representative for Secure Boot and Crypto for Post-Quantum Cryptography (PQC), I intend to help review PQC-related changes and help drive industry adoption of PQC algorithms in UEFI firmware. Signed-off-by: Doug Flick --- Maintainers.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Maintainers.txt b/Maintainers.txt index 16476cf8c221..86e20ff0dee0 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -189,6 +189,7 @@ F: CryptoPkg/ W: https://github.com/tianocore/tianocore.github.io/wiki/CryptoPkg M: Jiewen Yao [jyao1] M: Yi Li [liyi77] +M: Doug Flick [flickdm] DynamicTablesPkg F: DynamicTablesPkg/ From ffa6fc362aaf0e8d0bb3344e2d2cbe87aaa75531 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Thu, 22 Jan 2026 07:29:58 -0800 Subject: [PATCH 1139/1172] StandaloneMmPkg: StandaloneMmCore: Don't Print Entry/Exit Logs Currently, StandaloneMmCore prints for every MM entry and exit as well as producing protocols for MM entry and exit that get logged. So there are four logs for every MM entry/exit pair. In a sample OVMF run with StMM enabled, this produced 6,800 logs to log MM entry/exit out of 16,400 logs. In other words, > 1/3 of logs were for these prints. In general, entry and exit logs are not that useful outside of very specific debugging scenarios This commit drops the entry/exit prints. Signed-off-by: Oliver Smith-Denny --- StandaloneMmPkg/Core/StandaloneMmCore.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/StandaloneMmPkg/Core/StandaloneMmCore.c b/StandaloneMmPkg/Core/StandaloneMmCore.c index 2345f9a2322a..b3908655dfa1 100644 --- a/StandaloneMmPkg/Core/StandaloneMmCore.c +++ b/StandaloneMmPkg/Core/StandaloneMmCore.c @@ -512,8 +512,6 @@ MmEntryPoint ( UINTN CommGuidOffset; UINTN CommHeaderSize; - DEBUG ((DEBUG_INFO, "MmEntryPoint ...\n")); - // // Update MMST using the context // @@ -642,8 +640,6 @@ MmEntryPoint ( // // TBD: Do not use private data structure ? // - - DEBUG ((DEBUG_INFO, "MmEntryPoint Done\n")); } /** Register the MM Entry Point provided by the MM Core with the From f0eade598462400380cdd191e0b4b5aeade6ec68 Mon Sep 17 00:00:00 2001 From: Oliver Smith-Denny Date: Thu, 22 Jan 2026 07:31:58 -0800 Subject: [PATCH 1140/1172] StandaloneMmPkg: StandaloneMmCore: Log MM Entry/Exit Protocol at Verbose Currently, StandaloneMmCore prints for every MM entry and exit as well as producing protocols for MM entry and exit that get logged. So there are four logs for every MM entry/exit pair. In a sample OVMF run with StMM enabled, this produced 6800 logs to log MM entry/exit out of 16,400 logs. In other words, > 1/3 of logs were for these prints. Protocol install notifications are useful, but not for these ones that are just entry and exit notifies. This commit only logs at verbose level if the protocol installed is the entry or exit protocol. Signed-off-by: Oliver Smith-Denny --- StandaloneMmPkg/Core/Handle.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/StandaloneMmPkg/Core/Handle.c b/StandaloneMmPkg/Core/Handle.c index 7df4629cf291..31d67318768f 100644 --- a/StandaloneMmPkg/Core/Handle.c +++ b/StandaloneMmPkg/Core/Handle.c @@ -233,9 +233,15 @@ MmInstallProtocolInterfaceNotify ( } // - // Print debug message + // Print debug message unless installing MM entry/exit notify protocol as that spams the log // - DEBUG ((DEBUG_LOAD | DEBUG_INFO, "MmInstallProtocolInterface: %g %p\n", Protocol, Interface)); + if (!CompareGuid (Protocol, &gEfiMmEntryNotifyProtocolGuid) && + !CompareGuid (Protocol, &gEfiMmExitNotifyProtocolGuid)) + { + DEBUG ((DEBUG_LOAD | DEBUG_INFO, "MmInstallProtocolInterface: Installing non-entry/exit protocol %g %p\n", Protocol, Interface)); + } else { + DEBUG ((DEBUG_VERBOSE, "MmInstallProtocolInterface: Installing entry/exit protocol %g %p\n", Protocol, Interface)); + } Status = EFI_OUT_OF_RESOURCES; Prot = NULL; From 11d04a2975e4702fb69cba7aa87d6f502cb422e9 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Wed, 14 Jan 2026 01:37:16 -0800 Subject: [PATCH 1141/1172] StandaloneMmPkg: StandaloneMmIplPei: MM Communicate v3 header check fix The current check for MM communicate v3 header has a logic error when using `CompareGuid`. This change fixed the issue. Signed-off-by: Kun Qin --- StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c index ab0d22d5ca67..d2e77e7220f1 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c @@ -189,7 +189,7 @@ Communicate3 ( // // Check if the HeaderGuid is valid // - if (CompareGuid (&CommunicateHeader->HeaderGuid, &gEfiMmCommunicateHeaderV3Guid)) { + if (CompareGuid (&CommunicateHeader->HeaderGuid, &gEfiMmCommunicateHeaderV3Guid) == FALSE) { DEBUG ((DEBUG_ERROR, "HeaderGuid is not valid!\n")); return EFI_INVALID_PARAMETER; } From 25462a6ab2496d06690b64f2b9afa909fb15a6c2 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Tue, 13 Jan 2026 16:07:31 -0800 Subject: [PATCH 1142/1172] MdeModulePkg: MmVariablePei: Populate correct v3 header When using MM communicate v3 to fetch variable, the header calculation was incorrect, causing the variable driver on the secure environment to have random behavior. This change refactored the original routine by following the current DXE instance (mostly). Signed-off-by: Kun Qin --- .../Variable/MmVariablePei/MmVariablePei.c | 514 +++++++++++++----- .../Variable/MmVariablePei/MmVariablePei.h | 1 + .../Variable/MmVariablePei/MmVariablePei.inf | 1 + 3 files changed, 373 insertions(+), 143 deletions(-) diff --git a/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.c b/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.c index eac1da50ca87..826b119184fe 100644 --- a/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.c +++ b/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.c @@ -8,8 +8,6 @@ #include "MmVariablePei.h" -#define MM_VARIABLE_COMM_BUFFER_OFFSET (SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE) - // // Module globals // @@ -45,130 +43,299 @@ PeiMmVariableInitialize ( } /** - Helper function to populate MM communicate header and variable communicate header - and then communicate to PEI. + Helper function to check if the PEI MM Communication PPI v3 is available, + and initialize the v3 communicate buffer accordingly. - @param[in, out] CommunicateBuffer Size of the variable name. - @param[in] CommunicateBufferSize The entire buffer size to be sent to MM. - @param[in] Function The MM variable function value. + @param DataSize The data size to send to MM. + @param DataBuffer The allocated communicate buffer to be used for communication. + @param BufferPageSize The size of the allocated communicate buffer in pages. + @param MmCommunicationPpiV3Stub The located PEI MM Communication3 PPI stub. + @param MmVariableFunctionHeader The pointer to the variable function header in the communicate buffer. - @retval EFI_INVALID_PARAMETER Invalid parameter. - @retval EFI_SUCCESS Find the specified variable. - @retval Others Errors returned by MM communicate or variable service. + @retval EFI_INVALID_PARAMETER The data size is too big. Or input pointers are NULL. + @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. + @retval EFI_NOT_FOUND The PEI MM Communication3 PPI is not available. + @retval EFI_SUCCESS The communicate buffer is initialized successfully. **/ +static EFI_STATUS -PopulateHeaderAndCommunicate ( - IN OUT UINT8 *CommunicateBuffer, - IN UINTN CommunicateBufferSize, - IN UINTN Function +InternalInitCommBufferV3 ( + IN UINTN DataSize, + OUT VOID **DataBuffer, + OUT UINTN *BufferPageSize, + OUT EFI_PEI_MM_COMMUNICATION3_PPI **MmCommunicationPpiV3Stub, + OUT SMM_VARIABLE_COMMUNICATE_HEADER **MmVariableFunctionHeader ) { - EFI_STATUS Status; - EFI_PEI_MM_COMMUNICATION_PPI *MmCommunicationPpi; - EFI_PEI_MM_COMMUNICATION3_PPI *MmCommunicationPpiV3; - EFI_MM_COMMUNICATE_HEADER *MmCommunicateHeader; - EFI_MM_COMMUNICATE_HEADER_V3 *MmCommunicateHeaderV3; - SMM_VARIABLE_COMMUNICATE_HEADER *MmVarCommsHeader; - - // Minimal sanity check - if ((CommunicateBuffer == NULL) || - (CommunicateBufferSize < MM_VARIABLE_COMM_BUFFER_OFFSET)) + EFI_STATUS Status; + EFI_MM_COMMUNICATE_HEADER_V3 *MmCommunicateHeaderV3; + UINT8 *MmCommunicateBuffer; + UINTN RequiredPages; + + // Should not be NULL + if ((MmCommunicationPpiV3Stub == NULL) || + (DataBuffer == NULL) || + (BufferPageSize == NULL) || + (MmVariableFunctionHeader == NULL)) { - Status = EFI_INVALID_PARAMETER; - DEBUG ((DEBUG_ERROR, "%a: Invalid incoming parameters: %p and 0x%x\n", __func__, CommunicateBuffer, CommunicateBufferSize)); - goto Exit; + return EFI_INVALID_PARAMETER; + } + + *DataBuffer = NULL; + + Status = PeiServicesLocatePpi (&gEfiPeiMmCommunication3PpiGuid, 0, NULL, (VOID **)MmCommunicationPpiV3Stub); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, "%a: Unable to locate PEI MM Communication3 PPI: %r\n", __func__, Status)); + return EFI_NOT_FOUND; + } + + RequiredPages = EFI_SIZE_TO_PAGES (DataSize + SMM_COMMUNICATE_HEADER_SIZE_V3 + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE); + MmCommunicateBuffer = (UINT8 *)AllocatePages (RequiredPages); + if (MmCommunicateBuffer == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Failed to allocate memory\n", __func__)); + return EFI_OUT_OF_RESOURCES; } - if ((Function != SMM_VARIABLE_FUNCTION_GET_NEXT_VARIABLE_NAME) && - (Function != SMM_VARIABLE_FUNCTION_GET_VARIABLE)) + ZeroMem (MmCommunicateBuffer, RequiredPages * EFI_PAGE_SIZE); + MmCommunicateHeaderV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)MmCommunicateBuffer; + CopyGuid (&MmCommunicateHeaderV3->HeaderGuid, &gEfiMmCommunicateHeaderV3Guid); + MmCommunicateHeaderV3->BufferSize = RequiredPages * EFI_PAGE_SIZE; + CopyGuid (&MmCommunicateHeaderV3->MessageGuid, &gEfiSmmVariableProtocolGuid); + MmCommunicateHeaderV3->MessageSize = DataSize + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE; + *MmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)MmCommunicateHeaderV3->MessageData; + + *DataBuffer = MmCommunicateBuffer; + *BufferPageSize = RequiredPages; + + return EFI_SUCCESS; +} + +/** + Helper function to check if the PEI MM Communication PPI v1 is available, + and initialize the v1 communicate buffer accordingly. + + @param DataSize The data size to send to MM. + @param DataBuffer The allocated communicate buffer to be used for communication. + @param BufferPageSize The size of the allocated communicate buffer in pages. + @param MmCommunicationPpiV1Stub The located PEI MM Communication1 PPI stub. + @param MmVariableFunctionHeader The pointer to the variable function header in the communicate buffer. + + @retval EFI_INVALID_PARAMETER The data size is too big. Or input pointers are NULL. + @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. + @retval EFI_UNSUPPORTED The PEI MM Communication1 PPI is not available. + @retval EFI_SUCCESS The communicate buffer is initialized successfully. + +**/ +static +EFI_STATUS +InternalInitCommBufferV1 ( + IN UINTN DataSize, + OUT VOID **DataBuffer, + OUT UINTN *BufferPageSize, + OUT EFI_PEI_MM_COMMUNICATION_PPI **MmCommunicationPpiV1Stub, + OUT SMM_VARIABLE_COMMUNICATE_HEADER **MmVariableFunctionHeader + ) +{ + EFI_STATUS Status; + EFI_MM_COMMUNICATE_HEADER *MmCommunicateHeader; + UINT8 *MmCommunicateBuffer; + UINTN RequiredPages; + + // Should not be NULL + if ((MmCommunicationPpiV1Stub == NULL) || + (DataBuffer == NULL) || + (BufferPageSize == NULL) || + (MmVariableFunctionHeader == NULL)) { - Status = EFI_INVALID_PARAMETER; - DEBUG ((DEBUG_ERROR, "%a: Invalid function value: 0x%x\n", __func__, Function)); - goto Exit; + return EFI_INVALID_PARAMETER; } - MmCommunicationPpiV3 = NULL; - MmCommunicationPpi = NULL; + *DataBuffer = NULL; - Status = PeiServicesLocatePpi (&gEfiPeiMmCommunication3PpiGuid, 0, NULL, (VOID **)&MmCommunicationPpiV3); + Status = PeiServicesLocatePpi (&gEfiPeiMmCommunicationPpiGuid, 0, NULL, (VOID **)MmCommunicationPpiV1Stub); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_WARN, "%a: Unable to locate PEI MM Communication3 PPI: %r\n", __func__, Status)); - // Try to locate the older version of the PPI - Status = PeiServicesLocatePpi (&gEfiPeiMmCommunicationPpiGuid, 0, NULL, (VOID **)&MmCommunicationPpi); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "%a: Failed to locate PEI MM Communication PPI: %r\n", __func__, Status)); - goto Exit; - } + DEBUG ((DEBUG_WARN, "%a: Unable to locate PEI MM Communication PPI: %r\n", __func__, Status)); + return EFI_UNSUPPORTED; } - if (MmCommunicationPpiV3 != NULL) { - // Zero the entire Communication Buffer Header - MmCommunicateHeaderV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)CommunicateBuffer; + // Use v1 communication header, if v3 protocol is not available. + RequiredPages = EFI_SIZE_TO_PAGES (DataSize + SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE); + MmCommunicateBuffer = (UINT8 *)AllocatePages (RequiredPages); + if (MmCommunicateBuffer == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Failed to allocate memory\n", __func__)); + return EFI_OUT_OF_RESOURCES; + } - ZeroMem (MmCommunicateHeaderV3, SMM_COMMUNICATE_HEADER_SIZE_V3); + ZeroMem (MmCommunicateBuffer, RequiredPages * EFI_PAGE_SIZE); + MmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)MmCommunicateBuffer; + CopyGuid (&MmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid); + MmCommunicateHeader->MessageLength = DataSize + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE; + *MmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)MmCommunicateHeader->Data; - // Use gEfiSmmVariableProtocolGuid to request the MM variable service in Standalone MM - CopyMem ((VOID *)&MmCommunicateHeaderV3->HeaderGuid, &gEfiMmCommunicateHeaderV3Guid, sizeof (GUID)); - MmCommunicateHeaderV3->BufferSize = CommunicateBufferSize; + *DataBuffer = MmCommunicateBuffer; + *BufferPageSize = RequiredPages; - CopyMem ((VOID *)&MmCommunicateHeaderV3->MessageGuid, &gEfiSmmVariableProtocolGuid, sizeof (GUID)); + return EFI_SUCCESS; +} - // Program the MM header size - MmCommunicateHeaderV3->MessageSize = CommunicateBufferSize - SMM_COMMUNICATE_HEADER_SIZE_V3; +/** + Initialize the communicate buffer using DataSize and Function. - MmVarCommsHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)(MmCommunicateHeaderV3->MessageData); + This function will locate the PEI MM Communication PPI v3 or v1, and populate + the corresponding header data and return the located PPI stub. - // We are only supporting GetVariable and GetNextVariableName - MmVarCommsHeader->Function = Function; + The communicate size is: SMM_COMMUNICATE_HEADER_SIZE(_V3) + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + + DataSize. - // Send the MM request using MmCommunicationPei - Status = MmCommunicationPpiV3->Communicate (MmCommunicationPpiV3, CommunicateBuffer); - } else if (MmCommunicationPpi != NULL) { - // Zero the entire Communication Buffer Header - MmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)CommunicateBuffer; + Caution: This function may receive untrusted input. + The data size external input, so this function will validate it carefully to avoid buffer overflow. - ZeroMem (MmCommunicateHeader, SMM_COMMUNICATE_HEADER_SIZE); + @param[out] DataPtr Points to the data in the communicate buffer. + @param[in] DataSize The data size to send to MM. + @param[in] Function The function number to initialize the communicate header. + @param[out] DataBuffer The allocated communicate buffer to be used for communication. + @param[out] BufferPageSize The size of the allocated communicate buffer in pages. + @param[out] MmCommunicationPpiStub The located PEI MM Communication PPI stub. + @param[out] MmCommunicationPpiV3Stub The located PEI MM Communication3 PPI stub. - // Use gEfiSmmVariableProtocolGuid to request the MM variable service in Standalone MM - CopyMem ((VOID *)&MmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid, sizeof (GUID)); + @retval EFI_INVALID_PARAMETER The data size is too big. + @retval EFI_SUCCESS Find the specified variable. - // Program the MM header size - MmCommunicateHeader->MessageLength = CommunicateBufferSize - SMM_COMMUNICATE_HEADER_SIZE; +**/ +static +EFI_STATUS +InitCommunicateBuffer ( + OUT VOID **DataPtr OPTIONAL, + IN UINTN DataSize, + IN UINTN Function, + OUT VOID **DataBuffer, + OUT UINTN *BufferPageSize, + OUT EFI_PEI_MM_COMMUNICATION_PPI **MmCommunicationPpiStub OPTIONAL, + OUT EFI_PEI_MM_COMMUNICATION3_PPI **MmCommunicationPpiV3Stub OPTIONAL + ) +{ + EFI_STATUS Status; + SMM_VARIABLE_COMMUNICATE_HEADER *MmVariableFunctionHeader; + + // Neither stub shall be NULL + if ((MmCommunicationPpiStub == NULL) || (MmCommunicationPpiV3Stub == NULL)) { + DEBUG (( + DEBUG_ERROR, + "%a: MmCommunicationPpiStub (0x%p) or MmCommunicationPpiV3Stub (0x%p) are NULL\n", + __func__, + MmCommunicationPpiStub, + MmCommunicationPpiV3Stub + )); + return EFI_INVALID_PARAMETER; + } - MmVarCommsHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)(CommunicateBuffer + SMM_COMMUNICATE_HEADER_SIZE); + if ((DataBuffer == NULL) || (BufferPageSize == NULL)) { + DEBUG (( + DEBUG_ERROR, + "%a: DataBuffer (0x%p) or BufferPageSize (0x%p) are NULL\n", + __func__, + DataBuffer, + BufferPageSize + )); + return EFI_INVALID_PARAMETER; + } - // We are only supporting GetVariable and GetNextVariableName - MmVarCommsHeader->Function = Function; + *DataBuffer = NULL; + *MmCommunicationPpiStub = NULL; + *MmCommunicationPpiV3Stub = NULL; + + // Attempt to locate PEI MM Communication3 PPI first + Status = InternalInitCommBufferV3 ( + DataSize, + DataBuffer, + BufferPageSize, + MmCommunicationPpiV3Stub, + &MmVariableFunctionHeader + ); + if (Status == EFI_NOT_FOUND) { + // Try to locate PEI MM Communication1 PPI + Status = InternalInitCommBufferV1 ( + DataSize, + DataBuffer, + BufferPageSize, + MmCommunicationPpiStub, + &MmVariableFunctionHeader + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: InternalInitCommBufferV1 failed: %r\n", __func__, Status)); + return Status; + } + } else if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: InternalInitCommBufferV3 failed: %r\n", __func__, Status)); + return Status; + } - // Send the MM request using MmCommunicationPei - Status = MmCommunicationPpi->Communicate (MmCommunicationPpi, CommunicateBuffer, &CommunicateBufferSize); - } else { - // We should never reach here, but just in case - Status = EFI_UNSUPPORTED; - DEBUG ((DEBUG_ERROR, "%a: No MM Communication PPI found!\n", __func__)); + MmVariableFunctionHeader->Function = Function; + if (DataPtr != NULL) { + *DataPtr = MmVariableFunctionHeader->Data; } - if (EFI_ERROR (Status)) { - // Received an error from MM interface. - DEBUG ((DEBUG_ERROR, "%a - MM Interface Error: %r\n", __func__, Status)); - goto Exit; + return EFI_SUCCESS; +} + +/** + This function will use the provided PEI MM Communication PPI v3 or v1 to send + the communicate buffer to MM. + + @param[in] MmCommunicationPpi The PEI MM Communication PPI stub. + @param[in] MmCommunicationPpiV3 The PEI MM Communication3 PPI stub. + @param[in] DataBuffer The communicate buffer to send to MM. + @param[in] DataSize This size of the function header and the data. + + @retval EFI_SUCCESS Success is returned from the function in MM. + @retval Others Failure is returned from the function in MM. + +**/ +EFI_STATUS +SendCommunicateBuffer ( + IN EFI_PEI_MM_COMMUNICATION_PPI *MmCommunicationPpi, + IN EFI_PEI_MM_COMMUNICATION3_PPI *MmCommunicationPpiV3, + IN VOID *DataBuffer, + IN UINTN DataSize + ) +{ + EFI_STATUS Status; + UINTN CommSize; + EFI_MM_COMMUNICATE_HEADER *MmCommunicateHeader; + EFI_MM_COMMUNICATE_HEADER_V3 *MmCommunicateHeaderV3; + SMM_VARIABLE_COMMUNICATE_HEADER *MmVariableFunctionHeader; + + if ((MmCommunicationPpi == NULL) && (MmCommunicationPpiV3 == NULL)) { + return EFI_INVALID_PARAMETER; } - // MM request was successfully handled by the framework. - // Set status to the Variable Service Status Code - Status = MmVarCommsHeader->ReturnStatus; - if (EFI_ERROR (Status)) { - // We received an error from Variable Service. - // We cant do anymore so return Status - if (Status != EFI_BUFFER_TOO_SMALL) { - DEBUG ((DEBUG_ERROR, "%a - Variable Service Error: %r\n", __func__, Status)); - } + if (MmCommunicationPpiV3 != NULL) { + Status = MmCommunicationPpiV3->Communicate ( + MmCommunicationPpiV3, + DataBuffer + ); + ASSERT_EFI_ERROR (Status); - goto Exit; + MmCommunicateHeaderV3 = (EFI_MM_COMMUNICATE_HEADER_V3 *)DataBuffer; + MmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)MmCommunicateHeaderV3->MessageData; + + Status = MmVariableFunctionHeader->ReturnStatus; + } else { + CommSize = DataSize + SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE; + Status = MmCommunicationPpi->Communicate ( + MmCommunicationPpi, + DataBuffer, + &CommSize + ); + ASSERT_EFI_ERROR (Status); + + MmCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)DataBuffer; + MmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)MmCommunicateHeader->Data; + + Status = MmVariableFunctionHeader->ReturnStatus; } -Exit: return Status; } @@ -212,50 +379,81 @@ PeiMmGetVariable ( { EFI_STATUS Status; UINTN MessageSize; + UINTN RequiredPages; + UINTN IncomingDataSize; SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE *MmVarAccessHeader; UINT8 *MmCommunicateBuffer; - UINTN RequiredPages; + EFI_PEI_MM_COMMUNICATION_PPI *MmCommunicationPpi; + EFI_PEI_MM_COMMUNICATION3_PPI *MmCommunicationPpiV3; + + MmCommunicateBuffer = NULL; + MmCommunicationPpi = NULL; + MmCommunicationPpiV3 = NULL; + MmVarAccessHeader = NULL; // Check input parameters if ((VariableName == NULL) || (VariableGuid == NULL) || (DataSize == NULL)) { - return EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: Invalid VariableName (0x%p), VariableGuid (0x%p), or DataSize (0x%p)\n", __func__, VariableName, VariableGuid, DataSize)); + Status = EFI_INVALID_PARAMETER; + goto Exit; } if (VariableName[0] == 0) { - return EFI_NOT_FOUND; + DEBUG ((DEBUG_ERROR, "%a: VariableName is empty string\n", __func__)); + Status = EFI_NOT_FOUND; + goto Exit; } - if ((*DataSize > 0) && (Data == NULL)) { - return EFI_INVALID_PARAMETER; + IncomingDataSize = *DataSize; + + if ((IncomingDataSize > 0) && (Data == NULL)) { + DEBUG ((DEBUG_ERROR, "%a: DataSize is non-zero (%u) but Data is NULL\n", __func__, (UINT32)IncomingDataSize)); + Status = EFI_INVALID_PARAMETER; + goto Exit; } // Allocate required pages to send MM request - MessageSize = MM_VARIABLE_COMM_BUFFER_OFFSET + - OFFSET_OF (SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE, Name) + - StrSize (VariableName) + *DataSize; - - RequiredPages = EFI_SIZE_TO_PAGES (MessageSize); - MmCommunicateBuffer = (UINT8 *)AllocatePages (RequiredPages); - - if (MmCommunicateBuffer == NULL) { - Status = EFI_OUT_OF_RESOURCES; - DEBUG ((DEBUG_ERROR, "%a: Failed to allocate memory: %r\n", __func__, Status)); - return Status; + Status = SafeUintnAdd ( + OFFSET_OF (SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE, Name), + StrSize (VariableName), + &MessageSize + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Size overflow calculating MessageSize part 1: %r\n", __func__, Status)); + Status = EFI_INVALID_PARAMETER; + goto Exit; } - // Zero the entire Communication Buffer - ZeroMem (MmCommunicateBuffer, (RequiredPages * EFI_PAGE_SIZE)); + Status = SafeUintnAdd ( + MessageSize, + IncomingDataSize, + &MessageSize + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Size overflow calculating MessageSize part 2: %r\n", __func__, Status)); + Status = EFI_INVALID_PARAMETER; + goto Exit; + } - // - // Program all payload structure contents - // - MmVarAccessHeader = (SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE *)(MmCommunicateBuffer + MM_VARIABLE_COMM_BUFFER_OFFSET); + Status = InitCommunicateBuffer ( + (VOID **)&MmVarAccessHeader, + MessageSize, + SMM_VARIABLE_FUNCTION_GET_VARIABLE, + (VOID **)&MmCommunicateBuffer, + &RequiredPages, + &MmCommunicationPpi, + &MmCommunicationPpiV3 + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: InitCommunicateBuffer failed: %r\n", __func__, Status)); + goto Exit; + } // Variable GUID CopyMem ((VOID *)&MmVarAccessHeader->Guid, VariableGuid, sizeof (GUID)); // Program the max amount of data we accept. - MmVarAccessHeader->DataSize = *DataSize; + MmVarAccessHeader->DataSize = IncomingDataSize; // Get size of the variable name MmVarAccessHeader->NameSize = StrSize (VariableName); @@ -263,11 +461,11 @@ PeiMmGetVariable ( // Populate incoming variable name CopyMem ((VOID *)&MmVarAccessHeader->Name, VariableName, MmVarAccessHeader->NameSize); - Status = PopulateHeaderAndCommunicate (MmCommunicateBuffer, MessageSize, SMM_VARIABLE_FUNCTION_GET_VARIABLE); + Status = SendCommunicateBuffer (MmCommunicationPpi, MmCommunicationPpiV3, MmCommunicateBuffer, MessageSize); if (EFI_ERROR (Status)) { // We received an error from either communicate or Variable Service. if (Status != EFI_BUFFER_TOO_SMALL) { - DEBUG ((DEBUG_ERROR, "%a - Communite to MM for variable service errored: %r\n", __func__, Status)); + DEBUG ((DEBUG_ERROR, "%a - Communicate to MM for getting variable errored: %r\n", __func__, Status)); } goto Exit; @@ -276,20 +474,22 @@ PeiMmGetVariable ( Status = EFI_SUCCESS; // User provided buffer is too small - if (*DataSize < MmVarAccessHeader->DataSize) { + if (IncomingDataSize < MmVarAccessHeader->DataSize) { Status = EFI_BUFFER_TOO_SMALL; } Exit: - // Check if we need to set Attributes - if (Attributes != NULL) { - *Attributes = MmVarAccessHeader->Attributes; + if ((Status == EFI_SUCCESS) || (Status == EFI_BUFFER_TOO_SMALL)) { + *DataSize = MmVarAccessHeader->DataSize; } - *DataSize = MmVarAccessHeader->DataSize; - if (Status == EFI_SUCCESS) { - CopyMem ((VOID *)Data, (UINT8 *)MmVarAccessHeader->Name + MmVarAccessHeader->NameSize, *DataSize); + // Check if we need to set Attributes + if (Attributes != NULL) { + *Attributes = MmVarAccessHeader->Attributes; + } + + CopyMem ((VOID *)Data, (UINT8 *)MmVarAccessHeader->Name + MmVarAccessHeader->NameSize, MmVarAccessHeader->DataSize); } // Free the Communication Buffer @@ -340,9 +540,16 @@ PeiMmGetNextVariableName ( { EFI_STATUS Status; UINTN MessageSize; + UINTN RequiredPages; UINT8 *MmCommunicateBuffer; SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME *MmVarGetNextVarHeader; - UINTN RequiredPages; + EFI_PEI_MM_COMMUNICATION_PPI *MmCommunicationPpi; + EFI_PEI_MM_COMMUNICATION3_PPI *MmCommunicationPpiV3; + + MmCommunicateBuffer = NULL; + MmCommunicationPpi = NULL; + MmCommunicationPpiV3 = NULL; + MmVarGetNextVarHeader = NULL; // Check input parameters if ((VariableName == NULL) || @@ -350,30 +557,49 @@ PeiMmGetNextVariableName ( (VariableNameSize == NULL) || (*VariableNameSize == 0)) { - return EFI_INVALID_PARAMETER; + DEBUG ((DEBUG_ERROR, "%a: Invalid VariableName (0x%p), VariableGuid (0x%p), or VariableNameSize (0x%p)\n", __func__, VariableName, VariableGuid, VariableNameSize)); + Status = EFI_INVALID_PARAMETER; + goto Exit; } // Allocate required pages to send MM request - MessageSize = MM_VARIABLE_COMM_BUFFER_OFFSET + - OFFSET_OF (SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE, Name) + - StrSize (VariableName) + *VariableNameSize; - - RequiredPages = EFI_SIZE_TO_PAGES (MessageSize); - MmCommunicateBuffer = (UINT8 *)AllocatePages (RequiredPages); + Status = SafeUintnAdd ( + OFFSET_OF (SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME, Name), + StrSize (VariableName), + &MessageSize + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Size overflow calculating MessageSize part 1: %r\n", __func__, Status)); + Status = EFI_INVALID_PARAMETER; + goto Exit; + } - if (MmCommunicateBuffer == NULL) { - Status = EFI_OUT_OF_RESOURCES; - DEBUG ((DEBUG_ERROR, "%a: Failed to allocate memory: %r\n", __func__, Status)); - return Status; + Status = SafeUintnAdd ( + MessageSize, + *VariableNameSize, + &MessageSize + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Size overflow calculating MessageSize part 2: %r\n", __func__, Status)); + Status = EFI_INVALID_PARAMETER; + goto Exit; } - // Zero the entire Communication Buffer - ZeroMem (MmCommunicateBuffer, (RequiredPages * EFI_PAGE_SIZE)); + Status = InitCommunicateBuffer ( + (VOID **)&MmVarGetNextVarHeader, + MessageSize, + SMM_VARIABLE_FUNCTION_GET_NEXT_VARIABLE_NAME, + (VOID **)&MmCommunicateBuffer, + &RequiredPages, + &MmCommunicationPpi, + &MmCommunicationPpiV3 + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: InitCommunicateBuffer failed: %r\n", __func__, Status)); + goto Exit; + } - // - // Program all payload structure contents - // - MmVarGetNextVarHeader = (SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME *)(MmCommunicateBuffer + MM_VARIABLE_COMM_BUFFER_OFFSET); + ASSERT (MmVarGetNextVarHeader != NULL); // Variable GUID CopyMem ((VOID *)&MmVarGetNextVarHeader->Guid, VariableGuid, sizeof (GUID)); @@ -385,11 +611,11 @@ PeiMmGetNextVariableName ( CopyMem ((VOID *)&MmVarGetNextVarHeader->Name, VariableName, MmVarGetNextVarHeader->NameSize); // Send the MM request using MmCommunicationPei - Status = PopulateHeaderAndCommunicate (MmCommunicateBuffer, MessageSize, SMM_VARIABLE_FUNCTION_GET_NEXT_VARIABLE_NAME); + Status = SendCommunicateBuffer (MmCommunicationPpi, MmCommunicationPpiV3, MmCommunicateBuffer, MessageSize); if (EFI_ERROR (Status)) { // We received an error from either communicate or Variable Service. if (Status != EFI_BUFFER_TOO_SMALL) { - DEBUG ((DEBUG_ERROR, "%a - Communite to MM for variable service errored: %r\n", __func__, Status)); + DEBUG ((DEBUG_ERROR, "%a - Communicate to MM for next variable name errored: %r\n", __func__, Status)); } goto Exit; @@ -403,8 +629,10 @@ PeiMmGetNextVariableName ( } Exit: - // Update the name size to be returned - *VariableNameSize = MmVarGetNextVarHeader->NameSize; + if ((Status == EFI_BUFFER_TOO_SMALL) || (Status == EFI_SUCCESS)) { + // Update the name size to be returned + *VariableNameSize = MmVarGetNextVarHeader->NameSize; + } if (Status == EFI_SUCCESS) { CopyMem ((VOID *)VariableName, (UINT8 *)MmVarGetNextVarHeader->Name, *VariableNameSize); diff --git a/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.h b/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.h index 0b3832945f0a..9da8f8adda05 100644 --- a/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.h +++ b/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.h @@ -18,6 +18,7 @@ #include #include #include +#include #include diff --git a/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.inf b/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.inf index 1f972db0d952..4a8c52c24543 100644 --- a/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.inf +++ b/MdeModulePkg/Universal/Variable/MmVariablePei/MmVariablePei.inf @@ -28,6 +28,7 @@ PeimEntryPoint MemoryAllocationLib HobLib + SafeIntLib [Protocols] gEfiSmmVariableProtocolGuid ## CONSUMES From de6f1e885c0253f07cb3faa9310022dba6251da1 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Fri, 30 Jan 2026 11:29:56 -0800 Subject: [PATCH 1143/1172] Maintainers.txt: Add Kun Qin as maintainer for StandaloneMmPkg As the Microsoft representative for Trust Execution Environment (TEE), I intend to help review Standalone MM related changes and help drive industry alignment of TEE implementations in UEFI firmware. Signed-off-by: Kun Qin --- Maintainers.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Maintainers.txt b/Maintainers.txt index 86e20ff0dee0..8424c773b170 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -648,6 +648,7 @@ F: StandaloneMmPkg/ M: Ard Biesheuvel [ardbiesheuvel] M: Sami Mujawar [samimujawar] M: Ray Ni [niruiyu] +M: Kun Qin [kuqin12] R: Jiaxin Wu [jiaxinwu] R: Dun Tan [td36] R: Star Zeng [lzeng14] From 96572d4d72be4fc8192f35a1772b2ccf8cbdc5f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=20Yang=20=28=E6=A5=8A=E5=A3=B9=E4=BB=BB=29?= Date: Mon, 2 Feb 2026 17:23:32 +0800 Subject: [PATCH 1144/1172] ShellPkg: SMBIOS type 20 Extended Starting/Ending Address print type error Wrong structure is used to print the SMBIOS type 20 Extended Starting/Ending Address in SmbiosView Signed-off-by: Ren Yang --- .../Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c index 40b33f8996f7..20fe92464aeb 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/PrintInfo.c @@ -952,8 +952,8 @@ SmbiosPrintStructure ( PRINT_STRUCT_VALUE_H (Struct, Type20, InterleavePosition); PRINT_STRUCT_VALUE_H (Struct, Type20, InterleavedDataDepth); if (AE_SMBIOS_VERSION (0x2, 0x7) && (Struct->Hdr->Length > 0x13)) { - PRINT_STRUCT_VALUE_LH (Struct, Type19, ExtendedStartingAddress); - PRINT_STRUCT_VALUE_LH (Struct, Type19, ExtendedEndingAddress); + PRINT_STRUCT_VALUE_LH (Struct, Type20, ExtendedStartingAddress); + PRINT_STRUCT_VALUE_LH (Struct, Type20, ExtendedEndingAddress); } break; From 6d4b80aab3acc9cf7a127e0112b1bd68c7d40ddb Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Thu, 2 Oct 2025 12:11:04 +0100 Subject: [PATCH 1145/1172] ArmPkg/Library: update xferlist version to 2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Firmware Handoff specification has withdrawn the use of the “XOR” checksum and updated the checksum calculation to use “SUM” [0]. Accordingly, libtl has also been updated to reflect this change [1]. The “XOR” checksum calculation existed in version 1; however, as mentioned above, it has been withdrawn, and TF-A always provides the checksum using the “SUM” calculation. Therefore, the xferlist version is updated to version 2. Link: https://github.com/FirmwareHandoff/firmware_handoff/pull/81 [0] Link: https://review.trustedfirmware.org/c/shared/transfer-list-library/+/46033 [1] Signed-off-by: Yeoreum Yun --- ArmPkg/Include/IndustryStandard/ArmTransferList.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ArmPkg/Include/IndustryStandard/ArmTransferList.h b/ArmPkg/Include/IndustryStandard/ArmTransferList.h index 2bc0d80177bb..f8b4a6de51a1 100644 --- a/ArmPkg/Include/IndustryStandard/ArmTransferList.h +++ b/ArmPkg/Include/IndustryStandard/ArmTransferList.h @@ -20,7 +20,7 @@ #include #include -#define ARM_FW_HANDOFF_PROTOCOL_VERSION 1 +#define ARM_FW_HANDOFF_PROTOCOL_VERSION 2 #define TRANSFER_LIST_ALIGNMENT 8 // 8 byte alignment #define TRANSFER_LIST_SIGNATURE_64 (0x4a0fb10b) From cf513a57cc6cf94c379fa1c085aa94771af0c568 Mon Sep 17 00:00:00 2001 From: Chao Li Date: Mon, 2 Feb 2026 09:30:59 +0800 Subject: [PATCH 1146/1172] UefiCpuPkg: Update exception vector for LoongArch64 An exception and interrupt vector table was added to the ASM file, a fast path was created for the IPI SMP_BOOT_CPU vector, and the C version of the SMP_BOOT_CPU handler was removed. Signed-off-by: Chao Li Cc: Ray Ni Cc: Jiaxin Wu Cc: Zhiguang Liu Cc: Dun Tan Cc: Arun Subramanian Baskaran Cc: Gerd Hoffmann Cc: Star Zeng Cc: Eduardo Cuevas Farfan --- .../LoongArch64/ArchExceptionHandler.c | 93 +++++++------ .../LoongArch64/ExceptionHandlerAsm.S | 128 +++++++++++++++++- 2 files changed, 172 insertions(+), 49 deletions(-) diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/LoongArch/LoongArch64/ArchExceptionHandler.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/LoongArch/LoongArch64/ArchExceptionHandler.c index 23cb20cdd3bd..94dc306a42b0 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/LoongArch/LoongArch64/ArchExceptionHandler.c +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/LoongArch/LoongArch64/ArchExceptionHandler.c @@ -248,57 +248,49 @@ IpiInterruptHandler ( IpiStatus = IoCsrRead32 (LOONGARCH_IOCSR_IPI_STATUS); - // - // Clear interrupt. - // - IoCsrWrite32 (LOONGARCH_IOCSR_IPI_CLEAR, IpiStatus); - if ((IpiStatus & SMP_RESCHEDULE) != 0) { + // + // Clear current IPI interrupt bit. + // + IoCsrWrite32 (LOONGARCH_IOCSR_IPI_CLEAR, (IpiStatus & SMP_RESCHEDULE)); + MemoryFence (); return; - } else { - if (((IpiStatus & SMP_BOOT_CPU) != 0) || ((IpiStatus & SMP_CALL_FUNCTION) != 0)) { - // - // Confirm that the mail box message has arrived. - // - do { - ResumeVector = IoCsrRead32 (LOONGARCH_IOCSR_MBUF0); - } while (!ResumeVector); + } else if ((IpiStatus & SMP_CALL_FUNCTION) != 0) { + // + // Clear current IPI interrupt bit. + // + IoCsrWrite32 (LOONGARCH_IOCSR_IPI_CLEAR, (IpiStatus & SMP_CALL_FUNCTION)); - // - // Get the resume vector if populated. - // - ResumeVector = IoCsrRead64 (LOONGARCH_IOCSR_MBUF0); - - if ((IpiStatus & SMP_BOOT_CPU) != 0) { - SystemContext.SystemContextLoongArch64->PRMD &= ~((UINT64)BIT2); // Clean PIE - } else if ((IpiStatus & SMP_CALL_FUNCTION) != 0) { - // - // Confirm that the mail box message has arrived. - // - do { - Parameter = IoCsrRead32 (LOONGARCH_IOCSR_MBUF3); - } while (!Parameter && --RereadCount); - - // - // Get the parameter if populated. - // - Parameter = IoCsrRead64 (LOONGARCH_IOCSR_MBUF3); - - // - // Set $a0 as APIC ID and $a1 as parameter value. - // - SystemContext.SystemContextLoongArch64->R4 = CsrRead (LOONGARCH_CSR_CPUID); - SystemContext.SystemContextLoongArch64->R5 = Parameter; - } - } else { - InternalPrintMessage ( - "Core %d: Should never be here, IPI Status = %d.\n", - CsrRead (LOONGARCH_CSR_CPUID), - IpiStatus - ); - DefaultExceptionHandler (EXCEPT_LOONGARCH_INT, SystemContext); - } + // + // Confirm that the mail box message has arrived. + // + do { + ResumeVector = IoCsrRead32 (LOONGARCH_IOCSR_MBUF0); + } while (!ResumeVector); + + // + // Get the resume vector if populated. + // + ResumeVector = IoCsrRead64 (LOONGARCH_IOCSR_MBUF0); + + // + // Confirm that the mail box message has arrived. + // + do { + Parameter = IoCsrRead32 (LOONGARCH_IOCSR_MBUF3); + } while (!Parameter && --RereadCount); + + // + // Get the parameter if populated. + // + Parameter = IoCsrRead64 (LOONGARCH_IOCSR_MBUF3); + + // + // Set $a0 as APIC ID and $a1 as parameter value. + // + SystemContext.SystemContextLoongArch64->R4 = CsrRead (LOONGARCH_CSR_CPUID); + SystemContext.SystemContextLoongArch64->R5 = Parameter; // // Clean up current processor mailbox 0 and mailbox 3. @@ -310,6 +302,13 @@ IpiInterruptHandler ( // Set the ERA to the resume vector sent by caller. // SystemContext.SystemContextLoongArch64->ERA = ResumeVector; + } else { + InternalPrintMessage ( + "Core %d: Should never be here, IPI Status = %d.\n", + CsrRead (LOONGARCH_CSR_CPUID), + IpiStatus + ); + DefaultExceptionHandler (EXCEPT_LOONGARCH_INT, SystemContext); } MemoryFence (); diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/LoongArch/LoongArch64/ExceptionHandlerAsm.S b/UefiCpuPkg/Library/CpuExceptionHandlerLib/LoongArch/LoongArch64/ExceptionHandlerAsm.S index 4b50b7a6df87..3a1b9646ae87 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/LoongArch/LoongArch64/ExceptionHandlerAsm.S +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/LoongArch/LoongArch64/ExceptionHandlerAsm.S @@ -11,6 +11,8 @@ #include #include #include +#include +#include "ExceptionCommon.h" #define RSIZE 8 // 64 bit mode register size #define GP_REG_CONTEXT_SIZE 32 * RSIZE // General-purpose registers size @@ -250,7 +252,7 @@ ASM_PFX(ExceptionEntryStart): csrrd $t0, LOONGARCH_CSR_EUEN andi $t0, $t0, CSR_EUEN_FPEN - beqz $t0, EntryConmmonHanlder + beqz $t0, ExcVectorDispatcher fst.d $fa0, $sp, 0 * RSIZE fst.d $fa1, $sp, 1 * RSIZE @@ -312,7 +314,129 @@ ASM_PFX(ExceptionEntryStart): // Push exception context down // -EntryConmmonHanlder: +ExcVectorDispatcher: + csrrd $t0, LOONGARCH_CSR_ESTAT + li.d $t1, CSR_ESTAT_EXC + and $t1, $t0, $t1 + srli.d $t1, $t1, CSR_ESTAT_EXC_SHIFT + beqz $t1, IntVectorDispatcher // If Ecode is 0, it indicates that an interrupt has occurred. + b EntryCommonHandler // Currently, other exception should be handled using C code. + +IntVectorDispatcher: + srli.d $t1, $t0, EXCEPT_LOONGARCH_INT_TIMER + andi $t1, $t1, BIT0 + bnez $t1, TimerVector + + srli.d $t1, $t0, EXCEPT_LOONGARCH_INT_IPI + andi $t1, $t1, BIT0 + bnez $t1, IpiVector + + srli.d $t1, $t0, EXCEPT_LOONGARCH_INT_PMC + andi $t1, $t1, BIT0 + bnez $t1, PmcVector + + srli.d $t1, $t0, EXCEPT_LOONGARCH_INT_IP7 + andi $t1, $t1, BIT0 + bnez $t1, HwIpVector + + srli.d $t1, $t0, EXCEPT_LOONGARCH_INT_IP6 + andi $t1, $t1, BIT0 + bnez $t1, HwIpVector + + srli.d $t1, $t0, EXCEPT_LOONGARCH_INT_IP5 + andi $t1, $t1, BIT0 + bnez $t1, HwIpVector + + srli.d $t1, $t0, EXCEPT_LOONGARCH_INT_IP4 + andi $t1, $t1, BIT0 + bnez $t1, HwIpVector + + srli.d $t1, $t0, EXCEPT_LOONGARCH_INT_IP3 + andi $t1, $t1, BIT0 + bnez $t1, HwIpVector + + srli.d $t1, $t0, EXCEPT_LOONGARCH_INT_IP2 + andi $t1, $t1, BIT0 + bnez $t1, HwIpVector + + srli.d $t1, $t0, EXCEPT_LOONGARCH_INT_IP1 + andi $t1, $t1, BIT0 + bnez $t1, HwIpVector + + srli.d $t1, $t0, EXCEPT_LOONGARCH_INT_IP0 + andi $t1, $t1, BIT0 + bnez $t1, HwIpVector + + srli.d $t1, $t0, EXCEPT_LOONGARCH_INT_SIP1 + andi $t1, $t1, BIT0 + bnez $t1, SwIpVector + + srli.d $t1, $t0, EXCEPT_LOONGARCH_INT_SIP0 + andi $t1, $t1, BIT0 + bnez $t1, SwIpVector + + b EntryCommonHandler // Never shouldn't be here, go to the C code to dump the context. + +TimerVector: +PmcVector: +HwIpVector: +SwIpVector: + b EntryCommonHandler // Timer, PMC, HWINT, SWINT should be handled using C code. + +IpiVector: + // + // Get the IPI vector. + // + li.d $t0, LOONGARCH_IOCSR_IPI_STATUS + iocsrrd.w $t1, $t0 + + // + // SMP_BOOT_CPU vector, fast path. + // + andi $t1, $t1, SMP_BOOT_CPU + beqz $t1, EntryCommonHandler + + // + // Clear current IPI interrupt bit. + // + li.d $t0, LOONGARCH_IOCSR_IPI_CLEAR + iocsrwr.w $t1, $t0 + + // + // Get the resume vector. + // +TryReadResumeVector: + li.d $t0, LOONGARCH_IOCSR_MBUF0 + iocsrrd.w $a0, $t0 + bnez $a0, ReadRealResumeVector + b TryReadResumeVector +ReadRealResumeVector: + iocsrrd.d $a0, $t0 + + // + // Clean up current processor mailbox 0. + // + li.d $t0, LOONGARCH_IOCSR_MBUF0 + iocsrwr.d $zero, $t0 + + // + // The SMP_BOOT_CPU vector should never be returned. Clean up the PIE and ensure that + // global interrupts are turned off for the current processor for handover. + // + csrwr $a0, LOONGARCH_CSR_ERA // Update ERA + li.w $t0, BIT2 // IE + csrxchg $zero, $t0, LOONGARCH_CSR_PRMD // Clean PIE + + // + // Use ERA to jump to next stage. + // + ertn + + // + // End of IpiVector fast path. + // + +EntryCommonHandler: addi.d $sp, $sp, -(GP_REG_CONTEXT_SIZE + CSR_REG_CONTEXT_SIZE) move $a0, $sp la.abs $ra, ExceptionEntry From e092122653c003551afc4e58ba197c1da51621cc Mon Sep 17 00:00:00 2001 From: Samer El-Haj-Mahmoud Date: Thu, 29 Jan 2026 21:36:47 +0000 Subject: [PATCH 1147/1172] ArmPlatformPkg/PL011UartLib : Fix SetControl() SCT conformance REF: pftf/RPi4#87 The PL011UartLib SetControl() is failing the SCT test for SerialIoBBTestConformance (00605CBC-3965-4B61-A254-2B2B723172EA), which is trying to set bits that are not supported per UEFI spec. Add proper argument check for valid bits, and confirm that test passes. Cc: Leif Lindholm Cc: Ard Biesheuvel Cc: Sami Mujawar Signed-off-by: Samer El-Haj-Mahmoud --- .../Library/PL011UartLib/PL011UartLib.c | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.c b/ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.c index e8e2e1d83998..67cf7504abf5 100644 --- a/ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.c +++ b/ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.c @@ -22,10 +22,22 @@ #define FRACTION_PART_MASK ((1 << FRACTION_PART_SIZE_IN_BITS) - 1) // -// EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE is the only -// control bit that is not supported. +// Per UEFI spec, only these control bits are allowed to be set. // -STATIC CONST UINT32 mInvalidControlBits = EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE; +STATIC CONST UINT32 mAllowedControlBits = + EFI_SERIAL_CLEAR_TO_SEND | + EFI_SERIAL_DATA_SET_READY | + EFI_SERIAL_RING_INDICATE | + EFI_SERIAL_CARRIER_DETECT | + EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE | + EFI_SERIAL_OUTPUT_BUFFER_EMPTY | + EFI_SERIAL_INPUT_BUFFER_EMPTY; + +// +// platform-specific bits that are not supported by this device. +// +STATIC CONST UINT32 mPlatformInvalidControlBits = + EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE; /** @@ -274,7 +286,11 @@ PL011UartSetControl ( { UINT32 Bits; - if ((Control & mInvalidControlBits) != 0) { + if ((Control & ~mAllowedControlBits) != 0) { + return RETURN_UNSUPPORTED; + } + + if ((Control & mPlatformInvalidControlBits) != 0) { return RETURN_UNSUPPORTED; } From f0542ae07d5e5e4d311bf8ae33bf26b4b1acf9f4 Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Thu, 5 Feb 2026 15:15:08 -0800 Subject: [PATCH 1148/1172] BaseTools/Source/C/Makefile: Update OBJECTS using OS specific SEP Use $(SEP) with addprefix of $(OBJDIR) to support Windows MINGW CLANG builds that use Windows path separators with GNU makefiles. This fixes Windows MINGW CLANG builds of the PcdValueInit application that is required for structured PCDs. Signed-off-by: Michael D Kinney --- BaseTools/Source/C/Makefiles/app.makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/BaseTools/Source/C/Makefiles/app.makefile b/BaseTools/Source/C/Makefiles/app.makefile index 475cb88d04db..2ce185cb9d33 100644 --- a/BaseTools/Source/C/Makefiles/app.makefile +++ b/BaseTools/Source/C/Makefiles/app.makefile @@ -8,10 +8,11 @@ MAKEROOT ?= ../.. BUILDROOT ?= $(MAKEROOT) OBJDIR ?= . -OBJECTS := $(addprefix $(OBJDIR)/,$(OBJECTS)) include $(MAKEROOT)/Makefiles/header.makefile +OBJECTS := $(addprefix $(OBJDIR)$(SEP),$(OBJECTS)) + APPLICATION = $(BUILDROOT)/bin/$(APPNAME) .PHONY:all From be6ff0f289f40e42a75d3c53af7f43a667f509d5 Mon Sep 17 00:00:00 2001 From: Yang Gang Date: Tue, 27 Jan 2026 17:42:36 +0800 Subject: [PATCH 1149/1172] MdeModulePkg/HiiDatabaseDxe: Fix parser issue in GetNameElement() This commit removes an wrong goto statement which may cause DXE_ASSERT! `ConfigRequest` example: `&NameValueVar0&NameValueVar1&NameValueVar2`. When `*Progress` is `&NameValueVar2`, code will run to `goto Done;`, then return NULL. Signed-off-by: Yang Gang --- MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c index 809a3f9707e1..246b4f47b1c5 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c @@ -3670,8 +3670,6 @@ GetNameElement ( HasValue = TRUE; } else if ((NextTag = StrStr (StringPtr, L"&")) != NULL) { *NextTag = L'\0'; - } else { - goto Done; } // From feefaba102b8bf469436b38122f73b4f504791e3 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Tue, 3 Feb 2026 15:00:26 -0500 Subject: [PATCH 1150/1172] Global: Update wiki links in workspace root files The wiki has moved and this change updates links in the edk2 repo root to the new page location. - New location: https://github.com/tianocore/tianocore-wiki.github.io - Rendered version: https://www.tianocore.org/tianocore-wiki.github.io/ - Old location: https://github.com/tianocore/tianocore.github.io/wiki More details: https://github.com/tianocore/edk2/discussions/11969 Signed-off-by: Michael Kubacki --- CONTRIBUTING.md | 4 +++- Maintainers.txt | 47 +++++++++++++++++++++++------------------------ ReadMe.rst | 12 ++++++------ edksetup.sh | 5 ++--- 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 70777436542b..0a85f28a357c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,3 +1,5 @@ # Contributing to EDK2 -Contributor documentation is maintained on the wiki: https://github.com/tianocore/tianocore.github.io/wiki/EDK-II-Development-Process +Contributor documentation is maintained on the wiki: + +[EDK II Development Process](https://www.tianocore.org/tianocore-wiki.github.io/development/contribution-guides/edk_ii_development_process.html) diff --git a/Maintainers.txt b/Maintainers.txt index 8424c773b170..104f585a4875 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -74,11 +74,11 @@ M: Michael Kubacki [makubacki] Responsible Disclosure, Reporting Security Issues ------------------------------------------------- -W: https://github.com/tianocore/tianocore.github.io/wiki/Security +W: https://www.tianocore.org/tianocore-wiki.github.io/reference/external-resources/security.html EDK II Releases: ---------------- -W: https://github.com/tianocore/tianocore.github.io/wiki/EDK-II-Release-Planning +W: https://www.tianocore.org/tianocore-wiki.github.io/releases-history/planning-roadmaps/edk_ii_release_planning.html M: Liming Gao [lgao4] EDK II Architectures: @@ -147,7 +147,7 @@ EDK II Packages: ---------------- ArmPkg F: ArmPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/ArmPkg +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/core-packages/arm_pkg.html M: Leif Lindholm [leiflindholm] M: Ard Biesheuvel [ardbiesheuvel] M: Sami Mujawar [samimujawar] @@ -155,14 +155,14 @@ R: Vishal Oliyil Kunnnil [vishalo] ArmPlatformPkg F: ArmPlatformPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/ArmPlatformPkg +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/core-packages/arm_platform_pkg.html M: Leif Lindholm [leiflindholm] M: Ard Biesheuvel [ardbiesheuvel] M: Sami Mujawar [samimujawar] ArmVirtPkg F: ArmVirtPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/ArmVirtPkg +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/core-packages/arm_virt_pkg.html M: Ard Biesheuvel [ardbiesheuvel] M: Sami Mujawar [samimujawar] R: Leif Lindholm [leiflindholm] @@ -170,7 +170,7 @@ R: Gerd Hoffmann [kraxel] BaseTools F: BaseTools/ -W: https://github.com/tianocore/tianocore.github.io/wiki/BaseTools +W: https://www.tianocore.org/tianocore-wiki.github.io/build-tooling/build-workflows/base_tools.html M: Liming Gao [lgao4] M: Guillermo Antonio Palomino Sosa [gapalomi] R: Yuwei Chen [YuweiChen1110] @@ -186,27 +186,26 @@ R: Liming Gao [lgao4] CryptoPkg F: CryptoPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/CryptoPkg +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/core-packages/crypto_pkg.html M: Jiewen Yao [jyao1] M: Yi Li [liyi77] M: Doug Flick [flickdm] DynamicTablesPkg F: DynamicTablesPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/DynamicTablesPkg M: Sami Mujawar [samimujawar] M: Pierre Gondois [pierregondois] EmbeddedPkg F: EmbeddedPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/EmbeddedPkg +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/core-packages/embedded_pkg.html M: Leif Lindholm [leiflindholm] M: Ard Biesheuvel [ardbiesheuvel] M: Abner Chang [changab] EmulatorPkg F: EmulatorPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/EmulatorPkg +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/platform-ports/emulator_pkg.html M: Oliver Smith-Denny [os-d] M: Andrew Fish [ajfish] M: Michael Kubacki [makubacki] @@ -219,21 +218,21 @@ M: Nickle Wang [nicklela] FatPkg F: FatPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/Edk2-fat-driver +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/component-guides/edk2_fat_driver.html M: Oliver Smith-Denny [os-d] T: svn - https://svn.code.sf.net/p/edk2-fatdriver2/code/trunk/EnhancedFat T: git - https://github.com/tianocore/edk2-FatPkg.git FmpDevicePkg F: FmpDevicePkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/FmpDevicePkg +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/core-packages/fmp_device_pkg.html M: Liming Gao [lgao4] M: Michael D Kinney [mdkinney] R: Wei6 Xu [xuweiintel] IntelFsp2Pkg F: IntelFsp2Pkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/IntelFsp2Pkg +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/core-packages/intel_fsp2_pkg.html M: Chasel Chiu [ChaselChiu] M: Nate DeSimone [nate-desimone] R: Star Zeng [lzeng14] @@ -242,7 +241,7 @@ R: Ashraf Ali S [AshrafAliS] IntelFsp2WrapperPkg F: IntelFsp2WrapperPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/IntelFsp2WrapperPkg +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/core-packages/intel_fsp2_wrapper_pkg.html M: Chasel Chiu [ChaselChiu] M: Nate DeSimone [nate-desimone] R: Star Zeng [lzeng14] @@ -251,7 +250,7 @@ R: Ashraf Ali S [AshrafAliS] MdeModulePkg F: MdeModulePkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/MdeModulePkg +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/core-packages/mde_module_pkg.html M: Liming Gao [lgao4] MdeModulePkg: ACPI modules @@ -414,7 +413,7 @@ R: Kun Qin [kuqin12] MdePkg F: MdePkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/MdePkg +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/core-packages/mde_pkg.html M: Michael D Kinney [mdkinney] M: Liming Gao [lgao4] @@ -466,7 +465,7 @@ R: Kun Qin [kuqin12] NetworkPkg F: NetworkPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/NetworkPkg +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/core-packages/network_pkg.html R: Saloni Kasbekar [SaloniKasbekar] R: Zachary Clark-williams [Zclarkwilliams] @@ -586,7 +585,7 @@ R: Xianglai Li [lixianglai] PcAtChipsetPkg F: PcAtChipsetPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/PcAtChipsetPkg +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/core-packages/pc_at_chipset_pkg.html M: Ray Ni [niruiyu] PrmPkg @@ -607,7 +606,7 @@ R: Igor Kulchytskyy [igorkulchytskyy] SecurityPkg F: SecurityPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/SecurityPkg +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/core-packages/security_pkg.html M: Jiewen Yao [jyao1] SecurityPkg: Secure boot related modules @@ -632,16 +631,16 @@ R: Kun Qin [kuqin12] ShellPkg F: ShellPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/ShellPkg +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/core-packages/shell_pkg.html R: Pierre Gondois [pierregondois] SignedCapsulePkg F: SignedCapsulePkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/SignedCapsulePkg +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/core-packages/signed_capsule_pkg.html SourceLevelDebugPkg F: SourceLevelDebugPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/SourceLevelDebugPkg +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/core-packages/source_level_debug_pkg.html StandaloneMmPkg F: StandaloneMmPkg/ @@ -656,7 +655,7 @@ R: Eduardo Cuevas Farfan [ecuevasf] UefiCpuPkg F: UefiCpuPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/UefiCpuPkg +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/core-packages/uefi_cpu_pkg.html M: Ray Ni [niruiyu] M: Jiaxin Wu [jiaxinwu] R: Zhiguang Liu [LiuZhiguang001] @@ -674,7 +673,7 @@ R: Abner Chang [changab] UefiPayloadPkg F: UefiPayloadPkg/ -W: https://github.com/tianocore/tianocore.github.io/wiki/UefiPayloadPkg +W: https://www.tianocore.org/tianocore-wiki.github.io/platforms-packages/core-packages/uefi_payload_pkg.html M: Guo Dong [gdong1] M: Sean Rhodes [Sean-StarLabs] M: James Lu [jameslu8] diff --git a/ReadMe.rst b/ReadMe.rst index f2313ea0d041..cd60c7ecb78c 100644 --- a/ReadMe.rst +++ b/ReadMe.rst @@ -10,7 +10,7 @@ environment for the UEFI and PI specifications from www.uefi.org. It is recommended to install this Python version to run the full set of scripts that enable CI in the project. -Other Python requirements for build can be found in the `EDK II Build Instructions `__. +Other Python requirements for build can be found in the `EDK II Build Instructions `__. Core CI Build Status -------------------- @@ -106,15 +106,15 @@ Resources - `TianoCore `__ - `EDK - II `__ + II `__ - `Getting Started with EDK - II `__ + II `__ - `Mailing - Lists `__ + Lists `__ - `How To - Contribute `__ + Contribute `__ - `Release - Planning `__ + Planning `__ Code Contributions ------------------ diff --git a/edksetup.sh b/edksetup.sh index d36c690e51f5..e0490a6227a4 100755 --- a/edksetup.sh +++ b/edksetup.sh @@ -3,9 +3,8 @@ # Copyright (c) 2016, Linaro Ltd. All rights reserved.
    # SPDX-License-Identifier: BSD-2-Clause-Patent # -# In Unix-like environment, the build tools's source is required and need to be compiled -# firstly, please reference https://github.com/tianocore/tianocore.github.io/wiki/SourceForge-to-Github-Quick-Start -# to get how to setup build tool. +# Reference https://www.tianocore.org/tianocore-wiki.github.io/build-tooling/environment-setup/buildtool_setup_guide.html +# to understand how tools are setup. # # Setup the environment for unix-like systems running a bash-like shell. # This file must be "sourced" not merely executed. For example: ". edksetup.sh" From ae73ab7c7dcf728b168fa686bf5d6a72636554f6 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Tue, 3 Feb 2026 15:05:50 -0500 Subject: [PATCH 1151/1172] .github: Update wiki links The wiki has moved and this change updates links in the edk2 .github directory to the new page location. - New location: https://github.com/tianocore/tianocore-wiki.github.io - Rendered version: https://www.tianocore.org/tianocore-wiki.github.io/ - Old location: https://github.com/tianocore/tianocore.github.io/wiki More details: https://github.com/tianocore/edk2/discussions/11969 Signed-off-by: Michael Kubacki --- .github/ISSUE_TEMPLATE/code_first.yml | 3 ++- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/ISSUE_TEMPLATE/documentation_request.yml | 5 +++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/code_first.yml b/.github/ISSUE_TEMPLATE/code_first.yml index 29b02e4a7543..9a2c4e1bb32f 100644 --- a/.github/ISSUE_TEMPLATE/code_first.yml +++ b/.github/ISSUE_TEMPLATE/code_first.yml @@ -13,7 +13,8 @@ body: - type: markdown attributes: value: | - 👋 Only use this issue form for changes following the "code first" process described in [EDK II Code First Process](https://github.com/tianocore/tianocore.github.io/wiki/EDK-II-Code-First-Process). + 👋 Only use this issue form for changes following the "code first" process described in + [EDK II Code First Process](https://www.tianocore.org/tianocore-wiki.github.io/development/contribution-guides/edk_ii_code_first_process.html). **Read that document before filing this issue.** diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index dd30f07f3791..138a78901023 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -10,7 +10,7 @@ contact_links: - name: Reporting Security Issues - url: https://github.com/tianocore/tianocore.github.io/wiki/Reporting-Security-Issues + url: https://www.tianocore.org/tianocore-wiki.github.io/security/processes/reporting_security_issues.html about: Read the wiki page that describes the process here - name: EDK II Development Mailing List url: https://edk2.groups.io/g/devel diff --git a/.github/ISSUE_TEMPLATE/documentation_request.yml b/.github/ISSUE_TEMPLATE/documentation_request.yml index 21a9e637127b..ab1988cbdc7f 100644 --- a/.github/ISSUE_TEMPLATE/documentation_request.yml +++ b/.github/ISSUE_TEMPLATE/documentation_request.yml @@ -23,8 +23,9 @@ body: alongside the code implementation of a particularly complex feature or module. - - To file an issue for a TianoCore specification, refer to [these instructions](https://github.com/tianocore-docs/edk2-TemplateSpecification/wiki/TianoCore-Documents-GitBook-Overview) - and reference the specifications In the [TianoCore Docs organization](https://github.com/tianocore-docs). + - To file an issue for a TianoCore specification, refer to + [these instructions](https://www.tianocore.org/tianocore-wiki.github.io/reference/specs-standards/edk_ii_documentation.html) + and reference the specifications In the [TianoCore Docs organization](https://github.com/tianocore-docs). - For UEFI specifications, refer to the [UEFI Forum](https://uefi.org/specifications) website. From 26caa77a1294a58c8189b10fa6b4cedaf8a439af Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Tue, 3 Feb 2026 15:07:02 -0500 Subject: [PATCH 1152/1172] .pytool: Update wiki links The wiki has moved and this change updates links in the .pytool directory to the new page location. - New location: https://github.com/tianocore/tianocore-wiki.github.io - Rendered version: https://www.tianocore.org/tianocore-wiki.github.io/ - Old location: https://github.com/tianocore/tianocore.github.io/wiki More details: https://github.com/tianocore/edk2/discussions/11969 Signed-off-by: Michael Kubacki --- .pytool/Plugin/UncrustifyCheck/UncrustifyCheck.py | 2 +- .pytool/Readme.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.pytool/Plugin/UncrustifyCheck/UncrustifyCheck.py b/.pytool/Plugin/UncrustifyCheck/UncrustifyCheck.py index b6c660f9516a..5aaed2bda49c 100644 --- a/.pytool/Plugin/UncrustifyCheck/UncrustifyCheck.py +++ b/.pytool/Plugin/UncrustifyCheck/UncrustifyCheck.py @@ -577,7 +577,7 @@ def _process_uncrustify_results(self) -> None: logging.warning( "Visit the following instructions to learn " "more about uncrustify setup instructions and CI:" - "https://github.com/tianocore/tianocore.github.io/wiki/EDK-II-Code-Formatting\n") + "https://www.tianocore.org/tianocore-wiki.github.io/development/coding-standards/edk_ii_code_formatting.html\n") if self._output_file_diffs: logging.info("Calculating file diffs. This might take a while...") diff --git a/.pytool/Readme.md b/.pytool/Readme.md index da64d3d01678..bc11bfa94f06 100644 --- a/.pytool/Readme.md +++ b/.pytool/Readme.md @@ -4,7 +4,7 @@ This file focuses on information for those working with the `.pytools` directory directly or interested in lower-level details about how CI works. If you just want to get started building code, visit -[Build Instructions](https://github.com/tianocore/tianocore.github.io/wiki/Build-Instruction) +[Build Instructions](https://www.tianocore.org/tianocore-wiki.github.io/build-tooling/build-workflows/build_instructions.html) on the TianoCore wiki. ## Basic Status @@ -87,7 +87,7 @@ per package configuration which comes from this file. The EDKII Tools environment (and by extension the ci) is designed to support easily and consistently running locally and in a cloud ci environment. To do that a few steps should be followed. These steps are detailed on the -[How to Build With Stuart](https://github.com/tianocore/tianocore.github.io/wiki/How-to-Build-With-Stuart) +[How to Build With Stuart](https://www.tianocore.org/tianocore-wiki.github.io/build-tooling/build-workflows/how_to_build_with_stuart.html) page. Details of EDKII Tools can be found in the [docs folder here](https://github.com/tianocore/edk2-pytool-extensions/tree/master/docs). From 743a5e91dc617b720aabd15edad82a8b92c53e80 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Tue, 3 Feb 2026 15:07:49 -0500 Subject: [PATCH 1153/1172] ArmVirtPkg: Update wiki links The wiki has moved and this change updates links in ArmVirtPkg to reflect the new location. - New location: https://github.com/tianocore/tianocore-wiki.github.io - Rendered version: https://www.tianocore.org/tianocore-wiki.github.io/ - Old location: https://github.com/tianocore/tianocore.github.io/wiki More details: https://github.com/tianocore/edk2/discussions/11969 Signed-off-by: Michael Kubacki --- ArmVirtPkg/PlatformCI/ReadMe.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ArmVirtPkg/PlatformCI/ReadMe.md b/ArmVirtPkg/PlatformCI/ReadMe.md index 8ea880e18b40..0cbed4f08d2e 100644 --- a/ArmVirtPkg/PlatformCI/ReadMe.md +++ b/ArmVirtPkg/PlatformCI/ReadMe.md @@ -40,7 +40,7 @@ The exact container version tested in CI is maintained in this file ## Building with Pytools for ArmVirtPkg If you are unfamiliar with Pytools, it is recommended to first read through -the generic set of edk2 [Build Instructions](https://github.com/tianocore/tianocore.github.io/wiki/Build-Instructions). +the generic set of edk2 [Build Instructions](https://www.tianocore.org/tianocore-wiki.github.io/build-tooling/build-workflows/build_instructions.html). 1. [Optional] Create a Python Virtual Environment - generally once per workspace From eb1e2f5434bd90b8fcb69af482bd752538be9d9b Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Tue, 3 Feb 2026 15:08:33 -0500 Subject: [PATCH 1154/1172] BaseTools: Update wiki links The wiki has moved and this change updates links in BaseTools to reflect the new location. - New location: https://github.com/tianocore/tianocore-wiki.github.io - Rendered version: https://www.tianocore.org/tianocore-wiki.github.io/ - Old location: https://github.com/tianocore/tianocore.github.io/wiki More details: https://github.com/tianocore/edk2/discussions/11969 Signed-off-by: Michael Kubacki --- BaseTools/Scripts/PatchCheck.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BaseTools/Scripts/PatchCheck.py b/BaseTools/Scripts/PatchCheck.py index 60eee34c3403..bec0c3e4d181 100755 --- a/BaseTools/Scripts/PatchCheck.py +++ b/BaseTools/Scripts/PatchCheck.py @@ -126,7 +126,7 @@ def __init__(self, subject, message, author_email, updated_packages): self.check_change_id_format() self.report_message_result() - url = 'https://github.com/tianocore/tianocore.github.io/wiki/Commit-Message-Format' + url = 'https://www.tianocore.org/tianocore-wiki.github.io/development/contribution-guides/commit_message_format.html' def report_message_result(self): if Verbose.level < Verbose.NORMAL: From 863d89f31f0084b505f53335c371cd8a706460bb Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Tue, 3 Feb 2026 15:09:31 -0500 Subject: [PATCH 1155/1172] OvmfPkg: Update wiki links The wiki has moved and this change updates links in OvmfPkg to refer to the new location. - New location: https://github.com/tianocore/tianocore-wiki.github.io - Rendered version: https://www.tianocore.org/tianocore-wiki.github.io/ - Old location: https://github.com/tianocore/tianocore.github.io/wiki More details: https://github.com/tianocore/edk2/discussions/11969 Signed-off-by: Michael Kubacki --- OvmfPkg/PlatformCI/ReadMe.md | 3 ++- OvmfPkg/README | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/OvmfPkg/PlatformCI/ReadMe.md b/OvmfPkg/PlatformCI/ReadMe.md index 301a79f70450..bb7734e315a6 100644 --- a/OvmfPkg/PlatformCI/ReadMe.md +++ b/OvmfPkg/PlatformCI/ReadMe.md @@ -32,7 +32,8 @@ Pytools build system. ## Building with Pytools for OvmfPkg If you are unfamiliar with Pytools, it is recommended to first read through -the generic set of edk2 [Build Instructions](https://github.com/tianocore/tianocore.github.io/wiki/Build-Instructions). +the generic set of edk2 +[Build Instructions](https://www.tianocore.org/tianocore-wiki.github.io/build-tooling/build-workflows/build_instructions.html). 1. [Optional] Create a Python Virtual Environment - generally once per workspace diff --git a/OvmfPkg/README b/OvmfPkg/README index 4db2367facc0..1dbcaad1ad9c 100644 --- a/OvmfPkg/README +++ b/OvmfPkg/README @@ -54,11 +54,11 @@ these binary outputs: - This file is not built separately any longer, starting with svn r13520. If you are new to building in edk2 or looking for the latest build -instructions, visit https://github.com/tianocore/tianocore.github.io/wiki/Build-Instructions +instructions, visit More OVMF-specific build information can be found at: -https://github.com/tianocore/tianocore.github.io/wiki/How%20to%20build%20OVMF +[How to Build OVMF](https://www.tianocore.org/tianocore-wiki.github.io/development/tutorials-howto/how_to_build_ovmf.html) === RUNNING OVMF on QEMU === From d60aab664a16892a6add6854d5c189b6b2a3b0fd Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Tue, 3 Feb 2026 15:10:11 -0500 Subject: [PATCH 1156/1172] PrmPkg: Update wiki links The wiki has moved and this change updates links in PrmPkg to refer to the new location. - New location: https://github.com/tianocore/tianocore-wiki.github.io - Rendered version: https://www.tianocore.org/tianocore-wiki.github.io/ - Old location: https://github.com/tianocore/tianocore.github.io/wiki More details: https://github.com/tianocore/edk2/discussions/11969 Signed-off-by: Michael Kubacki --- PrmPkg/Readme.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PrmPkg/Readme.md b/PrmPkg/Readme.md index 8ad753da5431..f3ae8ac2efb6 100644 --- a/PrmPkg/Readme.md +++ b/PrmPkg/Readme.md @@ -35,7 +35,8 @@ firmware flash map. To build `PrmPkg` as a standalone package: -1. If new to EDK II, follow the directions in [Getting Started with EDK II](https://github.com/tianocore/tianocore.github.io/wiki/Getting-Started-with-EDK-II) +1. If new to EDK II, follow the directions in + [Getting Started with EDK II](https://www.tianocore.org/tianocore-wiki.github.io/development/tutorials-howto/getting_started_with_edk_ii.html) 2. Clone the *master* branch on the edk2 repository locally \ ``git clone https://github.com/tianocore/edk2.git`` From 7ac719710c06f8d0e34612586533a987fce65112 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Tue, 3 Feb 2026 15:11:56 -0500 Subject: [PATCH 1157/1172] SignedCapsulePkg: Update wiki links The wiki has moved and this change updates links in SignedCapsulePkg to point to the new location. - New location: https://github.com/tianocore/tianocore-wiki.github.io - Rendered version: https://www.tianocore.org/tianocore-wiki.github.io/ - Old location: https://github.com/tianocore/tianocore.github.io/wiki More details: https://github.com/tianocore/edk2/discussions/11969 Signed-off-by: Michael Kubacki --- SignedCapsulePkg/Readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SignedCapsulePkg/Readme.md b/SignedCapsulePkg/Readme.md index 03358e93ee7d..88b95a25a8ee 100644 --- a/SignedCapsulePkg/Readme.md +++ b/SignedCapsulePkg/Readme.md @@ -6,6 +6,6 @@ Source Repository: https://github.com/tianocore/edk2/tree/master/SignedCapsulePk A whitepaper to describe the capsule design: https://github.com/tianocore-docs/Docs/raw/master/White_Papers/A_Tour_Beyond_BIOS_Capsule_Update_and_Recovery_in_EDK_II.pdf -Wiki pages to provides more detail on how to enable: https://github.com/tianocore/tianocore.github.io/wiki/Capsule-Based-Firmware-Update-and-Firmware-Recovery - +Wiki page with additional information: +[Capsule-Based Firmware Update and Firmware Recovery](https://www.tianocore.org/tianocore-wiki.github.io/reference/specs-standards/capsule_based_firmware_update_and_firmware_recovery.html) From 95a1f4fc4d16eec73931506886ec11e3667ff940 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Tue, 3 Feb 2026 15:12:46 -0500 Subject: [PATCH 1158/1172] UefiPayloadPkg: Update wiki links The wiki has moved and this change updates links in UefiPayloadPkg to refer to the new location. - New location: https://github.com/tianocore/tianocore-wiki.github.io - Rendered version: https://www.tianocore.org/tianocore-wiki.github.io/ - Old location: https://github.com/tianocore/tianocore.github.io/wiki More details: https://github.com/tianocore/edk2/discussions/11969 Signed-off-by: Michael Kubacki --- UefiPayloadPkg/BuildAndIntegrationInstructions.txt | 2 +- UefiPayloadPkg/PlatformCI/ReadMe.md | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/UefiPayloadPkg/BuildAndIntegrationInstructions.txt b/UefiPayloadPkg/BuildAndIntegrationInstructions.txt index 01b3d7f99298..3de01f0010e1 100644 --- a/UefiPayloadPkg/BuildAndIntegrationInstructions.txt +++ b/UefiPayloadPkg/BuildAndIntegrationInstructions.txt @@ -49,7 +49,7 @@ B. HOW TO BUILD is the EDK II build environment on your host. Tested with VS2015x86 toolchain. could be "SBL" for Slim Bootloader and "COREBOOT" for coreboot. - Refer to https://github.com/tianocore/tianocore.github.io/wiki/UDK2018-How-to-Build for + Refer to https://www.tianocore.org/tianocore-wiki.github.io/build-tooling/build-workflows/build_instructions.html for details about EDK II build steps. NOTE: Pure 32bit UEFI payload support could be added if required later. diff --git a/UefiPayloadPkg/PlatformCI/ReadMe.md b/UefiPayloadPkg/PlatformCI/ReadMe.md index a7cad0f5810c..56294ffd4c3d 100644 --- a/UefiPayloadPkg/PlatformCI/ReadMe.md +++ b/UefiPayloadPkg/PlatformCI/ReadMe.md @@ -30,7 +30,8 @@ Pytools build system. ## Building with Pytools for UefiPayloadPkg If you are unfamiliar with Pytools, it is recommended to first read through -the generic set of edk2 [Build Instructions](https://github.com/tianocore/tianocore.github.io/wiki/Build-Instructions). +the generic set of edk2 +[Build Instructions](https://www.tianocore.org/tianocore-wiki.github.io/build-tooling/build-workflows/build_instructions.html). 1. [Optional] Create a Python Virtual Environment - generally once per workspace From ade5fdb8e3cb5d74e4c48d8351d162547bc358e8 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Fri, 6 Feb 2026 18:02:41 -0500 Subject: [PATCH 1159/1172] Maintainers.txt: Highlight maintainer opportunities Adds a section to Maintainers.txt to indicate packages that either need maintainers or would benefit from additional maintainers. The community is welcome to update this list over time. Ideally, as maintainers are added, the packages would be removed from this list. Signed-off-by: Michael Kubacki --- Maintainers.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Maintainers.txt b/Maintainers.txt index 104f585a4875..5bde3ba76209 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -13,6 +13,14 @@ the package maintainer should send the patch to update Maintainers.txt with new maintainer, and the new maintainer should follow up with an Acked-by or a Reviewed-by. +Maintainers Wanted: + + The following packages are currently in need of additional maintainers. + + - NetworkPkg + - SecurityPkg + - ShellPkg + Descriptions of section entries: L: Mailing list that is relevant to this area (default is edk2-devel) From 756d5fb0aba845c529220d4a58effc0fe1304c70 Mon Sep 17 00:00:00 2001 From: Antaeus Kleinert-Strand Date: Wed, 21 Jan 2026 09:48:39 -0800 Subject: [PATCH 1160/1172] EmbeddedPkg/PrePiMemoryAllocationLib: Update memory hob page alignment When allocating Runtime memory the MemoryAllocation HOB's length needs to meet the alignment requirements of Runtime memory. On AARCH64 architectures this alignment is not the default of 4KB. Instead it is set by the RUNTIME_PAGE_ALLOCATION_GRANULARITY definition, which is 64KB. This change enforces the RUNTIME alignment as part of generating the MemoryAllocationHob for runtime memory types. Signed-off-by: Antaeus Kleinert-Strand --- .../MemoryAllocationLib.c | 49 +++++++++++++++---- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/EmbeddedPkg/Library/PrePiMemoryAllocationLib/MemoryAllocationLib.c b/EmbeddedPkg/Library/PrePiMemoryAllocationLib/MemoryAllocationLib.c index 35f9207fcb22..5f6695063613 100644 --- a/EmbeddedPkg/Library/PrePiMemoryAllocationLib/MemoryAllocationLib.c +++ b/EmbeddedPkg/Library/PrePiMemoryAllocationLib/MemoryAllocationLib.c @@ -24,11 +24,40 @@ InternalAllocatePages ( { EFI_PEI_HOB_POINTERS Hob; EFI_PHYSICAL_ADDRESS NewTop; + UINTN PagesSize; Hob.Raw = GetHobList (); - NewTop = Hob.HandoffInformationTable->EfiFreeMemoryTop & ~(EFI_PHYSICAL_ADDRESS)EFI_PAGE_MASK; - NewTop -= Pages * EFI_PAGE_SIZE; + if (Pages == 0) { + return NULL; + } + + // + // Calculate the new top of memory based on the memory type + // + switch (MemoryType) { + case EfiReservedMemoryType: + case EfiRuntimeServicesCode: + case EfiRuntimeServicesData: + case EfiACPIMemoryNVS: + PagesSize = ALIGN_VALUE (Pages, EFI_SIZE_TO_PAGES (RUNTIME_PAGE_ALLOCATION_GRANULARITY)) * EFI_PAGE_SIZE; + NewTop = Hob.HandoffInformationTable->EfiFreeMemoryTop & ~(EFI_PHYSICAL_ADDRESS)(RUNTIME_PAGE_ALLOCATION_GRANULARITY - 1); + break; + + default: + PagesSize = Pages * EFI_PAGE_SIZE; + NewTop = Hob.HandoffInformationTable->EfiFreeMemoryTop & ~(EFI_PHYSICAL_ADDRESS)EFI_PAGE_MASK; + break; + } + + // + // Verify that the subtraction does not underflow NewTop + // + if (PagesSize > NewTop) { + return NULL; + } + + NewTop -= PagesSize; // // Verify that there is sufficient memory to satisfy the allocation @@ -47,7 +76,7 @@ InternalAllocatePages ( // BuildMemoryAllocationHob ( Hob.HandoffInformationTable->EfiFreeMemoryTop, - Pages * EFI_PAGE_SIZE, + PagesSize, MemoryType ); @@ -80,9 +109,9 @@ AllocatePages ( Allocates one or more 4KB pages of type EfiRuntimeServicesData. Allocates the number of 4KB pages of type EfiRuntimeServicesData and returns a pointer to the - allocated buffer. The buffer returned is aligned on a 4KB boundary. If Pages is 0, then NULL - is returned. If there is not enough memory remaining to satisfy the request, then NULL is - returned. + allocated buffer. The buffer returned is aligned on a RUNTIME_PAGE_ALLOCATION_GRANULARITY boundary. + If Pages is 0, then NULL is returned. If there is not enough memory remaining to satisfy the request, + then NULL is returned. @param Pages The number of 4 KB pages to allocate. @@ -101,10 +130,10 @@ AllocateRuntimePages ( /** Allocates one or more 4KB pages of type EfiReservedMemoryType. - Allocates the number of 4KB pages of type EfiReservedMemoryTypes and returns a pointer to the - allocated buffer. The buffer returned is aligned on a 4KB boundary. If Pages is 0, then NULL - is returned. If there is not enough memory remaining to satisfy the request, then NULL is - returned. + Allocates the number of 4KB pages of type EfiReservedMemoryType and returns a pointer to the + allocated buffer. The buffer returned is aligned on a RUNTIME_PAGE_ALLOCATION_GRANULARITY boundary. + If Pages is 0, then NULL is returned. If there is not enough memory remaining to satisfy the request, + then NULL is returned. @param Pages The number of 4 KB pages to allocate. From e1c56cf5d54f469dece5c2678c1ea6841b4fe4fa Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 11 Feb 2026 09:59:43 -0800 Subject: [PATCH 1161/1172] Revert "BaseTools/Source/C/Makefile: Update OBJECTS using OS specific SEP" This reverts commit f0542ae07d5e5e4d311bf8ae33bf26b4b1acf9f4. PR https://github.com/tianocore/edk2/pull/11757 introduced a "Breaking Change" feature for out of tree builds of tools. This breaking change is blocking testing of edk2-stable202602 due to side effects on building FitGen tool in edk2-platforms. Revert this feature for the edk2-stable202602 release and work on this feature after the release. Signed-off-by: Michael D Kinney --- BaseTools/Source/C/Makefiles/app.makefile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/BaseTools/Source/C/Makefiles/app.makefile b/BaseTools/Source/C/Makefiles/app.makefile index 2ce185cb9d33..475cb88d04db 100644 --- a/BaseTools/Source/C/Makefiles/app.makefile +++ b/BaseTools/Source/C/Makefiles/app.makefile @@ -8,11 +8,10 @@ MAKEROOT ?= ../.. BUILDROOT ?= $(MAKEROOT) OBJDIR ?= . +OBJECTS := $(addprefix $(OBJDIR)/,$(OBJECTS)) include $(MAKEROOT)/Makefiles/header.makefile -OBJECTS := $(addprefix $(OBJDIR)$(SEP),$(OBJECTS)) - APPLICATION = $(BUILDROOT)/bin/$(APPNAME) .PHONY:all From 12f785f106216eedbedb02427255e257d506367f Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Wed, 11 Feb 2026 10:00:05 -0800 Subject: [PATCH 1162/1172] Revert "BaseTools: Add support for out-of-tree builds" This reverts commit 3fe1d56cc98e011bbde8348f13dfa5e38c95f49e. PR https://github.com/tianocore/edk2/pull/11757 introduced a "Breaking Change" feature for out of tree builds of tools. This breaking change is blocking testing of edk2-stable202602 due to side effects on building FitGen tool in edk2-platforms. Revert this feature for the edk2-stable202602 release and work on this feature after the release. Signed-off-by: Michael D Kinney --- .../BinWrappers/PosixLike/BrotliCompress | 8 +-- .../BinWrappers/PosixLike/GenericShellWrapper | 8 +-- BaseTools/Source/C/GNUmakefile | 21 +++----- BaseTools/Source/C/Makefiles/app.makefile | 9 ++-- BaseTools/Source/C/Makefiles/footer.makefile | 25 +++------ BaseTools/Source/C/Makefiles/header.makefile | 13 ++--- BaseTools/Source/C/Makefiles/lib.makefile | 8 +-- BaseTools/Source/C/VfrCompile/GNUmakefile | 51 +++++++++---------- .../Source/C/VfrCompile/Pccts/antlr/makefile | 13 +++-- .../Source/C/VfrCompile/Pccts/dlg/makefile | 21 ++++---- .../Source/Python/Workspace/DscBuildData.py | 3 +- 11 files changed, 64 insertions(+), 116 deletions(-) diff --git a/BaseTools/BinWrappers/PosixLike/BrotliCompress b/BaseTools/BinWrappers/PosixLike/BrotliCompress index 725f8e371482..d9898e95e159 100755 --- a/BaseTools/BinWrappers/PosixLike/BrotliCompress +++ b/BaseTools/BinWrappers/PosixLike/BrotliCompress @@ -36,13 +36,7 @@ do done -if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/BaseTools/Build/Source/C/bin" ] -then - if [ -e "$WORKSPACE/BaseTools/Build/Source/C/bin/$cmd" ] - then - exec "$WORKSPACE/BaseTools/Build/Source/C/bin/$cmd" $QLT $ARGS - fi -eif [ -n "$EDK_TOOLS_PATH" ] && [ -e "$EDK_TOOLS_PATH/Source/C/bin" ] +if [ -n "$EDK_TOOLS_PATH" ] && [ -e "$EDK_TOOLS_PATH/Source/C/bin" ] then if [ -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ] then diff --git a/BaseTools/BinWrappers/PosixLike/GenericShellWrapper b/BaseTools/BinWrappers/PosixLike/GenericShellWrapper index 8aeff63c7764..dae593f785f1 100755 --- a/BaseTools/BinWrappers/PosixLike/GenericShellWrapper +++ b/BaseTools/BinWrappers/PosixLike/GenericShellWrapper @@ -4,13 +4,7 @@ full_cmd=${BASH_SOURCE[-1]:-$0} # see http://mywiki.wooledge.org/BashFAQ/028 for dir=$(dirname "$full_cmd") cmd=${full_cmd##*/} -if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/BaseTools/Build/Source/C/bin" ] -then - if [ -e "$WORKSPACE/BaseTools/Build/Source/C/bin/$cmd" ] - then - exec "$WORKSPACE/BaseTools/Build/Source/C/bin/$cmd" "$@" - fi -elif [ -n "$EDK_TOOLS_PATH" ] && [ -e "$EDK_TOOLS_PATH/Source/C/bin" ] +if [ -n "$EDK_TOOLS_PATH" ] && [ -e "$EDK_TOOLS_PATH/Source/C/bin" ] then if [ -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ] then diff --git a/BaseTools/Source/C/GNUmakefile b/BaseTools/Source/C/GNUmakefile index 8661165a4470..73f4b27eeb71 100644 --- a/BaseTools/Source/C/GNUmakefile +++ b/BaseTools/Source/C/GNUmakefile @@ -13,12 +13,6 @@ else MAKEROOT := . endif -ifneq ($(WORKSPACE),) - BUILDROOT=$(WORKSPACE)/BaseTools/Build/Source/C -else - BUILDROOT=$(abspath $(MAKEROOT)) -endif - include Makefiles/header.makefile export PYTHON_COMMAND @@ -44,29 +38,28 @@ APPLICATIONS = \ SUBDIRS := $(LIBRARIES) $(APPLICATIONS) -$(LIBRARIES): $(BUILDROOT)/libs -$(APPLICATIONS): $(LIBRARIES) $(BUILDROOT)/bin +$(LIBRARIES): $(MAKEROOT)/libs +$(APPLICATIONS): $(LIBRARIES) $(MAKEROOT)/bin .PHONY: outputdirs makerootdir: - -$(MD) $(BUILDROOT) + -$(MD) $(MAKEROOT) .PHONY: subdirs $(SUBDIRS) subdirs: $(SUBDIRS) $(SUBDIRS): - -$(MD) $(BUILDROOT)/$@ - $(MAKE) OBJDIR=$(BUILDROOT)/$@ BUILDROOT=$(BUILDROOT) -C $@ + $(MAKE) -C $@ .PHONY: $(patsubst %,%-clean,$(sort $(SUBDIRS))) $(patsubst %,%-clean,$(sort $(SUBDIRS))): - -$(MAKE) OBJDIR=$(BUILDROOT)/$(@:-clean=) BUILDROOT=$(BUILDROOT) -C $(@:-clean=) clean + -$(MAKE) -C $(@:-clean=) clean clean: $(patsubst %,%-clean,$(sort $(SUBDIRS))) clean: localClean localClean: - $(RM) $(BUILDROOT)/bin/* - -$(RD) $(BUILDROOT)/libs $(BUILDROOT)/bin + $(RM) $(MAKEROOT)/bin/* + -$(RD) $(MAKEROOT)/libs $(MAKEROOT)/bin include Makefiles/footer.makefile diff --git a/BaseTools/Source/C/Makefiles/app.makefile b/BaseTools/Source/C/Makefiles/app.makefile index 475cb88d04db..b66e564b3bcf 100644 --- a/BaseTools/Source/C/Makefiles/app.makefile +++ b/BaseTools/Source/C/Makefiles/app.makefile @@ -6,19 +6,16 @@ # MAKEROOT ?= ../.. -BUILDROOT ?= $(MAKEROOT) -OBJDIR ?= . -OBJECTS := $(addprefix $(OBJDIR)/,$(OBJECTS)) include $(MAKEROOT)/Makefiles/header.makefile -APPLICATION = $(BUILDROOT)/bin/$(APPNAME) +APPLICATION = $(MAKEROOT)/bin/$(APPNAME) .PHONY:all -all: $(BUILDROOT)/bin $(APPLICATION) +all: $(MAKEROOT)/bin $(APPLICATION) $(APPLICATION): $(OBJECTS) - $(LINKER) -o $(APPLICATION) $(LDFLAGS) $(OBJECTS) -L$(BUILDROOT)/libs $(LIBS) + $(LINKER) -o $(APPLICATION) $(LDFLAGS) $(OBJECTS) -L$(MAKEROOT)/libs $(LIBS) ifeq (Windows, $(findstring Windows,$(OS))) $(CP) $(APPLICATION).exe $(BIN_PATH) endif diff --git a/BaseTools/Source/C/Makefiles/footer.makefile b/BaseTools/Source/C/Makefiles/footer.makefile index 7d608a5e826f..9a3dfcd49440 100644 --- a/BaseTools/Source/C/Makefiles/footer.makefile +++ b/BaseTools/Source/C/Makefiles/footer.makefile @@ -7,37 +7,24 @@ DEPFILES = $(OBJECTS:%.o=%.d) -$(BUILDROOT)/libs-$(HOST_ARCH): - $(MD) $(BUILDROOT)/libs-$(HOST_ARCH) +$(MAKEROOT)/libs-$(HOST_ARCH): + $(MD) $(MAKEROOT)/libs-$(HOST_ARCH) .PHONY: install -install: $(BUILDROOT)/libs-$(HOST_ARCH) $(LIBRARY) - $(CP) $(LIBRARY) $(BUILDROOT)/libs-$(HOST_ARCH) +install: $(MAKEROOT)/libs-$(HOST_ARCH) $(LIBRARY) + $(CP) $(LIBRARY) $(MAKEROOT)/libs-$(HOST_ARCH) $(LIBRARY): $(OBJECTS) $(AR) crs $@ $^ -$(OBJDIR)/%.o : %.c - @$(MD) $(@D) +%.o : %.c $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@ -$(OBJDIR)/%.o : %.cpp - @$(MD) $(@D) +%.o : %.cpp $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ -$(OBJECTS): | $(OBJDIR) - -$(OBJDIR)/%.d : %.c - @set -e; rm -f $@; \ - $(MD) $(@D); \ - $(CC) -M $(CPPFLAGS) $< > $@.$$$$; \ - sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ - rm -f $@.$$$$ - .PHONY: clean clean: $(RM) $(OBJECTS) $(LIBRARY) $(DEPFILES) -ifneq ($(MAKECMDGOALS), clean) -include $(DEPFILES) -endif diff --git a/BaseTools/Source/C/Makefiles/header.makefile b/BaseTools/Source/C/Makefiles/header.makefile index 286bc5235dd2..d63f487724a5 100644 --- a/BaseTools/Source/C/Makefiles/header.makefile +++ b/BaseTools/Source/C/Makefiles/header.makefile @@ -206,16 +206,11 @@ LDFLAGS += $(EXTRA_LDFLAGS) all: -$(BUILDROOT)/libs: - $(MD) $(BUILDROOT)/libs +$(MAKEROOT)/libs: + $(MD) $(MAKEROOT)/libs -$(BUILDROOT)/bin: - $(MD) $(BUILDROOT)/bin +$(MAKEROOT)/bin: + $(MD) $(MAKEROOT)/bin ifeq (Windows, $(findstring Windows,$(OS))) $(MD) $(BIN_PATH) endif - -ifdef OBJDIR -$(OBJDIR): - $(MD) $(OBJDIR) -endif diff --git a/BaseTools/Source/C/Makefiles/lib.makefile b/BaseTools/Source/C/Makefiles/lib.makefile index e2186b68639f..2577c15380a9 100644 --- a/BaseTools/Source/C/Makefiles/lib.makefile +++ b/BaseTools/Source/C/Makefiles/lib.makefile @@ -5,14 +5,10 @@ # SPDX-License-Identifier: BSD-2-Clause-Patent # -BUILDROOT ?= $(MAKEROOT) -OBJDIR ?= . -OBJECTS := $(addprefix $(OBJDIR)/,$(OBJECTS)) - include $(MAKEROOT)/Makefiles/header.makefile -LIBRARY = $(BUILDROOT)/libs/lib$(LIBNAME).a +LIBRARY = $(MAKEROOT)/libs/lib$(LIBNAME).a -all: $(BUILDROOT)/libs $(LIBRARY) +all: $(MAKEROOT)/libs $(LIBRARY) include $(MAKEROOT)/Makefiles/footer.makefile diff --git a/BaseTools/Source/C/VfrCompile/GNUmakefile b/BaseTools/Source/C/VfrCompile/GNUmakefile index 3cdf68298bb3..b469bd3f303f 100644 --- a/BaseTools/Source/C/VfrCompile/GNUmakefile +++ b/BaseTools/Source/C/VfrCompile/GNUmakefile @@ -8,16 +8,14 @@ MAKEROOT ?= .. APPNAME = VfrCompile -BUILDROOT ?= $(MAKEROOT) -OBJDIR ?= $(abspath .) LIBS = -lCommon TOOL_INCLUDE = -I Pccts/h +#OBJECTS = VfrSyntax.o VfrServices.o DLGLexer.o EfiVfrParser.o ATokenBuffer.o DLexerBase.o AParser.o OBJECTS = AParser.o DLexerBase.o ATokenBuffer.o EfiVfrParser.o VfrLexer.o VfrSyntax.o \ VfrFormPkg.o VfrError.o VfrUtilityLib.o VfrCompiler.o -OBJECTS := $(addprefix $(OBJDIR)/,$(OBJECTS)) CLANG := $(findstring clang,$(shell $(CC) --version)) ifneq ($(CLANG),) VFR_CPPFLAGS = -Wno-deprecated-register -std=c++14 -DPCCTS_USE_NAMESPACE_STD $(CPPFLAGS) @@ -32,18 +30,22 @@ VFR_LFLAGS = $(EXTRA_LDFLAGS) LINKER = $(CXX) +EXTRA_CLEAN_OBJECTS = EfiVfrParser.cpp EfiVfrParser.h VfrParser.dlg VfrTokens.h VfrLexer.cpp VfrLexer.h VfrSyntax.cpp tokens.h + +MAKEROOT ?= ../.. + include $(MAKEROOT)/Makefiles/header.makefile -APPLICATION = $(BUILDROOT)/bin/$(APPNAME) +APPLICATION = $(MAKEROOT)/bin/$(APPNAME) -BIN_DIR=$(OBJDIR) +BIN_DIR=. export BIN_DIR .PHONY:all -all: $(BUILDROOT)/bin $(APPLICATION) +all: $(MAKEROOT)/bin $(APPLICATION) $(APPLICATION): $(OBJECTS) - $(LINKER) -o $(APPLICATION) $(VFR_LFLAGS) $(OBJECTS) -L$(BUILDROOT)/libs $(LIBS) + $(LINKER) -o $(APPLICATION) $(VFR_LFLAGS) $(OBJECTS) -L$(MAKEROOT)/libs $(LIBS) ifeq (Windows, $(findstring Windows,$(OS))) $(CP) $(APPLICATION).exe $(BIN_PATH) endif @@ -52,42 +54,35 @@ VfrCompiler.o: ../Include/Common/BuildVersion.h include $(MAKEROOT)/Makefiles/footer.makefile -GEN_SYNTAX_FILES := $(addprefix $(OBJDIR)/,VfrSyntax.cpp EfiVfrParser.cpp EfiVfrParser.h VfrParser.dlg VfrTokens.h) -$(GEN_SYNTAX_FILES): $(OBJDIR)/antlr VfrSyntax.g - $(OBJDIR)/antlr -CC -e3 -ck 3 -k 2 -fl VfrParser.dlg -ft VfrTokens.h -o $(OBJDIR) VfrSyntax.g - -GEN_LEXER_FILES := $(addprefix $(OBJDIR)/,VfrLexer.cpp VfrLexer.h) -$(GEN_LEXER_FILES): $(OBJDIR)/dlg $(OBJDIR)/VfrParser.dlg - $(OBJDIR)/dlg -C2 -i -CC -cl VfrLexer -o $(OBJDIR) $(OBJDIR)/VfrParser.dlg - -EXTRA_CLEAN_OBJECTS = $(GEN_SYNTAX_FILES) $(GEN_LEXER_FILES) +VfrSyntax.cpp EfiVfrParser.cpp EfiVfrParser.h VfrParser.dlg VfrTokens.h: Pccts/antlr/antlr VfrSyntax.g + Pccts/antlr/antlr -CC -e3 -ck 3 -k 2 -fl VfrParser.dlg -ft VfrTokens.h -o . VfrSyntax.g -$(OBJDIR)/Pccts/antlr $(OBJDIR)/Pccts/dlg: - $(MD) $@ +VfrLexer.cpp VfrLexer.h: Pccts/dlg/dlg VfrParser.dlg + Pccts/dlg/dlg -C2 -i -CC -cl VfrLexer -o . VfrParser.dlg -$(OBJDIR)/antlr: | $(OBJDIR)/Pccts/antlr - $(MAKE) OBJDIR=$(OBJDIR)/Pccts/antlr -C Pccts/antlr +Pccts/antlr/antlr: + $(MAKE) -C Pccts/antlr -$(OBJDIR)/dlg: | $(OBJDIR)/Pccts/dlg - $(MAKE) OBJDIR=$(OBJDIR)/Pccts/dlg -C Pccts/dlg +Pccts/dlg/dlg: + $(MAKE) -C Pccts/dlg -$(OBJDIR)/ATokenBuffer.o: Pccts/h/ATokenBuffer.cpp +ATokenBuffer.o: Pccts/h/ATokenBuffer.cpp $(CXX) -c $(VFR_CPPFLAGS) $(INC) $(VFR_CXXFLAGS) $? -o $@ -$(OBJDIR)/DLexerBase.o: Pccts/h/DLexerBase.cpp +DLexerBase.o: Pccts/h/DLexerBase.cpp $(CXX) -c $(VFR_CPPFLAGS) $(INC) $(VFR_CXXFLAGS) $? -o $@ -$(OBJDIR)/AParser.o: Pccts/h/AParser.cpp +AParser.o: Pccts/h/AParser.cpp $(CXX) -c $(VFR_CPPFLAGS) $(INC) $(VFR_CXXFLAGS) $? -o $@ -$(OBJDIR)/VfrSyntax.o: $(OBJDIR)/VfrSyntax.cpp +VfrSyntax.o: VfrSyntax.cpp $(CXX) -c $(VFR_CPPFLAGS) $(INC) $(VFR_CXXFLAGS) $? -o $@ clean: localClean localClean: - $(MAKE) OBJDIR=$(OBJDIR)/Pccts/antlr -C Pccts/antlr clean - $(MAKE) OBJDIR=$(OBJDIR)/Pccts/dlg -C Pccts/dlg clean + $(MAKE) -C Pccts/antlr clean + $(MAKE) -C Pccts/dlg clean $(RM) $(EXTRA_CLEAN_OBJECTS) ifeq (Windows, $(findstring Windows,$(OS))) $(RM) $(BIN_PATH)/$(APPNAME).exe diff --git a/BaseTools/Source/C/VfrCompile/Pccts/antlr/makefile b/BaseTools/Source/C/VfrCompile/Pccts/antlr/makefile index 77a289ef1c83..ca0783b52ef3 100644 --- a/BaseTools/Source/C/VfrCompile/Pccts/antlr/makefile +++ b/BaseTools/Source/C/VfrCompile/Pccts/antlr/makefile @@ -184,7 +184,6 @@ CPPFLAGS= #CFLAGS= -O -I. -I$(SET) -I$(PCCTS_H) -DUSER_ZZSYN -woff 3262 OBJ=antlr.o scan.o err.o bits.o build.o fset2.o fset.o gen.o \ globals.o hash.o lex.o main.o misc.o set.o pred.o egman.o mrhoist.o fcache.o -OBJ := $(addprefix $(OBJDIR)/,$(OBJ)) $(BIN_DIR)/antlr : $(OBJ) $(SRC) $(CC) $(CFLAGS) -o $(BIN_DIR)/antlr $(OBJ) @@ -202,17 +201,17 @@ SRC=antlr.c scan.c err.c bits.c build.c fset2.c fset.c gen.c globals.c \ #antlr.c stdpccts.h parser.dlg tokens.h err.c : antlr.g # $(ANTLR) -gh antlr.g -$(OBJDIR)/antlr.o : antlr.c mode.h tokens.h +antlr.o : antlr.c mode.h tokens.h -$(OBJDIR)/scan.o : scan.c mode.h tokens.h +scan.o : scan.c mode.h tokens.h #scan.c mode.h: parser.dlg # $(DLG) -C2 parser.dlg scan.c -$(OBJDIR)/set.o : $(SET)/set.c - $(CC) $(CFLAGS) -c -o $@ $< +set.o : $(SET)/set.c + $(CC) $(CFLAGS) -c -o set.o $(SET)/set.c -$(OBJDIR)/%.o : %.c +%.o : %.c $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ # @@ -221,7 +220,7 @@ $(OBJDIR)/%.o : %.c #clean up all the intermediate files clean: - $(RM) $(BIN_DIR)$(SEP)antlr $(OBJDIR)$(SEP)*.$(OBJ_EXT) core + $(RM) $(BIN_DIR)$(SEP)antlr *.$(OBJ_EXT) core #remove everything in clean plus the PCCTS files generated scrub: diff --git a/BaseTools/Source/C/VfrCompile/Pccts/dlg/makefile b/BaseTools/Source/C/VfrCompile/Pccts/dlg/makefile index bd1dfca4c83e..4660a8806a59 100644 --- a/BaseTools/Source/C/VfrCompile/Pccts/dlg/makefile +++ b/BaseTools/Source/C/VfrCompile/Pccts/dlg/makefile @@ -137,7 +137,6 @@ OBJ_EXT=o OUT_OBJ = -o OBJ = dlg_p.o dlg_a.o main.o err.o set.o support.o output.o \ relabel.o automata.o -OBJ := $(addprefix $(OBJDIR)/,$(OBJ)) $(BIN_DIR)/dlg : $(OBJ) $(SRC) $(CC) $(CFLAGS) -o $(BIN_DIR)/dlg $(OBJ) @@ -151,19 +150,19 @@ SRC = dlg_p.c dlg_a.c main.c err.c $(SET)/set.c support.c output.c \ #dlg_a.c mode.h : parser.dlg # $(DLG) -C2 parser.dlg dlg_a.c -$(OBJDIR)/dlg_p.$(OBJ_EXT) : dlg_p.c dlg.h tokens.h mode.h - $(CC) $(CFLAGS) -o $@ -c dlg_p.c +dlg_p.$(OBJ_EXT) : dlg_p.c dlg.h tokens.h mode.h + $(CC) $(CFLAGS) -c dlg_p.c -$(OBJDIR)/dlg_a.$(OBJ_EXT) : dlg_a.c dlg.h tokens.h mode.h - $(CC) $(CFLAGS) -o $@ -c dlg_a.c +dlg_a.$(OBJ_EXT) : dlg_a.c dlg.h tokens.h mode.h + $(CC) $(CFLAGS) -c dlg_a.c -$(OBJDIR)/main.$(OBJ_EXT) : main.c dlg.h - $(CC) $(CFLAGS) -o $@ -c main.c +main.$(OBJ_EXT) : main.c dlg.h + $(CC) $(CFLAGS) -c main.c -$(OBJDIR)/set.$(OBJ_EXT) : $(SET)/set.c - $(CC) -c $(CFLAGS) -o $@ $(SET)/set.c +set.$(OBJ_EXT) : $(SET)/set.c + $(CC) -c $(CFLAGS) $(SET)/set.c -$(OBJDIR)/%.o : %.c +%.o : %.c $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ lint: @@ -171,4 +170,4 @@ lint: #clean up all the intermediate files clean: - $(RM) $(BIN_DIR)$(SEP)dlg $(OBJDIR)$(SEP)*.$(OBJ_EXT) core + $(RM) $(BIN_DIR)$(SEP)dlg *.$(OBJ_EXT) core diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py index ddb576fdebb4..014f6d08058c 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -2942,8 +2942,7 @@ def GenerateByteArrayValue (self, StructuredPcds): else: AppSuffix = '.exe' if sys.platform == "win32" else '' MakeApp = MakeApp + PcdGccMakefile - MakeApp = MakeApp + 'OBJDIR = %s\n' % self.OutputPath - MakeApp = MakeApp + 'APPFILE = %s%s%s%s\n' % (self.OutputPath, os.sep, PcdValueInitName, AppSuffix) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s.o %s.o\n' % (PcdValueInitName, PcdValueCommonName) + \ + MakeApp = MakeApp + 'APPFILE = %s%s%s%s\n' % (self.OutputPath, os.sep, PcdValueInitName, AppSuffix) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o %s.o\n' % (self.OutputPath, PcdValueInitName, os.path.join(self.OutputPath, PcdValueCommonName)) + \ 'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'TOOL_INCLUDE +=' IncSearchList = [] From 7baa358e2cdde7a36cbed47da8ffd67f0f842243 Mon Sep 17 00:00:00 2001 From: kavipriyankp Date: Tue, 10 Feb 2026 12:57:02 +0530 Subject: [PATCH 1163/1172] ArmPlatformPkg/PL011UartLib : Fix incorrect control bit validation REF: [e092122] (PR #12085) The current logic in ArmPlatformPkg/PL011UartLib performs control-bit checks intended to align with the UEFI specification. However, it incorrectly validates control bits that cannot be set through SetControl(), resulting in failures in the SetControl() SCT test. According to the UEFI specification, the valid control bits that can be set are: EFI_SERIAL_REQUEST_TO_SEND EFI_SERIAL_DATA_TERMINAL_READY EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE This patch updates mAllowedControlBits so that only these valid control bits are accepted during validation. Cc: Sachin Ganesh Signed-off-by: Kavipriyan K P --- ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.c b/ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.c index 67cf7504abf5..1c944fab8260 100644 --- a/ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.c +++ b/ArmPlatformPkg/Library/PL011UartLib/PL011UartLib.c @@ -25,13 +25,11 @@ // Per UEFI spec, only these control bits are allowed to be set. // STATIC CONST UINT32 mAllowedControlBits = - EFI_SERIAL_CLEAR_TO_SEND | - EFI_SERIAL_DATA_SET_READY | - EFI_SERIAL_RING_INDICATE | - EFI_SERIAL_CARRIER_DETECT | + EFI_SERIAL_REQUEST_TO_SEND | + EFI_SERIAL_DATA_TERMINAL_READY | + EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE | EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE | - EFI_SERIAL_OUTPUT_BUFFER_EMPTY | - EFI_SERIAL_INPUT_BUFFER_EMPTY; + EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE; // // platform-specific bits that are not supported by this device. From 16d9ba7275d438362c89623ebb25701d87aee566 Mon Sep 17 00:00:00 2001 From: rdiaz Date: Fri, 6 Feb 2026 22:47:15 +0000 Subject: [PATCH 1164/1172] MdeModulePkg: Add helper to check if FF-A is supported Added ArmFfaLibIsFfaSupported to ArmFfaCommon to allow for queries of FF-A support outside of ArmFfaCommonInit. Signed-off-by: Raymond Diaz --- MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c | 45 +++++++++++++++++++ MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h | 12 +++++ 2 files changed, 57 insertions(+) diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c index d0fb95123051..ea311861a52a 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c @@ -1172,3 +1172,48 @@ GetRxTxBufferMinSizeAndAlign ( return EFI_SUCCESS; } + +/** + Determine if FF-A is supported + + @retval TRUE if FF-A is supported, FALSE otherwise. + +**/ +BOOLEAN +EFIAPI +ArmFfaLibIsFfaSupported ( + IN VOID + ) +{ + EFI_STATUS Status; + UINT16 CurrentMajorVersion; + UINT16 CurrentMinorVersion; + + Status = ArmFfaLibGetVersion ( + ARM_FFA_MAJOR_VERSION, + ARM_FFA_MINOR_VERSION, + &CurrentMajorVersion, + &CurrentMinorVersion + ); + if (EFI_ERROR (Status)) { + return FALSE; + } + + if ((ARM_FFA_MAJOR_VERSION != CurrentMajorVersion) || + (ARM_FFA_MINOR_VERSION > CurrentMinorVersion)) + { + DEBUG (( + DEBUG_INFO, + "Incompatible FF-A Versions.\n" \ + "Request Version: Major=0x%x, Minor=0x%x.\n" \ + "Current Version: Major=0x%x, Minor>=0x%x.\n", + ARM_FFA_MAJOR_VERSION, + ARM_FFA_MINOR_VERSION, + CurrentMajorVersion, + CurrentMinorVersion + )); + return FALSE; + } + + return TRUE; +} diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h index 1994dd8eef39..003da1b922ab 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h @@ -86,4 +86,16 @@ GetRxTxBufferMinSizeAndAlign ( OUT UINTN *MinSizeAndAlign ); +/** + Determine if FF-A is supported + + @retval TRUE if FF-A is supported, FALSE otherwise. + +**/ +BOOLEAN +EFIAPI +ArmFfaLibIsFfaSupported ( + IN VOID + ); + #endif From 7416ebda09de01092c9dec0bdf078a64e93dc69f Mon Sep 17 00:00:00 2001 From: rdiaz Date: Fri, 6 Feb 2026 23:16:22 +0000 Subject: [PATCH 1165/1172] MdeModulePkg: Remove global usage in ArmFfaCommon Removed global variables in ArmFfaCommon. Moved the globals to locals in each phase's ArmFfaLib implementation. SEC and PEI will query when necessary to avoid setting globals when memory is unavailable. Signed-off-by: Raymond Diaz --- MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c | 91 ++++++---------- MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h | 29 ++++- MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c | 44 +++++++- MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c | 103 +++++++++++++++--- .../Library/ArmFfaLib/ArmFfaRxTxMap.c | 10 +- MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c | 40 ++++++- .../Library/ArmFfaLib/ArmFfaSecRxTxMap.c | 9 +- .../Library/ArmFfaLib/ArmFfaStandaloneMmLib.c | 45 +++++++- .../ArmFfaLib/ArmFfaStandaloneMmRxTxMap.c | 5 +- 9 files changed, 289 insertions(+), 87 deletions(-) diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c index ea311861a52a..975e31df58bf 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c @@ -32,9 +32,6 @@ #include "ArmFfaCommon.h" -BOOLEAN gFfaSupported; -UINT16 gPartId; - /** Convert EFI_STATUS to FFA return code. @@ -171,22 +168,6 @@ ArmCallFfa ( } } -/** - Check FF-A support or not. - - @retval TRUE Supported - @retval FALSE Not supported - -**/ -BOOLEAN -EFIAPI -IsFfaSupported ( - IN VOID - ) -{ - return gFfaSupported; -} - /** Get FF-A version. @@ -775,15 +756,21 @@ ArmFfaLibMsgSendDirectReq ( { EFI_STATUS Status; ARM_FFA_ARGS FfaArgs; + UINT16 PartId; - if ((DestPartId == gPartId) || (ImpDefArgs == NULL)) { + Status = ArmFfaLibGetPartId (&PartId); + if (EFI_ERROR (Status)) { + return Status; + } + + if ((DestPartId == PartId) || (ImpDefArgs == NULL)) { return EFI_INVALID_PARAMETER; } ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); FfaArgs.Arg0 = ARM_FID_FFA_MSG_SEND_DIRECT_REQ; - FfaArgs.Arg1 = PACK_PARTITION_ID_INFO (gPartId, DestPartId); + FfaArgs.Arg1 = PACK_PARTITION_ID_INFO (PartId, DestPartId); FfaArgs.Arg2 = Flags; FfaArgs.Arg3 = ImpDefArgs->Arg0; FfaArgs.Arg4 = ImpDefArgs->Arg1; @@ -830,6 +817,7 @@ ArmFfaLibMsgSendDirectReq2 ( EFI_STATUS Status; UINT64 Uuid[2]; ARM_FFA_ARGS FfaArgs; + UINT16 PartId; /* * Direct message request 2 is only supported on AArch64. @@ -838,7 +826,12 @@ ArmFfaLibMsgSendDirectReq2 ( return EFI_UNSUPPORTED; } - if ((DestPartId == gPartId) || (ImpDefArgs == NULL)) { + Status = ArmFfaLibGetPartId (&PartId); + if (EFI_ERROR (Status)) { + return Status; + } + + if ((DestPartId == PartId) || (ImpDefArgs == NULL)) { return EFI_INVALID_PARAMETER; } @@ -851,7 +844,7 @@ ArmFfaLibMsgSendDirectReq2 ( ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); FfaArgs.Arg0 = ARM_FID_FFA_MSG_SEND_DIRECT_REQ2; - FfaArgs.Arg1 = PACK_PARTITION_ID_INFO (gPartId, DestPartId); + FfaArgs.Arg1 = PACK_PARTITION_ID_INFO (PartId, DestPartId); FfaArgs.Arg2 = Uuid[0]; FfaArgs.Arg3 = Uuid[1]; FfaArgs.Arg4 = ImpDefArgs->Arg0; @@ -897,56 +890,34 @@ ArmFfaLibMsgSendDirectReq2 ( /** Common ArmFfaLib init. + @param [out] PartId PartitionId + @param [out] IsFfaSupported FF-A supported flag + @retval EFI_SUCCESS Success - @retval EFI_UNSUPPORTED FF-A isn't supported + @retval EFI_INVALID_PARAMETER Invalid parameter @retval Others Error **/ EFI_STATUS EFIAPI ArmFfaLibCommonInit ( - IN VOID + OUT UINT16 *PartId, + OUT BOOLEAN *IsFfaSupported ) { EFI_STATUS Status; - UINT16 CurrentMajorVersion; - UINT16 CurrentMinorVersion; - gFfaSupported = FALSE; - - Status = ArmFfaLibGetVersion ( - ARM_FFA_MAJOR_VERSION, - ARM_FFA_MINOR_VERSION, - &CurrentMajorVersion, - &CurrentMinorVersion - ); - if (EFI_ERROR (Status)) { - return EFI_UNSUPPORTED; + if ((PartId == NULL) || (IsFfaSupported == NULL)) { + return EFI_INVALID_PARAMETER; } - if ((ARM_FFA_MAJOR_VERSION != CurrentMajorVersion) || - (ARM_FFA_MINOR_VERSION > CurrentMinorVersion)) - { - DEBUG (( - DEBUG_INFO, - "Incompatible FF-A Versions.\n" \ - "Request Version: Major=0x%x, Minor=0x%x.\n" \ - "Current Version: Major=0x%x, Minor>=0x%x.\n", - ARM_FFA_MAJOR_VERSION, - ARM_FFA_MINOR_VERSION, - CurrentMajorVersion, - CurrentMinorVersion - )); - return EFI_UNSUPPORTED; - } + *IsFfaSupported = ArmFfaLibIsFfaSupported (); - Status = ArmFfaLibPartitionIdGet (&gPartId); + Status = ArmFfaLibPartitionIdGet (PartId); if (EFI_ERROR (Status)) { return Status; } - gFfaSupported = TRUE; - return EFI_SUCCESS; } @@ -981,6 +952,7 @@ ArmFfaLibGetPartitionInfo ( UINT64 RxBufferSize; UINT32 Count; UINT32 Size; + UINT16 PartId; if (PartDesc == NULL) { return EFI_INVALID_PARAMETER; @@ -1019,13 +991,18 @@ ArmFfaLibGetPartitionInfo ( return Status; } + Status = ArmFfaLibGetPartId (&PartId); + if (EFI_ERROR (Status)) { + return Status; + } + if ((Size < sizeof (EFI_FFA_PART_INFO_DESC))) { - ArmFfaLibRxRelease (gPartId); + ArmFfaLibRxRelease (PartId); return EFI_INVALID_PARAMETER; } CopyMem (PartDesc, RxBuffer, sizeof (EFI_FFA_PART_INFO_DESC)); - ArmFfaLibRxRelease (gPartId); + ArmFfaLibRxRelease (PartId); return EFI_SUCCESS; } diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h index 003da1b922ab..22bcd650e54b 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h @@ -19,9 +19,6 @@ #include -extern BOOLEAN gFfaSupported; -extern UINT16 gPartId; - /** Convert FfArgs to EFI_STATUS. @@ -39,14 +36,19 @@ FfaArgsToEfiStatus ( /** Common ArmFfaLib Constructor. - @retval EFI_SUCCESS - @retval Others Error + @param [out] PartId PartitionId + @param [out] IsFfaSupported FF-A supported flag + + @retval EFI_SUCCESS Success + @retval EFI_INVALID_PARAMETER Invalid parameter + @retval Others Error **/ EFI_STATUS EFIAPI ArmFfaLibCommonInit ( - IN VOID + OUT UINT16 *PartId, + OUT BOOLEAN *IsFfaSupported ); /** @@ -98,4 +100,19 @@ ArmFfaLibIsFfaSupported ( IN VOID ); +/** + Return partition or VM ID + + @param[out] PartId The partition or VM ID + + @retval EFI_SUCCESS Partition ID or VM ID returned + @retval Others Errors + +**/ +EFI_STATUS +EFIAPI +ArmFfaLibGetPartId ( + OUT UINT16 *PartId + ); + #endif diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c index 94a4a215600d..3c81435334dc 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c @@ -34,6 +34,8 @@ #include "ArmFfaRxTxMap.h" STATIC EFI_EVENT mFfaExitBootServiceEvent; +STATIC UINT16 mPartId; +STATIC BOOLEAN mIsFfaSupported; /** Unmap RX/TX buffer on Exit Boot Service. @@ -78,9 +80,9 @@ ArmFfaDxeLibConstructor ( UINTN Property1; UINTN Property2; - Status = ArmFfaLibCommonInit (); + Status = ArmFfaLibCommonInit (&mPartId, &mIsFfaSupported); if (EFI_ERROR (Status)) { - if (Status == EFI_UNSUPPORTED) { + if (!mIsFfaSupported) { /* * EFI_UNSUPPORTED return from ArmFfaLibCommonInit() means * FF-A interface doesn't support. @@ -194,3 +196,41 @@ ArmFfaDxeLibConstructor ( return Status; } + +/** + Return partition or VM ID + + @param[out] PartId The partition or VM ID + + @retval EFI_SUCCESS Partition ID or VM ID returned + @retval Others Errors + +**/ +EFI_STATUS +EFIAPI +ArmFfaLibGetPartId ( + OUT UINT16 *PartId + ) +{ + if (PartId != NULL) { + *PartId = mPartId; + } + + return EFI_SUCCESS; +} + +/** + Check FF-A support or not. + + @retval TRUE Supported + @retval FALSE Not supported + +**/ +BOOLEAN +EFIAPI +IsFfaSupported ( + IN VOID + ) +{ + return mIsFfaSupported; +} diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c index c21d5f2ba08a..420d5e89d789 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c @@ -34,6 +34,10 @@ #include "ArmFfaCommon.h" #include "ArmFfaRxTxMap.h" +STATIC UINT16 mPartId; +STATIC BOOLEAN mIsFfaSupported; +STATIC BOOLEAN mIsPermMemAvailable = FALSE; + /** Notification service to be called when gEfiPeiMemoryDiscoveredPpiGuid is installed. This function change reamp Rx/Tx buffer with permanent memory from @@ -102,24 +106,52 @@ ArmFfaPeiLibConstructor ( EFI_HOB_MEMORY_ALLOCATION *RxTxBufferAllocationHob; UINTN Property1; UINTN Property2; + UINT16 PartId; + BOOLEAN IsFfaSupported; - Status = ArmFfaLibCommonInit (); - if (EFI_ERROR (Status)) { - if (Status == EFI_UNSUPPORTED) { - /* - * EFI_UNSUPPORTED return from ArmFfaLibCommonInit() means - * FF-A interface doesn't support. - * However, It doesn't make failure of loading driver/library instance - * (i.e) ArmPkg's MmCommunication Dxe/PEI Driver uses as well as SpmMm. - * So If FF-A is not supported the the MmCommunication Dxe/PEI falls - * back to SpmMm. - * For this case, return EFI_SUCCESS. + Status = (**PeiServices).RegisterForShadow (FileHandle); + if (Status == EFI_NOT_FOUND) { + return Status; + } - */ - return EFI_SUCCESS; + /* + * ArmFfaLibCommonInit() sets several pieces of information. + * This function should only be called with globals when the PEIM is running in + * permanent memory. + */ + if (Status == EFI_ALREADY_STARTED) { + mIsPermMemAvailable = TRUE; + Status = ArmFfaLibCommonInit (&mPartId, &mIsFfaSupported); + if (EFI_ERROR (Status)) { + if (!mIsFfaSupported) { + /* + * EFI_UNSUPPORTED return from ArmFfaLibCommonInit() means + * FF-A interface doesn't support. + * However, It doesn't make failure of loading driver/library instance + * (i.e) ArmPkg's MmCommunication Dxe/PEI Driver uses as well as SpmMm. + * So If FF-A is not supported the the MmCommunication Dxe/PEI falls + * back to SpmMm. + * For this case, return EFI_SUCCESS. + + */ + return EFI_SUCCESS; + } + + return Status; } + } else { + /* + * When permanent memory is unavailable, we need to use locals rather + * than the globals. + */ + Status = ArmFfaLibCommonInit (&PartId, &IsFfaSupported); + if (EFI_ERROR (Status)) { + if (!IsFfaSupported) { + return EFI_SUCCESS; + } - return Status; + return Status; + } } RxTxBufferHob = GetFirstGuidHob (&gArmFfaRxTxBufferInfoGuid); @@ -220,3 +252,46 @@ ArmFfaPeiLibConstructor ( return EFI_SUCCESS; } + +/** + Return partition or VM ID + + @param[out] PartId The partition or VM ID + + @retval EFI_SUCCESS Partition ID or VM ID returned + @retval Others Errors + +**/ +EFI_STATUS +EFIAPI +ArmFfaLibGetPartId ( + OUT UINT16 *PartId + ) +{ + if (mIsPermMemAvailable) { + *PartId = mPartId; + return EFI_SUCCESS; + } else { + return ArmFfaLibPartitionIdGet (PartId); + } +} + +/** + Check FF-A support or not. + + @retval TRUE Supported + @retval FALSE Not supported + +**/ +BOOLEAN +EFIAPI +IsFfaSupported ( + IN VOID + ) +{ + if (mIsPermMemAvailable) { + return mIsFfaSupported; + } + + return ArmFfaLibIsFfaSupported (); +} diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c index 4f0e1a4e8f3e..ceb3010a72d7 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c @@ -189,11 +189,14 @@ ArmFfaLibRxTxUnmap ( EFI_STATUS Status; ARM_FFA_ARGS FfaArgs; VOID *Buffers; + UINT16 PartId; + + ArmFfaLibGetPartId (&PartId); ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); FfaArgs.Arg0 = ARM_FID_FFA_RXTX_UNMAP; - FfaArgs.Arg1 = (gPartId << ARM_FFA_SOURCE_EP_SHIFT); + FfaArgs.Arg1 = (PartId << ARM_FFA_SOURCE_EP_SHIFT); ArmCallFfa (&FfaArgs); @@ -283,6 +286,9 @@ RemapFfaRxTxBuffer ( UINTN NewRxBuffer; UINTN MinSizeAndAlign; EFI_HOB_MEMORY_ALLOCATION *RxTxBufferAllocationHob; + UINT16 PartId; + + ArmFfaLibGetPartId (&PartId); RxTxBufferAllocationHob = FindRxTxBufferAllocationHob (TRUE); if (RxTxBufferAllocationHob == NULL) { @@ -293,7 +299,7 @@ RemapFfaRxTxBuffer ( ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); FfaArgs.Arg0 = ARM_FID_FFA_RXTX_UNMAP; - FfaArgs.Arg1 = (gPartId << ARM_FFA_SOURCE_EP_SHIFT); + FfaArgs.Arg1 = (PartId << ARM_FFA_SOURCE_EP_SHIFT); ArmCallFfa (&FfaArgs); Status = FfaArgsToEfiStatus (&FfaArgs); diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c index 4ee471d7956e..27c4125e88c0 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c @@ -53,10 +53,12 @@ ArmFfaSecLibConstructor ( EFI_HOB_MEMORY_ALLOCATION *RxTxBufferAllocationHob; UINTN Property1; UINTN Property2; + UINT16 PartId; + BOOLEAN IsFfaSupported; - Status = ArmFfaLibCommonInit (); + Status = ArmFfaLibCommonInit (&PartId, &IsFfaSupported); if (EFI_ERROR (Status)) { - if (Status == EFI_UNSUPPORTED) { + if (!IsFfaSupported) { /* * EFI_UNSUPPORTED return from ArmFfaLibCommonInit() means * FF-A interface doesn't support. @@ -127,3 +129,37 @@ ArmFfaSecLibConstructor ( return EFI_SUCCESS; } + +/** + Return partition or VM ID + + @param[out] PartId The partition or VM ID + + @retval EFI_SUCCESS Partition ID or VM ID returned + @retval Others Errors + +**/ +EFI_STATUS +EFIAPI +ArmFfaLibGetPartId ( + OUT UINT16 *PartId + ) +{ + return ArmFfaLibPartitionIdGet (PartId); +} + +/** + Check FF-A support or not. + + @retval TRUE Supported + @retval FALSE Not supported + +**/ +BOOLEAN +EFIAPI +IsFfaSupported ( + IN VOID + ) +{ + return ArmFfaLibIsFfaSupported (); +} diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c index 7c44e80822fc..fb1136da9658 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c @@ -235,11 +235,18 @@ ArmFfaLibRxTxUnmap ( EFI_STATUS Status; ARM_FFA_ARGS FfaArgs; VOID *Buffers; + UINT16 PartId; + + Status = ArmFfaLibPartitionIdGet (&PartId); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a, Failed to acquire partition ID. Status: %r\n", __func__, Status)); + return EFI_INVALID_PARAMETER; + } ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); FfaArgs.Arg0 = ARM_FID_FFA_RXTX_UNMAP; - FfaArgs.Arg1 = (gPartId << ARM_FFA_SOURCE_EP_SHIFT); + FfaArgs.Arg1 = (PartId << ARM_FFA_SOURCE_EP_SHIFT); ArmCallFfa (&FfaArgs); diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c index 7f7d38f0b380..2d3c15ed7899 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c @@ -24,6 +24,9 @@ #include "ArmFfaCommon.h" #include "ArmFfaRxTxMap.h" +STATIC UINT16 mPartId; +STATIC BOOLEAN mIsFfaSupported; + /** ArmFfaLib Constructor. @@ -43,8 +46,8 @@ ArmFfaStandaloneMmLibConstructor ( { EFI_STATUS Status; - Status = ArmFfaLibCommonInit (); - if (Status == EFI_UNSUPPORTED) { + Status = ArmFfaLibCommonInit (&mPartId, &mIsFfaSupported); + if (!mIsFfaSupported) { /* * EFI_UNSUPPORTED means FF-A interface isn't available. * However, for Standalone MM modules, FF-A availability is not required. @@ -86,3 +89,41 @@ ArmFfaStandaloneMmLibConstructor ( return Status; } + +/** + Return partition or VM ID + + @param[out] PartId The partition or VM ID + + @retval EFI_SUCCESS Partition ID or VM ID returned + @retval Others Errors + +**/ +EFI_STATUS +EFIAPI +ArmFfaLibGetPartId ( + OUT UINT16 *PartId + ) +{ + if (PartId != NULL) { + *PartId = mPartId; + } + + return EFI_SUCCESS; +} + +/** + Check FF-A support or not. + + @retval TRUE Supported + @retval FALSE Not supported + +**/ +BOOLEAN +EFIAPI +IsFfaSupported ( + IN VOID + ) +{ + return mIsFfaSupported; +} diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmRxTxMap.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmRxTxMap.c index d368c329eeb0..93a0a7ee2b16 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmRxTxMap.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmRxTxMap.c @@ -214,6 +214,9 @@ ArmFfaLibRxTxUnmap ( EFI_STATUS Status; ARM_FFA_ARGS FfaArgs; VOID *Buffers; + UINT16 SourceId; + + ArmFfaLibGetPartId (&SourceId); if (mArmFfaRxTxBufferStmmInfoHandle == NULL) { // This means that the agent tried to unmap the buffers before even know them. @@ -224,7 +227,7 @@ ArmFfaLibRxTxUnmap ( ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); FfaArgs.Arg0 = ARM_FID_FFA_RXTX_UNMAP; - FfaArgs.Arg1 = (gPartId << ARM_FFA_SOURCE_EP_SHIFT); + FfaArgs.Arg1 = (SourceId << ARM_FFA_SOURCE_EP_SHIFT); ArmCallFfa (&FfaArgs); From ea8447eec78c77dfb9d120f57d70b8d267317cc4 Mon Sep 17 00:00:00 2001 From: rdiaz Date: Fri, 6 Feb 2026 23:52:21 +0000 Subject: [PATCH 1166/1172] MdeModulePkg: Remove global usage from ArmFfaSecRxTxMap Removed the global variables in ArmFfaSecRxTxMap. Rx/Tx buffer HOB is now created within the Map function rather than in the constructor of ArmFfaSecLib. This allows for the use of the HOB to find the Rx/Tx buffer information. Signed-off-by: Raymond Diaz --- MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c | 40 +---- .../Library/ArmFfaLib/ArmFfaSecRxTxMap.c | 165 +++++++++++++----- 2 files changed, 125 insertions(+), 80 deletions(-) diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c index 27c4125e88c0..3e7355b5034b 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c @@ -48,13 +48,11 @@ ArmFfaSecLibConstructor ( IN VOID ) { - EFI_STATUS Status; - ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo; - EFI_HOB_MEMORY_ALLOCATION *RxTxBufferAllocationHob; - UINTN Property1; - UINTN Property2; - UINT16 PartId; - BOOLEAN IsFfaSupported; + EFI_STATUS Status; + UINTN Property1; + UINTN Property2; + UINT16 PartId; + BOOLEAN IsFfaSupported; Status = ArmFfaLibCommonInit (&PartId, &IsFfaSupported); if (EFI_ERROR (Status)) { @@ -99,34 +97,6 @@ ArmFfaSecLibConstructor ( return Status; } - BufferInfo = BuildGuidHob ( - &gArmFfaRxTxBufferInfoGuid, - sizeof (ARM_FFA_RX_TX_BUFFER_INFO) - ); - if (BufferInfo == NULL) { - DEBUG ((DEBUG_ERROR, "%a: Failed to create Rx/Tx Buffer Info Hob\n", __func__)); - ArmFfaLibRxTxUnmap (); - return EFI_OUT_OF_RESOURCES; - } - - RxTxBufferAllocationHob = FindRxTxBufferAllocationHob (FALSE); - ASSERT (RxTxBufferAllocationHob != NULL); - - /* - * Set then Name with gArmFfaRxTxBufferInfoGuid, so that ArmFfaPeiLib or - * ArmFfaDxeLib can find the Rx/Tx buffer allocation area. - */ - CopyGuid ( - &RxTxBufferAllocationHob->AllocDescriptor.Name, - &gArmFfaRxTxBufferInfoGuid - ); - - UpdateRxTxBufferInfo (BufferInfo); - BufferInfo->RemapOffset = - (UINTN)(BufferInfo->TxBufferAddr - - RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress); - BufferInfo->RemapRequired = TRUE; - return EFI_SUCCESS; } diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c index fb1136da9658..7afee444c08e 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c @@ -31,9 +31,6 @@ #include "ArmFfaCommon.h" #include "ArmFfaRxTxMap.h" -STATIC VOID *mTxBuffer; -STATIC VOID *mRxBuffer; - /** Get mapped Rx/Tx buffers. @@ -55,24 +52,34 @@ ArmFfaLibGetRxTxBuffers ( OUT UINT64 *RxBufferSize OPTIONAL ) { - if ((mTxBuffer == NULL) || (mRxBuffer == NULL)) { + EFI_HOB_MEMORY_ALLOCATION *RxTxBufferAllocationHob; + UINT64 BufferSize; + + /* + * Attempt to find the allocation HOB, if it exists then the + * Rx/Tx buffers have already been mapped. + */ + RxTxBufferAllocationHob = FindRxTxBufferAllocationHob (TRUE); + if (RxTxBufferAllocationHob == NULL) { return EFI_NOT_READY; } + BufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + if (TxBuffer != NULL) { - *TxBuffer = mTxBuffer; + *TxBuffer = (VOID *)RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress; } if (TxBufferSize != NULL) { - *TxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + *TxBufferSize = BufferSize; } if (RxBuffer != NULL) { - *RxBuffer = mRxBuffer; + *RxBuffer = (VOID *)RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress + BufferSize; } if (RxBufferSize != NULL) { - *RxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + *RxBufferSize = BufferSize; } return EFI_SUCCESS; @@ -96,21 +103,25 @@ ArmFfaLibRxTxMap ( IN VOID ) { - EFI_STATUS Status; - ARM_FFA_ARGS FfaArgs; - UINTN Property1; - UINTN Property2; - UINTN MinSizeAndAlign; - UINTN MaxSize; - VOID *Buffers; - VOID *TxBuffer; - VOID *RxBuffer; + EFI_STATUS Status; + ARM_FFA_ARGS FfaArgs; + UINTN Property1; + UINTN Property2; + UINTN MinSizeAndAlign; + UINTN MaxSize; + VOID *Buffers; + VOID *TxBuffer; + VOID *RxBuffer; + ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo; + EFI_HOB_MEMORY_ALLOCATION *RxTxBufferAllocationHob; + UINT16 PartId; /* - * If someone already mapped Rx/Tx Buffers, return EFI_ALREADY_STARTED. - * return EFI_ALREADY_STARTED. + * Attempt to find the allocation HOB, if it exists then the + * Rx/Tx buffers have already been mapped. */ - if ((mTxBuffer != NULL) && (mRxBuffer != NULL)) { + RxTxBufferAllocationHob = FindRxTxBufferAllocationHob (TRUE); + if (RxTxBufferAllocationHob != NULL) { return EFI_ALREADY_STARTED; } @@ -205,11 +216,61 @@ ArmFfaLibRxTxMap ( goto ErrorHandler; } - mTxBuffer = TxBuffer; - mRxBuffer = RxBuffer; + BufferInfo = BuildGuidHob (&gArmFfaRxTxBufferInfoGuid, sizeof (ARM_FFA_RX_TX_BUFFER_INFO)); + if (BufferInfo == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Failed to create Rx/Tx Buffer Info Hob\n", __func__)); + goto Unmap; + } + + RxTxBufferAllocationHob = GetRxTxBufferAllocationHob ((EFI_PHYSICAL_ADDRESS)((UINTN)TxBuffer), PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE * 2, FALSE); + if (RxTxBufferAllocationHob == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Failed to acquire RxTxBufferAllocationHob\n", __func__)); + goto Unmap; + } + + /* + * Set then Name with gArmFfaRxTxBufferInfoGuid, so that ArmFfaPeiLib or + * ArmFfaDxeLib can find the Rx/Tx buffer allocation area. + */ + CopyGuid (&RxTxBufferAllocationHob->AllocDescriptor.Name, &gArmFfaRxTxBufferInfoGuid); + + BufferInfo->TxBufferAddr = (UINTN)RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress; + BufferInfo->TxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + BufferInfo->RxBufferAddr = (UINTN)RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress + BufferInfo->TxBufferSize; + BufferInfo->RxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + BufferInfo->RemapOffset = (UINTN)(BufferInfo->TxBufferAddr - RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress); + BufferInfo->RemapRequired = TRUE; return EFI_SUCCESS; +Unmap: + Status = ArmFfaLibPartitionIdGet (&PartId); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a, Failed to acquire partition ID. Status: %r\n", __func__, Status)); + goto ErrorHandler; + } + + ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); + + FfaArgs.Arg0 = ARM_FID_FFA_RXTX_UNMAP; + FfaArgs.Arg1 = (PartId << ARM_FFA_SOURCE_EP_SHIFT); + + ArmCallFfa (&FfaArgs); + + Status = FfaArgsToEfiStatus (&FfaArgs); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a, Failed to unmap Rx/Tx buffer. Status: %r\n", __func__, Status)); + goto ErrorHandler; + } + + /* + * If we successfully unmap, we only got here if we were + * unable to build the HOB or find the allocation HOB. Due + * to Status being overwritten we still need to indicate a + * failure occurred. + */ + Status = EFI_OUT_OF_RESOURCES; + ErrorHandler: FreePages (Buffers, (PcdGet64 (PcdFfaTxRxPageCount) * 2)); @@ -232,10 +293,21 @@ ArmFfaLibRxTxUnmap ( IN VOID ) { - EFI_STATUS Status; - ARM_FFA_ARGS FfaArgs; - VOID *Buffers; - UINT16 PartId; + EFI_STATUS Status; + ARM_FFA_ARGS FfaArgs; + VOID *Buffers; + UINT16 PartId; + EFI_HOB_MEMORY_ALLOCATION *RxTxBufferAllocationHob; + + /* + * Rx/Tx buffers are allocated with continuous pages. + * See ArmFfaLibRxTxMap(). If HOB is not found, the Rx/Tx + * buffers were not successfully mapped. + */ + RxTxBufferAllocationHob = FindRxTxBufferAllocationHob (TRUE); + if (RxTxBufferAllocationHob == NULL) { + return EFI_INVALID_PARAMETER; + } Status = ArmFfaLibPartitionIdGet (&PartId); if (EFI_ERROR (Status)) { @@ -255,19 +327,11 @@ ArmFfaLibRxTxUnmap ( return Status; } - /* - * Rx/Tx Buffer are allocated with continuous pages. - * and start address of these pages is set on PcdFfaTxBuffer. - * See ArmFfaLibRxTxMap(). - */ - Buffers = mTxBuffer; + Buffers = (VOID *)RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress; if (Buffers != NULL) { FreePages (Buffers, (PcdGet64 (PcdFfaTxRxPageCount) * 2)); } - mTxBuffer = NULL; - mRxBuffer = NULL; - return EFI_SUCCESS; } @@ -283,10 +347,20 @@ UpdateRxTxBufferInfo ( OUT ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo ) { - BufferInfo->TxBufferAddr = (UINTN)mTxBuffer; - BufferInfo->TxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; - BufferInfo->RxBufferAddr = (UINTN)mRxBuffer; - BufferInfo->RxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + EFI_HOB_MEMORY_ALLOCATION *RxTxBufferAllocationHob; + + /* + * Attempt to find the HOB containing the Rx/Tx buffer information. + * If it is not found, the Rx/Tx buffers were not successfully mapped. + */ + RxTxBufferAllocationHob = FindRxTxBufferAllocationHob (TRUE); + + if ((RxTxBufferAllocationHob != NULL) && (BufferInfo != NULL)) { + BufferInfo->TxBufferAddr = (UINTN)RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress; + BufferInfo->TxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + BufferInfo->RxBufferAddr = (UINTN)RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress + BufferInfo->TxBufferSize; + BufferInfo->RxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + } } /** @@ -304,13 +378,14 @@ FindRxTxBufferAllocationHob ( IN BOOLEAN UseGuid ) { - EFI_PHYSICAL_ADDRESS BufferBase; - UINT64 BufferSize; + (void)UseGuid; - BufferBase = (EFI_PHYSICAL_ADDRESS)((UINTN)mTxBuffer); - BufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE * 2; - - return GetRxTxBufferAllocationHob (BufferBase, BufferSize, UseGuid); + /* + * Mapping the Rx/Tx buffer should have generated the HOB, if not, + * then the allocation HOB will not be found and NULL will be returned. + * Note that BufferAddr and BufferSize are ignored when UseGuid is TRUE. + */ + return GetRxTxBufferAllocationHob (0, 0, TRUE); } /** From 3457388b7cec770cc6599c85e50ec81030f3cc9f Mon Sep 17 00:00:00 2001 From: rdiaz Date: Fri, 6 Feb 2026 23:58:05 +0000 Subject: [PATCH 1167/1172] MdeModulePkg: Use EFI_PAGES_TO_SIZE macro in ArmFfaSecRxTxMap Replaced all instances of PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE, with EFI_PAGES_TO_SIZE macro. Signed-off-by: Raymond Diaz --- .../Library/ArmFfaLib/ArmFfaSecRxTxMap.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c index 7afee444c08e..b11a88305128 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c @@ -64,7 +64,7 @@ ArmFfaLibGetRxTxBuffers ( return EFI_NOT_READY; } - BufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + BufferSize = EFI_PAGES_TO_SIZE (PcdGet64 (PcdFfaTxRxPageCount)); if (TxBuffer != NULL) { *TxBuffer = (VOID *)RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress; @@ -170,8 +170,8 @@ ArmFfaLibRxTxMap ( MaxSize = ((MaxSize == 0) ? MAX_UINTN : (MaxSize * MinSizeAndAlign)); - if ((MinSizeAndAlign > (PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE)) || - (MaxSize < (PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE))) + if ((MinSizeAndAlign > (EFI_PAGES_TO_SIZE (PcdGet64 (PcdFfaTxRxPageCount)))) || + (MaxSize < (EFI_PAGES_TO_SIZE (PcdGet64 (PcdFfaTxRxPageCount))))) { DEBUG (( DEBUG_ERROR, @@ -190,7 +190,7 @@ ArmFfaLibRxTxMap ( } TxBuffer = Buffers; - RxBuffer = Buffers + (PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE); + RxBuffer = Buffers + (EFI_PAGES_TO_SIZE (PcdGet64 (PcdFfaTxRxPageCount))); FfaArgs.Arg0 = ARM_FID_FFA_RXTX_MAP; FfaArgs.Arg1 = (UINTN)TxBuffer; @@ -222,7 +222,7 @@ ArmFfaLibRxTxMap ( goto Unmap; } - RxTxBufferAllocationHob = GetRxTxBufferAllocationHob ((EFI_PHYSICAL_ADDRESS)((UINTN)TxBuffer), PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE * 2, FALSE); + RxTxBufferAllocationHob = GetRxTxBufferAllocationHob ((EFI_PHYSICAL_ADDRESS)((UINTN)TxBuffer), EFI_PAGES_TO_SIZE (PcdGet64 (PcdFfaTxRxPageCount)) * 2, FALSE); if (RxTxBufferAllocationHob == NULL) { DEBUG ((DEBUG_ERROR, "%a: Failed to acquire RxTxBufferAllocationHob\n", __func__)); goto Unmap; @@ -235,9 +235,9 @@ ArmFfaLibRxTxMap ( CopyGuid (&RxTxBufferAllocationHob->AllocDescriptor.Name, &gArmFfaRxTxBufferInfoGuid); BufferInfo->TxBufferAddr = (UINTN)RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress; - BufferInfo->TxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + BufferInfo->TxBufferSize = EFI_PAGES_TO_SIZE (PcdGet64 (PcdFfaTxRxPageCount)); BufferInfo->RxBufferAddr = (UINTN)RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress + BufferInfo->TxBufferSize; - BufferInfo->RxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + BufferInfo->RxBufferSize = EFI_PAGES_TO_SIZE (PcdGet64 (PcdFfaTxRxPageCount)); BufferInfo->RemapOffset = (UINTN)(BufferInfo->TxBufferAddr - RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress); BufferInfo->RemapRequired = TRUE; @@ -357,9 +357,9 @@ UpdateRxTxBufferInfo ( if ((RxTxBufferAllocationHob != NULL) && (BufferInfo != NULL)) { BufferInfo->TxBufferAddr = (UINTN)RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress; - BufferInfo->TxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + BufferInfo->TxBufferSize = EFI_PAGES_TO_SIZE (PcdGet64 (PcdFfaTxRxPageCount)); BufferInfo->RxBufferAddr = (UINTN)RxTxBufferAllocationHob->AllocDescriptor.MemoryBaseAddress + BufferInfo->TxBufferSize; - BufferInfo->RxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + BufferInfo->RxBufferSize = EFI_PAGES_TO_SIZE (PcdGet64 (PcdFfaTxRxPageCount)); } } From 0e8dc1693d4e419093e9aca57175b4120905e357 Mon Sep 17 00:00:00 2001 From: rdiaz Date: Sat, 7 Feb 2026 00:03:59 +0000 Subject: [PATCH 1168/1172] MdeModulePkg: Code/Comment cleanup Cleaned various comments and debug messages as well as headers to either fix typos or for readability. Signed-off-by: Raymond Diaz --- MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h | 2 +- MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c | 9 +++------ MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c | 10 +++------- MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c | 13 ++++++------- MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c | 14 +++++++------- .../Library/ArmFfaLib/ArmFfaStandaloneMmLib.c | 2 +- 6 files changed, 21 insertions(+), 29 deletions(-) diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h index 22bcd650e54b..7be469f71d3d 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h @@ -34,7 +34,7 @@ FfaArgsToEfiStatus ( ); /** - Common ArmFfaLib Constructor. + Common ArmFfaLib init. @param [out] PartId PartitionId @param [out] IsFfaSupported FF-A supported flag diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c index 3c81435334dc..8e0eecfa4582 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c @@ -84,12 +84,9 @@ ArmFfaDxeLibConstructor ( if (EFI_ERROR (Status)) { if (!mIsFfaSupported) { /* - * EFI_UNSUPPORTED return from ArmFfaLibCommonInit() means - * FF-A interface doesn't support. - * However, It doesn't make failure of loading driver/library instance - * (i.e) ArmPkg's MmCommunication Dxe/PEI Driver uses as well as SpmMm. - * So If FF-A is not supported the the MmCommunication Dxe/PEI falls - * back to SpmMm. + * FF-A being unsupported doesn't mean a failure of loading the driver/library + * instance (i.e) ArmPkg's MmCommunication Dxe/PEI Driver uses as well as SpmMm. + * So If FF-A is not supported the the MmCommunication Dxe/PEI falls back to SpmMm. * For this case, return EFI_SUCCESS. */ return EFI_SUCCESS; diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c index 420d5e89d789..7a9080a289fb 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c @@ -125,14 +125,10 @@ ArmFfaPeiLibConstructor ( if (EFI_ERROR (Status)) { if (!mIsFfaSupported) { /* - * EFI_UNSUPPORTED return from ArmFfaLibCommonInit() means - * FF-A interface doesn't support. - * However, It doesn't make failure of loading driver/library instance - * (i.e) ArmPkg's MmCommunication Dxe/PEI Driver uses as well as SpmMm. - * So If FF-A is not supported the the MmCommunication Dxe/PEI falls - * back to SpmMm. + * FF-A being unsupported doesn't mean a failure of loading the driver/library + * instance (i.e) ArmPkg's MmCommunication Dxe/PEI Driver uses as well as SpmMm. + * So If FF-A is not supported the the MmCommunication Dxe/PEI falls back to SpmMm. * For this case, return EFI_SUCCESS. - */ return EFI_SUCCESS; } diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c index 3e7355b5034b..c0468dd8998a 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c @@ -58,12 +58,9 @@ ArmFfaSecLibConstructor ( if (EFI_ERROR (Status)) { if (!IsFfaSupported) { /* - * EFI_UNSUPPORTED return from ArmFfaLibCommonInit() means - * FF-A interface doesn't support. - * However, It doesn't make failure of loading driver/library instance - * (i.e) ArmPkg's MmCommunication Dxe/PEI Driver uses as well as SpmMm. - * So If FF-A is not supported the the MmCommunication Dxe/PEI falls - * back to SpmMm. + * FF-A being unsupported doesn't mean a failure of loading the driver/library + * instance (i.e) ArmPkg's MmCommunication Dxe/PEI Driver uses as well as SpmMm. + * So If FF-A is not supported the the MmCommunication Dxe/PEI falls back to SpmMm. * For this case, return EFI_SUCCESS. */ return EFI_SUCCESS; @@ -78,6 +75,8 @@ ArmFfaSecLibConstructor ( return Status; } + DEBUG ((DEBUG_INFO, "%a Rx/Tx buffer isn't supported.\n", __func__)); + /* * When ARM_FID_FFA_PARTITION_INFO_GET_REGS is supported, * Rx/Tx buffer might not be required to request service to @@ -91,7 +90,7 @@ ArmFfaSecLibConstructor ( &Property2 ); if (!EFI_ERROR (Status)) { - DEBUG ((DEBUG_INFO, "%a Rx/Tx buffer doesn't support.\n", __func__)); + DEBUG ((DEBUG_INFO, "%a PARTITION_INFO_GET_REGS is available as an alternative to Rx/Tx buffer.\n", __func__)); } return Status; diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c index b11a88305128..80fc5a5f5a40 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c @@ -134,7 +134,7 @@ ArmFfaLibRxTxMap ( if (EFI_ERROR (Status)) { DEBUG (( DEBUG_ERROR, - "%a: Failed to get RX/TX buffer property... Status: %r\n", + "%a: Failed to get Rx/Tx buffer property... Status: %r\n", __func__, Status )); @@ -283,8 +283,8 @@ ArmFfaLibRxTxMap ( Rx/Tx buffer is registered only once per partition. @retval EFI_SUCCESS - @retval EFI_INVALID_PARAMETERS Already unregistered - @retval EFI_UNSUPPORTED Not supported + @retval EFI_INVALID_PARAMETER Already unregistered + @retval EFI_UNSUPPORTED Not supported **/ EFI_STATUS @@ -336,9 +336,9 @@ ArmFfaLibRxTxUnmap ( } /** - Update Rx/TX buffer information. + Update Rx/Tx buffer information. - @param BufferInfo Rx/Tx buffer information. + @param BufferInfo Rx/Tx buffer information. **/ VOID @@ -364,7 +364,7 @@ UpdateRxTxBufferInfo ( } /** - Find Rx/TX buffer memory allocation hob. + Find Rx/Tx buffer memory allocation hob. @param UseGuid Find MemoryAllocationHob using Guid. @@ -389,7 +389,7 @@ FindRxTxBufferAllocationHob ( } /** - Remap Rx/TX buffer with converted Rx/Tx Buffer address after + Remap Rx/Tx buffer with converted Rx/Tx Buffer address after using permanent memory. @param[out] BufferInfo BufferInfo diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c index 2d3c15ed7899..b1e8af3dc2ca 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c @@ -49,7 +49,7 @@ ArmFfaStandaloneMmLibConstructor ( Status = ArmFfaLibCommonInit (&mPartId, &mIsFfaSupported); if (!mIsFfaSupported) { /* - * EFI_UNSUPPORTED means FF-A interface isn't available. + * Unsupported means FF-A interface isn't available. * However, for Standalone MM modules, FF-A availability is not required. * i.e. Standalone MM could use SpmMm as a legitimate protocol. * Thus, returning EFI_SUCCESS here to avoid the entrypoint to assert. From b7a715f7c03c45c6b4575bf88596bfd79658b8ce Mon Sep 17 00:00:00 2001 From: rdiaz Date: Wed, 28 Jan 2026 23:57:16 +0000 Subject: [PATCH 1169/1172] MdeModulePkg: Add Unmap Callback Add Unmap callback for when PEI and SEC need to invalidate the Rx/Tx buffer HOB on a call to Unmap. Signed-off-by: Raymond Diaz --- MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c | 14 +++++++++ MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c | 30 +++++++++++++++++++ .../Library/ArmFfaLib/ArmFfaRxTxMap.c | 2 ++ .../Library/ArmFfaLib/ArmFfaRxTxMap.h | 11 +++++++ MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c | 30 +++++++++++++++++++ .../Library/ArmFfaLib/ArmFfaSecRxTxMap.c | 2 ++ .../Library/ArmFfaLib/ArmFfaStandaloneMmLib.c | 14 +++++++++ 7 files changed, 103 insertions(+) diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c index 8e0eecfa4582..4d53dcf9e9fb 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c @@ -231,3 +231,17 @@ IsFfaSupported ( { return mIsFfaSupported; } + +/** + Callback for when Unmap is called to handle any post unmap + functionality. + +**/ +VOID +EFIAPI +UnmapCallback ( + IN VOID + ) +{ + // Do nothing +} diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c index 7a9080a289fb..7ce6bf620352 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaPeiLib.c @@ -291,3 +291,33 @@ IsFfaSupported ( return ArmFfaLibIsFfaSupported (); } + +/** + Callback for when Unmap is called to handle any post unmap + functionality. In PEI the Rx/Tx buffer HOB needs to be + invalidated. + +**/ +VOID +EFIAPI +UnmapCallback ( + IN VOID + ) +{ + EFI_HOB_MEMORY_ALLOCATION *RxTxBufferAllocationHob; + + /* + * Rx/Tx buffers are allocated with continuous pages. + * See ArmFfaLibRxTxMap(). If HOB is not found, the Rx/Tx + * buffers were not successfully mapped. + */ + RxTxBufferAllocationHob = FindRxTxBufferAllocationHob (TRUE); + if (RxTxBufferAllocationHob == NULL) { + return; + } + + /* + * Invalidate the HOB. + */ + ZeroMem (RxTxBufferAllocationHob, sizeof (ARM_FFA_RX_TX_BUFFER_INFO)); +} diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c index ceb3010a72d7..411d880e2544 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.c @@ -218,6 +218,8 @@ ArmFfaLibRxTxUnmap ( PcdSet64S (PcdFfaTxBuffer, 0x00); PcdSet64S (PcdFfaRxBuffer, 0x00); + UnmapCallback (); + return EFI_SUCCESS; } diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.h b/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.h index 5140865b5f09..87e2545b0a6d 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.h +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaRxTxMap.h @@ -96,4 +96,15 @@ RemapFfaRxTxBuffer ( IN OUT ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo ); +/** + Callback for when Unmap is called to handle any post unmap + functionality. + +**/ +VOID +EFIAPI +UnmapCallback ( + IN VOID + ); + #endif diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c index c0468dd8998a..4f206748d03a 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecLib.c @@ -132,3 +132,33 @@ IsFfaSupported ( { return ArmFfaLibIsFfaSupported (); } + +/** + Callback for when Unmap is called to handle any post unmap + functionality. In SEC, the Rx/Tx buffer HOB needs to be + invalidated. + +**/ +VOID +EFIAPI +UnmapCallback ( + IN VOID + ) +{ + EFI_HOB_MEMORY_ALLOCATION *RxTxBufferAllocationHob; + + /* + * Rx/Tx buffers are allocated with continuous pages. + * See ArmFfaLibRxTxMap(). If HOB is not found, the Rx/Tx + * buffers were not successfully mapped. + */ + RxTxBufferAllocationHob = FindRxTxBufferAllocationHob (TRUE); + if (RxTxBufferAllocationHob == NULL) { + return; + } + + /* + * Invalidate the HOB. + */ + ZeroMem (RxTxBufferAllocationHob, sizeof (ARM_FFA_RX_TX_BUFFER_INFO)); +} diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c index 80fc5a5f5a40..784021327fff 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaSecRxTxMap.c @@ -332,6 +332,8 @@ ArmFfaLibRxTxUnmap ( FreePages (Buffers, (PcdGet64 (PcdFfaTxRxPageCount) * 2)); } + UnmapCallback (); + return EFI_SUCCESS; } diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c index b1e8af3dc2ca..9e05fb07b14b 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaStandaloneMmLib.c @@ -127,3 +127,17 @@ IsFfaSupported ( { return mIsFfaSupported; } + +/** + Callback for when Unmap is called to handle any post unmap + functionality. + +**/ +VOID +EFIAPI +UnmapCallback ( + IN VOID + ) +{ + // Do nothing +} From 8e95c906c92d266507b6291ff6206ceb1fefce0e Mon Sep 17 00:00:00 2001 From: Stefan Kober Date: Tue, 22 Jul 2025 11:14:44 +0200 Subject: [PATCH 1170/1172] Revert "UefiCpuPkg: Produce EFI memory attributes protocol" This reverts commit efaa102d006f242da52a17c81d824a5377da284b. --- UefiCpuPkg/CpuDxe/CpuDxe.c | 5 - UefiCpuPkg/CpuDxe/CpuDxe.inf | 1 - UefiCpuPkg/CpuDxe/CpuPageTable.c | 295 ------------------------------- UefiCpuPkg/CpuDxe/CpuPageTable.h | 12 -- 4 files changed, 313 deletions(-) diff --git a/UefiCpuPkg/CpuDxe/CpuDxe.c b/UefiCpuPkg/CpuDxe/CpuDxe.c index 472de55180e1..bf039787101c 100644 --- a/UefiCpuPkg/CpuDxe/CpuDxe.c +++ b/UefiCpuPkg/CpuDxe/CpuDxe.c @@ -1033,11 +1033,6 @@ InitializeCpu ( ); ASSERT_EFI_ERROR (Status); - // - // Install EFI memory attribute Protocol - // - InstallEfiMemoryAttributeProtocol (mCpuHandle); - // // Refresh GCD memory space map according to MTRR value. // diff --git a/UefiCpuPkg/CpuDxe/CpuDxe.inf b/UefiCpuPkg/CpuDxe/CpuDxe.inf index 7d38840e22de..a8ccdc4da5a4 100644 --- a/UefiCpuPkg/CpuDxe/CpuDxe.inf +++ b/UefiCpuPkg/CpuDxe/CpuDxe.inf @@ -75,7 +75,6 @@ [Protocols] gEfiCpuArchProtocolGuid ## PRODUCES - gEfiMemoryAttributeProtocolGuid ## PRODUCES gEfiMpServiceProtocolGuid ## PRODUCES gEfiSmmBase2ProtocolGuid ## SOMETIMES_CONSUMES diff --git a/UefiCpuPkg/CpuDxe/CpuPageTable.c b/UefiCpuPkg/CpuDxe/CpuPageTable.c index d45d276029f3..d7f41a362590 100644 --- a/UefiCpuPkg/CpuDxe/CpuPageTable.c +++ b/UefiCpuPkg/CpuDxe/CpuPageTable.c @@ -1445,298 +1445,3 @@ InitializePageTableLib ( return; } - -/** - This function set given attributes of the memory region specified by - BaseAddress and Length. - The valid Attributes is EFI_MEMORY_RP, EFI_MEMORY_XP, and EFI_MEMORY_RO. - - @param This The EFI_MEMORY_ATTRIBUTE_PROTOCOL instance. - @param BaseAddress The physical address that is the start address of - a memory region. - @param Length The size in bytes of the memory region. - @param Attributes The bit mask of attributes to set for the memory - region. - - @retval EFI_SUCCESS The attributes were set for the memory region. - @retval EFI_INVALID_PARAMETER Length is zero. - Attributes specified an illegal combination of - attributes that cannot be set together. - @retval EFI_UNSUPPORTED The processor does not support one or more - bytes of the memory resource range specified - by BaseAddress and Length. - The bit mask of attributes is not supported for - the memory resource range specified by - BaseAddress and Length. - @retval EFI_OUT_OF_RESOURCES Requested attributes cannot be applied due to lack of - system resources. - @retval EFI_ACCESS_DENIED Attributes for the requested memory region are - controlled by system firmware and cannot be updated - via the protocol. -**/ -EFI_STATUS -EFIAPI -EfiSetMemoryAttributes ( - IN EFI_MEMORY_ATTRIBUTE_PROTOCOL *This, - IN EFI_PHYSICAL_ADDRESS BaseAddress, - IN UINT64 Length, - IN UINT64 Attributes - ) -{ - RETURN_STATUS Status; - BOOLEAN IsModified; - BOOLEAN IsSplitted; - - DEBUG ((DEBUG_VERBOSE, "%a: 0x%lx - 0x%lx (0x%lx)\n", __func__, BaseAddress, Length, Attributes)); - - if (Attributes == 0) { - DEBUG ((DEBUG_ERROR, "%a: Error - Attributes == 0\n", __func__)); - return EFI_INVALID_PARAMETER; - } - - if ((Attributes & ~EFI_MEMORY_ACCESS_MASK) != 0) { - DEBUG ((DEBUG_ERROR, "%a: Error - Attributes(0x%lx) invalid\n", __func__, Attributes)); - return EFI_INVALID_PARAMETER; - } - - if (Length == 0) { - DEBUG ((DEBUG_ERROR, "%a: Length is 0!\n", __func__)); - return RETURN_INVALID_PARAMETER; - } - - Status = ConvertMemoryPageAttributes (NULL, BaseAddress, Length, Attributes, PageActionSet, NULL, &IsSplitted, &IsModified); - if (!EFI_ERROR (Status)) { - if (IsModified) { - // - // Flush TLB as last step. - // - // Note: Since APs will always init CR3 register in HLT loop mode or do - // TLB flush in MWAIT loop mode, there's no need to flush TLB for them - // here. - // - CpuFlushTlb (); - } - } else { - DEBUG ((DEBUG_ERROR, "%a: Failed in ConvertMemoryPageAttributes (%r)\n", __func__, Status)); - } - - return Status; -} - -/** - This function clears given attributes of the memory region specified by - BaseAddress and Length. - The valid Attributes is EFI_MEMORY_RP, EFI_MEMORY_XP, and EFI_MEMORY_RO. - @param This The EFI_MEMORY_ATTRIBUTE_PROTOCOL instance. - @param BaseAddress The physical address that is the start address of - a memory region. - @param Length The size in bytes of the memory region. - @param Attributes The bit mask of attributes to clear for the memory - region. - - @retval EFI_SUCCESS The attributes were cleared for the memory region. - @retval EFI_INVALID_PARAMETER Length is zero. - Attributes specified an illegal combination of - attributes that cannot be cleared together. - @retval EFI_UNSUPPORTED The processor does not support one or more - bytes of the memory resource range specified - by BaseAddress and Length. - The bit mask of attributes is not supported for - the memory resource range specified by - BaseAddress and Length. - @retval EFI_OUT_OF_RESOURCES Requested attributes cannot be applied due to lack of - system resources. - @retval EFI_ACCESS_DENIED Attributes for the requested memory region are - controlled by system firmware and cannot be updated - via the protocol. -**/ -EFI_STATUS -EFIAPI -EfiClearMemoryAttributes ( - IN EFI_MEMORY_ATTRIBUTE_PROTOCOL *This, - IN EFI_PHYSICAL_ADDRESS BaseAddress, - IN UINT64 Length, - IN UINT64 Attributes - ) -{ - RETURN_STATUS Status; - BOOLEAN IsModified; - BOOLEAN IsSplitted; - - DEBUG ((DEBUG_VERBOSE, "%a: 0x%lx - 0x%lx (0x%lx)\n", __func__, BaseAddress, Length, Attributes)); - - if (Attributes == 0) { - DEBUG ((DEBUG_ERROR, "%a: Error - Attributes == 0\n", __func__)); - return EFI_INVALID_PARAMETER; - } - - if ((Attributes & ~EFI_MEMORY_ACCESS_MASK) != 0) { - DEBUG ((DEBUG_ERROR, "%a: Error - Attributes(0x%lx) invalid\n", __func__, Attributes)); - return EFI_INVALID_PARAMETER; - } - - if (Length == 0) { - DEBUG ((DEBUG_ERROR, "%a: Length is 0!\n", __func__)); - return RETURN_INVALID_PARAMETER; - } - - Status = ConvertMemoryPageAttributes (NULL, BaseAddress, Length, Attributes, PageActionClear, NULL, &IsSplitted, &IsModified); - if (!EFI_ERROR (Status)) { - if (IsModified) { - // - // Flush TLB as last step. - // - // Note: Since APs will always init CR3 register in HLT loop mode or do - // TLB flush in MWAIT loop mode, there's no need to flush TLB for them - // here. - // - CpuFlushTlb (); - } - } else { - DEBUG ((DEBUG_ERROR, "%a: Failed in ConvertMemoryPageAttributes (%r)\n", __func__, Status)); - } - - return Status; -} - -/** - This function retrieves the attributes of the memory region specified by - BaseAddress and Length. If different attributes are got from different part - of the memory region, EFI_NO_MAPPING will be returned. - - @param This The EFI_MEMORY_ATTRIBUTE_PROTOCOL instance. - @param BaseAddress The physical address that is the start address of - a memory region. - @param Length The size in bytes of the memory region. - @param Attributes Pointer to attributes returned. - - @retval EFI_SUCCESS The attributes got for the memory region. - @retval EFI_INVALID_PARAMETER Length is zero. - Attributes is NULL. - @retval EFI_NO_MAPPING Attributes are not consistent cross the memory - region. - @retval EFI_UNSUPPORTED The processor does not support one or more - bytes of the memory resource range specified - by BaseAddress and Length. -**/ -EFI_STATUS -EFIAPI -EfiGetMemoryAttributes ( - IN EFI_MEMORY_ATTRIBUTE_PROTOCOL *This, - IN EFI_PHYSICAL_ADDRESS BaseAddress, - IN UINT64 Length, - OUT UINT64 *Attributes - ) -{ - PAGE_TABLE_LIB_PAGING_CONTEXT CurrentPagingContext; - EFI_PHYSICAL_ADDRESS Address; - UINT64 *PageEntry; - UINT64 MemAttr; - PAGE_ATTRIBUTE PageAttr; - INT64 Size; - UINT64 AddressEncMask; - - DEBUG ((DEBUG_VERBOSE, "%a: 0x%lx - 0x%lx\n", __func__, BaseAddress, Length)); - - if (!IS_ALIGNED (BaseAddress, EFI_PAGE_SIZE)) { - DEBUG ((DEBUG_ERROR, "%a: BaseAddress(0x%lx) is not aligned!\n", __func__, BaseAddress)); - return EFI_UNSUPPORTED; - } - - if (!IS_ALIGNED (Length, EFI_PAGE_SIZE)) { - DEBUG ((DEBUG_ERROR, "%a: Length(0x%lx) is not aligned!\n", __func__, Length)); - return EFI_UNSUPPORTED; - } - - if (Length == 0) { - DEBUG ((DEBUG_ERROR, "%a: Length is 0!\n", __func__)); - return RETURN_INVALID_PARAMETER; - } - - if (Attributes == NULL) { - DEBUG ((DEBUG_ERROR, "%a: Attributes is NULL\n", __func__)); - return EFI_INVALID_PARAMETER; - } - - Size = (INT64)Length; - MemAttr = (UINT64)-1; - - // Make sure AddressEncMask is contained to smallest supported address field. - // - AddressEncMask = PcdGet64 (PcdPteMemoryEncryptionAddressOrMask) & PAGING_1G_ADDRESS_MASK_64; - - GetCurrentPagingContext (&CurrentPagingContext); - - do { - PageEntry = GetPageTableEntry (&CurrentPagingContext, BaseAddress, &PageAttr); - if ((PageEntry == NULL) || (PageAttr == PageNone)) { - return EFI_UNSUPPORTED; - } - - // - // If the memory range is cross page table boundary, make sure they - // share the same attribute. Return EFI_NO_MAPPING if not. - // - *Attributes = GetAttributesFromPageEntry (PageEntry); - if ((MemAttr != (UINT64)-1) && (*Attributes != MemAttr)) { - return EFI_NO_MAPPING; - } - - switch (PageAttr) { - case Page4K: - Address = *PageEntry & ~AddressEncMask & PAGING_4K_ADDRESS_MASK_64; - Size -= (EFI_PAGE_SIZE - (BaseAddress - Address)); - BaseAddress += (EFI_PAGE_SIZE - (BaseAddress - Address)); - break; - - case Page2M: - Address = *PageEntry & ~AddressEncMask & PAGING_2M_ADDRESS_MASK_64; - Size -= SIZE_2MB - (BaseAddress - Address); - BaseAddress += SIZE_2MB - (BaseAddress - Address); - break; - - case Page1G: - Address = *PageEntry & ~AddressEncMask & PAGING_1G_ADDRESS_MASK_64; - Size -= SIZE_1GB - (BaseAddress - Address); - BaseAddress += SIZE_1GB - (BaseAddress - Address); - break; - - default: - return EFI_UNSUPPORTED; - } - - MemAttr = *Attributes; - } while (Size > 0); - - DEBUG ((DEBUG_VERBOSE, "%a: Attributes is 0x%lx\n", __func__, *Attributes)); - - return EFI_SUCCESS; -} - -EFI_MEMORY_ATTRIBUTE_PROTOCOL mMemoryAttributeProtocol = { - EfiGetMemoryAttributes, - EfiSetMemoryAttributes, - EfiClearMemoryAttributes, -}; - -/** - Install Efi Memory Attribute Protocol. - - @param Handle A pointer to the EFI_HANDLE on which the interface is to be installed - -**/ -VOID -InstallEfiMemoryAttributeProtocol ( - IN EFI_HANDLE Handle - ) -{ - EFI_STATUS Status; - - Status = gBS->InstallMultipleProtocolInterfaces ( - &Handle, - &gEfiMemoryAttributeProtocolGuid, - &mMemoryAttributeProtocol, - NULL - ); - ASSERT_EFI_ERROR (Status); -} diff --git a/UefiCpuPkg/CpuDxe/CpuPageTable.h b/UefiCpuPkg/CpuDxe/CpuPageTable.h index f2694452f54a..607e936b8ac7 100644 --- a/UefiCpuPkg/CpuDxe/CpuPageTable.h +++ b/UefiCpuPkg/CpuDxe/CpuPageTable.h @@ -10,7 +10,6 @@ #define _PAGE_TABLE_LIB_H_ #include -#include #define PAGE_TABLE_LIB_PAGING_CONTEXT_IA32_X64_ATTRIBUTES_PSE BIT0 #define PAGE_TABLE_LIB_PAGING_CONTEXT_IA32_X64_ATTRIBUTES_PAE BIT1 @@ -154,15 +153,4 @@ GetPagingDetails ( OUT UINT32 **Attributes OPTIONAL ); -/** - Install Efi Memory Attribute Protocol. - - @param Handle A pointer to the EFI_HANDLE on which the interface is to be installed - -**/ -VOID -InstallEfiMemoryAttributeProtocol ( - IN EFI_HANDLE Handle - ); - #endif From 9deae2e79c84806d4def3d647f9e6c00a36df68d Mon Sep 17 00:00:00 2001 From: Thomas Prescher Date: Tue, 3 Jun 2025 15:08:50 +0200 Subject: [PATCH 1171/1172] CloudHv: bump PcdCpuMaxLogicalProcessorNumber to 8192 --- OvmfPkg/CloudHv/CloudHvX64.dsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OvmfPkg/CloudHv/CloudHvX64.dsc b/OvmfPkg/CloudHv/CloudHvX64.dsc index 157aa8e61151..b6b73d178482 100644 --- a/OvmfPkg/CloudHv/CloudHvX64.dsc +++ b/OvmfPkg/CloudHv/CloudHvX64.dsc @@ -628,7 +628,7 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack|FALSE # UefiCpuPkg PCDs related to initial AP bringup and general AP management. - gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber|254 + gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber|8192 gUefiCpuPkgTokenSpaceGuid.PcdCpuBootLogicalProcessorNumber|0 # Set memory encryption mask From 67d6f7bd8b7d4e734a30b15f41def3fb7b8ffd83 Mon Sep 17 00:00:00 2001 From: Pascal Scholz Date: Tue, 5 May 2026 14:31:33 +0200 Subject: [PATCH 1172/1172] OvmfPkg/CloudHv: Activate Qemu's `fw_cfg` device In Order to make the `fw_cfg` device available to OVMF and make it respect the `bootorder` file, we must include the respective driver. Signed-off-by: Pascal Scholz On-behalf-of: SAP pascal.scholz@sap.com --- OvmfPkg/CloudHv/CloudHvX64.dsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OvmfPkg/CloudHv/CloudHvX64.dsc b/OvmfPkg/CloudHv/CloudHvX64.dsc index b6b73d178482..015c916cad62 100644 --- a/OvmfPkg/CloudHv/CloudHvX64.dsc +++ b/OvmfPkg/CloudHv/CloudHvX64.dsc @@ -179,7 +179,7 @@ FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf SerializeVariablesLib|OvmfPkg/Library/SerializeVariablesLib/SerializeVariablesLib.inf - QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibNull.inf + QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf QemuFwCfgSimpleParserLib|OvmfPkg/Library/QemuFwCfgSimpleParserLib/QemuFwCfgSimpleParserLib.inf VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf LoadLinuxLib|OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf @@ -319,8 +319,8 @@ CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuExceptionHandlerLib.inf MpInitLib|UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/PeiQemuFwCfgS3LibFwCfg.inf + QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf - QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibNull.inf MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf CcProbeLib|OvmfPkg/Library/CcProbeLib/SecPeiCcProbeLib.inf